3. DRM 框架基础:核心概念 CRTC、Encoder、Connector、Plane

DRM (Direct Rendering Manager) 是 Linux 内核中负责图形显示和渲染管理的框架。在瑞芯微平台显示驱动开发中,理解 DRM 的四个核心对象——CRTC、Encoder、Connector、Plane——是掌握 KMS (Kernel Mode Setting) 的基础。它们共同构成了显示管线的逻辑抽象,将物理显示硬件映射为内核可管理的对象。

核心要点: DRM 框架将复杂的显示硬件流水线拆解为四个独立可组合的组件。KMS 配置的本质就是将这些组件按正确的拓扑关系连接起来,形成一条从帧缓冲区到物理显示器的完整数据通路。

3.1 四大核心对象概述

下表总结了 CRTC、Encoder、Connector、Plane 在显示管线中的角色与职责:

对象 英文全称 核心职责 硬件对应关系
CRTC Cathode Ray Tube Controller 扫描控制、时序生成、帧缓冲扫描 显示控制器 (VOP/Display Controller)
Encoder Encoder 像素数据编码、信号转换 HDMI TX / MIPI DSI / LVDS 发送器
Connector Connector 物理连接检测、EDID 读取、热插拔 HDMI / DP / MIPI 物理接口
Plane Plane 图层叠加、Alpha 混合、缩放 硬件图层 (Win0/Win1/Win2)
瑞芯微平台提示: 在 RK3588/RK3568 等芯片中,CRTC 对应 VOP (Video Output Processor) 的显示通道,每个 VOP 通常包含多个硬件图层(Win),这些 Win 在 DRM 中映射为 Plane 对象。

3.2 显示管线拓扑关系

四个核心对象按照固定的拓扑结构连接,形成完整的显示通路。下图展示了 DRM 显示管线的标准连接关系:

DRM 显示管线拓扑结构 Plane (图层) Plane (图层) Plane (图层) CRTC 显示控制器 Encoder 编码器/发送器 Connector 物理接口 数据流向:帧缓冲区 → Plane → CRTC → Encoder → Connector → 显示器
常见误区: 初学者容易将 Connector 和 Encoder 混淆。请记住:Encoder 负责信号编码(如将 RGB 转换为 TMDS),Connector 负责物理连接检测和 EDID 读取。在瑞芯微平台中,一个 Encoder 可以对应多个 Connector(例如一个 MIPI DSI Encoder 驱动两个屏幕)。

3.3 各核心对象详解

3.3.1 CRTC (显示控制器)

CRTC 是显示管线的核心调度器,负责从帧缓冲区读取像素数据,并按照设定的时序参数生成行/场同步信号。CRTC 的主要功能包括:

  • 时序生成: 根据 modeline 参数生成 Hsync、Vsync、HBP、HFP、VBP、VFP 等时序信号。
  • 帧缓冲扫描: 从关联的 Framebuffer 中按行读取像素数据。
  • 模式设置: 接收用户空间的 mode 配置,调整显示分辨率和刷新率。
  • Vblank 管理: 产生垂直消隐中断,用于页面翻转同步。

在瑞芯微平台中,CRTC 通常对应 VOP 的显示通道。例如 RK3588 有 3 个 VOP(VOP0/VOP1/VOP2),每个 VOP 包含独立的 CRTC 功能。

3.3.2 Encoder (编码器)

Encoder 负责将 CRTC 输出的并行像素数据转换为特定显示接口所需的串行信号格式。常见的 Encoder 类型包括:

Encoder 类型 输出接口 瑞芯微平台对应驱动
HDMI Encoder HDMI 发送器 dw-hdmi / inno-hdmi
MIPI DSI Encoder MIPI DSI 发送器 dw-mipi-dsi / rockchip-dsi
LVDS Encoder LVDS 发送器 rockchip-lvds
eDP Encoder eDP 发送器 analogix_dp / cdn-dp

3.3.3 Connector (连接器)

Connector 代表物理显示接口,负责检测显示器连接状态、读取 EDID 数据、获取显示器能力信息。Connector 的关键属性包括:

  • 连接状态: connected / disconnected / unknown
  • 物理类型: HDMI-A / DVI-I / DSI / LVDS / eDP / DP
  • EDID 数据: 包含显示器支持的分辨率、刷新率、色彩空间等信息
  • 热插拔检测: 通过 GPIO 中断或 I2C 检测显示器插拔事件
调试技巧: 使用 cat /sys/class/drm/card0-HDMI-A-1/status 可以查看 Connector 的连接状态。如果显示 disconnected,请检查硬件连接或热插拔检测电路。

3.3.4 Plane (图层)

Plane 是 DRM 框架中负责图层叠加和合成的对象。每个 Plane 对应一个硬件图层,支持独立的帧缓冲区、位置、大小、透明度等属性。Plane 分为三种类型:

Plane 类型 功能特点 瑞芯微硬件对应
Primary Plane 主图层,必须存在,通常用于桌面背景 Win0 (主窗口)
Overlay Plane 叠加图层,支持 Alpha 混合和缩放 Win1/Win2 (叠加窗口)
Cursor Plane 光标图层,硬件光标支持 硬件光标 (HWC)

3.4 对象连接与 KMS 配置流程

在 KMS 配置过程中,用户空间通过 DRM 的原子接口 (Atomic API) 或传统接口 (Legacy API) 完成以下步骤:

  1. 枚举对象: 获取系统中所有 CRTC、Encoder、Connector、Plane 的 ID 和属性。
  2. 选择 Connector: 根据用户需求选择目标显示器对应的 Connector。
  3. 获取 Modeline: 从 Connector 的 EDID 中读取或手动指定显示模式。
  4. 建立连接: 将 CRTC 与 Encoder 绑定,Encoder 与 Connector 绑定。
  5. 配置 Plane: 为 CRTC 分配 Primary Plane,设置帧缓冲区地址和显示区域。
  6. 提交配置: 通过 Atomic Commit 或 SetCrtc 提交完整配置。

以下是一个简化的 KMS 配置代码片段,展示对象连接关系:

// 伪代码:KMS 配置流程
struct drm_mode_create_dumb dumb;
struct drm_framebuffer fb;
struct drm_mode_crtc crtc;
struct drm_mode_encoder encoder;
struct drm_mode_connector connector;

// 1. 获取 Connector 和 Encoder
drmModeGetConnector(fd, connector_id);
drmModeGetEncoder(fd, encoder_id);

// 2. 获取 Modeline
drmModeGetProperty(fd, connector_id, "EDID");
drmModeGetConnectorModeline(connector);

// 3. 创建帧缓冲区
drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &dumb);
drmModeAddFB(fd, width, height, depth, bpp, pitch, handle, &fb_id);

// 4. 设置 CRTC(自动完成 Encoder 绑定)
drmModeSetCrtc(fd, crtc_id, fb_id, x, y, &connector_id, 1, &mode);

3.5 瑞芯微平台对象映射实例

以 RK3568 平台为例,DRM 对象与硬件模块的映射关系如下:

RK3568 DRM 对象与硬件映射 Plane (Win0/Win1) CRTC (VOP) Encoder (HDMI/DSI) Connector VOP Win0/Win1 VOP 显示控制器 HDMI TX / MIPI DSI HDMI / DSI 接口 软件层 (DRM 对象) 通过驱动绑定到硬件层,每个 DRM 对象对应一个具体的硬件模块
瑞芯微调试命令: 使用 modetest -M rockchip 可以查看当前系统中所有 DRM 对象的拓扑关系,包括每个 CRTC 绑定的 Encoder 和 Connector,以及每个 CRTC 使用的 Plane 信息。

3.6 常见问题与排查思路

现象 可能原因 排查方向
无显示输出 CRTC 未正确配置 mode 检查 modeline 参数是否匹配显示器 EDID
画面撕裂 Plane 未启用 Vblank 同步 确认 Atomic Commit 中设置了 DRM_MODE_PAGE_FLIP_EVENT
分辨率错误 Connector 读取 EDID 失败 使用 drm_info 查看 EDID 是否有效
图层不显示 Plane 的 Z-order 配置错误 检查 Plane 的 src/dst 坐标和 Alpha 值
热插拔无响应 Connector 的 HPD 中断未注册 检查设备树中 HPD GPIO 配置
关键提醒: 在瑞芯微平台调试时,务必确认设备树中 CRTC、Encoder、Connector 的端口连接关系(port/endpoint)是否正确。错误的端口绑定会导致 DRM 对象无法建立有效拓扑,表现为 drmModeSetCrtc 返回 -EINVAL。