[Feature][task-view-564][FOTA] move the real fota functions to isolated process

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

Change-Id: I58d6e49c8bab9b8575ca2709c702ead65859b84b
diff --git a/LYNQ_PUBLIC/IC_meta/mtk/2735/liblynq-ftp-fota/liblynq-ftp-fota.bb b/LYNQ_PUBLIC/IC_meta/mtk/2735/liblynq-ftp-fota/liblynq-ftp-fota.bb
index 37e4e31..77cdebb 100755
--- a/LYNQ_PUBLIC/IC_meta/mtk/2735/liblynq-ftp-fota/liblynq-ftp-fota.bb
+++ b/LYNQ_PUBLIC/IC_meta/mtk/2735/liblynq-ftp-fota/liblynq-ftp-fota.bb
@@ -22,6 +22,7 @@
 
 FILES_${PN} = "${base_libdir}/*.so \
                ${base_bindir}\
+               ${bindir}\
                ${base_sbindir}"
 
 
diff --git a/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-ftp-fota/lib_wapper/lynq-ftp-fota-wapper.c b/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-ftp-fota/lib_wapper/lynq-ftp-fota-wapper.c
new file mode 100755
index 0000000..c48adca
--- /dev/null
+++ b/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-ftp-fota/lib_wapper/lynq-ftp-fota-wapper.c
@@ -0,0 +1,482 @@
+// 2017-07-31 carota Rock FOTA ua porting file
+
+
+#define ROCK_FOTA_SUPPORT
+
+#ifdef ROCK_FOTA_SUPPORT
+
+
+#include "iot_rock.h"
+#include "iot_rock_ipl.h"
+
+#include "base64.h"
+
+#include "sha.h"
+#include <log/log.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dlfcn.h>
+#include <stdint.h>
+#include <pthread.h>
+
+#include <hardware/boot_control.h>
+#include <hardware/hardware.h>
+#include <sys/reboot.h>
+
+
+
+#include "liblog/lynq_deflog.h"
+#include "mtk_device_wrap.h"
+#include <include/lynq_uci.h>
+
+#define ROCK_DEFAULT_BLOCK_SIZE 0x40000
+#define ROCK_RAM_LEN  (1024*1024)
+
+#define LOG_TAG "LYNQ_FOTA"
+#define ROCK_BACKUP_LEN ROCK_DEFAULT_BLOCK_SIZE
+
+
+#define FILENAME_SIZE   50
+
+#define FOTA_UCI_MODULE "lynq_fota"
+#define FOTA_UCI_FILE "lynq_uci"
+#define FOTA_UCI_ADDR "lynq_fota_addr"
+#define FOTA_UCI_STATE "lynq_fota_state"
+
+#define FILE_UPDATE_STATE  "/data/.update_status"
+#define FILE_UPDATE_FLAG   "/tmp/update_flag"
+#define FILE_FOTA_STATE    "/data/.fota_status"
+
+#define NAND_PAGE_SIZE  4096
+
+
+#define BOOTDEV_TYPE_NAND 1
+
+#define SLOT_A    0
+#define SLOT_B    1
+
+//xf.li@20230822 add for ab rollback start
+#define DEV_SYSTEM_A    "/dev/disk/by-partlabel/system_a"
+#define DEV_SYSTEM_B    "/dev/disk/by-partlabel/system_b"
+
+#define DEV_BOOT_A      "/dev/disk/by-partlabel/boot_a"
+#define DEV_BOOT_B      "/dev/disk/by-partlabel/boot_b"
+
+#define DEV_SPM_A      "/dev/disk/by-partlabel/spm_a"
+#define DEV_SPM_B      "/dev/disk/by-partlabel/spm_b"
+
+#define DEV_MD1IMG_A    "/dev/disk/by-partlabel/md1img_a"
+#define DEV_MD1IMG_B    "/dev/disk/by-partlabel/md1img_b"
+
+#define DEV_TEE_A       "/dev/disk/by-partlabel/tee_a"
+#define DEV_TEE_B       "/dev/disk/by-partlabel/tee_b" 
+
+#define DEV_VBMETA_A       "/dev/disk/by-partlabel/vbmeta_a"
+#define DEV_VBMETA_B       "/dev/disk/by-partlabel/vbmeta_b"
+
+#define DEV_BL2_A         "/dev/disk/by-partlabel/bl2_a"
+#define DEV_BL2_B         "/dev/disk/by-partlabel/bl2_b"
+
+#define DEV_BL33_A        "/dev/disk/by-partlabel/bl33_a"
+#define DEV_BL33_B        "/dev/disk/by-partlabel/bl33_b"
+
+#define DEV_MEDMCU_A        "/dev/disk/by-partlabel/medmcu_a"
+#define DEV_MEDMCU_B        "/dev/disk/by-partlabel/medmcu_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_MISC        "/dev/disk/by-partlabel/misc"
+
+#define BACKUP_UBI_NUM  31 //max ubi number
+#define MTD_SYSTEM_A 14
+#define MTD_SYSTEM_B 15
+#define MD5_RETRY_TIME 3
+#define MD5_VERFY_ERROR 5
+#define MD5_READ_BUFFER_LEN 4*1024
+#define FOTA_FIRST 0
+#define RECOVER_FIRST 1
+
+
+//int fd_system_a,fd_system_b,fd_boot_a,fd_boot_b,fd_tee_a,fd_tee_b,fd_bl2,fd_bl33,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;
+static int fd_fota_status;
+static OTA_STATUS  fota_status;
+static UPDATE_INFO up_info;
+
+int lynq_read_process(void)
+{
+    int err;
+    fd_fota_status = open(FILE_FOTA_STATE,O_RDWR | O_CREAT,0777);
+
+    if (fd_fota_status < 0) {
+        err = errno;
+        RLOGD("+[UA]: save_fota_status: Error opening metadata file: %s\n",strerror(errno));
+        return -err;
+    }
+    memset(&fota_status, 0 , sizeof(fota_status));
+    read(fd_fota_status, &fota_status,sizeof(fota_status));
+    sync();
+    close(fd_fota_status);
+    RLOGE("+[UA]: lynq_read_process : %d\n", fota_status.ota_run);
+    return fota_status.ota_run;
+}
+
+int rock_get_blocksize(void* ctx) {
+    return ROCK_DEFAULT_BLOCK_SIZE;
+}
+static int reboot_device() {
+    
+    reboot(RB_AUTOBOOT);
+
+    while (1) pause();
+}
+
+static bool check_memory(int try_count)
+{
+    FILE *fp;
+    int value;
+    char buffer[64] = {0};
+    fp = popen("free -m | grep Mem | awk '{print $7}'","r");
+    if(fgets(buffer, 63, fp) != NULL)
+    {
+        value = atoi(buffer);
+        if (value > 100)
+            return true;
+        else if (strlen(buffer) >= 0)
+            return false;
+    }
+    fclose(fp);
+    if (try_count > 0)
+    {
+        try_count --;
+        sleep(1);
+        return check_memory(try_count);
+    }
+    return false;
+}
+
+static pthread_mutex_t s_update_main_mutex;
+
+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 backup_mode)
+{
+    int ret = 0;
+    char cmd[1024] = {0};
+    RLOGE("+[UA]: cy rock_update_main\n");
+    sprintf(cmd, "lynq-ftp-fota-tool %d %d %d %d %d %d %d %d", rom_base, backup_base, backup_len, read_rom_directly, first_run, switch_slot_flag, reboot_flag, backup_mode);
+    pthread_mutex_lock(&s_update_main_mutex);
+    ret = system(cmd);
+    pthread_mutex_unlock(&s_update_main_mutex);
+    return ret;
+}
+
+static void rock_fail_handler()
+{
+    int ret = 0;
+    RLOGD("rock_fail_handler start\n");
+    //ret = rock_update_main(0, 0, 0, 0, 1, 1);
+    if(ret)
+    {
+        RLOGD("fota update fail again!\n");
+    }
+}
+
+/* main entrpoint */
+int lynq_rock_main(int first_run)
+{
+
+    int ret = 0;
+    
+#if 0
+    
+    printf("-********copy delta ***-\n");
+    test_write_delta("/data/delta",DEV_DELTA);
+
+#endif 
+    
+    ret = rock_update_main(0, 0, 0, 0, first_run, 1, 1, 1);
+    RLOGD("rock_update_main ret = %d\n", ret);
+    if(ret)
+    {
+        RLOGD("fota update fail!\n");
+    }
+    return ret;
+}
+
+#endif
+
+//xf.li@20230403 add for verfy start
+int lynq_file_md5_verfy(char *source, unsigned char *source_md5, char *target)
+{
+    int fd, size, ret, is_system = 0;
+    int need_copy = 1;
+    int system_mtd_num = 0;
+    int system_ubi_num = BACKUP_UBI_NUM;//max ubi number
+    char cmd_ubi_attach[128] = {0};
+    char cmd_ubi_detach[128] = {0};
+    char md5_target_file_patch[128] = {0};
+
+    RLOGD("in lynq_file_md5_verfy, source:%s, target:%s\n", source, target);
+    if(strcmp(source, DEV_SYSTEM_A) == 0 || strcmp(source, DEV_SYSTEM_B) == 0)
+    {
+        RLOGD("verfy system.img\n");
+        is_system = 1;
+        if(strcmp(source, DEV_SYSTEM_A) == 0)
+        {
+            system_mtd_num = MTD_SYSTEM_B;
+        }
+        else if(strcmp(source, DEV_SYSTEM_B) == 0)
+        {
+            system_mtd_num = MTD_SYSTEM_A;
+        }
+        else
+        {
+            RLOGD("source:%s, target:%s\n", source, target);
+        }
+        for( ; system_ubi_num >= 10; system_ubi_num--)//try from ubi31 to ubi10
+        {
+            sprintf(md5_target_file_patch, "/dev/ubi%d", system_ubi_num);
+            RLOGD("ubi_num = %d\n", system_ubi_num);
+            if((access(md5_target_file_patch, F_OK)) == -1)
+            {
+                RLOGD("no the ubi file, can use this ubi.\n");
+                break;
+            }
+        }
+        if(system_ubi_num < 10)
+        {
+            RLOGE("no the ubi file, can use this ubi.\n");
+            return -1;
+        }
+    }
+    //=========================caculate md5sum start=====================
+    if(is_system == 1)
+    {
+        RLOGD("in system caculate\n");
+        RLOGD("system_mtd_num = %d, ubi_num = %d\n", system_mtd_num, system_ubi_num);
+        sprintf(cmd_ubi_attach, "ubiattach /dev/ubi_ctrl -m %d -d %d", system_mtd_num, system_ubi_num);
+        RLOGD("cmd_ubi_attach:%s", cmd_ubi_attach);
+        ret = system(cmd_ubi_attach);
+        if(ret != 0)
+        {
+            RLOGE("ubi attach error!!!\n");
+            return need_copy;
+        }
+        RLOGD("attach over\n");
+        //attach success
+        sprintf(md5_target_file_patch, "/dev/ubi%d_0", system_ubi_num);
+        RLOGD("md5_target_file_patch:%s", md5_target_file_patch);
+        //make sure the ubi volume is exist
+        if((access(md5_target_file_patch, F_OK)) == -1)
+        {
+            RLOGD("no the ubi file.\n");
+            sprintf(cmd_ubi_detach, "ubidetach -m %d", system_mtd_num);
+            ret = system(cmd_ubi_detach);
+            if(ret != 0)
+            {
+                RLOGD("ubi dettach error!!!\n");
+            }
+
+            return need_copy;
+        }
+        //calculate md5sum
+        //ret = lynq_md5_two_file_verfy("/dev/ubi0_0", md5_target_file_patch);
+        ret = lynq_md5_file_verfy_ab(md5_target_file_patch, source_md5);
+        if(ret == MD5_VERFY_ERROR)
+        {
+            //ubidetach
+            sprintf(cmd_ubi_detach, "ubidetach -m %d", system_mtd_num);
+            ret = system(cmd_ubi_detach);
+            if(ret != 0)
+            {
+                RLOGD("ubi dettach error!!!\n");
+            }
+            return need_copy;
+        }
+        if(ret != 0)
+        {
+            //ubidetach
+            sprintf(cmd_ubi_detach, "ubidetach -m %d", system_mtd_num);
+            ret = system(cmd_ubi_detach);
+            if(ret != 0)
+            {
+                RLOGD("ubi dettach error!!!\n");
+            }
+            RLOGD("calculate system error!!!\n");
+            return -1;
+        }
+
+        RLOGD("verfy system.img over\n");
+    }
+    else
+    {
+        RLOGD("verfy else img\n");
+        //calculate md5sum
+        //ret = lynq_md5_two_file_verfy(source, target);
+        ret = lynq_md5_file_verfy_ab(target, source_md5);
+        if(ret == MD5_VERFY_ERROR)
+        {
+            return need_copy;
+        }
+        if(ret != 0)
+        {
+            RLOGD("calculate %s and %s error!!!\n", source, target);
+            return -1;
+        }
+    }
+    //====================caculate md5sum end======================
+    return 0;
+}
+//xf.li@20230403 add for verfy end
+
+
+int lynq_backup_main()
+{
+    return -1;
+}
+//xf.li@20230822 add for ab rollback end
+
+
+int lynq_check_oemapp(char* name)
+{
+    return -1;
+}
+
+int lynq_fota_func(void) 
+{
+    return -1;
+}
+
+int lynq_nand_open(const char *pathname, int flags)
+{
+//    printf("pathname:%s---flags:%d",pathname,flags);
+    return open(pathname,flags);
+}
+
+ssize_t lynq_nand_read(int fd, void *buf, size_t count)
+{
+//    printf("rfd:%d---buf:%s---count:%d",fd,buf,count);
+    return read(fd,buf,count);
+}
+
+ssize_t lynq_nand_write(int fd, void *buf, size_t count)
+{
+ //   printf("wfd:%d---buf:%s---count:%d",fd,buf,count);
+    return write(fd,buf,count);
+}
+
+int lynq_nand_close(int fd)
+{
+    return close(fd);
+}
+/**
+ * @brief Obtain the upgrade result
+ *
+ * @param void
+ * @return 0xff:open file fail,0:upgrade success,1,upgrade wait
+ */
+int lynq_get_upgrade_status(void)
+{
+    int lynq_state_fd;
+    int lynq_upgrade_wait = 1;
+    OTA_STATUS lynq_ota_status;
+
+    memset(&lynq_ota_status, 0, sizeof(lynq_ota_status));
+
+    lynq_state_fd = open(FILE_FOTA_STATE,O_RDWR | O_CREAT,0777);
+
+    if (lynq_state_fd < 0)
+    {
+        return 0xff;
+    }
+    read(lynq_state_fd,(unsigned char *)&lynq_ota_status,sizeof(lynq_ota_status));
+    close(lynq_state_fd);
+    if((lynq_ota_status.ota_run != 0) && (lynq_ota_status.update_result == 0))
+    {
+        return lynq_upgrade_wait;
+    }
+    return lynq_ota_status.update_result;
+}
+
+/**
+ * @brief reboot device
+ *
+ * @param void
+ * @return void
+ */
+void lynq_reboot_device(void)
+{
+    reboot_device();
+    return ;
+}
+
+/**
+ * @brief fota no resatrt
+ *
+ * @param void
+ * @return 0:fota success -Other values:fota fail
+ */
+
+int lynq_fota_nrestart(void)
+{
+
+    int ret = 0;
+#if 0
+    printf("-********copy delta ***-\n");
+    test_write_delta("/data/delta",DEV_DELTA);
+#endif
+
+    RLOGD("lynq-fota-zip start\n");
+    time_t t1 = time(NULL);
+    ret = rock_update_main(0, 0, 0, 0, 1, 1, 0, 1);
+    RLOGD("rock_update_nrestart ret = %d\n", ret);
+    if(ret)
+    {
+        RLOGD("fota update fail!\n");
+    }
+    time_t t2 = time(NULL);
+    RLOGE("cy: fota update cost %d\n", t2 - t1);
+    return ret;
+}
+
+/**
+ * @brief Set the upgrade package address
+ *
+ * @param1 value:fota addr
+ * @param1 szie:fota addr length
+ * @return 0:set success other:set fail
+ */
+int lynq_fota_set_addr_value(char *value,int size)
+{
+    int ret;
+    printf("cy: lynq_fota_set_addr_value %s %d!\n", value, size);
+    RLOGE("cy: lynq_fota_set_addr_value %s %d!\n", value, size);
+    if(size < 120)
+    {
+        ret = lynq_set_value(FOTA_UCI_MODULE,FOTA_UCI_ADDR, value);
+        if (ret != 0){
+            RLOGE("cy: lynq_fota_set_addr_value fail %d\n", ret);
+        }
+        return ret;
+    }
+    return -1;
+}
+/**
+ * @brief get the upgrade package address
+ *
+ * @param1 value:fota addr
+ * @return 0:get success other:set fail
+ */
+int lynq_fota_get_addr_value(char *tmp)
+{
+    return lynq_get_value(FOTA_UCI_FILE, FOTA_UCI_MODULE,FOTA_UCI_ADDR, tmp);
+}
diff --git a/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-ftp-fota/makefile b/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-ftp-fota/makefile
index 767c3f9..9b566c4 100755
--- a/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-ftp-fota/makefile
+++ b/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-ftp-fota/makefile
@@ -42,22 +42,30 @@
     -llynq-uci \
     -lz
 
-SOURCES = $(wildcard *.c wildcard *.h rock_ua/*.c  MD5/*c rock_ua/*.cpp)
+SOURCES = $(wildcard *.c wildcard *.h rock_ua/*.c  MD5/*.c)
 
-EXECUTABLE = liblynq-ftp-fota.so
+LIB_WAPPER = liblynq-ftp-fota.so
+
+EXECUTABLE = lynq-ftp-fota-tool
 
 OBJECTS=$(SOURCES:.c=.o)
 
 CPP_SOURCES = $(wildcard rock_ua/*.cpp)
 
+WAPPER_SOURCES = $(wildcard lib_wapper/*.c)
 
 CPP_OBJECTS=$(CPP_SOURCES:.cpp=.o)
 
+WAPPER_OBJECTS=$(WAPPER_SOURCES:.c=.o)
+
 .PHONY: build clean install pack_rootfs 
 
 all: build
 $(EXECUTABLE): $(OBJECTS) $(CPP_OBJECTS)
-	$(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(CFLAGS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+	$(CXX)  $(CPP_OBJECTS) $(OBJECTS) $(LOCAL_LIBS) $(CFLAGS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+$(LIB_WAPPER): $(OBJECTS) $(WAPPER_OBJECTS)
+	$(CXX) -shared -Wl,--no-undefined $(WAPPER_OBJECTS) $(OBJECTS) $(LOCAL_LIBS) $(CFLAGS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
 
 %.o : %.c
 	$(CC) $(LOCAL_C_INCLUDES) $(CFLAGS) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $< 
@@ -65,21 +73,29 @@
 %.o : %.cpp
 	$(CXX) $(LOCAL_C_INCLUDES) $(CFLAGS) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
 
-build:  $(EXECUTABLE)
+build:  $(EXECUTABLE) $(LIB_WAPPER)
 	$(warning ########## build $(EXECUTABLE)  ##########)
 
 install:
 	mkdir -p $(ROOT)$(base_libdir)/
-	install $(EXECUTABLE) $(ROOT)$(base_libdir)/
+	mkdir -p $(ROOT)$(bindir)/
+	install $(LIB_WAPPER) $(ROOT)$(base_libdir)/
+	install $(EXECUTABLE) $(ROOT)$(bindir)/
 	mkdir -p $(ROOT)$(includedir)/$(NAME)/sdk
 
 pack_rootfs:
 	mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
-	cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
-	$(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(EXECUTABLE)
+	mkdir -p $(PACK_INITRAMFS_TO)$(bindir)/
+	cp -af $(LIB_WAPPER) $(PACK_INITRAMFS_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(bindir)/
+	$(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(LIB_WAPPER)
+	$(CROSS)strip $(PACK_INITRAMFS_TO)$(bindir)/$(EXECUTABLE)
 	mkdir -p $(PACK_TO)$(base_libdir)/
-	cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
-	$(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
+	mkdir -p $(PACK_TO)$(bindir)/
+	cp -af $(LIB_WAPPER) $(PACK_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_TO)$(bindir)/
+	$(CROSS)strip $(PACK_TO)$(base_libdir)/$(LIB_WAPPER)
+	$(CROSS)strip $(PACK_TO)$(bindir)/$(EXECUTABLE)
 .PHONY: clean
 clean:
-	$(RM) $(OBJECTS) $(EXECUTABLE)
+	$(RM) $(OBJECTS) $(CPP_OBJECTS) $(WAPPER_OBJECTS) $(LIB_WAPPER) $(EXECUTABLE)
diff --git a/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-ftp-fota/rock_ua/rock_ua.cpp b/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-ftp-fota/rock_ua/rock_ua.cpp
index f434a35..aaa36da 100755
--- a/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-ftp-fota/rock_ua/rock_ua.cpp
+++ b/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-ftp-fota/rock_ua/rock_ua.cpp
@@ -1219,7 +1219,7 @@
             //ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,delta_head[i],digest_s);
             ROCK_SHA_FILE(fd_curr,0,it->part_org_size,digest_t);
             retry_cnt++;
-        }while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
+        }while((status !=0 && retry_cnt <= 5) || ((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3)));
         
         mtk_device_wrap_close(fd_curr);
         
@@ -2125,3 +2125,12 @@
  * @brief This is the wake up call
  * end
  */
+
+int main(int argc, char *argv[])
+{
+    int ret;
+    if (argc < 9)
+        return -1;
+    ret = rock_update_main(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7]), atoi(argv[8]));
+    return ret;
+}