blob: 10f967ab2764bec79c5a2ac9d7554f2e8281a775 [file] [log] [blame]
l.yang7d7b51c2023-08-04 17:02:48 +08001/*******************************************************
2*
3* @brief:
4* @details: add fota upgrade api
5* @author: l.yang
6* @date: 2023.8.3
7* @version: V1.0
8* @copyright:Copyright (c) MobileTek
9*
10*********************************************/
11
12#include <stdio.h>
13#include <stdlib.h>
14#include <string.h>
15#include <sys/types.h>
16#include <errno.h>
17#include <sys/stat.h>
18#include <fcntl.h>
19#include <sys/ioctl.h>
20#include <dirent.h>
21#include <getopt.h>
22#include <unistd.h>
23
24#ifdef __cplusplus
25extern "C" {
26#endif
27
28#include "include/lynq-qser-fota.h"
29#include "liblog/lynq_deflog.h"
l.yangc39faa22024-06-14 11:00:04 +080030#include "include/lynq-qser-autosuspend.h"
l.yang7224e6c2024-06-14 13:04:28 +080031#include "pub_debug_info.h"
l.yang7d7b51c2023-08-04 17:02:48 +080032
l.yangf8e8cf22024-01-25 15:10:22 +080033#define FOTA_REBOOT_FLAG "/mnt/userdata/.fota_reboot_flag"
34#define FOTA_FLAG_FILE "/mnt/userdata/.back_up_flag"
l.yangdaba4bb2023-08-30 10:47:55 +080035#define USER_LOG_TAG "LYNQ_FOTA"
36#define FOTA_ADDR_FILE "/mnt/userdata/.addr_value"
37#define FOTA_FILE_NAME "upgrade.package"
l.yangf8e8cf22024-01-25 15:10:22 +080038#define FOTA_UPGRADE_PROCESS "/mnt/userdata/.fota_upgrade_process"
l.yang7d7b51c2023-08-04 17:02:48 +080039#define SYSTEM_A "34650"
40#define SYSTEM_B "39019"
41
l.yang7d7b51c2023-08-04 17:02:48 +080042
43#define BOOTABLE "45227"
44#define UNBOOTABLE "47806"
45
l.yangc39faa22024-06-14 11:00:04 +080046#define FOTA_WAKELOCK_NAME "FOTA_WAKELOCK"
47
l.yang7d7b51c2023-08-04 17:02:48 +080048
l.yang6e547912023-08-14 16:56:48 +080049#define LYNQ_UPGRADE_STATUS_VERIFING (0)
50#define LYNQ_UPGRADE_STATUS_VERIFY_SUCCESS (1)
51#define LYNQ_UPGRADE_STATUS_VERIFY_FAIL (2)
52#define LYNQ_UPGRADE_STATUS_UPDATING (3)
53#define LYNQ_UPGRADE_STATUS_UPDATE_SUCCESS (4)
54#define LYNQ_UPGRADE_STATUS_UPDATE_FAIL (5)
55
l.yangf8e8cf22024-01-25 15:10:22 +080056#define LYNQ_SYNNCHRONIZING 8
57#define LYNQ_SYNC_SUCCESS 9
l.yang04a9e9c2024-06-04 16:51:05 +080058#define LYNQ_SYNC_FAILED 10
l.yangf8e8cf22024-01-25 15:10:22 +080059
60#define ZXIC_SYNCHRONIZING 1
61#define ZXIC_SYNC_SUCCESS 0
l.yang04a9e9c2024-06-04 16:51:05 +080062#define ZXIC_SYNC_FAILED -1
l.yangf8e8cf22024-01-25 15:10:22 +080063
64#define NO_REBOOT 0
65
66
67int total_size = 0;
68int upgrade_size = 0;
l.yang6e547912023-08-14 16:56:48 +080069
l.yang7224e6c2024-06-14 13:04:28 +080070
l.yang7d7b51c2023-08-04 17:02:48 +080071typedef struct
72{
73 int system;
74 int status;
75 int try_cnt;
76} z_system_info_t;
77
78typedef struct
79{
80 int upgrade_status;
81 int total_size;
82 int upgraded_size;
83} z_upgrade_status_info_t;
84
85typedef struct
86{
87 int boot_to;
88 int fota_status;
89 z_system_info_t system_1;
90 z_system_info_t system_2;
91} z_upgrade_system_info_t;
92
93typedef struct
94{
95 z_upgrade_status_info_t *status;
96 void(* status_cb)(z_upgrade_status_info_t *status);
97} z_upgrade_flush_status_t;
98
99extern int zxic_dual_verify();
100extern int zxic_dual_upgrade(z_upgrade_flush_status_t *flush_status);
101extern int zxic_dual_get_upgrade_status(z_upgrade_status_info_t *upgrade_info);
102extern int zxic_dual_get_current_system();
103extern int zxic_dual_get_boot_to_system();
104extern int zxic_dual_set_boot_to_system(int system, int reboot_flag);
105extern int zxic_dual_get_system_status(z_upgrade_system_info_t *system_info);
106extern int zxic_dual_set_system_status(int system, int status);
107extern int zxic_dual_get_fota_status_for_nv();
108extern int zxic_dual_set_fota_status_for_nv(int status);
109extern int zxic_dual_sync_system(void);
110extern int zxic_dual_get_upgrade_type(void);
111extern void zxic_dual_get_sync_status(int *sync_status);
112extern int zxic_dual_set_sync_status(int sync_status);
113extern int zxic_dual_config_package_path(char *upgrade_package_path, int length);
114
115int lynq_fota_verify();
116int lynq_fota_upgrade();
117int lynq_get_current_system();
118int lynq_get_boot_to_system();
119int lynq_set_boot_to_system(char *option_para);
120int lynq_set_system_a_status(char *option_para);
121int lynq_set_system_b_status(char *option_para);
122int lynq_sync_system();
123int lynq_get_upgrade_type();
124int lynq_get_sync_status();
125int lynq_set_sync_status(char *option_para);
126
127
128/*****************************************
129* @brief:rock_update_main
130* @param count [IN]:NA
131* @param sum [OUT]:NA
132* @return :success 0, failed -1
133* @todo:NA
134* @see:NA
135* @warning:NA
136******************************************/
137int rock_update_main(int reboot_flag)
138{
139
140 int ret = 0;
141 int current_slot = 0;
l.yangdaba4bb2023-08-30 10:47:55 +0800142 int fota_sync_flag = 0;
l.yangf8e8cf22024-01-25 15:10:22 +0800143 int reboot_flg = NO_REBOOT;
l.yang7224e6c2024-06-14 13:04:28 +0800144 time_t startTime;
145 time_t endTime;
146 struct tm *localTime;
147 double elapsed = 0;
148
l.yangdaba4bb2023-08-30 10:47:55 +0800149 FILE *fp = NULL;
150 fp = fopen(FOTA_FLAG_FILE,"w+");
151 if(fp == NULL)
152 {
153 LYINFLOG("Creat fota flag file failed");
154 return -1;
155 }
156 fwrite(&fota_sync_flag,sizeof(int),1,fp);
157 fclose(fp);
l.yangc814c3a2023-09-12 17:42:58 +0800158
159 /* T106BUG-189 fix */
160 system("sync");
l.yangf8e8cf22024-01-25 15:10:22 +0800161
162 fp =fopen(FOTA_REBOOT_FLAG,"w+");
163 if(fp == NULL)
164 {
l.yangce9a4852024-03-26 10:07:25 +0800165 LYERRLOG("Creat get upgrade status flag failed");
l.yangf8e8cf22024-01-25 15:10:22 +0800166 return -1;
167 }
168
169 fwrite(&reboot_flg,sizeof(int),1,fp);
170 fclose(fp);
171 system("sync");
l.yangce9a4852024-03-26 10:07:25 +0800172
173 //fix T106BUG-585 start
174 total_size = 0;
175 upgrade_size = 0;
176
177 fp = fopen(FOTA_UPGRADE_PROCESS,"w+");
178 if(fp == NULL)
179 {
180 LYERRLOG("Error opening file");
181 return -1;
182 }
183
184 fprintf(fp, "%d,%d\n", total_size, upgrade_size);
185 fclose(fp);
186 //fix T106BUG-585 end
187
l.yang7d7b51c2023-08-04 17:02:48 +0800188 ret = lynq_fota_verify();
189 if(ret != 0)
190 {
191 LYINFLOG("Verify package failed exit upgrade");
192 return -1;
193 }
l.yang7224e6c2024-06-14 13:04:28 +0800194
195 startTime = time(NULL);
196 if(startTime == (time_t)-1)
197 {
198 LYERRLOG("Failed to get the current time.\n");
199 }
l.yang7d7b51c2023-08-04 17:02:48 +0800200
201 LYINFLOG("-----Begin to upgrade ----");
202 ret = lynq_fota_upgrade();
l.yang7224e6c2024-06-14 13:04:28 +0800203
204 endTime = time(NULL);
205 if(endTime == (time_t)-1)
206 {
207 LYERRLOG("Failed to get the current time.\n");
208 }
209 elapsed = difftime(endTime, startTime);
210 localTime = localtime(&endTime);
l.yang7d7b51c2023-08-04 17:02:48 +0800211 if(ret != 0)
212 {
l.yang7224e6c2024-06-14 13:04:28 +0800213 LYERRLOG("Upgrade failed");
214 ret = sc_debug_info_record(MODULE_ID_CAP_FOTA,"failed,spendtime: %.2lf seconds,package size:%d,finished time %s", elapsed,total_size,asctime(localTime));
215 if(ret <= 0)
216 {
217 LYERRLOG("lynq_record_debug_info failed");
218 }
l.yang7d7b51c2023-08-04 17:02:48 +0800219 return -1;
220 }
l.yang7224e6c2024-06-14 13:04:28 +0800221 else
222 {
223 LYINFLOG("Upgrade success");
224 ret = sc_debug_info_record(MODULE_ID_CAP_FOTA,"success,spendtime: %.2lf seconds,package size:%d,finished time %s", elapsed,total_size,asctime(localTime));
225 if(ret <= 0)
226 {
227 LYERRLOG("lynq_record_debug_info failed");
228 }
229 }
230
l.yang7d7b51c2023-08-04 17:02:48 +0800231
232 ret = lynq_get_upgrade_status();
l.yang6e547912023-08-14 16:56:48 +0800233 if(ret != LYNQ_UPGRADE_STATUS_UPDATE_SUCCESS)
l.yang7d7b51c2023-08-04 17:02:48 +0800234 {
235 LYINFLOG("Upgrade failed ");
236 return -1;
237 }
238
239 current_slot = lynq_get_current_system();
240 if(current_slot < 0)
241 {
242 LYINFLOG("Get current system failed");
243 return -1;
244 }
245
l.yang7d7b51c2023-08-04 17:02:48 +0800246 if(current_slot == atoi(SYSTEM_A))
247 {
248 LYINFLOG("current system is system a");
l.yang7d7b51c2023-08-04 17:02:48 +0800249 ret = lynq_set_boot_to_system((char *)SYSTEM_B);
250 if(ret != 0)
251 {
252 LYINFLOG("set system B boot failed ");
253 return -1;
254 }
l.yang185656c2023-09-28 14:26:41 +0800255
l.yang7d7b51c2023-08-04 17:02:48 +0800256 }
257 else if( current_slot == atoi(SYSTEM_B))
258 {
259 LYINFLOG("current system is system a");
l.yang7d7b51c2023-08-04 17:02:48 +0800260 ret = lynq_set_boot_to_system((char *)SYSTEM_A);
261 if(ret != 0)
262 {
263 LYINFLOG("set system B boot failed ");
264 return -1;
265 }
266
l.yang7d7b51c2023-08-04 17:02:48 +0800267 }
l.yangdaba4bb2023-08-30 10:47:55 +0800268
269 fp = fopen(FOTA_FLAG_FILE,"w+");
270 if(fp == NULL)
271 {
272 LYINFLOG("Creat fota flag file failed");
273 return -1;
274 }
275
276 fota_sync_flag = 1;
277 fwrite(&fota_sync_flag,sizeof(int),1,fp);
278 fclose(fp);
l.yangc814c3a2023-09-12 17:42:58 +0800279
280 /* T106BUG-189 fix */
281 system("sync");
282
l.yang7d7b51c2023-08-04 17:02:48 +0800283 if(reboot_flag == 1)
284 {
285 LYINFLOG("Enter reboot device");
286 system("reboot");
287 }
288
289 return 0;
290}
291
292/*****************************************
293* @brief:upgrade callback function
294* @param count [IN]:z_upgrade_status_info_t *p_status
295* @param sum [OUT]:NA
296* @return :NA
297* @todo:
298* @see:NA
299* @warning:NA
300******************************************/
301void lynq_g_flush_upgrade_status(z_upgrade_status_info_t *p_status)
302{
303
304 LYINFLOG("Current status:%d ", p_status->upgrade_status);
305
306 LYINFLOG("Total size:%d ", p_status->total_size);
307
308 LYINFLOG("Updated size:%d ", p_status->upgraded_size);
l.yangf8e8cf22024-01-25 15:10:22 +0800309
310 total_size = p_status->total_size;
311 upgrade_size = p_status->upgraded_size;
312
313 FILE *fp = NULL;
l.yangce9a4852024-03-26 10:07:25 +0800314
315
l.yangf8e8cf22024-01-25 15:10:22 +0800316 fp = fopen(FOTA_UPGRADE_PROCESS,"w");
317 if (fp == NULL)
318 {
319 LYERRLOG("Error opening file");
320 return;
321 }
322
323 fprintf(fp, "%d,%d\n", total_size, upgrade_size);
324 fclose(fp);
l.yang7d7b51c2023-08-04 17:02:48 +0800325}
326
327/*****************************************
328* @brief:lynq_fota_set_addr_value
329* @param count [IN]:char *path
330* @param sum [OUT]:
331* @return :success 0, failed -1
332* @todo:NA
333* @see:NA
334* @warning:NA
335******************************************/
336int lynq_fota_set_addr_value(char *value,int size)
337{
338 int ret =0;
l.yangdaba4bb2023-08-30 10:47:55 +0800339 FILE *fp = NULL;
l.yang7d7b51c2023-08-04 17:02:48 +0800340 LYLOGSET(LOG_INFO);
341 LYLOGEINIT(USER_LOG_TAG);
342
343 if (NULL == value || size <= 0)
344 {
345 LYINFLOG("Bad package path!!!");
346 return -1;
347 }
348 ret = zxic_dual_config_package_path(value, strlen(value));
349 if(ret == -1)
350 {
351 LYINFLOG("Configure upgrade package path fail");
352 return -1;
353 }
354
l.yangdaba4bb2023-08-30 10:47:55 +0800355 fp = fopen(FOTA_ADDR_FILE,"w+");
356 if(fp == NULL)
357 {
358 LYINFLOG("Open addr file failed");
359 return -1;
360 }
361
362 fprintf(fp,"%s",value);
363 fclose(fp);
364
l.yang7d7b51c2023-08-04 17:02:48 +0800365 LYINFLOG("Configure upgrade package path success");
366 return 0;
367}
368
l.yangdaba4bb2023-08-30 10:47:55 +0800369/*****************************************
370* @brief:lynq_fota_get_addr_value
371* @param count [IN]:char *tmp_value
372* @param sum [OUT]:
373* @return :success 0, failed -1
374* @todo:NA
375* @see:NA
376* @warning:NA
377******************************************/
378int lynq_fota_get_addr_value(char *tmp_value)
379{
380 FILE *fp = NULL;
381 char tmp_addr[128] = {0};
382
383
384 fp = fopen(FOTA_ADDR_FILE,"r");
385 if(fp == NULL)
386 {
387 LYINFLOG("Open fota addr faile failed!!!");
388 return -1;
389 }
390 while(fgets(tmp_addr,sizeof(tmp_addr),fp) != NULL)
391 {
392 if( strstr(tmp_addr,FOTA_FILE_NAME) != NULL)
393 {
394 strncpy(tmp_value,tmp_addr,sizeof(tmp_addr) - 1);
395 break;
396 }
397 else
398 {
399 LYINFLOG("Get addr failed\n");
400 fclose(fp);
401 return -1;
402 }
403 }
404
405 fclose(fp);
406 return 0;
407
408
409}
410
l.yang7d7b51c2023-08-04 17:02:48 +0800411
412/*****************************************
413* @brief:lynq_fota_verify
414* @param count [IN]:NA
415* @param sum [OUT]:NA
416* @return :success 0, failed -1
417* @todo:NA
418* @see:NA
419* @warning:NA
420******************************************/
421int lynq_fota_verify()
422{
423 int ret = 0;
424
425 LYINFLOG("-----Begin to verify upgrade package----");
426 ret = zxic_dual_verify();
427 if(ret != 0)
428 {
429 LYINFLOG("Verify upgrade package failed");
430 return -1;
431 }
432
433 return 0;
434
435}
436
437/*****************************************
438* @brief:upgrade function
439* @param count [IN]:NA
440* @param sum [OUT]:NA
441* @return :success 0, failed -1
442* @todo:NA
443* @see:NA
444* @warning:NA
445******************************************/
446int lynq_fota_upgrade()
447{
448 int ret = 0;
449 z_upgrade_flush_status_t flush_status;
450 z_upgrade_status_info_t status;
451 memset(&status, 0, sizeof(z_upgrade_status_info_t));
452 flush_status.status = &status;
453 flush_status.status_cb = &lynq_g_flush_upgrade_status;
454
455
456 LYINFLOG("Enter lynq_fota_upgrade !!!!");
457 ret = zxic_dual_upgrade(&flush_status);
458 if(ret != 0)
459 {
460 LYINFLOG("Fota upgrade failed!!!");
461 return -1;
462 }
463 return 0;
464}
465
466/*****************************************
467* @brief:lynq_fota_nrestart no reboot
468* @param count [IN]:NA
469* @param sum [OUT]:NA
470* @return :success 0, failed -1
471* @todo:NA
472* @see:NA
473* @warning:NA
474******************************************/
475int lynq_fota_nrestart(void)
476{
477 int ret = 0;
l.yangc39faa22024-06-14 11:00:04 +0800478 int tmp = 0;
479 int lock_fd = 0;
480 lock_fd = qser_wakelock_create(FOTA_WAKELOCK_NAME, strlen(FOTA_WAKELOCK_NAME));
481 if(lock_fd < 0)
482 {
483 LYERRLOG("Create fota wakelock failed %d",lock_fd);
484 }
485
486 qser_wakelock_lock(lock_fd);
l.yang7d7b51c2023-08-04 17:02:48 +0800487 ret = rock_update_main(0);
488 if(ret != 0)
489 {
l.yangc39faa22024-06-14 11:00:04 +0800490 LYINFLOG("Upgrade failed !!!!");
l.yang7d7b51c2023-08-04 17:02:48 +0800491 }
492 else
493 {
494 LYINFLOG("upgrade success!!!");
495 }
l.yangc39faa22024-06-14 11:00:04 +0800496
497 qser_wakelock_unlock(lock_fd);
498 tmp = qser_wakelock_destroy(lock_fd);
499 if(tmp < 0)
500 {
501 LYERRLOG("Destroy fota wakelock failed");
502 }
503
504 return ret;
l.yang7d7b51c2023-08-04 17:02:48 +0800505}
506
507/*****************************************
508* @brief:lynq_rock_main,upgrade done reboot
509* @param count [IN]:int first_run
510* @param sum [OUT]:NA
511* @return :success 0, failed -1
512* @todo:NA
513* @see:NA
514* @warning:NA
515******************************************/
516int lynq_rock_main(int first_run)
517{
518 if(first_run <= 0)
519 {
520 LYINFLOG("Bad input value !!!");
521 return -1;
522 }
523
524 int ret = 0;
l.yangc39faa22024-06-14 11:00:04 +0800525 int lock_fd = 0;
526 int tmp = 0;
527 lock_fd = qser_wakelock_create(FOTA_WAKELOCK_NAME, strlen(FOTA_WAKELOCK_NAME));
528 if(lock_fd < 0)
529 {
530 LYERRLOG("Create fota wakelock failed %d",lock_fd);
531 }
532
533 qser_wakelock_lock(lock_fd);
534
l.yang7d7b51c2023-08-04 17:02:48 +0800535 ret = rock_update_main(1);
536 LYINFLOG("rock_update_main ret = %d\n", ret);
537 if(ret != 0)
538 {
539 LYINFLOG("fota update fail!\n");
540 }
l.yangc39faa22024-06-14 11:00:04 +0800541
542 qser_wakelock_unlock(lock_fd);
543 tmp = qser_wakelock_destroy(lock_fd);
544 if(tmp < 0)
545 {
546 LYERRLOG("Destroy fota wakelock failed");
547 }
548 return ret;
l.yang7d7b51c2023-08-04 17:02:48 +0800549
550}
551
552/*****************************************
553* @brief:lynq_get_current_system
554* @param count [IN]:NA
555* @param sum [OUT]:NA
556* @return :success: curretn slot , failed:-1
557* @todo:NA
558* @see:NA
559* @warning:NA
560******************************************/
561int lynq_get_current_system()
562{
563 int ret = 0;
564
565 ret = zxic_dual_get_current_system();
566 if(ret < 0)
567 {
568 LYINFLOG("lynq get current system faile");
569 return -1;
570 }
571 if(ret == 34650)
572 {
573 LYINFLOG("Get current system is system A");
574 }
575 else if(ret == 39019)
576 {
577 LYINFLOG("Get current system is system B");
578 }
579
580 return ret;
581
582}
583
584/*****************************************
585* @brief:lynq_get_boot_to_system
586* @param count [IN]:NA
587* @param sum [OUT]:NA
588* @return :success: 0, failed:-1
589* @todo:NA
590* @see:NA
591* @warning:NA
592******************************************/
593int lynq_get_boot_to_system()
594{
595 int boot_to = 0;
596 boot_to = zxic_dual_get_boot_to_system();
597 if(boot_to < 0)
598 {
599 LYINFLOG("lynq get boot to system failed");
600 return -1;
601 }
602 else
603 {
604 LYINFLOG("Boot to system:0x%08X[%d]",boot_to);
605 }
606
607 return 0;
608
609}
610
611/*****************************************
612* @brief:lynq_set_boot_to_system
613* @param count [IN]:char *option_para
614* @param sum [OUT]:NA
615* @return :success: 0, failed:-1
616* @todo:NA
617* @see:NA
618* @warning:NA
619******************************************/
620int lynq_set_boot_to_system(char *option_para)
621{
622 int ret = 0;
623 if(option_para == NULL)
624 {
625 LYINFLOG("Input invalid value! null option parameters! ");
626 return -1;
627 }
628
629 ret = zxic_dual_set_boot_to_system(atoi(option_para), 0);
630 if(ret < 0)
631 {
632 LYINFLOG("Set boot to [%s] error ", option_para);
633 return -1;
634 }
635
636 return 0;
637}
638
639/*****************************************
640* @brief:lynq_get_upgrade_status
641* @param count [IN]:NA
642* @param sum [OUT]:NA
643* @return :success: 0, failed:-1
644* @todo:NA
645* @see:NA
646* @warning:NA
647******************************************/
648int lynq_get_upgrade_status(void)
649{
650 z_upgrade_status_info_t status;
651 int ret = 0;
l.yangf8e8cf22024-01-25 15:10:22 +0800652 int reboot_flag = -1;
653 FILE *fp = NULL;
654 fp = fopen(FOTA_REBOOT_FLAG,"r");
655 if(fp == NULL)
l.yang7d7b51c2023-08-04 17:02:48 +0800656 {
l.yangf8e8cf22024-01-25 15:10:22 +0800657 LYERRLOG("Open reboot flag file failed");
l.yang7d7b51c2023-08-04 17:02:48 +0800658 return -1;
659 }
l.yangf8e8cf22024-01-25 15:10:22 +0800660
661 fread(&reboot_flag,sizeof(int),1,fp);
662 fclose(fp);
663
664 //get upgrade status before no reboot
665 if(reboot_flag == NO_REBOOT)
666 {
667
668 ret = zxic_dual_get_upgrade_status(&status);
669 if(ret < 0)
670 {
671 LYERRLOG("Get upgrade status fail! ");
672 return -1;
673 }
l.yang7d7b51c2023-08-04 17:02:48 +0800674
l.yangf8e8cf22024-01-25 15:10:22 +0800675 LYINFLOG("Current upgrade info: ");
676 LYINFLOG("Current upgrade status:%d ", status.upgrade_status);
677 LYINFLOG("Current upgrade total size:%d ", status.total_size);
678 LYINFLOG("Current upgrade updated size:%d ", status.upgraded_size);
679
680 return status.upgrade_status;
681 }
682 else
683 {
684 //get sync status
685 int fota_sync_tatus = 0;
686 fota_sync_tatus = lynq_get_sync_status();
687 if(fota_sync_tatus == ZXIC_SYNCHRONIZING)
688 {
689 LYINFLOG("Now fota upgrade sync status is synchronizing");
690 return LYNQ_SYNNCHRONIZING;
691 }
692 else if(fota_sync_tatus == ZXIC_SYNC_SUCCESS)
693 {
694 LYINFLOG("Now fota upgrade sync status sync success ");
695 return LYNQ_SYNC_SUCCESS;
696 }
l.yang04a9e9c2024-06-04 16:51:05 +0800697 else if(fota_sync_tatus == ZXIC_SYNC_FAILED)
l.yangf8e8cf22024-01-25 15:10:22 +0800698 {
699 LYERRLOG("Now fota upgrade sync status sync failed ");
700 return LYNQ_SYNC_FAILED;
701 }
702
703
704 }
l.yang7d7b51c2023-08-04 17:02:48 +0800705
706}
707
708/*****************************************
709* @brief:lynq_get_upgrade_status
710* @param count [IN]:NA
711* @param sum [OUT]:NA
712* @return :success: 0, failed:-1
713* @todo:NA
714* @see:NA
715* @warning:NA
716******************************************/
717int lynq_get_system_info()
718{
719 int ret = 0;
720 z_upgrade_system_info_t system_info;
721
722 ret = zxic_dual_get_system_status(&system_info);
723 if(ret < 0)
724 {
725 LYINFLOG("Get upgrade status fail! ");
726 return -1;
727 }
728 else
729 {
730 LYINFLOG("System info: ");
731 LYINFLOG("Boot to:0x%08X[%d] ", system_info.boot_to, system_info.boot_to);
732 LYINFLOG("Fota status:%d ", system_info.fota_status);
733 LYINFLOG("System1 system:0x%08X [%d] ", system_info.system_1.system, system_info.system_1.system);
734 LYINFLOG("System1 status:%d ", system_info.system_1.status);
735 LYINFLOG("System1 try_cnt:%d ", system_info.system_1.try_cnt);
736 LYINFLOG("System2 system:0x%08X [%d] ", system_info.system_2.system, system_info.system_2.system);
737 LYINFLOG("System2 status:%d ", system_info.system_2.status);
738 LYINFLOG("System2 try_cnt:%d ", system_info.system_2.try_cnt);
739 }
740
741 return 0;
742
743}
744
745/*****************************************
746* @brief:lynq_set_system_a_status
747* @param count [IN]:char *option_para
748* @param sum [OUT]:NA
749* @return :success: 0, failed:-1
750* @todo:NA
751* @see:NA
752* @warning:NA
753******************************************/
754int lynq_set_system_a_status(char *option_para)
755{
756 int ret = -1;
757 if (NULL == option_para)
758 {
759 LYINFLOG("Invalid option_para value ");
760 return -1;
761 }
762
763 //34650 A slot status : bootable:45527 unbootalbe:47806 success:23579
764 ret = zxic_dual_set_system_status(34650, atoi(option_para));
765 if(ret < 0)
766 {
767 LYINFLOG("Set system 1 status to [%s] error ", option_para);
768 return -1;
769 }
770
771 return 0;
772
773}
774
775/*****************************************
776* @brief:lynq_set_system_b_status
777* @param count [IN]:char *option_para
778* @param sum [OUT]:NA
779* @return :success: 0, failed:-1
780* @todo:NA
781* @see:NA
782* @warning:NA
783*****************************************/
784int lynq_set_system_b_status(char * option_para)
785{
786 int ret = -1;
787 if (NULL == option_para)
788 {
789 LYINFLOG("Invalid option_para value ");
790 return -1;
791 }
792
793 //39019 B slot status: bootable:45227 unbootalbe:47806 success:23579
794 ret = zxic_dual_set_system_status(39019, atoi(option_para));
795 if(ret < 0)
796 {
797 LYINFLOG("Set system 2 status to [%s] error ", option_para);
798 }
799
800 return 0;
801}
802
803/*****************************************
804* @brief:lynq_get_fota_status_for_nv
805* @param count [IN]:NA
806* @param sum [OUT]:NA
807* @return :success: 0, failed:-1
808* @todo:NA
809* @see:NA
810* @warning:NA
811*****************************************/
812int lynq_get_fota_status_for_nv()
813{
814 int status = 0;
815 status = zxic_dual_get_fota_status_for_nv();
816 if(status != 0)
817 {
818 LYINFLOG("Fota status:%d ", status);
819 return -1;
820 }
821 return 0;
822}
823
824/*****************************************
825* @brief:lynq_set_fota_status_for_nv
826* @param count [IN]:char *option_para
827* @param sum [OUT]:NA
828* @return :success: 0, failed:-1
829* @todo:NA
830* @see:NA
831* @warning:NA
832*****************************************/
833int lynq_set_fota_status_for_nv(char * option_para)
834{
835 int ret = 0;
836
837 if (NULL == option_para)
838 {
839 LYINFLOG("Invalid value! null option parameters! ");
840 return -1;
841 }
842
843 ret = zxic_dual_set_fota_status_for_nv(atoi(option_para));
844 if(ret < 0)
845 {
846 LYINFLOG("Set fota_status to [%s] error ", option_para);
847 }
848
849 return ret;
850}
851
852/*****************************************
853* @brief:lynq_sync_system
854* @param count [IN]:char *option_para
855* @param sum [OUT]:NA
856* @return :success: 0, failed:-1
857* @todo:NA
858* @see:NA
859* @warning:NA
860*****************************************/
861int lynq_sync_system()
862{
863 int ret = -1;
864
865 ret = zxic_dual_sync_system();
866 if( ret != 0)
867 {
868 LYINFLOG("lynq sync system failed !!!!");
869 return -1;
870 }
871
872 return 0;
873}
874
875/*****************************************
876* @brief:lynq_get_upgrade_type
877* @param count [IN]:NA
878* @param sum [OUT]:NA
879* @return :success: 0, failed:-1
880* @todo:NA
881* @see:NA
882* @warning:NA
883*****************************************/
884int lynq_get_upgrade_type()
885{
886 int upgrade_type = -1;
887
888 upgrade_type = zxic_dual_get_upgrade_type();
889 if(upgrade_type < 0)
890 {
891 LYINFLOG("Get upgrade type failed \n");
892 return -1;
893 }
894 else
895 {
896 LYINFLOG("upgrade type is %d", upgrade_type);
897 }
898 return 0;
899}
900
901/*****************************************
902* @brief:lynq_get_sync_status
903* @param count [IN]:char *option_para
904* @param sum [OUT]:NA
905* @return :success: 0, failed:-1
906* @todo:NA
907* @see:NA
908* @warning:NA
909*****************************************/
910int lynq_get_sync_status()
911{
912 int sync_status = -2;
913 zxic_dual_get_sync_status(&sync_status);
914 LYINFLOG("Current sync status is %d", sync_status);
l.yangf8e8cf22024-01-25 15:10:22 +0800915 return sync_status;
l.yang7d7b51c2023-08-04 17:02:48 +0800916}
917
918/*****************************************
919* @brief:lynq_set_sync_status
920* @param count [IN]:char *option_para
921* @param sum [OUT]:NA
922* @return :success: 0, failed:-1
923* @todo:NA
924* @see:NA
925* @warning:NA
926*****************************************/
927int lynq_set_sync_status(char * option_para)
928{
929 int ret = 0;
930
931 if (NULL == option_para)
932 {
933 LYINFLOG("Command input invalid value! null option parameters! ");
934 return -1;
935 }
936
937 ret = zxic_dual_set_sync_status(atoi(option_para));
938 if (0 != ret)
939 {
940 LYINFLOG("set sync status fail");
941 return -1;
942 }
943
944 return 0;
945}
946
l.yangf8e8cf22024-01-25 15:10:22 +0800947/*****************************************
948* @brief:lynq_read_process
949* @param count [IN]:NS
950* @param sum [OUT]:NA
951* @return :fota upgrade process 0-10
952* @todo:NA
953* @see:NA
954* @warning:NA
955*****************************************/
956int lynq_read_process(void)
957{
958 LYINFLOG("Enter lynq_read_process");
959
960 float fota_process = 0;
961 int ration = 0;
962 int read_count = 0;
963 FILE *fp = NULL;
964
965 while(1)
966 {
967
968 fp = fopen(FOTA_UPGRADE_PROCESS, "r");
969 if(fp == NULL)
970 {
971 LYERRLOG("lynq_read_process open file failed");
972 usleep(10000);
973 read_count++;
974 if(read_count > 5)
975 {
976 break;
977 }
978 }
979 else
980 {
981 break;
982 }
983 }
984
985 if(fp != NULL)
986 {
987
988 char line[256] = {0};
989 if (fgets(line, sizeof(line), fp) != NULL)
990 {
991 sscanf(line, "%d,%d", &total_size, &upgrade_size);
992 }
993 fclose(fp);
994 }
995
996
997 if(total_size != 0 && upgrade_size <= total_size)
998 {
999 LYINFLOG("Caculate fota process ration ");
1000 fota_process = (float) upgrade_size / total_size;
1001 }
1002
1003 ration = (int)(fota_process * 10);
1004 LYINFLOG("Fota process ration is %d",ration);
1005 return ration;
1006}
1007
you.chen21c62b72023-09-08 09:41:11 +08001008DEFINE_LYNQ_LIB_LOG(LYNQ_FOTA)
l.yang7d7b51c2023-08-04 17:02:48 +08001009
1010#ifdef __cplusplus
1011}
1012#endif