飞利浦液晶显示器DVI接口修复

2011年6月买的一台飞利浦液晶显示器,型号196E3LSB93,1440×900的分辨率,提供DVI和VGA两种接口,买回来一直用DVI接口。直到有一天,记不清是2012年底还是2013年初,刚装了win8没多长时间吧,开机后发现分辨率出现异常,只能显示到1024×768,调回1440×900,画面显示不完整,只能裁剪出1024×768的范围。

一开始以为是显卡驱动的问题,换驱动没用,然后怀疑显卡坏了,因为电脑是06年配的,撑了这么久也到该换的时候了,没想着显示器会出问题,才用了一年多。抱着试试看的心态,用VGA线连上显示器,发现可以正常显示,感到有一丝欣慰,这显卡还没完全坏,至少还有一个口能正常输出。但又想了想,或许显卡压根就没坏呢,有可能是DVI线的问题。于是找了跟确定是好的DVI线换上去试,结果还是没有解决问题。后来又找到一个DVI转VGA的插头,把显卡的DVI口转成VGA接显示器的VGA口,发现这样是可以正常显示的,显卡的这个口应该也是好的,虽然没法完全排除,因为暂时找不到第二台带DVI的显示器来测试。如果显卡和dvi线都没有问题,那出问题的可能就是显示器了,但为什么接显示器的VGA口又是好的呢,百思不得其解。而且显示器也过了保修期,懒得去修,反正VGA能用就先凑活着用。但是心里还是拧巴着,液晶屏怎么能不用数字线。直到后来发现有个叫EDID(Extended Display Identification Data)的东西。

知道这个东西是在玩树莓派的时候,当时是用HDMI线接家里的液晶电视,树莓派也是不能以正常分辨率显示,出现一圈黑色边框,网上搜了才发现显示器和显卡之间建立连接时,显示器会发送一份128字节的EDID数据给显卡,告诉显卡显示器支持的显示参数,如分辨率,刷新率等等,而液晶电视的EDID是有点问题的,网上的解决办法是忽略从显示器读取EDID,从一个本地的二进制文件中去读。为了生成这个128字节的EDID数据,我下了一些EDID的编辑工具,也大概了解了EDID的数据结构和工作原理,也发现了,不止是HDMI接口用EDID,DVI也使用EDID,新的显示器的VGA也是提供EDID的,还有工具可以从连接的显示器上把这个EDID备份下来。后来试着用电脑的DVI口连显示器去读EDID,读不出来,用树莓派的HDMI转DVI接显示器,也是读不出来,不过电脑通过VGA连显示器是可以读出EDID的。

把从VGA接口读出来的EDID改了改,主要是把里面的模拟信号选项改成数字,然后放到树莓派的boot文件夹里,设置从文件读取EDID,然后连显示器的DVI接口,可以按照正常分别率显示。这下基本可以确定是显示器DVI接口的EDID出问题,网上提供的解决方案就是重刷EDID,有使用软件的,还有的要用到专门硬件来烧写,还有的是买中间的转换器,可以从转换器中读EDID。硬件的暂时没法试,软件的试了几个,都不行,稍微有点靠谱的是powerstripe,但是要注册版的才能写EDID,应为注册也挺贵,就放弃了。

最近打算换新电脑,而VGA这种接口很多机型都不再提供了,相到显示器的DVI还不能用,这不是还要换显示器?不甘心啊,于是又上网看看有啥新法子没有。对了,在这之前,我又玩了一段时间的arduino开发版,对硬件IO、传感器、一些简单的电子元器件有了一定的了解,这对最后解决EDID的问题打下了基础。

网上发现了powerstripe的破解版,拿来试了下里面的写EDID的功能,提示能够找到EEPROM,但是写不了,说是有写保护或者线太长了。好歹有了点线索。于是尝试着去除写保护,看到有人说显示器的工厂模式可以开启,于是去查飞利浦显示器的工厂模式怎么进,虽然查到了方法,也进去了,但没有发现关掉写保护的选项,看来软件这条路没戏了。

还是不甘心,来硬的吧,于是查了下DVI接口的针脚定义,发现有两个针脚是专门用来读取EDID和控制显示器设置的,DDC-SDA和DDC-SCL。查了下DDC是Digital Display Channel,SDA,SDL,有点眼熟,好像哪里见过。想起来了,在玩arduino的时候接过一个气压传感器,就有这两个针脚,是I2C串行总线。看来有戏,手头上的树莓派和arduino都支持I2C,可以试着连上看能不能写。

先试了树莓派,因为有i2c-tools这样的工具包,又有界面可以实时看到结果。但是检测i2c设备时,第一次能够检测到一个地址为0x50的设备,再检测就没有了,也没法读写,查了下,问题可能出在电压上,pi的io电压是3.3V的,而DVI用的是5V。于是换arduino,它的io电压是5V。找资料看了下arduino访问i2c设备的方法,先试了个设备扫描的代码,发现这会可以稳定地扫描到在0x50地址上有一个设备,网上查了应该就是存放EDID的那个EEPROM,然后去找了读写EEPROM的代码,发现可以读出来,但有点不对劲,没插设备有时也能读出一样的东西,仔细查了下,发现网上代码里有逻辑上的错误,还好,debug我在行。改好了读的代码,发现读出来的EDID数据确实是有问题的,只有中间一部分是正确的数据,其他的都成0了。接下来就要琢磨下怎么去写EDID了。arduino的Wire库提供了和I2C总线交互的相关功能,也看了I2C接口上写EEPROM的时序,先写一个数据位的地址,再写数据的内容。但是写操作总是不成功,根据返回的错误代码,说是DATA_NACK,看来确实被写保护。也奇怪,写保护了数据还能坏掉,这是有多倒霉啊。

从外面去除写保护看了是没可能了,只能拆开看看了。拆的过程,除了一圈的塑料卡扣撬的心惊胆战,其他螺丝什么的都还好。网上也没找到我这个型号的电路图,但找到了个类似型号的,里面还算简单,液晶面板,电源模块,主控模块,控制面板这几个部分,DVI接口是在主控模块上的,看了看周围的元器件,发现了一颗ST24C02RP,就是它了,网上找了这个元件的datasheet,看了针脚定义,把写保护针脚接地就可以去除写保护了。这是个贴片的元件,针脚太小了,找了跟细导线,费了老大劲才引了根飞线出来,然后真的可以写了,欢呼。立马编程序把正确的EDID写了进去。有编了程序从测试了下有没有写好,发现没问题,可以读到正确的EDID了。

然后把显示器重新装好,插上DVI线,启动电脑,分辨率自动识别出来了,一切OK。

又一个纠结了n久的问题解决了,强迫症得到缓解。


已发布

分类

作者: