OS: Android 7.1
Board: Firefly-RK3399
Kernel: v4.4.55
DRM介绍:
DRM全称 Direct Rendering Manager, 是device-independent内核级别驱动,内核提供直接访问硬件的权限, 原本是设计提供给PC使用来支持复杂的图形设备,后来也用于嵌入式系统上。
PC一般都有显卡并且有自己的video memory,而嵌入式系统没有。
DRM组成:
没有DRM,嵌入式系统怎么实现显示和内存管理?
为什么要选择DRM?
为什么不选择FBDEV或者V4L2?
DRM优势在哪里?
KMS Framework组成:
Framebuffer,CRTC,Encoder和Connector,以及Plane和drm device。
各个模块在框架中的位置如下图:
CRTC:
之前代表的是CRT controller,目前主要用于显示控制,如用于display timings,
resolution的配置,将framebuffer内容送到display,更新framebuffer等。
在代码中由struct drm_crtc_funcs 和 struct drm_crtc_helper_funcs两个结构来表示。
在vop_create_crtc()@rockchip_drm_vop.c中创建。
Encoder:
将数据转换成合适的格式,送给connector,比如HDMI需要TMDS信息, encoder就将数据转成HDMI需要的TMDS格式。
在代码中由struct drm_encoder_funcs和struct drm_encoder_helper_funcs两个结构表示。
因为和connnector有相当紧密的关系,所以它的注册放在各个connector的驱动文件中,如rockchip_dp_drm_create_encoder()@analogix_dp-rockchip.c
Connector:
代表具体外部接口,如edp, hdmi, mipi等。用于传输信号给外部硬件显示设备,探测外部显示设备接入。
在代码中由struct drm_connector_funcs 和 struct drm_connector_helper_funcs表示。
目前有rockchip_lvds.c, analogix_dp-rockchip.c, cdn-dp-core.c , dw-mipi-dsi.c, dw_hdmi-rockchip.c这几个驱动文件。
analogix_dp-rockchip.c的注册放在了analogix_dp_core.c 中,会通过rockchip_dp_bind()间接调用到。
Encoder和Connector这两个模块有些内容会重叠在一起,所以很难清晰划分开来。
Planes:
一个Plane代表一个image layer, 最终的image由一个或者多个Planes组成。
不同类型的Planes:
代码中由struct drm_plane_funcs 表示。
在vop_plane_init()@Rockchip_drm_vop.c中创建注册。
参考: brezillon-drm-kms.pdf DRM Driver Development For Embedded Systems.pdf