3. RK3588 显示驱动源码结构:drivers/gpu/drm/rockchip/ 目录分析

RK3588 的显示驱动基于 Linux DRM (Direct Rendering Manager) 框架,其核心源码位于内核源码树的 drivers/gpu/drm/rockchip/ 目录下。理解该目录的结构、关键文件以及函数入口,是进行显示驱动故障排查与性能调优的基础。本章将深入剖析该目录的组成,并标注出与 RK3588 强相关的核心模块。

3.1 目录全景与模块划分

drivers/gpu/drm/rockchip/ 目录遵循 DRM 框架的组件化设计思想,主要分为以下几个逻辑模块:

模块类别 核心文件 功能描述
DRM 核心 rockchip_drm_drv.c 驱动入口、平台设备绑定、DRM 设备注册与注销
CRTC (显示控制器) rockchip_vop2.c / rockchip_vop2_reg.c VOP2 (Video Output Processor v2) 控制器实现,负责图层合成与时序生成
Encoder (编码器) rockchip_dp.c / rockchip_hdmi.c / rockchip_mipi_dsi.c DP/HDMI/MIPI DSI 等外部显示接口的驱动
Connector (连接器) 集成在 Encoder 文件中 通过 DRM bridge 或 panel 框架管理物理连接状态
Plane (图层) rockchip_drm_plane.c 硬件图层 (Win0-Win4) 的抽象与管理
Gem/Prime (内存管理) rockchip_drm_gem.c 显存分配、DMA-BUF 导入导出、IOMMU 映射
设备树解析 rockchip_drm_of.c 解析设备树中显示相关的节点与端点连接
关键提示: RK3588 使用 VOP2 而非旧款 SoC 的 VOP1。VOP2 支持最多 4 个独立显示通道,每个通道可绑定不同的物理显示接口,这是 RK3588 实现多屏异显的硬件基础。

3.2 关键文件深度解析

3.2.1 驱动入口:rockchip_drm_drv.c

该文件是驱动的总入口,负责初始化 DRM 设备并注册所有子组件。其核心函数入口如下:

  • rockchip_drm_bind():平台设备 probe 时的绑定函数,依次完成:
    1. 调用 drm_dev_alloc() 分配 DRM 设备结构体。
    2. 调用 component_bind_all() 绑定所有 VOP2、Encoder 等子组件。
    3. 调用 drm_vblank_init() 初始化 VBlank 中断。
    4. 调用 drm_mode_config_init() 初始化模式配置。
    5. 调用 drm_dev_register() 注册 DRM 设备到用户空间。
  • rockchip_drm_unbind():解绑与资源释放。

3.2.2 VOP2 控制器:rockchip_vop2.c

VOP2 是 RK3588 显示驱动的核心,负责从内存读取帧缓冲数据,经过图层合成后输出到显示接口。其关键数据结构与函数:

  • 结构体 vop2_video_port:代表一个显示通道 (VP0-VP3),包含 crtc、encoder 列表、win 图层指针。
  • 函数 vop2_crtc_enable():使能 CRTC,配置时序参数 (H/V total, sync width, porch)。
  • 函数 vop2_plane_atomic_update():更新图层属性 (源/目标矩形、格式、地址)。
  • 函数 vop2_crtc_atomic_flush():提交所有更新到硬件寄存器,触发 VBlank。
调试技巧: 当遇到显示无输出或花屏时,优先检查 vop2_crtc_enable() 中配置的时序参数是否与显示器 EDID 匹配。可以在该函数内添加 DRM_DEV_DEBUG() 打印实际写入的寄存器值。

3.2.3 显示接口驱动:rockchip_dp.c / rockchip_hdmi.c

这些文件实现了具体的物理接口协议。以 DP 为例:

  • rockchip_dp_probe():解析设备树,获取 DP 控制器基地址、时钟、PHY 等资源。
  • rockchip_dp_bridge_mode_set():设置显示模式,配置链路速率、通道数。
  • rockchip_dp_bridge_enable():启动 DP 链路训练,输出视频流。

3.3 函数调用链与入口定位

当用户空间通过 modetest 发起模式设置请求时,内核中的函数调用链如下:

modetest 模式设置内核调用链 用户空间: modetest -s 0:1920x1080 drm_mode_setcrtc() (drm_crtc.c) rockchip_drm_crtc_atomic_begin() vop2_crtc_atomic_enable() 配置时序、使能时钟、启动 VOP2 核心 vop2_plane_atomic_update() 更新图层地址、格式、alpha rockchip_dp_bridge_enable() 启动链路训练、输出视频流 vop2_reg_write() → 硬件寄存器生效 说明:红色节点为 Rockchip 驱动桥接层,绿色节点为 VOP2 核心实现,橙色/青色节点为并行执行的分支

3.4 关键函数入口速查表

以下表格列出了故障排查时最常需要设置断点或添加日志的关键函数入口:

函数名 所在文件 触发时机 典型故障关联
rockchip_drm_bind() rockchip_drm_drv.c 驱动加载 驱动未 probe、设备节点未创建
vop2_crtc_enable() rockchip_vop2.c CRTC 使能 无显示、时序错误、屏幕闪烁
vop2_plane_atomic_update() rockchip_vop2.c 图层更新 花屏、图层不显示、格式错误
rockchip_dp_bridge_mode_set() rockchip_dp.c 模式设置 DP 无输出、分辨率不匹配
rockchip_drm_gem_prime_import() rockchip_drm_gem.c DMA-BUF 导入 显存分配失败、IOMMU 页错误

3.5 设备树与驱动的绑定关系

RK3588 的显示驱动通过设备树 (Device Tree) 进行硬件描述与驱动匹配。关键设备树节点与驱动文件的对应关系如下:

  • vop2 节点:compatible = "rockchip,rk3588-vop2" → 匹配 rockchip_vop2.c。
  • dp0/dp1 节点:compatible = "rockchip,rk3588-dp" → 匹配 rockchip_dp.c。
  • hdmi0/hdmi1 节点:compatible = "rockchip,rk3588-hdmi" → 匹配 rockchip_hdmi.c。
  • mipi_dcphy0/mipi_dcphy1 节点:compatible = "rockchip,rk3588-mipi-dcphy" → 匹配 rockchip_mipi_dsi.c。
常见错误: 设备树中 vop2 的 ports 端点连接错误是导致显示接口无法工作的首要原因。务必检查每个 VP 的 remote-endpoint 是否指向正确的 Encoder 节点。

3.6 编译与调试配置

在 drivers/gpu/drm/rockchip/Kconfig 中,RK3588 相关的配置项如下:

配置宏 依赖模块 说明
CONFIG_DRM_ROCKCHIP 所有子模块 Rockchip DRM 主开关
CONFIG_ROCKCHIP_VOP2 VOP2 控制器 必须开启,否则无显示输出
CONFIG_ROCKCHIP_ANALOGIX_DP DP 接口 DP 显示输出
CONFIG_ROCKCHIP_DW_HDMI HDMI 接口 HDMI 显示输出
CONFIG_DRM_ROCKCHIP_DEBUG 调试支持 开启后可通过 debugfs 查看寄存器状态

建议在调试阶段开启 CONFIG_DRM_ROCKCHIP_DEBUG 和 CONFIG_DRM_DEBUG,以便通过 dmesg 获取更详细的驱动日志。

3.7 本章小结