Display-EDID verändern

Aus ThinkPad-Wiki

ThinkPads überprüfen beim starten ob das verbaute Display auch tatsächlich ein originales ist. Bei einem Wechsel auf ein nicht-Lenovo Display wird dieses als solches erkannt und kann nicht genutzt werden. Um eine Nutzung dennoch zu ermöglichen muss die EDID des Displays angepasst werden um ein Lenovo-Fabrikat vorzutäuschen.

Voraussetzungen

  • Das alte Display ist noch eingebaut oder dessen EDID bekannt
  • Ein funktionierender externer Monitor
  • Generelle Kompatibilität zwischen Display und ThinkPad
  • Falls die Modifikation unter Windows erfolgt benötigt man noch eine registrierte Version von PowerStrip (~$30)

Vorgehen unter Windows

Der Zugriff auf das Display-EDID unter Windows mit Thinkpads gestaltet sich schwierig, da vermutlich der Treiber der Grafikkarte(n) den Zugriff auf den BUS unterbindet.

Dies kann man mit Moninfo testen: Steht im linken oberen Fenster als erster Punkt "registry active", dann hat sich Windows die Displaydaten aus der Registry und nicht dirket aus dem Panel geholt, der Zugriff ist sehr wahrscheinlich gesperrt.

Mit folgendenden Thinkpads ist das Schreiben von EDID-Daten mit Powerstrip unter Windows möglich bzw. nicht möglich:

  • funktioniert: T60 mit ATI Grafik (x1300 getestet)
  • funktioniert nicht: T60 Intel, T61 Intel, T61 Nvidia, T400 ATI

Für die Anpassung der EDID-Daten werden folgende Programme benötigt:

  • Moninfo (von IDTech, Freeware) zum auslesen der EDID-Daten
  • Edid Converter (EDID Converter, 1/5/2010, by Tomasz Orczyk) zum Wandeln von .bin zu .dat
  • Phoenix EDID Designer (Freeware) für die Änderungen
  • Powerstrip Vollversion zum schreiben der EDID-Daten

Anpassen der Daten wie folgt:

  1. einlesen der EDID-Daten des alten Panels, notieren der Kennung LENxxxx
  2. einlesen der EDID-Daten des neuen Panels mit Moninfo, speichern als .bin
  3. wandeln dieser Datei mit dem Edid converter in eine Phoenix .dat
  4. öffnen der .dat mit Phoenix Designer, schreiben aktivieren (Bleistiftsymbol)
  5. zuerst die Prod.ID eintragen, dann LEN als Vendor.ID, dann speichern
  6. Kontrolle der Datei mit Moninfo -> File -> open -> ... jetzt sollte die Kennung LENxxxx drin stehen
  7. Powerstrip kann auch .dat schreiben, eine weitere Konvertierung ist nicht nötig


Schreiben mit Powerstrip (wenn der Rechner es zulässt)

  1. rechtsklickt auf das Powerstrip-Symbol in der Taskleiste -> Optionen -> Monitor Informationen
  2. unter Optionen -> Update EDID
  3. [...]

Vorgehen unter Linux

Achtung Gefahr!

Ich möchte an dieser Stelle ausdrücklich darauf hinweisen das bei fehlerhafter Eingabe der nachfolgend aufgeführten Kommandos schwerwiegende Schäden an der Hardware entstehen können! Bei Unklarheiten unbedingt beim Techniker oder im Forum des Vertrauens nachfragen und nicht einfach drauf los doktoren!

Die Modifikation, oder der Versuch der Modifikation, erfolgt ausdrücklich auf eigene Gefahr!

Benötigte Pakete

Um die EDID zu verändern werden folgende Pakete benötigt:

  • i2c-tools
  • lm-sensors

Diese lassen sich unter Ubuntu/LinuxMint bequem per apt-get installieren:

$ sudo apt-get install i2c-tools lm-sensors

Identifizierung des SMBus und Display-RAM

Jetzt gilt es den Vorhandenen SMBus Controller zu identifizieren.
Am einfachsten geht dies durch das starten des sonsor-detect Scripts von lm-sensors.

$ sudo /usr/sbin/sensors-detect
(...)
Do you want to probe the I2C/SMBus adapters now? (YES/no): 
Using driver `i2c-i801' for device 0000:00:1f.3: Intel ICH9
(...)

In diesem Fall wird ein I2C/SMBus gefunden und der passende Treiber als i2c-i801 identifiziert.

Da das Script den Treiber am Ende wieder entlädt muss dieser erneut geladen werden. Hinzu kommt noch ein Modul das von den i2c-tools benötigt wird.

$ sudo modprobe i2c-i801
$ sudo modprobe i2c-dev

Hinweis: Nach einem Neustart müssen diese Module erneut geladen werden.

Jetzt wird die Bus-Nummer des Displays am gefundenen SMBus ermittelt:

$ sudo i2cdetect -l
i2c-0	i2c       	i915 gmbus disabled             	I2C adapter
i2c-1	i2c       	i915 gmbus ssc                  	I2C adapter
i2c-2	i2c       	i915 GPIOB                      	I2C adapter
i2c-3	i2c       	i915 gmbus vga                  	I2C adapter
i2c-4	i2c       	i915 GPIOA                      	I2C adapter
i2c-5	i2c       	i915 gmbus panel                	I2C adapter
i2c-6	i2c       	i915 GPIOC                      	I2C adapter
i2c-7	i2c       	i915 gmbus dpc                  	I2C adapter
i2c-8	i2c       	i915 GPIOD                      	I2C adapter
i2c-9	i2c       	i915 gmbus dpb                  	I2C adapter
i2c-10	i2c       	i915 GPIOE                      	I2C adapter
i2c-11	i2c       	i915 gmbus reserved             	I2C adapter
i2c-12	i2c       	i915 gmbus dpd                  	I2C adapter
i2c-13	i2c       	i915 GPIOF                      	I2C adapter
i2c-14	i2c       	DPDDC-B                         	I2C adapter
i2c-15	i2c       	DPDDC-D                         	I2C adapter
i2c-16	smbus     	SMBus I801 adapter at 1c00      	SMBus adapter

Hier sitzt das Panel am Bus nummer 5

Die letzte fehlende Information ist die Adresse des EPROM's an diesem Port:

$ sudo i2cdetect 5
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-5.
I will probe address range 0x03-0x77.
Continue? [Y/n] Y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --   

Damit haben wir alles zusammen und können das Display an Bus 5 und Adresse 0x50 ansprechen.

Auslesen der EDID-Iformationen

Mit den gewonnenen Informationen kan jetzt die EDID des Displays ausgelesen werden:

$ sudo i2cdump -r 0-127 5 0x50 b
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-5, address 0x50, mode byte
Probe range limited to 0x00-0x7f.
Continue? [Y/n] y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 00 ff ff ff ff ff ff 00 30 ae b0 40 00 00 00 00    ........0??@....
10: 03 13 01 03 80 22 13 78 ea b0 25 9f 59 56 93 26    ?????"?x??%?YV?&
20: 0d 50 54 00 00 00 01 01 01 01 01 01 01 01 01 01    ?PT...??????????
30: 01 01 01 01 01 01 2c 1a 56 45 50 00 0a 30 20 18    ??????,?VEP.?0 ?
40: 34 00 58 c1 10 00 00 18 ce 15 56 45 50 00 0a 30    4.X??..???VEP.?0
50: 20 18 34 00 58 c1 10 00 00 18 00 00 00 0f 00 8b     ?4.X??..?...?.?
60: 09 32 8b 09 28 16 09 00 06 af 56 33 00 00 00 fe    ?2??(??.??V3...?
70: 00 42 31 35 36 58 57 30 32 20 56 33 20 0a 00 ef    .B156XW02 V3 ?.?

Die für uns interessanten Werte befinden sich in 0x08-0x0b, denn dort werden die Hersteller- und Produkt-ID gespeichert. Hier sind es die Werte "30 ae b0 40" die wir uns notieren.

Hinweis: Eine EDID beginnt immer mit "00 ff ff ff ff ff ff 00". Fals dort etwas anderes steht ist es keine EDID!

Jetzt kann, sofern noch nicht geschehen, das neue Display angeschlossen werden. Um auf dem externen Monitor zu booten stellt man dies entweder vor dem Umbau im BIOS ein oder drückt während des bootens Fn+F7.

Anpassen der EDID-Informationen und -Checksum

Nachdem das neue Display angeschlossen ist sollte man sich zuerst davon überzeugen das das Display noch über die gehabte Adresse zu erreichen ist und es sich dabei auch nicht um den externen Monitor handelt.

Nach dem Sicherheitscheck kann man anfangen die EDID zu modifizieren. Da die EDID aber eine Checksum beinhaltet muss man dies erst einmal als Trockenübung absolvieren damit man selbige berechnen kann.

Zuerst speichert man die vorhandene EDID (die Werte 5 und 0x50 anpassen!):

$ sudo i2cdump -y -r 0-127 5 0x50 b | cut -b 5-51 | sed 's/ //g' > edid.txt && sed -i '1d' edid.txt

Dies erstellt die Datei 'edid.txt' in der EDID des Displays in Hex-Werten gespeichert ist. Zu diesem Zeitpunkt bietet es sich auch an ein Backup dieser Datei anzufertigen, fals man die Original-EDID einmal brauchen sollte.

Jetzt begibt man sich in den Editor seiner Wahl und passt die Hersteller- und Produkt-ID an die notierten Werte(30 ae b0 40) an.

$ gedit edid.txt

Die erste Zeile der 'edid.txt' sollte dann, dem Beispiel nach, etwa so aussehen:

00ffffffffffff0030aeb04001020304

Anschließend wird nur noch die Checksum neu berechnet. Und zwar mit diesem etwas längeren Einzeiler:

$ cat edid.txt | fold -2 | perl -e 'while (<STDIN>) { $x=$xx; $xx+=hex($_); } $ret = 256 - ($x-int($x/256)*256); printf("\nChecksum: %x\n\n", $ret);'

Checksum: e7

Hier wird die Checksum e7 ermittelt und dies ist die letzte Information die wir brauchten um endlich das EDID zu schreiben.

Schreiben der veränderten EDID-Informationen

Achtung! Hier kommt der kritische Punkt an dem ein Fehler fatale folgen haben kann! Genau auf die Bus-Nummer, Adresse und deren Richtigkeit achten!

Wir haben jetzt fünf Werte die geschrieben werden müssen: 30 ae b0 40 e7 Dies sind die Hersteller-ID, Produkt-ID und die Checksum.

Der Befehl dazu setzt sich so zusammen:

i2cset BUSNUMMER ADRESSE(0xYY) OFFSET(0xYY) NEUERWERT(0xYY) MODE

Der Offset für die Hersteller-/Produkt-ID ist 0x08 bis 0x0b und für die Checksum 0x7f. Der Mode ist 'b' für 'byte', wird aber automatisch erkannt sofern nicht angegeben.

Mit den Beispieldaten ergeben sich so diese fünf Befehle:

$ sudo i2cset 5 0x50 0x08 0x30 b
$ sudo i2cset 5 0x50 0x09 0xae b
$ sudo i2cset 5 0x50 0x0a 0xb0 b
$ sudo i2cset 5 0x50 0x0b 0x40 b
$ sudo i2cset 5 0x50 0x7f 0xe7 b

Damit ist die neue EDID geschrieben, sollte zur Vorsicht aber noch einmal überprüft werden:

$ sudo i2cdump -r 0-127 5 0x50 b

Wenn hier die neuen Werte aufgelistet werden, dann ist es geschafft.

Bleibt nurnoch ein Neustart und das ThinkPad sollte jetzt ohne murren mit dem Fremddisplay booten.

Weblinks