跳转至

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();