OpenOCD JTAG协议开发完全指南

OpenOCD JTAG协议开发完全指南

版本: 1.0
日期: 2026年1月
适用范围: RISC-V调试、FPGA开发、嵌入式系统调试


目录

  1. JTAG基础概念
  2. OpenOCD架构
  3. JTAG协议层次
  4. JTAG状态机
  5. IR/DR扫描操作
  6. OpenOCD API详解
  7. RISC-V调试规范
  8. 实际应用案例
  9. 常见问题排查

JTAG基础概念

什么是JTAG?

JTAG (Joint Test Action Group) 是一个工业标准接口,用于:

  • 芯片测试- 制造后验证芯片功能
  • 边界扫描- 访问芯片内部逻辑
  • 在系统编程- 无需特殊编程器的固件烧写
  • 调试- 实时访问处理器状态和内存

JTAG的四线接口

TCO (Test Clock Out) ← 时钟信号,由主控端驱动 TDI (Test Data In) ← 数据输入线 TDO (Test Data Out) → 数据输出线 TMS (Test Mode Select) ← 控制线,选择状态机状态 (可选) TRST (Test Reset) ← 异步复位信号

JTAG链

┌─────────────────────────────────────┐ │ PC/主控设备 (USB-JTAG适配器) │ │ (OpenOCD运行于此) │ └─────────────┬───────────────────────┘ │ TCO, TDI, TDO, TMS │ ┌─────────────▼───────────────────────┐ │ TAP 1 (device 1) │ │ ┌──────────────────────────────┐ │ │ │ TAP Controller │ │ │ │ (状态机) │ │ │ │ ┌────────────────────────┐ │ │ │ │ │ IR (指令寄存器) │ │ │ │ │ │ DR (数据寄存器) │ │ │ │ │ └────────────────────────┘ │ │ │ └──────────────────────────────┘ │ └──────────────┬──────────────────────┘ │ 级联到下一个设备 ┌──────────────▼──────────────────────┐ │ TAP 2 (device 2) │ │ ... │ └─────────────────────────────────────┘

在我们的KU060系统中

  • TAP 1: FPGA本身 (Xilinx Kintex UltraScale)
  • TAP 2: Nuclei RISC-V处理器

OpenOCD架构

分层架构

┌──────────────────────────────────────────────┐ │ 用户接口层 │ │ ├─ TCL命令 (mdw, mww, halt, resume等) │ │ ├─ GDB协议 (arm-none-eabi-gdb) │ │ └─ 远程调试接口 (TCP/IP) │ └────────────────┬─────────────────────────────┘ │ ┌────────────────▼─────────────────────────────┐ │ 目标相关层 (Target Layer) │ │ ├─ RISC-V调试器 (riscv.c) │ │ ├─ ARM调试器 │ │ ├─ 通用内存访问接口 │ │ └─ 寄存器管理 │ └────────────────┬─────────────────────────────┘ │ ┌────────────────▼─────────────────────────────┐ │ JTAG核心层 (JTAG Core) │ │ ├─ TAP扫描处理 │ │ ├─ 队列管理 (command queue) │ │ ├─ 状态机管理 │ │ └─ IR/DR操作 │ └────────────────┬─────────────────────────────┘ │ ┌────────────────▼─────────────────────────────┐ │ 驱动层 (Adapter Layer) │ │ ├─ FTDI驱动 (USB-JTAG适配器) │ │ ├─ 并口JTAG驱动 │ │ ├─ 网络JTAG驱动 │ │ └─ 其他调试接口驱动 │ └────────────────┬─────────────────────────────┘ │ └────────────────▼─────────────────────────────┘ 物理JTAG接口 (TCO, TDI, TDO, TMS)

关键文件位置

文件/目录说明
src/jtag/JTAG核心实现
src/jtag/core.cJTAG队列和TAP管理
src/jtag/drivers/硬件接口驱动
src/target/目标处理器支持
src/target/riscv/RISC-V支持 (riscv.c, riscv-013.c)
tcl/TCL脚本和配置
tcl/interface/接口配置文件
tcl/target/目标配置文件

JTAG协议层次

物理层 (Physical Layer)

时钟频率: 通常 0.1MHz - 50MHz

  • 我们的系统: 1MHz (稳定性考虑)
  • 公式:clock_speed = adapter_freq / 1MHz

信号完整性

TCO (上升沿采样) └─▁▁▁▔▔▔▁▁▁▔▔▔▁▁▁ TMS/TDI (下降沿建立) └─▁▁▔▔▔▁▁▁▔▔▔▁▁▁▔ TDO (旧数据有效) └─XXXX▔▔▔XXXX▔▔▔XXXX ▲ TCO下降沿后有效

传输方向

  • MSB优先 (Most Significant Bit First)
  • 移位寄存器的工作原理类似SPI

寄存器层 (Register Level)

指令寄存器 (Instruction Register - IR)

目的: 选择要操作的数据寄存器

┌────────────────────────────┐ │ JTAG指令集 (IR) │ ├────────────────────────────┤ │ IDCODE | 0x01 │ │ DTMCS | 0x10 │ │ DMI | 0x11 │ │ BYPASS | 0x1F │ │ (其他...) | 芯片相关 │ └────────────────────────────┘

IR扫描流程

1. 进入 IR 扫描状态 2. 在32个TCO周期内串行输入指令位 3. 同时从TDO读出旧指令 4. 指令在离开JTAG扫描链时锁存到IR中
数据寄存器 (Data Register - DR)

包含类型

  • IDCODE DR: 芯片ID (32位)

    ┌─────────────────────────────────────┐ │ Bit 31-28: 版本号 (Version) │ │ Bit 27-12: 部件编号 (Part Number) │ │ Bit 11-1: 制造商代码 (Manuf ID) │ │ Bit 0: 固定为 1 │ └─────────────────────────────────────┘
  • DTMCS DR: 调试模块控制/状态 (32位)

    ┌─────────────────────────────────────┐ │ Bit 31-16: 版本 │ │ Bit 15-12: 地址位数 (abits) │ │ Bit 11-10: 访问大小 (access) │ │ Bit 9-0: 其他状态位 │ └─────────────────────────────────────┘
  • DMI DR: 调试模块接口 (34-50位,取决于配置)

    ┌──────────────────────────────────────┐ │ Bit [1:0]: 操作/响应码 (op) │ │ Bit [33:2]: 数据 (data) │ │ Bit [40:34]: 地址 (addr) │ │ (其他bits可能因实现而异) │ └──────────────────────────────────────┘

命令层 (Command Level)

通过DMI接口发送调试命令:

/* 访问调试寄存器的DMI命令 */typedefstruct{uint32_taddr;/* 目标寄存器地址 */uint32_tdata;/* 数据 (32位) */uint8_top;/* 操作码: 0=noop, 1=read, 2=write */}dmi_cmd_t;/* DMI响应 */typedefstruct{uint32_tdata;/* 返回的数据 */uint8_tresp;/* 响应码: 0=ok, 1=busy, 2=error */}dmi_resp_t;

常用调试寄存器

地址名称说明
0x04DMCONTROL调试模块控制 (halt, resume等)
0x11HARTINFO硬件线程信息
0x40SBCS系统总线控制
0x39SBDATA0系统总线数据0
0x3aSBDATA1系统总线数据1

JTAG状态机

TAP状态机 (TAP State Machine)

标准IEEE 1149.1定义的16个状态和转移:

┌──────────────────┐ │ Test-Logic-Reset │ (初始状态) │ └────────┬──────────┘ │ TMS=0 ▼ ┌──────────────────────────────────┐ │ Run-Test/Idle │ │ (等待状态) │ └────────┬──────────────┬──────────┘ │ │ TMS=1 │ │ TMS=1 ▼ ▼ ┌────────────────┐ ┌─────────────────┐ │ Select-DR-Scan │ │ Select-IR-Scan │ └────────┬───────┘ └────────┬────────┘ │ │ TMS=0 TMS=0 │ ▼ ▼ ┌─────────────────┐ ┌────────────────┐ │ IR-Shift │ │ Capture-DR │ │ (输入IR指令) │ └────────┬───────┘ └────────┬────────┘ │ TMS=1 │ TMS=1 ▼ ▼ ┌────────────────┐ ┌─────────────────┐ │ Shift-DR │ │ IR-Exit1 │ │ (读写DR数据) │ └────────┬────────┘ └────────┬───────┘ │ TMS=1 │ TMS=1 ▼ ▼ ┌─────────────────┐ ┌────────────────┐ │ IR-Pause │ │ DR-Exit1 │ │ (可暂停) │ └────────┬───────┘ └────────┬────────┘ │ TMS=1 │ TMS=0 或 TMS=1 ▼ ▼ (两者都回到对应的Update) ┌────────────────┐ ┌─────────────────┐ │ DR-Pause │ │ IR-Update │ │ (可暂停) │ │ (更新IR) │ └────────┬───────┘ └────────┬────────┘ │ │ TMS=0 TMS=0 │ ▼ 或 TMS=1 │ ┌─────────────────┐ ▼ │ Run-Test/Idle │ ◄─ 循环 ┌────────────────┐ └─────────────────┘ │ DR-Update │ │ (锁存DR数据) │ └────────┬───────┘ │ TMS=0 └──► Run-Test/Idle

关键状态说明

状态说明用途
Test-Logic-Reset复位状态初始化,TAP复位
Run-Test/Idle闲置等待下一条命令
Select-DR-Scan选择DR准备DR操作
Capture-DR捕获DR并行加载移位寄存器
Shift-DR移位DR串行输入/输出数据
DR-Exit1DR退出1退出移位状态
DR-PauseDR暂停可选暂停点
DR-Update更新DR将移位结果锁存
Select-IR-Scan选择IR准备IR操作
Shift-IR移位IR输入新指令
IR-Exit1IR退出1退出移位状态
IR-PauseIR暂停

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1190669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 pip3 一键卸载当前环境中所有已安装的 Python 包(Linux / macOS / Windows)

在 Python 开发过程中,随着不断安装和测试各种库,环境很容易变得臃肿、混乱。 当出现依赖冲突、版本错乱或准备重建环境时,一次性卸载所有第三方包是一个高效的解决方案。 本文介绍一种通用、安全、可控的方法,适用于:…

【总结】说课基本框架

高中信息技术课程说课的基本框架通常围绕教学设计的系统性、科学性和育人价值展开,强调以学生为中心、项目驱动、素养导向。根据所提供的知识库内容,可总结出一个清晰、通用且符合当前教改趋势的说课结构如下:一、教…

Linux运维必备:一个LVM管理添加和扩容脚本的诞生记(完整版)

从简单需求到踩坑无数,最终炼成自动化神器。本文记录了一个LVM管理脚本的完整开发历程,包含所有踩过的坑和最终解决方案。附赠可直接使用的纯净版脚本。一、起因:一个看似简单的小需求那天,一位运维兄弟在群里求助:&qu…

openocd操作ku060板子记录

OpenOCD 操作 KU060 FPGA 核心原理 概述 本文档深入解析 OpenOCD 如何通过 JTAG 接口操作 KU060 FPGA 开发板,包括 Flash 刷写、内存检查、GDB 调试和板子状态检查等核心功能的底层原理。1. OpenOCD 架构与连接原理 1.1 JTAG 接口连接 主机(PC) --USB--> FT2232 …

《排序算法全解析:从基础到优化,一文吃透八大排序!》

本文详解冒泡、选择、插入等基础排序,以及快排、归并、堆排、希尔等高级排序的原理、c语言代码实现,对比各算法时间复杂读/空间复杂度,附代码详细注释,帮你彻底搞懂排序!一、为什么我们需要读懂排序--不止于"…

Linux命令大全-grep命令

一、简介grep(英文全拼: Global Regular Expression Print)命令用于查找文件里符合条件的字符串或正则表达式,并将符合条件的内容进行输出。二、语法语法:grep [选项]... PATTERN [FILE]...PATTERN:是一个基本正则表达式(缩写为BRE)&#xff…

ue c++编译报错解决

目录 e1696 无法打开 源 文件 "IMQTTClient.h" 解决方法: e1696 无法打开 源 文件 "IMQTTClient.h" 解决方法: 删除 目录: .vs Binaries Intermediate Saved 选中文件: MetahumancharacterHeiXi.uproje…

解析nanogpt - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

计算机毕业设计springboot线上票务系统app 基于Spring Boot的移动票务管理平台开发 Spring Boot框架下的线上票务系统设计与实现

计算机毕业设计springboot线上票务系统app_ck27e (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着互联网技术的飞速发展,线上票务系统已经成为人们日常生活中不可…

集合幂级数全家桶

集合幂级数 exp 求 \(e^{F(x)} = \sum\limits_{i \ge 0} \dfrac{F(x)^i}{i!}\),其中若 \(S \cap T = \varnothing\),则 \(x^S \times x^T = x^{S \cup T}\)。 定义二元函数 \(F(x, y) = \sum x^S y^{|S|} a_S\),这样…

计算机毕业设计springboot大气网格化治理智慧平台-报警处理子系统 基于SpringBoot的城市大气环境网格化智能预警与处置平台 SpringBoot驱动的空气质量网格监管报警协同系统

计算机毕业设计springboot大气网格化治理智慧平台-报警处理子系统9w1d1 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。PM2.5爆表那天,整个城市像被按下了灰色滤镜。…

AtCoder Beginner Contest竞赛题解 | AtCoder Beginner Contest 440

​欢迎大家订阅我的专栏:算法题解:C与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选…

近十届两院增选院士籍贯 / 出生地排行:苏浙皖湘鲁霸榜

整理了近十届两院增选院士的籍贯、出生地数据: ✅ 维度一:院士「籍贯」(最能体现地域文教底蕴) 籍贯人数 TOP20 核心榜单(头部集中度极高) 1、浙江宁波 28 人(全国第一,70年的稳定输…

LeetCode 379 电话目录管理系统

文章目录摘要描述题解答案题解代码分析1. 数据结构的选择2. 初始化方法3. get() 方法:分配号码4. check() 方法:检查号码是否可用5. release() 方法:释放号码6. 为什么使用 Set Array 的组合?7. 边界情况处理示例测试及结果示例 …

量子计算模拟器性能基准测试方法论

随着量子算法在金融建模、药物研发等领域的应用突破,量子计算模拟器已成为经典计算机环境验证量子程序的核心工具。软件测试从业者亟需建立一套针对量子特性的标准化基准测试体系。本文旨在系统阐述测试框架的设计原则、关键性能指标及工具链实践方案,为…

基于微信小程序的电子元器件商城系统源码文档部署文档代码讲解等

课题介绍本课题旨在开发一款基于微信小程序的电子元器件商城系统,适配电子元器件品类多、规格杂、采购场景多元的特性,解决传统采购渠道分散、比价繁琐、库存查询不便等痛点。系统以微信小程序为前端载体,依托Node.js搭建后端服务&#xff0c…

【Linux 网络】拒绝传输卡顿!滑动窗口如何让数据 “跑赢” 等待?

一、滑动窗口滑动窗口大小:指的是无需等待确认应答而可以继续发送数据的最大值;注意:这里的无需等待确认应答,不是不要确认应答,而是暂时不要;站在发送方(主机A 视角):图…

硬核干货:Checkpoint对齐诅咒与Timer风暴——Flink周期性反压的终极排查

第一章:那只准时敲门的“幽灵”——Checkpoint与其背后的IO风暴我们拿到的是一个极其诡异的现场:每30分钟一次,持续5分钟的反压。这不像是因为数据倾斜导致的“长尾”,也不像代码逻辑死循环导致的“猝死”。它太规律了&#xff0c…

基于微信小程序的付费自习室系统源码文档部署文档代码讲解等

课题介绍本课题聚焦付费自习室行业数字化需求,设计并实现一款基于微信小程序的付费自习室系统,解决传统自习室预约繁琐、计费不透明、座位管理低效等痛点。系统以微信小程序为前端交互入口,采用Node.js搭建后端服务,搭配MySQL数据…

基于微信小程序的高校毕业生公考助手系统源码文档部署文档代码讲解等

课题介绍本课题针对高校毕业生公考备考信息零散、规划混乱、刷题低效等痛点,设计并实现一款基于微信小程序的高校毕业生公考助手系统,为毕业生提供一站式公考备考服务。系统以微信小程序为前端载体,采用Node.js搭建后端服务,结合M…