blob: 1589c5f0eccc2fb5402d10f94483bb0bd6592bdf [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");
l.yang2bd0b5d2024-06-20 10:47:10 +0800540 qser_wakelock_unlock(lock_fd);
541 tmp = qser_wakelock_destroy(lock_fd);
542 if(tmp < 0)
543 {
544 LYERRLOG("Destroy fota wakelock failed");
545 }
l.yang7d7b51c2023-08-04 17:02:48 +0800546 }
l.yangc39faa22024-06-14 11:00:04 +0800547
l.yang2bd0b5d2024-06-20 10:47:10 +0800548
l.yangc39faa22024-06-14 11:00:04 +0800549 return ret;
l.yang7d7b51c2023-08-04 17:02:48 +0800550
551}
552
553/*****************************************
554* @brief:lynq_get_current_system
555* @param count [IN]:NA
556* @param sum [OUT]:NA
557* @return :success: curretn slot , failed:-1
558* @todo:NA
559* @see:NA
560* @warning:NA
561******************************************/
562int lynq_get_current_system()
563{
564 int ret = 0;
565
566 ret = zxic_dual_get_current_system();
567 if(ret < 0)
568 {
569 LYINFLOG("lynq get current system faile");
570 return -1;
571 }
572 if(ret == 34650)
573 {
574 LYINFLOG("Get current system is system A");
575 }
576 else if(ret == 39019)
577 {
578 LYINFLOG("Get current system is system B");
579 }
580
581 return ret;
582
583}
584
585/*****************************************
586* @brief:lynq_get_boot_to_system
587* @param count [IN]:NA
588* @param sum [OUT]:NA
589* @return :success: 0, failed:-1
590* @todo:NA
591* @see:NA
592* @warning:NA
593******************************************/
594int lynq_get_boot_to_system()
595{
596 int boot_to = 0;
597 boot_to = zxic_dual_get_boot_to_system();
598 if(boot_to < 0)
599 {
600 LYINFLOG("lynq get boot to system failed");
601 return -1;
602 }
603 else
604 {
605 LYINFLOG("Boot to system:0x%08X[%d]",boot_to);
606 }
607
608 return 0;
609
610}
611
612/*****************************************
613* @brief:lynq_set_boot_to_system
614* @param count [IN]:char *option_para
615* @param sum [OUT]:NA
616* @return :success: 0, failed:-1
617* @todo:NA
618* @see:NA
619* @warning:NA
620******************************************/
621int lynq_set_boot_to_system(char *option_para)
622{
623 int ret = 0;
624 if(option_para == NULL)
625 {
626 LYINFLOG("Input invalid value! null option parameters! ");
627 return -1;
628 }
629
630 ret = zxic_dual_set_boot_to_system(atoi(option_para), 0);
631 if(ret < 0)
632 {
633 LYINFLOG("Set boot to [%s] error ", option_para);
634 return -1;
635 }
636
637 return 0;
638}
639
640/*****************************************
641* @brief:lynq_get_upgrade_status
642* @param count [IN]:NA
643* @param sum [OUT]:NA
644* @return :success: 0, failed:-1
645* @todo:NA
646* @see:NA
647* @warning:NA
648******************************************/
649int lynq_get_upgrade_status(void)
650{
651 z_upgrade_status_info_t status;
652 int ret = 0;
l.yangf8e8cf22024-01-25 15:10:22 +0800653 int reboot_flag = -1;
654 FILE *fp = NULL;
655 fp = fopen(FOTA_REBOOT_FLAG,"r");
656 if(fp == NULL)
l.yang7d7b51c2023-08-04 17:02:48 +0800657 {
l.yangf8e8cf22024-01-25 15:10:22 +0800658 LYERRLOG("Open reboot flag file failed");
l.yang7d7b51c2023-08-04 17:02:48 +0800659 return -1;
660 }
l.yangf8e8cf22024-01-25 15:10:22 +0800661
662 fread(&reboot_flag,sizeof(int),1,fp);
663 fclose(fp);
664
665 //get upgrade status before no reboot
666 if(reboot_flag == NO_REBOOT)
667 {
668
669 ret = zxic_dual_get_upgrade_status(&status);
670 if(ret < 0)
671 {
672 LYERRLOG("Get upgrade status fail! ");
673 return -1;
674 }
l.yang7d7b51c2023-08-04 17:02:48 +0800675
l.yangf8e8cf22024-01-25 15:10:22 +0800676 LYINFLOG("Current upgrade info: ");
677 LYINFLOG("Current upgrade status:%d ", status.upgrade_status);
678 LYINFLOG("Current upgrade total size:%d ", status.total_size);
679 LYINFLOG("Current upgrade updated size:%d ", status.upgraded_size);
680
681 return status.upgrade_status;
682 }
683 else
684 {
685 //get sync status
686 int fota_sync_tatus = 0;
687 fota_sync_tatus = lynq_get_sync_status();
688 if(fota_sync_tatus == ZXIC_SYNCHRONIZING)
689 {
690 LYINFLOG("Now fota upgrade sync status is synchronizing");
691 return LYNQ_SYNNCHRONIZING;
692 }
693 else if(fota_sync_tatus == ZXIC_SYNC_SUCCESS)
694 {
695 LYINFLOG("Now fota upgrade sync status sync success ");
696 return LYNQ_SYNC_SUCCESS;
697 }
l.yang04a9e9c2024-06-04 16:51:05 +0800698 else if(fota_sync_tatus == ZXIC_SYNC_FAILED)
l.yangf8e8cf22024-01-25 15:10:22 +0800699 {
700 LYERRLOG("Now fota upgrade sync status sync failed ");
701 return LYNQ_SYNC_FAILED;
702 }
703
704
705 }
l.yang7d7b51c2023-08-04 17:02:48 +0800706
707}
708
709/*****************************************
710* @brief:lynq_get_upgrade_status
711* @param count [IN]:NA
712* @param sum [OUT]:NA
713* @return :success: 0, failed:-1
714* @todo:NA
715* @see:NA
716* @warning:NA
717******************************************/
718int lynq_get_system_info()
719{
720 int ret = 0;
721 z_upgrade_system_info_t system_info;
722
723 ret = zxic_dual_get_system_status(&system_info);
724 if(ret < 0)
725 {
726 LYINFLOG("Get upgrade status fail! ");
727 return -1;
728 }
729 else
730 {
731 LYINFLOG("System info: ");
732 LYINFLOG("Boot to:0x%08X[%d] ", system_info.boot_to, system_info.boot_to);
733 LYINFLOG("Fota status:%d ", system_info.fota_status);
734 LYINFLOG("System1 system:0x%08X [%d] ", system_info.system_1.system, system_info.system_1.system);
735 LYINFLOG("System1 status:%d ", system_info.system_1.status);
736 LYINFLOG("System1 try_cnt:%d ", system_info.system_1.try_cnt);
737 LYINFLOG("System2 system:0x%08X [%d] ", system_info.system_2.system, system_info.system_2.system);
738 LYINFLOG("System2 status:%d ", system_info.system_2.status);
739 LYINFLOG("System2 try_cnt:%d ", system_info.system_2.try_cnt);
740 }
741
742 return 0;
743
744}
745
746/*****************************************
747* @brief:lynq_set_system_a_status
748* @param count [IN]:char *option_para
749* @param sum [OUT]:NA
750* @return :success: 0, failed:-1
751* @todo:NA
752* @see:NA
753* @warning:NA
754******************************************/
755int lynq_set_system_a_status(char *option_para)
756{
757 int ret = -1;
758 if (NULL == option_para)
759 {
760 LYINFLOG("Invalid option_para value ");
761 return -1;
762 }
763
764 //34650 A slot status : bootable:45527 unbootalbe:47806 success:23579
765 ret = zxic_dual_set_system_status(34650, atoi(option_para));
766 if(ret < 0)
767 {
768 LYINFLOG("Set system 1 status to [%s] error ", option_para);
769 return -1;
770 }
771
772 return 0;
773
774}
775
776/*****************************************
777* @brief:lynq_set_system_b_status
778* @param count [IN]:char *option_para
779* @param sum [OUT]:NA
780* @return :success: 0, failed:-1
781* @todo:NA
782* @see:NA
783* @warning:NA
784*****************************************/
785int lynq_set_system_b_status(char * option_para)
786{
787 int ret = -1;
788 if (NULL == option_para)
789 {
790 LYINFLOG("Invalid option_para value ");
791 return -1;
792 }
793
794 //39019 B slot status: bootable:45227 unbootalbe:47806 success:23579
795 ret = zxic_dual_set_system_status(39019, atoi(option_para));
796 if(ret < 0)
797 {
798 LYINFLOG("Set system 2 status to [%s] error ", option_para);
799 }
800
801 return 0;
802}
803
804/*****************************************
805* @brief:lynq_get_fota_status_for_nv
806* @param count [IN]:NA
807* @param sum [OUT]:NA
808* @return :success: 0, failed:-1
809* @todo:NA
810* @see:NA
811* @warning:NA
812*****************************************/
813int lynq_get_fota_status_for_nv()
814{
815 int status = 0;
816 status = zxic_dual_get_fota_status_for_nv();
817 if(status != 0)
818 {
819 LYINFLOG("Fota status:%d ", status);
820 return -1;
821 }
822 return 0;
823}
824
825/*****************************************
826* @brief:lynq_set_fota_status_for_nv
827* @param count [IN]:char *option_para
828* @param sum [OUT]:NA
829* @return :success: 0, failed:-1
830* @todo:NA
831* @see:NA
832* @warning:NA
833*****************************************/
834int lynq_set_fota_status_for_nv(char * option_para)
835{
836 int ret = 0;
837
838 if (NULL == option_para)
839 {
840 LYINFLOG("Invalid value! null option parameters! ");
841 return -1;
842 }
843
844 ret = zxic_dual_set_fota_status_for_nv(atoi(option_para));
845 if(ret < 0)
846 {
847 LYINFLOG("Set fota_status to [%s] error ", option_para);
848 }
849
850 return ret;
851}
852
853/*****************************************
854* @brief:lynq_sync_system
855* @param count [IN]:char *option_para
856* @param sum [OUT]:NA
857* @return :success: 0, failed:-1
858* @todo:NA
859* @see:NA
860* @warning:NA
861*****************************************/
862int lynq_sync_system()
863{
864 int ret = -1;
865
866 ret = zxic_dual_sync_system();
867 if( ret != 0)
868 {
869 LYINFLOG("lynq sync system failed !!!!");
870 return -1;
871 }
872
873 return 0;
874}
875
876/*****************************************
877* @brief:lynq_get_upgrade_type
878* @param count [IN]:NA
879* @param sum [OUT]:NA
880* @return :success: 0, failed:-1
881* @todo:NA
882* @see:NA
883* @warning:NA
884*****************************************/
885int lynq_get_upgrade_type()
886{
887 int upgrade_type = -1;
888
889 upgrade_type = zxic_dual_get_upgrade_type();
890 if(upgrade_type < 0)
891 {
892 LYINFLOG("Get upgrade type failed \n");
893 return -1;
894 }
895 else
896 {
897 LYINFLOG("upgrade type is %d", upgrade_type);
898 }
899 return 0;
900}
901
902/*****************************************
903* @brief:lynq_get_sync_status
904* @param count [IN]:char *option_para
905* @param sum [OUT]:NA
906* @return :success: 0, failed:-1
907* @todo:NA
908* @see:NA
909* @warning:NA
910*****************************************/
911int lynq_get_sync_status()
912{
913 int sync_status = -2;
914 zxic_dual_get_sync_status(&sync_status);
915 LYINFLOG("Current sync status is %d", sync_status);
l.yangf8e8cf22024-01-25 15:10:22 +0800916 return sync_status;
l.yang7d7b51c2023-08-04 17:02:48 +0800917}
918
919/*****************************************
920* @brief:lynq_set_sync_status
921* @param count [IN]:char *option_para
922* @param sum [OUT]:NA
923* @return :success: 0, failed:-1
924* @todo:NA
925* @see:NA
926* @warning:NA
927*****************************************/
928int lynq_set_sync_status(char * option_para)
929{
930 int ret = 0;
931
932 if (NULL == option_para)
933 {
934 LYINFLOG("Command input invalid value! null option parameters! ");
935 return -1;
936 }
937
938 ret = zxic_dual_set_sync_status(atoi(option_para));
939 if (0 != ret)
940 {
941 LYINFLOG("set sync status fail");
942 return -1;
943 }
944
945 return 0;
946}
947
l.yangf8e8cf22024-01-25 15:10:22 +0800948/*****************************************
949* @brief:lynq_read_process
950* @param count [IN]:NS
951* @param sum [OUT]:NA
952* @return :fota upgrade process 0-10
953* @todo:NA
954* @see:NA
955* @warning:NA
956*****************************************/
957int lynq_read_process(void)
958{
959 LYINFLOG("Enter lynq_read_process");
960
961 float fota_process = 0;
962 int ration = 0;
963 int read_count = 0;
964 FILE *fp = NULL;
965
966 while(1)
967 {
968
969 fp = fopen(FOTA_UPGRADE_PROCESS, "r");
970 if(fp == NULL)
971 {
972 LYERRLOG("lynq_read_process open file failed");
973 usleep(10000);
974 read_count++;
975 if(read_count > 5)
976 {
977 break;
978 }
979 }
980 else
981 {
982 break;
983 }
984 }
985
986 if(fp != NULL)
987 {
988
989 char line[256] = {0};
990 if (fgets(line, sizeof(line), fp) != NULL)
991 {
992 sscanf(line, "%d,%d", &total_size, &upgrade_size);
993 }
994 fclose(fp);
995 }
996
997
998 if(total_size != 0 && upgrade_size <= total_size)
999 {
1000 LYINFLOG("Caculate fota process ration ");
1001 fota_process = (float) upgrade_size / total_size;
1002 }
1003
1004 ration = (int)(fota_process * 10);
1005 LYINFLOG("Fota process ration is %d",ration);
1006 return ration;
1007}
1008
you.chen21c62b72023-09-08 09:41:11 +08001009DEFINE_LYNQ_LIB_LOG(LYNQ_FOTA)
l.yang7d7b51c2023-08-04 17:02:48 +08001010
1011#ifdef __cplusplus
1012}
1013#endif