1. DRM 框架概述:架构分层、核心概念与瑞芯微平台特点
1.1 DRM 架构分层
DRM (Direct Rendering Manager) 是 Linux 内核中负责图形显示与渲染管理的核心框架。它采用分层设计,将用户空间、内核核心与硬件驱动解耦,形成清晰的调用链路。
架构分层要点: DRM 自底向上分为硬件驱动层、DRM 核心层、DRI 用户接口层。KMS 与 GEM 是 DRM 核心层的两大子系统。
1.2 GEM 与 KMS 核心概念
DRM 核心层包含两大子系统:GEM 负责图形内存管理,KMS 负责显示模式设置与输出控制。两者分工明确,协同工作。
| 子系统 | 全称 | 核心职责 | 关键数据结构 | 用户空间接口 |
|---|---|---|---|---|
| GEM | Graphics Execution Manager | 显存分配、释放、共享、CPU/GPU 同步 | drm_gem_object, drm_gem_cma_object |
DRM_IOCTL_GEM_OPEN, DRM_IOCTL_GEM_CLOSE |
| KMS | Kernel Mode Setting | 显示模式、分辨率、刷新率、图层合成、连接器管理 | drm_crtc, drm_plane, drm_encoder, drm_connector |
DRM_IOCTL_MODE_SETCRTC, DRM_IOCTL_MODE_ADDFB |
调试提示: 在瑞芯微平台调试显示问题时,首先确认 KMS 对象链是否完整注册(CRTC → Encoder → Connector),其次检查 GEM 缓冲区分配是否成功。这是最常用的排查路径。
GEM 核心对象关系
- drm_gem_object:基础 GEM 对象,包含句柄、大小、引用计数、内存类型。
- drm_gem_cma_object:CMA (Contiguous Memory Allocator) 类型 GEM 对象,适用于连续物理内存,瑞芯微平台常用。
- dma_buf:跨设备共享缓冲区,用于 GPU 与显示控制器之间的数据传递。
- drm_framebuffer:帧缓冲对象,关联 GEM 对象与像素格式,是 KMS 与 GEM 的桥梁。
KMS 核心对象链
1.3 瑞芯微平台 DRM 驱动特点
瑞芯微 (Rockchip) 平台 DRM 驱动基于 VOP (Video Output Processor) 显示控制器,具有以下显著特点:
| 特点 | 说明 | 调试关注点 |
|---|---|---|
| VOP 多版本 | VOP2 (RK3588/RK3568)、VOP (RK3399/RK3288),寄存器布局差异大 | 确认芯片型号对应的 VOP 版本,避免寄存器误操作 |
| 多显示管道 | RK3588 支持 4 个显示管道,可同时驱动多屏异显 | 检查 drm_crtc 数量与管道绑定关系 |
| 硬件图层叠加 | VOP 内置多个硬件图层 (Win0~Win4),支持 Alpha 混合、缩放 | 通过 drm_plane 枚举确认可用图层数量与能力 |
| 输出接口丰富 | HDMI、DP、eDP、MIPI DSI、LVDS、RGB 并行接口 | 确认 Connector 类型与对应 Encoder 的绑定状态 |
| CMA 连续内存 | 默认使用 CMA 分配连续物理内存,适合显示控制器 DMA 访问 | 监控 CMA 区域使用量,避免碎片导致分配失败 |
| 设备树驱动 | 显示控制器、接口、时序参数通过设备树配置 | 检查 dts 中 vop、hdmi、dsi 节点状态与时钟配置 |
常见调试陷阱: 瑞芯微平台 VOP 驱动中,Plane 的
zpos (图层顺序) 必须严格配置,否则会导致图层遮挡或显示异常。另外,CMA 区域大小不足时,高分辨率显示会分配失败,需在设备树中调整 cma-size。
瑞芯微 DRM 驱动文件结构
drivers/gpu/drm/rockchip/
├── rockchip_drm_drv.c # 驱动入口、平台设备绑定
├── rockchip_drm_vop.c # VOP 显示控制器核心驱动
├── rockchip_drm_vop2.c # VOP2 显示控制器驱动 (RK3588/RK3568)
├── rockchip_drm_dsi.c # MIPI DSI 输出接口驱动
├── rockchip_drm_dp.c # DisplayPort 输出接口驱动
├── rockchip_drm_hdmi.c # HDMI 输出接口驱动
├── rockchip_drm_lvds.c # LVDS 输出接口驱动
├── rockchip_drm_gem.c # GEM 内存管理 (CMA 实现)
├── rockchip_drm_fb.c # Framebuffer 创建与管理
└── rockchip_drm_vop.h # VOP 寄存器定义与数据结构
驱动初始化流程
- 平台驱动注册:
rockchip_drm_platform_driver匹配设备树节点。 - 组件绑定:通过
component_bind_all收集 VOP、HDMI、DSI 等子驱动。 - DRM 设备初始化:
drm_dev_alloc→drm_dev_register。 - KMS 对象创建:注册 CRTC、Plane、Encoder、Connector,建立对象链。
- GEM 初始化:配置 CMA 内存池,注册 GEM 操作函数。
- Framebuffer 默认创建:为每个 CRTC 创建默认帧缓冲,启动显示输出。
1.4 本章小结
DRM 框架通过清晰的分层设计,将用户空间图形栈与底层硬件解耦。GEM 管理图形内存,KMS 控制显示输出,两者构成 DRM 核心。瑞芯微平台基于 VOP 显示控制器,具有多管道、多图层、多接口的特点,驱动代码集中在 drivers/gpu/drm/rockchip/ 目录。理解这些基础概念,是后续调试显示控制器问题的重要前提。