跳到主要内容

tkl_ota | OTA 固件升级

tkl_ota API 提供内核层(TKL)的 OTA(Over-the-Air)固件升级钩子。升级分阶段进行:查询设备 OTA 能力、通知升级开始、逐包处理数据、通知升级结束。另有一个单独的接口用于获取旧固件信息以支持断点续传。每个函数成功时返回 OPRT_OK,失败时返回 tuya_error_code.h 中定义的错误码。

tkl_ota.c 实现由移植工具自动生成。你在用户自定义区域内添加平台相关代码,重新生成时这部分代码会保留。

tkl_ota_get_ability

OPERATE_RET tkl_ota_get_ability(uint32_t *image_size, TUYA_OTA_TYPE_E *type);

获取设备的 OTA 能力:可接收的最大固件镜像大小,以及支持的 OTA 类型。

参数方向说明
image_size输出设备可接收的最大固件镜像大小。
type输出支持的 OTA 类型,参见 TUYA_OTA_TYPE_E

成功时返回 OPRT_OK,其他值表示发生错误,详见 tuya_error_code.h

tkl_ota_start_notify

OPERATE_RET tkl_ota_start_notify(uint32_t image_size, TUYA_OTA_TYPE_E type, TUYA_OTA_PATH_E path);

通知平台 OTA 升级开始。实现会初始化升级过程所需的变量和状态。

参数方向说明
image_size输入即将写入的固件镜像大小。
type输入OTA 类型,参见 TUYA_OTA_TYPE_E
path输入数据到达的传输通道,参见 TUYA_OTA_PATH_E

成功时返回 OPRT_OK,其他值表示发生错误,详见 tuya_error_code.h

tkl_ota_data_process

OPERATE_RET tkl_ota_data_process(TUYA_OTA_DATA_T *pack, uint32_t *remain_len);

处理接收到的一个 OTA 数据包,将其负载写入 Flash。

参数方向说明
pack输入指向 OTA 数据包的指针,参见 TUYA_OTA_DATA_T
remain_len输出数据包中尚未处理的字节数。

成功时返回 OPRT_OK,其他值表示发生错误,详见 tuya_error_code.h

tkl_ota_end_notify

OPERATE_RET tkl_ota_end_notify(BOOL_T reset);

通知平台 OTA 传输已结束。实现会校验接收到的镜像并进行后续处理,可按需重置设备。

参数方向说明
reset输入升级完成后是否重置设备。

成功时返回 OPRT_OK。若校验失败或发生其他错误,则返回错误码,详见 tuya_error_code.h

tkl_ota_get_old_firmware_info

OPERATE_RET tkl_ota_get_old_firmware_info(TUYA_OTA_FIRMWARE_INFO_T **info);

获取当前固件的信息,用于在断点处恢复中断的传输。

备注

本 API 仅用于 BLE 子设备。

参数方向说明
info输出接收指向固件信息结构体的指针,参见 TUYA_OTA_FIRMWARE_INFO_T

成功时返回 OPRT_OK,其他值表示发生错误,详见 tuya_error_code.h

类型

TUYA_OTA_TYPE_E

OTA 升级包类型。

typedef enum {
TUYA_OTA_FULL = 1, ///< AB area switch, full package upgrade
TUYA_OTA_DIFF = 2, ///< fixed area, difference package upgrade
} TUYA_OTA_TYPE_E;

TUYA_OTA_PATH_E

OTA 数据到达的传输通道。

typedef enum {
TUYA_OTA_PATH_AIR = 0, ///< OTA from Wired/Wi-Fi/Cellular/NBIoT
TUYA_OTA_PATH_UART = 1, ///< OTA from uart for MF
TUYA_OTA_PATH_BLE = 2, ///< OTA from BLE protocol for subdev
TUYA_OTA_PATH_ZIGBEE = 3, ///< OTA from Zigbee protocol for subdev
TUYA_OTA_PATH_SEC_A = 4, ///< OTA from multi-section A
TUYA_OTA_PATH_SEC_B = 5, ///< OTA from multi-section B
TUYA_OTA_PATH_INVALID = 255 ///< OTA from multi-section invalid
} TUYA_OTA_PATH_E;

TUYA_OTA_DATA_T

一个 OTA 数据包。实现会将负载写入 Flash 的 start_addr + offset 处。

typedef struct {
uint32_t total_len; ///< ota image total len
uint32_t start_addr; ///< ota flash start addr
uint32_t offset; ///< ota image offset
uint8_t *data; ///< ota data
uint32_t len; ///< ota data len
void *pri_data; ///< private pointer
} TUYA_OTA_DATA_T;

TUYA_OTA_FIRMWARE_INFO_T

描述一个固件镜像。

typedef struct {
uint32_t len;
uint32_t crc32;
uint8_t md5[TUYA_OTA_FILE_MD5_LEN];
} TUYA_OTA_FIRMWARE_INFO_T;

TUYA_OTA_FILE_MD5_LEN 的值为 16