1

Уже неделю экран ноутбука пустой. Если я подключаю внешний монитор, он работает нормально.

dmesg показывает пару таких сообщений об ошибках в минуту:

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

Googling сообщает, что данные EDID считываются с экрана, чтобы выяснить его возможности отображения. В моем случае это, кажется, было повреждено. Существует много дискуссий о различных способах ее устранения, но я не могу найти что-то определенное.

1 ответ1

2

Я нашел решение на багтрекере 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

немедленно монитор возвращается к жизни.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .