4. RK3568 显示驱动框架:DRM/KMS 架构与 Rockchip 显示模块
RK3568 的显示子系统基于 Linux 标准 DRM (Direct Rendering Manager) / KMS (Kernel Mode Setting) 框架构建。理解这一分层架构是分析显示驱动故障(如无显示、花屏、分辨率异常)的前提。本章将拆解 DRM/KMS 核心概念、Rockchip 平台的具体实现模块(drm-rockchip、VOP、drm_dp 等),并通过 dmesg 日志定位各模块的初始化状态。
4.1 DRM/KMS 架构概览
DRM 是 Linux 内核中负责图形显示和渲染管理的子系统,KMS 是其子集,专门用于设置显示模式(分辨率、刷新率、连接器状态)。在 RK3568 上,整个显示栈从上到下分为三层:
- 用户空间:Weston、Xorg 或 Wayland 合成器通过 libdrm 调用 DRM ioctl。
- 内核 DRM 核心层:提供通用框架,管理 CRTC(显示控制器)、Encoder(编码器)、Connector(连接器)、Plane(图层)等抽象对象。
- 硬件驱动层:Rockchip 实现的
drm-rockchip驱动,包含 VOP(Video Output Processor)、DP/HDMI 等具体 IP 驱动。
- CRTC → VOP(显示控制器,负责扫描输出)
- Encoder → 内部编码模块(如 LVDS、MIPI DSI 的 DPI 接口)
- Connector → 物理接口(HDMI、DP、eDP、MIPI DSI)
- Plane → VOP 的硬件图层(主图层、光标图层、 overlay 图层)
4.2 Rockchip 显示驱动模块详解
RK3568 的显示驱动由多个内核模块组成,它们协同工作。在 dmesg 日志中,我们可以通过模块加载顺序和 probe 成功/失败信息判断故障点。
| 模块名称 | 功能角色 | 对应 DRM 对象 | dmesg 关键搜索词 |
|---|---|---|---|
drm-rockchip |
平台主驱动,注册 DRM 设备 | DRM device | drm-rockchip, rockchip_drm |
rockchip-vop |
显示输出处理器,实现 CRTC | CRTC | vop, vop2, rockchip-vop |
rockchip-dp |
eDP/DP 接口驱动 | Encoder + Connector | rockchip-dp, cdn-dp |
rockchip-hdmi |
HDMI 接口驱动 | Encoder + Connector | rockchip-hdmi, dw-hdmi |
rockchip-mipi-dsi |
MIPI DSI 接口驱动 | Encoder + Connector | rockchip-mipi-dsi |
rockchip-lvds |
LVDS 接口驱动 | Encoder + Connector | rockchip-lvds |
probe + 模块名(如 rockchip-vop probe)可以快速确认驱动是否成功加载。若出现 probe failed 或 defer,通常表示依赖的时钟、电源域或 PHY 未就绪。
4.3 VOP(Video Output Processor)—— 核心 CRTC
VOP 是 RK3568 的显示控制器,负责从内存中读取帧缓冲数据,合成图层,并按照设定的时序输出到显示接口。RK3568 集成的是 VOP2,支持多图层、AFBC(帧缓冲压缩)和最高 4K@60fps 输出。
VOP 在 dmesg 中的典型初始化日志片段:
[ 2.345678] rockchip-vop2 fe040000.vop: Adding to iommu group 0
[ 2.345789] rockchip-vop2 fe040000.vop: [drm] vop2 probe success
[ 2.345890] rockchip-vop2 fe040000.vop: [drm] vop2 supports: 4K@60, AFBC, 3 layers
VOP 的关键硬件特性:
- 多图层支持:通常包含 1 个主图层(Smart0)、1 个光标图层(Cursor)和 1 个 overlay 图层(Smart1)。
- AFBC (Arm Frame Buffer Compression):减少内存带宽占用,但需要用户空间配合。
- IOMMU 集成:VOP 通过 IOMMU 访问物理内存,IOMMU 故障会导致黑屏或花屏。
4.4 drm_dp 与 eDP/DP 接口驱动
RK3568 通常通过 eDP (Embedded DisplayPort) 连接内置 LCD 屏幕,或通过 DP (DisplayPort) 连接外部显示器。驱动基于 drm_dp 辅助框架和 rockchip-dp 实现。
eDP/DP 驱动的初始化流程在 dmesg 中通常表现为:
[ 2.456789] rockchip-dp fe0c0000.edp: [drm] edp probe success
[ 2.456890] rockchip-dp fe0c0000.edp: [drm] Detected DP version 1.4
[ 2.456901] rockchip-dp fe0c0000.edp: [drm] Max link rate: 5.4 Gbps, lane count: 4
[ 2.457012] rockchip-dp fe0c0000.edp: [drm] EDID read success: BOE NV156FHM-N49
常见故障点:
- EDID 读取失败:dmesg 中出现
EDID read failed,通常导致无法获取屏幕分辨率,输出黑屏或默认 1024x768。 - Link Training 失败:出现
link training failed,表现为屏幕闪烁或无显示。 - HPD (Hot Plug Detect) 异常:eDP 屏的 HPD 信号不稳定会导致驱动反复 probe。
rockchip-dp 显示 probe defer,请检查 VOP 和 PHY 驱动是否先于 DP 驱动加载。DP 驱动依赖 VOP 提供的 CRTC 和 PHY 提供的时钟。
4.5 模块依赖与初始化顺序
显示驱动的加载顺序至关重要。错误的顺序会导致 probe defer 或 EPROBE_DEFER。以下是 RK3568 显示模块的推荐加载顺序:
- 时钟与电源域:clk, regulator, pinctrl
- PHY 驱动:如
rockchip-dp-phy或inno-hdmi-phy - VOP 驱动:
rockchip-vop(CRTC) - 接口驱动:
rockchip-dp,rockchip-hdmi,rockchip-mipi-dsi - 主 DRM 驱动:
drm-rockchip(绑定所有组件)
在 dmesg 中,可以通过时间戳判断顺序是否异常:
[ 2.123456] rockchip-vop2 fe040000.vop: probe success
[ 2.123789] rockchip-dp fe0c0000.edp: probe defer (waiting for vop)
[ 2.345678] rockchip-dp fe0c0000.edp: probe success (retry after vop ready)
dmesg | grep -E "rockchip|vop|drm|edp|hdmi|dp" 快速过滤所有显示相关日志。