[Bugfix][API-1103][FOTA]medmcu and bl33 fota upgrade

Change-Id: I7e92c81d38dd115f1dcd07b6d16f048fd46c636b
diff --git a/src/lynq/lib/liblynq-fota/include/iot_rock.h b/src/lynq/lib/liblynq-fota/include/iot_rock.h
index aa7236d..e757a42 100755
--- a/src/lynq/lib/liblynq-fota/include/iot_rock.h
+++ b/src/lynq/lib/liblynq-fota/include/iot_rock.h
@@ -28,18 +28,22 @@
 #define PATCH_VBMETA   (6)

 #define PATCH_OEMAPP   (7)

 #define PATCH_OEMAPP2  (8)

-#define PATCH_BL33     (9)

-#define FULL_SYSTEM    (10)

-#define FULL_BOOT      (11)

-#define FULL_TEE       (12)

-#define FULL_MD1IMG    (13)

-#define FULL_MD1DSP    (14) 

-#define FULL_VBMETA    (15)

-#define FULL_OEMAPP    (16)

-#define FULL_OEMAPP2   (17)

-#define FULL_BL33      (18)

+#define PATCH_MEDMCU   (9)

+#define PATCH_BL33     (10)

+#define PATCH_RESERVE  (11)

+#define FULL_SYSTEM    (12)

+#define FULL_BOOT      (13)

+#define FULL_TEE       (14)

+#define FULL_MD1IMG    (15)

+#define FULL_MD1DSP    (16) 

+#define FULL_VBMETA    (17)

+#define FULL_OEMAPP    (18)

+#define FULL_OEMAPP2   (19)

+#define FULL_MEDMCU    (20)

+#define FULL_BL33      (21)

+#define FULL_RESERVE   (22)

 

-#define MAX_OTA_ROLE   (18) 

+#define MAX_OTA_ROLE   (22) 

 

 

 

@@ -76,7 +80,9 @@
     unsigned int vbmeta;   //vbmeta   差分包大小	

     unsigned int oemapp;

     unsigned int oemapp2;

+    unsigned int medmcu;	

     unsigned int bl33;	//bl33   差分包大小

+	unsigned int reserve;

 	unsigned int full_sys;	//system 整包大小

 	unsigned int full_boot;	//boot   

     unsigned int full_tee;	//tee    整包大小

@@ -85,7 +91,9 @@
 	unsigned int full_vbmeta;	//vbmeta  整包大小

     unsigned int full_oemapp;

     unsigned int full_oemapp2;

+    unsigned int full_medmcu;	

     unsigned int full_bl33;	//bl33   整包大小

+	unsigned int full_reserve;	

 } DELTA_HEAD;

 

 typedef struct {

@@ -121,7 +129,7 @@
 

 //#define DELTA_HEARD_SIZE	(4*5)

 

-#define DELTA_HEARD_SIZE	    (4*9 + 4*9)

+#define DELTA_HEARD_SIZE	    (4*11 + 4*11)

 #define DELTA_FULL_HEARD_SIZE   8

 

 

@@ -130,7 +138,6 @@
 

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

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

-//int md5_file_verfy_new(char* filePath, char* file_md5,int packe_len);

 int lynq_rock_main(int first_run);

 int lynq_fota_func(void);

 int lynq_nand_open(const char *pathname, int flags);

diff --git a/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c b/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c
index a22752c..4106d5c 100755
--- a/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c
+++ b/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c
@@ -68,6 +68,12 @@
 #define DEV_MISC        "/dev/disk/by-partlabel/misc"
 
 
+#define DEV_MEDMCU_A       "/dev/mtd32"
+#define DEV_MEDMCU_B       "/dev/mtd33"
+
+#define DEV_BL33_A       "/dev/disk/by-partlabel/bl33_a"
+#define DEV_BL33_B       "/dev/disk/by-partlabel/bl33_b" 
+
 
 //#define DEV_DELTA       "/dev/disk/by-partlabel/delta"
 #if 0
@@ -98,7 +104,7 @@
 
 
 
-int fd_system_a,fd_system_b,fd_boot_a,fd_boot_b,fd_tee_a,fd_tee_b,fd_bl2,fd_bl33,fd_delta,fd_curr,fd_log,fd_update_status,fd_md1img_a,fd_md1img_b,fd_fota_status,fd_md1dsp_a,fd_md1dsp_b,fd_vbmeta_a,fd_vbmeta_b,fd_oemapp_a,fd_oemapp_b,fd_oemapp2_a,fd_oemapp2_b;
+int fd_system_a,fd_system_b,fd_boot_a,fd_boot_b,fd_tee_a,fd_tee_b,fd_bl2,fd_bl33,fd_delta,fd_curr,fd_log,fd_update_status,fd_md1img_a,fd_md1img_b,fd_fota_status,fd_md1dsp_a,fd_md1dsp_b,fd_vbmeta_a,fd_vbmeta_b,fd_oemapp_a,fd_oemapp_b,fd_oemapp2_a,fd_oemapp2_b,fd_medmcu_a,fd_medmcu_b,fd_bl33_a,fd_bl33_b;
 int fd_write,fd_read;
 
 static unsigned int  delta_offset = 0;
@@ -118,6 +124,27 @@
 static void lynq_fota_grab_artial_wake_lock(void);
 static void lynq_fota_release_wake_lock(void);
 
+
+static const char hex_chars[] = "0123456789abcdef";  
+
+   
+void convert_hex(unsigned char *sha, unsigned char *shastr)  
+{  
+    int i;  
+    int j = 0;  
+    unsigned int c;  
+   
+    for (i = 0; i < 20; i++) {  
+        c = (sha[i] >> 4) & 0x0f;  
+        shastr[j++] = hex_chars[c];  
+        shastr[j++] = hex_chars[sha[i] & 0x0f];  
+    }  
+    shastr[40] = '\0';  
+}  
+
+
+
+
 int rock_mismatch(void* ctx, unsigned char* buf, unsigned int start, unsigned int size, 
 					        unsigned int source_hash,unsigned int target_hash) {
 
@@ -136,7 +163,7 @@
 
     
     vsnprintf(rock_debug_buffer,sizeof(rock_debug_buffer),fmt,ap);
-	LYDBGLOG("+[UA]: %s",rock_debug_buffer);
+	RLOGD("+[ROCK_TRACE]: %s",rock_debug_buffer);
 	
 
     va_end (ap);
@@ -164,14 +191,19 @@
 
 void rock_progress(void* ctx, int percent) {
 	int i = 0;
+	static int tmp_percent = -1;
     rock_trace(ctx, "rock update progress %d\n", percent);
-	if (percent > 20) {
-        i = fota_status.ota_run;
-		if (fota_status.update_status[i-1].check_delta != PASS) {
-			fota_status.update_status[i-1].check_delta = PASS;
-			fota_status.update_status[i-1].check_rom= PASS;
-			save_fota_status();
-		}
+	
+	if (tmp_percent != percent) {
+		tmp_percent = percent;
+	    if (percent > 20) {
+            i = fota_status.ota_run;
+		    if (fota_status.update_status[i-1].check_delta != PASS) {
+			    fota_status.update_status[i-1].check_delta = PASS;
+			    fota_status.update_status[i-1].check_rom= PASS;
+			    save_fota_status();
+		    }
+	    }
 	}
 }
 
@@ -470,12 +502,12 @@
 
 
 	if (lseek(fd_delta, start, SEEK_SET) < 0) {
-        LYERRLOG("+[UA]: delta_copyto_nand seek err\n");
+        RLOGD("+[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");
+        RLOGD("+[UA]: delta_copyto_nand seek err\n");
 		return -1;
     }
  
@@ -512,7 +544,9 @@
 
 
 
-static int rock_update_main(unsigned int rom_base,  unsigned int backup_base, unsigned int backup_len, int read_rom_directly, int first_run, int switch_slot_flag) {
+static int 
+    rock_update_main(unsigned int rom_base,  unsigned int backup_base, unsigned int backup_len, int read_rom_directly, int first_run, int 
+    switch_slot_flag, int reboot_flag) {
 	int status,err,start;
     int ret = 0;
 	int i = 0;
@@ -532,6 +566,9 @@
 	
 	char digest_s[SHA_DIGEST_SIZE];
 	char digest_t[SHA_DIGEST_SIZE];
+	char str_sha[40];
+	
+	int sha_size = 0;
 
 	
     hw_module = &HAL_MODULE_INFO_SYM;
@@ -646,6 +683,9 @@
 	if (da_head.oemapp2>0) {
 		fota_status.update_status[PATCH_OEMAPP2 - 1].need_update = 1;
 	}
+	if (da_head.medmcu>0) {
+		fota_status.update_status[PATCH_MEDMCU - 1].need_update = 1;
+	}	
 	if (da_head.bl33>0) {
 		fota_status.update_status[PATCH_BL33 - 1].need_update = 1;
 	}
@@ -677,11 +717,51 @@
     if (da_head.full_oemapp2>0) {
         fota_status.update_status[FULL_OEMAPP2 - 1].need_update = 1;
     }
+    if (da_head.full_medmcu>0) {
+        fota_status.update_status[FULL_MEDMCU - 1].need_update = 1;
+    }	
 	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.bl33;
+    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;
+
+    if(sha_size>0) {
+	
+	    sha_size+=8;    
+	}
+
+    sha_size+=delta_size;
+	
+	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(da_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(da_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);
+	
+	if(memcmp(digest_s,digest_t,SHA_DIGEST_SIZE)==0) {
+	
+	    RLOGD("sha verify pass\n");
+	
+	}else{
+	    RLOGD("delta sha verify fial!\n");
+		
+		lynq_fota_release_wake_lock();
+		return -1;
+	
+	}
+	
+	memset(digest_s,0,SHA_DIGEST_SIZE);
+	memset(digest_t,0,SHA_DIGEST_SIZE);
 
     if ((da_head.sys>0) && (up_info.ota_run <= PATCH_SYSTEM))
 	{
@@ -705,7 +785,7 @@
 	        fd_system_a = mtk_device_wrap_open(DEV_SYSTEM_A,O_RDWR);
             if (fd_system_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 return -err;
             }
 			fd_curr = fd_system_a;
@@ -713,7 +793,7 @@
 	        fd_system_b = mtk_device_wrap_open(DEV_SYSTEM_B,O_RDWR);
             if (fd_system_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 return -err;
             }
 			fd_curr = fd_system_b;			
@@ -1472,7 +1552,7 @@
 	        fd_oemapp_a = mtk_device_wrap_open(DEV_OEMAPP_A,O_RDWR);
             if (fd_oemapp_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -1481,7 +1561,7 @@
 	        fd_oemapp_b = mtk_device_wrap_open(DEV_OEMAPP_B,O_RDWR);
             if (fd_oemapp_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -1589,7 +1669,7 @@
 	        fd_oemapp2_a = mtk_device_wrap_open(DEV_OEMAPP2_A,O_RDWR);
             if (fd_oemapp2_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -1598,7 +1678,7 @@
 	        fd_oemapp2_b = mtk_device_wrap_open(DEV_OEMAPP2_B,O_RDWR);
             if (fd_oemapp2_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -1679,15 +1759,16 @@
 
 
     }
+	
 
-    if ((da_head.bl33>0) && (up_info.ota_run <= PATCH_BL33))
+    if ((da_head.medmcu>0) && (up_info.ota_run <= PATCH_MEDMCU))
 	{
 
-        now_patch = PATCH_BL33;
-       delta_offset = DELTA_HEARD_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;
+        now_patch = PATCH_MEDMCU;
+        delta_offset = DELTA_HEARD_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;
 
-
-		if (up_info.ota_run == PATCH_BL33) 
+		
+		if (up_info.ota_run == PATCH_MEDMCU) 
 		{
 			ctx.first_run = 0;
 
@@ -1697,58 +1778,83 @@
 
 
 
-	    fd_bl33 = mtk_device_wrap_open(DEV_BL33,O_RDWR);
-        if (fd_bl33 < 0) {
-            err = errno;
-            RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-            lynq_fota_release_wake_lock();
-            return -err;
-        }
-	    fd_curr = fd_bl33;
+		if(current_slot==SLOT_B) {
+		    system("flash_eraseall /dev/mtd32");
+		} else {
+			system("flash_eraseall /dev/mtd33");
+		}
+//        if(current_slot==SLOT_B) {
+	        fd_medmcu_a = mtk_device_wrap_open(DEV_MEDMCU_A,O_RDWR);
+            if (fd_medmcu_a < 0) {
+                err = errno;
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                lynq_fota_release_wake_lock();
+                return -err;
+            }
+//			fd_curr = fd_oemapp2_a;
+//		}else{
+	        fd_medmcu_b = mtk_device_wrap_open(DEV_MEDMCU_B,O_RDWR);
+            if (fd_medmcu_b < 0) {
+                err = errno;
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                lynq_fota_release_wake_lock();
+                return -err;
+            }
+//			fd_curr = fd_oemapp2_b;
+//		}
 
-        fota_status.ota_run = PATCH_BL33;
-        fota_status.update_status[PATCH_BL33-1].check_delta = WAIT;
-        fota_status.update_status[PATCH_BL33-1].check_rom = WAIT;
-        fota_status.update_status[PATCH_BL33-1].update_result= WAIT;
+		if(current_slot==SLOT_B){
+			fd_read  = fd_medmcu_b;
+			fd_write = fd_medmcu_a;
+		} else {
+			fd_read  = fd_medmcu_a;
+			fd_write = fd_medmcu_b;
+		}
+
+
+		fota_status.ota_run = PATCH_MEDMCU;
+        fota_status.update_status[PATCH_MEDMCU-1].check_delta = WAIT;
+		fota_status.update_status[PATCH_MEDMCU-1].check_rom = WAIT;
+		fota_status.update_status[PATCH_MEDMCU-1].update_result= WAIT;
 
 		save_fota_status();
-
-		up_info.ota_run = PATCH_BL33;
+		
+		up_info.ota_run = PATCH_MEDMCU;
 
 		lseek(fd_update_status,0,SEEK_SET);
 	    write(fd_update_status, &up_info,sizeof(up_info));
 		sync();
-		
-        RLOGD("+[UA]: Start upgrading bl33.\n");
+
+        LYVERBLOG("+[UA]: Start upgrading medmcu.\n");
         status = iot_patch(&ctx);
-		RLOGD("+[UA]: bl33 upgrade result:%d\n",status);
-        
+		LYVERBLOG("+[UA]: medmcu upgrade result:%d\n",status);
+
 		up_info.ota_run = 0;
-		
         //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_BL33-1].update_result= status; 
-        fota_status.update_result= status;
+		fota_status.update_status[PATCH_MEDMCU-1].update_result= status; 
+		fota_status.update_result= status;
+
         if((status == 0)||(status ==1))
         {
 
-            fota_status.update_status[PATCH_BL33-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_BL33-1].check_rom = PASS;
-            RLOGD("bl33 upgrade success!!!\n");
-               
+            fota_status.update_status[PATCH_MEDMCU-1].check_delta = PASS;
+		    fota_status.update_status[PATCH_MEDMCU-1].check_rom = PASS;
+
 		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_BL33-1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_BL33-1].check_rom = WAIT;
+            fota_status.update_status[PATCH_MEDMCU-1].check_delta = ERROR;
+		    fota_status.update_status[PATCH_MEDMCU-1].check_rom = WAIT;
 		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_BL33-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_BL33-1].check_rom = ERROR;
+            fota_status.update_status[PATCH_MEDMCU-1].check_delta = PASS;
+		    fota_status.update_status[PATCH_MEDMCU-1].check_rom = ERROR;
 
 		}else{
 
-			//fota_status.update_status[PATCH_BL33 -1].check_delta = PASS;
-			//fota_status.update_status[PATCH_BL33 -1].check_rom = WAIT;
+			//fota_status.update_status[PATCH_OEMAPP2 -1].check_delta = PASS;
+			//fota_status.update_status[PATCH_OEMAPP2 -1].check_rom = WAIT;
 		}
 
-		save_fota_status();		
+		save_fota_status();
+
 
 		if ((status != 0) &&(status != 1))
 		{
@@ -1759,13 +1865,139 @@
             up_info.ota_run = 0;
             lseek(fd_update_status,0,SEEK_SET);
             write(fd_update_status, &up_info,sizeof(up_info));
-            mtk_device_wrap_close(fd_curr);
             sync();
             close(fd_update_status);
+            mtk_device_wrap_close(fd_read);
+            mtk_device_wrap_close(fd_write);
             lynq_fota_release_wake_lock();
             return status;
 		}
-        mtk_device_wrap_close(fd_curr);
+        mtk_device_wrap_close(fd_read);
+		mtk_device_wrap_close(fd_write);
+
+
+    }
+
+	
+	
+	
+	
+	
+
+    if ((da_head.bl33>0) && (up_info.ota_run <= PATCH_BL33))
+	{
+
+        now_patch = PATCH_BL33;
+        delta_offset = DELTA_HEARD_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;
+
+		
+		if (up_info.ota_run == PATCH_BL33) 
+		{
+			ctx.first_run = 0;
+
+		}else{
+		    ctx.first_run = 1;
+		}
+
+
+
+		if(current_slot==SLOT_B) {
+		    system("flash_eraseall /dev/disk/by-partlabel/bl33_a");
+		} else {
+			system("flash_eraseall /dev/disk/by-partlabel/bl33_b");
+		}
+//        if(current_slot==SLOT_B) {
+	        fd_bl33_a = mtk_device_wrap_open(DEV_BL33_A,O_RDWR);
+            if (fd_bl33_a < 0) {
+                err = errno;
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                lynq_fota_release_wake_lock();
+                return -err;
+            }
+//			fd_curr = fd_oemapp2_a;
+//		}else{
+	        fd_bl33_b = mtk_device_wrap_open(DEV_BL33_B,O_RDWR);
+            if (fd_bl33_b < 0) {
+                err = errno;
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                lynq_fota_release_wake_lock();
+                return -err;
+            }
+//			fd_curr = fd_oemapp2_b;
+//		}
+
+		if(current_slot==SLOT_B){
+			fd_read  = fd_bl33_b;
+			fd_write = fd_bl33_a;
+		} else {
+			fd_read  = fd_bl33_a;
+			fd_write = fd_bl33_b;
+		}
+
+
+		fota_status.ota_run = PATCH_BL33;
+        fota_status.update_status[PATCH_BL33-1].check_delta = WAIT;
+		fota_status.update_status[PATCH_BL33-1].check_rom = WAIT;
+		fota_status.update_status[PATCH_BL33-1].update_result= WAIT;
+
+		save_fota_status();
+		
+		up_info.ota_run = PATCH_BL33;
+
+		lseek(fd_update_status,0,SEEK_SET);
+	    write(fd_update_status, &up_info,sizeof(up_info));
+		sync();
+
+        LYVERBLOG("+[UA]: Start upgrading medmcu.\n");
+        status = iot_patch(&ctx);
+		LYVERBLOG("+[UA]: medmcu upgrade result:%d\n",status);
+
+		up_info.ota_run = 0;
+        //fota_status.ota_run = 0;
+		fota_status.update_status[PATCH_BL33-1].update_result= status; 
+		fota_status.update_result= status;
+
+        if((status == 0)||(status ==1))
+        {
+
+            fota_status.update_status[PATCH_BL33-1].check_delta = PASS;
+		    fota_status.update_status[PATCH_BL33-1].check_rom = PASS;
+
+		}else if(status == E_ROCK_INVALID_DELTA) {
+            fota_status.update_status[PATCH_BL33-1].check_delta = ERROR;
+		    fota_status.update_status[PATCH_BL33-1].check_rom = WAIT;
+		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
+            fota_status.update_status[PATCH_BL33-1].check_delta = PASS;
+		    fota_status.update_status[PATCH_BL33-1].check_rom = ERROR;
+
+		}else{
+
+			//fota_status.update_status[PATCH_OEMAPP2 -1].check_delta = PASS;
+			//fota_status.update_status[PATCH_OEMAPP2 -1].check_rom = WAIT;
+		}
+
+		save_fota_status();
+
+
+		if ((status != 0) &&(status != 1))
+		{
+            up_info.fota_flag[0] = 'e';
+            up_info.fota_flag[1] = 'n';
+            up_info.fota_flag[2] = 'd';
+            up_info.update_result = status;
+            up_info.ota_run = 0;
+            lseek(fd_update_status,0,SEEK_SET);
+            write(fd_update_status, &up_info,sizeof(up_info));
+            sync();
+            close(fd_update_status);
+            mtk_device_wrap_close(fd_read);
+            mtk_device_wrap_close(fd_write);
+            lynq_fota_release_wake_lock();
+            return status;
+		}
+        mtk_device_wrap_close(fd_read);
+		mtk_device_wrap_close(fd_write);
+
 
     }
 		
@@ -1935,7 +2167,7 @@
 	        fd_boot_b = mtk_device_wrap_open(DEV_BOOT_B,O_RDWR);
             if (fd_boot_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening full_boot file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening full_boot file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -2320,7 +2552,7 @@
 	        fd_oemapp_a = mtk_device_wrap_open(DEV_OEMAPP_A,O_RDWR);
             if (fd_oemapp_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -2329,7 +2561,7 @@
 	        fd_oemapp_b = mtk_device_wrap_open(DEV_OEMAPP_B,O_RDWR);
             if (fd_oemapp_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -2338,7 +2570,7 @@
 		fota_status.ota_run = FULL_OEMAPP;
         save_fota_status();
         retry_cnt = 0;
-		LYVERBLOG("+[UA]: Start upgrading oemapp full.\n");
+		RLOGD("+[UA]: Start upgrading oemapp full.\n");
         do {
 		    status = delta_copyto_nand(delta_offset,da_head.full_oemapp);
 			ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_oemapp,digest_s);
@@ -2347,7 +2579,7 @@
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 
-		LYVERBLOG("+[UA]: oemapp full retry_cnt = %d\n",retry_cnt);
+		RLOGD("+[UA]: oemapp full retry_cnt = %d\n",retry_cnt);
 		if (retry_cnt>3) {
 		    if (status == 0) {
 				status = retry_cnt;
@@ -2360,7 +2592,7 @@
 			}
 		}
 
-		LYVERBLOG("+[UA]: oemapp upgrade result:%d\n",status);
+		RLOGD("+[UA]: oemapp upgrade result:%d\n",status);
 		fota_status.update_result = status;
 		fota_status.update_status[FULL_OEMAPP-1].update_result = status;
 		save_fota_status();
@@ -2398,7 +2630,7 @@
 	        fd_oemapp2_a = mtk_device_wrap_open(DEV_OEMAPP2_A,O_RDWR);
             if (fd_oemapp2_a < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -2407,7 +2639,7 @@
 	        fd_oemapp2_b = mtk_device_wrap_open(DEV_OEMAPP2_B,O_RDWR);
             if (fd_oemapp2_b < 0) {
                 err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
@@ -2416,7 +2648,7 @@
         fota_status.ota_run = FULL_OEMAPP2;
         save_fota_status();
         retry_cnt = 0;
-		LYVERBLOG("+[UA]: Start upgrading oemapp2 full.\n");
+		RLOGD("+[UA]: Start upgrading oemapp2 full.\n");
         do {
 		    status = delta_copyto_nand(delta_offset,da_head.full_oemapp2);
 			ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_oemapp2,digest_s);
@@ -2425,7 +2657,7 @@
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 
-		LYVERBLOG("+[UA]: oemapp2 full retry_cnt = %d\n",retry_cnt);
+		RLOGD("+[UA]: oemapp2 full retry_cnt = %d\n",retry_cnt);
 		if (retry_cnt>3) {
 		    if (status == 0) {
 				status = retry_cnt;
@@ -2438,7 +2670,7 @@
 			}
 		}
 
-		LYVERBLOG("+[UA]: oemapp2 upgrade result:%d\n",status);
+		RLOGD("+[UA]: oemapp2 upgrade result:%d\n",status);
 		fota_status.update_result = status;
 		fota_status.update_status[FULL_OEMAPP2-1].update_result = status;
 		save_fota_status();
@@ -2460,9 +2692,161 @@
 
 
 	}
+	
+	
+	if(da_head.full_medmcu>0) {
+
+	    delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_tee  + da_head.full_boot + da_head.full_md1img + da_head.full_md1dsp + da_head.full_vbmeta + da_head.full_oemapp +da_head.full_oemapp2;
+
+
+        if(current_slot==SLOT_B) {
+            system("flash_eraseall /dev/mtd32");
+        } else {
+            system("flash_eraseall /dev/mtd33");
+        }
+
+		if(current_slot==SLOT_B) {
+	        fd_medmcu_a = mtk_device_wrap_open(DEV_MEDMCU_A,O_RDWR);
+            if (fd_medmcu_a < 0) {
+                err = errno;
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                lynq_fota_release_wake_lock();
+                return -err;
+            }
+			fd_curr = fd_medmcu_a;
+		}else{
+	        fd_medmcu_b = mtk_device_wrap_open(DEV_MEDMCU_B,O_RDWR);
+            if (fd_medmcu_b < 0) {
+                err = errno;
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                lynq_fota_release_wake_lock();
+                return -err;
+            }
+		    fd_curr = fd_medmcu_b;
+		}
+		fota_status.ota_run = FULL_MEDMCU;
+        save_fota_status();
+        retry_cnt = 0;
+        RLOGD("+[UA]: Start upgrading medmcu full.\n");
+        do {
+		    status = delta_copyto_nand(delta_offset,da_head.full_medmcu);
+		    ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_medmcu,digest_s);
+		    ROCK_SHA_FILE(fd_curr,0,da_head.full_medmcu,digest_t);
+		    retry_cnt++;
+		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
+		mtk_device_wrap_close(fd_curr);
+        RLOGD("+[UA]: medmcu full retry_cnt = %d\n",retry_cnt);
+		if (retry_cnt>3) {
+		    if (status == 0) {
+				status = retry_cnt;
+			}
+			if(current_slot==SLOT_B) {
+			    nand_copyto_nand(DEV_MEDMCU_B,DEV_MEDMCU_A);
+			}
+		    else{
+			    nand_copyto_nand(DEV_MEDMCU_A,DEV_MEDMCU_B);
+			}
+		}		
+                RLOGD("+[UA]: medmcu upgrade result:%d\n",status);
+		fota_status.update_result = status;
+		fota_status.update_status[FULL_MEDMCU-1].update_result = status;
+		save_fota_status();
+
+		if (status != 0)
+		{
+            up_info.fota_flag[0] = 'e';
+            up_info.fota_flag[1] = 'n';
+            up_info.fota_flag[2] = 'd';
+            up_info.update_result = status;
+            up_info.ota_run = 0;
+            lseek(fd_update_status,0,SEEK_SET);
+            write(fd_update_status, &up_info,sizeof(up_info));
+            sync();
+            close(fd_update_status);
+            lynq_fota_release_wake_lock();
+            return status;
+		}
+	}
+		
+		
+	
+	
+	
 
 	if(da_head.full_bl33>0) {
 
+	    delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_tee  + da_head.full_boot + da_head.full_md1img + da_head.full_md1dsp + da_head.full_vbmeta + da_head.full_oemapp +da_head.full_oemapp2 + da_head.full_medmcu;
+
+
+        if(current_slot==SLOT_B) {
+            system("flash_eraseall /dev/disk/by-partlabel/bl33_a");
+        } else {
+            system("flash_eraseall /dev/disk/by-partlabel/bl33_b");
+        }
+
+		if(current_slot==SLOT_B) {
+	        fd_bl33_a = mtk_device_wrap_open(DEV_BL33_A,O_RDWR);
+            if (fd_bl33_a < 0) {
+                err = errno;
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                lynq_fota_release_wake_lock();
+                return -err;
+            }
+			fd_curr = fd_bl33_a;
+		}else{
+	        fd_bl33_b = mtk_device_wrap_open(DEV_BL33_B,O_RDWR);
+            if (fd_bl33_b < 0) {
+                err = errno;
+                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+                lynq_fota_release_wake_lock();
+                return -err;
+            }
+		    fd_curr = fd_bl33_b;
+		}
+		fota_status.ota_run = FULL_BL33;
+        save_fota_status();
+        retry_cnt = 0;
+        RLOGD("+[UA]: Start upgrading bl33 full.\n");
+        do {
+		    status = delta_copyto_nand(delta_offset,da_head.full_bl33);
+		    ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_bl33,digest_s);
+		    ROCK_SHA_FILE(fd_curr,0,da_head.full_bl33,digest_t);
+		    retry_cnt++;
+		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
+		mtk_device_wrap_close(fd_curr);
+        RLOGD("+[UA]: bl33 full retry_cnt = %d\n",retry_cnt);
+		if (retry_cnt>3) {
+		    if (status == 0) {
+				status = retry_cnt;
+			}
+			if(current_slot==SLOT_B) {
+			    nand_copyto_nand(DEV_BL33_B,DEV_BL33_A);
+			}
+		    else{
+			    nand_copyto_nand(DEV_BL33_A,DEV_BL33_B);
+			}
+		}		
+        RLOGD("+[UA]: bl33 upgrade result:%d\n",status);
+		fota_status.update_result = status;
+		fota_status.update_status[FULL_BL33-1].update_result = status;
+		save_fota_status();
+
+		if (status != 0)
+		{
+            up_info.fota_flag[0] = 'e';
+            up_info.fota_flag[1] = 'n';
+            up_info.fota_flag[2] = 'd';
+            up_info.update_result = status;
+            up_info.ota_run = 0;
+            lseek(fd_update_status,0,SEEK_SET);
+            write(fd_update_status, &up_info,sizeof(up_info));
+            sync();
+            close(fd_update_status);
+            lynq_fota_release_wake_lock(); 
+            return status;
+		}		
+		
+
 	}
 
 
@@ -2523,7 +2907,7 @@
     
     lynq_fota_release_wake_lock();
     
-	if(update_mode==MODE_NORMAL){
+	if(reboot_flag==1){
 	reboot_device();
 	}	
 
@@ -2536,7 +2920,7 @@
 {
     int ret = 0;
     RLOGD("rock_fail_handler start\n");
-    ret = rock_update_main(0, 0, 0, 0, 1, 1);
+    //ret = rock_update_main(0, 0, 0, 0, 1, 1);
     if(ret)
     {
         RLOGD("fota update fail again!\n");
@@ -2556,7 +2940,7 @@
 
 #endif 
 	
-        ret = rock_update_main(0, 0, 0, 0, first_run, 1);
+        ret = rock_update_main(0, 0, 0, 0, first_run, 1,1);
         RLOGD("rock_update_main ret = %d\n", ret);
         if(ret)
         {
@@ -2587,7 +2971,7 @@
     { 
         //Power off, call UA
         RLOGD("[+UP]: ***Power off, call UA***\n");
-        ret = rock_update_main(0, 0, 0, 0, first_run, 1);
+        ret = rock_update_main(0, 0, 0, 0, first_run, 1, 0);
         RLOGD("rock_update_main ret = %d\n", ret);
         if(ret) 
         {
@@ -2599,7 +2983,7 @@
     {
         //Upgrade the other side and call UA
         RLOGD("[+UP]: ***Upgrade the other side and call UA***\n");
-        ret = rock_update_main(0, 0, 0, 0, first_run, 0);
+        ret = rock_update_main(0, 0, 0, 0, first_run, 0, 0);
         RLOGD("rock_update_main ret = %d\n", ret);
         if(ret)
         {
@@ -2681,2000 +3065,14 @@
  */
 int lynq_fota_nrestart(void)
 {
-	int status,err,start;
     int ret = 0;
-	int i = 0;
-	int retry_cnt = 0;
-	
-	IOT_UPDATA_CONTEXT ctx;
-	UPDATE_INFO up_info;
-	//OTA_STATUS  fota_status;
-
-
-    const hw_module_t* hw_module;
-    unsigned int  slot;
-
-	unsigned int  update_mode = MODE_NORMAL;
-	unsigned int  delta_size;
-    unsigned char full_header[9];
-	
-	char digest_s[SHA_DIGEST_SIZE];
-	char digest_t[SHA_DIGEST_SIZE];
-
-	
-    hw_module = &HAL_MODULE_INFO_SYM;
-
-    if (!hw_module ||
-        strcmp(BOOT_CONTROL_HARDWARE_MODULE_ID, hw_module->id) != 0) {
-        ret = -EINVAL;
-    }
-    if (ret != 0) {
-        LYERRLOG("+[UA]: Error loading boot_control HAL implementation.\n");
-        return -1;
-    }
-
-    module = (boot_control_module_t*)hw_module;
-    module->init(module);
-
-
-    if (module == NULL) {
-        LYERRLOG("+[UA]: Error getting bootctrl module.\n");
-	    return  -1;
-    }
-
-    lynq_init_wake_lock_func();
-    lynq_fota_grab_artial_wake_lock();
-     /*************    Bootctrl Init  End  *************/
-
-    current_slot = module->getCurrentSlot(module);
-    
-    int is_successful = module->isSlotMarkedSuccessful(module, current_slot);
-  
-    LYVERBLOG("Booting slot = %d, : isSlotMarkedSuccessful= %d\n",current_slot,is_successful);  
-		
-
-
-	memset(&ctx, 0, sizeof(ctx));
-	ctx.rom_base = 0;
-	ctx.ram_base =(unsigned char *)&ram_buffer[0];
-	ctx.ram_len = ROCK_RAM_LEN;
-	ctx.backup_base = BACKUP_ADDR_FLAG;
-	ctx.backup_len = ROCK_DEFAULT_BLOCK_SIZE;	
-	ctx.update_nvram = 0;
-	ctx.read_rom_directly = 0;
-    //ctx.first_run = first_run;
-    ctx.first_run = 1;
-
-    if(0 != init_dev_fd())
+    ret = rock_update_main(0, 0, 0, 0, 1, 1, 0);
+    RLOGD("lynq_fota_nrestart ret = %d\n", ret);
+    if(ret)
     {
-        LYVERBLOG("+[UA]: get fota addr error\n");
-        lynq_fota_release_wake_lock();
-        return E_ROCK_FOTA_ADDR;
+        RLOGD("fota update fail!\n");
     }
-
-    memset(&up_info, 0, sizeof(up_info));
-	
-	memset(&fota_status,0,sizeof(fota_status));
-
-	
-    lseek(fd_update_status,0,SEEK_SET);
-    read(fd_update_status,(unsigned char *)&up_info,sizeof(up_info));
-
-	LYVERBLOG("+[UA]: up_info.ota_run = %d\n",up_info.ota_run);
-	
-	
-	if ((up_info.ota_run>PATCH_BL33)||(up_info.ota_run<PATCH_SYSTEM))
-	{
-		up_info.ota_run = 0;
-	}	
-	
-	up_info.ota_run = 0;
-	
-	if((up_info.fota_flag[0]=='A')&&(up_info.fota_flag[1]=='-')&&(up_info.fota_flag[2]=='B')){
-		update_mode = MODE_A2B;
-	}else if((up_info.fota_flag[0]=='B')&&(up_info.fota_flag[1]=='-')&&(up_info.fota_flag[2]=='A')){
-		update_mode = MODE_B2A;
-	}else{
-		update_mode = MODE_NORMAL;
-	}
-	
-	LYVERBLOG("+[UA]: up_info.fota_flag = %s\n",up_info.fota_flag);
-	LYVERBLOG("+[UA]: update_mode = %d\n",update_mode);
-	
-    memset(&da_head, 0, sizeof(da_head));
-
-	read(fd_delta, (unsigned char*)&da_head, sizeof(da_head));
-
-
-    rock_trace(&ctx, "da_head.sys:%d,da_head.boot:%d,da_head.tee:%d,da_head.md1img=%d,da_head.md1dsp=%d,da_head.vbmeta=%d,da_head.oemapp=%d,da_head.oemapp2=%d,da_head.bl33=%d\n", 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.bl33);
-    rock_trace(&ctx, "da_head.fullsys:%d,da_head.fullboot:%d,da_head.fulltee:%d,da_head.fullmd1img=%d,da_head.fullmd1dsp=%d,da_head.fullvbmeta=%d,da_head.full_oemapp=%d,da_head.full_oemapp2=%d,da_head.fullbl33=%d\n", 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_bl33);
-
-    
-    if (da_head.sys>0) {
-	    fota_status.update_status[PATCH_SYSTEM - 1].need_update = 1;
-	}
-	if (da_head.boot>0) {
-		fota_status.update_status[PATCH_BOOT - 1].need_update = 1;
-	}
-	if (da_head.tee>0) {
-		fota_status.update_status[PATCH_TEE - 1].need_update = 1;
-	}
-	if (da_head.md1img>0) {
-		fota_status.update_status[PATCH_MD1IMG - 1].need_update = 1;
-	}
-	if (da_head.md1dsp>0) {
-		fota_status.update_status[PATCH_MD1DSP - 1].need_update = 1;
-	}
-	if (da_head.vbmeta>0) {
-		fota_status.update_status[PATCH_VBMETA - 1].need_update = 1;
-	}
-	if (da_head.oemapp>0) {
-		fota_status.update_status[PATCH_OEMAPP - 1].need_update = 1;
-	}
-	if (da_head.oemapp2>0) {
-		fota_status.update_status[PATCH_OEMAPP2 - 1].need_update = 1;
-	}
-	if (da_head.bl33>0) {
-		fota_status.update_status[PATCH_BL33 - 1].need_update = 1;
-	}
-	
-	if (da_head.full_sys>0) {
-		fota_status.update_status[FULL_SYSTEM - 1].need_update = 1;
-	}
-	if (da_head.full_boot>0) {
-		fota_status.update_status[FULL_BOOT - 1].need_update = 1;
-	}
-	if (da_head.full_tee>0) {
-		fota_status.update_status[FULL_TEE - 1].need_update = 1;
-	}
-	if (da_head.full_md1img>0) {
-		fota_status.update_status[FULL_MD1IMG - 1].need_update = 1;
-	}
-	if (da_head.full_bl33>0) {
-		fota_status.update_status[FULL_BL33 - 1].need_update = 1;
-	}
-	if (da_head.full_md1dsp>0) {
-		fota_status.update_status[FULL_MD1DSP - 1].need_update = 1;
-	}
-	if (da_head.full_vbmeta>0) {
-		fota_status.update_status[FULL_VBMETA - 1].need_update = 1;
-	}
-	if (da_head.full_oemapp>0) {
-		fota_status.update_status[FULL_OEMAPP - 1].need_update = 1;
-	}
-    if (da_head.full_oemapp2>0) {
-        fota_status.update_status[FULL_OEMAPP2 - 1].need_update = 1;
-    }
-	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.bl33;
-	
-
-    if ((da_head.sys>0) && (up_info.ota_run <= PATCH_SYSTEM))
-	{
-
-        now_patch = PATCH_SYSTEM;
-        delta_offset = DELTA_HEARD_SIZE;
-  
-#if 0		
-		if (up_info.ota_run == PATCH_SYSTEM) 
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-		//up_info.ota_run = 0;
-
-		
-        if(current_slot==SLOT_B) {
-	        fd_system_a = mtk_device_wrap_open(DEV_SYSTEM_A,O_RDWR);
-            if (fd_system_a < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                return -err;
-            }
-			fd_curr = fd_system_a;
-		}else{
-	        fd_system_b = mtk_device_wrap_open(DEV_SYSTEM_B,O_RDWR);
-            if (fd_system_b < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                return -err;
-            }
-			fd_curr = fd_system_b;			
-		}
-
-#endif 
-
-
-        ctx.first_run = 1;   // always
-		
-
-		
-		if(current_slot==SLOT_B) {
-		    system("flash_eraseall /dev/disk/by-partlabel/system_a");
-		} else {
-			system("flash_eraseall /dev/disk/by-partlabel/system_b");
-		}
-		
-//        if(current_slot==SLOT_B) {
-	        fd_system_a = mtk_device_wrap_open(DEV_SYSTEM_A,O_RDWR);
-            if (fd_system_a < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_system_a;
-//		}else{
-	        fd_system_b = mtk_device_wrap_open(DEV_SYSTEM_B,O_RDWR);
-            if (fd_system_b < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_system_b;			
-//		}
-		
-		if(current_slot==SLOT_B){
-			fd_read  = fd_system_b;
-			fd_write = fd_system_a;	
-		} else {
-			fd_read  = fd_system_a;
-			fd_write = fd_system_b;
-		}
-
-		
-		fota_status.ota_run = PATCH_SYSTEM;
-        fota_status.update_status[PATCH_SYSTEM -1].check_delta = WAIT;
-		fota_status.update_status[PATCH_SYSTEM -1].check_rom = WAIT;
-		fota_status.update_status[PATCH_SYSTEM-1].update_result= WAIT;
-
-		save_fota_status();
-		
-		
-		up_info.ota_run = PATCH_SYSTEM;
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();
-		
-		
-		LYVERBLOG("+[UA]: Start upgrading system.\n");
-        status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: system upgrade result:%d\n",status);
-		
-		//up_info.ota_run = 0;
-		
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_SYSTEM -1].update_result= status; 
-		fota_status.update_result= status;
-
-        if((status == 0)||(status ==1))
-        {
-
-            fota_status.update_status[PATCH_SYSTEM -1].check_delta = PASS;
-		    fota_status.update_status[PATCH_SYSTEM -1].check_rom = PASS;
-               
-		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_SYSTEM -1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_SYSTEM -1].check_rom = WAIT;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_SYSTEM -1].check_delta = PASS;
-		    fota_status.update_status[PATCH_SYSTEM -1].check_rom = ERROR;
-
-		}else{
-		
-			//fota_status.update_status[PATCH_SYSTEM -1].check_delta = PASS;
-			//fota_status.update_status[PATCH_SYSTEM -1].check_rom = WAIT;
-		}
-
-		save_fota_status();
-
-		
-		if ((status != 0) &&(status != 1))
-		{
-
-		    up_info.fota_flag[0] = 'e';
-	        up_info.fota_flag[1] = 'n';
-	        up_info.fota_flag[2] = 'd';
-	        up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-			write(fd_update_status, &up_info,sizeof(up_info));
-			sync();
-            close(fd_update_status);
-			
-			mtk_device_wrap_close(fd_read);
-			mtk_device_wrap_close(fd_write);
-
-            lynq_fota_release_wake_lock();
-            return status;
-		}
-			mtk_device_wrap_close(fd_read);
-			mtk_device_wrap_close(fd_write);
-		
-
-    }
-	
-	
-	
-	
-
-    if ((da_head.boot>0) && (up_info.ota_run <= PATCH_BOOT))
-	{
-
-        now_patch = PATCH_BOOT;
-        delta_offset = DELTA_HEARD_SIZE + da_head.sys;
-
-		
-		if (up_info.ota_run == PATCH_BOOT)
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-		
-		if(current_slot==SLOT_B) {
-		    system("flash_eraseall /dev/disk/by-partlabel/boot_a");
-		} else {
-			system("flash_eraseall /dev/disk/by-partlabel/boot_b");
-		}
-        //if(current_slot==SLOT_B) {
-	        fd_boot_a = mtk_device_wrap_open(DEV_BOOT_A,O_RDWR);
-            if (fd_boot_a < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_boot_a;
-//		}else{
-	        fd_boot_b = mtk_device_wrap_open(DEV_BOOT_B,O_RDWR);
-            if (fd_boot_b < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_boot_b;			
-//		}
-
-
-		if(current_slot==SLOT_B){
-			fd_read  = fd_boot_b;
-			fd_write = fd_boot_a;	
-		} else {
-			fd_read  = fd_boot_a;
-			fd_write = fd_boot_b;
-		}
-
-
-		fota_status.ota_run = PATCH_BOOT;
-        fota_status.update_status[PATCH_BOOT-1].check_delta = WAIT;
-		fota_status.update_status[PATCH_BOOT-1].check_rom = WAIT;
-		fota_status.update_status[PATCH_BOOT-1].update_result= WAIT;
-
-		save_fota_status();
-
-		
-	    up_info.ota_run = PATCH_BOOT;
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();
-		
-		
-		
-        LYVERBLOG("+[UA]: Start upgrading boot.\n");
-        status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: boot upgrade result:%d\n",status);
-        //up_info.ota_run = 0;
-
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_BOOT-1].update_result= status; 
-		fota_status.update_result= status;
-
-        if((status == 0)||(status ==1))
-        {
-
-            fota_status.update_status[PATCH_BOOT-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_BOOT-1].check_rom = PASS;
-               
-		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_BOOT-1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_BOOT-1].check_rom = WAIT;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_BOOT-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_BOOT-1].check_rom = ERROR;
-
-		}else{
-		
-			//fota_status.update_status[PATCH_SYSTEM -1].check_delta = PASS;
-			//fota_status.update_status[PATCH_SYSTEM -1].check_rom = WAIT;
-		}
-
-		save_fota_status();
-
-
-
-		if ((status != 0) &&(status != 1))
-		{
-
-		    up_info.fota_flag[0] = 'e';
-	        up_info.fota_flag[1] = 'n';
-	        up_info.fota_flag[2] = 'd';
-	        up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-			write(fd_update_status, &up_info,sizeof(up_info));
-			sync();
-            close(fd_update_status);
-			mtk_device_wrap_close(fd_read);
-			mtk_device_wrap_close(fd_write);
-
-            lynq_fota_release_wake_lock();
-            return status;
-		}
-			mtk_device_wrap_close(fd_read);
-			mtk_device_wrap_close(fd_write);
-
-    }
-	
-	
-	
-	
-
-    if ((da_head.tee>0) && (up_info.ota_run <= PATCH_TEE))
-	{
-
-        now_patch = PATCH_TEE;
-        delta_offset = DELTA_HEARD_SIZE + da_head.sys + da_head.boot;
- 
-		
-		if (up_info.ota_run == PATCH_TEE) 
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-		
-		if(current_slot==SLOT_B) {
-		    system("flash_eraseall /dev/disk/by-partlabel/tee_a");
-		} else {
-			system("flash_eraseall /dev/disk/by-partlabel/tee_b");
-		}
-
-//        if(current_slot==SLOT_B) {
-	        fd_tee_a = mtk_device_wrap_open(DEV_TEE_A,O_RDWR);
-            if (fd_tee_a < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_tee_a;
-//		}else{
-	        fd_tee_b = mtk_device_wrap_open(DEV_TEE_B,O_RDWR);
-            if (fd_tee_b < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_tee_b;			
-//		}
-
-
-		if(current_slot==SLOT_B){
-			fd_read  = fd_tee_b;
-			fd_write = fd_tee_a;	
-		} else {
-			fd_read  = fd_tee_a;
-			fd_write = fd_tee_b;
-		}
-
-
-		fota_status.ota_run = PATCH_TEE;
-        fota_status.update_status[PATCH_TEE-1].check_delta = WAIT;
-		fota_status.update_status[PATCH_TEE-1].check_rom = WAIT;
-		fota_status.update_status[PATCH_TEE-1].update_result= WAIT;
-		
-		save_fota_status();
-		
-		up_info.ota_run = PATCH_TEE;
-
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();
-
-        LYVERBLOG("+[UA]: Start upgrading tee.\n");
-        status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: tee upgrade result:%d\n",status);
-        //up_info.ota_run = 0;
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_TEE-1].update_result= status; 
-		fota_status.update_result= status;
-
-        if((status == 0)||(status ==1))
-        {
-
-            fota_status.update_status[PATCH_TEE-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_TEE-1].check_rom = PASS;
-               
-		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_TEE-1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_TEE-1].check_rom = WAIT;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_TEE-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_TEE-1].check_rom = ERROR;
-
-		}else{
-		
-			//fota_status.update_status[PATCH_SYSTEM -1].check_delta = PASS;
-			//fota_status.update_status[PATCH_SYSTEM -1].check_rom = WAIT;
-		}
-
-		save_fota_status();
-
-
-		if ((status != 0) &&(status != 1))
-		{
-
-		    up_info.fota_flag[0] = 'e';
-	        up_info.fota_flag[1] = 'n';
-	        up_info.fota_flag[2] = 'd';
-	        up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-			write(fd_update_status, &up_info,sizeof(up_info));
-			sync();
-			close(fd_update_status);
-			mtk_device_wrap_close(fd_read);
-			mtk_device_wrap_close(fd_write);
-            lynq_fota_release_wake_lock();
-            return status;
-		}
-		mtk_device_wrap_close(fd_read);
-		mtk_device_wrap_close(fd_write);
-
-    }
-	
-	
-	
-
-    if ((da_head.md1img>0) && (up_info.ota_run <= PATCH_MD1IMG))
-	{
-
-        now_patch = PATCH_MD1IMG;
-        delta_offset = DELTA_HEARD_SIZE + da_head.sys + da_head.boot + da_head.tee;
-
-		
-		if (up_info.ota_run == PATCH_MD1IMG) 
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-		
-		if(current_slot==SLOT_B) {
-		    system("flash_eraseall /dev/disk/by-partlabel/md1img_a");
-		} else {
-			system("flash_eraseall /dev/disk/by-partlabel/md1img_b");
-		}
-
-//        if(current_slot==SLOT_B) {
-	        fd_md1img_a = mtk_device_wrap_open(DEV_MD1IMG_A,O_RDWR);
-            if (fd_md1img_a < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_md1img_a;
-//		}else{
-	        fd_md1img_b = mtk_device_wrap_open(DEV_MD1IMG_B,O_RDWR);
-            if (fd_md1img_b < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_md1img_b;			
-//		}
-
-
-		if(current_slot==SLOT_B){
-			fd_read  = fd_md1img_b;
-			fd_write = fd_md1img_a;	
-		} else {
-			fd_read  = fd_md1img_a;
-			fd_write = fd_md1img_b;
-		}
-
-		fota_status.ota_run = PATCH_MD1IMG;
-        fota_status.update_status[PATCH_MD1IMG-1].check_delta = WAIT;
-		fota_status.update_status[PATCH_MD1IMG-1].check_rom = WAIT;
-		fota_status.update_status[PATCH_MD1IMG-1].update_result= WAIT;
-
-		save_fota_status();
-		
-		up_info.ota_run = PATCH_MD1IMG;
-
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();		
-		
-
-        LYVERBLOG("+[UA]: Start upgrading md1img.\n");
-        status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: md1img upgrade result:%d\n",status);
-
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_MD1IMG-1].update_result= status; 
-		fota_status.update_result= status;
-
-        if((status == 0)||(status ==1))
-        {
-
-            fota_status.update_status[PATCH_MD1IMG-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_MD1IMG-1].check_rom = PASS;
-               
-		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_MD1IMG-1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_MD1IMG-1].check_rom = WAIT;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_MD1IMG-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_MD1IMG-1].check_rom = ERROR;
-
-		}else{
-		
-			//fota_status.update_status[PATCH_MD1IMG -1].check_delta = PASS;
-			//fota_status.update_status[PATCH_MD1IMG -1].check_rom = WAIT;
-		}
-
-		save_fota_status();
-
-
-		if ((status != 0) &&(status != 1))
-		{
-
-		    up_info.fota_flag[0] = 'e';
-	        up_info.fota_flag[1] = 'n';
-	        up_info.fota_flag[2] = 'd';
-	        up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-			write(fd_update_status, &up_info,sizeof(up_info));
-			sync();
-			close(fd_update_status);
-	        mtk_device_wrap_close(fd_read);
-			mtk_device_wrap_close(fd_write);
-            lynq_fota_release_wake_lock();
-            return status;
-		}
-        mtk_device_wrap_close(fd_read);
-		mtk_device_wrap_close(fd_write);
-
-
-    }
-	
-	
-	
-	
-	if ((da_head.md1dsp>0) && (up_info.ota_run <= PATCH_MD1DSP))
-	{
-
-        now_patch = PATCH_MD1DSP;
-        delta_offset = DELTA_HEARD_SIZE + da_head.sys + da_head.boot + da_head.tee + da_head.md1img;
-
-		
-		if (up_info.ota_run == PATCH_MD1DSP) 
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-		
-		if(current_slot==SLOT_B) {
-		    system("flash_eraseall /dev/disk/by-partlabel/md1dsp_a");
-		} else {
-			system("flash_eraseall /dev/disk/by-partlabel/md1dsp_b");
-		}
-//        if(current_slot==SLOT_B) {
-	        fd_md1dsp_a = mtk_device_wrap_open(DEV_MD1DSP_A,O_RDWR);
-            if (fd_md1dsp_a < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_md1dsp_a;
-//		}else{
-	        fd_md1dsp_b = mtk_device_wrap_open(DEV_MD1DSP_B,O_RDWR);
-            if (fd_md1dsp_b < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_md1dsp_b;			
-//		}
-
-
-		if(current_slot==SLOT_B){
-			fd_read  = fd_md1dsp_b;
-			fd_write = fd_md1dsp_a;	
-		} else {
-			fd_read  = fd_md1dsp_a;
-			fd_write = fd_md1dsp_b;
-		}
-
-
-		fota_status.ota_run = PATCH_MD1DSP;
-        fota_status.update_status[PATCH_MD1DSP-1].check_delta = WAIT;
-		fota_status.update_status[PATCH_MD1DSP-1].check_rom = WAIT;
-		fota_status.update_status[PATCH_MD1DSP-1].update_result= WAIT;
-
-		save_fota_status();
-
-
-		up_info.ota_run = PATCH_MD1DSP;
-
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();
-
-
-        LYVERBLOG("+[UA]: Start upgrading md1dsp.\n");
-        status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: md1dsp upgrade result:%d\n",status);
-
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_MD1DSP-1].update_result= status; 
-		fota_status.update_result= status;
-
-        if((status == 0)||(status ==1))
-        {
-
-            fota_status.update_status[PATCH_MD1DSP-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_MD1DSP-1].check_rom = PASS;
-               
-		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_MD1DSP-1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_MD1DSP-1].check_rom = WAIT;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_MD1DSP-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_MD1DSP-1].check_rom = ERROR;
-
-		}else{
-		
-			//fota_status.update_status[PATCH_MD1IMG -1].check_delta = PASS;
-			//fota_status.update_status[PATCH_MD1IMG -1].check_rom = WAIT;
-		}
-
-		save_fota_status();
-
-
-		if ((status != 0) &&(status != 1))
-		{
-
-		    up_info.fota_flag[0] = 'e';
-	        up_info.fota_flag[1] = 'n';
-	        up_info.fota_flag[2] = 'd';
-	        up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-			write(fd_update_status, &up_info,sizeof(up_info));
-			sync();
-			close(fd_update_status);
-	        mtk_device_wrap_close(fd_read);
-			mtk_device_wrap_close(fd_write);
-            lynq_fota_release_wake_lock();
-            return status;
-		}
-        mtk_device_wrap_close(fd_read);
-		mtk_device_wrap_close(fd_write);
-
-
-    }
-	
-	
-	if ((da_head.vbmeta>0) && (up_info.ota_run <= PATCH_VBMETA))
-	{
-
-        now_patch = PATCH_VBMETA;
-        delta_offset = DELTA_HEARD_SIZE + da_head.sys + da_head.boot + da_head.tee + da_head.md1img + da_head.md1dsp;
-
-		
-		if (up_info.ota_run == PATCH_VBMETA) 
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-
-		
-		if(current_slot==SLOT_B) {
-		    system("flash_eraseall /dev/disk/by-partlabel/vbmeta_a");
-		} else {
-			system("flash_eraseall /dev/disk/by-partlabel/vbmeta_b");
-		}
-//        if(current_slot==SLOT_B) {
-	        fd_vbmeta_a = mtk_device_wrap_open(DEV_VBMETA_A,O_RDWR);
-            if (fd_vbmeta_a < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_vbmeta_a;
-//		}else{
-	        fd_vbmeta_b = mtk_device_wrap_open(DEV_VBMETA_B,O_RDWR);
-            if (fd_vbmeta_b < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_vbmeta_b;			
-//		}
-
-		if(current_slot==SLOT_B){
-			fd_read  = fd_vbmeta_b;
-			fd_write = fd_vbmeta_a;	
-		} else {
-			fd_read  = fd_vbmeta_a;
-			fd_write = fd_vbmeta_b;
-		}
-
-
-		fota_status.ota_run = PATCH_VBMETA;
-        fota_status.update_status[PATCH_VBMETA-1].check_delta = WAIT;
-		fota_status.update_status[PATCH_VBMETA-1].check_rom = WAIT;
-		fota_status.update_status[PATCH_VBMETA-1].update_result= WAIT;
-
-		save_fota_status();
-		
-		up_info.ota_run = PATCH_VBMETA;
-
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();
-
-        LYVERBLOG("+[UA]: Start upgrading vbmeta.\n");
-        status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: vbmeta upgrade result:%d\n",status);
-        
-		up_info.ota_run = 0;
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_VBMETA-1].update_result= status; 
-		fota_status.update_result= status;
-
-        if((status == 0)||(status ==1))
-        {
-
-            fota_status.update_status[PATCH_VBMETA-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_VBMETA-1].check_rom = PASS;
-               
-		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_VBMETA-1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_VBMETA-1].check_rom = WAIT;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_VBMETA-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_VBMETA-1].check_rom = ERROR;
-
-		}else{
-		
-			//fota_status.update_status[PATCH_MD1IMG -1].check_delta = PASS;
-			//fota_status.update_status[PATCH_MD1IMG -1].check_rom = WAIT;
-		}
-
-		save_fota_status();
-
-
-		if ((status != 0) &&(status != 1))
-		{
-
-		    up_info.fota_flag[0] = 'e';
-	        up_info.fota_flag[1] = 'n';
-	        up_info.fota_flag[2] = 'd';
-	        up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-			write(fd_update_status, &up_info,sizeof(up_info));
-			sync();
-			close(fd_update_status);
-	        mtk_device_wrap_close(fd_read);
-			mtk_device_wrap_close(fd_write);
-            lynq_fota_release_wake_lock();
-            return status;
-		}
-        mtk_device_wrap_close(fd_read);
-		mtk_device_wrap_close(fd_write);
-
-
-    }
-
-	if ((da_head.oemapp>0) && (up_info.ota_run <= PATCH_OEMAPP))
-	{
-
-        now_patch = PATCH_OEMAPP;
-        delta_offset = DELTA_HEARD_SIZE + da_head.sys + da_head.boot + da_head.tee + da_head.md1img + da_head.md1dsp + da_head.vbmeta;
-
-
-		if (up_info.ota_run == PATCH_OEMAPP) 
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-
-
-		if(current_slot==SLOT_B) {
-		    system("flash_eraseall /dev/disk/by-partlabel/oemapp_a");
-		} else {
-			system("flash_eraseall /dev/disk/by-partlabel/oemapp_b");
-		}
-//        if(current_slot==SLOT_B) {
-	        fd_oemapp_a = mtk_device_wrap_open(DEV_OEMAPP_A,O_RDWR);
-            if (fd_oemapp_a < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_oemapp_a;
-//		}else{
-	        fd_oemapp_b = mtk_device_wrap_open(DEV_OEMAPP_B,O_RDWR);
-            if (fd_oemapp_b < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_oemapp_b;
-//		}
-
-		if(current_slot==SLOT_B){
-			fd_read  = fd_oemapp_b;
-			fd_write = fd_oemapp_a;
-		} else {
-			fd_read  = fd_oemapp_a;
-			fd_write = fd_oemapp_b;
-		}
-
-
-		fota_status.ota_run = PATCH_OEMAPP;
-        fota_status.update_status[PATCH_OEMAPP-1].check_delta = WAIT;
-		fota_status.update_status[PATCH_OEMAPP-1].check_rom = WAIT;
-		fota_status.update_status[PATCH_OEMAPP-1].update_result= WAIT;
-
-		save_fota_status();
-		
-		up_info.ota_run = PATCH_OEMAPP;
-
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();
-
-        LYVERBLOG("+[UA]: Start upgrading oemapp.\n");
-        status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: oemapp upgrade result:%d\n",status);
-
-		up_info.ota_run = 0;
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_OEMAPP-1].update_result= status; 
-		fota_status.update_result= status;
-
-        if((status == 0)||(status ==1))
-        {
-
-            fota_status.update_status[PATCH_OEMAPP-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_OEMAPP-1].check_rom = PASS;
-               
-		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_OEMAPP-1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_OEMAPP-1].check_rom = WAIT;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_OEMAPP-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_OEMAPP-1].check_rom = ERROR;
-
-		}else{
-
-			//fota_status.update_status[PATCH_OEMAPP -1].check_delta = PASS;
-			//fota_status.update_status[PATCH_OEMAPP -1].check_rom = WAIT;
-		}
-
-		save_fota_status();
-
-
-		if ((status != 0) &&(status != 1))
-		{
-
-		    up_info.fota_flag[0] = 'e';
-	        up_info.fota_flag[1] = 'n';
-	        up_info.fota_flag[2] = 'd';
-	        up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-			write(fd_update_status, &up_info,sizeof(up_info));
-			sync();
-			close(fd_update_status);
-	        mtk_device_wrap_close(fd_read);
-			mtk_device_wrap_close(fd_write);
-            lynq_fota_release_wake_lock();
-            return status;
-		}
-        mtk_device_wrap_close(fd_read);
-		mtk_device_wrap_close(fd_write);
-
-
-    }
-
-    if ((da_head.oemapp2>0) && (up_info.ota_run <= PATCH_OEMAPP2))
-	{
-
-        now_patch = PATCH_OEMAPP2;
-        delta_offset = DELTA_HEARD_SIZE + da_head.sys + da_head.boot + da_head.tee + da_head.md1img + da_head.md1dsp + da_head.vbmeta + da_head.oemapp;
-
-		
-		if (up_info.ota_run == PATCH_OEMAPP2) 
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-
-
-		if(current_slot==SLOT_B) {
-		    system("flash_eraseall /dev/disk/by-partlabel/oemapp2_a");
-		} else {
-			system("flash_eraseall /dev/disk/by-partlabel/oemapp2_b");
-		}
-//        if(current_slot==SLOT_B) {
-	        fd_oemapp2_a = mtk_device_wrap_open(DEV_OEMAPP2_A,O_RDWR);
-            if (fd_oemapp2_a < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_oemapp2_a;
-//		}else{
-	        fd_oemapp2_b = mtk_device_wrap_open(DEV_OEMAPP2_B,O_RDWR);
-            if (fd_oemapp2_b < 0) {
-                err = errno;
-                LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_oemapp2_b;
-//		}
-
-		if(current_slot==SLOT_B){
-			fd_read  = fd_oemapp2_b;
-			fd_write = fd_oemapp2_a;
-		} else {
-			fd_read  = fd_oemapp2_a;
-			fd_write = fd_oemapp2_b;
-		}
-
-
-		fota_status.ota_run = PATCH_OEMAPP2;
-        fota_status.update_status[PATCH_OEMAPP2-1].check_delta = WAIT;
-		fota_status.update_status[PATCH_OEMAPP2-1].check_rom = WAIT;
-		fota_status.update_status[PATCH_OEMAPP2-1].update_result= WAIT;
-
-		save_fota_status();
-		
-		up_info.ota_run = PATCH_OEMAPP2;
-
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();
-
-        LYVERBLOG("+[UA]: Start upgrading oemapp2.\n");
-        status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: oemapp2 upgrade result:%d\n",status);
-
-		up_info.ota_run = 0;
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_OEMAPP2-1].update_result= status; 
-		fota_status.update_result= status;
-
-        if((status == 0)||(status ==1))
-        {
-
-            fota_status.update_status[PATCH_OEMAPP2-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_OEMAPP2-1].check_rom = PASS;
-
-		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_OEMAPP2-1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_OEMAPP2-1].check_rom = WAIT;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_OEMAPP2-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_OEMAPP2-1].check_rom = ERROR;
-
-		}else{
-
-			//fota_status.update_status[PATCH_OEMAPP2 -1].check_delta = PASS;
-			//fota_status.update_status[PATCH_OEMAPP2 -1].check_rom = WAIT;
-		}
-
-		save_fota_status();
-
-
-		if ((status != 0) &&(status != 1))
-		{
-            up_info.fota_flag[0] = 'e';
-            up_info.fota_flag[1] = 'n';
-            up_info.fota_flag[2] = 'd';
-            up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-            write(fd_update_status, &up_info,sizeof(up_info));
-            sync();
-            close(fd_update_status);
-            mtk_device_wrap_close(fd_read);
-            mtk_device_wrap_close(fd_write);
-            lynq_fota_release_wake_lock();
-            return status;
-		}
-        mtk_device_wrap_close(fd_read);
-		mtk_device_wrap_close(fd_write);
-
-
-    }
-
-    if ((da_head.bl33>0) && (up_info.ota_run <= PATCH_BL33))
-	{
-
-        now_patch = PATCH_BL33;
-        delta_offset = DELTA_HEARD_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;
-
-		if (up_info.ota_run == PATCH_BL33) 
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-
-
-	    fd_bl33 = mtk_device_wrap_open(DEV_BL33,O_RDWR);
-        if (fd_bl33 < 0) {
-            err = errno;
-            LYERRLOG("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-            lynq_fota_release_wake_lock();
-            return -err;
-        }
-	    fd_curr = fd_bl33;
-
-		fota_status.ota_run = PATCH_BL33;
-        fota_status.update_status[PATCH_BL33-1].check_delta = WAIT;
-		fota_status.update_status[PATCH_BL33-1].check_rom = WAIT;
-		fota_status.update_status[PATCH_BL33-1].update_result= WAIT;
-
-		save_fota_status();
-		
-		up_info.ota_run = PATCH_BL33;
-
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();
-		
-        LYVERBLOG("+[UA]: Start upgrading bl33.\n");
-        status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: bl33 upgrade result:%d\n",status);
-        
-		up_info.ota_run = 0;
-		
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_BL33-1].update_result= status; 
-        fota_status.update_result= status;
-        if((status == 0)||(status ==1))
-        {
-
-            fota_status.update_status[PATCH_BL33-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_BL33-1].check_rom = PASS;
-               
-		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_BL33-1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_BL33-1].check_rom = WAIT;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_BL33-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_BL33-1].check_rom = ERROR;
-
-		}else{
-		
-			//fota_status.update_status[PATCH_BL33 -1].check_delta = PASS;
-			//fota_status.update_status[PATCH_BL33 -1].check_rom = WAIT;
-		}
-
-		save_fota_status();		
-
-		if ((status != 0) &&(status != 1))
-		{
-
-		    up_info.fota_flag[0] = 'e';
-	        up_info.fota_flag[1] = 'n';
-	        up_info.fota_flag[2] = 'd';
-	        up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-			write(fd_update_status, &up_info,sizeof(up_info));
-	        mtk_device_wrap_close(fd_curr);
-			sync();
-			close(fd_update_status);
-            lynq_fota_release_wake_lock();
-            return status;
-		}
-        mtk_device_wrap_close(fd_curr);
-
-    }
-		
-	
-	if ((da_head.full_sys>0)|| (da_head.full_boot>0)|| (da_head.full_tee>0)||(da_head.full_md1img>0)||(da_head.full_md1dsp>0)||(da_head.full_vbmeta>0)||(da_head.full_oemapp>0)||(da_head.full_oemapp2>0)||(da_head.full_bl33>0))
-	{
-            RLOGD("+[UA]: start full upgrade\n");
-	    now_patch = 0;
-		up_info.ota_run = 0;
-		
-		memset(&fota_status,0,sizeof(fota_status));
-		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");
-            lynq_fota_release_wake_lock();
-		    return -1;
-        }
-		
-	    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");
-	        up_info.fota_flag[0] = 'e';
-	        up_info.fota_flag[1] = 'n';
-	        up_info.fota_flag[2] = 'd';
-	        up_info.update_result = -1;
-                up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-			write(fd_update_status, &up_info,sizeof(up_info));
-	        //mtk_device_wrap_close(fd_curr);
-			sync();
-			close(fd_update_status);
-
-			for (i = FULL_SYSTEM;i<=FULL_BL33;i++){
-                if (fota_status.update_status[i-1].need_update ==1) {
-                    fota_status.ota_run = i;
-					fota_status.update_status[i-1].check_delta = ERROR;
-					fota_status.update_status[i-1].check_rom= WAIT;
-					fota_status.update_status[i-1].update_result= ERROR;
-				}
-			}
-            fota_status.update_result = ERROR;
-			save_fota_status();
-            lynq_fota_release_wake_lock();
-	        return -1;
-	    }
-	}
-	
-	
-
-	
-	
-	if(da_head.full_sys>0) {
-	
-        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE;
-
-        if(current_slot==SLOT_B) {
-            system("flash_eraseall /dev/disk/by-partlabel/system_a");
-        } else {
-            system("flash_eraseall /dev/disk/by-partlabel/system_b");
-        }
-	    
-		if(current_slot==SLOT_B) {
-	        fd_system_a = mtk_device_wrap_open(DEV_SYSTEM_A,O_RDWR);
-            if (fd_system_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_system_a;
-		}else{
-	        fd_system_b = mtk_device_wrap_open(DEV_SYSTEM_B,O_RDWR);
-            if (fd_system_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_system_b;			
-		}
-        fota_status.ota_run = FULL_SYSTEM;
-        save_fota_status();
-		
-		retry_cnt = 0;
-               RLOGD("+[UA]: Start upgrading system full.\n");
-        do{
-            status = delta_copyto_nand(delta_offset,da_head.full_sys);
-
-            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_sys,digest_s);
-            ROCK_SHA_FILE(fd_curr,0,da_head.full_sys,digest_t);
-            retry_cnt++;
-        }while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
-		
-		mtk_device_wrap_close(fd_curr);
-		
-                RLOGD("+[UA]: system full retry_cnt = %d\n",retry_cnt);
-        
-		if (retry_cnt>3) {
-		    if (status == 0) {
-				status = retry_cnt;
-			}
-			if(current_slot==SLOT_B) {
-			    nand_copyto_nand(DEV_SYSTEM_B,DEV_SYSTEM_A);
-			}
-		    else{
-				nand_copyto_nand(DEV_SYSTEM_A,DEV_SYSTEM_B);
-			}
-		}
-		
-                RLOGD("+[UA]: system full upgrade result:%d\n",status);
-
-		fota_status.update_result = status;
-		fota_status.update_status[FULL_SYSTEM-1].update_result = status;
-		save_fota_status();
-
-		if (status != 0)
-		{
-
-		    up_info.fota_flag[0] = 'e';
-	        up_info.fota_flag[1] = 'n';
-	        up_info.fota_flag[2] = 'd';
-	        up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-			write(fd_update_status, &up_info,sizeof(up_info));
-			sync();
-			close(fd_update_status);
-            lynq_fota_release_wake_lock();
-            return status;
-		}		
-		
-	
-	}
-	
-	
-	
-	if(da_head.full_boot>0) {
-	
-        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys;
-
-        if(current_slot==SLOT_B) {
-            system("flash_eraseall /dev/disk/by-partlabel/boot_a");
-        } else {
-            system("flash_eraseall /dev/disk/by-partlabel/boot_b");
-        }
-	    
-		if(current_slot==SLOT_B) {
-	        fd_boot_a = mtk_device_wrap_open(DEV_BOOT_A,O_RDWR);
-            if (fd_boot_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_boot_a;
-		}else{
-	        fd_boot_b = mtk_device_wrap_open(DEV_BOOT_B,O_RDWR);
-            if (fd_boot_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_boot_b;					
-		}
-		fota_status.ota_run = FULL_BOOT;
-        save_fota_status();
-        retry_cnt = 0;
-                RLOGD("+[UA]: Start upgrading boot full.\n");
-        do{
-            status = delta_copyto_nand(delta_offset,da_head.full_boot);
-            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_boot,digest_s);
-            ROCK_SHA_FILE(fd_curr,0,da_head.full_boot,digest_t);
-            retry_cnt++;
-		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
-		
-                RLOGD("+[UA]: boot full retry_cnt = %d\n",retry_cnt);
-		mtk_device_wrap_close(fd_curr);
-		
-		if (retry_cnt>3) {
-		    if (status == 0) {
-				status = retry_cnt;
-			}
-			if(current_slot==SLOT_B) {
-			    nand_copyto_nand(DEV_BOOT_B,DEV_BOOT_A);
-			}
-		    else{
-				nand_copyto_nand(DEV_BOOT_A,DEV_BOOT_B);
-			}
-		}
-		
-		
-                RLOGD("+[UA]: boot full upgrade result:%d\n",status);
-		fota_status.update_result = status;
-		fota_status.update_status[FULL_BOOT-1].update_result = status;
-		save_fota_status();
-		
-
-		if (status != 0)
-		{
-
-		    up_info.fota_flag[0] = 'e';
-	        up_info.fota_flag[1] = 'n';
-	        up_info.fota_flag[2] = 'd';
-	        up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-			write(fd_update_status, &up_info,sizeof(up_info));
-			sync();
-			close(fd_update_status);
-            lynq_fota_release_wake_lock();
-            return status;
-		}			
-	
-	}
-	
-	
-	if(da_head.full_tee>0) {
-	
-        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_boot;
-
-        if(current_slot==SLOT_B) {
-            system("flash_eraseall /dev/disk/by-partlabel/tee_a");
-        } else {
-            system("flash_eraseall /dev/disk/by-partlabel/tee_b");
-        }
-	    
-		if(current_slot==SLOT_B) {
-	        fd_tee_a = mtk_device_wrap_open(DEV_TEE_A,O_RDWR);
-            if (fd_tee_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_tee_a;
-		}else{
-	        fd_tee_b = mtk_device_wrap_open(DEV_TEE_B,O_RDWR);
-            if (fd_tee_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_tee_b;			
-		}
-		fota_status.ota_run = FULL_TEE;
-        save_fota_status();
-        retry_cnt = 0;
-                RLOGD("+[UA]: Start upgrading tee full.\n");
-        do{
-            status = delta_copyto_nand(delta_offset,da_head.full_tee);
-            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_tee,digest_s);
-            ROCK_SHA_FILE(fd_curr,0,da_head.full_tee,digest_t);
-            retry_cnt++;
-		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
-		mtk_device_wrap_close(fd_curr);
-                RLOGD("+[UA]: tee full retry_cnt = %d\n",retry_cnt);		
-		if (retry_cnt>3) {
-		    if (status == 0) {
-				status = retry_cnt;
-			}
-			if(current_slot==SLOT_B) {
-			    nand_copyto_nand(DEV_TEE_B,DEV_TEE_A);
-			}
-		    else{
-				nand_copyto_nand(DEV_TEE_A,DEV_TEE_B);
-			}
-		}
-		
-                RLOGD("+[UA] tee full upgrade result:%d\n",status);
-		fota_status.update_result = status;
-		fota_status.update_status[FULL_TEE-1].update_result = status;
-		save_fota_status();
-
-		if (status != 0)
-		{
-
-		    up_info.fota_flag[0] = 'e';
-	        up_info.fota_flag[1] = 'n';
-	        up_info.fota_flag[2] = 'd';
-	        up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-			write(fd_update_status, &up_info,sizeof(up_info));
-			sync();
-			close(fd_update_status);
-            lynq_fota_release_wake_lock();
-            return status;
-		}		
-
-	
-	}
-	
-
-	if(da_head.full_md1img>0) {
-	
-        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_boot + da_head.full_tee;
-
-        if(current_slot==SLOT_B) {
-            system("flash_eraseall /dev/disk/by-partlabel/md1img_a");
-        } else {
-            system("flash_eraseall /dev/disk/by-partlabel/md1img_b");
-        }
-	    
-		if(current_slot==SLOT_B) {
-	        fd_md1img_a = mtk_device_wrap_open(DEV_MD1IMG_A,O_RDWR);
-            if (fd_md1img_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_md1img_a;
-		}else{
-	        fd_md1img_b = mtk_device_wrap_open(DEV_MD1IMG_B,O_RDWR);
-            if (fd_md1img_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_md1img_b;			
-		}
-		fota_status.ota_run = FULL_MD1IMG;
-        save_fota_status();
-        retry_cnt = 0;
-                RLOGD("+[UA]: Start upgrading md1img full.\n");
-        do{
-            status = delta_copyto_nand(delta_offset,da_head.full_md1img);
-            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_md1img,digest_s);
-            ROCK_SHA_FILE(fd_curr,0,da_head.full_md1img,digest_t);
-            retry_cnt++;
-		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
-		mtk_device_wrap_close(fd_curr);
-		
-                RLOGD("+[UA]: md1img full retry_cnt = %d\n",retry_cnt);
-		if (retry_cnt>3) {
-		    if (status == 0) {
-				status = retry_cnt;
-			}
-			if(current_slot==SLOT_B) {
-			    nand_copyto_nand(DEV_MD1IMG_B,DEV_MD1IMG_A);
-			}
-		    else{
-				nand_copyto_nand(DEV_MD1IMG_A,DEV_MD1IMG_B);
-			}
-		}
-				
-                RLOGD("+[UA]: md1img upgrade result:%d\n",status);
-		fota_status.update_result = status;
-		fota_status.update_status[FULL_MD1IMG-1].update_result = status;
-		save_fota_status();
-
-		if (status != 0)
-		{
-
-		    up_info.fota_flag[0] = 'e';
-	        up_info.fota_flag[1] = 'n';
-	        up_info.fota_flag[2] = 'd';
-	        up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-			write(fd_update_status, &up_info,sizeof(up_info));
-			sync();
-			close(fd_update_status);
-            lynq_fota_release_wake_lock();
-            return status;
-		}
-		
-	
-	}
-		
-	
-	if(da_head.full_md1dsp>0) {
-	
-        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_boot + da_head.full_tee + da_head.full_md1img;
-
-        if(current_slot==SLOT_B) {
-            system("flash_eraseall /dev/disk/by-partlabel/md1dsp_a");
-        } else {
-            system("flash_eraseall /dev/disk/by-partlabel/md1dsp_b");
-        }
-	    
-		if(current_slot==SLOT_B) {
-	        fd_md1dsp_a = mtk_device_wrap_open(DEV_MD1DSP_A,O_RDWR);
-            if (fd_md1dsp_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_md1dsp_a;
-		}else{
-	        fd_md1dsp_b = mtk_device_wrap_open(DEV_MD1DSP_B,O_RDWR);
-            if (fd_md1dsp_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_md1dsp_b;			
-		}
-		fota_status.ota_run = FULL_MD1DSP;
-        save_fota_status();
-        retry_cnt = 0;
-                RLOGD("+[UA]: Start upgrading md1dsp full.\n");
-        do{
-            status = delta_copyto_nand(delta_offset,da_head.full_md1dsp);
-            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_md1dsp,digest_s);
-            ROCK_SHA_FILE(fd_curr,0,da_head.full_md1dsp,digest_t);
-            retry_cnt++;
-		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
-		mtk_device_wrap_close(fd_curr);
-		
-                RLOGD("+[UA]: md1dsp full retry_cnt = %d\n",retry_cnt);
-		if (retry_cnt>3) {
-		    if (status == 0) {
-				status = retry_cnt;
-			}
-			if(current_slot==SLOT_B) {
-			    nand_copyto_nand(DEV_MD1DSP_B,DEV_MD1DSP_A);
-			}
-		    else{
-				nand_copyto_nand(DEV_MD1DSP_A,DEV_MD1DSP_B);
-			}
-		}
-				
-                RLOGD("+[UA]: md1dsp upgrade result:%d\n",status);
-		fota_status.update_result = status;
-		fota_status.update_status[FULL_MD1DSP-1].update_result = status;
-		save_fota_status();
-
-		if (status != 0)
-		{
-
-		    up_info.fota_flag[0] = 'e';
-	        up_info.fota_flag[1] = 'n';
-	        up_info.fota_flag[2] = 'd';
-	        up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-			write(fd_update_status, &up_info,sizeof(up_info));
-			sync();
-			close(fd_update_status);
-            lynq_fota_release_wake_lock();
-            return status;
-		}
-		
-	
-	}
-	
-	
-	if(da_head.full_vbmeta>0) {
-	
-        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_tee  + da_head.full_boot + da_head.full_md1img + da_head.full_md1dsp;
-
-        if(current_slot==SLOT_B) {
-            system("flash_eraseall /dev/disk/by-partlabel/vbmeta_a");
-        } else {
-            system("flash_eraseall /dev/disk/by-partlabel/vbmeta_b");
-        }
-	    
-		if(current_slot==SLOT_B) {
-	        fd_vbmeta_a = mtk_device_wrap_open(DEV_VBMETA_A,O_RDWR);
-            if (fd_vbmeta_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_vbmeta_a;
-		}else{
-	        fd_vbmeta_b = mtk_device_wrap_open(DEV_VBMETA_B,O_RDWR);
-            if (fd_vbmeta_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_vbmeta_b;			
-		}
-		fota_status.ota_run = FULL_VBMETA;
-        save_fota_status();
-        retry_cnt = 0;
-                RLOGD("+[UA]: Start upgrading vbmeta full.\n");
-        do{
-            status = delta_copyto_nand(delta_offset,da_head.full_vbmeta);
-            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_vbmeta,digest_s);
-            ROCK_SHA_FILE(fd_curr,0,da_head.full_vbmeta,digest_t);
-            retry_cnt++;
-		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
-		mtk_device_wrap_close(fd_curr);
-		
-                RLOGD("+[UA]: vbmeta full retry_cnt = %d\n",retry_cnt);
-		if (retry_cnt>3) {
-		    if (status == 0) {
-				status = retry_cnt;
-			}
-			if(current_slot==SLOT_B) {
-			    nand_copyto_nand(DEV_VBMETA_B,DEV_VBMETA_A);
-			}
-		    else{
-				nand_copyto_nand(DEV_VBMETA_A,DEV_VBMETA_B);
-			}
-		}
-				
-                RLOGD("+[UA]: vbmeta upgrade result:%d\n",status);
-		fota_status.update_result = status;
-		fota_status.update_status[FULL_VBMETA-1].update_result = status;
-		save_fota_status();
-
-		if (status != 0)
-		{
-
-		    up_info.fota_flag[0] = 'e';
-	        up_info.fota_flag[1] = 'n';
-	        up_info.fota_flag[2] = 'd';
-	        up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-			write(fd_update_status, &up_info,sizeof(up_info));
-			sync();
-			close(fd_update_status);
-            lynq_fota_release_wake_lock();
-            return status;
-		}
-		
-	
-	}	
-
-	if(da_head.full_oemapp>0) {
-	
-	    delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_tee  + da_head.full_boot + da_head.full_md1img + da_head.full_md1dsp + da_head.full_vbmeta;
-
-        if(current_slot==SLOT_B) {
-            system("flash_eraseall /dev/disk/by-partlabel/oemapp_a");
-        } else {
-            system("flash_eraseall /dev/disk/by-partlabel/oemapp_b");
-        }
-
-		if(current_slot==SLOT_B) {
-	        fd_oemapp_a = mtk_device_wrap_open(DEV_OEMAPP_A,O_RDWR);
-            if (fd_oemapp_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_oemapp_a;
-		}else{
-	        fd_oemapp_b = mtk_device_wrap_open(DEV_OEMAPP_B,O_RDWR);
-            if (fd_oemapp_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_oemapp_b;			
-		}
-        fota_status.ota_run = FULL_OEMAPP;
-        save_fota_status();
-        retry_cnt = 0;
-                RLOGD("+[UA]: Start upgrading oemapp full.\n");
-        do {       
-		    status = delta_copyto_nand(delta_offset,da_head.full_oemapp);
-		    ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_oemapp,digest_s);
-		    ROCK_SHA_FILE(fd_curr,0,da_head.full_oemapp,digest_t);
-		    retry_cnt++;
-		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
-		mtk_device_wrap_close(fd_curr);
-
-                RLOGD("+[UA]: oemapp full retry_cnt = %d\n",retry_cnt);
-		if (retry_cnt>3) {
-		    if (status == 0) {
-				status = retry_cnt;
-			}
-			if(current_slot==SLOT_B) {
-			    nand_copyto_nand(DEV_OEMAPP_B,DEV_OEMAPP_A);
-			}
-		    else{
-			    nand_copyto_nand(DEV_OEMAPP_A,DEV_OEMAPP_B);
-			}
-		}
-
-                RLOGD("+[UA]: oemapp upgrade result:%d\n",status);
-		fota_status.update_result = status;
-		fota_status.update_status[FULL_OEMAPP-1].update_result = status;
-		save_fota_status();
-
-		if (status != 0)
-		{
-            up_info.fota_flag[0] = 'e';
-            up_info.fota_flag[1] = 'n';
-            up_info.fota_flag[2] = 'd';
-            up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-            write(fd_update_status, &up_info,sizeof(up_info));
-            sync();
-            close(fd_update_status);
-            lynq_fota_release_wake_lock();
-            return status;
-		}
-
-	}
-
-	if(da_head.full_oemapp2>0) {
-
-	    delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_tee  + da_head.full_boot + da_head.full_md1img + da_head.full_md1dsp + da_head.full_vbmeta + da_head.full_oemapp;
-
-
-        if(current_slot==SLOT_B) {
-            system("flash_eraseall /dev/disk/by-partlabel/oemapp2_a");
-        } else {
-            system("flash_eraseall /dev/disk/by-partlabel/oemapp2_b");
-        }
-
-		if(current_slot==SLOT_B) {
-	        fd_oemapp2_a = mtk_device_wrap_open(DEV_OEMAPP2_A,O_RDWR);
-            if (fd_oemapp2_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_oemapp2_a;
-		}else{
-	        fd_oemapp2_b = mtk_device_wrap_open(DEV_OEMAPP2_B,O_RDWR);
-            if (fd_oemapp2_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-		    fd_curr = fd_oemapp2_b;
-		}
-		fota_status.ota_run = FULL_OEMAPP2;
-        save_fota_status();
-        retry_cnt = 0;
-                RLOGD("+[UA]: Start upgrading oemapp2 full.\n");
-        do {
-		    status = delta_copyto_nand(delta_offset,da_head.full_oemapp2);
-		    ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_oemapp2,digest_s);
-		    ROCK_SHA_FILE(fd_curr,0,da_head.full_oemapp2,digest_t);
-		    retry_cnt++;
-		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
-		mtk_device_wrap_close(fd_curr);
-        RLOGD("+[UA]: oemapp2 full retry_cnt = %d\n",retry_cnt);
-		if (retry_cnt>3) {
-		    if (status == 0) {
-				status = retry_cnt;
-			}
-			if(current_slot==SLOT_B) {
-			    nand_copyto_nand(DEV_OEMAPP2_B,DEV_OEMAPP2_A);
-			}
-		    else{
-			    nand_copyto_nand(DEV_OEMAPP2_A,DEV_OEMAPP2_B);
-			}
-		}		
-                RLOGD("+[UA]: oemapp2 upgrade result:%d\n",status);
-		fota_status.update_result = status;
-		fota_status.update_status[FULL_OEMAPP2-1].update_result = status;
-		save_fota_status();
-
-		if (status != 0)
-		{
-            up_info.fota_flag[0] = 'e';
-            up_info.fota_flag[1] = 'n';
-            up_info.fota_flag[2] = 'd';
-            up_info.update_result = status;
-            up_info.ota_run = 0;
-            lseek(fd_update_status,0,SEEK_SET);
-            write(fd_update_status, &up_info,sizeof(up_info));
-            sync();
-            close(fd_update_status);
-            lynq_fota_release_wake_lock();
-            return status;
-		}
-	}
-    
-	if(da_head.full_bl33>0) {
-		
-	}
-
-
-
-    if(update_mode == MODE_NORMAL){ //need A VS B
-	    if(current_slot == SLOT_A) {
-
-	        up_info.fota_flag[0] = 'B';
-	        up_info.fota_flag[1] = '-';
-	        up_info.fota_flag[2] = 'A';		
-		
-		}else{
-			
-	        up_info.fota_flag[0] = 'A';
-	        up_info.fota_flag[1] = '-';
-	        up_info.fota_flag[2] = 'B';	
-			
-		}
-	
-	}else{
-	    up_info.fota_flag[0] = 'e';
-	    up_info.fota_flag[1] = 'n';
-	    up_info.fota_flag[2] = 'd';		
-		
-	}
-
-
-    up_info.update_result = status;
-    up_info.ota_run = 0;
-    lseek(fd_update_status,0,SEEK_SET);       
-    write(fd_update_status, &up_info,sizeof(up_info));
-    sync();
-           
-    close_dev_fd(fd_delta);
-
-    //close_dev_fd(fd_curr);
-	
-
-	
-    close(fd_update_status);
-    sync();
-	
-
-    slot = (current_slot == 0) ? 1 : 0;
-	
-    RLOGD("+[UA]: slot SLOT = %d\n",slot);
-    
-    module->setActiveBootSlot(module,slot);
-    RLOGD("+[UA]: upgrade is success!!!!\n");
-
-    fota_status.ota_run = 0;
-    fota_status.switch_slot = PASS;
-    fota_status.update_result = status;
-    save_fota_status();
-    sleep(5);
-    sync();
-    sleep(5);
-    lynq_fota_release_wake_lock();
-    return status;
+    return ret;
 }
 
 /**
@@ -4777,3 +3175,4 @@
  * @brief This is the wake up call
  * end
  */
+
diff --git a/src/lynq/lib/liblynq-fota/rock_ua/sha.c b/src/lynq/lib/liblynq-fota/rock_ua/sha.c
index bdb29de..ce52383 100755
--- a/src/lynq/lib/liblynq-fota/rock_ua/sha.c
+++ b/src/lynq/lib/liblynq-fota/rock_ua/sha.c
@@ -342,7 +342,11 @@
         else
         {
             size = read(fd_sha,data,totale_size_common);
-        }    
+        } 
+		if(size==0){
+		    
+			break;
+		}		
         SHA_update(&ctx, data, size);
         totale_size_common -= size;