前段时间我买了一个7寸屏,1024x600的分辨率的,放在车上使用,用来做一些小开发。

这个显示屏买回来的时候是好的。不论是查到电脑、树莓派、香橙派,都是可以正常使用的。

直到几天前,再次插到香橙派的时候,发现屏幕分辨率不对了,是1024*768的分辨率了,明显的畸变;插到树莓派,问题依旧,插到电脑,显示正常。找到屏幕售后,一直说是我的系统不支持这个分辨率啥啥啥啥的,让我重新装个系统,我之前用的好好的,怎么突然间两个设备都不支持这个分辨率了,肯定不是这个原因,不过客服肯定也不是很专业,这个就不难为他了。

为了这个事情,我搞了3天左右,最终解决了问题,接下来我就原因,以及我在这个过程踩的坑分享下,免得大家走了我的老路。

真实原因:显示器的EDID被改了

不知道什么原因,显示器的EDID被篡改,导致主机无法正常识别屏幕的显示信息。但是windows系统在介入一个屏幕之后,会在注册表留下这个屏幕的EDID(正确来说只是EDID的一半,128个字节),我推测如果CHECKSUM不对,它会调用这个屏幕的注册表信息去显示,就能解释为什么电脑也能用。

使用Linux系统读出来EDID,然后解包的时候就提示了是checksum错误。注意红框里面的信息,下文有用。

最后我是使用windows注册表里面前128位加上读出来的后128位(这个没有checksum故障),合成一个新的edid,重新写了回去(用edid-rw),就正常了。我也不敢保证这个EDID以后会不会还出问题,只能存个档了,出问题再写吧。这个显示屏的EDID是存到了一片外挂的EEPROM里面,写保护没有开,可以直接通过HDMI写进去。

我踩过的坑:

1、使用CVT PTF 自定义分辨率。

没用的,时序和面板不一致,一套用就会黑屏。真正有用的时序是上面那个图中红色框的部分,使用xrandr可以自定义分辨率,并套用。但是xrandr的格式和上面的格式是不一样的,要自己转换一下,我是直接把内容提供给deepseek,让他帮忙转了xrandr的参数。

2、将edid文件嵌入到内核中

我很快就知道了windows存了一份edid的事情,也把这个edid拿出来了,并使用grub加载到内核。无奈linux的机制,应该是检测到edid失效之后,就不会当这个显示器是一个正常的显示器,也不会套用edid里面的信息了,搞到内核也没用。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐