3. DRM架构总览
在 Linux 显示子系统中,DRM(Direct Rendering Manager)负责把用户空间的图形缓冲最终变成屏幕上的像素。理解 DRM 的关键,不是死记结构体字段,而是建立一张“对象职责图”:谁描述显示能力,谁负责扫描输出,谁把画面送到具体屏幕。移植驱动时,设备树里的每一个节点,几乎都能在这张图上找到对应角色。
一、核心对象与职责划分
DRM 把显示链路拆成若干可组合对象,每个对象只解决一类问题。它们通过 mode_config 统一管理,并在内核中形成一棵从“显示控制器”到“物理屏幕”的拓扑树。
- CRTC:显示控制器通道,代表一个可以独立扫描输出的时序发生器。它从 Framebuffer 取像素,按行场时序送出,是“谁在产生扫描信号”。
- Plane:图层,负责把一块 Framebuffer 按格式、缩放、位置叠加到 CRTC 上。一个 CRTC 可挂多个 Plane,实现主图层、光标层、视频叠加层。
- Encoder:编码器,把 CRTC 的并行像素时序转换成某种物理接口信号,如 RGB、LVDS、MIPI DSI、HDMI TMDS。它是“时序到接口”的转换器。
- Connector:连接器,描述一个物理输出口及其可插拔状态、EDID、支持模式。它回答“屏幕接在哪里、支持什么分辨率”。
- Bridge:桥接芯片或转换逻辑,位于 Encoder 与 Connector 之间,完成协议转换,如 DSI 转 LVDS、HDMI 转 RGB。
- Panel:具体液晶面板,提供物理尺寸、时序参数、上电序列和背光控制,是链路终点。
- Framebuffer:像素缓冲,被 Plane 引用,是显示内容的来源。
二、显示数据流与对象拓扑
下图把上述对象按“像素流”方向排列,同时标出设备树中常见的对应节点。可以看到,CRTC 是中心调度者,Plane 是输入侧,Encoder/Bridge/Connector/Panel 是输出侧。
三、设备树中的映射关系
在设备树里,这些对象通常以“控制器 + 端口 + 端点”的方式描述。一个典型的 DSI 屏链路如下:
dsi@ff960000 {
compatible = "rockchip,rk3568-mipi-dsi";
ports {
dsi_in: endpoint { remote-endpoint = &vop_out_dsi; };
dsi_out: endpoint { remote-endpoint = &panel_in; };
};
};
panel: panel@0 {
compatible = "boe,ev121wxm-n10";
backlight = &backlight;
port { panel_in: endpoint { remote-endpoint = &dsi_out; }; };
};
这里的 vop 对应 CRTC,dsi 对应 Encoder,panel 对应 Panel。若中间还有 DSI 转 LVDS 芯片,则它作为 Bridge 出现在两者之间。移植时最常见的错误,就是端点连接写反或漏写,导致 DRM 枚举不出完整链路。
四、对象职责速查表
| 对象 | 核心职责 | 设备树常见体现 | 调试关注点 |
|---|---|---|---|
| CRTC | 产生扫描时序,驱动输出 | vop / display-controller | 时钟、时序、状态是否 enable |
| Plane | 图层叠加、格式转换、缩放 | 通常由驱动内部注册 | 格式支持、Z 序、坐标 |
| Encoder | 并行时序转物理接口 | dsi / hdmi / lvds 节点 | PHY 锁定、lane 数、时钟 |
| Bridge | 协议转换与信号中继 | 桥接芯片子节点 | 上电时序、I2C 配置 |
| Connector | 描述输出口与可插拔状态 | 由 Encoder/Bridge 派生 | EDID、热插拔、模式列表 |
| Panel | 提供面板时序与背光 | panel 节点 + backlight | prepare/enable 时序、PWM |
五、典型场景与常见误区
假设一块 RK3568 板卡接 MIPI DSI 屏,启动后屏幕无显示。按对象链路排查:先看 CRTC 是否绑定成功,再看 Encoder 的 PHY 是否锁定,然后确认 Bridge 或 Panel 是否收到正确的 endpoint。若 dmesg 中出现 failed to find panel,多半是 Panel 节点未被正确引用;若出现 unsupported mode,则要检查 Panel 时序与 CRTC 输出能力是否匹配。
modetest -M rockchip 列出 CRTC、Encoder、Connector 和 Plane 的绑定关系;再对照设备树 endpoint 逐项核对。只要拓扑完整、时序匹配、上电顺序正确,显示链路就能一次点亮。
掌握这张对象图后,后续无论是配置设备树、编写 Panel 驱动,还是排查黑屏、花屏、闪屏问题,都可以沿着“Framebuffer → Plane → CRTC → Encoder → Bridge → Connector → Panel”这条主线逐段定位,而不是盲目改参数。