OTA 固件升级
使用技术:Update 中间件(
upg.h)、Flash 分区管理前置阅读:NV 持久化存储
学习目标
- 理解 WS63 OTA 的整体架构——AB 分区 / 升级包下载 / 校验 / 切换
- 掌握 Update 中间件的 API(
uapi_upg_*)——固件写入、校验、激活 - 理解 OTA 包格式(.bin / .upg 头结构)和升级状态机
- 理解安全升级——签名校验、版本防回滚
基本概念
OTA 的三个传输路径
| 路径 | 传输方式 | 适用场景 |
|---|---|---|
| SLE OTA | 星闪近场 | 近场快速升级 |
| BLE OTA | 蓝牙近场 | 近场兼容升级 |
| WiFi OTA | HTTP 下载 | 远程批量升级 |
AB 分区架构
Flash 中 A/B 两个固件槽位——当前运行在 A 槽,新固件下载到 B 槽。
sequenceDiagram
participant A as App A 运行中
participant W as WiFi
participant B as App B 槽位
participant BL as Bootloader
A->>W: HTTP GET 下载固件
W-->>A: 固件数据
A->>B: uapi_upg_write 写入 B 槽
A->>A: uapi_upg_verify CRC 校验
A->>A: uapi_upg_active 设置启动标志
Note over A: 重启
BL->>BL: 读启动标志 → 指向 B
BL->>B: 启动新固件
OTA 包格式
固件 .bin 文件 + OTA 头(版本号、CRC32、签名、大小、目标槽位)。
涉及 API
| API | 用途 |
|---|---|
uapi_upg_init() |
初始化升级流程 |
uapi_upg_write(offset, data, len) |
写入固件数据到升级分区 |
uapi_upg_verify() |
CRC 校验升级包完整性 |
uapi_upg_active() |
激活新固件(设置启动标志) |
uapi_upg_get_status() |
查询升级状态 |
具体 API 以
upg.h头文件为准。
案例说明
做什么
WS63 WiFi 连接 → HTTP GET 下载固件包 → 写入 B 分区 → CRC 校验 → 激活 → 自动重启。
关键配置
| 参数 | 说明 |
|---|---|
| AB 分区大小 | Kconfig 配置,两槽大小相同 |
| 固件签名 | RSA-2048 或 ECDSA |
| 版本防回滚 | 新固件版本号 >= 当前版本 |
代码详解
概念性代码:
#include "upg.h"
uapi_upg_init();
/* HTTP 下载固件,分块写入 */
while (http_read(chunk, CHUNK_SIZE) > 0) {
uapi_upg_write(offset, chunk, CHUNK_SIZE);
offset += CHUNK_SIZE;
}
/* CRC 校验 */
int ret = uapi_upg_verify();
if (ret != 0) {
printf("OTA verify failed!\n");
return;
}
/* 激活新固件——重启后运行 */
uapi_upg_active();
printf("OTA success, rebooting...\n");
osal_msleep(1000);
system_reset();