1. 拆解IT66631:一颗芯片如何撑起双路HDMI 2.0输出
第一次拿到IT66631这个型号的时候,我正帮一个做商显方案的朋友评估多屏输出板卡。他的需求很直接:一路信号源进来,要同时驱动两块1080p@120Hz或者4K@60Hz的屏幕,而且两块屏显示的内容可以不一样。市面上能选的方案不多,要么用FPGA自己搭,成本高开发周期长;要么找专用的视频分配/转换芯片,但大多数只能做到一路进一路出,或者两路出同样的画面。IT66631就是在这个背景下进入视野的——它是一颗专门做HDMI 2.0双路输出的转换器芯片,核心能力是把输入的视频流拆成两路独立的HDMI 2.0输出,每路都支持最高4K@60Hz的带宽规格。
这颗芯片解决的核心问题其实就一个:信号分配与独立缩放。传统的一进二出HDMI分配器,两路输出是完全一样的画面,因为它只是把同一组TMDS信号复制了一份。但IT66631不一样,它内部有独立的视频处理管线,可以对两路输出分别做缩放、帧率转换、甚至画面旋转。这意味着你可以一路输出4K给大屏,另一路降成1080p给采集卡或者副屏,两路互不干扰。对于做视频会议系统、数字标牌、医疗影像显示、车载多屏娱乐的团队来说,这种灵活性比单纯的信号复制有价值得多。
适合谁来参考这篇内容?如果你是在做多屏显示方案选型的硬件工程师,或者正在评估HDMI 2.0信号分配与转换的嵌入式开发者,又或者你只是对视频接口芯片的内部架构感兴趣,想搞清楚一颗转换器芯片到底是怎么把一路视频流变成两路独立输出的,那接下来的内容应该能给你一些实际的参考。我会从芯片的整体架构讲起,然后拆解双路输出的实现原理,再落到PCB设计和调试中会遇到的实际问题,最后分享一些我在测试过程中踩过的坑和验证过的参数配置。
2. 芯片整体架构与信号链路拆解
2.1 从输入到输出的完整信号流
IT66631的架构可以粗略分成四个主要模块:输入接收端、视频处理核心、双路输出编码器、以及控制与配置接口。输入侧支持HDMI 2.0的TMDS接收,最高带宽18Gbps,兼容4K@60Hz 4:4:4的色度采样。信号进来之后,首先经过均衡器和时钟数据恢复电路,把高速串行信号还原成并行的像素数据流。这一步很关键,因为HDMI 2.0的速率到了6Gbps每通道,PCB走线的损耗和抖动会直接影响接收质量,芯片内部的自适应均衡就是用来补偿这些损耗的。
视频处理核心是这颗芯片真正值钱的地方。它包含了一个缩放引擎和一个帧率转换器。缩放引擎支持独立的水平和垂直缩放,两路输出可以设置不同的分辨率。比如输入是3840x2160@60Hz,输出A保持原分辨率,输出B缩放到1920x1080@60Hz。帧率转换器则负责处理输入和输出帧率不匹配的情况,比如输入是50Hz的PAL视频,输出要转成60Hz,这时候就需要做帧率转换,否则画面会抖动或者撕裂。这两个模块的配置都是通过I2C接口写寄存器来完成的,芯片内部有完整的寄存器映射表,每个参数都有对应的地址和位定义。
双路输出编码器各自独立,每路都包含TMDS编码器和串行器。编码器把并行像素数据转换成TMDS字符流,然后串行器把字符流变成高速差分信号输出。两路输出的时钟是独立的,这意味着你可以给两路输出设置不同的像素时钟频率,只要不超过HDMI 2.0的规格上限。输出侧还集成了EDID管理和HDCP处理,EDID用来读取显示器的能力信息,HDCP则负责内容保护握手。这两块在实际调试中经常出问题,后面会专门讲。
2.2 为什么选择双路独立缩放而不是简单复制
这里要解释一个设计上的取舍。市面上很多一进二出的方案用的是信号复制架构,就是把输入信号直接分成两路,不做任何处理。这种方案成本低、延迟小,但两路输出的分辨率、帧率、色彩空间必须完全一致,因为信号根本没有被解码和处理过。IT66631选择的是解码-处理-再编码的架构,信号进来先解码成像素数据,处理完再分别编码输出。这样做的好处是两路输出完全独立,你可以一路接4K电视,另一路接1080p的采集卡,互不影响。
代价是什么?首先是延迟增加。解码和再编码的过程会引入几毫秒到十几毫秒的延迟,具体取决于缩放和帧率转换的复杂度。对于游戏或者实时交互场景,这个延迟可能不可接受。其次是成本上升,芯片内部多了缩放引擎和两套编码器,功耗和面积都上去了。所以选型的时候要明确:如果你只是想把同一画面分到两块屏,用复制架构的芯片就够了;如果你需要两路输出不同分辨率、不同帧率、甚至不同画面内容,那IT66631这类带处理能力的转换器才是对的选择。
还有一个容易被忽略的点是色彩空间转换。输入可能是RGB 4:4:4,输出显示器可能只支持YUV 4:2:0,这时候芯片需要做色彩空间转换。IT66631内部支持RGB和YUV之间的转换矩阵,配置的时候要注意色域映射是否正确,否则颜色会偏。我遇到过输入是sRGB,输出显示器是DCI-P3色域,没有做色域映射,结果红色显示出来偏橙,后来在寄存器里调整了转换矩阵才解决。
2.3 寄存器配置与I2C控制接口
IT66631的所有功能都是通过I2C从机接口来配置的。芯片的I2C地址通常是0x4C或者0x4D,具体取决于ADDR引脚的接法。寄存器空间分成几个区域:输入配置区、缩放引擎配置区、输出A配置区、输出B配置区、以及全局控制区。每个区域都有对应的页选择寄存器,写寄存器之前要先切页,这一点和很多视频芯片一样,不切页的话写进去的数据会跑到错误的地址。
配置流程一般是这样的:上电复位后,先读取芯片的版本寄存器确认通信正常,然后配置输入端的均衡参数和EDID,接着配置缩放引擎的输入输出分辨率,再分别配置两路输出的TMDS参数和HDCP,最后使能输出。整个过程大概需要写几十个寄存器,如果用手动写的方式很容易出错。我的做法是先用芯片厂商提供的配置工具生成一个寄存器列表,然后在MCU里用数组存起来,初始化的时候按顺序写下去。这样既方便调试,也方便后续修改。
注意:I2C的时钟频率不要超过400kHz,虽然芯片手册标称支持1MHz,但在实际PCB上,走线稍长或者上拉电阻偏大,1MHz下波形就会变差,导致配置失败。我一般用100kHz或者400kHz,稳定优先。
3. 双路输出的核心实现细节
3.1 缩放引擎的参数计算与配置
缩放引擎是双路输出独立性的关键。IT66631的缩放引擎支持独立的水平和垂直缩放系数,每个系数是一个16位的定点数,格式是8位整数加8位小数。举个例子,如果输入是3840像素宽,输出要缩到1920像素宽,缩放系数就是1920/3840=0.5,对应的定点数就是0x0080。如果输出是2560像素宽,系数是2560/3840≈0.6667,定点数就是0x00AA左右。计算的时候要注意四舍五入,系数偏差太大会导致画面边缘出现黑边或者裁切。
缩放引擎还支持独立的滤波配置。缩放倍数小于1的时候是降采样,需要做抗混叠滤波;缩放倍数大于1的时候是升采样,需要做插值滤波。IT66631内部有可配置的滤波器系数,默认配置下画质已经不错,但如果对锐度有要求,可以调整滤波器的截止频率。我试过把降采样的滤波器截止频率调高一些,画面会锐一点,但容易出现摩尔纹;调低一些画面会软,但更干净。这个取舍要看具体应用场景,数字标牌可以锐一点,医疗影像建议软一点。
配置缩放引擎的时候有一个顺序要求:先配置输入分辨率,再配置输出分辨率,最后使能缩放。如果顺序反了,缩放引擎可能会用默认的输入分辨率去计算,导致输出画面比例错误。这个坑我踩过一次,当时调了半天以为是显示器的问题,后来查寄存器才发现是配置顺序不对。
3.2 双路TMDS输出的时钟与数据对齐
两路HDMI输出各自有独立的TMDS时钟通道和数据通道。TMDS时钟频率等于像素时钟,对于4K@60Hz 4:4:4,像素时钟大约是594MHz,TMDS时钟就是594MHz,每个数据通道的速率是像素时钟的10倍,也就是5.94Gbps。这个速率下,PCB走线的差分阻抗控制和长度匹配就非常重要。差分阻抗要控制在100欧姆±10%,两条差分线之间的长度偏差要小于5mil,否则眼图会闭合,接收端可能无法锁定。
两路输出之间的时钟偏差也需要关注。虽然两路输出是独立的,但如果它们要驱动同一个显示设备的不同输入(比如拼接屏),两路之间的时钟偏差会导致画面撕裂。IT66631支持输出时钟的相位调整,可以通过寄存器微调输出时钟的相位,让两路输出的时序对齐。调整的步进是1/16像素时钟周期,一般调到两路输出的VSYNC和HSYNC对齐就可以了。
还有一点是热插拔检测。HDMI接口有HPD信号,显示器插上之后会拉高HPD,芯片检测到HPD之后才会启动输出。两路输出的HPD是独立检测的,如果只插了一路显示器,另一路没有插,芯片应该只使能插了的那一路输出。这个逻辑需要在MCU里处理,否则没插显示器的那一路会一直输出信号,浪费功耗,还可能干扰另一路。
3.3 HDCP握手与EDID管理的实操要点
HDCP是内容保护协议,如果输入信号是加密的,芯片需要先完成HDCP解密,然后再对输出重新加密。IT66631支持HDCP 2.2和HDCP 1.4,配置的时候要注意版本匹配。如果输入是HDCP 2.2加密的4K内容,输出显示器只支持HDCP 1.4,那芯片需要做版本降级,把HDCP 2.2解密后再用HDCP 1.4加密输出。这个降级过程需要芯片内部有相应的密钥和证书,IT66631是支持的,但配置起来比较麻烦,需要先加载密钥,再配置降级模式。
EDID管理是另一个容易出问题的地方。每路输出都需要读取显示器的EDID,然后根据EDID的能力信息来配置输出分辨率。如果显示器没有EDID或者EDID读取失败,芯片会用一个默认的EDID,通常是1080p。实际调试中,EDID读取失败的原因很多:I2C总线冲突、EDID芯片供电不足、DDC通道的走线太长导致信号衰减。我的经验是,DDC通道的走线尽量短,上拉电阻用2.2kΩ而不是4.7kΩ,这样上升沿更快,读取成功率更高。
提示:如果两路输出接的是同一款显示器,EDID内容是一样的,可以只读一次然后复制到两路输出的EDID RAM里,省去重复读取的时间。但如果两路显示器型号不同,就必须分别读取,否则输出参数会不匹配。
4. PCB设计与信号完整性实战
4.1 高速差分线的布局与阻抗控制
IT66631的PCB设计是整个项目里最考验功底的部分。HDMI 2.0的TMDS速率到了6Gbps,这已经属于高速信号的范畴,走线不能随便拉。差分对的内层走线比外层好,因为内层有参考平面,阻抗更稳定,EMI也更低。如果必须走外层,那就要保证差分线下方有完整的参考平面,不能跨分割。
阻抗控制方面,100欧姆的差分阻抗需要根据叠层来计算。以常见的四层板为例,顶层到第二层的介质厚度如果是0.2mm,介电常数4.3,那差分线的线宽和间距大概在6mil/6mil左右。这个数值不是固定的,要根据板厂的工艺能力调整。我一般会在投板前让板厂出一份阻抗报告,确认差分阻抗在100欧姆±10%以内。
长度匹配是另一个重点。差分对内的两条线长度偏差要小于5mil,差分对之间的长度偏差要小于50mil。如果偏差太大,信号到达接收端的时间不一致,眼图会变差。我见过一个案例,差分对内的两条线差了20mil,结果4K@60Hz下直接花屏,降到1080p就正常了。后来重新布线,把偏差控制在3mil以内,4K就稳了。
4.2 电源滤波与去耦电容的选型
IT66631有多路电源:核心电压1.1V,IO电压3.3V,TMDS输出驱动电压1.8V或者3.3V(取决于配置)。每路电源都需要足够的去耦电容。我的做法是每个电源引脚旁边放一个0.1uF的陶瓷电容,然后每路电源再放一个10uF的钽电容或者陶瓷电容做储能。0.1uF的电容要尽量靠近引脚,走线要短,否则等效电感会抵消电容的高频滤波效果。
TMDS输出驱动电源尤其要注意。HDMI输出是高速开关信号,电源上的噪声会直接耦合到输出信号上,导致眼图恶化。我一般会在TMDS电源引脚旁边放一个1uF的电容和一个0.01uF的电容,1uF滤低频,0.01uF滤高频。如果空间允许,再串一个磁珠,把高频噪声挡在电源外面。实测下来,加了磁珠之后,TMDS眼图的抖动明显减小。
注意:去耦电容的接地端要就近打过孔到地平面,过孔的数量至少两个,减少接地电感。如果只打一个过孔,高频滤波效果会打折扣。
4.3 ESD防护与接口保护
HDMI接口是外露接口,ESD防护不能省。IT66631的TMDS输出引脚内部有一定的ESD能力,但通常只有几kV的人体模型,面对实际使用中的静电放电还不够。我一般会在HDMI连接器旁边放一颗专用的ESD保护器件,比如TVS二极管阵列,钳位电压要低于芯片的绝对最大额定值。选型的时候要注意寄生电容,HDMI 2.0的速率下,寄生电容超过0.5pF就会影响信号完整性。所以要用超低电容的ESD器件,通常标称0.2pF到0.3pF。
HPD和DDC通道也要保护。HPD是低速信号,对ESD器件的要求不高,普通TVS就行。DDC是I2C总线,速率400kHz,寄生电容可以放宽到几十pF。但DDC通道容易受到总线锁定的影响,如果显示器端把DDC拉低不放,芯片就无法读取EDID。我的做法是在DDC线上串一个100欧姆的电阻,限制电流,防止总线锁定。如果还是锁死,可以在MCU里加一个超时复位逻辑,检测到DDC长时间拉低就重新初始化I2C控制器。
5. 调试与常见问题排查实录
5.1 输出无画面:从HPD到TMDS的逐级排查
输出无画面是最常见的问题,排查要按信号链路逐级来。第一步查HPD,用万用表量HDMI连接器的HPD引脚,正常应该是高电平(大约5V或者3.3V,取决于电路设计)。如果HPD是低电平,说明显示器没有检测到信号源,或者HPD线路断了。第二步查TMDS时钟,用示波器量TMDS时钟差分对,应该有稳定的差分波形,频率等于像素时钟。如果没有波形,说明芯片没有使能输出,检查输出使能寄存器是否配置正确。第三步查TMDS数据,量数据差分对,应该有高速数据波形。如果时钟有但数据没有,可能是输入信号没有锁定,检查输入端的均衡配置和信号检测寄存器。
我遇到过一次输出无画面,查了半天发现是输入信号没有锁定。输入端的均衡器配置得太保守,信号幅度不够,芯片检测不到。后来把均衡增益调高了两档,输入锁定指示灯亮了,输出也正常了。所以调试的时候要养成看状态寄存器的习惯,芯片内部有很多状态位,比如输入锁定、输出使能、HDCP握手状态,这些状态位能快速定位问题。
5.2 画面闪烁或花屏:时钟与均衡的联合调试
画面闪烁或者花屏通常是信号完整性问题。先看TMDS眼图,如果眼图闭合,说明信号质量不够。可能的原因有:差分阻抗不匹配、走线太长、均衡配置不当、电源噪声太大。我的排查顺序是:先调均衡,把输入端的均衡增益从低到高逐档试,找到眼图最好的档位;然后查电源,用示波器量TMDS电源的纹波,如果纹波超过50mV,就要加滤波;最后查走线,如果前面都排除了,那可能是PCB走线的问题,需要重新设计。
还有一种花屏是HDCP握手失败导致的。HDCP握手失败的时候,有些显示器会显示花屏或者黑屏,有些会显示雪花。判断方法是看HDCP状态寄存器,如果握手没有完成,状态位会是0。HDCP失败的原因可能是密钥不对、版本不匹配、或者DDC通道通信失败。我遇到过HDCP 2.2的输入源和HDCP 1.4的显示器,芯片没有配置降级模式,结果握手失败。后来在寄存器里使能了HDCP降级,问题解决。
5.3 两路输出不同步:时钟相位与帧同步调整
两路输出不同步的表现是:两块屏幕显示的画面有撕裂,或者一块屏幕比另一块慢半拍。这个问题在拼接屏或者多屏显示场景下很常见。IT66631支持输出时钟相位调整和帧同步功能。时钟相位调整可以让两路输出的像素时钟对齐,帧同步可以让两路输出的VSYNC对齐。配置的时候要注意,帧同步需要两路输出的帧率一致,如果一路60Hz一路50Hz,帧同步是做不到的。
我调试过一个双屏方案,两块屏都是1080p@60Hz,但画面有轻微撕裂。后来发现是两路输出的时钟相位差了1/4个像素时钟周期。在寄存器里把输出B的时钟相位调整了4个步进,两路对齐了,撕裂消失。这个调整需要耐心,每次调一个步进,观察画面变化,直到撕裂消失。
5.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 输出无画面 | HPD未拉高 | 万用表量HPD引脚 | 检查HPD线路和显示器 |
| 输出无画面 | 输入未锁定 | 读输入锁定状态寄存器 | 调整输入均衡增益 |
| 输出无画面 | 输出未使能 | 读输出使能寄存器 | 配置输出使能位 |
| 画面闪烁 | TMDS眼图闭合 | 示波器量眼图 | 调均衡、查电源、查走线 |
| 画面花屏 | HDCP握手失败 | 读HDCP状态寄存器 | 配置HDCP版本和密钥 |
| 两路不同步 | 时钟相位偏差 | 示波器量两路时钟 | 调整输出时钟相位 |
| EDID读取失败 | DDC总线锁定 | 量DDC电平和波形 | 串电阻、加超时复位 |
| 4K下花屏 | 差分阻抗不匹配 | 查PCB叠层和阻抗报告 | 重新设计走线 |
6. 实际项目中的经验与避坑建议
6.1 配置顺序与上电时序的坑
IT66631的上电时序有要求:核心电压先上,IO电压后上,两者之间的时间差不要超过10ms。如果IO电压先上,芯片内部的ESD保护二极管可能会导通,导致电流倒灌,长期下来会损坏芯片。我见过一个项目为了省事,把1.1V和3.3V同时上电,结果芯片发热严重,后来改成1.1V先上,3.3V延迟5ms,温度就正常了。
配置顺序也很重要。正确的顺序是:上电复位→配置输入→配置缩放→配置输出A→配置输出B→使能输出。如果先使能输出再配置缩放,输出可能会用默认的缩放参数,导致画面比例错误。我一般会在MCU的初始化代码里严格按照这个顺序写,并且在每一步之后读回寄存器确认写入成功。
6.2 散热与功耗的实测数据
IT66631的功耗和配置有关。双路4K@60Hz输出的时候,芯片功耗大概在1.5W到2W之间,需要散热措施。如果是密闭外壳,建议加散热片或者导热垫。我实测过,不加散热片的情况下,芯片表面温度能到70度以上,加了散热片之后降到50度左右。如果环境温度高,还要考虑主动散热。
功耗优化方面,如果只使用一路输出,可以把另一路输出的电源关掉,能省大概30%的功耗。芯片内部有输出通道使能位,关掉不用的通道就行。另外,缩放引擎的功耗和缩放倍数有关,缩放倍数越接近1,功耗越低。如果不需要缩放,把缩放引擎旁路掉,功耗还能再降一点。
6.3 兼容性测试:不同显示设备的适配经验
兼容性测试是HDMI方案里最耗时的环节。不同品牌、不同型号的显示器,EDID内容不一样,HDCP能力不一样,甚至TMDS的均衡需求也不一样。我的做法是准备一个测试矩阵,至少覆盖:三星、LG、戴尔、AOC、小米等主流品牌,每个品牌选两到三款不同年份的型号。测试内容包括:EDID读取、HDCP握手、4K@60Hz显示、1080p@120Hz显示、热插拔响应。
我遇到过一款显示器,EDID读取正常,HDCP握手也正常,但4K@60Hz下画面偶尔闪黑。后来用示波器量TMDS信号,发现这款显示器的接收端均衡需求比较高,芯片默认的输出预加重不够。在寄存器里把输出预加重调高了一档,闪黑就消失了。所以兼容性测试不能只看能不能点亮,还要看长时间运行的稳定性。
提示:测试的时候要记录每款显示器的EDID和HDCP能力,整理成表格。后续如果遇到兼容性问题,可以快速对比是哪款显示器的问题,还是芯片配置的问题。
6.4 固件升级与寄存器配置的版本管理
IT66631的配置是通过I2C写寄存器实现的,这些寄存器配置通常存在MCU的固件里。固件升级的时候,如果寄存器配置变了,但MCU固件没有同步更新,就会出现配置不匹配的问题。我的做法是给寄存器配置加版本号,MCU启动的时候先读芯片的版本寄存器,再读配置的版本号,两者匹配才继续初始化,不匹配就报错。这样能避免因为配置版本不一致导致的奇怪问题。
另外,寄存器配置最好用结构化的方式存储,比如用结构体数组,每个结构体包含寄存器地址、值、掩码。这样修改的时候只需要改数组,不需要改代码逻辑。我见过一个项目把寄存器配置硬编码在代码里,后来要改一个参数,找了半天才找到对应的那行代码,效率很低。
7. 写在最后的一些个人体会
这颗芯片我前前后后调了大概三个月,从最初的评估板到最终的量产板,踩了不少坑,也积累了一些手册上不会写的经验。最大的体会是:HDMI 2.0的方案,硬件设计和寄存器配置各占一半。硬件设计不好,信号完整性有问题,寄存器配置再对也出不来画面;寄存器配置不对,硬件设计再好也发挥不出来。两者必须配合着调,不能偏废。
另一个体会是测试要趁早。不要等板子全部焊完再测试,最好在打样阶段就留出测试点,TMDS差分对、电源、I2C总线都要留测试点。这样调试的时候可以直接量波形,不用飞线。我吃过这个亏,第一版板子没留测试点,调试的时候只能把示波器探头焊在电阻上,很不方便。
最后说一个小技巧:如果手头没有HDMI协议分析仪,可以用一块支持HDMI输入的开发板(比如树莓派或者FPGA开发板)来抓取TMDS信号,分析时序和内容。虽然不如专业分析仪方便,但胜在成本低,适合前期调试。我用这个方法抓过几次EDID和HDCP的握手过程,对理解协议帮助很大。