|
本帖最后由 lgs2007m 于 2024-3-9 19:03 编辑
MediaTek Filogic 系列路由器串口救砖教程
感谢蝈蝈大佬开发的 mtk_uartboot 工具,暗云大佬提供的教程,这样就可以随便刷砖了
适用系列:MediaTek MT7622、MT7981、MT7986、MT7988 SoC
有了串口TTL救砖,天下无砖!
hanwckf大佬uboot地址:https://github.com/hanwckf/bl-mt798x/releases/tag/20230902
下载后解压出来mt7986_redmi_ax6000-fip-fixed-parts-multi-layout.bin就是20230902最新红米AX6000的uboot
20230902大佬更新了最新红米AX6000支持多分区的uboot,具体使用可以看大佬博客https://cmi.hanwckf.top/p/mt798x-uboot-usage/
不死uboot具体情况可以看hanwckf大佬不死uboot的commit:add support for redmi-ax6000
刷hanwckf大佬的不死uboot后,uboot启动时通过设置默认mtdparts把官方分区ubi(30MiB)、ubi1(30MiB)和overlay(50MiB)合并为一个ubi(110MB)大分区,但是uboot并没有设置默认env环境变量,我猜还是读取存放在Nvram分区的env环境变量ipaddr=192.168.31.1,所以进入不死uboot webui的地址是192.168.31.1,目前不死uboot还不支持LED灯。
刷不死uboot后不支持小米官方救砖工具,需要刷回原厂FIP分区后,才能用小米救砖工具刷回官方固件。
hanwckf大佬并未发布红米AX6000刷uboot教程,该教程参考大佬360T7刷uboot教程,和论坛其他几个大佬的实践,感谢~
刷机有风险,刷uboot更加,这个教程只是个人实践的一点总结,测试正常,仅供参考,变砖勿扰!
【110MB大分区uboot版本固件】
目前237大佬和hanwckf大佬的闭源OP支持uboot(ubi分区110MB)大分区,OpenWrt官方、X-Wrt源码则已经更新了ubootmod(ubi分区122.5MB),为了避免混乱他们舍弃了uboot(ubi分区110MB)的支持,Lean开源源码目前还支持110MB大分区固件,大家也可以尝试。
强烈推荐237大佬的闭源OP,uboot大分区和官方分区的固件都有:
https://www.right.com.cn/forum/thread-8261104-1-1.html
坛友编译的hanwckf大佬源码uboot大分区固件:
https://www.right.com.cn/forum/thread-6352752-1-1.html
https://www.right.com.cn/forum/thread-8266074-1-1.html
我的云编译地址:https://github.com/lgs2007m/Actions-OpenWrt
目录
【1】从官方固件或237大佬闭源OP刷hanwckf大佬的不死uboot
【2】从hanwckf大佬的不死uboot刷回官方
【3】TTL简单使用
【4】CH341A/CH341B编程器救砖
【1】从官方固件或237大佬闭源OP刷hanwckf大佬的不死uboot
因为官方固件没有锁mtd分区,237大佬2022-11-29以后更新的闭源OP已解锁FIP分区,所以从这两种固件下都可以刷uboot。
注:hanwckf大佬源码编译的固件也是解锁FIP分区的,可以直接刷。
如果你是官方原厂固件的话,需要先解锁SSH,解锁教程可以参考NormalPeople的,只需要解锁SSH,再关闭开发者模式即可,刷OP不需要固化SSH。
【保姆级教程】红米AX6000永久获取SSH权限(Redmi AX6000)
如果你是237大佬的官方分区的闭源OP固件,版本小于11-29,需要更新下,然后就可以直接刷uboot了。
官方固件解锁后SSH软件登录路由器查看原厂分区,可以看到原厂的ubi和ubi1两个固件分区是30MB,ubinfo -a查看实际可用29MB:
- root@XiaoQiang:~# cat /proc/mtd
- dev: size erasesize name
- mtd0: 08000000 00020000 "spi0.1"
- mtd1: 00100000 00020000 "BL2"
- mtd2: 00040000 00020000 "Nvram"
- mtd3: 00040000 00020000 "Bdata"
- mtd4: 00200000 00020000 "Factory"
- mtd5: 00200000 00020000 "FIP"
- mtd6: 00040000 00020000 "crash"
- mtd7: 00040000 00020000 "crash_log"
- mtd8: 01e00000 00020000 "ubi"
- mtd9: 01e00000 00020000 "ubi1"
- mtd10: 03200000 00020000 "overlay"
- root@XiaoQiang:~# cat /proc/partitions
- major minor #blocks name
- 31 0 131072 mtdblock0
- 31 1 1024 mtdblock1
- 31 2 256 mtdblock2
- 31 3 256 mtdblock3
- 31 4 2048 mtdblock4
- 31 5 2048 mtdblock5
- 31 6 256 mtdblock6
- 31 7 256 mtdblock7
- 31 8 30720 mtdblock8
- 31 9 30720 mtdblock9
- 31 10 51200 mtdblock10
- 253 0 15748 ubiblock0_1
复制代码
更新237大佬2022-11-29官方分区的闭源OP后,查看分区,可以看到保留官方分区下刷OP,ubi是80MB,ubinfo -a查看实际可用77.5MB。
- root@ImmortalWrt:~# cat /proc/mtd
- dev: size erasesize name
- mtd0: 08000000 00020000 "spi0.1"
- mtd1: 00100000 00020000 "BL2"
- mtd2: 00040000 00020000 "Nvram"
- mtd3: 00040000 00020000 "Bdata"
- mtd4: 00200000 00020000 "Factory"
- mtd5: 00200000 00020000 "FIP"
- mtd6: 00040000 00020000 "crash"
- mtd7: 00040000 00020000 "crash_log"
- mtd8: 01e00000 00020000 "ubi_kernel"
- mtd9: 05000000 00020000 "ubi"
- root@ImmortalWrt:~# cat /proc/partitions
- major minor #blocks name
- 31 0 131072 mtdblock0
- 31 1 1024 mtdblock1
- 31 2 256 mtdblock2
- 31 3 256 mtdblock3
- 31 4 2048 mtdblock4
- 31 5 2048 mtdblock5
- 31 6 256 mtdblock6
- 31 7 256 mtdblock7
- 31 8 30720 mtdblock8
- 31 9 81920 mtdblock9
- 253 0 13516 ubiblock0_0
- 252 0 245760 zram0
复制代码
官方固件或237大佬闭源OP备份分区和刷uboot命令是一样的,可以直接用。
建议刷机前做好原厂分区备份,建议备份BL2、Nvram、Bdata、Factory、FIP分区,以便不时之需。
Factory为无线EEPROM分区,很重要,建议备份本机的!其他人的备份是否能用我还不太懂。
Bdata存储着你的SN和MAC,建议备份。
Nvram存储着环境变量,建议备份,其他人的应该也可以启动,不过没试过。
BL2和FIP可以用其他人的,不过也建议备份。
有些分区的作用我还理解不透彻,我个人是全部分区都备份的。凡是先备份,小心驶得万年船~
官方系统和刷保留官方分区的闭源OP后的分区号相同,BL2、Factory、FIP内容不变,Nvram、Bdata设置后内容有变,不过不影响,备份其中一个系统下面的即可,后面都是刷回备份后用小米救砖工具恢复。
刷其他固件和一些过渡固件的,注意cat /proc/mtd查看分区对应的mtd序号是否一样。
运行dd命令备份分区到tmp文件夹:
- dd if=/dev/mtd1 of=/tmp/mtd1_BL2.bin
- dd if=/dev/mtd2 of=/tmp/mtd2_Nvram.bin
- dd if=/dev/mtd3 of=/tmp/mtd3_Bdata.bin
- dd if=/dev/mtd4 of=/tmp/mtd4_Factory.bin
- dd if=/dev/mtd5 of=/tmp/mtd5_FIP.bin
复制代码 然后WinSCP等SCP协议软件登录路由器,打开tmp文件夹,将备份下载到电脑保存好。
保存好备份分区后,可以用WinSCP上传uboot文件到tmp文件夹下,然后逐条输入下面命令,将uboot刷入FIP分区:
- md5sum /tmp/mt7986_redmi_ax6000-fip-fixed-parts.bin
- mtd write /tmp/mt7986_redmi_ax6000-fip-fixed-parts.bin FIP
- mtd verify /tmp/mt7986_redmi_ax6000-fip-fixed-parts.bin FIP
复制代码 注意:在op系统内mtd write会自动擦除再写入,不需要先擦除了。但是TTL进uboot控制台时需要先擦除再写入!!!
注意:FIP分区时不能断电、重启,不然就直接变砖,只能上编程器了。
这四条命令是使用md5sum检查上传到tmp文件夹的uboot文件的md5值,擦除FIP分区,无误后用mtd write将uboot文件写入FIP分区,再用mtd verify对比检查uboot文件是否已写入FIP分区。
注意mtd命令最后的FIP是大写。
逐条输入命令回车后,输出是如下这样的,可以检查uboot文件的md5是否和我一样,以及mtd verify对比检查最后是否输出为Success(这里示例使用的是20221201版uboot):
- root@XiaoQiang:~# md5sum /tmp/mt7986_redmi_ax6000-fip-fixed-parts.bin #查看上传到tmp文件夹的uboot文件md5值,无误后刷入
- 7610a1722073748c3c3a860b75d94d5d /tmp/mt7986_redmi_ax6000-fip-fixed-parts.bin
- root@XiaoQiang:~# mtd write /tmp/mt7986_redmi_ax6000-fip-fixed-parts.bin FIP #使用mtd write命令将文件写入FIP分区
- Unlocking FIP ...
- Writing from /tmp/mt7986_redmi_ax6000-fip-fixed-parts.bin to FIP ...
- root@XiaoQiang:~# mtd verify /tmp/mt7986_redmi_ax6000-fip-fixed-parts.bin FIP #使用mtd verify命令对比uboot文件和FIP分区
- Verifying FIP against /tmp/mt7986_redmi_ax6000-fip-fixed-parts.bin ...
- 72a110768c7473200b863a3c5d4dd975 - FIP
- 72a110768c7473200b863a3c5d4dd975 - /tmp/mt7986_redmi_ax6000-fip-fixed-parts.bin #这个不是md5值,使用什么算法我不清楚
- Success #显示Success表示检查没问题,显示Failed表示失败,需要重新刷下再检查
- root@XiaoQiang:~#
复制代码
对比检查最后输出“Success"说明刷入已成功,此时拔掉路由器电源,然后将电脑的IP地址设置为固定的192.168.31.100/24,接着按住路由器的RESET按钮后通电开机,等待15秒后松开RESET(因为uboot尚未支持LED指示灯,所以指示灯不会亮),用Chrome浏览器进入192.168.31.1,就会见到uboot的webui(Web failsafe UI),在这个webui页面选择要刷入的110MB大分区固件。
注意:红米AX6000官方系统支持WAN、LAN切换,可以随意插网线自动识别,但是刷op后WAN口固定是1口(靠近电源插头的那个口),2-4口是LAN口,网线插LAN口才能获取到IP,登录路由器。
PS:经过观察,进不死uboot不需要住RESET按钮后通电,只需要在通电后5秒内,按住RESET按钮等待10秒,再松开即可,可单手操作。
数秒的小技巧:心中默念用三位数来数秒即可,如001、002、003、004、005……015。
进uboot的webui时的TTL输出:
经测试,hanwckf大佬的不死uboot支持直接刷入factory.bin或sysupgrade.bin。详情可以看
如果刷sysupgrade.bin启动不了,可以尝试刷factory.bin。
237大佬的闭源OP的uboot大分区固件其实是sysupgrade.bin,包含kernel和rootfs,uboot会读取把这两块分别写入相应地址。
使用Chrome浏览器上传uboot大分区固件,然后点击update,等待出现UPGRADE COMPLETE!更新成功正在重启界面,表示已经刷入成功。
如果第一次刷出现UPGRADE FAILED更新失败,可能是因为Failed to attach UBI失败,可以刷新192.168.31.1页面,重新上传再刷一次即可。
如果刷固件后等很久系统都没有起来,可以断电重新进uboot再刷一次。
webui刷固件完整过程:
有可能出现的更新失败界面:
提示刷入更新成功,正在重启即可把电脑IP设置自动获取,等2分钟(经过观察,刷完重启到启动完成要1分40秒),浏览器输入固件地址登录即可,237大佬闭源op是192.168.6.1。
因为现在uboot未支持LED指示灯,LED会保持之前的状态,对于尚未支持LED驱动的固件,刷了之后指示灯是关闭的,不用看指示灯来判断是否已完成启动。
目前开源源码编译的固件都已支持LED,hanwckf大佬的闭源源码也支持了,等237大佬的支持就都可以看灯来判断启动是否完成了。
uboot下刷好固件,重启后SSH登录闭源OP查看分区,可以看到ubi分区变成了110MB,ubinfo -a查看实际可用106.5MB:
- root@ImmortalWrt:~# cat /proc/mtd
- dev: size erasesize name
- mtd0: 08000000 00020000 "spi0.1"
- mtd1: 00100000 00020000 "BL2"
- mtd2: 00040000 00020000 "Nvram"
- mtd3: 00040000 00020000 "Bdata"
- mtd4: 00200000 00020000 "Factory"
- mtd5: 00200000 00020000 "FIP"
- mtd6: 00040000 00020000 "crash"
- mtd7: 00040000 00020000 "crash_log"
- mtd8: 06e00000 00020000 "ubi"
- root@ImmortalWrt:~# cat /proc/partitions
- major minor #blocks name
- 31 0 131072 mtdblock0
- 31 1 1024 mtdblock1
- 31 2 256 mtdblock2
- 31 3 256 mtdblock3
- 31 4 2048 mtdblock4
- 31 5 2048 mtdblock5
- 31 6 256 mtdblock6
- 31 7 256 mtdblock7
- 31 8 112640 mtdblock8
- 253 0 31372 ubiblock0_1
- 252 0 245760 zram0
复制代码 刷闭源OP Full版 uboot大分区固件,软件安装剩余62MB~
关于不同的110MB大分区固件的强制刷机:
Web上系统->备份/升级中更新固件,提示不支持的映像文件,这个大概率是因为各个源码仓库对固件命名不同,可以忽略。
只要是uboot 110MB大分区固件,都可以强制刷。直接不勾选保留配置,勾选强制刷机即可。
如果没有强制刷机的选项,就将sysupgrade固件上传到tmp文件夹,ssh登录用命令强刷:
- sysupgrade -F -n /tmp/sysupgrade.bin
复制代码 -F | --force 即使固件校验失败也强制烧写
-n 重刷固件时不保留配置文件
【2】从hanwckf大佬的不死uboot刷回官方
hanwckf大佬的多分区uboot已经支持修改后的官方固件,不需要刷回官方的FIP了
参考这里https://www.right.com.cn/forum/thread-8312884-1-1.html
原理参考红米AX6刷回官方固件,就是把uboot还原回原厂uboot(因为没有刷分区表文件,所以没有刷回原厂分区表操作),再用官方修复工具恢复官方固件。
目前只知道237大佬和hanwckf大佬的闭源OP是已解锁FIP的,可以直接刷uboot,如果当前固件不能刷FIP分区,请先刷回闭源OP,再刷回原厂uboot。
建议使用自己机子的FIP备份,其他的我没试过。将自己的原厂FIP备份文件,如mtd5_FIP.bin,上传到tmp文件夹下,然后解锁FIP分区的固件下输入命令刷入:
- md5sum /tmp/mtd5_FIP.bin
- mtd write /tmp/mtd5_FIP.bin FIP
- mtd verify /tmp/mtd5_FIP.bin FIP
复制代码 注意:写入FIP分区时不能断电、重启,不然就直接变砖,只能上编程器了。
这里和刷不死uboot一样,使用md5sum检查上传到tmp文件夹的原厂uboot文件的md5值和你保存的是否一样,无误后用mtd write将原厂uboot文件写入FIP分区,再用mtd verify对比检查原厂uboot文件是否已写入FIP分区。
注意mtd命令最后的FIP是大写。
对比检查最后输出“Success"说明刷入已成功,可以断电路由器,然后打开小米路由官方修复工具进行修复了。
小米路由官方修复工具
MIWIFIRepairTool.x86.zip
红米AX6000 RB06官方固件
miwifi_rb06_firmware_847e9_1.0.48.bin
网线接路由器和电脑,路由器断电,电脑退出杀毒软件,还有Windows的自带Windows Defender防火墙杀毒,必要时关闭电脑防火墙,打开小米路由修复工具,选择官方的rb06固件,网卡选择当前连接路由器的网卡,点下一步,工具会自动配置网卡IP为192.168.31.100/24,配置好后会显示刷机步骤,然后按住路由器RESET插电开机,大概12秒后等到黄灯闪烁后可以松开RESET,等待小米路由修复工具连接路由器开始上传固件,上传完后会刷机,刷机成功后蓝灯闪烁。等待10秒后重新断电插电即可恢复到官方系统。点击退出小米路由修复工具,网卡会自动恢复自动获取的配置。
如果有的人刷回官方,发现即使路由器已正常上网,指示灯却一直蓝灯闪烁(正常官方固件下,路由器已联网指示灯是白灯常亮)。
可能是官方固件解锁SSH后没关开发者模式导致的,SSH登录输入指令清除crash分区(关开发者模式)并重启:
【3】TTL简单使用
本来想搞TTL救砖的,但是转念一想,根本不存在成砖的可能性
如果保留官方分区刷机,使用原厂uboot的,直接小米救砖工具救砖就行了,如果刷hanwckf大佬的不死uboot,直接进uboot的webui刷固件就行,根本不存在成砖的可能性!
注:hanwckf的不死uboot实测可以刷factory.bin或sysupgrade.bin,如果刷sysupgrade.bin启动不了,可以尝试刷factory.bin。
除了像我这种手痒又没能力的,直接进TTL里面瞎搞,然后自己搞坏uboot成真砖了……
红米AX6000的CPU是MT7986A,查看datasheet,MT7986A的UART引脚是3.3V,建议使用TTL电平为3.3V的USB转TTL工具,1.8V的也可以。
这个3.3V也可以从闪存供电电压3.3V看出或者直接万用表测量TX、RX得到是3.3V的。
我使用的是FT232RL,可以跳线设置输出电平为3.3V或1.8V,或者使用改3.3V的CH341A土豪金编程器的TTL也行。
接上TTL线,按免拆TTL接好TX GND RX,VCC不要接。
打开putty或者Xshell之类的串口软件,默认波特率保持115200即可,端口号选择实际插入时的端口号,然后打开串口即可。
使用tftpd64软件通过TFTP协议上传文件到路由器,下载解压出软件,将你FIP分区的备份,如mtd5_FIP.bin放到软件根目录下即可。
设置网卡IP:192.168.31.100/24,关闭电脑防火墙!!运行tftpd64软件,选择192.168.31.100的网卡。
上电开机,点击串口软件输出窗口,按住键盘上或者下方向键,等待进入U-boot启动目录:
- *** U-Boot Boot Menu ***
- 1. Startup system (Default)
- 2. Upgrade firmware
- 3. Upgrade ATF BL2
- 4. Upgrade ATF FIP
- 5. Upgrade single image
- 6. Load image
- 0. U-Boot console
- Press UP/DOWN to move, ENTER to select, ESC/CTRL+C to quit
复制代码 如果你的uboot搞坏了,你是进不了uboot菜单或控制台的,只能编程器。这里演示下刷FIP分区,第1种方式可以直接在菜单里选择4. Upgrade ATF FIP,然后输入TFTP服务器和文件信息来刷FIP:
- *** Upgrading ATF FIP ***
- Available load methods:
- 0 - TFTP client (Default)
- 1 - Xmodem
- 2 - Ymodem
- 3 - Kermit
- 4 - S-Record
- Select (enter for default): 0
- Input U-Boot's IP address: 192.168.31.1 # 输入uboot的IP地址
- Input TFTP server's IP address: 192.168.31.100 # 输入TFTP服务器的IP地址
- Input IP netmask: 255.255.255.0 # 输入IP掩码
- Input file name: mtd5_FIP.bin # 输入要上传的文件名
- Using ethernet@15100000 device
- TFTP from server 192.168.31.100; our IP address is 192.168.31.1
- Filename 'mtd5_FIP.bin'.
- Load address: 0x46000000
- Loading: #################################################################
- #################################################################
- #############
- 400.4 KiB/s
- done
- Bytes transferred = 2097152 (200000 hex)
- Saving Environment to MTD... Erasing on MTD device 'nmbm0'... OK
- Writing to MTD device 'nmbm0'... OK
- OK
- *** Loaded 2097152 (0x200000) bytes at 0x46000000 ***
- Erasing from 0x0 to 0x1fffff, size 0x200000 ... OK
- Writing from 0x46000000 to 0x0, size 0x200000 ... OK
- Verifying from 0x0 to 0x1fffff, size 0x200000 ... OK
- *** ATF FIP upgrade completed! ***
- Erasing environment from 0x100000 to 0x11ffff, size 0x20000 ... OK
- MT7986> mtd read fip 0x50000000 # 读取fip分区到内存起始地址0x50000000
- Reading 2097152 byte(s) at offset 0x00000000
- MT7986> crc32 0x50000000 0x200000 # 计算内存起始地址0x50000000,大小0x200000的数据的crc32
- crc32 for 50000000 ... 501fffff ==> 18692078
复制代码 检查crc32没有问题,可以断电重启了。
注意:经过测试,通过菜单Upgrading ATF FIP时,也是按上传文件大小来擦除要写入的大小的,不会擦除整个fip分区,大佬说这样程序也不会跑飞,可以放心使用。
下面是进入U-Boot console输入mtd list查看分区:
- MT7986> mtd list
- List of MTD devices:
- * spi-nand0
- - device: spi_nand@1
- - parent: spi@1100a000
- - driver: spi_nand
- - path: /spi@1100a000/spi_nand@1
- - type: NAND flash
- - block size: 0x20000 bytes
- - min I/O: 0x800 bytes
- - OOB size: 64 bytes
- - OOB available: 24 bytes
- - 0x000000000000-0x000008000000 : "spi-nand0"
- * nmbm0
- - type: Unknown
- - block size: 0x20000 bytes
- - min I/O: 0x800 bytes
- - OOB size: 64 bytes
- - OOB available: 24 bytes
- - 0x000000000000-0x000007800000 : "nmbm0"
- - 0x000000000000-0x000000100000 : "bl2"
- - 0x000000100000-0x000000140000 : "Nvram"
- - 0x000000140000-0x000000180000 : "Bdata"
- - 0x000000180000-0x000000380000 : "factory"
- - 0x000000380000-0x000000580000 : "fip"
- - 0x000000580000-0x0000005c0000 : "crash"
- - 0x0000005c0000-0x000000600000 : "crash_log"
- - 0x000000600000-0x000002400000 : "ubi"
- - 0x000002400000-0x000004200000 : "ubi1"
- - 0x000004200000-0x000007400000 : "overlay"
复制代码 注意uboot控制台里显示的分区名称大小写!!!
还有一种是进入uboot控制台,使用mtd命令来刷FIP。在U-Boot Boot Menu时选择0. U-Boot console,马上回车几次中断uboot:
我这里是不死uboot的控制台,显示"MT7986> ",如果是原厂uboot,则显示"RB06> "。
- Hit any key to stop autoboot: 0
- MT7986>
- MT7986> tftpboot mtd5_FIP.bin # TFTP上传mtd5_FIP.bin到内存
- Using ethernet@15100000 device
- TFTP from server 192.168.31.100; our IP address is 192.168.31.1
- Filename 'mtd5_FIP.bin'.
- Load address: 0x46000000 # 文件被上传到了内存起始地址0x46000000
- Loading: #################################################################
- #################################################################
- #############
- 971.7 KiB/s
- done
- Bytes transferred = 2097152 (200000 hex)
- MT7986> mtd erase fip # 擦除fip分区
- Erasing 0x00000000 ... 0x001fffff (16 eraseblock(s))
- MT7986> mtd write fip 0x46000000 0x0 0x200000 # 从内存起始地址0x46000000开始读取数据并写入fip分区的起始地址0x0,大小0x200000
- Writing 2097152 byte(s) at offset 0x00000000
- MT7986> mtd read fip 0x50000000 # 读取fip分区数据到内存起始地址0x50000000
- Reading 2097152 byte(s) at offset 0x00000000
- MT7986> crc32 0x50000000 0x200000 # 计算内存起始地址0x50000000,大小0x200000的数据的crc32
- crc32 for 50000000 ... 501fffff ==> 18692078
复制代码 检查crc32没有问题,可以断电重启了。
当你uboot控制台使用mtd write前没有mtd erase,没有擦除就写入,会发生什么?!
因为uboot控制台里的命令比较简单,不会自动擦除,没有先擦写直接写入,可正常写入不报错,但是读取会报错误,此时需要马上擦除下,再写入一遍。如果你没擦除,写入后直接重启,就变砖!!
- MT7986> mtd read fip 0x50000000
- Reading 2097152 byte(s) at offset 0x00000000
- Failure while reading at offset 0x0
- Read on fip failed with error -74
复制代码 重启后你的TTL输出会卡在这里:
- NOTICE: SPI_NAND parses attributes from parameter page.
- NOTICE: SPI_NAND Detected ID 0x0
- NOTICE: Page size 2048, Block size 131072, size 134217728
- NOTICE: Initializing NMBM ...
- NOTICE: Signature found at block 1023 [0x07fe0000]
- NOTICE: First info table with writecount 0 found in block 960
- NOTICE: Second info table with writecount 0 found in block 963
- NOTICE: NMBM has been successfully attached in read-only mode
- INFO: BL2: Loading image id 3
- WARNING: Firmware Image Package header check failed.
- WARNING: Failed to access image id=3 (-2)
- ERROR: BL2: Failed to load image id 3 (-2)
复制代码 只有编程器能救了~
【4】CH341A/B编程器救砖
红米AX6000使用的闪存是ESMT F50L1G41LB,容量128MB,3.3V的SPI NAND。查看datasheet,数据阵列组织是这样的:
每个page包含存储数据的数据区Page size 2048 bytes :Data Storage Area,存储ECC(Error Checking and Correction)校验和标记是否存在坏块的备用区OOB(Out-Of-Band) size 64 bytes:Spare Area。
最后计算整个设备是128MB+4MB,即128MB的数据+4MB的OBB数据,128MB的叫做不含ECC_OOB的编程器固件,我们在openwrt里面备份的mtd0_spi01就是这个,128+4=132MB的叫做含ECC_OOB的编程器固件,这个需要编程器关闭闪存ECC才能读取到,openwrt官方论坛有网友也已共享了两种编程器固件。
根据hanwckf大佬所述,MT798x固件默认使用On-die ECC,根据闪存datasheet,用户开启内部ECC,当数据写入page时,ECC数据会内部生成并存储在OOB。我的理解是当开启闪存的内部ECC时,在写入数据时由内部自动生成ECC并记录,不需要其他设备如CPU的参与,我们可以不用管这个ECC。不对还请大佬指正!
这样我们就不需要含ECC_OOB的编程器固件了,直接用我们备份的分区或者整个编程器固件都可以在编程器写入,不用管ECC数据!
经查询,支持这个型号闪存的3.3V编程器比较便宜的是CH341A土豪金(我买到的是CH341B,也可以的,CH341B可以不接外部晶振),需要自己改3.3V,支持的软件有SNANDer和NeoProgrammer,不过NeoProgrammer不知道如何写入单独分区,我选择了SNANDer。
购买了CH341A编程器土豪金,发现网上说这个CH341A编程器土豪金的供电是5V,输出电平也是5V,为了安全接3.3V的设备,建议改为3.3V供电,我也跟着改了。电路如下,小心得翘起CH341A的28脚VCC,用一根导线接VCC脚再接到C3电容靠近1117-3.3那一侧(这里连接着9脚V3,其他版本的土豪金不一定是C3,注意自己测量),再接到1117-3.3中间输出端3.3V,使得VCC=V3=3.3V:
经测试,红米AX6000可以直接飞线到主板上的闪存,这样就方便很多了。建议使用飞线用的漆包线,这种软线不易在拉扯时扯坏焊盘!
当然,这样直接飞线不一定适用其他路由器,需要自己测试。
直接拆闪存下来则一定可以读取,我就是担心电路干扰,直接拆了,后面才发现飞线也可以……
避坑:
1.这个型号闪存底部有一个metal pad,算是比较大的焊盘,吹的时候多在中间打转吹,感觉中间焊锡差不多融化后再辐射吹两边的引脚。原厂高温焊锡加上冬天又没有加热垫,因此我风枪开430度吹了三次才吹下来,我都以为要吹坏了……记住冬天开高点温度,不超过450度吧,加焊油适当吹多10来秒,不要怕~
2.用吸锡带清理焊盘,尽量不要拖拽吸锡带,这样容易弄伤焊盘边上的绝阻焊漆。吸锡带是吸,不是拖。
3.本来想拆下闪存,搞个测试座上去,看了8x6 WSON8测试座某宝有个ASPI0002,不过引脚在座子下,看着需要加热台或者热风枪在背面吹才能焊接,没有这个技术暂时放弃了。另外一种“国产”8x6 WSON8测试座,这种不可以焊接在WSON8焊盘上。其他的方法就是自己用1.27mm排针和转接板DIY座子了。这个“国产”测试座转DIP8可以在编程器上正常读写,但是我拆下闪存,从主板闪存焊盘上引线出来接到这个测试座,路由器开机直接读取不到闪存,把测试座直接换成WSON8转DIP8转接板,闪存直接焊在转接板上,这次可以读取但是读取闪存ID出错,怀疑是引线出来相当于天线不适合高速读取,也有可能是我吸锡带弄伤了焊盘,焊接飞线连到破损的地方了。
拆下闪存、闪存没读取到时TTL输出:
- F0: 102B 0000
- FA: 1040 0000
- FA: 1040 0000 [0200]
- F9: 3905 0036
- F3: 1001 0000 [0200]
- F3: 1001 0000
- F6: 102C 0000
- F5: 1026 0000
- 00: 1005 0000
- FA: 1040 0000
- FA: 1040 0000 [0200]
- F9: 3905 0036
- F3: 1001 0000 [0200]
- F3: 1001 0000
- F6: 102C 0000
- 01: 102A 0001
- 02: 1005 0000
- BP: 2000 00C0 [0001]
- EC: 0000 0000 [1000]
- T0: 0000 00BE [010F]
- System halt!
复制代码 读取到闪存,但是读取ID出错时TTL输出:
- ERROR: Parameter page read fail, fallback to read ID.
- ERROR: Unrecognized SPI-NAND ID: 0xff 0xec 0x1 0xff
- NOTICE: SPI_NAND Detected ID 0xec
- NOTICE: Page size 0, Block size 0, size 0
- NOTICE: Initializing NMBM ...
- ERROR: Chip size 0 is not valid
- INFO: BL2: Loading image id 3
- WARNING: Failed to read FIP (-5)
- WARNING: Failed to access image id=3 (-5)
- ERROR: BL2: Failed to load image id 3 (-5)
复制代码
言归正传,路由器保持断电,飞线到CH341A编程器,仔细检查飞线安装位置正确、仔细检查飞线安装位置正确、仔细检查飞线安装位置正确,不然可能烧主板,然后可以插入编程器到USB接口。
下载Windows下可运行的SNANDer.exe和驱动zadig.exe,插上编程器,按照安装说明install安装驱动,拷贝你的FIP分区备份或不含ECC编程器固件,放在SNANDer.exe相同目录下,在CMD终端中打开该目录,输入命令进行操作。
开始先备份,养成好爱好:
- SNANDer -i
- SNANDer -r Backup.bin
- SNANDer -d -r Backup_ECC_OOB.bin
复制代码 第一句是查看闪存信息,第二句是备份不含ECC_OOB的编程器固件,第三句是备份含ECC_OOB的编程器固件。
擦除128MB闪存只需要5秒,写入看文件内容,一般编程器固件写入在15分钟左右,读取20分钟左右。
我已经备份过了,这里不演示了,备份与否备份什么自己决定!
刷FIP:
还是那句话,刷写前先擦除!!!
- SNANDer -e -a 0x380000 -l 0x200000
- SNANDer -v -w mtd5_FIP.bin -a 0x380000 -l 0x200000
复制代码 第一句是擦除起始地址0x380000,大小0x200000的数据区,即fip分区,第二句是将mtd5_FIP.bin写入起始地址0x380000,大小0x200000的数据区,并校验。
输出是这样的:
- E:\>SNANDer -i
- SNANDer - Serial Nor/nAND/Eeprom programmeR v.1.7.7 by McMCC <mcmcc@mail.ru>
- Found programmer device: WinChipHead (WCH) - CH341A
- Device revision is 3.0.4
- spi_nand_probe: mfr_id = 0xc8, dev_id = 0x1, dev_id_2 = 0x7f
- Get Status Register 1: 0x83
- Get Status Register 2: 0x10
- Using Flash ECC.
- Detected SPI NAND Flash: ESMT F50L1G41LB, Flash Size: 128MB, OOB Size: 64B
- E:\>SNANDer -e -a 0x380000 -l 0x200000
- SNANDer - Serial Nor/nAND/Eeprom programmeR v.1.7.7 by McMCC <mcmcc@mail.ru>
- Found programmer device: WinChipHead (WCH) - CH341A
- Device revision is 3.0.4
- spi_nand_probe: mfr_id = 0xc8, dev_id = 0x1, dev_id_2 = 0x7f
- Get Status Register 1: 0x83
- Get Status Register 2: 0x10
- Using Flash ECC.
- Detected SPI NAND Flash: ESMT F50L1G41LB, Flash Size: 128MB, OOB Size: 64B
- ERASE:
- Erase addr = 0x0000000000380000, len = 0x0000000000200000
- Erase 100% [2097152] of [2097152] bytes
- Elapsed time: 0 seconds
- Status: OK
- E:\>SNANDer -v -w mtd5_FIP.bin -a 0x380000 -l 0x200000
- SNANDer - Serial Nor/nAND/Eeprom programmeR v.1.7.7 by McMCC <mcmcc@mail.ru>
- Found programmer device: WinChipHead (WCH) - CH341A
- Device revision is 3.0.4
- spi_nand_probe: mfr_id = 0xc8, dev_id = 0x1, dev_id_2 = 0x7f
- Get Status Register 1: 0x83
- Get Status Register 2: 0x10
- Using Flash ECC.
- Detected SPI NAND Flash: ESMT F50L1G41LB, Flash Size: 128MB, OOB Size: 64B
- WRITE:
- Write addr = 0x0000000000380000, len = 0x0000000000200000
- Written 100% [2097152] of [2097152] bytes
- Elapsed time: 15 seconds
- Status: OK
- VERIFY:
- Read addr = 0x0000000000380000, len = 0x0000000000200000
- Read 100% [2097152] of [2097152] bytes
- Elapsed time: 21 seconds
- Status: OK
复制代码 刷完FIP后,救砖就完成了,断开编程器与路由器的转接板,接上TTL,路由器上电开机即可。如果第一次TTL卡在INFO: SPSR = 0x3c9,可以尝试断电再上电启动一次。
如果要刷不含ECC_OOB的128MB编程器固件可以:
- SNANDer -e
- SNANDer -w mtd0_spi01.bin
复制代码 如果要刷含ECC_OOB的132MB编程器固件可以:
- SNANDer -d -e
- SNANDer -d -w F50L1G41LB(ECC_DIS)@WSON8-AX6000-RB06.bin
复制代码 切记,uboot控制台、编程器里是擦除再写入!!!
op系统里可以直接用mtd write~
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
评分
-
查看全部评分
|