blob: 3e3393e6ec4a39fce623331536afc2a12e17abb9 [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"
30
l.yangdaba4bb2023-08-30 10:47:55 +080031#define FOTA_FLAG_FILE "/mnt/userdata/.back_up_flag"
l.yang7d7b51c2023-08-04 17:02:48 +080032
l.yangdaba4bb2023-08-30 10:47:55 +080033#define USER_LOG_TAG "LYNQ_FOTA"
34#define FOTA_ADDR_FILE "/mnt/userdata/.addr_value"
35#define FOTA_FILE_NAME "upgrade.package"
l.yang7d7b51c2023-08-04 17:02:48 +080036
37#define SYSTEM_A "34650"
38#define SYSTEM_B "39019"
39
l.yang7d7b51c2023-08-04 17:02:48 +080040
41#define BOOTABLE "45227"
42#define UNBOOTABLE "47806"
43
44
l.yang6e547912023-08-14 16:56:48 +080045#define LYNQ_UPGRADE_STATUS_VERIFING (0)
46#define LYNQ_UPGRADE_STATUS_VERIFY_SUCCESS (1)
47#define LYNQ_UPGRADE_STATUS_VERIFY_FAIL (2)
48#define LYNQ_UPGRADE_STATUS_UPDATING (3)
49#define LYNQ_UPGRADE_STATUS_UPDATE_SUCCESS (4)
50#define LYNQ_UPGRADE_STATUS_UPDATE_FAIL (5)
51
52
l.yang7d7b51c2023-08-04 17:02:48 +080053typedef struct
54{
55 int system;
56 int status;
57 int try_cnt;
58} z_system_info_t;
59
60typedef struct
61{
62 int upgrade_status;
63 int total_size;
64 int upgraded_size;
65} z_upgrade_status_info_t;
66
67typedef struct
68{
69 int boot_to;
70 int fota_status;
71 z_system_info_t system_1;
72 z_system_info_t system_2;
73} z_upgrade_system_info_t;
74
75typedef struct
76{
77 z_upgrade_status_info_t *status;
78 void(* status_cb)(z_upgrade_status_info_t *status);
79} z_upgrade_flush_status_t;
80
81extern int zxic_dual_verify();
82extern int zxic_dual_upgrade(z_upgrade_flush_status_t *flush_status);
83extern int zxic_dual_get_upgrade_status(z_upgrade_status_info_t *upgrade_info);
84extern int zxic_dual_get_current_system();
85extern int zxic_dual_get_boot_to_system();
86extern int zxic_dual_set_boot_to_system(int system, int reboot_flag);
87extern int zxic_dual_get_system_status(z_upgrade_system_info_t *system_info);
88extern int zxic_dual_set_system_status(int system, int status);
89extern int zxic_dual_get_fota_status_for_nv();
90extern int zxic_dual_set_fota_status_for_nv(int status);
91extern int zxic_dual_sync_system(void);
92extern int zxic_dual_get_upgrade_type(void);
93extern void zxic_dual_get_sync_status(int *sync_status);
94extern int zxic_dual_set_sync_status(int sync_status);
95extern int zxic_dual_config_package_path(char *upgrade_package_path, int length);
96
97int lynq_fota_verify();
98int lynq_fota_upgrade();
99int lynq_get_current_system();
100int lynq_get_boot_to_system();
101int lynq_set_boot_to_system(char *option_para);
102int lynq_set_system_a_status(char *option_para);
103int lynq_set_system_b_status(char *option_para);
104int lynq_sync_system();
105int lynq_get_upgrade_type();
106int lynq_get_sync_status();
107int lynq_set_sync_status(char *option_para);
108
109
110/*****************************************
111* @brief:rock_update_main
112* @param count [IN]:NA
113* @param sum [OUT]:NA
114* @return :success 0, failed -1
115* @todo:NA
116* @see:NA
117* @warning:NA
118******************************************/
119int rock_update_main(int reboot_flag)
120{
121
122 int ret = 0;
123 int current_slot = 0;
l.yangdaba4bb2023-08-30 10:47:55 +0800124 int fota_sync_flag = 0;
125 FILE *fp = NULL;
126 fp = fopen(FOTA_FLAG_FILE,"w+");
127 if(fp == NULL)
128 {
129 LYINFLOG("Creat fota flag file failed");
130 return -1;
131 }
132 fwrite(&fota_sync_flag,sizeof(int),1,fp);
133 fclose(fp);
l.yangc814c3a2023-09-12 17:42:58 +0800134
135 /* T106BUG-189 fix */
136 system("sync");
l.yangdaba4bb2023-08-30 10:47:55 +0800137
l.yang7d7b51c2023-08-04 17:02:48 +0800138 ret = lynq_fota_verify();
139 if(ret != 0)
140 {
141 LYINFLOG("Verify package failed exit upgrade");
142 return -1;
143 }
144
145
146 LYINFLOG("-----Begin to upgrade ----");
147 ret = lynq_fota_upgrade();
148 if(ret != 0)
149 {
150 LYINFLOG("Fota upgrade failed!!!");
151 return -1;
152 }
153
154 ret = lynq_get_upgrade_status();
l.yang6e547912023-08-14 16:56:48 +0800155 if(ret != LYNQ_UPGRADE_STATUS_UPDATE_SUCCESS)
l.yang7d7b51c2023-08-04 17:02:48 +0800156 {
157 LYINFLOG("Upgrade failed ");
158 return -1;
159 }
160
161 current_slot = lynq_get_current_system();
162 if(current_slot < 0)
163 {
164 LYINFLOG("Get current system failed");
165 return -1;
166 }
167
168
169 if(current_slot == atoi(SYSTEM_A))
170 {
171 LYINFLOG("current system is system a");
172
173
174 ret = lynq_set_boot_to_system((char *)SYSTEM_B);
175 if(ret != 0)
176 {
177 LYINFLOG("set system B boot failed ");
178 return -1;
179 }
180
181
182 ret = lynq_set_system_a_status((char *)UNBOOTABLE);
183 if(ret < 0)
184 {
185 LYINFLOG("Set system A status to [%s] error ", UNBOOTABLE);
186 return -1;
187 }
188
189 ret = lynq_set_system_b_status((char *)BOOTABLE);
190 if(ret < 0)
191 {
192 LYINFLOG("Set system B status to [%s] error ", BOOTABLE);
193 return -1;
194 }
195
196 }
197 else if( current_slot == atoi(SYSTEM_B))
198 {
199 LYINFLOG("current system is system a");
200
201
202 ret = lynq_set_boot_to_system((char *)SYSTEM_A);
203 if(ret != 0)
204 {
205 LYINFLOG("set system B boot failed ");
206 return -1;
207 }
208
209
210 ret = lynq_set_system_b_status((char *)UNBOOTABLE);
211 if(ret < 0)
212 {
213 LYINFLOG("Set system B status to [%s] error ", UNBOOTABLE);
214 return -1;
215 }
216
217 ret = lynq_set_system_a_status((char *)BOOTABLE);
218 if(ret < 0)
219 {
220 LYINFLOG("Set system A status to [%s] error ", BOOTABLE);
221 return -1;
222 }
223
224 }
l.yangdaba4bb2023-08-30 10:47:55 +0800225
226 fp = fopen(FOTA_FLAG_FILE,"w+");
227 if(fp == NULL)
228 {
229 LYINFLOG("Creat fota flag file failed");
230 return -1;
231 }
232
233 fota_sync_flag = 1;
234 fwrite(&fota_sync_flag,sizeof(int),1,fp);
235 fclose(fp);
l.yangc814c3a2023-09-12 17:42:58 +0800236
237 /* T106BUG-189 fix */
238 system("sync");
239
l.yang7d7b51c2023-08-04 17:02:48 +0800240 if(reboot_flag == 1)
241 {
242 LYINFLOG("Enter reboot device");
243 system("reboot");
244 }
245
246 return 0;
247}
248
249/*****************************************
250* @brief:upgrade callback function
251* @param count [IN]:z_upgrade_status_info_t *p_status
252* @param sum [OUT]:NA
253* @return :NA
254* @todo:
255* @see:NA
256* @warning:NA
257******************************************/
258void lynq_g_flush_upgrade_status(z_upgrade_status_info_t *p_status)
259{
260
261 LYINFLOG("Current status:%d ", p_status->upgrade_status);
262
263 LYINFLOG("Total size:%d ", p_status->total_size);
264
265 LYINFLOG("Updated size:%d ", p_status->upgraded_size);
266 return ;
267}
268
269/*****************************************
270* @brief:lynq_fota_set_addr_value
271* @param count [IN]:char *path
272* @param sum [OUT]:
273* @return :success 0, failed -1
274* @todo:NA
275* @see:NA
276* @warning:NA
277******************************************/
278int lynq_fota_set_addr_value(char *value,int size)
279{
280 int ret =0;
l.yangdaba4bb2023-08-30 10:47:55 +0800281 FILE *fp = NULL;
l.yang7d7b51c2023-08-04 17:02:48 +0800282 LYLOGSET(LOG_INFO);
283 LYLOGEINIT(USER_LOG_TAG);
284
285 if (NULL == value || size <= 0)
286 {
287 LYINFLOG("Bad package path!!!");
288 return -1;
289 }
290 ret = zxic_dual_config_package_path(value, strlen(value));
291 if(ret == -1)
292 {
293 LYINFLOG("Configure upgrade package path fail");
294 return -1;
295 }
296
l.yangdaba4bb2023-08-30 10:47:55 +0800297 fp = fopen(FOTA_ADDR_FILE,"w+");
298 if(fp == NULL)
299 {
300 LYINFLOG("Open addr file failed");
301 return -1;
302 }
303
304 fprintf(fp,"%s",value);
305 fclose(fp);
306
l.yang7d7b51c2023-08-04 17:02:48 +0800307 LYINFLOG("Configure upgrade package path success");
308 return 0;
309}
310
l.yangdaba4bb2023-08-30 10:47:55 +0800311/*****************************************
312* @brief:lynq_fota_get_addr_value
313* @param count [IN]:char *tmp_value
314* @param sum [OUT]:
315* @return :success 0, failed -1
316* @todo:NA
317* @see:NA
318* @warning:NA
319******************************************/
320int lynq_fota_get_addr_value(char *tmp_value)
321{
322 FILE *fp = NULL;
323 char tmp_addr[128] = {0};
324
325
326 fp = fopen(FOTA_ADDR_FILE,"r");
327 if(fp == NULL)
328 {
329 LYINFLOG("Open fota addr faile failed!!!");
330 return -1;
331 }
332 while(fgets(tmp_addr,sizeof(tmp_addr),fp) != NULL)
333 {
334 if( strstr(tmp_addr,FOTA_FILE_NAME) != NULL)
335 {
336 strncpy(tmp_value,tmp_addr,sizeof(tmp_addr) - 1);
337 break;
338 }
339 else
340 {
341 LYINFLOG("Get addr failed\n");
342 fclose(fp);
343 return -1;
344 }
345 }
346
347 fclose(fp);
348 return 0;
349
350
351}
352
l.yang7d7b51c2023-08-04 17:02:48 +0800353
354/*****************************************
355* @brief:lynq_fota_verify
356* @param count [IN]:NA
357* @param sum [OUT]:NA
358* @return :success 0, failed -1
359* @todo:NA
360* @see:NA
361* @warning:NA
362******************************************/
363int lynq_fota_verify()
364{
365 int ret = 0;
366
367 LYINFLOG("-----Begin to verify upgrade package----");
368 ret = zxic_dual_verify();
369 if(ret != 0)
370 {
371 LYINFLOG("Verify upgrade package failed");
372 return -1;
373 }
374
375 return 0;
376
377}
378
379/*****************************************
380* @brief:upgrade function
381* @param count [IN]:NA
382* @param sum [OUT]:NA
383* @return :success 0, failed -1
384* @todo:NA
385* @see:NA
386* @warning:NA
387******************************************/
388int lynq_fota_upgrade()
389{
390 int ret = 0;
391 z_upgrade_flush_status_t flush_status;
392 z_upgrade_status_info_t status;
393 memset(&status, 0, sizeof(z_upgrade_status_info_t));
394 flush_status.status = &status;
395 flush_status.status_cb = &lynq_g_flush_upgrade_status;
396
397
398 LYINFLOG("Enter lynq_fota_upgrade !!!!");
399 ret = zxic_dual_upgrade(&flush_status);
400 if(ret != 0)
401 {
402 LYINFLOG("Fota upgrade failed!!!");
403 return -1;
404 }
405 return 0;
406}
407
408/*****************************************
409* @brief:lynq_fota_nrestart no reboot
410* @param count [IN]:NA
411* @param sum [OUT]:NA
412* @return :success 0, failed -1
413* @todo:NA
414* @see:NA
415* @warning:NA
416******************************************/
417int lynq_fota_nrestart(void)
418{
419 int ret = 0;
420 ret = rock_update_main(0);
421 if(ret != 0)
422 {
423 LYINFLOG("Upgrade failed !!!!");
424 return -1;
425 }
426 else
427 {
428 LYINFLOG("upgrade success!!!");
429 }
430 return 0;
431}
432
433/*****************************************
434* @brief:lynq_rock_main,upgrade done reboot
435* @param count [IN]:int first_run
436* @param sum [OUT]:NA
437* @return :success 0, failed -1
438* @todo:NA
439* @see:NA
440* @warning:NA
441******************************************/
442int lynq_rock_main(int first_run)
443{
444 if(first_run <= 0)
445 {
446 LYINFLOG("Bad input value !!!");
447 return -1;
448 }
449
450 int ret = 0;
451 ret = rock_update_main(1);
452 LYINFLOG("rock_update_main ret = %d\n", ret);
453 if(ret != 0)
454 {
455 LYINFLOG("fota update fail!\n");
456 }
457 return 0;
458
459}
460
461/*****************************************
462* @brief:lynq_get_current_system
463* @param count [IN]:NA
464* @param sum [OUT]:NA
465* @return :success: curretn slot , failed:-1
466* @todo:NA
467* @see:NA
468* @warning:NA
469******************************************/
470int lynq_get_current_system()
471{
472 int ret = 0;
473
474 ret = zxic_dual_get_current_system();
475 if(ret < 0)
476 {
477 LYINFLOG("lynq get current system faile");
478 return -1;
479 }
480 if(ret == 34650)
481 {
482 LYINFLOG("Get current system is system A");
483 }
484 else if(ret == 39019)
485 {
486 LYINFLOG("Get current system is system B");
487 }
488
489 return ret;
490
491}
492
493/*****************************************
494* @brief:lynq_get_boot_to_system
495* @param count [IN]:NA
496* @param sum [OUT]:NA
497* @return :success: 0, failed:-1
498* @todo:NA
499* @see:NA
500* @warning:NA
501******************************************/
502int lynq_get_boot_to_system()
503{
504 int boot_to = 0;
505 boot_to = zxic_dual_get_boot_to_system();
506 if(boot_to < 0)
507 {
508 LYINFLOG("lynq get boot to system failed");
509 return -1;
510 }
511 else
512 {
513 LYINFLOG("Boot to system:0x%08X[%d]",boot_to);
514 }
515
516 return 0;
517
518}
519
520/*****************************************
521* @brief:lynq_set_boot_to_system
522* @param count [IN]:char *option_para
523* @param sum [OUT]:NA
524* @return :success: 0, failed:-1
525* @todo:NA
526* @see:NA
527* @warning:NA
528******************************************/
529int lynq_set_boot_to_system(char *option_para)
530{
531 int ret = 0;
532 if(option_para == NULL)
533 {
534 LYINFLOG("Input invalid value! null option parameters! ");
535 return -1;
536 }
537
538 ret = zxic_dual_set_boot_to_system(atoi(option_para), 0);
539 if(ret < 0)
540 {
541 LYINFLOG("Set boot to [%s] error ", option_para);
542 return -1;
543 }
544
545 return 0;
546}
547
548/*****************************************
549* @brief:lynq_get_upgrade_status
550* @param count [IN]:NA
551* @param sum [OUT]:NA
552* @return :success: 0, failed:-1
553* @todo:NA
554* @see:NA
555* @warning:NA
556******************************************/
557int lynq_get_upgrade_status(void)
558{
559 z_upgrade_status_info_t status;
560 int ret = 0;
561
562
563 ret = zxic_dual_get_upgrade_status(&status);
564 if(ret < 0)
565 {
566 LYINFLOG("Get upgrade status fail! ");
567 return -1;
568 }
569
570 LYINFLOG("Current upgrade info: ");
571 LYINFLOG("Current upgrade status:%d ", status.upgrade_status);
572 LYINFLOG("Current upgrade total size:%d ", status.total_size);
573 LYINFLOG("Current upgrade updated size:%d ", status.upgraded_size);
l.yang6e547912023-08-14 16:56:48 +0800574
575 return status.upgrade_status;
l.yang7d7b51c2023-08-04 17:02:48 +0800576
577}
578
579/*****************************************
580* @brief:lynq_get_upgrade_status
581* @param count [IN]:NA
582* @param sum [OUT]:NA
583* @return :success: 0, failed:-1
584* @todo:NA
585* @see:NA
586* @warning:NA
587******************************************/
588int lynq_get_system_info()
589{
590 int ret = 0;
591 z_upgrade_system_info_t system_info;
592
593 ret = zxic_dual_get_system_status(&system_info);
594 if(ret < 0)
595 {
596 LYINFLOG("Get upgrade status fail! ");
597 return -1;
598 }
599 else
600 {
601 LYINFLOG("System info: ");
602 LYINFLOG("Boot to:0x%08X[%d] ", system_info.boot_to, system_info.boot_to);
603 LYINFLOG("Fota status:%d ", system_info.fota_status);
604 LYINFLOG("System1 system:0x%08X [%d] ", system_info.system_1.system, system_info.system_1.system);
605 LYINFLOG("System1 status:%d ", system_info.system_1.status);
606 LYINFLOG("System1 try_cnt:%d ", system_info.system_1.try_cnt);
607 LYINFLOG("System2 system:0x%08X [%d] ", system_info.system_2.system, system_info.system_2.system);
608 LYINFLOG("System2 status:%d ", system_info.system_2.status);
609 LYINFLOG("System2 try_cnt:%d ", system_info.system_2.try_cnt);
610 }
611
612 return 0;
613
614}
615
616/*****************************************
617* @brief:lynq_set_system_a_status
618* @param count [IN]:char *option_para
619* @param sum [OUT]:NA
620* @return :success: 0, failed:-1
621* @todo:NA
622* @see:NA
623* @warning:NA
624******************************************/
625int lynq_set_system_a_status(char *option_para)
626{
627 int ret = -1;
628 if (NULL == option_para)
629 {
630 LYINFLOG("Invalid option_para value ");
631 return -1;
632 }
633
634 //34650 A slot status : bootable:45527 unbootalbe:47806 success:23579
635 ret = zxic_dual_set_system_status(34650, atoi(option_para));
636 if(ret < 0)
637 {
638 LYINFLOG("Set system 1 status to [%s] error ", option_para);
639 return -1;
640 }
641
642 return 0;
643
644}
645
646/*****************************************
647* @brief:lynq_set_system_b_status
648* @param count [IN]:char *option_para
649* @param sum [OUT]:NA
650* @return :success: 0, failed:-1
651* @todo:NA
652* @see:NA
653* @warning:NA
654*****************************************/
655int lynq_set_system_b_status(char * option_para)
656{
657 int ret = -1;
658 if (NULL == option_para)
659 {
660 LYINFLOG("Invalid option_para value ");
661 return -1;
662 }
663
664 //39019 B slot status: bootable:45227 unbootalbe:47806 success:23579
665 ret = zxic_dual_set_system_status(39019, atoi(option_para));
666 if(ret < 0)
667 {
668 LYINFLOG("Set system 2 status to [%s] error ", option_para);
669 }
670
671 return 0;
672}
673
674/*****************************************
675* @brief:lynq_get_fota_status_for_nv
676* @param count [IN]:NA
677* @param sum [OUT]:NA
678* @return :success: 0, failed:-1
679* @todo:NA
680* @see:NA
681* @warning:NA
682*****************************************/
683int lynq_get_fota_status_for_nv()
684{
685 int status = 0;
686 status = zxic_dual_get_fota_status_for_nv();
687 if(status != 0)
688 {
689 LYINFLOG("Fota status:%d ", status);
690 return -1;
691 }
692 return 0;
693}
694
695/*****************************************
696* @brief:lynq_set_fota_status_for_nv
697* @param count [IN]:char *option_para
698* @param sum [OUT]:NA
699* @return :success: 0, failed:-1
700* @todo:NA
701* @see:NA
702* @warning:NA
703*****************************************/
704int lynq_set_fota_status_for_nv(char * option_para)
705{
706 int ret = 0;
707
708 if (NULL == option_para)
709 {
710 LYINFLOG("Invalid value! null option parameters! ");
711 return -1;
712 }
713
714 ret = zxic_dual_set_fota_status_for_nv(atoi(option_para));
715 if(ret < 0)
716 {
717 LYINFLOG("Set fota_status to [%s] error ", option_para);
718 }
719
720 return ret;
721}
722
723/*****************************************
724* @brief:lynq_sync_system
725* @param count [IN]:char *option_para
726* @param sum [OUT]:NA
727* @return :success: 0, failed:-1
728* @todo:NA
729* @see:NA
730* @warning:NA
731*****************************************/
732int lynq_sync_system()
733{
734 int ret = -1;
735
736 ret = zxic_dual_sync_system();
737 if( ret != 0)
738 {
739 LYINFLOG("lynq sync system failed !!!!");
740 return -1;
741 }
742
743 return 0;
744}
745
746/*****************************************
747* @brief:lynq_get_upgrade_type
748* @param count [IN]:NA
749* @param sum [OUT]:NA
750* @return :success: 0, failed:-1
751* @todo:NA
752* @see:NA
753* @warning:NA
754*****************************************/
755int lynq_get_upgrade_type()
756{
757 int upgrade_type = -1;
758
759 upgrade_type = zxic_dual_get_upgrade_type();
760 if(upgrade_type < 0)
761 {
762 LYINFLOG("Get upgrade type failed \n");
763 return -1;
764 }
765 else
766 {
767 LYINFLOG("upgrade type is %d", upgrade_type);
768 }
769 return 0;
770}
771
772/*****************************************
773* @brief:lynq_get_sync_status
774* @param count [IN]:char *option_para
775* @param sum [OUT]:NA
776* @return :success: 0, failed:-1
777* @todo:NA
778* @see:NA
779* @warning:NA
780*****************************************/
781int lynq_get_sync_status()
782{
783 int sync_status = -2;
784 zxic_dual_get_sync_status(&sync_status);
785 LYINFLOG("Current sync status is %d", sync_status);
786 return 0;
787}
788
789/*****************************************
790* @brief:lynq_set_sync_status
791* @param count [IN]:char *option_para
792* @param sum [OUT]:NA
793* @return :success: 0, failed:-1
794* @todo:NA
795* @see:NA
796* @warning:NA
797*****************************************/
798int lynq_set_sync_status(char * option_para)
799{
800 int ret = 0;
801
802 if (NULL == option_para)
803 {
804 LYINFLOG("Command input invalid value! null option parameters! ");
805 return -1;
806 }
807
808 ret = zxic_dual_set_sync_status(atoi(option_para));
809 if (0 != ret)
810 {
811 LYINFLOG("set sync status fail");
812 return -1;
813 }
814
815 return 0;
816}
817
you.chen21c62b72023-09-08 09:41:11 +0800818DEFINE_LYNQ_LIB_LOG(LYNQ_FOTA)
l.yang7d7b51c2023-08-04 17:02:48 +0800819
820#ifdef __cplusplus
821}
822#endif