最近在树莓派4b上装了retropie,并且专门在网上购买了一块7寸的电子屏,想把它打造成一个便携式的街机。不料开机后发现,此电子屏一直显示No signal,于是开始调试这个问题。
1、首先怀疑电子屏是否损坏。通过电视和switch,发现电子屏并没有损坏。
2、是否供电不足。查阅文档,发现它可以在树莓派系列中跑起来。它使用树莓派USB供电足矣。
3、是否系统导致。在排查过程中,发现最开始是可以直接进入shell的,接下来shell会直接进入retropie。显示屏可以显示出shell的内容,甚至如果是shell直接进桌面而不进retropie,显示屏也是可以显示的。这说明在初次进入retropie的时候发生了一些故障,导致显示屏无法接收信号。
查阅文档发现,树莓派引导时是禁用掉了强制热拔插功能的,这可能会导致HDMI失效,于是通过SSH调用下列命令修改引导设置:
sudo nano /boot/config.txt
找到下面一行:
# uncomment if hdmi display is not detected and composite is being output
# hdmi_force_hotplug=1
可以看到,hdmi_force_hotplugin最开始是禁用掉的,把#去掉,重启启用这个特性:
# uncomment if hdmi display is not detected and composite is being output
hdmi_force_hotplug=1
重启之后发现,显示屏有时候可以显示retropie,有时候则仍然是no signal。后来发现,在进入retropie之后,要手动拔插USB接口,强行重置显示屏才能正常显示。作为一个程序员,手动拔插是不可忍受的,我需要一个脚本,在开机的时候重置USB接口。
调查后发现,github上有一个很好的管理usbhub的程序,叫做uhubctl。
首先clone这个库:
git clone /mvp/uhubctl.git
接下来编译它:
make
生成的uhubctl,拷贝到/usr/bin中,好通过bash调用它。
接下来,修改retropie自启动脚本:
sudo nano /opt/retropie/configs/all/autostart.sh
改为下面内容:
echo Reseting USB devices...
sudo uhubctl -a 0 -l 2
sudo uhubctl -a 1 -l 2
emulationstation #auto
第二行表示关闭树莓派后侧usb所有接口,第三行表示重新开启那些接口。
接着开机,经过短暂的no signal,总算显示屏上浮现出了retropie的主界面:
完。