FRL训练基本概念:Link Training、FRL模式与训练序列基础
好,咱们正式开始啃FRL训练这块硬骨头。说实话,HDMI 2.1最大的变革,就是从TMDS转型到了FRL。很多工程师一开始都很不适应,我当年第一次看到FRL的训练流程时,也愣了半天。别急,咱们把基础打牢,后面的状态机就顺了。
Link Training:为什么必不可少?
Link Training,说白了就是让Source(发送端)和Sink(接收端)在正式传输数据前,互相沟通一下,确认一下大家怎么配合工作。你想想看,HDMI 2.1的带宽那么高,动不动就48Gbps,如果两端没商量好就直接干,不死才怪。
Link Training的核心目的有三个:
- 确定FRL模式:是跑3个Lane还是4个Lane?
- 确定速率:是3 Gbps/Lane还是12 Gbps/Lane?
- 配置物理层:Equalizer、PLL、CDR这些都要调好。
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的训练序列,官方文档里说得挺复杂,但实际拆解开来,就是几个固定的阶段。每个阶段都发送特定的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端确认无误后,进入正常传输模式。
训练过程中,SCDC寄存器是双向通信的桥梁。Source端写寄存器告诉Sink要做什么,Sink读寄存器做出响应。我个人习惯把SCDC看作一个“训练控制面板”,一切训练相关的状态都从这里读写。
下面这张图,我梳理了FRL训练的核心逻辑,也是咱们后面状态机的设计基础:
从这张图可以看到,训练是个单向流程,但每个阶段都有失败重试机制。在实际项目中,我一般会在每个阶段设置超时计数器,超时了就报错,而不是无限制地等下去。这招救了我好几回,避免了系统死锁。
另外,常有人问我:“FRL训练和TMDS训练到底差在哪?”我的答案是:TMDS训练几乎不需要交互,Source端直接发数据,Sink端自己适应;而FRL训练是实打实的握手协议,Source发Pattern,Sink回状态,一步都不能省。而且FRL的Pattern是固定的官方序列,你不能随便改,改了就通不过兼容性测试。