RK3588S 开发板:Sunshine串流与HDMI显示共存方案
RK3588S 开发板:Sunshine串流与HDMI显示共存方案
前言
手头有一块Firefly ROC-RK3588S-PC,日常通过Sunshine+Moonlight串流使用。某天需要直接接显示器调试,插上HDMI发现黑屏,折腾了一圈,记录完整排查过程。
问题现象
开机接HDMI显示器,启动时能看到Firefly logo,随后黑屏。SSH进去跑xrandr只有一个虚拟default输出,没有真实HDMI输出。
排查过程
查Xorg日志定位原因:
cat /var/log/Xorg.0.log | grep -iE "hdmi|drm"
关键输出:
(II) modeset(G0): Output HDMI-1-1 using monitor section DummyMonitor
继续找配置文件:
grep -r "DummyMonitor" /etc/X11/
找到/etc/X11/xorg.conf.d/10-dummy.conf和99-dummy.conf,这是Sunshine串流的标准配置——用dummy驱动创建虚拟帧缓冲供Sunshine捕获,副作用是完全接管了显示输出,HDMI永远黑屏。
解决思路
直接删dummy配置能让HDMI有画面,但Sunshine串流废了。需要两者共存:插HDMI时切真实显示,拔掉时切回dummy串流。
用udev监听HDMI热插拔事件自动触发切换,用systemd服务处理开机初始状态。
实现
自动切换脚本 hdmi-switch.sh
切换逻辑很简单,检测/sys/class/drm/*/status判断HDMI是否connected,有就备份dummy配置并重启lightdm,没有就恢复dummy配置重启lightdm并启动Sunshine。
启动Sunshine必须用su - firefly而不是直接调用,因为udev脚本以root运行,直接启动会导致Sunshine读/root/.config/sunshine/而非用户配置,串流失效。
udev规则
sudo tee /etc/udev/rules.d/99-hdmi-switch.rules << 'EOF'
ACTION=="change", SUBSYSTEM=="drm", RUN+="/home/firefly/hdmi-switch.sh"
EOF
sudo udevadm control --reload-rules
udev纯事件驱动,平时零消耗。
开机检测服务
udev只响应热插拔,开机时已接显示器不会触发,需要systemd服务开机跑一次hdmi-switch.sh做初始判断。
踩坑记录
sunshine.sh不要用sudo运行,会导致/tmp/sunshine.log和/tmp/sunshine.pid被root占用,下次普通用户启动报Permission denied。在start里加两行清理解决:
rm -f /tmp/sunshine.log /tmp/sunshine.pid 2>/dev/null
sudo rm -f /tmp/sunshine.log /tmp/sunshine.pid 2>/dev/null
HDMI切换死循环问题:想手动切HDMI模式,但需要SSH输入命令,SSH要接主机显示器,接了主机就没法插板子显示器。udev自动切换从根本上绕开了这个问题。
最终效果
开机无HDMI自动进串流模式,开机有HDMI自动切真实显示,运行中热插拔自动响应,全程无需手动干预。

浙公网安备 33010602011771号