想把这颗芯片用好,光看懂数据手册还远远不够。第一次接触ADV7513BSWZ,是在一个需要把SoC的RGB信号转换成HDMI输出的方案里,当时我对着几十页寄存器表研究了好几天,踩遍了黑屏、花屏、音频无声的坑。这颗芯片是ADI在HDMI v1.4时代的经典发送器,最高165MHz像素时钟,能稳稳输出1080p60,在工控显示、车载娱乐、医疗设备、视频采集这类“不追求4K但求稳定”的场景里,至今还在大量出货。这篇文章把我自己从硬件设计到Linux驱动接入再到调试排障的经验一次说清楚,给正在选型或正在调板的朋友做个参考。
1. 先搞清楚ADV7513BSWZ到底能干什么
1.1 这颗芯片是干什么活的
ADV7513BSWZ的核心任务只有一个:把并行的数字视频信号(RGB/YCbCr)加上可选的数字音频,打包成HDMI的TMDS差分信号送出去。你可以把它理解成一个“视频翻译官”——你给它喂24位RGB、DE、HSYNC、VSYNC、像素时钟,它在另一端吐出一根标准的HDMI线,插到显示器上就能点亮。
它属于ADI视频接口芯片里比较“务实”的一代:没有复杂的固件系统,全靠I2C寄存器配置,主控端只要按初始化序列写好配置,剩下就交给芯片自己跑。优点是成熟稳定、资料多、踩过坑的人也多,缺点也很明显:引脚多、寄存器多,上电时序和初始化顺序搞错,它就罢工给你看。
我习惯把它定位在“中等规模音视频接口方案的交钥匙部分”。它不是一个简单的电平转换器,而是一个完整的HDMI发送链路,包含TMDS编码、DDC通信、HPD检测、HDCP加密、音频InfoFrame打包等一堆功能。你在原理图上看到的是300多pin(实际上LQFP-80封装的引脚数也相当可观)密集走线,实际工作起来则由软件寄存器在背后调度。
1.2 165MHz像素时钟意味着什么
165MHz是芯片的TMDS时钟高限,对应像素输入时钟也是165MHz。这个时钟决定了它能处理的分辨率上限。以我们最熟悉的1080p60为例,标准像素时钟是148.5MHz,所以它跑1080p60非常富裕,甚至还有余量跑1920x1200@60Hz的减消隐时序(约154MHz)。
但是要明确一点:ADV7513不支持4K,更不可能支持HDMI 2.0的18Gbps速率。HDMI 2.0链路速率需要TMDS时钟跑到600MHz以上,这颗芯片的物理层设计目标就是HDMI v1.4时代的1080p。所以如果你的项目里已经有了4K屏或者带HDR需求,趁早就把它排除掉,别想着“超频”或“取巧”。
从视频格式上讲,ADV7513支持RGB 4:4:4、YCbCr 4:4:4、YCbCr 4:2:2等主流输入格式,位深支持到12位每通道,也就是36位像素。对绝大多数工业相机、GPU、FPGA输出接口来说足够用了。实际项目里用得最多的是24位RGB(8bit×3),宽度跟MCU/SoC的显示控制器对齐最省事。
1.3 为什么放着同系列不选,要选它
ADI自家还有ADV7511、ADV7512等型号,很多人选型时在它们之间纠结。简单说下我的理解:
- ADV7511是功耗和功能都更“高配”的型号,像素时钟支持到225MHz,可以处理一些高分辨率时序,也带更完整的音频特性,但封装更大、外围更复杂、成本更高。
- ADV7512和ADV7511定位接近,多了一些面向影音功放场景的音频回传和支持功能。
- ADV7513更像在“够用”和“精简”之间做了取舍,165MHz足够覆盖1080p60,封装和引脚安排相对紧凑,电源和配置也更简单,适合中小尺寸板卡。
选ADV7513的典型理由其实是成本敏感和布线资源紧张。很多国产SoC的显示控制器最高只能输出1080p,这时候根本没有必要买一颗能跑4K的发送器,用ADV7513可以省下不少面积。
另外还有个现实原因:ADV7513在主流Linux内核里有现成驱动,以bridge驱动形式挂在DRM下,调试工作量比从零裸写寄存器小很多。这一点在后面的软件章节会细说。
2. 硬件设计核心:原理图和PCB上最容易翻车的地方
2.1 电源树是第一道关
所有的HDMI芯片都挑剔电源,ADV7513也不例外。它的内部包含数字逻辑、TMDS模拟发送电路、PLL时钟生成电路、I2C/DDC接口等不同功能的电源域,不同电源之间对纹波和噪声的容忍度差别很大。
画原理图时我强烈建议按数据手册的电源树逐项处理,不要图省事把所有电源引脚并在一起一个LDO拉倒。模拟电源和PLL电源需要单独的LC滤波或磁珠加退耦电容,数字电源则可以稍微放开一些。退耦电容要贴近引脚放置,容量遵循“一个低频大电容加几个高频小电容”的组合,常用布局是10uF+100nF,PLL引脚可以再加一个10nF到100nF。
还有一个容易忽略的地方是上下电时序。HDMI发送器在系统上电时如果任一路电源先失电,内部寄存器状态就可能进入不确定状态。所以设计时要确保各路核电压和IO电压的上升沿跟随主控电域,或至少在软件里做“检测I2C可访问后再初始化”的保护逻辑。我自己在项目中用过一个简单方案:由板上的电源监控芯片控制HDMI芯片的复位引脚,电源稳定后再释放复位。
2.2 像素输入接口:DE、时钟极性、位数一个都不能错
ADV7513的输入侧是一组并行总线,包含像素时钟、DE、HSYNC、VSYNC、数据线。数据线数量和格式由模式决定,你可以配置为RGB或YCbCr,也可以配置6位、8位、10位、12位输入精度的映射方式。
这里最容易犯的第一个错误是“像素时钟极性”。绝大多数显示控制器输出的有效像素在PCLK上升沿或下降沿对齐,而ADV7513内部也允许你配置采样沿。如果你在软件里没配对,现象就是画面整体像打了一层马赛克,条纹乱跳,而不是完全黑屏。调试时先别怀疑芯片坏了,先检查采样沿配置。
第二个错误是DE极性。虽然HDMI内部用的是无DE的固定帧结构,但发送器需要依赖输入DE来切分有效行和消隐区。如果DE极性配置反了,芯片会把消隐当作有效像素,画面表现多为上下偏移或者抖动。
第三个错误是数据映射。24位RGB输入有对应的引脚顺序,若配置成36位输入模式但硬件只接了24位总线,会导致颜色分量错位,常见现象是“红色和蓝色互换”或者画面发绿发紫。这类问题软件查不出大错,但一看颜色就明白多半是字节排序或位宽配错。
2.3 TMDS差分对布线:等长比“多少MHz”更重要
HDMI输出的四对差分线(时钟加上三对数据)是整块PCB上对信号完整性最敏感的部分。这四对线的PCB走线要求很直白:单对内部等长,三对之间尽量等长,整体包地,参考完整的GND平面。
等长要求很多人喜欢死记数字,我更建议用时间裕量来理解。1080p60的TMDS位周期大约3.7ns,如果一对差分线内部长度差过大,信号在到达接收器时的歪斜就会吃掉这个时间裕量。经验上同一对差分内部长度差控制在5mil以内,四对之间的长度差控制在100mil内,是比较稳妥的约定。实在做不到时,宁可牺牲部分输出余量也要保证单对内部等长,因为单对歪斜会直接造成“雪花噪点”。
差分阻抗为100Ω,这需要在叠层设计时计算线宽线距。一般四层板内层布线时,5/5mil的差分对可以接近100Ω,具体由板材和层间距决定。量产前最好让PCB厂配合阻抗测试做一下TDR验证,别只靠仿真。
此外,TMDS信号线上不要随便串电阻。有的工程师习惯在高速线路上加22Ω串阻来抑制反射,这在HDMI RX端不一定合适,容易导致连接器处的信号振幅不足。如果非要加,位置和阻值要以实际眼图为准,不能照搬低速经验。
最后,HDMI连接器附近必须加ESD保护器件。HDMI允许热插拔,拔线瞬间的静电放电非常猛,不加ESD的板子轻则偶尔掉显示,重则直接打坏芯片的TMDS端。选择ESD保护管时要看器件的结电容,尽量低于0.5pF,避免额外电容破坏差分阻抗。常见方案用USB/HDMI专用TVS阵列,比如TI、Nexperia、OnSemi几条产品线都有对应料件。
2.4 I2C、DDC、HPD这些低速接口也别轻视
配置ADV7513全靠一个I2C总线,正常运行时主控还要通过它读取EDID和处理HPD事件。I2C的上拉电阻要按总线电容估算,通常2.2kΩ到4.7kΩ,总线速度建议跑100kHz或400kHz。别为了“看起来稳定”把上拉电阻压到几百欧姆,那会让边沿变得过于生硬,反而影响时序。
HPD引脚需要连接到主控的一个GPIO,最好是支持中断输入的GPIO。热插拔显示器时HPD会有一个上升沿和下降沿,主控需要捕获这个沿来触发EDID重读或分辨率重协商。HPD信号电平一般由显示器侧的5V上拉驱动,主控侧要确认GPIO耐受电压足够,必要时用分压电阻或电平转换适配。
DDC总线实际上是I2C总线,只不过在HDMI规范里叫DDC,EDID存储器挂在DDC通道上。ADV7513作为HDMI源端,需要提供DDC的5V电平上拉源,通常由HDMI源端设备提供5V到HDMI连接器。很多人在这个细节上栽过跟头:显示器读不到EDID,一量才发现HDMI座上的5V根本没给上。ADV7513本身工作电压不需要5V,但HDMI连接器的5V输出还是要按规范做。
CEC功能如果你用不到,可以直接不连接,但最好留个测试点。CEC是单线总线,空闲时上拉电平,参与通讯时以开漏方式拉低。有的参考设计连了电阻,有的直接悬空,项目里只要不接错,影响不大。
3. 软件配置与Linux驱动落地
3.1 初始化顺序比寄存器值本身更重要
ADV7513的寄存器配置不是“写一轮就行”的固定步骤,而是要按时序推进。我的经验里,可靠的启动流程可以概括为四阶段:
- 上电后等待电源和像素时钟稳定,建议至少等待20ms,然后再通过I2C访问芯片;
- 写入初始化配置,包括视频输入格式、输入引脚模式、颜色空间转换、各类InfoFrame使能;
- 配置音频相关寄存器,包括I2S使能、声道数、采样率、位宽;
- 在所有输入准备好之后,写发送器“开机”寄存器,让TMDS输出真正使能。
这个顺序不能乱。有人一上电就先写TMDS使能,结果芯片在输入格式还是默认状态下就尝试发送,显示器端会识别到一个不稳定的信号,出现闪屏或直接不识别。还有人在没有检测到HPD有效时就初始化,等你插上显示器后,芯片端发现HPD电平已经建立了,但内部DDC状态机还没准备好,就会漏掉一次EDID读取事件。
在Linux驱动里,这些顺序大多数由内核的adv7511驱动处理好了,你不需要手动干预。但如果你是在裸机或RTOS环境下做,我建议把初始化脚本整理成一个“寄存器表”,按阶段分组执行,并保持在每个阶段后读回几个关键状态寄存器确认配置生效,再进入下一阶段。
3.2 设备树与DRM bridge驱动
ADV7513在主流Linux内核里由drivers/gpu/drm/bridge/adv7511驱动支持。虽然Kconfig里写的名字是ADV7511,但驱动同时兼容ADV7512、ADV7513等同一家族芯片。设备树里最常见的形式是把它挂在SoC的I2C控制器下,主I2C地址用的是7位格式0x39。
下面是一段简化但足够参考的设备树片段:
&i2c2 { status = "okay"; adv7513: hdmi@39 { compatible = "adi,adv7513"; reg = <0x39>; hpd-gpios = <&gpio1 15 GPIO_ACTIVE_HIGH>; avdd-supply = <&vcc3v3>; dvdd-supply = <&vcc3v3>; #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; adv7513_in: endpoint { remote-endpoint = <&display_controller_out>; }; }; port@1 { reg = <1>; adv7513_out: endpoint { }; }; }; };这段的port@0表示输入口,连接SoC显示控制器的输出端点;port@1表示HDMI输出口,通常不需要连接,由bridge驱动自己注册为HDMI connector。实际平台上的端点名称和remote-endpoint需要匹配你自己SoC的显示控制器设备树定义,所以这段只作为结构示例。
如果你的SoC没有标准DRM/display framework,而是自己写裸机驱动,也可以直接通过I2C命令来读EDID和写寄存器,但要自己处理HPD轮询和显卡状态机,代码量会大一些。
3.3 音频子系统的接入
ADV7513支持I2S和SPDIF两种数字音频输入。SPDIF最简单,只要给一条SPDIF信号线,把它和主控的SPDIF发送器对齐就行。I2S则要看你的音频源是I2S主控制器还是HDMI侧自己为主模式,两者在主从方向上的设置完全不同。
我在一个项目里遇到过音频死活不出声,最后发现是I2S格式不匹配。ADV7513的I2S支持常见的飞利浦标准I2S格式,同时也可以配置左对齐/右对齐格式,你要确保主控侧输出的音频帧格式跟芯片寄存器里的取值一致。另一个常见原因是MCLK没有提供给芯片,很多音频系统里I2S不一定带MCLK,但HDMI发送器内部音频时钟恢复往往需要MCLK作为参考,不给或者给错频率倍数,就表现为开机后前几秒有噪声,随后无声。
Linux下接入音频主要看你的SoC侧如何把Audio Codec关联到这个HDMI bridge上。ADV7513驱动在音频侧会注册一个ALSA codec,你可以把I2S控制器当作CPU DAI,把HDMI侧的音频接口当作CODEC DAI,两者在设备树里用sound节点连接。具体属性每个平台差异较大,这里不展开,但原则是确保I2S的bit clock和frame clock极性一致,采样率能匹配显示器端的EDID音频能力。
3.4 一套可以“抄作业”的裸机初始化思路
裸机环境下我没法给你一份通吃所有版本数据手册的寄存器表,因为不同批次芯片和不同PCB设计可能要求不同的输入偏置或时钟延迟设置。但你可以按照下面的结构来组织代码:
struct regval { u8 reg; u8 val; }; static const struct regval adv7513_init_table[] = { /* 第一阶段:基础配置 */ {0x41, 0x10}, /* 示例:电源控制,实际值以手册为准 */ {0x16, 0x20}, /* 示例:输入格式配置 */ ... /* 第二阶段:音视频使能 */ ... };写这段代码的要点是:每一个大块配置之前先写“复位/软复位”寄存器,给芯片一个干净的起点;配置完后统一读回校验;最后才写TMDS使能寄存器。如果手头有ADI官方的寄存器配置工具或者原厂参考代码,一定以它为准,网上流传的各种“精华配置表”往往有版本差异,不可盲抄。
4. 调试实录:我遇到过的翻车现场
4.1 黑屏无信号,查完电源查寄存器
“完全黑屏,显示器提示无信号”是新手遇到最多的现象,也是最不能急的现象。我按下面的顺序排查,方向基本不会错:
- 先确认HDMI连接器上的5V是否正常;
- 量HPD电平。用显示器连上后HPD应该被拉高到2.4V以上;
- 确认I2C总线上能枚举到ADV7513,7位地址0x39;
- 确认主控已经在给ADV7513送像素时钟PCLK。用示波器看PCLK引脚有没有波形,这一步很多人会漏掉,因为软件配置都成功了,但SoC的时钟树没开;
- 读回芯片初始化是否完成,重点看电源状态和TMDS使能状态位;
- 如果以上都正常,再用HDMI分析仪或一个确认好的显示器交叉复测。
这里我想强调HPD的优先级:HDMI源端在HPD没有有效之前,去读EDID和配置输出链路都可能是徒劳的。很多系统里的做法是HPD上升沿触发中断,中断里重读EDID并重新设置分辨率。如果你调试时发现HPD始终为低,先查连接器座的焊接和ESD器件是否短路。
4.2 花屏、偏色、画面偏移
这类问题基本锁定在像素接口侧。
花屏且画面像被撕开,最常见是PCLK采样沿不对。你可以尝试把输入时钟沿配置翻转一位,看看是否恢复正常。这类改动需要拿示波器对比PCLK和数据线的建立/保持关系,单靠盲试也能试出来,但效率低。
偏色更多是色彩空间或位宽问题。我遇到过一次画面整体发绿,查到最后是寄存器里把输入误配成了YCbCr 4:2:2,而硬件输入其实是RGB。另一次红蓝完全互换,也是字节映射寄存器配错了。
画面偏移则优先看DE和HSYNC/VSYNC极性。如果图像整体向右移几列或者向下移几行,说明DE的时序边界没有对齐有效像素,调整寄存器里的同步极性即可。
4.3 音频无声或者有节奏爆音
音频问题排查难度比视频高,因为它更依赖寄存器细节。我建议先用固定频率的正弦波测试音频源,比如1kHz,这样通过示波器或者抓取HDMI输出音频流可以快速判断有没有信号进来。
然后确认I2S的MCLK频率。很多HDMI发送器对MCLK有明确的比例要求,常见的是128fs、256fs、512fs。如果你的主控音频输出的MCLK是256fs,但寄存器里默认写的是512fs,那么DSD格式可能还能勉强出声,但PCM会有可闻噪声甚至完全静音。
另一个容易被忽略的是I2S帧同步信号的左右声道极性。左对齐与右对齐搞反,会导致左右声道互换,或者只有一侧有声音。高级一点的现象是“爆音”,通常会跟I2S位时钟不稳定、地线噪声或者MCLK抖动有关,排查方向变成功率管脚的退耦和音频时钟源。
4.4 间歇性掉显示和闪烁
这类现象最头疼,因为它不是固定复现,常常是“插上去一段时间后突然黑一下,过几秒又好了”。
优先怀疑HPD信号抖动。有的显示器在启动过程中HPD不会一直保持高电平,而是会短暂拉低再拉高,如果主控对HPD下降沿处理得不好,就会误判为拔出,触发整条链路关闭。检查HPD线上的滤波电容和ESD器件,过大的电容会导致沿变缓,反而制造误触发;过小则抗干扰差。
其次是TMDS信号完整性。间歇性闪屏有很大概率是阻抗不连续,比如连接器处过孔stub太长、差分对参考平面被切断。这时候眼图测试最有效,能直接看到眼高和眼宽余量是否不足。如果没条件用高端示波器,可以考虑把HDMI线材换成短线试试,或者降一档分辨率跑一段时间看稳定性。
最后是热插拔的“带电操作”问题。HDMI连接器在插拔时,5V引脚先接触,然后是TMDS引脚。如果ESD保护没做好,一次插拔产生的静电可能把TMDS驱动器内部打伤,之后出现随机黑屏。这种故障很难在台式机上复现,却会在整机上频繁出现,所以硬件设计阶段一定要把ESD当正式需求来看待。
5. 几个实操心得与反向建议
5.1 HDCP能关就关
ADV7513自带HDCP引擎,但实际很多板卡项目的视频源是自研或授权明确的内容,显示器端也没有强制要求HDCP加密。这时候把HDCP通道关闭,能避开大量兼容性问题,比如某些投影仪强制握手失败就会黑屏,但关闭HDCP后反而稳定。除非你的产品明确要播出受保护内容,否则初始化时禁用HDCP,省心非常多。
5.2 调试工具准备齐,少走两个月弯路
我的调试板旁边常备三样东西:一个支持HDMI输入的基本示波器,一个USB I2C调试器,一个确认无故障的1080p显示器。
示波器主要看PCLK、HPD和I2C波形,并不需要多高的带宽。USB I2C调试器用来在系统还没起来时直接与ADV7513对话,读EDID、写寄存器、验证硬件链路非常方便。有时Linux驱动还没跑起来,I2C调试器就是我判断“是芯片坏了还是配置问题”的最直接工具。
等到整机阶段,如果能把显示器的EDID在已知确认好的一台设备上读出来跟本机读到的对比,就能快速判断DDC线路是否有问题。Linux下可以用i2c-tools直接读取HDMI显示器EDID:
# 假设ADV7513所在I2C总线是2,EDID挂在DDC地址0x50 i2cdump -y 2 0x50读出的EDID能直接看到显示器名称、分辨率范围和音频能力,省去很多猜测。
5.3 什么时候千万别选ADV7513
如果项目明确要求4K@60Hz输出、HDR10、HDMI 2.0协议,甚至更高刷新率,ADV7513完全不合适。它的168MHz像素时钟决定了它就是为1080p时代设计的,硬拉高分辨率只会得到满屏雪花或者直接无声无画。另外,如果你的主控本身有HDMI接口,也不用加这颗芯片,直接走主控内置发送器更省成本。ADV7513的价值是给“没有HDMI接口但有RGB/YCbCr数字接口”的SoC提供一个可靠的HDMI出口。
如果主控已经集成了LVDS还是MIPI DSI输出,想通过一颗转换芯片转到HDMI,也未必非得选ADV7513。市面上有更集成化的方案,比如直接把DSI信号桥接到HDMI的转换芯片,外围更小巧。需要根据前端总线类型和需求做整体选型,不能只看“能出HDMI”这一点就下手。
5.4 原理图阶段多留点东西
最后分享一个很实际的小建议:原理图阶段给ADV7513的I2C引脚、HPD引脚、CEC引脚都预留测试点,并且用引脚编号标注清楚。调试的时候你会发现这三个地方是排查问题的黄金观测点。I2C测试点用来挂逻辑分析仪,查初始化时序;HPD测试点用来量热插拔电平;CEC测试点虽然平时用不到,但遇到一些奇怪的不唤醒现象,它能帮你快速判断是不是CEC线污染干扰了系统电源。
另外,把ADV7513的“复位引脚”务必引出到调试座或飞线点。这颗芯片没有复杂的上电复位可靠保证,手动复位是让它从异常状态恢复的最快手段。加上一颗下拉电阻或RC复位电路,能很大程度避免复位脚悬空时芯片状态不确定的问题。
这颗芯片我用了两三年,说不上十全十美,但整体是让人放心的。它的配置细节偏多,门槛主要在软件和维护上,一旦在项目里养成“先电源、再I2C、再HPD、最后配置输出”的调试习惯,它反而比那些更现代、更集成的芯片更好把控。这个经验对同样在搞音视频硬件的人来说,应该能省下不少时间。