找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 27183|回复: 40

【教程】MT7621 JTAG 救砖全攻略

 火.. [复制链接]
发表于 2017-12-24 16:05 | 显示全部楼层 |阅读模式
本帖最后由 hackpascal 于 2017-12-24 17:04 编辑

原帖地址:https://blog.hackpascal.net/2017 ... ing-bus-blaster-v4/
转载请注明原帖地址和作者


楼主搞 MT7621 的 JTAG 可以说使一波三折,从第一次研究到现在已经有快两年的时间了。
因此这里就不说中间的研究经过了,只说操作方法。

楼主使用的是 Bus Blaster v4.1a,可以在某宝上买到。
MT7621 路由板子是 @ff94315 提供的 CreativeBox v1

[连接设备]

由于 Bus Blaster 的接口是 ARM 20-pin 的,因此自己做了个转接板,将其转换为了 EJTAG 14-pin,最后的连接如下:


然后,就是编写一份用于 OpenOCD 的 cfg 文件了。

  1. adapter_nsrst_delay 100
  2. jtag_ntrst_delay 100

  3. reset_config trst_and_srst srst_push_pull

  4. set CHIPNAME mt7621

  5. jtag newtap $CHIPNAME cm -irlen 5 -ircapture 0x1 -irmask 0x1f -expected-id 0x1762124f
  6. jtag newtap $CHIPNAME.3 cpu -irlen 5 -ircapture 0x1 -irmask 0x1f -expected-id 0x1762124f
  7. jtag newtap $CHIPNAME.2 cpu -irlen 5 -ircapture 0x1 -irmask 0x1f -expected-id 0x1762024f
  8. jtag newtap $CHIPNAME.1 cpu -irlen 5 -ircapture 0x1 -irmask 0x1f -expected-id 0x1762124f
  9. jtag newtap $CHIPNAME.0 cpu -irlen 5 -ircapture 0x1 -irmask 0x1f -expected-id 0x1762024f

  10. target create $CHIPNAME.cm mips_m4k -endian little -chain-position $CHIPNAME.cm
  11. target create $CHIPNAME.3.cpu mips_m4k -endian little -chain-position $CHIPNAME.3.cpu
  12. target create $CHIPNAME.2.cpu mips_m4k -endian little -chain-position $CHIPNAME.2.cpu
  13. target create $CHIPNAME.1.cpu mips_m4k -endian little -chain-position $CHIPNAME.1.cpu
  14. target create $CHIPNAME.0.cpu mips_m4k -endian little -chain-position $CHIPNAME.0.cpu
复制代码

MIPS 1004K/1074K 是多核 SMT 架构,每个核 (Core) 拥有两个线程 (VPE)。MIPS CPU 启动时,固定是 Core0/VPE0 最先启动,然后由软件启动剩余的核心和 VPE。
在 Trace32 的帮助文档 debugger_mips.pdf 中,有说到 MIPS 1004K 中的 TAP 连接方式:


可以看到,MIPS 1004K (PRID 修订号为 0x2f) 中的 Coherence Manager (CM,大概翻译为一致性管理器,用于多核之间的管理和同步),也提供了一个 TAP,这也就是 5 个 TAP 的来历。
根据说明,可以看到各个 TAP 间的连接方式:
从 Core0 开始一直连接到 CoreN,最后连接到 CM;一个 Core 间,首先连接 VPE0,再连接到 VPE1。
OpenOCD 在通过 JTAG 进行扫描时,会最先扫描出 CM,最后扫描到 Core0/VPE0。这也是我在实际测试后得出的,最后反映在 OpenOCD cfg 文件的描述中。

[启动 OpenOCD]

执行 openocd -f mt7621.cfg 后,可以看到如下输出:


执行 telnet 127.0.0.1 4444,连接到 OpenOCD,执行 halt 中断 CPU,然后可以执行 targets 命令,查看当前所有 TAP 的状态:

在 targets 命令的输出中,可以看到 mt7621.0.cpu 的状态是 halted,并且 mt7621.0.cpu 带有星号,也就是当前正在操作的 Core0/VPE0。

然后修改 SPI 总线频率,以确保 CPU 能够正常使用调试功能。
mww 0xbe000b3c 5

为了加快后续的操作,需要将 CPU 的频率调整到 500MHz:
mww 0xbe000410 0x0101

[制作内存初始化模块]

MT7621 的 U-Boot 没有提供内存控制器相关的源代码,因此需要用到其提供的 mt7621_stage_sram.bin 来进行内存初始化。

mt7621_stage_sram.bin 需要按需求进行修改后,才能使用:


如图所示,根据板子的内存类型 (DDR2/DDR3)、内存容量,CPU 晶振频率,需要修改至少 3 处数据。所有的数据均以自然顺序描述 (如 0xaabbccdd),但是使用小端序 (Little-Endian) 存储 (DDR 时序参数例外,见下文),因此写入文件时,需要先颠倒字节序,如:
描述时使用了 0xaabbccdd,那么写入文件时,需要转换为 dd cc bb aa。

所有数据描述如下:

1. CPU 频率参数
这是 0xbe005648 处寄存器的设定数值,提供两个预设值(因 Programming Guide 中关于 Memory Controller 的描述几乎全部错误,且有很多缺失):

CPU 频率设定为 880MHz,晶振频率为 40MHz:
0xc0005ab2

CPU 频率设定为 875MHz,晶振频率为 25MHz:
0xc0004a22

2. 内存频率参数
这是一个位域字段,共有 3 个字段,指定三个内存控制相关的参数:
第 28 位到第 31 位,共 4 位,掩码 0xf:内存频率,1 代表 1200MHz,2 代表 1066MHz,3 代表 800MHz,4 代表 400MHz;
第 24 位,共 1 位:内存控制器 PLL 初始化:0 代表使用 1PLL 初始化,1 代表使用 3PLL 初始化。通常都使用 3PLL 模式;
第 20 位,共 1 位:内存时序参数的字节序,0 代表小端序,1 代表大端序;

举例:
内存频率 1200MHz,使用 3PLL,DDR 时序参数使用大端序:0x11000000;
内存频率 1066MHz,使用 3PLL,DDR 时序参数使用小端序:0x21100000。

3. DDR 时序参数
DDR2/DDR3 的时序参数是分开存放的,需要根据 DDR 的类型将时序参数写入不同的区域。
时序参数依照 DDR 的类型和容量而各有不同,如果选择的时序参数跟实际的 DDR 参数不同,那么可能导致 DDR 初始化失败
MTK U-Boot 提供了一些默认的参数,存放于 mt7621_ddr_param.txt 中。

时序参数写入 bin 文件的字节序受内存频率参数第 20 位的影响:
如果第 8 位为 0,那么 mt7621_ddr_param.txt 中的每项数据,都需要颠倒字节序后才能写入 bin 文件;
如果第 8 位为 1,那么 mt7621_ddr_param.txt 中的每项数据可以直接按顺序写入 bin 文件。

4. 串口波特率
mt7621_stage_sram.bin 在执行时会初始化串口,并输出相关信息,用于指明内存初始化是否完成,以及是否成功
波特率数值不能超过 115200,大多数时候,默认值是 57600。

举例:
波特率为 115200,十六进制数值为 0x0001c200;
波特率为 57600,十六进制数值为 0x0000e100。

[初始化内存]

在制作完成 mt7621_stage_sram.bin 后,就需要使用它初始化内存了。

首先初始化 SRAM:
在 OpenOCD 中依次执行:
mww 0xbe100004 1
sleep 1
mww 0xbe100004 6


这样就启用了 SRAM,其地址范围为 0xbe108000 - 0xbe10dfff。

然后加载 mt7621_stage_sram.bin 到 0xbe108800 处:
load_image mt7621_stage_sram.bin 0xbe108800

设置 mt7621_stage_sram.bin 执行参数为正常模式
mww 0xbe00001c 0

为了能够在 mt7621_stage_sram.bin 执行完毕后控制 CPU,防止跑飞,需要在 mt7621_stage_sram.bin 返回前中断 CPU。
mt7621_stage_sram.bin 在执行时会将返回地址存入 0xbe108000,在返回前从 0xbe108000 处读取返回地址。
因此可以在 0xbe108000 处设置一个 Word 类型 (4 字节) 的数据访问断点
wp 0xbe108000 4 r

执行 mt7621_stage_sram.bin 以初始化内存:
resume 0xbe108800

如果一切顺利,串口上将会有输出,并且会提示内存初始化是否完毕:


如果初始化完毕,那么此时 OpenOCD 的 telnet 窗口上应该会有断点被触发的提示:


然后删除断点:
rwp 0xbe108000

禁用 SRAM:
mww 0xbe100004 1
因为这里使用的是 Frame Engine 的 SRAM,只有在禁用 SRAM 后以太网模块才能正常工作。

设置 CM 的默认操作目标为内存:
mww 0xbfbf8008 0x1fbf8000

简要说明一下:
MIPS CM 能够管理的不仅仅是内存,还有 IOCU (I/O 一致性单元)。MT7621 复位后的 CM 默认操作目标是 IOCU1,这会导致通过总线 0x10000000 (0x80000000/0xa0000000) 无法访问到内存。
因此要修改 GCR_BASE 寄存器,使 CM 的默认操作目标改为内存。
因为缺少资料 (MD00597, MIPS® 1004K™ Coherent Processing System User's Manual),因此这里参考的是 MIPS 的培训资料:


设置 OpenOCD 工作内存区域:
mt7621.0.cpu configure -work-area-phys 0xa0008000 -work-area-size 0x1000
如果执行此条命令后,后续的 load_image 执行出错,那么需要重新执行上述的各条命令,并且不再执行本命令

至此 MT7621 的初始化工作就完成了,之后就是加载 Bootloader 到内存并执行或者其它调试工作了。




[加载内存版 Bootloader]

在初始化内存后,就可以加载内存版 Bootloader 并执行了。当然这是在 Flash 数据损坏时才需要做的。

这里以专用的内存版 Breed 为例:

1. 加载 Breed 文件
load_image breed-mt7621-spi-mem-0xa0060000.bin 0xa0060000
这个专用版的 Breed 不会初始化其余的 Core 和 VPE,并且削减了一些在此状态下无法使用的功能。并且去掉了自动启动固件的功能,以方便直接进入 Web 恢复模式。
其加载和执行的地址均为 0xa0060000

2. 运行 Breed:
resume 0xa0060000



如果一切顺利,串口中将会看到 Breed 的输出:


同时在浏览器中访问 192.168.1.1,也能打开 Breed 的页面:


这个专用版 Breed 的一个特点是时钟频率的 DDR 部分会显示 Unknown,因为无法获取内存频率参数。



一点关于 OpenOCD 中多线程 (VPE) 调试的说明:
MIPS 手册中有明确指出,当一个 VPE 进入 Debug 模式时,其余的 VPE 会被冻结。
因此在 OpenOCD 中切换 TAP 时,需要注意,要保证当前没有 TAP 处于 Debug 模式,再进行切换 (targets 命令,例如 targets mt7621.1.cpu),否则后续的操作,例如 halt 等,都会失败。



文章中涉及到的一些文件的下载地址:
https://pan.baidu.com/s/1c1GINa4

包含的文件:
mt7621.cfg: 用于 OpenOCD 的配置文件,JTAG Interface 部分请按需修改。
breed-mt7621-spi-mem-0xa0060000.bin: 用于内存启动的专用 Breed 文件,SPI/NAND 自适应,Web 操作目标为 SPI。加载/启动地址为 0xa0060000,已测试正常。
breed-mt7621-nand-mem-0xa0060000.bin: 用于内存启动的专用 Breed 文件,SPI/NAND 自适应,Web 操作目标为 NAND,只能更新 Bootloader 或编程器固件。加载/启动地址为 0xa0060000,未测试。
mt7621_stage_sram_DDR2_64MB.bin: 预置 DDR2 64MB 800MHz / CPU 880MHz/40MHz / 波特率 57600 参数的内存初始化模块。
mt7621_stage_sram_128MB.bin: 预置 DDR2/3 128MB 800MHz / CPU 880MHz/40MHz / 波特率 57600 参数的内存初始化模块。
mt7621_stage_sram_DDR3_256MB.bin: 预置 DDR3 256MB 1066MHz / CPU 880MHz/40MHz / 波特率 57600 参数的内存初始化模块。
mt7621_stage_sram_DDR3_512MB.bin: 预置 DDR3 512MB 1066MHz / CPU 880MHz/40MHz / 波特率 57600 参数的内存初始化模块。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 6恩山币 +8 收起 理由
iptables + 1 强大的恩山!(以下重复1万次)
wxalriss + 1 NB人做NB事!友华的PT923有的玩了
pro_drive + 2 强大的恩山!(以下重复1万次)
xjingiii + 2 强大的恩山!(以下重复1万次)
麦门冬 + 1 +1s
wuliwifi + 1 很好,支持!

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
发表于 2017-12-24 16:22 | 显示全部楼层
我的k2p  A2新货,到手,进系统设置完重启就砖了,红灯,。。。原机Bootloader也进不去,网线插上一点反应没有。不知道是不是出了未知bug,把原机的Bootloader给覆盖了。希望如此。等有时间用编程器试试修一下。。

点评

版本高的breed有这个问题的,在112x版本遇到刷老毛子变砖。  详情 回复 发表于 2018-10-16 12:38
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-12-24 16:23 | 显示全部楼层
H大,受我一拜!!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-12-24 16:24 | 显示全部楼层
第一次离大神这么近。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-12-24 16:28 | 显示全部楼层
大神出品,必属精品!!!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-12-24 16:34 | 显示全部楼层
虽然看不懂,但是挺厉害的样子
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-12-24 16:39 | 显示全部楼层
大神在上,受我膜拜
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-12-24 16:59 | 显示全部楼层
膜拜一下~~
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-12-24 17:13 | 显示全部楼层
曲调酱前来支持
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-12-24 17:22 来自手机 | 显示全部楼层
支持大神的帖子。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-12-24 17:22 | 显示全部楼层
上面提到的材料曲调酱都有售哦。啦啦啦啦啦啦啦啦
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-12-24 17:27 来自手机 | 显示全部楼层
谢谢分享,但愿不如此,也不会jata
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-12-24 18:22 来自手机 | 显示全部楼层
这不是普通人能玩的
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-12-24 18:34 | 显示全部楼层
大神啊!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-12-24 21:37 | 显示全部楼层
支持hack大!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-3-28 23:29

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表