首页 / 资讯中心 / 文章详情

匠芯创 cJTAG / JTAG 实板调试:FT232H、OpenOCD 与 GDB | 优森美

匠芯创 cJTAG / JTAG 实板调试:FT232H、OpenOCD 与 GDB | 优森美 ★ FEATURED ARTICLE
匠芯创 cJTAG / JTAG 实板调试FT232H、OpenOCD 与 GDB | 优森美匠芯创 cJTAG / JTAG 实板调试FT232H、OpenOCD 与 GDB本文整理匠芯创ArtInChipD125 E907 FT232H SiFive OpenOCD 2020.11.0的实板调试记录包含硬件连接、完整配置、原始运行日志及 GDB 附加步骤。项目已确认 cJTAG 连接经过实板验证PA 组使用D0 → PA11TCKCD1/D2 → PA10TMSC。本文同时收录 D125 两线 cJTAG 和 D213 四线 JTAG并分别提供项目实板连接记录D125 识别为 RV32新增 D21x 日志识别为 RV64两份日志分别解读不混用验证结果。验证边界项目已确认本文 cJTAG 接线和 OpenOCD 连接经过实板验证日志记录了 IDCODE/DTMCS 读取与 CPU examine。本文新增的 GDB 操作指引不据此宣称所有步骤均已验证。示例使用ftdi_oscan1_mode on的两线模式不是普通四线 JTAG 接法该命令依赖所用 OpenOCD 分支不保证其他版本或 FTDI 模块可直接使用。D125cJTAG 硬件连接D125 引脚根据本次提供的官方 D125 数据手册引脚摘录两组调试引脚均使用功能 8。根据板上实际引出和固件 pinmux 选择一组不同时连接两组。下表脚号按封装区分不是开发板排针编号。cJTAG 信号MCU 引脚D125CxS 芯片脚号D125ExS 芯片脚号JTAG_MS / TMSCPA107953JTAG_CK / TCKCPA118054JTAG_MS / TMSC另一组PC06123JTAG_CK / TCKC另一组PC56628FT232H 接线FT232H 模块信号连接位置作用D0 / ADBUS0D125 JTAG_CKPA11 或 PC5输出调试时钟D1 / ADBUS1D125 JTAG_MSPA10 或 PC0FT232H 向目标输出数据D2 / ADBUS2同一 JTAG_MS 节点FT232H 从目标输入数据GNDD125 GND调试器与目标板共地本例 D1、D2 在同一 JTAG_MS 节点短接。PA 组接法为D0 → PA11D1/D2 → PA10PC 组则为D0 → PC5D1/D2 → PC0。接线更正此前 PA10/PA11 的时钟与数据文字说明相反现已纠正为 PA11 时钟、PA10 数据。项目已确认 cJTAG 调试经过实板验证这是对文档接线描述的更正不应继续标记为“未上板验证”。其他封装、PC 组接线和不同适配器仍需按实际硬件核对。D0 与 D1/D2 短接组不能接到同一个引脚。D1/D2 短接仅适用于本例适配器及驱动模式不能推广为普通 JTAG 接法。连接前断电确认 FT232H 模块 VCCIO、输出电平与 D125 对应 IO 电源域匹配。USB 供电电压不等于 IO 电平不要把 5 V 接到调试信号也不要未经核对把模块电源输出接入目标板。目标板应正常供电。配置保留了 TMS 和 JTAG_SEL 的适配器布局定义不表示需要把 D3 或 JTAG_SEL 接到目标的 JTAG_MS 或 JTAG_CK。更换适配器时应核对其原理图和驱动实现。Windows 准备先安装 FT232H WinUSB 驱动启动 OpenOCD 前先为本例 FT232H 安装 WinUSB 驱动。D125 cJTAG 与 D213 JTAG 共用这一步已正确安装时无需重复替换。关闭占用适配器的软件插入 FT232H从 Zadig 官网 下载并运行工具按提示授予管理员权限。如未显示设备选择Options → List All Devices。选择实际 FT232H。截图名称为USB - Serial Converter核对USB ID0403 / 6014与本文配置一致名称可能不同多设备时应通过插拔或序列号确认。将右侧目标驱动选择为WinUSB。截图左侧当前驱动为 FTDIBUS按钮为Replace Driver未安装驱动时可能显示Install Driver。执行安装并等待成功提示重新检查当前驱动已是 WinUSB再启动下文 OpenOCD。截图由项目提供显示安装进行中不是安装完成凭证图中 Zadig 和驱动版本仅为当时环境不要求固定使用该版本。仅替换目标适配器的驱动不要选择键盘、鼠标、USB Hub 或其他串口设备。替换驱动可能使依赖原 FTDI 驱动的程序无法再访问该设备需要恢复原用途时应重新安装匹配的 FTDI 驱动。本文适配器为FT232H不能仅凭“FT232”名称认定其他型号可用。操作依据Zadig 官方使用指南。D125 OpenOCD 配置保存为openocd-d125-ft232h.cfg或 下载配置文件。配置已按本次提供的tmp/openocd-d125-ft232h.cfg更新保留原始参数与注释。两份下载配置均使用bindto 0.0.0.0会监听所有网络接口。仅在隔离、可信网络中使用本机调试建议将其改为bindto 127.0.0.1远程访问优先使用 SSH 隧道避免直接暴露调试端口。# D125 E907 FT232HSiFive OpenOCD 2020.11.0。 # 目标走 cJTAG OSCAN1不是四线 IEEE 1149.1。引脚布局仅适用于当前这块适配器。 adapter driver ftdi ftdi_vid_pid 0x0403 0x6014 ftdi_channel 0 # 多块 FTDI 同时在线时取消下一行注释并填入序列号。 # ftdi_serial YOUR_FT232H_SERIAL ftdi_oscan1_mode on transport select jtag # ADBUS0TCK、ADBUS1TDI、ADBUS2TDO、ADBUS3TMSACBUS0JTAG_SEL 输出使能。 ftdi_layout_init 0x0008 0x001b ftdi_layout_signal TCK -data 0x0001 ftdi_layout_signal TDI -data 0x0002 ftdi_layout_signal TDO -input 0x0004 ftdi_layout_signal TMS -data 0x0008 ftdi_layout_signal JTAG_SEL -data 0x0100 -oe 0x0100 if {![info exists ADAPTER_KHZ]} { set ADAPTER_KHZ 100 } adapter speed $ADAPTER_KHZ reset_config none # RISC-V DTMIR 长度 5板上实测 IDCODE0x10000b6f、DTMCS0x000040a1。 # 保留默认 IR 校验init 时可能仍有 capture 告警。examine 放到后面手动做。 jtag newtap d125 cpu -irlen 5 -expected-id 0x10000b6f target create d125.cpu riscv -chain-position d125.cpu -defer-examine bindto 0.0.0.0 gdb_port 3333 telnet_port 4444 tcl_port disabled gdb_breakpoint_override hard # 不加载 flash 算法不做 RAM 初始化、硬件复位或自动 halt。 # 旧驱动在本连接上会在初始 IR 校验失败。先读 IDCODE/DTMCS匹配后再 examine。 init irscan d125.cpu 0x01 set d125_id [drscan d125.cpu 32 0] irscan d125.cpu 0x10 set d125_dtmcs [drscan d125.cpu 32 0] echo D125 IDCODE0x$d125_id DTMCS0x$d125_dtmcs if {$d125_id ne 10000b6f || $d125_dtmcs ne 000040a1} { error D125 probe mismatch; refusing CPU examination. } d125.cpu arp_examine echo D125 CPU examination complete; GDB port 3333. Attach GDB to halt.该配置不提供 Flash 烧写算法、RAM 初始化或硬件复位流程也不主动执行 halt。100 kHz 是当前记录使用的起始速率不代表最高稳定速率。运行命令在 Windows PowerShell 中进入配置文件所在目录执行.\OpenOCD-SiFive-0.10.0\bin\openocd.exe -f .\openocd-d125-ft232h.cfg目录名中的 0.10.0 与启动日志中的 2020.11.0 是不同的版本标识应检查实际启动横幅而不是仅凭文件夹名判断版本。如需降低速度可在读取配置前设置变量.\OpenOCD-SiFive-0.10.0\bin\openocd.exe -c set ADAPTER_KHZ 50 -f .\openocd-d125-ft232h.cfgD125 实板运行日志以下是原连接记录不是本次文档整理重新测得的结果Open On-Chip Debugger 0.10.0dev (SiFive OpenOCD 0.10.0-2020.11.0) Licensed under GNU GPL v2 For bug reports: https://github.com/sifive/freedom-tools/issues force hard breakpoints Info : clock speed 100 kHz Info : JTAG tap: d125.cpu tap/device found: 0x10000b6f (mfg: 0x5b7 (unknown), part: 0x0000, ver: 0x1) Error: d125.cpu: IR capture error; saw 0x00 not 0x01 Warn : Bypassing JTAG setup events due to errors Info : starting gdb server for d125.cpu on 3333 Info : Listening on port 3333 for gdb connections D125 IDCODE0x10000b6f DTMCS0x000040a1 Info : datacount1 progbufsize2 Info : Examined RISC-V core; found 1 harts Info : hart 0: XLEN32, misa0x40901125 D125 CPU examination complete; GDB port 3333. Attach GDB to halt. Info : tcl server disabled Info : Listening on port 4444 for telnet connections如何判断连接状态TAP IDCODE 为0x10000b6f显式读取 DTMCS 为0x000040a1。配置仅在两个读值匹配后执行 CPU examine不匹配时停止不应删除校验强行继续。日志显示识别到一个 RV32 hart但IR capture error 仍然存在不等于整个扫描链已无异常。本记录在初始校验报错后显式扫描成功并完成 CPU examine这不是适用于所有 IR 错误的通用修复。端口监听成功不代表 CPU halt、寄存器读取、断点或 Flash 操作已经验证。D213四线 JTAG 硬件与配置D125 使用两线 cJTAGD213 在本文使用项目提供的D21x 四线 IEEE 1149.1 JTAG 配置两者不能混用。D213 配置文件和 TAP 名保留为d21x不改成d125。FT232H 信号D213 目标信号方向相对适配器D0 / ADBUS0TCK输出时钟D1 / ADBUS1TDI输出数据D2 / ADBUS2TDO输入数据D3 / ADBUS3TMS输出状态控制GNDGND共地D4 / ADBUS4nTRST可选核对板级设计复位输出配置初始拉高D5 / ADBUS5nSRST可选核对板级设计复位输出配置初始拉高四线 JTAG 不短接 D1/D2也不启用ftdi_oscan1_mode。当前资料未给出 D213 的 GPIO 名、封装脚号或排针编号接线前必须按实际原理图和 pinmux 确认不能沿用 D125 PA10/PA11。reset_config none表示本配置不主动执行硬件复位初始拉高并不代表两根复位线适用于所有目标板。基础连接可不接复位线。D213 配置文件下载 openocd-d21x-ft232h.cfg。下面内容与项目提供的配置同步中文注释在英文文章中也原样保留方便比对。# D21x FT232HSiFive OpenOCD 2020.11.0。 # 目标为 IEEE 1149.1 四线 JTAGTCK/TDI/TDO/TMS不要开启 cJTAG/OSCAN1。 adapter driver ftdi ftdi_vid_pid 0x0403 0x6014 ftdi_channel 0 # 多块 FTDI 同时在线时取消下一行注释并填入序列号。 # ftdi_serial YOUR_FT232H_SERIAL transport select jtag # ADBUS0TCK、ADBUS1TDI、ADBUS3TMS 输出ADBUS2TDO 输入。 # ADBUS4/5 作 nTRST/nSRST初始拉高避免上电就把目标按在复位里。 ftdi_layout_init 0x0030 0x003b # nTRSTADBUS4nSRSTADBUS5本配置 reset_config none这两根线不主动翻转。 ftdi_layout_signal ntrst -data 0x0010 # 接到目标 SRST 时使用。 ftdi_layout_signal nsrst -data 0x0020 if {![info exists ADAPTER_KHZ]} { set ADAPTER_KHZ 100 } adapter speed $ADAPTER_KHZ reset_config none # RISC-V DTMIR 长度 5IDCODE0x10000b6f。先建 TAPexamine 放到后面手动做。 jtag newtap d21x cpu -irlen 5 -expected-id 0x10000b6f target create d21x.cpu riscv -chain-position d21x.cpu -defer-examine bindto 0.0.0.0 gdb_port 3333 telnet_port 4444 tcl_port disabled gdb_breakpoint_override hard # 不加载 flash 算法不做 RAM 初始化、硬件复位或自动 halt。 # init 时 TDO 空闲电平会被当成后续 TAP并触发 IR capture 告警。 # 先关掉非 d21x 的 TAP再读 IDCODE(IR0x01) 和 DTMCS(IR0x10)匹配后才 examine。 init echo D21x taps after init: [jtag names] foreach tap_name [jtag names] { if {![string match d21x.* $tap_name]} { echo Disabling extra TAP $tap_name jtag tapdisable $tap_name } } runtest 5 irscan d21x.cpu 0x01 set d21x_id [drscan d21x.cpu 32 0] irscan d21x.cpu 0x10 set d21x_dtmcs [drscan d21x.cpu 32 0] echo D21x IDCODE0x$d21x_id DTMCS0x$d21x_dtmcs if {$d21x_id ne 10000b6f || $d21x_dtmcs ne 000040a1} { error D21x probe mismatch; refusing CPU examination. } d21x.cpu arp_examine echo D21x CPU examination complete; GDB port 3333. Attach GDB to halt.D213 启动与检查以下命令保留本次日志使用的目录名请按实际 OpenOCD 安装目录调整。.\OpenOCD\bin\openocd.exe -f .\openocd-d21x-ft232h.cfg此配置列出初始化后的 TAP禁用名称不匹配d21x.*的 TAP执行runtest 5再校验 IDCODE 和 DTMCS。该处理针对项目当前连接不是通用多 TAP 链配置真实多器件链不可直接照搬。配置预期 IDCODE 为0x10000b6f、DTMCS 为0x000040a1匹配后才执行d21x.cpu arp_examine。下面新增的项目 D21x 实板日志中两项读值均匹配且 CPU examine 完成。错误时先核对接线、芯片与扫描链不删除校验绕过失败。D125 和 D213 配置均使用 GDB 3333、Telnet 4444同一主机只启动其中一个或自行规划不冲突的端口。GDB 连接步骤见下节D213 必须选用与 D213 板上固件匹配的 ELF。D21x 实板运行日志以下为项目新增的运行记录保留原始读值Open On-Chip Debugger 0.10.0dev (SiFive OpenOCD 0.10.0-2020.11.0) Licensed under GNU GPL v2 For bug reports: https://github.com/sifive/freedom-tools/issues force hard breakpoints Info : clock speed 100 kHz Info : JTAG tap: d21x.cpu tap/device found: 0x10000b6f (mfg: 0x5b7 (unknown), part: 0x0000, ver: 0x1) Info : starting gdb server for d21x.cpu on 3333 Info : Listening on port 3333 for gdb connections D21x taps after init: d21x.cpu D21x IDCODE0x10000b6f DTMCS0x000040a1 Info : datacount2 progbufsize2 Info : Examined RISC-V core; found 1 harts Info : hart 0: XLEN64, misa0x800000000094112d D21x CPU examination complete; GDB port 3333. Attach GDB to halt. Info : tcl server disabled Info : Listening on port 4444 for telnet connectionsD21x 日志解读D21x taps after init: d21x.cpu本次仅列出一个 TAP没有出现禁用额外 TAP 的日志。IDCODE 为0x10000b6fDTMCS 为0x000040a1通过脚本校验。datacount2 progbufsize2识别到一个 hartXLEN64、misa0x800000000094112d属于 RV64。这份日志未出现 D125 记录中的 IR capture error配置中的兼容处理仍保留但不能将“可能出现告警”写成本次已发生。GDB 3333 和 Telnet 4444 已监听日志没有 GDB 客户端连接、halt 或断点记录不据此宣称这些操作已验证。D125 与 D21x 的 IDCODE/DTMCS 在这两次记录中相同不能仅凭这两个值识别芯片型号需结合实际板卡、配置和 CPU 检查结果。使用 GDB 连接准备与目标 RISC-V 架构兼容的 GDB以及与板上当前固件匹配、带调试信息的 ELF。下面的riscv64-unknown-elf-gdb.exe仅为工具名示例需替换为 SDK 实际提供的 GDBD125 需要支持 RV32本次 D21x 记录需要支持 RV64。保持 OpenOCD 窗口运行在另一个终端启动riscv64-unknown-elf-gdb.exe .\firmware.elf随后在 GDB 提示符中执行target extended-remote 127.0.0.1:3333 monitor halt info registers x/8i $pc bt启动时指定 ELF 只在主机加载符号不会自动烧写固件。连接与 halt 会影响目标运行测试前让电机、执行器等受控外设处于安全状态。回溯质量取决于符号、优化选项和当前执行状态。若需要断点使用固件中实际存在的函数名hbreak your_function continueyour_function是占位符运行过程中可按 CtrlC 请求中断再检查寄存器。硬件断点数量有限。已运行过的初始化函数不会因设置断点而重新执行。结束前可删除断点根据是否需要恢复目标显式选择monitor resumedelete breakpoints monitor resume detach quit不要直接套用load、run或monitor reset halt。本配置未提供固件下载、RAM 初始化及板级复位保证附加调试不等于支持重新启动或烧写。通用连接与 halt 命令参考OpenOCD GDB 文档、OpenOCD 通用命令。这些文档不验证本例 D125 的电气连接或旧版驱动行为。常见问题匠芯创 D125 使用 FT232H 时PA10 和 PA11 分别接什么PA10 是 JTAG_MS / TMSC接 FT232H 的 D1/D2 共用数据节点PA11 是 JTAG_CK / TCKC接 D0。两脚选择功能 8并与目标板共地。D125 cJTAG 是否已经实板验证是项目已确认本例连接经过实板验证提供的日志记录了 IDCODE、DTMCS 和 RV32 CPU examine。验证结论不自动覆盖其他适配器、所有 GDB 操作或 Flash 烧写。这份 OpenOCD 配置可以烧写 D125 Flash 吗本配置未提供 Flash 算法不应作为烧写配置。它用于连接与 CPU 检查文章另提供 GDB 附加指引。相关教程匠芯创 D126 Wi-Fi / BLE 使用。排查要点现象优先检查找不到 FTDI 设备USB 枚举、VID/PID、驱动、是否被其他程序占用多适配器时指定序列号不认识 ftdi_oscan1_modeOpenOCD 分支及构建版本是否与记录一致IDCODE / DTMCS 不匹配PA10/PA11 接线、共地、电平、pinmux、供电与时钟速度IR capture error保留完整日志结合显式读值及 CPU examine 判断不能仅屏蔽校验GDB 无法连接OpenOCD 是否仍在运行、3333 端口是否被占用、本机地址是否正确连接后 halt 或读寄存器失败CPU 调试状态、链路稳定性、固件对调试引脚的复用及旧驱动兼容性符号地址或回溯异常ELF 是否与当前板上固件一致是否包含调试信息
阅读完成 · 觉得有帮助?
咨询建站