IceYer 发表于 2024-5-14 08:25

记录一次显示器EDID文件解析

本帖最后由 IceYer 于 2024-5-14 15:24 编辑

### 一、简介

最近写一个读取显示器型号的东西,了解了EDID这个数据结构。EDID的全称是Extended Display Identification Data(扩展显示标识数据),VGA、DVI的EDID由主块128字节组成,HDMI的EDID增加扩展块(128字节),扩展块的内容主要是和音频属性相关的,DVI和VGA没有音频,HDMI自带音频,扩展块数据规范按照CEA-861x标准定义,未来可能增加到512或256的整数倍。

其中包含有关显示器及其性能的参数,包括供应商信息、最大图像大小、颜色设置、厂商预设置、频率范围的限制以及显示器名和序列号的字符串等等。形象地说,EDID就是显示器的身份证、户口本、技能证书等证件的集合,目的就是告诉别人我是谁,我从哪来,我能干什么。

参考资料:(https://www.cnblogs.com/beyond-rxl/p/9266997.html)

### 二、解析

#### 1.注册表信息

在Windows中连接过的显示器会被记录在注册表中 `计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\DISPLAY\CMN15F4\4&39f8f762&0&UID265988\Device Parameters`,其中 `CMN15F4\4&39f8f762&0&UID265988`根据显示器型号代码而定。在这个项目下包含一个EDID的二进制数据。
![注册表信息](https://www4.iceyer.cn:444/usr/uploads/2023/10/292859825.png)

#### 2.软件解析

这里我们可以用(https://www4.iceyer.cn:444/usr/uploads/2023/10/3447500159.zip)这款软件解析EDID文件。
!(https://www4.iceyer.cn:444/usr/uploads/2023/10/576639419.png)

为了更加方便转换,最好再配合(https://www4.iceyer.cn:444/usr/uploads/2023/10/1482702866.zip)这款软件,主要用到数据解释器。
!(https://www4.iceyer.cn:444/usr/uploads/2023/10/3576086409.png)

#### 3.主要关注内容

| 偏移地址 |    数值    | 解释                                                                               |
| :-------: | :---------: | :--------------------------------------------------------------------------------- |
| 0x08-0x09 |    0D AE    | 制造商名称                                                                         |
| 0x0A-0x0B |    F4 15    | 产品代码                                                                           |
| 0x0C-0x0F | 00 00 00 00 | 产品序列号                                                                         |
|   0x10   |   06   | 生产周                                                                           |
|   0x11   |   1B   | 生产年份                                                                           |
|   0x15   |   22   | 最大水平图像尺寸,单位CM                                                         |
|   0x16   |   13   | 最大垂直图像尺寸,单位CM                                                         |
| 0x36-0x37 |    59 6F    | 像素时钟/10000                                                                     |
|   0x38   |   80   | 水平活动像素数                                                                     |
|   0x39   |   A0   | 水平blanking                                                                     |
|   0x3A   |   70   | 高四位:水平活动像素数,高4位与0x38组合;低四位:水平blanking,高4位与0x39组合 |
|   0x3B   |   38   | 垂直活动像素数                                                                     |
|   0x3C   |   3E   | 垂直blanking                                                                     |
|   0x3D   |   40   | 高四位:垂直活动像素数,高4位与0x3B组合;低四位:垂直blanking,高4位与0x3C组合 |

1. **制造商名称**:3个字母组成,基于压缩的ASCII码,例如 `00001=A`… …`11010=Z`,这里 `0x08-0x09`一共16位(0-15),其中第 `0`位代表符号,`1-5`位表示第一个字母以此类推,共三个字母。将 `0x08-0x09`中的 `0D AE`转换后为 `CMN`。
2. **产品代码**:固定为 `4`位16进制数,即两个字节。将 `0x0A-0x0B`中的 `F4 15`转换后为 `15F4`。
3. **产品序列号**:即产品的流水号(数值型),直接转成16进制或以ASCII格式转换。序列号也可用字符型,在后面DTD部分定义。我这个显示器没记录此序列号。
4. **生产周**:即在当年中的生产周,范围 `1\~52`,注意 `0`为无效值。`06`为第 `6`周。
5. **生产年份**:规定1990开始计算,即 `1990`年为 `0`,然后递增计算。`1B`为 `2017`年。
6. **像素时钟**:将 `0x36-0x37`中的 `59 6F`转换十进制 `28505`,即为 `285MHz`。
7. **水平活动像素数**:将 `0x3A`拆分 `前4位`,与 `0x38`拼接后得到 `07 80`,转换十进制 `1920`。
8. **垂直活动像素数**:将 `0x3D`拆分 `前4位`,与 `0x3B`拼接后得到0438,转换十进制 `1080`。
9. **水平blanking**:将 `0x3A`拆分 `后4位`,与 `0x39`拼接后得到 `00 A0`,转换十进制 `160`。
10. **垂直blanking**:将 `0x3D`拆分 `后4位`,与 `0x3C`拼接后得到 `00 3E`,转换十进制 `62`。
11. **刷新率**:像素时钟×10000÷[(水平活动像素数+水平blanking)×(垂直活动像素数+垂直blanking)]=28505×10000÷[(1920+160)×(1080+62)]≈120Hz。

### 三、下载

原文排版和下载看这里吧...
https://www.iceyer.cn/index.php/archives/183
页: [1]
查看完整版本: 记录一次显示器EDID文件解析