一周以来,笔记本电脑屏幕一片空白。如果我插入外接显示器,它就可以正常工作。
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 数据所在的位置 - 从字节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
显示器立即恢复运行。