目录
1. 简介
2. drm device的注册
3. fops
根据前面几篇文档的介绍,我们知道了drm的整体的构成,后面的文章我们从实际的一个例子中进行分析。
1. 简介
kernel版本:4.14
gpu:ARM Mali DP650
hdmi:dw hdmi
涉及的代码除了drm core层的代码外,还设计的如下:
gpu:
drivers\gpu\drm\arm\malidp_drv.c
drivers\gpu\drm\arm\malidp_crtc.c
drivers\gpu\drm\arm\malidp_hw.c
drivers\gpu\drm\arm\malidp_planes.c
drivers\gpu\drm\arm\malidp_regs.c
drivers\gpu\drm\arm\malidp_drv
hdmi:
drivers\gpu\drm\bridge\synopsys\dw-hdmi.c
2. drm device的注册
主要代码在文件drivers\gpu\drm\arm\malidp_drv.c中,drm框架中还设计component子系统,本专题中不讨论这个,当dts匹配上的时候,最终调用函数malidp_bind。
crtc和plane是在gpu这边注册的,而connector和encoder是在dw-hdmi那边注册的,内核中没有现成的引用,可以参考drivers\gpu\drm\arm\virt_hdmi.c。
其他的注册可以自己阅读这里不做详细介绍了。
3. fops
#define DEFINE_DRM_GEM_CMA_FOPS(name) \
static const struct file_operations name = {\
.owner = THIS_MODULE,\
.open = drm_open,\
.release = drm_release,\
.unlocked_ioctl = drm_ioctl,\
.compat_ioctl = drm_compat_ioctl,\
.poll = drm_poll,\
.read = drm_read,\
.llseek = noop_llseek,\
.mmap = drm_gem_cma_mmap,\
DRM_GEM_CMA_UNMAPPED_AREA_FOPS \
}
DEFINE_DRM_GEM_CMA_FOPS(fops);
对linux来说,一切皆设备。drm对应的字符设备驱动描述符如上所示,drm_ioctl是用户态和内核态间的交互的重中之重,我们下一节讨论。