[Feature][task-view-780][FOTA] fullfota can backup the other slot

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

Change-Id: I25dca3dd77df6768470f3c529b580beb73e9b10c
diff --git a/LYNQ_PUBLIC/IC_meta/mtk/2735/lynq-fullfota-service/lynq-fullfota-service.bb b/LYNQ_PUBLIC/IC_meta/mtk/2735/lynq-fullfota-service/lynq-fullfota-service.bb
new file mode 100755
index 0000000..3cee9fb
--- /dev/null
+++ b/LYNQ_PUBLIC/IC_meta/mtk/2735/lynq-fullfota-service/lynq-fullfota-service.bb
@@ -0,0 +1,40 @@
+inherit externalsrc package systemd
+
+DESCRIPTION = "lynq_fullfota.service demo"
+#LICENSE = "MediaTekProprietary"
+LICENSE = "CLOSED"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"
+DEPENDS += "platform-libs  dbus glib-2.0 liblynq-uci liblynq-ftp-fota"
+inherit workonsrc
+WORKONSRC = "${TOPDIR}/../LYNQ_PUBLIC/IC_src/mtk/framework/lynq-fullfota-service/src"
+
+TARGET_CC_ARCH += "${LDFLAGS}"
+SYSTEMD_PACKAGES = "${PN}"
+SYSTEMD_SERVICE_${PN} = "lynq_fullfota.service"
+FILES_${PN} += "${systemd_unitdir}/system/lynq_fullfota.service"
+
+#Parameters passed to do_compile()
+EXTRA_OEMAKE = "'RAT_CONFIG_C2K_SUPPORT = ${RAT_CONFIG_C2K_SUPPORT}'\
+                'MTK_MULTI_SIM_SUPPORT = ${MTK_MULTI_SIM_SUPPORT}'\
+                'TARGET_PLATFORM = ${TARGET_PLATFORM}'"
+
+#INHIBIT_PACKAGE_STRIP = "1"
+do_compile () {
+	if test "${PACKAGE_ARCH}" = "cortexa7hf-vfp-vfpv4-neon" || test "${PACKAGE_ARCH}" = "cortexa7hf-neon-vfpv4"; then
+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -mhard-float"
+	else
+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST}"
+	fi
+}
+
+do_install() {
+	if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
+		install -d ${D}${systemd_unitdir}/system/
+		install -m 0644 ${B}/lynq_fullfota.service ${D}${systemd_unitdir}/system
+	fi
+	
+	install -d ${D}${bindir}/
+	install -m 0755 ${S}/lynq-fullfota-service ${D}${bindir}/
+	install -d ${D}${includedir}
+}
+
diff --git a/LYNQ_PUBLIC/IC_meta/mtk/2735/lynq-logrotate-service/lynq-logrotate-service.bb b/LYNQ_PUBLIC/IC_meta/mtk/2735/lynq-logrotate-service/lynq-logrotate-service.bb
index 0e62f18..f295202 100755
--- a/LYNQ_PUBLIC/IC_meta/mtk/2735/lynq-logrotate-service/lynq-logrotate-service.bb
+++ b/LYNQ_PUBLIC/IC_meta/mtk/2735/lynq-logrotate-service/lynq-logrotate-service.bb
@@ -4,7 +4,7 @@
 #LICENSE = "MediaTekProprietary"
 LICENSE = "CLOSED"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"
-DEPENDS += "platform-libs  dbus glib-2.0 liblynq-log liblynq-fota"
+DEPENDS += "platform-libs  dbus glib-2.0 liblynq-log liblynq-fota liblynq-uci"
 inherit workonsrc
 WORKONSRC = "${TOPDIR}/../LYNQ_PUBLIC/IC_src/mtk/framework/lynq-logrotate-service/src"
 
diff --git a/LYNQ_PUBLIC/IC_meta/mtk/2735/packagegroups/packagegroup-lynq-mt2735.bb b/LYNQ_PUBLIC/IC_meta/mtk/2735/packagegroups/packagegroup-lynq-mt2735.bb
index a58e907..f0f715f 100755
--- a/LYNQ_PUBLIC/IC_meta/mtk/2735/packagegroups/packagegroup-lynq-mt2735.bb
+++ b/LYNQ_PUBLIC/IC_meta/mtk/2735/packagegroups/packagegroup-lynq-mt2735.bb
@@ -7,6 +7,7 @@
     libautosuspend \
     libpoweralarm \
     lynq-autosuspend \
+    lynq-fullfota-service \
     liblynq-log \
     liblynq-uci \
     liblynq-protcl \
diff --git a/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-fullfota-service/src/LICENSE b/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-fullfota-service/src/LICENSE
new file mode 100644
index 0000000..605b7ea
--- /dev/null
+++ b/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-fullfota-service/src/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MobileTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MobileTek Inc. and/or its licensors. Without
+the prior written permission of MobileTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MobileTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MobileTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MobileTek SOFTWARE")
+RECEIVED FROM MobileTek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MobileTek EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MobileTek PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MobileTek SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MobileTek
+SOFTWARE. MobileTek SHALL ALSO NOT BE RESPONSIBLE FOR ANY MobileTek SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MobileTek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MobileTek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MobileTek'S OPTION, TO REVISE OR REPLACE THE
+MobileTek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MobileTek FOR SUCH MobileTek SOFTWARE AT ISSUE.
diff --git a/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-fullfota-service/src/lynq_fullfota.service b/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-fullfota-service/src/lynq_fullfota.service
new file mode 100755
index 0000000..cf2e7a3
--- /dev/null
+++ b/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-fullfota-service/src/lynq_fullfota.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=lynq fullfota service
+After=wmtd.service
+#After=mtkfusionrild.service
+#Requires=mtkfusionrild.service
+
+[Service]
+StandardOutput=kmsg+console
+Type=simple
+RemainAfterExit=no
+#ExecStart=/usr/bin/lynq-default
+ExecStart=/usr/bin/lynq-fullfota-service
+
+[Install]
+Alias=pwrwifid
+WantedBy=multi-user.target
diff --git a/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-fullfota-service/src/lynq_fullfota_service.c b/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-fullfota-service/src/lynq_fullfota_service.c
new file mode 100755
index 0000000..689a311
--- /dev/null
+++ b/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-fullfota-service/src/lynq_fullfota_service.c
@@ -0,0 +1,39 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <unistd.h>

+#include <fcntl.h>

+#include <dirent.h>

+#include <sys/stat.h>

+#include<sys/types.h>

+#include <errno.h>

+#include <include/lynq_uci.h>

+#include <log/log.h>

+#include "include/iot_rock.h"

+

+

+int main()

+{

+    int ret;

+    int i;

+    char tmp[4] = {0};

+

+    for(i=0;i<10;i++)

+    {

+        ret = lynq_get_value("lynq_uci", "lynq_fota","lynq_ftp_state", tmp);

+        if(strcmp("0", tmp))

+        {

+           break; 

+        }

+        sleep(5);

+

+    }

+    if(i != 9)

+    {

+        RLOGE("lynq_ftp_state is ready\n");

+        lynq_fota_func();

+    }

+

+    return 0;

+}

+

diff --git a/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-fullfota-service/src/makefile b/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-fullfota-service/src/makefile
new file mode 100755
index 0000000..b819261
--- /dev/null
+++ b/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-fullfota-service/src/makefile
@@ -0,0 +1,59 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -g -Os \
+                -flto \
+                -DRIL_SHLIB \
+                -DATCI_PARSE \
+                -DKEEP_ALIVE \
+                -D__LINUX_OS__ \
+                -DECALL_SUPPORT
+
+
+
+
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(ROOT)$(includedir) \
+  -I$(ROOT)$(includedir)/logger \
+  -I$(ROOT)$(includedir)/vendor-ril \
+  -I$(ROOT)$(includedir)/liblog \
+  -I$(ROOT)$(includedir)/glib-2.0 \
+  -I$(ROOT)$(libdir)/glib-2.0/include \
+  -I$(ROOT)$(includedir)/dbus-1.0 \
+  -I$(ROOT)$(libdir)/dbus-1.0/include \
+
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lpthread \
+    -lssl \
+    -lglib-2.0 \
+    -lgobject-2.0 \
+    -lgio-2.0 \
+    -ldbus-1 \
+    -llog \
+    -llynq-ftp-fota \
+    -llynq-uci \
+
+SOURCES = $(wildcard *.c )
+
+EXECUTABLE = lynq-fullfota-service
+
+OBJECTS=$(SOURCES:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.c
+	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-logrotate-service/src/lynq_logrotate_service.c b/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-logrotate-service/src/lynq_logrotate_service.c
index d4338e1..3e02c8a 100755
--- a/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-logrotate-service/src/lynq_logrotate_service.c
+++ b/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-logrotate-service/src/lynq_logrotate_service.c
@@ -10,7 +10,7 @@
 

 #include "liblog/lynq_deflog.h"

 #include "include/iot_rock.h"

-

+#include <include/lynq_uci.h>

 #define USER_LOG_TAG "LOGROTATE_SERVICE"

 #define MCU_LOG_ADDR "/var/log/mculog.log"

 

@@ -132,7 +132,10 @@
 

 int main()

 {

+    int ret;

     char muclog[1024] = {0};

+    char lynq_addr[128] = {0};

+    char mtd_addr[16] = "/dev/mtd47";

     LYLOGEINIT(USER_LOG_TAG);

     LYLOGSET(4);

     if(-1 == lynq_monitor_syslogcof())

@@ -150,17 +153,12 @@
            sleep(2);         

     }

 

-    lynq_fota_func();

-//    while(1)

-//    {

-        //receive mcu log

-        //memset(muclog,1,1024);

-        //lynq_write_mculog_file(muclog,1024);//lt add @2021.7.28 for test mculog

-

-        //system("logrotate /etc/logrotate.d/syslog");

-        //system("logrotate /etc/logrotate.d/mculog");//lt add @2021.7.28 for start mculog logrotate

-        //system("logrotate /etc/logrotate.d/mtklog");//lt add @2021.7.28 for start mculog mtklog

-        //sleep(1);

-//    }

+    ret = lynq_get_value("lynq_uci", "lynq_fota","lynq_fota_addr", lynq_addr);

+    if(!strncmp(mtd_addr, lynq_addr, strlen(mtd_addr)))

+    {

+        lynq_fota_func();

+    }

+    

+    return 0;

 }

 

diff --git a/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-logrotate-service/src/makefile b/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-logrotate-service/src/makefile
index aca2492..bf3971a 100755
--- a/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-logrotate-service/src/makefile
+++ b/LYNQ_PUBLIC/IC_src/mtk/framework/lynq-logrotate-service/src/makefile
@@ -40,6 +40,7 @@
     -ldbus-1 \
     -llog \
     -llynq-fota \
+    -llynq-uci \
 
 SOURCES = $(wildcard *.c )
 
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
index 1dcaab8..0c94ab6 100755
--- 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
@@ -1,4 +1,3 @@
-// 2017-07-31 carota Rock FOTA ua porting file
 
 
 #define ROCK_FOTA_SUPPORT
@@ -212,7 +211,7 @@
 {
 
     int ret = 0;
-    
+    int ret1 = 0;
 #if 0
     
     printf("-********copy delta ***-\n");
@@ -226,6 +225,17 @@
     {
         RLOGD("fota update fail!\n");
     }
+    else
+    {
+        char value[4] = "1";
+        RLOGE("cy: lynq_fota_set_addr_value lynq_fota_full_state start\n");
+        ret1 = lynq_set_value(FOTA_UCI_MODULE,"lynq_fota_full_state", value);
+        if (ret1 != 0){
+            RLOGE("cy: lynq_fota_set_addr_value lynq_fota_full_state %d\n", ret1);
+        }
+        sync();
+        sleep(2);
+    }
     return ret;
 }
 
@@ -370,7 +380,70 @@
 
 int lynq_fota_func(void) 
 {
-    return -1;
+    int ret = 0;
+    int ret1 = 0;
+    int first_run = 1;
+    size_t size = 1024;
+    char tmp[4] = {0};
+    char value[4] = {0};
+    char ftp_addr[128];
+    char fota_addr[128];
+    int full_flag = 0;
+    ret = lynq_get_value(FOTA_UCI_FILE, FOTA_UCI_MODULE,"lynq_fota_full_state", tmp);
+    if(ret)
+    {
+        RLOGE("[+UP]:lynq_get_value lynq_uci_full_state fail\n");
+        return -1;
+    }
+    full_flag = atoi(tmp);
+    if((full_flag != 0) && (full_flag < 5))
+    {
+        RLOGE("[+UP]: ******lynq_fota_ftp_func start******\n");
+        ret = lynq_get_value(FOTA_UCI_FILE, FOTA_UCI_MODULE,"lynq_ftp_addr", ftp_addr);
+        RLOGE("[+UP]: ftp_addr: %s\n", ftp_addr);
+        if (!base64_enc(ftp_addr, strlen(ftp_addr), fota_addr, &size))
+        {
+            RLOGE("+[UA]: base64_dec fota addr fail\n");
+            return E_ROCK_FOTA_ADDR;
+        }
+        ret = lynq_fota_set_addr_value(fota_addr, strlen(fota_addr));
+        if(ret)
+        {
+            return -1;
+        }
+        ret = rock_update_main(0, 0, 0, 0, first_run, 0, 0, 0);
+        RLOGE("rock_update_main ret = %d\n", ret);
+        if(ret)
+        {
+            
+            RLOGE("rock_update_main fail!\n");
+            full_flag = full_flag + 1 ;
+            sprintf(value, "%d", full_flag);
+            ret1 = lynq_set_value(FOTA_UCI_MODULE,"lynq_fota_full_state", value);
+            if (ret1 != 0)
+            {
+                RLOGE("lynq_set_value lynq_fota_full_state %d\n", ret1);
+            }
+            
+        }
+        else
+        {
+            full_flag = 0;
+            sprintf(value, "%d", full_flag);
+            ret1 = lynq_set_value(FOTA_UCI_MODULE,"lynq_fota_full_state", value);
+            if (ret1 != 0)
+            {
+                RLOGE("lynq_set_value lynq_fota_full_state %d\n", ret1);
+            }
+        }
+    }
+    else
+    {
+        RLOGE("full_flag is not match!\n");
+    }
+     
+
+    return ret;
 }
 
 int lynq_nand_open(const char *pathname, int flags)
@@ -447,6 +520,7 @@
 {
 
     int ret = 0;
+    int ret1 = 0;
 #if 0
     printf("-********copy delta ***-\n");
     test_write_delta("/data/delta",DEV_DELTA);
@@ -460,6 +534,17 @@
     {
         RLOGD("fota update fail!\n");
     }
+    else
+    {
+        char value[4] = "1";
+        RLOGE("cy: lynq_set_value lynq_fota_full_state start\n");
+        ret1 = lynq_set_value(FOTA_UCI_MODULE,"lynq_fota_full_state", value);
+        if (ret1 != 0){
+            RLOGE("cy: lynq_set_value lynq_fota_full_state %d\n", ret1);
+        }
+        sync();
+        sleep(2);
+    }
     time_t t2 = time(NULL);
     RLOGE("cy: fota update cost %d\n", t2 - t1);
     return ret;
diff --git a/LYNQ_PUBLIC/IC_src/mtk/packages/apps/lynq-log-transfer/lynq_inner_log_transfer.sh b/LYNQ_PUBLIC/IC_src/mtk/packages/apps/lynq-log-transfer/lynq_inner_log_transfer.sh
index 02a1898..7106ea6 100755
--- a/LYNQ_PUBLIC/IC_src/mtk/packages/apps/lynq-log-transfer/lynq_inner_log_transfer.sh
+++ b/LYNQ_PUBLIC/IC_src/mtk/packages/apps/lynq-log-transfer/lynq_inner_log_transfer.sh
@@ -647,7 +647,9 @@
         sever_should_ok $ftp_server        
         ftp_port=$3
         ftp_user_name=$4
-        ftp_password=$5                            
+        ftp_password=$5
+        uci set lynq_uci.lynq_fota.lynq_ftp_addr="ftp://$4:$5@$ftp_server:$3/sftp/5gfull/fotafull.delta"
+        uci set lynq_uci.lynq_fota.lynq_ftp_state='1'
     else
         echo_debug_info "para num $1 error"
         exit_process $ERROR_PARAM
@@ -849,6 +851,4 @@
 esac
 
 echo_debug_info "log transfer param_num $# param $* complete"
-exit_process 0      
-            
-           
\ No newline at end of file
+exit_process 0
diff --git a/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/lynq_data_recover b/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/lynq_data_recover
index eb0b607..eef9e7d 100755
--- a/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/lynq_data_recover
+++ b/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/lynq_data_recover
@@ -138,6 +138,7 @@
 mkdir -p /data/atsvc
 check_copy_file /data_backup/lynq_atsvc_plugin.xml /data/atsvc/lynq_atsvc_plugin.xml
 check_copy_file /data_backup/terminal_controller.conf /data/atsvc/terminal_controller.conf
+uci set lynq_uci.lynq_fota.lynq_ftp_state='0'
 echo "$TAG: After recover radio_property" > /dev/kmsg
 
 recover_tmp_conf
diff --git a/meta/meta-mediatek-mt2735/recipes-core/initial/files/lynq_data_recover b/meta/meta-mediatek-mt2735/recipes-core/initial/files/lynq_data_recover
index 2b4b41c..6d3b9c0 100755
--- a/meta/meta-mediatek-mt2735/recipes-core/initial/files/lynq_data_recover
+++ b/meta/meta-mediatek-mt2735/recipes-core/initial/files/lynq_data_recover
@@ -154,6 +154,7 @@
 mkdir -p /data/atsvc
 check_copy_file /data_backup/lynq_atsvc_plugin.xml /data/atsvc/lynq_atsvc_plugin.xml
 check_copy_file /data_backup/terminal_controller.conf /data/atsvc/terminal_controller.conf
+uci set lynq_uci.lynq_fota.lynq_ftp_state='0'
 echo "$TAG: After recover radio_property" > /dev/kmsg
 
 recover_tmp_conf