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 的组合。
RK3588 DRM/KMS 显示驱动分层架构 RK3588 DRM/KMS 显示驱动分层架构 用户空间 (libdrm / Weston / SurfaceFlinger) DRM Core (atomic modeset / fb / plane) VOP (CRTC) — 图层合成 / 时序生成 MIPI DSI 控制器 (Encoder / Bridge) MIPI DPHY + DSI Panel 说明: 数据流从上到下:用户空间提交 framebuffer → DRM Core 原子更新 → VOP 合成 → 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 数据流

  1. DMA 从 DDR 读取 framebuffer 数据到 VOP 内部 line buffer。
  2. 每个图层经过格式转换、颜色校正(CSC)、缩放后进入混合器。
  3. 混合器按 Z-order 叠加所有图层,输出最终像素流。
  4. 时序生成器(TG)插入 HSA/HBP/HFP/VSA/VBP/VFP 等同步信号,形成标准视频流。
  5. 视频流通过内部总线发送到 DSI 控制器。
VOP 内部数据流与图层处理 VOP 内部数据流与图层处理 DDR Win0 Win1 Win2 Win3 混合器 Alpha / Z-order 时序生成 H/V Sync DSI 控制器 说明: 每个 Win 图层独立配置格式、位置、大小和 Z-order。混合器按 Z-order 从低到高叠加, 最终输出到时序生成器插入同步信号,再发送给 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 函数,完成整个显示链路的初始化。

3.6 数据流与控制流总结

从用户态到像素点亮屏幕,完整的数据流如下:

  1. 用户程序调用 drmModeAtomicCommit 提交 framebuffer 和 crtc 配置。
  2. DRM core 调用 VOP 的 atomic_enable 和 atomic_flush。
  3. VOP 配置图层寄存器,启动 DMA 读取 framebuffer。
  4. VOP 合成图层后,通过内部 DPI 接口将并行数据发送给 DSI 控制器。
  5. DSI 控制器将数据打包为 DSI 长包或短包,通过 DPHY 串行化发送。
  6. Panel 接收数据,驱动屏幕显示。
显示数据流与控制流 显示数据流与控制流 用户空间 DRM Core VOP (CRTC) DSI 控制器 Panel 数据流方向: 用户空间 → DRM Core (atomic) → VOP (合成+时序) → DSI 控制器 (串行化) → Panel (显示)

3.7 本章小结

  • RK3588 显示驱动严格遵循 DRM/KMS 框架,VOP 作为 CRTC,DSI 控制器作为 Encoder。
  • VOP 负责图层合成与时序生成,支持多图层独立缩放与混合。
  • DSI 控制器支持 Video Mode 和 Command Mode,通过 DPHY 与 Panel 通信。
  • 设备树中通过 ports 节点建立 VOP → DSI → Panel 的连接关系。
  • 时钟匹配、GPIO 控制、初始化序列是移植中最容易出错的环节。