2. DRM框架基础:核心概念与KMS组件
DRM(Direct Rendering Manager)是Linux内核中负责图形显示与GPU管理的核心框架。在SA8155平台上,DRM驱动承担着将GPU渲染结果正确输出到物理显示设备的桥梁作用。理解DRM框架的基础概念,特别是KMS(Kernel Mode Setting)机制及其四大组件——CRTC、Encoder、Connector、Plane,是进行显示属性与GPU渲染状态映射开发的前提。
2.1 DRM核心概念
DRM最初设计用于支持GPU的Direct Rendering(直接渲染),允许用户空间程序(如X Server、Wayland Compositor)绕过X协议直接访问GPU硬件。随着发展,DRM演变为一个统一的图形显示框架,包含以下核心概念:
| 概念 | 说明 | SA8155中的对应 |
|---|---|---|
| DRM Device | 代表一个显示设备节点(/dev/dri/card0) | MDSS(Mobile Display Subsystem)设备 |
| DRM File | 用户空间打开DRM设备后获得的文件描述符 | 每个Compositor进程持有独立的DRM FD |
| DRM Client | 使用DRM API的用户空间程序 | SurfaceFlinger、Weston等 |
| DRM Object | 框架中的可操作实体,包括CRTC、Encoder等 | 通过DRM IOCTL进行属性查询与设置 |
| DRM Property | DRM Object的属性,如分辨率、旋转、缩放 | 用于映射GPU渲染状态到显示配置 |
| FB(Framebuffer) | 内存中的像素数据缓冲区,由GEM对象管理 | GPU渲染完成后提交FB到显示流水线 |
DRM框架通过一组标准IOCTL接口向用户空间暴露功能,核心IOCTL包括:
DRM_IOCTL_MODE_GETRESOURCES:获取当前显示资源列表(CRTC、Encoder、Connector等)DRM_IOCTL_MODE_SETCRTC:设置CRTC的显示模式与帧缓冲DRM_IOCTL_MODE_ADDFB/RM_FB:添加/移除帧缓冲DRM_IOCTL_MODE_PAGE_FLIP:请求下一次VBlank时切换帧缓冲DRM_IOCTL_MODE_ATOMIC:原子提交多个显示属性变更
2.2 KMS(Kernel Mode Setting)的作用
KMS是DRM框架中负责显示模式设置与管理的子系统。在早期的Linux图形栈中,模式设置由用户空间的X Server完成,这导致了启动闪烁、VT切换困难等问题。KMS将模式设置移入内核,带来以下核心优势:
- 无闪烁启动:内核在启动早期即可设置正确的显示模式,避免从BIOS/UEFI模式到用户空间模式的切换闪烁。
- VT(虚拟终端)无缝切换:KMS保证在Ctrl+Alt+F1~F7切换时,显示模式保持稳定。
- 电源管理集成:KMS与内核PM框架结合,支持DPMS(Display Power Management Signaling)和挂起/恢复。
- 原子模式设置:通过Atomic API,KMS支持一次性提交多个显示属性的变更,避免中间状态导致的画面撕裂。
- 硬件抽象:KMS为不同厂商的显示控制器提供统一接口,用户空间无需关心具体硬件差异。
KMS在SA8155平台上的典型工作流程如下:
用户空间(Compositor)
│
├── drmModeGetResources() // 获取显示资源
├── drmModeGetConnector() // 获取连接器状态(EDID、物理连接)
├── drmModeGetEncoder() // 获取编码器能力
├── drmModeCreatePropertyBlob() // 创建属性块(如色彩模式)
├── drmModeAtomicCommit() // 原子提交显示配置
│
▼
内核空间(KMS驱动)
│
├── drm_atomic_state_alloc() // 分配原子状态对象
├── drm_atomic_set_crtc_for_connector() // 关联CRTC与Connector
├── drm_atomic_add_affected_planes() // 添加受影响的Plane
├── drm_atomic_commit() // 提交并应用配置
│
▼
硬件层(SA8155 DPU)
│
├── DPU_CRTC_vblank_handler() // VBlank中断处理
├── DPU_Encoder_mode_set() // 编码器模式配置
├── DPU_Connector_get_modes() // 获取EDID模式列表
├── DPU_Plane_atomic_update() // 更新图层硬件寄存器
└── DPU_Mixer_blend() // 硬件混合输出
2.3 CRTC / Encoder / Connector / Plane 四大组件
KMS将显示硬件抽象为四个核心组件,它们共同构成一条完整的显示流水线。下图展示了SA8155平台上四大组件的典型连接关系:
2.3.1 CRTC(Cathode Ray Tube Controller)
CRTC是显示流水线的核心时序控制器,负责生成像素时钟、行同步、场同步等显示时序信号。在SA8155的DPU中,CRTC对应Mixer和Timing Controller硬件模块。
CRTC的核心职责:
- 模式设置:配置分辨率(如1920x1080)、刷新率(60Hz)、像素时钟频率。
- VBlank管理:在每帧扫描结束后产生VBlank中断,用于帧同步和Page Flip。
- 色彩管理:应用全局色彩校正矩阵(CTM)、Gamma LUT。
- 背景色设置:定义扫描区域的背景颜色和边界。
- 扫描输出:将混合后的像素数据按时序发送给Encoder。
SA8155 CRTC关键属性(通过DRM Property暴露):
| 属性名 | 类型 | 说明 |
|---|---|---|
mode_id |
BLOB | 显示模式(分辨率、刷新率等) |
active |
ENUM | CRTC是否启用 |
vblank_enabled |
BOOL | 是否使能VBlank中断 |
ctm |
BLOB | 色彩变换矩阵(用于HDR/SDR转换) |
gamma_lut |
BLOB | Gamma校正查找表 |
out_fence_ptr |
UINT64 | 输出同步Fence(GPU渲染同步) |
2.3.2 Encoder(编码器)
Encoder负责将CRTC输出的并行像素数据转换为特定显示接口所需的串行信号格式。在SA8155上,Encoder对应DPU_ENC模块,支持DSI、DP、eDP等接口协议。
Encoder的核心职责:
- 协议转换:将RGB并行数据编码为DSI包或DP差分信号。
- 时钟管理:生成与像素时钟同步的链路时钟。
- 链路训练:在DP/eDP接口上执行链路训练,协商带宽和通道数。
- 数据对齐:确保多通道传输时的数据对齐。
- 错误检测:监测链路错误并报告。
SA8155 Encoder类型:
| Encoder类型 | 接口 | 典型用途 | 最大分辨率 |
|---|---|---|---|
DRM_MODE_ENCODER_DSI |
MIPI DSI | 车载显示屏(仪表盘、中控) | 1920x1080@60fps |
DRM_MODE_ENCODER_DP |
DisplayPort | 外部显示器、HUD | 3840x2160@60fps |
DRM_MODE_ENCODER_eDP |
嵌入式DP | 内置面板(仪表盘) | 1920x720@60fps |
2.3.3 Connector(连接器)
Connector代表物理显示接口,负责管理显示设备的连接状态和显示能力。在SA8155上,Connector对应DPU的DSI PHY、DP PHY等物理层模块。
Connector的核心职责:
- 热插拔检测(HPD):监测显示设备的物理连接状态。
- EDID读取:通过I2C或AUX通道读取显示器的EDID数据,获取支持的分辨率列表。
- 模式列表生成:根据EDID和硬件能力生成可用的显示模式列表。
- DPMS控制:管理显示器的电源状态(On/Standby/Suspend/Off)。
- 物理属性:报告连接类型、子连接器类型、物理尺寸等。
SA8155 Connector关键属性:
| 属性名 | 类型 | 说明 |
|---|---|---|
EDID |
BLOB | 显示器的EDID原始数据 |
DPMS |
ENUM | 电源管理状态 |
link_status |
ENUM | DP链路状态(Good/Bad) |
non_desktop |
BOOL | 是否为非桌面设备(如VR头显) |
hdr_output_metadata |
BLOB | HDR元数据(SMPTE ST 2086) |
2.3.4 Plane(图层/平面)
Plane是显示流水线中的独立图层,每个Plane可以绑定一个帧缓冲,并支持独立的缩放、旋转、裁剪和色彩处理。在SA8155的DPU中,Plane对应SSPP(Source Surface Processor)硬件模块。
Plane的核心职责:
- 帧缓冲绑定:将GPU渲染完成的Framebuffer绑定到Plane。
- 几何变换:支持源裁剪(src_x, src_y, src_w, src_h)和目标位置(crtc_x, crtc_y, crtc_w, crtc_h)。
- 旋转/镜像:支持0°/90°/180°/270°旋转和水平/垂直镜像。
- Alpha混合:配置全局Alpha值和像素Alpha模式。
- 色彩空间转换:将输入色彩空间(如BT.709)转换为输出色彩空间(如BT.2020)。
- Z-order排序:多个Plane叠加时,通过Z-order决定前后顺序。
SA8155 Plane类型:
| Plane类型 | 数量 | 用途 | 典型格式 |
|---|---|---|---|
DRM_PLANE_TYPE_PRIMARY |
1 | 主图层(桌面/UI背景) | ARGB8888, XRGB8888 |
DRM_PLANE_TYPE_OVERLAY |
0~7 | 叠加图层(视频、导航、弹窗) | NV12, P010, ARGB8888 |
DRM_PLANE_TYPE_CURSOR |
1 | 硬件光标 | ARGB8888(64x64) |
SA8155 Plane关键属性(用于GPU渲染状态映射):
| 属性名 | 类型 | 说明 | GPU映射用途 |
|---|---|---|---|
FB_ID |
UINT32 | 绑定的帧缓冲ID | GPU渲染完成后的输出目标 |
src_x/y/w/h |
UINT32 | 源裁剪区域(16.16固定点) | GPU渲染视口映射 |
crtc_x/y/w/h |
INT32 | 目标显示区域 | GPU渲染输出位置 |
rotation |
BITMASK | 旋转/镜像配置 | GPU渲染方向同步 |
alpha |
UINT16 | 全局Alpha值(0~65535) | GPU渲染透明度 |
pixel_blend_mode |
ENUM | 混合模式(None/Pre-multiplied/Coverage) | GPU渲染混合策略 |
color_encoding |
ENUM | 色彩编码(BT.601/BT.709/BT.2020) | GPU色彩空间输出 |
color_range |
ENUM | 色彩范围(Limited/Full) | GPU量化范围 |
in_fence_fd |
INT | 输入同步Fence FD | GPU渲染完成信号 |
color_encoding、color_range和Connector的hdr_output_metadata属性传递给KMS。这些属性在Atomic Commit时一次性提交,确保显示硬件与GPU渲染状态完全同步。
2.4 四大组件协同工作流程
在SA8155平台上,一次完整的显示帧提交涉及四大组件的协同工作。下图展示了从GPU渲染完成到画面显示的全流程:
2.5 四大组件在SA8155上的硬件映射
理解DRM组件与SA8155硬件模块的对应关系,是进行驱动开发和调试的基础。下表总结了四大组件在SA8155 DPU中的具体硬件实现:
| DRM组件 | SA8155硬件模块 | 数量 | 关键寄存器区域 | 驱动文件 |
|---|---|---|---|---|