OpenOCD与JTAG TAP通信

  • OpenOCD 简介
    • 运行OpenOCD
  • JATG TAP Controller
  • Result

OpenOCD 简介

OpenOCD (Open On-Chip_Debugger)是一个开源的片上调试器,它主要是为嵌入式设备(如ARM,STM32,ATMEL,FPGA/CPLD等)提供调试、系统编程以及边界扫描等功能。

当然OpenOCD实现这些功能需要借助于**硬件调试器/适配器(Debug Adapter)**来辅助完成.
The debug adapter is a small hardware module which help provide the right kind of electrical signaling to the target being debugged.

硬件调试器/适配器来说即是可以支持系统在线编程(下载程序)的转换器, 多为USB —> JATG或SW.
dongle: a small device that plugs into a computer and servers as an adapter.

运行OpenOCD

配置 OpenOCD 有两种基本方法,当然你也可以通过多种方式混合使用它们
• 在命令行中多个 -f file-c command
• 不带任何选项,但是在当前文件夹中有一个名为 openocd.cfg的用户配置文件


用户配置文件

interface ftdi
ftdi_vid_pid 0x0403 0x6010# ftdi_channel 0 is port ADBUS, ftdi_channel 1 is port BDBUS.
ftdi_channel 1#adapter_name
transport select jtag
adapter_khz 10# ftdi_layout_init data direction
ftdi_layout_init 0x0038 0x00FB
ftdi_layout_signal nSRST -oe 0x0040
ftdi_layout_signal TRST -oe 0x0010 -data 0x0010ftdi_layout_signal led2 -data 0x0080 -oe 0x0080
ftdi_layout_signal led3 -data 0x0040 -oe 0x0040set _CHINPNAME custom
jtag newtap custom tap -irlen 4 -expected-id 0x149511c5 init
#jtag_init
ftdi_set_signal led2 1
ftdi_set_signal led3 0#verify_ircapture enable
#verify_jtag enable#pathmove RESET  DRSELECT
foreach tapname [jtag names] {puts [format "TAP: %s\n" $tapname]
}irscan custom.tap 0x8  -endstate RUN/IDLE

JATG TAP Controller

// Define IDCODE Value
`define IDCODE_VALUE  32'h149511c5
// 0001             version
// 0100 1001 0101 0001 part number (IQ)
// 000 1110 0001      manufacturer id (flextronics)
// 1                required by standard// Length of the Instruction register
`define    IR_LENGTH   4// Supported Instructions
`define EXTEST          4'b0000
`define SAMPLE          4'b0001
`define PRELOAD         4'b0011
`define IDCODE          4'b0010
`define DEBUG           4'b1000
`define MBIST           4'b1001
`define BYPASS          4'b1111module jtag_tap(// JTAG pinsinput  wire  tms_pad_i,      // JTAG test mode select padinput  wire  tck_pad_i,      // JTAG test clock padinput  wire  tdi_pad_i,      // JTAG test data input padoutput wire  tdo_pad_o,      // JTAG test data output padinput  wire  trstn_pad_i,    // JTAG test reset pad// TAP statesoutput wire  test_rst,output wire  test_idle,output wire  shift_dr,output wire  pause_dr,output wire  update_dr,output wire  capture_dr,// Select signals for boundary scan or mbistoutput wire  ir_extest,output wire  ir_sample,output wire  ir_preload,output wire  ir_mbist,output wire  ir_debug,// TDI signals from sub-modulesinput wire  debug_tdo_i,    // from debug moduleinput wire  bs_chain_tdo_i, // from Boundary Scan Chaininput wire  mbist_tdo_i    // from Mbist Chain
);wire     sel_dr_scan;wire     exit1_dr;wire     exit2_dr;wire     sel_ir_scan;wire     capture_ir;wire     shift_ir;wire     exit1_ir;wire     pause_ir;wire     exit2_ir;wire     update_ir;// Wires which depend on the current value in the IRwire     ir_idcode;wire     ir_bypass;/***********************************************************************************   TAP State Machine: Fully JTAG compliant                                       ***********************************************************************************/parameter ST_TEST_RST    = 4'hF;parameter ST_TEST_IDLE   = 4'hC;parameter ST_DR_Scan     = 4'h7;parameter ST_Capture_DR  = 4'h6;parameter ST_Shift_DR    = 4'h2;parameter ST_Exit1_DR    = 4'h1;parameter ST_Pause_DR    = 4'h3;parameter ST_Exit2_DR    = 4'h0;parameter ST_Update_DR   = 4'h5;parameter ST_IR_Scan     = 4'h4;parameter ST_Capture_IR  = 4'hE;parameter ST_Shift_IR    = 4'hA;parameter ST_Exit1_IR    = 4'h9;parameter ST_Pause_IR    = 4'hB;parameter ST_Exit2_IR    = 4'h8;parameter ST_Update_IR   = 4'hD;reg [3:0] cur_state /* synthesis preserve */ ; reg [3:0] nxt_state; // sequential part of the FSMalways @ (posedge tck_pad_i or negedge trstn_pad_i) beginif(~trstn_pad_i) cur_state <= ST_TEST_RST;else             cur_state <= nxt_state;endalways@(cur_state, tms_pad_i) begincase(cur_state)ST_TEST_RST  : nxt_state <= tms_pad_i ? ST_TEST_RST : ST_TEST_IDLE ; ST_TEST_IDLE : nxt_state <= tms_pad_i ? ST_DR_Scan : ST_TEST_IDLE ;  ST_DR_Scan   : nxt_state <= tms_pad_i ? ST_IR_Scan : ST_Capture_DR ; ST_Capture_DR: nxt_state <= tms_pad_i ? ST_Exit1_DR : ST_Shift_DR ; ST_Shift_DR  : nxt_state <= tms_pad_i ? ST_Exit1_DR : ST_Shift_DR ; ST_Exit1_DR  : nxt_state <= tms_pad_i ? ST_Update_DR : ST_Pause_DR ; ST_Pause_DR  : nxt_state <= tms_pad_i ? ST_Exit2_DR : ST_Pause_DR ; ST_Exit2_DR  : nxt_state <= tms_pad_i ? ST_Update_DR : ST_Shift_DR ; ST_Update_DR : nxt_state <= tms_pad_i ? ST_DR_Scan : ST_TEST_IDLE ; ST_IR_Scan   : nxt_state <= tms_pad_i ? ST_TEST_RST : ST_Capture_IR ; ST_Capture_IR: nxt_state <= tms_pad_i ? ST_Exit1_IR : ST_Shift_IR ; ST_Shift_IR  : nxt_state <= tms_pad_i ? ST_Exit1_IR : ST_Shift_IR ; ST_Exit1_IR  : nxt_state <= tms_pad_i ? ST_Update_IR : ST_Pause_IR ; ST_Pause_IR  : nxt_state <= tms_pad_i ? ST_Exit2_IR : ST_Pause_IR ; ST_Exit2_IR  : nxt_state <= tms_pad_i ? ST_Update_IR : ST_Shift_IR ; ST_Update_IR : nxt_state <= tms_pad_i ? ST_DR_Scan : ST_TEST_IDLE ; default      : nxt_state <= ST_TEST_RST; endcaseendreg [15:0] tap_out;always@(posedge tck_pad_i or negedge trstn_pad_i) beginif(~trstn_pad_i) begintap_out <= 16'h1;end else begincase(nxt_state) ST_TEST_RST    : tap_out <= 16'h1 ; ST_TEST_IDLE   : tap_out <= 16'h2 ; ST_DR_Scan     : tap_out <= 16'h4 ; ST_Capture_DR  : tap_out <= 16'h8 ; ST_Shift_DR    : tap_out <= 16'h10; ST_Exit1_DR    : tap_out <= 16'h20; ST_Pause_DR    : tap_out <= 16'h40; ST_Exit2_DR    : tap_out <= 16'h80; ST_Update_DR   : tap_out <= 16'h100 ; ST_IR_Scan     : tap_out <= 16'h200 ; ST_Capture_IR  : tap_out <= 16'h400 ; ST_Shift_IR    : tap_out <= 16'h800 ; ST_Exit1_IR    : tap_out <= 16'h1000; ST_Pause_IR    : tap_out <= 16'h2000; ST_Exit2_IR    : tap_out <= 16'h4000; ST_Update_IR   : tap_out <= 16'h8000; endcaseendendassign test_rst    = tap_out[0];       assign test_idle   = tap_out[1];     assign sel_dr_scan = tap_out[2];      assign capture_dr  = tap_out[3];     assign shift_dr    = tap_out[4];   assign exit1_dr    = tap_out[5];   assign pause_dr    = tap_out[6];   assign exit2_dr    = tap_out[7];   assign update_dr   = tap_out[8];    assign sel_ir_scan = tap_out[9];      assign capture_ir  = tap_out[10];     assign shift_ir    = tap_out[11];   assign exit1_ir    = tap_out[12];   assign pause_ir    = tap_out[13];   assign exit2_ir    = tap_out[14];    assign update_ir   = tap_out[15];   reg  select_shift_ir /* synthesis preserve */;always @(posedge tck_pad_i, negedge trstn_pad_i) beginif(~trstn_pad_i) beginselect_shift_ir <= 1'b0;end else beginif(sel_ir_scan)    select_shift_ir <= 1'b1;else if(update_ir) select_shift_ir <= 1'b0;endend/***********************************************************************************                                                                                 **   InstructionShiftReg:  JTAG Instruction Register                                           **                                                                                 ***********************************************************************************/reg [`IR_LENGTH-1:0]  InstructionShiftReg;     // Instruction Shift registerreg [`IR_LENGTH-1:0]  jtag_instr;    // Instruction registeralways @ (posedge tck_pad_i or negedge trstn_pad_i) beginif(!trstn_pad_i)     InstructionShiftReg <= 0; else if(test_rst)    InstructionShiftReg <= 0;else if(capture_ir)  InstructionShiftReg <= 4'b0101;          else if(shift_ir)    InstructionShiftReg <= {tdi_pad_i, InstructionShiftReg[`IR_LENGTH-1:1]};end// Updating InstructionShiftReg (Instruction Register)// InstructionShiftReg should be latched on FALLING EDGE of TCK when capture_ir == 1always @ (negedge tck_pad_i or negedge trstn_pad_i) beginif(~trstn_pad_i)    jtag_instr <= `IDCODE;   // IDCODE selected after resetelse if(test_rst)   jtag_instr <= `IDCODE;else if(update_ir)  jtag_instr <= InstructionShiftReg;endassign ir_extest = (jtag_instr == `EXTEST ) ? 1'b1 : 1'b0; assign ir_sample = (jtag_instr == `SAMPLE ) ? 1'b1 : 1'b0; assign ir_preload= (jtag_instr == `PRELOAD) ? 1'b1 : 1'b0;  assign ir_idcode = (jtag_instr == `IDCODE ) ? 1'b1 : 1'b0;assign ir_debug  = (jtag_instr == `DEBUG  ) ? 1'b1 : 1'b0;assign ir_mbist  = (jtag_instr == `MBIST  ) ? 1'b1 : 1'b0;assign ir_bypass = (jtag_instr == `BYPASS ) ? 1'b1 : 1'b0;/***********************************************************************************                                                                                 **   idcode logic                                                                  **                                                                                 ***********************************************************************************/reg [31:0]  idcode_reg;always @ (posedge tck_pad_i or negedge trstn_pad_i) beginif(~trstn_pad_i)                 idcode_reg <= `IDCODE_VALUE;   // IDCODE selected after resetelse if(test_rst)                idcode_reg <= `IDCODE_VALUE;else if(ir_idcode & capture_dr)  idcode_reg <= `IDCODE_VALUE;else if(ir_idcode & shift_dr)    idcode_reg <= {tdi_pad_i, idcode_reg[31:1]};end/***********************************************************************************                                                                                 **   Bypass logic                                                                  **                                                                                 ***********************************************************************************/reg   bypass_reg;  // This is a 1-bit registeralways @ (posedge tck_pad_i or negedge trstn_pad_i) beginif(~trstn_pad_i)                 bypass_reg <=  1'b0;else if(test_rst)                bypass_reg <= 1'b0;else if(ir_bypass & capture_dr)  bypass_reg<= 1'b0;else if(ir_bypass & shift_dr)    bypass_reg<= tdi_pad_i;end/***********************************************************************************                                                                                 **   Multiplexing TDO data                                                         **                                                                                 ***********************************************************************************/reg  tdo_mux_out;always @ (negedge tck_pad_i) beginif(select_shift_ir) begintdo_mux_out <= InstructionShiftReg[0];end else begincase(jtag_instr)    // synthesis parallel_case`IDCODE:        tdo_mux_out <= idcode_reg[0];    // Reading ID code`DEBUG:         tdo_mux_out <= debug_tdo_i;      // Debug`SAMPLE:        tdo_mux_out <= bs_chain_tdo_i;   //`PRELOAD:       tdo_mux_out <= bs_chain_tdo_i;   // Sampling/Preloading`EXTEST:        tdo_mux_out <= bs_chain_tdo_i;   // External test`MBIST:         tdo_mux_out <= mbist_tdo_i;      // Mbist testdefault:        tdo_mux_out <= bypass_reg ;      // BYPASS instructionendcaseendendassign tdo_pad_o = (shift_dr | shift_ir) ? tdo_mux_out : 1'bz;
endmodule

Result

JTAG篇(4)——OpenOCD与JTAG TAP通信相关推荐

  1. JTAG篇(5) OpenOCD 写入数据到TAP

    OpenOCD 写入数据到TAP OpenOCD 配置文件 JTAG TAP Controller Result OpenOCD为需要访问JTAG指令或数据寄存器的开发人员提供一些底层的控制命令,这些 ...

  2. JTAG篇(2)——FT2232H 控制 JTAG TAP

    FT2232H 控制 JTAG TAP 简介 dependencies JTAG TAP 控制器实现 TAP简介 TAP Verilog实现 FT2232H 驱动JTAG 实验结果 简介 depend ...

  3. 使用JLink、OpenOCD通过JTAG调试树莓派4

    通过JTAG调试树莓派4 硬件环境 使能树莓派JTAG管脚 树莓派与JLink连线 安装JLink驱动 启动openocd 启动gdb 硬件环境 树莓派4一个,本例程使用Raspberry Pi OS ...

  4. Espressif IDF for VSCode 爬坑之路二:ESP32 的 JTAG 调试(OpenOCD GDB)

    今天我们来探索如何在 Espressif IDF 插件里进行 JTAG 调试.如果还未成功安装与入门 Espressif IDF for VSCode,可以先参考 Espressif IDF for ...

  5. OpenOCD 通过 JTAG 调试树莓派

    硬件环境 Linux 主机 + JLink v8 + 树莓派 OpenOCD 简介 OpenOCD(Open On-Chip Debugger)开源片上调试器,是一款开源软件,旨在提供针对嵌入式设备的 ...

  6. 21天学会Java之(Java SE第十三篇):网络编程、TCP/UDP通信

    如今,计算机已经成为人们学习.工作.生活必不可少的工具.人们利用计算机可以和亲朋好友在网上聊天,玩网游或发邮件等,这些功能的实现都离不开计算机网络.计算机网络实现了不同计算机之间的通信,而这些必须依靠 ...

  7. [网络篇]ESP8266-SDK教程(三)之TCP通信Server-Client

    纳尼?昨天刚刚打印了个"Hello World!",今天你就让我学习TCP通信?有没有搞错~哈哈,相信很多读者会很迷,其实学习这东西嘛,单单学一些比较简单的,相信没两天就没人看了, ...

  8. 第66篇:顶级APT后门Sunburst通信流量全过程复盘分析

     Part1 前言  大家好,我是ABC_123.前面几周分享了Solarwinds供应链攻击事件的详细攻击流程及Sunburst后门的设计思路,但是多数朋友还是对Sunburst后门的通信过程还是没 ...

  9. 第66篇:顶级APT后门Sunburst通信流量全过程复盘分析(修正篇)

     Part1 前言  由于先前文章存在部分错误,原文ABC_123已删除,上周末把文章修正,重新发布. 大家好,我是ABC_123.前面几周分享了Solarwinds供应链攻击事件的详细攻击流程及Su ...

最新文章

  1. VC导入导出二维数组到 .txt
  2. 基于GDI+用C#编写的.NET流程图控件开发周记(2011-08-28)
  3. python3.5.2安装pygame_【闲来无事,py写game】Mac-Python3.5安装pygame 1.9.2 小计
  4. 博弈论 斯坦福game theory stanford week 3.2_
  5. 如何将多个文本数据转化为指定数据格式[以电影数据为例](数据预处理)
  6. 【Spark大数据处理】动手写WordCount
  7. python爬取小说基本信息_Python爬虫零基础实例---爬取小说吧小说内容到本地
  8. Problem C: 爬楼梯
  9. 科大讯飞语音合成的引入
  10. 51单片机下载完程序后不亮_单片机实用工具大全,超级赞,工程师必备!
  11. 网站上传服务器及安装包,如何上传安装包到服务器
  12. 小学听力测试英语软件,亲测:好用的小学英语软件有哪些?这6款通通安利给大家!...
  13. php开源视频cms,迅睿PHP开源视频电影CMS系统
  14. 2.2 DP: Value Iteration Gambler‘s Problem
  15. 高三学习计划作文计算机专业,高三学习计划作文.docx
  16. APP加固各种反调试
  17. 表单二维码怎么做?二维码怎么统计信息?
  18. 惹人的应聘简历/邮件是怎样的
  19. 【CV实战】年轻人的第一个深度学习CV项目应该是什么样的?(支持13大深度学习开源框架)...
  20. Shell脚本之函数

热门文章

  1. LLC谐振电路(三)电路结构原理
  2. 免费企业邮箱和收费企业邮箱有哪些区别?企业邮箱如何申请!
  3. 如何将图片无损放大,图片无损放大的操作方法
  4. rhino 的挤出曲线命令
  5. OKHttp使用详解 (B)
  6. 如何应对刷爆款被隐形降权
  7. linux系统安装T4驱动
  8. 任意深度同步FIFO设计总结(非2次幂)
  9. 后端实现发送短信接口
  10. python 100以内的加法_python随机生成100道100以内的加法试卷