HDMI(High-Definition Multimedia Interface)是一种数字化音视频接口标准,用于连接高清电视、电脑、游戏机、蓝光播放器等设备。它是由HDMI联盟(HDMI Licensing, LLC)制定的,目前已经成为了数字音视频传输的主流标准之一。
HDMI接口支持高清视频、多声道音频和数据传输,可以传输1080p的高清视频和8个声道的高品质音频信号。它采用数字信号传输,避免了模拟信号传输中的信号失真和干扰,保证了高质量的音视频传输效果。
HDMI接口有多种版本,包括HDMI 1.0、HDMI 1.1、HDMI 1.2、HDMI 1.3、HDMI 1.4、HDMI 2.0、HDMI 2.1等。每个版本都有不同的特性和功能,例如支持更高的分辨率、更高的帧率、更多的颜色深度、更高的带宽等。
HDMI接口还支持多种功能,例如CEC(Consumer Electronics Control)控制、ARC(Audio Return Channel)音频回传、Ethernet网络传输等。CEC控制可以让多个设备通过HDMI接口进行互动控制,ARC音频回传可以让电视机通过HDMI接口将音频信号传回音频设备,Ethernet网络传输可以让设备通过HDMI接口进行网络连接。
提示:rk3568 支持HDMI2.0 4K-60fps解码。
a) rk3568 适配 HDMI
b) rk3568 适配过程异常情况
仔细核查HDMI的原理图,会发现供电部分 VCC5V_HDMI_TX,VCC_3V3,无额外供电。
核查SOC HDMI模块,没有复用关系。rk3568一般情况会默认分配 vp0 到HDMI。在rk3568-evb.dtsi
中已经默认开启HDMI,且 VCCA1V8_IMAGE VDDA0V9_IMAGE 供电均已配置在rk809PMIC作匹配。 设备树适配如下:
&hdmi {
status = "okay";
rockchip,phy-table =
<92812500 0x8009 0x0000 0x0270>,
<165000000 0x800b 0x0000 0x026d>,
<185625000 0x800b 0x0000 0x01ed>,
<297000000 0x800b 0x0000 0x01ad>,
<594000000 0x8029 0x0000 0x0088>,
<000000000 0x0000 0x0000 0x0000>;
};
&hdmi_in_vp0 {
status = "okay";
};
&hdmi_in_vp1 {
status = "disabled";
};
&hdmi_sound {
status = "okay";
};
&route_hdmi {
status = "okay";
connect = <&vp0_out_hdmi>;
};
。以设备树中的第一行参数为例
<74250000 0x8009 0x0004 0x0272> ,表示 pixeclock 为 74.25MHz (720p 分辨率) 以下是
PHY_CKSYMTXCTRL 寄存器值为0x8009;PHY_TXTERM 值为 0x0004; PHY_VLEVCTRL 值为 0x0272。如有单独修改可通过 cat /sys/kernel/debug/dw-hdmi/phy
查验是否修改成功。
&hdmi {
status = "okay";
rockchip,cec_enable = <1>;
};
cat /sys/kernel/debug/cec/cec0/status
configured: 0
configuring: 0
phys_addr: f.f.f.f
number of LAs: 0
LA mask: 0x0000
pending transmits: 0
至此 HDMI 内核设备树匹配基本完成,内核相关宏定义默认已经开启无需再处理。
rk3568 系统启动后,HDMI正常注册会生成驱动节点/sys/class/drm/card0-HDMI-A-1
。
ls -l --color
lrwxrwxrwx 1 root root 0 4月 1 13:59 device -> ../../card0
-r--r--r-- 1 root root 4096 4月 1 13:59 dpms
-r--r--r-- 1 root root 0 4月 1 13:59 edid # 连接设备edid
-r--r--r-- 1 root root 4096 4月 1 13:59 enabled # 使能状态
-r--r--r-- 1 root root 4096 4月 1 13:59 modes # HDMI设备支持分辨率列表
drwxr-xr-x 2 root root 0 4月 1 13:59 power
-rw-r--r-- 1 root root 4096 4月 1 13:59 status # 连接状态
lrwxrwxrwx 1 root root 0 4月 1 13:59 subsystem -> ../../../../../../class/drm
-rw-r--r-- 1 root root 4096 4月 1 13:59 ueven
rk3568 内核原因不能在设备树中设置默认分辨率
,比较可惜。
&hdmi {
status = "okay";
rockchip,defaultmode = <4>;
};
看目录结构不难发现不支持调整 颜色模式、3D模式和输出分辨率调整。实际情况就像那句:某天GOD给你关上一扇窗,但又发现他给你开了一扇门。通过 persist.vendor.resolution.main 以及 persist.vendor.resolution.aux 设置主副屏分辨率,每次设置完更新 vendor.display.timeline (每次加 1)再进行移动鼠标等更新UI 的操作使新分辨率生效。
setprop persist.vendor.resolution.main 3840x2160@60-3840-4016-4104-4400-
2160-2168-2178-2250-5
setprop vendor.display.timeline 1
setprop persist.vendor.resolution.main 1920x1080@60-1920-2008-2052-2200-
1080-1084-1089-1125-5
setprop vendor.display.timeline 2
setprop persist.vendor.resolution.main [email protected]
730-750-5
setprop vendor.display.timeline 3
setprop persist.vendor.resolution.main [email protected]
525-a
setprop vendor.display.timeline 4
颜色设置与设置HDMI分辨率相同,通过 persist.vendor.color.main(主) 以及 persist.vendor.color.aux(副) 设置屏颜色,每次设置完更新 vendor.display.timeline (每次加 1) 再进行移动鼠标等更新 UI 的操作使新颜色生效。
persist.vendor.color.main/persist.vendor.color.aux 支持参数:
设置颜色支持 – RGB YUV444 YUV422 YUV420
色深支持 – 8bit 10bit
示例:设置主屏 YUV420(10BIT深度)
setprop persist.vendor.color.main YUV420-8bit
setprop vendor.display.timeline 1
名称 | 有效范围(整形数) | 默认值 | 对应系统属性 |
---|---|---|---|
亮度 | 0~100 | 50 | persist.vendor.brightness.main persist.vendor.brightness.aux |
对比度 | 0~100 | 50 | persist.vendor.contrast.main persist.vendor.contrast.aux |
饱和度 | 0~100 | 50 | persist.vendor.saturation.main persist.vendor.saturation.aux |
色度 | 0~100 | 50 | persist.vendor.hue.main persist.vendor.hue.aux |
同样需要每次设置完更新vendor.display.timeline (每次加 1) 再进行移动鼠标等更新 UI 的操作使新参数生效。
设定副屏幕色度80
setprop persist.vendor.hue.aux 80
setprop vendor.display.timeline 1
HDMI 的 I2C 速率通过 clk 高电平和低电平的时间来调整。
– 强制势能
echo on > /sys/class/drm/card0-HDMI-A-1/status
–强制关闭
echo off > /sys/class/drm/card0-HDMI-A-1/status
– 恢复热拔插检测
echo detect > /sys/class/drm/card0-HDMI-A-1/status
HDMI 硬件查看无非从如下几点排查问题:
connected
,断开后为 disconnected
。cat status
connected
cat enabled
enabled
cat modes
1920x1080
1920x1080
1920x1080
1920x1080i
1920x1080i
1920x1080i
1920x1080
1920x1080i
1600x1200
1680x1050
1400x1050
1600x900
1280x1024
1280x1024
1440x900
1280x960
1152x864
1280x720
1280x720
1280x720
1280x720
1440x576
1440x576
1024x768
1024x768
1024x768
832x624
800x600
800x600
800x600
800x600
720x576
720x576
720x576
720x480
720x480
720x480
720x480
720x480
640x480
640x480
640x480
640x480
640x480
640x480
cat /sys/kernel/debug/dw-hdmi/status
– HDMI Output Status 表示当前 PHY 状态,只有当 PHY 使能的时候才会有后续打印。
– Pixel Clk 表示当前输出的像素时钟。
– TMDS Clk 表示当前输出 HDMI character rate。
– Color Format 表示输出的颜色格式,取值 RGB、YUV444、YUV422、YUV420。
– Color Depth 表示输出的颜色深度,取值 8bit、10bit、12bit、16bit。
– Colorimery 表示输出的颜色标准,取值 ITU.BT601、ITU.BIT709、ITU.BT2020。
– EOTF 表示输出的 HDR 电光转换曲线方式,有如下取值:
EOTF | 含义 |
---|---|
Unsupported | HDMI不支持发送HDR信息 |
Not Defined | 未定义 |
Off | 不发送HDR信息 |
SDR | 采用SDR曲线 |
ST2084 | 采用ST2084 EOTF曲线 |
HLG | 采用HLG EOTF曲线 |
cat /sys/kenrel/debug/dw-hdmi/ctrl
echo 1000 ed > /sys/kenrel/debug/dw-hdmi/ctrl
rockchip,phy-table
参数。活学活用,做个合格的搬运工。