HDMI 显示驱动
1. 概述
1.1 功能简介
HDMI(High-Definition Multimedia Interface)是高清多媒体接口,可同时传输音频和视频信号。RK3576 内置 HDMI 发送器,支持高清视频输出,兼容 HDMI 2.0/1.4 标准,适用于大屏显示、家庭影院、数字标牌等场景。M4-R2 底板具体的 HDMI 接口数量与类型以实际物料为准(待板上验证)。
1.2 应用场景
- 大屏显示:连接 HDMI 显示器、投影仪
- 家庭影院:连接电视,播放高清视频
- 数字标牌:广告机、信息发布系统
- 多屏办公:扩展桌面,多显示器工作
- 会议系统:视频会议显示输出
1.3 工作原理
RK3576 的 HDMI 接口支持以下特性:
| 特性 | 说明 |
|---|---|
| HDMI 版本 | HDMI 2.0+(具体以实际 SDK 为准) |
| 分辨率 | 最高支持 4K(3840×2160) |
| 色深 | 8/10/12bit |
| HDR | 支持 HDR10 |
| 音频 | 支持多通道 PCM 音频输出 |
| HDCP | 支持 HDCP 2.2/1.4 |
详见 RK 官方文档:[《Rockchip_Developer_Guide_Linux_Software_CN.pdf》]
2. 硬件准备
2.1 硬件清单
| 组件 | 型号/规格 | 数量 | 备注 |
|---|---|---|---|
| 主控板 | C-3576BQ 核心板 + M4-R2 底板 | 1 | |
| 调试串口线 | USB 转 TTL(3.3V) | 1 | 波特率 1500000 |
| HDMI 显示器 | 支持 HDMI | 1 | 用于 HDMI 输出测试 |
| HDMI 线 | HDMI 线 | 1 | 建议使用认证线缆 |
2.2 引脚连接
底板上已集成 HDMI Type-A 接口,直接连接 HDMI 线即可。M4-R2 底板具体的 HDMI 接口位置以实际物料为准(待板上验证)。
HDMI 接口在底板原理图中有标注,包含 TMDS 数据/时钟差分对。
2.3 硬件确认
# 查看 HDMI 连接状态
cat /sys/class/drm/card0-HDMI-A-1/status
# 输出:connected
# 查看 HDMI 支持的分辨率
cat /sys/class/drm/card0-HDMI-A-1/modes
# 查看 HDMI EDID 信息
cat /sys/class/drm/card0-HDMI-A-1/edid | edid-decode
# (需安装 edid-decode 工具)3. 软件准备
3.1 内核配置
确认以下内核配置已启用:
CONFIG_DRM=y
CONFIG_DRM_ROCKCHIP=y
CONFIG_ROCKCHIP_VOP2=y
CONFIG_ROCKCHIP_ANALOGIX_DIGITAL=y
CONFIG_ROCKCHIP_HDMI=y
CONFIG_DRM_ROCKCHIP_ANALOGIX_HDMI=y
CONFIG_HDMI=y
CONFIG_OF=y3.2 设备树
RK3576 的 HDMI 控制器在设备树中定义(以下为 RK 平台通用结构示例):
hdmi0: hdmi@fe0a0000 {
compatible = "rockchip,rk3576-dp-hdmi";
reg = <0x0 0xfe0a0000 0x0 0x20000>;
interrupts = <GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_HDMI_TX>, <&cru CLK_HDMI_REF>,
<&cru CLK_HDMI_TX>;
clock-names = "pclk", "ref", "phy";
resets = <&cru SRST_HDMI_TX>;
reset-names = "hdmi";
rockchip,phy = <&hdmi_phy>;
pinctrl-names = "default";
pinctrl-0 = <&hdmi0_tx_cec &hdmim0_tx_hpd>;
status = "disabled";
};以上寄存器基地址、中断号与时钟标识为 RK 平台通用结构示例,具体数值以实际发布的 RK3576 SDK 设备树为准(待板上确认)。
4. 操作步骤
4.1 查看 HDMI 连接状态
# 查看 HDMI 连接状态
cat /sys/class/drm/card0-HDMI-A-1/status
# 输出:connected
# 查看支持的分辨率
cat /sys/class/drm/card0-HDMI-A-1/modes
# 查看当前分辨率
cat /sys/class/drm/card0-HDMI-A-1/mode4.2 使用 modetest 测试 HDMI 输出
# 安装 modetest 工具
apt-get install libdrm-tests
# 查看 HDMI 显示设备信息
modetest -M rockchip -c | grep -A 20 HDMI
# 使用 modetest 设置 HDMI 输出分辨率
modetest -M rockchip -s 32:1920x1080-60
# 32 是 HDMI-A-1 的 connector ID(示例值)
# 测试 4K 输出
modetest -M rockchip -s 32:3840x2160-60以上 connector ID(32)为示例,实际 ID 以
modetest -M rockchip -c输出为准。
4.3 配置 HDMI 音频输出
# 查看 HDMI 音频设备
aplay -l | grep HDMI
# 播放音频到 HDMI
aplay -D plughw:0,1 test.wav
# 使用 alsamixer 调节 HDMI 音量
alsamixer -c 04.4 设备树中配置 HDMI
&hdmi0 {
status = "okay";
pinctrl-0 = <&hdmi0_tx_cec &hdmim0_tx_hpd>;
pinctrl-names = "default";
};
&vop2 {
status = "okay";
assigned-clocks = <&cru DCLK_VOP0>;
assigned-clock-parents = <&cru PLL_V0>;
};5. 代码详解
5.1 内核中 HDMI 驱动的注册
// RK3576 HDMI 发送器驱动(简化)
// drivers/gpu/drm/rockchip/rockchip_hdmi.c
static struct platform_driver hdmi_driver = {
.probe = hdmi_probe,
.remove = hdmi_remove,
.driver = {
.name = "rockchip-hdmi",
.of_match_table = hdmi_of_match,
},
};
static const struct of_device_id hdmi_of_match[] = {
{ .compatible = "rockchip,rk3576-dp-hdmi" },
{ /* sentinel */ }
};5.2 用户空间 HDMI 操作的内核调用链
用户空间 modetest
→ open(/dev/dri/card0)
→ ioctl(DRM_IOCTL_MODE_GETRESOURCES)
→ ioctl(DRM_IOCTL_MODE_GETCONNECTOR)
→ ioctl(DRM_IOCTL_MODE_SETCRTC)
→ hdmi_enable()
→ hdmi_config_video()
→ 设置 HDMI 时序参数
→ 启动 TMDS 输出6. 常见问题
6.1 HDMI 无输出
现象: HDMI 连接显示器无信号
解决方案:
# 检查 HDMI 连接状态
cat /sys/class/drm/card0-HDMI-A-1/status
# 检查 HDMI 时钟
cat /sys/kernel/debug/clk/clk_hdmi_ref/clk_rate
# 检查设备树中 HDMI 节点状态
# 具体节点路径以实际 DTB 反编译结果为准
dtc -I dtb -O dts /sys/firmware/fdt | grep -A3 "hdmi@"确认设备树中 HDMI 节点 status = "okay",检查 HDMI 线连接和显示器供电。
6.2 分辨率不支持
现象: 显示器不显示或显示异常
解决方案:
# 查看显示器支持的分辨率
cat /sys/class/drm/card0-HDMI-A-1/modes
# 使用 xrandr 查看(桌面环境)
xrandr --output HDMI-1 --mode 1920x1080
# 强制设置分辨率
xrandr --output HDMI-1 --mode 1920x1080 --rate 60检查 HDMI 线是否支持所需带宽,确认显示器 EDID 读取正常。
6.3 HDMI 音频无声
现象: 视频正常但无音频输出
解决方案:
# 查看 HDMI 音频设备
aplay -l
# 检查音频控件
amixer contents | grep HDMI
# 设置 HDMI 音频输出
pactl set-default-sink alsa_output.platform-hdmi-sound.analog-stereo检查 HDMI 音频配置,确认 Codec 驱动加载正常。
