Display-EDID verändern
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
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!
Problem beim Zugriff
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 und damit auf das EDID-EEPROM 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 direkt aus dem Panel geholt, der Zugriff auf das EEPROM 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
Benötigte Programme
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
Auslesen und Anpassen
- einlesen der EDID-Daten des alten Panels, notieren der Kennung LENxxxx
- einlesen der EDID-Daten des neuen Panels mit Moninfo, speichern als .bin
- wandeln dieser Datei mit dem Edid converter in eine Phoenix .dat
- öffnen der .dat mit Phoenix Designer, schreiben aktivieren (Bleistiftsymbol)
- zuerst die Prod.ID eintragen, dann LEN als Vendor.ID, dann speichern
- Kontrolle der Datei mit Moninfo -> File -> open -> ... jetzt sollte die Kennung LENxxxx drin stehen
- Powerstrip kann auch .dat schreiben, eine weitere Konvertierung ist nicht nötig
allgemein: flashen mit Powerstrip (Hardwareabhängig)
- rechtsklickt auf das Powerstrip-Symbol in der Taskleiste -> Optionen -> Monitor Informationen
- unter Optionen -> Update EDID
- jetzt werden die Datenbusse durchsucht, "An Eeprom has been found at ..." quittieren
- [...]
speziell: flashen mit Powerstrip wenn das neue nix anzeigt
Manchmal zeigt ein Panel gar nix an, dann kann man per Hot-plug versuchen die passenden Displaydaten zu flashen. Natürlich sollte man zuerst schauen, ob überhaupt ein EEPROM verbaut ist. Dazu am besten das Datenblatt des Panel suchen und reinschauen. Z.b. bei 30pin Anschlüssen (T/R6x, T/R400 mit CCFL-Display) sitzen die Datenleitungen auf Pin4 (+3.3V), Pin6 (EDID Clock) und Pin7 (EDID Data). Bei einigen Displays ist das EEPROM auf der Platine direkt zu erkennen. Außerdem sollte man sich sicher sein, dass das Display bzw. die Auflösung von der Hardware überhaupt unterstützt wird. Z.B. beim R61 gibt es Displaykabel die nicht voll beschaltet sind, daher funktionieren mit diesem Kabel nur 1280x800er Panel.
Ist ein EDID-EEPROM vorhanden und die Hardware passt ist das vorgehen wie folgt:
- starten des Rechner mit funktionierendem Display
- wenn alles fertig geladen ist, Rechner in Standby versetzten
- altes Display abstecken, neues Display anschließen
- Rechner aufwecken, jetzt sollte auf dem neuen Panel irgendwas zu sehen sein
[...] Fortsetzung und Bilder folgen
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.