
HDMI 2.1 出来这几年FRL 这三个字母高频出现在各种新显示设备的规格表里但真正被问到“FRL 的流控到底怎么工作”时很多人其实还停留在“速率高了、带宽大了”这个层面。我最早调 FRL 链路的时候也被链路训练、流控帧、加扰这一堆概念绕得够呛后来踩了几次坑才把整条链路串起来。这篇就把 HDMI 2.1 FRL 的流控机制从头到尾梳理一遍适合刚接触 FRL 的显示驱动开发、硬件设计、测试工程师也适合只是想搞明白“为什么换了 FRL 还是会有花屏闪屏”的朋友。1. 为什么要从 TMDS 换成 FRL带宽天花板逼出来的转型1.1 TMDS 时代的瓶颈HDMI 2.0 时代用的是 TMDSTransition Minimized Differential Signaling传输方式通道结构是 3 个数据通道加 1 个时钟通道总带宽 18Gbps但因为 8b/10b 编码要吃掉 20% 的开销实际有效视频带宽只有 14.4Gbps 左右。4K60 4:4:4 8bit 勉强能跑再往上比如 4K120、8K60、10bit HDR 这类需求TMDS 就算把牙齿咬碎也塞不进去。而且 TMDS 里单独跑一根时钟线高频时时钟抖动、EMI 问题都很头疼。HDMI 2.1 干了一件很果断的事直接放弃 TMDS 结构引入 FRLFixed Rate Link固定速率链路作为新的物理层传输机制。FRL 不再单独传时钟而是把时钟信息嵌入每条 Lane 的数据流里接收端通过 CDR时钟数据恢复把时钟捞出来。这个思路和 DisplayPort 的多通道高速传输非常像但 FRL 有自己的一套链路训练和流控逻辑不能简单看做 DP 的复制品。1.2 FRL 的链路骨架Lane、速率、编码FRL 和 TMDS 最直观的区别是通道数量。TMDS 固定 3 组数据线FRL 则是可选的 3 Lane 或 4 Lane 配置。3 Lane 模式主要为了兼容一些桥接场景比如 DP 转 HDMI、Type-C 转 HDMI 的芯片方案只提供到 18Gbps 的速率档位4 Lane 是完整形态最高可以跑到 48Gbps。每个 Lane 上的线速率也不是随意定的HDMI 2.1 规范定义了明确的档位我第一次看这个表的时候还特意数了一遍有 3G、6G、8G、10G、12G 几个档组合起来对应 FRL1 到 FRL6FRL 档位Lane 数单 Lane 速率总带宽FRL133 Gbps9 GbpsFRL236 Gbps18 GbpsFRL346 Gbps24 GbpsFRL448 Gbps32 GbpsFRL5410 Gbps40 GbpsFRL6412 Gbps48 Gbps编码方式也从 TMDS 的 8b/10b 换成了 16b/18b每个 18bit 里有 16bit 是有效数据编码效率从 80% 提到 88.9%。FRL6 48Gbps 对应的有效视频带宽大约是 42.67Gbps这就是为什么 8K60 10bit 4:2:0 这类超高分辨率信号必须靠 FRL 才能跑得动。在讨论 FRL 带宽时经常有人只看“48Gbps”这个宣传数字其实真正用来跑像素数据的只有 42.67Gbps 左右这已经是业内公开的“隐藏知识点”了。做产品设计的时候如果按 48Gbps 去算余量很容易栽跟头。1.3 为什么固定速率这么重要FRL 里“Fixed Rate”这个词很关键。TMDS 时代像素时钟跟着分辨率走时钟频率一变整个传输链路的工作点都要变这让源端Source和显示端Sink之间的时序协商非常麻烦。FRL 则像一条跑在固定速率上的高速公路无论前面送的是 1080p 还是 8K链路本身的 Lane 速率在握手阶段就定下来了视频数据以包的形式塞进这条固定带宽管道里。这样设计的好处是链路的工作状态稳定CDR 锁定后不容易因为分辨率切换而反复重新训练。但这个“固定”也带来了一个代价即使只显示一个 1920x1080 的桌面只要链路协商到 FRL64 条 Lane 依然跑在 12Gbps 上功耗和 EMI 压力不会因为画面简单而降低。所以 HDMI 2.1 后来加入了 QMSQuick Media Switching机制允许在 VRR 场景下快速切换 FRL 速率而不中断显示。这一段涉及到“流控”的核心逻辑链路速率怎么协商、怎么切换、怎么维持稳定都是一套独立于视频内容的控制流程。2. FRL 流控的核心链路训练、控制符号与错误管理2.1 链路训练源端和显示端如何“握手”FRL 链路的流控从握手那一刻就开始了。Source 上电后不会直接往 Sink 猛灌高速数据而是先通过 DDC/SCDC 通道交换能力集也就是 I2C 上那组寄存器。Sink 会把支持的最高 FRL 速率档位、Lane 数上限、是否支持 FRL 训练等能力报告给 SourceSource 再根据这两边的能力选择一个双方都能接受的配置。这个阶段容易出问题的点是 SCDC 寄存器读写时序。我调试时遇到过 Source 端 i2c 读 Sink 能力耗时过长导致整个握手过程超过几百毫秒显示器黑屏时间变长。后来把首轮读操作的容错机制调好超时重试次数压下来体验才正常。链路训练的大致流程是Sink 上电并通过 Hot Plug 引脚告知 Source 已连接Source 通过 SCDC 读取 Sink 的 FRL 能力Max FRL Rate、Lane 数等Source 选择目标速率档位写入 Sink 的 SCDC 寄存器Source 在 FRL 模式下发送训练序列Training PatternSink 接收并锁定训练序列回写训练状态寄存器Source 确认链路训练成功进入正常视频传输链路训练可以理解为 FRL 的“开闸放水”流程只有双方都对速率、Lane 数、加扰方式达成一致才能正式传输视频流。值得注意的是训练序列不是一次性的链路运行中如果误码率上升或者信号丢失双方还要能通过重新训练回到正常状态。这部分机制就是流控里最底层的部分。2.2 流控帧与控制符号的实际作用很多资料里没有把 FRL 的流控帧讲清楚。FRL 的数据在逻辑上被分成一个个块每个块由大量数据符号Data Symbol和少量控制符号Control Symbol组成。控制符号不携带像素数据它承担的是“交警”角色告诉接收端这一行的帧从哪开始、到哪结束、是什么类型的包、链路的时钟是否对齐。我习惯把这些控制符号理解为“流控帧”。在 FRL 链路上流控帧承载的信息包括帧起始FS、帧结束FE、行同步参考、数据包类型标记以及链路管理命令。如果流控帧丢了就算像素数据全部正确接收端也无法拼出一帧完整画面表现就是黑屏、画面撕裂或者花屏。调 FRL 链路的时候我看协议分析仪的报告第一眼不是盯着像素数据而是看控制符号有没有错误计数。控制符号的出错率能很直观地反映物理层信号质量比看整帧图像更早暴露问题。有一次客户报“4K120 偶尔黑一下”抓了半天视频流都正常最后是流控帧出现了间歇性误码导致 Sink 端 FEC 持续纠错后仍判定链路不稳触发了重新训练。这种问题如果只看分辨率、帧率指标根本看不出来。2.3 加扰与 FEC长时间稳定传输的保障FRL 引入加扰Scrambling是为了解决长串相同数据导致的 DC 平衡问题和 EMI 辐射。高速串行链路最怕连续发“0”或者连续发“1”因为接收端 CDR 电路需要信号里有足够的跳变沿来提取时钟。加扰器用一个伪随机序列PRBS对原始数据进行异或处理把原始数据流“打乱”保证链路上随时都有丰富的跳变沿。接收端再用同样的 PRBS 序列做解扰把原始数据恢复回来。FEC前向纠错则是给 FRL 链路加了一道“保险”。FEC 的基本原理是发送端在数据块后面附加校验信息接收端如果发现某个符号出错可以利用校验信息直接纠正而不需要请求源端重传。这在长线传输时尤其有用因为 HDMI 线缆到了 12Gbps 频段插损回损已经很严重随机误码很难完全避免。FEC 的纠错能力不是无限的它适用于随机分布的少量错误对连续大块错误无能为力。实际调测中如果误码率已经超过 FEC 的纠错上限画面就会出现可见的异常。这时候不能指望再靠 FEC 扛而是要从物理层下手查线缆质量、查 PCB 走线、查连接器虚焊。2.4 SCDT流特征检测有什么用FRL 模式里还有一个容易被忽略的概念叫 SCDTStream Character Detection流特征检测。简单说SCDT 能让 Sink 在源端进入省电或视频流暂停状态时快速识别出来并自动调整自己的状态避免误判为链路断开而触发重新训练。这个机制在 VRR可变刷新率和 QMS快速媒体切换场景下特别重要。游戏帧率从 120fps 掉到 30fps 时源端不会老实保持视频流SCDT 就是用来告诉 Sink“现在是在切换状态别慌”。如果没有 SCDT显示端可能会频繁进入重新训练流程黑屏时间拉长游戏体验直接崩坏。我早期调试 VRR 显示器时遇到过“G-Sync 一打开就间歇性黑屏”的问题排查到最后就是 SCDT 相关配置没有正确写入 Sink 寄存器。当时查了很久的 PHY 参数和数据线结果问题出在逻辑层控制配置上这个教训挺深刻。3. 实操调测 FRL从握手日志到带宽预算3.1 先确认链路训练成功再谈画面调 FRL 链路的第一步永远是确认“链路训练是否成功”。一般 Source 芯片都会通过寄存器或者中断状态把 FRL 训练结果暴露出来比如 Linux 内核里 HDCP/FRL 相关的 debugfs 节点用cat一下就能看到链路状态。一个典型流程是这样先把 HDMI 连上读取 Source 端 FRL 状态寄存器确认是否进入 FRL 模式读取当前协商到的 Lane 数和单 Lane 速率正常情况下应该能看到类似4 lanes x 12Gbps的信息读取训练状态确认处于 Lock 状态而不是 Training 状态如果链路训练失败抓 SCDC 寄存器读写日志看是哪一步超时或 NACK常见的情况是 Source 要求 4 Lane 12Gbps但 Sink 端只支持 4 Lane 10Gbps两边协商后应该自动降级到 FRL5。如果 Source 端实现比较死板没有做主动降级就会一直训练失败。这个和 USB PD 协议里的“源端要顺从 Sink 能力”是一个道理做事不要太强硬先看看对方能用什么姿态配合。3.2 带宽预算用一个小例子搞懂够不够跑FRL 能不能跑通某种分辨率不能只看源端标称参数要自己算。其中关键公式是FRL 有效视频带宽 Lane 数 × 单 Lane 速率 × 16 / 18比如最常见的参数 4K120 10bit 4:4:4先用像素速率算视频原始带宽3840 × 2160 × 120 995,328,000约 9.95 亿像素/秒10bit 4:4:4 每个像素 30bit所以原始带宽约为 29.86Gbps加上 Blanking 开销通常按 20%~25% 估算实际需求大约 35~37GbpsFRL540Gbps的有效带宽约 35.6Gbps临界FRL648Gbps有效带宽约 42.7Gbps余量充足所以实际产品上4K120 10bit 4:4:4 一般都会要求至少 FRL5推荐 FRL6。8K60 10bit 4:2:0 则不同4:2:0 色度采样下像素数据量减半有效需求在 10Gbps 左右加上开销后 FRL324Gbps都能跑。但如果 8K60 10bit 4:4:4需求直接翻倍FRL6 都可能吃力通常要 DSC 压缩才能稳。做设计时建议按最恶劣情况预留 20% 以上的带宽余量。我之前做过一个 HDMI 2.1 测试板标称支持 48Gbps但因为 PCB 走线损耗偏大跑 FRL6 的 12Gbps 信号时眼图一半都闭上了只能降级到 FRL5 才稳定。计算层面没问题物理层面留不够余量照样翻车。3.3 眼图和误码率物理层才是终极裁判流控机制再完善FRL 终究是跑在铜缆上的高速信号。12Gbps 的线速率意味着信号上升沿已经非常短PCB 上的过孔、连接器、线缆都是潜在反射点。调试 FRL 链路时示波器的眼图测量是绕不开的一步。重点看这几个指标眼高Eye Height接收端能分辨 0/1 的电压余量眼宽Eye Width采样点附近的时序余量抖动Jitter包括随机抖动和确定性抖动FRL 链路的眼图掩码Eye Mask规格比 TMDS 严格得多如果实测眼图已经有大量违例点后续的流控逻辑再折腾也救不回来。信号完整性SI问题应该在做板阶段就解决不要指望靠软件把 FRL 调到 48Gbps那不现实。3.4 常用工具与测试设备调 FRL 链路我常用的设备包括支持 HDMI 2.1 的协议分析仪比如 Teledyne LeCroy、Keysight 的 HDMI 方案能看到流控帧、FEC 纠错计数、训练序列支持 12Gbps 带宽的高速示波器建议带宽至少 16GHz 才够测 FRL6 的 3 次谐波支持 FRL 训练的显示器或者测试治具很多实验室用 Video Electronics 的 FRL 测试盒如果预算有限最优先投资一个靠谱的协议分析仪。链路训练失败、FEC 计数异常这类问题有分析仪能帮你直接把问题定位到 Lane 级别省掉大量盲猜时间。当然如果只是日常开发验证Source 芯片的寄存器日志也能提供很多有效信息不一定非得上大型设备。4. 常见问题与排查技巧实录4.1 问题速查表下面是实际调测中高频出现的问题和排查方向我按从物理层到逻辑层的顺序整理成了一张表现象优先排查方向说明插入 HDMI 后完全无显示SCDC 通信、Hot Plug 信号先确认 Sink 有没有上电再确认 DDC 通道是否通握手慢、黑屏时间过长链路训练超时、寄存器读写容错检查 SCDC 读写重试策略首轮同步是否等太久花屏但不闪断FEC 无法完全纠错、信号质量不足查眼图、插损考虑降低到低一档 FRL 速率间歇性闪屏/黑屏FRL 流控帧异常、重训练触发抓控制符号错误计数查线缆和连接器VRR 开启后闪黑SCDT 配置错误确认 Sink 支持 SCDT 且相关寄存器写入正确用旧线缆跑 4K120 不稳定线缆不支持 FRL 高频换 Ultra High Speed HDMI 认证线缆长线传输5米以上频繁掉链插入损耗过大使用带放大功能的线或光缆方案4.2 花屏闪屏不只是“线不好”做 HDMI 2.1 产品时“是不是线的问题”已经成了客服口头禅但从工程师角度看花屏闪屏背后往往有更具体的信号链路原因。花屏的本质是接收端拿到错误数据且 FEC 无力回天原因可能是某个 Lane 的时延偏大、某个 Lane 受到串扰导致持续误码、或者是连接器虚焊导致阻抗突变。闪屏则往往和链路状态机相关某次误码触发了重新训练训练期间视频流中断屏幕就黑了。排查建议是先用协议分析仪看 FRL 层错误再用示波器看物理层眼图一层层往下压。我见过有人拿换线大法排查了一天最后发现是 PCB 上连接器旁边一个电阻焊错了位这种细节问题不靠仪器很难定位。4.3 FRL 降级策略别硬撑链路不稳定时硬件能力再好也未必能一直跑在最高档。产品设计上要留好降级路径。比如源端协商失败时应该能自动从 FRL6 降到 FRL5再不行降到 FRL4甚至回退到 TMDS 模式。降级策略要做在固件里提前设好避免链路变成“一锤子买卖”。有次调试一台显示器Source 端握手时读到的 Sink 能力寄存器和实际能力不符Sink 固件把最高档写太高导致每次协商到 FRL6 之后再稳不住反复训练。最后把 Sink 固件的能力上报改正确问题立刻消失。4.4 热插拔和电源状态下的坑FRL 链路对热插拔很敏感。热插拔瞬间 Sink 端的 Hot Plug 信号和 5V 电源时序如果不对容易导致 SCDC 寄存器访问失败。HDMI 2.1 规范里对 Hot Plug 时序有明确要求但很多小厂设备实现得不够严谨。我测过一台 DV 设备每次切换输入源后都要黑屏 3 秒以上抓日志发现是重新训练时把 FRL 速率从高到低扫了一遍每次尝试都要等 500ms 超时。后来把 Sink 端能力上报做了缓存Source 端直接按上次成功配置去握手黑屏时间缩短到 1 秒以内。这种优化不在规范里属于实际产品体验层面的问题但影响很大。4.5 独家避坑DSC 和 FRL 的配合HDMI 2.1 的 DSC显示流压缩是 8K120 这类超高带宽需求的常用手段DSC 流同样跑在 FRL 里。调 DSC 加 FRL 组合链路时要注意DSC 压缩流对带宽的需求会波动链路余量不足时容易出现周期性画面劣化。建议打开 DSC 前先确认 FRL 链路本身的误码率如果物理层已经在边缘状态DSC 解压会把误码放大成可见伪影。先保证 FRL 链路余量再谈 DSC 压缩率顺序不要反。5. 写在最后HDMI 2.1 FRL 的流控机制说到底是一套“在超高带宽下维持稳定传输”的工程方案链路训练负责协商流控帧负责导流加扰负责稳定时钟FEC 负责兜底。调 FRL 链路这几年我最深的体会是流控层面的软件逻辑和物理层信号质量是分不开的。很多问题表面上像驱动 bug最后都是 SI 裕量不够很多问题表面上像硬件故障根因却是 SCDC 寄存器配置没写好。遇到问题建议老老实实按“物理层确认 → FRL 层确认 → 应用层确认”的顺序排查不要跳步也不要一上来就怀疑是别人的问题。这条链路越快对每个环节的配合要求就越严耐心永远是调试的第一工具。