EDID EEPROM schreiben

Gentoo-Blog Ersatz

Moderator: el_hakim

Post Reply
User avatar
el_hakim
Posts: 1110
Joined: 09.08.2007, 13:53
Contact:

EDID EEPROM schreiben

Post by el_hakim » 19.05.2014, 18:35

Durch reines Auslesen von /dev/mem habe ich es neulich tatsächlich geschafft, die EDID-Daten eines TFT-Monitor dauerhaft durcheinander zu bringen. Das führt dann dummerweise dazu, dass sich dieser nicht mehr an seinem DVI-Eingang betreiben lässt.

Nun wenn sich die EDID-Daten löschen oder verändern lassen, dann lassen sie sich auch wieder herstellen, dachte ich mir (und das ohne den EEPROM aus dem Monitor zu löten). Und da ich schon des öfteren von fehlenden oder fehlerhaften EDID-Daten gehört habe, ist diese Anleitung vielleicht auch für andere interessant.

1. Kernelkonfiguration anpassen und Programme installieren
Ein paar Voraussetzungen müssen zuerst erfüllt sein.

I2C-Support muss im Kernel entsprechend konfiguriert sein sein:

Code: Select all

Device Drivers  --->
  [*] I2C support  --->
    <*>   I2C device interface
        I2C Hardware Bus support  --->
           (hier den Chipsatz vom Board auswählen)
Weiterhin muss Unterstützung für EEPROMs vorhanden sein:

Code: Select all

Misc devices  --->
  EEPROM support  --->
    <M> I2C EEPROMs / RAMs / ROMs from most vendors
Dann sollte man noch die i2c-tools (sys-apps/i2c-tools) sowie optional das parse-edid-Kommando (x11-misc/read-edid) installieren.

2. I2C-Busnummer ermitteln
Als erstes muss man die Busnummer heraus finden, über welche der EEPROM erreicht werden kann. Dazu kann man z.B. alle I2C-Busse des System mit i2cdetect scannen. Aber besser nur die Adresse 0x50. Ansonsten kann was anderes im System Schluckauf bekommen. Vorher noch das i2c-dev Modul laden

Code: Select all

# modprobe i2c-dev
# i2cdetect -y -r 1 0x50 0x50
     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:
Die 1 im Kommando ist die Busnummer. Wird dann auf Adresse 0x50 eine Device gefunden, ist dies aller Wahrscheinlichkeit nach ein EEPROM. Um herauszufinden ob es auch der richtige ist. Kann dieser z.B. mittels i2cdump ausgelesen werden. Oder man steckt zeitweise einen anderen Monitor an und testet, ob sich der EEPROM-Inhalt entsprechend verändert.

Code: Select all

# i2cdump -y 1 0x50
No size specified (using byte-data access)
     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 09 d1 97 76 18 2b 00 00    ........???v?+..
10: 1d 0f 01 03 80 26 1e 78 ea 6d 66 a2 5a 4c 9d 23    ?????&?x?mf?ZL?#
20: 13 4f 54 bd ef 80 71 4f 81 90 81 80 81 8c 01 01    ?OT???qO????????
30: 01 01 01 01 01 01 30 2a 00 98 51 00 2a 40 30 70    ??????0*.?Q.*@0p
40: 13 00 78 2d 11 00 00 1e d5 09 80 a0 20 5e 63 10    ?.x-?..????? ^c?
50: 10 60 52 08 78 2d 11 00 00 1a 00 00 00 fd 00 38    ?`R?x-?..?...?.8
60: 4c 1f 53 0e 00 0a 20 20 20 20 20 20 00 00 00 fc    L?S?.?      ...?
70: 00 42 65 6e 51 20 46 50 39 31 47 0a 20 20 00 47    .BenQ FP91G?  .G
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
Hier wurden z.B. 128-Byte Daten aus einem EEPROM gelesen. Im Dump erkennt man den String "BenQ". Die Daten kann man z.B. auch mittels get-edid verifizieren oder mittels parse-edid parsen.

3. EEPROM Modul laden

Um den EEPROM nun neu beschreiben zu können, muss man den Kerneltreiber für EEPROMs mit der entsprechenden I2C-Adresse auf dem entsprechenden Bus registrieren. Der dabei verwendete Alias-Name des Modul setzt zugleich die EEPROM-Größe fest (also z.B. 24c02 für 2KBit, 24c04 für 4 KBit). Da die EDID-Datenstruktur 128 Byte groß ist, sollte eigentlich 24c01 reichen. Ich habe mit 24c02 gearbeitet, was auch funktioniert hat (da ich glaube ich auf der Platine des TFTs einen AT24C02 nahe des DVI-Connectors gesehen hatte).

Code: Select all

# cd /sys/bus/i2c/devices/i2c-1
# echo 24c02 0x50 > new_device
Danach erscheint im gleichen Verzeichnis ein Order für das neu registrierte Device: "1-0050".

4. EEPROM Daten schreiben

Im Device-Order kann jetzt über die Datei "eeprom" mittels Block-I/O (z.B. mit dd) auf die EEPROM-Daten lesend und schreibend zugegriffen werden.

Code: Select all

# cd 1-0050
# dd if=eeprom of=/tmp/edid_backup.bin bs=1
# dd if=/tmp/neue_edid_daten.bin of=eeprom bs=1
Durch erneutes auslesen kann man testen, ob das ganze auch angekommen ist.

Und an passende EDID-Daten kommt man z.B. durch Kopieren von einem möglichst ähnlichem Monitor. Oder es gibt auch entsprechende Generatoren.

Ob das immer und bei allen Monitoren geht, kann ich natürlich nicht sagen. Eventuell sind die Daten auch schreibgeschützt. Aber dann kann man sie wenigstens nicht aus versehen löschen.
Ubuntu: African word meaning "Gentoo is to hard for me"

Post Reply