Arduino UNO Q – Kein Videosignal über USB-C DisplayPort Alt Mode wegen falschem bevorzugtem Displaymodus
Kurzfassung
Ich hatte ein Problem mit meinem Arduino UNO Q: Das Board bootete korrekt in Debian und war vollständig per SSH/Netzwerk erreichbar, aber über USB-C DisplayPort Alt Mode wurde auf keinem Monitor ein Bild angezeigt.
Der Monitor zeigte immer nur:
No Signal
und ging danach in den Standby-Modus.
Nach weiterer Fehlersuche stellte sich heraus, dass der Displayausgang grundsätzlich funktioniert. Das Problem war der automatisch gewählte bevorzugte Displaymodus des Monitors:
1024x600 @ 59.85 Hz
Dieser Modus wurde von Linux korrekt erkannt und auch als aktiv gesetzt, erzeugte aber über mein USB-C-Hub-/HDMI-Setup kein nutzbares Bildsignal.
Sobald ich manuell folgenden Modus erzwungen habe:
1920x1080 @ 60 Hz
war sofort ein Bild sichtbar.
Hardware / Setup
Verwendete Hardware:
- Board: Arduino UNO Q
- Betriebssystem: offizielles Arduino Debian Image
- Kernel:
Linux dashboard 7.0.0-g122c2c22d838
Display-Verkabelung:
Arduino UNO Q
→ USB-C DisplayPort Alt Mode
→ USB-C-Hub mit HDMI-Ausgang
→ HDMI-Monitor
Getestete Hardware:
- Anker 332 USB-C Hub 5-in-1
- weiterer USB-C-Hub mit HDMI-Ausgang
- HAMTYSAN 10.1" HDMI-Monitor mit 1024x600
- normaler HDMI-PC-Monitor
- mehrere HDMI-Kabel
Beide Monitore funktionieren an einem normalen Windows-PC problemlos.
Ursprüngliches Fehlerbild
Der UNO Q bootete normal. Folgende Dinge funktionierten:
- Debian Linux
- SSH
- WLAN
- USB
- Xorg
- LightDM
- XFCE
Trotzdem zeigte der Monitor immer:
No Signal
Das System war also vollständig erreichbar, aber lokal war kein Bild sichtbar.
Erste Diagnose
Die Grafikdiagnose sah zunächst so aus, als wäre alles korrekt initialisiert.
modetest und xrandr zeigten:
DP-1 connected
link-status: Good
DPMS: On
EDID erkannt
Der bevorzugte erkannte Modus war:
1024x600 @ 59.85 Hz
xrandr zeigte sinngemäß:
Screen 0: minimum 320 x 200, current 1024 x 600, maximum 16383 x 16383
DP-1 connected primary 1024x600+0+0
1024x600 59.85*+
1920x1080 60.00
1280x720 60.00
...
Aus Linux-Sicht war der Monitor also verbunden, EDID wurde gelesen, und ein aktiver Displaymodus war gesetzt. Trotzdem blieb der Bildschirm schwarz beziehungsweise zeigte „No Signal“.
Entscheidender Fund
Per SSH habe ich dann folgenden Befehl ausgeführt:
sudo env DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 \
xrandr --output DP-1 --mode 1920x1080 --rate 60
Danach war sofort ein Bild sichtbar.
Damit war klar:
- Der USB-C-/DisplayPort-Alt-Mode-Ausgang funktioniert grundsätzlich.
- Der HDMI-Hub kann ein Bild ausgeben.
- Der Monitor kann ein gültiges Signal empfangen.
- Der UNO Q Displayausgang ist sehr wahrscheinlich nicht defekt.
Das eigentliche Problem war offenbar der automatisch gewählte bevorzugte Modus:
1024x600 @ 59.85 Hz
Dieser Modus wurde von Linux zwar als gültig erkannt und aktiviert, führte aber in meiner USB-C-DisplayPort-Alt-Mode-zu-HDMI-Kette zu keinem sichtbaren Signal.
Der Standardmodus:
1920x1080 @ 60 Hz
funktioniert dagegen zuverlässig.
Xauthority-Problem bei xrandr über SSH
Zuerst habe ich versucht:
sudo DISPLAY=:0 XAUTHORITY=/var/lib/lightdm/.Xauthority xrandr
Das funktionierte in einem Zustand, schlug später aber fehl mit:
Authorization required, but no authorization protocol specified
Can't open display :0
Die richtige Xauthority-Datei habe ich über den laufenden Xorg-Prozess gefunden:
ps aux | grep -E "Xorg|X " | grep -v grep
Ausgabe:
/usr/lib/xorg/Xorg :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
Deshalb war der funktionierende Befehl:
sudo env DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 \
xrandr --output DP-1 --mode 1920x1080 --rate 60
Dauerhafter Workaround
Damit ich den Befehl nicht nach jedem Start manuell per SSH ausführen muss, habe ich ein Script angelegt:
sudo nano /usr/local/bin/fix-display-mode.sh
Inhalt:
#!/bin/sh
sleep 4
env DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 \
/usr/bin/xrandr --output DP-1 --mode 1920x1080 --rate 60
exit 0
Dann ausführbar gemacht:
sudo chmod +x /usr/local/bin/fix-display-mode.sh
Danach habe ich einen systemd-Service erstellt:
sudo nano /etc/systemd/system/fix-display-mode.service
Inhalt:
[Unit]
Description=Force working display mode on DP-1
After=lightdm.service
Wants=lightdm.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/fix-display-mode.sh
RemainAfterExit=yes
[Install]
WantedBy=graphical.target
Service aktiviert und gestartet:
sudo systemctl daemon-reload
sudo systemctl enable fix-display-mode.service
sudo systemctl start fix-display-mode.service
Statusprüfung:
systemctl status fix-display-mode.service
Der Service läuft erfolgreich:
Active: active (exited)
ExecStart=/usr/local/bin/fix-display-mode.sh (code=exited, status=0/SUCCESS)
Nach einem Reboot erscheint das Bild nun automatisch.
Skalierung / DPI-Anpassung
Nach dem Erzwingen von 1920x1080 war das Bild sichtbar, aber die Oberfläche war zu klein. Deshalb habe ich in XFCE die DPI auf 144 gesetzt, was ungefähr einer 1,5-fachen Skalierung entspricht.
Dafür musste zuerst dbus-x11 installiert werden:
sudo apt install dbus-x11
Dann habe ich die DPI gesetzt:
sudo -u arduino DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 \
xfconf-query -c xsettings -p /Xft/DPI -n -t int -s 144
Prüfung:
sudo -u arduino DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 \
xfconf-query -c xsettings -p /Xft/DPI
Ausgabe:
144
Fazit
Das ursprüngliche Problem sah zunächst aus wie ein kompletter Ausfall des Videoausgangs, weil der Monitor nur „No Signal“ angezeigt hat.
Tatsächlich funktionierte der Displaypfad aber grundsätzlich. Das Problem war der automatisch ausgewählte bevorzugte EDID-Modus:
1024x600 @ 59.85 Hz
Dieser wurde von Linux erkannt und als aktiv gesetzt, erzeugte aber über mein USB-C-DisplayPort-Alt-Mode-zu-HDMI-Setup kein nutzbares Signal.
Das Erzwingen von:
1920x1080 @ 60 Hz
behebt das Problem.
Mögliche Ursachen:
- EDID-/Preferred-Mode-Problem
- Timing-Inkompatibilität mit 1024x600 @ 59.85 Hz
- Problem bei USB-C DisplayPort Alt Mode zu HDMI-Konvertierung
- Kernel-/DRM-/Bridge-Treiber-Verhalten beim automatischen Moduswechsel
Der aktuelle Workaround besteht darin, nach dem Start von LightDM automatisch per xrandr den funktionierenden Modus 1920x1080 @ 60 Hz zu setzen.
Ich hoffe ich konnte damit etwas weiterhelfen.
Falls jemand eine bessere Lösung findet, darf er gerne dieses Thema erweitern oder einfach den genannten Lösungsweg für sich probieren, falls er oder sie, ebenfalls auf die genannten Probleme stößt.