blob: 53ee3c82efe42af59cc0199004945be8ee595e1c [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 }
l.yang185656c2023-09-28 14:26:41 +0800180
l.yang7d7b51c2023-08-04 17:02:48 +0800181 }
182 else if( current_slot == atoi(SYSTEM_B))
183 {
184 LYINFLOG("current system is system a");
185
186
187 ret = lynq_set_boot_to_system((char *)SYSTEM_A);
188 if(ret != 0)
189 {
190 LYINFLOG("set system B boot failed ");
191 return -1;
192 }
193
l.yang7d7b51c2023-08-04 17:02:48 +0800194 }
l.yangdaba4bb2023-08-30 10:47:55 +0800195
196 fp = fopen(FOTA_FLAG_FILE,"w+");
197 if(fp == NULL)
198 {
199 LYINFLOG("Creat fota flag file failed");
200 return -1;
201 }
202
203 fota_sync_flag = 1;
204 fwrite(&fota_sync_flag,sizeof(int),1,fp);
205 fclose(fp);
l.yangc814c3a2023-09-12 17:42:58 +0800206
207 /* T106BUG-189 fix */
208 system("sync");
209
l.yang7d7b51c2023-08-04 17:02:48 +0800210 if(reboot_flag == 1)
211 {
212 LYINFLOG("Enter reboot device");
213 system("reboot");
214 }
215
216 return 0;
217}
218
219/*****************************************
220* @brief:upgrade callback function
221* @param count [IN]:z_upgrade_status_info_t *p_status
222* @param sum [OUT]:NA
223* @return :NA
224* @todo:
225* @see:NA
226* @warning:NA
227******************************************/
228void lynq_g_flush_upgrade_status(z_upgrade_status_info_t *p_status)
229{
230
231 LYINFLOG("Current status:%d ", p_status->upgrade_status);
232
233 LYINFLOG("Total size:%d ", p_status->total_size);
234
235 LYINFLOG("Updated size:%d ", p_status->upgraded_size);
236 return ;
237}
238
239/*****************************************
240* @brief:lynq_fota_set_addr_value
241* @param count [IN]:char *path
242* @param sum [OUT]:
243* @return :success 0, failed -1
244* @todo:NA
245* @see:NA
246* @warning:NA
247******************************************/
248int lynq_fota_set_addr_value(char *value,int size)
249{
250 int ret =0;
l.yangdaba4bb2023-08-30 10:47:55 +0800251 FILE *fp = NULL;
l.yang7d7b51c2023-08-04 17:02:48 +0800252 LYLOGSET(LOG_INFO);
253 LYLOGEINIT(USER_LOG_TAG);
254
255 if (NULL == value || size <= 0)
256 {
257 LYINFLOG("Bad package path!!!");
258 return -1;
259 }
260 ret = zxic_dual_config_package_path(value, strlen(value));
261 if(ret == -1)
262 {
263 LYINFLOG("Configure upgrade package path fail");
264 return -1;
265 }
266
l.yangdaba4bb2023-08-30 10:47:55 +0800267 fp = fopen(FOTA_ADDR_FILE,"w+");
268 if(fp == NULL)
269 {
270 LYINFLOG("Open addr file failed");
271 return -1;
272 }
273
274 fprintf(fp,"%s",value);
275 fclose(fp);
276
l.yang7d7b51c2023-08-04 17:02:48 +0800277 LYINFLOG("Configure upgrade package path success");
278 return 0;
279}
280
l.yangdaba4bb2023-08-30 10:47:55 +0800281/*****************************************
282* @brief:lynq_fota_get_addr_value
283* @param count [IN]:char *tmp_value
284* @param sum [OUT]:
285* @return :success 0, failed -1
286* @todo:NA
287* @see:NA
288* @warning:NA
289******************************************/
290int lynq_fota_get_addr_value(char *tmp_value)
291{
292 FILE *fp = NULL;
293 char tmp_addr[128] = {0};
294
295
296 fp = fopen(FOTA_ADDR_FILE,"r");
297 if(fp == NULL)
298 {
299 LYINFLOG("Open fota addr faile failed!!!");
300 return -1;
301 }
302 while(fgets(tmp_addr,sizeof(tmp_addr),fp) != NULL)
303 {
304 if( strstr(tmp_addr,FOTA_FILE_NAME) != NULL)
305 {
306 strncpy(tmp_value,tmp_addr,sizeof(tmp_addr) - 1);
307 break;
308 }
309 else
310 {
311 LYINFLOG("Get addr failed\n");
312 fclose(fp);
313 return -1;
314 }
315 }
316
317 fclose(fp);
318 return 0;
319
320
321}
322
l.yang7d7b51c2023-08-04 17:02:48 +0800323
324/*****************************************
325* @brief:lynq_fota_verify
326* @param count [IN]:NA
327* @param sum [OUT]:NA
328* @return :success 0, failed -1
329* @todo:NA
330* @see:NA
331* @warning:NA
332******************************************/
333int lynq_fota_verify()
334{
335 int ret = 0;
336
337 LYINFLOG("-----Begin to verify upgrade package----");
338 ret = zxic_dual_verify();
339 if(ret != 0)
340 {
341 LYINFLOG("Verify upgrade package failed");
342 return -1;
343 }
344
345 return 0;
346
347}
348
349/*****************************************
350* @brief:upgrade function
351* @param count [IN]:NA
352* @param sum [OUT]:NA
353* @return :success 0, failed -1
354* @todo:NA
355* @see:NA
356* @warning:NA
357******************************************/
358int lynq_fota_upgrade()
359{
360 int ret = 0;
361 z_upgrade_flush_status_t flush_status;
362 z_upgrade_status_info_t status;
363 memset(&status, 0, sizeof(z_upgrade_status_info_t));
364 flush_status.status = &status;
365 flush_status.status_cb = &lynq_g_flush_upgrade_status;
366
367
368 LYINFLOG("Enter lynq_fota_upgrade !!!!");
369 ret = zxic_dual_upgrade(&flush_status);
370 if(ret != 0)
371 {
372 LYINFLOG("Fota upgrade failed!!!");
373 return -1;
374 }
375 return 0;
376}
377
378/*****************************************
379* @brief:lynq_fota_nrestart no reboot
380* @param count [IN]:NA
381* @param sum [OUT]:NA
382* @return :success 0, failed -1
383* @todo:NA
384* @see:NA
385* @warning:NA
386******************************************/
387int lynq_fota_nrestart(void)
388{
389 int ret = 0;
390 ret = rock_update_main(0);
391 if(ret != 0)
392 {
393 LYINFLOG("Upgrade failed !!!!");
394 return -1;
395 }
396 else
397 {
398 LYINFLOG("upgrade success!!!");
399 }
400 return 0;
401}
402
403/*****************************************
404* @brief:lynq_rock_main,upgrade done reboot
405* @param count [IN]:int first_run
406* @param sum [OUT]:NA
407* @return :success 0, failed -1
408* @todo:NA
409* @see:NA
410* @warning:NA
411******************************************/
412int lynq_rock_main(int first_run)
413{
414 if(first_run <= 0)
415 {
416 LYINFLOG("Bad input value !!!");
417 return -1;
418 }
419
420 int ret = 0;
421 ret = rock_update_main(1);
422 LYINFLOG("rock_update_main ret = %d\n", ret);
423 if(ret != 0)
424 {
425 LYINFLOG("fota update fail!\n");
426 }
427 return 0;
428
429}
430
431/*****************************************
432* @brief:lynq_get_current_system
433* @param count [IN]:NA
434* @param sum [OUT]:NA
435* @return :success: curretn slot , failed:-1
436* @todo:NA
437* @see:NA
438* @warning:NA
439******************************************/
440int lynq_get_current_system()
441{
442 int ret = 0;
443
444 ret = zxic_dual_get_current_system();
445 if(ret < 0)
446 {
447 LYINFLOG("lynq get current system faile");
448 return -1;
449 }
450 if(ret == 34650)
451 {
452 LYINFLOG("Get current system is system A");
453 }
454 else if(ret == 39019)
455 {
456 LYINFLOG("Get current system is system B");
457 }
458
459 return ret;
460
461}
462
463/*****************************************
464* @brief:lynq_get_boot_to_system
465* @param count [IN]:NA
466* @param sum [OUT]:NA
467* @return :success: 0, failed:-1
468* @todo:NA
469* @see:NA
470* @warning:NA
471******************************************/
472int lynq_get_boot_to_system()
473{
474 int boot_to = 0;
475 boot_to = zxic_dual_get_boot_to_system();
476 if(boot_to < 0)
477 {
478 LYINFLOG("lynq get boot to system failed");
479 return -1;
480 }
481 else
482 {
483 LYINFLOG("Boot to system:0x%08X[%d]",boot_to);
484 }
485
486 return 0;
487
488}
489
490/*****************************************
491* @brief:lynq_set_boot_to_system
492* @param count [IN]:char *option_para
493* @param sum [OUT]:NA
494* @return :success: 0, failed:-1
495* @todo:NA
496* @see:NA
497* @warning:NA
498******************************************/
499int lynq_set_boot_to_system(char *option_para)
500{
501 int ret = 0;
502 if(option_para == NULL)
503 {
504 LYINFLOG("Input invalid value! null option parameters! ");
505 return -1;
506 }
507
508 ret = zxic_dual_set_boot_to_system(atoi(option_para), 0);
509 if(ret < 0)
510 {
511 LYINFLOG("Set boot to [%s] error ", option_para);
512 return -1;
513 }
514
515 return 0;
516}
517
518/*****************************************
519* @brief:lynq_get_upgrade_status
520* @param count [IN]:NA
521* @param sum [OUT]:NA
522* @return :success: 0, failed:-1
523* @todo:NA
524* @see:NA
525* @warning:NA
526******************************************/
527int lynq_get_upgrade_status(void)
528{
529 z_upgrade_status_info_t status;
530 int ret = 0;
531
532
533 ret = zxic_dual_get_upgrade_status(&status);
534 if(ret < 0)
535 {
536 LYINFLOG("Get upgrade status fail! ");
537 return -1;
538 }
539
540 LYINFLOG("Current upgrade info: ");
541 LYINFLOG("Current upgrade status:%d ", status.upgrade_status);
542 LYINFLOG("Current upgrade total size:%d ", status.total_size);
543 LYINFLOG("Current upgrade updated size:%d ", status.upgraded_size);
l.yang6e547912023-08-14 16:56:48 +0800544
545 return status.upgrade_status;
l.yang7d7b51c2023-08-04 17:02:48 +0800546
547}
548
549/*****************************************
550* @brief:lynq_get_upgrade_status
551* @param count [IN]:NA
552* @param sum [OUT]:NA
553* @return :success: 0, failed:-1
554* @todo:NA
555* @see:NA
556* @warning:NA
557******************************************/
558int lynq_get_system_info()
559{
560 int ret = 0;
561 z_upgrade_system_info_t system_info;
562
563 ret = zxic_dual_get_system_status(&system_info);
564 if(ret < 0)
565 {
566 LYINFLOG("Get upgrade status fail! ");
567 return -1;
568 }
569 else
570 {
571 LYINFLOG("System info: ");
572 LYINFLOG("Boot to:0x%08X[%d] ", system_info.boot_to, system_info.boot_to);
573 LYINFLOG("Fota status:%d ", system_info.fota_status);
574 LYINFLOG("System1 system:0x%08X [%d] ", system_info.system_1.system, system_info.system_1.system);
575 LYINFLOG("System1 status:%d ", system_info.system_1.status);
576 LYINFLOG("System1 try_cnt:%d ", system_info.system_1.try_cnt);
577 LYINFLOG("System2 system:0x%08X [%d] ", system_info.system_2.system, system_info.system_2.system);
578 LYINFLOG("System2 status:%d ", system_info.system_2.status);
579 LYINFLOG("System2 try_cnt:%d ", system_info.system_2.try_cnt);
580 }
581
582 return 0;
583
584}
585
586/*****************************************
587* @brief:lynq_set_system_a_status
588* @param count [IN]:char *option_para
589* @param sum [OUT]:NA
590* @return :success: 0, failed:-1
591* @todo:NA
592* @see:NA
593* @warning:NA
594******************************************/
595int lynq_set_system_a_status(char *option_para)
596{
597 int ret = -1;
598 if (NULL == option_para)
599 {
600 LYINFLOG("Invalid option_para value ");
601 return -1;
602 }
603
604 //34650 A slot status : bootable:45527 unbootalbe:47806 success:23579
605 ret = zxic_dual_set_system_status(34650, atoi(option_para));
606 if(ret < 0)
607 {
608 LYINFLOG("Set system 1 status to [%s] error ", option_para);
609 return -1;
610 }
611
612 return 0;
613
614}
615
616/*****************************************
617* @brief:lynq_set_system_b_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_b_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 //39019 B slot status: bootable:45227 unbootalbe:47806 success:23579
635 ret = zxic_dual_set_system_status(39019, atoi(option_para));
636 if(ret < 0)
637 {
638 LYINFLOG("Set system 2 status to [%s] error ", option_para);
639 }
640
641 return 0;
642}
643
644/*****************************************
645* @brief:lynq_get_fota_status_for_nv
646* @param count [IN]:NA
647* @param sum [OUT]:NA
648* @return :success: 0, failed:-1
649* @todo:NA
650* @see:NA
651* @warning:NA
652*****************************************/
653int lynq_get_fota_status_for_nv()
654{
655 int status = 0;
656 status = zxic_dual_get_fota_status_for_nv();
657 if(status != 0)
658 {
659 LYINFLOG("Fota status:%d ", status);
660 return -1;
661 }
662 return 0;
663}
664
665/*****************************************
666* @brief:lynq_set_fota_status_for_nv
667* @param count [IN]:char *option_para
668* @param sum [OUT]:NA
669* @return :success: 0, failed:-1
670* @todo:NA
671* @see:NA
672* @warning:NA
673*****************************************/
674int lynq_set_fota_status_for_nv(char * option_para)
675{
676 int ret = 0;
677
678 if (NULL == option_para)
679 {
680 LYINFLOG("Invalid value! null option parameters! ");
681 return -1;
682 }
683
684 ret = zxic_dual_set_fota_status_for_nv(atoi(option_para));
685 if(ret < 0)
686 {
687 LYINFLOG("Set fota_status to [%s] error ", option_para);
688 }
689
690 return ret;
691}
692
693/*****************************************
694* @brief:lynq_sync_system
695* @param count [IN]:char *option_para
696* @param sum [OUT]:NA
697* @return :success: 0, failed:-1
698* @todo:NA
699* @see:NA
700* @warning:NA
701*****************************************/
702int lynq_sync_system()
703{
704 int ret = -1;
705
706 ret = zxic_dual_sync_system();
707 if( ret != 0)
708 {
709 LYINFLOG("lynq sync system failed !!!!");
710 return -1;
711 }
712
713 return 0;
714}
715
716/*****************************************
717* @brief:lynq_get_upgrade_type
718* @param count [IN]:NA
719* @param sum [OUT]:NA
720* @return :success: 0, failed:-1
721* @todo:NA
722* @see:NA
723* @warning:NA
724*****************************************/
725int lynq_get_upgrade_type()
726{
727 int upgrade_type = -1;
728
729 upgrade_type = zxic_dual_get_upgrade_type();
730 if(upgrade_type < 0)
731 {
732 LYINFLOG("Get upgrade type failed \n");
733 return -1;
734 }
735 else
736 {
737 LYINFLOG("upgrade type is %d", upgrade_type);
738 }
739 return 0;
740}
741
742/*****************************************
743* @brief:lynq_get_sync_status
744* @param count [IN]:char *option_para
745* @param sum [OUT]:NA
746* @return :success: 0, failed:-1
747* @todo:NA
748* @see:NA
749* @warning:NA
750*****************************************/
751int lynq_get_sync_status()
752{
753 int sync_status = -2;
754 zxic_dual_get_sync_status(&sync_status);
755 LYINFLOG("Current sync status is %d", sync_status);
756 return 0;
757}
758
759/*****************************************
760* @brief:lynq_set_sync_status
761* @param count [IN]:char *option_para
762* @param sum [OUT]:NA
763* @return :success: 0, failed:-1
764* @todo:NA
765* @see:NA
766* @warning:NA
767*****************************************/
768int lynq_set_sync_status(char * option_para)
769{
770 int ret = 0;
771
772 if (NULL == option_para)
773 {
774 LYINFLOG("Command input invalid value! null option parameters! ");
775 return -1;
776 }
777
778 ret = zxic_dual_set_sync_status(atoi(option_para));
779 if (0 != ret)
780 {
781 LYINFLOG("set sync status fail");
782 return -1;
783 }
784
785 return 0;
786}
787
you.chen21c62b72023-09-08 09:41:11 +0800788DEFINE_LYNQ_LIB_LOG(LYNQ_FOTA)
l.yang7d7b51c2023-08-04 17:02:48 +0800789
790#ifdef __cplusplus
791}
792#endif