EC600U_esp32_iap_uart/HiLinkSDK/include/hilink_ota.h
2024-02-05 17:39:56 +08:00

228 lines
9.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) Huawei Technologies Co., Ltd. 2018-2021. All rights reserved.
* Description: 此文件提供了升级相关的接口实现示例;
* 其中升级相关功能的接口需要开发者或厂商进行实现HiLink SDK在收到升级相关命令时会调用对应接口;
* 请开发者仔细阅读文件中的注释说明,参考或修改实现。
*/
#ifndef HILINK_OTA_H
#define HILINK_OTA_H
#ifdef __cplusplus
extern "C" {
#endif
// 返回正常
#define RETURN_OK 0
// 没有MCU
#define RETURN_ERROR_NO_MCU (-1)
// MCU返回其他错误
#define RETURN_ERROR (-2)
// MCU不需要升级
#define RETURN_MCU_NO_NEED_OTA (-3)
// 模组可以重启
#define MODULE_CAN_REBOOT 1
// 模组不能重启
#define MODULE_CANNOT_REBOOT 0
// 手动升级
#define UPDATE_TYPE_MANUAL 0
// 自动升级
#define UPDATE_TYPE_AUTO 1
// 开始发送MCU数据
#define START_SEND_DATA 0
// 发送MCU数据结束
#define STOP_SEND_DATA 1
// 异常终止
#define SEND_DATA_ERROR 2
typedef enum {
SUB_DEV_UPDATE_SUCCESS = 0,
SUB_DEV_UPDATE_FAIL
} SubDevUpdateStatus;
typedef void (*GetOtaVerCb)(const char *version);
/*
* 获取MCU当前版本
* version表示版本字符串
* inLen表示输入字符串长度
* outLen表示输出字符串长度
* 返回值是RETURN_OK时表示获取成功
* 返回值是RETURN_ERROR_NO_MCU时表示没有MCU
* 返回值是RETURN_ERROR时表示获取失败
* 注意如果获取不到MCU的版本则不对MCU进行升级。
* 建议厂商在MCU正常启动后或升级启动后就将MCU的版本号传递给模组确保模组可以获取到MCU的版本。
*/
int HilinkGetMcuVersion(char *version, unsigned int inLen, unsigned int *outLen);
/*
* 开始模组升级
* type表示升级类型
* 当type是UPDATE_TYPE_MANUAL时表示本次升级流程是由用户主动发起的手动升级
* 当type是UPDATE_TYPE_AUTO时表示本次升级流程是经过用户同意的自动升级
* 返回值是RETURN_OK时表示处理成功HiLink SDK将开始启动升级流程
* 返回值是RETURN_ERROR时表示处理不成功HiLink SDK将终止本次升级流程
* 注意在手动场景场景下HiLink SDK在接收到用户发出的升级指令后将直接调用此接口
* 在自动升级场景下当HiLink SDK在调用HilinkGetRebootFlag接口返回值是MODULE_CAN_REBOOT时HiLink SDK将调用此接口。
* 厂商可在此接口中完成和升级流程相关的处理。
* 开机后10分钟到1小时内随机时间检测一次是否有新版本之后以当前时间为起点23小时加1小时内随机值周期性检测新版本。
* 如果用户打开了自动升级开关,检测到有新版本并且是可以重启的情况下,就进行新版本的下载,下载完成后自动重启。
* 自动升级流程可能在凌晨进行,因此厂商在实现升级流程相关功能时,确保在升级的下载安装固件和重启设备时避免对用户产生
* 影响,比如发出声音,光亮等。
*/
int HilinkOtaStartProcess(int type);
/*
* 模组升级结束
* status表示升级结果
* 当status是100时表示升级成功
* 当status不是100时表示升级失败
* 返回值是RETURN_OK时表示处理成功HiLink SDK将置升级标志或切换运行区标志
* 返回值不是RETURN_OK时表示处理不成功HiLink SDK将终止本次升级流程
* 注意HiLink SDK在将固件写入到OTA升级区后且完整性校验通过后将调用厂商适配的此接口
* 厂商可在此接口中完成和升级流程相关的处理。
* 开机后10分钟到1小时内随机时间检测一次是否有新版本之后以当前时间为起点23小时加1小时内随机值周期性检测新版本。
* 如果用户打开了自动升级开关,检测到有新版本并且是可以重启的情况下,就进行新版本的下载,下载完成后自动重启。
* 自动升级流程可能在凌晨进行,因此厂商在实现升级流程相关功能时,确保在升级的下载安装固件和重启设备时避免对用户产生
* 影响比如发出声音光亮等升级类型是否为自动升级可参考接口HilinkOtaStartProcess的参数type的描述。
*/
int HilinkOtaEndProcess(int status);
/*
* 判断模组是否能立即升级并重启
* 返回值是MODULE_CAN_REBOOT时表示模组可以立即升级并重启HiLink SDK将开始自动升级流程。
* 返回值是MODULE_CANNOT_REBOOT时表示模组不能立即升级并重启HiLink SDK将不进行本次自动升级流程。
* 注意在用户同意设备可以自动升级的情况下HiLink SDK调用此接口获取设备当前业务状态下模组是否可以立即升级并重启的标志。
* 只有当设备处于业务空闲状态时接口才可以返回MODULE_CAN_REBOOT。
* 当设备处于业务非空闲状态时接口返回MODULE_CANNOT_REBOOT。
*/
int HilinkGetRebootFlag();
/*
* HiLink SDK调用厂商适配的此接口通知MCU固件传输的状态
* flag表示升级流程标志
* 当flag是START_SEND_DATA时表示通知模组即将开始发送MCU固件数据包
* 当flag是STOP_SEND_DATA时表示通知模组完整的MCU固件包已发送完成
* 当flag是SEND_DATA_ERROR时表示通知模组本次MCU固件升级异常终止
* len表示MCU固件包的大小
* type表示升级类型
* 当type是UPDATE_TYPE_MANUAL时表示本次升级流程是由用户主动发起的手动升级
* 当type是UPDATE_TYPE_AUTO时表示本次升级流程是经过用户同意的自动升级
* 返回值是RETURN_OK时表示处理成功HiLink SDK继续正常处理后续流程
* 返回值是RETURN_ERROR时表示处理失败HiLink SDK将终止本次MCU升级流程
* 注意当flag是STOP_SEND_DATA时此接口需返回MCU侧固件升级的结果当flag是其它值时需返回接口接收到此消息后的处理结果。
* 开机后10分钟到1小时内随机时间检测一次是否有新版本之后以当前时间为起点23小时加1小时内随机值周期性检测新版本。
* 如果用户打开了自动升级开关,检测到有新版本并且是可以重启的情况下,就进行新版本的下载,下载完成后自动重启。
* 自动升级流程可能在凌晨进行,因此厂商在实现升级流程相关功能时,确保在升级的下载安装固件和重启设备时避免对用户产生
* 影响,比如发出声音,光亮等。
*/
int HilinkNotifyOtaStatus(int flag, unsigned int len, unsigned int type);
/*
* HiLink SDK调用厂商适配的此接口通知厂商发送MCU固件文件数据
* data表示发送的数据
* len表示发送的数据的长度
* offset表示发送的数据起始位置相对于完整固件包的偏移量
* 此接口需要返回MCU接收这部分数据的处理结果
* 返回值是RETURN_OK时模组将通知的数据正确发送给MCU且MCU正确处理发送的数据HiLink SDK将继续正常处理后续流程
* 返回值是RETURN_ERROR时模组或MCU未能正常处理通知的MCU的固件文件数据HiLink SDK将终止本次MCU固件升级流程
*/
int HilinkNotifyOtaData(const unsigned char *data, unsigned int len, unsigned int offset);
/*
* 获取设备升级文件保存路径
* filePath表示设备升级文件保存路径
* len表示设备升级文件保存路径的长度
* 返回值是RETURN_OK时表示获取成功
* 返回值是RETURN_ERROR时表示获取失败
* 注意Linux系统和安卓系统需要适配此接口其他操作系统不用适配此接口。
* HiLink SDK下载的设备升级文件需保存在设备上的某个文件路径下
* 此文件路径,需由厂商适配提供,例如“/var/update.bin”。
*/
int HILINK_GetUpdateFilePath(char *filePath, unsigned int len);
/*
* 厂商适配此接口提供设备上能够保存的升级文件的最大大小,
* 避免当HiLink SDK下载的升级文件大小大于分区大小时导致升级失败。
* 注意Linux系统和安卓系统需要适配此接口其他操作系统不用适配此接口。
*/
unsigned int HILINK_GetMaxUpdateFileSize(void);
/*
* 启动软件安装
* 返回值是RETURN_OK时表示启动成功
* 返回值是RETURN_ERROR时表示启动失败
* 注意Linux系统和安卓系统需要适配此接口其他操作系统不用适配此接口。
* HiLink SDK完成新版本的检测和下载流程后由厂商实现软件安装流程。
* HiLink SDK调用此接口后便会退出升级流程交由厂商的安装程序来完成软件的安装。
*/
int HILINK_StartSoftwareIntall(void);
/*
* 获取桥下子设备的当前版本
* version返回同一proId品类的最低版本号
* 返回值是RETURN_OK时表示获取成功反之失败
*/
int HILINK_GetBrgSubDevVersion(const char *proId, unsigned int proIdLen,
char *version, unsigned int versionLen);
/*
* HiLink SDK调用厂商适配的此接口通知厂商桥下子设备的hota最新版本号
* version表示同一proId品类的最新版本号
* 返回值是RETURN_OK时表示获取成功反之失败
*/
int HILINK_NotifyBrgSubDevNewVersion(const char *proId, unsigned int proIdLen, const char *version,
unsigned int versionLen);
/*
* HiLink SDK调用厂商适配的此接口通知厂商发送桥下子设备固件数据
* data表示发送的数据
* len表示发送的数据的长度
* offset表示发送的数据起始位置相对于完整固件包的偏移量
* 返回值是RETURN_OK时表示接收成功反之失败
*/
int HILINK_NotifyBrgSubDevOtaData(const char *proId, unsigned int proIdLen,
const unsigned char *data, unsigned int len, unsigned int offset);
/*
* HiLink SDK调用厂商适配的此接口通知桥下子设备固件传输的状态
* flag表示升级流程标志
* 当flag是START_SEND_DATA时表示通知模组即将开始发送桥下子设备固件数据包
* 当flag是STOP_SEND_DATA时表示通知模组完整的桥下子设备固件包已发送完成
* 当flag是SEND_DATA_ERROR时表示通知模组本次桥下子设备固件升级异常终止
* len表示MCU固件包的大小
* type表示升级类型
* 当type是UPDATE_TYPE_MANUAL时表示本次升级流程是由用户主动发起的手动升级
* 当type是UPDATE_TYPE_AUTO时表示本次升级流程是经过用户同意的自动升级
* 返回值是RETURN_OK时表示处理成功HiLink SDK继续正常处理后续流程
* 返回值是RETURN_ERROR时表示处理失败HiLink SDK将终止本次桥下子设备升级流程
* 注意:当flag是STOP_SEND_DATA时此接口需返回桥下子设备侧固件升级的结果当flag是其它值时需返回接口接收到此消息后的处理结果。
* 开机后10分钟到1小时内随机时间检测一次是否有新版本如果用户打开了自动升级开关检测到有新版本并且是可以重启的情况下
* 就进行新版本的下载,下载完成后自动重启。
*/
int HILINK_NotifyBrgSubDevOtaStatus(const char *proId, unsigned int proIdLen, int flag,
unsigned int len, unsigned int type);
/*
* 上报给模组桥下子设备的升级进度
* progress合法值是[0,100]建议5%递增上报,无需频繁上报。
* 注意:该接口只能在支持子设备升级的SDK版本中调用
*/
void HILINK_ReportBrgSubDevUpdateProgress(const char *proId, unsigned int proIdLen, int progress);
/*
* 上报给模组桥下子设备的升级状态
* 上报的状态在SubDevUpdateStatus枚举中
* 无论是成功还是失败,都需要确保升级结束后将升级状态上报给模组。
*/
void HILINK_ReportBrgSubDevUpdateStatus(const char *proId, unsigned int proIdLen, SubDevUpdateStatus status);
/*
* 触发设备的ota新版本检测
* 检测到的版本sdk将通过cb回调函数上报。如果不需要获取版本号则可将cb置空。
* 上报的version如果为空则未成功获取到新版本。
* 注意:1、建议调用频次最多一天一次
* 2、首次通过手机配网成功后不能调用建议连云成功后至少5s后调用
*/
void HILINK_TrigOtaVersionCheck(GetOtaVerCb cb);
#ifdef __cplusplus
}
#endif
#endif