网络升级¶
本文说明网络 OTA 的升级流程、关键接口和应用接入方式。
1. 参考代码¶
文件 |
作用 |
|---|---|
|
接收网络 OTA 数据并驱动下载状态流转 |
|
处理网络 OTA 数据解析和写入前解码 |
|
保存和恢复 OTA 断点续传状态 |
|
解析 OTA 数据包并校验包状态 |
|
读写 OTA 过程中的 NVM 状态 |
|
管理 OTA bin 文件信息和升级入口 |
2. 应用例程¶
场景 |
文件 |
调用接口 |
|---|---|---|
OTA 进度界面 |
|
|
OTA 错误提示 |
|
|
3. 简介¶
HTTP OTA通过BT PAN(后续支持WIFI/4G等方式)连接服务器,直接和服务器交互完成升级固件,无需手机APP中转,实现"有网即可升级"。升级包是由butterfli.exe编译生成的ota_all.bin,属于全包升级。HTTP OTA使用的升级包和TF OTA一致,所以安装流程两者相同
4. 配置¶
HTTP OTA升级需要备份,目前支持NAND, NOR RAMRUN, NOR + TF三种工程升级。三种升级区别:
NAND 网络升级均在HCPU中进行,属于边下载边升级,升级过程中不可逆
NOR RAMRUN网络升级在HCPU和ota manager中进行,属于边下边升级,升级过程中不可逆。ota manager中进行HCPU的解压升级处理
NOR + TF 网络升级在HCPU中下载,在ota manager中升级,属于先下载后升级,下载过程中可逆,ota manager中进行解压升级处理。
HCPU
OTA MANAGER
5. 如何升级¶
通过主菜单->设置->系统->系统升级->在线升级进行升级。 注意:
需要先连接BT PAN
服务器端有更新的升级包
6. 新增bin升级¶
新增bin升级,需要在ota_bin.c的bin_tbs[]中增加bin描述,描述结构如下:
typedef struct
{
uint8_t can_upgrade; //0 不可升级,bin在升级时会忽略 1,可升级。
uint8_t is_overwrite; //0 备份方式, 需要设定备份地址 1.覆盖方式,直接写入到bin的目的地址
uint32_t update_bit; //升级位,参考ota_bin.h中定义,最多支持32个bin(u32)
const char *name; //固件名,需要和ota_mix.exe制作出bin中的名称一致
uint32_t target_addr; //bin在固件的目的地址
uint32_t bin_size; //bin在固件的大小
bin_comm_process_cb preprocess_cb; //覆盖前的处理,对于覆盖模式,接收时调用,备份模式,安装覆盖时调用
bin_comm_process_cb postprocess_cb;//覆盖后的处理,对于覆盖模式,接收完成调用,备份模式,安装覆盖完成时调用
} bin_desc_t;
注意
未在bin_tbs[]中的bin,固件统一按照覆盖模式处理,起始地址和大小以固件包为准;
采用备份模式的bin,需在
ota_ext_get_backup_addr中实现备份地址的获取逻辑。
7. 续传¶
HTTP OTA支持续传处理,在以下场景时会自动记录续传点:
固件包解析单个bin时;
解析的非压缩bin,接收的大小相较于上次续传记录点刚好是1MB;
解析的非压缩bin,接收的大小相较于上次续传记录点大于等于1MB且解压写入的长度是flash的blk_size的倍数。
8. 进度¶
下载进度获取,通过接口注册更新升级百分比,NAND 和NOR RAMRUN升级获取下载进度即可,NOR + TF升级,安装进度也由此接口注册
void ota_register_progress_cb(ota_progress_cb_t callback)
9. 注意事项¶
续传时的显示的进度可能出现回退现象;
若固件包的 flashmap 发生变化,升级过程中重启后需重新开始升级;
若固件包的 flashmap 未变化,在文件系统 bin(fs_bin)升级过程中重启,该 fs_bin 需从头开始升级;
升级包由 Butterfli 生成,是全量包,其中文件系统 bin(fs_bin1、fs_bin2…)及 HCPU、LCPU、L_PATCH 统一采用 gzip 压缩,其余 bin 不压缩,自定义包可以通过 ota_mix.exe 生成;
FTABLE,BOOTLOADER,OTA MANAGER暂不支持升级。