blob: 20816fb2baf529724dd933fd6dae6008becf30b6 [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
hj.shao@mobiletek.cn21652662025-09-18 02:30:35 -070042#define SYNC_RUNNING_FLAG "/tmp/sync_running.flag"
43#define UPDATE_ACTIVE_FLAG "/tmp/update_active.flag"
l.yang7d7b51c2023-08-04 17:02:48 +080044
45#define BOOTABLE "45227"
46#define UNBOOTABLE "47806"
47
l.yangc39faa22024-06-14 11:00:04 +080048#define FOTA_WAKELOCK_NAME "FOTA_WAKELOCK"
49
l.yang7d7b51c2023-08-04 17:02:48 +080050
l.yang6e547912023-08-14 16:56:48 +080051#define LYNQ_UPGRADE_STATUS_VERIFING (0)
52#define LYNQ_UPGRADE_STATUS_VERIFY_SUCCESS (1)
53#define LYNQ_UPGRADE_STATUS_VERIFY_FAIL (2)
54#define LYNQ_UPGRADE_STATUS_UPDATING (3)
55#define LYNQ_UPGRADE_STATUS_UPDATE_SUCCESS (4)
56#define LYNQ_UPGRADE_STATUS_UPDATE_FAIL (5)
57
l.yangf8e8cf22024-01-25 15:10:22 +080058#define LYNQ_SYNNCHRONIZING 8
59#define LYNQ_SYNC_SUCCESS 9
l.yang04a9e9c2024-06-04 16:51:05 +080060#define LYNQ_SYNC_FAILED 10
l.yangf8e8cf22024-01-25 15:10:22 +080061
62#define ZXIC_SYNCHRONIZING 1
63#define ZXIC_SYNC_SUCCESS 0
l.yang04a9e9c2024-06-04 16:51:05 +080064#define ZXIC_SYNC_FAILED -1
l.yangf8e8cf22024-01-25 15:10:22 +080065
66#define NO_REBOOT 0
67
68
69int total_size = 0;
70int upgrade_size = 0;
l.yang6e547912023-08-14 16:56:48 +080071
l.yang7224e6c2024-06-14 13:04:28 +080072
l.yang7d7b51c2023-08-04 17:02:48 +080073typedef struct
74{
75 int system;
76 int status;
77 int try_cnt;
78} z_system_info_t;
79
80typedef struct
81{
82 int upgrade_status;
83 int total_size;
84 int upgraded_size;
85} z_upgrade_status_info_t;
86
87typedef struct
88{
89 int boot_to;
90 int fota_status;
91 z_system_info_t system_1;
92 z_system_info_t system_2;
93} z_upgrade_system_info_t;
94
95typedef struct
96{
97 z_upgrade_status_info_t *status;
98 void(* status_cb)(z_upgrade_status_info_t *status);
99} z_upgrade_flush_status_t;
100
101extern int zxic_dual_verify();
102extern int zxic_dual_upgrade(z_upgrade_flush_status_t *flush_status);
103extern int zxic_dual_get_upgrade_status(z_upgrade_status_info_t *upgrade_info);
104extern int zxic_dual_get_current_system();
105extern int zxic_dual_get_boot_to_system();
106extern int zxic_dual_set_boot_to_system(int system, int reboot_flag);
107extern int zxic_dual_get_system_status(z_upgrade_system_info_t *system_info);
108extern int zxic_dual_set_system_status(int system, int status);
109extern int zxic_dual_get_fota_status_for_nv();
110extern int zxic_dual_set_fota_status_for_nv(int status);
111extern int zxic_dual_sync_system(void);
112extern int zxic_dual_get_upgrade_type(void);
113extern void zxic_dual_get_sync_status(int *sync_status);
114extern int zxic_dual_set_sync_status(int sync_status);
115extern int zxic_dual_config_package_path(char *upgrade_package_path, int length);
116
117int lynq_fota_verify();
118int lynq_fota_upgrade();
119int lynq_get_current_system();
120int lynq_get_boot_to_system();
121int lynq_set_boot_to_system(char *option_para);
122int lynq_set_system_a_status(char *option_para);
123int lynq_set_system_b_status(char *option_para);
124int lynq_sync_system();
125int lynq_get_upgrade_type();
126int lynq_get_sync_status();
127int lynq_set_sync_status(char *option_para);
l.yang526ef682024-07-15 17:46:51 +0800128int calculate_md5_sum( char *md5_sum,int md5_size);
l.yang7d7b51c2023-08-04 17:02:48 +0800129
hj.shao@mobiletek.cn21652662025-09-18 02:30:35 -0700130
131static int can_run_update()
132{
133 if (access(SYNC_RUNNING_FLAG, F_OK) == 0)
134 {
135 LYINFLOG("Update: Status=-2 (Sync is running, please try later)\n");
136 return -2;
137 }
138
139 return 0;
140}
141
142static int set_update_flag()
143{
144 FILE *fp = fopen(UPDATE_ACTIVE_FLAG, "w");
145 if (!fp)
146 {
147 LYINFLOG("open update_active_flag file failed \n");
148 return -1;
149 }
150 fprintf(fp, "OTA update active");
151 fclose(fp);
152 system("sync");
153 return 0;
154}
l.yang7d7b51c2023-08-04 17:02:48 +0800155/*****************************************
156* @brief:rock_update_main
157* @param count [IN]:NA
158* @param sum [OUT]:NA
hj.shao@mobiletek.cn21652662025-09-18 02:30:35 -0700159* @return :success 0, failed -1, busy -2
l.yang7d7b51c2023-08-04 17:02:48 +0800160* @todo:NA
161* @see:NA
162* @warning:NA
163******************************************/
164int rock_update_main(int reboot_flag)
165{
166
167 int ret = 0;
168 int current_slot = 0;
l.yangdaba4bb2023-08-30 10:47:55 +0800169 int fota_sync_flag = 0;
l.yangf8e8cf22024-01-25 15:10:22 +0800170 int reboot_flg = NO_REBOOT;
l.yang7224e6c2024-06-14 13:04:28 +0800171 time_t startTime;
172 time_t endTime;
173 struct tm *localTime;
174 double elapsed = 0;
l.yang526ef682024-07-15 17:46:51 +0800175 char md5_sum[48] = {0};
hj.shao@mobiletek.cn21652662025-09-18 02:30:35 -0700176 FILE *fp = NULL;
177
178 if(set_update_flag() != 0)
179 {
180 return -1;
181 }
182 if(can_run_update() != 0)
183 {
184 return -2;
185 }
l.yangdaba4bb2023-08-30 10:47:55 +0800186 fp = fopen(FOTA_FLAG_FILE,"w+");
187 if(fp == NULL)
188 {
189 LYINFLOG("Creat fota flag file failed");
190 return -1;
191 }
192 fwrite(&fota_sync_flag,sizeof(int),1,fp);
193 fclose(fp);
l.yangc814c3a2023-09-12 17:42:58 +0800194
195 /* T106BUG-189 fix */
196 system("sync");
l.yangf8e8cf22024-01-25 15:10:22 +0800197
198 fp =fopen(FOTA_REBOOT_FLAG,"w+");
199 if(fp == NULL)
200 {
l.yangce9a4852024-03-26 10:07:25 +0800201 LYERRLOG("Creat get upgrade status flag failed");
l.yangf8e8cf22024-01-25 15:10:22 +0800202 return -1;
203 }
204
205 fwrite(&reboot_flg,sizeof(int),1,fp);
206 fclose(fp);
207 system("sync");
l.yangce9a4852024-03-26 10:07:25 +0800208
209 //fix T106BUG-585 start
210 total_size = 0;
211 upgrade_size = 0;
212
213 fp = fopen(FOTA_UPGRADE_PROCESS,"w+");
214 if(fp == NULL)
215 {
216 LYERRLOG("Error opening file");
217 return -1;
218 }
219
220 fprintf(fp, "%d,%d\n", total_size, upgrade_size);
221 fclose(fp);
222 //fix T106BUG-585 end
223
l.yang7d7b51c2023-08-04 17:02:48 +0800224 ret = lynq_fota_verify();
225 if(ret != 0)
226 {
227 LYINFLOG("Verify package failed exit upgrade");
228 return -1;
229 }
l.yang7224e6c2024-06-14 13:04:28 +0800230
l.yang526ef682024-07-15 17:46:51 +0800231 ret = calculate_md5_sum(md5_sum,sizeof(md5_sum));
232 if(ret != 0)
233 {
234 LYINFLOG("Calculate md5 sum failed");
235 }
236
l.yang7224e6c2024-06-14 13:04:28 +0800237 startTime = time(NULL);
238 if(startTime == (time_t)-1)
239 {
240 LYERRLOG("Failed to get the current time.\n");
241 }
l.yang7d7b51c2023-08-04 17:02:48 +0800242
243 LYINFLOG("-----Begin to upgrade ----");
244 ret = lynq_fota_upgrade();
l.yang7224e6c2024-06-14 13:04:28 +0800245
246 endTime = time(NULL);
247 if(endTime == (time_t)-1)
248 {
249 LYERRLOG("Failed to get the current time.\n");
250 }
251 elapsed = difftime(endTime, startTime);
252 localTime = localtime(&endTime);
l.yang7d7b51c2023-08-04 17:02:48 +0800253 if(ret != 0)
254 {
l.yang7224e6c2024-06-14 13:04:28 +0800255 LYERRLOG("Upgrade failed");
l.yang526ef682024-07-15 17:46:51 +0800256 ret = sc_debug_info_record(MODULE_ID_CAP_FOTA,"failed,spendtime: %.2lf seconds,finished time %s,md5:%s", elapsed,asctime(localTime),md5_sum);
l.yang7224e6c2024-06-14 13:04:28 +0800257 if(ret <= 0)
258 {
259 LYERRLOG("lynq_record_debug_info failed");
260 }
l.yang7d7b51c2023-08-04 17:02:48 +0800261 return -1;
262 }
l.yang7224e6c2024-06-14 13:04:28 +0800263 else
264 {
265 LYINFLOG("Upgrade success");
l.yang526ef682024-07-15 17:46:51 +0800266 ret = sc_debug_info_record(MODULE_ID_CAP_FOTA,"success,spendtime: %.2lf seconds,finished time %s,md5:%s", elapsed,asctime(localTime),md5_sum);
l.yang7224e6c2024-06-14 13:04:28 +0800267 if(ret <= 0)
268 {
269 LYERRLOG("lynq_record_debug_info failed");
270 }
271 }
272
l.yang7d7b51c2023-08-04 17:02:48 +0800273
274 ret = lynq_get_upgrade_status();
l.yang6e547912023-08-14 16:56:48 +0800275 if(ret != LYNQ_UPGRADE_STATUS_UPDATE_SUCCESS)
l.yang7d7b51c2023-08-04 17:02:48 +0800276 {
277 LYINFLOG("Upgrade failed ");
278 return -1;
279 }
280
281 current_slot = lynq_get_current_system();
282 if(current_slot < 0)
283 {
284 LYINFLOG("Get current system failed");
285 return -1;
286 }
287
l.yang7d7b51c2023-08-04 17:02:48 +0800288 if(current_slot == atoi(SYSTEM_A))
289 {
290 LYINFLOG("current system is system a");
l.yang7d7b51c2023-08-04 17:02:48 +0800291 ret = lynq_set_boot_to_system((char *)SYSTEM_B);
292 if(ret != 0)
293 {
294 LYINFLOG("set system B boot failed ");
295 return -1;
296 }
l.yang185656c2023-09-28 14:26:41 +0800297
l.yang7d7b51c2023-08-04 17:02:48 +0800298 }
299 else if( current_slot == atoi(SYSTEM_B))
300 {
301 LYINFLOG("current system is system a");
l.yang7d7b51c2023-08-04 17:02:48 +0800302 ret = lynq_set_boot_to_system((char *)SYSTEM_A);
303 if(ret != 0)
304 {
305 LYINFLOG("set system B boot failed ");
306 return -1;
307 }
308
l.yang7d7b51c2023-08-04 17:02:48 +0800309 }
l.yangdaba4bb2023-08-30 10:47:55 +0800310
311 fp = fopen(FOTA_FLAG_FILE,"w+");
312 if(fp == NULL)
313 {
314 LYINFLOG("Creat fota flag file failed");
315 return -1;
316 }
317
318 fota_sync_flag = 1;
319 fwrite(&fota_sync_flag,sizeof(int),1,fp);
320 fclose(fp);
l.yangc814c3a2023-09-12 17:42:58 +0800321
322 /* T106BUG-189 fix */
323 system("sync");
324
l.yang7d7b51c2023-08-04 17:02:48 +0800325 if(reboot_flag == 1)
326 {
327 LYINFLOG("Enter reboot device");
328 system("reboot");
329 }
330
331 return 0;
332}
333
334/*****************************************
335* @brief:upgrade callback function
336* @param count [IN]:z_upgrade_status_info_t *p_status
337* @param sum [OUT]:NA
338* @return :NA
339* @todo:
340* @see:NA
341* @warning:NA
342******************************************/
343void lynq_g_flush_upgrade_status(z_upgrade_status_info_t *p_status)
344{
345
346 LYINFLOG("Current status:%d ", p_status->upgrade_status);
347
348 LYINFLOG("Total size:%d ", p_status->total_size);
349
350 LYINFLOG("Updated size:%d ", p_status->upgraded_size);
l.yangf8e8cf22024-01-25 15:10:22 +0800351
352 total_size = p_status->total_size;
353 upgrade_size = p_status->upgraded_size;
354
355 FILE *fp = NULL;
l.yangce9a4852024-03-26 10:07:25 +0800356
357
l.yangf8e8cf22024-01-25 15:10:22 +0800358 fp = fopen(FOTA_UPGRADE_PROCESS,"w");
359 if (fp == NULL)
360 {
361 LYERRLOG("Error opening file");
362 return;
363 }
364
365 fprintf(fp, "%d,%d\n", total_size, upgrade_size);
366 fclose(fp);
l.yang7d7b51c2023-08-04 17:02:48 +0800367}
368
369/*****************************************
370* @brief:lynq_fota_set_addr_value
371* @param count [IN]:char *path
372* @param sum [OUT]:
373* @return :success 0, failed -1
374* @todo:NA
375* @see:NA
376* @warning:NA
377******************************************/
378int lynq_fota_set_addr_value(char *value,int size)
379{
380 int ret =0;
l.yangdaba4bb2023-08-30 10:47:55 +0800381 FILE *fp = NULL;
l.yang7d7b51c2023-08-04 17:02:48 +0800382 LYLOGSET(LOG_INFO);
383 LYLOGEINIT(USER_LOG_TAG);
384
385 if (NULL == value || size <= 0)
386 {
387 LYINFLOG("Bad package path!!!");
388 return -1;
389 }
390 ret = zxic_dual_config_package_path(value, strlen(value));
391 if(ret == -1)
392 {
393 LYINFLOG("Configure upgrade package path fail");
394 return -1;
395 }
396
l.yangdaba4bb2023-08-30 10:47:55 +0800397 fp = fopen(FOTA_ADDR_FILE,"w+");
398 if(fp == NULL)
399 {
400 LYINFLOG("Open addr file failed");
401 return -1;
402 }
403
404 fprintf(fp,"%s",value);
405 fclose(fp);
406
l.yang7d7b51c2023-08-04 17:02:48 +0800407 LYINFLOG("Configure upgrade package path success");
408 return 0;
409}
410
l.yangdaba4bb2023-08-30 10:47:55 +0800411/*****************************************
412* @brief:lynq_fota_get_addr_value
413* @param count [IN]:char *tmp_value
414* @param sum [OUT]:
415* @return :success 0, failed -1
416* @todo:NA
417* @see:NA
418* @warning:NA
419******************************************/
420int lynq_fota_get_addr_value(char *tmp_value)
421{
422 FILE *fp = NULL;
423 char tmp_addr[128] = {0};
424
425
426 fp = fopen(FOTA_ADDR_FILE,"r");
427 if(fp == NULL)
428 {
429 LYINFLOG("Open fota addr faile failed!!!");
430 return -1;
431 }
432 while(fgets(tmp_addr,sizeof(tmp_addr),fp) != NULL)
433 {
434 if( strstr(tmp_addr,FOTA_FILE_NAME) != NULL)
435 {
436 strncpy(tmp_value,tmp_addr,sizeof(tmp_addr) - 1);
437 break;
438 }
439 else
440 {
441 LYINFLOG("Get addr failed\n");
442 fclose(fp);
443 return -1;
444 }
445 }
446
447 fclose(fp);
448 return 0;
449
450
451}
452
l.yang7d7b51c2023-08-04 17:02:48 +0800453
454/*****************************************
455* @brief:lynq_fota_verify
456* @param count [IN]:NA
457* @param sum [OUT]:NA
458* @return :success 0, failed -1
459* @todo:NA
460* @see:NA
461* @warning:NA
462******************************************/
463int lynq_fota_verify()
464{
465 int ret = 0;
466
467 LYINFLOG("-----Begin to verify upgrade package----");
468 ret = zxic_dual_verify();
469 if(ret != 0)
470 {
471 LYINFLOG("Verify upgrade package failed");
472 return -1;
473 }
474
475 return 0;
476
477}
478
479/*****************************************
480* @brief:upgrade function
481* @param count [IN]:NA
482* @param sum [OUT]:NA
483* @return :success 0, failed -1
484* @todo:NA
485* @see:NA
486* @warning:NA
487******************************************/
488int lynq_fota_upgrade()
489{
490 int ret = 0;
491 z_upgrade_flush_status_t flush_status;
492 z_upgrade_status_info_t status;
493 memset(&status, 0, sizeof(z_upgrade_status_info_t));
494 flush_status.status = &status;
495 flush_status.status_cb = &lynq_g_flush_upgrade_status;
496
497
498 LYINFLOG("Enter lynq_fota_upgrade !!!!");
499 ret = zxic_dual_upgrade(&flush_status);
500 if(ret != 0)
501 {
502 LYINFLOG("Fota upgrade failed!!!");
503 return -1;
504 }
505 return 0;
506}
507
508/*****************************************
509* @brief:lynq_fota_nrestart no reboot
510* @param count [IN]:NA
511* @param sum [OUT]:NA
hj.shao@mobiletek.cn21652662025-09-18 02:30:35 -0700512* @return :success 0, failed -1, busy -2
l.yang7d7b51c2023-08-04 17:02:48 +0800513* @todo:NA
514* @see:NA
515* @warning:NA
516******************************************/
517int lynq_fota_nrestart(void)
518{
519 int ret = 0;
l.yangc39faa22024-06-14 11:00:04 +0800520 int tmp = 0;
521 int lock_fd = 0;
522 lock_fd = qser_wakelock_create(FOTA_WAKELOCK_NAME, strlen(FOTA_WAKELOCK_NAME));
523 if(lock_fd < 0)
524 {
525 LYERRLOG("Create fota wakelock failed %d",lock_fd);
526 }
527
528 qser_wakelock_lock(lock_fd);
l.yang7d7b51c2023-08-04 17:02:48 +0800529 ret = rock_update_main(0);
530 if(ret != 0)
531 {
l.yangc39faa22024-06-14 11:00:04 +0800532 LYINFLOG("Upgrade failed !!!!");
l.yang7d7b51c2023-08-04 17:02:48 +0800533 }
534 else
535 {
536 LYINFLOG("upgrade success!!!");
537 }
l.yangc39faa22024-06-14 11:00:04 +0800538
539 qser_wakelock_unlock(lock_fd);
540 tmp = qser_wakelock_destroy(lock_fd);
541 if(tmp < 0)
542 {
543 LYERRLOG("Destroy fota wakelock failed");
544 }
545
546 return ret;
l.yang7d7b51c2023-08-04 17:02:48 +0800547}
548
549/*****************************************
550* @brief:lynq_rock_main,upgrade done reboot
551* @param count [IN]:int first_run
552* @param sum [OUT]:NA
hj.shao@mobiletek.cn21652662025-09-18 02:30:35 -0700553* @return :success 0, failed -1, busy -2
l.yang7d7b51c2023-08-04 17:02:48 +0800554* @todo:NA
555* @see:NA
556* @warning:NA
557******************************************/
558int lynq_rock_main(int first_run)
559{
560 if(first_run <= 0)
561 {
562 LYINFLOG("Bad input value !!!");
563 return -1;
564 }
565
566 int ret = 0;
l.yangc39faa22024-06-14 11:00:04 +0800567 int lock_fd = 0;
568 int tmp = 0;
569 lock_fd = qser_wakelock_create(FOTA_WAKELOCK_NAME, strlen(FOTA_WAKELOCK_NAME));
570 if(lock_fd < 0)
571 {
572 LYERRLOG("Create fota wakelock failed %d",lock_fd);
573 }
574
575 qser_wakelock_lock(lock_fd);
576
l.yang7d7b51c2023-08-04 17:02:48 +0800577 ret = rock_update_main(1);
578 LYINFLOG("rock_update_main ret = %d\n", ret);
579 if(ret != 0)
580 {
581 LYINFLOG("fota update fail!\n");
l.yang2bd0b5d2024-06-20 10:47:10 +0800582 qser_wakelock_unlock(lock_fd);
583 tmp = qser_wakelock_destroy(lock_fd);
584 if(tmp < 0)
585 {
586 LYERRLOG("Destroy fota wakelock failed");
587 }
l.yang7d7b51c2023-08-04 17:02:48 +0800588 }
l.yangc39faa22024-06-14 11:00:04 +0800589
l.yang2bd0b5d2024-06-20 10:47:10 +0800590
l.yangc39faa22024-06-14 11:00:04 +0800591 return ret;
l.yang7d7b51c2023-08-04 17:02:48 +0800592
593}
594
595/*****************************************
596* @brief:lynq_get_current_system
597* @param count [IN]:NA
598* @param sum [OUT]:NA
599* @return :success: curretn slot , failed:-1
600* @todo:NA
601* @see:NA
602* @warning:NA
603******************************************/
604int lynq_get_current_system()
605{
606 int ret = 0;
607
608 ret = zxic_dual_get_current_system();
609 if(ret < 0)
610 {
611 LYINFLOG("lynq get current system faile");
612 return -1;
613 }
614 if(ret == 34650)
615 {
616 LYINFLOG("Get current system is system A");
617 }
618 else if(ret == 39019)
619 {
620 LYINFLOG("Get current system is system B");
621 }
622
623 return ret;
624
625}
626
627/*****************************************
628* @brief:lynq_get_boot_to_system
629* @param count [IN]:NA
630* @param sum [OUT]:NA
631* @return :success: 0, failed:-1
632* @todo:NA
633* @see:NA
634* @warning:NA
635******************************************/
636int lynq_get_boot_to_system()
637{
638 int boot_to = 0;
639 boot_to = zxic_dual_get_boot_to_system();
640 if(boot_to < 0)
641 {
642 LYINFLOG("lynq get boot to system failed");
643 return -1;
644 }
645 else
646 {
647 LYINFLOG("Boot to system:0x%08X[%d]",boot_to);
648 }
649
650 return 0;
651
652}
653
654/*****************************************
655* @brief:lynq_set_boot_to_system
656* @param count [IN]:char *option_para
657* @param sum [OUT]:NA
658* @return :success: 0, failed:-1
659* @todo:NA
660* @see:NA
661* @warning:NA
662******************************************/
663int lynq_set_boot_to_system(char *option_para)
664{
665 int ret = 0;
666 if(option_para == NULL)
667 {
668 LYINFLOG("Input invalid value! null option parameters! ");
669 return -1;
670 }
671
672 ret = zxic_dual_set_boot_to_system(atoi(option_para), 0);
673 if(ret < 0)
674 {
675 LYINFLOG("Set boot to [%s] error ", option_para);
676 return -1;
677 }
678
679 return 0;
680}
681
682/*****************************************
683* @brief:lynq_get_upgrade_status
684* @param count [IN]:NA
685* @param sum [OUT]:NA
686* @return :success: 0, failed:-1
687* @todo:NA
688* @see:NA
689* @warning:NA
690******************************************/
691int lynq_get_upgrade_status(void)
692{
693 z_upgrade_status_info_t status;
694 int ret = 0;
l.yangf8e8cf22024-01-25 15:10:22 +0800695 int reboot_flag = -1;
696 FILE *fp = NULL;
697 fp = fopen(FOTA_REBOOT_FLAG,"r");
698 if(fp == NULL)
l.yang7d7b51c2023-08-04 17:02:48 +0800699 {
l.yangf8e8cf22024-01-25 15:10:22 +0800700 LYERRLOG("Open reboot flag file failed");
l.yang7d7b51c2023-08-04 17:02:48 +0800701 return -1;
702 }
l.yangf8e8cf22024-01-25 15:10:22 +0800703
704 fread(&reboot_flag,sizeof(int),1,fp);
705 fclose(fp);
706
707 //get upgrade status before no reboot
708 if(reboot_flag == NO_REBOOT)
709 {
710
711 ret = zxic_dual_get_upgrade_status(&status);
712 if(ret < 0)
713 {
714 LYERRLOG("Get upgrade status fail! ");
715 return -1;
716 }
l.yang7d7b51c2023-08-04 17:02:48 +0800717
l.yangf8e8cf22024-01-25 15:10:22 +0800718 LYINFLOG("Current upgrade info: ");
719 LYINFLOG("Current upgrade status:%d ", status.upgrade_status);
720 LYINFLOG("Current upgrade total size:%d ", status.total_size);
721 LYINFLOG("Current upgrade updated size:%d ", status.upgraded_size);
722
723 return status.upgrade_status;
724 }
725 else
726 {
727 //get sync status
728 int fota_sync_tatus = 0;
729 fota_sync_tatus = lynq_get_sync_status();
730 if(fota_sync_tatus == ZXIC_SYNCHRONIZING)
731 {
732 LYINFLOG("Now fota upgrade sync status is synchronizing");
733 return LYNQ_SYNNCHRONIZING;
734 }
735 else if(fota_sync_tatus == ZXIC_SYNC_SUCCESS)
736 {
737 LYINFLOG("Now fota upgrade sync status sync success ");
738 return LYNQ_SYNC_SUCCESS;
739 }
l.yang04a9e9c2024-06-04 16:51:05 +0800740 else if(fota_sync_tatus == ZXIC_SYNC_FAILED)
l.yangf8e8cf22024-01-25 15:10:22 +0800741 {
742 LYERRLOG("Now fota upgrade sync status sync failed ");
743 return LYNQ_SYNC_FAILED;
744 }
745
746
747 }
l.yang7d7b51c2023-08-04 17:02:48 +0800748
749}
750
751/*****************************************
752* @brief:lynq_get_upgrade_status
753* @param count [IN]:NA
754* @param sum [OUT]:NA
755* @return :success: 0, failed:-1
756* @todo:NA
757* @see:NA
758* @warning:NA
759******************************************/
760int lynq_get_system_info()
761{
762 int ret = 0;
763 z_upgrade_system_info_t system_info;
764
765 ret = zxic_dual_get_system_status(&system_info);
766 if(ret < 0)
767 {
768 LYINFLOG("Get upgrade status fail! ");
769 return -1;
770 }
771 else
772 {
773 LYINFLOG("System info: ");
774 LYINFLOG("Boot to:0x%08X[%d] ", system_info.boot_to, system_info.boot_to);
775 LYINFLOG("Fota status:%d ", system_info.fota_status);
776 LYINFLOG("System1 system:0x%08X [%d] ", system_info.system_1.system, system_info.system_1.system);
777 LYINFLOG("System1 status:%d ", system_info.system_1.status);
778 LYINFLOG("System1 try_cnt:%d ", system_info.system_1.try_cnt);
779 LYINFLOG("System2 system:0x%08X [%d] ", system_info.system_2.system, system_info.system_2.system);
780 LYINFLOG("System2 status:%d ", system_info.system_2.status);
781 LYINFLOG("System2 try_cnt:%d ", system_info.system_2.try_cnt);
782 }
783
784 return 0;
785
786}
787
788/*****************************************
789* @brief:lynq_set_system_a_status
790* @param count [IN]:char *option_para
791* @param sum [OUT]:NA
792* @return :success: 0, failed:-1
793* @todo:NA
794* @see:NA
795* @warning:NA
796******************************************/
797int lynq_set_system_a_status(char *option_para)
798{
799 int ret = -1;
800 if (NULL == option_para)
801 {
802 LYINFLOG("Invalid option_para value ");
803 return -1;
804 }
805
806 //34650 A slot status : bootable:45527 unbootalbe:47806 success:23579
807 ret = zxic_dual_set_system_status(34650, atoi(option_para));
808 if(ret < 0)
809 {
810 LYINFLOG("Set system 1 status to [%s] error ", option_para);
811 return -1;
812 }
813
814 return 0;
815
816}
817
818/*****************************************
819* @brief:lynq_set_system_b_status
820* @param count [IN]:char *option_para
821* @param sum [OUT]:NA
822* @return :success: 0, failed:-1
823* @todo:NA
824* @see:NA
825* @warning:NA
826*****************************************/
827int lynq_set_system_b_status(char * option_para)
828{
829 int ret = -1;
830 if (NULL == option_para)
831 {
832 LYINFLOG("Invalid option_para value ");
833 return -1;
834 }
835
836 //39019 B slot status: bootable:45227 unbootalbe:47806 success:23579
837 ret = zxic_dual_set_system_status(39019, atoi(option_para));
838 if(ret < 0)
839 {
840 LYINFLOG("Set system 2 status to [%s] error ", option_para);
841 }
842
843 return 0;
844}
845
846/*****************************************
847* @brief:lynq_get_fota_status_for_nv
848* @param count [IN]:NA
849* @param sum [OUT]:NA
850* @return :success: 0, failed:-1
851* @todo:NA
852* @see:NA
853* @warning:NA
854*****************************************/
855int lynq_get_fota_status_for_nv()
856{
857 int status = 0;
858 status = zxic_dual_get_fota_status_for_nv();
859 if(status != 0)
860 {
861 LYINFLOG("Fota status:%d ", status);
862 return -1;
863 }
864 return 0;
865}
866
867/*****************************************
868* @brief:lynq_set_fota_status_for_nv
869* @param count [IN]:char *option_para
870* @param sum [OUT]:NA
871* @return :success: 0, failed:-1
872* @todo:NA
873* @see:NA
874* @warning:NA
875*****************************************/
876int lynq_set_fota_status_for_nv(char * option_para)
877{
878 int ret = 0;
879
880 if (NULL == option_para)
881 {
882 LYINFLOG("Invalid value! null option parameters! ");
883 return -1;
884 }
885
886 ret = zxic_dual_set_fota_status_for_nv(atoi(option_para));
887 if(ret < 0)
888 {
889 LYINFLOG("Set fota_status to [%s] error ", option_para);
890 }
891
892 return ret;
893}
894
895/*****************************************
896* @brief:lynq_sync_system
897* @param count [IN]:char *option_para
898* @param sum [OUT]:NA
899* @return :success: 0, failed:-1
900* @todo:NA
901* @see:NA
902* @warning:NA
903*****************************************/
904int lynq_sync_system()
905{
906 int ret = -1;
907
908 ret = zxic_dual_sync_system();
909 if( ret != 0)
910 {
911 LYINFLOG("lynq sync system failed !!!!");
912 return -1;
913 }
914
915 return 0;
916}
917
918/*****************************************
919* @brief:lynq_get_upgrade_type
920* @param count [IN]:NA
921* @param sum [OUT]:NA
922* @return :success: 0, failed:-1
923* @todo:NA
924* @see:NA
925* @warning:NA
926*****************************************/
927int lynq_get_upgrade_type()
928{
929 int upgrade_type = -1;
930
931 upgrade_type = zxic_dual_get_upgrade_type();
932 if(upgrade_type < 0)
933 {
934 LYINFLOG("Get upgrade type failed \n");
935 return -1;
936 }
937 else
938 {
939 LYINFLOG("upgrade type is %d", upgrade_type);
940 }
941 return 0;
942}
943
944/*****************************************
945* @brief:lynq_get_sync_status
946* @param count [IN]:char *option_para
947* @param sum [OUT]:NA
948* @return :success: 0, failed:-1
949* @todo:NA
950* @see:NA
951* @warning:NA
952*****************************************/
953int lynq_get_sync_status()
954{
955 int sync_status = -2;
956 zxic_dual_get_sync_status(&sync_status);
957 LYINFLOG("Current sync status is %d", sync_status);
l.yangf8e8cf22024-01-25 15:10:22 +0800958 return sync_status;
l.yang7d7b51c2023-08-04 17:02:48 +0800959}
960
961/*****************************************
962* @brief:lynq_set_sync_status
963* @param count [IN]:char *option_para
964* @param sum [OUT]:NA
965* @return :success: 0, failed:-1
966* @todo:NA
967* @see:NA
968* @warning:NA
969*****************************************/
970int lynq_set_sync_status(char * option_para)
971{
972 int ret = 0;
973
974 if (NULL == option_para)
975 {
976 LYINFLOG("Command input invalid value! null option parameters! ");
977 return -1;
978 }
979
980 ret = zxic_dual_set_sync_status(atoi(option_para));
981 if (0 != ret)
982 {
983 LYINFLOG("set sync status fail");
984 return -1;
985 }
986
987 return 0;
988}
989
l.yangf8e8cf22024-01-25 15:10:22 +0800990/*****************************************
991* @brief:lynq_read_process
992* @param count [IN]:NS
993* @param sum [OUT]:NA
994* @return :fota upgrade process 0-10
995* @todo:NA
996* @see:NA
997* @warning:NA
998*****************************************/
999int lynq_read_process(void)
1000{
1001 LYINFLOG("Enter lynq_read_process");
1002
1003 float fota_process = 0;
1004 int ration = 0;
1005 int read_count = 0;
1006 FILE *fp = NULL;
1007
1008 while(1)
1009 {
1010
1011 fp = fopen(FOTA_UPGRADE_PROCESS, "r");
1012 if(fp == NULL)
1013 {
1014 LYERRLOG("lynq_read_process open file failed");
1015 usleep(10000);
1016 read_count++;
1017 if(read_count > 5)
1018 {
1019 break;
1020 }
1021 }
1022 else
1023 {
1024 break;
1025 }
1026 }
1027
1028 if(fp != NULL)
1029 {
1030
1031 char line[256] = {0};
1032 if (fgets(line, sizeof(line), fp) != NULL)
1033 {
1034 sscanf(line, "%d,%d", &total_size, &upgrade_size);
1035 }
1036 fclose(fp);
1037 }
1038
1039
1040 if(total_size != 0 && upgrade_size <= total_size)
1041 {
1042 LYINFLOG("Caculate fota process ration ");
1043 fota_process = (float) upgrade_size / total_size;
1044 }
1045
1046 ration = (int)(fota_process * 10);
1047 LYINFLOG("Fota process ration is %d",ration);
1048 return ration;
1049}
1050
l.yang526ef682024-07-15 17:46:51 +08001051int calculate_md5_sum( char *md5_sum,int md5_size)
1052{
1053 FILE *fp = NULL;
1054 char package_path[256] = {0};
1055 char command[64] = {0};
1056 char *space_pos = NULL;
1057 int length = 0;
1058 char command_result[64] = {0};
1059
1060 fp = fopen(FOTA_ADDR_FILE, "rb");
1061 if(fp == NULL)
1062 {
1063 LYERRLOG("Open file failed", FOTA_ADDR_FILE);
1064 return -1;
1065 }
1066 if(fgets(package_path, sizeof(package_path), fp) == NULL)
1067 {
1068 LYERRLOG("Read file %s failed", package_path);
1069 }
1070 fclose(fp);
1071
1072 snprintf(command, sizeof(command), "md5sum %s",package_path);
1073
1074 fp = popen(command, "r");
1075 if (fp == NULL)
1076 {
1077 LYERRLOG("Failed to run command\n");
1078 return -1;
1079 }
1080 if (fgets(command_result, sizeof(command_result), fp) != NULL)
1081 {
1082
1083 space_pos = strchr(command_result, ' ');
1084 if (space_pos != NULL)
1085 {
1086 length = space_pos - command_result;
1087 if(length >= md5_size)
1088 {
1089 pclose(fp);
1090 return -1;
1091 }
1092 strncpy(md5_sum, command_result, length);
1093 md5_sum[length] = '\0';
1094 }
1095 }
1096
1097 pclose(fp);
1098
1099 return 0;
1100
1101}
1102
you.chen21c62b72023-09-08 09:41:11 +08001103DEFINE_LYNQ_LIB_LOG(LYNQ_FOTA)
l.yang7d7b51c2023-08-04 17:02:48 +08001104
1105#ifdef __cplusplus
1106}
1107#endif