[Feature][T8TSK-305][FOTA]fix fota to mergev2.0

Only Configure: No
Affected branch: master
Affected module: fota
Is it affected on both ZXIC and MTK: only MTK
Self-test: Yes
Doc Update: No

Change-Id: I5f5e9ee4a88f2febb9eafefbf9dda55a5bb41928
diff --git a/IC_src/mtk/lib/liblynq-fota/include/iot_rock.h b/IC_src/mtk/lib/liblynq-fota/include/iot_rock.h
index a6e6821..ea557b9 100755
--- a/IC_src/mtk/lib/liblynq-fota/include/iot_rock.h
+++ b/IC_src/mtk/lib/liblynq-fota/include/iot_rock.h
@@ -140,7 +140,7 @@
 

 

 int iot_patch(IOT_UPDATA_CONTEXT* update_ctx);

-

+int lynq_read_process(void);

 unsigned int iot_hash(unsigned char *buf,unsigned int len, unsigned int* value);

 int lynq_md5_file_verfy(char* filePath, char* file_md5);

 //xf.li@20230822 add for ab recover start

diff --git a/IC_src/mtk/lib/liblynq-fota/rock_ua/rock_ua.c b/IC_src/mtk/lib/liblynq-fota/rock_ua/rock_ua.c
index e65becb..d510633 100755
--- a/IC_src/mtk/lib/liblynq-fota/rock_ua/rock_ua.c
+++ b/IC_src/mtk/lib/liblynq-fota/rock_ua/rock_ua.c
@@ -38,20 +38,9 @@
 #define ROCK_BACKUP_LEN ROCK_DEFAULT_BLOCK_SIZE
 
 
-
 #define FILENAME_SIZE   50
 
 
-
-//#define DEV_DELTA       "/dev/disk/by-partlabel/delta"
-#if 0
-#define DEV_DELTA       "/dev/disk/by-partlabel/delta"
-#else
-#define DEV_DELTA       "/dev/mtd41"    
-#endif
-
-
-
 char partition_filename_a[][FILENAME_SIZE] = {
     {"/dev/disk/by-partlabel/system_a"},
     {"/dev/disk/by-partlabel/boot_a"},
@@ -63,15 +52,15 @@
     {"/dev/disk/by-partlabel/oemapp2_a"},
     {"/dev/disk/by-partlabel/medmcu_a"},
     {"/dev/disk/by-partlabel/spm_a"},
-    {"/dev/disk/by-partlabel/protect_a"},    
+    {"/dev/disk/by-partlabel/protect_a"},
     {"/dev/disk/by-partlabel/mcf1_a"},
     {"/dev/disk/by-partlabel/mcf2_a"},
     {"/dev/disk/by-partlabel/mcupm_a"},
-    {"/dev/disk/by-partlabel/sspm_a"},    
+    {"/dev/disk/by-partlabel/sspm_a"},
     {"/dev/disk/by-partlabel/dpm_a"},
-    {"/dev/disk/by-partlabel/pi_img_a"},    
+    {"/dev/disk/by-partlabel/pi_img_a"},
     {"/dev/disk/by-partlabel/hsm_os_a"},
-    {"/dev/disk/by-partlabel/bl2_a"},    
+    {"/dev/disk/by-partlabel/bl2_a"},
     {"/dev/disk/by-partlabel/bl33_a"}
 };
 
@@ -85,17 +74,17 @@
     {"/dev/disk/by-partlabel/vbmeta_b"},
     {"/dev/disk/by-partlabel/oemapp_b"},
     {"/dev/disk/by-partlabel/oemapp2_b"},
-    {"/dev/disk/by-partlabel/medmcu_b"},    
+    {"/dev/disk/by-partlabel/medmcu_b"},
     {"/dev/disk/by-partlabel/spm_b"},
     {"/dev/disk/by-partlabel/protect_b"},
     {"/dev/disk/by-partlabel/mcf1_b"},
     {"/dev/disk/by-partlabel/mcf2_b"},
     {"/dev/disk/by-partlabel/mcupm_b"},
-    {"/dev/disk/by-partlabel/sspm_b"},    
+    {"/dev/disk/by-partlabel/sspm_b"},
     {"/dev/disk/by-partlabel/dpm_b"},
     {"/dev/disk/by-partlabel/pi_img_b"},
     {"/dev/disk/by-partlabel/hsm_os_b"},
-    {"/dev/disk/by-partlabel/bl2_b"},    
+    {"/dev/disk/by-partlabel/bl2_b"},
     {"/dev/disk/by-partlabel/bl33_b"}
 };
 
@@ -209,6 +198,7 @@
 static unsigned int  now_patch = 0;
 unsigned int  current_slot = 0;
 unsigned char rock_debug_buffer[512];
+char g_delta_mtd[16];
 
 
 
@@ -306,6 +296,23 @@
     close(fd_fota_status);
 }
 
+int lynq_read_process(void)
+{
+    int err;
+    fd_fota_status = open(FILE_FOTA_STATE,O_RDWR | O_CREAT,0777);
+
+    if (fd_fota_status < 0) {
+        err = errno;
+        RLOGD("+[UA]: save_fota_status: Error opening metadata file: %s\n",strerror(errno));
+        return -err;
+    }
+    memset(&fota_status, 0 , sizeof(fota_status));
+    read(fd_fota_status, &fota_status,sizeof(fota_status));
+    sync();
+    close(fd_fota_status);
+    return fota_status.ota_run;
+}
+
 static int save_fota_info()
 {
     int err;
@@ -343,12 +350,10 @@
 }
 
 int rock_process_block(void* ctx, unsigned char* data, unsigned int start, unsigned int size){
-    //rock_trace(ctx, "rock update progress block %d\n", size);
 
     int writen = 0;
     int ret,err;
-    
-    
+
     if (start == BACKUP_ADDR_FLAG) {
         int fd_backup = open(FILE_BACKUP,O_RDWR | O_CREAT,0777);
         while (writen < size) {
@@ -359,16 +364,14 @@
         close(fd_backup);
         return size;
     }
-    
-    
-    
+
     writen = 0;
    
     if (mtk_device_wrap_seek(fd_write, start, SEEK_SET) < 0) {
         err = errno;
         rock_trace(ctx, "mtk_device_wrap_seek write\n");
         return err;
-    } 
+    }
 
     while (writen < size) {
         ret = mtk_device_wrap_write(fd_write,data+writen, ROCK_DEFAULT_BLOCK_SIZE);
@@ -461,7 +464,7 @@
     } while(size > 0);
 
 
-    return ret;    
+    return ret;
    
     
 }
@@ -470,8 +473,7 @@
 int rock_read_delta(void* ctx, unsigned char* dest, unsigned int offset, unsigned int size){
 
     int ret = 0,err = 0;
-    
-    
+
     if (lseek(fd_delta, offset + delta_offset, SEEK_SET) < 0) {
         err = -errno;
         rock_trace(ctx, "mtk_device_wrap_seek df_delta err\n");
@@ -512,12 +514,68 @@
 int rock_delete_file(void* ctx, void* name){return 0;}
 /* ROCK IPL end */
 
+void delete_enter(char data[])
+{
+    char *find = strchr(data, ':');
+    if(find)
+        *find = '\0';
+    return ;
+}
+
+void get_delta_mtd(char *delta_mtd)
+{
+    FILE *fp;
+    char mtd_buffer[8];
+    fp = popen("cat /proc/mtd|grep delta|awk '{print $1}'","r");
+    fgets(mtd_buffer, sizeof(mtd_buffer), fp);
+    delete_enter(mtd_buffer);
+    sprintf(delta_mtd,"/dev/%s", mtd_buffer);
+    RLOGD("delta_mtd:%s\n", delta_mtd);
+    pclose(fp);
+    return;
+}
+
+int get_file_size(void)
+{
+    FILE *stream;
+    stream = fopen("/tmp/fota.delta", "r");
+    long file_size = -1;
+    long cur_offset = ftell(stream);
+    if (cur_offset == -1)
+    {
+        printf("ftell failed :%s\n", strerror(errno));
+        return -1;
+    }
+    if (fseek(stream, 0, SEEK_END) != 0)
+    {
+        printf("fseek failed: %s\n", strerror(errno));
+        return -1;
+    }
+    file_size = ftell(stream);
+    if (file_size == -1)
+    {
+        printf("ftell failed :%s\n", strerror(errno));
+    }
+    if (fseek(stream, cur_offset, SEEK_SET) != 0)
+    {
+        printf("fseek failed: %s\n", strerror(errno));
+        return -1;
+    }
+    fclose(stream);
+    if(file_size >52428800)
+    {
+        return -1;
+    }
+    return 0;
+}
 
 
 static int init_dev_fd()
 {
 
     int err;
+    int ret;
+    int result;
     char lynq_fota_addr[64] = {0};
     char fota_name[]= "fota.delta";
     int n;
@@ -526,6 +584,29 @@
         return E_ROCK_FOTA_ADDR;
     }
     RLOGD("+[UA]: get fota pack addr: %s\n",lynq_fota_addr);
+    if(!(strcmp(lynq_fota_addr, "/tmp/fota.delta")))
+    {
+        ret = get_file_size();
+        if(ret != 0)
+        {
+            RLOGD("the delta size over 50M\n");
+            return -1;
+        }
+        get_delta_mtd(g_delta_mtd);
+        result = test_write_delta(lynq_fota_addr, g_delta_mtd);
+        if(result != 0)
+        {
+            RLOGD("fota.delta write into mtd fail !\n");
+        }
+        strcpy(lynq_fota_addr, g_delta_mtd);
+    }
+    if(lynq_fota_set_addr_value(lynq_fota_addr,strlen(lynq_fota_addr)))
+    {
+            RLOGD("set addr fail\n");
+            return 1;
+    }
+    RLOGD("+[UA]: get fota pack addr: %s\n", lynq_fota_addr);
+
     fd_delta = open(lynq_fota_addr,O_RDWR);
 
     if (fd_delta < 0) {
@@ -570,9 +651,9 @@
 int test_write_delta(char *source, char *target)
 {
     int fd_source,fd_target,size;
-     
+    char buf[32];
     char delta_data[ROCK_DEFAULT_BLOCK_SIZE];
-     
+    char lynq_fota_addr[64];
     fd_source = open(source,O_RDONLY);
      
     if (fd_source < 0) {
@@ -588,7 +669,12 @@
         RLOGD("+[UA]: open target  error\n");
         return 1;
     } 
-    
+
+    if(!(strcmp(lynq_fota_addr, g_delta_mtd)))
+    {
+        sprintf(buf,"flash_eraseall %s", g_delta_mtd);
+        system(buf);
+    }
     while(( size = read(fd_source,delta_data,ROCK_DEFAULT_BLOCK_SIZE))>0) {
            mtk_device_wrap_write(fd_target,delta_data,ROCK_DEFAULT_BLOCK_SIZE);
     }
@@ -602,7 +688,7 @@
 int nand_copyto_nand(char *source, char *target)
 {
     int fd_source,fd_target,size;
-     
+
     char delta_data[ROCK_DEFAULT_BLOCK_SIZE];
      
     fd_source = mtk_device_wrap_open(source,O_RDONLY);
@@ -828,7 +914,7 @@
     ctx.ram_len = ROCK_RAM_LEN;
     ctx.backup_base = BACKUP_ADDR_FLAG;
     //ctx.backup_len = ROCK_DEFAULT_BLOCK_SIZE;
-    ctx.backup_len = 0;        
+    ctx.backup_len = 0;
     ctx.update_nvram = 0;
     ctx.read_rom_directly = read_rom_directly;
     //ctx.first_run = first_run;
@@ -845,7 +931,7 @@
     memset(&fota_status,0,sizeof(fota_status));
     RLOGD("+[UA]: up_info.ota_run = %d\n",up_info.ota_run);
 
-#if 0    
+#if 0
     if ((up_info.ota_run>PATCH_BL33)||(up_info.ota_run<PATCH_SYSTEM))
     {
         up_info.ota_run = 0;
@@ -870,10 +956,6 @@
     
     RLOGD("+[UA]: up_info.fota_flag = %s\n",up_info.fota_flag);
     RLOGD("+[UA]: update_mode = %d\n",update_mode);
-    
-    //memset(&da_head, 0, sizeof(da_head));
-
-    //read(fd_delta, (unsigned char*)&da_head, sizeof(da_head));
 
     memset(&delta_head, 0, sizeof(delta_head));
     read(fd_delta, (char *)&delta_head[0], sizeof(delta_head));
@@ -885,12 +967,10 @@
         if (delta_head[i] > 0) {
             fota_status.update_status[i].need_update = 1;
             delta_size+=delta_head[i];
-            
         }
-        RLOGD("+[UA]: %s,delta size = %d\n",partition_filename[i],delta_head[i]);    
+        RLOGD("+[UA]: %s,delta size = %d, i=%d\n",partition_filename[i],delta_head[i], i);
     }
-    
-    
+
     for(i = MAX_OTA_ROLE/2;i<(MAX_OTA_ROLE/2+REAL_OTA_ROLE); i++) {
         if (delta_head[i] > 0) {
             fota_status.update_status[i].need_update = 1;
@@ -928,13 +1008,6 @@
     fota_status.switch_slot = WAIT;
     save_fota_status();
 
-    //delta_size = da_head.sys + da_head.boot + da_head.tee + da_head.md1img + da_head.md1dsp + da_head.vbmeta + da_head.oemapp + da_head.oemapp2 + da_head.medmcu+da_head.bl33;
-    
-    //sha_size = da_head.full_sys + da_head.full_boot + da_head.full_tee + da_head.full_md1img + da_head.full_md1dsp + da_head.full_vbmeta + da_head.full_oemapp + da_head.full_oemapp2 + da_head.full_medmcu+da_head.full_bl33
-
-
-
-
     is_need_fullupdate = 0;
     if(sha_size>0) {
         is_need_fullupdate = 1;
@@ -958,7 +1031,7 @@
     RLOGD("+[UA]: delta calc sha = %s\n",str_sha);
     
     if(memcmp(digest_s,digest_t,SHA_DIGEST_SIZE)==0) {
-    
+
         RLOGD("sha verify pass\n");
     
     }else{
@@ -966,9 +1039,8 @@
         
         system("echo fota-interface >/sys/power/wake_unlock");
         return -1;
-    
     }
-    
+
     memset(digest_s,0,SHA_DIGEST_SIZE);
     memset(digest_t,0,SHA_DIGEST_SIZE);
     
@@ -1021,7 +1093,7 @@
             }            
             if(current_slot==SLOT_B){
                 fd_read  = fd_partition_b;
-                fd_write = fd_partition_a;    
+                fd_write = fd_partition_a;
             } else {
                 fd_read  = fd_partition_a;
                 fd_write = fd_partition_b;
@@ -1088,7 +1160,7 @@
                 return status;
             }
                 mtk_device_wrap_close(fd_read);
-                mtk_device_wrap_close(fd_write);        
+                mtk_device_wrap_close(fd_write);
         
         }
     
@@ -1766,28 +1838,39 @@
 {
     FILE *fp;
     char check_result[64];
+    int ret;
     if(strcmp(name, "oemapp") == 0)
     {
         RLOGD("lynq_check_oemapp oemapp");
-        if(system("df -lh|grep oemapp |grep -v oemapp2") != 0)
+        ret = system("cat /proc/mtd|grep oemapp");
+        if(ret != 0)
         {
             return 0;
         }
+        if(system("df -lh|grep oemapp |grep -v oemapp2") != 0)
+        {
+            return -1;
+        }
         else
         {
-            return 1;
+            return 0;
         }
     }
     else if(strcmp(name, "oemapp2") == 0)
     {
         RLOGD("lynq_check_oemapp oemapp2");
-        if(system("df -lh|grep oemapp2") != 0)
+        ret = system("cat /proc/mtd|grep oemapp2");
+        if(ret != 0)
         {
             return 0;
         }
+        if(system("df -lh|grep oemapp2") != 0)
+        {
+            return -1;
+        }
         else
         {
-            return 1;
+            return 0;
         }
     }
 }
@@ -1839,8 +1922,7 @@
     close(fd);
 
     RLOGD("[+UP]: lynq_up_info.ota_run=%d\n",lynq_up_info.ota_run);
-	/*
-    if((lynq_check_oemapp("oemapp") == 0) || (lynq_check_oemapp("oemapp2") == 0))
+    if((lynq_check_oemapp("oemapp") != 0) || (lynq_check_oemapp("oemapp2") != 0))
     {
         RLOGD("ENTER LYNQ_CHECK_OEMAPP\n");
         system("echo mode 001 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio");
@@ -1859,7 +1941,6 @@
         sleep(5);
         reboot_device();
     }
-	*/
 
 
     if(lynq_up_info.ota_run != 0)