libdrm全解析十二 —— 源码全解析(9)

接前一篇文章:libdrm全解析十一 —— 源码全解析(8)

本文参考以下博文:

DRM 驱动程序开发(VKMS)

特此致谢!

本文继续对include/drm/drm.h中实际功能宏定义进行讲解。

13. DRM_IOCTL_GET_CAP

第13个宏是DRM_IOCTL_GET_CAP,相应代码如下:

#define DRM_IOCTL_GET_CAP		DRM_IOWR(0x0c, struct drm_get_cap)

结合之前文章中的_IOWR(type,nr,size)的最终定义,得到如下代码:

#define DRM_IOCTL_GET_CAP		( ((3)  << 30) | (('d') << 8) | ((0x0c)   << 0) | ((sizeof(struct drm_get_cap)) << 16) )

struct drm_get_cap在同文件(include/drm/drm.h)中定义,代码如下:

/* DRM_IOCTL_GET_CAP ioctl argument type */
struct drm_get_cap {
	__u64 capability;
	__u64 value;
};

DRM_IOCTL_GET_CAP对应的Userspace API为:drmGetCap()。该函数也是在xf86drm.c中,代码如下:

drm_public int drmGetCap(int fd, uint64_t capability, uint64_t *value)
{
    struct drm_get_cap cap;
    int ret;

    memclear(cap);
    cap.capability = capability;

    ret = drmIoctl(fd, DRM_IOCTL_GET_CAP, &cap);
    if (ret)
        return ret;

    *value = cap.value;
    return 0;
}

函数的作用是获取当前DRM设备所支持的能力。此函数在后文具体讲解函数的时候进行详细解析。在此先认识一下、有个印象就好。

14. DRM_IOCTL_SET_CLIENT_CAP

第14个宏是DRM_IOCTL_SET_CLIENT_CAP,相应代码如下:

#define DRM_IOCTL_SET_CLIENT_CAP	DRM_IOW( 0x0d, struct drm_set_client_cap)

结合之前文章中的_IOW(type,nr,size)的最终定义,得到如下代码:

#define DRM_IOCTL_SET_CLIENT_CAP		( ((1)  << 30) | (('d') << 8) | ((0x0d)   << 0) | ((sizeof(struct drm_set_client_cap)) << 16) )

struct drm_client在同文件(include/drm/drm.h)中定义,代码如下:

/* DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */
struct drm_set_client_cap {
	__u64 capability;
	__u64 value;
};

DRM_IOCTL_SET_CLIENT_CAP对应的Userspace API为:drmSetClientCap()。该函数也是在xf86drm.c中,代码如下:

drm_public int drmSetClientCap(int fd, uint64_t capability, uint64_t value)
{
    struct drm_set_client_cap cap;

    memclear(cap);
    cap.capability = capability;
    cap.value = value;

    return drmIoctl(fd, DRM_IOCTL_SET_CLIENT_CAP, &cap);
}

函数的作用是告诉DRM驱动当前用户进程所支持的能力。此函数在后文具体讲解函数的时候进行详细解析。在此先认识一下、有个印象就好。

其余宏定义将在后续文章中继续解析。

猜你喜欢

转载自blog.csdn.net/phmatthaus/article/details/132476390