Display-EDID verändern: Unterschied zwischen den Versionen

Aus ThinkPad-Wiki
KKeine Bearbeitungszusammenfassung
KKeine Bearbeitungszusammenfassung
Zeile 148: Zeile 148:
== Weblinks ==
== Weblinks ==
* [http://en.wikipedia.org/wiki/Extended_display_identification_data#EDID_1.3_data_format EDID 1.3 data format (Wikipedia.org)]
* [http://en.wikipedia.org/wiki/Extended_display_identification_data#EDID_1.3_data_format EDID 1.3 data format (Wikipedia.org)]
[[Kategorie:HowTo]]

Version vom 1. Januar 2012, 09:42 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 Lonovofabrikat vorzutäuschen.

Vorraussetzungen

  • Das alte Display ist noch eingebaut oder dessen EDID bekannt
  • Ein funktionierender externer Monitor
  • Generelle Kompatibilität zwischen Display und ThinkPad
  • Fals 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 dadrauf hinweisen das bei Fehlern in den kommenden Kommandos schwerwiegende Schäden an der restlichen Hardware entstehen können!
Bei Unklarheiten unbedingt beim Techniker oder 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 ersteinmal 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(30 ae b0 40) an die notierten Werte an.
Die erste Zeile der edid.txt sollte dann, dem Beispiel nach, etwa so aussehen:

00ffffffffffff0030aeb04001020304

Anschließend wird nurnoch 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 setz 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 nocheinmal ü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