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 引用,是显示内容的来源。
数据流主线:Framebuffer → Plane → CRTC → Encoder → Bridge → Connector → Panel。控制流则相反:用户空间通过 Connector 获取模式,选择 CRTC 与 Plane,提交原子状态,最终由 CRTC 驱动扫描。

二、显示数据流与对象拓扑

下图把上述对象按“像素流”方向排列,同时标出设备树中常见的对应节点。可以看到,CRTC 是中心调度者,Plane 是输入侧,Encoder/Bridge/Connector/Panel 是输出侧。

DRM 显示链路对象拓扑与数据流 Framebuffer 像素缓冲 / GEM Plane 图层 / 格式 / 缩放 CRTC 时序发生器 / 扫描 Encoder RGB / DSI / LVDS Bridge 协议转换 Connector EDID / 热插拔 Panel 时序 / 背光 mode_config 统一管理 原子提交 / 状态校验 / 拓扑枚举 实线:像素数据流方向 虚线:控制/状态流方向 设备树常见节点 display-controller ports / endpoint

三、设备树中的映射关系

在设备树里,这些对象通常以“控制器 + 端口 + 端点”的方式描述。一个典型的 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 输出能力是否匹配。

常见误区:把 Connector 当成“屏幕本身”。Connector 只是接口抽象,真正决定像素如何显示的是 Panel 和 CRTC 时序。另一个误区是忽略 Bridge 的上电顺序,导致 DSI 已经出图但 LVDS 端无信号。
复盘方法:用 modetest -M rockchip 列出 CRTC、Encoder、Connector 和 Plane 的绑定关系;再对照设备树 endpoint 逐项核对。只要拓扑完整、时序匹配、上电顺序正确,显示链路就能一次点亮。

掌握这张对象图后,后续无论是配置设备树、编写 Panel 驱动,还是排查黑屏、花屏、闪屏问题,都可以沿着“Framebuffer → Plane → CRTC → Encoder → Bridge → Connector → Panel”这条主线逐段定位,而不是盲目改参数。