Display-EDID verändern: Unterschied zwischen den Versionen
K (hat „EDID Verändern“ nach „Display-EDID verändern“ verschoben) |
|
(kein Unterschied)
|
Version vom 1. Januar 2012, 15:18 Uhr
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 Display 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
Soon™
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/LiuxMint 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. 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.