我正在尝试从摩托罗拉读取微控制器MPC5606B的闪存。我看到了他的针脚,看到它使用jtag进行调试,所以我试图使用它的JTAG接口读取其Flash内容。

我使用工具(UPA)读取MPC的Flash内容和一台PC,但是,我想使用我自己的嵌入式硬件而不使用PC的工具来自己做。我在互联网上阅读了有关JTAG标准(JTAG_IEEE-Std-1149.1-2001)以及一些视频和说明的信息。我阅读了有关TAP控制器状态图的信息,并阅读了一些说明。

为了更好地理解JTAG读数,我使用PC的工具读取了MCP的闪存和示波器,以了解通信方式但是,执行通信的持续时间将近10s。因此,我用零填充了整个闪存并读取了内存,这样,我就可以使用示波器识别内存的读取。但是,尽管我可以使用示波器识别存储器的读数,但仍无法确定执行读数的确切命令顺序。阅读时间过长,将近10秒钟。

因此,在深入探讨之前,我想知道是否有某种保护措施可以访问闪存。我试图了解通信的开始,可以确定TAP控制器状态机的进度,但是我无法理解该步骤的含义以及执行的原因。因此,我想知道:

1)我可以确定该通信是否具有某种保护?我真的需要在进一步执行任务之前先了解它,因为在深入研究之前,我需要先了解任务的复杂程度。

2)尽管我了解了JTAG标准和TAP控制器状态机,我无法说出要阅读flahs内容所需的命令顺序。

MPC5606B可实现PC的辅助功能。该图像由一系列图像组成。第一个是完整的通信图像,第二个是通信的开始,有一个箭头指示撤消该通信的位置。



这是我的到目前为止的解释
图1:

1.1-(TMS = 1)测试逻辑复位

1.2-(CLK宽脉冲)I不知道为什么。

1.3-(8个CLK脉冲,TMS = 1)

由于TMS没有出现为1,我知道它没有退出Test-logic-Reset

1.4-(TMS = 0,1个脉冲时钟)进入运行测试空闲状态


图2:

2.1-(TMS = 1、2个时钟脉冲)进入“选择IR扫描”状态

2.2-(TMS = 0,2个时钟脉冲)进入“ Shif-IR”状态

2.3-(TMS = 0,4个时钟脉冲)保留在“ Shift-IR”中

TDI:1000
TDO:1000
2.4-(TMS = 1 ,1个时钟脉冲)转到“ Exit1-IR”

2.5-(TMS = 1,1个时钟脉冲)转到状态“ Update-IR”


3.1-(TMS = 1, 1个时钟脉冲)进入“选择DR-扫描”状态

3.2-(TMS = 0,2个时钟脉冲)进入状态“ Shif-DR”

3.3-(TMS = 0,有31个时钟脉冲)进入“ Shif-DR”状态

32个时钟周期等效于4个字节:

TD I:0x00 0x00 0x00 0x00
TDO:0xB8 0x0C 0x27 0x54(10111000 00001100 00100111 01010100)


3.5-(TMS = 1,1个时钟脉冲)进入状态“ Update-DR”

3.6-(TMS = 0,1个时钟脉冲)进入“运行测试空闲”

评论

Daniel,您找到阅读MPC5606BK的方法吗?

@ autofan1965,我尝试了一下,但是我不再需要它了,所以我停了下来。

#1 楼

手动解释JTAG交易可能很累。如果您可以将数据导出为或多或少的通用数据格式,例如VCD或什至CSV文件,则可以使用Sigrok和Pulseview解码数据。这将解码低级JTAG数据;如果您知道控制器的详细信息(例如TAP寄存器布局和命令集),则可以使用在现有IEEE-1149解码器之上运行的解码器扩展Sigrok。



评论


我正在使用PulseView解码通信,这是一个很好的建议,非常感谢。但是,我停止解码了一段时间,然后再进一步了解MPC5606B中是否存在某种保护/安全性,因为否则,这项工作可能毫无价值。你知道吗?

–丹尼尔(Daniel)
17-10-6在16:22

从问题的性质来看,我认为它有些晦涩,但是显然那里有很多文档。我建议阅读参考手册:cache.freescale.com/files/32bit/doc/ref_manual/MPC5606BRM.pdf。您对2.4.5、5.1.3、35部分感兴趣。

–John Doe
17-10-6在18:59

#2 楼

您的解释很接近我。但是,这是非常底层的视图,您需要将其恢复到更高的级别,至少是IR / DR。例如,整个交换1-3可以总结为:

写入IR = 0b100(8),读取DR = 0x2AE4301D

(DR位从最低的,因此您需要交换位字符串)

此IR值非常接近标准IDCODE(4),因此我认为您的解释中存在一个与之不符的地方交易所正在读取设备ID。实际上,值0x2AE4301D与我在本文档中找到的MPC5606BF的值匹配。

对于实际的闪存读取,我怀疑它是使用原始JTAG命令完成的。 AFAIK读取闪存的常用方法如下:

使用边界扫描,设置和读取连接到闪存芯片的CPU引脚;基本上将CPU变成了快速编程器。这显然仅适用于外部闪存,因此可能不适用于您的情况
使用定制的特定于芯片的调试命令,在CPU内存空间中读取和写入闪存设备I / O寄存器。
使用定制的特定于芯片的调试命令,将一个小的Flasher程序上传到CPU的RAM中,然后执行它。该程序会将闪存块放入RAM区域,然后可以通过JTAG取回主机。通过在每次执行之前设置寄存器状态,可以访问闪存的不同部分。

我建议您使用urJTAG或OpenOCD之类的程序来执行高级JTAG操作(例如发送IR和读取数据) DR)是否要复制Flasher程序正在执行的操作。 urJTAG还具有一种模式,可以对可能的IR值进行暴力破解,这可以让您发现供应商特定的命令。

评论


我在通讯日志中标识了IDCODE,您的观察和技巧非常有用,非常感谢。但是,我停止解码了一段时间,然后再进一步了解MPC5606B中是否存在某种保护/安全性,因为否则,这项工作可能毫无价值。你知道吗?

–丹尼尔(Daniel)
17-10-6在16:28

由于其他闪光灯可以工作,因此我怀疑是否有足够的保护装置(如果有)。无论如何,这是一个不同的问题。

–伊戈尔·斯科钦斯基♦
17-10-6在22:40