参考: https://blog.csdn.net/hexiaolong2009/article/details/83720940
https://blog.csdn.net/weixin_40026797/article/details/111058814

1.前言

最近在公司的项目代码中看到有关DRM的操作,对里面的DRM内容比较感兴趣,于是上网查找资料,本文对drm的学习进行一个记录

2.DRM是什么

DRM,英文为Direct Rending Manger,表示直接渲染管理器,是目前Linux下主流的显示框架,支持FB原生不支持的多图层合成,VSYNC,DMA-BUF,异步更新,支持fence机制,它是为了解决多个程序对video card资源的协同使用问题而产生的,它想用户空间提供一组统一的API,用以访问GPU,同时DRM可以统一管理

3.DRM的组成

DRM从模块上划分可简单分为三部分:libdrm,KMS,GEM
在这里插入图片描述

3.1 libdrm

对底层的接口进行封装,并且向上层提供通用的API接口,主要是对各种ioctl接口进行封装。应用层可以直接使用libdrm的接口来进行图像显示图像处理的功能

3.2 KMS

英文名为Kernel Mode setting,直译为模式设置,主要做两件事情:更新画面与设置显示参数
更新画面::显示buffer的切换,多图层的合成方式,以及每一个图层的显示位置
设置显示参数::包括分辨率,刷新率,电源状态(休眠唤醒)等。

3.3 GEM

Graphic Execution Manager,主要负责显示buffer的分配与释放

4.基本元素

DRM框架涉及到的元素大致如下:
KMS:CRTC,ENCODER,CONNECTOR,PLANE,FB,VBLANK,property
GEM:DUMB、PRIME、fence
在这里插入图片描述
在这里插入图片描述

4.1 DRM Framebuffer

Framebuffer,单个图层的显示内容,唯一一个和硬件无关的基本元素,它是一块内存区域,可以理解为一块画布,驱动和应用层都可以访问这块内存,绘制前需要设置它的色彩格式(如YUV,RGB等)和画布的大小

4.2 CRTC

阴极管的上下文,简单来说是显示输出的上下文,对显示buffer进行扫描,并产生时序信号的硬件模块,通常指Display Controller,CRTC对内连接Framebuffer的地址,对外连接Encoder,扫描了Framebuffer的内容之后,再叠加Planes的内容,最后传递给Encoder

4.3 Planes

硬件图层,有的Display硬件支持多层合成显示,但所有的Display Controller至少要有1个plane,与Framebuffer一样是内存地址,比如,在手机上可以一边玩电影一边与别人聊天,此时微信聊天界面叠加在游戏界面上,这是因为两个界面使用了不同的图层,这个时候planes就起了很大的作用,相当于图层叠加,所以CRTC扫描的图像实际上是FramebufferPlanes的结合。

4.3.1 类型
  • cursor:光标图层,一般用于pc系统,用于显示鼠标
  • overlay:叠加图层,通常用于YUV格式的视频图层
  • primary:主要图层,通常用于仅支持RGB格式的简单图层

4.4 Encoder

编码器,将内存中的pixel像素编码(转换为)显示器所需要的信号,将CRTC输出的t画面转换成不同外部设备所需要的信号的模块,如HDMI转换器,DSI Controller,VGA等,Encoder与CRTC之间的交互就是ModeSetting,包含了色彩模式,以及timing时序

4.5 Connector

连接物理显示设备的连接器,如HDMI、FPD-Link,DisplayPort、DSI总线,通常和Encoder驱动绑定在一起,它不是指物理线,connector是一个抽象的数据结构,从Connector中可以得到当前物理连接的输出设备的相关的信息,例如:连接状态,EDID数据,支持的视频模式

Logo

更多推荐