您的位置:首页 > 移动开发 > Android开发

[RK3399][Android7.1] Display系统中的DRM模块介绍

2018-01-12 17:21 501 查看
OS: Android 7.1

Board: Firefly-RK3399

Kernel: v4.4.55

DRM介绍

DRM全称 Direct Rendering Manager, 是device-independent内核级别驱动,内核提供直接访问硬件的权限, 原本是设计提供给PC使用来支持复杂的图形设备,后来也用于嵌入式系统上。

PC一般都有显卡并且有自己的video memory,而嵌入式系统没有。

DRM组成

KMS(Kernel Mode Setting): 改变分辨率和位深

DRI(Direct Rendering Infrastructure): 直接访问硬件接口

GEM(Graphics Execution Manager): 内存管理

DRM Driver in kernel side:  访问硬件

没有DRM,嵌入式系统怎么实现显示和内存管理?

Display:基于Linux Framebuffer

Multimedia: 基于V4L2

Buffer Manager: 基于ION, PMEM等

为什么要选择DRM?

社区一直在维护

在显示部分提供细粒度控制

user-space graphic使用很广

提供一整套高级features

为什么不选择FBDEV或者V4L2?

FBDEV: 社区维护者较少; 无法提供overlay hw cursor等features; 开发者鼓励以后迁移到DRM/KMS上。

V4L2: 主要用于video模块,display模块有点大材小用。

DRM优势在哪里?

通过单单一个device node来控制所有硬件设备

通用访问硬件接口

通用内存管理机制

KMS Framework组成:

Framebuffer,CRTC,Encoder和Connector,以及Plane和drm device。

各个模块在框架中的位置如下图:



Framebuffer:

内存信息如宽,高,bpp等。

代码中由 struct drm_framebuffer 表示,

在rockchip_drm_fbdev_create()@rockchip_drm_fbdev.c中创建。



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:

DRM_PLANE_TYPE_PRIMARY: 一定要有,由于显示背景或者图像内容

DRM_PLANE_TYPE_OVERLAY: 用于显示Overlay

DRM_PLANE_TYPE_CURSOR: 用于显示鼠标

代码中由struct drm_plane_funcs 表示。

在vop_plane_init()@Rockchip_drm_vop.c中创建注册。



drm device:

处理用户空间的请求。

在代码中由struct drm_driver表示执行。

在rockchip_drm_bind()@Rockchip_drm_drv.c 创建和注册。

参考:

brezillon-drm-kms.pdf

DRM Driver Development For Embedded Systems.pdf
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: