3. DRM 框架基础:核心概念 CRTC、Encoder、Connector、Plane
DRM (Direct Rendering Manager) 是 Linux 内核中负责图形显示和渲染管理的框架。在瑞芯微平台显示驱动开发中,理解 DRM 的四个核心对象——CRTC、Encoder、Connector、Plane——是掌握 KMS (Kernel Mode Setting) 的基础。它们共同构成了显示管线的逻辑抽象,将物理显示硬件映射为内核可管理的对象。
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) |
3.2 显示管线拓扑关系
四个核心对象按照固定的拓扑结构连接,形成完整的显示通路。下图展示了 DRM 显示管线的标准连接关系:
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) 完成以下步骤:
- 枚举对象: 获取系统中所有 CRTC、Encoder、Connector、Plane 的 ID 和属性。
- 选择 Connector: 根据用户需求选择目标显示器对应的 Connector。
- 获取 Modeline: 从 Connector 的 EDID 中读取或手动指定显示模式。
- 建立连接: 将 CRTC 与 Encoder 绑定,Encoder 与 Connector 绑定。
- 配置 Plane: 为 CRTC 分配 Primary Plane,设置帧缓冲区地址和显示区域。
- 提交配置: 通过 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 对象与硬件模块的映射关系如下:
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 配置 |
drmModeSetCrtc 返回 -EINVAL。