前段时间折腾OpenWRT,自己瞎搞把 Velop WHW03 v2 的mtd搞坏了,是的,双固件都搞坏了。 坏到什么程度呢?什么连续开关4次、长按reset通电继续按住30秒等等的failsafe都无效,就是无论如何都启动不了的程度... 具体表现为:LAN口不停的连接、断开、连接、断开...
于是,查询 OpenWRT官网资料,由于OpenWRT官网没有提供这台设备如何恢复原厂固件的详细步骤(其实根本没有),所以不得已只能再+ChatGPT+Gemini。
这台 v2 并没有拆解图,需要参考 whw03 v1 步骤和照片图示基本一致,但要注意下面这个差异点:
v2和v1在图4螺丝位置的差异
v1 的这颗螺丝在图示位置,而 v2 的在旁边白色的塑料延长脚上。
要把这两块白色侧板推出来是真难,卡的非常紧,需要工具+巧劲,或者破拆准备😅
与 v1 的串口不同,v2 的串口是空孔位,没有安装针脚,因此我们需要的公头杜邦线。
用 CH341A 作为 TTL-USB 转串口适配器,只需要 连接 GND、TX、RX 三根线 到路由器的 UART 接口:
具体如下
CH341A <---> 路由器 UART
GND <---> GND
TXD <---> RXD
RXD <---> TXD
Linksys Velop whw03 v2 的原厂固件下载地址
macOS默认浏览器下载位置是:~/User/yourusername/Downloads/
原厂固件的文件名是:FW_WHW03_2.1.19.215389_prod.img
sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist sudo launchctl start com.apple.tftpd
sudo cp ~/User/yourusername/Downloads/FW_WHW03_2.1.19.215389_prod.img /private/tftpboot/bronx.img sudo chmod 666 /private/tftpboot/bronx.img
连接你的电脑到 WHW03 V2 的 LAN 口,并配置静态 IP:
IP: 192.168.1.100
Netmask: 255.255.255.0
Gateway: 192.168.1.1
ls /dev/tty.*
你应该会看到一个类似:
/dev/tty.usbserial-XXXXX
的输出结果
screen /dev/tty.usbserial-XXXXX 115200
在 screen 终端里,重新上电设备,并在启动过程中不断按 Ctrl+C 或 Enter,尝试进入 U-Boot 命令行。
它应该会进入交互模式,并显示:
(IPQ40xx) #
printenv
得到输出如下:
altkern=a800000 auto_recovery=yes baudrate=115200 boot_part=2 bootargs=init=/sbin/init rootfstype=ubifs ubi.mtd=alt_rootfs root=ubi0:ubifs rootwait rw bootcmd=if test $auto_recovery = no; then bootipq; elif test $boot_part = 1; then run bootpart1; else run bootpart2; fi bootdelay=2 bootpart1=set bootargs $partbootargs && nand read $loadaddr $prikern $kernsize && bootm $loadaddr bootpart2=set bootargs $partbootargs2 && nand read $loadaddr $altkern $kernsize && bootm $loadaddr fdt_high=87000000 flash_type=2 flashimg=tftpboot $loadaddr $image && nand erase $prikern $imgsize && nand write $loadaddr $prikern $filesize flashimg2=tftpboot $loadaddr $image && nand erase $altkern $imgsize && nand write $loadaddr $altkern $filesize image=nodes_v2.img imgsize=a100000 ipaddr=192.168.1.11 kernsize=d00000 loadaddr=81000000 machid=8010006 maxpartialboots=3 partbootargs=init=/sbin/init rootfstype=ubifs ubi.mtd=rootfs root=ubi0:ubifs rootwait rw partbootargs2=init=/sbin/init rootfstype=ubifs ubi.mtd=alt_rootfs root=ubi0:ubifs rootwait rw prikern=700000 serverip=192.168.1.100 stderr=serial stdin=serial stdout=serial Environment size: 1172/524284 bytes
在上面我们得到的环境变量 flashimg 和 flashimg2 预设了 NAND Flash 操作,我们可以直接使用它:
setenv image bronx.img run flashimg
setenv image bronx.img run flashimg2
flashimg 对应 prikern=700000,flashimg2 对应 altkern=a800000。
如果刷入 prikern(主分区):
setenv boot_part 1 saveenv
如果刷入 altkern(备用分区):
setenv boot_part 2 saveenv
reset
至此,我们的工作已完成,设备应该正常启动到原厂固件。
OpenWRT官方没写,我借鉴参考了MX5300的办法,稍作变通
注意
Flashing the factory Linksys firmware does NOT work with sysupgrade (LuCI or CLI) and MAY render your device inoperable.
3. 命令行查看mtd
输入
cat /proc/mtd
回车
cat /proc/mtd dev: size erasesize name mtd0: 00100000 00020000 "SBL1" mtd1: 00100000 00020000 "MIBIB" mtd2: 00100000 00020000 "QSEE" mtd3: 00080000 00020000 "CDT" mtd4: 00200000 00020000 "APPSBL" mtd5: 00080000 00020000 "ART" mtd6: 00080000 00020000 "u_env" mtd7: 00040000 00020000 "s_env" mtd8: 00040000 00020000 "devinfo" mtd9: 0a100000 00020000 "kernel" mtd10: 09b00000 00020000 "rootfs" mtd11: 0a100000 00020000 "alt_kernel" mtd12: 09b00000 00020000 "alt_rootfs" mtd13: 00200000 00020000 "sysdiag" mtd14: 0b500000 00020000 "syscfg"
cd /tmp mtd -e kernel write firmware.img kernel reboot
cd /tmp mtd -e kernel write firmware.img kernel mtd -e alt_kernel write firmware.img alt_kernel reboot
提示
用 UART 刷写固件的好处是:它可以在刷写过程中自动跳过nand的坏块,让固件可以继续写入运行,这一点是其他方式刷入固件做不到的。