目 录CONTENT

文章目录

小米路由器Pro死而复生:替换NOR Flash + 编译定制OpenWrt固件救砖

成培培
2026-03-05 / 0 评论 / 0 点赞 / 5 阅读 / 0 字

之前我的路由器刷成了砖,最初是通过焊接 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的代码,做了如下修改:

  1. 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
  1. openwrt/target/linux/ramips/dts文件夹下增加文件:mt7621_xiaomi_mi-router-3-pro-nor-8m.dtsmt7621_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算是正式复活了

0

评论区