前几天QA报了一个bug说是 当上游信号源为BDP360 DVD时,下游TV没有图像显示。
先简单介绍下我们平台的情况,如右所示。 上游信号源(DVD) ----------》 Our Chip( Rx+Tx) ----------》 下游TV
设备兼容性测试是视频接口产品(如HDMI Rx)中非常麻烦的一个环节。 QA或客户随时都可能从哪个角落里找出一个device来测试产品的兼容能力。 又由于HDMI spec不可能把上、下游设备的行为规定得非常详细,所以在规则允许范围内,设备的行为就可能千差万异。 这也是为什么有的设备在我们产品work的很好,而换成别的设备就会出现问题。
回到上面这个问题,我看到的现象是, 下游TV在不停的toggle我们chip,从而导致chip的Rx不停的去toggle 上游DVD的HPD。 粗看上去是HPD 的issue。 期间还犯了一个错误,就是用万用表来测量hpd pin上有voltage变化,结果是电压值非常稳定。 为此还纠结了很久,以为是chip本身的问题。 后来用scope来trigger就能看到下游TV的确在toggle hpd。 这里需要申明下, 就是极少数TV和monitor在没有收到稳定video时会不停的toggle上游的hpd。
后来用I2C monitor来观察dvd和chip见的DDC 数据,发现EDID data checksum wrong。 经同事提醒,sony dvd如果读到错误的EDID就不会发送图像出来。到这个阶段,我们终于明白了, 原来是dvd读到我们错误的EDID 了。 那我们chip 的edid实际上就是读下游TV的edid然后存放到SRAM里面供上游dvd来读。
我又做了一个测试,直接用874链接下游tv,经特定pattern检测,TV EDID是正确的。然后我又在程序里面把SRAM存放的edid打印出来,结果和前面完全一样。 那为什么DVD会读错呢?
百思不解中,幸好有硬件同事提示,我们板子上有2处EDID, normally上电时chip读下游EDID然后存放在sram供上游读;但没电时,上游会读板子上eeprom的缺省edid。 这里面有个gpio在控制。 当上电后,应该把它拉高,以便eeprom i2c 地址改成0xA4,使上游能读sram edid。在fw init上加上这个拉高动作,上游就能读到sram的edid,图像正常显示。 估计eeprom里面的edid是坏的。
难的问题往往有很多表象来迷惑我们,而且这里面device有些不同的行为,才导致这个问题解起来比较费时(花了一天)