找回密码
 立即注册

QQ登录

只需一步,快速开始

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

【教程】MT7621 JTAG 救砖全攻略

 火.. [复制链接]
本帖最后由 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 收起 理由
ipta*** + 1 强大的恩山!(以下重复1万次)
wxal*** + 1 NB人做NB事!友华的PT923有的玩了
pro_*** + 2 强大的恩山!(以下重复1万次)
xjin*** + 2 强大的恩山!(以下重复1万次)
麦*** + 1 +1s
wuli*** + 1 很好,支持!

查看全部评分

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

点评

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

使用道具 举报

H大,受我一拜!!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

第一次离大神这么近。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

大神出品,必属精品!!!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

虽然看不懂,但是挺厉害的样子
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

大神在上,受我膜拜
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

膜拜一下~~
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

曲调酱前来支持
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

来自手机 | 显示全部楼层
支持大神的帖子。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

上面提到的材料曲调酱都有售哦。啦啦啦啦啦啦啦啦
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

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

使用道具 举报

来自手机 | 显示全部楼层
这不是普通人能玩的
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

大神啊!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

支持hack大!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 07:45

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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

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