2、显示驱动基础:DRM/KMS框架介绍、CRTC/Encoder/Connector/Plane概念、RK3399 VOP模块
2.1 DRM/KMS 框架概述
DRM (Direct Rendering Manager) 是 Linux 内核中负责图形显示与渲染管理的子系统。KMS (Kernel Mode Setting) 是 DRM 的核心组件,负责将显示模式(分辨率、刷新率、像素格式等)的配置从用户空间转移到内核空间,从而提供更稳定、高效的显示输出控制。
在 RK3399 平台上,显示驱动基于 DRM/KMS 框架实现,通过标准化的接口管理显示流水线。KMS 将显示硬件抽象为四个核心对象:CRTC、Encoder、Connector 和 Plane,它们共同构成了从帧缓冲区到物理显示设备的完整数据通路。
关键概念: DRM/KMS 框架的核心优势在于统一了不同硬件平台的显示接口,使得上层应用(如 Wayland、X11)无需关心底层硬件差异,通过通用的 ioctl 或 libdrm 库即可完成显示配置。
2.2 核心概念:CRTC / Encoder / Connector / Plane
KMS 框架将显示硬件功能分解为四个逻辑组件,每个组件承担特定的职责。理解这些概念是掌握显示驱动开发的基础。
| 组件 | 英文全称 | 功能描述 | RK3399 对应硬件 |
|---|---|---|---|
| CRTC | Cathode Ray Tube Controller | 负责扫描输出、时序生成、帧缓冲读取、色彩空间转换、叠加合成 | VOP 内部的显示控制器通道(如 Win0/Win1) |
| Encoder | Encoder | 将 CRTC 输出的并行视频信号编码为特定接口协议(如 HDMI、LVDS、MIPI DSI) | RK3399 内部 HDMI TX、MIPI DSI、eDP 控制器 |
| Connector | Connector | 代表物理显示接口(HDMI 端口、DP 端口、DSI 接口),负责检测连接状态、读取 EDID | HDMI 物理端口、MIPI DSI 接口、eDP 接口 |
| Plane | Plane | 表示一个独立的图像层(Overlay),支持缩放、旋转、Alpha 混合 | VOP 的 Win0/Win1/Win2 硬件图层 |
类比理解: 可以将显示流水线想象为一场电影放映:Plane 是电影胶片(图像层),CRTC 是放映机(读取胶片并投射),Encoder 是信号转换器(将光信号转为电信号),Connector 是投影仪接口(连接屏幕)。
2.3 RK3399 VOP 模块详解
VOP (Video Output Processor) 是 Rockchip 平台的核心显示处理单元,相当于 CRTC 的硬件实现。RK3399 集成了 VOPB 和 VOPL 两个显示控制器,分别支持不同的输出能力。
2.3.1 VOP 硬件特性
| 特性 | VOPB | VOPL |
|---|---|---|
| 最大输出分辨率 | 4096x2160 (4K) | 2560x1600 (2K) |
| 支持接口 | HDMI 2.0 / eDP / DP | MIPI DSI / LVDS / RGB |
| 硬件图层 (Win) | Win0 ~ Win3 (4 层) | Win0 ~ Win1 (2 层) |
| AFBC 支持 | 支持 | 不支持 |
| HDR 处理 | 支持 HDR10 | 不支持 |
2.3.2 VOP 内部模块划分
VOP 内部由多个功能模块组成,每个模块负责显示流水线中的一个特定阶段:
- DMA 引擎 (DMA Engine):负责从系统内存(DDR)中读取帧缓冲区数据,支持 AFBC (Arm Frame Buffer Compression) 解压缩。
- 硬件图层 (Win0 ~ Win3):每个 Win 对应一个独立的 Plane,支持不同的输入格式(RGB、YUV)、缩放、位置偏移和 Alpha 混合。
- 背景层 (Background Layer):提供纯色背景,位于所有图层之下。
- 合成模块 (Blender):将多个 Win 层和背景层按照 Z-order 顺序进行 Alpha 混合,生成最终的像素数据。
- 时序控制器 (Timing Controller):根据设定的显示模式生成行同步 (HSYNC)、场同步 (VSYNC)、数据使能 (DE) 和像素时钟。
- 输出接口 (Output Interface):将并行像素数据转换为特定接口协议(RGB、LVDS、MIPI DSI 等)发送给 Encoder。
2.4 VOP 中断与 DMA 传输的关联
在显示驱动中,中断和 DMA 是保证流畅显示的关键机制:
- VSYNC 中断:VOP 在每帧扫描结束时触发 VSYNC 中断,驱动利用该中断更新帧缓冲地址、统计帧率、触发用户空间等待。
- DMA 传输完成中断:当 DMA 引擎完成一帧数据的读取后,触发中断通知驱动释放旧缓冲区或准备下一帧数据。
- 行中断 (LINE_FLAG):VOP 支持在指定行号触发中断,可用于实现分区刷新(Partial Update)或低延迟显示。
开发注意事项: 在 RK3399 上配置 VOP 中断时,必须注意中断共享和优先级问题。VOPB 和 VOPL 的中断线可能与其他外设共享,需要在设备树中正确配置 interrupt-affinity 以避免 CPU 核间中断负载不均。
2.5 设备树配置示例
在 RK3399 的设备树中,VOP 节点通常定义如下。以下是一个简化的设备树片段,展示了 VOPB 的基本配置:
vopb: vop@ff900000 {
compatible = "rockchip,rk3399-vop-big";
reg = <0x0 0xff900000 0x0 0x3efc>;
interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH 0>;
clocks = <&cru ACLK_VOP0>, <&cru DCLK_VOP0>, <&cru HCLK_VOP0>;
clock-names = "aclk_vop", "dclk_vop", "hclk_vop";
iommus = <&vopb_mmu>;
power-domains = <&power RK3399_PD_VOPB>;
rockchip,grf = <&grf>;
status = "disabled";
vopb_out: port {
#address-cells = <1>;
#size-cells = <0>;
vopb_out_hdmi: endpoint@0 {
reg = <0>;
remote-endpoint = <&hdmi_in_vopb>;
};
vopb_out_edp: endpoint@1 {
reg = <1>;
remote-endpoint = <&edp_in_vopb>;
};
};
};
关键字段说明:
interrupts:指定 VOP 的中断号(118)和触发类型(电平触发)。iommus:关联 IOMMU 节点,用于 DMA 地址转换,保障显示数据访问安全。power-domains:指定电源域,在休眠/唤醒时控制 VOP 的电源状态。port:定义输出端点,连接到对应的 Encoder(如 HDMI、eDP)。