Linux瑞芯微平台DRM驱动与显示驱动优化实战 - 第1节
1.1 Linux 显示框架演进
Linux 显示子系统经历了从混乱到统一的演进过程。早期内核中显示驱动直接操作硬件寄存器,每个厂商实现各自的 ioctl 接口,用户态应用需要为不同硬件编写不同的适配层。这种碎片化架构在嵌入式设备爆发后变得不可持续。
1.1.1 演进路线
| 阶段 | 核心机制 | 代表接口 | 主要问题 |
|---|---|---|---|
| FBDEV (2.2~2.6) | 帧缓冲设备,直接映射显存 | /dev/fb0, FBIOGET_VSCREENINFO | 无硬件合成、无 VSync 控制、多屏支持弱 |
| DRM 基础 (2.6.29+) | 内核显示资源管理 + 统一 API | drmModeAddFB, drmModeSetCrtc | 仅支持基本 CRTC/Encoder/Connector 模型 |
| KMS 成熟 (3.x~4.x) | 内核模式设置,原子化提交 | DRM_IOCTL_MODE_ATOMIC | 无显式同步、无 FB 压缩/合成卸载 |
| DRM 增强 (5.x~6.x) | Writeback、Fence、DAMAGE、VRR | DRM_IOCTL_MODE_PAGE_FLIP | 嵌入式 SoC 显示 IP 适配仍碎片化 |
关键转折点:DRM 从 3.9 内核引入原子接口(Atomic Modeset),将多个显示状态更新打包为一个原子事务提交,解决了中间状态闪烁和 VSync 撕裂问题。瑞芯微从 Linux 4.4 开始全面转向 DRM/KMS 架构。
1.1.2 为什么选择 DRM/KMS
- 资源统一管理:DRM 将 CRTC、Encoder、Connector、Plane 抽象为内核对象,用户态通过
drmModeObjectGetProperties统一查询。 - 原子提交:一次
DRM_IOCTL_MODE_ATOMIC可同时设置多个 CRTC 和 Plane,硬件在 VBlank 边界一次性切换。 - Fence 同步:显式同步机制,GPU 合成与显示刷新之间不再依赖隐式
dma_buf等待。 - Writeback 连接器:将合成后的帧写回内存,用于屏幕录制、远程桌面、硬件校验。
1.2 DRM/KMS 架构简介
DRM (Direct Rendering Manager) 是 Linux 内核中负责显示输出和 GPU 管理的子系统。KMS (Kernel Mode Setting) 是 DRM 的核心组件,负责显示模式设置和帧缓冲管理。理解 DRM/KMS 的软件分层是驱动开发的基础。
1.2.1 核心对象模型
| DRM 对象 | 物理对应 | 关键属性 | 瑞芯微实现 |
|---|---|---|---|
| CRTC | 显示控制器(VOP/DPU 主通道) | timing、pixel clock、background color | rockchip_crtc 封装 VOP 时序发生器 |
| Plane | 硬件图层(Win0/Win1/Win2) | format、size、src/dst rect、z-order | rockchip_plane 管理 VOP 窗口寄存器 |
| Encoder | 显示信号编码器(RGB/LVDS/DP/eDP 发送器) | encoder type、possible crtcs | rockchip_encoder 桥接 VOP 与 PHY |
| Connector | 物理接口(HDMI/DP/MIPI DSI/eDP) | edid、dpms、link status | rockchip_connector 读取 EDID 并协商链路 |
| Bridge | 外部显示桥接芯片(LT8912/TC358775) | pre_enable、enable、mode_valid | 通过 drm_bridge 框架挂载 |
1.2.2 原子提交流程
- 用户态构造请求:调用
drmModeAtomicAlloc分配 atomic request,添加 CRTC/Plane/Connector 属性变更。 - 内核校验:
atomic_check回调检查资源冲突、带宽限制、格式兼容性。 - 硬件编程:
atomic_flush将配置写入 VOP 寄存器,等待 VBlank 信号。 - 完成通知:通过
drm_crtc_vblank_event通知用户态刷新完成。
开发提示:瑞芯微 VOP 驱动在 atomic_flush 中通过 vop_cfg_done 寄存器触发硬件更新,该寄存器必须在 VBlank 窗口内写入,否则会导致画面撕裂。建议在 vop_crtc_atomic_flush 中加 spin_lock_irqsave 保护寄存器访问。
1.3 瑞芯微显示 IP 家族概览
瑞芯微 SoC 的显示 IP 分为三大类:VOP(Video Output Processor)、DPU(Display Processing Unit)和 MIPI DSI/DP/eDP 接口控制器。不同芯片代际使用的 IP 差异较大,驱动适配策略也不同。
1.3.1 VOP 系列(主流)
| IP 版本 | 代表芯片 | 最大图层数 | 最大分辨率 | 输出接口 |
|---|---|---|---|---|
| VOPB | RK3288 | 3 Win + 1 HDR | 4K@60 | HDMI 2.0 / eDP 1.3 / MIPI DSI |
| VOPL | RK3399 | 4 Win | 4K@60 | HDMI 2.0 / DP 1.2 / MIPI DSI |
| VOP2 | RK3566/RK3568 | 4 Win + 2 AFBC | 4K@60 | HDMI 2.0 / eDP 1.3 / MIPI DSI / LVDS |
| VOP3 | RK3588 | 8 Win + 4 AFBC | 8K@60 | HDMI 2.1 / DP 1.4 / eDP 1.4 / MIPI DSI |
1.3.2 DPU 系列(高性能)
DPU 是瑞芯微面向 8K 和车载场景设计的高性能显示处理单元,首次在 RK3588 中引入。与 VOP 相比,DPU 增加了硬件图像增强模块:HDR 色调映射、缩放引擎、色彩校正矩阵、动态对比度调整。
- DPU 核心模块:Scaler、CSC(色彩空间转换)、HDR10/HLG 处理、De-interlace。
- 驱动差异:DPU 驱动使用
drm_encoder+drm_bridge组合,而非 VOP 的drm_crtc直连。 - 适用场景:8K 视频播放、多屏异显、车载仪表盘、医疗影像。
1.3.3 接口控制器
| 接口类型 | 瑞芯微实现 | 最大速率 | 典型应用 |
|---|---|---|---|
| MIPI DSI | rockchip-dsi (基于 Synopsys DW-MIPI-DSI) | 2.5 Gbps/lane | 平板、车载显示屏 |
| eDP | rockchip-edp (基于 Analogix ANX7625/DP138) | 8.1 Gbps (HBR3) | 笔记本、一体机 |
| HDMI | rockchip-hdmi (基于 Synopsys DW-HDMI) | 48 Gbps (HDMI 2.1) | 电视、显示器 |
| DP | rockchip-dp (基于 Cadence DP-TX) | 32.4 Gbps (DP 1.4) | 高端显示器、VR |
常见陷阱:RK3588 同时包含 VOP3 和 DPU,但两者不能同时用于同一个显示输出。设备树中通过 display-subsystem 节点下的 ports 绑定决定哪个 IP 驱动哪个物理接口。错误配置会导致内核崩溃或显示黑屏。
1.3.4 显示 IP 选型建议
- 低成本平板/盒子:RK3566 + VOP2 + MIPI DSI,图层数 4 足够 UI 合成。
- 高性能平板/笔记本:RK3588 + VOP3 + eDP,支持 4K@120 或 8K@60。
- 车载/工业 HMI:RK3588 + DPU + LVDS/DSI,利用 DPU 的 HDR 和色彩校正。
- 多屏异显:RK3588 支持 3 路独立显示输出,VOP3 驱动主屏,DPU 驱动副屏。