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.