LCD DRM驱动框架分析一

本文是基于rk3566 / rk3568平台 从概念和框架上对LCD DRM驱动框架进行分析。

一、DRM(Direct Rendering Manager)简介

DRM 是 Linux 目前主流的图形显示框架,相比 FB 架构,DRM 更能适应当前日益更新的显示硬件。比如 FB 原生不支持多层合成,不支持 VSYNC,不支持 DMA-BUF,不支持异步更新,不支持 fence 机制等等,而这些功能 DRM 原生都支持。同时 DRM 可以统一管理 GPU 和 Display 驱动,使得软件架构更为统一,方便管理和维护。

DRM 全称是 Direct Rendering Manager,进行显示输出管理、buffer 分配、帧缓冲。对应 userspace 库 为 libdrm,,libdrm 库提供了一系列友好的控制封装,使用户可以方便的进行显示的控制和 buffer 申请。DRM 的设备节点为 "/dev/dri/cardX", X 为 0-15 的数值,默认使用的是/dev/dri/card0。

1、DRM显示通路介绍

04c1d9e9b86d468689789bddcfc17cb5.png

各部分说明:

1)DRM Framebuffer

是一块内存区域,可以理解为一块画布,驱动和应用层都能访问它。绘制前需要将它格式化,设定绘制的色彩模式(例如RGB24,YUV 等)和画布的大小(分辨率),不负责显存的分配释放。

2)CRTC

阴极摄像管上下文(显示控制器),也可以理解为扫描仪(对显示buffer进行扫描,并产生时序信号(RGB timing)的硬件模块)。CRTC对内连接 Framebuffer 地址,对外连接 Encoder,会扫描 Framebuffer 上的内容,叠加上 Planes 的内容,最后传给Encoder。在 rockchip 平台是 SOC 内部 VOP(部分文档也称为 LCDC)模块的抽象。如图:

0452b6c900ab4c5095cae5e0cbdd67ba.png

83b9ae47158b4486803adc807a9d6f16.png

注:crtc代码层面的作用:

2.1)DPMS (Display Power Manage System) 电源状态管理 (crtc_funcs->dpms)。

2.2)将 Framebuffer 转换成标准的 LCDC Timing ,其实就是一帧图像刷新的过程(crtc_funs->mode_set)。

2.3)帧切换,即在 VBlank 消影期间,切换 Framebuffer(crtc_funcs->page_flip)。

2.4)gamma校正值调整(crtc_funcs->gamma_set)。

3)Encoder

编码器/输出转换器,负责将CRTC输出的timing时序转换成外部设备所需要的信号的模块。它的作用就是将内存的 pixel 像素编码(转换)为显示器所需要的信号(因为画面显示到不同的设备(Display Device)上,需要将画面转化为不同的电信号)。如指 RGB、LVDS、DSI、eDP、HDMI、CVBS、VGA 等显示接口。另外 Encoder 和 CRTC 之间的交互就是我们所说的 ModeSetting,其中包含了前面提到的色彩模式、还有时序(Timing)等。

注:Encoder代码层面的作用:

3.1)DPMS (Display Power Manage System) 电源状态管理 (encoder_funcs->dpms)

3.2)将 VOP 输出的 lcdc Timing 打包转化为对应接口时序 HDMI TMDS / … (encoder_funcs->mode_set)

4)Connector

连接器,指 encoder 和 panel 之间交互的接口部分。对应于物理连接器 (例如 VGA, DVI, FPD-Link, HDMI, DisplayPort, S-Video等) ,它不是指物理线,在 DRM中,Connector 是一个抽象的数据结构,代表连接的显示设备,从Connector中可以得到当前物理连接的输出设备相关的信息。

注:Connector代码层面的作用

4.1)获取上报 热拔插 Hotplug 状态

4.2)读取并解析屏 (Panel) 的 EDID 信息

5)Bridge

桥接设备,一般用于注册 encoder 后面另外再接的转换芯片,如 DSI2HDMI 转换芯片。桥接ic所处位置,如图:

2e32dc90c57a459293dd91ea5d235943.png

6)Panel

泛指屏,各种LCD, HDMI等显示设备的抽象。用于获取LCD mode参数,并提供LCD休眠唤醒的回调接口,供encoder调用。

7)Fence

buffer 同步机制,基于内核 dma_fence 机制实现,用于防止显示内容出现异步问题。

8)Plane

硬件图层, 和 Framebuffer 一样是内存地址。在 rockchip 平台是 SOC 内部 VOP(LCDC)模块 win 图层的抽象。一个Plane代表一个image layer, 最终的image由一个或者多个Planes组成。
 
plane的几种类型:
 

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

6.2)DRM_PLANE_TYPE_OVERLAY: 用于显示Overlay

6.3)DRM_PLANE_TYPE_CURSOR: 用于显示鼠标

 

小结:

实例解析下 CRTC / Encoder / Connector 的行为:
1)首先 HDMI 驱动检测到电视 Plugin 信号,读出电视的 EDID 信号,获取电视的分辨率信息 (DRM Connector)。
2)Userspace 将需要显示的数据填充在 framebuffer 里面,然后通过 libdrm 接口通知 VOP 设备开始显示。
3)接着 VOP 驱动将 framebuffer 里面的数据转换成标准的 LCDC Timing 时序 (DRM CRTC)。
4)同时 HDMI 驱动将 HDMI 硬件模块的 LCDC 时序配置与 VOP 输出时序一致,准备将输入的 LCDC Timing 转化为电视识别的 HDMI TMDS 信号 (DRM Encoder)。

2、DRM模块介绍

DRM 从模块上划分,可以简单分为 3 部分:libdrmKMSGEM。

DRM驱动 和 libdrm 交互过程如下:

f19a62b8e12a44a285ea2f3ee4e146e6.png

 各部分说明:

1)libdrm

对底层接口进行封装,向上层提供通用的API接口(主要是对各种IOCTL接口进行封装)。

如下例子:

drmModeSetCrtc -》DRM_IOCTL(fd, DRM_IOCTL_MODE_SETCRTC, &crtc)-》drm_mode_setcrtc

drmModeAtomicCommit-》DRM_IOCTL(fd, DRM_IOCTL_MODE_ATOMIC, &atomic)-》drm_mode_atomic_ioctl

drmModeGetConnector()-》DRM_IOCTL(fd, DRM_IOCTL_MODE_GETCONNECTOR, &conn)-》drm_mode_getconnector

2)kms

kernel mode setting,即mode setting。作用:更新画面和设置显示参数。

更新画面:显示buffer的切换,多图层的合成方式,以及每个图层的显示位置。

设置显示参数:包括分辨率、刷新率、电源状态(休眠唤醒)等。

KMS包括:CRTCENCODERCONNECTORPLANEFBVBLANKproperty

3)gem

Graphic Exection Manager,主要是对 FrameBuffer 的管理,如显存的申请释放 (Framebuffer managing) ,显存共享机制 (Memory sharing objects), 及显存同步机制 (Memory synchronization),也是GPU唯一用到DRM的地方。

GEM包括:DUMBPRIMEfence

三、其他

1、DRI

Direct Rendering Infrastructure,直接访问硬件接口

2、EDID

Extended Display Identification Data,扩展显示标识数据,共有128字节。其中包含有关显示器及其性能的参数,包括供应商信息、最大图像大小、颜色设置、厂商预设置、频率范围的限制以及显示器名和序列号的字符串。

3、DDC

Display Data Channel,显示数据通道,顾名思义,它是一个通道,DDC是用来传送EDID信息的。EDID信息包含了显示器需要的128字节,128个字节的附加块可以存储在初始的EDID块之后的EDID扩展块VDIF,这些块包含addtional具体的时序信息

4、关系

plane 是连接 framebuffer 和 crtc 的纽带,而 encoder 则是连接 crtc 和 connector 的纽带。与物理 buffer 直接打交道的是 gem 而不是 framebuffer。

 

猜你喜欢

转载自blog.csdn.net/qq_33782617/article/details/126202800