ARTICLE DETAIL

资讯详情

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

从调试到安全:JTAG边界扫描工程实战与避坑指南

从调试到安全:JTAG边界扫描工程实战与避坑指南 1. 项目概述JTAG边界扫描在2021年的新坐标别一看到JTAG就想到调试器下载程序那只是它最浅层的一个用法。这两年我明显感觉身边越来越多做硬件、做测试、做可靠性的朋友重新把JTAG Boundary Scan边界扫描捡了起来而且不是拿它当传统ATE自动测试设备的替代品而是把它嵌进整个产品研发流程里从原理图设计、PCB Layout、样板调试一直管到量产阶段的ICT测试和固件安全锁定。这个标题叫“Bringing JTAG Boundary Scan into 2021”我觉得非常贴合现在的行业状态——技术本身是上世纪90年代定型的但玩法早就变了。先把基础说清楚。JTAG是Joint Test Action Group联合测试行动组制定的标准对应的IEEE标准是1149.1。它的初衷是解决PCB板上物理探针越来越难下针的问题——BGA封装、高密度布线、多层板引脚根本够不着所以就把测试逻辑做进芯片内部通过一条串行链路从芯片外部访问内部寄存器和引脚状态。Boundary Scan就是边界扫描核心是把芯片的每个数字引脚用边界扫描单元BSCBoundary Scan Cell串联起来形成一个移位寄存器链通过TDI进、TDO出配合TCK时钟和TMS状态机就能把每个引脚的输入输出状态读出来或者写进去。这个东西在2021年重新变热背后有几个实实在在的驱动力一是芯片封装密度还在继续涨物理探针越来越无能为力二是板级测试从“功能测试为主”转向“结构测试边界扫描为主”尤其在高可靠行业汽车、医疗、服务器、通信基站里边界扫描覆盖率已经成了硬指标三是JTAG接口本身承担的安全职责越来越多比如固件加密、调试端口锁定、生命周期管理。所以这篇我打算把这几年在项目里实际用到的经验整理一遍覆盖硬件设计、生产测试、固件调试和故障排查这几个维度全程聊实操不念IEEE标准原文。2. 硬件设计端的JTAG实现细节2.1 JTAG接口引脚定义与PCB布线要点先过一遍基础引脚定义这是所有后续操作的地基。标准的JTAG接口最少4根信号线加1根可选信号线另外至少要配电源和地。TCKTest Clock测试时钟由主机调试器、边界扫描控制器驱动给目标芯片提供时钟节拍。TCK频率决定了整个扫描链的移位速度但它不是想多快就多快——目标板上所有芯片的TCK接收能力、走线长度、电平转换延迟都受限。TMSTest Mode Select测试模式选择控制TAPTest Access Port状态机的跳转。TMS在TCK上升沿被采样通过时序组合在状态机里前进、后退、复位。TDITest Data In测试数据输入数据在TCK上升沿移入目标芯片。TDOTest Data Out测试数据输出数据在TCK下降沿移出目标芯片。TDO和TDI之间通过移位寄存器构成一条扫描链。TRSTTest Reset可选测试复位低电平有效用来异步复位TAP状态机。很多设计把它省掉用TCK连续拉高5个周期来同步复位但保留TRST在调试早期会更省心。电源和地目标板电源、目标板地。有些调试器还用VTref参考电压引脚来检测目标板工作电压判断电平匹配。我见过不少新手设计的板子JTAG调试死活连不上最后查出来根本不是芯片问题而是PCB布线埋了雷。JTAG虽然是低速串行接口通常10MHz以下但它在板级调试里扮演的角色极其关键——一旦跑不起来整个系统就“瞎”了。所以布线时这几条原则要记住第一TCK和TMS尽量短优先保证走线长度一致差分要求谈不上但别把TCK拉到板子对角再穿过一堆高速信号线。第二TDI和TDO串在链上如果板上有多颗支持JTAG的芯片就形成了一个菊花链这时候要特别留意每颗芯片的TDI-TDO路径是否形成了意外的环路调试器扫描链识别时会按顺序检测器件IDCODE环路异常会导致整条链识别失败。第三TDO建议加一个上拉电阻可选看芯片手册防止芯片未上电时TDO悬空导致调试器误判链路状态。提示如果板上有多种电平域比如3.3V主控1.8V FPGAJTAG信号的电平转换不能省。我踩过坑调试器输出3.3V TTL接1.8V器件TCK勉强能识别但TDO返回高电平直接烧坏了目标板IO那板子废得很冤。接口连接器选型上ARM核心板常用的有10pin 2.54mm、20pin 2.54mm、还有Cortex Debug SWD模式的排针。做产品量产时我个人更倾向于用10pin带屏蔽的牛角座再标注清晰的丝印方向防止产线工人插反。2.2 用SVF/BSDL文件做板级边界扫描测试上面说的还是“用JTAG调试器连芯片”这叫在线调试模式。边界扫描真正威力大的是另一个模式——通过链路上的TAP控制器把测试向量从TDI推入、从TDO读回来验证板上芯片之间的互连有没有开路、短路、桥接。要做到这件事硬件上除了保留JTAG接口还需要两样东西BSDL文件Boundary Scan Description Language这是每一颗支持边界扫描的芯片都有的“说明书”描述了芯片的引脚编号、边界扫描单元的位置、指令寄存器长度、IDCODE、支持的指令集。芯片原厂一般都会提供。边界扫描测试控制器也叫BS控制器可以是独立的USB盒子比如JTAG Technologies、ASSET InterTech、Corelis这些家的产品也可以是集成在功能测试设备里的PCIe板卡。它负责按BSDL文件理解链条产生符合SVF格式的测试向量。SVFSerial Vector Format是一种文本格式的测试向量文件描述了TCK/TMS/TDI/TDO的时序。测试人员一般不用手写SVF而是用边界扫描工具链比如XJTAG、ScanWorks导入BSDL文件自动生成互连测试、引脚测试、内存簇测试的向量。我实际用下来的流程长这样把所有BSDL文件按板上JTAG链顺序排列导入工具。工具读IDCODE自动验证链条完整性——只要有芯片没上电、引脚虚焊或者链路断线IDCODE就对不上。生成互连测试向量逐个引脚输出高/低电平另一边芯片对应引脚读入比对是否一致。这一步能直接定位短路、开路、PCB走线错误。生成内存簇测试如果板上接了SDRAM、NOR Flash这类存储器边界扫描还能通过IO口模拟读写时序检测存储器数据线、地址线、控制线的连接完整性。跑测试直接出报告精确到引脚级别的故障。这个玩法最典型的应用场景是样板首件验证。以前焊接完第一块板先检查电源有没有短路再烧个LED程序看能不能跑起来出了问题只能拿万用表、示波器一个一个查。用边界扫描之后上电之前先跑一遍互连测试网络级的开路短路几秒钟就能定位省的时间非常可观。注意不是所有芯片都完整支持边界扫描指令。有些MCU只支持EXTEST、SAMPLE/PRELOAD、BYPASS这几个基本指令不支持INTEST和RUNBIST所以做设计选型之前先确认芯片的BSDL文件和指令集范围尤其要确认是否支持SAMPLE/PRELOAD——这个指令能在芯片正常运行时“不打断地”采样引脚状态是很多调试场景的基础能力。3. 固件与软件层面的JTAG生命周期管理3.1 STM32禁用JTAG的几种方式与恢复方法STM32是嵌入式开发里最常见的主控之一它的JTAG引脚和普通GPIO复用——PA13/PA14/PA15、PB3/PB4默认状态是JTAG功能。但如果产品量产之后不希望调试口被随意访问就得把JTAG禁掉。这个操作看似简单实际上坑很深。禁用JTAG的常规办法是利用STM32的AFIO寄存器在F1系列里是AFIO_MAPR寄存器的SWJ_CFG位段把JTAG引脚释放为GPIO同时保留SWDSerial Wire Debug或者全部禁用。SWJ_CFG位段的值对应关系大致是000全功能JTAGSWD001SWD有效JTAG禁用010全部禁用100JTAG有效SWD禁用看了这个表就知道如果你只想留SWD下载程序把SWJ_CFG设为001即可。如果想完全锁死调试口就选010。在代码里操作时一定要先打开AFIO时钟再去改SWJ_CFG位。但真正让人拍桌子的问题是禁完之后怎么办。如果你把JTAG和SWD都禁了芯片里又没有提前烧好可用固件那这块芯片基本就“变砖”了——因为标准调试接口全没了。恢复方法有好几种我把可复现的列出来最常用的是通过BOOT0引脚进入系统存储器System Memory模式。把BOOT0拉高、BOOT1拉低然后复位芯片这时芯片会执行出厂烧录的Bootloader你可以通过USART1F103系列或DFU接口重新烧录程序把原来禁掉调试口的固件覆盖掉。烧完再把BOOT0拉低重新复位。如果板子上还保留了复位按键和SWD引脚可以在复位瞬间用调试器高速连接在芯片运行到禁用代码之前把调试器挂上。实操方法按住复位不放点调试器连接在连接成功的瞬间松复位。我试过几次成功率大概六成完全看手速不如BOOT0可靠。如果芯片支持读保护RDP又同时禁用了JTAG那就只能先解除读保护调用Option Bytes修改再把整个Flash擦掉然后重新烧录。这一步要注意解除高等级读保护时会触发全片擦除相当于数据清零。说到恢复就得提一个很多人误解的“禁用JTAG安全防护”。禁用JTAG只挡调试接口不挡Bootloader接口也不挡SWD如果你保留了SWD更不挡芯片自身的漏洞。完整的固件安全保护通常需要组合RDP读保护等级、PCROP代码读保护、以及自定义的引导校验把调试口断开只是第一步。注意如果产品量产时不希望用户随便读固件RDP等级要设成1甚至2。等级2是永久性设置设完就再也降不回来调试口和Bootloader全废切记谨慎评估。我见过一个客户升级固件时把RDP等级调成2结果固件有bug但没法再更新整批产品只能返厂换芯片教训很贵。3.2 S32K等车规MCU的JTAG保护机制车规MCU对调试口的保护思路又不一样拿NXP的S32K系列举例它做了一套生命周期Life Cycle状态管理调试口能不能用取决于芯片当前处于哪个生命周期状态。S32K的生命周期从出厂到最终固件锁定大致是这么几个状态空片Blank、工厂编程Factory、应用开发Development、应用锁定Secure、以及终态OEM Locked / Field Return。每个状态里到底允许JTAG/SWD访问哪些存储区域是由CSEc加密服务引擎和生命周期控制器共同决定的。正常开发阶段芯片处于Development模式调试口全开方便我们烧代码、跑断点、看变量。到了量产阶段产线用一个特殊命令把生命周期切到Secure模式这时候调试口对用户代码区的访问就被切断——虽然还能识别到IDCODE、能连上调试器但你读不到Flash内容也下不进新程序。再往后的OEM Locked状态基本上调试口物理失效只能通过Factory Return流程恢复这是NXP给售后维修留的口子。这种机制和STM32那种“把GPIO复用改掉”的思路完全不同它更像是把安全状态机做进了芯片的“血脉”里往哪个状态走都是一次性或者严格加密的不是寄存器改个bit就能绕过去的。实际在S32K平台上做开发我最大的体会是千万别在量产固件里把生命周期锁死得太早。S32K的Secure状态切换是不可逆的至少常规手段不可逆一旦锁了后续固件升级必须走安全启动流程密钥管理和证书签发全都得配套。所以在产品还处于小批量验证阶段我会把生命周期停留在Development模式用读保护控制访问只有到正式量产爬坡前才切到Secure模式并且保留一套完整的密钥备份和恢复方案。还有一个容易忽略的点S32K的JTAG引脚在某个启动阶段可能被复用为其他功能比如FlexIO或者GPIO如果启动配置字FCCU/ADC配置配错了调试器可能连IDCODE都读不到。车规MCU的启动脚本比普通MCU复杂遇到连接不上先别怀疑芯片坏了查一下启动配置字和电源时序。4. 调试与故障排查从ARM9到高云FPGA的JTAG识别不到问题4.1 ARM9内核JTAG调试链路搭建与RTCK时序处理ARM9内核比如S3C2440、AT91SAM9260这些老将到现在还有大量设备在用它们不像Cortex-M那样自带SWD口基本只有标准JTAG接口调试器通过ARM CoreSight之前的调试架构去访问内核。这就意味着JTAG时序和电平要求更“娇气”。ARM9系列最特殊的是RTCKReturned TCK信号。简单说ARM9的调试逻辑实际工作时钟可能和TCK不是一个域芯片会根据自身时钟状态回送一个RTCK给调试器让调试器知道当前TCK是否被真正采纳。如果你的调试器不支持RTCK自动同步而板上又没有把RTCK做正确的反馈连接就会出现一个经典症状连接时能识别IDCODE一执行halt或者内存读写就超时、不稳定。解决办法分几条路尽量使用支持RTCK自适应同步的调试器完整版的J-Link、TRACE32、以及一些工业级JTAG控制器都支持。连上RTCK引脚后调试器会动态调整TCK相位稳定性和老式固定TCK方案有质的不同。降低TCK频率别贪快。很多老ARM9核心板跑12MHz甚至24MHz TCK都能挂但系统时钟乱、电源噪声大的时候降到1MHz反而最稳。调试不是跑分稳定才能出效率。如果板子没有引RTCK或者RTCK被NC了那就得把TCK配置成低频固定模式。J-Link里有设置选项手动关闭自适应时钟功能再把速率调低我实测下来多数ARM9板子能正常工作。另外ARM9时代的老开发板经常存在“JTAG管脚上拉电阻缺失”的问题。TMS、TDI在芯片内部有上拉但TCK通常需要外部处理如果PCB上忘记加调试器闲置时TCK悬空容易因噪声导致TAP状态机乱跳。排查时先量TCK静态电平正常应该是低电平如果看到乱飘的波形优先补一颗10kΩ下拉电阻。4.2 高云JTAG识别不到的排查实践高云GOWINFPGA这几年在国内用的很多很多硬件工程师第一次接触高云的ProgrammerGW1N/GW1NR/GW2A这些系列就被一个问题折磨到崩溃USB-JTAG调试器插上软件提示识别不到器件。我在一个项目里遇到过一模一样的问题最后整理出一套排查顺序基本能覆盖九成以上的情况第一步确认供电。高云FPGA的JTAG下载需要内核电压和IO电压正常尤其是某些型号需要先配置VCCIO才能建立JTAG链路。实测遇到最多的就是核心板只供了主电源IO Bank电压没起来JTAG引脚处于高阻态下载器自然搜不到。第二步确认下载器驱动和固件。高云官方Programmer支持的下载器分好几种有并口、USB接口、还有第三方的CMSIS-DAP兼容方式。如果你用的是第三方调试器检查目标板引脚定义和下载器引脚顺序是否一一对应别把TCK插成了TMS。这种低级错误我至少见过三次每次都是板子标错丝印或者杜邦线接错位。第三步检查TCK频率。高云下载器默认速率通常比较保守但碰上板子走线较长、负载电容大的情况降速能解决很多识别不稳的问题。在下拉菜单里选一个较低速率重试成功率会明显提升。第四步看TRST的处理。高云部分器件要求TRST#引脚有确定的电平不是所有下载器都会驱动TRST。如果板上TRST悬空链路上噪声导致芯片一直处于复位状态IDCODE永远读不出来。解决方法是把TRST接到调试器对应引脚或者在板上加一个10kΩ上拉到3.3V具体看芯片手册指定电平。第五步检查菊花链配置。如果板上有多个可编程器件串在JTAG链上高云Programmer需要你手动指定当前要操作的是链上哪一个器件否则默认搜索第一个搜不到就报错。提示高云FPGA下载失败还有一个隐蔽原因——配置引脚比如CRESET、DONE的状态不对。部分器件在JTAG模式下DONE引脚被拉低会影响配置状态反馈看起来像“识别不到”实际上器件在报错。把DONE引脚的上拉电阻加上或者确认其他配置模式引脚没有冲突再重新扫描设备。5. 实操心得与避坑记录最后分享几条这几年我在JTAG和边界扫描项目上沉淀下来的个人经验偏经验向不涉及具体产品参数但每条都是从真实项目里踩出来的。第一设计阶段就规划好JTAG链路的可测试性。原理图阶段把链路上所有器件的BSDL文件找齐确认它们能串在同一条链上——电平、指令集、IDCODE长度都兼容再定方案。我见过一块板子上混了3.3V和1.8V两代器件、IDCODE长度还不一致工具链各种报错最后只能拆板加电平转换模块改了两版才稳定。第二边界扫描不是测“功能”而是测“结构”。它能精确告诉你哪根网络开路、哪根引脚短路但它测不了芯片内部逻辑对不对、固件跑起来功能正不正常。所以边界扫描的定位是“功能测试的前置筛选”别指望它替代传统整机测试。第三JTAG引脚在量产阶段最好“可断可连”。板子上的调试接口不管用不用建议设计成0欧电阻可断开的布局或者用测试点的方式保留接口。这样量产前可以把调试链路物理断开防止产线误操作通过JTAG改写固件等售后需要返修时再把电阻焊回去。第四别把禁用JTAG当作唯一的安全手段。真正的产品安全需要层次化防护调试口禁用只是一层固件加密、启动校验、密钥存储、访问权限管理要一起上。尤其是现在各种联网IoT设备越来越多单纯靠关掉JTAG想防住逆向那基本是裸奔。第五工具链的日志非常有用。J-Link连接失败会输出详细的错误码XJTAG跑测试失败会定位到具体的寄存器位高云Programmer扫描失败会提示“No Device”还是“ID Mismatch”。这些日志信息千万别忽略它们比你自己瞎猜快得多。边界扫描和JTAG这两个技术说实话年头都不短了但在2021年、甚至在今天它们依然是硬件工程师手里解决复杂板级调试问题的核心武器。整个行业从单板调试走向系统性可测试设计、可安全设计的过程里JTAG的角色已经从“下载程序的入口”演进成“产品生命周期管理的枢纽”。希望这篇能帮你把这几块拼图补完整也欢迎在实际项目中遇到具体问题一起交流。
返回列表