平台 | 内核版本 | 安卓版本 |
---|---|---|
rk | Linux4.4 | Android7.1 |
1. 简介
DRM
全称是 Direct Rendering Manager
,是 DRI(Direct Rendering Infrastructure)
框架的一个组件;Android
新版本逐渐从Framebuffer
框架迁移到 DRM
上,从内核 4.4
开始,RK 的显示框架逐渐迁移到 DRM
上;
DRM组成:
KMS(Kernel Mode Setting)
: 改变分辨率和位深DRI(Direct Rendering Infrastructure)
: 直接访问硬件接口GEM(Graphics Execution Manager)
: 内存管理DRM Driver in kernel side
: 访问硬件
嵌入式系统实现显示和内存管理方式
- Linux Framebuffer for Display
- V4L2 based device drivers for multimedia
Rotator and Scaler
Video codec
HDMI - Buffer managers such as UMP, HWMEM, CMEM, PMEM, ION, and so on.
为什么要选择DRM?
- 从界面的角度来看
- 通过单个设备节点控制所有HW
- 硬件访问的通用接口
- 缓冲区管理的通用接口
- 从机制的角度来看
- 构建屏幕
DRM优势在哪里?
- 通过单单一个device node来控制所有硬件设备
- 通用访问硬件接口
- 通用内存管理机制
DRM KMS Framework
KMS Framework组成:
-
Framebuffer
内存信息,如宽度,高度,深度,bpp,像素格式等 -
CRTC(CRT controller)
- Mode information(模式信息)
display timings, resolution、分辨率,深度,极性,门廊,刷新率,等等的配置 - Information of the buffer region displayed(显示缓冲区的信息)
- Change current framebuffer to new one(更新framebuffer)
- Encoder
- Take the digital bit-stream from the CRTC(从CRTC获取数字比特流)
- Convert to the appropriate analog levels (将数据转换成合适的格式送给connector)
比如HDMI需要TMDS信息, encoder就将数据转成HDMI需要的TMDS格式。
- Connector
- 代表具体外部接口,如edp, hdmi, mipi等。用于传输信号给外部硬件显示设备,探测外部显示设备接入。
代码
-
Framebuffer
目录rockchip_drm_fbdev.c
代码中由struct drm_framebuffer
表示
由rockchip_drm_fbdev_create()
创建
-
CRTC:
目录rockchip_drm_vop.c
代码中由struct drm_crtc_funcs
和struct drm_crtc_helper_funcs
两个结构来表示
由vop_create_crtc()
中创建 -
Encoder
目录analogix_dp-rockchip.c
在代码中由struct drm_encoder_funcs
和struct drm_encoder_helper_funcs
两个结构表示
由rockchip_dp_drm_create_encoder()
中创建 -
Connector
目录rockchip_lvds.c
,analogix_dp-rockchip.c
,cdn-dp-core.c
,dw-mipi-dsi.c
,dw_hdmi-rockchip.c
Planes:
一个Plane代表一个image layer, 最终的image由一个或者多个Planes组成。
不同类型的Planes
- DRM_PLANE_TYPE_PRIMARY: 一定要有,由于显示背景或者图像内容
- DRM_PLANE_TYPE_OVERLAY: 用于显示Overlay
- DRM_PLANE_TYPE_CURSOR: 用于显示鼠标
代码中由struct drm_plane_funcs 表示。
在vop_plane_init()@Rockchip_drm_vop.c中创建注册。