基于BSDIFF差分算法在TLZ210中控屏的实现

电子说

1.2w人已加入

描述

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

LoRa模块

原包固件启动正常,编译于2023-03-11 12:27:22

升级包:Tl-Z214_CTRL_SCR_1.0.0.406_20230305.bin

LoRa模块

升级包固件启动正常,编译于2023-03-05 14:39:35

差分包制作

LoRa模块

差分升级包制作成功,并生成pach.bin文件。

3.2 APP下载差分升级包

使用JFlash工具烧录patch.bin文件到指定地址0x08011000模拟APP下载。

LoRa模块

3.3 重启进入bootloader

发送shell命令 dbg diffota,程序将把ROM启动标志位置为差分升级标志,并重启进入boot。

LoRa模块

3.4 解压差分包并运算差分算法还原新固件

LoRa模块

3.5 校验新还原固件

校验还原的文件和新固件对不上,通过Jlink回读数据,用beyond工具比对,发现步骤3.4的确有微小差异。

LoRa模块

串口打印crc校验错误

LoRa模块

Jlink回读数据和原始对不上

LoRa模块

下载到设备的查分包和原始是一致的

有可能是解压有问题,打印出来看看解压的数据,在排查差分算法的问题。

LoRa模块

最后一步解压状态可能不对

LoRa模块

LoRa模块

对比差分算法还原的内容,显示是flash写的问题。

LoRa模块

3.6 拷贝新固件至APP运行分区并置位

不要拷贝新固件分区,直接擦写APP运行区,节省flash。

3.7 重启检查差分升级是否成功

LoRa模块

差分升级成功

LoRa模块

差分降级成功

4、 常见问题

FAQ1 差分算法还原的新固件和原始固件有细微差异,差异是两个字节FFFF?

答:是由于flash每次只能写4个字节导致。

FAQ2 差分升级报fsl err错?

答:是由于写flash的地址必须是偶数。

FAQ3 差分升级还原的新固件和原始固件还是对不上,有细微差异,差异是一个字节FF?

答:需要记住最后一个字节。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分