编辑
2025-04-08
Openwrt
0
请注意,本文编写于 76 天前,最后修改于 16 天前,其中某些信息可能已经过时。

目录

拆解 Velop WHW03 v2,找到串口
1、拆解
2、串口位置和定义
准备工作
1、连接设备串口
2、准备原厂固件、启动TFTP服务
提前下载好Linksys原厂固件
启动 Mac TFTP 服务器
复制固件到 TFTP 目录
3、macOS实战
检查网卡接口
插入 CH341A 适配器,terminal输入:
使用 screen 连接(MacOS 默认支持)
进入 U-Boot
输入下列命令
擦除并写入固件
如果要刷入 主固件分区:
如果要刷入 备用固件分区:
设置 U-Boot 启动分区
重启设备
补充:正常启动,但双固件都刷成OpenWRT的恢复原厂固件办法
Reset to stock firmware
mtd on OpenWrt
写在最后

前段时间折腾OpenWRT,自己瞎搞把 Velop WHW03 v2 的mtd搞坏了,是的,双固件都搞坏了。 坏到什么程度呢?什么连续开关4次、长按reset通电继续按住30秒等等的failsafe都无效,就是无论如何都启动不了的程度... 具体表现为:LAN口不停的连接、断开、连接、断开...

于是,查询 OpenWRT官网资料,由于OpenWRT官网没有提供这台设备如何恢复原厂固件的详细步骤(其实根本没有),所以不得已只能再+ChatGPT+Gemini。

linksys_whw03v2.jpg

拆解 Velop WHW03 v2,找到串口

1、拆解

这台 v2 并没有拆解图,需要参考 whw03 v1 步骤和照片图示基本一致,但要注意下面这个差异点:

v2和v1在图4螺丝位置的差异

v1 的这颗螺丝在图示位置,而 v2 的在旁边白色的塑料延长脚上。

whw03_v1_p3.jpeg

要把这两块白色侧板推出来是真难,卡的非常紧,需要工具+巧劲,或者破拆准备😅

2、串口位置和定义

与 v1 的串口不同,v2 的串口是空孔位,没有安装针脚,因此我们需要的公头杜邦线。

whw03v2_serial_pinout.jpeg

准备工作

1、连接设备串口

用 CH341A 作为 TTL-USB 转串口适配器,只需要 连接 GND、TX、RX 三根线 到路由器的 UART 接口:

具体如下

CH341A <---> 路由器 UART
GND <---> GND
TXD <---> RXD
RXD <---> TXD

2、准备原厂固件、启动TFTP服务

提前下载好Linksys原厂固件

Linksys Velop whw03 v2 的原厂固件下载地址
macOS默认浏览器下载位置是:~/User/yourusername/Downloads/ 原厂固件的文件名是:FW_WHW03_2.1.19.215389_prod.img

启动 Mac TFTP 服务器

sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist sudo launchctl start com.apple.tftpd

复制固件到 TFTP 目录

sudo cp ~/User/yourusername/Downloads/FW_WHW03_2.1.19.215389_prod.img /private/tftpboot/bronx.img sudo chmod 666 /private/tftpboot/bronx.img

3、macOS实战

检查网卡接口

连接你的电脑到 WHW03 V2 的 LAN 口,并配置静态 IP:

IP: 192.168.1.100
Netmask: 255.255.255.0
Gateway: 192.168.1.1

插入 CH341A 适配器,terminal输入:

ls /dev/tty.*

你应该会看到一个类似: /dev/tty.usbserial-XXXXX 的输出结果

使用 screen 连接(MacOS 默认支持)

screen /dev/tty.usbserial-XXXXX 115200

进入 U-Boot

在 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。

设置 U-Boot 启动分区

如果刷入 prikern(主分区):

setenv boot_part 1 saveenv

如果刷入 altkern(备用分区):

setenv boot_part 2 saveenv

重启设备

reset

至此,我们的工作已完成,设备应该正常启动到原厂固件。

补充:正常启动,但双固件都刷成OpenWRT的恢复原厂固件办法

OpenWRT官方没写,我借鉴参考了MX5300的办法,稍作变通

Reset to stock firmware

注意

Flashing the factory Linksys firmware does NOT work with sysupgrade (LuCI or CLI) and MAY render your device inoperable.

mtd on OpenWrt

  1. Download the stock firmware for the device and copy it to the /tmp directory on the device. 1.1 If you saved the stock firmware to your computer, use scp -O firmware.img root@192.168.1.1:/tmp. Replace firmware with the actual file name and 192.168.1.1 with the actual IP address.
  2. 先在Advanced reboot界面看好,自己现在是运行在哪个分区上

Screenshot 2025-06-07 at 17.06.32.png 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"
  1. 假设Current是在分区02,那么我们刷01(Alternative)
cd /tmp mtd -e kernel write firmware.img kernel reboot
  1. 如果想要全部恢复,那么就把alt_kernel和alt_rootfs都刷一遍
cd /tmp mtd -e kernel write firmware.img kernel mtd -e alt_kernel write firmware.img alt_kernel reboot

写在最后

提示

用 UART 刷写固件的好处是:它可以在刷写过程中自动跳过nand的坏块,让固件可以继续写入运行,这一点是其他方式刷入固件做不到的。