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

文章详情

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

ADRV902x评估板实战:ARM bin生成与JESD204C配置详解

ADRV902x评估板实战:ARM bin生成与JESD204C配置详解 手上这块ADRV9026评估板ADRV902x系列在实验室趴了几天终于把JESD204C链路真实跑通。整个过程里最让人困惑的不是射频指标反而是看上去最简单的两件事怎么用TES GUI生成ARM bin文件怎么生成一份靠谱的JESD204C配置文件。网上资料不少但多数在讲“点哪个按钮”很少有人讲清楚“为什么要这样生成、生成的文件到底被谁用了、和FPGA侧怎么对齐”。这篇文章从我实际调试的视角把ADRV902x评估中这两块拆开讲一遍涵盖硬件连接、TES配置、ARM固件生成、JESD204C参数计算以及我踩过的几个坑。适合正在做射频收发链路、FPGA高速接口或者刚拿到ADRV902x评估板的工程师参考。1. ADRV902x评估方案整体拆解1.1 ADRV902x到底是什么样的芯片ADRV902x系列是ADI面向基站和无线电应用推出的宽带收发器典型代表有ADRV9025、ADRV9026和ADRV9027覆盖大概75 MHz到6 GHz频段单芯片集成4路发射、4路接收、ORX观测通道以及DPD、CFR这些算法需要的路径。之所以在评估阶段要花大力气处理ARM bin和JESD204C配置是因为这颗芯片不是简单“寄存器一配就能出数据”的器件它内部有一颗ARM处理器负责上电初始化、校准、DPD系数计算和状态管理。也就是说ADRV902x是典型的“软件定义射频”芯片模拟前端、数字上下变频、滤波、增益控制都集成在内部而外部主控通过SPI访问寄存器和ARM处理器配合工作。这个架构带来的一个直接结果就是——你绕不开ARM固件绕不开一串精心组织过的初始化参数。Hmm看到这里有些朋友可能会问既然是评估板直接跑ADI官方例程不是就完了吗我的回答是官方例程能让你“看灯亮”但如果你的应用需要改采样率、改JESD204C lane数、改射频频率或者要把这套东西搬到自己的FPGA工程里就必须理解TES生成的ARM bin和profile配置是怎么流动的。否则出了问题只能干瞪眼。1.2 评估系统的组成不只是“板子PC”ADRV902x评估系统一般由三部分构成ADRV902x评估板、FPGA/数据采集板、以及PC上运行的TES软件。评估板通过FMC或HPC接口与FPGA相连FPGA主要承担JESD204C链路的物理层和协议层处理把ADRV902x送出的高速串行数据转换成并行数据再交给上层做信号处理。这里有个很多人容易忽略的点ADRV902x和FPGA之间的链路是JESD204C而不是普通并行总线。JESD204C一条lane的速率动辄上Gbps甚至十几Gbps所以FPGA侧的JESD204C IP核配置必须与ADRV902x侧完全一致否则两端各干各的链路永远锁不上。这也是为什么TES生成的配置文件如此重要——它不是给人看的是给两台设备“对齐语言”用的。PC上的TES扮演三个角色第一通过USB转SPI接口直接读写ADRV902x寄存器让你看到内部状态第二提供一个图形化界面把复杂的PLL分频、JESD204C参数映射、DPD开关等配置项简化成下拉菜单第三生成最终的ARM bin和配置数据供你在正式系统里加载。一句话总结TES既是你调试时的“仪表盘”也是你量产配置的“源头”。1.3 为什么必须先想清楚“bin”和“配置”的关系ARM bin和配置文件是两样东西但很多人喜欢把它们混在一起说。ARM bin是ARM处理器上运行的可执行镜像里面是实现上电校准、处理API请求、执行DPD/CFR算法的代码配置文件则是一组描述“器件工作在什么状态”的参数比如本振频率、增益、采样率、JESD204C的LMFS、SYSREF设置等等。打个比方ARM bin是“操作系统”配置文件是“应用程序的参数”。操作系统负责管理硬件资源而参数决定系统跑多快、跑什么应用。所以实际加载顺序一定是先让ARM核跑起来加载bin再通过API逐项下发配置。如果你只改了配置文件却没更新ARM bin或者ARM bin版本太老不认识新配置字段就会出现各种奇怪的初始化错误。这个我在后面的排查章节会详细展开。2. 环境搭建与连接检查2.1 硬件准备清单ADRV902x评估的环境准备其实比想象中琐碎。我在这块踩过最大的坑就是“少根线/选错时钟”导致的误判。建议按下面的清单逐项确认ADRV902x评估板我这里用的是ADRV9026-EVAL配套FPGA板比如Xilinx ZCU102、KCU105或者ADI的HSDC采集卡评估板原装电源适配器注意电压电流别用实验台可调电源乱怼USB线用于TES与评估板的SPI/串口通信可选高性能信号源用于注入射频信号验证收发链路可选频谱仪或示波器检查时钟和射频输出时钟源或评估板上的板载参考时钟常见是10 MHz/100 MHz/122.88 MHz等我自己的建议是第一次上电尽量用评估板默认配置包括板载参考时钟不要一上来就外接时钟源。很多板子对外部时钟的驱动电平和幅度有要求USB供电不稳或者时钟源输出幅度不对会直接导致PLL失锁而新人在这个状态下很容易把问题归咎于配置文件。2.2 TES软件安装与版本匹配TES全称是Transceiver Evaluation Software在ADI官网注册后就可以下载。当前ADRV902x系列的TES版本和旧的AD937x系列已经不共用了安装的时候注意选择ADRV902x对应的版本。这里要强调一个项目上很容易掉的坑TES版本、评估板硬件版本、以及你使用的Linux驱动版本三者要尽量匹配。我有一次在旧版TES里配置好JESD204C参数导出给新版Linux驱动用结果驱动直接报ARM固件校验失败。后来查证是旧版TES生成的ARM bin缺少新版固件要求的某个校验段驱动加载时拒绝执行。所以拿到板子第一件事不是去TES里乱点而是先去ADI官网确认你这块板子的硬件修订版板子上一般有丝印REV再下载对应版本的TES和固件包。软件安装过程基本都是下一步下一步唯一要注意的是USB驱动有的Windows系统需要手动安装FTDI虚拟串口驱动否则TES里识别不到设备。2.3 上电前的检查清单与常见失误在按下电源键之前建议花几分钟过一遍下面的检查项能省下半天排查时间FMC接口是否插牢固有没有歪针或接触不良——JESD204C高速信号对连接器接触非常敏感评估板和FPGA板的电源指示灯是否正常USB线是否插到评估板的USB调试口有些板子有多个USB口别插错确认SYSREF信号的连接如果用外部SYSREF要接到指定SMA口如果用板载要确保跳线帽配置正确对照评估板原理图确认拨码开关设置尤其是“ARM启动模式”和“接口电压选择”这一类关键开关我见过最典型的低级错误是评估板通过FMC连了FPGA板但FPGA板没有单独上电导致FMC接口上的JESD204C lane供电异常ADRV902x侧怎么配置都锁不上链路。还有一个常见问题是SYSREF没接TES配置里要求SYSREF使能但硬件上根本没提供这个信号结果链路反复在“link established”和“sync error”之间跳。3. 用TES GUI生成ARM bin文件的核心流程3.1 ARM bin在系统里的作用有些人一听到“ARM bin”就以为要用交叉编译器自己编译其实在ADRV902x评估流程里很多情况下你直接用ADI预编译好的固件就行。ADI把这部分固件称为Arm binary里面跑的是公司内部封装好的一套控制逻辑。这套固件干了什么呢简单说ADRV902x上电后内部的ARM核首先启动执行一系列自检和校准算法比如TX/RX的DC失调校准、I/Q失衡校准、本振泄漏校准然后进入待命状态。外部主控通过API命令本质上是一系列SPI读写操作向ARM处理器下发配置ARM处理器再把这些配置翻译成具体的寄存器写入序列。所以如果你自己写的驱动只操作寄存器不借助ARM固件理论上也能让芯片工作但你会损失所有基于固件的校准算法和DPD功能而且大量内部状态寄存器读不到正确的值。ADI官方驱动之所以稳定是因为它严格遵守“API—固件—寄存器”的分层结构。TIPS在Linux驱动源码里你经常会看到类似adi_adrv9025_arm_bin这样的数组或文件引用。这个文件就是我们说的ARM bin。它可能是独立文件也可能被编译成C数组塞进驱动镜像里。3.2 TES里创建工程与器件配置打开TES之后第一步是选择器件型号。ADRV902x系列中9025、9026、9027是不同的器件初始采样率、ADC位宽不同千万别选错。选好型号后TES会自动尝试连接评估板如果连接成功主界面会显示芯片温度、PLL锁定状态、ARM处理器运行状态等信息。连接之后进入配置页面。这里主要设置以下几类参数射频参数本振频率、RX/TX带宽、增益模式手动还是自动、是否使能ORX时钟参数采样率、参考时钟频率、内部PLL分频系数以及JESD204C的device clock和SYSREF频率数字接口参数JESD204B还是JESD204C、lane数量、是否是subclass 1、SYSREF触发方式等这些参数看似独立其实相互耦合。比如你改了采样率PLL分频会自动重算JESD204C的lane速率也会联动更新。我实际操作中喜欢“先从默认配置改最小变更”比如只改本振频率其他保持不变先把链路跑通再逐步调整采样率和lane数。3.3 导出ARM bin的具体操作配置参数调整完成后需要把ARM固件和配置信息整理成文件。不同版本的TES界面会有差异但大致路径是类似的在TES主界面找到“Load/Store”或“Firmware/ARM”相关菜单选择“Load ARM Firmware”或“Load Binary”此时TES会读取当前固件版本如果需要导出选择“Export”或“Save Binary”指定保存路径和文件名文件格式一般是.bin如果只是测试你也可以直接点“Download ARM”让固件直接写入评估板上的器件SRAM运行而不落盘需要注意的是导出的bin文件通常包含的是ARM核运行代码不是你的应用配置。你的射频参数配置是通过另一条路保存的有些版本支持“Save Profile”导出成文本或XML有些则需要你手工记录到驱动结构体里。后面第4章讲的JESD204C配置文件就属于这个范畴。我自己的习惯是在TES里完成所有参数设置后先点击“Save Profile”再单独把ARM bin导出两者分开存放。这样如果后续只需要调增益或频率我就不用重新刷ARM bin只需要修改配置参数即可。等于把“系统”和“配置”两部分解耦。3.4 ARM固件版本不匹配的坑前面说过ARM bin版本必须和驱动、TES匹配。具体表现是驱动加载ARM bin时读回一个版本号如果该版本号与驱动源码里定义的预期版本不一致驱动会打印类似ARM firmware version mismatch的日志然后拒绝继续初始化。解决思路很明确在驱动源码中找ADI_ADRV9025_FW_VERSION这类宏具体型号会不同再看ADI提供的固件包里对应的版本号如果两者不一致优先升级驱动到与固件匹配的版本。不要为了兼容旧驱动去手动patch固件校验段那属于拆东墙补西墙。另外提醒一点在把ARM bin放到目标板文件系统之前最好用md5sum算一下哈希确保文件传输过程中没有被截断或损坏。传输到嵌入式设备后有条件的再做一次校验因为一些老旧的TFTP/FTP工具在传大文件时会有字节丢失。4. JESD204C链路参数计算与配置文件生成4.1 JESD204C相对JESD204B改了些什么JESD204协议是ADC/DAC和FPGA/ASIC之间的高速串行接口标准B版用的是8B/10B编码C版改用64B/66B编码。这个改变带来的直接好处是编码开销大幅下降8B/10B的额外开销是25%64B/66B只有3%左右所以JESD204C能在同样的有效数据速率下用更低的物理线速率或者同样的物理线速率下承载更多的数据。除此之外JESD204C还引入了前向纠错FEC、更强的确定性延迟机制、多链路绑定等功能。对ADRV902x这类需要高采样率和多个收发通道的器件来说JESD204C几乎是必然选择。当然代价是链路调试复杂度增加——64B/66B对时钟抖动和信号完整性更敏感PCB走线和连接器质量稍有波动都可能导致误码。用后端开发的话来说JESD204B像是HTTP/1.1协议文本清楚但头信息开销大JESD204C像是HTTP/2更高效但也引入了更复杂的lane管理。配置文件的概念也一样你见过logback.xml、nginx.conf、fstab这些配置射频领域同样有一套“配置”只不过它是以C结构体、二进制参数块或者寄存器地址序列的形式存在。4.2 配置文件里到底有什么一份完整的JESD204C配置文件在ADRV902x场景下基本围绕下面这组参数展开M转换器数量。注意这里是“转换器”不是“通道”因为I/Q复数信号下一个物理通道对应两个转换器LJESD204C lane数量决定用几条高速串行线把数据搬出去F每帧的字节数和单lane承载的转换器数量、样本宽度相关S每个转换器在每帧里的样本数N / N每个样本的实际有效位宽和经过填充后的位宽比如14位ADC可能N14N16K多帧长度和链路同步、确定性延迟有关参考时钟频率、SYSREF频率、device clock频率链路线速率lane rate单位bps组帧公式看起来吓人但实际上TESt和ADI驱动都帮你做好了计算你只需要搞清楚原理以便在两个配置文件不一致时能快速判断哪个参数出了问题。4.3 lane速率的推算思路我拿ADRV9026一个比较典型的配置举例假设ADC/DAC采样率为245.76 MSPS4发4收全开I/Q复数信号那么转换器数量M8RX侧N16L8条lane。先算总有效数据速率总有效比特率 fs × M × N 245.76M × 8 × 16 31.46 Gbps8条lane每条的有效数据速率单lane有效速率 31.46 / 8 3.93 Gbps加上JESD204C 64B/66B编码开销实际线速率约等于 3.93 × 66/64 ≈ 4.06 Gbps这个4.06Gbps就是你在Xilinx JESD204C IP核里需要配置的lane rate估计值。真实工程里还会有对齐标记、同步开销等所以TES自动算出来的实际值可能比这个公式略高一点但量级不会差太多。这个计算方法能帮你快速判断如果你在FPGA侧看到要求的lane rate和我算出来的差了一个数量级那大概率是M或L配置理解错了。4.4 从TES生成并导出JESD204C配置在TES的JESD204C页面里一般会有如下选项接口标准选择JESD204B / JESD204CLMFS模式选择有些版本直接提供预设比如4L8F1S、8L4F1S等lane速率显示和参考时钟频率输入SYSREF使能和频率设置以及multiframe trigger等高级选项ORX是否参与JESD204C链路如果要同时传输ORX数据会挤占lane资源把这些参数选好后TES会重新计算PLL和时钟分频并显示最终的lane rate。此时你可以把整个配置导出。需要注意的是导出结果不一定是一个完整可直接运行的配置文件有时候只是生成一段配置参数列表你需要手动把它填到Linux驱动的profile结构体里。具体到ADI的Linux驱动adi_adrv9025.c等JESD204C参数一般定义在类似adi_adrv9025_rx_profile的结构体中包含deviceClock_kHz、laneRate_kbps、lmfs之类的字段。你如果从TES导出了参数就把这些字段按照驱动代码里的注释逐个填上。还有一个更省事的方法是ADI的repo里通常会针对不同评估板提供现成的profile你只需要确认与自己的采样率和lane数一致即可。4.5 配置文件与FPGA侧的“对齐”问题这是整个JESD204C调试中最重要的一个环节也是新手最容易忽略的ADRV902x侧配置好了FPGA侧的JESD204C IP核参数必须完全一致。这里的一致包括LMFS相同尤其是L和Flane rate相同参考时钟同源实际工程常通过同一时钟芯片分发SYSREF的配置和触发方式相同如果是多片ADRV902x还要保证所有器件的SYSREF到达时刻一致用Xilinx的JESD204C IP核配置界面举例你会看到类似“Line Rate”“LMFS”“Reference Clock”“SYSREF”等设置项。把这些值和TES导出的配置逐一对照任何一个不一致IP核概要状态里就会报错严重的情况下直接收紧输出。我建议在硬件上把“参考时钟同源”当成强制要求。ADRV902x的device clock和FPGA的JESD204C IP核参考时钟最好来自同一个时钟芯片否则即使数值都是122.88MHz两个时钟源存在频偏和相位噪声差异也会造成链路偶发性误码或无法同步。5. 配置加载、链路调试与问题排查5.1 ARM bin与配置文件加载到目标板的流程把TES生成的ARM bin和配置信息从Windows环境搬到目标Linux系统后接下来的过程大致如下把ARM bin放到目标板文件系统的/lib/firmware/目录不同驱动可能用不同路径加载驱动时驱动会通过固件加载机制如request_firmware把bin读入内存驱动通过SPI把bin传输到ADRV902x内部的ARM SRAM并启动ARM核ARM核启动后驱动开始通过API下发射频和JESD204C配置参数链路建立成功后驱动打印相关状态比如“JESD204C link up”如果你的系统没有文件系统固件加载能力也可以把ARM bin转换成C数组编译进内核驱动。这样虽然省去文件系统依赖但每次换固件都要重新编译内核调试效率低。我自己的经验是开发阶段用文件系统加载量产时再考虑是否编译进内核。5.2 怎么确认JESD204C链路真的锁住了光看驱动日志不够建议用三重手段交叉确认第一读ADRV902x侧的链路状态寄存器。ADI驱动一般有相应API或debugfs节点能看到lane状态、全局同步信号、误码计数等。如果所有lane都显示同步说明ADRV902x侧发送数据正常。第二读FPGA侧的JESD204C IP核状态。Xilinx IP核有多个状态位比如“link_up”“sync_acquired”“mframe_aligned”这些都要置位才算链路OK。如果FPGA侧没有sync信号问题几乎肯定出在配置不一致或SYSREF上。第三做PRBS测试。JESD204C标准里支持在物理层插入PRBS数据让两端做自检。在ADRV902x和FPGA之间先跑一段PRBS确认无误码后再切回正常业务数据。我见过一种情况链路状态显示“up”但一旦传输实际数据就满屏错误最后排查发现是PRBS测试通过但实际数据路径中S参数配置错误导致数据帧错位。5.3 常见问题速查表把我调试中的问题和排查过程整理成下面的表你可以直接当checklist用问题现象可能原因排查方法TES连接不上评估板USB驱动问题、型号选错、板卡电源不正常检查设备管理器中COM口是否出现确认板卡电源灯亮ARM固件加载失败bin文件损坏、版本不匹配md5校验文件核对驱动要求的固件版本号ARM加载成功但初始化卡住SPI通信异常、配置参数超范围用TES回读寄存器对比正常配置JESD204C链路起不来两边LMFS或lane rate不一致逐个比较FPGA IP核和TES配置参数链路偶尔丢失同步SYSREF时序不对、时钟抖动大示波器看SYSREF边沿检查同源时钟能lock但数据全是错N/N位宽配置错误、F参数不一致检查样本位宽、帧长度跑PRBS定位温度一高就出错电源纹波、散热不良用频谱仪看电源噪声检查评估板散热条件5.4 调试技巧用回读寄存器快速定位问题最后一个经验真的很建议每个人在调试前期就养成的习惯不要只看驱动日志要学会用TES回读寄存器。ADRV902x的大多数关键状态都可以通过SPI寄存器读出来包括PLL锁定状态、ARM处理器状态、JESD204C链路同步状态、误码监控值等。当你怀疑配置没有正确生效时打开TES找到对应的寄存器页将当前值和驱动下发后的期望值做比对很快就能判断问题到底出在驱动代码、ARM固件还是FPGA侧。比如有一次我遇到PLL失锁驱动日志只说了“pll unlock”但TES里能看到是RF PLL还是digital PLL失锁还能看到参考时钟的计数状态。这样几十秒就定位到是外部参考时钟幅度不够导致的参考检测失败而不是驱动算法问题。这种排查效率靠“逐行看代码”是远远达不到的。另外调试JESD204C时一定要善用SYSREF的示波器抓取。把示波器探头放在SYSREF SMA口上检查信号边沿是否干净频率是否和配置一致。如果SYSREF有毛刺或者边沿抖动过大先解决信号源问题再谈链路同步。我见过一个极端案例SYSREF的偏置电压不对导致FPGA侧连续误判同步头整条链路像癫痫一样反复up/down。最后再分享一个小技巧在开新板或者换新FPGA工程时先不要把采样率调到很高的目标值。先用一个低速率的“练习配置”把整条链路跑通比如把采样率降到122.88Mlane数用最少的SYSREF用最简单的subclass 1模式让ADRV902x和FPGA先把“握手”搞定。链路能起来说明通信链路、时钟和基本配置是对的然后再慢慢提速。直接冲刺高配置的好处是省时间坏处是一旦起不来各种变量混杂在一起你会很难定位问题点。
返回列表