4. KMS 对象模型详解:CRTC、Encoder、Connector、Plane 的属性与关系

KMS(Kernel Mode Setting)是 Linux 内核中负责显示模式设置和缓冲区管理的核心框架。它通过四个基本对象——CRTC、Encoder、Connector 和 Plane——来抽象物理显示硬件。理解这些对象的属性及其相互关系,是配置 Weston 合成器、调试显示驱动的基础。

核心概念: KMS 对象模型遵循“数据流”与“控制流”分离的设计。数据流(像素数据)通过 Plane → CRTC → Encoder → Connector 流向显示器;控制流(模式设置、状态查询)则通过 DRM 接口操作这些对象的属性。

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
关键点: 在 Weston 中,每个输出(Output)对应一个 CRTC + Encoder + Connector 的组合。Plane 则用于实现硬件合成,减少 GPU 的合成负载。

4.2 对象关系与数据流

四个对象之间的连接关系构成了完整的显示数据通路。下图展示了典型的 KMS 对象拓扑:

KMS 对象关系与数据流图 KMS 对象关系与数据流 Plane 帧缓冲区管理 CRTC 时序控制 Encoder 信号编码 Connector 物理接口 显示器 像素数据 数字信号 编码后信号 物理连接 说明 一个 CRTC 可连接多个 Plane;一个 Encoder 只能 连接一个 CRTC。
数据流方向: 应用程序 → Plane(叠加) → CRTC(时序) → Encoder(编码) → Connector(接口) → 显示器。Weston 合成器通过 atomic commit 一次性提交整个管道(pipeline)的状态变更。

4.3 各对象属性详解

4.3.1 CRTC(显示控制器)

CRTC 是 KMS 的核心时序引擎。它负责生成行同步(HSYNC)、场同步(VSYNC)和像素时钟,并控制扫描输出的起始位置与尺寸。CRTC 的主要属性包括:

  • mode:当前显示模式(分辨率、刷新率、时钟参数),通过 drmModeGetCrtc() 获取。
  • active:布尔值,表示 CRTC 是否正在输出。
  • gamma_lut:Gamma 校正查找表,用于调整颜色输出。
  • vblank:垂直消隐区间,用于同步帧切换。
  • possible_planes:位掩码,表示该 CRTC 可以绑定哪些 Plane。
常见问题: 如果 CRTC 的 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 对象之间的绑定关系不是任意的,存在以下约束:

  1. CRTC ↔ Encoder:一个 CRTC 可以连接多个 Encoder(用于克隆输出),但一个 Encoder 只能连接一个 CRTC。
  2. Encoder ↔ Connector:一个 Encoder 通常对应一个 Connector,但某些硬件支持 Encoder 与 Connector 的多对多映射(如 DP MST)。
  3. CRTC ↔ Plane:一个 CRTC 可以绑定多个 Plane(主层 + 叠加层 + 光标层),但一个 Plane 只能绑定一个 CRTC。
  4. Connector ↔ 显示器:一个 Connector 只能连接一台显示器(除非使用 DP 多流传输)。

下面的 SVG 图展示了这些绑定关系:

KMS 对象绑定关系图 KMS 对象绑定关系与约束 CRTC 0 CRTC 1 Encoder 0 Encoder 1 Connector 0 Connector 1 显示器 A 显示器 B 约束规则 每个 Encoder 只能连接一个 CRTC

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 工具可以快速验证硬件拓扑,为后续的驱动移植和性能优化打下基础。