接前一篇文章: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驱动当前用户进程所支持的能力。此函数在后文具体讲解函数的时候进行详细解析。在此先认识一下、有个印象就好。
其余宏定义将在后续文章中继续解析。