接入第三方升级协议OTA教程
用户接入第三方协议教程
概述
对于用户自定义的协议或者第三方协议接入,可使用 dual_bank_updata_api.h
接口。此种升级方式使用的升级文件为 db_update_data.bin
,需要在 ini 里配置 flash 结构为双备份,且生成 db_update.bin
的配置。
配置要求
INI 配置文件设置
在 INI 配置文件中需要添加以下配置:
[EXTRA_CFG_PARAM]
BR22_TWS_DB = YES; // dual bank flash framework enable
FLASH_SIZE = CONFIG_FLASH_SIZE; // flash_size cfg
BR22_TWS_VERSION = 0; // default fw version
DB_UPDATE_DATA = YES; // generate db_update_data.bin
FORCE_4K_ALIGN = YES; // force aligin with 4k bytes
#NEW_FLASH_FS = YES; // enable single bank flash framework
重要注意事项
⚠️ 注意: 这里 ini 需要配置强制 4K 对齐,否则如果同一批生产的芯片有 256Byte 和 4K 对齐的芯片,会导致升级过后 VM 信息丢失。
API 接口详解
1. dual_bank_passive_update_init
功能: 初始化升级模块,创建升级任务
u32 dual_bank_passive_update_init(u32 fw_crc, u32 fw_size, u16 max_pkt_len, void *priv);
//db_data_update.bin数据结构
struct __tws_ota_para {u32 fm_size;u32 fm_crc;u16 max_pkt_len;u32 param_len;void *param;
};
参数说明:
fw_crc
: db_data_update.bin 的 CRC 值fw_size
: db_data_update.bin 的大小max_pkt_len
: 每次调用模块写入接口写入数据的最大长度priv
: 保留参数
返回值:
0
: 成功-2
: 内存不足-3
: 获取不到当前 flash 的文件接口(检查当前 ini 是否正确配置)
2. dual_bank_update_allow_check
功能: 检查当前的 flash 空间是否满足升级需求
u32 dual_bank_update_allow_check(u32 fw_size);
参数说明:
fw_size
: db_data_update.bin 的大小
返回值:
0
: 成功-1
: 升级模块未初始化-2
: 当前 flash 空间小于升级文件需要的大小
3. dual_bank_update_write
功能: 升级文件数据写入接口
u32 dual_bank_update_write(void *data, u16 len, int (*write_complete_cb)(void *priv));
参数说明:
data
: 写入数据的指针len
: 写入数据的长度write_complete_cb
: 数据写入成功的回调函数
重要说明:
- 数据并非调用完该接口就已经写入 flash
- 需要等
write_complete_cb
回调被调用才是成功写入了 - 这样设计是为了调用写入之后不用等到 flash 操作完成,可以在下次写的时候再去查上一次是否写入成功
返回值:
0
: 成功-1
: 升级模块未初始化-3
: 写入的数据长度大于初始化的时候传递的参数max_pkt_len
4. dual_bank_update_verify
功能: 数据校验接口,所有数据写入完成调用
u32 dual_bank_update_verify(void (*crc_init_hdl)(void),u32 (*crc_calc_hdl)(u32 init_crc, u8 *data, u32 len), int (*verify_result_hdl)(int calc_crc));
参数说明:
crc_init_hdl
: CRC 计算初始化接口,初始化 CRC 变量(用户端提供),传递 NULL 使用默认的 CRC16-CCITT Standardcrc_calc_hdl
: CRC 计算接口(用户提供),传递 NULL 使用默认的 CRC16-CCITT Standardverify_result_hdl
: CRC 计算成功回调函数,需要等待回调函数通知校验结果
回调函数参数说明:
calc_crc
为 1 时:校验成功calc_crc
为 0 时:校验失败
5. dual_bank_update_burn_boot_info
功能: boot_info 写入接口,在校验成功之后调用
u32 dual_bank_update_burn_boot_info(int (*burn_boot_info_result_hdl)(int err));
参数说明:
burn_boot_info_result_hdl
: boot_info 成功写入回调
回调函数参数说明:
-1
: 写入失败0
: 写入成功
返回值:
-1
: 升级模块未初始化
注意: CPU 复位之后则会运行新的代码
6. dual_bank_passive_update_exit
功能: 释放升级模块资源
u32 dual_bank_passive_update_exit(void *priv);
参数说明:
priv
: 保留参数
使用场景: 在失败或者升级结束之后调用
7. dual_bank_update_verify_without_crc
功能: 对于手机没有传 CRC 过来的方案,提供该接口来进行 CRC 校验
u8 dual_bank_update_verify_without_crc(void);
返回值:
0
: 校验成功1
: 校验失败
使用流程
- 初始化: 调用
dual_bank_passive_update_init
初始化升级模块 - 空间检查: 调用
dual_bank_update_allow_check
检查 flash 空间是否足够 - 数据写入: 循环调用
dual_bank_update_write
写入升级数据 - 数据校验: 调用
dual_bank_update_verify
进行数据校验 - 写入引导信息: 调用
dual_bank_update_burn_boot_info
写入引导信息 - 清理资源: 调用
dual_bank_passive_update_exit
释放资源
双备份被动升级流程图:
总结
通过以上接口,用户可以方便地实现第三方协议的接入和固件升级功能。关键是要正确配置 INI 文件,并按照正确的流程调用相关接口。
EOF