2. Linux 显示驱动框架:DRM/KMS 架构解析
在 RK3588 显示驱动开发中,理解 Linux 内核的显示框架是基础。现代 Linux 显示驱动基于 DRM (Direct Rendering Manager) 和 KMS (Kernel Mode Setting) 架构。DRM 负责图形缓冲区管理与渲染调度,KMS 负责显示模式设置与输出控制。两者共同构成了从应用程序到物理显示设备的完整链路。
2.1 DRM/KMS 整体架构
DRM 子系统采用分层设计,用户空间通过 /dev/dri/card0 设备节点与内核交互。KMS 组件负责将 Framebuffer 内容经过 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 对象指针
};
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 表 |
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 | 工业屏、老式液晶 |
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: 光标图层,硬件光标,低延迟移动。
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 连接器 |
backlight_device 实现。而多屏拼接(如双屏同显)则需要配置多个 CRTC 和 Encoder 的绑定关系。理解上述组件的协作关系,是进行高级显示开发的基础。