1 /* 2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 * Description: OTA适配层接口(此文件为DEMO,需集成方适配修改) 15 */ 16 #ifndef HILINK_OPEN_OTA_ADAPTER_H 17 #define HILINK_OPEN_OTA_ADAPTER_H 18 19 #include <stdbool.h> 20 #include <stddef.h> 21 22 #ifdef __cplusplus 23 extern "C" { 24 #endif 25 26 /* OTA升级分区1 */ 27 #ifndef UPGRADE_FW_BIN1 28 #define UPGRADE_FW_BIN1 0x00 29 #endif 30 31 /* OTA升级分区2 */ 32 #ifndef UPGRADE_FW_BIN2 33 #define UPGRADE_FW_BIN2 0x01 34 #endif 35 36 /* 只有MCU升级时立即重启 */ 37 #ifndef RESTART_FLAG_NOW 38 #define RESTART_FLAG_NOW 0x01 39 #endif 40 41 /* 有模组时切换分区后再重启 */ 42 #ifndef RESTART_FLAG_LATER 43 #define RESTART_FLAG_LATER 0x02 44 #endif 45 46 /* 模组可以重启 */ 47 #ifndef MODULE_CAN_REBOOT 48 #define MODULE_CAN_REBOOT 0x01 49 #endif 50 51 /* 模组不能重启 */ 52 #ifndef MODULE_CANNOT_REBOOT 53 #define MODULE_CANNOT_REBOOT 0x00 54 #endif 55 56 /* 手动升级 */ 57 #ifndef UPDATE_TYPE_MANUAL 58 #define UPDATE_TYPE_MANUAL 0x00 59 #endif 60 61 /* 自动升级 */ 62 #ifndef UPDATE_TYPE_AUTO 63 #define UPDATE_TYPE_AUTO 0x01 64 #endif 65 66 /* 返回正常 */ 67 #ifndef RETURN_OK 68 #define RETURN_OK 0 69 #endif 70 /* 没有MCU */ 71 #ifndef RETURN_ERROR_NO_MCU 72 #define RETURN_ERROR_NO_MCU (-1) 73 #endif 74 /* 返回其他错误 */ 75 #ifndef RETURN_ERROR 76 #define RETURN_ERROR (-2) 77 #endif 78 /* MCU不需要升级 */ 79 #ifndef RETURN_MCU_NO_NEED_OTA 80 #define RETURN_MCU_NO_NEED_OTA (-3) 81 #endif 82 83 typedef void (*GetOtaVerCb)(const char *version); 84 typedef void (*TrigSelfUpdateCb)(const char *url, const unsigned int size); 85 86 /* 87 * Flash初始化 88 * 返回值是true时,表示初始化正常 89 * 返回值是false时,表示初始化异常 90 */ 91 bool HILINK_OtaAdapterFlashInit(void); 92 93 /* 94 * 判断需要升级的分区 95 * 返回值是UPGRADE_FW_BIN1时,表示升级固件到分区1 96 * 返回值是UPGRADE_FW_BIN2时,表示升级固件到分区2 97 */ 98 unsigned int HILINK_OtaAdapterGetUpdateIndex(void); 99 100 /* 101 * 擦除需要升级的分区 102 * size表示需要擦除的分区大小 103 * 返回值是0时,表示擦除成功 104 * 返回值是-1时,表示擦除失败 105 */ 106 int HILINK_OtaAdapterFlashErase(unsigned int size); 107 108 /* 109 * 升级数据写入升级的分区 110 * buf表示待写入数据 111 * bufLen表示待写入数据的长度 112 * 返回值是0时,表示写入成功 113 * 返回值是-1时,表示写入失败 114 */ 115 int HILINK_OtaAdapterFlashWrite(const unsigned char *buf, unsigned int bufLen); 116 117 /* 118 * 读取升级分区数据 119 * offset表示读写偏移 120 * buf表示输出数据的内存地址 121 * bufLen表示输出数据的内存长度 122 * 返回值是0时,表示读取成功 123 * 返回值是-1时,表示读取失败 124 */ 125 int HILINK_OtaAdapterFlashRead(unsigned int offset, unsigned char *buf, unsigned int bufLen); 126 127 /* 128 * 分区升级结束 129 * 返回值是true时,表示结束正常 130 * 返回值是false时,表示结束异常 131 */ 132 bool HILINK_OtaAdapterFlashFinish(void); 133 134 /* 获取升级区间最大长度 */ 135 unsigned int HILINK_OtaAdapterFlashMaxSize(void); 136 137 /* 138 * 根据标志重启模组 139 * flag表示重启标志 140 * 当flag是RESTART_FLAG_NOW时,表示只有MCU升级时立即重启 141 * 当flag是RESTART_FLAG_LATER时,表示有模组时切换分区后再重启 142 */ 143 void HILINK_OtaAdapterRestart(int flag); 144 145 /* 146 * 开始模组升级 147 * type表示升级类型 148 * 当type是UPDATE_TYPE_MANUAL时,表示本次升级流程是由用户主动发起的手动升级 149 * 当type是UPDATE_TYPE_AUTO时,表示本次升级流程是经过用户同意的自动升级 150 * 返回值是RETURN_OK时,表示处理成功,HiLink SDK将开始启动升级流程 151 * 返回值是RETURN_ERROR时,表示处理不成功,HiLink SDK将终止本次升级流程 152 * 注意:在手动场景场景下,HiLink SDK在接收到用户发出的升级指令后,将直接调用此接口; 153 * 在自动升级场景下,当HiLink SDK在调用HilinkGetRebootFlag接口返回值是MODULE_CAN_REBOOT时,HiLink SDK将调用此接口。 154 * 厂商可在此接口中完成和升级流程相关的处理。 155 * 开机后10分钟到1小时内随机时间检测一次是否有新版本,之后以当前时间为起点,23小时加1小时内随机值周期性检测新版本。 156 * 如果用户打开了自动升级开关,检测到有新版本并且是可以重启的情况下,就进行新版本的下载,下载完成后自动重启。 157 * 自动升级流程可能在凌晨进行,因此厂商在实现升级流程相关功能时,确保在升级的下载安装固件和重启设备时避免对用户产生 158 * 影响,比如发出声音,光亮等。 159 */ 160 int HILINK_OtaStartProcess(int type); 161 162 /* 163 * 模组升级结束 164 * status表示升级结果 165 * 当status是100时,表示升级成功 166 * 当status不是100时,表示升级失败 167 * 返回值是RETURN_OK时,表示处理成功,HiLink SDK将置升级标志或切换运行区标志 168 * 返回值不是RETURN_OK时,表示处理不成功,HiLink SDK将终止本次升级流程 169 * 注意:HiLink SDK在将固件写入到OTA升级区后,且完整性校验通过后,将调用厂商适配的此接口; 170 * 厂商可在此接口中完成和升级流程相关的处理。 171 * 开机后10分钟到1小时内随机时间检测一次是否有新版本,之后以当前时间为起点,23小时加1小时内随机值周期性检测新版本。 172 * 如果用户打开了自动升级开关,检测到有新版本并且是可以重启的情况下,就进行新版本的下载,下载完成后自动重启。 173 * 自动升级流程可能在凌晨进行,因此厂商在实现升级流程相关功能时,确保在升级的下载安装固件和重启设备时避免对用户产生 174 * 影响,比如发出声音,光亮等;升级类型是否为自动升级可参考接口HilinkOtaStartProcess的参数type的描述。 175 */ 176 int HILINK_OtaEndProcess(int status); 177 178 /* 179 * 判断模组是否能立即升级并重启 180 * 返回值是MODULE_CAN_REBOOT时,表示模组可以立即升级并重启,HiLink SDK将开始自动升级流程。 181 * 返回值是MODULE_CANNOT_REBOOT时,表示模组不能立即升级并重启,HiLink SDK将不进行本次自动升级流程。 182 * 注意:在用户同意设备可以自动升级的情况下,HiLink SDK调用此接口获取设备当前业务状态下,模组是否可以立即升级并重启的标志。 183 * 只有当设备处于业务空闲状态时,接口才可以返回MODULE_CAN_REBOOT。 184 * 当设备处于业务非空闲状态时,接口返回MODULE_CANNOT_REBOOT。 185 */ 186 int HILINK_GetRebootFlag(void); 187 188 /* 189 * 触发设备的ota新版本检测 190 * 检测到的版本,sdk将通过cb回调函数上报。如果不需要获取版本号,则可将cb置空。 191 * 上报的version如果为空,则未成功获取到新版本。 192 * 注意:1、建议调用频次最多一天一次 193 * 2、首次通过手机配网成功后不能调用,建议连云成功后至少5s后调用 194 */ 195 void HILINK_TrigOtaVersionCheck(GetOtaVerCb cb); 196 197 /* 198 * 触发设备的ota新版本升级 199 * 检测到的版本,sdk将通过cb回调函数触发升级 200 */ 201 void HILINK_TrigOtaSelfUpdate(TrigSelfUpdateCb cb); 202 203 #ifdef __cplusplus 204 } 205 #endif 206 207 #endif