做嵌入式显示的朋友十有八九会撞上这样一件事一边是电脑、电视盒子、游戏主机都默认支持的HDMI一边是手机屏、平板屏、车载屏普遍采用的MIPI DSI两边都是主流但协议、电气规格、控制方式完全不一样。IT6625这颗芯片就是专门在两者之间当翻译的。它把HDMI输入进来的TMDS串行视频流解出来恢复成像素时钟和RGB/YCbCr数据再按MIPI DSI的规范重新打包通过高速差分lane送进屏幕驱动IC。硬件工程师能靠它省掉一整套FPGA方案驱动工程师可以把它当作一个标准的HDMI转MIPI桥接器来调。这篇文章我写点实在的东西这根“桥梁”到底是怎么架起来的调通时哪些参数必须弄清楚以及我踩过的一些坑。1. 一颗芯片的本质工作把两套接口语言互相翻译1.1 HDMI和MIPI其实是两套完全不同的“方言”很多人第一反应是HDMI和MIPI不都是高速串行接口吗难道不是电平转一下就行实际完全不是。HDMI的物理层是TMDS数据线4对3对数据1对时钟信号经过8B/10B编码内嵌行场同步、音频、辅助数据。HDMI源端对外输出的时候根本不关心你后面接的是电视还是液晶模组它只认两个东西通过DDC通道读到的EDID以及HPD引脚的电平。MIPI DSI这边则是另一种生态。数据通道是D-PHY一组时钟lane加1到4组数据lane高速状态下是差分信号低功耗状态下是单端LP信号。视频信号要拆成一个一个的包长包传像素数据短包传同步事件或命令。MIPI屏的驱动方式还分命令模式和视频模式很多TFT屏上电以后必须先发一串初始化寄存器序列否则就算有视频数据也不亮。所以HDMI和MIPI之间不只是物理接口换一下而是整个通信模型都不一样。IT6625做的事情拆开来看就是三个环节先做HDMI接收把TMDS串行流解码成并行视频数据再做视频处理对分辨率、色彩格式、时序参数做转换最后做MIPI发送把并行数据按DSI协议打包输出。1.2 桥接的本质是“协议翻译”不是“电平转换”把桥接芯片理解成一颗带协议栈的转换芯片就顺了。电平转换芯片比如简单的信号缓冲器只负责把电压域一变或者把单端转差分但IT6625这类芯片内部有完整的视频处理链路。HDMI那边进来的是一帧一帧的像素包含时钟、DE、HSync、VSyncMIPI那边出去的是一个一个的包里面有包头、像素负载、ECC/CRC校验。打个比方HDMI像是寄国际快递东西打包好贴了面单EDID快递员源端看面单知道往哪送MIPI像是工厂内部传送带零件数据包要按照固定节拍一件一件放进工位屏幕驱动IC。IT6625就是把国际快递拆开重新按工厂节拍放上传送带。这也就解释了为什么很多做硬件的人会踩坑你以为是简单的线序问题其实真正要调的是时序和包的格式。1.3 这个桥适合用在哪里IT6625这类芯片在三种场景最常见。第一种是HDMI信号驱动MIPI接口的显示屏比如广告机、会议平板、工业一体机主板只有HDMI输出但屏是MIPI DSI中间必须加桥接。第二种是采集类应用把HDMI视频转成MIPI CSI信号给处理器采集比如RK3588这类SoC本身没有HDMI输入但有MIPI CSI接口用这颗芯片可以做一个HDMI采集前端。第三种是信号转换盒把HDMI转成MIPI接口去接某些特殊显示模组或车载屏。不管是哪种场景思路都是一样的先把输入链路搞定再把输出链路搞定两边对接成一个完整的时钟树。下面我从方案选型到实际调试把整个链路拆开讲。2. 方案选型为什么用专用桥接芯片而不是FPGA或者MCU2.1 和FPGA方案比省的不只是成本每次有工程师问我能不能用FPGA实现HDMI转MIPI我都说能但要想清楚代价。FPGA做这个事需要MIPI D-PHY的硬核或软核需要HDMI接收IP还要处理EDID、HDCP、音频这些杂七杂八的协议。就算纯做视频直通光是把MIPI RX/TX调稳定就要耗费不短的开发周期。FPGA的引脚、电源、时钟设计复杂度也明显高于一颗专用桥接芯片。IT6625走的是专用ASIC路线芯片内部已经把HDMI RX、视频缩放/转换、MIPI DSI发送都集成好了。对大多数项目来说一颗芯片加一个晶振加几个电容电阻就能工作不需要写FPGA逻辑也不需要买MIPI PHY的授权或IP。开发周期从按月算变成按天算。FPGA的优势是灵活可以同时处理多路信号、做复杂的图像算法但如果项目目标只是“把HDMI转成MIPI去点屏”那用FPGA属于杀鸡用牛刀。2.2 和SoC直接硬解比节省主芯片资源另一种常见的做法是SoC自带HDMI接口比如某些主控芯片直接能输出LVDS或者RGB但很多小型处理器没有MIPI DSI控制器或者MIPI口被Camera占用了。这时候如果强行用SoC的RGB或者LVDS去转MIPI需要额外的转换芯片而且会占用主控的IO、内存和CPU开销。IT6625把协议转换卸载到自己身上主控只需要通过I2C配置它视频流走HDMI输入MIPI输出主控的负担非常低。选型的时候有一个容易忽略的点主控和桥接芯片之间是I2C控制关系不是数据关系。视频数据走HDMI这路I2C只是用来配置寄存器、读取中断状态。有些项目为了图省事想用GPIO模拟I2C去配IT6625我也试过不是不行但初始化时序长、调试不方便建议还是用硬件I2C频率至少100kHz以上。2.3 选型必看的几个关键参数用IT6625这类芯片前先确认几个参数。输入侧要看支持HDMI 1.4还是2.0最高分辨率到多少支不支持3D和深色。输出侧要看MIPI支持DSI还是CSI最多几组lane数据率上限多大是否支持MIPI D-PHY 1.2。分辨率换算时要把HDMI带宽和MIPI带宽放在一起折算比如1080p60HzRGB888下像素时钟约148.5MHzMIPI DSI如果是4-lane每条lane数据率1Gbps那理论带宽约4Gbps足够传输如果上4K30Hz像素时钟约297MHz对lane数和速率的要求就高很多。还要问清楚EDID管理。IT6625通常会预留EDID存储空间或者从外部EEPROM读取有些版本还支持动态改写EDID。EDID如果配置不对源端很可能只输出低分辨率或者干脆黑屏。这一点一定不能靠猜。3. IT6625的核心模块与配置流程拆解3.1 输入侧EDID、HPD和HDCP是三个连招HDMI输入侧的工作不是说把TMDS信号接进来就行而是要先让源端“认识”你。源端上电后会通过Hot Plug Detect引脚的电平来判断有没有设备连接。IT6625这边把HPD拉高源端才会开始读EDID。EDID里写清楚支持的分辨率、刷新率、色彩格式、音频格式源端根据EDID来调整输出。调这块最容易出的问题是HPD和EDID互相配合不好。有的工程师先把HPD拉高EDID还没来得及写入就被源端读取了导致源端读到一个空EDID后面就一直输出错误分辨率。正确的做法是先在桥接芯片里把EDID准备好再拉HPD必要时可以做一个HPD脉冲来通知源端重新读EDID。IT6625的状态机把不少流程自动化了但初始化的先后顺序还是要注意看寄存器说明。HDCP是另一个容易踩坑的地方。如果输入源设备启用了HDCP加密桥接芯片没有正确完成HDCP认证输出就会黑屏或者源端直接降级到不加密的低分辨率。很多工业级应用其实不需要HDCP但默认情况下芯片可能会尝试认证如果你不接HDCP密钥就要在配置里明确关闭HDCP或者设置成“接收加密失败时自动跳过”。实际项目里如果出现接某些盒子黑屏、接电脑正常的怪现象十有八九和HDCP有关先关闭HDCP测试。3.2 输出侧MIPI DSI的lane、时钟和数据包格式MIPI DSI输出是IT6625真正干活的地方。首先要确定lane数量一般支持1/2/3/4-lane分辨率越高用的lane越多。第二要确定是视频模式还是命令模式。大多数TFT屏尤其是用来做HDMI投屏的屏支持视频模式Video Mode不需要频繁刷新如果是带显示RAM的屏可能要命令模式。IT6625的应用里视频模式最常见但视频模式下要配的参数特别多。视频模式需要配置HSA、HBP、HACTIVE、VSA、VBP、VACTIVE这些时序参数并且要和HDMI输入端解出来的时序对上。MIPI协议里还有BLLPBlanking or Low-Power机制垂直和水平消隐期间可以选择持续输出高速时钟也可以切换到LP状态。这个参数选错了会出现屏幕上半部分正常、下半部分花屏或者画面撕裂。还有一个坑是数据包的格式。MIPI DSI像素数据的传输方式有RGB888、RGB666、RGB565之分IT6625要做color depth conversion。如果你的HDMI源输出的是RGB888而屏只支持RGB666芯片要把格式转一下。这里会涉及像素如何打包进长包long packet以及word count对不对。调的时候用示波器看数据lane上的包结构是最直接的验证方法。3.3 I2C初始化序列不是写一堆寄存器那么简单IT6625的初始化本质上是通过I2C从机接口写寄存器。常见的流程是上电等待晶振稳定配置系统时钟和PLL配置HDMI RX配置MIPI TX最后使能输出。不同批次芯片的寄存器地址和值会不一样这里我建议把所有初始化序列都放在一个表里按顺序发送并且一次初始化后要做一次回读校验。我自己的做法是这样先用芯片原厂提供的工具或者示例驱动确认视频能正常输出然后逐步精简寄存器看看哪些是非必需配置哪些是必须保留的。这样做的目的是为了Debug万一以后初始化序列冲突了能更快定位问题。很多工程师喜欢直接把原厂一大段数组贴进去结果初始化顺序乱了或者在某个寄存器上覆写错误导致MIPI输出一直不稳定这种情况并不少见。4. 整条链路从PCB到驱动的调通实录4.1 硬件设计MIPI差分对比HDMI更容易被布局坑PCB布局上IT6625这类芯片的第一原则是HDMI差分对和MIPI差分对要分开布线尽量不要交叉更不能把MIPI差分对跨分割。HDMI那边输入的是TMDS信号差分阻抗要求通常按100Ω控制MIPI D-PHY的差分阻抗一般是100Ω但要注意单端阻抗也在50Ω左右布线时按完整参考平面走最好。热词里经常出现“MIPI同层挖空”说的是有些PCB设计为了减少寄生电容在MIPI差分对下方的参考层挖空这个做法本身是为了匹配阻抗或削减回流噪声但挖空不当会破坏参考平面导致信号完整性更差。我的建议是除非你有明确的仿真依据否则不要随意挖空优先保证MIPI差分对下方有连续地平面。电源设计也不能偷懒。IT6625通常需要多路电源内核电压、IO电压、模拟电压分开供电上电顺序要满足手册要求。我踩过一个坑内核电压和IO电压一起上电结果I2C一直无响应排查半天发现是上电时序不满足芯片没有正常起来。现在我在任意桥接芯片项目里都会把电源时序测试作为上电后的第一项检查。4.2 先让HDMI端认识屏幕EDID和HPD的实测过程我把调试流程分成两步先HDMI端后MIPI端。所谓“HDMI端认识屏幕”就是源端能正确读到EDID并且锁定到一个合适的分辨率。用HDMI分析仪或者支持EDID读数的信号源能直接看到源端读到了什么EDID。如果没有分析仪就把IT6625的I2C接口挂到逻辑分析仪上抓DDC的读取过程。实测时我会把EDID内容导出来跳过校验和之后重点看Horizontal Addressable、Vertical Addressable、Pixel Clock、HDMI VSDB这几个字段。如果屏幕实际物理分辨率是1920x1080EDID里却写了其他分辨率源端可能输出奇怪的时序。有些项目为了兼容性EDID里同时写多个分辨率但IT6625要把源端的输出分辨率固定在某一档这就需要在EDID里做手脚把不需要的分辨率屏蔽掉。HPD信号可以用万用表量高电平说明桥接芯片通知源端“我准备好了”。如果HPD一直低源端大概率不会输出。有的场景要求热插拔就是HDMI线头拔掉再插上HPD要重新拉低再拉高一次这一块IT6625会自动处理但前提是芯片没有进入异常状态。4.3 再让MIPI端开口讲话初始化面板与输出信号验证HDMI端正常以后MIPI端出来的信号如果屏不亮就要从两个方向查。第一是屏的初始化命令有没有发对。很多MIPI屏驱动IC比如ST7701S这类上电之后必须通过MIPI命令模式发送初始化Sequence设置伽马、电压、偏置、扫描方向等。桥接芯片只负责把视频包发出去不会替你把屏的初始化命令准备好所以这部分需要在主控或者桥接芯片支持的透传机制里处理。第二是MIPI物理层的验证。用示波器探MIPI数据lane的HS信号看高速传输时差分幅度是否达到D-PHY规范通常约200mV有没有明显的过冲或振铃。再看时钟lane是否连续是否与Data对齐。MIPI D-PHY下有LP和HS两个状态LP电压一般在1.2V左右HS差分在200mV量级如果示波器没设置好很容易误判。我遇到过一个很典型的例子硬件工程师总觉得MIPI输出接线没问题但屏幕就是花屏最后用示波器量发现每组lane的极性全反了。MIPI的D-PHY里lane正负极性接反会导致数据完全解不出来屏幕表现可能是不亮也可能是满屏雪花。线序和极性一定要在画原理图时反复核对这是最基础但最容易出问题的点。4.4 驱动代码的框架参考如果你是自己写Linux驱动大概会涉及这几个文件I2C设备驱动、视频接口配置、面板时序。下面我贴一个初始化流程的伪代码框架具体寄存器值以芯片资料为准。static int it6625_init(struct i2c_client *client) { // 1. 复位芯片等待稳定 it6625_write(client, REG_SYSTEM_RST, 0x01); msleep(20); // 2. 配置输入EDID和HPD it6625_edid_load(client, edid_data); it6625_write(client, REG_HPD_CTRL, 0x01); // 拉高HPD // 3. 配置HDMI接收 it6625_write(client, REG_HDMI_RX_CFG, 0x00); it6625_write(client, REG_HDMI_CLK_CFG, 0x23); // 4. 配置MIPI输出参数 it6625_write(client, REG_MIPI_LANE_NUM, 0x03); // 4-lane it6625_write(client, REG_MIPI_PIXEL_FMT, FMT_RGB888); it6625_write(client, REG_MIPI_HACTIVE, 1920); it6625_write(client, REG_MIPI_VACTIVE, 1080); it6625_write(client, REG_MIPI_HSA, 2); it6625_write(client, REG_MIPI_HBP, 40); it6625_write(client, REG_MIPI_VBP, 10); // 5. 使能输出 it6625_write(client, REG_MIPI_EN, 0x01); // 6. 读中断状态确认无报错 ret it6625_read(client, REG_INT_STATUS); if (ret ERR_HDMI_NO_LOCK) { dev_err(HDMI not locked\n); } return 0; }注意MIPI的HSA、HBP这些值和屏厂规格书给的时序参数必须严格对应。有些屏要求HSA不能太小否则会有竖条纹有些屏要求HBP必须覆盖某个范围。IT6625内部会有一定的容错但时序参数越准越不容易出现边界问题。调这个有一个好习惯先把屏厂提供的初始化Sequence和时序参数整理成一张表再和寄存器配置逐项核对。5. 常见问题与排查技巧实录现象可能原因排查方向完全黑屏EDID配置错误、HPD没拉高、HDCP认证失败检查I2C是否能读写EDID是否有效HPD电平关闭HDCP测试花屏MIPI lane极性反、lane数配置错、像素格式不对用示波器看HS差分信号核对lane映射和寄存器闪烁或者间歇性黑屏电源纹波大、MIPI差分对阻抗不连续、HDMI时钟抖动检查电源电容、差分阻抗、HDMI线材有画面但颜色不对色彩空间转换配置错、RGB/YCbCr没有对齐确认像素格式和色彩空间转换寄存器画面偏移或上面少一截HSA/HBP/HACTIVE时序不对对照屏规格书逐步调整消隐参数连接某些HDMI源不识别EDID格式不规范、HPD时序有问题用分析仪抓DDC重新生成EDIDI2C无响应芯片未正常上电、地址配错、复位引脚被拉低量电源、时钟、复位、I2C地址5.1 黑屏不等于芯片坏先查出在哪一环断的我见过许多工程师一旦黑屏就怀疑芯片焊接问题其实黑屏通常发生在链路早期。用I2C能读写、HPD正常、但源端没有输出说明卡在HDMI链路如果源端正常输出、MIPI输出无波形说明卡在MIPI配置或者面板初始化。从源端到芯片再到屏幕这个链路可以拆成五个节点HDMI源端的TMDS输出、IT6625的输入锁定、IT6625的MIPI输出、面板端的MIPI接收、面板背光控制。黑屏时沿着这五个节点逐个量一个小时就能定位。特别提醒有些屏的背光控制和MIPI是分开的。MIPI信号已经正确、屏幕也应该显示了但背光没开看起来还是全黑。这时候用强光手电照屏幕如果有淡淡的图像就是背光问题。这个低级错误在初学阶段很容易犯多留意一下。5.2 花屏和闪屏多数是时序和信号完整性问题花屏比黑屏更难调因为它说明MIPI通道已经传数据了但数据内容或者时序不对。先看像素格式如果HDMI源输出RGB888但MIPI配了RGB666那颜色会失真但不一定花真正的花屏往往是HACTIVE或者VACTIVE和屏的实际尺寸不匹配导致行场计数错位。还有一个经常被忽略的参数是MIPI的“sync event”还是“sync pulse”。视频模式下同步信息可以通过Short Packet里的Sync Event发送也可以通过同步脉冲来对齐。面板如果不支持sync event方式就会出现整屏偏移。闪屏可能是电源纹波问题。MIPI高速传输时瞬间需要的电流比静态大很多如果电源反馈环路慢电压会有明显跌落屏幕表现为间歇性闪烁。我在设计时要求IT6625的电源尽量靠近芯片引脚放0.1uF和1uF电容并且用一个小一点的磁珠做电源隔离实测对闪屏改善很明显。5.3 我调HDMI转MIPI的一点体会这类桥接芯片项目最考验人的往往不是芯片本身而是对输入输出两侧协议的理解。HDMI侧要照顾好EDID、HPD、HDCP这三者少一个都不行MIPI侧要把时序、lane、包格式、面板初始化全部对齐。芯片本身并不神秘它就是一个协议状态机但你得按它的节奏来。如果你手里拿到一块IT6625的参考板最稳的办法是先照着参考设计画板先把原厂的驱动跑起来再去做改动。我做第一版的时候总想顺便做点“优化”比如把MIPI差分对走线换层结果换层处的阻抗突变直接导致花屏后来老老实实参考原厂设计才稳定下来。电子产品设计就是这样走通一条路以后你才知道哪些地方动了会出问题哪些地方可以大胆调整。
