挥码枪是基于JTAG和ARM ADI技术实现的硬件调试器,理论上可以调试符合这两个技术标准的所有芯片。本文将介绍适配新芯片的基本过程,供大家参考。
硬件连接
适配的第一步是要把被调试的目标芯片与挥码枪正确的连接起来。
建议先确认目标板上是否有标准的调试接口,常见的调试接口有如下几种:
- ARM 10针接口,2.54mm间距的双排插针
- ST 14针接口,2.0mm间距双排插针
- SWD接口,只需要SWD和SWK两个信号(外加地),一般没有标准
如果有标准接口,那么就可以使用挥码枪配套的标准接头进行连接,简单而且准确。
如果没有标准接口,那么就要查找电路图,根据电路图将调试信号与挥码枪连接。如果遇到困难,欢迎联系我们。
安装软件
使用浏览器打开nanocode官网:https://www.nanocode.cn/
点击右上角的“全部产品”按钮,选择nanocode,然后选择你需要的版本下载和安装
安装后,请注册一个免费账号,备用
配置文件
硬件连接搞定之后,第二个重要工作是要为要调试的芯片准备一个配置文件,用来存放芯片的关键参数。配置文件的格式是纯文本文件,内部的语法是TCL脚本。附录B列出来以JTAG方式调试RK3588时使用的配置文件。
虽然不同调试器使用的配置文件格式可能有所不同,但是一般都包含相同的基本参数,所以你只需要找到一种就可以。
对于你要调试的芯片,可以使用如下方式之一寻找配置文件:
- 联系芯片厂商,希望提供用于JTAG调试的参数文件
- 下载OpenOCD软件,在它的配置文件里按芯片名称寻找配置文件
- 寻找其它调试工具使用的配置文件,比如Trace32,DStream等
- 搜索网络,看是否有同行分享了调试参数
找到配置文件后,将其以.cfg为后缀放到Nanocode的data目录中,默认为C:\Nanocoe\data,建议按你的芯片命名,比如MySocXX.cfg
接下来需要把你的配置文件注册给NDB,使用notepad打开C:\Nanocoe\data目录下的ndb.cfg,找到[ntp]节,在其中增加一行,比如:
MySocXX=-f ntp.cfg -f MySocXX.cfg -d
除了MySocXX外,其它内容请保持不动
第一次中断
做好以上准备工作后,接下来可以尝试做第一次调试了。
启动Nanocode,点击左侧工具栏的调试图标(放大镜模样),然后依次点击内核调试 > USB2/USB3
- 选择OpenOCD
- 在第一个编辑框里输入上一部注册配置文件时使用的名字,比如MySocXX。
点击启动,让ndb开始工作。
注意NDB的调试工具条,如果代表中断的两条竖线图标变亮,则代表NDB准备就绪,点击这个图标,可以发起中断。
发起中断后,如果看到NDB显示命令提示符,则可以输入r命令观察CPU的寄存器。
如果看到CPU寄存器的数据,则代表中断成功了,已经进入硬件调试会话。
如果不顺利,可以先看一下下面的视频,根据视频思考问题所在:
https://www.bilibili.com/video/BV1LtWGe2EkJ/
如果还没有找到原因,建议根据附录A的提示,进一步查找原因。
附录A 常见故障排查
硬件调试对软硬件都有较高的要求,以下是常见的一些故障情况。
A.1 启动调试失败: -4
NDB显示如下错误信息:
`Starting new session…
Nano Debugger (NDB) 3.6.2025L (17524:4672)
Err:启动调试失败: -4
Starting KD session type=usb,proto=ocd,opt=rxu,targetname=yl
debug_level: 3
GDDBG cmd NTP-DAP drivers NTP-DAP
0x140000
Using CMSIS-DAPv2 interface with VID:PID=0x0d28:0x1588, serial=2025193775d4abcdddbdbc1c2000410fa5a5a5a547454455
clock speed 12000 kHz
Error connecting DP: cannot read IDR`
上述信息表示NDB与挥码枪成功连接,但是挥码枪与目标芯片之间通信中断。把挥码枪的接头拔掉,放在空气中,也会得到相同的错误。
遇到这个错误后,建议按如下顺序排查:
- 挥码枪与目标主板之间的连线,如果是使用杜邦线,检查是否有松动
- 查阅芯片手册,看用于调试的管脚是否有复用,如果复用,可能需要用软件切换到调试模式
- 检查目标系统是否开机,如果没有开机,应该开机
- CPU睡眠也会导致这个错误,如果目标系统是在Linux内核阶段,那么需要禁止CPU睡眠,禁止的根本方法是在设备树中增加如下信息:
&CPU_SLEEP { status = "disabled"; // to make JTAG debug happy temporarily on 2025-5-14 };
如果不方便修改设备树,那么一种简单的方法,是让系统进入繁忙状态,比如运行计算量很大或者死循环的程序
A.2 info命令失败
这个错误一般是因为NDB软件没能与挥码枪硬件通信,获取挥码枪的设备信息失败,可能是因为上次使用挥码枪后没有正常结束硬件通信,或者系统没有识别到挥码枪,请关闭NanoCode软件,拔下挥码枪重插,然后再开启NanoCode软件。
A.3 未找到NTP设备
NDB显示如下错误:
`Starting new session…
Nano Debugger (NDB) 3.6.2025L (27076:20712)
Err:启动调试失败: -4
Starting KD session type=usb,proto=ocd,opt=rxu,targetname=yl
debug_level: 3
GDDBG cmd NTP-DAP drivers NTP-DAP
0x140000
unable to find a matching NTP device`
这个错误是由于忘记插挥码枪,或者系统没有识别到挥码枪,请拔下重插
附录B 使用JTAG接口调试RK3588的配置文件
set OS 0
#
# configuration file for Rockchip RK3588
#
if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME
} else {
set _CHIPNAME RK3588
}
if { [info exists CHIPCORES] } {
set _cores $CHIPCORES
} else {
set _cores 8
}
# CoreSight Debug Access Port
if { [info exists DAP_TAPID] } {
set _DAP_TAPID $DAP_TAPID
} else {
set _DAP_TAPID 0x5ba02477
}
adapter speed 12000
# Rockchip socs use arm serial wire debug
transport select jtag
# the DAP tap
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x01 -irmask 0x0f -expected-id $_DAP_TAPID
dap create $_CHIPNAME.dap -chain-position $_CHIPNAME.cpu
# APB-AP for direct access to soc bus
target create apb mem_ap -dap ${_CHIPNAME}.dap -ap-num 0
set _TARGETNAME cpu
set _CTINAME cti
set _coreid 0
set DBGBASE {0x81004000 0x81005000 0x81006000 0x81007000 0x81024000 0x81025000 0x81026000 0x81027000}
set CTIBASE {0x81014000 0x81015000 0x81016000 0x81017000 0x81034000 0x81035000 0x81036000 0x81037000}
for { set _core 0 } { $_core < $_cores } { incr _core } {
cti create $_CTINAME.$_core -dap $_CHIPNAME.dap -ap-num 0 -baseaddr [lindex $CTIBASE $_core]
set _command "target create $_TARGETNAME$_core aarch64 -dap $_CHIPNAME.dap -coreid $_coreid -dbgbase [lindex $DBGBASE $_core] -cti $_CTINAME.$_core"
incr _coreid
eval $_command
}
# default target is A55 core 0
targets cpu0
if { [info exists SMP_OFF] } {
target smp cpu0
} else {
target smp cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7
}
set ARCH 0
global CONSOLE_LOG_ADDR
if { ![info exists CONSOLE_LOG_ADDR] } {
set CONSOLE_LOG_ADDR 0x140000
}
`
最后编辑:Zhang Yinkui 更新时间:2025-08-06 11:03