之前我的路由器刷成了砖,最初是通过焊接 NOR Flash 闪存来救活的,不过也没活多久,刷了几次固件后,发现 NAND 闪存已经无法引导了,多次尝试都无济于事。排查之后才发现,NAND 闪存的坏块越来越多,更致命的是地址 0x0 的位置都出现坏块,这下彻底玩脱了。虽然更换 NAND 闪存是可行的方案,但看着那颗 48 引脚的小封装,我就知道自己很难搞定。最终,我决定直接让NOR Flash上岗,这次不是仅作备用引导,而是让它完全替代 NAND 闪存,实现真正的长期救活。
编译适配固件
其实最麻烦的不是硬件方面,毕竟我已经都焊接好了,J10/J11各自短接后已经可以引导进去了,而是固件适配,因为openwrt官方针对小米路由器Pro(R3P)这款路由器的默认配置都是使用Nand闪存的,所以编译出来的固件肯定是不支持使用NOR闪存的,所以这里肯定得修改源码予以支持,不过我不太懂OpenWRT开发无从下手,所以网上搜索,找到这么一个github issues:能否适配一个小米路由器PRO(R3P)得SPI 闪存版
修改源码
参考了x-wrt的代码,做了如下修改:
- openwrt/target/linux/ramips/image/mt7621.mk文件夹增加:
define Device/xiaomi_mi-router-3-pro-nor
$(Device/uimage-lzma-loader)
IMAGE_SIZE := 16064k
DEVICE_VENDOR := Xiaomi
DEVICE_MODEL := Mi Router 3 Pro NOR (16M)
DEVICE_PACKAGES := kmod-mt7615e kmod-mt7615-firmware kmod-usb3 kmod-usb-ledtrig-usbport
SUPPORTED_DEVICES += xiaomi,mir3p-nor
endef
TARGET_DEVICES += xiaomi_mi-router-3-pro-nor
define Device/xiaomi_mi-router-3-pro-nor-8m
$(Device/uimage-lzma-loader)
IMAGE_SIZE := 7872k
DEVICE_VENDOR := Xiaomi
DEVICE_MODEL := Mi Router 3 Pro NOR (8M)
DEVICE_PACKAGES := kmod-mt7615e kmod-mt7615-firmware kmod-usb3 kmod-usb-ledtrig-usbport
SUPPORTED_DEVICES += xiaomi,mir3p-nor-8m
endef
TARGET_DEVICES += xiaomi_mi-router-3-pro-nor-8m
- openwrt/target/linux/ramips/dts文件夹下增加文件:
mt7621_xiaomi_mi-router-3-pro-nor-8m.dts、mt7621_xiaomi_mi-router-3-pro-nor.dts
#include "mt7621_xiaomi_mi-router-3-pro.dts"
/ {
compatible = "xiaomi,mi-router-3-pro-nor", "mediatek,mt7621-soc";
model = "Xiaomi Mi Router 3 Pro NOR (16M)";
};
&spi0 {
status = "okay";
flash@0 {
compatible = "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <25000000>;
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "u-boot";
reg = <0x0 0x30000>;
};
partition@30000 {
label = "u-boot-env";
reg = <0x30000 0x10000>;
};
factory: partition@40000 {
label = "factory";
reg = <0x40000 0x10000>;
nvmem-layout {
compatible = "fixed-layout";
#address-cells = <1>;
#size-cells = <1>;
eeprom_factory_0: eeprom@0 {
reg = <0x0 0x4da8>;
};
eeprom_factory_8000: eeprom@8000 {
reg = <0x8000 0x4da8>;
};
macaddr_factory_e000: macaddr@e000 {
reg = <0xe000 0x6>;
};
macaddr_factory_e006: macaddr@e006 {
reg = <0xe006 0x6>;
};
};
};
partition@50000 {
compatible = "denx,uimage";
label = "firmware";
reg = <0x50000 0xfb0000>;
};
};
};
};
&nand {
status = "disabled";
/delete-node/ partitions;
};
#include "mt7621_xiaomi_mi-router-3-pro.dts"
/ {
compatible = "xiaomi,mi-router-3-pro-nor-8m", "mediatek,mt7621-soc";
model = "Xiaomi Mi Router 3 Pro NOR (8M)";
};
&spi0 {
status = "okay";
flash@0 {
compatible = "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <25000000>;
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "u-boot";
reg = <0x0 0x30000>;
};
partition@30000 {
label = "u-boot-env";
reg = <0x30000 0x10000>;
};
factory: partition@40000 {
label = "factory";
reg = <0x40000 0x10000>;
nvmem-layout {
compatible = "fixed-layout";
#address-cells = <1>;
#size-cells = <1>;
eeprom_factory_0: eeprom@0 {
reg = <0x0 0x4da8>;
};
eeprom_factory_8000: eeprom@8000 {
reg = <0x8000 0x4da8>;
};
macaddr_factory_e000: macaddr@e000 {
reg = <0xe000 0x6>;
};
macaddr_factory_e006: macaddr@e006 {
reg = <0xe006 0x6>;
};
};
};
partition@50000 {
compatible = "denx,uimage";
label = "firmware";
reg = <0x50000 0x7b0000>;
};
};
};
};
&nand {
status = "disabled";
/delete-node/ partitions;
};
分别支持了8M和16M两种的NOR Flash闪存,进入make menuconfig选择对应的配置
刷入固件
之前我已经用编程器在闪存了刷入了pb-boot,所以固件我就直接进入pb-boot下刷就好了,但是遇到一个问题,这个pb-boot比较精简,里面并没有直接根据文件刷写闪存的命令,所以这里我直接把initramfs-kernel.bin固件加载到内存中直接启动,进入openwrt系统后再通过命令刷入正式固件:
tftp 0x80200000 initramfs-kernel.bin
bootm 0x80200000
进入openwrt后,通过scp把正式的固件上传到openwrt中,然后执行sysupgrade -v /tmp/openwrt-ramips-mt7621-xiaomi_mi-router-3-pro-nor-8m-squashfs-sysupgrade.bin
因为我手头只有W25Q64,所以这里我刷入的是编译好的8M闪存固件,至此这台小米路由器Pro算是正式复活了
评论区