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 软件写保护"

图1 软件写保护

如果升级使用simple_fat读取升级文件,需要去掉框内的限制

"图2 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示意图"

图3 ad15编译擦除flash示意图