Rocket - debug - Example: DMI
https://mp.weixin.qq.com/s/7suuJ7m2BKCpsHk1K2FzJQ
介绍riscv-debug的使用实例:如何使用DMI。
1. dm
Debug Module实现了调试模块。
2. dmi
Debug Module Interface是对Debug Module的访问接口。
3. DTM
dmi包含在DTM中。DTM是硬件接口相关的,可以是JTAG DTM,也可以是USB DTM。
4. JTAG DTM Registers
1) 支持的寄存器列表
a. 这里的address实际上是要存入IR中的指令编码;
b. 而这些寄存器则是数据寄存器(Data Register);
c. 使用存入IR中的指令编码来选择相应的数据寄存器(Data Register):
2) dmi Register
实现调试模块(Debug Module)访问的核心寄存器,用以实现对调试模块中各个寄存器的读写:
至于dmi寄存器自身,则通过JTAG接口进行访问:
a. 在IR中填入0x11,选择dmi数据寄存器;
b. In Update-DR, the DTM starts the operation specified in op unless the current status reported in op is sticky.
c. In Capture-DR, the DTM updates data with the result from that operation, updating op if the current op isn't sticky.
3) dmcs Register
用于对DTM进行控制以及获取状态:
5. 实例1:To read an arbitrary Debug Module register
A. scan 0x11 into IR,选择dmi数据寄存器;
B. 通过JTAG TDI引脚scan in a proper value for dmi数据寄存器:
a. with op set to 1,
b. and address set to the desired register address;
C. 在Update-DR状态,读操作开始执行;
Update-DR状态是把(可能是串行扫描入的)数据寄存器的值并行输出。这里就是把dmi寄存器的值并出到调试模块(Debug Module),进而促使调试模块开始执行dmi中指定的操作。
D. 在Capture-DR状态,读dmi寄存器的data域,获取返回的目标寄存器中的数据;
Capture-DR状态是把数据并行存入数据寄存器中,这里就是把调试模块返回的数据并行存入到dmi寄存器中。
E. 返回的不只有dmi.data,还有dmi.op,根据op是否为0来确认返回的数据是否合法。
F. 如果返回的数据不合法,则需要更新IR,选择dmcs数据寄存器,将dmireset写1清除op,方便下次再次在Capture-DR状态读取dmi寄存器,获取调试模块返回的目标寄存器的数据;
G. 如此循环,并根据此次访问的经验,来确定下一次在操作开始到返回数据之间应该等多长时间。
6. 实例2:To write an arbitrary Debug Bus register
A. scan 0x11 into IR,选择dmi数据寄存器;
B. 通过JTAG TDI引脚scan in a proper value for dmi数据寄存器:
a. with op set to 2,
b. and address and data set to the desired register address and data respectively;
C. 接下来的操作与读寄存器一样;
7. almost never scan IR?
这里说几乎不需要扫描IR,言过其实。因为要不停的扫描IR切换dmi和dmcs数据寄存器,读取数据、确定数据是否合法。
如果等待的时间合适,刚好在Capture-DR状态返回的op=0,那么就不需要切换。也就不需要更改IR的值。所以这个“almost never”应该是指最开始学习等待时间时需要使用,而后可能都不需要了。
最新文章
- C#设计模式之装饰者
- 看代码学知识之(2) ListView无数据时显示其他View
- BZOJ3551 : [ONTAK2010]Peaks加强版
- C#进制转换
- 上位机用USB做虚拟串口,总算抓到一个纯代码的总结了,没有坑的完美解决。
- Zabbix全方位告警接入-电话/微信/短信都支持
- Python支持中文注释
- Xilium.CefGlue利用XHR实现Js调用c#方法
- angularjs自定义日期过滤器,如:周日(前天 21:24)
- Django中的ORM
- Jenkins中的一些问题解决(~~不断更新~~)
- Navicat连接oracle数据出现的oci问题
- WinSock 异步I/O模型-1
- 访问远程的docker
- ECC公钥格式详解
- 带着新人学springboot的应用09(springboot+异步任务)
- 第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约
- iis7.0 win7如何修改默认iis端口号
- [BZOJ2238]Mst
- EF使用MySql DBFirst产品的问题总结
热门文章
- A. Hilbert's Hotel(数学)
- D. Kefa and Dishes(状压)
- M - Little Pony and Harmony Chest 状压dp
- 201771010113 李婷华 《面向对象程序设计(Java)》第十一周总结
- Linux内核驱动学习(一)编写最简单Linux内核模块HelloWorld
- failed parsing overlays.
- HttpClient之Post接口代码范例
- 如何让html引用公共布局(多个html文件公用一个header.html和footer.html)
- 关于redis内存分析,内存优化
- Oracle用decode函数或CASE-WHEN实现自定义排序