美国国家标准协会 (ANSI) 是一个私营的非营利组织,负责管理和协调美国自愿性标准和合格评定系统。该研究所成立于 1918 年,与行业和政府的利益相关者密切合作,为国家和全球优先事项确定和开发基于标准和一致性的解决方案。
标准和技术法规共同影响全球贸易的 93%。全球相关标准和确保其有效使用的一致性措施有助于提高效率、开放市场、增强消费者信心并降低成本。ANSI 是美国的领导者,在为全球各个行业的企业和消费者培养这种潜力方面处于领先地位。
视频电子标准协会 (VESA) 是由代表来自世界各地的、享有投票权利的285多家成员公司的董事会领导的非盈利国际组织。
VESA致力于开发、制订和促进个人计算机(PC)、工作站以及消费类电子产品的视频接口标准,为显示及显示接口业界提供及时、开放的标准,保证其通用性并鼓励创新和市场发展。
消费电子协会 (CEA) 联合了消费技术行业的 2000+家公司。会员可利用宝贵且创新的会员专属资源:组织大型的展会、无与伦比的市场研究、与商业倡导者和领导者的交流机会、制定最新的教育计划和技术培训、广泛的促销计划,以此促进电子行业的发展,推进行业标准的制定。
EDID:Extended Display Identification Data(扩展显示标识数据)
它是由VESA创造出来的一种数据结构。(128字节数据)
这种数据结构包含了显示器设备自身的基本信息、基本特性和基本功能。
其中EDID 2.0是第二代的EDID,主要是用来取代第一代的EDID。
它是一个可变长度的新结构,最高可达256字节,因为不能兼容第一代的EDID,使用频率不高。
E-EDID:Enhanced-EDID
E-EDID是基于当前EDID 1.3的版本,并在其基础上进行数据扩展。
每个扩展单元是128字节。
如果不扩展就同等于EDID 1.3
如果扩展1个单元,就达到256字节数据 (128字节基本数据 + 128扩展数据)
扩展2个单元就,就达到384字节数据 (128字节基本数据 + 256扩展数据)
关于扩展数据部分的介绍,在下一篇《EDID扩展数据结构》再来聊
前面介绍了EDID中包含了显示设备自身的基本信息,而信息就是要让别人了解你的。
因此EDID的作用就是告诉主机或其他的图像输出设备,该给显示器什么分辨率,什么时序,显示器支持的功能有哪些,如何才能显示最佳的效果等等。
现在的显示器常见接口有DVI、VGA、HDMI、DP等,由于每种接口的特性和带宽不同,不同接口的EDID也不尽相同。
因此软件需要给对应接口配置不同EDID,使用哪个接口,PC读到的就是哪个接口的EDID。
EDID一般在烧录程序时直接写入EEPROM 或CPU的RAM里,
主机启动时,通过DDC(下面介绍什么是DDC)读取显示器EDID数据,如果有EDID的话,主机将EDID数据传给显卡,主机根据EDID输出最匹配当前显示器的显示格式。
DDC全称:Display Data Channel (显示数据通道)
它是由VESA制定的一条主机和显示器之间通信的数据通道。
有了这条通道,显示器就可以将EDID传输给主机
既然说到是通道,那这条通道到底在哪里?又是怎么样传输的呢?
DDC通道就存在于主机和显示器之间的连接线。
DDC使用I2C总线协议进行通讯。
I2C总线中的3条线:
SDA<—>数据、SCL<—>时钟、+5V<—>供电
DDC规范定义了一个+5V的电源连接,以提供电源给显示器的EDID电路,这样就算不打开显示器的电源也可以进行通讯。
DDC的通讯方式有多种,目前主流使用的是DDC2Bi传输。
(1)ID Manufacturer name(制造商名称):2 bytes
在这2 byte的数据格式下,厂商名称只能有3个字母, Character 1~3.
按Compressed ASCII格式转换(“00001”=“A”, “00010”=“B”…“11010”=“Z”)
例如:当前填入3个字母为 “OOO”,得到:“01111 + 01111 + 01111”
→"00111101 11101111"(最高位补0)→"3DEFh"→"3Dh"+“EFh”
(2)ID Product code(产品代码):2 bytes
有需求的,自行修改产品代码
例如:当前填入0x1234,
EDID中的 0x0A存储0x34,0x0B存储0x12
(3)ID Serial number (产品序号):4 bytes
有需求的,自行修改产品序号
例如:当前填入“12345678”
EDID中的 0x0C存储0x78,0x0D存储0x56,0x0E存储0x34,0x0F存储0x12
(4)Week of Manufacture (制造周):1byte
有需求的,自行修改机器制造时候的周(一年52周)
例如:第16周→“10h”
(5)Year of manufacture (制造年份):1byte
有需求的,自行修改机器制造时候的年份
该字节根据公式:Value = (Year of manufacture - 1990)
例如:年份写2019年,则该字节应Value = 2019-1990 = 31 →“1Dh”
当前为1.3版本:版本号Version = 1 →“01h”,修正号Revision = 3 →“03h”
(1)Video input Definition(视频输入定义):1 byte
该字节定义输入信号为模拟信号还是数字信号
模拟信号中还有信号电平、分离、复合信号、是否支持sync on green功能等Video信号参数。
例如:当前byte为0x80, 转为二进制 --> 1000 000对应表格中bit 7-0为数字信号配置
这部分参数需要参考规格书。
(2)Max. Horizontal Image Size:1 byte
(3)Max. Vertical Image Size:1 byte
这2字节定义行、场最大size,单位为cm;
这2个参数查看规格书
例如:最大行size 530mm → “35h”,最大场size 290mm →“1Dh”
(4)Display Transfer Characteristic(显示传输特性):1 byte
该字节根据公式”Value = (gamma x100)-100”。
例如:gamma为2.2,根据公式计算Value = (2.2×100) – 100 = 120 → "78h”
(5)Feature Support (支持特性):1 byte
该字节定义显示器是否支持DPMS、Standby、Suspend、sRGB、GTF等功能。
例如:设置当前字节为0xEA 转为二进制 --> 1110 1010
这10个字节提供R,G,B色度坐标及白点坐标值。
这部分参数一般用不到,随便参照一组参数来填即可
这3个bytes提供一些基本固定的VESA, Apple, Mac, IBM VGA等常用的Timing,可根据显示器的特性在提供VESA EDID Spec Timing list中选择所支持的Timing.
这16个bytes提供8个额外的支持VESA mode和GTF Mode的Timing
每个标识由一个独特的2字节编码组成,该编码来自模式格式和刷新率,
这些都是不在Established Timing中的
一个Timing占2个 byte,不使用的可以将对应2个byte填充为 [01h, 01h]
Descriptors部分总共72 bytes,被分为4个部分,每部分有18 bytes,里面需要包含显示器的最佳分辨率、频率范围、显示器名称等信息
使用详细时序部分应满足以下要求
①:这4部分都应使用对应的格式(下面会介绍
)填充有效的数据,不允许使用数据填充模式。
②:时序数据必须支持最少一种显示模式。
③:描述时序的符块的顺序应是放在其他类型的描述符块之前。
④:第一个描述时序的符块应该是该显示器的最佳显示模式
⑤:必须包含一个显示器频率范围限制描述符块
⑥:必须包含一个显示器名称描述符块
注:上述第4、5和6项在EDID结构版本3之前是允许的,但不是必须的,主机可能会遇到使用EDID版本0-2的显示器不符合所有这些要求。
Descriptors符块配置
参考例子A:
第一部分:首选的最佳详细时序(第一项必须显示器最佳时序)
第二部分:详细时序2(可填其他格式)
第三部分:显示器名称(必须包含)
第四部分:显示器范围限制(必须包含)
参考例子B:
第一部分:首选的最佳详细时序(第一项必须显示器最佳时序)
第二部分:显示器名称(必须包含)
第三部分:显示器范围限制(必须包含)
第四部分:显示器序列号(可填其他格式)
(1)详细时序描述符块 – 18 bytes
详细时序仅用于指示显示器供应商确定提供最佳图像的模式。
对于 LCD 显示器,这在大多数情况下是panel的“本机时序”和“本机分辨率”。
Flags byte中的 Bit[6-5-0] 参考table
Flags byte中的 Bit[2-1] 参考table
当前的详细时序描述符块:
(2)显示器描述符块 – 18 bytes
其他部分可根据需要放置显示器频率范围、显示器名称、显示器序列号.
至于如何放置对应内容,主要取决于开头前5个 byte
当前显示器描述符块中的数据类型标记是FC即显示器名字
扩展标志: 除主块128字节外,如果有扩展的EDID字节数,则该字节置1。VGA和DVI的值置0,HDMI一般都会有扩展字节。
校验和:用来确认EDID信息传输是否正确。
校验和的计算方式:前127个字节的和 + Checksum字节 = 0x00
也就是说这128个数的总和,是0x100的整数倍,即256的整数倍.
所以Checksum = 256 – (前127字节的和 % 256)