4. KMS 对象模型详解:CRTC、Encoder、Connector、Plane 的属性与关系
KMS(Kernel Mode Setting)是 Linux 内核中负责显示模式设置和缓冲区管理的核心框架。它通过四个基本对象——CRTC、Encoder、Connector 和 Plane——来抽象物理显示硬件。理解这些对象的属性及其相互关系,是配置 Weston 合成器、调试显示驱动的基础。
4.1 对象总览与职责
下表总结了四个核心 KMS 对象的职责与典型属性:
| 对象 | 英文全称 | 核心职责 | 典型属性 |
|---|---|---|---|
| CRTC | Cathode Ray Tube Controller | 控制显示时序(行/场同步、像素时钟),管理扫描输出 | mode、active、gamma_lut、vblank |
| Encoder | Encoder | 将 CRTC 输出的数字信号转换为物理接口信号(如 HDMI、DP、LVDS) | encoder_type、possible_crtcs、possible_clones |
| Connector | Connector | 代表物理显示接口(HDMI 端口、DP 端口、eDP 面板),检测连接状态与 EDID | status、edid、link_status、dpms |
| Plane | Plane | 管理帧缓冲区(Framebuffer)的叠加与合成,支持硬件光标、视频层等 | fb_id、crtc_id、src_*、crtc_*、zpos |
4.2 对象关系与数据流
四个对象之间的连接关系构成了完整的显示数据通路。下图展示了典型的 KMS 对象拓扑:
4.3 各对象属性详解
4.3.1 CRTC(显示控制器)
CRTC 是 KMS 的核心时序引擎。它负责生成行同步(HSYNC)、场同步(VSYNC)和像素时钟,并控制扫描输出的起始位置与尺寸。CRTC 的主要属性包括:
- mode:当前显示模式(分辨率、刷新率、时钟参数),通过
drmModeGetCrtc()获取。 - active:布尔值,表示 CRTC 是否正在输出。
- gamma_lut:Gamma 校正查找表,用于调整颜色输出。
- vblank:垂直消隐区间,用于同步帧切换。
- possible_planes:位掩码,表示该 CRTC 可以绑定哪些 Plane。
active 属性为 false,即使 Plane 和 Encoder 配置正确,显示器也不会收到任何信号。在 Weston 中,CRTC 的启用/禁用由合成器的输出管理策略控制。
4.3.2 Encoder(编码器)
Encoder 负责将 CRTC 输出的数字信号转换为特定物理接口所需的信号格式。常见的 Encoder 类型包括:
| 编码器类型 | 对应接口 | 说明 |
|---|---|---|
DRM_MODE_ENCODER_DAC |
VGA | 模拟信号输出 |
DRM_MODE_ENCODER_TMDS |
HDMI / DVI | 数字信号,支持音频嵌入 |
DRM_MODE_ENCODER_LVDS |
LVDS(嵌入式面板) | 低电压差分信号,常用于笔记本屏幕 |
DRM_MODE_ENCODER_DP |
DisplayPort | 高带宽数字接口,支持多流传输 |
Encoder 的关键属性 possible_crtcs 是一个位掩码,指示该 Encoder 可以连接到哪些 CRTC。例如,如果 possible_crtcs = 0x01,表示只能连接到 CRTC 0。
4.3.3 Connector(连接器)
Connector 代表物理显示接口,负责检测显示器的连接状态和读取 EDID(Extended Display Identification Data)。Connector 的主要属性包括:
- status:连接状态,取值
connected、disconnected或unknown。 - edid:显示器的 EDID 数据块,包含支持的分辨率、刷新率、物理尺寸等信息。
- link_status:链路状态,用于 DP 接口的链路训练结果。
- dpms:显示电源管理状态(On/Standby/Suspend/Off)。
- connector_type:接口类型,如
HDMI-A、DP-1、eDP-1。
modetest -M <card> 命令可以列出所有 Connector 的状态和 EDID 信息。如果 Connector 状态为 disconnected,即使硬件连接正常,Weston 也不会创建输出。
4.3.4 Plane(图层)
Plane 是 KMS 中用于硬件合成的对象。每个 Plane 可以绑定一个帧缓冲区(Framebuffer),并指定其在屏幕上的位置和尺寸。Plane 分为三种类型:
| Plane 类型 | 用途 | 典型场景 |
|---|---|---|
| Primary Plane | 主显示层,每个 CRTC 至少有一个 | 桌面背景、主应用窗口 |
| Overlay Plane | 叠加层,支持硬件缩放和颜色键 | 视频播放、画中画 |
| Cursor Plane | 硬件光标层,尺寸固定(通常 64x64) | 鼠标指针 |
Plane 的关键属性包括:
- fb_id:绑定的帧缓冲区 ID。
- crtc_id:绑定的 CRTC ID。
- src_x, src_y, src_w, src_h:源裁剪区域(16.16 定点数)。
- crtc_x, crtc_y, crtc_w, crtc_h:目标显示区域(整数像素)。
- zpos:Z 轴顺序,值越大越靠上。
4.4 对象绑定关系与约束
KMS 对象之间的绑定关系不是任意的,存在以下约束:
- CRTC ↔ Encoder:一个 CRTC 可以连接多个 Encoder(用于克隆输出),但一个 Encoder 只能连接一个 CRTC。
- Encoder ↔ Connector:一个 Encoder 通常对应一个 Connector,但某些硬件支持 Encoder 与 Connector 的多对多映射(如 DP MST)。
- CRTC ↔ Plane:一个 CRTC 可以绑定多个 Plane(主层 + 叠加层 + 光标层),但一个 Plane 只能绑定一个 CRTC。
- Connector ↔ 显示器:一个 Connector 只能连接一台显示器(除非使用 DP 多流传输)。
下面的 SVG 图展示了这些绑定关系:
4.5 实践:使用 modetest 查看 KMS 对象
在开发板上运行以下命令,可以查看当前系统的 KMS 对象拓扑:
# 列出所有 CRTC、Encoder、Connector 和 Plane
modetest -M imx-drm
# 查看特定 Connector 的 EDID 信息
modetest -M imx-drm -c
# 查看 Plane 的详细属性
modetest -M imx-drm -p
输出示例(简化):
Connectors:
id encoder status type size (mm) modes
32 31 connected HDMI-A-1 480x270 1920x1080 60.00
modes:
name refresh hdisp hss hse htot vdisp vss vse vtot)
1920x1080 60.00 1920 2008 2052 2200 1080 1084 1089 1125 flags: phsync, pvsync; type: preferred
CRTCs:
id fb pos size
30 0 (0,0) (1920x1080)
plane 0 (primary) fb 0, crtc 30, src (0,0) 1920x1080, dst (0,0) 1920x1080
Planes:
id type possible crtcs fb crtc src dst
0 Primary 0x00000001 0 30 0,0,1920x1080 0,0,1920x1080
1 Overlay 0x00000001 0 0 0,0,0x0 0,0,0x0
2 Cursor 0x00000001 0 0 0,0,0x0 0,0,0x0
possible crtcs 字段,它决定了 Plane 可以绑定到哪些 CRTC。在 Weston 中,合成器会根据这个掩码自动分配 Plane 资源。
4.6 本章小结
KMS 对象模型是显示驱动开发的核心抽象层。CRTC 控制时序,Encoder 负责信号编码,Connector 管理物理接口,Plane 实现硬件合成。理解这些对象的属性与绑定关系,是正确配置 Weston 合成器、调试显示异常的前提。在实际开发中,通过 modetest 和 drm_info 工具可以快速验证硬件拓扑,为后续的驱动移植和性能优化打下基础。