[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Fglrx e EDID EEPROM e LCD morto



Il giorno sab, 17/03/2012 alle 17.48 +0100, computer.enthusiastic ha
scritto:

> Potresti fornire i comandi impartiti nella loro interezza ? Potrebbe
> essere utile per referenza futura.

Su google si trovano un po' di (sparse...) informazioni. Quello che
meglio si adatta al caso sta in [1] ma anche in [2].

Premessa: quello che scrivo è testato SOLO sul mio portatile (e non ho
intenzione di fare esperimenti con altri PC, per ovvie ragioni). Il
rischio di far danni permanenti lo potrei definire "moderato" se 
faccio solo letture della memoria, "alto" se provo a scrivere. 
Quindi chi vuole fare esperimenti è avvisato!

Uso testing AMD64, come root. VGA ATI HD3400 (con driver free, adesso).

Se l'LCD viene normalmente visto dal BIOS, l'uso di
# get-edid | parse-edid
è una coppia perfetta per leggere il contenuto della EEPROM, ma va usato
PRIMA di avere problemi.

Il primo comando legge la EEPROM dell'LCD (128 byte), ideale per creare
un file da conservare a futura memoria 
# get-edid > myedid.bin 

Il secondo comando "decodifica" il file binario appena generato. 
Nel mio caso ottengo (in estratto) cose del tipo:

| parse-edid: EDID checksum passed.

E mi sembra una bella cosa...

|Mode   "1440x900"      # vfreq 60.002Hz, hfreq 54.721kHz
|               DotClock        108.020000
|               HTimings        1440 1504 1536 1974
|               VTimings        900 903 906 912
|               Flags   "-HSync" "+VSync"
|       EndMode

Che richiama le "Modeline" che un tempo si mettevano a mano nella
configurazione di X (e che comunque ora si può leggere nel log di Xorg). 
Ovviamente i numeri cambiano a seconda del monitor, il mio è un pannello 
LCD AUO:7743 1440x900.
----------------------
Se il BIOS non vede l'LCD (come mi succedeva l'altro giorno) il comando
non funziona. Per chi lo chiedeva: io ho dovuto usare un monitor esterno
(portatile e scheda video erano a posto, era solo il pannello LCD ad
essere "guasto"). Ovviamente si può fare anche via ssh.

Occorre leggere direttamente dal BUS i2C, secondo i seguenti passi:

(installare read-edid e i2c-tools)

* Caricare il modulo per accedere al bus fisico i2c
  # modprobe i2c-dev

* Cercare quanti bus I2C sono presenti 
  # i2cdetect -l
Il mio portatile ne ha sei, penso una coppia (?) per ciascun monitor
potenziale (VGA, HDMI, LDVS).

* Cercare il bus corretto, scandendo ciascuno di quelli trovati con il
comando 
  # i2cdetect X (dove X varia da 0 al numero di bus trovati). 
La ricerca ha successo se si trova una tabella con un 50, come quella
che segue, in estratto:
|40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
|50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
|60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

* A questo punto si legge la memoria trovata con
# i2cdump X 0x50 (X definito come sopra)
Il risultato è una tabella in cui i primi 8 byte DEVONO essere
quelli mostrati qui sotto:
|00: 00 ff ff ff ff ff ff 00 06 af 77 43 00 00 00 00

Nel mio caso la lettura era diversa, il secondo ed il terzo byte (se ben
ricordo) erano 7f e quindi il BIOS disattivava il monitor del portatile
in quanto non riconosceva l'header EDID e quindi non veniva rilevato 
l'LCD. 

Li ho "corretti" a mano con:
(ATTENZIONE: pericoloso! Se sbagliate "perdete" il monitor)
# i2cset -y 0 0x50 0x01 0xFF 
# i2cset -y 0 0x50 0x02 0xFF 

E al reboot tutto ha funzionato!

[1] http://sites.google.com/site/chrisbecke/home/edid-reprograming
[2] http://en.wikipedia.org/wiki/Display_Data_Channel
-- 
Vincenzo Villa
http://www.vincenzov.net 




Reply to: