在使用全志HDMI时,发现显示无画面。
一、模块功能配置
1、配置HDMI
在menuconfig中,配置打开“DISP Driver Support”和 “HDMI2.0 Driver Support”选项
Allwinner BSP ‑‑‑>
Device Drivers ‑‑‑>
Video Drivers ‑‑‑>
<*> DISP Driver Support(sunxi‑disp2)
<*> HDMI Tx Driver Support(sunxi‑disp2) ‑‑‑>
<*> HDMI2.0 Driver Support(sunxi‑disp2) ‑‑‑
2、在 board.dts中,配置hdmi节点的状态为okay
3、显示配置
disp_mode :(0:screen0<screen0,fb0>)
screenx_output_type:(0:none; 1:lcd; 2:tv; 3:hdmi;5:vdpo)
screenx_output_mode:(used for hdmi output, 0:480i 1:576i 2:480p 3:576p 4:720p50 5:720p60 0x5d:720p25 6:1080i50 7:1080i60 8:1080p24 9:1080p50 10:1080p60)
devX_output_type : (0:none; 1:lcd; 2:tv; 4:hdmi;)
(1)uboot-board.dts
&disp {
disp_init_enable = <1>;
disp_mode = <0>;
screen0_output_type = <4>;
screen0_output_mode = <5>;
screen0_to_lcd_index = <2>;
......
dev0_output_type = <4>;
dev0_output_mode = <5>;
dev0_screen_id = <0>;
dev0_do_hpd = <1>;
......
};
(2)board.dts
配置项同uboot保持一致
&disp {
disp_init_enable = <1>;
disp_mode = <0>;
screen0_output_type = <4>;
screen0_output_mode = <5>;
screen0_to_lcd_index = <2>;
......
dev0_output_type = <4>;
dev0_output_mode = <5>;
dev0_screen_id = <0>;
dev0_do_hpd = <1>;
......
};
二、调试方式
1、查看HDMI模块加载成功
(1)查看相关sysfs路径
cd /sys/class/hdmi/hdmi/attr

(2)查看相关设备节点
ls /dev/hdmi

上述径存在说明HDMI模块加载成功。反之则HDMI模块加载不成功
(3)显示框架
cat /sys/class/disp/disp/attr/sys,从显示框架上查看显示是否是切换到hdmi输出。

2、获取hdmi相关日志信息
HDMI异常日志信息
root@Longan:/$ dmesg |grep hdmi
[ 0.844539] sunxi:hdmi20:[WARN]: [ warn] read hdmi_log_mem array failed!
[ 0.844543] sunxi:hdmi20:[INFO]: [ info] Get uboot hdmi log failed, malloc a new buffer...
[ 0.844554] sunxi:hdmi20:[INFO]: [ info] aw_hdmi_drv_probe: start.
[ 0.844592] sunxi:hdmi20:[ERR]: [error] _aw_hdmi_dts_parse_pin_config: ddc can not get pinctrl
[ 0.844623] sunxi:hdmi20:[INFO]: [ info] get hdmi power0: bldo3 is success.
[ 0.844786] sunxi:hdmi20:[INFO]: [ info] boot hdmi is on
[ 0.844907] sunxi:hdmi20:[INFO]: [ info] _aw_disp_hdmi_set_static_config: start.
[ 0.844911] sunxi:hdmi20:[INFO]: [ info] [HDMI receive params]: tv mode: 0x5d format:0x0 data bits:0x0 eotf:0x4 cs:0x101 dvi_hdmi:2 range:2 scan:0 aspect_ratio:8
[ 0.844930] sunxi:disp:[WARN]: [DE]: hdmi_set_mode is null
[ 0.844933] sunxi:hdmi20:[INFO]: [ info] _aw_disp_hdmi_get_video_timming_info: start.
[ 0.845223] sunxi:hdmi20:[INFO]: [ info] aw_hdmi_drv_probe: finish.
[ 0.845571] sunxi:hdmi20:[INFO]: [ info] hdmi module init end.
HDMI正常使用日志信息
root@Longan:/$ dmesg |grep hdmi
[ 0.844604] sunxi:hdmi20:[WARN]: [ warn] read hdmi_log_mem array failed!
[ 0.844608] sunxi:hdmi20:[INFO]: [ info] Get uboot hdmi log failed, malloc a new buffer...
[ 0.844620] sunxi:hdmi20:[INFO]: [ info] aw_hdmi_drv_probe: start.
[ 0.844659] sunxi:hdmi20:[ERR]: [error] _aw_hdmi_dts_parse_pin_config: ddc can not get pinctrl
[ 0.844692] sunxi:hdmi20:[INFO]: [ info] get hdmi power0: bldo3 is success.
[ 0.844872] sunxi:hdmi20:[INFO]: [ info] boot hdmi is on
[ 0.844976] sunxi:hdmi20:[INFO]: [ info] aw_hdmi_drv_probe: finish.
[ 0.845299] sunxi:hdmi20:[INFO]: [ info] hdmi module init end.
[ 0.845815] sunxi:hdmi20:[INFO]: [ info] _aw_disp_hdmi_set_static_config: start.
[ 0.845819] sunxi:hdmi20:[INFO]: [ info] [HDMI receive params]: tv mode: 0x5d format:0x0 data bits:0x0 eotf:0x4 cs:0x101 dvi_hdmi:2 range:2 scan:0 aspect_ratio:8
[ 0.845837] sunxi:disp:[WARN]: [DE]: hdmi_set_mode is null
[ 0.845840] sunxi:hdmi20:[INFO]: [ info] _aw_disp_hdmi_get_video_timming_info: start.
[ 1.044990] sunxi:hdmi20:[INFO]: [ info] HDMI cable is connected
[ 1.045023] sunxi:hdmi20:[ERR]: [error] _i2cm_read8: I2C DDC Read8 extended failed for i2cAddr 0x50 seg 0x30 pointer 0x0 addr 0x0
[ 1.110410] sunxi:hdmi20:[WARN]: [ warn] sink do not support this mode: 108
对比日志发现,缺少HDMI连接部分。
万用表测量HDMI部分5V 3.3V供电均正常。
3、查看HDMI连接状态
cat /sys/class/hdmi/hdmi/attr/hdmi_source

在输出日志中找到HPD字样如果打印HPD: 1,表明HDMI检测到插入;如果打印HPD: 0,表明HDMI未检测到插入
4、查看 rxsense状态
在输出日志中找到rxsense字样

如果打印rxsense: 1,表明HDMI检测到rxsense有正常拉高, TMDS数据能正常传输。
如果打印rxsense: 0,表明HDMI检测到rxsense有异常未拉高, TMDS数据不能传输
5、排查硬件特性
使用示波器测量5V,HPD,Tmds相关Pin 是否正常
•如果没有5V,那么需要Tx 端排查硬件电路;
•如果没有HPD但有5V,那么基本定性是Rx 端问题,未能拉高HPD;
•如果TMDS幅值没拉高,那么基本定性是Rx 端问题,未能拉高TMDS;
•测量TMDS CLK Pin的时钟频率,看是否与当前的符合
测量HPD脚

R120电阻,左端为3.8V,右端为0V。拔下HDMI R120左端电压无变化,右端电压为0.8V。
HDMI_HPD 信号是一个热插拔检测信号,其正常工作原理如下:
-
在 HDMI 未连接到设备时,HDMI_HPD 应为低电平
-
在 HDMI 插头连接到设备时,HDMI_HPD 信号被拉高到高电平
去掉R120,无作用。
设备树中可配置hpd

不会影响正常的信号识别,但为什么插上无信号?
硬件排查后正常,更换HDMI显示设备后,能正常识别信号。
(注:之前的HDMI设备经过转接头连接,可能导致协议的变化。尽可能保证直接连接,若以后遇到同样问题,可作为排查点之一)
6、显示屏只能输出60FPS
uboot-board.dts中修改显示

修改如下:
@@ -798,7 +798,7 @@
disp_mode = <0>;
screen0_output_type = <4>;
- screen0_output_mode = <0x5d>;
+ screen0_output_mode = <5>;
screen0_to_lcd_index = <2>;
screen0_output_format = <0>;
@@ -817,7 +817,7 @@
dev_num = <1>;
dev0_output_type = <4>;
- dev0_output_mode = <0x5d>;
+ dev0_output_mode = <5>;
dev0_screen_id = <0>;
dev0_do_hpd = <1>;
正常显示!!!!