b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 1 | #include <stdlib.h>
|
| 2 | #include <stdio.h>
|
| 3 | #include <string.h>
|
| 4 | #include <sys/stat.h>
|
| 5 | #include <sys/types.h>
|
| 6 | #include <unistd.h>
|
| 7 | #include <dlfcn.h>
|
| 8 | #include <stdint.h>
|
| 9 |
|
| 10 | #include <errno.h>
|
| 11 | #include <stdbool.h>
|
| 12 |
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 13 | #include "gsw_ota_ua_interface.h"
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 14 |
|
| 15 |
|
| 16 |
|
| 17 | #define LYNQ_OTA_INPROCESS 3
|
| 18 | #define LYNQ_OTA_SUCCESS 4
|
| 19 | #define LYNQ_OTA_FAILED 5
|
| 20 |
|
| 21 | #ifndef LOG_ERR_LEVEL |
| 22 | #define LOG_ERR_LEVEL 3 /* error conditions */ |
| 23 | #endif |
| 24 | #ifndef LOG_WARN_LEVEL |
| 25 | #define LOG_WARN_LEVEL 4 /* warning conditions */ |
| 26 | #endif |
| 27 | #ifndef LOG_INFO_LEVEL |
| 28 | #define LOG_INFO_LEVEL 6 /* informational */ |
| 29 | #endif |
| 30 | #ifndef LOG_DEBUG_LEVEL |
| 31 | #define LOG_DEBUG_LEVEL 7 /* debug-level messages */ |
| 32 | #endif |
| 33 | #ifndef LOG_VERBOSE_LEVEL |
| 34 | #define LOG_VERBOSE_LEVEL 8 |
| 35 | #endif
|
| 36 |
|
| 37 |
|
| 38 | #define LIB_PATH "/lib/libmbtk_lib.so"
|
| 39 |
|
l.yang | 6a42e4d | 2025-05-28 01:04:20 -0700 | [diff] [blame] | 40 | #define GSW_OTA "[HAL][GSW_OTA]"
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 41 |
|
| 42 | #define StatFunc(x,y) stat(x,y)
|
| 43 |
|
| 44 | #define LOGV(fmt, args ...) \ |
| 45 | do{ \ |
| 46 | char *file_ptr_1001 = __FILE__; \ |
| 47 | char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \ |
| 48 | char line_1001[10] = {0}; \ |
| 49 | sprintf(line_1001, "%d", __LINE__); \ |
| 50 | while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \ |
| 51 | if(*ptr_1001 == '/') \ |
| 52 | break; \ |
| 53 | ptr_1001--; \ |
| 54 | } \ |
l.yang | 6a42e4d | 2025-05-28 01:04:20 -0700 | [diff] [blame] | 55 | fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_OTA"" fmt, ptr_1001 + 1, line_1001, ##args); \
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 56 | } while(0) |
| 57 | |
| 58 | #define LOGI(fmt, args...) \ |
| 59 | do{ \ |
| 60 | char *file_ptr_1001 = __FILE__; \ |
| 61 | char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \ |
| 62 | char line_1001[10] = {0}; \ |
| 63 | sprintf(line_1001, "%d", __LINE__); \ |
| 64 | while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \ |
| 65 | if(*ptr_1001 == '/') \ |
| 66 | break; \ |
| 67 | ptr_1001--; \ |
| 68 | } \ |
l.yang | 6a42e4d | 2025-05-28 01:04:20 -0700 | [diff] [blame] | 69 | fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: "GSW_OTA"" fmt, ptr_1001 + 1, line_1001, ##args); \
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 70 | } while(0) |
| 71 | |
| 72 | #define LOGD(fmt, args...) \ |
| 73 | do{ \ |
| 74 | char *file_ptr_1001 = __FILE__; \ |
| 75 | char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \ |
| 76 | char line_1001[10] = {0}; \ |
| 77 | sprintf(line_1001, "%d", __LINE__); \ |
| 78 | while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \ |
| 79 | if(*ptr_1001 == '/') \ |
| 80 | break; \ |
| 81 | ptr_1001--; \ |
| 82 | } \ |
l.yang | 6a42e4d | 2025-05-28 01:04:20 -0700 | [diff] [blame] | 83 | fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_OTA"" fmt, ptr_1001 + 1, line_1001, ##args); \
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 84 | } while(0) |
| 85 | |
| 86 | #define LOGW(fmt, args...) \ |
| 87 | do{ \ |
| 88 | char *file_ptr_1001 = __FILE__; \ |
| 89 | char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \ |
| 90 | char line_1001[10] = {0}; \ |
| 91 | sprintf(line_1001, "%d", __LINE__); \ |
| 92 | while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \ |
| 93 | if(*ptr_1001 == '/') \ |
| 94 | break; \ |
| 95 | ptr_1001--; \ |
| 96 | } \ |
l.yang | 6a42e4d | 2025-05-28 01:04:20 -0700 | [diff] [blame] | 97 | fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: "GSW_OTA"" fmt, ptr_1001 + 1, line_1001, ##args); \
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 98 | } while(0) |
| 99 | |
| 100 | #define LOGE(fmt, args...) \ |
| 101 | do{ \ |
| 102 | char *file_ptr_1001 = __FILE__; \
|
| 103 | char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \ |
| 104 | char line_1001[10] = {0}; \ |
| 105 | sprintf(line_1001, "%d", __LINE__); \ |
| 106 | while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \ |
| 107 | if(*ptr_1001 == '/') \ |
| 108 | break; \ |
| 109 | ptr_1001--; \ |
| 110 | } \ |
l.yang | 6a42e4d | 2025-05-28 01:04:20 -0700 | [diff] [blame] | 111 | fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: "GSW_OTA"" fmt, ptr_1001 + 1, line_1001, ##args); \
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 112 | } while(0)
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 113 |
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 114 | typedef enum
|
| 115 | {
|
| 116 | GSW_UPDATE_SUCCEED = 0, //update succeed
|
| 117 | GSW_UPDATE_INPROGRESS, //update in progress
|
| 118 | GSW_UPDATE_BACKUP, //A/B partition sync in progress
|
| 119 | GSW_UPDATE_FAILED, //update failed
|
| 120 | GSW_UPDATE_WAITEDONE, //update in-active part finished,not switch update part.
|
| 121 | GSW_UPDATE_NEEDSYNC, //switch update part, need sync A/B part
|
| 122 | GSW_UPDATE_CANCEL //updata cancel success
|
| 123 | }gsw_update_state_t;
|
| 124 |
|
| 125 | typedef enum
|
| 126 | {
|
| 127 | GSW_UPDATE_NOERROR=0, //升级成功
|
| 128 | GSW_UPDATE_ARGUMENTERROR, //升级程序启动参数错误
|
| 129 | GSW_UPDATE_SDCARDNOEXIST, //未挂载外置FLASH等存储设备
|
| 130 | GSW_UPDATE_PACKAGENOEXIST, //升级包不存在
|
| 131 | GSW_UPDATE_UNZIPFAILED, //解压升级包出错
|
| 132 | GSW_UPDATE_PARTITIONFLUSHERROR,//写入分区出错
|
| 133 | GSW_UPDATE_XMLPARSEERROR, //解析 fotaconfig.xml 文件出错
|
| 134 | GSW_UPDATE_DIFFUBIUNATTACH, //差分升级 UBI 分区挂载异常
|
| 135 | GSW_UPDATE_NOSPACELEFT, //空间不足
|
| 136 | GSW_UPDATE_FILECHECKFAILED, //MD5 值校验失败
|
| 137 | GSW_UPDATE_BSPATCHFAILED, //bspatch 合成新文件夹失败
|
| 138 | GSW_UPDATE_NOFINDPARTITION, //待升级分区不存在
|
| 139 | GSW_UPDATE_UBIVOLUMEERROR, //差分升级,待升级 UBI 卷不存在
|
| 140 | GSW_UPDATE_NOFOTACONFIGFILE, //升级包中无 fotaconfig.xml 文件
|
| 141 | GSW_UPDATE_GETOLDSOFTWAREFAILED,//读取原始版本固件失败
|
| 142 | GSW_UPDATE_FILENOTEXIST, //文件不存在
|
| 143 | GSW_UPDATE_UPGRADECANCELED, //升级或分区同步被取消
|
| 144 | GSW_UPDATE_NONEEDCANCEL, //取消升级失败
|
| 145 | GSW_UPDATE_NOGOING //升级或分区同步正在进行,不可重复操作
|
| 146 | }gsw_update_exit_code_t;
|
| 147 |
|
| 148 |
|
| 149 | typedef struct
|
| 150 | {
|
| 151 | unsigned int percentage; //update progress0-100
|
| 152 | gsw_update_state_t update_state;
|
| 153 | gsw_update_exit_code_t exit_code;
|
| 154 | }gsw_update_info_s;
|
| 155 |
|
| 156 | typedef struct
|
| 157 | {
|
| 158 | gsw_update_state_t update_state;
|
| 159 | uint8_t is_damaged; //TURE: damaged FALSE:no damaged
|
| 160 | uint8_t damaged_partname[16];
|
| 161 | }gsw_system_status_s;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 162 |
|
| 163 | typedef int (*mbtk_fota_get_active_absys_type)(void);
|
| 164 | typedef int (*mbtk_fota_fw_write)(char* fname, int segment_size);
|
| 165 | typedef int (*mbtk_fota_fw_write_by_url)(char* url, int segment_size,
|
| 166 | int conn_timeout, int download_timeout);
|
| 167 |
|
| 168 | typedef int(*fota_callback)(int state, int percent);
|
| 169 | typedef int (*mbtk_fota_init)(fota_callback cb);
|
| 170 | typedef int (*mbtk_fota_status)(void);
|
| 171 |
|
| 172 | typedef void (*mbtk_log)(int level, const char *format,...);
|
| 173 |
|
| 174 | static int segment_size =0;
|
| 175 | static int Process_flag = 0;
|
| 176 | char addr_buf[256] = {0};
|
| 177 | static void *handle = NULL;
|
| 178 | static mbtk_log fun_ptr_log = NULL;
|
| 179 |
|
| 180 | static int s_ota_flag = -1;
|
| 181 |
|
| 182 | int fota_cb(int status, int percent)
|
| 183 | {
|
| 184 | Process_flag = percent;
|
| 185 | return 0;
|
| 186 | }
|
| 187 |
|
| 188 | static int funstat( char *filename)
|
| 189 | { |
| 190 | int ret = 0; |
| 191 | struct stat tmep_s; |
| 192 | |
| 193 | memset(&tmep_s, 0, sizeof(stat)); |
| 194 | ret = StatFunc(filename, &tmep_s); |
| 195 | |
| 196 | if (ret) |
| 197 | { |
| 198 | LOGE("stat %s failed! error_code: %s", filename ,strerror(errno)); |
| 199 | return -1; |
| 200 | } |
| 201 | |
| 202 | if (tmep_s.st_size > 0) |
| 203 | { |
| 204 | segment_size = tmep_s.st_size; |
| 205 | } |
| 206 | |
| 207 | return 0; |
| 208 | }
|
| 209 |
|
| 210 | int32_t init_handle()
|
| 211 | {
|
| 212 | if(handle == NULL)
|
| 213 | {
|
| 214 | handle = dlopen(LIB_PATH, RTLD_NOW );
|
| 215 | if(handle == NULL)
|
| 216 | {
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 217 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 218 | }
|
| 219 | if(fun_ptr_log == NULL)
|
| 220 | {
|
| 221 | fun_ptr_log = (mbtk_log)dlsym(handle, "mbtk_log");
|
| 222 | if(fun_ptr_log == NULL)
|
| 223 | {
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 224 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 225 | }
|
| 226 | }
|
| 227 |
|
| 228 | }
|
| 229 |
|
| 230 |
|
| 231 |
|
| 232 | return GSW_HAL_SUCCESS;
|
| 233 | }
|
| 234 |
|
| 235 | void deinit_handle()
|
| 236 | {
|
| 237 | dlclose(handle);
|
| 238 | handle = NULL;
|
| 239 | fun_ptr_log = NULL;
|
| 240 |
|
| 241 | }
|
| 242 |
|
| 243 | /**
|
| 244 | * @brief Start install modem software
|
| 245 | * @param [in] char* file_path
|
| 246 | * @param [out] NULL
|
| 247 | * @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
|
| 248 | */
|
| 249 | int32_t gsw_update_modem_start_autobackup(char* file_path)
|
| 250 | {
|
| 251 |
|
| 252 | if(file_path == NULL)
|
| 253 | {
|
| 254 | LOGE("invalid file_path \n");
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 255 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 256 | }
|
| 257 |
|
| 258 |
|
| 259 | mbtk_fota_fw_write func_ptr_update = NULL;
|
| 260 | mbtk_fota_init func_ptr_init= NULL;
|
| 261 | mbtk_fota_fw_write_by_url func_ptr_update_url = NULL;
|
| 262 |
|
| 263 |
|
| 264 |
|
| 265 | int ret = -1;
|
| 266 | ret = init_handle();
|
| 267 | if(ret < 0)
|
| 268 | {
|
| 269 | LOGE("init_handle fail");
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 270 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 271 | }
|
| 272 |
|
| 273 | func_ptr_update_url = (mbtk_fota_fw_write_by_url)dlsym(handle, "mbtk_fota_fw_write_by_url");
|
| 274 | if(func_ptr_update_url == NULL)
|
| 275 | {
|
| 276 | LOGE("Error: %s", dlerror());
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 277 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 278 | }
|
| 279 |
|
| 280 |
|
| 281 | // Get the function pointer
|
| 282 | func_ptr_update = (mbtk_fota_fw_write)dlsym(handle, "mbtk_fota_fw_write");
|
| 283 | if (func_ptr_update == NULL)
|
| 284 | {
|
| 285 | LOGE("Error: %s", dlerror());
|
| 286 | deinit_handle();
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 287 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 288 | }
|
| 289 |
|
| 290 | func_ptr_init = (mbtk_fota_init)dlsym(handle, "mbtk_fota_init");
|
| 291 | if(func_ptr_init == NULL)
|
| 292 | {
|
| 293 | LOGE("Error: %s", dlerror());
|
| 294 | deinit_handle();
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 295 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 296 | }
|
| 297 |
|
| 298 |
|
| 299 | if(s_ota_flag == -1)
|
| 300 | {
|
| 301 | ret = func_ptr_init(fota_cb);
|
| 302 | if(ret < 0)
|
| 303 | {
|
| 304 | LOGE("Error: mbtk_fota_init failed");
|
| 305 |
|
| 306 | deinit_handle();
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 307 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 308 | }
|
| 309 | else
|
| 310 | {
|
| 311 | s_ota_flag = 0;
|
| 312 | }
|
| 313 | }
|
| 314 |
|
| 315 | if(strncmp(file_path, "http", 4) == 0)
|
| 316 | {
|
| 317 | segment_size = 62914560;
|
| 318 | ret = func_ptr_update_url(file_path, segment_size,10, 600);
|
| 319 | }
|
| 320 | else
|
| 321 | {
|
hj.shao | 6318d60 | 2025-06-09 20:33:13 -0700 | [diff] [blame^] | 322 | if(strstr(file_path,"fota.delta") == NULL)
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 323 | {
|
| 324 | LOGE("Bad file path ");
|
| 325 | deinit_handle();
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 326 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 327 | }
|
| 328 | else
|
| 329 | {
|
| 330 | if(access(file_path,F_OK) !=0)
|
| 331 | {
|
| 332 | LOGE("update file no exist");
|
| 333 | deinit_handle();
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 334 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 335 | }
|
| 336 | }
|
| 337 |
|
| 338 | ret = funstat(file_path);
|
| 339 | if (ret) |
| 340 | { |
| 341 | LOGE("get segment_size fail");
|
| 342 | deinit_handle();
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 343 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 344 | }
|
| 345 | ret = func_ptr_update(file_path, segment_size);
|
| 346 | if(ret < 0)
|
| 347 | {
|
| 348 | LOGE("Error: mbtk_fota_fw_write failed\n");
|
| 349 | deinit_handle();
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 350 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 351 | }
|
| 352 | }
|
| 353 | return GSW_HAL_SUCCESS;
|
| 354 |
|
| 355 | }
|
| 356 |
|
| 357 | /**
|
| 358 | * @brief check the modem update condition
|
| 359 | * @param [in] NULL
|
| 360 | * @param [out] NULL
|
| 361 | * @retval TRUE/FALSE
|
| 362 | */
|
| 363 | bool gsw_update_modem_check_condition(void)
|
| 364 | {
|
| 365 | char command[32] = {0};
|
| 366 | char buffer[64] = {0};
|
| 367 | const char *process_ota = "{otad}";
|
| 368 |
|
| 369 | snprintf(command,sizeof(command), "ps | grep %s | grep -v grep", process_ota);
|
| 370 | FILE *fp = popen(command, "r");
|
| 371 | if (fp == NULL)
|
| 372 | {
|
| 373 | return false;
|
| 374 | }
|
| 375 |
|
| 376 | if(fgets(buffer, sizeof(buffer), fp)!= NULL)
|
| 377 | {
|
| 378 | pclose(fp);
|
| 379 | return true;
|
| 380 | }
|
| 381 | pclose(fp);
|
| 382 | return false;
|
| 383 |
|
| 384 | }
|
| 385 |
|
| 386 | /**
|
| 387 | * @brief get update modem result
|
| 388 | * @param [in] NULL
|
| 389 | * @param [out] NULL
|
| 390 | * @retval E_GSW_OTA_RET
|
| 391 | */
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 392 | int32_t gsw_update_modem_result_query(void)
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 393 | {
|
| 394 |
|
| 395 | mbtk_fota_status func_ptr_get_result = NULL;
|
| 396 | int ret = -1;
|
| 397 |
|
| 398 | ret = init_handle();
|
| 399 | if(ret < 0)
|
| 400 | {
|
| 401 | LOGE("init_handle fail");
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 402 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 403 | }
|
| 404 |
|
| 405 | // Get the function pointer
|
| 406 | func_ptr_get_result = (mbtk_fota_status)dlsym(handle, "mbtk_fota_status");
|
| 407 | if (func_ptr_get_result == NULL)
|
| 408 | {
|
| 409 | LOGE("Error: %s\n", dlerror());
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 410 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 411 | }
|
| 412 | ret = func_ptr_get_result();
|
| 413 | if(ret < 0 && ret !=-1)
|
| 414 | {
|
| 415 | LOGE("Error: mbtk_fota_status failed\n");
|
| 416 | deinit_handle();
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 417 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 418 | }
|
| 419 |
|
| 420 | deinit_handle();
|
| 421 |
|
| 422 | if(ret == LYNQ_OTA_INPROCESS)
|
| 423 | {
|
| 424 | return GSW_OTA_INPROCESS;
|
| 425 |
|
| 426 | }
|
| 427 | else if(ret == LYNQ_OTA_SUCCESS)
|
| 428 | {
|
| 429 | return GSW_OTA_SUCCESS;
|
| 430 | }
|
| 431 | else if(ret == -1)
|
| 432 | {
|
| 433 | return GSW_OTA_NO_TASK;
|
| 434 | }
|
| 435 |
|
| 436 | return GSW_OTA_FAILURE;
|
| 437 |
|
| 438 |
|
| 439 | }
|
| 440 |
|
| 441 | /**
|
| 442 | * @brief Start install modem software
|
| 443 | * @param [in] char* file_path
|
| 444 | * @param [out] NULL
|
| 445 | * @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
|
| 446 | */
|
| 447 | int32_t gsw_update_modem_start_nobackup(char* file_path)
|
| 448 | {
|
| 449 |
|
| 450 | return GSW_HAL_SUCCESS;
|
| 451 | }
|
| 452 |
|
| 453 |
|
| 454 | /**
|
| 455 | * @brief get current system
|
| 456 | * @param [in] NULL
|
| 457 | * @param [out] NULL
|
| 458 | * @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
|
| 459 | */
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 460 | int32_t gsw_update_modem_get_system(void)
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 461 | {
|
| 462 | int ret = -1;
|
| 463 |
|
| 464 | mbtk_fota_get_active_absys_type func_ptr;
|
| 465 | ret = init_handle();
|
| 466 | if(ret < 0)
|
| 467 | {
|
| 468 | LOGE("init_handle fail");
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 469 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 470 | }
|
| 471 |
|
| 472 | // Get the function pointer
|
| 473 | func_ptr = (mbtk_fota_get_active_absys_type)dlsym(handle, "mbtk_fota_get_active_absys_type");
|
| 474 | if (func_ptr == NULL)
|
| 475 | {
|
| 476 | LOGE("Error: %s", dlerror());
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 477 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 478 | }
|
| 479 | ret = func_ptr();
|
| 480 | if(ret < 0)
|
| 481 | {
|
| 482 | LOGE("Error: mbtk_fota_get_active_absys_type failed");
|
| 483 | deinit_handle();
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 484 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 485 |
|
| 486 | }
|
| 487 |
|
| 488 | deinit_handle();
|
| 489 |
|
| 490 | return ret;
|
| 491 |
|
| 492 | }
|
| 493 |
|
| 494 | /**
|
| 495 | * @brief cancel update
|
| 496 | * @param [in] NULL
|
| 497 | * @param [out] NULL
|
| 498 | * @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
|
| 499 | */
|
| 500 | int32_t gsw_update_modem_cancel(void)
|
| 501 | {
|
| 502 |
|
| 503 | return GSW_HAL_SUCCESS;
|
| 504 | }
|
| 505 |
|
| 506 | /**
|
| 507 | * @brief get modem update info
|
| 508 | * @param [in] NULL
|
| 509 | * @param [out] gsw_update_info_s
|
| 510 | * @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
|
| 511 | */
|
| 512 | int32_t gsw_update_modem_get_info(gsw_update_info_s *update_info)
|
| 513 | {
|
| 514 | int ret = -1;
|
| 515 |
|
| 516 | mbtk_fota_status func_ptr_get_info = NULL;
|
| 517 |
|
| 518 | ret = init_handle();
|
| 519 | if(ret < 0)
|
| 520 | {
|
| 521 | LOGE("init_handle fail");
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 522 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 523 | }
|
| 524 |
|
| 525 | // Get the function pointer
|
| 526 | func_ptr_get_info = (mbtk_fota_status)dlsym(handle, "mbtk_fota_status");
|
| 527 | if (func_ptr_get_info == NULL)
|
| 528 | {
|
| 529 | LOGE("Error: %s\n", dlerror());
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 530 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 531 | }
|
| 532 | ret = func_ptr_get_info();
|
| 533 | if(ret < 0 && ret != -1)
|
| 534 | {
|
| 535 | LOGE("Error: mbtk_fota_status failed\n");
|
| 536 | deinit_handle();
|
l.yang | 7b93b55 | 2025-05-28 05:00:14 -0700 | [diff] [blame] | 537 | return GSW_HAL_NORMAL_FAIL;
|
b.liu | 68a94c9 | 2025-05-24 12:53:41 +0800 | [diff] [blame] | 538 | }
|
| 539 |
|
| 540 | //升级成功之后,未重启,不可重复升级
|
| 541 | if(ret == LYNQ_OTA_INPROCESS)
|
| 542 | {
|
| 543 | update_info->exit_code = GSW_UPDATE_NOGOING;
|
| 544 | update_info->percentage = Process_flag;
|
| 545 | update_info->update_state = GSW_UPDATE_INPROGRESS;
|
| 546 | }
|
| 547 | if(ret == LYNQ_OTA_SUCCESS)
|
| 548 | {
|
| 549 | update_info->exit_code = GSW_UPDATE_NOERROR;
|
| 550 | update_info->percentage = Process_flag;
|
| 551 | update_info->update_state = GSW_UPDATE_WAITEDONE;
|
| 552 | }
|
| 553 |
|
| 554 |
|
| 555 | if(ret == LYNQ_OTA_FAILED || ret == -1)
|
| 556 | {
|
| 557 | update_info->exit_code = GSW_UPDATE_GETOLDSOFTWAREFAILED;
|
| 558 | update_info->percentage = Process_flag;
|
| 559 | update_info->update_state = GSW_UPDATE_FAILED;
|
| 560 | }
|
| 561 |
|
| 562 | deinit_handle();
|
| 563 | return GSW_HAL_SUCCESS;
|
| 564 |
|
| 565 | }
|
| 566 |
|
| 567 |
|
| 568 | /**
|
| 569 | * @brief get modem system status
|
| 570 | * @param [in] NULL
|
| 571 | * @param [out] gsw_system_status_s
|
| 572 | * @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
|
| 573 | */
|
| 574 | int32_t gsw_update_modem_get_status(gsw_system_status_s *system_status)
|
| 575 | {
|
| 576 | return GSW_HAL_SUCCESS;
|
| 577 | }
|
| 578 |
|
| 579 | /**
|
| 580 | * @brief A/B system sync
|
| 581 | * @param [in] NULL
|
| 582 | * @param [out] NULL
|
| 583 | * @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
|
| 584 | */
|
| 585 | int32_t gsw_update_modem_sync(void)
|
| 586 | {
|
| 587 | return GSW_HAL_SUCCESS;
|
| 588 |
|
| 589 | }
|
| 590 |
|
| 591 | /**
|
| 592 | * @brief A/B system switch
|
| 593 | * @param [in] NULL
|
| 594 | * @param [out] NULL
|
| 595 | * @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
|
| 596 | */
|
| 597 | int32_t gsw_update_modem_switch(void)
|
| 598 | {
|
| 599 | return GSW_HAL_SUCCESS;
|
| 600 | }
|