3、CRTC与Plane:CRTC功能与数据结构、Plane类型与属性、硬件管道映射

CRTC(Cathode Ray Tube Controller,阴极射线管控制器)与 Plane(图层)是 DRM/KMS 子系统中构成显示管线的核心硬件抽象层。CRTC 负责生成像素时序与 VBlank 中断,Plane 负责将 Framebuffer 内容按 Z-order 合成并送入 CRTC。理解两者的数据结构、功能划分及硬件管道映射关系,是调试 HDR 元数据传递与 VBlank 同步的基础。

核心概念:CRTC 是“时序引擎”,Plane 是“图层合成器”。在 HDR 场景下,CRTC 负责输出 HDR 元数据包(如 Static Metadata),Plane 负责承载 HDR 色彩空间转换(CSC)与 PQ/HLG 曲线映射。

3.1 CRTC 功能与数据结构

CRTC 在 DRM 中对应 drm_crtc 结构体,其核心职责包括:

  • 时序生成:根据 drm_display_mode 生成行/场同步信号、前后肩、消隐区间。
  • VBlank 管理:在垂直消隐期触发中断,驱动通过 drm_crtc_vblank_get/put 管理计数。
  • 色彩管理:支持 GAMMA_LUT、CTM(Color Transformation Matrix)及 HDR 元数据属性。
  • 扫描输出:从 Plane 合成结果读取像素数据,按时序发送到 Encoder。
drm_crtc 核心字段与 HDR/VBlank 关联
字段类型HDR/VBlank 关联
devstruct drm_device *所属 DRM 设备
primarystruct drm_plane *主图层,HDR 帧缓冲区通常绑定于此
cursorstruct drm_plane *光标图层,不参与 HDR 合成
statestruct drm_crtc_state *包含 mode、gamma_lut、ctm、hdr_metadata 等
vblank_countatomic_tVBlank 事件计数,用于同步提交
funcs->enable_vblank回调硬件使能 VBlank 中断
HDR 元数据挂载点:在 drm_crtc_state 中,hdr_output_metadata 字段(类型 struct drm_property_blob *)存储 HDR Static Metadata(如 SMPTE ST 2086 色度/亮度参数)。用户态通过 DRM_MODE_ATOMIC 提交时附带该属性。
CRTC 内部数据流与 VBlank 同步 drm_crtc Timing Generator VBlank IRQ Handler HDR Metadata Blob VBlank 同步流程: 1. Timing Generator 产生 VSync 信号 → 2. VBlank IRQ Handler 调用 drm_crtc_handle_vblank() 3. 用户态等待 VBlank 事件 → 4. 在 VBlank 期间提交 HDR 元数据更新

3.2 Plane 类型与属性

DRM 定义三种 Plane 类型,每种类型在 HDR 管线中承担不同角色:

Plane 类型对比与 HDR 职责
类型枚举值数量限制HDR 相关职责
PrimaryDRM_PLANE_TYPE_PRIMARY每个 CRTC 至少 1 个承载 HDR 主帧缓冲区,支持 COLOR_ENCODING、COLOR_RANGE 属性
OverlayDRM_PLANE_TYPE_OVERLAY0 或多个HDR 叠加层(如字幕、UI),需独立色彩空间转换
CursorDRM_PLANE_TYPE_CURSOR每个 CRTC 最多 1 个通常不参与 HDR,使用固定 ARGB8888 格式

Plane 的关键属性(通过 drm_plane_state 传递):

  • crtc:绑定的 CRTC,决定 Plane 输出到哪个显示管道。
  • fb:关联的 Framebuffer,包含像素数据与格式。
  • src_x/src_y/src_w/src_h:源裁剪区域(16.16 定点数)。
  • crtc_x/crtc_y/crtc_w/crtc_h:目标显示位置。
  • color_encoding / color_range:色彩编码(BT.709/BT.2020)与量化范围(limited/full)。
  • zpos:Z-order 排序,值越小越靠近背景。
HDR 调试陷阱:Overlay Plane 的 color_encoding 若与 Primary Plane 不一致(如 Primary 使用 BT.2020,Overlay 使用 BT.709),会导致合成后色彩异常。必须确保所有参与 HDR 合成的 Plane 使用相同的色彩空间。
Plane 类型与 Z-order 合成层级 Primary Plane (HDR Main Content, BT.2020 PQ) Overlay Plane (HDR Subtitle, BT.2020 PQ) Cursor Plane (SDR, ARGB8888) CRTC 合成输出 Z=0 Z=1 Z=2

3.3 硬件管道映射

硬件管道映射是指将 DRM 的 CRTC、Plane、Encoder、Connector 抽象层与实际 SoC 显示控制器硬件单元对应起来。不同厂商的映射策略差异较大:

常见 SoC 硬件管道映射策略
厂商硬件单元DRM 映射方式HDR 特殊处理
RockchipVOP (Video Output Processor)1 个 VOP = 1 个 CRTC + 多个 Plane(Win0-Win4)Win2 支持 HDR10 元数据注入
AllwinnerDE2/DE3 (Display Engine)1 个 Mixer = 1 个 CRTC + 4 个 UI/Video PlaneDE3 支持 HDR CSC 矩阵
MediatekDDP (Display Data Path)多个 OVL 模块映射为独立 Plane,CRTC 为 DISP_REGOVL_LAYER 支持 BT.2020 色彩格式
i.MX8DCSS (Display Controller Subsystem)1 个 CRTC + 1 个 Primary + 1 个 OverlayHDR10+ 动态元数据通过 DP 接口传递

映射关系在驱动初始化时通过 drm_crtc_init_with_planes() 建立,关键代码模式如下:

// 驱动 probe 阶段:创建 CRTC 并绑定 Primary 和 Cursor Plane
struct drm_plane *primary = rockchip_plane_create(drm_dev, ROCKCHIP_VOP_WIN0);
struct drm_plane *cursor  = rockchip_plane_create(drm_dev, ROCKCHIP_VOP_WIN1);

drm_crtc_init_with_planes(drm_dev, crtc, primary, cursor, &rockchip_crtc_funcs, NULL);

// 设置 CRTC 的 HDR 属性(如 HDR_OUTPUT_METADATA)
drm_crtc_attach_hdr_metadata_property(crtc);

// 硬件管道映射:将 CRTC 的 vblank 回调注册到 VOP 硬件中断
crtc->funcs->enable_vblank = rockchip_vop_enable_vblank;
crtc->funcs->disable_vblank = rockchip_vop_disable_vblank;
管道映射调试要点:使用 cat /sys/kernel/debug/dri/0/crtc-0/state 查看当前 CRTC 绑定的 Plane 列表;检查 plane_mask 字段确认硬件管道是否按预期连接。若 HDR 元数据未生效,优先验证 CRTC 的 hdr_output_metadata blob 是否已正确传递到硬件寄存器。
DRM 抽象层到 Rockchip VOP 硬件管道映射 drm_plane (Win0) drm_plane (Win1) drm_plane (Win2) drm_crtc (VOP) VOP Win0 寄存器 VOP Win1 寄存器 VOP Win2 寄存器 VOP 时序/中断寄存器 映射关键点: • drm_plane 的 funcs->atomic_update 回调直接写 VOP Win 寄存器(如 DMA 地址、缩放系数、HDR CSC 系数) • drm_crtc 的 funcs->enable_vblank 回调使能 VOP 的帧中断,用于 VBlank 同步

3.4 原子提交与管道一致性

在 HDR 场景下,CRTC 与 Plane 的配置必须通过 Atomic Commit 一次性提交,以保证管道状态一致性。关键流程:

  1. 用户态构造 drm_mode_atomic 请求,包含 CRTC 的 hdr_output_metadata 属性与 Plane 的 color_encoding 属性。
  2. 内核驱动在 atomic_check 阶段验证所有 Plane 的色彩空间是否与 CRTC 的 HDR 模式兼容。
  3. 在 VBlank 期间执行 atomic_commit,通过 drm_crtc_vblank_get 确保硬件更新发生在消隐区间。
  4. 硬件寄存器一次性更新,避免撕裂(tearing)或色彩闪烁。
调试命令:使用 modetest -M rockchip -a 查看当前 CRTC 与 Plane 的原子状态;使用 drm_info 工具检查 hdr_output_metadata blob 内容是否包含正确的 SMPTE ST 2086 数据。