为了避免升级过程突然断电,或者其他不良操作导致的路由器“变砖”。在MT7628使用过程中,我们可以对固件进行备份。
MT7628原厂SDK有关于双备份的选项,选择对应选项后,可对固件进行备份。下面以SKYLAB的SKW92A模组为例进行测试说明:
1.编译时,选择Dual Image
使用过程中,由于Uboot+Firmware的大小一般超过4MByte,对应flash选用8MByte空间。要备份Firmware部分,而Flash的大小一般是倍数增加,因此选择16MByte的Flash。如下:
如上选择后,打包的uboot.bin文件运行后,对应的如下,后面8Mbyte用来备份Firmware。对应分区划分如下:
0x000000000000-0x000000030000 : "Bootloader"
0x000000030000-0x000000040000 : "Config"
0x000000040000-0x000000050000 : "Factory"
0x000000050000-0x000000800000 : "Kernel"
0x000000800000-0x000001000000 : 备份固件
这种情况适用于固件损坏恢复到原固件的场景。
Uboot源码做了一些变量的检测比较,在实际应用中,我们发现次变量并没有用处,反而造成OK的应用固件被备份固件覆盖,因此去掉了这部分的代码,如下所示:
文件:./lib_mips/board.c,在board.c文件中,我们可以修改固件备份的判断逻辑,这里主要会根据划分的地址计算对应的CRC值,若是各分区的CRC计算正确,可以判断固件没有损坏。若是想在升级后,让备份分区的内容同步为升级后的固件也可以在此文件做修改。
1.1测试
初次启动时,back分区没有数据,启动时检测失败,此时应用分区的固件会被拷贝到back分区如下:
再次启动时,不在需要备份,检测通过后,直接运行:
但是当用户应用过程中,固件大于8Mbyte又想做备份功能时,这个方法将不能使用。因此,我们需要修改Uboot源码,将备份分区划分更小的空间。下面的示例中,我们将Flash最后的4Mbyte分区划分为Back分区,用于应用固件损害时,通过备份固件使得模组可访问,达到恢复的目的。
2.修改备份分区的大小
分区划分如下:需要说明,Back分区的固件和应用固件此时是不相同的。应用固件可以超过8Mbyte,Back固件不能超过4Mbyte。
对应地址如下:
0x000000000000-0x000000030000 : "Bootloader"
0x000000030000-0x000000040000 : "Config"
0x000000040000-0x000000050000 : "Factory"
0x000000050000-0x000000C00000 : "Kernel"
0x000000c00000-0x000001000000 : 备份固件
修改内容如下:由于SKW92A对应主芯片为MT7628,因此修改时,需要注意型号。
路径:./include/configs/rt2880.h,在此文件中我们主要修改地址,后面检测时,根据地址范围计算CRC值,因为地址划分很重要。
文件:./lib_mips/board.c。此处不需要修改。
2.1.测试
我们需要先将系统升级为要备份的固件,主要Back固件不要大于4Mbyte,若是大于4Mbyte会出现如下提示:
将固件升级为back固件,再次启动,即可备份固件。如下: