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 库即可完成显示配置。
DRM/KMS 框架架构图 DRM/KMS 框架架构图 用户空间 (User Space) — libdrm / Mesa / Wayland / X11 系统调用 (ioctl) 内核空间 (Kernel Space) — DRM Core / KMS 硬件抽象层 — CRTC / Encoder / Connector / Plane 硬件层 — RK3399 VOP / HDMI / MIPI DSI / eDP

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 是投影仪接口(连接屏幕)。
CRTC/Encoder/Connector/Plane 数据流图 KMS 核心组件数据流图 Plane 图像层 / Overlay 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。
RK3399 VOP 内部架构图 RK3399 VOP 内部模块架构图 系统内存 (DDR) DMA 引擎 Win0 (Plane 0) Win1 (Plane 1) Win2 (Plane 2) Win3 (Plane 3) 背景层 (Background Layer) 合成模块 (Blender) 时序控制器 (Timing Controller)

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)。

2.6 本章小结