显示 DRM 驱动
1. 概述
1.1 功能简介
DRM(Direct Rendering Manager)是 Linux 内核的显示子系统框架,负责管理 GPU、显示控制器(CRTC)、帧缓冲和显示输出。RK3576 内置 VOP2(Video Output Processor v2)显示控制器,支持多路独立显示输出,配合 Mali-G52 GPU 实现图形渲染和多屏显示。M4-R2 底板具体的显示接口(MIPI DSI / HDMI)以实际物料为准(待板上验证)。
1.2 应用场景
- 多屏显示:双屏独立显示
- 数字标牌:广告机、信息发布系统
- 工业 HMI:工业控制触摸屏界面
- 桌面系统:Linux 桌面图形界面
- 视频播放:硬件解码 + 显示输出
1.3 工作原理
RK3576 的显示控制器支持以下特性:
| 特性 | 说明 |
|---|---|
| 显示控制器 | VOP2(Video Output Processor v2) |
| 独立图层 | 最多 4 个图层(3 个胜利层 + 1 个公共层) |
| 最大分辨率 | 单屏 4K(3840×2160) |
| 输出接口 | MIPI DSI、HDMI、eDP、LVDS |
| 像素格式 | ARGB8888、XRGB8888、RGB888、RGB565 |
| 帧率 | 4K@60fps |
详见 RK 官方文档:[《Rockchip_Developer_Guide_Linux_Software_CN.pdf》]
2. 硬件准备
2.1 硬件清单
| 组件 | 型号/规格 | 数量 | 备注 |
|---|---|---|---|
| 主控板 | C-3576BQ 核心板 + M4-R2 底板 | 1 | |
| 调试串口线 | USB 转 TTL(3.3V) | 1 | 波特率 1500000 |
| LCD 显示屏 | MIPI DSI / HDMI 显示屏 | 1 | 根据接口类型选择 |
| HDMI 线(可选) | HDMI 线 | 1 | 用于 HDMI 输出测试 |
2.2 引脚连接
底板上通常已集成 MIPI DSI 和 HDMI 接口,直接连接显示屏即可。M4-R2 底板具体的显示接口数量与类型以实际物料为准(待板上验证)。
| 主控板引脚 | 显示屏引脚 | 功能说明 |
|---|---|---|
| DSI0_CLK_P / DSI0_CLK_N | CLK_P / CLK_N | MIPI DSI 时钟 |
| DSI0_D0_P / DSI0_D0_N | D0_P / D0_N | MIPI DSI 数据 lane 0 |
| DSI0_D1_P / DSI0_D1_N | D1_P / D1_N | MIPI DSI 数据 lane 1 |
| 3.3V / 1.8V | VCC | 显示屏电源 |
| GPIO / RST | RST | 显示屏复位 |
| GPIO / BL | BL_ON | 背光使能 |
2.3 硬件确认
# 查看显示设备
ls /sys/class/drm/
# 输出示例:card0 card0-HDMI-A-1 card0-DSI-1 version
# 查看连接状态
cat /sys/class/drm/card0-HDMI-A-1/status
# 输出:connected 或 disconnected
# 查看 framebuffer 信息
ls /dev/fb*3. 软件准备
3.1 内核配置
确认以下内核配置已启用:
CONFIG_DRM=y
CONFIG_DRM_ROCKCHIP=y
CONFIG_ROCKCHIP_VOP2=y
CONFIG_ROCKCHIP_ANALOGIX_DIGITAL=y
CONFIG_ROCKCHIP_DW_MIPI_DSI=y
CONFIG_DRM_PANEL_SIMPLE=y
CONFIG_DRM_CONNECTOR=y
CONFIG_OF=y
CONFIG_ROCKCHIP_VOP2是 Rockchip VOP2 显示控制器驱动。
3.2 设备树
RK3576 的 VOP2 显示控制器在设备树中定义(以下为 RK 平台通用结构示例):
vop2: vop@fe040000 {
compatible = "rockchip,rk3576-vop2";
reg = <0x0 0xfe040000 0x0 0x2000>;
interrupts = <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru ACLK_VOP>, <&cru HCLK_VOP>,
<&cru DCLK_VOP0>, <&cru DCLK_VOP1>, <&cru DCLK_VOP2>;
clock-names = "aclk", "hclk",
"dclk_vp0", "dclk_vp1", "dclk_vp2";
resets = <&cru SRST_A_VOP>, <&cru SRST_H_VOP>;
reset-names = "aclk", "hclk";
status = "disabled";
};以上寄存器基地址、中断号与时钟标识为 RK 平台通用结构示例,具体数值以实际发布的 RK3576 SDK 设备树为准(待板上确认)。
4. 操作步骤
4.1 查看显示设备
# 查看 DRM 设备
ls /sys/class/drm/
# 查看连接状态
cat /sys/class/drm/card0-HDMI-A-1/status
# 查看显示模式
cat /sys/class/drm/card0-HDMI-A-1/modes
# 查看 framebuffer 信息
cat /sys/class/graphics/fb0/virtual_size4.2 使用 modetest 测试显示
# 安装 modetest 工具
apt-get install libdrm-tests
# 查看显示设备信息
modetest -M rockchip -c
# 使用 modetest 测试显示
modetest -M rockchip -s 32:1920x1080-60 -P 38:1920x1080
# -s 指定 connector 和分辨率
# -P 指定 plane 和格式
# 使用 modetest 测试平面
modetest -M rockchip -r -s 32:1920x1080-60 -P 38:1920x1080 -F solid以上 connector/plane 编号(32、38)为示例,实际编号以
modetest -M rockchip -c输出为准。
4.3 使用 framebuffer 测试
# 向 framebuffer 写入测试图案
cat /dev/urandom > /dev/fb0
# 使用 fbgrab 截屏(需安装)
fbgrab screenshot.png
# 查看 framebuffer 参数
fbset -i4.4 设备树中配置显示输出
&vop2 {
status = "okay";
assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>;
assigned-clock-parents = <&cru PLL_V0>, <&cru PLL_V1>;
};
&dsi0 {
status = "okay";
rockchip,lane-rate = <1500>;
ports {
port@0 {
dsi0_in: endpoint {
remote-endpoint = <&vop0_out_dsi0>;
};
};
};
};5. 代码详解
5.1 内核中 DRM 驱动的注册
// RK3576 VOP2 显示控制器驱动(简化)
// drivers/gpu/drm/rockchip/rockchip_vop2.c
static struct platform_driver vop2_platform_driver = {
.probe = vop2_probe,
.remove = vop2_remove,
.driver = {
.name = "rockchip-vop2",
.of_match_table = vop2_of_match,
},
};
static const struct of_device_id vop2_of_match[] = {
{ .compatible = "rockchip,rk3576-vop2" },
{ /* sentinel */ }
};5.2 用户空间显示操作的内核调用链
用户空间 modetest
→ open(/dev/dri/card0)
→ ioctl(DRM_IOCTL_GET_MAGIC)
→ ioctl(DRM_IOCTL_MODE_GETRESOURCES)
→ ioctl(DRM_IOCTL_MODE_SETCRTC)
→ vop2_crtc_enable()
→ 启动 VOP2 显示控制器
→ 向 CRTC 写入帧缓冲数据6. 常见问题
6.1 显示无输出
现象: 显示屏无信号
解决方案:
# 检查连接状态
cat /sys/class/drm/card0-HDMI-A-1/status
# 检查 VOP2 时钟
cat /sys/kernel/debug/clk/clk_dclk_vp0/clk_rate
# 检查设备树中 VOP2 节点状态
# 具体节点路径以实际 DTB 反编译结果为准
dtc -I dtb -O dts /sys/firmware/fdt | grep -A3 "vop@"确认设备树中 VOP2 和显示接口节点 status = "okay",检查显示屏连接和供电。
6.2 分辨率不正确
现象: 显示分辨率与预期不符
解决方案:
# 查看可用分辨率
cat /sys/class/drm/card0-HDMI-A-1/modes
# 使用 modetest 设置分辨率
modetest -M rockchip -s 32:1920x1080-60检查设备树中显示模式配置,确认 EDID 读取正常。
6.3 显示花屏
现象: 显示内容有条纹或花屏
解决方案:
# 检查内存带宽
cat /sys/kernel/debug/clk/clk_aclk_vop/clk_rate
# 查看 VOP2 错误日志
dmesg | grep -i vop检查显存分配是否足够,排查内存带宽瓶颈。
