3. DRM框架核心概念:CRTC、Encoder、Connector、Plane、Framebuffer、Property的概念与关系
DRM(Direct Rendering Manager)是Linux内核中负责图形显示输出的核心框架。在SA8155平台上,HDR显示链路的建立与调试,本质上是对DRM框架中各个核心对象进行配置与协同的过程。理解CRTC、Encoder、Connector、Plane、Framebuffer、Property这六大核心概念及其关系,是掌握DRM/KMS调试的基础。
3.1 六大核心概念速览
下表从职责、硬件映射、HDR相关要点三个维度,快速建立对每个对象的初步认知:
| 概念 | 职责 | 硬件映射(SA8155) | HDR关键点 |
|---|---|---|---|
| CRTC | 显示控制器,负责扫描输出、时序生成、色彩空间转换 | Qualcomm MDSS中的显示控制器(Display Controller) | HDR元数据注入、色彩空间转换矩阵(CSC)、PQ/EOTF曲线 |
| Encoder | 编码器,将CRTC输出的像素数据编码为特定接口协议 | DSI/DP/eDP发送器(如Qualcomm DSI0/DSI1) | HDR Infoframe封装、动态元数据(如DSC)传输 |
| Connector | 物理连接器,代表显示面板或外部显示设备 | DSI接口(内置屏)、DP接口(外接屏) | EDID解析、HDR静态元数据(如SMPTE ST 2086)读取 |
| Plane | 硬件图层,负责合成与混合,每个Plane可承载一个Framebuffer | Qualcomm MDP(Mobile Display Processor)中的图层管道 | HDR与SDR图层混合、PQ线性化、色调映射 |
| Framebuffer | 内存中的帧缓冲区,存储像素数据 | ION/DMA-BUF分配的内存块 | HDR像素格式(如FP16、A2BGR10)、HDR元数据附加 |
| Property | 动态属性,用于扩展对象能力,无需修改内核接口 | DRM对象上的属性链表 | HDR输出模式、色彩空间、亮度范围、动态元数据属性 |
3.2 核心关系:显示数据流与对象拓扑
DRM/KMS的显示数据流遵循一个固定的管道模型:Framebuffer → Plane → CRTC → Encoder → Connector → 显示设备。每个对象在管道中承担特定的处理阶段。
下面的SVG图展示了SA8155平台上典型的双屏显示拓扑(内置屏 + 外接DP屏)中,各DRM对象之间的连接关系:
3.3 各对象深度解析
3.3.1 CRTC(显示控制器)
CRTC是显示管线的核心调度器,负责从内存中读取像素数据、生成显示时序、执行色彩空间转换,并将最终像素流发送给Encoder。在SA8155平台上,CRTC对应Qualcomm MDSS中的Display Controller IP。
CRTC的关键职责包括:
- 时序生成: 根据显示模式(如1080p60、4K60)生成Hsync、Vsync、DE等时序信号。
- 色彩空间转换(CSC): 将Plane输出的像素从线性RGB转换为目标色彩空间(如BT.2020、DCI-P3)。
- HDR元数据注入: 在消隐区插入HDR静态元数据(如SMPTE ST 2086)或动态元数据(如Dolby Vision RPU)。
- Gamma/LUT校正: 应用PQ(ST 2084)或HLG EOTF曲线,将线性光信号转换为电信号。
3.3.2 Encoder(编码器)
Encoder负责将CRTC输出的并行像素数据编码为特定显示接口的串行协议。在SA8155平台上,常见的Encoder类型包括:
- DSI Encoder: 用于内置MIPI DSI接口的显示屏,支持DSC(显示流压缩)编码。
- DP Encoder: 用于外接DisplayPort接口,支持HBR3(高比特率3)和DSC。
- eDP Encoder: 用于嵌入式DisplayPort,常见于车载仪表盘。
Encoder在HDR链路中的关键作用是封装HDR Infoframe。对于HDMI/DP接口,HDR元数据通过Infoframe数据包在消隐区传输。Encoder必须正确配置Infoframe的Type(如HDR10、Dolby Vision)和内容。
3.3.3 Connector(连接器)
Connector代表物理显示接口和连接的显示设备。它是DRM框架中与外部世界交互的边界。每个Connector通常关联一个Encoder,并通过Property暴露显示设备的能力。
Connector在HDR调试中的核心作用:
- EDID解析: 读取显示设备的EDID(扩展显示标识数据),获取其HDR能力(如HDR10、Dolby Vision、色彩空间、亮度范围)。
- HDR静态元数据属性: 通过
HDR_OUTPUT_METADATA属性传递SMPTE ST 2086元数据(包括主色度、白点、最大/最小亮度)。 - 连接状态检测: 通过
CRTC_ID属性绑定到CRTC,实现热插拔检测。
// 通过DRM原子API设置Connector的HDR元数据示例
struct drm_mode_hdr_metadata hdr_meta = {
.display_primaries = {
{ 0.680, 0.320 }, // R
{ 0.265, 0.690 }, // G
{ 0.150, 0.060 } // B
},
.white_point = { 0.3127, 0.3290 },
.max_display_mastering_luminance = 1000, // 1000 cd/m²
.min_display_mastering_luminance = 50, // 0.005 cd/m²
.max_content_light_level = 1000,
.max_frame_average_light_level = 400
};
// 将元数据附加到Connector的HDR_OUTPUT_METADATA属性
drmModeAtomicSetProperty(atomic_req, connector_id,
prop_hdr_metadata_id,
(uint64_t)&hdr_meta);
3.3.4 Plane(硬件图层)
Plane是DRM框架中实现硬件图层合成的抽象。每个Plane对应一个独立的硬件图层管道,可以承载一个Framebuffer,并支持独立的缩放、裁剪、旋转和色彩处理。在SA8155的MDP中,通常有4-8个硬件图层。
Plane在HDR显示中的关键角色:
- HDR/SDR混合: 当HDR内容(如视频)与SDR内容(如UI)同时显示时,Plane负责在PQ域或线性域中进行混合,避免SDR内容过曝。
- 色彩空间转换: 每个Plane可以独立配置输入色彩空间(如sRGB、BT.2020),由MDP的CSC模块处理。
- Alpha混合: 支持逐像素Alpha混合,用于画中画、字幕叠加等场景。
3.3.5 Framebuffer(帧缓冲区)
Framebuffer是DRM框架中最底层的对象,代表一块内存区域,存储了要显示的像素数据。Framebuffer的格式、大小、修饰符(modifier)决定了Plane如何解析内存中的像素。
HDR相关的Framebuffer格式:
| 格式 | 描述 | 位深 | SA8155支持 |
|---|---|---|---|
DRM_FORMAT_XRGB2101010 |
10位RGB,无Alpha | 30 bpp | 是 |
DRM_FORMAT_ARGB2101010 |
10位RGB,2位Alpha | 32 bpp | 是 |
DRM_FORMAT_XBGR2101010 |
10位BGR,无Alpha | 30 bpp | 是 |
DRM_FORMAT_ABGR16161616F |
16位浮点RGBA(FP16) | 64 bpp | 是(需MDP支持) |
DRM_FORMAT_ABGR16161616 |
16位整数RGBA | 64 bpp | 是(需MDP支持) |
// 创建一个10位HDR Framebuffer的示例
struct drm_mode_fb_cmd2 fb_cmd = {
.width = 1920,
.height = 1080,
.pixel_format = DRM_FORMAT_XRGB2101010,
.handles = { dma_buf_fd },
.pitches = { 1920 * 4 }, // 10位格式每像素4字节
.modifier = DRM_FORMAT_MOD_LINEAR
};
int fb_id = drmModeAddFB2(drm_fd, &fb_cmd);
3.3.6 Property(动态属性)
Property是DRM框架中最灵活的概念,它允许在不修改内核接口的情况下,为任何DRM对象(CRTC、Encoder、Connector、Plane、Framebuffer)添加动态配置能力。每个Property都有一个唯一的ID、名称、类型和值。
HDR调试中常用的Property:
| Property名称 | 附着对象 | 类型 | HDR用途 |
|---|---|---|---|
HDR_OUTPUT_METADATA |
Connector | Blob | 传递SMPTE ST 2086静态元数据 |
Colorspace |
Connector | Enum | 设置输出色彩空间(BT.709、BT.2020、DCI-P3) |
max_bpc |
Connector | Range | 设置最大位深(8、10、12 bpc) |
HDR_MODE |
CRTC | Enum | 启用/禁用HDR处理管线(Qualcomm私有) |
PQ_LUT |
CRTC | Blob | 自定义PQ EOTF查找表(Qualcomm私有) |
alpha |
Plane | Range | 全局Alpha混合值 |
FB_ID |
Plane | Object | 绑定Framebuffer到Plane |
modetest -p命令可以列出所有DRM对象的Property及其当前值。在SA8155上,重点关注Connector的HDR_OUTPUT_METADATA和CRTC的HDR_MODE属性,这两个是HDR调试的入口点。
3.4 对象关系总结:原子提交中的数据流
在DRM原子API中,一次显示更新通过一个drmModeAtomicCommit调用完成。下面的SVG图展示了原子提交过程中,各对象之间的数据依赖关系:
3.5 常见调试场景与对象关系
下表总结了SA8155 HDR调试中常见的场景,以及需要关注的核心对象和Property:
| 调试场景 | 核心对象 | 关键Property | 典型问题 |
|---|---|---|---|
| HDR10输出不生效 | Connector、CRTC | HDR_OUTPUT_METADATA、Colorspace |
元数据格式错误、EDID未声明HDR支持 |
| HDR与SDR混合色彩失真 | Plane、CRTC | HDR_MODE、alpha |
Plane未启用HDR Composition模式 |
| 外接DP屏无显示 | Connector、Encoder | CRTC_ID、link_status |
Encoder与Connector绑定错误、DP链路训练失败 |
| 10位色深未生效 | Connector、Framebuffer | max_bpc、pixel_format |
Framebuffer格式为8位、Connector的max_bpc未设置 |
| 动态元数据(Dolby Vision)不传输 | Encoder、Connector | HDR_OUTPUT_METADATA(动态类型) |
Encoder不支持动态元数据Infoframe |