[Bugfix][API-333][FOTA]Fota interface with wakeup lock

Change-Id: I2a03c3fae1812b112609c6f3f9eb68f80f502e1f
diff --git a/src/lynq/lib/liblynq-fota/makefile b/src/lynq/lib/liblynq-fota/makefile
index b460dbc..4fe83ea 100755
--- a/src/lynq/lib/liblynq-fota/makefile
+++ b/src/lynq/lib/liblynq-fota/makefile
@@ -2,9 +2,14 @@
 RM = rm -f
 
 LOCAL_CFLAGS := -Wall \
-                -Os \
+                -g -Os \
                 -flto \
                 -fpermissive \
+                -DRIL_SHLIB \
+                -DATCI_PARSE \
+                -DKEEP_ALIVE \
+                -D__LINUX_OS__ \
+                -DECALL_SUPPORT
 
 CFLAGS += -fPIC -O2 $(INCLUDE) -D_LARGEFILE64_SOURCE
 
@@ -26,6 +31,8 @@
 LOCAL_LIBS := \
     -L. \
     -L./lib \
+    -ldl \
+    -lpthread \
     -llog \
     -lstdc++ \
     -liotpatch \
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 8a80ac2..9252126 100755
--- a/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c
+++ b/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c
@@ -17,6 +17,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <dlfcn.h>
 //#include <hardware/hardware.h>
 
 //#define off64_t __off64_t
@@ -108,6 +109,9 @@
 extern const hw_module_t HAL_MODULE_INFO_SYM;
 boot_control_module_t* module;
 
+static void lynq_init_wake_lock_func(void);
+static void lynq_fota_grab_artial_wake_lock(void);
+static void lynq_fota_release_wake_lock(void);
 
 int rock_mismatch(void* ctx, unsigned char* buf, unsigned int start, unsigned int size, 
 					        unsigned int source_hash,unsigned int target_hash) {
@@ -547,6 +551,9 @@
         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);
@@ -571,6 +578,7 @@
     if(0 != init_dev_fd())
     {
         LYVERBLOG("+[UA]: get fota addr error\n");
+        lynq_fota_release_wake_lock();
         return E_ROCK_FOTA_ADDR;
     }
 
@@ -715,6 +723,7 @@
             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;
@@ -723,6 +732,7 @@
             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;			
@@ -799,6 +809,7 @@
 			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);
@@ -837,6 +848,7 @@
             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;
@@ -845,6 +857,7 @@
             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;			
@@ -922,6 +935,7 @@
 			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);
@@ -960,6 +974,7 @@
             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;
@@ -968,6 +983,7 @@
             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;			
@@ -1040,6 +1056,7 @@
 			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);
@@ -1077,6 +1094,7 @@
             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;
@@ -1085,6 +1103,7 @@
             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;			
@@ -1157,6 +1176,7 @@
 			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);
@@ -1194,6 +1214,7 @@
             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;
@@ -1202,6 +1223,7 @@
             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;			
@@ -1275,7 +1297,8 @@
 			sync();
 			close(fd_update_status);
 	        mtk_device_wrap_close(fd_read);
-			mtk_device_wrap_close(fd_write); 
+			mtk_device_wrap_close(fd_write);
+            lynq_fota_release_wake_lock();
             return status;
 		}
         mtk_device_wrap_close(fd_read);
@@ -1312,6 +1335,7 @@
             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;
@@ -1320,6 +1344,7 @@
             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;			
@@ -1391,7 +1416,8 @@
 			sync();
 			close(fd_update_status);
 	        mtk_device_wrap_close(fd_read);
-			mtk_device_wrap_close(fd_write); 
+			mtk_device_wrap_close(fd_write);
+            lynq_fota_release_wake_lock();
             return status;
 		}
         mtk_device_wrap_close(fd_read);
@@ -1420,6 +1446,7 @@
         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;
@@ -1480,6 +1507,7 @@
 	        mtk_device_wrap_close(fd_curr);
 			sync();
 			close(fd_update_status);
+            lynq_fota_release_wake_lock();
             return status;
 		}
         mtk_device_wrap_close(fd_curr);
@@ -1505,6 +1533,7 @@
 	    if (lseek(fd_delta, DELTA_HEARD_SIZE + delta_size, SEEK_SET) < 0) {
             err = errno;
             LYERRLOG("+[UA]: mtk_device_wrap_seek df_delta err\n");
+            lynq_fota_release_wake_lock();
 		    return -1;
         }
 		
@@ -1534,6 +1563,7 @@
 			}
             fota_status.update_result = ERROR;
 			save_fota_status();
+            lynq_fota_release_wake_lock();
 	        return -1;
 	    }
 	}
@@ -1551,6 +1581,7 @@
             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;
@@ -1559,6 +1590,7 @@
             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;			
@@ -1610,6 +1642,7 @@
 			write(fd_update_status, &up_info,sizeof(up_info));
 			sync();
 			close(fd_update_status);
+            lynq_fota_release_wake_lock();
             return status;
 		}		
 		
@@ -1627,6 +1660,7 @@
             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;
@@ -1635,6 +1669,7 @@
             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;					
@@ -1684,6 +1719,7 @@
 			write(fd_update_status, &up_info,sizeof(up_info));
 			sync();
 			close(fd_update_status);
+            lynq_fota_release_wake_lock();
             return status;
 		}			
 	
@@ -1699,6 +1735,7 @@
             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;
@@ -1707,6 +1744,7 @@
             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;			
@@ -1752,6 +1790,7 @@
 			write(fd_update_status, &up_info,sizeof(up_info));
 			sync();
 			close(fd_update_status);
+            lynq_fota_release_wake_lock();
             return status;
 		}		
 
@@ -1768,6 +1807,7 @@
             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;
@@ -1776,6 +1816,7 @@
             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;			
@@ -1822,6 +1863,7 @@
 			write(fd_update_status, &up_info,sizeof(up_info));
 			sync();
 			close(fd_update_status);
+            lynq_fota_release_wake_lock();
             return status;
 		}
 		
@@ -1838,6 +1880,7 @@
             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;
@@ -1846,6 +1889,7 @@
             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;			
@@ -1892,6 +1936,7 @@
 			write(fd_update_status, &up_info,sizeof(up_info));
 			sync();
 			close(fd_update_status);
+            lynq_fota_release_wake_lock();
             return status;
 		}
 		
@@ -1908,6 +1953,7 @@
             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;
@@ -1916,6 +1962,7 @@
             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;			
@@ -1962,6 +2009,7 @@
 			write(fd_update_status, &up_info,sizeof(up_info));
 			sync();
 			close(fd_update_status);
+            lynq_fota_release_wake_lock();
             return status;
 		}
 		
@@ -2026,12 +2074,13 @@
 	fota_status.switch_slot = PASS;
 	fota_status.update_result = status;
     save_fota_status();
-
+    
+    lynq_fota_release_wake_lock();
+    
 	if(update_mode==MODE_NORMAL){
 	reboot_device();
 	}	
 	
-	
 	return status;
 }
 
@@ -2214,6 +2263,9 @@
         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);
@@ -2238,6 +2290,7 @@
     if(0 != init_dev_fd())
     {
         LYVERBLOG("+[UA]: get fota addr error\n");
+        lynq_fota_release_wake_lock();
         return E_ROCK_FOTA_ADDR;
     }
 
@@ -2382,6 +2435,7 @@
             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;
@@ -2390,6 +2444,7 @@
             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;			
@@ -2465,7 +2520,8 @@
 			
 			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);
@@ -2504,6 +2560,7 @@
             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;
@@ -2512,6 +2569,7 @@
             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;			
@@ -2588,7 +2646,8 @@
             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);
@@ -2627,6 +2686,7 @@
             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;
@@ -2635,6 +2695,7 @@
             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;			
@@ -2707,6 +2768,7 @@
 			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);
@@ -2744,6 +2806,7 @@
             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;
@@ -2752,6 +2815,7 @@
             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;			
@@ -2824,6 +2888,7 @@
 			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);
@@ -2861,6 +2926,7 @@
             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;
@@ -2869,6 +2935,7 @@
             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;			
@@ -2942,7 +3009,8 @@
 			sync();
 			close(fd_update_status);
 	        mtk_device_wrap_close(fd_read);
-			mtk_device_wrap_close(fd_write); 
+			mtk_device_wrap_close(fd_write);
+            lynq_fota_release_wake_lock();
             return status;
 		}
         mtk_device_wrap_close(fd_read);
@@ -2979,6 +3047,7 @@
             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;
@@ -2987,6 +3056,7 @@
             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;			
@@ -3058,7 +3128,8 @@
 			sync();
 			close(fd_update_status);
 	        mtk_device_wrap_close(fd_read);
-			mtk_device_wrap_close(fd_write); 
+			mtk_device_wrap_close(fd_write);
+            lynq_fota_release_wake_lock();
             return status;
 		}
         mtk_device_wrap_close(fd_read);
@@ -3087,6 +3158,7 @@
         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;
@@ -3147,6 +3219,7 @@
 	        mtk_device_wrap_close(fd_curr);
 			sync();
 			close(fd_update_status);
+            lynq_fota_release_wake_lock();
             return status;
 		}
         mtk_device_wrap_close(fd_curr);
@@ -3172,6 +3245,7 @@
 	    if (lseek(fd_delta, DELTA_HEARD_SIZE + delta_size, SEEK_SET) < 0) {
             err = errno;
             LYERRLOG("+[UA]: mtk_device_wrap_seek df_delta err\n");
+            lynq_fota_release_wake_lock();
 		    return -1;
         }
 		
@@ -3201,6 +3275,7 @@
 			}
             fota_status.update_result = ERROR;
 			save_fota_status();
+            lynq_fota_release_wake_lock();
 	        return -1;
 	    }
 	}
@@ -3218,6 +3293,7 @@
             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;
@@ -3226,6 +3302,7 @@
             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;			
@@ -3277,6 +3354,7 @@
 			write(fd_update_status, &up_info,sizeof(up_info));
 			sync();
 			close(fd_update_status);
+            lynq_fota_release_wake_lock();
             return status;
 		}		
 		
@@ -3294,6 +3372,7 @@
             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;
@@ -3302,6 +3381,7 @@
             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;					
@@ -3351,6 +3431,7 @@
 			write(fd_update_status, &up_info,sizeof(up_info));
 			sync();
 			close(fd_update_status);
+            lynq_fota_release_wake_lock();
             return status;
 		}			
 	
@@ -3366,6 +3447,7 @@
             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;
@@ -3374,6 +3456,7 @@
             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;			
@@ -3419,6 +3502,7 @@
 			write(fd_update_status, &up_info,sizeof(up_info));
 			sync();
 			close(fd_update_status);
+            lynq_fota_release_wake_lock();
             return status;
 		}		
 
@@ -3435,6 +3519,7 @@
             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;
@@ -3443,6 +3528,7 @@
             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;			
@@ -3489,6 +3575,7 @@
 			write(fd_update_status, &up_info,sizeof(up_info));
 			sync();
 			close(fd_update_status);
+            lynq_fota_release_wake_lock();
             return status;
 		}
 		
@@ -3505,6 +3592,7 @@
             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;
@@ -3513,6 +3601,7 @@
             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;			
@@ -3559,6 +3648,7 @@
 			write(fd_update_status, &up_info,sizeof(up_info));
 			sync();
 			close(fd_update_status);
+            lynq_fota_release_wake_lock();
             return status;
 		}
 		
@@ -3575,6 +3665,7 @@
             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;
@@ -3583,6 +3674,7 @@
             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;			
@@ -3629,6 +3721,7 @@
 			write(fd_update_status, &up_info,sizeof(up_info));
 			sync();
 			close(fd_update_status);
+            lynq_fota_release_wake_lock();
             return status;
 		}
 		
@@ -3683,7 +3776,7 @@
 	slot = (current_slot == 0) ? 1 : 0;
 	
 	LYVERBLOG("+[UA]: slot SLOT = %d\n",slot);
-	
+    
 	if(update_mode==MODE_NORMAL){
 	    module->setActiveBootSlot(module,slot);
 		LYVERBLOG("+[UA]: upgrade is success!!!!\n");
@@ -3693,7 +3786,8 @@
 	fota_status.switch_slot = PASS;
 	fota_status.update_result = status;
     save_fota_status();
-	
+
+    lynq_fota_release_wake_lock();
 	return status;
 }
 
@@ -3723,3 +3817,77 @@
 	return lynq_get_value(FOTA_UCI_FILE, FOTA_UCI_MODULE,FOTA_UCI_ADDR, tmp);
 }
 
+/**
+ * @brief The following is the wake up
+ * start
+ */
+
+#define ANDROID_WAKE_LOCK_NAME "fota-interface"
+
+void *dlHandle_wakelock;
+
+enum {
+    PARTIAL_WAKE_LOCK = 1,  // the cpu stays on, but the screen is off
+    FULL_WAKE_LOCK = 2      // the screen is also on
+};
+
+// while you have a lock held, the device will stay on at least at the
+// level you request.
+
+int (*acquire_wake_lock)(int lock, const char* id);
+int (*release_wake_lock)(const char* id);
+
+/**
+ * @brief Porting wakes up the demo content
+ */
+static void lynq_init_wake_lock_func(void)
+{
+    const char *lynqLibPath_WakeLock = "/usr/lib64/libpower.so";
+
+    dlHandle_wakelock = dlopen(lynqLibPath_WakeLock, RTLD_NOW);
+    if (dlHandle_wakelock == NULL) 
+    {
+        printf("dlopen lynqLibPath_WakeLock failed: %s", dlerror());
+        exit(EXIT_FAILURE);
+    }
+    
+    acquire_wake_lock = (int(*)(int,const char*))dlsym(dlHandle_wakelock, "acquire_wake_lock");
+    if (acquire_wake_lock == NULL) {
+        printf("acquire_wake_lock not defined or exported in %s", lynqLibPath_WakeLock);
+        exit(EXIT_FAILURE);
+    }
+    release_wake_lock = (int(*)( const char*))dlsym(dlHandle_wakelock, "release_wake_lock");
+    if (release_wake_lock == NULL) {
+        printf("release_wake_lock not defined or exported in %s", lynqLibPath_WakeLock);
+        exit(EXIT_FAILURE);
+    }
+    dlerror(); // Clear any previous dlerror
+
+  return;
+}
+
+/**
+ * @brief fota wake lock
+ * 
+ * @param1 value:void
+ * @return ;
+ */
+static void lynq_fota_grab_artial_wake_lock(void) 
+{
+    acquire_wake_lock(PARTIAL_WAKE_LOCK, ANDROID_WAKE_LOCK_NAME);
+}
+
+/**
+ * @brief get the upgrade package address
+ * 
+ * @param1 value:void
+ * @return ;
+ */
+static void lynq_fota_release_wake_lock(void) 
+{
+    release_wake_lock(ANDROID_WAKE_LOCK_NAME);
+}
+/**
+ * @brief This is the wake up call
+ * end
+ */