[RK3399][Android7.1] HDMI显示屏(副屏)调试记录小结

Platform: RK3399
OS: Android 7.1
Kernel: v4.4.83

驱动文件:

dw-hdmi.c: HDMI驱动,包括内部I2C接口实现。
drm_edid.c: edid相关。
dw_hdmi-rockchip.c: drm框架部分。


探测引脚

HPD(Hotplug Dectect)用于监测HDMI设备是否存在,为high那么可以通过DDC去读EDID,HDMI有规定在HDMI 5vAC断电时source device可以读reciever device的EDID,也就是需要Hotplug为High。其中有两种Hotplug相关的情况会导致HDMI被识别为DVI:

  • Hotplug为High,不过EDID并没有准备好,那么信号源设备会由于无法读到EDID而认为接收设备为DVI,这样会导致HDMI有图像无声的问题。
  • Hotplug为Low,也会导致信号源无法读到EDID而认为接收设备为DVI,从而导致HDMI有图无声。

插拔是否成功可以在check_hdmi_irq()@dw-hdmi.c中打印log。


I2C部分:

I2C主要用于读取EDID,内部框图如下:
[RK3399][Android7.1] HDMI显示屏(副屏)调试记录小结_第1张图片

分内部I2C和普通I2C两种。
普通的I2C可以配置到任何一路,和正常外设使用一样。DTS配置ddc-i2c-bus属性即可:

&hdmi {
	status = "okay";
	ddc-i2c-bus = <&i2c4>;	//选择硬件对应使用的I2C
};

内部的I2C只能使用I2C3, 可以从寄存器文档得知:
[RK3399][Android7.1] HDMI显示屏(副屏)调试记录小结_第2张图片
对应DTS配置:

hdmi:hdmi@ff940000 {
	......
	pinctrl-names = "default";
	pinctrl-0 = <&hdmi_i2c_xfer>;
	......
}
hdmi {
	hdmi_i2c_xfer: hdmi-i2c-xfer {
		rockchip,pins =
			<4 17 RK_FUNC_3 &pcfg_pull_none>,
			<4 16 RK_FUNC_3 &pcfg_pull_none>;
	};
};

如果使用了内部I2C,普通的I2C是无法使用的。(被复用了)
如果使用了普通I2C,也需要把pinctrl-0属性给注释掉,否则会导致普通I2C无法正常使用。

代码逻辑上优先使用普通I2C。

不管是内部还是普通I2C,都可以在HDMI的I2C引脚测量到信号。一开始我看框图以为是普通I2C才会有信号。


EDID读取:

rk3399_mid:/sys/class/drm/card0-HDMI-A-1 # cat edid > /data/edid.bin
如果I2C不通,那么读取失败为空,读取成功则是二进制文件。

EDID读取失败之后CPU端无法得知HDMI屏支持的分辨率,默认会选择一组分辨率(当前是1024x768)进行显示。


分辨率:

屏幕支持分辨率读取:

rk3399_mid:/sys/class/drm/card0-HDMI-A-1 # cat modes
1600x900p60
1920x1080p60
1920x1080p60
1920x1080i60
1920x1080i60
1920x1080p50
1920x1080i50
1280x960p60
1360x768p60
1280x800p60
1280x720p60
1280x720p60
1280x720p50
1024x768p75
1024x768p70
1024x768p60
800x600p75
800x600p72
800x600p60
800x600p56
720x576p50
720x576i50
720x480p60
720x480p60
720x480i60
720x480i60
640x480p75
640x480p73
640x480p60
640x480p60
720x400p70

当前分辨率读取:

rk3399_mid:/sys/class/drm/card0-HDMI-A-1 # cat mode
640x480p75

分辨率设置:

  1. 通过settings -> display -> HDMI
  2. 通过命令行
    如:
    set persist.sys.resolution.aux 1024x768@60
    每次设置完更新 sys.display.timeline(每次加 1)使分辨率生效
    setprop sys.display.timeline 1

参考:

https://zh.wikipedia.org/wiki/EDID
HDMI介绍与流程
Rockchip 基于DRM框架的HDMI开发指南 v1.2-20190226.pdf

你可能感兴趣的:(RK3399,子类__Display)