3. 显示驱动框架:Linux DRM/KMS框架、VOP模块、MIPI DSI控制器
RK3588 的 MIPI DSI 显示驱动移植,本质上是将硬件模块挂接到 Linux 标准显示框架中。本章深入剖析三层核心架构:DRM/KMS 框架(内核显示管理层)、VOP 模块(视频输出处理器)和 MIPI DSI 控制器(物理链路层)。理解这三层之间的数据流与控制流,是成功移植屏幕的基础。
3.1 整体架构概览
RK3588 显示驱动采用分层设计,从用户态到硬件依次为:
- 用户空间:应用程序通过 DRM 接口(libdrm)提交 framebuffer,发起 modeset 或 page flip。
- DRM Core:管理资源(CRTC、Encoder、Connector、Plane),调度 atomic 更新。
- VOP (Video Output Processor):RK3588 的 CRTC 实现,负责图层合成、缩放、时序生成。
- MIPI DSI 控制器:作为 Encoder 或 Bridge,将 VOP 输出的并行数据串行化为 MIPI DPHY 差分信号。
- DSI Panel:通过 DCS 命令或 Video Mode 驱动物理屏幕。
关键概念:DRM/KMS 框架中的 CRTC 对应 VOP,Encoder 对应 DSI 控制器,Connector 对应 DSI 接口与 Panel 的组合。
3.2 DRM/KMS 框架核心概念
DRM (Direct Rendering Manager) 与 KMS (Kernel Mode Setting) 是 Linux 显示驱动的标准框架。RK3588 使用 atomic modeset 接口,确保显示状态切换无撕裂。
| DRM 组件 | RK3588 对应实现 | 功能描述 |
|---|---|---|
| CRTC | VOP (vop2) | 生成显示时序,管理图层混合与输出时钟 |
| Encoder | MIPI DSI 控制器 (dw-mipi-dsi2) | 将 VOP 并行数据编码为 MIPI DSI 协议包 |
| Connector | DSI 接口 + Panel 抽象 | 代表物理连接器,检测热插拔(DSI 通常固定连接) |
| Plane | VOP 硬件图层 (Win0~Win4) | 支持叠加、缩放、格式转换的独立图层 |
| Bridge | DSI 转 eDP/LVDS 桥接芯片 | 可选,用于连接非 DSI 接口屏幕 |
移植要点:在设备树中,VOP 通过
ports 节点连接到 DSI 控制器,DSI 控制器再通过 panel 或 bridge 子节点连接屏幕。DRM 框架在 probe 阶段自动解析这些连接。
3.3 VOP 模块详解
VOP (Video Output Processor) 是 Rockchip 自研的显示控制器,在 RK3588 上称为 vop2。它负责从内存读取 framebuffer,完成图层合成,并生成符合 VESA/CEA 标准的时序信号。
3.3.1 VOP 主要特性
- 多图层支持:最多 4 个视频层(Win0~Win3)+ 1 个光标层(Win4),支持 ARGB8888、YUV420 等格式。
- 独立缩放:每个图层可独立缩放,支持 1/16~8 倍缩放。
- Alpha 混合:全局 alpha 与 per-pixel alpha 混合。
- 输出接口:支持 MIPI DSI、eDP、HDMI、DP 同时输出(多屏异显)。
- AFBC:支持 Arm Frame Buffer Compression,减少内存带宽。
3.3.2 VOP 数据流
- DMA 从 DDR 读取 framebuffer 数据到 VOP 内部 line buffer。
- 每个图层经过格式转换、颜色校正(CSC)、缩放后进入混合器。
- 混合器按 Z-order 叠加所有图层,输出最终像素流。
- 时序生成器(TG)插入 HSA/HBP/HFP/VSA/VBP/VFP 等同步信号,形成标准视频流。
- 视频流通过内部总线发送到 DSI 控制器。
3.4 MIPI DSI 控制器
RK3588 集成 Synopsys DesignWare MIPI DSI v2.1 控制器,支持 DSI 协议标准,最高 4 通道 @ 2.5Gbps/通道。控制器在 DRM 框架中扮演 Encoder 角色,将 VOP 的并行视频流转换为 MIPI DSI 串行数据包。
3.4.1 控制器工作模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
| Video Mode (Burst) | 连续传输像素数据,DSI 控制器作为主设备 | 高刷新率、视频播放 |
| Video Mode (Non-Burst) | 带同步脉冲的连续传输 | 兼容性要求高的屏幕 |
| Command Mode | 通过 DCS 命令写入显示缓冲区,Panel 自行刷新 | 低功耗、静态画面 |
3.4.2 关键寄存器与配置
- DSI_VID_MODE_CFG:配置视频模式类型、Burst 模式、LP 模式切换。
- DSI_LPCLK_CTRL:控制低功耗时钟频率。
- DSI_PHY_TMR_CFG:配置 DPHY 时序参数(HS 准备时间、HS 退出时间等)。
- DSI_DPI_CFG:配置 DPI 接口像素格式(RGB565、RGB666、RGB888)。
常见陷阱:DSI 控制器的时钟源必须与 VOP 的 pixel clock 匹配。如果 VOP 输出 148.5MHz(1080p60),DSI 控制器需要配置相应的 byte clock(148.5 / 4 = 37.125MHz)。时钟不匹配会导致屏幕闪烁或黑屏。
3.5 设备树绑定与驱动注册
在 RK3588 上,显示驱动的设备树节点遵循 Rockchip 自定义绑定。以下是一个典型的 DSI 显示设备树片段:
// RK3588 VOP2 节点(通常已存在于 SoC dtsi)
vop: vop@fdd90000 {
compatible = "rockchip,rk3588-vop";
reg = <0x0 0xfdd90000 0x0 0x6000>;
interrupts = <GIC_SPI 156 IRQ_TYPE_LEVEL_HIGH>;
rockchip,grf = <&grf>;
ports {
#address-cells = <1>;
#size-cells = <0>;
vop_out: port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
vop_mipi_dsi: endpoint@0 {
reg = <0>;
remote-endpoint = <&dsi_in_vop>;
};
};
};
};
// MIPI DSI 控制器节点
dsi: dsi@fde20000 {
compatible = "rockchip,rk3588-mipi-dsi2";
reg = <0x0 0xfde20000 0x0 0x10000>;
interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru CLK_DSI2>, <&cru PCLK_DSI2>;
clock-names = "pclk", "sysclk";
phys = <&dsi2_dphy>;
phy-names = "dphy";
rockchip,grf = <&grf>;
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
dsi_in_vop: endpoint {
remote-endpoint = <&vop_mipi_dsi>;
};
};
port@1 {
reg = <1>;
dsi_out_panel: endpoint {
remote-endpoint = <&panel_in_dsi>;
};
};
};
};
// Panel 节点(具体屏幕)
panel: panel@0 {
compatible = "boe,tv110wum-nl0"; // 示例兼容性
reg = <0>;
enable-gpios = <&gpio1 RK_PB0 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpio1 RK_PB1 GPIO_ACTIVE_HIGH>;
backlight = <&backlight>;
ports {
port@0 {
panel_in_dsi: endpoint {
remote-endpoint = <&dsi_out_panel>;
};
};
};
};
驱动注册流程:
1. VOP 驱动 (drivers/gpu/drm/rockchip/rockchip_drm_vop2.c) 注册 CRTC。
2. DSI 控制器驱动 (drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi2.c) 注册 Encoder。
3. Panel 驱动 (drivers/gpu/drm/panel/panel-boe-tv110wum-nl0.c) 注册 Connector。
4. DRM core 在 component 匹配后调用 bind 函数,完成整个显示链路的初始化。
1. VOP 驱动 (drivers/gpu/drm/rockchip/rockchip_drm_vop2.c) 注册 CRTC。
2. DSI 控制器驱动 (drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi2.c) 注册 Encoder。
3. Panel 驱动 (drivers/gpu/drm/panel/panel-boe-tv110wum-nl0.c) 注册 Connector。
4. DRM core 在 component 匹配后调用 bind 函数,完成整个显示链路的初始化。
3.6 数据流与控制流总结
从用户态到像素点亮屏幕,完整的数据流如下:
- 用户程序调用
drmModeAtomicCommit提交 framebuffer 和 crtc 配置。 - DRM core 调用 VOP 的
atomic_enable和atomic_flush。 - VOP 配置图层寄存器,启动 DMA 读取 framebuffer。
- VOP 合成图层后,通过内部 DPI 接口将并行数据发送给 DSI 控制器。
- DSI 控制器将数据打包为 DSI 长包或短包,通过 DPHY 串行化发送。
- Panel 接收数据,驱动屏幕显示。
3.7 本章小结
- RK3588 显示驱动严格遵循 DRM/KMS 框架,VOP 作为 CRTC,DSI 控制器作为 Encoder。
- VOP 负责图层合成与时序生成,支持多图层独立缩放与混合。
- DSI 控制器支持 Video Mode 和 Command Mode,通过 DPHY 与 Panel 通信。
- 设备树中通过
ports节点建立 VOP → DSI → Panel 的连接关系。 - 时钟匹配、GPIO 控制、初始化序列是移植中最容易出错的环节。