多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

HDMI 2.0多路切换芯片IT66341架构解析与HDCP/CEC/EDID调试实战

HDMI 2.0多路切换芯片IT66341架构解析与HDCP/CEC/EDID调试实战 1. 从一块板子上的信号打架说起为什么需要IT66341做过多路HDMI输入设备的朋友大概都遇到过这种场景机顶盒、游戏机、笔记本三路信号同时插在板子上用户按遥控器切到游戏机结果画面闪了两下黑屏声音还留在机顶盒那边再切回笔记本EDID读错了分辨率直接掉到720p。这种信号打架的问题本质上不是线材的锅而是切换开关和协议协商没处理好。IT66341就是为解决这类问题而生的芯片。它是一颗HDMI 2.0规格的多路切换芯片支持最高18Gbps的TMDS速率也就是我们常说的4K60Hz 4:4:4。它的核心价值在于一芯多能——把多路HDMI输入的切换、均衡、协议协商、HDCP加解密、CEC透传这些活儿全揽在一颗芯片里省掉了过去用分立器件搭切换矩阵的麻烦。这篇文章适合三类人看一是正在做多路HDMI输入产品比如电视、显示器、AV功放、采集卡的硬件工程师二是负责调试HDMI兼容性的嵌入式软件工程师三是对HDMI协议栈感兴趣、想搞清楚切换芯片内部到底在干什么的技术爱好者。我会从芯片的架构讲起把HDCP、CEC、EDID这些容易踩坑的点拆开揉碎再结合实测经验说说配置和调试的门道。需要先说明的是IT66341的完整寄存器手册属于NDA资料本文不会涉及具体寄存器地址和厂商私有配置但会基于公开的HDMI 2.0规范和常见工程实践把芯片的工作逻辑和调试思路讲清楚。这些内容对于理解任何一颗HDMI切换芯片都是通用的。2. IT66341的架构拆解一颗芯片里到底塞了什么2.1 从HDMI 2.0的物理层说起要理解IT66341得先知道HDMI 2.0的物理层长什么样。HDMI 2.0沿用TMDSTransition Minimized Differential Signaling作为高速信号传输方式一共四对差分线三对数据通道Data0/1/2加一对时钟通道。每对差分线在HDMI 2.0下最高跑6Gbps三对数据线合起来就是18Gbps。这个速率下信号经过连接器、PCB走线、线缆之后眼图已经闭合得差不多了所以切换芯片的第一道关卡就是自适应均衡。IT66341在每个输入端口都集成了可编程的均衡器。它的作用是把经过长线缆衰减的高频分量补回来。你可以把它想象成一个信号放大器频率补偿器的组合低频部分衰减少高频部分衰减多均衡器就针对性地把高频抬起来。实测中一条3米的标准HDMI 2.0线缆在6Gbps下的插入损耗大概在-8dB到-12dB之间均衡器的增益档位需要根据线缆长度和PCB损耗来调。调得太猛噪声也被放大眼图反而更差调得太保守高频分量补不回来误码率飙升。这里有个经验均衡档位不要只看线缆长度要看实际眼图。我见过用1米线缆但PCB走线绕了很长的板子均衡档位反而要比3米线缆开得更高。所以调试时最好用示波器加TMDS探头实测眼图或者用芯片内置的眼图监测功能如果支持的话来辅助判断。2.2 切换矩阵与信号路由IT66341的输入端口数量根据具体型号有差异常见的是3进1出或4进1出。内部是一个交叉开关矩阵把选中的那一路输入路由到输出端。这个切换动作看似简单但有几个细节容易忽略。第一是切换时的信号建立时间。HDMI信号不是切过去就立刻稳定的均衡器需要时间锁定时钟数据恢复CDR需要时间锁定输出端需要时间重新建立稳定的TMDS流。如果切换后立刻让下游设备去读信号很可能读到的是垃圾数据。IT66341内部有切换完成的状态标志软件上要等这个标志置位后再做后续操作。第二是未选中端口的处理。未选中的输入端口如果还插着线它的信号依然在芯片输入端存在。如果芯片没有做好隔离这些信号可能通过寄生电容耦合到输出端造成串扰。IT66341在未选中端口上会关闭输入缓冲降低功耗的同时也减少了串扰。但PCB布局上输入走线之间还是要保持足够的间距和地隔离不能全指望芯片内部的隔离。第三是热插拔检测HPD的路由。HPD是下游设备告诉上游我准备好了你可以发信号了的机制。在多路输入场景下HPD信号需要正确地路由到当前选中的那个输入端口。如果HPD路由错了就会出现切过去了但源端不发信号的尴尬局面。IT66341内部有HPD路由逻辑但需要软件正确配置。2.3 时钟管理与CDRHDMI 2.0的时钟通道跑的是TMDS时钟速率是数据速率的1/10。比如18Gbps的数据速率对应1.8GHz的时钟。这个时钟经过线缆后会有抖动jitterCDR电路的任务就是从带抖动的时钟里恢复出干净的时钟。IT66341的CDR环路带宽是可配置的。环路带宽宽锁定快但对抖动的抑制能力弱环路带宽窄抖动抑制好但锁定慢。在切换场景下需要在锁定速度和抖动容限之间找平衡。我的经验是对于消费类产品环路带宽可以适当放宽优先保证切换速度对于专业视频设备可以收紧环路带宽优先保证信号质量。另外HDMI 2.0引入了SCDCStatus and Data Channel用于读取下游设备的能力信息和进行TMDS速率协商。SCDC的时钟是独立的不依赖TMDS时钟。IT66341内部有SCDC控制器软件需要通过I2C去读写SCDC寄存器。这里有个坑SCDC的读写时序和普通I2C不一样它有特定的帧格式和超时机制如果软件模拟I2C时序不对SCDC通信会失败导致速率协商卡在HDMI 1.4模式。3. HDCP 2.2/2.3在中继芯片里的握手逻辑3.1 HDCP中继和HDCP接收的区别很多人搞不清HDCP中继Repeater和HDCP接收Receiver的区别。简单说HDCP接收是链路的终点比如显示器HDCP中继是链路的中间节点比如AV功放、切换器。中继芯片要同时扮演两个角色对上游源端它是一个HDCP接收设备对下游显示端它是一个HDCP发送设备。IT66341作为中继芯片内部需要维护两套HDCP状态机上游状态机和下游状态机。上游状态机负责和源端完成HDCP认证和密钥交换下游状态机负责和显示端完成同样的流程。两套状态机之间的密钥流需要正确衔接否则解密再加密的过程中会出现内容不同步。这里的关键点是中继器的拓扑信息。HDCP 2.2规范要求中继器维护一个下游设备的拓扑列表Receiver ID List并在认证过程中把这个列表传给上游。如果拓扑列表不对上游可能会拒绝发送高价值内容。IT66341内部有拓扑信息存储区软件需要在每次下游设备插拔时更新这个列表。3.2 密钥交换的时序陷阱HDCP 2.2的认证流程比1.4复杂得多涉及LCLocality Check、SKESession Key Exchange、配对Pairing等多个阶段。在中继芯片里这些阶段的时序要求很严格。我踩过的一个坑是LC阶段的超时。LC阶段要求上游和下游之间的往返延迟小于20ms。如果中继芯片在中间引入了太大的延迟比如软件处理HDCP消息太慢LC就会失败HDCP认证降级到1.4。IT66341硬件上支持HDCP消息的快速透传但软件上如果对HDCP中断响应不及时依然会导致超时。实测中HDCP中断的响应时间最好控制在1ms以内。另一个坑是密钥过期。HDCP 2.2的会话密钥有有效期通常是2秒。如果密钥过期前没有完成重新协商链路会中断。在中继场景下上游和下游的密钥有效期可能不同步需要中继芯片做好缓冲和重新协商。IT66341内部有密钥管理单元但软件需要监控密钥状态在过期前主动触发重新协商。3.3 实测中的HDCP兼容性问题HDCP兼容性是HDMI产品最头疼的问题之一。不同品牌的源端和显示端在HDCP实现上都有细微差异中继芯片夹在中间经常要两头哄。我遇到过的一个典型案例是某品牌机顶盒在HDCP 2.2认证时对中继器的拓扑响应时间要求特别苛刻超过15ms就重试。而某品牌电视在作为下游时HDCP响应又特别慢经常要30ms以上。IT66341夹在中间如果直接把上游的请求透传给下游再把下游的响应透传给上游总延迟就超过15ms了。解决办法是在中继芯片里做响应缓存对上游的某些请求中继芯片先用自己的缓存响应同时异步去下游取真实响应等下游响应回来后再更新缓存。这样上游看到的延迟就短了。这个技巧需要对HDCP协议有深入理解知道哪些请求可以缓存、哪些必须实时透传。一般来说拓扑相关的请求可以缓存密钥交换相关的请求必须实时透传。4. CEC透传看似简单坑最多4.1 CEC的物理层和仲裁机制CECConsumer Electronics Control是HDMI里的一条单线双向总线速率很低只有400bps左右。它的物理层是开漏输出所有设备都挂在这一条线上靠上拉电阻拉高。任何设备想发消息先把线拉低如果拉低后一段时间内线还是低的说明有其他设备也在发就退出仲裁。IT66341的CEC功能是透传把上游的CEC消息透传给下游把下游的CEC消息透传给上游。但透传不是简单的电平跟随因为CEC有仲裁机制。如果中继芯片只是把上游的电平复制到下游当上游和下游同时发消息时仲裁逻辑就乱了。正确的做法是IT66341内部有CEC控制器它先完整接收一条CEC消息然后再重新发送出去。这样仲裁逻辑由芯片内部的控制器处理不会出现电平冲突。但这也引入了延迟一条CEC消息最长可能有几十个字节在400bps下传输需要几百毫秒。如果上下游同时发消息中继芯片需要缓冲和排队。4.2 逻辑地址分配与冲突CEC网络里每个设备都有一个逻辑地址比如电视是0播放器是4功放是5。逻辑地址是动态分配的设备上电后会先探测自己想用的地址是否被占用如果被占用就换一个。在中继场景下IT66341需要决定自己用什么逻辑地址。如果中继芯片被当作功放逻辑地址5它就要参与逻辑地址的分配和冲突解决。如果中继芯片只是透明传输不参与CEC网络管理那它就不应该占用逻辑地址。但完全不参与也有问题有些源端会检查CEC网络上是否有电视如果没有电视就不发CEC消息。这时候中继芯片可能需要伪装成一个电视逻辑地址0来骗源端发消息。这个选择取决于产品定位。如果是AV功放中继芯片应该作为功放参与CEC网络如果是单纯的切换器中继芯片可以透明传输但可能需要伪装电视来保证兼容性。IT66341支持这两种模式通过寄存器配置选择。4.3 实测中的CEC丢包和重发CEC的可靠性不高丢包是常态。IT66341内部有CEC重发机制如果一条消息发出去后没有收到ACK会自动重发最多重发5次。但重发也有讲究如果下游设备处理CEC消息很慢ACK回来得晚中继芯片可能已经重发了导致下游收到重复消息。我实测下来CEC重发的超时时间需要根据下游设备的响应速度来调。对于响应快的设备比如电视超时可以设短一点200ms左右对于响应慢的设备比如某些老功放超时要设长一点500ms以上。IT66341的重发超时是可配置的但需要软件根据下游设备的能力动态调整。另一个坑是CEC消息的广播地址。CEC消息可以发给特定逻辑地址也可以广播地址15。广播消息不需要ACK但中继芯片需要确保广播消息只发一次不要因为重发机制而重复广播。IT66341对广播消息有特殊处理不会触发重发。5. EDID管理与速率协商的实战细节5.1 EDID的读取和合并EDID是显示端告诉源端我支持什么分辨率、什么音频格式的数据结构通常有256字节包括扩展块。在多路输入场景下每个输入端口对应的源端可能不同它们需要的EDID也可能不同。IT66341内部有EDID存储区可以存储多份EDID。当某个输入端口被选中时芯片把对应的EDID呈现给源端。但这里有个问题如果下游显示端的EDID和源端期望的不一致比如显示端只支持4K30Hz而源端想发4K60Hz就需要做EDID合并或修改。常见的做法是EDID裁剪把下游EDID中源端不支持的分辨率去掉或者把源端不支持的分辨率替换成双方都支持的。IT66341支持EDID的读写和修改软件可以在下游EDID读取后做处理再呈现给源端。但EDID修改要小心不能改出不符合规范的EDID否则源端可能拒绝输出。5.2 SCDC与TMDS速率协商HDMI 2.0的速率协商通过SCDC进行。源端读取下游的SCDC寄存器了解下游支持的最大TMDS速率然后决定用哪个速率发送。IT66341作为中继需要把下游的SCDC信息透传给上游同时可能需要对某些字段做修改。这里的关键是TMDS速率切换的时序。当源端决定从6Gbps切换到3Gbps时它会先通过SCDC通知下游然后等待一段时间再切换TMDS速率。中继芯片需要在这段时间内完成内部时钟的重新配置。如果中继芯片切换太慢源端已经开始发新速率的信号了中继芯片还锁在旧速率上就会丢信号。IT66341的速率切换时间在数据手册里有标注软件上要确保在源端切换前完成配置。实测中这个切换时间大概在几毫秒到几十毫秒之间取决于具体的配置。5.3 实测中的EDID兼容性问题EDID兼容性问题五花八门。我遇到过的一个典型案例是某品牌笔记本的EDID里有一个扩展块声明支持HDR但下游电视不支持HDR。中继芯片如果把笔记本的EDID直接透传给电视电视会拒绝如果把电视的EDID直接透传给笔记本笔记本又不会发HDR信号。解决办法是EDID合并把笔记本EDID中的HDR相关字段去掉保留其他字段再呈现给电视。另一个坑是EDID的Checksum。EDID每个块的最后1字节是Checksum修改EDID后必须重新计算Checksum否则源端会认为EDID无效。IT66341内部有Checksum自动计算功能但软件修改EDID后要确保触发重算。还有一个容易被忽略的点是EDID的读取时序。源端读取EDID是通过DDCDisplay Data Channel进行的DDC的时钟是100kHz。如果中继芯片在源端读EDID时正在做其他I2C操作可能会导致DDC读取失败。IT66341内部有DDC缓冲但软件上要避免在DDC读取期间做冲突的I2C操作。6. 硬件设计与调试的避坑清单6.1 PCB布局的关键约束HDMI 2.0的18Gbps信号对PCB布局要求很高。IT66341的输入输出走线必须按差分线处理阻抗控制在100欧姆差分单端50欧姆。走线长度要尽量短输入走线和输出走线要分开避免交叉。电源去耦也很关键。IT66341有多个电源引脚每个引脚都需要就近放置去耦电容。高速信号的电源噪声会直接影响眼图实测中如果去耦电容放得不好眼图张开度会明显变差。还有一个容易忽略的点是晶振的布局。IT66341需要外部晶振提供参考时钟晶振的走线要短且要远离高速信号线。晶振的电源也要单独滤波否则晶振抖动会传导到TMDS时钟上。6.2 散热与功耗管理IT66341在满负荷工作时功耗不低尤其是多路输入同时上电时。芯片有内置的温度传感器软件可以通过I2C读取温度。如果温度过高芯片会自动降频或关闭部分功能。实测中如果板子散热不好芯片温度可能超过80度这时候HDCP认证会变得不稳定。解决办法是加散热片或者优化PCB铜箔面积。另外未使用的输入端口可以在软件上关闭降低功耗。6.3 固件升级与寄存器配置IT66341的配置通过I2C进行寄存器数量很多。厂商通常会提供配置脚本或固件但理解关键寄存器的含义对于调试很重要。我建议在调试时先做最小系统验证只配置最基本的寄存器让芯片能切换和输出信号然后再逐步添加HDCP、CEC、EDID等功能。这样出问题时容易定位是哪个模块的配置有问题。另外配置寄存器的顺序也有讲究。有些寄存器必须在其他寄存器之前配置比如时钟相关的寄存器要在信号通道寄存器之前配置。具体的顺序参考厂商的配置指南但理解每个寄存器的功能有助于在出问题时快速定位。7. 几个真实调试案例的复盘7.1 切换后黑屏3秒才出画面这个问题困扰了我很久。现象是从输入1切到输入2画面要黑3秒左右才出来。用示波器抓TMDS信号发现切换后信号很快就稳定了但下游设备就是不显示。排查后发现是HPD的问题。切换后中继芯片把HPD拉低再拉高下游设备检测到HPD变化后重新读取EDID这个过程花了2秒多。再加上下游设备重新锁定信号的时间总共3秒。解决办法是优化HPD时序切换时不要拉低HPD而是保持HPD为高只切换TMDS通道。这样下游设备不会重新读EDID切换时间缩短到几百毫秒。但这样做的前提是下游设备支持热切换有些老设备不支持还是得拉低HPD。IT66341支持HPD时序的可配置软件上可以根据下游设备的能力选择。7.2 HDCP认证随机失败这个问题更隐蔽。现象是大部分时候HDCP认证正常但偶尔会失败失败后重新插拔线缆又好了。排查后发现是I2C总线冲突。IT66341的HDCP消息通过I2C传输同时软件还在通过I2C读取温度传感器。如果两个I2C操作同时进行HDCP消息可能被打断导致认证失败。解决办法是I2C总线加锁所有对IT66341的I2C访问都通过一个互斥锁串行化避免冲突。这个改动很简单但效果立竿见影HDCP认证失败率从5%降到了0。7.3 CEC消息发不出去现象是电视通过CEC发送切换到HDMI 2的命令但中继芯片没有响应。排查后发现是逻辑地址冲突。中继芯片配置的逻辑地址和电视的逻辑地址相同导致CEC仲裁时中继芯片总是退出。解决办法是修改中继芯片的逻辑地址避开电视占用的地址。IT66341支持逻辑地址的动态配置软件上可以在CEC初始化时探测可用地址。8. 选型与替代方案的思考IT66341在HDMI 2.0切换芯片里属于中高端定位支持完整的HDCP 2.2/2.3和CEC功能。如果产品不需要HDCP 2.2只需要HDMI 1.4切换可以选择更便宜的芯片。如果需要HDMI 2.1的48Gbps切换IT66341就不够了需要选支持HDMI 2.1的芯片。选型时要考虑的几个维度输入端口数量、最大TMDS速率、HDCP版本、CEC支持、封装尺寸、功耗、价格。IT66341的优势在于集成度高一颗芯片搞定切换、均衡、HDCP、CEC适合空间受限的产品。劣势是配置复杂调试周期长需要厂商的技术支持。替代方案方面如果只需要2进1出可以考虑用分立的多路复用器加HDMI接收芯片的方案成本可能更低但PCB面积更大调试更麻烦。如果只需要1进1出不需要切换直接用HDMI均衡器芯片就行不需要IT66341这么复杂的芯片。9. 写在最后的一些个人体会搞HDMI切换芯片这些年最大的体会是协议规范只是起点真正的功夫在兼容性调试上。HDMI规范写得很详细但不同厂商的实现总有差异中继芯片夹在中间要能两头哄。IT66341的硬件能力很强但软件配置的细节决定了最终体验。另一个体会是测试要覆盖极端场景。常温下跑得通不代表高温下跑得通短线下跑得通不代表长线下跑得通一个设备跑得通不代表所有设备都跑得通。我习惯在调试阶段准备多种线缆1米、3米、5米、多种源端机顶盒、游戏机、笔记本、多种显示端电视、显示器、投影交叉组合测试。虽然麻烦但能提前发现大部分兼容性问题。最后分享一个小技巧善用芯片的中断和状态寄存器。IT66341有很多状态寄存器记录了当前链路的状态、HDCP认证进度、CEC消息状态等。调试时不要只靠猜多读状态寄存器能快速定位问题。比如HDCP认证失败时读一下HDCP状态寄存器看看卡在哪个阶段比盲目重试有效得多。HDMI技术还在演进HDMI 2.1的48Gbps对切换芯片提出了更高要求。但底层的信号完整性、协议协商、兼容性调试这些基本功在任何一代HDMI芯片上都是通用的。把IT66341这类芯片吃透再上手新芯片会快很多。
返回列表