EDID 手动设置固定输出模式:什么时候需要锁、怎么锁
锁 EDID 解决的不是「这一次没出图」,而是「每次开机结果都不一样」。它的实质是让链路里的某个设备对上游恒定代答一份固定的 EDID,把输出格式从每次上电的协商里摘出来。这篇讲什么时候该锁、锁哪一份、怎么确认你锁的那份数据里真写着你要的时序。
先判断该不该锁,锁是有代价的
站内那篇 HDMI/EDID 不识别的 7 步排查 走的是总体流程:线、口、直连、中间设备一路过下来。本文接在它后面——当你已经确认问题出在「EDID 协商结果不稳定」这一类,才轮到锁定登场。
适合锁的,是这三种形态:
- 结果随上电顺序变。显示端和源设备谁先起来,最终分辨率就不一样。协商本身能成,但成的结果取决于时机。
- 下游会被断开或替换。屏要检修、要临时拔走、要换一块同规格的备机,而上游主机不能跟着重配。
- 中间设备把 EDID 吃掉或改写了。源设备直连显示端正常,串上矩阵、分配器、延长器就不对。
不适合锁的,也很明确:链路里根本读不到 EDID(换根线就好了那种),锁定帮不上忙——它只是换了一份数据给上游,不修物理通道。还有一种更值得警惕:显示端将来还要换、还要升级,而锁定会把「输出什么」从一件自动的事变成一件必须有人记得去改的事。锁完之后没人维护那份配置,是后患。
锁定的代价说白了就一句:你切断了下游对上游的抗议渠道。协商机制原本能让屏对格式说「不」,锁定之后上游只认你给它的那份数据。所以锁什么、锁得对不对,责任从设备转移到了你身上。
锁定锁的不是”分辨率”,是那 128 字节
设备菜单里写着「固定输出模式:1080P60」,容易让人以为它在设定一个开关。实际发生的事是:该设备在上游来读 EDID 时,回一份预先备好的 128 字节基础块,与下游此刻在不在线、几秒后才上电、甚至换成了另一块屏,都无关。
按 VESA E-EDID 规范,这 128 字节里能表达时序的地方有三处,锁定生效与否要看这三处:
| 偏移 | 内容 | 与”固定输出模式”的关系 |
|---|---|---|
| 35–37 | established timings 位图 | 一批老规格用置位表达,粒度粗 |
| 38–53 | standard timings,8 组每组 2 字节 | 只能表达有限几组常用规格 |
| 54–125 | 四个 18 字节描述符 | 像素时钟非 0 的那些是详细时序描述符(DTD),完整写着一组时序的所有参数 |
四个描述符槽位不是全给时序用的:像素时钟字段为 0 的那个槽,装的是显示器名称、序列号字符串、范围限制之类的其它类型。所以一份 EDID 里最多四组 DTD——你想固定的那组时序,必须真的落在这三处之一里,上游才可能选得出来。
另外一个容易被跳过的字节是偏移 126,它写的是扩展块数量。如果你锁的那份只有基础块、126 写着 0,那就等于告诉上游「我只有这一块」,基础块之外的一切描述都不再传达。上游能选的范围就被你压到了这 128 字节之内——这既是锁定的目的,也是它的副作用。
三种锁法:选预设、学一份、导一份
具体菜单叫法各家不同(以你手上设备的手册为准),但实现路径就三类,取舍完全不同:
一、选设备内置的预设模式。 设备里烧了几组固定 EDID,你挑一个。优点是最快、不会写错;缺点是预设里若没有你要的那组时序,就没得选,而且预设里是否带扩展块取决于设备实现,需按手册确认。适合规格常规、只要求”每次都一样”的场合。
二、学习/复制当前下游的那一份。 让设备去读一次真实显示端的 EDID,存下来,此后一直回这一份。优点是这份数据必然和现场那块屏对得上;缺点是学习的时刻决定了一切——如果学的时候链路上还串着别的会改写 EDID 的设备,你学下来的是被改过的版本,锁定之后就把那个错误固化了。学之前先把链路捋直,这一条比学习按钮本身重要。
三、导入或编辑一份自定义 EDID。 自由度最高,也最容易出事,代价见后面校验和那一节。只有在前两条都够不着你要的时序时才动它。
三条路里,学习这条要特别当心:它看起来最”聪明”,但它固化的是你按下按钮那一瞬间的链路状态,而不是你想要的目标状态。
读出那 128 字节,确认锁的确实是你要的模式
配完不要靠”看着对了”收工。把上游侧读到的 EDID 导出成十六进制,按下面几步核:
第一步:验头。 偏移 0–7 必须是 00 FF FF FF FF FF FF 00。不是这 8 个字节,那就不是一个有效的 EDID 基础块,后面的解读全部作废。
第二步:确认这份到底是谁的。 偏移 8–9 是厂商 ID(PnP ID,三个字母各占 5 bit 打包进两字节,字母 A 记为 1),10–11 是产品码(小端),12–15 是序列号(小端),16 是制造周,17 是制造年减 1990。把这几项和你打算固定下来的那一份对照,就知道上游读到的是不是你指定的那一份。 注意这里比的是 EDID 与 EDID,不是拿它去比显示器铭牌——铭牌上印的是品牌全称与市售型号名,和 EDID 里的三字母 PnP 码、产品码不是同一套编码。
第三步:数描述符。 从偏移 54 起每 18 字节一段,共四段。看每段头两个字节(像素时钟,单位 10 kHz,小端存放)是不是 0:非 0 的是 DTD,为 0 的是别的类型。
第四步:把 DTD 里的分辨率拆出来。 DTD 前 8 字节的拆法是规范定死的,高低位分家存放:
| 偏移 | 含义 |
|---|---|
| 0–1 | 像素时钟,单位 10 kHz,小端 |
| 2 | 水平有效 低 8 位 |
| 3 | 水平消隐 低 8 位 |
| 4 | 高 4 位=水平有效的高 4 位;低 4 位=水平消隐的高 4 位 |
| 5 | 垂直有效 低 8 位 |
| 6 | 垂直消隐 低 8 位 |
| 7 | 高 4 位=垂直有效的高 4 位;低 4 位=垂直消隐的高 4 位 |
举个按上表反推的算例,帮你对上手感:若这 8 字节是 02 3A 80 18 71 38 2D 40,则像素时钟 = 0x3A02 × 10 kHz = 148.5 MHz;水平有效 = 0x7 拼 0x80 = 1920,水平消隐 = 0x1 拼 0x18 = 280;垂直有效 = 0x4 拼 0x38 = 1080,垂直消隐 = 0x0 拼 0x2D = 45。
第五步:推算刷新率。 刷新率 = 像素时钟 ÷(水平总数 × 垂直总数),总数 = 有效 + 消隐。接着上面的数:148 500 000 ÷(2200 × 1125)= 60。注意这是推算值,EDID 里没有一个字段直接写着”60Hz”,转述给同事时要说清楚,否则容易被当成读出来的原始数据。
验证:冷启动,且每一路都要验
锁定的全部价值在于「下次也一样」,所以验证方式不能是热重启。
- 完整断电冷启动。 让显示端和源设备都真正断一次电再上,重复两三轮。热重启不一定会重新触发协商,所以要用完整断电冷启动来验。
- 把下游拔掉再让上游上电。 这是锁定的核心承诺:下游不在,上游依然拿到那份固定 EDID、依然输出。这条过不了,说明代答没生效,先检查配置是不是落在了另一个端口上。
- 逐口验。 别默认锁定是设备级的总开关——多路设备上要逐个输出口/输入口确认是否都配了,只配一路就宣布完工的话,剩下几路照旧随机变。
- 回读比对身份字段——注意要按你用的锁法分叉判。 走内置预设或自定义那两条路时,上游读到的身份字段应当指向那份固定 EDID;而走「学习一次真实显示端再固定下来」那条路时,身份字段本来就该是屏的,读到屏的身份恰恰说明锁住了。所以身份字段只能用来确认「上游拿到的是不是你打算给它的那一份」,不能单独用来判断锁定成没成。
拼接场景还多一层要单独验的东西,见 拼接屏分辨率反复跳变的排查;显卡侧的输出与多屏拓扑怎么配,见 EDID 与显卡输出、多屏拼接配置。
最容易栽的三个坑
坑一:手工改了字节,忘了重算校验和。 偏移 127 是校验和,规则是 128 个字节相加对 256 取模应为 0。你把某个描述符里的分辨率改了,校验和就对不上了,整块 EDID 会被判为无效——现象是上游表现得像根本没读到 EDID,而你以为自己刚”配好”。凡是手工编辑过的 EDID,落盘前必须重算这一个字节。这也是不到万不得已别走自定义路线的理由。
坑二:锁了一组下游其实吃不下的时序。 锁定之后上游只信你给的那份,屏再不合适也没有渠道说不。表现会很割裂:上游那边一切正常、分辨率也是你要的,屏就是黑的或者花的。判断办法是临时解除锁定改回直连协商——直连能出图,就说明你锁的那组超出了下游的能力。
坑三:换了屏、换了链路,却没同步那份锁。 锁定把一个自动的机制变成了一份静态配置,它不会自己跟着现场变。换屏、加一级延长器、改线序之后,那份固定 EDID 依旧照旧回给上游,问题会以”莫名其妙”的形态冒出来。所以配完顺手记一笔:锁的是哪一路、哪一组时序、在哪个菜单里设的。这份记录的价值在半年后才显现。
下一步
如果你还不确定问题是不是出在协商环节,先回到 HDMI/EDID 不识别的 7 步排查 把总体流程走一遍再来锁;已经确定了,就按本文顺序来:先判断该不该锁、再选锁法、然后读那 128 字节确认内容、最后冷启动逐路验。
整个过程里唯一不能省的一步是把 EDID 读出来核一遍。设备菜单上的那个勾只表示”你点过了”,字节里写的才是上游真正会读到的东西——这两者对不上的时候,你排查的方向会整个偏掉。
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。