1、 背景
因项目原因,需要开发差分FOTA升级功能,差分升级优点是节省OTA传输数据量,非常适合LoRa,Zigbee等小无线升级场景,节省功耗等。
2、 原理
首先设备开机从boot跳转到app,当接收到来自无线的升级请求后,进行差分包下载,下载成功把ROM标志位置于某个值。然后设备重启进入boot。boot启动会进入差分升级分支,先解压差分包,然后程序运行差分算法,把APP分区和刚刚解压的差分包进行融合处理还原出新的固件包,并做更新。更新成功再重启,即可。
3、 操作流程
3.1 差分升级包制作
确保设备先运行老固件,然后分别打包两个bin固件。导入旧版本选择已经运行的老固件,导入新版本选择将要升级或降级的固件。然后选择差分文件打包。
原包:Tl-Z214_CTRL_SCR_1.0.0.406_20230311.bin
原包固件启动正常,编译于2023-03-11 12:27:22
升级包:Tl-Z214_CTRL_SCR_1.0.0.406_20230305.bin
升级包固件启动正常,编译于2023-03-05 14:39:35
差分包制作
差分升级包制作成功,并生成pach.bin文件。
3.2 APP下载差分升级包
使用JFlash工具烧录patch.bin文件到指定地址0x08011000模拟APP下载。
3.3 重启进入bootloader
发送shell命令 dbg diffota,程序将把ROM启动标志位置为差分升级标志,并重启进入boot。
3.4 解压差分包并运算差分算法还原新固件
3.5 校验新还原固件
校验还原的文件和新固件对不上,通过Jlink回读数据,用beyond工具比对,发现步骤3.4的确有微小差异。
串口打印crc校验错误
Jlink回读数据和原始对不上
下载到设备的查分包和原始是一致的
有可能是解压有问题,打印出来看看解压的数据,在排查差分算法的问题。
最后一步解压状态可能不对
对比差分算法还原的内容,显示是flash写的问题。
3.6 拷贝新固件至APP运行分区并置位
不要拷贝新固件分区,直接擦写APP运行区,节省flash。
3.7 重启检查差分升级是否成功
差分升级成功
差分降级成功
4、 常见问题
FAQ1 差分算法还原的新固件和原始固件有细微差异,差异是两个字节FFFF?
答:是由于flash每次只能写4个字节导致。
FAQ2 差分升级报fsl err错?
答:是由于写flash的地址必须是偶数。
FAQ3 差分升级还原的新固件和原始固件还是对不上,有细微差异,差异是一个字节FF?
答:需要记住最后一个字节。