2. Linux 显示驱动框架:DRM/KMS 架构解析

在 RK3588 显示驱动开发中,理解 Linux 内核的显示框架是基础。现代 Linux 显示驱动基于 DRM (Direct Rendering Manager) 和 KMS (Kernel Mode Setting) 架构。DRM 负责图形缓冲区管理与渲染调度,KMS 负责显示模式设置与输出控制。两者共同构成了从应用程序到物理显示设备的完整链路。

核心认知: DRM/KMS 是 Linux 图形栈的基石,RK3588 的显示控制器(VOP)完全遵循该框架实现。掌握这些概念,是后续进行背光控制、多屏拼接、HDR 开发的前提。

2.1 DRM/KMS 整体架构

DRM 子系统采用分层设计,用户空间通过 /dev/dri/card0 设备节点与内核交互。KMS 组件负责将 Framebuffer 内容经过 CRTC、Encoder、Connector 等管线最终输出到显示器。

DRM/KMS 整体架构图 DRM/KMS 显示管线架构 用户空间 (Userspace) — 应用程序 / Wayland / X11 / libdrm 内核空间 — DRM Core (drm.ko) — 设备节点 /dev/dri/card0 KMS 组件 (Kernel Mode Setting) Plane (图层) CRTC (控制器) Encoder (编码器) Connector (连接器) 硬件层 — RK3588 VOP / HDMI TX / DP TX / MIPI DSI / eDP Framebuffer 扫描/时序 协议转换 物理接口 数据流方向:Framebuffer → Plane → CRTC → Encoder → Connector → 显示器

2.2 Framebuffer(帧缓冲)

Framebuffer 是显示内存中的一块连续区域,存储了屏幕上一帧的像素数据。在 DRM 框架中,Framebuffer 由 struct drm_framebuffer 表示,包含宽度、高度、像素格式、 pitches 等信息。

  • 物理内存: 通常通过 DMA-BUF 机制分配,保证连续物理内存或 IOMMU 映射。
  • 像素格式: 常见格式包括 ARGB8888、XRGB8888、NV12(视频)、RGB565 等。
  • 生命周期: 由用户空间创建,内核管理引用计数,驱动负责映射到显示控制器。
// DRM Framebuffer 核心结构体 (简化)
struct drm_framebuffer {
    struct drm_device *dev;
    struct drm_mode_object base;
    const struct drm_format_info *format; // 像素格式信息
    unsigned int width, height;           // 分辨率
    unsigned int pitches[4];              // 每行字节数
    unsigned int offsets[4];              // 各平面偏移
    uint64_t modifier;                    // 内存布局修饰符
    struct drm_gem_object *obj[4];        // GEM 对象指针
};
RK3588 实践提示: 在 RK3588 上,Framebuffer 通常分配在系统内存或显存中。VOP(Video Output Processor)通过 AXI 总线读取 Framebuffer 数据。背光控制不直接修改 Framebuffer 内容,但背光亮度变化会影响最终显示效果。

2.3 CRTC(显示控制器)

CRTC (Cathode Ray Tube Controller) 是 KMS 管线的核心调度单元。它负责从 Framebuffer 读取像素数据,生成行/场同步信号,并按照设定的分辨率、刷新率、像素时钟进行扫描输出。

属性 说明 RK3588 对应
分辨率 水平/垂直像素数,如 1920x1080 VOP 支持最大 8K@60fps
刷新率 每秒帧数,如 60Hz 通过 PLL 分频产生像素时钟
时序参数 HFP、HBP、VFP、VBP 等 由 drm_display_mode 描述
Gamma 校正 颜色查找表 (LUT) VOP 内置 10-bit Gamma 表
CRTC 内部工作流程 CRTC 内部工作流程 Framebuffer DMA 读取 Gamma/色彩 时序生成 CRTC 输出:VSYNC/HSYNC/DE/像素时钟 → 送往 Encoder

2.4 Encoder(编码器)

Encoder 负责将 CRTC 输出的并行 RGB 数据流转换为特定显示接口所需的串行协议。常见的 Encoder 类型包括:

  • HDMI Encoder: 将 RGB 转换为 TMDS 信号,嵌入音频、HDR 元数据。
  • DP Encoder: 转换为 DisplayPort 的 Main Link 数据包。
  • MIPI DSI Encoder: 转换为 MIPI DSI 差分串行信号。
  • eDP Encoder: 嵌入式 DisplayPort,常用于笔记本屏幕。

在 RK3588 中,每个 Encoder 对应一个硬件 IP 模块,如 dw-hdmi、cdns-dp。Encoder 与 CRTC 通过 drm_encoder.crtc 绑定。

2.5 Connector(连接器)

Connector 代表物理显示接口,负责检测显示器是否连接、读取 EDID 信息、提供物理连接状态。每个 Connector 绑定一个 Encoder,并关联一个 drm_display_info 结构体。

Connector 类型 接口标准 RK3588 典型应用
HDMI HDMI 2.1 / 2.0 电视、显示器输出
DP DisplayPort 1.4 高分辨率显示器、USB-C 扩展
MIPI DSI MIPI DSI 4-lane 平板、手机屏幕
eDP eDP 1.4 笔记本内置屏幕
LVDS LVDS 8-bit 工业屏、老式液晶
背光控制关联: Connector 是背光控制的入口点。通常通过 Connector 的 drm_connector 结构体找到关联的 backlight_device,进而调用 backlight_update_status() 调节亮度。在 RK3588 上,eDP 和 MIPI DSI 的背光控制最为常见。

2.6 Plane(图层/平面)

Plane 是 DRM/KMS 中实现硬件图层叠加的关键概念。每个 Plane 对应一个独立的 Framebuffer 源,CRTC 可以将多个 Plane 叠加合成最终画面。Plane 分为三种类型:

  • Primary Plane: 主图层,每个 CRTC 必须有一个,通常用于显示桌面背景。
  • Overlay Plane: 叠加图层,用于视频播放、UI 弹窗等,支持 Alpha 混合。
  • Cursor Plane: 光标图层,硬件光标,低延迟移动。
Plane 叠加合成示意图 Plane 硬件图层叠加合成 Primary Plane 桌面背景 / 主界面 Overlay Plane 视频 / 弹窗 (Alpha) Cursor Plane CRTC 硬件合成器 Alpha 混合 / Z-order 输出 多个 Plane 在 CRTC 内按 Z-order 顺序合成,最终输出一帧完整画面

2.7 各组件关系总结

下表总结了 DRM/KMS 五大核心组件的职责与 RK3588 中的对应实现:

组件 内核结构体 核心职责 RK3588 实现
Framebuffer drm_framebuffer 存储像素数据,定义格式 DMA-BUF / GEM 分配
Plane drm_plane 硬件图层,支持 Alpha 混合 VOP 的 win0/win1/win2
CRTC drm_crtc 扫描控制、时序生成、Gamma VOP 主控制器
Encoder drm_encoder 协议转换(RGB→TMDS/DP) dw-hdmi / cdns-dp
Connector drm_connector 物理接口检测、EDID 读取 HDMI/DP/MIPI 连接器
开发要点: 在 RK3588 显示驱动开发中,背光控制通常通过 Connector 关联的 backlight_device 实现。而多屏拼接(如双屏同显)则需要配置多个 CRTC 和 Encoder 的绑定关系。理解上述组件的协作关系,是进行高级显示开发的基础。