Diesmal wieder ein umfangreiches Tutorial 🙂
Auf meiner Workstation nutze ich eine NVIDIA GeForce GTX 470 mit zwei per DVI angeschlossenen Monitoren, einen 24″ Samsung als Primärbildschirm und einen alten 19″ HannsG HX191D als Sekundärbildschirm. Diese Kombination lief lange Zeit problemlos – bis vor ein paar Wochen.
Wie Sie sehen, sehen Sie nichts!
Auf meiner Dual-Boot-Installation führte ich unter Windows 7 ein Treiberupgrade der GeForce-Treiber auf die Version 334.89 durch. Nach einem Reboot wurde der sekundäre Monitor (HX191D) nicht mehr erkannt, kurz flackerte ein Bild auf, danach blieb das Device tot und wurde nicht mehr erkannt. Die anschließende Fehlersuche gestaltete sich als schwieriges Unterfangen, es ließen sich keinerlei Hinweise auf eine Fehlfunktion feststellen – Windows wollte den Monitor nur partout nicht mehr ansprechen. Irgendwann gab ich es auf und installierte wieder die vorherige Treiberversion.
Fehlersuche unter Linux
In der Hoffnung, einen Hinweis auf die Treiberproblematik zu finden, durchsuchte ich unter Linux die Logfiles:
sudo cat /var/log/Xorg.0.log
Hier fand sich etwas, was mich stutzig machte:
[ 1243.044] (WW) NVIDIA(GPU-0): Ignoring EDID checksum for display DFP-2. Note that an EDID
[ 1243.044] (WW) NVIDIA(GPU-0): with a bad checksum could indicate a corrupt EDID. A
[ 1243.044] (WW) NVIDIA(GPU-0): corrupt EDID may have mode timings beyond the capabilities
[ 1243.044] (WW) NVIDIA(GPU-0): of your display, and could damage your hardware. Please
[ 1243.044] (WW) NVIDIA(GPU-0): use with care.
DFP-2 bezeichnete den Monitor HX191D – eine defekte EDID-Prüfsumme?
Was ist die EDID?
Bei der EDID (Extended Display Identification Data) handelt es sich um eine 128-Byte-Datenstruktur, welche innerhalb des Displays in einem PROM oder EEPROM abgelegt ist. Diese enthält Informationen über Hersteller, Fertigungsdatum, Dimensionen des Displays, Pixel Mapping Data etc. Die Daten werden über den I²C-Bus vom Monitor an die Grafikkarte übertragen, diese Kombination von EDID und I²C nennt sich DDC2 (Display Data Channel Version 2). Der Grafiktreiber interpretiert diese Daten, um passende Auflösungen und Frequenzen zu bestimmen, welche ansonsten manuell definiert werden müssten.
Auslesen und Überprüfen der EDID
Da der Treiber im Logfile eine defekte EDID-Prüfsumme beim HX191D ermittelt hatte, verstand ich auch die Problematik unter Windows. Der neue Treiber konnte die EDID-Werte des Monitors nicht sauber interpretieren und schaltete als Vorsichtsmaßnahme das Signal zu diesem Monitor ab. Um meine Theorie zu beweisen, ging es erst mal daran, die EDID auszulesen. Hierzu kann man die Pakete read-edid und edid-decode verwenden:
sudo apt-get install read-edid edid-decode
Mittels get-edid können die Werte ausgelesen werden, die Augabe lässt sich mittels get-edid > dateiname.bin auch in eine Datei schreiben. Über parse-edid oder edid-decode kann die EDID ausgewertet werden.
Also: sudo get-edid | parse-edid
Ich habe die Ausgabe auf die relevanten Einträge gekürzt:
Your EDID is probably invalid.
parse-edid: EDID checksum failed - data is corrupt. Continuing anyway.
parse-edid: first bytes don't match EDID version 1 header
parse-edid: do not trust output (if any).
Ein sudo get-edid | edid-decode
ergab noch detailliertere Ausgaben:
get-edid: get-edid version 2.0.0
Performing real mode VBE call
Interrupt 0x10 ax=0x4f00 bx=0x0 cx=0x0
Function supported
Call successful
VBE version 300
VBE string at 0x11100 "NVIDIA"
VBE/DDC service about to be called
Report DDC capabilities
Performing real mode VBE call
Interrupt 0x10 ax=0x4f15 bx=0x0 cx=0x0
Function supported
Call successful
Monitor and video card combination does not support DDC1 transfers
Monitor and video card combination supports DDC2 transfers
0 seconds per 128 byte EDID block transfer
Screen is not blanked during DDC transfer
Reading next EDID block
VBE/DDC service about to be called
Read EDID
Performing real mode VBE call
Interrupt 0x10 ax=0x4f15 bx=0x1 cx=0x0
Function supported
Call failed
The EDID data should not be trusted as the VBE call failed
EDID claims 255 more blocks left
EDID blocks left is wrong.
Your EDID is probably invalid.
Extracted contents:
header: ff ff ff ff ff ff ff ff
serial number: ff ff ff ff ff ff ff ff ff ff
version: ff ff
basic params: ff ff ff ff ff
chroma info: ff ff ff ff ff ff ff ff ff ff
established: ff ff ff
standard: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
descriptor 1: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
descriptor 2: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
descriptor 3: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
descriptor 4: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
extensions: ff
checksum: ff
No header found
Manufacturer: ___ Model ffff Serial Number 4294967295
Made week 255 of model year 255
EDID version: 255.255
Digital display
Maximum image size: 255 cm x 255 cm
Gamma: 1.0
DPMS levels: Standby Suspend Off
Supported color formats: RGB 4:4:4, YCrCb 4:4:4, YCrCb 4:2:2
Default (sRGB) color space is primary color space
First detailed timing is preferred timing
Supports GTF timings within operating range
Established timings supported:
720x400@70Hz
720x400@88Hz
640x480@60Hz
640x480@67Hz
640x480@72Hz
640x480@75Hz
800x600@56Hz
800x600@60Hz
800x600@72Hz
800x600@75Hz
832x624@75Hz
1280x768@87Hz
1024x768@60Hz
1024x768@70Hz
1024x768@75Hz
1280x1024@75Hz
1152x870@75Hz
Standard timings supported:
2288x1372@123Hz
2288x1372@123Hz
2288x1372@123Hz
2288x1372@123Hz
2288x1372@123Hz
2288x1372@123Hz
2288x1372@123Hz
2288x1372@123Hz
Detailed mode: Clock 655.350 MHz, 4095 mm x 4095 mm
4095 5118 6141 8190 hborder 255
4095 4158 4221 8190 vborder 255
+hsync +vsync interlaced
Detailed mode: Clock 655.350 MHz, 4095 mm x 4095 mm
4095 5118 6141 8190 hborder 255
4095 4158 4221 8190 vborder 255
+hsync +vsync interlaced
Detailed mode: Clock 655.350 MHz, 4095 mm x 4095 mm
4095 5118 6141 8190 hborder 255
4095 4158 4221 8190 vborder 255
+hsync +vsync interlaced
Detailed mode: Clock 655.350 MHz, 4095 mm x 4095 mm
4095 5118 6141 8190 hborder 255
4095 4158 4221 8190 vborder 255
+hsync +vsync interlaced
Has 255 extension blocks
Checksum: 0xff (should be 0x7f)
EDID block does not conform at all!
Block has broken checksum
Manufacturer name field contains garbage
Wie die Ausgabe beschreibt, einhält die EDID meines HX191D „garbage“ – also Müll. Der Treiber kann die Ausgabe also nicht interpretieren – es bleibt dann nur, die Werte manuell zu vergeben (unter Windows via INF-Datei, unter Linux innerhalb der xorg.conf) oder den Monitor zu entsorgen, was aber auch nicht Sinn der Sache sein kann.
Lösung: Ersetzen der EDID-Informationen
Variante 1: Hardwareprogrammierung
Man kann eine fehlerhafte EDID ersetzen, indem man die Binärinformationen eines fehlerfreien ROMs in das EEPROM des Monitors schreibt. Hierzu benötigt man neben einem passenden Binärfile auch entsprechende Spezialsoftware und ein programmierbares EEPROM im betroffenen Monitor. Besitzt der Monitor ein PROM, hat man Pech gehabt. Da ich nicht sagen kann, ob der HX191D ein EEPROM besitzt, ist eine Hardwareprogrammierung fraglich, zumal ich auch keine Software dazu nennen kann.
Variante 2: Treiber-/Softwarelösung (empfohlen)
Besitzt man eine passende EDID-Binärdatei (EDID-ROM), kann man dem Treiber vermitteln, das er diese Informationen anstelle der Hardwareinformationen verwenden soll. Diese Lösung ist praktikabel, ich gehe in den nächsten Absätzen darauf ein.
EDID beschaffen
Für beide Varianten benötigt man erst mal eine geeignete EDID-Binärdatei. Besitzt man zufälligerweise einen baugleichen Monitor ohne fehlerhafte EDID, kann man dessen Informationen unter Linux mittels get-edid > dateiname.bin
in eine Datei schreiben. Unter Windows ist dies mit dem EDID Manager möglich. Ich war in der glücklichen Situation, das meine Frau ebenfalls einen HX191D als Zweitbildschirm nutzt und dessen EDID nicht fehlerhaft war – so konnte ich die Daten einfach auslesen und nutzen.
Hat man diese Möglichkeit nicht, lässt sich mittels Software eine EDID erzeugen, z.B. mittels dem EDID Manager für Windows. Doch die Befüllung der Daten erfordert ein großes Maß an technischem Hintergrundwissen und die genauen technischen Daten des Monitors – fehlerhafte Werte können zur Zerstörung des Monitors führen! Für die Ermittlung der korrekten Werte helfen die technischen Daten des Monitors innerhalb der Betriebsanleitung und ggf. weitere Recherchen im Internet.
Eigene EDID verwenden – Vorgehensweise unter Linux
Liegen die EDID-Informationen nun in einer Binärdatei vor, speichert man diese idealerweise im Verzeichnis /etc/X11 und nimmt die EDID-Konfiguration innerhalb der xorg.conf vor. Der NVIDIA-Treiber besitzt dafür eine Option „CustomEDID“, welche wir nun in den Abschnitt „Device“ aufnehmen:
Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce GTX 470"
Option "CustomEDID" "DFP-2:/etc/X11/HX191D.bin"
Option "NoLogo" "True"
EndSection
Nach einem Neustart des X-Servers wird die neue Konfiguration übernommen.
Eigene EDID verwenden – Vorgehensweise unter Windows
Die Konfiguration der Monitor wird innerhalb der Windows-Registry vorgenommen, hier benötigt man eine entsprechende INF-Datei, welche im Regelfall der Hersteller mitliefert. Sollte dies nicht der Fall sein, lässt sich mittels des Programms Monitor Asset Manager aus der vorliegenden EDID-Binärdatei eine passende INF-Datei erzeugen. Hierzu wird die EDID-Binärdatei geladen und mittels „Save INF“ als INF-Datei abgelegt.
Anschließend im Windows Geräte-Manager den entsprechenden Monitor-Eintrag doppelklicken, auf die Registerkarte „Treiber“ wechseln und die Schaltfläche „Treiber aktualisieren“ anklicken. Dann „Auf dem Computer nach Treibersoftware suchen“ und „Aus einer Liste von Gerätetreibern auf dem Computer auswählen“ und „Durchsuchen“ wählen. Nun wählt man die vorhandene INF-Datei aus, nach einem „Öffnen“, „Weiter“ und „Fertigstellen“ wird diese installiert und steht zur Verfügung. Weitere (Windows-spezifische) Informationen können unter Overriding Monitor EDIDs with an INF nachgelesen werden.
Ich hoffe, das dieses Tutorial bei auftretenden EDID-Problemen hilfreich sein wird.