1. RK3399 HDMI显示异常问题概述
最近在调试RK3399开发板时遇到了一个典型问题:Ubuntu 20.04系统下HDMI接口无法正常显示输出。这个问题在嵌入式开发中相当常见,特别是当系统同时连接多个显示设备时。我的开发环境配置是LVDS屏幕通过GM8775C转换芯片连接到dsi0接口,分辨率1280x800,同时HDMI接口连接1920x1080显示器。
系统启动后,dmesg日志中不断出现DPI像素负载FIFO溢出的错误提示。这类错误通常与视频输出处理器(VOP)的资源配置有关。RK3399芯片内置两个VOP(vopb和vopl),它们负责管理不同显示接口的输出。当多个显示设备同时工作时,VOP资源的分配就显得尤为重要。
2. 初步排查与错误分析
2.1 日志分析与问题定位
首先查看系统日志,发现大量重复的错误信息:
[ 129.133762] dw-mipi-dsi ff960000.dsi: An overflow occurs in the DPI pixel payload FIFO [ 129.141756] dw-mipi-dsi ff960000.dsi: Host reports timeout...这些错误表明DSI接口的数据传输出现了问题。FIFO溢出通常意味着数据传输速率不匹配或者时序配置不当。考虑到RK3399的架构特点,这很可能与VOP的资源分配有关。
2.2 VOP资源分配原理
RK3399的两个VOP具有不同的特性:
- vopb(VOP big):支持更高分辨率的输出
- vopl(VOP little):资源相对较少
默认配置中,DSI接口使用vopb,HDMI使用vopl。这种配置在单一显示输出时工作正常,但在双屏模式下就可能出现问题。特别是当两个显示设备分辨率差异较大时,更容易引发资源冲突。
3. VOP配置调优方案
3.1 初始配置分析
原始的设备树配置如下:
&dsi_in_vopl { status = "disabled"; }; &dsi_in_vopb { status = "okay"; }; &route_dsi { connect = <&vopb_out_dsi>; }; &hdmi_in_vopl{ status = "okay"; }; &hdmi_in_vopb{ status = "disabled"; };这种配置让DSI使用vopb,HDMI使用vopl。理论上应该可行,但实际出现了前述的FIFO溢出问题。
3.2 配置调优实践
尝试交换VOP分配方案:
&dsi_in_vopl { status = "okay"; }; &dsi_in_vopb { status = "disabled"; }; &route_dsi { connect = <&vopl_out_dsi>; }; &hdmi_in_vopl{ status = "disabled"; }; &hdmi_in_vopb{ status = "okay"; };这样修改后,HDMI显示立即恢复正常。这说明vopb更适合驱动HDMI的高分辨率输出,而vopl足以应对DSI接口的较低分辨率需求。
4. 多屏显示分辨率适配
4.1 新问题的出现
VOP配置调整后,HDMI可以显示了,但又遇到了新的问题:两个屏幕分辨率不一致导致显示异常。主屏(DSI)是1280x800,副屏(HDMI)是1920x1080,直接扩展桌面会导致布局混乱。
4.2 xrandr解决方案
使用xrandr工具可以灵活控制多显示器配置:
xrandr --output DSI-1 --auto --output HDMI-1 --mode 1280x800 --same-as DSI-1这条命令让HDMI显示器使用与DSI相同的分辨率,并镜像显示。但直接放入rc.local无法正常工作,因为启动时显示设备可能还未就绪。
4.3 可靠的启动脚本方案
创建/etc/rc.local的可靠解决方案:
- 创建脚本/usr/bin/xrandr_hdmi.sh:
#!/bin/bash xrandr --output DSI-1 --auto --output HDMI-1 --mode 1280x800 --same-as DSI-1- 修改/etc/rc.local:
sleep 4 sudo su - root -c "/usr/bin/xrandr_hdmi.sh&"关键点:
- sleep 4确保显示设备完全初始化
- 必须在开发板上直接创建脚本,避免文件格式或权限问题
- 测试发现sleep 3可能不够,4秒更可靠
5. 深入分析与进阶建议
5.1 问题根源分析
这个案例揭示了RK3399视频输出子系统的几个关键特性:
- VOP资源是有限的,需要合理分配
- 高分辨率显示器应优先分配给性能更强的vopb
- 系统启动时显示设备的初始化需要时间
5.2 更优的解决方案探索
当前方案仍有改进空间:
- 可以考虑编写udev规则,在HDMI热插拔时自动调整配置
- 修改显示管理器配置,实现更优雅的多显示器支持
- 定制Xorg配置,避免依赖脚本解决方案
5.3 性能优化建议
对于需要高性能图形应用的场景:
- 确保vopb分配给主要显示输出
- 合理设置clock和phy参数
- 考虑使用DRM/KMS直接配置显示输出
在实际项目中,这类显示问题往往需要结合硬件特性和软件配置综合分析。RK3399的VOP系统虽然灵活,但也需要开发者深入理解其工作原理才能充分发挥性能。