缘起

一般的路由器板子都是 SPI flash,NAND 的很少见。恰好 WiTi 这个板子已经预留了 NAND 焊盘,所以一直琢磨补上去。 后来更换 SPI flash 的时候不小心把焊盘给弄掉了,这下只能用 NAND 了。 吐槽下这个板子,表面上做工可以,其实用料很省,塑料的部件热风枪一吹就变形。

几种方案

  • 板子导出了JTAG口,如果能直接用JTAG写入NAND那肯定是最方便的。我试过用Raspberry Pi的GPIO连接,可以detect到四个CPU。后来换成Bus Blaster,可以直接在Windows上面运行命令。不过后续还是很困难,直接写入NAND的话需要NAND控制器的驱动,如果先把uboot load到内存中直接启动,这个要初始化板子的配置文件,里面要操作各种寄存器,可能要深入理解uboot后才知道怎么做。总的来说JTAG很强大,但是太底层。
  • 从SPI启动OpenWrt后,在OpenWrt里面直接用nand write命令操作NAND。这种方式不行,似乎因为MT7621的SPI和NAND有复用IO,在OpenWrt里面支持并不完善。
  • 从SPI启动到uboot,然后在uboot里面写入NADN。最后尝试成功。

uboot 和 OpenWrt 代码

https://github.com/fkpwolf/FireWRT-Uboot

https://github.com/fkpwolf/openwrt 死活不让 merge 到主干中,日了狗。

启动开关

默认是从 SPI 启动的,要修改启动模式,必须切换下 GPIO。 上面图中的 NAND Page 2k+128 bytes 指的是 NAND 的规格,不同的 NAND 规格不同,需要不同的代码来驱动。MTK u-boot 中支持的 NAND 设备列表如下。我选择 2k+64 模式,需要对调两个电阻。

最后效果。