EDID Flash an Thinkpad X301

gdh

Cadet 3rd Year
Registriert
Okt. 2012
Beiträge
53
Ein kleines TUT, wie ich nach einer misslungenen Linux Installation das Thinkpad interne Display wieder nutzen konnte.

vorab: erst komplett durchlesen, sich fragen, ob man es verstanden hat, wenn ja, kann begonnen werden.
geschieht auf eigene Verantwortung!

Ursprünglich wollte ich nicht den Umweg über Linux machen, jedoch zeigt mir das Windowsbasierte EDID Flash Programm "Powerstrip" nicht den gewünschten Monitor an, somit kommt nun der Umweg über Linux.


Ausgangssituation:
Linux Installation abgebrochen, thinkpad Monitor blieb dunkel, bzw. zeigte vertikale Striche an.

vga Buchse genutzt um externen Monitor zu verwenden.

grobes vorgehen:
-richtiges edid besorgen (hatte ein ausdruck von dem richtigen edid)
-live cd/usb stick erstellen
-i2c-tools laden
-Im-sensors laden.
-fehlerhaftes edid auslesen
-bestimmen welche Werte abweichend sind von dem richtigen edid
-neues edid schreiben
-booten und Daumen drücken


genauer:
ich habe das tool linux live usb creator genutzt, um mir einen bootfähigen stick zu erstellen http://www.linuxliveusb.com/en/download

da es nur ein temporäres linux ist, habe ich mich für ein etwas kleineres entschieden (lubuntu)

von dem Stick lubuntu gebootet,

terminal geöffnet (es gibt terminals in die man nicht kopieren kann, sucht am Anfang direkt nen terminal aus, in den man kopieren kann, sonst ist es sehr nervig mit der tipperrei und den dadurch verursachten Fehlern.

i2c tools, lm-sensors laden : "sudo apt-get install i2c-tools lm-sensors"

mit "sudo /usr/sbin/sensors-detect" kann man den SMBus controller erkennen.
in meinem Fall war es der i2c-i801

da die Treiber nach der Identifikation wieder entladen sind, erneut laden mit:
"sudo modprobe i2c-i801"
und
"sudo modprobe i2c-dev"

da meist mehrere Sachen an dem i²c bus hängen, muss festgestellt werden, welcher Teilnehmer der gesuchte ist.
dies geht durch "sudo i2cdetect -l"

jetzt sollte eine liste der Teilnehmern gezeigt werden, die an dem bus hängen.
relevant für uns ist der Eintrag "i2c-5 i2c i915 gmbus panel I2C adapter"

um den richtig Eintrag zu finden, nach Panel suchen.
in der ersten spalte steht etwas von i2c-x das x ist der "port" am bus.
bei mir war es Eintrag Nummer 2.

den port müsst ihr euch merken, den brauchen wir später noch.

das edid ist ja in einem eeprom gespeichert, dessen Adresse wir jetzt noch herausfinden müssen.
also suchen wir nochmal auf dem bus, jedoch nach dem zuvor identifizierten "port" (meiner war 2).
"sudo i2cdetect 2"

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: -- -- -- -- -- -- -- --

sowas sollte nun erscheinen.
die 50 in ZEILE 50 und SPALTE 0 ist für uns relevant.
verwechselt niemals ZEILE und SPALTE miteinander, dass könnte fatal werden! überlegt euch etwas, um das nicht zu verwechseln!

jetzt haben wir genauere display infos, an bus "port" 2 und die adresse ist 0x50

jetzt lesen wir das vorhandene edid aus. hat den sinn, dass wenn wir etwas total falsch machen (z.b. falschen Monitor flashen, wir die infos noch irgendwo haben. zum anderen müssen wir ja das edid neu schreiben. um nicht jeden einzelnen Eintrag (256 Zeichen) neu zu schreiben empfiehlt es sich das gelesene edid mit dem richtigen edid zu vergleichen und nur selektiv neue werte zu schreiben.

Edid auslesen:
"sudo i2cdump -r 0-127 2 0x50 b"
die 2 steht für den bus "port" (bei mir 2)

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 ?.?

in etwa so eine Tabelle sollte ausgespuckt werden

wer sich genau über die aufschlüsselung der zeichen informieren will: https://en.wikipedia.org/wiki/Extended_display_identification_data

als Kontrolle, ob es wirklich ein edid ist,
EDIDs beginnen immer mit "00 ff ff ff ff ff ff 00". Falls dort etwas anderes steht ist es keine EDID!

abgespeichert wird die edid mit "sudo i2cdump -y -r 0-127 2 0x50 b | cut -b 5-51 | sed 's/ //g' > edid.txt && sed -i '1d' edid.txt"
wobei die 2 wieder mein "port" ist


jetzt geht es langsam zum flashen.

bei mir waren folgende Einträge falsch:
Zeile 10 spalte 0
Zeile 20 spalte 0 - 7
Zeile 70 spalte f

durch nachsehen, welche werte sich geändert haben, habe ich nur 10 befehle gebraucht um das edid lauffähig zu bringen.
sonst wären es 128!!!

mein tip. druckt euch das richtige edid aus und umkreist die Einträge, die geändert werden müssen.

"sudo i2cset 2 0x50 0x10 0x26 b" ist der befehl, die syntax hierzu: i2cset BUSNUMMER ADRESSE(0xYY) OFFSET(0xYY) NEUERWERT(0xYY) MODE

fettgeschrieben ist wieder der "port" (2) die erste 0x50 ist die Adresse des eeproms. die 0x10 ist 0xZEILE1 SPALTE0 (damit wird bestimmt wohin geschrieben wird) und die 0x26 ist der wert der geschrieben werden soll.

noch ein bsp. für Zeile 20 spalte 3

"sudo i2cset 2 0x50 0x23 0x00 b"

es ist wirklich wichtig hierbei einen klaren Kopf zu haben und nicht spalte und Zeile zu verwechseln.
ich habe für die 10 befehle 15 min gebraucht um alles doppelt und dreifach zu prüfen.

wenn ihr alle werte geschrieben habt, terminal schließen und neu starten.
an diesem Moment habe ich mir gedacht, das wird nie und nimmer funktionieren.. hat es aber :)
beim booten sollte wieder der externe Bildschirm angehen, jedoch spätestens, wenn wieder ein os geladen ist, sieht man den erfolg.... oder auch nicht.


eine sehr genaue Anleitung findet man unter http://thinkwiki.de/Display-EDID_ver%C3%A4ndern mein vorgehen basierte fast genau auf dieser Anleitung, jedoch gab es kein bsp. falls die zu beschreibenden Zeilen und spalten abweichend sein sollten, deshalb hier nochmal erläutert.


sollte man aus irgend einem Grund keine Möglichkeit haben das edid über einen rechner zu flashen, sollte es noch die Möglichkeit geben den eeprom über ein mikrocontroller zu flashen.

bsp. ein launchpad mit einem msp430 (texas instruments) etwa 5us$
kann auch den i²c bus abhören und auch darauf kommunizieren.
wer ein bisschen programmieren kann, sollte es auch damit hinbekommen.
Ich würde mich freuen, wenn jemand die µC geschichte ausprobiert und seine Erfahrungen mal postet
 
Zurück
Oben