3. HDMI协议层解析:数据岛、控制周期、视频数据周期、InfoFrame结构

各位同学,今天我们来聊聊HDMI协议层里最核心的几个概念。说实话,我刚接触HDMI协议时,也被这些术语搞得晕头转向。什么数据岛、控制周期、视频数据周期……听起来像是一堆不相干的东西。但等你真正做采集卡或者显示驱动时,就会发现——这些周期其实构成了HDMI传输的“骨架”。

我个人习惯把HDMI协议层想象成一个“时间分片”系统。就像我们一天有工作、吃饭、睡觉一样,HDMI链路也把时间切成了不同的“周期”,每个周期干不同的事。下面我们一个一个来看。

3.1 三个周期的“分工”

HDMI的TMDS通道上,数据是连续传输的。但不同时间段,传输的内容完全不同。协议定义了三种周期:

  • 视频数据周期:传输像素数据(RGB或YCbCr)
  • 数据岛周期:传输音频、辅助数据(比如InfoFrame)
  • 控制周期:传输控制信号(HSYNC、VSYNC等)

你想想看,这三个周期是怎么切换的?其实靠的是TMDS通道上的“前导码”(Preamble)。每个周期开始前,发送端会先发一组特定的控制信号,告诉接收端:“接下来我要发视频了”或者“接下来是数据岛”。

关键点:这三个周期不会同时出现。它们是时间上严格交替的。视频数据周期占绝大部分时间,数据岛周期穿插在消隐区,控制周期则出现在行/场消隐的边界。

3.2 视频数据周期——最“重”的活

视频数据周期,说白了就是传输像素的地方。每个TMDS时钟周期,三个通道各传一个像素分量。比如RGB 24bit,就是R、G、B各8bit,分别走三个通道。

我在项目中遇到过一个问题:有些便宜的HDMI源设备,视频数据周期里的像素时钟抖动很大。结果采集到的图像边缘有毛刺。后来我加了一级FIFO做时钟域同步,才把问题解决。嗯,这里要注意——视频数据周期对时钟质量要求很高。

视频数据周期的长度由分辨率决定。比如1080p60,一行有1920个有效像素,加上消隐区,总像素数约2200个。视频数据周期就占1920个时钟周期,剩下的就是消隐区,用来插数据岛和控制周期。

3.3 数据岛周期——音频和元数据的“快递员”

数据岛周期,这个名字挺有意思。为什么叫“岛”?因为它像孤岛一样,分散在消隐区里。每个数据岛周期可以传输音频样本、InfoFrame、辅助数据等。

数据岛周期使用TMDS的“4b/10b”编码(注意,不是视频的8b/10b)。每个数据岛周期包含一个包头(Packet Header)和若干包体(Packet Body)。包头告诉接收端:“我接下来要传的是音频包”还是“InfoFrame包”。

我曾经调试过一个HDMI音频无声的问题。折腾了两天,最后发现是数据岛周期里的音频包校验和算错了。HDMI协议对数据岛包的校验非常严格——包头有ECC纠错,包体有BCH校验。一个比特错了,整个包就丢了。

个人经验:如果你在做HDMI接收端,建议把数据岛周期的包解析做成状态机。先检测包头,再根据包类型解析包体。千万别用中断方式——数据岛周期很短,中断响应不过来。

3.4 控制周期——最“短”但最“关键”

控制周期传输的是HSYNC、VSYNC、CTL0~CTL3这些信号。每个控制周期只有12个TMDS时钟周期。但别小看这12个周期——它们决定了视频的同步关系。

控制周期出现在三个地方:

  • 行消隐开始前(视频数据周期结束 → 控制周期)
  • 行消隐结束后(控制周期 → 数据岛周期或视频数据周期)
  • 场消隐期间(控制周期 → 数据岛周期)

控制周期里传输的CTL信号,其实就两个比特(CTL0和CTL1),但通过编码可以表示4种状态。比如CTL0=0, CTL1=0表示“接下来是视频数据周期”,CTL0=1, CTL1=0表示“接下来是数据岛周期”。

我记得有一次,客户说他们的显示器偶尔黑屏。我抓了TMDS波形一看,发现控制周期里的CTL信号在边界处有毛刺。接收端误判了周期切换,导致解不出视频。后来在FPGA里加了三级同步寄存器,问题就消失了。

3.5 InfoFrame结构——HDMI的“身份证”

InfoFrame,全称是Information Frame。它就像HDMI信号的“身份证”,告诉接收端:视频是什么格式、色彩空间是什么、有没有HDR、音频是什么采样率等等。

InfoFrame在数据岛周期里传输。每个InfoFrame包含三个部分:

部分 长度 内容
Header 3字节 包类型、版本、长度
Subpacket 0 4字节 数据字节0~3
Subpacket 1~3 各4字节 数据字节4~15(含校验)

常见的InfoFrame类型有:

  • AVI InfoFrame:辅助视频信息(分辨率、色彩空间、量化范围等)
  • Audio InfoFrame:音频信息(声道数、采样率、编码格式)
  • Source Product Descriptor InfoFrame:源设备描述(厂商、产品名)
  • HDR Static Metadata InfoFrame:HDR静态元数据(亮度、色域等)

我个人觉得,AVI InfoFrame是最重要的。它里面的“Colorimetry”字段决定了接收端怎么解析颜色。如果发送端说“我是BT.2020”,但接收端按BT.709去解,那颜色就全偏了。

避坑指南:我曾经遇到一个HDMI源,它的AVI InfoFrame里“Quantization Range”字段写的是“Limited Range”(16~235),但实际视频数据却是“Full Range”(0~255)。结果画面暗部细节全丢了。后来我在接收端加了一个“自动检测量化范围”的逻辑,才彻底解决。

3.6 知识体系结构图

下面我用一张SVG图,把这三个周期和InfoFrame的关系画出来。你可以看到,视频数据周期是“主干”,数据岛周期和控制周期是“支线”,它们共同构成了完整的HDMI传输。

HDMI协议层:三个周期与InfoFrame结构 视频数据周期 控制 数据岛周期 控制 下一个视频 像素数据(RGB/YCbCr) 音频、InfoFrame、辅助数据 HSYNC/VSYNC InfoFrame结构 Header(3字节:类型、版本、长度) Subpacket 0(4字节:数据字节0~3) Subpacket 1~3(12字节:数据+校验) 三个周期在时间上严格交替,控制周期决定下一个周期的类型 视频数据周期 控制周期 数据岛周期 InfoFrame

3.7 实际设计中的注意事项

好了,理论讲完了。我结合自己的项目经验,给大家几个实用建议:

  1. 解析控制周期时,一定要做去抖。控制周期只有12个时钟周期,但TMDS信号可能有毛刺。我习惯用三级寄存器同步,再加一个“连续采样3次相同才确认”的逻辑。
  2. 数据岛周期的包解析,建议用双缓冲。一个缓冲区接收当前包,另一个缓冲区给上层处理。否则容易丢包。
  3. InfoFrame的校验不能跳过。有些同学为了省资源,不校验InfoFrame的BCH码。结果遇到不规范的源设备,解析出来的信息全是错的。
  4. 注意视频数据周期里的“保护带”。在视频数据周期开始和结束的地方,有2个时钟周期的保护带(Guard Band)。接收端要忽略这2个周期的数据。

一个小技巧:调试HDMI协议时,我习惯用逻辑分析仪抓TMDS通道的CTL信号。只要看到CTL信号的变化规律,就能判断出三个周期的切换是否正常。这比直接看像素数据快多了。

嗯,关于HDMI协议层的三个周期和InfoFrame结构,今天就讲到这里。这些概念是后续做HDMI采集、显示驱动的基础。你想想看,如果你连数据岛周期里传的是什么都不知道,那怎么解析音频?怎么处理HDR?所以,花点时间把这块吃透,后面会轻松很多。

可可精品资料库