diff --git a/src/lynq/lib/liblynq-fota/include/iot_rock.h b/src/lynq/lib/liblynq-fota/include/iot_rock.h
index 3fe2427..aa7236d 100755
--- a/src/lynq/lib/liblynq-fota/include/iot_rock.h
+++ b/src/lynq/lib/liblynq-fota/include/iot_rock.h
@@ -26,16 +26,20 @@
 #define PATCH_MD1IMG   (4)
 #define PATCH_MD1DSP   (5)
 #define PATCH_VBMETA   (6)
-#define PATCH_BL33     (7)
-#define FULL_SYSTEM    (8)
-#define FULL_BOOT      (9)
-#define FULL_TEE       (10)
-#define FULL_MD1IMG    (11)
-#define FULL_MD1DSP    (12) 
-#define FULL_VBMETA    (13)
-#define FULL_BL33      (14)
+#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 MAX_OTA_ROLE   (14) 
+#define MAX_OTA_ROLE   (18) 
 
 
 
@@ -70,6 +74,8 @@
     unsigned int md1img;	//md1img    差分包大小
 	unsigned int md1dsp;   //md1dsp   差分包大小
     unsigned int vbmeta;   //vbmeta   差分包大小	
+    unsigned int oemapp;
+    unsigned int oemapp2;
     unsigned int bl33;	//bl33   差分包大小
 	unsigned int full_sys;	//system 整包大小
 	unsigned int full_boot;	//boot   
@@ -77,7 +83,9 @@
     unsigned int full_md1img;	//    整包大小
     unsigned int full_md1dsp;	//md1dsp   整包大小
 	unsigned int full_vbmeta;	//vbmeta  整包大小
-	unsigned int full_bl33;	//bl33   整包大小
+    unsigned int full_oemapp;
+    unsigned int full_oemapp2;
+    unsigned int full_bl33;	//bl33   整包大小
 } DELTA_HEAD;
 
 typedef struct {
@@ -113,7 +121,7 @@
 
 //#define DELTA_HEARD_SIZE	(4*5)
 
-#define DELTA_HEARD_SIZE	    (4*7 + 4*7)
+#define DELTA_HEARD_SIZE	    (4*9 + 4*9)
 #define DELTA_FULL_HEARD_SIZE   8
 
 
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 d31a0d9..718255c 100755
--- a/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c
+++ b/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c
@@ -57,6 +57,12 @@
 #define DEV_VBMETA_A       "/dev/disk/by-partlabel/vbmeta_a"
 #define DEV_VBMETA_B       "/dev/disk/by-partlabel/vbmeta_b" 
 
+#define DEV_OEMAPP_A       "/dev/disk/by-partlabel/oemapp_a"
+#define DEV_OEMAPP_B       "/dev/disk/by-partlabel/oemapp_b" 
+
+#define DEV_OEMAPP2_A       "/dev/disk/by-partlabel/oemapp2_a"
+#define DEV_OEMAPP2_B       "/dev/disk/by-partlabel/oemapp2_b" 
+
 #define DEV_BL2         "/dev/disk/by-partlabel/bl2"
 #define DEV_BL33        "/dev/disk/by-partlabel/bl33"
 
@@ -93,7 +99,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;
+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_write,fd_read;
 
 static unsigned int  delta_offset = 0;
@@ -613,8 +619,8 @@
 	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.bl33=%d\n", da_head.sys, da_head.boot,da_head.tee,da_head.md1img,da_head.md1dsp,da_head.vbmeta,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.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_bl33);
+    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) {
@@ -635,6 +641,12 @@
 	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;
 	}
@@ -660,10 +672,16 @@
 	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.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.bl33;
 	
 
     if ((da_head.sys>0) && (up_info.ota_run <= PATCH_SYSTEM))
@@ -1423,11 +1441,246 @@
 
     }
 
+	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;
+       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) 
 		{
@@ -1448,13 +1701,13 @@
         }
 	    fd_curr = fd_bl33;
 
-		fota_status.ota_run = PATCH_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;
+        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);
@@ -1464,7 +1717,7 @@
         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;
@@ -1475,7 +1728,7 @@
 
             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;
@@ -1484,7 +1737,7 @@
 		    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;
 		}
@@ -1493,17 +1746,16 @@
 
 		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.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);
+            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;
 		}
@@ -1517,7 +1769,7 @@
 		
     
 	
-	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_bl33>0))
+	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))
 	{
 
 	    now_patch = 0;
@@ -2032,25 +2284,179 @@
 
 		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.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);
+            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;
+                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;
+		}
+		fota_status.ota_run = FULL_OEMAPP;
+        save_fota_status();
+        retry_cnt = 0;
+		LYVERBLOG("+[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);
+
+		LYVERBLOG("+[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);
+			}
+		}
+
+		LYVERBLOG("+[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;
+                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;
+		}
+        fota_status.ota_run = FULL_OEMAPP2;
+        save_fota_status();
+        retry_cnt = 0;
+		LYVERBLOG("+[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);
+
+		LYVERBLOG("+[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);
+			}
+		}
+
+		LYVERBLOG("+[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) {
-		
+
 	}
 
 
@@ -2060,21 +2466,21 @@
 
 	        up_info.fota_flag[0] = 'B';
 	        up_info.fota_flag[1] = '-';
-	        up_info.fota_flag[2] = 'A';		
-		
+	        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.fota_flag[2] = 'd';
+
 	}
 
 
@@ -2361,8 +2767,8 @@
 	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.bl33=%d\n", da_head.sys, da_head.boot,da_head.tee,da_head.md1img,da_head.md1dsp,da_head.vbmeta,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.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_bl33);
+    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) {
@@ -2383,6 +2789,12 @@
 	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;
 	}
@@ -2408,10 +2820,16 @@
 	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.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.bl33;
 	
 
     if ((da_head.sys>0) && (up_info.ota_run <= PATCH_SYSTEM))
@@ -3171,11 +3589,246 @@
 
     }
 
+	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;
+        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) 
 		{
@@ -3265,7 +3918,7 @@
 		
     
 	
-	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_bl33>0))
+	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))
 	{
 
 	    now_patch = 0;
@@ -3721,7 +4374,7 @@
 	
 	if(da_head.full_vbmeta>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 + da_head.full_md1dsp;
+        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");
@@ -3796,7 +4449,157 @@
 		
 	
 	}	
+
+	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;
+                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;			
+		}
+        fota_status.ota_run = FULL_OEMAPP;
+        save_fota_status();
+        retry_cnt = 0;
+		LYVERBLOG("+[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);
+
+		LYVERBLOG("+[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);
+			}
+		}
+
+		LYVERBLOG("+[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;
+                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;
+		}
+		fota_status.ota_run = FULL_OEMAPP2;
+        save_fota_status();
+        retry_cnt = 0;
+		LYVERBLOG("+[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);
+        LYVERBLOG("+[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);
+			}
+		}		
+		LYVERBLOG("+[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) {
 		
 	}
