最近接触了一下DVI高清数字接口这个东东,开始感觉没什么,因为只做简单的应用,不涉及深层编码那些研究。不过一直对它的EDID数据的存储感到一丝神秘,研究了一段时间之后,现在将一些注意事项归纳一下,也算是一个小小的经验吧,其实这东西根本没啥技术含量,只要按照规定的协议格式写入数据就OK了的。
首先,在硬件方面一般是不会出什么问题的,这个我一开始还一直在怀疑,结果证明基本没必要。一般选用24C02作为EDID数据的存储器,连接也很简单,注意将三根地址线接地就可以了。选用24C02的原因是可以存256个字节的数据,刚好符合普通HDMI的需求,当然,如果是DVI设备的话只要128字节的容量就可以了。但这个不敢保证对以后一些扩展协议的支持了。
硬件有了之后就是怎样将数据写入的问题了,其实这也不是什么问题,就按照通常的操作方法,通过IIC总线的操作方式写就OK。最主要的问题还是改写什么数据,在查阅了多篇相关文章之后,终于搞明白一个问题。对于HDM I设备, ED ID 的第一个128Byte必须是符合EDID1.3的数据结构, 第二个128Byte必须是符合EIA/CEA-861B的CEA ED ID时序扩展数据结构。
这些字节的具体含义是很容易查到的,需要说明的是0x12, 0x13两个字节存储ED ID 的版本。例如, 0x12, 0x13 两个字节分别为″01h″″03h″, 代表当前为113版本。以及0x7E地址处的扩展数据的数量,如果是普通DVI设备则不需要扩展(对于目前的情况而言,以后可能需要扩展)。填入0x00即可,若是HDMI设备则要扩展一个数据块(128字节),就需要写成0x01。最后一位的校验和,是将这128个字的数加起来(不考虑进位)为零就行了。这个很重要,开始就是没注意这个问题,随便找了一个别人的模板数据写进去,一直调不通,后来自己验证一下,发现校验值不对,改过之后立即ok。
对于HDMI设备就需要再扩展128字节的数据,具体情况也有很多资料说明,也是注意最后的校验值就行了。下面列出一组我调试通过的EDID数据:
unsigned charCode_EDID[256]={0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x0C,0xA1,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0x01,0x03,0x80,0x50,0x2D,0x78,0x0A,0x0D,0xC9,0xA0,0x57,0x47,0x98,0x27,