Merge "[Feature][ZXW-113] add fota Self starting service"
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
index 23bac63..e67c8a4 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
+++ b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
@@ -262,6 +262,7 @@
lynq-qser-network-demo \
poweralarm-demo \
lynq-systime-demo \
+ lynq-fota-backup \
"
zxic_app_open += "${@bb.utils.contains('CONFIG_TEL_API_SUPPORT', 'RIL', 'rild', '', d)}"
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/files/LICENSE b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/files/LICENSE
new file mode 100755
index 0000000..0489348
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/files/LICENSE
@@ -0,0 +1,31 @@
+opyright 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/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/files/lynq-fota-backup.cpp b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/files/lynq-fota-backup.cpp
new file mode 100755
index 0000000..84a727b
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/files/lynq-fota-backup.cpp
@@ -0,0 +1,97 @@
+/*******************************************************
+*
+* @brief:
+* @details: add fota A/B backup service
+* @author: l.yang
+* @date: 2023.8.29
+* @version: V1.0
+* @copyright:Copyright (c) MobileTek
+*
+*********************************************/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <dlfcn.h>
+#include <string.h>
+#include <pthread.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <liblog/lynq_deflog.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define FOTA_FLAG_FILE "/mnt/userdata/.back_up_flag"
+#define FOTA_SYNC_FLAG 1
+
+extern int lynq_sync_system();
+extern int lynq_fota_get_addr_value(char *tmp_value);
+extern int lynq_fota_set_addr_value(char *value,int size);
+extern int lynq_fota_nrestart(void);
+int main()
+{
+ int ret = 0 ;
+ int sync_flag = 0;
+ char tmp_addr[128] = {0};
+ FILE *fp = NULL;
+
+ fp = fopen(FOTA_FLAG_FILE,"r");
+ if(fp == NULL)
+ {
+ printf("No need fota sync\n");
+ return -1;
+
+ }
+
+ fread(&sync_flag,sizeof(int),1,fp);
+
+ if(sync_flag == FOTA_SYNC_FLAG)
+ {
+ ret = lynq_sync_system();
+ if(ret != 0)
+ {
+ printf("sync faild\n");
+ fclose(fp);
+ }
+ system("rm -rf /mnt/userdata/.back_up_flag");
+
+ }
+ else if(sync_flag != FOTA_SYNC_FLAG)
+ {
+ ret = lynq_fota_get_addr_value(tmp_addr);
+ if(ret != 0)
+ {
+ printf("Get addr failed\n");
+ return -1;
+ }
+ printf("tmp_addr is %s\n",tmp_addr);
+ ret = lynq_fota_set_addr_value(tmp_addr,10);
+ if(ret != 0)
+ {
+ printf("Set addr failed\n");
+ return -1;
+
+ }
+ ret = lynq_fota_nrestart();
+ if(ret != 0)
+ {
+ printf("Upgrade failed\n");
+ return -1;
+ }
+
+ }
+
+ return 0;
+
+}
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/files/lynq-fota-backup.service b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/files/lynq-fota-backup.service
new file mode 100755
index 0000000..28851ff
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/files/lynq-fota-backup.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=lynq-fota-backup-service
+
+[Service]
+ExecStart=/usr/bin/lynq-fota-backup
+Type=simple
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/files/lynq-fota-backup.sh b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/files/lynq-fota-backup.sh
new file mode 100644
index 0000000..53eb20f
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/files/lynq-fota-backup.sh
@@ -0,0 +1,39 @@
+#!/bin/sh
+#
+# Run the daemon
+#
+
+DAEMON="lynq-fota-backup-service"
+PIDFILE="/var/run/$DAEMON.pid"
+EXEC="/usr/bin/lynq-fota-backup"
+EXEC_ARGS=""
+
+
+start() {
+ echo -n "Starting $DAEMON... "
+ start-stop-daemon --no-close -S -b -m -p $PIDFILE -x $EXEC -- $EXEC_ARGS
+ [ $? -eq 0 ] && echo "OK" || echo "ERROR"
+}
+
+stop() {
+ echo -n "Stopping $DAEMON... "
+ start-stop-daemon -K -p $PIDFILE
+ [ $? -eq 0 ] && echo "OK" || echo "ERROR"
+}
+
+restart() {
+ stop
+ start
+}
+
+case "$1" in
+ start|stop|restart)
+ "$1"
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart}"
+ exit 1
+esac
+
+exit $?
+
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/files/makefile b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/files/makefile
new file mode 100755
index 0000000..0a349d3
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/files/makefile
@@ -0,0 +1,57 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -std=gnu++14 \
+ -g -Os \
+ -flto \
+ -fPIC \
+
+
+
+ifeq ($(strip $(TARGET_PLATFORM)), T106)
+LOCAL_CFLAGS += -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0
+endif
+
+LOCAL_CFLAGS += -Werror=format-security
+
+$(warning ################# rock ROOT: $(ROOT),includedir:$(includedir),)
+
+LOCAL_PATH = .
+
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(LOCAL_PATH)/include \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/liblog \
+ -I$(ROOT)$(includedir)/glib-2.0 \
+ -I$(ROOT)$(libdir)/glib-2.0/include \
+ -I$(ROOT)$(includedir) \
+
+
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lstdc++ \
+ -llynq-log \
+ -llynq-fota \
+
+SOURCES = lynq-fota-backup.cpp
+
+EXECUTABLE = lynq-fota-backup
+
+OBJECTS=$(SOURCES:.cpp=.o)
+
+all: $(EXECUTABLE)
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.cpp
+ $(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
+ $(RM) $(OBJECTS_TOOL) $(EXECUTABLE)
+
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/lynq-fota-backup.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/lynq-fota-backup.bb
new file mode 100755
index 0000000..b89f7ab
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-fota-backup/lynq-fota-backup.bb
@@ -0,0 +1,54 @@
+#inherit externalsrc package systemd
+
+DESCRIPTION = "lynq-fota-backup.service"
+
+LICENSE = "MIT"
+##License checksum file is always required
+LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE;md5=c794e8ff1acd3b7f156a6497e780dd54"
+
+SRC_URI = "file://lynq-fota-backup.cpp \
+ file://lynq-fota-backup.sh \
+ file://makefile \
+ file://lynq-fota-backup.service \
+ file://LICENSE \
+"
+
+
+TARGET_CC_ARCH += "${LDFLAGS}"
+
+
+DEPENDS += "liblynq-log liblynq-uci liblynq-qser-fota"
+S = "${WORKDIR}"
+#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
+}
+#INHIBIT_PACKAGE_STRIP = "1"
+
+
+do_install() {
+ install -d ${D}${bindir}/
+ echo "Installing image PN ${PN}"
+ echo "Installing image systemd_unitdir ${systemd_unitdir}"
+ echo "Installing image D ${D}"
+ echo "Installing image B ${B}"
+
+ if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
+ install -d ${D}${systemd_unitdir}/system/
+ install -m 0644 ${B}/lynq-fota-backup.service ${D}${systemd_unitdir}/system
+ else
+ install -d ${D}${sysconfdir}/init.d
+ install -m 0755 ${S}/lynq-fota-backup.sh ${D}${sysconfdir}/init.d/
+ install -d ${D}${sysconfdir}/rcS.d
+ ln -s ../init.d/lynq-fota-backup.sh ${D}${sysconfdir}/rcS.d/S82lynq-fota-backup-service
+ fi
+
+ install -m 0755 ${S}/lynq-fota-backup ${D}${bindir}/
+ install -d ${D}${includedir}
+}
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-fota/lynq-qser-fota.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-fota/lynq-qser-fota.cpp
index 9baced7..e0dcafd 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-fota/lynq-qser-fota.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-fota/lynq-qser-fota.cpp
@@ -28,14 +28,15 @@
#include "include/lynq-qser-fota.h"
#include "liblog/lynq_deflog.h"
+#define FOTA_FLAG_FILE "/mnt/userdata/.back_up_flag"
-#define USER_LOG_TAG "LYNQ_FOTA"
-
+#define USER_LOG_TAG "LYNQ_FOTA"
+#define FOTA_ADDR_FILE "/mnt/userdata/.addr_value"
+#define FOTA_FILE_NAME "upgrade.package"
#define SYSTEM_A "34650"
#define SYSTEM_B "39019"
-char path[] = {0};
#define BOOTABLE "45227"
#define UNBOOTABLE "47806"
@@ -49,7 +50,6 @@
#define LYNQ_UPGRADE_STATUS_UPDATE_FAIL (5)
-
typedef struct
{
int system;
@@ -121,7 +121,17 @@
int ret = 0;
int current_slot = 0;
-
+ int fota_sync_flag = 0;
+ FILE *fp = NULL;
+ fp = fopen(FOTA_FLAG_FILE,"w+");
+ if(fp == NULL)
+ {
+ LYINFLOG("Creat fota flag file failed");
+ return -1;
+ }
+ fwrite(&fota_sync_flag,sizeof(int),1,fp);
+ fclose(fp);
+
ret = lynq_fota_verify();
if(ret != 0)
{
@@ -209,7 +219,18 @@
}
}
-
+
+ fp = fopen(FOTA_FLAG_FILE,"w+");
+ if(fp == NULL)
+ {
+ LYINFLOG("Creat fota flag file failed");
+ return -1;
+ }
+
+ fota_sync_flag = 1;
+ fwrite(&fota_sync_flag,sizeof(int),1,fp);
+ fclose(fp);
+
if(reboot_flag == 1)
{
LYINFLOG("Enter reboot device");
@@ -251,7 +272,7 @@
int lynq_fota_set_addr_value(char *value,int size)
{
int ret =0;
-
+ FILE *fp = NULL;
LYLOGSET(LOG_INFO);
LYLOGEINIT(USER_LOG_TAG);
@@ -267,10 +288,62 @@
return -1;
}
+ fp = fopen(FOTA_ADDR_FILE,"w+");
+ if(fp == NULL)
+ {
+ LYINFLOG("Open addr file failed");
+ return -1;
+ }
+
+ fprintf(fp,"%s",value);
+ fclose(fp);
+
LYINFLOG("Configure upgrade package path success");
return 0;
}
+/*****************************************
+* @brief:lynq_fota_get_addr_value
+* @param count [IN]:char *tmp_value
+* @param sum [OUT]:
+* @return :success 0, failed -1
+* @todo:NA
+* @see:NA
+* @warning:NA
+******************************************/
+int lynq_fota_get_addr_value(char *tmp_value)
+{
+ FILE *fp = NULL;
+ char tmp_addr[128] = {0};
+
+
+ fp = fopen(FOTA_ADDR_FILE,"r");
+ if(fp == NULL)
+ {
+ LYINFLOG("Open fota addr faile failed!!!");
+ return -1;
+ }
+ while(fgets(tmp_addr,sizeof(tmp_addr),fp) != NULL)
+ {
+ if( strstr(tmp_addr,FOTA_FILE_NAME) != NULL)
+ {
+ strncpy(tmp_value,tmp_addr,sizeof(tmp_addr) - 1);
+ break;
+ }
+ else
+ {
+ LYINFLOG("Get addr failed\n");
+ fclose(fp);
+ return -1;
+ }
+ }
+
+ fclose(fp);
+ return 0;
+
+
+}
+
/*****************************************
* @brief:lynq_fota_verify
@@ -740,4 +813,3 @@
#ifdef __cplusplus
}
#endif
-