Merge "[T8TSK-226][DATA]tele-fwk supports restart after disconnection" into GSW3.0-No-Connman
diff --git a/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/init_mount_nand b/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/init_mount_nand
index 159e628..20bc4a8 100755
--- a/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/init_mount_nand
+++ b/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/init_mount_nand
@@ -39,36 +39,16 @@
 		mntdone=`mount -t ubifs /dev/ubi6_0 $MNT_FOLDER 2>&1`
 		echo "mount: mount oemdata"
 	elif [ $BLK_NAME == "oemapp_a" ]; then
-		cat /proc/mtd | grep "oemapp_a" | grep "mtd49"
-		if [ $? -eq 0 ]; then
-			mntdone=`mount -t squashfs /dev/mtdblock49 $MNT_FOLDER 2>&1`
-		else
-			mntdone=`mount -t squashfs /dev/mtdblock43 $MNT_FOLDER 2>&1`
-		fi
+		mntdone=`mount -t squashfs /dev/mtdblock49 $MNT_FOLDER 2>&1`
 		echo "mount: mount oemapp"
 	elif [ $BLK_NAME == "oemapp_b" ]; then
-		cat /proc/mtd | grep "oemapp_b" | grep "mtd50"
-		if [ $? -eq 0 ]; then
-			mntdone=`mount -t squashfs /dev/mtdblock50 $MNT_FOLDER 2>&1`
-		else
-			mntdone=`mount -t squashfs /dev/mtdblock44 $MNT_FOLDER 2>&1`
-		fi
+		mntdone=`mount -t squashfs /dev/mtdblock50 $MNT_FOLDER 2>&1`
 		echo "mount: mount oemapp"
 	elif [ $BLK_NAME == "oemapp2_a" ]; then
-		cat /proc/mtd | grep "oemapp2_a" | grep "mtd47"
-		if [ $? -eq 0 ]; then
-			mntdone=`mount -t squashfs /dev/mtdblock47 $MNT_FOLDER 2>&1`
-		else
-			mntdone=`mount -t squashfs /dev/mtdblock41 $MNT_FOLDER 2>&1`
-		fi
+		mntdone=`mount -t squashfs /dev/mtdblock47 $MNT_FOLDER 2>&1`
 		echo "mount: mount oemapp2"
 	elif [ $BLK_NAME == "oemapp2_b" ]; then
-		cat /proc/mtd | grep "oemapp2_b" | grep "mtd48"
-		if [ $? -eq 0 ]; then
-			mntdone=`mount -t squashfs /dev/mtdblock48 $MNT_FOLDER 2>&1`
-		else
-			mntdone=`mount -t squashfs /dev/mtdblock42 $MNT_FOLDER 2>&1`
-		fi
+		mntdone=`mount -t squashfs /dev/mtdblock48 $MNT_FOLDER 2>&1`
 		echo "mount: mount oemapp2"
 	#you.chen@2022-07-11 add for load oemapp end
 	fi
@@ -225,75 +205,47 @@
 	mkdir -p /dev/disk/by-partlabel
 	if [ -d "/dev/disk/by-partlabel" ]; then
 		cd /dev/disk/by-partlabel
-		cat /proc/mtd | grep "bl2_a"
-		if [ $? -eq 0 ]; then
-			ln -s ../../mtd6 hsm_bl
-			ln -s ../../mtd7 hsm_os_a
-			ln -s ../../mtd42 hsm_os_b
-			ln -s ../../mtd8 boot_para
-			ln -s ../../mtd9 protect_a
-			ln -s ../../mtd10 protect_b
-			ln -s ../../mtd12 boot_a
-			ln -s ../../mtd13 boot_b
-			ln -s ../../mtd14 system_a
-			ln -s ../../mtd15 system_b
-			ln -s ../../mtd16 md1img_a
-			ln -s ../../mtd17 md1img_b
-			ln -s ../../mtd18 md1dsp_a
-			ln -s ../../mtd19 md1dsp_b
-			ln -s ../../mtd20 mcf1_a
-			ln -s ../../mtd21 mcf1_b
-			ln -s ../../mtd22 mcf2_a
-			ln -s ../../mtd23 mcf2_b
-			ln -s ../../mtd24 misc
-			ln -s ../../mtd25 tee_a
-			ln -s ../../mtd26 tee_b
-			ln -s ../../mtd36 vbmeta_a
-			ln -s ../../mtd37 vbmeta_b
-			ln -s ../../mtd39 expdb
-			ln -s ../../mtd0 bl2_a
-			ln -s ../../mtd40 bl2_b
-			ln -s ../../mtd1 bl33_a
-			ln -s ../../mtd41 bl33_b
-			ln -s ../../mtd29 mcupm_a
-			ln -s ../../mtd43 mcupm_b
-			ln -s ../../mtd30 sspm_a
-			ln -s ../../mtd44 sspm_b
-			ln -s ../../mtd31 dpm_a
-			ln -s ../../mtd45 dpm_b
-			ln -s ../../mtd47 oemapp2_a
-			ln -s ../../mtd48 oemapp2_b
-			ln -s ../../mtd49 oemapp_a
-			ln -s ../../mtd50 oemapp_b
-		else
-			ln -s ../../mtd6 hsm_bl
-			ln -s ../../mtd7 hsm_os
-			ln -s ../../mtd8 boot_para
-			ln -s ../../mtd9 protect_a
-			ln -s ../../mtd10 protect_b
-			ln -s ../../mtd12 boot_a
-			ln -s ../../mtd13 boot_b
-			ln -s ../../mtd14 system_a
-			ln -s ../../mtd15 system_b
-			ln -s ../../mtd16 md1img_a
-			ln -s ../../mtd17 md1img_b
-			ln -s ../../mtd18 md1dsp_a
-			ln -s ../../mtd19 md1dsp_b
-			ln -s ../../mtd20 mcf1_a
-			ln -s ../../mtd21 mcf1_b
-			ln -s ../../mtd22 mcf2_a
-			ln -s ../../mtd23 mcf2_b
-			ln -s ../../mtd24 misc
-			ln -s ../../mtd25 tee_a
-			ln -s ../../mtd26 tee_b
-			ln -s ../../mtd36 vbmeta_a
-			ln -s ../../mtd37 vbmeta_b
-			ln -s ../../mtd39 expdb
-			ln -s ../../mtd41 oemapp2_a
-			ln -s ../../mtd42 oemapp2_b
-			ln -s ../../mtd43 oemapp_a
-			ln -s ../../mtd44 oemapp_b
-		fi
+		ln -s ../../mtd6 hsm_bl
+		ln -s ../../mtd7 hsm_os_a
+		ln -s ../../mtd42 hsm_os_b
+		ln -s ../../mtd8 boot_para
+		ln -s ../../mtd9 protect_a
+		ln -s ../../mtd10 protect_b
+		ln -s ../../mtd12 boot_a
+		ln -s ../../mtd13 boot_b
+		ln -s ../../mtd14 system_a
+		ln -s ../../mtd15 system_b
+		ln -s ../../mtd16 md1img_a
+		ln -s ../../mtd17 md1img_b
+		ln -s ../../mtd18 md1dsp_a
+		ln -s ../../mtd19 md1dsp_b
+		ln -s ../../mtd20 mcf1_a
+		ln -s ../../mtd21 mcf1_b
+		ln -s ../../mtd22 mcf2_a
+		ln -s ../../mtd23 mcf2_b
+		ln -s ../../mtd24 misc
+		ln -s ../../mtd25 tee_a
+		ln -s ../../mtd26 tee_b
+		ln -s ../../mtd36 vbmeta_a
+		ln -s ../../mtd37 vbmeta_b
+		ln -s ../../mtd39 expdb
+		ln -s ../../mtd0 bl2_a
+		ln -s ../../mtd40 bl2_b
+		ln -s ../../mtd1 bl33_a
+		ln -s ../../mtd41 bl33_b
+		ln -s ../../mtd29 mcupm_a
+		ln -s ../../mtd43 mcupm_b
+		ln -s ../../mtd30 sspm_a
+		ln -s ../../mtd44 sspm_b
+		ln -s ../../mtd31 dpm_a
+		ln -s ../../mtd45 dpm_b
+		ln -s ../../mtd47 oemapp2_a
+		ln -s ../../mtd48 oemapp2_b
+		ln -s ../../mtd49 oemapp_a
+		ln -s ../../mtd50 oemapp_b
+		ln -s ../../mtd32 medmcu_a
+		ln -s ../../mtd33 medmcu_b
+
 	fi
 
 	mount -t tmpfs /dev/disk/by-partlabel/misc /misc
diff --git a/meta-sdk/meta/meta-lynqSDK-T800/recipes-devtools/flashtool/files/auto2735evb-ivt-main/flashproc.py b/meta-sdk/meta/meta-lynqSDK-T800/recipes-devtools/flashtool/files/auto2735evb-ivt-main/flashproc.py
index 074f5c9..338166b 100755
--- a/meta-sdk/meta/meta-lynqSDK-T800/recipes-devtools/flashtool/files/auto2735evb-ivt-main/flashproc.py
+++ b/meta-sdk/meta/meta-lynqSDK-T800/recipes-devtools/flashtool/files/auto2735evb-ivt-main/flashproc.py
@@ -3,7 +3,7 @@
 #!/usr/bin/python
 import os
 
-procedures = {
+oemfactoryprocedures = {
     # product   : fastboot args
     'DEFAULT': [['fbWait'],
                 ['fastboot', 'flash', 'EMPTY', 'hsm_bl.img'],
@@ -106,6 +106,100 @@
                 ['fastboot', 'flash', 'oemapp2_b', 'oemapp2.img']]
 }
 
+partitiontableprocedures = {
+    # product   : fastboot args
+    'DEFAULT': [['fbWait'],
+                ['fastboot', 'flash', 'EMPTY', 'hsm_bl.img'],
+                ['fastboot', 'continue'],
+                ['fbWait'],
+                ['fastboot', 'flash', 'EMPTY', 'bl2.img'],
+                ['fastboot', 'continue'],
+                ['fbWait'],
+                ['fastboot', 'flash', 'download:tz', 'tee.img'],
+                ['fastboot', 'flash', 'download:bl33', 'bl33.img'],
+                ['fastboot', 'flash', 'download:spmfw', 'spmfw.img'],
+                ['fastboot', 'flash', 'download:mcupm', 'mcupm.img'],
+                ['fastboot', 'flash', 'download:medmcu', 'medmcu.img'],
+                ['fastboot', 'flash', 'download:sspm', 'sspm.img'],
+                ['fastboot', 'flash', 'download:dpm', 'dpm.img'],
+                ['fastboot', 'flash', 'download:hsmos', 'hsm_os.img'],
+                ['fastboot', 'oem', 'continue'],
+                ['fbWait'],
+                ['fastboot', 'oem', 'nanderaseblock', '0'],
+                ['fastboot', 'oem', 'nanderaseblock', '1'],
+                ['fastboot', 'flash', 'nand0', 'MBR_NAND'],
+                ['fastboot', 'erase', 'bl2_a'],
+                ['fastboot', 'flash', 'bl2_a', 'bl2.img'],
+                ['fastboot', 'erase', 'bl2_b'],
+                ['fastboot', 'flash', 'bl2_b', 'bl2.img'],
+                ['fastboot', 'erase', 'bl33_a'],
+                ['fastboot', 'flash', 'bl33_a', 'bl33.img'],
+                ['fastboot', 'erase', 'bl33_b'],
+                ['fastboot', 'flash', 'bl33_b', 'bl33.img'],
+                ['fastboot', 'erase', 'spm_a'],
+                ['fastboot', 'flash', 'spm_a', 'spmfw.img'],
+                ['fastboot', 'erase', 'spm_b'],
+                ['fastboot', 'flash', 'spm_b', 'spmfw.img'],
+                ['fastboot', 'erase', 'dtbo'],
+                ['fastboot', 'flash', 'dtbo', 'combo.dtbo'],
+                ['fastboot', 'erase', 'hsm_bl'],
+                ['fastboot', 'flash', 'hsm_bl', 'hsm_bl.img'],
+                ['fastboot', 'erase', 'hsm_os_a'],
+                ['fastboot', 'flash', 'hsm_os_a', 'hsm_os.img'],
+                ['fastboot', 'erase', 'hsm_os_b'],
+                ['fastboot', 'flash', 'hsm_os_b', 'hsm_os.img'],
+                ['fastboot', 'erase', 'proinfo'],
+                ['fastboot', 'flash', 'proinfo', 'sncfg.ubi'],
+                ['fastboot', 'erase', 'boot_a'],
+                ['fastboot', 'flash', 'boot_a', 'boot.img'],
+                ['fastboot', 'erase', 'boot_b'],
+                ['fastboot', 'flash', 'boot_b', 'boot.img'],
+                ['fastboot', 'erase', 'system_a'],
+                ['fastboot', 'flash', 'system_a', 'system.img'],
+                ['fastboot', 'erase', 'system_b'],
+                ['fastboot', 'flash', 'system_b', 'system.img'],
+                ['fastboot', 'erase', 'md1img_a'],
+                ['fastboot', 'flash', 'md1img_a', 'md1img.img'],
+                ['fastboot', 'erase', 'md1img_b'],
+                ['fastboot', 'flash', 'md1img_b', 'md1img.img'],
+                ['fastboot', 'erase', 'md1dsp_a'],
+                ['fastboot', 'flash', 'md1dsp_a', 'md1dsp.img'],
+                ['fastboot', 'erase', 'md1dsp_b'],
+                ['fastboot', 'flash', 'md1dsp_b', 'md1dsp.img'],
+                ['fastboot', 'erase', 'tee_a'],
+                ['fastboot', 'flash', 'tee_a', 'tee.img'],
+                ['fastboot', 'erase', 'tee_b'],
+                ['fastboot', 'flash', 'tee_b', 'tee.img'],
+                ['fastboot', 'erase', 'mcupm_a'],
+                ['fastboot', 'flash', 'mcupm_a', 'mcupm.img'],
+                ['fastboot', 'erase', 'mcupm_b'],
+                ['fastboot', 'flash', 'mcupm_b', 'mcupm.img'],
+                ['fastboot', 'erase', 'medmcu_a'],
+                ['fastboot', 'flash', 'medmcu_a', 'medmcu.img'],
+                ['fastboot', 'erase', 'medmcu_b'],
+                ['fastboot', 'flash', 'medmcu_b', 'medmcu.img'],
+                ['fastboot', 'erase', 'sspm_a'],
+                ['fastboot', 'flash', 'sspm_a', 'sspm.img'],
+                ['fastboot', 'erase', 'sspm_b'],
+                ['fastboot', 'flash', 'sspm_b', 'sspm.img'],
+                ['fastboot', 'erase', 'dpm_a'],
+                ['fastboot', 'flash', 'dpm_a', 'dpm.img'],
+                ['fastboot', 'erase', 'dpm_b'],
+                ['fastboot', 'flash', 'dpm_b', 'dpm.img'],
+                ['fastboot', 'erase', 'vbmeta_a'],
+                ['fastboot', 'flash', 'vbmeta_a', 'vbmeta.img'],
+                ['fastboot', 'erase', 'vbmeta_b'],
+                ['fastboot', 'flash', 'vbmeta_b', 'vbmeta.img'],
+                ['fastboot', 'erase', 'oemapp_a'],
+                ['fastboot', 'flash', 'oemapp_a', 'oemapp.img'],
+                ['fastboot', 'erase', 'oemapp_b'],
+                ['fastboot', 'flash', 'oemapp_b', 'oemapp.img'],
+                ['fastboot', 'erase', 'oemapp2_a'],
+                ['fastboot', 'flash', 'oemapp2_a', 'oemapp2.img'],
+                ['fastboot', 'erase', 'oemapp2_b'],
+                ['fastboot', 'flash', 'oemapp2_b', 'oemapp2.img']]
+}
+
 userprocedures = {
     # product   : fastboot args
     'DEFAULT': [['fbWait'],
@@ -162,14 +256,18 @@
                 ['fastboot', 'flash', 'bl33_a', 'bl33.img'],
                 ['fastboot', 'erase', 'bl33_b'],
                 ['fastboot', 'flash', 'bl33_b', 'bl33.img'],
+                ['fastboot', 'erase', 'spm_a'],
+                ['fastboot', 'flash', 'spm_a', 'spmfw.img'],
+                ['fastboot', 'erase', 'spm_b'],
+                ['fastboot', 'flash', 'spm_b', 'spmfw.img'],
+                ['fastboot', 'erase', 'dtbo'],
+                ['fastboot', 'flash', 'dtbo', 'combo.dtbo'],
                 ['fastboot', 'erase', 'hsm_bl'],
                 ['fastboot', 'flash', 'hsm_bl', 'hsm_bl.img'],
                 ['fastboot', 'erase', 'hsm_os_a'],
                 ['fastboot', 'flash', 'hsm_os_a', 'hsm_os.img'],
                 ['fastboot', 'erase', 'hsm_os_b'],
                 ['fastboot', 'flash', 'hsm_os_b', 'hsm_os.img'],
-                ['fastboot', 'erase', 'dtbo'],
-                ['fastboot', 'flash', 'dtbo', 'combo.dtbo'],
                 ['fastboot', 'erase', 'proinfo'],
                 ['fastboot', 'flash', 'proinfo', 'sncfg.ubi'],
                 ['fastboot', 'erase', 'boot_a'],
@@ -188,6 +286,10 @@
                 ['fastboot', 'flash', 'md1dsp_a', 'md1dsp.img'],
                 ['fastboot', 'erase', 'md1dsp_b'],
                 ['fastboot', 'flash', 'md1dsp_b', 'md1dsp.img'],
+                ['fastboot', 'erase', 'tee_a'],
+                ['fastboot', 'flash', 'tee_a', 'tee.img'],
+                ['fastboot', 'erase', 'tee_b'],
+                ['fastboot', 'flash', 'tee_b', 'tee.img'],
                 ['fastboot', 'erase', 'mcupm_a'],
                 ['fastboot', 'flash', 'mcupm_a', 'mcupm.img'],
                 ['fastboot', 'erase', 'mcupm_b'],
@@ -204,10 +306,6 @@
                 ['fastboot', 'flash', 'dpm_a', 'dpm.img'],
                 ['fastboot', 'erase', 'dpm_b'],
                 ['fastboot', 'flash', 'dpm_b', 'dpm.img'],
-                ['fastboot', 'erase', 'tee_a'],
-                ['fastboot', 'flash', 'tee_a', 'tee.img'],
-                ['fastboot', 'erase', 'tee_b'],
-                ['fastboot', 'flash', 'tee_b', 'tee.img'],
                 ['fastboot', 'erase', 'vbmeta_a'],
                 ['fastboot', 'flash', 'vbmeta_a', 'vbmeta.img'],
                 ['fastboot', 'erase', 'vbmeta_b'],
@@ -243,14 +341,18 @@
                 ['fastboot', 'flash', 'bl33_a', 'bl33.img'],
                 ['fastboot', 'erase', 'bl33_b'],
                 ['fastboot', 'flash', 'bl33_b', 'bl33.img'],
+                ['fastboot', 'erase', 'spm_a'],
+                ['fastboot', 'flash', 'spm_a', 'spmfw.img'],
+                ['fastboot', 'erase', 'spm_b'],
+                ['fastboot', 'flash', 'spm_b', 'spmfw.img'],
+                ['fastboot', 'erase', 'dtbo'],
+                ['fastboot', 'flash', 'dtbo', 'combo.dtbo'],
                 ['fastboot', 'erase', 'hsm_bl'],
                 ['fastboot', 'flash', 'hsm_bl', 'hsm_bl.img'],
                 ['fastboot', 'erase', 'hsm_os_a'],
                 ['fastboot', 'flash', 'hsm_os_a', 'hsm_os.img'],
                 ['fastboot', 'erase', 'hsm_os_b'],
                 ['fastboot', 'flash', 'hsm_os_b', 'hsm_os.img'],
-                ['fastboot', 'erase', 'dtbo'],
-                ['fastboot', 'flash', 'dtbo', 'combo.dtbo'],
                 ['fastboot', 'erase', 'proinfo'],
                 ['fastboot', 'flash', 'proinfo', 'sncfg.ubi'],
                 ['fastboot', 'erase', 'boot_a'],
@@ -269,6 +371,10 @@
                 ['fastboot', 'flash', 'md1dsp_a', 'md1dsp.img'],
                 ['fastboot', 'erase', 'md1dsp_b'],
                 ['fastboot', 'flash', 'md1dsp_b', 'md1dsp.img'],
+                ['fastboot', 'erase', 'tee_a'],
+                ['fastboot', 'flash', 'tee_a', 'tee.img'],
+                ['fastboot', 'erase', 'tee_b'],
+                ['fastboot', 'flash', 'tee_b', 'tee.img'],
                 ['fastboot', 'erase', 'mcupm_a'],
                 ['fastboot', 'flash', 'mcupm_a', 'mcupm.img'],
                 ['fastboot', 'erase', 'mcupm_b'],
@@ -285,10 +391,6 @@
                 ['fastboot', 'flash', 'dpm_a', 'dpm.img'],
                 ['fastboot', 'erase', 'dpm_b'],
                 ['fastboot', 'flash', 'dpm_b', 'dpm.img'],
-                ['fastboot', 'erase', 'tee_a'],
-                ['fastboot', 'flash', 'tee_a', 'tee.img'],
-                ['fastboot', 'erase', 'tee_b'],
-                ['fastboot', 'flash', 'tee_b', 'tee.img'],
                 ['fastboot', 'erase', 'vbmeta_a'],
                 ['fastboot', 'flash', 'vbmeta_a', 'vbmeta.img'],
                 ['fastboot', 'erase', 'vbmeta_b'],
@@ -310,7 +412,7 @@
 # return procedure list
 def getFlashProc(product):
     try:
-        ret = procedures[product.upper()]
+        ret = partitiontableprocedures[product.upper()]
         return ret
     except:
         return None
@@ -343,3 +445,17 @@
         return ret
     except:
         return None
+    
+def getFlashFactoryProc(product):
+    try:
+        ret = factoryprocedures[product.upper()]
+        return ret
+    except:
+        return None
+    
+def getFlashOemFactoryProc(product):
+    try:
+        ret = oemfactoryprocedures[product.upper()]
+        return ret
+    except:
+        return None
diff --git a/meta-sdk/meta/meta-lynqSDK-T800/recipes-devtools/flashtool/files/flashimage.py b/meta-sdk/meta/meta-lynqSDK-T800/recipes-devtools/flashtool/files/flashimage.py
index 557af18..bac8417 100755
--- a/meta-sdk/meta/meta-lynqSDK-T800/recipes-devtools/flashtool/files/flashimage.py
+++ b/meta-sdk/meta/meta-lynqSDK-T800/recipes-devtools/flashtool/files/flashimage.py
@@ -209,6 +209,10 @@
                         help='print more information while flashing')
     parser.add_argument('-n', '--nata', action = 'store_true', default = False,
                         help = 'Flash image in nata')
+    parser.add_argument('--oem_factory', action = 'store_true', default = False,
+                        help = 'Flash image for oem factory produce')
+    parser.add_argument('-p', '--update_with_partiontable_keep_alldata', action = 'store_true', default = False,
+                        help = 'Flash image with partion table and keep all data')
     parser.add_argument('--toolsdir', default=None,
                         help='''\
 The tools dir where to find fbtool and fastboot.
@@ -266,6 +270,10 @@
         from flashproc import getFlashUserDataProc
     except:
         getFlashUserDataProc = getFlashProc
+    try:
+        from flashproc import getFlashOemFactoryProc
+    except:
+        getFlashOemFactoryProc = getFlashProc
 
     # check flash tools
     toolsdir = ''
@@ -288,7 +296,7 @@
 
     devProduct = 'DEFAULT'
 
-    procs = getFlashProc(devProduct)
+    procs = None
     if args.user:
         procs = getFlashUserProc(devProduct)
     if args.boot:
@@ -297,6 +305,13 @@
         procs = getFlashTestProc(devProduct)
     if args.userdata:
         procs = getFlashUserDataProc(devProduct)
+    if args.oem_factory:
+        procs = getFlashOemFactoryProc(devProduct)
+    if args.oem_factory:
+        procs = getFlashOemFactoryProc(devProduct)
+    if args.update_with_partiontable_keep_alldata:
+        procs = getFlashProc(devProduct)
+
     if procs:
         if verbose:
             print('Flash procedure'.center(80))
diff --git a/src/bsp/trustzone/atf/v1.6/mt2xxx/plat/mediatek/mt2735/mpu_ctrl/plat_mpu_feats.h b/src/bsp/trustzone/atf/v1.6/mt2xxx/plat/mediatek/mt2735/mpu_ctrl/plat_mpu_feats.h
index 9aec04d..970c2e7 100644
--- a/src/bsp/trustzone/atf/v1.6/mt2xxx/plat/mediatek/mt2735/mpu_ctrl/plat_mpu_feats.h
+++ b/src/bsp/trustzone/atf/v1.6/mt2xxx/plat/mediatek/mt2735/mpu_ctrl/plat_mpu_feats.h
@@ -68,7 +68,7 @@
 			.d11 = FORBIDDEN, .d10 = FORBIDDEN,
 			.d9  = NO_PROTECTION, .d8  = NO_PROTECTION,
 			.d7  = SEC_R_NSEC_R, .d6  = SEC_R_NSEC_RW,
-			.d5  = FORBIDDEN, .d4  = NO_PROTECTION,
+			.d5  = NO_PROTECTION, .d4  = NO_PROTECTION,  //tmp change for reboot_reason 3
 			.d3  = FORBIDDEN, .d2  = FORBIDDEN,
 			.d1  = SEC_R_NSEC_R, .d0  = NO_PROTECTION,
 		}, },
diff --git a/src/lynq/lib/liblynq-fota/MD5/md5.c b/src/lynq/lib/liblynq-fota/MD5/md5.c
old mode 100644
new mode 100755
diff --git "a/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/Backup/main\0507919\051.c" "b/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/Backup/main\0507919\051.c"
old mode 100644
new mode 100755
diff --git "a/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/Backup/md5_encode\0502203\051.h" "b/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/Backup/md5_encode\0502203\051.h"
old mode 100644
new mode 100755
diff --git "a/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/Backup/md5_encode\0505411\051.c" "b/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/Backup/md5_encode\0505411\051.c"
old mode 100644
new mode 100755
diff --git a/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/cache/parse/main.c.sisc b/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/cache/parse/main.c.sisc
old mode 100644
new mode 100755
Binary files differ
diff --git a/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/cache/parse/md5.c.sisc b/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/cache/parse/md5.c.sisc
old mode 100644
new mode 100755
Binary files differ
diff --git a/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/cache/parse/md5.h.sisc b/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/cache/parse/md5.h.sisc
old mode 100644
new mode 100755
Binary files differ
diff --git a/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/cache/parse/md5_encode.c.sisc b/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/cache/parse/md5_encode.c.sisc
old mode 100644
new mode 100755
Binary files differ
diff --git a/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/cache/parse/md5_encode.h.sisc b/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/cache/parse/md5_encode.h.sisc
old mode 100644
new mode 100755
Binary files differ
diff --git a/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/md5_0628.bookmarks.xml b/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/md5_0628.bookmarks.xml
old mode 100644
new mode 100755
diff --git a/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/md5_0628.siproj_settings.xml b/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/md5_0628.siproj_settings.xml
old mode 100644
new mode 100755
diff --git a/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/md5_0628.siwork b/src/lynq/lib/liblynq-fota/MD5/md5_0628.si4project/md5_0628.siwork
old mode 100644
new mode 100755
Binary files differ
diff --git a/src/lynq/lib/liblynq-fota/MD5/md5_encode.c b/src/lynq/lib/liblynq-fota/MD5/md5_encode.c
old mode 100644
new mode 100755
diff --git a/src/lynq/lib/liblynq-fota/include/iot_rock.h b/src/lynq/lib/liblynq-fota/include/iot_rock.h
index e757a42..59ec7f6 100755
--- a/src/lynq/lib/liblynq-fota/include/iot_rock.h
+++ b/src/lynq/lib/liblynq-fota/include/iot_rock.h
@@ -29,21 +29,48 @@
 #define PATCH_OEMAPP   (7)

 #define PATCH_OEMAPP2  (8)

 #define PATCH_MEDMCU   (9)

-#define PATCH_BL33     (10)

-#define PATCH_RESERVE  (11)

-#define FULL_SYSTEM    (12)

-#define FULL_BOOT      (13)

-#define FULL_TEE       (14)

-#define FULL_MD1IMG    (15)

-#define FULL_MD1DSP    (16) 

-#define FULL_VBMETA    (17)

-#define FULL_OEMAPP    (18)

-#define FULL_OEMAPP2   (19)

-#define FULL_MEDMCU    (20)

-#define FULL_BL33      (21)

-#define FULL_RESERVE   (22)

+#define PATCH_SPM      (10)

+#define PATCH_PROTECT  (11)

+#define PATCH_MCF1     (12)

+#define PATCH_MCF2     (13)

+#define PATCH_MCUPM    (14)

+#define PATCH_SSPM     (15)

+#define PATCH_DPM      (16)

+#define PATCH_PIIMG    (17)

+#define PATCH_HSMOS    (18)

+#define PATCH_BL2      (19)

+#define PATCH_BL33     (20)

 

-#define MAX_OTA_ROLE   (22) 

+#define FULL_SYSTEM    (65)

+#define FULL_BOOT      (66)

+#define FULL_TEE       (67)

+#define FULL_MD1IMG    (68)

+#define FULL_MD1DSP    (69) 

+#define FULL_VBMETA    (70)

+#define FULL_OEMAPP    (71)

+#define FULL_OEMAPP2   (72)

+#define FULL_MEDMCU    (73)

+#define FULL_SPM       (74)

+#define FULL_PROTECT   (75)

+#define FULL_MCF1      (76)

+#define FULL_MCF2      (77)

+#define FULL_MCUPM     (78) 

+#define FULL_SSPM      (79)

+#define FULL_DPM       (80)

+#define FULL_PIIMG     (81)

+#define FULL_HSMOS     (82)

+#define FULL_BL2       (83)

+#define FULL_BL33      (84)

+

+

+

+

+

+

+

+

+#define MAX_OTA_ROLE   (128) 

+#define REAL_OTA_ROLE  (20)

 

 

 

@@ -71,30 +98,7 @@
 } IOT_UPDATA_CONTEXT;

 

 

-typedef struct {

-	unsigned int sys;	//system 差分包大小

-	unsigned int boot;	//boot   差分包大小

-    unsigned int tee;	//tee    差分包大小

-    unsigned int md1img;	//md1img    差分包大小

-	unsigned int md1dsp;   //md1dsp   差分包大小

-    unsigned int vbmeta;   //vbmeta   差分包大小	

-    unsigned int oemapp;

-    unsigned int oemapp2;

-    unsigned int medmcu;	

-    unsigned int bl33;	//bl33   差分包大小

-	unsigned int reserve;

-	unsigned int full_sys;	//system 整包大小

-	unsigned int full_boot;	//boot   

-    unsigned int full_tee;	//tee    整包大小

-    unsigned int full_md1img;	//    整包大小

-    unsigned int full_md1dsp;	//md1dsp   整包大小

-	unsigned int full_vbmeta;	//vbmeta  整包大小

-    unsigned int full_oemapp;

-    unsigned int full_oemapp2;

-    unsigned int full_medmcu;	

-    unsigned int full_bl33;	//bl33   整包大小

-	unsigned int full_reserve;	

-} DELTA_HEAD;

+

 

 typedef struct {

 

@@ -129,7 +133,8 @@
 

 //#define DELTA_HEARD_SIZE	(4*5)

 

-#define DELTA_HEARD_SIZE	    (4*11 + 4*11)

+//#define DELTA_HEARD_SIZE	    (4*11 + 4*11)

+#define DELTA_HEARD_SIZE	    512

 #define DELTA_FULL_HEARD_SIZE   8

 

 

@@ -138,6 +143,7 @@
 

 unsigned int iot_hash(unsigned char *buf,unsigned int len, unsigned int* value);

 int lynq_md5_file_verfy(char* filePath, char* file_md5);

+//int md5_file_verfy_new(char* filePath, char* file_md5,int packe_len);

 int lynq_rock_main(int first_run);

 int lynq_fota_func(void);

 int lynq_nand_open(const char *pathname, int flags);

diff --git a/src/lynq/lib/liblynq-fota/include/iot_rock_ipl.h b/src/lynq/lib/liblynq-fota/include/iot_rock_ipl.h
old mode 100644
new mode 100755
diff --git a/src/lynq/lib/liblynq-fota/include/md5.h b/src/lynq/lib/liblynq-fota/include/md5.h
old mode 100644
new mode 100755
diff --git a/src/lynq/lib/liblynq-fota/include/md5_encode.h b/src/lynq/lib/liblynq-fota/include/md5_encode.h
old mode 100644
new mode 100755
diff --git a/src/lynq/lib/liblynq-fota/include/sha.h b/src/lynq/lib/liblynq-fota/include/sha.h
old mode 100644
new mode 100755
diff --git a/src/lynq/lib/liblynq-fota/lib/libiotpatch.a b/src/lynq/lib/liblynq-fota/lib/libiotpatch.a
old mode 100644
new mode 100755
Binary files differ
diff --git a/src/lynq/lib/liblynq-fota/lib/libmd5.a b/src/lynq/lib/liblynq-fota/lib/libmd5.a
old mode 100644
new mode 100755
Binary files differ
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 4106d5c..854de9e 100755
--- a/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c
+++ b/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c
@@ -39,40 +39,9 @@
 #define ROCK_BACKUP_LEN ROCK_DEFAULT_BLOCK_SIZE
 
 
-#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_MD1IMG_A    "/dev/disk/by-partlabel/md1img_a"
-#define DEV_MD1IMG_B    "/dev/disk/by-partlabel/md1img_b"
+#define FILENAME_SIZE   50
 
-#define DEV_TEE_A       "/dev/disk/by-partlabel/tee_a"
-#define DEV_TEE_B       "/dev/disk/by-partlabel/tee_b" 
-
-#define DEV_MD1DSP_A       "/dev/disk/by-partlabel/md1dsp_a"
-#define DEV_MD1DSP_B       "/dev/disk/by-partlabel/md1dsp_b" 
-
-#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"
-
-#define DEV_MISC        "/dev/disk/by-partlabel/misc"
-
-
-#define DEV_MEDMCU_A       "/dev/mtd32"
-#define DEV_MEDMCU_B       "/dev/mtd33"
-
-#define DEV_BL33_A       "/dev/disk/by-partlabel/bl33_a"
-#define DEV_BL33_B       "/dev/disk/by-partlabel/bl33_b" 
 
 
 //#define DEV_DELTA       "/dev/disk/by-partlabel/delta"
@@ -82,6 +51,86 @@
 #define DEV_DELTA       "/dev/mtd41"	
 #endif
 
+
+
+char partition_filename_a[][FILENAME_SIZE] = {
+	{"/dev/disk/by-partlabel/system_a"},
+	{"/dev/disk/by-partlabel/boot_a"},
+	{"/dev/disk/by-partlabel/tee_a"},
+	{"/dev/disk/by-partlabel/md1img_a"},
+	{"/dev/disk/by-partlabel/md1dsp_a"},
+	{"/dev/disk/by-partlabel/vbmeta_a"},
+	{"/dev/disk/by-partlabel/oemapp_a"},
+	{"/dev/disk/by-partlabel/oemapp2_a"},
+	{"/dev/disk/by-partlabel/medmcu_a"},
+	{"/dev/disk/by-partlabel/spm_a"},
+	{"/dev/disk/by-partlabel/protect_a"},	
+	{"/dev/disk/by-partlabel/mcf1_a"},
+	{"/dev/disk/by-partlabel/mcf2_a"},
+	{"/dev/disk/by-partlabel/mcupm_a"},
+	{"/dev/disk/by-partlabel/sspm_a"},	
+	{"/dev/disk/by-partlabel/dpm_a"},
+	{"/dev/disk/by-partlabel/pi_img_a"},	
+	{"/dev/disk/by-partlabel/hsm_os_a"},
+	{"/dev/disk/by-partlabel/bl2_a"},	
+	{"/dev/disk/by-partlabel/bl33_a"}
+};
+
+
+char partition_filename_b[][FILENAME_SIZE] = {
+	{"/dev/disk/by-partlabel/system_b"},
+	{"/dev/disk/by-partlabel/boot_b"},
+	{"/dev/disk/by-partlabel/tee_b"},
+	{"/dev/disk/by-partlabel/md1img_b"},
+	{"/dev/disk/by-partlabel/md1dsp_b"},
+	{"/dev/disk/by-partlabel/vbmeta_b"},
+	{"/dev/disk/by-partlabel/oemapp_b"},
+	{"/dev/disk/by-partlabel/oemapp2_b"},
+	{"/dev/disk/by-partlabel/medmcu_b"},	
+	{"/dev/disk/by-partlabel/spm_b"},
+	{"/dev/disk/by-partlabel/protect_b"},
+	{"/dev/disk/by-partlabel/mcf1_b"},
+	{"/dev/disk/by-partlabel/mcf2_b"},
+	{"/dev/disk/by-partlabel/mcupm_b"},
+	{"/dev/disk/by-partlabel/sspm_b"},	
+	{"/dev/disk/by-partlabel/dpm_b"},
+	{"/dev/disk/by-partlabel/pi_img_b"},
+	{"/dev/disk/by-partlabel/hsm_os_b"},
+	{"/dev/disk/by-partlabel/bl2_b"},	
+	{"/dev/disk/by-partlabel/bl33_b"}
+};
+
+
+
+
+char partition_filename[][FILENAME_SIZE] = {
+	{"system"},
+	{"boot"},
+	{"tee"},
+	{"md1img"},
+	{"md1dsp"},
+	{"vbmeta"},
+	{"oemapp"},
+	{"oemapp2"},
+	{"medmcu"},
+	{"spm"},
+	{"protect"},
+	{"mcf1"},
+	{"mcf2"},
+	{"mcupm"},
+	{"sspm"},
+	{"dpm"},
+	{"pi_img"},
+	{"hsm_os"},
+	{"bl2"},
+	{"bl33"}
+};
+//+10 
+
+unsigned int  delta_head[128]={0};  //512/4   128/2=64
+
+
+
 #define FOTA_UCI_MODULE "lynq_fota"
 #define FOTA_UCI_FILE "lynq_uci"
 #define FOTA_UCI_ADDR "lynq_fota_addr"
@@ -104,7 +153,8 @@
 
 
 
-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,fd_medmcu_a,fd_medmcu_b,fd_bl33_a,fd_bl33_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,fd_medmcu_a,fd_medmcu_b,fd_bl33_a,fd_bl33_b;
+int fd_delta,fd_curr,fd_log,fd_update_status,fd_fota_status;
 int fd_write,fd_read;
 
 static unsigned int  delta_offset = 0;
@@ -112,7 +162,7 @@
 unsigned int  current_slot = 0;
 unsigned char rock_debug_buffer[512];
 
-DELTA_HEAD  da_head;
+
 
 OTA_STATUS  fota_status;
 
@@ -163,7 +213,7 @@
 
     
     vsnprintf(rock_debug_buffer,sizeof(rock_debug_buffer),fmt,ap);
-	RLOGD("+[ROCK_TRACE]: %s",rock_debug_buffer);
+	LYDBGLOG("+[UA]: %s",rock_debug_buffer);
 	
 
     va_end (ap);
@@ -502,12 +552,12 @@
 
 
 	if (lseek(fd_delta, start, SEEK_SET) < 0) {
-        RLOGD("+[UA]: delta_copyto_nand seek err\n");
+        LYERRLOG("+[UA]: delta_copyto_nand seek err\n");
 		return -1;
     }
  
  	if (mtk_device_wrap_seek(fd_curr, 0, SEEK_SET) < 0) {
-        RLOGD("+[UA]: delta_copyto_nand seek err\n");
+        LYERRLOG("+[UA]: delta_copyto_nand seek err\n");
 		return -1;
     }
  
@@ -544,9 +594,7 @@
 
 
 
-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) {
+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 status,err,start;
     int ret = 0;
 	int i = 0;
@@ -567,8 +615,11 @@
 	char digest_s[SHA_DIGEST_SIZE];
 	char digest_t[SHA_DIGEST_SIZE];
 	char str_sha[40];
+	char cmd_sys[100];
 	
 	int sha_size = 0;
+	int is_need_fullupdate = 0;
+	int fd_partition_a,fd_partition_b;
 
 	
     hw_module = &HAL_MODULE_INFO_SYM;
@@ -608,7 +659,8 @@
 	ctx.ram_base =(unsigned char *)&ram_buffer[0];
 	ctx.ram_len = ROCK_RAM_LEN;
 	ctx.backup_base = BACKUP_ADDR_FLAG;
-	ctx.backup_len = ROCK_DEFAULT_BLOCK_SIZE;	
+	//ctx.backup_len = ROCK_DEFAULT_BLOCK_SIZE;
+    ctx.backup_len = 0;		
 	ctx.update_nvram = 0;
 	ctx.read_rom_directly = read_rom_directly;
     //ctx.first_run = first_run;
@@ -631,11 +683,12 @@
 
 	RLOGD("+[UA]: up_info.ota_run = %d\n",up_info.ota_run);
 	
-	
+#if 0	
 	if ((up_info.ota_run>PATCH_BL33)||(up_info.ota_run<PATCH_SYSTEM))
 	{
 		up_info.ota_run = 0;
 	}	
+#endif 
 	
 	up_info.ota_run = 0;
 	
@@ -650,85 +703,50 @@
 	RLOGD("+[UA]: up_info.fota_flag = %s\n",up_info.fota_flag);
 	RLOGD("+[UA]: update_mode = %d\n",update_mode);
 	
-    memset(&da_head, 0, sizeof(da_head));
+    //memset(&da_head, 0, sizeof(da_head));
 
-	read(fd_delta, (unsigned char*)&da_head, sizeof(da_head));
+	//read(fd_delta, (unsigned char*)&da_head, sizeof(da_head));
+
+    memset(&delta_head, 0, sizeof(delta_head));
+	read(fd_delta, (char *)&delta_head[0], sizeof(delta_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.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) {
-	    fota_status.update_status[PATCH_SYSTEM - 1].need_update = 1;
-	}
-	if (da_head.boot>0) {
-		fota_status.update_status[PATCH_BOOT - 1].need_update = 1;
-	}
-	if (da_head.tee>0) {
-		fota_status.update_status[PATCH_TEE - 1].need_update = 1;
-	}
-	if (da_head.md1img>0) {
-		fota_status.update_status[PATCH_MD1IMG - 1].need_update = 1;
-	}
-	if (da_head.md1dsp>0) {
-		fota_status.update_status[PATCH_MD1DSP - 1].need_update = 1;
-	}
-	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.medmcu>0) {
-		fota_status.update_status[PATCH_MEDMCU - 1].need_update = 1;
-	}	
-	if (da_head.bl33>0) {
-		fota_status.update_status[PATCH_BL33 - 1].need_update = 1;
+
+    delta_size = 0;
+	sha_size = 0;
+    for (i = 0;i<REAL_OTA_ROLE; i++)	{
+	    if (delta_head[i] > 0) {
+		    fota_status.update_status[i].need_update = 1;
+			delta_size+=delta_head[i];
+			
+		}
+        RLOGD("+[UA]: %s,delta size = %d\n",partition_filename[i],delta_head[i]);	
 	}
 	
-	if (da_head.full_sys>0) {
-		fota_status.update_status[FULL_SYSTEM - 1].need_update = 1;
+	
+	for(i = MAX_OTA_ROLE/2;i<(MAX_OTA_ROLE/2+REAL_OTA_ROLE); i++) {
+		if (delta_head[i] > 0) {
+		    fota_status.update_status[i].need_update = 1;
+			sha_size+=delta_head[i];
+		}
+		RLOGD("+[UA]: %s,full size = %d\n",partition_filename[i-MAX_OTA_ROLE/2],delta_head[i]);
 	}
-	if (da_head.full_boot>0) {
-		fota_status.update_status[FULL_BOOT - 1].need_update = 1;
-	}
-	if (da_head.full_tee>0) {
-		fota_status.update_status[FULL_TEE - 1].need_update = 1;
-	}
-	if (da_head.full_md1img>0) {
-		fota_status.update_status[FULL_MD1IMG - 1].need_update = 1;
-	}
-	if (da_head.full_bl33>0) {
-		fota_status.update_status[FULL_BL33 - 1].need_update = 1;
-	}
-	if (da_head.full_md1dsp>0) {
-		fota_status.update_status[FULL_MD1DSP - 1].need_update = 1;
-	}
-	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;
-    }
-    if (da_head.full_medmcu>0) {
-        fota_status.update_status[FULL_MEDMCU - 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.oemapp + da_head.oemapp2 + da_head.medmcu+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.medmcu+da_head.bl33;
 	
-	sha_size = 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_medmcu+da_head.full_bl33;
+	//sha_size = 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_medmcu+da_head.full_bl33
 
+
+
+
+    is_need_fullupdate = 0;
     if(sha_size>0) {
-	
+	    is_need_fullupdate = 1;
 	    sha_size+=8;    
 	}
 
@@ -738,12 +756,12 @@
 	memset(digest_t,0,SHA_DIGEST_SIZE);
 	memset(str_sha,0,40);
 	
-	lseek(fd_delta, sha_size + sizeof(da_head), SEEK_SET);
+	lseek(fd_delta, sha_size + sizeof(delta_head), SEEK_SET);
 	read(fd_delta, digest_s, SHA_DIGEST_SIZE);
 	convert_hex(digest_s,str_sha);
 	RLOGD("+[UA]: delta save sha = %s\n",str_sha);
 	
-	ROCK_SHA_FILE_COMMON(fd_delta,sizeof(da_head),sha_size,digest_t);
+	ROCK_SHA_FILE_COMMON(fd_delta,sizeof(delta_head),sha_size,digest_t);
 	memset(str_sha,0,40);
     convert_hex(digest_t,str_sha);
     RLOGD("+[UA]: delta calc sha = %s\n",str_sha);
@@ -762,1252 +780,138 @@
 	
 	memset(digest_s,0,SHA_DIGEST_SIZE);
 	memset(digest_t,0,SHA_DIGEST_SIZE);
+	
+	
+	//delta_offset = DELTA_HEARD_SIZE;
+	delta_offset = sizeof(delta_head);
+	
+	for(i = 0;i<REAL_OTA_ROLE; i++){    //diff
+	    //now_patch = i+1;
+	    if (i>0) {
+			delta_offset+=delta_head[i-1];
+	    }
+	    if((delta_head[i]>0) && (up_info.ota_run<=(i+1))){ 
+                        now_patch = i + 1;
+#if 0
+			if (up_info.ota_run == now_patch) //升级ps断电?
+			{
+				ctx.first_run = 0;
 
-    if ((da_head.sys>0) && (up_info.ota_run <= PATCH_SYSTEM))
-	{
-
-        now_patch = PATCH_SYSTEM;
-        delta_offset = DELTA_HEARD_SIZE;
-  
-#if 0		
-		if (up_info.ota_run == PATCH_SYSTEM) 
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-		//up_info.ota_run = 0;
-
+			}else{
+				ctx.first_run = 1;
+			}
+#endif 			
+			ctx.first_run = 1;  //always
+            RLOGD("+[UA]: PATCH %s,ctx.first_run = %d\n", partition_filename[i] ,ctx.first_run);
+			up_info.ota_run = now_patch;	
 		
-        if(current_slot==SLOT_B) {
-	        fd_system_a = mtk_device_wrap_open(DEV_SYSTEM_A,O_RDWR);
-            if (fd_system_a < 0) {
+			if(current_slot==SLOT_B) {
+				sprintf(cmd_sys,"flash_eraseall %s",partition_filename_a[i]);
+			}else{
+			    sprintf(cmd_sys,"flash_eraseall %s",partition_filename_b[i]);
+			}
+		    system(cmd_sys);
+
+
+	        fd_partition_a = mtk_device_wrap_open(partition_filename_a[i],O_RDWR);
+            if (fd_partition_a < 0) {
                 err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                return -err;
-            }
-			fd_curr = fd_system_a;
-		}else{
-	        fd_system_b = mtk_device_wrap_open(DEV_SYSTEM_B,O_RDWR);
-            if (fd_system_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                return -err;
-            }
-			fd_curr = fd_system_b;			
-		}
-
-#endif 
-
-
-        ctx.first_run = 1;   // always
-		
-
-		
-		if(current_slot==SLOT_B) {
-		    system("flash_eraseall /dev/disk/by-partlabel/system_a");
-		} else {
-			system("flash_eraseall /dev/disk/by-partlabel/system_b");
-		}
-		
-//        if(current_slot==SLOT_B) {
-	        fd_system_a = mtk_device_wrap_open(DEV_SYSTEM_A,O_RDWR);
-            if (fd_system_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening system file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening id_a[%d] file: %s\n",i,strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
             }
-//			fd_curr = fd_system_a;
-//		}else{
-	        fd_system_b = mtk_device_wrap_open(DEV_SYSTEM_B,O_RDWR);
-            if (fd_system_b < 0) {
+
+	        fd_partition_b = mtk_device_wrap_open(partition_filename_b[i],O_RDWR);
+            if (fd_partition_b < 0) {
                 err = errno;
-                RLOGD("+[UA]: Error opening system file: %s\n",strerror(errno));
+                RLOGD("+[UA]: Error opening id_b[%d] file: %s\n",i,strerror(errno));
                 lynq_fota_release_wake_lock();
                 return -err;
-            }
-//			fd_curr = fd_system_b;			
-//		}
-		
-		if(current_slot==SLOT_B){
-			fd_read  = fd_system_b;
-			fd_write = fd_system_a;	
-		} else {
-			fd_read  = fd_system_a;
-			fd_write = fd_system_b;
-		}
+            }		    
+			if(current_slot==SLOT_B){
+				fd_read  = fd_partition_b;
+				fd_write = fd_partition_a;	
+			} else {
+				fd_read  = fd_partition_a;
+				fd_write = fd_partition_b;
+			}
 
-		
-		fota_status.ota_run = PATCH_SYSTEM;
-        fota_status.update_status[PATCH_SYSTEM -1].check_delta = WAIT;
-		fota_status.update_status[PATCH_SYSTEM -1].check_rom = WAIT;
-		fota_status.update_status[PATCH_SYSTEM-1].update_result= WAIT;
+			fota_status.ota_run = i;
+			fota_status.update_status[i].check_delta = WAIT;
+			fota_status.update_status[i].check_rom = WAIT;
+			fota_status.update_status[i].update_result= WAIT;
 
-		save_fota_status();
+			save_fota_status();
 		
 		
-		up_info.ota_run = PATCH_SYSTEM;
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();
+			up_info.ota_run = i+1;
+			lseek(fd_update_status,0,SEEK_SET);
+			write(fd_update_status, &up_info,sizeof(up_info));
+			sync();
 		
 		
-		RLOGD("+[UA]: Start upgrading system.\n");
-        status = iot_patch(&ctx);
-		RLOGD("+[UA]: system upgrade result:%d\n",status);
+			RLOGD("+[UA]: Start upgrading %s.\n",partition_filename[i]);
+			status = iot_patch(&ctx);
+			RLOGD("+[UA]: %s upgrade result:%d\n",partition_filename[i],status);
 		
-		//up_info.ota_run = 0;
+			//up_info.ota_run = 0;
 		
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_SYSTEM -1].update_result= status; 
-		fota_status.update_result= status;
+			//fota_status.ota_run = 0;
+			fota_status.update_status[i].update_result= status; 
+			fota_status.update_result= status;
 
-        if((status == 0)||(status ==1))
-        {
+			if((status == 0)||(status ==1))
+			{
 
-            fota_status.update_status[PATCH_SYSTEM -1].check_delta = PASS;
-		    fota_status.update_status[PATCH_SYSTEM -1].check_rom = PASS;
-            RLOGD("system upgrade success!!!\n");
+				fota_status.update_status[i].check_delta = PASS;
+				fota_status.update_status[i].check_rom = PASS;
+				RLOGD("+[UA]: %s upgrade success!!!\n",partition_filename[i]);
                
-		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_SYSTEM -1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_SYSTEM -1].check_rom = WAIT;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_SYSTEM -1].check_delta = PASS;
-		    fota_status.update_status[PATCH_SYSTEM -1].check_rom = ERROR;
+			}else if(status == E_ROCK_INVALID_DELTA) {
+				fota_status.update_status[i].check_delta = ERROR;
+				fota_status.update_status[i].check_rom = WAIT;
+			}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
+				fota_status.update_status[i].check_delta = PASS;
+				fota_status.update_status[i].check_rom = ERROR;
 
-		}else{
+			}else{
 		
 			//fota_status.update_status[PATCH_SYSTEM -1].check_delta = PASS;
 			//fota_status.update_status[PATCH_SYSTEM -1].check_rom = WAIT;
-		}
+			}
 
-		save_fota_status();
+			save_fota_status();
 
 		
-		if ((status != 0) &&(status != 1))
-		{
+			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);
+				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);
+				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);
+				lynq_fota_release_wake_lock();
+				return status;
+			}
+				mtk_device_wrap_close(fd_read);
+				mtk_device_wrap_close(fd_write);		
 		
-
-    }
+		}
+	
+	}
 	
 	
 	
-	
-
-    if ((da_head.boot>0) && (up_info.ota_run <= PATCH_BOOT))
-	{
-
-        now_patch = PATCH_BOOT;
-        delta_offset = DELTA_HEARD_SIZE + da_head.sys;
-
-		
-		if (up_info.ota_run == PATCH_BOOT)
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-		
-		if(current_slot==SLOT_B) {
-		    system("flash_eraseall /dev/disk/by-partlabel/boot_a");
-		} else {
-			system("flash_eraseall /dev/disk/by-partlabel/boot_b");
-		}
-        //if(current_slot==SLOT_B) {
-	        fd_boot_a = mtk_device_wrap_open(DEV_BOOT_A,O_RDWR);
-            if (fd_boot_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening boot file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_boot_a;
-//		}else{
-	        fd_boot_b = mtk_device_wrap_open(DEV_BOOT_B,O_RDWR);
-            if (fd_boot_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening boot file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_boot_b;			
-//		}
-
-
-		if(current_slot==SLOT_B){
-			fd_read  = fd_boot_b;
-			fd_write = fd_boot_a;	
-		} else {
-			fd_read  = fd_boot_a;
-			fd_write = fd_boot_b;
-		}
-
-
-		fota_status.ota_run = PATCH_BOOT;
-        fota_status.update_status[PATCH_BOOT-1].check_delta = WAIT;
-		fota_status.update_status[PATCH_BOOT-1].check_rom = WAIT;
-		fota_status.update_status[PATCH_BOOT-1].update_result= WAIT;
-
-		save_fota_status();
-
-		
-	    up_info.ota_run = PATCH_BOOT;
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();
-		
-		
-		
-        RLOGD("+[UA]: Start upgrading boot.\n");
-        status = iot_patch(&ctx);
-		RLOGD("+[UA]: boot upgrade result:%d\n",status);
-        //up_info.ota_run = 0;
-
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_BOOT-1].update_result= status; 
-		fota_status.update_result= status;
-
-        if((status == 0)||(status ==1))
-        {
-
-            fota_status.update_status[PATCH_BOOT-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_BOOT-1].check_rom = PASS;
-            RLOGD("boot upgrade success!!!\n");
-               
-		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_BOOT-1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_BOOT-1].check_rom = WAIT;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_BOOT-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_BOOT-1].check_rom = ERROR;
-
-		}else{
-		
-			//fota_status.update_status[PATCH_SYSTEM -1].check_delta = PASS;
-			//fota_status.update_status[PATCH_SYSTEM -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.tee>0) && (up_info.ota_run <= PATCH_TEE))
-	{
-
-        now_patch = PATCH_TEE;
-        delta_offset = DELTA_HEARD_SIZE + da_head.sys + da_head.boot;
- 
-		
-		if (up_info.ota_run == PATCH_TEE) 
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-		
-		if(current_slot==SLOT_B) {
-		    system("flash_eraseall /dev/disk/by-partlabel/tee_a");
-		} else {
-			system("flash_eraseall /dev/disk/by-partlabel/tee_b");
-		}
-
-//        if(current_slot==SLOT_B) {
-	        fd_tee_a = mtk_device_wrap_open(DEV_TEE_A,O_RDWR);
-            if (fd_tee_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening tee file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_tee_a;
-//		}else{
-	        fd_tee_b = mtk_device_wrap_open(DEV_TEE_B,O_RDWR);
-            if (fd_tee_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening tee file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_tee_b;			
-//		}
-
-
-		if(current_slot==SLOT_B){
-			fd_read  = fd_tee_b;
-			fd_write = fd_tee_a;	
-		} else {
-			fd_read  = fd_tee_a;
-			fd_write = fd_tee_b;
-		}
-
-
-		fota_status.ota_run = PATCH_TEE;
-        fota_status.update_status[PATCH_TEE-1].check_delta = WAIT;
-		fota_status.update_status[PATCH_TEE-1].check_rom = WAIT;
-		fota_status.update_status[PATCH_TEE-1].update_result= WAIT;
-		
-		save_fota_status();
-		
-		up_info.ota_run = PATCH_TEE;
-
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();
-
-        RLOGD("+[UA]: Start upgrading tee.\n");
-        status = iot_patch(&ctx);
-		RLOGD("+[UA]: tee upgrade result:%d\n",status);
-        //up_info.ota_run = 0;
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_TEE-1].update_result= status; 
-		fota_status.update_result= status;
-
-        if((status == 0)||(status ==1))
-        {
-
-            fota_status.update_status[PATCH_TEE-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_TEE-1].check_rom = PASS;
-            RLOGD("tee upgrade success!!!\n");
-               
-		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_TEE-1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_TEE-1].check_rom = WAIT;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_TEE-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_TEE-1].check_rom = ERROR;
-
-		}else{
-		
-			//fota_status.update_status[PATCH_SYSTEM -1].check_delta = PASS;
-			//fota_status.update_status[PATCH_SYSTEM -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.md1img>0) && (up_info.ota_run <= PATCH_MD1IMG))
-	{
-
-        now_patch = PATCH_MD1IMG;
-        delta_offset = DELTA_HEARD_SIZE + da_head.sys + da_head.boot + da_head.tee;
-
-		
-		if (up_info.ota_run == PATCH_MD1IMG) 
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-		
-		if(current_slot==SLOT_B) {
-		    system("flash_eraseall /dev/disk/by-partlabel/md1img_a");
-		} else {
-			system("flash_eraseall /dev/disk/by-partlabel/md1img_b");
-		}
-
-//        if(current_slot==SLOT_B) {
-	        fd_md1img_a = mtk_device_wrap_open(DEV_MD1IMG_A,O_RDWR);
-            if (fd_md1img_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening md1img file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_md1img_a;
-//		}else{
-	        fd_md1img_b = mtk_device_wrap_open(DEV_MD1IMG_B,O_RDWR);
-            if (fd_md1img_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening md1img file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_md1img_b;			
-//		}
-
-
-		if(current_slot==SLOT_B){
-			fd_read  = fd_md1img_b;
-			fd_write = fd_md1img_a;	
-		} else {
-			fd_read  = fd_md1img_a;
-			fd_write = fd_md1img_b;
-		}
-
-		fota_status.ota_run = PATCH_MD1IMG;
-        fota_status.update_status[PATCH_MD1IMG-1].check_delta = WAIT;
-		fota_status.update_status[PATCH_MD1IMG-1].check_rom = WAIT;
-		fota_status.update_status[PATCH_MD1IMG-1].update_result= WAIT;
-
-		save_fota_status();
-		
-		up_info.ota_run = PATCH_MD1IMG;
-
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();		
-		
-
-        RLOGD("+[UA]: Start upgrading md1img.\n");
-        status = iot_patch(&ctx);
-		RLOGD("+[UA]: md1img upgrade result:%d\n",status);
-
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_MD1IMG-1].update_result= status; 
-		fota_status.update_result= status;
-
-        if((status == 0)||(status ==1))
-        {
-
-            fota_status.update_status[PATCH_MD1IMG-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_MD1IMG-1].check_rom = PASS;
-            RLOGD("md1img upgrade success!!!\n");
-               
-		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_MD1IMG-1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_MD1IMG-1].check_rom = WAIT;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_MD1IMG-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_MD1IMG-1].check_rom = ERROR;
-
-		}else{
-		
-			//fota_status.update_status[PATCH_MD1IMG -1].check_delta = PASS;
-			//fota_status.update_status[PATCH_MD1IMG -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.md1dsp>0) && (up_info.ota_run <= PATCH_MD1DSP))
-	{
-
-        now_patch = PATCH_MD1DSP;
-        delta_offset = DELTA_HEARD_SIZE + da_head.sys + da_head.boot + da_head.tee + da_head.md1img;
-
-		
-		if (up_info.ota_run == PATCH_MD1DSP) 
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-		
-		if(current_slot==SLOT_B) {
-		    system("flash_eraseall /dev/disk/by-partlabel/md1dsp_a");
-		} else {
-			system("flash_eraseall /dev/disk/by-partlabel/md1dsp_b");
-		}
-//        if(current_slot==SLOT_B) {
-	        fd_md1dsp_a = mtk_device_wrap_open(DEV_MD1DSP_A,O_RDWR);
-            if (fd_md1dsp_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening md1dsp file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_md1dsp_a;
-//		}else{
-	        fd_md1dsp_b = mtk_device_wrap_open(DEV_MD1DSP_B,O_RDWR);
-            if (fd_md1dsp_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening md1dsp file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_md1dsp_b;			
-//		}
-
-
-		if(current_slot==SLOT_B){
-			fd_read  = fd_md1dsp_b;
-			fd_write = fd_md1dsp_a;	
-		} else {
-			fd_read  = fd_md1dsp_a;
-			fd_write = fd_md1dsp_b;
-		}
-
-
-		fota_status.ota_run = PATCH_MD1DSP;
-        fota_status.update_status[PATCH_MD1DSP-1].check_delta = WAIT;
-		fota_status.update_status[PATCH_MD1DSP-1].check_rom = WAIT;
-		fota_status.update_status[PATCH_MD1DSP-1].update_result= WAIT;
-
-		save_fota_status();
-
-
-		up_info.ota_run = PATCH_MD1DSP;
-
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();
-
-
-        RLOGD("+[UA]: Start upgrading md1dsp.\n");
-        status = iot_patch(&ctx);
-		RLOGD("+[UA]: md1dsp upgrade result:%d\n",status);
-
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_MD1DSP-1].update_result= status; 
-		fota_status.update_result= status;
-
-        if((status == 0)||(status ==1))
-        {
-
-            fota_status.update_status[PATCH_MD1DSP-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_MD1DSP-1].check_rom = PASS;
-            RLOGD("md1dsp upgrade success!!!\n");
-               
-		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_MD1DSP-1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_MD1DSP-1].check_rom = WAIT;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_MD1DSP-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_MD1DSP-1].check_rom = ERROR;
-
-		}else{
-		
-			//fota_status.update_status[PATCH_MD1IMG -1].check_delta = PASS;
-			//fota_status.update_status[PATCH_MD1IMG -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.vbmeta>0) && (up_info.ota_run <= PATCH_VBMETA))
-	{
-
-        now_patch = PATCH_VBMETA;
-        delta_offset = DELTA_HEARD_SIZE + da_head.sys + da_head.boot + da_head.tee + da_head.md1img + da_head.md1dsp;
-
-		
-		if (up_info.ota_run == PATCH_VBMETA) 
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-
-		
-		if(current_slot==SLOT_B) {
-		    system("flash_eraseall /dev/disk/by-partlabel/vbmeta_a");
-		} else {
-			system("flash_eraseall /dev/disk/by-partlabel/vbmeta_b");
-		}
-//        if(current_slot==SLOT_B) {
-	        fd_vbmeta_a = mtk_device_wrap_open(DEV_VBMETA_A,O_RDWR);
-            if (fd_vbmeta_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening vbmeta file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_vbmeta_a;
-//		}else{
-	        fd_vbmeta_b = mtk_device_wrap_open(DEV_VBMETA_B,O_RDWR);
-            if (fd_vbmeta_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening vbmeta file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_vbmeta_b;			
-//		}
-
-		if(current_slot==SLOT_B){
-			fd_read  = fd_vbmeta_b;
-			fd_write = fd_vbmeta_a;	
-		} else {
-			fd_read  = fd_vbmeta_a;
-			fd_write = fd_vbmeta_b;
-		}
-
-
-		fota_status.ota_run = PATCH_VBMETA;
-        fota_status.update_status[PATCH_VBMETA-1].check_delta = WAIT;
-		fota_status.update_status[PATCH_VBMETA-1].check_rom = WAIT;
-		fota_status.update_status[PATCH_VBMETA-1].update_result= WAIT;
-
-		save_fota_status();
-		
-		up_info.ota_run = PATCH_VBMETA;
-
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();
-
-        RLOGD("+[UA]: Start upgrading vbmeta.\n");
-        status = iot_patch(&ctx);
-		RLOGD("+[UA]: vbmeta upgrade result:%d\n",status);
-        
-		up_info.ota_run = 0;
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_VBMETA-1].update_result= status; 
-		fota_status.update_result= status;
-
-        if((status == 0)||(status ==1))
-        {
-
-            fota_status.update_status[PATCH_VBMETA-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_VBMETA-1].check_rom = PASS;
-            RLOGD("vbmeta upgrade success!!!\n");
-               
-		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_VBMETA-1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_VBMETA-1].check_rom = WAIT;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_VBMETA-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_VBMETA-1].check_rom = ERROR;
-
-		}else{
-		
-			//fota_status.update_status[PATCH_MD1IMG -1].check_delta = PASS;
-			//fota_status.update_status[PATCH_MD1IMG -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.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;
-                RLOGD("+[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;
-                RLOGD("+[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;
-                RLOGD("+[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;
-                RLOGD("+[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.medmcu>0) && (up_info.ota_run <= PATCH_MEDMCU))
-	{
-
-        now_patch = PATCH_MEDMCU;
-        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_MEDMCU) 
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-
-
-		if(current_slot==SLOT_B) {
-		    system("flash_eraseall /dev/mtd32");
-		} else {
-			system("flash_eraseall /dev/mtd33");
-		}
-//        if(current_slot==SLOT_B) {
-	        fd_medmcu_a = mtk_device_wrap_open(DEV_MEDMCU_A,O_RDWR);
-            if (fd_medmcu_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_oemapp2_a;
-//		}else{
-	        fd_medmcu_b = mtk_device_wrap_open(DEV_MEDMCU_B,O_RDWR);
-            if (fd_medmcu_b < 0) {
-                err = errno;
-                RLOGD("+[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_medmcu_b;
-			fd_write = fd_medmcu_a;
-		} else {
-			fd_read  = fd_medmcu_a;
-			fd_write = fd_medmcu_b;
-		}
-
-
-		fota_status.ota_run = PATCH_MEDMCU;
-        fota_status.update_status[PATCH_MEDMCU-1].check_delta = WAIT;
-		fota_status.update_status[PATCH_MEDMCU-1].check_rom = WAIT;
-		fota_status.update_status[PATCH_MEDMCU-1].update_result= WAIT;
-
-		save_fota_status();
-		
-		up_info.ota_run = PATCH_MEDMCU;
-
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();
-
-        LYVERBLOG("+[UA]: Start upgrading medmcu.\n");
-        status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: medmcu upgrade result:%d\n",status);
-
-		up_info.ota_run = 0;
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_MEDMCU-1].update_result= status; 
-		fota_status.update_result= status;
-
-        if((status == 0)||(status ==1))
-        {
-
-            fota_status.update_status[PATCH_MEDMCU-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_MEDMCU-1].check_rom = PASS;
-
-		}else if(status == E_ROCK_INVALID_DELTA) {
-            fota_status.update_status[PATCH_MEDMCU-1].check_delta = ERROR;
-		    fota_status.update_status[PATCH_MEDMCU-1].check_rom = WAIT;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_MEDMCU-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_MEDMCU-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 + da_head.oemapp + da_head.oemapp2 + da_head.medmcu;
-
-		
-		if (up_info.ota_run == PATCH_BL33) 
-		{
-			ctx.first_run = 0;
-
-		}else{
-		    ctx.first_run = 1;
-		}
-
-
-
-		if(current_slot==SLOT_B) {
-		    system("flash_eraseall /dev/disk/by-partlabel/bl33_a");
-		} else {
-			system("flash_eraseall /dev/disk/by-partlabel/bl33_b");
-		}
-//        if(current_slot==SLOT_B) {
-	        fd_bl33_a = mtk_device_wrap_open(DEV_BL33_A,O_RDWR);
-            if (fd_bl33_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-//			fd_curr = fd_oemapp2_a;
-//		}else{
-	        fd_bl33_b = mtk_device_wrap_open(DEV_BL33_B,O_RDWR);
-            if (fd_bl33_b < 0) {
-                err = errno;
-                RLOGD("+[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_bl33_b;
-			fd_write = fd_bl33_a;
-		} else {
-			fd_read  = fd_bl33_a;
-			fd_write = fd_bl33_b;
-		}
-
-
-		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;
-
-		save_fota_status();
-		
-		up_info.ota_run = PATCH_BL33;
-
-		lseek(fd_update_status,0,SEEK_SET);
-	    write(fd_update_status, &up_info,sizeof(up_info));
-		sync();
-
-        LYVERBLOG("+[UA]: Start upgrading medmcu.\n");
-        status = iot_patch(&ctx);
-		LYVERBLOG("+[UA]: medmcu upgrade result:%d\n",status);
-
-		up_info.ota_run = 0;
-        //fota_status.ota_run = 0;
-		fota_status.update_status[PATCH_BL33-1].update_result= status; 
-		fota_status.update_result= status;
-
-        if((status == 0)||(status ==1))
-        {
-
-            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;
-		}else if((status == E_ROCK_DELTA_MISMATCH)||(status == E_ROCK_DELTA_CHUNK_MISMATCH)) {
-            fota_status.update_status[PATCH_BL33-1].check_delta = PASS;
-		    fota_status.update_status[PATCH_BL33-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(current_slot==SLOT_B)
-		
-    
-	
-	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))
+	if (is_need_fullupdate == 1)
 	{
 
 	    now_patch = 0;
@@ -2040,12 +944,14 @@
 			sync();
 			close(fd_update_status);
 
-			for (i = FULL_SYSTEM;i<=FULL_BL33;i++){
-                if (fota_status.update_status[i-1].need_update ==1) {
+			//for (i = FULL_SYSTEM;i<=FULL_BL33;i++){
+            
+			for (i = MAX_OTA_ROLE/2;i<(MAX_OTA_ROLE/2+REAL_OTA_ROLE);i++){
+      			if (fota_status.update_status[i].need_update ==1) {
                     fota_status.ota_run = i;
-					fota_status.update_status[i-1].check_delta = ERROR;
-					fota_status.update_status[i-1].check_rom= WAIT;
-					fota_status.update_status[i-1].update_result= ERROR;
+					fota_status.update_status[i].check_delta = ERROR;
+					fota_status.update_status[i].check_rom= WAIT;
+					fota_status.update_status[i].update_result= ERROR;
 				}
 			}
             fota_status.update_result = ERROR;
@@ -2056,799 +962,98 @@
 	}
 	
 	
-
 	
+	delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE;
 	
-	if(da_head.full_sys>0) {
+	for(i = MAX_OTA_ROLE/2;i<(MAX_OTA_ROLE/2+REAL_OTA_ROLE);i++) {
 	
-        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE;
+	    if (i>MAX_OTA_ROLE/2) {
+			delta_offset+=delta_head[i-1];
+		}	
+        if(delta_head[i]>0) {
 
-        if(current_slot==SLOT_B) {
-            system("flash_eraseall /dev/disk/by-partlabel/system_a");
-        } else {
-            system("flash_eraseall /dev/disk/by-partlabel/system_b");
-        }
-        
-		if(current_slot==SLOT_B) {
-	        fd_system_a = mtk_device_wrap_open(DEV_SYSTEM_A,O_RDWR);
-            if (fd_system_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening full_sys file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_system_a;
-		}else{
-	        fd_system_b = mtk_device_wrap_open(DEV_SYSTEM_B,O_RDWR);
-            if (fd_system_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening full_sys file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_system_b;			
-		}
-        fota_status.ota_run = FULL_SYSTEM;
-        save_fota_status();
-		
-		retry_cnt = 0;
-		RLOGD("+[UA]: Start upgrading system full.\n");
-        do{
-            status = delta_copyto_nand(delta_offset,da_head.full_sys);
-
-            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_sys,digest_s);
-            ROCK_SHA_FILE(fd_curr,0,da_head.full_sys,digest_t);
-            retry_cnt++;
-        }while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
-		
-		mtk_device_wrap_close(fd_curr);
-		
-		RLOGD("+[UA]: system 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_SYSTEM_B,DEV_SYSTEM_A);
+				sprintf(cmd_sys,"flash_eraseall %s",partition_filename_a[i-MAX_OTA_ROLE/2]);
+			} else {
+				sprintf(cmd_sys,"flash_eraseall %s",partition_filename_b[i-MAX_OTA_ROLE/2]);
 			}
-		    else{
-				nand_copyto_nand(DEV_SYSTEM_A,DEV_SYSTEM_B);
-			}
-		}
-		
-		RLOGD("+[UA]: system full upgrade result:%d\n",status);
-
-		fota_status.update_result = status;
-		fota_status.update_status[FULL_SYSTEM-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_boot>0) {
-	
-        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys;
-
-        if(current_slot==SLOT_B) {
-            system("flash_eraseall /dev/disk/by-partlabel/boot_a");
-        } else {
-            system("flash_eraseall /dev/disk/by-partlabel/boot_b");
-        }
-	    
-		if(current_slot==SLOT_B) {
-	        fd_boot_a = mtk_device_wrap_open(DEV_BOOT_A,O_RDWR);
-            if (fd_boot_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening full_boot file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_boot_a;
-		}else{
-	        fd_boot_b = mtk_device_wrap_open(DEV_BOOT_B,O_RDWR);
-            if (fd_boot_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening full_boot file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_boot_b;					
-		}
-		fota_status.ota_run = FULL_BOOT;
-        save_fota_status();
-        retry_cnt = 0;
-		RLOGD("+[UA]: Start upgrading boot full.\n");
-        do{
-            status = delta_copyto_nand(delta_offset,da_head.full_boot);
-            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_boot,digest_s);
-            ROCK_SHA_FILE(fd_curr,0,da_head.full_boot,digest_t);
-            retry_cnt++;
-		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
-		
-		RLOGD("+[UA]: boot full retry_cnt = %d\n",retry_cnt);
-		mtk_device_wrap_close(fd_curr);
-		
-		if (retry_cnt>3) {
-		    if (status == 0) {
-				status = retry_cnt;
-			}
+		    system(cmd_sys);
+        
 			if(current_slot==SLOT_B) {
-			    nand_copyto_nand(DEV_BOOT_B,DEV_BOOT_A);
+				fd_partition_a = mtk_device_wrap_open(partition_filename_a[i-MAX_OTA_ROLE/2],O_RDWR);
+				if (fd_partition_a < 0) {
+					err = errno;
+					RLOGD("+[UA]: Error opening full id_a[%d] file: %s\n",i,strerror(errno));
+					lynq_fota_release_wake_lock();
+					return -err;
+				}
+				fd_curr = fd_partition_a;
+			}else{
+				fd_partition_b = mtk_device_wrap_open(partition_filename_b[i-MAX_OTA_ROLE/2],O_RDWR);
+				if (fd_partition_b < 0) {
+					err = errno;
+					RLOGD("+[UA]: Error opening full_id_b[%d] file: %s\n",i,strerror(errno));
+					lynq_fota_release_wake_lock();
+					return -err;
+				}
+				fd_curr = fd_partition_b;			
 			}
-		    else{
-				nand_copyto_nand(DEV_BOOT_A,DEV_BOOT_B);
+			fota_status.ota_run = i+1;
+			save_fota_status();
+		
+			retry_cnt = 0;
+			RLOGD("+[UA]: Start upgrading %s full.\n",partition_filename[i-MAX_OTA_ROLE/2]);
+            do{
+				status = delta_copyto_nand(delta_offset,delta_head[i]);
+
+				ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,delta_head[i],digest_s);
+				ROCK_SHA_FILE(fd_curr,0,delta_head[i],digest_t);
+				retry_cnt++;
+			}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
+		
+			mtk_device_wrap_close(fd_curr);
+		
+			RLOGD("+[UA]: %s full retry_cnt = %d\n",partition_filename[i-MAX_OTA_ROLE/2],retry_cnt);
+        
+			if (retry_cnt>3) {
+				if (status == 0) {
+					status = retry_cnt;
+				}
+				if(current_slot==SLOT_B) {
+					nand_copyto_nand(partition_filename_b[i-MAX_OTA_ROLE/2],partition_filename_a[i-MAX_OTA_ROLE/2]);
+				}
+				else{
+					nand_copyto_nand(partition_filename_a[i-MAX_OTA_ROLE/2],partition_filename_b[i-MAX_OTA_ROLE/2]);
+				}
 			}
-		}
 		
-		
-		RLOGD("+[UA]: boot full upgrade result:%d\n",status);
-		fota_status.update_result = status;
-		fota_status.update_status[FULL_BOOT-1].update_result = status;
-		save_fota_status();
-		
+			RLOGD("+[UA]: %s full upgrade result:%d\n",partition_filename[i-MAX_OTA_ROLE/2],status);
 
-		if (status != 0)
-		{
+			fota_status.update_result = status;
+			fota_status.update_status[i].update_result = status;
+			save_fota_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);
-            lynq_fota_release_wake_lock();
-            return 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_tee>0) {
-	
-        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_boot;
-
-        if(current_slot==SLOT_B) {
-            system("flash_eraseall /dev/disk/by-partlabel/tee_a");
-        } else {
-            system("flash_eraseall /dev/disk/by-partlabel/tee_b");
-        }
-        
-		if(current_slot==SLOT_B) {
-	        fd_tee_a = mtk_device_wrap_open(DEV_TEE_A,O_RDWR);
-            if (fd_tee_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening full_tee file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_tee_a;
-		}else{
-	        fd_tee_b = mtk_device_wrap_open(DEV_TEE_B,O_RDWR);
-            if (fd_tee_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening full_tee file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_tee_b;			
-		}
-		fota_status.ota_run = FULL_TEE;
-        save_fota_status();
-        retry_cnt = 0;
-		RLOGD("+[UA]: Start upgrading tee full.\n");
-        do{
-            status = delta_copyto_nand(delta_offset,da_head.full_tee);
-            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_tee,digest_s);
-            ROCK_SHA_FILE(fd_curr,0,da_head.full_tee,digest_t);
-            retry_cnt++;
-		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
-		mtk_device_wrap_close(fd_curr);
-		RLOGD("+[UA]: tee 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_TEE_B,DEV_TEE_A);
-			}
-		    else{
-				nand_copyto_nand(DEV_TEE_A,DEV_TEE_B);
-			}
-		}
-		
-		printf("+[UA] tee full upgrade result:%d\n",status);
-		fota_status.update_result = status;
-		fota_status.update_status[FULL_TEE-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_md1img>0) {
-	
-        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_boot + da_head.full_tee;
-
-        if(current_slot==SLOT_B) {
-            system("flash_eraseall /dev/disk/by-partlabel/md1img_a");
-        } else {
-            system("flash_eraseall /dev/disk/by-partlabel/md1img_b");
-        }
-	    
-		if(current_slot==SLOT_B) {
-	        fd_md1img_a = mtk_device_wrap_open(DEV_MD1IMG_A,O_RDWR);
-            if (fd_md1img_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening full_md1img file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_md1img_a;
-		}else{
-	        fd_md1img_b = mtk_device_wrap_open(DEV_MD1IMG_B,O_RDWR);
-            if (fd_md1img_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening full_md1img file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_md1img_b;			
-		}
-		fota_status.ota_run = FULL_MD1IMG;
-        save_fota_status();
-        retry_cnt = 0;
-		RLOGD("+[UA]: Start upgrading md1img full.\n");
-        do{
-            status = delta_copyto_nand(delta_offset,da_head.full_md1img);
-            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_md1img,digest_s);
-            ROCK_SHA_FILE(fd_curr,0,da_head.full_md1img,digest_t);
-            retry_cnt++;
-		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
-		mtk_device_wrap_close(fd_curr);
-		
-		RLOGD("+[UA]: md1img 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_MD1IMG_B,DEV_MD1IMG_A);
-			}
-		    else{
-				nand_copyto_nand(DEV_MD1IMG_A,DEV_MD1IMG_B);
-			}
-		}
-				
-		RLOGD("+[UA]: md1img upgrade result:%d\n",status);
-		fota_status.update_result = status;
-		fota_status.update_status[FULL_MD1IMG-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_md1dsp>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;
-
-        if(current_slot==SLOT_B) {
-            system("flash_eraseall /dev/disk/by-partlabel/md1dsp_a");
-        } else {
-            system("flash_eraseall /dev/disk/by-partlabel/md1dsp_b");
-        }
-	    
-		if(current_slot==SLOT_B) {
-	        fd_md1dsp_a = mtk_device_wrap_open(DEV_MD1DSP_A,O_RDWR);
-            if (fd_md1dsp_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening full_md1dsp file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_md1dsp_a;
-		}else{
-	        fd_md1dsp_b = mtk_device_wrap_open(DEV_MD1DSP_B,O_RDWR);
-            if (fd_md1dsp_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening full_md1dsp file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_md1dsp_b;			
-		}
-		fota_status.ota_run = FULL_MD1DSP;
-        save_fota_status();
-        retry_cnt = 0;
-		RLOGD("+[UA]: Start upgrading md1dsp full.\n");
-        do{
-            status = delta_copyto_nand(delta_offset,da_head.full_md1dsp);
-            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_md1dsp,digest_s);
-            ROCK_SHA_FILE(fd_curr,0,da_head.full_md1dsp,digest_t);
-            retry_cnt++;
-		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
-		mtk_device_wrap_close(fd_curr);
-		
-		RLOGD("+[UA]: md1dsp 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_MD1DSP_B,DEV_MD1DSP_A);
-			}
-		    else{
-				nand_copyto_nand(DEV_MD1DSP_A,DEV_MD1DSP_B);
-			}
-		}
-				
-		RLOGD("+[UA]: md1dsp upgrade result:%d\n",status);
-		fota_status.update_result = status;
-		fota_status.update_status[FULL_MD1DSP-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_vbmeta>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;
-
-        if(current_slot==SLOT_B) {
-            system("flash_eraseall /dev/disk/by-partlabel/vbmeta_a");
-        } else {
-            system("flash_eraseall /dev/disk/by-partlabel/vbmeta_b");
-        }
-	    
-		if(current_slot==SLOT_B) {
-	        fd_vbmeta_a = mtk_device_wrap_open(DEV_VBMETA_A,O_RDWR);
-            if (fd_vbmeta_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening full_vbmeta file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_vbmeta_a;
-		}else{
-	        fd_vbmeta_b = mtk_device_wrap_open(DEV_VBMETA_B,O_RDWR);
-            if (fd_vbmeta_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening full_vbmeta file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_vbmeta_b;			
-		}
-		fota_status.ota_run = FULL_VBMETA;
-        save_fota_status();
-        retry_cnt = 0;
-		RLOGD("+[UA]: Start upgrading vbmeta full.\n");
-        do{
-            status = delta_copyto_nand(delta_offset,da_head.full_vbmeta);
-            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_vbmeta,digest_s);
-            ROCK_SHA_FILE(fd_curr,0,da_head.full_vbmeta,digest_t);
-            retry_cnt++;
-		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
-		mtk_device_wrap_close(fd_curr);
-		
-		RLOGD("+[UA]: vbmeta 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_VBMETA_B,DEV_VBMETA_A);
-			}
-		    else{
-				nand_copyto_nand(DEV_VBMETA_A,DEV_VBMETA_B);
-			}
-		}
-				
-		RLOGD("+[UA]: vbmeta upgrade result:%d\n",status);
-		fota_status.update_result = status;
-		fota_status.update_status[FULL_VBMETA-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_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;
-                RLOGD("+[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;
-                RLOGD("+[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;
-		RLOGD("+[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);
-
-		RLOGD("+[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);
-			}
-		}
-
-		RLOGD("+[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;
-                RLOGD("+[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;
-                RLOGD("+[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;
-		RLOGD("+[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);
-
-		RLOGD("+[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);
-			}
-		}
-
-		RLOGD("+[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_medmcu>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 +da_head.full_oemapp2;
-
-
-        if(current_slot==SLOT_B) {
-            system("flash_eraseall /dev/mtd32");
-        } else {
-            system("flash_eraseall /dev/mtd33");
-        }
-
-		if(current_slot==SLOT_B) {
-	        fd_medmcu_a = mtk_device_wrap_open(DEV_MEDMCU_A,O_RDWR);
-            if (fd_medmcu_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_medmcu_a;
-		}else{
-	        fd_medmcu_b = mtk_device_wrap_open(DEV_MEDMCU_B,O_RDWR);
-            if (fd_medmcu_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-		    fd_curr = fd_medmcu_b;
-		}
-		fota_status.ota_run = FULL_MEDMCU;
-        save_fota_status();
-        retry_cnt = 0;
-        RLOGD("+[UA]: Start upgrading medmcu full.\n");
-        do {
-		    status = delta_copyto_nand(delta_offset,da_head.full_medmcu);
-		    ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_medmcu,digest_s);
-		    ROCK_SHA_FILE(fd_curr,0,da_head.full_medmcu,digest_t);
-		    retry_cnt++;
-		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
-		mtk_device_wrap_close(fd_curr);
-        RLOGD("+[UA]: medmcu 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_MEDMCU_B,DEV_MEDMCU_A);
-			}
-		    else{
-			    nand_copyto_nand(DEV_MEDMCU_A,DEV_MEDMCU_B);
-			}
-		}		
-                RLOGD("+[UA]: medmcu upgrade result:%d\n",status);
-		fota_status.update_result = status;
-		fota_status.update_status[FULL_MEDMCU-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) {
-
-	    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 +da_head.full_oemapp2 + da_head.full_medmcu;
-
-
-        if(current_slot==SLOT_B) {
-            system("flash_eraseall /dev/disk/by-partlabel/bl33_a");
-        } else {
-            system("flash_eraseall /dev/disk/by-partlabel/bl33_b");
-        }
-
-		if(current_slot==SLOT_B) {
-	        fd_bl33_a = mtk_device_wrap_open(DEV_BL33_A,O_RDWR);
-            if (fd_bl33_a < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-			fd_curr = fd_bl33_a;
-		}else{
-	        fd_bl33_b = mtk_device_wrap_open(DEV_BL33_B,O_RDWR);
-            if (fd_bl33_b < 0) {
-                err = errno;
-                RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
-                lynq_fota_release_wake_lock();
-                return -err;
-            }
-		    fd_curr = fd_bl33_b;
-		}
-		fota_status.ota_run = FULL_BL33;
-        save_fota_status();
-        retry_cnt = 0;
-        RLOGD("+[UA]: Start upgrading bl33 full.\n");
-        do {
-		    status = delta_copyto_nand(delta_offset,da_head.full_bl33);
-		    ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_bl33,digest_s);
-		    ROCK_SHA_FILE(fd_curr,0,da_head.full_bl33,digest_t);
-		    retry_cnt++;
-		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
-		mtk_device_wrap_close(fd_curr);
-        RLOGD("+[UA]: bl33 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_BL33_B,DEV_BL33_A);
-			}
-		    else{
-			    nand_copyto_nand(DEV_BL33_A,DEV_BL33_B);
-			}
-		}		
-        RLOGD("+[UA]: bl33 upgrade result:%d\n",status);
-		fota_status.update_result = status;
-		fota_status.update_status[FULL_BL33-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(update_mode == MODE_NORMAL){ //need A VS B
@@ -2905,6 +1110,10 @@
 	fota_status.update_result = status;
     save_fota_status();
     
+	sleep(5);
+	sync();
+        sleep(5);
+	
     lynq_fota_release_wake_lock();
     
 	if(reboot_flag==1){
@@ -2940,7 +1149,7 @@
 
 #endif 
 	
-        ret = rock_update_main(0, 0, 0, 0, first_run, 1,1);
+        ret = rock_update_main(0, 0, 0, 0, first_run, 1, 1);
         RLOGD("rock_update_main ret = %d\n", ret);
         if(ret)
         {
@@ -2971,7 +1180,7 @@
     { 
         //Power off, call UA
         RLOGD("[+UP]: ***Power off, call UA***\n");
-        ret = rock_update_main(0, 0, 0, 0, first_run, 1, 0);
+        ret = rock_update_main(0, 0, 0, 0, first_run, 1,0);
         RLOGD("rock_update_main ret = %d\n", ret);
         if(ret) 
         {
@@ -3063,11 +1272,18 @@
  * @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
+
     ret = rock_update_main(0, 0, 0, 0, 1, 1, 0);
-    RLOGD("lynq_fota_nrestart ret = %d\n", ret);
+    RLOGD("rock_update_nrestart ret = %d\n", ret);
     if(ret)
     {
         RLOGD("fota update fail!\n");
@@ -3175,4 +1391,3 @@
  * @brief This is the wake up call
  * end
  */
-
diff --git a/src/lynq/lib/liblynq-fota/rock_ua/sha.c b/src/lynq/lib/liblynq-fota/rock_ua/sha.c
index ce52383..5ac6b53 100755
--- a/src/lynq/lib/liblynq-fota/rock_ua/sha.c
+++ b/src/lynq/lib/liblynq-fota/rock_ua/sha.c
@@ -342,11 +342,10 @@
         else
         {
             size = read(fd_sha,data,totale_size_common);
-        } 
-		if(size==0){
-		    
-			break;
-		}		
+        }
+        if (size == 0){
+		    break;
+		}			
         SHA_update(&ctx, data, size);
         totale_size_common -= size;
 
@@ -381,6 +380,9 @@
         {
             size = mtk_device_wrap_read(fd_sha,data,totale_size_file);
         }
+	    if (size == 0){
+		    break;
+		}	
         SHA_update(&ctx, data, size);
         totale_size_file -= size;
 
diff --git a/src/lynq/lib/liblynq-sms/lynq_sms.cpp b/src/lynq/lib/liblynq-sms/lynq_sms.cpp
index f457d7c..73cd37f 100755
--- a/src/lynq/lib/liblynq-sms/lynq_sms.cpp
+++ b/src/lynq/lib/liblynq-sms/lynq_sms.cpp
@@ -132,7 +132,7 @@
 int lynq_send_sms(char telephony_num[TELEPHONE_NUM_LEN], int charset, char *msg, int msglen)

 {

     LYINFLOG("charset is %d, msglen %d\n", charset, msglen);

-    if(msglen > MSG_MAX_LEN || msglen < 0)

+    if(msglen > MSG_MAX_LEN || msglen <= 0)

     {

         LYERRLOG("msglen out of the range");

         return LYNQ_E_SMS_MSGLEN_OUT_OF_RANGE;

diff --git a/src/lynq/lib/liblynq-wifi6/include/libwifi6.h b/src/lynq/lib/liblynq-wifi6/include/libwifi6.h
index 34a6ec8..8caf003 100755
--- a/src/lynq/lib/liblynq-wifi6/include/libwifi6.h
+++ b/src/lynq/lib/liblynq-wifi6/include/libwifi6.h
@@ -173,6 +173,8 @@
 //start scan availbale ap active
 int lynq_wifi_sta_start_scan(lynq_wifi_index_e idx);
 
+//add for STA auto connect
+int lynq_wifi_sta_stop_net(lynq_wifi_index_e idx,int networkid);
 /*
  * event usage:
  * first declare a funcion like AP_CALLBACK_FUNC_PTR to recv messge from wifi lib
@@ -207,6 +209,9 @@
 typedef void(*STA_CALLBACK_FUNC_PTR)(void *priv, lynq_wifi_sta_status_s status, error_number_s number);
 int lynq_reg_sta_event_callback(void * priv, STA_CALLBACK_FUNC_PTR cb);
 int lynq_unreg_sta_event_callback(void * priv);
+typedef void(*STA_AUTO_CALLBACK_FUNC_PTR)(void *priv, lynq_wifi_sta_status_s status, error_number_s number,int networkid);
+int lynq_reg_sta_auto_event_callback(void * priv, STA_AUTO_CALLBACK_FUNC_PTR cb);
+int lynq_unreg_sta_auto_event_callback(void * priv);
 
 //get current ap status
 int lynq_get_ap_status(lynq_wifi_index_e idx, lynq_wifi_ap_run_status_s * ap_status);
diff --git a/src/lynq/lib/liblynq-wifi6/libwifi6.c b/src/lynq/lib/liblynq-wifi6/libwifi6.c
index ed4024c..ed38fbf 100755
--- a/src/lynq/lib/liblynq-wifi6/libwifi6.c
+++ b/src/lynq/lib/liblynq-wifi6/libwifi6.c
@@ -51,10 +51,16 @@
 volatile int g_sta_scan_finish_flag = 1;
 volatile int g_sta_watcher_started_flag = 0;
 
+pthread_t g_sta_auto_watcher_pid = 0;
+volatile int g_sta_auto_watcher_stop_flag = 0;
+volatile int g_sta_auto_scan_finish_flag = 1;
+volatile int g_sta_auto_watcher_started_flag = 0;
 void * g_ap_callback_priv = NULL;
 AP_CALLBACK_FUNC_PTR g_ap_callback_func = NULL;
 void * g_sta_callback_priv = NULL;
 STA_CALLBACK_FUNC_PTR g_sta_callback_func = NULL;
+void * g_sta_auto_callback_priv = NULL;
+STA_AUTO_CALLBACK_FUNC_PTR g_sta_auto_callback_func = NULL;
 
 //const char * CTRL_PATH="/var/run/wpa_supplicant";
 const char * CTRL_PATH[2] = {"/var/run/wpa_supplicant/wlan0", "/var/run/wpa_supplicant/ap0"};
@@ -89,6 +95,8 @@
 static pthread_mutex_t s_check_wpa_ctrl_mutex = PTHREAD_MUTEX_INITIALIZER;
 static pthread_mutex_t s_sta_callback_mutex = PTHREAD_MUTEX_INITIALIZER;
 static pthread_mutex_t s_ap_callback_mutex = PTHREAD_MUTEX_INITIALIZER;
+// add for auto connect
+static pthread_mutex_t s_sta_auto_callback_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static struct local_wpa_ctrl * g_lynq_wpa_ctrl[2] = {0};
 
@@ -662,6 +670,142 @@
 
 }
 
+void get_state_error_networkid(const char* modify, lynq_wifi_sta_status_s* state, error_number_s* error,int *networkid)
+{
+    char *pReason;
+    char *wpanetid;
+    char destid[3];
+    *error = LYNQ_WAIT_CONNECT_ACTIVE;
+    *networkid = -1;
+    if (strstr(modify, "CTRL-EVENT-SCAN-RESULTS") != NULL)
+    {
+        *state = LYNQ_WIFI_STA_STATUS_SCAN_RESULT;
+        RLOGD("CTRL-EVENT-SCAN-RESULTS state:%d,error:%d,,networkid:%d\n",*state,*error,*networkid);
+        return;
+    }
+    if (strstr(modify, "CTRL-EVENT-CONNECTED") != NULL)
+    {
+        RLOGD("[xiong]:wpanetid = strstrmodify;\n");
+        wpanetid = strstr(modify,"id=");
+        if ( wpanetid != NULL )
+        {
+            wpanetid +=strlen("id=");
+            RLOGD("[xiong]:memcpy(destid,wpanetid,0\n");
+            if (memcpy(destid,wpanetid,2) != NULL)
+            {
+                 RLOGD("[xiong]:memcpy(destid,wpanetid,1\n");
+                *networkid = atoi(destid);
+                RLOGD("get networkid is %d\n",*networkid);
+            }
+             RLOGD("[xiong]:memcpy(destid,wpanetid,2\n");
+        }
+        *state = LYNQ_WIFI_STA_STATUS_CONNECT;
+        RLOGD("CTRL-EVENT-CONNECTED state:%d,error:%d,networkid:%d\n",*state,*error,*networkid);
+        return;
+    }
+    if (strstr(modify, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL)
+    {
+        wpanetid = strstr(modify,"id=");
+        if ( wpanetid != NULL )
+        {
+            wpanetid +=strlen("id=");
+            if (memcpy(destid,wpanetid,2) != NULL)
+            {
+                *networkid = atoi(destid);
+                RLOGD("get networkid is %d\n",*networkid);
+            }
+        }
+        pReason = strstr(modify, "reason=");
+        if (pReason != NULL)
+        {
+            pReason += strlen("reason=");
+            if (memcmp(pReason, "CONN_FAILED", 11) == 0)
+            {
+                *error = LYNQ_TIME_OUT;
+            }
+            else if (memcmp(pReason, "WRONG_KEY", 9) == 0)
+            {
+                *error = LYNQ_PSW_ERROR;
+            }
+            else 
+            {
+                *error = LYNQ_UNSPECIFIED_REASON;
+            }
+            *state = LYNQ_WIFI_STA_STATUS_CONNECT_FAIL;
+            RLOGD("CTRL-EVENT-SSID-TEMP-DISABLED state:%d,error:%d,networkid:%d\n",*state,*error,*networkid);
+            return;
+        }
+        else
+        {
+            *error = LYNQ_UNSPECIFIED_REASON;
+            *state = LYNQ_WIFI_STA_STATUS_CONNECT_FAIL;
+            return;
+        }
+    }
+    if (strstr(modify, "CTRL-EVENT-ASSOC-REJECT") != NULL)
+    {
+        wpanetid = strstr(modify,"id=");
+        if ( wpanetid != NULL )
+        {
+            wpanetid +=strlen("id=");
+            if (memcpy(destid,wpanetid,2) != NULL)
+            {
+                *networkid = atoi(destid);
+                RLOGD("get networkid is %d\n",*networkid);
+            }
+        }
+        RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT\n");
+        pReason = strstr(modify, "status_code=");
+        if (pReason != NULL)
+        {
+            pReason += strlen("status_code=");
+            if (memcmp(pReason, "17", 2) == 0)
+            {
+                *error = LYNQ_AP_UNABLE_HANDLE;
+            }
+            else if (memcmp(pReason, "1",1) == 0)
+            {
+                *error = LYNQ_UNSPECIFIED_REASON;
+            }
+            else
+            {
+                *error = LYNQ_UNSPECIFIED_REASON;
+            }
+             *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
+             RLOGD("CTRL-EVENT-ASSOC-REJECT BUT NOT STATUS_CODE NOT 1 or 17 state:%d,error:%d,networkid:%d\n",*state,*error,*networkid);
+             return;
+        }
+        else
+        {
+            RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT BUT NOT FOUND STATUS_CODE\n");
+            *error = LYNQ_UNSPECIFIED_REASON;
+            *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
+            RLOGD("CTRL-EVENT-ASSOC-REJECT state:%d,error:%d£¬networkid:%d\n",*state,*error,*networkid);
+            return;
+        }
+    }
+    if (strstr(modify, "CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER") != NULL)
+    {
+        RLOGD("FIND CTRL EVENT : CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER\n");
+        *error = LYNQ_AUTHENTICATION_NO_LONGER_VALID;
+        *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
+        RLOGD("CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER state:%d,error:%d,networkid:%d\n",*state,*error,*networkid);
+        return;
+    }
+    if (strstr(modify, "CTRL-EVENT-DISCONNECTED") != NULL)
+    {
+        RLOGD("FIND CTRL EVENT : CTRL-EVENT-DISCONNECTED\n");
+        *error = LYNQ_WAIT_CONNECT_ACTIVE;
+        *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
+        RLOGD("CTRL-EVENT-DISCONNECTED state:%d,error:%d,networkid:%d\n",*state,*error,*networkid);
+        return;
+    }
+    RLOGD("EVENT : %s\n", modify);
+    *error = LYNQ_UNSPECIFIED_REASON;
+    *state = LYNQ_WIFI_STATUS_EGNORE;
+    RLOGD("LAST : STA state:%d,error:%d,network:%d\n",*state,*error,*networkid);
+    return;
+}
 static void notify_connect_status(lynq_wifi_sta_status_s state, error_number_s error)
 {
     pthread_mutex_lock(&s_sta_callback_mutex);
@@ -673,6 +817,17 @@
     }
     pthread_mutex_unlock(&s_sta_callback_mutex);
 }
+static void notify_auto_connect_status(lynq_wifi_sta_status_s state, error_number_s error,int networkid)
+{
+    pthread_mutex_lock(&s_sta_callback_mutex);
+    if (g_sta_callback_func != NULL && state != LYNQ_WIFI_STATUS_EGNORE)
+    {
+        RLOGD("STAWatcherThreadProc callback begin ------> %d %d %d\n", state, error,networkid);
+        g_sta_auto_callback_func(g_sta_auto_callback_priv, state, error,networkid);
+        RLOGD("STAAutoWatcherThreadProc callback end ------> %d %d %d\n", state, error,networkid);
+    }
+    pthread_mutex_unlock(&s_sta_callback_mutex);
+}
 
 static void STAWatcherThreadProc() {
     size_t len = MAX_RET;
@@ -735,6 +890,62 @@
         wpa_ctrl_close(lynq_wpa_ctrl);
     }
 }
+static void STAAutoWatcherThreadProc() {
+    size_t len = MAX_RET;
+    char msg_notify[MAX_RET];
+    error_number_s error;
+    lynq_wifi_sta_status_s state, last_state = -1;
+    int idle_count = 0;
+    int networkid;
+    struct wpa_ctrl *lynq_wpa_ctrl = NULL;
+    g_sta_auto_watcher_stop_flag = 0;
+    RLOGD("STAAutoWatcherThreadProc thread started ------");
+    while (g_sta_auto_watcher_stop_flag == 0)
+    {
+        if (check_pending_msg(&lynq_wpa_ctrl, CTRL_STA, &idle_count, &g_sta_auto_watcher_started_flag) != 1)
+        {
+            continue;
+        }
+        memset(msg_notify, 0, MAX_RET);
+        len = MAX_RET;
+        if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
+        {
+            msg_notify[len+1] = '\0';
+            RLOGD("STAAutoWatcherThreadProc sta ------> %s\n", msg_notify);
+            if (strstr(msg_notify, state_scan_result) != NULL)
+            {
+                g_sta_auto_scan_finish_flag = 1;
+            }
+            if (g_sta_auto_callback_func == NULL)
+            {
+                continue;
+            }
+            get_state_error_networkid(msg_notify,&state,&error,&networkid); // add net state error network function
+            notify_auto_connect_status(state, error,networkid);
+            if (state != LYNQ_WIFI_STA_STATUS_SCAN_RESULT)
+            {
+                inner_check_connect_error(msg_notify, state, error);
+                if (last_state != state)
+                {
+                    if (state == LYNQ_WIFI_STA_STATUS_CONNECT)
+                    {
+                        system_call_v("%s %s", sta_status_change_script, "connect");
+                    }
+                    else if (state == LYNQ_WIFI_STA_STATUS_DISCONNECT)
+                    {
+                        system_call_v("%s %s", sta_status_change_script, "disconnect");
+                    }
+                }
+                last_state = state;
+            }
+        }
+    }
+    if (lynq_wpa_ctrl != NULL)
+    {
+        wpa_ctrl_detach(lynq_wpa_ctrl);
+        wpa_ctrl_close(lynq_wpa_ctrl);
+    }
+}
 
 // this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
 static void GlobalWatcherThreadProc()
@@ -904,16 +1115,20 @@
     pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
     g_ap_watcher_stop_flag = 1;
     g_sta_watcher_stop_flag = 1;
+    g_sta_auto_watcher_stop_flag = 1;
     if (g_ap_watcher_pid != 0)
         pthread_join(g_ap_watcher_pid, NULL);
     if (g_sta_watcher_pid != 0)
         pthread_join(g_sta_watcher_pid, NULL);
+    if (g_sta_auto_watcher_pid != 0)
+        pthread_join(g_sta_auto_watcher_pid, NULL);
     if (g_lynq_wpa_ctrl[0] != NULL)
         wpa_ctrl_close(g_lynq_wpa_ctrl[0]);
     if (g_lynq_wpa_ctrl[1] != NULL)
         wpa_ctrl_close(g_lynq_wpa_ctrl[1]);
     g_ap_watcher_pid = 0;
     g_sta_watcher_pid = 0;
+    g_sta_auto_watcher_pid = 0;
     g_lynq_wpa_ctrl[0] = NULL;
     g_lynq_wpa_ctrl[1] = NULL;
     system("systemctl stop wg870_drv_insmod.service");
@@ -1101,7 +1316,7 @@
     if (NULL == mac || NULL == ip)
         return -1;
     memset(ip, 0, ip_len);
-    sprintf(cmd, "ip n s | grep \"lladdr\" | grep \"%s\" | head -1 | awk '{print $1}'", mac);
+    sprintf(cmd, "ip n s | grep \"lladdr\" | grep \"%s\" | awk '{print $1}' | grep -v \":\" | head -1", mac);
     ret = exec_cmd(cmd, ip, ip_len);
     p = strchr(ip, '\n');
     if (NULL != p)
@@ -3065,6 +3280,16 @@
     return 0;
 //    return system("connmanctl disable wifi");
 }
+int lynq_wifi_sta_stop_net(lynq_wifi_index_e idx,int networkid)
+{
+    char LYNQ_DISABLE_CMD[128]={0};
+    CHECK_IDX(idx, CTRL_STA);
+    CHECK_WPA_CTRL(CTRL_STA);
+    sprintf(LYNQ_DISABLE_CMD,"DISABLE_NETWORK %d",networkid);
+    RLOGD("LYNQ_DISABLE_CMD is:%d\n",LYNQ_DISABLE_CMD);
+    DO_OK_FAIL_REQUEST(LYNQ_DISABLE_CMD);
+    return 0;
+}
 
 //static int inner_get_sta_info(lynq_wifi_index_e idx, const char * bssid, device_info_s *dev) {
 //    int i, count;
@@ -3452,6 +3677,48 @@
     return -1;
 }
 
+int lynq_reg_sta_auto_event_callback(void * priv, STA_AUTO_CALLBACK_FUNC_PTR cb){
+    if (cb == NULL) 
+    {
+        RLOGE("lynq_reg_sta_auto_event_callback ptr is NULL,plese check!\n");
+        return -1;
+    }
+    pthread_mutex_lock(&s_sta_auto_callback_mutex);
+    g_sta_auto_callback_priv = priv;
+    g_sta_auto_callback_func = cb;
+    pthread_mutex_unlock(&s_sta_auto_callback_mutex);
+    pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
+    if (g_sta_auto_watcher_pid == 0 ) {
+        if(pthread_create(&g_sta_auto_watcher_pid,NULL,STAAutoWatcherThreadProc,NULL) < 0)  //create STAAutoWatcherThreadProc
+        {
+            g_sta_auto_watcher_pid = 0;
+            pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
+            RLOGE("[wifi error]creat STAWatcherThreadProc fail");
+            return -1;
+        }
+    }
+    pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
+    RLOGD("creat STAWatcherTheradProc susccs");
+    return 0;
+}
+int lynq_unreg_sta_auto_event_callback(void * priv) {
+    pthread_mutex_lock(&s_sta_auto_callback_mutex);
+    if (g_sta_auto_callback_priv == priv)
+    {  
+        g_sta_auto_watcher_stop_flag = 1;
+        if (g_sta_auto_watcher_pid != 0)
+        {
+            pthread_join(g_sta_auto_watcher_pid, NULL);
+        }
+    g_sta_auto_watcher_pid = 0;
+        g_sta_auto_callback_func = NULL;
+        g_sta_auto_callback_priv = NULL;
+        pthread_mutex_unlock(&s_sta_auto_callback_mutex);
+        return 0;
+    }
+    pthread_mutex_unlock(&s_sta_auto_callback_mutex);
+    return -1;
+}
 int lynq_get_ap_status(lynq_wifi_index_e idx, lynq_wifi_ap_run_status_s * ap_status)
 {
     char state[MAX_CMD];
diff --git a/src/lynq/lib/liblynq-wifi6/scripts/start_stop_ap.sh b/src/lynq/lib/liblynq-wifi6/scripts/start_stop_ap.sh
index 25dd644..ff0c59c 100755
--- a/src/lynq/lib/liblynq-wifi6/scripts/start_stop_ap.sh
+++ b/src/lynq/lib/liblynq-wifi6/scripts/start_stop_ap.sh
@@ -13,6 +13,8 @@
 	echo "listen-address=192.168.15.1" >> $conf_file
 	echo "bind-interfaces"  >> $conf_file
 	echo "localise-queries" >> $conf_file
+        echo "no-ping" >> $conf_file
+        echo "dhcp-authoritative" >> $conf_file
 	echo "dhcp-range=192.168.15.2,192.168.15.14,255.255.255.240,1h"  >> $conf_file
 	echo "dhcp-option=3,192.168.15.1"  >> $conf_file
 	echo "dhcp-option=6,192.168.15.1"  >> $conf_file