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。
| 字段 | 类型 | HDR/VBlank 关联 |
|---|---|---|
dev | struct drm_device * | 所属 DRM 设备 |
primary | struct drm_plane * | 主图层,HDR 帧缓冲区通常绑定于此 |
cursor | struct drm_plane * | 光标图层,不参与 HDR 合成 |
state | struct drm_crtc_state * | 包含 mode、gamma_lut、ctm、hdr_metadata 等 |
vblank_count | atomic_t | VBlank 事件计数,用于同步提交 |
funcs->enable_vblank | 回调 | 硬件使能 VBlank 中断 |
HDR 元数据挂载点:在
drm_crtc_state 中,hdr_output_metadata 字段(类型 struct drm_property_blob *)存储 HDR Static Metadata(如 SMPTE ST 2086 色度/亮度参数)。用户态通过 DRM_MODE_ATOMIC 提交时附带该属性。
3.2 Plane 类型与属性
DRM 定义三种 Plane 类型,每种类型在 HDR 管线中承担不同角色:
| 类型 | 枚举值 | 数量限制 | HDR 相关职责 |
|---|---|---|---|
| Primary | DRM_PLANE_TYPE_PRIMARY | 每个 CRTC 至少 1 个 | 承载 HDR 主帧缓冲区,支持 COLOR_ENCODING、COLOR_RANGE 属性 |
| Overlay | DRM_PLANE_TYPE_OVERLAY | 0 或多个 | HDR 叠加层(如字幕、UI),需独立色彩空间转换 |
| Cursor | DRM_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 使用相同的色彩空间。
3.3 硬件管道映射
硬件管道映射是指将 DRM 的 CRTC、Plane、Encoder、Connector 抽象层与实际 SoC 显示控制器硬件单元对应起来。不同厂商的映射策略差异较大:
| 厂商 | 硬件单元 | DRM 映射方式 | HDR 特殊处理 |
|---|---|---|---|
| Rockchip | VOP (Video Output Processor) | 1 个 VOP = 1 个 CRTC + 多个 Plane(Win0-Win4) | Win2 支持 HDR10 元数据注入 |
| Allwinner | DE2/DE3 (Display Engine) | 1 个 Mixer = 1 个 CRTC + 4 个 UI/Video Plane | DE3 支持 HDR CSC 矩阵 |
| Mediatek | DDP (Display Data Path) | 多个 OVL 模块映射为独立 Plane,CRTC 为 DISP_REG | OVL_LAYER 支持 BT.2020 色彩格式 |
| i.MX8 | DCSS (Display Controller Subsystem) | 1 个 CRTC + 1 个 Primary + 1 个 Overlay | HDR10+ 动态元数据通过 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 是否已正确传递到硬件寄存器。
3.4 原子提交与管道一致性
在 HDR 场景下,CRTC 与 Plane 的配置必须通过 Atomic Commit 一次性提交,以保证管道状态一致性。关键流程:
- 用户态构造
drm_mode_atomic请求,包含 CRTC 的hdr_output_metadata属性与 Plane 的color_encoding属性。 - 内核驱动在
atomic_check阶段验证所有 Plane 的色彩空间是否与 CRTC 的 HDR 模式兼容。 - 在 VBlank 期间执行
atomic_commit,通过drm_crtc_vblank_get确保硬件更新发生在消隐区间。 - 硬件寄存器一次性更新,避免撕裂(tearing)或色彩闪烁。
调试命令:使用
modetest -M rockchip -a 查看当前 CRTC 与 Plane 的原子状态;使用 drm_info 工具检查 hdr_output_metadata blob 内容是否包含正确的 SMPTE ST 2086 数据。