7. 双备份升级
双备份升级存储结构有两个app code区域,当芯片正在运行app code1,升级时将新固件写入app code 2区域,反之亦然。升级时对app code N区域数据校验成功后,复位即可运行app code N代码。当升级中断或者新写入固件校验不成功,不会影响原来app code 的运行
杰理双备份升级有两种方式实现
1.设备主动升级(由设备端主动向远端获取升级数据,通信协议需要能支持文件内容获取能力)
2.设备被动升级(由远端主动推送升级数据,设备端被动写入的方式,远端可控制升级流程
7.1. 支持双备份升级的芯片以及对应SDK版本
支持双备份升级的芯片:AD14/15/16/18/和AC104
AD14/15/AC104的v1.7.0 SDK和AD16 v1.3.0SDK需要添加补丁支持双备份设备被动升级。后续版本SDK会直接支持。
7.2. SDK相关配置
首先需要在isd_config.ini加入以下配置:
[EXTRA_CFG_PARAM] BR22_TWS_DB=YES; //dual bank flash framework enable(only valid for dual_bank) FLASH_SIZE=1M; //flash_size cfg (only valid for dual_bank) BR22_TWS_VERSION=0; //default fw version(only valid for dual_bank) DB_UPDATE_DATA=YES; //generate db_update_data.bin(only valid for dual_bank) SPECIAL_OPT=0; //special cfg : single bin generating(only valid for dual_bank) FORCE_4K_ALIGN=YES; // force aligin with 4k bytes(only valid for dual_bank) #NEW_FLASH_FS=YES; //enable single bank flash framework (only valid for single_bank)另外,AD14/15/16/18以及AC104需要关闭所有写保护,其中软件写保护位于
图1 软件写保护
如果升级使用simple_fat读取升级文件,需要去掉框内的限制
图2 simple_fat读函数
设备被动升级采用db_update_data.bin作为升级文件,升级文件会在编译下载的时候生成,在SDK示例中由于fat文件系统有8+3的长名限制,名字被缩短为db_data.bin
7.3. 相关接口说明
7.3.1. 函数u32 jlfs_get_idle_bank_info(u32 *bank_addr, u32 *bank_size)
此函数获取idle_bank的信息,其中参数:
1. bank_addr:空闲的code区地址,接口内部会更新到指针; 2. bank_size:空闲的code区大小,接口内部会更新到指针 3. 返回值: 成功 返回0; 失败 其他值;
7.3.2. 函数u32 jlfs_updata_dual_bank_info(u32 bank_addr, u16 data_crc)
此函数更新idle_bank的信息其中参数:
1. bank_addr:空闲的code区地址; 2. data_crc:升级文件校验值; 3. 返回值: 成功 返回0; 失败 其他值;
7.3.3. 函数u32 jlfs_check_dual_bank_info(u32 update_bank_addr)
此函数校验写入升级信息后的idle_bank信息,其中参数:
1. update_bank_addr:升级的code区地址; 2. 返回值: 成功 返回0; 失败 其他值;
7.4. 常见客户问题
1、AD15双备份升级后,使用强制升级工具升级失败?
AD15的download工具在下载的时候不会去主动擦除code2区的代码,所以需要在下载目录的download_bat.c加入-format all全擦除flash指令擦除code2区域代码,加入指令后需要编译一次,看到图中的全擦除模式生效即为配置成功。
图3 ad15编译擦除flash示意图