小米WR30U路由器救砖记

前言

我在今年五月份购入了小米WR30U路由器 联通定制版,最初目的是为了刷openwrt以便在实验室使用dogcom来登陆校园网实现自动登录和多设备共享,同时也将代理功能交给路由器来做。但是后来发现这款路由器256MB的内存太捉襟见肘了,启动open clash后内存几乎占满,并且启动过程中CPU占用率会达到100%,运行非常卡顿。

之后我在香橙派上刷入了openwrt镜像,作为主路由,将dogcom、openclash、squid等服务都转移到软路由上,香橙派使用RK3588处理器,拥有16GB内存,作为软路由使用性能绰绰有余。小米路由器接在香橙派的LAN上,关闭DHCP,仅作为无线AP使用。

到这里其实一切正常,我舒舒服服地用了好几个月,直到前天晚上,我突然心血来潮想把小米路由器刷回官方固件,毕竟我已经不需要小米路由器上openwrt的任何功能了,使用官方固件或许会更稳定。好!说干就干!

前情提要

在讲述我的心酸救砖记之前,有必要介绍一下我在小米wr30u上刷入openwrt固件的过程。

主要参考了该教程:小米 WR30U 解锁 SSH 刷 openwrt,最有性价比的百元路由器 (qust.me)步骤简单总结如下:

  1. 启动路由器并完成配置初始化,上网方式选择DHCP,开启 与智能网关无线配置同步 开关,固定WAN口为网口1
  2. PC连接可上网的WIFI,同时使用网线连接路由器的任意LAN口,并在WLAN适配器设置的 共享 选项卡中启用 允许其他网络用户通过此计算机的Internet连接来连接 选项
  3. 打开系统终端,执行 pip install pycryptodome ,(前提需要安装python环境)
  4. 将教程中提供的 server_emulator.py 文件拖入终端,执行 python server_emulator.py 命令来解锁SSH登录,终端输出 Device informationfinish 代表成功解锁,默认用户名是root,密码是admin。注意这一步需要关闭系统防火墙再进行
  5. 断开路由器的网线,PC连接WR30U的WiFi,在终端中执行 ssh root@192.168.31.1 来连接路由器,输入密码后回车,输出 ARE YOU OK 界面表示连接成功
  6. 将教程提供的uboot文件 mt7981_xiaomi_wr30u-u-boot.fip 上传到路由器的 /tmp 路径下,文件传输可以使用WinSCP、MobaXterm等软件来完成
  7. 在终端中执行如下命令,将文件写入闪存的FIP分区中
cd /tmp
mtd write mt7981_xiaomi_wr30u-u-boot.fip FIP
  1. 将路由器断电,按住RESET按钮不放并接通电源,持续长按RESET键10s左右松开,此时路由器将进入uboot界面
  2. 使用网线连接PC和路由器的WAN口,即网口1,PC的以太网IP设置中,选择静态IP,将IP地址设置为192.168.1.2,子网掩码设置为255.255.255.0,网关设置为192.168.1.1,首选DNS设置为192.168.1.1,并保存
  3. 打开浏览器,在网址栏输入192.168.1.1回车,现在就可以看到uboot的web界面
  4. 点击选择文件上传教程提供的openwrt固件,点击 upload按钮,上传完毕后点击 upgrade 按钮,等待固件更新完成即可,路由器会自动重启进入openwrt系统
  5. 使用网线连接PC和路由器的LAN口,并将PC的以太网适配器IP设置为自动,在浏览器中输入 192.168.1.1 即可进入openwrt后台管理界面,默认用户名为 root,默认密码为 admin
  6. 接下来就可以愉快地使用openwrt强大的软件生态啦

刷官方固件变砖了

在刷回官方固件时,我仍然采用了小米 WR30U 解锁 SSH 刷 openwrt,最有性价比的百元路由器 (qust.me)该教程提供的方法:

  1. 在openwrt的TTYD中使用curl命令将 mt7981_xiaomi_wr30u-fip-stock-fixed-parts.bin 下载至 /tmp 目录下
  2. 执行 mtd write mt7981_xiaomi_wr30u-fip-stock-fixed-parts.bin FIP 命令将兼容原厂分区的uboot写入FIP分区中
  3. 按照原来的方式断电、按住REST按钮插电重启后就能进入uboot的web界面,上传并更新官方的 mtd8固件即可

但问题出在第3步,我断电重启后无法进入uboot界面,并且路由器的电源指示灯和网络指示灯都不亮了,我反复重启几次、反复长短按REST按钮都无济于事,我终于意识到我的路由器可能变砖了!

满世界找教程救砖

经过我的一番搜索学习,确认路由器变砖无疑,若想救砖,一般通过两种方式:使用编程器连接闪存芯片,直接刷入数据;使用串口连接PC,通过TFTP将文件传输至路由器并刷入。

好巧不巧,师弟说他手上刚好有USB转TTL CH320和USB to RS-232 DB9 PL2303的线,于是我立马掏出螺丝刀开始拆路由器。

这款路由器背面标签下面左右两边各有一颗螺丝,揭开标签拆掉后翻到正面,用撬片撬开盖板和底壳的缝隙,插入一张校园卡用力一划,盖板就可以拿下来了,内部结构如图所示:

电路板上覆盖了一块巨大的散热片,TTL接口就在右上角的矩形小孔内,为了方便接线,我还是拆掉了散热板,散热板和芯片之间有硅脂连接,粘合较为紧密。首先需要拆掉散热片上的四颗螺丝,然后从四个角依次轻轻施力,将散热片和硅脂分开,拆掉后内部结构如下图所示:

由于板子上的TTL接口并没有针脚,无法直接用杜邦线连接,有条件的话使用下图中的4P排针,这样无需焊接。但我没有这个小玩意,只有一把电烙铁,于是我就地取材,又拆了一个不用的鼠标,把它的红外LED灯的两个针脚掰了下来,针脚足够长,一根可以剪成两根用,这样我就拥有了四根针脚,可以接串口模块了!

但实际上我只需要焊三个针脚就足够了,分别是RX、GND、TX,即输入、地线、输出,另外的ACC接口无需接线,这里提供一张WR30U的线序图,图片来源于恩山论坛的朋友,在此表示感谢WR30U 尝试之后的救砖过程-小米无线路由器及小米网络设备-恩山无线论坛 (right.com.cn)

一番操作之后,终于焊接成功,最终效果如下,虽然不好看,但能用就行。

连接串口调式

连接串口的过程也不是一帆风顺的,首先我尝试了PL2303的线,串口线连接PC后win11系统会自动安装好驱动,打开MobaXterm,新建串口会话,具体配置如下:

但是当我给路由器通电后,串口输出的却是一堆乱码,师弟说这种情况一般是波特率的问题,可以换几个不同的试试看,于是我尝试了所有可以设置的波特率,但乱码依旧,只是内容不同,我切换过不同的终端软件和编码,无济于事,我认为是PL2303对这款路由器的兼容性不好。

接下来我又切换到CH320线,但是在这里我成功地搞反了输入输出,串口会话界面空空如也,我以为是我接错线把芯片烧坏了。但事实上在接TTL线时应该把路由器的RX接到CH320的TX,将路由器的TX接到CH320的RX,并联通彼此的GND。在我尝试对调输入输出线之后,串口终于能输出正常的内容了!

ERROR: BL2: Failed to load image id 3 (-2)

  • 这条错误信息表明 BL2 阶段尝试加载 image id 3(通常是启动文件或者内核镜像)时失败了,错误代码 -2 通常表示文件未找到或者无法读取。
  • 这个错误表明启动过程中尝试从存储设备(如 SPI NAND)加载关键的引导镜像失败,可能是由于以下原因:
    • 镜像丢失或损坏:加载的镜像文件(通常是操作系统的内核或启动相关文件)可能在闪存中不存在或者损坏。
    • 读取错误:闪存中的某些区域可能损坏,导致无法读取镜像。
    • NAND 管理问题:虽然 NMBM 已经进入只读模式,但这意味着系统可能无法写入,导致后续的加载步骤失败。

输出的信息显示在BL2加载镜像时出错,我必须重新刷写uboot。但是串口输出显示我无法进入传说中的5s启动界面,无法进入U-Boot控制台,于是我继续搜索教程,直到在恩山论坛发现了一篇看起来非常行之有效的帖子,JCG Q30 PRO救砖教程,MTK mt798x 系列基本通用-无线路由器硬件改造以及故障维修-恩山无线论坛 (right.com.cn)以及MediaTek Filogic 系列路由器串口救砖教程 – 暗云 – 博客园 (cnblogs.com)

  1. https://www.lanzouw.com/ioTYu1pvi23g下载mtk_uartboot工具和BL2文件,下载得到一个压缩包,解压后得到mtk_recovery文件夹,进入该文件夹,并将小米官方uboot文件放入该文件夹中。
  2. 进入该文件夹中,在当前目录打开终端,并执行如下命令:
.\mtk_uartboot.exe -s COM6 -p .\mt7981\mt7981-ddr3-bl2.bin -a -f mt7981_wr30u-fip-fixed-parts-multi-layout.bin --brom-load-baudrate 115200 --bl2-load-baudrate 115200
  1. 命令执行后给路由器通电,输出结果如下图所示:
  1. 当最后一行NOTICE...输出后立刻打开串口会话,此时会进入uBoot启动的5s选择时间,按上下键可以切换菜单选项并停止倒计时,如果错过倒计时界面可以按Ctrl+C进入mtk console
  2. (可选)执行mtkupgrade bl2,然后按0选择使用TFTP传输,然后完成uboot IP、server IP、子网掩码、文件名的输入,即可写入文件
  3. mkt console中执行mtkupgrade fip,继续使用TFTP传输uboot文件并写入,写入成功后输出如下:
  1. 最后输入reset就会重启,可以正常进入uboot了,救砖成功

以上过程是理想情况下的结果,当我执行完步骤3之后,路由器的两个灯都会亮黄灯,并且写入文件都是成功的。但是当我执行完上述所有步骤之后重启路由器,电源指示灯和网络指示灯又不亮了。

我尝试过使用不同的uboot文件执行上述步骤,无一例外在路由器重启后两个灯不亮,并且无法进入uboot。唯一的区别就是在过程中有的固件只亮一个黄灯,有的亮两个黄灯。串口有时会出入如下信息:

我也尝试过在执行完步骤6之后,继续执行mtkupgrade firmware刷入固件,并启动系统,好几次我甚至都进入了web uboot界面,也能成功上传固件,但点击升级后路由器一旦重启有无法启动了。

经过我的一番折腾,路由器的状态好像变得更加糟糕了,此时给路由器通电后串口输出的内容如下:

F0: 102B 0000
FA: 1040 0000
FA: 1040 0000 [0200]
F9: 3903 0041
F3: 1001 0000 [0200]
F3: 1001 0000
F6: 102C 0000
F5: 480A 0031
00: 1005 0000
FA: 1040 0000
FA: 1040 0000 [0200]
F9: 3903 0041
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 00ED [010F]
System halt!

这个信息在路由器没有FLASH的情况下都可以输出,不过这个输出信息与教程中路由器的输出是一致的,因此我认为路由器还有救,并没有放弃它。

后来点醒我的是另外一篇帖子,“System halt!” message at the booting of MT3000 – Technical Support for Routers – GL.iNet (gl-inet.com)其中针对System hatl的解决方案是将bl2文件和fip文件分别写入闪存中的x0000000x380000 位置。这给了我灵感,我认为刷写uboot后重启路由器无法启动的原因是bl2uboot文件与路由器不适配,或者二者互相不兼容,或者是我通过mtkupgrade这种方式并没有将文件写入Nand中。

经过查询,我发现在mtk console中是可以执行mtd命令的,那我岂不是可以使用mtd write将官方的bl2fip分区的备份文件直接写入Nand的对应分区中呢?

后来我在小米Wr30u原厂固件备份-联通版本 – VPS攻略 (vpsgongyi.net)该网站中找到了小米WR30U联通版的各个分区的备份文件,开始了新的尝试。此时已经是晚上十一点钟,本着不成功便成仁的想法,要是这把还不行我就放弃了。

具体过程如下:

  1. 通过之前的mtk_uartboot工具进入mtk console界面
  2. 执行mtd list查看分区信息,主要观察bl2fip分区的offset参数,也就是该分区在闪存中的起始位置
  3. 执行mtd erase bl2mtd erase fip擦除分区数据
  4. 执行printenv查看可用的内存地址
  5. 执行tfptroot 0x46000000 BL2.bin将TFTP服务器中的BL2.bin文件下载到内存中的对应为止,该位置就是通过printenv输出的可用内存位置,此前需要执行以下命令配置TFTP的ip
setenv ipaddr 192.168.1.2      # 设置设备的 IP 地址
setenv serverip 192.168.1.10   # 设置 TFTP 服务器的 IP 地址
  1. 执行mtd write bl2 0x46000000将内存中该位置的文件写入闪存的bl2分区中
  2. 参考步骤5将FIP.bin文件下载到内存中下一个可用位置中(printenv中的地址加上bl2.bin文件的大小)
  3. 执行mtd write fip 0x460FFFFF刷写fip文件,要注意这里的地址要根据实际情况来

执行完上述步骤后,我在浏览器中输入192.168.31.1,网址栏会自动跳转到192.168.31.1/cgi-bin/luci/web,虽然网页会显示502。然后我重启了路由器,电源灯亮黄灯了!并且串口有了新的输出!

看起来并没有什么明显的错误信息,但似乎路由器还是无法正常启动,但此刻我的心情已经激动无比,这说明使用mtd命令直接写入分区是有效的。我认为路由器无法正常启动的原因可能是其他分区的数据还不正确,因此我打算今天一早再来将每个分区的数据都手动刷写到对应分区中。

令人惊喜的是,今天早上我给路由器通电后梳理接下来需要的操作,我随手试了试在浏览器输入192.168.31.1,它居然成功进入了小米官方固件的路由器初始化配置界面!!!

我将路由器和上级路由相连,并设置为有线中继模式,发现它可以正常使用了!WIFI信号也可以搜索到了,路由器的两个指示灯都变成蓝色了!

我用颤抖的手把了电源再次通电,路由器起初还是只有电源指示灯在闪黄灯,但是过了一会后就变成蓝灯了,网络指示灯也开始蓝色闪烁,一分钟后两个蓝灯常亮,路由器彻底救活咯!

后来我意识到,可能在昨天晚上手动刷完之后它就已经好了,只是我没有多等一会,也没有连接上级路由和进入路由器管理后台,所以它才一直是黄灯。我猜想可能是我之前通过mtkupgrade firmware升级了小米官方的wr30u固件发挥了作用,因此我才可以在手动刷完bl2和fip后就能直接成功启动。并且现在我只要下载米家APP就可以管理路由器了,而在之前由于是联通定制版,需要下载联通智家APP才可以。

至此,整个救砖过程落下帷幕。

我发誓我以后再也不刷路由器了!!!

如果你也遇到了类似的问题,可以通过我主页的联系方式寻求帮助^_^

评论

  1. mstlu
    2 周前
    2025-1-02 14:32:20

    写的真好,我正打给WR30U刷一个openwrt,看的教程也是你提到的那个。
    看来那个教程里面恢复官方固件的部分有点问题,要恢复官方固件的话还要再研究一下。
    谢谢你的博客!

    • 博主
      mstlu
      2 周前
      2025-1-02 15:27:07

      感谢留言!在解锁ssh后,刷入openwrt之前一定要做好官方固件的备份,祝你刷机顺利~

发送评论 编辑评论


				
上一篇
下一篇