1. RK3399平台概述:芯片架构、显示子系统框图、显示驱动栈(DRM/KMS)简介
1.1 芯片架构概览
RK3399 是 Rockchip 推出的高性能、低功耗六核 64 位处理器,采用 big.LITTLE 大小核架构,广泛应用于智能显示、边缘计算、数字标牌及高端平板设备。其核心计算单元由 双核 Cortex-A72(性能核)与 四核 Cortex-A53(效率核)组成,搭配 Mali-T860 MP4 GPU,提供强大的图形与视频处理能力。
架构要点: RK3399 的异构计算设计使其在显示驱动开发中需要特别关注大小核调度、GPU 与 VPU 的显存带宽竞争,以及多显示控制器之间的时钟同步。
下表列出了与显示驱动开发密切相关的关键 IP 模块及其功能:
| IP 模块 | 功能描述 | 驱动栈位置 |
|---|---|---|
| Cortex-A72 x2 | 高性能计算核心,运行 DRM/KMS 用户态与内核态逻辑 | CPU 侧 |
| Mali-T860 MP4 | 四核 GPU,负责 3D 渲染与合成 | DRM GEM / GPU 驱动 |
| VOPB / VOPL | 视频输出处理器,支持多图层叠加与显示时序生成 | DRM CRTC / Encoder |
| HDMI / DP / MIPI DSI | 物理显示接口,负责信号传输 | DRM Connector / Bridge |
| I2C / SPI / GPIO | 外设控制总线,用于触摸、背光、EDID 读取 | 设备树 / 平台驱动 |
1.2 显示子系统框图
RK3399 的显示子系统以 VOP(Video Output Processor) 为核心,包含两个独立的显示通道:VOPB(Big) 和 VOPL(Little)。VOPB 支持最高 4K@60fps 输出,VOPL 支持 4K@30fps 或 2K@60fps。每个 VOP 内部集成多个硬件图层(Win0-Win4),支持缩放、旋转、Alpha 混合等操作。
显示数据流路径如下:
- GPU/VPU 渲染帧缓冲区到 DDR。
- VOP 通过 AXI 总线从 DDR 读取图层数据。
- VOP 内部完成图层合成后,生成并行 RGB/LVDS 或串行 DP/HDMI 信号。
- 物理接口(PHY) 将信号转换为标准电气协议发送到显示器。
调试提示: 在设备树中,VOPB 和 VOPL 的
status 属性、clock-frequency 以及 port 端点连接关系是显示驱动能否正确初始化的关键。务必检查 vopb_out 与 hdmi_in 的 phandle 是否匹配。
1.3 显示驱动栈:DRM/KMS 简介
RK3399 的显示驱动基于 Linux 内核的 DRM(Direct Rendering Manager) 和 KMS(Kernel Mode Setting) 框架。DRM 提供用户态与内核态之间的图形缓冲区管理(GEM)、同步对象(Fence)及渲染命令提交接口;KMS 负责显示模式设置、图层配置、连接器管理及页面翻转。
驱动栈分层如下:
| 层次 | 组件 | 职责 |
|---|---|---|
| 用户态 | libdrm / Weston / Xorg | 合成器、窗口管理、模式设置请求 |
| 内核 DRM Core | drm.ko / drm_kms_helper.ko | 对象模型、IOCTL 分发、FB 管理 |
| KMS 组件 | CRTC / Plane / Encoder / Connector | 显示时序、图层叠加、信号编码、物理连接 |
| 平台驱动 | rockchip_drm_vop.ko / dw_hdmi-rockchip.ko | 硬件寄存器操作、时钟/复位/电源管理 |
常见陷阱: 在 RK3399 上,如果设备树中
vopb 的 assigned-clock-rates 设置不正确,KMS 在 drm_atomic_commit 阶段可能返回 -EINVAL,导致屏幕无输出。务必使用 clk_summary 确认 VOP DCLK 频率。
1.4 设备树中的显示节点关系
在 RK3399 平台,设备树(Device Tree)是描述硬件拓扑与资源配置的核心文件。显示相关的节点通常位于 arch/arm64/boot/dts/rockchip/rk3399.dtsi 中,主要包括:
- vopb / vopl:显示输出处理器节点,包含
clocks、interrupts、iommus及ports子节点。 - hdmi / dp / mipi_dsi:物理接口节点,通过
port与 VOP 的out_port连接。 - route:路由节点,指定哪个 VOP 连接到哪个接口,例如
route_hdmi。
// rk3399.dtsi 中 VOPB 与 HDMI 的连接示例
vopb: vop@ff900000 {
compatible = "rockchip,rk3399-vop-big";
reg = <0x0 0xff900000 0x0 0x3efc>;
interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru ACLK_VOP0>, <&cru HCLK_VOP0>, <&cru DCLK_VOP0>;
clock-names = "aclk_vop", "hclk_vop", "dclk_vop";
status = "disabled";
vopb_out: port {
#address-cells = <1>;
#size-cells = <0>;
vopb_out_hdmi: endpoint@0 {
reg = <0>;
remote-endpoint = <&hdmi_in_vopb>;
};
};
};
hdmi: hdmi@ff940000 {
compatible = "rockchip,rk3399-dw-hdmi";
reg = <0x0 0xff940000 0x0 0x20000>;
interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_HDMI_CTRL>, <&cru SCLK_HDMI_SFR>, <&cru SCLK_HDMI_CEC>;
clock-names = "pclk", "isfr", "cec";
status = "disabled";
ports {
#address-cells = <1>;
#size-cells = <0>;
hdmi_in: port {
#address-cells = <1>;
#size-cells = <0>;
hdmi_in_vopb: endpoint@0 {
reg = <0>;
remote-endpoint = <&vopb_out_hdmi>;
};
};
};
};
调试命令: 使用
dtc -I dtb -O dts rk3399-evb.dtb | grep -A 20 vopb 可以快速检查实际加载的设备树中 VOPB 节点的状态与连接关系。