SWD接口:探索&泄密&延伸
上面已经给出了完整过程和详细分析,以及重要的艳照。当然我是故意没放源码,这么大篇幅文字比源码有用的太多了,自我认为这算是赤裸裸的SWD接口个人开源贴了,打破核垄断人人都能玩转SWD,不算之前对STM32的了解和对JLINK之类的使用,其实我也就两天摸入门了,比几年前从零开始读OBD好太多了。如果什么都不说丢一堆源码有意思么,这篇文章已经把肉送到嘴巴了,只要自己再嚼两口就能吃,文中我略过了一些小细节比如时序图AP传递性之类,我相信一个熟悉STM32的电工看过我文章只用不到一天就能重走一遍我的路。自己重走一遍找到这些小细节更有利于自己的理解,我相信各位不用抄能做出来。SO,不回复不讨论任何SWD细节技术问题,请自行验证自己的疑问和猜想。不然,你还真对不起我码这么长的字,大家尊重一下我哈,下面几段则热烈欢迎大家踊跃讨论,各种讨论。
相信各位电工不用一天已经搞定DEMO了,有完美癖的接下来自行啃ARM文档去了解细节问题,加入各种细节处理追求完美。然后比如位段操作,全局变量,内联函数等等提高速度到极致。比如扩展到ST其他芯片,ATMEL,NXP,FREESCALE等等。
对脱机下载,很显然想到两种,一是直接代替CPU操作,进行ROM烧写,简单直接。另一种就是先下载一个BOOTLOAD到RAM,然后用环形缓冲与BOOTLOAD交互,由BOOTLOAD来烧写FLASH,高级一些通用一些,MDK的芯片烧写算法估计就是个BOOTLOAD。又涉及保密问题了,别人可以监听时序。由此引入UID问题,BOOTLOAD也得是动态,先读UID回来,修改BOOTLOAD再下载BOOTLOAD,BOOTLOAD运行后读UID校验,校验OK才能与下载器交互,下载的ROM也是UID修改过的。具体如何修改和加密各有想法。当然别人可以抓出BOOTLOAD然后跑虚拟机研究或者反汇编研究。又当然对商品下载器可以每个客户给一个加密算法的BOOTLOAD,烧写员是老板自己心腹,屌丝电工产品没好到对方愿意不惜一切代价反汇编破解。
对调试器,你能做到JLINK的兼容性?你能做到JLINK的功能细节?你愿意花多少精力去嵌入IDE(搜了下COOCOX是实现了嵌入IDE)?你有多少时间闲折腾?你做好了能卖钱不会为别人做嫁衣?回答全是NO.但是屌丝电工们还是很容易满足的,第一咱们可以将DAP嵌入工程内,满足嵌入IDE的要求,满足单步和断点这种侵入式调试的要求。第二咱有白菜TFT+FLASH,脱机下载+调试PRINTF记录搞定。第三咱有物美价廉480M USB的高速CM4芯片,一头USB通电脑,一头通被调试芯片,读写内存刷刷刷。以内存并行读写为基础做非侵入调试功能。对SCOPE功能,支持多种类型变量。任意指定每个变量的采样间隔,这就变成了一个每个通道都可以分别设置采样率的片上示波器&逻辑仪,我们的实体示波器还只能统一采样率呢。如果上位机还支持逻辑仪解码插件呢?只给出接口DLL和范例程序,支持范例程序脚本编程,支持自己任意设计,支持分享优秀设计呢?屌丝电工们有木有高大上感觉。对于RTT功能,没啥好说的,相当于将串口打印从串口&USB转移到SWD.好处依然是非侵入,比如单片机本来就是USB与上位机通信的,不用在USB通信中插入调试交互去挤占或影响正常通信,咱另修一条高速通道做调试交互。黑白超级终端滚粗,早看你不顺眼了,调试交互软件想怎么任性就怎么设计。依然给出接口DLL给出范例程序带脚本编程分享优秀设计。当然别忘了还能脱机记录调试信息,睡个觉抽根烟再来分析现场故障哦,对啦,脱机记录还能预设与被调试系统的应答哦,而非傻乎乎只知道抄写记录。最后,AVR的ARDUINO火的一塌糊涂,CCDEBUG可以SPI连接无线芯片,USBEE虚拟示波器也有意思。我们为毛不可以结合他们做个类似的傻瓜化工具,调试器将CPU 停掉接管资源,电脑简单控制语言控制调试器对被调试芯片的访问,比如类C代码ad_get(1,3); 指挥调试器去写被调试芯片的AD模块,并返回结果到电脑。 如果我用个WHILE(1) AD_GET(1,3);呢,那不就是USBEE一样了。 如果我用个 if(AD_GET(1,3) > 300) led_on(); 呢,那不就是ARDUINO类似了。 总之,对现有ARM板子,小朋友们可以不会单片机不装编译器也能玩,具体实现方法很多。最后的最后,我们是单纯的屌丝电工,乐于吃着地沟油分享技术,不是想到个东西就考虑钱,这个设计显然是开源共享的。
JTAG接口还没研究,等年后哪天有时间,得来个姊妹篇 JTAG接口:探索&泄密&延伸
对啦,说起JLINK,又说几句,JLINKV9出来后翻找了一些JLINK的帖子,得知APP是明码放在DLL文件里,直接提取的。BOOT是通过木马APP搞出来的,木马APP的关键是通过BOOT或上位机的验证才能下进去。已经有不少人搞定了,SO,SEGGER应该是对加密没太上心,大家可以讨论下对JLINK BOOT的分析,以及如何防范别人窃取。
看样子你前面磕磕碰碰完成了SWD接口基本时序-》读写DP接口--》读写AP接口,现在卡在读取单片机普通寄存器阶段了,过了普通寄存器阶段还有一个阶段就是内核和调试模块。至此基本就全部完了。加油,马上就要搞定了。
摘录几句 希望能帮到你
//AP寄存器 APREG比较多 地址包括A[3:2]以及DPREG_SELECT即A[7:4]组成 32位地址所以低两位无效
#define apreg_dgromaddr (0xf8>>2)//只读 存放ROM_TAB绝对地址的寄存器 这个一个AP寄存器地址定义
//各种寄存器读写操作宏定义 START DP/AP wr/RD A3:2 PAR STOP FREE
#define code_regr_rom (( bv(1)| bv(2)|(2<<3))>>1 ) //读取ROM_TAB地址 命令 读取这个AP寄存器的操作编码
status = swd_transfer(code_regr_rom ,dat);// 选择存放有ROM_TAB绝对地址的AP寄存器 本次读是读不回本次结果的 每次只能读回上一次结果 所以作为单独测试的DEMO 这次读回来的值扔掉
status = swd_transfer(code_regr_rbuf ,dat);//读取ROM_TAB的绝对地址 这次读到了上一条操作的结果 注意通过AP寄存器去读其他寄存器时候有延迟一拍,下一拍读上一拍的结果 最后一次用dpreg_readbuf读取最后一拍结果
rom_addr = dat[0]&0xfffffffc; //获取到的ROM_TAB绝对地址编码
status = swd_transfer(code_regw_addr ,&rom_addr); //选择读ROM_TAB绝对地址
status = swd_transfer(code_regr_dat ,dat);//读数据 依然本次操作要下一拍读回 本次读回的数据没用
status = swd_transfer(code_regr_rbuf ,dat);//读数据 都会了ROM_TAB绝对地址里面装的内容了
总结的说,AP和DP模块用的相对地址,可以调试器直接访问的。但各家单片机的地址映射表不同,包括FLASH RAM REG的位置都不同,需要绝对地址访问,这些都没法摸瞎访问。有个ROM_TAB记录了各个调试模块的绝对地址位置,但是这个ROM_TAB本身也是放在FLASH里的,也要通过绝对地址访问,各家也不同。于是就在AP里有个寄存器保存了这个ROM_TAB的绝对地址, 这样就可以一步步按图索骥。 先由AP的某个寄存器找到ROM_TAB的绝对地址,再访问ROM_TAB的绝对地址找到各个调试模块的绝对地址,然后就可以去访问各个调试模块了。 另外AP有个特性,通过它去读别的东西,本次只发出指令去操作,操作结果要等一下才有返回,你得下一拍去读回结果,估计写也是一样,但是写你不用管写完,所以感受不到。如果要读一串N个,每个都顺带取回前一个的结果,倒是不碍事,总共也只多费一个操作。如果是读一个,也是多费一个操作,效率就相当于折半了 N/(N+1) VS 1/ (1+1)
注意了这两点应该不难了,祝你成功 @tgwfcc
JTAG虽然对ARM下载已经不重要,有两线的SWD好用的很。但是在这个遍地JTAG接口的时代,不知道JTAG的电工还真不好意思,没准哪天调试别的东西遇到问题就要这个。问题来了,JTAG没法用硬件SPI,怎么让它速度快。为什么复位后直接读DP是IDCODE,读IR没有被旁路的器件是1000格式,被旁路的器件是1111格式,有相关规定么,读过JTAG正规文档的高手们,给说下呗。
SWD接口:探索&泄密&延伸的更多相关文章
- 也谈SWD接口协议分析
这几日看到坛里有几个关于SWD协议相关的文章,自己也尝试了下,有点体会,也有些疑惑,写出来与大家分享和交流下. 以下我的模拟SWD接口的板子简称为Host,目标MCU(即我要连接的板子)简称为T ...
- stm32的swd接口的烧写协议是否公开的呢?
stm32的swd接口的烧写协议是否公开的呢? 需要用一台好的示波器来抓才能有足够的存储深度,保证你能够过滤掉那个该死的50clock. 按照Arm的手册,每次转换发送方都需要一个TNR---但是我观 ...
- SWD 接口电路
- 浅论各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别
JTAG协议 JTAG(Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试.现在多数的高级器件都支持JTAG协 ...
- 用SWD调试接口测量代码运行时间 ( SWO )
用SWD调试接口测量代码运行时间 关于时间测量的种种问题 在嵌入式中,我们经常需要测量某段代码的执行时间或测量事件触发的时间,常规的思路是: 1:在测量起始点,反转电平2:在测量结束点,再次反转电平 ...
- 【转】keil+stm32+jlink利用swd方式进行printf输出
出处:http://www.douban.com/note/248637026/ ----------------------------------------------------------- ...
- Stm32 SWD 下载 调试配置
找到一篇比较好的 关于stm32 SWD模式 下载 调试 配置文章 整理如下: 我们比较常用的是Jlink下载器 ,这种下载器有一个缺点就是使用的Jtag 20PIN接口,太多的PIN会 ...
- SWD模式和JTAG模式
一.功能 SWD模式:仿真 下载 JTAG模式:仿真 下载 二.接口 1.J-link JTAG/SWD接口 2.开发板接口电路 ①SWD模式 4根线(包片机) ②JTAG模式 20脚JTAG(网络) ...
- SWD通讯
这几日看到坛里有几个关于SWD协议相关的文章,自己也尝试了下,有点体会,也有些疑惑,写出来与大家分享和交流下. 以下我的模拟SWD接口的板子简称为Host,目标MCU(即我要连接的板子)简称为T ...
随机推荐
- iOS 进阶 第十四天(0416)
0416 注意调用关系,如下图: 就是initWithCoder:.initWithFrame.setup方法三元组
- JSP的编译指令
JSP有3个编译指令,是通知JSP引擎的消息,它不直接生成输出.编译指令都有默认值,无须为每个指令设置值. 常见的编译指令有如下三个: page:针对当前页面的指令. include:指定包含另一个页 ...
- jquery介绍
1.jQuery (1)jQuery简介 是一个js框架(.js文件),它的最大特点是,使用选择器( 借鉴了css选择器的语法)查找要操作的节点,并且将这些 节点封装成一个jQuery对象,通过调用j ...
- 查mysql字段中的数字记录
select * from a where nameregexp '^[0-9]+$' ;
- Node.js 学习(五)Node.js 事件循环
Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发. Node.j ...
- java调用http请求json
最近遇到的问题,java如何调用http请求json: public class HttpClientUtil { private static final String CONTENT_TYPE_T ...
- 基于AutoCAD的空间数据共享平台雏形
好久没有更新博客了,今天先透露一个新的产品——AutoMap.我自己对于这个产品的定位是“基于AutoCAD的空间数据共享平台”.用一句话来概括AutoMap的功能:为用户提供一个在AutoCAD下访 ...
- DOM中事件绑定补充方法
先将上一篇文章中提到的为元素增加事件的方法和移除事件的方法拿过来: <span style="font-size:18px;">//跨浏览器添加事件 function ...
- 【POJ】【1821】Fence
DP/单调队列优化 题意:k个人粉刷总长为n的墙壁(或者说栅栏?),每个人有一个必刷点s[i](这个人也可以一点也不刷,如果刷就必须刷这个点),最大粉刷长度l[i](必须是连续粉刷一段),和粉刷一格的 ...
- Android本地服务
一.服务生命周期总结 (一).单独开启服务,并没有绑定服务Activity中调用startService(),服务的lifecycle:onCreate()→onStartCommand()→onSt ...