Я нашел решение на багтрекере freedesktop.org, включающее перезапись данных EDID по шине i2c.
Существует альтернативное исправление, описанное в вики Arch, но для этого требуется доступ к драйверу Windows или создание загадочной командной строки ядра для переопределения запроса EDID.
Предупреждение : это довольно продвинутая техника. Вы должны понимать шестнадцатеричные дампы, понимать, что нужно записывать на аппаратные адреса, и уметь понимать, что происходит при выполнении различных показанных команд. Есть пара моментов, когда вещи не работают должным образом - пока я показываю используемые мной рабочие места, я не объясняю их, так как это заняло бы слишком много места - вы должны быть в состоянии понять, что происходит в Чтобы иметь возможность изменить подход в соответствии с вашей ситуацией.
предупреждение : это включает в себя поиск на уровне байтов по шине i2c. Таким образом вы можете нанести непоправимый ущерб оборудованию. Если ваш монитор уже не работает, вам, возможно, не придется много терять, но если вы неправильно введете номер шины i2c, вы можете в конечном итоге что-то делать с внешним монитором.
Скачайте edid-tool, скомпилируйте его
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
установите несколько пакетов - в дистрибутивах на основе debain вам нужно:
sudo apt-get install i2c-tools libi2c-dev
Затем установите модуль ядра:
sudo modprobe i2c-dev
Теперь у вас должны быть /dev/i2c-1
, /dev/i2c-2
... соответствующие шине i2c 1, 2 и т.д.
Следующая задача - выяснить, на какой шине i2c задействован соответствующий экран. См. Связанный отчет об ошибках для деталей - в основном, которые выглядят примерно так:
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
Экран с проблемой, вероятно, покажет bad checksum
и ошибки bad header
. Кроме того, в тексте могут содержаться сведения о производителе - в этом случае внешний монитор Dell был установлен на i2c-1
а сломанный внутренний экран ноутбука был на i2c-2
.
В остальной части решения будет использоваться /dev/i2c-2
- не копируйте это вслепую - смотрите выше, как определить, какое устройство вам нужно использовать.
Далее выведите текущие данные EDID:
~ $ 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 |.... .... .... ....|
....
Теперь используйте инструмент для исправления данных:
~ $ 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 |.... .... .... ....|
....
Это показывает, что поврежденные данные EDID имеют ff
в байтах 0x00
и 0x07
где они должны иметь 0x00
Проверьте сгенерированные данные с помощью parse-edid
для вывода раздела Xorg.conf
:
$ 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
Убедитесь, что Modeline
соответствует характеристикам вашего экрана.
Теперь мы должны быть в состоянии загрузить фиксированные данные с
sudo ./edid-tool /dev/i2c-2 write < edid-fixed
но это не сработало ни для автора сообщения об ошибке, ни для меня.
Однако есть способ исправить отдельные значения на шине 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: -- -- -- -- -- -- -- --
Это показывает, где расположены данные edid - в байтах от 0x50
до 0x57
.
Нам нужно проверить данные в самом начале, поэтому мы делаем это:
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
Хорошо, похоже, edid-tool
исправил первый байт, но не смог исправить его в 0x07
.
Итак, мы установили это следующим образом:
sudo i2cset -y 2 0x50 0x07 0x00 b
Так что теперь у нас есть правильные данные. Но монитор все еще не работает. Запустите это снова:
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
Сравните этот вывод с выводом edid-tool ... fix
и я вижу, что последний байт отличается.
Поэтому я исправляю это с помощью:
sudo i2cset -y 2 0x50 0x7f 0xc8 b
немедленно монитор возвращается к жизни.