笔记本电脑屏幕空白,内核日志充满 EDID 错误

笔记本电脑屏幕空白,内核日志充满 EDID 错误

一周以来,笔记本电脑屏幕一片空白。如果我插入外接显示器,它就可以正常工作。

dmesg每分钟显示几个这样的错误消息:

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

谷歌搜索显示,EDID 数据是从屏幕读取的,以了解其显示功能。就我而言,它似乎已损坏。有一个很多讨论了各种修复方法,但我找不到任何明确的解决办法。

答案1

我在freedesktop.org 错误追踪器涉及通过 i2c 总线重写 EDID 数据。

有另一种解决方法在 Arch wiki 上但它需要访问 Windows 驱动程序,否则就创建一个神秘的内核命令行来覆盖 EDID 查询。

警告:这是一项相当高级的技术。您需要了解十六进制转储,熟悉写入硬件地址的概念,并能够理解运行所示各种命令时发生的情况。有几点事情没有按应有的方式进行 - 虽然我展示了我使用的解决方法,但我没有解释它们,因为这会占用太多空间 - 您需要能够理解发生了什么,以便能够根据您的情况修改方法。

警告:这涉及在 i2c 总线上以字节级别进行探索。这样可能会对设备造成不可挽回的损坏。如果您的显示器已经无法正常工作,您可能不会损失太多,但如果您弄错了 i2c 总线编号,您最终可能会对外部显示器进行操作。


下载编辑工具,编译它

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。此外,文本中可能还有制造商的详细信息 - 在这种情况下,戴尔外接显示器处于打开状态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 数据所在的位置 - 从字节0x500x57

我们需要在开始时检查数据,因此我们这样做:

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

显示器立即恢复运行。

相关内容