Merge "[Feature][T8TSK-183][VERSION]Update software version LYNQ_SW_VERSION:T800MLD_DB2_v02.MP1_MR3.01b21.07.07 to T800MLD_DB2_v02.MP1_MR3.01b21.07.08" into ZK-first-oem-release
diff --git a/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-fota/rock_ua/rock_ua.c b/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-fota/rock_ua/rock_ua.c
index 8fae757..c5af602 100755
--- a/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-fota/rock_ua/rock_ua.c
+++ b/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-fota/rock_ua/rock_ua.c
@@ -199,7 +199,7 @@
 unsigned int  current_slot = 0;
 unsigned char rock_debug_buffer[512];
 char g_delta_mtd[16];
-
+int g_addr_flag = 0;
 
 
 OTA_STATUS  fota_status;
@@ -473,34 +473,68 @@
 
     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");
-        return err;
-    }
-
-    do {
-
-        ret = read(fd_delta, dest, size);
-
-        if (ret == 0) {
-            break;
-        } else if (ret < 0) {
-            if (errno == EINTR) {
-                continue;
-            }
+    if(g_addr_flag == 1)
+    {
+        if (mtk_device_wrap_seek(fd_delta, offset + delta_offset, SEEK_SET) < 0) {
             err = -errno;
-            rock_trace(ctx," Error reading metadata file\n");
-
-            close(fd_delta);
-
+            rock_trace(ctx, "mtk_device_wrap_seek df_delta err\n");
             return err;
         }
-        size -= ret;
-        dest += ret;
-    } while(size > 0);
 
-    return ret;    
+        do {
+
+            ret = mtk_device_wrap_read(fd_delta, dest, size);
+
+            if (ret == 0)
+            {
+                break;
+            }
+            else if (ret < 0)
+            {
+                if (errno == EINTR)
+                {
+                    continue;
+                }
+                err = -errno;
+                rock_trace(ctx," Error reading metadata file\n");
+                mtk_device_wrap_close(fd_delta);
+                return err;
+            }
+            size -= ret;
+            dest += ret;
+        } while(size > 0);
+    }
+    else
+    {
+        if (lseek(fd_delta, offset + delta_offset, SEEK_SET) < 0)
+        {
+            err = -errno;
+            rock_trace(ctx, "mtk_device_wrap_seek df_delta err\n");
+            return err;
+        }
+        do {
+            ret = read(fd_delta, dest, size);
+            if (ret == 0)
+            {
+                break;
+            }
+            else if (ret < 0)
+            {
+                if (errno == EINTR)
+                {
+                    continue;
+                }
+                err = -errno;
+                rock_trace(ctx," Error reading metadata file\n");
+                close(fd_delta);
+                return err;
+            }
+            size -= ret;
+            dest += ret;
+        } while(size > 0);
+    }
+
+    return ret;
 
 }
 
@@ -583,6 +617,7 @@
         return E_ROCK_FOTA_ADDR;
     }
     RLOGD("+[UA]: get fota pack addr: %s\n",lynq_fota_addr);
+    get_delta_mtd(g_delta_mtd);
     if(!(strcmp(lynq_fota_addr, "/tmp/fota.delta")))
     {
         ret = get_file_size();
@@ -591,33 +626,60 @@
             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)))
-    {
+        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 = mtk_device_wrap_open(lynq_fota_addr,O_RDWR);
+
+        if (fd_delta < 0) {
+            err = errno;
+            RLOGD("+[UA]: Error opening fota file: %s\n",strerror(errno));
+            mtk_device_wrap_close(fd_delta);
+            return -err;
+        }
+        g_addr_flag = 1;
+
     }
-    RLOGD("+[UA]: get fota pack addr: %s\n", lynq_fota_addr);
+    else if(!(strcmp(lynq_fota_addr, g_delta_mtd)))
+    {
+        fd_delta = mtk_device_wrap_open(lynq_fota_addr,O_RDWR);
 
-    fd_delta = open(lynq_fota_addr,O_RDWR);
+        if (fd_delta < 0) {
+            err = errno;
+            RLOGD("+[UA]: Error opening fota file: %s\n",strerror(errno));
+            mtk_device_wrap_close(fd_delta);
+            return -err;
+        }
+        g_addr_flag = 1;
+    }
+    else
+    {
+        fd_delta = open(lynq_fota_addr,O_RDWR);
 
-    if (fd_delta < 0) {
-        err = errno;
-        RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-        return -err;
+        if (fd_delta < 0) {
+            err = errno;
+            RLOGD("+[UA]: Error opening fota file: %s\n",strerror(errno));
+            close(fd_delta);
+            return -err;
+        }
+        g_addr_flag = 0;
+
     }
 
     fd_update_status = open(FILE_UPDATE_STATE,O_RDWR | O_CREAT,0777);
     if (fd_update_status < 0) {
         err = errno;
         RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+        close(fd_update_status);
         return -err;
     }
     memset(&up_info, 0, sizeof(up_info));
@@ -723,41 +785,80 @@
     int err;
 
 
-    if (lseek(fd_delta, start, SEEK_SET) < 0) {
-        LYERRLOG("+[UA]: delta_copyto_nand seek err\n");
-        return -1;
-    }
- 
-     if (mtk_device_wrap_seek(fd_curr, 0, SEEK_SET) < 0) {
-        LYERRLOG("+[UA]: delta_copyto_nand seek err\n");
-        return -1;
-    }
- 
- 
-    do {
-        memset(delta_data,0,NAND_PAGE_SIZE);
-        ret = read(fd_delta, delta_data, NAND_PAGE_SIZE);
-
-        if (ret == 0) {
-            break;
-        } else if (ret < 0) {
-            if (errno == EINTR) {
-                continue;
-            }
-            err = -errno;
-
-            return err;
+    if(g_addr_flag == 1)
+    {
+        if (mtk_device_wrap_seek(fd_delta, start, SEEK_SET) < 0)
+        {
+            LYERRLOG("+[UA]: delta_copyto_nand seek err\n");
+            return -1;
         }
-  
-        size -= NAND_PAGE_SIZE;
-        mtk_device_wrap_write(fd_curr,delta_data,NAND_PAGE_SIZE);
-        //mtk_device_wrap_write(fd_curr,delta_data,ret);
 
-    } while(size > 0);
-  
- 
- return 0;
- 
+        if (mtk_device_wrap_seek(fd_curr, 0, SEEK_SET) < 0)
+        {
+            LYERRLOG("+[UA]: delta_copyto_nand seek err\n");
+            return -1;
+        }
+
+        do {
+            memset(delta_data,0,NAND_PAGE_SIZE);
+            ret = mtk_device_wrap_read(fd_delta, delta_data, NAND_PAGE_SIZE);
+
+            if (ret == 0)
+            {
+                break;
+            }
+            else if (ret < 0)
+            {
+                if (errno == EINTR)
+                {
+                    continue;
+                }
+                err = -errno;
+                return err;
+            }
+            size -= NAND_PAGE_SIZE;
+            mtk_device_wrap_write(fd_curr,delta_data,NAND_PAGE_SIZE);
+            //mtk_device_wrap_write(fd_curr,delta_data,ret);
+        } while(size > 0);
+
+    }
+    else
+    {
+        if (lseek(fd_delta, start, SEEK_SET) < 0) {
+            LYERRLOG("+[UA]: delta_copyto_nand seek err\n");
+            return -1;
+        }
+
+        if (mtk_device_wrap_seek(fd_curr, 0, SEEK_SET) < 0) {
+            LYERRLOG("+[UA]: delta_copyto_nand seek err\n");
+            return -1;
+        }
+
+        do {
+            memset(delta_data,0,NAND_PAGE_SIZE);
+            ret = read(fd_delta, delta_data, NAND_PAGE_SIZE);
+
+            if (ret == 0)
+            {
+                break;
+            }
+            else if (ret < 0)
+            {
+                if (errno == EINTR)
+                {
+                    continue;
+                }
+                err = -errno;
+                return err;
+            }
+            size -= NAND_PAGE_SIZE;
+            mtk_device_wrap_write(fd_curr,delta_data,NAND_PAGE_SIZE);
+            //mtk_device_wrap_write(fd_curr,delta_data,ret);
+
+        } while(size > 0);
+    }
+
+    return 0;
 }
 
 
@@ -957,7 +1058,14 @@
     RLOGD("+[UA]: update_mode = %d\n",update_mode);
 
     memset(&delta_head, 0, sizeof(delta_head));
-    read(fd_delta, (char *)&delta_head[0], sizeof(delta_head));
+    if(g_addr_flag == 1)
+    {
+        mtk_device_wrap_read(fd_delta, (char *)&delta_head[0], sizeof(delta_head));
+    }
+    else
+    {
+        read(fd_delta, (char *)&delta_head[0], sizeof(delta_head));
+    }
 
 
     delta_size = 0;
@@ -1018,13 +1126,27 @@
     memset(digest_s,0,SHA_DIGEST_SIZE);
     memset(digest_t,0,SHA_DIGEST_SIZE);
     memset(str_sha,0,40);
-    
-    lseek(fd_delta, sha_size + sizeof(delta_head), SEEK_SET);
-    read(fd_delta, digest_s, SHA_DIGEST_SIZE);
+    if(g_addr_flag == 1)
+    {
+        mtk_device_wrap_seek(fd_delta, sha_size + sizeof(delta_head), SEEK_SET);
+        mtk_device_wrap_read(fd_delta, digest_s, SHA_DIGEST_SIZE);
+    }
+    else
+    {
+        lseek(fd_delta, sha_size + sizeof(delta_head), SEEK_SET);
+        read(fd_delta, digest_s, SHA_DIGEST_SIZE);
+    }
+
     convert_hex(digest_s,str_sha);
     RLOGD("+[UA]: delta save sha = %s\n",str_sha);
-    
-    ROCK_SHA_FILE_COMMON(fd_delta,sizeof(delta_head),sha_size,digest_t);
+    if(g_addr_flag == 1)
+    {
+        ROCK_SHA_FILE(fd_delta,sizeof(delta_head),sha_size,digest_t);
+    }
+    else
+    {
+        ROCK_SHA_FILE_COMMON(fd_delta,sizeof(delta_head),sha_size,digest_t);
+    }
     memset(str_sha,0,40);
     convert_hex(digest_t,str_sha);
     RLOGD("+[UA]: delta calc sha = %s\n",str_sha);
@@ -1175,15 +1297,30 @@
         fota_status.switch_slot = WAIT;
         save_fota_status();
         
-        if (lseek(fd_delta, DELTA_HEARD_SIZE + delta_size, SEEK_SET) < 0) {
-            err = errno;
-            RLOGD("+[UA]: mtk_device_wrap_seek df_delta err\n");
-            system("echo fota-interface >/sys/power/wake_unlock");
-            return -1;
+        if (g_addr_flag == 1)
+        {
+            if (mtk_device_wrap_seek(fd_delta, DELTA_HEARD_SIZE + delta_size, SEEK_SET) < 0)
+            {
+                err = errno;
+                RLOGD("+[UA]: mtk_device_wrap_seek df_delta err\n");
+                system("echo fota-interface >/sys/power/wake_unlock");
+                return -1;
+            }
+            mtk_device_wrap_read(fd_delta, full_header, DELTA_FULL_HEARD_SIZE);
         }
+        else
+        {
+		
+            if (lseek(fd_delta, DELTA_HEARD_SIZE + delta_size, SEEK_SET) < 0)
+            {
+                err = errno;
+                RLOGD("+[UA]: mtk_device_wrap_seek df_delta err\n");
+                system("echo fota-interface >/sys/power/wake_unlock");
+                return -1;
+            }
+            read(fd_delta, full_header, DELTA_FULL_HEARD_SIZE);
         
-        read(fd_delta, full_header, DELTA_FULL_HEARD_SIZE);
-        
+	}
 
         if (memcmp(full_header, "full-ota", DELTA_FULL_HEARD_SIZE) != 0) {
             RLOGD("+[UA]: invalid full delta header\r\n");
@@ -1256,8 +1393,14 @@
             RLOGD("+[UA]: Start upgrading %s full.\n",partition_filename[i-MAX_OTA_ROLE/2]);
             do{
                 status = delta_copyto_nand(delta_offset,delta_head[i]);
-
-                ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,delta_head[i],digest_s);
+                if(g_addr_flag == 1)
+                {
+                    ROCK_SHA_FILE(fd_delta,delta_offset,delta_head[i],digest_s);
+                }
+                else
+                {
+                    ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,delta_head[i],digest_s);
+                }
                 ROCK_SHA_FILE(fd_curr,0,delta_head[i],digest_t);
                 retry_cnt++;
             }while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
@@ -1536,8 +1679,8 @@
     int sleep_count = 0;
     char cmd_erase_target[128] = {0};
     int retry = MD5_RETRY_TIME;
-	unsigned char source_md5[MD5_READ_BUFFER_LEN] = {0};
-	char delta_data[ROCK_DEFAULT_BLOCK_SIZE];
+    unsigned char source_md5[MD5_READ_BUFFER_LEN] = {0};
+    char delta_data[ROCK_DEFAULT_BLOCK_SIZE];
     //caclculate source md5 start
     if(strcmp(source, DEV_SYSTEM_A) == 0 || strcmp(source, DEV_SYSTEM_B) == 0)
     {
@@ -1630,7 +1773,7 @@
         release_wake_lock("ab_recover");//unlock
         RLOGD("+[UA]: copy end\n");
         mtk_device_wrap_close(fd_target);
-	    mtk_device_wrap_close(fd_source);
+        mtk_device_wrap_close(fd_source);
         if(ret < 0)
         {
             RLOGD("+[UA]: ret < 0\n");
@@ -1650,7 +1793,7 @@
     {
         RLOGD("+[UA]: md5_file_verfy FAIL!!!\n");
     }
-	return ret;
+    return ret;
 }
 //xf.li@20230401 add for ab rollback end