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.conf99-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自动切真实显示,运行中热插拔自动响应,全程无需手动干预。

posted @ 2026-06-12 12:45  rambos1996  阅读(42)  评论(0)    收藏  举报