rk3568 Android11/12 适配HDMI
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解码。
文章目录
- rk3568 Android11/12 适配HDMI
- 圈重点 看想学
- 1. rk3568 适配 HDMI
- 1.1 核查原理图,适配 HDMI
- 1.2 HDMI显示分辨率调整
- 1.3 HDMI 色彩设置
- 1.4 HDMI 设置亮度、对比度、饱和度、色度
- 1.4 HDMI 调整 DDC
- 1.5 HDMI工作模式
- 2 调试过程排查方法
- 2.1 硬件排查
- 2.2 软件排查方法
- Tips
- 总结
圈重点 看想学
a) rk3568 适配 HDMI
b) rk3568 适配过程异常情况
1. rk3568 适配 HDMI
仔细核查HDMI的原理图,会发现供电部分 VCC5V_HDMI_TX,VCC_3V3,无额外供电。
1.1 核查原理图,适配 HDMI
核查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>;
};
- HDMI 信号强度配置
HDMI 信号强度可通过 dts 的 rockchip.phy-table 属性配置,格式定义:<PIXELCLOCK PHY_CKSYMTXCTRL PHY_TXTERM PHY_VLEVCTRL>
。
- PIXELCLOCK 表示该行参数所对应的最大 pixelclock 频率。
- PHY_CKSYMTXCTRL 寄存器 (0x09) 值用于调整 HDMI 信号的预加重和上升斜率,加大预加重或 sloop
boost,可以提升 DATA 信号的上升/下降斜率,但会降低信号的上升/下降时间:
Bit[0]:CLOCK 信号使能。
Bit[3:1]:DATA 信号预加重。
Bit[4:5]:DATA 信号sloop boost。 - PHY_TXTERM 寄存器 (0x19) 值用于调整端接电阻值
Bit[0:2]:值越大,端接电阻值越大。 - PHY_VLEVCTRL寄存器 (0x0e) 值用于调整 HDMI 的信号幅度,具体定义如下:Bit[0:4] : tmds_clk +/- 信
号幅度,值越低,信号幅度越大;
Bit[5:9]: tmds_data +/- 信号幅度,值越低,信号幅度越大。
以设备树中的第一行参数为例
<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 CEC功能,修改如下:
&hdmi {
status = "okay";
rockchip,cec_enable = <1>;
};
- 查看CEC状态
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
- configured 表示 cec adapter 是否配置完毕,1 为配置完毕,0 为未完毕。
- configuring 表示 cec adapter 是否正在配置,1 为正在,0 为配置完毕或未开始配置。
- phys_addr 表示 cec 的物理地址,未获取物理地址时为 f.f.f.f。
- number of LAs 表示该 cec 设备的逻辑地址数量,大部分设备为 1,极少数为 2。
- LA mask 表示当前绑定的逻辑地址,具体取值为(1 << 绑定的逻辑地址)。如:取值为 0x0010
时,右移 4 位后为 1,则说明当前的逻辑地址为 4,取值为 0x0800 时,右移 11 位后为 1,则说明
当前的逻辑地址为 11.如未绑定任何逻辑地址时为 0x0000。 - has CEC follower 表示当前收到的 cec 消息交由上层用户空间处理,in passthrough mode 表示
kernel 不会处理 cec core message,而是全部上报给上层用户空间处理。 - pending transmits 表示当前还有多少待发送的 cec 消息
至此 HDMI 内核设备树匹配基本完成,内核相关宏定义默认已经开启无需再处理。
1.2 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 的操作使新分辨率生效。
- 设置4k60:
setprop persist.vendor.resolution.main 3840x2160@60-3840-4016-4104-4400-
2160-2168-2178-2250-5
setprop vendor.display.timeline 1
- 设置1080p60:
setprop persist.vendor.resolution.main 1920x1080@60-1920-2008-2052-2200-
1080-1084-1089-1125-5
setprop vendor.display.timeline 2
- 设置720P60:
setprop persist.vendor.resolution.main 1280x720@60.00-1390-1430-1650-725-
730-750-5
setprop vendor.display.timeline 3
- 设置480P60:
setprop persist.vendor.resolution.main 720x480@59.94-736-798-858-489-495-
525-a
setprop vendor.display.timeline 4
1.3 HDMI 色彩设置
颜色设置与设置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
1.4 HDMI 设置亮度、对比度、饱和度、色度
名称 | 有效范围(整形数) | 默认值 | 对应系统属性 |
---|---|---|---|
亮度 | 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
1.4 HDMI 调整 DDC
HDMI 的 I2C 速率通过 clk 高电平和低电平的时间来调整。
- I2C 速率为 50 KHz
&hdmi {
ddc-i2c-scl-high-time-ns = <9625>;
ddc-i2c-scl-low-time-ns = <10000>;
} - I2C 速率为 100 KHz
&hdmi {
ddc-i2c-scl-high-time-ns = <4812>;
ddc-i2c-scl-low-time-ns = <5000>;
}
1.5 HDMI工作模式
– 强制势能
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
2 调试过程排查方法
2.1 硬件排查
HDMI 硬件查看无非从如下几点排查问题:
- 核查供电
VCCA1V8_IMAGE VDDA0V9_IMAGE VCC5V_HDMI_TX VCC_3V3电压是否正常 - 核查HPD
HDMI接入和拔出 HPD 是否有高低电平变化
2.2 软件排查方法
- 核查 HDMI 连接状态,接入后为
connected
,断开后为disconnected
。
cat status
connected
- 核查 HDMI 使能状态
cat enabled
enabled
- 核查 HDMI 分辨率模式
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
- 查看 HDMI 连接状态
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曲线 |
- (x0,y0)、(x1,y1)、(x2,y2)、(white x,white y)、max lum、min lum、max cll、maxfall为静
态 HDR 描述子信息,只有 EOTF值为 SDR、ST2084、HLG 值时才会存在。
可通过命令读写 HDMI寄存器 - 读寄存器
cat /sys/kenrel/debug/dw-hdmi/ctrl
- 写寄存器,0x1008 寄存器写入 0xED
echo 1000 ed > /sys/kenrel/debug/dw-hdmi/ctrl
Tips
- BSP 调试过程始终黑屏
尝试以上两种软件排查后,发现HDMI接入后可正常检测到且正常识别分辨率;示波器检测有信号输出。尝试降低分辨率和更换HDMI线材,仍然黑屏,这是需要检查硬件。 - 黑屏或者花屏,降低分辨后显示正常
– 软件确认HDMI设备分辨率是否为特殊分辨率,特殊分辨率需要单独添加。
– 测试HDMI信号质量,调整方法可通过调整rockchip,phy-table
参数。
总结
活学活用,做个合格的搬运工。