ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

IT6616 HDMI转MIPI桥接芯片实战:从硬件设计到驱动调试全解析

IT6616 HDMI转MIPI桥接芯片实战:从硬件设计到驱动调试全解析 先说我自己的经历。前两年做一块手持设备的主板处理器那边只引出了MIPI DSI接口屏幕也是标准的MIPI DSI LCD。按理说直接点屏就完事了但产品做到一半客户突然提了个需求要能外接一个HDMI输入源把电脑画面直接显示到这块小屏上。当时方案组讨论来讨论去最后定下来就是加一颗IT6616。这颗芯片不算新但它的定位非常明确把HDMI 1.4的信号桥接到MIPI CSI/DSI接口上等于在两条完全不互通的视频总线之间搭了一座桥。这个标题下我想把这颗芯片从内部链路、硬件设计、驱动流程到调试踩坑完整梳理一遍给正在做嵌入式显示、视频采集或者工控HMI的朋友一个可以直接参考的底稿。如果你正在做类似的项目IT6616大概率也在你的备选名单里。它解决的痛点很具体很多主控和处理器的显示或摄像头接口只开放MIPI而外设和信号源偏偏只给HDMI。没有桥接芯片你就只能换主控、改板子这种代价在项目中期几乎不可接受。这篇文章适合嵌入式硬件工程师、Linux驱动开发以及做产品选型的人我会尽量把底层逻辑讲清楚而不是只堆寄存器配置。1. HDMI与MIPI之间隔着什么IT6616要解决的三个实际问题1.1 两类总线的原生差异先说一个容易被忽略的基础问题HDMI和MIPI DSI/CSI根本不是一回事。HDMI走的是TMDS差分信号带时钟通道和4对数据通道每个通道速率动辄上Gbps物理层信号摆幅、编解码方式、协议帧格式与MIPI完全不同。而MIPI DSI/CSI走的是D-PHY数据通道从1对到4对不等DDR双沿采样协议上分成短包、长包与HDMI的TMDS字符编码没有任何兼容性。所以不能指望简单地把HDMI的引脚接到MIPI的引脚上就能工作。跨总线传输必须有一颗芯片在中间做完整的协议转换接收TMDS信号、做8b/10b或者类似解码、提取像素时钟和同步信号然后再按MIPI D-PHY的时序规则把像素数据打包成短包和长包发出去。IT6616做的就是这样一件事。1.2 典型应用场景显示桥接最普遍的用法是把HDMI输出设备接入到MIPI DSI屏幕上。比如树莓派计算模块、某些国产开发板、工业平板主控端可能只有HDMI输出口但实际采用的LCD面板是MIPI DSI接口两者对不上IT6616夹在中间做协议转换。这类场景对桥接芯片的要求是源端分辨率自适应、MIPI参数可配置、支持RGB888格式、能透传EDID和热插拔事件。实际项目中PC主机通过HDMI线接到IT6616所在板卡IT6616把视频流转换成MIPI DSI信号送到LCD整个过程源端看起来就好像接了一台普通HDMI显示器。1.3 典型应用场景HDMI转MIPI CSI采集反过来IT6616也常用于把HDMI信号送入只带MIPI CSI接口的SoC做视频采集。比如一些视觉处理板卡摄像头接口是MIPI CSI但客户想要接电脑的HDMI画面做录屏或图像分析。IT6616工作在这种模式下输出方向不再走DSI显示协议而是配置成CSI-2协议把HDMI视频流包装成MIPI CSI-2的长包数据送给SoC的CSI接收端。需要注意DSI和CSI在物理层上用的都是MIPI D-PHY数据通路的框架一样只是包类型、同步机制有区别。IT6616的寄存器里通常会有模式选择位把发送端配置成DSI模式或者CSI模式。这点在选择芯片时要特别确认因为有些桥接芯片只支持DSI方向不支持CSI方向。1.4 为什么不用RGB/LVDS方案替代有人会问既然处理器有RGB接口或者LVDS为什么不直接转成这两种信号非要走MIPI原因在于PCB走线和功耗。MIPI差分对节省引脚抗干扰能力也不错对板级Layout更友好。RGB接口在1080p下光数据线就要24根再加上时钟和同步布线非常痛苦LVDS虽然差分数减少但对需要小尺寸低功耗的设备来说MIPI仍然是更现代、更流行的面板接口。所以IT6616这类芯片的价值不是做高难度的图像处理而是用一颗芯片解决总线生态不互通的问题。它不是万能的1080p60就是它的主职范围超过这个需求就要往更高端的桥接芯片去选。2. IT6616核心链路拆解HDMI接收、MIPI发送与控制通道2.1 HDMI接收前端从TMDS解码到像素流IT6616的前端是一套完整的HDMI 1.4接收器包含TMDS时钟和数据通道接收、均衡放大、同步检测、HDCP解密、EDID管理以及HPDHot Plug Detect处理。源端设备发过来的TMDS信号在这里被还原成并行像素数据同时恢复出像素时钟、行场同步信号和DE信号。误差控制在这里很关键。长线缆输入的信号会有高频损耗芯片内部的均衡器会对信号做补偿但PCB走线不能因此马马虎虎。HDMI差分对的阻抗、长度匹配、连接器到芯片之间的走线长度都会影响信号质量后边硬件部分我会展开。HDCP也是一个值得注意的点。如果源端开启了HDCP保护而IT6616和后续链路不支持正确的HDCP密钥交换画面就会黑屏或者被降级成低分辨率。实际做产品的时候要提前想清楚目标场景里有没有HDCP源有的话就要有对应的处理策略。2.2 中间的视频流处理HDMI接收前端输出的像素流要经过内部处理单元再交给MIPI发送端。IT6616不是一颗带缩放功能的芯片它更多是做转换不改变分辨率。也就是说输入是1920x1080输出也是1920x1080不会把1080p自动缩小成720p。这一点在设计时非常重要不要指望用它做分辨率转换源端要设定到目标分辨率才行。芯片内部还会有色彩空间和像素格式的适配。比如输入是RGB 444输出可以按RGB888打包如果源端设置了YCbCr422芯片也要能转换到适合MIPI发送的格式。很多驱动程序里需要配置这部分配置错了最常见的症状就是颜色不对或者画面出现绿色条纹。2.3 MIPI发送端DSI和CSI的同一套物理通路IT6616的发送端在物理上是一组MIPI D-PHY接口包含一路时钟差分对和最多四路数据差分对。它既可以配置成DSI用于显示也可以配置成CSI-2用于采集取决于寄存器里选择的目标协议。从MIPI速率来算1080p60 RGB888像素时钟大约148.5MHz24bit每像素总数据率约3.56Gbps。如果采用4条lane每条lane的数据率约891MbpsDDR双沿采样对应时钟频率约445.5MHz。这个速率在D-PHY规范里属于可接受范围但已经不算很低Layout时对差分线质量要足够重视。DSI协议下IT6616需要把RGB像素数据组装成短包和长包还要处理典型的视频模式时序比如HSA、HBP、HFP、VSA、VBP、VFP这些消隐区参数。这些参数必须和面板的具体规格一致稍有不匹配就会花屏或者显示边缘偏移。2.4 控制通道I2C从接口和中断机制主控对IT6616的配置基本都通过I2C完成。芯片作为I2C从设备接收主控写过来的寄存器配置也负责上报状态。典型的中断事件包括HPD变化、EDID读取完成、HDCP认证结果、视频信号锁定等。Linux驱动通常会注册一个I2C客户端在中断线程里读取芯片状态寄存器判断事件类型然后做相应处理。热插拔场景里如果HPD信号没有妥善处理源端不会知道你已经接上了设备也就不会开始输出视频。这块在驱动章节里细说。整条链路可以概括为HDMI源 - TMDS解码 - 像素流适配 - MIPI打包 - DSI/CSI输出 - 面板或SoC接收。中间每一个环节的配置都会影响最终效果所以调试时一定要逐级排查。3. 硬件设计最容易翻车的五个细节供电、差分线、I2C与热插拔3.1 供电架构和去耦IT6616这类桥接芯片通常需要多路电源。模拟核心供电、数字核心供电、MIPI PHY供电、HDMI接收PHY供电、IO供电往往不是同一个电压域。设计时最少要留意三组电源一组给模拟核心一组给数字逻辑一组给MIPI和HDMI PHY。去耦电容不能省。每个电源引脚就近摆放0.1uF电容大容量的钽电容或陶瓷电容放在电源入口。HDMI和MIPI PHY这些高速电路对电源纹波极其敏感如果电源噪声耦合到PLL里屏上会出现细密横条纹或者抖动。我习惯在桥接芯片下方铺完整地平面电源走线先经过磁珠再到芯片效果会好很多。3.2 HDMI差分对的LayoutHDMI走线是高速差分信号到了1080p60这个级别虽然不能说特别苛刻但仍然要遵循基本的信号完整性规则。HDMI时钟对和数据对要做100Ω差分阻抗控制对内等长、对间等长都要控制等长误差最好在5mil以内。实际板卡上HDMI插座到IT6616之间的距离尽量短。如果必须走长线中间不要打过孔或者尽量少打。差分对周围要保持地铜包裹避免出现大的参考平面割裂。很多量产项目出现花屏、黑屏或者认证过不了最后查下来就是HDMI差分对参考平面被断断续续的走线切割破坏了。3.3 MIPI D-PHY差分对LayoutMIPI差分对的阻抗要求也是100Ω同样要控制等长。需要注意MIPI D-PHY对信道间偏差更敏感。时钟通道和数据通道之间、数据通道和数据通道之间等长控制要严格否则容易出现采到错误数据的情况。此外MIPI走线上串联电阻的选择有讲究。串阻可以抑制振铃和过冲但阻值太大会使信号边缘变缓反过来影响时序。一般根据芯片手册推荐值来选常见在0Ω到22Ω之间。实际项目中不要为了追求安全随便用大电阻要结合示波器实测波形来定。3.4 I2C上拉和电平匹配I2C是IT6616和主控之间最关键的通讯链路设计上却经常被忽略。上拉电阻阻值要结合总线电容和通讯速率选择常规400kHz下用2.2k到4.7k比较常见。总线上挂多个设备时要统一计算上拉强度阻值太小会拉不动阻值太大则上升沿太慢。还要确认I2C的电平域。如果主控是1.8V IO而IT6616支持3.3V就需要加电平转换或者在芯片支持的开漏结构下合理选择上拉到对应电压。不要直接硬接轻则通讯不稳定重则损坏IO口。3.5 HPD和CEC引脚的处理HPD引脚如果悬空不处理源端不会感知到显示器连接自然也不会有信号输出。正确做法是通过一个电阻或直接连接到HDMI插座对应的HPD引脚同时做好上拉或者按芯片手册配置。CEC引脚在多数简单应用里用不到但必须注意不要让它悬空处在不确定电平通常接一个上拉电阻到3.3V或者5V。某些HDMI源设备在连接时会检测CEC处理不当会影响握手过程。这个点很多硬件工程师第一次画板时会忽略。4. 驱动初始化实战从I2C探测到MIPI视频流点亮4.1 上电复位后的基本流程驱动初始化一般从上电复位开始。上电后先等待芯片内部电源稳定然后主控通过I2C读取芯片ID寄存器确认通讯正常。拿到ID后先不要急着配置MIPI输出参数先确认HDMI输入端处于什么状态。典型流程大概是这样的步骤I2C读取芯片ID确认版本。读取芯片中断状态寄存器清除残留中断。等待HPD事件确认HDMI源端已经连接。通过DDC通道读取源端的EDID确认源端支持的分辨率。根据面板或采集端的规格设定MIPI输出模式、分辨率、像素格式和lane数。根据EDID或预设配置设定HDMI接收端的工作参数。使能输出观察中断状态或者视频同步信号是否锁定。进入正常工作实时处理HPD和HDCP事件。4.2 EDID读取和HPD握手IT6616作为HDMI接收器需要向源端提供EDID。EDID数据一般存放在芯片外挂的EEPROM里或者由主控通过I2C在运行时写入芯片内部EDID RAM。源端设备在检测到HPD拉高后会通过DDC通道读取EDID然后决定输出什么分辨率。很多项目的驱动调试卡在这一步。现象是源端看起来识别到了设备但输出分辨率始终不对或者一直黑屏。排查思路是抓I2C总线看看源端有没有成功读到EDID读到的内容是不是完整。有些时候EEPROM烧录不完整导致EDID校验和错误源端就会拒绝输出。4.3 MIPI输出参数的确定MIPI参数是整个驱动初始化里最繁琐的部分。你需要告诉IT6616输出数据格式是多少bit每像素、使用几条lane、像素时钟是多少、DSI还是CSI模式、消隐区的各个参数是多少。这些参数并不是凭空定的要严格按照面板或者SoC接收端的规格书来填。比如一块典型的1080p DSI屏它的HSA、HBP、HFP、VSA、VBP、VFP都有一个推荐值照搬就行了。如果这些参数和屏幕实际需求不符轻则图像偏移重则屏幕无法正常显示。MIPI时钟的计算可以按这个思路估算总像素时钟乘以每像素位数得到总数据率再除以lane数得到每条lane的数据率。DDR传输下时钟频率是数据率的一半。比如前面算过的1080p60 RGB888四lane场景每条lane数据率约891MbpsMIPI时钟频率约445.5MHz。不同芯片对lane速率的极限值不一样选型时要留足余量。4.4 一个简化的驱动伪代码为了不把文章变成枯燥的寄存器手册我用伪代码演示一下核心流程。// 1) 探测芯片 if (i2c_read(chip_id_reg) ! EXPECTED_ID) { error(IT6616 not found); return -ENODEV; } // 2) 清中断 i2c_write(INT_CLEAR_REG, 0xFF); // 3) 等待HPD wait_for_interrupt(HPD_EVENT, timeout); // 4) 读取源端EDID edid read_edid_via_ddc(); // 5) 按照面板参数配置MIPI发送端 set_output_mode(DSI_MODE); // 或 CSI_MODE set_lanes(4); set_pixel_format(RGB888); set_timing(hsa, hbp, hfp, vsa, vbp, vfp); set_mipi_clock(target_mhz); // 6) 配置HDMI接收端通知源端输出 configure_hdmi_rx_based_on_edid(); // 7) 使能视频通路 enable_video_path();这个流程看起来简单实际项目中每一步都可能出幺蛾子尤其是等待HPD这一步。很多时候芯片没有产生HPD中断是因为源端根本没连上或者HDMI线缆质量差导致信号不稳定也可能是驱动配置里的HPD使能位没打开。4.5 中断驱动和设备模型在Linux环境下IT6616驱动通常作为一个I2C客户端注册同时注册一个中断gpio。HPD、HDCP、信号失锁等事件都会触发中断驱动在中断处理函数里读取状态寄存器判断事件类型再做对应的状态迁移。我建议新人拿到驱动后先把中断寄存器彻底读懂再动手改。不要一上来就照着某个开发板的配置改分辨率这样很容易踩到“改完参数屏还是不亮”的坑。优先级应该是先确认芯片工作正常再确认HDMI输入信号正常最后才去调MIPI输出参数。5. 屏不亮和花屏的排查顺序我实测过的几类典型故障5.1 屏完全没背光但系统认为已连接这个现象比较迷惑人系统已经枚举出设备看起来一切正常但屏幕完全没有反应。我遇到过最典型的根因是MIPI lane配置不对芯片按四lane输出但屏幕实际上是两lane模组主控只配了两lane而桥芯片还在按四lane发包。还有一种可能是像素格式不匹配。屏幕只支持RGB666驱动给的是RGB888桥芯片按长包发出数据屏幕却无法解析。这类问题通过抓MIPI数据和对照面板规格书很快能定位但没有示波器时就只能逐个参数试效率很低。5.2 有画面但花屏或者图像偏移花屏问题里最常见的是时序配置错误。有些LCD面板对消隐区参数非常敏感HBP填错几个像素就会出现图像左移或者右边一条彩带VBP填错会出现整屏上下抖动。排查时先用示波器量MIPI信号的porch区域对照寄存器值找差异。图像偏移还有一个隐蔽原因MIPI输出的像素时钟和HDMI接收端的像素时钟不一致。IT6616内部PLL需要根据输入像素时钟锁定输出时钟如果锁定不稳定画面会出现随机跳帧或者条纹。这时不要调MIPI参数先看HDMI输入时钟是否稳定。5.3 颜色明显不对偏绿或者偏紫颜色问题八成出在像素格式或色彩空间配置上。HDMI输入的YCbCr和RGB之间的转换需要在芯片内部完成如果驱动没有打开颜色转换模块或者直接按错误格式映射显示的颜色就会完全不对。我也遇到过一种情况屏幕的RGB子像素排列是BGR驱动默认RGB整屏颜色都会错位。这种问题和芯片配置无关是面板自身特性需要在驱动里做颜色交换。所以碰到颜色不对时先分清是格式问题还是接线排列问题不要一味的调寄存器。5.4 热插拔失灵拔了再插就黑屏热插拔失灵通常是因为HPD事件没有被正确响应。拔掉HDMI线时HPD信号变化触发中断驱动需要把视频通路关掉重新插入时又要重新读EDID、重新做HDCP握手、重新配置MIPI输出。任何一个环节漏掉第二次插入就会黑屏。这种问题在Linux驱动里很容易出现状态机漏洞。比如HPD事件来了之后驱动只是清了个中断没有重新初始化MIPI发送端芯片内部的状态就乱了。调试热插拔问题最好的办法是加日志把中断事件和状态迁移的每一步都打出来对照芯片手册看状态机是否合理。5.5 偶尔闪屏或者图像抖动闪屏抖动这类间歇性问题最烦人经常和电源噪声、地弹和差分线质量有关。可以先降低MIPI速率试试。把像素时钟稍微调低或者把实际输出的分辨率降一档如果问题消失说明信号余量不足硬件上要改Layout。软件层面也有一个可调项MIPI时钟边沿的相位、驱动强度的配置很多桥芯片都提供这类寄存器适当调整可以改善信号质量。但这不是长久之计量产产品最终还是要保证Layout和电源满足要求。5.6 快速定位问题的排查链路我的个人习惯是遇到故障时从输入往输出逐级排查先确认源端的信号是否存在用HDMI分析仪或者示波器。再确认IT6616有没有锁定信号状态寄存器里的信号锁定位是否为1。然后确认MIPI输出有没有波形lane数、时钟是否和配置一致。最后才是面板或SoC侧的参数验证。这套顺序基本能解决80%的问题。很多人上来就调MIPI参数跳过了输入信号确认这一步结果改了半天发现源头就是没插线。6. 选型对比IT6616、TC358762、LT8912B与IT66121怎么选6.1 IT6616的核心优势IT6616在市场上流行了很长时间资料相对齐全很多开发板都做了开源驱动和参考设计这一点对快速验证非常有帮助。它的主职是HDMI 1.4转MIPI DSI/CSI最高支持1080p60对中小尺寸的显示和采集应用完全够用。成本也是IT6616的优势之一。相比一些高端桥接芯片它的价格更亲民在批量产品里能省下可观成本。缺点是芯片本身不支持4KHDMI输入也只到1.4如果你有4K60的需求基本可以直接排除它了。6.2 TC358762和IT66121的特点TC358762是东芝的一颗HDMI转MIPI DSI芯片同样面向1080p60级别。它的知名优势在于低功耗和相对小的封装在一些电池供电的手持设备里用得比较多。但它的DSI和CSI支持方向要看具体型号有些型号不支持CSI方向选购时务必核对数据手册。IT66121可以看成IT6616的后续相关型号同样来自ITE基本能力接近。两者在寄存器配置、驱动框架上可能有相似之处但管脚定义和上电时序有差异不能直接替换。选型时要对照具体PCB封装和软件适配成本来决定。6.3 LT8912B的替代意义LT8912B是龙迅推出的一颗HDMI转MIPI桥接芯片在国产方案里出现频率很高。它对标的就是IT6616这类产品同样支持HDMI 1.4到MIPI DSI/CSI方向转换最高分辨率也覆盖1080p60。在一些对国产化有要求的项目里LT8912B经常作为替代选项。它和IT6616的差异主要在寄存器配置、软件驱动和功耗细节上。如果你的系统已经在用IT6616那么平移到LT8912B需要重写驱动适配不能直接复用。反之也一样。选型时不要只看功能表要把软件工作量也算进去。6.4 一张表看清主要芯片差异芯片型号HDMI输入版本最大分辨率MIPI方向典型定位IT66161.41080p60DSI/CSI通用低成本桥接资料多IT661211.41080p60DSI为主ITE迭代型号软硬件需适配TC3587621.41080p60DSI低功耗小体积方向确认要仔细LT8912B1.41080p60DSI/CSI国产替代供货和认证有优势表格只是参考具体供货情况、封装、温度范围都要对照官方最新数据手册。我遇到过不止一次芯片手册写着支持4K但量产批次存在限制这类信息只有和原厂FAE确认才靠谱。6.5 我自己的选型经验如果项目是个人DIY或者小批量产品IT6616是首选因为能最快跑起来。如果项目是功耗敏感的手持设备TC358762值得评估但一定要确认MIPI方向是否匹配需求。如果项目对器件国产化有要求LT8912B更合适龙迅在国内的技术支持响应相对及时。另外一点经验是不要只看芯片本身要把配套的驱动、参考设计、原厂支持力度都纳入选型。一颗芯片再便宜如果资料只有一份几十页的数据手册而你又没时间从头调项目进度风险会很大。IT6616在这方面相对友好这也是它在开发者圈子里口碑不错的重要原因。最后说一个实际建议无论选哪颗芯片第一版打样一定要把调试接口引出来包括I2C、HPD、中断脚、MIPI差分测试点。不然屏幕不亮的时候就只能对着板子发呆。IT6616本身桥接逻辑不复杂真正花时间的往往是外围的时序验证和信号质量调试这些准备工作做好了项目能省下大量时间。
返回列表