amobbs.com 阿莫电子技术论坛
标题:
[交流][JTAG]跟我学JTAG协议破解——第一弹 初识JTAG TAP状态机
[打印本页]
作者:
Gorgon_Meducer
时间:
2008-11-13 11:02
标题:
[交流][JTAG]跟我学JTAG协议破解——第一弹 初识JTAG TAP状态机
本帖最后由 Gorgon_Meducer 于 2012-9-6 15:05 编辑
[准备知识]
A、基本的状态机知识
B、基本的C语言能力,包括位操作、常用宏定义、数组、指针等常见内容
C、会使用一种单片机
D、熟悉SPI协议的物理原理
E、对JTAG的好奇和兴趣
[ 序 言 ]
JTAG协议是目前应用最广泛的下载和仿真协议,对协议的最初缔造者来说,这也许有点无心插柳柳成荫
的感觉——最初的JTAG协议只是用来辅助专门的硬件质检部门对印刷电路进行检测的。这些老账现不再提了
我们现在看到的各种JTAG下载和仿真协议都是各生产厂商在原有JTAG协议的思想上进行扩充的,并不具有通
用性,甚至连最基本的电路检测部分功能也被加以改造——比如,一个JTAG指令可能在大部分的版本中是4
位长度的,而对于AVR32来说,一个JTAG指令却是5位。总之,现在大行其道的JTAG协议,不变的部分就只有
其核心TAP状态机了。ARM有ARM的JTAG,AVR有AVR的JTAG,51有51的JTAG……
在这样一个缺乏统一标准的“街头”JTAG时代,如果你想学好JTAG下载仿真协议的破解,就必须从TAP
状态机开始。
[原理解析]
在你被复杂的时序图弄得眼花缭乱之前,你应该首先记住以下的断言:
A、JTAG协议的本质与SPI协议并没有什么不同,它等于一个复杂的SS状态机+变长的MOSI和MISO数据移位
操作。不过所谓的变长,都是事先约定好的。
B、JTAG协议是一个同步通讯协议,它是全双工的。它的通讯原则是“以物易物”——即你如果想得到某
些东西,你必须先给与相同长度的内容;你如果只是想发送一些数据,也会自动获取相同长度的内容,
至于交换的内容是否有意义,这是另外一回事了。
C、JTAG协议无论多么复杂,实际上只有4根线起作用(有时候还有两根鸡肋的nSRST和TRST),他们分别
是TMS、TCK、TDI和TDO,他们分别对应SPI协议里面的SS、SCK、MOSI和MISO。在本质上,他们并没有
什么不同。即便是ARM的JTAG那么多的引脚,实际上起作用JTAG的也就这4根线而已。
D、JTAG的数据操作都是基于移位寄存器的。
E、如果JTAG协议在某个下载仿真协议中只是用来发送控制信息和少量的数据,而大量的数据传输是通过
额外的其它引脚进行的,即便这个协议被称为JTAG仿真其本质也早已超过JTAG了,严格来说,不应该
称之为JTAG。因为JTAG协议中就只有4根线(有时候也算上nSRST和TRST)而已。典型的如NEXUS协议。
说了这么多,我们终于可以开始正式的讲解了。
一、从SPI到JTAG
如果熟悉SPI,你会发现SPI是如此的简单、和谐——一根用于二进制位同步的时钟线SCK,一根用于
主机发送到从机的数据线MOSI(Master Out Slave In),一根用于从机发送到主机的数据线MISO(Master
In Slave Out),外加一根用于复位SPI从机控制器以达到通讯同步的控制信号SS(不妨理解为Slave
Synchronization)。如果乐意,你很容易就通过消减MOSI和MISO的方法获得精简的单向通讯。
前面我们提到,JTAG的数据操作都是基于移位寄存器的,这一点和SPI是相同的。JTAG协议的核心在
于能够有效地传输指令和数据,并且传输指令和数据的过程是能够明确的加以区别对待而不会造成歧义的。
如何实现这一功能呢?JTAG协议只是将原本用来复位从机的SS信号扩展为一个状态机。而该状态机每一个
状态都有两个状态触发——在TCK(也就是SCK)的上升沿,TMS(也就是SS)的电平决定了跳转的分支。
下图就是一个典型的TAP状态机,值得庆幸的是,该状态机所有JTAG协议中都会遵守的部分。
如果这是你第一次研究TAP状态机,首先你不必去追究TAP究竟是哪些英文单词的缩写,因为Test Access
Port已经是过去很久的事情了,现在的JTAG状态机虽然功能没变,但早就从事其它“高科技”行业了。
第二眼看着附图,你会发现,其实整个状态机不过分为三个部分:信道选择部分、数据信道和指令信道。
所谓的信道选择,就是图中最顶上由四个状态组成的矩形,分别对应着四个状态:
1、JTAG TAP状态机复位状态
顾名思义,就是进入该状态,将导致整个硬件TAP控制器复位,所有的寄存器都将被初始化。在
TCK的上升沿,TMS为低电平时,进入下一个状态;否则保持不变。
2、JTAG TAP的Run-Test/Idle状态
其实就是“开工”和“休息”的选择分支点。在TCK的上升沿,TMS的高电平将导致状态切换,进
入数据信道的通讯状态;否则保持不变。
3、JTAG TAP的Select-DR Scan状态
Select DR Scan翻译成中文就是“选择数据移位寄存器进行移位操作”,简单说来,就是当我们
在该状态下,TCK的上升沿读取到了TMS的低电平将直接进入数据信道的操作子状态机;在TCK的上升
沿读取到了TMS的高电平,将切换到指令信道的通讯状态。
4、JTAG TAP的Select-IR Scan状态
Select-IR Scan翻译成中文就是“选择指令寄存器进行移位操作”,简单来说,就是当我们在该状
态下,TCK的上升沿读取到了TMS的低电平将直接进入指令信道的操作状态机;在TCK的上升沿读取到了
TMS的高电平,将重新回到JTAG的复位状态。
数据信道和指令信道对应着两个子状态机,从本质上数据和指令并没有任何不同,只是习惯上,指令
的长度固定为4个二进制位(AVR32的JTAG是5个),而数据则随着不同的指令选择了不同长度的指令
寄存器,这个就需要具体查阅相关的协议说明了,比如JTAG IDCODE的长度固定为32位,而AVR32的复
位指令却有5位(很多情况下别指望是8的倍数)。根据阅读前面“选择部分4个状态机”的经验,大家
应该对照着图片自己尝试去理解剩下的两个信道。下面,我只就常见的几个状态进行解释(以数据信
道为例,指令信道可以参考其内容)。
1、Capture DR状态
前文说过,JTAG协议是基于移位寄存器的,其通讯具有“以物易物”的特性,在我们进入真正的数
据传输之前,需要告知JTAG“准备通讯了哦?你有没有东西要给我哈?”,于是Capture DR就是一个
给JTAG机会将需要传达给我们的数据放入指定的移位寄存器中的状态。
2、Shift DR状态
这个状态就是通过TDI和TDO进行数据传输的状态。需要说明的是,即便进入了该状态,TMS上的电平
在TCK的上升沿也是会被读取的,从图中看到,一旦在TMS上读取到高电平,系统就会跳出Shift DR状态
如果此时数据没有传输完成,造成的后果是不确定的。请大家注意,我所说的是不确定,而不是“很严
重”:同样是因为移位寄存的传输特性,有时候并不要求一定要将所有的数据都完整的进行传输,比如
在AVR32中,针对SAB的数据操作,往往只需要进行最关键的部分,详细地内容可以参照相关的数据手册;
但有的时候,数据的不完整传输则会导致很严重的后果,这取决于具体的JTAG通讯协议。所以,为了保
险起见,一旦进入Shift DR状态,在发送最后一个数据之前,请保持TMS为低电平,当要发送最后一个数
据时,应该将TMS设置为高电平,这样,当TCK跳变为上升沿时,系统既完成了最后一个数据的传输,也
成功的退出了Shift DR状态。
3、Exit1 DR状态
该状态提供了我们一个在刚才输入的数据生效前,重新修改的机会。一般情况下,我们直接保持TMS
的高电平,并在TCK的上升沿驱动TAP状态机,直接进入Update-DR状态。
4、Update-DR状态
顾名思义,就是使我们输入的数据生效——一般JTAG内部的动作就是触发一个锁存信号,将移位寄存
器中的内容并行的读取到对应的寄存器中。Update-DR有两个出口,一个是,TMS的低电平对应Run-test/
Idle,还有一个是TMS的高电平对应的Select-DR Scan。这两个操作看似区别不大,但是意义非凡。前者
往往会导致JTAG内部产生额外的时序(比如发生一个信号,表示完成了一个特定的周期操作,在AVR的
JTAG下载中有此实例);后者则表示完成了一次数据操作,将进行下一个数据的操作,但是这些操作属于
同一个操作周期。当然有些情况下,这两种方法是没有区别的。
关于理论部分的讲解,到此为止,留下一个小小的思考,当TAP状态机处于一个未知的状态时,如何才能
通过一个统一的操作使其回到Run-Test/Idel状态呢?给一个小小的提示,针对TAP状态机的TMS信号,给
定固定的电平,在有限的TCK上升沿中,完成状态机的复位。那么这个有限的范围最少是多少个时钟周期?
这个固定的电平究竟是高还是低呢?
[实际应用]
下面的代码是我应用在Snail mkII DEMO中用来操作TAP状态机的实际代码,它根据用户输入的TAP控制流,产
生TAP控制时序,比如我们需要从Run-Test/Idle状态进入Shift-IR状态,根据TAP状态图,我们很容易得出需要产
生的TMS信号依次为1(进入Select DR Scan)1(进入Select IR Scan)0(进入Capture IR)0(进入Shift-IR
Scan),一共四个二进制位,根据从LSB到MSB依次发送的顺序,需要传送给函数的值就是0x03,长度为4。需要注
意的是,进入Shift-IR状态以后,有可能要设置此时的需要TMS保持的电平状态,因此,实际传送的0x03其内容应
该是1 1 0 0 0,最后一个0表示完成前面4个TMS时序的输入以后,TMS保持低电平。最后一个0不计入长度。
/***********************************************************
* 函数说明:JTAG TAP 状态机控制函数 *
* 输入: 控制序列,序列长度 *
* 输出: 无 *
* 调用函数:无 *
* -------------------------------------------------------- *
* 使用说明 *
* 1、 TMS在TCK上升边沿输出状态控制量。 *
* 2、 连续5个TCK周期在TMS上输出高电平将进入Test- *
* Logic-Reset模式。 *
* 3、 使用该函数时,请将状态机跳转以后TMS需要保 *
* 持的电平也作为一个有效输入加入到序列的末尾 *
* 但描述序列长度的数值不需要相应的增加。 *
***********************************************************/
void JTAG_TAP_Control(UINT8 chCTRStream,UINT8 chLength)
{
UINT8 n = 0;
//状态机控制序列
for (n = 0;n < chLength;n++)
{
CLR_TCK
if (chCTRStream & BIT(n))
{
SET_TMS
}
else
{
CLR_TMS
}
JTAG_CLOCK_DELAY
SET_TCK
/* 延时部分 */
JTAG_CLOCK_DELAY
}
//保持电平
if (chCTRStream & BIT(chLength))
{
SET_TMS
}
else
{
CLR_TMS
}
}
复制代码
为了方便使用,我们可以将一些常用的TAP操作用宏进行封装,从而获得较高的代码可读性:
# define JTAG_TAP_TEST_LOGIC_RESET JTAG_TAP_Control(0x1F,6);
# define JTAG_TAP_SHIFT_IR JTAG_TAP_Control(0x03,4);
# define JTAG_TAP_RETURN_RUN_TEST_IDEL JTAG_TAP_Control(0x01,2);
# define JTAG_TAP_ENTER_SHIFT_DR_FROM_SHIFT_IR JTAG_TAP_Control(0x03,4);
# define JTAG_TAP_SHIFT_DR JTAG_TAP_Control(0x01,3);
复制代码
[工程实例]
Step 1:
首先我们要下载一个JTAG时序分析软件JTAG Hacker
点击此处下载
ourdev_496456.rar(文件大小:235K)
(原文件名:上位机.rar)
Step 2:
我们要下载一个示例时序文件 Enter PDI.JTG
点击此处下载
ourdev_496458.rar(文件大小:304字节)
(原文件名:Enter PDI.rar)
Step 3:
打开软件JTAG Hacker,从文件菜单中选择打开-〉Enter PDI.JTAG。如图所示。
Step 4:
单击“清除”按钮来复位整个分析期,依次单击“单步分析”按钮,观察左边的TAP状态机,
对照JTAG Log中的说明,观察时序波形,理解TAP状态机的操作流程。
Step 5:
如果你脱离波形文件直接研究TAP状态机,可以通过最右下角的三个按钮来直接驱动TAP状态
机模拟器。
That~s all. Thank you for you read.
作者:
34480016
时间:
2008-11-13 11:11
沙发
作者:
lanshuitianxia
时间:
2008-11-13 11:20
板凳
作者:
benladn911
时间:
2008-11-13 11:23
地板座垫
作者:
xt0320
时间:
2008-11-13 11:26
板凳
作者:
xiaorunyi
时间:
2008-11-13 11:36
排队听课
作者:
ifree64
时间:
2008-11-13 11:49
楼主出品,都是精品啊。
听课学习了。
作者:
glbest
时间:
2008-11-13 13:05
感谢,学习了!
作者:
Gorgon_Meducer
时间:
2008-11-13 13:07
终于写完了,呼呼~~自己顶一下
希望大家说说自己的想法
下一弹:JTAG的菊花链(Daisy Chain)与数据传输
作者:
Gorgon
时间:
2008-11-13 13:07
终于写完了,呼呼~~自己顶一下
希望大家说说自己的想法
下一弹:JTAG的菊花链(Daisy Chain)与数据传输
作者:
zrwzr5
时间:
2008-11-13 13:13
哈哈,简直太棒了!佩服楼主,五体投地啊!
这样的精华之篇,强烈要顶,楼主加油!
作者:
ba1731
时间:
2008-11-13 15:06
mark,很棒
呵呵
作者:
FPGAer
时间:
2008-11-13 15:55
蛮有用的
作者:
gmen_pliskin
时间:
2008-11-13 16:06
牛人
作者:
ningmeng7294
时间:
2008-11-13 18:16
搬个板凳,学习!
作者:
gdqhik
时间:
2008-11-13 19:41
收藏
作者:
sufeila
时间:
2008-11-13 20:12
这个要顶一下,曾研究过
有了H-JTAG 就没有继续 呵呵
作者:
my2jia
时间:
2008-11-13 20:26
学习中
作者:
watercat
时间:
2008-11-13 20:28
JTAG的恶心之处就在于它除了硬件连线外,就没有哪两个设备是真正遵循同样协议的……
好在硬件连线还是比较给面子的一致化,所以才有玩软件JTAG的可能性……
不过要我说,除了焊点和印刷板测试这个最原始功能外,能用JTAG调试的玩意,基本上也都不需要跟踪调试了,而真正需要跟踪调试的东西,基本上个顶个的JTAG无效……
作者:
wenwu
时间:
2008-11-13 20:34
嗯,收藏,学习中。。。
作者:
yangyongwen
时间:
2008-11-13 20:39
不是不想跟你学,是没这个能力跟啊
作者:
Gorgon_Meducer
时间:
2008-11-13 20:41
to 【17楼】 watercat
你说的很对哈,最近深有同感……这也是为什么AVR32还出了一个AVR ONE的原因。
JTAG渐渐有点鸡肋了……
作者:
Gorgon
时间:
2008-11-13 20:41
to 【17楼】 watercat
你说的很对哈,最近深有同感……这也是为什么AVR32还出了一个AVR ONE的原因。
JTAG渐渐有点鸡肋了……
作者:
mysky
时间:
2008-11-13 21:03
MARK
作者:
huanxian
时间:
2008-11-13 22:03
搬个板凳
作者:
pldjn
时间:
2008-11-14 00:19
JTAG本意设计不是用来做调试的吧,最初是设计用来进行芯片测试用的.
作者:
bad_fpga
时间:
2008-11-14 08:50
JTAG对初学都确实很有用呀
作者:
zrwzr5
时间:
2008-11-17 21:48
恩,加油! 支持~~
作者:
xiaoxiaohe
时间:
2008-12-5 23:21
期待第二,第三,、、、、、,写的非常好!!支持
作者:
zhwm3064
时间:
2008-12-13 06:16
支持
作者:
shaoshunda
时间:
2008-12-13 11:46
期待楼主继续讲解
作者:
346675655
时间:
2008-12-13 13:43
学习
作者:
junyuansun
时间:
2008-12-25 16:17
hhhhhhhhhhhhhhhhhhhhhhhhhhh
作者:
xiaowei0588
时间:
2009-7-23 08:48
很好!
作者:
uestcduoduo
时间:
2009-7-23 09:48
mark
作者:
fanmfan
时间:
2009-8-5 14:49
学习了。
作者:
sange
时间:
2009-8-5 16:16
记号
作者:
k0059
时间:
2009-10-1 01:37
jtag应该是在TCK的上升沿采样的啊
你的图怎么是下降沿采样的呢
另外请教一个,TCK空闲的时候应该是高电平还是低呢
作者:
Gorgon_Meducer
时间:
2009-10-2 22:02
空闲高电平。TCK的确是上升沿采样,图中的线会随着鼠标跟踪,你看到的只是光标的位置。
作者:
lizhe159
时间:
2009-10-26 14:17
不错
作者:
Pyrrho
时间:
2009-10-28 00:36
Mark
作者:
wc8841484
时间:
2009-10-28 08:46
mark
作者:
shangzhenwei
时间:
2009-10-31 17:43
等把基础的学好了,再学这个
作者:
_yun_yun_
时间:
2009-11-20 11:12
mark
作者:
zhouq3132
时间:
2009-11-20 11:26
mark
作者:
Dream_catcher
时间:
2009-12-12 23:52
mark
作者:
a1z26
时间:
2009-12-26 19:45
第二弹呢?一年了......期待啊。
作者:
sunmy
时间:
2009-12-30 11:11
精华
作者:
pldjn
时间:
2009-12-30 22:44
期待第二弹
作者:
liurangzhou
时间:
2010-1-1 11:06
顶,好资料,全程跟踪!
作者:
idly
时间:
2010-4-1 14:38
mark
作者:
liangyurongde
时间:
2010-4-1 14:41
留个记号,回头再看
作者:
youki1234
时间:
2010-4-1 16:52
mark
作者:
gdmfq
时间:
2010-4-27 23:55
SDM
作者:
mawenwei
时间:
2010-4-28 07:13
JTAG分析,谢谢,灰常强大
作者:
only
时间:
2010-4-28 08:29
讲的不错,简单明了。老贴了,怎么以前没注意到呢。
作者:
smartzou
时间:
2010-4-28 09:11
mark
作者:
xjf20072608
时间:
2010-4-28 12:17
我是mark党
作者:
a69161
时间:
2010-4-28 12:33
这个必须留记号
作者:
gotowar
时间:
2010-5-18 11:40
mark
作者:
hc235280
时间:
2010-5-18 13:10
留名学习
作者:
yxm433
时间:
2010-5-25 23:49
mark
作者:
zhjianmail
时间:
2010-5-28 23:20
不错不错,但是为啥我的在win7下不能使用啊,多谢!
作者:
logic.pn
时间:
2010-6-3 22:26
学习中!
菊花链。。。。这名字好啊。。。
作者:
wenqing
时间:
2010-6-19 15:40
强贴 mark之,先来细品
作者:
8s209
时间:
2010-6-19 15:57
mark
作者:
aguang7yue7
时间:
2010-8-12 09:29
回复【楼主位】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------
第二弹呢~~ 傻孩子人不在本论坛了是么?还望那位达人能告之我一个他的确切的邮箱 有很多问题想请教呢
作者:
Gorgon_Meducer
时间:
2010-8-12 11:21
to 【66楼】 aguang7yue7
不好意思,一直以来都没有更新这个帖子,我的邮箱在资料里面。
作者:
lbhj310
时间:
2010-8-13 15:19
mark
作者:
dongzhiL332
时间:
2010-9-29 11:39
回复【67楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------
要学好JTAG,项目需要啊,自己得努力,你的文章很好啊,对我挺有用的,向你学习
作者:
dongzhiL332
时间:
2010-9-29 11:45
回复【67楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------
你这个是软件仿真吧,有没有有关硬件仿真的啊,比如并口转JTAG,USB转JTAG,控制JTAG信号,还可以通过示波器检测JTAG信号?
作者:
myyule
时间:
2010-11-3 12:37
期待第二弹
作者:
liitom
时间:
2010-11-3 13:15
作者:
castlehu
时间:
2010-11-3 16:40
mark
作者:
rmdyj
时间:
2010-12-29 17:59
试用了一下,发现JTAG时序分析软件JTAG Hacker 软件有BUG,顺便告诉各位一声。
(1)上图中的TDI与TDO名称要对调一下。
(2) 分析软件中的:
原来代码是:
Sub JTAG_Step_Analyze(chData As Byte, dwPosition As Long)函数中的
Case Is = 11 'Shift-IR
If (chData And &H4) = &H4 Then 'TDI=1 ‘原程序
s_bShiftInData(Int(s_bShiftDataBitsCounter / 8)) = s_bShiftInData(Int(s_bShiftDataBitsCounter / 8)) + 2 ^ (s_bShiftDataBitsCounter Mod 8)
If (s_bShiftDataBitsCounter Mod 8) = 0 And s_bShiftDataBitsCounter <> 0 Then
要改为:
Case Is = 11 'Shift-IR
If (chData And &H2) = &H2 Then 'TDI=1 '修改部分
s_bShiftInData(Int(s_bShiftDataBitsCounter / 8)) = s_bShiftInData(Int(s_bShiftDataBitsCounter / 8)) + 2 ^ (s_bShiftDataBitsCounter Mod 8)
If (s_bShiftDataBitsCounter Mod 8) = 0 And s_bShiftDataBitsCounter <> 0 Then
否则无法正确分析。经验证,只有修改后才能正确分析.
作者:
Gorgon_Meducer
时间:
2010-12-29 19:11
俄……不会吧……难道是我给错测试文件了……
终于遇到一个给力的~顶你~谢谢你~
你试试看别的文件……应该是我提供的某些测试文件格式有偏差,并不是上位机有问题。
作者:
WillFeng
时间:
2011-2-20 10:52
Mark JTAG
作者:
mitchell
时间:
2011-2-20 17:38
mark
作者:
qidaimengxing
时间:
2011-3-23 22:58
感谢,学习了!
作者:
02015678
时间:
2011-3-23 23:55
MARK了,谢谢LZ辛苦的整理。
作者:
fpga_lab
时间:
2011-3-24 00:11
好容易找回这个贴。。
作者:
lanenwu
时间:
2011-3-24 00:20
学习
作者:
cctv02
时间:
2011-4-10 10:41
呵呵收藏学习
作者:
wuguoyan
时间:
2011-4-11 21:52
mark
作者:
dragonbbc
时间:
2011-4-27 09:42
好文章,收藏了慢慢学
作者:
cardinal_2010
时间:
2011-5-5 10:14
好文章。JTAG Hacker为何不能下载?
作者:
zxs2000
时间:
2011-8-5 16:00
学习了
作者:
Helloeveryon
时间:
2011-10-15 18:48
MARK
作者:
MouseCat
时间:
2011-10-16 23:47
MARK
作者:
kingboy100
时间:
2011-10-17 09:33
mark
作者:
Mulsanne
时间:
2011-11-24 15:28
mark
作者:
qianwantao
时间:
2011-12-1 14:00
mark
作者:
wangxb330226
时间:
2011-12-1 16:32
mark
作者:
zhjr1220
时间:
2011-12-15 12:44
谢谢分享!
作者:
xiongxie007
时间:
2011-12-15 13:11
mark
作者:
adamwin2011
时间:
2011-12-15 13:19
弹无虚发……
作者:
ycwjl728
时间:
2011-12-15 13:21
mark
作者:
leavic
时间:
2011-12-25 13:04
真是好文章啊,讲得易懂又深入
作者:
losting
时间:
2012-2-16 13:05
mark
作者:
zuceyige
时间:
2012-2-16 13:30
傻孩子的文章啊,我mark啊
欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/)
Powered by Discuz! X3.4