4.4.9.2. OTA API
本
源码hbre/otaupdate/src/ota_apis/hobot_ota_hl.c
头文件: hobot_ota_hl.h
针对 OTA HighLevel API开发
源码hbre/otaupdate/src/ota_tool
头文件: hobot_ota_hl.h
链接库: libupdate.so
动态库接口返回的错误类型
动态
enum ota_err_e {
OTA_SUCCESS = 0,
OTAERR_IO,
OTAERR_PLAT_UNSUPPORT,
OTAERR_REPEAT,
OTAERR_MUTEX_INIT_LOCK_ERR,
OTAERR_NOTINIT,
OTAERR_NULLPOINTER,
OTAERR_SHORTBUF,
OTAERR_THREAD_CREATE,
OTAERR_RANGE,
OTAERR_STAGE,
OTAERR_IMAGE_WRITE,
OTAERR_BOOT_FAILED,
OTAERR_VEEPROM,
OTAERR_FILE_TYPE,
OTAERR_UNZIP,
OTAERR_NO_EXISTS,
OTAERR_MALLOC,
OTAERR_VERIFY,
OTAERR_IMG_SIZE,
OTAERR_UPDATE_STATUS,
}
接口列表
| 接口 |
描述 |
|---|---|
| int32_t otaInitLib(void); | 动态 |
| int32_t otaDeinitLib(void); | 动态 |
| int32_t otaGetLibVersion(char *version, int32_t len); | 获取 |
| int32_t otaRequestStart(const char *image_name, enum ota_update_owner owner); | 启动 |
| int32_t otaGetResult(void); | 获取 |
| int32_t otaGetProgress(void); | 获取 |
| int32_t otaGetUpdatingImageName(char *image_name , int32_t len); | 获取 |
| int32_t otaGetSysVersion(char *version, int32_t len); | 获取 |
| int32_t otaGetPartition(uint8_t *partition); | 获取 |
| int32_t otaSetPartition(uint8_t partition); | 设置 |
| int32_t otaGetOwnerFlag(enum ota_update_owner *owner); | 获取 OTA owner(重启 |
| int32_t otaMarkOTASuccessful(void); | 标记 OTA 升级 |
| int32_t otaCheckUpdate(void); | 检查 |
| int32_t otaPartitionSync(void); | AB 分区、bak 分区 |
| void otaClearFlags(void); | 结束 |
otaInitLib
【函数
int32_t otaInitLib(void);
【参数
[OUT] N/A
[IN] N/A
【返回值】
OTA_SUCCESS: 成功
-OTAERR_REPEAT: 重复
初始化
【功能
板端
【示例代码】
#include <stdio.h>
#include <hobot_ota_hl.h>
int main(void) {
int32_t ret;
ret = otaInitLib();
if (ret != 0) {
printf("otaInitLib return: %d\n", ret);
return ret;
}
ret = otaDeinitLib();
if (ret != 0) {
printf("otaDeinitLib return: %d\n", ret);
return ret;
}
return 0;
}
otaDeinitLib
【函数
int32_t otaDeinitLib(void);
【参数
[OUT] N/A
[IN] N/A
【返回值】
OTA_SUCCESS: 成功
-OTAERR_NOTINIT: 当前
未 初始化,不能 调用 反 初始化
【功能
反
【示例代码】
参考 otaInitLib
otaGetLibVersion
【函数
int32_t otaGetLibVersion(char *version, int32_t len);
【参数
[OUT] version: 用于
存储 version 信息。version以 三段式 字符串 形式 返回(如:1.0.0) [IN] len: 传入
的 buffer 长度
【返回值】
OTA_SUCCESS: 成功
-OTAERR_NULLPOINTER: version 空
指针 -OTAERR_SHORTBUF: 传入
的 buffer 过 小 -OTAERR_PLAT_UNSUPPORT: 不
支持 获取 版本号
【功能
获取
【示例代码】
#include <stdio.h>
#include <hobot_ota_hl.h>
int main(void) {
int32_t ret;
char version[128];
if (ret = otaGetLibVersion(version, sizeof(version))) {
return ret;
}
printf("version: %s\n", version);
}
otaRequestStart
【函数
int32_t otaRequestStart(const char *image_name, enum ota_update_owner owner);
【参数
[OUT] N/A
[IN] image_name: 升级包
绝对路径。支持 多种不同 类型 的 包 同时 传入,用分 号 隔开。 [IN] owner: 发起
本次 升级 的 进程, owner 由 enum ota_update_owner 定义
【返回值】
OTA_SUCCESS: 成功
-OTAERR_NULLPOINTER: image_name 空
指针 -OTAERR_RANGE: owner设置
错误,超出 当前 定义 范围 -OTAERR_NOTINIT: 未
初始化 本 动态 库 -OTAERR_REPEAT: 当前
有 其他 进程 正在 升级 -OTAERR_IO: IO失败
-OTAERR_THREAD_CREATE: 线程
创建 失败
【功能
启动
【示例代码】
#include <stdio.h>
#include <hobot_ota_hl.h>
int main(void) {
int32_t ret;
int32_t result;
int32_t progress;
char imgname[256];
ret = otaInitLib();
if (ret != 0) {
printf("otaInitLib return: %d\n", ret);
return ret;
}
if (ret = otaRequestStart("/userdata/all_in_one.zip", OTA_TOOL)) {
printf("otaRequestStart return: %d\n", ret);
return ret;
}
do {
result = otaGetResult();
if (ret = otaGetUpdatingImageName(imgname, sizeof(imgname))) {
printf("otaGetUpdatingImageName return: %d\n", imgname);
}
progress = otaGetProgress();
printf("current image: %s, progress: %d\n", imgname, progress);
sleep(1);
} while(result != 0 && result != 3);
ret = otaGetPartition(&cur_part);
if (ret != 0) {
printf("otaGetPartition returned with %d\n", ret);
}
ret = otaSetPartition(1 - cur_part);
if (ret != 0) {
printf("otaSetPartition returned with %d\n", ret);
}
/* Then reboot system */
return 0;
}
otaGetResult
【函数
int32_t otaGetResult(void);
【参数
[OUT] N/A
[IN] N/A
【返回值】
OTA_UPGRADE_NOT_START: 升级
未 开始 OTA_UPGRADE_IN_PROGRESS: 升级
中 OTA_UPGRADE_SUCCESS: 升级
结束,成功 OTA_UPGRADE_FAILED: 升级
结束,失败 -OTAERR_NOTINIT: 未
初始化 本 动态 库
【功能
获取
【示例代码】
otaGetProgress
【函数
int32_t otaGetProgress(void);
【参数
[OUT] N/A
[IN] N/A
【返回值】
0 ~ 100: 当前
升级 进度(%) -OTAERR_NOTINIT: 未
初始化 本 动态 库
【功能
获取
【示例代码】
otaGetUpdatingImageName
【函数
int32_t otaGetUpdatingImageName(char *image_name , int32_t len);
【参数
[OUT] image_name: 用于
存放 结果 的 buffer。 image_name 可能 出现 的 内容: “idle_state”–升级 未 开始 “all_img_finish”–升级 完成 “”–未 开始 烧写 镜像 就 失败 其他 以”.img”结尾 的 包名 [IN] len: buffer 长度
【返回值】
OTA_SUCCESS: 成功
-OTAERR_NULLPOINTER: image_name 空
指针 -OTAERR_NOTINIT: 本
动态 库未 初始化 -OTAERR_SHORTBUF: buffer长度
太短
【功能
获取
【示例代码】
otaGetSysVersion
【函数
int32_t otaGetSysVersion(char *version, int32_t len);
【参数
[OUT] version: 用于
存储 version 信息。version 中 保存 系统软件 版本,以 日期 开头(yyyymmdd) [IN] len: 传入
的 buffer 长度
【返回值】
OTA_SUCCESS: 成功
-OTAERR_NULLPOINTER: version 空
指针 -OTAERR_SHORTBUF: 传入
的 buffer 过 小 -OTAERR_IO: io 错误,请
重试
【功能
获取
【示例代码】
#include <stdio.h>
#include <hobot_ota_hl.h>
int main(void) {
int32_t ret;
char version[128];
if (ret = otaGetSysVersion(version, sizeof(version))) {
printf("otaGetSysVersion return: %d\n", ret);
return -1;
}
printf("current system version: %s\n", version);
return 0;
}
otaGetPartition
【函数
int32_t otaGetPartition(uint8_t *partition);
【参数
[OUT] partition: 用于
接收 当前 分区 的 变量 地址。 *partition=0:当前 为 A 分区,*partition=1:当前 为 B 分区 [IN] N/A
【返回值】
OTA_SUCCESS: 成功
-OTAERR_NULLPOINTER: partition 为空
指针 -OTAERR_IO: io 错误,请
重试
【功能
获取
【示例代码】
otaSetPartition
【函数
int32_t otaSetPartition(uint8_t partition);
【参数
[OUT] N/A
[IN] partition: 下次
启动 分区。0:A 分区,1:B 分区
【返回值】
OTA_SUCCESS: 成功
-OTAERR_NOTINIT: 本
动态 库未 初始化 -OTAERR_RANGE: partition 范围
错误,partition 范围 为0和1 -OTAERR_IO: io 错误,请
重试 -OTAERR_STAGE: 当前
升级 阶段 不 支持。升级 过程 中 或 升级 失败 不 支持
【功能
设置
【示例代码】
otaGetOwnerFlag
【函数
int32_t otaGetOwnerFlag(enum ota_update_owner *owner);
【参数
[OUT] owner: 用于
接收 当前 升级 owner 的 变量。请 参考 enum ota_update_owner [IN] N/A
【返回值】
OTA_SUCCESS: 成功
-OTAERR_NOTINIT: 未
初始化 -OTAERR_NULLPOINTER: partition 为空
指针 -OTAERR_IO: io 错误,请
重试
【功能
获取
【示例代码】
static int check_and_mark(void) {
enum ota_update_owner owner;
int32_t ret;
ret = otaGetOwnerFlag(&owner);
if (ret != 0) {
printf("otaGetOwnerFlag returned with %d\n", ret);
return -1;
}
if (owner != OTA_TOOL) {
printf("The OTA update is not launched by ota_tool, owner: %d\n", owner);
return -1;
}
ret = otaCheckUpdate();
if (ret == -OTAERR_IMAGE_WRITE) {
printf("ota_tool: OTA image write failed, is there a reboot during update?\n");
goto clearFlags;
}
if (ret == -OTAERR_BOOT_FAILED) {
printf("ota_tool: The new package boot failed. Please check the packages\n");
goto clearFlags;
}
if (ret != 0) {
printf("otaCheckUpdate returned with %d\n", ret);
goto clearFlags;
}
ret = otaMarkOTASuccessful();
if (ret != 0) {
printf("otaMarkOTASuccessful returned with %d\n", ret);
goto clearFlags;
}
ret = otaPartitionSync();
if (ret != 0) {
printf("otaPartitionSync returned with %d\n", ret);
goto clearFlags;
}
clearFlags:
otaClearFlags();
return ret;
}
otaMarkOTASuccessful
【函数
int32_t otaMarkOTASuccessful(void);
【参数
[OUT] N/A
[IN] N/A
【返回值】
OTA_SUCCESS: 成功
-OTAERR_NOTINIT: 未
初始化 -OTAERR_IO: io 错误,请
重试
【功能
标记
【示例代码】
otaCheckUpdate
【函数
int32_t otaCheckUpdate(void);
【参数
[OUT] N/A
[IN] N/A
【返回值】
OTA_SUCCESS: 成功
-OTAERR_IO: io 错误,请
重试 -OTAERR_STAGE: 未
进行 升级 -OTAERR_IMAGE_WRITE: 镜像
写入 失败 -OTAERR_BOOT_FAILED: 新
镜像 启动 失败 或 未 切换 分区
【功能
检查
【示例代码】
otaClearFlags
【函数
void otaClearFlags(void);
【参数
[OUT] N/A
[IN] N/A
【返回值】
N/A
【功能
清除 OTA flags
【示例代码】
otaPartitionSync
【函数
int32_t otaPartitionSync(void);
【参数
[OUT] N/A
[IN] N/A
【返回值】
-OTAERR_NOTINIT: 未
初始化 -OTAERR_IO: io 错误
-OTAERR_REPEAT: 与
其他 升级 进程 冲突 OTA_SUCCESS: 成功
【功能
AB分区、bak分区