FRL训练基本概念:Link Training、FRL模式与训练序列基础

好,咱们正式开始啃FRL训练这块硬骨头。说实话,HDMI 2.1最大的变革,就是从TMDS转型到了FRL。很多工程师一开始都很不适应,我当年第一次看到FRL的训练流程时,也愣了半天。别急,咱们把基础打牢,后面的状态机就顺了。

Link Training:为什么必不可少?

Link Training,说白了就是让Source(发送端)和Sink(接收端)在正式传输数据前,互相沟通一下,确认一下大家怎么配合工作。你想想看,HDMI 2.1的带宽那么高,动不动就48Gbps,如果两端没商量好就直接干,不死才怪。

Link Training的核心目的有三个:

  1. 确定FRL模式:是跑3个Lane还是4个Lane?
  2. 确定速率:是3 Gbps/Lane还是12 Gbps/Lane?
  3. 配置物理层:Equalizer、PLL、CDR这些都要调好。
我记得有一次项目中,Sink端的EDID没更新,Source端死活不肯进入FRL模式。查了半天才发现,原来是EDID里没声明支持FRL。所以,训练的前提是两端都对FRL说“我准备好了”。

Link Training的发起方式有两种:一种是热插拔时自动触发,另一种是Source端主动通过SCDC(Status and Control Data Channel)寄存器请求。我个人习惯在初始化阶段先读一下Sink的EDID,看看它到底支持什么,再决定训练策略。

FRL模式 vs TMDS:核心差异

为什么要有FRL?TMDS不好吗?

其实TMDS在HDMI 2.0时代已经够用了,但到了HDMI 2.1,带宽需求翻倍,TMDS的极限是18Gbps,而FRL能轻松跑到48Gbps。FRL把通道组织方式彻底改了,咱们来看看对比:

特性 TMDS FRL
编码方式 8b/10b 16b/18b
通道数量 3个数据通道 + 1个时钟通道 3或4个数据通道,无独立时钟
时钟恢复 独立时钟线 从数据中恢复
最大速率 6 Gbps/Lane 12 Gbps/Lane
训练流程 简单,不需要复杂训练 需要完整的Link Training序列

FRL去掉了独立的时钟通道,把时钟信息嵌入到数据流中。这样做的优点是节省了物理通道,但代价就是CDR(时钟数据恢复)要够强悍。我在调试早期FRL芯片时,就遇到过CDR锁不住的情况,那叫一个头疼。

记住一条铁律: FRL模式下,时钟是从数据流里恢复的,所以训练序列里的Clock Pattern至关重要,它决定了CDR能否正确锁定。

训练序列基础:从复位到锁定

FRL的训练序列,官方文档里说得挺复杂,但实际拆解开来,就是几个固定的阶段。每个阶段都发送特定的Pattern,Sink端根据Pattern做调整。

训练序列通常包含以下步骤:

  • LT_Init:Source端通过SCDC通知Sink准备训练。Sink回复自己的能力状态。
  • LT_Check_Capability:Source端询问Sink支持的最大Lane数和速率。这个阶段很重要,我曾经因为Sink回复了错误的能力值,导致训练失败。
  • LT_Train_Speed:Source端发送特定频率的Clock Pattern,Sink端调整CDR和Equalizer。
  • LT_Train_Lane:逐Lane发送训练Pattern,Sink端判断每个Lane的质量。
  • LT_Verify:所有Lane训练完成后,Source端发送验证Pattern,Sink端确认无误后,进入正常传输模式。
注意:LT_Verify阶段如果失败,Source端会重训练,但重试次数有限。我在项目中遇到过一个Sink,在LT_Verify阶段总是丢包,后来发现是Sink端的PCB布线有问题,导致某个Lane的信号完整性太差。

训练过程中,SCDC寄存器是双向通信的桥梁。Source端写寄存器告诉Sink要做什么,Sink读寄存器做出响应。我个人习惯把SCDC看作一个“训练控制面板”,一切训练相关的状态都从这里读写。

下面这张图,我梳理了FRL训练的核心逻辑,也是咱们后面状态机的设计基础:

FRL 训练核心流程图 FRL 训练核心流程 Link Training Start LT_Init LT_Check_Capability LT_Train_Speed LT_Train_Lane 训练成功 失败重试 说明 每个阶段都有对应的 SCDC寄存器操作 Source和Sink双向交互 常见训练失败原因 1. CDR无法锁定 2. Equalizer未适配 3. Lane质量不达标 4. Sink未正确响应SCDC

从这张图可以看到,训练是个单向流程,但每个阶段都有失败重试机制。在实际项目中,我一般会在每个阶段设置超时计数器,超时了就报错,而不是无限制地等下去。这招救了我好几回,避免了系统死锁。

另外,常有人问我:“FRL训练和TMDS训练到底差在哪?”我的答案是:TMDS训练几乎不需要交互,Source端直接发数据,Sink端自己适应;而FRL训练是实打实的握手协议,Source发Pattern,Sink回状态,一步都不能省。而且FRL的Pattern是固定的官方序列,你不能随便改,改了就通不过兼容性测试。

个人经验:如果你要自测训练流程是否正常,先别管4个Lane,先从一个Lane开始调试。一个Lane跑通了,再逐步增加Lane数。这能大大缩短定位时间。