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 ...
随机推荐
- Web前端一种动态样式语言-- Less
变量 变量允许我们单独定义一系列通用的样式,然后在需要的时候去调用.所以在做全局样式调整的时候我们可能只需要修改几行代码就可以了. // LESS @color: #4D926F; #header { ...
- C#读书笔记之并行任务
这两天遇到一个多线程任务优化的问题,现在解决了,把心得用例子的形式记下来. 假设有四个任务: 任务1:登陆验证(CheckUser) 任务2:验证成功后从Web服务获取数据(GetDataFromWe ...
- 中断(interrupt)、异常(exception)、陷入(trap)
原文出处:http://lhk518.blog.163.com/blog/static/3153998320084263554749/ 中断:是为了设备与CPU之间的通信.典型的有如服务请求,任务完成 ...
- 【BZOJ】【1037】【ZJOI2008】生日聚会party
DP orz iwtwiioi 这种题居然是DP……原来统计方案数是可以用动态规划来做的啊= =用一些变量来维护一些信息,保证方案可行性/合法性 人太弱实在是有些忧伤…… /************* ...
- 客户端发包 GS端接收
客户端发包,GS接收 bool GameServer::ProcessLoop(packet& rPkt)//GS线程做的 { if(false == m_spDataLayer->Re ...
- iOS Automation Test
google resource for KIF: http://www.oschina.net/translate/ios-ui-testing-with-kif
- XSS的原理分析与解剖(一)
0×01 前言: <xss攻击手法>一开始在互联网上资料并不多(都是现成的代码,没有从基础的开始),直到刺的<白帽子讲WEB安全>和cn4rry的<XSS跨站脚本攻击剖析 ...
- C#中Config文件中,特殊符号的书写方法。
App.config: 1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration& ...
- YARN的 AM与RM通信,申请资源分配过程
AppMaster向RM请求资源 MRAppMaster :serviceinit // service to allocate containers from RM (if non-uber) or ...
- HDU 2846 Repository(字典树,标记)
题目 字典树,注意初始化的位置~!!位置放错,永远也到不了终点了org.... 我是用数组模拟的字典树,这就要注意内存开多少了,,要开的不大不小刚刚好真的不容易啊.... 我用了val来标记是否是同一 ...