ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

第2篇:DRM 是什么?为什么显示驱动绕不开它?

第2篇:DRM 是什么?为什么显示驱动绕不开它? 摘要Android/Linux 显示体系里DRM 不是某个单点模块DRM 是 Linux 显示体系的核心框架。它统一管理 CRTC、Encoder、Connector、Plane、内存与同步把上层图层安全提交给显示硬件是在内核中负责显示资源管理、模式设置、图层提交和同步调度的核心框架。理解 DRM是从“会调屏”走向“能定位黑屏、花屏、闪屏和图层异常问题”的关键一步。前言很多人刚接触显示驱动时会把 DRM 理解成一个“屏幕驱动”。其实不是。在我理解看来DRM 更像是内核显示子系统的“基础设施”它统一管理显卡、显示控制器、图层、连接器、内存和同步机制。Panel、MIPI、HWC 这些模块最终都要挂到这套框架上工作。1. DRM 到底解决了什么问题在 DRM 出现之前Linux 显示路径比较分散不同硬件各自管理显示资源容易出现几个问题多个程序同时申请显示资源谁都可以抢屏幕图层叠加、模式切换没有统一协调内存管理、同步机制不统一用户态和内核态接口混乱DRM 的目标就是把这些能力统一起来把显示资源抽象成统一模型让用户态按规则申请、配置和提交。它解决的不是“屏幕怎么亮”这一件事而是谁可以访问显示设备怎么设置显示模式怎么提交图层怎么分配和共享图形内存怎么同步一帧画面的完成时机,时机很关键,时机不对送来图也不会正常显示.2. DRM 在显示链路中的位置回顾第1篇的链路App → SurfaceFlinger → HWC → Gralloc → DRM → Panel / MIPI → 屏幕DRM 位于图形链路的内核入口是用户态和显示硬件之间的桥梁。可以把它理解成三层第一层userspaceinterfaceApp、SurfaceFlinger、HWC 通过 libdrm 或框架接口访问 DRM。第二层DRM 核心框架内核里的 DRM 子系统负责设备初始化资源管理模式设置属性解析提交调度同步处理第三层硬件驱动具体芯片的 CRTC、Encoder、Connector、Plane、Panel、MIPI 驱动按照 DRM 框架实现硬件操作。3. DRM 最核心的几个概念这几个概念需要理解记忆,甚至背诵以后看日志、看驱动代码必须认识。在MTK等平台driver代码里专门有对应的驱动文件。CRTCCRTC 可以理解为“显示控制器”。它负责把一帧数据扫描出来按照一定时序送到显示接口。可以简单记CRTC 是真正产生显示时序、扫描帧数据的地方。EncoderEncoder 负责把 CRTC 输出的画面数据转换成适合当前接口传输的格式或协议。比如转换成 MIPI-DSI 流转换成 HDMI 信号转换成 DP 信号可以理解为Encoder 是数据传输格式的转换器。ConnectorConnector 代表一个可见的显示输出接口。比如MIPIDSI接口HDMI 接口DP 接口外接显示屏用户看到的“某个屏幕已连接”在 DRM 里通常对应一个 Connector。PlanePlane 是图层。Android 里每个窗口比如桌面和大家喜欢用的悬浮窗、状态栏、视频层都可能对应一个或多个 Plane当前界面具体几个layer需要dumpsys SurfaceFlinger确认。DRM 允许硬件把多个 Plane 叠加起来显示。所以 Plane 的关键作用是支持多图层硬件叠加。手机SOC硬件基本是会支持4层当然也得看具体平台FB / FramebufferFramebuffer 是一帧画面的内存缓冲区。上层把绘制好的 Buffer 交给 DRMDRM 把它映射到 Framebuffer再由 CRTC 扫描输出。可以理解为Framebuffer 就是当前要显示的那帧数据。4. DRM 提交一帧的大致过程app要显示一帧通常不是简单“写一下显存”而是一个完整提交过程。大致步骤准备图形 Buffer用户态设置显示属性检查配置是否合法commit到内核DRM 完成模式设置或更新等待present fence等画面真正显示完成释放旧 Buffer这里面最关键的一步是“commit”。DRM 不是改完寄存器立刻显示而是把一次更新打包提交由框架统一调度通过fence来实现同步后续章节再详细讨论。5. 为什么现在强调 DRM AtomicAtomic 是 DRM 的重要改进。它的核心思想是把一次显示更新的所有配置当成一个完整事务检查后再提交。这有几个好处多个图层、模式、属性可以一起更新配置不合法时可以提前拒绝减少中间状态错乱更适合 Android 这种复杂合成场景所以你会经常看到这些关键词atomic_checkatomic_commitstateproperties它们本质上都围绕“原子提交”展开。6. DRM 和 HWC 是什么关系这是很多人最容易混淆的地方。可以这样理解HWCAndroid 用户态的硬件合成器决定哪些图层走硬件合成DRMLinux 内核里的显示框架负责把最终图层提交给硬件HWC 更像“策略选择器”DRM 更像“执行入口”。HWC 告诉系统这几个图层可以硬件叠加。然后由 DRM 完成真正的图层配置和提交。7. 从调试角度看DRM 为什么重要显示问题不一定都出在 DRM但很多问题最终都会在 DRM 层留下痕迹。遇到这些问题时DRM 是关键排查点黑屏花屏闪屏图层错位模式切换失败帧率异常休眠唤醒异常Buffer 显示异常因为 DRM 连接了上层 Buffer图层配置显示模式同步机制硬件寄存器所以它是显示问题的“必经之路”。8. 初学者怎么学 DRM建议按这个顺序来第一步先看概念搞懂 CRTC、Encoder、Connector、Plane、Framebuffer。第二步看日志用modetest、drm_info看系统里有哪些显示资源。第三步看驱动结构不必一开始啃完整源码先看驱动里这几个部分初始化模式设置图层更新电源管理中断处理第四步再看 Atomic理解 Atomic 前先理解普通提交模型。后续章节再详细讨论。结语DRM 不是单一功能模块而是 Linux 显示体系的骨架。你可以暂时不深究每一个源码细节但最好先建立这个认知DRM 负责统一管理显示资源把上层图层和配置安全、有序地提交给显示硬件。以后遇到显示问题不要只怀疑屏幕或 MIPI也记得往 DRM 这条链路上看。更多详细笔记见WeChat素师良码
返回列表