1 votes

écran du portable vide, journal du noyau plein d'erreurs EDID

Depuis une semaine, l'écran de l'ordinateur portable est vide. Si je branche un moniteur externe, il fonctionne correctement.

dmesg montre deux de ces messages d'erreur par minute :

kernel: [...] nouveau E[     DRM] DDC responded, but no EDID for LVDS-1

Une recherche sur Google indique que les données EDID sont lues à partir de l'écran pour connaître ses capacités d'affichage. Dans mon cas, elles semblent avoir été corrompues. Il y a un lot de discussions sur les différentes façons de résoudre le problème, mais j'ai du mal à trouver quelque chose de précis.

2voto

prasad Points 11

J'ai trouvé une solution sur le site freedesktop.org bugtracker impliquant la réécriture des données EDID sur le bus i2c.

Il existe une solution alternative décrite sur le wiki d'Arch mais cela nécessitait d'accéder au pilote Windows ou de créer une ligne de commande obscure du noyau pour remplacer la requête EDID.

avertissement : Il s'agit d'une technique assez avancée. Vous devez comprendre les vidages hexadécimaux, être à l'aise avec la notion d'écriture sur les adresses matérielles, et être capable de comprendre ce qui se passe lors de l'exécution des différentes commandes présentées. Il y a quelques points où les choses ne fonctionnent pas comme elles le devraient - bien que je montre les solutions que j'ai utilisées, je ne les explique pas car cela prendrait trop de place - vous devez être capable de comprendre ce qui se passe afin de pouvoir modifier l'approche en fonction de votre situation.

avertissement : Cela implique de farfouiller au niveau de l'octet sur le bus i2c. Vous pouvez endommager irrémédiablement un équipement de cette manière. Si votre moniteur ne fonctionne déjà pas, vous n'avez pas grand chose à perdre, mais si vous vous trompez dans le numéro du bus i2c, vous pouvez finir par endommager le moniteur externe.


Télécharger edid-tool et le compiler

wget https://bugs.freedesktop.org/attachment.cgi?id=91473
mv attachment.cgi\?id\=91473 edid-tool.c
gcc -std=gnu99 -O edid-tool.c
mv a.out edid-tool

installer certains paquets - sur les distros basées sur debain vous avez besoin :

sudo apt-get install i2c-tools libi2c-dev

Ensuite, installez le module du noyau :

sudo modprobe i2c-dev

Vous devriez maintenant avoir /dev/i2c-1 , /dev/i2c-2 ... correspondant au bus i2c 1, 2, etc.

La tâche suivante consiste à déterminer sur quel bus i2c se trouve l'écran concerné. Voir le rapport de bogue lié pour les détails - qui ressemblent à quelque chose comme :

for i in `ls /dev/i2c-*` ; do echo ; echo $i ; sudo ./edid-tool $i read ; done

/dev/i2c-1
           0  1  2  3   4  5  6  7   8  9  a  b   c  d  e  f   0123 4567 89ab cdef 
00000000  00 00 00 00  00 07 4f 00  06 10 bb 9c  00 00 00 00  |.... ..O. .... ....|
00000010  00 13 01 03  80 21 15 78  0a 50 c5 98  58 52 8e 27  |.... .!.x .P.. XR.'|
00000020  25 50 54 00  00 00 01 01  01 01 01 01  01 01 01 01  |%PT. .... .... ....|
00000030  01 01 01 01  01 01 7c 2e  90 a0 60 1a  1e 40 30 20  |.... ..|. ..`. .@0 |
00000040  36 00 4b cf  10 00 00 18  00 00 00 01  00 06 10 30  |6.K. .... .... ...0|
00000050  00 00 00 00  00 00 00 00  0a 20 00 00  00 fe 00 4c  |.... .... . .. ...L|
00000060  50 31 35 34  57 45 33 2d  54 4c 42 31  00 00 00 fe  |DELL 2001 TLB1 ....|
00000070  00 43 6f 6c  6f 72 20 4c  43 44 0a 20  20 20 00 dd  |.Col or L CD.    ..|

/dev/i2c-2
           0  1  2  3   4  5  6  7   8  9  a  b   c  d  e  f   0123 4567 89ab cdef 
00000000  ff ff ff ff  ff ff ff ff  36 74 30 00  01 00 00 00  |.... .... 6t0. ....|
00000010  0a 16 01 03  80 73 41 78  0a cf 74 a3  57 4c b0 23  |.... .sAx ..t. WL.#|
00000020  09 48 4c 21  08 00 81 80  45 40 61 40  95 00 01 01  |.HL! .... E@a@ ....|
00000030  01 01 01 01  01 01 02 3a  80 18 71 38  2d 40 58 2c  |.... ...: ..q8 -@X,|
00000040  45 00 c4 8e  21 00 00 1e  66 21 50 b0  51 00 1b 30  |E... !... f!P. Q..0|
00000050  00 70 26 44  c4 8e 21 00  00 1e 00 00  00 fc 00 4d  |.p&D ..!. .... ...M|
00000060  53 74 61 72  20 44 65 6d  6f 0a 20 20  00 00 00 fd  |Star  Dem o.   ....|
00000070  00 32 4b 1e  50 17 00 0a  20 20 20 20  20 20 01 fd  |.2K. P...        ..|
WARN at 209: Bad header: 0x0000 0000 0007 4f00
WARN at 217: Bad checksum: 0x5c

/dev/i2c-3
ERROR at 72: i2c_smbus_read_byte_data() failed: No such device or address

L'écran qui présente le problème affichera probablement bad checksum y bad header erreurs. De plus, le texte peut contenir des informations sur le fabricant - dans ce cas, il s'agissait d'un moniteur externe Dell. i2c-1 et l'écran interne cassé de l'ordinateur portable était allumé. i2c-2 .

Le reste de la solution utilisera /dev/i2c-2 - ne copiez pas aveuglément ceci - voir le mode d'emploi ci-dessus pour déterminer quel appareil vous devez utiliser.

Sortir ensuite les données EDID actuelles :

~ $ sudo ./edid-tool /dev/i2c-2 read > edid-bad
          0  1  2  3   4  5  6  7   8  9  a  b   c  d  e  f   0123 4567 89ab cdef 
00000000  ff ff ff ff  ff ff ff ff  ff ff ff ff  ff ff ff ff  |.... .... .... ....|
....

Utilisez maintenant l'outil pour fixer les données :

~ $ sudo ./edid-tool /dev/i2c-2 fix < edid-bad > edid-fixed
          0  1  2  3   4  5  6  7   8  9  a  b   c  d  e  f   0123 4567 89ab cdef 
00000000  00 ff ff ff  ff ff ff 00  ff ff ff ff  ff ff ff ff  |.... .... .... ....|
....

Cela montre que les données EDID corrompues ont ff aux octets 0x00 y 0x07 où il aurait dû 0x00

Validez les données générées en utilisant parse-edid pour produire un Xorg.conf section :

$ parse-edid <edid-fixed 
Checksum Correct

Section "Monitor"
Identifier "
                 @"
ModelName "
                @"
VendorName "___"
# Monitor Manufactured week 0 of 2006
# EDID version 1.3
# Digital Display
DisplaySize 330 210
Gamma 2.20
Option "DPMS" "false"
Modeline    "Mode 0" 68.94 1280 1296 1344 1408 800 801 804 816 -hsync -vsync 
EndSection

Vérifiez le Modeline correspond aux caractéristiques d'affichage de votre écran.

Maintenant, nous devrait être en mesure de charger les données fixes avec

sudo ./edid-tool /dev/i2c-2 write < edid-fixed

mais cela n'a pas fonctionné pour l'auteur du rapport de bogue ni pour moi.

Cependant, il existe un moyen de patcher des valeurs individuelles sur le bus i2c :

~ $ sudo i2cdetect -y 2
    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: 50 51 52 53 54 55 56 57 -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

Cela montre où se trouvent les données edid - aux octets 0x50 par le biais de 0x57 .

Nous devons vérifier les données dès le début, donc nous faisons ceci :

for i in 1 2 3 4 5 6 7 ; do echo -n "0x0$i  " ;  sudo i2cget -y 2 0x50 0x0"$i" b ; done
0x01  0x00
0x02  0xff
0x03  0xff
0x04  0xff
0x05  0xff
0x06  0xff
0x07  0xff

Ok, donc on dirait que edid-tool a fixé le premier octet, mais n'a pas réussi à fixer celui à 0x07 .

Nous avons donc fixé cette date :

sudo i2cset -y 2 0x50 0x07 0x00 b

Donc maintenant nous avons les bonnes données. Mais le moniteur ne fonctionne toujours pas. Exécutez ceci à nouveau :

sudo ./edid-tool /dev/i2c-2 read > edid-bad
00000000  00 ff ff ff  ff ff ff 00  ff ff ff ff  ff ff ff ff  |.... .... .... ....|
...
00000070  00 4c 54 4e  31 35 34 58  41 2d 4c 30  31 0a 00 a0  |.LTN 154X A-L0 1...|
Error : bad checksum 

Comparez cette sortie avec la sortie de edid-tool ... fix et je vois que le tout dernier octet diffère.

Donc, j'arrange ça avec :

sudo i2cset -y 2 0x50 0x7f 0xc8 b

Le moniteur revient immédiatement à la vie.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X