blob: 8b2b93b59a11bb7f61ae11934e27dc4fa0336902 [file] [log] [blame]
b.liu68a94c92025-05-24 12:53:41 +08001#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.yang7b93b552025-05-28 05:00:14 -070013#include "gsw_ota_ua_interface.h"
b.liu68a94c92025-05-24 12:53:41 +080014
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.yang6a42e4d2025-05-28 01:04:20 -070040#define GSW_OTA "[HAL][GSW_OTA]"
b.liu68a94c92025-05-24 12:53:41 +080041
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.yang6a42e4d2025-05-28 01:04:20 -070055 fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_OTA"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080056 } 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.yang6a42e4d2025-05-28 01:04:20 -070069 fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: "GSW_OTA"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080070 } 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.yang6a42e4d2025-05-28 01:04:20 -070083 fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_OTA"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080084 } 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.yang6a42e4d2025-05-28 01:04:20 -070097 fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: "GSW_OTA"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080098 } 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.yang6a42e4d2025-05-28 01:04:20 -0700111 fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: "GSW_OTA"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800112 } while(0)
b.liu68a94c92025-05-24 12:53:41 +0800113
l.yang7b93b552025-05-28 05:00:14 -0700114typedef 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
125typedef 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
149typedef 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
156typedef 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.liu68a94c92025-05-24 12:53:41 +0800162
163typedef int (*mbtk_fota_get_active_absys_type)(void);
164typedef int (*mbtk_fota_fw_write)(char* fname, int segment_size);
165typedef int (*mbtk_fota_fw_write_by_url)(char* url, int segment_size,
166 int conn_timeout, int download_timeout);
167
168typedef int(*fota_callback)(int state, int percent);
169typedef int (*mbtk_fota_init)(fota_callback cb);
170typedef int (*mbtk_fota_status)(void);
171
172typedef void (*mbtk_log)(int level, const char *format,...);
173
174static int segment_size =0;
175static int Process_flag = 0;
176char addr_buf[256] = {0};
177static void *handle = NULL;
178static mbtk_log fun_ptr_log = NULL;
179
180static int s_ota_flag = -1;
181
182int fota_cb(int status, int percent)
183{
184 Process_flag = percent;
185 return 0;
186}
187
188static 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
210int32_t init_handle()
211{
212 if(handle == NULL)
213 {
214 handle = dlopen(LIB_PATH, RTLD_NOW );
215 if(handle == NULL)
216 {
l.yang7b93b552025-05-28 05:00:14 -0700217 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800218 }
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.yang7b93b552025-05-28 05:00:14 -0700224 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800225 }
226 }
227
228 }
229
230
231
232 return GSW_HAL_SUCCESS;
233}
234
235void 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*/
249int32_t gsw_update_modem_start_autobackup(char* file_path)
250{
251
252 if(file_path == NULL)
253 {
254 LOGE("invalid file_path \n");
l.yang7b93b552025-05-28 05:00:14 -0700255 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800256 }
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.yang7b93b552025-05-28 05:00:14 -0700270 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800271 }
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.yang7b93b552025-05-28 05:00:14 -0700277 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800278 }
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.yang7b93b552025-05-28 05:00:14 -0700287 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800288 }
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.yang7b93b552025-05-28 05:00:14 -0700295 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800296 }
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.yang7b93b552025-05-28 05:00:14 -0700307 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800308 }
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.shao6318d602025-06-09 20:33:13 -0700322 if(strstr(file_path,"fota.delta") == NULL)
b.liu68a94c92025-05-24 12:53:41 +0800323 {
324 LOGE("Bad file path ");
325 deinit_handle();
l.yang7b93b552025-05-28 05:00:14 -0700326 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800327 }
328 else
329 {
330 if(access(file_path,F_OK) !=0)
331 {
332 LOGE("update file no exist");
333 deinit_handle();
l.yang7b93b552025-05-28 05:00:14 -0700334 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800335 }
336 }
337
338 ret = funstat(file_path);
339 if (ret)
340 {
341 LOGE("get segment_size fail");
342 deinit_handle();
l.yang7b93b552025-05-28 05:00:14 -0700343 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800344 }
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.yang7b93b552025-05-28 05:00:14 -0700350 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800351 }
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*/
363bool 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.yang7b93b552025-05-28 05:00:14 -0700392int32_t gsw_update_modem_result_query(void)
b.liu68a94c92025-05-24 12:53:41 +0800393{
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.yang7b93b552025-05-28 05:00:14 -0700402 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800403 }
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.yang7b93b552025-05-28 05:00:14 -0700410 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800411 }
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.yang7b93b552025-05-28 05:00:14 -0700417 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800418 }
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*/
447int32_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.yang7b93b552025-05-28 05:00:14 -0700460int32_t gsw_update_modem_get_system(void)
b.liu68a94c92025-05-24 12:53:41 +0800461{
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.yang7b93b552025-05-28 05:00:14 -0700469 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800470 }
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.yang7b93b552025-05-28 05:00:14 -0700477 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800478 }
479 ret = func_ptr();
480 if(ret < 0)
481 {
482 LOGE("Error: mbtk_fota_get_active_absys_type failed");
483 deinit_handle();
l.yang7b93b552025-05-28 05:00:14 -0700484 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800485
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*/
500int32_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*/
512int32_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.yang7b93b552025-05-28 05:00:14 -0700522 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800523 }
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.yang7b93b552025-05-28 05:00:14 -0700530 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800531 }
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.yang7b93b552025-05-28 05:00:14 -0700537 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800538 }
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*/
574int32_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*/
585int32_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*/
597int32_t gsw_update_modem_switch(void)
598{
599 return GSW_HAL_SUCCESS;
600}