最近帮客户调了一轮慷智AIM951/958的SerDes链路从一片黑到画面稳定上屏前后折腾了差不多一周。这中间踩了不少坑也攒下了一套可以复用的话术和流程。今天把从寄存器配置到屏幕点亮的全流程拆开来讲准备了一份可以直接抄作业的调试思路。不管你用的是哪家主控只要走的是“摄像头/视频源 → 串行器 → 同轴线 → 解串器 → SoC → 屏幕”这条路这套方法论基本都能用得上。1. 项目背景与链路思路拆解为什么SerDes是屏幕点亮的关键一环1.1 SerDes是什么AIM951和AIM958在链路里各干什么活先解释一下名词。SerDes全称是Serializer/Deserializer也就是串行器/解串器。它的核心工作就两件事发送端把并行的MIPI信号转成一对高速串行差分信号经过同轴线或者双绞线长距离传输接收端再把串行信号恢复成MIPI CSI-2接口。对车载项目来说这个转换的意义非常大因为MIPI CSI-2在PCB上走线一般只能撑到十几厘米超过这个距离信号质量就掉了更别说摄像头装在车门、后视镜、车顶这些离主板好几米远的地方。慷智AIM951和AIM958就是一对车规级SerDes芯片。AIM951是串行器一般放在远端视频源那一侧负责把摄像头的MIPI CSI-2数据打包成高速串行信号AIM958是解串器放在主控板这一侧负责把线缆上收到的串行信号恢复成MIPI CSI-2再交给SoC的CSI控制器。打个比方MIPI信号就像市内跑的小货车灵活但跑不远SerDes串行链路就像长途卡车专为高架和高速设计运力大、线路长。车上需要从远端把视频信号拉到中控屏幕的场景用AIM951/958就是这个思路。1.2 一条完整的视频链路从镜头到屏幕很多朋友一拿到这套芯片就急着写寄存器我觉得先画清楚自己的数据流更重要。典型链路是这样的远端摄像头模组输出MIPI CSI-2接到AIM951的并行侧AIM951将数据串行化之后经过同轴线缆传到主控板上的AIM958AIM958解串后恢复出MIPI CSI-2接到SoC的CSI接口SoC拿到图像数据后经过显示控制器送到LCD屏幕。这个链路里“屏幕点亮”的本质是完成两件事第一远端视频源的数据能完整地到达SoC第二SoC端能正确解析并显示这些数据。SerDes寄存器配置解决的只是第一件事但很多时候第二件事的配置错误也会表现为“屏幕是黑的”这就是为什么调试时要分清楚哪一段出了问题。我这边用过的平台恰好是T113i这类车机SoC。T113i有自己的MIPI CSI接口和MIPI DSI接口CSI用来收SerDes解串后的视频DSI用来驱动屏幕两者之间靠SoC内部的显示通路衔接。严格来说T113i点亮屏幕需要把“CSI摄像头输入到显示回显”这条软件通路打通而不只是让屏幕背光亮起来。理解这一点就不会在调试时把背光问题和数据链路问题混在一起。2. 调试前的装备与硬件准备随手就能复用的检查清单2.1 软硬件工具清单SerDes调试和普通外设调试不太一样涉及两个物理端点和一条传输线排查问题必须同时盯住多个点。所以准备工具时不要心疼前期装备越齐全后面省的时间越多。硬件AIM951串行器模组、AIM958解串器板卡、摄像头模组、同轴线或双绞线线缆、开发板T113i或其他带MIPI CSI的SoC板、稳压电源、示波器至少500MHz带宽建议1GHz以上看信号质量。软件i2c-tools工具包、逻辑分析仪上位机、I2C读写脚本Python或Shell都行、芯片寄存器手册AIM951和AIM958各一份、主控SoC的参考手册和驱动源码。文档拿到样片时一定要找原厂FAE要对应版本的寄存器手册。SerDes芯片版本更新很快网上流传的零散配置不一定匹配你手里的芯片批次这个坑我踩过后面有一节专门讲。工具这块很多人会忽略逻辑分析仪总觉得示波器就够了。实际上I2C隧道是否打通、远端寄存器有没有写进去逻辑分析仪能直接抓波形判断比示波器看电压毛刺更直观。有条件的话两个都上没条件至少保证I2C调试工具到位。2.2 上电与硬件连接检查先解决物理层先看供电。AIM951这一侧如果用了Power over Coax同轴供电那远端模组不需要单独拉电源线但主控板这边的AIM958供电能力要够否则线缆一长电压跌落摄像头发热后更容易出问题。如果是独立供电也要确认上下电时序远端摄像头模组和AIM951的供电顺序不稳定会导致芯片锁死或者寄存器初始值错乱。再看线缆连接。AIM951和AIM958之间是同轴线还是STP双绞线取决于项目设计。不管哪种连接器必须锁紧线缆屏蔽层接地要可靠。很多“图像偶尔花屏”的case查到最后是Fakra头松了或者屏蔽层压线没压好。MIPI侧的方向一定要确认清楚。AIM951的输入端是MIPI CSI-2AIM958的输出端也是MIPI CSI-2中间的同轴串行链路是两个专用引脚。这个看起来不会错但我见过有人把CSI输入输出接反导致花了整整一天查寄存器。最后一个容易忽略的是时钟。MIPI CSI-2需要参考时钟SoC端的CSI控制器有没有正确输出或者接收时钟直接决定链路能不能稳定。先确认时钟频率和极性再谈寄存器配置。3. 寄存器配置全流程从读懂手册到命中关键位3.1 先弄懂AIM951/958的I2C访问机制AIM958在主控板上直接挂在SoC的I2C总线上这个访问比较简单。AIM951在远端SoC没法直接访问它必须通过AIM958的I2C隧道功能进行转发。理解这一点非常重要我见过不少人拿I2C工具直接去读AIM951的寄存器地址结果总线上根本没有这个设备自然读不到。正确的流程是先访问AIM958配置好隧道转发让AIM958把对指定地址的读写请求通过SerDes链路转发给AIM951AIM951收到后再响应。这个过程对外部I2C主控是透明的但对调试人员来说必须记得先使能转发。具体操作上一般是通过I2C写AIM958某个寄存器使能地址映射然后在同一总线上用AIM951的从设备地址直接读写远端寄存器。AIM951和AIM958的默认I2C地址可能相同也可能不同这取决于芯片外部引脚配置和寄存器设置。如果地址冲突了需要通过外部引脚或者初始配置错开。调试时我习惯先用i2cdetect扫描一下挂在总线上的设备确认能读到AIM958和摄像头模组再往下走。总线上一片空白的话先查硬件连接和供电别急着写配置。3.2 初始化顺序先视频再控制还是先控制再视频AIM951/958的寄存器很多但初始化顺序有讲究不是随便照着手册挑几个位改一改就行。我总结的推荐顺序如下复位AIM958和AIM951确保芯片处于已知状态。配置AIM958侧的PLL和I2C隧道相关寄存器。配置AIM958的输出端MIPI CSI-2参数包括lane数、时钟极性、连续时钟模式。通过I2C隧道配置AIM951的输入侧MIPI CSI-2参数和PLL。打开视频流使能位让串行链路开始传输数据。检查LOCK状态寄存器确认解串器已经锁定远端信号。启动SoC端摄像头应用或回显通路屏幕上出现图像。为什么要按这个顺序因为SerDes链路是从解串器到串行器逐级建立连接的过程。AIM958需要先知道对端的时序和速率参数才能正确锁定信号。如果先把AIM951开了却发现AIM958还没配好链路就会出现连续失锁进一步导致I2C隧道也不稳定后面的操作都要重来。另外I2C隧道是否稳定和视频链路是否锁定有关。链路没锁定时远端I2C是没法正常访问的所以先确保链路物理层建立再做上层寄存器配置。3.3 常见寄存器功能划分与配置示例AIM951和AIM958的寄存器表按功能模块组织不同批次芯片地址可能略有调整所以我这里用功能宏名来表示实际开发时替换成手册里的具体地址即可。芯片ID/版本寄存器用于确认I2C通信正常一般只读。复位控制寄存器软件复位配置前先复位一次。PLL配置寄存器设定串行链路的传输速率需要和远端匹配。CSI-2 lane数和数据速率寄存器设定视频接口的模式主控侧必须一致。视频流使能寄存器打开/关闭视频数据传输。GPIO和中断寄存器用于输出LOCK状态或者接管外部信号。转发/隧道配置寄存器AIM958上用使能远端寄存器访问。这里给一个伪代码级别的初始化脚本方向对了细节按手册替换#!/bin/bash # AIM958 local side i2cset -y 2 0x40 0x01 0x01 # software reset AIM958 sleep 0.1 i2cset -y 2 0x40 0x10 0x00 # disable video stream before config i2cset -y 2 0x40 0x20 0x03 # MIPI CSI-2: 4 lanes, continuous clock i2cset -y 2 0x40 0x21 0x64 # set data rate / PLL parameter i2cset -y 2 0x40 0x30 0x01 # enable I2C tunnel / address mapping # Access AIM951 through AIM958 tunnel i2cset -y 2 0x44 0x01 0x01 # software reset AIM951 sleep 0.2 i2cset -y 2 0x44 0x10 0x00 # disable video stream i2cset -y 2 0x44 0x20 0x03 # MIPI CSI-2 input: 4 lanes i2cset -y 2 0x44 0x21 0x64 # set data rate / PLL parameter # Enable video stream i2cset -y 2 0x40 0x10 0x01 # enable AIM958 video stream i2cset -y 2 0x44 0x10 0x01 # enable AIM951 video stream再次强调0x40和0x44只是示意地址实际要以你的硬件原理图和芯片手册为准。但配置思路是一致的先复位再关流然后配PLL和CSI参数开隧道最后使能视频流。3.4 摄像头侧的I2C总线桥接很多应用里AIM951远端挂的不只是摄像头模组摄像头的sensor寄存器也要通过I2C配置比如曝光、增益、分辨率等。这时候AIM958要把主控的I2C请求转发给AIM951再由AIM951挂载的I2C总线访问sensor。这个“远程sensor寄存器读写”是调试中最容易困惑的地方。你需要配置AIM958的转发目标地址让主控发出的sensor地址请求走到远端总线。此外如果远端sensor的I2C地址和主控板上某个设备地址冲突还需要通过地址重映射机制错开。我自己的习惯是在打通AIM951/958链路后先读远端sensor的chip ID如果能读到说明I2C隧道和远端总线都正常再往前推进视频配置。这样把问题拆成两段排查范围会小很多。如果sensor ID读不到优先查隧道配置而不是反复折腾视频寄存器。4. 屏幕点亮全流程实操一次典型的调试过程4.1 第一步确认主控CSI控制器配置以T113i平台为例T113i的CSI控制器需要配置MIPI CSI-2的lane数、时钟极性和虚拟通道。AIM958输出的lane数必须和SoC端CSI控制器的lane数一致否则SoC收不到完整数据。不少项目的板子在硬件连接时只走了2 lane但软件里配了4 lane结果就是屏幕花屏或者直接黑屏。这个在设备树或者驱动初始化里一般都有对应字段先确认一致再上电。还需要确认CSI控制器的输入数据速率。AIM958输出端的数据速率是根据远端串行链路速率和lane数计算出来的SoC端也要按这个速率配置才能正常接收。实际操作中我会先把SoC的CSI配置成和AIM958完全一致的参数然后才去操作SerDes芯片。T113i点亮屏幕还有一层就是SoC内部的显示通路。CSI收到的是摄像头或视频源的图像要显示到屏幕上需要配置ISPOST、显示控制器等模块让数据从CSI一路走到DSI接口。这一步调的就是SoC内部的软件通路和SerDes芯片本身关系不大但很多人会在这里卡住误以为是SerDes没配好。4.2 第二步点亮AIM958并观察LOCK状态上电后先做最小化确认。用i2cdetect扫描SoC的I2C总线找到AIM958的地址然后读芯片ID寄存器确认基本通信正常。再读PLL和LOCK状态寄存器看看芯片是否进入工作状态。这里说的LOCK状态是整个调试过程中的关键指标。AIM958在锁定远端AIM951发出的串行信号之后LOCK引脚或LOCK状态位才会置位。如果LOCK一直为0说明物理链路或者参数配置有问题要么线缆没接好要么PLL参数配错要么AIM951那侧根本没发数据。我调试时会在程序里循环读LOCK状态同时用示波器看AIM958的MIPI输出引脚。如果LOCK跳成1但CSI输出还是没有波形那问题就在AIM958的CSI输出配置上如果LOCK根本没置位就先回到物理层和串行链路配置。4.3 第三步配置AIM951并打通I2C隧道AIM958起来之后重点转到AIM951。首先要确认I2C隧道已经打通方法很简单通过AIM958的隧道功能去读AIM951的芯片ID能读到就说明链路两端能通信了这时候再配置AIM951的CSI输入参数和PLL。注意配置AIM951时视频流使能位先不要打开等所有参数都设好后再开。打开视频流之后链路会开始传输连续的视频数据如果这时候再去改PLL或者lane数配置可能触发芯片重新锁定出现几秒钟的黑屏或者花屏。远端摄像头的sensor寄存器也可以在这个阶段一并验证。通过隧道读写sensor的chip ID确认能访问到远端总线设备。如果sensor ID读不到但AIM951能读到问题大概率在AIM951到sensor的I2C总线侧查一下远端上拉电阻和供电。4.4 第四步图像上屏与常见现象判断以上都正常后启动SoC端软件通路让屏幕显示远端视频源的图像。第一次点亮时不要期望画面直接完美大概率会碰到以下几种情况全黑但显示通路有出来比如背光亮、UI正常只是没有视频画面。花屏满屏噪点或者条纹。图像有但不稳定偶尔黑屏闪断。色彩不对偏色或者颜色翻转。每一种情况的排查方向是不一样的。全黑优先查AIM958的CSI输出和SoC的CSI接收配置花屏优先查lane数、数据速率不匹配不稳定闪断优先查LOCK状态和物理层信号质量偏色优先查MIPI的数据位序和SoC端pixel format配置。这时候把手里的示波器用起来。用示波器量AIM958输出的MIPI data lane和clock lane看有没有合理的差分波形。数据lane是高频翻转的clock lane如果是连续时钟模式会有稳定的时钟波形如果是非连续时钟模式只在传输active数据时才有时钟。如果数据lane完全没波形说明AIM958没输出数据如果有波形但SoC收不到图像问题就在SoC端软件通路。5. 常见问题与排查技巧实录5.1 I2C访问不通怎么办这是第一步就会遇到的问题。I2C总线上扫描不到AIM958或者能扫到958但读不到951。排查顺序现象可能原因排查方法扫描不到958供电、地址配置、I2C上拉量电压、查硬件地址引脚、确认总线上拉电阻能扫到958但读不到951I2C隧道未使能、链路未锁定读958隧道状态寄存器、确认视频链路LOCK读到951但读不到sensor远端总线问题、地址映射确认sensor地址、查远端上拉和供电我实际操作中发现最容易被忽视的是I2C总线上拉电阻。SerDes芯片配置时需要较快的I2C速率上拉电阻太大导致波形上升沿太缓就会出现时而能读时而不能读的现象。有条件的话用逻辑分析仪抓一下波形直接看地址帧有没有ACK响应。5.2 屏幕黑屏但链路已经锁定链路LOCK已经置位I2C通信也正常但屏幕就是没有画面。这种case八成不在SerDes这边而在SoC端。先确认SoC有没有收到MIPI数据。可以在CSI驱动里打印中断状态寄存器看有没有FIFO overrun或者帧同步错误。如果中断状态全0说明SoC根本没收到数据那就要回头查CSI配置和AIM958输出参数。还要注意AIM958视频流使能位和SoC CSI启动顺序。有些板卡要求先启动SoC CSI接收再使能SerDes视频流有些则相反。这个差异来源于芯片具体实现一般手册里会写。如果顺序反了某些芯片会在建立链路的瞬间丢几个关键同步信号导致一直等不到帧头。5.3 图像花屏、闪断物理层要重点查花屏和闪断是SerDes调试里最磨人的问题。很多时候寄存器配置看起来全对但图像就是带着雪花或横条纹。这类问题我开始都会先看一眼物理层信号质量。和FPGA开发中接触的GT SerDes一样AIM951/958的高速链路也存在预加重和均衡参数调整的余地。如果误码率高可以尝试调整解串器的均衡档位或串行器的摆幅设置。这个参数不是越大越好过大反而引入过冲需要根据线缆长度实测。线缆长度也是个变量。拿着标称能传输15米的设计结果现场布线绕了远路实际链路长度可能超过20米这时需要适当加大对端均衡或者降低传输速率。反过来如果线缆很短还出现高频自激也可能需要减小摆幅。如果花屏表现为整帧随机噪点大概率是链路误码造成的。可以先故意把视频流关掉测试I2C隧道是否稳定再用大量循环读写远端寄存器和预期值比较确认误码率。隧道稳定但视频花屏说明误码集中在高速差分信号上调整物理层参数比改寄存器更有效。5.4 LOCK状态偶发丢失热启动后掉链子项目做完之后偶发LOCK丢失超过一半的根因在电源和地。摄像头模组在夜间开红外灯、补光灯时电流大如果供电走线太长或者阻抗不够压降会让SerDes芯片进入欠压保护。还有一个经常踩的坑是SoC和SerDes的上电时序。T113i这类主控的I2C、GPIO在启动过程中有短暂高阻态如果此时访问SerDes芯片可能导致芯片进入异常状态。处理办法是确保SoC完成启动后再初始化SerDes或者在硬件上加上电复位电路。软件层面我建议把LOCK状态做成周期性检测发现失锁后自动重新初始化链路而不是傻等。值班工程师接到投诉的时候可能只看得到“晚上偶尔黑一下”没有自动恢复机制就要派人去现场复现太痛苦。6. 一点个人经验与建议这套芯片调试下来我最大的体会是想清楚再动手。拿到一个SerDes项目第一件事不是找FAE要一堆初始化代码而是先把数据流图画出来把主控CSI、AIM958、AIM951、远端sensor四个节点之间的距离和接口关系搞清楚。任何一个节点的配置错配都会表现为屏幕上的现象问题而真正的故障点可能在完全意想不到的地方。我现在的习惯是所有寄存器配置全部做成脚本并且添加注释说明每个寄存器的功能不用一次性把所有功能都打开。视频流、I2C隧道、GPIO这些功能分开配每配上一步就用i2cget读回确认这样出了问题能快速定位在哪个功能模块。另外如果项目进度允许尽量在电路板设计阶段就引出几组关键信号测试点AIM958输出的MIPI差分对、LOCK状态引脚、I2C信号、同轴线输入端有了这些测试点后面量产阶段出了实际问题才能快速排查。没有测试点调试时只能拿镊子戳芯片引脚风险大效率低。最后再分享一个小技巧一旦屏幕点亮后先别急着优化把当前这套寄存器配置完整保存下来包括初始化和异常恢复的逻辑。后续如果要换线缆长度或者换sensor都是在这套稳定版本上做增量修改而不是推翻重来。SerDes调试的坑踩一次就够了把经验沉淀成配置模板下次接新项目能省一半时间。