JTAG篇(4)——OpenOCD与JTAG TAP通信
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通信相关推荐
- JTAG篇(5) OpenOCD 写入数据到TAP
OpenOCD 写入数据到TAP OpenOCD 配置文件 JTAG TAP Controller Result OpenOCD为需要访问JTAG指令或数据寄存器的开发人员提供一些底层的控制命令,这些 ...
- JTAG篇(2)——FT2232H 控制 JTAG TAP
FT2232H 控制 JTAG TAP 简介 dependencies JTAG TAP 控制器实现 TAP简介 TAP Verilog实现 FT2232H 驱动JTAG 实验结果 简介 depend ...
- 使用JLink、OpenOCD通过JTAG调试树莓派4
通过JTAG调试树莓派4 硬件环境 使能树莓派JTAG管脚 树莓派与JLink连线 安装JLink驱动 启动openocd 启动gdb 硬件环境 树莓派4一个,本例程使用Raspberry Pi OS ...
- Espressif IDF for VSCode 爬坑之路二:ESP32 的 JTAG 调试(OpenOCD GDB)
今天我们来探索如何在 Espressif IDF 插件里进行 JTAG 调试.如果还未成功安装与入门 Espressif IDF for VSCode,可以先参考 Espressif IDF for ...
- OpenOCD 通过 JTAG 调试树莓派
硬件环境 Linux 主机 + JLink v8 + 树莓派 OpenOCD 简介 OpenOCD(Open On-Chip Debugger)开源片上调试器,是一款开源软件,旨在提供针对嵌入式设备的 ...
- 21天学会Java之(Java SE第十三篇):网络编程、TCP/UDP通信
如今,计算机已经成为人们学习.工作.生活必不可少的工具.人们利用计算机可以和亲朋好友在网上聊天,玩网游或发邮件等,这些功能的实现都离不开计算机网络.计算机网络实现了不同计算机之间的通信,而这些必须依靠 ...
- [网络篇]ESP8266-SDK教程(三)之TCP通信Server-Client
纳尼?昨天刚刚打印了个"Hello World!",今天你就让我学习TCP通信?有没有搞错~哈哈,相信很多读者会很迷,其实学习这东西嘛,单单学一些比较简单的,相信没两天就没人看了, ...
- 第66篇:顶级APT后门Sunburst通信流量全过程复盘分析
Part1 前言 大家好,我是ABC_123.前面几周分享了Solarwinds供应链攻击事件的详细攻击流程及Sunburst后门的设计思路,但是多数朋友还是对Sunburst后门的通信过程还是没 ...
- 第66篇:顶级APT后门Sunburst通信流量全过程复盘分析(修正篇)
Part1 前言 由于先前文章存在部分错误,原文ABC_123已删除,上周末把文章修正,重新发布. 大家好,我是ABC_123.前面几周分享了Solarwinds供应链攻击事件的详细攻击流程及Su ...
最新文章
- VC导入导出二维数组到 .txt
- 基于GDI+用C#编写的.NET流程图控件开发周记(2011-08-28)
- python3.5.2安装pygame_【闲来无事,py写game】Mac-Python3.5安装pygame 1.9.2 小计
- 博弈论 斯坦福game theory stanford week 3.2_
- 如何将多个文本数据转化为指定数据格式[以电影数据为例](数据预处理)
- 【Spark大数据处理】动手写WordCount
- python爬取小说基本信息_Python爬虫零基础实例---爬取小说吧小说内容到本地
- Problem C: 爬楼梯
- 科大讯飞语音合成的引入
- 51单片机下载完程序后不亮_单片机实用工具大全,超级赞,工程师必备!
- 网站上传服务器及安装包,如何上传安装包到服务器
- 小学听力测试英语软件,亲测:好用的小学英语软件有哪些?这6款通通安利给大家!...
- php开源视频cms,迅睿PHP开源视频电影CMS系统
- 2.2 DP: Value Iteration Gambler‘s Problem
- 高三学习计划作文计算机专业,高三学习计划作文.docx
- APP加固各种反调试
- 表单二维码怎么做?二维码怎么统计信息?
- 惹人的应聘简历/邮件是怎样的
- 【CV实战】年轻人的第一个深度学习CV项目应该是什么样的?(支持13大深度学习开源框架)...
- Shell脚本之函数