1. 项目背景与设备现状
小米路由器3(R3)作为一款2016年发布的经典设备,凭借MT7620A方案和128MB内存配置,至今仍是刷机爱好者的热门选择。但这款设备有个致命弱点——它采用的NAND闪存芯片存在严重的坏块问题。我经手过二十多台R3设备,90%都会在刷机过程中触发坏块导致的写入失败,表现为黄灯常亮或完全无法启动。
上周又收到一台变砖的R3,症状是电源灯微亮、无法进入任何模式。拆机检查发现闪存型号是ESMT F59L1G81A,这是公认的"坏块王"。这种闪存在使用2-3年后,坏块数量会从出厂时的几个激增到几十个,直接导致固件关键分区损坏。
2. 救砖工具链准备
2.1 硬件改装方案
面对彻底变砖的设备,必须通过TTL串口获取调试信息。R3的TTL针脚藏在主板背面,需要:
- 使用CH340G USB转TTL模块(注意要选3.3V电平版本)
- 焊接四根杜邦线到主板测试点:
- TX → 主板RX(白色线)
- RX → 主板TX(绿色线)
- GND → 主板GND(黑色线)
- 不接VCC(避免电压冲突)
关键提示:焊接前先用万用表确认测试点,R3不同批次主板布局有差异。曾遇到VCC和GND反接导致芯片烧毁的案例。
2.2 软件环境配置
推荐使用Ubuntu 20.04作为操作平台,需要准备:
bash复制sudo apt install git build-essential libssl-dev mtd-utils
克隆必要的工具链:
bash复制git clone https://github.com/hanwckf/bl-mtools.git # NAND坏块处理工具
git clone https://github.com/padavan-rtfs/trunk.git # Padavan源码
3. NAND坏块处理实战
3.1 坏块检测与映射
连接TTL后启动设备,在Uboot阶段中断引导,执行:
bash复制nand bad
典型输出示例:
code复制Bad blocks at: 0x00000000 0x00020000 0x00060000 0x00180000 ...
记录所有坏块地址,后续操作需要避开这些区块。对于严重损坏的设备,可能需要先擦除整个闪存:
bash复制nand erase clean
3.2 分区表重规划
原厂分区表不适合存在大量坏块的设备,建议修改为:
| 分区名 | 起始地址 | 大小 | 说明 |
|---|---|---|---|
| bootloader | 0x000000 | 0x020000 | 保留Uboot |
| config | 0x020000 | 0x010000 | 跳过第一个坏块 |
| factory | 0x030000 | 0x010000 | 无线校准数据 |
| kernel | 0x040000 | 0x100000 | Padavan内核 |
| rootfs | 0x140000 | 0x600000 | 跳过中间3个坏块 |
| firmware | 0x740000 | 0x800000 | 合并分区 |
经验之谈:rootfs分区建议预留20%冗余空间,给坏块增长留出余量。曾有一台设备刷机半年后又因新增坏块崩溃。
4. Padavan固件刷写技巧
4.1 编译适配版本
修改Padavan源码中的配置文件:
diff复制# trunk/configs/boards/MI-R3/config
- CONFIG_MTD_NAND_BAD_BLOCK_DETECTION=y
+ CONFIG_MTD_NAND_BAD_BLOCK_SKIP=y # 自动跳过坏块
+ CONFIG_MTD_NAND_ECC_SOFT=y # 软件ECC校验
编译命令:
bash复制cd trunk
./build_firmware.sh MI-R3
生成固件路径:trunk/images/MI-R3_3.4.3.9-099.trx
4.2 安全刷机流程
-
通过TTL中断Uboot:
bash复制setenv serverip 192.168.1.100 # 你的TFTP服务器IP setenv ipaddr 192.168.1.1 # 路由器临时IP tftp 0x80060000 MI-R3_3.4.3.9-099.trx -
擦除并写入:
bash复制nand erase 0x040000 0x100000 # 仅擦除kernel分区 nand write 0x80060000 0x040000 0x100000 -
设置启动参数:
bash复制setenv bootcmd "nand read 0x80060000 0x040000 0x100000; bootm 0x80060000" saveenv
5. 救砖后的优化措施
5.1 坏块监控方案
在Padavan系统中创建定时任务:
bash复制# 每周扫描坏块并记录
echo "0 3 * * 0 nanddump /dev/mtd5 -b -f /tmp/badblocks.log" >> /etc/storage/cron/crontabs/admin
5.2 延长闪存寿命的技巧
-
禁用不必要的日志写入:
bash复制nvram set syslogd_enable=0 nvram commit -
使用内存文件系统:
bash复制
mount -t tmpfs tmpfs /tmp -
设置SWAP分区到USB设备(如有):
bash复制
mkswap /dev/sda1 swapon /dev/sda1
6. 典型问题解决方案
6.1 黄灯常亮问题
现象:刷机后电源灯变黄且无法连接
解决方法:
- 检查TTL输出是否卡在"Bad eraseblock"错误
- 进入Uboot重新擦除问题区块:
bash复制nand erase 0x140000 0x020000 # 擦除指定坏块区域 - 修改分区表避开该区域
6.2 无线信号丢失
现象:2.4G/5G信号无法开启
解决方法:
- 提取原厂eeprom数据:
bash复制dd if=/dev/mtd3 of=/tmp/factory.bin - 通过TFTP传回电脑备份
- 刷入Padavan后恢复:
bash复制
mtd write factory.bin Factory
7. 进阶改造思路
对于闪存严重老化的设备,可以考虑:
- 更换NAND芯片(需热风枪操作)
- 推荐型号:MX30LF1G18AC
- 焊接温度:300℃ 30秒
- 改SPI闪存方案:
- 需要飞线连接GPIO#0引脚
- 修改Uboot支持SPI启动
- 外接USB启动(最稳定方案)
bash复制setenv bootargs "console=ttyS0,115200 root=/dev/sda1 rootwait"
经过上述处理,我手上这台R3已经稳定运行Padavan 3个月,平均每天新增坏块0.2个。关键是要定期检查/proc/mtd信息,发现坏块增长过快就要及时调整分区策略。