[Feature][ZXW-88]merge P50 version

Only Configure: No
Affected branch: master
Affected module: unknown
Is it affected on both ZXIC and MTK: only ZXIC
Self-test: Yes
Doc Update: No

Change-Id: I34667719d9e0e7e29e8e4368848601cde0a48408
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/dm-verity/caprootfs-dm-verity-private.pem b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/dm-verity/caprootfs-dm-verity-private.pem
new file mode 100755
index 0000000..1e2bc7b
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/dm-verity/caprootfs-dm-verity-private.pem
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpQIBAAKCAQEAwENZnEOU4HVx/3QNVaMjdkrEbu0atE05H6HsIANQZ7oC+erX
++osIO6s74+BSOkCwo3iMSlhhYCLZaHlB55NDSQF6MtyBEI4HZyw5Pl8oCMdVUZZf
+QPrALpaGg2/7hc/khd9gA2HH/0QDLbq09hAOHBLrzDk8PKp9waguMPfv7WXdY4L3
+vfJmt6nL5mvNxB5ERvTRwbjNa8Q6S1A7jqIvaukgaK11SaRyUi6N2Rk4PV0atBQ3
+3QRMlVTmRAs3jA/FTmeCKp3nTJeDPwYfrCXfaf1r/wzBeUfVI2RP1yoTdZnRUyCT
+HbGlrvIed4cbepTu2WMJG6jYEGRIgAGEUB5evwIDAQABAoIBAQC0olJduyzzmcRJ
+8jnY/JYDvIlDgqa1QVxq+NGE3jg7zAqhzV+vt9I7ZUy2cvouWrraSxbbfp+2F+fU
+/R/LN5Ne0vGBOaRU7mvMJkN98x8E6GqjZbkGrs/CtY+Zi6tvc/vLPyvQ4Zxqmva1
+jxYXnMv02l4JmLiccr4GJUGIplkX2xxwBR9jN69LOZpWipI8DOQ+r/YLFHiefhvS
+7RIQNsKStwoPbcdt/cXz1uhtSJCIPS4iP/ROcB481wDYnShn/PMmEJ2RtbV9N77s
+fLiETY+YuKtMNR6arFs1h9A0Jr3zLePHjFSXxRJsbuvgeV5//ChBrnyQzZ4ti/1J
+ScNpJDlJAoGBAOZ54IgzF/4rlapBB+3yyO5A43o4I19CMG2r5R8gFzLp9iwCm/fi
+HHW26Fp5huGcu+kAqijjypMrjzlF1vk5h8geZ9GbP/LOXJZ1jfCctjaeRb107VyQ
+PPJsO1FICFTpnWzd80nTgd+RqggBe0pId11zSJj9jrw0MR0QAHTWIvzVAoGBANWO
+HRbe1FPnnT+55njAL8UxcZ40gvWFAWxVzq7dF4MfcN7cK/IYLVh/KjGLDGMwRzqg
+JKTY87CR6uehUVBTEOmyQEsEF6PH1iadcPZCFrTdQwJgD9uWbgrTL9bIaYao6ET8
+jND/8L4rz6r/C15FsPO7g+mrf9JyktvrxgTIiudDAoGBANbONseaHz2EL6yLibFr
+O3xbO+hYVBdfYDWHJTe6OAT667YfBHCm6/GGdM6GP4EdDEHgnbcYf2BlE8rEXdTQ
+ms2YERjZgmNxk/ejPpRH6sfDAarPRL6lrDghSbO62BET3uZtgmeHWp8dawSlJNyZ
+565QWRRGFfcxCalVladPQTK1AoGBAJHht8tkwsTiZpAezOrV1owtX4EEPCW+Cx/X
+ag4X6DThaHhFDRwfGfLnQ4p+gyLK2w2YUg/uSGHo+//pOiPV6qrJ4pOcIw31uDu+
+t2jx8pLwxxK7TnnhxCBO7dIaK8QaZDikEQnAnNM8GGumODzY/K0y/kTEq9e1/s6O
+vEGOQR0DAoGAE7KA4kK6/FfJMNNRChiYIxOdSbuUa0VeamdXZE35ssywF87+ooU/
+o1BcAcHixOTrXDvRQdZoIjXxD6JHOj/5OXHx/Irpk+2dXAMQIyM9E/y27lLsg4NB
+qOp2vTPpj9hrubXTr3vRlqSBWixE/1w24JD7cZStECOhzdHJA5c3bko=
+-----END RSA PRIVATE KEY-----
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/dm-verity/caprootfs-dm-verity-pub.pem b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/dm-verity/caprootfs-dm-verity-pub.pem
new file mode 100755
index 0000000..a649606
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/dm-verity/caprootfs-dm-verity-pub.pem
@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwENZnEOU4HVx/3QNVaMj
+dkrEbu0atE05H6HsIANQZ7oC+erX+osIO6s74+BSOkCwo3iMSlhhYCLZaHlB55ND
+SQF6MtyBEI4HZyw5Pl8oCMdVUZZfQPrALpaGg2/7hc/khd9gA2HH/0QDLbq09hAO
+HBLrzDk8PKp9waguMPfv7WXdY4L3vfJmt6nL5mvNxB5ERvTRwbjNa8Q6S1A7jqIv
+aukgaK11SaRyUi6N2Rk4PV0atBQ33QRMlVTmRAs3jA/FTmeCKp3nTJeDPwYfrCXf
+af1r/wzBeUfVI2RP1yoTdZnRUyCTHbGlrvIed4cbepTu2WMJG6jYEGRIgAGEUB5e
+vwIDAQAB
+-----END PUBLIC KEY-----
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/dm-verity/oem-dm-verity-private.pem b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/dm-verity/oem-dm-verity-private.pem
new file mode 100755
index 0000000..3e8f74a
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/dm-verity/oem-dm-verity-private.pem
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAvpH5M5RV3rafe4ns2Y8sX3TiWQegiYFpoS3i7fQrwrd1OoXx
+z6A33eCmEU/1sx0I3hYdqVaUahHUa0/YLEkD4qtGfaJCo3v8rzT4MU8bQKBrIr99
+ERweulPYNVOS7qo3K8kAt/8NZE98dM0VuE41bTB0vTJCcMxk9Vyi+bn4WqNT37er
+2Z3kT8lqRxyv94Wi7v2KuYXUB3myDXGlcLZlfwTKO2RSnNUVGaLbTjAGWFz4cS7h
+meXv0rtgn0j17AWiQrNeKcGg0m0ssvn5aOmJjV3DYZHHJNaIQxQXGGqBtgNiv2pi
+Uy0pdISc8obpUfZIfdlZI9JQyfB6IVIM1tqrbQIDAQABAoIBABDw5RhivWd5EKBo
+2HdWtPkfaOfFN85BhORhMeU5aZJ7wJ4dPivY8F53FAxB8XOkxx8HFEfzfGoZf6qy
+hGMbco757uBIRmhGI2Zn7RBlGeUa3atPHo0g1NJ3labX8R3qX9Eyoy+4KraaIlQ3
+zxB9U16LijUvfJyObwMo4wwULjHQX+Lk2GQQOnKmmPJajF3FK9nosJ30H0JINlxH
+B1bKoXbO0mVvnq6vWHnm6yJUvx/xLLWi8G4Efj48z/UW+OpZ4y0osPWLYEhp7WBo
+94Po0aLjryKzWp1MISyJtZfIRxD4toBIdtWBhakucoVh4LypDiigeLvuU7z2SbEX
+H+Mf4DkCgYEA4ZR5Kl+CJiTki0EAC6U28bMLfi8gxtMb9HSyH7aJhc/1po2CXlsx
+CYnz9RHT6RGRbX8c2IvGhxEtRINyT5VNJ1VOCI22XXET4yHmdouO0PDshsj+lIPX
+zfmfbDyJxJmZUmmjppkG994jwl/H0QQFQRhPu3MBQgQyGpcjuwTMC08CgYEA2ETi
+b9xVSHR+Pih+8zm4hM5rvgimB+n0FA0K8SB4neKLnXjjnmHkaV1D/Us3lFOGWd8w
+94ZN+aQn+4JElv04uHyPsDSXnkJntY8KMvEGdlxoAgy7vc4iNhVNjeFVDpxKzQ/H
+pqMFRkvwBskKOo4EPTG/VwQVAUUVWPnXzQUgfoMCgYEA3S14yAUxVTkjJS6sXr61
+arME98o5tvjTFhM9ez69BIjs8Usaom2DXTj4DDhYsNNa5iOWIvSZyWEcI2tGr6VS
+KtjHVDeusVvoBfH9SAp6E3/GSjnU88V52SmCGNwasLtxy45suTKd1HboVPMYtmXc
+yQCPXNncR+BZSB0dGYgQkJ0CgYABB5LsZWgiiCtxsE+qaMPwHet1ZCUmNH7s+YLr
+0vPADKwNe93Ziy3DMqZ4Njt1gVBKbT2WcBU+8wEduWkKLvpuJmmotRdjsX086Als
+ZKlbNuVn3Rent6uCBmfwHPqCr0vL3h9dM7l6tDHYVmyuCq8Ke4olp+dRsjp/yfC1
+ESkucQKBgF4uHRTcAayK9FKyxE7NaHu+9Qddy1SJHXY3FqZw2ZsxTAcAnYuNSfIV
+4XJQLO20Tbg2/OCI2phIYrmfi7+uzMiL7YSZMSpIAZXaFkB3AkJPxBbf7FGJ54ba
+FClxGWeVNsWDwSScP1MhpSTk3Ej2SXvPMKjR0oK40P2JMBNarcaj
+-----END RSA PRIVATE KEY-----
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/dm-verity/oem-dm-verity-pub.pem b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/dm-verity/oem-dm-verity-pub.pem
new file mode 100755
index 0000000..0a8e225
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/dm-verity/oem-dm-verity-pub.pem
@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvpH5M5RV3rafe4ns2Y8s
+X3TiWQegiYFpoS3i7fQrwrd1OoXxz6A33eCmEU/1sx0I3hYdqVaUahHUa0/YLEkD
+4qtGfaJCo3v8rzT4MU8bQKBrIr99ERweulPYNVOS7qo3K8kAt/8NZE98dM0VuE41
+bTB0vTJCcMxk9Vyi+bn4WqNT37er2Z3kT8lqRxyv94Wi7v2KuYXUB3myDXGlcLZl
+fwTKO2RSnNUVGaLbTjAGWFz4cS7hmeXv0rtgn0j17AWiQrNeKcGg0m0ssvn5aOmJ
+jV3DYZHHJNaIQxQXGGqBtgNiv2piUy0pdISc8obpUfZIfdlZI9JQyfB6IVIM1tqr
+bQIDAQAB
+-----END PUBLIC KEY-----
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/dm-verity/rootfs.cpio b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/dm-verity/rootfs.cpio
new file mode 100755
index 0000000..37875f1
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/dm-verity/rootfs.cpio
Binary files differ
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/include/oemdata-ubi-default.cfg b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/include/oemdata-ubi-default.cfg
new file mode 100755
index 0000000..6c7f896
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/include/oemdata-ubi-default.cfg
@@ -0,0 +1,7 @@
+[vol_oemdata]
+mode=ubi
+vol_id=0
+vol_size=1MiB
+vol_type=dynamic
+vol_name=vol_oemdata
+vol_flags=autoresize
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc.conf b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc.conf
index e550600..5de1db2 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc.conf
+++ b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc.conf
@@ -142,7 +142,9 @@
 	libdebug-info \	
 	libmtd \
 	libsclog \
+	libupi-ab \
 	libbinder \
+	libflags \
         liblynq-uci \
         liblynq-shm \
         liblynq-log \
@@ -187,6 +189,7 @@
 	cc-demo \
 	sim-demo \
 	sms-demo \
+	socket-demo \
 	i2ctest \
 	spitest \
 	uarttest \
@@ -216,11 +219,18 @@
 	mnet-whitelist \
 	sc-msg-test \
 	zxic-amt \
+	flags-tool \
+	servicemanager \
+	service \
+	service-test \
         lynq-ril-service \
         uci \
         gdb \
         mobiletek-tester-rdit \
         lynq-qser-voice-demo \
+        lynq-qser-fota-demo \
+        lynq-qser-gnss-demo \
+        lynq-qser-network-demo \
 	"
 
 zxic_app_open += "${@bb.utils.contains('CONFIG_TEL_API_SUPPORT', 'RIL', 'rild', '', d)}"
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_4Gb.conf b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_4Gb.conf
index e54087d..85b6ea5 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_4Gb.conf
+++ b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_4Gb.conf
@@ -155,6 +155,7 @@
 	libsclog \
 	libupi-ab \
 	libbinder \
+	libflags \
 	"
 
 zxic_lib += "${@bb.utils.contains('CONFIG_TEL_API_SUPPORT', 'RIL', 'libril', 'libtelsvr', d)}"
@@ -181,6 +182,7 @@
 	cc-demo \
 	sim-demo \
 	sms-demo \
+	socket-demo \
 	i2ctest \
 	spitest \
 	uarttest \
@@ -210,6 +212,7 @@
 	usbtest \
 	mnet-whitelist \
   zxic-amt \
+	flags-tool \
 	"
 
 zxic_app_open += "${@bb.utils.contains('CONFIG_TEL_API_SUPPORT', 'RIL', 'rild', '', d)}"
@@ -232,6 +235,7 @@
 	python3 \
 	mtd-utils-ubifs \
 	${meta_optee} \
+	tzdata \
 	"
 
 #normal的版本应用及库
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
index 04c0f9f..f4036e7 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
+++ b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_ref.conf
@@ -84,6 +84,15 @@
 #cap_oem.img
 DISTRO_FEATURES += " oemfs "
 
+#dm-verity for squashfs
+DISTRO_FEATURES += " dm-verity "
+ROOTFS_DM-VERITY_PRIVATE_KEY="caprootfs-dm-verity-private.pem"
+ROOTFS_DM-VERITY_PUB_KEY="caprootfs-dm-verity-pub.pem"
+KERNEL_INITRAMFS_CPIO="rootfs.cpio"
+OEM_DM-VERITY_PRIVATE_KEY="oem-dm-verity-private.pem"
+OEM_DM-VERITY_PUB_KEY="oem-dm-verity-pub.pem"
+
+
 #CUSTOM_MACRO在各个产品不变的宏放到cpe-base.inc文件,变化的宏放在产品发布文件。
 CUSTOM_MACRO  += " -D_GNU_SOURCE "
 
@@ -123,7 +132,9 @@
 SECURITY_STACK_PROTECTOR = " -fstack-protector-all"
 #CUSTOM_MACRO += " -D_USE_CODEC_TI3100 "
 CUSTOM_MACRO += " -D_USE_CODEC_NAU8810 "
-
+#CUSTOM_MACRO += " -D_USE_CODEC_TI3104 "
+#CUSTOM_MACRO += " -D_USE_CODEC_MAX9867 "
+#CUSTOM_MACRO += " -D_USE_CODEC_ES8311 "
 CUSTOM_MACRO += "${@bb.utils.contains('DISTRO_FEATURES', 'voice_alsa', '-D_USE_VOICE_ALSA', '', d)}"
 #wifi 配置
 #"mt7916" "" "" ""
@@ -133,7 +144,7 @@
 #wificfg       = "${@bb.utils.contains('CONFIG_WIFI_FUNCTION', 'ap', bb.utils.contains('CONFIG_WIFI_MODULE', 'esp8089', 'lib32-hostapd-2.6', '', d), '', d)}"
 
 #BL接口支持("BL"),RIL接口支持("RIL")
-CONFIG_TEL_API_SUPPORT = "BL"
+CONFIG_TEL_API_SUPPORT = "RIL"
 
 CUSTOM_MACRO  		+= "${@bb.utils.contains('CONFIG_TEL_API_SUPPORT', 'BL', '-D_USE_BL', '', d)}"
 
@@ -149,6 +160,7 @@
 	libzxic-pbm \
 	libsoftap \
 	libatutils \
+	libsqlite \
 	libscipc \
 	libsctel \
 	libbsp \
@@ -160,6 +172,25 @@
 	libsclog \
 	libupi-ab \
 	libbinder \
+	libflags \
+        liblynq-uci \
+        liblynq-shm \
+        liblynq-log \
+        libapn \
+        libpal \
+        libvendor-ril \
+        liblynq-call \
+        liblynq-sim \
+        liblynq-network \
+        liblynq-sms \
+        liblynq-data \
+        liblynq-qser-voice \
+        liblynq-qser-sim \
+        liblynq-qser-sms \
+        liblynq-qser-data \
+        liblynq-qser-network \
+        liblynq-qser-gnss \
+        liblynq-qser-fota \
 	"
 
 zxic_lib += "${@bb.utils.contains('CONFIG_TEL_API_SUPPORT', 'RIL', 'libril', 'libtelsvr', d)}"
@@ -170,6 +201,7 @@
 	at-ctl \
 	atchn-test \
 	zxic-mainctrl \
+	zxic-mmi \
 	zxic-script \
 	zxic-hotplug \
 	zxic-ramdump \
@@ -186,6 +218,7 @@
 	cc-demo \
 	sim-demo \
 	sms-demo \
+	socket-demo \
 	i2ctest \
 	spitest \
 	uarttest \
@@ -211,7 +244,20 @@
 	fota-upi-ab \
 	sc-net-test \	
 	usbtest \
-  zxic-amt \
+  	zxic-amt \
+	wlan-proxy \
+	wifi-demo \
+	mnet-whitelist \
+	mnet-whitelist-proxy \
+	flags-tool \
+	lynq-ril-service \
+        uci \
+        gdb \
+        mobiletek-tester-rdit \
+        lynq-qser-voice-demo \
+        lynq-qser-fota-demo \
+        lynq-qser-gnss-demo \
+        lynq-qser-network-demo \
 	"
 
 zxic_app_open += "${@bb.utils.contains('CONFIG_TEL_API_SUPPORT', 'RIL', 'rild', '', d)}"
@@ -232,8 +278,13 @@
 	iperf3 \
 	tcpdump \
 	python3 \
+	openssl-bin \
 	mtd-utils-ubifs \
+	cryptsetup \
 	${meta_optee} \
+	tzdata \
+	python3 \
+	lrzsz \
 	"
 
 #normal的版本应用及库
@@ -259,3 +310,76 @@
 	"
 
 PACKAGE_EXCLUDE = "eudev"
+
+#DISTRO   = "lynq_vehicle_dc"
+#DISTRO_NAME   = "lynq distro vehicle_dc"
+RAT_CONFIG_C2K_SUPPORT = "no"
+MTK_MULTI_SIM_SUPPORT = "dsds" 
+TARGET_PLATFORM = "T106"
+MTK_LED_SUPPORT = "no"
+#support lynq_atsvc [hong.liu add for lynq atsvc on 2022.12.1]
+LYNQ_ATSVC_SUPPORT = "yes"
+
+#GPIO_CFG value:"PLATFORM" , "GENVICT" ,"GSW"
+MOBILETEK_GPIO_CFG = "PLATFORM"
+
+#PLL_CFG value:"PLATFORM","GSW"
+MOBILETEK_PLL_CFG = "PLATFORM"
+
+#RTP_CFG value:"PLATFORM","GSW"
+MOBILETEK_RTP_CFG = "PLATFORM"
+
+#MEDIA_CFG value:"PLATFORM","GSW"
+MOBILETEK_MEDIA_CFG = "PLATFORM"
+
+#LOG_CFG value:"PLATFORM","GSW"
+MOBILETEK_LOG_CFG = "PLATFORM"
+
+#FOTA_CFG value:"PLATFORM","GSW"
+MOBILETEK_FOTA_CFG = "PLATFORM"
+
+#RIL_CFG value:"PLATFORM","GSW"
+MOBILETEK_RIL_CFG = "PLATFORM"
+
+#UART_CFG value:"PLATFORM","GSW"
+MOBILETEK_UART_CFG = "PLATFORM"
+
+#USB_CFG value:"PLATFORM","GSW"
+MOBILETEK_USB_CFG = "PLATFORM"
+
+#ndis_CFG value:"PLATFORM","GSW"
+MOBILETEK_NDIS_CFG = "PLATFORM"
+
+#SUSPEND_CFG value:"PLATFORM","GSW"
+MOBILETEK_SUSPEND_CFG = "PLATFORM"
+
+#MNLDLOG_CFG value:"PLATFORM","GSW"
+MOBILETEK_MNLDLOG_CFG = "PLATFORM"
+
+#OPTEE_CFG value:"PLATFORM","GSW"
+MOBILETEK_OPTEE_CFG = "PLATFORM"
+
+#EMMC_CFG value:"PLATFORM","GSW"
+MOBILETEK_EMMC_CFG = "PLATFORM"
+
+#WIFIKERNELCODE_CFG value:"PLATFORM","GSW"
+MOBILETEK_WIFIKERNELCODE_CFG = "PLATFORM"
+
+#SYSTEMD_CFG value:"PLATFORM","GSW"
+MOBILETEK_SYSTEMD_CFG = "PLATFORM"
+
+#GSTREAMER_CFG value:"PLATFORM","GSW"
+MOBILETEK_GSTREAMER_CFG = "PLATFORM"
+
+#BUSYBOX_CFG value:"PLATFORM","GSW"
+MOBILETEK_BUSYBOX_CFG = "PLATFORM"
+
+#OPENSSH_CFG value:"PLATFORM","GSW"
+MOBILETEK_OPENSSH_CFG = "PLATFORM"
+
+#OEMAPP_CFG value:"PLATFORM","GSW"
+MOBILETEK_OEMAPP_CFG = "PLATFORM"
+
+LYNQ_CONFIG_COMMITID = "e2a3410390ff0ad762462ccb6af8faa5e16dcd61"
+LYNQ_CONFIG_VERSION = "T106_ap_version_cap_0425"
+LYNQ_CONFIG_SW_VERSION = "T106_ap_version_MR3.02b06.00"
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_systemd.conf b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_systemd.conf
index cd6d913..c525e00 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_systemd.conf
+++ b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc_systemd.conf
@@ -159,6 +159,7 @@
 	libsclog \
 	libupi-ab \
 	libbinder \
+	libflags \
 	"
 
 zxic_lib += "${@bb.utils.contains('CONFIG_TEL_API_SUPPORT', 'RIL', 'libril', 'libtelsvr', d)}"
@@ -213,6 +214,7 @@
 	sc-net-test \	
 	usbtest \
   zxic-amt \
+	flags-tool \
 	"
 
 zxic_app_open += "${@bb.utils.contains('CONFIG_TEL_API_SUPPORT', 'RIL', 'rild', '', d)}"
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/generate_squashfs_verity b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/generate_squashfs_verity
new file mode 100755
index 0000000..aead9e5
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/generate_squashfs_verity
Binary files differ
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/squashfs_dm-verity.sh b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/squashfs_dm-verity.sh
new file mode 100755
index 0000000..50e5e33
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/squashfs_dm-verity.sh
Binary files differ
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/etc/rc.local b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/etc/rc.local
index 81e92f4..1d6d9b4 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/etc/rc.local
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/etc/rc.local
@@ -37,5 +37,10 @@
 
 rm -rf /etc_rw/udhcpd*.pid
 
-ln -sf "/etc/zoneinfo/Asia/Shanghai" /etc/localtime
-
+#ln -sf "/etc/zoneinfo/Asia/Shanghai" /etc/localtime
+ln -sf "/etc_rw/localtime" /etc/localtime
+if [ ! -L /etc_rw/localtime ]; then
+ln -sf "/usr/share/zoneinfo/Asia/Shanghai" /etc_rw/localtime
+fi
+echo pwr_on_delay 60000000000 > /sys/power/wake_lock
+echo mem > /sys/power/autosleep
\ No newline at end of file
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/etc_ro/default/default_parameter_sys b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/etc_ro/default/default_parameter_sys
index 12e3bfd..3c618dd 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/etc_ro/default/default_parameter_sys
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/etc_ro/default/default_parameter_sys
@@ -116,6 +116,7 @@
 fota_ab_upgrade_total_size=0
 fota_ab_upgrade_updated_size=0
 fota_ab_aa_sync_status=0
+fota_ab_log_path=/cache/zte_fota_ab/upi_ab.log
 Login=admin
 Password=
 sntp_server_count=3
@@ -142,9 +143,10 @@
 #syslogdÏà¹ØÅäÖÃ
 syslog_file_size=1
 syslog_file_num=5
+#you.chen modify for log
 print_level=3
 syslog_level=1
-
+#you.chen modify for log
 skb_debug=
 seclog_switch=1
 ################SOFTAPרÓà END#####################################
@@ -327,10 +329,12 @@
 ###²¨ÌØÂÊ×ÔÊÊÓ¦¿ª¹Ø###
 self_adaption_port=
 ###ijЩ¶Ë¿Ú²»ÐèÒªÏòÓ¦ÓÃÉϱ¨¶Ë¿Ú×¼±¸ºÃÏûÏ¢###
+#xf.li modify for open uart1
 notify_forbiden_ports=/dev/ttyS0
-
+#xf.li modify for open uart1
 ###adbĬÈϹÒÔØºË,0:ap;1:cap###
 adb_core_id=1
+
 ######USB¶Ë¿ÚÅäÖÃEND#######
 
 ######CP²àNVÅäÖÃÐÅÏ¢#######
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/etc_ro/default/default_parameter_user b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/etc_ro/default/default_parameter_user
index cd07b33..b7fe344 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/etc_ro/default/default_parameter_user
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/etc_ro/default/default_parameter_user
@@ -483,6 +483,5 @@
 cap_port_name=/dev/ttyGS0
 customIndCmdList=
 defrt_cid=1
-br_multi_off=1
 MaxRtrAdvInterval=1800
 dhcps_in_cap=1
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/sbin/fdisk_emmc.sh b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/sbin/fdisk_emmc.sh
index 2dfa60a..eb332c8 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/sbin/fdisk_emmc.sh
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/sbin/fdisk_emmc.sh
@@ -5,16 +5,22 @@
 1
 d
 2
-
+d
+3
 n
 p
-1 
 1
-58752
+16
+204816
 n
 p
 2
-58753
-117504
+204817
+7719144
+n
+p
+3
+7719145
+15269887
 w
 EOF
\ No newline at end of file
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_4Gb/fs/normal/rootfs/etc/rc.local b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_4Gb/fs/normal/rootfs/etc/rc.local
index 81e92f4..a5ebc24 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_4Gb/fs/normal/rootfs/etc/rc.local
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_4Gb/fs/normal/rootfs/etc/rc.local
@@ -37,5 +37,11 @@
 
 rm -rf /etc_rw/udhcpd*.pid
 
-ln -sf "/etc/zoneinfo/Asia/Shanghai" /etc/localtime
+#ln -sf "/etc/zoneinfo/Asia/Shanghai" /etc/localtime
+ln -sf "/etc_rw/localtime" /etc/localtime
+if [ ! -L /etc_rw/localtime ]; then
+ln -sf "/usr/share/zoneinfo/Asia/Shanghai" /etc_rw/localtime
+fi
 
+echo pwr_on_delay 60000000000 > /sys/power/wake_lock
+echo mem > /sys/power/autosleep
\ No newline at end of file
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_4Gb/fs/normal/rootfs/etc_ro/default/default_parameter_sys b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_4Gb/fs/normal/rootfs/etc_ro/default/default_parameter_sys
index 5f6b57c..d46d271 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_4Gb/fs/normal/rootfs/etc_ro/default/default_parameter_sys
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_4Gb/fs/normal/rootfs/etc_ro/default/default_parameter_sys
@@ -116,6 +116,7 @@
 fota_ab_upgrade_total_size=0
 fota_ab_upgrade_updated_size=0
 fota_ab_aa_sync_status=0
+fota_ab_log_path=/cache/zte_fota_ab/upi_ab.log
 Login=admin
 Password=
 sntp_server_count=3
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_4Gb/fs/normal/rootfs/etc_ro/default/default_parameter_user b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_4Gb/fs/normal/rootfs/etc_ro/default/default_parameter_user
index cd07b33..b7fe344 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_4Gb/fs/normal/rootfs/etc_ro/default/default_parameter_user
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_4Gb/fs/normal/rootfs/etc_ro/default/default_parameter_user
@@ -483,6 +483,5 @@
 cap_port_name=/dev/ttyGS0
 customIndCmdList=
 defrt_cid=1
-br_multi_off=1
 MaxRtrAdvInterval=1800
 dhcps_in_cap=1
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_4Gb/fs/normal/rootfs/sbin/fdisk_emmc.sh b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_4Gb/fs/normal/rootfs/sbin/fdisk_emmc.sh
index 2dfa60a..eb332c8 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_4Gb/fs/normal/rootfs/sbin/fdisk_emmc.sh
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_4Gb/fs/normal/rootfs/sbin/fdisk_emmc.sh
@@ -5,16 +5,22 @@
 1
 d
 2
-
+d
+3
 n
 p
-1 
 1
-58752
+16
+204816
 n
 p
 2
-58753
-117504
+204817
+7719144
+n
+p
+3
+7719145
+15269887
 w
 EOF
\ No newline at end of file
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc/rc.local b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc/rc.local
index 0ef8fb7..2272573 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc/rc.local
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc/rc.local
@@ -38,6 +38,3 @@
 rm -rf /etc_rw/udhcpd*.pid
 
 ln -sf "/etc/zoneinfo/Asia/Shanghai" /etc/localtime
-
-echo pwr_on_delay 60000000000 > /sys/power/wake_lock
-echo mem > /sys/power/autosleep
\ No newline at end of file
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc_ro/default/default_parameter_sys b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc_ro/default/default_parameter_sys
index 5f6b57c..ef5fdc8 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc_ro/default/default_parameter_sys
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc_ro/default/default_parameter_sys
@@ -116,17 +116,21 @@
 fota_ab_upgrade_total_size=0
 fota_ab_upgrade_updated_size=0
 fota_ab_aa_sync_status=0
+fota_ab_log_path=/cache/zte_fota_ab/upi_ab.log
 Login=admin
 Password=
 sntp_server_count=3
-MAX_Station_num=10
+MAX_Station_num=32
+MAX_Station_num_bak=0
+MAX_Access_num_bbak=0
+MAX_Chip_Capability=32
 wifi_key_gen_type=MAC
 wifi_key_len=8
 wifi_key_only_digit=y
 wifi_lte_intr=1
 wifi_ssid_gen_with_mac_lastbyte=6
 wifi_key_gen_with_mac_lastbyte=8
-wifi_mac_num=1
+wifi_mac_num=2
 wifiwan=wlan0-vxd
 wifiwan_mode=dhcp
 idle_time="600"
@@ -142,8 +146,10 @@
 #syslogdÏà¹ØÅäÖÃ
 syslog_file_size=1
 syslog_file_num=5
-print_level=2
-syslog_level=4
+#you.chen modify for log
+print_level=3
+syslog_level=1
+#you.chen modify for log
 
 skb_debug=
 seclog_switch=1
@@ -327,7 +333,9 @@
 ###²¨ÌØÂÊ×ÔÊÊÓ¦¿ª¹Ø###
 self_adaption_port=
 ###ijЩ¶Ë¿Ú²»ÐèÒªÏòÓ¦ÓÃÉϱ¨¶Ë¿Ú×¼±¸ºÃÏûÏ¢###
-notify_forbiden_ports=
+#xf.li modify for open uart1
+notify_forbiden_ports=/dev/ttyS0
+#xf.li modify for open uart1
 
 ###adbĬÈϹÒÔØºË,0:ap;1:cap###
 adb_core_id=1
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc_ro/default/default_parameter_user b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc_ro/default/default_parameter_user
index cd07b33..0b72869 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc_ro/default/default_parameter_user
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/etc_ro/default/default_parameter_user
@@ -289,7 +289,7 @@
 mmi_new_sms_blink_flag=1
 mmi_show_pagetab=page1+page2+page3
 mmi_showmode=led
-mmi_task_tab=net_task+ctrl_task
+mmi_task_tab=ctrl_task+key_task
 mmi_temp_voltage_line=951+1201+1692+1736
 mmi_use_protect=
 mmi_use_wifi_usernum=1
@@ -342,6 +342,7 @@
 ACL_mode=0
 AuthMode=WPA2PSK
 Channel=0
+wifi_acs_num=5
 closeEnable=0
 closeTime=
 CountryCode=CN
@@ -388,10 +389,10 @@
 m_ssid_enable=0
 m_wapiType=
 m_wifi_mac=901D45692A5C
-m_WPAPSK1=12345678
+m_WPAPSK1_aes=
 m_WPAPSK1_encode=MTIzNDU2Nzg=
-MAX_Access_num=10
-MAX_Access_num_bak=10
+MAX_Access_num=32
+MAX_Access_num_bak=32
 NoForwarding=0
 openEnable=0
 openTime=
@@ -401,12 +402,13 @@
 show_qrcode_flag=0
 Sleep_interval=10
 ssid_write_flag=0
-SSID1=Mdl_
+SSID1=Ufi_
 tsw_sleep_time_hour=
 tsw_sleep_time_min=
 tsw_wake_time_hour=
 tsw_wake_time_min=
 wapiType=
+wifi_force_40m=1
 wifi_11n_cap=1
 wifi_band=b
 wifi_coverage=long_mode
@@ -432,8 +434,8 @@
 wifiEnabled=1
 wifilan=wlan0-va0
 wifilan2=wlan0-va1
-WirelessMode=4
-WPAPSK1=12345678
+WirelessMode=6
+WPAPSK1_aes=
 WPAPSK1_encode=MTIzNDU2Nzg=
 wps_mode=
 WPS_SSID=
@@ -483,6 +485,5 @@
 cap_port_name=/dev/ttyGS0
 customIndCmdList=
 defrt_cid=1
-br_multi_off=1
 MaxRtrAdvInterval=1800
 dhcps_in_cap=1
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/sbin/fdisk_emmc.sh b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/sbin/fdisk_emmc.sh
index 31d6aaa..eb332c8 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/sbin/fdisk_emmc.sh
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/sbin/fdisk_emmc.sh
@@ -11,11 +11,11 @@
 p
 1
 16
-168400
+204816
 n
 p
 2
-168401
+204817
 7719144
 n
 p
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/sbin/parse_squashfs_verity b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/sbin/parse_squashfs_verity
new file mode 100755
index 0000000..e7350ee
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/sbin/parse_squashfs_verity
Binary files differ
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/sbin/ubi_mount.sh b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/sbin/ubi_mount.sh
index a079e71..2875a44 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/sbin/ubi_mount.sh
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_ref/fs/normal/rootfs/sbin/ubi_mount.sh
@@ -100,7 +100,26 @@
 fi
 
 if [ $fs_type = "squashfs" ]; then
-  mount -t $fs_type  -o $UBI_MNT_OPT /dev/$g_ubiblock_dev  $mount_point
+  if [ -f /etc_ro/dm-verity-pub.pem ]; then
+    parse_squashfs_verity /dev/$g_ubiblock_dev /tmp/sign /tmp/raw_table /tmp/hash_tree_offset
+    openssl dgst -sha256 -verify  /etc_ro/dm-verity-pub.pem  -signature /tmp/sign /tmp/raw_table
+    if [ $? -ne 0 ]; then
+      echo "dm-verity sign verify fail"
+      exit 1
+    fi
+
+    root_hash=` sed -n '/Root hash/p' /tmp/raw_table | awk '{print $3}' `
+    salt=` sed -n '/Salt/p' /tmp/raw_table | awk '{print $2}' `
+    hash_offset=` cat /tmp/hash_tree_offset `
+    veritysetup open /dev/$g_ubiblock_dev $mtd_name /dev/$g_ubiblock_dev  --hash-offset=$hash_offset $root_hash -s $salt
+    if [ $? -ne 0 ]; then
+      echo "dm-verity veritysetup open fail"
+      exit 1
+    fi
+    mount -t $fs_type  -o $UBI_MNT_OPT /dev/mapper/$mtd_name   $mount_point
+  else
+    mount -t $fs_type  -o $UBI_MNT_OPT /dev/$g_ubiblock_dev  $mount_point
+  fi
 else
   mount -t $fs_type  -o $UBI_MNT_OPT $g_ubi_dev  $mount_point
 fi
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_systemd/fs/normal/rootfs/etc_ro/default/default_parameter_sys b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_systemd/fs/normal/rootfs/etc_ro/default/default_parameter_sys
old mode 100644
new mode 100755
index 5f6b57c..d46d271
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_systemd/fs/normal/rootfs/etc_ro/default/default_parameter_sys
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_systemd/fs/normal/rootfs/etc_ro/default/default_parameter_sys
@@ -116,6 +116,7 @@
 fota_ab_upgrade_total_size=0
 fota_ab_upgrade_updated_size=0
 fota_ab_aa_sync_status=0
+fota_ab_log_path=/cache/zte_fota_ab/upi_ab.log
 Login=admin
 Password=
 sntp_server_count=3
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_systemd/fs/normal/rootfs/etc_ro/default/default_parameter_user b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_systemd/fs/normal/rootfs/etc_ro/default/default_parameter_user
index cd07b33..b7fe344 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_systemd/fs/normal/rootfs/etc_ro/default/default_parameter_user
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_systemd/fs/normal/rootfs/etc_ro/default/default_parameter_user
@@ -483,6 +483,5 @@
 cap_port_name=/dev/ttyGS0
 customIndCmdList=
 defrt_cid=1
-br_multi_off=1
 MaxRtrAdvInterval=1800
 dhcps_in_cap=1
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_systemd/fs/normal/rootfs/sbin/fdisk_emmc.sh b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_systemd/fs/normal/rootfs/sbin/fdisk_emmc.sh
index 2dfa60a..eb332c8 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_systemd/fs/normal/rootfs/sbin/fdisk_emmc.sh
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc_systemd/fs/normal/rootfs/sbin/fdisk_emmc.sh
@@ -5,16 +5,22 @@
 1
 d
 2
-
+d
+3
 n
 p
-1 
 1
-58752
+16
+204816
 n
 p
 2
-58753
-117504
+204817
+7719144
+n
+p
+3
+7719145
+15269887
 w
 EOF
\ No newline at end of file
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/zxic-image.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/zxic-image.bb
index 8559bd1..494ba7e 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/zxic-image.bb
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/zxic-image.bb
@@ -58,6 +58,8 @@
     u-boot-tools-native rsync-native \
     ${@bb.utils.contains("USERDATA_FSTYPE", "ubi", "mtd-utils-native", "", d)} \
     ${@bb.utils.contains('IMAGE_FSTYPES', 'squashfs', 'squashfskit-native', '', d)} \
+    ${@bb.utils.contains('DISTRO_FEATURES','dm-verity','cryptsetup-native','',d)} \
+    ${@bb.utils.contains('DISTRO_FEATURES','dm-verity','coreutils-native','',d)} \
     " 
 
 # Add \ in front of $
@@ -89,6 +91,9 @@
 	if [ -f ${IMAGE_ROOTFS}/postinstall.sh ]; then
 		cd ${IMAGE_ROOTFS} && sh postinstall.sh && rm -v ${IMAGE_ROOTFS}/postinstall.sh
 	fi
+	if ${@bb.utils.contains('DISTRO_FEATURES','dm-verity','true','false',d)}; then
+		cp -v ${BSPDIR}/sources/meta-zxic-custom/conf/distro/dm-verity/${OEM_DM-VERITY_PUB_KEY}   ${IMAGE_ROOTFS}/etc_ro/dm-verity-pub.pem
+	fi
 	rm -rf ${IMAGE_ROOTFS}/etc/rc[0-6].d
 	rm -f ${IMAGE_ROOTFS}/etc/fstab
 	rm -f ${IMAGE_ROOTFS}/etc/default/rcS
@@ -157,15 +162,20 @@
 
 fakeroot do_rootfs_squashfs(){
 	cp -arfp ${THISDIR}/files/ubinize-static.sh ${B}
+	if ${@bb.utils.contains('DISTRO_FEATURES','dm-verity','true','false',d)}; then
+		cp -arfp ${THISDIR}/files/squashfs_dm-verity.sh ${B}
+		cp -arfp ${THISDIR}/files/generate_squashfs_verity ${B}
+		cp -arfp ${BSPDIR}/sources/meta-zxic-custom/conf/distro/dm-verity/${ROOTFS_DM-VERITY_PRIVATE_KEY} ${B}
+	fi
 
 	mksquashfs4 ${IMAGE_ROOTFS} ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.squashfs_tmp ${ROOTFS_SQUASHFS_ARGS}
-	if [ ${STRORAGE_TYPE} = 'nand' ]; then
-		echo "rootfs squashfs need ubinize-image on nand flash"
-		${B}/ubinize-static.sh vol_rootfs ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.squashfs ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.squashfs_tmp "${UBINIZE_ARGS}"
-	elif [ ${STRORAGE_TYPE} = 'emmc' ]; then
-		echo "openwrt squashfs on emmc flash"
-		cp -f ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.squashfs_tmp ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.squashfs
+	if ${@bb.utils.contains('DISTRO_FEATURES','dm-verity','true','false',d)}; then
+		${B}/squashfs_dm-verity.sh  ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.squashfs_tmp  ${B} \
+			${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.squashfs_tmp-dm ${B}/${ROOTFS_DM-VERITY_PRIVATE_KEY}
+		mv ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.squashfs_tmp-dm  ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.squashfs_tmp
 	fi
+	echo "rootfs squashfs need ubinize-image on nand flash"
+	${B}/ubinize-static.sh vol_rootfs ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.squashfs ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.squashfs_tmp "${UBINIZE_ARGS}"
 	cd ${IMAGE_ROOTFS}/../ && tar -czvf ${IMGDEPLOYDIR}/rootfs.tgz  rootfs
 	rm -rf ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.squashfs_tmp
 
@@ -174,8 +184,18 @@
 fakeroot do_oemfs_squashfs(){
 	cp -arfp ${THISDIR}/files/ubinize-static.sh ${B}
 	cp  -arfp  ${FS-DIR}/fs/normal/oem/   ${S}/
+	if ${@bb.utils.contains('DISTRO_FEATURES','dm-verity','true','false',d)}; then
+		cp -arfp ${THISDIR}/files/squashfs_dm-verity.sh ${B}
+		cp -arfp ${THISDIR}/files/generate_squashfs_verity ${B}
+		cp -arfp ${BSPDIR}/sources/meta-zxic-custom/conf/distro/dm-verity/${OEM_DM-VERITY_PRIVATE_KEY} ${B}
+	fi
 
 	mksquashfs4 ${S}/oem ${IMGDEPLOYDIR}/oem.squashfs_tmp ${ROOTFS_SQUASHFS_ARGS}
+	if ${@bb.utils.contains('DISTRO_FEATURES','dm-verity','true','false',d)}; then
+		${B}/squashfs_dm-verity.sh  ${IMGDEPLOYDIR}/oem.squashfs_tmp  ${B} \
+			${IMGDEPLOYDIR}/oem.squashfs_tmp-dm ${B}/${OEM_DM-VERITY_PRIVATE_KEY}
+			mv ${IMGDEPLOYDIR}/oem.squashfs_tmp-dm ${IMGDEPLOYDIR}/oem.squashfs_tmp
+	fi
 	echo "oem squashfs need ubinize-image on nand flash"
 	${B}/ubinize-static.sh vol_oem "${BINS-PATH}/cap_oem.img" ${IMGDEPLOYDIR}/oem.squashfs_tmp "${UBINIZE_ARGS}"
 	mkdir -p ${ELFS-PATH}
@@ -201,9 +221,9 @@
 	if ${@bb.utils.contains('DISTRO_FEATURES','sysvinit','true','false',d)}; then
 		rm -rf ${IMAGE_ROOTFS}/var
 		if ${@bb.utils.contains('DISTRO_FEATURES','oemfs','true','false',d)}; then
-			cd ${IMAGE_ROOTFS}/ && mkdir -p mnt/oemdata/var && ln -snf mnt/oemdata/var var
+			cd ${IMAGE_ROOTFS}/ && ln -snf mnt/oemdata/var var
 		else
-			cd ${IMAGE_ROOTFS}/ && mkdir -p mnt/userdata/var && ln -snf mnt/userdata/var var
+			cd ${IMAGE_ROOTFS}/ && ln -snf mnt/userdata/var var
 		fi
 	elif ${@bb.utils.contains('DISTRO_FEATURES','procd','true','false',d)}; then
 		rm -rf ${IMAGE_ROOTFS}/var
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-network/liblynq-network.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-network/liblynq-network.bb
index 055a0c9..ad1d13b 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-network/liblynq-network.bb
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-network/liblynq-network.bb
@@ -21,7 +21,7 @@
                 'TARGET_PLATFORM = ${TARGET_PLATFORM}'"

 

 FILES_${PN} = "${base_libdir}/*.so "

-FILES_${PN} += "/data/ril/network"

+

 

 FILES_${PN}-dev = "/test \

                    ${includedir}"

diff --git a/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/admin/netutils.te b/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/admin/netutils.te
index 1de8295..1709c86 100755
--- a/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/admin/netutils.te
+++ b/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/admin/netutils.te
@@ -207,3 +207,10 @@
 # nmap searches .
 userdom_dontaudit_search_user_home_dirs(traceroute_t)
 userdom_dontaudit_search_user_home_content(traceroute_t)
+gen_require(`
+    type tmpfs_t;
+')
+allow netutils_t device_t:chr_file { read write open };
+allow netutils_t initrc_t:netlink_kobject_uevent_socket { read write };
+allow netutils_t tmpfs_t:dir { search write add_name remove_name };
+allow netutils_t tmpfs_t:file { create write open unlink getattr };
diff --git a/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/services/radvd.te b/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/services/radvd.te
index 03c6c8f..3dec634 100755
--- a/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/services/radvd.te
+++ b/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/services/radvd.te
@@ -115,4 +115,6 @@
 manage_chr_files_pattern(radvd_t, etc_t, etc_t)
 manage_dirs_pattern(radvd_t, etc_t, etc_t)
 manage_files_pattern(radvd_t,etc_t, etc_t)
-manage_lnk_files_pattern(radvd_t, etc_t, etc_t)
\ No newline at end of file
+manage_lnk_files_pattern(radvd_t, etc_t, etc_t)
+allow radvd_t kernel_t:fd { use };
+allow radvd_t etc_t:file { map };
diff --git a/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/init.te b/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/init.te
index 6d553de..f5d1667 100755
--- a/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/init.te
+++ b/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/init.te
@@ -1504,4 +1504,5 @@
 manage_chr_files_pattern(init_runtime_t, getty_t, getty_t)
 manage_dirs_pattern(init_runtime_t, getty_t, getty_t)
 manage_files_pattern(init_runtime_t,getty_t, getty_t)
+allow initrc_t initrc_t:process { execstack execmem };
 
diff --git a/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/iptables.te b/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/iptables.te
index a057f5a..73573ca 100755
--- a/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/iptables.te
+++ b/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/iptables.te
@@ -148,6 +148,7 @@
 gen_require(`
 	type root_t;
 	type tmpfs_t;
+	type default_t;
 ')
 
 manage_chr_files_pattern(iptables_t, etc_t, etc_t)
@@ -161,4 +162,5 @@
 manage_files_pattern(iptables_t,root_t, root_t)
 manage_chr_files_pattern(iptables_t, tmpfs_t, tmpfs_t)
 manage_dirs_pattern(iptables_t, tmpfs_t, tmpfs_t)
-manage_files_pattern(iptables_t,tmpfs_t, tmpfs_t)
\ No newline at end of file
+manage_files_pattern(iptables_t,tmpfs_t, tmpfs_t)
+allow iptables_t default_t:lnk_file read;
\ No newline at end of file
diff --git a/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/locallogin.te b/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/locallogin.te
index 4365341..119a0ff 100755
--- a/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/locallogin.te
+++ b/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/locallogin.te
@@ -317,6 +317,7 @@
 	type ptmx_t;		
 	type ifconfig_exec_t;
 	type ping_exec_t;
+	type lvm_control_t;
 	class service { start status stop };
 ')
 
@@ -423,6 +424,9 @@
 
 gen_require(`
 	type can_load_kernmodule;
+	type unreserved_port_t;
+	type node_t;
+	type netutils_exec_t;
 ')
 
 allow can_load_kernmodule local_login_t:capability {  sys_module  };
@@ -472,4 +476,31 @@
 allow local_login_t ptmx_t:chr_file { getattr };
 allow local_login_t unlabeled_t:dir { mounton };
 allow local_login_t local_login_t:capability { sys_admin };
-
+allow local_login_t unreserved_port_t:tcp_socket {  name_bind  };
+allow local_login_t node_t:tcp_socket {  node_bind  };
+allow local_login_t local_login_t:tcp_socket { listen };
+allow local_login_t { device_t tmpfs_t devpts_t }:filesystem { getattr };
+allow local_login_t default_t:file { map execute execute_no_trans };
+allow local_login_t self:process { execstack execmem };
+allow local_login_t device_t:chr_file { map };
+allow local_login_t var_t:sock_file { getattr unlink write };
+allow klogd_t default_t:lnk_file { read };
+allow klogd_t mnt_t:dir { search };
+allow klogd_t tmpfs_t:dir { search write add_name remove_name };
+allow klogd_t tmpfs_t:file { create write open unlink getattr };
+allow syslogd_t nvserver_t:msgq { unix_read unix_write associate getattr write read };
+allow syslogd_t nvserver_t:msg { send receive };
+allow syslogd_t default_t:lnk_file { read };
+allow syslogd_t tmpfs_t:file { unlink create write open getattr };
+allow syslogd_t tmpfs_t:dir { write add_name remove_name search };
+allow syslogd_t mnt_t:dir { search };
+allow can_load_kernmodule self:capability { sys_module };
+allow local_login_t proc_t:dir { search write add_name remove_name };
+allow local_login_t proc_t:file { create write open unlink getattr };
+allow local_login_t sysctl_t:dir { search write add_name remove_name };
+allow local_login_t sysctl_t:file { create write open unlink getattr };
+allow local_login_t netutils_exec_t:file { map execute execute_no_trans };
+allow local_login_t local_login_t:packet_socket { create ioctl bind getopt setopt map read write };
+allow local_login_t var_log_t:file { create write open unlink getattr read };
+allow local_login_t { debugfs_t default_t device_t tmpfs_t devpts_t }:filesystem { getattr };
+manage_chr_files_pattern(local_login_t, lvm_control_t, lvm_control_t);
diff --git a/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/logging.te b/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/logging.te
index 667eb9e..8ff8770 100755
--- a/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/logging.te
+++ b/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/logging.te
@@ -622,6 +622,8 @@
 gen_require(`
     type default_t;
 	type unlabeled_t;
+	type nvserver_t;
+	type mnt_t;
 ')
 allow syslogd_t self:netlink_audit_socket nlmsg_write;
 allow syslogd_t self:capability audit_control;
@@ -652,6 +654,11 @@
 manage_dirs_pattern(klogd_t, unlabeled_t, unlabeled_t)
 manage_files_pattern(klogd_t,unlabeled_t, unlabeled_t)
 manage_lnk_files_pattern(klogd_t, unlabeled_t, unlabeled_t)
+allow syslogd_t nvserver_t:msgq { unix_read unix_write associate getattr write read };
+allow syslogd_t nvserver_t:msg { send receive };
+allow syslogd_t default_t:lnk_file { read  };
+allow syslogd_t mnt_t:dir { search };
+allow syslogd_t tmpfs_t:dir { write add_name remove_name search };
 
 
 
diff --git a/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/modutils.te b/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/modutils.te
index b8769bc..fb0a8b5 100755
--- a/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/modutils.te
+++ b/cap/zx297520v3/sources/meta-zxic-selinux/recipes-security/refpolicy/files/policy-mls/policy/modules/system/modutils.te
@@ -183,3 +183,4 @@
 
 	xserver_getattr_log(kmod_t)
 ')
+allow kmod_t kernel_t:unix_dgram_socket { read write };
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/ab-bootinfo/ab-bootinfo.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/ab-bootinfo/ab-bootinfo.bb
index bd8dadd..15d42b2 100755
--- a/cap/zx297520v3/sources/meta-zxic/recipes-app/ab-bootinfo/ab-bootinfo.bb
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/ab-bootinfo/ab-bootinfo.bb
@@ -1,6 +1,6 @@
 DESCRIPTION = "ab-bootinfo"
 #nv依赖libnvram库
-DEPENDS     = "libmtd libnvram libsofttimer libsoftap libupi-ab"
+DEPENDS     = "libflags libmtd"
 SECTION     = "ab-bootinfo"
 LICENSE     = "zte"
 PV = "1.0.0"
@@ -15,6 +15,11 @@
 LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/zte;md5=c075689d1d1e06d4ab5bbe53623a6808"
 S = "${WORKDIR}"
 
+# 引用公用头文件和编译选项。
+include ${BSPDIR}/sources/meta-zxic/conf/app_com.inc
+include ${BSPDIR}/sources/meta-zxic/conf/pub.inc
+CFLAGS_append = "${ZXIC_EXTRA_CFLAGS}"
+
 #编译
 do_compile() {
 	make -C ab_bootinfo
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/flags-tool/flags-tool.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/flags-tool/flags-tool.bb
new file mode 100755
index 0000000..1f0e0bc
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/flags-tool/flags-tool.bb
@@ -0,0 +1,48 @@
+DESCRIPTION = "flags_tool"
+DEPENDS     = "libflags"
+SECTION     = "app"
+LICENSE     = "zte"
+PV = "1.0.0"
+PR = "r0"
+
+# 配置code路径信息。
+FILESEXTRAPATHS_prepend :="${APP-OPEN-PATH}/platform:"
+SRC_URI = " \          
+			file://flags_tool \
+			"
+
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/zte;md5=c075689d1d1e06d4ab5bbe53623a6808"
+S = "${WORKDIR}"
+
+# 引用公用头文件和编译选项。
+include ${BSPDIR}/sources/meta-zxic/conf/app_com.inc
+include ${BSPDIR}/sources/meta-zxic/conf/pub.inc
+
+CFLAGS_append = "${ZXIC_EXTRA_CFLAGS}"
+
+# 编译
+do_compile() {
+	make -C flags_tool
+}
+
+# 安装
+do_install () {	
+	install -d ${D}${bindir}/
+	install -m 0755 ${S}/flags_tool/flags_tool_static ${D}${bindir}/
+	
+	#install elfs
+	install -d ${ELFS-PATH}/
+	install -m 0755 ${S}/flags_tool/flags_tool_static ${ELFS-PATH}/
+}
+
+# 清库
+do_cleanlibs () {
+	rm -fr ${ELFS-PATH}/flags_tool
+}
+
+addtask  cleanlibs after do_clean  before do_cleansstate
+
+# rootfs包含的文件
+FILES_${PN} = "\
+    ${bindir}/ \
+    "
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/fscheck/fscheck.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/fscheck/fscheck.bb
index 3513aff..61fb1e0 100755
--- a/cap/zx297520v3/sources/meta-zxic/recipes-app/fscheck/fscheck.bb
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/fscheck/fscheck.bb
@@ -1,6 +1,6 @@
 DESCRIPTION = "fscheck"
 
-DEPENDS     = "libnvram libmtd "
+DEPENDS     = "libnvram libmtd libflags"
 SECTION     = "app"
 LICENSE     = "zte"
 PV = "1.0.0"
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/fsmonitor/fsmonitor.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/fsmonitor/fsmonitor.bb
index 8f23fcd..32d209c 100755
--- a/cap/zx297520v3/sources/meta-zxic/recipes-app/fsmonitor/fsmonitor.bb
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/fsmonitor/fsmonitor.bb
@@ -1,5 +1,5 @@
 DESCRIPTION = "fsmonitor"
-DEPENDS     = ""
+DEPENDS     = "libflags"
 SECTION     = "app"
 LICENSE     = "zte"
 PV = "1.0.0"
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/libbinder/libbinder.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/libbinder/libbinder.bb
index 62078ae..7f384a9 100755
--- a/cap/zx297520v3/sources/meta-zxic/recipes-app/libbinder/libbinder.bb
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/libbinder/libbinder.bb
@@ -1,5 +1,5 @@
 DESCRIPTION = "libbinder"
-DEPENDS     = "libsclog"
+DEPENDS     = ""
 SECTION     = "lib"
 LICENSE     = "zte"
 PV          = "1.0.0"
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/libflags/libflags.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/libflags/libflags.bb
new file mode 100755
index 0000000..f04df7c
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/libflags/libflags.bb
@@ -0,0 +1,46 @@
+DESCRIPTION = "libflags"
+DEPENDS     = ""
+SECTION     = "lib"
+LICENSE     = "zte"
+PV          = "1.0.0"
+PR          = "r0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/zte;md5=c075689d1d1e06d4ab5bbe53623a6808"
+
+#配置code路径信息。
+FILESEXTRAPATHS_prepend :="${APP-OPEN-PATH}/platform:"
+SRC_URI = " \          
+		  file://libflags \
+          "
+
+S       = "${WORKDIR}"
+#引用公用头文件和编译选项。
+include ${BSPDIR}/sources/meta-zxic/conf/app_com.inc
+include ${BSPDIR}/sources/meta-zxic/conf/pub.inc
+
+CFLAGS_append = "${ZXIC_EXTRA_CFLAGS}"
+
+do_compile () {
+	make -C libflags
+}
+
+do_install () {
+	install -d ${D}${libdir}/
+	install -d ${D}/usr/include
+	install -m 0755 ${S}/libflags/libflags.so  ${D}${libdir}/
+	install -m 0755 ${S}/libflags/libflags.a   ${D}${libdir}/
+
+	#install elfs
+	install -d ${ELFS-PATH}/
+	install -m 0755 ${S}/libflags/libflags.so ${ELFS-PATH}/
+}
+
+#清库
+
+do_cleanlibs () {
+	rm -fr ${ELFS-PATH}/libflags.so
+}
+
+FILES_${PN}       += "${libdir}/*.so"
+FILES_${PN}-dbg   += "${libdir}/.debug"
+FILES_SOLIBSDEV   = ""
+INSANE_SKIP_${PN} = "dev-so"
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/libsclog/libsclog.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/libsclog/libsclog.bb
index bcb73f7..1d04e98 100755
--- a/cap/zx297520v3/sources/meta-zxic/recipes-app/libsclog/libsclog.bb
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/libsclog/libsclog.bb
@@ -1,5 +1,4 @@
 DESCRIPTION = "libsclog"

-DEPENDS     = "libnvram"

 SECTION     = "lib"

 LICENSE     = "zte"

 PV          = "1.0.0"

@@ -25,7 +24,6 @@
 do_install () {

 	install -d ${D}${libdir}/

 	install -d ${D}/usr/include

-	install -m 644 ${S}/libsclog/sc_log.h ${D}/usr/include

 	install -m 0755 ${S}/libsclog/libsclog.so  ${D}${libdir}/

 	install -m 0755 ${S}/libsclog/libsclog.a   ${D}${libdir}/

 	

diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/mnet-whitelist-proxy/mnet-whitelist-proxy.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/mnet-whitelist-proxy/mnet-whitelist-proxy.bb
new file mode 100755
index 0000000..7d0ce0c
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/mnet-whitelist-proxy/mnet-whitelist-proxy.bb
@@ -0,0 +1,74 @@
+DESCRIPTION = "mnet_whitelist_proxy"
+DEPENDS     = "libsoftap libsofttimer libnvram libatutils libscipc libsctel"
+SECTION     = "app"
+LICENSE     = "zte"
+PV = "1.0.0"
+PR = "r0"
+
+CLASS_COM = " \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'procd', 'openwrt openwrt-services', '', d)} \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd', '', d)} \
+"
+inherit ${CLASS_COM}
+
+#配置code路径信息。
+FILESEXTRAPATHS_prepend :="${APP-OPEN-PATH}/platform:"
+SRC_URI = " \
+    file://mnet_whitelist_proxy \
+    ${@bb.utils.contains("DISTRO_FEATURES", "procd", "file://mnet_whitelist_proxy.init","", d)} \
+    ${@bb.utils.contains("DISTRO_FEATURES", "systemd", "file://mnet_whitelist_proxy.service","", d)} \
+    ${@bb.utils.contains("DISTRO_FEATURES", "sysvinit", "file://mnet_whitelist_proxy.sysvinit","", d)} \
+    "
+
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/zte;md5=c075689d1d1e06d4ab5bbe53623a6808"
+S = "${WORKDIR}"
+
+#引用公用头文件和编译选项。
+include ${BSPDIR}/sources/meta-zxic/conf/app_com.inc
+
+#编译
+do_compile() {
+	make -C mnet_whitelist_proxy
+}
+
+#库文件的安装
+do_install() {
+	install -d ${D}${bindir}/
+	install -m 0755 ${S}/mnet_whitelist_proxy/mnet_whitelist_proxy ${D}${bindir}/
+
+	if ${@bb.utils.contains('DISTRO_FEATURES','procd','true','false',d)}; then
+		install -Dm 0755 ${WORKDIR}/mnet_whitelist_proxy.init ${D}${sysconfdir}/init.d/mnet_whitelist_proxy
+	fi
+
+	if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
+		install -d ${D}${systemd_unitdir}/system
+		install -m 0644 ${WORKDIR}/mnet_whitelist_proxy.service ${D}${systemd_unitdir}/system
+	fi
+
+	if ${@bb.utils.contains('DISTRO_FEATURES','sysvinit','true','false',d)}; then
+		install -Dm 0755 ${WORKDIR}/mnet_whitelist_proxy.sysvinit ${D}${sysconfdir}/init.d/mnet_whitelist_proxy
+		install -d ${D}${sysconfdir}/rcS.d
+		ln -s ../init.d/mnet_whitelist_proxy ${D}${sysconfdir}/rcS.d/S18mnet_whitelist_proxy
+	fi
+
+	#install elfs
+	install -d ${ELFS-PATH}/
+	install -m 0755 ${S}/mnet_whitelist_proxy/mnet_whitelist_proxy ${ELFS-PATH}/
+}
+#清库
+do_cleanlibs () {
+	rm -fr ${ELFS-PATH}/mnet_whitelist_proxy
+}
+
+addtask  cleanlibs after do_clean  before do_cleansstate
+
+#rootfs包含的文件
+FILES_${PN} = "\
+    ${bindir}/ \
+    ${@bb.utils.contains("DISTRO_FEATURES", "procd", "${sysconfdir}/","", d)} \
+    ${@bb.utils.contains("DISTRO_FEATURES", "sysvinit", "${sysconfdir}/","", d)} \
+    "
+SYSTEMD_SERVICE_${PN}     = "mnet_whitelist_proxy.service"
+SYSTEMD_AUTO_ENABLE_${PN} = "enable"
+
+RDEPENDS_${PN} = " libsoftap libsofttimer libnvram libatutils libscipc libsctel"
\ No newline at end of file
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/mnet-whitelist-proxy/mnet-whitelist-proxy/mnet_whitelist_proxy.init b/cap/zx297520v3/sources/meta-zxic/recipes-app/mnet-whitelist-proxy/mnet-whitelist-proxy/mnet_whitelist_proxy.init
new file mode 100755
index 0000000..4716642
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/mnet-whitelist-proxy/mnet-whitelist-proxy/mnet_whitelist_proxy.init
@@ -0,0 +1,17 @@
+#!/bin/sh /etc/rc.common
+
+START=18
+STOP=85
+USE_PROCD=1
+
+start_service() {
+	procd_open_instance
+	procd_set_param command /usr/bin/mnet_whitelist_proxy
+	procd_set_param respawn
+	procd_close_instance
+}
+
+stop_service() 
+{
+	echo "add clean code"
+}
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/mnet-whitelist-proxy/mnet-whitelist-proxy/mnet_whitelist_proxy.service b/cap/zx297520v3/sources/meta-zxic/recipes-app/mnet-whitelist-proxy/mnet-whitelist-proxy/mnet_whitelist_proxy.service
new file mode 100755
index 0000000..94838f0
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/mnet-whitelist-proxy/mnet-whitelist-proxy/mnet_whitelist_proxy.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=The mnet_whitelist_proxy service
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/mnet_whitelist_proxy
+Restart=always
+
+[Install]
+WantedBy=basic.target
+
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/mnet-whitelist-proxy/mnet-whitelist-proxy/mnet_whitelist_proxy.sysvinit b/cap/zx297520v3/sources/meta-zxic/recipes-app/mnet-whitelist-proxy/mnet-whitelist-proxy/mnet_whitelist_proxy.sysvinit
new file mode 100755
index 0000000..54a56a5
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/mnet-whitelist-proxy/mnet-whitelist-proxy/mnet_whitelist_proxy.sysvinit
@@ -0,0 +1,36 @@
+#!/bin/sh
+#
+# Run the daemon
+#
+
+DAEMON="mnet_whitelist_proxy"
+PIDFILE="/var/run/$DAEMON.pid"
+EXEC="/usr/bin/mnet_whitelist_proxy"
+
+start() {
+	echo -n "Starting $DAEMON... "	
+	start-stop-daemon --no-close -S -b -m -p $PIDFILE -x $EXEC
+	[ $? -eq 0 ] && echo "OK" || echo "ERROR"
+}
+
+stop() {
+	echo -n "Stopping $DAEMON... "
+	start-stop-daemon -K -p $PIDFILE
+	[ $? -eq 0 ] && echo "OK" || echo "ERROR"
+}
+
+restart() {
+	stop
+	start
+}
+
+case "$1" in
+  start|stop|restart)
+	"$1"
+	;;
+  *)
+	echo "Usage: $0 {start|stop|restart}"
+	exit 1
+esac
+
+exit $?
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/nvserver/nvserver.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/nvserver/nvserver.bb
index a11eab1..585ea3c 100755
--- a/cap/zx297520v3/sources/meta-zxic/recipes-app/nvserver/nvserver.bb
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/nvserver/nvserver.bb
@@ -1,6 +1,6 @@
 DESCRIPTION = "nvserver"
 #nvserver依赖libnvram库
-DEPENDS     = "libmtd libnvram libsofttimer libsoftap libupi-ab"
+DEPENDS     = "libmtd libnvram libflags"
 SECTION     = "app"
 LICENSE     = "zte"
 PV = "1.0.0"
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/sc-shm-test/sc-shm-test.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/sc-shm-test/sc-shm-test.bb
index 30b1f5b..7cbecee 100755
--- a/cap/zx297520v3/sources/meta-zxic/recipes-app/sc-shm-test/sc-shm-test.bb
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/sc-shm-test/sc-shm-test.bb
@@ -27,10 +27,19 @@
 do_install() {

 	install -d ${D}${bindir}/

 	install -m 0777 ${S}/sc_shm_test/sc_shm_test ${D}${bindir}/

-

+        install -m 0777 ${S}/sc_shm_test/sc_shm_read ${D}${bindir}/

+        install -m 0777 ${S}/sc_shm_test/sc_shm_write ${D}${bindir}/

+        install -m 0777 ${S}/sc_shm_test/sc_shm_posix ${D}${bindir}/

+        install -m 0777 ${S}/sc_shm_test/sc_posix_read ${D}${bindir}/

+        install -m 0777 ${S}/sc_shm_test/sc_posix_write ${D}${bindir}/

 	#install elfs

 	install -d ${ELFS-PATH}/

 	install -m 0755 ${S}/sc_shm_test/sc_shm_test ${ELFS-PATH}/

+        install -m 0755 ${S}/sc_shm_test/sc_shm_read ${ELFS-PATH}/

+        install -m 0755 ${S}/sc_shm_test/sc_shm_write ${ELFS-PATH}/

+        install -m 0777 ${S}/sc_shm_test/sc_shm_posix ${ELFS-PATH}/

+        install -m 0777 ${S}/sc_shm_test/sc_posix_read ${ELFS-PATH}/

+        install -m 0777 ${S}/sc_shm_test/sc_posix_write ${ELFS-PATH}/

 }

 

 do_cleanlibs () {

diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/service-test/service-test.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/service-test/service-test.bb
new file mode 100755
index 0000000..55b48ce
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/service-test/service-test.bb
@@ -0,0 +1,78 @@
+DESCRIPTION = "service_test"
+DEPENDS     = "libbinder"
+SECTION     = "app"
+LICENSE     = "zte"
+PV = "1.0.0"
+PR = "r0"
+
+CLASS_COM = " \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'procd', 'openwrt openwrt-services', '', d)} \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd', '', d)} \
+"
+inherit ${CLASS_COM}
+
+FILESEXTRAPATHS_prepend :="${APP-OPEN-PATH}/test:"
+SRC_URI = " \
+    file://service_test \	
+	${@bb.utils.contains("DISTRO_FEATURES", "procd", "file://test_binder_server.init","", d)} \
+    ${@bb.utils.contains("DISTRO_FEATURES", "systemd", "file://test_binder_server.service","", d)} \	
+	${@bb.utils.contains("DISTRO_FEATURES", "sysvinit", "file://test_binder_server.sysvinit","", d)} \
+    "
+
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/zte;md5=c075689d1d1e06d4ab5bbe53623a6808"
+S = "${WORKDIR}"
+
+#引用公用头文件和编译选项。
+include ${BSPDIR}/sources/meta-zxic/conf/app_com.inc
+
+#编译
+do_compile() {
+	make -C service_test
+}
+
+#库文件的安装
+do_install() {
+	install -d ${D}${bindir}/
+	install -m 0755 ${S}/service_test/test_binder_client ${D}${bindir}/
+	install -m 0755 ${S}/service_test/test_binder_server ${D}${bindir}/
+
+	if ${@bb.utils.contains('DISTRO_FEATURES','procd','true','false',d)}; then
+		install -Dm 0755 ${WORKDIR}/test_binder_server.init ${D}${sysconfdir}/init.d/test_binder_server
+	fi
+
+	if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
+		install -d ${D}${systemd_unitdir}/system
+		install -m 0644 ${WORKDIR}/test_binder_server.service ${D}${systemd_unitdir}/system
+	fi
+	
+	if ${@bb.utils.contains('DISTRO_FEATURES','sysvinit','true','false',d)}; then
+		install -Dm 0755 ${WORKDIR}/test_binder_server.sysvinit ${D}${sysconfdir}/init.d/test_binder_server
+		install -d ${D}${sysconfdir}/rcS.d
+		ln -s ../init.d/test_binder_server ${D}${sysconfdir}/rcS.d
+		#/S22test_binder_server
+	fi
+	
+	#install elfs
+	install -d ${ELFS-PATH}/
+	install -m 0755 ${S}/service_test/test_binder_client ${ELFS-PATH}/
+	install -m 0755 ${S}/service_test/test_binder_server ${ELFS-PATH}/
+}
+#清库
+do_cleanlibs () {
+	rm -fr ${ELFS-PATH}/test_binder_client
+	rm -fr ${ELFS-PATH}/test_binder_server
+}
+
+addtask  cleanlibs after do_clean  before do_cleansstate
+
+#rootfs包含的文件
+FILES_${PN} = "\
+    ${bindir}/ \
+	${@bb.utils.contains("DISTRO_FEATURES", "procd", "${sysconfdir}/init.d/test_binder_server","", d)} \
+	${@bb.utils.contains("DISTRO_FEATURES", "sysvinit", "${sysconfdir}/","", d)} \
+    "
+	
+SYSTEMD_SERVICE_${PN}     = "test_binder_server.service"
+SYSTEMD_AUTO_ENABLE_${PN} = "enable"
+
+RDEPENDS_${PN} = "libbinder"
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/service-test/service-test/test_binder_server.init b/cap/zx297520v3/sources/meta-zxic/recipes-app/service-test/service-test/test_binder_server.init
new file mode 100755
index 0000000..cb2b50d
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/service-test/service-test/test_binder_server.init
@@ -0,0 +1,19 @@
+#!/bin/sh /etc/rc.common
+
+START=16
+STOP=85
+USE_PROCD=1
+
+start_service() {
+	procd_open_instance
+	procd_set_param command /usr/bin/test_binder_server
+	procd_set_param stdout 0  # forward stdout of the command to logd
+	procd_set_param stderr 0  # same for stderr
+	procd_set_param respawn
+	procd_close_instance
+}
+
+stop_service() 
+{
+	echo "add clean code"
+}
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/service-test/service-test/test_binder_server.service b/cap/zx297520v3/sources/meta-zxic/recipes-app/service-test/service-test/test_binder_server.service
new file mode 100755
index 0000000..e147dbe
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/service-test/service-test/test_binder_server.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=The test_binder_server service
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/test_binder_server
+Restart=always
+
+[Install]
+WantedBy=basic.target
+
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/service-test/service-test/test_binder_server.sysvinit b/cap/zx297520v3/sources/meta-zxic/recipes-app/service-test/service-test/test_binder_server.sysvinit
new file mode 100755
index 0000000..82a7c84
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/service-test/service-test/test_binder_server.sysvinit
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# Run the daemon
+#
+
+DAEMON="test_binder_server"
+PIDFILE="/var/run/$DAEMON.pid"
+EXEC="/usr/bin/test_binder_server"
+EXEC_ARGS=""
+
+
+start() {
+	echo -n "Starting $DAEMON... "
+	start-stop-daemon --no-close -S -b -m -p $PIDFILE -x $EXEC -- $EXEC_ARGS
+	[ $? -eq 0 ] && echo "OK" || echo "ERROR"
+}
+
+stop() {
+	echo -n "Stopping $DAEMON... "
+	start-stop-daemon -K -p $PIDFILE
+	[ $? -eq 0 ] && echo "OK" || echo "ERROR"
+}
+
+restart() {
+	stop
+	start
+}
+
+case "$1" in
+  start|stop|restart)
+	"$1"
+	;;
+  *)
+	echo "Usage: $0 {start|stop|restart}"
+	exit 1
+esac
+
+exit $?
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/service/service.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/service/service.bb
new file mode 100755
index 0000000..d5aa32f
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/service/service.bb
@@ -0,0 +1,46 @@
+DESCRIPTION = "service"
+DEPENDS     = "libbinder"
+SECTION     = "app"
+LICENSE     = "zte"
+PV = "1.0.0"
+PR = "r0"
+
+#配置code路径信息。
+FILESEXTRAPATHS_prepend :="${APP-OPEN-PATH}/test:"
+SRC_URI = " \
+    file://service \
+    "
+
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/zte;md5=c075689d1d1e06d4ab5bbe53623a6808"
+S = "${WORKDIR}"
+
+#引用公用头文件和编译选项。
+include ${BSPDIR}/sources/meta-zxic/conf/app_com.inc
+
+#编译
+do_compile() {
+	make -C service
+}
+
+#库文件的安装
+do_install() {
+	install -d ${D}${bindir}/
+	install -m 0755 ${S}/service/service ${D}${bindir}/
+	
+	#install elfs
+	install -d ${ELFS-PATH}/
+	install -m 0755 ${S}/service/service ${ELFS-PATH}/	
+}
+#清库
+do_cleanlibs () {
+	rm -fr ${ELFS-PATH}/service
+}
+
+addtask  cleanlibs after do_clean  before do_cleansstate
+
+#rootfs包含的文件
+FILES_${PN} = "\
+    ${bindir}/ \
+    "
+
+RDEPENDS_${PN} = "libbinder"
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/servicemanage/servicemanager.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/servicemanage/servicemanager.bb
new file mode 100755
index 0000000..6884753
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/servicemanage/servicemanager.bb
@@ -0,0 +1,80 @@
+DESCRIPTION = "servicemanager"
+DEPENDS     = "libbinder"
+SECTION     = "app"
+LICENSE     = "zte"
+PV = "1.0.0"
+PR = "r0"
+
+CLASS_COM = " \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'procd', 'openwrt openwrt-services', '', d)} \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd', '', d)} \
+"
+inherit ${CLASS_COM}
+
+#配置code路径信息。
+FILESEXTRAPATHS_prepend :="${APP-OPEN-PATH}/test:"
+SRC_URI = " \
+    file://servicemanager \
+	${@bb.utils.contains("DISTRO_FEATURES", "procd", "file://servicemanager.init","", d)} \
+    ${@bb.utils.contains("DISTRO_FEATURES", "systemd", "file://servicemanager.service","", d)} \
+	${@bb.utils.contains("DISTRO_FEATURES", "sysvinit", "file://servicemanager.sysvinit","", d)} \
+    "
+
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/zte;md5=c075689d1d1e06d4ab5bbe53623a6808"
+S = "${WORKDIR}"
+
+#引用公用头文件和编译选项。
+include ${BSPDIR}/sources/meta-zxic/conf/app_com.inc
+
+#编译
+do_compile() {
+	make -C servicemanager
+}
+
+#库文件的安装
+do_install() {
+	install -d ${D}${bindir}/
+	install -m 0755 ${S}/servicemanager/servicemanager ${D}${bindir}/
+	
+	if ${@bb.utils.contains('DISTRO_FEATURES','procd','true','false',d)}; then
+		install -Dm 0755 ${WORKDIR}/servicemanager.init ${D}${sysconfdir}/init.d/servicemanager
+	fi
+
+	if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
+		install -d ${D}${systemd_unitdir}/system
+		install -m 0644 ${WORKDIR}/servicemanager.service ${D}${systemd_unitdir}/system
+	fi
+	
+	if ${@bb.utils.contains('DISTRO_FEATURES','sysvinit','true','false',d)}; then
+		install -Dm 0755 ${WORKDIR}/servicemanager.sysvinit ${D}${sysconfdir}/init.d/servicemanager
+		install -d ${D}${sysconfdir}/rcS.d
+		ln -s ../init.d/servicemanager ${D}${sysconfdir}/rcS.d
+		#/S22servicemanager
+	fi
+	
+	#install elfs
+	install -d ${ELFS-PATH}/
+	install -m 0755 ${S}/servicemanager/servicemanager ${ELFS-PATH}/
+}
+#清库
+do_cleanlibs () {
+	rm -fr ${ELFS-PATH}/servicemanager	
+}
+
+addtask  cleanlibs after do_clean  before do_cleansstate
+
+#rootfs包含的文件
+FILES_${PN} = "\
+    ${bindir}/ \
+    "
+
+#rootfs包含的文件
+FILES_${PN} = "\
+    ${bindir}/ \
+    ${@bb.utils.contains("DISTRO_FEATURES", "procd", "${sysconfdir}/init.d/servicemanager","", d)} \
+	${@bb.utils.contains("DISTRO_FEATURES", "sysvinit", "${sysconfdir}/","", d)} \
+    "
+SYSTEMD_SERVICE_${PN}     = "servicemanager.service"
+SYSTEMD_AUTO_ENABLE_${PN} = "enable"
+
+RDEPENDS_${PN} = "libbinder"
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/servicemanage/servicemanager/servicemanager.init b/cap/zx297520v3/sources/meta-zxic/recipes-app/servicemanage/servicemanager/servicemanager.init
new file mode 100755
index 0000000..380582b
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/servicemanage/servicemanager/servicemanager.init
@@ -0,0 +1,19 @@
+#!/bin/sh /etc/rc.common
+
+START=16
+STOP=85
+USE_PROCD=1
+
+start_service() {
+	procd_open_instance
+	procd_set_param command /usr/bin/servicemanager
+	procd_set_param stdout 0  # forward stdout of the command to logd
+	procd_set_param stderr 0  # same for stderr
+	procd_set_param respawn
+	procd_close_instance
+}
+
+stop_service() 
+{
+	echo "add clean code"
+}
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/servicemanage/servicemanager/servicemanager.service b/cap/zx297520v3/sources/meta-zxic/recipes-app/servicemanage/servicemanager/servicemanager.service
new file mode 100755
index 0000000..def21db
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/servicemanage/servicemanager/servicemanager.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=The servicemanager service
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/servicemanager
+Restart=always
+
+[Install]
+WantedBy=basic.target
+
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/servicemanage/servicemanager/servicemanager.sysvinit b/cap/zx297520v3/sources/meta-zxic/recipes-app/servicemanage/servicemanager/servicemanager.sysvinit
new file mode 100755
index 0000000..0264b16
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/servicemanage/servicemanager/servicemanager.sysvinit
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# Run the daemon
+#
+
+DAEMON="servicemanager"
+PIDFILE="/var/run/$DAEMON.pid"
+EXEC="/usr/bin/servicemanager"
+EXEC_ARGS=""
+
+
+start() {
+	echo -n "Starting $DAEMON... "
+	start-stop-daemon --no-close -S -b -m -p $PIDFILE -x $EXEC -- $EXEC_ARGS
+	[ $? -eq 0 ] && echo "OK" || echo "ERROR"
+}
+
+stop() {
+	echo -n "Stopping $DAEMON... "
+	start-stop-daemon -K -p $PIDFILE
+	[ $? -eq 0 ] && echo "OK" || echo "ERROR"
+}
+
+restart() {
+	stop
+	start
+}
+
+case "$1" in
+  start|stop|restart)
+	"$1"
+	;;
+  *)
+	echo "Usage: $0 {start|stop|restart}"
+	exit 1
+esac
+
+exit $?
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/socket-demo/socket-demo.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/socket-demo/socket-demo.bb
new file mode 100755
index 0000000..59a548c
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/socket-demo/socket-demo.bb
@@ -0,0 +1,64 @@
+DESCRIPTION = "socket_demo"
+DEPENDS     = ""
+SECTION     = "app"
+LICENSE     = "zte"
+PV = "1.0.0"
+PR = "r0"
+
+CLASS_COM = " \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'procd', 'openwrt openwrt-services', '', d)} \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd', '', d)} \
+"
+inherit ${CLASS_COM}
+
+#配置code路径信息。
+FILESEXTRAPATHS_prepend :="${APP-OPEN-PATH}:"
+SRC_URI = " \
+          file://test/socket_demo \		  
+		  ${@bb.utils.contains("DISTRO_FEATURES", "procd", "file://socket_demo.init","", d)} \
+		  ${@bb.utils.contains("DISTRO_FEATURES", "systemd", "file://socket_demo.service","", d)} \
+          "
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/zte;md5=c075689d1d1e06d4ab5bbe53623a6808"
+S = "${WORKDIR}"
+S_SRC_PATH = "${S}/test/socket_demo"
+#引用公用头文件和编译选项。
+include ${BSPDIR}/sources/meta-zxic/conf/app_com.inc
+
+#inherit autotools pkgconfig systemd
+
+do_compile() {
+	make -C ${S_SRC_PATH}
+}
+
+do_install () {
+	install -d ${D}${bindir}/
+	install -m 0755 ${S_SRC_PATH}/socket_demo ${D}${bindir}/
+	
+	if ${@bb.utils.contains('DISTRO_FEATURES','procd','true','false',d)}; then
+		install -Dm 0755 ${WORKDIR}/socket_demo.init ${D}${sysconfdir}/init.d/socket_demo
+	fi
+
+	if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
+		install -d ${D}${systemd_unitdir}/system
+		install -m 0644 ${WORKDIR}/socket_demo.service ${D}${systemd_unitdir}/system
+	fi
+	
+	#install elfs
+	install -d ${ELFS-PATH}/
+	install -m 0755 ${S_SRC_PATH}/socket_demo ${ELFS-PATH}/	
+}
+
+do_cleanlibs () {
+	rm -fr ${ELFS-PATH}/socket_demo
+}
+
+addtask  cleanlibs after do_clean  before do_cleansstate
+
+FILES_${PN} = "\
+    ${bindir}/ \
+    ${@bb.utils.contains("DISTRO_FEATURES", "procd", "${sysconfdir}/init.d/socket_demo","", d)} \
+    "
+SYSTEMD_SERVICE_${PN}     = "socket_demo.service"
+SYSTEMD_AUTO_ENABLE_${PN} = "disable"
+
+RDEPENDS_${PN} = ""
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/socket-demo/socket_demo/socket_demo.init b/cap/zx297520v3/sources/meta-zxic/recipes-app/socket-demo/socket_demo/socket_demo.init
new file mode 100755
index 0000000..52ecbf8
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/socket-demo/socket_demo/socket_demo.init
@@ -0,0 +1,21 @@
+#!/bin/sh /etc/rc.common
+
+START=18
+STOP=85
+USE_PROCD=1
+
+logger -t socket_demo
+
+start_service() {
+	procd_open_instance
+	procd_set_param command /usr/bin/socket_demo
+	procd_set_param stdout 1  # forward stdout of the command to logd
+	procd_set_param stderr 1  # same for stderr
+	procd_set_param respawn
+	procd_close_instance
+}
+
+stop_service() 
+{
+	echo "add clean code"
+}
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/socket-demo/socket_demo/socket_demo.service b/cap/zx297520v3/sources/meta-zxic/recipes-app/socket-demo/socket_demo/socket_demo.service
new file mode 100755
index 0000000..0962986
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/socket-demo/socket_demo/socket_demo.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=The socket_demo service
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/socket_demo
+Restart=always
+
+[Install]
+WantedBy=basic.target
+
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/wifi-demo/wifi-demo.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/wifi-demo/wifi-demo.bb
new file mode 100755
index 0000000..a7045df
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/wifi-demo/wifi-demo.bb
@@ -0,0 +1,50 @@
+DESCRIPTION = "wifi_demo"
+DEPENDS     = "libsctel"
+SECTION     = "app"
+LICENSE     = "zte"
+PV = "1.0.0"
+PR = "r0"
+
+CLASS_COM = " \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'procd', 'openwrt openwrt-services', '', d)} \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd', '', d)} \
+"
+inherit ${CLASS_COM}
+
+#配置code路径信息。
+FILESEXTRAPATHS_prepend :="${APP-OPEN-PATH}/test:"
+SRC_URI = " \
+    file://wifi_demo \		  
+    "
+
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/zte;md5=c075689d1d1e06d4ab5bbe53623a6808"
+S = "${WORKDIR}"
+
+#引用公用头文件和编译选项。
+include ${BSPDIR}/sources/meta-zxic/conf/app_com.inc
+
+
+do_compile() {
+	make -C wifi_demo
+}
+
+do_install () {
+	install -d ${D}${bindir}/
+	install -m 0755 ${S}/wifi_demo/wifi_demo ${D}${bindir}/
+	
+	#install elfs
+	install -d ${ELFS-PATH}/
+	install -m 0755 ${S}/wifi_demo/wifi_demo ${ELFS-PATH}/	
+}
+
+do_cleanlibs () {
+	rm -fr ${ELFS-PATH}/wifi_demo
+}
+
+addtask  cleanlibs after do_clean  before do_cleansstate
+
+FILES_${PN} = "\
+    ${bindir}/ \
+    "
+
+RDEPENDS_${PN} = " libsctel"
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/wlan-proxy/wlan-proxy.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/wlan-proxy/wlan-proxy.bb
new file mode 100755
index 0000000..7656be8
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/wlan-proxy/wlan-proxy.bb
@@ -0,0 +1,74 @@
+DESCRIPTION = "wlan_proxy"
+DEPENDS     = "libsoftap libsofttimer libnvram libatutils libscipc libsctel"
+SECTION     = "app"
+LICENSE     = "zte"
+PV = "1.0.0"
+PR = "r0"
+
+CLASS_COM = " \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'procd', 'openwrt openwrt-services', '', d)} \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd', '', d)} \
+"
+inherit ${CLASS_COM}
+
+#配置code路径信息。
+FILESEXTRAPATHS_prepend :="${APP-OPEN-PATH}/platform:"
+SRC_URI = " \
+    file://wlan_proxy \
+    ${@bb.utils.contains("DISTRO_FEATURES", "procd", "file://wlan_proxy.init","", d)} \
+    ${@bb.utils.contains("DISTRO_FEATURES", "systemd", "file://wlan_proxy.service","", d)} \
+    ${@bb.utils.contains("DISTRO_FEATURES", "sysvinit", "file://wlan_proxy.sysvinit","", d)} \
+    "
+
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/zte;md5=c075689d1d1e06d4ab5bbe53623a6808"
+S = "${WORKDIR}"
+
+#引用公用头文件和编译选项。
+include ${BSPDIR}/sources/meta-zxic/conf/app_com.inc
+
+#编译
+do_compile() {
+	make -C wlan_proxy
+}
+
+#库文件的安装
+do_install() {
+	install -d ${D}${bindir}/
+	install -m 0755 ${S}/wlan_proxy/wlan_proxy ${D}${bindir}/
+
+	if ${@bb.utils.contains('DISTRO_FEATURES','procd','true','false',d)}; then
+		install -Dm 0755 ${WORKDIR}/wlan_proxy.init ${D}${sysconfdir}/init.d/wlan_proxy
+	fi
+
+	if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
+		install -d ${D}${systemd_unitdir}/system
+		install -m 0644 ${WORKDIR}/wlan_proxy.service ${D}${systemd_unitdir}/system
+	fi
+
+	if ${@bb.utils.contains('DISTRO_FEATURES','sysvinit','true','false',d)}; then
+		install -Dm 0755 ${WORKDIR}/wlan_proxy.sysvinit ${D}${sysconfdir}/init.d/wlan_proxy
+		install -d ${D}${sysconfdir}/rcS.d
+		ln -s ../init.d/wlan_proxy ${D}${sysconfdir}/rcS.d/S18wlan_proxy
+	fi
+
+	#install elfs
+	install -d ${ELFS-PATH}/
+	install -m 0755 ${S}/wlan_proxy/wlan_proxy ${ELFS-PATH}/
+}
+#清库
+do_cleanlibs () {
+	rm -fr ${ELFS-PATH}/wlan_proxy
+}
+
+addtask  cleanlibs after do_clean  before do_cleansstate
+
+#rootfs包含的文件
+FILES_${PN} = "\
+    ${bindir}/ \
+    ${@bb.utils.contains("DISTRO_FEATURES", "procd", "${sysconfdir}/","", d)} \
+    ${@bb.utils.contains("DISTRO_FEATURES", "sysvinit", "${sysconfdir}/","", d)} \
+    "
+SYSTEMD_SERVICE_${PN}     = "wlan_proxy.service"
+SYSTEMD_AUTO_ENABLE_${PN} = "enable"
+
+RDEPENDS_${PN} = " libsoftap libsofttimer libnvram libatutils libscipc libsctel"
\ No newline at end of file
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/wlan-proxy/wlan-proxy/wlan_proxy.init b/cap/zx297520v3/sources/meta-zxic/recipes-app/wlan-proxy/wlan-proxy/wlan_proxy.init
new file mode 100755
index 0000000..730e6c1
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/wlan-proxy/wlan-proxy/wlan_proxy.init
@@ -0,0 +1,17 @@
+#!/bin/sh /etc/rc.common
+
+START=18
+STOP=85
+USE_PROCD=1
+
+start_service() {
+	procd_open_instance
+	procd_set_param command /usr/bin/wlan_proxy
+	procd_set_param respawn
+	procd_close_instance
+}
+
+stop_service() 
+{
+	echo "add clean code"
+}
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/wlan-proxy/wlan-proxy/wlan_proxy.service b/cap/zx297520v3/sources/meta-zxic/recipes-app/wlan-proxy/wlan-proxy/wlan_proxy.service
new file mode 100755
index 0000000..dcc8fdb
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/wlan-proxy/wlan-proxy/wlan_proxy.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=The wlan_proxy service
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/wlan_proxy
+Restart=always
+
+[Install]
+WantedBy=basic.target
+
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/wlan-proxy/wlan-proxy/wlan_proxy.sysvinit b/cap/zx297520v3/sources/meta-zxic/recipes-app/wlan-proxy/wlan-proxy/wlan_proxy.sysvinit
new file mode 100755
index 0000000..bf09fe5
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/wlan-proxy/wlan-proxy/wlan_proxy.sysvinit
@@ -0,0 +1,36 @@
+#!/bin/sh
+#
+# Run the daemon
+#
+
+DAEMON="wlan_proxy"
+PIDFILE="/var/run/$DAEMON.pid"
+EXEC="/usr/bin/wlan_proxy"
+
+start() {
+	echo -n "Starting $DAEMON... "	
+	start-stop-daemon --no-close -S -b -m -p $PIDFILE -x $EXEC
+	[ $? -eq 0 ] && echo "OK" || echo "ERROR"
+}
+
+stop() {
+	echo -n "Stopping $DAEMON... "
+	start-stop-daemon -K -p $PIDFILE
+	[ $? -eq 0 ] && echo "OK" || echo "ERROR"
+}
+
+restart() {
+	stop
+	start
+}
+
+case "$1" in
+  start|stop|restart)
+	"$1"
+	;;
+  *)
+	echo "Usage: $0 {start|stop|restart}"
+	exit 1
+esac
+
+exit $?
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/zxic-mmi/zxic-mmi.bb b/cap/zx297520v3/sources/meta-zxic/recipes-app/zxic-mmi/zxic-mmi.bb
new file mode 100755
index 0000000..54d823c
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/zxic-mmi/zxic-mmi.bb
@@ -0,0 +1,74 @@
+DESCRIPTION = "zxic_mmi"
+DEPENDS     = "libnvram libsofttimer libatutils libsoftap openssl"
+SECTION     = "app"
+LICENSE     = "zte"
+PV = "1.0.0"
+PR = "r0"
+
+CLASS_COM = " \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'procd', 'openwrt openwrt-services', '', d)} \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd', '', d)} \
+"
+inherit ${CLASS_COM}
+
+#配置code路径信息。
+FILESEXTRAPATHS_prepend :="${APP-OPEN-PATH}/platform:"
+SRC_URI = " \
+          file://zxic_mmi \
+		  ${@bb.utils.contains("DISTRO_FEATURES", "procd", "file://zxic_mmi.init","", d)} \
+		  ${@bb.utils.contains("DISTRO_FEATURES", "systemd", "file://zxic_mmi.service","", d)} \
+		  ${@bb.utils.contains("DISTRO_FEATURES", "sysvinit", "file://zxic_mmi.sysvinit","", d)} \
+          "
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/zte;md5=c075689d1d1e06d4ab5bbe53623a6808"
+S = "${WORKDIR}"
+S_SRC_PATH = "${S}/zxic_mmi"
+#引用公用头文件和编译选项。
+include ${BSPDIR}/sources/meta-zxic/conf/app_com.inc
+
+#inherit autotools pkgconfig systemd
+
+do_compile() {
+	#echo "TOPDIR = ${TOPDIR}"
+	
+	make -C ${S_SRC_PATH}  CONFIG_MMI_LCD=${CONFIG_MMI_LCD}
+}
+
+do_install () {
+	install -d ${D}${bindir}/
+	install -m 0755 ${S_SRC_PATH}/zxic_mmi ${D}${bindir}/
+	
+	if ${@bb.utils.contains('DISTRO_FEATURES','procd','true','false',d)}; then
+		install -Dm 0755 ${WORKDIR}/zxic_mmi.init ${D}${sysconfdir}/init.d/zxic_mmi
+	fi
+
+	if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
+		install -d ${D}${systemd_unitdir}/system
+		install -m 0644 ${WORKDIR}/zxic_mmi.service ${D}${systemd_unitdir}/system
+	fi
+	
+	if ${@bb.utils.contains('DISTRO_FEATURES','sysvinit','true','false',d)}; then
+		install -Dm 0755 ${WORKDIR}/zxic_mmi.sysvinit ${D}${sysconfdir}/init.d/zxic_mmi
+		install -d ${D}${sysconfdir}/rcS.d
+		ln -s ../init.d/zxic_mmi ${D}${sysconfdir}/rcS.d/S40zxic_mmi
+	fi
+
+	#install elfs
+	install -d ${ELFS-PATH}/
+	install -m 0755 ${S_SRC_PATH}/zxic_mmi ${ELFS-PATH}/
+}
+
+do_cleanlibs () {
+	rm -fr ${ELFS-PATH}/zxic_mmi
+}
+
+addtask  cleanlibs after do_clean  before do_cleansstate
+
+FILES_${PN} = "\
+    ${bindir}/ \
+    ${@bb.utils.contains("DISTRO_FEATURES", "procd", "${sysconfdir}/init.d/zxic_mmi","", d)} \
+    ${@bb.utils.contains("DISTRO_FEATURES", "sysvinit", "${sysconfdir}/","", d)} \
+    "
+SYSTEMD_SERVICE_${PN}     = "zxic_mmi.service"
+SYSTEMD_AUTO_ENABLE_${PN} = "enable"
+
+RDEPENDS_${PN} = " libnvram libsofttimer libatutils libsoftap openssl"
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/zxic-mmi/zxic-mmi/zxic_mmi.init b/cap/zx297520v3/sources/meta-zxic/recipes-app/zxic-mmi/zxic-mmi/zxic_mmi.init
new file mode 100755
index 0000000..24e294a
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/zxic-mmi/zxic-mmi/zxic_mmi.init
@@ -0,0 +1,21 @@
+#!/bin/sh /etc/rc.common
+
+START=40
+STOP=85
+USE_PROCD=1
+
+logger -t zxic_mmi
+
+start_service() {
+	procd_open_instance
+	procd_set_param command /usr/bin/zxic_mmi
+	procd_set_param stdout 0  # forward stdout of the command to logd
+	procd_set_param stderr 0  # same for stderr
+	procd_set_param respawn
+	procd_close_instance
+}
+
+stop_service() 
+{
+	echo "add clean code"
+}
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/zxic-mmi/zxic-mmi/zxic_mmi.service b/cap/zx297520v3/sources/meta-zxic/recipes-app/zxic-mmi/zxic-mmi/zxic_mmi.service
new file mode 100755
index 0000000..f9a459b
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/zxic-mmi/zxic-mmi/zxic_mmi.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=The zxic_mmi service
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/zxic_mmi
+Restart=always
+
+[Install]
+WantedBy=basic.target
+
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-app/zxic-mmi/zxic-mmi/zxic_mmi.sysvinit b/cap/zx297520v3/sources/meta-zxic/recipes-app/zxic-mmi/zxic-mmi/zxic_mmi.sysvinit
new file mode 100755
index 0000000..88df652
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-app/zxic-mmi/zxic-mmi/zxic_mmi.sysvinit
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# Run the daemon
+#
+
+DAEMON="zxic_mmi"
+PIDFILE="/var/run/$DAEMON.pid"
+EXEC="/usr/bin/zxic_mmi"
+EXEC_ARGS=""
+
+
+start() {
+	echo -n "Starting $DAEMON... "
+	start-stop-daemon --no-close -S -b -m -p $PIDFILE -x $EXEC -- $EXEC_ARGS
+	[ $? -eq 0 ] && echo "OK" || echo "ERROR"
+}
+
+stop() {
+	echo -n "Stopping $DAEMON... "
+	start-stop-daemon -K -p $PIDFILE
+	[ $? -eq 0 ] && echo "OK" || echo "ERROR"
+}
+
+restart() {
+	stop
+	start
+}
+
+case "$1" in
+  start|stop|restart)
+	"$1"
+	;;
+  *)
+	echo "Usage: $0 {start|stop|restart}"
+	exit 1
+esac
+
+exit $?
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/files/zx297520v3/linux-5_10-vehicle_dc-normal-defconfig b/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/files/zx297520v3/linux-5_10-vehicle_dc-normal-defconfig
index b4e0dd7..f239730 100755
--- a/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/files/zx297520v3/linux-5_10-vehicle_dc-normal-defconfig
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/files/zx297520v3/linux-5_10-vehicle_dc-normal-defconfig
@@ -817,7 +817,7 @@
 CONFIG_NF_NAT_MASQUERADE=y
 # CONFIG_NF_TABLES is not set
 CONFIG_NETFILTER_XTABLES=y
-
+CONFIG_IPC_SOCKET=y
 #
 # Xtables combined modules
 #
@@ -1455,7 +1455,9 @@
 #
 # Input device support
 #
-# CONFIG_INPUT is not set
+CONFIG_INPUT=y
+CONFIG_INPUT_EVDEV=y
+CONFIG_KEYBOARD_ZX29=y
 
 #
 # Hardware I/O ports
@@ -2087,7 +2089,13 @@
 CONFIG_EDAC_ATOMIC_SCRUB=y
 CONFIG_EDAC_SUPPORT=y
 CONFIG_RTC_LIB=y
-# CONFIG_RTC_CLASS is not set
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+CONFIG_RTC_ZX234290=y
 CONFIG_DMADEVICES=y
 # CONFIG_DMADEVICES_DEBUG is not set
 
@@ -2359,7 +2367,17 @@
 #
 # Android
 #
-# CONFIG_ANDROID is not set
+CONFIG_ANDROID=y
+CONFIG_ANDROID_BINDER_IPC=y
+CONFIG_ASHMEM=y
+CONFIG_ANDROID_BINDER_RPC=y
+# CONFIG_ANDROID_LOGGER is not set
+# CONFIG_ANDROID_RAM_CONSOLE is not set
+# CONFIG_PERSISTENT_TRACER is not set
+# CONFIG_ANDROID_TIMED_OUTPUT is not set
+# CONFIG_ANDROID_LOW_MEMORY_KILLER is not set
+# CONFIG_ANDROID_SWITCH is not set
+# CONFIG_ANDROID_INTF_ALARM_DEV is not set
 # end of Android
 
 # CONFIG_DAX is not set
@@ -2939,11 +2957,13 @@
 # CONFIG_DEBUG_TIMEKEEPING is not set
 CONFIG_DEBUG_PREEMPT=y
 CONFIG_RAMDUMP=y
-CONFIG_RAMDUMP_USER=y
-CONFIG_RAMDUMP_ABNORMAL_EXIT_TASK=y
-CONFIG_RAMDUMP_EMMC=y
-CONFIG_RAMDUMP_EMMC_BASE=0x40000
-CONFIG_RAMDUMP_EMMC_SIZE=0x600000
+#xf.li modify for close ramdump start
+#CONFIG_RAMDUMP_USER=y
+#CONFIG_RAMDUMP_ABNORMAL_EXIT_TASK=y
+#CONFIG_RAMDUMP_EMMC=y
+#CONFIG_RAMDUMP_EMMC_BASE=0x40000
+#CONFIG_RAMDUMP_EMMC_SIZE=0x600000
+#xf.li modify for close ramdump end
 #
 # Lock Debugging (spinlocks, mutexes, etc...)
 #
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/files/zx297520v3/linux-5_10-vehicle_dc_ref-normal-defconfig b/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/files/zx297520v3/linux-5_10-vehicle_dc_ref-normal-defconfig
index 3e1ebbb..ce51bab 100755
--- a/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/files/zx297520v3/linux-5_10-vehicle_dc_ref-normal-defconfig
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/files/zx297520v3/linux-5_10-vehicle_dc_ref-normal-defconfig
@@ -130,7 +130,25 @@
 # CONFIG_SCHED_AUTOGROUP is not set
 # CONFIG_SYSFS_DEPRECATED is not set
 # CONFIG_RELAY is not set
-# CONFIG_BLK_DEV_INITRD is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE="rootfs.cpio"
+CONFIG_INITRAMFS_ROOT_UID=0
+CONFIG_INITRAMFS_ROOT_GID=0
+CONFIG_RD_GZIP=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_XZ=y
+CONFIG_RD_LZO=y
+CONFIG_RD_LZ4=y
+CONFIG_RD_ZSTD=y
+# CONFIG_INITRAMFS_COMPRESSION_GZIP is not set
+# CONFIG_INITRAMFS_COMPRESSION_BZIP2 is not set
+# CONFIG_INITRAMFS_COMPRESSION_LZMA is not set
+# CONFIG_INITRAMFS_COMPRESSION_XZ is not set
+# CONFIG_INITRAMFS_COMPRESSION_LZO is not set
+# CONFIG_INITRAMFS_COMPRESSION_LZ4 is not set
+CONFIG_INITRAMFS_COMPRESSION_ZSTD=y
+# CONFIG_INITRAMFS_COMPRESSION_NONE is not set
 # CONFIG_BOOT_CONFIG is not set
 # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set
 CONFIG_CC_OPTIMIZE_FOR_SIZE=y
@@ -817,7 +835,7 @@
 CONFIG_NF_NAT_MASQUERADE=y
 # CONFIG_NF_TABLES is not set
 CONFIG_NETFILTER_XTABLES=y
-
+# CONFIG_IPC_SOCKET is not set
 #
 # Xtables combined modules
 #
@@ -1272,7 +1290,39 @@
 # end of SCSI device support
 
 # CONFIG_ATA is not set
-# CONFIG_MD is not set
+CONFIG_MD=y
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_BCACHE is not set
+CONFIG_BLK_DEV_DM_BUILTIN=y
+CONFIG_BLK_DEV_DM=y
+CONFIG_DM_DEBUG=y
+CONFIG_DM_BUFIO=y
+# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set
+# CONFIG_DM_UNSTRIPED is not set
+CONFIG_DM_CRYPT=y
+# CONFIG_DM_SNAPSHOT is not set
+# CONFIG_DM_THIN_PROVISIONING is not set
+# CONFIG_DM_CACHE is not set
+# CONFIG_DM_WRITECACHE is not set
+# CONFIG_DM_EBS is not set
+# CONFIG_DM_ERA is not set
+# CONFIG_DM_CLONE is not set
+CONFIG_DM_MIRROR=y
+# CONFIG_DM_LOG_USERSPACE is not set
+# CONFIG_DM_RAID is not set
+# CONFIG_DM_ZERO is not set
+# CONFIG_DM_MULTIPATH is not set
+# CONFIG_DM_DELAY is not set
+# CONFIG_DM_DUST is not set
+CONFIG_DM_INIT=y
+CONFIG_DM_UEVENT=y
+# CONFIG_DM_FLAKEY is not set
+CONFIG_DM_VERITY=y
+# CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG is not set
+# CONFIG_DM_VERITY_FEC is not set
+# CONFIG_DM_SWITCH is not set
+# CONFIG_DM_LOG_WRITES is not set
+CONFIG_DM_INTEGRITY=y
 # CONFIG_TARGET_CORE is not set
 CONFIG_NETDEVICES=y
 CONFIG_NET_CORE=y
@@ -1455,8 +1505,9 @@
 #
 # Input device support
 #
-# CONFIG_INPUT is not set
-
+CONFIG_INPUT=y
+CONFIG_KEYBOARD_ZX29=y
+CONFIG_INPUT_EVDEV=y
 #
 # Hardware I/O ports
 #
@@ -1923,15 +1974,21 @@
 CONFIG_SND_SOC_SANECHIPS=y
 # CONFIG_SND_SOC_ZX29_TI3100 is not set
 CONFIG_SND_SOC_ZX29_NAU8810=y
+# CONFIG_SND_SOC_ZX29_TI3104 is not set
 # CONFIG_SND_SOC_ZX29_ES8374 is not set
 # CONFIG_SND_SOC_ZX29_ES8312 is not set
 # CONFIG_SND_SOC_ZX29_AK4940 is not set
+# CONFIG_SND_SOC_ZX29_MAX9867 is not set
+# CONFIG_SND_SOC_ZX29_ES8311 is not set
 CONFIG_SND_SOC_ZX_VOICE=y
 CONFIG_SND_SOC_ZX297520V3=y
 CONFIG_SND_SOC_ZX_I2S=y
 CONFIG_SND_SOC_ZX_PCM=y
 # CONFIG_SND_SOC_TLV320AIC31XX is not set
 CONFIG_SND_SOC_NAU8810=y
+# CONFIG_SND_SOC_TLV320AIC3X is not set
+# CONFIG_SND_SOC_MAX9867 is not set
+# CONFIG_SND_SOC_ES8311 is not set
 CONFIG_SND_EXTRA_CTRL=y
 CONFIG_USE_TOP_I2S0=y
 # CONFIG_USE_TOP_I2S1 is not set
@@ -2087,7 +2144,13 @@
 CONFIG_EDAC_ATOMIC_SCRUB=y
 CONFIG_EDAC_SUPPORT=y
 CONFIG_RTC_LIB=y
-# CONFIG_RTC_CLASS is not set
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+CONFIG_RTC_ZX234290=y
 CONFIG_DMADEVICES=y
 # CONFIG_DMADEVICES_DEBUG is not set
 
@@ -2359,7 +2422,17 @@
 #
 # Android
 #
-# CONFIG_ANDROID is not set
+CONFIG_ANDROID=y
+CONFIG_ANDROID_BINDER_IPC=y
+CONFIG_ASHMEM=y
+CONFIG_ANDROID_BINDER_RPC=y
+# CONFIG_ANDROID_LOGGER is not set
+# CONFIG_ANDROID_RAM_CONSOLE is not set
+# CONFIG_PERSISTENT_TRACER is not set
+# CONFIG_ANDROID_TIMED_OUTPUT is not set
+# CONFIG_ANDROID_LOW_MEMORY_KILLER is not set
+# CONFIG_ANDROID_SWITCH is not set
+# CONFIG_ANDROID_INTF_ALARM_DEV is not set
 # end of Android
 
 # CONFIG_DAX is not set
@@ -2687,9 +2760,9 @@
 # CONFIG_CRYPTO_RMD160 is not set
 # CONFIG_CRYPTO_RMD256 is not set
 # CONFIG_CRYPTO_RMD320 is not set
-# CONFIG_CRYPTO_SHA1 is not set
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA512 is not set
+CONFIG_CRYPTO_SHA1=y
+CONFIG_CRYPTO_SHA256=y
+CONFIG_CRYPTO_SHA512=y
 # CONFIG_CRYPTO_SHA3 is not set
 # CONFIG_CRYPTO_SM3 is not set
 # CONFIG_CRYPTO_STREEBOG is not set
@@ -2939,11 +3012,13 @@
 # CONFIG_DEBUG_TIMEKEEPING is not set
 CONFIG_DEBUG_PREEMPT=y
 CONFIG_RAMDUMP=y
-CONFIG_RAMDUMP_USER=y
-CONFIG_RAMDUMP_ABNORMAL_EXIT_TASK=y
-CONFIG_RAMDUMP_EMMC=y
-CONFIG_RAMDUMP_EMMC_BASE=0x40000
-CONFIG_RAMDUMP_EMMC_SIZE=0x600000
+#xf.li modify for close ramdump start
+#CONFIG_RAMDUMP_USER=y
+#CONFIG_RAMDUMP_ABNORMAL_EXIT_TASK=y
+#CONFIG_RAMDUMP_EMMC=y
+#CONFIG_RAMDUMP_EMMC_BASE=0x40000
+#CONFIG_RAMDUMP_EMMC_SIZE=0x600000
+#xf.li modify for close ramdump end
 #
 # Lock Debugging (spinlocks, mutexes, etc...)
 #
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/files/zx297520v3/linux-5_10-vehicle_dc_systemd-normal-defconfig b/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/files/zx297520v3/linux-5_10-vehicle_dc_systemd-normal-defconfig
index a6bfcc4..f8b901f 100755
--- a/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/files/zx297520v3/linux-5_10-vehicle_dc_systemd-normal-defconfig
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/files/zx297520v3/linux-5_10-vehicle_dc_systemd-normal-defconfig
@@ -1454,7 +1454,9 @@
 #
 # Input device support
 #
-# CONFIG_INPUT is not set
+CONFIG_INPUT=y
+CONFIG_INPUT_EVDEV=y
+CONFIG_KEYBOARD_ZX29=y
 
 #
 # Hardware I/O ports
@@ -2086,7 +2088,13 @@
 CONFIG_EDAC_ATOMIC_SCRUB=y
 CONFIG_EDAC_SUPPORT=y
 CONFIG_RTC_LIB=y
-# CONFIG_RTC_CLASS is not set
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+CONFIG_RTC_ZX234290=y
 CONFIG_DMADEVICES=y
 # CONFIG_DMADEVICES_DEBUG is not set
 
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/linux-zxic_5.10.bb b/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/linux-zxic_5.10.bb
old mode 100644
new mode 100755
index 29942f4..abadd9b
--- a/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/linux-zxic_5.10.bb
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-kernel/linux/linux-zxic_5.10.bb
@@ -9,6 +9,7 @@
 include ${BSPDIR}/sources/meta-zxic/conf/pub.inc
 
 DEPENDS += "kern-tools-native"
+DEPENDS += "${@bb.utils.contains('DISTRO_FEATURES','dm-verity','zstd-native','',d)}"
 inherit kernel  siteinfo  
 
 EXTRA_OEMAKE_append = " LOADADDR=${KERNEL_LOADADDR} EXTRA_CFLAGS='${ZXIC_EXTRA_CFLAGS}' "
@@ -58,6 +59,12 @@
 	${KERNEL_CONFIG_COMMAND}
 }
 
+fakeroot do_cpio () {
+	if ${@bb.utils.contains('DISTRO_FEATURES','dm-verity','true','false',d)}; then
+		cp  -v  ${BSPDIR}/sources/meta-zxic-custom/conf/distro/dm-verity/${KERNEL_INITRAMFS_CPIO}   ${B}/
+	fi
+}
+
 do_install_append () {
 	#install elfs
 	install -d ${ELFS-PATH}/
@@ -81,5 +88,6 @@
 	rm -fr ${ELFS-PATH}/${PN}/modules	
 }
 addtask  cleanlibs after do_clean  before do_cleansstate
+addtask  do_cpio   after do_configure before do_compile
 
 COMPATIBLE_MACHINE = "^zxic$"
diff --git a/cap/zx297520v3/sources/meta-zxic/recipes-security/cryptsetup/cryptsetup%.bbappend b/cap/zx297520v3/sources/meta-zxic/recipes-security/cryptsetup/cryptsetup%.bbappend
new file mode 100755
index 0000000..aa111c6
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic/recipes-security/cryptsetup/cryptsetup%.bbappend
@@ -0,0 +1,7 @@
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/cryptsetup:"
+
+#SRC_URI += " file://0001-zxic-log.patch "
+PACKAGECONFIG_remove_class-target = "udev"
+
+
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/__pycache__/codegen.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/__pycache__/codegen.cpython-36.pyc
new file mode 100755
index 0000000..e53b2cd
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/__pycache__/codegen.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/__pycache__/pyinotify.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/__pycache__/pyinotify.cpython-36.pyc
new file mode 100755
index 0000000..af7fc03
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/__pycache__/pyinotify.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/COW.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/COW.cpython-36.pyc
new file mode 100755
index 0000000..0ab29b6
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/COW.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/__init__.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/__init__.cpython-36.pyc
new file mode 100755
index 0000000..8178f15
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/build.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/build.cpython-36.pyc
new file mode 100755
index 0000000..53f32bc
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/build.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/cache.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/cache.cpython-36.pyc
new file mode 100755
index 0000000..7ee2d4f
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/cache.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/checksum.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/checksum.cpython-36.pyc
new file mode 100755
index 0000000..1319075
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/checksum.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/codeparser.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/codeparser.cpython-36.pyc
new file mode 100755
index 0000000..6a919e6
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/codeparser.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/command.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/command.cpython-36.pyc
new file mode 100755
index 0000000..af2bc7c
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/command.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/cooker.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/cooker.cpython-36.pyc
new file mode 100755
index 0000000..328f48e
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/cooker.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/cookerdata.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/cookerdata.cpython-36.pyc
new file mode 100755
index 0000000..df76475
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/cookerdata.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/daemonize.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/daemonize.cpython-36.pyc
new file mode 100755
index 0000000..40db423
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/daemonize.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/data.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/data.cpython-36.pyc
new file mode 100755
index 0000000..2910380
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/data.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/data_smart.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/data_smart.cpython-36.pyc
new file mode 100755
index 0000000..2fec4a4
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/data_smart.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/event.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/event.cpython-36.pyc
new file mode 100755
index 0000000..b24ecab
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/event.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/exceptions.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/exceptions.cpython-36.pyc
new file mode 100755
index 0000000..49fe351
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/exceptions.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/main.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/main.cpython-36.pyc
new file mode 100755
index 0000000..cc1b40c
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/main.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/methodpool.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/methodpool.cpython-36.pyc
new file mode 100755
index 0000000..d91adfd
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/methodpool.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/monitordisk.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/monitordisk.cpython-36.pyc
new file mode 100755
index 0000000..26ac291
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/monitordisk.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/msg.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/msg.cpython-36.pyc
new file mode 100755
index 0000000..7b81263
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/msg.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/namedtuple_with_abc.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/namedtuple_with_abc.cpython-36.pyc
new file mode 100755
index 0000000..d7919d1
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/namedtuple_with_abc.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/persist_data.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/persist_data.cpython-36.pyc
new file mode 100755
index 0000000..5a5c804
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/persist_data.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/process.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/process.cpython-36.pyc
new file mode 100755
index 0000000..afbf508
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/process.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/progress.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/progress.cpython-36.pyc
new file mode 100755
index 0000000..3ace7e4
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/progress.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/providers.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/providers.cpython-36.pyc
new file mode 100755
index 0000000..e60be91
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/providers.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/remotedata.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/remotedata.cpython-36.pyc
new file mode 100755
index 0000000..8933610
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/remotedata.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/runqueue.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/runqueue.cpython-36.pyc
new file mode 100755
index 0000000..7a7df54
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/runqueue.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/siggen.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/siggen.cpython-36.pyc
new file mode 100755
index 0000000..a3cb6cf
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/siggen.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/taskdata.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/taskdata.cpython-36.pyc
new file mode 100755
index 0000000..c7df8c4
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/taskdata.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/utils.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/utils.cpython-36.pyc
new file mode 100755
index 0000000..8d9e3a5
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/__pycache__/utils.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/__init__.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/__init__.cpython-36.pyc
new file mode 100755
index 0000000..9fcf7b0
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/bzr.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/bzr.cpython-36.pyc
new file mode 100755
index 0000000..51d4e70
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/bzr.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/clearcase.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/clearcase.cpython-36.pyc
new file mode 100755
index 0000000..4b255a1
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/clearcase.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/cvs.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/cvs.cpython-36.pyc
new file mode 100755
index 0000000..81c213e
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/cvs.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/git.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/git.cpython-36.pyc
new file mode 100755
index 0000000..d3b99cb
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/git.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/gitannex.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/gitannex.cpython-36.pyc
new file mode 100755
index 0000000..3c42e98
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/gitannex.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/gitsm.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/gitsm.cpython-36.pyc
new file mode 100755
index 0000000..9cc3334
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/gitsm.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/hg.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/hg.cpython-36.pyc
new file mode 100755
index 0000000..b7c47dc
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/hg.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/local.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/local.cpython-36.pyc
new file mode 100755
index 0000000..55a9f58
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/local.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/npm.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/npm.cpython-36.pyc
new file mode 100755
index 0000000..9721dad
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/npm.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/npmsw.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/npmsw.cpython-36.pyc
new file mode 100755
index 0000000..def421b
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/npmsw.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/osc.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/osc.cpython-36.pyc
new file mode 100755
index 0000000..0a54b2d
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/osc.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/perforce.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/perforce.cpython-36.pyc
new file mode 100755
index 0000000..da1e97e
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/perforce.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/repo.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/repo.cpython-36.pyc
new file mode 100755
index 0000000..1539c45
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/repo.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/s3.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/s3.cpython-36.pyc
new file mode 100755
index 0000000..38068ab
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/s3.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/sftp.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/sftp.cpython-36.pyc
new file mode 100755
index 0000000..2b26fd6
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/sftp.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/ssh.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/ssh.cpython-36.pyc
new file mode 100755
index 0000000..e40fcdb
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/ssh.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/svn.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/svn.cpython-36.pyc
new file mode 100755
index 0000000..bc2195a
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/svn.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/wget.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/wget.cpython-36.pyc
new file mode 100755
index 0000000..42a234d
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/fetch2/__pycache__/wget.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/parse/__pycache__/__init__.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/parse/__pycache__/__init__.cpython-36.pyc
new file mode 100755
index 0000000..9d0ea57
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/parse/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/parse/__pycache__/ast.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/parse/__pycache__/ast.cpython-36.pyc
new file mode 100755
index 0000000..5757bb1
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/parse/__pycache__/ast.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/parse/parse_py/__pycache__/BBHandler.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/parse/parse_py/__pycache__/BBHandler.cpython-36.pyc
new file mode 100755
index 0000000..c8d0596
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/parse/parse_py/__pycache__/BBHandler.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/parse/parse_py/__pycache__/ConfHandler.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/parse/parse_py/__pycache__/ConfHandler.cpython-36.pyc
new file mode 100755
index 0000000..31aad85
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/parse/parse_py/__pycache__/ConfHandler.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/parse/parse_py/__pycache__/__init__.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/parse/parse_py/__pycache__/__init__.cpython-36.pyc
new file mode 100755
index 0000000..a5d3663
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/parse/parse_py/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/__pycache__/__init__.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/__pycache__/__init__.cpython-36.pyc
new file mode 100755
index 0000000..a908f6c
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/__pycache__/pyshlex.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/__pycache__/pyshlex.cpython-36.pyc
new file mode 100755
index 0000000..861818b
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/__pycache__/pyshlex.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/__pycache__/pyshyacc.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/__pycache__/pyshyacc.cpython-36.pyc
new file mode 100755
index 0000000..057de08
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/__pycache__/pyshyacc.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/__pycache__/sherrors.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/__pycache__/sherrors.cpython-36.pyc
new file mode 100755
index 0000000..5cbaf57
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/__pycache__/sherrors.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshtables.py b/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshtables.py
new file mode 100755
index 0000000..761cab6
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshtables.py
@@ -0,0 +1,177 @@
+
+# /home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshtables.py
+# This file is automatically generated. Do not edit.
+_tabversion = '3.2'
+
+_lr_method = 'LALR'
+
+_lr_signature = b'\x86\xa0\x89\xe9\x12\x83\xa7S\x91\xa1\xad\x90\xddA\xed\x81'
+    
+_lr_action_items = {'NEWLINE':([0,4,5,6,7,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,39,40,42,43,53,54,55,56,58,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,92,93,94,96,97,98,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,143,144,145,146,147,148,149,150,151,152,154,155,156,157,158,159,162,163,165,166,167,168,171,172,173,174,175,176,177,179,183,189,192,193,196,197,200,202,203,205,207,208,211,215,216,],[6,58,6,-127,-7,-8,-12,-14,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,6,-85,-87,-82,6,6,6,6,-111,-113,-144,-139,-143,-84,-34,-59,-67,-128,6,58,-131,-133,6,6,6,-13,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,6,58,-33,6,-38,6,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,58,-130,-132,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,6,-27,-30,6,6,-73,6,-140,-66,6,-142,-68,-125,-9,-10,-15,-32,-31,-35,6,-39,6,-69,-70,6,6,58,-41,-62,6,6,-76,-141,-71,-36,-40,-44,-61,-37,-42,-43,6,6,6,58,6,6,6,6,6,6,]),'Bang':([0,1,2,3,4,5,6,7,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,140,143,144,145,146,147,148,149,150,151,152,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[16,16,-1,-2,-126,-5,-127,-7,-8,-12,-14,-16,-17,-19,-11,-79,16,-20,-21,-22,-23,-24,-25,-26,16,-85,-87,-82,16,16,16,16,-111,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,16,-135,-131,-133,-148,-148,-13,-18,-109,16,-86,-88,-83,-146,-147,16,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,16,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,16,16,-110,16,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,16,-148,-73,16,-140,-66,16,-142,-68,-125,-9,-10,-15,16,-35,-69,-70,-62,16,16,-76,-141,-71,-36,-44,-61,-37,-42,-43,16,16,16,16,]),'TOKEN':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,140,143,144,145,146,147,148,149,150,151,152,155,156,157,158,159,162,163,165,168,169,171,172,173,174,175,176,177,179,182,183,185,188,189,192,193,194,196,197,198,200,203,205,207,208,213,214,215,216,218,219,],[30,30,-1,-2,-126,-5,-127,-7,-8,-12,30,-14,-145,-16,-17,-19,-11,74,74,-20,-21,-22,-23,-24,-25,-26,30,-85,-87,-82,30,74,74,30,30,30,-111,-113,-144,-138,-139,-143,105,105,105,105,105,105,105,-84,-34,-59,-67,-3,-128,-4,30,-135,-131,-133,-148,-148,-148,-13,-18,-109,74,-86,-88,-83,-146,-147,74,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,30,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,149,-124,-6,-134,-129,-130,-132,30,30,30,-110,74,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,30,-148,-73,30,-140,-66,30,-142,-68,-125,-9,-10,-15,30,-35,74,-39,-148,-69,-70,74,-41,74,-62,30,30,-76,-141,-71,-36,-40,74,-44,-48,74,-61,-37,-42,-47,-43,30,74,30,30,30,-148,-148,-53,-54,-148,-148,-55,-56,]),'Lbrace':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,140,143,144,145,146,147,148,149,150,151,152,153,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[31,31,-1,-2,-126,-5,-127,-7,-8,-12,31,-14,-145,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,31,-85,-87,-82,31,31,31,31,-111,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,31,-135,-131,-133,-148,-148,-148,-13,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,31,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,31,31,31,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-148,-27,31,-148,-73,31,-140,-66,31,-142,-68,-125,-9,-10,-15,31,31,-35,-69,-70,-62,31,31,-76,-141,-71,-36,-44,-61,-37,-42,-43,31,31,31,31,]),'LPARENS':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,34,35,36,37,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,140,143,144,145,146,147,148,149,150,151,152,153,155,156,158,159,162,163,169,171,172,173,174,175,176,177,182,183,185,189,192,193,194,196,197,200,203,205,207,208,213,214,215,216,218,219,],[27,27,-1,-2,-126,-5,-127,-7,-8,-12,27,-14,-145,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,90,27,-85,-87,-72,27,27,27,27,-111,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,27,-135,-131,-133,-148,-148,-148,-13,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,27,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,27,27,27,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-148,-27,27,-148,-73,27,-140,-66,27,-142,-68,-125,-9,-10,-15,27,27,-35,-39,-148,-69,-70,188,-62,27,27,-76,-141,-71,-36,188,-44,-48,-61,-37,-42,-47,-43,27,27,27,27,-148,-148,-53,-54,-148,-148,-55,-56,]),'Case':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,140,143,144,145,146,147,148,149,150,151,152,153,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[33,33,-1,-2,-126,-5,-127,-7,-8,-12,33,-14,-145,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,33,-85,-87,-82,33,33,33,33,-111,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,33,-135,-131,-133,-148,-148,-148,-13,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,33,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,33,33,33,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-148,-27,33,-148,-73,33,-140,-66,33,-142,-68,-125,-9,-10,-15,33,33,-35,-69,-70,-62,33,33,-76,-141,-71,-36,-44,-61,-37,-42,-43,33,33,33,33,]),'While':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,140,143,144,145,146,147,148,149,150,151,152,153,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[35,35,-1,-2,-126,-5,-127,-7,-8,-12,35,-14,-145,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,35,-85,-87,-82,35,35,35,35,-111,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,35,-135,-131,-133,-148,-148,-148,-13,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,35,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,35,35,35,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-148,-27,35,-148,-73,35,-140,-66,35,-142,-68,-125,-9,-10,-15,35,35,-35,-69,-70,-62,35,35,-76,-141,-71,-36,-44,-61,-37,-42,-43,35,35,35,35,]),'IO_NUMBER':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,140,143,144,145,146,147,148,149,150,151,152,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[38,38,-1,-2,-126,-5,-127,-7,-8,-12,38,-14,-145,-16,38,-19,-11,38,38,-20,-21,-22,-23,-24,-25,-26,38,-85,-87,-82,38,38,38,38,-111,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,38,-135,-131,-133,-148,-148,-148,-13,38,-109,38,-86,-88,-83,-146,-147,38,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,38,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,38,38,38,-110,38,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,38,-148,-73,38,-140,-66,38,-142,-68,-125,-9,-10,-15,38,-35,-69,38,-62,38,38,-76,-141,38,-36,-44,-61,-37,-42,-43,38,38,38,38,]),'LESS':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,38,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,140,143,144,145,146,147,148,149,150,151,152,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[44,44,-1,-2,-126,-5,-127,-7,-8,-12,44,-14,-145,-16,44,-19,-11,44,44,-20,-21,-22,-23,-24,-25,-26,44,-85,-87,-82,44,44,44,44,-111,44,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,44,-135,-131,-133,-148,-148,-148,-13,44,-109,44,-86,-88,-83,-146,-147,44,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,44,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,44,44,44,-110,44,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,44,-148,-73,44,-140,-66,44,-142,-68,-125,-9,-10,-15,44,-35,-69,44,-62,44,44,-76,-141,44,-36,-44,-61,-37,-42,-43,44,44,44,44,]),'LESSAND':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,38,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,140,143,144,145,146,147,148,149,150,151,152,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[45,45,-1,-2,-126,-5,-127,-7,-8,-12,45,-14,-145,-16,45,-19,-11,45,45,-20,-21,-22,-23,-24,-25,-26,45,-85,-87,-82,45,45,45,45,-111,45,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,45,-135,-131,-133,-148,-148,-148,-13,45,-109,45,-86,-88,-83,-146,-147,45,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,45,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,45,45,45,-110,45,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,45,-148,-73,45,-140,-66,45,-142,-68,-125,-9,-10,-15,45,-35,-69,45,-62,45,45,-76,-141,45,-36,-44,-61,-37,-42,-43,45,45,45,45,]),'GREATER':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,38,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,140,143,144,145,146,147,148,149,150,151,152,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[46,46,-1,-2,-126,-5,-127,-7,-8,-12,46,-14,-145,-16,46,-19,-11,46,46,-20,-21,-22,-23,-24,-25,-26,46,-85,-87,-82,46,46,46,46,-111,46,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,46,-135,-131,-133,-148,-148,-148,-13,46,-109,46,-86,-88,-83,-146,-147,46,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,46,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,46,46,46,-110,46,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,46,-148,-73,46,-140,-66,46,-142,-68,-125,-9,-10,-15,46,-35,-69,46,-62,46,46,-76,-141,46,-36,-44,-61,-37,-42,-43,46,46,46,46,]),'GREATAND':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,38,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,140,143,144,145,146,147,148,149,150,151,152,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[47,47,-1,-2,-126,-5,-127,-7,-8,-12,47,-14,-145,-16,47,-19,-11,47,47,-20,-21,-22,-23,-24,-25,-26,47,-85,-87,-82,47,47,47,47,-111,47,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,47,-135,-131,-133,-148,-148,-148,-13,47,-109,47,-86,-88,-83,-146,-147,47,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,47,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,47,47,47,-110,47,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,47,-148,-73,47,-140,-66,47,-142,-68,-125,-9,-10,-15,47,-35,-69,47,-62,47,47,-76,-141,47,-36,-44,-61,-37,-42,-43,47,47,47,47,]),'DGREAT':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,38,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,140,143,144,145,146,147,148,149,150,151,152,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[48,48,-1,-2,-126,-5,-127,-7,-8,-12,48,-14,-145,-16,48,-19,-11,48,48,-20,-21,-22,-23,-24,-25,-26,48,-85,-87,-82,48,48,48,48,-111,48,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,48,-135,-131,-133,-148,-148,-148,-13,48,-109,48,-86,-88,-83,-146,-147,48,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,48,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,48,48,48,-110,48,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,48,-148,-73,48,-140,-66,48,-142,-68,-125,-9,-10,-15,48,-35,-69,48,-62,48,48,-76,-141,48,-36,-44,-61,-37,-42,-43,48,48,48,48,]),'LESSGREAT':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,38,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,140,143,144,145,146,147,148,149,150,151,152,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[49,49,-1,-2,-126,-5,-127,-7,-8,-12,49,-14,-145,-16,49,-19,-11,49,49,-20,-21,-22,-23,-24,-25,-26,49,-85,-87,-82,49,49,49,49,-111,49,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,49,-135,-131,-133,-148,-148,-148,-13,49,-109,49,-86,-88,-83,-146,-147,49,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,49,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,49,49,49,-110,49,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,49,-148,-73,49,-140,-66,49,-142,-68,-125,-9,-10,-15,49,-35,-69,49,-62,49,49,-76,-141,49,-36,-44,-61,-37,-42,-43,49,49,49,49,]),'CLOBBER':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,38,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,140,143,144,145,146,147,148,149,150,151,152,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[50,50,-1,-2,-126,-5,-127,-7,-8,-12,50,-14,-145,-16,50,-19,-11,50,50,-20,-21,-22,-23,-24,-25,-26,50,-85,-87,-82,50,50,50,50,-111,50,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,50,-135,-131,-133,-148,-148,-148,-13,50,-109,50,-86,-88,-83,-146,-147,50,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,50,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,50,50,50,-110,50,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,50,-148,-73,50,-140,-66,50,-142,-68,-125,-9,-10,-15,50,-35,-69,50,-62,50,50,-76,-141,50,-36,-44,-61,-37,-42,-43,50,50,50,50,]),'DLESS':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,38,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,140,143,144,145,146,147,148,149,150,151,152,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[51,51,-1,-2,-126,-5,-127,-7,-8,-12,51,-14,-145,-16,51,-19,-11,51,51,-20,-21,-22,-23,-24,-25,-26,51,-85,-87,-82,51,51,51,51,-111,51,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,51,-135,-131,-133,-148,-148,-148,-13,51,-109,51,-86,-88,-83,-146,-147,51,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,51,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,51,51,51,-110,51,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,51,-148,-73,51,-140,-66,51,-142,-68,-125,-9,-10,-15,51,-35,-69,51,-62,51,51,-76,-141,51,-36,-44,-61,-37,-42,-43,51,51,51,51,]),'DLESSDASH':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,38,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,140,143,144,145,146,147,148,149,150,151,152,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[52,52,-1,-2,-126,-5,-127,-7,-8,-12,52,-14,-145,-16,52,-19,-11,52,52,-20,-21,-22,-23,-24,-25,-26,52,-85,-87,-82,52,52,52,52,-111,52,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,52,-135,-131,-133,-148,-148,-148,-13,52,-109,52,-86,-88,-83,-146,-147,52,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,52,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,52,52,52,-110,52,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,52,-148,-73,52,-140,-66,52,-142,-68,-125,-9,-10,-15,52,-35,-69,52,-62,52,52,-76,-141,52,-36,-44,-61,-37,-42,-43,52,52,52,52,]),'ASSIGNMENT_WORD':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,140,143,144,145,146,147,148,149,150,151,152,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[53,53,-1,-2,-126,-5,-127,-7,-8,-12,53,-14,-145,-16,-17,-19,-11,53,53,-20,-21,-22,-23,-24,-25,-26,53,-85,-87,-82,53,53,53,53,-111,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,53,-135,-131,-133,-148,-148,-148,-13,-18,-109,53,-86,-88,-83,-146,-147,53,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,53,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,53,53,53,-110,53,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,53,-148,-73,53,-140,-66,53,-142,-68,-125,-9,-10,-15,53,-35,-69,-70,-62,53,53,-76,-141,-71,-36,-44,-61,-37,-42,-43,53,53,53,53,]),'For':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,140,143,144,145,146,147,148,149,150,151,152,153,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[54,54,-1,-2,-126,-5,-127,-7,-8,-12,54,-14,-145,-16,-17,-19,-11,-79,54,-20,-21,-22,-23,-24,-25,-26,54,-85,-87,-82,54,54,54,54,-111,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,54,-135,-131,-133,-148,-148,-148,-13,-18,-109,54,-86,-88,-83,-146,-147,54,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,54,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,54,54,54,-110,54,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-148,-27,54,-148,-73,54,-140,-66,54,-142,-68,-125,-9,-10,-15,54,54,-35,-69,-70,-62,54,54,-76,-141,-71,-36,-44,-61,-37,-42,-43,54,54,54,54,]),'If':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,140,143,144,145,146,147,148,149,150,151,152,153,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[55,55,-1,-2,-126,-5,-127,-7,-8,-12,55,-14,-145,-16,-17,-19,-11,-79,55,-20,-21,-22,-23,-24,-25,-26,55,-85,-87,-82,55,55,55,55,-111,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,55,-135,-131,-133,-148,-148,-148,-13,-18,-109,55,-86,-88,-83,-146,-147,55,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,55,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,55,55,55,-110,55,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-148,-27,55,-148,-73,55,-140,-66,55,-142,-68,-125,-9,-10,-15,55,55,-35,-69,-70,-62,55,55,-76,-141,-71,-36,-44,-61,-37,-42,-43,55,55,55,55,]),'Until':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,34,35,36,37,39,40,42,43,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,93,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,140,143,144,145,146,147,148,149,150,151,152,153,155,156,162,163,171,172,173,174,175,176,177,183,189,192,193,196,197,200,203,205,],[56,56,-1,-2,-126,-5,-127,-7,-8,-12,56,-14,-145,-16,-17,-19,-11,-79,56,-20,-21,-22,-23,-24,-25,-26,56,-85,-87,-82,56,56,56,56,-111,-113,-144,-139,-143,-84,-34,-59,-67,-3,-128,-4,56,-135,-131,-133,-148,-148,-148,-13,-18,-109,56,-86,-88,-83,-146,-147,56,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,56,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,56,56,56,-110,56,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-148,-27,56,-148,-73,56,-140,-66,56,-142,-68,-125,-9,-10,-15,56,56,-35,-69,-70,-62,56,56,-76,-141,-71,-36,-44,-61,-37,-42,-43,56,56,56,56,]),'$end':([1,2,3,4,5,6,7,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,28,29,30,37,39,40,53,54,55,56,57,58,59,60,61,62,63,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,123,124,125,126,127,128,129,130,131,132,133,134,136,140,145,148,149,150,151,152,156,162,163,171,174,175,176,177,183,189,192,193,196,],[0,-1,-2,-126,-5,-127,-7,-8,-12,-14,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,-85,-87,-82,-111,-113,-144,-84,-34,-59,-67,-3,-128,-4,-148,-135,-131,-133,-13,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-134,-129,-130,-132,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,-73,-66,-68,-125,-9,-10,-15,-35,-69,-70,-62,-76,-141,-71,-36,-44,-61,-37,-42,-43,]),'COMMA':([5,7,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,28,29,30,37,39,40,53,54,55,56,62,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,92,94,102,103,104,105,106,107,108,109,110,111,112,114,115,123,124,125,126,127,128,129,130,131,132,133,134,136,139,140,145,148,149,150,151,152,154,156,157,158,162,163,165,168,171,174,175,176,177,179,183,189,192,193,196,],[62,-7,-8,-12,-14,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,-85,-87,-82,-111,-113,-144,-84,-34,-59,-67,119,-13,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,62,-33,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,62,-73,-66,-68,-125,-9,-10,-15,-32,-35,166,-39,-69,-70,166,-41,-62,-76,-141,-71,-36,-40,-44,-61,-37,-42,-43,]),'AMP':([5,7,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,28,29,30,37,39,40,53,54,55,56,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,92,94,102,103,104,105,106,107,108,109,110,111,112,114,115,123,124,125,126,127,128,129,130,131,132,133,134,136,139,140,145,148,149,150,151,152,154,156,162,163,171,174,175,176,177,183,189,192,193,196,],[63,-7,-8,-12,-14,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,-85,-87,-82,-111,-113,-144,-84,-34,-59,-67,-13,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,63,-33,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-6,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,63,-73,-66,-68,-125,-9,-10,-15,-32,-35,-69,-70,-62,-76,-141,-71,-36,-44,-61,-37,-42,-43,]),'RPARENS':([6,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,28,29,30,37,39,40,53,54,55,56,58,61,62,63,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,94,102,103,104,105,106,107,108,109,110,111,112,114,116,117,118,119,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,145,148,149,150,151,152,154,155,156,162,163,171,174,175,176,177,181,183,187,189,192,193,196,199,204,],[-127,-8,-12,-14,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,-85,-87,-82,-111,-113,-144,-84,-34,-59,-67,-128,-135,-131,-133,-13,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,135,136,-28,-33,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-134,-129,-130,-132,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,-30,-148,-29,-73,-66,-68,-125,-9,-10,-15,-32,-31,-35,-69,-70,-62,-76,-141,-71,-36,-57,-44,197,-61,-37,-42,-43,205,-58,]),'Rbrace':([6,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,28,29,30,37,39,40,53,54,55,56,58,61,62,63,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,92,94,95,102,103,104,105,106,107,108,109,110,111,112,114,116,117,118,119,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,145,148,149,150,151,152,154,155,156,162,163,171,174,175,176,177,183,189,192,193,196,],[-127,-8,-12,-14,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,-85,-87,-82,-111,-113,-144,-84,-34,-59,-67,-128,-135,-131,-133,-13,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,-28,-33,140,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-134,-129,-130,-132,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,-30,-148,-29,-73,-66,-68,-125,-9,-10,-15,-32,-31,-35,-69,-70,-62,-76,-141,-71,-36,-44,-61,-37,-42,-43,]),'Then':([6,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,28,29,30,37,39,40,53,54,55,56,58,61,62,63,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,92,94,99,102,103,104,105,106,107,108,109,110,111,112,114,116,117,118,119,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,145,148,149,150,151,152,154,155,156,162,163,171,174,175,176,177,183,189,190,192,193,196,],[-127,-8,-12,-14,-16,-17,-19,-11,-79,89,-20,-21,-22,-23,-24,-25,-26,-85,-87,-82,-111,-113,-144,-84,-34,-59,-67,-128,-135,-131,-133,-13,-18,-109,89,-86,-88,-83,-146,-147,89,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,-28,-33,89,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-134,-129,-130,-132,-110,89,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,-30,-148,-29,-73,-66,-68,-125,-9,-10,-15,-32,-31,-35,-69,-70,-62,-76,-141,-71,-36,-44,-61,89,-37,-42,-43,]),'Do':([6,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,28,29,30,37,39,40,53,54,55,56,58,61,62,63,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,92,94,96,97,100,101,102,103,104,105,106,107,108,109,110,111,112,114,116,117,118,119,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,141,145,148,149,150,151,152,154,155,156,162,163,164,166,167,171,174,175,176,177,178,180,183,189,192,193,196,],[-127,-8,-12,-14,-16,-17,-19,-11,-79,88,-20,-21,-22,-23,-24,-25,-26,-85,-87,-82,-111,-113,-144,-84,-34,-59,-67,-128,-135,-131,-133,-13,-18,-109,88,-86,-88,-83,-146,-147,88,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,-28,-33,-148,-38,88,88,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-134,-129,-130,-132,-110,88,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,-30,-148,-29,-73,88,-66,-68,-125,-9,-10,-15,-32,-31,-35,-69,-70,88,-148,-137,-62,-76,-141,-71,-36,88,-136,-44,-61,-37,-42,-43,]),'Fi':([6,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,28,29,30,32,33,37,39,40,41,53,54,55,56,58,61,62,63,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,92,94,102,103,104,105,106,107,108,109,110,111,112,114,116,117,118,119,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,145,148,149,150,151,152,154,155,156,157,158,159,160,162,163,165,168,169,170,171,174,175,176,177,179,182,183,185,188,189,191,192,193,194,196,198,206,207,208,212,213,214,215,216,218,219,],[-127,-8,-12,-14,-16,-17,-19,-11,75,75,-20,-21,-22,-23,-24,-25,-26,-85,-87,-82,75,75,-111,-113,-144,-138,-84,-34,-59,-67,-128,-135,-131,-133,-13,-18,-109,75,-86,-88,-83,-146,-147,75,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,-28,-33,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-134,-129,-130,-132,-110,75,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,-30,-148,-29,-73,-66,-68,-125,-9,-10,-15,-32,-31,-35,75,-39,-148,171,-69,-70,75,-41,75,189,-62,-76,-141,-71,-36,-40,75,-44,-48,75,-61,-65,-37,-42,-47,-43,75,-64,-148,-148,-63,-53,-54,-148,-148,-55,-56,]),'Elif':([6,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,28,29,30,37,39,40,53,54,55,56,58,61,62,63,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,92,94,102,103,104,105,106,107,108,109,110,111,112,114,116,117,118,119,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,145,148,149,150,151,152,154,155,156,160,162,163,171,174,175,176,177,183,189,192,193,196,206,],[-127,-8,-12,-14,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,-85,-87,-82,-111,-113,-144,-84,-34,-59,-67,-128,-135,-131,-133,-13,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,-28,-33,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-134,-129,-130,-132,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,-30,-148,-29,-73,-66,-68,-125,-9,-10,-15,-32,-31,-35,172,-69,-70,-62,-76,-141,-71,-36,-44,-61,-37,-42,-43,172,]),'Else':([6,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,28,29,30,37,39,40,53,54,55,56,58,61,62,63,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,92,94,102,103,104,105,106,107,108,109,110,111,112,114,116,117,118,119,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,145,148,149,150,151,152,154,155,156,160,162,163,171,174,175,176,177,183,189,192,193,196,206,],[-127,-8,-12,-14,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,-85,-87,-82,-111,-113,-144,-84,-34,-59,-67,-128,-135,-131,-133,-13,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,-28,-33,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-134,-129,-130,-132,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,-30,-148,-29,-73,-66,-68,-125,-9,-10,-15,-32,-31,-35,173,-69,-70,-62,-76,-141,-71,-36,-44,-61,-37,-42,-43,173,]),'Done':([6,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,28,29,30,37,39,40,53,54,55,56,58,61,62,63,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,92,94,102,103,104,105,106,107,108,109,110,111,112,114,116,117,118,119,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,145,148,149,150,151,152,154,155,156,161,162,163,171,174,175,176,177,183,189,192,193,196,],[-127,-8,-12,-14,-16,-17,-19,-11,-79,87,-20,-21,-22,-23,-24,-25,-26,-85,-87,-82,-111,-113,-144,-84,-34,-59,-67,-128,-135,-131,-133,-13,-18,-109,87,-86,-88,-83,-146,-147,87,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,-28,-33,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-134,-129,-130,-132,-110,87,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,-30,-148,-29,-73,-66,-68,-125,-9,-10,-15,-32,-31,-35,87,-69,-70,-62,-76,-141,-71,-36,-44,-61,-37,-42,-43,]),'DSEMI':([6,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,28,29,30,37,39,40,53,54,55,56,58,61,62,63,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,92,94,102,103,104,105,106,107,108,109,110,111,112,114,116,117,118,119,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,145,148,149,150,151,152,154,155,156,162,163,171,174,175,176,177,183,189,192,193,196,197,201,202,203,205,210,211,],[-127,-8,-12,-14,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,-85,-87,-82,-111,-113,-144,-84,-34,-59,-67,-128,-135,-131,-133,-13,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,-28,-33,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-134,-129,-130,-132,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,-30,-148,-29,-73,-66,-68,-125,-9,-10,-15,-32,-31,-35,-69,-70,-62,-76,-141,-71,-36,-44,-61,-37,-42,-43,-148,207,208,-129,-148,215,216,]),'Esac':([6,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,28,29,30,37,39,40,53,54,55,56,58,61,62,63,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,92,94,102,103,104,105,106,107,108,109,110,111,112,114,116,117,118,119,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,145,148,149,150,151,152,154,155,156,158,159,162,163,169,171,174,175,176,177,182,183,184,185,186,189,192,193,194,195,196,197,201,202,203,205,207,208,209,210,211,213,214,215,216,217,218,219,],[-127,-8,-12,-14,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,-85,-87,-82,-111,-113,-144,-84,-34,-59,-67,-128,-135,-131,-133,-13,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,-28,-33,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-134,-129,-130,-132,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,-30,-148,-29,-73,-66,-68,-125,-9,-10,-15,-32,-31,-35,-39,-148,-69,-70,183,-62,-76,-141,-71,-36,193,-44,196,-48,-46,-61,-37,-42,-47,-45,-43,-148,-49,-148,-129,-148,-148,-148,-50,-51,-148,-53,-54,-148,-148,-52,-55,-56,]),'In':([6,58,74,75,96,97,98,117,118,141,142,],[-127,-128,-146,-147,-148,-38,-148,-129,-130,158,158,]),'AND_IF':([7,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,28,29,30,37,39,40,53,54,55,56,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,94,102,103,104,105,106,107,108,109,110,111,112,114,115,123,124,125,126,127,128,129,130,131,132,133,134,136,140,145,148,149,150,151,152,154,156,162,163,171,174,175,176,177,183,189,192,193,196,],[64,-8,-12,-14,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,-85,-87,-82,-111,-113,-144,-84,-34,-59,-67,-13,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,64,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,64,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,-73,-66,-68,-125,-9,-10,-15,64,-35,-69,-70,-62,-76,-141,-71,-36,-44,-61,-37,-42,-43,]),'OR_IF':([7,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,28,29,30,37,39,40,53,54,55,56,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,94,102,103,104,105,106,107,108,109,110,111,112,114,115,123,124,125,126,127,128,129,130,131,132,133,134,136,140,145,148,149,150,151,152,154,156,162,163,171,174,175,176,177,183,189,192,193,196,],[65,-8,-12,-14,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,-85,-87,-82,-111,-113,-144,-84,-34,-59,-67,-13,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,65,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,65,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,-73,-66,-68,-125,-9,-10,-15,65,-35,-69,-70,-62,-76,-141,-71,-36,-44,-61,-37,-42,-43,]),'PIPE':([9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,28,29,30,37,39,40,53,54,55,56,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,102,103,104,105,106,107,108,109,110,111,112,114,123,124,125,126,127,128,129,130,131,132,133,134,136,140,145,148,149,152,156,162,163,171,174,175,176,177,181,183,187,189,192,193,196,199,204,],[66,-14,-16,-17,-19,-11,-79,-81,-20,-21,-22,-23,-24,-25,-26,-85,-87,-82,-111,-113,-144,-84,-34,-59,-67,66,-18,-109,-78,-86,-88,-83,-146,-147,-80,-89,-91,-93,-95,-97,-99,-101,-103,-105,-107,-74,-75,-60,-112,-114,-115,-122,-116,-117,-118,-119,-120,-121,-123,-124,-110,-77,-90,-92,-94,-96,-98,-100,-102,-104,-106,-108,-27,-73,-66,-68,-125,-15,-35,-69,-70,-62,-76,-141,-71,-36,-57,-44,198,-61,-37,-42,-43,198,-58,]),'HERENAME':([51,52,],[113,113,]),}
+
+_lr_action = { }
+for _k, _v in _lr_action_items.items():
+   for _x,_y in zip(_v[0],_v[1]):
+      if not _x in _lr_action:  _lr_action[_x] = { }
+      _lr_action[_x][_k] = _y
+del _lr_action_items
+
+_lr_goto_items = {'multiple_commands':([0,],[1,]),'newline_sequence':([0,],[2,]),'complete_command':([0,1,],[3,57,]),'newline_list':([0,5,27,31,34,35,36,60,64,65,66,92,96,98,135,138,139,143,146,157,159,165,166,172,173,197,200,202,205,207,208,211,215,216,],[4,61,93,93,93,93,93,117,117,117,117,61,117,117,117,117,61,93,93,167,117,167,117,93,93,203,93,117,203,117,117,117,117,117,]),'list':([0,1,],[5,5,]),'and_or':([0,1,27,31,34,35,36,60,93,137,143,146,155,172,173,197,200,203,205,],[7,7,94,94,94,94,94,115,94,154,94,94,154,94,94,94,94,94,94,]),'pipeline':([0,1,27,31,34,35,36,60,93,120,121,137,143,146,155,172,173,197,200,203,205,],[8,8,8,8,8,8,8,8,8,150,151,8,8,8,8,8,8,8,8,8,8,]),'pipe_sequence':([0,1,10,27,31,34,35,36,60,93,120,121,137,143,146,155,172,173,197,200,203,205,],[9,9,67,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,]),'bang_word':([0,1,27,31,34,35,36,60,93,120,121,137,143,146,155,172,173,197,200,203,205,],[10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,]),'command':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,155,172,173,197,200,203,205,],[11,11,11,11,11,11,11,11,11,11,11,11,152,11,11,11,11,11,11,11,11,11,11,]),'maybe_bang_word':([0,1,18,27,31,34,35,36,60,70,76,93,120,121,124,137,143,146,155,172,173,197,200,203,205,],[12,12,86,12,12,12,12,12,12,86,134,12,12,12,134,12,12,12,12,12,12,12,12,12,12,]),'simple_command':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,155,172,173,197,200,203,205,],[13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,]),'compound_command':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,153,155,172,173,197,200,203,205,],[14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,163,14,14,14,14,14,14,14,]),'function_definition':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,155,172,173,197,200,203,205,],[15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,]),'cmd_prefix':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,155,172,173,197,200,203,205,],[17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,]),'cmd_name':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,155,172,173,197,200,203,205,],[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,]),'brace_group':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,153,155,172,173,197,200,203,205,],[19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,]),'subshell':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,153,155,172,173,197,200,203,205,],[20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,]),'for_clause':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,153,155,172,173,197,200,203,205,],[21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,]),'case_clause':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,153,155,172,173,197,200,203,205,],[22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,]),'if_clause':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,153,155,172,173,197,200,203,205,],[23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,]),'while_clause':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,153,155,172,173,197,200,203,205,],[24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,]),'until_clause':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,153,155,172,173,197,200,203,205,],[25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,]),'fname':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,155,172,173,197,200,203,205,],[26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,]),'io_redirect':([0,1,10,14,17,18,27,31,34,35,36,60,68,70,76,93,120,121,122,124,137,143,146,155,163,172,173,176,197,200,203,205,],[28,28,28,69,71,77,28,28,28,28,28,28,123,77,125,28,28,28,28,125,28,28,28,28,69,28,28,123,28,28,28,28,]),'assignment_word':([0,1,10,17,27,31,34,35,36,60,93,120,121,122,137,143,146,155,172,173,197,200,203,205,],[29,29,29,72,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,]),'for_word':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,153,155,172,173,197,200,203,205,],[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,]),'if_word':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,153,155,172,173,197,200,203,205,],[34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,]),'until_word':([0,1,10,27,31,34,35,36,60,93,120,121,122,137,143,146,153,155,172,173,197,200,203,205,],[36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,]),'io_file':([0,1,10,14,17,18,27,31,34,35,36,38,60,68,70,76,93,120,121,122,124,137,143,146,155,163,172,173,176,197,200,203,205,],[37,37,37,37,37,37,37,37,37,37,37,102,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,]),'io_here':([0,1,10,14,17,18,27,31,34,35,36,38,60,68,70,76,93,120,121,122,124,137,143,146,155,163,172,173,176,197,200,203,205,],[39,39,39,39,39,39,39,39,39,39,39,103,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,]),'maybe_assignment_word':([0,1,10,17,18,27,31,34,35,36,60,70,76,93,120,121,122,124,137,143,146,155,172,173,197,200,203,205,],[40,40,40,40,83,40,40,40,40,40,40,83,131,40,40,40,40,131,40,40,40,40,40,40,40,40,40,40,]),'maybe_for_word':([0,1,10,18,27,31,34,35,36,60,70,76,93,120,121,122,124,137,143,146,153,155,172,173,197,200,203,205,],[41,41,41,79,41,41,41,41,41,41,79,127,41,41,41,41,127,41,41,41,41,41,41,41,41,41,41,41,]),'maybe_if_word':([0,1,10,18,27,31,34,35,36,60,70,76,93,120,121,122,124,137,143,146,153,155,172,173,197,200,203,205,],[42,42,42,84,42,42,42,42,42,42,84,132,42,42,42,42,132,42,42,42,42,42,42,42,42,42,42,42,]),'maybe_until_word':([0,1,10,18,27,31,34,35,36,60,70,76,93,120,121,122,124,137,143,146,153,155,172,173,197,200,203,205,],[43,43,43,82,43,43,43,43,43,43,82,130,43,43,43,43,130,43,43,43,43,43,43,43,43,43,43,43,]),'separator':([5,92,139,],[59,137,155,]),'separator_op':([5,92,139,],[60,138,138,]),'redirect_list':([14,163,],[68,176,]),'cmd_word':([17,],[70,]),'token':([17,18,32,33,70,76,124,157,165,169,182,188,198,],[73,78,97,98,78,126,126,168,179,181,181,181,204,]),'cmd_suffix':([18,70,],[76,124,]),'maybe_done_word':([18,70,76,124,161,],[80,80,128,128,175,]),'maybe_do_word':([18,70,76,100,101,124,141,164,178,],[81,81,129,147,147,129,147,147,147,]),'maybe_then_word':([18,70,76,99,124,190,],[85,85,133,144,133,144,]),'compound_list':([27,31,34,35,36,143,146,172,173,197,200,205,],[91,95,99,100,101,160,161,190,191,202,206,211,]),'term':([27,31,34,35,36,93,143,146,172,173,197,200,203,205,],[92,92,92,92,92,139,92,92,92,92,92,92,139,92,]),'name':([32,],[96,]),'filename':([44,45,46,47,48,49,50,],[104,106,107,108,109,110,111,]),'here_end':([51,52,],[112,114,]),'linebreak':([60,64,65,66,96,98,135,138,159,166,197,202,205,207,208,211,215,216,],[116,120,121,122,141,142,153,116,169,180,201,209,210,213,214,217,218,219,]),'empty':([60,64,65,66,96,98,135,138,159,166,197,202,205,207,208,211,215,216,],[118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,]),'then_word':([99,190,],[143,200,]),'do_group':([100,101,141,164,178,],[145,148,156,177,192,]),'do_word':([100,101,141,164,178,],[146,146,146,146,146,]),'in':([141,142,],[157,159,]),'function_body':([153,],[162,]),'sequential_sep':([157,165,],[164,178,]),'wordlist':([157,],[165,]),'else_part':([160,206,],[170,212,]),'done_word':([161,],[174,]),'case_list':([169,],[182,]),'case_list_ns':([169,],[184,]),'case_item':([169,182,],[185,194,]),'case_item_ns':([169,182,],[186,195,]),'pattern':([169,182,188,],[187,187,199,]),}
+
+_lr_goto = { }
+for _k, _v in _lr_goto_items.items():
+   for _x,_y in zip(_v[0],_v[1]):
+       if not _x in _lr_goto: _lr_goto[_x] = { }
+       _lr_goto[_x][_k] = _y
+del _lr_goto_items
+_lr_productions = [
+  ("S' -> multiple_commands","S'",1,None,None,None),
+  ('multiple_commands -> newline_sequence','multiple_commands',1,'p_multiple_commands','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',128),
+  ('multiple_commands -> complete_command','multiple_commands',1,'p_multiple_commands','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',129),
+  ('multiple_commands -> multiple_commands complete_command','multiple_commands',2,'p_multiple_commands','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',130),
+  ('complete_command -> list separator','complete_command',2,'p_complete_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',140),
+  ('complete_command -> list','complete_command',1,'p_complete_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',141),
+  ('list -> list separator_op and_or','list',3,'p_list','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',148),
+  ('list -> and_or','list',1,'p_list','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',149),
+  ('and_or -> pipeline','and_or',1,'p_and_or','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',158),
+  ('and_or -> and_or AND_IF linebreak pipeline','and_or',4,'p_and_or','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',159),
+  ('and_or -> and_or OR_IF linebreak pipeline','and_or',4,'p_and_or','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',160),
+  ('maybe_bang_word -> Bang','maybe_bang_word',1,'p_maybe_bang_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',167),
+  ('pipeline -> pipe_sequence','pipeline',1,'p_pipeline','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',171),
+  ('pipeline -> bang_word pipe_sequence','pipeline',2,'p_pipeline','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',172),
+  ('pipe_sequence -> command','pipe_sequence',1,'p_pipe_sequence','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',179),
+  ('pipe_sequence -> pipe_sequence PIPE linebreak command','pipe_sequence',4,'p_pipe_sequence','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',180),
+  ('command -> simple_command','command',1,'p_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',187),
+  ('command -> compound_command','command',1,'p_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',188),
+  ('command -> compound_command redirect_list','command',2,'p_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',189),
+  ('command -> function_definition','command',1,'p_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',190),
+  ('compound_command -> brace_group','compound_command',1,'p_compound_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',209),
+  ('compound_command -> subshell','compound_command',1,'p_compound_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',210),
+  ('compound_command -> for_clause','compound_command',1,'p_compound_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',211),
+  ('compound_command -> case_clause','compound_command',1,'p_compound_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',212),
+  ('compound_command -> if_clause','compound_command',1,'p_compound_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',213),
+  ('compound_command -> while_clause','compound_command',1,'p_compound_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',214),
+  ('compound_command -> until_clause','compound_command',1,'p_compound_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',215),
+  ('subshell -> LPARENS compound_list RPARENS','subshell',3,'p_subshell','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',219),
+  ('compound_list -> term','compound_list',1,'p_compound_list','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',223),
+  ('compound_list -> newline_list term','compound_list',2,'p_compound_list','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',224),
+  ('compound_list -> term separator','compound_list',2,'p_compound_list','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',225),
+  ('compound_list -> newline_list term separator','compound_list',3,'p_compound_list','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',226),
+  ('term -> term separator and_or','term',3,'p_term','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',238),
+  ('term -> and_or','term',1,'p_term','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',239),
+  ('maybe_for_word -> For','maybe_for_word',1,'p_maybe_for_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',249),
+  ('for_clause -> for_word name linebreak do_group','for_clause',4,'p_for_clause','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',254),
+  ('for_clause -> for_word name linebreak in sequential_sep do_group','for_clause',6,'p_for_clause','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',255),
+  ('for_clause -> for_word name linebreak in wordlist sequential_sep do_group','for_clause',7,'p_for_clause','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',256),
+  ('name -> token','name',1,'p_name','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',273),
+  ('in -> In','in',1,'p_in','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',277),
+  ('wordlist -> wordlist token','wordlist',2,'p_wordlist','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',281),
+  ('wordlist -> token','wordlist',1,'p_wordlist','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',282),
+  ('case_clause -> Case token linebreak in linebreak case_list Esac','case_clause',7,'p_case_clause','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',289),
+  ('case_clause -> Case token linebreak in linebreak case_list_ns Esac','case_clause',7,'p_case_clause','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',290),
+  ('case_clause -> Case token linebreak in linebreak Esac','case_clause',6,'p_case_clause','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',291),
+  ('case_list_ns -> case_list case_item_ns','case_list_ns',2,'p_case_list_ns','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',300),
+  ('case_list_ns -> case_item_ns','case_list_ns',1,'p_case_list_ns','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',301),
+  ('case_list -> case_list case_item','case_list',2,'p_case_list','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',305),
+  ('case_list -> case_item','case_list',1,'p_case_list','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',306),
+  ('case_item_ns -> pattern RPARENS linebreak','case_item_ns',3,'p_case_item_ns','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',313),
+  ('case_item_ns -> pattern RPARENS compound_list linebreak','case_item_ns',4,'p_case_item_ns','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',314),
+  ('case_item_ns -> LPARENS pattern RPARENS linebreak','case_item_ns',4,'p_case_item_ns','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',315),
+  ('case_item_ns -> LPARENS pattern RPARENS compound_list linebreak','case_item_ns',5,'p_case_item_ns','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',316),
+  ('case_item -> pattern RPARENS linebreak DSEMI linebreak','case_item',5,'p_case_item','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',320),
+  ('case_item -> pattern RPARENS compound_list DSEMI linebreak','case_item',5,'p_case_item','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',321),
+  ('case_item -> LPARENS pattern RPARENS linebreak DSEMI linebreak','case_item',6,'p_case_item','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',322),
+  ('case_item -> LPARENS pattern RPARENS compound_list DSEMI linebreak','case_item',6,'p_case_item','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',323),
+  ('pattern -> token','pattern',1,'p_pattern','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',337),
+  ('pattern -> pattern PIPE token','pattern',3,'p_pattern','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',338),
+  ('maybe_if_word -> If','maybe_if_word',1,'p_maybe_if_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',345),
+  ('maybe_then_word -> Then','maybe_then_word',1,'p_maybe_then_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',350),
+  ('if_clause -> if_word compound_list then_word compound_list else_part Fi','if_clause',6,'p_if_clause','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',355),
+  ('if_clause -> if_word compound_list then_word compound_list Fi','if_clause',5,'p_if_clause','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',356),
+  ('else_part -> Elif compound_list then_word compound_list else_part','else_part',5,'p_else_part','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',363),
+  ('else_part -> Elif compound_list then_word compound_list','else_part',4,'p_else_part','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',364),
+  ('else_part -> Else compound_list','else_part',2,'p_else_part','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',365),
+  ('while_clause -> While compound_list do_group','while_clause',3,'p_while_clause','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',375),
+  ('maybe_until_word -> Until','maybe_until_word',1,'p_maybe_until_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',379),
+  ('until_clause -> until_word compound_list do_group','until_clause',3,'p_until_clause','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',384),
+  ('function_definition -> fname LPARENS RPARENS linebreak function_body','function_definition',5,'p_function_definition','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',388),
+  ('function_body -> compound_command','function_body',1,'p_function_body','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',392),
+  ('function_body -> compound_command redirect_list','function_body',2,'p_function_body','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',393),
+  ('fname -> TOKEN','fname',1,'p_fname','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',399),
+  ('brace_group -> Lbrace compound_list Rbrace','brace_group',3,'p_brace_group','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',403),
+  ('maybe_done_word -> Done','maybe_done_word',1,'p_maybe_done_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',407),
+  ('maybe_do_word -> Do','maybe_do_word',1,'p_maybe_do_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',412),
+  ('do_group -> do_word compound_list done_word','do_group',3,'p_do_group','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',416),
+  ('simple_command -> cmd_prefix cmd_word cmd_suffix','simple_command',3,'p_simple_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',421),
+  ('simple_command -> cmd_prefix cmd_word','simple_command',2,'p_simple_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',422),
+  ('simple_command -> cmd_prefix','simple_command',1,'p_simple_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',423),
+  ('simple_command -> cmd_name cmd_suffix','simple_command',2,'p_simple_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',424),
+  ('simple_command -> cmd_name','simple_command',1,'p_simple_command','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',425),
+  ('cmd_name -> TOKEN','cmd_name',1,'p_cmd_name','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',445),
+  ('cmd_word -> token','cmd_word',1,'p_cmd_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',449),
+  ('maybe_assignment_word -> ASSIGNMENT_WORD','maybe_assignment_word',1,'p_maybe_assignment_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',453),
+  ('cmd_prefix -> io_redirect','cmd_prefix',1,'p_cmd_prefix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',458),
+  ('cmd_prefix -> cmd_prefix io_redirect','cmd_prefix',2,'p_cmd_prefix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',459),
+  ('cmd_prefix -> assignment_word','cmd_prefix',1,'p_cmd_prefix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',460),
+  ('cmd_prefix -> cmd_prefix assignment_word','cmd_prefix',2,'p_cmd_prefix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',461),
+  ('cmd_suffix -> io_redirect','cmd_suffix',1,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',475),
+  ('cmd_suffix -> cmd_suffix io_redirect','cmd_suffix',2,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',476),
+  ('cmd_suffix -> token','cmd_suffix',1,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',477),
+  ('cmd_suffix -> cmd_suffix token','cmd_suffix',2,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',478),
+  ('cmd_suffix -> maybe_for_word','cmd_suffix',1,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',479),
+  ('cmd_suffix -> cmd_suffix maybe_for_word','cmd_suffix',2,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',480),
+  ('cmd_suffix -> maybe_done_word','cmd_suffix',1,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',481),
+  ('cmd_suffix -> cmd_suffix maybe_done_word','cmd_suffix',2,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',482),
+  ('cmd_suffix -> maybe_do_word','cmd_suffix',1,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',483),
+  ('cmd_suffix -> cmd_suffix maybe_do_word','cmd_suffix',2,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',484),
+  ('cmd_suffix -> maybe_until_word','cmd_suffix',1,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',485),
+  ('cmd_suffix -> cmd_suffix maybe_until_word','cmd_suffix',2,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',486),
+  ('cmd_suffix -> maybe_assignment_word','cmd_suffix',1,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',487),
+  ('cmd_suffix -> cmd_suffix maybe_assignment_word','cmd_suffix',2,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',488),
+  ('cmd_suffix -> maybe_if_word','cmd_suffix',1,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',489),
+  ('cmd_suffix -> cmd_suffix maybe_if_word','cmd_suffix',2,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',490),
+  ('cmd_suffix -> maybe_then_word','cmd_suffix',1,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',491),
+  ('cmd_suffix -> cmd_suffix maybe_then_word','cmd_suffix',2,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',492),
+  ('cmd_suffix -> maybe_bang_word','cmd_suffix',1,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',493),
+  ('cmd_suffix -> cmd_suffix maybe_bang_word','cmd_suffix',2,'p_cmd_suffix','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',494),
+  ('redirect_list -> io_redirect','redirect_list',1,'p_redirect_list','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',512),
+  ('redirect_list -> redirect_list io_redirect','redirect_list',2,'p_redirect_list','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',513),
+  ('io_redirect -> io_file','io_redirect',1,'p_io_redirect','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',520),
+  ('io_redirect -> IO_NUMBER io_file','io_redirect',2,'p_io_redirect','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',521),
+  ('io_redirect -> io_here','io_redirect',1,'p_io_redirect','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',522),
+  ('io_redirect -> IO_NUMBER io_here','io_redirect',2,'p_io_redirect','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',523),
+  ('io_file -> LESS filename','io_file',2,'p_io_file','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',530),
+  ('io_file -> LESSAND filename','io_file',2,'p_io_file','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',531),
+  ('io_file -> GREATER filename','io_file',2,'p_io_file','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',532),
+  ('io_file -> GREATAND filename','io_file',2,'p_io_file','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',533),
+  ('io_file -> DGREAT filename','io_file',2,'p_io_file','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',534),
+  ('io_file -> LESSGREAT filename','io_file',2,'p_io_file','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',535),
+  ('io_file -> CLOBBER filename','io_file',2,'p_io_file','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',536),
+  ('filename -> TOKEN','filename',1,'p_filename','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',542),
+  ('io_here -> DLESS here_end','io_here',2,'p_io_here','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',547),
+  ('io_here -> DLESSDASH here_end','io_here',2,'p_io_here','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',548),
+  ('here_end -> HERENAME TOKEN','here_end',2,'p_here_end','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',552),
+  ('newline_sequence -> newline_list','newline_sequence',1,'p_newline_sequence','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',556),
+  ('newline_list -> NEWLINE','newline_list',1,'p_newline_list','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',562),
+  ('newline_list -> newline_list NEWLINE','newline_list',2,'p_newline_list','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',563),
+  ('linebreak -> newline_list','linebreak',1,'p_linebreak','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',567),
+  ('linebreak -> empty','linebreak',1,'p_linebreak','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',568),
+  ('separator_op -> COMMA','separator_op',1,'p_separator_op','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',572),
+  ('separator_op -> COMMA COMMA','separator_op',2,'p_separator_op','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',573),
+  ('separator_op -> AMP','separator_op',1,'p_separator_op','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',574),
+  ('separator -> separator_op linebreak','separator',2,'p_separator','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',578),
+  ('separator -> newline_list','separator',1,'p_separator','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',579),
+  ('sequential_sep -> COMMA linebreak','sequential_sep',2,'p_sequential_sep','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',588),
+  ('sequential_sep -> newline_list','sequential_sep',1,'p_sequential_sep','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',589),
+  ('for_word -> maybe_for_word','for_word',1,'p_for_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',596),
+  ('if_word -> maybe_if_word','if_word',1,'p_if_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',600),
+  ('then_word -> maybe_then_word','then_word',1,'p_then_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',604),
+  ('done_word -> maybe_done_word','done_word',1,'p_done_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',608),
+  ('do_word -> maybe_do_word','do_word',1,'p_do_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',612),
+  ('until_word -> maybe_until_word','until_word',1,'p_until_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',616),
+  ('assignment_word -> maybe_assignment_word','assignment_word',1,'p_assignment_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',620),
+  ('bang_word -> maybe_bang_word','bang_word',1,'p_bang_word','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',624),
+  ('token -> TOKEN','token',1,'p_token','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',628),
+  ('token -> Fi','token',1,'p_token','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',629),
+  ('empty -> <empty>','empty',0,'p_empty','/home/lynq/T106_project/P50/P50_version/cap/zx297520v3/sources/poky/bitbake/lib/bb/pysh/pyshyacc.py',633),
+]
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/server/__pycache__/__init__.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/server/__pycache__/__init__.cpython-36.pyc
new file mode 100755
index 0000000..500d413
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/server/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/server/__pycache__/process.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/server/__pycache__/process.cpython-36.pyc
new file mode 100755
index 0000000..ad7326c
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/server/__pycache__/process.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/server/__pycache__/xmlrpcclient.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/server/__pycache__/xmlrpcclient.cpython-36.pyc
new file mode 100755
index 0000000..da116bd
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/server/__pycache__/xmlrpcclient.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/server/__pycache__/xmlrpcserver.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/server/__pycache__/xmlrpcserver.cpython-36.pyc
new file mode 100755
index 0000000..6fb0e35
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/server/__pycache__/xmlrpcserver.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/ui/__pycache__/__init__.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/ui/__pycache__/__init__.cpython-36.pyc
new file mode 100755
index 0000000..8de3b5f
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/ui/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/ui/__pycache__/knotty.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/ui/__pycache__/knotty.cpython-36.pyc
new file mode 100755
index 0000000..825f3f7
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/ui/__pycache__/knotty.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/ui/__pycache__/uievent.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/ui/__pycache__/uievent.cpython-36.pyc
new file mode 100755
index 0000000..fad0926
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/ui/__pycache__/uievent.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bb/ui/__pycache__/uihelper.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bb/ui/__pycache__/uihelper.cpython-36.pyc
new file mode 100755
index 0000000..423def7
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bb/ui/__pycache__/uihelper.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bs4/__pycache__/__init__.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bs4/__pycache__/__init__.cpython-36.pyc
new file mode 100755
index 0000000..9ce6396
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bs4/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bs4/__pycache__/dammit.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bs4/__pycache__/dammit.cpython-36.pyc
new file mode 100755
index 0000000..da86bd8
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bs4/__pycache__/dammit.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bs4/__pycache__/element.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bs4/__pycache__/element.cpython-36.pyc
new file mode 100755
index 0000000..ba94388
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bs4/__pycache__/element.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bs4/builder/__pycache__/__init__.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bs4/builder/__pycache__/__init__.cpython-36.pyc
new file mode 100755
index 0000000..3e48daf
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bs4/builder/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bs4/builder/__pycache__/_html5lib.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bs4/builder/__pycache__/_html5lib.cpython-36.pyc
new file mode 100755
index 0000000..1e15535
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bs4/builder/__pycache__/_html5lib.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bs4/builder/__pycache__/_htmlparser.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bs4/builder/__pycache__/_htmlparser.cpython-36.pyc
new file mode 100755
index 0000000..dc615aa
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bs4/builder/__pycache__/_htmlparser.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/bs4/builder/__pycache__/_lxml.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/bs4/builder/__pycache__/_lxml.cpython-36.pyc
new file mode 100755
index 0000000..1f61c92
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/bs4/builder/__pycache__/_lxml.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/hashserv/__pycache__/__init__.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/hashserv/__pycache__/__init__.cpython-36.pyc
new file mode 100755
index 0000000..5fdb0e4
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/hashserv/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/hashserv/__pycache__/client.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/hashserv/__pycache__/client.cpython-36.pyc
new file mode 100755
index 0000000..5cfd79f
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/hashserv/__pycache__/client.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/hashserv/__pycache__/server.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/hashserv/__pycache__/server.cpython-36.pyc
new file mode 100755
index 0000000..5a09692
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/hashserv/__pycache__/server.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/ply/__pycache__/__init__.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/ply/__pycache__/__init__.cpython-36.pyc
new file mode 100755
index 0000000..3d34059
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/ply/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/ply/__pycache__/lex.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/ply/__pycache__/lex.cpython-36.pyc
new file mode 100755
index 0000000..28da12d
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/ply/__pycache__/lex.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/ply/__pycache__/yacc.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/ply/__pycache__/yacc.cpython-36.pyc
new file mode 100755
index 0000000..00c749a
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/ply/__pycache__/yacc.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/progressbar/__pycache__/__init__.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/progressbar/__pycache__/__init__.cpython-36.pyc
new file mode 100755
index 0000000..6b2d217
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/progressbar/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/progressbar/__pycache__/compat.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/progressbar/__pycache__/compat.cpython-36.pyc
new file mode 100755
index 0000000..609e9b2
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/progressbar/__pycache__/compat.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/progressbar/__pycache__/progressbar.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/progressbar/__pycache__/progressbar.cpython-36.pyc
new file mode 100755
index 0000000..3c884a2
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/progressbar/__pycache__/progressbar.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/progressbar/__pycache__/widgets.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/progressbar/__pycache__/widgets.cpython-36.pyc
new file mode 100755
index 0000000..12d422a
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/progressbar/__pycache__/widgets.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/prserv/__pycache__/__init__.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/prserv/__pycache__/__init__.cpython-36.pyc
new file mode 100755
index 0000000..aa7ad89
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/prserv/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/prserv/__pycache__/db.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/prserv/__pycache__/db.cpython-36.pyc
new file mode 100755
index 0000000..c5c90f9
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/prserv/__pycache__/db.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/prserv/__pycache__/serv.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/prserv/__pycache__/serv.cpython-36.pyc
new file mode 100755
index 0000000..71abdbc
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/prserv/__pycache__/serv.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/bitbake/lib/simplediff/__pycache__/__init__.cpython-36.pyc b/cap/zx297520v3/sources/poky/bitbake/lib/simplediff/__pycache__/__init__.cpython-36.pyc
new file mode 100755
index 0000000..b8b9e47
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/bitbake/lib/simplediff/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/__pycache__/buildstats.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/__pycache__/buildstats.cpython-36.pyc
new file mode 100755
index 0000000..d7a727b
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/__pycache__/buildstats.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/__init__.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/__init__.cpython-36.pyc
new file mode 100755
index 0000000..c3b4b74
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/cachedpath.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/cachedpath.cpython-36.pyc
new file mode 100755
index 0000000..d7b4fa7
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/cachedpath.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/classextend.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/classextend.cpython-36.pyc
new file mode 100755
index 0000000..6414ed7
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/classextend.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/data.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/data.cpython-36.pyc
new file mode 100755
index 0000000..f487955
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/data.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/gpg_sign.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/gpg_sign.cpython-36.pyc
new file mode 100755
index 0000000..8166f97
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/gpg_sign.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/license.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/license.cpython-36.pyc
new file mode 100755
index 0000000..b3154dd
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/license.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/lsb.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/lsb.cpython-36.pyc
new file mode 100755
index 0000000..ac4fb51
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/lsb.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/maketype.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/maketype.cpython-36.pyc
new file mode 100755
index 0000000..2f287a0
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/maketype.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/manifest.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/manifest.cpython-36.pyc
new file mode 100755
index 0000000..22eef7b
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/manifest.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/package.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/package.cpython-36.pyc
new file mode 100755
index 0000000..35e0a83
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/package.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/package_manager.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/package_manager.cpython-36.pyc
new file mode 100755
index 0000000..0f750b2
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/package_manager.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/packagedata.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/packagedata.cpython-36.pyc
new file mode 100755
index 0000000..0980981
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/packagedata.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/packagegroup.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/packagegroup.cpython-36.pyc
new file mode 100755
index 0000000..05b743f
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/packagegroup.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/patch.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/patch.cpython-36.pyc
new file mode 100755
index 0000000..af1fcd7
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/patch.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/path.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/path.cpython-36.pyc
new file mode 100755
index 0000000..af44e1d
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/path.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/prservice.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/prservice.cpython-36.pyc
new file mode 100755
index 0000000..d50c53d
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/prservice.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/qa.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/qa.cpython-36.pyc
new file mode 100755
index 0000000..81cbd04
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/qa.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/reproducible.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/reproducible.cpython-36.pyc
new file mode 100755
index 0000000..733f812
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/reproducible.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/rootfs.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/rootfs.cpython-36.pyc
new file mode 100755
index 0000000..4a6dced
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/rootfs.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/sstatesig.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/sstatesig.cpython-36.pyc
new file mode 100755
index 0000000..9e6e4ba
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/sstatesig.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/types.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/types.cpython-36.pyc
new file mode 100755
index 0000000..e932b8c
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/types.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/utils.cpython-36.pyc b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/utils.cpython-36.pyc
new file mode 100755
index 0000000..533ee51
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/meta/lib/oe/__pycache__/utils.cpython-36.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/meta/recipes-extended/timezone/tzdata.bb b/cap/zx297520v3/sources/poky/meta/recipes-extended/timezone/tzdata.bb
old mode 100644
new mode 100755
index 0c7a836..cc6206a
--- a/cap/zx297520v3/sources/poky/meta/recipes-extended/timezone/tzdata.bb
+++ b/cap/zx297520v3/sources/poky/meta/recipes-extended/timezone/tzdata.bb
@@ -11,7 +11,7 @@
 
 S = "${WORKDIR}"
 
-DEFAULT_TIMEZONE ?= "Asia/Shanghai"
+DEFAULT_TIMEZONE ?= "Universal"
 INSTALL_TIMEZONE_FILE ?= "1"
 
 TZONES= "africa antarctica asia australasia europe northamerica southamerica  \
diff --git a/cap/zx297520v3/sources/poky/scripts/lib/__pycache__/argparse_oe.cpython-38.pyc b/cap/zx297520v3/sources/poky/scripts/lib/__pycache__/argparse_oe.cpython-38.pyc
new file mode 100755
index 0000000..f37b1b1
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/scripts/lib/__pycache__/argparse_oe.cpython-38.pyc
Binary files differ
diff --git a/cap/zx297520v3/sources/poky/scripts/lib/__pycache__/scriptutils.cpython-38.pyc b/cap/zx297520v3/sources/poky/scripts/lib/__pycache__/scriptutils.cpython-38.pyc
new file mode 100755
index 0000000..f54d71d
--- /dev/null
+++ b/cap/zx297520v3/sources/poky/scripts/lib/__pycache__/scriptutils.cpython-38.pyc
Binary files differ
diff --git a/cap/zx297520v3/zxic_code/zxic_binary/zxic_app_release/glibc/include/upi_ab/zxic_fota_ab_upgrade.h b/cap/zx297520v3/zxic_code/zxic_binary/zxic_app_release/glibc/include/upi_ab/zxic_fota_ab_upgrade.h
index 3757f91..61a0b7e 100755
--- a/cap/zx297520v3/zxic_code/zxic_binary/zxic_app_release/glibc/include/upi_ab/zxic_fota_ab_upgrade.h
+++ b/cap/zx297520v3/zxic_code/zxic_binary/zxic_app_release/glibc/include/upi_ab/zxic_fota_ab_upgrade.h
@@ -380,5 +380,21 @@
 int zxic_dual_config_package_path(char *upgrade_package_path, int length);
 
 
+/********************************************************************************
+ * º¯ÊýÃû:	zxic_dual_config_log_path
+ * ¹¦ÄÜÃèÊö: ÉèÖÃÉý¼¶log·¾¶
+ * ²ÎÊý˵Ã÷£º
+ * ÊäÈë²ÎÊý£º
+ *	 log_path Éý¼¶log·¾¶
+ *	 length Éý¼¶log·¾¶³¤¶È
+ * Êä³ö²ÎÊý: ÎÞ
+ * ·µ»ØÖµ£º
+ *	 Z_FOTA_SUCCESS ÉèÖóɹ¦
+ *	 Z_FOTA_FAIL ÉèÖÃʧ°Ü
+ * ×¢Òâ:
+ ********************************************************************************/
+int zxic_dual_config_log_path(char *log_path, int length);
+
+
 #endif // ZXIC_FOTA_AB_UPGRADE_H
 
diff --git a/cap/zx297520v3/zxic_code/zxic_binary/zxic_app_release/glibc/lib/libupi_ab.a b/cap/zx297520v3/zxic_code/zxic_binary/zxic_app_release/glibc/lib/libupi_ab.a
index 7bea67c..e2a8d68 100755
--- a/cap/zx297520v3/zxic_code/zxic_binary/zxic_app_release/glibc/lib/libupi_ab.a
+++ b/cap/zx297520v3/zxic_code/zxic_binary/zxic_app_release/glibc/lib/libupi_ab.a
Binary files differ
diff --git a/cap/zx297520v3/zxic_code/zxic_binary/zxic_app_release/glibc/lib/libupi_ab.so b/cap/zx297520v3/zxic_code/zxic_binary/zxic_app_release/glibc/lib/libupi_ab.so
index 2a46401..8b20ad8 100755
--- a/cap/zx297520v3/zxic_code/zxic_binary/zxic_app_release/glibc/lib/libupi_ab.so
+++ b/cap/zx297520v3/zxic_code/zxic_binary/zxic_app_release/glibc/lib/libupi_ab.so
Binary files differ
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-pinctrl.dtsi b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-pinctrl.dtsi
old mode 100644
new mode 100755
index 947790e..90f60d2
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-pinctrl.dtsi
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-pinctrl.dtsi
@@ -97,6 +97,26 @@
 		drive-strength = <STRENGTH_LEVEL_3>;
 		//bias-pull-up;
 //		input-schmitt-disable;
+	};
+	gpio_key0_pins: gpio_key0_pins {//gpio131
+		pins = "GPIO131";
+		function = "BGPIO";
+		//bias-pull-up;
+	};
+	ext_int12_pins: ext_int12 {
+		pins = "GPIO131";
+		function = "EXT_INT12";
+		bias-pull-up;
+	};
+	gpio_key1_pins: gpio_key1_pins {//gpio50
+		pins = "EXT_INT3";
+		function = "BGPIO";
+		//bias-pull-up;
+	};
+	ext_int3_pins: ext_int3 {
+		pins = "EXT_INT3";
+		function = "EXT_INT3";
+		bias-pull-up;
 	};	
 	ext_int4_pins: ext_int4 {
 		pins = "EXT_INT4";
@@ -213,6 +233,8 @@
 	sc_ext_int0: sc_ext_int0 {
 		pins = "EXT_INT0";
 		function = "EXT_INT0";
+		//bias-pull-up;
+		bias-disable;
 	};
 
 	sc_ext_int1: sc_ext_int1 {
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-vehicle_dc_ref.dts b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-vehicle_dc_ref.dts
old mode 100644
new mode 100755
index 68edc10..7d0c6aa
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-vehicle_dc_ref.dts
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-vehicle_dc_ref.dts
@@ -50,7 +50,7 @@
 	compatible = "zte,zx297520v3-vehicle-dc", "zte,zx297520v3";
 
 	chosen {
-		bootargs = "console=ttyS1,921600n8 earlycon rdinit=/sbin/init ubi.block=0,vol_rootfs root=/dev/ubiblock0_0 rootfstype=squashfs ";
+		bootargs = "console=ttyS1,921600n8 earlycon rdinit=/init_zxic ";
 	};
 
 };
@@ -129,6 +129,13 @@
 	pinctrl-0 = <&i2s0_pins>;
 //	status = "okay";
 };
+&codec_ti3104 {
+//	status = "okay";
+};	
+&zx29_ti3104 {
+	pinctrl-0 = <&i2s0_pins>;
+//	status = "okay";
+};
 &codec_nau8810 {
 	status = "okay";
 };	
@@ -140,6 +147,20 @@
 	pinctrl-0 = <&i2s1_pins>;
 //	status = "okay";
 };
+&codec_max9867 {
+//	status = "okay";
+};	
+&zx29_max9867 {
+	pinctrl-0 = <&i2s0_pins>;
+//	status = "okay";
+};
+&codec_es8311 {
+//	status = "okay";
+};	
+&zx29_es8311 {
+	pinctrl-0 = <&i2s0_pins>;
+//	status = "okay";
+};
 &gmac {
     port-nums = <1>;
     rmii-ports = <1>;
@@ -154,5 +175,35 @@
 &xp2xp {
 	//while using this module,should change gpio
     status = "disabled";
-};	
+};
+
+&gpio_key0 {
+	//autorepeat;
+	//interrupts = <GIC_SPI EX8_INT IRQ_TYPE_LEVEL_HIGH>;
+	interrupt-parent = <&ext8in1>;
+	interrupts = <EX12_INT IRQ_TYPE_LEVEL_LOW>;
+
+	gpios = <&bgpio 131 GPIO_ACTIVE_HIGH>;
+	pinctrl-names = "key_int" , "key_gpio";
+	pinctrl-0 = <&ext_int12_pins>;//8in1
+	pinctrl-1 = <&gpio_key0_pins>;				
+	
+	label = "GPIO Key USER1";//ap int
+	linux,code = <KEY_STOP>;
+	status = "okay";
+};
+&gpio_key1 {
+	//autorepeat;
+	interrupts = <GIC_SPI EX3_INT IRQ_TYPE_LEVEL_LOW>;
+	gpios = <&bgpio 50 GPIO_ACTIVE_HIGH>;
+	pinctrl-names = "key_int" , "key_gpio";
+	pinctrl-0 = <&ext_int3_pins>;
+	pinctrl-1 = <&gpio_key1_pins>;				
+	
+	label = "GPIO Key USER2";//flight mode
+	linux,code = <KEY_WAKEUP>;
+	status = "okay";
+};
+
+
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3.dtsi b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3.dtsi
old mode 100644
new mode 100755
index 239ce65..53f21ab
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3.dtsi
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3.dtsi
@@ -49,6 +49,7 @@
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 #include <dt-bindings/gpio/zx297520v3-gpio.h>
 #include <dt-bindings/sound/tlv320aic31xx-micbias.h>
+#include <dt-bindings/input/input.h>
 #include "zx297520v3-clock.dtsi"
 / {
 	compatible = "zte,zx297520v3";
@@ -82,6 +83,12 @@
 		codec_nau8810 = &codec_nau8810;		
 		zx29_nau8810 = &zx29_nau8810;
 		zx29_dummycodec = &zx29_dummycodec;
+		codec_ti3104 = &codec_ti3104;		
+		zx29_ti3104 = &zx29_ti3104;
+		codec_max9867 = &codec_max9867;		
+		zx29_max9867 = &zx29_max9867;	
+		codec_es8311 = &codec_es8311;		
+		zx29_es8311 = &zx29_es8311;		
 	};
 
 	cpus {
@@ -382,6 +389,10 @@
 			pmic:zx234290@12{
 				compatible = "zte,zx234290";
 				reg = <0x12>;
+				interrupts = <GIC_SPI EX0_INT IRQ_TYPE_EDGE_FALLING>;
+				gpios = <&bgpio 24 GPIO_ACTIVE_HIGH>;
+				pinctrl-names = "pmu_int";
+				pinctrl-0 = <&sc_ext_int0>;
 				status = "okay";
 			};	
 		};
@@ -440,6 +451,40 @@
 				pinctrl-0 = <&clk2_func_pins>;				
 				status = "disabled";
 			};	
+			codec_ti3104: ti3104@18 {         
+				compatible = "ti,tlv320aic3104";
+				reg = <0x18>;		
+				reset-gpios = <&bgpio 122 GPIO_ACTIVE_HIGH>;/*RST*/
+				ai3x-micbias-vg = <MICBIAS_2_0V>;
+
+				clocks = <&clkc CLKOUT1_CLK>;
+				clock-names = "clk_out";			
+				pinctrl-names = "clk_out","reset_gpio122";			
+				pinctrl-0 = <&clk1_func_pins>;
+				pinctrl-1 = <&codec_reset_pins>;
+				status = "disabled";
+			};
+			codec_max9867: max9867@18 {         
+				compatible = "maxim,max9867";
+				reg = <0x1A>;		
+				//reset-gpios = <&bgpio 122 GPIO_ACTIVE_HIGH>;/*RST*/
+				clock-names = "clk_out";	
+				clocks = <&clkc CLKOUT2_CLK>;		
+				pinctrl-names = "clk_out";			
+				pinctrl-0 = <&clk2_func_pins>;				
+				status = "disabled";
+			};	
+			codec_es8311: codec_es8311@18 {         
+				compatible = "everest,es8311";
+				reg = <0x1A>;		
+				//reset-gpios = <&bgpio 122 GPIO_ACTIVE_HIGH>;/*RST*/
+				clock-names = "clk_out";	
+				clocks = <&clkc CLKOUT2_CLK>;		
+				pinctrl-names = "clk_out";			
+				pinctrl-0 = <&clk2_func_pins>;				
+				status = "disabled";
+			};			
+							
 		};
 
 		gmac:gmac@1307000{
@@ -710,7 +755,19 @@
 			zxic,audio-codec = <&codec_ti3100>;
 			status = "disabled";
 		};
-             zx29_nau8810: zx29_nau8810{
+		zx29_ti3104: zx29_ti3104{
+			compatible = "zxic,zx29_ti3104";
+			pinctrl-names = "top_i2s";
+			pinctrl-0 = <&i2s0_pins>;
+			//pinctrl-0 = <&i2s1_pins>;
+			reg = <0x0 0x00140000 0x0 0x00001000>;
+			reg-names = "soc_sys";
+
+			zxic,i2s-controller = <&i2s0>;
+			zxic,audio-codec = <&codec_ti3104>;
+			status = "disabled";
+		};		
+        zx29_nau8810: zx29_nau8810{
 			compatible = "zxic,zx29_nau8810";
 			pinctrl-names = "top_i2s";
 			pinctrl-0 = <&i2s0_pins>;
@@ -732,6 +789,28 @@
 
 			zxic,i2s-controller = <&i2s0>;
 			status = "disabled";
+		};	
+        zx29_max9867: zx29_max9867{
+			compatible = "zxic,zx29_max9867";
+			pinctrl-names = "top_i2s";
+			pinctrl-0 = <&i2s0_pins>;
+			reg = <0x0 0x00140000 0x0 0x00001000>;
+			reg-names = "soc_sys";
+
+			zxic,i2s-controller = <&i2s0>;
+			zxic,audio-codec = <&codec_nau8810>;
+			status = "disabled";
+		};	
+        zx29_es8311: zx29_es8311{
+			compatible = "zxic,zx29_es8311";
+			pinctrl-names = "top_i2s";
+			pinctrl-0 = <&i2s0_pins>;
+			reg = <0x0 0x00140000 0x0 0x00001000>;
+			reg-names = "soc_sys";
+
+			zxic,i2s-controller = <&i2s0>;
+			zxic,audio-codec = <&codec_nau8810>;
+			status = "disabled";
 		};		
 		softwdt: softwdt@1301000 {
 			compatible = "zte,zx29-softwdt";
@@ -744,7 +823,18 @@
 			compatible = "zte,zx29-tsc";
 			reg = <0x0 IRAM_BASE_ADDR_TPC 0x0 0x400>;		
 			status = "okay";
-		};				
+		};
+		
+		gpio_key0: gpio_key0 {
+			compatible = "zxic,gpio-keys";
+			status = "disabled";
+		};
+		gpio_key1: gpio_key1 {
+			compatible = "zxic,gpio-keys";
+			status = "disabled";
+		};
+
+
 	};
 	firmware {
 		optee {
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/Kconfig b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/Kconfig
old mode 100644
new mode 100755
index 53b22e2..a61a693
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/Kconfig
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/Kconfig
@@ -54,6 +54,12 @@
 	  exhaustively with combinations of various buffer sizes and
 	  alignments.
 
+config ANDROID_BINDER_RPC
+	bool "Android Binder RPC Driver"
+	default n
+	help
+	  Binder is used in Android between two cores.  
+
 endif # if ANDROID
 
 endmenu
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/Makefile b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/Makefile
old mode 100644
new mode 100755
index c9d3d0c..1fb0d6d
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/Makefile
@@ -4,3 +4,4 @@
 obj-$(CONFIG_ANDROID_BINDERFS)		+= binderfs.o
 obj-$(CONFIG_ANDROID_BINDER_IPC)	+= binder.o binder_alloc.o
 obj-$(CONFIG_ANDROID_BINDER_IPC_SELFTEST) += binder_alloc_selftest.o
+obj-$(CONFIG_ANDROID_BINDER_RPC)	+= binder_rpc.o
\ No newline at end of file
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/binder.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/binder.c
old mode 100644
new mode 100755
index cfb1393..02d5f0c
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/binder.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/binder.c
@@ -75,6 +75,14 @@
 #include "binder_alloc.h"
 #include "binder_internal.h"
 #include "binder_trace.h"
+#ifdef CONFIG_ANDROID_BINDER_RPC
+#include <linux/mm.h>
+#include <linux/mman.h>
+
+#include <linux/delay.h>
+
+#include "binder_rpc.h"
+#endif
 
 static HLIST_HEAD(binder_deferred_list);
 static DEFINE_MUTEX(binder_deferred_lock);
@@ -89,6 +97,42 @@
 static struct dentry *binder_debugfs_dir_entry_root;
 static struct dentry *binder_debugfs_dir_entry_proc;
 static atomic_t binder_last_id;
+#ifdef CONFIG_ANDROID_BINDER_RPC
+/***********************************************************************
+        BINDER RPC DEFINE START
+***********************************************************************/
+#define BINDER_RPC_IGNORE_PRIV  (0xFFFFFFFF)
+
+struct binder_transaction;
+struct binder_proc;
+struct binder_thread;
+
+struct binder_transaction_entry {
+	struct list_head list;
+	struct binder_transaction *t;
+};
+struct binder_rpc_operations_struct binder_rpc_ops;
+
+struct binder_proc *rpc_own_proc = NULL;
+struct binder_proc *rpc_proc = NULL;
+struct binder_thread *rpc_thread = NULL;
+
+static int binder_init_rpc(struct binder_proc *own_proc);
+static int binder_deinit_rpc(void);
+
+static struct binder_proc *binder_get_rpcproc(void);
+static struct binder_thread *binder_get_rpcthread(void);
+static void binder_rpc_dequeue_todo(struct binder_transaction *t,
+			  struct binder_thread *target_thread);
+static void binder_rpc_enqueue_todo(struct binder_transaction *t,
+			   struct binder_thread *target_thread);
+
+static void binder_rpc_proc_check(struct binder_proc *proc);
+
+/***********************************************************************
+        BINDER RPC DEFINE END
+***********************************************************************/
+#endif
 
 static int proc_show(struct seq_file *m, void *unused);
 DEFINE_SHOW_ATTRIBUTE(proc);
@@ -595,6 +639,10 @@
 	 * during thread teardown
 	 */
 	spinlock_t lock;
+#ifdef CONFIG_ANDROID_BINDER_RPC	
+	/*¹ØÁªremote tr,ÓÃÓÚÏìӦʱ²éÕÒremote target*/
+	binder_uintptr_t remote_priv;
+#endif
 };
 
 /**
@@ -798,6 +846,13 @@
 {
 	BUG_ON(target_list == NULL);
 	BUG_ON(work->entry.next && !list_empty(&work->entry));
+#ifdef CONFIG_ANDROID_BINDER_RPC	
+	if(target_list == &((binder_get_rpcthread())->todo)) {
+		binder_debug(BINDER_DEBUG_THREADS,
+		     "%s: target_list is rpcthread todo.\n", __func__);
+		return;
+	}
+#endif	
 	list_add_tail(&work->entry, target_list);
 }
 
@@ -1770,6 +1825,12 @@
 					   struct binder_transaction *t)
 {
 	BUG_ON(!target_thread);
+#ifdef CONFIG_ANDROID_BINDER_RPC
+	if(target_thread == binder_get_rpcthread()) {
+		t->from = NULL;
+		return;
+	}
+#endif	
 	assert_spin_locked(&target_thread->proc->inner_lock);
 	BUG_ON(target_thread->transaction_stack != t);
 	BUG_ON(target_thread->transaction_stack->from != target_thread);
@@ -1949,7 +2010,20 @@
 				binder_enqueue_thread_work_ilocked(
 					target_thread,
 					&target_thread->reply_error.work);
+#ifdef CONFIG_ANDROID_BINDER_RPC		
+				if(target_thread == binder_get_rpcthread()) {
+					struct binder_rpc_operations_info ops_info;
+							
+					ops_info.tr = NULL;					
+					ops_info.cmd = target_thread->return_error.cmd;
+					ops_info.priv = t->remote_priv;
+
+					/*send error to remote thread*/
+					binder_rpc_ops.binder_return_error(&ops_info, 1);
+				}
+#else			
 				wake_up_interruptible(&target_thread->wait);
+#endif
 			} else {
 				/*
 				 * Cannot get here for normal operation, but
@@ -2474,6 +2548,8 @@
 	fp->handle = rdata.desc;
 	fp->cookie = 0;
 
+	binder_debug(BINDER_DEBUG_TRANSACTION,"%s debug_id:%d desc:%d strong:%d weak:%d \n",__FUNCTION__, 
+							rdata.debug_id, rdata.desc, rdata.strong, rdata.weak);
 	trace_binder_transaction_node_to_ref(t, node, &rdata);
 	binder_debug(BINDER_DEBUG_TRANSACTION,
 		     "        node %d u%016llx -> ref %d desc %d\n",
@@ -2862,6 +2938,9 @@
 	int t_debug_id = atomic_inc_return(&binder_last_id);
 	char *secctx = NULL;
 	u32 secctx_sz = 0;
+#ifdef CONFIG_ANDROID_BINDER_RPC	
+	u32 fp_handle = 0;	
+#endif
 
 	e = binder_transaction_log_add(&binder_transaction_log);
 	e->debug_id = t_debug_id;
@@ -2912,7 +2991,11 @@
 			return_error_line = __LINE__;
 			goto err_dead_binder;
 		}
-		if (target_thread->transaction_stack != in_reply_to) {
+		if (target_thread->transaction_stack != in_reply_to 
+#ifdef CONFIG_ANDROID_BINDER_RPC			
+			&& target_thread != binder_get_rpcthread()
+#endif			
+			) {
 			binder_user_error("%d:%d got reply transaction with bad target transaction stack %d, expected %d\n",
 				proc->pid, thread->pid,
 				target_thread->transaction_stack ?
@@ -2953,6 +3036,12 @@
 				return_error = BR_FAILED_REPLY;
 			}
 			binder_proc_unlock(proc);
+			#ifdef CONFIG_ANDROID_BINDER_RPC			
+			if(target_proc == binder_get_rpcproc()) {
+				target_thread = binder_get_rpcthread();
+			}
+			binder_debug(BINDER_DEBUG_TRANSACTION,"%s %d tr->target.handle:%d",__FUNCTION__,__LINE__,tr->target.handle);
+			#endif			
 		} else {
 			mutex_lock(&context->context_mgr_node_lock);
 			target_node = context->binder_context_mgr_node;
@@ -3017,8 +3106,12 @@
 			return_error_line = __LINE__;
 			goto err_bad_todo_list;
 		}
-
-		if (!(tr->flags & TF_ONE_WAY) && thread->transaction_stack) {
+		
+		if (!(tr->flags & TF_ONE_WAY) && thread->transaction_stack 
+#ifdef CONFIG_ANDROID_BINDER_RPC			
+			&& (thread != binder_get_rpcthread())
+#endif			
+		) {
 			struct binder_transaction *tmp;
 
 			tmp = thread->transaction_stack;
@@ -3261,8 +3354,13 @@
 		case BINDER_TYPE_BINDER:
 		case BINDER_TYPE_WEAK_BINDER: {
 			struct flat_binder_object *fp;
-
+			#ifdef CONFIG_ANDROID_BINDER_RPC			
+			binder_uintptr_t fp_binder = 0;
+			#endif					
 			fp = to_flat_binder_object(hdr);
+			#ifdef CONFIG_ANDROID_BINDER_RPC			
+			fp_binder = fp->binder;
+			#endif			
 			ret = binder_translate_binder(fp, t, thread);
 
 			if (ret < 0 ||
@@ -3275,6 +3373,48 @@
 				return_error_line = __LINE__;
 				goto err_translate_failed;
 			}
+#ifdef CONFIG_ANDROID_BINDER_RPC			
+			/*1.service add (tr->target.handle == 0 && tr->code == 3)
+			 *2.target_thread == rpc_thread,e.client add listen 
+			*/
+			if((proc != binder_get_rpcproc() || thread != binder_get_rpcthread()) &&
+				NULL != binder_rpc_ops.binder_broadcast) {
+				struct binder_rpc_operations_info ops_info;
+
+				struct binder_ref_data rdata;
+				struct binder_node *node = binder_get_node(thread->proc, fp_binder);
+
+				fp_handle = fp->handle;
+				/*tagret isn't rpc_proc. err?*/
+				/**/
+				binder_debug(BINDER_DEBUG_FAILED_TRANSACTION,"%s %d 0x%x debug_id:%d\n",__FUNCTION__,fp->handle, fp->hdr.type, node->debug_id);
+				if(NULL != node &&
+					((tr->target.handle == 0 && tr->code == ADD_SERVICE_TRANSACTION))) {
+					ret = binder_inc_ref_for_node(binder_get_rpcproc(), node, true, &thread->todo, &rdata);
+					if (!ret) {
+						fp_handle = rdata.desc;
+
+						ops_info.cmd = BC_TRANSACTION;
+						ops_info.tr = tr;
+						ops_info.priv = BINDER_RPC_IGNORE_PRIV;
+						binder_debug(BINDER_DEBUG_FAILED_TRANSACTION,"%s debug_id:%d desc:%d strong:%d weak:%d \n",__FUNCTION__, 
+							rdata.debug_id, rdata.desc, rdata.strong, rdata.weak);
+						if(0 != binder_rpc_ops.binder_broadcast(&ops_info, fp_handle)) {
+							binder_dec_ref_for_handle(binder_get_rpcproc(), fp_handle, true, &rdata);
+							binder_user_error("%s binder_broadcast fail. \n",__FUNCTION__);
+						}
+					}
+					else {												
+						binder_user_error("%s rpc_proc binder_inc_ref_for_node fail,ret=%d. \n",__FUNCTION__, ret);
+					}
+
+					binder_put_node(node);
+				}
+				/*else {
+					binder_user_error("%s binder_get_node fail. \n",__FUNCTION__);
+				}*/													
+			}
+#endif				
 		} break;
 		case BINDER_TYPE_HANDLE:
 		case BINDER_TYPE_WEAK_HANDLE: {
@@ -3432,11 +3572,36 @@
 			goto err_dead_proc_or_thread;
 		}
 		BUG_ON(t->buffer->async_transaction != 0);
-		binder_pop_transaction_ilocked(target_thread, in_reply_to);
-		binder_enqueue_thread_work_ilocked(target_thread, &t->work);
-		binder_inner_proc_unlock(target_proc);
-		wake_up_interruptible_sync(&target_thread->wait);
-		binder_free_transaction(in_reply_to);
+#ifdef CONFIG_ANDROID_BINDER_RPC		
+		if(target_thread == binder_get_rpcthread() && target_proc == binder_get_rpcproc()) {
+			binder_rpc_dequeue_todo(in_reply_to, target_thread);
+			if(NULL != binder_rpc_ops.binder_reply) {
+				struct binder_rpc_operations_info ops_info;
+				
+				ops_info.cmd = BC_REPLY;
+				ops_info.tr = tr;
+				ops_info.priv = in_reply_to->remote_priv;
+				binder_rpc_ops.binder_reply(&ops_info, fp_handle);
+
+				/*free t*/
+				binder_free_txn_fixups(t);
+				trace_binder_transaction_failed_buffer_release(t->buffer);
+				t->buffer->transaction = NULL;
+				binder_alloc_free_buf(&target_proc->alloc, t->buffer);
+				binder_free_transaction(t);
+			}
+			binder_inner_proc_unlock(target_proc);
+		}
+		else {
+#endif			
+			binder_pop_transaction_ilocked(target_thread, in_reply_to);
+			binder_enqueue_thread_work_ilocked(target_thread, &t->work);
+			binder_inner_proc_unlock(target_proc);
+			wake_up_interruptible_sync(&target_thread->wait);
+#ifdef CONFIG_ANDROID_BINDER_RPC			
+		}
+#endif		
+		binder_free_transaction(in_reply_to);		
 	} else if (!(t->flags & TF_ONE_WAY)) {
 		BUG_ON(t->buffer->async_transaction != 0);
 		binder_inner_proc_lock(proc);
@@ -3452,18 +3617,66 @@
 		t->from_parent = thread->transaction_stack;
 		thread->transaction_stack = t;
 		binder_inner_proc_unlock(proc);
-		if (!binder_proc_transaction(t, target_proc, target_thread)) {
-			binder_inner_proc_lock(proc);
-			binder_pop_transaction_ilocked(thread, t);
-			binder_inner_proc_unlock(proc);
-			goto err_dead_proc_or_thread;
+#ifdef CONFIG_ANDROID_BINDER_RPC
+		if((target_proc == binder_get_rpcproc() && target_thread == binder_get_rpcthread()) &&
+			NULL != binder_rpc_ops.binder_transaction) {
+			struct binder_node *target_node = t->buffer->target_node;
+			struct binder_rpc_operations_info ops_info;
+				
+			ops_info.cmd = BC_TRANSACTION;
+			ops_info.tr = tr;
+			ops_info.priv = (binder_uintptr_t)t;
+			
+			binder_rpc_enqueue_todo(t, target_thread);
+			if(0 != binder_rpc_ops.binder_transaction(&ops_info,fp_handle, (void *)target_node->ptr, (void *)target_node->cookie)) {
+				binder_rpc_dequeue_todo(t, target_thread);
+			}
 		}
+		else {			
+#endif			
+			if (!binder_proc_transaction(t, target_proc, target_thread)) {
+				binder_inner_proc_lock(proc);
+				binder_pop_transaction_ilocked(thread, t);
+				binder_inner_proc_unlock(proc);
+				goto err_dead_proc_or_thread;
+			}
+#ifdef CONFIG_ANDROID_BINDER_RPC			
+		}
+#endif		
 	} else {
 		BUG_ON(target_node == NULL);
 		BUG_ON(t->buffer->async_transaction != 1);
 		binder_enqueue_thread_work(thread, tcomplete);
-		if (!binder_proc_transaction(t, target_proc, NULL))
-			goto err_dead_proc_or_thread;
+#ifdef CONFIG_ANDROID_BINDER_RPC		
+		binder_debug(BINDER_DEBUG_FAILED_TRANSACTION,"%s %d",__FUNCTION__,__LINE__);
+		if((target_proc == binder_get_rpcproc() && target_thread == binder_get_rpcthread()) &&
+			NULL != binder_rpc_ops.binder_transaction) {
+			struct binder_node *target_node = t->buffer->target_node;
+			struct binder_rpc_operations_info ops_info;
+				
+			ops_info.cmd = BC_TRANSACTION;
+			ops_info.tr = tr;
+			ops_info.priv = (binder_uintptr_t)t;
+
+			binder_rpc_enqueue_todo(t, target_thread);
+			if(0 != binder_rpc_ops.binder_transaction(&ops_info,fp_handle, (void *)target_node->ptr, (void *)target_node->cookie)) {
+				binder_rpc_dequeue_todo(t, target_thread);
+			}
+
+			/*free t*/
+			binder_free_txn_fixups(t);
+			trace_binder_transaction_failed_buffer_release(t->buffer);
+			t->buffer->transaction = NULL;
+			binder_alloc_free_buf(&target_proc->alloc, t->buffer);
+			binder_free_transaction(t);
+		}
+		else {
+#endif			
+			if (!binder_proc_transaction(t, target_proc, NULL))
+				goto err_dead_proc_or_thread;
+#ifdef CONFIG_ANDROID_BINDER_RPC			
+		}
+#endif		
 	}
 	if (target_thread)
 		binder_thread_dec_tmpref(target_thread);
@@ -5081,6 +5294,11 @@
 		ret = binder_ioctl_set_ctx_mgr(filp, NULL);
 		if (ret)
 			goto err;
+#ifdef CONFIG_ANDROID_BINDER_RPC
+		if(NULL == binder_get_rpcproc()) {
+			binder_init_rpc(proc);
+		}
+#endif
 		break;
 	case BINDER_THREAD_EXIT:
 		binder_debug(BINDER_DEBUG_THREADS, "%d:%d exit\n",
@@ -5352,7 +5570,11 @@
 	}
 
 	binder_defer_work(proc, BINDER_DEFERRED_RELEASE);
-
+#ifdef CONFIG_ANDROID_BINDER_RPC	
+	if(proc == rpc_own_proc) {
+		binder_deinit_rpc();
+	}
+#endif	
 	return 0;
 }
 
@@ -5467,6 +5689,11 @@
 
 		node = rb_entry(n, struct binder_node, rb_node);
 		nodes++;
+#ifdef CONFIG_ANDROID_BINDER_RPC
+		if(binder_rpc_ops.binder_release) {
+			binder_rpc_ops.binder_release((void *)proc, (void *)node);
+		}
+#endif		
 		/*
 		 * take a temporary ref on the node before
 		 * calling binder_node_release() which will either
@@ -5546,7 +5773,1074 @@
 	}
 	mutex_unlock(&binder_deferred_lock);
 }
+#ifdef CONFIG_ANDROID_BINDER_RPC
+/***********************************************************************
+        BINDER RPC API START
+***********************************************************************/
+static int binder_init_rpc(struct binder_proc *own_proc)
+{
+	struct binder_proc *proc;
+	unsigned long unused;
+	unsigned long mmap_base;
+	unsigned long mmap_size;
 
+	struct file *pfile = filp_open("/dev/binder",O_RDWR,0);
+	
+	if(NULL == pfile) {
+		binder_user_error("%s: filp_open fail.\n", __func__);
+		return -1;
+	}
+	proc = pfile->private_data;
+
+	mmap_size = 16*PAGE_SIZE;
+	mmap_base = do_mmap(pfile, 0, mmap_size,
+				       PROT_READ,
+				       MAP_PRIVATE | MAP_NORESERVE, 0, &unused, NULL);
+	
+	rpc_proc = proc;
+	rpc_own_proc = own_proc;
+	return binder_rpc_init((void *)proc, pfile, &binder_rpc_ops);
+}
+
+static int binder_deinit_rpc(void)
+{
+	struct binder_proc *proc = binder_get_rpcproc();
+	struct binder_alloc *alloc = &proc->alloc;
+	struct vm_area_struct *vma = alloc->vma;
+
+	binder_debug(BINDER_DEBUG_OPEN_CLOSE,"%s rpc proc %d release.\n",__FUNCTION__, proc->pid);
+	binder_rpc_deinit(vma);	
+
+	rpc_proc = NULL;
+	rpc_own_proc = NULL;
+	return 0;	
+}
+
+static struct binder_proc *binder_get_rpcproc(void)
+{
+	return rpc_proc;
+}
+static struct binder_thread *binder_get_rpcthread(void)
+{
+	return rpc_thread;
+}
+
+/*ÓÃÓÚÌí¼ÓÉÏÐÐbinder_transactionµ½target_thread->todoÁ´±í*/
+static void binder_rpc_enqueue_todo(struct binder_transaction *t,
+			   struct binder_thread *target_thread)
+{
+	struct binder_transaction_entry *entry;
+	struct list_head *target_list = &target_thread->todo;
+	
+	BUG_ON(target_list == NULL || t == NULL);
+
+	entry = kzalloc(sizeof(*entry), GFP_KERNEL);
+	if (entry == NULL) {
+		return;
+	}
+	entry->t = t;
+
+	binder_inner_proc_lock(target_thread->proc);
+	list_add_tail(&entry->list, target_list);
+	binder_inner_proc_unlock(target_thread->proc);
+	binder_debug(BINDER_DEBUG_TRANSACTION, "%s add %x to thread(%d) todo", __FUNCTION__, t, target_thread->pid);
+}
+/*ÓÃÓÚɾ³ýÉÏÐÐbinder_transaction½Úµã*/				   
+static void binder_rpc_dequeue_todo(struct binder_transaction *t,
+			  struct binder_thread *target_thread)
+{
+	struct binder_transaction_entry *entry,*tmp_entry;
+	struct binder_transaction *tmp_t;
+	struct list_head *target_list = &target_thread->todo;
+
+	binder_inner_proc_lock(target_thread->proc);
+	list_for_each_entry_safe(entry,tmp_entry,target_list,list) {
+		tmp_t = entry->t;
+		if(t == tmp_t) {
+			list_del(&entry->list);
+			kfree(entry);
+			binder_inner_proc_unlock(target_thread->proc);
+			binder_debug(BINDER_DEBUG_TRANSACTION, "%s del %x from thread(%d) todo", __FUNCTION__, t, target_thread->pid);
+			return;
+		}
+	}
+	binder_inner_proc_unlock(target_thread->proc);
+}
+/*ÓÃÓÚ²éÕÒÆ¥ÅäÏÂÐÐBC_REPLYÃüÁîʱbinder_transaction*/				  
+static struct binder_transaction *binder_rpc_find_todo_by_priv(binder_uintptr_t priv,
+			   											struct binder_thread *target_thread)
+{
+	struct binder_transaction_entry *entry,*tmp_entry;
+	struct binder_transaction *tmp_t;
+	struct list_head *target_list = &target_thread->todo;
+
+	binder_inner_proc_lock(target_thread->proc);
+	list_for_each_entry_safe(entry,tmp_entry,target_list,list) {
+		tmp_t = entry->t;
+		if(priv == (binder_uintptr_t)tmp_t) {
+			list_del(&entry->list);
+			kfree(entry);
+			binder_inner_proc_unlock(target_thread->proc);
+			binder_debug(BINDER_DEBUG_TRANSACTION, "%s del %x from thread(%d) todo", __FUNCTION__, priv, target_thread->pid);
+			return tmp_t;
+		}
+	}
+
+	binder_inner_proc_unlock(target_thread->proc);
+	return NULL;
+}
+													
+static void binder_rpc_proc_check(struct binder_proc *proc)
+{
+	struct rb_node *n;
+
+	binder_proc_lock(proc);
+	for (n = rb_first(&proc->refs_by_desc);
+		     n != NULL;
+		     n = rb_next(n)) {
+		struct binder_ref *ref;
+
+		ref = rb_entry(n, struct binder_ref, rb_node_desc);	
+		binder_debug(BINDER_DEBUG_OPEN_CLOSE,"%s %d debug_id:%d desc:%d strong:%d weak:%d \n",__FUNCTION__,proc->pid, 
+									ref->data.debug_id,ref->data.desc,ref->data.strong,ref->data.weak);
+	}
+	binder_proc_unlock(proc);
+}
+
+void *binder_rpc_get_thread(void *brpc_proc)
+{
+	rpc_thread = binder_get_thread(brpc_proc);
+
+	return (void *)rpc_thread;
+}
+int binder_rpc_thread_write(void *brpc_proc,
+			binder_uintptr_t brpc_buffer, size_t size,
+			binder_size_t *consumed)
+{
+	struct binder_proc *proc = brpc_proc;
+	struct binder_thread *thread = binder_get_thread(proc);
+
+	return binder_thread_write(proc, thread, brpc_buffer, size, consumed);
+}
+
+void binder_rpc_transaction(void *prpc_proc,
+				   void *prpc_thread,
+				   struct binder_transaction_data *tr, int reply,
+				   binder_size_t extra_buffers_size,
+				   binder_uintptr_t priv)
+{
+	struct binder_proc *proc = (struct binder_proc *)prpc_proc;
+	struct binder_thread *thread = (struct binder_thread *)prpc_thread;	
+	int ret;
+	struct binder_transaction *t;
+	struct binder_work *w;
+	struct binder_work *tcomplete;
+	binder_size_t buffer_offset = 0;
+	binder_size_t off_start_offset, off_end_offset;
+	binder_size_t off_min;
+	binder_size_t sg_buf_offset, sg_buf_end_offset;
+	struct binder_proc *target_proc = NULL;
+	struct binder_thread *target_thread = NULL;
+	struct binder_node *target_node = NULL;
+	struct binder_transaction *in_reply_to = NULL;
+	struct binder_transaction_log_entry *e;
+	uint32_t return_error = 0;
+	uint32_t return_error_param = 0;
+	uint32_t return_error_line = 0;
+	binder_size_t last_fixup_obj_off = 0;
+	binder_size_t last_fixup_min_off = 0;
+	struct binder_context *context = proc->context;
+	int t_debug_id = atomic_inc_return(&binder_last_id);
+	char *secctx = NULL;
+	u32 secctx_sz = 0;
+
+	/*ignore binder_rpc_ops.binder_broadcast reply*/
+	if(reply && (priv == BINDER_RPC_IGNORE_PRIV)) {
+		return;
+	}
+	
+	e = binder_transaction_log_add(&binder_transaction_log);
+	e->debug_id = t_debug_id;
+	e->call_type = reply ? 2 : !!(tr->flags & TF_ONE_WAY);
+	e->from_proc = proc->pid;
+	e->from_thread = thread->pid;
+	e->target_handle = tr->target.handle;
+	e->data_size = tr->data_size;
+	e->offsets_size = tr->offsets_size;
+	strscpy(e->context_name, proc->context->name, BINDERFS_MAX_NAME);
+
+	if (reply) {
+		binder_inner_proc_lock(proc);
+		if((thread == binder_get_rpcthread() && proc == binder_get_rpcproc())) {
+			in_reply_to = binder_rpc_find_todo_by_priv(priv, thread);			
+			if(NULL == in_reply_to) {
+				panic("binder_rpc_transaction NULL == in_reply_to\n");
+			}
+		}
+		/*else {			
+			in_reply_to = thread->transaction_stack;
+		}*/
+		if (in_reply_to == NULL) {
+			binder_inner_proc_unlock(proc);
+			binder_user_error("%d:%d got reply transaction with no transaction stack\n",
+					  proc->pid, thread->pid);
+			return_error = BR_FAILED_REPLY;
+			return_error_param = -EPROTO;
+			return_error_line = __LINE__;
+			goto err_empty_call_stack;
+		}
+		if (in_reply_to->to_thread != thread) {
+			spin_lock(&in_reply_to->lock);
+			binder_user_error("%d:%d got reply transaction with bad transaction stack, transaction %d has target %d:%d\n",
+				proc->pid, thread->pid, in_reply_to->debug_id,
+				in_reply_to->to_proc ?
+				in_reply_to->to_proc->pid : 0,
+				in_reply_to->to_thread ?
+				in_reply_to->to_thread->pid : 0);
+			spin_unlock(&in_reply_to->lock);
+			binder_inner_proc_unlock(proc);
+			return_error = BR_FAILED_REPLY;
+			return_error_param = -EPROTO;
+			return_error_line = __LINE__;
+			in_reply_to = NULL;
+			goto err_bad_call_stack;
+		}
+		//thread->transaction_stack = in_reply_to->to_parent;
+		binder_inner_proc_unlock(proc);
+		binder_set_nice(in_reply_to->saved_priority);
+		target_thread = binder_get_txn_from_and_acq_inner(in_reply_to);
+		if (target_thread == NULL) {
+			/* annotation for sparse */
+			__release(&target_thread->proc->inner_lock);
+			return_error = BR_DEAD_REPLY;
+			return_error_line = __LINE__;
+			goto err_dead_binder;
+		}
+		if (target_thread->transaction_stack != in_reply_to) {
+			binder_user_error("%d:%d got reply transaction with bad target transaction stack %d, expected %d\n",
+				proc->pid, thread->pid,
+				target_thread->transaction_stack ?
+				target_thread->transaction_stack->debug_id : 0,
+				in_reply_to->debug_id);
+			binder_inner_proc_unlock(target_thread->proc);
+			return_error = BR_FAILED_REPLY;
+			return_error_param = -EPROTO;
+			return_error_line = __LINE__;
+			in_reply_to = NULL;
+			target_thread = NULL;
+			goto err_dead_binder;
+		}
+		target_proc = target_thread->proc;
+		target_proc->tmp_ref++;
+		binder_inner_proc_unlock(target_thread->proc);
+	} else {
+		if (tr->target.handle) {
+			struct binder_ref *ref;
+
+			/*
+			 * There must already be a strong ref
+			 * on this node. If so, do a strong
+			 * increment on the node to ensure it
+			 * stays alive until the transaction is
+			 * done.
+			 */
+			binder_proc_lock(proc);
+			ref = binder_get_ref_olocked(proc, tr->target.handle,
+							 true);
+			if (ref) {
+				target_node = binder_get_node_refs_for_txn(
+						ref->node, &target_proc,
+						&return_error);
+			} else {
+				binder_user_error("%d:%d got transaction to invalid handle\n",
+						  proc->pid, thread->pid);
+				return_error = BR_FAILED_REPLY;
+			}
+			binder_proc_unlock(proc);
+		} else {
+			mutex_lock(&context->context_mgr_node_lock);
+			target_node = context->binder_context_mgr_node;
+			if (target_node)
+				target_node = binder_get_node_refs_for_txn(
+						target_node, &target_proc,
+						&return_error);
+			else
+				return_error = BR_DEAD_REPLY;
+			mutex_unlock(&context->context_mgr_node_lock);
+			if (target_node && target_proc->pid == proc->pid && thread != binder_get_rpcthread()) {
+				binder_user_error("%d:%d got transaction to context manager from process owning it\n",
+						  proc->pid, thread->pid);
+				return_error = BR_FAILED_REPLY;
+				return_error_param = -EINVAL;
+				return_error_line = __LINE__;
+				goto err_invalid_target_handle;
+			}
+		}
+		if (!target_node) {
+			/*
+			 * return_error is set above
+			 */
+			return_error_param = -EINVAL;
+			return_error_line = __LINE__;
+			goto err_dead_binder;
+		}
+		e->to_node = target_node->debug_id;
+		if (WARN_ON(proc == target_proc)) {
+			return_error = BR_FAILED_REPLY;
+			return_error_param = -EINVAL;
+			return_error_line = __LINE__;
+			goto err_invalid_target_handle;
+		}
+		if (security_binder_transaction(proc->cred,
+						target_proc->cred) < 0) {
+			return_error = BR_FAILED_REPLY;
+			return_error_param = -EPERM;
+			return_error_line = __LINE__;
+			goto err_invalid_target_handle;
+		}
+		binder_inner_proc_lock(proc);
+
+		w = list_first_entry_or_null(&thread->todo,
+						 struct binder_work, entry);
+		if (!(tr->flags & TF_ONE_WAY) && w &&
+			w->type == BINDER_WORK_TRANSACTION) {
+			/*
+			 * Do not allow new outgoing transaction from a
+			 * thread that has a transaction at the head of
+			 * its todo list. Only need to check the head
+			 * because binder_select_thread_ilocked picks a
+			 * thread from proc->waiting_threads to enqueue
+			 * the transaction, and nothing is queued to the
+			 * todo list while the thread is on waiting_threads.
+			 */
+			binder_user_error("%d:%d new transaction not allowed when there is a transaction on thread todo\n",
+					  proc->pid, thread->pid);
+			binder_inner_proc_unlock(proc);
+			return_error = BR_FAILED_REPLY;
+			return_error_param = -EPROTO;
+			return_error_line = __LINE__;
+			goto err_bad_todo_list;
+		}
+
+		if (!(tr->flags & TF_ONE_WAY) && thread->transaction_stack && (thread != binder_get_rpcthread())) {
+			struct binder_transaction *tmp;
+
+			tmp = thread->transaction_stack;
+			if (tmp->to_thread != thread) {
+				spin_lock(&tmp->lock);
+				binder_user_error("%d:%d got new transaction with bad transaction stack, transaction %d has target %d:%d\n",
+					proc->pid, thread->pid, tmp->debug_id,
+					tmp->to_proc ? tmp->to_proc->pid : 0,
+					tmp->to_thread ?
+					tmp->to_thread->pid : 0);
+				spin_unlock(&tmp->lock);
+				binder_inner_proc_unlock(proc);
+				return_error = BR_FAILED_REPLY;
+				return_error_param = -EPROTO;
+				return_error_line = __LINE__;
+				goto err_bad_call_stack;
+			}
+			while (tmp) {
+				struct binder_thread *from;
+
+				spin_lock(&tmp->lock);
+				from = tmp->from;
+				if (from && from->proc == target_proc) {
+					atomic_inc(&from->tmp_ref);
+					target_thread = from;
+					spin_unlock(&tmp->lock);
+					break;
+				}
+				spin_unlock(&tmp->lock);
+				tmp = tmp->from_parent;
+			}
+		}
+		binder_inner_proc_unlock(proc);
+	}
+	if (target_thread)
+		e->to_thread = target_thread->pid;
+	e->to_proc = target_proc->pid;
+
+	/* TODO: reuse incoming transaction for reply */
+	t = kzalloc(sizeof(*t), GFP_KERNEL);
+	if (t == NULL) {
+		return_error = BR_FAILED_REPLY;
+		return_error_param = -ENOMEM;
+		return_error_line = __LINE__;
+		goto err_alloc_t_failed;
+	}
+	INIT_LIST_HEAD(&t->fd_fixups);
+	binder_stats_created(BINDER_STAT_TRANSACTION);
+	spin_lock_init(&t->lock);
+
+	tcomplete = kzalloc(sizeof(*tcomplete), GFP_KERNEL);
+	if (tcomplete == NULL) {
+		return_error = BR_FAILED_REPLY;
+		return_error_param = -ENOMEM;
+		return_error_line = __LINE__;
+		goto err_alloc_tcomplete_failed;
+	}
+	binder_stats_created(BINDER_STAT_TRANSACTION_COMPLETE);
+
+	t->debug_id = t_debug_id;
+
+	if (reply)
+		binder_debug(BINDER_DEBUG_TRANSACTION,
+				 "%d:%d BC_REPLY %d -> %d:%d, data %016llx-%016llx size %lld-%lld-%lld\n",
+				 proc->pid, thread->pid, t->debug_id,
+				 target_proc->pid, target_thread->pid,
+				 (u64)tr->data.ptr.buffer,
+				 (u64)tr->data.ptr.offsets,
+				 (u64)tr->data_size, (u64)tr->offsets_size,
+				 (u64)extra_buffers_size);
+	else
+		binder_debug(BINDER_DEBUG_TRANSACTION,
+				 "%d:%d BC_TRANSACTION %d -> %d - node %d, data %016llx-%016llx size %lld-%lld-%lld\n",
+				 proc->pid, thread->pid, t->debug_id,
+				 target_proc->pid, target_node->debug_id,
+				 (u64)tr->data.ptr.buffer,
+				 (u64)tr->data.ptr.offsets,
+				 (u64)tr->data_size, (u64)tr->offsets_size,
+				 (u64)extra_buffers_size);
+
+	if (!reply && !(tr->flags & TF_ONE_WAY))
+		t->from = thread;
+	else
+		t->from = NULL;
+	t->sender_euid = task_euid(proc->tsk);
+	t->to_proc = target_proc;
+	t->to_thread = target_thread;
+	t->code = tr->code;
+	t->flags = tr->flags;
+	t->priority = task_nice(current);
+
+	if (target_node && target_node->txn_security_ctx) {
+		u32 secid;
+		size_t added_size;
+
+		security_cred_getsecid(proc->cred, &secid);
+		ret = security_secid_to_secctx(secid, &secctx, &secctx_sz);
+		if (ret) {
+			return_error = BR_FAILED_REPLY;
+			return_error_param = ret;
+			return_error_line = __LINE__;
+			goto err_get_secctx_failed;
+		}
+		added_size = ALIGN(secctx_sz, sizeof(u64));
+		extra_buffers_size += added_size;
+		if (extra_buffers_size < added_size) {
+			/* integer overflow of extra_buffers_size */
+			return_error = BR_FAILED_REPLY;
+			return_error_param = EINVAL;
+			return_error_line = __LINE__;
+			goto err_bad_extra_size;
+		}
+	}
+
+	trace_binder_transaction(reply, t, target_node);
+
+	t->buffer = binder_alloc_new_buf(&target_proc->alloc, tr->data_size,
+		tr->offsets_size, extra_buffers_size,
+		!reply && (t->flags & TF_ONE_WAY), current->tgid);
+	if (IS_ERR(t->buffer)) {
+		/*
+		 * -ESRCH indicates VMA cleared. The target is dying.
+		 */
+		return_error_param = PTR_ERR(t->buffer);
+		return_error = return_error_param == -ESRCH ?
+			BR_DEAD_REPLY : BR_FAILED_REPLY;
+		return_error_line = __LINE__;
+		t->buffer = NULL;
+		goto err_binder_alloc_buf_failed;
+	}
+	if (secctx) {
+		int err;
+		size_t buf_offset = ALIGN(tr->data_size, sizeof(void *)) +
+					ALIGN(tr->offsets_size, sizeof(void *)) +
+					ALIGN(extra_buffers_size, sizeof(void *)) -
+					ALIGN(secctx_sz, sizeof(u64));
+
+		t->security_ctx = (uintptr_t)t->buffer->user_data + buf_offset;
+		err = binder_alloc_copy_to_buffer(&target_proc->alloc,
+						  t->buffer, buf_offset,
+						  secctx, secctx_sz);
+		if (err) {
+			t->security_ctx = 0;
+			WARN_ON(1);
+		}
+		security_release_secctx(secctx, secctx_sz);
+		secctx = NULL;
+	}
+	t->buffer->debug_id = t->debug_id;
+	t->buffer->transaction = t;
+	t->buffer->target_node = target_node;
+	t->buffer->clear_on_free = !!(t->flags & TF_CLEAR_BUF);
+	trace_binder_transaction_alloc_buf(t->buffer);
+
+	if (binder_alloc_copy_user_to_buffer(
+				&target_proc->alloc,
+				t->buffer, 0,
+				(const void __user *)
+					(uintptr_t)tr->data.ptr.buffer,
+				tr->data_size)) {
+		binder_user_error("%d:%d got transaction with invalid data ptr\n",
+				proc->pid, thread->pid);
+		return_error = BR_FAILED_REPLY;
+		return_error_param = -EFAULT;
+		return_error_line = __LINE__;
+		goto err_copy_data_failed;
+	}
+	if (binder_alloc_copy_user_to_buffer(
+				&target_proc->alloc,
+				t->buffer,
+				ALIGN(tr->data_size, sizeof(void *)),
+				(const void __user *)
+					(uintptr_t)tr->data.ptr.offsets,
+				tr->offsets_size)) {
+		binder_user_error("%d:%d got transaction with invalid offsets ptr\n",
+				proc->pid, thread->pid);
+		return_error = BR_FAILED_REPLY;
+		return_error_param = -EFAULT;
+		return_error_line = __LINE__;
+		goto err_copy_data_failed;
+	}
+	if (!IS_ALIGNED(tr->offsets_size, sizeof(binder_size_t))) {
+		binder_user_error("%d:%d got transaction with invalid offsets size, %lld\n",
+				proc->pid, thread->pid, (u64)tr->offsets_size);
+		return_error = BR_FAILED_REPLY;
+		return_error_param = -EINVAL;
+		return_error_line = __LINE__;
+		goto err_bad_offset;
+	}
+	if (!IS_ALIGNED(extra_buffers_size, sizeof(u64))) {
+		binder_user_error("%d:%d got transaction with unaligned buffers size, %lld\n",
+				  proc->pid, thread->pid,
+				  (u64)extra_buffers_size);
+		return_error = BR_FAILED_REPLY;
+		return_error_param = -EINVAL;
+		return_error_line = __LINE__;
+		goto err_bad_offset;
+	}
+	off_start_offset = ALIGN(tr->data_size, sizeof(void *));
+	buffer_offset = off_start_offset;
+	off_end_offset = off_start_offset + tr->offsets_size;
+	sg_buf_offset = ALIGN(off_end_offset, sizeof(void *));
+	sg_buf_end_offset = sg_buf_offset + extra_buffers_size -
+		ALIGN(secctx_sz, sizeof(u64));
+	off_min = 0;
+	for (buffer_offset = off_start_offset; buffer_offset < off_end_offset;
+		 buffer_offset += sizeof(binder_size_t)) {
+		struct binder_object_header *hdr;
+		size_t object_size;
+		struct binder_object object;
+		binder_size_t object_offset;
+
+		if (binder_alloc_copy_from_buffer(&target_proc->alloc,
+						  &object_offset,
+						  t->buffer,
+						  buffer_offset,
+						  sizeof(object_offset))) {
+			return_error = BR_FAILED_REPLY;
+			return_error_param = -EINVAL;
+			return_error_line = __LINE__;
+			goto err_bad_offset;
+		}
+		object_size = binder_get_object(target_proc, t->buffer,
+						object_offset, &object);
+		if (object_size == 0 || object_offset < off_min) {
+			binder_user_error("%d:%d got transaction with invalid offset (%lld, min %lld max %lld) or object.\n",
+					  proc->pid, thread->pid,
+					  (u64)object_offset,
+					  (u64)off_min,
+					  (u64)t->buffer->data_size);
+			return_error = BR_FAILED_REPLY;
+			return_error_param = -EINVAL;
+			return_error_line = __LINE__;
+			goto err_bad_offset;
+		}
+
+		hdr = &object.hdr;
+		off_min = object_offset + object_size;
+		switch (hdr->type) {
+		case BINDER_TYPE_BINDER:
+		case BINDER_TYPE_WEAK_BINDER: {
+			struct flat_binder_object *fp;
+
+			fp = to_flat_binder_object(hdr);
+			ret = binder_translate_binder(fp, t, thread);
+
+			if (ret < 0 ||
+				binder_alloc_copy_to_buffer(&target_proc->alloc,
+							t->buffer,
+							object_offset,
+							fp, sizeof(*fp))) {
+				return_error = BR_FAILED_REPLY;
+				return_error_param = ret;
+				return_error_line = __LINE__;
+				goto err_translate_failed;
+			}			
+		} break;
+		case BINDER_TYPE_HANDLE:
+		case BINDER_TYPE_WEAK_HANDLE: {
+			struct flat_binder_object *fp;
+
+			fp = to_flat_binder_object(hdr);
+			ret = binder_translate_handle(fp, t, thread);
+			if (ret < 0 ||
+				binder_alloc_copy_to_buffer(&target_proc->alloc,
+							t->buffer,
+							object_offset,
+							fp, sizeof(*fp))) {
+				return_error = BR_FAILED_REPLY;
+				return_error_param = ret;
+				return_error_line = __LINE__;
+				goto err_translate_failed;
+			}
+		} break;
+
+		case BINDER_TYPE_FD: {
+			struct binder_fd_object *fp = to_binder_fd_object(hdr);
+			binder_size_t fd_offset = object_offset +
+				(uintptr_t)&fp->fd - (uintptr_t)fp;
+			int ret = binder_translate_fd(fp->fd, fd_offset, t,
+							  thread, in_reply_to);
+
+			fp->pad_binder = 0;
+			if (ret < 0 ||
+				binder_alloc_copy_to_buffer(&target_proc->alloc,
+							t->buffer,
+							object_offset,
+							fp, sizeof(*fp))) {
+				return_error = BR_FAILED_REPLY;
+				return_error_param = ret;
+				return_error_line = __LINE__;
+				goto err_translate_failed;
+			}
+		} break;
+		case BINDER_TYPE_FDA: {
+			struct binder_object ptr_object;
+			binder_size_t parent_offset;
+			struct binder_fd_array_object *fda =
+				to_binder_fd_array_object(hdr);
+			size_t num_valid = (buffer_offset - off_start_offset) /
+						sizeof(binder_size_t);
+			struct binder_buffer_object *parent =
+				binder_validate_ptr(target_proc, t->buffer,
+							&ptr_object, fda->parent,
+							off_start_offset,
+							&parent_offset,
+							num_valid);
+			if (!parent) {
+				binder_user_error("%d:%d got transaction with invalid parent offset or type\n",
+						  proc->pid, thread->pid);
+				return_error = BR_FAILED_REPLY;
+				return_error_param = -EINVAL;
+				return_error_line = __LINE__;
+				goto err_bad_parent;
+			}
+			if (!binder_validate_fixup(target_proc, t->buffer,
+						   off_start_offset,
+						   parent_offset,
+						   fda->parent_offset,
+						   last_fixup_obj_off,
+						   last_fixup_min_off)) {
+				binder_user_error("%d:%d got transaction with out-of-order buffer fixup\n",
+						  proc->pid, thread->pid);
+				return_error = BR_FAILED_REPLY;
+				return_error_param = -EINVAL;
+				return_error_line = __LINE__;
+				goto err_bad_parent;
+			}
+			ret = binder_translate_fd_array(fda, parent, t, thread,
+							in_reply_to);
+			if (ret < 0) {
+				return_error = BR_FAILED_REPLY;
+				return_error_param = ret;
+				return_error_line = __LINE__;
+				goto err_translate_failed;
+			}
+			last_fixup_obj_off = parent_offset;
+			last_fixup_min_off =
+				fda->parent_offset + sizeof(u32) * fda->num_fds;
+		} break;
+		case BINDER_TYPE_PTR: {
+			struct binder_buffer_object *bp =
+				to_binder_buffer_object(hdr);
+			size_t buf_left = sg_buf_end_offset - sg_buf_offset;
+			size_t num_valid;
+
+			if (bp->length > buf_left) {
+				binder_user_error("%d:%d got transaction with too large buffer\n",
+						  proc->pid, thread->pid);
+				return_error = BR_FAILED_REPLY;
+				return_error_param = -EINVAL;
+				return_error_line = __LINE__;
+				goto err_bad_offset;
+			}
+			if (binder_alloc_copy_user_to_buffer(
+						&target_proc->alloc,
+						t->buffer,
+						sg_buf_offset,
+						(const void __user *)
+							(uintptr_t)bp->buffer,
+						bp->length)) {
+				binder_user_error("%d:%d got transaction with invalid offsets ptr\n",
+						  proc->pid, thread->pid);
+				return_error_param = -EFAULT;
+				return_error = BR_FAILED_REPLY;
+				return_error_line = __LINE__;
+				goto err_copy_data_failed;
+			}
+			/* Fixup buffer pointer to target proc address space */
+			bp->buffer = (uintptr_t)
+				t->buffer->user_data + sg_buf_offset;
+			sg_buf_offset += ALIGN(bp->length, sizeof(u64));
+
+			num_valid = (buffer_offset - off_start_offset) /
+					sizeof(binder_size_t);
+			ret = binder_fixup_parent(t, thread, bp,
+						  off_start_offset,
+						  num_valid,
+						  last_fixup_obj_off,
+						  last_fixup_min_off);
+			if (ret < 0 ||
+				binder_alloc_copy_to_buffer(&target_proc->alloc,
+							t->buffer,
+							object_offset,
+							bp, sizeof(*bp))) {
+				return_error = BR_FAILED_REPLY;
+				return_error_param = ret;
+				return_error_line = __LINE__;
+				goto err_translate_failed;
+			}
+			last_fixup_obj_off = object_offset;
+			last_fixup_min_off = 0;
+		} break;
+		default:
+			binder_user_error("%d:%d got transaction with invalid object type, %x\n",
+				proc->pid, thread->pid, hdr->type);
+			return_error = BR_FAILED_REPLY;
+			return_error_param = -EINVAL;
+			return_error_line = __LINE__;
+			goto err_bad_object_type;
+		}
+	}
+	tcomplete->type = BINDER_WORK_TRANSACTION_COMPLETE;
+	t->work.type = BINDER_WORK_TRANSACTION;
+
+	if (reply) {
+		binder_enqueue_thread_work(thread, tcomplete);		
+		binder_inner_proc_lock(target_proc);
+		if (target_thread->is_dead) {
+			binder_inner_proc_unlock(target_proc);
+			goto err_dead_proc_or_thread;
+		}
+		BUG_ON(t->buffer->async_transaction != 0);
+		binder_pop_transaction_ilocked(target_thread, in_reply_to);
+		binder_enqueue_thread_work_ilocked(target_thread, &t->work);
+		binder_inner_proc_unlock(target_proc);
+		wake_up_interruptible_sync(&target_thread->wait);
+		
+		if(in_reply_to->to_proc == binder_get_rpcproc() && in_reply_to->to_thread == binder_get_rpcthread()) {
+			binder_debug(BINDER_DEBUG_TRANSACTION, "%s %d \n", __FUNCTION__, __LINE__);
+			/*free in_reply_to*/
+			trace_binder_transaction_failed_buffer_release(in_reply_to->buffer);
+			in_reply_to->buffer->transaction = NULL;
+			binder_alloc_free_buf(&in_reply_to->to_proc->alloc, in_reply_to->buffer);
+		}
+		binder_free_transaction(in_reply_to);
+	} else if (!(t->flags & TF_ONE_WAY)) {
+		BUG_ON(t->buffer->async_transaction != 0);
+		binder_inner_proc_lock(proc);
+		/*
+		 * Defer the TRANSACTION_COMPLETE, so we don't return to
+		 * userspace immediately; this allows the target process to
+		 * immediately start processing this transaction, reducing
+		 * latency. We will then return the TRANSACTION_COMPLETE when
+		 * the target replies (or there is an error).
+		 */
+		binder_enqueue_deferred_thread_work_ilocked(thread, tcomplete);
+		t->need_reply = 1;
+		t->from_parent = thread->transaction_stack;
+		thread->transaction_stack = t;
+
+		if(thread == binder_get_rpcthread() && proc == binder_get_rpcproc()) {
+			t->remote_priv = priv;
+			binder_rpc_enqueue_todo(t, thread);
+		}
+
+		binder_inner_proc_unlock(proc);
+		if (!binder_proc_transaction(t, target_proc, target_thread)) {
+			binder_inner_proc_lock(proc);
+			binder_pop_transaction_ilocked(thread, t);
+			binder_inner_proc_unlock(proc);
+			goto err_dead_proc_or_thread;
+		}
+	} else {
+		BUG_ON(target_node == NULL);
+		BUG_ON(t->buffer->async_transaction != 1);
+		if(thread == binder_get_rpcthread() && proc == binder_get_rpcproc()) {
+			binder_debug(BINDER_DEBUG_TRANSACTION, "%s %d \n", __FUNCTION__, __LINE__);
+			
+			//t->remote_priv = priv;
+			//binder_rpc_enqueue_todo(t, thread);
+		}
+		else {
+			binder_enqueue_thread_work(thread, tcomplete);			
+		}
+
+		if (!binder_proc_transaction(t, target_proc, NULL))
+				goto err_dead_proc_or_thread;
+	}
+	if (target_thread)
+		binder_thread_dec_tmpref(target_thread);
+	binder_proc_dec_tmpref(target_proc);
+	if (target_node)
+		binder_dec_node_tmpref(target_node);
+	/*
+	 * write barrier to synchronize with initialization
+	 * of log entry
+	 */
+	smp_wmb();
+	WRITE_ONCE(e->debug_id_done, t_debug_id);
+
+	/*delete tcomplete*/
+	if(proc == binder_get_rpcproc() && thread == binder_get_rpcthread()) {
+		kfree(tcomplete);
+	}
+	return;
+
+err_dead_proc_or_thread:
+	return_error = BR_DEAD_REPLY;
+	return_error_line = __LINE__;
+	binder_dequeue_work(proc, tcomplete);
+err_translate_failed:
+err_bad_object_type:
+err_bad_offset:
+err_bad_parent:
+err_copy_data_failed:
+	binder_free_txn_fixups(t);
+	trace_binder_transaction_failed_buffer_release(t->buffer);
+	binder_transaction_buffer_release(target_proc, NULL, t->buffer,
+					  buffer_offset, true);
+	if (target_node)
+		binder_dec_node_tmpref(target_node);
+	target_node = NULL;
+	t->buffer->transaction = NULL;
+	binder_alloc_free_buf(&target_proc->alloc, t->buffer);
+err_binder_alloc_buf_failed:
+err_bad_extra_size:
+	if (secctx)
+		security_release_secctx(secctx, secctx_sz);
+err_get_secctx_failed:
+	kfree(tcomplete);
+	binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE);
+err_alloc_tcomplete_failed:
+	kfree(t);
+	binder_stats_deleted(BINDER_STAT_TRANSACTION);
+err_alloc_t_failed:
+err_bad_todo_list:
+err_bad_call_stack:
+err_empty_call_stack:
+err_dead_binder:
+err_invalid_target_handle:
+	if (target_thread)
+		binder_thread_dec_tmpref(target_thread);
+	if (target_proc)
+		binder_proc_dec_tmpref(target_proc);
+	if (target_node) {
+		binder_dec_node(target_node, 1, 0);
+		binder_dec_node_tmpref(target_node);
+	}
+
+	binder_debug(BINDER_DEBUG_FAILED_TRANSACTION,
+			 "%d:%d transaction failed %d/%d, size %lld-%lld line %d\n",
+			 proc->pid, thread->pid, return_error, return_error_param,
+			 (u64)tr->data_size, (u64)tr->offsets_size,
+			 return_error_line);
+
+	{
+		struct binder_transaction_log_entry *fe;
+
+		e->return_error = return_error;
+		e->return_error_param = return_error_param;
+		e->return_error_line = return_error_line;
+		fe = binder_transaction_log_add(&binder_transaction_log_failed);
+		*fe = *e;
+		/*
+		 * write barrier to synchronize with initialization
+		 * of log entry
+		 */
+		smp_wmb();
+		WRITE_ONCE(e->debug_id_done, t_debug_id);
+		WRITE_ONCE(fe->debug_id_done, t_debug_id);
+	}
+		
+	BUG_ON(thread->return_error.cmd != BR_OK);
+	if(thread == binder_get_rpcthread() && proc == binder_get_rpcproc()) {
+		if(NULL != binder_rpc_ops.binder_return_error) {
+			struct binder_rpc_operations_info ops_info;
+							
+			ops_info.tr = NULL;
+			
+			if (in_reply_to) {				
+				ops_info.cmd = BR_TRANSACTION_COMPLETE;
+				/*this cmd will be ignored on remote thread.*/
+				ops_info.priv = BINDER_RPC_IGNORE_PRIV;
+
+				/*send target_thread fail reply*/
+				binder_send_failed_reply(in_reply_to, return_error);
+			}
+			else {
+				ops_info.cmd = return_error;
+				ops_info.priv = priv;
+			}			
+			/*send error to remote thread*/
+			binder_rpc_ops.binder_return_error(&ops_info, reply);
+		}
+	}
+	else {
+		if (in_reply_to) {
+			thread->return_error.cmd = BR_TRANSACTION_COMPLETE;
+			binder_enqueue_thread_work(thread, &thread->return_error.work);
+			binder_send_failed_reply(in_reply_to, return_error);
+		} else {
+			thread->return_error.cmd = return_error;
+			binder_enqueue_thread_work(thread, &thread->return_error.work);
+		}
+	}
+}
+				   
+void binder_rpc_return_error(void *brpc_proc,
+				void *prpc_thread,
+				uint32_t return_error,
+				binder_uintptr_t priv,
+				int reply)
+{
+	struct binder_proc *proc = (struct binder_proc *)brpc_proc;
+	struct binder_thread *thread = (struct binder_thread *)prpc_thread;	
+
+	struct binder_proc *target_proc = NULL;
+	struct binder_thread *target_thread = NULL;
+	struct binder_transaction *in_reply_to = NULL;
+	
+	/*ignore binder_rpc_ops.binder_broadcast reply*/
+	if(priv == BINDER_RPC_IGNORE_PRIV) {
+		return;
+	}
+	binder_debug(BINDER_DEBUG_TRANSACTION,"%s %d \n",__FUNCTION__,__LINE__);
+	binder_inner_proc_lock(proc);
+	if((thread == binder_get_rpcthread() && proc == binder_get_rpcproc())) {
+		in_reply_to = binder_rpc_find_todo_by_priv(priv, thread);			
+		if(NULL == in_reply_to) {
+			panic("binder_rpc_transaction NULL == in_reply_to\n");
+		}
+	}
+	if (in_reply_to == NULL) {
+		binder_inner_proc_unlock(proc);
+		binder_user_error("%d:%d got reply transaction with no transaction stack\n",
+					  proc->pid, thread->pid);
+		return;
+	}
+	if (in_reply_to->to_thread != thread) {
+		spin_lock(&in_reply_to->lock);
+		binder_user_error("%d:%d got reply transaction with bad transaction stack, transaction %d has target %d:%d\n",
+			proc->pid, thread->pid, in_reply_to->debug_id,
+			in_reply_to->to_proc ?
+			in_reply_to->to_proc->pid : 0,
+			in_reply_to->to_thread ?
+			in_reply_to->to_thread->pid : 0);
+		spin_unlock(&in_reply_to->lock);
+		binder_inner_proc_unlock(proc);
+		return;
+	}
+	
+	binder_inner_proc_unlock(proc);
+	binder_set_nice(in_reply_to->saved_priority);
+	target_thread = binder_get_txn_from_and_acq_inner(in_reply_to);
+	if (target_thread == NULL) {
+		return;
+	}
+	if (target_thread->transaction_stack != in_reply_to) {
+		binder_user_error("%d:%d got reply transaction with bad target transaction stack %d, expected %d\n",
+				proc->pid, thread->pid,
+				target_thread->transaction_stack ?
+				target_thread->transaction_stack->debug_id : 0,
+				in_reply_to->debug_id);
+		return;
+	}
+	
+	target_proc = target_thread->proc;
+	target_proc->tmp_ref++;
+	binder_inner_proc_unlock(target_thread->proc);
+
+	binder_debug(BINDER_DEBUG_FAILED_TRANSACTION,"%s %d:%d transaction failed %d \n",
+			 __FUNCTION__, target_thread->proc->pid, target_thread->pid, return_error);	
+	if(reply) {
+		//target_thread->return_error.cmd = BR_TRANSACTION_COMPLETE;	
+		//binder_enqueue_thread_work(target_thread, &target_thread->return_error.work);
+		binder_send_failed_reply(in_reply_to, return_error);
+	}
+	else {
+		target_thread->return_error.cmd = return_error;
+		binder_enqueue_thread_work(target_thread, &target_thread->return_error.work);
+		wake_up_interruptible(&target_thread->wait);//need ?					
+	}	
+}
+
+void binder_rpc_node_release(void *node)
+{
+	struct binder_proc *proc = binder_get_rpcproc();
+	struct rb_node *n;
+	struct binder_node *releasing_node = (struct binder_node *)node;
+
+	binder_proc_lock(proc);
+	for (n = rb_first(&proc->refs_by_desc);
+		   n != NULL;
+		   n = rb_next(n)) {
+		   
+	  struct binder_ref *ref;
+
+	  ref = rb_entry(n, struct binder_ref, rb_node_desc);	  
+		  
+	  if(ref->node == releasing_node) {
+		  binder_debug(BINDER_DEBUG_OPEN_CLOSE,"%s %d debug_id:%d desc:%d strong:%d weak:%d \n",__FUNCTION__,__LINE__, 
+								  ref->data.debug_id,ref->data.desc,ref->data.strong,ref->data.weak);
+		  if(binder_rpc_ops.binder_dead_notify) {
+			  binder_rpc_ops.binder_dead_notify(ref->data.desc);
+		  }
+		  binder_cleanup_ref_olocked(ref);
+		  binder_proc_unlock(proc);
+		  kfree(ref);
+		  binder_proc_lock(proc);
+	  }
+	}
+	binder_proc_unlock(proc);
+}
+
+void binder_rpc_dead(void *brpc_proc, uint32_t handle)
+{
+	struct binder_proc *proc = (struct binder_proc *)brpc_proc;
+	struct binder_node *node;
+	int incoming_refs = 0;
+	
+	node = binder_get_node(proc, handle);
+	if(!node) {
+		binder_debug(BINDER_DEBUG_FAILED_TRANSACTION,"binder_get_node(%d) fail",handle);
+	}
+	else {
+		binder_debug(BINDER_DEBUG_TRANSACTION,"binder_get_node(%d) success",handle);
+		rb_erase(&node->rb_node, &proc->nodes);
+		//binder_inner_proc_lock(proc);
+		incoming_refs = binder_node_release(node, incoming_refs);
+		//binder_inner_proc_unlock(proc);
+	}	
+}
+
+/***********************************************************************
+        BINDER RPC API END
+***********************************************************************/
+#endif
 static void print_binder_transaction_ilocked(struct seq_file *m,
 					     struct binder_proc *proc,
 					     const char *prefix,
@@ -5646,6 +6940,12 @@
 			thread->pid, thread->looper,
 			thread->looper_need_return,
 			atomic_read(&thread->tmp_ref));
+#ifdef CONFIG_ANDROID_BINDER_RPC
+		if(thread == binder_get_rpcthread) {
+			return;
+		}
+#endif	
+	
 	header_pos = m->count;
 	t = thread->transaction_stack;
 	while (t) {
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/binder_rpc.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/binder_rpc.c
new file mode 100755
index 0000000..8267f3a
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/binder_rpc.c
@@ -0,0 +1,754 @@
+#include <linux/fdtable.h>

+#include <linux/file.h>

+#include <linux/freezer.h>

+#include <linux/fs.h>

+#include <linux/list.h>

+#include <linux/miscdevice.h>

+#include <linux/module.h>

+#include <linux/mutex.h>

+#include <linux/nsproxy.h>

+#include <linux/poll.h>

+#include <linux/debugfs.h>

+#include <linux/rbtree.h>

+#include <linux/sched/signal.h>

+#include <linux/sched/mm.h>

+#include <linux/seq_file.h>

+#include <linux/string.h>

+#include <linux/uaccess.h>

+#include <linux/pid_namespace.h>

+#include <linux/security.h>

+#include <linux/spinlock.h>

+#include <linux/ratelimit.h>

+#include <linux/syscalls.h>

+#include <linux/task_work.h>

+#include <linux/sizes.h>

+

+#include <linux/delay.h>

+#include "binder_alloc.h"

+#include "binder_rpc.h"

+#include "binder_rpc_common.h"

+

+

+#define brpc_init_sema sema_init

+#define brpc_get_sema down_interruptible

+#define brpc_put_sema up

+

+enum binder_driver_command_protocol_ext {

+	BC_DEAD_BINDER_NOTIFY = _IOW('c', 100, struct brpc_dead_data),

+

+};

+

+struct binder_rpc_context brpc_ctx;

+

+static int brpc_rpctr_convert_tr(struct brpc_data *prpc_data, struct binder_transaction_data *tr);

+static struct brpc_data_entry *brpc_tr_convert_rpctr(struct binder_rpc_operations_info *ops_info,

+													void *ptr, 

+													void *cookie);

+static int brpc_update_object_binder(struct brpc_data *prpc_data, uint32_t local_handle);

+static int brpc_chn_recv_proc(struct brpc_data *prpc_data);

+static int brpc_chn_write(struct brpc_rpmg_channel *chninfo, void *buf, unsigned int len);

+static int brpc_chn_receive_thread(void *argv);

+static int brpc_chn_create(struct binder_rpc_context *pbrpc_ctx);

+static int brpc_write_remote(struct brpc_data *data);

+static int brpc_send_trdata(struct brpc_data_entry *rpc_data_node);

+static int brpc_thread_enqueue_data(struct brpc_agent_thread_info *pagent_thread, struct brpc_data_entry *rpcdata_node);

+static int brpc_thread_write(void *brpc_proc,

+			binder_uintptr_t brpc_buffer, size_t size,

+			binder_size_t *consumed);

+static int brpc_agent_write_refs(struct binder_rpc_context *pbrpc_ctx);

+static void brpc_transaction(void *prpc_proc,

+						   void *prpc_thread,

+						   struct binder_transaction_data *tr, int reply,

+						   binder_size_t extra_buffers_size,

+						   binder_uintptr_t priv);

+

+static void brpc_uld_handle(struct binder_rpc_context *pbrpc_ctx, struct brpc_data *prpc_data);

+static void brpc_dld_handle(struct binder_rpc_context *pbrpc_ctx, struct brpc_data *prpc_data);

+static int brpc_agent_loop(void *argv);

+static int brpc_agent_create(struct binder_rpc_context *pbrpc_ctx);

+

+

+static int brpc_rpctr_convert_tr(struct brpc_data *prpc_data, struct binder_transaction_data *tr)

+{

+	struct brpc_transaction_data *prpc_tr = &prpc_data->rpc_tr;

+	

+	tr->target.handle = prpc_tr->handle;

+	tr->cookie = prpc_tr->cookie;

+	tr->code = prpc_tr->code;

+	tr->flags = prpc_tr->flags;

+	tr->data_size = prpc_tr->data_size;

+	tr->offsets_size = prpc_tr->offsets_size;

+

+	tr->data.ptr.buffer = (void *)kzalloc(tr->data_size, GFP_KERNEL);

+	tr->data.ptr.offsets = (void *)kzalloc(tr->offsets_size, GFP_KERNEL);

+	memcpy(tr->data.ptr.buffer, prpc_tr->buffer, tr->data_size);

+	memcpy(tr->data.ptr.offsets, prpc_tr->offsets, tr->offsets_size);

+

+	return 0;

+}

+

+static struct brpc_data_entry *brpc_tr_convert_rpctr(struct binder_rpc_operations_info *ops_info,

+													void *ptr, 

+													void *cookie)

+{

+	struct brpc_data_entry *rpc_data_node;

+	struct brpc_data *prpc_data;

+	struct brpc_transaction_data *prpc_tr;

+

+	uint32_t cmd = ops_info->cmd;

+	struct binder_transaction_data *tr = ops_info->tr;

+	binder_uintptr_t priv = ops_info->priv;

+

+	/*construct brpc_data*/

+	rpc_data_node = kzalloc(sizeof(*rpc_data_node), GFP_KERNEL);

+	if (rpc_data_node == NULL) {

+		brpc_err("kzalloc fial!!");

+		return NULL;

+	}

+

+	rpc_data_node->dir = BRPC_DIR_UPLINK;

+

+	prpc_data = &rpc_data_node->rpc_data;

+	prpc_data->cmd = cmd;

+

+	prpc_tr = &prpc_data->rpc_tr;

+	prpc_tr->priv = priv;

+	prpc_tr->handle = NULL == ptr ? tr->target.handle : ptr;

+	prpc_tr->cookie = NULL == cookie ? tr->cookie : cookie;

+	prpc_tr->code = tr->code;

+	prpc_tr->flags = tr->flags;		

+	prpc_tr->data_size = tr->data_size;

+	prpc_tr->offsets_size = tr->offsets_size;

+	

+	brpc_dbg("target.handle=%d code=%d ",prpc_tr->handle, prpc_tr->code);

+	

+	if(prpc_tr->data_size >= BRPC_TR_BUFFER_SIZE_MAX || prpc_tr->offsets_size >= BRPC_TR_BUFFER_SIZE_MAX) {

+		brpc_err("data_size=%d offsets_size=%d ",prpc_tr->data_size,prpc_tr->offsets_size);

+		kfree(rpc_data_node);

+		return NULL;

+	}

+	

+	if (copy_from_user(prpc_tr->buffer, tr->data.ptr.buffer, prpc_tr->data_size)) {

+		brpc_err("copy_from_user fail\n");

+		kfree(rpc_data_node);

+		return NULL;

+	}

+

+	if (copy_from_user(prpc_tr->offsets, tr->data.ptr.offsets, prpc_tr->offsets_size)) {

+		brpc_dbg("copy_from_user fail\n");

+		kfree(rpc_data_node);

+		return NULL;

+	}

+

+	return rpc_data_node;

+}

+

+static int brpc_update_object_binder(struct brpc_data *prpc_data, uint32_t local_handle) 

+{

+	binder_size_t buffer_offset = 0;

+	binder_size_t off_start_offset, off_end_offset;

+	binder_size_t off_min;

+

+	struct brpc_transaction_data *prpc_tr = &prpc_data->rpc_tr;

+	size_t *offp, *off_end;

+	

+	offp = (size_t *)prpc_tr->offsets;

+	off_end = (void *)offp + prpc_tr->offsets_size;

+	

+	for (; offp < off_end; offp++) {

+		struct flat_binder_object *fp;

+		if (*offp > prpc_tr->data_size - sizeof(*fp) ||

+		    prpc_tr->data_size < sizeof(*fp) ||

+		    !IS_ALIGNED(*offp, sizeof(void *))) {

+			brpc_err("binder: got transaction with "

+				"invalid offset, %zd\n",

+				*offp);

+			return -1;

+		}

+		fp = (struct flat_binder_object *)(prpc_tr->buffer + *offp);

+		switch (fp->hdr.type) {

+		case BINDER_TYPE_BINDER:

+		case BINDER_TYPE_WEAK_BINDER: {			

+			fp->binder = local_handle;

+			fp->cookie = 0;			

+			brpc_info("fp->binder:%d",fp->binder);

+		} break;

+		case BINDER_TYPE_HANDLE:

+		case BINDER_TYPE_WEAK_HANDLE:

+			brpc_info("fp->handle:%d",fp->handle);

+			break;

+

+		case BINDER_TYPE_FD: 

+		default:

+			brpc_err("got transaction with invalid object type, %x\n",fp->hdr.type);

+			return -1;

+		}

+	}

+	

+	return 0;

+}

+

+static int brpc_binder_return_error(struct binder_rpc_operations_info *ops_info, int reply)

+{

+	struct brpc_data_entry *rpc_data_node = NULL;

+

+	rpc_data_node = kzalloc(sizeof(*rpc_data_node), GFP_KERNEL);

+	if (rpc_data_node == NULL) {

+		brpc_err("kzalloc fial!!");

+		return -1;

+	}

+

+	rpc_data_node->dir = BRPC_DIR_UPLINK;

+	rpc_data_node->rpc_data.cmd = ops_info->cmd;

+	rpc_data_node->rpc_data.rpc_reply_error.priv = ops_info->priv;

+	rpc_data_node->rpc_data.rpc_reply_error.reply = reply;

+

+	brpc_send_trdata(rpc_data_node);

+	return 0;

+}

+

+static int brpc_binder_release(void *proc, void *node)

+{

+	struct brpc_data_entry *rpc_data_node = NULL;

+

+	rpc_data_node = kzalloc(sizeof(*rpc_data_node), GFP_KERNEL);

+	if (rpc_data_node == NULL) {

+		brpc_err("kzalloc fial!!");

+		return -1;

+	}

+

+	rpc_data_node->dir = BRPC_DIR_LOCAL;

+	rpc_data_node->rpc_data.rpc_local.proc = proc;

+	rpc_data_node->rpc_data.rpc_local.node = node;

+	brpc_send_trdata(rpc_data_node);

+	return 0;

+}

+static int brpc_binder_dead(uint32_t handle)

+{

+	struct brpc_data_entry *rpc_data_node = NULL;

+

+	rpc_data_node = kzalloc(sizeof(*rpc_data_node), GFP_KERNEL);

+	if (rpc_data_node == NULL) {

+		brpc_err("kzalloc fial!!");

+		return -1;

+	}

+

+	rpc_data_node->dir = BRPC_DIR_UPLINK;

+	rpc_data_node->rpc_data.cmd = BC_DEAD_BINDER_NOTIFY;

+	rpc_data_node->rpc_data.rpc_dead.handle = handle;

+	brpc_send_trdata(rpc_data_node);

+	

+	return 0;

+}

+

+

+static int brpc_binder_transaction(struct binder_rpc_operations_info *ops_info, 

+								uint32_t local_handle, 

+								void *remote_ptr, 

+								void *remote_cookie)

+{

+	struct brpc_data_entry *rpc_data_node = NULL;

+	struct brpc_data *prpc_data;

+	struct flat_binder_object *obj;

+	binder_size_t buffer_offset = 0;

+	binder_size_t off_start_offset, off_end_offset;

+	binder_size_t off_min;

+

+	uint32_t cmd = ops_info->cmd;

+	struct binder_transaction_data *tr = ops_info->tr;

+	binder_uintptr_t priv = ops_info->priv;

+	

+	brpc_info("tr cmd:0x%x local_handle:%d handle:%d code:%d",cmd, local_handle, tr->target.handle, tr->code);

+	brpc_info("tr cmd:0x%x",tr->flags);

+	if(0 != tr->target.handle) {

+		rpc_data_node = brpc_tr_convert_rpctr(ops_info,remote_ptr,remote_cookie);

+		if(NULL == rpc_data_node) {

+			return -1;

+		}

+

+		if(0 != local_handle && brpc_update_object_binder(&rpc_data_node->rpc_data, local_handle)) {

+			brpc_err("brpc_update_object_binder(local_handle %d) fail.",local_handle);

+			kfree(rpc_data_node);

+			return -1;

+		}

+

+		brpc_send_trdata(rpc_data_node);

+	}

+	return 0;

+}

+

+static int brpc_binder_reply(struct binder_rpc_operations_info *ops_info, uint32_t local_handle)

+{

+	struct brpc_data_entry *rpc_data_node = NULL;

+	struct brpc_data *prpc_data;

+	

+	uint32_t cmd = ops_info->cmd;

+	struct binder_transaction_data *tr = ops_info->tr;

+	binder_uintptr_t priv = ops_info->priv;

+	

+	brpc_info("tr cmd:0x%x handle:%d code:%d",cmd, tr->target.handle, tr->code);

+

+	rpc_data_node = brpc_tr_convert_rpctr(ops_info, NULL ,NULL);

+	if(NULL == rpc_data_node) {

+		brpc_err("drop this tr.");

+		return -1;

+	}

+	if(0 != local_handle && brpc_update_object_binder(&rpc_data_node->rpc_data, local_handle)) {

+		brpc_err("brpc_update_object_binder(local_handle %d) fail.",local_handle);

+		kfree(rpc_data_node);

+		return -1;

+	}

+

+	brpc_send_trdata(rpc_data_node);

+

+	return 0;

+}

+

+static int brpc_binder_broadcast(struct binder_rpc_operations_info *ops_info, uint32_t local_handle)

+{

+	struct brpc_data_entry *rpc_data_node = NULL;

+	struct brpc_data *prpc_data;

+	struct flat_binder_object *obj;

+	binder_size_t buffer_offset = 0;

+	binder_size_t off_start_offset, off_end_offset;

+	binder_size_t off_min;

+

+	uint32_t cmd = ops_info->cmd;

+	struct binder_transaction_data *tr = ops_info->tr;

+	binder_uintptr_t priv = ops_info->priv;

+

+	brpc_info("tr handle:%d code:%d",tr->target.handle, tr->code);

+	/*broadcast add service*/

+	if(0 == tr->target.handle && ADD_SERVICE_TRANSACTION == tr->code) {		

+		rpc_data_node = brpc_tr_convert_rpctr(ops_info, NULL, NULL);

+		if(NULL == rpc_data_node) {

+			brpc_err("brpc_tr_convert_rpctr fail.");

+			return -1;

+		}

+		if(brpc_update_object_binder(&rpc_data_node->rpc_data, local_handle)) {

+			brpc_err("brpc_update_object_binder fail.");

+			kfree(rpc_data_node);

+			return -1;

+		}							

+		

+		return brpc_send_trdata(rpc_data_node);

+	}

+

+	return 0;

+}

+

+static int brpc_chn_recv_proc(struct brpc_data *prpc_data)

+{

+	struct brpc_data_entry *rpc_data_node;

+

+	rpc_data_node = kzalloc(sizeof(*rpc_data_node), GFP_KERNEL);

+	if (rpc_data_node == NULL) {

+		return -1;

+	}

+	brpc_dbg("cmd=0x%x",prpc_data->cmd);

+	if(BC_TRANSACTION == prpc_data->cmd || BC_REPLY == prpc_data->cmd) {

+		brpc_dbg("target.handle=%d code=%d",prpc_data->rpc_tr.handle, prpc_data->rpc_tr.code);

+		brpc_dbg("data_size=%d offsets_size=%d",prpc_data->rpc_tr.data_size,prpc_data->rpc_tr.offsets_size);

+	}

+	else if(BC_DEAD_BINDER_NOTIFY == prpc_data->cmd) {

+		brpc_dbg("BC_DEAD_BINDER_NOTIFY handle=%d",prpc_data->rpc_dead.handle);

+	}

+	rpc_data_node->dir = BRPC_DIR_DOWNLINK;

+

+	memcpy(&rpc_data_node->rpc_data, prpc_data, sizeof(struct brpc_data));

+	

+	return brpc_send_trdata(rpc_data_node);

+}

+

+/*·µ»ØÖµ´óÓÚµÈÓÚ0£¬±íʾдͨµÀ³É¹¦£»Ð¡ÓÚ0±íʾдͨµÀʧ°Ü*/

+static int brpc_chn_write(struct brpc_rpmg_channel *chninfo, void *buf, unsigned int len)

+{

+    T_RpMsg_Msg msg;

+

+    if(NULL == buf) {

+        return -EINVAL;

+    }

+    memset(&msg, 0, sizeof(msg));

+    msg.coreID = chninfo->core_id;

+    msg.chID   = chninfo->channel_id;

+    msg.flag |= RPMSG_WRITE_INT;

+    msg.buf = buf;

+    msg.len = len;

+

+    return binderWrite(&msg);

+}

+

+static int brpc_chn_receive_thread(void *argv)

+{

+	struct binder_rpc_context *pbrpc_ctx = (struct binder_rpc_context *)argv;

+	T_RpMsg_Msg msg;

+	struct brpc_data data;

+	

+	int ret;

+

+	memset(&msg, 0, sizeof(msg));

+	msg.coreID = pbrpc_ctx->chn.core_id;

+	msg.chID = pbrpc_ctx->chn.channel_id;

+	msg.flag = 0;

+	

+	while(!pbrpc_ctx->chn.channel_stop) {

+		msg.buf = &data;

+		msg.len = sizeof(data);

+

+		ret = binderRead(&msg);

+		if(ret <= 0) {

+			brpc_warn("binderRead ret=%d ", ret);

+			msleep(10000);

+			continue;

+		}

+

+		if(pbrpc_ctx->chn.channel_stop) {

+			break;

+		}

+

+		brpc_chn_recv_proc(&data);							

+	}

+

+	brpc_err("the rpmsg channel loop stop!\n");

+	return 0;

+}

+

+static int brpc_chn_create(struct binder_rpc_context *pbrpc_ctx)

+{

+	struct task_struct *th = NULL;

+    int retval = 0;

+

+	retval = binderCreateChannel(pbrpc_ctx->chn.core_id, pbrpc_ctx->chn.channel_id, pbrpc_ctx->chn.channel_size);

+   	if(retval != RPMSG_SUCCESS && retval != RPMSG_CHANNEL_ALREADY_EXIST) {

+        brpc_err("binderCreateChannel fail.");

+        return retval;

+    }

+

+    th = kthread_run(brpc_chn_receive_thread, (void *)pbrpc_ctx, "brpc-chn%d", pbrpc_ctx->chn.channel_id);

+    if (IS_ERR(th)) {

+        brpc_err("kthread_run fail.");

+        return PTR_ERR(th);

+    }

+    pbrpc_ctx->chn.rcv_thread = th;

+

+	return 0;

+}

+

+static int brpc_write_remote(struct brpc_data *data)

+{

+	struct binder_rpc_context *pbrpc_ctx = &brpc_ctx;

+	

+	if(0 > brpc_chn_write(&(pbrpc_ctx->chn), data, sizeof(struct brpc_data))) {

+		brpc_err("fail.");

+		return -1;

+	}

+	return 0;

+}

+

+static int brpc_thread_enqueue_data(struct brpc_agent_thread_info *pagent_thread, struct brpc_data_entry *rpcdata_node)

+{

+	unsigned long flags;

+	

+	spin_lock_irqsave(&pagent_thread->p_transaction_lock,flags);

+	list_add_tail(&rpcdata_node->list, &pagent_thread->p_transaction_list);

+	spin_unlock_irqrestore(&pagent_thread->p_transaction_lock,flags);

+	brpc_put_sema(&pagent_thread->p_transaction_sem);

+

+	return 0;

+}

+

+static int brpc_send_trdata(struct brpc_data_entry *rpc_data_node)

+{	

+	struct binder_rpc_context *pbrpc_ctx = &brpc_ctx;

+

+	return brpc_thread_enqueue_data(&pbrpc_ctx->agent_thread, rpc_data_node);

+}

+

+static int brpc_thread_write(void *brpc_proc,

+			binder_uintptr_t brpc_buffer, size_t size,

+			binder_size_t *consumed)

+{

+	struct binder_proc *proc = brpc_proc;

+	int ret;

+	mm_segment_t old_fs;

+	

+	old_fs = get_fs();

+	set_fs(KERNEL_DS);

+

+	ret = binder_rpc_thread_write(brpc_proc, brpc_buffer, size, consumed);

+

+	set_fs(old_fs);

+	

+	return ret;

+}

+

+

+/*·¢ËÍBC_INCREFS/BC_ACQUIRE*/

+static int brpc_agent_write_refs(struct binder_rpc_context *pbrpc_ctx)

+{

+	int ret;

+	binder_size_t consumed = 0;

+	struct {

+        __u32 cmd;

+        __u32 handle;

+    } writebuf;

+

+	writebuf.cmd = BC_INCREFS;

+	writebuf.handle = 0;

+

+	ret = brpc_thread_write(pbrpc_ctx->brpc_proc, (binder_uintptr_t)&writebuf, sizeof(writebuf), &consumed);

+	if(ret) {

+		brpc_err("write BC_INCREFS fail, ret:%d",ret);

+		return -1;

+	}

+	brpc_dbg("BC_INCREFS consumed:%d ",consumed);

+

+	writebuf.cmd = BC_ACQUIRE;

+	writebuf.handle = 0;

+

+	ret = brpc_thread_write(pbrpc_ctx->brpc_proc, (binder_uintptr_t)&writebuf, sizeof(writebuf), &consumed);

+	if(ret) {

+		brpc_err("write BC_ACQUIRE fail, ret:%d",ret);

+		return -1;

+	}

+	brpc_dbg("BC_ACQUIRE consumed:%d ",consumed);

+

+	return 0;

+}

+

+static void brpc_transaction(void *prpc_proc,

+						   void *prpc_thread,

+						   struct binder_transaction_data *tr, int reply,

+						   binder_size_t extra_buffers_size,

+						   binder_uintptr_t priv)

+{

+	mm_segment_t old_fs;

+	const char __user *p, *q;

+

+	old_fs = get_fs();

+	set_fs(KERNEL_DS);

+	

+	p = (__force const char __user *)(tr->data.ptr.buffer);

+	q = (__force const char __user *)(tr->data.ptr.offsets);

+	

+	binder_rpc_transaction(prpc_proc, 

+						prpc_thread, 

+						tr,

+						reply,

+						0,

+						priv);

+

+	set_fs(old_fs);

+}

+

+static void brpc_uld_handle(struct binder_rpc_context *pbrpc_ctx, struct brpc_data *prpc_data)

+{

+	if(BC_TRANSACTION == prpc_data->cmd || BC_REPLY == prpc_data->cmd) {

+		brpc_dbg("BRPC_DIR_UPLINK cmd:0x%x priv:0x%x",prpc_data->cmd,prpc_data->rpc_tr.priv);

+	}

+	else if(BC_DEAD_BINDER_NOTIFY == prpc_data->cmd) {

+		brpc_dbg("BRPC_DIR_UPLINK cmd:0x%x handle:0x%x",prpc_data->cmd,prpc_data->rpc_dead.handle);

+	}

+	else if(BR_ERROR == prpc_data->cmd ||

+		BR_DEAD_REPLY == prpc_data->cmd ||

+		BR_TRANSACTION_COMPLETE == prpc_data->cmd ||

+		BR_DEAD_BINDER == prpc_data->cmd ||

+		BR_CLEAR_DEATH_NOTIFICATION_DONE == prpc_data->cmd ||

+		BR_FAILED_REPLY == prpc_data->cmd) {

+		brpc_dbg("BRPC_DIR_UPLINK cmd:0x%x priv:0x%x",prpc_data->cmd,prpc_data->rpc_reply_error.priv);

+	}

+	else {

+		brpc_err("unknow cmd 0x%x",prpc_data->cmd);

+	}

+	brpc_write_remote(prpc_data);

+}

+static void brpc_dld_handle(struct binder_rpc_context *pbrpc_ctx, struct brpc_data *prpc_data)

+{

+	struct binder_transaction_data tr;

+	struct brpc_transaction_data *prpc_tr = &prpc_data->rpc_tr;

+	binder_uintptr_t priv;

+	

+	if(BC_TRANSACTION == prpc_data->cmd || BC_REPLY == prpc_data->cmd) {

+		brpc_dbg("BRPC_DIR_DOWNLINK cmd:0x%x priv:0x%x",prpc_data->cmd,prpc_data->rpc_tr.priv);

+		brpc_rpctr_convert_tr(prpc_data, &tr);

+

+		brpc_transaction(pbrpc_ctx->brpc_proc, 

+						pbrpc_ctx->brpc_thread, 

+						&tr,

+						BC_REPLY == prpc_data->cmd,

+						0,

+						prpc_tr->priv);

+		if(0 != tr.data.ptr.buffer) {

+			kfree(tr.data.ptr.buffer);

+		}

+		if(0 != tr.data.ptr.offsets) {

+			kfree(tr.data.ptr.offsets);

+		}

+	}

+	else if(BC_DEAD_BINDER_NOTIFY == prpc_data->cmd) {

+		brpc_dbg("BRPC_DIR_DOWNLINK cmd:0x%x handle:0x%x",prpc_data->cmd,prpc_data->rpc_dead.handle);

+		binder_rpc_dead(pbrpc_ctx->brpc_proc, prpc_data->rpc_dead.handle);

+	}

+	else if(BR_ERROR == prpc_data->cmd ||

+		BR_DEAD_REPLY == prpc_data->cmd ||

+		BR_TRANSACTION_COMPLETE == prpc_data->cmd ||

+		BR_DEAD_BINDER == prpc_data->cmd ||

+		BR_CLEAR_DEATH_NOTIFICATION_DONE == prpc_data->cmd ||

+		BR_FAILED_REPLY == prpc_data->cmd) {

+		brpc_dbg("BRPC_DIR_DOWNLINK cmd:0x%x priv:0x%x",prpc_data->cmd,prpc_data->rpc_reply_error.priv);

+		binder_rpc_return_error(pbrpc_ctx->brpc_proc, 

+							pbrpc_ctx->brpc_thread,

+							prpc_data->cmd,

+							prpc_data->rpc_reply_error.priv,

+							prpc_data->rpc_reply_error.reply);

+	}

+	else {

+		brpc_err("unknow cmd 0x%x",prpc_data->cmd);

+	}

+}

+

+static void brpc_local_handle(struct binder_rpc_context *pbrpc_ctx, struct brpc_data *prpc_data)

+{

+	binder_rpc_node_release(prpc_data->rpc_local.node);

+}

+

+static int brpc_agent_loop(void *argv)

+{

+	struct binder_rpc_context *pbrpc_ctx = (struct binder_rpc_context *)argv;

+	struct brpc_agent_thread_info *pagent_thread = &pbrpc_ctx->agent_thread;

+	struct list_head	tmp_list;

+	struct brpc_data_entry *entry,*tmp_entry;

+	unsigned long flags;

+

+	pbrpc_ctx->brpc_thread = binder_rpc_get_thread(pbrpc_ctx->brpc_proc);

+	

+	if(brpc_agent_write_refs(pbrpc_ctx)) {

+		brpc_err("brpc_agent_write_refs fail.");

+		return -1;

+	}

+	INIT_LIST_HEAD(&tmp_list);

+	while(!pagent_thread->bstop) {

+		brpc_get_sema(&pagent_thread->p_transaction_sem);

+

+		spin_lock_irqsave(&pagent_thread->p_transaction_lock,flags);	

+		if (list_empty(&pagent_thread->p_transaction_list)) {

+			spin_unlock_irqrestore(&pagent_thread->p_transaction_lock,flags);

+			continue;

+		}

+		list_replace_init(&pagent_thread->p_transaction_list,&tmp_list);

+		list_del_init(&pagent_thread->p_transaction_list);		

+		spin_unlock_irqrestore(&pagent_thread->p_transaction_lock,flags);

+

+		list_for_each_entry_safe(entry,tmp_entry,&tmp_list,list) {

+			if(!pagent_thread->bstop) {			

+				if(BRPC_DIR_UPLINK == entry->dir) {				

+					brpc_uld_handle(pbrpc_ctx, &entry->rpc_data);

+				}

+				else if(BRPC_DIR_DOWNLINK == entry->dir) {				

+					brpc_dld_handle(pbrpc_ctx, &entry->rpc_data);

+				}

+				else if(BRPC_DIR_LOCAL == entry->dir) {

+					brpc_local_handle(pbrpc_ctx, &entry->rpc_data);

+				}

+				else {

+					brpc_warn("brpc data unknow dir(%d).",entry->dir);

+				}

+			}

+

+			list_del(&entry->list);

+			kfree(entry);

+		}

+	}

+

+	spin_lock_irqsave(&pagent_thread->p_transaction_lock,flags);

+	list_for_each_entry_safe(entry,tmp_entry,&pagent_thread->p_transaction_list,list) {

+		list_del(&entry->list);

+		kfree(entry);

+	}

+	spin_unlock_irqrestore(&pagent_thread->p_transaction_lock,flags);

+

+	brpc_err("the agnet loop stop!\n");

+

+	return 0;

+}

+

+static int brpc_agent_create(struct binder_rpc_context *pbrpc_ctx)

+{

+	struct brpc_agent_thread_info *pagent_thread = &pbrpc_ctx->agent_thread;

+	struct task_struct *th = NULL;

+    int retval = 0;

+

+	INIT_LIST_HEAD(&pagent_thread->p_transaction_list);

+	spin_lock_init(&pagent_thread->p_transaction_lock);

+	brpc_init_sema(&pagent_thread->p_transaction_sem, 0);

+	

+	th = kthread_run(brpc_agent_loop, (void *)pbrpc_ctx, "brpc-agent");

+    if (IS_ERR(th)) {

+        brpc_err("kthread_run fail.");

+        return PTR_ERR(th);

+    }

+

+	pagent_thread->p_thread = th;

+	

+	return 0;

+}

+

+int binder_rpc_init(void *proc, struct file *pfile, struct binder_rpc_operations_struct *cb)

+{

+	struct binder_rpc_context *pbrpc_ctx = &brpc_ctx;

+	int ret = 0;

+

+	memset(pbrpc_ctx, 0, sizeof(struct binder_rpc_context));

+

+	pbrpc_ctx->brpc_proc = proc;

+	pbrpc_ctx->prpc_file = pfile;

+	

+	pbrpc_ctx->chn.core_id = CORE_PS0;

+	pbrpc_ctx->chn.channel_id = ICP_CHN_BINDER_RPC;

+	pbrpc_ctx->chn.channel_size = ICP_CHN_BINDER_RPC_SIZE;

+	

+	if(brpc_chn_create(pbrpc_ctx)) {

+		brpc_err("brpc_chn_create fail.");

+		return -1;

+	}

+

+	if(brpc_agent_create(pbrpc_ctx)) {

+		brpc_err("brpc_agent_create fail.");

+		return -1;

+	}

+

+	if(NULL != cb) {

+		memset(cb, 0, sizeof(struct binder_rpc_operations_struct));

+		cb->binder_transaction = brpc_binder_transaction;

+		cb->binder_broadcast = brpc_binder_broadcast;

+		cb->binder_reply = brpc_binder_reply;

+		cb->binder_return_error = brpc_binder_return_error;

+		cb->binder_release = brpc_binder_release;

+		cb->binder_dead_notify = brpc_binder_dead;

+	}

+

+	brpc_info("success!");

+	

+	return 0;

+}

+

+int binder_rpc_deinit(struct vm_area_struct *vma)

+{

+	struct binder_rpc_context *pbrpc_ctx = &brpc_ctx;

+

+	pbrpc_ctx->chn.channel_stop = 1;

+	pbrpc_ctx->agent_thread.bstop = 1;

+	

+	if(pbrpc_ctx->prpc_file) {				

+		filp_close(pbrpc_ctx->prpc_file, current->files);		

+

+		if(NULL != vma) {

+			do_munmap(current->mm, vma->vm_start, vma->vm_end - vma->vm_start, NULL);

+		}

+	}

+	

+	brpc_info("success!");

+	

+	return 0;

+}

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/binder_rpc.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/binder_rpc.h
new file mode 100755
index 0000000..b0699d4
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/binder_rpc.h
@@ -0,0 +1,49 @@
+#ifndef _LINUX_BINDER_RPC_H

+#define _LINUX_BINDER_RPC_H

+

+#include <uapi/linux/android/binder.h>

+#include <uapi/linux/android/binderfs.h>

+

+enum {

+    GET_SERVICE_TRANSACTION = 0x00000001,

+    CHECK_SERVICE_TRANSACTION,

+    ADD_SERVICE_TRANSACTION,

+    LIST_SERVICES_TRANSACTION,

+};

+

+struct binder_rpc_operations_info {

+	uint32_t cmd;

+	struct binder_transaction_data *tr;

+	binder_uintptr_t priv;

+};

+

+struct binder_rpc_operations_struct {

+	int (*binder_broadcast)(struct binder_rpc_operations_info *ops_info, uint32_t local_handle);

+	int (*binder_reply)(struct binder_rpc_operations_info *ops_info, uint32_t local_handle);

+	int (*binder_transaction)(struct binder_rpc_operations_info *ops_info, uint32_t local_handle, void *remote_ptr, void *remote_cookie);

+	int (*binder_return_error)(struct binder_rpc_operations_info *ops_info, int reply);

+	int (*binder_release)(void *proc, void *node);

+	int (*binder_dead_notify)(uint32_t handle);

+};

+

+int binder_rpc_init(void *proc, struct file *pfile, struct binder_rpc_operations_struct *cb);

+int binder_rpc_deinit(struct vm_area_struct *vma);

+int binder_rpc_thread_write(void *brpc_proc,

+			binder_uintptr_t brpc_buffer, size_t size,

+			binder_size_t *consumed);

+void *binder_rpc_get_thread(void *brpc_proc);

+void binder_rpc_transaction(void *prpc_proc,

+				   void *prpc_thread,

+				   struct binder_transaction_data *tr, int reply,

+				   binder_size_t extra_buffers_size,

+				   binder_uintptr_t priv);

+void binder_rpc_node_release(void *node);

+void binder_rpc_dead(void *brpc_proc, uint32_t handle);

+void binder_rpc_return_error(void *brpc_proc,

+				 void *prpc_thread,

+				 uint32_t return_error,

+				 binder_uintptr_t priv,

+				 int reply);

+

+

+#endif /* _LINUX_BINDER_RPC_H*/

diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/binder_rpc_common.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/binder_rpc_common.h
new file mode 100755
index 0000000..86b5748
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/android/binder_rpc_common.h
@@ -0,0 +1,127 @@
+#ifndef _LINUX_BINDER_RPC_COMM_H

+#define _LINUX_BINDER_RPC_COMM_H

+

+#include <linux/interrupt.h>

+#include <linux/kthread.h>

+#include <linux/spinlock.h>

+#include <linux/semaphore.h>

+#include <linux/soc/zte/rpmsg.h>

+

+#include <uapi/linux/android/binder.h>

+#include <uapi/linux/android/binderfs.h>

+

+int brpc_debug = 0;

+module_param(brpc_debug,int,0644);

+

+#define brpc_dbg(format, arg...) if(brpc_debug == 1) \

+	printk(KERN_INFO " [brpc]<%s>: " format "\n" , __func__ , ## arg)

+#define brpc_info(format, arg...) if(brpc_debug == 1) \

+	printk(KERN_INFO " [brpc]<%s>: " format "\n" , __func__ , ## arg)	

+

+#define brpc_err(format, arg...) printk(KERN_ERR " [brpc]<%s>: " format "\n" , \

+	__func__ , ## arg)

+

+#define brpc_warn(format, arg...) printk(KERN_WARNING " [brpc]<%s>: " format "\n" , \

+	__func__ , ## arg)

+

+/*local data ,to remote,need write rpmsg channel*/

+#define BRPC_DIR_UPLINK		1

+/*remote data ,to local,read from rpmsg channel*/

+#define BRPC_DIR_DOWNLINK	2

+#define BRPC_DIR_LOCAL	3

+

+

+#define  ICP_CHN_BINDER_RPC 33

+#define	 ICP_CHN_BINDER_RPC_SIZE 	(8 * 1024 *2)

+#define binderCreateChannel rpmsgCreateChannel

+#define binderWrite         rpmsgWrite

+#define binderRead          rpmsgRead

+

+struct brpc_rpmg_channel {

+    T_RpMsg_CoreID core_id;

+    T_RpMsg_ChID channel_id;

+    unsigned int channel_size;

+    struct task_struct *rcv_thread;

+	int channel_stop;

+};

+

+/*thread proxy list*/

+struct brpc_agent_thread_info {

+	struct task_struct *p_thread;	

+	struct list_head	p_transaction_list;

+	struct spinlock 	p_transaction_lock;

+	struct semaphore 	p_transaction_sem;

+

+	int bstop;

+};

+

+struct binder_rpc_context {	

+	void *brpc_proc;

+	void *brpc_thread;

+	struct file *prpc_file;

+	struct brpc_agent_thread_info agent_thread; 

+	struct brpc_rpmg_channel chn;

+};

+

+struct brpc_transaction_data {

+	union {

+		/*cmd == BC_TRANSACTION*/

+		binder_uintptr_t local_tr;

+		/*cmd == BC_REPLY*/

+		binder_uintptr_t remote_tr;

+

+		binder_uintptr_t priv;

+	};

+    __u32	handle;	/* target descriptor of command transaction */

+    binder_uintptr_t	cookie;	/* target object cookie */

+    __u32		code;		/* transaction command */

+

+    /* General information about the transaction. */

+    __u32	        flags;

+

+    binder_size_t	data_size;	/* number of bytes of data */

+    binder_size_t	offsets_size;	/* number of bytes of offsets */

+#define BRPC_TR_BUFFER_SIZE_MAX 256

+	char buffer[BRPC_TR_BUFFER_SIZE_MAX];

+	char offsets[BRPC_TR_BUFFER_SIZE_MAX];    

+};

+

+struct brpc_ref_data {

+	uint32_t target;

+};

+

+struct brpc_local_data {

+	void *proc;

+	void *node;

+};

+

+struct brpc_dead_data {

+	uint32_t handle;

+};

+

+struct brpc_reply_error_data {

+	binder_uintptr_t priv;

+	int reply;

+};

+

+struct brpc_data {

+	/*BC_## command*/

+	uint32_t cmd;

+	union {

+		struct brpc_ref_data rpc_ref;

+		struct brpc_transaction_data rpc_tr;

+		struct brpc_local_data rpc_local;

+		struct brpc_dead_data rpc_dead;

+		struct brpc_reply_error_data rpc_reply_error;

+	};

+};

+

+struct brpc_data_entry {

+	struct list_head list;

+	/*BRPC_DIR_UPLINK / BRPC_DIR_DOWNLINK/*/

+	uint32_t dir;

+	struct brpc_data rpc_data;

+};

+

+#endif /* _LINUX_BINDER_RPC_COMM_H*/

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/gpio/gpio-zx29.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/gpio/gpio-zx29.c
old mode 100644
new mode 100755
index 0183f58..cb41584
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/gpio/gpio-zx29.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/gpio/gpio-zx29.c
@@ -330,6 +330,7 @@
 	case PIN_CONFIG_BIAS_DISABLE:
 	case PIN_CONFIG_BIAS_PULL_UP:
 	case PIN_CONFIG_BIAS_PULL_DOWN:
+	case PIN_CONFIG_DRIVE_STRENGTH:
 		gpio_log("%s: config:%d off:%d\n", __func__, pinconf_to_config_param(config), offset);
 		ret = gpiochip_generic_config(chip, offset, config);
 		break;
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/gpio/gpiolib-cdev.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/gpio/gpiolib-cdev.c
old mode 100644
new mode 100755
index 381cfa2..cfaac79
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/gpio/gpiolib-cdev.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/gpio/gpiolib-cdev.c
@@ -158,6 +158,11 @@
 	if (copy_from_user(&gcnf, ip, sizeof(gcnf)))
 		return -EFAULT;
 
+	if (gcnf.flags & GPIOHANDLE_REQUEST_DRIVE_STRENGTH) {
+		desc = lh->descs[0];
+		return gpiod_set_config(desc, PIN_CONF_PACKED(PIN_CONFIG_DRIVE_STRENGTH, gcnf.padding[0]));
+	}
+
 	lflags = gcnf.flags;
 	ret = linehandle_validate_flags(lflags);
 	if (ret)
@@ -2035,10 +2040,31 @@
 {
 	struct gpio_desc *desc;
 	struct gpio_v2_line_info lineinfo;
+	unsigned long config;
+	int ret;
 
 	if (copy_from_user(&lineinfo, ip, sizeof(lineinfo)))
 		return -EFAULT;
 
+	if (lineinfo.flags == GPIOHANDLE_REQUEST_DRIVE_STRENGTH) {
+		desc = gpiochip_get_desc(cdev->gdev->chip, lineinfo.offset);
+		if (IS_ERR(desc))
+			return PTR_ERR(desc);
+
+		config = pinconf_to_config_packed(PIN_CONFIG_DRIVE_STRENGTH, 0);
+		ret = pinctrl_gpio_get_config(gpio_chip_hwgpio(desc), &config);
+		if (ret) {
+			return ret;
+		}
+
+		lineinfo.padding[0] = pinconf_to_config_argument(config);
+
+		if (copy_to_user(ip, &lineinfo, sizeof(lineinfo)))
+			return -EFAULT;
+
+		return 0;
+	}
+
 	if (memchr_inv(lineinfo.padding, 0, sizeof(lineinfo.padding)))
 		return -EINVAL;
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/gpio/gpiolib-sysfs.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/gpio/gpiolib-sysfs.c
old mode 100644
new mode 100755
index fa5d945..558da1e
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/gpio/gpiolib-sysfs.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/gpio/gpiolib-sysfs.c
@@ -152,6 +152,135 @@
 }
 static DEVICE_ATTR_PREALLOC(value, S_IWUSR | S_IRUGO, value_show, value_store);
 
+static const char * const reg_names[] = {"DRV", "PD", "PU"};
+static const enum pin_config_param dbg_param[] = {
+	PIN_CONFIG_DRIVE_STRENGTH,
+	PIN_CONFIG_BIAS_PULL_DOWN,
+	PIN_CONFIG_BIAS_PULL_UP};
+
+#ifdef CONFIG_DEBUG_FS
+void gpio_config_dbg_show(struct seq_file *s, struct gpio_desc	*desc)
+{
+	unsigned long config;
+	int ret;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(dbg_param); i++) {
+		config = pinconf_to_config_packed(dbg_param[i], 0);
+		ret = pinctrl_gpio_get_config(gpio_chip_hwgpio(desc), &config);
+
+		ret = ret ? 0 : pinconf_to_config_argument(config);
+
+		if ((PIN_CONFIG_DRIVE_STRENGTH == dbg_param[i]) && (!ret)) {
+			seq_printf(s, " %5s(x)", reg_names[i]);
+			continue;
+		}
+
+		seq_printf(s, " %5s(%1d)", reg_names[i], ret);
+	}
+}
+#endif
+
+static ssize_t config_show(struct device *dev,
+		struct device_attribute *attr, char *buf)
+{
+	struct gpiod_data *data = dev_get_drvdata(dev);
+	struct gpio_desc *desc = data->desc;
+	char *s = buf;
+	unsigned long config;
+	int ret;
+	int i;
+
+	mutex_lock(&data->mutex);
+
+	for (i = 0; i < ARRAY_SIZE(dbg_param); i++) {
+		config = pinconf_to_config_packed(dbg_param[i], 0);
+		ret = pinctrl_gpio_get_config(gpio_chip_hwgpio(desc), &config);
+
+		ret = ret ? 0 : pinconf_to_config_argument(config);
+
+		if ((PIN_CONFIG_DRIVE_STRENGTH == dbg_param[i]) && (!ret)) {
+			s += sprintf(s, " %5s(x)", reg_names[i]);
+			continue;
+		}
+
+		s += sprintf(s, " %5s(%1d)", reg_names[i], ret);
+	}
+
+	s += sprintf(s, "\n");
+
+	mutex_unlock(&data->mutex);
+
+	return s-buf;
+}
+
+static int get_config_arg(const char *buf, u32 *arg)
+{
+	const char *str = buf;
+	size_t len;
+	int ret = 0;
+
+	while (*str && !isspace(*str))
+		str++;
+
+	len = str - buf;
+	if (!len)
+		return -EINVAL;
+
+	if (*str && *str != '\n') {
+		ret = kstrtou32(skip_spaces(str), 10, arg);
+		if (ret)
+			return -EINVAL;
+		else
+			return 0;
+	}
+
+	return -EINVAL;
+}
+
+static int config_strncmp(const char *s1, const char *s2)
+{
+	if (!s1 || !s2)
+		return false;
+
+	if (strncmp(s1, s2, strlen(s2)))
+		return false;
+
+	return true;
+}
+
+static ssize_t config_store(struct device *dev,
+		struct device_attribute *attr, const char *buf, size_t size)
+{
+	struct gpiod_data *data = dev_get_drvdata(dev);
+	struct gpio_desc *desc = data->desc;
+	ssize_t			status;
+	u32 arg;
+
+	mutex_lock(&data->mutex);
+
+	if (config_strncmp(buf, "dis"))
+		status = gpiod_set_config(desc, pinconf_to_config_packed(PIN_CONFIG_BIAS_DISABLE, 0));
+	else if (config_strncmp(buf, "pu"))
+		status = gpiod_set_config(desc, pinconf_to_config_packed(PIN_CONFIG_BIAS_PULL_UP, 0));
+	else if (config_strncmp(buf, "pd"))
+		status = gpiod_set_config(desc, pinconf_to_config_packed(PIN_CONFIG_BIAS_PULL_DOWN, 0));
+	else if (config_strncmp(buf, "drv")) {
+		if (!get_config_arg(buf, &arg)) {
+			status = gpiod_set_config(desc, pinconf_to_config_packed(PIN_CONFIG_DRIVE_STRENGTH, arg));
+		} else {
+			status = -EINVAL;
+		}
+	}
+	else
+		status = -EINVAL;
+
+	mutex_unlock(&data->mutex);
+
+	return status ? : size;
+}
+static DEVICE_ATTR_RW(config);
+
 static irqreturn_t gpio_sysfs_irq(int irq, void *priv)
 {
 	struct gpiod_data *data = priv;
@@ -390,6 +519,7 @@
 	&dev_attr_edge.attr,
 	&dev_attr_value.attr,
 	&dev_attr_active_low.attr,
+	&dev_attr_config.attr,
 	NULL,
 };
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/gpio/gpiolib.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/gpio/gpiolib.c
old mode 100644
new mode 100755
index 59d8aff..d6849d3
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/gpio/gpiolib.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/gpio/gpiolib.c
@@ -4409,6 +4409,7 @@
 
 #ifdef CONFIG_DEBUG_FS
 
+void gpio_config_dbg_show(struct seq_file *s, struct gpio_desc	*desc);
 static void gpiolib_dbg_show(struct seq_file *s, struct gpio_device *gdev)
 {
 	unsigned		i;
@@ -4438,6 +4439,9 @@
 			gc->get ? (gc->get(gc, i) ? "hi" : "lo") : "?  ",
 			is_irq ? "IRQ " : "",
 			active_low ? "ACTIVE LOW" : "");
+
+		gpio_config_dbg_show(s, gdesc);
+
 		seq_printf(s, "\n");
 	}
 }
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/input/keyboard/Kconfig b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/input/keyboard/Kconfig
old mode 100644
new mode 100755
index 3f7a5ff..8cce3fb
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/input/keyboard/Kconfig
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/input/keyboard/Kconfig
@@ -788,4 +788,12 @@
 	  To compile this driver as a module, choose M here: the
 	  module will be called pmic-keys.
 
+config KEYBOARD_ZX29
+	tristate "poweron key from pmic zx234299a"
+	depends on MFD_ZX234290
+	help
+	  Say Y here if you want to use a ZX234299a poweron Key.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called zx234299a-keys.
 endif
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/input/keyboard/Makefile b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/input/keyboard/Makefile
old mode 100644
new mode 100755
index 1d689fd..8c0bf23
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/input/keyboard/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/input/keyboard/Makefile
@@ -70,3 +70,4 @@
 obj-$(CONFIG_KEYBOARD_TM2_TOUCHKEY)	+= tm2-touchkey.o
 obj-$(CONFIG_KEYBOARD_TWL4030)		+= twl4030_keypad.o
 obj-$(CONFIG_KEYBOARD_XTKBD)		+= xtkbd.o
+obj-$(CONFIG_KEYBOARD_ZX29)		+= zx29-keypad-int.o
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/input/keyboard/zx29-keypad-int.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/input/keyboard/zx29-keypad-int.c
new file mode 100755
index 0000000..0c29e67
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/input/keyboard/zx29-keypad-int.c
@@ -0,0 +1,525 @@
+/***********************************************************************
+* Copyright (C) 2016, Sanechips Corporation.
+*
+* File Name:  zx29-keypad-int.c
+* File Mark:
+* Description:
+* Others:
+* Version:  v1.0
+* Author:   qihongfang yuxiang lvfei ZhouTianbao
+* Date:     2017-2-28
+*
+* History 1:
+*     Date:
+*     Version:
+*     Author:
+*     Modification:
+**********************************************************************/
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/interrupt.h>
+#include <linux/input.h>
+#include <linux/errno.h>
+#include <linux/io.h>
+#include <linux/pm_runtime.h>
+#include <linux/slab.h>
+#include <asm/irq.h>
+#include <linux/workqueue.h>
+#include <linux/delay.h>
+#include <linux/mfd/zx234290.h>
+#include <linux/kthread.h>
+#include <linux/spinlock.h>
+#include <linux/pm_wakeup.h>
+#include <linux/semaphore.h>
+#include <linux/irqdomain.h>
+#include <linux/sched.h>
+#include <uapi/linux/sched/types.h>
+#include <linux/of_device.h>
+#include <linux/of_gpio.h>
+#include <linux/gpio_keys.h>
+
+/**********************************************************************/
+//#define ERROR_REGISTER_IRQ        -100
+
+#define KEY_STATUS_UP			0
+#define KEY_STATUS_DOWN			1   /*input×ÓϵͳÖÐvalueΪ1Êǰ´ÏÂ*/
+
+#define KEY_DELAY_TIME			30  /* ms */
+#define KEY_NUM					30
+
+static struct input_dev *button_dev = NULL;
+
+typedef struct _zx234290_keypad
+{
+    struct zx234290 *zx234290;
+}zx234290_keypad_data;
+
+struct key_pins{	
+	struct device	*dev;
+	struct pinctrl	*pctrl;
+	struct pinctrl_state *state0;/*int func*/
+	struct pinctrl_state *state1;/*gpio func*/
+	int gpio;
+	int irq;
+};
+
+struct key_pins p_keypins = {0};
+
+static zx234290_keypad_data zx234290_keypad;
+
+static spinlock_t kpd_lock;
+static volatile unsigned int key_active_count = 0;
+//static struct wake_lock keypad_wake_lock;
+struct wakeup_source * keypad_wake_lock;
+
+static struct semaphore kpd_sem;
+
+//#ifdef KPD_DEBUG
+struct key_info
+{
+    unsigned int index;
+	unsigned int code;
+	int value;
+};
+struct key_info key_info_tab[KEY_NUM]=
+{
+    {0},
+};
+static unsigned int key_info_idx = 0;
+static unsigned int key_info_counter = 0;
+//#endif
+
+static int zx29_kpd_queue(unsigned int code, int value)
+{
+    key_info_tab[key_info_idx].code = code;
+    key_info_tab[key_info_idx].value= value;
+    key_info_tab[key_info_idx].index = key_info_counter;
+    key_info_idx++;
+    key_info_counter++;
+    if(key_info_idx >= KEY_NUM)
+    {
+        key_info_idx = 0;
+    }
+    return 0;
+}
+
+static void zx29_key_set_active(void)
+{
+	spin_lock(&kpd_lock);
+
+    if(key_active_count == 0)
+    {
+		//zx_cpuidle_set_busy(IDLE_FLAG_KPD);
+		//wake_lock(&keypad_wake_lock);		
+		__pm_stay_awake(keypad_wake_lock);		
+    }
+    key_active_count++;
+
+	spin_unlock(&kpd_lock);
+}
+
+static void zx29_key_set_idle(void)
+{
+	spin_lock(&kpd_lock);
+
+    key_active_count--;
+    if(key_active_count == 0)
+    {
+    	//wake_unlock(&keypad_wake_lock);   	
+		//zx_cpuidle_set_free(IDLE_FLAG_KPD);		
+		__pm_relax(keypad_wake_lock);
+    }
+
+	spin_unlock(&kpd_lock);
+}
+
+static irqreturn_t zx29_kpd_pwron_inform(int irq, void *dev_id)
+{
+	up(&kpd_sem);
+	return IRQ_HANDLED;
+}
+
+/*******************************************************************************
+* Function: zx29_kpd_pwron_thread
+* Description:
+* Parameters:
+*          Input:
+*       Output:
+* Returns:
+* Others:
+********************************************************************************/
+extern struct input_dev *input_dev_table[32];
+
+int zx29_kpd_pwron_thread(void *dev_id)
+{
+	int ret = 0;
+	unsigned char status = 0;
+	
+	struct sched_param param = { .sched_priority = 33 };
+	sched_setscheduler(current, SCHED_FIFO, &param);
+
+	while (!kthread_should_stop()) {
+		down(&kpd_sem);
+
+		zx29_key_set_active();
+
+		msleep(10);
+		ret = zx234290_i2c_read_simple(ZX234290_REG_ADDR_STSA, &status);
+		if(ret)
+		{
+			printk(KERN_INFO "kpd read reg return=%d.\n", ret);
+		}
+		else if((status >> ZX234290_STATUSA_POWERON_LSH) & 0x1)
+		{
+			input_report_key(button_dev, KEY_POWER, KEY_STATUS_DOWN);			
+			input_sync(button_dev);
+
+			zx29_kpd_queue(KEY_POWER, KEY_STATUS_DOWN);
+			printk(KERN_INFO "kpd down code=%d .\n",KEY_POWER);
+
+			while(1)
+			{
+				msleep(60);
+
+				ret = zx234290_i2c_read_simple(ZX234290_REG_ADDR_STSA, &status);
+				if(ret)
+				{
+					printk(KERN_INFO "kpd read reg return=%d.\n", ret);
+					break;
+				}
+				//printk(KERN_INFO "kpd reg status=%d.\n", status);
+
+				if(((status>>ZX234290_STATUSA_POWERON_LSH)&0x1) == 0x0)
+				{
+					input_report_key(button_dev, KEY_POWER, KEY_STATUS_UP);
+					input_sync(button_dev);
+
+					zx29_kpd_queue(KEY_POWER, KEY_STATUS_UP);
+					printk(KERN_INFO "kpd up code=%d.\n",KEY_POWER);
+					break;
+				}
+			}
+		}
+		else
+		{
+			printk(KERN_INFO "kpd power key noise.\n");
+		}
+
+		zx29_key_set_idle();
+	}
+
+	return 0;
+}
+
+
+/*******************************************************************************
+* Function: zx29_kpd_request_irqs
+* Description:
+* Parameters:
+*          Input:
+*       Output:
+********************************************************************************/
+static int zx29_kpd_request_irqs(struct platform_device *pdev)
+{
+    int ret = -1;
+	int irq_pwrkey_int = 0;
+      
+	sema_init(&kpd_sem, 0);
+	kthread_run(zx29_kpd_pwron_thread, NULL, "kpd_pwron_thread");
+	
+	irq_pwrkey_int = irq_create_mapping(zx234290_keypad.zx234290->irq_domain, ZX234290_INT_PWRON);
+	if (!irq_pwrkey_int) {
+		printk("Failed to create mapping poweron IRQ\n");
+		return	-ENXIO;
+	}
+	
+	ret = devm_request_threaded_irq(&pdev->dev, irq_pwrkey_int, NULL,
+				zx29_kpd_pwron_inform, IRQF_ONESHOT,
+				"zx234290-pwrkey-int", zx234290_keypad.zx234290);      
+    if(ret)
+    {	
+		printk("IRQ poweron key error %d\n", ret);
+        return ret;
+    }
+  
+    return ret;
+}
+
+static int zx29_gpio_kpd_get_keystate(void)
+{
+    unsigned int gpio_state = 0;
+    int irq;
+
+	if (pinctrl_select_state(p_keypins.pctrl, p_keypins.state1) < 0) {
+		dev_err(p_keypins.dev, "setting gpio_keys gpio failed\n");
+	}
+
+	return gpio_get_value(p_keypins.gpio);
+}
+
+/*******************************************************************************
+* Function: zx29_gpio_kpd_request_irqs
+* Description:
+* Parameters:
+*          Input:
+*       Output:
+********************************************************************************/
+static irqreturn_t zx29_gpio_kpd_irq_thread(int irq, void *dev_id)
+{
+	struct gpio_keys_button *buttons = (struct gpio_keys_button *)dev_id;
+	int gpio_val = 0;
+	int state;
+
+	zx29_key_set_active();
+	gpio_val = zx29_gpio_kpd_get_keystate();
+	state = !!gpio_val ^ !!buttons->active_low;
+	
+	if (pinctrl_select_state(p_keypins.pctrl, p_keypins.state0) < 0) {
+		dev_err(p_keypins.dev, "setting card detect irq failed\n");
+	}
+	
+	irq_set_irq_type(irq,gpio_val ? IRQ_TYPE_LEVEL_LOW : IRQ_TYPE_LEVEL_HIGH);
+
+	input_set_capability(button_dev, EV_KEY, buttons->code);
+	input_report_key(button_dev, buttons->code, state);  //Éϱ¨key ¼üÖµ
+	input_sync(button_dev);
+	zx29_kpd_queue(buttons->code, state);
+	printk(KERN_INFO "kpd %s code=%d, irq=%d.\n",(state ? "down" : "up"),buttons->code,irq);
+
+	//enable_irq(irq);	  //´ò¿ªÖжÏ
+#if 1
+	zx29_key_set_idle();
+#endif
+	return IRQ_HANDLED;
+}
+
+
+
+static int key_init_pinctrl(struct platform_device *pdev)
+{
+	enum of_gpio_flags flags;
+	int ret = 0;
+
+	/* pinctrl */
+	p_keypins.dev=&pdev->dev;
+
+	p_keypins.pctrl = devm_pinctrl_get(&pdev->dev);
+	if (IS_ERR(p_keypins.pctrl)) {
+		dev_warn(&pdev->dev, "Failed to get gpio key int pins");
+		p_keypins.pctrl = NULL;
+		return 0;
+	}
+	p_keypins.state0= pinctrl_lookup_state(p_keypins.pctrl, "key_int");
+	if (IS_ERR(p_keypins.state0)) {
+		dev_err(&pdev->dev, "missing key int\n");
+	}
+	p_keypins.state1 = pinctrl_lookup_state(p_keypins.pctrl, "key_gpio");
+	if (IS_ERR(p_keypins.state1)) {
+		dev_err(&pdev->dev, " missing key_gpio \n");
+	}
+	if (pinctrl_select_state(p_keypins.pctrl, p_keypins.state1) < 0) {
+		dev_err(&pdev->dev, "setting key gpio failed\n");
+	}
+		
+	p_keypins.gpio= of_get_gpio_flags(pdev->dev.of_node, 0, &flags);
+	if (!gpio_is_valid(p_keypins.gpio)) {
+		pr_info("key%d key_gpio no found\n",pdev->id);
+	}
+	gpio_direction_input(p_keypins.gpio);
+
+
+	if (pinctrl_select_state(p_keypins.pctrl, p_keypins.state0) < 0) {
+		dev_err(p_keypins.dev, "setting card detect irq failed\n");
+	}
+	
+	return ret;
+}
+
+static int zx29_gpio_kpd_probe(struct platform_device *pdev)
+{
+    static int i = 0;
+	struct input_handle *handle;
+	struct device_node *np = pdev->dev.of_node;
+	int irq = 0;
+	int ret =-0;
+	struct gpio_keys_button *buttons;	
+	struct gpio_desc *desc;
+	
+
+	buttons = devm_kcalloc(&pdev->dev,1, sizeof(struct gpio_keys_button),GFP_KERNEL);
+	if(!buttons)
+		return -ENOMEM;
+	irq = platform_get_irq(pdev, 0);
+	if (irq < 0) {
+		return irq;
+	}
+	
+	desc = devm_gpiod_get_index(&pdev->dev, 0, 0, GPIOD_IN);
+	if (IS_ERR(desc))
+		return PTR_ERR(desc);
+	buttons->active_low = gpiod_is_active_low;;
+
+	device_property_read_u32(&pdev->dev, "linux,code", &buttons->code);	
+		
+	device_property_read_string(&pdev->dev, "label", &buttons->desc);
+	key_init_pinctrl(pdev);
+
+	//ret = request_threaded_irq(irq, NULL, zx29_gpio_kpd_irq_thread, IRQF_ONESHOT,buttons->desc,buttons);
+	ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
+				zx29_gpio_kpd_irq_thread, IRQF_ONESHOT,
+				 dev_name(&pdev->dev),buttons);      
+    if(ret)
+    {	
+		printk("(%s)IRQ gpio key error %d\n",  dev_name(&pdev->dev),ret);
+        return ret;
+    }
+	
+	irq_set_irq_wake(irq, 1);
+
+    return ret;
+}
+static int zx29_gpio_kpd_remove(struct platform_device *pdev)
+{
+
+    return 0;
+}
+/*******************************************************************************
+* Function: zx29_kpd_probe
+* Description:
+* Parameters:
+*          Input:
+*        Output:
+* Returns:
+********************************************************************************/
+static int zx29_kpd_probe(struct platform_device *pdev)
+{
+    int error = -1;
+    static int i = 0;
+	struct input_handle *handle;
+
+    zx234290_keypad.zx234290 = dev_get_drvdata(pdev->dev.parent);
+
+    button_dev = input_allocate_device();
+    if(!button_dev)
+    {
+        printk("allocate_device error.\n");
+        return error;
+    }
+    button_dev->name = pdev->name;
+    button_dev->evbit[0] = BIT_MASK(EV_KEY)|BIT_MASK(EV_REP);
+
+
+    error = input_register_device(button_dev);
+    if(error)
+    {
+        printk("register device error\n");
+        goto err_free_dev;
+    }
+	handle = container_of(button_dev->h_list.next, struct input_handle, d_node);
+	/* printk(KERN_INFO "%s registered evdev %s/%p.\n", __FUNCTION__, handle->name, handle->private); */
+	input_set_capability(button_dev, EV_KEY, KEY_POWER);
+
+    platform_set_drvdata(pdev, button_dev);
+
+	spin_lock_init(&kpd_lock);
+	//wake_lock_init(&keypad_wake_lock, WAKE_LOCK_SUSPEND, "keypad");
+	
+	//keypad_wake_lock = wakeup_source_create("kpd_wake");
+	keypad_wake_lock = wakeup_source_register(NULL, "kpd_wake");
+	if (!keypad_wake_lock)
+		return -ENOMEM;
+
+    zx29_kpd_request_irqs(pdev);
+    return 0;
+
+err_free_dev:	
+    input_free_device(button_dev);
+    return error;
+}
+
+
+/*******************************************************************************
+* Function: zx29_kpd_remove
+* Description:
+* Parameters:
+*          Input:
+*        Output:
+* Returns:
+********************************************************************************/
+static int zx29_kpd_remove(struct platform_device *pdev)
+{
+    static struct input_dev *button_dev = NULL;
+    int i = 0;
+ printk("qhf %s\n",__func__);
+    button_dev = (struct input_dev *)platform_get_drvdata(pdev);
+    input_free_device(button_dev);
+    button_dev = NULL;
+
+	wakeup_source_unregister(keypad_wake_lock);
+
+    return 0;
+}
+
+static int zx29_kpd_resume(struct platform_device *pdev)
+{
+    int i = 0;
+
+    printk(KERN_INFO "%s\n", __FUNCTION__);
+    return 0;
+}
+
+static int zx29_kpd_suspend(struct platform_device *pdev, pm_message_t state)
+{
+    int i = 0;
+
+    printk(KERN_INFO "%s\n", __FUNCTION__);
+    return 0;
+}
+
+static struct platform_driver zx29_kpd_driver =
+{
+    .probe  = zx29_kpd_probe,
+    .remove = zx29_kpd_remove,
+    .driver =
+    {
+        .name   =   "zx234290-powerkey",
+        .owner  =   THIS_MODULE,
+    },
+    //.resume = zx29_kpd_resume,
+    //.suspend    = zx29_kpd_suspend,
+};
+
+static int __init zx29_kpd_init(void)
+{
+    return platform_driver_register(&zx29_kpd_driver);
+}
+
+static void __exit zx29_kpd_exit(void)
+{
+    platform_driver_unregister(&zx29_kpd_driver);
+}
+
+static const struct of_device_id key_gpiokey_dt_ids[] = {
+	{ .compatible = "zxic,gpio-keys" },
+	{}
+};
+MODULE_DEVICE_TABLE(of, key_gpiokey_dt_ids);
+
+static struct platform_driver zx29_gpio_keys_driver = {
+	.driver	= {
+		.name	= "keys-gpio",
+		.of_match_table = key_gpiokey_dt_ids,
+	},
+	.probe	= zx29_gpio_kpd_probe,
+	.remove	= zx29_gpio_kpd_remove,
+};
+module_platform_driver(zx29_gpio_keys_driver);
+
+module_init(zx29_kpd_init);
+module_exit(zx29_kpd_exit);
+
+MODULE_AUTHOR("Sanechips");
+MODULE_DESCRIPTION("Sanechips Keypad Driver");
+MODULE_LICENSE("GPL");
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/Makefile b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/Makefile
old mode 100644
new mode 100755
index dc7bd70..05bb5fd
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/Makefile
@@ -109,7 +109,11 @@
 obj-$(CONFIG_MFD_TPS80031)	+= tps80031.o
 obj-$(CONFIG_MENELAUS)		+= menelaus.o
 
-obj-$(CONFIG_MFD_ZX234290)	+= zx234290-i2c.o zx234290-regulator.o zx234290-regulator-wrapper.o
+zx234290-objs			:= zx234290-core.o zx234290-irq.o
+obj-$(CONFIG_MFD_ZX234290)	+= zx234290.o
+obj-$(CONFIG_MFD_ZX234290)	+= zx234290-i2c.o
+obj-$(CONFIG_MFD_ZX234290)	+= zx234290-regulator.o
+obj-$(CONFIG_MFD_ZX234290)	+= zx234290-regulator-wrapper.o
 obj-$(CONFIG_MFD_ZX234290)	+= zx234290-adc.o
 obj-$(CONFIG_TWL4030_CORE)	+= twl-core.o twl4030-irq.o twl6030-irq.o
 obj-$(CONFIG_TWL4030_POWER)    += twl4030-power.o
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-core.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-core.c
new file mode 100755
index 0000000..d23c4b0
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-core.c
@@ -0,0 +1,645 @@
+/*
+ * zx234290-core.c  --  Device access for ZX234290 PMICs
+ *
+ * Copyright 2016 ZTE Inc.
+ *
+ * Author: yuxiang<yu.xiang5@zte.com.cn>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/gpio.h>
+#include <linux/mfd/core.h>
+#include <linux/mfd/zx234290.h>
+
+#include <linux/debugfs.h>
+#include <asm/uaccess.h>
+
+#include <linux/of_gpio.h>
+#include <linux/gpio_keys.h>
+
+#include <linux/delay.h>
+#include <dma_cfg.h>
+
+
+//#include <mach/peri_cfg.h>
+
+//void __iomem * s_poweron_type_addr;
+ unsigned long s_poweron_type_addr;
+
+/*the power on info, boot_reason */
+typedef enum
+{
+	POWER_ON_NORMAL = 0,
+	POWER_ON_FOTA,
+	POWER_ON_CHARGING,
+	POWER_ON_RTC,
+	POWER_ON_RESET,
+	POWER_ON_HDT_TEST,
+	POWER_ON_EXCEPTRESET,
+	POWER_ON_LOCALUPDATE,
+	POWER_ON_BOOST_IN,
+	POWER_ON_AMT,
+	POWER_ON_PRODUCTION,
+	POWER_ON_INVALID,
+}T_ZDrvSys_PowerOn_Type;
+
+static struct resource regulator_resources[] = {
+	{
+		.name	= "bulk-error",
+		.start	= ZX234290_INT_BUCK_FAUL,
+		.end	= ZX234290_INT_BUCK_FAUL,
+		.flags	= IORESOURCE_IRQ,
+	},
+	{
+		.name	= "ldo_error",
+		.start	= ZX234290_INT_LDO_FAUL,
+		.end	= ZX234290_INT_LDO_FAUL,
+		.flags	= IORESOURCE_IRQ,
+	},
+};
+
+static struct resource rtc_resources[] = {
+	{
+		.name	= "zx234290-rtc-alarm",
+		.start	= ZX234290_INT_RTC_ALRM,
+		.end	= ZX234290_INT_RTC_ALRM,
+		.flags	= IORESOURCE_IRQ,
+	},
+	{
+		.name	= "zx234290-rtc-min",
+		.start	= ZX234290_INT_RTC_MIN,
+		.end	= ZX234290_INT_RTC_MIN,
+		.flags	= IORESOURCE_IRQ,
+	},
+	{
+		.name	= "zx234290-rtc-hour",
+		.start	= ZX234290_INT_RTC_HOUR,
+		.end	= ZX234290_INT_RTC_HOUR,
+		.flags	= IORESOURCE_IRQ,
+	},
+};
+static struct resource powerkey_resources[] = {
+	{
+		.name	= "zx234290-pwrkey-int",
+		.start	= ZX234290_INT_PWRON,
+		.end	= ZX234290_INT_PWRON,
+		.flags	= IORESOURCE_IRQ,
+	},
+};
+
+
+static struct mfd_cell zx234290_cell[] = {
+	{
+		.name = "zx234290-regulators",		
+		.num_resources	= 2,
+		.resources	= &regulator_resources[0],
+		.id		= -1,
+	},
+	{
+		.name = "zx234290-rtc",		
+		.num_resources	= 3,
+		.resources	= &rtc_resources[0],
+		.id		= -1,
+	},
+	{
+		.name = "zx234290-gpadc",
+	},
+	{
+		.name = "zx234290-powerkey",			
+		.num_resources	= 1,
+		.resources	= &powerkey_resources[0],
+		.id 	= -1,
+	},
+};
+
+unsigned int boot_reason = POWER_ON_NORMAL;
+struct wakeup_source * adc_wakelock;
+
+unsigned int * get_boot_reason_addr(void)
+{
+	return (unsigned int *)s_poweron_type_addr;
+}
+EXPORT_SYMBOL(get_boot_reason_addr);
+
+static void get_boot_reason(void)
+{
+	//boot_reason = *(unsigned int *)POWERON_TYPE_BASE;
+	if(s_poweron_type_addr){
+		boot_reason = readl(s_poweron_type_addr/*+0xf8*/);
+
+		printk(KERN_INFO "[PMU] get boot_reason = %d from 0x%x.\n",boot_reason,s_poweron_type_addr);
+	}
+	else
+		printk(KERN_INFO "[PMU] boot_reason is unknown.\n");
+}
+
+#if 1
+int zx234290_set_bits(struct zx234290 *zx234290, u8 reg, u8 mask)
+{
+	u8 data;
+	int err;
+
+	mutex_lock(&zx234290->io_mutex);
+
+	err = zx234290->read(zx234290, reg, 1, &data);
+	if (err) {
+		dev_err(zx234290->dev, "Read from reg 0x%x failed\n", reg);
+		goto out;
+	}
+
+	data |= mask;
+	err = zx234290->write(zx234290, reg, 1, &data);
+	if (err)
+		dev_err(zx234290->dev, "Write to reg 0x%x failed\n", reg);
+
+out:
+	mutex_unlock(&zx234290->io_mutex);
+	return err;
+}
+EXPORT_SYMBOL_GPL(zx234290_set_bits);
+
+int zx234290_clear_bits(struct zx234290 *zx234290, u8 reg, u8 mask)
+{
+	u8 data;
+	int err;
+
+	mutex_lock(&zx234290->io_mutex);
+	err = zx234290->read(zx234290, reg, 1, &data);
+	if (err) {
+		dev_err(zx234290->dev, "Read from reg 0x%x failed\n", reg);
+		goto out;
+	}
+
+	data &= ~mask;
+	err = zx234290->write(zx234290, reg, 1, &data);
+	if (err)
+		dev_err(zx234290->dev, "Write to reg 0x%x failed\n", reg);
+
+out:
+	mutex_unlock(&zx234290->io_mutex);
+	return err;
+}
+EXPORT_SYMBOL_GPL(zx234290_clear_bits);
+#endif
+
+static inline int zx234290_read(struct zx234290 *zx234290, u8 reg)
+{
+	u8 val;
+	int err;
+
+	err = zx234290->read(zx234290, reg, 1, &val);
+	if (err < 0)
+		return err;
+
+	return val;
+}
+
+static inline int zx234290_write(struct zx234290 *zx234290, u8 reg, u8 val)
+{
+	return zx234290->write(zx234290, reg, 1, &val);
+}
+
+#if 1
+int zx234290_reg_read(struct zx234290 *zx234290, u8 reg)
+{
+	int data;
+
+	mutex_lock(&zx234290->io_mutex);
+
+	data = zx234290_read(zx234290, reg);
+	if (data < 0)
+		dev_err(zx234290->dev, "Read from reg 0x%x failed\n", reg);
+
+	mutex_unlock(&zx234290->io_mutex);
+	return data;
+}
+EXPORT_SYMBOL_GPL(zx234290_reg_read);
+
+int zx234290_reg_write(struct zx234290 *zx234290, u8 reg, u8 val)
+{
+	int err;
+
+	mutex_lock(&zx234290->io_mutex);
+
+	err = zx234290_write(zx234290, reg, val);
+	if (err < 0)
+		dev_err(zx234290->dev, "Write for reg 0x%x failed\n", reg);
+
+	mutex_unlock(&zx234290->io_mutex);
+	return err;
+}
+EXPORT_SYMBOL_GPL(zx234290_reg_write);
+#endif
+
+extern int zx234290_i2c_write_simple(u8 reg, void *src);
+extern int zx234290_i2c_read_simple(u8 reg, void *dest);
+int Zx234290_SetVldo6Onoff(void)
+{
+    int ret = 0;
+    u8 reg_addr=0, reg_val=0;
+    reg_addr = 0x21;
+    ret = zx234290_i2c_read_simple(reg_addr,&reg_val);
+    if (ret) {
+        return -EIO;
+    }
+    reg_val = reg_val&(~(1<<5));
+    ret = zx234290_i2c_write_simple(reg_addr, &reg_val);
+    if (ret) {
+        return -EIO;
+    }
+    return 0;
+}
+EXPORT_SYMBOL(Zx234290_SetVldo6Onoff);
+#if 0
+int zx297510_write_pmu_flag_charging(void)
+{
+	int ret = 0;
+	unsigned char reg = 0;
+	ret = zx234290_i2c_read_simple(0xf, &reg);
+	reg = reg|0xff;
+	ret += zx234290_i2c_write_simple(0xf, &reg);
+	ret = zx234290_i2c_read_simple(0xe, &reg);
+	reg = reg|0x3;
+	ret += zx234290_i2c_write_simple(0xe, &reg);
+	return ret;
+}
+#endif
+//static void __iomem* PMU_ADDR_VIR;
+//#define GPIO_PMU_PSHOLD ZX29_GPIO_51
+unsigned int gpio_num_pshold;
+
+void zx234290_pshold_pull_down(void)
+{
+	//PMU_ADDR_VIR = ioremap(0x10d6c0,4);
+	//__raw_writel(0x0,PMU_ADDR_VIR);
+	if(gpio_num_pshold)
+		gpio_direction_output(gpio_num_pshold,0);
+	else
+		printk("zx234290_pshold_pull_down error\n");
+}
+
+//extern int zx234290_rtc_disable_timer_alarm();
+EXPORT_SYMBOL(zx234290_pshold_pull_down);
+
+/***********yuwei added at 20170523**************/
+void zx234290_pshold_pull_up(void)
+{
+	if(gpio_num_pshold)
+		gpio_direction_output(gpio_num_pshold,1);
+	else
+		printk("zx234290_pshold_pull_up error\n");
+}
+/**************/
+
+static int zx234290_set_softon(int on)
+{
+	u8 reg = 0;
+    int ret;
+
+    ret = zx234290_i2c_read_simple(ZX234290_REG_ADDR_SYS_CTRL, &reg);
+    if (ret) {
+        return -EIO;
+    }
+
+    if ((reg >> ZX234290_SOFTON_LSH) != on) {
+        reg ^= (0x01 << ZX234290_SOFTON_LSH);
+        ret = zx234290_i2c_write_simple(ZX234290_REG_ADDR_SYS_CTRL, &reg);
+        if (ret) {
+            return -EIO;
+        }
+    }
+
+    return 0;
+}
+static int zx234290_set_softon_PSM(int on)
+{
+	u8 reg = 0;
+    int ret;
+
+    ret = zx234290_i2c_read_simple_PSM(ZX234290_REG_ADDR_SYS_CTRL, &reg);
+    if (ret) {
+        return -EIO;
+    }
+
+    if ((reg >> ZX234290_SOFTON_LSH) != on) {
+        reg ^= (0x01 << ZX234290_SOFTON_LSH);
+        ret = zx234290_i2c_write_simple_PSM(ZX234290_REG_ADDR_SYS_CTRL, &reg);
+        if (ret) {
+            return -EIO;
+        }
+    }
+
+    return 0;
+}
+
+
+static bool debug_stop_poweroff = false;
+module_param(debug_stop_poweroff, bool, 0644);
+//extern void zx29_restart(char str,const char * cmd);
+static void zx234290_power_off(void)
+{
+	//void __iomem *reset_charging_reg;
+	//reset_charging_reg = ZX29_TOP_VA;
+	//zx234290_rtc_disable_timer_alarm();
+	//Zx234290_SetVldo6Onoff();
+	u8 reg_poweron = 0;
+    int ret;
+
+	if(debug_stop_poweroff )
+	{
+		printk(KERN_INFO"debug_stop_poweroff= 0x%x, for debug, bug_on!!!!\n", debug_stop_poweroff);
+		panic("poweroff");
+	}
+	zx234290_set_softon_PSM(0);
+	zx234290_pshold_pull_down();
+#if 1
+	while(1){
+		ret = zx234290_i2c_read_simple_PSM(ZX234290_REG_ADDR_STSA, &reg_poweron);	
+		if (ret) {
+			printk(KERN_INFO"power off pmu i2c read err\n");
+			break;
+		}
+		if((reg_poweron&(1<<ZX234290_STATUSA_POWERON_LSH))== 0)
+			break;
+	}
+	msleep(50);
+	/*reset to charging*/
+	//zx29_restart(NULL,"drv_key reboot");
+#endif
+}
+
+
+#if defined(CONFIG_DEBUG_FS)
+static ssize_t debugfs_regs_write(struct file *file, const char __user *buf,size_t nbytes, loff_t *ppos)
+{
+	struct zx234290 *zx234290 = file->private_data;
+
+	unsigned int val1, val2;
+	u8 reg, value;
+	int ret;
+	char *kern_buf;
+
+	kern_buf = kzalloc(nbytes, GFP_KERNEL);
+
+	if (!kern_buf) {
+		printk(KERN_INFO "zx234290-core: Failed to allocate buffer\n");
+		return -ENOMEM;
+	}
+
+	if (copy_from_user(kern_buf, (void  __user *)buf, nbytes)) {
+		kfree(kern_buf);
+		return -ENOMEM;
+	}
+	printk(KERN_INFO "%s input str=%s,nbytes=%d \n", __func__, kern_buf,nbytes);
+
+	ret = sscanf(kern_buf, "%x:%x", &val1, &val2);
+	if (ret < 2 || val1 > ZX234290_MAX_REGISTER ) {
+		printk(KERN_INFO "zx234290-core: failed to read user buf, ret=%d, input 0x%x:0x%x\n",
+				ret, val1, val2);
+		kfree(kern_buf);
+		return -EINVAL;
+	}
+	kfree(kern_buf);
+
+	reg = val1 & 0xff;
+	value = val2 & 0xff;
+	printk(KERN_INFO "%s input %x,%x; reg=%x,value=%x\n", __func__, val1, val2, reg, value);
+	ret = zx234290_i2c_write_simple(reg, &value);
+
+	return ret ? ret : nbytes;
+}
+
+static int debugfs_regs_show(struct seq_file *s, void *v)
+{
+	int i;
+	u8 value[ZX234290_MAX_REGISTER];
+	int ret=0;
+	u8 reg_rtc_ctrl2 = 0;
+
+	printk(KERN_INFO "%s\n", __func__);
+	memset(value, 0, sizeof(value));
+	for (i = 0; i < ZX234290_MAX_REGISTER; i++){
+		ret = zx234290_i2c_read_simple(i, &(value[i]));
+		if(ret){
+			printk(KERN_INFO "%s err=%d, break\n", __func__, ret);
+			seq_printf(s, "%s err=%d, break", __func__, ret);
+			return ret;
+		}
+	}
+
+	for (i = 0; i < ZX234290_MAX_REGISTER; i++) {
+		if((i+1)%9 == 0)
+			seq_printf(s, "\n");
+
+		seq_printf(s, "[0x%x]%02x ", i, value[i]);
+	}
+
+	reg_rtc_ctrl2 = value[ZX234290_REG_ADDR_RTC_CTRL2];
+	seq_printf(s, "\nAF=%d,TF=%d,Alarm %s,Timer %s\n",(reg_rtc_ctrl2&0x8),(reg_rtc_ctrl2&0x4),
+		  			(reg_rtc_ctrl2&0x2)? "enable":"disable",(reg_rtc_ctrl2&0x1)? "enable":"disable");
+	if(value[ZX234290_REG_ADDR_BUCK_FAULT_STATUS]||value[ZX234290_REG_ADDR_LDO_FAULT_STATUS])
+		seq_printf(s, "ldo or bulk fault!!!!!\n ");
+	else
+		seq_printf(s, "no ldo or bulk fault\n ");
+	if(value[ZX234290_REG_ADDR_TIMER_CTRL]&0x80)
+		seq_printf(s, "timer enable\n ");
+	else
+		seq_printf(s, "timer disable\n ");
+	
+
+	return ret;
+}
+
+#define DEBUGFS_FILE_ENTRY(name) \
+static int debugfs_##name##_open(struct inode *inode, struct file *file) \
+{\
+return single_open(file, debugfs_##name##_show, inode->i_private); \
+}\
+\
+static const struct file_operations debugfs_##name##_fops = { \
+.owner= THIS_MODULE, \
+.open= debugfs_##name##_open, \
+.write=debugfs_##name##_write, \
+.read= seq_read, \
+.llseek= seq_lseek, \
+.release= single_release, \
+}
+
+DEBUGFS_FILE_ENTRY(regs);
+
+int zx234290_rtc_settimer(int sec);
+
+static int debugfs_adc_get(void *data, u64 *val)
+{
+	switch ((int)data) {
+	case 0:		
+		*val = get_battery_voltage();
+		//zx234290_rtc_settimer(10);		
+		break;
+	case 1:
+		*val = get_adc1_voltage();
+		break;
+	case 2:
+		*val = get_adc2_voltage();
+		break;
+	default:
+		*val = -1;
+		break;
+	}
+
+    return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(fops_adc_ro, debugfs_adc_get, NULL, "%llumV\n");
+
+static struct dentry *g_pmu_root;
+
+extern u32 int_irq_times;
+extern u32 int_thread_times;
+
+static void debugfs_pmu_init(struct zx234290 *zx234290)
+{
+	struct dentry *root;
+	struct dentry *node;
+	int i;
+	
+	if(!zx234290)
+		return; 
+	//create root
+	root = debugfs_create_dir("pmu_zx29", NULL);
+	if (!root){
+		dev_err(zx234290->dev, "debugfs_create_dir err=%d\n", IS_ERR(root));
+		goto err;
+	}
+	//print regs;	
+	node = debugfs_create_file("regs", S_IRUGO | S_IWUGO, root, zx234290,  &debugfs_regs_fops); 
+	if (!node){ 
+		dev_err(zx234290->dev, "debugfs_create_dir err=%d\n", IS_ERR(node));
+		goto err;
+	}
+	//print adc0;
+	node = debugfs_create_file("adc0", S_IRUGO, root, 0,  &fops_adc_ro);
+	if (!node){
+		dev_err(zx234290->dev, "debugfs_create_dir err=%d\n", IS_ERR(node));
+		goto err;
+	}
+	//print adc1;
+	node = debugfs_create_file("adc1", S_IRUGO, root, 1,  &fops_adc_ro);
+	if (!node){ 
+		dev_err(zx234290->dev, "debugfs_create_dir err=%d\n", IS_ERR(node));
+		goto err;
+	}
+	//print adc2;
+	node = debugfs_create_file("adc2", S_IRUGO, root, 2,  &fops_adc_ro);
+	if (!node){ 
+		dev_err(zx234290->dev, "debugfs_create_dir err=%d\n", IS_ERR(node));
+		goto err;
+	}
+	//print u32
+	debugfs_create_u32("irq_cnt", S_IRUGO, root, &int_irq_times);
+
+	//print u32
+	debugfs_create_u32("thread_cnt", S_IRUGO, root, &int_thread_times);
+	
+	g_pmu_root = (void *)root;
+	return;
+err: 
+	dev_err(zx234290->dev, "debugfs_pmu_init err\n");
+}
+
+#endif
+
+
+int zx234290_device_init(struct zx234290 *zx234290)
+{
+	//struct zx234290_board *pmic_plat_data = zx234290->dev->platform_data;
+	enum of_gpio_flags flags;
+	//struct zx234290_platform_data *init_data;
+	int ret;
+	int irq;
+	
+	s_poweron_type_addr = (unsigned long)ioremap(POWERON_TYPE_ADDR,0x800);
+	get_boot_reason();
+    /*
+	init_data = kzalloc(sizeof(struct zx234290_platform_data), GFP_KERNEL);
+	if (init_data == NULL)
+		return -ENOMEM;
+    */
+	mutex_init(&zx234290->io_mutex);
+	dev_set_drvdata(zx234290->dev, zx234290);
+
+	ret = mfd_add_devices(zx234290->dev, -1,
+			      zx234290_cell, ARRAY_SIZE(zx234290_cell),
+			      NULL,0, 0);
+	if (ret < 0)
+		goto err;
+	
+	gpio_num_pshold= of_get_gpio_flags(zx234290->dev->of_node, 0, &flags);
+	if (!gpio_is_valid(gpio_num_pshold)) {
+		pr_info("pmu pshold error\n");
+	}
+	gpio_direction_input(gpio_num_pshold);
+
+    //gpio_num_pshold = pmic_plat_data->pshold_gpio_num;//by yuxiang
+   // gpio_func_pshold= pmic_plat_data->pshold_gpio_func;//by yuxiang
+	if (!pm_power_off)
+		pm_power_off = zx234290_power_off;
+
+#ifdef PSHOLD_PULLUP_IN_POWEROFFCHARGING
+	/* CPE MDL don't control ps_hold pin. */
+	if (boot_reason == POWER_ON_CHARGING) {
+		zx234290_pshold_pull_up();
+	}
+#endif
+/***********PJT added **************/
+	zx234290_get_chip_version();
+	adc_wakelock = wakeup_source_register(NULL, "adc_wake");
+	if (!adc_wakelock)
+		return -ENOMEM;
+
+	//init_data->irq = pmic_plat_data->irq;
+	//init_data->irq_base = pmic_plat_data->irq_base;
+	//irq = gpio_to_irq(pmic_plat_data->irq_gpio_num);
+	ret = zx234290_irq_init(zx234290);
+	if (ret < 0)
+		goto err;
+
+
+#if defined(CONFIG_DEBUG_FS)
+	debugfs_pmu_init(zx234290);
+#endif
+	//kfree(init_data);
+	return ret;
+
+err:
+	//kfree(init_data);
+	mfd_remove_devices(zx234290->dev);
+	kfree(zx234290);
+	return ret;
+}
+
+void zx234290_device_exit(struct zx234290 *zx234290)
+{
+#if defined(CONFIG_DEBUG_FS)
+	if(g_pmu_root){
+		printk(KERN_INFO "zx234290_device_exit:debugfs_remove_recursive \n");
+		debugfs_remove_recursive(g_pmu_root);
+	}
+#endif
+	mfd_remove_devices(zx234290->dev);
+	kfree(zx234290);
+}
+
+
+MODULE_AUTHOR("yuxiang");
+MODULE_DESCRIPTION("ZX234290 chip family multi-function driver");
+MODULE_LICENSE("GPL");
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-i2c.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-i2c.c
old mode 100644
new mode 100755
index cf6905d..5f1d8a1
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-i2c.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-i2c.c
@@ -23,8 +23,8 @@
 //#include <linux/wakelock.h>
 #include <linux/debugfs.h>
 #include <asm/uaccess.h>
+#include <linux/of_irq.h>
 
-struct wakeup_source * adc_wakelock;
 
 static struct i2c_client *zx234290_i2c =0;
 static DEFINE_MUTEX(zx234290_i2c_lock);
@@ -235,203 +235,31 @@
 }
 #endif
 
-#if defined(CONFIG_DEBUG_FS)
-static ssize_t debugfs_regs_write(struct file *file, const char __user *buf,size_t nbytes, loff_t *ppos)
+static int zx234290_init_pinctrl(struct zx234290 *zx234290)
 {
-	struct zx234290 *zx234290 = file->private_data;
+	struct pinctrl	*pctrl;
+	struct pinctrl_state	*state0;
 
-	unsigned int val1, val2;
-	u8 reg, value;
-	int ret;
-	char *kern_buf;
-
-	kern_buf = kzalloc(nbytes, GFP_KERNEL);
-
-	if (!kern_buf) {
-		printk(KERN_INFO "zx234290-core: Failed to allocate buffer\n");
-		return -ENOMEM;
-	}
-
-	if (copy_from_user(kern_buf, (void  __user *)buf, nbytes)) {
-		kfree(kern_buf);
-		return -ENOMEM;
-	}
-	printk(KERN_INFO "%s input str=%s,nbytes=%d \n", __func__, kern_buf,nbytes);
-
-	ret = sscanf(kern_buf, "%x:%x", &val1, &val2);
-	if (ret < 2 || val1 > ZX234290_MAX_REGISTER ) {
-		printk(KERN_INFO "zx234290-core: failed to read user buf, ret=%d, input 0x%x:0x%x\n",
-				ret, val1, val2);
-		kfree(kern_buf);
-		return -EINVAL;
-	}
-	kfree(kern_buf);
-
-	reg = val1 & 0xff;
-	value = val2 & 0xff;
-	printk(KERN_INFO "%s input %x,%x; reg=%x,value=%x\n", __func__, val1, val2, reg, value);
-	ret = zx234290_i2c_write_simple(reg, &value);
-
-	return ret ? ret : nbytes;
-}
-
-static int debugfs_regs_show(struct seq_file *s, void *v)
-{
-	int i;
-	u8 value[ZX234290_MAX_REGISTER];
-	int ret=0;
-	u8 reg_rtc_ctrl2 = 0;
-
+	/* pinctrl */
 	printk(KERN_INFO "%s\n", __func__);
-	memset(value, 0, sizeof(value));
-	for (i = 0; i < ZX234290_MAX_REGISTER; i++){
-		ret = zx234290_i2c_read_simple(i, &(value[i]));
-		if(ret){
-			printk(KERN_INFO "%s err=%d, break\n", __func__, ret);
-			seq_printf(s, "%s err=%d, break", __func__, ret);
-			return ret;
-		}
+	pctrl = devm_pinctrl_get(zx234290->dev);
+	if (IS_ERR(pctrl)) {
+		dev_warn(zx234290->dev, "Failed to get zx234290 pins");
+		pctrl = NULL;
+		return 0;
 	}
-
-	for (i = 0; i < ZX234290_MAX_REGISTER; i++) {
-		if((i+1)%9 == 0)
-			seq_printf(s, "\n");
-
-		seq_printf(s, "[0x%x]%02x ", i, value[i]);
+	state0 = pinctrl_lookup_state(pctrl, "pmu_int");
+	if (IS_ERR(state0)) {
+		dev_err(zx234290->dev, "TEST: missing ext_int1\n");
 	}
-
-	return ret;
-}
-
-#define DEBUGFS_FILE_ENTRY(name) \
-static int debugfs_##name##_open(struct inode *inode, struct file *file) \
-{\
-return single_open(file, debugfs_##name##_show, inode->i_private); \
-}\
-\
-static const struct file_operations debugfs_##name##_fops = { \
-.owner= THIS_MODULE, \
-.open= debugfs_##name##_open, \
-.write=debugfs_##name##_write, \
-.read= seq_read, \
-.llseek= seq_lseek, \
-.release= single_release, \
-}
-
-
-DEBUGFS_FILE_ENTRY(regs);
-
-static int debugfs_adc_get(void *data, u64 *val)
-{
-	switch ((int)data) {
-	case 0:
-		*val = get_battery_voltage();
-		break;
-	case 1:
-		*val = get_adc1_voltage();
-		break;
-	case 2:
-		*val = get_adc2_voltage();
-		break;
-	default:
-		*val = -1;
-		break;
+	if (pinctrl_select_state(pctrl, state0) < 0) {
+		dev_err(zx234290->dev, "setting ext_int1 failed\n");
 	}
+	
+	/* eint1 irq */
+	zx234290->chip_irq= irq_of_parse_and_map(zx234290->dev->of_node, 0);
 
-    return 0;
-}
-
-DEFINE_SIMPLE_ATTRIBUTE(fops_adc_ro, debugfs_adc_get, NULL, "%llumV\n");
-
-
-
-static struct dentry *g_pmu_root;
-
-
-static void debugfs_pmu_init(struct zx234290 *zx234290)
-{
-	struct dentry *root;
-	struct dentry *node;
-	int i;
-
-	if(!zx234290)
-		return;
-
-	//create root
-	root = debugfs_create_dir("pmu_zx29", NULL);
-	if (!root)	{
-		dev_err(zx234290->dev, "debugfs_create_dir err=%d\n", IS_ERR(root));
-		goto err;
-	}
-
-	//print regs;
-	node = debugfs_create_file("regs", S_IRUGO | S_IWUGO, root, zx234290,  &debugfs_regs_fops);
-	if (!node){
-		dev_err(zx234290->dev, "debugfs_create_dir err=%d\n", IS_ERR(node));
-		goto err;
-	}
-
-	//print adc0;
-	node = debugfs_create_file("adc0", S_IRUGO, root, 0,  &fops_adc_ro);
-	if (!node){
-		dev_err(zx234290->dev, "debugfs_create_dir err=%d\n", IS_ERR(node));
-		goto err;
-	}
-
-	//print adc1;
-	node = debugfs_create_file("adc1", S_IRUGO, root, 1,  &fops_adc_ro);
-	if (!node){
-		dev_err(zx234290->dev, "debugfs_create_dir err=%d\n", IS_ERR(node));
-		goto err;
-	}
-
-	//print adc2;
-	node = debugfs_create_file("adc2", S_IRUGO, root, 2,  &fops_adc_ro);
-	if (!node){
-		dev_err(zx234290->dev, "debugfs_create_dir err=%d\n", IS_ERR(node));
-		goto err;
-	}
-
-	g_pmu_root = (void *)root;
-	return;
-err:
-	dev_err(zx234290->dev, "debugfs_pmu_init err\n");
-}
-
-#endif
-
-int zx234290_device_init(struct zx234290 *zx234290)
-{
-	int ret=0;
-	int irq;
-
-	mutex_init(&zx234290->io_mutex);
-	dev_set_drvdata(zx234290->dev, zx234290);
-
-	zx234290_get_chip_version();
-	adc_wakelock = wakeup_source_register(NULL, "adc_wake");
-	if (!adc_wakelock)
-		return -ENOMEM;
-
-#if defined(CONFIG_DEBUG_FS)
-	printk("%s\n",__func__);
-
-	debugfs_pmu_init(zx234290);
-#endif
-	return ret;
-
-}
-
-void zx234290_device_exit(struct zx234290 *zx234290)
-{
-#if defined(CONFIG_DEBUG_FS)
-	if(g_pmu_root){
-		printk(KERN_INFO "zx234290_device_exit:debugfs_remove_recursive \n");
-		debugfs_remove_recursive(g_pmu_root);
-	}
-#endif
-	mfd_remove_devices(zx234290->dev);
-	kfree(zx234290);
+	return 0;
 }
 
 static int zx234290_i2c_probe(struct i2c_client *i2c,
@@ -440,7 +268,7 @@
 	struct zx234290 *zx234290;
 
 	zx234290_i2c = i2c;
-	printk("qhf %s\n",__func__);
+
 	zx234290 = kzalloc(sizeof(struct zx234290), GFP_KERNEL);
 	if (zx234290 == NULL)
 		return -ENOMEM;
@@ -450,6 +278,7 @@
 	zx234290->control_data = i2c;
 	zx234290->read = zx234290_i2c_read;
 	zx234290->write = zx234290_i2c_write;
+	zx234290_init_pinctrl(zx234290);
 
 	return zx234290_device_init(zx234290);
 }
@@ -492,7 +321,6 @@
 static int __init zx234290_i2c_init(void)
 {
 	int ret;
-	printk("qhf zx234290_i2c_init\n");
 	ret = i2c_add_driver(&zx234290_i2c_driver);
 	if (ret != 0)
 		pr_err("Failed to register ZX234290 I2C driver: %d\n", ret);
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-irq.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-irq.c
new file mode 100755
index 0000000..1a0a80b
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-irq.c
@@ -0,0 +1,372 @@
+/*
+ * zx234290-irq.c  --  Interrupt controller support for ZX234290 PMICs
+ *
+ * Copyright 2016 ZTE Inc.
+ *
+ * Author: yuxiang<yu.xiang5@zte.com.cn>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/bug.h>
+#include <linux/device.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/gpio.h>
+#include <linux/mfd/zx234290.h>
+#include <linux/sched.h>
+#include <uapi/linux/sched/types.h>
+#include <linux/semaphore.h>
+#include <linux/kthread.h>
+#include <linux/i2c.h>
+
+#define	INT_LOW_LEVEL 	/* yuxiang */
+#define	ZX234290_INT_DEBUG
+#ifdef ZX234290_INT_DEBUG
+u32 int_irq_times = 0;
+u32 int_thread_times = 0;
+#endif
+struct semaphore zx234290_sem;
+
+#define ZX234290_WAKELOCK 1
+#ifdef ZX234290_WAKELOCK
+#include <linux/pm_wakeup.h>
+//static struct wake_lock zx234290_wake_lock;
+#endif
+
+#ifdef ZX234290_PWR_FAUL_PROCESS
+extern int zx234290_regulator_error_irq_request(struct zx234290 *zx234290);
+#endif
+
+static inline int irq_to_zx234290_irq(struct zx234290 *zx234290,
+							int irq)
+{
+	return (irq - zx234290->chip_irq-1);
+}
+
+/*
+ * This is a threaded IRQ handler so can access I2C/SPI.  Since the
+ * IRQ handler explicitly clears the IRQ it handles the IRQ line
+ * will be reasserted and the physical IRQ will be handled again if
+ * another interrupt is asserted while we run - in the normal course
+ * of events this is a rare occurrence so we save I2C/SPI reads. We're
+ * also assuming that it's rare to get lots of interrupts firing
+ * simultaneously so try to minimise I/O.
+ */
+static int zx234290_irq(void *irq_data)
+{
+	struct zx234290 *zx234290 = irq_data;
+	u32 irq_sts;
+	u32 irq_mask;
+	u8 buck_sts=0, buck_mask=0;
+	u8 ldo_sts=0, ldo_mask=0;
+	u8 reg;
+	int i;
+	int irq = zx234290->chip_irq;
+	int cur_irq=0;
+	
+	const struct sched_param param = {
+		.sched_priority = 31,
+	};
+	sched_setscheduler(current, SCHED_FIFO, &param);
+
+	while (!kthread_should_stop()) {
+		down(&zx234290_sem);
+	#ifdef ZX234290_WAKELOCK
+    	//wake_lock(&zx234290_wake_lock);   	
+		//pm_stay_awake(zx234290->dev);
+	#endif
+
+#ifdef ZX234290_INT_DEBUG
+	int_thread_times ++;
+#endif
+    //printk(KERN_INFO "zx234290 irq  handler:irq=%d.\n", irq);
+
+	zx234290->read(zx234290, ZX234290_REG_ADDR_INTA, 1, &reg);
+	irq_sts = reg;
+	zx234290->read(zx234290, ZX234290_REG_ADDR_INTB, 1, &reg);
+	irq_sts |= reg << 8;
+
+ //   printk(KERN_INFO "zx234290 irq  handler:irq=%d, INTR_A=0x%02x, INTR_B=0x%02x\n", irq, irq_sts&0xFF, irq_sts>>8);
+
+	zx234290->read(zx234290, ZX234290_REG_ADDR_INTA_MASK, 1, &reg);
+	irq_mask = reg;
+	zx234290->read(zx234290, ZX234290_REG_ADDR_INTB_MASK, 1, &reg);
+	irq_mask |= reg << 8;
+
+	irq_sts &= ~irq_mask;	/* 	*/
+
+#ifdef ZX234290_PWR_FAUL_PROCESS
+//++
+	zx234290->read(zx234290, ZX234290_REG_ADDR_BUCK_FAULT_STATUS, 1, &buck_sts);
+	zx234290->read(zx234290, ZX234290_REG_ADDR_LDO_FAULT_STATUS, 1, &ldo_sts);
+	zx234290->read(zx234290, ZX234290_REG_ADDR_BUCK_INT_MASK, 1, &buck_mask);
+	zx234290->read(zx234290, ZX234290_REG_ADDR_LDO_INT_MASK, 1, &ldo_mask);
+
+	buck_sts &= ~buck_mask;
+	ldo_sts &= ~ldo_mask;
+
+	if(buck_sts )
+		irq_sts |= (1 << ZX234290_INT_BUCK_FAUL);
+	else
+		irq_sts &= ~(1 << ZX234290_INT_BUCK_FAUL);
+
+	if(ldo_sts )
+		irq_sts |= (1 << ZX234290_INT_LDO_FAUL);
+	else
+		irq_sts &= ~(1 << ZX234290_INT_LDO_FAUL);
+
+//	if(buck_sts ||  ldo_sts)
+//		printk(KERN_INFO "zx234290 irq  handler:buck_sts=0x%02x, ldo_sts=0x%02x, irq_sts=0x%x\n", buck_sts, ldo_sts, irq_sts);
+#endif
+
+	if (!irq_sts)
+	{
+
+		#ifdef ZX234290_WAKELOCK
+			//wake_unlock(&zx234290_wake_lock);			
+			pm_relax(zx234290->dev);
+		#endif
+
+		#ifdef INT_LOW_LEVEL
+			//pcu_clr_irq_pending(irq);
+			//enable_irq(irq);//yx
+		#endif
+			//return IRQ_NONE;
+			continue;
+	}
+
+	/* Report */
+	for (i = 0; i < zx234290->irq_num; i++) {
+		if (!(irq_sts & (1 << i)))
+			continue;
+		//printk("qhfirq_base = %d,i = %d\n",zx234299a->irq_domain,i);
+		cur_irq = irq_find_mapping(zx234290->irq_domain, i);
+		if (cur_irq)
+			handle_nested_irq(cur_irq);
+	
+	}
+    /*write bit7 to be 0, clear pmu INT*/
+    //zx234290->read(zx234290, ZX234290_REG_ADDR_INTA, 1, &reg);
+    //reg &= ~(0x1<<7);
+    //zx234290->write(zx234290, ZX234290_REG_ADDR_INTA, 1, &reg);
+    #if 0
+	/* Write the STS register back to clear IRQs we handled */
+	reg = irq_sts & 0xFF;
+	irq_sts >>= 8;
+	if (reg)
+		zx234290->write(zx234290, ZX234290_REG_ADDR_INTA, 1, &reg);
+	reg = irq_sts & 0xFF;
+	irq_sts >>= 8;
+	if (reg)
+		zx234290->write(zx234290, ZX234290_REG_ADDR_INTB, 1, &reg);
+    #endif
+
+	#ifdef ZX234290_WAKELOCK
+		pm_relax(zx234290->dev);
+	#endif
+
+
+#ifdef INT_LOW_LEVEL
+		//pcu_clr_irq_pending(irq);
+		//enable_irq(irq);//yx
+#endif
+	}
+	return 0;
+}
+
+static void zx234290_irq_lock(struct irq_data *data)
+{
+	struct zx234290 *zx234290 = irq_data_get_irq_chip_data(data);
+
+	mutex_lock(&zx234290->irq_lock);
+}
+
+static void zx234290_irq_sync_unlock(struct irq_data *data)
+{
+	struct zx234290 *zx234290 = irq_data_get_irq_chip_data(data);
+	u32 reg_mask;
+	u8 reg, reg2;
+
+	zx234290->read(zx234290, ZX234290_REG_ADDR_INTA_MASK, 1, &reg);
+	reg_mask = reg;
+	zx234290->read(zx234290, ZX234290_REG_ADDR_INTB_MASK, 1, &reg);
+	reg_mask |= reg << 8;
+	/* take ldo6 & ldo8 error as buck error */
+	zx234290->read(zx234290, ZX234290_REG_ADDR_BUCK_INT_MASK, 1, &reg);
+	if (reg)
+		reg_mask |= BIT(ZX234290_INT_BUCK_FAUL);
+	zx234290->read(zx234290, ZX234290_REG_ADDR_LDO_INT_MASK, 1, &reg);
+	if (reg)
+		reg_mask |= BIT(ZX234290_INT_LDO_FAUL);
+
+	if (zx234290->irq_mask != reg_mask) {
+		reg = zx234290->irq_mask & 0xFC;
+		zx234290->write(zx234290, ZX234290_REG_ADDR_INTA_MASK, 1, &reg);
+
+		reg = zx234290->irq_mask >> 8 & 0xFF;
+		zx234290->write(zx234290, ZX234290_REG_ADDR_INTB_MASK, 1, &reg);
+
+		reg = (zx234290->irq_mask & BIT(ZX234290_INT_BUCK_FAUL)) ? 0xFF : 0;
+		zx234290->write(zx234290, ZX234290_REG_ADDR_BUCK_INT_MASK, 1, &reg);
+
+		reg = (zx234290->irq_mask & BIT(ZX234290_INT_LDO_FAUL)) ? 0xFF : 0;
+		zx234290->write(zx234290, ZX234290_REG_ADDR_LDO_INT_MASK, 1, &reg);
+	}
+
+	mutex_unlock(&zx234290->irq_lock);
+}
+
+static void zx234290_irq_enable(struct irq_data *data)
+{
+	struct zx234290 *zx234290 = irq_data_get_irq_chip_data(data);
+
+	zx234290->irq_mask &= ~(1 << irq_to_zx234290_irq(zx234290, data->irq));
+}
+
+static void zx234290_irq_disable(struct irq_data *data)
+{
+	struct zx234290 *zx234290 = irq_data_get_irq_chip_data(data);
+
+	zx234290->irq_mask |= (1 << irq_to_zx234290_irq(zx234290, data->irq));
+}
+
+static struct irq_chip zx234290_irq_chip = {
+	.name = "zx234290",
+	.irq_bus_lock = zx234290_irq_lock,
+	.irq_bus_sync_unlock = zx234290_irq_sync_unlock,
+	.irq_disable = zx234290_irq_disable,
+	.irq_enable = zx234290_irq_enable,
+};
+static irqreturn_t irq_primary_handler(int irq, void *dev_id)
+{
+	struct zx234290 * zx234290=(struct zx234290 *)dev_id;
+
+#ifdef INT_LOW_LEVEL
+   // disable_irq_nosync(irq);//yx
+#endif
+	//pcu_int_clear(PCU_EX0_INT); //xzg
+	//pcu_clr_irq_pending(irq);
+#ifdef ZX234290_WAKELOCK
+    	//wake_lock(&zx234290_wake_lock);   	
+		pm_stay_awake(zx234290->dev);
+#endif
+	
+	up(&zx234290_sem);
+#ifdef ZX234290_INT_DEBUG
+	int_irq_times ++;
+#endif
+
+	//return IRQ_WAKE_THREAD;
+	return IRQ_HANDLED;
+}
+static int zx234290_irq_domain_map(struct irq_domain *d, unsigned int virq,
+				 irq_hw_number_t hw)
+{
+	irq_set_chip_data(virq, d->host_data);
+	irq_set_chip_and_handler(virq, &zx234290_irq_chip, handle_edge_irq);
+	irq_set_nested_thread(virq, 1);
+	irq_set_noprobe(virq);
+	return 0;
+}
+
+static const struct irq_domain_ops zx234290_irq_domain_ops = {
+	.map	= zx234290_irq_domain_map,
+	.xlate	= irq_domain_xlate_onetwocell,
+};
+int qhf_base=0xff;
+struct irq_domain *qhf_irq_domain = NULL;
+u8 qhf_mask_a = 0;
+u8 qhf_mask_b  =0;
+u8 qhf_state_a = 0;
+u8 qhf_state_b  =0;
+
+int zx234290_irq_init(struct zx234290 *zx234290)
+{
+	int ret, cur_irq;
+	u8 reg;
+	int irq_base;
+	struct i2c_client *i2c = (struct i2c_client *)(zx234290->control_data);
+	struct device_node *node = i2c->dev.of_node;
+
+	#ifdef ZX234290_WAKELOCK
+    	//wake_lock_init(&zx234290_wake_lock, WAKE_LOCK_SUSPEND, "zx234290");
+		device_init_wakeup(zx234290->dev, true);
+
+	#endif
+
+	sema_init(&zx234290_sem, 0);
+	/* Clear unattended interrupts */
+	zx234290->read(zx234290, ZX234290_REG_ADDR_INTA, 1, &reg);
+	//zx234290->write(zx234290, ZX234290_REG_ADDR_INTA, 1, &reg);
+	zx234290->read(zx234290, ZX234290_REG_ADDR_INTB, 1, &reg);
+	//zx234290->write(zx234290, ZX234290_REG_ADDR_INTB, 1, &reg);
+
+	/*write bit7 to be 0, clear pmu INT*/
+	zx234290->read(zx234290, ZX234290_REG_ADDR_INTA, 1, &reg);
+	reg &= ~(0x1<<7);
+	zx234290->write(zx234290, ZX234290_REG_ADDR_INTA, 1, &reg);
+
+	/* Mask top level interrupts */
+	zx234290->irq_mask = 0xFFFF;
+
+	mutex_init(&zx234290->irq_lock);
+
+	zx234290->irq_num = ZX234290_NUM_IRQ;
+	irq_base = irq_alloc_descs(-1, 0, zx234290->irq_num, 0);
+	qhf_base = irq_base;
+	if (irq_base  < 0) {
+		dev_err(zx234290->dev, "Failed to allocate interrupts, ret:%d\n",irq_base );
+		ret = -EBUSY;
+		return ret;
+	}
+	
+	printk("(%s),chip_irq = %d,irq_base = %d\n",__func__,zx234290->chip_irq,irq_base);
+	zx234290->read(zx234290, ZX234290_REG_ADDR_INTA, 1, &qhf_mask_a);
+	zx234290->read(zx234290, ZX234290_REG_ADDR_INTB, 1, &qhf_mask_b);	
+	zx234290->read(zx234290, ZX234290_REG_ADDR_INTA_MASK, 1, &qhf_state_a);
+	zx234290->read(zx234290, ZX234290_REG_ADDR_INTB_MASK, 1, &qhf_state_b);
+	
+	zx234290->irq_domain = irq_domain_add_legacy(node, zx234290->irq_num, irq_base , 0,
+			      &zx234290_irq_domain_ops, zx234290);
+	printk("(%s),irq_domain = 0%x\n",__func__,zx234290->irq_domain);
+
+	qhf_irq_domain = zx234290->irq_domain;
+
+#ifdef INT_LOW_LEVEL
+	//irq_set_irq_type(zx234290->chip_irq,IRQF_TRIGGER_LOW);
+
+#else
+	//irq_set_irq_type(zx234290->chip_irq, IRQF_TRIGGER_FALLING);
+#endif
+	//µÈµ½pmuËùÓÐÄÚ²¿ÖжÏ×¢²áºó£¬ÔÙʹÄÜpmuÖжÏ
+	/* irq_set_status_flags(irq, IRQ_NOAUTOEN); */
+
+	ret = request_irq(zx234290->chip_irq, irq_primary_handler, IRQF_NO_THREAD,
+				   "zx234290", zx234290);
+	if (ret != 0)
+		dev_err(zx234290->dev, "Failed to request IRQ: %d\n", ret);
+	irq_set_irq_wake(zx234290->chip_irq, 1);
+	kthread_run(zx234290_irq, zx234290, "irq/%d-%s", zx234290->chip_irq, "zx234290");
+	return ret;
+}
+
+int zx234290_irq_exit(struct zx234290 *zx234290)
+{
+	free_irq(zx234290->chip_irq, zx234290);
+
+	#ifdef ZX234290_WAKELOCK
+		//wake_lock_destroy(&zx234290_wake_lock);
+		
+		device_init_wakeup(zx234290->dev,false);
+	#endif
+
+	return 0;
+}
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-regulator-wrapper.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-regulator-wrapper.c
old mode 100644
new mode 100755
index 1b74e7f..4555e0e
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-regulator-wrapper.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-regulator-wrapper.c
@@ -112,6 +112,66 @@
 	return vget;

 }

 

+int zx234290_setcore_sleepmode(T_ZDrvPmic_SlpMode mode)

+{

+	int ret = 0;

+

+    switch (mode)

+	{

+		case PM_SLPMODE_AUTO_NORMAL:

+		case PM_SLPMODE_ECO_NRMV:

+		case PM_SLPMODE_ECO_SLPV:

+        case PM_SLPMODE_OFF:

+		{

+			ret = zx234290_set_buck1_sleep_mode((T_ZDrvZx234290_BUCK1_SLPMODE)mode);

+			break;

+		}

+		default:

+		{

+			ret = -EINVAL;

+		}

+	}

+

+	return ret;

+}

+

+T_ZDrvPmic_SlpMode zx234290_getcore_sleepmode(void)

+{

+	T_ZDrvPmic_SlpMode	getMode;

+	T_ZDrvZx234290_BUCK1_SLPMODE	mode;

+

+	mode = zx234290_get_buck1_sleep_mode();

+	switch (mode)

+	{

+		case BUCK1_SLP_AUTO_WITHOUT_ECO:

+		{

+			getMode = PM_SLPMODE_AUTO_NORMAL;

+			break;			

+		}

+		case BUCK1_SLP_AUTO_ECO:	

+		{

+			getMode = PM_SLPMODE_ECO_NRMV;

+			break;			

+		}

+		case BUCK1_SLP_AUTO_ECO_SLP:

+		{

+			getMode = PM_SLPMODE_ECO_SLPV;

+			break;			

+		}

+

+		case BUCK1_SLP_SHUTDOWN:

+		{

+			getMode = PM_SLPMODE_OFF;

+			break;

+		}

+		default:

+		{

+			return PM_SLPMODE_NOT_SUPPORT;

+		}

+	}

+

+	return getMode;

+}

 

 int zx234290_setcore_sleepvoltage(int vol) 	 /* buck1 sleep vol */

 {

@@ -226,6 +286,65 @@
 	return vget;

 }

 

+int zx234290_setusb_v0v9_sleepmode(T_ZDrvPmic_SlpMode mode)

+{

+	int ret = 0;

+

+    switch (mode)

+	{

+		case PM_SLPMODE_AUTO_NORMAL:

+		case PM_SLPMODE_ECO_NRMV:

+		case PM_SLPMODE_ECO_SLPV:

+        case PM_SLPMODE_OFF:

+		{

+			ret = zx234290_set_ldo1_sleep_mode((T_ZDrvZx234290_LDOA_SLPMODE)mode);

+			break;

+		}

+		default:

+		{

+			ret = -EINVAL;

+		}

+	}

+	return ret;

+

+}

+

+T_ZDrvPmic_SlpMode zx234290_getusb_v0v9_sleepmode(void)

+{

+	T_ZDrvPmic_SlpMode	getMode;

+	T_ZDrvZx234290_LDOA_SLPMODE	 mode;

+

+	mode = zx234290_get_ldo1_sleep_mode();

+	switch (mode)

+	{

+		case LDOA_SLP_NRM_MODE:

+		{

+			getMode = PM_SLPMODE_AUTO_NORMAL;

+			break;

+		}

+		case LDOA_SLP_ECO_VOLT:

+		{

+			getMode = PM_SLPMODE_ECO_NRMV;

+			break;

+		}

+        case LDOA_SLP_ECO_VOLT_SLP:

+		{

+			getMode = PM_SLPMODE_ECO_SLPV;

+			break;

+		}

+		case LDOA_SLP_SHUTDOWN:

+		{

+			getMode = PM_SLPMODE_OFF;

+			break;

+		}

+		default:

+		{

+			return PM_SLPMODE_NOT_SUPPORT;

+		}

+	}

+	return getMode;

+}

+

 #endif

 

 #if 1	/*	USB 3.3V-- LDO1 */

@@ -310,6 +429,64 @@
 	return vget;

 }

 

+int zx234290_setusb_v3v3_sleepmode(T_ZDrvPmic_SlpMode mode)

+{

+	int ret = 0;

+

+    switch (mode)

+	{

+		case PM_SLPMODE_AUTO_NORMAL:

+		case PM_SLPMODE_ECO_NRMV:

+		case PM_SLPMODE_ECO_SLPV:

+        case PM_SLPMODE_OFF:

+		{

+			ret = zx234290_set_ldo5_sleep_mode((T_ZDrvZx234290_LDOB_SLPMODE)mode);

+			break;

+		}

+		default:

+		{

+			ret = -EINVAL;

+		}

+	}

+	return ret;

+

+}

+

+T_ZDrvPmic_SlpMode zx234290_getusb_v3v3_sleepmode(void)

+{

+	T_ZDrvPmic_SlpMode	getMode;

+	T_ZDrvZx234290_LDOB_SLPMODE	 mode;

+

+	mode = zx234290_get_ldo5_sleep_mode();

+	switch (mode)

+	{

+		case LDOA_SLP_NRM_MODE:

+		{

+			getMode = PM_SLPMODE_AUTO_NORMAL;

+			break;

+		}

+		case LDOA_SLP_ECO_VOLT:

+		{

+			getMode = PM_SLPMODE_ECO_NRMV;

+			break;

+		}

+        case LDOA_SLP_ECO_VOLT_SLP:

+		{

+			getMode = PM_SLPMODE_ECO_SLPV;

+			break;

+		}

+		case LDOA_SLP_SHUTDOWN:

+		{

+			getMode = PM_SLPMODE_OFF;

+			break;

+		}

+		default:

+		{

+			return PM_SLPMODE_NOT_SUPPORT;

+		}

+	}

+	return getMode;

+}

 #endif

 

 #if 1	/* SIM1 1.8V/3.0V -- LDO6 */

@@ -398,6 +575,59 @@
 	return vget;

 }

 

+int zx234290_setsim1_sleepmode(T_ZDrvPmic_SlpMode mode)

+{

+	int ret = 0;

+

+    switch (mode)

+	{

+		case PM_SLPMODE_AUTO_NORMAL:

+		case PM_SLPMODE_ECO_NRMV:

+        case PM_SLPMODE_OFF:

+		{

+			ret = zx234290_set_ldo6_sleep_mode((T_ZDrvZx234290_LDOB_SLPMODE)mode);

+			break;

+		}

+		default:

+		{

+			ret = -EINVAL;

+		}

+	}

+

+	return ret;

+}

+

+T_ZDrvPmic_SlpMode zx234290_getsim1_sleepmode(void)

+{

+	T_ZDrvPmic_SlpMode	getMode;

+	T_ZDrvZx234290_LDOB_SLPMODE	 mode;

+

+	mode = zx234290_get_ldo6_sleep_mode();

+	switch (mode)

+	{

+		case LDOB_SLP_NRM_MODE:

+		{

+			getMode = PM_SLPMODE_AUTO_NORMAL;

+			break;			

+		}

+		case LDOB_SLP_ECO_VOLT:

+		{

+			getMode = PM_SLPMODE_ECO_NRMV;

+			break;			

+		}

+		case LDOB_SLP_SHUTDOWN:

+		{

+			getMode = PM_SLPMODE_OFF;

+			break;			

+		}

+		default:

+		{

+			return PM_SLPMODE_NOT_SUPPORT;

+		}

+	}

+

+	return getMode;

+}

 #endif

 

 #if 1	/* SIM2 1.8V/3.0V -- LDO6 */

@@ -487,7 +717,64 @@
 	return vget;

 }

 

+int zx234290_setsim2_sleepmode(T_ZDrvPmic_SlpMode mode)

+{

+	int ret = 0;

 

+    switch (mode)

+	{

+		case PM_SLPMODE_AUTO_NORMAL:

+		case PM_SLPMODE_ECO_NRMV:

+        case PM_SLPMODE_OFF:

+		{

+			ret = zx234290_set_ldo10_sleep_mode((T_ZDrvZx234290_LDOA_SLPMODE)mode);

+			break;

+		}

+		default:

+		{

+			ret = -EINVAL;

+		}

+	}

+

+	return ret;

+}

+

+T_ZDrvPmic_SlpMode zx234290_getsim2_sleepmode(void)

+{

+	T_ZDrvPmic_SlpMode	getMode;

+	T_ZDrvZx234290_LDOA_SLPMODE	 mode;

+

+	mode = zx234290_get_ldo10_sleep_mode();

+	switch (mode)

+	{

+		case LDOA_SLP_NRM_MODE:

+		{

+			getMode = PM_SLPMODE_AUTO_NORMAL;

+			break;			

+		}

+		case LDOA_SLP_ECO_VOLT:

+		{

+			getMode = PM_SLPMODE_ECO_NRMV;

+			break;			

+		}

+		case LDOA_SLP_ECO_VOLT_SLP:

+		{

+			getMode = PM_SLPMODE_ECO_SLPV;

+			break;			

+		}	

+		case LDOA_SLP_SHUTDOWN:

+		{

+			getMode = PM_SLPMODE_OFF;

+			break;			

+		}

+		default:

+		{

+			return PM_SLPMODE_NOT_SUPPORT;

+		}

+	}

+

+	return getMode;

+}

 #endif

 

 

@@ -577,6 +864,66 @@
 	return vget;

 }

 

+int zx234290_setsd1_sleepmode(T_ZDrvPmic_SlpMode mode)

+{

+	int ret = 0;

+

+    switch (mode)

+	{

+		case PM_SLPMODE_AUTO_NORMAL:

+		case PM_SLPMODE_ECO_NRMV:

+        case PM_SLPMODE_ECO_SLPV:

+        case PM_SLPMODE_OFF:

+		{

+			ret = zx234290_set_ldo8_sleep_mode((T_ZDrvZx234290_LDOA_SLPMODE)mode);

+			break;

+		}

+		default:

+		{

+			ret = -EINVAL;

+		}

+	}

+

+	return ret;

+}

+

+T_ZDrvPmic_SlpMode zx234290_getsd1_sleepmode(void)

+{

+	T_ZDrvPmic_SlpMode	getMode;

+	T_ZDrvZx234290_LDOA_SLPMODE	 mode;

+

+    mode = zx234290_get_ldo8_sleep_mode();

+

+	switch (mode)

+	{

+		case LDOA_SLP_NRM_MODE:

+		{		

+			getMode = PM_SLPMODE_AUTO_NORMAL;

+			break;

+		}

+		case LDOA_SLP_ECO_VOLT:	

+		{		

+			getMode = PM_SLPMODE_ECO_NRMV;

+			break;

+		}

+        case LDOA_SLP_ECO_VOLT_SLP:	

+		{		

+			getMode = PM_SLPMODE_ECO_SLPV;

+			break;

+		}

+		case LDOA_SLP_SHUTDOWN:

+		{

+			getMode = PM_SLPMODE_OFF;

+			break;

+		}

+		default:

+		{

+			return PM_SLPMODE_NOT_SUPPORT;

+		}

+	}

+

+	return getMode;

+}

 

 #endif

 

diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-regulator.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-regulator.c
old mode 100644
new mode 100755
index 960b532..a6252fa
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-regulator.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mfd/zx234290-regulator.c
@@ -1875,6 +1875,384 @@
 }
 #endif
 
+#if 1   /* Sink Control */
+int zx234297_set_sink(T_ZDrvZx234297_SINK sink_num, int is_on, T_ZDrvZx234297_SINK_CURRENT sink_current)
+{
+    int ret = 0;
+	unsigned char lsh_on, lsh_current;
+    unsigned char reg_addr=0, reg_val=0, mask=0;
 
+	if (sink_num == ZX234297_SINK1) {
+		lsh_on = ZX234297_SINK1_ON_LSH;
+		lsh_current = ZX234297_SINK1_CURRENT_LSH;
+	} else if (sink_num == ZX234297_SINK2) {
+		lsh_on = ZX234297_SINK2_ON_LSH;
+		lsh_current = ZX234297_SINK2_CURRENT_LSH;
+	} else
+		return -EINVAL;
+
+	if (is_on) {
+		if (sink_current >= SINK_CURRENT_MAX)
+			sink_current = SINK_CURRENT_120MA;
+
+		reg_addr = ZX234297_REG_ADDR_SINK_CONTROL;
+	    reg_val = ZX234290_BITFVAL(sink_current, lsh_current);
+	    mask = ZX234290_BITFMASK(ZX234297_SINK_CURRENT_WID, lsh_current);
+	    ret = zx234290_regulator_write_register( reg_addr, reg_val, mask);
+	    if (ret != 0)
+	    {
+	        return -EIO;
+	    }
+	}
+
+	is_on = !!is_on;
+    reg_addr = ZX234290_REG_ADDR_LDO_EN2;
+    reg_val = ZX234290_BITFVAL(is_on, lsh_on);
+    mask = ZX234290_BITFMASK(ZX234297_SINK_ON_WID, lsh_on);
+    ret = zx234290_regulator_write_register( reg_addr, reg_val, mask);
+    if (ret != 0)
+    {
+        return -EIO;
+    }
+
+    return 0;
+}
+
+int zx234297_set_sink_slpmode(T_ZDrvZx234297_SINK sink_num, T_ZDrvZx234297_SINK_SLPMODE mode)
+{
+    int ret = 0;
+	unsigned char lsh;
+    unsigned char reg_addr=0, reg_val=0, mask=0;
+
+	if (mode >= SLPMODE_MAX) {
+		return -EINVAL;
+	}
+	if (sink_num == ZX234297_SINK1) {
+		lsh = ZX234297_SINK1_SLP_MODE_LSH;
+	} else if (sink_num == ZX234297_SINK2) {
+		lsh = ZX234297_SINK2_SLP_MODE_LSH;
+	} else
+		return -EINVAL;
+
+    reg_addr = ZX234290_REG_ADDR_LDO910_MODE;
+    reg_val = ZX234290_BITFVAL(mode, lsh);
+    mask = ZX234290_BITFMASK(ZX234297_SINK_ON_WID, lsh);
+    ret = zx234290_regulator_write_register( reg_addr, reg_val, mask);
+    if (ret != 0)
+    {
+        return -EIO;
+    }
+
+    return 0;
+}
+#endif
+
+#if 1
+
+int zDrvZx234290_LdoRstErr(void)
+{
+    int ret = 0;
+    unsigned char reg_val=0,mask=0;
+
+    reg_val = ZX234290_BITFVAL(1, ZX234290_LDO_RSTERR_LSH);
+    mask = ZX234290_BITFMASK(ZX234290_LDO_RSTERR_WID, ZX234290_LDO_RSTERR_LSH);
+    ret = zx234290_regulator_write_register(ZX234290_REG_ADDR_BUCK_FAULT_STATUS, reg_val, mask);
+    if (ret != 0)
+    {
+        return -EIO;
+    }
+
+    return 0;
+}
+
+/*******************************************************************************
+* Function: Zx234290_SetUserReg_PSM
+* Description:
+* Parameters:
+*    Input:
+*
+*    Output:
+*
+* Returns:
+*
+*
+* Others:
+********************************************************************************/
+int Zx234290_SetUserReg_PSM(unsigned char data)
+{
+    int ret = 0;
+    unsigned char reg_addr=0, reg_val=0, mask=0;
+
+    reg_addr = ZX234290_REG_ADDR_USER_RESERVED;
+    mask     = 0xff;
+    reg_val  = data;
+    ret = zx234290_regulator_write_register_PSM(reg_addr, reg_val, mask);
+    if (ret != 0)
+    {
+        return -EIO;
+    }
+
+    return 0;
+}
+int zx234290_setSoftOn(bool SoftOn)
+{
+    int ret = 0;
+    unsigned char reg_addr=0;
+    unsigned char reg_val = 0;
+    unsigned char mask = 0;
+
+    reg_addr = ZX234290_REG_ADDR_SYS_CTRL;
+
+    mask     = 0x01 << 7;
+    if(SoftOn)
+    {
+        reg_val  = 0x01 << 7;
+    }
+
+    ret = zx234290_regulator_write_register_PSM(reg_addr, reg_val, mask);
+
+    return ret;
+}
+
+int zx234290_setSoftOn_PSM(bool SoftOn)
+{
+    int ret = 0;
+    unsigned char reg_addr=0;
+    unsigned char reg_val = 0;
+    unsigned char mask = 0;
+
+    reg_addr = ZX234290_REG_ADDR_SYS_CTRL;
+
+    mask     = 0x01 << 7;
+    if(SoftOn)
+    {
+        reg_val  = 0x01 << 7;
+    }
+
+    ret = zx234290_regulator_write_register_PSM(reg_addr, reg_val, mask);
+
+    return ret;
+}
+int zx234290_getPoweronStatus(void)
+{
+    int ret = 0;
+    unsigned char status = 0;
+    unsigned char reg_addr=0;
+
+    reg_addr = ZX234290_REG_ADDR_STSA;
+
+     ret = zx234290_regulator_read_register(reg_addr, &status);
+     if (ret != 0)
+     {
+         return -1;
+     }
+
+    return (status & (1<<5));
+}
+int zx234290_getPoweronStatus_PSM(void)
+{
+    int ret = 0;
+    unsigned char status = 0;
+    unsigned char reg_addr=0;
+
+    reg_addr = ZX234290_REG_ADDR_STSA;
+
+    ret = zx234290_regulator_read_register_PSM(reg_addr, &status);
+
+     if (ret != 0)
+     {
+         return -1;
+     }
+
+    return (status & (1<<5));
+}
+
+#endif
+
+#ifdef ZX234290_PWR_FAUL_PROCESS
+
+static BLOCKING_NOTIFIER_HEAD(zx234290_ldo_fail_notifier_list);
+
+int zx234290_register_client(struct notifier_block *nb)
+{
+	return blocking_notifier_chain_register(&zx234290_ldo_fail_notifier_list, nb);
+}
+EXPORT_SYMBOL(zx234290_register_client);
+
+int zx234290_unregister_client(struct notifier_block *nb)
+{
+	return blocking_notifier_chain_unregister(&zx234290_ldo_fail_notifier_list, nb);
+}
+EXPORT_SYMBOL(zx234290_unregister_client);
+
+int zx234290_notifier_call_chain(unsigned long val, void *v)
+{
+//	printk(KERN_INFO "zx234290_notifier_call_chain,val=%ld\n", val);
+	return blocking_notifier_call_chain(&zx234290_ldo_fail_notifier_list, val, v);
+}
+EXPORT_SYMBOL_GPL(zx234290_notifier_call_chain);
+
+
+static irqreturn_t zx234290_buck_faul_irq(int irq, void *id)
+{
+	u8 buck_sts=0, buck_mask=0;
+	//u8 val=0;
+	zx234290_regulator_read_register(ZX234290_REG_ADDR_BUCK_FAULT_STATUS,  &buck_sts);
+	zx234290_regulator_read_register(ZX234290_REG_ADDR_BUCK_INT_MASK,  &buck_mask);
+	zDrvZx234290_LdoRstErr();
+
+	buck_sts &= ~buck_mask;
+	if(buck_sts & 0x4 ){
+		printk(KERN_ERR "zx234290_buck_faul_irq!!  ldo8 error~,  buckFail_irq=0x%x\n", buck_sts);
+		//val =0x01; //clear faul flag;
+
+		zx234290_set_ldo8_onoff(LDO_ENABLE_OFF);
+		zx234290_set_ldo8_onoff(LDO_ENABLE_ON);
+
+		//zx234290_regulator_write_register(ZX234290_REG_ADDR_BUCK_FAULT_STATUS, 0x1, 0x1);
+
+		zx234290_notifier_call_chain(ZX234290_INT_BUCK_FAUL,NULL);
+		WARN_ON(1);
+	}
+	else if(buck_sts & 0x8 )//ldo6
+	{
+		printk(KERN_ERR "zx234290_buck_faul_irq!!  ldo6 error~,  buckFail_irq=0x%x, clear irq\n", buck_sts);
+		//zx234290_regulator_write_register(ZX234290_REG_ADDR_BUCK_FAULT_STATUS, 0x1, 0x1);
+		WARN_ON(1);
+	}
+	else if(buck_sts & 0x80 )//BUCK4
+	{
+		printk(KERN_ERR "zx234290_buck_faul_irq!!  BUCK4 error~,  buckFail_irq=0x%x, clear irq\n", buck_sts);
+		//zx234290_regulator_write_register(ZX234290_REG_ADDR_BUCK_FAULT_STATUS, 0x1, 0x1);
+		WARN_ON(1);
+	}
+	else
+	{
+		printk(KERN_ERR "zx234290_buck_faul_irq!! buckFail_irq=0x%x,BUG()!!\n", buck_sts);
+		BUG();
+	}
+	return 0;
+}
+
+static irqreturn_t zx234290_ldo_faul_irq(int irq, void *id)
+{
+	u8 ldo_sts=0, ldo_mask=0;
+	zx234290_regulator_read_register( ZX234290_REG_ADDR_LDO_FAULT_STATUS, &ldo_sts);
+	zx234290_regulator_read_register( ZX234290_REG_ADDR_LDO_INT_MASK, &ldo_mask);
+	zDrvZx234290_LdoRstErr();
+
+	ldo_sts &= ~ldo_mask;
+	if(ldo_sts){
+		printk(KERN_ERR "zx234290_ldo_faul_irq!! LDOFail_irq=0x%x,BUG()!!\n", ldo_sts);
+		BUG();
+	}
+	return 0;
+}
+
+int zx234290_regulator_error_irq_request(struct zx234290 *zx234290)
+{
+	int ret = -1;
+	//zx234290_rtc.zx234290->irq_base = PMIC_INT_START;
+	//printk(KERN_INFO"zx234290_PMU_regulator_init, BUCKFail_irq=%d,LDOFail_irq=%d\n", zx234290->irq_base + ZX234290_INT_BUCK_FAUL,zx234290->irq_base + ZX234290_INT_LDO_FAUL);
+	ret = request_threaded_irq(zx234290->irq_base + ZX234290_INT_BUCK_FAUL, NULL, zx234290_buck_faul_irq,	0, "zx234290-regulator buck faul", zx234290);
+	if (ret)	{
+		printk(KERN_ERR "buck faul IRQ%d error %d\n", zx234290->irq_base + ZX234290_INT_BUCK_FAUL, ret);
+		goto err_buck_irq;
+	}
+	ret = request_threaded_irq(zx234290->irq_base + ZX234290_INT_LDO_FAUL, NULL, zx234290_ldo_faul_irq,	0, "zx234290-regulator ldo faul", zx234290);
+	if (ret)	{
+		printk(KERN_ERR"ldo faul IRQ%d error %d\n", zx234290->irq_base + ZX234290_INT_LDO_FAUL, ret);
+		goto err_ldo_irq;
+	}
+
+	return 0;
+
+	err_ldo_irq:
+		free_irq(zx234290->irq_base + ZX234290_INT_LDO_FAUL, zx234290);
+	err_buck_irq:
+		free_irq(zx234290->irq_base + ZX234290_INT_BUCK_FAUL, zx234290);
+		return ret;
+}
+#endif
+
+
+static int zx234290_regulator_probe(struct platform_device *pdev)
+{
+	int ret = -1;
+	unsigned int irq_bulkerr = 0,irq_ldoerr=0;
+	struct zx234290 *zx234290 = dev_get_drvdata(pdev->dev.parent);
+
+	
+	//irq_bulkerr = platform_get_irq_byname(pdev,"bulk-error");
+	irq_bulkerr = irq_create_mapping(zx234290->irq_domain, ZX234290_INT_BUCK_FAUL);
+	if (!irq_bulkerr) {
+		dev_err(&pdev->dev, "Failed to create mapping bulk err IRQ\n");
+		return  -ENXIO;
+	}
+	
+	ret = devm_request_threaded_irq(&pdev->dev,irq_bulkerr, NULL, zx234290_buck_faul_irq,	0, "zx234290-regulator buck faul", zx234290);
+	if (ret)	{
+		printk("buck faul IRQerror %d\n",ret);
+		goto err_buck_irq;
+	}	
+	//irq_ldoerr = platform_get_irq_byname(pdev,"ldo-error");	
+	
+	irq_ldoerr = irq_create_mapping(zx234290->irq_domain, ZX234290_INT_LDO_FAUL);
+	
+	if (!irq_ldoerr) {
+		dev_err(&pdev->dev, "Failed to create mapping ldo err IRQ\n");
+		return  -ENXIO;
+	}
+	ret = devm_request_threaded_irq(&pdev->dev,irq_ldoerr, NULL, zx234290_ldo_faul_irq,	0, "zx234290-regulator ldo faul", zx234290);
+	if (ret)	{
+		printk("ldo faul IRQerror %d\n",ret);
+		goto err_ldo_irq;
+	}
+	return 0;
+
+	err_ldo_irq:
+		free_irq(irq_bulkerr, zx234290);
+	err_buck_irq:
+		free_irq(irq_ldoerr, zx234290);
+
+	return ret;
+}
+
+
+static int  zx234290_regulator_remove(struct platform_device *pdev)
+{
+	struct rtc_device *rtc = platform_get_drvdata(pdev);
+
+	platform_set_drvdata(pdev, NULL);
+	return 0;
+}
+static int  zx234290_regulator_resume(struct platform_device *pdev)
+{
+	return 0;
+}
+static int zx234290_regulator_suspend(struct platform_device *pdev, pm_message_t state)
+{
+	return 0;
+}
+
+static struct platform_driver zx234290_regulator_driver =
+{
+	.probe		= zx234290_regulator_probe,
+	.remove		= zx234290_regulator_remove,
+	.suspend	= zx234290_regulator_suspend,
+	.resume		= zx234290_regulator_resume,
+	.driver		= {
+		.name	= "zx234290-regulators",
+		.owner	= THIS_MODULE,
+	},
+};
+
+
+module_platform_driver(zx234290_regulator_driver);
+
+MODULE_DESCRIPTION("ZX234290 regulator Driver");
+MODULE_AUTHOR("zxic");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:zx234290-regulator");
 
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mmc/core/mmc.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mmc/core/mmc.c
old mode 100644
new mode 100755
index 87807ef..13f8702
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mmc/core/mmc.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mmc/core/mmc.c
@@ -25,6 +25,8 @@
 #include "quirks.h"
 #include "sd_ops.h"
 #include "pwrseq.h"
+#include "pub_debug_info.h"
+
 
 #define DEFAULT_CMD6_TIMEOUT_MS	500
 #define MIN_CACHE_EN_TIMEOUT_MS 1600
@@ -2298,7 +2300,8 @@
 	host->card = NULL;
 err:
 	mmc_detach_bus(host);
-
+	sc_debug_info_record(MODULE_ID_CAP_MMC, "%s: error %d whilst initialising MMC card\n",
+		mmc_hostname(host),err);
 	pr_err("%s: error %d whilst initialising MMC card\n",
 		mmc_hostname(host), err);
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mmc/host/dw_mmc.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mmc/host/dw_mmc.c
old mode 100644
new mode 100755
index 523b767..8b165e4
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mmc/host/dw_mmc.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mmc/host/dw_mmc.c
@@ -38,6 +38,8 @@
 #include <linux/mmc/mmc_func.h>
 #include "dw_mmc.h"
 #include <linux/string.h>
+#include "pub_debug_info.h"
+
 
 extern void mmc_get_host(struct mmc_host * mmc);
 extern void mmc_put_host(struct mmc_host * mmc);
@@ -298,6 +300,9 @@
 		dev_err(host->dev,
 			"Timeout resetting block (ctrl reset %#x)\n",
 			ctrl & reset);
+		
+		sc_debug_info_record(MODULE_ID_CAP_MMC,
+			"mmc%d Timeout resetting block (ctrl reset %#x)\n", host->host_id,ctrl & reset);
 		return false;
 	}
 
@@ -321,8 +326,10 @@
 		if (readl_poll_timeout_atomic(host->regs + SDMMC_STATUS,
 					      status,
 					      !(status & SDMMC_STATUS_BUSY),
-					      10, 500 * USEC_PER_MSEC))
-			dev_err(host->dev, "Busy; trying anyway\n");
+					      10, 500 * USEC_PER_MSEC)){
+			dev_err(host->dev, "Busy; trying anyway\n");		
+			sc_debug_info_record(MODULE_ID_CAP_MMC, "mmc%d Busy; trying anyway\n",host->host_id);
+		}
 	}
 }
 
@@ -341,7 +348,7 @@
 				      1, 500 * USEC_PER_MSEC))
 		dev_err(&slot->mmc->class_dev,
 			"Timeout sending command (cmd %#x arg %#x status %#x)\n",
-			cmd, arg, cmd_status);
+			cmd, arg, cmd_status);			
 }
 
 static u32 dw_mci_prepare_command(struct mmc_host *mmc, struct mmc_command *cmd)
@@ -1996,6 +2003,7 @@
 		}
 
 		dev_dbg(host->dev, "data error, status 0x%08x\n", status);
+		sc_debug_info_record(MODULE_ID_CAP_MMC, "mmc%d data error, status 0x%08x\n", host->host_id,status);
 
 		/*
 		 * After an error, there may be data lingering
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mtd/ubi/ubi.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mtd/ubi/ubi.h
old mode 100644
new mode 100755
index 2a411a1..bc03549
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mtd/ubi/ubi.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/mtd/ubi/ubi.h
@@ -153,6 +153,13 @@
 	POWER_CUT_VID_WRITE = 0x02,
 };
 
+struct ubi_fs_status
+{
+	int fs_status; /* 文件系统异常标识 */
+	char fs_mtd_name[16];
+	char fs_ubi_vol_name[16];
+};
+
 /**
  * struct ubi_vid_io_buf - VID buffer used to read/write VID info to/from the
  *			   flash.
@@ -1169,12 +1176,15 @@
  */
 static inline void ubi_ro_mode(struct ubi_device *ubi)
 {
+	struct ubi_fs_status stat;
 	if (!ubi->ro_mode) {
 		ubi->ro_mode = 1;
 		ubi_warn(ubi, "switch to read-only mode");
 		dump_stack();
-		if (!strcmp(ubi->ubi_name, "vol_userdata"))
-			ubi_exc_sendmsg("switch to read-only mode\n", strlen("switch to read-only mode\n"));
+		strncpy(stat.fs_mtd_name, ubi->mtd->name, sizeof(stat.fs_mtd_name));
+		strncpy(stat.fs_ubi_vol_name, "", sizeof(stat.fs_ubi_vol_name));
+		stat.fs_status = 1;
+		ubi_exc_sendmsg((char *)&stat, sizeof(struct ubi_fs_status));
 	}
 }
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/net/ethernet/zte/zx29_gmac.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/net/ethernet/zte/zx29_gmac.c
old mode 100644
new mode 100755
index 4d8dcc5..8963fd6
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/net/ethernet/zte/zx29_gmac.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/net/ethernet/zte/zx29_gmac.c
@@ -24,7 +24,7 @@
 #include <linux/pinctrl/consumer.h>

 #include <linux/gpio.h>

 #include <linux/of_gpio.h>

-#include <linux/device.h>

+#include <linux/device.h>
 #include "zx29_gmac.h"

 

 #define gmac_printk(_format, _args...)		do{printk(KERN_INFO"gmac," _format "\n",##_args);}while(0)

@@ -887,14 +887,14 @@
 	gmac = (unsigned *)ndev->base_addr;

 	

 	enum of_gpio_flags flags;

-    unsigned long flag;

+    unsigned long flag;
 	int gpio = 0;

 	int ret = 0;

 		

-	if (ndev) {

+	if (ndev && !priv->stopped) {

 		if (netif_running(ndev)) {

 			

-			spin_lock_irqsave(&priv->lock, flag);

+			spin_lock_irqsave(&priv->lock, flag);
             netif_stop_queue(ndev);

 			netif_carrier_off(ndev);

 			priv->stopped = 1;

@@ -906,12 +906,12 @@
 			gpio_direction_output(priv->gpio_power[0], 0);

 			

 			gmac_stop((void*)ndev->base_addr); 

-            spin_unlock_irqrestore(&priv->lock, flag);

+            spin_unlock_irqrestore(&priv->lock, flag);
 		

 //			netif_device_detach(ndev);

 		}

-        pm_relax(&pdev->dev);

-       // printk("[%s] sleep\n");

+        pm_relax(&pdev->dev);
+       // printk("[%s] sleep\n");
     }

 	//printk("[%s] exit\n", __func__);

 	return 0;

@@ -931,13 +931,13 @@
 	int status = 0;

 	int islink = 0;

 	unsigned int num= 0;	

-    unsigned long flag = 0;

+    unsigned long flag = 0;
 

-	if(ndev) {

+	if(ndev && priv->stopped) {

 	    pm_stay_awake(&pdev->dev);

 		if( netif_running(ndev)) {			

             printk("[%s] enter\n", __func__);

-			spin_lock_irqsave(&priv->lock, flag);

+			spin_lock_irqsave(&priv->lock, flag);
 			gpio_direction_output(priv->gpio_power[0], 1);

 

 			base = base_clk;

@@ -955,7 +955,7 @@
 			hrtimer_start(priv->timer, ktime_set(0, GTIMER_INTERVAL * 1000), HRTIMER_MODE_REL);

 

 			priv->stopped = 0;

-            spin_unlock_irqrestore(&priv->lock, flag);

+            spin_unlock_irqrestore(&priv->lock, flag);
             printk("[%s] enter\n", __func__);

 //			netif_device_attach(ndev);	  	

 		}

@@ -1024,7 +1024,7 @@
     	if(netif_running(ndev)) {

 //        	gmac_start((void*)ndev->base_addr);

 //        	netif_device_attach(ndev);

-            zx29_gmac_phy_enable(dev);

+//            zx29_gmac_phy_enable(dev);

     	}

     }

     return 0;

@@ -1048,60 +1048,60 @@
 	.ndo_set_mac_address = zx29_gmac_set_mac_address,

 };

 

-

-

-ssize_t show_fun(struct device *dev, struct device_attribute *attr, char *buf)

-{

+
+
+ssize_t show_fun(struct device *dev, struct device_attribute *attr, char *buf)
+{
 	struct platform_device *pdev	= to_platform_device(dev);

     struct net_device 	*ndev		= platform_get_drvdata(pdev);

-    int status = 0;

-    volatile unsigned *gmac = (unsigned *)ndev->base_addr;

-    struct zx29_gmac_dev *priv = (struct zx29_gmac_dev *)netdev_priv(ndev);

-    printk("MAC(1000) :0x%x\n", MAC(0x1000));

-    printk("MAC(1004) :0x%x\n", MAC(0x1004));

-    printk("MAC(1008) :0x%x\n", MAC(0x1008));

-    printk("MAC(100c) :0x%x\n", MAC(0x100c));

-    printk("MAC(1010) :0x%x\n", MAC(0x1010));

-    printk("MAC(1014) int status:0x%x\n", MAC(0x1014));

-    printk("MAC(1018) :0x%x\n", MAC(0x1018));

-    printk("MAC(101c) :0x%x\n", MAC(0x101c));

-    printk("MAC(0000) :0x%x\n", MAC(0x0000));

-    printk("MAC(0004) :0x%x\n", MAC(0x0004));

-    printk("MAC(0010) :0x%x\n", MAC(0x0010));

-

-    status = mdiobus_read(priv->phydev->mdio.bus, 21, 1);

-    printk("phy status:0x%x\n", status);

-    status = mdiobus_read(priv->phydev->mdio.bus, 0, 1);

-    printk("phy status port0:0x%x\n", status);

-    status = mdiobus_read(priv->phydev->mdio.bus, 1, 1);

-    printk("phy status port1:0x%x\n", status);

-    status = mdiobus_read(priv->phydev->mdio.bus, 2, 1);

-    printk("phy status port2:0x%x\n", status);

-    status = mdiobus_read(priv->phydev->mdio.bus, 3, 1);

-    printk("phy status port3:0x%x\n", status);

-    status = mdiobus_read(priv->phydev->mdio.bus, 4, 1);

-    printk("phy status port4:0x%x\n", status);

-

-    status = mdiobus_read(priv->phydev->mdio.bus, 21, 20);

-    status |= 0x4;

-    mdiobus_write(priv->phydev->mdio.bus, 21, 20, status);

-

-    status = mdiobus_read(priv->phydev->mdio.bus, 21, 21);

-    printk("phy status loop port:0x%x\n", status);

-

-

-    return 0;

-}

-

-ssize_t store_fun(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)

-{

+    int status = 0;
+    volatile unsigned *gmac = (unsigned *)ndev->base_addr;
+    struct zx29_gmac_dev *priv = (struct zx29_gmac_dev *)netdev_priv(ndev);
+    printk("MAC(1000) :0x%x\n", MAC(0x1000));
+    printk("MAC(1004) :0x%x\n", MAC(0x1004));
+    printk("MAC(1008) :0x%x\n", MAC(0x1008));
+    printk("MAC(100c) :0x%x\n", MAC(0x100c));
+    printk("MAC(1010) :0x%x\n", MAC(0x1010));
+    printk("MAC(1014) int status:0x%x\n", MAC(0x1014));
+    printk("MAC(1018) :0x%x\n", MAC(0x1018));
+    printk("MAC(101c) :0x%x\n", MAC(0x101c));
+    printk("MAC(0000) :0x%x\n", MAC(0x0000));
+    printk("MAC(0004) :0x%x\n", MAC(0x0004));
+    printk("MAC(0010) :0x%x\n", MAC(0x0010));
+
+    status = mdiobus_read(priv->phydev->mdio.bus, 21, 1);
+    printk("phy status:0x%x\n", status);
+    status = mdiobus_read(priv->phydev->mdio.bus, 0, 1);
+    printk("phy status port0:0x%x\n", status);
+    status = mdiobus_read(priv->phydev->mdio.bus, 1, 1);
+    printk("phy status port1:0x%x\n", status);
+    status = mdiobus_read(priv->phydev->mdio.bus, 2, 1);
+    printk("phy status port2:0x%x\n", status);
+    status = mdiobus_read(priv->phydev->mdio.bus, 3, 1);
+    printk("phy status port3:0x%x\n", status);
+    status = mdiobus_read(priv->phydev->mdio.bus, 4, 1);
+    printk("phy status port4:0x%x\n", status);
+
+    status = mdiobus_read(priv->phydev->mdio.bus, 21, 20);
+    status |= 0x4;
+    mdiobus_write(priv->phydev->mdio.bus, 21, 20, status);
+
+    status = mdiobus_read(priv->phydev->mdio.bus, 21, 21);
+    printk("phy status loop port:0x%x\n", status);
+
+
+    return 0;
+}
+
+ssize_t store_fun(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
 	struct platform_device *pdev	= to_platform_device(dev);

     struct net_device 	*ndev		= platform_get_drvdata(pdev);

-    printk("[%s]", __func__);    

-    return 1;

-}

-

-

+    printk("[%s]", __func__);    
+    return 1;
+}
+
+
 ssize_t mdio_show(struct device *dev, struct device_attribute *attr, char *buf)

 {

 	struct platform_device *pdev	= to_platform_device(dev);

@@ -1277,11 +1277,11 @@
     return count;

 }

 

-static DEVICE_ATTR(gmac_test, 0664, show_fun, store_fun);

+static DEVICE_ATTR(gmac_test, 0664, show_fun, store_fun);
 static DEVICE_ATTR(mdio_test, 0664, mdio_show, mdio_store);

 static DEVICE_ATTR(free_mdio, 0664, free_mdio_show, free_mdio_store);

 static DEVICE_ATTR(debug_on, 0664, NULL, debug_on_store);

-

+
 static int zx29_gmac_probe(struct platform_device *pdev)

 {

     struct zx29_gmac_dev *prv = NULL;

@@ -1303,14 +1303,14 @@
 	if (!ndev)

 		return -ENOMEM;

 

-    device_create_file(&pdev->dev, &dev_attr_gmac_test);

+    device_create_file(&pdev->dev, &dev_attr_gmac_test);
 	device_create_file(&pdev->dev, &dev_attr_mdio_test);

 	device_create_file(&pdev->dev, &dev_attr_free_mdio);

 	device_create_file(&pdev->dev, &dev_attr_debug_on);

 

 	prv = netdev_priv(ndev);

 	memset(prv, 0, sizeof(*prv));

-	

+	
     pctrl = devm_pinctrl_get(&pdev->dev);

 	if (IS_ERR(pctrl)) {

 		dev_warn(&pdev->dev, "Failed to get test pins");
@@ -1443,8 +1443,8 @@
 		printk("set gmac wakelock!\n");

 	} else {	

 		strcpy(board_name, "mdl");

-	    netif_device_detach(ndev);

-    }

+	    netif_device_detach(ndev);
+    }
     

 	platform_set_drvdata(pdev, ndev);

 

diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/net/phy/jlsemi/jl3xxx.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/net/phy/jlsemi/jl3xxx.c
old mode 100644
new mode 100755
index 1840c16..52e15a1
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/net/phy/jlsemi/jl3xxx.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/net/phy/jlsemi/jl3xxx.c
@@ -334,8 +334,12 @@
 	if(islink == 1)
 		new_phy_status = 1;
 
-	if((org_phy_status == 0)&&(new_phy_status == 1))
-		gmac_event_notify(GMAC_ETH_PHY_PLUGIN, NULL);
+	if((org_phy_status == 0)&&(new_phy_status == 1)) {
+	    wt(phydev, 0x3, 0x8000, 0x46);
+        wt(phydev, 0x1, 0x0000, 0xA000);
+        gmac_event_notify(GMAC_ETH_PHY_PLUGIN, NULL);
+    }
+
 
 	if((org_phy_status == 1)&&(new_phy_status == 0))
 		gmac_event_notify(GMAC_ETH_PHY_PLUGOUT, NULL);
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/net/phy/phy.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/net/phy/phy.c
old mode 100644
new mode 100755
index ef7742e..3690d49
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/net/phy/phy.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/net/phy/phy.c
@@ -275,6 +275,7 @@
 
 	cmd->base.speed = phydev->speed;
 	cmd->base.duplex = phydev->duplex;
+    cmd->base.reserved1[0] = phydev->link;
 	cmd->base.master_slave_cfg = phydev->master_slave_get;
 	cmd->base.master_slave_state = phydev->master_slave_state;
 	if (phydev->interface == PHY_INTERFACE_MODE_MOCA)
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/pinctrl/core.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/pinctrl/core.c
old mode 100644
new mode 100755
index 8400008..b693043
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/pinctrl/core.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/pinctrl/core.c
@@ -911,6 +911,25 @@
 }
 EXPORT_SYMBOL_GPL(pinctrl_gpio_set_config);
 
+int pinctrl_gpio_get_config(unsigned gpio, unsigned long *config)
+{
+	struct pinctrl_gpio_range *range;
+	struct pinctrl_dev *pctldev;
+	int ret, pin;
+
+	ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &range);
+	if (ret)
+		return ret;
+
+	mutex_lock(&pctldev->mutex);
+	pin = gpio_to_pin(range, gpio);
+	ret = pin_config_get_for_pin(pctldev, pin, config);
+	mutex_unlock(&pctldev->mutex);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(pinctrl_gpio_get_config);
+
 static struct pinctrl_state *find_state(struct pinctrl *p,
 					const char *name)
 {
@@ -1622,7 +1641,7 @@
 		if (!desc)
 			continue;
 
-		seq_printf(s, "pin %d (%s) ", pin, desc->name);
+		seq_printf(s, "pin %3d (%15s) ", pin, desc->name);
 
 #ifdef CONFIG_GPIOLIB
 		gpio_num = -1;
@@ -1638,7 +1657,7 @@
 		else
 			chip = NULL;
 		if (chip)
-			seq_printf(s, "%u:%s ", gpio_num - chip->gpiodev->base, chip->label);
+			seq_printf(s, "%3u:%s ", gpio_num - chip->gpiodev->base, chip->label);
 		else
 			seq_puts(s, "0:? ");
 #endif
@@ -1865,6 +1884,62 @@
 
 static struct dentry *debugfs_root;
 
+#define PINS_DBG_WRITEABLE	1
+
+#if PINS_DBG_WRITEABLE
+int pinmux_dbg_select(struct pinctrl_dev *pctldev,
+				    unsigned pin_num, char *name);
+static ssize_t pinctrl_pin_write(struct file *file, const char __user *buf, size_t nbytes, loff_t *ppos)
+{
+	struct pinctrl_dev *pctldev = ((struct seq_file *)(file->private_data))->private;
+	const struct pinctrl_ops *ops = pctldev->desc->pctlops;
+	unsigned pin;
+    int ret;
+    char *kern_buf;
+	char func[10] = {0};
+
+    kern_buf = kzalloc(nbytes, GFP_KERNEL);
+    if (!kern_buf) {
+        pr_info("%s: Failed to allocate buffer\n", __func__);
+        return -ENOMEM;
+    }
+
+    if (copy_from_user(kern_buf, (void __user *)buf, nbytes)) {
+        kfree(kern_buf);
+        return -ENOMEM;
+    }
+
+    ret = sscanf(kern_buf, "%u %10s %u", &pin, func);
+//    pr_info("%s: %s params, ret=%d, input %d %s\n", __func__,
+//            (ret==2)?"success":"invalid", ret, pin, func);	
+    kfree(kern_buf);
+		
+    if (ret != 2)
+        return -EINVAL;
+
+	if (pin >= pctldev->desc->npins)
+		return -EINVAL;
+
+	ret = pinmux_dbg_select(pctldev, pin, func);
+
+    return ret ? ret : nbytes;
+}
+
+static int pinctrl_pin_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, pinctrl_pins_show, inode->i_private);
+}
+
+static const struct file_operations pinctrl_pin_fops = {
+	.owner= THIS_MODULE,
+	.open= pinctrl_pin_open,
+	.write=pinctrl_pin_write,
+	.read= seq_read,
+	.llseek= seq_lseek,
+	.release= single_release,
+};
+#endif
+
 static void pinctrl_init_device_debugfs(struct pinctrl_dev *pctldev)
 {
 	struct dentry *device_root;
@@ -1892,8 +1967,14 @@
 			dev_name(pctldev->dev));
 		return;
 	}
+
+#if PINS_DBG_WRITEABLE
+    debugfs_create_file("pins", S_IFREG | S_IRUGO | S_IWUGO, 
+    			device_root, pctldev, &pinctrl_pin_fops);
+#else	
 	debugfs_create_file("pins", S_IFREG | S_IRUGO,
 			    device_root, pctldev, &pinctrl_pins_fops);
+#endif
 	debugfs_create_file("pingroups", S_IFREG | S_IRUGO,
 			    device_root, pctldev, &pinctrl_groups_fops);
 	debugfs_create_file("gpio-ranges", S_IFREG | S_IRUGO,
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/pinctrl/sc/pinctrl-zx297520v3.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/pinctrl/sc/pinctrl-zx297520v3.c
old mode 100644
new mode 100755
index 9a8fc10..7cdf0c3
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/pinctrl/sc/pinctrl-zx297520v3.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/pinctrl/sc/pinctrl-zx297520v3.c
@@ -50,13 +50,89 @@
 	struct zx_pinctrl_soc_info *info;
 };
 
-static const struct pinctrl_ops zx_pinctrl_ops = {
-	.dt_node_to_map = pinconf_generic_dt_node_to_map_all,
-	.dt_free_map = pinctrl_utils_free_map,
-	.get_groups_count = pinctrl_generic_get_group_count,
-	.get_group_name = pinctrl_generic_get_group_name,
-	.get_group_pins = pinctrl_generic_get_group_pins,
-};
+static u32 zx_read_mux(struct zx_pinctrl *zpctl, struct zx_pin_data *data)
+{
+	u32 toffset, tbitpos;
+	u32 mask, bitpos, width;	
+	void __iomem *reg;	
+	u32 val;
+	bool pd = false;
+
+	if (data->top) {
+		toffset = data->toffset;
+		tbitpos = data->tbitpos;
+
+		val = readl(zpctl->base + toffset);
+		if (val & (1 << tbitpos)) {
+			width = data->pwidth;
+			mask = (1 << data->pwidth) - 1;
+			bitpos = data->pbitpos;
+			reg = zpctl->pd_base + data->poffset;
+			pd = true;
+		} else {
+			width = data->awidth;
+			mask = (1 << data->awidth) - 1;
+			bitpos = data->abitpos;
+			reg = zpctl->base + data->aoffset;
+		}
+	} else {
+		if (data->pwidth) {
+			width = data->pwidth;
+			mask = (1 << data->pwidth) - 1;
+			bitpos = data->pbitpos;
+			reg = zpctl->pd_base + data->poffset;
+			pd = true;
+		} else if (data->awidth) {
+			width = data->awidth;
+			mask = (1 << data->awidth) - 1;
+			bitpos = data->abitpos;
+			reg = zpctl->base + data->aoffset;
+		} else {
+			return 0xffff;
+		}
+	}
+
+	if (width != 0) {
+		mask = (1 << width) - 1;
+		val = readl(reg);
+		val &= (mask << bitpos);
+		val = val >> bitpos;
+	} else {
+		val = 0x1000;
+	}
+
+	return pd ? (val|PD_MUX_FLAG) : val;
+}
+
+static struct zx_mux_desc * zx_get_mux(struct pinctrl_dev *pctldev, unsigned int group_selector, unsigned int *mux_value)
+{
+	struct zx_pinctrl *zpctl = pinctrl_dev_get_drvdata(pctldev);
+	struct zx_pinctrl_soc_info *info = zpctl->info;
+	const struct pinctrl_pin_desc *pindesc = info->pins + group_selector;
+	struct zx_pin_data *data = pindesc->drv_data;
+	struct zx_mux_desc *mux;
+	unsigned int func;
+
+	/* Skip reserved pin */
+	if (!data)
+		return NULL;
+
+	func = zx_read_mux(zpctl, data);
+	*mux_value = func;
+	if (func & 0x1000)  {
+		return NULL;
+	}
+
+	mux = data->muxes;
+
+	while (mux->name) {
+		if (mux->mux_val == func)
+			return mux;
+		mux++;
+	}
+
+	return NULL;
+}
 
 static void zx_write_mux(struct zx_pinctrl *zpctl, struct zx_pin_data *data, struct zx_mux_desc *mux)
 {
@@ -169,6 +245,9 @@
 		mux++;
 	}
 
+	if (!mux->name)
+		return -EINVAL;
+
 	pin_log("%s:pin(%s) func(%s)\n", __func__, pindesc->name, mux->name);
 	zx_write_mux(zpctl, data, mux);
 
@@ -386,6 +465,121 @@
 	.is_generic = true,
 };
 
+#ifdef CONFIG_DEBUG_FS
+
+#ifdef CONFIG_GPIOLIB
+//#include "../gpio/gpiolib.h"
+#include <asm-generic/gpio.h>
+#include <linux/gpio/driver.h>
+#endif
+
+/* Forward declaration which can be used by samsung_pin_dbg_show */
+static const char * const reg_names[] = {"DRV", "PD", "PU", "SM"};
+static const enum pin_config_param dbg_param[] = {	
+	PIN_CONFIG_DRIVE_STRENGTH,
+	PIN_CONFIG_BIAS_PULL_DOWN,
+	PIN_CONFIG_BIAS_PULL_UP,
+	PIN_CONFIG_INPUT_SCHMITT_ENABLE };
+extern struct gpio_chip *zx_gc;
+
+static void zx_pin_dbg_show(struct pinctrl_dev *pctldev,
+				struct seq_file *s, unsigned int pin)
+{
+	int i;
+	unsigned long config;
+	int ret;
+	struct zx_mux_desc *mux;
+	struct pinctrl_gpio_range *range;	
+	unsigned int gpio;
+	struct gpio_chip *chip;
+
+	for (i = 0; i < ARRAY_SIZE(dbg_param); i++) {
+		config = pinconf_to_config_packed(dbg_param[i], 0);
+		ret = zx_pin_config_get(pctldev, pin, &config);
+
+		ret = ret ? 0 : pinconf_to_config_argument(config);
+
+		if ((PIN_CONFIG_DRIVE_STRENGTH == dbg_param[i]) && (!ret)) {
+			seq_printf(s, " %5s(x)", reg_names[i]);
+			continue;
+		}
+
+		seq_printf(s, " %5s(%1d)", reg_names[i], ret);
+	}
+
+	mux = zx_get_mux(pctldev, pin, &gpio);
+	if (!mux)
+		seq_printf(s, " func(%4s:0x%3x)", (gpio&PD_MUX_FLAG)?" PD":"AON", 
+				(gpio==0xffff)?0:(gpio&0xf7f));
+	else
+		seq_printf(s, " func(%10s)", mux->name);
+
+#ifdef CONFIG_GPIOLIB
+	gpio = 0xffff;
+	list_for_each_entry(range, &pctldev->gpio_ranges, node) {
+		if (pin>=range->pin_base && pin<range->pin_base + range->npins) {
+			gpio = range->id + (pin - range->pin_base);
+			break;
+		}
+	}
+	if (gpio != 0xffff) {
+		chip = gpio_to_chip(gpio);
+		seq_printf(s, " gpio%3u", gpio);
+		/*if (mux && (strcmp(mux->name, "BGPIO") == 0))*/ 
+		if (chip && chip->get_direction && chip->get) {
+			seq_printf(s, "([%s][%s])", chip->get_direction(chip, gpio)?" IN":"OUT",
+				chip->get(chip, gpio)?"hi":"lo");
+		}
+	}
+	else
+		seq_printf(s, " no gpio");
+#endif
+//	pr_info("%s:pin(%s) func(%s)\n", __func__, pindesc->name, mux->name);
+}
+
+int pinmux_dbg_select(struct pinctrl_dev *pctldev,
+				    unsigned pin_num, char *name)
+{
+	struct zx_pinctrl *zpctl = pinctrl_dev_get_drvdata(pctldev);
+	struct zx_pinctrl_soc_info *info = zpctl->info;
+	const struct pinctrl_pin_desc *pindesc = info->pins + pin_num;
+	struct zx_pin_data *data = pindesc->drv_data;
+	struct zx_mux_desc *mux;
+
+	/* Skip reserved pin */
+	if (!data || !name)
+		return -EINVAL;
+
+	mux = data->muxes;
+
+	while (mux->name) {
+		if (strcmp(mux->name, name) == 0)
+			break;
+		mux++;
+	}
+
+	if (!mux->name)
+		return -EINVAL;
+
+	pin_log("%s:pin(%s) func(%s)\n", __func__, pindesc->name, mux->name);
+	zx_write_mux(zpctl, data, mux);
+
+	return 0;
+}
+
+#endif
+
+static const struct pinctrl_ops zx_pinctrl_ops = {
+	.dt_node_to_map = pinconf_generic_dt_node_to_map_all,
+	.dt_free_map = pinctrl_utils_free_map,
+	.get_groups_count = pinctrl_generic_get_group_count,
+	.get_group_name = pinctrl_generic_get_group_name,
+	.get_group_pins = pinctrl_generic_get_group_pins,
+#ifdef CONFIG_DEBUG_FS
+	.pin_dbg_show = zx_pin_dbg_show,
+#endif		
+};
+
 static int zx_pinctrl_build_state(struct platform_device *pdev)
 {
 	struct zx_pinctrl *zpctl = platform_get_drvdata(pdev);
@@ -1332,6 +1526,9 @@
 		AON_MUX(0x0, "BGPIO"),		/* gpio98 */
 		PD_MUX(0x0, "SPIFC")),		/* spifc_d3 */
 
+	ZX_PIN_NOMUX(GPIO99, PMM_REG8, 14, 2,
+		AON_MUX(0, FUNC_NOMUX)),
+
 	ZX_PIN(GPIO100, true, PMM_REG10, 12,
 					0, 0, 0,
 					0, 0, 0,
@@ -1350,76 +1547,79 @@
 					PMM_REG8, 18, 2,
 		AON_MUX(0x0, "BGPIO")),		/* gpio102 */
 
+	ZX_PIN_NOMUX(GPIO103, PMM_REG8, 20, 2,
+		AON_MUX(0, FUNC_NOMUX)),
+
 	ZX_PIN(GPIO104, true, PMM_REG10, 15,
 					0, 0, 0,
-					0, 0, 0,
+					PMM_REG4, 0, 10,
 					PMM_REG9, 0, 2,
 		AON_MUX(0x0, "BGPIO")),		/* gpio104 */
 
 	ZX_PIN(GPIO105, true, PMM_REG10, 16,
 					0, 0, 0,
-					0, 0, 0,
+					PMM_REG4, 10, 10,
 					PMM_REG9, 2, 2,
 		AON_MUX(0x0, "BGPIO")),		/* gpio105 */
 
 	ZX_PIN(GPIO106, true, PMM_REG10, 17,
 					0, 0, 0,
-					0, 0, 0,
+					PMM_REG4, 20, 10,
 					PMM_REG9, 4, 2,
 		AON_MUX(0x0, "BGPIO")),		/* gpio106 */
 
 	ZX_PIN(GPIO107, true, PMM_REG10, 18,
 					0, 0, 0,
-					0, 0, 0,
+					PMM_REG5, 0, 10,
 					PMM_REG9, 6, 2,
 		AON_MUX(0x0, "BGPIO")),		/* gpio107 */
 
 	ZX_PIN(GPIO108, true, PMM_REG10, 19,
 					0, 0, 0,
-					0, 0, 0,
+					PMM_REG5, 10, 10,
 					PMM_REG9, 8, 2,
 		AON_MUX(0x0, "BGPIO")),		/* gpio108 */
 
 	ZX_PIN(GPIO109, true, PMM_REG10, 20,
 					0, 0, 0,
-					0, 0, 0,
+					PMM_REG5, 20, 10,
 					PMM_REG9, 10, 2,
 		AON_MUX(0x0, "BGPIO")),		/* gpio109 */
 
 	ZX_PIN(GPIO110, true, PMM_REG10, 21,
 					0, 0, 0,
-					0, 0, 0,
+					PMM_REG6, 0, 10,
 					PMM_REG9, 12, 2,
 		AON_MUX(0x0, "BGPIO")),		/* gpio110 */
 
 	ZX_PIN(GPIO111, true, PMM_REG10, 22,
 					0, 0, 0,
-					0, 0, 0,
+					PMM_REG6, 10, 10,
 					PMM_REG9, 14, 2,
 		AON_MUX(0x0, "BGPIO")),		/* gpio111 */
 
 	ZX_PIN(GPIO112, true, PMM_REG10, 23,
 					0, 0, 0,
-					0, 0, 0,
+					PMM_REG6, 20, 10,
 					PMM_REG9, 16, 2,
 		AON_MUX(0x0, "BGPIO")),		/* gpio112 */
 
 	ZX_PIN(GPIO113, true, PMM_REG10, 24,
 					0, 0, 0,
-					0, 0, 0,
+					PMM_REG7, 0, 10,
 					PMM_REG9, 18, 2,
 		AON_MUX(0x0, "BGPIO")),		/* gpio113 */
 
 	ZX_PIN(GPIO114, true, PMM_REG10, 25,
 					PMM_REG3, 18, 2,
-					0, 0, 0,
+					PMM_REG7, 10, 10,
 					PMM_REG9, 20, 2,
 		AON_MUX(0x0, "BGPIO"),		/* gpio114 */
 		AON_MUX(0x1, "ABB_I2C")),	/* abb_i2c_scl */
 
 	ZX_PIN(GPIO115, true, PMM_REG10, 26,
 					PMM_REG3, 20, 2,
-					0, 0, 0,
+					PMM_REG7, 20, 10,
 					PMM_REG9, 22, 2,
 		AON_MUX(0x0, "BGPIO"),		/* gpio115 */
 		AON_MUX(0x1, "ABB_I2C")),	/* abb_i2c_sda */
@@ -1561,21 +1761,21 @@
 
 	ZX_PIN(SIM1_RST, true, PMM_REG10, 27,
 					PMM_REG2, 22, 2,
-					0, 0, 0,
+					PMM_REG8, 0, 10,
 					PMM_REG16, 0, 8,
 		AON_MUX(0x0, "BGPIO"),		/* gpio133 */
 		AON_MUX(0x1, "SIM1")),		/* sim1_rst */
 
 	ZX_PIN(SIM1_CLK, true, PMM_REG10, 28,
 					PMM_REG2, 24, 2,
-					0, 0, 0,
+					PMM_REG8, 10, 10,
 					PMM_REG16, 8, 8,
 		AON_MUX(0x0, "BGPIO"),		/* gpio134 */
 		AON_MUX(0x1, "SIM1")),		/* sim1_clk */
 
 	ZX_PIN(SIM1_DATA, true, PMM_REG10, 29,
 					PMM_REG2, 26, 2,
-					0, 0, 0,
+					PMM_REG8, 20, 10,
 					PMM_REG16, 16, 8,
 		AON_MUX(0x0, "BGPIO"),		/* gpio135 */
 		AON_MUX(0x1, "SIM1")),		/* sim1_data */
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/rtc/Kconfig b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/rtc/Kconfig
old mode 100644
new mode 100755
index 54cf5ec..d52d245
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/rtc/Kconfig
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/rtc/Kconfig
@@ -1751,6 +1751,11 @@
 
 	  This driver can also be built as a module. If so, the module
 	  will be called rtc-ls1x.
+config RTC_ZX234290	
+    tristate "ZX234290 RTC support"
+	depends on RTC_CLASS = y
+	depends on MFD_ZX234290
+	default y
 
 config RTC_DRV_MXC
 	tristate "Freescale MXC Real Time Clock"
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/rtc/Makefile b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/rtc/Makefile
old mode 100644
new mode 100755
index bfb5746..defa695
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/rtc/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/rtc/Makefile
@@ -182,4 +182,5 @@
 obj-$(CONFIG_RTC_DRV_WM8350)	+= rtc-wm8350.o
 obj-$(CONFIG_RTC_DRV_X1205)	+= rtc-x1205.o
 obj-$(CONFIG_RTC_DRV_XGENE)	+= rtc-xgene.o
+obj-$(CONFIG_RTC_ZX234290) += zx234290-rtc.o
 obj-$(CONFIG_RTC_DRV_ZYNQMP)	+= rtc-zynqmp.o
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/rtc/zx234290-rtc.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/rtc/zx234290-rtc.c
new file mode 100755
index 0000000..3c95bca
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/rtc/zx234290-rtc.c
@@ -0,0 +1,1213 @@
+/* drivers/rtc/zx234290_rtc.c

+ *

+ * Copyright (c) 2013 Sanechips Co., Ltd.

+ *

+ * This program is free software; you can redistribute it and/or modify

+ * it under the terms of the GNU General Public License version 2 as

+ * published by the Free Software Foundation.

+ *

+ * zx234290 Internal RTC Driver

+*/

+

+#include <linux/module.h>

+#include <linux/kernel.h>

+#include <linux/fs.h>

+#include <linux/string.h>

+#include <linux/init.h>

+#include <linux/platform_device.h>

+#include <linux/interrupt.h>

+#include <linux/rtc.h>

+#include <linux/bcd.h>

+#include <linux/clk.h>

+#include <linux/log2.h>

+#include <linux/of.h>

+#include <linux/delay.h>

+#include <linux/irq.h>

+#include <linux/mfd/zx234290.h>

+#include <asm/irq.h>

+#include <linux/gpio.h>

+#include "zx234290-rtc.h"

+

+#include <linux/semaphore.h>

+

+//#define GPIOFUNC_GPIO 0

+//#define GPIOFUNC_FUNC 1

+//#define PIN_PMU_INT	ZX29_GPIO_47

+static struct platform_device *g_rtcdev;

+

+static int zx234290_rtc_enable(struct device *dev, int enable);

+int zx234290_rtc_settimer(int sec);

+int zx234290_rtc_set_second_timer(int seconds);

+

+#define ZX234290_BITFVAL(var, lsh)   ( (var) << (lsh) )

+#define ZX234290_BITFMASK(wid, lsh)  ( ((1U << (wid)) - 1) << (lsh) )

+#define ZX234290_BITFEXT(var, wid, lsh)   ((var & ZX234290_BITFMASK(wid, lsh)) >> (lsh))

+static struct rtc_device *g_rtc;

+int CycleTimes = 0;

+int surplus = 0;

+int timer_remain=0;

+//#define ZX234290_GPIO_NUM 10

+

+typedef enum

+{

+	TIMER_COUNT_4096	= 0,

+	TIMER_COUNT_64 		= 1,	/* 64 DEFAULT	*/

+	TIMER_COUNT_1 		= 2,	/* 1	*/

+	TIMER_COUNT_1_60 	= 3,	/* 1/60	*/

+

+	TIMER_COUNT_MAX

+}zx234290_timercount;

+

+typedef enum

+{

+	ALARM_MINUTE	= 0,

+	ALARM_HOUR 		= 1,

+	ALARM_DAY 		= 2,

+	ALARM_WEEKDAY 	= 3,

+	ALARM_SECOND 	= 4,

+	ALARM_MAX

+}zx234290_alarm_type;

+

+typedef enum

+{

+    ZX234290_SET_TIMER =( 'r'<<24|'t'<<16|'c'<<8|0),

+    ZX234290_GET_TIMER,

+    ZX234290_TIMER_ENABLED,

+    ZX234290_GET_TIMER_REMAIN,

+    ZX234290_GET_TIMER_STATUS,

+    ZX234290_CYCLE_ENABLE,

+    ZX234290_FUNCTION_MAX

+

+}zx234290_rtc_timer;

+

+typedef struct _zx234290_rtc

+{

+	struct zx234290 *zx234290;

+}zx234290_rtc_data;

+

+zx234290_rtc_data zx234290_rtc;

+

+static volatile long timer_sema_flag=0;

+#define TIMER_SEMA_START_BIT	0 /*set timer before get timer.*/

+#define TIMER_SEMA_WAIT_BIT	1 /*mutex semaphore, up semaphore must be after down semaphore.*/

+

+struct semaphore timerSemaphore;

+

+

+struct rtc_time tempTime = {0};

+

+int zx234290_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm);

+static int zx234290_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm);

+

+static int zx234290_rtc_write_register(unsigned char addr, unsigned char data, unsigned char mask)

+{

+    int ret = 0;

+    unsigned char content = 0;

+

+	ret = zx234290_reg_read(zx234290_rtc.zx234290, addr);

+	if (ret < 0)

+    {

+        return -1;

+    }

+

+	content = (unsigned char)ret;

+	content &= ~mask;

+    content |= data & mask;

+	ret = zx234290_reg_write(zx234290_rtc.zx234290, addr, content);

+	if (ret != 0)

+	{

+		return ret;

+	}

+

+    return ret;

+}

+

+static int zx234290_rtc_read_register(unsigned char reg, unsigned char *dest)

+{

+	int ret;

+

+	ret = zx234290_reg_read(zx234290_rtc.zx234290, reg);

+	if (ret < 0)

+		return ret;

+

+	*dest = (unsigned char)ret;

+

+	return 0;

+}

+

+//++added by ys

+//send alarm irq event to app when alarm come.

+void zte_send_alarm_irq_event(void)

+{

+	char event_string[100] = {0};

+	char *envp[] = { event_string, NULL };

+

+    struct rtc_time rtc_tm;

+	struct rtc_wkalrm alrm;

+	unsigned long sec;

+//	time_t sec;

+

+    zx234290_rtc_gettime(NULL, &rtc_tm);

+	zx234290_rtc_getalarm(NULL, &alrm);

+	alrm.time.tm_year = rtc_tm.tm_year;

+	alrm.time.tm_mon = rtc_tm.tm_mon;

+    //rtc_tm_to_time(&(alrm.time), &sec);

+	sec = rtc_tm_to_time64(&(alrm.time));

+/*

+	printk("read alarm  %04d.%02d.%02d %02d:%02d:%02d wday %d, sec %lu\n",

+		 alrm.time.tm_year, alrm.time.tm_mon, alrm.time.tm_mday,

+		 alrm.time.tm_hour, alrm.time.tm_min, alrm.time.tm_sec, alrm.time.tm_wday, sec);

+*/

+

+   	sprintf(event_string,"PMIC RTC ALARM IRQ COME, sec:%lu", sec);

+

+	if(strlen(event_string))

+		kobject_uevent_env(&g_rtcdev->dev.kobj, KOBJ_CHANGE,envp);

+}

+

+void zte_send_timer_irq_event(void)

+{

+	char event_string[100] = {0};

+	char *envp[] = { event_string, NULL };

+//	printk(KERN_INFO "zx234290_rtc: send_timer_irq_event\n" );

+

+	sprintf(event_string,"PMIC RTC TIMER IRQ COME");

+

+	if(strlen(event_string))

+		kobject_uevent_env(&g_rtcdev->dev.kobj, KOBJ_CHANGE,envp);

+

+	//printk(KERN_INFO "[yuwei]send_timer_irq_event. uevent\n");

+}

+void zte_send_min_irq_event(void)

+{

+	char event_string[100] = {0};

+	char *envp[] = { event_string, NULL };

+//	printk(KERN_INFO "zx234290_rtc: send_min_irq_event\n" );

+

+	sprintf(event_string,"PMIC RTC MIN IRQ COME");

+

+	if(strlen(event_string))

+		kobject_uevent_env(&g_rtcdev->dev.kobj, KOBJ_CHANGE,envp);

+

+}

+void zte_send_hour_irq_event(void)

+{

+	char event_string[100] = {0};

+	char *envp[] = { event_string, NULL };

+//	printk(KERN_INFO "zx234290_rtc: send_hour_irq_event\n" );

+

+	sprintf(event_string,"PMIC RTC HOUR IRQ COME");

+

+	if(strlen(event_string))

+		kobject_uevent_env(&g_rtcdev->dev.kobj, KOBJ_CHANGE,envp);

+

+}

+//++end

+

+

+

+/*alarm and timer countdown irq*/

+static irqreturn_t zx234290_rtc_alarmirq(int irq, void *id)

+{

+	struct rtc_device *rdev = id;

+	unsigned char reg_val = 0, mask = 0;

+	unsigned char reg_val_ctrl2 = 0;

+

+	zx234290_rtc_read_register(ZX234290_REG_ADDR_RTC_CTRL2,&reg_val_ctrl2);

+	//printk(KERN_INFO "zx234290_rtc_alarmirq:CycleTimes=%d,surplus=%d,timerFlag=%d.\n",CycleTimes,surplus,timerFlag);

+	//printk(KERN_INFO "zx234290_rtc_alarmirq:value(0x31) =%d.\n",reg_val_ctrl2);

+printk("*** rtc come!\n");

+	/*alarm int*/

+	if((reg_val_ctrl2&0x08) == 0x08)

+	//if((reg_val_ctrl2>>ZX234290_RTC_AF_LSH)&0x1 == 0x1)

+	{

+	    /*clear AF bit*/

+		mask = ZX234290_BITFMASK(ZX234290_RTC_AF_WID, ZX234290_RTC_AF_LSH);

+		reg_val= ZX234290_BITFVAL(0, ZX234290_RTC_AF_LSH);

+		zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);

+

+		rtc_update_irq(rdev, 1, RTC_AF | RTC_IRQF);

+

+		zte_send_alarm_irq_event();

+	}

+	/*timer int*/

+	if((reg_val_ctrl2&0x04) == 0x04)

+	//else if((reg_val_ctrl2>>ZX234290_RTC_TF_LSH)&0x1 == 0x1)

+	{

+	    /*clear TF bit*/

+		mask = ZX234290_BITFMASK(ZX234290_RTC_TF_WID, ZX234290_RTC_TF_LSH);

+		reg_val= ZX234290_BITFVAL(0, ZX234290_RTC_TF_LSH);

+		zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);

+

+		rtc_update_irq(rdev, 1, RTC_AF | RTC_IRQF);

+

+//		printk(KERN_INFO "zx234290_rtc_alarmirq ,remain seconds=%ld,flag=0x%lx\n",timer_remain,timer_sema_flag);

+		if(timer_remain){

+			zx234290_rtc_set_second_timer(min(timer_remain,255));

+			timer_remain -= min(timer_remain,255);

+		}

+		else{

+		    	if(test_and_clear_bit(TIMER_SEMA_WAIT_BIT, &timer_sema_flag)){

+				up(&timerSemaphore);

+			       printk(KERN_INFO "zx234290_rtc_alarmirq semaphore.\n");

+			}

+			zte_send_timer_irq_event();

+			clear_bit(TIMER_SEMA_START_BIT, &timer_sema_flag);

+		}

+

+	}

+

+//	printk(KERN_INFO "zx234290_rtc: irq = %d, REG(0x31) =0x%x.\n", irq, reg_val_ctrl2);

+	return IRQ_HANDLED;

+}

+

+static irqreturn_t zx234290_rtc_minirq(int irq, void *id)

+{

+	struct rtc_device *rdev = id;

+printk("min rtc\n");

+	rtc_update_irq(rdev, 1, RTC_UF | RTC_IRQF);

+	zte_send_min_irq_event();

+	return IRQ_HANDLED;

+}

+static irqreturn_t zx234290_rtc_hourirq(int irq, void *id)

+{

+	struct rtc_device *rdev = id;

+

+	rtc_update_irq(rdev, 1, RTC_UF | RTC_IRQF);

+	zte_send_hour_irq_event();

+	return IRQ_HANDLED;

+}

+/*alarm enable/disable, 0:disable 1:enable*/

+int zx234290_rtc_alarm_enable(zx234290_alarm_type type, unsigned int enabled)

+{

+    int ret = 0;

+    unsigned char reg_addr=0, reg_val=0, mask=0;

+	switch(type)

+	{

+		case ALARM_MINUTE:

+			reg_addr = ZX234290_REG_ADDR_ALARM_MINUTE;

+			break;

+		case ALARM_HOUR:

+			reg_addr = ZX234290_REG_ADDR_ALARM_HOUR;

+			break;

+		case ALARM_DAY:

+			reg_addr = ZX234290_REG_ADDR_ALARM_DAY;

+			break;

+		case ALARM_WEEKDAY:

+			reg_addr = ZX234290_REG_ADDR_ALARM_WEEK;

+			break;

+        case ALARM_SECOND:

+			reg_addr = ZX234290_REG_ADDR_ALARM_SECOND;

+			break;

+		default:

+			reg_addr = ZX234290_REG_ADDR_ALARM_MINUTE;

+			break;

+	}

+

+	reg_val = ZX234290_BITFVAL(enabled, ZX234290_RTC_AlARM_ACTIVATED_LSH);

+	mask = ZX234290_BITFMASK(ZX234290_RTC_AlARM_ACTIVATED_WID, ZX234290_RTC_AlARM_ACTIVATED_LSH);

+	ret = zx234290_rtc_write_register(reg_addr, reg_val, mask);

+    return ret;

+}

+

+/*timer counter set*/

+int zx234290_rtc_set_timercounter(unsigned char cnt)

+{

+    int ret = 0;

+    unsigned char reg_addr=0, reg_val=0, mask=0;

+

+    reg_addr = ZX234290_REG_ADDR_TIMER_CNT;

+    reg_val = ZX234290_BITFVAL(cnt, ZX234290_RTC_TIMER_CNT_LSH);

+    mask = ZX234290_BITFMASK(ZX234290_RTC_TIMER_CNT_WID, ZX234290_RTC_TIMER_CNT_LSH);

+    ret = zx234290_rtc_write_register(reg_addr, reg_val, mask);

+

+    return ret;

+}

+

+/*

+	TIMER_COUNT_4096	= 0,

+	TIMER_COUNT_64 		= 1,

+	TIMER_COUNT_1 		= 2,

+	TIMER_COUNT_1_60 	= 3,

+*/

+int zx234290_rtc_set_clock_frequency(zx234290_timercount td)

+{

+    int ret = 0;

+    unsigned char reg_addr=0, reg_val=0, mask=0;

+

+    reg_addr = ZX234290_REG_ADDR_TIMER_CTRL;

+    reg_val = ZX234290_BITFVAL(td, ZX234290_RTC_TIMER_TD_LSH);

+    mask = ZX234290_BITFMASK(ZX234290_RTC_TIMER_TD_WID, ZX234290_RTC_TIMER_TD_LSH);

+    ret = zx234290_rtc_write_register(reg_addr, reg_val, mask);

+

+    return ret;

+}

+

+static int zx234290_rtc_setaie(struct device *dev, unsigned int enabled)

+{

+	int ret = 0;

+	int reg_val=0, mask=0;

+

+	pr_debug("%s: aie=%d\n", __func__, enabled);

+

+    /*enable/disable AIE bit*/

+	mask = ZX234290_BITFMASK(ZX234290_RTC_AIE_WID, ZX234290_RTC_AIE_LSH);

+	reg_val= ZX234290_BITFVAL(enabled, ZX234290_RTC_AIE_LSH);

+	ret = zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);

+    if (ret != 0)

+    {

+        return ret;

+    }

+

+    /*clear AF bit*/

+	mask = ZX234290_BITFMASK(ZX234290_RTC_AF_WID, ZX234290_RTC_AF_LSH);

+	reg_val= ZX234290_BITFVAL(0, ZX234290_RTC_AF_LSH);

+	ret = zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);

+    if (ret != 0)

+    {

+        return ret;

+    }

+

+    /*mask/unmask alarm int*/

+	/*

+	mask = ZX234290_BITFMASK(ZX234290_RTC_ALARM_INT_MASK_WID, ZX234290_RTC_ALARM_INT_MASK_LSH);

+	if(enabled)

+	{

+		reg_val= ZX234290_BITFVAL(0, ZX234290_RTC_ALARM_INT_MASK_LSH);

+	}

+	else

+	{

+		reg_val= ZX234290_BITFVAL(1, ZX234290_RTC_ALARM_INT_MASK_LSH);

+	}

+

+	ret = zx234290_rtc_write_register(ZX234290_REG_ADDR_INTB_MASK, reg_val, mask);

+    if (ret != 0)

+    {

+        return ret;

+    }

+	*/

+

+	return ret;

+}

+

+static int zx234290_rtc_settie(struct device *dev, unsigned int enabled)

+{

+	int ret = 0;

+	int reg_val=0, mask=0;

+    /*enable/disable TIE bit*/

+	mask = ZX234290_BITFMASK(ZX234290_RTC_TIE_WID, ZX234290_RTC_TIE_LSH);

+	reg_val= ZX234290_BITFVAL(enabled, ZX234290_RTC_TIE_LSH);

+	ret = zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);

+	if (ret != 0)

+	{

+		return ret;

+	}

+    return 0;

+}

+static int zx234290_rtc_setuie(struct device *dev, unsigned int enabled)

+{

+	int nRet = 0;

+	int  reg_val=0, mask=0;

+	pr_debug("%s: uie=%d\n", __func__, enabled);

+	/*

+	mask = ZX234290_BITFMASK(ZX234290_RTC_TIMER_INT_EN_WID, ZX234290_RTC_TIMER_INT_EN_LSH);

+	reg_val= ZX234290_BITFVAL(enabled, ZX234290_RTC_TIMER_INT_EN_LSH);

+	nRet = zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);

+	if (nRet != 0)

+	{

+		return nRet;

+	}

+	*/

+	mask = ZX234290_BITFMASK(ZX234290_RTC_ONE_MINUTE_INT_MASK_WID, ZX234290_RTC_ONE_MINUTE_INT_MASK_LSH);

+	if(enabled)

+	{

+		reg_val= ZX234290_BITFVAL(0, ZX234290_RTC_ONE_MINUTE_INT_MASK_LSH);

+	}

+	else

+	{

+		reg_val= ZX234290_BITFVAL(1, ZX234290_RTC_ONE_MINUTE_INT_MASK_LSH);

+	}

+

+	nRet = zx234290_rtc_write_register(ZX234290_REG_ADDR_INTB_MASK, reg_val, mask);

+

+	mask = ZX234290_BITFMASK(ZX234290_RTC_ONE_HOUR_INT_MASK_WID, ZX234290_RTC_ONE_HOUR_INT_MASK_LSH);

+	if(enabled)

+	{

+		reg_val= ZX234290_BITFVAL(0, ZX234290_RTC_ONE_HOUR_INT_MASK_LSH);

+	}

+	else

+	{

+		reg_val= ZX234290_BITFVAL(1, ZX234290_RTC_ONE_HOUR_INT_MASK_LSH);

+	}

+

+	nRet = zx234290_rtc_write_register(ZX234290_REG_ADDR_INTB_MASK, reg_val, mask);

+

+	return nRet;

+}

+

+static int zx234290_rtc_getvalue(unsigned char reg, unsigned char *dest, unsigned char width, unsigned char offset)

+{

+	int nRet = 0;

+	unsigned char val;

+	nRet = zx234290_rtc_read_register(reg, dest);

+	if (nRet != 0)

+    {

+        return nRet;

+    }

+	val = *dest;

+	val = ZX234290_BITFEXT(val,width, offset);

+	*dest = val;

+	return nRet;

+}

+

+static int zx234290_rtc_setvalue(unsigned char addr, unsigned char data, unsigned char width, unsigned char offset)

+{

+	int nRet = 0;

+	unsigned char  reg_val=0, mask=0;

+	reg_val = ZX234290_BITFVAL(data, offset);

+    mask = ZX234290_BITFMASK(width, offset);

+	nRet = zx234290_rtc_write_register(addr, reg_val, mask);

+	return nRet;

+}

+

+

+int zx234290_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)

+{

+	unsigned char day, mon, year, wday, sec, min, hour;

+	unsigned char CenturyIndicate = 0;

+	unsigned int have_retried = 0;

+	if(rtc_tm == NULL)

+	{

+		return -1;

+	}

+retry_get_time:

+

+	zx234290_rtc_getvalue(ZX234290_REG_ADDR_SECONDS, &sec, ZX234290_RTC_TIME_SECONDS_WID, ZX234290_RTC_TIME_SECONDS_LSH);

+	zx234290_rtc_getvalue(ZX234290_REG_ADDR_MINUTES, &min, ZX234290_RTC_TIME_MINUTES_WID, ZX234290_RTC_TIME_MINUTES_LSH);

+    zx234290_rtc_getvalue(ZX234290_REG_ADDR_HOURS, &hour, ZX234290_RTC_TIME_HOURS_WID, ZX234290_RTC_TIME_HOURS_LSH);

+	zx234290_rtc_getvalue(ZX234290_REG_ADDR_DAY, &day, ZX234290_RTC_TIME_DAYS_WID, ZX234290_RTC_TIME_DAYS_LSH);

+	zx234290_rtc_getvalue(ZX234290_REG_ADDR_MONTH, &mon, ZX234290_RTC_TIME_MONTHS_WID, ZX234290_RTC_TIME_MONTHS_LSH);

+	zx234290_rtc_getvalue(ZX234290_REG_ADDR_YEAR, &year, ZX234290_RTC_TIME_YEAR_WID, ZX234290_RTC_TIME_YEAR_LSH);

+	zx234290_rtc_getvalue(ZX234290_REG_ADDR_WEEK, &wday, ZX234290_RTC_TIME_WEEKDAY_WID, ZX234290_RTC_TIME_WEEKDAY_LSH);

+	zx234290_rtc_getvalue(ZX234290_REG_ADDR_MONTH, &CenturyIndicate, ZX234290_RTC_TIME_CENTURY_WID, ZX234290_RTC_TIME_CENTURY_LSH);

+

+

+	if (sec == 0 && !have_retried)

+	{

+		have_retried = 1;

+		goto retry_get_time;

+	}

+	rtc_tm->tm_sec = bcd2bin(sec);

+	rtc_tm->tm_min = bcd2bin(min);

+	rtc_tm->tm_hour = bcd2bin(hour);

+	rtc_tm->tm_mday = bcd2bin(day);

+	rtc_tm->tm_mon = bcd2bin(mon);

+	rtc_tm->tm_year = bcd2bin(year);//+2000;

+    rtc_tm->tm_wday = bcd2bin(wday);

+	rtc_tm->tm_yday = rtc_year_days(rtc_tm->tm_mday, rtc_tm->tm_mon , rtc_tm->tm_year);

+	if(CenturyIndicate == 0)

+	{

+    	rtc_tm->tm_year += 100;

+	}

+	rtc_tm->tm_mon -= 1;

+	rtc_tm->tm_isdst = 0;

+	pr_debug("read time %04d.%02d.%02d %02d:%02d:%02d\n",

+		  rtc_tm->tm_year, rtc_tm->tm_mon+1, rtc_tm->tm_mday,

+		 rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec);

+

+	return rtc_valid_tm(rtc_tm);

+}

+

+static int zx234290_rtc_settime(struct device *dev, struct rtc_time *tm)

+{

+	int ret = 0;

+	unsigned char day, mon, year, wday, sec, min, hour, CenturyIndicate;

+	unsigned char  reg_val=0, mask=0;

+	//int year = tm->tm_year - 100;

+	pr_debug("set time %04d.%02d.%02d %02d:%02d:%02d\n",

+		 tm->tm_year, tm->tm_mon+1, tm->tm_mday,

+		 tm->tm_hour, tm->tm_min, tm->tm_sec);

+	if(tm->tm_year >= 200)

+	{

+		return -1;

+

+	}else if(tm->tm_year >= 100)

+    {

+        year = tm->tm_year - 100;

+        CenturyIndicate = 0;  /*indicate 21 ÊÀ¼Í 20xx*/

+    }

+    else

+    {

+        year = tm->tm_year;

+        CenturyIndicate = 1;  /*indicate 20 ÊÀ¼Í 19xx*/

+    }

+	/* we get around y2k by simply not supporting it */

+	sec = bin2bcd(tm->tm_sec);

+	reg_val = ZX234290_BITFVAL(sec, ZX234290_RTC_TIME_SECONDS_LSH);

+    mask = ZX234290_BITFMASK(ZX234290_RTC_TIME_SECONDS_WID, ZX234290_RTC_TIME_SECONDS_LSH);

+	ret = zx234290_rtc_write_register(ZX234290_REG_ADDR_SECONDS, reg_val, mask);

+

+	min = bin2bcd(tm->tm_min);

+	reg_val = ZX234290_BITFVAL(min, ZX234290_RTC_TIME_MINUTES_LSH);

+    mask = ZX234290_BITFMASK(ZX234290_RTC_TIME_MINUTES_WID, ZX234290_RTC_TIME_MINUTES_LSH);

+	ret  += zx234290_rtc_write_register(ZX234290_REG_ADDR_MINUTES, reg_val, mask);

+

+	hour = bin2bcd(tm->tm_hour);

+	reg_val = ZX234290_BITFVAL(hour, ZX234290_RTC_TIME_HOURS_LSH);

+    mask = ZX234290_BITFMASK(ZX234290_RTC_TIME_HOURS_WID, ZX234290_RTC_TIME_HOURS_LSH);

+	ret  += zx234290_rtc_write_register(ZX234290_REG_ADDR_HOURS, reg_val, mask);

+

+	day = bin2bcd(tm->tm_mday);

+	reg_val = ZX234290_BITFVAL(day, ZX234290_RTC_TIME_DAYS_LSH);

+    mask = ZX234290_BITFMASK(ZX234290_RTC_TIME_DAYS_WID, ZX234290_RTC_TIME_DAYS_LSH);

+	ret  += zx234290_rtc_write_register(ZX234290_REG_ADDR_DAY, reg_val, mask);

+

+	mon = bin2bcd(tm->tm_mon+1);

+	reg_val = ZX234290_BITFVAL(mon, ZX234290_RTC_TIME_MONTHS_LSH);

+    mask = ZX234290_BITFMASK(ZX234290_RTC_TIME_MONTHS_WID, ZX234290_RTC_TIME_MONTHS_LSH);

+	ret  += zx234290_rtc_write_register(ZX234290_REG_ADDR_MONTH, reg_val, mask);

+

+    reg_val = ZX234290_BITFVAL(CenturyIndicate, ZX234290_RTC_TIME_CENTURY_LSH);

+    mask = ZX234290_BITFMASK(ZX234290_RTC_TIME_CENTURY_WID, ZX234290_RTC_TIME_CENTURY_LSH);

+    ret += zx234290_rtc_write_register(ZX234290_REG_ADDR_MONTH, reg_val, mask);

+

+	year = bin2bcd(year);

+	reg_val = ZX234290_BITFVAL(year, ZX234290_RTC_TIME_YEAR_LSH);

+    mask = ZX234290_BITFMASK(ZX234290_RTC_TIME_YEAR_WID, ZX234290_RTC_TIME_YEAR_LSH);

+	ret  += zx234290_rtc_write_register(ZX234290_REG_ADDR_YEAR, reg_val, mask);

+

+	wday = bin2bcd(tm->tm_wday);

+	reg_val = ZX234290_BITFVAL(wday, ZX234290_RTC_TIME_WEEKDAY_LSH);

+    mask = ZX234290_BITFMASK(ZX234290_RTC_TIME_WEEKDAY_WID, ZX234290_RTC_TIME_WEEKDAY_LSH);

+	ret  += zx234290_rtc_write_register(ZX234290_REG_ADDR_WEEK, reg_val, mask);

+

+	return ret;

+}

+

+static int zx234290_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm)

+{

+	struct rtc_time *alm_tm = &alrm->time;

+	unsigned char second, day, wday, min, hour;

+	unsigned char  reg_val=0, mask=0;

+	if(alrm == NULL)

+	{

+		return -1;

+	}

+	zx234290_rtc_getvalue(ZX234290_REG_ADDR_ALARM_SECOND, &second, ZX234290_RTC_AlARM_SECOND_WID, ZX234290_RTC_AlARM_SECOND_LSH);

+	zx234290_rtc_getvalue(ZX234290_REG_ADDR_ALARM_MINUTE, &min, ZX234290_RTC_AlARM_MINUTES_WID, ZX234290_RTC_AlARM_MINUTES_LSH);

+	zx234290_rtc_getvalue(ZX234290_REG_ADDR_ALARM_HOUR, &hour, ZX234290_RTC_AlARM_HOURS_WID, ZX234290_RTC_AlARM_HOURS_LSH);

+	zx234290_rtc_getvalue(ZX234290_REG_ADDR_ALARM_DAY, &day, ZX234290_RTC_AlARM_DAYS_WID, ZX234290_RTC_AlARM_DAYS_LSH);

+	zx234290_rtc_getvalue(ZX234290_REG_ADDR_ALARM_WEEK, &wday, ZX234290_RTC_AlARM_WEEKDAY_WID, ZX234290_RTC_AlARM_WEEKDAY_LSH);

+

+	mask = ZX234290_BITFMASK(ZX234290_RTC_ALARM_INT_EN_WID, ZX234290_RTC_ALARM_INT_EN_LSH);

+	zx234290_rtc_read_register(ZX234290_REG_ADDR_RTC_CTRL2, &reg_val);

+	alrm->enabled = (reg_val & mask)? 1 : 0;

+

+	pr_debug("read alarm %d, %04d.%02d.%02d %02d:%02d:%02d\n",

+		 alrm->enabled,

+		 1900 + alm_tm->tm_year, alm_tm->tm_mon+1, alm_tm->tm_mday,

+		 alm_tm->tm_hour, alm_tm->tm_min, alm_tm->tm_sec);

+	/* decode the alarm enable field */

+    if(alrm->enabled)

+    {

+        //alm_tm->tm_sec  = 0; //bcd2bin(alm_tm->tm_sec);

+        alm_tm->tm_sec  = bcd2bin(second);//yuxiang

+        alm_tm->tm_min  = bcd2bin(min);

+        alm_tm->tm_hour = bcd2bin(hour);

+        alm_tm->tm_mday = bcd2bin(day);

+		alm_tm->tm_wday = bcd2bin(wday);

+    }

+    else

+	{

+        alm_tm->tm_sec = -1;

+        alm_tm->tm_min = -1;

+        alm_tm->tm_hour = -1;

+        alm_tm->tm_mday = -1;

+        alm_tm->tm_mon = -1;

+        alm_tm->tm_year = -1;

+    }

+

+	return 0;

+}

+

+static int zx234290_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)

+{

+	struct rtc_time *tm = &alrm->time;

+	//unsigned long expires;

+	unsigned char sec, min, hour, mday, wday;

+	//rtc_tm_to_time(tm, &expires);

+	//expires = roundup(expires, 60);

+	//rtc_time_to_tm(expires, tm);

+	//tm->tm_sec = 0;

+

+    if (tm->tm_sec < 60 && tm->tm_sec >= 0)//yuxiang

+	{

+		sec = bin2bcd(tm->tm_sec);

+		zx234290_rtc_setvalue(ZX234290_REG_ADDR_ALARM_SECOND, sec, ZX234290_RTC_AlARM_SECOND_WID, ZX234290_RTC_AlARM_SECOND_LSH);

+		zx234290_rtc_alarm_enable(ALARM_SECOND, 0);

+	}

+	else

+	{

+		zx234290_rtc_alarm_enable(ALARM_SECOND, 1);

+	}

+

+	if (tm->tm_min < 60 && tm->tm_min >= 0)

+	{

+		min = bin2bcd(tm->tm_min);

+		zx234290_rtc_setvalue(ZX234290_REG_ADDR_ALARM_MINUTE, min, ZX234290_RTC_AlARM_MINUTES_WID, ZX234290_RTC_AlARM_MINUTES_LSH);

+		zx234290_rtc_alarm_enable(ALARM_MINUTE, 0);

+	}

+	else

+	{

+		zx234290_rtc_alarm_enable(ALARM_MINUTE, 1);

+	}

+	if (tm->tm_hour < 24 && tm->tm_hour >= 0)

+	{

+        hour = bin2bcd(tm->tm_hour);

+		zx234290_rtc_setvalue(ZX234290_REG_ADDR_ALARM_HOUR, hour, ZX234290_RTC_AlARM_HOURS_WID, ZX234290_RTC_AlARM_HOURS_LSH);

+		zx234290_rtc_alarm_enable(ALARM_HOUR, 0);

+	}

+	else

+	{

+		zx234290_rtc_alarm_enable(ALARM_HOUR, 1);

+	}

+    if(tm->tm_mday < 32 && tm->tm_mday > 0)

+    {

+		mday = bin2bcd(tm->tm_mday);

+		zx234290_rtc_setvalue(ZX234290_REG_ADDR_ALARM_DAY, mday, ZX234290_RTC_AlARM_DAYS_WID, ZX234290_RTC_AlARM_DAYS_LSH);

+		zx234290_rtc_alarm_enable(ALARM_DAY, 0);

+	}

+	else

+	{

+		zx234290_rtc_alarm_enable(ALARM_DAY, 1);

+	}

+	if(tm->tm_wday < 7 && tm->tm_wday >= 0)

+    {

+		wday = bin2bcd(tm->tm_wday);

+		zx234290_rtc_setvalue(ZX234290_REG_ADDR_ALARM_WEEK, wday, ZX234290_RTC_AlARM_WEEKDAY_WID, ZX234290_RTC_AlARM_WEEKDAY_LSH);

+		zx234290_rtc_alarm_enable(ALARM_WEEKDAY, 0);

+	}

+	else

+	{

+		zx234290_rtc_alarm_enable(ALARM_WEEKDAY, 1);

+	}

+	zx234290_rtc_setaie(dev, alrm->enabled);

+	return 0;

+}

+int g_irq_alarm = 0;

+int g_irq_hour = 0;

+int g_irq_min = 0;

+int qhf_rtc = 0xff;

+

+static int zx234290_rtc_request_irq(struct platform_device *pdev, struct rtc_device *rtc)

+{

+	int ret = -1;

+	int irq_alrm,irq_min,irq_hour;

+	struct zx234290 *zx234290 = dev_get_drvdata(pdev->dev.parent);

+	

+	qhf_rtc = zx234290->irq_domain;

+	/*alarm*/

+	irq_alrm = irq_create_mapping(zx234290->irq_domain, ZX234290_INT_RTC_ALRM);

+	if (!irq_alrm) {

+		dev_err(&pdev->dev, "Failed to create mapping alarm IRQ\n");

+		return  -ENXIO;

+	}

+	

+	g_irq_alarm = irq_alrm;

+	ret = devm_request_threaded_irq(&pdev->dev, irq_alrm, NULL,

+				zx234290_rtc_alarmirq, IRQF_ONESHOT,

+				"zx234290-rtc-alarm", rtc);

+	if (ret)

+	{

+		dev_err(&pdev->dev, "IRQ rtc alarm error %d\n", ret);

+		goto err_alarm_irq;

+	}

+	/*hour*/	

+	irq_hour= irq_create_mapping(zx234290->irq_domain, ZX234290_INT_RTC_HOUR);

+	if (!irq_hour) {

+		dev_err(&pdev->dev, "Failed to create mapping hour IRQ\n");

+		return  -ENXIO;

+	}

+	

+	g_irq_hour = irq_hour;

+	ret = devm_request_threaded_irq(&pdev->dev, irq_hour, NULL,

+				zx234290_rtc_hourirq, IRQF_ONESHOT,

+				"zx234290-rtc-hour", rtc);

+	if (ret)

+	{

+		dev_err(&pdev->dev, "IRQ rtc hour error %d\n", ret);

+		goto err_hour_irq;

+	}

+

+	/*min*/	

+	irq_min= irq_create_mapping(zx234290->irq_domain, ZX234290_INT_RTC_MIN);

+	if (!irq_hour) {

+		dev_err(&pdev->dev, "Failed to create mapping min IRQ\n");

+		return  -ENXIO;

+	}

+	

+	g_irq_min = irq_min;

+	ret = devm_request_threaded_irq(&pdev->dev, irq_min, NULL,

+				zx234290_rtc_minirq, IRQF_ONESHOT,

+				"zx234290-rtc-min", rtc);

+	if (ret)

+	{

+		dev_err(&pdev->dev, "IRQ rtc min error %d\n", ret);

+		goto err_min_irq;

+	}

+

+	return 0;

+

+ err_min_irq:

+	free_irq(irq_min, rtc);

+ err_hour_irq:

+	free_irq(irq_hour, rtc);

+ err_alarm_irq:

+	free_irq(irq_alrm, rtc);

+

+	return ret;

+}

+

+#if 1

+

+static int zx234290_rtc_set_second_alarm_int(struct device *dev, unsigned int enabled)

+{

+	int nRet = 0;

+

+	int ret = 0;

+	int reg_addr=0,  mask=0;

+	unsigned char reg_val=0;

+	int bIsOn = 0;

+

+    #if 0

+	pr_debug("%s: aie=%d\n", __func__, enabled);

+	mask = ZX234290_BITFMASK(ZX234290_RTC_ALARM_INT_EN_WID, ZX234290_RTC_ALARM_INT_EN_LSH);

+	reg_val= ZX234290_BITFVAL(enabled, ZX234290_RTC_ALARM_INT_EN_LSH);

+	nRet = zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);

+    if (nRet != 0)

+    {

+        return nRet;

+    }

+	mask = ZX234290_BITFMASK(ZX234290_RTC_ALARM_AF_WID, ZX234290_RTC_ALARM_AF_LSH);

+	reg_val= ZX234290_BITFVAL(0, ZX234290_RTC_ALARM_AF_LSH);

+	zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);

+	mask = ZX234290_BITFMASK(ZX234290_RTC_ALARM_INT_MASK_WID, ZX234290_RTC_ALARM_INT_MASK_LSH);

+	if(enabled)

+	{

+		reg_val= ZX234290_BITFVAL(0, ZX234290_RTC_ALARM_INT_MASK_LSH);

+	}

+	else

+	{

+		reg_val= ZX234290_BITFVAL(1, ZX234290_RTC_ALARM_INT_MASK_LSH);

+	}

+	nRet = zx234290_rtc_write_register(ZX234290_REG_ADDR_INTB_MASK, reg_val, mask);

+    #endif

+    if(enabled)

+        bIsOn = 0;//active

+    else

+        bIsOn = 1;//inactive

+

+    reg_addr = ZX234290_REG_ADDR_INTB_MASK;

+    reg_val = ZX234290_BITFVAL(enabled, ZX234290_RTC_ALARM_INT_MASK_LSH);

+    mask = ZX234290_BITFMASK(ZX234290_RTC_ALARM_INT_MASK_WID, ZX234290_RTC_ALARM_INT_MASK_LSH);

+    ret = zx234290_rtc_write_register(reg_addr,reg_val, mask);

+    zx234290_rtc_read_register(0x03, &reg_val);

+

+//    printk(KERN_INFO "zx234290_rtc_ioctl:0x03 = %x.\n",reg_val);

+#if 0

+    reg_addr = ZX234290_REG_ADDR_RTC_CTRL2;

+    reg_val = ZX234290_BITFVAL(enabled, ZX234290_RTC_ALARM_INT_EN_LSH);

+    mask = ZX234290_BITFMASK(ZX234290_RTC_ALARM_INT_EN_WID, ZX234290_RTC_ALARM_INT_EN_LSH);

+    ret = zx234290_rtc_write_register(slv_addr,reg_val, mask);

+    reg_addr = ZX234290_REG_ADDR_RTC_CTRL2;

+    reg_val = ZX234290_BITFVAL(enabled, 2);

+    mask = ZX234290_BITFMASK(1, 2);

+    ret = zx234290_rtc_write_register(slv_addr,reg_val, mask);

+#endif

+	return nRet;

+}

+

+//static DECLARE_MUTEX(timerSemaphore);

+

+

+

+int zx234290_rtc_gettimer(void)

+{

+	int ret = -EPERM;

+

+	if(!test_and_set_bit(TIMER_SEMA_WAIT_BIT, &timer_sema_flag))

+		ret = down_interruptible(&timerSemaphore);

+

+	clear_bit(TIMER_SEMA_WAIT_BIT, &timer_sema_flag);

+

+	if(!ret){

+//		printk(KERN_INFO "zx234290_rtc_gettimer:get semaphore success.\n");

+

+		zx234290_rtc_enable(g_rtc->dev.parent, 0);

+		zx234290_rtc_settie(g_rtc->dev.parent, 0);

+		zx234290_rtc_set_second_alarm_int(g_rtc->dev.parent, 1);

+

+		//zx234290_rtc_set_clock_frequency(TIMER_COUNT_1);

+	return 0;

+	}

+    else{

+ //       printk(KERN_INFO "zx234290_rtc_gettimer:get semaphore ret is %d.\n", ret);

+

+        return ret;

+    }

+}

+

+int zx234290_rtc_set_second_timer(int seconds)

+{

+	int mask = 0;

+	unsigned char reg_val=0;

+	//int value = 0;

+

+	mask = ZX234290_BITFMASK(ZX234290_RTC_TIMER_INT_EN_WID, 2);

+	reg_val= ZX234290_BITFVAL(0, 2);

+	zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);

+	zx234290_rtc_set_timercounter(seconds);

+	zx234290_rtc_set_clock_frequency(TIMER_COUNT_1);

+	zx234290_rtc_enable(g_rtc->dev.parent, 1);

+	zx234290_rtc_settie(g_rtc->dev.parent, 1);

+	zx234290_rtc_set_second_alarm_int(g_rtc->dev.parent, 0);

+#if 0

+	zx234290_rtc_read_register(0x01, &value);

+	printk(KERN_INFO "zx234290_rtc_ioctl:0x01 = %x.\n",value);

+	zx234290_rtc_read_register(0x03, &value);

+	printk(KERN_INFO "zx234290_rtc_ioctl:0x03 = %x.\n",value);

+	zx234290_rtc_read_register(0x05, &value);

+	printk(KERN_INFO "zx234290_rtc_ioctl:0x05 = %x.\n",value);

+	zx234290_rtc_read_register(0x30, &value);

+	printk(KERN_INFO "zx234290_rtc_ioctl:0x30 = %x.\n",value);

+	zx234290_rtc_read_register(0x31, &value);

+	printk(KERN_INFO "zx234290_rtc_ioctl:0x31 = %x.\n",value);

+	zx234290_rtc_read_register(0x3E, &value);

+	printk(KERN_INFO "zx234290_rtc_ioctl:0x3E = %x.\n",value);

+	zx234290_rtc_read_register(0x3F, &value);

+	printk(KERN_INFO "zx234290_rtc_ioctl:0x3F = %x.\n",value);

+#endif

+	return 0;

+}

+

+void printf_rtc_log(void)

+{

+    unsigned char value = 0;

+

+    zx234290_rtc_read_register(0x01, &value);

+    printk(KERN_INFO "printf_rtc_log:0x01 = %x.\n",value);

+    zx234290_rtc_read_register(0x03, &value);

+    printk(KERN_INFO "printf_rtc_log:0x03 = %x.\n",value);

+    zx234290_rtc_read_register(0x05, &value);

+    printk(KERN_INFO "printf_rtc_log:0x05 = %x.\n",value);

+    zx234290_rtc_read_register(0x30, &value);

+    printk(KERN_INFO "printf_rtc_log:0x30 = %x.\n",value);

+    zx234290_rtc_read_register(0x31, &value);

+    printk(KERN_INFO "printf_rtc_log:0x31 = %x.\n",value);

+    zx234290_rtc_read_register(0x3E, &value);

+    printk(KERN_INFO "printf_rtc_log:0x3E = %x.\n",value);

+    zx234290_rtc_read_register(0x3F, &value);

+    printk(KERN_INFO "printf_rtc_log:0x3F = %x.\n",value);

+}

+

+static int zx234290_rtc_set_alarm_enable(struct device *dev, unsigned int enabled)

+{

+	int nRet = 0;

+	int  reg_val=0, mask=0;

+

+	mask = ZX234290_BITFMASK(ZX234290_RTC_ALARM_INT_EN_WID, ZX234290_RTC_ALARM_INT_EN_LSH);

+	reg_val= ZX234290_BITFVAL(enabled, ZX234290_RTC_ALARM_INT_EN_LSH);

+

+	nRet = zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);

+

+	mask = ZX234290_BITFMASK(1, 0);

+	reg_val= ZX234290_BITFVAL(0, 0);

+

+	nRet = zx234290_rtc_write_register(0x03, reg_val, mask);

+

+	mask = ZX234290_BITFMASK(2, 2);

+	reg_val= ZX234290_BITFVAL(0, 2);

+

+	nRet = zx234290_rtc_write_register(0x31, reg_val, mask);

+	return 0;

+}

+

+

+int zx234290_rtc_disable_timer_alarm(void)

+{

+	zx234290_rtc_enable(g_rtc->dev.parent, 0);

+	zx234290_rtc_settie(g_rtc->dev.parent, 0);

+	zx234290_rtc_set_alarm_enable(g_rtc->dev.parent, 0);

+	zx234290_rtc_alarm_enable(ALARM_MINUTE,1);

+	zx234290_rtc_alarm_enable(ALARM_HOUR,1);

+	zx234290_rtc_alarm_enable(ALARM_DAY,1);

+	zx234290_rtc_alarm_enable(ALARM_WEEKDAY,1);

+	return 0;

+}

+EXPORT_SYMBOL_GPL(zx234290_rtc_disable_timer_alarm);

+

+/****get value of rtc timer cnt ****/

+unsigned char zx234290_rtc_gettimer_cnt_remain(void)

+{

+	unsigned char timercnt_remain=0;

+	zx234290_rtc_getvalue(ZX234290_REG_ADDR_TIMER_CNT, &timercnt_remain, ZX234290_RTC_TIMER_CNT_WID, ZX234290_RTC_TIMER_CNT_LSH);

+	return timercnt_remain;

+}

+

+

+

+

+static int zx234290_rtc_ioctl(struct device *dev,zx234290_rtc_timer cmd,unsigned long arg)

+{

+    	int err = 0;

+    	unsigned int seconds;

+	unsigned char timercnt_remain = 0;

+	unsigned int seconds_remain = 0;

+	void __user *uarg = (void __user *) arg;

+//	printk(KERN_INFO "zx234290_rtc_ioctl:cmd=%d[%c%c%c%d]arg=%ld.\n",cmd, (cmd>>24)&0xff,(cmd>>16)&0xff,(cmd>>8)&0xff,cmd&0xff,arg);

+    switch(cmd)

+    {

+        case ZX234290_SET_TIMER:

+        {

+		seconds = arg;

+

+		if(seconds){

+			set_bit(TIMER_SEMA_START_BIT, &timer_sema_flag);

+

+			timer_remain =	seconds;

+

+			zx234290_rtc_set_second_timer(min(timer_remain,255));

+			timer_remain -= min(timer_remain,255);

+//			printk(KERN_INFO "ZX234290_SET_TIMER:set timer=%d, remain=%d.\n", seconds,timer_remain);

+		}

+

+            else/* if(seconds == 0)*/{

+//			printk(KERN_INFO "ZX234290_SET_TIMER(seconds == %ld):timerSemaphore=0x%x.\n",seconds,timerSemaphore);

+			zx234290_rtc_enable(g_rtc->dev.parent, 0);

+			zx234290_rtc_settie(g_rtc->dev.parent, 0);

+//			printf_rtc_log();

+                {

+                	if(test_and_clear_bit(TIMER_SEMA_WAIT_BIT, &timer_sema_flag))

+				up(&timerSemaphore);

+                }

+

+               clear_bit(TIMER_SEMA_START_BIT, &timer_sema_flag);

+            }

+

+            seconds = 0;

+            break;

+        }

+        #if 1

+        case ZX234290_GET_TIMER:

+        {

+

+         	if(test_bit(TIMER_SEMA_START_BIT, &timer_sema_flag)){

+				err = zx234290_rtc_gettimer();

+//				printk(KERN_INFO "ZX234290_GET_TIMER.ret=%d\n",err);

+			}

+			//else

+			//	printk(KERN_INFO "ZX234290_GET_TIMER.has not setting timer, return=%d\n",err);

+

+            break;

+        }

+        #endif

+

+        case ZX234290_TIMER_ENABLED:

+        {

+		seconds = arg;

+	//	printk(KERN_INFO "ZX234290_TIMER_ENABLED:cmd=%d,senconds=%d.\n", cmd,seconds);

+		if(seconds == 0) {

+			zx234290_rtc_enable(g_rtc->dev.parent, 0);

+			zx234290_rtc_settie(g_rtc->dev.parent, 0);

+//			printf_rtc_log();

+			if(test_and_clear_bit(TIMER_SEMA_WAIT_BIT, &timer_sema_flag))

+				up(&timerSemaphore);

+

+			clear_bit(TIMER_SEMA_START_BIT, &timer_sema_flag);

+		}

+		break;

+        }

+	case ZX234290_GET_TIMER_REMAIN:

+	{

+		timercnt_remain = zx234290_rtc_gettimer_cnt_remain();

+

+		seconds_remain = timer_remain + timercnt_remain;

+	//	printk(KERN_INFO "ZX234290_GET_TIMER_REMAIN:cmd=%d.remain=%d\n", cmd,seconds_remain);

+		err = put_user(seconds_remain,(unsigned long __user *)uarg);

+		break;

+	}

+	case ZX234290_CYCLE_ENABLE:

+    {

+		seconds = arg;

+	//	printk(KERN_INFO "ZX234290_CYCLE_ENABLE:cmd=%d,enable=%d.\n", cmd,seconds);

+		zx234290_rtc_setuie(g_rtc->dev.parent, seconds);

+		break;

+    }

+    default:

+		err=ENOIOCTLCMD;

+            break;

+    }

+    return err;

+}

+

+static int zx234290_rtc_enable(struct device *dev, int enable)

+{

+	int ret = 0;

+	int  reg_val=0, mask=0;

+

+	reg_val = ZX234290_BITFVAL(enable, ZX234290_RTC_TIMER_EN_LSH);

+	mask = ZX234290_BITFMASK(ZX234290_RTC_TIMER_EN_WID, ZX234290_RTC_TIMER_EN_LSH);

+	ret = zx234290_rtc_write_register(ZX234290_REG_ADDR_TIMER_CTRL, reg_val, mask);

+

+	return ret;

+}

+

+/* ÉèÖÃRTCÄÚ²¿µ¹¼ÆÊ±¶¨Ê±Æ÷,ÓÃÓÚʵÏֹػúºó¶¨Ê±¿ª»ú */

+int zx234290_rtc_settimer(int sec)

+{

+	int mask = 0;

+	unsigned char reg_val=0;

+	//int value = 0;

+

+	mask = ZX234290_BITFMASK(ZX234290_RTC_TIMER_INT_EN_WID, 2);

+	reg_val= ZX234290_BITFVAL(0, 2);

+	zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);

+	zx234290_rtc_set_timercounter(sec);

+	zx234290_rtc_enable(g_rtc->dev.parent, 1);

+	zx234290_rtc_settie(g_rtc->dev.parent, 1);

+	zx234290_rtc_setaie(g_rtc->dev.parent, 0);

+    #if 0

+    zx234290_rtc_read_register(0x30, &value);

+    printk(KERN_INFO "zx234290_rtc_ioctl:0x30 = %x.\n",value);

+    zx234290_rtc_read_register(0x31, &value);

+    printk(KERN_INFO "zx234290_rtc_ioctl:0x31 = %x.\n",value);

+    zx234290_rtc_read_register(0x3E, &value);

+    printk(KERN_INFO "zx234290_rtc_ioctl:0x3E = %x.\n",value);

+    zx234290_rtc_read_register(0x3F, &value);

+    printk(KERN_INFO "zx234290_rtc_ioctl:0x3F = %x.\n",value);

+	//printk("zx234290_rtc_settimer is called! \n");

+    #endif

+    return 0;

+}

+EXPORT_SYMBOL_GPL(zx234290_rtc_settimer);

+

+#endif

+

+static const struct rtc_class_ops zx234290_rtcops = {

+	.read_time	= zx234290_rtc_gettime,

+	.set_time	= zx234290_rtc_settime,

+	.read_alarm	= zx234290_rtc_getalarm,

+	.set_alarm	= zx234290_rtc_setalarm,

+	.alarm_irq_enable = zx234290_rtc_setaie,

+	.ioctl = zx234290_rtc_ioctl,

+};

+

+static int zx234290_rtc_probe(struct platform_device *pdev)

+{

+	struct rtc_device *rtc;

+	struct rtc_time rtc_tm;

+	int ret;

+	g_rtcdev = pdev;

+	zx234290_rtc.zx234290 = dev_get_drvdata(pdev->dev.parent);

+	if(NULL==zx234290_rtc.zx234290)

+		return -EINVAL;

+	

+	zx234290_rtc_set_timercounter(128);

+	zx234290_rtc_set_clock_frequency(TIMER_COUNT_1);

+	device_init_wakeup(&pdev->dev, 1);

+

+	rtc = devm_rtc_allocate_device(&pdev->dev);

+	

+	if (IS_ERR(rtc))

+		return PTR_ERR(rtc);

+

+	rtc->ops = &zx234290_rtcops;

+

+	ret = rtc_register_device(rtc);

+	if (ret)

+		return ret;

+	

+	g_rtc = rtc;

+	zx234290_rtc_gettime(NULL, &rtc_tm); /* Check RTC Time */

+	tempTime = rtc_tm;

+	if (rtc_valid_tm(&rtc_tm) < 0)

+	{

+		rtc_tm.tm_year	= 100;

+		rtc_tm.tm_mon	= 0;

+		rtc_tm.tm_mday	= 1;

+		rtc_tm.tm_hour	= 0;

+		rtc_tm.tm_min	= 0;

+		rtc_tm.tm_sec	= 0;

+		rtc_tm.tm_wday= 6;

+		zx234290_rtc_settime(NULL, &rtc_tm);

+		dev_warn(&pdev->dev, "warning: invalid RTC value so initializing it\n");

+	}

+	else

+	{

+	    rtc_tm = rtc_ktime_to_tm(rtc_tm_to_ktime(rtc_tm));

+		zx234290_rtc_settime(NULL, &rtc_tm);

+	}

+	rtc->max_user_freq = 64; //32768;//32k clock

+	platform_set_drvdata(pdev, rtc);

+	ret = zx234290_rtc_request_irq(pdev, rtc);

+	if (ret)

+	{

+		dev_err(&pdev->dev, "IRQ request error!\n");

+		goto err_irq;

+	}

+	zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL1, 0, 0xff);

+	zx234290_rtc_setuie(&pdev->dev, 0);

+	zx234290_rtc_enable(&pdev->dev, 0);

+	sema_init(&timerSemaphore,0);

+    //zx234290_rtc_ioctl(NULL,ZX234290_SET_TIMER,20);

+	return 0;

+ err_irq:

+ 	platform_set_drvdata(pdev, NULL);

+	return ret;

+}

+static int  zx234290_rtc_remove(struct platform_device *pdev)

+{

+	struct rtc_device *rtc = platform_get_drvdata(pdev);

+

+	platform_set_drvdata(pdev, NULL);

+	//rtc_device_unregister(rtc);

+	zx234290_rtc_setuie(&pdev->dev, 0);

+	zx234290_rtc.zx234290 = NULL;

+

+	return 0;

+}

+static int  zx234290_rtc_resume(struct platform_device *pdev)

+{

+	//int irq=0;

+	//zx234290_rtc_setuie(&pdev->dev, 1);

+

+	return 0;

+}

+static int zx234290_rtc_suspend(struct platform_device *pdev, pm_message_t state)

+{

+	//int irq=0;

+	//zx234290_rtc_setuie(&pdev->dev, 0);

+

+	return 0;

+}

+

+

+static struct platform_driver zx234290_rtc_driver =

+{

+	.probe		= zx234290_rtc_probe,

+	.remove		= zx234290_rtc_remove,

+	.suspend	= zx234290_rtc_suspend,

+	.resume		= zx234290_rtc_resume,

+	.driver		= {

+		.name	= "zx234290-rtc",

+		.owner	= THIS_MODULE,

+	},

+};

+

+module_platform_driver(zx234290_rtc_driver);

+

+MODULE_DESCRIPTION("ZX234290 RTC Driver");

+MODULE_AUTHOR("yuxiang");

+MODULE_LICENSE("GPL");

+MODULE_ALIAS("platform:zx234290-rtc");

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/rtc/zx234290-rtc.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/rtc/zx234290-rtc.h
new file mode 100755
index 0000000..3233c6e
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/rtc/zx234290-rtc.h
@@ -0,0 +1,127 @@
+#ifndef __ZX234290_RTC_H

+#define __ZX234290_RTC_H

+

+//typedef unsigned char UINT8;

+//typedef int UINT16;

+

+//#define ZX234290_RTC_IRQ            81 //  49+32

+

+#define ZX234290_RTC_ONE_HOUR_INT_MASK_LSH              (4)

+#define ZX234290_RTC_ONE_HOUR_INT_MASK_WID              (1)

+

+#define ZX234290_RTC_ONE_MINUTE_INT_MASK_LSH            (3)

+#define ZX234290_RTC_ONE_MINUTE_INT_MASK_WID            (1)

+

+#define ZX234290_RTC_ALARM_INT_MASK_LSH                 (0)

+#define ZX234290_RTC_ALARM_INT_MASK_WID                 (1)

+

+

+#define ZX234290_RTC_ALARM_INT_EN_LSH                   (1)

+#define ZX234290_RTC_ALARM_INT_EN_WID                   (1)

+

+#define ZX234290_RTC_TIMER_INT_EN_LSH                   (0)

+#define ZX234290_RTC_TIMER_INT_EN_WID                   (1)

+

+

+/*RTC TIME SECONDS MIN HOU DAY MON YEAR WEEKDAY*/

+#define ZX234290_RTC_TIME_SECONDS_LSH                   (0)

+#define ZX234290_RTC_TIME_SECONDS_WID                   (7)

+

+#define ZX234290_RTC_TIME_MINUTES_LSH                   (0)

+#define ZX234290_RTC_TIME_MINUTES_WID                   (7)

+

+#define ZX234290_RTC_TIME_HOURS_LSH             (0)

+#define ZX234290_RTC_TIME_HOURS_WID             (6)

+

+#define ZX234290_RTC_TIME_DAYS_LSH              (0)

+#define ZX234290_RTC_TIME_DAYS_WID              (6)

+

+#define ZX234290_RTC_TIME_MONTHS_LSH            (0)

+#define ZX234290_RTC_TIME_MONTHS_WID            (5)

+#define ZX234290_RTC_TIME_CENTURY_LSH           (7)

+#define ZX234290_RTC_TIME_CENTURY_WID           (1)

+

+#define ZX234290_RTC_TIME_YEAR_LSH              (0)

+#define ZX234290_RTC_TIME_YEAR_WID              (8)

+

+#define ZX234290_RTC_TIME_WEEKDAY_LSH           (0)

+#define ZX234290_RTC_TIME_WEEKDAY_WID           (3)

+

+/*RTC ALARM  MIN HOU DAY  WEEKDAY*/

+#define ZX234290_RTC_AlARM_MINUTES_LSH          (0)

+#define ZX234290_RTC_AlARM_MINUTES_WID          (7)

+

+#define ZX234290_RTC_AlARM_HOURS_LSH            (0)

+#define ZX234290_RTC_AlARM_HOURS_WID            (6)

+

+#define ZX234290_RTC_AlARM_DAYS_LSH             (0)

+#define ZX234290_RTC_AlARM_DAYS_WID             (6)

+

+#define ZX234290_RTC_AlARM_WEEKDAY_LSH          (0)

+#define ZX234290_RTC_AlARM_WEEKDAY_WID          (3)

+

+#define ZX234290_RTC_AlARM_SECOND_LSH           (0)

+#define ZX234290_RTC_AlARM_SECOND_WID           (7)

+

+/*RTC ALARM1 IGNORE*/

+#define ZX234290_RTC_AlARM1_SECONDSIGNORE_LSH           (7)

+#define ZX234290_RTC_AlARM1_SECONDSIGNORE_WID           (1)

+

+#define ZX234290_RTC_AlARM1_MINUTESIGNORE_LSH           (7)

+#define ZX234290_RTC_AlARM1_MINUTESIGNORE_WID           (1)

+

+#define ZX234290_RTC_AlARM1_HOURSIGNORE_LSH             (7)

+#define ZX234290_RTC_AlARM1_HOURSIGNORE_WID             (1)

+

+#define ZX234290_RTC_AlARM1_DAYSIGNORE_LSH              (7)

+#define ZX234290_RTC_AlARM1_DAYSIGNORE_WID              (1)

+

+#define ZX234290_RTC_AlARM1_MONTHSIGNORE_LSH            (7)

+#define ZX234290_RTC_AlARM1_MONTHSIGNORE_WID            (1)

+

+#define ZX234290_RTC_AlARM1_YEARIGNORE_LSH              (7)

+#define ZX234290_RTC_AlARM1_YEARIGNORE_WID              (1)

+

+#define ZX234290_RTC_AlARM1_WEEKDAYIGNORE_LSH           (7)

+#define ZX234290_RTC_AlARM1_WEEKDAYIGNORE_WID           (1)

+

+#define ZX234290_RTC_ALARM_AF_LSH                       (3)

+#define ZX234290_RTC_ALARM_AF_WID                       (1)

+/*RTC ALARM Enable*/

+#define ZX234290_RTC_AlARM_ACTIVATED_LSH                (7)

+#define ZX234290_RTC_AlARM_ACTIVATED_WID                (1)

+

+/* RTC TIMER ENABLE */

+#define ZX234290_RTC_TIMER_EN_LSH               (7)

+#define ZX234290_RTC_TIMER_EN_WID               (1)

+

+#define ZX234290_RTC_TIMER_TD_LSH               (0)

+#define ZX234290_RTC_TIMER_TD_WID               (2)

+

+#define ZX234290_RTC_TIMER_CNT_LSH              (0)

+#define ZX234290_RTC_TIMER_CNT_WID              (8)

+

+/*RTC UNLOCK*/

+

+#define ZX234290_RTC_UNLOCK_LSH                 (2)

+#define ZX234290_RTC_UNLOCK_WID                 (1)

+

+#define ZX234290_RTC_DATALATCH_LSH              (3)

+#define ZX234290_RTC_DATALATCH_WID              (1)

+

+#define ZX234290_MONITOR_FLA_LSH                (0)

+#define ZX234290_MONITOR_FLA_WID                (1)

+

+/*reg 0x31*/

+#define ZX234290_RTC_TIE_LSH                    (0)

+#define ZX234290_RTC_TIE_WID                    (1)

+

+#define ZX234290_RTC_AIE_LSH                    (1)

+#define ZX234290_RTC_AIE_WID                    (1)

+

+#define ZX234290_RTC_TF_LSH                     (2)

+#define ZX234290_RTC_TF_WID                     (1)

+

+#define ZX234290_RTC_AF_LSH                     (3)

+#define ZX234290_RTC_AF_WID                     (1)

+#endif

diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/pcu/pcu-common.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/pcu/pcu-common.h
old mode 100644
new mode 100755
index ebe0c66..40c7fdf
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/pcu/pcu-common.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/pcu/pcu-common.h
@@ -42,6 +42,8 @@
 int	pcu_clr_irq_pending(unsigned int gic_index);

 int	pcu_set_irq_wake(unsigned int gic_index, bool enable);

 unsigned int pcu_get_wl_index_by_gic(unsigned int gic_index);

+void pcu_int_set_type(unsigned int pcu_index, unsigned int type);

+void pcu_int_clear(unsigned int pcu_index);

 #else

 static inline int pcu_set_irq_type(unsigned int gic_index, unsigned int type)

 {

@@ -63,6 +65,10 @@
 	return 0;

 }

 

+static inline void pcu_int_set_type(unsigned int pcu_index, unsigned int type){}

+

+static inline void pcu_int_clear(unsigned int pcu_index){}

+

 #endif

 

 #endif /* _PCU_COMMON_H */

diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/pcu/pcu-zx297520v3.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/pcu/pcu-zx297520v3.c
index cac6ac9..d2692ba 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/pcu/pcu-zx297520v3.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/pcu/pcu-zx297520v3.c
@@ -817,6 +817,8 @@
 		PCU_LOCK
    		zx_write_reg(pcu_dev.top_reg_base+0x128, 0x1);
 		PCU_UNLOCK
+
+		pcu_int_clear(pcu_index);
 	}
 }
 
@@ -824,19 +826,27 @@
 static void ext8in1_irq_sync_unlock(struct irq_data *data){}
 static void ext8in1_irq_mask(struct irq_data *data){}
 static void ext8in1_irq_unmask(struct irq_data *data){}
-static void ext8in1_irq_eoi(struct irq_data *data)
+static int ext8in1_irq_set_type(struct irq_data *data, unsigned int type)
 {
+	if (!data)
+		return -EINVAL;
+
+	pcu_int_set_type(data->hwirq + PCU_EX8_INT, type);
+
 	pcu_int_clear_8in1(data->hwirq + PCU_EX8_INT);
+
+	return 0;
 }
 
 static struct irq_chip ext8in1_irq_chip =
 {
     .name           		= "ext8in1",
+
+	.irq_set_type			= ext8in1_irq_set_type,
 	.irq_mask				= ext8in1_irq_mask,
 	.irq_unmask				= ext8in1_irq_unmask,
 	.irq_bus_lock			= ext8in1_irq_lock,
 	.irq_bus_sync_unlock	= ext8in1_irq_sync_unlock,
-	.irq_eoi				= ext8in1_irq_eoi,
 };
 
 static void ext8in1_handle_irq(struct irq_desc *desc)
@@ -844,15 +854,25 @@
 	struct ext8in1_info *data = irq_desc_get_handler_data(desc);
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	int virq;
-	int hwirq;
+	int hwirq, new_hwirq;
 
 	chained_irq_enter(chip, desc);
    
     hwirq = pcu_get_8in1_int_source();
 
-	virq = irq_find_mapping(data->domain, hwirq);
-	if (virq > 0)
-		generic_handle_irq(virq);
+	while(1) {
+		pcu_int_clear_8in1(hwirq + PCU_EX8_INT);
+
+		virq = irq_find_mapping(data->domain, hwirq);
+		if (virq > 0)
+			generic_handle_irq(virq);
+
+		new_hwirq = pcu_get_8in1_int_source();
+        if (hwirq == new_hwirq)
+            break;
+        else
+            hwirq = new_hwirq;
+	}
 
 	chained_irq_exit(chip, desc);
 }
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/plat/plat-zx297520v3.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/plat/plat-zx297520v3.c
old mode 100644
new mode 100755
index 53c792b..b3e3b7c
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/plat/plat-zx297520v3.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/plat/plat-zx297520v3.c
@@ -1307,7 +1307,7 @@
 };
 
 /*-------------------------------------------------------------------*/
-#define ZX_IRQ_MINOR			(236)
+#define ZX_IRQ_MINOR			(237)
 #define SC_LIBIRQ_MAX			(8)
 
 /*
@@ -1630,7 +1630,7 @@
 		}
 	}
 
-	np = of_find_compatible_node(NULL, NULL, "zte,zx298501-pcu");
+	np = of_find_compatible_node(NULL, NULL, "zte,zx297520v3-pcu");
 	if (NULL == np)	{
 		pr_err("Can't find interrupt-controller \n");
 		return -ENODEV;
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/rpmsg/zx29_icp.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/rpmsg/zx29_icp.c
old mode 100644
new mode 100755
index 9c46a98..8b2fc4f
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/rpmsg/zx29_icp.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/rpmsg/zx29_icp.c
@@ -384,6 +384,8 @@
 		return ret;
 	}
 
+	enable_irq_wake(irq);
+
 	icpdev_register_ops(&zx29_icp_ops);
 
 	rpmsgInit(CORE_M0, np);
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/spinlock/spinlock-zx297520v3.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/spinlock/spinlock-zx297520v3.c
old mode 100644
new mode 100755
index 99d3fb7..7843e46
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/spinlock/spinlock-zx297520v3.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/soc/sc/spinlock/spinlock-zx297520v3.c
@@ -53,7 +53,7 @@
 

 #define zspinlock_assert(_EXP) BUG_ON(!_EXP)//ZDRV_ASSERT(_EXP)

 static DEFINE_MUTEX(zspinlock_mutex);

-static unsigned long s_hwSpinlockMsr;

+static unsigned long s_hwSpinlockMsr[HWLOCK_NUM];

 /****************************************************************************

 * 	                                        Types

 ****************************************************************************/

@@ -97,7 +97,7 @@
    unsigned long tmp;

    unsigned long msr;

    local_irq_save(msr);

-   s_hwSpinlockMsr = msr;

+   s_hwSpinlockMsr[hwid] = msr;

 

    while(ioread32(hwlock_regs[hwid])&0x1);

    tmp = ioread32(hwlock_regs[hwid]);

@@ -131,7 +131,7 @@
 	 tmp &= 0x00fffffe;

 	 iowrite32(tmp, hwlock_regs[hwid]);

 

-	 local_irq_restore(s_hwSpinlockMsr);

+	 local_irq_restore(s_hwSpinlockMsr[hwid]);

 }

 /*******************************************************************************

  * Function: hw_spin_lock

diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/tty/serial/zx29_uart.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/tty/serial/zx29_uart.c
index 216bc1f..f199d9c 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/tty/serial/zx29_uart.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/tty/serial/zx29_uart.c
@@ -1901,10 +1901,10 @@
 	}
 
  	if(fifo_len){
-		printk("qq >> fifo len %d.\n",fifo_len);
+		//printk("qq >> fifo len %d.\n",fifo_len);
 		fifo_count = tty_insert_flip_string(&zup->port.state->port,
 						   fifo_buf, fifo_len);
-		printk("qq >>fifo count %d,buf is %x %x %x .\n",fifo_count, fifo_buf[0],fifo_buf[1],fifo_buf[2]);
+		//printk("qq >>fifo count %d,buf is %x %x %x .\n",fifo_count, fifo_buf[0],fifo_buf[1],fifo_buf[2]);
 		fifo_buf[0] = '\0';
 		fifo_buf[1] = '\0';
 		fifo_buf[2] = '\0';
@@ -3021,6 +3021,8 @@
 	UART_PUT_FBRD(port, fbrd);
 	UART_PUT_IBRD(port, ibrd);
 	
+printk("-------zx29_uart_set_termios,line:%d, new baud:%d, uartclk:%d,ibrd:%d, fbrd:%d \n", port->line,
+	baud, port->uartclk, ibrd, fbrd);
 
 	switch (termios->c_cflag & CSIZE) {
 	case CS5:
@@ -3256,7 +3258,10 @@
 		ret = PTR_ERR(zx29_port->wclk);
 		printk("failed to get zx29_port->wclk: %d\n", ret);
 		return ret;
-	}	
+	}
+	if(offset == 0){
+	clk_set_rate(zx29_port->wclk, 104 * 1000000);
+	}
 	port->line = offset;
 	port->type = PORT_ZX29;
 	port->fifosize = UART_TXFIFO_SIZE;
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/usb/gadget/function/adb_client.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/usb/gadget/function/adb_client.c
old mode 100644
new mode 100755
index 2a11bde..d9452b1
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/usb/gadget/function/adb_client.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/usb/gadget/function/adb_client.c
@@ -42,6 +42,7 @@
 static const char adb_shortname[] = "android_adb";
 
 typedef struct __adb_debug{
+	int adb_step;
 	int adb_flag;
 	int adb_lenth;
 	int adb_state;
@@ -49,7 +50,7 @@
 }adb_debug;
 adb_debug g_adb_dbg[512] = {0};
 int g_adb_dbg_cnt = 0;
-void adb_debug_static(int rd_wr, int length)
+void adb_debug_static(int step, int rd_wr, int length)
 {
 	g_adb_dbg[g_adb_dbg_cnt].adb_flag = rd_wr;
 	g_adb_dbg[g_adb_dbg_cnt].adb_lenth = length;
@@ -117,6 +118,7 @@
 
 	kobject_uevent(&dev->misc_dev->kobj, KOBJ_ONLINE);
 
+		adb_debug_static(10, 0, 0);
 	printk("[%s-%d]:end\n",__func__,__LINE__);
 }
 
@@ -130,6 +132,7 @@
     }
 	kobject_uevent(&dev->misc_dev->kobj, KOBJ_OFFLINE);
 
+		adb_debug_static(11, 0, 0);
 	printk("[%s-%d]:end\n",__func__,__LINE__);
 }
 
@@ -171,7 +174,7 @@
 	if(dev == NULL)
 		return;
 	if(dev->adb_ws){
-		__pm_wakeup_event(dev->adb_ws, 1000);
+		__pm_wakeup_event(dev->adb_ws, 5000);
 	}
 	
 	if (len==0){
@@ -187,13 +190,13 @@
 	tmp = (len >= 32) ? 32 : len;
 
 #if 0	
-	printk("\n");
+	printk("\nadb_recv_from_ps,len:%d, print len:%d\n", len, tmp);
 	for(i = 0; i < tmp; i++){
 		printk(" %x", dev->read_buf[i]);
 		if((i % 16) == 0)
 			printk("\n");
 	}
-	printk("\n");
+	printk("\nadb_recv_from_ps, print end\n");
 #endif	
 	dev->rx_len = len;
 	dev->rx_done = 1;	
@@ -240,6 +243,7 @@
         goto exit ;
 	}
 
+	adb_debug_static(4, 1, 0);
 	/* we will block until we're online */
 	while (!(dev->online || dev->error)) {
 		//printk("adb_read: waiting for online state\n");
@@ -280,6 +284,7 @@
 		if (ret < 0) {
 			if (ret != -ERESTARTSYS)
 				dev->error = 1;
+				adb_debug_static(6, 1, 0);
 			printk("adb_read stop ret: %d", ret);
 			goto done;
 		}
@@ -333,7 +338,8 @@
     atomic_dec(&g_adb_dev.read_cnt);
 exit_done:
 
-	//printk("adb_read returning %d\n", ret);
+	adb_debug_static(5, 1, ret);
+	//printk("adb_read need:%d, returning %d\n", count, ret);
 	return ret;
 }
 
@@ -420,6 +426,8 @@
 
 		transfer_cnt = count;
 		//printk("-------------adb_write enter, len:%d \n", count);
+
+	adb_debug_static(2, 2, transfer_cnt);		
 	if(!atomic_read(&g_adb_dev.inst_cnt))
 	{
         printk("[ %s-%d]:adb device has been removed\n",__func__, __LINE__);
@@ -486,6 +494,7 @@
 		if (ret < 0) {
 			pr_debug("adb_write: xfer error %d\n", ret);
 			dev->error = 1;
+			adb_debug_static(12, 2, 0);
 			ret = -EIO;
 			break;
 		}
@@ -496,7 +505,7 @@
 	}
 
     ret = ( transfer_cnt==0 ) ?  count: ret ;
-	adb_debug_static(1, count);
+	adb_debug_static(3, 2, count);
 done:
 	adb_unlock(&dev->write_excl);
 exit:
@@ -513,6 +522,7 @@
 	//pr_info("adb_open\n");
     printk("[%s-%d]:enter \n",__func__, __LINE__);
 	
+	adb_debug_static(0, 0, 0);
     if(mutex_trylock(&g_adb_dev.exclude_lock) == 0)
     {
         printk("[ %s-%d] \n",__func__, __LINE__);
@@ -569,7 +579,8 @@
 	//pr_info("adb_release\n");
     printk("[ %s-%d]:enter \n",__func__, __LINE__);
 	//adb_closed_callback();
-	
+
+	adb_debug_static(1, 0, 0);	
     if(mutex_trylock(&g_adb_dev.exclude_lock) == 0)
     {
         printk("[ %s-%d] \n",__func__, __LINE__);
@@ -671,9 +682,11 @@
 		if(atomic_read(&g_adb_dev.adb_dev->open_excl) == 0){
 			printk("schedule_inform_work send online\n");
 			schedule_work(&g_adb_dev.adb_dev->online_inform_work);
+		adb_debug_static(7, 0, 0);
 		}else
 			printk("schedule_inform_work adb already online\n");
 		g_adb_dev.adb_state = 1;
+		adb_debug_static(8, 0, 0);
 		return;
 	}	
 	printk("schedule_inform_work notify adb offline\n");
@@ -682,6 +695,7 @@
 	g_adb_dev.adb_state = 0;
 	wake_up(&g_adb_dev.adb_dev->read_wq);
 	schedule_work(&g_adb_dev.adb_dev->offline_inform_work);	
+		adb_debug_static(9, 0, 0);
 }
 EXPORT_SYMBOL_GPL(adb_schedule_inform_work);
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/fs/open.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/fs/open.c
old mode 100644
new mode 100755
index 3aaaad4..2e7f988
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/fs/open.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/fs/open.c
@@ -35,6 +35,10 @@
 
 #include "internal.h"
 
+#ifdef CONFIG_SYSVIPC_CROSS_SHM
+#include <../ipc/shm_ctrl.h>
+#endif
+
 int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
 	struct file *filp)
 {
@@ -1167,7 +1171,9 @@
 	struct open_flags op;
 	int fd = build_open_flags(how, &op);
 	struct filename *tmp;
-
+#ifdef CONFIG_SYSVIPC_CROSS_SHM
+	char *ptr = NULL;
+#endif	
 	if (fd)
 		return fd;
 
@@ -1184,6 +1190,16 @@
 		} else {
 			fsnotify_open(f);
 			fd_install(fd, f);
+#ifdef CONFIG_SYSVIPC_CROSS_SHM
+			ptr = strrchr(tmp->name, '/');
+			if (ptr)
+			{
+				if (strncmp(ptr + 1, "remote-", strlen("remote-"))== 0)
+				{
+					f->shm_flags =  SHM_REMOTE_POSIX_YES;
+				}
+			}
+#endif			
 		}
 	}
 	putname(tmp);
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/fs.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/fs.h
old mode 100644
new mode 100755
index df54acd..e953d1e
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/fs.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/fs.h
@@ -952,6 +952,9 @@
 	struct address_space	*f_mapping;
 	errseq_t		f_wb_err;
 	errseq_t		f_sb_err; /* for syncfs */
+#ifdef CONFIG_SYSVIPC_CROSS_SHM
+	unsigned int 	shm_flags;
+#endif
 } __randomize_layout
   __attribute__((aligned(4)));	/* lest something weird decides that 2 is OK */
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/mfd/zx234290.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/mfd/zx234290.h
old mode 100644
new mode 100755
index 79333cc..ea89815
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/mfd/zx234290.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/mfd/zx234290.h
@@ -391,6 +391,7 @@
 	struct mutex irq_lock;
 	int chip_irq;
 	int irq_base;
+	struct irq_domain * irq_domain;
 	int irq_num;
 	unsigned int irq_mask;
 };
@@ -399,6 +400,8 @@
 int zx234290_i2c_read_simple_PSM(u8 reg, void *dest);
 int zx234290_i2c_write_simple_PSM(u8 reg, void *src);
 
+int zx234290_reg_read(struct zx234290 *zx234290, u8 reg);
+int zx234290_reg_write(struct zx234290 *zx234290, u8 reg, u8 val);
 int zx234290_device_init(struct zx234290 *zx234290);
 void zx234290_device_exit(struct zx234290 *zx234290);
 
@@ -970,8 +973,63 @@
     LDOLIST_MAX
 }T_ZDrvZx234290_LdoList;
 
+typedef enum _T_ZDrvZx234297_SINK
+{
+    ZX234297_SINK1 = 0,   /* 00 */
+    ZX234297_SINK2 = 1,   /* 10 */
+
+    ZX234297_SINK_MAX
+}T_ZDrvZx234297_SINK;
+
+typedef enum _T_ZDrvZx234297_SINK_SLPMODE
+{
+    SLPMODE_NORMAL = 0,   /* 00 */
+    SLPMODE_SHUTDOWN = 1,   /* 10 */
+
+    SLPMODE_MAX
+}T_ZDrvZx234297_SINK_SLPMODE;
+
+typedef enum _T_ZDrvZx234297_SINK_CURRENT
+{
+	SINK_CURRENT_5MA,
+	SINK_CURRENT_10MA,
+	SINK_CURRENT_15MA,
+	SINK_CURRENT_20MA,
+	SINK_CURRENT_30MA,
+	SINK_CURRENT_40MA,
+	SINK_CURRENT_50MA,
+	SINK_CURRENT_60MA,
+	SINK_CURRENT_70MA,
+	SINK_CURRENT_80MA,
+	SINK_CURRENT_90MA,
+	SINK_CURRENT_100MA,
+	SINK_CURRENT_110MA,
+	SINK_CURRENT_120MA,
+
+    SINK_CURRENT_MAX
+}T_ZDrvZx234297_SINK_CURRENT;
+
+typedef enum _T_ZDrvZx234290_ResetType
+{
+#if 0
+	ZX234290_USER_RST_UNDEFINE	= 0,
+	ZX234290_USER_RST_TO_NORMAL = 1,
+	ZX234290_USER_RST_TO_CHARGER = 2,
+	ZX234290_USER_RST_TO_ALARM = 3,
+#else
+	ZX234290_USER_RST_UNDEFINE	= 3,
+	ZX234290_USER_RST_TO_NORMAL = 0,
+	ZX234290_USER_RST_TO_CHARGER = 1,
+	ZX234290_USER_RST_TO_ALARM = 2,
+#endif
+	ZX234290_USER_RST_TO_EXCEPT = 4,
+
+	ZX234290_USER_RST_MAX
+}T_ZDrvZx234290_ResetType;
+
 
 int zx234290_get_chip_version(void);
+int zx234290_irq_init(struct zx234290 *zx234290);
 
 int zx234290_set_buck1_onoff(T_ZDrvZx234290_LDO_ENABLE status);
 T_ZDrvZx234290_LDO_ENABLE zx234290_get_buck1_onoff(void);
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/net.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/net.h
old mode 100644
new mode 100755
index 0dcd51f..c15a3b7
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/net.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/net.h
@@ -121,6 +121,10 @@
 	unsigned long		flags;
 
 	struct file		*file;
+#ifdef CONFIG_IPC_SOCKET
+	int fd;
+	struct hlist_head peer;
+#endif
 	struct sock		*sk;
 	const struct proto_ops	*ops;
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/pinctrl/consumer.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/pinctrl/consumer.h
old mode 100644
new mode 100755
index 019fecd..0489f29
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/pinctrl/consumer.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/pinctrl/consumer.h
@@ -30,6 +30,7 @@
 extern int pinctrl_gpio_direction_input(unsigned gpio);
 extern int pinctrl_gpio_direction_output(unsigned gpio);
 extern int pinctrl_gpio_set_config(unsigned gpio, unsigned long config);
+extern int pinctrl_gpio_get_config(unsigned gpio, unsigned long *config);
 
 extern struct pinctrl * __must_check pinctrl_get(struct device *dev);
 extern void pinctrl_put(struct pinctrl *p);
@@ -92,6 +93,11 @@
 	return 0;
 }
 
+static inline int pinctrl_gpio_get_config(unsigned gpio, unsigned long *config)
+{
+	return 0;
+}
+
 static inline struct pinctrl * __must_check pinctrl_get(struct device *dev)
 {
 	return NULL;
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/socket_rpmsg.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/socket_rpmsg.h
new file mode 100755
index 0000000..74a62a0
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/linux/socket_rpmsg.h
@@ -0,0 +1,226 @@
+#ifndef SOCKET_RPMSG_H

+#define SOCKET_RPMSG_H

+

+#include <linux/interrupt.h>

+#include <linux/kthread.h>

+#include <linux/spinlock.h>

+#include <linux/semaphore.h>

+#include <linux/netdevice.h>

+#include <linux/skbuff.h>

+#include <uapi/linux/un.h>

+#include <linux/soc/zte/rpmsg.h>

+#include <net/sock.h>

+

+extern int socket_rpmsg_debug;

+

+#define sk_soc_dbg(format, arg...) if(socket_rpmsg_debug == 1) \

+	printk(KERN_DEBUG "[socket_rpmsg]<%s>: " format "\n" ,__func__ , ## arg)

+#define sk_soc_info(format, arg...) if(socket_rpmsg_debug == 1) \

+	printk(KERN_INFO "[socket_rpmsg]<%s>: " format "\n" ,__func__ , ## arg)

+

+

+#define sk_soc_err(format, arg...) printk(KERN_ERR "[socket_rpmsg]<%s>: " format "\n" , \

+	__func__ , ## arg)

+

+#define sk_soc_warn(format, arg...) printk(KERN_WARNING "[socket_rpmsg]<%s>: " format "\n" , \

+	__func__ , ## arg)

+

+#define	 ICP_CHANNEL_SIZE 	(16 * 1024)

+

+/*remote data ,to local,read from rpmsg channel*/

+#define DIR_UPLINK		1

+

+/*local data ,to remote,need write rpmsg channel*/

+#define DIR_DOWNLINK	2

+

+#define sockSocCreateChannel rpmsgCreateChannel

+#define sockSocWrite         rpmsgWrite

+#define sockSocRead          rpmsgRead

+

+#define SOCK_OP_RESULT		0

+

+extern spinlock_t sock_table_lock;

+extern spinlock_t sock_rpmsg_table_lock;

+extern spinlock_t sock_socket_table_lock;

+extern spinlock_t sock_release_table_lock;

+extern spinlock_t sock_release_lock;

+extern spinlock_t  sock_release_peer_lock;

+typedef enum _soc_msg_type

+{

+	MSG_TYPE_FIND = 0,      //0

+	MSG_TYPE_FIND_RESULT,   //1

+	MSG_TYPE_ADD_WAIT_QUEUE, //2

+	MSG_TYPE_REMOVE_WAIT_QUEUE, //3

+	MSG_TYPE_SYNC_IPC_SOCKET, //4

+	MSG_TYPE_WAIT_FOR_PEER, //5

+	MSG_TYPE_DATA_READY, //6

+	MSG_TYPE_SEND_MSG, //7

+	MSG_TYPE_SET_PEER, //8

+	MSG_TYPE_UPDATE_PEER, //9

+	MSG_TYPE_SOCK_PUT, //10

+	MSG_TYPE_ADD_SKB_QUEUE_TAIL, //11

+	MSG_TYPE_RECVQ_FULL, //12

+	MSG_TYPE_RECVQ_FULL_RESULT, //13

+	MSG_TYPE_RECVQ_FULL_LOCKLESS_AND_DEAD, //14

+	MSG_TYPE_RECVQ_FULL_LOCKLESS_AND_DEAD_RESULT, //15

+	MSG_TYPE_PEER_CLEAR, //16

+	MSG_TYPE_WAKE_UP_INTERRUPTIBLE_POLL, //17

+	MSG_TYPE_TEST_FLAG, //18

+	MSG_TYPE_TEST_FLAG_RESULT, //19

+	MSG_TYPE_GET_SOCKET_STATES, //20

+	MSG_TYPE_GET_SOCKET_STATES_RESULT, //21

+	MSG_TYPE_STREAM_CONNECT, //22

+	MSG_TYPE_SOCKET_RELEASE, //23

+	MSG_TYPE_DGRAM_DISCONNECTED, //24

+	MSG_TYPE_STATE_LOCK, //25

+	MSG_TYPE_STATE_UNLOCK, //26

+	MSG_TYPE_SOCK_HOLD,

+	MSG_TYPE_RELEASE_PEER,

+	MSG_TYPE_NOTIFY_PROXY_CHANGE,

+}soc_msg_type;

+

+struct sock_thread_info {

+	struct task_struct *p_thread;	

+	struct list_head	p_sock_list;

+	struct spinlock 	p_sock_lock;

+	struct semaphore 	p_sock_sem;

+

+	int bstop;

+};

+

+struct sock_channel {

+    T_RpMsg_CoreID core_id;

+    T_RpMsg_ChID channel_id;

+    unsigned int channel_size;

+    //struct task_struct *rcv_thread;

+	//struct task_struct *main_thread;

+	struct sock_thread_info recv_thread_info;

+	struct sock_thread_info main_thread_info;

+};

+

+struct sock_elem_flag {

+	int sk_err;

+	int sk_error_report;

+	int skstate;

+	u8 skshutdown;

+};

+

+struct	sock_rpmsg

+{

+	struct list_head list;

+	soc_msg_type msg_type;

+	uint32_t dir;

+	struct sockaddr_un sockaddr;

+	int addr_len;

+	int socktype; 

+	unsigned int hash;

+	struct sock_elem_flag elem;

+	//struct sock sock;	

+	int clientfd;

+	int serverfd;

+	int clientproxyfd;

+	int serverproxyfd;

+	int newclientfd;

+	void* clientsock; //ÀàÐÍΪstruct socket

+	void* serversock; //ÀàÐÍΪstruct socket

+	void* newsock;

+	void* clientproxysock; //ÀàÐÍΪstruct socket

+	void* serverproxysock; //ÀàÐÍΪstruct socket

+	int result;

+	enum sock_flags flag;

+	unsigned long flags;

+	long timeo;

+	unsigned int  msg_flags;

+	int isfistfind;

+	void* key;

+	unsigned int index;

+	int data_len;

+	unsigned char data[0];

+};

+

+struct	ipc_socket

+{	

+	struct hlist_node	hlist_node;

+	struct socket* socket;

+	struct sock* sock;

+	int socktype; 

+	int localfd;  //±¾µØ¿Í»§¶Ëfd

+	int sockfd;   //±¾µØ´úÀísocketµÄfd

+	int remotefd; //¶ÔÓ¦Ô¶¶ËʵÌåµÄfd

+	int remoteproxyfd; //¶ÔÓ¦Ô¶¶Ë´úÀíµÄ fd

+	struct socket* localsocket; //±¾µØ¿Í»§¶Ësocket

+	struct socket* proxysocket; //±¾µØ´úÀísocket

+	struct socket* remotesocket; //¶ÔÓ¦Ô¶¶ËʵÌåµÄsocket

+	struct socket* remoteproxysocket; //¶ÔÓ¦Ô¶¶Ë´úÀíµÄsocket

+	void* key;

+};

+

+struct sock_rpmsg_info

+{

+	struct hlist_node	hlist_node;

+	struct sock_rpmsg sock_rpmsg;

+	struct semaphore sock_sem;

+	struct ipc_socket * ipc_socket;

+	void* key; //±êʶrpmsgµÄ¹Ø¼ü×Ö

+};

+

+struct	peer_sock_info

+{	

+	int fd;

+	int peerfd;

+	struct sock* sock;

+	struct sock* peersock;

+	long timeo;

+};

+

+struct release_socket{

+	struct llist_node	list_node;

+#if 0	

+	struct socket* sock;

+	int clientfd;

+	void* clientsock;

+#endif	

+	int localfd; //¿Í»§¶Ëfd

+	int proxyfd;   //±¾µØ´úÀísocketµÄfd

+	int remotefd; //¶ÔÓ¦Ô¶¶ËʵÌåµÄfd

+	struct socket* localsocket; //±¾µØ¿Í»§¶Ësocket

+	struct socket* proxysocket; //±¾µØ´úÀísocket

+	struct socket* remotesocket; //¶ÔÓ¦Ô¶¶ËʵÌåµÄsocket

+	struct socket* remoteproxysocket; //¶ÔÓ¦´úÀíµÄsocket

+};

+

+//´æ·ÅËùÓвÎÓë½»»¥µÄsocketµØÖ·

+struct socket_info{

+	struct hlist_node	hlist_node;

+	struct socket* proxysocket;

+	struct socket* localsocket;

+};

+

+int sock_soc_recvq_full(const struct sock *sk);

+int sock_soc_set_peer(struct sock *sock, struct sock *other);

+int sock_soc_sock_put(struct sock *other);

+int sock_soc_msg_send(struct sock *sock, struct sock *other, struct msghdr *msg, size_t len);

+long sock_wait_for_peer(struct sock *sock, struct sock *other, long timeo);

+int sock_soc_sk_data_ready(struct sock *sk);

+int sock_sync_ipc_socket(struct sock_elem_flag* elem_flag, struct sock *other);

+void sock_soc_add_skb_queue_tail(struct sock *sock, struct sock *other);

+void sock_soc_add_wait_queue(struct sock *sock, struct sock *other);

+void sock_soc_remove_wait_queue(struct sock *sock, struct sock *other);

+struct sock *sock_soc_find_other(struct socket* socket,

+				    struct sockaddr_un *sunname, int len,

+				    int type, unsigned int hash, int *error);

+int unix_is_ipc_socket(struct sock *sock);

+int unix_is_ipc_local_socket(struct sock *sock);

+int sock_soc_test_flags(struct sock *other, enum sock_flags flag);

+int sock_soc_recvq_full_lockless_and_dead(const struct sock *other);

+int sock_soc_get_state(struct sock_elem_flag* elem_flag, struct sock *other);

+void sock_soc_stream_connect(struct sock *sock, struct sock *other, struct sockaddr_un *sunname, int len,int flags);

+int sock_soc_update_peer(struct socket *sock, struct socket *newsock);

+int sock_soc_dgram_disconnected(struct sock *sock, struct sock *other);

+void sock_soc_state_lock(struct sock *other);

+void sock_soc_state_unlock(struct sock *other);

+void sock_soc_delay_release(struct socket *sock);

+void sock_soc_sock_hold(struct sock *other);

+

+#endif

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/net/af_unix.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/net/af_unix.h
old mode 100644
new mode 100755
index f42fddd..0c067bf
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/net/af_unix.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/net/af_unix.h
@@ -7,6 +7,9 @@
 #include <linux/mutex.h>
 #include <linux/refcount.h>
 #include <net/sock.h>
+#ifdef CONFIG_IPC_SOCKET
+#include <linux/socket_rpmsg.h>
+#endif
 
 void unix_inflight(struct user_struct *user, struct file *fp);
 void unix_notinflight(struct user_struct *user, struct file *fp);
@@ -70,6 +73,9 @@
 	struct socket_wq	peer_wq;
 	wait_queue_entry_t	peer_wake;
 	struct scm_stat		scm_stat;
+#ifdef CONFIG_IPC_SOCKET
+	struct release_socket rsock;
+#endif	
 };
 
 static inline struct unix_sock *unix_sk(const struct sock *sk)
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/net/sock.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/net/sock.h
old mode 100644
new mode 100755
index 90a8b8b..589dd83
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/net/sock.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/net/sock.h
@@ -68,6 +68,15 @@
 #include <net/tcp_states.h>
 #include <linux/net_tstamp.h>
 #include <net/l3mdev.h>
+#ifdef CONFIG_IPC_SOCKET
+extern int socket_rpmsg_debug;
+
+#define sk_soc_dbg(format, arg...) if(socket_rpmsg_debug == 1) \
+	printk(KERN_DEBUG "[socket_rpmsg]<%s>: " format "\n" ,__func__ , ## arg)
+#define sk_soc_info(format, arg...) if(socket_rpmsg_debug == 1) \
+	printk(KERN_INFO "[socket_rpmsg]<%s>: " format "\n" ,__func__ , ## arg)
+
+#endif
 
 /*
  * This structure really needs to be cleaned up.
@@ -114,6 +123,15 @@
 typedef __u32 __bitwise __portpair;
 typedef __u64 __bitwise __addrpair;
 
+#ifdef CONFIG_IPC_SOCKET
+//#include <linux/socket_rpmsg.h>
+enum sock_flags;
+extern int unix_is_ipc_socket(struct sock *sock);
+extern int sock_soc_test_flags(struct sock *other, enum sock_flags flag);
+extern int sock_soc_sock_put(struct sock *other);
+extern void sock_soc_sock_hold(struct sock *other);
+#endif
+
 /**
  *	struct sock_common - minimal network layer representation of sockets
  *	@skc_daddr: Foreign IPv4 addr
@@ -519,6 +537,12 @@
 	struct bpf_local_storage __rcu	*sk_bpf_storage;
 #endif
 	struct rcu_head		sk_rcu;
+#ifdef CONFIG_IPC_SOCKET
+	int ipc_flag;
+	int sk_fd;
+	struct sock* proxy_sock;
+	u8 closed;
+#endif
 };
 
 enum sk_pacing {
@@ -717,6 +741,9 @@
 static __always_inline void sock_hold(struct sock *sk)
 {
 	refcount_inc(&sk->sk_refcnt);
+#ifdef CONFIG_IPC_SOCKET
+    sk_soc_dbg("sock_hold sk=%x, sk->sk_refcnt=%d\n", sk, sk->sk_refcnt);
+#endif	
 }
 
 /* Ungrab socket in the context, which assumes that socket refcnt
@@ -724,6 +751,9 @@
  */
 static __always_inline void __sock_put(struct sock *sk)
 {
+#ifdef CONFIG_IPC_SOCKET	
+	sk_soc_dbg("__sock_put sk=%x, sk->sk_refcnt=%d\n",sk, sk->sk_refcnt);
+#endif	
 	refcount_dec(&sk->sk_refcnt);
 }
 
@@ -888,6 +918,10 @@
 	SOCK_TXTIME,
 	SOCK_XDP, /* XDP is attached */
 	SOCK_TSTAMP_NEW, /* Indicates 64 bit timestamps always */
+#ifdef CONFIG_IPC_SOCKET
+    SOCK_IPCSOCK,  /*Indicates whether it is a cross core socket */
+    SOCK_IPC_LOCAL,
+#endif
 };
 
 #define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
@@ -918,7 +952,18 @@
 
 static inline bool sock_flag(const struct sock *sk, enum sock_flags flag)
 {
+#ifdef CONFIG_IPC_SOCKET
+	if(unix_is_ipc_socket(sk)){
+		return sock_soc_test_flags(sk, flag);
+	}
+	else{
+#endif
+
 	return test_bit(flag, &sk->sk_flags);
+
+#ifdef CONFIG_IPC_SOCKET
+	}
+#endif
 }
 
 #ifdef CONFIG_NET
@@ -1805,7 +1850,11 @@
 
 /* Ungrab socket and destroy it, if it was the last reference. */
 static inline void sock_put(struct sock *sk)
-{
+{	
+	
+#ifdef CONFIG_IPC_SOCKET
+	sk_soc_dbg("sock_put enter sk=%x, sk->sk_refcnt=%d\n", sk, sk->sk_refcnt);
+#endif	
 	if (refcount_dec_and_test(&sk->sk_refcnt))
 		sk_free(sk);
 }
@@ -1878,6 +1927,9 @@
 
 static inline void sk_set_socket(struct sock *sk, struct socket *sock)
 {
+#ifdef CONFIG_IPC_SOCKET	
+	sk_soc_dbg("sk_set_socket sk=%x, sock=%x \n", sk, sock);
+#endif	
 	sk->sk_socket = sock;
 }
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/uapi/linux/android/binder.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/uapi/linux/android/binder.h
old mode 100644
new mode 100755
index ec84ad1..6e464a3
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/uapi/linux/android/binder.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/uapi/linux/android/binder.h
@@ -24,6 +24,8 @@
 #include <linux/types.h>
 #include <linux/ioctl.h>
 
+#define BINDER_IPC_32BIT 1
+
 #define B_PACK_CHARS(c1, c2, c3, c4) \
 	((((c1)<<24)) | (((c2)<<16)) | (((c3)<<8)) | (c4))
 #define B_TYPE_LARGE 0x85
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/uapi/linux/gpio.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/uapi/linux/gpio.h
old mode 100644
new mode 100755
index 2072c26..21a0fce
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/uapi/linux/gpio.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/include/uapi/linux/gpio.h
@@ -374,6 +374,7 @@
 #define GPIOHANDLE_REQUEST_BIAS_PULL_UP	(1UL << 5)
 #define GPIOHANDLE_REQUEST_BIAS_PULL_DOWN	(1UL << 6)
 #define GPIOHANDLE_REQUEST_BIAS_DISABLE	(1UL << 7)
+#define GPIOHANDLE_REQUEST_DRIVE_STRENGTH (1UL << 8) /* sanechips */
 
 /**
  * struct gpiohandle_request - Information about a GPIO handle request
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/ipc/shm.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/ipc/shm.c
old mode 100644
new mode 100755
index b56c2c4..977e5b1
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/ipc/shm.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/ipc/shm.c
@@ -113,11 +113,6 @@
 static int sysvipc_shm_proc_show(struct seq_file *s, void *it);
 #endif
 
-#ifdef CONFIG_SYSVIPC_CROSS_SHM
-extern int shm_remote_free_pages(struct vm_area_struct *unmap_vma);
-extern int shm_do_remote_map_vma(struct vm_area_struct *vma, key_t key);
-#endif
-
 void shm_init_ns(struct ipc_namespace *ns)
 {
 	ns->shm_ctlmax = SHMMAX;
@@ -233,21 +228,50 @@
 }
 
 #ifdef CONFIG_SYSVIPC_CROSS_SHM
-void shm_mmap_pagetable(struct vm_area_struct *vma, struct file *file)
+key_t shm_do_remote_analy_key(struct file *file)
 {
-	int ret = 0;
-	
+	key_t  key = 0;	
+	char   *shm_name = NULL;
 	struct shm_file_data *sfd;
 	struct shmid_kernel  *shp;
+	struct path    *shm_path  = NULL;
+	struct dentry  *shm_dentry = NULL;
 
-	sfd = shm_file_data(file);
-	shp = shm_lock(sfd->ns, sfd->id);
-	
-	ret = shm_do_remote_map_vma(vma, shp->shm_perm.key);
-	if (ret < 0)
-		printk("shm_mmap_pagetable Error");
+	if (file && (file->shm_flags == SHM_REMOTE_SYSV_YES))
+	{		
+		sfd = shm_file_data(file);
+		shp = shm_lock(sfd->ns, sfd->id);
+		key = shp->shm_perm.key;
+		shm_unlock(shp);
+	}
+	else if (file && (file->shm_flags == SHM_REMOTE_POSIX_YES))
+	{	
+		shm_path = &file->f_path;
 		
-	shm_unlock(shp);
+		if(shm_path && (shm_path->dentry))
+		{
+			shm_name = shm_path->dentry->d_name.name;
+			if (!shm_name)
+				panic("shm_posix_mmap_pagetable name is NULL\n");
+		}
+		key = shm_hash_name_to_key(shm_name, strlen(shm_name));
+	}
+	return key;
+}
+
+int shm_ipc_mmap_pagetable(struct vm_area_struct *vma, struct file *file)
+{
+	int   ret = 0;
+	key_t shm_key = 0;
+		
+	shm_key = shm_do_remote_analy_key(file);
+	ret     = shm_do_remote_map_vma(vma, shm_key);
+	if (ret < 0)
+	{
+		printk("shm_ipc_mmap_pagetable Error: No Mem\n");
+		return -ENOMEM;
+	}
+	return ret;
 }
 #endif
 
@@ -416,10 +440,6 @@
 	shp->shm_dtim = ktime_get_real_seconds();
 	shp->shm_nattch--;
 
-#ifdef CONFIG_SYSVIPC_CROSS_SHM
-	if (shp->shm_perm.rpmflag == TRUE)
-		shm_remote_free_pages(shp->shm_perm.key);
-#endif
 	if (shm_may_destroy(shp))
 		shm_destroy(ns, shp);
 	else
@@ -805,10 +825,21 @@
 	shp->shm_creator = current;
 
 #ifdef CONFIG_SYSVIPC_CROSS_SHM
-	if((key & SHM_REMOTE_ATTR_MASK) == SHM_REMOTE_ATTR_MASK)
-		shp->shm_perm.rpmflag = TRUE;
+	if((key & SHM_REMOTE_SYSV_MASK) == SHM_REMOTE_SYSV_MASK)
+	{
+		error = shm_do_newseg_check(key, size);
+		if (error < 0)
+		{
+			printk("shm size error, should be the same PAGE_ALIGN size\n");
+			return error;
+		}
+		else
+			shp->shm_perm.rpmflag = TRUE;
+	}
 	else
+	{
 		shp->shm_perm.rpmflag = FALSE;
+	}
 #endif	
 	/* ipc_addid() locks shp upon success. */
 	error = ipc_addid(&shm_ids(ns), &shp->shm_perm, ns->shm_ctlmni);
@@ -1679,7 +1710,7 @@
 
 #ifdef CONFIG_SYSVIPC_CROSS_SHM
 	if(shp->shm_perm.rpmflag == TRUE)
-		file->f_flags = SHM_REMOTE_ATTR_YES;
+		file->shm_flags = SHM_REMOTE_SYSV_YES;
 #endif		
 	err = security_mmap_file(file, prot, flags);
 	if (err)
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/ipc/shm_ctrl.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/ipc/shm_ctrl.c
index a531672..ba8a1b5 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/ipc/shm_ctrl.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/ipc/shm_ctrl.c
@@ -13,6 +13,7 @@
  * Better ipc lock (kern_ipc_perm.lock) handling
  * Davidlohr Bueso <davidlohr.bueso@hp.com>, June 2013.
  */
+#include <linux/errno.h>
 #include <linux/mm.h>
 #include <asm/pgtable.h>
 #include "shm_ctrl.h"
@@ -32,6 +33,37 @@
 struct shm_entity *shm_remote_manager;
 
 /*******************************************************************************
+* ¹¦ÄÜÃèÊö:     shm_hash_name_to_key
+* ²ÎÊý˵Ã÷:
+*    (´«Èë²ÎÊý) name: ¹²ÏíÄÚ´æÃû³Æ
+*    (´«Èë²ÎÊý) len: ¹²ÏíÄÚ´æÃû³Æ³¤¶È
+*    (´«³ö²ÎÊý) ÎÞ
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     This function is used for calc hash value of the name(-2048~-4096)
+*******************************************************************************/
+key_t shm_hash_name_to_key(const char *name, int len)
+{
+	int   i 	   = 0;
+	key_t tmp_key  = 0;
+	key_t hash_key = 0;
+	unsigned long long id = 0;
+	
+	for (; i < len; i++)
+	{
+		if (name[i] >= 'A' && name[i] <= 'Z')
+			id = id*SHM_POSIX_HASH_BASE + name[i]-'A';
+		else if (name[i] >= 'a' && name[i] <= 'z')
+			id = id*SHM_POSIX_HASH_BASE + name[i]-'a' + SHM_POSIX_HASH_CHARS;
+		else if (name[i] >= '0' && name[i] <= '9')
+			id = id*SHM_POSIX_HASH_BASE + name[i]-'0' + 2*SHM_POSIX_HASH_CHARS;
+	}
+	
+	tmp_key =(id & SHM_POSIX_HASH_MASK) + (SHM_POSIX_HASH_MASK + 1);
+	hash_key = ~tmp_key + 1; 
+	return hash_key;
+}
+
+/*******************************************************************************
 * ¹¦ÄÜÃèÊö:     shm_quary_keyArray
 * ²ÎÊý˵Ã÷:
 *    (´«Èë²ÎÊý)    void
@@ -356,6 +388,58 @@
 }
 
 /*******************************************************************************
+* ¹¦ÄÜÃèÊö:     shm_do_newseg_check
+* ²ÎÊý˵Ã÷:     
+*    (´«Èë²ÎÊý)    void
+*    (´«³ö²ÎÊý)    void
+* ·µ »Ø Öµ:     SHM_CTRL_OK or SHM_CTRL_ERROR
+* ÆäËü˵Ã÷:     This function is used for check key and len                        
+*******************************************************************************/
+int shm_do_newseg_check(key_t key, unsigned long len)
+{
+    int                  ret 		= 0;
+    int                  key_index	= 0;
+    unsigned int         shm_weight	= 0;
+    unsigned int         shm_pages	= 0;
+    struct shm_key_node  *key_node  = NULL;
+
+    if(g_shm_region == NULL)
+    {
+        printk("shm_do_newsg_check:Shm region is not ready\n");
+        return SHM_CTRL_ERROR;
+    }
+    soft_spin_lock(SHM_SFLOCK);
+
+    key_index = shm_quary_keyArray(key);
+
+    if (key_index < 0) 
+    {
+        soft_spin_unlock(SHM_SFLOCK);    
+        return SHM_CTRL_OK;
+    }
+
+    if ((0 <= key_index) && (key_index < SHM_UNIT_NUM_BITS))
+    {
+        key_node = &shm_remote_manager->keys_info_head[key_index];
+    }
+    else
+    {
+        soft_spin_unlock(SHM_SFLOCK);
+        panic("key_index out of range: failed\n");
+    }
+
+    shm_pages =  PAGE_ALIGN(len) >> PAGE_SHIFT;
+    shm_weight = bitmap_weight(key_node->shm_inuse_index, SHM_UNIT_NUM_BITS);
+    soft_spin_unlock(SHM_SFLOCK);
+
+    /*APºÍCAP¹²ÏíÄÚ´æ´óСӦƥÅä*/
+    if(shm_weight != shm_pages) 
+        return -EINVAL;
+    else
+        return SHM_CTRL_OK;
+}
+
+/*******************************************************************************
 * ¹¦ÄÜÃèÊö:     shm_do_remote_map_vma
 * ²ÎÊý˵Ã÷:     
 *    (´«Èë²ÎÊý)    void
@@ -401,9 +485,14 @@
     vm_addr = vma->vm_start;
 
     if ((0 <= key_index) && (key_index < SHM_UNIT_NUM_BITS))
+    {
         key_node = &shm_remote_manager->keys_info_head[key_index];
+    }
     else
+    {
+        soft_spin_unlock(SHM_SFLOCK);
         panic("key_index out of range: failed\n");
+    }
 
     memcpy(shm_inuse_tmp, key_node->shm_inuse_index, sizeof(shm_inuse_tmp));
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/ipc/shm_ctrl.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/ipc/shm_ctrl.h
index 1c5da13..1da4891 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/ipc/shm_ctrl.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/ipc/shm_ctrl.h
@@ -42,11 +42,16 @@
 #define SHM_CTRL_CHANNEL_SIZE     (0x40)
 #define SHM_CTRL_LONG_32BIT       (32)
 
-#define SHM_REMOTE_ATTR_YES       (0x594553) /*YES ASCIIÂë*/
-#define SHM_REMOTE_ATTR_MASK      (0xFFFFF000)
+#define SHM_REMOTE_SYSV_YES       (0x73797376) /*SYSV ASCIIÂë*/
+#define SHM_REMOTE_POSIX_YES      (0x706F7378) /*POSX ASCIIÂë*/
+#define SHM_REMOTE_SYSV_MASK      (0xFFFFF800) /*(key:-1~-2047)*/
 
 #define SHM_KEYS_STATUS_LEN       (4*1024)   
 #define SHM_REMOTE_BUFF_LEN       (128*1024)
+#define SHM_POSIX_HASH_CHARS      (26)
+#define SHM_POSIX_HASH_BASE       (62)
+#define SHM_POSIX_HASH_MASK       (0x7FF)
+
 #define SHM_BUFF_BASE_PHY_ADDR    (g_shm_phyAddr) 
 #define SHM_UNIT_BUFF_ORDER       (12)
 #define SHM_UNIT_BUFF_SIZE        (1UL<<SHM_UNIT_BUFF_ORDER) /*4KB*/
@@ -80,6 +85,12 @@
     phys_addr_t  key_manage_phy;
 };
 
+extern int   shm_remote_free_pages(key_t key);
+extern key_t shm_hash_name_to_key(const char *name, int len);
+extern int shm_do_newseg_check(key_t key, unsigned long len);
+extern int shm_do_remote_map_vma(struct vm_area_struct *vma, key_t key);
+extern void shm_unmap_page_range(struct mm_struct *mm, struct vm_area_struct *vma,
+                                 unsigned long addr, unsigned long end);
 #endif
 #endif // _SHM_CTRL_H
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/kernel/signal.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/kernel/signal.c
index 2ddd1d7..246b502 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/kernel/signal.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/kernel/signal.c
@@ -2752,7 +2752,7 @@
 
 #ifdef CONFIG_RAMDUMP_USER
 			if (sysctl_ramdump_on_user == 1)
-				panic("user dump into kernel panic\n");
+				panic("user dump into kernel panic, dump task is %s.\n", current->comm);
 #endif
 			if (print_fatal_signals)
 				print_fatal_signal(ksig->info.si_signo);
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/mm/mmap.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/mm/mmap.c
old mode 100644
new mode 100755
index 707e37f..24d8c84
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/mm/mmap.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/mm/mmap.c
@@ -60,9 +60,11 @@
 
 #ifdef CONFIG_SYSVIPC_CROSS_SHM
 #include <../ipc/shm_ctrl.h>
-extern void shm_mmap_pagetable(struct vm_area_struct *vma, struct file *file);
-extern void shm_unmap_page_range(struct mm_struct *mm, struct vm_area_struct *vma,
-                                 unsigned long addr, unsigned long end);
+extern key_t shm_do_remote_analy_key(struct file *file);
+extern int   shm_ipc_mmap_pagetable(struct vm_area_struct *vma, struct file *file);
+static void  shm_delete_vma_from_mm(struct vm_area_struct *vma);
+static void  shm_delete_vma(struct mm_struct *mm, struct vm_area_struct *vma);
+
 #define kenter(FMT, ...) \
     no_printk(KERN_DEBUG "==> %s("FMT")\n", __func__, ##__VA_ARGS__)
 #define kleave(FMT, ...) \
@@ -1912,10 +1914,16 @@
 	vma_set_page_prot(vma);
 
 #ifdef CONFIG_SYSVIPC_CROSS_SHM
-	/*Get real phy pgae*/
-	if (file && (file->f_flags == SHM_REMOTE_ATTR_YES))
-	{		
-		shm_mmap_pagetable(vma, file);		
+	if (file && ((file->shm_flags == SHM_REMOTE_SYSV_YES)
+		      || (file->shm_flags == SHM_REMOTE_POSIX_YES))) {
+		/*Get real phy pgae*/
+		error = shm_ipc_mmap_pagetable(vma, file); 
+		if (error < 0)
+		{
+			shm_delete_vma_from_mm(vma);
+			shm_delete_vma(mm, vma);
+			return error;
+		}
 	}
 #endif
 	return addr;
@@ -2834,6 +2842,17 @@
 }
 
 #ifdef CONFIG_SYSVIPC_CROSS_SHM
+int shm_try_to_free_pages(struct file *file)
+{
+	int ret = 0;
+	key_t shm_key;
+
+	shm_key = shm_do_remote_analy_key(file);
+	ret     = shm_remote_free_pages(shm_key);
+	if (ret < 0)
+		printk("shm_try_to_free_pages Error\n");
+	return ret;
+}
 /*
  * delete a VMA from its owning mm_struct and address space
  */
@@ -2955,6 +2974,7 @@
 
 erase_whole_vma:
 	shm_unmap_page_range(mm, vma, start, end);
+	shm_try_to_free_pages(vma->vm_file);
 	shm_delete_vma_from_mm(vma);
 	shm_delete_vma(mm, vma);
 	return 0;
@@ -3048,7 +3068,9 @@
 	}
 	
 #ifdef CONFIG_SYSVIPC_CROSS_SHM
-	if (vma->vm_file && (vma->vm_file->f_flags == SHM_REMOTE_ATTR_YES)) {
+	if (vma->vm_file && 
+		((vma->vm_file->shm_flags == SHM_REMOTE_SYSV_YES)
+		|| (vma->vm_file->shm_flags == SHM_REMOTE_POSIX_YES))) {
 		shm_ctrl_do_munmap(mm, start, len);
 		return 0;
 	}
@@ -3347,7 +3369,8 @@
 	vma_shm = mm->mmap;
 	while (vma_shm) {		
 		if ((vma_shm->vm_file) && 
-		   (vma_shm->vm_file->f_flags == SHM_REMOTE_ATTR_YES)) {
+		   ((vma_shm->vm_file->shm_flags == SHM_REMOTE_SYSV_YES)
+		    ||(vma_shm->vm_file->shm_flags == SHM_REMOTE_POSIX_YES))) {
 			vma = vma_shm->vm_next;
 			shm_ctrl_do_munmap(mm, vma_shm->vm_start, (vma_shm->vm_end - vma_shm->vm_start));
 			vma_shm = vma;
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/Kconfig b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/Kconfig
index 8719080..0379430 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/Kconfig
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/Kconfig
@@ -465,7 +465,10 @@
 	  An alternative userspace interface for ethtool based on generic
 	  netlink. It provides better extensibility and some new features,
 	  e.g. notification messages.
-
+	  
+config IPC_SOCKET
+	bool "Config ipc socket"
+	default n
 endif   # if NET
 
 # Used by archs to tell that they support BPF JIT compiler plus which flavour.
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/Makefile b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/Makefile
old mode 100644
new mode 100755
index 5744bf1..8c3044d
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/Makefile
@@ -88,3 +88,4 @@
 obj-$(CONFIG_NET_NCSI)		+= ncsi/
 obj-$(CONFIG_XDP_SOCKETS)	+= xdp/
 obj-$(CONFIG_MPTCP)		+= mptcp/
+obj-$(CONFIG_IPC_SOCKET) += socket_rpmsg.o
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/socket.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/socket.c
old mode 100644
new mode 100755
index bcf68b1..443032b
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/socket.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/socket.c
@@ -435,6 +435,9 @@
 	newfile = sock_alloc_file(sock, flags, NULL);
 	if (!IS_ERR(newfile)) {
 		fd_install(fd, newfile);
+#ifdef CONFIG_IPC_SOCKET		
+		sock->fd = fd;
+#endif
 		return fd;
 	}
 
@@ -581,7 +584,9 @@
 	inode->i_uid = current_fsuid();
 	inode->i_gid = current_fsgid();
 	inode->i_op = &sockfs_inode_ops;
-
+#ifdef CONFIG_IPC_SOCKET		
+	INIT_HLIST_HEAD(&sock->peer);
+#endif
 	return sock;
 }
 EXPORT_SYMBOL(sock_alloc);
@@ -1728,6 +1733,9 @@
 		sock_release(newsock);
 		goto out;
 	}
+#ifdef CONFIG_IPC_SOCKET		
+		newsock->fd = newfd;
+#endif
 	newfile = sock_alloc_file(newsock, flags, sock->sk->sk_prot_creator->name);
 	if (IS_ERR(newfile)) {
 		err = PTR_ERR(newfile);
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/socket_rpmsg.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/socket_rpmsg.c
new file mode 100755
index 0000000..7d149fa
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/socket_rpmsg.c
@@ -0,0 +1,2677 @@
+/*******************************************************************************

+ *                           Include header files                              *

+ ******************************************************************************/

+#include <linux/module.h>

+#include <net/sock.h>

+#include <net/af_unix.h>

+#include <uapi/linux/sched/types.h>

+#include <linux/syscalls.h>

+#include <linux/file.h>

+//#include "ram_config.h"

+#include <linux/socket_rpmsg.h>

+

+#define SOCK_DATA_ALIGN(X)	ALIGN(X, SMP_CACHE_BYTES)

+#define SOCK_DATA_MAX_LEN 8*1024

+#define  ICP_CHN_SOCKET 32

+#define sock_init_sema sema_init

+#define sock_get_sema down_interruptible

+#define sock_put_sema up

+

+struct sock_channel g_sock_chn_info;

+struct sock_rpmsg g_sock_rpmsg;

+struct ipc_socket *g_socket_ipc;

+

+struct semaphore g_sock_sem;

+unsigned int g_sock_timeout = 5*1000;

+//´æ·ÅÁ´Â·ÐÅÏ¢£¬Ò»¶Ësocket¹Ø±Õ£¬ÆäËùÓйØÁªµÄsocket¾ùɾ³ý£¬Á´Â·ÐÅÏ¢Öдæ·Å5Ôª×飨¿Í»§¶Ë¡¢·þÎñ¶Ë¡¢ºÍ´úÀí£©

+struct hlist_head g_ipc_sockets;

+struct hlist_head g_sock_rpmsg_info;

+struct hlist_head g_sockets_info;

+	

+char* flag_value[] ={

+	"SOCK_DEAD",

+	"SOCK_DONE",

+	"SOCK_URGINLINE",

+	"SOCK_KEEPOPEN",

+	"SOCK_LINGER",

+	"SOCK_DESTROY",

+	"SOCK_BROADCAST",

+	"SOCK_TIMESTAMP",

+	"SOCK_ZAPPED",

+	"SOCK_USE_WRITE_QUEUE", /* whether to call sk->sk_write_space in sock_wfree */

+	"SOCK_DBG", /* %SO_DEBUG setting */

+	"SOCK_RCVTSTAMP", /* %SO_TIMESTAMP setting */

+	"SOCK_RCVTSTAMPNS", /* %SO_TIMESTAMPNS setting */

+	"SOCK_LOCALROUTE", /* route locally only, %SO_DONTROUTE setting */

+	"SOCK_MEMALLOC", /* VM depends on this socket for swapping */

+	"SOCK_TIMESTAMPING_RX_SOFTWARE",  /* %SOF_TIMESTAMPING_RX_SOFTWARE */

+	"SOCK_FASYNC", /* fasync() active */

+	"SOCK_RXQ_OVFL",

+	"SOCK_ZEROCOPY", /* buffers from userspace */

+	"SOCK_WIFI_STATUS", /* push wifi status to userspace */

+	"SOCK_NOFCS", 

+	"SOCK_FILTER_LOCKED", /* Filter cannot be changed anymore */

+	"SOCK_SELECT_ERR_QUEUE", /* Wake select on error queue */

+	"SOCK_RCU_FREE", /* wait rcu grace period in sk_destruct() */

+	"SOCK_TXTIME",

+	"SOCK_XDP", /* XDP is attached */

+	"SOCK_TSTAMP_NEW",

+	"SOCK_IPCSOCK"

+};

+

+DEFINE_SPINLOCK(sock_table_lock);

+EXPORT_SYMBOL_GPL(sock_table_lock);

+

+DEFINE_SPINLOCK(sock_rpmsg_table_lock);

+EXPORT_SYMBOL_GPL(sock_rpmsg_table_lock);

+

+DEFINE_SPINLOCK(sock_socket_table_lock);

+EXPORT_SYMBOL_GPL(sock_socket_table_lock);

+

+DEFINE_SPINLOCK(sock_release_table_lock);

+EXPORT_SYMBOL_GPL(sock_release_table_lock);

+

+DEFINE_SPINLOCK(sock_release_lock);

+EXPORT_SYMBOL_GPL(sock_release_lock);

+

+DEFINE_SPINLOCK(sock_release_peer_lock);

+EXPORT_SYMBOL_GPL(sock_release_peer_lock);

+

+#define unix_peer(sk) (unix_sk(sk)->peer)

+extern struct sock *unix_find_other_proxy(struct net *net,

+				    struct sockaddr_un *sunname, int len,

+				    int type, unsigned int hash, int *error);

+

+extern int unix_dgram_peer_wake_connect_proxy(struct sock *sk, struct sock *other);

+

+extern void unix_dgram_peer_wake_disconnect_proxy(struct sock *sk, struct sock *other);

+

+extern void unix_dgram_peer_wake_disconnect_wakeup_proxy(struct sock *sk,

+						   struct sock *other);

+extern long unix_wait_for_peer_proxy(struct sock *other, long timeo);

+extern int unix_recvq_full_proxy(const struct sock *sk);

+extern int unix_recvq_full_proxy_lockless_and_deadstate(const struct sock *other);

+extern int unix_stream_connect_proxy(struct socket *sock, struct sockaddr *uaddr,

+			       int addr_len, int flags);

+extern void unix_dgram_disconnected_proxy(struct sock *sk, struct sock *other);

+extern int unix_mkname_proxy(struct sockaddr_un *sunaddr, int len, unsigned *hashp);

+extern void unix_release_sock_proxy(struct sock *sk);

+

+//static void delayed_release(struct work_struct *unused);

+int sock_soc_socket_is_valid(struct socket* proxysock, struct socket* localsock);

+int sock_soc_release_peer(struct release_socket* rsock);

+

+static LLIST_HEAD(delayed_release_list);

+

+

+enum sock_flags_ap {

+	SOCK_DEAD_AP,

+	SOCK_DONE_AP,

+	SOCK_URGINLINE_AP,

+	SOCK_KEEPOPEN_AP,

+	SOCK_LINGER_AP,

+	SOCK_DESTROY_AP,

+	SOCK_BROADCAST_AP,

+	SOCK_TIMESTAMP_AP,

+	SOCK_ZAPPED_AP,

+	SOCK_USE_WRITE_QUEUE_AP, /* whether to call sk->sk_write_space in sock_wfree */

+	SOCK_DBG_AP, /* %SO_DEBUG setting */

+	SOCK_RCVTSTAMP_AP, /* %SO_TIMESTAMP setting */

+	SOCK_RCVTSTAMPNS_AP, /* %SO_TIMESTAMPNS setting */

+	SOCK_LOCALROUTE_AP, /* route locally only, %SO_DONTROUTE setting */

+	SOCK_QUEUE_SHRUNK_AP, /* write queue has been shrunk recently */

+	SOCK_TIMESTAMPING_TX_HARDWARE_AP,  /* %SOF_TIMESTAMPING_TX_HARDWARE */

+	SOCK_TIMESTAMPING_TX_SOFTWARE_AP,  /* %SOF_TIMESTAMPING_TX_SOFTWARE */

+	SOCK_TIMESTAMPING_RX_HARDWARE_AP,  /* %SOF_TIMESTAMPING_RX_HARDWARE */

+	SOCK_TIMESTAMPING_RX_SOFTWARE_AP,  /* %SOF_TIMESTAMPING_RX_SOFTWARE */

+	SOCK_TIMESTAMPING_SOFTWARE_AP,     /* %SOF_TIMESTAMPING_SOFTWARE */

+	SOCK_TIMESTAMPING_RAW_HARDWARE_AP, /* %SOF_TIMESTAMPING_RAW_HARDWARE */

+	SOCK_TIMESTAMPING_SYS_HARDWARE_AP, /* %SOF_TIMESTAMPING_SYS_HARDWARE */

+	SOCK_FASYNC_AP, /* fasync() active */

+	SOCK_RXQ_OVFL_AP,

+	SOCK_ZEROCOPY_AP, /* buffers from userspace */

+	SOCK_WIFI_STATUS_AP, /* push wifi status to userspace */

+	SOCK_NOFCS_AP, /* Tell NIC not to do the Ethernet FCS.

+		     * Will use last 4 bytes of packet sent from

+		     * user-space instead.

+		     */

+

+    SOCK_IPCSOCK_AP,  /*Indicates whether it is a cross core socket */

+};

+	

+enum sock_flags_ap convert_to_ap_sock_flag(enum sock_flags flag)

+{

+	switch(flag){

+		case SOCK_DEAD:

+			return SOCK_DEAD_AP;

+		case SOCK_DONE:

+			return SOCK_DONE_AP;

+		case SOCK_URGINLINE:

+			return SOCK_URGINLINE_AP;

+		case SOCK_KEEPOPEN:

+			return SOCK_KEEPOPEN_AP;

+		case SOCK_LINGER:

+			return SOCK_LINGER_AP;

+		case SOCK_DESTROY:

+			return SOCK_DESTROY_AP; 

+		case SOCK_BROADCAST:

+			return SOCK_BROADCAST_AP;

+		case SOCK_TIMESTAMP:

+			return SOCK_TIMESTAMP_AP;

+		case SOCK_ZAPPED:

+			return SOCK_ZAPPED_AP;

+		case SOCK_USE_WRITE_QUEUE:

+			return SOCK_USE_WRITE_QUEUE_AP;

+		case SOCK_DBG:

+			return SOCK_DBG_AP;

+		case SOCK_RCVTSTAMP:

+			return SOCK_RCVTSTAMP_AP;

+		case SOCK_RCVTSTAMPNS:

+			return SOCK_RCVTSTAMPNS_AP;

+		case SOCK_LOCALROUTE:

+			return SOCK_LOCALROUTE_AP;

+		case SOCK_MEMALLOC:

+			return -1;

+		case SOCK_TIMESTAMPING_RX_SOFTWARE:

+			return SOCK_TIMESTAMPING_RX_SOFTWARE_AP;

+		case SOCK_FASYNC:

+			return SOCK_FASYNC_AP;

+		case SOCK_RXQ_OVFL:

+			return SOCK_RXQ_OVFL_AP;

+		case SOCK_ZEROCOPY:

+			return SOCK_ZEROCOPY_AP;

+		case SOCK_WIFI_STATUS:

+			return SOCK_WIFI_STATUS_AP;

+		case SOCK_NOFCS:

+			return SOCK_NOFCS_AP;

+		case SOCK_FILTER_LOCKED:

+			return -1;

+		case SOCK_SELECT_ERR_QUEUE:

+			return -1;

+		case SOCK_RCU_FREE:

+			return -1;

+		case SOCK_TXTIME:

+			return -1;

+		case SOCK_XDP:

+			return -1;

+		case SOCK_TSTAMP_NEW:

+			return -1;

+		default:

+			return -1;

+	}

+}

+

+static int sock_soc_is_socket_peer(struct socket* socket, struct socket* peer)

+{

+	struct socket_info *p;

+	struct hlist_node *n;

+	spin_lock(&sock_release_peer_lock);

+	hlist_for_each_entry_safe(p, n, &socket->peer, hlist_node) {

+		if(p->proxysocket == peer){			

+			spin_unlock(&sock_release_peer_lock);			

+			return 0;

+		}

+	}

+	spin_unlock(&sock_release_peer_lock);

+	return -1;

+}

+

+static inline void sock_soc_insert_socket_peer(struct socket* socket, struct socket* peer)

+{

+	struct socket_info *psock_socket_info = NULL;

+

+	//ÏȲ鿴peerÊÇ·ñÒѾ­ÔÚsocketµÄpeer_listÖÐ

+	if(0 == sock_soc_is_socket_peer(socket, peer)){

+		sk_soc_info("sock_soc_insert_socket_peer, peer already exist");

+		return;

+	}

+	

+	psock_socket_info = (struct socket_info *)kzalloc(sizeof(struct socket_info), GFP_ATOMIC);

+	if(psock_socket_info == NULL){

+		return;

+	}

+	memset(psock_socket_info, 0, sizeof(struct socket_info));

+	psock_socket_info->proxysocket = peer;

+	psock_socket_info->localsocket = socket;	

+	

+	sk_soc_info("sock_soc_insert_socket_peer sucess, proxysocket=%x, localsock=%x", psock_socket_info->proxysocket, psock_socket_info->localsocket);

+	

+	spin_lock(&sock_release_peer_lock);

+	INIT_HLIST_NODE(&psock_socket_info->hlist_node);

+	hlist_add_head(&psock_socket_info->hlist_node, &socket->peer);

+	spin_unlock(&sock_release_peer_lock);

+}

+

+static int sock_soc_del_socket_peer(struct socket* socket, struct socket* peer)

+{

+	struct socket_info *p;

+	struct hlist_node *n;

+	spin_lock(&sock_release_peer_lock);

+	hlist_for_each_entry_safe(p, n, &socket->peer, hlist_node) {

+		if(p->proxysocket == peer){

+			hlist_del(&p->hlist_node);

+			spin_unlock(&sock_release_peer_lock);

+			kfree(p);

+			return 0;

+		}

+	}

+	spin_unlock(&sock_release_peer_lock);

+	return -1;

+}

+

+static inline void sock_soc_insert_socket(struct hlist_node *list_node)

+{

+	spin_lock(&sock_table_lock);

+	hlist_add_head(list_node, &g_ipc_sockets);

+	spin_unlock(&sock_table_lock);

+}

+

+//ÓÃÓÚÅжϱ¾µØsocketÊÇ·ñÔÚipcÁбíÖУ¬¿ÉÄÜ´æÔÚ¶àÌõ¼Ç¼

+static struct ipc_socket *sock_soc_get_ipcsocket_by_localsocket(struct socket *localsocket)

+{	

+	struct ipc_socket *p;

+	struct hlist_node *n;

+	//sk_soc_info("sock=%x", s);

+	spin_lock(&sock_table_lock);

+	if(hlist_empty(&g_ipc_sockets))

+	{

+		sk_soc_info("sock_soc_get_ipcsocket_by_proxysock  g_ipc_sockets is empty");

+		spin_unlock(&sock_table_lock);

+		return NULL;

+	}

+	hlist_for_each_entry_safe(p, n, &g_ipc_sockets, hlist_node) {

+		if(p->localsocket == localsocket){

+			spin_unlock(&sock_table_lock);

+			return p;

+		}

+	}

+	spin_unlock(&sock_table_lock);

+	return NULL;

+}

+

+//´Ë´¦µÄsockΪ´úÀísocket¶ÔÓ¦µÄsock£¬ÒòΪÿ¸ö´úÀísocketÔÚg_ipc_sockets±íÖÐÊÇΨһµÄ

+static struct ipc_socket *sock_soc_get_ipcsocket_by_proxysock(struct sock *s)

+{	

+	struct ipc_socket *p;

+	struct hlist_node *n;

+	//sk_soc_info("sock=%x", s);

+	spin_lock(&sock_table_lock);

+	if(hlist_empty(&g_ipc_sockets))

+	{

+		sk_soc_info("sock_soc_get_ipcsocket_by_proxysock  g_ipc_sockets is empty");

+		spin_unlock(&sock_table_lock);

+		return NULL;

+	}

+	hlist_for_each_entry_safe(p, n, &g_ipc_sockets, hlist_node) {

+		if(p->sock == s){

+			spin_unlock(&sock_table_lock);

+			return p;

+		}

+	}

+	spin_unlock(&sock_table_lock);

+	return NULL;

+}

+

+//¸ù¾Ý¿Í»§¶ËsocketºÍ·þÎñ¶Ësocket²éÕÒ¶ÔÓ¦µÄipc_socket

+static struct ipc_socket *sock_get_ipcsocket_by_local_and_remote(void* localsock, void* remotesock)

+{	

+	struct ipc_socket *p;

+	struct hlist_node *n;

+	spin_lock(&sock_table_lock);

+	if(hlist_empty(&g_ipc_sockets))

+	{

+		sk_soc_info("sock_get_ipcsocket_by_local_and_remote  g_ipc_sockets is empty");

+		spin_unlock(&sock_table_lock);

+		return NULL;

+	}

+	hlist_for_each_entry_safe(p, n, &g_ipc_sockets, hlist_node) {

+		if((p->localsocket == localsock)&&(p->remotesocket == remotesock)){

+			spin_unlock(&sock_table_lock);

+			return p;

+		}

+	}

+	spin_unlock(&sock_table_lock);

+	return NULL;

+}

+

+int sock_del_ipc_socket_by_proxysocket(struct socket* socket)

+{

+	struct ipc_socket *p;

+	struct hlist_node *n;

+	spin_lock(&sock_table_lock);

+	if(hlist_empty(&g_ipc_sockets))

+	{

+		sk_soc_info("sock_del_ipc_socket_by_proxysocket  g_ipc_sockets is empty");

+		spin_unlock(&sock_table_lock);

+		return -1;

+	}

+	hlist_for_each_entry_safe(p, n, &g_ipc_sockets, hlist_node) {

+		if(p->socket == socket){

+			hlist_del(&p->hlist_node);

+			spin_unlock(&sock_table_lock);

+			kfree(p);

+			return 0;

+		}

+	}

+	spin_unlock(&sock_table_lock);

+	return -1;

+}

+

+//ĿǰÏȸù¾Ý¿Í»§¶Ësocket¡¢±¾¶Ë´úÀísocketºÍ·þÎñ¶Ësocket½øÐÐÆ¥Åä

+int sock_is_valide_ipc_socket(struct socket* localsocket, struct socket* proxysocket, struct socket* remotesocket/*, struct socket* remoteproxysocket*/)

+{

+	struct ipc_socket *p;

+	struct hlist_node *n;

+	

+	spin_lock(&sock_table_lock);

+	if(hlist_empty(&g_ipc_sockets))

+	{

+		sk_soc_info("sock_is_valide_ipc_socket  g_ipc_sockets is empty");

+		spin_unlock(&sock_table_lock);

+		return -1;

+	}

+	hlist_for_each_entry_safe(p, n, &g_ipc_sockets, hlist_node) {

+		if((p->localsocket == localsocket)&&(p->proxysocket == proxysocket)&&(p->remotesocket == remotesocket)/*&&(p->remoteproxysocket == remoteproxysocket)*/){

+			

+			spin_unlock(&sock_table_lock);			

+			return 0;

+		}

+	}

+	spin_unlock(&sock_table_lock);

+	sk_soc_info("sock_is_valide_ipc_socket failed, localsocket=%x, proxysocket=%x, remotesocket=%x", localsocket, proxysocket, remotesocket);

+	return -1;

+}

+

+struct socket *sock_get_local_socket(int fd, int *err)

+{

+	struct socket* sock; 

+	sock = sockfd_lookup(fd, err);

+	if(NULL == sock){

+		return NULL;

+	}

+	sockfd_put(sock);	

+	sk_soc_info("sock_get_local_socket fd=%d, file->f_count=%d ", fd, sock->file->f_count);

+	return sock;

+}

+

+static inline void sock_soc_insert_rpmsg_info(struct hlist_node *list_node)

+{

+	spin_lock(&sock_rpmsg_table_lock);

+	hlist_add_head(list_node, &g_sock_rpmsg_info);

+	spin_unlock(&sock_rpmsg_table_lock);

+}

+

+struct sock_rpmsg_info * sock_soc_create_rpmsg_info(void* key)

+{

+	struct sock_rpmsg_info *psock_sock_rpmsg_info = NULL;

+	

+	psock_sock_rpmsg_info = (struct sock_rpmsg_info *)kzalloc(sizeof(struct sock_rpmsg_info), GFP_ATOMIC);

+	if(psock_sock_rpmsg_info == NULL){

+		sk_soc_info("sock_soc_create_rpmsg_info kzalloc failed \n");

+		return NULL;

+	}

+	memset(psock_sock_rpmsg_info, 0, sizeof(struct sock_rpmsg_info));

+	psock_sock_rpmsg_info->key = key;

+	sema_init(&psock_sock_rpmsg_info->sock_sem, 0);

+	sock_soc_insert_rpmsg_info(&psock_sock_rpmsg_info->hlist_node);

+	return psock_sock_rpmsg_info;

+}

+

+struct sock_rpmsg_info * sock_soc_get_rpmsg_info(void* key)

+{

+	struct sock_rpmsg_info *p;

+	struct hlist_node *n;

+	//sk_soc_info("sock_soc_get_rpmsg_info key=%x \n", key);

+	spin_lock(&sock_rpmsg_table_lock);

+	hlist_for_each_entry_safe(p, n, &g_sock_rpmsg_info, hlist_node) {		

+		if(p->key == key){			

+			spin_unlock(&sock_rpmsg_table_lock);

+			return p;

+		}

+	}

+	spin_unlock(&sock_rpmsg_table_lock);

+	return NULL;

+}

+

+struct sock_rpmsg_info * sock_soc_del_rpmsg_info(void* key)

+{

+	struct sock_rpmsg_info *p;

+	struct hlist_node *n;

+	//sk_soc_info("sock_soc_del_rpmsg_info key=%x \n", key);

+	spin_lock(&sock_rpmsg_table_lock);

+	hlist_for_each_entry_safe(p, n, &g_sock_rpmsg_info, hlist_node) {

+		if(p->key == key){

+			hlist_del(&p->hlist_node);			

+			spin_unlock(&sock_rpmsg_table_lock);

+			sk_soc_info("sock_soc_del_rpmsg_info sucess, key=%x \n", key);

+			kfree(p);

+			return 0;

+		}

+	}

+	spin_unlock(&sock_rpmsg_table_lock);

+	sk_soc_info("sock_soc_del_rpmsg_info failed, key=%x \n", key);

+	return -1;

+}

+

+static inline void sock_soc_insert_socket_info(struct hlist_node *list_node)

+{

+	spin_lock(&sock_socket_table_lock);

+	hlist_add_head(list_node, &g_sockets_info);

+	spin_unlock(&sock_socket_table_lock);

+}

+

+struct socket_info * sock_soc_set_socket_info(struct socket* proxysock, struct socket* localsock)

+{

+	struct socket_info *psock_socket_info = NULL;

+

+	if(0 == sock_soc_socket_is_valid(proxysock, localsock)){

+		sk_soc_info("sock_soc_socket_is_valid is true , do not add again");

+		return NULL;

+	}

+	psock_socket_info = (struct socket_info *)kzalloc(sizeof(struct socket_info), GFP_ATOMIC);

+	if(psock_socket_info == NULL){

+		return NULL;

+	}

+	memset(psock_socket_info, 0, sizeof(struct socket_info));

+	psock_socket_info->proxysocket = proxysock;

+	psock_socket_info->localsocket = localsock;	

+	sock_soc_insert_socket_info(&psock_socket_info->hlist_node);

+	sk_soc_info("sock_soc_set_socket_info sucess, proxysocket=%x, localsock=%x", psock_socket_info->proxysocket, psock_socket_info->localsocket);

+	return psock_socket_info;

+}

+

+int sock_soc_socket_is_valid(struct socket* proxysock, struct socket* localsock)

+{

+	struct ipc_socket *p;

+	struct hlist_node *n;

+	spin_lock(&sock_table_lock);

+	if(hlist_empty(&g_ipc_sockets))

+	{

+		sk_soc_info("sock_soc_socket_is_valid  g_ipc_sockets is empty");

+		spin_unlock(&sock_table_lock);

+		return -1;

+	}

+	hlist_for_each_entry_safe(p, n, &g_ipc_sockets, hlist_node) {

+		if((p->proxysocket == proxysock)&&(p->localsocket == localsock)){

+			spin_unlock(&sock_table_lock);

+			return 0;

+		}

+	}

+	spin_unlock(&sock_table_lock);

+	return -1;

+}

+

+int sock_soc_del_socket_info(struct socket* proxysock, struct socket* localsock)

+{

+	struct ipc_socket *p;

+	struct hlist_node *n;

+	//sk_soc_info("sock_soc_del_socket_info key=%x \n", sock);

+	spin_lock(&sock_table_lock);

+	if(hlist_empty(&g_ipc_sockets))

+	{

+		sk_soc_info("sock_soc_del_socket_info  g_ipc_sockets is empty");

+		spin_unlock(&sock_table_lock);

+		return -1;

+	}

+	hlist_for_each_entry_safe(p, n, &g_ipc_sockets, hlist_node) {

+		if((p->proxysocket == proxysock)&&(p->localsocket == localsock)){

+			hlist_del(&p->hlist_node);

+			spin_unlock(&sock_table_lock);

+			sk_soc_info("sock_soc_del_socket_info sucess, proxysock=%x, localsock=%x \n", proxysock, localsock);

+			kfree(p);

+			return 0;

+		}

+	}

+	spin_unlock(&sock_table_lock);

+	sk_soc_info("sock_soc_del_socket_info failed, proxysock=%x,localsock=%x \n", proxysock, localsock);

+	return -1;

+}

+

+int sock_soc_socket_is_valid_other(struct socket* other)

+{

+	return 0;

+}

+

+int sock_soc_socket_is_valid_ipc(struct socket* localsocket, struct socket* remotesocket)

+{	

+	struct ipc_socket *p;

+	struct hlist_node *n;

+	spin_lock(&sock_table_lock);

+	if(hlist_empty(&g_ipc_sockets))

+	{

+		sk_soc_info("sock_soc_socket_is_valid_ipc  g_ipc_sockets is empty");

+		spin_unlock(&sock_table_lock);

+		return -1;

+	}

+	hlist_for_each_entry_safe(p, n, &g_ipc_sockets, hlist_node) {

+		if((p->localsocket == localsocket)&&(p->remotesocket == remotesocket)){

+			spin_unlock(&sock_table_lock);

+			return 0;

+		}

+	}

+	spin_unlock(&sock_table_lock);

+	return -1;

+}

+

+struct sock_rpmsg_info * sock_soc_rsp_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct sock_rpmsg_info *psock_rpmsg_info;

+	psock_rpmsg_info = sock_soc_get_rpmsg_info(psock_rpmsg->key);

+	if(NULL == psock_rpmsg_info){

+		sk_soc_err("sock_soc_get_rpmsg_info failed!");

+		return NULL;

+	}

+	memset(&psock_rpmsg_info->sock_rpmsg, 0, sizeof(struct sock_rpmsg));

+	memcpy(&psock_rpmsg_info->sock_rpmsg, psock_rpmsg, sizeof(struct sock_rpmsg));	

+	up(&psock_rpmsg_info->sock_sem);

+	return psock_rpmsg_info;

+}

+

+int unix_is_ipc_socket(struct sock *sock)

+{

+	int result;

+	result = test_bit(SOCK_IPCSOCK, &sock->sk_flags);

+	

+	return result;

+}

+EXPORT_SYMBOL_GPL(unix_is_ipc_socket);

+

+int unix_is_ipc_local_socket(struct sock *sock)

+{

+	int result;

+	result = test_bit(SOCK_IPC_LOCAL, &sock->sk_flags);

+	//sk_soc_dbg("unix_is_ipc_socket result=%d", result);

+	return result;

+}

+EXPORT_SYMBOL_GPL(unix_is_ipc_local_socket);

+

+/*·µ»ØÖµ´óÓÚµÈÓÚ0£¬±íʾдͨµÀ³É¹¦£»Ð¡ÓÚ0±íʾдͨµÀʧ°Ü*/

+static int sock_channel_write(struct sock_channel *chninfo, void *buf, unsigned int len)

+{

+    T_RpMsg_Msg msg;

+

+    if(NULL == buf) {

+        return -EINVAL;

+    }

+    memset(&msg, 0, sizeof(msg));

+    msg.coreID = chninfo->core_id;

+    msg.chID   = chninfo->channel_id;

+    msg.flag |= RPMSG_WRITE_INT; //| RPMSG_WRITE_IRQLOCK;

+    msg.buf = buf;

+    msg.len = len;

+	

+    return sockSocWrite(&msg);

+}

+

+/*·µ»ØÖµ´óÓÚ0£¬±íʾ¶ÁȡͨµÀ³É¹¦£»Ð¡ÓÚµÈÓÚ0±íʾͨµÀÊý¾ÝΪ¿Õ»òʧ°Ü*/

+static int sock_channel_read(struct sock_channel *chninfo, void *buf, unsigned int len)

+{

+    T_RpMsg_Msg msg;

+    int ret = 0;

+

+    if(NULL == buf) {

+        return -EINVAL;

+    }

+	

+    memset(&msg, 0, sizeof(msg));

+    msg.coreID = chninfo->core_id;

+    msg.chID   = chninfo->channel_id;

+    msg.buf    = buf;

+    msg.len    = len;

+

+    ret = sockSocRead(&msg);

+    if (ret <= 0) {

+        sk_soc_err("rpm read err=%d!",ret);

+        return ret;

+    }

+

+    return ret;

+}

+

+static int sock_thread_enqueue_data(struct sock_rpmsg *sock_rpmsg)

+{

+	unsigned long flags;

+	struct sock_thread_info* p_main_thread_info;

+	p_main_thread_info = &g_sock_chn_info.main_thread_info;

+	

+	spin_lock_irqsave(&p_main_thread_info->p_sock_lock,flags);

+	list_add_tail(&sock_rpmsg->list, &p_main_thread_info->p_sock_list);

+	spin_unlock_irqrestore(&p_main_thread_info->p_sock_lock,flags);

+	sock_put_sema(&p_main_thread_info->p_sock_sem);

+

+	return 0;

+}

+

+struct sock_rpmsg* sock_create_rpmsg(unsigned int size)

+{

+	struct sock_rpmsg* sock_rpmsg;

+	

+	size = SOCK_DATA_ALIGN(size);

+	size += SOCK_DATA_ALIGN(sizeof(struct sock_rpmsg));

+	if(size > SOCK_DATA_MAX_LEN){

+		sk_soc_err("size of data is too large, max support size is %d", SOCK_DATA_MAX_LEN-sizeof(struct sock_rpmsg));

+	}

+	sock_rpmsg = kzalloc(size, GFP_KERNEL);

+	if (sock_rpmsg == NULL) {

+		sk_soc_err("kzalloc fial!!");

+		return NULL;

+	}

+	return sock_rpmsg;

+}

+

+static int sock_send_ipc_msg(struct	sock_rpmsg* psock_rpmsg)

+{	

+	struct	sock_rpmsg* sock_rpmsg;

+	sock_rpmsg = sock_create_rpmsg(0);

+	if(NULL == sock_rpmsg){

+		sk_soc_err("kzalloc fial!!");

+		return -1;

+	}

+	memcpy(sock_rpmsg, psock_rpmsg, sizeof(struct	sock_rpmsg));

+	sock_rpmsg->dir = DIR_DOWNLINK;

+	sock_thread_enqueue_data(sock_rpmsg);

+	//sk_soc_info("sock_send_ipc_msg write len=%d", len);

+	return 0;

+}

+

+static int sock_send_ipc_msg_data(struct	sock_rpmsg* psock_rpmsg)

+{	

+	if(NULL == psock_rpmsg){

+		sk_soc_err("psock_rpmsg is NULL!!");

+		return -1;

+	}

+	

+	psock_rpmsg->dir = DIR_DOWNLINK;

+	sock_thread_enqueue_data(psock_rpmsg);

+	//sk_soc_info("sock_send_ipc_msg write len=%d", len);

+	return 0;

+}

+

+static int sock_recv_ipc_msg(struct	sock_rpmsg* psock_rpmsg)

+{	

+	struct	sock_rpmsg* sock_rpmsg;

+	sk_soc_info("sock_receive_thread sock_rpmsg.msg_type=%d,index=%d", psock_rpmsg->msg_type, psock_rpmsg->index);

+	sock_rpmsg = sock_create_rpmsg(psock_rpmsg->data_len);

+	if(NULL == sock_rpmsg){

+		sk_soc_err("kzalloc fial!!");

+		return -1;

+	}

+	memcpy(sock_rpmsg, psock_rpmsg, psock_rpmsg->data_len+sizeof(struct sock_rpmsg));

+	sock_rpmsg->dir = DIR_UPLINK;

+	sock_thread_enqueue_data(sock_rpmsg);

+	//sk_soc_info("sock_send_ipc_msg write len=%d", len);

+	return 0;

+}

+

+int sock_lookup_fd_by_sock(struct sock *sock)

+{

+	struct socket *socket;

+	socket = sock->sk_socket;

+	sk_soc_info("sock_lookup_fd_by_sock socket=%x, socket->fd=%d\n", socket, socket->fd);

+	return socket->fd;

+}

+

+static int sock_channel_clear(struct sock_channel *chninfo)

+{

+    char *tbuf = NULL;

+    unsigned int tlen = chninfo->channel_size/2;

+    int ret = 0;

+

+    tbuf = (char *)kzalloc(tlen,GFP_ATOMIC);

+    if(IS_ERR(tbuf)) {

+        sk_soc_err("kzalloc fail! %d byte.", tlen);

+        return -ENOMEM;

+    }

+    ret = sock_channel_read(chninfo, tbuf, tlen);

+    if(ret < 0) {

+        sk_soc_err("zvnet_channel_read fail!");

+        ret = 0;

+    }

+    kfree(tbuf);

+    sk_soc_err("Drop channel data. %d byte.",ret);

+

+    return ret;

+}

+

+void usock_print(struct unix_sock* usock){	

+	sk_soc_info("usock->rsock.localfd=%d", usock->rsock.localfd);

+	sk_soc_info("usock->rsock.localsocket=%x", usock->rsock.localsocket);

+	sk_soc_info("usock->rsock.proxyfd=%d", usock->rsock.proxyfd);

+	sk_soc_info("usock->rsock.proxysocket=%x", usock->rsock.proxysocket);

+	sk_soc_info("usock->rsock.remotefd=%d", usock->rsock.remotefd);

+	sk_soc_info("usock->rsock.remotesocket=%x", usock->rsock.remotesocket);

+}

+

+void usock_init(struct sock* sock, int localfd, struct socket* localsocket, int proxyfd, struct socket* proxysocket, int remotefd, struct socket* remotesocket){

+	struct unix_sock* usock;

+	if(NULL == sock){

+		return;

+	}

+	usock = unix_sk(sock);

+	usock->rsock.localfd = localfd;

+	usock->rsock.localsocket = localsocket;

+	usock->rsock.proxyfd = proxyfd;

+	usock->rsock.proxysocket = proxysocket;

+	usock->rsock.remotefd = remotefd;

+	usock->rsock.remotesocket = remotesocket;

+}

+

+void usock_update_remote_proxy_socket(struct sock* sock, struct socket* remoteproxysocket)

+{

+	struct unix_sock* usock;

+	usock = unix_sk(sock);

+	usock->rsock.remoteproxysocket = remoteproxysocket;

+}

+

+static struct ipc_socket * sock_create_proxy_socket_server(struct sock_rpmsg* psock_rpmsg)

+{

+	struct ipc_socket *psocket_ipc = NULL;

+	struct socket *sock;

+	

+	int err;	

+	

+	sk_soc_info("clientsock=%x, serversock=%x!\n", psock_rpmsg->clientsock, psock_rpmsg->serversock);

+	psocket_ipc = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->clientsock, psock_rpmsg->serversock);

+	if(NULL != psocket_ipc) {  //Èç¹ûÒѾ­´´½¨¹ýͬһ·þÎñ¶ËµÄ´úÀí£¬Ôò²»ÔÙÖØ¸´´´½¨

+		sk_soc_info("socket_server already exist, do not create again!\n");

+		sock_hold(psocket_ipc->sock); //0705

+		return psocket_ipc;

+	}

+	

+	psocket_ipc = (struct ipc_socket *)kzalloc(sizeof(struct ipc_socket), GFP_ATOMIC);

+	if(NULL == psocket_ipc){		

+		sk_soc_err("kzalloc failed!\n");

+		return NULL;

+	}

+	psocket_ipc->sockfd = __sys_socket(AF_UNIX, psock_rpmsg->socktype, 0); //´´½¨·þÎñ¶Ësocket´úÀí

+	sk_soc_info("sock_create_proxy_socket_server socktype=%d, socket->fd=%d", psock_rpmsg->socktype, psocket_ipc->sockfd);

+	//memcpy(&psocket_ipc->sock, &g_sock_rpmsg.sock, sizeof(struct sock));

+	//psocket_ipc->socket.sk = &psocket_ipc->sock;

+    psocket_ipc->socket = sock_get_local_socket(psocket_ipc->sockfd, &err);

+	if(NULL != psocket_ipc->socket){

+		sk_soc_info("sock_create_proxy_socket_server sucess\n");

+		psocket_ipc->sock = psocket_ipc->socket->sk;		

+		psocket_ipc->proxysocket = psocket_ipc->socket;

+		psocket_ipc->socktype = psock_rpmsg->socktype;

+		set_bit(SOCK_IPCSOCK,&psocket_ipc->sock->sk_flags);

+		psocket_ipc->sock->ipc_flag = 1;

+		psocket_ipc->sock->sk_fd = psocket_ipc->sockfd;

+		//sock_soc_set_socket_info(psocket_ipc->socket, psock_rpmsg->clientsock);

+		sock_hold(psocket_ipc->sock); //0704

+		//³õʼ»¯´úÀísocketµÄusockÐÅÏ¢

+		usock_init(psocket_ipc->sock, psock_rpmsg->clientfd, psock_rpmsg->clientsock, psocket_ipc->sockfd, psocket_ipc->socket, psock_rpmsg->serverfd, psock_rpmsg->serversock);

+		usock_update_remote_proxy_socket(psocket_ipc->sock, psock_rpmsg->serverproxysock);

+		//usock_print(usock);

+	}

+	else{

+		sk_soc_info("sock_create_proxy_socket_server failed, socket = NULL\n");

+	}

+	

+	//ͬ²½·þÎñÆ÷¶ËÅäÖÃ

+	//psocket_ipc->sock->sk_flags = g_sock_rpmsg.sock.sk_flags;

+	//psocket_ipc->sock->sk_state = g_sock_rpmsg.sock.sk_state;

+	//psocket_ipc->sock->sk_shutdown = g_sock_rpmsg.sock.sk_shutdown;

+	//psocket_ipc->sock->sk_receive_queue.qlen = g_sock_rpmsg.sock.sk_receive_queue.qlen;

+	//psocket_ipc->sock->sk_max_ack_backlog = g_sock_rpmsg.sock.sk_max_ack_backlog;

+	psocket_ipc->localfd = psock_rpmsg->clientfd;

+	psocket_ipc->localsocket = psock_rpmsg->clientsock;

+	psocket_ipc->remotefd = psock_rpmsg->serverfd;

+	psocket_ipc->remotesocket = psock_rpmsg->serversock;

+	psocket_ipc->remoteproxyfd = psock_rpmsg->serverproxyfd;

+	psocket_ipc->remoteproxysocket = psock_rpmsg->serverproxysock;

+	psocket_ipc->key = psock_rpmsg->serversock;

+	sk_soc_info("sock_create_proxy_socket_server sockfd=%d, remotefd=%d, key=%x\n", psocket_ipc->sockfd, psocket_ipc->remotefd, psocket_ipc->key);

+	INIT_HLIST_NODE(&psocket_ipc->hlist_node);

+	sock_soc_insert_socket(&psocket_ipc->hlist_node);

+	return psocket_ipc;

+}

+

+static struct ipc_socket * sock_create_proxy_socket_client(struct sock_rpmsg* psock_rpmsg)

+{

+	struct ipc_socket *psocket_ipc = NULL;

+	struct socket *sock;

+	struct unix_sock* usock;

+	int err;

+	

+	//½öƾÕâÁ½¸ö²ÎÊý»¹²»ÄÜÈ·¶¨ÊÇ·ñͬһ¿Í»§¶ËµÄ´úÀí£¬ÒòΪ¶Ô¶Ë¿ÉÄܹرղ¢ÖØÐÂÉú³ÉÒ»¸öÏàͬµØÖ·µÄsocket

+	if(0 == psock_rpmsg->isfistfind){

+		psocket_ipc = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);

+		if(NULL != psocket_ipc) {  //Èç¹ûÒѾ­´´½¨¹ýͬһ¿Í»§¶ËµÄ´úÀí£¬Ôò²»ÔÙÖØ¸´´´½¨

+			//sock_hold(psocket_ipc->sock); //0703

+			return psocket_ipc;

+		}

+	}

+	

+	psocket_ipc = (struct ipc_socket *)kzalloc(sizeof(struct ipc_socket), GFP_ATOMIC);

+	if(NULL == psocket_ipc){		

+		sk_soc_err("kzalloc failed!\n");

+		return NULL;

+	}

+	sk_soc_info("sock_create_proxy_socket_client socktype=%d\n", psock_rpmsg->socktype);

+	psocket_ipc->sockfd = __sys_socket(AF_UNIX, psock_rpmsg->socktype, 0); //´´½¨¿Í»§¶Ësocket´úÀí

+	sk_soc_info("sock_create_proxy_socket_client socket->fd=%d\n", psocket_ipc->sockfd);

+	psocket_ipc->socket = sock_get_local_socket(psocket_ipc->sockfd, &err);

+		

+	//usock_print(usock);	

+	

+	if(NULL != psocket_ipc->socket){

+		sk_soc_info("sockfd_lookup sucess, socket=%x \n", psocket_ipc->socket);

+		//³õʼ»¯´úÀísocketµÄusockÐÅÏ¢

+		usock_init(psocket_ipc->socket->sk, psock_rpmsg->serverfd, psock_rpmsg->serversock, psocket_ipc->sockfd, psocket_ipc->socket, psock_rpmsg->clientfd, psock_rpmsg->clientsock);

+

+		psocket_ipc->sock = psocket_ipc->socket->sk;

+		set_bit(SOCK_IPCSOCK,&psocket_ipc->sock->sk_flags);

+		psocket_ipc->sock->ipc_flag = 1;

+		psocket_ipc->sock->sk_fd = psocket_ipc->sockfd;

+		//sock_hold(psocket_ipc->sock); //todo: clientÊDz»ÊDz»Ó¦¸Ãµ÷ÓÃsock_hold?

+	}

+	else{

+		sk_soc_info("server socket = NULL");

+	}

+	//ÒòΪ´Ëʱ¶Ô¶ËµÄ´úÀísocket»¹Î´´´½¨£¬ËùÒÔÎÞ·¨»ñÈ¡remoteproxyfdºÍremoteproxysocket

+	psocket_ipc->localfd = 	psock_rpmsg->serverfd;

+	psocket_ipc->localsocket = psock_rpmsg->serversock;

+	psocket_ipc->remotefd = psock_rpmsg->clientfd;

+	psocket_ipc->remotesocket = psock_rpmsg->clientsock;	

+	psocket_ipc->proxysocket = psocket_ipc->socket;

+	

+	psocket_ipc->key = psock_rpmsg->clientsock;

+	sk_soc_info("sock_create_proxy_socket_client sockfd=%d,remotefd=%d,key=%x", psocket_ipc->sockfd, psocket_ipc->remotefd,psocket_ipc->key);

+	INIT_HLIST_NODE(&psocket_ipc->hlist_node);

+	sock_soc_insert_socket(&psocket_ipc->hlist_node);

+	return psocket_ipc;

+}

+

+int sock_soc_recvq_full(const struct sock *other)

+{

+	struct sock_rpmsg sock_rpmsg = {0};

+	struct ipc_socket * ipc_socket; 

+	struct sock_rpmsg_info *psock_rpmsg_info;

+	int sockfd;

+	int result;

+	sk_soc_info("sock_soc_recvq_full enter");

+	sock_rpmsg.msg_type = MSG_TYPE_RECVQ_FULL;

+	sockfd = sock_lookup_fd_by_sock(other);

+	//sock_rpmsg.serverfd = sock_lookup_serverfd_by_clientfd(sockfd);

+	//ipc_socket = sock_lookup_server_by_clientfd(sockfd);

+	ipc_socket = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(NULL == ipc_socket){

+		sk_soc_info("sock_soc_recvq_full get ipc_socket faild \n");

+		return -1;

+	}

+	sock_rpmsg.serverfd = ipc_socket->remotefd;

+	sock_rpmsg.serversock = ipc_socket->remotesocket;

+	sock_rpmsg.clientsock = ipc_socket->localsocket;

+	sock_rpmsg.key = other;	

+	psock_rpmsg_info = sock_soc_create_rpmsg_info(sock_rpmsg.key);

+	if(NULL == psock_rpmsg_info){

+		sk_soc_info("sock_soc_recvq_full create rpmsg faild \n");

+		return -1;

+	}

+	sock_send_ipc_msg(&sock_rpmsg);

+	down_timeout(&psock_rpmsg_info->sock_sem, msecs_to_jiffies(g_sock_timeout));

+	result = psock_rpmsg_info->sock_rpmsg.result;

+	sock_soc_del_rpmsg_info(sock_rpmsg.key);

+	return result;

+}

+EXPORT_SYMBOL_GPL(sock_soc_recvq_full);

+

+int sock_soc_recvq_full_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct ipc_socket* ipcsocket;	 

+	struct socket *other;

+	int err;

+	int result;

+	struct sock_rpmsg sock_rpmsg = {0};

+	sk_soc_info("sock_soc_recvq_full_proc serverfd=%d", psock_rpmsg->serverfd);

+	sock_rpmsg.msg_type = MSG_TYPE_RECVQ_FULL_RESULT;

+	sock_rpmsg.key = psock_rpmsg->key;

+	//other = sock_get_local_socket(psock_rpmsg->serverfd, &err);

+	other = (struct socket*)psock_rpmsg->serversock;

+	if(sock_soc_socket_is_valid_ipc(other, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");

+		sock_send_ipc_msg(&sock_rpmsg);

+		return -1;

+	}

+	sock_rpmsg.result = unix_recvq_full_proxy(other->sk);

+	sk_soc_info("sock_soc_recvq_full_proc result=%d\n", sock_rpmsg.result);

+	sock_rpmsg.serverfd = other->fd; //sock_lookup_fd_by_sock(other->sk);

+	sock_send_ipc_msg(&sock_rpmsg);

+	return 0;

+}

+

+int sock_soc_recvq_full_result_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	sk_soc_info("sock_soc_recvq_full_result_proc\n");

+	sock_soc_rsp_proc(psock_rpmsg);

+	return 0;

+}

+

+int sock_soc_recvq_full_lockless_and_dead(const struct sock *other)

+{

+	struct sock_rpmsg sock_rpmsg = {0};

+	struct ipc_socket *ipc_socket;

+	struct sock_rpmsg_info *psock_rpmsg_info;

+	int sockfd;

+	int result;

+	sk_soc_info("sock_soc_recvq_full_lockless_and_dead\n");

+	sock_rpmsg.msg_type = MSG_TYPE_RECVQ_FULL_LOCKLESS_AND_DEAD;

+	sockfd = sock_lookup_fd_by_sock(other);

+	//sock_rpmsg.serverfd = sock_lookup_serverfd_by_clientfd(sockfd);

+	//ipc_socket = sock_lookup_server_by_clientfd(sockfd);

+	ipc_socket = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(NULL == ipc_socket){

+		sk_soc_info("sock_soc_recvq_full_lockless_and_dead get ipc_socket faild \n");

+		return -1;

+	}

+	sock_rpmsg.serverfd = ipc_socket->remotefd;

+	sock_rpmsg.serversock = ipc_socket->remotesocket;

+	sock_rpmsg.clientsock = ipc_socket->localsocket;

+	sock_rpmsg.key = other;

+	psock_rpmsg_info = sock_soc_create_rpmsg_info(sock_rpmsg.key);

+	if(NULL == psock_rpmsg_info){

+		sk_soc_info("sock_soc_recvq_full_lockless_and_dead create rpmsg faild \n");

+		return -1;

+	}

+	sock_send_ipc_msg(&sock_rpmsg);	

+	down_timeout(&psock_rpmsg_info->sock_sem, msecs_to_jiffies(g_sock_timeout));

+	result = psock_rpmsg_info->sock_rpmsg.result;

+	sock_soc_del_rpmsg_info(sock_rpmsg.key);

+	return result;

+}

+EXPORT_SYMBOL_GPL(sock_soc_recvq_full_lockless_and_dead);

+

+int sock_soc_recvq_full_lockless_and_dead_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct ipc_socket* ipcsocket;	 

+	struct socket *other;

+	int err;

+	int result;

+	struct sock_rpmsg sock_rpmsg = {0};

+	sk_soc_info("sock_soc_recvq_full_lockless_and_dead_proc");

+	sock_rpmsg.msg_type = MSG_TYPE_RECVQ_FULL_LOCKLESS_AND_DEAD_RESULT;

+	sock_rpmsg.key = psock_rpmsg->key;

+	//other = sock_get_local_socket(psock_rpmsg->serverfd, &err);

+	other = (struct socket*)psock_rpmsg->serversock;

+	if(sock_soc_socket_is_valid_ipc(other, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");

+		sock_send_ipc_msg(&sock_rpmsg);

+		return -1;

+	}

+	sock_rpmsg.result = unix_recvq_full_proxy_lockless_and_deadstate(other->sk);

+	sock_rpmsg.serverfd = sock_lookup_fd_by_sock(other->sk);

+	sock_send_ipc_msg(&sock_rpmsg);

+	return 0;

+}

+

+int sock_soc_recvq_full_lockless_and_dead_result_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	sk_soc_info("sock_soc_recvq_full_lockless_and_dead_result_proc");

+	sock_soc_rsp_proc(psock_rpmsg);

+	return 0;

+}

+/*

+** sock: ±¾µØsocket

+** other:¶Ô¶ËsocketµÄ±¾µØ´úÀí

+*/

+int sock_soc_set_peer(struct sock *sock, struct sock *other)

+{

+	struct sock_rpmsg sock_rpmsg = {0};

+	struct ipc_socket *ipc_socket;

+	int sockfd; 

+	sock_rpmsg.msg_type = MSG_TYPE_SET_PEER;

+	sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sock);

+	sock_rpmsg.clientsock = sock->sk_socket;

+	sockfd = sock_lookup_fd_by_sock(other);

+	//sock_rpmsg.serverfd = sock_lookup_serverfd_by_clientfd(sockfd);

+	//ipc_socket = sock_lookup_server_by_clientfd(sockfd);

+	ipc_socket = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(NULL == ipc_socket){

+		sk_soc_info("sock_soc_set_peer get ipc_socket faild \n");

+		return -1;

+	}

+	sock_rpmsg.serverfd = ipc_socket->remotefd;

+	sock_rpmsg.serversock = ipc_socket->remotesocket;

+	sk_soc_info("sock_soc_set_peer clientfd=%d, serverfd=%d\n", sock_rpmsg.clientfd, sock_rpmsg.serverfd);

+

+	unix_peer(sock) = other;

+	sock_send_ipc_msg(&sock_rpmsg);

+	return 0;

+}

+EXPORT_SYMBOL_GPL(sock_soc_set_peer);

+

+int sock_soc_set_peer_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct ipc_socket* ipcsocket;

+	struct socket *clientsocket; 

+	struct socket *serversocket;

+	struct sock *sock; 

+	struct sock *other;

+	int err;

+	sk_soc_info("sock_soc_set_peer_proc clientfd=%d, serverfd=%d", psock_rpmsg->clientfd, psock_rpmsg->serverfd);

+	//¶ÔÓÚ·þÎñ¶ËÀ´Ëµ,serversockÊôÓÚ±¾µØsocket£¬clientsockÊôÓÚÔ¶¶Ësocket

+	ipcsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);

+	if(ipcsocket == NULL){

+		sk_soc_info("sock_soc_set_peer_proc failed, clientfd=%d,clientsock=%x\n ", psock_rpmsg->clientfd, psock_rpmsg->clientsock);

+		return -1;

+	}	

+	//clientsocket = (struct socket*)psock_rpmsg->clientsock;

+	sock = ipcsocket->sock;

+	//serversocket = sock_get_local_socket(psock_rpmsg->serverfd, &err);

+	serversocket = (struct socket*)psock_rpmsg->serversock;

+	if(sock_soc_socket_is_valid_ipc(serversocket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");		

+		return -1;

+	}

+	other = serversocket->sk; 

+	

+	unix_peer(sock) = other;

+	sock_hold(other);

+	//unix_peer(other) = sock;

+	return 0;

+}

+

+/*½«ËùÓÐsocket->peer==sockµÄsocket,È«²¿¸üÐÂΪsocket->peer=newsock*/

+//¸Ã½Ó¿ÚÓÃÓÚ·þÎñ¶Ë֪ͨ¿Í»§¶Ë

+int sock_soc_update_peer(struct socket *sock, struct socket *newsock)

+{

+	struct sock_rpmsg sock_rpmsg = {0};

+	struct sock* proxysock;

+	struct ipc_socket* ipcsocket;

+	int sockfd;

+	struct unix_sock* usock;

+	//newsock->sk->peerÖ¸ÏòµÄÊǿͻ§¶Ë´úÀísock

+	proxysock = unix_peer(newsock->sk);

+	usock = unix_sk(proxysock);

+	usock->rsock.localsocket = newsock;

+	ipcsocket = sock_soc_get_ipcsocket_by_proxysock(proxysock);

+	if(NULL != ipcsocket){

+		sock_rpmsg.serversock = ipcsocket->remotesocket;

+		ipcsocket->localsocket = newsock;

+	}else{

+		sk_soc_info("sock_soc_get_ipcsocket_by_proxysock failed, sock=%x", sock);

+		return -1;

+	}

+	sk_soc_info("sock=%x, newsock=%x", sock, newsock);

+	sock_rpmsg.msg_type = MSG_TYPE_UPDATE_PEER;

+	sock_rpmsg.clientfd = sock->fd;

+	sock_rpmsg.clientsock = sock;

+	sock_rpmsg.newclientfd = newsock->fd;	

+	sock_rpmsg.newsock = newsock;

+	sock_soc_del_socket_peer(sock, ipcsocket->proxysocket);

+	sock_soc_insert_socket_peer(newsock, ipcsocket->proxysocket);

+	//newsock->peer = sock->peer; //0706

+	//sock->peer = NULL; //0706

+	sock_rpmsg.key = sock_rpmsg.serversock;

+	sk_soc_info("clientfd=%d, newclientfd=%d\n", sock_rpmsg.clientfd, sock_rpmsg.newclientfd);

+	//sock_soc_del_socket_info(proxysock->sk_socket, sock); //ɾ³ý¾ÉµÄÐÅÏ¢

+	//sock_soc_set_socket_info(proxysock->sk_socket, newsock); //Ìí¼ÓеÄÐÅÏ¢

+	sock_send_ipc_msg(&sock_rpmsg);

+	return 0;

+}

+

+EXPORT_SYMBOL_GPL(sock_soc_update_peer);

+

+int sock_soc_update_peer_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct ipc_socket* ipcsocket;

+	struct socket *clientsocket; 

+	struct socket *serversocket;

+	struct sock *sock; 

+	struct sock *other;

+	struct unix_sock* usock;

+	int err;

+	sk_soc_info("sock_soc_update_peer_proc clientfd=%d, newclientfd=%d", psock_rpmsg->clientfd, psock_rpmsg->newclientfd);

+	ipcsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);

+	if(ipcsocket == NULL){

+		sk_soc_info("sock_soc_update_peer_proc failed, clientfd=%d,clientsock=%x\n ", psock_rpmsg->clientfd, psock_rpmsg->clientsock);

+		return -1;

+	}	

+	sk_soc_info("sock_soc_update_peer_proc sock=%x, newsock=%x", ipcsocket->remotesocket, psock_rpmsg->newsock);

+	ipcsocket->remotefd = psock_rpmsg->newclientfd;

+	ipcsocket->remotesocket = psock_rpmsg->newsock;

+	ipcsocket->key = psock_rpmsg->newsock;

+	usock = unix_sk(ipcsocket->proxysocket->sk);

+	usock->rsock.remotefd = psock_rpmsg->newclientfd;

+	usock->rsock.remotesocket = psock_rpmsg->newsock;

+	sock_soc_rsp_proc(psock_rpmsg);//ÊÍ·ÅconnectµÈ´ýµÄÐźÅÁ¿

+	

+	return 0;

+}

+

+void sock_soc_sock_hold(struct sock *other)

+{

+	struct ipc_socket *psocket_ipc = NULL;

+	struct sock_rpmsg sock_rpmsg = {0};

+	sock_rpmsg.msg_type = MSG_TYPE_SOCK_HOLD;

+	//dump_stack();	

+	//²éÕÒ·þÎñÆ÷¶Ë´úÀísocketÏà¹ØÐÅÏ¢

+	psocket_ipc = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(psocket_ipc == NULL){

+		sk_soc_info("sock_soc_sock_hold failed, other->fd=%d\n ", other->sk_fd);

+		return;

+	}

+	//·þÎñÆ÷¶Ësocket fd

+	sock_rpmsg.serverfd = psocket_ipc->remotefd;

+	sock_rpmsg.serversock = psocket_ipc->remotesocket;

+	sock_rpmsg.clientsock = psocket_ipc->localsocket;

+	sk_soc_info("sock_soc_sock_hold serverfd=%d \n", sock_rpmsg.serverfd);

+	sock_send_ipc_msg(&sock_rpmsg); 

+}

+

+int sock_soc_sock_hold_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct socket* serversocket;	

+	struct sock* other;

+	

+	serversocket = (struct socket*)psock_rpmsg->serversock;

+	if(sock_soc_socket_is_valid_ipc(serversocket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");

+		return -1;

+	}

+	other = serversocket->sk;	

+	

+	sk_soc_info("sock_soc_sock_hold_proc serverfd=%d \n", psock_rpmsg->serverfd);

+	sock_hold(other);

+	return 0;

+}

+

+int sock_soc_sock_put(struct sock *other)

+{

+	struct sock_rpmsg sock_rpmsg = {0};

+	int sockfd;

+	struct ipc_socket *ipc_socket;

+	sock_rpmsg.msg_type = MSG_TYPE_SOCK_PUT;

+	//other->sk_socket¿ÉÄÜÒѱ»ÖÃΪnull

+	if(!other->sk_socket){

+		sockfd = other->sk_fd;

+	}

+	else{

+		sockfd = sock_lookup_fd_by_sock(other);

+	}

+	

+	//sock_rpmsg.serverfd = sock_lookup_serverfd_by_clientfd(sockfd);

+	//ipc_socket = sock_lookup_server_by_clientfd(sockfd);

+	ipc_socket = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(NULL == ipc_socket){

+		sk_soc_info("sock_soc_sock_put get ipc_socket faild \n");

+		return -1;

+	}

+	sock_rpmsg.serverfd = ipc_socket->remotefd;

+	sock_rpmsg.serversock = ipc_socket->remotesocket;

+	sock_rpmsg.clientsock = ipc_socket->localsocket;

+	sk_soc_info("sock_soc_sock_put serverfd=%d\n", sock_rpmsg.serverfd);

+	sock_send_ipc_msg(&sock_rpmsg);

+	return 0;

+}

+EXPORT_SYMBOL_GPL(sock_soc_sock_put);

+

+int sock_soc_sock_put_proc(struct sock_rpmsg* psock_rpmsg)

+{	

+	struct socket *other;

+	int err;	

+	//other = sock_get_local_socket(psock_rpmsg->serverfd, &err);

+	other = (struct socket*)psock_rpmsg->serversock;

+	if(sock_soc_socket_is_valid_ipc(other, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");		

+		return -1;

+	}

+	sk_soc_info("sock_soc_sock_put_proc serversock=%x, serverfd=%d",other, psock_rpmsg->serverfd);

+	

+	if(other->sk){

+		sock_put(other->sk);

+	}

+	

+	return 0;

+}

+

+int sock_soc_msg_send(struct sock *sock, struct sock *other, struct msghdr *msg, size_t len)

+{

+	struct ipc_socket *psocket_ipc = NULL;

+	//struct sock_rpmsg sock_rpmsg = {0};

+	//sock_rpmsg.msg_type = MSG_TYPE_SEND_MSG;

+	struct sock_rpmsg* psock_rpmsg =NULL;

+	

+	psock_rpmsg = sock_create_rpmsg(len);

+	if(psock_rpmsg == NULL){

+		sk_soc_err("sock_soc_msg_send failed, sock_create_rpmsg failed\n ");

+		return -1;

+	}

+	psock_rpmsg->msg_type = MSG_TYPE_SEND_MSG;

+	//¿Í»§¶Ësocket fd

+	psock_rpmsg->clientfd = sock_lookup_fd_by_sock(sock);

+	psock_rpmsg->clientsock = sock->sk_socket;

+	//²éÕÒ·þÎñÆ÷¶Ë´úÀísocketÏà¹ØÐÅÏ¢

+	psocket_ipc = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(psocket_ipc == NULL){

+		sk_soc_info("sock_soc_msg_send failed, other->sk_fd=%d\n ", other->sk_fd);

+		kfree(psock_rpmsg);

+		return -1;

+	}

+	//·þÎñÆ÷¶Ësocket fd

+	psock_rpmsg->serverfd = psocket_ipc->remotefd;

+	psock_rpmsg->serversock = psocket_ipc->remotesocket;

+	psock_rpmsg->clientsock = psocket_ipc->localsocket;

+	

+	psock_rpmsg->msg_flags = msg->msg_flags;

+	sk_soc_info("sock_soc_msg_send clientsock=%x,serversock=%x", psock_rpmsg->clientsock, psock_rpmsg->serversock);

+	//¿½±´·¢Ë͵ÄÊý¾Ý

+	copy_from_iter(psock_rpmsg->data, len, &msg->msg_iter);

+	psock_rpmsg->data_len = len;	

+	//¿½±´socketµØÖ·

+	if(msg->msg_namelen > 0){

+		memcpy(&psock_rpmsg->sockaddr, (struct sockaddr_un*)msg->msg_name, msg->msg_namelen);

+	}

+	psock_rpmsg->addr_len = msg->msg_namelen;

+	sk_soc_info("sock_soc_msg_send clientfd=%d, serverfd=%d, data=%s, len=%d\n", psock_rpmsg->clientfd, psock_rpmsg->serverfd, psock_rpmsg->data, len);

+	sock_send_ipc_msg_data(psock_rpmsg);

+	return 0;

+}

+

+int sock_soc_msg_send_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct ipc_socket* clientsocket;

+	struct socket* serversocket;

+	struct sock* sock;

+	struct sock* other;

+	struct sockaddr __user * p;

+	char __user * q;

+	mm_segment_t old_fs;

+	struct msghdr msg;

+	unsigned int  msg_flags;

+	struct iovec iov;

+	int err;

+	

+	//serversocket = sock_get_local_socket(psock_rpmsg->serverfd, &err);

+	serversocket = (struct socket*)psock_rpmsg->serversock;

+	if(sock_soc_socket_is_valid_ipc(serversocket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");

+		return -1;

+	}

+	other = serversocket->sk;

+

+	clientsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);

+	if(clientsocket == NULL){

+		sk_soc_info("sock_soc_msg_send_proc failed, serversock=%x,clientsock=%x\n ", psock_rpmsg->serversock, psock_rpmsg->clientsock);

+		return -1;

+	}

+	sk_soc_info("sock_soc_msg_send_proc, serversock=%x,clientsock=%x\n ", psock_rpmsg->serversock, psock_rpmsg->clientsock);

+	sock = clientsocket->sock;

+	

+	sk_soc_info("sock_soc_msg_send_proc clientfd=%d, serverfd=%d, len=%d\n", psock_rpmsg->clientfd, psock_rpmsg->serverfd, psock_rpmsg->data_len);

+	sk_soc_info("sock_soc_msg_send_proc psock_rpmsg->addr_len=%d \n",psock_rpmsg->addr_len);

+	old_fs = get_fs();

+	set_fs(KERNEL_DS);

+	sk_soc_info("sock_soc_msg_send_proc data=%s \n",psock_rpmsg->data);

+	if(psock_rpmsg->addr_len > 0){

+		p = (__force struct sockaddr __user *)(&psock_rpmsg->sockaddr);	

+	}

+	q = (__force const char __user *)(psock_rpmsg->data);

+	sk_soc_info("sock_soc_msg_send_proc __sys_sendto=%d \n",clientsocket->sockfd);

+	//todo ʹÓôúÀísocket

+	//__sys_sendto(psock_rpmsg->serverfd, psock_rpmsg->data, psock_rpmsg->data_len, psock_rpmsg->msg_flags, NULL, 0);

+	if(psock_rpmsg->addr_len > 0){

+		err = __sys_sendto(clientsocket->sockfd, psock_rpmsg->data, psock_rpmsg->data_len, psock_rpmsg->msg_flags, (struct sockaddr __user *)&psock_rpmsg->sockaddr, psock_rpmsg->addr_len);

+	}else{

+		err = __sys_sendto(clientsocket->sockfd, psock_rpmsg->data, psock_rpmsg->data_len, psock_rpmsg->msg_flags, NULL, 0);

+	}

+	sk_soc_info("sock_soc_msg_send_proc __sys_sendto err=%d \n", err);	

+	set_fs(old_fs);

+	//other->sk_data_ready(other);

+	//sock_put(other);

+	return 0;

+}

+

+long sock_wait_for_peer(struct sock *sock, struct sock *other, long timeo)

+{

+	struct ipc_socket * ipcsocket;	

+	struct sock_rpmsg sock_rpmsg = {0};

+	sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sock);

+	sock_rpmsg.clientsock = sock->sk_socket;

+	ipcsocket = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(ipcsocket == NULL){

+		sk_soc_info("sock_wait_for_peer failed, other->fd=%d\n ", other->sk_fd);

+		return -1;

+	}

+	sock_rpmsg.serverfd = ipcsocket->remotefd;

+	sock_rpmsg.serversock = ipcsocket->remotesocket;

+	sock_rpmsg.msg_type = MSG_TYPE_WAIT_FOR_PEER;

+	sock_rpmsg.timeo = timeo;

+	sk_soc_info("sock_wait_for_peer clientfd=%d, serverfd=%d", sock_rpmsg.clientfd, sock_rpmsg.serverfd);

+	sock_send_ipc_msg(&sock_rpmsg);

+	return 0;

+}

+

+static int sock_wait_for_peer_thread(void *argv)

+{

+	struct peer_sock_info* peer_info = (struct peer_sock_info*)argv;

+	sk_soc_info("sock_wait_for_peer_thread enter");

+	unix_wait_for_peer_proxy(peer_info->peersock, peer_info->timeo);

+	return 0;

+}

+

+int sock_wait_for_peer_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct ipc_socket *socket_ipc;

+	struct task_struct *th = NULL;

+	struct socket* clientsocket;

+	struct socket* serversocket;

+	int err;

+	socket_ipc = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock); 

+	if(socket_ipc == NULL){

+		sk_soc_err("sock_wait_for_peer_proc failed, clientfd=%d,clientsock=%x\n ", psock_rpmsg->clientfd, psock_rpmsg->clientsock);

+		return -1;

+	}

+	struct peer_sock_info* peer_info = (struct peer_sock_info *)kzalloc(sizeof(struct peer_sock_info), GFP_ATOMIC);

+	if(NULL == peer_info){

+		sk_soc_err("kzalloc failed!");

+		return -1;

+	}

+	peer_info->timeo = psock_rpmsg->timeo;

+	clientsocket= sock_get_local_socket(socket_ipc->sockfd, &err);

+	if(NULL == clientsocket){

+		kfree(peer_info);

+		sk_soc_err("clientsocket is NULL!");

+		return -1;

+	}

+	//clientsocket = (struct socket*)psock_rpmsg->clientsock;//todo

+	peer_info->sock = clientsocket->sk;

+	//serversocket = sock_get_local_socket(psock_rpmsg->serverfd, &err);

+	serversocket = (struct socket*)psock_rpmsg->serversock;

+	if(sock_soc_socket_is_valid_other(serversocket) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");

+		return -1;

+	}

+	peer_info->peersock = serversocket->sk;

+	sk_soc_info("sock_wait_for_peer_proc clientfd=%d, serverfd=%d", socket_ipc->sockfd, psock_rpmsg->serverfd);

+	th = kthread_run(sock_wait_for_peer_thread, peer_info, "wait_for_peer");

+	    if (IS_ERR(th)) {

+	        sk_soc_err("Unable to start receive thread.");

+	        return PTR_ERR(th);

+	    }

+	return 0;

+}

+

+int sock_soc_unix_peer_clear(struct sock *sk)

+{

+	struct sock_rpmsg sock_rpmsg = {0};

+	struct ipc_socket *socket_ipc;

+	sk_soc_info("sock_soc_unix_peer_clear enter\n");

+	//socket_ipc = sock_soc_get_ipcsocket_by_fd(psock_rpmsg->clientfd, psock_rpmsg->clientsock);

+	sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sk);

+	sock_rpmsg.clientsock = sk->sk_socket;

+	sock_rpmsg.msg_type = MSG_TYPE_PEER_CLEAR;

+	sock_send_ipc_msg(&sock_rpmsg);

+	return 0;

+}

+

+int sock_soc_unix_peer_clear_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct socket* socket;

+	struct sock* sock;

+	int err;

+	sk_soc_info("sock_soc_unix_peer_clear_proc enter");

+	//socket = sock_get_local_socket(psock_rpmsg->serverfd, &err);

+	socket = (struct socket*)psock_rpmsg->serversock;

+	if(sock_soc_socket_is_valid_other(socket) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");

+		return -1;

+	}

+	sock = socket->sk;

+	if(sock == NULL){

+		sk_soc_info("sock_soc_unix_peer_clear_proc sock is NULL");		

+		return -1;

+	}

+	unix_sk(sock)->peer = NULL;

+	return 0;

+}

+

+int sock_soc_wake_up_interruptible_poll(struct sock *sk)

+{

+	struct sock_rpmsg sock_rpmsg = {0};	

+	

+	sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sk);

+	sock_rpmsg.clientsock = sk->sk_socket;

+	

+	sock_rpmsg.msg_type = MSG_TYPE_WAKE_UP_INTERRUPTIBLE_POLL;

+	sk_soc_info("sock_soc_wake_up_interruptible_poll clientfd=%d", sock_rpmsg.clientfd);

+	sock_send_ipc_msg(&sock_rpmsg);

+	return 0;

+}

+

+int sock_soc_wake_up_interruptible_poll_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct socket* socket;

+	struct sock* sock;		

+	int err;

+	//serverfd = sock_lookup_serverfd_by_clientfd(psock_rpmsg->clientfd);

+	//socket = sock_get_local_socket(serverfd, &err);

+	socket = (struct socket*)psock_rpmsg->serversock;

+	if(sock_soc_socket_is_valid_other(socket) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");

+		return -1;

+	}

+	sock = socket->sk;

+	if(sock == NULL){

+		sk_soc_info("sock_soc_wake_up_interruptible_poll_proc sock is NULL");		

+		return -1;

+	}

+	

+	wake_up_interruptible_poll(sk_sleep(sock),

+				   EPOLLOUT |

+				   EPOLLWRNORM |

+				   EPOLLWRBAND);

+	return 0;

+}

+

+int sock_soc_sk_data_ready(struct sock *sk)

+{

+	struct sock_rpmsg sock_rpmsg = {0};

+	struct ipc_socket * ipcsocket;

+	ipcsocket = sock_soc_get_ipcsocket_by_proxysock(sk);

+	if(ipcsocket == NULL){

+		sk_soc_info("sock_soc_sk_data_ready failed, sk->fd=%d\n ", sk->sk_fd);

+		return -1;

+	}

+	sock_rpmsg.serverfd = ipcsocket->remotefd;

+	sock_rpmsg.serversock = ipcsocket->remotesocket;

+	sock_rpmsg.clientsock = ipcsocket->localsocket;

+	sk_soc_info("sock_soc_sk_data_ready serverfd=%d", sock_rpmsg.serverfd);

+	sock_rpmsg.msg_type = MSG_TYPE_DATA_READY;

+	sock_send_ipc_msg(&sock_rpmsg);

+	return 0;

+}

+

+int sock_soc_sk_data_ready_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct socket* socket;

+	struct sock* sock;

+	int err;

+	//socket = sock_get_local_socket(psock_rpmsg->serverfd, &err);

+	socket = (struct socket*)psock_rpmsg->serversock;

+	if(sock_soc_socket_is_valid_ipc(socket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");

+		return -1;

+	}

+	sk_soc_info("sock_soc_sk_data_ready_proc serverfd=%d", psock_rpmsg->serverfd);

+	sock = socket->sk;

+	if(sock == NULL){

+		sk_soc_info("sock_soc_sk_data_ready_proc sock is NULL");		

+		return -1;

+	}

+	sock->sk_data_ready(sock);

+	return 0;

+}

+

+int sock_sync_ipc_socket(struct sock_elem_flag* elem_flag, struct sock *other)

+{

+	struct sock_rpmsg sock_rpmsg = {0};

+	struct ipc_socket * ipcsocket;

+	sock_rpmsg.msg_type = MSG_TYPE_SYNC_IPC_SOCKET;

+	memcpy(&sock_rpmsg.elem, elem_flag, sizeof(struct sock_elem_flag));

+	//memcpy(&sock_rpmsg.sock, other, sizeof(struct sock));

+	ipcsocket = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(ipcsocket == NULL){

+		sk_soc_info("sock_sync_ipc_socket failed, other->fd=%d\n ", other->sk_fd);

+		return -1;

+	}

+	sock_rpmsg.serverfd = ipcsocket->remotefd;

+	sock_rpmsg.serversock = ipcsocket->remotesocket;

+	sock_rpmsg.clientsock = ipcsocket->localsocket;

+	sk_soc_info("sock_sync_ipc_socket serverfd=%d", sock_rpmsg.serverfd);

+	sock_send_ipc_msg(&sock_rpmsg);

+	

+	return 0;

+}

+

+int sock_sync_ipc_socket_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct socket* socket;

+	struct sock *other;

+	int err;

+	//socket = sock_get_local_socket(psock_rpmsg->serverfd, &err);

+	socket = (struct socket*)psock_rpmsg->serversock;

+	if(NULL == socket){

+		return -1;

+	}

+	if(sock_soc_socket_is_valid_ipc(socket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");

+		return -1;

+	}

+	other = socket->sk;

+	if(other == NULL){

+		sk_soc_info("sock_sync_ipc_socket_proc other is NULL");		

+		return -1;

+	}

+	sk_soc_info("sock_sync_ipc_socket_proc serverfd=%d", psock_rpmsg->serverfd);

+	if(psock_rpmsg->elem.sk_err){

+		//other->sk_err = psock_rpmsg->sock.sk_err;		

+	}

+

+	if(psock_rpmsg->elem.sk_error_report){

+		other->sk_error_report(other);		

+	}

+	

+	return 0;

+}

+

+int sock_soc_get_state(struct sock_elem_flag* elem_flag, struct sock *other)

+{

+	struct sock_rpmsg sock_rpmsg = {0};

+	struct ipc_socket * ipcsocket;

+	struct sock_rpmsg_info *psock_rpmsg_info;

+	sock_rpmsg.msg_type = MSG_TYPE_GET_SOCKET_STATES;

+	memcpy(&sock_rpmsg.elem, elem_flag, sizeof(struct sock_elem_flag));	

+	ipcsocket = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(ipcsocket == NULL){

+		sk_soc_info("sock_soc_get_state failed, other->fd=%d\n ", other->sk_fd);

+		return -1;

+	}

+	sock_rpmsg.serverfd = ipcsocket->remotefd;

+	sock_rpmsg.serversock = ipcsocket->remotesocket;

+	sock_rpmsg.clientsock = ipcsocket->localsocket;

+	sock_rpmsg.key = other;

+	sk_soc_info("sock_soc_get_state serverfd=%d", sock_rpmsg.serverfd);

+	

+	psock_rpmsg_info = sock_soc_create_rpmsg_info(sock_rpmsg.key);

+	if(NULL == psock_rpmsg_info){

+		sk_soc_info("sock_soc_get_state create rpmsg faild \n");

+		return -1;

+	}

+	sock_send_ipc_msg(&sock_rpmsg);

+	down_timeout(&psock_rpmsg_info->sock_sem, msecs_to_jiffies(g_sock_timeout));

+	

+	if(psock_rpmsg_info->sock_rpmsg.elem.skstate){

+		

+		other->sk_state = psock_rpmsg_info->sock_rpmsg.elem.skstate;

+		sk_soc_info("sk_state=%d", other->sk_state);

+	}

+

+	if(psock_rpmsg_info->sock_rpmsg.elem.skshutdown){

+		other->sk_shutdown = psock_rpmsg_info->sock_rpmsg.elem.skshutdown;

+		sk_soc_info("sk_shutdown=%d", other->sk_shutdown);

+	}

+	sock_soc_del_rpmsg_info(sock_rpmsg.key);

+	sk_soc_info("sock_soc_get_state end");

+	return 0;

+}

+

+int sock_soc_get_state_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct socket* socket;

+	struct sock *other;

+	struct sock_rpmsg sock_rpmsg = {0};

+	int err;

+	sock_rpmsg.msg_type = MSG_TYPE_GET_SOCKET_STATES_RESULT;

+	sock_rpmsg.key = psock_rpmsg->key;

+	sk_soc_info("sock_soc_get_state_proc serverfd=%d", psock_rpmsg->serverfd);

+	//socket = sock_get_local_socket(psock_rpmsg->serverfd, &err);

+	socket = (struct socket*)psock_rpmsg->serversock;

+	if(sock_soc_socket_is_valid_ipc(socket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");

+		sock_send_ipc_msg(&sock_rpmsg);

+		return -1;

+	}

+	if(NULL != socket){

+		sk_soc_info("sock_soc_get_state_proc sucess");

+		other = socket->sk;

+		if(other == NULL){

+			sk_soc_info("sock_soc_get_state_proc other is NULL");

+			sock_send_ipc_msg(&sock_rpmsg);

+			return -1;

+		}

+		if(psock_rpmsg->elem.skstate){

+			sock_rpmsg.elem.skstate = other->sk_state;

+			sk_soc_info("sk_state=%d", other->sk_state);

+		}

+

+		if(psock_rpmsg->elem.skshutdown){

+			sock_rpmsg.elem.skshutdown = other->sk_shutdown;

+			sk_soc_info("sk_shutdown=%d", other->sk_shutdown);

+		}	

+	}

+	else

+	{

+		sk_soc_info("sock_soc_get_state_proc failed");

+	}

+	sock_send_ipc_msg(&sock_rpmsg);	

+	return 0;

+}

+

+int sock_soc_get_state_result_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	sk_soc_info("sock_soc_find_other_result_proc");

+	sock_soc_rsp_proc(psock_rpmsg);

+	return 0;

+}

+

+int sock_soc_test_flags(struct sock *other, enum sock_flags flag)

+{

+	struct sock_rpmsg sock_rpmsg = {0};

+	struct ipc_socket * ipcsocket;

+	struct sock_rpmsg_info *psock_rpmsg_info;

+	int result;

+	sock_rpmsg.msg_type = MSG_TYPE_TEST_FLAG;	

+	ipcsocket = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(ipcsocket == NULL){

+		sk_soc_info("sock_soc_test_flags failed, other->fd=%d\n ", other->sk_fd);

+		return -1;

+	}

+	sock_rpmsg.serverfd = ipcsocket->remotefd;

+	sock_rpmsg.serversock = ipcsocket->remotesocket;

+	sock_rpmsg.clientsock = ipcsocket->localsocket;

+	//sock_rpmsg.flag = flag;

+	sock_rpmsg.flag = convert_to_ap_sock_flag(flag);

+	if(sock_rpmsg.flag == -1)

+	{

+		sk_soc_info("ap do not support flag=%s \n", flag_value[flag]);

+		return 0;

+	}

+	sock_rpmsg.key = other;

+	sk_soc_info("sock_soc_test_flags serverfd=%d", sock_rpmsg.serverfd);

+	

+	psock_rpmsg_info = sock_soc_create_rpmsg_info(sock_rpmsg.key);

+	if(NULL == psock_rpmsg_info){

+		sk_soc_info("sock_soc_get_state create rpmsg faild \n");

+		return -1;

+	}

+	sock_send_ipc_msg(&sock_rpmsg);

+	down_timeout(&psock_rpmsg_info->sock_sem, msecs_to_jiffies(g_sock_timeout));

+	

+	sk_soc_info("sock_soc_test_flags flag=%s, result=%d\n",flag_value[flag], psock_rpmsg_info->sock_rpmsg.result);

+	result = psock_rpmsg_info->sock_rpmsg.result;

+	sock_soc_del_rpmsg_info(sock_rpmsg.key);

+	return result;	

+}

+EXPORT_SYMBOL_GPL(sock_soc_test_flags);

+

+int sock_soc_test_flags_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct sock_rpmsg sock_rpmsg = {0};

+	struct socket* socket;

+	struct sock *other;

+	int err;

+	//socket = sock_get_local_socket(psock_rpmsg->serverfd, &err);

+	sock_rpmsg.msg_type = MSG_TYPE_TEST_FLAG_RESULT;

+	sock_rpmsg.key = psock_rpmsg->key;

+	socket = (struct socket*)psock_rpmsg->serversock;

+	if(sock_soc_socket_is_valid_ipc(socket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");

+		sock_send_ipc_msg(&sock_rpmsg);

+		return -1;

+	}

+	if(NULL == socket){

+		sk_soc_info("sock_soc_test_flags_proc failed, flag=%s", flag_value[psock_rpmsg->flag]);

+		sock_send_ipc_msg(&sock_rpmsg);

+		return -1;

+	}

+	sk_soc_info("sock_soc_test_flags_proc fd=%d\n", socket->fd);

+	other = socket->sk;

+	if(other == NULL){

+		sock_send_ipc_msg(&sock_rpmsg);

+		return -1;

+	}

+	sock_rpmsg.result = test_bit(psock_rpmsg->flag, &other->sk_flags);

+	sk_soc_info("sock_soc_test_flags_proc flag=%s, result=%d", flag_value[psock_rpmsg->flag], sock_rpmsg.result);

+	sock_send_ipc_msg(&sock_rpmsg);

+	return 0;

+}

+

+int sock_soc_test_flags_result_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	sk_soc_info("sock_soc_test_flags_result_proc enter");

+	sock_soc_rsp_proc(psock_rpmsg);

+	

+	return 0;

+}

+

+void sock_soc_add_skb_queue_tail(struct sock *sock, struct sock *other)

+{

+	struct ipc_socket * ipcsocket;	

+	struct sock_rpmsg sock_rpmsg = {0};

+	sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sock);

+	sock_rpmsg.clientsock = sock->sk_socket;

+	ipcsocket = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(ipcsocket == NULL){

+		sk_soc_info("sock_soc_add_skb_queue_tail failed, other->fd=%d\n ", other->sk_fd);

+		return;

+	}

+	sock_rpmsg.serverfd = ipcsocket->remotefd;

+	sock_rpmsg.serversock = ipcsocket->remotesocket;

+	sock_rpmsg.clientsock = ipcsocket->localsocket;

+	sock_rpmsg.msg_type = MSG_TYPE_ADD_SKB_QUEUE_TAIL;

+	sk_soc_info("sock_soc_add_skb_queue_tail clientfd=%d, serverfd=%d", sock_rpmsg.clientfd, sock_rpmsg.serverfd);

+	sock_send_ipc_msg(&sock_rpmsg);

+}

+

+void sock_soc_add_skb_queue_tail_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct ipc_socket * ipcsocket;	

+	struct socket* other;

+	struct sk_buff *skb = NULL;

+	int err;

+	//¸ù¾ÝclientfdÕÒµ½±¾µØ´úÀísocket

+	ipcsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);

+	if(ipcsocket == NULL){

+		sk_soc_info("sock_soc_add_skb_queue_tail_proc failed, clientfd=%d,clientsock=%x\n ", psock_rpmsg->clientfd, psock_rpmsg->clientsock);

+		return;

+	}

+	//other = sockfd_lookup(psock_rpmsg->serverfd, &err);

+	other = (struct socket*)psock_rpmsg->serversock;

+	if(sock_soc_socket_is_valid_ipc(other, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");

+		return;

+	}

+	sk_soc_info("sock_soc_add_skb_queue_tail clientfd=%d, serverfd=%d", psock_rpmsg->clientfd, psock_rpmsg->serverfd);

+	if((NULL != ipcsocket) && (NULL != other)){

+		/* Allocate skb for sending to listening sock */

+		skb = sock_wmalloc(ipcsocket->sock, 1, 0, GFP_KERNEL);

+		if (skb == NULL)

+		{

+			return; 

+		}

+

+		__skb_queue_tail(&other->sk->sk_receive_queue, skb);

+		sk_soc_info("sock_soc_add_skb_queue_tail sucess! \n");

+	}	

+}

+

+void sock_soc_stream_connect(struct sock *sock, struct sock *other, struct sockaddr_un *sunname, int len,int flags)

+{

+	struct ipc_socket * ipcsocket;	

+	struct sock_rpmsg sock_rpmsg = {0};

+	struct sock_rpmsg_info *psock_rpmsg_info;

+	if(len > 0){

+		memcpy(&sock_rpmsg.sockaddr, sunname, sizeof(struct sockaddr_un));

+		sk_soc_info("sock_soc_stream_connect sockaddr=%s", sock_rpmsg.sockaddr.sun_path);

+		sock_rpmsg.addr_len = len;

+	}

+	sock_rpmsg.flags = flags;

+	sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sock);

+	sock_rpmsg.clientsock = sock->sk_socket;

+	ipcsocket = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(ipcsocket == NULL){

+		sk_soc_info("sock_soc_stream_connect failed, other->fd=%d\n ", other->sk_fd);

+		return;

+	}

+	sock_rpmsg.serverfd = ipcsocket->remotefd;

+	sock_rpmsg.serversock = ipcsocket->remotesocket;

+	sock_rpmsg.msg_type = MSG_TYPE_STREAM_CONNECT;

+	sock_rpmsg.key = sock_rpmsg.clientsock;

+	psock_rpmsg_info = sock_soc_create_rpmsg_info(sock_rpmsg.key);

+	if(NULL == psock_rpmsg_info){

+		sk_soc_info("sock_soc_stream_connect create rpmsg faild \n");

+		return;

+	}

+	sock_send_ipc_msg(&sock_rpmsg);

+	//ÒªµÈµ½ÊÕµ½update_peer²ÅÄÜ·µ»Ø

+	down_timeout(&psock_rpmsg_info->sock_sem, msecs_to_jiffies(g_sock_timeout));

+	sk_soc_info("sock_soc_stream_connect clientfd=%d, serverfd=%d\n", sock_rpmsg.clientfd, sock_rpmsg.serverfd);

+	sock_soc_del_rpmsg_info(sock_rpmsg.key);

+}

+

+void sock_soc_stream_connect_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct ipc_socket * ipcsocket;	

+	struct socket* other;

+	struct sk_buff *skb = NULL;

+	struct sock *newsk = NULL;

+	int result = -1;

+	int err;

+	//¸ù¾ÝclientfdÕÒµ½±¾µØ´úÀísocket

+	ipcsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);

+	if(ipcsocket == NULL){

+		sk_soc_info("sock_soc_stream_connect_proc failed, clientfd=%d,clientsock=%x\n ", psock_rpmsg->clientfd, psock_rpmsg->clientsock);

+		return;

+	}

+	//other = sockfd_lookup(psock_rpmsg->serverfd, &err);

+	other = (struct socket*)psock_rpmsg->serversock;

+	

+	sk_soc_info("sock_soc_stream_connect_proc clientfd=%d, serverfd=%d\n", psock_rpmsg->clientfd, psock_rpmsg->serverfd);

+	if((NULL != ipcsocket) && (NULL != other)){

+		sk_soc_info("sockaddr=%s", psock_rpmsg->sockaddr.sun_path);

+		result = unix_stream_connect_proxy(ipcsocket->socket, (struct sockaddr *)&psock_rpmsg->sockaddr, psock_rpmsg->addr_len, psock_rpmsg->flags);

+		if(0 == result){

+			sk_soc_info("sock_soc_stream_connect_proc sucess! ");

+		}else{

+			sk_soc_info("sock_soc_stream_connect_proc failed! ");

+		}	    

+	}	

+}

+

+void sock_soc_add_wait_queue(struct sock *sock, struct sock *other)

+{

+	struct ipc_socket * ipcsocket;	

+	struct sock_rpmsg sock_rpmsg = {0};

+	sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sock);

+	sock_rpmsg.clientsock = sock->sk_socket;

+	ipcsocket = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(ipcsocket == NULL){

+		sk_soc_info("sock_soc_add_wait_queue failed, other->fd=%d\n ", other->sk_fd);

+		return;

+	}

+	sock_rpmsg.serverfd = ipcsocket->remotefd;

+	sock_rpmsg.serversock = ipcsocket->remotesocket;

+	sock_rpmsg.msg_type = MSG_TYPE_ADD_WAIT_QUEUE;

+	sk_soc_info("sock_soc_add_wait_queue enter");

+	sock_send_ipc_msg(&sock_rpmsg);

+}

+

+void sock_soc_add_wait_queue_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct ipc_socket * ipcsocket;	

+	struct socket* socket;

+	int err;

+	//¸ù¾ÝclientfdÕÒµ½±¾µØ´úÀísocket

+	ipcsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);

+	if(ipcsocket == NULL){

+		sk_soc_info("sock_soc_add_wait_queue_proc failed, clientfd=%d,clientsock=%x\n ", psock_rpmsg->clientfd, psock_rpmsg->clientsock);

+		return;

+	}

+	//socket = sockfd_lookup(psock_rpmsg->serverfd, &err);

+	socket = (struct socket*)psock_rpmsg->serversock;

+	

+	sk_soc_info("sock_soc_add_wait_queue_proc clientfd=%d, serverfd=%d", psock_rpmsg->clientfd, psock_rpmsg->serverfd);

+	if((NULL != ipcsocket) && (NULL != socket)){

+		unix_dgram_peer_wake_connect_proxy(ipcsocket->sock, socket->sk);

+	}	

+}

+

+void sock_soc_remove_wait_queue(struct sock *sock, struct sock *other)

+{

+	struct ipc_socket * ipcsocket;	

+	struct sock_rpmsg sock_rpmsg = {0};

+	sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sock);

+	sock_rpmsg.clientsock = sock->sk_socket;

+	ipcsocket = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(ipcsocket == NULL){

+		sk_soc_info("sock_soc_remove_wait_queue failed, other->fd=%d\n ", other->sk_fd);

+		return;

+	}

+	sock_rpmsg.serverfd = ipcsocket->remotefd;

+	sock_rpmsg.serversock = ipcsocket->remotesocket;

+	sock_rpmsg.msg_type = MSG_TYPE_REMOVE_WAIT_QUEUE;

+	sk_soc_info("sock_soc_remove_wait_queue clientfd=%d, serverfd=%d", sock_rpmsg.clientfd, sock_rpmsg.serverfd);

+	sock_send_ipc_msg(&sock_rpmsg);

+}

+

+void sock_soc_remove_wait_queue_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct ipc_socket * ipcsocket;	

+	struct socket* socket;

+	int err;

+	//¸ù¾ÝclientfdÕÒµ½±¾µØ´úÀísocket

+	ipcsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);

+	if(ipcsocket == NULL){

+		sk_soc_info("sock_soc_remove_wait_queue_proc failed, clientfd=%d,clientsock=%x\n ", psock_rpmsg->clientfd, psock_rpmsg->clientsock);

+		return;

+	}

+	//socket = sockfd_lookup(psock_rpmsg->serverfd, &err);

+	socket = (struct socket*)psock_rpmsg->serversock;

+	

+	sk_soc_info("sock_soc_remove_wait_queue_proc clientfd=%d, serverfd=%d", psock_rpmsg->clientfd, psock_rpmsg->serverfd);

+	if((NULL != ipcsocket) && (NULL != socket)){

+		unix_dgram_peer_wake_connect_proxy(ipcsocket->sock, socket->sk);

+	}	

+}

+

+void sock_soc_notify_proxy_change_to_server(struct socket* proxysocket, struct socket* remoteproxysocket)

+{

+	struct sock_rpmsg sock_rpmsg = {0};

+	sock_rpmsg.clientproxyfd = proxysocket->fd;

+	sock_rpmsg.clientproxysock = proxysocket;

+	sock_rpmsg.serverproxysock = remoteproxysocket;

+	sock_rpmsg.msg_type = MSG_TYPE_NOTIFY_PROXY_CHANGE;

+	sk_soc_info("sock_soc_notify_proxy_change_to_server clientproxysock=%x, serverproxysock=%x", sock_rpmsg.clientproxysock, sock_rpmsg.serverproxysock);

+	sock_send_ipc_msg(&sock_rpmsg);

+}

+

+void sock_soc_notify_proxy_change_to_server_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct ipc_socket* ipc_socket;

+	struct socket* serverproxysock;

+	ipc_socket = sock_soc_get_ipcsocket_by_proxysock(psock_rpmsg->serverproxysock);

+	if(NULL != ipc_socket){

+		sk_soc_info("sock_soc_notify_proxy_change_to_server_proc remoteproxysocket=%x", psock_rpmsg->clientproxysock);

+		ipc_socket->remoteproxyfd = psock_rpmsg->clientproxyfd;

+		ipc_socket->remoteproxysocket = psock_rpmsg->clientproxysock;

+		serverproxysock = (struct socket*)psock_rpmsg->serverproxysock;

+		usock_update_remote_proxy_socket(serverproxysock->sk, psock_rpmsg->clientproxysock);

+	}	

+}

+

+struct sock *sock_soc_find_other(struct socket * socket/*int fd*/,

+				    struct sockaddr_un *sunname, int len,

+				    int type, unsigned int hash, int *error)

+{

+	struct sock_rpmsg sock_rpmsg = {0};

+	struct ipc_socket *psocket_ipc = NULL;

+	struct sock_rpmsg_info *psock_rpmsg_info = NULL;

+	int err;

+	static int i = 0;

+	//struct socket *clisocket = sock_get_local_socket(fd, &err);

+	memcpy(&sock_rpmsg.sockaddr, sunname, sizeof(struct sockaddr_un));

+	sock_rpmsg.addr_len = len;

+	sock_rpmsg.socktype = type;

+	sock_rpmsg.hash = hash;

+	sock_rpmsg.clientfd = socket->fd;

+	sock_rpmsg.clientsock = socket;

+	sock_rpmsg.key = socket;

+	sock_rpmsg.msg_type = MSG_TYPE_FIND;	

+	sock_rpmsg.index = i++;

+	sock_rpmsg.isfistfind = 0;

+	

+	if(sock_soc_get_ipcsocket_by_localsocket(socket) == NULL){ //˵Ã÷ÊǵÚÒ»´Î·¢Æð²éÕÒ

+		sock_rpmsg.isfistfind = 1;

+	}

+	psock_rpmsg_info = sock_soc_create_rpmsg_info(sock_rpmsg.key);

+	if(NULL == psock_rpmsg_info){

+		sk_soc_info("sock_soc_find_other create rpmsg faild \n");

+		return NULL;

+	}

+	sk_soc_info("sock_soc_find_other sun_path=%s,index=%d, clientfd=%d, key=%x", sunname->sun_path, sock_rpmsg.index, sock_rpmsg.clientfd, sock_rpmsg.key);

+	sock_send_ipc_msg(&sock_rpmsg);

+	down_timeout(&psock_rpmsg_info->sock_sem, msecs_to_jiffies(g_sock_timeout));

+	

+	if(test_bit(SOCK_OP_RESULT, &psock_rpmsg_info->sock_rpmsg.flags)){		

+		sk_soc_info("sock_soc_find_other sucess serverfd=%d", psock_rpmsg_info->sock_rpmsg.serverfd);

+		psocket_ipc = psock_rpmsg_info->ipc_socket;

+		sk_soc_info("sock_soc_find_other sockfd=%d, remotefd=%d", psocket_ipc->sockfd, psocket_ipc->remotefd);

+		//socket->peer = psocket_ipc->socket;

+		sock_soc_insert_socket_peer(socket, psocket_ipc->proxysocket);

+		sock_soc_del_rpmsg_info(sock_rpmsg.key);

+		sock_soc_notify_proxy_change_to_server(psocket_ipc->proxysocket, psocket_ipc->remoteproxysocket);

+		

+		//sock_soc_set_socket_info(psocket_ipc->socket, socket);

+		return psocket_ipc->sock;

+	} else {

+		sk_soc_info("sock_soc_find_other failed, no matched socket, index=%d", sock_rpmsg.index);

+	}

+	sock_soc_del_rpmsg_info(sock_rpmsg.key);

+	

+	return NULL;

+}

+

+int sock_soc_find_other_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct sock *u;

+	struct ipc_socket *psocket_ipc = NULL;

+	//struct net tmpnet={0};

+	struct sock_rpmsg sock_rpmsg = {0};	

+	int serverfd;

+	int error = -1;

+	unsigned int hash;

+	sk_soc_info("sock_soc_find_other_proc");

+	if((NULL == psock_rpmsg) || (psock_rpmsg->msg_type != MSG_TYPE_FIND)){

+		return -1;

+	}

+	sock_rpmsg.msg_type = MSG_TYPE_FIND_RESULT; 

+	sk_soc_info("sockaddr=%s,socktype=%d, hash=%d",psock_rpmsg->sockaddr.sun_path,psock_rpmsg->socktype,psock_rpmsg->hash);

+	error = unix_mkname_proxy(&psock_rpmsg->sockaddr, psock_rpmsg->addr_len, &hash);

+	if (error < 0){

+		sk_soc_info("unix_mkname_proxy failed, error=%d", error);

+	}

+	sk_soc_info("unix_mkname_proxy sucess, hash=%d", hash);

+	//init_net

+	u = unix_find_other_proxy(&init_net, &psock_rpmsg->sockaddr, psock_rpmsg->addr_len, psock_rpmsg->socktype, hash, &error);

+	if(u){

+		

+		sk_soc_info("find_other_proc: u(%x)->sk_socket=%x\n", u, u->sk_socket);

+		serverfd = sock_lookup_fd_by_sock(u);

+		psock_rpmsg->serverfd = serverfd;

+		psock_rpmsg->serversock = u->sk_socket;

+		psocket_ipc= sock_create_proxy_socket_client(psock_rpmsg);

+		if(NULL != psocket_ipc){

+			psocket_ipc->localsocket = u->sk_socket;

+			set_bit(SOCK_OP_RESULT, &sock_rpmsg.flags);

+			

+			sock_rpmsg.serverfd = serverfd;

+			sock_rpmsg.serversock = u->sk_socket;

+			sock_rpmsg.socktype = u->sk_socket->type;

+			

+			sock_rpmsg.serverproxyfd = psocket_ipc->sockfd;

+			sock_rpmsg.serverproxysock = psocket_ipc->proxysocket;

+			//u->sk_socket->peer = psocket_ipc->socket; //TODO:u¿ÉÄܱ»¶à¸ö¿Í»§¶Ë²éÕÒ£¬´Ë´¦peerÖ¸Ïò´úÀísocketÓÐÎÊÌ⣬ÒòΪ¿ÉÄÜ´æÔÚ¶à¸ö´úÀísocket

+			sock_soc_insert_socket_peer(u->sk_socket, psocket_ipc->proxysocket);

+		}

+				

+		sock_put(u); //0707

+		sk_soc_info("sock_soc_find_other_proc success, socktype=%d, serverfd=%d \n", sock_rpmsg.socktype, sock_rpmsg.serverfd);

+	}

+	else

+	{

+		sk_soc_info("sock_soc_find_other_proc failed, error=%d", error);

+	}

+	sock_rpmsg.key = psock_rpmsg->key;

+	sock_rpmsg.clientfd = psock_rpmsg->clientfd;

+	sock_rpmsg.clientsock = psock_rpmsg->clientsock;

+	

+	sock_send_ipc_msg(&sock_rpmsg);

+

+	return 0;

+}

+

+int sock_soc_find_other_result_proc(struct sock_rpmsg* psock_rpmsg)

+{		

+	struct sock_rpmsg_info *psock_rpmsg_info = NULL;

+	

+	psock_rpmsg_info = sock_soc_get_rpmsg_info(psock_rpmsg->key);

+	if(NULL == psock_rpmsg_info){

+		sk_soc_info("sock_soc_find_other_result_proc failed\n");

+		return -1;

+	}

+	memset(&psock_rpmsg_info->sock_rpmsg, 0, sizeof(struct sock_rpmsg));

+	memcpy(&psock_rpmsg_info->sock_rpmsg, psock_rpmsg, sizeof(struct sock_rpmsg));

+	if(test_bit(SOCK_OP_RESULT, &psock_rpmsg->flags)){

+		psock_rpmsg_info->ipc_socket = sock_create_proxy_socket_server(psock_rpmsg);

+	}

+	up(&psock_rpmsg_info->sock_sem);

+	return 0;

+}

+

+static void delayed_release(struct work_struct *unused)

+{

+	struct llist_node *node = llist_del_all(&delayed_release_list);

+	struct release_socket *rsock, *t;

+	sk_soc_info("delayed_release enter\n");

+	spin_lock(&sock_release_table_lock);

+	llist_for_each_entry_safe(rsock, t, node, list_node){

+		//sock_soc_release_sock(rsock);

+		sock_soc_release_peer(rsock);		

+		kfree(rsock);

+	}

+	spin_unlock(&sock_release_table_lock);

+}

+

+static DECLARE_DELAYED_WORK(delayed_release_work, delayed_release);

+

+void sock_soc_delay_release(struct socket *sock)

+{

+	struct release_socket* prelease_socket = NULL;

+	struct unix_sock* usock;

+	struct socket_info *p;

+	struct hlist_node *n;

+	if(!hlist_empty(&sock->peer)){		

+		spin_lock(&sock_release_peer_lock);

+		hlist_for_each_entry_safe(p, n, &sock->peer, hlist_node) {

+			usock = unix_sk(p->proxysocket->sk);

+			//ÅжÏusockÐÅÏ¢ÊÇ·ñ»¹ÔÚ´úÀíÁ´±íÖÐ

+			if(0 != sock_is_valide_ipc_socket(usock->rsock.localsocket, usock->rsock.proxysocket, usock->rsock.remotesocket)){

+				sk_soc_info("sock_soc_delay_release failed \n");

+				continue;

+			}

+			prelease_socket = (struct release_socket *)kzalloc(sizeof(struct release_socket), GFP_ATOMIC);

+			if(NULL == prelease_socket){

+				sk_soc_info("kzalloc failed \n");

+				continue;

+			}

+			memcpy(prelease_socket, &usock->rsock, sizeof(struct release_socket));			

+			llist_add(&prelease_socket->list_node, &delayed_release_list);			

+			sock_soc_del_socket_info(p->proxysocket, sock);

+		}		

+		

+		INIT_HLIST_HEAD(&sock->peer);

+		spin_unlock(&sock_release_peer_lock);

+		schedule_delayed_work(&delayed_release_work, 1);						

+		//}			

+	}

+}

+

+int sock_soc_release_peer(struct release_socket* rsock)

+{	

+	struct sock_rpmsg sock_rpmsg = {0};

+	struct socket* peersocket;

+	struct ipc_socket * ipcsocket;

+	struct sock* proxy_sock = NULL;

+	//ɾ³ý±¾µØ¶ÔÓ¦µÄ´úÀísocket

+	if(rsock->proxysocket){		

+		sk_soc_info("sock_soc_release_peer close fd=%d \n", rsock->proxysocket->fd);

+		sock_rpmsg.socktype = rsock->proxysocket->type;

+		//ipcsocket = sock_soc_get_ipcsocket(rsock->sock->sk); //0706¸ù¾Ý±¾µØ´úÀísocket,ÕÒµ½¶ÔÓ¦·þÎñ¶Ësocket 

+		if(NULL != rsock->remotesocket){

+			sock_rpmsg.serverfd = rsock->remotefd;

+			sock_rpmsg.serversock = rsock->remotesocket;

+		}else{

+			sk_soc_info("sock_soc_get_ipcsocket_by_proxysock failed \n");

+		}

+		

+	    spin_lock(&sock_release_lock);

+		

+		rsock->proxysocket->sk->closed = 1;

+		proxy_sock = rsock->proxysocket->sk->proxy_sock;

+		sys_close(rsock->proxysocket->fd);

+		if(proxy_sock != NULL){ //0706

+			unix_release_sock_proxy(proxy_sock);

+		}

+		//Ç°ÃæÒѾ­É¾³ý¹ýÁË

+		//sock_del_ipc_socket_by_proxysocket(rsock->proxysocket);

+		spin_unlock(&sock_release_lock);

+	}

+	sock_rpmsg.clientfd = rsock->localfd;

+	sock_rpmsg.clientsock = rsock->localsocket;

+	sock_rpmsg.serversock = rsock->remotesocket;

+	sock_rpmsg.serverproxysock = rsock->remoteproxysocket;

+	sock_rpmsg.msg_type = MSG_TYPE_RELEASE_PEER;

+	sk_soc_info("sock_soc_release_peer clientfd=%d \n", sock_rpmsg.clientfd);

+	sock_send_ipc_msg(&sock_rpmsg);

+	return 0;

+}

+

+int sock_soc_release_peer_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct ipc_socket * ipcsocket;	

+	struct socket* proxysocket;

+	struct socket* serversocket;

+	struct sock* skpair;

+	int			type;

+	int closefd;

+	int err;

+	sk_soc_info("sock_soc_release_peer_proc clientfd=%d \n", psock_rpmsg->clientfd);

+	//¸ù¾ÝclientfdÕÒµ½±¾µØ´úÀísocket

+	spin_lock(&sock_release_lock);

+	//ÅжÏsocketÐÅÏ¢ÊÇ·ñ»¹ÔÚ´úÀíÁ´±íÖÐ

+	if(0 != sock_is_valide_ipc_socket(psock_rpmsg->serversock, psock_rpmsg->serverproxysock, psock_rpmsg->clientsock)){

+		sk_soc_info("sock_soc_release_peer_proc failed, sock_is_valide_ipc_socket=false \n");

+		spin_unlock(&sock_release_lock);

+	    return -1;

+	}

+	

+	ipcsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);

+	if(ipcsocket != NULL){

+		type = psock_rpmsg->socktype;

+		sk_soc_info("sock_soc_release_peer_proc close sockfd=%d, socktype=%d\n", ipcsocket->sockfd, type);

+		//sock_soc_del_socket_info(ipcsocket->socket, ipcsocket->localsocket); //0706 ½«´úÀísocket´ÓsocketsÁбíÖÐɾ³ý

+		

+		serversocket = (struct socket*)psock_rpmsg->serversock;

+		proxysocket = (struct socket*)ipcsocket->proxysocket;

+		//ĿǰSOCK_STREAMºÍSOCK_DGRAMÊÍ·ÅÁ÷³ÌÓÐÇø±ð

+		if(type == SOCK_STREAM){

+			//sock_del_ipc_socket_by_socket(ipcsocket->proxysocket);

+			skpair = serversocket->sk;

+			unix_state_lock(skpair);

+			/* No more writes */

+			skpair->sk_shutdown = SHUTDOWN_MASK;

+			//if (!skb_queue_empty(&sk->sk_receive_queue) || embrion)

+			//	serversocket->sk_err = ECONNRESET;

+			unix_state_unlock(skpair);

+			skpair->sk_state_change(skpair);

+			sk_wake_async(skpair, SOCK_WAKE_WAITD, POLL_HUP);

+		}else if(type == SOCK_DGRAM){

+			

+			sock_soc_del_socket_peer(serversocket, proxysocket);	

+			ipcsocket->sock->closed = 1;

+			closefd = ipcsocket->sockfd;

+			sock_soc_del_socket_info(ipcsocket->socket, ipcsocket->localsocket); //0706 ½«´úÀísocket´ÓsocketsÁбíÖÐɾ³ý

+			

+			sys_close(closefd);				

+		}		

+	}else{

+		sk_soc_info("sock_soc_release_peer_proc failed ");

+	}

+	spin_unlock(&sock_release_lock);

+	return 0;

+}

+

+int sock_soc_dgram_disconnected(struct sock *sock, struct sock *other)

+{

+	struct ipc_socket *psocket_ipc = NULL;

+	struct sock_rpmsg sock_rpmsg = {0};

+	sock_rpmsg.msg_type = MSG_TYPE_DGRAM_DISCONNECTED;

+	

+	//¿Í»§¶Ësocket fd

+	sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sock);

+	sock_rpmsg.clientsock = sock->sk_socket;

+	//²éÕÒ·þÎñÆ÷¶Ë´úÀísocketÏà¹ØÐÅÏ¢

+	psocket_ipc = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(psocket_ipc == NULL){

+		sk_soc_info("sock_soc_remove_wait_queue failed, other->fd=%d\n ", other->sk_fd);

+		return -1;

+	}

+	//·þÎñÆ÷¶Ësocket fd

+	sock_rpmsg.serverfd = psocket_ipc->remotefd;

+	sock_rpmsg.serversock = psocket_ipc->remotesocket;

+	sk_soc_info("sock_soc_dgram_disconnected clientfd=%d, serverfd=%d \n", sock_rpmsg.clientfd, sock_rpmsg.serverfd);

+	sock_send_ipc_msg(&sock_rpmsg);

+	return 0;

+}

+

+int sock_soc_dgram_disconnected_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct ipc_socket* clientsocket;

+	struct socket* serversocket;

+	struct sock* sock;

+	struct sock* other;

+	

+	serversocket = (struct socket*)psock_rpmsg->serversock;

+	if(sock_soc_socket_is_valid_ipc(serversocket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");

+		return -1;

+	}

+	other = serversocket->sk;

+

+	clientsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);

+	if(clientsocket == NULL){

+		sk_soc_info("sock_soc_dgram_disconnected_proc failed, clientfd=%d,clientsock=%x\n ", psock_rpmsg->clientfd, psock_rpmsg->clientsock);

+		return -1;

+	}

+	sock = clientsocket->sock;

+	

+	sk_soc_info("sock_soc_dgram_disconnected_proc clientfd=%d, serverfd=%d \n", psock_rpmsg->clientfd, psock_rpmsg->serverfd);

+	unix_dgram_disconnected_proxy(sock, other);

+	return 0;

+}

+

+void sock_soc_state_lock(struct sock *other)

+{

+	struct ipc_socket *psocket_ipc = NULL;

+	struct sock_rpmsg sock_rpmsg = {0};

+	sock_rpmsg.msg_type = MSG_TYPE_STATE_LOCK;

+		

+	//²éÕÒ·þÎñÆ÷¶Ë´úÀísocketÏà¹ØÐÅÏ¢

+	psocket_ipc = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(psocket_ipc == NULL){

+		sk_soc_info("sock_soc_state_lock failed, other->fd=%d\n ", other->sk_fd);

+		return;

+	}

+	//·þÎñÆ÷¶Ësocket fd

+	sock_rpmsg.serverfd = psocket_ipc->remotefd;

+	sock_rpmsg.serversock = psocket_ipc->remotesocket;

+	sock_rpmsg.clientsock = psocket_ipc->localsocket;

+	sk_soc_info("sock_soc_state_lock serverfd=%d \n", sock_rpmsg.serverfd);

+	sock_send_ipc_msg(&sock_rpmsg); 

+}

+

+int sock_soc_state_lock_proc(struct sock_rpmsg* psock_rpmsg)

+{	

+	struct socket* serversocket;	

+	struct sock* other;

+	

+	serversocket = (struct socket*)psock_rpmsg->serversock;

+	if(sock_soc_socket_is_valid_ipc(serversocket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");

+		return -1;

+	}

+	other = serversocket->sk;	

+	

+	sk_soc_info("sock_soc_state_lock_proc serverfd=%d \n", psock_rpmsg->serverfd);

+	unix_state_lock(other);

+	return 0;

+}

+

+void sock_soc_state_unlock(struct sock *other)

+{

+	struct ipc_socket *psocket_ipc = NULL;

+	struct sock_rpmsg sock_rpmsg = {0};

+	sock_rpmsg.msg_type = MSG_TYPE_STATE_UNLOCK;

+		

+	//²éÕÒ·þÎñÆ÷¶Ë´úÀísocketÏà¹ØÐÅÏ¢

+	psocket_ipc = sock_soc_get_ipcsocket_by_proxysock(other);

+	if(psocket_ipc == NULL){

+		sk_soc_info("sock_soc_state_unlock failed, other->fd=%d\n ", other->sk_fd);

+		return;

+	}

+	//·þÎñÆ÷¶Ësocket fd

+	sock_rpmsg.serverfd = psocket_ipc->remotefd;

+	sock_rpmsg.serversock = psocket_ipc->remotesocket;

+	sock_rpmsg.clientsock = psocket_ipc->localsocket;

+	sk_soc_info("sock_soc_state_unlock serverfd=%d \n", sock_rpmsg.serverfd);

+	sock_send_ipc_msg(&sock_rpmsg); 

+}

+

+int sock_soc_state_unlock_proc(struct sock_rpmsg* psock_rpmsg)

+{

+	struct socket* serversocket;	

+	struct sock* other;

+	

+	serversocket = (struct socket*)psock_rpmsg->serversock;

+	if(sock_soc_socket_is_valid_ipc(serversocket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ

+		sk_soc_info("sock_soc_socket_is_valid is false \n");

+		return -1;

+	}

+	other = serversocket->sk;	

+	

+	sk_soc_info("sock_soc_state_unlock_proc serverfd=%d \n", psock_rpmsg->serverfd);

+	unix_state_lock(other);

+	return 0;

+}

+

+static int sock_create_icp_channel(T_RpMsg_CoreID core_id, T_RpMsg_ChID channel_id, unsigned int channel_size)

+{

+    int retval;

+

+    retval = sockSocCreateChannel (core_id, channel_id, channel_size);

+    if(retval != RPMSG_SUCCESS && retval != RPMSG_CHANNEL_ALREADY_EXIST)

+        goto out;

+

+	sk_soc_info("sock_create_icp_channel success");

+    return retval;

+

+out:

+    sk_soc_err("could not create channel.");

+    return retval;

+}

+

+static void sock_dld_handle(struct	sock_rpmsg* sock_rpmsg)

+{

+	int len;	

+	len = sock_channel_write(&g_sock_chn_info, sock_rpmsg, sock_rpmsg->data_len + sizeof(struct sock_rpmsg));

+	sk_soc_info("sock_dld_handle len=%d, index=%d", len, sock_rpmsg->index);

+	return;

+}

+static void sock_uld_handle(struct	sock_rpmsg* sock_rpmsg)

+{

+	if(NULL == sock_rpmsg){

+		return;

+	}

+	

+	switch(sock_rpmsg->msg_type) {

+		case MSG_TYPE_FIND:

+			sock_soc_find_other_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_FIND_RESULT:

+			sock_soc_find_other_result_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_ADD_WAIT_QUEUE:

+			sock_soc_add_wait_queue_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_REMOVE_WAIT_QUEUE:

+			sock_soc_remove_wait_queue_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_SYNC_IPC_SOCKET:

+			sock_sync_ipc_socket_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_WAIT_FOR_PEER:

+			sock_wait_for_peer_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_DATA_READY:

+			sock_soc_sk_data_ready_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_SEND_MSG:

+			sock_soc_msg_send_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_ADD_SKB_QUEUE_TAIL:

+			sock_soc_add_skb_queue_tail_proc(sock_rpmsg);

+			break;	

+		case MSG_TYPE_SET_PEER:

+			sock_soc_set_peer_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_RECVQ_FULL:

+			sock_soc_recvq_full_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_RECVQ_FULL_RESULT:

+			sock_soc_recvq_full_result_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_PEER_CLEAR:

+			sock_soc_unix_peer_clear_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_WAKE_UP_INTERRUPTIBLE_POLL:

+			sock_soc_wake_up_interruptible_poll_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_RECVQ_FULL_LOCKLESS_AND_DEAD:

+			sock_soc_recvq_full_lockless_and_dead_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_RECVQ_FULL_LOCKLESS_AND_DEAD_RESULT:

+			sock_soc_recvq_full_lockless_and_dead_result_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_TEST_FLAG:

+			sock_soc_test_flags_proc(sock_rpmsg);					

+			break;

+		case MSG_TYPE_TEST_FLAG_RESULT:

+			sock_soc_test_flags_result_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_SOCK_PUT:

+			sock_soc_sock_put_proc(sock_rpmsg);

+			break;					

+		case MSG_TYPE_GET_SOCKET_STATES:

+			sock_soc_get_state_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_GET_SOCKET_STATES_RESULT:

+			sock_soc_get_state_result_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_STREAM_CONNECT:

+			sock_soc_stream_connect_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_UPDATE_PEER:

+			sock_soc_update_peer_proc(sock_rpmsg);

+			break;		

+		case MSG_TYPE_DGRAM_DISCONNECTED:

+			sock_soc_dgram_disconnected_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_STATE_LOCK:

+			sock_soc_state_lock_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_STATE_UNLOCK:

+			sock_soc_state_unlock_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_SOCK_HOLD:

+			sock_soc_sock_hold_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_RELEASE_PEER:

+			sock_soc_release_peer_proc(sock_rpmsg);

+			break;

+		case MSG_TYPE_NOTIFY_PROXY_CHANGE:

+			sock_soc_notify_proxy_change_to_server_proc(sock_rpmsg);

+			break;

+		default:

+		    break;

+	}

+}

+

+static int sock_receive_thread(void *argv)

+{   

+	int index,ret_len,i,num;

+    unsigned long flags;

+	//static struct sock_rpmsg sock_rpmsg = {0};

+	static char recvbuf[SOCK_DATA_MAX_LEN] = {0};

+	sk_soc_info("sock_receive_thread process");

+	while(1){

+		if(0 < sock_channel_read(&g_sock_chn_info, recvbuf, sizeof(recvbuf))) {

+			//sk_soc_info("sock_receive_thread sock_rpmsg.msg_type=%d,index=%d", sock_rpmsg.msg_type, sock_rpmsg.index);	

+#if 1

+			sock_recv_ipc_msg((struct sock_rpmsg*)recvbuf);

+#else

+	        switch(sock_rpmsg.msg_type) {

+				case MSG_TYPE_FIND:

+					sock_soc_find_other_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_FIND_RESULT:

+					sock_soc_find_other_result_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_ADD_WAIT_QUEUE:

+					sock_soc_add_wait_queue_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_REMOVE_WAIT_QUEUE:

+					sock_soc_remove_wait_queue_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_SYNC_IPC_SOCKET:

+					sock_sync_ipc_socket_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_WAIT_FOR_PEER:

+					sock_wait_for_peer_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_DATA_READY:

+					sock_soc_sk_data_ready_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_SEND_MSG:

+					sock_soc_msg_send_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_ADD_SKB_QUEUE_TAIL:

+					sock_soc_add_skb_queue_tail_proc(&sock_rpmsg);

+					break;	

+				case MSG_TYPE_SET_PEER:

+					sock_soc_set_peer_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_RECVQ_FULL:

+					sock_soc_recvq_full_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_RECVQ_FULL_RESULT:

+					sock_soc_recvq_full_result_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_PEER_CLEAR:

+					sock_soc_unix_peer_clear_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_WAKE_UP_INTERRUPTIBLE_POLL:

+					sock_soc_wake_up_interruptible_poll_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_RECVQ_FULL_LOCKLESS_AND_DEAD:

+					sock_soc_recvq_full_lockless_and_dead_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_RECVQ_FULL_LOCKLESS_AND_DEAD_RESULT:

+					sock_soc_recvq_full_lockless_and_dead_result_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_TEST_FLAG:

+					sock_soc_test_flags_proc(&sock_rpmsg);					

+					break;

+				case MSG_TYPE_TEST_FLAG_RESULT:

+					sock_soc_test_flags_result_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_SOCK_PUT:

+					sock_soc_sock_put_proc(&sock_rpmsg);

+					break;					

+				case MSG_TYPE_GET_SOCKET_STATES:

+					sock_soc_get_state_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_GET_SOCKET_STATES_RESULT:

+					sock_soc_get_state_result_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_STREAM_CONNECT:

+					sock_soc_stream_connect_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_UPDATE_PEER:

+					sock_soc_update_peer_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_SOCKET_RELEASE:

+					sock_soc_release_sock_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_DGRAM_DISCONNECTED:

+					sock_soc_dgram_disconnected_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_STATE_LOCK:

+					sock_soc_state_lock_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_STATE_UNLOCK:

+					sock_soc_state_unlock_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_SOCK_HOLD:

+					sock_soc_sock_hold_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_RELEASE_PEER:

+					sock_soc_release_peer_proc(&sock_rpmsg);

+					break;

+				case MSG_TYPE_NOTIFY_PROXY_CHANGE:

+					sock_soc_notify_proxy_change_to_server_proc(&sock_rpmsg);

+					break;

+				default:

+				    break;

+			}

+#endif			

+	    }

+	    else {

+	        sk_soc_err("sock_channel_read fail.");

+	        msleep(1000);

+			continue;

+	    } 

+		

+	}      

+

+    sk_soc_err("The receive thread exit!");

+    return 0;

+}

+

+static int sock_main_thread(void *argv)

+{ 	

+	struct list_head	tmp_list;

+	struct sock_rpmsg *entry,*tmp_entry;

+	unsigned long flags;

+	struct sock_thread_info* p_main_thread_info;

+	p_main_thread_info = &g_sock_chn_info.main_thread_info;

+	

+	while(!p_main_thread_info->bstop) {

+		sock_get_sema(&p_main_thread_info->p_sock_sem);

+

+		spin_lock_irqsave(&p_main_thread_info->p_sock_lock,flags);	

+		if (list_empty(&p_main_thread_info->p_sock_list)) {

+			spin_unlock_irqrestore(&p_main_thread_info->p_sock_lock,flags);

+			continue;

+		}

+		list_replace_init(&p_main_thread_info->p_sock_list,&tmp_list);

+		list_del_init(&p_main_thread_info->p_sock_list);		

+		spin_unlock_irqrestore(&p_main_thread_info->p_sock_lock,flags);

+

+		list_for_each_entry_safe(entry,tmp_entry,&tmp_list,list) {

+			if(DIR_DOWNLINK == entry->dir) {				

+				sock_dld_handle(entry);

+			}

+			else if(DIR_UPLINK == entry->dir) {

+				sock_uld_handle(entry);				

+			}

+			else {

+				sk_soc_warn("sock data unknow dir(%d).",entry->dir);

+			}

+			list_del(&entry->list);

+			kfree(entry);

+		}

+	}

+

+	sk_soc_err("the sock_main_thread stop!\n");	

+

+    return 0;

+}

+

+static int __init sock_soc_init(void)

+{

+	struct task_struct *th = NULL;

+	int retval = 0;

+	struct sock_thread_info* p_main_thread_info;

+	

+	sema_init(&g_sock_sem, 0);

+	g_sock_chn_info.core_id = CORE_PS0;

+	g_sock_chn_info.channel_id = ICP_CHN_SOCKET;

+	g_sock_chn_info.channel_size = ICP_CHANNEL_SIZE;

+	

+	sk_soc_info("sock_soc_init process\n");

+	INIT_HLIST_HEAD(&g_ipc_sockets);

+	INIT_HLIST_HEAD(&g_sock_rpmsg_info);

+	INIT_HLIST_HEAD(&g_sockets_info);

+	retval = sock_create_icp_channel(CORE_PS0, ICP_CHN_SOCKET, ICP_CHANNEL_SIZE);

+	if(retval < 0) {

+		sk_soc_err("Create IcpChannel channel_32 fail.");

+		return retval;

+	}

+	

+	p_main_thread_info = &g_sock_chn_info.main_thread_info;

+	

+	INIT_LIST_HEAD(&p_main_thread_info->p_sock_list);

+	spin_lock_init(&p_main_thread_info->p_sock_lock);

+	sema_init(&p_main_thread_info->p_sock_sem, 0);

+	

+	th = kthread_run(sock_main_thread, 0, "sock-soc-main%d", ICP_CHN_SOCKET);

+	if (IS_ERR(th)) {

+		sk_soc_err("Unable to start receive thread.");

+		return PTR_ERR(th);

+	}

+	g_sock_chn_info.main_thread_info.p_thread = th;

+	

+	th = kthread_run(sock_receive_thread, 0, "sock-soc-recv%d", ICP_CHN_SOCKET);

+	if (IS_ERR(th)) {

+		sk_soc_err("Unable to start receive thread.");

+		return PTR_ERR(th);

+	}

+	g_sock_chn_info.recv_thread_info.p_thread = th;

+	

+	return 0;

+}

+

+static void __exit sock_soc_exit(void)

+{

+    memset(&g_sock_chn_info, 0, sizeof(struct sock_channel));

+    sk_soc_warn("success.\n");

+}

+

+late_initcall(sock_soc_init);

+module_exit(sock_soc_exit);

+

+MODULE_AUTHOR("ZXIC");

+MODULE_DESCRIPTION("ZXIC CAP LAN NET DEVICE");

+MODULE_LICENSE("GPL");

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/unix/af_unix.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/unix/af_unix.c
old mode 100644
new mode 100755
index 28721e9..2e3a779
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/unix/af_unix.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/net/unix/af_unix.c
@@ -115,6 +115,11 @@
 #include <linux/file.h>
 
 #include "scm.h"
+#ifdef CONFIG_IPC_SOCKET
+#include <linux/socket_rpmsg.h>
+int socket_rpmsg_debug = 0;
+module_param(socket_rpmsg_debug, int, 0644);
+#endif
 
 struct hlist_head unix_socket_table[2 * UNIX_HASH_SIZE];
 EXPORT_SYMBOL_GPL(unix_socket_table);
@@ -191,6 +196,12 @@
 
 static inline int unix_recvq_full(const struct sock *sk)
 {
+#ifdef CONFIG_IPC_SOCKET
+	if(unix_is_ipc_socket(sk)){
+		return sock_soc_recvq_full(sk);
+	} 
+#endif
+
 	return skb_queue_len(&sk->sk_receive_queue) > sk->sk_max_ack_backlog;
 }
 
@@ -388,6 +399,11 @@
 	if (!u->peer_wake.private) {
 		u->peer_wake.private = other;
 		__add_wait_queue(&u_other->peer_wait, &u->peer_wake);
+#if CONFIG_IPC_SOCKET
+		if(unix_is_ipc_socket(other)){
+			sock_soc_add_wait_queue(sk, other);
+		}
+#endif
 
 		rc = 1;
 	}
@@ -407,6 +423,11 @@
 
 	if (u->peer_wake.private == other) {
 		__remove_wait_queue(&u_other->peer_wait, &u->peer_wake);
+#if CONFIG_IPC_SOCKET
+	if(unix_is_ipc_socket(other)){
+		sock_soc_remove_wait_queue(sk, other);
+	}
+#endif
 		u->peer_wake.private = NULL;
 	}
 
@@ -421,6 +442,11 @@
 				   EPOLLOUT |
 				   EPOLLWRNORM |
 				   EPOLLWRBAND);
+#if CONFIG_IPC_SOCKET
+	if(unix_is_ipc_socket(other)){
+		//unix_dgram_peer_wake_disconnect_wakeup(sk, other);
+	}
+#endif
 }
 
 /* preconditions:
@@ -438,9 +464,20 @@
 	 * -ECONNREFUSED. Otherwise, if we haven't queued any skbs
 	 * to other and its full, we will hang waiting for POLLOUT.
 	 */
+#ifdef CONFIG_IPC_SOCKET
+	if(unix_is_ipc_socket(other)){
+		if(sock_soc_recvq_full_lockless_and_dead(other)){
+			return 1;
+		}
+	}
+	else{
+#endif
 	if (unix_recvq_full_lockless(other) && !sock_flag(other, SOCK_DEAD))
 		return 1;
-
+	
+#ifdef CONFIG_IPC_SOCKET
+	}
+#endif
 	if (connected)
 		unix_dgram_peer_wake_disconnect(sk, other);
 
@@ -487,6 +524,11 @@
 			other->sk_error_report(other);
 		}
 	}
+#ifdef CONFIG_IPC_SOCKET
+	if(unix_is_ipc_socket(other)){ //Èç¹ûotherÊÇ´úÀísocket£¬Ôò֪ͨÆä¶ÔÓ¦µÄʵÌåÖ´ÐÐÏàͬ²Ù×÷
+		sock_soc_dgram_disconnected(sk, other);
+	}			
+#endif	
 }
 
 static void unix_sock_destructor(struct sock *sk)
@@ -878,6 +920,14 @@
 
 	if (!sk)
 		return 0;
+#ifdef CONFIG_IPC_SOCKET //ÊͷŸÃsocket¶ÔÓ¦µÄ´úÀí
+	if(!hlist_empty(&sock->peer)){
+		//printk("sock->peer->fd=%d \n", sock->peer->fd);
+		sock_soc_delay_release(sock);		
+	}else{
+		printk("sock->peer is null \n");
+	}
+#endif
 
 	unix_release_sock(sk, 0);
 	sock->sk = NULL;
@@ -1171,9 +1221,19 @@
 
 restart:
 		other = unix_find_other(net, sunaddr, alen, sock->type, hash, &err);
-		if (!other)
-			goto out;
+		if (!other) {
+#ifdef CONFIG_IPC_SOCKET
+			sk_soc_info("unix_dgram_connect sock_soc_find_other\n");
 
+			/*±¾µØ²éÕÒ²»µ½£¬Ôò½øÐпçºË²éÕÒ*/
+			other = sock_soc_find_other(sock, sunaddr, alen, sock->type, hash, &err);
+				
+			if (!other)
+#endif				
+			{
+				goto out;
+			}
+		}
 		unix_state_double_lock(sk, other);
 
 		/* Apparently VFS overslept socket death. Retry. */
@@ -1214,6 +1274,12 @@
 		sock_put(old_peer);
 	} else {
 		unix_peer(sk) = other;
+#ifdef CONFIG_IPC_SOCKET
+		if(unix_is_ipc_socket(other)){ //Èç¹ûotherÊÇ´úÀísocket£¬Ôò֪ͨÆä¶ÔÓ¦µÄʵÌåÖ´ÐÐÏàͬ²Ù×÷
+			sk_soc_info("unix_dgram_connect sock_soc_set_peer\n");
+			sock_soc_set_peer(sk, other);
+		}
+#endif
 		unix_state_double_unlock(sk, other);
 	}
 	return 0;
@@ -1293,8 +1359,20 @@
 restart:
 	/*  Find listening sock. */
 	other = unix_find_other(net, sunaddr, addr_len, sk->sk_type, hash, &err);
-	if (!other)
-		goto out;
+	if (!other){
+		
+#ifdef CONFIG_IPC_SOCKET
+		sk_soc_info("unix_stream_connect sock_soc_find_other\n");
+		/*±¾µØ²éÕÒ²»µ½£¬Ôò½øÐпçºË²éÕÒ*/
+		other = sock_soc_find_other(sock, sunaddr, addr_len, sock->type, hash, &err);
+			
+		if (!other)
+#endif				
+        {
+			goto out;
+		}
+		
+	}
 
 	/* Latch state of peer */
 	unix_state_lock(other);
@@ -1307,6 +1385,15 @@
 	}
 
 	err = -ECONNREFUSED;
+#ifdef CONFIG_IPC_SOCKET
+	if(unix_is_ipc_socket(other)){
+		struct sock_elem_flag elem_flag = {0};
+		elem_flag.skstate = 1;
+		elem_flag.skshutdown = 1;
+		sock_soc_get_state(&elem_flag, other);
+	}
+	sk_soc_info("unix_stream_connect other->sk_state=%d, other->sk_shutdown=%d\n", other->sk_state, other->sk_shutdown);	
+#endif	
 	if (other->sk_state != TCP_LISTEN)
 		goto out_unlock;
 	if (other->sk_shutdown & RCV_SHUTDOWN)
@@ -1317,6 +1404,11 @@
 		if (!timeo)
 			goto out_unlock;
 
+#ifdef CONFIG_IPC_SOCKET  
+		if(unix_is_ipc_socket(other)){ //Èç¹ûotherÊÇ´úÀísocket£¬Ôò֪ͨÆä¶ÔÓ¦µÄʵÌåÖ´ÐÐÏàͬ²Ù×÷
+			sock_wait_for_peer(sk, other, timeo);
+		}
+#endif
 		timeo = unix_wait_for_peer(other, timeo);
 
 		err = sock_intr_errno(timeo);
@@ -1399,8 +1491,15 @@
 		path_get(&otheru->path);
 		newu->path = otheru->path;
 	}
+#ifdef CONFIG_IPC_SOCKET
+	if(!unix_is_ipc_socket(other)){
+		refcount_inc(&otheru->addr->refcnt);
+		smp_store_release(&newu->addr, otheru->addr);
+	}	
+#else
 	refcount_inc(&otheru->addr->refcnt);
 	smp_store_release(&newu->addr, otheru->addr);
+#endif
 
 	/* Set credentials */
 	copy_peercred(sk, other);
@@ -1416,10 +1515,36 @@
 
 	/* take ten and and send info to listening sock */
 	spin_lock(&other->sk_receive_queue.lock);
+#ifdef CONFIG_IPC_SOCKET
+	if(unix_is_ipc_socket(other)){		
+		set_bit(SOCK_IPC_LOCAL,&newsk->sk_flags);
+		newsk->proxy_sock = other;
+		other->proxy_sock = newsk; //0626
+		//sock_soc_add_skb_queue_tail(sk, other);
+		sock_soc_stream_connect(sk, other, (struct sockaddr_un *)uaddr, addr_len, flags);
+		//todoÊÍ·Åskb
+		kfree_skb(skb);
+	}
+	else{
+#endif
 	__skb_queue_tail(&other->sk_receive_queue, skb);
+
+#ifdef CONFIG_IPC_SOCKET
+	}
+#endif	
 	spin_unlock(&other->sk_receive_queue.lock);
+#ifdef CONFIG_IPC_SOCKET
+	unix_state_unlock(other);
+	if(unix_is_ipc_socket(other)){
+		sock_soc_sk_data_ready(other);		
+	}
+	else{
+#endif
 	unix_state_unlock(other);
 	other->sk_data_ready(other);
+#ifdef CONFIG_IPC_SOCKET
+	}
+#endif
 	sock_put(other);
 	return 0;
 
@@ -1503,6 +1628,9 @@
 	newsock->state = SS_CONNECTED;
 	unix_sock_inherit_flags(sock, newsock);
 	sock_graft(tsk, newsock);
+#ifdef CONFIG_IPC_SOCKET	
+	sock_soc_update_peer(sock, newsock);
+#endif
 	unix_state_unlock(tsk);
 	return 0;
 
@@ -1750,10 +1878,12 @@
 	skb_put(skb, len - data_len);
 	skb->data_len = data_len;
 	skb->len = len;
+#ifndef CONFIG_IPC_SOCKET
 	err = skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, len);
 	if (err)
 		goto out_free;
 
+#endif	
 	timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
 
 restart:
@@ -1764,10 +1894,31 @@
 
 		other = unix_find_other(net, sunaddr, namelen, sk->sk_type,
 					hash, &err);
-		if (other == NULL)
-			goto out_free;
+		if (other == NULL) {
+#ifdef CONFIG_IPC_SOCKET
+			sk_soc_info("unix_find_other fail, call sock_soc_find_other \n");
+			/*±¾µØ²éÕÒ²»µ½£¬Ôò½øÐпçºË²éÕÒ*/
+			other = sock_soc_find_other(sock, sunaddr, namelen, sk->sk_type, hash, &err);
+				
+			if (other == NULL)
+#endif				
+				goto out_free;
+		}
 	}
 
+#ifdef CONFIG_IPC_SOCKET
+	if(unix_is_ipc_socket(other)){ //Èç¹û¿çºËsocket£¬ÔòÖ±½Ó½«Êý¾Ý·¢Ë͸ø¿çºËsocket´¦Àí
+		sk_soc_info("other is ipc socket, do nothing\n");		
+	}else{
+		err = skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, len);
+	
+		if (err){
+			printk("skb_copy_datagram_from_iter fail, goto out_free \n");
+			goto out_free;
+		}	
+		
+	}
+#endif
 	if (sk_filter(other, skb) < 0) {
 		/* Toss the packet but do not return any error to the sender */
 		err = len;
@@ -1859,7 +2010,16 @@
 
 	if (unlikely(sk_locked))
 		unix_state_unlock(sk);
-
+#ifdef CONFIG_IPC_SOCKET
+	if(unix_is_ipc_socket(other)){ //Èç¹û¿çºËsocket£¬ÔòÖ±½Ó½«Êý¾Ý·¢Ë͸ø¿çºËsocket´¦Àí
+		sk_soc_info("send to other core, len=%d\n", len);
+		sock_soc_msg_send(sk, other, msg, len);
+		unix_state_unlock(other);
+		sock_put(other);
+		kfree_skb(skb);
+	}
+	else{ //·Ç¿çºË×ßÕý³£Á÷³Ì
+#endif
 	if (sock_flag(other, SOCK_RCVTSTAMP))
 		__net_timestamp(skb);
 	maybe_add_creds(skb, sock, other);
@@ -1868,6 +2028,9 @@
 	unix_state_unlock(other);
 	other->sk_data_ready(other);
 	sock_put(other);
+#ifdef CONFIG_IPC_SOCKET
+	}
+#endif	
 	scm_destroy(&scm);
 	return len;
 
@@ -1905,7 +2068,13 @@
 	err = scm_send(sock, msg, &scm, false);
 	if (err < 0)
 		return err;
-
+#ifdef CONFIG_IPC_SOCKET
+	if(unix_is_ipc_socket(sk)){ //Èç¹û´Ë´¦µÄsockÊÇ´úÀísocket£¬Ôò½«skÌæ»»Îªconnectʱ·ÖÅäµÄnewsk
+		if(sk->proxy_sock){
+			sk = sk->proxy_sock;
+		}
+	}
+#endif
 	err = -EOPNOTSUPP;
 	if (msg->msg_flags&MSG_OOB)
 		goto out_err;
@@ -1949,11 +2118,18 @@
 			goto out_err;
 		}
 		fds_sent = true;
-
+#ifdef CONFIG_IPC_SOCKET
+		if(unix_is_ipc_socket(other) || unix_is_ipc_local_socket(other)){
+			//do nothing
+		} else {
+#endif
 		skb_put(skb, size - data_len);
 		skb->data_len = data_len;
 		skb->len = size;
 		err = skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, size);
+#ifdef CONFIG_IPC_SOCKET
+		}
+#endif
 		if (err) {
 			kfree_skb(skb);
 			goto out_err;
@@ -1965,12 +2141,32 @@
 		    (other->sk_shutdown & RCV_SHUTDOWN))
 			goto pipe_err_free;
 
+#ifdef CONFIG_IPC_SOCKET
+		if(unix_is_ipc_socket(other)){ //Èç¹û¿çºËsocket£¬ÔòÖ±½Ó½«Êý¾Ý·¢Ë͸ø¿çºËsocket´¦Àí
+			sk_soc_info("sock_soc_msg_send \n");
+			unix_state_unlock(other);
+			sock_soc_msg_send(sk, other, msg, size);
+		    sent += size;
+			kfree_skb(skb);
+			}
+		else if(unix_is_ipc_local_socket(other)){
+			sk_soc_info("sock_soc_msg_send to proxy_sock \n");
+			unix_state_unlock(other);
+			sock_soc_msg_send(sk, other->proxy_sock, msg, size);
+		    sent += size;
+			kfree_skb(skb);
+		}
+		else{ //·Ç¿çºË×ßÕý³£Á÷³Ì
+#endif
 		maybe_add_creds(skb, sock, other);
 		scm_stat_add(other, skb);
 		skb_queue_tail(&other->sk_receive_queue, skb);
 		unix_state_unlock(other);
 		other->sk_data_ready(other);
 		sent += size;
+#ifdef CONFIG_IPC_SOCKET
+		}
+#endif		
 	}
 
 	scm_destroy(&scm);
@@ -2082,6 +2278,11 @@
 			goto err_state_unlock;
 		spin_lock(&other->sk_receive_queue.lock);
 		__skb_queue_tail(&other->sk_receive_queue, newskb);
+#ifdef CONFIG_IPC_SOCKET
+		if(unix_is_ipc_socket(other)){		
+			sock_soc_add_skb_queue_tail(sk, other);
+		}
+#endif		
 		spin_unlock(&other->sk_receive_queue.lock);
 	}
 
@@ -2937,6 +3138,72 @@
 };
 #endif
 
+#ifdef CONFIG_IPC_SOCKET
+struct sock *unix_find_other_proxy(struct net *net,
+				    struct sockaddr_un *sunname, int len,
+				    int type, unsigned int hash, int *error)
+{
+	return unix_find_other(net, sunname, len, type, hash, error);
+}
+
+int unix_dgram_peer_wake_connect_proxy(struct sock *sk, struct sock *other)
+{
+	return unix_dgram_peer_wake_connect(sk, other);
+}
+
+void unix_dgram_peer_wake_disconnect_proxy(struct sock *sk, struct sock *other)
+{
+	unix_dgram_peer_wake_disconnect(sk, other);
+}
+
+void unix_dgram_peer_wake_disconnect_wakeup_proxy(struct sock *sk,
+						   struct sock *other)
+{
+	unix_dgram_peer_wake_disconnect(sk, other);
+	wake_up_interruptible_poll(sk_sleep(sk),
+				   EPOLLOUT |
+				   EPOLLWRNORM |
+				   EPOLLWRBAND);
+}
+
+long unix_wait_for_peer_proxy(struct sock *other, long timeo)
+{
+	return unix_wait_for_peer(other, timeo);
+}
+
+int unix_recvq_full_proxy(const struct sock *sk)
+{
+	return unix_recvq_full(sk);
+}
+
+int unix_recvq_full_proxy_lockless_and_deadstate(const struct sock *other)
+{
+	return unix_recvq_full_lockless(other) && !sock_flag(other, SOCK_DEAD);
+}
+
+int unix_stream_connect_proxy(struct socket *sock, struct sockaddr *uaddr,
+			       int addr_len, int flags)
+{
+	return unix_stream_connect(sock, uaddr, addr_len, flags);
+}
+
+void unix_dgram_disconnected_proxy(struct sock *sk, struct sock *other)
+{
+	unix_dgram_disconnected(sk, other);
+}
+
+int unix_mkname_proxy(struct sockaddr_un *sunaddr, int len, unsigned *hashp){
+	return unix_mkname(sunaddr, len, hashp);
+}
+
+void unix_release_sock_proxy(struct sock *sk)
+{
+	unix_release_sock(sk, 0);
+}
+
+
+#endif
+
 static const struct net_proto_family unix_family_ops = {
 	.family = PF_UNIX,
 	.create = unix_create,
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/Kconfig b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/Kconfig
index 4a82c36..97e4bc5 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/Kconfig
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/Kconfig
@@ -94,6 +94,7 @@
 	imply SND_SOC_ES8328_I2C
 	imply SND_SOC_ES7134
 	imply SND_SOC_ES7241
+	imply SND_SOC_ES8311
 	imply SND_SOC_GTM601
 	imply SND_SOC_HDAC_HDMI
 	imply SND_SOC_HDAC_HDA
@@ -794,7 +795,11 @@
 	tristate "Everest Semi ES8328 CODEC (SPI)"
 	depends on SPI_MASTER
 	select SND_SOC_ES8328
-
+	
+config SND_SOC_ES8311
+	tristate "Everest Semi ES8311 CODEC"
+	depends on I2C
+	
 config SND_SOC_GTM601
 	tristate 'GTM601 UMTS modem audio codec'
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/Makefile b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/Makefile
old mode 100644
new mode 100755
index 11ce98c..ca727c5
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/Makefile
@@ -90,6 +90,7 @@
 snd-soc-es8328-objs := es8328.o
 snd-soc-es8328-i2c-objs := es8328-i2c.o
 snd-soc-es8328-spi-objs := es8328-spi.o
+snd-soc-es8311-objs := es8311.o
 snd-soc-gtm601-objs := gtm601.o
 snd-soc-hdac-hdmi-objs := hdac_hdmi.o
 snd-soc-hdac-hda-objs := hdac_hda.o
@@ -399,6 +400,7 @@
 obj-$(CONFIG_SND_SOC_ES8328)	+= snd-soc-es8328.o
 obj-$(CONFIG_SND_SOC_ES8328_I2C)+= snd-soc-es8328-i2c.o
 obj-$(CONFIG_SND_SOC_ES8328_SPI)+= snd-soc-es8328-spi.o
+obj-$(CONFIG_SND_SOC_ES8311)    += snd-soc-es8311.o
 obj-$(CONFIG_SND_SOC_GTM601)    += snd-soc-gtm601.o
 obj-$(CONFIG_SND_SOC_HDAC_HDMI) += snd-soc-hdac-hdmi.o
 obj-$(CONFIG_SND_SOC_HDAC_HDA) += snd-soc-hdac-hda.o
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/es8311.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/es8311.c
new file mode 100755
index 0000000..b68ee46
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/es8311.c
@@ -0,0 +1,1504 @@
+// SPDX-License-Identifier: GPL-2.0-only

+/*

+ * es8311.c  --  ES8311/ES8312 ALSA SoC Audio Codec

+ *

+ * Copyright (C) 2018 Everest Semiconductor Co., Ltd

+ *

+ * Authors:  David Yang(yangxiaohua@everest-semi.com)

+ *

+ * This program is free software; you can redistribute it and/or modify

+ * it under the terms of the GNU General Public License version 2 as

+ * published by the Free Software Foundation.

+ */

+

+#include <linux/clk.h>

+#include <linux/module.h>

+#include <linux/kernel.h>

+#include <linux/delay.h>

+#include <linux/i2c.h>

+#include <linux/regmap.h>

+#include <sound/core.h>

+#include <sound/pcm.h>

+#include <sound/pcm_params.h>

+#include <sound/tlv.h>

+#include <sound/soc.h>

+

+#include <linux/of.h>
+#include <linux/of_gpio.h>

+#include <linux/clk-provider.h>

+

+#include "es8311.h"

+#ifndef CONFIG_OF

+#define CONFIG_OF

+#endif

+

+/* component private data */

+

+struct	es8311_private {

+	struct snd_soc_component *component;

+	struct regmap *regmap;

+	struct clk *mclk;

+	unsigned int mclk_rate;

+	int mastermode;

+	bool sclkinv;

+	bool mclkinv;

+	bool dmic_enable;

+	unsigned int mclk_src;

+	enum snd_soc_bias_level bias_level;

+	//add new

+	struct pinctrl *pctrl;

+	struct pinctrl_state *state0;

+	struct clk 	*clk;

+

+	

+};

+

+struct es8311_private *es8311_data;

+struct snd_soc_component *es8311_component;

+

+static bool es8311_volatile_register(struct device *dev,

+			unsigned int reg)

+{

+	if ((reg  <= 0xff))

+		return true;

+	else

+		return false;

+	}

+

+static bool es8311_readable_register(struct device *dev,

+			unsigned int reg)

+{

+	if ((reg  <= 0xff))

+		return true;

+	else

+		return false;

+	}

+

+static bool es8311_writable_register(struct device *dev,

+			unsigned int reg)

+{

+	if ((reg  <= 0xff))

+		return true;

+	else

+		return false;

+}

+

+static const DECLARE_TLV_DB_SCALE(vdac_tlv, -9550, 50, 1);

+static const DECLARE_TLV_DB_SCALE(vadc_tlv, -9550, 50, 1);

+static const DECLARE_TLV_DB_SCALE(mic_pga_tlv, 0, 300, 1);

+static const DECLARE_TLV_DB_SCALE(adc_scale_tlv, 0, 600, 0);

+static const DECLARE_TLV_DB_SCALE(alc_winsize_tlv, 0, 25, 0);

+static const DECLARE_TLV_DB_SCALE(alc_maxlevel_tlv, -3600, 200, 0);

+static const DECLARE_TLV_DB_SCALE(alc_minlevel_tlv, -3600, 200, 0);

+static const DECLARE_TLV_DB_SCALE(alc_noisegate_tlv, -9600, 600, 0);

+static const DECLARE_TLV_DB_SCALE(alc_noisegate_winsize_tlv, 2048, 2048, 0);

+static const DECLARE_TLV_DB_SCALE(alc_automute_gain_tlv, 0, -400, 0);

+static const DECLARE_TLV_DB_SCALE(adc_ramprate_tlv, 0, 25, 0);

+

+static const char * const dmic_type_txt[] = {

+	"dmic at high level",

+	"dmic at low level"

+};

+static const struct soc_enum dmic_type =

+SOC_ENUM_SINGLE(ES8311_ADC_REG15, 0, 2, dmic_type_txt);

+

+static const char * const automute_type_txt[] = {

+	"automute disabled",

+	"automute enable"

+};

+static const struct soc_enum alc_automute_type =

+SOC_ENUM_SINGLE(ES8311_ADC_REG18, 6, 2, automute_type_txt);

+

+static const char * const dacdsm_mute_type_txt[] = {

+	"mute to 8",

+	"mute to 7/9"

+};

+static const struct soc_enum dacdsm_mute_type =

+SOC_ENUM_SINGLE(ES8311_DAC_REG31, 7, 2, dacdsm_mute_type_txt);

+

+static const char * const aec_type_txt[] = {

+	"adc left, adc right",

+	"adc left, null right",

+	"null left, adc right",

+	"null left, null right",

+	"dac left, adc right",

+	"adc left, dac right",

+	"dac left, dac right",

+	"N/A"

+};

+static const struct soc_enum aec_type =

+SOC_ENUM_SINGLE(ES8311_GPIO_REG44, 4, 7, aec_type_txt);

+

+static const char * const adc2dac_sel_txt[] = {

+	"disable",

+	"adc data to dac",

+};

+static const struct soc_enum adc2dac_sel =

+SOC_ENUM_SINGLE(ES8311_GPIO_REG44, 7, 2, adc2dac_sel_txt);

+

+static const char * const mclk_sel_txt[] = {

+	"from mclk pin",

+	"from bclk",

+};

+static const struct soc_enum mclk_src =

+SOC_ENUM_SINGLE(ES8311_CLK_MANAGER_REG01, 7, 2, mclk_sel_txt);

+

+/*

+ * es8311 Controls

+ */

+static const struct snd_kcontrol_new es8311_snd_controls[] = {

+	SOC_SINGLE_TLV("MIC PGA GAIN", ES8311_SYSTEM_REG14,

+			0, 10, 0, mic_pga_tlv),

+	SOC_SINGLE_TLV("ADC SCALE", ES8311_ADC_REG16,

+			0, 7, 0, adc_scale_tlv),

+	SOC_ENUM("DMIC TYPE", dmic_type),

+	SOC_SINGLE_TLV("ADC RAMP RATE", ES8311_ADC_REG15,

+			4, 15, 0, adc_ramprate_tlv),

+	SOC_SINGLE("ADC SDP MUTE", ES8311_SDPOUT_REG0A, 6, 1, 0),

+	SOC_SINGLE("ADC INVERTED", ES8311_ADC_REG16, 4, 1, 0),

+	SOC_SINGLE("ADC SYNC", ES8311_ADC_REG16, 5, 1, 1),

+	SOC_SINGLE("ADC RAM CLR", ES8311_ADC_REG16, 3, 1, 0),

+	SOC_SINGLE_TLV("ADC VOLUME", ES8311_ADC_REG17,

+			0, 255, 0, vadc_tlv),

+	SOC_SINGLE("ALC ENABLE", ES8311_ADC_REG18, 7, 1, 0),

+	SOC_ENUM("ALC AUTOMUTE TYPE", alc_automute_type),

+	SOC_SINGLE_TLV("ALC WIN SIZE", ES8311_ADC_REG18,

+			0, 15, 0, alc_winsize_tlv),

+	SOC_SINGLE_TLV("ALC MAX LEVEL", ES8311_ADC_REG19,

+			4, 15, 0, alc_maxlevel_tlv),

+	SOC_SINGLE_TLV("ALC MIN LEVEL", ES8311_ADC_REG19,

+			0, 15, 0, alc_minlevel_tlv),

+	SOC_SINGLE_TLV("ALC AUTOMUTE WINSIZE", ES8311_ADC_REG1A,

+			4, 15, 0, alc_noisegate_winsize_tlv),

+	SOC_SINGLE_TLV("ALC AUTOMUTE GATE THRESHOLD", ES8311_ADC_REG1A,

+			0, 15, 0, alc_noisegate_tlv),

+	SOC_SINGLE_TLV("ALC AUTOMUTE VOLUME", ES8311_ADC_REG1B,

+			5, 7, 0, alc_automute_gain_tlv),

+	SOC_SINGLE("ADC FS MODE", ES8311_CLK_MANAGER_REG03, 6, 1, 0),

+	SOC_SINGLE("DAC SDP MUTE", ES8311_SDPIN_REG09, 6, 1, 0),

+	SOC_SINGLE("DAC DEM  MUTE", ES8311_DAC_REG31, 5, 1, 0),

+	SOC_SINGLE("DAC INVERT", ES8311_DAC_REG31, 4, 1, 0),

+	SOC_SINGLE("DAC RAM CLR", ES8311_DAC_REG31, 3, 1, 0),

+	SOC_ENUM("DAC DSM MUTE", dacdsm_mute_type),

+	SOC_SINGLE("DAC OFFSET", ES8311_DAC_REG33, 0, 255, 0),

+	SOC_SINGLE_TLV("DAC VOLUME", ES8311_DAC_REG32,

+			0, 255, 0, vdac_tlv),

+	SOC_SINGLE("DRC ENABLE", ES8311_DAC_REG34, 7, 1, 0),

+	SOC_SINGLE_TLV("DRC WIN SIZE",	ES8311_DAC_REG34,

+			0, 15, 0, alc_winsize_tlv),

+	SOC_SINGLE_TLV("DRC MAX LEVEL",	ES8311_DAC_REG35,

+			4, 15, 0, alc_maxlevel_tlv),

+	SOC_SINGLE_TLV("DRC MIN LEVEL",	ES8311_DAC_REG35,

+			0, 15, 0, alc_minlevel_tlv),

+	SOC_SINGLE_TLV("DAC RAMP RATE",	ES8311_DAC_REG37,

+			4, 15, 0, adc_ramprate_tlv),

+	SOC_ENUM("AEC MODE", aec_type),

+	SOC_ENUM("ADC DATA TO DAC TEST MODE", adc2dac_sel),

+	SOC_SINGLE("MCLK INVERT", ES8311_CLK_MANAGER_REG01, 6, 1, 0),

+	SOC_SINGLE("BCLK INVERT", ES8311_CLK_MANAGER_REG06, 5, 1, 0),

+	SOC_ENUM("MCLK SOURCE", mclk_src),

+};

+

+/*

+ * DAPM Controls

+ */

+static const char * const es8311_dmic_mux_txt[] = {

+	"DMIC DISABLE",

+	"DMIC ENABLE"

+};

+static const unsigned int es8311_dmic_mux_values[] = {

+	0, 1

+};

+static const struct soc_enum es8311_dmic_mux_enum =

+	SOC_VALUE_ENUM_SINGLE(ES8311_SYSTEM_REG14, 6, 1,

+			ARRAY_SIZE(es8311_dmic_mux_txt),

+			es8311_dmic_mux_txt,

+			es8311_dmic_mux_values);

+static const struct snd_kcontrol_new es8311_dmic_mux_controls =

+	SOC_DAPM_ENUM("DMIC ROUTE", es8311_dmic_mux_enum);

+static const char * const es8311_adc_sdp_mux_txt[] = {

+	"FROM EQUALIZER",

+	"FROM ADC OUT",

+};

+static const unsigned int es8311_adc_sdp_mux_values[] = {

+	0, 1

+};

+static const struct soc_enum es8311_adc_sdp_mux_enum =

+	SOC_VALUE_ENUM_SINGLE(ES8311_ADC_REG1C, 6, 1,

+			ARRAY_SIZE(es8311_adc_sdp_mux_txt),

+			es8311_adc_sdp_mux_txt,

+			es8311_adc_sdp_mux_values);

+static const struct snd_kcontrol_new es8311_adc_sdp_mux_controls =

+	SOC_DAPM_ENUM("ADC SDP ROUTE", es8311_adc_sdp_mux_enum);

+

+/*

+ * DAC data  soure

+ */

+static const char * const es8311_dac_data_mux_txt[] = {

+	"SELECT SDP LEFT DATA",

+	"SELECT SDP RIGHT DATA",

+};

+static const unsigned int  es8311_dac_data_mux_values[] = {

+	0, 1

+};

+static const struct soc_enum  es8311_dac_data_mux_enum =

+	SOC_VALUE_ENUM_SINGLE(ES8311_SDPIN_REG09, 7, 1,

+			ARRAY_SIZE(es8311_dac_data_mux_txt),

+			es8311_dac_data_mux_txt,

+			es8311_dac_data_mux_values);

+static const struct snd_kcontrol_new  es8311_dac_data_mux_controls =

+	SOC_DAPM_ENUM("DAC SDP ROUTE", es8311_dac_data_mux_enum);

+

+static const struct snd_soc_dapm_widget es8311_dapm_widgets[] = {

+	/* Input*/

+	SND_SOC_DAPM_INPUT("DMIC"),

+	SND_SOC_DAPM_INPUT("AMIC"),

+

+	SND_SOC_DAPM_PGA("INPUT PGA", ES8311_SYSTEM_REG0E,

+			6, 0, NULL, 0),

+	/* ADCs */

+	SND_SOC_DAPM_ADC("MONO ADC", NULL, ES8311_SYSTEM_REG0E, 5, 0),

+	/* Dmic MUX */

+	SND_SOC_DAPM_MUX("DMIC MUX", SND_SOC_NOPM, 0, 0,

+			&es8311_dmic_mux_controls),

+	/* sdp MUX */

+	SND_SOC_DAPM_MUX("SDP OUT MUX", SND_SOC_NOPM, 0, 0,

+			&es8311_adc_sdp_mux_controls),

+	/* Digital Interface */

+	SND_SOC_DAPM_AIF_OUT("I2S OUT", "I2S1 Capture",  1,

+			SND_SOC_NOPM, 0, 0),

+	/* Render path	*/

+	SND_SOC_DAPM_AIF_IN("I2S IN", "I2S1 Playback", 0,

+			SND_SOC_NOPM, 0, 0),

+	/*DACs SDP DATA SRC MUX */

+	SND_SOC_DAPM_MUX("DAC SDP SRC MUX", ES8311_SDPIN_REG09, 7, 2,

+			&es8311_dac_data_mux_controls),

+	SND_SOC_DAPM_DAC("MONO DAC", NULL, SND_SOC_NOPM, 0, 0),

+	/* Output Lines */

+	SND_SOC_DAPM_OUTPUT("DIFFERENTIAL OUT"),

+

+};

+

+

+static const struct snd_soc_dapm_route es8311_dapm_routes[] = {

+	/* record route map */

+	{"INPUT PGA", NULL, "AMIC"},

+	{"MONO ADC", NULL, "INPUT PGA"},

+	{"DMIC MUX", "DMIC DISABLE", "MONO ADC"},

+	{"DMIC MUX", "DMIC ENABLE", "DMIC"},

+	{"SDP OUT MUX", "FROM ADC OUT", "DMIC MUX"},

+	{"SDP OUT MUX", "FROM EQUALIZER", "DMIC MUX"},

+	{"I2S OUT", NULL, "SDP OUT MUX"},

+	/* playback route map */

+	{"DAC SDP SRC MUX", "SELECT SDP LEFT DATA", "I2S IN"},

+	{"DAC SDP SRC MUX", "SELECT SDP RIGHT DATA", "I2S IN"},

+	{"MONO DAC", NULL, "DAC SDP SRC MUX"},

+	{"DIFFERENTIAL OUT", NULL, "MONO DAC"},

+};

+

+struct _coeff_div {

+	u32 mclk;	/* mclk frequency */

+	u32 rate;	/* sample rate */

+	u8 prediv;	/* the pre divider with range from 1 to 8 */

+	u8 premulti;	/* the pre multiplier with x1, x2, x4 and x8 selection */

+	u8 adcdiv;	/* adcclk divider */

+	u8 dacdiv;	/* dacclk divider */

+	u8 fsmode;	/* double speed or single speed, =0, ss, =1, ds */

+	u8 lrck_h;	/* adclrck divider and daclrck divider */

+	u8 lrck_l;

+	u8 bclkdiv;	/* sclk divider */

+	u8 adcosr;	/* adc osr */

+	u8 dacosr;	/* dac osr */

+	u8 adcscale;

+};

+

+

+/* component hifi mclk clock divider coefficients */

+static const struct _coeff_div coeff_div[] = {

+	//mclk     rate   prediv  mult  adcdiv dacdiv fsmode lrch  lrcl  bckdiv osr  adcscale

+	/* 8k */

+	{12288000, 8000, 0x06, 0x01, 0x01, 0x01, 0x00, 0x05, 0xff, 0x04, 0x10, 0x20, 0x04},	//1536

+	{18432000, 8000, 0x03, 0x01, 0x03, 0x03, 0x00, 0x08, 0xff, 0x18, 0x10, 0x20, 0x04},	//2304

+	{16384000, 8000, 0x08, 0x01, 0x01, 0x01, 0x00, 0x07, 0xff, 0x04, 0x10, 0x20, 0x04},	//2048

+	{8192000, 8000, 0x04, 0x01, 0x01, 0x01, 0x00, 0x03, 0xff, 0x04, 0x10, 0x20, 0x04},	//1024

+	{6144000, 8000, 0x03, 0x01, 0x01, 0x01, 0x00, 0x02, 0xff, 0x04, 0x10, 0x20, 0x04},	//768

+	{4096000, 8000, 0x02, 0x01, 0x01, 0x01, 0x00, 0x01, 0xff, 0x04, 0x10, 0x20, 0x04},	//512

+	{3072000, 8000, 0x03, 0x02, 0x01, 0x01, 0x00, 0x01, 0x7f, 0x04, 0x10, 0x20, 0x04},	//384

+	{2048000, 8000, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x20, 0x04},	//256

+	{1536000, 8000, 0x01, 0x04, 0x03, 0x03, 0x00, 0x00, 0xbf, 0x04, 0x10, 0x20, 0x04},	//192

+	{1024000, 8000, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x7f, 0x04, 0x10, 0x20, 0x04},	//128

+	{12000000, 8000, 0x05, 0x04, 0x03, 0x03, 0x00, 0x05, 0xDB, 0x04, 0x19, 0x19, 0x01},	//1500

+	/* 11.025k */

+	{11289600, 11025, 0x04, 0x01, 0x01, 0x01, 0x00, 0x03, 0xff, 0x04, 0x10, 0x20, 0x04},	//1024

+	{5644800, 11025, 0x02, 0x01, 0x01, 0x01, 0x00, 0x01, 0xff, 0x04, 0x10, 0x20, 0x04},	//512

+	{2822400, 11025, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x20, 0x04},	//256

+	{1411200, 11025, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x7f, 0x04, 0x10, 0x20, 0x04},	//128

+

+	/* 12k */

+	{12288000, 12000, 0x04, 0x01, 0x01, 0x01, 0x00, 0x03, 0xff, 0x04, 0x10, 0x20, 0x04},	//1024

+	{6144000, 12000, 0x02, 0x01, 0x01, 0x01, 0x00, 0x01, 0xff, 0x04, 0x10, 0x20, 0x04},	//512

+	{3072000, 12000, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x20, 0x04},	//256

+	{1536000, 12000, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x7f, 0x04, 0x10, 0x20, 0x04},	//128

+

+	/* 16k */

+	//{24576000, 16000, 0x06, 0x01, 0x01, 0x01, 0x00, 0x05, 0xff, 0x04, 0x10, 0x20, 0x04},	//1536

+	{12288000, 16000, 0x03, 0x01, 0x01, 0x01, 0x00, 0x02, 0xff, 0x04, 0x10, 0x20, 0x04},	//768

+	{18432000, 16000, 0x03, 0x02, 0x03, 0x03, 0x00, 0x04, 0x7f, 0x0c, 0x10, 0x20, 0x04},	//1152

+	{16384000, 16000, 0x04, 0x01, 0x01, 0x01, 0x00, 0x03, 0xff, 0x04, 0x10, 0x20, 0x04},	//1024

+	{8192000, 16000, 0x02, 0x01, 0x01, 0x01, 0x00, 0x01, 0xff, 0x04, 0x10, 0x20, 0x04},	//512

+	{6144000, 16000, 0x03, 0x02, 0x01, 0x01, 0x00, 0x01, 0x7f, 0x04, 0x10, 0x20, 0x04},	//384

+	{4096000, 16000, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x20, 0x04},	//256

+	{3072000, 16000, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0xbf, 0x04, 0x10, 0x20, 0x04},	//192

+	{2048000, 16000, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x7f, 0x04, 0x10, 0x20, 0x04},	//128

+	{1536000, 16000, 0x01, 0x08, 0x03, 0x03, 0x00, 0x00, 0x5f, 0x02, 0x10, 0x20, 0x04},	//96

+	{1024000, 16000, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0x3f, 0x02, 0x10, 0x20, 0x04},	//64

+	{12000000, 16000, 0x05, 0x08, 0x03, 0x03, 0x00, 0x02, 0xED, 0x04, 0x19, 0x19, 0x01},	//750

+

+	/* 22.05k */

+	{11289600, 22050, 0x02, 0x01, 0x01, 0x01, 0x00, 0x01, 0xff, 0x04, 0x10, 0x20, 0x04},	//512

+	{5644800, 22050, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x20, 0x04},	//256

+	{2822400, 22050, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x7f, 0x04, 0x10, 0x20, 0x04},	//128

+	{1411200, 22050, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0x3f, 0x02, 0x10, 0x20, 0x04},	//64

+

+	/* 24k */

+	//{24576000, 24000, 0x04, 0x01, 0x01, 0x01, 0x00, 0x03, 0xff, 0x04, 0x10, 0x20, 0x04},	//1024

+	{12288000, 24000, 0x02, 0x01, 0x01, 0x01, 0x00, 0x01, 0xff, 0x04, 0x10, 0x20, 0x04},	//512

+	{18432000, 24000, 0x03, 0x01, 0x01, 0x01, 0x00, 0x02, 0xff, 0x04, 0x10, 0x20, 0x04},	//768

+	{6144000, 24000, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x20, 0x04},	//256

+	{3072000, 24000, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x7f, 0x04, 0x10, 0x20, 0x04},	//128

+	{1536000, 24000, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0x3f, 0x02, 0x10, 0x20, 0x04},	//64

+	{12000000, 24000, 0x05, 0x04, 0x01, 0x01, 0x00, 0x01, 0xF3, 0x04, 0x19, 0x19, 0x01},	//500

+

+	/* 32k */

+	//{24576000, 32000, 0x03, 0x01, 0x01, 0x01, 0x00, 0x02, 0xff, 0x04, 0x10, 0x10, 0x04},	//768

+	{12288000, 32000, 0x03, 0x02, 0x01, 0x01, 0x00, 0x01, 0x7f, 0x04, 0x10, 0x10, 0x04},	//384

+	{18432000, 32000, 0x03, 0x04, 0x03, 0x03, 0x00, 0x02, 0x3f, 0x0c, 0x10, 0x10, 0x04},	//576

+	{16384000, 32000, 0x02, 0x01, 0x01, 0x01, 0x00, 0x01, 0xff, 0x04, 0x10, 0x10, 0x04},	//512

+	{8192000, 32000, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x10, 0x04},	//256

+	{6144000, 32000, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0xbf, 0x04, 0x10, 0x10, 0x04},	//192

+	{4096000, 32000, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x7f, 0x04, 0x10, 0x10, 0x04},	//128

+	{3072000, 32000, 0x03, 0x08, 0x01, 0x01, 0x00, 0x00, 0x5f, 0x02, 0x10, 0x10, 0x04},	//96

+	{2048000, 32000, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0x3f, 0x02, 0x10, 0x10, 0x04},	//64

+	{1536000, 32000, 0x01, 0x08, 0x03, 0x03, 0x01, 0x00, 0x2f, 0x02, 0x10, 0x10, 0x04},	//48

+	{1024000, 32000, 0x01, 0x08, 0x01, 0x01, 0x00, 0x00, 0x1f, 0x02, 0x10, 0x10, 0x04},	//32

+

+	/* 44.1k */

+	//{22579200, 44100, 0x02, 0x01, 0x01, 0x01, 0x00, 0x01, 0xff, 0x04, 0x10, 0x10, 0x04},    //512

+	{11289600, 44100, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x10, 0x04},	//256

+	{5644800, 44100, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x7f, 0x04, 0x10, 0x10, 0x04},	//128

+	{2822400, 44100, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0x3f, 0x02, 0x10, 0x10, 0x04},	//64

+	{1411200, 44100, 0x01, 0x08, 0x01, 0x01, 0x00, 0x00, 0x1f, 0x02, 0x10, 0x10, 0x04},	//32

+

+	/* 48k */

+	{24576000, 48000, 0x02, 0x01, 0x01, 0x01, 0x00, 0x01, 0xff, 0x04, 0x10, 0x10, 0x04},    //512

+	{12288000, 48000, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x10, 0x04},	//256

+	{18432000, 48000, 0x03, 0x02, 0x01, 0x01, 0x00, 0x01, 0x7f, 0x04, 0x10, 0x10, 0x04},	//384

+	{6144000, 48000, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x7f, 0x04, 0x10, 0x10, 0x04},	//128

+	{3072000, 48000, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0x3f, 0x02, 0x10, 0x10, 0x04},	//64

+	{1536000, 48000, 0x01, 0x08, 0x01, 0x01, 0x00, 0x00, 0x1f, 0x02, 0x10, 0x10, 0x04},	//32

+	{12000000, 48000, 0x05, 0x08, 0x01, 0x01, 0x00, 0x00, 0xF9, 0x04, 0x19, 0x19, 0x01},	//250

+

+	/* 64k */

+	{12288000, 64000, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0xbf, 0x04, 0x10, 0x10, 0x04},	//192

+	{18432000, 64000, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x1f, 0x06, 0x12, 0x12, 0x03},	//288

+	{16384000, 64000, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x10, 0x04},	//256

+	{8192000, 64000, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x7f, 0x04, 0x10, 0x10, 0x04},	//128

+	{6144000, 64000, 0x03, 0x08, 0x01, 0x01, 0x01, 0x00, 0x5f, 0x02, 0x10, 0x10, 0x04},	//96

+	{4096000, 64000, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0x3f, 0x02, 0x10, 0x10, 0x04},	//64

+	{3072000, 64000, 0x03, 0x08, 0x01, 0x01, 0x01, 0x00, 0x2f, 0x02, 0x10, 0x10, 0x04},	//48

+	{2048000, 64000, 0x01, 0x08, 0x01, 0x01, 0x00, 0x00, 0x1f, 0x02, 0x10, 0x10, 0x04},	//32

+

+	/* 88.2k */

+	{11289600, 88200, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x7f, 0x04, 0x10, 0x10, 0x04},	//128

+	{5644800, 88200, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0x3f, 0x02, 0x10, 0x10, 0x04},	//64

+	{2822400, 88200, 0x01, 0x08, 0x01, 0x01, 0x00, 0x00, 0x1f, 0x02, 0x10, 0x10, 0x04},	//32

+

+	/* 96k */

+	{12288000, 96000, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x7f, 0x04, 0x10, 0x10, 0x04},	//128

+	{18432000, 96000, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0xbf, 0x04, 0x10, 0x10, 0x04},	//192

+	{6144000, 96000, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0x3f, 0x02, 0x10, 0x10, 0x04},	//64

+	{3072000, 96000, 0x01, 0x08, 0x01, 0x01, 0x00, 0x00, 0x1f, 0x02, 0x10, 0x10, 0x04},	//32

+};

+static inline int get_coeff(int mclk, int rate)

+{

+	int i;

+

+	for (i = 0; i < ARRAY_SIZE(coeff_div); i++) {

+		if (coeff_div[i].rate == rate && coeff_div[i].mclk == mclk)

+			return i;

+	}

+	return -EINVAL;

+}

+

+/*

+ * if PLL not be used, use internal clk1 for mclk,otherwise, use internal clk2 for PLL source.

+ */

+static int es8311_set_dai_sysclk(struct snd_soc_dai *dai,

+			int clk_id, unsigned int freq, int dir)

+{

+	struct snd_soc_component *component = dai->component;

+	struct es8311_private *es8311 = snd_soc_component_get_drvdata(component);

+

+	pr_info("Enter into %s()\n", __func__);

+	switch (freq) {

+	case 11289600:

+	case 22579200:

+	case 5644800:

+	case 2822400:

+	case 1411200:

+	case 12288000:

+	case 16384000:

+	case 18432000:

+	case 24576000:

+	case 8192000:

+	case 6144000:

+	case 4096000:

+	case 2048000:

+	case 3072000:

+	case 1536000:

+	case 1024000:

+	case 12000000:

+		es8311->mclk_rate = freq;

+		return 0;

+	}

+

+	return -EINVAL;

+}

+

+static int es8311_set_dai_fmt(struct snd_soc_dai *component_dai, unsigned int fmt)

+{

+	struct snd_soc_component *component = component_dai->component;

+	struct es8311_private *es8311 = snd_soc_component_get_drvdata(component);

+	u8 iface = 0;

+	u8 adciface = 0;

+	u8 daciface = 0;

+

+	dev_dbg(component->dev, "Enter into %s()\n", __func__);

+	iface    = snd_soc_component_read(component, ES8311_RESET_REG00);

+	adciface = snd_soc_component_read(component, ES8311_SDPOUT_REG0A);

+	daciface = snd_soc_component_read(component, ES8311_SDPIN_REG09);

+

+	/* set master/slave audio interface */

+	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {

+	case SND_SOC_DAIFMT_CBM_CFM:    /* MASTER MODE */

+		pr_info("%s mastermode\n", __func__);

+		es8311->mastermode = 1;

+		dev_dbg(component->dev, "ES8311 in Master mode\n");

+		iface |= 0x40;

+		break;

+	case SND_SOC_DAIFMT_CBS_CFS:    /* SLAVE MODE */

+		es8311->mastermode = 0;

+		dev_dbg(component->dev, "ES8311 in Slave mode\n");

+		iface &= 0xBF;

+		break;

+	default:

+		return -EINVAL;

+	}

+	snd_soc_component_write(component, ES8311_RESET_REG00, iface);

+

+

+	/* interface format */

+	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {

+	case SND_SOC_DAIFMT_I2S:

+		dev_dbg(component->dev, "ES8311 in I2S Format\n");

+		adciface &= 0xFC;

+		daciface &= 0xFC;

+		break;

+	case SND_SOC_DAIFMT_RIGHT_J:

+		return -EINVAL;

+	case SND_SOC_DAIFMT_LEFT_J:

+		dev_dbg(component->dev, "ES8311 in LJ Format\n");

+		adciface &= 0xFC;

+		daciface &= 0xFC;

+		adciface |= 0x01;

+		daciface |= 0x01;

+		break;

+	case SND_SOC_DAIFMT_DSP_A:

+		dev_dbg(component->dev, "ES8311 in DSP-A Format\n");

+		adciface &= 0xDC;

+		daciface &= 0xDC;

+		adciface |= 0x03;

+		daciface |= 0x03;

+		break;

+	case SND_SOC_DAIFMT_DSP_B:

+		dev_dbg(component->dev, "ES8311 in DSP-B Format\n");

+		adciface &= 0xDC;

+		daciface &= 0xDC;

+		adciface |= 0x23;

+		daciface |= 0x23;

+		break;

+	default:

+		return -EINVAL;

+	}

+

+	iface    = snd_soc_component_read(component, ES8311_CLK_MANAGER_REG06);

+	/* clock inversion */

+	if (((fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_I2S) ||

+			((fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_LEFT_J)) {

+		switch (fmt & SND_SOC_DAIFMT_INV_MASK) {

+		case SND_SOC_DAIFMT_NB_NF:

+

+			iface    &= 0xDF;

+			adciface &= 0xDF;

+			daciface &= 0xDF;

+			break;

+		case SND_SOC_DAIFMT_IB_IF:

+			iface    |= 0x20;

+			adciface |= 0x20;

+			daciface |= 0x20;

+			break;

+		case SND_SOC_DAIFMT_IB_NF:

+			iface    |= 0x20;

+			adciface &= 0xDF;

+			daciface &= 0xDF;

+			break;

+		case SND_SOC_DAIFMT_NB_IF:

+			iface    &= 0xDF;

+			adciface |= 0x20;

+			daciface |= 0x20;

+			break;

+		default:

+			return -EINVAL;

+		}

+	}

+

+	snd_soc_component_write(component, ES8311_CLK_MANAGER_REG06, iface);

+	snd_soc_component_write(component, ES8311_SDPOUT_REG0A, adciface);

+	snd_soc_component_write(component, ES8311_SDPIN_REG09, daciface);

+	return 0;

+}

+static int es8311_pcm_startup(struct snd_pcm_substream *substream,

+		struct snd_soc_dai *dai)

+{

+	return 0;

+}

+

+static int es8311_pcm_hw_params(struct snd_pcm_substream *substream,

+		struct snd_pcm_hw_params *params,

+		struct snd_soc_dai *dai)

+{

+	struct snd_soc_component *component = dai->component;

+	struct es8311_private *es8311 = snd_soc_component_get_drvdata(component);

+	u16 iface;

+	int coeff;

+	u8 regv, datmp;

+

+	pr_info("Enter into %s()\n", __func__);

+	/* we need mclk rate to configure registers. Set MCLK here if failed

+	 * to get mclk from set_sysclk.

+	 *

+	 * If the es8311->mclk_rate is a constant value, for example 12.288M,

+	 * set es8311->mclk_rate = 12288000;

+	 * else if es8311->mclk_rate is dynamic, for example 128Fs,

+	 * set es8311->mclk_rate = 128 * params_rate(params);

+	 */

+	if (es8311->mclk_src == ES8311_BCLK_PIN) {

+		/*

+		 * Here 64 is ratio of BCLK/LRCK.

+		 * If BCLK/LRCK isn't 64, please change it according to actual ratio.

+		 */

+		snd_soc_component_update_bits(component,

+				ES8311_CLK_MANAGER_REG01, 0x80, 0x80);

+		es8311->mclk_rate = 64 * params_rate(params);

+	}

+

+	pr_info("%s, mclk = %d, lrck = %d\n", __func__,

+			es8311->mclk_rate, params_rate(params));

+

+	coeff = get_coeff(es8311->mclk_rate, params_rate(params));

+	if (coeff < 0) {

+		pr_info("Unable to configure sample rate %dHz with %dHz MCLK\n",

+			params_rate(params), es8311->mclk_rate);

+		return -EINVAL;

+	}

+	/*

+	 * set clock parammeters

+	 */

+	if (coeff >= 0) {

+		regv = snd_soc_component_read(component,

+				ES8311_CLK_MANAGER_REG02) & 0x07;

+

+		regv |= (coeff_div[coeff].prediv - 1) << 5;

+		datmp = 0;

+		switch (coeff_div[coeff].premulti) {

+		case 1:

+			datmp = 0;

+			break;

+		case 2:

+			datmp = 1;

+			break;

+		case 4:

+			datmp = 2;

+			break;

+		case 8:

+			datmp = 3;

+			break;

+		default:

+			break;

+		}

+		regv |= (datmp) << 3;

+		snd_soc_component_write(component, ES8311_CLK_MANAGER_REG02, regv);

+

+		regv = snd_soc_component_read(component,

+				ES8311_CLK_MANAGER_REG05) & 0x00;

+		regv |= (coeff_div[coeff].adcdiv - 1) << 4;

+		regv |= (coeff_div[coeff].dacdiv - 1) << 0;

+		snd_soc_component_write(component, ES8311_CLK_MANAGER_REG05, regv);

+

+		regv = snd_soc_component_read(component,

+				ES8311_CLK_MANAGER_REG03) & 0x80;

+		regv |= coeff_div[coeff].fsmode << 6;

+		regv |= coeff_div[coeff].adcosr << 0;

+		snd_soc_component_write(component, ES8311_CLK_MANAGER_REG03, regv);

+

+		regv = snd_soc_component_read(component,

+				ES8311_CLK_MANAGER_REG04) & 0x80;

+		regv |= coeff_div[coeff].dacosr << 0;

+		snd_soc_component_write(component, ES8311_CLK_MANAGER_REG04, regv);

+

+		regv = snd_soc_component_read(component,

+				ES8311_CLK_MANAGER_REG07) & 0xf0;

+		regv |= coeff_div[coeff].lrck_h << 0;

+		snd_soc_component_write(component, ES8311_CLK_MANAGER_REG07, regv);

+

+		regv = snd_soc_component_read(component,

+				ES8311_CLK_MANAGER_REG08) & 0x00;

+		regv |= coeff_div[coeff].lrck_l << 0;

+		snd_soc_component_write(component, ES8311_CLK_MANAGER_REG08, regv);

+

+		regv = snd_soc_component_read(component,

+				ES8311_CLK_MANAGER_REG06) & 0xE0;

+		if (coeff_div[coeff].bclkdiv < 19)

+			regv |= (coeff_div[coeff].bclkdiv - 1) << 0;

+		else

+			regv |= coeff_div[coeff].bclkdiv << 0;

+

+		snd_soc_component_write(component, ES8311_CLK_MANAGER_REG06, regv);

+

+		regv = snd_soc_component_read(component, ES8311_ADC_REG16) & 0x38;

+		regv |= (coeff_div[coeff].adcscale) << 0;

+		snd_soc_component_write(component, ES8311_ADC_REG16, regv);

+	}

+

+	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {

+		iface = snd_soc_component_read(component,

+				ES8311_SDPIN_REG09) & 0xE3;

+		/* bit size */

+		switch (params_format(params)) {

+		case SNDRV_PCM_FORMAT_S16_LE:

+			iface |= 0x0c;

+			break;

+		case SNDRV_PCM_FORMAT_S20_3LE:

+			iface |= 0x04;

+			break;

+		case SNDRV_PCM_FORMAT_S24_LE:

+			break;

+		case SNDRV_PCM_FORMAT_S32_LE:

+			iface |= 0x10;

+			break;

+		}

+		/* set iface */

+		snd_soc_component_write(component, ES8311_SDPIN_REG09, iface);

+	} else {

+		iface = snd_soc_component_read(component,

+				ES8311_SDPOUT_REG0A) & 0xE3;

+		/* bit size */

+		switch (params_format(params)) {

+		case SNDRV_PCM_FORMAT_S16_LE:

+			iface |= 0x0c;

+			break;

+		case SNDRV_PCM_FORMAT_S20_3LE:

+			iface |= 0x04;

+			break;

+		case SNDRV_PCM_FORMAT_S24_LE:

+			break;

+		case SNDRV_PCM_FORMAT_S32_LE:

+			iface |= 0x10;

+			break;

+		}

+		/* set iface */

+		snd_soc_component_write(component, ES8311_SDPOUT_REG0A, iface);

+	}

+	return 0;

+}

+

+static int es8311_set_bias_level(struct snd_soc_component *component,

+			enum snd_soc_bias_level level)

+{

+	int regv;

+	struct es8311_private *es8311 = snd_soc_component_get_drvdata(component);

+

+	pr_info("Enter into %s(), level = %d\n", __func__, level);

+	switch (level) {

+	case SND_SOC_BIAS_ON:

+		pr_info("%s on\n", __func__);

+		snd_soc_component_write(component, ES8311_GP_REG45, 0x00);

+		if (es8311->mclk_src == ES8311_MCLK_PIN) {

+			snd_soc_component_write(component,

+					ES8311_CLK_MANAGER_REG01, 0x30);

+		} else {

+			snd_soc_component_write(component,

+					ES8311_CLK_MANAGER_REG01, 0xB0);

+		}

+		//snd_soc_component_write(component, ES8311_ADC_REG16, 0x24);

+		snd_soc_component_write(component, ES8311_SYSTEM_REG0B, 0x00);

+		snd_soc_component_write(component, ES8311_SYSTEM_REG0C, 0x00);

+		if (ES8311_AVDD == ES8311_1V8) {

+			snd_soc_component_write(component,

+					ES8311_SYSTEM_REG10, 0x61);

+			snd_soc_component_write(component,

+					ES8311_SYSTEM_REG11, 0x7B);

+		} else {

+			snd_soc_component_write(component,

+					ES8311_SYSTEM_REG10, 0x03);

+			snd_soc_component_write(component,

+					ES8311_SYSTEM_REG11, 0x57);

+		}

+

+		if (es8311->mclk_src == ES8311_MCLK_PIN) {

+			snd_soc_component_write(component,

+					ES8311_CLK_MANAGER_REG01, 0x3F);

+		} else {

+			snd_soc_component_write(component,

+					ES8311_CLK_MANAGER_REG01, 0xBF);

+		}

+		if (es8311->mclkinv == true) {

+			snd_soc_component_update_bits(component,

+					ES8311_CLK_MANAGER_REG01, 0x40, 0x40);

+		} else {

+			snd_soc_component_update_bits(component,

+					ES8311_CLK_MANAGER_REG01, 0x40, 0x00);

+		}

+		if (es8311->sclkinv == true) {

+			snd_soc_component_update_bits(component,

+					ES8311_CLK_MANAGER_REG06, 0x20, 0x20);

+		} else {

+			snd_soc_component_update_bits(component,

+					ES8311_CLK_MANAGER_REG06, 0x20, 0x00);

+		}

+

+		//digital reset

+		snd_soc_component_write(component, ES8311_RESET_REG00, 0x1f);

+		usleep_range(1000, 2000);

+		if (es8311->mastermode == 1) {

+			snd_soc_component_write(component,

+					ES8311_RESET_REG00, 0xC0);

+		} else {

+			snd_soc_component_write(component,

+					ES8311_RESET_REG00, 0x80);

+		}

+		usleep_range(1500, 3000);

+

+		snd_soc_component_write(component, ES8311_SYSTEM_REG0D, 0x01);

+

+		regv = snd_soc_component_read(component, ES8311_SYSTEM_REG14) & 0xCF;

+		regv |= 0x1A;

+		snd_soc_component_write(component, ES8311_SYSTEM_REG14, regv);

+

+		if (es8311->dmic_enable == true) {

+			snd_soc_component_update_bits(component, ES8311_SYSTEM_REG14,

+					0x40, 0x40);

+		} else {

+			snd_soc_component_update_bits(component, ES8311_SYSTEM_REG14,

+					0x40, 0x00);

+		}

+		snd_soc_component_write(component, ES8311_SYSTEM_REG12, 0x00);

+		snd_soc_component_write(component, ES8311_SYSTEM_REG13, 0x10);

+		snd_soc_component_write(component, ES8311_SYSTEM_REG0E, 0x02);

+		snd_soc_component_write(component, ES8311_SYSTEM_REG0F, 0x7F);

+		snd_soc_component_write(component, ES8311_ADC_REG15, 0x40);

+		snd_soc_component_write(component, ES8311_ADC_REG1B, 0x0A);

+		snd_soc_component_write(component, ES8311_ADC_REG1C, 0x6A);

+		snd_soc_component_write(component, ES8311_DAC_REG37, 0x48);

+		//snd_soc_component_write(component, ES8311_ADC_REG17, 0xBF);

+		//snd_soc_component_write(component, ES8311_DAC_REG32, 0xBF);

+		break;

+	case SND_SOC_BIAS_PREPARE:

+		pr_info("%s prepare\n", __func__);

+		break;

+	case SND_SOC_BIAS_STANDBY:

+		pr_info("%s standby\n", __func__);

+		if (es8311->bias_level == SND_SOC_BIAS_PREPARE) {

+			//snd_soc_component_write(component, ES8311_DAC_REG32, 0x00);

+			//snd_soc_component_write(component, ES8311_ADC_REG17, 0x00);

+			snd_soc_component_write(component, ES8311_SYSTEM_REG0E, 0xFF);

+			snd_soc_component_write(component, ES8311_SYSTEM_REG12, 0x02);

+			snd_soc_component_write(component, ES8311_SYSTEM_REG14, 0x00);

+			snd_soc_component_write(component, ES8311_SYSTEM_REG0D, 0xF9);

+			snd_soc_component_write(component, ES8311_ADC_REG15, 0x00);

+			snd_soc_component_write(component, ES8311_DAC_REG37, 0x08);

+			snd_soc_component_write(component, ES8311_CLK_MANAGER_REG02, 0x10);

+			snd_soc_component_write(component, ES8311_RESET_REG00, 0x00);

+			snd_soc_component_write(component, ES8311_RESET_REG00, 0x1F);

+			snd_soc_component_write(component, ES8311_CLK_MANAGER_REG01, 0x30);

+			snd_soc_component_write(component, ES8311_CLK_MANAGER_REG01, 0x00);

+			snd_soc_component_write(component, ES8311_GP_REG45, 0x00);

+		}

+		break;

+	case SND_SOC_BIAS_OFF:

+		pr_info("%s off\n", __func__);

+		if (es8311->bias_level == SND_SOC_BIAS_STANDBY) {

+			//snd_soc_component_write(component, ES8311_DAC_REG32, 0x00);

+			//snd_soc_component_write(component, ES8311_ADC_REG17, 0x00);

+			snd_soc_component_write(component, ES8311_SYSTEM_REG0E, 0xFF);

+			snd_soc_component_write(component, ES8311_SYSTEM_REG12, 0x02);

+			snd_soc_component_write(component, ES8311_SYSTEM_REG14, 0x00);

+			snd_soc_component_write(component, ES8311_SYSTEM_REG0D, 0xF9);

+			snd_soc_component_write(component, ES8311_ADC_REG15, 0x00);

+			snd_soc_component_write(component, ES8311_DAC_REG37, 0x08);

+			snd_soc_component_write(component, ES8311_CLK_MANAGER_REG02, 0x10);

+			snd_soc_component_write(component, ES8311_RESET_REG00, 0x00);

+			snd_soc_component_write(component, ES8311_RESET_REG00, 0x1F);

+			snd_soc_component_write(component, ES8311_CLK_MANAGER_REG01, 0x30);

+			snd_soc_component_write(component, ES8311_CLK_MANAGER_REG01, 0x00);

+			snd_soc_component_write(component, ES8311_GP_REG45, 0x00);

+			snd_soc_component_write(component, ES8311_SYSTEM_REG0D, 0xFC);

+			snd_soc_component_write(component, ES8311_CLK_MANAGER_REG02, 0x00);

+		}

+		break;

+	}

+	es8311->bias_level = level;

+	return 0;

+}

+

+static int es8311_set_tristate(struct snd_soc_dai *dai, int tristate)

+{

+	struct snd_soc_component *component = dai->component;

+

+	pr_info("Enter into %s(), tristate = %d\n", __func__, tristate);

+	if (tristate) {

+		snd_soc_component_update_bits(component,

+				ES8311_CLK_MANAGER_REG07, 0x30, 0x30);

+	} else {

+		snd_soc_component_update_bits(component,

+				ES8311_CLK_MANAGER_REG07, 0x30, 0x00);

+	}

+	return 0;

+}

+

+static int es8311_mute(struct snd_soc_dai *dai, int mute, int direction)

+{

+	struct snd_soc_component *component = dai->component;

+

+	pr_info("Enter into %s(), mute = %d\n", __func__, mute);

+

+	if (mute) {

+		snd_soc_component_write(component, ES8311_SYSTEM_REG12,

+				0x02);

+		snd_soc_component_update_bits(component, ES8311_DAC_REG31,

+				0x60, 0x60);

+		//snd_soc_component_write(component, ES8311_DAC_REG32, 0x00);

+	} else {

+		snd_soc_component_update_bits(component, ES8311_DAC_REG31,

+				0x60, 0x00);

+		snd_soc_component_write(component, ES8311_SYSTEM_REG12,

+				0x00);

+		//snd_soc_component_write(component, ES8311_DAC_REG32, 0xbf);

+	}

+	return 0;

+}

+

+#define es8311_RATES SNDRV_PCM_RATE_8000_96000

+

+#define es8311_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\

+		SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE)

+

+static const struct snd_soc_dai_ops es8311_ops = {

+	.startup = es8311_pcm_startup,

+	.hw_params = es8311_pcm_hw_params,

+	.set_fmt = es8311_set_dai_fmt,

+	.set_sysclk = es8311_set_dai_sysclk,

+	.mute_stream = es8311_mute,

+	.set_tristate = es8311_set_tristate,

+};

+

+static struct snd_soc_dai_driver es8311_dai = {

+	.name = "ES8311 HiFi",

+	.playback = {

+		.stream_name = "Playback",

+		.channels_min = 1,

+		.channels_max = 2,

+		.rates = es8311_RATES,

+		.formats = es8311_FORMATS,

+	},

+	.capture = {

+		.stream_name = "Capture",

+		.channels_min = 1,

+		.channels_max = 2,

+		.rates = es8311_RATES,

+		.formats = es8311_FORMATS,

+	},

+	.ops = &es8311_ops,

+	.symmetric_rates = 1,

+};

+

+static int es8311_suspend(struct snd_soc_component *component)

+{

+	pr_info("Enter into %s()\n", __func__);

+	//snd_soc_component_write(component, ES8311_DAC_REG32, 0x00);

+	//snd_soc_component_write(component, ES8311_ADC_REG17, 0x00);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG0E, 0xFF);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG12, 0x02);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG14, 0x00);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG0D, 0xF9);

+	snd_soc_component_write(component, ES8311_ADC_REG15, 0x00);

+	snd_soc_component_write(component, ES8311_DAC_REG37, 0x08);

+	snd_soc_component_write(component, ES8311_CLK_MANAGER_REG02, 0x10);

+	snd_soc_component_write(component, ES8311_RESET_REG00, 0x00);

+	snd_soc_component_write(component, ES8311_RESET_REG00, 0x1F);

+	snd_soc_component_write(component, ES8311_CLK_MANAGER_REG01, 0x30);

+	snd_soc_component_write(component, ES8311_CLK_MANAGER_REG01, 0x00);

+	snd_soc_component_write(component, ES8311_GP_REG45, 0x00);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG0D, 0xFC);

+	snd_soc_component_write(component, ES8311_CLK_MANAGER_REG02, 0x00);

+	return 0;

+}

+

+static int es8311_resume(struct snd_soc_component *component)

+{

+	struct es8311_private *es8311 = snd_soc_component_get_drvdata(component);

+

+	pr_info("Enter into %s()\n", __func__);

+	snd_soc_component_write(component, ES8311_GP_REG45, 0x00);

+	snd_soc_component_write(component, ES8311_CLK_MANAGER_REG01, 0x30);

+	snd_soc_component_write(component, ES8311_CLK_MANAGER_REG02, 0x00);

+	snd_soc_component_write(component, ES8311_CLK_MANAGER_REG03, 0x10);

+	snd_soc_component_write(component, ES8311_ADC_REG16, 0x24);

+	snd_soc_component_write(component, ES8311_CLK_MANAGER_REG04, 0x10);

+	snd_soc_component_write(component, ES8311_CLK_MANAGER_REG05, 0x00);

+	snd_soc_component_write(component, ES8311_SDPIN_REG09, 0x00);

+	snd_soc_component_write(component, ES8311_SDPOUT_REG0A, 0x00);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG0B, 0x00);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG0C, 0x00);

+

+	if (ES8311_AVDD == ES8311_1V8) {

+		snd_soc_component_write(component, ES8311_SYSTEM_REG10, 0x61);

+		snd_soc_component_write(component, ES8311_SYSTEM_REG11, 0x7B);

+	} else {

+		snd_soc_component_write(component, ES8311_SYSTEM_REG10, 0x03);

+		snd_soc_component_write(component, ES8311_SYSTEM_REG11, 0x57);

+	}

+	if (es8311->mclk_src == ES8311_MCLK_PIN) {

+		snd_soc_component_write(component, ES8311_CLK_MANAGER_REG01, 0x3F);

+		snd_soc_component_write(component, ES8311_CLK_MANAGER_REG01, 0xBF);

+	}

+	if (es8311->mastermode == 1)

+		snd_soc_component_write(component, ES8311_RESET_REG00, 0xC0);

+	else

+		snd_soc_component_write(component, ES8311_RESET_REG00, 0x80);

+

+	usleep_range(1500, 3000);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG0D, 0x01);

+

+	if (es8311->mclkinv == true) {

+		snd_soc_component_update_bits(component, ES8311_CLK_MANAGER_REG01,

+				0x40, 0x40);

+	} else {

+		snd_soc_component_update_bits(component, ES8311_CLK_MANAGER_REG01,

+				0x40, 0x00);

+	}

+	if (es8311->sclkinv == true) {

+		snd_soc_component_update_bits(component, ES8311_CLK_MANAGER_REG06,

+				0x20, 0x20);

+	} else {

+		snd_soc_component_update_bits(component, ES8311_CLK_MANAGER_REG06,

+				0x20, 0x00);

+	}

+	snd_soc_component_write(component, ES8311_SYSTEM_REG14, 0x1A);

+	if (es8311->dmic_enable == true) {

+		snd_soc_component_update_bits(component, ES8311_SYSTEM_REG14,

+				0x40, 0x40);

+	} else {

+		snd_soc_component_update_bits(component, ES8311_SYSTEM_REG14,

+				0x40, 0x00);

+	}

+	snd_soc_component_write(component, ES8311_SYSTEM_REG12, 0x00);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG13, 0x10);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG0E, 0x02);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG0F, 0x7F);

+	snd_soc_component_write(component, ES8311_ADC_REG15, 0x40);

+	snd_soc_component_write(component, ES8311_ADC_REG1B, 0x0A);

+	snd_soc_component_write(component, ES8311_ADC_REG1C, 0x6A);

+	snd_soc_component_write(component, ES8311_DAC_REG37, 0x48);

+	snd_soc_component_write(component, ES8311_ADC_REG17, 0xBF);

+	snd_soc_component_write(component, ES8311_DAC_REG32, 0xBF);

+

+	return 0;

+}

+

+static int es8311_probe(struct snd_soc_component *component)

+{

+	int ret = 0;

+	struct es8311_private *es8311 = es8311_data;

+

+	pr_info("Enter into %s()\n", __func__);

+

+	snd_soc_component_set_drvdata(component, es8311);

+	if (component == NULL) {

+		dev_err(component->dev, "Codec device not registered\n");

+		return -ENODEV;

+	}

+	es8311_component = component;

+	es8311->component = component;

+

+	es8311->mastermode = 0;

+	es8311->mclk_src = ES8311_MCLK_SOURCE;

+	/* Enable the following code if there is no mclk.

+	 * a clock named "mclk" need to be defined in the dts (see sample dts)

+	 *

+	 * No need to enable the following code to get mclk if:

+	 * 1. sclk/bclk is used as mclk

+	 * 2. mclk is controled by soc I2S

+	 */

+	if (es8311->mclk_src == ES8311_MCLK_PIN) {

+		es8311->mclk = devm_clk_get(component->dev, "mclk");

+		if (IS_ERR(es8311->mclk)) {

+			dev_err(component->dev, "%s,unable to get mclk\n", __func__);

+			return PTR_ERR(es8311->mclk);

+		}

+		if (!es8311->mclk)

+			dev_err(component->dev, "%s, assuming static mclk\n", __func__);

+

+		ret = clk_prepare_enable(es8311->mclk);

+		if (ret) {

+			dev_err(component->dev, "%s, unable to enable mclk\n", __func__);

+			return ret;

+		}

+	}

+	snd_soc_component_write(component, ES8311_GP_REG45, 0x00);

+	snd_soc_component_write(component, ES8311_CLK_MANAGER_REG01, 0x30);

+	snd_soc_component_write(component, ES8311_CLK_MANAGER_REG02, 0x00);

+	snd_soc_component_write(component, ES8311_CLK_MANAGER_REG03, 0x10);

+	snd_soc_component_write(component, ES8311_ADC_REG16, 0x24);

+	snd_soc_component_write(component, ES8311_CLK_MANAGER_REG04, 0x10);

+	snd_soc_component_write(component, ES8311_CLK_MANAGER_REG05, 0x00);

+	snd_soc_component_write(component, ES8311_SDPIN_REG09, 0x00);

+	snd_soc_component_write(component, ES8311_SDPOUT_REG0A, 0x00);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG0B, 0x00);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG0C, 0x00);

+	if (ES8311_AVDD == ES8311_1V8) {

+		snd_soc_component_write(component, ES8311_SYSTEM_REG10, 0x61);

+		snd_soc_component_write(component, ES8311_SYSTEM_REG11, 0x7B);

+	} else {

+		snd_soc_component_write(component, ES8311_SYSTEM_REG10, 0x03);

+		snd_soc_component_write(component, ES8311_SYSTEM_REG11, 0x57);

+	}

+

+	if (es8311->mclk_src == ES8311_MCLK_PIN)

+		snd_soc_component_write(component, ES8311_CLK_MANAGER_REG01, 0x3F);

+	else

+		snd_soc_component_write(component, ES8311_CLK_MANAGER_REG01, 0xBF);

+

+	if (es8311->mastermode == 1)

+		snd_soc_component_write(component, ES8311_RESET_REG00, 0xC0);

+	else

+		snd_soc_component_write(component, ES8311_RESET_REG00, 0x80);

+

+	usleep_range(1500, 3000);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG0D, 0x01);

+

+	if (es8311->mclkinv == true) {

+		snd_soc_component_update_bits(component, ES8311_CLK_MANAGER_REG01,

+				0x40, 0x40);

+	} else {

+		snd_soc_component_update_bits(component, ES8311_CLK_MANAGER_REG01,

+				0x40, 0x00);

+	}

+	if (es8311->sclkinv == true) {

+		snd_soc_component_update_bits(component, ES8311_CLK_MANAGER_REG06,

+				0x20, 0x20);

+	} else {

+		snd_soc_component_update_bits(component, ES8311_CLK_MANAGER_REG06,

+				0x20, 0x00);

+	}

+	snd_soc_component_write(component, ES8311_SYSTEM_REG14, 0x1A);

+	if (es8311->dmic_enable == true) {

+		snd_soc_component_update_bits(component, ES8311_SYSTEM_REG14,

+				0x40, 0x40);

+	} else {

+		snd_soc_component_update_bits(component, ES8311_SYSTEM_REG14,

+				0x40, 0x00);

+	}

+	snd_soc_component_write(component, ES8311_SYSTEM_REG12, 0x00);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG13, 0x10);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG0E, 0x02);

+	snd_soc_component_write(component, ES8311_SYSTEM_REG0F, 0x7F);

+	snd_soc_component_write(component, ES8311_ADC_REG15, 0x40);

+	snd_soc_component_write(component, ES8311_ADC_REG1B, 0x0A);

+	snd_soc_component_write(component, ES8311_ADC_REG1C, 0x6A);

+	snd_soc_component_write(component, ES8311_DAC_REG37, 0x48);

+	snd_soc_component_write(component, ES8311_ADC_REG17, 0xBF);

+	snd_soc_component_write(component, ES8311_DAC_REG32, 0xBF);

+	msleep(100);

+	es8311_set_bias_level(component, SND_SOC_BIAS_STANDBY);

+

+	return ret;

+}

+

+static void es8311_remove(struct snd_soc_component *component)

+{

+	es8311_set_bias_level(component, SND_SOC_BIAS_OFF);

+}

+static int clkout_init_pinctrl(struct device *dev)

+{

+

+	struct pinctrl *pctrl;

+	struct pinctrl_state *state0;

+	struct clk 	*clk;	

+	int ret;

+	struct es8311_private *info = dev_get_drvdata(dev);

+	struct device_node *np = dev->of_node;

+

+	dev_info(dev, "%s:start!\n", __func__);

+

+	if(dev == NULL){

+		dev_err(dev, "%s:dev is null ,return\n",__func__);

+		return -EINVAL;

+

+	}

+	dev_info(dev, "%s: get clk pinctrl\n", __func__);

+	

+	pctrl = devm_pinctrl_get(dev);

+	if (IS_ERR(pctrl)) {

+		dev_warn(dev, "Failed to get clk_test pins\n");

+		pctrl = NULL;

+		return -EINVAL;

+	}

+

+

+	state0 = pinctrl_lookup_state(pctrl, "clk_out");

+	if (IS_ERR(state0)) {

+		devm_pinctrl_put(pctrl);

+		dev_err(dev, "missing clk_out\n");

+		return -EINVAL;

+	}

+

+	dev_info(dev, "%s: select pinctrl\n", __func__);

+

+	if ( pinctrl_select_state(pctrl, state0) < 0) {

+		//devm_pinctrl_put(pctrl);

+		dev_err(dev, "setting clk_out failed\n");

+		ret = -EINVAL;

+		goto err_put_pinctrl;

+	}

+

+	

+	dev_info(dev, "%s: get clk\n", __func__);

+

+

+

+	

+	clk = of_clk_get_by_name(np, "clk_out");	

+	if (IS_ERR(clk)) {

+		dev_err(dev, "Could not get clk_out\n");

+		ret = PTR_ERR(clk);

+		goto err_put_pinctrl;

+	}			

+

+

+

+#if 1

+	dev_info(dev, "%s: clk prepare\n", __func__);

+

+	ret = clk_prepare(clk);

+	if (ret) {

+		dev_err(dev, "failed to clk prepare\n");

+		goto err_put_clk;

+

+	}

+

+#else

+	dev_info(dev, "%s: clk enable\n", __func__);

+

+	ret = clk_prepare_enable(clk);

+	if (ret) {

+		dev_err(dev, "failed to enable clkout");

+		goto err_put_clk;

+

+	}

+

+#endif

+	if(info != NULL){

+		

+		dev_info(dev, "%s: set drvdata\n", __func__);

+		info->pctrl = pctrl;

+		info->state0 = state0;

+		info->clk = clk;	

+	}

+	else{

+		dev_info(dev, "%s: info is null\n", __func__);

+

+	}

+	dev_info(dev, "%s: init clkout end!\n",__func__);

+    return 0;

+err_put_clk:	

+	clk_put(clk);	

+err_put_pinctrl:	

+	devm_pinctrl_put(pctrl);

+	

+

+	return ret;

+

+			

+}

+

+static int component_open(struct snd_soc_component *component,

+	struct snd_pcm_substream *substream)

+{

+

+	int ret = 0;

+	struct es8311_private *info = snd_soc_component_get_drvdata(component);

+

+	if(info->clk != NULL){

+

+		ret = clk_enable(info->clk);

+		if (ret) {

+			pr_err( "failed to enable clkout");

+		}

+	}

+	

+	pr_info("%s:clk en end!\n",__func__);

+

+	return ret;

+

+

+	

+

+}		

+static int component_close(struct snd_soc_component *component,

+	struct snd_pcm_substream *substream)

+{

+

+	int ret = 0;

+	struct es8311_private *info = snd_soc_component_get_drvdata(component);

+

+

+	if(info->clk != NULL){

+

+		clk_disable(info->clk);

+

+	}

+	pr_info("%s:clk dis end!\n",__func__);

+

+	return ret;

+

+

+	

+

+}		

+

+static const struct snd_soc_component_driver soc_component_dev_es8311 = {

+	.probe = es8311_probe,

+	.remove = es8311_remove,

+	.suspend = es8311_suspend,

+	.resume = es8311_resume,

+	.set_bias_level = es8311_set_bias_level,

+	.suspend_bias_off = 1,

+	.idle_bias_on = 1,

+

+	.controls = es8311_snd_controls,

+	.num_controls = ARRAY_SIZE(es8311_snd_controls),

+	.dapm_widgets = es8311_dapm_widgets,

+	.num_dapm_widgets = ARRAY_SIZE(es8311_dapm_widgets),

+	.dapm_routes = es8311_dapm_routes,

+	.num_dapm_routes = ARRAY_SIZE(es8311_dapm_routes),

+	.open = component_open,

+	.close = component_close,	

+};

+

+static struct regmap_config es8311_regmap = {

+	.reg_bits = 8,

+	.val_bits = 8,

+

+	.max_register = ES8311_MAX_REGISTER,

+

+	.volatile_reg = es8311_volatile_register,

+	.writeable_reg = es8311_writable_register,

+	.readable_reg  = es8311_readable_register,

+	.cache_type = REGCACHE_RBTREE,

+};

+

+#ifdef CONFIG_OF

+static const struct of_device_id es8311_if_dt_ids[] = {

+	{.compatible = "everest,es8311", },

+	{ }

+};

+MODULE_DEVICE_TABLE(of, es8311_if_dt_ids);

+#endif

+

+static void es8311_i2c_shutdown(struct i2c_client *i2c)

+{

+

+}

+

+static u32 cur_reg;

+

+static ssize_t es8311_show(struct device *dev,

+			struct device_attribute *attr, char *_buf)

+{

+	int ret;

+

+	ret = sprintf(_buf, "%s(): get 0x%04x=0x%04x\n", __func__, cur_reg,

+			snd_soc_component_read(es8311_component, cur_reg));

+	return ret;

+}

+

+static ssize_t es8311_store(struct device *dev, struct device_attribute *attr,

+		const char *buf, size_t count)

+{

+	int val = 0, flag = 0;

+	u8 i = 0, reg, num, value_w, value_r;

+

+	val = simple_strtol(buf, NULL, 16);

+	flag = (val >> 16) & 0xFF;

+

+	if (flag) {

+		reg = (val >> 8) & 0xFF;

+		value_w = val & 0xFF;

+		pr_info("\nWrite: start REG:0x%02x,val:0x%02x,count:0x%02x\n",

+				reg, value_w, flag);

+		while (flag--) {

+			snd_soc_component_write(es8311_component, reg, value_w);

+			pr_info("Write 0x%02x to REG:0x%02x\n", value_w, reg);

+			reg++;

+		}

+	} else {

+		reg = (val >> 8) & 0xFF;

+		num = val & 0xff;

+		pr_info("\nRead: start REG:0x%02x,count:0x%02x\n", reg, num);

+		do {

+			value_r = 0;

+			value_r = snd_soc_component_read(es8311_component, reg);

+			pr_info("REG[0x%02x]: 0x%02x;\n", reg, value_r);

+			reg++;

+			i++;

+		} while (i < num);

+	}

+

+	return count;

+}

+

+static DEVICE_ATTR(es8311, 0664, es8311_show, es8311_store);

+

+static struct attribute *es8311_debug_attrs[] = {

+	&dev_attr_es8311.attr,

+	NULL,

+};

+

+static struct attribute_group es8311_debug_attr_group = {

+	.name   = "es8311_debug",

+	.attrs  = es8311_debug_attrs,

+};

+

+static int es8311_i2c_probe(struct i2c_client *i2c_client,

+					const struct i2c_device_id *id)

+{

+	struct es8311_private *es8311;

+	int ret = -1;

+	unsigned int val;

+

+	pr_info("Enter into %s\n", __func__);

+	es8311 = devm_kzalloc(&i2c_client->dev,

+			sizeof(*es8311), GFP_KERNEL);

+	if (es8311 == NULL)

+		return -ENOMEM;

+

+	es8311->dmic_enable = false;     // dmic interface disabled

+	/* the edge of lrck is always at the falling edge of mclk */

+	es8311->mclkinv = false;

+	/* the edge of lrck is always at the falling edge of sclk */

+	es8311->sclkinv = false;

+

+	i2c_set_clientdata(i2c_client, es8311);

+	es8311->regmap = devm_regmap_init_i2c(i2c_client, &es8311_regmap);

+	if (IS_ERR(es8311->regmap)) {

+		ret = PTR_ERR(es8311->regmap);

+		dev_err(&i2c_client->dev, "regmap_init() failed: %d\n", ret);

+		return ret;

+	}

+	/* verify that we have an es8311 */

+	ret = regmap_read(es8311->regmap, ES8311_CHD1_REGFD, &val);

+	if (ret < 0) {

+		dev_err(&i2c_client->dev, "failed to read i2c at addr %X\n",

+		       i2c_client->addr);

+		return ret;

+	}

+	/* The first ID should be 0x83 */

+	if (val != 0x83) {

+		dev_err(&i2c_client->dev, "device at addr %X is not an es8311\n",

+		       i2c_client->addr);

+		return -ENODEV;

+	}

+	ret = regmap_read(es8311->regmap, ES8311_CHD2_REGFE, &val);

+	/* The NEXT ID should be 0x11 */

+	if (val != 0x11) {

+		dev_err(&i2c_client->dev, "device at addr %X is not an es8311\n",

+		       i2c_client->addr);

+		return -ENODEV;

+	}

+	es8311_data = es8311;

+	

+	es8311->pctrl = NULL;

+	es8311->state0 = NULL;

+	es8311->clk = NULL;	

+	

+	clkout_init_pinctrl(&i2c_client->dev);

+

+	ret =  snd_soc_register_component(&i2c_client->dev,

+			&soc_component_dev_es8311,

+			&es8311_dai,

+			1);

+	if (ret < 0) {

+		kfree(es8311);

+		return ret;

+	}

+

+	pr_info("Enter into %s-----4\n", __func__);

+	ret = sysfs_create_group(&i2c_client->dev.kobj,

+				&es8311_debug_attr_group);

+	if (ret)

+		pr_err("failed to create attr group\n");

+

+	return ret;

+}

+

+static const struct i2c_device_id es8311_i2c_id[] = {

+	{"es8311", 0 },

+	{ }

+};

+MODULE_DEVICE_TABLE(i2c, es8311_i2c_id);

+

+static struct i2c_driver es8311_i2c_driver = {

+	.driver = {

+		.name	= "es8311",

+		.owner	= THIS_MODULE,

+		.of_match_table = es8311_if_dt_ids,

+	},

+	.shutdown = es8311_i2c_shutdown,

+	.probe = es8311_i2c_probe,

+	.id_table	= es8311_i2c_id,

+};

+

+static int __init es8311_init(void)

+{

+	int ret;

+

+	ret = i2c_add_driver(&es8311_i2c_driver);

+	if (ret != 0)

+		pr_info("Failed to register es8311 i2c driver\n");

+	return ret;

+}

+

+static void __exit es8311_exit(void)

+{

+	return i2c_del_driver(&es8311_i2c_driver);

+}

+

+late_initcall(es8311_init);

+module_exit(es8311_exit);

+

+MODULE_DESCRIPTION("ASoC es8311 driver");

+MODULE_AUTHOR("David Yang <yangxiaohua@everest-semi.com>");

+MODULE_LICENSE("GPL");

+

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/es8311.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/es8311.h
new file mode 100755
index 0000000..6ffc3d9
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/es8311.h
@@ -0,0 +1,82 @@
+/*

+* ES8311.h  --  ES8311 ALSA SoC Audio Codec

+*

+* Authors:

+*

+* Based on ES8374.h by David Yang

+*

+* This program is free software; you can redistribute it and/or modify

+* it under the terms of the GNU General Public License version 2 as

+* published by the Free Software Foundation.

+*/

+

+#ifndef _ES8311_H

+#define _ES8311_H

+

+/*

+*	ES8311_REGISTER NAME_REG_REGISTER ADDRESS

+*/

+#define ES8311_RESET_REG00			0x00  /*reset digital,csm,clock manager etc.*/

+

+/*

+* Clock Scheme Register definition

+*/

+#define ES8311_CLK_MANAGER_REG01		0x01 /* select clk src for mclk, enable clock for codec */

+#define ES8311_CLK_MANAGER_REG02		0x02 /* clk divider and clk multiplier */

+#define ES8311_CLK_MANAGER_REG03		0x03 /* adc fsmode and osr  */

+#define ES8311_CLK_MANAGER_REG04		0x04 /* dac osr */

+#define ES8311_CLK_MANAGER_REG05		0x05 /* clk divier for adc and dac */

+#define ES8311_CLK_MANAGER_REG06		0x06 /* bclk inverter and divider */

+#define ES8311_CLK_MANAGER_REG07		0x07 /* tri-state, lrck divider */

+#define ES8311_CLK_MANAGER_REG08		0x08 /* lrck divider */

+#define ES8311_SDPIN_REG09			0x09 /* dac serial digital port */

+#define ES8311_SDPOUT_REG0A			0x0A /* adc serial digital port */

+#define ES8311_SYSTEM_REG0B			0x0B /* system */

+#define ES8311_SYSTEM_REG0C			0x0C /* system */

+#define ES8311_SYSTEM_REG0D			0x0D /* system, power up/down */

+#define ES8311_SYSTEM_REG0E			0x0E /* system, power up/down */

+#define ES8311_SYSTEM_REG0F			0x0F /* system, low power */

+#define ES8311_SYSTEM_REG10			0x10 /* system */

+#define ES8311_SYSTEM_REG11			0x11 /* system */

+#define ES8311_SYSTEM_REG12			0x12 /* system, Enable DAC */

+#define ES8311_SYSTEM_REG13			0x13 /* system */

+#define ES8311_SYSTEM_REG14			0x14 /* system, select DMIC, select analog pga gain */

+#define ES8311_ADC_REG15			0x15 /* ADC, adc ramp rate, dmic sense */

+#define ES8311_ADC_REG16			0x16 /* ADC */

+#define ES8311_ADC_REG17			0x17 /* ADC, volume */

+#define ES8311_ADC_REG18			0x18 /* ADC, alc enable and winsize */

+#define ES8311_ADC_REG19			0x19 /* ADC, alc maxlevel */

+#define ES8311_ADC_REG1A			0x1A /* ADC, alc automute */

+#define ES8311_ADC_REG1B			0x1B /* ADC, alc automute, adc hpf s1 */

+#define ES8311_ADC_REG1C			0x1C /* ADC, equalizer, hpf s2 */

+#define ES8311_DAC_REG31			0x31 /* DAC, mute */

+#define ES8311_DAC_REG32			0x32 /* DAC, volume */

+#define ES8311_DAC_REG33			0x33 /* DAC, offset */

+#define ES8311_DAC_REG34			0x34 /* DAC, drc enable, drc winsize */

+#define ES8311_DAC_REG35			0x35 /* DAC, drc maxlevel, minilevel */

+#define ES8311_DAC_REG37			0x37 /* DAC, ramprate */

+#define ES8311_GPIO_REG44			0x44 /* GPIO, dac2adc for test */

+#define ES8311_GP_REG45				0x45 /* GP CONTROL */

+#define ES8311_CHD1_REGFD			0xFD /* CHIP ID1 */

+#define ES8311_CHD2_REGFE			0xFE /* CHIP ID2 */

+#define ES8311_CHVER_REGFF			0xFF /* VERSION */

+#define ES8311_CHD1_REGFD			0xFD /* CHIP ID1 */

+

+#define ES8311_MAX_REGISTER			0xFF

+

+enum vmidlow {

+	VMIDLEVEL0,

+	VMIDLEVEL1,

+	VMIDLEVEL2,

+	VMIDLEVEL3,

+};

+/* The VMIDLEVEL is different for 1.8V AVDD */

+#define ES8311_3V3 0

+#define ES8311_1V8 1

+#define ES8311_AVDD ES8311_3V3

+

+#define ES8311_MCLK_PIN	0

+#define ES8311_BCLK_PIN 1

+#define ES8311_MCLK_SOURCE	ES8311_MCLK_PIN

+

+#endif

diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/nau8810.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/nau8810.c
old mode 100644
new mode 100755
index 1abe512..88539d9
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/nau8810.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/nau8810.c
@@ -31,7 +31,6 @@
 #include <linux/clk.h>
 #include <linux/clk-provider.h>
 
-
 #define NAU_PLL_FREQ_MAX 100000000
 #define NAU_PLL_FREQ_MIN 90000000
 #define NAU_PLL_REF_MAX 33000000
@@ -636,16 +635,7 @@
 
 
 
-#if 0
-	dev_info(dev, "%s: clk enable\n", __func__);
-
-	ret = clk_prepare_enable(clk);
-	if (ret) {
-		dev_err(dev, "failed to enable clkout");
-		goto err_put_clk;
-
-	}
-#else
+#if 1
 	dev_info(dev, "%s: clk prepare\n", __func__);
 
 	ret = clk_prepare(clk);
@@ -654,6 +644,16 @@
 		goto err_put_clk;
 
 	}
+
+#else
+	dev_info(dev, "%s: clk enable\n", __func__);
+
+	ret = clk_prepare_enable(clk);
+	if (ret) {
+		dev_err(dev, "failed to enable clkout");
+		goto err_put_clk;
+
+	}
 #endif
 	if(nau8810 != NULL){
 		
@@ -1100,6 +1100,55 @@
 }
 
 
+
+static int component_open(struct snd_soc_component *component,
+	struct snd_pcm_substream *substream)
+{
+
+	int ret = 0;
+	struct nau8810 *info = snd_soc_component_get_drvdata(component);
+
+	if(info->clk != NULL){
+
+		ret = clk_enable(info->clk);
+		if (ret) {
+			pr_err( "failed to enable clkout");
+		}
+	}
+	
+	pr_info("%s:clk en end!\n",__func__);
+
+	return ret;
+
+
+	
+
+}		
+static int component_close(struct snd_soc_component *component,
+	struct snd_pcm_substream *substream)
+{
+
+	int ret = 0;
+	struct nau8810 *info = snd_soc_component_get_drvdata(component);
+
+
+	if(info->clk != NULL){
+
+		clk_disable(info->clk);
+
+	}
+	pr_info("%s:clk dis end!\n",__func__);
+
+	return ret;
+
+
+	
+
+}		
+
+
+
+
 #define NAU8810_RATES (SNDRV_PCM_RATE_8000_48000)
 
 #define NAU8810_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
@@ -1159,6 +1208,8 @@
 	.use_pmdown_time	= 1,
 	.endianness		= 1,
 	.non_legacy_dai_naming	= 1,
+	.open = component_open,
+	.close = component_close,	
 };
 
 static int nau8810_i2c_probe(struct i2c_client *i2c,
@@ -1216,49 +1267,6 @@
 
 
 
-
-static int codec_pm_suspend(struct device *dev)
-{
-	int ret = 0;
-
-	struct nau8810	*info =  dev_get_drvdata(dev);
-
-	dev_info(dev,"%s: clk dis!\n",__func__);
-	if(info->clk != NULL){
-
-		clk_disable(info->clk);
-
-	}
-	dev_info(dev,"%s: end!\n",__func__);
-
-	return ret;
-}
-
-static int codec_pm_resume(struct device *dev)
-{
-	int ret = 0;
-	struct nau8810	*info =  dev_get_drvdata(dev);
-
-	dev_info(dev,"%s: clk en!\n",__func__);
-	if(info->clk != NULL){
-
-		ret = clk_enable(info->clk);
-		if (ret) {
-			dev_err(dev, "failed to enable clkout");
-		}
-	}
-	
-	dev_info(dev,"%s: end!\n",__func__);
-
-	return ret;
-}
-const struct dev_pm_ops codec_pm = {
-	.suspend = codec_pm_suspend,
-	.resume = codec_pm_resume,
-
-};
-
-
 static const struct i2c_device_id nau8810_i2c_id[] = {
 	{ "nau8810", 0 },
 	{ "nau8812", 0 },
@@ -1284,7 +1292,6 @@
 	},
 	.probe =    nau8810_i2c_probe,
 	.id_table = nau8810_i2c_id,
-	.driver.pm = &codec_pm,
 
 };
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/tlv320aic3x.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/tlv320aic3x.c
old mode 100644
new mode 100755
index 6d066bc..4f01cbc
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/tlv320aic3x.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/codecs/tlv320aic3x.c
@@ -49,7 +49,8 @@
 #include <sound/tlv320aic3x.h>
 
 #include "tlv320aic3x.h"
-
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
 #define AIC3X_NUM_SUPPLIES	4
 static const char *aic3x_supply_names[AIC3X_NUM_SUPPLIES] = {
 	"IOVDD",	/* I/O Voltage */
@@ -92,6 +93,12 @@
 	enum aic3x_micbias_voltage micbias_vg;
 	/* Output Common-Mode Voltage */
 	u8 ocmv;
+
+	//add new
+	struct pinctrl *pctrl;
+	struct pinctrl_state *state0;
+	struct clk 	*clk;	
+	
 };
 
 static const struct reg_default aic3x_reg[] = {
@@ -1001,6 +1008,353 @@
 	{"SPOP", NULL, "Left Class-D Out"},
 	{"SPOM", NULL, "Right Class-D Out"},
 };
+static int clkout_init_pinctrl(struct device *dev)
+{
+
+	struct pinctrl *pctrl;
+	struct pinctrl_state *state0;
+	struct clk	*clk;	
+	int ret;
+	struct aic3x_priv *info = dev_get_drvdata(dev);
+	struct device_node *np = dev->of_node;
+
+	dev_info(dev, "%s:start!\n", __func__);
+
+	if(dev == NULL){
+		dev_err(dev, "%s:dev is null ,return\n",__func__);
+		return -EINVAL;
+
+	}
+	dev_info(dev, "%s: get clk pinctrl\n", __func__);
+	
+	pctrl = devm_pinctrl_get(dev);
+	if (IS_ERR(pctrl)) {
+		dev_warn(dev, "Failed to get clk_test pins\n");
+		pctrl = NULL;
+		return -EINVAL;
+	}
+
+
+	state0 = pinctrl_lookup_state(pctrl, "clk_out");
+	if (IS_ERR(state0)) {
+		devm_pinctrl_put(pctrl);
+		dev_err(dev, "missing clk_out\n");
+		return -EINVAL;
+	}
+
+	dev_info(dev, "%s: select pinctrl\n", __func__);
+
+	if ( pinctrl_select_state(pctrl, state0) < 0) {
+		//devm_pinctrl_put(pctrl);
+		dev_err(dev, "setting clk_out failed\n");
+		ret = -EINVAL;
+		goto err_put_pinctrl;
+	}
+
+	
+	dev_info(dev, "%s: get clk\n", __func__);
+
+
+
+	
+	clk = of_clk_get_by_name(np, "clk_out");	
+	if (IS_ERR(clk)) {
+		dev_err(dev, "Could not get clk_out\n");
+		ret = PTR_ERR(clk);
+		goto err_put_pinctrl;
+	}			
+
+
+
+#if 0
+	dev_info(dev, "%s: clk enable\n", __func__);
+
+	ret = clk_prepare_enable(clk);
+	if (ret) {
+		dev_err(dev, "failed to enable clkout");
+		goto err_put_clk;
+
+	}
+#else
+	dev_info(dev, "%s: clk prepare\n", __func__);
+
+	ret = clk_prepare(clk);
+	if (ret) {
+		dev_err(dev, "failed to clk prepare\n");
+		goto err_put_clk;
+
+	}
+#endif
+	if(info != NULL){
+		
+		dev_info(dev, "%s: set drvdata\n", __func__);
+		info->pctrl = pctrl;
+		info->state0 = state0;
+		info->clk = clk; 
+	}
+	else{
+		dev_info(dev, "%s: info is null\n", __func__);
+
+	}
+	dev_info(dev, "%s: init clkout end!\n",__func__);
+	return 0;
+err_put_clk:	
+	clk_put(clk);	
+err_put_pinctrl:	
+	devm_pinctrl_put(pctrl);
+	
+
+	return ret;
+
+			
+}
+
+
+static int codec_pm_suspend(struct device *dev)
+{
+	int ret = 0;
+
+	struct aic3x_priv	*info =  dev_get_drvdata(dev);
+
+	dev_info(dev,"%s: clk dis!\n",__func__);
+	if(info->clk != NULL){
+
+		clk_disable(info->clk);
+
+	}
+	dev_info(dev,"%s: end!\n",__func__);
+
+	return ret;
+}
+
+static int codec_pm_resume(struct device *dev)
+{
+	int ret = 0;
+	struct aic3x_priv	*info =  dev_get_drvdata(dev);
+
+	dev_info(dev,"%s: clk en!\n",__func__);
+	if(info->clk != NULL){
+
+		ret = clk_enable(info->clk);
+		if (ret) {
+			dev_err(dev, "failed to enable clkout");
+		}
+	}
+	
+	dev_info(dev,"%s: end!\n",__func__);
+
+	return ret;
+}
+const struct dev_pm_ops codec_pm = {
+	.suspend = codec_pm_suspend,
+	.resume = codec_pm_resume,
+
+};
+#define SC_CODEC_DEBUG
+		
+		
+#ifdef SC_CODEC_DEBUG
+		
+		
+		
+#define CODEC_ATTR(_name) \
+	static struct kobj_attribute _name##_attr = {	\
+		.attr	= { 			\
+			.name = __stringify(_name), \
+			.mode = 0644,			\
+		},					\
+		.show	= _name##_show, 		\
+		.store	= _name##_store,		\
+	}
+		
+		
+	static ssize_t codec_info_show(struct kobject *kobj, struct kobj_attribute *attr,
+								  char *buf)
+	{
+	
+		ssize_t count = 0;
+	
+		struct device *dev = container_of(kobj, struct device, kobj);
+		struct aic3x_priv	*info;
+		unsigned char cmd_str[16] = {0};
+	
+		int ret,i;
+		int    regmin, regmax;
+		unsigned int val;
+		unsigned int pre_page;
+		struct snd_soc_component *component;
+	
+	
+		info = (struct aic3x_priv *) dev_get_drvdata(dev);
+		
+		component = snd_soc_lookup_component(dev,NULL);
+		 if (!component){
+			 pr_err(" %s:(%d), snd_soc_lookup_component fail !\n", __func__, __LINE__ );
+			
+			 return count;	
+		 }
+		 
+		 dev_info(dev," %s:(%d),snd_soc_lookup_component ,name=%s\n", __func__, __LINE__, component->name);
+		 //info->component = component;
+	
+	
+		regmin = 0x0;
+		regmax = 109;
+		regmap_read(info->regmap, AIC3X_PAGE_SELECT, &pre_page);
+	
+		regmap_write(info->regmap, AIC3X_PAGE_SELECT, 0);
+		for (i = regmin; i < regmax; i++) {
+	
+			//val = snd_soc_component_read(info->component, i); 	
+			regmap_read(info->regmap, i, &val);
+	
+			dev_info(dev,"cocec reg read ,Reg(%d)=0x%x \n",i, val);
+		}
+	
+		regmap_write(info->regmap, AIC3X_PAGE_SELECT, pre_page);
+		return count;
+	
+		
+	}
+	
+	
+	static ssize_t codec_info_store(struct kobject *kobj, struct kobj_attribute *attr,
+								   const char *buf, size_t n)
+	
+	{
+		ssize_t ret =0;
+		unsigned int val = 0;
+		struct device *dev = container_of(kobj, struct device, kobj);
+		struct aic3x_priv *info;
+		unsigned char cmd_str[16] = {0};
+		int regmax = 127,regpage = 0,pre_page = 0;	
+		u32 param1 = 0,param2 = 0,param3 = 0;
+		
+		int i;
+	 
+		struct snd_soc_component *component; 
+	
+		info = (struct aic3x_priv *) dev_get_drvdata(dev);
+	
+		component = snd_soc_lookup_component(dev, NULL);
+		 if (!component){
+			 pr_err(" %s:(%d), snd_soc_lookup_component fail !\n", __func__, __LINE__ );
+			
+			 return n;	
+		 }
+		 
+		 dev_info(dev," %s:(%d),snd_soc_lookup_component ,name=%s\n", __func__, __LINE__, component->name);
+		 //info->component = component;
+	
+		//dev_info(dev, "pcieinfo_store name %s \n", pdev->name);
+	
+		
+		sscanf(buf, "%16s %x %x %x", cmd_str,&param1,&param2,&param3);
+		dev_info(dev, "cmd_str:%s,param1:%x,param2:%x,param3:%x\n",cmd_str,param1,param2,param3);
+	
+	
+	
+		dev_info(dev, "%s:cmd_str=%s \n",__func__,cmd_str); 
+	
+		ret = strcmp(cmd_str,"reg_read");
+		if( ret == 0)
+		{
+			dev_info(dev, "reg_read start\n");
+			if(param1 > 1){
+				dev_err(dev, "reg_read param invalidate fail,param1=%d \n",param1);
+				return -1;		
+			}
+			regpage = param1;	
+			if(param2 > regmax){
+				dev_err(dev, "reg_read param invalidate fail,param2=%d \n",param2);
+				return -1;		
+			}	
+	
+
+			
+			regmap_read(info->regmap, AIC3X_PAGE_SELECT, &pre_page);
+			
+			regmap_write(info->regmap, AIC3X_PAGE_SELECT, regpage);
+
+
+			
+
+			//val = snd_soc_component_read(info->component, param1);
+			regmap_read(info->regmap, param1,&val);
+	
+			regmap_write(info->regmap, AIC3X_PAGE_SELECT, pre_page);
+	
+			dev_info(dev, "reg_read reg(%d)=0x%x \n",param1,val);
+	
+	
+		}
+	
+		ret = strcmp(cmd_str,"reg_write");
+		if( ret == 0)
+		{
+			//u32 offset = param1;
+			//u32 mask = param2;
+			dev_info(dev, "reg_write start\n");  
+			if(param1 > 1){
+				dev_err(dev, "reg_write param invalidate fail,param1=%d \n",param1);
+				return -1;		
+			}
+			regpage = param1;	
+			if(param2 > regmax){
+				dev_err(dev, "reg_write param invalidate fail,param1=%d \n",param1);
+				return -1;		
+			}	
+
+			
+			regmap_read(info->regmap, AIC3X_PAGE_SELECT, &pre_page);
+			
+			regmap_write(info->regmap, AIC3X_PAGE_SELECT, regpage);
+
+			
+
+			val = param2;
+			//ret = snd_soc_component_write(info->component, param1, val);
+			regmap_write(info->regmap, param1, val);
+			if (ret){		
+				pr_err(" %s:(%d), cocec reg write fail - ret=%d\n", __func__, __LINE__ ,ret);
+				//return ret;
+			}
+			regmap_write(info->regmap, AIC3X_PAGE_SELECT, pre_page);	
+			dev_info(dev, "reg_write reg(%d)=0x%x \n",param1,val);
+	
+		}	 
+	
+	
+	
+		return n;
+	
+	}
+	
+		
+	CODEC_ATTR(codec_info);
+		
+		
+		
+	static struct attribute * test_attr[] = {
+		&codec_info_attr.attr,
+		NULL,
+	};
+	
+		
+	static const struct attribute_group attr_group = {
+		.attrs = test_attr,
+	};
+	
+	
+	
+	static const struct attribute_group *attr_groups[] = {
+		&attr_group,
+	
+		NULL,
+	};
+#endif
+		
+
 
 static int aic3x_add_widgets(struct snd_soc_component *component)
 {
@@ -1780,6 +2134,7 @@
 	struct device_node *np = i2c->dev.of_node;
 	int ret, i;
 	u32 value;
+	pr_info( "alsa %s:start\n",__func__);
 
 	aic3x = devm_kzalloc(&i2c->dev, sizeof(struct aic3x_priv), GFP_KERNEL);
 	if (!aic3x)
@@ -1875,6 +2230,7 @@
 			dev_err(&i2c->dev, "Failed to init class D: %d\n",
 				ret);
 	}
+	pr_info( "alsa %s:codec register_component\n",__func__);
 
 	ret = devm_snd_soc_register_component(&i2c->dev,
 			&soc_component_dev_aic3x, &aic3x_dai, 1);
@@ -1885,6 +2241,20 @@
 	INIT_LIST_HEAD(&aic3x->list);
 	list_add(&aic3x->list, &reset_list);
 
+	clkout_init_pinctrl(&i2c->dev);
+#ifdef SC_CODEC_DEBUG
+					
+	ret = sysfs_create_groups(&i2c->dev.kobj, attr_groups); 
+	if (ret) {
+		dev_err(&i2c->dev, "create test_kobj attr group fain error=%d\n", ret);
+		//return ret;
+	}
+					
+#endif
+
+	
+	pr_info( "alsa %s:end\n",__func__);
+
 	return 0;
 
 err_gpio:
@@ -1930,6 +2300,7 @@
 	.probe	= aic3x_i2c_probe,
 	.remove = aic3x_i2c_remove,
 	.id_table = aic3x_i2c_id,
+	.driver.pm = &codec_pm,
 };
 
 module_i2c_driver(aic3x_i2c_driver);
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/Kconfig b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/Kconfig
index e9bb5e4..3cc0505 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/Kconfig
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/Kconfig
@@ -38,6 +38,18 @@
 	tristate "SoC I2S Audio support for ZX29 - NAU8810"	
 	select SND_SOC_NAU8810 if I2C	
 	select REGMAP_I2C if I2C	
+
+config SND_SOC_ZX29_TI3104
+	tristate "SoC I2S Audio support for ZX29 - TI3104"
+	select SND_SOC_TLV320AIC3X
+	
+config SND_SOC_ZX29_MAX9867
+	tristate "SoC I2S Audio support for ZX29 - MAX9867"
+	select SND_SOC_MAX9867
+
+config SND_SOC_ZX29_ES8311
+	tristate "SoC I2S Audio support for ZX29 - ES8311"
+	select SND_SOC_ES8311	
 	
 config SND_SOC_ZX_VOICE
 	tristate "SoC 2/3G Voice support"		
@@ -63,10 +75,18 @@
 	tristate
 	
 config SND_SOC_NAU8810
-	tristate	
-
+	tristate
+	
+config SND_SOC_MAX9867
+	tristate
+	
+config SND_SOC_ES8311
+	tristate
+	
 config SND_SOC_ES8374
 	tristate	
+
+	
 config SND_EXTRA_CTRL
 	tristate "Soc add extra snd controls"			
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/Makefile b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/Makefile
index 041ea26..5984931 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/Makefile
@@ -15,7 +15,12 @@
 obj-$(CONFIG_SND_SOC_ZX29_AK4940) += snd-soc-zx29-ak4940.o
 snd-soc-zx29-ti3100-objs := zx29_ti3100.o
 obj-$(CONFIG_SND_SOC_ZX29_TI3100) += snd-soc-zx29-ti3100.o
+obj-$(CONFIG_SND_SOC_ZX29_TI3104) += snd-soc-zx29-ti3100.o
 snd-soc-zx29-nau8810-objs := zx29_nau8810.o
 obj-$(CONFIG_SND_SOC_ZX29_NAU8810) += snd-soc-zx29-nau8810.o
 snd-soc-zx29-dummycodec-objs := zx29_dummycodec.o
-obj-$(CONFIG_SND_SOC_ZX29_DUMMYCODEC) += snd-soc-zx29-dummycodec.o
\ No newline at end of file
+obj-$(CONFIG_SND_SOC_ZX29_DUMMYCODEC) += snd-soc-zx29-dummycodec.o
+snd-soc-zx29-max9867-objs := zx29_max9867.o
+obj-$(CONFIG_SND_SOC_ZX29_MAX9867) += snd-soc-zx29-max9867.o
+snd-soc-zx29-es83xx-objs := zx29_es83xx.o
+obj-$(CONFIG_SND_SOC_ZX29_ES8311) += snd-soc-zx29-es83xx.o
\ No newline at end of file
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/zx29_es83xx.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/zx29_es83xx.c
new file mode 100755
index 0000000..2a0a3c8
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/zx29_es83xx.c
@@ -0,0 +1,877 @@
+/*
+ * zx29_es83xx.c  --  zx29-es83xx ALSA SoC Audio board driver
+ *
+ * Copyright (C) 2022, ZTE Corporation.
+ *
+ * Based on smdk_wm8994.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#ifdef CONFIG_SND_SOC_ES8311
+
+#include "../codecs/es8311.h"
+#endif
+#include <sound/pcm_params.h>
+#include <sound/soc.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+
+
+ 
+#include <linux/clk.h>
+#include <linux/gpio.h>
+#include <linux/module.h>
+#include <linux/delay.h>
+//#include <sound/tlv.h>
+//#include <sound/soc.h>
+//#include <sound/jack.h>
+//#include <sound/zx29_snd_platform.h>
+//#include <mach/iomap.h>
+//#include <mach/board.h>
+#include <linux/of_gpio.h>
+
+#include <linux/i2c.h>
+#include <linux/of_gpio.h>
+#include <linux/regmap.h>
+
+
+#include "i2s.h"
+
+#define ZX29_I2S_TOP_LOOP_REG	0x60
+//#define NAU_CLK_ID 0
+
+#if 1
+ 
+#define  ZXIC_MCLK                    26000000
+
+#define  ZXIC_PLL_CLKIN_MCLK		  0
+/* System Clock Source */
+enum {
+	CODEC_SCLK_MCLK,
+	CODEC_SCLK_PLL,
+};
+
+
+#define zx_reg_sync_write(v, a) \
+        do {    \
+            iowrite32(v, a);    \
+        } while (0)
+
+#define zx_read_reg(addr) \
+    ioread32(addr)
+
+#define zx_write_reg(addr, val)   \
+	zx_reg_sync_write(val, addr)
+
+
+
+struct zx29_board_data {
+	const char *name;
+	struct device *dev;
+
+	int codec_refclk;
+	int gpio_pwen;	
+	int gpio_pdn;
+	void __iomem *sys_base_va;
+
+};
+
+
+struct zx29_board_data *s_board = 0;
+
+//#define AON_WIFI_BT_CLK_CFG2  ((volatile unsigned int *)(ZX_TOP_CRM_BASE + 0x94))
+ /* Default ZX29s */
+static struct zx29_board_data zx29_platform_data = {
+	.codec_refclk = ZXIC_MCLK,
+};
+ static struct platform_device *zx29_snd_device;
+ 
+ static DEFINE_RAW_SPINLOCK(codec_pa_lock);
+ 
+ static int set_path_stauts_switch(struct snd_kcontrol *kcontrol,
+				 struct snd_ctl_elem_value *ucontrol);
+ static int get_path_stauts_switch(struct snd_kcontrol *kcontrol,
+				 struct snd_ctl_elem_value *ucontrol);
+
+
+ static int zx29startup(struct snd_pcm_substream *substream)
+ {
+ //  int ret = 0;
+	 print_audio("Alsa	Entered func %s\n", __func__);
+	 //CPPS_FUNC(cpps_callbacks, zDrv_Audio_Printf)("Alsa: zx29_startup device=%d,stream=%d\n", substream->pcm->device, substream->stream);
+ 
+	 struct snd_pcm *pcmC0D0p = snd_lookup_minor_data(16, SNDRV_DEVICE_TYPE_PCM_PLAYBACK);
+	 struct snd_pcm *pcmC0D1p = snd_lookup_minor_data(17, SNDRV_DEVICE_TYPE_PCM_PLAYBACK);
+	 struct snd_pcm *pcmC0D2p = snd_lookup_minor_data(18, SNDRV_DEVICE_TYPE_PCM_PLAYBACK);	 
+	 struct snd_pcm *pcmC0D3p = snd_lookup_minor_data(19, SNDRV_DEVICE_TYPE_PCM_PLAYBACK);	
+	 if ((pcmC0D0p == NULL) || (pcmC0D1p == NULL) || (pcmC0D2p == NULL) || (pcmC0D3p == NULL))
+		 return  -EINVAL;	  
+	 if ((pcmC0D0p->streams[0].substream_opened && pcmC0D1p->streams[0].substream_opened) || 
+		 (pcmC0D0p->streams[0].substream_opened && pcmC0D2p->streams[0].substream_opened) || 
+		 (pcmC0D0p->streams[0].substream_opened && pcmC0D3p->streams[0].substream_opened) || 
+		 (pcmC0D1p->streams[0].substream_opened && pcmC0D2p->streams[0].substream_opened) ||
+		 (pcmC0D1p->streams[0].substream_opened && pcmC0D3p->streams[0].substream_opened) ||
+		 (pcmC0D2p->streams[0].substream_opened && pcmC0D3p->streams[0].substream_opened))
+		 BUG();
+ 
+ 
+	 return 0;
+ }
+ 
+ static void zx29_shutdown(struct snd_pcm_substream *substream)
+ {
+	 //CPPS_FUNC(cpps_callbacks, zDrv_Audio_Printf)("Alsa: zx297520xx_shutdown device=%d, stream=%d\n", substream->pcm->device, substream->stream);
+ //  print_audio("Alsa	Entered func %s, stream=%d\n", __func__, substream->stream);
+ 	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
+	 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+	 }
+	 
+	 if (snd_soc_dai_active(cpu_dai))
+		 return;
+ 
+
+  
+ }
+ 
+ static void zx29_shutdown2(struct snd_pcm_substream *substream)
+ {
+	 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+ 	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
+	 //CPPS_FUNC(cpps_callbacks, zDrv_Audio_Printf)("Alsa: zx29_shutdown2 device=%d, stream=%d\n", substream->pcm->device, substream->stream);
+	 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+#ifdef USE_ALSA_VOICE_FUNC
+		 //CPPS_FUNC(cpps_callbacks, zDrvVp_Loop)(VP_PATH_OFF);
+#endif
+
+
+	 }
+ 
+	 if (snd_soc_dai_active(cpu_dai))
+		 return;
+ 
+
+ }
+ static int zx29_init_paiftx(struct snd_soc_pcm_runtime *rtd)
+ {
+	 //struct snd_soc_codec *codec = rtd->codec;
+	 //struct snd_soc_dapm_context *dapm = &codec->dapm;
+ 
+	 //snd_soc_dapm_enable_pin(dapm, "HPOL");
+	 //snd_soc_dapm_enable_pin(dapm, "HPOR");
+ 
+	 /* Other pins NC */
+ //  snd_soc_dapm_nc_pin(dapm, "HPOUT2P");
+ 
+ //  print_audio("Alsa	Entered func %s\n", __func__);
+ 
+	 return 0;
+ }
+ static int zx29_hw_params(struct snd_pcm_substream *substream,
+										struct snd_pcm_hw_params *params)
+ {
+     print_audio("Alsa:	Entered func %s\n", __func__);
+	 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+	 struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
+	 struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
+
+	 int ret;
+	 int rfs = 0, frq_out = 0;	 
+	 switch (params_rate(params)) {
+	 case 8000:
+	 case 16000:
+	 case 11025:
+	 case 22050:
+	 case 24000:
+	 case 32000:
+	 case 44100:
+	 case 48000:
+		 rfs = 32;
+		 break;
+	 default:
+	 	{
+	 	    ret =  -EINVAL;
+		    print_audio("Alsa: rate=%d not support,ret=%d!\n", params_rate(params),ret);	 	      
+		 	return ret;
+	 	}
+	 }
+	 
+	 frq_out = params_rate(params) * rfs * 2;
+	 
+	 /* Set the Codec DAI configuration */
+	 ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S
+							   | SND_SOC_DAIFMT_NB_NF
+							   | SND_SOC_DAIFMT_CBS_CFS);
+	 if (ret < 0){
+	 	
+	 	 print_audio("Alsa: codec dai snd_soc_dai_set_fmt fail,ret=%d!\n",ret);
+		 return ret;
+	 }
+
+
+	 /* Set the AP DAI configuration */
+	 ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S
+							   | SND_SOC_DAIFMT_NB_NF
+							   | SND_SOC_DAIFMT_CBS_CFS);
+	 if (ret < 0){
+	 	
+	 	 print_audio("Alsa: ap dai snd_soc_dai_set_fmt fail,ret=%d!\n",ret);
+		 return ret;
+	 }
+
+	 ret = snd_soc_dai_set_sysclk(codec_dai, CODEC_SCLK_MCLK,  ZXIC_MCLK, SND_SOC_CLOCK_IN);
+	 if (ret < 0){	 	
+	 	 print_audio("Alsa: codec dai snd_soc_dai_set_sysclk fail,ret=%d!\n",ret);
+		 return ret;
+	 }
+	  
+
+#if 0	 
+	 /* Set the Codec DAI clk */	 
+	 ret =snd_soc_dai_set_pll(codec_dai, 0, NAU8810_SCLK_PLL,
+								  ZXIC_MCLK, params_rate(params)*256);
+	 if (ret < 0){
+	 	
+	 	 print_audio("Alsa: codec dai clk snd_soc_dai_set_pll fail,ret=%d!\n",ret);
+		 return ret;
+	}
+#endif	
+	
+
+	  
+	 /* Set the AP DAI clk */
+	 ret = snd_soc_dai_set_sysclk(cpu_dai, ZX29_I2S_WCLK_SEL,ZX29_I2S_WCLK_FREQ_26M, SND_SOC_CLOCK_IN);
+	 //ret = snd_soc_dai_set_sysclk(cpu_dai, ZX29_I2S_WCLK_SEL,ZX29_I2S_WCLK_FREQ_26M, SND_SOC_CLOCK_IN);
+ 
+	 if (ret < 0){	 	
+	 	 print_audio("Alsa: cpu dai snd_soc_dai_set_sysclk fail,ret=%d!\n",ret);
+		 return ret;
+	 }
+     print_audio("Alsa:	Entered func %s end\n", __func__);
+	 
+	 return 0;
+ }
+
+static int zx29_hw_params_lp(struct snd_pcm_substream *substream,
+									   struct snd_pcm_hw_params *params)
+{
+	print_audio("Alsa: Entered func %s\n", __func__);
+	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
+	struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
+
+	int ret;
+	int rfs = 0, frq_out = 0;	
+	switch (params_rate(params)) {
+	case 8000:
+	case 16000:
+	case 11025:
+	case 22050:
+	case 24000:
+	case 32000:
+	case 44100:
+	case 48000:
+		rfs = 32;
+		break;
+	default:
+	   {
+		   ret =  -EINVAL;
+		   print_audio("Alsa: rate=%d not support,ret=%d!\n", params_rate(params),ret); 			 
+		   return ret;
+	   }
+	}
+	
+	frq_out = params_rate(params) * rfs * 2;
+	
+	/* Set the Codec DAI configuration */
+	/*
+	
+	ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S
+							  | SND_SOC_DAIFMT_NB_NF
+							  | SND_SOC_DAIFMT_CBS_CFS);
+	if (ret < 0){
+	   
+		print_audio("Alsa: codec dai snd_soc_dai_set_fmt fail,ret=%d!\n",ret);
+		return ret;
+	}
+	*/ 
+
+	
+	/* Set the AP DAI configuration */
+	ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S
+							  | SND_SOC_DAIFMT_NB_NF
+							  | SND_SOC_DAIFMT_CBS_CFS);
+	if (ret < 0){
+	   
+		print_audio("Alsa: ap dai snd_soc_dai_set_fmt fail,ret=%d!\n",ret);
+		return ret;
+	}
+
+	/* Set the Codec DAI clk */ 	
+	/*ret =snd_soc_dai_set_pll(codec_dai, 0, RT5670_PLL1_S_BCLK1,
+								 fs*datawidth*2, 256*fs);
+	if (ret < 0){
+	   
+		print_audio("Alsa: codec dai clk snd_soc_dai_set_pll fail,ret=%d!\n",ret);
+		return ret;
+   }
+	*/
+	/*
+	ret = snd_soc_dai_set_sysclk(codec_dai, ES8312_CLKID_MCLK,ZXIC_MCLK, SND_SOC_CLOCK_IN);
+	if (ret < 0){	   
+		print_audio("Alsa: codec dai snd_soc_dai_set_sysclk fail,ret=%d!\n",ret);
+		return ret;
+	}
+	*/
+	/* Set the AP DAI clk */
+	ret = snd_soc_dai_set_sysclk(cpu_dai, ZX29_I2S_WCLK_SEL,ZX29_I2S_WCLK_FREQ_26M, SND_SOC_CLOCK_IN);
+
+	if (ret < 0){	   
+		print_audio("Alsa: cpu dai snd_soc_dai_set_sysclk fail,ret=%d!\n",ret);
+		return ret;
+	}
+	print_audio("Alsa: Entered func %s end\n", __func__);
+	
+	return 0;
+}
+
+
+ 
+
+ 
+
+ static int zx29_hw_params_voice(struct snd_pcm_substream *substream,
+										struct snd_pcm_hw_params *params)
+ {
+	 print_audio("Alsa: Entered func %s\n", __func__);
+	 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+	 struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
+	 struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
+
+	 int ret;
+	 int rfs = 0, frq_out = 0;	 
+	 switch (params_rate(params)) {
+	 case 8000:
+	 case 16000:
+	 case 11025:
+	 case 22050:
+	 case 24000:
+	 case 32000:
+	 case 44100:
+	 case 48000:
+		 rfs = 32;
+		 break;
+	 default:
+		{
+			ret =  -EINVAL;
+			print_audio("Alsa: rate=%d not support,ret=%d!\n", params_rate(params),ret);			  
+			return ret;
+		}
+	 }
+	 
+	 frq_out = params_rate(params) * rfs * 2;
+	 
+	 /* Set the Codec DAI configuration */
+	 ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S
+							   | SND_SOC_DAIFMT_NB_NF
+							   | SND_SOC_DAIFMT_CBS_CFS);
+	 if (ret < 0){
+		
+		 print_audio("Alsa: codec dai snd_soc_dai_set_fmt fail,ret=%d!\n",ret);
+		 return ret;
+	 }
+ 
+ 	 ret = snd_soc_dai_set_sysclk(codec_dai, CODEC_SCLK_MCLK,  ZXIC_MCLK, SND_SOC_CLOCK_IN);
+	 if (ret < 0){	 	
+	 	 print_audio("Alsa: codec dai snd_soc_dai_set_sysclk fail,ret=%d!\n",ret);
+		 return ret;
+	 }
+
+ 
+#if 0	 
+	  
+	  /* Set the Codec DAI clk */	  
+	  ret =snd_soc_dai_set_pll(codec_dai, 0, NAU8810_SCLK_PLL,
+								   ZXIC_MCLK, params_rate(params)*256);
+	  if (ret < 0){
+		 
+		  print_audio("Alsa: codec dai clk snd_soc_dai_set_pll fail,ret=%d!\n",ret);
+		  return ret;
+	 }
+#endif
+
+	 print_audio("Alsa: Entered func %s end\n", __func__);
+	 
+	 return 0;
+ }
+
+										 
+ int zx29_prepare2(struct snd_pcm_substream *substream)
+ {
+	 int path, ret;
+	 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+		 //ret = CPPS_FUNC(cpps_callbacks, zDrvVp_Loop)(VP_PATH_SPEAKER);
+		 if (ret < 0)
+			 return -1;
+	 }
+	 
+	 return 0;
+ } 
+ static int zx29_late_probe(struct snd_soc_card *card)
+ {
+	 //struct snd_soc_codec *codec = card->rtd[0].codec;
+	 //struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
+	 int ret;
+ //  print_audio("Alsa	zx29_late_probe entry!\n");
+ 
+#ifdef CONFIG_SND_SOC_JACK_DECTEC
+	 
+	 ret = snd_soc_jack_new(codec, "Headset",
+							SND_JACK_HEADSET |SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2,
+							&codec_headset);
+	 if (ret)
+		 return ret;
+ 
+	 ret = snd_soc_jack_add_pins(&codec_headset,
+								 ARRAY_SIZE(codec_headset_pins),
+								 codec_headset_pins);
+	 if (ret)
+		 return ret;
+       #ifdef CONFIG_SND_SOC_codec
+	 //rt5670_hs_detect(codec, &codec_headset);
+       #endif
+#endif
+ 
+	 return 0;
+ }
+ 
+ static struct snd_soc_ops zx29_ops = {
+	 //.startup = zx29_startup,
+	 .shutdown = zx29_shutdown,
+	 .hw_params = zx29_hw_params,
+ };
+  static struct snd_soc_ops zx29_ops_lp = {
+	 //.startup = zx29_startup,
+	 .shutdown = zx29_shutdown,
+	 .hw_params = zx29_hw_params_lp,
+ };
+ static struct snd_soc_ops zx29_ops1 = {
+	 //.startup = zx29_startup,
+	 .shutdown = zx29_shutdown,
+	 //.hw_params = zx29_hw_params1,
+ };
+ 
+ static struct snd_soc_ops zx29_ops2 = {
+	 //.startup = zx29_startup,
+	 .shutdown = zx29_shutdown2,
+	 //.hw_params = zx29_hw_params1,
+	 .prepare = zx29_prepare2,
+ };
+ static struct snd_soc_ops voice_ops = {
+	 .startup = zx29startup,
+	 .shutdown = zx29_shutdown2,
+	 .hw_params = zx29_hw_params_voice,
+	 //.prepare = zx29_prepare2,
+ };
+
+ 
+ enum {
+	 MERR_DPCM_AUDIO = 0,
+	 MERR_DPCM_DEEP_BUFFER,
+	 MERR_DPCM_COMPR,
+ };
+
+ 
+ //static struct zx298501_nau8810_pdata *zx29_platform_data;
+ 
+ static int zx29_setup_pins(struct zx29_board_data *codec_pins, char *fun)
+ {
+	 int ret;
+ 
+	 //ret = gpio_request(codec_pins->codec_refclk, "codec_refclk");
+	 if (ret < 0) {
+		 printk(KERN_ERR "zx297520xx SoC Audio: %s pin already in use\n", fun);
+		 return ret;
+	 }
+	 //zx29_gpio_config(codec_pins->codec_refclk, GPIO17_CLK_OUT2);
+ 
+ 
+	 return 0;
+ }
+#endif
+
+ 
+ static int zx29_remove(struct platform_device *pdev)
+ {
+	 gpio_free(zx29_platform_data.codec_refclk);
+	 platform_device_unregister(zx29_snd_device);
+	 return 0;
+ }
+ 
+
+ 
+
+
+
+
+enum {
+	AUDIO_DL_MEDIA = 0,
+	AUDIO_DL_VOICE,
+	AUDIO_DL_2G_AND_3G_VOICE,
+	AUDIO_DL_VP_LOOP,	
+	AUDIO_DL_3G_VOICE,
+	
+	AUDIO_DL_MAX,
+};
+SND_SOC_DAILINK_DEF(dummy, \
+	DAILINK_COMP_ARRAY(COMP_DUMMY()));
+
+//SND_SOC_DAILINK_DEF(cpu_i2s0, \
+//	DAILINK_COMP_ARRAY(COMP_CPU("media-cpu-dai")));
+SND_SOC_DAILINK_DEF(cpu_i2s0, \
+	DAILINK_COMP_ARRAY(COMP_CPU("1405000.i2s")));
+
+
+SND_SOC_DAILINK_DEF(voice_cpu, \
+	DAILINK_COMP_ARRAY(COMP_CPU("soc:voice_audio")));
+
+SND_SOC_DAILINK_DEF(voice_2g_3g, \
+	DAILINK_COMP_ARRAY(COMP_CPU("voice_2g_3g-dai")));
+
+SND_SOC_DAILINK_DEF(voice_3g, \
+		DAILINK_COMP_ARRAY(COMP_CPU("voice_3g-dai")));
+
+
+
+SND_SOC_DAILINK_DEF(dummy_cpu, \
+		DAILINK_COMP_ARRAY(COMP_CPU("soc:zx29_snd_dummy")));
+//SND_SOC_DAILINK_DEF(dummy_platform, \
+//	DAILINK_COMP_ARRAY(COMP_PLATFORM("soc:zx29_snd_dummy")));
+
+SND_SOC_DAILINK_DEF(dummy_codec, \
+		DAILINK_COMP_ARRAY(COMP_CODEC("soc:zx29_snd_dummy", "zx29_snd_dummy_dai")));
+
+#if defined(CONFIG_SND_SOC_ZX29_ES8311)
+SND_SOC_DAILINK_DEF(codec, \
+		DAILINK_COMP_ARRAY(COMP_CODEC("es8311.1-001a", "es8311-hifi")));
+
+#elif defined(CONFIG_SND_SOC_ZX29_ES8374)
+
+SND_SOC_DAILINK_DEF(codec, \
+		DAILINK_COMP_ARRAY(COMP_CODEC("es8374.1-001a", "es8374-hifi")));
+#else
+SND_SOC_DAILINK_DEF(codec, \
+		DAILINK_COMP_ARRAY(COMP_CODEC("es8311.1-001a", "es8311-hifi")));
+
+#endif
+
+//SND_SOC_DAILINK_DEF(media_platform, \
+//	DAILINK_COMP_ARRAY(COMP_PLATFORM("zx29-pcm-audio")));
+SND_SOC_DAILINK_DEF(media_platform, \
+	DAILINK_COMP_ARRAY(COMP_PLATFORM("1405000.i2s")));
+//SND_SOC_DAILINK_DEF(voice_cpu, \
+//	DAILINK_COMP_ARRAY(COMP_CPU("E1D02000.i2s")));
+
+SND_SOC_DAILINK_DEF(voice_platform, \
+	DAILINK_COMP_ARRAY(COMP_PLATFORM("soc:voice_audio")));
+
+
+
+			
+//static struct snd_soc_dai_link zx29_dai_link[] = {
+struct snd_soc_dai_link zx29_dai_link[] = {
+ {
+	.name = "zx29_snd_dummy",//codec name
+	.stream_name = "zx29_snd_dumy",
+	//.nonatomic = true,
+	//.dynamic = 1,
+	//.dpcm_playback = 1,
+	.ops = &zx29_ops_lp,
+	.init = zx29_init_paiftx,
+	SND_SOC_DAILINK_REG(cpu_i2s0, dummy_codec, media_platform),
+	
+},
+{
+	.name = "media",//codec name
+	.stream_name = "MultiMedia",
+	//.nonatomic = true,
+	//.dynamic = 1,
+	//.dpcm_playback = 1,
+	.ops = &zx29_ops,
+
+ 	.init = zx29_init_paiftx,
+	
+
+	SND_SOC_DAILINK_REG(cpu_i2s0, codec, media_platform),
+
+},
+{
+	.name = "voice",//codec name
+	.stream_name = "voice",
+	//.nonatomic = true,
+	//.dynamic = 1,
+	//.dpcm_playback = 1,
+	.ops = &voice_ops,
+
+	.init = zx29_init_paiftx,
+	
+	
+
+	SND_SOC_DAILINK_REG(voice_cpu, codec, voice_platform),
+
+},
+{
+	.name = "voice_2g3g_teak",//codec name
+	.stream_name = "voice_2g3g_teak",
+	//.nonatomic = true,
+	//.dynamic = 1,
+	//.dpcm_playback = 1,
+	.ops = &voice_ops,
+
+	.init = zx29_init_paiftx,
+	
+
+	SND_SOC_DAILINK_REG(voice_cpu, codec, voice_platform),
+
+},
+
+{
+	.name = "voice_3g",//codec name
+	.stream_name = "voice_3g",
+	//.nonatomic = true,
+	//.dynamic = 1,
+	//.dpcm_playback = 1,
+	.ops = &voice_ops,
+
+	.init = zx29_init_paiftx,
+	
+
+	SND_SOC_DAILINK_REG(voice_cpu, codec, voice_platform),
+
+},
+
+{
+	.name = "loop_test",//codec name
+	.stream_name = "loop_test",
+	//.nonatomic = true,
+	//.dynamic = 1,
+	//.dpcm_playback = 1,
+	//.ops = &zx29_ops,
+	.ops = &voice_ops,
+
+	.init = zx29_init_paiftx,
+	
+
+	SND_SOC_DAILINK_REG(voice_cpu, codec, dummy),
+
+},
+
+};
+
+
+
+
+
+static struct snd_soc_card zx29_soc_card = {
+	.name = "zx29-sound-card",
+	.owner = THIS_MODULE,
+	.dai_link = zx29_dai_link,
+	.num_links = ARRAY_SIZE(zx29_dai_link),
+#ifdef USE_ALSA_VOICE_FUNC
+	 .controls = vp_snd_controls,
+	 .num_controls = ARRAY_SIZE(vp_snd_controls),
+#endif	
+};
+
+static const struct of_device_id zx29_codec_of_match[] = {
+#if defined(CONFIG_SND_SOC_ZX29_ES8311)
+	{ .compatible = "zxic,zx29_es8311", .data = &zx29_platform_data },
+#elif defined(CONFIG_SND_SOC_ZX29_ES8374)	
+	{ .compatible = "zxic,zx29_es8374", .data = &zx29_platform_data },
+#else
+	{ .compatible = "zxic,zx29_es8311", .data = &zx29_platform_data },
+	
+#endif		
+	{},
+};
+MODULE_DEVICE_TABLE(of, zx29_codec_of_match);
+
+static void zx29_i2s_top_pin_cfg(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct pinctrl *p,*p2;
+	struct pinctrl_state *s,*s2;
+	int ret = 0;
+	printk("%s start n",__func__);
+
+	struct resource *res;
+	void __iomem	*reg_base;
+	unsigned int val;
+
+
+
+	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "soc_sys");
+	if (!res) {
+		dev_err(dev, "Reg region missing (%s)\n", "soc_sys");
+		//return -ENXIO;
+	}
+
+	#if 0
+	reg_base = devm_ioremap_resource(dev, res);
+	if (IS_ERR(reg_base )) {
+			dev_err(dev, "Reg region ioremap (%s) err=%li\n", "soc_sys",PTR_ERR(reg_base ));
+		//return PTR_ERR(reg_base );
+	}
+
+	#else
+	reg_base = devm_ioremap(&pdev->dev, res->start, resource_size(res));
+	#endif
+	 
+//#if 1 //CONFIG_USE_PIN_I2S0
+#ifdef 	CONFIG_USE_TOP_I2S0
+
+	dev_info(dev, "%s: arm i2s1 to top i2s0!!\n", __func__); 
+	//9300
+		 
+	//top i2s1 cfg
+	val = zx_read_reg(reg_base+ZX29_I2S_TOP_LOOP_REG);
+	val &= ~(0x7<<0);
+	val |= 0x1<<0; //	inter arm_i2s1--top i2s1
+	zx_write_reg(reg_base+ZX29_I2S_TOP_LOOP_REG, val);
+#else //(CONFIG_USE_PIN_I2S1)
+    //8501evb    	
+
+	dev_info(dev, "%s: arm i2s1 to top i2s1!\n", __func__); 
+			 
+	//top i2s2 cfg
+	val = zx_read_reg(reg_base+ZX29_I2S_TOP_LOOP_REG);
+	//val &= 0xfffffff8;
+	val &= ~(0x7<<16);	
+	val |= 0x1<<16;//	inter arm_i2s1--top i2s2
+	zx_write_reg(reg_base+ZX29_I2S_TOP_LOOP_REG, val);
+#endif
+
+	p = devm_pinctrl_get(dev);
+	if (IS_ERR(p)) {
+		dev_err(dev, "%s: pinctrl get failure ,p=0x%llx,dev=0x%llx!!\n", __func__,p,dev);
+		return;
+	}
+	
+	dev_info(dev, "%s: get pinctrl ,p=0x%llx,dev=0x%llx!!\n", __func__,p,dev); 
+
+	s = pinctrl_lookup_state(p, "top_i2s");
+	if (IS_ERR(s)) {
+		devm_pinctrl_put(p);
+		dev_err(dev, " get state failure!!\n");
+		return;
+	}
+	ret = pinctrl_select_state(p, s);
+	if (ret < 0) {
+		devm_pinctrl_put(p);
+		dev_err(dev, " select state failure!!\n");
+		return;
+	}
+	dev_info(dev, "%s: set pinctrl end!\n", __func__);	
+
+}
+
+
+static int zx29_audio_probe(struct platform_device *pdev)
+{
+	int ret;
+	struct device_node *np = pdev->dev.of_node;
+	struct snd_soc_card *card = &zx29_soc_card;
+	struct zx29_board_data *board;
+	const struct of_device_id *id;
+	enum of_gpio_flags flags;
+	unsigned int idx;
+
+	struct device *dev = &pdev->dev;
+	dev_info(&pdev->dev,"zx29_audio_probe start!\n");
+
+
+	card->dev = &pdev->dev;
+
+	board = devm_kzalloc(&pdev->dev, sizeof(*board), GFP_KERNEL);
+	if (!board)
+		return -ENOMEM;
+
+	if (np) {
+		zx29_dai_link[0].cpus->dai_name = NULL;
+		zx29_dai_link[0].cpus->of_node = of_parse_phandle(np,
+				"zxic,i2s-controller", 0);
+		if (!zx29_dai_link[0].cpus->of_node) {
+			dev_err(&pdev->dev,
+			   "Property 'zxic,i2s-controller' missing or invalid\n");
+			ret = -EINVAL;
+		}
+
+		zx29_dai_link[0].platforms->name = NULL;
+		zx29_dai_link[0].platforms->of_node = zx29_dai_link[0].cpus->of_node;
+
+		
+	}
+
+
+
+	id = of_match_device(of_match_ptr(zx29_codec_of_match), &pdev->dev);
+	if (id)
+		*board = *((struct zx29_board_data *)id->data);
+	
+#if defined(CONFIG_SND_SOC_ZX29_ES8311)
+	board->name = "zx29_es8311";
+#elif defined(CONFIG_SND_SOC_ZX29_ES8374)	
+	board->name = "zx29_es8374";
+#else
+	board->name = "zx29_es8311";
+
+#endif	
+	board->dev = &pdev->dev;
+
+	//platform_set_drvdata(pdev, board);
+	s_board = board;
+
+
+
+	ret = devm_snd_soc_register_card(&pdev->dev, card);
+
+	if (ret){
+		dev_err(&pdev->dev, "snd_soc_register_card() failed:%d\n", ret);
+	    return ret;
+	}
+	zx29_i2s_top_pin_cfg(pdev);	
+
+	
+	dev_info(&pdev->dev,"zx29_audio_probe end!\n");
+
+	return ret;
+}
+
+static struct platform_driver zx29_platform_driver = {
+	.driver		= {
+#if defined(CONFIG_SND_SOC_ZX29_ES8311)
+		.name	= "zx29_es8311",
+#elif defined(CONFIG_SND_SOC_ZX29_ES8374)
+		.name	= "zx29_es8374",
+
+#else
+		.name	= "zx29_es8311",
+#endif
+		.of_match_table = of_match_ptr(zx29_codec_of_match),
+		.pm	= &snd_soc_pm_ops,
+	},
+	.probe		= zx29_audio_probe,
+};
+
+
+
+
+
+module_platform_driver(zx29_platform_driver);
+
+MODULE_DESCRIPTION("zx29 ALSA SoC audio driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:zx29-audio-es83xx");
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/zx29_max9867.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/zx29_max9867.c
new file mode 100755
index 0000000..ea874ee
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/zx29_max9867.c
@@ -0,0 +1,2012 @@
+/*
+ * zx297520v3_es8312.c  --  zx298501-ti3100 ALSA SoC Audio board driver
+ *
+ * Copyright (C) 2022, ZTE Corporation.
+ *
+ * Based on smdk_wm8994.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include "../codecs/max9867.h"
+#include <sound/pcm_params.h>
+#include <sound/soc.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+
+
+ 
+#include <linux/clk.h>
+#include <linux/gpio.h>
+#include <linux/module.h>
+#include <linux/delay.h>
+//#include <sound/tlv.h>
+//#include <sound/soc.h>
+//#include <sound/jack.h>
+//#include <sound/zx29_snd_platform.h>
+//#include <mach/iomap.h>
+//#include <mach/board.h>
+#include <linux/of_gpio.h>
+
+#include <linux/i2c.h>
+#include <linux/of_gpio.h>
+#include <linux/regmap.h>
+
+
+#include "i2s.h"
+
+#define ZX29_I2S_TOP_LOOP_REG	0x60
+#define CODEC_CLK_ID 0
+#define CODEC_SCLK_MCLK_ID  0
+#define CODEC_SCLK_PLL_ID  1
+
+#if 1
+ 
+#define  ZXIC_MCLK                    26000000
+
+#define  ZXIC_PLL_CLKIN_MCLK		  0
+
+
+#define zx_reg_sync_write(v, a) \
+        do {    \
+            iowrite32(v, a);    \
+        } while (0)
+
+#define zx_read_reg(addr) \
+    ioread32(addr)
+
+#define zx_write_reg(addr, val)   \
+	zx_reg_sync_write(val, addr)
+
+
+
+struct zx29_board_data {
+	const char *name;
+	struct device *dev;
+
+	int codec_refclk;
+	int gpio_pwen;	
+	int gpio_pdn;
+	void __iomem *sys_base_va;
+
+};
+
+
+struct zx29_board_data *s_board = 0;
+
+//#define AON_WIFI_BT_CLK_CFG2  ((volatile unsigned int *)(ZX_TOP_CRM_BASE + 0x94))
+ /* Default ZX29s */
+static struct zx29_board_data zx29_platform_data = {
+	.codec_refclk = ZXIC_MCLK,
+};
+ static struct platform_device *zx29_snd_device;
+ 
+ static DEFINE_RAW_SPINLOCK(codec_pa_lock);
+ 
+ static int set_path_stauts_switch(struct snd_kcontrol *kcontrol,
+				 struct snd_ctl_elem_value *ucontrol);
+ static int get_path_stauts_switch(struct snd_kcontrol *kcontrol,
+				 struct snd_ctl_elem_value *ucontrol);
+
+
+#ifdef USE_ALSA_VOICE_FUNC
+ extern int zDrv_Audio_Printf(void *pFormat, ...);
+ extern int zDrvVp_GetVol_Wrap(void);
+ extern int zDrvVp_SetVol_Wrap(int volume);
+ extern int zDrvVp_GetPath_Wrap(void);
+ extern int zDrvVp_SetPath_Wrap(int path);
+ extern int zDrvVp_SetMute_Wrap(bool enable);
+ extern bool zDrvVp_GetMute_Wrap(void);
+ extern int zDrvVp_SetTone_Wrap(int toneNum);
+ 
+ static int vp_GetPath(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
+ static int vp_SetPath(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
+ static int vp_SetVol(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
+ static int vp_GetVol(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
+ static int vp_SetMute(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
+ static int vp_GetMute(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
+ static int vp_SetTone(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
+ static int vp_getTone(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
+ 
+ static int audio_GetPath(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
+ static int audio_SetPath(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
+
+ 
+ //static const DECLARE_TLV_DB_SCALE(vp_path_tlv, 0, 300, 0);
+ 
+ static const char * const vpath_in_text[] = {
+	 "handset", "speak", "headset", "bluetooth",
+ };
+ 
+ static const char *tone_class[] = {
+	 "Lowpower", "Sms", "Callstd", "Alarm", "Calltime",
+ };
+ 
+ static const struct soc_enum vpath_in_enum =	 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(vpath_in_text), vpath_in_text); 
+ 
+ static const struct soc_enum tone_class_enum[] = {
+	 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tone_class), tone_class),
+ };
+ 
+ static const struct snd_kcontrol_new vp_snd_controls[] = {  
+	 SOC_ENUM_EXT("voice processing path select",vpath_in_enum,vp_GetPath,vp_SetPath),
+	 //SOC_SINGLE_EXT_TLV("voice processing path Volume",0, 5, 5, 0,vp_GetVol, vp_SetVol,vp_path_tlv), 
+	 SOC_SINGLE_EXT("voice processing path Volume",0, 5, 5, 0,vp_GetVol, vp_SetVol),
+	 SOC_SINGLE_EXT("voice uplink mute", 0, 1, 1, 0,vp_GetMute, vp_SetMute),
+	 SOC_ENUM_EXT("voice tone sel", tone_class_enum[0], vp_getTone, vp_SetTone),
+	 SOC_SINGLE_BOOL_EXT("path stauts dump", 0,get_path_stauts_switch, set_path_stauts_switch),
+	 SOC_ENUM_EXT("audio path select",vpath_in_enum,audio_GetPath,audio_SetPath),
+ };
+ 
+ static int curtonetype = 0;
+ static int vp_getTone(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
+ {
+	 ucontrol->value.integer.value[0] = curtonetype;
+	 return 0;
+ }
+ 
+ static int vp_SetTone(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
+ {
+	 int vol = 0,ret = 0, tonenum;
+	 tonenum = ucontrol->value.integer.value[0];
+	 curtonetype = tonenum;
+	 //printk("Alsa vp_SetTone tonenum=%d\n", tonenum);
+	 //ret = CPPS_FUNC(cpps_callbacks, zDrvVp_SetTone_Wrap)(tonenum);
+	 if(ret < 0)
+	 {
+		 printk(KERN_ERR "vp_SetTone fail = %d\n", tonenum);
+		 return ret;
+	 }
+	 return 0;
+ }
+ 
+ static int vp_SetMute(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
+ {
+	 int enable = 0,ret = 0;
+	 enable = ucontrol->value.integer.value[0];
+	 //ret = CPPS_FUNC(cpps_callbacks, zDrvVp_SetMute_Wrap)(enable);
+	 if(ret < 0)
+	 {
+	   printk(KERN_ERR "vp_SetMute fail = %d\n",enable);
+	   return ret;
+	 }
+	 return 0;
+ }
+ 
+ static int vp_GetMute(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
+ {		 
+		//ucontrol->value.integer.value[0] = CPPS_FUNC(cpps_callbacks, zDrvVp_GetMute_Wrap)();
+		return 0;
+ }
+ 
+ static int vp_SetVol(struct snd_kcontrol *kcontrol,
+								struct snd_ctl_elem_value *ucontrol)
+ {
+		int vol = 0,ret = 0;
+		vol = ucontrol->value.integer.value[0];
+		//ret = CPPS_FUNC(cpps_callbacks, zDrvVp_SetVol_Wrap)(vol);
+		if(ret < 0)
+		{
+		   printk(KERN_ERR "vp_SetVol fail = %d\n",vol);
+		   return ret;
+	   }
+	 return 0;
+ }
+ static int vp_GetVol(struct snd_kcontrol *kcontrol,
+								struct snd_ctl_elem_value *ucontrol)
+ {		 
+		//ucontrol->value.integer.value[0] = CPPS_FUNC(cpps_callbacks, zDrvVp_GetVol_Wrap)();
+		return 0;
+ }
+ static int vp_GetPath(struct snd_kcontrol *kcontrol,
+			 struct snd_ctl_elem_value *ucontrol)
+ {	 
+	 //ucontrol->value.enumerated.item[0] = CPPS_FUNC(cpps_callbacks, zDrvVp_GetPath_Wrap)();
+	 return 0;
+ }
+ static int vp_SetPath(struct snd_kcontrol *kcontrol,
+			 struct snd_ctl_elem_value *ucontrol)
+ {
+	 int ret = 0,path = 0;
+	 unsigned long	flags;
+	 path = ucontrol->value.enumerated.item[0];
+ 
+	 //ret = CPPS_FUNC(cpps_callbacks, zDrvVp_SetPath_Wrap)(path);
+	 if(ret < 0)
+	 {
+	   printk(KERN_ERR "vp_SetPath fail = %d\n",path);
+	   return ret;
+	 }
+#ifdef _USE_7520V3_PHONE_TYPE_C31F
+	 switch (path) {
+	 case 0:
+		 gpio_set_value(ZX29_GPIO_39, GPIO_LOW);
+		 mdelay(1);  
+		 gpio_set_value(ZX29_GPIO_40, GPIO_LOW);
+		 break;
+	 case 1:
+		 gpio_set_value(ZX29_GPIO_39, GPIO_LOW);
+		 mdelay(1);  
+		 raw_spin_lock_irqsave(&codec_pa_lock, flags);
+		 gpio_set_value(ZX29_GPIO_39, GPIO_HIGH);
+		 udelay(2);  
+		 gpio_set_value(ZX29_GPIO_39, GPIO_LOW);
+		 udelay(2);
+		 gpio_set_value(ZX29_GPIO_39, GPIO_HIGH);
+		 raw_spin_unlock_irqrestore(&codec_pa_lock, flags);
+		 gpio_set_value(ZX29_GPIO_40, GPIO_HIGH);
+		 break;
+	 case 2:
+		 break;
+	 case 3:
+		 break;
+	 default:
+		 break;
+	 }
+#endif
+	 return 0;
+ }
+ 
+ static int curpath = 0;
+ static int audio_GetPath(struct snd_kcontrol *kcontrol,
+			 struct snd_ctl_elem_value *ucontrol)
+ {	 
+	 ucontrol->value.enumerated.item[0] = curpath;
+	 return 0;
+ }
+ 
+ static int audio_SetPath(struct snd_kcontrol *kcontrol,
+			 struct snd_ctl_elem_value *ucontrol)
+ {
+	 int ret = 0,path = 0;
+	 unsigned long	flags;
+	 
+	 path = ucontrol->value.enumerated.item[0];
+	 curpath = path;
+#ifdef _USE_7520V3_PHONE_TYPE_C31F
+	 switch (path) {
+	 case 0:
+		 gpio_set_value(ZX29_GPIO_39, GPIO_LOW);
+		 mdelay(1);  
+		 gpio_set_value(ZX29_GPIO_40, GPIO_LOW);
+		 break;
+	 case 1:
+		 gpio_set_value(ZX29_GPIO_39, GPIO_LOW);
+		 mdelay(1);  
+		 raw_spin_lock_irqsave(&codec_pa_lock, flags);
+		 gpio_set_value(ZX29_GPIO_39, GPIO_HIGH);
+		 udelay(2);  
+		 gpio_set_value(ZX29_GPIO_39, GPIO_LOW);
+		 udelay(2);
+		 gpio_set_value(ZX29_GPIO_39, GPIO_HIGH);
+		 raw_spin_unlock_irqrestore(&codec_pa_lock, flags);
+		 gpio_set_value(ZX29_GPIO_40, GPIO_HIGH);
+		 break;
+	 case 2:
+		 break;
+	 case 3:
+		 break;
+	 default:
+		 break;
+	 }
+#endif
+	 return 0;
+ }
+ 
+ typedef enum
+ {
+	 VP_PATH_HANDSET	=0, 	
+	 VP_PATH_SPEAKER,		 
+	 VP_PATH_HEADSET,					  
+	 VP_PATH_BLUETOOTH, 				   
+	 VP_PATH_BLUETOOTH_NO_NR,					 
+	 VP_PATH_HSANDSPK,
+	 
+	 VP_PATH_OFF = 255, 				 
+	 
+	 MAX_VP_PATH = VP_PATH_OFF				 
+ }T_ZDrv_VpPath;
+ 
+ extern int zDrvVp_Loop(T_ZDrv_VpPath path);
+
+ 
+//#else
+ static const struct snd_kcontrol_new machine_snd_controls[] = {		 
+	 SOC_SINGLE_BOOL_EXT("path stauts dump", 0,get_path_stauts_switch, set_path_stauts_switch),
+ };
+ 
+
+ 
+ //extern int rt5670_hs_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack);
+ 
+ int path_stauts_switch = 0;
+ static int set_path_stauts_switch(struct snd_kcontrol *kcontrol,
+				 struct snd_ctl_elem_value *ucontrol)
+ {
+	 struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);
+	 struct snd_soc_dapm_path *p;
+ 
+	 int path_stauts_switch = ucontrol->value.integer.value[0];
+ 
+	 
+	 if (path_stauts_switch == 1)
+	 {
+		 list_for_each_entry(p, &card->paths, list){
+			 
+		   //print_audio("Alsa	path name (%s),longname (%s),sink (%s),source (%s),connect %d \n", p->name,p->long_name,p->sink->name,p->source->name,p->connect);
+		   //printk("Alsa  path longname %s,sink %s,source %s,connect %d \n", p->long_name,p->sink->name,p->source->name,p->connect);
+ 
+		 }
+	 }
+	 return 0;
+ }
+ 
+ static int get_path_stauts_switch(struct snd_kcontrol *kcontrol,
+				 struct snd_ctl_elem_value *ucontrol)
+ {
+	 
+	 ucontrol->value.integer.value[0] = path_stauts_switch;
+	 return 0;
+ };
+#endif 
+ 
+#ifdef CONFIG_SND_SOC_JACK_DECTEC
+ 
+ static struct snd_soc_jack codec_headset;
+ 
+ /* Headset jack detection DAPM pins */
+ static struct snd_soc_jack_pin codec_headset_pins[] = {
+	 {
+		 .pin = "Headphone",
+		 .mask = SND_JACK_HEADPHONE,
+	 },
+ };
+ 
+#endif
+
+
+
+
+
+ static int zx29startup(struct snd_pcm_substream *substream)
+ {
+ //  int ret = 0;
+	 print_audio("Alsa	Entered func %s\n", __func__);
+	 //CPPS_FUNC(cpps_callbacks, zDrv_Audio_Printf)("Alsa: zx29_startup device=%d,stream=%d\n", substream->pcm->device, substream->stream);
+ 
+	 struct snd_pcm *pcmC0D0p = snd_lookup_minor_data(16, SNDRV_DEVICE_TYPE_PCM_PLAYBACK);
+	 struct snd_pcm *pcmC0D1p = snd_lookup_minor_data(17, SNDRV_DEVICE_TYPE_PCM_PLAYBACK);
+	 struct snd_pcm *pcmC0D2p = snd_lookup_minor_data(18, SNDRV_DEVICE_TYPE_PCM_PLAYBACK);	 
+	 struct snd_pcm *pcmC0D3p = snd_lookup_minor_data(19, SNDRV_DEVICE_TYPE_PCM_PLAYBACK);	
+	 if ((pcmC0D0p == NULL) || (pcmC0D1p == NULL) || (pcmC0D2p == NULL) || (pcmC0D3p == NULL))
+		 return  -EINVAL;	  
+	 if ((pcmC0D0p->streams[0].substream_opened && pcmC0D1p->streams[0].substream_opened) || 
+		 (pcmC0D0p->streams[0].substream_opened && pcmC0D2p->streams[0].substream_opened) || 
+		 (pcmC0D0p->streams[0].substream_opened && pcmC0D3p->streams[0].substream_opened) || 
+		 (pcmC0D1p->streams[0].substream_opened && pcmC0D2p->streams[0].substream_opened) ||
+		 (pcmC0D1p->streams[0].substream_opened && pcmC0D3p->streams[0].substream_opened) ||
+		 (pcmC0D2p->streams[0].substream_opened && pcmC0D3p->streams[0].substream_opened))
+		 BUG();
+#if 0
+	 unsigned long	flags;
+	 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+		 gpio_set_value(ZX29_GPIO_125, GPIO_LOW);
+		 mdelay(1);  
+ 
+		 raw_spin_lock_irqsave(&codec_pa_lock, flags);
+		 gpio_set_value(ZX29_GPIO_125, GPIO_HIGH);
+		 udelay(2);  
+		 gpio_set_value(ZX29_GPIO_125, GPIO_LOW);
+		 udelay(2);
+		 gpio_set_value(ZX29_GPIO_125, GPIO_HIGH);
+		 udelay(2);  
+		 gpio_set_value(ZX29_GPIO_125, GPIO_LOW);
+		 udelay(2);
+		 gpio_set_value(ZX29_GPIO_125, GPIO_HIGH);
+		 raw_spin_unlock_irqrestore(&codec_pa_lock, flags);
+	 }
+#endif
+ 
+ 
+	 return 0;
+ }
+ 
+ static void zx29_shutdown(struct snd_pcm_substream *substream)
+ {
+	 //CPPS_FUNC(cpps_callbacks, zDrv_Audio_Printf)("Alsa: zx297520xx_shutdown device=%d, stream=%d\n", substream->pcm->device, substream->stream);
+ //  print_audio("Alsa	Entered func %s, stream=%d\n", __func__, substream->stream);
+ 	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
+	 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+#ifdef _USE_7520V3_PHONE_TYPE_C31F
+		 gpio_set_value(ZX29_GPIO_39, GPIO_LOW);
+		 mdelay(1);  
+		 gpio_set_value(ZX29_GPIO_40, GPIO_LOW);
+#endif
+	 }
+	 
+	 if (snd_soc_dai_active(cpu_dai))
+		 return;
+ 
+
+  
+ }
+ 
+ static void zx29_shutdown2(struct snd_pcm_substream *substream)
+ {
+	 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+ 	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
+	 //CPPS_FUNC(cpps_callbacks, zDrv_Audio_Printf)("Alsa: zx29_shutdown2 device=%d, stream=%d\n", substream->pcm->device, substream->stream);
+	 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+#ifdef _USE_7520V3_PHONE_TYPE_C31F
+		 gpio_set_value(ZX29_GPIO_39, GPIO_LOW);
+		 mdelay(1);  
+		 gpio_set_value(ZX29_GPIO_40, GPIO_LOW);
+#endif
+#ifdef USE_ALSA_VOICE_FUNC
+		 //CPPS_FUNC(cpps_callbacks, zDrvVp_Loop)(VP_PATH_OFF);
+#endif
+
+
+	 }
+ 
+	 if (snd_soc_dai_active(cpu_dai))
+		 return;
+ 
+
+ }
+ static int zx29_init_paiftx(struct snd_soc_pcm_runtime *rtd)
+ {
+	 //struct snd_soc_codec *codec = rtd->codec;
+	 //struct snd_soc_dapm_context *dapm = &codec->dapm;
+ 
+	 //snd_soc_dapm_enable_pin(dapm, "HPOL");
+	 //snd_soc_dapm_enable_pin(dapm, "HPOR");
+ 
+	 /* Other pins NC */
+ //  snd_soc_dapm_nc_pin(dapm, "HPOUT2P");
+ 
+ //  print_audio("Alsa	Entered func %s\n", __func__);
+ 
+	 return 0;
+ }
+ static int zx29_hw_params(struct snd_pcm_substream *substream,
+										struct snd_pcm_hw_params *params)
+ {
+     print_audio("Alsa:	Entered func %s\n", __func__);
+	 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+	 struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
+	 struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
+
+	 int ret;
+	 int rfs = 0, frq_out = 0;	 
+	 switch (params_rate(params)) {
+	 case 8000:
+	 case 16000:
+	 case 11025:
+	 case 22050:
+	 case 24000:
+	 case 32000:
+	 case 44100:
+	 case 48000:
+		 rfs = 32;
+		 break;
+	 default:
+	 	{
+	 	    ret =  -EINVAL;
+		    print_audio("Alsa: rate=%d not support,ret=%d!\n", params_rate(params),ret);	 	      
+		 	return ret;
+	 	}
+	 }
+	 
+	 frq_out = params_rate(params) * rfs * 2;
+	 
+	 /* Set the Codec DAI configuration */
+	 ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S
+							   | SND_SOC_DAIFMT_NB_NF
+							   | SND_SOC_DAIFMT_CBS_CFS);
+	 if (ret < 0){
+	 	
+	 	 print_audio("Alsa: codec dai snd_soc_dai_set_fmt fail,ret=%d!\n",ret);
+		 return ret;
+	 }
+
+
+	 /* Set the AP DAI configuration */
+	 ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S
+							   | SND_SOC_DAIFMT_NB_NF
+							   | SND_SOC_DAIFMT_CBS_CFS);
+	 if (ret < 0){
+	 	
+	 	 print_audio("Alsa: ap dai snd_soc_dai_set_fmt fail,ret=%d!\n",ret);
+		 return ret;
+	 }
+
+	 ret = snd_soc_dai_set_sysclk(codec_dai, CODEC_SCLK_MCLK_ID,  ZXIC_MCLK, SND_SOC_CLOCK_IN);
+	 if (ret < 0){	 	
+	 	 print_audio("Alsa: codec dai snd_soc_dai_set_sysclk fail,ret=%d!\n",ret);
+		 return ret;
+	 }
+	  
+
+#if 0	 
+	 /* Set the Codec DAI clk */	 
+	 ret =snd_soc_dai_set_pll(codec_dai, 0, CODEC_SCLK_PLL,
+								  ZXIC_MCLK, params_rate(params)*256);
+	 if (ret < 0){
+	 	
+	 	 print_audio("Alsa: codec dai clk snd_soc_dai_set_pll fail,ret=%d!\n",ret);
+		 return ret;
+	}
+#endif	
+	
+
+	  
+	 /* Set the AP DAI clk */
+	 ret = snd_soc_dai_set_sysclk(cpu_dai, ZX29_I2S_WCLK_SEL,ZX29_I2S_WCLK_FREQ_26M, SND_SOC_CLOCK_IN);
+	 //ret = snd_soc_dai_set_sysclk(cpu_dai, ZX29_I2S_WCLK_SEL,ZX29_I2S_WCLK_FREQ_26M, SND_SOC_CLOCK_IN);
+ 
+	 if (ret < 0){	 	
+	 	 print_audio("Alsa: cpu dai snd_soc_dai_set_sysclk fail,ret=%d!\n",ret);
+		 return ret;
+	 }
+     print_audio("Alsa:	Entered func %s end\n", __func__);
+	 
+	 return 0;
+ }
+
+static int zx29_hw_params_lp(struct snd_pcm_substream *substream,
+									   struct snd_pcm_hw_params *params)
+{
+	print_audio("Alsa: Entered func %s\n", __func__);
+	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
+	struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
+
+	int ret;
+	int rfs = 0, frq_out = 0;	
+	switch (params_rate(params)) {
+	case 8000:
+	case 16000:
+	case 11025:
+	case 22050:
+	case 24000:
+	case 32000:
+	case 44100:
+	case 48000:
+		rfs = 32;
+		break;
+	default:
+	   {
+		   ret =  -EINVAL;
+		   print_audio("Alsa: rate=%d not support,ret=%d!\n", params_rate(params),ret); 			 
+		   return ret;
+	   }
+	}
+	
+	frq_out = params_rate(params) * rfs * 2;
+	
+	/* Set the Codec DAI configuration */
+	/*
+	
+	ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S
+							  | SND_SOC_DAIFMT_NB_NF
+							  | SND_SOC_DAIFMT_CBS_CFS);
+	if (ret < 0){
+	   
+		print_audio("Alsa: codec dai snd_soc_dai_set_fmt fail,ret=%d!\n",ret);
+		return ret;
+	}
+	*/ 
+
+	
+	/* Set the AP DAI configuration */
+	ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S
+							  | SND_SOC_DAIFMT_NB_NF
+							  | SND_SOC_DAIFMT_CBS_CFS);
+	if (ret < 0){
+	   
+		print_audio("Alsa: ap dai snd_soc_dai_set_fmt fail,ret=%d!\n",ret);
+		return ret;
+	}
+
+	/* Set the Codec DAI clk */ 	
+	/*ret =snd_soc_dai_set_pll(codec_dai, 0, RT5670_PLL1_S_BCLK1,
+								 fs*datawidth*2, 256*fs);
+	if (ret < 0){
+	   
+		print_audio("Alsa: codec dai clk snd_soc_dai_set_pll fail,ret=%d!\n",ret);
+		return ret;
+   }
+	*/
+	/*
+	ret = snd_soc_dai_set_sysclk(codec_dai, ES8312_CLKID_MCLK,ZXIC_MCLK, SND_SOC_CLOCK_IN);
+	if (ret < 0){	   
+		print_audio("Alsa: codec dai snd_soc_dai_set_sysclk fail,ret=%d!\n",ret);
+		return ret;
+	}
+	*/
+	/* Set the AP DAI clk */
+	ret = snd_soc_dai_set_sysclk(cpu_dai, ZX29_I2S_WCLK_SEL,ZX29_I2S_WCLK_FREQ_26M, SND_SOC_CLOCK_IN);
+
+	if (ret < 0){	   
+		print_audio("Alsa: cpu dai snd_soc_dai_set_sysclk fail,ret=%d!\n",ret);
+		return ret;
+	}
+	print_audio("Alsa: Entered func %s end\n", __func__);
+	
+	return 0;
+}
+
+
+ 
+
+ 
+
+ static int zx29_hw_params_voice(struct snd_pcm_substream *substream,
+										struct snd_pcm_hw_params *params)
+ {
+	 print_audio("Alsa: Entered func %s\n", __func__);
+	 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+	 struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
+	 struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
+
+	 int ret;
+	 int rfs = 0, frq_out = 0;	 
+	 switch (params_rate(params)) {
+	 case 8000:
+	 case 16000:
+	 case 11025:
+	 case 22050:
+	 case 24000:
+	 case 32000:
+	 case 44100:
+	 case 48000:
+		 rfs = 32;
+		 break;
+	 default:
+		{
+			ret =  -EINVAL;
+			print_audio("Alsa: rate=%d not support,ret=%d!\n", params_rate(params),ret);			  
+			return ret;
+		}
+	 }
+	 
+	 frq_out = params_rate(params) * rfs * 2;
+	 
+	 /* Set the Codec DAI configuration */
+	 ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S
+							   | SND_SOC_DAIFMT_NB_NF
+							   | SND_SOC_DAIFMT_CBS_CFS);
+	 if (ret < 0){
+		
+		 print_audio("Alsa: codec dai snd_soc_dai_set_fmt fail,ret=%d!\n",ret);
+		 return ret;
+	 }
+ 
+ 	 ret = snd_soc_dai_set_sysclk(codec_dai, CODEC_SCLK_MCLK_ID,  ZXIC_MCLK, SND_SOC_CLOCK_IN);
+	 if (ret < 0){	 	
+	 	 print_audio("Alsa: codec dai snd_soc_dai_set_sysclk fail,ret=%d!\n",ret);
+		 return ret;
+	 }
+
+	   
+	 
+#if 0	  
+	  /* Set the Codec DAI clk */	  
+	  ret =snd_soc_dai_set_pll(codec_dai, 0, CODEC_SCLK_PLL,
+								   ZXIC_MCLK, params_rate(params)*256);
+	  if (ret < 0){
+		 
+		  print_audio("Alsa: codec dai clk snd_soc_dai_set_pll fail,ret=%d!\n",ret);
+		  return ret;
+	  }
+#endif
+
+	 print_audio("Alsa: Entered func %s end\n", __func__);
+	 
+	 return 0;
+ }
+
+										 
+ int zx29_prepare2(struct snd_pcm_substream *substream)
+ {
+	 int path, ret;
+	 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+		 //ret = CPPS_FUNC(cpps_callbacks, zDrvVp_Loop)(VP_PATH_SPEAKER);
+		 if (ret < 0)
+			 return -1;
+	 }
+	 
+	 return 0;
+ } 
+ #if 0
+ static void zx29_i2s_top_reg_cfg(void)
+ {
+	 unsigned int i2s_top_reg;
+	 int ret = 0;
+ 
+#ifdef CONFIG_USE_PIN_I2S0
+	 ret = gpio_request(PIN_I2S0_WS, "i2s0_ws");
+	 if (ret < 0)
+		 BUG();
+	 ret = gpio_request(PIN_I2S0_CLK, "i2s0_clk");
+	 if (ret < 0)
+		 BUG();
+	 ret = gpio_request(PIN_I2S0_DIN, "i2s0_din");
+	 if (ret < 0)
+		 BUG();
+	 ret = gpio_request(PIN_I2S0_DOUT, "i2s0_dout");
+	 if (ret < 0)
+		 BUG();
+	 zx29_gpio_config(PIN_I2S0_WS, FUN_I2S0_WS);
+	 zx29_gpio_config(PIN_I2S0_CLK, FUN_I2S0_CLK);
+	 zx29_gpio_config(PIN_I2S0_DIN, FUN_I2S0_DIN);
+	 zx29_gpio_config(PIN_I2S0_DOUT, FUN_I2S0_DOUT);
+	 
+	 //top i2s1 cfg
+	 i2s_top_reg = zx_read_reg(ZX29_I2S_LOOP_CFG);
+	 i2s_top_reg &= 0xfffffff8;
+	 i2s_top_reg |= 0x00000001; //	inter arm_i2s1--top i2s1
+	 zx_write_reg(ZX29_I2S_LOOP_CFG, i2s_top_reg);
+#elif defined (CONFIG_USE_PIN_I2S1)
+	
+
+	 ret = gpio_request(PIN_I2S1_WS,"i2s1_ws");
+	 if(ret < 0)
+		 BUG();
+	 ret = gpio_request(PIN_I2S1_CLK,"i2s1_clk");
+	 if(ret < 0)
+		 BUG();
+	 ret = gpio_request(PIN_I2S1_DIN,"i2s1_din");
+	 if(ret < 0)
+		 BUG();
+	 ret = gpio_request(PIN_I2S1_DOUT,"i2s1_dout");
+	 if(ret < 0)
+		 BUG();
+	 zx29_gpio_config(PIN_I2S1_WS, FUN_I2S1_WS);
+	 zx29_gpio_config(PIN_I2S1_CLK, FUN_I2S1_CLK);
+	 zx29_gpio_config(PIN_I2S1_DIN, FUN_I2S1_DIN);
+	 zx29_gpio_config(PIN_I2S1_DOUT, FUN_I2S1_DOUT);
+		 
+	 //top i2s2 cfg
+	 i2s_top_reg = zx_read_reg(ZX29_I2S_LOOP_CFG);
+	 i2s_top_reg &= 0xfff8ffff;
+	 i2s_top_reg |= 0x00010000; //	inter arm_i2s1--top i2s2
+	 zx_write_reg(ZX29_I2S_LOOP_CFG, i2s_top_reg);
+#endif
+ 
+	 // inter loop
+	 //i2s_top_reg = zx_read_reg(ZX29_I2S_LOOP_CFG);
+	 //i2s_top_reg &= 0xfffffe07;
+	 //i2s_top_reg |= 0x000000a8; //	inter arm_i2s2--afe i2s
+	 //zx_write_reg(ZX29_I2S_LOOP_CFG, i2s_top_reg);
+	 
+ //  print_audio("Alsa %s i2s loop cfg reg=%x\n",__func__, zx_read_reg(ZX29_I2S_LOOP_CFG));  
+ }
+ #endif
+ static int zx29_late_probe(struct snd_soc_card *card)
+ {
+	 //struct snd_soc_codec *codec = card->rtd[0].codec;
+	 //struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
+	 int ret;
+ //  print_audio("Alsa	zx29_late_probe entry!\n");
+ 
+#ifdef CONFIG_SND_SOC_JACK_DECTEC
+	 
+	 ret = snd_soc_jack_new(codec, "Headset",
+							SND_JACK_HEADSET |SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2,
+							&codec_headset);
+	 if (ret)
+		 return ret;
+ 
+	 ret = snd_soc_jack_add_pins(&codec_headset,
+								 ARRAY_SIZE(codec_headset_pins),
+								 codec_headset_pins);
+	 if (ret)
+		 return ret;
+       #ifdef CONFIG_SND_SOC_codec
+	 //rt5670_hs_detect(codec, &codec_headset);
+       #endif
+#endif
+ 
+	 return 0;
+ }
+ 
+ static struct snd_soc_ops zx29_ops = {
+	 //.startup = zx29_startup,
+	 .shutdown = zx29_shutdown,
+	 .hw_params = zx29_hw_params,
+ };
+  static struct snd_soc_ops zx29_ops_lp = {
+	 //.startup = zx29_startup,
+	 .shutdown = zx29_shutdown,
+	 .hw_params = zx29_hw_params_lp,
+ };
+ static struct snd_soc_ops zx29_ops1 = {
+	 //.startup = zx29_startup,
+	 .shutdown = zx29_shutdown,
+	 //.hw_params = zx29_hw_params1,
+ };
+ 
+ static struct snd_soc_ops zx29_ops2 = {
+	 //.startup = zx29_startup,
+	 .shutdown = zx29_shutdown2,
+	 //.hw_params = zx29_hw_params1,
+	 .prepare = zx29_prepare2,
+ };
+ static struct snd_soc_ops voice_ops = {
+	 .startup = zx29startup,
+	 .shutdown = zx29_shutdown2,
+	 .hw_params = zx29_hw_params_voice,
+	 //.prepare = zx29_prepare2,
+ };
+
+ 
+ enum {
+	 MERR_DPCM_AUDIO = 0,
+	 MERR_DPCM_DEEP_BUFFER,
+	 MERR_DPCM_COMPR,
+ };
+
+ 
+#if 0
+ 
+ static struct snd_soc_card zxic_soc_card = {
+	 .name = "zx298501_ti3100",
+	 .owner = THIS_MODULE,
+	 .dai_link = &zxic_dai_link,
+	 .num_links = ARRAY_SIZE(zxic_dai_link),
+#ifdef USE_ALSA_VOICE_FUNC
+	 .controls = vp_snd_controls,
+	 .num_controls = ARRAY_SIZE(vp_snd_controls),
+#endif
+ 
+ //  .late_probe = zx29_late_probe,
+	 
+ };
+#endif 
+ //static struct zx298501_ti3100_pdata *zx29_platform_data;
+ 
+ static int zx29_setup_pins(struct zx29_board_data *codec_pins, char *fun)
+ {
+	 int ret;
+ 
+	 //ret = gpio_request(codec_pins->codec_refclk, "codec_refclk");
+	 if (ret < 0) {
+		 printk(KERN_ERR "zx297520xx SoC Audio: %s pin already in use\n", fun);
+		 return ret;
+	 }
+	 //zx29_gpio_config(codec_pins->codec_refclk, GPIO17_CLK_OUT2);
+ 
+#ifdef  _USE_7520V3_PHONE_TYPE_C31F
+	 ret = gpio_request_one(ZX29_GPIO_39, GPIOF_OUT_INIT_LOW, "codec_pa");
+	 if (ret < 0) {
+		 printk(KERN_ERR "zx297520xx SoC Audio:  codec_pa in use\n");
+		 return ret;
+	 }
+	 
+	 ret = gpio_request_one(ZX29_GPIO_40, GPIOF_OUT_INIT_LOW, "codec_sw");
+	 if (ret < 0) {
+		 printk(KERN_ERR "zx297520xx SoC Audio:  codec_sw in use\n");
+		 return ret;
+	 }
+#endif
+ 
+	 return 0;
+ }
+#endif
+
+ 
+ static int zx29_remove(struct platform_device *pdev)
+ {
+	 gpio_free(zx29_platform_data.codec_refclk);
+	 platform_device_unregister(zx29_snd_device);
+	 return 0;
+ }
+ 
+
+ 
+#if  0
+
+ /*
+  * Default CFG switch settings to use this driver:
+  *	ZX29
+  */
+
+ /*
+  * Configure audio route as :-
+  * $ amixer sset 'DAC1' on,on
+  * $ amixer sset 'Right Headphone Mux' 'DAC'
+  * $ amixer sset 'Left Headphone Mux' 'DAC'
+  * $ amixer sset 'DAC1R Mixer AIF1.1' on
+  * $ amixer sset 'DAC1L Mixer AIF1.1' on
+  * $ amixer sset 'IN2L' on
+  * $ amixer sset 'IN2L PGA IN2LN' on
+  * $ amixer sset 'MIXINL IN2L' on
+  * $ amixer sset 'AIF1ADC1L Mixer ADC/DMIC' on
+  * $ amixer sset 'IN2R' on
+  * $ amixer sset 'IN2R PGA IN2RN' on
+  * $ amixer sset 'MIXINR IN2R' on
+  * $ amixer sset 'AIF1ADC1R Mixer ADC/DMIC' on
+  */
+
+/* ZX29 has a 16.934MHZ crystal attached to ti3100 */
+#define ZX29_TI3100_FREQ 16934000
+
+
+
+
+
+static int zx29_hw_params(struct snd_pcm_substream *substream,
+	struct snd_pcm_hw_params *params)
+{
+	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+	struct snd_soc_dai *codec_dai = rtd->codec_dai;
+	unsigned int pll_out;
+	int ret;
+
+	/* AIF1CLK should be >=3MHz for optimal performance */
+	if (params_width(params) == 24)
+		pll_out = params_rate(params) * 384;
+	else if (params_rate(params) == 8000 || params_rate(params) == 11025)
+		pll_out = params_rate(params) * 512;
+	else
+		pll_out = params_rate(params) * 256;
+
+	ret = snd_soc_dai_set_pll(codec_dai, AK4940_FLL1, AK4940_FLL_SRC_MCLK1,
+					ZX29_AK4940_FREQ, pll_out);
+	if (ret < 0)
+		return ret;
+
+	ret = snd_soc_dai_set_sysclk(codec_dai, AK4940_SYSCLK_FLL1,
+					pll_out, SND_SOC_CLOCK_IN);
+	if (ret < 0)
+		return ret;
+
+	return 0;
+}
+
+/*
+ * ZX29 AK4940 DAI operations.
+ */
+static struct snd_soc_ops zx29_ops = {
+	.hw_params = smdk_hw_params,
+};
+
+static int zx29_ti3100_init_paiftx(struct snd_soc_pcm_runtime *rtd)
+{
+	struct snd_soc_dapm_context *dapm = &rtd->card->dapm;
+
+	/* Other pins NC */
+	snd_soc_dapm_nc_pin(dapm, "HPOUT2P");
+	snd_soc_dapm_nc_pin(dapm, "HPOUT2N");
+	snd_soc_dapm_nc_pin(dapm, "SPKOUTLN");
+	snd_soc_dapm_nc_pin(dapm, "SPKOUTLP");
+	snd_soc_dapm_nc_pin(dapm, "SPKOUTRP");
+	snd_soc_dapm_nc_pin(dapm, "SPKOUTRN");
+	snd_soc_dapm_nc_pin(dapm, "LINEOUT1N");
+	snd_soc_dapm_nc_pin(dapm, "LINEOUT1P");
+	snd_soc_dapm_nc_pin(dapm, "LINEOUT2N");
+	snd_soc_dapm_nc_pin(dapm, "LINEOUT2P");
+	snd_soc_dapm_nc_pin(dapm, "IN1LP");
+	snd_soc_dapm_nc_pin(dapm, "IN2LP:VXRN");
+	snd_soc_dapm_nc_pin(dapm, "IN1RP");
+	snd_soc_dapm_nc_pin(dapm, "IN2RP:VXRP");
+
+	return 0;
+}
+#endif
+
+
+
+
+enum {
+	AUDIO_DL_MEDIA = 0,
+	AUDIO_DL_VOICE,
+	AUDIO_DL_2G_AND_3G_VOICE,
+	AUDIO_DL_VP_LOOP,	
+	AUDIO_DL_3G_VOICE,
+	
+	AUDIO_DL_MAX,
+};
+SND_SOC_DAILINK_DEF(dummy, \
+	DAILINK_COMP_ARRAY(COMP_DUMMY()));
+
+//SND_SOC_DAILINK_DEF(cpu_i2s0, \
+//	DAILINK_COMP_ARRAY(COMP_CPU("media-cpu-dai")));
+SND_SOC_DAILINK_DEF(cpu_i2s0, \
+	DAILINK_COMP_ARRAY(COMP_CPU("1405000.i2s")));
+
+
+SND_SOC_DAILINK_DEF(voice_cpu, \
+	DAILINK_COMP_ARRAY(COMP_CPU("soc:voice_audio")));
+
+SND_SOC_DAILINK_DEF(voice_2g_3g, \
+	DAILINK_COMP_ARRAY(COMP_CPU("voice_2g_3g-dai")));
+
+SND_SOC_DAILINK_DEF(voice_3g, \
+		DAILINK_COMP_ARRAY(COMP_CPU("voice_3g-dai")));
+
+
+
+//SND_SOC_DAILINK_DEF(ti3100, \
+//	DAILINK_COMP_ARRAY(COMP_CODEC("ti3100.1-0012", "ti3100-aif")));
+SND_SOC_DAILINK_DEF(dummy_cpu, \
+		DAILINK_COMP_ARRAY(COMP_CPU("soc:zx29_snd_dummy")));
+//SND_SOC_DAILINK_DEF(dummy_platform, \
+//	DAILINK_COMP_ARRAY(COMP_PLATFORM("soc:zx29_snd_dummy")));
+
+SND_SOC_DAILINK_DEF(dummy_codec, \
+		DAILINK_COMP_ARRAY(COMP_CODEC("soc:zx29_snd_dummy", "zx29_snd_dummy_dai")));
+SND_SOC_DAILINK_DEF(max9867_codec, \
+		DAILINK_COMP_ARRAY(COMP_CODEC("max9867.1-001a", "max9867-hifi")));
+
+//SND_SOC_DAILINK_DEF(media_platform, \
+//	DAILINK_COMP_ARRAY(COMP_PLATFORM("zx29-pcm-audio")));
+SND_SOC_DAILINK_DEF(media_platform, \
+	DAILINK_COMP_ARRAY(COMP_PLATFORM("1405000.i2s")));
+//SND_SOC_DAILINK_DEF(voice_cpu, \
+//	DAILINK_COMP_ARRAY(COMP_CPU("E1D02000.i2s")));
+
+SND_SOC_DAILINK_DEF(voice_platform, \
+	DAILINK_COMP_ARRAY(COMP_PLATFORM("soc:voice_audio")));
+
+
+
+			
+//static struct snd_soc_dai_link zx29_dai_link[] = {
+struct snd_soc_dai_link zx29_dai_link[] = {
+ {
+	.name = "zx29_snd_dummy",//codec name
+	.stream_name = "zx29_snd_dumy",
+	//.nonatomic = true,
+	//.dynamic = 1,
+	//.dpcm_playback = 1,
+	.ops = &zx29_ops_lp,
+	.init = zx29_init_paiftx,
+	SND_SOC_DAILINK_REG(cpu_i2s0, dummy_codec, media_platform),
+	
+},
+#if 1
+{
+	.name = "media",//codec name
+	.stream_name = "MultiMedia",
+	//.nonatomic = true,
+	//.dynamic = 1,
+	//.dpcm_playback = 1,
+	.ops = &zx29_ops,
+
+ 	.init = zx29_init_paiftx,
+	
+
+	SND_SOC_DAILINK_REG(cpu_i2s0, max9867_codec, media_platform),
+
+},
+{
+	.name = "voice",//codec name
+	.stream_name = "voice",
+	//.nonatomic = true,
+	//.dynamic = 1,
+	//.dpcm_playback = 1,
+	.ops = &voice_ops,
+
+	.init = zx29_init_paiftx,
+	
+	
+
+	SND_SOC_DAILINK_REG(voice_cpu, max9867_codec, voice_platform),
+
+},
+{
+	.name = "voice_2g3g_teak",//codec name
+	.stream_name = "voice_2g3g_teak",
+	//.nonatomic = true,
+	//.dynamic = 1,
+	//.dpcm_playback = 1,
+	.ops = &voice_ops,
+
+	.init = zx29_init_paiftx,
+	
+
+	SND_SOC_DAILINK_REG(voice_cpu, max9867_codec, voice_platform),
+
+},
+
+{
+	.name = "voice_3g",//codec name
+	.stream_name = "voice_3g",
+	//.nonatomic = true,
+	//.dynamic = 1,
+	//.dpcm_playback = 1,
+	.ops = &voice_ops,
+
+	.init = zx29_init_paiftx,
+	
+
+	SND_SOC_DAILINK_REG(voice_cpu, max9867_codec, voice_platform),
+
+},
+
+{
+	.name = "loop_test",//codec name
+	.stream_name = "loop_test",
+	//.nonatomic = true,
+	//.dynamic = 1,
+	//.dpcm_playback = 1,
+	//.ops = &zx29_ops,
+	.ops = &voice_ops,
+
+	.init = zx29_init_paiftx,
+	
+
+	SND_SOC_DAILINK_REG(voice_cpu, max9867_codec, dummy),
+
+},
+#endif
+
+};
+
+
+
+
+
+static struct snd_soc_card zx29_soc_card = {
+	.name = "zx29-sound-card",
+	.owner = THIS_MODULE,
+	.dai_link = zx29_dai_link,
+	.num_links = ARRAY_SIZE(zx29_dai_link),
+#ifdef USE_ALSA_VOICE_FUNC
+	 .controls = vp_snd_controls,
+	 .num_controls = ARRAY_SIZE(vp_snd_controls),
+#endif	
+};
+
+static const struct of_device_id zx29_max9867_of_match[] = {
+	{ .compatible = "zxic,zx29_max9867", .data = &zx29_platform_data },
+	{},
+};
+MODULE_DEVICE_TABLE(of, zx29_max9867_of_match);
+
+static void zx29_i2s_top_pin_cfg(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct pinctrl *p,*p2;
+	struct pinctrl_state *s,*s2;
+	int ret = 0;
+	printk("%s start n",__func__);
+
+	struct resource *res;
+	void __iomem	*reg_base;
+	unsigned int val;
+
+
+
+	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "soc_sys");
+	if (!res) {
+		dev_err(dev, "Reg region missing (%s)\n", "soc_sys");
+		//return -ENXIO;
+	}
+
+	#if 0
+	reg_base = devm_ioremap_resource(dev, res);
+	if (IS_ERR(reg_base )) {
+			dev_err(dev, "Reg region ioremap (%s) err=%li\n", "soc_sys",PTR_ERR(reg_base ));
+		//return PTR_ERR(reg_base );
+	}
+
+	#else
+	reg_base = devm_ioremap(&pdev->dev, res->start, resource_size(res));
+	#endif
+	 
+//#if 1 //CONFIG_USE_PIN_I2S0
+#ifdef 	CONFIG_USE_TOP_I2S0
+
+	dev_info(dev, "%s: arm i2s1 to top i2s0!!\n", __func__); 
+	//9300
+		 
+	//top i2s1 cfg
+	val = zx_read_reg(reg_base+ZX29_I2S_TOP_LOOP_REG);
+	val &= ~(0x7<<0);
+	val |= 0x1<<0; //	inter arm_i2s1--top i2s1
+	zx_write_reg(reg_base+ZX29_I2S_TOP_LOOP_REG, val);
+#else //(CONFIG_USE_PIN_I2S1)
+    //8501evb    	
+
+	dev_info(dev, "%s: arm i2s1 to top i2s1!\n", __func__); 
+			 
+	//top i2s2 cfg
+	val = zx_read_reg(reg_base+ZX29_I2S_TOP_LOOP_REG);
+	//val &= 0xfffffff8;
+	val &= ~(0x7<<16);	
+	val |= 0x1<<16;//	inter arm_i2s1--top i2s2
+	zx_write_reg(reg_base+ZX29_I2S_TOP_LOOP_REG, val);
+#endif
+
+	p = devm_pinctrl_get(dev);
+	if (IS_ERR(p)) {
+		dev_err(dev, "%s: pinctrl get failure ,p=0x%llx,dev=0x%llx!!\n", __func__,p,dev);
+		return;
+	}
+	
+	dev_info(dev, "%s: get pinctrl ,p=0x%llx,dev=0x%llx!!\n", __func__,p,dev); 
+
+	s = pinctrl_lookup_state(p, "top_i2s");
+	if (IS_ERR(s)) {
+		devm_pinctrl_put(p);
+		dev_err(dev, " get state failure!!\n");
+		return;
+	}
+	ret = pinctrl_select_state(p, s);
+	if (ret < 0) {
+		devm_pinctrl_put(p);
+		dev_err(dev, " select state failure!!\n");
+		return;
+	}
+	dev_info(dev, "%s: set i2s0 end!\n", __func__);	
+	/*
+	p2 = devm_pinctrl_get(dev);
+	if (IS_ERR(p)) {
+		dev_err(dev, "%s: pinctrl get failure ,p=0x%llx,dev=0x%llx!!\n", __func__,p,dev);
+		return;
+	}
+    */	
+
+	s2 = pinctrl_lookup_state(p, "top_i2s1");
+	if (IS_ERR(s)) {
+		devm_pinctrl_put(p);
+		dev_err(dev, " get state failure!!\n");
+		return;
+	}
+	
+	ret = pinctrl_select_state(p, s2);
+	if (ret < 0) {
+		devm_pinctrl_put(p);
+		dev_err(dev, " select state failure!!\n");
+		return;
+	}
+	dev_info(dev, "%s: set i2s1 end!\n", __func__);	
+
+
+	dev_info(dev, "%s: set pinctrl end!\n", __func__);	
+
+}
+#if 0
+static int codec_power_on(struct zx29_board_data * board,bool on_off)
+{
+	int ret = 0;
+	//struct zx29_board_data *board = dev_get_drvdata(dev);
+	struct device *dev = board->dev;
+
+	dev_info(dev, "%s:start %s board gpio_pwen=%d,gpio_pdn=%d on_off=%d\n",__func__,board->name,board->gpio_pwen,board->gpio_pdn,on_off);
+
+	if(on_off){
+
+		ret = gpio_direction_output(board->gpio_pwen, 1);	
+		if (ret < 0) {
+				dev_err(dev,"gpio_pwen %d direction fail set to 1: %d\n",board->gpio_pwen, ret);
+				return ret;
+		 }
+		
+		ret = gpio_direction_output(board->gpio_pdn, 1);	
+		if (ret < 0) {
+				dev_err(dev,"gpio_pdn %d direction fail set to 1: %d\n",board->gpio_pdn, ret);
+				return ret;
+		 }
+
+		
+	}
+	else{
+		ret = gpio_direction_output(board->gpio_pwen, 0);	
+		if (ret < 0) {
+				dev_err(dev,"gpio_pwen %d direction fail set to 0: %d\n",board->gpio_pwen, ret);
+				return ret;
+		 }
+		
+		ret = gpio_direction_output(board->gpio_pdn, 0);	
+		if (ret < 0) {
+				dev_err(dev,"gpio_pdn %d direction fail set to 0: %d\n",board->gpio_pdn, ret);
+				return ret;
+		 }
+
+	
+	}
+
+	return ret;
+
+}
+#endif
+
+
+#ifdef  CONFIG_PA_SA51034
+//sa51034
+#define SA51034_DEBUG
+
+#define SA51034_01_LATCHED_FAULT		0x01
+#define SA51034_02_STATUS_LOAD_DIAGNOSTIC      0x02
+#define SA51034_03_CONTROL			0x03
+#define SA51034_MAX_REGISTER SA51034_03_CONTROL
+
+struct sa51034_priv {
+	struct i2c_client *i2c;
+	struct regmap *regmap;
+	int pwen_gpio;//add new
+	int mute_gpio;
+	int fs;
+
+};
+static int sa51034_set_mute(struct sa51034_priv *sa51034,int mute);
+static int sa51034_get_mute(struct sa51034_priv *sa51034,int *mute); 
+
+
+
+
+struct sa51034_priv *g_sa51034 = NULL;
+/* ak4940 register cache & default register settings */
+static const struct reg_default sa51034_reg[] = {
+	{ 0x01, 0x00 },  /* SA51034_00_LATCHED_FAULT	*/
+	{ 0x02, 0x00 },  /* SA51034_01_STATUS_LOAD_DIAGNOSTIC	*/
+	{ 0x03, 0x00 },  /* SA51034_02_CONTROL			*/
+	
+};
+	
+static const char * const pa_gain_select_texts[] = {
+	"20dB", "26dB","30dB", "36dB",
+};
+static const char * const power_limit_select_texts[] = {
+	"PL-5V", "PL-5.9V","PL-7V", "PL-8.4V","PL-9.8V", "PL-11.8V","PL-14V", "PL-disV",
+};
+
+static const struct soc_enum pa_gain_enum[] = {
+	SOC_ENUM_SINGLE(SA51034_03_CONTROL, 6,
+	ARRAY_SIZE(pa_gain_select_texts), pa_gain_select_texts),
+};
+static const struct soc_enum power_limit_enum[] = {
+	SOC_ENUM_SINGLE(SA51034_03_CONTROL, 3,
+	ARRAY_SIZE(power_limit_select_texts), power_limit_select_texts),
+};
+	
+static const char * const reg_select[] = {
+	"read PA Reg 01:03",
+};
+
+static const struct soc_enum pa_enum2[] = {
+	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(reg_select),reg_select),
+};
+
+static int get_reg(
+	struct snd_kcontrol       *kcontrol,
+	struct snd_ctl_elem_value  *ucontrol)
+{
+	struct snd_soc_component *component; 
+	struct device *dev;    
+
+	
+
+	u32    currMode = ucontrol->value.enumerated.item[0];
+	int    i, ret;
+	int	   regs, rege;
+	unsigned int value;
+
+
+	if(g_sa51034 == NULL){
+	   pr_err("g_sa51034 null return %s\n", __func__);	  
+	   return -1;
+	}
+	dev = &g_sa51034->i2c->dev; 
+
+	component =  snd_soc_lookup_component(dev, NULL); 	
+	regs = 0x1;
+	rege = 0x4;
+
+	for (i = regs; i < rege; i++) {
+		value = snd_soc_component_read(component, i);
+		if (value < 0) {
+			pr_err("pa %s(%d),err value=%d\n", __func__, __LINE__, value);
+			return value;
+		}
+		pr_info("pa 2c_read Addr,Reg=(%x, %x)\n", i, value);
+	}
+	
+	return 0;
+}
+
+
+
+  int pa_get_enum_double(struct snd_kcontrol *kcontrol,
+	  struct snd_ctl_elem_value *ucontrol)
+  {
+	  //struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
+  
+	  struct snd_soc_component *component; 
+	  struct device *dev;	 
+
+	  
+
+	  
+	  struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
+	  unsigned int val, item;
+	  unsigned int reg_val;
+	  int ret;
+	  if(g_sa51034 == NULL){
+ 	  	 pr_err("g_sa51034 null return %s\n", __func__);	
+ 		 return -1;
+	  }
+	  dev = &g_sa51034->i2c->dev; 
+
+	  
+	  component = snd_soc_lookup_component(dev, NULL);  
+	  reg_val = snd_soc_component_read(component, e->reg);
+
+
+	  if (reg_val < 0) {
+	  	  pr_err("pa %s(%d),err reg_val=%d\n", __func__, __LINE__, reg_val);
+		  return reg_val;
+	  }
+
+	  
+	  val = (reg_val >> e->shift_l) & e->mask;
+	  item = snd_soc_enum_val_to_item(e, val);
+	  ucontrol->value.enumerated.item[0] = item;
+	  if (e->shift_l != e->shift_r) {
+		  val = (reg_val >> e->shift_r) & e->mask;
+		  item = snd_soc_enum_val_to_item(e, val);
+		  ucontrol->value.enumerated.item[1] = item;
+	  }
+  
+	  return 0;
+  }
+
+  int pa_put_enum_double(struct snd_kcontrol *kcontrol,
+	  struct snd_ctl_elem_value *ucontrol)
+  {
+	  //struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
+	  
+	  struct snd_soc_component *component; 
+	  struct device *dev;	 
+	  struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
+	  unsigned int *item = ucontrol->value.enumerated.item;
+	  unsigned int val;
+	  unsigned int mask;
+
+	  if(g_sa51034 == NULL){
+ 	  	 pr_err("g_sa51034 null return %s\n", __func__);	
+ 		 return -1;
+	  }
+	  dev = &g_sa51034->i2c->dev; 
+	  component = snd_soc_lookup_component(dev, NULL);  
+  
+	  if (item[0] >= e->items)
+		  return -EINVAL;
+	  val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
+	  mask = e->mask << e->shift_l;
+	  if (e->shift_l != e->shift_r) {
+		  if (item[1] >= e->items)
+			  return -EINVAL;
+		  val |= snd_soc_enum_item_to_val(e, item[1]) << e->shift_r;
+		  mask |= e->mask << e->shift_r;
+	  }
+  
+	  return snd_soc_component_update_bits(component, e->reg, mask, val);
+  }
+
+
+static int pa_SetMute(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
+{
+	  int mute = 0,ret = 0;
+	  
+
+
+	  if(g_sa51034 == NULL){
+ 	  	 pr_err("g_sa51034 null return %s\n", __func__);	
+ 		 return -1;
+	  }	  
+	  mute = ucontrol->value.integer.value[0];
+	  ret = sa51034_set_mute(g_sa51034,mute);
+	  
+	  if(ret < 0)
+	  {
+		printk(KERN_ERR "sa51034_set_mute fail ret=%d,mute=%d\n",ret,mute);
+		return ret;
+	  }
+	  return 0;
+}
+
+static int pa_GetMute(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
+{ 	
+	int mute = 0,ret = 0;
+	
+	if(g_sa51034 == NULL){
+		pr_err("g_sa51034 null return %s\n", __func__);    
+		return -1;
+	}
+	ret = sa51034_get_mute(g_sa51034,&mute);
+	
+	if(ret < 0)
+	{
+	  printk(KERN_ERR "sa51034_get_mute fail ret= %d\n",ret);
+	  return ret;
+	}
+	pr_info("[SA51034] %s mute gpio val=%d,integer.value[0]=%d\n", __func__, mute,ucontrol->value.integer.value[0]);
+
+	ucontrol->value.integer.value[0] = mute;
+
+	return 0;
+}
+
+
+
+
+
+const struct snd_kcontrol_new pa_controls[] =
+{
+	SOC_ENUM_EXT("PA gain", pa_gain_enum[0], pa_get_enum_double, pa_put_enum_double),
+    SOC_ENUM_EXT("Power limit", power_limit_enum[0], pa_get_enum_double, pa_put_enum_double),
+	SOC_ENUM_EXT("PA Reg Read", pa_enum2[0], get_reg, NULL),
+	SOC_SINGLE_EXT("pa mute", 0, 0, 1, 0,pa_GetMute, pa_SetMute),
+
+
+};
+	
+int pa_controls_size = sizeof(pa_controls) / sizeof(pa_controls[0]);
+
+
+
+
+static bool sa51034_volatile(struct device *dev, unsigned int reg)
+{
+	bool ret;
+
+#ifdef SA51034_DEBUG
+	ret = true;
+#else
+	ret = false;
+#endif
+
+	return ret;
+}
+
+static bool sa51034_readable(struct device *dev, unsigned int reg)
+{
+	if (reg <= SA51034_MAX_REGISTER)
+		return true;
+	else
+		return false;
+}
+
+static bool sa51034_writeable(struct device *dev, unsigned int reg)
+{
+	if (reg <= SA51034_MAX_REGISTER)
+		return true;
+	else
+		return false;
+}
+
+
+static const struct regmap_config sa51034_regmap = {
+	.reg_bits = 8,
+	.val_bits = 8,
+
+	.max_register = SA51034_MAX_REGISTER,
+	.volatile_reg = sa51034_volatile,
+	.writeable_reg = sa51034_writeable,
+	.readable_reg = sa51034_readable,
+
+	.reg_defaults = sa51034_reg,
+	.num_reg_defaults = ARRAY_SIZE(sa51034_reg),
+	.cache_type = REGCACHE_RBTREE,
+
+};
+
+static const struct snd_soc_component_driver pa_asoc_component = {
+	.name = "pa_component",
+
+
+	//.controls = pa_controls,
+	//.num_controls = ARRAY_SIZE(pa_controls),
+
+
+};
+
+static const struct of_device_id sa51034_i2c_dt_ids[] = {
+	{ .compatible = "sa51034"},
+	{ }
+};
+MODULE_DEVICE_TABLE(of, sa51034_i2c_dt_ids);
+static int sa51034_gpio_request(struct sa51034_priv *sa51034)
+{
+	struct device *dev;
+	struct device_node *np;
+    int ret;
+	dev = &(sa51034->i2c->dev);
+
+	np = dev->of_node;
+
+	if (!np)
+		return 0;
+
+	pr_info( "Read PDN pin from device tree\n");
+
+
+	sa51034->pwen_gpio = of_get_named_gpio(np, "sa51034,ctrl-gpio", 0);
+	if (sa51034->pwen_gpio < 0) {
+	    pr_err(  "sa51034 pwen pin of_get_named_gpio fail\n");
+		
+		sa51034->pwen_gpio = -1;
+		return -1;
+	}
+
+	if (!gpio_is_valid(sa51034->pwen_gpio)) {
+		pr_err(  "sa51034 pwen_gpio pin(%u) is invalid\n", sa51034->pwen_gpio);
+		sa51034->pwen_gpio = -1;
+		return -1;
+	}
+	sa51034->mute_gpio = of_get_named_gpio(np, "sa51034,ctrl-gpio", 1);
+	if (sa51034->mute_gpio < 0) {
+		
+	    pr_err(  "sa51034 mute_gpio pin of_get_named_gpio fail\n");
+		sa51034->mute_gpio = -1;
+		return -1;
+	}
+
+	if (!gpio_is_valid(sa51034->mute_gpio)) {
+		pr_err(  "sa51034 mute_gpio pin(%u) is invalid\n", sa51034->mute_gpio);
+		sa51034->mute_gpio = -1;
+		return -1;
+	}
+
+	
+	pr_info( "sa51034 get pwen_gpio pin(%u) mute_gpio pin(%u)\n", sa51034->pwen_gpio,sa51034->mute_gpio);
+
+	if (sa51034->pwen_gpio != -1) {
+		ret = devm_gpio_request(dev,sa51034->pwen_gpio, "sa51034 pwen");
+		if (ret < 0){
+			pr_err(  "sa51034 pwen_gpio request fail,ret=%d\n",ret);
+			return ret;			
+		}
+		pr_info("\t[sa51034] %s :pwen_gpio gpio_request ret = %d\n", __func__, ret);
+		gpio_direction_output(sa51034->pwen_gpio, 0);
+	}
+
+	
+	if (sa51034->mute_gpio != -1) {
+		ret = devm_gpio_request(dev,sa51034->mute_gpio, "sa51034 mute");
+		if (ret < 0){
+			pr_err(  "sa51034 mute_gpio request fail,ret=%d\n",ret);
+			return ret;			
+		}
+
+		pr_info("\t[AK4940] %s : mute_gpio gpio_request ret = %d\n", __func__, ret);
+		gpio_direction_output(sa51034->mute_gpio, 1);
+	}
+  
+	
+	return 0;
+}
+
+static int sa51034_set_mute(struct sa51034_priv *sa51034,int mute) 
+{
+	//struct snd_soc_component *component = dai->component;
+	//struct ak4940_priv *ak4940 = snd_soc_component_get_drvdata(component);
+	int ret = 0;
+	//int ndt;
+
+	pr_info("[SA51034] %s mute=%d\n", __func__, mute);
+	if (sa51034->mute_gpio == -1) {
+			pr_err(  "sa51034 %s mute_gpio invalid return\n",__func__);
+			return -1;	
+	}
+
+	//ndt = 4080000 / sa51034->fs;
+	if (mute) {
+		/* SMUTE: 1 , MUTE */
+		ret = gpio_direction_output(sa51034->mute_gpio, 1);
+		//mdelay(ndt);
+	} else{
+		/* SMUTE:  0  ,NORMAL operation */
+		ret = gpio_direction_output(sa51034->mute_gpio, 0);
+		//mdelay(ndt);
+	}
+	return ret;
+}
+
+static int sa51034_get_mute(struct sa51034_priv *sa51034,int *mute) 
+{
+
+	int ret = 0;
+	if (sa51034->mute_gpio == -1) {
+			pr_err(  "sa51034 %s mute_gpio invalid return\n",__func__);
+			return -1;	
+	}
+	
+	*mute = gpio_get_value(sa51034->mute_gpio);
+	pr_info("[SA51034] %s mute gpio val=%d\n", __func__, *mute);
+	
+	return ret;
+}
+
+static int sa51034_set_pwen(struct sa51034_priv *sa51034,int en) 
+{
+	//struct snd_soc_component *component = dai->component;
+	//struct ak4940_priv *ak4940 = snd_soc_component_get_drvdata(component);
+	int ret = 0;
+	//int ndt;
+
+	pr_info("\t[SA51034] %s en[%s]\n", __func__, en ? "ON":"OFF");
+	if (sa51034->pwen_gpio == -1) {
+			pr_err(  "sa51034 %s pwen_gpio invalid return\n",__func__);
+			return -1;	
+	}
+	//ndt = 4080000 / sa51034->fs;
+	if (en) {
+		/* SMUTE: 1 , MUTE */
+		ret = gpio_direction_output(sa51034->pwen_gpio, 1);
+		//mdelay(ndt);
+	} else{
+		/* SMUTE:  0  ,NORMAL operation */
+		ret = gpio_direction_output(sa51034->pwen_gpio, 0);
+		//mdelay(ndt);
+	}
+	return ret;
+}
+
+
+
+static int sa51034_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
+{
+	struct sa51034_priv *sa51034;
+	int ret = 0;
+	unsigned int val;
+
+	pr_info("\t[sa51034] %s(%d),i2c->addr=0x%x\n", __func__, __LINE__,i2c->addr);
+
+	sa51034 = devm_kzalloc(&i2c->dev, sizeof(struct sa51034_priv), GFP_KERNEL);
+	if (sa51034 == NULL)
+		return -ENOMEM;
+
+
+	sa51034->regmap = devm_regmap_init_i2c(i2c, &sa51034_regmap);
+
+	if (IS_ERR(sa51034->regmap)) {
+		devm_kfree(&i2c->dev, sa51034);
+		return PTR_ERR(sa51034->regmap);
+	}
+
+
+	i2c_set_clientdata(i2c, sa51034);
+	sa51034->i2c = i2c;
+	ret = devm_snd_soc_register_component(&i2c->dev, &pa_asoc_component,
+					      NULL, 0);
+	if (ret) {
+		pr_err( "pa component register failed,ret=%d\n",ret);
+		return ret;
+	}
+
+	pr_info("[sa51034] %s(%d) pa component register end,ret=0x%x\n", __func__, __LINE__,ret);
+
+	sa51034_gpio_request(sa51034);
+
+
+	sa51034_set_pwen(sa51034,1); 
+
+	//sa51034_set_mute(sa51034,0);
+
+	g_sa51034 = sa51034;
+
+	
+	pr_info("\t[sa51034] %s end\n", __func__);
+	return ret;
+}
+
+static const struct i2c_device_id sa51034_i2c_id[] = {
+
+	{ "sa51034", 0 },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, sa51034_i2c_id);
+
+static struct i2c_driver sa51034_i2c_driver = {
+	.driver = {
+		.name = "sa51034",
+		.of_match_table = of_match_ptr(sa51034_i2c_dt_ids),
+	},
+	.probe = sa51034_i2c_probe,
+	//.remove = sa51034_i2c_remove,
+	.id_table = sa51034_i2c_id,
+};
+
+static int  sa51034_init(void)
+{
+	pr_info("\t[sa51034] %s(%d)\n", __func__, __LINE__);
+
+	return i2c_add_driver(&sa51034_i2c_driver);
+}
+
+#endif
+static int zx29_audio_probe(struct platform_device *pdev)
+{
+	int ret;
+	struct device_node *np = pdev->dev.of_node;
+	struct snd_soc_card *card = &zx29_soc_card;
+	struct zx29_board_data *board;
+	const struct of_device_id *id;
+	enum of_gpio_flags flags;
+	unsigned int idx;
+
+	struct device *dev = &pdev->dev;
+	dev_info(&pdev->dev,"zx29_audio_probe start!\n");
+
+
+	card->dev = &pdev->dev;
+
+	board = devm_kzalloc(&pdev->dev, sizeof(*board), GFP_KERNEL);
+	if (!board)
+		return -ENOMEM;
+
+	if (np) {
+		zx29_dai_link[0].cpus->dai_name = NULL;
+		zx29_dai_link[0].cpus->of_node = of_parse_phandle(np,
+				"zxic,i2s-controller", 0);
+		if (!zx29_dai_link[0].cpus->of_node) {
+			dev_err(&pdev->dev,
+			   "Property 'zxic,i2s-controller' missing or invalid\n");
+			ret = -EINVAL;
+		}
+
+		zx29_dai_link[0].platforms->name = NULL;
+		zx29_dai_link[0].platforms->of_node = zx29_dai_link[0].cpus->of_node;
+
+		
+#if 0
+		zx29_dai_link[0].codecs->of_node = of_parse_phandle(np,
+				"zxic,audio-codec", 0);
+		if (!zx29_dai_link[0].codecs->of_node) {
+			dev_err(&pdev->dev,
+				"Property 'zxic,audio-codec' missing or invalid\n");
+			return -EINVAL;
+		}
+#endif	
+	}
+	
+
+
+
+
+
+	id = of_match_device(of_match_ptr(zx29_max9867_of_match), &pdev->dev);
+	if (id)
+		*board = *((struct zx29_board_data *)id->data);
+	
+	board->name = "zx29_max9867";
+	board->dev = &pdev->dev;
+
+	//platform_set_drvdata(pdev, board);
+	s_board = board;
+
+
+#if 0
+
+	board->gpio_pwen = of_get_gpio_flags(dev->of_node, 0, &flags);
+	if (!gpio_is_valid(board->gpio_pwen)) {
+		dev_err(dev,"  gpio_pwen no found\n");
+		return -EBUSY;
+	}
+	dev_info(dev, "board->gpio_pwen=0x%x  flags = %d\n",board->gpio_pwen,flags);
+	ret = devm_gpio_request(&pdev->dev,board->gpio_pwen, "codec_pwen");
+	if (ret < 0) {
+		dev_err(dev,"gpio_pwen request error.\n");
+		return ret;
+
+	}
+
+	board->gpio_pdn = of_get_gpio_flags(dev->of_node, 1, &flags);
+	if (!gpio_is_valid(board->gpio_pdn)) {
+		dev_err(dev,"  gpio_pdn no found\n");
+		return -EBUSY;
+	}
+	dev_info(dev, "board->gpio_pdn=0x%x  flags = %d\n",board->gpio_pdn,flags);
+	ret = devm_gpio_request(&pdev->dev,board->gpio_pdn, "codec_pdn");
+	if (ret < 0) {
+		dev_err(dev,"gpio_pdn request error.\n");
+		return ret;
+
+	}
+#endif
+
+	ret = devm_snd_soc_register_card(&pdev->dev, card);
+
+	if (ret){
+		dev_err(&pdev->dev, "snd_soc_register_card() failed:%d\n", ret);
+	    return ret;
+	}
+	zx29_i2s_top_pin_cfg(pdev);	
+
+	
+	//codec_power_on(board,1);
+#ifdef  CONFIG_PA_SA51034
+
+	dev_info(&pdev->dev,"zx29_audio_probe start sa51034_init!\n");
+
+	ret = sa51034_init();
+	if (ret != 0) {
+
+		pr_err("sa51034_init Failed to register I2C driver: %d\n", ret);
+		//return ret;
+
+	}
+	else{
+
+		for (idx = 0; idx < ARRAY_SIZE(pa_controls); idx++) {
+			ret = snd_ctl_add(card->snd_card,
+					  snd_ctl_new1(&pa_controls[idx],
+						       NULL));
+			if (ret < 0){
+				return ret;
+			}
+		}
+
+	}
+	 ret  = 0;
+
+#endif	
+	dev_info(&pdev->dev,"zx29_audio_probe end!\n");
+
+	return ret;
+}
+
+static void zx29_audio_shutdown(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+
+	
+	dev_info(&pdev->dev,"%s:zx29_max9867 end!\n",__func__);
+
+	return ;
+}
+static int zx29_audio_suspend(struct platform_device *pdev, pm_message_t state)
+{
+	int ret;
+	struct device *dev = &pdev->dev;
+
+	
+	dev_info(&pdev->dev,"%s:zx29_max9867 end!\n",__func__);
+
+	return ret;
+}
+
+static int zx29_audio_resume(struct platform_device *pdev)
+{
+	int ret;
+	struct device *dev = &pdev->dev;
+
+	
+	dev_info(&pdev->dev,"%s:zx29_max9867 end!\n",__func__);
+
+	return ret;
+}
+
+
+static struct platform_driver zx29_platform_driver = {
+	.driver		= {
+		.name	= "zx29_max9867",
+		.of_match_table = of_match_ptr(zx29_max9867_of_match),
+		.pm	= &snd_soc_pm_ops,
+	},
+	.probe		= zx29_audio_probe,
+	.shutdown 	= zx29_audio_shutdown,
+	.suspend 	= zx29_audio_suspend,
+	.resume 	= zx29_audio_resume,
+};
+
+
+
+
+
+module_platform_driver(zx29_platform_driver);
+
+MODULE_DESCRIPTION("zx29 ALSA SoC audio driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:zx29-audio-max9867");
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/zx29_nau8810.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/zx29_nau8810.c
index 7cc631c..3ec7358 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/zx29_nau8810.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/zx29_nau8810.c
@@ -1,5 +1,5 @@
 /*
- * zx297520v3_es8312.c  --  zx298501-ti3100 ALSA SoC Audio board driver
+ * zx297520v3_nau8810.c  --  zx297520v3-nau8810 ALSA SoC Audio board driver
  *
  * Copyright (C) 2022, ZTE Corporation.
  *
@@ -858,7 +858,7 @@
 #if 0
  
  static struct snd_soc_card zxic_soc_card = {
-	 .name = "zx298501_ti3100",
+	 .name = "zx29_nau8810",
 	 .owner = THIS_MODULE,
 	 .dai_link = &zxic_dai_link,
 	 .num_links = ARRAY_SIZE(zxic_dai_link),
@@ -871,7 +871,6 @@
 	 
  };
 #endif 
- //static struct zx298501_ti3100_pdata *zx29_platform_data;
  
  static int zx29_setup_pins(struct zx29_board_data *codec_pins, char *fun)
  {
@@ -937,7 +936,7 @@
   */
 
 /* ZX29 has a 16.934MHZ crystal attached to ti3100 */
-#define ZX29_TI3100_FREQ 16934000
+#define ZX29_CODEC_FREQ 16934000
 
 
 
@@ -979,7 +978,7 @@
 	.hw_params = smdk_hw_params,
 };
 
-static int zx29_ti3100_init_paiftx(struct snd_soc_pcm_runtime *rtd)
+static int zx29_codec_init_paiftx(struct snd_soc_pcm_runtime *rtd)
 {
 	struct snd_soc_dapm_context *dapm = &rtd->card->dapm;
 
@@ -1035,8 +1034,8 @@
 
 
 
-//SND_SOC_DAILINK_DEF(ti3100, \
-//	DAILINK_COMP_ARRAY(COMP_CODEC("ti3100.1-0012", "ti3100-aif")));
+//SND_SOC_DAILINK_DEF(nau8810, \
+//	DAILINK_COMP_ARRAY(COMP_CODEC("nau8810.1-0012", "nau8810-aif")));
 SND_SOC_DAILINK_DEF(dummy_cpu, \
 		DAILINK_COMP_ARRAY(COMP_CPU("soc:zx29_snd_dummy")));
 //SND_SOC_DAILINK_DEF(dummy_platform, \
@@ -1857,7 +1856,7 @@
 	if (id)
 		*board = *((struct zx29_board_data *)id->data);
 	
-	board->name = "zx29_ti3100";
+	board->name = "zx29_nau8810";
 	board->dev = &pdev->dev;
 
 	//platform_set_drvdata(pdev, board);
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/zx29_ti3100.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/zx29_ti3100.c
index 6eb4c7a..9959350 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/zx29_ti3100.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/sound/soc/sanechips/zx29_ti3100.c
@@ -1043,8 +1043,21 @@
 
 SND_SOC_DAILINK_DEF(dummy_codec, \
 		DAILINK_COMP_ARRAY(COMP_CODEC("soc:zx29_snd_dummy", "zx29_snd_dummy_dai")));
-SND_SOC_DAILINK_DEF(ti3100_codec, \
+
+#if defined(CONFIG_SND_SOC_ZX29_TI3104)
+SND_SOC_DAILINK_DEF(codec, \
+		DAILINK_COMP_ARRAY(COMP_CODEC("tlv320aic3x-codec.1-0018", "tlv320aic3x-hifi")));
+
+#elif defined(CONFIG_SND_SOC_ZX29_TI3100)
+SND_SOC_DAILINK_DEF(codec, \
 		DAILINK_COMP_ARRAY(COMP_CODEC("tlv320aic31xx-codec.1-0018", "tlv320aic31xx-hifi")));
+#else
+
+SND_SOC_DAILINK_DEF(codec, \
+		DAILINK_COMP_ARRAY(COMP_CODEC("tlv320aic31xx-codec.1-0018", "tlv320aic31xx-hifi")));
+
+#endif
+
 
 //SND_SOC_DAILINK_DEF(media_platform, \
 //	DAILINK_COMP_ARRAY(COMP_PLATFORM("zx29-pcm-audio")));
@@ -1081,7 +1094,7 @@
  	.init = zx29_init_paiftx,
 	
 
-	SND_SOC_DAILINK_REG(cpu_i2s0, ti3100_codec, media_platform),
+	SND_SOC_DAILINK_REG(cpu_i2s0, codec, media_platform),
 
 },
 {
@@ -1096,7 +1109,7 @@
 	
 	
 
-	SND_SOC_DAILINK_REG(voice_cpu, ti3100_codec, voice_platform),
+	SND_SOC_DAILINK_REG(voice_cpu, codec, voice_platform),
 
 },
 {
@@ -1110,7 +1123,7 @@
 	.init = zx29_init_paiftx,
 	
 
-	SND_SOC_DAILINK_REG(voice_cpu, ti3100_codec, voice_platform),
+	SND_SOC_DAILINK_REG(voice_cpu, codec, voice_platform),
 
 },
 
@@ -1125,7 +1138,7 @@
 	.init = zx29_init_paiftx,
 	
 
-	SND_SOC_DAILINK_REG(voice_cpu, ti3100_codec, voice_platform),
+	SND_SOC_DAILINK_REG(voice_cpu, codec, voice_platform),
 
 },
 
@@ -1141,8 +1154,8 @@
 	.init = zx29_init_paiftx,
 	
 
-	//SND_SOC_DAILINK_REG(cpu_i2s0, ti3100_codec, dummy),
-	SND_SOC_DAILINK_REG(voice_cpu, ti3100_codec, dummy),
+	//SND_SOC_DAILINK_REG(cpu_i2s0, codec, dummy),
+	SND_SOC_DAILINK_REG(voice_cpu, codec, dummy),
 
 },
 
@@ -1163,6 +1176,7 @@
 
 static const struct of_device_id zx29_ti3100_of_match[] = {
 	{ .compatible = "zxic,zx29_ti3100", .data = &zx29_platform_data },
+	{ .compatible = "zxic,zx29_ti3104", .data = &zx29_platform_data },
 	{},
 };
 MODULE_DEVICE_TABLE(of, zx29_ti3100_of_match);
@@ -1850,7 +1864,14 @@
 	if (id)
 		*board = *((struct zx29_board_data *)id->data);
 	
-	board->name = "zx29_ti3100";
+#if defined(CONFIG_SND_SOC_ZX29_TI3104)
+		board->name = "zx29_ti3104";
+#elif defined(CONFIG_SND_SOC_ZX29_TI3100)	
+		board->name = "zx29_ti3100";
+#else
+		board->name = "zx29_ti3100";
+
+#endif	
 	board->dev = &pdev->dev;
 
 	//platform_set_drvdata(pdev, board);
@@ -1929,7 +1950,14 @@
 
 static struct platform_driver zx29_platform_driver = {
 	.driver		= {
+#if defined(CONFIG_SND_SOC_ZX29_TI3104)
+		.name	= "zx29_ti3104",
+#elif defined(CONFIG_SND_SOC_ZX29_TI3100)	
 		.name	= "zx29_ti3100",
+#else
+		.name	= "zx29_ti3100",
+
+#endif
 		.of_match_table = of_match_ptr(zx29_ti3100_of_match),
 		.pm	= &snd_soc_pm_ops,
 	},
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/ab_bootinfo/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/ab_bootinfo/Makefile
index 29d5251..9b5b9d9 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/ab_bootinfo/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/ab_bootinfo/Makefile
@@ -8,14 +8,12 @@
 OBJS    = ab_bootinfo.o

 

 CFLAGS += -I$(APP_DIR)/include

-CFLAGS += -I$(LIB_DIR)/libupi_ab/inc

 CFLAGS += -g -Werror=implicit-function-declaration

 

 

 #LDLIBS = -lnvram_sc -L$(LIB_DIR)/libnvram

 #LDLIBS += -lmtd

-LDLIBS += -lpthread -lnvram -lsofttimer -lupi_ab -lsoftap

-LDLIBS += -lcrypto

+LDLIBS += -lflags

 #LDLIBS += -lcrypto  -L$(LIB_DIR)/libssl/install/lib

 

 ##############USER COMIZE END##################

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/ab_bootinfo/ab_bootinfo.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/ab_bootinfo/ab_bootinfo.c
index b0224de..71c2a94 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/ab_bootinfo/ab_bootinfo.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/ab_bootinfo/ab_bootinfo.c
@@ -1,24 +1,19 @@
 #include <stdio.h>
 #include <stdlib.h>
-#include "zxic_fota_ab_upgrade.h"
+#include "pub_flags.h"
+#include "flags_api.h"
 
-#if 0
-static int zxic_dual_get_current_system(void)
-{
-    return 1;
-}
-#endif
 int main(int argc, char *argv[])
 {
-    int ret = zxic_dual_get_current_system(); 
+    int ret = flags_get_current_system(); 
 
     switch (ret)
     {
-        case Z_DUAL_SYSTEM:
+        case DUAL_SYSTEM:
             printf("ab_bootinfo:ab_a\n");
             ret = 1;
             break;
-        case Z_DUAL_SYSTEM2:
+        case DUAL_SYSTEM2:
             printf("ab_bootinfo:ab_b\n");
             ret = 2;
             break;
@@ -28,4 +23,4 @@
             break;
     }
     return ret;
-}
\ No newline at end of file
+}
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/flags_tool/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/flags_tool/Makefile
new file mode 100755
index 0000000..dffd1dd
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/flags_tool/Makefile
@@ -0,0 +1,45 @@
+.EXPORT_ALL_VARIABLES:
+include $(COMMON_MK)
+
+
+EXEC = flags_tool
+
+SRCS=$(wildcard ./src/*.c)
+OBJS = $(patsubst %.c,%.o,$(SRCS))
+
+CFLAGS += -Wall -g
+
+CFLAGS += -Werror=implicit-int \
+		  -Werror=implicit-function-declaration \
+		  -Werror=float-equal \
+		  -Werror=return-type \
+		  -Werror=enum-compare \
+		  -Werror=init-self 
+
+CFLAGS +=	-O2
+
+CFLAGS +=	-I./inc	\
+
+CFLAGS +=	-I../include
+
+LDLIBS += -lpthread
+
+LDLIBS += -lflags -L$(zte_lib_path)/libflags
+
+
+#*******************************************************************************
+# targets
+#*******************************************************************************
+all: $(EXEC)
+
+$(EXEC): $(OBJS)
+	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) $(LDLIBS_$@) -Wl,--end-group
+	$(CC) $(LD_BEGIN) -static $(LDFLAGS) -o $@_static $^ -Wl,--start-group $(LDLIBS) $(LDLIBS_$@) -Wl,--end-group $(LD_END)
+	cp $(EXEC) $(EXEC).elf
+	cp $(EXEC)_static $(EXEC)_static.elf
+
+romfs root_fs:
+	$(ROMFSINST) /bin/$(EXEC)_static
+
+clean:
+	-rm -f $(EXEC) $(EXEC)_static *.elf *.gdb *.o ./src/*.o
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/flags_tool/src/main.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/flags_tool/src/main.c
new file mode 100755
index 0000000..403349e
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/flags_tool/src/main.c
@@ -0,0 +1,310 @@
+/**
+* @file main.c
+* @brief flags·ÖÇø¹¤¾ß
+*
+* Copyright (C) 2023 Sanechips Technology Co., Ltd.
+* @author
+*
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License version 2 as
+* published by the Free Software Foundation. £¨±ØÑ¡£ºGPLv2 Licence£©
+*
+*/
+
+
+/*******************************************************************************
+ *                           Include header files                              *
+ ******************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <dirent.h>
+#include <getopt.h>
+#include <unistd.h>
+
+#include "pub_flags.h"
+#include "flags_api.h"
+
+
+/*******************************************************************************
+ *                             Macro definitions                               *
+ ******************************************************************************/
+
+
+/*******************************************************************************
+ *                             Type definitions                                *
+ ******************************************************************************/
+typedef struct
+{
+    int	option_value;
+    int (*func)(char *);
+} option_handle_t;
+
+
+
+/*******************************************************************************
+ *                       Static function declarations                          *
+ ******************************************************************************/
+static int excute_command_help(char *option_para);
+static int excute_command_init(char *option_para);
+static int excute_command_get(char *option_para);
+static int excute_command_set(char *option_para);
+static int excute_command_get_ubifs_status(char *option_para);
+static int excute_command_set_ubifs_status(char *option_para);
+
+
+/*******************************************************************************
+ *                       Global variable declarations                          *
+ ******************************************************************************/
+static char * g_short_string = "higsub";
+
+static struct option g_long_options[] =
+{
+    {"help",				no_argument,	NULL,	'h'},
+    {"init",				no_argument,	NULL,	'i'},
+    {"get",					no_argument,	NULL,	'g'},
+    {"set",					no_argument,	NULL,	's'},
+    {"get-ubifs-status",	no_argument,	NULL,	'u'},
+    {"set-ubifs-status",	no_argument,	NULL,	'b'},
+    {0, 0, 0, 0}
+};
+
+static option_handle_t g_option_handle[] =
+{
+    {'h',		excute_command_help},
+    {'i',		excute_command_init},
+    {'g',		excute_command_get},
+    {'s',		excute_command_set},
+    {'u',		excute_command_get_ubifs_status},
+    {'b',		excute_command_set_ubifs_status}
+};
+
+
+/*******************************************************************************
+ *                       Static function define                          *
+ ******************************************************************************/
+static void usage(void)
+{
+    printf("flags_tool [-higsub] \n "
+		" -h,	--help                  show usage \n"
+		"  -i,	--init                  init flags \n"
+		"  -g,	--get                   get flags data \n"
+		"  -s,	--set                   set flags data \n"
+		"  -u,	--get-ubifs-status      get ubifs status \n"
+		"  -b,	--set-ubifs-status      set ubifs status \n");
+
+	return;
+}
+
+
+static int excute_command_help(char *option_para)
+{
+	usage();
+
+	return 0;
+}
+
+
+static int excute_command_init(char *option_para)
+{
+	if (flags_init() != 0)
+	{
+		printf("Err: flags init fail \n");
+		
+		return -1;
+	}
+	else
+	{
+		printf("Log: flags init success \n");
+		
+	    return 0;
+	}
+}
+
+
+static int excute_command_get(char *option_para)
+{
+	T_FLAGS_INFO flags_info = {0};
+
+	if (flags_get(&flags_info) != 0)
+	{
+		printf("Err: flags get fail \n");
+		
+		return -1;
+	}
+	else
+	{
+		printf("magic_start                     = 0x%x \n",	flags_info.magic_start);
+		
+		printf("boot_fota_flag.boot_to          = 0x%x \n",	flags_info.boot_fota_flag.boot_to);
+		printf("boot_fota_flag.fota_status      = %u \n",	flags_info.boot_fota_flag.fota_status);
+		printf("boot_fota_flag.system.status    = 0x%x \n",	flags_info.boot_fota_flag.system.status);
+		printf("boot_fota_flag.system.try_cnt	= %d \n",	flags_info.boot_fota_flag.system.try_cnt);
+		printf("boot_fota_flag.system2.status	= 0x%x \n",	flags_info.boot_fota_flag.system2.status);
+		printf("boot_fota_flag.system2.try_cnt	= %d \n",	flags_info.boot_fota_flag.system2.try_cnt);
+		
+		printf("boot_env.dualsys_type           = 0x%x \n",	flags_info.boot_env.dualsys_type);
+		printf("boot_env.system_boot_env        = %s \n",	flags_info.boot_env.system_boot_env);
+		printf("boot_env.system2_boot_env       = %s \n",	flags_info.boot_env.system2_boot_env);
+		
+		printf("ubifs_status.fs_status          = %d \n",	flags_info.ubifs_status.fs_status);
+		printf("ubifs_status.fs_mtd_name        = %s \n",	flags_info.ubifs_status.fs_mtd_name);
+		printf("ubifs_status.fs_ubi_vol_name    = %s \n",	flags_info.ubifs_status.fs_ubi_vol_name);
+		
+		printf("magic_end                       = 0x%x \n",	flags_info.magic_end);
+		
+	    return 0;
+	}
+}
+
+
+static int excute_command_set(char *option_para)
+{
+	T_FLAGS_INFO flags_info = {0};
+	
+    char system_boot_env[128] = "bootEnv1";
+    char system2_boot_env[128] = "2bootEnv";
+
+	char fs_mtd_name[16] = "nameMTD";
+	char fs_ubi_vol_name[16] = "nameVOL";
+	
+    flags_info.magic_start = FLAGS_MAGIC;
+	
+    flags_info.boot_fota_flag.boot_to = DUAL_SYSTEM;
+    flags_info.boot_fota_flag.fota_status = 0;
+    flags_info.boot_fota_flag.system.status = DUALSYSTEM_STATUS_BOOTABLE;
+    flags_info.boot_fota_flag.system.try_cnt = 5;
+    flags_info.boot_fota_flag.system2.status = DUALSYSTEM_STATUS_BOOTABLE;
+    flags_info.boot_fota_flag.system2.try_cnt = 13;
+
+    flags_info.boot_env.dualsys_type = DUALSYSTEM_AB;
+	strncpy(flags_info.boot_env.system_boot_env, system_boot_env, sizeof(flags_info.boot_env.system_boot_env));
+	strncpy(flags_info.boot_env.system2_boot_env, system2_boot_env, sizeof(flags_info.boot_env.system2_boot_env));
+
+	flags_info.ubifs_status.fs_status = 0;
+	strncpy(flags_info.ubifs_status.fs_mtd_name, fs_mtd_name, sizeof(flags_info.ubifs_status.fs_mtd_name));
+	strncpy(flags_info.ubifs_status.fs_ubi_vol_name, fs_ubi_vol_name, sizeof(flags_info.ubifs_status.fs_ubi_vol_name));
+	
+    flags_info.magic_end = FLAGS_MAGIC;
+
+	if (flags_set(&flags_info) != 0)
+	{
+		printf("Err: set flags fail \n");
+		
+		return -1;
+	}
+	else
+	{
+		printf("Log: set flags success \n");
+		
+		return 0;
+	}
+}
+
+
+static int excute_command_get_ubifs_status(char *option_para)
+{
+	T_UBIFS_STATUS ubifs_status = {0};
+
+	if (flags_get_ubifs_status(&ubifs_status) != 0)
+	{
+		printf("Err: get ubifs status fail \n");
+		
+		return -1;
+	}
+	else
+	{
+		printf("ubifs_status.fs_status          = %d \n",	ubifs_status.fs_status);
+		printf("ubifs_status.fs_mtd_name        = %s \n",	ubifs_status.fs_mtd_name);
+		printf("ubifs_status.fs_ubi_vol_name    = %s \n",	ubifs_status.fs_ubi_vol_name);
+
+		return 0;
+	}
+}
+
+
+static int excute_command_set_ubifs_status(char *option_para)
+{
+	T_UBIFS_STATUS ubifs_status = {0};
+
+	char fs_mtd_name[16] = "mtdName";
+	char fs_ubi_vol_name[16] = "volName";
+
+	ubifs_status.fs_status = 2;
+	strncpy(ubifs_status.fs_mtd_name, fs_mtd_name, sizeof(ubifs_status.fs_mtd_name));
+	strncpy(ubifs_status.fs_ubi_vol_name, fs_ubi_vol_name, sizeof(ubifs_status.fs_ubi_vol_name));
+
+	if (flags_set_ubifs_status(&ubifs_status) != 0)
+	{
+		printf("Err: set ubifs status fail \n");
+		
+		return -1;
+	}
+	else
+	{
+		printf("Log: set ubifs status success \n");
+		
+		return 0;
+	}
+}
+
+
+/*******************************************************************************
+ *                       Global function declarations                          *
+ ******************************************************************************/
+int main(int argc, char *argv[])
+{
+    int i				= 0;
+    int option_index	= 0;
+    int cmd_num		= 0;
+
+    int ret			= -1;
+    int ch			= -1;
+
+    printf("Log: build date: %s %s \n", __DATE__, __TIME__);
+
+    while ((ch = getopt_long(argc, argv, g_short_string, g_long_options, &option_index)) != -1)
+    {
+        for (i = 0; i < sizeof(g_option_handle) / sizeof(option_handle_t); i++)
+        {
+            if (ch != g_option_handle[i].option_value)
+            {
+                continue;
+            }
+
+            cmd_num++;
+
+            if (NULL == g_option_handle[i].func)
+            {
+                printf("Err: command short string is: %c, but option handle func is NULL \n", ch);
+                break;
+            }
+
+            ret = g_option_handle[i].func(optarg);
+            if (ret < 0)
+            {
+                ret = -1;
+                goto end;
+            }
+        }
+    }
+
+    if (0 == cmd_num)
+    {
+        printf("Err: can not find valid command \n");
+        usage();
+        ret = -1;
+        goto end;
+    }
+
+    ret = 0;
+
+end:
+    return ret ;
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fota_upi_ab/src/main.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fota_upi_ab/src/main.c
index e5f04dd..e70606f 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fota_upi_ab/src/main.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fota_upi_ab/src/main.c
@@ -78,6 +78,7 @@
 static int execute_command_get_sync_status(char * option_para);
 static int execute_command_set_sync_status(char * option_para);
 static int execute_command_config_package_path(char * option_para);
+static int execute_command_config_log_path(char * option_para);
 
 
 /*******************************************************************************
@@ -86,7 +87,7 @@
 
 /*----------Command parser begin---------------------------------------------------------*/
 
-static char * g_short_string = "u:cgb:sio:t:qr:hvypne:a:";
+static char * g_short_string = "u:cgb:sio:t:qr:hvypne:a:l:";
 
 static struct option g_long_options[] =
 {
@@ -107,6 +108,7 @@
     {"get-sync-status",		no_argument,			NULL,	'n'},
     {"set-sync-status",		required_argument,		NULL,	'e'},
     {"config-package-path",		required_argument,		NULL,	'a'},
+    {"config-log-path",		required_argument,		NULL,	'l'},
     {0, 0, 0, 0}
 };
 
@@ -128,7 +130,8 @@
     {'p',		execute_command_get_upgrade_type},
     {'n',		execute_command_get_sync_status},
     {'e',		execute_command_set_sync_status},
-    {'a',		execute_command_config_package_path}
+    {'a',		execute_command_config_package_path},
+    {'l',		execute_command_config_log_path}
 };
 
 
@@ -162,7 +165,8 @@
            "  -p,  --get-upgrade-type      get upgrade type \n"
            "  -n,  --get-sync-status       get sync status \n"
            "  -e,  --set-sync-status       set sync status \n"
-           "  -a,  --config-package-path   config package path \n");
+           "  -a,  --config-package-path   config package path \n"
+           "  -l,  --config-log-path       config log path \n");
 }
 
 z_upgrade_status_info_t g_upgrade_status;
@@ -474,6 +478,28 @@
 }
 
 
+static int execute_command_config_log_path(char * option_para)
+{
+    if (NULL == option_para)
+    {
+        printf("Invalid command input: NULL option parameters \n");
+        usage();
+
+        return -1;
+    }
+
+    if (-1 == zxic_dual_config_log_path(option_para, strlen(option_para)))
+    {
+        printf("Configure log path fail \n");
+        return -1;
+    }
+
+    printf("Configure log path success \n");
+
+    return 0;
+}
+
+
 /*----------Command parser function end---------------------------------------------------*/
 
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/Makefile
index c4f5c71..8df6ccd 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/Makefile
@@ -11,7 +11,7 @@
 
 
 #LDLIBS = -lpthread -lm
-LDLIBS += -lnvram -lmtd
+LDLIBS += -lnvram -lmtd -lflags
 #LDLIBS += -lsoftap -L$(zte_lib_path)/libsoftap
 #LDLIBS  += -lsofttimer -L$(zte_lib_path)/libsofttimer
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/dictionary.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/dictionary.c
old mode 100644
new mode 100755
index aa3d232..99fb8ab
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/dictionary.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/dictionary.c
@@ -378,3 +378,4 @@
     }
     return ;
 }
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/dictionary.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/dictionary.h
old mode 100644
new mode 100755
index f0fd540..5a9d27b
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/dictionary.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/dictionary.h
@@ -171,3 +171,4 @@
 #endif
 
 #endif
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/fscheck.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/fscheck.c
index 9bcc8a3..442c4df 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/fscheck.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/fscheck.c
@@ -1,367 +1,446 @@
-#include <stdio.h>

-#include <stdlib.h>

-#include <assert.h>

-#include <string.h>

-#include <unistd.h>

-#include "iniparser.h"

-#include "fscheck.h"

-//#include "pub_flags.h"

-#include "mtd_api.h"

-

-/*******************************************************************************

- *                                   宏定义                                     *

- *******************************************************************************/

-#define MAX_INI_SEC_NUM             (10)

-#define MAX_INI_SEC_LEN             (32)

-#define MAX_INI_KEY_LEN             (64)

-#define MAX_INI_VAL_LEN             (1024)

-#define MAX_INI_ATTR_LEN            (256)

-#define MAX_FS_INFO_FILE_NUM        (10)

-#define MAX_FILE_NAME_LEN           (64)

-#define RET_INI_INVALID_KEY_STR     (NULL)

-#define RET_INI_INVALID_KEY_INT     (-1)

-#define STR_PATITION_NAME           ("patition_name")

-#define STR_MTD_INDEX               ("mtd_index")

-#define STR_UBI_VOL_NAME            ("ubi_vol_name")

-#define STR_UBI_NEED_ATTACH         ("ubi_need_attach")

-#define STR_MOUNT_POINT             ("mount_point")

-#define STR_IMAGE_FILE              ("image_file")

-#define STR_FS_TYPE                 ("fs_type")

-#define STR_MOUNT_OPT               ("mount_opt")

-#define STR_SH_CMD                  ("sh_cmd")

-#define STR_FILE                    ("file")

-/*******************************************************************************

- *                                枚举结构体定义                                 *

- *******************************************************************************/

-enum ATTR_FS_INFO

-{

-    FS_INFO_PATITION_NAME = 0,

-    FS_INFO_MTD_INDEX,

-    FS_INFO_UBI_VOL_NAME,

-    FS_INFO_UBI_NEED_ATTACH,

-    FS_INFO_MOUNT_POINT,

-    FS_INFO_IMAGE_FILE,

-    FS_INFO_FS_TYPE,

-    FS_INFO_MOUNT_OPT,

-    FS_INFO_SH_CMD,

-    FS_INFO_FILE,

-    FS_INFO_END

-};

-/*******************************************************************************

- *                                全局变量定义                                   *

- *******************************************************************************/

-static int s_check_file_num[MAX_INI_SEC_NUM] = {0};

-static char s_ini_file_name[MAX_FILE_NAME_LEN] = {0};

-static char s_file_name[MAX_INI_SEC_NUM][MAX_FS_INFO_FILE_NUM][MAX_FILE_NAME_LEN] = {0};

-static struct mtd_fs fs_array[MAX_INI_SEC_NUM] = {0};

-/*******************************************************************************

- *                                外部引用函数                                   *

- *******************************************************************************/

-extern int mount_fs_partition(struct mtd_fs *p_fs);

-extern int unmount_fs_partition(struct mtd_fs *p_fs);

-extern int check_file_is_normal(const char *pFile);

-extern int wipe_out_vol_ubi(struct mtd_fs *p_fs);

-

-/*******************************************************************************

- *                                内部函数                                   *

- *******************************************************************************/

-static const char *getVal_string(const dictionary *d, const char *sec_name, const char *key_name);

-static int getVal_int(const dictionary *d, const char *sec_name, const char *key_name);

-static int getVal(const dictionary *d, const char *sec_name, int index, int secIndex);

-static int getValToArray(const dictionary *d);

-/**************************************************************************

-* 函数名称: getVal_string

-* 功能描述: 获取ini文件与key关联的字符串

-* 参数说明: (IN)

-*            d:             dictionary结构体指针

-*            sec_name:      ini文件section名

-*            key_name:     ini文件key名

-*            (OUT)

-* 返 回 值:成功返回value字符串, 否则返回 RET_INI_INVALID_KEY_STR

-* 其它说明:

-**************************************************************************/

-static const char *getVal_string(const dictionary *d, const char *sec_name, const char *key_name)

-{

-    const char *sval;

-    char buf[MAX_INI_KEY_LEN] = {0};

-

-    if (sec_name)

-    {

-        sprintf(buf, "%s:%s", sec_name, key_name);

-    }

-    else

-    {

-        sprintf(buf, ":%s", key_name);

-    }

-    sval = iniparser_getstring(d, buf, RET_INI_INVALID_KEY_STR);

-    return sval;

-}

-/**************************************************************************

-* 函数名称: getVal_int

-* 功能描述: 获取ini文件与key关联的int整型

-* 参数说明: (IN)

-*            d:             dictionary结构体指针

-*            sec_name:      ini文件section名

-*            key_name:     ini文件key名

-*            (OUT)

-* 返 回 值:成功返回int型value, 否则返回 RET_INI_INVALID_KEY_INT

-* 其它说明:

-**************************************************************************/

-static int getVal_int(const dictionary *d, const char *sec_name, const char *key_name)

-{

-    char buf[MAX_INI_KEY_LEN] = {0};

-

-    if (sec_name)

-    {

-        sprintf(buf, "%s:%s", sec_name, key_name);

-    }

-    else

-    {

-        sprintf(buf, ":%s", key_name);

-    }

-    return iniparser_getint(d, buf, RET_INI_INVALID_KEY_INT);

-}

-/**************************************************************************

-* 函数名称: getVal

-* 功能描述: 获取ini文件与key关联的value,并存入结构体成员

-* 参数说明: (IN)

-*            d:             dictionary结构体指针

-*            sec_name:      ini文件section名

-*            index:        结构体成员对应枚举序号

-*            secIndex:     ini文件section序号

-*            (OUT)

-* 返 回 值:成功返回0

-* 其它说明:

-**************************************************************************/

-static int getVal(const dictionary *d, const char *sec_name, int index, int secIndex)

-{

-    const char *strVal;

-    int val;

-    int file_num = 0;

-    char file_name_total[MAX_INI_VAL_LEN];

-

-    switch (index)

-    {

-    case FS_INFO_PATITION_NAME:

-        strVal = getVal_string(d, sec_name, STR_PATITION_NAME);

-        if (strVal)

-        {

-            strncpy(fs_array[secIndex].patition_name, strVal, sizeof(fs_array[secIndex].patition_name) - 1);

-        }

-        break;

-    case FS_INFO_MTD_INDEX:

-        fs_array[secIndex].mtd_index = -1;

-        break;

-    case FS_INFO_UBI_VOL_NAME:

-        strVal = getVal_string(d, sec_name, STR_UBI_VOL_NAME);

-        if (strVal)

-        {

-            strncpy(fs_array[secIndex].ubi_vol_name, strVal, sizeof(fs_array[secIndex].ubi_vol_name) - 1);

-        }

-        break;

-    case FS_INFO_UBI_NEED_ATTACH:

-        val = getVal_int(d, sec_name, STR_UBI_NEED_ATTACH);

-        fs_array[secIndex].ubi_need_attach = val;

-        break;

-    case FS_INFO_MOUNT_POINT:

-        strVal = getVal_string(d, sec_name, STR_MOUNT_POINT);

-        if (strVal)

-        {

-            strncpy(fs_array[secIndex].mount_point, strVal, sizeof(fs_array[secIndex].mount_point) - 1);

-        }

-        break;

-    case FS_INFO_IMAGE_FILE:

-        strVal = getVal_string(d, sec_name, STR_IMAGE_FILE);

-        if (strVal)

-        {

-            strncpy(fs_array[secIndex].image_file, strVal, sizeof(fs_array[secIndex].image_file) - 1);

-        }

-        break;

-    case FS_INFO_FS_TYPE:

-        strVal = getVal_string(d, sec_name, STR_FS_TYPE);

-        if (strVal)

-        {

-            strncpy(fs_array[secIndex].fs_type, strVal, sizeof(fs_array[secIndex].fs_type) - 1);

-        }

-        break;

-    case FS_INFO_MOUNT_OPT:

-        strVal = getVal_string(d, sec_name, STR_MOUNT_OPT);

-        if (strVal)

-        {

-            strncpy(fs_array[secIndex].mount_opt, strVal, sizeof(fs_array[secIndex].mount_opt) - 1);

-        }

-        break;

-    case FS_INFO_SH_CMD:

-        strVal = getVal_string(d, sec_name, STR_SH_CMD);

-        if (strVal)

-        {

-            strncpy(fs_array[secIndex].sh_cmd, strVal, sizeof(fs_array[secIndex].sh_cmd) - 1);

-        }

-        break;

-    case FS_INFO_FILE:

-        strVal = getVal_string(d, sec_name, STR_FILE);

-        if (strVal)

-        {

-            strncpy(file_name_total, strVal, sizeof(file_name_total) - 1);

-            char *p = strtok(file_name_total, " ");

-            while(p)

-            {

-                strncpy(s_file_name[secIndex][file_num], p, sizeof(s_file_name[file_num]) - 1);

-                fs_array[secIndex].file[file_num] = (char *)s_file_name[secIndex][file_num];

-                printf("fs_check: getVal, secIndex = %d, file[%d]:[%s]\n",secIndex, file_num, fs_array[secIndex].file[file_num]);

-                p = strtok(NULL," ");

-                file_num++;

-                if(file_num >= MAX_FS_INFO_FILE_NUM)

-                {

-                    break;

-                }

-            }

-            s_check_file_num[secIndex] = file_num;

-        }

-        break;

-    default:

-        printf("fscheck: getVal, index is not exist, %d\n", index);

-        break;

-    }

-

-    return 0;

-}

-/**************************************************************************

-* 函数名称: getValToArray

-* 功能描述: 获取ini文件value到结构体数组

-* 参数说明: (IN)

-*            d:             dictionary结构体指针

-*            (OUT)

-* 返 回 值:成功返回section个数, 否则返回-1

-* 其它说明:

-**************************************************************************/

-static int getValToArray(const dictionary *d)

-{

-    int i;

-    enum ATTR_FS_INFO attr;

-    int nsec;

-    const char *secname;

-

-    if (d == NULL)

-    {

-        printf("[fscheck]: getValToArray, d is NULL\n");

-        return -1;

-    }

-    nsec = iniparser_getnsec(d);

-    if (nsec < 1)

-    {

-        for (attr = FS_INFO_PATITION_NAME; attr < FS_INFO_END; attr++)

-        {

-            getVal(d, NULL, attr, 0);

-        }

-        nsec = 1;

-    }

-

-    for (i = 0; i < nsec; i++)

-    {

-        secname = iniparser_getsecname(d, i);

-        if(secname == NULL)

-        {

-            printf("[fscheck]: getValToArray, secname is NULL\n");

-            return -1;

-        }

-        for (attr = FS_INFO_PATITION_NAME; attr < FS_INFO_END; attr++)

-        {

-            getVal(d, secname, attr, i);

-        }

-    }

-    return nsec;

-}

-

-int main(int argc, char *argv[])

-{

-

-    int i,j;

-    int ch;

-    int ret;

-    int result = 0;

-    dictionary *ini;

-    int fs_cnt;

-    

-    while ((ch = getopt(argc, argv, "hf:")) != -1)

-    {

-        switch (ch)

-        {

-            case 'f':

-                strncpy(s_ini_file_name, optarg, MAX_FILE_NAME_LEN - 1);

-                printf("[fscheck]: -f, s_ini_file_name = %s\n", s_ini_file_name);

-                break;

-            default:

-                printf("-h, help\n");

-                printf("-f ini_filename\n");

-                return 0;

-        }

-    }

-

-    ini = iniparser_load(s_ini_file_name);

-    fs_cnt = getValToArray(ini);

-    if(fs_cnt < 0)

-    {

-        assert(0);

-    }

-    iniparser_freedict(ini);

-    

-    //normal版本文件系统挂载

-    for (i = 0; i < fs_cnt; i++)

-    {

-        printf("fs_check mount_fs_partition begin\n");

-        ret = mount_fs_partition(&fs_array[i]);

-        if(ret)

-        {

-            unmount_fs_partition(&fs_array[i]);

-            mtd_erase_partition(fs_array[i].patition_name);

-            printf("fs_check mtd_erase %s\n", fs_array[i].patition_name);

-            ret = mtd_write_partition(fs_array[i].patition_name, fs_array[i].image_file);

-            printf("fs_check mtd_write %s ret = %d\n", fs_array[i].patition_name, ret);

-            ret = mount_fs_partition(&fs_array[i]);

-            if(ret)

-                assert(0);

-        }

-        else

-        {

-            //挂载成功后检查文件是否被破坏,如果破坏则恢复

-            for(j = 0; j < s_check_file_num[i]; j++)

-            {

-                result = check_file_is_normal(fs_array[i].file[j]);

-                if(result < 0)

-                {

-                    printf("fs_check: check_file_is_normal failed, fs_array[%d].file[%d] = %s\n", i, j, fs_array[i].file[j]);

-                    break;

-                }

-            }

-            if(result)

-            {

-                unmount_fs_partition(&fs_array[i]);

-

-                if (strcmp(fs_array[i].fs_type, "jffs2") == 0)

-                {

-                    mtd_erase_partition(fs_array[i].patition_name);

-                    printf("fs_check mtd_erase %s\n", fs_array[i].patition_name);

-                    ret = mtd_write_partition(fs_array[i].patition_name, fs_array[i].image_file);

-                    printf("fs_check mtd_write %s ret = %d\n", fs_array[i].patition_name, ret);

-                }

-                else if (strcmp(fs_array[i].fs_type, "ubifs") == 0)

-                {

-                    wipe_out_vol_ubi(&fs_array[i]);

-                }

-

-                ret = mount_fs_partition(&fs_array[i]);

-                if(ret)

-                    assert(0);

-#if 0

-                if (flags_set_fs_status(0) < 0)

-                    assert(0);

-                printf("fs_check set flag filesystem normal");

-#endif

-            }

-        }

-        printf("fs_check mount %s success!\n", fs_array[i].patition_name);

-    }

-

-    return 0;

-}

+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <unistd.h>
+#include "iniparser.h"
+#include "fscheck.h"
+#include "pub_flags.h"
+#include "flags_api.h"
+
+/*******************************************************************************
+ *                                   宏定义                                     *
+ *******************************************************************************/
+#define MAX_INI_SEC_NUM             (10)
+#define MAX_INI_SEC_LEN             (32)
+#define MAX_INI_KEY_LEN             (64)
+#define MAX_INI_VAL_LEN             (1024)
+#define MAX_INI_ATTR_LEN            (256)
+#define MAX_FS_INFO_FILE_NUM        (10)
+#define MAX_FILE_NAME_LEN           (64)
+#define RET_INI_INVALID_KEY_STR     (NULL)
+#define RET_INI_INVALID_KEY_INT     (-1)
+#define STR_PATITION_NAME           ("patition_name")
+#define STR_MTD_INDEX               ("mtd_index")
+#define STR_UBI_VOL_NAME            ("ubi_vol_name")
+#define STR_UBI_NEED_ATTACH         ("ubi_need_attach")
+#define STR_MOUNT_POINT             ("mount_point")
+#define STR_IMAGE_FILE              ("image_file")
+#define STR_FS_TYPE                 ("fs_type")
+#define STR_MOUNT_OPT               ("mount_opt")
+#define STR_SH_CMD                  ("sh_cmd")
+#define STR_FILE                    ("file")
+/*******************************************************************************
+ *                                枚举结构体定义                                 *
+ *******************************************************************************/
+enum ATTR_FS_INFO
+{
+    FS_INFO_PATITION_NAME = 0,
+    FS_INFO_MTD_INDEX,
+    FS_INFO_UBI_VOL_NAME,
+    FS_INFO_UBI_NEED_ATTACH,
+    FS_INFO_MOUNT_POINT,
+    FS_INFO_IMAGE_FILE,
+    FS_INFO_FS_TYPE,
+    FS_INFO_MOUNT_OPT,
+    FS_INFO_SH_CMD,
+    FS_INFO_FILE,
+    FS_INFO_END
+};
+/*******************************************************************************
+ *                                全局变量定义                                   *
+ *******************************************************************************/
+static int s_check_file_num[MAX_INI_SEC_NUM] = {0};
+static char s_ini_file_name[MAX_FILE_NAME_LEN] = {0};
+static char s_file_name[MAX_INI_SEC_NUM][MAX_FS_INFO_FILE_NUM][MAX_FILE_NAME_LEN] = {0};
+static struct mtd_fs fs_array[MAX_INI_SEC_NUM] = {0};
+T_UBIFS_STATUS fs_stat;
+/*******************************************************************************
+ *                                外部引用函数                                   *
+ *******************************************************************************/
+extern int mount_fs_partition(struct mtd_fs *p_fs);
+extern int attach_mtd_partition(struct mtd_fs *p_fs);
+extern int detach_mtd_partition(struct mtd_fs *p_fs);
+extern int mtd_erase_partition(const char* partition_name);
+extern int mtd_write_partition(const char* partition_name, const char* image_file);
+extern int unmount_fs_partition(struct mtd_fs *p_fs);
+extern int check_file_is_normal(const char *pFile);
+extern int wipe_out_vol_ubi(struct mtd_fs *p_fs);
+
+/*******************************************************************************
+ *                                内部函数                                   *
+ *******************************************************************************/
+static const char *getVal_string(const dictionary *d, const char *sec_name, const char *key_name);
+static int getVal_int(const dictionary *d, const char *sec_name, const char *key_name);
+static int getVal(const dictionary *d, const char *sec_name, int index, int secIndex);
+static int getValToArray(const dictionary *d);
+/**************************************************************************
+* 函数名称: getVal_string
+* 功能描述: 获取ini文件与key关联的字符串
+* 参数说明: (IN)
+*            d:             dictionary结构体指针
+*            sec_name:      ini文件section名
+*            key_name:     ini文件key名
+*            (OUT)
+* 返 回 值:成功返回value字符串, 否则返回 RET_INI_INVALID_KEY_STR
+* 其它说明:
+**************************************************************************/
+static const char *getVal_string(const dictionary *d, const char *sec_name, const char *key_name)
+{
+    const char *sval;
+    char buf[MAX_INI_KEY_LEN] = {0};
+
+    if (sec_name)
+    {
+        sprintf(buf, "%s:%s", sec_name, key_name);
+    }
+    else
+    {
+        sprintf(buf, ":%s", key_name);
+    }
+    sval = iniparser_getstring(d, buf, RET_INI_INVALID_KEY_STR);
+    return sval;
+}
+/**************************************************************************
+* 函数名称: getVal_int
+* 功能描述: 获取ini文件与key关联的int整型
+* 参数说明: (IN)
+*            d:             dictionary结构体指针
+*            sec_name:      ini文件section名
+*            key_name:     ini文件key名
+*            (OUT)
+* 返 回 值:成功返回int型value, 否则返回 RET_INI_INVALID_KEY_INT
+* 其它说明:
+**************************************************************************/
+static int getVal_int(const dictionary *d, const char *sec_name, const char *key_name)
+{
+    char buf[MAX_INI_KEY_LEN] = {0};
+
+    if (sec_name)
+    {
+        sprintf(buf, "%s:%s", sec_name, key_name);
+    }
+    else
+    {
+        sprintf(buf, ":%s", key_name);
+    }
+    return iniparser_getint(d, buf, RET_INI_INVALID_KEY_INT);
+}
+/**************************************************************************
+* 函数名称: getVal
+* 功能描述: 获取ini文件与key关联的value,并存入结构体成员
+* 参数说明: (IN)
+*            d:             dictionary结构体指针
+*            sec_name:      ini文件section名
+*            index:        结构体成员对应枚举序号
+*            secIndex:     ini文件section序号
+*            (OUT)
+* 返 回 值:成功返回0
+* 其它说明:
+**************************************************************************/
+static int getVal(const dictionary *d, const char *sec_name, int index, int secIndex)
+{
+    const char *strVal;
+    int val;
+    int file_num = 0;
+    char file_name_total[MAX_INI_VAL_LEN];
+
+    switch (index)
+    {
+    case FS_INFO_PATITION_NAME:
+        strVal = getVal_string(d, sec_name, STR_PATITION_NAME);
+        if (strVal)
+        {
+            strncpy(fs_array[secIndex].patition_name, strVal, sizeof(fs_array[secIndex].patition_name) - 1);
+        }
+        break;
+    case FS_INFO_MTD_INDEX:
+        fs_array[secIndex].mtd_index = -1;
+        break;
+    case FS_INFO_UBI_VOL_NAME:
+        strVal = getVal_string(d, sec_name, STR_UBI_VOL_NAME);
+        if (strVal)
+        {
+            strncpy(fs_array[secIndex].ubi_vol_name, strVal, sizeof(fs_array[secIndex].ubi_vol_name) - 1);
+        }
+        break;
+    case FS_INFO_UBI_NEED_ATTACH:
+        val = getVal_int(d, sec_name, STR_UBI_NEED_ATTACH);
+        fs_array[secIndex].ubi_need_attach = val;
+        break;
+    case FS_INFO_MOUNT_POINT:
+        strVal = getVal_string(d, sec_name, STR_MOUNT_POINT);
+        if (strVal)
+        {
+            strncpy(fs_array[secIndex].mount_point, strVal, sizeof(fs_array[secIndex].mount_point) - 1);
+        }
+        break;
+    case FS_INFO_IMAGE_FILE:
+        strVal = getVal_string(d, sec_name, STR_IMAGE_FILE);
+        if (strVal)
+        {
+            strncpy(fs_array[secIndex].image_file, strVal, sizeof(fs_array[secIndex].image_file) - 1);
+        }
+        break;
+    case FS_INFO_FS_TYPE:
+        strVal = getVal_string(d, sec_name, STR_FS_TYPE);
+        if (strVal)
+        {
+            strncpy(fs_array[secIndex].fs_type, strVal, sizeof(fs_array[secIndex].fs_type) - 1);
+        }
+        break;
+    case FS_INFO_MOUNT_OPT:
+        strVal = getVal_string(d, sec_name, STR_MOUNT_OPT);
+        if (strVal)
+        {
+            strncpy(fs_array[secIndex].mount_opt, strVal, sizeof(fs_array[secIndex].mount_opt) - 1);
+        }
+        break;
+    case FS_INFO_SH_CMD:
+        strVal = getVal_string(d, sec_name, STR_SH_CMD);
+        if (strVal)
+        {
+            strncpy(fs_array[secIndex].sh_cmd, strVal, sizeof(fs_array[secIndex].sh_cmd) - 1);
+        }
+        break;
+    case FS_INFO_FILE:
+        strVal = getVal_string(d, sec_name, STR_FILE);
+        if (strVal)
+        {
+            strncpy(file_name_total, strVal, sizeof(file_name_total) - 1);
+            char *p = strtok(file_name_total, " ");
+            while(p)
+            {
+                strncpy(s_file_name[secIndex][file_num], p, sizeof(s_file_name[file_num]) - 1);
+                fs_array[secIndex].file[file_num] = (char *)s_file_name[secIndex][file_num];
+                printf("cap_fscheck: getVal, secIndex = %d, file[%d]:[%s]\n",secIndex, file_num, fs_array[secIndex].file[file_num]);
+                p = strtok(NULL," ");
+                file_num++;
+                if(file_num >= MAX_FS_INFO_FILE_NUM)
+                {
+                    break;
+                }
+            }
+            s_check_file_num[secIndex] = file_num;
+        }
+        break;
+    default:
+        printf("cap_fscheck: getVal, index is not exist, %d\n", index);
+        break;
+    }
+
+    return 0;
+}
+/**************************************************************************
+* 函数名称: getValToArray
+* 功能描述: 获取ini文件value到结构体数组
+* 参数说明: (IN)
+*            d:             dictionary结构体指针
+*            (OUT)
+* 返 回 值:成功返回section个数, 否则返回-1
+* 其它说明:
+**************************************************************************/
+static int getValToArray(const dictionary *d)
+{
+    int i;
+    enum ATTR_FS_INFO attr;
+    int nsec;
+    const char *secname;
+
+    if (d == NULL)
+    {
+        printf("cap_fscheck: getValToArray, d is NULL\n");
+        return -1;
+    }
+    nsec = iniparser_getnsec(d);
+    if (nsec < 1)
+    {
+        for (attr = FS_INFO_PATITION_NAME; attr < FS_INFO_END; attr++)
+        {
+            getVal(d, NULL, attr, 0);
+        }
+        nsec = 1;
+    }
+
+    for (i = 0; i < nsec; i++)
+    {
+        secname = iniparser_getsecname(d, i);
+        if(secname == NULL)
+        {
+            printf("cap_fscheck: getValToArray, secname is NULL\n");
+            return -1;
+        }
+        for (attr = FS_INFO_PATITION_NAME; attr < FS_INFO_END; attr++)
+        {
+            getVal(d, secname, attr, i);
+        }
+    }
+    return nsec;
+}
+
+int main(int argc, char *argv[])
+{
+
+    int i,j;
+    int times, failreson;
+    int ch;
+    int ret;
+    int result = 0;
+    dictionary *ini;
+    int fs_cnt;
+    
+    while ((ch = getopt(argc, argv, "hf:")) != -1)
+    {
+        switch (ch)
+        {
+            case 'f':
+                strncpy(s_ini_file_name, optarg, MAX_FILE_NAME_LEN - 1);
+                printf("fscheck -f %s\n", s_ini_file_name);
+                break;
+            default:
+                printf("-h, help\n");
+                printf("-f ini_filename\n");
+                return 0;
+        }
+    }
+
+    // 配置文件在/etc_ro/fscheck/userdata.ini,只读路径下,确保不会被破坏
+    ini = iniparser_load(s_ini_file_name);
+    fs_cnt = getValToArray(ini);
+    if(fs_cnt < 0)
+    {
+        assert(0);
+    }
+    iniparser_freedict(ini);
+
+    ret = flags_get_ubifs_status(&fs_stat);
+    printf("cap_fscheck: get fs_status: %d, fs_mtd_name: %s, fs_ubi_vol_name: %s\n", \
+            fs_stat.fs_status, fs_stat.fs_mtd_name, fs_stat.fs_ubi_vol_name);
+    fflush(stdout);
+    if(ret < 0)
+        assert(0);
+    
+    //normal版本文件系统挂载
+    for (i = 0; i < fs_cnt; i++)
+    {
+        times = 0;
+        failreson = 0;
+        // 指定mtd分区异常,进行mtd分区擦除,恢复,重写flags分区
+        if ((fs_stat.fs_status) && (strcmp(fs_stat.fs_mtd_name, fs_array[i].patition_name) == 0) \
+            && (strcmp(fs_stat.fs_ubi_vol_name, "") == 0))
+        {
+            ret = mtd_erase_partition(fs_array[i].patition_name);
+            printf("cap_fscheck mtd_erase %s ret = %d\n", fs_array[i].patition_name, ret);
+            if (ret < 0)
+                assert(0);
+            ret = mtd_write_partition(fs_array[i].patition_name, fs_array[i].image_file);
+            printf("cap_fscheck mtd_write %s ret = %d\n", fs_array[i].patition_name, ret);
+            if (ret < 0)
+                assert(0);
+            memset(&fs_stat, 0, sizeof(fs_stat));
+            ret = flags_set_ubifs_status(&fs_stat);
+            if (ret < 0)
+                assert(0);
+        }
+retry:
+        if (times >= 1)
+        {
+            if (times == 2)
+            {
+                memcpy(fs_stat.fs_mtd_name, fs_array[i].patition_name, sizeof(fs_stat.fs_mtd_name));
+                memcpy(fs_stat.fs_ubi_vol_name, "", sizeof(fs_stat.fs_ubi_vol_name));
+                fs_stat.fs_status = 1;
+                ret = flags_set_ubifs_status(&fs_stat);
+                printf("cap_fscheck mount the %dth mtd partion %s fail and need reboot!\n", i, fs_array[i].patition_name);
+                fflush(stdout);
+                assert(0);
+            }
+
+            if (failreson == 1)
+            {
+                ret = mtd_erase_partition(fs_array[i].patition_name);
+                printf("cap_fscheck mtd_erase %s ret = %d\n", fs_array[i].patition_name, ret);
+                if (ret < 0)
+                    assert(0);
+                ret = mtd_write_partition(fs_array[i].patition_name, fs_array[i].image_file);
+                printf("cap_fscheck mtd_write %s ret = %d\n", fs_array[i].patition_name, ret);
+                if (ret < 0)
+                    assert(0);
+            }
+            else if ((failreson == 2) || (failreson == 3))
+            {
+                if (failreson == 3)
+                {
+                    ret = unmount_fs_partition(&fs_array[i]);
+                    printf("cap_fscheck unmount %s ret = %d\n", fs_array[i].mount_point, ret);
+                }
+                if (strcmp(fs_array[i].fs_type, "jffs2") == 0)
+                {
+                    ret = mtd_erase_partition(fs_array[i].patition_name);
+                    printf("cap_fscheck mtd_erase %s ret = %d\n", fs_array[i].patition_name, ret);
+                    if (ret < 0)
+                        assert(0);
+                    ret = mtd_write_partition(fs_array[i].patition_name, fs_array[i].image_file);
+                    printf("cap_fscheck mtd_write %s ret = %d\n", fs_array[i].patition_name, ret);
+                    if (ret < 0)
+                        assert(0);
+                }
+                else if (strcmp(fs_array[i].fs_type, "ubifs") == 0)
+                {
+                    ret = wipe_out_vol_ubi(&fs_array[i]);
+                    printf("cap_fscheck wipe out vol %s ret = %d\n", fs_array[i].ubi_vol_name, ret);
+                }
+            }
+        }
+
+        // attach
+        if ((fs_array[i].ubi_need_attach == 1) && (strcmp(fs_array[i].fs_type, "ubifs") == 0))
+        {
+            ret = attach_mtd_partition(&fs_array[i]);
+            if (ret)
+            {
+                failreson = 1;
+                times++;
+                goto retry;
+            }
+        }
+
+        // 如果卷异常,需要单独擦除卷
+        if ((fs_stat.fs_status) && (strcmp(fs_stat.fs_mtd_name, fs_array[i].patition_name) == 0) \
+            && (strcmp(fs_stat.fs_ubi_vol_name, fs_array[i].ubi_vol_name) == 0))
+        {
+            
+            ret = wipe_out_vol_ubi(&fs_array[i]);
+            printf("cap_fscheck wipe out vol %s ret = %d\n", fs_array[i].ubi_vol_name, ret);
+            memset(&fs_stat, 0, sizeof(fs_stat));
+            ret = flags_set_ubifs_status(&fs_stat);
+            if (ret < 0)
+                assert(0);
+        }
+
+        // mount
+        ret = mount_fs_partition(&fs_array[i]);
+        if(ret)
+        {
+            failreson = 2;
+            times++;
+            goto retry;
+        }
+        
+        //检查文件
+        for(j = 0; j < s_check_file_num[i]; j++)
+        {
+            ret = check_file_is_normal(fs_array[i].file[j]);
+            if(ret < 0)
+            {
+                failreson = 3;
+                times++;
+                goto retry;
+            }
+        }
+        printf("cap_fscheck mount %s mtd_partion %s mount_point success!\n", fs_array[i].patition_name, fs_array[i].mount_point);
+    }
+
+    return 0;
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/fscheck.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/fscheck.h
old mode 100644
new mode 100755
index 133a409..bf954c8
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/fscheck.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/fscheck.h
@@ -1,29 +1,29 @@
 /*******************************************************************************
-* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 版权所有 (C)2016, 中兴通讯股份有限公司。
 * 
-* ÎļþÃû³Æ:     fs_check.h
-* Îļþ±êʶ:     fs_check.h
-* ÄÚÈÝÕªÒª:     nvºǫ́ӦÓÃÍ·Îļþ
-* ʹÓ÷½·¨:     #include <fs_check.h>
+* 文件名称:     fs_check.h
+* 文件标识:     fs_check.h
+* 内容摘要:     nv后台应用头文件
+* 使用方法:     #include <fs_check.h>
 * 
-* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* 修改日期        版本号      修改标记        修改人          修改内容
 * ------------------------------------------------------------------------------
-* 2016/09/20       V1.0        Create          ÍõÇæ          ´´½¨
+* 2016/09/20       V1.0        Create          王擎          创建
 * 
 *******************************************************************************/
 #ifndef _FS_CHECK_H
 #define _FS_CHECK_H
 
 /*******************************************************************************
-*                                   Í·Îļþ                                     *
+*                                   头文件                                     *
 *******************************************************************************/
 
 /*******************************************************************************
-*                                   ºê¶¨Òå                                     *
+*                                   宏定义                                     *
 *******************************************************************************/    
 
 /*******************************************************************************
-*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*                                数据类型定义                                  *
 *******************************************************************************/
 struct mtd_fs
 {
@@ -39,11 +39,11 @@
     char *file[10];
 };
 /*******************************************************************************
-*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *
+*                                全局变量声明                                  *
 *******************************************************************************/
 
 /*******************************************************************************
-*                                È«¾Öº¯ÊýÉùÃ÷                                  *
+*                                全局函数声明                                  *
 *******************************************************************************/
 
 #endif
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/iniparser.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/iniparser.c
old mode 100644
new mode 100755
index f1d1658..ac675f8
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/iniparser.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/iniparser.c
@@ -834,3 +834,4 @@
 {
     dictionary_del(d);
 }
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/iniparser.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/iniparser.h
old mode 100644
new mode 100755
index 37ff7b7..acb9576
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/iniparser.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/iniparser.h
@@ -356,3 +356,4 @@
 #endif
 
 #endif
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/mtd.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/mtd.c
index fdcc42b..74fff1e 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/mtd.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fscheck/mtd.c
@@ -1,685 +1,696 @@
-#ifndef _GNU_SOURCE

-#define _GNU_SOURCE

-#endif

-#include <stdio.h>

-#include <stdlib.h>

-#include <unistd.h>

-#include <string.h>

-#include <sys/types.h>

-#include <sys/stat.h>

-#include <fcntl.h>

-

-#include <mtd/mtd-abi.h>

-#include <errno.h>

-

-#include <sys/ioctl.h>

-#include "fscheck.h"

-#include "cfg_api.h"

-#include "mtd_api.h"

-

-/*******************************************************************************

- *                             Macro definitions                               *

- ******************************************************************************/

-#define MOUNTS_INFO_FILE                ("/proc/mounts")

-

-#define NV_FS_FAC_MAIN_PATH             ("/mnt/imagefs/nvrwall.bin")

-#define NV_FS_RW_HASH_FAC_PATH          ("/mnt/imagefs/nvrwall.hash")

-#define NV_FS_RW_HASH_WORK_PATH         ("/etc_rw/psnv/nvrwall.hash")

-#define NV_FS_RW_MAIN_PATH              ("/etc_rw/psnv/rw_work")

-#define NV_FS_RW_BACKUP_PATH            ("/etc_rw/psnv/rw_backup")

-#define NV_FS_FAC_SYMBOL_PATH           ("/etc_rw/psnv/fac_flag")

-#define NV_FS_RW_MAIN_SYMBOL_PATH       ("/etc_rw/psnv/work_flag")

-#define NV_FS_RW_BACKUP_SYMBOL_PATH     ("/etc_rw/psnv/backup_flag")

-

-#define NV_FS_RW_AP_NV_MAIN_PATH        ("/etc_rw/nv/main/cfg")

-#define NV_FS_RW_AP_NV_BACKUP_PATH      ("/etc_rw/nv/backup/cfg")

-

-#define MOUNTS_LINE_LEN                 (256)

-#define MOUNTS_LINE_ELEMENT_LEN         (64)

-#define MAX_PATH                        (256)

-#define BUF_MAX_LEN                     (32)

-#define UBI_DEV_MAX_NUM                 (10)

-#define SYSTEM_EXEC_FAIL                (0)

-#define SYSTEM_EXEC_SUCC                (1)

-#define FS_MAX_MOUNT_TIMES              (2)

-

-/*******************************************************************************

- *                                ÄÚ²¿º¯Êý                                   *

- *******************************************************************************/

-static int check_mount_result(const char *parti_mp);

-static int system_exec_status(int status);

-static int get_ubifs_device_num(int recv_mtdnum);

-static int get_vol_id(int ubi_num, char *vol_name);

-static int get_ubi_device_num(const char *dev_path, int *major_num, int *minor_num);

-static int check_ubi_device_is_char(const char *dev_path);

-static int mknod_ubi_device(void);

-

-static int check_mount_result(const char *parti_mp)

-{

-    char *line_p, *temp_p;

-    char line[MOUNTS_LINE_LEN] = {0};

-    char line_element[MOUNTS_LINE_ELEMENT_LEN] = {0};

-    int found;

-    FILE *fp = NULL;

-    int mp_str_len;

-    if (parti_mp == NULL)

-        return -1;

-    if ((fp = fopen(MOUNTS_INFO_FILE, "r")) == NULL) {

-        printf("fs_check fopen %s failed, error:%s\n", MOUNTS_INFO_FILE, strerror(errno));

-        goto error;

-    }

-

-    found = 0;

-    while (1) {

-        memset(line, 0, sizeof(line));

-        if (NULL == fgets(line, sizeof(line), fp)) {

-            break;

-        }

-        //upi_log("line: %s", line);

-        line_p = line;

-        while (*line_p != '\0' && *line_p != ' ') { // first element

-            line_p++;

-        }

-        line_p++;

-        memset(line_element, 0, sizeof(line_element));

-        temp_p = line_element;

-        while (*line_p != '\0' && *line_p != ' ') { // second element, this is what we need

-            *temp_p = *line_p;

-            temp_p++;

-

-            line_p++;

-        }

-        //upi_log("line_element: %s", line_element);

-        mp_str_len = strlen(parti_mp);

-        if (mp_str_len <= strlen(line_element)) {

-            if (strncmp(line_element + strlen(line_element) - mp_str_len, parti_mp, mp_str_len) == 0) {

-                found = 1;

-                break;

-            }

-        }

-    }

-    if (found == 0) {

-        printf("fs_check did not find any mount info about %s\n", parti_mp);

-        goto error;

-    }

-    if (NULL != fp)

-        fclose(fp);

-    return 0;

-error:

-    if (fp != NULL)

-        fclose(fp);

-    return -1;

-}

-

-static int system_exec_status(int status)

-{

-    if (-1 == status)

-        return SYSTEM_EXEC_FAIL;

-

-    if (!WIFEXITED(status))

-        return SYSTEM_EXEC_FAIL;

-

-    if (WEXITSTATUS(status))

-        return SYSTEM_EXEC_FAIL;

-    

-    return SYSTEM_EXEC_SUCC;

-}

-

-static int get_ubifs_device_num(int recv_mtdnum)

-{

-    int     vol_num     = -1;

-    int     fd_ubi        = -1;

-    int     ret            = -1;

-    int     mytmp        = 0;

-    int     add_len     = 10; 

-

-    struct  stat st        = {0};

-    

-    unsigned char read_buf[BUF_MAX_LEN] = {0};

-    unsigned char ubidev_path[MAX_PATH] = {0};

-

-    for (; mytmp < UBI_DEV_MAX_NUM; mytmp++)

-    {

-        snprintf(ubidev_path, sizeof(ubidev_path), "/sys/devices/virtual/ubi/ubi%d", mytmp);  

-        ret = stat(ubidev_path, &st);

-        if (ret < 0) {

-            printf("fs_check get stat info from error:%s\n", strerror(errno));        

-            break;

-        }

-        if (S_ISDIR(st.st_mode)) {

-            strncat(ubidev_path, "/mtd_num", add_len);

-            fd_ubi = open(ubidev_path, O_RDONLY);

-            if (fd_ubi < 0) {

-                printf("fs_check open file error:%s", strerror(errno));

-                break;

-            }

-            memset(read_buf, 0, sizeof(read_buf));

-            ret = read(fd_ubi, read_buf, sizeof(read_buf));

-            printf("fs_check get stat info from %s read num = %d\n", ubidev_path, atoi(read_buf));      

-            if (ret < 0) {

-                printf("fs_check get info from ubi error:%s\n", strerror(errno));

-                close(fd_ubi);

-                break;

-            }

-            if (atoi(read_buf) == recv_mtdnum) {

-                vol_num = mytmp;

-                close(fd_ubi);

-                break;

-            }

-            close(fd_ubi);

-        }

-    }

-

-    return vol_num;

-}

-

-static int get_vol_id(int ubi_num, char *vol_name)

-{

-    int     vol_id     = -1;

-    int     fd_ubi        = -1;

-    int     ret            = -1;

-    int     mytmp        = 0;

-    int     add_len     = 10; 

-

-    struct  stat st        = {0};

-    

-    unsigned char read_buf[BUF_MAX_LEN] = {0};

-    unsigned char ubidev_path[MAX_PATH] = {0};

-

-    for (; mytmp < UBI_DEV_MAX_NUM; mytmp++)

-    {

-        snprintf(ubidev_path, sizeof(ubidev_path), "/sys/devices/virtual/ubi/ubi%d/ubi%d_%d", ubi_num, ubi_num, mytmp);  

-        ret = stat(ubidev_path, &st);

-        if (ret < 0) {

-            printf("fs_check get stat info from error:%s\n", strerror(errno));        

-            break;

-        }

-        if (S_ISDIR(st.st_mode)) {

-            strncat(ubidev_path, "/name", add_len);

-            fd_ubi = open(ubidev_path, O_RDONLY);

-            if (fd_ubi < 0) {

-                printf("fs_check open file error:%s", strerror(errno));

-                break;

-            }

-            memset(read_buf, 0, sizeof(read_buf));

-            ret = read(fd_ubi, read_buf, sizeof(read_buf));

-            printf("fs_check get stat info from %s read vol_name=%s\n", ubidev_path, read_buf);      

-            if (ret < 0) {

-                printf("fs_check get info from ubi error:%s\n", strerror(errno));

-                close(fd_ubi);

-                break;

-            }

-            if (memcmp(read_buf, vol_name, strlen(vol_name)) == 0)

-            {

-                // find vol_name

-                vol_id = mytmp;

-                close(fd_ubi);

-                break;

-            }

-            close(fd_ubi);

-        }

-    }

-

-    return vol_id;

-}

-

-static int get_ubi_device_num(const char *dev_path, int *major_num, int *minor_num)

-{

-    struct  stat st        = {0};

-    int     fd_ubi         = -1;

-    int     ret            = -1;

-    

-    unsigned char read_buf[BUF_MAX_LEN] = {0};

-    char *sysubi_path = NULL;

-    if (dev_path == NULL)

-        return -1;

-    

-    sysubi_path = dev_path;

-    printf("fs_check get stat info from %s\n", sysubi_path);  

-    ret = stat(sysubi_path, &st);

-    if (ret < 0) {

-        printf("fs_check get stat info from error:%s\n", strerror(errno));        

-        return -1;

-    }

-    if (S_ISREG(st.st_mode)) {

-        fd_ubi = open(sysubi_path, O_RDONLY);

-            if (fd_ubi < 0) {

-                printf("fs_check open file error:%s", strerror(errno));

-                return -1;

-            }

-        memset(read_buf, 0, sizeof(read_buf));

-        ret = read(fd_ubi, read_buf, sizeof(read_buf));

-        printf("fs_check get stat info from %s read data = %s\n", sysubi_path, read_buf); 

-        sscanf(read_buf, "%d:%d", major_num, minor_num);

-        printf("fs_check get device num major_num: %d, minor_num: %d\n", *major_num, *minor_num); 

-        return 0;    

-    }

-    else

-    {

-        return -1;

-    }

-}

-

-static int check_ubi_device_is_char(const char *dev_path)

-{

-    struct  stat st        = {0};

-    int ret = -1;

-    if (dev_path == NULL)

-        return -1;

-    

-    ret = stat(dev_path, &st);

-    if (ret < 0) {

-        printf("fs_check get stat info from error:%s\n", strerror(errno));        

-        return -1;

-    }

-

-    if (!S_ISCHR(st.st_mode)) {

-        return -1;    

-    }

-    

-    return 0;

-}

-

-static int mknod_ubi_device(void)

-{

-    int mychar = 3;

-    char *ubi_array[] = {"ubi1", "ubi1_0", "ubi1_1"};

-    char ubi_dev[MAX_PATH] = {0};    // /dev/ubi1

-    char ubi_sys[MAX_PATH] = {0};    // /sys/class/ubi/ubi1/dev

-    int  ubi_major = -1;

-    int  ubi_minor = -1;

-    char mknod_cmd[MAX_PATH] = {0};   // mknod /dev/ubi1 c

-    int i , ret = 0;

-

-    for (i = 0; i < mychar; i++)

-    {

-        memset(ubi_dev, 0x0, sizeof(ubi_dev));

-        snprintf(ubi_dev, sizeof(ubi_dev), "/dev/%s", ubi_array[i]);	

-        printf("fs_check dev is %s\n", ubi_dev);	

-        // Èç¹û²»´æ ubi1£¬Ôò´´½¨ ubi1 É豸

-        if (check_ubi_device_is_char(ubi_dev) < 0)

-        {

-            memset(ubi_sys, 0x0, sizeof(ubi_sys));

-            ubi_major = -1;

-            ubi_minor = -1;

-            snprintf(ubi_sys, sizeof(ubi_sys), "/sys/class/ubi/%s/dev", ubi_array[i]);

-            printf("fscheck ubi sys is %s\n", ubi_sys);	

-            // »ñµÃÖ÷´ÎÉ豸ºÅ£¬Èç¹û»ñȡʧ°Ü£¬Ö±½Ó return

-            if ((get_ubi_device_num(ubi_sys, &ubi_major, &ubi_minor) < 0) || (ubi_minor < 0) || (ubi_minor < 0))

-                return -1;

-            memset(mknod_cmd, 0x0, sizeof(mknod_cmd));

-            snprintf(mknod_cmd, sizeof(mknod_cmd), "/bin/mknod %s c %d %d", ubi_dev, ubi_major, ubi_minor);

-            printf("fs_check cmd is %s\n", mknod_cmd);	

-            ret = zxic_system(mknod_cmd);

-            if (check_ubi_device_is_char(ubi_dev) < 0)

-                return -1;

-        }

-    }

-    return 0;

-}

-

-/**************************************************************************

-* º¯ÊýÃû³Æ£º read_file

-* ¹¦ÄÜÃèÊö£º ¶ÁÈ¡Îļþ

-* ²ÎÊý˵Ã÷£º (IN)

-*            p_file:  Îļþ

-*            len:    ³¤¶È

-*            (OUT)

-* ·µ »Ø Öµ£º³É¹¦·µ»Ø¶ÁÈ¡µÄÎļþ, ·ñÔò·µ»Ø0

-* ÆäËü˵Ã÷£º·µ»ØÖµµ÷ÓÃÕßÊÍ·Å

-**************************************************************************/

-static unsigned char *read_file(const char *p_file, unsigned int *len)

-{

-    FILE * fd          = 0;

-    struct stat buf = {0};

-    unsigned char * p_buf  = NULL;

-

-    if(p_file == NULL)

-        return NULL;

-    

-    if(stat(p_file, &buf) < 0)

-    {

-        printf("read_file stat %s failed\n", p_file);

-        return NULL;

-    }

-    

-    fd = fopen(p_file, "ro");

-    if(!fd) 

-    {

-        printf("read_file open %s fail\n", p_file);

-        return NULL;

-    }

-    

-    p_buf = (char *)malloc(buf.st_size);

-    if (p_buf == NULL)

-    {

-        printf("read_file malloc fail\n");

-        fclose(fd);

-        return NULL;

-    }

-

-    if(fread(p_buf,1, buf.st_size,fd) < 1) 

-    {

-        printf("read_file fread %s fail\n", p_file);

-        fclose(fd);

-        free(p_buf);

-        return NULL;

-    }

-    fclose(fd);

-    *len = buf.st_size;

-    

-    return p_buf;

-}

-

-/**************************************************************************

-* º¯ÊýÃû³Æ£º compare_file

-* ¹¦ÄÜÃèÊö£º ±È½ÏÄ¿±êÎļþºÍÔ´ÎļþÊÇ·ñÒ»Ñù

-* ²ÎÊý˵Ã÷£º (IN)

-*            p_dst_file:  Ä¿±êÎļþ

-*            p_src_file:  Ô´Îļþ

-*            (OUT)

-* ·µ »Ø Öµ£ºÎļþÒ»Ñù·µ»Ø0, ·ñÔò·µ»Ø-1

-* ÆäËü˵Ã÷£º

-**************************************************************************/

-static int compare_file(const char *p_dst_file, const char *p_src_file)

-{

-    unsigned char *p_dst;

-    unsigned char *p_src;

-    unsigned int dst_len;

-    unsigned int src_len;

-

-    if(p_dst_file == NULL || p_src_file == NULL)

-        return -1;

-

-    p_dst = read_file(p_dst_file, &dst_len);

-    if(!p_dst)

-        return -1;

-    

-    p_src = read_file(p_src_file, &src_len);

-    if(!p_src)

-    {

-        free(p_dst);

-        return -1;

-    }

-    

-    if(dst_len != src_len)

-    {

-        free(p_src);

-        free(p_dst);

-        

-        printf("compare_file size dstbuf = %d, srcbuf = %d\n", dst_len, src_len);

-        return -1;

-    }

-

-    if(memcmp(p_src, p_dst, src_len) != 0)

-    {

-        free(p_src);

-        free(p_dst);

-        printf("compare_file memcmp not same\n");

-        return -1;

-    }

-

-    free(p_src);

-    free(p_dst);

-    

-    return 0;

-}

-

-/*******************************************************************************

- *                                È«¾Öº¯Êý                                   *

- *******************************************************************************/

-/**************************************************************************

-* º¯ÊýÃû³Æ£º check_file_is_normal

-* ¹¦ÄÜÃèÊö£º ¼ì²éuserdata·ÖÇøÏÂÃæµÄÎļþÊÇ·ñÕý³££¬Èç¹û´æÔÚÒì³££¬ÔòÐèÒªÖØÐ»ָ´userdata·ÖÇø

-* ²ÎÊý˵Ã÷£º pFile:  Ðè¼ì²éµÄÎļþ

-* ·µ »Ø Öµ£º¼ì²éÕý³£·µ»Ø0, ÐèÒªÖØÐ»ָ´·ÖÇø·µ»Ø-1

-* ÆäËü˵Ã÷£º

-**************************************************************************/

-int check_file_is_normal(const char *pFile)

-{

-    int fd;

-    int result;  

-    struct stat st; 

-    

-    if(pFile == NULL)

-    {

-        return 0;

-    }

-    

-    result = stat(pFile, &st);

-    if(result == 0)

-    {

-        /* file exist */

-        printf("[fscheck]: The File %s was Found\n",pFile);

-        fd = open(pFile, O_RDONLY);

-        if(fd < 0)

-        {

-            perror("[fscheck]: open fail");

-            return -1;

-        }

-        if(lseek(fd, 0, SEEK_END) == -1)

-        {

-            perror("[fscheck]: lseek fail");

-            close(fd);

-            return -1;

-        }

-        close(fd);

-        /* file normal */

-        return 0;

-    }

-    else 

-    {

-        /* stat error */

-        if(errno == ENOENT)

-        {

-            return 0; /* file not exist and normal */

-        }

-        else

-        {

-            return -1; /* stat other error file not normal */

-        }

-    }

-}

-

-int wipe_out_vol_ubi(struct mtd_fs *p_fs)

-{

-    int ret = -1;

-    int mtd_blk_num = 0;

-    int ubi_num = 0;

-    int vol_id = 0;

-    char mtd_path[MAX_PATH] = {0};

-    char updatevol_cmd[MAX_PATH] = {0};

-

-    if (NULL == p_fs->patition_name || NULL == p_fs->fs_type)

-    {

-        return -1;

-    }

-

-    if (strcmp(p_fs->fs_type, "ubifs") == 0)

-    {

-        ret = mtd_find(p_fs->patition_name, DEVICE_MTD_BLOCK, mtd_path, MAX_PATH);

-        if (ret < 0)

-        {

-            printf("fs_check partition name is not find\n");

-            return -1;

-        }

-

-        sscanf(mtd_path, "/dev/mtdblock%d", &mtd_blk_num);

-        printf("fs_check: wipe_out_vol_ubi, /dev/mtdblock%d\n", mtd_blk_num);

-

-        ubi_num = get_ubifs_device_num(mtd_blk_num);

-        if (ubi_num < 0)

-        {

-            printf("fs_check ubi_num not match\n");

-            return -1;

-        }

-        vol_id = get_vol_id(ubi_num, p_fs->ubi_vol_name);

-        if (vol_id < 0)

-        {

-            printf("fs_check vol_id not match,vol_name:%s\n", p_fs->ubi_vol_name);

-            return -1;

-        }

-

-        snprintf(updatevol_cmd, sizeof(updatevol_cmd), "/usr/sbin/ubiupdatevol /dev/ubi%d_%d -t", ubi_num, vol_id);

-        ret = zxic_system(updatevol_cmd);

-    }

-

-    return ret;

-}

-

-int mount_fs_partition(struct mtd_fs *p_fs)

-{

-    int i;

-    int ret = -1;

-    int ubi_num = 0;

-    int vol_id = 0;

-    int mtd_blk_num = 0;

-    char mount_cmd[MAX_PATH] = {0};

-    char mtd_path[MAX_PATH] = {0};

-    char attach_cmd[MAX_PATH] = {0};

-    char updatevol_cmd[MAX_PATH] = {0};

-

-    if (NULL == p_fs->patition_name || NULL == p_fs->mount_point || NULL == p_fs->fs_type)

-        return -1;

-

-    //printf("fs_check i_parti_name=%s, parti_mp=%s, parti_mt=%s\n", p_fs->patition_name, p_fs->mount_point, p_fs->fs_type);

-

-    if (strcmp(p_fs->fs_type, "jffs2") == 0)

-    {

-        ret = mtd_find(p_fs->patition_name, DEVICE_MTD_BLOCK, mtd_path, MAX_PATH);

-        if (ret < 0)

-        {

-            printf("fs_check partition name is not find\n");

-            return -1;

-        }

-        snprintf(mount_cmd, sizeof(mount_cmd), "/bin/mount -t jffs2 -o %s %s %s", p_fs->mount_opt, mtd_path, p_fs->mount_point);

-    }

-    else if (strcmp(p_fs->fs_type, "ubifs") == 0)

-    {

-        ret = mtd_find(p_fs->patition_name, DEVICE_MTD_BLOCK, mtd_path, MAX_PATH);

-        if (ret < 0)

-        {

-            printf("fs_check partition name is not find\n");

-            return -1;

-        }

-        

-        sscanf(mtd_path, "/dev/mtdblock%d", &mtd_blk_num);

-        printf("fs_check: /dev/mtdblock%d\n",mtd_blk_num);

-

-        if (p_fs->ubi_need_attach)

-        {

-            snprintf(attach_cmd, sizeof(attach_cmd), "/usr/sbin/ubiattach /dev/ubi_ctrl -m %d", mtd_blk_num);

-            ret = system_exec_status(zxic_system(attach_cmd));

-            if (ret == SYSTEM_EXEC_FAIL)

-            {

-                printf("fs_check: %s fail\n", attach_cmd);

-                return -1;

-            }

-        }

-        

-        ubi_num = get_ubifs_device_num(mtd_blk_num);

-        if (ubi_num < 0)

-        {

-            printf("fs_check ubi_num not match\n");

-            return -1;

-        }

-        vol_id = get_vol_id(ubi_num, p_fs->ubi_vol_name);

-        if (vol_id < 0)

-        {

-            printf("fs_check vol_id not match,vol_name:%s\n", p_fs->ubi_vol_name);

-            return -1;

-        }

-#if 0

-        if (mknod_ubi_device() < 0)

-        {

-            printf("fs_check ubi dev not found\n");

-                return -1;

-        }

-#endif

-        if (strcmp(p_fs->ubi_vol_name, "rootfs_data") == 0)

-        {

-            // openwrt

-            snprintf(mount_cmd, sizeof(mount_cmd), "/usr/sbin/mount_root");

-        }

-        else

-        {

-            snprintf(mount_cmd, sizeof(mount_cmd), "/bin/mount -t ubifs -o %s ubi%d_%d %s",p_fs->mount_opt, ubi_num, vol_id, p_fs->mount_point);

-        }

-    }

-    else

-    {

-        printf("fs_check unknown mount type: %s\n", p_fs->fs_type);

-        return -1;

-    }

-    printf("fs_check mount commond: %s\n", mount_cmd);

-

-    for (i = 0; i < FS_MAX_MOUNT_TIMES; i++)

-    {

-        zxic_system(mount_cmd);

-

-        ret = check_mount_result(p_fs->mount_point);

-        if (ret < 0)

-        {

-            if ((strcmp(p_fs->fs_type, "ubifs") == 0) && (i == 0))

-            {

-                snprintf(updatevol_cmd, sizeof(updatevol_cmd), "/usr/sbin/ubiupdatevol /dev/ubi%d_%d -t", ubi_num, vol_id);

-                zxic_system(updatevol_cmd);

-                continue;

-            }

-            printf("fs_check : %s fail\n", mount_cmd);

-            return -1;

-        }

-        return 0;

-    }

-}

-

-int unmount_fs_partition(struct mtd_fs *p_fs)

-{

-    int ret = -1;

-    int ubi_num = 0;

-    int mtd_blk_num = 0;

-    char umount_cmd[MAX_PATH] = {0};

-    char mtd_path[MAX_PATH] = {0};

-    char detach_cmd[MAX_PATH] = {0};

-    

-    if (NULL == p_fs->patition_name || NULL == p_fs->mount_point || NULL == p_fs->fs_type)

-        return -1;

-

-    if (strcmp(p_fs->patition_name, "cpfs") == 0) {

-        snprintf(umount_cmd, sizeof(umount_cmd), "/bin/umount -f %s " ,p_fs->mount_point);

-    } else if (strcmp(p_fs->fs_type, "jffs2") == 0) {

-        snprintf(umount_cmd, sizeof(umount_cmd), "/bin/umount -f %s", p_fs->mount_point);

-    } else if (strcmp(p_fs->fs_type, "ubifs") == 0) {

-        

-        snprintf(umount_cmd, sizeof(umount_cmd), "/bin/umount -f %s",p_fs->mount_point);

-        zxic_system(umount_cmd);

-        printf("fs_check umount : %s\n", umount_cmd);

-        

-        ret = mtd_find(p_fs->patition_name, DEVICE_MTD_BLOCK, mtd_path, MAX_PATH);

-        if (ret < 0) {

-            printf("fs_check partition name is not find\n");

-            return -1;

-        }

-        sscanf(mtd_path, "/dev/mtdblock%d", &mtd_blk_num);

-        

-        ubi_num = get_ubifs_device_num(mtd_blk_num);

-        

-        snprintf(detach_cmd, sizeof(detach_cmd), "/usr/sbin/ubidetach /dev/ubi_ctrl -d %d", ubi_num);

-

-        ret = system_exec_status(zxic_system(detach_cmd));

-        if (ret == SYSTEM_EXEC_FAIL) {

-            printf("fs_check: %s fail\n",detach_cmd);

-            return -1;

-        }

-        

-        return 0;

-    } else {

-        printf("fs_check unknown umount type: %s\n", p_fs->fs_type);

-        return -1;

-    }

-    printf("fs_check umount : %s\n", umount_cmd);

-    ret = zxic_system(umount_cmd);

-

-    return 0;

-}

-

+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <mtd/mtd-abi.h>
+#include <errno.h>
+
+#include <sys/ioctl.h>
+#include "fscheck.h"
+#include "cfg_api.h"
+#include "mtd_api.h"
+
+/*******************************************************************************
+ *                             Macro definitions                               *
+ ******************************************************************************/
+#define MOUNTS_INFO_FILE                ("/proc/mounts")
+
+#define NV_FS_FAC_MAIN_PATH             ("/mnt/imagefs/nvrwall.bin")
+#define NV_FS_RW_HASH_FAC_PATH          ("/mnt/imagefs/nvrwall.hash")
+#define NV_FS_RW_HASH_WORK_PATH         ("/etc_rw/psnv/nvrwall.hash")
+#define NV_FS_RW_MAIN_PATH              ("/etc_rw/psnv/rw_work")
+#define NV_FS_RW_BACKUP_PATH            ("/etc_rw/psnv/rw_backup")
+#define NV_FS_FAC_SYMBOL_PATH           ("/etc_rw/psnv/fac_flag")
+#define NV_FS_RW_MAIN_SYMBOL_PATH       ("/etc_rw/psnv/work_flag")
+#define NV_FS_RW_BACKUP_SYMBOL_PATH     ("/etc_rw/psnv/backup_flag")
+
+#define NV_FS_RW_AP_NV_MAIN_PATH        ("/etc_rw/nv/main/cfg")
+#define NV_FS_RW_AP_NV_BACKUP_PATH      ("/etc_rw/nv/backup/cfg")
+
+#define MOUNTS_LINE_LEN                 (256)
+#define MOUNTS_LINE_ELEMENT_LEN         (64)
+#define MAX_PATH                        (256)
+#define BUF_MAX_LEN                     (32)
+#define UBI_DEV_MAX_NUM                 (10)
+#define SYSTEM_EXEC_FAIL                (0)
+#define SYSTEM_EXEC_SUCC                (1)
+#define FS_MAX_MOUNT_TIMES              (2)
+
+static int check_mount_result(const char *parti_mp)
+{
+    char *line_p, *temp_p;
+    char line[MOUNTS_LINE_LEN] = {0};
+    char line_element[MOUNTS_LINE_ELEMENT_LEN] = {0};
+    int found;
+    FILE *fp = NULL;
+    int mp_str_len;
+    if (parti_mp == NULL)
+        return -1;
+    if ((fp = fopen(MOUNTS_INFO_FILE, "r")) == NULL) {
+        printf("cap_fscheck fopen %s failed, error:%s\n", MOUNTS_INFO_FILE, strerror(errno));
+        goto error;
+    }
+
+    found = 0;
+    while (1) {
+        memset(line, 0, sizeof(line));
+        if (NULL == fgets(line, sizeof(line), fp)) {
+            break;
+        }
+        //upi_log("line: %s", line);
+        line_p = line;
+        while (*line_p != '\0' && *line_p != ' ') { // first element
+            line_p++;
+        }
+        line_p++;
+        memset(line_element, 0, sizeof(line_element));
+        temp_p = line_element;
+        while (*line_p != '\0' && *line_p != ' ') { // second element, this is what we need
+            *temp_p = *line_p;
+            temp_p++;
+
+            line_p++;
+        }
+        //upi_log("line_element: %s", line_element);
+        mp_str_len = strlen(parti_mp);
+        if (mp_str_len <= strlen(line_element)) {
+            if (strncmp(line_element + strlen(line_element) - mp_str_len, parti_mp, mp_str_len) == 0) {
+                found = 1;
+                break;
+            }
+        }
+    }
+    if (found == 0) {
+        printf("cap_fscheck did not find any mount info about %s\n", parti_mp);
+        goto error;
+    }
+    if (NULL != fp)
+        fclose(fp);
+    return 0;
+error:
+    if (fp != NULL)
+        fclose(fp);
+    return -1;
+}
+
+static int system_exec_status(int status)
+{
+    if (-1 == status)
+        return SYSTEM_EXEC_FAIL;
+
+    if (!WIFEXITED(status))
+        return SYSTEM_EXEC_FAIL;
+
+    if (WEXITSTATUS(status))
+        return SYSTEM_EXEC_FAIL;
+    
+    return SYSTEM_EXEC_SUCC;
+}
+
+static int get_ubifs_device_num(int recv_mtdnum)
+{
+    int     vol_num     = -1;
+    int     fd_ubi        = -1;
+    int     ret            = -1;
+    int     mytmp        = 0;
+    int     add_len     = 10; 
+
+    struct  stat st        = {0};
+    
+    unsigned char read_buf[BUF_MAX_LEN] = {0};
+    unsigned char ubidev_path[MAX_PATH] = {0};
+
+    for (; mytmp < UBI_DEV_MAX_NUM; mytmp++)
+    {
+        snprintf(ubidev_path, sizeof(ubidev_path), "/sys/devices/virtual/ubi/ubi%d", mytmp);  
+        ret = stat(ubidev_path, &st);
+        if (ret < 0) {
+            printf("cap_fscheck get stat info from error:%s\n", strerror(errno));        
+            break;
+        }
+        if (S_ISDIR(st.st_mode)) {
+            strncat(ubidev_path, "/mtd_num", add_len);
+            fd_ubi = open(ubidev_path, O_RDONLY);
+            if (fd_ubi < 0) {
+                printf("cap_fscheck open file error:%s", strerror(errno));
+                break;
+            }
+            memset(read_buf, 0, sizeof(read_buf));
+            ret = read(fd_ubi, read_buf, sizeof(read_buf));
+            //printf("cap_fscheck get stat info from %s read num = %d\n", ubidev_path, atoi(read_buf));      
+            if (ret < 0) {
+                printf("cap_fscheck get info from ubi error:%s\n", strerror(errno));
+                close(fd_ubi);
+                break;
+            }
+            if (atoi(read_buf) == recv_mtdnum) {
+                vol_num = mytmp;
+                close(fd_ubi);
+                break;
+            }
+            close(fd_ubi);
+        }
+    }
+
+    return vol_num;
+}
+
+static int get_vol_id(int ubi_num, char *vol_name)
+{
+    int     vol_id     = -1;
+    int     fd_ubi        = -1;
+    int     ret            = -1;
+    int     mytmp        = 0;
+    int     add_len     = 10; 
+
+    struct  stat st        = {0};
+    
+    unsigned char read_buf[BUF_MAX_LEN] = {0};
+    unsigned char ubidev_path[MAX_PATH] = {0};
+
+    for (; mytmp < UBI_DEV_MAX_NUM; mytmp++)
+    {
+        snprintf(ubidev_path, sizeof(ubidev_path), "/sys/devices/virtual/ubi/ubi%d/ubi%d_%d", ubi_num, ubi_num, mytmp);  
+        ret = stat(ubidev_path, &st);
+        if (ret < 0) {
+            printf("cap_fscheck get stat info from error:%s\n", strerror(errno));        
+            break;
+        }
+        if (S_ISDIR(st.st_mode)) {
+            strncat(ubidev_path, "/name", add_len);
+            fd_ubi = open(ubidev_path, O_RDONLY);
+            if (fd_ubi < 0) {
+                printf("cap_fscheck open file error:%s", strerror(errno));
+                break;
+            }
+            memset(read_buf, 0, sizeof(read_buf));
+            ret = read(fd_ubi, read_buf, sizeof(read_buf));
+            printf("cap_fscheck get stat info from %s read vol_name=%s\n", ubidev_path, read_buf);      
+            if (ret < 0) {
+                printf("cap_fscheck get info from ubi error:%s\n", strerror(errno));
+                close(fd_ubi);
+                break;
+            }
+            if (memcmp(read_buf, vol_name, strlen(vol_name)) == 0)
+            {
+                // find vol_name
+                vol_id = mytmp;
+                close(fd_ubi);
+                break;
+            }
+            close(fd_ubi);
+        }
+    }
+
+    return vol_id;
+}
+
+static int get_ubi_device_num(const char *dev_path, int *major_num, int *minor_num)
+{
+    struct  stat st        = {0};
+    int     fd_ubi         = -1;
+    int     ret            = -1;
+    
+    unsigned char read_buf[BUF_MAX_LEN] = {0};
+    char *sysubi_path = NULL;
+    if (dev_path == NULL)
+        return -1;
+    
+    sysubi_path = dev_path;
+    printf("cap_fscheck get stat info from %s\n", sysubi_path);  
+    ret = stat(sysubi_path, &st);
+    if (ret < 0) {
+        printf("cap_fscheck get stat info from error:%s\n", strerror(errno));        
+        return -1;
+    }
+    if (S_ISREG(st.st_mode)) {
+        fd_ubi = open(sysubi_path, O_RDONLY);
+            if (fd_ubi < 0) {
+                printf("cap_fscheck open file error:%s", strerror(errno));
+                return -1;
+            }
+        memset(read_buf, 0, sizeof(read_buf));
+        ret = read(fd_ubi, read_buf, sizeof(read_buf));
+        printf("cap_fscheck get stat info from %s read data = %s\n", sysubi_path, read_buf); 
+        sscanf(read_buf, "%d:%d", major_num, minor_num);
+        printf("cap_fscheck get device num major_num: %d, minor_num: %d\n", *major_num, *minor_num); 
+        return 0;    
+    }
+    else
+    {
+        return -1;
+    }
+}
+
+static int check_ubi_device_is_char(const char *dev_path)
+{
+    struct  stat st        = {0};
+    int ret = -1;
+    if (dev_path == NULL)
+        return -1;
+    
+    ret = stat(dev_path, &st);
+    if (ret < 0) {
+        printf("cap_fscheck get stat info from error:%s\n", strerror(errno));        
+        return -1;
+    }
+
+    if (!S_ISCHR(st.st_mode)) {
+        return -1;    
+    }
+    
+    return 0;
+}
+
+static int mknod_ubi_device(int ubi_num, int vol_id)
+{
+    int mychar = 2;
+    //char *ubi_array[] = {"ubi1", "ubi1_0", "ubi1_1"};
+    char ubi_array[2][8];
+    char ubi_dev[MAX_PATH] = {0};    // /dev/ubi1
+    char ubi_sys[MAX_PATH] = {0};    // /sys/class/ubi/ubi1/dev
+    int  ubi_major = -1;
+    int  ubi_minor = -1;
+    char mknod_cmd[MAX_PATH] = {0};   // mknod /dev/ubi1 c
+    int i , ret = 0;
+    memset(ubi_array, 0, sizeof(ubi_array));
+    snprintf(ubi_array[0], sizeof(ubi_array[0]), "ubi%d", ubi_num);
+    snprintf(ubi_array[1], sizeof(ubi_array[1]), "ubi%d_%d", ubi_num, vol_id);
+    for (i = 0; i < mychar; i++)
+    {
+        memset(ubi_dev, 0x0, sizeof(ubi_dev));
+        snprintf(ubi_dev, sizeof(ubi_dev), "/dev/%s", ubi_array[i]);	
+        printf("cap_fscheck dev is %s\n", ubi_dev);	
+        // 如果不存 ubi1,则创建 ubi1 设备
+        if (check_ubi_device_is_char(ubi_dev) < 0)
+        {
+            memset(ubi_sys, 0x0, sizeof(ubi_sys));
+            ubi_major = -1;
+            ubi_minor = -1;
+            snprintf(ubi_sys, sizeof(ubi_sys), "/sys/class/ubi/%s/dev", ubi_array[i]);
+            printf("cap_fscheck ubi sys is %s\n", ubi_sys);	
+            // 获得主次设备号,如果获取失败,直接 return
+            if ((get_ubi_device_num(ubi_sys, &ubi_major, &ubi_minor) < 0) || (ubi_minor < 0) || (ubi_minor < 0))
+                return -1;
+            memset(mknod_cmd, 0x0, sizeof(mknod_cmd));
+            snprintf(mknod_cmd, sizeof(mknod_cmd), "/bin/mknod %s c %d %d", ubi_dev, ubi_major, ubi_minor);
+            printf("cap_fscheck cmd is %s\n", mknod_cmd);	
+            ret = zxic_system(mknod_cmd);
+            if (check_ubi_device_is_char(ubi_dev) < 0)
+                return -1;
+        }
+    }
+    return 0;
+}
+
+/**************************************************************************
+* 函数名称: read_file
+* 功能描述: 读取文件
+* 参数说明: (IN)
+*            p_file:  文件
+*            len:    长度
+*            (OUT)
+* 返 回 值:成功返回读取的文件, 否则返回0
+* 其它说明:返回值调用者释放
+**************************************************************************/
+static unsigned char *read_file(const char *p_file, unsigned int *len)
+{
+    FILE * fd          = 0;
+    struct stat buf = {0};
+    unsigned char * p_buf  = NULL;
+
+    if(p_file == NULL)
+        return NULL;
+    
+    if(stat(p_file, &buf) < 0)
+    {
+        printf("cap_fscheck read_file stat %s failed\n", p_file);
+        return NULL;
+    }
+    
+    fd = fopen(p_file, "ro");
+    if(!fd) 
+    {
+        printf("cap_fscheck read_file open %s fail\n", p_file);
+        return NULL;
+    }
+    
+    p_buf = (char *)malloc(buf.st_size);
+    if (p_buf == NULL)
+    {
+        printf("cap_fscheck read_file malloc fail\n");
+        fclose(fd);
+        return NULL;
+    }
+
+    if(fread(p_buf,1, buf.st_size,fd) < 1) 
+    {
+        printf("cap_fscheck read_file fread %s fail\n", p_file);
+        fclose(fd);
+        free(p_buf);
+        return NULL;
+    }
+    fclose(fd);
+    *len = buf.st_size;
+    
+    return p_buf;
+}
+
+/**************************************************************************
+* 函数名称: compare_file
+* 功能描述: 比较目标文件和源文件是否一样
+* 参数说明: (IN)
+*            p_dst_file:  目标文件
+*            p_src_file:  源文件
+*            (OUT)
+* 返 回 值:文件一样返回0, 否则返回-1
+* 其它说明:
+**************************************************************************/
+static int compare_file(const char *p_dst_file, const char *p_src_file)
+{
+    unsigned char *p_dst;
+    unsigned char *p_src;
+    unsigned int dst_len;
+    unsigned int src_len;
+
+    if(p_dst_file == NULL || p_src_file == NULL)
+        return -1;
+
+    p_dst = read_file(p_dst_file, &dst_len);
+    if(!p_dst)
+        return -1;
+    
+    p_src = read_file(p_src_file, &src_len);
+    if(!p_src)
+    {
+        free(p_dst);
+        return -1;
+    }
+    
+    if(dst_len != src_len)
+    {
+        free(p_src);
+        free(p_dst);
+        
+        printf("cap_fscheck compare_file size dstbuf = %d, srcbuf = %d\n", dst_len, src_len);
+        return -1;
+    }
+
+    if(memcmp(p_src, p_dst, src_len) != 0)
+    {
+        free(p_src);
+        free(p_dst);
+        printf("cap_fscheck compare_file memcmp not same\n");
+        return -1;
+    }
+
+    free(p_src);
+    free(p_dst);
+    
+    return 0;
+}
+
+/*******************************************************************************
+ *                                全局函数                                   *
+ *******************************************************************************/
+/**************************************************************************
+* 函数名称: check_file_is_normal
+* 功能描述: 检查userdata分区下面的文件是否正常,如果存在异常,则需要重新恢复userdata分区
+* 参数说明: pFile:  需检查的文件
+* 返 回 值:检查正常返回0, 需要重新恢复分区返回-1
+* 其它说明:
+**************************************************************************/
+int check_file_is_normal(const char *pFile)
+{
+    int fd;
+    int result;  
+    struct stat st; 
+    
+    if(pFile == NULL)
+    {
+        return 0;
+    }
+    
+    result = stat(pFile, &st);
+    if(result == 0)
+    {
+        /* file exist */
+        printf("cap_fscheck: The File %s was Found\n",pFile);
+        fd = open(pFile, O_RDONLY);
+        if(fd < 0)
+        {
+            perror("cap_fscheck: open fail");
+            return -1;
+        }
+        if(lseek(fd, 0, SEEK_END) == -1)
+        {
+            perror("cap_fscheck: lseek fail");
+            close(fd);
+            return -1;
+        }
+        close(fd);
+        /* file normal */
+        return 0;
+    }
+    else 
+    {
+        /* stat error */
+        if(errno == ENOENT)
+        {
+            return 0; /* file not exist and normal */
+        }
+        else
+        {
+            return -1; /* stat other error file not normal */
+        }
+    }
+}
+
+int wipe_out_vol_ubi(struct mtd_fs *p_fs)
+{
+    int ret = -1;
+    int mtd_blk_num = 0;
+    int ubi_num = 0;
+    int vol_id = 0;
+    char mtd_path[MAX_PATH] = {0};
+    char updatevol_cmd[MAX_PATH] = {0};
+
+    if ((NULL == p_fs) || (NULL == p_fs->patition_name) || (NULL == p_fs->fs_type))
+    {
+        return -1;
+    }
+
+    if (strcmp(p_fs->fs_type, "ubifs") == 0)
+    {
+        ret = mtd_find(p_fs->patition_name, DEVICE_MTD_BLOCK, mtd_path, MAX_PATH);
+        if (ret < 0)
+        {
+            printf("cap_fscheck partition name is not find\n");
+            return -1;
+        }
+
+        sscanf(mtd_path, "/dev/mtdblock%d", &mtd_blk_num);
+        printf("cap_fscheck: wipe_out_vol_ubi, /dev/mtdblock%d\n", mtd_blk_num);
+
+        ubi_num = get_ubifs_device_num(mtd_blk_num);
+        if (ubi_num < 0)
+        {
+            printf("cap_fscheck ubi_num not match\n");
+            return -1;
+        }
+        vol_id = get_vol_id(ubi_num, p_fs->ubi_vol_name);
+        if (vol_id < 0)
+        {
+            printf("cap_fscheck vol_id not match,vol_name:%s\n", p_fs->ubi_vol_name);
+            return -1;
+        }
+
+        snprintf(updatevol_cmd, sizeof(updatevol_cmd), "/usr/sbin/ubiupdatevol /dev/ubi%d_%d -t", ubi_num, vol_id);
+        printf("cap_fscheck updatevol_cmd: %s\n", updatevol_cmd);
+        ret = zxic_system(updatevol_cmd);
+    }
+
+    return ret;
+}
+
+int attach_mtd_partition(struct mtd_fs *p_fs)
+{
+    int ret;
+    int ubi_num = 0;
+    int mtd_blk_num = 0;
+    int vol_id = 0;
+    char mtd_path[MAX_PATH] = {0};
+    char attach_cmd[MAX_PATH] = {0};
+    char detach_cmd[MAX_PATH] = {0};
+
+    if ((NULL == p_fs) || (NULL == p_fs->patition_name))
+        return -1;
+
+    ret = mtd_find(p_fs->patition_name, DEVICE_MTD_BLOCK, mtd_path, MAX_PATH);
+    if (ret < 0)
+    {
+        printf("cap_fscheck partition name is not find\n");
+        return -1;
+    }
+        
+    sscanf(mtd_path, "/dev/mtdblock%d", &mtd_blk_num);
+    snprintf(attach_cmd, sizeof(attach_cmd), "/usr/sbin/ubiattach /dev/ubi_ctrl -m %d", mtd_blk_num);
+
+    printf("cap_fscheck attach_cmd commond: %s\n", attach_cmd);
+    ret = system_exec_status(zxic_system(attach_cmd));
+    if (ret == SYSTEM_EXEC_FAIL)
+    {
+        printf("cap_fscheck: %s fail\n", attach_cmd);
+        return -1;
+    }
+       
+    return 0;  
+}
+
+int mount_fs_partition(struct mtd_fs *p_fs)
+{
+    int i;
+    int ret = -1;
+    int ubi_num = 0;
+    int vol_id = 0;
+    int mtd_blk_num = 0;
+    char mount_cmd[MAX_PATH] = {0};
+    char mtd_path[MAX_PATH] = {0};
+    char updatevol_cmd[MAX_PATH] = {0};
+
+    if ((NULL == p_fs) || (NULL == p_fs->patition_name) || (NULL == p_fs->mount_point) || (NULL == p_fs->fs_type))
+        return -1;
+
+    if (strcmp(p_fs->fs_type, "jffs2") == 0)
+    {
+        ret = mtd_find(p_fs->patition_name, DEVICE_MTD_BLOCK, mtd_path, MAX_PATH);
+        if (ret < 0)
+        {
+            printf("cap_fscheck partition name is not find\n");
+            return -1;
+        }
+        snprintf(mount_cmd, sizeof(mount_cmd), "/bin/mount -t jffs2 -o %s %s %s", p_fs->mount_opt, mtd_path, p_fs->mount_point);
+    }
+    else if ((NULL != p_fs->ubi_vol_name) && (strcmp(p_fs->fs_type, "ubifs") == 0))
+    {
+        ret = mtd_find(p_fs->patition_name, DEVICE_MTD_BLOCK, mtd_path, MAX_PATH);
+        if (ret < 0)
+        {
+            printf("cap_fscheck partition name is not find\n");
+            return -1;
+        }
+        
+        sscanf(mtd_path, "/dev/mtdblock%d", &mtd_blk_num);
+        ubi_num = get_ubifs_device_num(mtd_blk_num);
+        if (ubi_num < 0)
+        {
+            printf("cap_fscheck ubi_num not match\n");
+            return -1;
+        }
+        vol_id = get_vol_id(ubi_num, p_fs->ubi_vol_name);
+        if (vol_id < 0)
+        {
+            printf("cap_fscheck vol_id not match,vol_name:%s\n", p_fs->ubi_vol_name);
+            return -1;
+        }
+
+        if (mknod_ubi_device(ubi_num, vol_id) < 0) 
+        {
+            printf("cap_fscheck ubi dev not found\n");
+                return -1;
+        }
+
+        if (strcmp(p_fs->ubi_vol_name, "rootfs_data") == 0)
+        {
+            // openwrt
+            snprintf(mount_cmd, sizeof(mount_cmd), "/usr/sbin/mount_root");
+        }
+        else
+        {
+            snprintf(mount_cmd, sizeof(mount_cmd), "/bin/mount -t ubifs -o %s ubi%d_%d %s",p_fs->mount_opt, ubi_num, vol_id, p_fs->mount_point);
+        }
+    }
+    else
+    {
+        printf("cap_fscheck unknown mount type: %s\n", p_fs->fs_type);
+        return -1;
+    }
+
+    printf("cap_fscheck mount commond: %s\n", mount_cmd);
+    zxic_system(mount_cmd);
+
+    ret = check_mount_result(p_fs->mount_point);
+    if (ret < 0)
+    {
+        return -1;
+    }
+    return 0;
+}
+
+int detach_mtd_partition(struct mtd_fs *p_fs)
+{
+    int ret;
+    int ubi_num = 0;
+    int mtd_blk_num = 0;
+    char mtd_path[MAX_PATH] = {0};
+    char detach_cmd[MAX_PATH] = {0};
+
+    if ((NULL == p_fs) || (NULL == p_fs->patition_name))
+        return -1;
+
+    ret = mtd_find(p_fs->patition_name, DEVICE_MTD_BLOCK, mtd_path, MAX_PATH);
+    if (ret < 0) {
+        printf("cap_fscheck partition name %s is not find\n", p_fs->patition_name);
+        return -1;
+    }
+    sscanf(mtd_path, "/dev/mtdblock%d", &mtd_blk_num);
+    
+    ubi_num = get_ubifs_device_num(mtd_blk_num);
+    
+    snprintf(detach_cmd, sizeof(detach_cmd), "/usr/sbin/ubidetach /dev/ubi_ctrl -d %d", ubi_num);
+
+    printf("cap_fscheck detach_cmd: %s\n", detach_cmd);
+    ret = system_exec_status(zxic_system(detach_cmd));
+    if (ret == SYSTEM_EXEC_FAIL) {
+        printf("cap_fscheck: %s fail\n",detach_cmd);
+        return -1;
+    }
+    
+    return 0;
+}
+
+int unmount_fs_partition(struct mtd_fs *p_fs)
+{
+    int ret = -1;
+    char umount_cmd[MAX_PATH] = {0};
+    
+    if ((NULL == p_fs) || (NULL == p_fs->patition_name) || (NULL == p_fs->mount_point) || (NULL == p_fs->fs_type))
+        return -1;
+
+    if (strcmp(p_fs->patition_name, "cpfs") == 0) {
+        snprintf(umount_cmd, sizeof(umount_cmd), "/bin/umount -f %s" ,p_fs->mount_point);
+    } else if (strcmp(p_fs->fs_type, "jffs2") == 0) {
+        snprintf(umount_cmd, sizeof(umount_cmd), "/bin/umount -f %s", p_fs->mount_point);
+    } else if (strcmp(p_fs->fs_type, "ubifs") == 0) {
+        snprintf(umount_cmd, sizeof(umount_cmd), "/bin/umount -f %s", p_fs->mount_point);
+    } else {
+        printf("cap_fscheck unknown umount type: %s\n", p_fs->fs_type);
+        return -1;
+    }
+    printf("cap_fscheck umount_cmd: %s\n", umount_cmd);
+    ret = system_exec_status(zxic_system(umount_cmd));
+    if (ret == SYSTEM_EXEC_FAIL) {
+        printf("cap_fscheck: %s fail\n",umount_cmd);
+        return -1;
+    }
+
+    return 0;
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fsmonitor/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fsmonitor/Makefile
index e276f61..dcaeaf0 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fsmonitor/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fsmonitor/Makefile
@@ -10,7 +10,7 @@
 CFLAGS += -g -Werror=implicit-function-declaration
 
 
-LDLIBS = -lpthread -lm
+LDLIBS = -lpthread -lm -lflags
 #LDLIBS += -lsoftap -L$(zte_lib_path)/libsoftap
 #LDLIBS  += -lsofttimer -L$(zte_lib_path)/libsofttimer
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fsmonitor/fsmonitor.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fsmonitor/fsmonitor.c
index 962153b..07275f2 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fsmonitor/fsmonitor.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/fsmonitor/fsmonitor.c
@@ -20,8 +20,8 @@
 #include <stdint.h>
 #include <unistd.h>
 #include <errno.h>
-// #include "pub_flags.h"
-// #include "flags_api.h"
+#include "pub_flags.h"
+#include "flags_api.h"
 
 #define UBI_NETLINK_TYPE   30
 #define UBI_PAYLOAD_LEN    64
@@ -34,8 +34,6 @@
 
 char umsg[UBI_PAYLOAD_LEN];
 
-static inline int flags_set_fs_status(int is_abnormal) { return 0; }
-
 int main()
 {
     int skfd;
@@ -44,12 +42,13 @@
     socklen_t len;
     struct nlmsghdr *nlh = NULL;
     struct sockaddr_nl src_addr, dest_addr;
+    T_UBIFS_STATUS *stat;
 
     /* 创建NETLINK socket */
     skfd = socket(AF_NETLINK, SOCK_RAW, UBI_NETLINK_TYPE);
     if (skfd == -1)
     {
-        perror("fsmonitor: create socket error");
+        perror("cap_fsmonitor: create socket error");
         ret = -1;
         goto err1;
     }
@@ -61,7 +60,7 @@
 
     if(bind(skfd, (struct sockaddr *)&src_addr, sizeof(src_addr)) != 0)
     {
-        perror("fsmonitor: bind() error");
+        perror("cap_fsmonitor: bind() error");
         ret = -2;
         goto err2;
     }
@@ -74,7 +73,7 @@
     nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(UBI_PAYLOAD_LEN));
     if (!nlh)
     {
-        perror("fsmonitor: malloc error");
+        perror("cap_fsmonitor: malloc error");
         ret = -3;
         goto err2;
     }
@@ -91,43 +90,44 @@
     ret = sendto(skfd, nlh, nlh->nlmsg_len, 0, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_nl));
     if(!ret)
     {
-        perror("fsmonitor: sendto error\n");
+        perror("cap_fsmonitor: sendto error\n");
         ret = -4;
         goto err3;
     }
-    printf("fsmonitor: send message to kernel %s\n", umsg);
+    printf("cap_fsmonitor: send message to kernel %s\n", umsg);
     
     while(1)
     {
         ret = recvfrom(skfd, &u_inof, sizeof(user_msg_info), 0, (struct sockaddr *)&dest_addr, &len);
         if (!ret)
         {
-            perror("fsmonitor: recv from kernel error");
+            perror("cap_fsmonitor: recv from kernel error");
             ret = -5;
             goto err3;
         }
-
-        printf("fsmonitor: recver message from kernel %s\n", u_inof.msg);
-        if(!strcmp(u_inof.msg, "switch to read-only mode\n"))
+        stat = (T_UBIFS_STATUS *)u_inof.msg;
+        printf("cap_fsmonitor: recver message from kernel fs_status: %d, fs_mtd_name: %s, fs_ubi_vol_name: %s\n", stat->fs_status, stat->fs_mtd_name, stat->fs_ubi_vol_name);
+        
+        if(stat->fs_status)
         {
             // 设置flag分区中文件系统标志为异常
-            ret = flags_set_fs_status(1);
+            ret = flags_set_ubifs_status(stat);
             if (ret < 0)
             {
-                perror("fsmonitor: set filesystem status failed");
+                perror("cap_fsmonitor: set filesystem status failed");
                 ret = -6;
                 goto err3;
             }
             else
             {
                 // 重启系统
-                printf("fsmonitor: filesystem switch into abnormal and system is going to shutdown...\n");
+                printf("cap_fsmonitor: filesystem switch into abnormal and system is going to shutdown...\n");
                 if (system("reboot")) 
                 {
-                    perror("fsmonitor: failed execute reboot");
+                    perror("cap_fsmonitor: failed execute reboot");
                     ret = -7;
                     goto err3;
-                } 
+                }
             }
         } 
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/at_msg.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/at_msg.h
index d6e34c3..28a17cc 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/at_msg.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/at_msg.h
@@ -245,8 +245,13 @@
 	MSG_CMD_AT_FILTER_REQ,                  //AP֪ͨCPÐèÒª¹ýÂËÖ÷¶¯Éϱ¨µÄATÃüÁî
 	MSG_CMD_SYNC_ATCMD_STREAM,              //AP²à·¢ÆðNVͬ²½£¬ÒòATÃüÁîÁ÷½Ï³¤ÇÒÃüÁ˫ÒýºÅ£¬µ¥¶Àͬ²½
 	MSG_CMD_ADD_MNET_WHITELIST,					//CP²à·¢ÆðÊ¡µç°×Ãûµ¥ÃüÁîÐÂÔö
+	MSG_CMD_ADD_MNET_WHITELIST_RSP,				//CP²à·¢ÆðÊ¡µç°×Ãûµ¥ÐÂÔöÃüÁîÏìÓ¦
 	MSG_CMD_DEL_MNET_WHITELIST,					//CP²à·¢ÆðÊ¡µç°×Ãûµ¥ÃüÁîɾ³ý
-	MSG_CMD_CLEAR_MNET_WHITELIST,				//CP²à·¢ÆðÊ¡µç°×Ãûµ¥¹Ø±Õ
+	MSG_CMD_DEL_MNET_WHITELIST_RSP,				//CP²à·¢ÆðÊ¡µç°×Ãûµ¥É¾³ýÃüÁîÏìÓ¦
+	MSG_CMD_GET_MNET_WHITELIST,					//CP²à·¢ÆðÊ¡µç°×Ãûµ¥ÃüÁî»ñÈ¡
+	MSG_CMD_GET_MNET_WHITELIST_RSP,				//CP²à·¢ÆðÊ¡µç°×Ãûµ¥»ñÈ¡ÃüÁîÏìÓ¦
+	MSG_CMD_CLEAR_MNET_WHITELIST,				//CP²à·¢ÆðÊ¡µç°×Ãûµ¥Çå³ý
+	MSG_CMD_CLEAR_MNET_WHITELIST_RSP,			//CP²à·¢ÆðÊ¡µç°×Ãûµ¥Çå³ýÃüÁîÏìÓ¦
 
 /**------------------------ÒÔÏÂÊÇOPENCPUµÄÏûÏ¢ID-----------------------------**/
 	MSG_CMD_PDP_ACT_REQ,		//pdp¼¤»îÒµÎñÇëÇ󣬶ÔÓ¦½á¹¹ÌåAT_PDP_ACT_INFO
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/flags_api.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/flags_api.h
new file mode 100755
index 0000000..68ccdad
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/flags_api.h
@@ -0,0 +1,98 @@
+/**
+ * @file flags_api.h
+ * @brief flags·ÖÇø½Ó¿Ú
+ *
+ * Copyright (C) 2023 Sanechips Technology Co., Ltd.
+ * @author 
+ * @ingroup 
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation. £¨±ØÑ¡£ºGPLv2 Licence£©
+ *
+ */
+
+
+#ifndef FLAGS_API_H
+#define FLAGS_API_H
+
+
+/*******************************************************************************
+ *                           Include header files                              *
+ ******************************************************************************/
+#include "pub_flags.h"
+
+
+/*******************************************************************************
+ *                             Macro definitions                               *
+ ******************************************************************************/
+
+
+/*******************************************************************************
+ *                             Type definitions                                *
+ ******************************************************************************/
+
+
+/*******************************************************************************
+ *                       Global variable declarations                          *
+ ******************************************************************************/
+
+
+/*******************************************************************************
+ *                       Global function declarations                          *
+ ******************************************************************************/
+/**
+ * @brief  ³õʼ»¯flags·ÖÇø
+ * @param[out]  p_flags_info  flags³õʼ»¯Êý¾Ý
+ * @return  0 ³õʼ»¯³É¹¦, -1 ³õʼ»¯Ê§°Ü
+ * @note
+ */
+int flags_init();
+
+
+/**
+ * @brief  »ñÈ¡flags·ÖÇøÄÚÈÝ
+ * @param[out]  p_flags_info  flags·ÖÇøÄÚÈÝ
+ * @return  0 »ñÈ¡³É¹¦, -1 »ñȡʧ°Ü
+ * @note
+ */
+int flags_get(T_FLAGS_INFO *p_flags_info);
+
+
+/**
+ * @brief  ÉèÖÃflags·ÖÇøÄÚÈÝ
+ * @param[out]  p_flags_info  flags·ÖÇøÄÚÈÝ
+ * @return  0 ÉèÖóɹ¦, -1 ÉèÖÃʧ°Ü
+ * @note
+ */
+int flags_set(T_FLAGS_INFO *p_flags_info);
+
+
+/**
+ * @brief  »ñÈ¡flags·ÖÇøÖÐubifs״̬
+ * @param[out]  status  ubifs״̬
+ * @return  0 »ñÈ¡³É¹¦, -1 »ñȡʧ°Ü
+ * @note
+ */
+int flags_get_ubifs_status(T_UBIFS_STATUS *p_ubifs_status);
+
+
+/**
+ * @brief  ÉèÖÃflags·ÖÇøÖÐubifs״̬
+ * @param[in]  status  ubifs״̬
+ * @return  0 ÉèÖóɹ¦, -1 ÉèÖÃʧ°Ü
+ * @note
+ */
+int flags_set_ubifs_status(T_UBIFS_STATUS *p_ubifs_status);
+
+
+/**
+ * @brief  »ñÈ¡µ±Ç°ÏµÍ³
+ * @return  µ±Ç°ÔËÐÐϵͳ
+ * @note
+ */
+int flags_get_current_system();
+
+
+#endif // FLAGS_API_H
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/message.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/message.h
index 7e25a73..86e8db6 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/message.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/message.h
@@ -88,6 +88,7 @@
 	MODULE_ID_IP_PROXY,             /*ip proxyÄ£¿éID*/
 
 	MODULE_ID_BIP,					/* BIPÓ¦ÓÃ */
+	MODULE_ID_MNET_WHITELIST,		//whitelistÄ£¿é
 
 	/* ----- ƽ̨ÄÚ²¿¾²Ì¬Ä£¿éIDµÄ½áβ£¬Æ½Ì¨ÄÚ²¿ÐÂÔöIDÐèÌí¼ÓÔÚÉÏ·½ ------ */
 	
@@ -156,6 +157,9 @@
 	MSG_CMD_ATCHN_STOP,		//ֹͣat channel
 	MSG_CMD_DEL_MSG_IS_FD,	//ɾ³ýͨµÀ
 
+	MODULE_ID_WLAN_PROXY,		//cap²àwifi´úÀí
+	MODULE_ID_MNET_WHITELIST_PROXY,		//cap²àwhitelist´úÀí
+
 	MODULE_ID_SDK_DYNAMIC_BASE,  //SDK-APIʹÓõĶ¯Ì¬ÏûÏ¢ID
 	MODULE_ID_SDK_DYNAMIC_END = MODULE_ID_SDK_DYNAMIC_BASE + 0x100,
 } T_AP_Module_ID;
@@ -279,6 +283,10 @@
 	MSG_CMD_CPIPC_BASE 		= 0x7001,
 	MSG_CMD_CPIPC_END		= 0x7200,
 
+	/*wifi cap inter*/
+	MSG_CMD_WIFI_CAP_BASE 		= 0x7201,
+	MSG_CMD_WIFI_CAP_END		= 0x7400,
+
 	//kwatchtest
 	MSG_CMD_KWATCH_BASE      = 0x8001,
 	MSG_CMD_KWATCH_END      = 0x9000,
@@ -298,6 +306,10 @@
 	//absvr
 	MSG_CMD_ABSVR_BASE      = 0x9201,
 	MSG_CMD_ABSVR_END      = 0x9300,
+	
+	//mnet_whitelist
+	MSG_CMD_MNET_WHITELIST_BASE      = 0x9301,
+	MSG_CMD_MNET_WHITELIST_END      = 0x9400,
 };
 #endif
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/mnet_whitelist_inter_msg.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/mnet_whitelist_inter_msg.h
new file mode 100755
index 0000000..4040d25
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/mnet_whitelist_inter_msg.h
@@ -0,0 +1,95 @@
+/**

+ * @file sc_wifi_msg.h

+ * @brief SC Inter-Process-Communication.

+ *

+ * Copyright (C) 2023 Sanechips Technology Co., Ltd.

+ * @author 

+ * @ingroup 

+ * 

+ * This program is free software; you can redistribute it and/or modify

+ * it under the terms of the GNU General Public License version 2 as

+ * published by the Free Software Foundation. 

+ *

+ */

+ 

+#ifndef _MNET_WHITELIST_INTER_MSG_H

+#define _MNET_WHITELIST_INTER_MSG_H

+

+/*******************************************************************************

+ *                           Include header files                              *

+ ******************************************************************************/

+#include "message.h"

+#include "zxic_list.h"

+

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/*******************************************************************************

+ *                             Macro definitions                               *

+ ******************************************************************************/

+

+#define SC_MNET_WHITELIST_ENABLE 1

+#define SC_MNET_WHITELIST_DISABLE 0

+

+#define CASE_RETURN_STR(x) case x: return #x;

+

+/*******************************************************************************

+ *                             Type definitions                                *

+ ******************************************************************************/

+//cap²àmnet_whitelistÄÚ²¿ÏûÏ¢´¦Àí

+typedef enum { 

+	SCMNET_WHITELIST_CMD_CONN_REQ = MSG_CMD_MNET_WHITELIST_BASE,

+	SCMNET_WHITELIST_CMD_CONN_RSP,

+		

+	SCMNET_WHITELIST_CMD_ADD_REQ,

+	SCMNET_WHITELIST_CMD_ADD_RSP,

+

+	SCMNET_WHITELIST_CMD_DEL_REQ,

+	SCMNET_WHITELIST_CMD_DEL_RSP,

+

+	SCMNET_WHITELIST_CMD_GET_REQ,

+	SCMNET_WHITELIST_CMD_GET_RSP,

+

+	SCMNET_WHITELIST_CMD_CLEAR_REQ,

+	SCMNET_WHITELIST_CMD_CLEAR_RSP,

+	

+} scmnet_whitelist_cmd_e;

+

+//¼Ç¼¿Í»§¶ËµÄmsg key

+typedef struct {

+	struct list_head list;

+	int cli_key;

+} scmnet_whitelist_cli_key_t;

+

+

+/*ÏìÓ¦¶¨Òå*/

+typedef struct {

+	int result;

+} scmnet_whitelist_common_res_t;

+

+typedef struct {

+	int result;

+	char whitelist[2048];

+} scmnet_whitelist_get_res_t;

+

+typedef struct {

+	int enable;;

+}scmnet_whitelist_connect_t;

+

+

+

+/*******************************************************************************

+ *                       Global variable declarations                          *

+ ******************************************************************************/

+

+

+/*******************************************************************************

+ *					  Global function declarations			      			   *

+ ******************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/sctel/sc_tel_msg.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/sctel/sc_tel_msg.h
index b748e54..291e4c2 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/sctel/sc_tel_msg.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/sctel/sc_tel_msg.h
@@ -52,6 +52,9 @@
 	/*NET模块消息基地址*/

 	SC_NET_CMD_BASE = 0x10000401,

 	SC_NET_CMD_END	= 0x10000500,

+	/*mnet_whitelist模块消息基地址*/

+	SC_MNET_WHITELIST_CMD_BASE = 0x10000501,

+	SC_MNET_WHITELIST_CMD_END  = 0x10000600,

 	

 } SC_CMD_BASE_ENUM;

 

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/softap_log.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/softap_log.h
index b2260bf..6d1de10 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/softap_log.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/softap_log.h
@@ -47,6 +47,7 @@
 #define EAP_PRINT	    "[atchn]"
 #define TELSVR_PRINT	"[telsvr]"
 #define ABCLIENT_PRINT	"[abclient]"
+#define MNET_WHITELIST_PRINT	"[mnet_whitelist]"
 
 extern int asprintf(char **strp, const char *fmt, ...);
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/wifi_inter_msg.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/wifi_inter_msg.h
new file mode 100755
index 0000000..4279358
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/wifi_inter_msg.h
@@ -0,0 +1,200 @@
+/**

+ * @file sc_wifi_msg.h

+ * @brief SC Inter-Process-Communication.

+ *

+ * Copyright (C) 2023 Sanechips Technology Co., Ltd.

+ * @author 

+ * @ingroup 

+ * 

+ * This program is free software; you can redistribute it and/or modify

+ * it under the terms of the GNU General Public License version 2 as

+ * published by the Free Software Foundation. 

+ *

+ */

+ 

+#ifndef _WIFI_INTER_MSG_H

+#define _WIFI_INTER_MSG_H

+

+/*******************************************************************************

+ *                           Include header files                              *

+ ******************************************************************************/

+#include "message.h"

+#include "zxic_list.h"

+

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/*******************************************************************************

+ *                             Macro definitions                               *

+ ******************************************************************************/

+

+#define SC_WIFI_ENABLE 1

+#define SC_WIFI_DISABLE 0

+

+#define CASE_RETURN_STR(x) case x: return #x;

+

+/*******************************************************************************

+ *                             Type definitions                                *

+ ******************************************************************************/

+//cap²àwifiÄÚ²¿ÏûÏ¢´¦Àí

+typedef enum { 

+	SCWIFI_CMD_CONN_REQ = MSG_CMD_WIFI_CAP_BASE,

+	SCWIFI_CMD_CONN_RSP,

+		

+	SCWIFI_CMD_ENABLE_REQ, //dev on/off

+	SCWIFI_CMD_ENABLE_RSP,

+

+	SCWIFI_CMD_MODE_REQ,

+	SCWIFI_CMD_MODE_RSP,

+

+	SCWIFI_GET_MODE_REQ,

+	SCWIFI_GET_MODE_RSP,

+

+	SCWIFI_AP_SET_SSID_REQ,

+	SCWIFI_AP_SET_SSID_RSP,

+

+	SCWIFI_AP_SET_HIDE_REQ,

+	SCWIFI_AP_SET_HIDE_RSP,

+

+	SCWIFI_AP_SET_MODE_REQ, //bgnax

+	SCWIFI_AP_SET_MODE_RSP,

+

+	SCWIFI_AP_SET_BW_REQ,  //20/40MHz

+	SCWIFI_AP_SET_BW_RSP,

+

+	SCWIFI_AP_SET_MAX_ACCESS_NUM_REQ,

+	SCWIFI_AP_SET_MAX_ACCESS_NUM_RSP,

+

+	SCWIFI_AP_SET_CC_CH_REQ,

+	SCWIFI_AP_SET_CC_CH_RSP,

+

+	SCWIFI_AP_SET_ACL_REQ,

+	SCWIFI_AP_SET_ACL_RSP,

+

+	SCWIFI_AP_SET_AUTH_REQ,

+	SCWIFI_AP_SET_AUTH_RSP,

+

+	SCWIFI_AP_ENABLE_REQ, //ap on/off

+	SCWIFI_AP_ENABLE_RSP,

+

+	SCWIFI_GET_AP_STATUS_REQ, //ap enable status

+	SCWIFI_GET_AP_STATUS_RSP,

+

+	SCWIFI_GET_AP_PARAM_REQ,

+	SCWIFI_GET_AP_PARAM_RSP,

+

+	//station

+	SCWIFI_STA_SET_PARAM_REQ,

+	SCWIFI_STA_SET_PARAM_RSP,

+

+	SCWIFI_STA_GET_PARAM_REQ,

+	SCWIFI_STA_GET_PARAM_RSP,

+

+	SCWIFI_STA_ENABLE_REQ, //ap on/off

+	SCWIFI_STA_ENABLE_RSP,

+

+	SCWIFI_GET_STA_STATUS_REQ, //ap enable status

+	SCWIFI_GET_STA_STATUS_RSP,

+

+	SCWIFI_STA_SCAN_REQ, //ap on/off

+	SCWIFI_STA_SCAN_RSP,

+	

+	//from wlan proxy

+	SCWIFI_CMD_ENABLE_STATUS_IND,

+	

+	SCWIFI_CMD_AP_STATUS_IND,

+	SCWIFI_CMD_AP_STA_CHA_IND,

+	

+	SCWIFI_CMD_STA_STATUS_IND,

+	SCWIFI_CMD_STA_SCAN_IND,

+

+	SCWIFI_CMD_SERV_ERROR_IND

+	

+} scwifi_cmd_e;

+

+//¼Ç¼¿Í»§¶ËµÄmsg key

+typedef struct {

+	struct list_head list;

+	int cli_key;

+} scwifi_cli_key_t;

+

+

+/*ÏìÓ¦¶¨Òå*/

+typedef struct {

+	int result;

+} scwifi_common_res_t;

+

+typedef struct {

+	int result;

+	int work_mode;

+} scwifi_mode_res_t;

+

+typedef struct {

+	int result;

+	int status;

+	char ifname[32];

+} scwifi_ap_enable_res_t;

+

+//¶ÔÄÚÍ·Îļþ

+//Ö»ÔÚcapÓÃ

+typedef struct {

+	int result;

+	char ssid[33];

+	int ssid_hide;

+	int mode;

+	int bandwidth;

+	int channel;

+	int max_sta_num;

+	char countrycode[3];

+	

+	int acl_rule;

+    char mac_list[360]; 

+

+	char authmode[20];

+	char encrypt[10]; //realtek use

+	char pwd[65];	 	//max 64

+} scwifi_ap_param_res_t;

+

+//Ö»ÔÚcapÓÃ

+typedef struct {

+	int result;

+	char ssid[33];

+	char authmode[20];

+	char encrypt[10];

+	char pwd[65];

+} scwifi_sta_param_res_t;

+

+/*ÇëÇó¶¨Òå,²»×ßap²àµÄÏÈ·ÅÕâ*/

+typedef struct {

+	/*0-disable, 1-enable*/

+	int enable;

+} scwifi_connect_t, scwifi_enable_t;

+

+typedef struct {

+	int work_mode;

+} scwifi_workmode_t;

+

+typedef struct {

+	int idx;

+} scwifi_ap_index_t;

+

+//proxy

+typedef struct {

+	int err_code;

+} scwifi_serv_err_t;

+

+/*******************************************************************************

+ *                       Global variable declarations                          *

+ ******************************************************************************/

+

+

+/*******************************************************************************

+ *					  Global function declarations			      			   *

+ ******************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/wifi_msg.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/wifi_msg.h
index 3cba081..6b8cb1f 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/wifi_msg.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/include/wifi_msg.h
@@ -110,6 +110,12 @@
 	MSG_CMD_WIFI_STATION_DEBUG_DUMP,
 	MSG_CMD_WIFI_STATION_WPA_CMD,
 	MSG_CMD_WIFI_STATION_CONNECTED_ENABLE_AP_CMD, //apstaÁ¬½ÓÈȵã³É¹¦Æô¶¯ap
+	
+	//cap->ap
+	MSG_CMD_CAP_STA_SET_PARAM,	//sta ssid auth pw
+	MSG_CMD_CAP_STA_ENABLE, //ap on off
+	MSG_CMD_CAP_STA_SCAN, //scan
+	
 	MSG_CMD_WIFI_STATION_END,                      //apstationµÄÏûÏ¢·¶Î§end
 
 	//timing of sleep wake up
@@ -130,6 +136,29 @@
 	MSG_CMD_AP_STA_CONNECTED,
 	MSG_CMD_AP_STA_DISCONNECTED,
 
+	//cap recv
+	MSG_CMD_CAP_WIFI_STATUS,
+	MSG_CMD_CAP_AP_STATUS,
+	MSG_CMD_CAP_AP_STA_CHANGE,
+	MSG_CMD_CAP_STA_STATUS,
+	MSG_CMD_CAP_STA_SCAN_RES,
+	
+	//cap send
+	MSG_CMD_CAP_WIFI_ENABLE, 	//wifiÇý¶¯³õʼ»¯, wlan up
+	MSG_CMD_CAP_WIFI_DISABLE, 	//wifiÇý¶¯È¥³õʼ»¯, wlan down
+	MSG_CMD_CAP_WIFI_WORK_MODE, //wifi¹¤×÷ģʽÉèÖÃ
+	MSG_CMD_CAP_WIFI_SET_SSID,	//
+	MSG_CMD_CAP_WIFI_SET_HIDESSID,	//0 not hide, 1 hide
+	MSG_CMD_CAP_WIFI_SET_MODE,	//80211 mode bgn...
+	MSG_CMD_CAP_WIFI_SET_BANDWIDTH,	//0 20M, 1 20/40M
+	//MSG_CMD_CAP_WIFI_SET_CHANNEL,	//0 - 13
+	MSG_CMD_CAP_WIFI_SET_MAXSTANUM,	//0 - 32
+	MSG_CMD_CAP_WIFI_SET_CC_CH, //country code, channel
+	MSG_CMD_CAP_WIFI_SET_ACL,
+	MSG_CMD_CAP_WIFI_SET_AUTH, //wpa
+	MSG_CMD_CAP_WIFI_AP_ENABLE, //ap on off
+
+
 };
 
 
@@ -246,8 +275,8 @@
 /*********************station begin****************/
 
 //#ifndef  __REALTEK_8192_CHIP__
-#if !(defined(__REALTEK_8192_CHIP__) || defined(__SSV_6X5X_CHIP__) || defined(__AIC_8800DW_CHIP__))
-
+//#if !(defined(__REALTEK_8192_CHIP__) || defined(__SSV_6X5X_CHIP__) || defined(__AIC_8800DW_CHIP__))
+#if 0 //¹Ì¶¨Ì¨ÓõÄ, CAP²»ÐèÒª
 
 #define WIFI_STATION_MAC_LEN                20
 #define WIFI_STATION_SSID_LEN               128
@@ -478,4 +507,200 @@
 
 } zte_wlan_set_e_flags;
 
+
+//cap:api->wlan_proxy->ap:wlan_server
+typedef enum
+{
+	IN_WIFI_STATUS_DEV_INIT_FAIL = 0,
+	IN_WIFI_STATUS_INVALID_MAC
+} inner_wifi_status_e;
+
+//nei bu zhuan huan yong
+//same as sc_wifi_ap_index_e
+typedef enum
+{
+	IN_WIFI_AP_INDEX_MIN = -1,
+	IN_WIFI_AP_INDEX_AP0 = 0,
+	//IN_WIFI_AP_INDEX_AP1,
+	IN_WIFI_AP_INDEX_MAX
+} inner_wifi_ap_id_e;
+
+typedef struct {
+	int idx; 			//refers to: wlan0,1... 
+	char ssid[WIFI_SSID_LEN]; 	//ssid should be less than 32 bytes
+} wlan_ap_ssid_t;
+
+typedef struct {
+	int idx; 			//refers to: wlan0,1... 
+	int ssid_hide; 				//0 not hide, 1 hide
+} wlan_ap_ssid_hide_t;
+
+typedef struct {
+	int idx; 			//refers to: wlan0,1... 
+	int wl_mode; 				//6 bgnax, 4 bgn
+} wlan_ap_wl_mode_t;
+
+typedef struct {
+	int idx; 			//refers to: wlan0,1... 
+	int htMode; 				//1 20/40M, 0 20M
+	//int force_40m;
+} wlan_ap_bandwidth_t;
+
+typedef struct {
+	int idx; 			//refers to: wlan0,1... 
+	int max_sta_num; 			//1-32
+} wlan_ap_max_sta_t;
+
+typedef struct {
+	int idx; 			//refers to: wlan0,1... 
+	char countrycode[3]; 		//default CN
+	int channel;  //0-13
+} wlan_ap_cc_ch_t;
+
+typedef struct {
+	int idx; 			//refers to: wlan0,1... 
+	int acl_rule; 				//0 none, 1 white, 2 black
+	char acl_list[360]; 		//max 10 mac1;mac2...
+} wlan_ap_acl_t;
+
+typedef struct {
+	int idx; 			//refers to: wlan0,1... 
+	char authmode[WLAN_SECURITY_LEN];
+	char encrypt[WLAN_ENCRYPT_LEN]; //realtek use
+	char pwd[WLAN_PSK_LEN];	 	//max 64
+} wlan_ap_auth_t;
+
+typedef struct {
+	int idx; 			//refers to: wlan0,1... 
+	int enable; 			//1 ap on , 0 ap off
+} wlan_ap_enable_t;
+
+//station
+typedef struct {
+	int enable; 			//1 ap on , 0 ap off
+} wlan_sta_enable_t;
+
+
+//ap->cap:ind 
+//½á¹¹Ìå,ºÃÀ©Õ¹
+typedef struct {
+	int wifi_status;
+} wlan_status_t;
+
+//same as sc_wifi_work_mode_e  to do: hu huan
+typedef enum
+{
+	IN_WIFI_WORK_MODE_MIN = -1,
+	IN_WIFI_WORK_MODE_AP0 = 0,
+	IN_WIFI_WORK_MODE_AP0_STA,
+	IN_WIFI_WORK_MODE_MAX
+} inner_wifi_work_mode_e;
+
+//same as sc_wifi_ap_status_e
+typedef enum
+{
+	IN_WIFI_AP_STATUS_NONE = 0,
+	IN_WIFI_AP_STATUS_IDLE, //or disable
+	IN_WIFI_AP_STATUS_ENABLING,
+	IN_WIFI_AP_STATUS_ENABLED,
+	IN_WIFI_AP_STATUS_DISABLING,
+	IN_WIFI_AP_STATUS_ERROR
+} inner_wifi_ap_status_e;
+
+typedef struct {
+	int idx;
+	int pre_status; //½öcap×ÔÐи³Öµ
+	int status;
+	char ifname[32];
+	//char bssid[18];
+} wlan_ap_status_t;
+
+//sc_wifi_sta_connect_status_t
+typedef struct {
+	int idx;
+	int is_connected;
+	char macaddr[18];
+} wlan_sta_connect_status_t;
+
+//cap station
+typedef struct {
+	char ssid[WIFI_SSID_LEN]; 	//ssid should be less than 32 bytes
+	char authmode[WLAN_SECURITY_LEN];
+	char encrypt[WLAN_ENCRYPT_LEN]; //realtek use
+	char pwd[WLAN_PSK_LEN];	 	//max 64
+} wlan_sta_param_t;
+
+//same as sc_wifi_sta_status_e
+typedef enum
+{
+	IN_WIFI_STA_STATUS_NONE, //close
+	IN_WIFI_STA_STATUS_IDLE,
+	IN_WIFI_STA_STATUS_CONNECTING, //Trying to associate with
+	IN_WIFI_STA_STATUS_ASSOCIATED, //dhcping
+	IN_WIFI_STA_STATUS_CONNECTED,
+	IN_WIFI_STA_STATUS_DISCONNECTED, 
+	IN_WIFI_STA_STATUS_ERROR
+} in_wifi_sta_status_e;
+
+//same as sc_wifi_reason_code_e
+typedef enum
+{
+	IN_WIFI_REASON_CODE_NONE,
+	IN_WIFI_REASON_CODE_WRONG_KEY,
+	IN_WIFI_REASON_CODE_AUTH_FAILED,
+	IN_WIFI_REASON_CODE_CONN_FAILED,
+	IN_WIFI_REASON_CODE_SET_FAILED,
+	IN_WIFI_REASON_CODE_DHCP_FAILED
+} in_wifi_reason_code_e;
+
+//same as sc_wifi_sta_status_t
+typedef struct {
+	int pre_status; //proxy record
+
+	int status; //in_wifi_sta_status_e
+	char ifname[32];
+	char ap_bssid[18]; //cur ap mac
+	//int rssi;
+	unsigned char signal_level;
+	unsigned char has_addr;
+	char str_addr[16]; //255.255.255.255 16
+	unsigned char has_addr6;
+	char str_addr6[48]; //0001:0002:0003:0004:0001:0002:0003:0004 40 (+8:, 48)
+	int reason_code; //in_wifi_reason_code_e	
+} wlan_sta_status_t;
+
+typedef struct {
+	int result;
+	wlan_sta_status_t status;
+} scwifi_sta_stat_res_t;
+
+
+#define CAP_WIFI_MAX_SCAN_CNT 30
+
+#define CAP_WIFI_AUTH_UNSUP -1 //"not support");
+#define CAP_WIFI_AUTH_OPEN 0 //"OPEN");
+#define CAP_WIFI_AUTH_WPA2 1 //"WPA2PSK");
+#define CAP_WIFI_AUTH_WPA3 2 //"WPA3Personal");
+#define CAP_WIFI_AUTH_WPA12 3 //"WPAPSKWPA2PSK");
+#define CAP_WIFI_AUTH_WPA23 4 //"WPA2WPA3");
+
+//sc_wifi_sta_scan_info_t
+typedef struct
+{
+	char bssid[18];//mac
+	char essid[33];
+	//int signal;
+	unsigned char signal_level; //0-5, max 5
+	//int frequency;
+	unsigned char channel; //1-13
+	unsigned char auth;
+} wlan_sta_scan_info_t;
+
+//sc_wifi_sta_scan_list_t
+typedef struct
+{
+	int cnt;
+	wlan_sta_scan_info_t info[CAP_WIFI_MAX_SCAN_CNT];
+} wlan_sta_scan_list_t;
+
 #endif
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libatext/ext_normal_func.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libatext/ext_normal_func.c
index 1a55a39..f82b2c2 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libatext/ext_normal_func.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libatext/ext_normal_func.c
@@ -10,6 +10,9 @@
 **********************************************************************************/

 

 #if (APP_OS_TYPE == APP_OS_LINUX)

+#include <stdio.h>
+#include <stdlib.h>

+#include <termios.h>

 #include "ext_regist.h"

 #include "softap_api.h"

 #include "at_utils.h"

@@ -26,11 +29,203 @@
 //#include "libcpnv.h"

 

 

+//========================================================================================================//

+//ºê¶¨Òå

+//========================================================================================================//

+

+#define USB_ATTR_ADB_SWITCH       "/sys/gen_usb/usb_state/adb_switch"

+

+#define AP_WORK_LOCK "ap_work_lock"

+#define BUF_LEN 32

+

+/*baud rate flags*/

+typedef enum {

+	B_300 		= 300,

+	B_600 		= 600,

+	B_1200 		= 1200,

+	B_2400 		= 2400,

+	B_4800 		= 4800,

+	B_9600 		= 9600,

+	B_19200 	= 19200,

+	B_38400 	= 38400,

+	B_57600 	= 57600,

+	B_115200 	= 115200,

+	B_230400 	= 230400,

+	B_460800 	= 460800,

+	B_500000    = 500000,

+	B_576000	= 576000,

+	B_921600	= 921600,

+	B_1000000	= 1000000,

+	B_1152000	= 1152000,	

+	B_1500000	= 1500000, 

+	B_2000000	= 2000000,

+	B_2500000	= 2500000, 	

+	B_3000000	= 3000000,

+	B_3500000	= 3500000, 

+	B_4000000	= 4000000,

+}EXT_BAUD_RATE;

 

 //========================================================================================================//

 //º¯ÊýʵÏÖÇø

 //========================================================================================================//

-#define AP_WORK_LOCK "ap_work_lock"

+
+/*¶ÁдÎļþÏà¹Ø²Ù×÷begin*/
+static int ext_filelength(FILE *fp)

+{
+    int num;
+    fseek(fp,0,SEEK_END);
+    num=ftell(fp);
+    fseek(fp,0,SEEK_SET);
+    return num;
+}
+
+int ext_readfile(char *path, char* buf, unsigned len)

+{
+    FILE *fp;
+    unsigned int length;
+    if((fp=fopen(path,"r"))==NULL)
+    {
+        //slog(USBCFGMNG_PRINT,SLOG_ERR, "[usbCfgMng] open file %s error.\n",path);
+        return -1;
+    }
+    length=ext_filelength(fp);

+    length = length > len? len: length;
+    //ch=(char *)malloc(length+1);
+    int read_len = fread(buf,length,1,fp);
+    if(read_len < 1)  // cov M CHECKED_RETURN
+    {
+        //slog(SDCARD_PRINT, SLOG_ERR, "fread %s error.\n",path); 
+    }
+	
+    fclose(fp);
+    *(buf+length) = '\0';
+    return (int)length;
+}

+

+
+int ext_writefile(char*path, char*buf, unsigned len)

+{
+    FILE *fp;
+    int rtv = 0;
+    if((fp=fopen(path,"w"))==NULL)
+    {
+        return -1;
+    }
+    rtv = fwrite(buf,len,1, fp);
+    fclose(fp);
+    return rtv;
+}

+

+
+int32_t ext_com_Convbaud(int32_t iBaudrate)

+{
+    switch(iBaudrate)
+    {
+        case B_300:
+            return B300;
+        case B_600:
+            return B600;
+        case B_1200:
+            return B1200;
+        case B_2400:
+            return B2400;
+        case B_4800:
+            return B4800;
+        case B_9600:
+            return B9600;
+        case B_19200:
+            return B19200;
+        case B_38400:
+            return B38400;
+        case B_57600:
+            return B57600;
+        case B_115200:
+            return B115200;
+        case B_230400:
+            return B230400;
+        case B_460800:
+            return B460800;
+        case B_500000:
+            return B500000;
+        case B_576000:
+            return B576000;
+        case B_921600:
+            return B921600;

+        case B_1000000:

+            return B1000000;

+        case B_1152000:

+            return B1152000;

+        case B_1500000:

+            return B1500000;

+        case B_2000000:

+            return B2000000;

+        case B_2500000:

+            return B2500000;

+        case B_3000000:
+            return B3000000;

+        case B_3500000:

+            return B3500000;

+        case B_4000000:
+            return B4000000;
+        default:
+            return B115200;
+    }
+}
+
+int32_t ext_iFnBaudconv(int32_t Baudrate)

+{
+    switch(Baudrate)
+    {
+    	case B300:
+			return B_300;
+    	case B600:
+			return B_600;
+        case B1200:
+            return B_1200;
+        case B2400:
+            return B_2400;
+        case B4800:
+            return B_4800;
+        case B9600:
+            return B_9600;
+        case B19200:
+            return B_19200;
+        case B38400:
+            return B_38400;
+        case B57600:
+            return B_57600;
+        case B115200:
+            return B_115200;
+	 case B230400:

+            return B_230400;
+        case B460800:
+            return B_460800;
+        case B500000:
+            return B_500000;
+        case B576000:
+            return B_576000;
+        case B921600:
+            return B_921600;

+        case B1000000:

+            return B_1000000;

+        case B1152000:

+            return B_1152000;

+        case B1500000:

+            return B_1500000;

+        case B2000000:

+            return B_2000000;

+        case B2500000:

+            return B_2500000;

+        case B3000000:
+            return B_3000000;

+        case B3500000:

+            return B_3500000;

+        case B4000000:
+            return B_4000000;
+        default:
+            return B_115200;
+    }
+}

 

 /* ͨ¹ýAT ¿Ú½øÐÐshellÃüÁîµ÷ÊÔ*/

 int ext_atshell_req(int at_fd,char * at_paras,void **res_msg,int * res_msglen)

@@ -188,6 +383,199 @@
 	return AT_CONTINUE;

 }

 

+int adbswitchSet_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+{

+	int ret = 0;

+	char*  at_str = NULL;

+	int32_t user_cmd = 0;

+	int curr_state = -1;

+

+	char read_buf[BUF_LEN] = {0};

+	memset(read_buf, 0, BUF_LEN);	

+		

+	if(at_paras==NULL)

+		softap_assert("adbswitchSet_req:at_paras is null");

+	

+	at_str = at_paras;

+	printf("adbswitchSet_req:: at_str:%s\n", at_str);

+	get_at_cmd_param_int(at_str, &user_cmd, &at_str);

+	printf("adbswitchSet_req:: user_cmd:%d\n", user_cmd);

+	

+	if((user_cmd != 1) && (user_cmd != 2)){

+		printf("adbswitchSet_req:: invaild user_cmd == %d\n", user_cmd);

+		*res_msg = at_err_build(ATERR_PARAM_INVALID);	

+		goto AT_RESULT;

+	}

+

+	printf("adbswitchSet_req:user_cmd == %d, adb switch to %s\n", user_cmd, (user_cmd == 1 ? "CAP" : "AP"));

+

+	ret = ext_readfile(USB_ATTR_ADB_SWITCH, read_buf, BUF_LEN);

+	if(ret < 0){

+		printf("adbswitchSet_req:: read adb switch attr fail \n");

+		*res_msg = at_err_build(ATERR_PARAM_INVALID);	

+		goto AT_RESULT;		

+	}

+	

+	curr_state = atoi(read_buf);

+	printf("adbswitchSet_req:: curr_state:%d, read_buf:%s",curr_state, read_buf);

+	if(curr_state == user_cmd){

+		goto AT_OK;

+	}

+	

+	//write this attr, 

+	ret = ext_writefile(USB_ATTR_ADB_SWITCH, (user_cmd == 1) ? "1" : "2", 1);

+	if(ret < 0){

+		 printf("adbswitchSet_req:set attr fail \n");

+		*res_msg = at_err_build(ATERR_PARAM_INVALID);	

+		 goto AT_RESULT;

+	}

+	

+AT_OK:	

+	*res_msg = at_ok_build();	

+	

+AT_RESULT:	

+	*res_msglen = strlen(*res_msg);

+

+    return AT_END;

+}

+

+int adbswitchGet_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+{

+

+	int ret = 0;

+

+	char read_buf[BUF_LEN] = {0};

+	memset(read_buf, 0, BUF_LEN);

+

+	ret = ext_readfile(USB_ATTR_ADB_SWITCH, read_buf, BUF_LEN);

+	if(ret < 0){

+		printf("adbswitchSet_req:: read adb switch attr fail \n");

+		*res_msg = at_err_build(ATERR_PARAM_INVALID);	

+		goto AT_RESULT;		

+	}

+

+	*res_msg = at_query_result_build("adbswitch",read_buf);

+

+AT_RESULT:	

+	*res_msglen = strlen(*res_msg);

+

+	return AT_END;

+}

+

+

+int ziprSet_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+{

+	char*  at_str = NULL;

+	int32_t iBaudrate = 0;

+	char strAtReplyCmd[AT_CMD_MAX] = {0};

+	struct termios tOldTermios = {0};	

+

+	if(at_paras==NULL)

+			softap_assert("ziprSet_req:at_paras is null");

+		

+	at_str = at_paras;

+	get_at_cmd_param_int(at_str, &iBaudrate, &at_str);

+	at_print(AT_DEBUG,"ziprSet_rsq:iBaudrate == %d\n", iBaudrate);

+	if (iBaudrate <= 0 || iBaudrate > 4000000) //kw 3

+		iBaudrate = 0;

+

+	bzero(&tOldTermios, sizeof(tOldTermios));

+	tcgetattr(at_fd, &tOldTermios); // get the serial port attributions

+

+	//set buad rate

+	iBaudrate = ext_com_Convbaud(iBaudrate);

+	tcflush(at_fd, TCIOFLUSH);

+	cfsetispeed(&tOldTermios, iBaudrate);

+	cfsetospeed(&tOldTermios, iBaudrate);

+	if(tcsetattr(at_fd, TCSANOW, &tOldTermios) != 0)  //ÉèÖÃÐÂÊôÐÔ, TCSANOW: ËùÓɸıäÁ¢¼´ÉúЧ

+	{	

+		return -EPERM;;

+	}

+

+	tcflush(at_fd, TCIOFLUSH);	

+	sleep(1);

+

+	sprintf(strAtReplyCmd,"%d", iBaudrate);

+	*res_msg = at_query_result_build("IPR",strAtReplyCmd);

+	*res_msglen = strlen(*res_msg);

+

+	return AT_END;

+}

+

+int ziprGet_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+{

+    struct termios tOldTermios = {0};

+    int32_t iBaudrate = 0;

+    char strAtReplyCmd[AT_CMD_MAX] = {0};

+

+    tcgetattr(at_fd, &tOldTermios); // get the serial port attributions

+    iBaudrate = ext_iFnBaudconv(cfgetispeed(&tOldTermios));

+

+    sprintf(strAtReplyCmd,"%d", iBaudrate);	

+	*res_msg = at_query_result_build("IPR",strAtReplyCmd);

+	*res_msglen = strlen(*res_msg);

+	

+    return AT_END;

+}

+

+int zflowcontrolset_req(int at_fd,char * at_paras,void * *res_msg,int * res_msglen)

+{

+	int cFctl = -1;

+	//void *p[1] = {&cFctl};

+

+	char*  at_str = NULL;

+  //  parse_param2("%d", at_paras, p);

+

+	if(at_paras==NULL)

+			softap_assert("ziprSet_req:at_paras is null");

+		

+	at_str = at_paras;

+	get_at_cmd_param_int(at_str, &cFctl, &at_str);  

+    at_print(AT_NORMAL,"zflowcontrolset_req:cFctl = %d\n", cFctl);

+

+	switch(cFctl)

+	{

+		case 0://¹Ø±ÕÁ÷¿Ø

+		{

+			//sc_cfg_set("uart_control","1");

+			sc_cfg_set("uart_ctstrs_enable","");

+			sc_cfg_set("uart_softcontrol_enable","");

+			*res_msg = at_ok_build();

+			*res_msglen = strlen(*res_msg);

+			sc_cfg_save();

+			ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MAIN_CTRL, MSG_CMD_RESTART_REQUEST, 0, NULL,0);

+			break;

+		}

+		case 1://¿ªÆôÓ²¼þÁ÷¿Ø

+		{

+			//sc_cfg_set("uart_control","1");

+			sc_cfg_set("uart_ctstrs_enable","1");

+			sc_cfg_set("uart_softcontrol_enable","");

+			*res_msg = at_ok_build();

+			*res_msglen = strlen(*res_msg);

+			sc_cfg_save();

+			ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MAIN_CTRL, MSG_CMD_RESTART_REQUEST, 0, NULL,0);

+			break;

+		}

+		case 2://¿ªÆôÈí¼þÁ÷¿Ø

+		{

+			sc_cfg_set("uart_ctstrs_enable","");

+			sc_cfg_set("uart_softcontrol_enable","1");

+			*res_msg = at_ok_build();

+			*res_msglen = strlen(*res_msg);

+			sc_cfg_save();

+			ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MAIN_CTRL, MSG_CMD_RESTART_REQUEST, 0, NULL,0);

+			break;

+		}

+		default:

+		{

+			*res_msg = at_err_build(ATERR_PARAM_INVALID);

+			*res_msglen = strlen(*res_msg);

+			break;

+		}

+	}

+	return AT_END;

+}

 

 int  ext_normal_regist(void)

 {

@@ -200,7 +588,18 @@
 	//Íâ²¿Ëø¿ªÆôÊÍ·ÅÃüÁî

 	register_serv_func("ZWORKLOCKCAP=", 0, ext_worklock_set_func);

 	register_fwd_func("ate",ate_req_rcv_act,NULL,NULL);

-	

+

+	//cmd set &check adb switch state

+	register_serv_func2("adbswitch?",0,0,0,adbswitchGet_req,NULL);

+	register_serv_func2("adbswitch=",0,0,0,adbswitchSet_req,NULL);	

+

+

+	//¹Ì¶¨²¨ÌØÂÊÉèÖúͲéѯÃüÁî

+	register_serv_func2("ipr=",0,0,0,ziprSet_req,NULL);	

+	register_serv_func2("ipr?",0,0,0,ziprGet_req,NULL);

+

+	register_serv_func2("ifc=",0,0,0,zflowcontrolset_req,NULL);	

+		

 	return 0;

 }

 

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libflags/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libflags/Makefile
new file mode 100755
index 0000000..557d792
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libflags/Makefile
@@ -0,0 +1,37 @@
+#*******************************************************************************
+# include ZTE library makefile
+#*******************************************************************************
+include $(COMMON_MK)
+
+##############USER COMIZE BEGIN################
+
+LIB_STATIC = libflags.a
+LIB_SHARED = libflags.so
+
+OBJS = $(patsubst %.c,%.o,$(wildcard *.c))
+
+#CFLAGS += -I$(zte_app_path)/at_ctl/inc
+#CFLAGS += -I$(zte_lib_path)/libatutils
+CFLAGS += -I$(LINUX_DIR)/include
+CFLAGS += -g
+
+
+##############USER COMIZE END##################
+
+CFLAGS += -I$(zte_app_path)/include
+CFLAGS += -fPIC
+LDFLAGS += -shared
+
+all: $(LIB_STATIC) $(LIB_SHARED)
+
+$(LIB_STATIC) : $(OBJS)
+	$(AR) rcs $(LIB_STATIC) $(OBJS)
+
+$(LIB_SHARED): $(OBJS)
+	$(CC) $(LDFLAGS) -o $@ $^
+
+romfs:
+	$(ROMFSINST) $(LIB_SHARED) /lib/$(LIB_SHARED)
+
+clean:
+	-$(RM) *.a *.o *.so $(LIB_SHARED) $(LIB_STATIC) $(OBJS)
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libflags/flags_api.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libflags/flags_api.c
new file mode 100755
index 0000000..feac1ca
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libflags/flags_api.c
@@ -0,0 +1,882 @@
+/**

+ * @file flags_api.c

+ * @brief flags·ÖÇø½Ó¿ÚʵÏÖ

+ *

+ * Copyright (C) 2023 Sanechips Technology Co., Ltd.

+ * @author 

+ * 

+ * This program is free software; you can redistribute it and/or modify

+ * it under the terms of the GNU General Public License version 2 as

+ * published by the Free Software Foundation. £¨±ØÑ¡£ºGPLv2 Licence£©

+ *

+ */

+

+

+/*******************************************************************************

+ *                           Include header files                              *

+ ******************************************************************************/

+#include <stdio.h>

+#include <stdlib.h>

+#include <unistd.h>

+#include <string.h>

+#include <errno.h>

+#include <sys/ioctl.h>

+#include <sys/stat.h>

+#include <fcntl.h>

+#include <mtd/mtd-abi.h>

+

+#include "pub_flags.h"

+

+#include "flags_log.h"

+#include "flags_api.h"

+

+

+/*******************************************************************************

+ *                             Macro definitions                               *

+ ******************************************************************************/

+#define MAX_PATH_LEN (256)

+

+#define PARTITION_NAME_FLAGS "flags"

+

+#define FLAGS_INIT_VALID_BLOCKS_NUM	(8)

+

+#define GOOD_BLOCK (0)

+#define BAD_BLOCK (1)

+

+#define FILE_PATH_PROC_CMDLINE "/proc/cmdline"

+

+#define PROC_CMDLINE_SYSTEM_A_FLAG   "system=system_a"

+#define PROC_CMDLINE_SYSTEM_B_FLAG   "system=system_b"

+

+#define SYSTEM_INDEX_UNKNOWN (-1)

+#define SYSTEM_INDEX_1 (1)

+#define SYSTEM_INDEX_2 (2)

+

+

+/*******************************************************************************

+ *                             Type definitions                                *

+ ******************************************************************************/

+typedef struct

+{

+    unsigned int mtd_totalsize;				// mtd device total size

+    unsigned int mtd_pageperblock;			// mtd device page per block

+    unsigned int mtd_blocksize;				// mtd device block size

+    unsigned int mtd_pagesize;				// mtd device page size

+    unsigned int mtd_oobsize;				// mtd device oob size

+    int parti_file_desc;					// partition update file description

+} partition_mtd_info_t;

+

+

+typedef enum

+{

+    DEVICE_MTD = 0,

+    DEVICE_ZFTL = 1,

+    DEVICE_MTD_BLOCK,

+} device_type_t;

+

+

+/*******************************************************************************

+ *						   Local variable definitions						   *

+ ******************************************************************************/

+

+

+/*******************************************************************************

+ *						  Global variable definitions						   *

+ ******************************************************************************/

+

+

+/*******************************************************************************

+ * 					   Local function declarations							   *

+ ******************************************************************************/

+static int mtd_get(const char *i_parti_name, device_type_t device_type, char *o_mtd_path, unsigned int o_mtd_path_len);

+static int write_flags_info(partition_mtd_info_t *p_mtd_info, int index, unsigned char *content, int len);

+

+static int get_flags_info(T_FLAGS_INFO *p_main, int *p_main_index, T_FLAGS_INFO *p_backup, int *p_backup_index);

+static int set_flags_info(T_FLAGS_INFO *p_flags_info, int *p_main_index, int *p_backup_index);

+

+static void copy_flags_info(T_FLAGS_INFO *dst, T_FLAGS_INFO *src);

+

+static int get_current_system();

+

+

+/*******************************************************************************

+ * 					 Local function implementations 						   *

+ ******************************************************************************/

+static int mtd_get(const char *i_parti_name, device_type_t device_type, char *o_mtd_path, unsigned int o_mtd_path_len)

+{

+    FILE *fp_mtd = 0;

+    char buf[128];

+    char *line_str;

+

+    if (!o_mtd_path_len)

+    {

+        return -1;

+    }

+

+    fp_mtd = fopen("/proc/mtd", "r+");

+    if (NULL == fp_mtd)

+    {

+        flags_err("open file error: %s", strerror(errno));

+        return -1;

+    }

+    // printf("[libmtd]: partition name:%s\n", i_parti_name);

+

+    while (1)

+    {

+        int matches = 0;

+        char mtdname[64] = {0};

+        int mtdnum = 0;

+        unsigned int mtdsize, mtderasesize;

+        memset(buf, 0, sizeof(buf));

+        line_str = fgets(buf, sizeof(buf) - 1, fp_mtd);

+

+        if (NULL == line_str)

+        {

+            flags_err("get info from mtd error: %s", strerror(errno));

+            fclose(fp_mtd);

+            return -1;

+        }

+        // mtd5: 00100000 00020000 "fotaflag"

+        matches = sscanf(buf, "mtd%d: %x %x \"%63[^\"]",

+                         &mtdnum, &mtdsize, &mtderasesize, mtdname);

+        mtdname[63] = '\0';

+

+        if ((matches == 4) && (strcmp(mtdname, i_parti_name) == 0))

+        {

+            memset(o_mtd_path, 0, o_mtd_path_len);

+            if (device_type == DEVICE_MTD_BLOCK)

+            {

+                snprintf(o_mtd_path, o_mtd_path_len, "/dev/mtdblock%d", mtdnum);

+            }

+            else if (device_type == DEVICE_MTD)

+            {

+                snprintf(o_mtd_path, o_mtd_path_len, "/dev/mtd%d", mtdnum);

+            }

+            else if (device_type == DEVICE_ZFTL)

+            {

+                snprintf(o_mtd_path, o_mtd_path_len, "/dev/zftl%d", mtdnum);

+            }

+            else

+            {

+                flags_err("unknown device type %d", device_type);

+                fclose(fp_mtd);

+                return -1;

+            }

+            // printf("[libmtd]: o_mtd_path=[%s]\n", o_mtd_path);

+            break;

+        }

+    }

+    fclose(fp_mtd);

+    return 0;

+}

+

+

+static int write_flags_info(partition_mtd_info_t *p_mtd_info, int index, unsigned char *content, int len)

+{

+    struct erase_info_user erase_info;

+    int write_len = 0;

+    long long  offs = 0;

+

+    erase_info.start = index * p_mtd_info->mtd_blocksize;

+    erase_info.length = p_mtd_info->mtd_blocksize;

+

+    offs = (long long)index * p_mtd_info->mtd_blocksize;

+	

+    if (ioctl(p_mtd_info->parti_file_desc, MEMGETBADBLOCK, &offs) != 0)

+    {

+        flags_err("ioctl [MEMGETBADBLOCK] block: %d, change to be bad block, errno=%d, strerror=[%s]", index, errno, strerror(errno));

+		

+        return BAD_BLOCK;

+    }

+

+    if (ioctl(p_mtd_info->parti_file_desc, MEMERASE, &erase_info) < 0)

+    {

+        flags_err("ioctl [MEMERASE] block: %d fail, errno=%d, strerror=[%s]", index, errno, strerror(errno));

+		

+        return -1;

+    }

+

+    if (ioctl(p_mtd_info->parti_file_desc, MEMGETBADBLOCK, &offs) != 0)

+    {

+        flags_err("ioctl [MEMGETBADBLOCK] block:%d , change to be bad block, errno=%d, strerror=[%s]", index, errno, strerror(errno));

+		

+        return BAD_BLOCK;

+    }

+

+    if (lseek(p_mtd_info->parti_file_desc, index * p_mtd_info->mtd_blocksize, SEEK_SET) < 0)

+    {

+        flags_err("lseek fail, errno=%d, strerror=[%s]", errno, strerror(errno));

+		

+        return -1;

+    }

+

+    write_len = write(p_mtd_info->parti_file_desc, content, p_mtd_info->mtd_blocksize);

+

+    if (write_len != p_mtd_info->mtd_blocksize)

+    {

+        flags_err("write flash fail, errno=%d, strerror=[%s]", errno, strerror(errno));

+		

+        return -1;

+    }

+	

+    return 0;

+}

+

+

+static int get_flags_info(T_FLAGS_INFO *p_main, int *p_main_index, T_FLAGS_INFO *p_backup, int *p_backup_index)

+{

+    int ret = -1;

+    int fd_dst = -1;

+    char mtd_path[MAX_PATH_LEN] = {0};

+    struct mtd_info_user meminfo = {0};

+    partition_mtd_info_t mtd_info = {0};

+    int index  = 0;

+    int block_num = 0;

+    int good_index = 0;

+    int read_len  = 0;

+

+    long long offs = 0;

+

+    int block_flag = GOOD_BLOCK;

+

+    ret = mtd_get(PARTITION_NAME_FLAGS, DEVICE_MTD, mtd_path, MAX_PATH_LEN);

+    if (ret < 0)

+    {

+        flags_err("partition [%s] not find", PARTITION_NAME_FLAGS);

+        goto error;

+    }

+

+    if ((fd_dst = open(mtd_path, O_RDWR | O_SYNC)) < 0)

+    {

+        flags_err("open flash error, errno=%d, strerror=[%s]", errno, strerror(errno));

+        goto error;

+    }

+	

+    mtd_info.parti_file_desc = fd_dst;

+

+    if (ioctl(fd_dst, MEMGETINFO, &meminfo) != 0)

+    {

+        flags_err("get flash info error, errno=%d, strerror=[%s]", errno, strerror(errno));

+        goto error_close;

+    }

+

+    mtd_info.mtd_blocksize		= meminfo.erasesize;

+    mtd_info.mtd_oobsize		= meminfo.oobsize;

+    mtd_info.mtd_pageperblock 	= meminfo.erasesize / meminfo.writesize;

+    mtd_info.mtd_pagesize 		= meminfo.writesize;

+    mtd_info.mtd_totalsize		= meminfo.size;

+

+    block_num = mtd_info.mtd_totalsize / mtd_info.mtd_blocksize;

+

+    for (index = 0; (good_index < 2 && index < block_num); index++)

+    {

+

+        offs = index * mtd_info.mtd_blocksize;

+        if (ioctl(mtd_info.parti_file_desc, MEMGETBADBLOCK, &offs) == 0)

+        {

+            block_flag = GOOD_BLOCK;

+        }

+        else

+        {

+            flags_err("flags block [%d] is bad, errno=%d, strerror=[%s]", index, errno, strerror(errno));

+            block_flag =  BAD_BLOCK;

+        }

+

+        if (block_flag == GOOD_BLOCK)

+        {

+            if (lseek(mtd_info.parti_file_desc, index * mtd_info.mtd_blocksize, SEEK_SET) < 0)

+            {

+                flags_err("lseek error, errno=%d, strerror=[%s]", errno, strerror(errno));

+                goto error_close;

+            }

+

+            if (good_index == 0)

+            {

+                read_len = read(mtd_info.parti_file_desc, (unsigned char*)p_main, sizeof(T_FLAGS_INFO));

+                *p_main_index = index;

+            }

+            else if (good_index == 1)

+            {

+                read_len = read(mtd_info.parti_file_desc, (unsigned char*)p_backup, sizeof(T_FLAGS_INFO));

+                *p_backup_index = index;

+            }

+            else

+            {

+                break;

+            }

+

+            if (read_len < sizeof(T_FLAGS_INFO))

+            {

+                flags_err("read len (%d) < need len (%d)", read_len, sizeof(T_FLAGS_INFO));

+                goto error_close;

+            }

+

+            good_index++;

+        }

+

+    }

+

+    close(fd_dst);

+

+    return 0;

+

+error_close:

+    close(fd_dst);

+

+error:

+    return -1;

+}

+

+

+static int set_flags_info(T_FLAGS_INFO *p_flags_info, int *p_main_index, int *p_backup_index)

+{

+    int ret = -1;

+    int fd_dst = -1;

+    char mtd_path[MAX_PATH_LEN] = {0};

+    struct mtd_info_user meminfo = {0};

+    partition_mtd_info_t mtd_info = {0};

+

+    unsigned char *real_write_content = NULL;

+

+    int index  = 0;

+    int block_num = 0;

+    int main_index = *p_main_index;

+    int back_index = *p_backup_index;

+

+    ret = mtd_get(PARTITION_NAME_FLAGS, DEVICE_MTD, mtd_path, MAX_PATH_LEN);

+    if (ret < 0)

+    {

+        flags_err("partition [%s] not found", PARTITION_NAME_FLAGS);

+		

+        return -1;

+    }

+

+    if ((fd_dst = open(mtd_path, O_RDWR | O_SYNC)) < 0)

+    {

+        flags_err("open flash error, errno=%d, strerror=[%s]", errno, strerror(errno));

+        return -1;

+    }

+

+    if (ioctl(fd_dst, MEMGETINFO, &meminfo) != 0)

+    {

+        flags_err("get flash info error, errno=%d, strerror=[%s]", errno, strerror(errno));

+        goto error;

+    }

+

+    mtd_info.parti_file_desc 	= fd_dst;

+    mtd_info.mtd_blocksize		= meminfo.erasesize;

+    mtd_info.mtd_oobsize		= meminfo.oobsize;

+    mtd_info.mtd_pageperblock 	= meminfo.erasesize / meminfo.writesize;

+    mtd_info.mtd_pagesize 		= meminfo.writesize;

+    mtd_info.mtd_totalsize		= meminfo.size;

+

+    block_num = mtd_info.mtd_totalsize / mtd_info.mtd_blocksize;

+

+    real_write_content = (unsigned char *)malloc(mtd_info.mtd_blocksize);

+    if (NULL == real_write_content)

+    {

+        flags_err("malloc block fail");

+        goto error;

+    }

+

+    memset(real_write_content, 0xFF, mtd_info.mtd_blocksize);

+    memcpy(real_write_content, (char *)p_flags_info, sizeof(T_FLAGS_INFO));

+	

+    flags_log("begin to write main flags");

+

+    for (index = 0; index < block_num; index++)

+    {

+        if (index == back_index)

+        {

+            continue;

+        }

+

+        ret = write_flags_info(&mtd_info, index, real_write_content, mtd_info.mtd_blocksize);

+        if (ret == 0)

+        {

+            // д³É¹¦£¬Í˳ö£¬²¢¸üеÚÒ»¿éλÖÃ

+            flags_log("main flags location: [%d]->[%d]", main_index, index);

+            main_index = index;

+            break;

+        }

+        else if (ret == BAD_BLOCK)

+        {

+            // Óöµ½»µ¿é£¬ÏòºóÌøÒ»¿é

+            flags_log("flags block index [%d] is bad", index);

+            continue;

+        }

+        else

+        {

+            flags_err("write main flags fail");

+            main_index = -1;

+            break;

+        }

+    }

+

+    flags_log("begin to write backup flags");

+

+    for (index = 0; index < block_num; index++)

+    {

+        if (index == main_index)

+        {

+            continue;

+        }

+

+        flags_log("write backup to [%d] block", index);

+        ret = write_flags_info(&mtd_info, index, real_write_content, mtd_info.mtd_blocksize);

+        if (ret == 0)

+        {

+            // д³É¹¦£¬Í˳ö£¬²¢¸üеÚÒ»¿éλÖÃ

+            flags_log("backup flags location: [%d]->[%d]", back_index, index);

+            back_index = index;

+            break;

+        }

+        else if (ret == BAD_BLOCK)

+        {

+            // Óöµ½»µ¿é£¬ÏòºóÌøÒ»¿é

+            continue;

+        }

+        else

+        {

+            flags_err("write backup flags fail");

+            back_index = -1;

+            break;

+        }

+    }

+

+    if (main_index == -1 && back_index == -1)

+    {

+        goto error;

+    }

+    else

+    {

+        ret = 0;

+        goto end;

+    }

+

+error:

+    ret = -1;

+

+end:

+    close(fd_dst);

+	

+	if(NULL != real_write_content)

+	{

+		free(real_write_content);

+		real_write_content = NULL;

+	}

+	

+    return ret;

+}

+

+

+static void copy_flags_info(T_FLAGS_INFO *dst, T_FLAGS_INFO *src)

+{

+	dst->magic_start = src->magic_start;

+	

+    dst->boot_fota_flag.boot_to = src->boot_fota_flag.boot_to;

+    dst->boot_fota_flag.fota_status = src->boot_fota_flag.fota_status;

+    dst->boot_fota_flag.system.status = src->boot_fota_flag.system.status;

+    dst->boot_fota_flag.system.try_cnt = src->boot_fota_flag.system.try_cnt;

+    dst->boot_fota_flag.system2.status = src->boot_fota_flag.system2.status;

+    dst->boot_fota_flag.system2.try_cnt = src->boot_fota_flag.system2.try_cnt;

+	

+    dst->boot_env.dualsys_type = src->boot_env.dualsys_type;

+	strncpy(dst->boot_env.system_boot_env, src->boot_env.system_boot_env, sizeof(dst->boot_env.system_boot_env));

+	strncpy(dst->boot_env.system2_boot_env, src->boot_env.system2_boot_env, sizeof(dst->boot_env.system2_boot_env));

+

+	dst->ubifs_status.fs_status = src->ubifs_status.fs_status;

+	strncpy(dst->ubifs_status.fs_mtd_name, src->ubifs_status.fs_mtd_name, sizeof(dst->ubifs_status.fs_mtd_name));

+	strncpy(dst->ubifs_status.fs_ubi_vol_name, src->ubifs_status.fs_ubi_vol_name, sizeof(dst->ubifs_status.fs_ubi_vol_name));

+	

+	dst->magic_end = src->magic_end;

+

+	return;

+}

+

+

+static int get_current_system()

+{

+    char buf[1024] = {0};

+

+    char *para = NULL;

+    int matches = 0;

+

+    FILE *fd_cmd = NULL;

+    char *line_str = NULL;

+

+    int current_system = -1;

+

+

+    fd_cmd = fopen(FILE_PATH_PROC_CMDLINE, "r");

+    if (!fd_cmd)

+    {

+        printf("Open file %s error, error:%s", FILE_PATH_PROC_CMDLINE, strerror(errno));

+        return SYSTEM_INDEX_UNKNOWN;

+    }

+

+    while (!feof(fd_cmd))

+    {

+        memset(buf, 0, sizeof(buf));

+        line_str = fgets(buf, sizeof(buf), fd_cmd);

+

+        if (NULL == line_str)

+        {

+            printf("get info from /proc/cmdline error:%s", strerror(errno));

+            goto end;

+        }

+

+        printf("buff:%s", buf);

+

+        para = strtok(buf, " ");

+        while (para)

+        {

+            printf("para:%s", para);

+            if (strncmp(para, PROC_CMDLINE_SYSTEM_A_FLAG, strlen(PROC_CMDLINE_SYSTEM_A_FLAG)) == 0)

+            {

+                current_system = SYSTEM_INDEX_1;

+                goto end;

+            }

+            else if (strncmp(para, PROC_CMDLINE_SYSTEM_B_FLAG, strlen(PROC_CMDLINE_SYSTEM_B_FLAG)) == 0)

+            {

+                current_system = SYSTEM_INDEX_2;

+                goto end;

+            }

+            else

+            {

+                //:

+            }

+            para = strtok(NULL, " ");

+        }

+    }

+

+end:

+    if (fd_cmd)

+    {

+        fclose(fd_cmd);

+    }

+	

+    return current_system;

+}

+

+

+/*******************************************************************************

+ * 					 Global function implementations						   *

+ ******************************************************************************/

+int flags_init()

+{

+	T_FLAGS_INFO flags_info = {0};

+	int main_index = 0;

+	int back_index = 1;

+	int ret = -1;

+	int fd_dst = -1;

+	char mtd_path[MAX_PATH_LEN] = {0};

+	struct mtd_info_user meminfo = {0};

+	partition_mtd_info_t mtd_info = {0};

+

+	unsigned char *real_write_content = NULL;

+	T_FLAGS_INFO *p_write = NULL;

+

+	int index  = 0;

+	int block_num = 0;

+	int already_write = 0;

+	

+    flags_info.magic_start = FLAGS_MAGIC;

+	

+    flags_info.boot_fota_flag.boot_to = DUAL_SYSTEM;

+    flags_info.boot_fota_flag.fota_status = 0;

+    flags_info.boot_fota_flag.system.status = DUALSYSTEM_STATUS_BOOTABLE;

+    flags_info.boot_fota_flag.system.try_cnt = 0;

+    flags_info.boot_fota_flag.system2.status = DUALSYSTEM_STATUS_BOOTABLE;

+    flags_info.boot_fota_flag.system2.try_cnt = 0;

+

+    flags_info.boot_env.dualsys_type = DUALSYSTEM_AB;

+

+	flags_info.ubifs_status.fs_status = 0;

+	

+    flags_info.magic_end = FLAGS_MAGIC;

+

+	ret = mtd_get(PARTITION_NAME_FLAGS, DEVICE_MTD, mtd_path, MAX_PATH_LEN);

+	if (ret < 0)

+	{

+		flags_err("partition [%s] not found", PARTITION_NAME_FLAGS);

+		

+		return -1;

+	}

+

+	if ((fd_dst = open(mtd_path, O_RDWR | O_SYNC)) < 0)

+	{

+		flags_err("open flash error, errno=%d, strerror=[%s]", errno, strerror(errno));

+		

+		return -1;

+	}

+

+	if (ioctl(fd_dst, MEMGETINFO, &meminfo) != 0)

+	{

+		flags_err("get flash info error, errno=%d, strerror=[%s]", errno, strerror(errno));

+		

+		goto error;

+	}

+

+	mtd_info.parti_file_desc 	= fd_dst;

+	mtd_info.mtd_blocksize		= meminfo.erasesize;

+	mtd_info.mtd_oobsize		= meminfo.oobsize;

+	mtd_info.mtd_pageperblock	= meminfo.erasesize / meminfo.writesize;

+	mtd_info.mtd_pagesize		= meminfo.writesize;

+	mtd_info.mtd_totalsize		= meminfo.size;

+

+	block_num = mtd_info.mtd_totalsize / mtd_info.mtd_blocksize;

+

+	real_write_content = (unsigned char *)malloc(mtd_info.mtd_blocksize);

+	if (NULL == real_write_content)

+	{

+		flags_err("malloc for block fail");

+		

+		goto error;

+	}

+

+	memset(real_write_content, 0xFF, mtd_info.mtd_blocksize);

+	memcpy(real_write_content, (char *)(&flags_info), sizeof(T_FLAGS_INFO));

+

+	for (index = 0; index < block_num; index++)

+	{

+		if (already_write >= FLAGS_INIT_VALID_BLOCKS_NUM)

+		{

+			break;

+		}

+

+		ret = write_flags_info(&mtd_info, index, real_write_content, mtd_info.mtd_blocksize);

+		if (ret == 0)

+		{

+			already_write++;

+			flags_log("write init valid block num: %d", already_write);

+			

+			continue;

+		}

+		else if (BAD_BLOCK == ret)

+		{

+			continue;

+		}

+	}

+

+	if (already_write >= 2)

+	{

+		flags_log("init system status success, alread write block: %d", already_write);

+		ret = 0;

+	}

+	else

+	{

+		flags_log("init system status fail, alread write block: %d", already_write);

+		ret = -1;

+	}

+

+	goto end;

+

+error:

+	ret = -1;

+

+end:

+	close(fd_dst);

+	

+	if(NULL != real_write_content)

+	{

+		free(real_write_content);

+		real_write_content = NULL;

+	}

+	

+	return ret;

+}

+

+

+int flags_get(T_FLAGS_INFO *p_flags_info)

+{

+    T_FLAGS_INFO main_flag = {0};

+    T_FLAGS_INFO backup_flag = {0};

+    int main_index = 0;

+    int backup_index = 1;

+

+	if (NULL == p_flags_info)

+	{

+		flags_err("invalid param NULL");

+		

+		return -1;

+	}

+

+    if (get_flags_info(&main_flag, &main_index, &backup_flag, &backup_index) != 0)

+    {

+    	flags_err("get flags info fail");

+		

+        return -1;

+    }

+

+    if ((FLAGS_MAGIC == main_flag.magic_start) && (FLAGS_MAGIC == main_flag.magic_end))

+    {

+        copy_flags_info(p_flags_info, &main_flag);

+		

+        return 0;

+    }

+	

+    if ((FLAGS_MAGIC == backup_flag.magic_start) && (FLAGS_MAGIC == backup_flag.magic_end))

+    {

+        copy_flags_info(p_flags_info, &backup_flag);

+		

+        return 0;

+    }

+

+    flags_err("do not find valid flags info");

+	

+    return -1;

+}

+

+

+int flags_set(T_FLAGS_INFO *p_flags_info)

+{

+	T_FLAGS_INFO main_flag = {0};

+    T_FLAGS_INFO backup_flag = {0};

+    int main_index = 0;

+    int backup_index = 1;

+	

+	if (NULL == p_flags_info)

+	{

+		flags_err("invalid param NULL");

+		

+		return -1;

+	}

+

+	if ((FLAGS_MAGIC != p_flags_info->magic_start) || (FLAGS_MAGIC != p_flags_info->magic_end))

+	{

+		flags_err("invalid magic");

+		

+		return -1;

+	}

+	

+    if (get_flags_info(&main_flag, &main_index, &backup_flag, &backup_index) != 0)

+    {

+    	flags_err("get flags info fail");

+		

+        return -1;

+    }

+

+    if (set_flags_info(p_flags_info, &main_index, &backup_index) != 0)

+    {

+        flags_err("set ubifs status fail");

+		

+        return -1;

+    }

+

+	return 0;

+}

+

+

+int flags_get_ubifs_status(T_UBIFS_STATUS *p_ubifs_status)

+{

+    T_FLAGS_INFO main_flag = {0};

+    T_FLAGS_INFO backup_flag = {0};

+    int main_index = 0;

+    int backup_index = 1;

+	

+	if (NULL == p_ubifs_status)

+	{

+		flags_err("invalid param NULL");

+		

+		return -1;

+	}

+

+    if (get_flags_info(&main_flag, &main_index, &backup_flag, &backup_index) != 0)

+    {

+    	flags_err("get flags info fail");

+		

+        return -1;

+    }

+	

+    if ((FLAGS_MAGIC == main_flag.magic_start) && (FLAGS_MAGIC == main_flag.magic_end))

+    {

+		p_ubifs_status->fs_status = main_flag.ubifs_status.fs_status;

+		strncpy(p_ubifs_status->fs_mtd_name, main_flag.ubifs_status.fs_mtd_name, sizeof(p_ubifs_status->fs_mtd_name));

+		strncpy(p_ubifs_status->fs_ubi_vol_name, main_flag.ubifs_status.fs_ubi_vol_name, sizeof(p_ubifs_status->fs_ubi_vol_name));

+		

+        return 0;

+    }

+			

+    if ((FLAGS_MAGIC == backup_flag.magic_start) && (FLAGS_MAGIC == backup_flag.magic_end))

+    {

+		p_ubifs_status->fs_status = backup_flag.ubifs_status.fs_status;

+		strncpy(p_ubifs_status->fs_mtd_name, backup_flag.ubifs_status.fs_mtd_name, sizeof(p_ubifs_status->fs_mtd_name));

+		strncpy(p_ubifs_status->fs_ubi_vol_name, backup_flag.ubifs_status.fs_ubi_vol_name, sizeof(p_ubifs_status->fs_ubi_vol_name));

+		

+        return 0;

+    }

+

+    flags_err("do not find valid flags info");

+	

+    return -1;

+}

+

+

+int flags_set_ubifs_status(T_UBIFS_STATUS *p_ubifs_status)

+{

+    T_FLAGS_INFO main_flag = {0};

+    T_FLAGS_INFO backup_flag = {0};

+    int main_index = 0;

+    int backup_index = 1;

+	

+    T_FLAGS_INFO *flags_info = NULL;

+

+	if (NULL == p_ubifs_status)

+	{

+		flags_err("invalid param NULL");

+		

+		return -1;

+	}

+	

+    if (get_flags_info(&main_flag, &main_index, &backup_flag, &backup_index) != 0)

+    {

+    	flags_err("get flags info fail");

+		

+        return -1;

+    }

+

+    if ((FLAGS_MAGIC == main_flag.magic_start) && (FLAGS_MAGIC == main_flag.magic_end))

+    {

+        flags_info = &main_flag;

+    }

+    else if ((FLAGS_MAGIC == backup_flag.magic_start) && (FLAGS_MAGIC == backup_flag.magic_end))

+    {

+        flags_info = &backup_flag;

+    }

+    else

+    {

+        flags_err("get ubifs status invalid");

+		

+        return -1;

+    }

+

+	memcpy(&(flags_info->ubifs_status), p_ubifs_status, sizeof(T_UBIFS_STATUS));

+

+    if (set_flags_info(flags_info, &main_index, &backup_index) != 0)

+    {

+        flags_err("set ubifs status fail");

+		

+        return -1;

+    }

+

+    return 0;

+}

+

+

+int flags_get_current_system()

+{

+    int current = get_current_system();

+	

+    if (current == 1)

+    {

+        return DUAL_SYSTEM;

+    }

+    else if (current == 2)

+    {

+        return DUAL_SYSTEM2;

+    }

+

+    return -1;

+}

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libflags/flags_log.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libflags/flags_log.h
new file mode 100755
index 0000000..4c6bd46
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libflags/flags_log.h
@@ -0,0 +1,10 @@
+#ifndef FLAGS_LOG_H
+#define FLAGS_LOG_H
+
+
+#define flags_log(fmt, args...) printf("[flags] [%s-%d] Log: " fmt "\n", __FUNCTION__, __LINE__, ##args)
+#define flags_err(fmt, args...) printf("[flags] [%s-%d] Err: " fmt "\n", __FUNCTION__, __LINE__, ##args)
+
+
+#endif  // FLAGS_LOG_H
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libmtd/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libmtd/Makefile
old mode 100644
new mode 100755
index 2f0c4ef..d83f382
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libmtd/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libmtd/Makefile
@@ -27,7 +27,7 @@
 	$(CC) $(LDFLAGS) -o $@ $^
 
 romfs:
-	#$(ROMFSINST) $(LIB_SHARED) /lib/$(LIB_SHARED)
+	$(ROMFSINST) $(LIB_SHARED) /lib/$(LIB_SHARED)
 
 clean:
 	-$(RM) *.a *.o *.so $(LIB_SHARED) $(LIB_STATIC) $(OBJS)
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libsoftap/softap_log.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libsoftap/softap_log.c
index 9027efd..442770b 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libsoftap/softap_log.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/libsoftap/softap_log.c
@@ -170,8 +170,8 @@
 
 	if (SLOG_SOCTIME_ON == soctime_sw)
 		time_us = get_time_us();
-//xf.li@20230803 modify for ZXW-81 start
-/*	if (slog_sysloglevel > 0 && slog_sysloglevel <= prio) {
+
+	if (slog_sysloglevel > 0 && slog_sysloglevel <= prio) {
 		switch (prio) {
 		case SLOG_NORMAL: {
 			put_to_syslog(NOTICE);
@@ -191,8 +191,8 @@
 		default:
 			break;
 		}
-	}*/
-//xf.li@20230803 modify for ZXW-81 end
+	}
+
 	if (slog_printlevel > 0 && slog_printlevel <= prio) {
 		put_to_console(mod, fmt, arg);
 	}
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/mnet_whitelist_proxy/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/mnet_whitelist_proxy/Makefile
new file mode 100755
index 0000000..386e813
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/mnet_whitelist_proxy/Makefile
@@ -0,0 +1,38 @@
+#*******************************************************************************
+# include ZTE application makefile
+#*******************************************************************************
+include $(COMMON_MK)
+
+##############USER COMIZE BEGIN################

+

+EXEC = mnet_whitelist_proxy

+OBJS = $(patsubst %.c,%.o,$(wildcard *.c))
+
+CFLAGS += -g                                             

+CFLAGS += -g -Werror=implicit-function-declaration
+

+LDLIBS += -lpthread -lm -lrt
+LDLIBS += -lsoftap -L$(zte_lib_path)/libsoftap
+LDLIBS += -lsofttimer -L$(zte_lib_path)/libsoft_timer
+LDLIBS += -lnvram -L$(zte_lib_path)/libnvram
+LDLIBS += -latutils -L$(zte_lib_path)/libatutils
+#LDLIBS += -ltinyalsa -L$(zte_lib_path)/libtinyalsa
+LDLIBS += -lscipc -L$(zte_lib_path)/libscipc
+#LDLIBS += -ltelsvr -L$(zte_lib_path)/libtelecom/lib/libtelsvr.a

+

+##############USER COMIZE END##################
+
+#*******************************************************************************
+# targets
+#*******************************************************************************
+all: $(EXEC)
+
+$(EXEC): $(OBJS)
+	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) -Wl,--end-group
+	@cp $@ $@.elf
+
+romfs:
+	$(ROMFSINST) $(EXEC) /sbin/$(EXEC)
+
+clean:
+	-rm -f $(EXEC) *.elf *.gdb *.o
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/mnet_whitelist_proxy/mnet_whitelist_proxy.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/mnet_whitelist_proxy/mnet_whitelist_proxy.c
new file mode 100755
index 0000000..3dca9b8
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/mnet_whitelist_proxy/mnet_whitelist_proxy.c
@@ -0,0 +1,330 @@
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <time.h>
+#include <syslog.h>
+#include <unistd.h>
+#include <errno.h>
+#include <signal.h>
+#include <ctype.h>
+
+#include "sc_ipc.h"
+#include "sc_tel_types.h"
+#include "softap_api.h"
+#include "mnet_whitelist_inter_msg.h"
+#define CASE_RETURN_STR(x) case x: return #x;
+static int g_client_fd = -1;
+
+
+#define MNET_WHITELIST_PRINT "[mnet_whitelist]"
+
+#define  mw_err(fmt, args...)	\
+	do {slog(MNET_WHITELIST_PRINT, SLOG_ERR, "[wlan][%s-%d]: " fmt"\n", __FUNCTION__, __LINE__, ## args);} while (0)
+
+#define  mw_log(fmt, args...)	\
+	do {slog(MNET_WHITELIST_PRINT, SLOG_ERR, "[wlan][%s-%d]: " fmt"\n", __FUNCTION__, __LINE__, ## args);} while (0)
+
+static void sc_mnet_whitelist_print_msg(const sc_ipc_msg* const pmsg)
+{
+	mw_log("pmsg->fd_cli=%d \n", pmsg->fd_cli);
+	mw_log("pmsg->fd_svr=%d \n", pmsg->fd_svr);
+	mw_log("pmsg->msg_req=%d \n", pmsg->msg_req);
+	mw_log("pmsg->msg_rsp=%d \n", pmsg->msg_rsp);
+}
+
+
+static int mnet_whitelist_evts_proc(const struct _sc_ipc_event_* const pevt, const sc_ipc_msg* const pmsg);
+static int mnet_whitelist_conn_proc(const struct _sc_ipc_event_* const pevt, const sc_ipc_msg* const pmsg);
+
+
+
+//ÈçÒì³£Á÷³Ìδdeint,»á´æÔÚÒѶϿªµÄclient key,²»Ó°ÏìÕý³£µÄclient½ÓÊÕ,ÇÒkeyûÊÍ·Å,²»»á±»ÆäËûÄ£¿é¸´ÓÃ
+static struct list_head cli_msgkey_list;
+
+static int record_client_key(int key)
+{
+	scmnet_whitelist_cli_key_t *pCur = NULL;
+	scmnet_whitelist_cli_key_t *pTmp = NULL;
+
+	list_for_each_entry(pTmp, &cli_msgkey_list, list) {
+		if (pTmp->cli_key == key) {
+			slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist client:%d already in list!\n", key);
+			return SC_ERR_SUCCESS;
+		}
+	}
+
+	pCur = malloc(sizeof(scmnet_whitelist_cli_key_t));
+	if (pCur == NULL) {
+		slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist client no memery.\n");
+		return SC_ERR_NO_MEMORY;
+	}
+	
+	memset(pCur, 0, sizeof(scmnet_whitelist_cli_key_t));
+	pCur->cli_key = key;
+	list_add_tail(&pCur->list, &cli_msgkey_list);
+
+	return SC_ERR_SUCCESS;
+}
+
+static int remove_client_key(int key)
+{
+	scmnet_whitelist_cli_key_t *pTmp, *pTmp1;
+	
+	list_for_each_entry_safe(pTmp, pTmp1, &cli_msgkey_list, list) {
+		if (pTmp->cli_key == key) {
+			list_del(&pTmp->list);
+			free(pTmp);
+		}
+	}
+	
+	return SC_ERR_SUCCESS;
+}
+
+static void send_msg_by_key(sc_ipc_msg* pmsg)
+{
+    int ret = 0;
+    int msg_fd = -1;
+
+	scmnet_whitelist_cli_key_t *pCur = NULL;
+	scmnet_whitelist_cli_key_t *pTmp = NULL;
+
+	list_for_each_entry(pTmp, &cli_msgkey_list, list) {
+		pmsg->fd_svr = pTmp->cli_key;
+		ret = sc_ipc_send_msg(pmsg);
+		if (ret != 0) {
+			slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist msg to msg(0x%x) fail.\n", pTmp->cli_key);
+		}
+		else {
+			slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist msg to msg(0x%x) succ.\n", pTmp->cli_key);
+		}
+	}
+	
+}
+
+
+
+static const char* cmdid_to_string(int status)
+{
+	switch (status) {
+		CASE_RETURN_STR(MSG_CMD_GET_MNET_WHITELIST_RSP);
+	};
+	return "UNKNOWN  CMD ID";
+}
+
+static void mnet_whitelist_ipcmsg_set(int fdsvr, int msgreq, void *data, int len, sc_ipc_msg *pipcmsg)
+{
+	pipcmsg->fd_cli = sc_ipc_get_self_fd();
+	pipcmsg->fd_svr = fdsvr;
+	pipcmsg->msg_req = msgreq;	
+    pipcmsg->data_len = len;
+	memcpy(pipcmsg->data, data, len);
+}
+
+
+static sc_ipc_msg *mnet_whitelist_connect_request(const sc_ipc_msg* const pmsg)
+{
+	scmnet_whitelist_connect_t *pdata_info = (scmnet_whitelist_connect_t *)pmsg->data;
+	scmnet_whitelist_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res));
+
+	if(NULL == pmsg_rsp) {
+		slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist ipcmsg no memory!\n");
+		return NULL;
+	}
+
+	comm_res.result = SC_ERR_SUCCESS;
+	
+	if(SC_MNET_WHITELIST_DISABLE == pdata_info->enable) {
+		comm_res.result = remove_client_key(pmsg->fd_cli);
+		slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist client(0x%x) disconnect[%d].\n", pmsg->fd_cli, comm_res.result);
+	}
+	else {
+		comm_res.result = record_client_key(pmsg->fd_cli);
+		slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist client(0x%x) connect[%d].\n", pmsg->fd_cli, comm_res.result);
+	}	
+
+	mnet_whitelist_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static int mnet_whitelist_get_request(const sc_ipc_msg* const pmsg)
+{
+	int ret = 0;
+	ret = send_soc_msg(NEAR_PS, MODULE_ID_WIFI, MSG_CMD_GET_MNET_WHITELIST, 0, NULL);
+	if (ret != 0) {
+		slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist_get_request ipc_send_message fail, ret:%d\n", ret);
+		return 1;
+	}else{
+		slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist_get_request ipc_send_message succ\n");
+	}
+	return 0;
+}
+
+static int mnet_whitelist_evts_proc(const struct _sc_ipc_event_* const pevt, const sc_ipc_msg* const pmsg)
+{
+	int msg_id = pmsg->msg_req;
+	sc_ipc_msg *pmsg_rsp = NULL;
+
+	slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist_evts_proc msg_id=[0x%x]%s\n", msg_id, cmdid_to_string(msg_id));
+	
+	switch (msg_id) {
+	case SCMNET_WHITELIST_CMD_CONN_REQ:
+		pmsg_rsp = mnet_whitelist_connect_request(pmsg);
+		break;
+	case SCMNET_WHITELIST_CMD_GET_REQ:
+		pmsg_rsp = mnet_whitelist_get_request(pmsg);
+		break;
+	default:
+		slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist_evts_proc unknow req msg.\n");
+		break;
+
+	}
+	
+	if(NULL != pmsg_rsp) {
+		 if(0 != sc_ipc_send_msg(pmsg_rsp)) {
+			slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist_evts_proc sc_ipc_send_msg fail.\n");
+		 }
+		 sc_ipc_msg_free(pmsg_rsp);
+	}
+	return 0;
+}
+
+static void sc_mnet_whitelist_ipcmsg_set(int fdsvr, int msgreq, void *data, int len, sc_ipc_msg *pipcmsg)
+{
+	pipcmsg->fd_cli = sc_ipc_get_self_fd();
+	pipcmsg->fd_svr = fdsvr;
+	pipcmsg->msg_req = msgreq;	
+    pipcmsg->data_len = len;
+	memcpy(pipcmsg->data, data, len);
+}
+
+static sc_ipc_msg* sc_mnetwhitelist_rsp_msg_create_by_msgid(unsigned int msg_rsp, unsigned int datalen)
+{
+	sc_ipc_msg *pmsg_rsp = NULL;
+	pmsg_rsp = (sc_ipc_msg *)sc_ipc_msg_new(datalen);
+	if(NULL == pmsg_rsp) {
+		return NULL;
+	}
+	memset(pmsg_rsp, 0, sizeof(sc_ipc_msg) + datalen);
+
+	pmsg_rsp->type = 1;
+	pmsg_rsp->fd_cli = sc_ipc_get_self_fd();
+	pmsg_rsp->fd_svr = g_client_fd;	
+	pmsg_rsp->token = 0;
+	pmsg_rsp->msg_req = msg_rsp;	
+	pmsg_rsp->data_len = datalen;
+
+	sc_mnet_whitelist_print_msg(pmsg_rsp);
+	return pmsg_rsp;
+}
+
+
+static int mnet_whitelist_get_rsp(MSG_BUF *pMsg)
+{
+	scmnet_whitelist_get_res_t res = {0};
+	int len = strlen((char*)pMsg->aucDataBuf);
+	memcpy(res.whitelist, (char*)pMsg->aucDataBuf, len);	
+	sc_ipc_msg *pmsg_rsp = NULL;	
+
+	pmsg_rsp = sc_mnetwhitelist_rsp_msg_create_by_msgid(SCMNET_WHITELIST_CMD_GET_RSP, sizeof(scmnet_whitelist_get_res_t));
+	memcpy(pmsg_rsp->data, &res, pmsg_rsp->data_len);	
+	sc_ipc_send_msg(pmsg_rsp);
+	sc_ipc_msg_free(pmsg_rsp);
+	return 0;
+}
+
+//ap²à·¢À´µÄÏûÏ¢
+static int sc_mnet_whitelist_parse_msg(MSG_BUF *pMsg)
+{
+	sc_ipc_msg *pmsg_rsp = NULL;
+
+	int ret = -1;
+	slog(MNET_WHITELIST_PRINT, SLOG_ERR, "src_mod=[0x%x], cmd=[0x%x]%s\n", pMsg->src_id, pMsg->usMsgCmd, cmdid_to_string(pMsg->usMsgCmd));
+
+	switch (pMsg->usMsgCmd) {
+		case MSG_CMD_GET_MNET_WHITELIST_RSP:
+			mnet_whitelist_get_rsp(pMsg);
+			break;
+		default:
+			slog(MNET_WHITELIST_PRINT, SLOG_ERR, "msg not handle.\n");
+			break;
+	}
+
+	return 0;
+}
+
+static int mnet_whitelist_conn_proc(const struct _sc_ipc_event_* const pevt, const sc_ipc_msg* const pmsg)
+{
+	scmnet_whitelist_connect_t *pdata_info = (scmnet_whitelist_connect_t *)pmsg->data;
+	scmnet_whitelist_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res));
+	slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist_conn_proc in!\n");
+
+	if(NULL == pmsg_rsp) {
+		slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist ipcmsg no memory!\n");
+		return NULL;
+	}
+
+	comm_res.result = SC_ERR_SUCCESS;
+	
+	if(SC_MNET_WHITELIST_DISABLE == pdata_info->enable) {
+		comm_res.result = remove_client_key(pmsg->fd_cli);
+		g_client_fd =  -1;
+		slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist client(0x%x) disconnect[%d].\n", pmsg->fd_cli, comm_res.result);
+	}
+	else {
+		comm_res.result = record_client_key(pmsg->fd_cli);
+		g_client_fd =  pmsg->fd_cli;
+		slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist client(0x%x) connect[%d].\n", pmsg->fd_cli, comm_res.result);
+	}	
+
+	mnet_whitelist_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+	sc_ipc_send_msg(pmsg_rsp);
+	sc_ipc_msg_free(pmsg_rsp);
+	return 0;
+}
+
+
+static sc_ipc_event s_mnet_whitelist_evts[] =
+{
+	{0, 1, 0, SCMNET_WHITELIST_CMD_CONN_REQ, mnet_whitelist_conn_proc, NULL, NULL},
+	{0, 1, 0, SCMNET_WHITELIST_CMD_GET_REQ, mnet_whitelist_get_request, NULL, NULL},
+};
+
+
+int main(int argc, char** argv)
+{
+	int mnet_whitelist_msg_id = 0;
+	MSG_BUF mnetWhitelistMsg = {0};
+	int iRet = -1;
+
+	loglevel_init();
+
+	slog(MNET_WHITELIST_PRINT, SLOG_ERR, "mnet_whitelist_proxy start\n");
+
+	INIT_LIST_HEAD(&cli_msgkey_list);
+	//ÄÚ²¿Ò²Òª¸Ä ÔÝʱÕâÑù
+	sc_ipc_start_loop("mnet_whitelist_proxy_ipc");//key = MODULE_ID_MNET_WHITELIST_PROXY;
+
+	sc_ipc_register_events(s_mnet_whitelist_evts, sizeof(s_mnet_whitelist_evts)/sizeof(s_mnet_whitelist_evts[0]));
+
+    //mnet_whitelist_msg_id = msgget(MODULE_ID_IP_PROXY, IPC_CREAT | 0600);
+    mnet_whitelist_msg_id = msgget(MODULE_ID_MNET_WHITELIST, IPC_CREAT | 0600);
+	if (mnet_whitelist_msg_id == -1) {
+		slog(MNET_WHITELIST_PRINT, SLOG_ERR, "sc_mnet_whitelist create msg fail, errno=%d\n", errno);
+		return -1;
+	}
+
+	while (1) {
+		memset(&mnetWhitelistMsg, 0, sizeof (MSG_BUF));
+		iRet = msgrcv(mnet_whitelist_msg_id, &mnetWhitelistMsg, sizeof (MSG_BUF) - sizeof (LONG), 0, 0);
+		if (iRet == -1) {
+			continue;
+		}
+
+		sc_mnet_whitelist_parse_msg(&mnetWhitelistMsg);
+	}
+    return 0;
+}
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/nvserver/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/nvserver/Makefile
index 2caae31..45838c4 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/nvserver/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/nvserver/Makefile
@@ -6,7 +6,7 @@
 CFLAGS += -I$(LIB_DIR)/libnvram
 CFLAGS += -I$(APP_DIR)/include
 LDLIBS += -L$(LIB_DIR)/libnvram
-LDLIBS += -lpthread -lmtd -lnvram -lsofttimer -lupi_ab -lsoftap -lcrypto
+LDLIBS += -lpthread -lnvram -lflags
 
 all: $(EXEC)
 $(EXEC): $(OBJS)
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/nvserver/nvserver.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/nvserver/nvserver.c
index a7c4b07..7d79e40 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/nvserver/nvserver.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/nvserver/nvserver.c
@@ -33,7 +33,8 @@
 #include <message.h>
 
 #ifdef FOTA_AB
-#include "zxic_fota_ab_upgrade.h"
+#include "pub_flags.h"
+#include "flags_api.h"
 #endif
 
 #ifdef __cplusplus
@@ -370,6 +371,10 @@
     T_NV_NODE   *list                       = NULL;
     char        nvMainFile[NV_PATH_LEN]     = {0};
     char        nvBackupFile[NV_PATH_LEN]   = {0};
+#ifdef FOTA_AB
+	T_FLAGS_INFO flags_info = {0};
+	int ret = 0;
+#endif
 	
     for(list = nv_list; list; list = list->next)
     {
@@ -396,10 +401,11 @@
 	if(!strcmp(list->nvFile, NV_CFG) && get_update_status() == 2  ){
 		reloadFactroyParam(list);
 		delete_not_needed(list);
-		nvcommit(list->nvFile);
+		nvcommit(list->nvFile);	
 #ifdef FOTA_AB
-        //clear fotaflag for fota ab
-        zxic_dual_set_fota_status_for_nv(0);
+		ret = flags_get(&flags_info);
+		flags_info.boot_fota_flag.fota_status = 0;
+		ret = flags_set(&flags_info);
 #endif
 		}
     }
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/nvserver/nvupdate.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/nvserver/nvupdate.c
index 7c415ba..d7df706 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/nvserver/nvupdate.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/nvserver/nvupdate.c
@@ -32,7 +32,8 @@
 #include <fota_common.h>
 
 #ifdef FOTA_AB
-#include "zxic_fota_ab_upgrade.h"
+#include "flags_api.h"
+#include "pub_flags.h"
 #endif
 
 #ifdef __cplusplus
@@ -75,9 +76,13 @@
 #ifdef FOTA_AB
 int get_update_status (void)
 {
-	int ret = zxic_dual_get_fota_status_for_nv();
+	T_FLAGS_INFO flags_info = {0};
+	unsigned int status = 0;
+	int ret = 0;
+	ret = flags_get(&flags_info);
+	status = flags_info.boot_fota_flag.fota_status;
 
-	if (ret == 1)
+	if (status == 1)
 		return 2;
 	else
 		return 0;
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/rtc-service/rtc-service.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/rtc-service/rtc-service.c
index 61722b1..23c7f6c 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/rtc-service/rtc-service.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/rtc-service/rtc-service.c
@@ -48,6 +48,7 @@
 static void* rtc_looper();
 static int start_rtc_thread();
 static int handle_get_time(MSG_BUF *pmsg_buf);
+static int handle_get_cap_rtc_time(MSG_BUF *pmsg_buf);
 static int handle_set_time(MSG_BUF *pmsg_buf);
 static int handle_alarm_add(MSG_BUF *pmsg_buf);
 static int handle_alarm_del(MSG_BUF *pmsg_buf);
@@ -317,6 +318,24 @@
 	close(fd);
 }
 
+void send_ok_del_rsp(MSG_BUF *pmsg_buf)
+{
+	RTC_DATA_BUF * buf = pmsg_buf->aucDataBuf;
+
+	if(buf->cpu == RTC_CPU_AP)
+	{
+		int ret = 0;
+		RTC_DATA_BUF sendbuf = {0};
+		sendbuf.cpu = RTC_CPU_CAP;
+		sendbuf.module = buf->module;
+		sendbuf.srcModule = buf->srcModule;
+		ret = send_soc_msg(NEAR_PS, MODULE_ID_RTC_SERVICE, RTC_MSG_DEL_ALARM, sizeof(RTC_DATA_BUF), (void *)&sendbuf);
+		if (ret != 0) 
+		{
+			slog(RTC_PRINT, SLOG_ERR, "send_ok_del_rsp: failed,ret:%d\n",ret);
+		}
+	}
+}
 
 /********************************************
  * handle_get_time
@@ -329,6 +348,56 @@
 }
 
 /********************************************
+ * handle_get_cap_rtc_time
+ * get RTC time(CAP).
+ *******************************************/
+static int handle_get_cap_rtc_time(MSG_BUF *pmsg_buf)
+{
+	struct rtc_time rtc_tm = {0};
+	int ret = 0;
+	RTC_DATA_BUF * buf = pmsg_buf->aucDataBuf;
+	
+	slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_get_cap_rtc_time NOOPS.\n");
+
+	if(buf->cpu == RTC_CPU_AP)
+	{
+		int cmd = RTC_MSG_GET_TIME;
+		RTC_DATA_BUF  sendbuf = {0};
+		unsigned long cur_sec =0;
+		
+		ret = ioctl(g_rtc_fd, RTC_RD_TIME, &rtc_tm);
+		slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_get_cap_rtc_time tm_year:%d, tm_mon:%d, tm_hour:%d, tm_min:%d, tm_yday:%d, tm_mday:%d, tm_wday:%d.\n",
+		rtc_tm.tm_year, rtc_tm.tm_mon, rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_yday, rtc_tm.tm_mday, rtc_tm.tm_wday);
+		slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_get_cap_rtc_time src_id:0x%x, buf->cpu:%d.\n",buf->srcModule,buf->cpu);
+		
+		cur_sec = mktime(&rtc_tm);
+		sendbuf.srcModule = buf->srcModule;
+		sendbuf.cpu = RTC_CPU_CAP;
+		sendbuf.ulSec = cur_sec;
+	
+		slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_get_cap_rtc_time send to cap cmd:0x%x, srcMod:0x%x, cur_sec:%lu \n", cmd, sendbuf.srcModule, sendbuf.ulSec);
+		ret = send_soc_msg(NEAR_PS, MODULE_ID_RTC_SERVICE, cmd, sizeof(RTC_DATA_BUF), (void *)&sendbuf);
+		if (ret != 0)
+		{
+			slog(RTC_PRINT, SLOG_ERR, "rtc-service: ipc_send_message unexpected,ret:%d\n",ret);
+		}
+	}
+	else
+	{
+		RTC_DATA_BUF rsp_buf = {0};
+		unsigned long cur_sec =0;
+		
+		ret = ioctl(g_rtc_fd, RTC_RD_TIME, &rtc_tm);
+		cur_sec = mktime(&rtc_tm);
+		rsp_buf.ulSec = cur_sec;
+		rsp_buf.srcModule = buf->srcModule;
+
+		send_rtc_msg(buf->srcModule,SC_RTC_MSG_CMD_GET_TIME_RSP,(void *)&rsp_buf, sizeof(RTC_DATA_BUF));
+	}
+	return 0;
+}
+
+/********************************************
  * ¹¦ÄÜ:ÉèÖÃrtcʱ¼ä
  *******************************************/
 static int handle_set_time(MSG_BUF *pmsg_buf)
@@ -392,7 +461,7 @@
 	memcpy(&pAlarm->rtc_tm, &rtc_tm, sizeof(rtc_tm));
 
 	pAlarm->rtc_id = buf->module;
-	pAlarm->module_id = pmsg_buf->src_id;
+	pAlarm->module_id = buf->srcModule;
 	pAlarm->interval = buf->ulSec ;   //  count down time
 	pAlarm->remain_time = buf->ulSec; // remain count down time
 	pAlarm->wakeup = buf->wakeup;
@@ -503,7 +572,7 @@
 	list_for_each_entry_safe(pTmp, pTmp1, &rtc_timer_list, list) {
 		slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_del timer module:0x%x - 0x%x, src:0x%x - 0x%x.\n",
 		     buf->module, pTmp->rtc_id, buf->srcModule, pTmp->module_id);
-		if ((buf->module == pTmp->rtc_id) && (buf->srcModule == pTmp->module_id)) {
+		if ((buf->module == pTmp->rtc_id) && (buf->srcModule == pTmp->module_id)&& (buf->cpu == pTmp->cpu)) {
         		slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_alarm_del timer module:0x%x , src:0x%x \n",
         		     buf->module, buf->srcModule );
 			list_del(&pTmp->list);
@@ -515,7 +584,7 @@
 	list_for_each_entry_safe(pTmp, pTmp1, &rtc_alarm_list, list) {
 		slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_del alarm module:0x%x - 0x%x, src:0x%x - 0x%x.\n",
 		     buf->module, pTmp->rtc_id, buf->srcModule, pTmp->module_id);
-		if ((buf->module == pTmp->rtc_id) && (buf->srcModule == pTmp->module_id)) {
+		if ((buf->module == pTmp->rtc_id) && (buf->srcModule == pTmp->module_id)&& (buf->cpu == pTmp->cpu)) {
         		slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_alarm_del alarm module:0x%x , src:0x%x \n",
         		     buf->module, buf->srcModule );
 			wakeup = pTmp->wakeup;
@@ -580,12 +649,36 @@
 	wakeup = pAlarm->wakeup;
 	list_del(&pAlarm->list);
 	buf.module = pAlarm->rtc_id;
+	buf.srcModule = pAlarm->module_id;
 	slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_alarm_timeout: target:0x%x, rtc_id:0x%x, utc:%d \n", pAlarm->module_id, buf.module, pAlarm->is_utc);
-	ret = ipc_send_message2(MODULE_ID_RTC_SERVICE, pAlarm->module_id, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF), (unsigned char*)&buf, 0);
-	if (ret != 0) {
-		slog(RTC_PRINT, SLOG_ERR, "rtc-service: ipc_send_message unexpected\n");
+	if(pAlarm->cpu == RTC_CPU_CAP)
+	{
+		if (pAlarm->module_id >= MODULE_ID_SDK_DYNAMIC_BASE)
+		{
+			send_rtc_msg(pAlarm->module_id,SC_RTC_MSG_CMD_TIMEOUT,(void *)&buf, sizeof(RTC_DATA_BUF));
+		}
+		else
+		{	ret = ipc_send_message2(MODULE_ID_RTC_SERVICE, pAlarm->module_id, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF), (unsigned char*)&buf, 0);
+			if (ret != 0) 
+			{
+				slog(RTC_PRINT, SLOG_ERR, "rtc-service: ipc_send_message unexpected\n");
+			}
+		}
 	}
+	else
+	{
+		buf.module = pAlarm->rtc_id;
+        buf.srcModule = pAlarm->module_id;
+        buf.cpu = RTC_CPU_CAP;
+        buf.is_utc = pAlarm->is_utc;
 
+		slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_alarm_timeout: send to ap cmd:0x%x, srcMod:0x%x, module:0x%x, utc:%d \n", cmd, buf.srcModule, buf.module, pAlarm->is_utc);
+        ret = send_soc_msg(NEAR_PS, MODULE_ID_RTC_SERVICE, cmd, sizeof(RTC_DATA_BUF), (void *)&buf);
+        if (ret != 0)
+        {
+            slog(RTC_PRINT, SLOG_ERR, "rtc-service: ipc_send_message unexpected,ret:%d\n",ret);
+        }
+	}
 	if (pAlarm->is_utc == 0) {
 		alarm_adjust_value(pAlarm->remain_time);
 		alarm_fix_value(&rtc_timer_list);
@@ -656,7 +749,15 @@
 #else
 	list_for_each_entry_safe(pTmp, pTmp1, &rtc_alarm_list, list) {
 		buf.module = pTmp->rtc_id;
-		ipc_send_message2(MODULE_ID_RTC_SERVICE, pTmp->module_id, RTC_MSG_TIME_CHANGED, sizeof(RTC_DATA_BUF), (unsigned char*)&buf, 0);
+		buf.srcModule = pTmp->module_id;
+		if(pTmp->cpu == RTC_CPU_CAP)
+		{
+			ipc_send_message2(MODULE_ID_RTC_SERVICE, pTmp->module_id, RTC_MSG_TIME_CHANGED, sizeof(RTC_DATA_BUF), (unsigned char*)&buf, 0);
+		}
+		else
+		{
+			send_soc_msg(NEAR_PS, MODULE_ID_RTC_SERVICE, RTC_MSG_TIME_CHANGED, sizeof(RTC_DATA_BUF), (unsigned char*)&buf);
+		}
 		if (pTmp->interval + pTmp->time_val < sec) {
 			list_del(&pTmp->list);
 			slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: delete  ELAPSED alarm, alarm_id(%d), alarm_time(%ld).\n", pTmp->rtc_id, (pTmp->interval + pTmp->time_val));
@@ -687,12 +788,38 @@
 	ALARM_T *pTmp, *pTmp1;
 	RTC_DATA_BUF  buf = {0};
 	int wakeup = 0;
+	int ret =0;
+	enum RTC_MSG_CMD cmd = 0;
 	
 	if (rtc_list == &rtc_timer_list) {
 		list_for_each_entry_safe(pTmp, pTmp1, rtc_list, list) {
 			if (pTmp->remain_time <= 0) {
 				buf.module = pTmp->rtc_id;
-				ipc_send_message2(MODULE_ID_RTC_SERVICE, pTmp->module_id, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF), (unsigned char*)&buf, 0);
+				buf.srcModule = pTmp->module_id;
+				if(pTmp->cpu == RTC_CPU_AP)
+				{
+					buf.srcModule = pTmp->module_id;
+					buf.cpu = RTC_CPU_CAP;
+				    buf.is_utc = pTmp->is_utc;
+					cmd = RTC_MSG_TIMER_TIMEOUT;
+					slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_alarm_timeout,send to ap cmd:0x%x, srcMod:0x%x, module:0x%x, utc:%d \n", cmd, buf.srcModule, buf.module, buf.is_utc);
+					ret = send_soc_msg(NEAR_PS, MODULE_ID_RTC_SERVICE, cmd, sizeof(RTC_DATA_BUF), (void *)&buf);
+					if (ret != 0)
+					{
+						slog(RTC_PRINT, SLOG_ERR, "rtc-service: send_soc_msg unexpected,ret:%d\n",ret);
+					}
+				}
+				else
+				{
+					if (pTmp->module_id >= MODULE_ID_SDK_DYNAMIC_BASE)
+					{
+						send_rtc_msg(pTmp->module_id,SC_RTC_MSG_CMD_TIMEOUT,(void *)&buf, sizeof(RTC_DATA_BUF));
+					}
+					else
+					{
+						ipc_send_message2(MODULE_ID_RTC_SERVICE, pTmp->module_id, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF), (unsigned char*)&buf, 0);
+					}
+				}
 				list_del(&pTmp->list);
 				free(pTmp);
 			}
@@ -704,8 +831,31 @@
 					wakeup = pTmp->wakeup;
 
 				buf.module = pTmp->rtc_id;
-                            buf.time_val = pTmp->time_val + pTmp->interval;
-				ipc_send_message2(MODULE_ID_RTC_SERVICE, pTmp->module_id, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF), (unsigned char*)&buf, 0);
+				buf.srcModule = pTmp->module_id;
+				buf.is_utc = pTmp->is_utc;
+                buf.time_val = pTmp->time_val + pTmp->interval;
+				if(pTmp->cpu == RTC_CPU_AP)
+				{
+					buf.cpu = RTC_CPU_CAP;
+					cmd = RTC_MSG_ALARM_TIMEOUT;
+					slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_alarm_timeout,send to ap cmd:0x%x, srcMod:0x%x, module:0x%x, utc:%d \n", cmd, buf.srcModule, buf.module, buf.is_utc);
+					ret = send_soc_msg(NEAR_PS, MODULE_ID_RTC_SERVICE, cmd, sizeof(RTC_DATA_BUF), (void *)&buf);
+					if (ret != 0)
+					{
+						slog(RTC_PRINT, SLOG_ERR, "rtc-service: send_soc_msg unexpected,ret:%d\n",ret);
+					}
+				}
+				else
+				{
+					if (pTmp->module_id >= MODULE_ID_SDK_DYNAMIC_BASE)
+					{
+						send_rtc_msg(pTmp->module_id,SC_RTC_MSG_CMD_TIMEOUT,(void *)&buf, sizeof(RTC_DATA_BUF));
+					}
+					else
+					{
+						ipc_send_message2(MODULE_ID_RTC_SERVICE, pTmp->module_id, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF), (unsigned char*)&buf, 0);
+					}
+				}
 				list_del(&pTmp->list);
 				free(pTmp);
 			}
@@ -960,6 +1110,82 @@
 }
 
 /********************************************
+ * process_msg_rtc
+ * rtc driver is at cap
+ *******************************************/
+static int process_msg_rtc(MSG_BUF *pmsg_buf)
+{
+	int ret = 0;
+	enum RTC_MSG_CMD cmd = pmsg_buf->usMsgCmd;
+	struct tm *ptm = NULL;
+	RTC_DATA_BUF *buf = NULL;
+	unsigned short req_cmd = 0;
+	int dst_id = 0;
+
+	slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg_rtc, cmd:0x%x, src:0x%x \n", pmsg_buf->usMsgCmd, pmsg_buf->src_id);
+
+	switch (cmd) {
+	case RTC_MSG_GET_TIME:
+		slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg_rtc RTC_MSG_GET_TIME, src:0x%x.\n", pmsg_buf->src_id);
+		handle_get_cap_rtc_time(pmsg_buf);
+		break;
+	case RTC_MSG_SET_TIME:
+		security_log(pmsg_buf->src_id,"set time");
+		slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg_rtc RTC_MSG_SET_TIME, src:0x%x.\n", pmsg_buf->src_id);
+		handle_set_time(pmsg_buf);
+		update_alarm();
+		break;
+	case RTC_MSG_SNTP_UPDATE:
+		ptm = (struct tm *)pmsg_buf->aucDataBuf;
+	    ret = send_soc_msg(NEAR_PS, MODULE_ID_RTC_SERVICE, cmd, pmsg_buf->usDataLen, (void *)pmsg_buf->aucDataBuf);
+	    if (ret != 0) {
+	    	slog(RTC_PRINT, SLOG_ERR, "rtc-service: process_msg_to_ap, ipc_send_message unexpected,ret:%d\n",ret);
+	    }
+		break;
+	case RTC_MSG_ADD_ALARM:
+		slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg_rtc RTC_MSG_ADD_ALARM, src:0x%x, g_clean_flag = %d.\n", pmsg_buf->src_id, g_clean_flag);
+		//Ìí¼ÓrtcǰÏÈɾ³ý´Ërtc_idÒÑÌí¼Ó¼Ç¼£¬Ã¿¸örtc_idÖ»±£Áô1¸ö¶¨Ê±Æ÷
+		if(0 == g_clean_flag){
+		   update_timer_remain(0);
+		   handle_alarm_del(pmsg_buf);
+		   handle_alarm_add(pmsg_buf);
+		}
+		else{		
+		    slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: g_clean_flag is nonzero:0x%x, dont add alarm.\n", g_clean_flag);
+		}
+
+		break;
+	case RTC_MSG_DEL_ALARM:
+		slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg_rtc RTC_MSG_DEL_ALARM, src:0x%x.\n", pmsg_buf->src_id);
+		update_timer_remain(0);
+		handle_alarm_del(pmsg_buf);
+		send_ok_del_rsp(pmsg_buf);
+		alarm_restart(&rtc_timer_list);
+		alarm_restart(&rtc_alarm_list);
+		break;
+	case RTC_MSG_ALARM_TIMEOUT:
+	case RTC_MSG_TIMER_TIMEOUT:
+		slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg_rtc RTC_TIMEOUT, src:0x%x, cmd:0x%x.\n", pmsg_buf->src_id, cmd);
+		handle_alarm_timeout(pmsg_buf);
+		break;
+	case RTC_MSG_DEL_ALL:
+		slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg_rtc RTC_MSG_DEL_ALL, src:0x%x.\n", pmsg_buf->src_id);
+		memcpy(&req_cmd, pmsg_buf->aucDataBuf, sizeof(unsigned short));
+		if(MSG_CMD_RESET_RSP == req_cmd || MSG_CMD_POWEROFF_RSP == req_cmd || MSG_CMD_RESTART_RSP == req_cmd){
+			g_clean_flag = req_cmd;
+		}
+		handle_del_all(pmsg_buf);
+            save_rtc_alarm();
+		//ÕâÀﻹÐèҪ֪ͨÖ÷¿Ø
+		ipc_send_message(MODULE_ID_RTC_SERVICE, pmsg_buf->src_id, req_cmd, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+	return 0;
+}
+
+/********************************************
  * process_msg
  * handle the specified MSG.
  *******************************************/
@@ -1179,7 +1405,7 @@
 		}
 		slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: msg_looper process_msg in, src:0x%x, target:0x%x.\n", msg_buf.src_id, msg_buf.dst_id);
 
-		process_msg_rtc_ap(&msg_buf);
+		process_msg_rtc(&msg_buf);
 		//process_msg(&msg_buf);
 
 		slog(RTC_PRINT, SLOG_ERR, "rtc-service: msg_looper process_msg out.\n");
@@ -1291,7 +1517,7 @@
 		sc_cfg_set("use_rtc", "yes");
 	}
 	init_rtc_alarm();
-
+/*
 	pthread_attr_init(&attr);
 	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
 	result = pthread_create(&rtcservice_thread_id, &attr, rtc_event_process, NULL);
@@ -1305,7 +1531,8 @@
 	{
 		printf("[rtc-service] rtcservice_thread pthread_create  SUCCESS!\n");    
 	}
-	
+*/	
+
     msg_looper();
 	//klocwork
 	//close_rtc(g_rtc_fd);
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/telecom_svr/telecom_server_net.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/telecom_svr/telecom_server_net.c
index 7c111c7..72c91f2 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/telecom_svr/telecom_server_net.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/telecom_svr/telecom_server_net.c
@@ -299,10 +299,11 @@
 	AtiSysInfoCnf sysInfo = {0};

 	memcpy(&sysInfo, pmsg->data, pmsg->data_len);

 	net_sysinfo_t info = {0};

-	info.iSimStatus =  sysInfo.iSvrStatus;

+	info.iSvrStatus =  sysInfo.iSvrStatus;

 	info.iSvrDomain =  sysInfo.iSvrDomain;

 	info.iRoamStaus =  sysInfo.iRoamStaus;

 	info.iSysMode =  sysInfo.iSysMode;

+	info.iSimStatus =  sysInfo.iSimStatus;

 	info.iSysSubMode =  sysInfo.iSysSubMode;

 		

 	pmsg_rsp = sc_net_rsp_msg_create_by_msgid(MSG_CMD_NET_GET_REGISTER_STATE_RSP, sizeof(net_sysinfo_t));

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/wlan_proxy/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/wlan_proxy/Makefile
new file mode 100755
index 0000000..94ccf13
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/wlan_proxy/Makefile
@@ -0,0 +1,38 @@
+#*******************************************************************************
+# include ZTE application makefile
+#*******************************************************************************
+include $(COMMON_MK)
+
+##############USER COMIZE BEGIN################

+

+EXEC = wlan_proxy

+OBJS = $(patsubst %.c,%.o,$(wildcard *.c))
+
+CFLAGS += -g                                             

+CFLAGS += -g -Werror=implicit-function-declaration
+

+LDLIBS += -lpthread -lm -lrt
+LDLIBS += -lsoftap -L$(zte_lib_path)/libsoftap
+LDLIBS += -lsofttimer -L$(zte_lib_path)/libsoft_timer
+LDLIBS += -lnvram -L$(zte_lib_path)/libnvram
+LDLIBS += -latutils -L$(zte_lib_path)/libatutils
+#LDLIBS += -ltinyalsa -L$(zte_lib_path)/libtinyalsa
+LDLIBS += -lscipc -L$(zte_lib_path)/libscipc
+#LDLIBS += -ltelsvr -L$(zte_lib_path)/libtelecom/lib/libtelsvr.a

+

+##############USER COMIZE END##################
+
+#*******************************************************************************
+# targets
+#*******************************************************************************
+all: $(EXEC)
+
+$(EXEC): $(OBJS)
+	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) -Wl,--end-group
+	@cp $@ $@.elf
+
+romfs:
+	$(ROMFSINST) $(EXEC) /sbin/$(EXEC)
+
+clean:
+	-rm -f $(EXEC) *.elf *.gdb *.o
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/wlan_proxy/wlan_proxy.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/wlan_proxy/wlan_proxy.c
new file mode 100755
index 0000000..8c7d884
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/wlan_proxy/wlan_proxy.c
@@ -0,0 +1,1294 @@
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <time.h>
+#include <syslog.h>
+#include <unistd.h>
+#include <errno.h>
+#include <signal.h>
+#include <ctype.h>
+
+#include "sc_ipc.h"
+#include "sc_tel_types.h"
+//#include "sc_wifi.h"
+//#include "wifi_msg.h"
+#include "softap_api.h"
+#include "wifi_inter_msg.h"
+
+#define STA_SCAN_SOFTTIMER_ID 210
+
+#define  wf_err(fmt, args...)	\
+	do {slog(WIFI_PRINT, SLOG_ERR, "[wlan][%s-%d]: " fmt"\n", __FUNCTION__, __LINE__, ## args);} while (0)
+
+#define  wf_log(fmt, args...)	\
+	do {slog(WIFI_PRINT, SLOG_ERR, "[wlan][%s-%d]: " fmt"\n", __FUNCTION__, __LINE__, ## args);} while (0)
+
+
+static int wifi_evts_proc(const struct _sc_ipc_event_* const pevt, const sc_ipc_msg* const pmsg);
+
+//ÈçÒì³£Á÷³Ìδdeint,»á´æÔÚÒѶϿªµÄclient key,²»Ó°ÏìÕý³£µÄclient½ÓÊÕ,ÇÒkeyûÊÍ·Å,²»»á±»ÆäËûÄ£¿é¸´ÓÃ
+static struct list_head cli_msgkey_list;
+
+//¼Ç¼ap²àµÄÉϱ¨×´Ì¬, wifi×´Ì¬ÖØÆôʧЧ,²»ÓÃnv
+//ÒªºÍsc_wifi_ap_status_tͬ²½,ap²à·Å¼¸¸ösc_wifi.hµÄenum
+static wlan_ap_status_t g_wifi_ap_status[IN_WIFI_AP_INDEX_MAX] = {0};
+
+static wlan_sta_status_t g_wifi_sta_status = {0};
+
+static int g_work_mode = 0;
+//¿ª¹Ø
+static int g_wifi_enable = SC_WIFI_DISABLE;
+//Èç¹û¶àssid,Ö»¼Ç¼Ö÷ssidµÄ״̬
+static int g_ap_enable = SC_WIFI_DISABLE;
+
+static int g_sta_enable = SC_WIFI_DISABLE;
+//ɨÃè״̬
+static int g_sta_scaning = 0;
+
+//from cap api
+static sc_ipc_event s_wifi_evts[] =
+{
+	{0, 1, 0, SCWIFI_CMD_CONN_REQ, wifi_evts_proc, NULL, NULL},
+	{0, 1, 0, SCWIFI_CMD_ENABLE_REQ, wifi_evts_proc, NULL, NULL},
+	{0, 1, 0, SCWIFI_CMD_MODE_REQ, wifi_evts_proc, NULL, NULL},
+	{0, 1, 0, SCWIFI_GET_MODE_REQ, wifi_evts_proc, NULL, NULL},
+	{0, 1, 0, SCWIFI_AP_SET_SSID_REQ, wifi_evts_proc, NULL, NULL},
+	{0, 1, 0, SCWIFI_AP_SET_HIDE_REQ, wifi_evts_proc, NULL, NULL},
+	{0, 1, 0, SCWIFI_AP_SET_MODE_REQ, wifi_evts_proc, NULL, NULL},
+	{0, 1, 0, SCWIFI_AP_SET_BW_REQ, wifi_evts_proc, NULL, NULL},
+	{0, 1, 0, SCWIFI_AP_SET_MAX_ACCESS_NUM_REQ, wifi_evts_proc, NULL, NULL},
+	{0, 1, 0, SCWIFI_AP_SET_CC_CH_REQ, wifi_evts_proc, NULL, NULL},
+	{0, 1, 0, SCWIFI_AP_SET_ACL_REQ, wifi_evts_proc, NULL, NULL},
+	{0, 1, 0, SCWIFI_AP_SET_AUTH_REQ, wifi_evts_proc, NULL, NULL},
+	{0, 1, 0, SCWIFI_AP_ENABLE_REQ, wifi_evts_proc, NULL, NULL},
+	{0, 1, 0, SCWIFI_GET_AP_STATUS_REQ, wifi_evts_proc, NULL, NULL},
+	{0, 1, 0, SCWIFI_GET_AP_PARAM_REQ, wifi_evts_proc, NULL, NULL},
+	//station
+	{0, 1, 0, SCWIFI_STA_SET_PARAM_REQ, wifi_evts_proc, NULL, NULL},
+	{0, 1, 0, SCWIFI_STA_GET_PARAM_REQ, wifi_evts_proc, NULL, NULL},
+	{0, 1, 0, SCWIFI_STA_ENABLE_REQ, wifi_evts_proc, NULL, NULL}, 
+	{0, 1, 0, SCWIFI_GET_STA_STATUS_REQ, wifi_evts_proc, NULL, NULL}, 
+	{0, 1, 0, SCWIFI_STA_SCAN_REQ, wifi_evts_proc, NULL, NULL}, 
+	
+};
+
+static const char* cmdid_to_string(int status)
+{
+	switch (status) {
+		//ap
+		CASE_RETURN_STR(MSG_CMD_CAP_WIFI_STATUS);
+		CASE_RETURN_STR(MSG_CMD_CAP_AP_STATUS);		
+		CASE_RETURN_STR(MSG_CMD_CAP_AP_STA_CHANGE);
+		CASE_RETURN_STR(MSG_CMD_CAP_STA_STATUS);
+		CASE_RETURN_STR(MSG_CMD_CAP_STA_SCAN_RES);
+
+		//cap
+		CASE_RETURN_STR(SCWIFI_CMD_CONN_REQ);
+		CASE_RETURN_STR(SCWIFI_CMD_ENABLE_REQ);
+		CASE_RETURN_STR(SCWIFI_CMD_MODE_REQ);
+		CASE_RETURN_STR(SCWIFI_GET_MODE_REQ);
+		CASE_RETURN_STR(SCWIFI_AP_SET_SSID_REQ);
+		CASE_RETURN_STR(SCWIFI_AP_SET_HIDE_REQ);
+		CASE_RETURN_STR(SCWIFI_AP_SET_MODE_REQ);
+		CASE_RETURN_STR(SCWIFI_AP_SET_BW_REQ);
+		CASE_RETURN_STR(SCWIFI_AP_SET_MAX_ACCESS_NUM_REQ);
+		CASE_RETURN_STR(SCWIFI_AP_SET_CC_CH_REQ);
+		CASE_RETURN_STR(SCWIFI_AP_SET_ACL_REQ);
+		CASE_RETURN_STR(SCWIFI_AP_SET_AUTH_REQ);
+		CASE_RETURN_STR(SCWIFI_AP_ENABLE_REQ);
+		CASE_RETURN_STR(SCWIFI_GET_AP_STATUS_REQ);
+		CASE_RETURN_STR(SCWIFI_GET_AP_PARAM_REQ);
+		
+		//station
+		CASE_RETURN_STR(SCWIFI_STA_SET_PARAM_REQ);
+		CASE_RETURN_STR(SCWIFI_STA_GET_PARAM_REQ);
+		CASE_RETURN_STR(SCWIFI_STA_ENABLE_REQ);
+		CASE_RETURN_STR(SCWIFI_GET_STA_STATUS_REQ);
+		CASE_RETURN_STR(SCWIFI_STA_SCAN_REQ);
+
+	};
+	return "UNKNOWN  CMD ID";
+}
+
+static void wifi_ipcmsg_set(int fdsvr, int msgreq, void *data, int len, sc_ipc_msg *pipcmsg)
+{
+	pipcmsg->fd_cli = sc_ipc_get_self_fd();
+	pipcmsg->fd_svr = fdsvr;
+	pipcmsg->msg_req = msgreq;	
+    pipcmsg->data_len = len;
+	memcpy(pipcmsg->data, data, len);
+}
+
+static int record_client_key(int key)
+{
+	scwifi_cli_key_t *pCur = NULL;
+	scwifi_cli_key_t *pTmp = NULL;
+
+	list_for_each_entry(pTmp, &cli_msgkey_list, list) {
+		if (pTmp->cli_key == key) {
+			slog(WIFI_PRINT, SLOG_ERR, "wifi client:%d already in list!\n", key);
+			return SC_ERR_SUCCESS;
+		}
+	}
+
+	pCur = malloc(sizeof(scwifi_cli_key_t));
+	if (pCur == NULL) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi client no memery.\n");
+		return SC_ERR_NO_MEMORY;
+	}
+	
+	memset(pCur, 0, sizeof(scwifi_cli_key_t));
+	pCur->cli_key = key;
+	list_add_tail(&pCur->list, &cli_msgkey_list);
+
+	return SC_ERR_SUCCESS;
+}
+
+static int remove_client_key(int key)
+{
+	scwifi_cli_key_t *pTmp, *pTmp1;
+	
+	list_for_each_entry_safe(pTmp, pTmp1, &cli_msgkey_list, list) {
+		if (pTmp->cli_key == key) {
+			list_del(&pTmp->list);
+			free(pTmp);
+		}
+	}
+	
+	return SC_ERR_SUCCESS;
+}
+
+static void send_msg_by_key(sc_ipc_msg* pmsg)
+{
+    int ret = 0;
+    int msg_fd = -1;
+
+	scwifi_cli_key_t *pCur = NULL;
+	scwifi_cli_key_t *pTmp = NULL;
+
+	list_for_each_entry(pTmp, &cli_msgkey_list, list) {
+		pmsg->fd_svr = pTmp->cli_key;
+		ret = sc_ipc_send_msg(pmsg);
+		if (ret != 0) {
+			slog(WIFI_PRINT, SLOG_ERR, "wifi msg to cli(0x%x) fail.\n", pTmp->cli_key);
+		}
+		else {
+			slog(WIFI_PRINT, SLOG_ERR, "wifi msg to cli(0x%x) succ.\n", pTmp->cli_key);
+		}
+	}
+	
+}
+
+static sc_ipc_msg *wifi_connect_request(const sc_ipc_msg* const pmsg)
+{
+	scwifi_connect_t *pdata_info = (scwifi_connect_t *)pmsg->data;
+	scwifi_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res));
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+
+	comm_res.result = SC_ERR_SUCCESS;
+	
+	if(SC_WIFI_DISABLE == pdata_info->enable) {
+		comm_res.result = remove_client_key(pmsg->fd_cli);
+		slog(WIFI_PRINT, SLOG_ERR, "wifi client(0x%x) disconnect[%d].\n", pmsg->fd_cli, comm_res.result);
+	}
+	else {
+		comm_res.result = record_client_key(pmsg->fd_cli);
+		slog(WIFI_PRINT, SLOG_ERR, "wifi client(0x%x) connect[%d].\n", pmsg->fd_cli, comm_res.result);
+	}	
+
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static int cap_check_wifi(void)
+{
+	char  wifi_mac[20] = {0};
+	char  wifi_chip[20] = {0};
+
+	sc_cfg_get("wifi_chip", wifi_chip, sizeof(wifi_chip));
+	if (strcmp(wifi_chip, "") == 0){
+		slog(WIFI_PRINT, SLOG_ERR, "ap wlan_server not ready, please wait!");
+		return SC_ERR_NOT_READY;
+	}
+	else if (strcmp(wifi_chip, "0") == 0){
+		slog(WIFI_PRINT, SLOG_ERR, "wifi device drive fail!");
+		return SC_ERR_NO_DEVICE;
+	}
+
+	sc_cfg_get("wifi_mac", wifi_mac, sizeof(wifi_mac));
+	if(strlen(wifi_mac) == 0){
+		slog(WIFI_PRINT, SLOG_ERR, "please config valid wifi mac!");
+		return SC_ERR_NO_MAC;
+	}
+
+	return SC_ERR_SUCCESS;
+}
+
+static sc_ipc_msg *wifi_enable_request(const sc_ipc_msg* const pmsg)
+{
+	scwifi_enable_t *pdata_info = (scwifi_enable_t *)pmsg->data;
+	scwifi_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res));
+	int ret = 0;
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+
+	comm_res.result = cap_check_wifi();
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		if(SC_WIFI_ENABLE == pdata_info->enable) {
+			ret = send_soc_msg(NEAR_PS, MODULE_ID_WIFI, MSG_CMD_CAP_WIFI_ENABLE, 0, NULL);
+			if (ret != 0) {
+				slog(WIFI_PRINT, SLOG_ERR, "sc_wifi_enable ipc_send_message fail, ret:%d\n", ret);
+				comm_res.result = SC_ERR_SOC;
+			}
+		}
+		else {		
+			ret = send_soc_msg(NEAR_PS, MODULE_ID_WIFI, MSG_CMD_CAP_WIFI_DISABLE, 0, NULL);
+			if (ret != 0) {
+				slog(WIFI_PRINT, SLOG_ERR, "sc_wifi_enable ipc_send_message fail, ret:%d\n", ret);
+				comm_res.result = SC_ERR_SOC;
+			}
+		}
+	}
+
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		g_wifi_enable = pdata_info->enable;
+	}
+	
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+//Ôö¼ÓÔÚÆðap»òstaʱÅжÏÊÇ·ñÖ§³Ö
+static sc_ipc_msg *wifi_set_mode_request(const sc_ipc_msg* const pmsg)
+{
+	scwifi_workmode_t *pdata_info = (scwifi_workmode_t *)pmsg->data;
+	scwifi_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res));
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	
+	g_work_mode = pdata_info->work_mode;
+	if (g_work_mode == IN_WIFI_WORK_MODE_AP0 || g_work_mode == IN_WIFI_WORK_MODE_AP0_STA) {
+		if (g_wifi_ap_status[0].status == IN_WIFI_AP_STATUS_NONE) {
+			g_wifi_ap_status[0].status = IN_WIFI_AP_STATUS_IDLE;
+		}
+	}
+	
+	comm_res.result = SC_ERR_SUCCESS;
+
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static sc_ipc_msg *wifi_get_mode_request(const sc_ipc_msg* const pmsg)
+{
+	scwifi_workmode_t *pdata_info = (scwifi_workmode_t *)pmsg->data;
+	scwifi_mode_res_t data_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(data_res));
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	
+	data_res.work_mode = g_work_mode;
+	data_res.result = SC_ERR_SUCCESS;
+
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&data_res, sizeof(data_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static sc_ipc_msg *wifi_set_ssid_request(const sc_ipc_msg* const pmsg)
+{
+	wlan_ap_ssid_t *pdata_info = (wlan_ap_ssid_t *)pmsg->data;
+	scwifi_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res));
+	int ret = 0;
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	
+	comm_res.result = cap_check_wifi();
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		ret = send_soc_msg(NEAR_PS, MODULE_ID_WIFI, MSG_CMD_CAP_WIFI_SET_SSID, sizeof(wlan_ap_ssid_t), pdata_info);
+		if (ret != 0) {
+			slog(WIFI_PRINT, SLOG_ERR, "wifi_set_ssid_request ipc_send_message fail, ret:%d\n", ret);
+			comm_res.result = SC_ERR_SOC;
+		}
+		
+		slog(WIFI_PRINT, SLOG_NORMAL, "wifi_set_ssid_request id:%d, ssid:%s\n", pdata_info->idx, pdata_info->ssid);
+	}
+	
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static sc_ipc_msg *wifi_set_ssid_hide_request(const sc_ipc_msg* const pmsg)
+{
+	wlan_ap_ssid_hide_t *pdata_info = (wlan_ap_ssid_hide_t *)pmsg->data;
+	scwifi_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res));
+	int ret = 0;
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	
+	comm_res.result = cap_check_wifi();
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		ret = send_soc_msg(NEAR_PS, MODULE_ID_WIFI, MSG_CMD_CAP_WIFI_SET_HIDESSID, sizeof(wlan_ap_ssid_hide_t), pdata_info);
+		if (ret != 0) {
+			slog(WIFI_PRINT, SLOG_ERR, "sc_wifi_ap_ssid_set ipc_send_message fail, ret:%d\n", ret);
+			comm_res.result = SC_ERR_SOC;
+		}
+	}
+	
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static sc_ipc_msg *wifi_set_proto_mode_request(const sc_ipc_msg* const pmsg)
+{
+	wlan_ap_wl_mode_t *pdata_info = (wlan_ap_wl_mode_t *)pmsg->data;
+	scwifi_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res));
+	int ret = 0;
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	
+	comm_res.result = cap_check_wifi();
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		ret = send_soc_msg(NEAR_PS, MODULE_ID_WIFI, MSG_CMD_CAP_WIFI_SET_MODE, sizeof(wlan_ap_wl_mode_t), pdata_info);
+		if (ret != 0) {
+			slog(WIFI_PRINT, SLOG_ERR, "sc_wifi_ap_ssid_set ipc_send_message fail, ret:%d\n", ret);
+			comm_res.result = SC_ERR_SOC;
+		}
+	}
+	
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static sc_ipc_msg *wifi_set_htbw_request(const sc_ipc_msg* const pmsg)
+{
+	wlan_ap_bandwidth_t *pdata_info = (wlan_ap_bandwidth_t *)pmsg->data;
+	scwifi_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res));
+	int ret = 0;
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	
+	comm_res.result = cap_check_wifi();
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		ret = send_soc_msg(NEAR_PS, MODULE_ID_WIFI, MSG_CMD_CAP_WIFI_SET_BANDWIDTH, sizeof(wlan_ap_bandwidth_t), pdata_info);
+		if (ret != 0) {
+			slog(WIFI_PRINT, SLOG_ERR, "sc_wifi_ap_ssid_set ipc_send_message fail, ret:%d\n", ret);
+			comm_res.result = SC_ERR_SOC;
+		}
+	}
+
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static sc_ipc_msg *wifi_set_access_num_request(const sc_ipc_msg* const pmsg)
+{
+	wlan_ap_max_sta_t *pdata_info = (wlan_ap_max_sta_t *)pmsg->data;
+	scwifi_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res));
+	int ret = 0;
+	char max_station_num[16] = {0};
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	
+	comm_res.result = cap_check_wifi();
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		sc_cfg_get("MAX_Station_num", max_station_num, sizeof(max_station_num));
+		if (atoi(max_station_num) < pdata_info->max_sta_num) {
+			slog(WIFI_PRINT, SLOG_ERR, "sc_wifi_ap_access_num too big:[%s], %d\n", max_station_num, pdata_info->max_sta_num);
+			comm_res.result = SC_ERR_BADPARAM;
+		}
+		else {
+			ret = send_soc_msg(NEAR_PS, MODULE_ID_WIFI, MSG_CMD_CAP_WIFI_SET_MAXSTANUM, sizeof(wlan_ap_max_sta_t), pdata_info);
+			if (ret != 0) {
+				slog(WIFI_PRINT, SLOG_ERR, "sc_wifi_ap_access_num ipc_send_message fail, ret:%d\n", ret);
+				comm_res.result = SC_ERR_SOC;
+			}
+		}
+	}
+	
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static sc_ipc_msg *wifi_set_country_channel_request(const sc_ipc_msg* const pmsg)
+{
+	wlan_ap_cc_ch_t *pdata_info = (wlan_ap_cc_ch_t *)pmsg->data;
+	scwifi_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res));
+	int ret = 0;
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	
+	comm_res.result = cap_check_wifi();
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		ret = send_soc_msg(NEAR_PS, MODULE_ID_WIFI, MSG_CMD_CAP_WIFI_SET_CC_CH, sizeof(wlan_ap_cc_ch_t), pdata_info);
+		if (ret != 0) {
+			slog(WIFI_PRINT, SLOG_ERR, "sc_wifi_ap_ssid_set ipc_send_message fail, ret:%d\n", ret);
+			comm_res.result = SC_ERR_SOC;
+		}
+	}
+
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static sc_ipc_msg *wifi_set_acl_request(const sc_ipc_msg* const pmsg)
+{
+	wlan_ap_acl_t *pdata_info = (wlan_ap_acl_t *)pmsg->data;
+	scwifi_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res));
+	int ret = 0;
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	
+	comm_res.result = cap_check_wifi();
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		ret = send_soc_msg(NEAR_PS, MODULE_ID_WIFI, MSG_CMD_CAP_WIFI_SET_ACL, sizeof(wlan_ap_acl_t), pdata_info);
+		if (ret != 0) {
+			slog(WIFI_PRINT, SLOG_ERR, "sc_wifi_ap_ssid_set ipc_send_message fail, ret:%d\n", ret);
+			comm_res.result = SC_ERR_SOC;
+		}
+	}
+
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static sc_ipc_msg *wifi_set_auth_request(const sc_ipc_msg* const pmsg)
+{
+	wlan_ap_auth_t *pdata_info = (wlan_ap_auth_t *)pmsg->data;
+	scwifi_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res));
+	int ret = 0;
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	
+	comm_res.result = cap_check_wifi();
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		ret = send_soc_msg(NEAR_PS, MODULE_ID_WIFI, MSG_CMD_CAP_WIFI_SET_AUTH, sizeof(wlan_ap_auth_t), pdata_info);
+		if (ret != 0) {
+			slog(WIFI_PRINT, SLOG_ERR, "wifi_set_auth_request ipc_send_message fail, ret:%d\n", ret);
+			comm_res.result = SC_ERR_SOC;
+		}
+	}
+
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static sc_ipc_msg *wifi_ap_enable_request(const sc_ipc_msg* const pmsg)
+{
+	wlan_ap_enable_t *pdata_info = (wlan_ap_enable_t *)pmsg->data;
+	scwifi_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res));
+	int ret = 0;
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	
+	comm_res.result = cap_check_wifi();
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		if ((pdata_info->enable == SC_WIFI_ENABLE) && 
+			(g_wifi_enable == SC_WIFI_DISABLE)) {
+			slog(WIFI_PRINT, SLOG_ERR, "wifi_ap_enable_request wifi[%d] close!\n", g_wifi_enable);
+			comm_res.result = SC_ERR_CONDITION;
+		}
+	}
+	
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		ret = send_soc_msg(NEAR_PS, MODULE_ID_WIFI, MSG_CMD_CAP_WIFI_AP_ENABLE, sizeof(wlan_ap_enable_t), pdata_info);
+		if (ret != 0) {
+			slog(WIFI_PRINT, SLOG_ERR, "wifi_ap_enable_request ipc_send_message fail, ret:%d\n", ret);
+			comm_res.result = SC_ERR_SOC;
+		}
+	}
+
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		g_ap_enable = pdata_info->enable;
+	}
+
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static sc_ipc_msg *wifi_get_ap_status_request(const sc_ipc_msg* const pmsg)
+{
+	scwifi_ap_index_t *pdata_info = (scwifi_ap_index_t *)pmsg->data;
+	scwifi_ap_enable_res_t data_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(data_res));
+	int ret = 0;
+	int idx = pdata_info->idx;
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	//Èç¹ûû³õʼ»¯ ±¨´í
+	//if ()
+	data_res.result = SC_ERR_SUCCESS;
+	data_res.status = g_wifi_ap_status[idx].status;
+	strncpy(data_res.ifname, g_wifi_ap_status[idx].ifname, sizeof(data_res.ifname) - 1);
+
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&data_res, sizeof(data_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+//2.4G main ssid
+static void get_ap_param_main_24(scwifi_ap_param_res_t *p_param)
+{
+	char s_ssid_hide[10] = {0};
+	char s_mode[10] = {0};
+	char s_bandwidth[10] = {0};
+	char s_channel[10] = {0};
+	char s_max_sta_num[10] = {0};
+	char s_acl_rule[10] = {0};
+
+	sc_cfg_get("SSID1", p_param->ssid, sizeof(p_param->ssid));
+	
+	sc_cfg_get("HideSSID", s_ssid_hide, sizeof(s_ssid_hide));
+	p_param->ssid_hide = atoi(s_ssid_hide);
+
+	sc_cfg_get("WirelessMode", s_mode, sizeof(s_mode));
+	p_param->mode = atoi(s_mode);
+
+	sc_cfg_get("wifi_11n_cap", s_bandwidth, sizeof(s_bandwidth));
+	p_param->bandwidth = atoi(s_bandwidth);
+
+	sc_cfg_get("Channel", s_channel, sizeof(s_channel));
+	p_param->channel = atoi(s_channel);
+	
+	sc_cfg_get("MAX_Access_num", s_max_sta_num, sizeof(s_max_sta_num));
+	p_param->max_sta_num = atoi(s_max_sta_num);
+
+	sc_cfg_get("CountryCode", p_param->countrycode, sizeof(p_param->countrycode));
+	
+	sc_cfg_get("ACL_mode", s_acl_rule, sizeof(s_acl_rule));
+	p_param->acl_rule = atoi(s_acl_rule);
+	if (p_param->acl_rule == 1) {
+		sc_cfg_get("wifi_mac_white_list", p_param->mac_list, sizeof(p_param->mac_list));
+	}
+	else if (p_param->acl_rule == 2) {
+		sc_cfg_get("wifi_mac_white_list", p_param->mac_list, sizeof(p_param->mac_list));
+	}
+
+	sc_cfg_get("AuthMode", p_param->authmode, sizeof(p_param->authmode));
+	sc_cfg_get("EncrypType", p_param->encrypt, sizeof(p_param->encrypt));
+	sc_cfg_get("WPAPSK1", p_param->pwd, sizeof(p_param->pwd));
+}
+
+static sc_ipc_msg *wifi_get_ap_param_request(const sc_ipc_msg* const pmsg)
+{
+	scwifi_ap_index_t *pdata_info = (scwifi_ap_index_t *)pmsg->data;
+	scwifi_ap_param_res_t data_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(data_res));
+	int ret = 0;
+	int idx = pdata_info->idx;
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+
+	if (idx == IN_WIFI_AP_INDEX_AP0) {
+		data_res.result = SC_ERR_SUCCESS;
+		//¹Ø»ú±£´æ ¿ÉÄÜÊÇÉϴεIJÎÊý
+		get_ap_param_main_24(&data_res);
+	}
+	else {
+		data_res.result = SC_ERR_BADPARAM;
+	}
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&data_res, sizeof(data_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static sc_ipc_msg *wifi_sta_set_param_request(const sc_ipc_msg* const pmsg)
+{
+	wlan_sta_param_t *pdata_info = (wlan_sta_param_t *)pmsg->data;
+	scwifi_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res));
+	int ret = 0;
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+
+
+	/*
+	Èç¹ûÁ¬½ÓÖУ¬ÊÇ·ñ²»ÈÃÉèÖà ÓÐûÓÐÈ¡ÏûµÄ¶¯×÷£¿
+	(void)zte_web_read("sta_ip_status", sta_ip_status);
+	(void)zte_web_read("wifi_cur_state", wifi_cur_state);
+	if (strcmp(sta_ip_status, WEB_WLAN_STATION_IP_STATUS_CONNECTING) == 0 ||
+	    strcmp(sta_ip_status, WIFI_STATION_IP_STATUS_DHCPING) == 0) {
+		//zte_write_result_to_web(wp,FAILURE);
+		zte_write_result_to_web(wp, PROCESSING);
+		slog(WIFI_PRINT, SLOG_ERR,"[%s]sta_ip_status connecting so failed\n", __FILE__);
+
+		return;
+	}
+	*/
+	comm_res.result = cap_check_wifi();
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		ret = send_soc_msg(NEAR_PS, MODULE_ID_WIFI, MSG_CMD_CAP_STA_SET_PARAM, sizeof(wlan_sta_param_t), pdata_info);
+		if (ret != 0) {
+			slog(WIFI_PRINT, SLOG_ERR, "sc_wifi_ap_ssid_set ipc_send_message fail, ret:%d\n", ret);
+			comm_res.result = SC_ERR_SOC;
+		}
+	}
+
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static spot_t *parse_spot_string(char *spot_string)
+{
+	spot_t *spot = NULL;
+	char *splited_string = NULL;
+	char *save = NULL;
+	const char *delimiter = ",";
+	wifi_profile_content_t wifi_profile_content = WIFI_STATION_CONTENT_UNDEFINED;
+	char spot_string_tmp[WIFI_STATION_SPOT_LEN] = {0};
+
+	if (spot_string == NULL) {
+		return NULL;
+	}
+	//·ÅÔ´×Ö·û´®±»¸Äд
+	strncpy(spot_string_tmp, spot_string, sizeof(spot_string_tmp)-1);
+
+	spot = safe_malloc(sizeof(spot_t), FALSE);
+	if (spot == NULL) {
+		return NULL;
+	}
+
+	spot->is_tried_connect = FALSE;
+
+	//·Ö¸î×Ö·û´®£¬´æ´¢µ½½á¹¹Ìå
+	splited_string = strtok_r(spot_string_tmp, delimiter, &save);
+	while (splited_string) {
+		wifi_profile_content++;
+		switch (wifi_profile_content) {
+		case WIFI_STATION_PROFILE_NAME:
+			strncpy(spot->profile_name, splited_string, sizeof(spot->profile_name)-1);
+			break;
+		case WIFI_STATION_FROM_PROVIDER:
+			spot->from_provider = atoi(splited_string);
+			break;
+		case WIFI_STATION_CONNECT_STATUS:
+			spot->connect_status = atoi(splited_string);
+			break;
+		case WIFI_STATION_SIGNAL:
+			spot->signal = atoi(splited_string);
+			break;
+		case WIFI_STATION_SSID:
+			strncpy(spot->ssid, splited_string, sizeof(spot->ssid)-1);
+			break;
+		case WIFI_STATION_AUTH_MODE:
+			strncpy(spot->auth_mode, splited_string, sizeof(spot->auth_mode)-1);
+			break;
+		case WIFI_STATION_ENCRYPT_TYPE:
+			strncpy(spot->encrypt_type, splited_string, sizeof(spot->encrypt_type)-1);
+			break;
+		case WIFI_STATION_PASSWORD:
+			strncpy(spot->password, splited_string, sizeof(spot->password)-1);
+			break;
+		case WIFI_STATION_KEY_ID:
+			spot->keyID = atoi(splited_string);
+			break;
+		case WIFI_STATION_AP_MAC:
+			strncpy(spot->mac, splited_string, sizeof(spot->mac)-1);
+			break;
+		default:
+			break;
+		}
+
+		splited_string = strtok_r(NULL, delimiter, &save);
+	}
+
+	spot->network_id = -1; // from nv profile , there is no network id property, so ,default set it -1
+
+	if (wifi_profile_content != WIFI_STATION_AP_MAC) {
+		safe_free(spot);
+		return NULL;
+	}
+
+	return spot;
+}
+
+static sc_ipc_msg *wifi_sta_get_param_request(const sc_ipc_msg* const pmsg)
+{
+	scwifi_sta_param_res_t data_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(data_res));
+	int ret = 0;
+	char spot_string[WIFI_STATION_SPOT_LEN] = {0};
+	
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+
+	data_res.result = SC_ERR_SUCCESS;
+	//¹Ø»ú±£´æ ¿ÉÄÜÊÇÉϴεIJÎÊý
+	sc_cfg_get("wifi_profile", spot_string, sizeof(spot_string));
+	if (strcmp(spot_string, "") != 0) {
+		spot_t *spot = NULL;
+		spot = parse_spot_string(spot_string);
+		strncpy(data_res.ssid, spot->ssid, sizeof(data_res.ssid)-1);
+		strncpy(data_res.authmode, spot->auth_mode, sizeof(data_res.authmode)-1);
+		strncpy(data_res.encrypt, spot->encrypt_type, sizeof(data_res.encrypt)-1);
+		strncpy(data_res.pwd, spot->password, sizeof(data_res.pwd)-1);
+		safe_free(spot);
+	}		
+
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&data_res, sizeof(data_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+
+static sc_ipc_msg *wifi_sta_enable_request(const sc_ipc_msg* const pmsg)
+{
+	wlan_sta_enable_t *pdata_info = (wlan_sta_enable_t *)pmsg->data;
+	scwifi_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res));
+	int ret = 0;
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	
+	comm_res.result = cap_check_wifi();
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		if ((pdata_info->enable == SC_WIFI_ENABLE) && 
+			(g_wifi_enable == SC_WIFI_DISABLE || g_ap_enable == SC_WIFI_DISABLE)) {
+			slog(WIFI_PRINT, SLOG_ERR, "wifi_sta_enable_request wifi[%d]/ap[%d] close!\n", g_wifi_enable, g_ap_enable);
+			comm_res.result = SC_ERR_CONDITION;
+		}
+	}
+	
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		ret = send_soc_msg(NEAR_PS, MODULE_ID_WIFI, MSG_CMD_CAP_STA_ENABLE, sizeof(wlan_sta_enable_t), pdata_info);
+		if (ret != 0) {
+			slog(WIFI_PRINT, SLOG_ERR, "wifi_sta_enable_request ipc_send_message fail, ret:%d\n", ret);
+			comm_res.result = SC_ERR_SOC;
+		}
+	}
+
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		g_sta_enable = pdata_info->enable;
+		if (pdata_info->enable == SC_WIFI_ENABLE) {
+			sc_cfg_set("wifi_sta_connection", "1");
+		} 
+		else {
+			sc_cfg_set("wifi_sta_connection", "0");
+		}
+	}
+	
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static sc_ipc_msg *wifi_get_sta_status_request(const sc_ipc_msg* const pmsg)
+{
+	scwifi_sta_stat_res_t data_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(data_res));
+	int ret = 0;
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	//Èç¹ûû³õʼ»¯ ±¨´í--ĬÈÏÖµNONE Èç¹ûmodeÉèÁ˾ÍΪIDLE£¬¹Ø±ÕstaʱҲ¸Ä³ÉIDLE
+	//±£´æÇ°ÖÃ״̬
+	//if ()
+	data_res.result = SC_ERR_SUCCESS;
+	data_res.status.status = g_wifi_sta_status.status;
+	strncpy(data_res.status.ifname, g_wifi_sta_status.ifname, sizeof(data_res.status.ifname) - 1);
+	strncpy(data_res.status.ap_bssid, g_wifi_sta_status.ap_bssid, sizeof(data_res.status.ap_bssid) - 1);
+	data_res.status.signal_level = g_wifi_sta_status.signal_level;
+	data_res.status.has_addr = g_wifi_sta_status.has_addr;
+	strncpy(data_res.status.str_addr, g_wifi_sta_status.str_addr, sizeof(data_res.status.str_addr) - 1);
+	data_res.status.has_addr6 = g_wifi_sta_status.has_addr6;
+	strncpy(data_res.status.str_addr6, g_wifi_sta_status.str_addr6, sizeof(data_res.status.str_addr6) - 1);
+	data_res.status.reason_code = g_wifi_sta_status.reason_code;
+
+
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&data_res, sizeof(data_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static void scan_softtimer_cb(void *param)
+{
+	slog(WIFI_PRINT, SLOG_ERR, "scan_softtimer_cb!\n");
+	g_sta_scaning = 0;
+	return 0;
+}
+
+static sc_ipc_msg *wifi_sta_scan_request(const sc_ipc_msg* const pmsg)
+{
+	scwifi_common_res_t comm_res = {0};
+	sc_ipc_msg *pmsg_rsp = sc_ipc_msg_new(sizeof(comm_res)); //-----//zhu yi shi fang?
+	int ret = 0;
+
+	if(NULL == pmsg_rsp) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	
+	comm_res.result = cap_check_wifi();
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		if (g_sta_enable == SC_WIFI_DISABLE) {
+			slog(WIFI_PRINT, SLOG_ERR, "wifi_sta_scan_request sta[%d] close!\n", g_sta_enable);
+			comm_res.result = SC_ERR_CONDITION;
+		}
+		else if (g_sta_scaning == 1) {
+			slog(WIFI_PRINT, SLOG_ERR, "wifi_sta_scan_request scaning!\n");
+			comm_res.result = SC_ERR_BUSY;
+		}
+	}
+	
+	if (comm_res.result == SC_ERR_SUCCESS) {
+		ret = send_soc_msg(NEAR_PS, MODULE_ID_WIFI, MSG_CMD_CAP_STA_SCAN, 0, NULL);
+		if (ret != 0) {
+			slog(WIFI_PRINT, SLOG_ERR, "wifi_sta_enable_request ipc_send_message fail, ret:%d\n", ret);
+			comm_res.result = SC_ERR_SOC;
+		}
+		else {	
+			sc_timer_delete(STA_SCAN_SOFTTIMER_ID);
+			ret = sc_timer_create(STA_SCAN_SOFTTIMER_ID, TIMER_FLAG_ONCE, 20*1000, scan_softtimer_cb, NULL);
+			if(0 == ret) {
+				g_sta_scaning = 1;
+			}
+			else {
+				slog(WIFI_PRINT, SLOG_ERR, "STA_SCAN_SOFTTIMER_ID creat fail, ret:%d\n", ret);
+			}
+		}
+	}
+
+	wifi_ipcmsg_set(pmsg->fd_cli, pmsg->msg_rsp, (void *)&comm_res, sizeof(comm_res), pmsg_rsp);
+
+	return pmsg_rsp;
+}
+
+static int wifi_evts_proc(const struct _sc_ipc_event_* const pevt, const sc_ipc_msg* const pmsg)
+{
+	int msg_id = pmsg->msg_req;
+	sc_ipc_msg *pmsg_rsp = NULL;
+
+	slog(WIFI_PRINT, SLOG_ERR, "wifi_evts_proc msg_id=[0x%x]%s\n", msg_id, cmdid_to_string(msg_id));
+	
+	switch (msg_id) {
+	case SCWIFI_CMD_CONN_REQ:
+		pmsg_rsp = wifi_connect_request(pmsg);
+		break;
+	
+	case SCWIFI_CMD_ENABLE_REQ:
+		pmsg_rsp = wifi_enable_request(pmsg);
+		break;
+	
+	case SCWIFI_CMD_MODE_REQ:
+		pmsg_rsp = wifi_set_mode_request(pmsg);
+		break;
+
+	case SCWIFI_GET_MODE_REQ:
+		pmsg_rsp = wifi_get_mode_request(pmsg);
+		break;	
+	
+	case SCWIFI_AP_SET_SSID_REQ:
+		pmsg_rsp = wifi_set_ssid_request(pmsg);
+		break;
+	
+	case SCWIFI_AP_SET_HIDE_REQ:
+		pmsg_rsp = wifi_set_ssid_hide_request(pmsg);
+		break;
+
+	case SCWIFI_AP_SET_MODE_REQ:
+		pmsg_rsp = wifi_set_proto_mode_request(pmsg);
+		break;
+	
+	case SCWIFI_AP_SET_BW_REQ:
+		pmsg_rsp = wifi_set_htbw_request(pmsg);
+		break;
+
+	case SCWIFI_AP_SET_MAX_ACCESS_NUM_REQ:
+		pmsg_rsp = wifi_set_access_num_request(pmsg);
+		break;
+	
+	case SCWIFI_AP_SET_CC_CH_REQ:
+		pmsg_rsp = wifi_set_country_channel_request(pmsg);
+		break;
+	
+	case SCWIFI_AP_SET_ACL_REQ:
+		pmsg_rsp = wifi_set_acl_request(pmsg);
+		break;
+	
+	case SCWIFI_AP_SET_AUTH_REQ:
+		pmsg_rsp = wifi_set_auth_request(pmsg);
+		break;
+	
+	case SCWIFI_AP_ENABLE_REQ:
+		pmsg_rsp = wifi_ap_enable_request(pmsg);
+		break;
+		
+	case SCWIFI_GET_AP_STATUS_REQ:
+		pmsg_rsp = wifi_get_ap_status_request(pmsg);
+		break;
+	
+	case SCWIFI_GET_AP_PARAM_REQ:
+		pmsg_rsp = wifi_get_ap_param_request(pmsg);
+		break;
+//station
+	case SCWIFI_STA_SET_PARAM_REQ:
+		pmsg_rsp = wifi_sta_set_param_request(pmsg);
+		break;
+
+	case SCWIFI_STA_GET_PARAM_REQ:
+		pmsg_rsp = wifi_sta_get_param_request(pmsg);
+		break;
+
+	case SCWIFI_STA_ENABLE_REQ:
+		pmsg_rsp = wifi_sta_enable_request(pmsg);
+		break;
+	
+	case SCWIFI_GET_STA_STATUS_REQ:
+		pmsg_rsp = wifi_get_sta_status_request(pmsg);
+		break;
+		
+	case SCWIFI_STA_SCAN_REQ:
+		pmsg_rsp = wifi_sta_scan_request(pmsg);
+		break;
+	
+	default:
+		slog(WIFI_PRINT, SLOG_ERR, "wifi_evts_proc unknow req msg.\n");
+		break;
+	}
+
+	if(NULL != pmsg_rsp) {
+		 if(0 != sc_ipc_send_msg(pmsg_rsp)) {
+			slog(WIFI_PRINT, SLOG_ERR, "wifi_evts_proc sc_ipc_send_msg fail.\n");
+		 }
+		 sc_ipc_msg_free(pmsg_rsp);
+	}
+	
+	return 0;
+}
+
+static sc_ipc_msg *wifi_enable_status_ind(MSG_BUF *const pmsg)
+{
+	wlan_status_t *status = (wlan_status_t *)pmsg->aucDataBuf;
+	sc_ipc_msg *pmsg_ind = NULL;
+	
+	if (list_empty(&cli_msgkey_list)) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi_enable_status_ind no client.\n");
+		return NULL;
+	}
+
+	pmsg_ind = sc_ipc_msg_new(sizeof(wlan_status_t));
+	if(NULL == pmsg_ind) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+
+	slog(WIFI_PRINT, SLOG_ERR, "wifi_enable_status_ind %d\n",status->wifi_status);
+	wifi_ipcmsg_set(0, SCWIFI_CMD_ENABLE_STATUS_IND, (void *)status, sizeof(wlan_status_t), pmsg_ind);
+
+	return pmsg_ind;
+}
+
+static sc_ipc_msg *wifi_ap_status_ind(MSG_BUF *const pmsg)
+{
+	wlan_ap_status_t *ap_status = (wlan_ap_status_t *)pmsg->aucDataBuf;
+	sc_ipc_msg *pmsg_ind = NULL;
+	int idx = ap_status->idx;
+
+	if (idx <= IN_WIFI_AP_INDEX_MIN || idx >= IN_WIFI_AP_INDEX_MAX) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi_ap_status_ind error idx:%d.\n", idx);
+		return NULL;
+	}
+	
+	g_wifi_ap_status[idx].pre_status = g_wifi_ap_status[idx].status;
+	
+	g_wifi_ap_status[idx].status = ap_status->status;
+	strncpy(g_wifi_ap_status[idx].ifname, ap_status->ifname, sizeof(g_wifi_ap_status[idx].ifname) - 1);
+	
+	if (list_empty(&cli_msgkey_list)) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi_ap_status_ind no client.\n");
+		return NULL;
+	}
+
+	pmsg_ind = sc_ipc_msg_new(sizeof(wlan_ap_status_t));
+	if (NULL == pmsg_ind) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	slog(WIFI_PRINT, SLOG_ERR, "wifi_ap_enable_status_ind %d, %s, %d\n", ap_status->idx, ap_status->ifname, ap_status->status);
+	wifi_ipcmsg_set(0, SCWIFI_CMD_AP_STATUS_IND, (void *)ap_status, sizeof(wlan_ap_status_t), pmsg_ind);
+
+	return pmsg_ind;
+}
+
+static sc_ipc_msg *wifi_ap_sta_change_ind(MSG_BUF *const pmsg)
+{
+	wlan_sta_connect_status_t *ap_status = (wlan_sta_connect_status_t *)pmsg->aucDataBuf;
+	sc_ipc_msg *pmsg_ind = NULL;
+		
+	if (list_empty(&cli_msgkey_list)) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi_ap_status_ind no client.\n");
+		return NULL;
+	}
+
+	pmsg_ind = sc_ipc_msg_new(sizeof(wlan_sta_connect_status_t));
+	if (NULL == pmsg_ind) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	slog(WIFI_PRINT, SLOG_ERR, "wifi_ap_sta_change_ind %d, %d, %s\n", ap_status->idx, ap_status->is_connected, ap_status->macaddr);
+	wifi_ipcmsg_set(0, SCWIFI_CMD_AP_STA_CHA_IND, (void *)ap_status, sizeof(wlan_sta_connect_status_t), pmsg_ind);
+
+	return pmsg_ind;
+}
+
+static sc_ipc_msg *wifi_sta_status_ind(MSG_BUF *const pmsg)
+{
+	wlan_sta_status_t *ap_status = (wlan_sta_status_t *)pmsg->aucDataBuf;
+	sc_ipc_msg *pmsg_ind = NULL;
+
+	g_wifi_sta_status.pre_status = g_wifi_sta_status.status;
+
+	g_wifi_sta_status.status = ap_status->status;
+	strncpy(g_wifi_sta_status.ifname, ap_status->ifname, sizeof(g_wifi_sta_status.ifname) - 1);
+	strncpy(g_wifi_sta_status.ap_bssid, ap_status->ap_bssid, sizeof(g_wifi_sta_status.ap_bssid) - 1);
+	g_wifi_sta_status.signal_level = ap_status->signal_level;
+	g_wifi_sta_status.has_addr = ap_status->has_addr;
+	strncpy(g_wifi_sta_status.str_addr, ap_status->str_addr, sizeof(g_wifi_sta_status.str_addr) - 1);
+	g_wifi_sta_status.has_addr6 = ap_status->has_addr6;
+	strncpy(g_wifi_sta_status.str_addr6, ap_status->str_addr6, sizeof(g_wifi_sta_status.str_addr6) - 1);
+	g_wifi_sta_status.reason_code = ap_status->reason_code;
+
+	slog(WIFI_PRINT, SLOG_ERR, "wifi_sta_status_ind %d,%s,%s,%d,%d,%s,%d,%s,%d\n", 
+		g_wifi_sta_status.status, g_wifi_sta_status.ifname, g_wifi_sta_status.ap_bssid, 
+		g_wifi_sta_status.signal_level, g_wifi_sta_status.has_addr, g_wifi_sta_status.str_addr, 
+		g_wifi_sta_status.has_addr6, g_wifi_sta_status.str_addr6, g_wifi_sta_status.reason_code);		
+
+	if (list_empty(&cli_msgkey_list)) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi_ap_status_ind no client.\n");
+		return NULL;
+	}
+
+	pmsg_ind = sc_ipc_msg_new(sizeof(wlan_sta_status_t));
+	if (NULL == pmsg_ind) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	wifi_ipcmsg_set(0, SCWIFI_CMD_STA_STATUS_IND, (void *)ap_status, sizeof(wlan_sta_status_t), pmsg_ind);
+
+	return pmsg_ind;
+}
+
+static sc_ipc_msg *wifi_sta_scan_ind(MSG_BUF *const pmsg)
+{
+	wlan_sta_scan_list_t *status = (wlan_sta_scan_list_t *)pmsg->aucDataBuf;
+	sc_ipc_msg *pmsg_ind = NULL;
+	int i = 0;
+
+	sc_timer_delete(STA_SCAN_SOFTTIMER_ID);
+	g_sta_scaning = 0;
+	
+	if (list_empty(&cli_msgkey_list)) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi_ap_status_ind no client.\n");
+		return NULL;
+	}
+
+	pmsg_ind = sc_ipc_msg_new(sizeof(wlan_sta_scan_list_t));
+	if (NULL == pmsg_ind) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+	//print
+	slog(WIFI_PRINT, SLOG_ERR, "scan_result:%d\n", status->cnt);
+	if (status->cnt > 0) {
+		for (i = 0; i < status->cnt; i++) {
+			slog(WIFI_PRINT, SLOG_ERR, "ap[%d]:%s,%d,%d,%s,%d\n", i, status->info[i].essid, status->info[i].auth, 
+				status->info[i].channel, status->info[i].bssid, status->info[i].signal_level);
+		}
+	}
+	
+	wifi_ipcmsg_set(0, SCWIFI_CMD_STA_SCAN_IND, (void *)status, sizeof(wlan_sta_scan_list_t), pmsg_ind);
+
+	return pmsg_ind;
+}
+
+static void wifi_proxy_exit_ind(int errcode)
+{
+	sc_ipc_msg *pmsg_ind = NULL;
+	scwifi_serv_err_t status = {0};
+	
+	if (list_empty(&cli_msgkey_list)) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi_proxy_exit_ind no client.\n");
+		return NULL;
+	}
+
+	pmsg_ind = sc_ipc_msg_new(sizeof(scwifi_serv_err_t));
+	if(NULL == pmsg_ind) {
+		slog(WIFI_PRINT, SLOG_ERR, "wifi ipcmsg no memory!\n");
+		return NULL;
+	}
+
+	slog(WIFI_PRINT, SLOG_ERR, "wifi_proxy_exit_ind %d\n", errcode);
+	wifi_ipcmsg_set(0, SCWIFI_CMD_SERV_ERROR_IND, (void *)&status, sizeof(scwifi_serv_err_t), pmsg_ind);
+
+	send_msg_by_key(pmsg_ind);
+	sc_ipc_msg_free(pmsg_ind);
+}
+
+//ap²à·¢À´µÄÏûÏ¢
+static int sc_wifi_parse_msg(MSG_BUF *pMsg)
+{
+	sc_ipc_msg *pmsg_rsp = NULL;
+
+	int ret = -1;
+	slog(WIFI_PRINT, SLOG_ERR, "src_mod=[0x%x], cmd=[0x%x]%s\n", pMsg->src_id, pMsg->usMsgCmd, cmdid_to_string(pMsg->usMsgCmd));
+
+	switch (pMsg->usMsgCmd) {
+		case MSG_CMD_CAP_WIFI_STATUS:
+			pmsg_rsp = wifi_enable_status_ind(pMsg);
+			break;
+		
+		case MSG_CMD_CAP_AP_STATUS:
+			pmsg_rsp = wifi_ap_status_ind(pMsg);
+			break;
+		
+		case MSG_CMD_CAP_AP_STA_CHANGE:
+			pmsg_rsp = wifi_ap_sta_change_ind(pMsg);
+			break;
+		
+		case MSG_CMD_CAP_STA_STATUS:
+			pmsg_rsp = wifi_sta_status_ind(pMsg);
+			break;
+
+		case MSG_CMD_CAP_STA_SCAN_RES:
+			pmsg_rsp = wifi_sta_scan_ind(pMsg);
+			break;
+
+		default:
+			slog(WIFI_PRINT, SLOG_ERR, "msg not handle.\n");
+			break;
+	}
+
+	if(NULL != pmsg_rsp) {
+		 send_msg_by_key(pmsg_rsp);
+		 sc_ipc_msg_free(pmsg_rsp);
+	}
+
+	return 0;
+}
+
+void cap_wifi_nv_init(void)
+{
+	//station default off, when power on
+	sc_cfg_set("wifi_sta_connection", "0");
+}
+
+int main(int argc, char** argv)
+{
+	int wifi_msg_id = 0;
+	MSG_BUF wlanMsg = {0};
+	int iRet = -1;
+
+	loglevel_init();
+
+	slog(WIFI_PRINT, SLOG_ERR, "wlan_proxy start\n");
+	
+	cap_wifi_nv_init();
+
+	INIT_LIST_HEAD(&cli_msgkey_list);
+	//ÄÚ²¿Ò²Òª¸Ä ÔÝʱÕâÑù
+	sc_ipc_start_loop("wifi_proxy_ipc");//key = MODULE_ID_WLAN_PROXY;
+
+	sc_ipc_register_events(s_wifi_evts, sizeof(s_wifi_evts)/sizeof(s_wifi_evts[0]));
+
+    wifi_msg_id = msgget(MODULE_ID_WIFI, IPC_CREAT | 0600);
+	if (wifi_msg_id == -1) {
+		slog(WIFI_PRINT, SLOG_ERR, "sc_wifi create msg fail, errno=%d\n", errno);
+		return -1;
+	}
+
+	while (1) {
+		memset(&wlanMsg, 0, sizeof (MSG_BUF));
+		iRet = msgrcv(wifi_msg_id, &wlanMsg, sizeof (MSG_BUF) - sizeof (LONG), 0, 0);
+		if (iRet == -1) {
+			continue;
+		}
+
+		sc_wifi_parse_msg(&wlanMsg);
+	}
+
+	wifi_proxy_exit_ind(0);
+
+    return 0;
+}
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_hotplug/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_hotplug/Makefile
index ed4421b..f08b1a4 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_hotplug/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_hotplug/Makefile
@@ -6,7 +6,7 @@
 

 ##############USER COMIZE BEGIN################

 EXEC = zxic_hotplug

-OBJS = hotplug.o netdev_plug.o drv_plug.o

+OBJS = hotplug.o netdev_plug.o drv_plug.o rtc_plug.o

 #*******************************************************************************

 # include path

 #*******************************************************************************

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_hotplug/hotplug.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_hotplug/hotplug.c
index d0a576b..b1b3dde 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_hotplug/hotplug.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_hotplug/hotplug.c
@@ -164,6 +164,8 @@
 	netdev_hotplug_init();
 	/*Çý¶¯É豸³õʼ»¯*/
 	drv_hotplug_init();
+	/*rtcÉ豸½âÎö³õʼ»¯*/
+	rtc_hotplug_init();
 }
 
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_hotplug/rtc_plug.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_hotplug/rtc_plug.c
new file mode 100755
index 0000000..b1052df
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_hotplug/rtc_plug.c
@@ -0,0 +1,68 @@
+#include "hotplug.h"

+

+#define RTC_ALARM_TIMEOUT_MSG  "PMIC RTC ALARM IRQ COME"

+#define RTC_TIMER_TIMEOUT_MSG  "PMIC RTC TIMER IRQ COME"

+

+static int rtc_time_msg_parse(const char *msg, int msglen)

+{

+	int offlen = 0;

+	const char *keys = NULL;

+	char* timeStr = NULL;

+	char *pSec = NULL;

+	slog(RTC_PRINT,SLOG_ERR, "[%s][%d] zx234290-rtc \n", __func__, __LINE__);

+	

+	offlen += strlen((char *)msg) + 1;

+	while (offlen <= msglen) {

+		keys = (char *)(msg + offlen);

+		//slog(NET_PRINT,SLOG_ERR, "[%s][%d] zx234290-rtc%s, %d\n", __func__, __LINE__, keys, offlen);

+		if (strncmp(keys, RTC_ALARM_TIMEOUT_MSG, strlen(RTC_ALARM_TIMEOUT_MSG)) == 0)

+		{

+#if 1    // cov M	DEADCODE

+            pSec = strstr(keys, "sec:");        

+            if (pSec == NULL) {

+            	slog(RTC_PRINT,SLOG_ERR, "zx234290-rtc event no sec \n");

+            	return -1;

+            }

+			timeStr = pSec + strlen("sec:");

+

+#else

+            timeStr = strstr(keys, "sec:") + strlen("sec:");

+			if (timeStr == NULL) {

+				slog(RTC_PRINT,SLOG_ERR, "zx234290-rtc event no sec \n");

+				return -1;

+			}

+#endif			

+			ipc_send_message2(MODULE_ID_HOTPLUG, MODULE_ID_RTC_SERVICE, RTC_MSG_ALARM_TIMEOUT, strlen(timeStr), timeStr, 0);

+			slog(RTC_PRINT,SLOG_NORMAL, "zx234290-rtc alarm timeout \n");

+			return 0;

+		}

+		else if (strncmp(keys, RTC_TIMER_TIMEOUT_MSG, strlen(keys)) == 0)

+		{

+			ipc_send_message2(MODULE_ID_HOTPLUG, MODULE_ID_RTC_SERVICE, RTC_MSG_TIMER_TIMEOUT, 0, NULL, 0);

+			slog(RTC_PRINT,SLOG_NORMAL, "zx234290-rtc timer timeout \n");

+			return 0;

+		}

+		offlen += strlen((char *)keys) + 1;

+	}

+	slog(RTC_PRINT,SLOG_ERR, "zx234290-rtc event not supported \n");

+	return -1;

+}

+

+

+/*RTCÏûÏ¢½âÎö*/

+int rtc_app_msg_parse(const char *msg, int msglen, struct hotplug_event *event)

+{

+	if (strstr(msg, "zx234290-rtc")){

+		rtc_time_msg_parse(msg, msglen);

+	}

+	return -1;

+}

+

+/*Éϵç³õʼ»¯*/

+void rtc_hotplug_init()

+{

+	/*ÈȰβåÏûÏ¢½âÎö³õʼ»¯*/

+	hotplug_parse_register(DEVICE_TYPE_APP_RTC, rtc_app_msg_parse);

+}

+

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/makefile
new file mode 100755
index 0000000..033f7ba
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/makefile
@@ -0,0 +1,109 @@
+# /*****************************************************************************

+#* 版权所有 (C)2015, 中兴通讯股份有限公司。

+#* 

+#* 文件名称:     Makefile

+#* 文件标识:     Makefile

+#* 内容摘要:     Makefile of ZTE applications

+#* 使用方法:     void

+#* 

+#* 修改日期        版本号      修改标记        修改人          修改内容

+#* -----------------------------------------------------------------------------

+#* 2015/02/10      V1.0        Create          张楠          创建

+#* 

+# ******************************************************************************/

+

+#*******************************************************************************

+# include ZTE application makefile

+#*******************************************************************************

+#include $(zte_app_mak)

+#include $(zte_app_path)/net_team.mk

+include $(COMMON_MK)

+WORKPATH = $(LIB_DIR)

+SOFT_TIMER_PATH = $(WORKPATH)/libsofttimer

+

+#*******************************************************************************

+# execute

+#*******************************************************************************

+EXEC    = zxic_mmi

+

+#*******************************************************************************

+# objects

+#*******************************************************************************

+OBJS    = mmi_adapter.o mmi.o mmi_battery.o mmi_net.o mmi_wifi.o mmi_tip.o mmi_sms.o mmi_lcd_page.o mmi_lcd.o mmi_lcd_init.o mmi_ctrl.o \

+		  mmi_keystrokes.o mmi_lcd_timer.o mmi_led.o mmi_led_init.o mmi_led_adapter.o mmi_poweroff_charger.o mmi_traffic.o mmi_fota.o mmi_msg.o \

+		  mmi_cfg.o mmi_poweroff.o mmi_battery_adapter.o mmi_mo.o mmi_mo_en.o mmi_mo_zh.o mmi_voip.o mmi_plat_adapter.o

+

+#*******************************************************************************

+# include path

+#*******************************************************************************                

+INCLUE_PATH = -I. -I./../include

+CFLAGS += -Wextra -Wall $(INCLUE_PATH) $(CUSTOM_MACRO)

+CFLAGS  += -I$(SOFT_TIMER_PATH)

+

+ifneq ($(CONFIG_MMI_LCD),no)

+CFLAGS  += -I$(WORKPATH)/libzcore/min/zcore_zcore/src/zCore/src/gui/adapter/Linux/inc \

+           -I$(WORKPATH)/libzcore/min/zcore_zcore/src/zCore/inc/os \

+           -I$(WORKPATH)/libzcore/min/zcore_zcore/inc/zCore/gui \

+           -I$(WORKPATH)/libzcore/min/zcore_zcore/inc/zCore/os \

+           -I$(WORKPATH)/libzcore/min/zcore_zcore/inc/zCore/kernel \

+           -I$(WORKPATH)/libzcore/min/zcore_zcore/inc/zCore/gui/ctrl \

+           -I$(WORKPATH)/libzcore/min/zcore_zcore/inc/zCore/mmi \

+           -I$(WORKPATH)/libzcore/min/ 

+endif

+

+CFLAGS  += -I$(SOFT_TIMER_PATH) \

+		   -L$(SOFT_TIMER_PATH)

+CFLAGS += -g

+CFLAGS += -I$(WORKPATH)/libnvram

+

+ifeq ($(LINUX_TYPE),uClinux)

+CFLAGS += -g -O0

+endif

+

+#*******************************************************************************

+# macro definition

+#*******************************************************************************

+

+

+#*******************************************************************************

+# library

+#*******************************************************************************

+LDLIBS += -lpthread -lm -lrt 

+CFLAGS += -I$(SOFT_TIMER_PATH)

+

+LDLIBS += -lnvram -lpthread -lsofttimer -lsoftap

+#LDFLAGS += -L../soft_timer -lsofttimer 

+

+ifneq ($(CONFIG_MMI_LCD),no)

+LDLIBS += -lzcore

+endif

+

+#*******************************************************************************

+# library path

+#*******************************************************************************

+LDLIBS  += -L$(WORKPATH)/libnvram

+LDLIBS  += -L$(WORKPATH)/libsofttimer

+

+ifneq ($(CONFIG_MMI_LCD),no)

+LDLIBS  += -L$(WORKPATH)/libzcore/min

+endif

+

+LDLIBS  += -L$(LIB_DIR)/libsoftap

+

+#*******************************************************************************

+# targets

+#*******************************************************************************

+all: $(EXEC)

+

+$(EXEC): $(OBJS)

+	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) -Wl,--end-group

+	@cp $@ $@.elf

+	

+romfs:

+	$(ROMFSINST) $(EXEC) /bin/$(EXEC)

+	

+clean:

+	-rm -f $(EXEC) $(OBJS) *.elf *.gdb *.o

+	

+

+	

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi.c
new file mode 100755
index 0000000..1f3ed49
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi.c
@@ -0,0 +1,856 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £º
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+
+/*****************************************************************************
+ Í·Îļþ
+******************************************************************************/
+#include "mmi_common.h"
+#include "mmi_lcd.h"
+
+//ÏÂÃæ¶¼ÊÇdebug¶¨Î»ÎÊÌâʱÓõ½µÄÈ«¾Ö±äÁ¿
+#define MMI_DEBUG_MAINCONTROL
+#ifdef MMI_DEBUG_MAINCONTROL
+SINT32 g_mmi_MainContrlIndex = -1;
+SINT32 g_mmi_MainContrlProcess = -1;//0, get content;1 gelceinfo; 2 show
+SINT32 g_mmi_MainContrl = -1;
+
+
+int g_debug[20] = {0};
+int g_debug_index = 0;
+#endif
+/********************************************************************************
+  È«¾Ö±äÁ¿ÒýÓÃ
+**********************************************************************************/
+extern E_zMmiShowMode g_showMode;
+
+/********************************************************************************
+  È«¾Ö±äÁ¿¶¨Òå
+**********************************************************************************/
+int g_mmi_msgQue_Id = 0;
+pthread_mutex_t g_mmi_lcdmode_mutex ;
+pthread_mutex_t g_mmi_ledmode_mutex ;
+pthread_mutex_t g_mmi_update_flag_mutex;
+pthread_mutex_t g_mmi_refresh_lcd_mutex;
+pthread_mutex_t g_mmi_poweron_mutex;
+
+sem_t g_mmi_update_sem_id;
+sem_t g_mmi_init_sem_id;
+sem_t g_mmi_traffic_warn_sem_id;
+sem_t g_mmi_poweroff_sem_id ;
+sem_t g_mmi_gui_init_sem_id;
+
+
+UINT32 	g_mmi_poweroff_turnon_flag = FALSE ;
+UINT32  g_mmi_led_status_flag = 0;
+T_zMMITaskInfoItem g_zMMITaskInfoTab[MMI_TASK_MAX] = {0};
+
+UINT32 g_smstask_enable = 0;
+UINT32 g_voicetask_enable = 0;
+UINT32 g_temp_protect = 0;
+UINT32 g_discharge_protect = 0;
+UINT32 g_charge_protect = 0;
+
+UINT32 g_fast_poweron = 0;
+UINT32 g_led_standby_mode = 0;
+UINT32 g_led_sleep_mode = 0;
+UINT32 g_use_wifi_usernum = 0;
+
+UINT32 g_show_pagefirst = 0;
+UINT32 g_show_pagesecond = 0;
+UINT32 g_show_pagethird = 0;
+/*
+SINT32 g_mmi_hightempvol = 0;
+SINT32 g_mmi_superhightempvol = 0;
+SINT32 g_mmi_lowtempvol = 0;
+SINT32 g_mmi_superlowtempvol = 0;
+*/
+SINT32 g_mmi_batvoltageline[21] = {0};
+
+SINT32 g_mmi_power_mode = 0;//0:charge;1:poweron
+
+int g_customer_type = CUSTOMER_SDK;  // Õë¶Ô²»Í¬¿Í»§µÄ¶¨ÖÆÐèÇó
+
+//ÉèÖô¥·¢¸üбêÖ¾
+VOID mmi_set_update_flag(E_zMmi_Task task)
+{
+	mmi_getMutex(&g_mmi_update_flag_mutex);
+	g_zMMITaskInfoTab[task].is_update = 1;
+	mmi_putMutex(&g_mmi_update_flag_mutex);
+
+	mmi_PutSemaphore(&g_mmi_update_sem_id);
+}
+
+VOID mmi_clean_update_flag(E_zMmi_Task task)
+{
+	mmi_getMutex(&g_mmi_update_flag_mutex);
+	g_zMMITaskInfoTab[task].is_update = 0;
+	mmi_putMutex(&g_mmi_update_flag_mutex);
+}
+SINT32 mmi_get_update_flag(E_zMmi_Task task)
+{
+	SINT32 ret = 0;
+	if (task >= MMI_TASK_MAX)//cov kw 3
+		return ret;
+	mmi_getMutex(&g_mmi_update_flag_mutex);
+	ret = g_zMMITaskInfoTab[task].is_update;
+	g_zMMITaskInfoTab[task].is_update = 0;
+	mmi_putMutex(&g_mmi_update_flag_mutex);
+	return ret;
+}
+
+//ÏÔʾledµÆ
+static VOID mmi_show_led_item(T_zMMITaskInfoItem* taskInfoItem)
+{
+	if (taskInfoItem->get_taskinfo_fun == NULL || taskInfoItem->taskinfo == NULL ||
+	    taskInfoItem->get_ledinfo_fun == NULL || taskInfoItem->ledinfo == NULL) {
+		//slog(MMI_PRINT,SLOG_DEBUG,"MMI mmi_show_led parameter null!!!\n");
+		return;
+	}
+	if (taskInfoItem->get_taskinfo_fun((UINT32)taskInfoItem->taskinfo) == MMI_SUCCESS) { //e64
+		if (taskInfoItem->get_ledinfo_fun((UINT32)taskInfoItem->taskinfo, (UINT32)taskInfoItem->ledinfo) == MMI_SUCCESS) {
+			mmi_showLed((UINT32)taskInfoItem->ledinfo);
+		}
+	}
+}
+//ÏÔʾlcdµÆ
+static VOID mmi_show_lcd_item(T_zMMITaskInfoItem* taskInfoItem)
+{
+	if (taskInfoItem->get_taskinfo_fun == NULL || taskInfoItem->taskinfo == NULL ||
+	    taskInfoItem->get_lcdinfo_fun == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_show_lcd parameter null!!!");
+		return;
+	}
+#ifdef MMI_DEBUG_MAINCONTROL
+	g_mmi_MainContrlProcess = 0;//0, get content;1 gelceinfo; 2 show
+#endif
+	if (taskInfoItem->get_taskinfo_fun((UINT32)taskInfoItem->taskinfo) == MMI_SUCCESS) {
+#ifdef MMI_DEBUG_MAINCONTROL
+		g_mmi_MainContrlProcess = 1;//0, get content;1 gelceinfo; 2 show
+#endif
+		if (taskInfoItem->get_lcdinfo_fun((UINT32)taskInfoItem->taskinfo) == MMI_SUCCESS) {
+#ifdef MMI_DEBUG_MAINCONTROL
+			g_mmi_MainContrlProcess = 2;//0, get content;1 gelceinfo; 2 show
+#endif
+			//mmi_showLcd(appInfoItem->lcdinfo);
+			mmi_invalidateLcd(taskInfoItem->taskinfo);
+		}
+	}
+}
+//MMIÖ÷¿Ø
+static VOID *mmi_mainControllerEntry(VOID *arg)
+{
+	UINT32 i = 0;
+	int ret = 0;
+	
+#ifdef MMI_DEBUG_MAINCONTROL
+	g_mmi_MainContrl = 1;
+#endif
+
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		while ((ret = mmi_GetSemaphore(&g_mmi_init_sem_id, MMI_WAIT_FOREVER)) != MMI_SUCCESS) {
+			slog(MMI_PRINT, SLOG_DEBUG, "mmi g_mmi_update_sem_id get failed ret = %d,errno=%d\n", ret, errno);
+			continue;
+		}
+		mmi_DeleteSemaphore(&g_mmi_init_sem_id);
+	}
+#endif
+
+	while (1) {
+		if ((ret = mmi_GetSemaphore(&g_mmi_update_sem_id, MMI_WAIT_FOREVER)) != MMI_SUCCESS) {//kw 3
+			slog(MMI_PRINT, SLOG_DEBUG, "mmi mmi_mainControllerEntry failed ret = %d,errno=%d\n", ret, errno);
+			continue;
+		}
+		for (i = 0; i < sizeof(g_zMMITaskInfoTab) / sizeof(T_zMMITaskInfoItem); ++ i) { //warning539
+#ifdef MMI_DEBUG_MAINCONTROL
+			g_mmi_MainContrlIndex = i;
+#endif
+			if (mmi_get_update_flag(g_zMMITaskInfoTab[i].task)  == 1) { //ÓиüÐÂ
+				if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) { //led
+					mmi_show_led_item(&(g_zMMITaskInfoTab[i]));
+				}
+#ifndef DISABLE_LCD
+				if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) { //lcd
+					mmi_show_lcd_item(&(g_zMMITaskInfoTab[i]));
+				}
+#endif
+			}
+		}
+#ifdef MMI_DEBUG_MAINCONTROL
+		g_mmi_MainContrlIndex = -1;
+		g_mmi_MainContrlProcess = -1;//0, get content;1 gelceinfo; 2 show
+#endif
+	}
+}
+
+
+//×¢²áMMIÒµÎñÐÅÏ¢
+VOID mmi_register_taskinfo_item(T_zMMITaskInfoItem* taskInfoItem)
+{
+	if (taskInfoItem != NULL) {
+		E_zMmi_Task task = taskInfoItem->task;//ÒµÎñ
+		g_zMMITaskInfoTab[task].task = taskInfoItem->task;
+		mmi_getMutex(&g_mmi_update_flag_mutex); //cov m
+		g_zMMITaskInfoTab[task].is_update = taskInfoItem->is_update;
+		mmi_putMutex(&g_mmi_update_flag_mutex);
+		//g_zMMIFrameInfoTab[appInfoItem->flag].show_mode= appInfoItem->show_mode;
+		g_zMMITaskInfoTab[task].taskinfo = taskInfoItem->taskinfo;
+		g_zMMITaskInfoTab[task].ledinfo = taskInfoItem->ledinfo;
+		g_zMMITaskInfoTab[task].get_taskinfo_fun = taskInfoItem->get_taskinfo_fun;
+		g_zMMITaskInfoTab[task].get_ledinfo_fun = taskInfoItem->get_ledinfo_fun;
+		g_zMMITaskInfoTab[task].get_lcdinfo_fun = taskInfoItem->get_lcdinfo_fun;
+	}
+}
+
+/********************************************************************************
+  MMI LOG´æÈëÎļþ
+**********************************************************************************/
+static char * mmi_get_time(void)
+{
+	time_t timep;
+	struct tm *p;
+	static char buf[22];
+	memset(buf, 0, 22);
+	time(&timep);
+	p = (struct tm *)localtime(&timep);
+	if (NULL == p) {
+		return NULL;
+	}
+	snprintf(buf, 21, "%4d/%02d/%02d %02d:%02d:%02d ", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
+	return buf;
+}
+
+void mmi_log_save(const char *fmt, ...)
+{
+	time_t timep;
+	struct tm p = {0};
+	va_list ap;
+	FILE *fp = NULL;
+	struct stat statbuff;
+
+	time(&timep);
+	localtime_r(&timep, &p);
+#if MMI_SERIAL_DEBUG
+	//printf("%4d/%02d/%02d %02d:%02d:%02d ",1900 + p.tm_year,1 + p.tm_mon,p.tm_mday,p.tm_hour,p.tm_min,p.tm_sec);
+	va_start(ap, fmt);
+	vprintf(fmt, ap);
+	va_end(ap);
+#endif
+
+#if MMI_FILE_DEBUG
+	fp = fopen(MMI_LOG_FILE_PATH, "a+");
+
+	if (fp) {
+		fprintf(fp, "%4d/%02d/%02d %02d:%02d:%02d ", 1900 + p.tm_year, 1 + p.tm_mon, p.tm_mday, p.tm_hour, p.tm_min, p.tm_sec);
+		va_start(ap, fmt);
+		vfprintf(fp, fmt, ap);
+		va_end(ap);
+		fclose(fp);
+		if (stat(MMI_LOG_FILE_PATH, &statbuff) == 0) {
+			if (statbuff.st_size >= MMI_MAX_LOG_LENGTH) {
+				remove(MMI_LOG_OLD_FILE_PATH);
+				rename(MMI_LOG_FILE_PATH, MMI_LOG_OLD_FILE_PATH);
+			}
+		}
+	}
+#endif
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:´¦Àí·¢¸øMMI½ø³ÌµÄÏûÏ¢
+***********************************************************************************/
+//zdm ½«mmiÄܹ»´¦ÀíµÄËùÓÐÏûÏ¢¾ù½øÐд¦Àí£¬º¯ÊýÄÚ²¿Í¨¹ýnvÀ´¾ö¶¨ÊÇ·ñÕæÕý½øÐд¦Àí
+//Èç¹ûµ±Ç°»·¾³ÎÞ·¨´¦Àí¸ÃÏûÏ¢£¬Ö±½Ó·µ»Ø¼´¿É
+static int mmi_ProcMsg(MSG_BUF *pstMsg)
+{
+	int i = 0;
+	if (NULL == pstMsg) {
+		return -1;
+	}
+	//kw 3, kw bug???
+	//if ((pstMsg->usMsgCmd != MSG_CMD_MMICHECK_TIP_INFO) && (pstMsg->usMsgCmd != MSG_CMD_MMIGET_WIFI_DATA)) {
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI Mmi_ProcMsg msg:src_id = 0x%04x,lMsgType = %ld,usMsgCmd = 0x%08x,usDataLen = %d,data = %s\n", pstMsg->src_id, pstMsg->lMsgType, pstMsg->usMsgCmd, pstMsg->usDataLen, pstMsg->aucDataBuf);
+	//}
+	switch (pstMsg->usMsgCmd) {
+	case MSG_CMD_CHANNEL_NETWORK_MODE:
+		zMMI_Handle_Msg_Network_Mode((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_MULTI_CONNECT_STATUS:
+		zMMI_Handle_Msg_MultiConnect_Status((VOID *)pstMsg->aucDataBuf, pstMsg->src_id);
+		break;
+	case MSG_CMD_CHANNEL_CONNECT_STATUS:
+		zMMI_Handle_Msg_Connect_Status((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_OUT_REG_GET_SIGNAL_NUM:
+		zMMI_Handle_Msg_Signal_Num((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_SMS_STATUS_INFO_IND:
+		zMMI_Handle_Msg_SmsBox_Sattus((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_VOIP_STATUS_INFO:
+		zMMI_Handle_Msg_Voip_Status((VOID *)pstMsg->aucDataBuf);
+		break; //cov m
+	case MSG_CMD_RJ11_STATUS_INFO:
+		zMMI_Handle_Msg_Rj11_Status((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_MODIFY_SSID_KEY:
+		zMMI_Handle_Msg_Get_SSID_Key((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_MMIGET_WIFI_STANUM:
+	case MSG_CMD_STA_COUNT_CHANGE:
+		zMMI_Handle_Msg_Get_Wifi_StaNum((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_MMISTART_BACKLIGHTOFF_TIMER:
+		zMMI_Handle_Msg_BacklightOff((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_RESET_NOTIFY:
+		zMMI_Handle_Msg_Factory_Reset((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_POWEROFF_NOTIFY:
+		zMMI_Handle_Msg_Poweroff((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_RESTART_NOTIFY:
+		zMMI_Handle_Msg_Restart((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_GET_NET_PROVIDER:
+		zMMI_Handle_Msg_Get_Provider((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_GET_TRAFFIC_INFO_START:
+		zMMI_Handle_Msg_Get_TafficInfo_Start((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_GET_TRAFFIC_INFO_END:
+		zMMI_Handle_Msg_Get_TafficInfo_End((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_TRAFFIC_INFO_RESET:
+		zMMI_Handle_Msg_TafficInfo_Reset((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_MMICHECK_TIP_INFO:
+		zMMI_Handle_Msg_Check_Tip_Info((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_MMISHOW_SSID_INFO:
+		zMMI_Handle_Msg_SSID_Show_Info((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_MMIGET_WIFI_DATA:
+		zMMI_Handle_Msg_Get_Wifi_Data((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_POWEROFF_RSP:
+		zMMI_Handle_Msg_Plugout((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_SIM_ABNORMAL_IND:
+		zMMI_Handle_Msg_Simcard_Info((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_SOCKET_STATE_CHANGE:
+		zMMI_Handle_Msg_Socket_Status((VOID *)pstMsg->aucDataBuf, pstMsg->src_id);
+		break;
+	case MSG_CMD_MCUSOCKET_STATE_CHANGE:
+		zMMI_Handle_Msg_MCUSocket_Status((VOID *)pstMsg->aucDataBuf);
+		break;
+#if 0
+	case MSG_CMD_AUTOTEST_KEY_REQ:
+		if (g_mmi_power_mode == 1)
+			zMMI_Handle_Msg_Atest_Key((VOID *)pstMsg->aucDataBuf);
+		else
+			zMMI_Handle_Msg_Atest_Chg((VOID *)pstMsg->aucDataBuf);
+		break;
+#endif
+	}
+	return 0;
+#if 0
+	for (i = 0; i < (SINT32)(sizeof(scmp_info) / sizeof(scmp_info[0])); i++) {
+		if (pstMsg->usMsgCmd == scmp_info[i].id) {
+			if (scmp_info[i].func_ptr != NULL) {
+				scmp_info[i].func_ptr((VOID *)pstMsg->aucDataBuf);
+			}
+			return 0;
+		}
+	}
+#endif
+
+	return 0;
+}
+
+
+static void *mmi_handleMsgEntry(void *arg)
+{
+	long MsgType = 0;
+	MSG_BUF MmiMsg;
+	prctl(PR_SET_NAME, "mmihandlemsg", 0, 0, 0);
+	while (1) {
+		memset((VOID *)(&MmiMsg), 0, sizeof(MSG_BUF));//warning516
+		if (-1 != mmi_RecvMsgFromQueue(g_mmi_msgQue_Id, &MmiMsg, MsgType)) {
+			mmi_ProcMsg(&MmiMsg);
+		}
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¿ª»úʱÆÁ»òµÆµÄ¶¯×÷
+		 LCD ÏÔʾ¿ª»ú¶¯»­
+		 LED Á÷Á¿µÆÏÈÈ«²¿Ï¨Ãð ÆäÓàËĸöµÆÍ¬Ê±ÉÁһϠÔÙ¸ù¾Ýʵ¼Ê״̬ÁÁÆð
+***********************************************************************************/
+static VOID mmi_set_poweron_show(VOID)
+{
+	mmi_set_led_mode(MMI_POWERON_MODE);
+	mmi_set_update_flag(MMI_TASK_CTRL);//¿ª»úģʽ ÏÔʾ¿ª»ú¶¯»­
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:mmi ÒµÎñ×¢²á
+***********************************************************************************/
+
+//zdm ʹÓÃnv¿ØÖÆÒµÎñµÄ×¢²áºÍ³õʼ»¯£¬ÔÝʱµÄʵÏÖÊǶÔÓÚ¿ª»úÉϵçµÄÿ¸öÒµÎñ£¬¾ùÌṩһ¸önv¿ØÖÆ
+//ºóÆÚÒª¸ù¾ÝÐèÇó£¬ÌáÈ¡³ö±ØÐëʹÓõÄnv¿ØÖÆÏ¶ÔÓÚÈκÎÇé¿öÏ£¬¾ùÐèÒªµÄÒµÎñ£¬Ö±½Ó×¢²á¾Í¿ÉÒÔ
+//²»ÔÙʹÓÃnv¿ØÖÆ£¬±ÈÈçMMI_TASK_CTRL£¬°´ÕÕÀí½âÓ¦¸ÃËùÓеij¡¾°Ï¾ùÐèҪע²áºÍ³õʼ»¯
+
+
+static int mmi_task_register()
+{
+	UINT32 i = 0;
+	char *nv_task_tab[NV_CONTENT_LEN] = {0};
+
+	//zdm ÔÚ×¢²áºÍ³õʼ»¯ÒµÎñ֮ǰ£¬ÏȽ«ÒµÎñĿ¼ÖеÄÿ¸öÒµÎñÏîÖÃΪÎÞЧ
+	for (i = 0; i < sizeof(g_zMMITaskInfoTab) / sizeof(T_zMMITaskInfoItem); ++ i) {
+		g_zMMITaskInfoTab[i].task = MMI_TASK_INVALID;
+	}
+
+	//Èç¹ûÓÐÓëled/lcd¾ùÐèҪʹÓõÄÒµÎñ£¬ÔÚÕâÀïÍê³É×¢²á£¬×¢²áºÍ³õʼ»¯º¯ÊýÄÚ²¿½øÐÐÇø·ÖlcdºÍled
+
+	sc_cfg_get("mmi_task_tab", nv_task_tab, sizeof(nv_task_tab));
+
+	if (strstr(nv_task_tab, "net_task")) {
+		mmi_RegisterNetTaskInfoItem();
+	}
+
+	//Ó²¼þÏÞÖÆ£¬Á½¸öÒµÎñ¸´ÓÃͬһ¸öÓ²¼þµÆ,Òò´ËnvʹÓÃsmsºÍvoice½øÐÐÇø·Ö
+
+	if (strstr(nv_task_tab, "sms_task") && strstr(nv_task_tab, "voice_task")) {
+		assert(0);
+	}
+
+	if (strstr(nv_task_tab, "sms_task")) {
+		mmi_RegisterSmsTaskInfoItem();
+		g_smstask_enable = 1;
+	} else if (strstr(nv_task_tab, "voice_task")) {
+		mmi_RegisterVoipTaskInfoItem();
+		g_voicetask_enable = 1;
+	}
+
+	//ÊÇ·ñÓÐµç³ØÌõ¼þ¿ØÖÆ
+	if (strstr(nv_task_tab, "battery_task")) {
+		mmi_RegisterBatteryTaskInfoItem();
+
+	}
+
+	if (strstr(nv_task_tab, "ctrl_task")) {
+		mmi_RegisterCtrlTaskInfoItem();
+	}
+
+
+	if (strstr(nv_task_tab, "wifi_task")) {
+		mmi_RegisterWifiTaskInfoItem();
+	}
+
+
+	if (strstr(nv_task_tab, "traffic_task")) {
+		mmi_RegisterTrafficTaskInfoItem();
+	}
+
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		//×¢²áÓëledÏà¹ØµÄÒµÎñ £¬ÇëÎâºìʵÏÖ
+		if (strstr(nv_task_tab, "netsignal_task")) {
+			mmi_RegisterNetSigTaskInfoItem();
+		}
+		if (strstr(nv_task_tab, "ledwps_task")) {
+			mmi_RegisterWpsTaskInfoItem();
+		}
+		if (strstr(nv_task_tab, "rj11_task")) {
+			mmi_RegisterRj11TaskInfoItem();
+		}
+	}
+
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		//×¢²áÓëlcdÏà¹ØµÄÒµÎñ£¬ÇëÎâºìʵÏÖ
+		if (strstr(nv_task_tab, "tip_task")) {
+			mmi_RegisterTipTaskInfoItem();
+		}
+		//Ó²¼þÓеçÁ¿¼ÆµÄÌõ¼þÏ£¬²ÅÄÜ´ò¿ª
+
+		if (strstr(nv_task_tab, "power_task")) {
+			mmi_RegisterPowerTaskInfoItem();
+		}
+		//Ö§³ÖwifiµÄÇé¿öϲÅÄÜÖ§³Ö
+		if (strstr(nv_task_tab, "ssid_task")) {
+			mmi_RegisterSSIDInfoTaskInfoItem();
+		}
+		if (strstr(nv_task_tab, "wificode_task")) {
+			mmi_RegisterWifiCodeTaskInfoItem();
+		}
+		if (strstr(nv_task_tab, "tipnetconnect_task")) {
+			mmi_RegisterTipNetConnectTaskInfoItem();
+		}
+
+		if (strstr(nv_task_tab, "tipwps_task")) {
+			mmi_RegisterTipWpsTaskInfoItem();
+		}
+		if (strstr(nv_task_tab, "tipfota_task")) {
+			mmi_RegisterTipFotaTaskInfoItem();
+
+		}
+		if (strstr(nv_task_tab, "tipwifistation_task")) {
+			mmi_RegisterTipWifiStationConnectTaskInfoItem();
+		}
+	}
+#endif
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:mmi ÒµÎñ³õʼ»¯
+***********************************************************************************/
+
+//¶ÔÓÚÓÐÐèÇó¿ØÖƵÄijЩҵÎñ£¬ÌáÈ¡³Énv¿ØÖÆ£¬¸ù¾ÝÐèÇó½øÐдò¿ªºÍ¹Ø±ÕÅäÖÃ
+static int mmi_task_init()
+{
+	char *nv_task_tab[NV_CONTENT_LEN] = {0};
+
+
+	//Èç¹ûÓÐÓëled/lcd¾ùÐèҪʹÓõÄÒµÎñ£¬ÔÚÕâÀïÍê³É³õʼ»¯
+
+	sc_cfg_get("mmi_task_tab", nv_task_tab, sizeof(nv_task_tab));
+
+
+	if (strstr(nv_task_tab, "net_task")) {
+		mmi_net_init();
+	}
+
+	//Ó²¼þÏÞÖÆ£¬Á½¸öÒµÎñ¸´ÓÃͬһ¸öÓ²¼þµÆ,Òò´ËnvʹÓÃsmsºÍvoice½øÐÐÇø·Ö
+	if (strstr(nv_task_tab, "sms_task")) {
+		mmi_sms_init();
+
+	} else if (strstr(nv_task_tab, "voice_task")) {
+		mmi_voip_init();
+
+	}
+
+	//ÊÇ·ñÓÐµç³ØÌõ¼þ¿ØÖÆ
+	if (strstr(nv_task_tab, "battery_task")) {
+		mmi_battery_init();
+
+	}
+
+	if (strstr(nv_task_tab, "ctrl_task")) {
+		mmi_init_idle_control();
+	}
+
+	if (strstr(nv_task_tab, "wifi_task")) {
+		mmi_wifi_init();
+	}
+
+	if (strstr(nv_task_tab, "traffic_task")) {
+		mmi_traffic_init();
+	}
+
+	if (strstr(nv_task_tab, "key_task")) {
+		mmi_keyStrokes_init();
+	}
+
+
+	//³õʼ»¯½öÓëledÏà¹ØµÄÒµÎñ £¬ÇëÎâºìʵÏÖ
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+	}
+	
+#ifndef DISABLE_LCD
+	//³õʼ»¯½öÓëlcdÏà¹ØµÄÒµÎñ£¬ÇëÎâºìʵÏÖ
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		if (strstr(nv_task_tab, "tip_task")) {
+			mmi_init_lcd_tip();
+		}
+	}
+#endif
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:mmi ÏÔʾģʽ³õʼ»¯
+***********************************************************************************/
+static int mmi_showmode_init()
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_showmode_init \n");
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		mmi_initLed();
+	}
+	
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		mmi_set_lcd_page_index(MMI_SHOW_PAGE_FIRST);
+		mmi_initLcd(FALSE);
+	}
+#endif
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:MMIÈë¿Úº¯Êý  ´´½¨ÏûÏ¢¶ÓÁÐ ¸÷¸öµÆ³õʼ»¯ ½ÓÊÕÏûÏ¢
+***********************************************************************************/
+VOID mmi_powerOnLcdEntry()
+{
+	pthread_t mmi_handlemsg_thread;
+	//´´½¨MMIÏûÏ¢¶ÓÁÐ
+	if ((g_mmi_msgQue_Id = mmi_create_msg_queue()) == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI create g_mmi_msgQue_Id failed!!!\n");
+		MMI_ASSERT(0);
+	}
+	pthread_mutex_init(&g_mmi_lcdmode_mutex, NULL);
+	pthread_mutex_init(&g_mmi_ledmode_mutex, NULL);
+	pthread_mutex_init(&g_mmi_update_flag_mutex, NULL);
+	pthread_mutex_init(&g_mmi_refresh_lcd_mutex, NULL);
+	sem_init(&g_mmi_update_sem_id, 0, 0);
+	sem_init(&g_mmi_init_sem_id, 0, 0);
+	sem_init(&g_mmi_traffic_warn_sem_id, 0, 0);
+	sem_init(&g_mmi_poweroff_sem_id, 0, 0); //ÓÃÓڹػúʱ±£Ö¤LCDÆÁ²¥Íê¹Ø»ú¶¯»­ºóÃðÆ½»òLEDµÆ¶¼ÁÁÖ®ºóÔÙÃðµÆ
+
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI start set_mmi_active\n");
+	set_wake_lock(MMI_MAIN_LOCK_ID);
+
+	//´´½¨MMI ´¦ÀíÏûÏ¢Ïß³Ì
+	if (pthread_create(&mmi_handlemsg_thread, NULL, &mmi_handleMsgEntry, NULL) == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI pthread_create handle msg error\n");
+		return ;
+	}
+	mmi_showmode_init();
+
+	mmi_task_register();
+	mmi_task_init();
+
+	mmi_set_poweron_show();
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI main Register finish!!\n");
+
+	//´´½¨MMIÖ÷¿ØÏß³Ì
+	mmi_mainControllerEntry(NULL);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¹Ø»ú³äµç
+***********************************************************************************/
+VOID mmi_poweroffcharger_init()
+{
+
+	UINT32 i = 0;
+	pthread_t mmi_handlemsg_thread;
+	//´´½¨MMIÏûÏ¢¶ÓÁÐ
+	if ((g_mmi_msgQue_Id = mmi_create_msg_queue()) == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI create g_mmi_msgQue_Id failed!!!\n");
+		MMI_ASSERT(0);
+	}
+
+	pthread_t mmi_offchg_mainctrl_thread;
+	pthread_mutex_init(&g_mmi_update_flag_mutex, NULL);
+	pthread_mutex_init(&g_mmi_poweron_mutex, NULL);
+	sem_init(&g_mmi_update_sem_id, 0, 0);
+	sem_init(&g_mmi_init_sem_id, 0, 0);
+	
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		sem_init(&g_mmi_gui_init_sem_id, 0, 0);
+	}
+#endif
+
+	//´´½¨MMI ´¦ÀíÏûÏ¢Ïß³Ì
+	if (pthread_create(&mmi_handlemsg_thread, NULL, &mmi_handleMsgEntry, NULL) == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI pthread_create handle msg error\n");
+		return ;
+	}
+
+	for (i = 0; i < sizeof(g_zMMITaskInfoTab) / sizeof(T_zMMITaskInfoItem); ++ i) {
+		g_zMMITaskInfoTab[i].task = MMI_TASK_INVALID;
+	}
+
+	offchg_RegisterPocTaskInfoItem();
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		mmi_initLed();
+	}
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		mmi_initLcd(TRUE);
+	}
+#endif
+
+	int res = pthread_create(&mmi_offchg_mainctrl_thread, NULL, &mmi_mainControllerEntry, NULL);
+	if (res != 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI pthread_create main control error\n");
+		assert(0);
+	}
+}
+
+static int get_nv()
+{
+	char mmi_nv_value[NV_CONTENT_LEN] = {0};
+	SINT32 ret_fd = -1;
+	int state = 0;
+
+	//ÉèÖÃmmiÏÔʾģʽȫ¾Ö±äÁ¿
+	sc_cfg_get("mmi_showmode", mmi_nv_value, sizeof(mmi_nv_value));
+	if (0 == strcmp(mmi_nv_value, "led")) {
+		g_showMode = MMI_MODE_LED;
+		ret_fd = open(LCD_PATH, O_RDWR);
+		if (ret_fd == -1) 
+		{
+			slog(MMI_PRINT, SLOG_ERR,"MMI mmi_file_operate open file fail: %s!\n", LCD_PATH);
+		}
+		else
+		{
+			if(ioctl(ret_fd, LEADT15DS26_SET_BACKLIGHT, &state) < 0)
+			{
+				slog(MMI_PRINT, SLOG_ERR,"get_nv ioctl fail!\n");
+			}
+		}
+	} else if (0 == strcmp(mmi_nv_value, "lcd")) {
+		g_showMode = MMI_MODE_LCD;
+	} else if (0 == strcmp(mmi_nv_value, "all")) {
+		g_showMode = MMI_MODE_ALL;
+	} else {
+		assert(0);
+	}
+	
+	sc_cfg_get("customer_type",mmi_nv_value,sizeof(mmi_nv_value));
+	if(0 == strcmp(mmi_nv_value, "sdk_min"))
+	{
+		g_customer_type = CUSTOMER_SDK_MIN;
+	}
+	else if(0 == strcmp(mmi_nv_value, "guodian"))
+	{
+		g_customer_type = CUSTOMER_GUODIAN;
+	}
+	else if(0 == strcmp(mmi_nv_value, "nandian"))
+	{
+		g_customer_type = CUSTOMER_NANDIAN;
+	}
+
+	sc_cfg_get("mmi_use_protect", mmi_nv_value, sizeof(mmi_nv_value));
+
+	if (strstr(mmi_nv_value, "discharge_protect")) {
+		g_discharge_protect = 1;
+	}
+
+	if (strstr(mmi_nv_value, "temp_protect")) {
+		g_temp_protect = 1;
+		
+		if (strstr(mmi_nv_value, "charge_protect")) {
+			g_charge_protect = 1;
+		}
+	}
+
+	sc_cfg_get("mmi_fast_poweron", mmi_nv_value, sizeof(mmi_nv_value));
+
+	if (0 == strcmp(mmi_nv_value, "1")) {
+		g_fast_poweron = 1;
+
+	}
+
+	sc_cfg_get("mmi_led_mode", mmi_nv_value, sizeof(mmi_nv_value));
+
+	if (strstr(mmi_nv_value, "standby_mode")) {
+		g_led_standby_mode = 1;
+
+	}
+
+	if (strstr(mmi_nv_value, "sleep_mode")) {
+		g_led_sleep_mode = 1;
+	}
+
+
+	sc_cfg_get("mmi_use_wifi_usernum", mmi_nv_value, sizeof(mmi_nv_value));
+
+	if (0 == strcmp(mmi_nv_value, "1")) {
+		g_use_wifi_usernum = 1;
+	}
+
+	sc_cfg_get("mmi_show_pagetab", mmi_nv_value, sizeof(mmi_nv_value));
+
+	if (strstr(mmi_nv_value, "page1")) {
+		g_show_pagefirst = 1;
+	}
+	if (strstr(mmi_nv_value, "page2")) {
+		g_show_pagesecond = 1;
+	}
+	if (strstr(mmi_nv_value, "page3")) {
+		g_show_pagethird = 1;
+	}
+	/*
+	sc_cfg_get("mmi_temp_voltage_line", mmi_nv_value, sizeof(mmi_nv_value));
+	{
+		char *tmp = NULL;
+		char *substr = strtok_r(mmi_nv_value, "+",&tmp);
+		int temp[4] = {0};
+		int i = 0;
+		while (substr != NULL) {
+			temp[i] = atoi(substr);
+			i++;
+			substr = strtok_r(NULL, "+",&tmp);
+		}
+		g_mmi_superhightempvol = temp[0];
+		g_mmi_hightempvol = temp[1];
+		g_mmi_lowtempvol = temp[2];
+		g_mmi_superlowtempvol = temp[3];
+	}
+	*/
+	sc_cfg_get("mmi_battery_voltage_line", mmi_nv_value, sizeof(mmi_nv_value));
+	{
+		char *tmp = NULL;
+		char *substr = strtok_r(mmi_nv_value, "+",&tmp);
+		int i = 0;
+		while (substr != NULL) {
+			g_mmi_batvoltageline[i] = atoi(substr);
+			slog(MMI_PRINT, SLOG_DEBUG, "g_mmi_batvoltageline[%d] = %d\n", i, g_mmi_batvoltageline[i]);
+			i++;
+			substr = strtok_r(NULL, "+",&tmp);
+		}
+	}
+	if(ret_fd >= 0)
+	close(ret_fd);
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:MMIÈë¿Úº¯Êý  ´´½¨ÏûÏ¢¶ÓÁÐ ¸÷¸öµÆ³õʼ»¯ ½ÓÊÕÏûÏ¢
+***********************************************************************************/
+int main(int argc, char * argv[])
+{
+	//¸ù¾ÝNV³õʼ»¯´òÓ¡¼¶±ð£¬²¢×¢²á¶¯Ì¬µ÷Õû´òÓ¡¼¶±ðÐźÅÁ¿
+	loglevel_init();
+	
+	//zdm½«nvÉèÖÃת»»³ÉÈ«¾Ö±äÁ¿½øÐй¦ÄÜ¿ØÖÆ
+	get_nv();
+	mmi_BatLedOffOpt();//¹ØbootµãµÄµÆ
+#ifdef DISABLE_LCD
+	if (g_showMode != MMI_MODE_LED) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI MIN only support LED \n");
+		return -1;
+	}
+#endif
+
+	if (argc >= 2) {
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI ###POWER OFF CHARGER START####\n");
+		g_mmi_power_mode = 0;
+		zMmi_PowerOffChargerEntry();
+	} else {
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI ######START######\n");
+		g_mmi_power_mode = 1;
+		mmi_powerOnLcdEntry();
+	}
+	return 0;
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_adapter.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_adapter.c
new file mode 100755
index 0000000..61b8193
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_adapter.c
@@ -0,0 +1,135 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_adapter.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMIÊÊÅ䣬 ÊÊÅ䲻ͬ²Ù×÷ϵͳ
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-12-24
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+
+/*****************************************************************************
+ Í·Îļþ
+******************************************************************************/
+#include "mmi_common.h"
+
+#ifndef DISABLE_LCD
+#include "zcore_threads.h"
+#include "zcore_fileop.h"
+#endif
+
+struct mmi_queue {
+	struct list_head list;
+	int id;
+};
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:Mutexº¯ÊýÊÊÅä
+***********************************************************************************/
+
+int mmi_getMutex(pthread_mutex_t *mutex_id)
+{
+	return pthread_mutex_lock(mutex_id);
+}
+
+int mmi_putMutex(pthread_mutex_t *mutex_id)
+{
+	return pthread_mutex_unlock(mutex_id);
+}
+
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:Semaphoreº¯ÊýÊÊÅä
+***********************************************************************************/
+
+int mmi_PutSemaphore(sem_t *sem)
+{
+	return sem_post(sem);
+}
+
+int mmi_GetSemaphore(sem_t *sem, UINT32 timeout)
+{
+	return sem_wait(sem);
+}
+
+int mmi_GetSemaphoreEintr(sem_t *sem, UINT32 timeout)
+{
+    int ret = -1;
+    while ( MMI_SUCCESS != (ret = sem_wait(sem)) ) {
+			if (EINTR == errno) {
+                slog(MMI_PRINT, SLOG_DEBUG, "mmi_GetSemaphore failed,errno=%d\n",errno);
+			    continue;
+			}
+            else {
+                slog(MMI_PRINT, SLOG_ERR, "mmi_GetSemaphore failed,errno=%d\n",errno);
+                return -1;
+            }
+	}
+    
+    return MMI_SUCCESS; 
+}
+
+int mmi_DeleteSemaphore(sem_t *sem)
+{
+	return sem_destroy(sem);
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:Sleepº¯ÊýÊÊÅä
+***********************************************************************************/
+
+VOID mmi_sleep(UINT32 time_in_ms)
+{
+	sleep(time_in_ms / 1000);
+}
+
+void mmi_add_list(struct list_head *head, int src_id)
+{
+	struct mmi_queue *tmp = NULL, *item = NULL;
+
+	slog(NET_PRINT, SLOG_DEBUG, "mmi_add_list start, src_id:0x%x!!!\n", src_id);
+
+	list_for_each_entry(tmp, head, list) {
+		//·¢Ë͸øtarget_idÄ£¿éµÄÏûÏ¢ÒѾ­¼Ç¼¹ý
+		if (tmp->id == src_id) {
+			slog(NET_PRINT, SLOG_ERR, "mmi_add_list src_id:0x%x alread existed! \n", src_id);
+			return;
+		}
+	}
+
+	item = malloc(sizeof(struct mmi_queue));
+	if (item == NULL) {
+		slog(NET_PRINT, SLOG_ERR, "mmi_add_list src_id:0x%x malloc failed! \n", src_id);
+		return;
+	}
+
+	INIT_LIST_HEAD(&item->list);
+	item->id = src_id;
+	list_add_tail(&item->list, head);
+
+	slog(NET_PRINT, SLOG_NORMAL, "mmi_add_list src_id:0x%x success !!!\n", src_id);
+}
+
+void mmi_del_list(struct list_head *head, int src_id)
+{
+	struct mmi_queue *tmp = NULL, *item = NULL;
+
+	slog(NET_PRINT, SLOG_DEBUG, "mmi_del_list start, id:0x%x!!!\n", src_id);
+
+	list_for_each_entry(tmp, head, list) {
+		if (tmp->id == src_id) {
+			slog(NET_PRINT, SLOG_NORMAL, "mmi_del_list id = 0x%x\n", src_id);
+			list_del(&tmp->list);
+			free(tmp);
+			break;
+		}
+	}
+	slog(NET_PRINT, SLOG_DEBUG, "mmi_del_list success !!!\n");
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_battery.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_battery.c
new file mode 100755
index 0000000..c488517
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_battery.c
@@ -0,0 +1,503 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_batterry.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI»ñÈ¡³äµçºÍµç³ØÐÅÏ¢
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+
+
+/************************************************************************************
+                           Í·Îļþ
+***********************************************************************************/
+#include "mmi_lcd.h"
+#include <linux/netlink.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <mmi_common.h>
+
+
+/************************************************************************************
+                            È«¾Ö±äÁ¿¶¨Òå
+***********************************************************************************/
+
+static UINT32 s_mmi_poweroff_voltage_num = 0;//¶Áµ½µÍµç¹Ø»úµçѹµÄ´ÎÊý£¬Á¬ÐøÈý´Î×Ô¶¯¹Ø»ú
+static SINT32 g_mmi_voltageEx = 0;//ÿ20s²éѯµçѹʱ£¬±£´æÉÏÒ»´ÎµÄµçѹ
+static E_zMmi_Charge_State s_mmi_charge_state = STATE_CHARGE_MAX; //ÿ´ÎÊÕµ½Çý¶¯Éϱ¨Ê±£¬±£´æµ±Ç°µÄ³äµç״̬
+static E_zMmi_Charge_State s_mmi_charge_stateEx = STATE_CHARGE_MAX;//ÿ´ÎÊÕµ½Çý¶¯Éϱ¨Ê±£¬±£´æÉÏÒ»´ÎµÄ³äµç״̬
+static E_zMmi_Voltage_level s_mmi_voltage_level = VOLT_MAX;//²éѯµçѹʱ£¬¸ù¾Ýµçѹֵ±£´æµ±Ç°µçÁ¿·¶Î§
+
+static BOOL g_mmi_chg_switch_off = FALSE;//¼Ç¼³äµç¹Ø±Õ¿ª¹Ø£¬Ä¬ÈÏÔÊÐí³äµç
+static BOOL s_mmi_usb_insert_status = FALSE;//0:USB²åÈë״̬ 1:USB δ²åÈë״̬
+static SINT32 s_mmi_battery_pers = 0;//µçÁ¿°Ù·Ö±ÈÇø¼ä
+
+static MMI_TEMP_DETECT last_temp = MMI_TEMP_DETECT_MAX;//µç³ØÉÏÒ»´ÎζÈ״̬
+static SINT32 s_mmi_temp_count = 0;//ζÈÒ쳣ʱ¼ÆÊýÆ÷£¬Á¬Ðø3´Îºó½øÐÐÏàÓ¦´¦Àí
+
+
+extern E_zMmiShowMode g_showMode;
+extern UINT32 g_temp_protect;
+extern UINT32 g_discharge_protect;
+extern UINT32 g_charge_protect;
+extern UINT32 g_fast_poweron;
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡µç³ØÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_get_batteryinfo(UINT32 batteryinfo)
+{
+	if (batteryinfo != 0) {
+		T_zMMIBatteryInfo * pBatInfo = (T_zMMIBatteryInfo *)batteryinfo;
+		pBatInfo->chg_state = s_mmi_charge_state;
+		pBatInfo->bat_level = s_mmi_voltage_level;
+		pBatInfo->bat_pers = s_mmi_battery_pers;
+		pBatInfo->bat_grid = pBatInfo->bat_pers <= 5 ? 0 : (pBatInfo->bat_pers <= 25 ? 1 : (pBatInfo->bat_pers <= 50 ? 2 : (pBatInfo->bat_pers < 100 ? 3 : 4))); /*ÐèÇóÒªÇó<=5ÏÔʾºì¿ò0¸ñ,<=25ÏÔʾ1¸ñ*/
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_RegisterBatteryTaskInfoItem()
+{
+	T_zMMITaskInfoItem batteryTaskInfoItem = {0};
+
+	batteryTaskInfoItem.task = MMI_TASK_BATTERY;
+	batteryTaskInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMIBatteryInfo));
+	batteryTaskInfoItem.get_taskinfo_fun = mmi_get_batteryinfo;
+	batteryTaskInfoItem.get_ledinfo_fun = mmi_getLedBatteryInfo;
+#ifndef DISABLE_LCD
+	batteryTaskInfoItem.get_lcdinfo_fun = mmi_getLcdBatteryInfo;
+#endif
+	batteryTaskInfoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	//batteryAppInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&batteryTaskInfoItem);
+	return MMI_SUCCESS;
+}
+SINT32 mmi_RegisterPowerTaskInfoItem()
+{
+	T_zMMITaskInfoItem batteryTaskInfoItem = {0};
+	batteryTaskInfoItem.task = MMI_TASK_POWER;
+	batteryTaskInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMIBatteryInfo));
+	batteryTaskInfoItem.get_taskinfo_fun = mmi_get_batteryinfo;
+	batteryTaskInfoItem.get_ledinfo_fun = mmi_getLedBatteryInfo;
+#ifndef DISABLE_LCD
+	batteryTaskInfoItem.get_lcdinfo_fun = mmi_getLcdPowerInfo;
+#endif
+	batteryTaskInfoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	//batteryAppInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&batteryTaskInfoItem);
+	return MMI_SUCCESS;
+}
+
+static VOID mmi_set_battery_update(VOID)
+{
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		mmi_set_update_flag(MMI_TASK_BATTERY);
+	}
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		E_zMmi_Work_Mode mode = mmi_get_led_mode();
+		if (mode != MMI_IDLE_LEDOFF_MODE && mode != MMI_FAKE_POWEROFF_MODE && mode != MMI_IDLE_STANDBY_LEDOFF_MODE) {
+			mmi_set_update_flag(MMI_TASK_BATTERY);
+		}
+	}
+}
+VOID mmi_set_discharge_low_current(BOOL discharge_low_current_flag)
+{
+	if (discharge_low_current_flag) {
+		system(MMI_DISCHG_LOW_CURRENT);
+	} else {
+		system(MMI_DISCHG_HIGH_CURRENT);
+	}
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:¸æÖªcharger½øÈë¼Ù¹Ø»úģʽ
+***********************************************************************************/
+VOID mmi_set_fake_poweroff_charger(int fake_poweroff_flag)
+{
+	if (fake_poweroff_flag == 1) {
+		system(MMI_SET_FAKEPOWEROFF_CHARGER);
+	} else {
+		system(MMI_CAN_FAKEPOWEROFF_CHARGER);
+	}
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:µÍµç¹Ø»ú´¦Àí
+***********************************************************************************/
+static void mmi_lowbattery_shutdown(UINT32 voltagepower)
+{
+	if (voltagepower < POWEROFFLEVEL) {
+		s_mmi_poweroff_voltage_num ++ ;
+		if (s_mmi_poweroff_voltage_num == 3) {
+			s_mmi_poweroff_voltage_num = 0;
+			mmi_set_abnormal_poweroff_flag();
+
+			slog(MMI_PRINT, SLOG_NORMAL, "MMI poweroff,lowerbattery!!!\n");
+			mmi_set_poweroff();
+		}
+	} else {
+		s_mmi_poweroff_voltage_num = 0;
+	}
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:¸ù¾Ýµç³ØµçѹÉèÖÃµç³Ø°Ù·Ö±È¡¢webUI¶ÔÓ¦µç³Ø¸ñ
+Êý¡¢µç³Ø×´Ì¬(5%,10%,20%,25%,normal)
+***********************************************************************************/
+static VOID mmi_battery_capacity_compare(SINT32 voltagepower)
+{
+	int cur_power = 0;
+	int bat_level = 0;
+	if (g_mmi_voltageEx != 0) {
+		cur_power = voltagepower < g_mmi_voltageEx ? voltagepower : g_mmi_voltageEx;
+	} else {
+		cur_power = voltagepower;
+	}
+
+	if (g_discharge_protect) {
+		mmi_lowbattery_discharge_protect(voltagepower);
+	}
+	mmi_lowbattery_shutdown(voltagepower);
+	g_mmi_voltageEx = cur_power;
+	bat_level = get_voltage_level_from_table(cur_power);
+	mmi_set_webUI_batterypers(bat_level);
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_battery_capacity_compare voltagepower = %d !! cur_power = %d  !! bat_level = %d\n ", voltagepower, cur_power, bat_level);
+	s_mmi_battery_pers = bat_level;
+	s_mmi_voltage_level = mmi_set_battery_state(bat_level);
+
+}
+VOID mmi_set_mode_fast_poweron(BOOL chgflag)
+{
+
+	if (!g_fast_poweron)
+		return;
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		if (chgflag) {
+			if (mmi_get_led_mode() == MMI_FAKE_POWEROFF_MODE || mmi_get_led_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+				slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_battery_info  startcharging MMI_FAKE_POWEROFF_CHARGE_MODE \n\n");
+				mmi_set_led_mode(MMI_FAKE_POWEROFF_CHARGE_MODE);
+				mmi_set_update_flag(MMI_TASK_CTRL);
+			}
+		} else {
+			if (mmi_get_led_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+				slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_battery_info  discharging MMI_FAKE_POWEROFF_MODE \n\n");
+				mmi_set_led_mode(MMI_FAKE_POWEROFF_MODE);
+				mmi_set_update_flag(MMI_TASK_CTRL);
+			}
+		}
+	}
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		if (chgflag) {
+			if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_MODE || mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+				slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_battery_info  startcharging MMI_FAKE_POWEROFF_CHARGE_MODE \n\n");
+				mmi_set_lcd_mode(MMI_FAKE_POWEROFF_CHARGE_MODE);
+				mmi_set_update_flag(MMI_TASK_CTRL);
+			}
+		} else {
+			if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+				slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_battery_info  discharging MMI_FAKE_POWEROFF_MODE \n\n");
+				mmi_set_lcd_mode(MMI_FAKE_POWEROFF_MODE);
+				mmi_set_update_flag(MMI_TASK_CTRL);
+			}
+		}
+	}
+#endif
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º»ñÈ¡³äµç״̬
+ ***********************************************************************************/
+static VOID mmi_set_battery_info(VOID)
+{
+	E_zMmi_Charge_State chg_sta = STATE_CHARGE_MAX;
+	int power = 0;
+	chg_sta = mmi_get_charge_status();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_battery_info chg_sta = %d!!\n", chg_sta);
+	s_mmi_charge_stateEx = s_mmi_charge_state;
+	if (chg_sta == STATE_CHARGING) {
+		s_mmi_charge_state = STATE_CHARGING;
+		mmi_set_webUI_batterycharge(WEBUICHARGING, FALSE);
+		g_mmi_voltageEx = 0;
+		mmi_set_mode_fast_poweron(TRUE);
+	} else if (chg_sta == STATE_FULL) {
+		s_mmi_charge_state = STATE_FULL;
+		g_mmi_voltageEx = 0;
+		mmi_set_webUI_batterycharge(WEBUIUNCHARGING, TRUE);
+		mmi_set_mode_fast_poweron(TRUE);
+		if (g_charge_protect == 1) {
+			system(MMI_TURN_OFF_CHG_FULL);
+			slog(MMI_PRINT, SLOG_ERR, "MMI mmi_set_battery_info off charge full!!\n");
+		}
+	} else if (chg_sta == STATE_DISCHARGE) {
+		s_mmi_charge_state = STATE_DISCHARGE;
+		mmi_set_webUI_batterycharge(WEBUIUNCHARGING, FALSE);
+		power = mmi_voltage_state_read();
+		mmi_battery_capacity_compare(power);
+		mmi_set_mode_fast_poweron(FALSE);
+	} else if (chg_sta == STATE_CHARGERROR) {
+		s_mmi_charge_state = STATE_DISCHARGE;
+		mmi_set_webUI_batterycharge(WEBUIUNCHARGING, FALSE);
+
+		power = mmi_voltage_state_read();
+		mmi_battery_capacity_compare(power);
+		mmi_set_mode_fast_poweron(FALSE);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_set_battery_info invalid charge state!!\n");
+	}
+
+}
+
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º»ñÈ¡USB״̬
+ ***********************************************************************************/
+BOOL mmi_get_usb_insert_state()
+{
+	return s_mmi_usb_insert_status;
+}
+
+E_zMmi_Voltage_level mmi_get_voltage_level()
+{
+	return s_mmi_voltage_level;
+}
+
+E_zMmi_Charge_State mmi_get_charge_state()
+{
+	return s_mmi_charge_state;
+}
+
+
+
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´ò¿ªcharging_netlinkÌ×½Ó×Ö
+ ·µ»ØÖµ£º ´ò¿ªµÄnetlinkÌ×½Ó×ÖÃèÊö·û£¬´ò¿ª³É¹¦·µ»Ø·Ç0Öµ
+***********************************************************************************/
+int open_charging_netlink()
+{
+	struct sockaddr_nl addr;
+	int s = -1;
+	memset(&addr, 0, sizeof(addr));
+	addr.nl_family = AF_NETLINK;
+	addr.nl_pid = getpid();
+	addr.nl_groups = 0xffffffff;
+	s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
+	if (s < 0) {		
+		slog(MMI_PRINT, SLOG_ERR, "MMI charging socketfail %d\n",errno);
+		return -1;
+	}
+//  setsockopt(s, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz));
+	if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI charging bindfail %d\n",errno);
+		close(s);
+		return -1;
+	}
+	return s;
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£ºnetlinkÊý¾Ý¼ìË÷º¯Êý
+Êä   È룺const char *key£ºÖ¸Ïò¹Ø¼ü×ÖµÄÖ¸Õë
+         const char *buf£ºÖ¸Ïò×Ö·û´®µÄÖ¸Õë
+         size_t len£º×Ö·û´®³¤¶È
+
+Êä   ³ö£º
+·µ»ØÖµ£º ·µ»Ø×Ö·û´®ÖжÔÓ¦¹Ø¼ü×ֵįðʼµØÖ·£¬Èô¼ìË÷²»µ½¹Ø¼ü×Ö£¬·µ»ØNULL
+Æä   Ëû£º
+***********************************************************************************/
+static const char *search_netlink(const char *key, const char *buf, size_t len)
+{
+	size_t curlen = 0;
+	size_t keylen = strlen((char *)key);
+	char *cur = (char *)buf;
+
+	while (cur < buf + len - keylen) {
+		curlen = strlen(cur);
+		if (curlen == 0)
+			break;
+		if (!strncmp(key, cur, keylen) && cur[keylen] == '=') {
+			return cur + keylen + 1;
+		}
+		cur += (curlen + 1);
+	}
+	return NULL;
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´Ónetlink¼àÌýµ½µÄÏûÏ¢×Ö·û´®´¦Àí³äµçÏûÏ¢
+ ***********************************************************************************/
+void process_netlink_event(int netlink_fd)
+{
+	char buf[1024] = {0};
+	int byte_counts = -1;
+	const char *keys = NULL, *subsys = NULL, *action = NULL;
+	const char *power_supply_name = NULL;
+
+
+	byte_counts = recv(netlink_fd, buf, sizeof(buf)-1, 0);
+	buf[sizeof(buf)-1] = '\0';//cov
+
+	if (byte_counts <= 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI receive from netlonk ret %d err %d \n", byte_counts, errno);
+		return;
+	}
+
+	keys = (char *)(buf + strlen((char *)buf) + 1);
+	byte_counts -= (strlen((char*)buf) + 1);
+
+	subsys = search_netlink("SUBSYSTEM", keys, byte_counts);
+	action = search_netlink("ACTION", keys, byte_counts);
+	power_supply_name = search_netlink("POWER_SUPPLY_NAME", keys, byte_counts);
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI process_netlink_event subsys=%s, action=%s, power_supply_name=%s\n", subsys, action, power_supply_name);
+
+	if ((subsys != NULL) && (action != NULL) && (power_supply_name != NULL)) {//klocwork
+		if ((!strcmp(subsys, "power_supply")) && (!(strcmp(action, "change")))) {
+			if (!strcmp(power_supply_name, "charger")) {
+				set_wake_lock(MMI_MAIN_LOCK_ID);
+				mmi_reset_idle_timer();
+				mmi_set_battery_info();
+				slog(MMI_PRINT, SLOG_DEBUG, "MMI BATTERY process_netlink_event s_mmi_charge_state = %d s_mmi_charge_stateEx=%d\n", s_mmi_charge_state, s_mmi_charge_stateEx);
+				mmi_set_mode_active();
+				if (s_mmi_charge_state != s_mmi_charge_stateEx) {
+					mmi_set_battery_update();
+				}
+			} else if (!strcmp(power_supply_name, "boost")) {
+				if (g_discharge_protect) {
+					set_wake_lock(MMI_MAIN_LOCK_ID);
+					mmi_set_discharge_info();
+					set_wake_unlock(MMI_MAIN_LOCK_ID);
+				}
+			} else {
+				return;
+			}
+		}
+	}
+}
+/**********************************************************************************
+*º¯Êý˵Ã÷£ºµçѹÂÖѯ¶¨Ê±Æ÷»Øµ÷º¯Êýÿ20Ãë¶ÁÒ»´Îµçѹ
+ ***********************************************************************************/
+static VOID *mmi_batterypower_process_thread(VOID *arg)
+{
+	UINT32 voltagepower = 0;
+
+	prctl(PR_SET_NAME, "mmigetbatvol", 0, 0, 0);
+
+	while (1) {
+		set_wake_lock(MMI_GET_POWER_LOCK_ID);
+		
+		if (g_discharge_protect) {
+			voltagepower = mmi_voltage_state_read();
+			if (voltagepower != 0) {
+				mmi_battery_capacity_compare(voltagepower);
+				mmi_set_battery_update();
+			}
+		} else {
+			if (mmi_get_charge_state() == STATE_DISCHARGE) {
+				voltagepower = mmi_voltage_state_read();
+				if (voltagepower != 0) {
+					mmi_battery_capacity_compare(voltagepower);
+					mmi_set_battery_update();
+				}
+			} else {
+				/*³äµçµÈÆäËûÇé¿öϵĵ͵籣»¤*/
+				if (g_temp_protect) {
+					voltagepower = mmi_voltage_state_read();
+					if (voltagepower != 0) {
+						mmi_lowbattery_shutdown(voltagepower);
+					}
+				}
+			}
+		}
+		set_wake_unlock(MMI_GET_POWER_LOCK_ID);
+		mmi_sleep(CHECK_POWER_TIME_INTERVAL);
+	}
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´´½¨µçѹ²éѯÏß³Ì
+ ***********************************************************************************/
+static VOID mmi_create_get_voltage_thread(VOID)
+{
+	pthread_t mmi_battryvol_thread;
+	if (pthread_create(&mmi_battryvol_thread, NULL, &mmi_batterypower_process_thread, NULL) == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI pthread_create BatteryPower_thread error\n");
+		return;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_create_get_voltage_timer success!!\n");
+}
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´´½¨³äµç¼àÌýÏß³Ì
+ ***********************************************************************************/
+void *mmi_chargingcheck_process_thread(void *arg)
+{
+	int charging_netlink = -1;
+	int fd_counts = -1;
+	fd_set readfds;
+	prctl(PR_SET_NAME, "mmichgcheck", 0, 0, 0);
+	if ((charging_netlink = open_charging_netlink()) < 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI charging_netlink wrong \n");
+		return NULL;
+	}
+	while (1) {
+		FD_ZERO(&readfds);
+		FD_SET(charging_netlink, &readfds);
+
+		fd_counts = select(charging_netlink + 1, &readfds, NULL, NULL, NULL);
+
+		if (fd_counts < 0) {
+			slog(MMI_PRINT, SLOG_ERR, "MMI select usb_netlink error! \n");
+			continue;
+		} else if (fd_counts == 0) {
+			slog(MMI_PRINT, SLOG_ERR, "MMI select usb_netlink timeout\n");
+			continue;
+		} else {
+			if (charging_netlink > 0 && FD_ISSET(charging_netlink, &readfds)) {
+				process_netlink_event(charging_netlink);
+			}
+		}
+	}
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´´½¨³äµç״̬¼à¿ØÏß³Ì
+ ***********************************************************************************/
+static VOID mmi_create_chargestate_check_thread(VOID)
+{
+	pthread_t mmi_chgstate_thread;
+	if (pthread_create(&mmi_chgstate_thread, NULL, &mmi_chargingcheck_process_thread, NULL) == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_create_chargestate_check_thread error\n");
+		return;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_create_chargestate_check_thread success!!!\n");
+
+}
+
+/**************************************************************************************
+*º¯Êý˵Ã÷:³õʼ»¯³äµç״̬ ÉèÖÃµç³ØµÆ
+***************************************************************************************/
+static VOID mmi_charge_state_init(VOID)
+{
+	mmi_set_battery_info();
+	mmi_set_battery_update();
+}
+
+/**************************************************************************************
+*º¯Êý˵Ã÷:³õʼ»¯µç³ØµÆ×´Ì¬
+***************************************************************************************/
+VOID mmi_battery_init(VOID)
+{
+
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI BATTERY mmi_battery_Led_Init begin!!\n");
+	mmi_charge_state_init();
+	if (g_discharge_protect) {
+		mmi_load_state_init();
+	}
+	mmi_create_chargestate_check_thread();
+	mmi_create_get_voltage_thread();
+}
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_battery_adapter.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_battery_adapter.c
new file mode 100755
index 0000000..ad1b1ae
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_battery_adapter.c
@@ -0,0 +1,215 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_batterry_adapter.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI»ñÈ¡³äµçºÍµç³ØÐÅÏ¢ÊÊÅä
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+
+
+/************************************************************************************
+                           Í·Îļþ
+***********************************************************************************/
+#include <linux/netlink.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include "mmi_common.h"
+#include "mmi_lcd.h"
+/*
+extern SINT32 g_mmi_hightempvol;
+extern SINT32 g_mmi_superhightempvol;
+extern SINT32 g_mmi_lowtempvol;
+extern SINT32 g_mmi_superlowtempvol;
+*/
+extern SINT32 g_mmi_batvoltageline[MMI_BAT_VOLTAGE_LEN];
+
+//µçѹ-µçÁ¿ÅäÖÃ±í£¬mmi´ÓÇý¶¯¶Áµ½µÄµçѹ»á¸úÕâ¸ö±íµÄµçѹ½øÐбȶԣ¬´Ó¶øÕÒµ½µçÁ¿·¶Î§
+static int bat_volage[] = {
+	3090, 3300, 3450, 3490, 3510, 3540, 3550, 3570, 3580, 3600, 3620,
+	3650, 3670, 3710, 3740, 3780, 3850, 3900, 3950, 4000, 4060,
+
+};
+
+
+static T_zMmiChgStateStringItem g_chgStateStringTab[] = {
+	{CHARGE_STATUS_FULL,     	STATE_FULL},
+	{CHARGE_STATUS_CHARGING, 	STATE_CHARGING},
+	{CHARGE_STATUS_DISCHARGING,	STATE_DISCHARGE},
+	{CHARGE_STATUS_NOTCHARGING,	STATE_CHARGERROR}
+};
+
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º ¶ÁÈ¡µçѹֵ
+***********************************************************************************/
+SINT32 mmi_voltage_state_read(VOID)
+{
+	char buf_volt[CHARGE_VOLTAGE_LENGTH] = {0};
+	FILE* fd_voltage = NULL;
+	int len = 0;
+	int voltagepower = 0;
+
+	fd_voltage = fopen(CHARGE_VOLTAGE_PATH, "r");
+	if (fd_voltage == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI open voltage file fail!\n");
+		//MMI_ASSERT(0);
+		return -1;
+	}
+	len = fread(buf_volt, 1, CHARGE_VOLTAGE_LENGTH, fd_voltage);
+	if (len > 0) { //kw 3
+		voltagepower = atoi(buf_volt);
+		fclose(fd_voltage);
+		slog(MMI_PRINT, SLOG_NORMAL, "MMI voltagepower=%d\n",voltagepower);
+		return voltagepower;
+	} else {
+		perror("read voltage file failed");
+		slog(MMI_PRINT, SLOG_ERR, "MMI read voltage file fail len = %d !\n", len);
+		fclose(fd_voltage);
+		return -1;
+	}
+}
+
+
+/*****************************************************************************************
+*º¯Êý˵Ã÷£º ¸ù¾Ýµç³Ø°Ù·Ö±ÈÉèÖÃµç³Ø×´Ì¬ 10%/25%/normal
+*******************************************************************************************/
+E_zMmi_Voltage_level mmi_set_battery_state(UINT32 bat_level)
+{
+	E_zMmi_Voltage_level volt_lev = VOLT_MAX;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_battery_state bat_level = %d\n", bat_level);
+	if (bat_level <= 5) {
+		volt_lev = VOLT_5PERCENTLEVEL;
+	} else if (bat_level <= 10) { //kw 3
+		volt_lev = VOLT_10PERCENTLEVEL;
+	} else if (bat_level <= 20) {
+		volt_lev = VOLT_20PERCENTLEVEL;
+	} else if (bat_level <= 25) {
+		volt_lev = VOLT_25PERCENTLEVEL;
+	} else {
+		volt_lev = VOLT_NORMALLEVEL;
+	}
+	return volt_lev;
+}
+/*****************************************************************************************
+*º¯Êý˵Ã÷£º ÉèÖÃWEBUIµç³Ø¸ñÊý
+*******************************************************************************************/
+VOID mmi_set_webUI_batterypers(UINT32 bat_level)
+{
+	if (bat_level <= 5) {
+		sc_cfg_set(WEBUIBATTERYLEVEL, WEBUINOLEVEL);
+	} else if (bat_level <= 25) { //kw 3
+		sc_cfg_set(WEBUIBATTERYLEVEL, WEBUIONELEVEL);
+	} else if (bat_level <= 50) {
+		sc_cfg_set(WEBUIBATTERYLEVEL, WEBUITWOLEVEL);
+	} else if (bat_level < 100) {
+		sc_cfg_set(WEBUIBATTERYLEVEL, WEBUITHRLEVEL);
+	} else {
+		sc_cfg_set(WEBUIBATTERYLEVEL, WEBUIFOURLEVEL);
+	}
+}
+
+/*****************************************************************************************
+*º¯Êý˵Ã÷£º ÉèÖÃWEBUIµç³Ø×´Ì¬
+*******************************************************************************************/
+VOID mmi_set_webUI_batterycharge(char* chg_sta, BOOL isFull)
+{
+	sc_cfg_set(WEBUICHARGESTATTUS, chg_sta);
+	if (isFull) {
+		sc_cfg_set(BATTERYPERS_NV, WEBUIFULLLEVEL);
+		sc_cfg_set(WEBUIBATTERYLEVEL, WEBUIFOURLEVEL);
+	}
+}
+/*****************************************************************************************
+*º¯Êý˵Ã÷£º ¸ù¾Ýµçѹ»ñÈ¡µç³ØµçÁ¿°Ù·Ö±È
+*******************************************************************************************/
+SINT32 get_voltage_level_from_table(SINT32 voltagepower)
+{
+	UINT32 bat_lev = 0;
+	SINT32 i;
+
+	if (voltagepower < g_mmi_batvoltageline[0]) {
+		bat_lev = 0;
+	} else if (voltagepower >= g_mmi_batvoltageline[MMI_BAT_VOLTAGE_LEN - 1]) {
+		bat_lev = 100;
+	} else {
+		for (i = 0; i < MMI_BAT_VOLTAGE_LEN - 1; i++) {
+			if (voltagepower >= g_mmi_batvoltageline[i] && voltagepower < g_mmi_batvoltageline[i + 1]) {
+				bat_lev = i * 5;
+				break;
+			}
+		}
+	}
+	return bat_lev;
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º»ñÈ¡³äµç״̬
+ ***********************************************************************************/
+E_zMmi_Charge_State mmi_get_charge_status(VOID)
+{
+	char chg_state_buf[CHARGE_STATUS_LENGTH] = {0};
+	int len = 0;
+	UINT32 i = 0;
+	FILE* fd_charger = NULL;
+
+	fd_charger = fopen(CHARGE_STATUS_PATH, "r");
+	if (fd_charger == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_get_charge_status open charging file fail!\n");
+		//MMI_ASSERT(0);
+		return STATE_CHARGE_MAX;
+	}
+	len = fread(chg_state_buf, 1, CHARGE_STATUS_LENGTH, fd_charger);
+	if (len > 0) { //kw 3
+		fclose(fd_charger);
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_charge_status chg_state_buf=%s !\n", chg_state_buf);
+		for (i = 0; i < sizeof(g_chgStateStringTab) / sizeof(T_zMmiChgStateStringItem); ++ i) {
+			if (strncmp(chg_state_buf, g_chgStateStringTab[i].devString, strlen(g_chgStateStringTab[i].devString)) == 0) {
+				return g_chgStateStringTab[i].chg_sta;
+			}
+		}
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_get_charge_status read voltage file fail len = %d !\n", len);
+		fclose(fd_charger);
+		return STATE_CHARGE_MAX;
+	}
+	return STATE_CHARGE_MAX;
+}
+/**********************************************************************************
+*º¯Êý˵Ã÷£º»ñÈ¡USB²å°Î״̬
+ ***********************************************************************************/
+BOOL mmi_read_usb_insert_status(VOID)
+{
+	char usb_state_buf[2] = {0};
+	int len = 0;
+	FILE* fd_charger = NULL;
+
+	fd_charger = fopen(USB_INSERT_STATUS_PATH, "r");
+	if (fd_charger == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_read_usb_insert_status open usb file fail!\n");
+		//MMI_ASSERT(0);
+		return FALSE;
+	}
+	len = fread(usb_state_buf, 1, 2, fd_charger);
+	if (len > 0) { //kw 3
+		fclose(fd_charger);
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_read_usb_insert_status usb_state_buf=%s !\n", usb_state_buf);
+		if (!strncmp(usb_state_buf, USB_STATUS_IN, strlen(USB_STATUS_IN))) {
+			return TRUE;
+		}
+		if (!strncmp(usb_state_buf, USB_STATUS_OUT, strlen(USB_STATUS_OUT))) {
+			return FALSE;
+		}
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_read_usb_insert_status read usb file fail len = %d !\n", len);
+		fclose(fd_charger);
+		return FALSE;
+	}
+	return FALSE;
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_cfg.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_cfg.c
new file mode 100755
index 0000000..a69ecf8
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_cfg.c
@@ -0,0 +1,197 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_lcd.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £º
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#include "mmi_common.h"
+
+/***********************************LCDͳһÅäÖÃ********************************/
+
+/*ÆÁĻģʽÅäÖÃ*/
+E_zMmiShowMode g_showMode = 0;//led,1;lcd,2;lcd+lcd,3
+
+
+/***********************************LEDͳһÅäÖÃ********************************/
+
+T_zMmiSmsLedConfig g_mmi_smsled_config_tab[] = {
+	{{0, SMS_RECVBOX_STATUS_FULL}, {LED_SMS, LED_STATE_BLINK, LED_STATE_SMS_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{0, SMS_RECVBOX_STATUS_NEW}, {LED_SMS, LED_STATE_BLINK, LED_STATE_SMS_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{0, SMS_RECVBOX_STATUS_UNREAD}, {LED_SMS, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{0, SMS_RECVBOX_STATUS_NOR}, {LED_SMS, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+
+};
+
+T_zMmiVoipLedConfig g_mmi_voipled_config_tab[] = {
+	{{VOIP_STATUS_IN_CALL}, {LED_VOIP, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{VOIP_STATUS_IN_CONNECTION}, {LED_VOIP, LED_STATE_BLINK, LED_STATE_VOIP_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{VOIP_STATUS_HANG_UP}, {LED_VOIP, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{VOIP_STATUS_NOR}, {LED_VOIP, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+
+};
+
+T_zMmiBatteryLedConfig g_mmi_batled_config_tab[] = {
+	{{STATE_CHARGING, 0, 0, 0}, {LED_BATTERY, LED_STATE_BLINK, LED_STATE_BAT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{{STATE_FULL, 0, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{{STATE_DISCHARGE, VOLT_5PERCENTLEVEL, 0, 0}, {LED_BATTERY, LED_STATE_BLINK, LED_STATE_BAT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{{STATE_DISCHARGE, VOLT_10PERCENTLEVEL, 0, 0}, {LED_BATTERY, LED_STATE_BLINK, LED_STATE_BAT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{{STATE_DISCHARGE, VOLT_20PERCENTLEVEL, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{{STATE_DISCHARGE, VOLT_25PERCENTLEVEL, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{{STATE_DISCHARGE, VOLT_50PERCENTLEVEL, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{{STATE_DISCHARGE, VOLT_75PERCENTLEVEL, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{{STATE_DISCHARGE, VOLT_NORMALLEVEL, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+};
+
+T_zMmiNetLedConfig g_mmi_netled_config_tab[] = {
+	{CUSTOMER_SDK, {NET_MODE_2G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {NET_MODE_2G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {NET_MODE_3G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {NET_MODE_3G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {NET_MODE_4G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {NET_MODE_4G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {NET_MODE_NOSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {NET_MODE_LIMITSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	//16M flash
+	{CUSTOMER_SDK_MIN, {NET_MODE_2G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_2G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_3G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_3G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_4G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_4G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_NOSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_LIMITSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	//16M flash, yaoyuan cpe
+	{CUSTOMER_YAOYUAN, {NET_MODE_2G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_2G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_3G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_3G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_4G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_4G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_NOSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_LIMITSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_NOTREADY, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	//{CUSTOMER_YAOYUAN, {NET_MODE_NOSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_CPE_FAST_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	//{CUSTOMER_YAOYUAN, {NET_MODE_LIMITSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_CPE_FAST_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	//{CUSTOMER_YAOYUAN, {NET_MODE_NOTREADY, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_CPE_SLOW_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	//GUODIAN led config
+	{CUSTOMER_GUODIAN, {NET_MODE_2G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_FAST_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_3G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_FAST_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_4G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_FAST_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_2G, 1, 0, 0, 0, NET_SOCKET_ACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_SLOW_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_3G, 1, 0, 0, 0, NET_SOCKET_ACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_SLOW_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_4G, 1, 0, 0, 0, NET_SOCKET_ACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_SLOW_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_2G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_3G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_4G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_NOSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_LIMITSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	//NANDIAN led config
+	{CUSTOMER_NANDIAN, {NET_MODE_2G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_FAST_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_3G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_FAST_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_4G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_FAST_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_2G, 1, 0, 0, 0, NET_SOCKET_ACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_SLOW_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_3G, 1, 0, 0, 0, NET_SOCKET_ACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_SLOW_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_4G, 1, 0, 0, 0, NET_SOCKET_ACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_SLOW_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_2G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_3G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_4G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_NOSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_LIMITSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+};
+
+
+#if 0
+T_zMmiWifiLedConfig g_mmi_wifiled_config_tab[] = {
+	{{TRUE, 0, 0, WPS_ACTIVING}, {LED_LAN, LED_STATE_BLINK, LED_STATE_LAN_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{TRUE, 0, 0, WPS_ACTIVED}, {LED_LAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{TRUE, 0, 0, WPS_DEACTIVED}, {LED_LAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{TRUE, 0, 0, WPS_DEACTIVING}, {LED_LAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{TRUE, 0, 0, WPS_ACTIVE_MAX}, {LED_LAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{FALSE, 0, 0, WPS_ACTIVE_MAX}, {LED_LAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+};
+#endif
+
+T_zMmiWifiLedConfig g_mmi_wifiled_config_tab[] = {
+	{CUSTOMER_SDK, {TRUE, TRUE, 0, 0, WPS_ACTIVING}, {LED_LAN, LED_STATE_BLINK, LED_STATE_LAN_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {TRUE, FALSE, 0, 0, WPS_ACTIVED}, {LED_LAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {FALSE, TRUE, 0, 0, WPS_DEACTIVED}, {LED_LAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {FALSE, FALSE, 0, 0, WPS_DEACTIVING}, {LED_LAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+
+	//16M flash
+	{CUSTOMER_SDK_MIN, {TRUE, TRUE, 0, 0, WPS_ACTIVING}, {LED_LAN, LED_STATE_BLINK, LED_STATE_LAN_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {TRUE, FALSE, 0, 0, WPS_ACTIVED}, {LED_LAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {FALSE, TRUE, 0, 0, WPS_DEACTIVED}, {LED_LAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {FALSE, FALSE, 0, 0, WPS_DEACTIVING}, {LED_LAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+};
+
+//wpsµÆ Ò¢Ô¶cpe
+T_zMmiWifiLedConfig g_mmi_wpsled_config_tab[] = {
+	{CUSTOMER_SDK, {TRUE, TRUE, 0, 0, WPS_ACTIVING}, {LED_WPS, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {TRUE, FALSE, 0, 0, WPS_ACTIVED}, {LED_WPS, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {FALSE, TRUE, 0, 0, WPS_DEACTIVED}, {LED_WPS, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {FALSE, FALSE, 0, 0, WPS_DEACTIVING}, {LED_WPS, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {FALSE, FALSE, 0, 0, WPS_FAIL}, {LED_WPS, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {FALSE, FALSE, 0, 0, WPS_ACTIVE_MAX}, {LED_WPS, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+};
+
+//5¿ÅµÆ ¸´ÓÃTRAFFIC_LED  Ò¢Ô¶cpe
+T_zMmiNetLedConfig g_mmi_signalled_config_tab[] = {
+	//16M flash, yaoyuan cpe
+	{CUSTOMER_YAOYUAN, {NET_MODE_2G, 0, 1, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_1}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_2G, 0, 2, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_2}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_2G, 0, 3, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_3}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_2G, 0, 4, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_4}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_2G, 0, 5, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_5}},
+
+	{CUSTOMER_YAOYUAN, {NET_MODE_3G, 0, 1, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_1}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_3G, 0, 2, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_2}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_3G, 0, 3, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_3}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_3G, 0, 4, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_4}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_3G, 0, 5, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_5}},
+
+	{CUSTOMER_YAOYUAN, {NET_MODE_4G, 0, 1, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_1}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_4G, 0, 2, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_2}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_4G, 0, 3, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_3}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_4G, 0, 4, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_4}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_4G, 0, 5, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_5}},
+
+	{CUSTOMER_YAOYUAN, {NET_MODE_NOSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_BLINK, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_LIMITSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_BLINK, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_NOTREADY, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_BLINK, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+};
+
+//rj11µÆ Ò¢Ô¶cpe
+T_zMmiRj11LedConfig g_mmi_rj11led_config_tab[] = {
+	{{RJ11_STATUS_IN}, {LED_RJ11, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{RJ11_STATUS_OUT}, {LED_RJ11, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{RJ11_STATUS_NOR}, {LED_RJ11, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+};
+
+unsigned int mmi_get_config_tab_size(MMI_LED_NAME led)
+{
+	if (led == LED_BATTERY) {
+		return sizeof(g_mmi_batled_config_tab);
+	} else if (led == LED_LAN) {
+		return sizeof(g_mmi_wifiled_config_tab);
+	} else if (led == LED_WAN) {
+		return sizeof(g_mmi_netled_config_tab);
+	} else if (led == LED_SMS) {
+		return sizeof(g_mmi_smsled_config_tab);
+	} else if (led == LED_VOIP) {
+		return sizeof(g_mmi_voipled_config_tab);
+	} else if (led == LED_SIGNAL) {
+		return sizeof(g_mmi_signalled_config_tab);
+	} else if (led == LED_WPS) {
+		return sizeof(g_mmi_wpsled_config_tab);
+	} else if (led == LED_RJ11) {
+		return sizeof(g_mmi_rj11led_config_tab);
+	}
+	return 0;
+}
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_cfg.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_cfg.h
new file mode 100755
index 0000000..bd0a869
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_cfg.h
@@ -0,0 +1,248 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_lcd.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £º
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+
+/***********************************LCDͳһÅäÖÃ********************************/
+
+
+
+/*****************************************************************************
+ÆÁÄ»×ÖÌå´óС¶¨Òå
+******************************************************************************/
+#define MMI_LCD_SHOW_STRING_LEN 			68
+#define MMI_LCD_CHAR8_MAX_LEN    			18	//ÿÆÁÏÔʾµÄ×î´ó³¤¶È£¬´óÓÚ´ËÖµ½«¹ö¶¯ÏÔʾ£¬Èç×ÖÌå±ä»¯ÐèÐÞ¸Ä
+#define MMI_LCD_CHAR9_MAX_LEN    			18	//ÿÆÁÏÔʾµÄ×î´ó³¤¶È£¬´óÓÚ´ËÖµ½«¹ö¶¯ÏÔʾ£¬Èç×ÖÌå±ä»¯ÐèÐÞ¸Ä
+
+/*****************************************************************************
+Îļþ×ÊԴ·¾¶¶¨Òå
+******************************************************************************/
+#define MMI_RESOURCE_PATH  					"/etc_ro/mmi/"
+
+/*****************************************************************************
+ LEDµÆÉÁ˸ƵÂÊÅäÖÃ
+******************************************************************************/
+
+#define LED_BLINK_TIME_INTERVAL			1000
+
+//LEDµÆ¿ìÉÁ/ÂýÉÁʱ¼ä    µ¥Î»:ms
+#define LED_FAST_BLINK_ON_TIME          100//1000
+#define LED_FAST_BLINK_OFF_TIME         100//1000
+#define LED_SLOW_BLINK_ON_TIME          250//2000
+#define LED_SLOW_BLINK_OFF_TIME         250//5000
+
+#define LED_BAT_BLINK_ON_TIME			800
+#define LED_BAT_BLINK_OFF_TIME			1200
+#define LED_LAN_BLINK_ON_TIME			400
+#define LED_LAN_BLINK_OFF_TIME			1600
+#define LED_SMS_BLINK_ON_TIME			800
+#define LED_SMS_BLINK_OFF_TIME			1200
+#define LED_WAN_BLINK_ON_TIME			200
+#define LED_WAN_BLINK_OFF_TIME			1400
+#define LED_VOIP_BLINK_ON_TIME			400
+#define LED_VOIP_BLINK_OFF_TIME			1600
+
+#define LED_BREATH_BLINK_ON_TIME		300
+#define LED_BREATH_BLINK_OFF_TIME		5000
+//¹úµçÁªÇ¿:PDP¼¤»îSOCKETδÁ¬½Ó1.8sÃð0.2sÁÁ£¬SOCKETÒÑÁ¬½Ó·´Ö®
+#define LED_WAN_FAST_BLINK_ON_TIME		200
+#define LED_WAN_FAST_BLINK_OFF_TIME		1800
+#define LED_WAN_SLOW_BLINK_ON_TIME		1800
+#define LED_WAN_SLOW_BLINK_OFF_TIME		200
+//yaoyuan cpe
+#define LED_WAN_CPE_FAST_BLINK_ON_TIME		500
+#define LED_WAN_CPE_FAST_BLINK_OFF_TIME		500
+#define LED_WAN_CPE_SLOW_BLINK_ON_TIME		500
+#define LED_WAN_CPE_SLOW_BLINK_OFF_TIME		1000
+
+
+
+/*******************************************************************************
+  LEDµÆ¹«¹²¶¨Òå//ÏÂÃæ¼¸¸öÊǶ¨ÒåÁ˺ôÎüµÆÊ±Óõ½µÄ·¾¶
+*******************************************************************************/
+#define ALL_LED_PATH					"/sys/class/leds/battery_led/brightness"
+#define BATTERY_LED_PATH				"/sys/class/leds/battery_led/ledSwitch"
+#define WAN_LED_PATH					"/sys/class/leds/net_led/ledSwitch"
+#define LAN_LED_PATH					"/sys/class/leds/wifi_led/ledSwitch"
+#define SMS_LED_PATH					"/sys/class/leds/sms_led/ledSwitch"
+#define TRAFFIC_LED_PATH				"/sys/class/leds/traffic_led/ledSwitch"
+
+/*
+/×Ö·û´®º¬Òå:µÚһλ: ÑÕÉ« 1-RED 2-GREEN 3-YELLOW 4-BLUE;
+			µÚ¶þλ: ״̬ 0-OFF 1-ON 2-BLINK;
+			µÚÈýËÄλ: Á÷Á¿µÆÁÁµÄ¸öÊý£¬00-09·Ö±ðΪÁÁ1¸öµ½10¸öÁ÷Á¿µÆ£¬10ΪÎÞЧֵ*/
+#define LED_STATE_GREEN_OFF				"2010"
+#define LED_STATE_YELLOW_OFF			"3010"
+#define LED_STATE_BLUE_OFF				"4010"
+#define LED_TRAFFIC_ALL_OFF				"2009"
+
+#define LED_ALL_POWER_ON				"1"
+#define LED_ALL_POWER_OFF				"2"
+
+#define LED_STATE_RED_ON				"1110"
+#define LED_STATE_RED_BLINK				"1210"
+#define LED_STATE_GREEN_ON				"2110"
+#define LED_STATE_GREEN_BLINK			"2210"
+#define LED_STATE_YELLOW_ON				"3110"
+#define LED_STATE_YELLOW_BLINK			"3210"
+#define LED_STATE_BLUE_ON				"4110"
+#define LED_STATE_BLUE_BLINK			"4210"
+
+#define TRAFIIC_LED_1_ON				"2100"
+#define TRAFIIC_LED_1_BLINK				"2200"
+#define TRAFIIC_LED_2_ON				"2101"
+#define TRAFIIC_LED_2_BLINK				"2201"
+#define TRAFIIC_LED_3_ON				"2102"
+#define TRAFIIC_LED_3_BLINK				"2202"
+#define TRAFIIC_LED_4_ON				"2103"
+#define TRAFIIC_LED_4_BLINK				"2203"
+#define TRAFIIC_LED_5_ON				"2104"
+#define TRAFIIC_LED_5_BLINK				"2204"
+#define TRAFIIC_LED_6_ON				"2105"
+#define TRAFIIC_LED_6_BLINK				"2205"
+#define TRAFIIC_LED_7_ON				"2106"
+#define TRAFIIC_LED_7_BLINK				"2206"
+#define TRAFIIC_LED_8_ON				"2107"
+#define TRAFIIC_LED_8_BLINK				"2207"
+#define TRAFIIC_LED_9_ON				"2108"
+#define TRAFIIC_LED_9_BLINK				"2208"
+#define TRAFIIC_LED_10_ON				"2109"
+#define TRAFIIC_LED_10_BLINK			"2209"
+
+
+#define LED_WAN_RED_BRIGHTNESS			"/sys/class/leds/modem_r_led/brightness"
+#define LED_WAN_RED_BLINKSWITCH			"/sys/class/leds/modem_r_led/trigger"
+#define LED_WAN_RED_BLINKTIMEON			"/sys/class/leds/modem_r_led/delay_on"
+#define LED_WAN_RED_BLINKTIMEOFF		"/sys/class/leds/modem_r_led/delay_off"
+
+#define LED_WAN_GREEN_BRIGHTNESS        "/sys/class/leds/modem_g_led/brightness"
+#define LED_WAN_GREEN_BLINKSWITCH		"/sys/class/leds/modem_g_led/trigger"
+#define LED_WAN_GREEN_BLINKTIMEON		"/sys/class/leds/modem_g_led/delay_on"
+#define LED_WAN_GREEN_BLINKTIMEOFF		"/sys/class/leds/modem_g_led/delay_off"
+
+
+#define LED_WAN_BLUE_BRIGHTNESS			"/sys/class/leds/modem_b_led/brightness"
+#define LED_WAN_BLUE_BLINKSWITCH		"/sys/class/leds/modem_b_led/trigger"
+#define LED_WAN_BLUE_BLINKTIMEON		"/sys/class/leds/modem_b_led/delay_on"
+#define LED_WAN_BLUE_BLINKTIMEOFF		"/sys/class/leds/modem_b_led/delay_off"
+
+#define LED_BATTERY_GREEN_BRIGHTNESS	"/sys/class/leds/battery_g_led/brightness"
+#define LED_BATTERY_GREEN_BLINKSWITCH	"/sys/class/leds/battery_g_led/trigger"
+#define LED_BATTERY_GREEN_BLINKTIMEON	"/sys/class/leds/battery_g_led/delay_on"
+#define LED_BATTERY_GREEN_BLINKTIMEOFF	"/sys/class/leds/battery_g_led/delay_off"
+
+#define LED_BATTERY_RED_BRIGHTNESS		"/sys/class/leds/battery_r_led/brightness"
+#define LED_BATTERY_RED_BLINKSWITCH		"/sys/class/leds/battery_r_led/trigger"
+#define LED_BATTERY_RED_BLINKTIMEON		"/sys/class/leds/battery_r_led/delay_on"
+#define LED_BATTERY_RED_BLINKTIMEOFF 	"/sys/class/leds/battery_r_led/delay_off"
+
+#define LED_SMS_GREEN_BRIGHTNESS		"/sys/class/leds/sms_led/brightness"
+#define LED_SMS_GREEN_BLINKSWITCH		"/sys/class/leds/sms_led/trigger"
+#define LED_SMS_GREEN_BLINKTIMEON		"/sys/class/leds/sms_led/delay_on"
+#define LED_SMS_GREEN_BLINKTIMEOFF		"/sys/class/leds/sms_led/delay_off"
+
+#define LED_SMS_BLUE_BRIGHTNESS		    "/sys/class/leds/sms_led/brightness"
+#define LED_SMS_BLUE_BLINKSWITCH		"/sys/class/leds/sms_led/trigger"
+#define LED_SMS_BLUE_BLINKTIMEON		"/sys/class/leds/sms_led/delay_on"
+#define LED_SMS_BLUE_BLINKTIMEOFF		"/sys/class/leds/sms_led/delay_off"
+
+#define LED_LAN_GREEN_BRIGHTNESS		"/sys/class/leds/wifi_led/brightness"
+#define LED_LAN_GREEN_BLINKSWITCH		"/sys/class/leds/wifi_led/trigger"
+#define LED_LAN_GREEN_BLINKTIMEON		"/sys/class/leds/wifi_led/delay_on"
+#define LED_LAN_GREEN_BLINKTIMEOFF		"/sys/class/leds/wifi_led/delay_off"
+
+#define LED_LAN_BLUE_BRIGHTNESS		    "/sys/class/leds/wifi_led/brightness"
+#define LED_LAN_BLUE_BLINKSWITCH		"/sys/class/leds/wifi_led/trigger"
+#define LED_LAN_BLUE_BLINKTIMEON		"/sys/class/leds/wifi_led/delay_on"
+#define LED_LAN_BLUE_BLINKTIMEOFF		"/sys/class/leds/wifi_led/delay_off"
+
+#define LED_VOIP_BLUE_BRIGHTNESS		"/sys/class/leds/sms_led/brightness"
+#define LED_VOIP_BLUE_BLINKSWITCH		"/sys/class/leds/sms_led/trigger"
+#define LED_VOIP_BLUE_BLINKTIMEON		"/sys/class/leds/sms_led/delay_on"
+#define LED_VOIP_BLUE_BLINKTIMEOFF		"/sys/class/leds/sms_led/delay_off"
+
+#define LED_SIGNAL1_BLUE_BRIGHTNESS		"/sys/class/leds/4g_1_led/brightness"
+#define LED_SIGNAL1_BLUE_BLINKSWITCH	"/sys/class/leds/4g_1_led/trigger"
+#define LED_SIGNAL1_BLUE_BLINKTIMEON	"/sys/class/leds/4g_1_led/delay_on"
+#define LED_SIGNAL1_BLUE_BLINKTIMEOFF	"/sys/class/leds/4g_1_led/delay_off"
+
+#define LED_SIGNAL2_BLUE_BRIGHTNESS		"/sys/class/leds/4g_2_led/brightness"
+#define LED_SIGNAL2_BLUE_BLINKSWITCH	"/sys/class/leds/4g_2_led/trigger"
+#define LED_SIGNAL2_BLUE_BLINKTIMEON	"/sys/class/leds/4g_2_led/delay_on"
+#define LED_SIGNAL2_BLUE_BLINKTIMEOFF	"/sys/class/leds/4g_2_led/delay_off"
+
+#define LED_SIGNAL3_BLUE_BRIGHTNESS		"/sys/class/leds/4g_3_led/brightness"
+#define LED_SIGNAL3_BLUE_BLINKSWITCH	"/sys/class/leds/4g_3_led/trigger"
+#define LED_SIGNAL3_BLUE_BLINKTIMEON	"/sys/class/leds/4g_3_led/delay_on"
+#define LED_SIGNAL3_BLUE_BLINKTIMEOFF	"/sys/class/leds/4g_3_led/delay_off"
+
+#define LED_SIGNAL4_BLUE_BRIGHTNESS		"/sys/class/leds/4g_4_led/brightness"
+#define LED_SIGNAL4_BLUE_BLINKSWITCH	"/sys/class/leds/4g_4_led/trigger"
+#define LED_SIGNAL4_BLUE_BLINKTIMEON	"/sys/class/leds/4g_4_led/delay_on"
+#define LED_SIGNAL4_BLUE_BLINKTIMEOFF	"/sys/class/leds/4g_4_led/delay_off"
+
+#define LED_SIGNAL5_BLUE_BRIGHTNESS		"/sys/class/leds/4g_5_led/brightness"
+#define LED_SIGNAL5_BLUE_BLINKSWITCH	"/sys/class/leds/4g_5_led/trigger"
+#define LED_SIGNAL5_BLUE_BLINKTIMEON	"/sys/class/leds/4g_5_led/delay_on"
+#define LED_SIGNAL5_BLUE_BLINKTIMEOFF	"/sys/class/leds/4g_5_led/delay_off"
+
+#define LED_WPS_BLUE_BRIGHTNESS		"/sys/class/leds/wps_led/brightness"
+#define LED_WPS_BLUE_BLINKSWITCH	"/sys/class/leds/wps_led/trigger"
+#define LED_WPS_BLUE_BLINKTIMEON	"/sys/class/leds/wps_led/delay_on"
+#define LED_WPS_BLUE_BLINKTIMEOFF	"/sys/class/leds/wps_led/delay_off"
+
+#define LED_RJ11_BLUE_BRIGHTNESS	"/sys/class/leds/rj11_led/brightness"
+#define LED_RJ11_BLUE_BLINKSWITCH	"/sys/class/leds/rj11_led/trigger"
+#define LED_RJ11_BLUE_BLINKTIMEON	"/sys/class/leds/rj11_led/delay_on"
+#define LED_RJ11_BLUE_BLINKTIMEOFF	"/sys/class/leds/rj11_led/delay_off"
+
+
+#define LED_BLINKON_STATE               "timer"
+#define LED_BLINKOFF_STATE              "none"
+
+
+//¸ºÔØÂ·¾¶ÅäÖÃ
+#define BOOST_LOAD_STATUS_PATH			"/sys/class/power_supply/boost/online"
+
+//µçѹÁÙ½çÖµ
+
+//zdm ¶ÔÓÚÏÂÃæ¼¸¸öºêÖµ£¬Ôݲ»½øÐÐÆ½Ì¨»¯£¬ºóÆÚÒ»µ©ÓÐÐèÇó½øÐÐÐ޸ģ¬ÔòÖ±½ÓÌá³Énv½øÐпØÖÆ
+#define POWEROFFLEVEL           		3300        //µÍÓڴ˵çѹֵ×Ô¶¯¹Ø»ú
+#define POWERONLEVEL           			3400       //µÍÓڴ˵çѹֵ²»ÄÜ¿ª»ú
+#define DISCHARGELEVEL					3600		//µÍÓڴ˵çѹֵ·ÅµçµçÁ÷ÉèΪ0.5A
+#define CHARGINGLEVEL					3800		//¸ßÓڴ˵çѹֵ·ÅµçµçÁ÷ÉèΪ1.5A
+
+#define CHECK_POWER_TIME_INTERVAL      	20000
+#define GET_TEMP_INTERVAL_TIME		    20000//ms
+
+//WIFIÐÅÏ¢¶¨Òå
+#define WIFI_STATE_PATH				"/etc_rw/wifiStatus"
+#define WPS_STATE_PATH				"/etc_rw/wpsStatus"
+#define WPS_STATEEX_PATH			"/etc_rw/wpsdisplayStatus"
+#define QRCODE_STATE_PATH			"/etc_rw/qrStatus"
+#define WIFI_STATION_PATH			"/etc_rw/staStatus"
+#define WIFI_DATA_VA0		        "wlan0-va0"
+#define WIFI_DATA_VA1		        "wlan0-va1"
+#define WIFI_TXBYTE		            0//·¢ËÍÊý¾Ý
+#define WIFI_RXBYTE		            2//½ÓÊÕÊý¾Ý
+#define WIFICODE_MAIN_PATH          "/etc_rw/wifi/ssid_wifikey.bmp"
+#define WIFICODE_GUST1_PATH         "/etc_rw/wifi/multi_ssid_wifikey.bmp"
+
+
+
+/*******************************************************************************
+ÓïÒôÌáʾָʾµÆ×´Ì¬¶¨Òå
+*******************************************************************************/
+#define VOIP_IN_CALL                "ledon"
+#define VOIP_IN_CONNECTION          "ledblink"
+#define VOIP_HANG_UP                "ledoff"
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_common.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_common.h
new file mode 100755
index 0000000..3e12d77
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_common.h
@@ -0,0 +1,1272 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_led.h
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMIÍ·Îļþ
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+#include <pthread.h>
+#include <semaphore.h>
+#include <time.h>
+#include <sys/prctl.h>
+#include "softap_api.h"
+#include "soft_timer.h"
+#include "mmi_cfg.h"
+
+#ifndef DISABLE_LCD
+#include "os_type.h"
+#include "gui_common.h"
+#endif
+
+#include "cfg_api.h"
+#include "cfg_nv_def.h"
+
+#ifndef __MMI_COMMON_H
+#define __MMI_COMMON_H
+#define MMI_SOFTTIMER_DEBUG     1
+/*******************************************************************************
+  ¸÷Ä£¿é¶¨ÒåµÄNV ͳһ»ã×Ü
+*******************************************************************************/
+#define MMI_BAT_VOLTAGE_LEN				21
+
+/*******************************************************************************
+  MMI ¹«¹²×Ö·û´®Í³Ò»¶¨Òå
+*******************************************************************************/
+#define INVALID_STR ""
+
+/*******************************************************************************
+  MMI ·µ»ØÖµ¶¨Òå
+*******************************************************************************/
+#define MMI_SUCCESS						0x0
+#define MMI_ERROR						-1
+
+#define MMI_WAIT_FOREVER 				0XFFFFFFFF
+#define MMI_THREAD_INVALID_ID  			0XFFFFFFFF
+#define MMI_SEMA_INVALID_ID  			0xFFFFFFFF
+#define MMI_MUTEX_INVALID_ID            0xFFFFFFFF
+
+
+/*******************************************************************************
+  MMI LOG¿ª¹Ø¡¢´æ´¢Â·¾¶¡¢³¤¶È
+*******************************************************************************/
+#define MMI_FILE_DEBUG 				0
+#define MMI_SERIAL_DEBUG 			1
+#define MMI_DEBUG 					1
+
+#define MMI_LOG_FILE_PATH         "/etc_rw/config/mmi.log"
+#define MMI_LOG_OLD_FILE_PATH     "/etc_rw/config/oldmmi.log"
+
+#define MMI_MAX_PRINT_LEN	      256
+#define MMI_MAX_LOG_LENGTH 	      524288
+
+/*******************************************************************************
+  MMI ʹÓÃÉ豸Ãû³Æ
+*******************************************************************************/
+
+#define  KPD_DEV    					"kpd"
+#define  RTC_DEV    					"rtc"
+#define  LED_DEV    			  		"led"
+#define  CHG_DEV                        "charger"
+
+#define LCD_PATH 						"/dev/fb0"
+#define LCD_MAGIC 						 'L'
+#define LEADT15DS26_SET_BACKLIGHT		_IOW(LCD_MAGIC, 2, unsigned int)
+
+
+/*******************************************************************************
+ MMI ¶¨Ê±Æ÷¶¨Òå
+*******************************************************************************/
+#define SET_BACKLIGHT_HALFBRIGHT_TIMER	80
+#define SET_TIME_CHECK_TIMER			81
+#define SET_WIFI_STANUM_CHECK_TIMER		82
+#define SET_WPS_TIP_CHECK_TIMER         83
+#define SET_TIP_CHECK_TIMER				84
+#define SET_MMI_IDLE_TIMER				85
+#define SET_SSID_SHOW_TIMER				86
+#define SET_SMS_TIP_TIMER				87
+#define SET_TRAFFIC_INFO_WAIT_TIMER     88
+#define SET_MMI_FAST_POWERON_IDLE_TIMER	89
+#define SET_WIFI_DATA_CHECK_TIMER	    90
+
+
+#define SET_TIME_CHECK_TIME         	1000
+#define SET_WIFI_STANUM_CHECK_TIME      3000
+#define SET_WPS_TIP_CHECK_TIME         	2000
+#define SET_TIP_CHECK_TIME         		1000
+#define SET_MMI_IDLE_TIME				20000
+#define SET_BACKLIGHT_HALFBRIGHT_TIME	5000
+#define SET_SSID_SHOW_TIME				20000
+#define SET_SMS_TIP_TIME				10000
+#define SET_TRAFFIC_INFO_WAIT_TIME      10000
+#define SET_MMI_FAST_POWERON_IDLE_TIME	4000
+#define SET_WIFI_DATA_CHECK_TIME	    3000
+
+/*******************************************************************************
+MMI ³äµçÒµÎñÅäÖÃ
+*******************************************************************************/
+#define CHARGE_STATUS_PATH			  	"/sys/class/power_supply/charger/status"
+#define CHARGING_TYPE_PATH				"/sys/class/power_supply/charger/pc1_ac2"
+#define USB_INSERT_STATUS_PATH			"/sys/class/power_supply/charger/online"
+#define CHARGE_VOLTAGE_PATH				"/sys/class/power_supply/battery/voltage_now"
+#define CHARGE_BAT_TEMP_PATH 			"/sys/class/power_supply/battery/temp"
+#define CHARGE_BAT_HEALTH_PATH 			"/sys/class/power_supply/battery/health"
+
+#define MMI_SET_FAKEPOWEROFF_CHARGER    "echo 1 > /sys/class/power_supply/charger/quick_power_on"
+#define MMI_CAN_FAKEPOWEROFF_CHARGER    "echo 0 > /sys/class/power_supply/charger/quick_power_on"
+
+#define MMI_TURN_OFF_CHG_FULL  		    "echo 2 > /sys/class/power_supply/charger/charge_enabled"
+#define MMI_TURN_OFF_CHG  		        "echo 0 > /sys/class/power_supply/charger/charge_enabled"
+#define MMI_TURN_ON_CHG	  		        "echo 1 > /sys/class/power_supply/charger/charge_enabled"
+
+#define MMI_TURN_OFF_DISCHG  	        "echo 0 > /sys/class/power_supply/boost/boost_enabled"
+#define MMI_TURN_ON_DISCHG	  	        "echo 1 > /sys/class/power_supply/boost/boost_enabled"
+
+#define MMI_DISCHG_LOW_CURRENT  	    "echo 5 > /sys/class/power_supply/boost/current_now"
+#define MMI_DISCHG_HIGH_CURRENT	        "echo 15 > /sys/class/power_supply/boost/current_now"
+
+#define CHARGE_STATUS_CHARGING		 	"Charging"
+#define CHARGE_STATUS_FULL		 	 	"Full"
+#define CHARGE_STATUS_NOTCHARGING		"Not charging"
+#define CHARGE_STATUS_DISCHARGING		"Discharging"
+
+#define CHARGING_TYPE_PC				"USB"
+#define CHARGING_TYPE_ADAPTER			"Mains"
+#define CHARGING_TYPE_UNKNOWN			"Unknown"
+
+#define TEMP_STATUS_GOOD				"Good"
+#define TEMP_STATUS_OVERHEAT			"Overheat"
+#define TEMP_STATUS_DEAD				"Dead"
+#define TEMP_STATUS_OVER_VOLTAGE		"Over voltage"
+#define TEMP_STATUS_FAIL				"Unspecified failure"
+#define TEMP_STATUS_COLD				"Cold"
+#define TEMP_STATUS_WARM				"Warm"
+#define TEMP_STATUS_COOL				"Cool"
+#define TEMP_STATUS_UNKNOWN			    "Unknown"
+
+#define USB_STATUS_IN					"1"
+#define USB_STATUS_OUT					"0"
+
+#define CHARGE_STATUS_LENGTH				16
+#define CHARGING_TYPE_LENGTH				8
+#define CHARGE_VOLTAGE_LENGTH				8
+
+#define CHARGE_STATUS_CHARGING_LENGTH		8
+#define CHARGE_STATUS_FULL_LENGTH		 	4
+#define CHARGE_STATUS_NOTCHARGING_LENGTH	12
+#define CHARGE_STATUS_DISCHARGING_LENGTH	11
+
+/*******************************************************************************
+ MMI ÈÎÎñ¶¨Òå
+*******************************************************************************/
+
+
+typedef enum {
+	MMI_TASK_CTRL = 0,//¿ª»ú±ØÐëʱµÚһλ£¬È·±£¿ª»ú¶¯»­ÏÈ»æÖÆ
+	MMI_TASK_BATTERY,
+	MMI_TASK_NET,
+	MMI_TASK_WIFI,
+	MMI_TASK_SMS,
+	MMI_TASK_VOIP,
+	MMI_TASK_TRAFFIC,
+	MMI_TASK_POWEROFF_CHARGER,
+	MMI_TASK_TIP_NET_CONNECT,
+	MMI_TASK_TIP_WIFISTATION,
+	MMI_TASK_TIP_WPS,
+	MMI_TASK_TIP,
+	MMI_TASK_SSID,
+	MMI_TASK_TIP_FOTA,
+	MMI_TASK_POWER,
+	MMI_TASK_WIFICODE,
+	MMI_TASK_NETSIGNAL, //yaoyuan cpe
+	MMI_TASK_LED_WPS, //yaoyuan cpe MMI_TASK_TIP_WPS
+	MMI_TASK_RJ11, //yaoyuan cpe
+	MMI_TASK_TIME,
+	MMI_TASK_KEY,
+	MMI_TASK_USB_MODE,
+	MMI_TASK_MAX
+} E_zMmi_Task;
+
+#define MMI_TASK_INVALID  -1
+//¶¨Ò庯ÊýÖ¸ÕëÀàÐÍ
+typedef SINT32(*MMI_TASK_REGISTER_FUNC)(void);
+typedef void (*MMI_TASK_INIT_FUNC)(void);
+
+/*******************************************************************************
+ MMI ÏÔʾģʽ¶¨Òå
+*******************************************************************************/
+typedef enum {
+	MMI_MODE_LED = 1,
+	MMI_MODE_LCD,
+	MMI_MODE_ALL
+} E_zMmiShowMode;
+
+
+/*******************************************************************************
+ MMI ÏûÏ¢¶¨Òå
+*******************************************************************************/
+
+#define NV_CONTENT_LEN 						1024
+
+
+/*******************************************************************************
+  LEDµÆÊ¡µçÏà¹Ø¶¨Òå
+*******************************************************************************/
+typedef enum {
+	//public
+	MMI_ACTIVE_MODE = 0,
+	MMI_IDLE_LEDOFF_MODE,
+	MMI_IDLE_CHG_LEDOFF_MODE,
+	MMI_IDLE_STANDBY_LEDOFF_MODE,
+	MMI_FAKE_POWEROFF_MODE,
+	MMI_FAKE_POWEROFF_CHARGE_MODE,
+
+	//LED
+	MMI_ALL_LED_ON_MODE,
+	MMI_ALL_LED_OFF_MODE,
+	MMI_POWEROFF_ON_MODE,
+	MMI_POWEROFF_OFF_MODE,
+
+
+	//LCD
+	MMI_BACKLIGHT_OFF_MODE,
+	MMI_BACKLIGHT_HALFBRIGHT_MODE,
+	MMI_POWERON_MODE,
+	MMI_POWEROFF_MODE,
+	MMI_RESET_MODE,
+	MMI_RESTART_MODE,
+	MMI_FAST_POWERON_MODE,
+} E_zMmi_Work_Mode;
+
+/*
+¿ØÖÆÐÅÏ¢½á¹¹
+*/
+typedef struct {
+	E_zMmi_Work_Mode lcdmode;
+	E_zMmi_Work_Mode ledmode;
+} T_zMMICtrlInfo;
+
+#define MMI_MAIN_LOCK_ID				"mmi_main_lock"
+#define MMI_POWEROFF_LOCK_ID			"mmi_powerdown_lock"//¹Ø»ú¡¢»Ö¸´³ö³§ÉèÖá¢ÖØÆô¡¢¹Ø»ú³äµç¿ª»ú
+#define MMI_GET_POWER_LOCK_ID			"mmi_get_power_lock"//20Sζȼì²â/µÍµç¼ì²â
+#define MMI_POWEROFF_LOCK_LCD_ID		"mmi_poweroff_charger_lock"//³õʼ»¯¡¢°´¼ü--  --ÃðÆÁ
+
+
+/*******************************************************************************
+  LCDÌáʾ¶¨Òå ÍøÂçÁ¬½Ó¡¢SIM¿¨×´Ì¬µÈ
+*******************************************************************************/
+typedef enum {
+	INSERT_SIM = 0,
+	PIN_LOCK,
+	PUK_LOCK,
+	SIM_BUSY,
+	INVALID_SIM,
+	SIM_LOCK,
+	SIM_READY,
+
+	SIM_MAX
+}
+E_zMmi_Sim_Tip;
+
+typedef enum {
+	NET_DISCONNECTED = 0,
+	NET_CONNECTED,
+	NET_CONNECTING,
+	NET_DISCONNECTING,
+	NET_NOSERVICE,
+	NET_LIMITSERVICE,
+	NET_SEARCHING,
+	NET_MAX
+} E_zMmi_NetCon_Tip;
+
+typedef enum {
+	WPS_ACTIVING = 0,
+	WPS_ACTIVED,
+	WPS_DEACTIVING,
+	WPS_DEACTIVED,
+	WPS_FAIL,
+	WPS_ACTIVE_MAX
+} E_zMmi_WpsAct_Tip;
+
+
+typedef struct {
+	E_zMmi_Sim_Tip sim_tip;
+	E_zMmi_NetCon_Tip net_tip;
+	CHAR* net_pro;
+	//CHAR* update_result;//zk add for fota update result
+	//SINT32 update_tip;
+} T_zMMITipInfo;
+
+typedef enum {
+	FOTA_DOWNLOADING = 0,
+	FOTA_DOWNLOAD_FAILED,
+	FOTA_DOWNLOAD_OK,
+	FOTA_DOWNLOAD_LOWBATTERY,
+	FOTA_UPDATE_SUCCESS,
+	FOTA_UPDATE_FAILED,
+	FOTA_SHOW_FINISH,
+	FOTA_MAX
+} E_zMMI_Fota_Tip;
+
+typedef enum {
+	FOTA_UPDATE = 0,
+	FOTA_CANCEL
+} E_zMmi_Fota_Oper;
+
+typedef struct {
+	SINT32 fota_update;
+	E_zMMI_Fota_Tip fota_tip;
+	E_zMmi_Fota_Oper fota_oper;
+} T_zMMIFotaInfo;
+
+typedef struct {
+	CHAR *ssid;
+	CHAR *wifi_key;
+	CHAR *ssid2;
+	CHAR *wifi_key2;
+} T_zMMISSIDInfo;
+
+typedef struct {
+	CHAR *msisdn;
+	CHAR *pci;
+	CHAR *rapr_dBm;
+	CHAR *sinr_dB;
+} T_zMMINetSignalInfo;
+
+/*
+ʱ¼äÐÅÏ¢½á¹¹
+*/
+typedef struct {
+	BOOL mode;//ʱ¼äÖÆÊ½ true--24Ð¡Ê±ÖÆ false--12Ð¡Ê±ÖÆ
+	CHAR* hour;
+	CHAR* minute;
+	//CHAR* quota;
+} T_zMMITimeInfo;
+
+/*******************************************************************************
+µç³ØÐÅÏ¢¶¨Òå
+*******************************************************************************/
+//webui³äµç״̬NV
+#define WEBUICHARGESTATTUS      		"battery_charging"        					///1:³äµç״̬ 0:·Ç³äµç״̬
+#define WEBUICHARGING           		"1"
+#define WEBUIUNCHARGING        			"0"
+
+//webuiµÄµç³Ø¸ñÊýNV
+#define WEBUIBATTERYLEVEL       		"battery_pers"
+#define WEBUINOLEVEL            		"0"
+#define WEBUIONELEVEL           		"1"
+#define WEBUITWOLEVEL           		"2"
+#define WEBUITHRLEVEL           		"3"
+#define WEBUIFOURLEVEL         	 		"4"
+#define WEBUIFULLLEVEL         	 		"100"
+
+//wifi Monitorµç³Ø°Ù·Ö±È
+#define BATTERYPERS_NV					"battery_vol_percent"
+
+typedef enum {
+	STATE_FULL = 0,
+	STATE_CHARGING,
+	STATE_DISCHARGE,
+	STATE_CHARGERROR,
+	STATE_CHARGE_MAX
+} E_zMmi_Charge_State;
+
+typedef enum {
+	CHARGING_PC = 0,
+	CHARGING_ADAPTER,
+	CHARGING_TYPE_MAX,
+} E_zMmi_Charge_Type;
+
+typedef enum {
+	VOLT_5PERCENTLEVEL = 0,
+	VOLT_10PERCENTLEVEL,
+	VOLT_20PERCENTLEVEL,
+	VOLT_25PERCENTLEVEL,
+	VOLT_50PERCENTLEVEL,
+	VOLT_75PERCENTLEVEL,
+	VOLT_NORMALLEVEL,
+	VOLT_MAX,
+} E_zMmi_Voltage_level;
+
+typedef struct {
+	CHAR* devString;
+	E_zMmi_Charge_State chg_sta;
+} T_zMmiChgStateStringItem;
+
+
+typedef enum {
+	MODE_STANDBY = 0,
+	MODE_CHARGING,
+	MODE_LOWBATTERY_20,
+	MODE_LOWBATTERY_10,
+	MODE_OFF
+} E_zMMI_BatLed_Mode;
+
+/*µç³ØÐÅÏ¢½á¹¹*/
+typedef struct {
+	E_zMmi_Charge_State chg_state;
+	E_zMmi_Voltage_level bat_level;
+	SINT32 bat_pers;
+	SINT32 bat_grid;
+} T_zMMIBatteryInfo;
+
+
+//ζȼì²â
+typedef enum {
+	MMI_TEMP_DETECT_ERROR = 0,
+	MMI_TEMP_DETECT_ABNORMAL,
+	MMI_TEMP_DETECT_NORMAL,
+	MMI_TEMP_DETECT_MAX
+} MMI_TEMP_DETECT;
+
+//¹Ø»ú³äµç
+typedef enum {
+	POC_STATE_CHARGING = 0,
+	POC_STATE_FULL,
+	POC_STATE_LOWBATTERY,
+	POC_STATE_NOBATTERY,
+	POC_STATE_TEMP_ERROR,
+	POC_STATE_MAX
+} E_zMmi_Poc_State;
+
+typedef enum {
+	POC_CHARGING_PC = 0,
+	POC_CHARGING_ADAPTER,
+	POC_CHARGING_TYPE_MAX
+} E_zMmi_Poc_Type;
+
+typedef struct {
+	SINT32 backlight_sta;
+	E_zMmi_Poc_State poc_sta;
+	BOOL overvoltage_mode;
+} T_zMmi_Poc_Info;
+
+/*******************************************************************************
+  ÍøÂçÐÅÏ¢¶¨Òå
+*******************************************************************************/
+typedef enum {
+	NET_MODE_DEFAULT = 0,
+	NET_MODE_2G,
+	NET_MODE_3G,
+	NET_MODE_4G,
+	NET_MODE_NOSERVICE,
+	NET_MODE_LIMITSERVICE,
+	NET_MODE_NOTREADY //yaoyuan
+} E_zMmi_Net_Mode;
+
+typedef enum {
+	NET_STATE_DISCONNECTED = 0,
+	NET_STATE_CONNECTED,
+	NET_STATE_CONNECTING,
+	NET_STATE_DISCONNECTING,
+	NET_STATE_NOSERVICE,
+	NET_STATE_LIMITSERVICE,
+	NET_STATE_SEARCHING,
+	NET_STATE_MAX
+} E_zMmi_Net_State;
+
+typedef enum {
+	NET_SIGNAL_DEFAULT = 0,
+	NET_SIGNAL_NORMAL,
+	NET_SIGNAL_WEAK
+} E_zMmi_Net_Signal;
+
+typedef enum {
+	NET_SOCKET_INACTIVE = 0,
+	NET_SOCKET_ACTIVE
+} E_zMmi_Net_Socket;
+
+
+/*ÍøÂçÐÅÏ¢½á¹¹*/
+
+typedef struct {
+	E_zMmi_Net_Mode net_mode;
+	E_zMmi_Net_State connect_status;
+	SINT32 signal_num;
+	SINT32 signal_weak;
+	SINT32 roam_mode;
+	E_zMmi_Net_Socket socket_state;
+} T_zMMINetInfo;
+
+
+#define WD_NUM 						    5    //wifi ¼à¿ØÎļþ¸öÊý
+#define WIFI_TURN_ON 					"1"  //wifi operate type
+#define WIFI_TURN_OFF 					"0"  //wifi operate type
+#define WIFI_TURN_OFF_FAKE_POWEROFF		"2"  //wifi operate type
+
+
+struct st_files {
+	char *filename;
+	int wd;
+};
+
+typedef struct {
+	BOOL wifiState;
+	BOOL wpsState;
+	BOOL mIsConnectUser;
+} T_zMmi_LanLed_Info;
+
+typedef enum {
+	WIFI_OFF = 0,
+	WIFI_ON
+} E_zMmi_Wifi_State;
+
+typedef enum {
+	WPS_OFF = 0,
+	WPS_ON
+} E_zMmi_Wps_State;
+
+typedef enum {
+	NO_USER_CONNECTED = 0,
+	USER_CONNECTED
+} E_zMmi_Wifi_ConState;
+typedef enum {
+	WIFISTATION_OFF = 0,
+	WIFISTATION_ON
+} E_zMmi_WifiStation_State;
+typedef enum {
+	WIFICODE_MAIN = 0,
+	WIFICODE_GUST1
+} E_zMmi_WifiCode_State;
+
+
+/*
+wifiÐÅÏ¢½á¹¹
+*/
+typedef struct {
+	BOOL wifi_state;
+	BOOL wifidata_state;
+	SINT32 Isconnected_user;
+	SINT32 connected_userNum;
+	E_zMmi_WpsAct_Tip wps_state;
+} T_zMMIWifiInfo;
+/*
+wifistationÐÅÏ¢½á¹¹
+*/
+typedef struct {
+	BOOL wifistation_connect_state;
+	SINT32 signal_num;
+	CHAR *wifista_ssid;
+} T_zMMIWifiStationInfo;
+/*
+wificodeÐÅÏ¢½á¹¹
+*/
+typedef struct {
+	BOOL multi_ssid_switch;
+	BOOL is_wificode_exist;
+} T_zMMIWifiCodeInfo;
+
+/*******************************************************************************
+ Á÷Á¿ÐÅÏ¢¶¨Òå
+*******************************************************************************/
+typedef enum {
+	TRAFFIC_UNIT_DATA = 0,
+	TRAFFIC_UNIT_TIME,
+
+	TRAFFIC_UNIT_MAX
+} MMI_TRAFFIC_UNIT;
+
+typedef enum {
+	TRAFFIC_LIMIT_SWITCH_OFF = 0,
+	TRAFFIC_LIMIT_SWITCH_ON,
+} MMI_TRAFFIC_SWITCH;
+
+typedef enum {
+	TRAFFIC_DATA_UNIT_MAX = 0,
+	TRAFFIC_DATA_UNIT_MB,
+	TRAFFIC_DATA_UNIT_GB,
+	TRAFFIC_DATA_UNIT_TB
+} E_ZMmi_Traffic_Data_Unit;
+
+typedef enum {
+	TRAFFIC_LED_1 = 0,
+	TRAFFIC_LED_2,
+	TRAFFIC_LED_3,
+	TRAFFIC_LED_4,
+	TRAFFIC_LED_5,
+	TRAFFIC_LED_6,
+	TRAFFIC_LED_7,
+	TRAFFIC_LED_8,
+	TRAFFIC_LED_9,
+	TRAFFIC_LED_10,
+	TRAFFIC_LED_MAX
+} MMI_TRAFFIC_LED;
+
+/*
+trafficÐÅÏ¢½á¹¹
+*/
+typedef struct {
+	MMI_TRAFFIC_SWITCH traffic_switch;
+	MMI_TRAFFIC_UNIT traffic_unit;
+	E_ZMmi_Traffic_Data_Unit data_unit;
+	E_ZMmi_Traffic_Data_Unit useddata_unit;
+	MMI_TRAFFIC_LED led_status;
+	SINT32 warning_tip_flag ;
+	UINT32 warning_tip_level;
+	float total_traffic;
+	float uesd_traffic;
+} T_zMMITrafficInfo;
+/*
+ÒÆ¶¯ÔËÓªÉÌtrafficÐÅÏ¢½á¹¹
+*/
+typedef struct {
+	BOOL main_used_valid;//˵Ã÷main usedÊý¾ÝÊÇ·ñÓÐЧ
+	SINT32 main_left_traffic;
+	SINT32 main_total_traffic;
+	//BOOL bonus_used_valid;//˵Ã÷bonus usedÊý¾ÝÊÇ·ñÓÐЧ
+	//FLOAT bonus_uesd_traffic;
+	//FLOAT bonus_total_traffic;
+} T_zMMIQuotaTrafficInfo;
+
+
+/*******************************************************************************
+ ¶ÌÐÅÐÅÏ¢Ïà¹Ø¶¨Òå
+*******************************************************************************/
+typedef enum {
+	SMS_RECVBOX_STATUS_UNREAD = 0,
+	SMS_RECVBOX_STATUS_NEW,
+	SMS_RECVBOX_STATUS_FULL,
+	SMS_RECVBOX_STATUS_NOR
+} E_zMmi_Sms_Recvbox_Status;
+
+typedef struct {
+	SINT32 mSmsNum;
+	E_zMmi_Sms_Recvbox_Status recvBox_sta;
+} T_zMmi_Sms_Info;
+
+/*******************************************************************************
+ ÓïÒôÌáʾÐÅÏ¢Ïà¹Ø¶¨Òå
+*******************************************************************************/
+typedef enum {
+	VOIP_STATUS_IN_CALL = 0,
+	VOIP_STATUS_IN_CONNECTION,
+	VOIP_STATUS_HANG_UP,
+	VOIP_STATUS_NOR
+} E_zMmi_Voip_Status;
+
+typedef struct {
+	E_zMmi_Voip_Status voip_sta;
+} T_zMmi_Voip_Info;
+
+/*******************************************************************************
+ rj11²å°ÎÐÅÏ¢Ïà¹Ø¶¨Òå
+*******************************************************************************/
+typedef enum {
+	RJ11_STATUS_OUT = 0,
+	RJ11_STATUS_IN,
+	RJ11_STATUS_NOR
+} E_zMmi_Rj11_Status;
+
+typedef struct {
+	E_zMmi_Rj11_Status rj11_sta;
+} T_zMmi_Rj11_Info;
+
+/*******************************************************************************
+  LEDµÆ¹«¹²¶¨Òå
+*******************************************************************************/
+
+typedef enum {
+	LED_STATE_ON = 0,
+	LED_STATE_OFF,
+	LED_STATE_BLINK,
+	LED_STATE_MAX
+} MMI_LED_STATE;
+
+typedef enum {
+	LED_STATE_DEFAULT_BLINK,
+	LED_STATE_FAST_BLINK,
+	LED_STATE_SLOW_BLINK,
+	LED_STATE_BAT_BLINK,
+	LED_STATE_SMS_BLINK,
+	LED_STATE_VOIP_BLINK,
+	LED_STATE_LAN_BLINK,
+	LED_STATE_WAN_BLINK,
+	LED_STATE_WAN_FAST_BLINK,
+	LED_STATE_WAN_SLOW_BLINK,
+	LED_STATE_WAN_CPE_FAST_BLINK,
+	LED_STATE_WAN_CPE_SLOW_BLINK
+} MMI_LED_BLINK_SPEED;
+
+
+typedef enum {
+	LED_WAN = 0,
+	LED_LAN,
+	LED_BATTERY,
+	LED_SMS,
+	LED_VOIP,
+	LED_TRAFFIC,
+	LED_SIGNAL,
+	LED_WPS,
+	LED_RJ11,
+	LED_ALL
+} MMI_LED_NAME;
+
+typedef enum {
+	LED_COLOR_RED = 0,
+	LED_COLOR_GREEN,
+	LED_COLOR_YELLOW,
+	LED_COLOR_BLUE,
+
+	MAX_LED_COLOR //kw 3
+} MMI_LED_COLOR;
+
+typedef struct {
+	UINT32 uBlinkOnTime;
+	UINT32 uBlinkOffTime;
+} T_zMmi_Led_Blink_Time;
+
+typedef struct {
+	MMI_LED_NAME led_name;
+	MMI_LED_STATE led_state;
+	MMI_LED_BLINK_SPEED ledBlink_speed;
+	T_zMmi_Led_Blink_Time ledBlink_time;
+	MMI_LED_COLOR led_color;
+	MMI_TRAFFIC_LED traffic;
+} T_zMmi_Led_Info;
+
+typedef struct {
+	char *fileblinkSwitch;
+	char *fileblinktimeon;
+	char *fileblinktimeoff;
+	char *timeon;
+	char *timoff;
+} T_zMmi_LedBlink_Info;
+
+typedef enum {
+	LED_RED_ON,
+	LED_RED_BLINK,
+
+	LED_GREEN_ON,
+	LED_GREEN_BLINK,
+
+	LED_YELLOW_ON,
+	LED_YELLOW_BLINK,
+
+	LED_BLUE_ON,
+	LED_BLUE_BLINK,
+
+	LED_BLUE1_ON,
+	LED_BLUE2_ON,
+	LED_BLUE3_ON,
+	LED_BLUE4_ON,
+	LED_BLUE5_ON,
+
+	LED_ALL_OFF,
+} MMI_LED_LASTSTATE;
+
+/**************************LED ÅäÖñí½á¹¹Ìå*****************************************************/
+
+typedef struct {
+	T_zMmi_Sms_Info sms_info;
+	T_zMmi_Led_Info led_info;
+} T_zMmiSmsLedConfig;
+
+typedef struct {
+	T_zMmi_Voip_Info voip_info;
+	T_zMmi_Led_Info led_info;
+} T_zMmiVoipLedConfig;
+
+typedef struct {
+	T_zMmi_Rj11_Info rj11_info;
+	T_zMmi_Led_Info led_info;
+} T_zMmiRj11LedConfig;
+
+
+typedef struct {
+	int custom_type;
+	T_zMMINetInfo net_info;
+	T_zMmi_Led_Info led_info;
+} T_zMmiNetLedConfig;
+
+typedef struct {
+	T_zMMIBatteryInfo bat_info;
+	T_zMmi_Led_Info led_info;
+} T_zMmiBatteryLedConfig;
+
+typedef struct {
+	int custom_type;
+	T_zMMIWifiInfo wifi_info;
+	T_zMmi_Led_Info led_info;
+} T_zMmiWifiLedConfig;
+
+
+/*******************************************************************************
+ °´¼üÏà¹Ø¶¨Òå
+*******************************************************************************/
+//#define KPD_PATH 						"/dev/event0"
+//cap
+#define KPD_PATH                        "/dev/input/event0"
+
+#define KEY_POWER_CODE              116
+#define KEY_WPS_CODE                117
+#define KEY_RESET_CODE              118
+#define KEY_WIFI_CODE               119 //ҢԶcpe
+
+
+
+typedef enum {
+	KEY_STATUS_MAX = 0,				/*ÎÞЧ״̬*/
+	KEY_STATUS_UP,                  /*°´¼üËÉ¿ª*/
+	KEY_STATUS_DOWN,                /*°´¼ü°´ÏÂ*/
+	KEY_STATUS_LONGPRESS,            /*°´¼ü³¤°´*/
+} KEY_STATUS;
+
+typedef enum {
+	KEY_TYPE_POWER = 0,					/*power ¼ü*/
+	KEY_TYPE_RESET, 					/*reset ¼ü*/
+	KEY_TYPE_WPS,				        /*wps ¼ü*/
+	KEY_TYPE_WIFI,				        /*wifi ¼ü, ¿ª¹Ø Ò¢Ô¶cpe*/
+} KEY_TYPE;
+
+typedef struct {
+	KEY_TYPE    type;               /*°´¼üÀàÐÍ*/
+	KEY_STATUS  status;             /*°´¼ü״̬*/
+} MMI_KP_INFO;
+
+
+/*******************************************************************************
+ ¿ò¼ÜÏà¹Ø¶¨Òå
+*******************************************************************************/
+
+
+/*»ñȡҵÎñÐÅÏ¢º¯ÊýÖ¸Õë
+appInfo:³ö²Î£¬ÒµÎñÐÅÏ¢£¬Èç¹ûÊÇÊý¾Ý½á¹¹Ôò¸ÃÖµÖ¸ÏòÊý¾Ý½á¹¹µØÖ·
+·µ»ØÕýÈ·»ò´íÎó
+*/
+typedef SINT32(*MMI_GET_TASKINFO_FUNC)(UINT32 taskInfo);
+
+/*»ñÈ¡ledÏÔʾÐÅÏ¢º¯ÊýÖ¸Õë
+appInfo:Èë²Î£¬ÒµÎñÐÅÏ¢£¬Èç¹ûÊÇÊý¾Ý½á¹¹Ôò¸ÃÖµÖ¸ÏòÊý¾Ý½á¹¹µØÖ·
+outLedInfo:³ö²Î£¬ledÏÔʾÐÅÏ¢
+·µ»ØÕýÈ·»ò´íÎó
+*/
+typedef SINT32(*MMI_GET_LEDINFO_FUNC)(UINT32 taskInfo, UINT32 outLedInfo);
+
+/*»ñÈ¡lcdÏÔʾÐÅÏ¢º¯ÊýÖ¸Õë
+appInfo:Èë²Î£¬ÒµÎñÐÅÏ¢£¬Èç¹ûÊÇÊý¾Ý½á¹¹Ôò¸ÃÖµÖ¸ÏòÊý¾Ý½á¹¹µØÖ·
+outLcdInfo:³ö²Î£¬lcdÏÔʾÐÅÏ¢
+·µ»ØÕýÈ·»ò´íÎó
+*/
+typedef SINT32(*MMI_GET_LCDINFO_FUNC)(UINT32 taskInfo);
+/*ÏÔʾLED
+ledInfo:Èë²Î£¬ÒµÎñÐÅÏ¢£¬Èç¹ûÊÇÊý¾Ý½á¹¹Ôò¸ÃÖµÖ¸ÏòÊý¾Ý½á¹¹µØÖ·
+·µ»ØÕýÈ·»ò´íÎó
+*/
+typedef SINT32(*MMI_SHOW_LED_FUNC)(UINT32 ledInfo);
+/*ÏÔʾLCD
+lcdInfo:Èë²Î£¬ÒµÎñÐÅÏ¢£¬Èç¹ûÊÇÊý¾Ý½á¹¹Ôò¸ÃÖµÖ¸ÏòÊý¾Ý½á¹¹µØÖ·
+·µ»ØÕýÈ·»ò´íÎó
+*/
+typedef SINT32(*MMI_SHOW_LCD_FUNC)(UINT32 lcdInfo);
+
+/*¸Ã½á¹¹ÌåÓÃÓÚ±£´æÃ¿¸öÒµÎñµÄÊÊÅä²ãÌṩº¯ÊýÐÅÏ¢*/
+typedef struct {
+	E_zMmi_Task task;//ÒµÎñ
+	SINT32 is_update;//ÊÇ·ñÓиüÐÂ
+	//SINT32 show_mode;//led,1;lcd,2;lcd+lcd,3
+	VOID* taskinfo;
+	VOID* ledinfo;
+	MMI_GET_TASKINFO_FUNC   get_taskinfo_fun;
+	MMI_GET_LEDINFO_FUNC get_ledinfo_fun;
+	MMI_GET_LCDINFO_FUNC get_lcdinfo_fun;
+} T_zMMITaskInfoItem;
+
+//lcd ÏÔʾҳ
+typedef enum {
+	MMI_SHOW_PAGE_FIRST = 0,//traffic
+	MMI_SHOW_PAGE_SECOND, //SSID WIFI KEY; IMEI MSISDN
+	MMI_SHOW_PAGE_THIRD,//CODE
+	MMI_SHOW_PAGE_FOUR,//SSID2 WIFI KEY
+	MMI_SHOW_PAGE_FIVE,//CODE2
+	MMI_SHOW_PAGE_MAX
+} E_zMMI_Lcd_Page_Index;
+
+
+/**********************************************************************************
+º¯ÊýÉùÃ÷
+***********************************************************************************/
+/*¿ª¹Ø»ú»Øµ÷£¬ÓÃÓÚlcdÏÔʾÓÃ*/
+typedef VOID (*POWER_ON_OFF_CALLBACK_FUN)();
+VOID mmi_registerLcdPowerOnOff(POWER_ON_OFF_CALLBACK_FUN fun);
+//ÉèÖô¥·¢¸üбêÖ¾
+VOID mmi_set_update_flag(E_zMmi_Task task);
+//Çå³ý¸üбêÖ¾
+VOID mmi_clean_update_flag(E_zMmi_Task task);
+//»ñÈ¡¸üбêÖ¾
+SINT32 mmi_get_update_flag(E_zMmi_Task task);
+
+/**
+ * <mmi_register_appinfo_item>
+ * ×¢²á¸÷¸öÒµÎñÐÅÏ¢
+ **/
+VOID mmi_register_taskInfo_item(T_zMMITaskInfoItem* taskInfoItem);
+SINT32 mmi_showLed(UINT32 ledInfo);
+
+#define MMI_ASSERT(a)		assert(a);
+#define itoa(i,a,b) (((b) == 16) ? sprintf((a), "%x", (i)) : sprintf((a), "%d", (i)));
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:¿ª¹Ø»úÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLcdCtrlInfo(UINT32 taskInfo);
+SINT32 mmi_getLedCtrlInfo(UINT32 taskInfo, UINT32 outLedInfo);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡¶ÌÐŵÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedSmsInfo(UINT32 taskInfo, UINT32 outLedInfo);
+SINT32 mmi_getLcdSmsInfo(UINT32 taskInfo);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÓïÒôÌáʾµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedVoipInfo(UINT32 taskInfo, UINT32 outLedInfo);
+
+SINT32 mmi_getLedRj11Info(UINT32 taskInfo, UINT32 outLedInfo);
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡¶ÌÐŵÆÐÅÏ¢±íË÷Òý
+***********************************************************************************/
+SINT32 mmi_get_batteryinfo(UINT32 batteryinfo);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÍøÂçµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedNetInfo(UINT32 taskInfo, UINT32 outLedInfo);
+SINT32 mmi_getLcdNetInfo(UINT32 taskInfo);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÍøÂçÐźŸñÐÅÏ¢£¨Ò¢Ô¶cpe£©
+***********************************************************************************/
+SINT32 mmi_getLedNetSigInfo(UINT32 taskInfo, UINT32 outLedInfo);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡WIFIµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedWifiInfo(UINT32 taskInfo, UINT32 outLedInfo);
+SINT32 mmi_getLcdWifiInfo(UINT32 taskInfo);
+SINT32 mmi_getLedWpsInfo(UINT32 taskInfo, UINT32 outLedInfo);
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡Á÷Á¿µÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedTrafficInfo(UINT32 taskInfo, UINT32 outLedInfo);
+SINT32 mmi_getLcdTrafficInfo(UINT32 taskInfo);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÒÆ¶¯ÔËÓªÉÌÁ÷Á¿ÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLcdQuotaTrafficInfo(UINT32 taskInfo);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡µ±Ç°¹¤×÷ģʽ
+***********************************************************************************/
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡µç³ØµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedBatteryInfo(UINT32 taskInfo, UINT32 outLedInfo);
+SINT32 mmi_getLcdBatteryInfo(UINT32 taskInfo);
+SINT32 mmi_getLcdPowerInfo(UINT32 taskInfo);
+SINT32 mmi_getLcdTipInfo(UINT32 taskInfo);
+SINT32 mmi_getLcdPowerOffChagerInfo(UINT32 taskInfo);
+SINT32 mmi_getLedPowerOffChagerInfo(UINT32 taskInfo, UINT32 outLedInfo);
+
+
+SINT32 mmi_getFotaUpdateStateInfo(VOID);//»ñÈ¡FOTAÉý¼¶×´Ì¬ÐÅÏ¢
+SINT32 mmi_getLcdTipFotaInfo(UINT32 taskInfo);//FOTA
+SINT32 mmi_getLcdWifiStationInfo(UINT32 taskInfo);//wifistation
+SINT32 mmi_getLcdTipWpsInfo(UINT32 taskInfo);//wps
+SINT32 mmi_getLcdTipNetConnInfo(UINT32 taskInfo);//net connect
+
+SINT32 mmi_getLcdWifiCodeInfo(UINT32 taskInfo);//wifi¶þάÂë
+
+SINT32 mmi_getLcdSSIDKeyInfo(UINT32 taskInfo);
+SINT32 mmi_getLcdBasicDevInfo(UINT32 taskInfo);//SSID/WIFIKEY/IMSI/MSISDN
+SINT32 mmi_getLcdCurConInfo(UINT32 taskInfo);//±¾´ÎÁ¬½Óʱ¼ä£¬±¾´ÎÁ÷Á¿
+SINT32 mmi_getLcdTimeInfo(UINT32 taskInfo);//time
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡¿ª»ú20s¶¨Ê±Æ÷ÐÅÏ¢
+***********************************************************************************/
+BOOL mmi_getSSIDFirstShowInfo(VOID);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡¿ª»ú¶¯»­ÊÇ·ñ½áÊøÐÅÏ¢
+***********************************************************************************/
+BOOL mmi_getShowingPowerOnInfo(VOID);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡fotaÉý¼¶½á¹ûÏÔʾÊÇ·ñ½áÊøÐÅÏ¢
+***********************************************************************************/
+BOOL mmi_getShowingFotaResultInfo(VOID);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡fotaа汾ÐÅÏ¢
+***********************************************************************************/
+BOOL mmi_getFotaNewVersionInfo(VOID);
+
+E_zMmi_Work_Mode mmi_get_lcd_mode(VOID);
+E_zMmi_Work_Mode mmi_get_led_mode(VOID);
+
+/**
+ * <mmi_sms_Led_Init>
+ * ¶ÌÐŵƳõʼ»¯
+ **/
+VOID mmi_sms_led_init(VOID);
+
+
+/**
+ * <mmi_wifi_Led_Init>
+ * Wifi µÆ³õʼ»¯
+ **/
+VOID mmi_wifi_led_init(VOID);
+
+
+/**
+ * <mmi_net_Led_Init>
+ * ÍøÂçµÆ³õʼ»¯
+ **/
+VOID mmi_net_led_init(VOID);
+
+
+/**
+ * <mmi_battery_Led_Init>
+ * µç³ØµÆ³õʼ»¯
+ **/
+VOID mmi_battery_led_init(VOID);
+
+
+
+/**
+ * <mmi_traffic_Led_Init>
+ * Á÷Á¿µÆ³õʼ»¯
+ **/
+VOID mmi_traffic_led_init(VOID);
+
+
+
+/**
+ * <mmi_keyStrokes_Init>
+ * °´¼ü³õʼ»¯
+ **/
+VOID mmi_keyStrokes_init(VOID);
+
+/**
+ * <mmi_recover_allleds>
+ *»½ÐÑ˯Ãß״̬ʱµãÁÁËùÓеÆ
+ **/
+VOID mmi_set_allleds_on(VOID);
+
+/**
+ * <mmi_init_idle_control>
+ *MMIÊ¡µç¿ØÖƳõʼ»¯
+ **/
+
+VOID mmi_init_idle_control(VOID);
+
+
+/**
+ * <mmi_reset_idle_timer>
+ *Ê¡µçÏà¹Ø¶¨Ê±Æ÷ÖØÖÃ
+ **/
+
+VOID mmi_reset_idle_timer(VOID);
+
+/**
+ * <mmi_reset_idle_timer>
+ *¿ìËÙ¿ª¹Ø»úʱʡµçÏà¹Ø¶¨Ê±Æ÷ÖØÖÃ
+ **/
+
+VOID mmi_reset_fast_poweron_idle_timer(VOID);
+
+/**
+ * <mmi_close_chg_handle>
+ * ¹Ø±Õ³äµçÉ豸¾ä±ú
+ **/
+VOID mmi_close_chg_handle(VOID);
+
+/**
+ * <mmi_close_chg_handle>
+ * ¹Ø±Õ°´¼üÉ豸¾ä±ú
+ **/
+VOID mmi_close_kpd_handle(VOID);
+
+/**
+ * <mmi_close_chg_handle>
+ * ¹Ø±ÕLED É豸¾ä±ú
+ **/
+VOID mmi_close_led_handle(VOID);
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:³õʼ»¯LEDÉ豸
+***********************************************************************************/
+VOID mmi_led_dev_init(VOID);
+
+/**
+ * <zMMI_Handle_Msg_Idle_ledon>
+ * ´¦ÀíÊ¡µç¿ªµÆÏûÏ¢
+ **/
+
+VOID zMMI_Handle_Msg_Idle_ledon(VOID);
+
+
+/**
+ * <mmi_set_allleds_blink>
+ * ¿ª»ú»ò¹Ø»úʱËùÓеÆÏÈ¿ªºó¹Ø
+ **/
+
+VOID mmi_set_allleds_blink(VOID);
+
+VOID mmi_traffictip_timer_stop(VOID);
+
+/**
+ * <mmi_kill_idle_timer>
+ *killÊ¡µçÏà¹Ø¶¨Ê±Æ÷
+ **/
+VOID mmi_kill_idle_timer(VOID);
+
+/**
+ * <mmi_kill_tip_timer>
+ *kill sim¿¨Ñ­»·¼ì²â¶¨Ê±Æ÷
+ **/
+VOID mmi_kill_tip_timer(VOID);
+
+/**
+ * <mmi_kill_traffic_timer>
+ *kill Á÷Á¿Ñ­»·¼ì²â¶¨Ê±Æ÷
+ **/
+VOID mmi_kill_traffic_timer(VOID);
+
+/**
+ * <mmi_kill_wifi_data_timer>
+ *kill wifiÊý¾Ý´«ÊäÑ­»·¼ì²â¶¨Ê±Æ÷
+ **/
+VOID mmi_kill_wifi_data_timer(VOID);
+
+/**
+ * <mmi_kill_get_voltage_timer>
+ *kill¶ÁÈ¡µçѹ¶¨Ê±Æ÷
+ **/
+
+VOID mmi_kill_get_voltage_timer(VOID);
+
+
+
+/**
+ * <mmi_create_get_batlev_thread>
+ * ´´½¨»ñÈ¡µç³ØµçÁ¿°Ù·Ö±ÈµÄÏß³Ì
+ **/
+VOID mmi_create_get_batlev_thread(VOID);
+/**
+ * <get_voltage_level_from_table>
+ * ´Óµç³Ø°Ù·Ö±È±íÖлñÈ¡µç³ØµçÁ¿°Ù·Ö±È
+ **/
+SINT32 get_voltage_level_from_table(SINT32 voltagepower);
+/**
+ * <mmi_voltage_state_read>
+ * ¶ÁÈ¡µçѹ
+ **/
+SINT32 mmi_voltage_state_read(VOID);
+
+SINT32 zMMI_Handle_Msg_Network_Mode(VOID *data);
+SINT32 zMMI_Handle_Msg_Connect_Status(VOID *data);
+SINT32 zMMI_Handle_Msg_MultiConnect_Status(VOID *data, int src_id);
+SINT32 zMMI_Handle_Msg_Signal_Num(VOID *data);
+SINT32 zMMI_Handle_Msg_Simcard_Info(VOID *data);
+SINT32 zMMI_Handle_Msg_Get_Wifi_StaNum(VOID *data);
+SINT32 zMMI_Handle_Msg_SmsBox_Sattus(VOID *data);
+SINT32 zMMI_Handle_Msg_Voip_Status(VOID *data);
+SINT32 zMMI_Handle_Msg_Rj11_Status(VOID * data);
+
+SINT32 zMMI_Handle_Msg_Get_SSID_Key(VOID *data);
+SINT32 zMMI_Handle_Msg_BacklightOff(VOID *data);
+SINT32 zMMI_Handle_Msg_Factory_Reset(VOID *data);
+SINT32 zMMI_Handle_Msg_Restart(VOID *data);
+SINT32 zMMI_Handle_Msg_Poweroff(VOID *data);
+SINT32 zMMI_Handle_Msg_Get_Provider(VOID *data);
+SINT32 zMMI_Handle_Msg_Get_TafficInfo_Start(VOID* data);
+SINT32 zMMI_Handle_Msg_Get_TafficInfo_End(VOID* data);
+SINT32 zMMI_Handle_Msg_TafficInfo_Reset(VOID* data);
+SINT32 zMMI_Handle_Msg_Check_Tip_Info(VOID *data);
+SINT32 zMMI_Handle_Msg_SSID_Show_Info(VOID *data);
+SINT32 zMMI_Handle_Msg_Get_Wifi_Data(VOID *data);
+SINT32 zMMI_Handle_Msg_Socket_Status(VOID *data, int src_id);
+SINT32 zMMI_Handle_Msg_MCUSocket_Status(VOID *data);
+
+SINT32	mmi_RegisterNetTaskInfoItem();
+SINT32	mmi_RegisterSmsTaskInfoItem();
+SINT32  mmi_RegisterVoipTaskInfoItem();
+SINT32 mmi_RegisterRj11TaskInfoItem();
+
+SINT32 	mmi_RegisterBatteryTaskInfoItem();
+SINT32 	mmi_RegisterPowerTaskInfoItem();
+SINT32	mmi_RegisterCtrlTaskInfoItem();
+SINT32 	mmi_RegisterTimeTaskInfoItem();
+SINT32 	mmi_RegisterSSIDInfoTaskInfoItem();
+SINT32 	mmi_RegisterWifiTaskInfoItem();
+SINT32 mmi_RegisterWpsTaskInfoItem();
+
+SINT32 	mmi_RegisterWifiCodeTaskInfoItem();
+SINT32 	mmi_RegisterTrafficTaskInfoItem();
+SINT32 	mmi_RegisterQuotaTrafficInfoItem();
+SINT32 	mmi_RegisterTipTaskInfoItem();
+SINT32 	mmi_RegisterTipWifiStationConnectTaskInfoItem();
+SINT32 	mmi_RegisterTipWpsTaskInfoItem();
+SINT32 mmi_RegisterNetSigTaskInfoItem();
+SINT32 	mmi_RegisterTipFotaTaskInfoItem();
+SINT32  mmi_RegisterTipNetConnectTaskInfoItem();
+SINT32 	mmi_RegisterTipWifiStationConnectTaskInfoItem();
+void	mmi_net_init();
+void	mmi_sms_init();
+void    mmi_voip_init();
+void	mmi_init_idle_control();
+void	mmi_battery_init();
+void	mmi_init_lcd_tip();
+void	mmi_init_time();
+void	mmi_wifi_init();
+void	mmi_traffic_init();
+void	mmi_init_quota_traffic();
+VOID    mmi_play_poweroff_cartoon(E_zMmi_Work_Mode mode);
+VOID    mmi_set_fake_poweroff_charger(int fake_poweroff_flag);
+VOID    mmi_lowbattery_discharge_protect(UINT32 voltagepower);
+VOID    mmi_set_discharge_low_current(BOOL discharge_low_current_flag);
+VOID    mmi_handle_fast_poweroff(VOID);
+VOID    mmi_wifi_operate(char* mode);
+BOOL    mmi_get_usb_insert_state();
+E_zMmi_Charge_State     mmi_get_charge_state();
+VOID   mmi_handle_fast_poweron(VOID);
+VOID   mmi_set_discharge_switch(BOOL discharge_protect_flag);
+void mmi_log_save(const char *fmt, ...);
+VOID mmi_sleep(UINT32 time_in_ms);
+void mmi_add_list(struct list_head *head, int src_id);
+void mmi_del_list(struct list_head *head, int src_id);
+
+VOID mmi_clean_net_state();
+VOID mmi_set_wificode_show_flag(BOOL flag);
+E_zMMI_Lcd_Page_Index mmi_get_lcd_page_index(VOID);
+E_zMmi_Sim_Tip mmi_getSIMStateInfo(VOID);
+E_zMmi_NetCon_Tip mmi_getNetConInfo(VOID);
+E_zMmi_WpsAct_Tip mmi_get_wps_state();
+VOID mmi_set_poweroff_charge_show(BOOL show);
+#ifndef DISABLE_LCD
+SINT32 mmi_showLcd(HDC hdc);
+#endif
+VOID mmi_initLcdShowInfoTab();
+VOID mmi_handle_lcd_key_switch_page();
+VOID mmi_idle_timer_stop(VOID);
+VOID mmi_wps_operate(VOID);
+VOID mmi_changePowerOnOffFrame(VOID);
+VOID mmi_startLedTrafficWarnTimer(SINT32 time, SINT32 flag);
+VOID mmi_stopLedTrafficWarnTimer();
+VOID mmi_poweroffcharger_init();
+UINT32 mmi_get_net_state(VOID);
+/**º¯Êý×÷ÓÃ:×Ô¶¯»¯²âÊÔÄ£Äâ°´¼ü**/
+SINT32 zMMI_Handle_Msg_Atest_Key(VOID *data);
+SINT32 zMMI_Handle_Msg_Atest_Chg(VOID *data);
+
+
+
+
+
+#endif //__MMI_COMMON_H
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_ctrl.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_ctrl.c
new file mode 100755
index 0000000..a36f1d4
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_ctrl.c
@@ -0,0 +1,300 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_ctrl.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMIÊ¡µç´¦Àí
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+
+/*****************************************************************************
+                         Í·Îļþ
+******************************************************************************/
+#include "mmi_common.h"
+#include "mmi_lcd.h"
+
+/*****************************************************************************
+                         È«¾Ö±äÁ¿¶¨Òå
+******************************************************************************/
+//lcd/ledµÄ¹¤×÷ģʽ£¬ÓÃÀ´¾ö¶¨ÁÁÃðÆÁ/µÆ¡¢Ê¡µçµÈ
+static E_zMmi_Work_Mode g_mmi_lcd_mode = MMI_ACTIVE_MODE;
+static E_zMmi_Work_Mode g_mmi_led_mode = MMI_ACTIVE_MODE;
+SINT32 g_mmi_softtimer_flag = 0;//ÓÃÀ´²âÊÔsofttimer»Øµ÷ÊÇ·ñÖ´ÐеÄdebug±äÁ¿
+
+/*****************************************************************************
+                         ÒýÓñäÁ¿
+******************************************************************************/
+extern pthread_mutex_t g_mmi_lcdmode_mutex;
+extern pthread_mutex_t g_mmi_ledmode_mutex;
+extern E_zMmiShowMode g_showMode;
+extern UINT32 g_led_sleep_mode;
+extern UINT32 g_led_standby_mode;
+
+
+/*****************************************************************************
+ º¯Êý˵Ã÷:×¢²áÃðÆÁÃðµÆ¿ØÖÆÄ£¿é
+******************************************************************************/
+SINT32 mmi_get_ctrlinfo(UINT32 ctrlinfo)
+{
+	if (ctrlinfo != 0) {
+		T_zMMICtrlInfo * pCtrlInfo = (T_zMMICtrlInfo *)ctrlinfo;
+		pCtrlInfo->lcdmode = mmi_get_lcd_mode();
+		pCtrlInfo->ledmode = mmi_get_led_mode();
+	}
+	return MMI_SUCCESS;
+}
+
+
+SINT32 mmi_RegisterCtrlTaskInfoItem()
+{
+	T_zMMITaskInfoItem ctrlInfoItem = {0};
+	ctrlInfoItem.task = MMI_TASK_CTRL;
+	ctrlInfoItem.taskinfo = (VOID*)malloc(sizeof(T_zMMICtrlInfo));
+	ctrlInfoItem.get_taskinfo_fun = mmi_get_ctrlinfo;
+	ctrlInfoItem.get_ledinfo_fun = mmi_getLedCtrlInfo;
+#ifndef DISABLE_LCD
+	ctrlInfoItem.get_lcdinfo_fun = mmi_getLcdCtrlInfo;
+#endif
+	ctrlInfoItem.ledinfo = (VOID*)malloc(sizeof(T_zMmi_Led_Info));
+	//ctrlInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&ctrlInfoItem);
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:´ý»úʱÎÞ°´¼ü¹Ø±³¹â,Ïȱ䰵 5Ãë
+***********************************************************************************/
+static VOID * mmi_idle_halfbright_timer_cb(VOID *arg)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_idle_halfbright_timer_cb !!\n");
+	mmi_set_lcd_mode(MMI_BACKLIGHT_OFF_MODE);
+	mmi_set_update_flag(MMI_TASK_CTRL);
+	return NULL;
+}
+
+static VOID mmi_idle_halfbright_timer_start(VOID)
+{
+	int ret = -1;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_idle_halfbright_timer_start !!\n");
+#if MMI_SOFTTIMER_DEBUG
+	g_mmi_softtimer_flag = 5;
+#endif
+	ret = sc_timer_create(SET_BACKLIGHT_HALFBRIGHT_TIMER, TIMER_FLAG_ONCE, SET_BACKLIGHT_HALFBRIGHT_TIME, &mmi_idle_halfbright_timer_cb, NULL);
+	if (ret != 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_idle_halfbright_timer_start FAILED !!");
+	}
+}
+
+static VOID mmi_idle_halfbright_timer_stop(VOID)
+{
+
+	sc_timer_delete(SET_BACKLIGHT_HALFBRIGHT_TIMER);
+}
+
+SINT32 zMMI_Handle_Msg_BacklightOff(VOID *data)
+{
+	//mmi_idle_halfbright_timer_start();
+	mmi_set_lcd_mode(MMI_BACKLIGHT_OFF_MODE);
+	mmi_set_update_flag(MMI_TASK_CTRL);
+	return 0;
+}
+/**********************************************************************************
+º¯Êý×÷ÓÃ:MMI´ý»úʱ¶¨Ê±Æ÷µÄ»Øµ÷º¯Êý
+***********************************************************************************/
+static VOID * mmi_idle_timer_cb(VOID *arg)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_idle_timer_cb !!\n");
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE || mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_MODE) {
+			mmi_set_lcd_mode(MMI_FAKE_POWEROFF_MODE);
+			mmi_set_update_flag(MMI_TASK_CTRL);
+		} else {
+			mmi_set_lcd_mode(MMI_BACKLIGHT_HALFBRIGHT_MODE);
+			mmi_set_update_flag(MMI_TASK_CTRL);
+			//mmi_send_message(MODULE_ID_MMI, (USHORT)MSG_CMD_MMISTART_BACKLIGHTOFF_TIMER,  0, NULL);
+			ipc_send_message(MODULE_ID_MMI, MODULE_ID_MMI, MSG_CMD_MMISTART_BACKLIGHTOFF_TIMER, 0, NULL, 0);
+		}
+	}
+
+	if (g_led_sleep_mode) {
+		if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+			E_zMmi_Work_Mode led_mode = mmi_get_led_mode();
+			if (led_mode == MMI_FAKE_POWEROFF_MODE || led_mode == MMI_IDLE_STANDBY_LEDOFF_MODE) {
+				mmi_set_update_flag(MMI_TASK_CTRL);
+				return NULL;
+			}
+			if (led_mode == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+				return NULL;
+			}
+			if (mmi_get_charge_state() == STATE_CHARGING || mmi_get_charge_state() == STATE_FULL) {
+				mmi_set_led_mode(MMI_IDLE_CHG_LEDOFF_MODE);
+			} else if (g_led_standby_mode && mmi_get_wifi_state() == FALSE) {
+				mmi_set_led_mode(MMI_IDLE_STANDBY_LEDOFF_MODE);
+			} else {
+				mmi_set_led_mode(MMI_IDLE_LEDOFF_MODE);
+			}
+			mmi_set_update_flag(MMI_TASK_CTRL);
+		}
+	}
+	return NULL;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:´ý»úʱÎÞ°´¼ü¹Ø±³¹â¶¨Ê±Æ÷£¬Ê±¼ä20Ã룬һ´ÎÐÔ¶¨Ê±Æ÷
+***********************************************************************************/
+static VOID mmi_idle_timer_create(VOID)
+{
+	int ret = -1;
+	ret = sc_timer_create(SET_MMI_IDLE_TIMER, TIMER_FLAG_ONCE, SET_MMI_IDLE_TIME, &mmi_idle_timer_cb, NULL);
+	if (ret != 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_idle_timer_create FAILED !!");
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:STOP ´ý»úʱÎÞ°´¼üÃðµÆ¶¨Ê±Æ÷
+***********************************************************************************/
+VOID mmi_idle_timer_stop(VOID)
+{
+
+	sc_timer_delete(SET_MMI_IDLE_TIMER);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:MMI¿ìËٹػúʱ¶¨Ê±Æ÷µÄ»Øµ÷º¯Êý
+***********************************************************************************/
+static VOID * mmi_fast_poweron_idle_timer_cb(VOID *arg)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_fast_poweron_idle_timer_cb !!\n");
+	if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_MODE && (mmi_get_charge_state() == STATE_DISCHARGE)) {
+		mmi_set_update_flag(MMI_TASK_CTRL);
+	}
+	return NULL;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¿ìËٹػúʱ¶Ì°´¼ü½øÈë˯Ãß¶¨Ê±Æ÷£¬Ê±¼ä4Ã룬һ´ÎÐÔ¶¨Ê±Æ÷
+***********************************************************************************/
+static VOID mmi_fast_poweron_idle_timer_create(VOID)
+{
+	int ret = -1;
+	ret = sc_timer_create(SET_MMI_FAST_POWERON_IDLE_TIMER, TIMER_FLAG_ONCE, SET_MMI_FAST_POWERON_IDLE_TIME, &mmi_fast_poweron_idle_timer_cb, NULL);
+	if (ret != 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_fast_poweron_idle_timer_create FAILED\n");
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:KILL¿ìËٹػúʱʡµç¶¨Ê±Æ÷
+***********************************************************************************/
+VOID mmi_fast_poweron_idle_timer_stop(VOID)
+{
+
+	sc_timer_delete(SET_MMI_FAST_POWERON_IDLE_TIMER);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ÉèÖÃ/»ñÈ¡µ±Ç°LCDģʽ
+***********************************************************************************/
+E_zMmi_Work_Mode mmi_get_lcd_mode(VOID)
+{
+	E_zMmi_Work_Mode tmpMode = MMI_ACTIVE_MODE;
+	mmi_getMutex(&g_mmi_lcdmode_mutex);
+	tmpMode = g_mmi_lcd_mode;
+	mmi_putMutex(&g_mmi_lcdmode_mutex);
+	return tmpMode;
+}
+
+VOID mmi_set_lcd_mode(E_zMmi_Work_Mode tmpMode)
+{
+	mmi_getMutex(&g_mmi_lcdmode_mutex);
+	g_mmi_lcd_mode = tmpMode;
+	mmi_putMutex(&g_mmi_lcdmode_mutex);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ÉèÖÃ/»ñÈ¡µ±Ç°LEDģʽ
+***********************************************************************************/
+E_zMmi_Work_Mode mmi_get_led_mode(VOID)
+{
+	E_zMmi_Work_Mode tmpMode = MMI_ACTIVE_MODE;
+	mmi_getMutex(&g_mmi_ledmode_mutex);
+	tmpMode = g_mmi_led_mode;
+	mmi_putMutex(&g_mmi_ledmode_mutex);
+	return tmpMode;
+}
+
+VOID mmi_set_led_mode(E_zMmi_Work_Mode tmpMode)
+{
+	mmi_getMutex(&g_mmi_ledmode_mutex);
+	g_mmi_led_mode = tmpMode;
+	mmi_putMutex(&g_mmi_ledmode_mutex);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:½«MMIÉèΪæµ״̬
+***********************************************************************************/
+VOID mmi_set_mode_active(VOID)
+{
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		E_zMmi_Work_Mode lcd_mode = mmi_get_lcd_mode();
+		if (lcd_mode == MMI_BACKLIGHT_OFF_MODE || lcd_mode == MMI_BACKLIGHT_HALFBRIGHT_MODE) {
+			mmi_set_lcd_mode(MMI_ACTIVE_MODE);
+			mmi_set_update_flag(MMI_TASK_CTRL);
+		}
+	}
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		E_zMmi_Work_Mode led_mode = mmi_get_led_mode();
+		if (led_mode == MMI_IDLE_LEDOFF_MODE || led_mode == MMI_IDLE_STANDBY_LEDOFF_MODE || led_mode == MMI_IDLE_CHG_LEDOFF_MODE) {
+			mmi_set_led_mode(MMI_ACTIVE_MODE);
+			mmi_set_update_flag(MMI_TASK_CTRL);
+		}
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:MMIÊ¡µçʱµÄÏà¹Ø¶¨Ê±Æ÷reset£¬°´¼üºÍUSB²å°Îʱµ÷ÓÃ
+***********************************************************************************/
+VOID mmi_reset_idle_timer(VOID)
+{
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		mmi_idle_halfbright_timer_stop();
+	}
+	mmi_idle_timer_stop();
+	mmi_idle_timer_create();
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¿ìËٹػúʱÈôÓа´¼ü²Ù×÷£¬MMIÊ¡µçʱµÄÏà¹Ø¶¨Ê±Æ÷reset£¬°´¼üʱµ÷ÓÃ
+***********************************************************************************/
+VOID mmi_reset_fast_poweron_idle_timer(VOID)
+{
+	mmi_fast_poweron_idle_timer_stop();
+	mmi_fast_poweron_idle_timer_create();
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:MMIÊ¡µçʱµÄÏà¹Ø¶¨Ê±Æ÷KILL£¬  ¹Ø»úºÍÖØÆôʱµ÷ÓÃ
+***********************************************************************************/
+VOID mmi_kill_idle_timer(VOID)
+{
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		mmi_idle_halfbright_timer_stop();
+	}
+	mmi_idle_timer_stop();
+	mmi_fast_poweron_idle_timer_stop();
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:³õʼ»¯MMIÊ¡µç¹ÜÀí
+***********************************************************************************/
+VOID mmi_init_idle_control(VOID)
+{
+	mmi_idle_timer_create();
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_fota.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_fota.c
new file mode 100755
index 0000000..5363644
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_fota.c
@@ -0,0 +1,263 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_fota.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI fotaÒµÎñ´¦Àí
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2015-8-31
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+
+/*****************************************************************************
+                         Í·Îļþ
+******************************************************************************/
+#include "mmi_common.h"
+#include "fota_common.h"
+/*****************************************************************************
+                         È«¾Ö±äÁ¿¶¨Òå
+******************************************************************************/
+#define MMI_CHECK_FOTA_RESULT_TIMES 	120
+#define MMI_SHOW_FOTA_RESULT_TIMES 	10
+#define MMI_SHOW_FOTA_DOWNLOAD_TIMES 	10
+
+
+static SINT32 s_mmi_fota_page_oper = 1;//ĬÈÏΪÉý¼¶×´Ì¬£¬¿¼ÂÇÒ»ÏÂÊÇ·ñ¿ÉÒÔɾ³ý
+static E_zMMI_Fota_Tip s_mmi_fota_tip = FOTA_MAX;//fota ÌáʾÓïÐÅÏ¢
+static E_zMMI_Fota_Tip s_mmi_fota_tipEx = FOTA_MAX;//fotaÉÏÒ»´ÎµÄÌáʾÓïÐÅÏ¢
+static SINT32 s_mmi_fota_update = 0;//fota а汾
+static SINT32 s_mmi_fota_updateEx = 0;//fotaа汾µÄÉÏÒ»´ÎÐÅÏ¢
+static BOOL s_mmi_show_fota_result = FALSE;//ĬÈϲ»ÏÔʾ
+//1SÄÚ¼ì²âfota½á¹ûµÄ´ÎÊý
+static SINT32 s_mmi_check_fota_result_times = MMI_CHECK_FOTA_RESULT_TIMES;
+//ÏÔʾfotaÉý¼¶½á¹ûµÄʱ¼ä
+static SINT32 s_mmi_show_fota_result_times = MMI_SHOW_FOTA_RESULT_TIMES;
+//ÏÔʾfotaÏÂÔØ½á¹ûµÄʱ¼ä
+static SINT32 s_mmi_show_fota_download_times = MMI_SHOW_FOTA_DOWNLOAD_TIMES;
+
+/*****************************************************************************
+                         ÒýÓñäÁ¿
+******************************************************************************/
+typedef struct {
+	long mtype;
+	char mtext[12];
+} FOTA_MSG_BUF;
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡fotaÉý¼¶Ò³ÃæÉý¼¶ÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_get_pagefota_info()
+{
+	return s_mmi_fota_page_oper;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ÉèÖÃfotaÉý¼¶Ò³ÃæÉý¼¶ÐÅÏ¢
+***********************************************************************************/
+VOID mmi_set_pagefota_info(SINT32 fotainfo)
+{
+	s_mmi_fota_page_oper = fotainfo;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡fotaÉý¼¶ÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_is_fota_update()
+{
+	return s_mmi_fota_update;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡fota ÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_get_fotainfo(UINT32 fotainfo)
+{
+	if (fotainfo != 0) {
+		T_zMMIFotaInfo * pFotaInfo = (T_zMMIFotaInfo *)fotainfo;
+		pFotaInfo->fota_update = s_mmi_fota_update;
+		pFotaInfo->fota_tip = s_mmi_fota_tip;
+		pFotaInfo->fota_oper = (E_zMmi_Fota_Oper)s_mmi_fota_page_oper;
+	}
+	return MMI_SUCCESS;
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:×¢²áFOTA Éý¼¶Ìáʾģ¿é
+***********************************************************************************/
+SINT32 mmi_RegisterTipFotaTaskInfoItem()
+{
+	T_zMMITaskInfoItem tipInfoItem = {0};
+	tipInfoItem.task = MMI_TASK_TIP_FOTA;
+	tipInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMITipInfo));
+	tipInfoItem.get_taskinfo_fun = mmi_get_fotainfo;
+#ifndef DISABLE_LCD
+	tipInfoItem.get_lcdinfo_fun = mmi_getLcdTipFotaInfo;
+#endif
+	//tipInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&tipInfoItem);
+	return MMI_SUCCESS;
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡ÉÏÒ»´ÎFOTAÉý¼¶½á¹û
+
+***********************************************************************************/
+VOID mmi_check_fota_upgrade_result(VOID)
+{
+	char nv_upgrade_result[16] = {0};
+
+	if (s_mmi_check_fota_result_times > 0) { /* δµ½¼ì²â´ÎÊý*/
+		s_mmi_check_fota_result_times --;
+		sc_cfg_get(NV_FOTA_UPGRADE_RESULT_MMI, nv_upgrade_result, sizeof(nv_upgrade_result));
+		if (strlen(nv_upgrade_result) > 0) { /*ÓÐfotaÉý¼¶ÐÅÏ¢*/
+			if (!strcasecmp(nv_upgrade_result, UPDATE_SUCCESS)) {
+				s_mmi_fota_tip = FOTA_UPDATE_SUCCESS;
+			} else if (!strcasecmp(nv_upgrade_result, UPDATE_FAIL)) {
+				s_mmi_fota_tip = FOTA_UPDATE_FAILED;
+			}
+
+			s_mmi_show_fota_result = TRUE;/*ÐèÒªÏÔʾÉý¼¶½á¹û*/
+			s_mmi_check_fota_result_times = 0; /* ¶Áµ½ÓÐЧÊý¾ÝÎÞÐèÔٴμì²â*/
+			sc_cfg_set(NV_FOTA_UPGRADE_RESULT_MMI, ""); /* ÖØÖÃNV,½«Éý¼¶½á¹ûÇå³ý */
+			mmi_set_update_flag(MMI_TASK_TIP_FOTA);
+		} else { /*ûÓÐfotaÉý¼¶ÐÅÏ¢*/
+			//strcpy(s_mmi_update_info, INVALID_STR);
+		}
+
+	}
+
+	if (s_mmi_show_fota_result) {
+		if (s_mmi_show_fota_result_times > 0) {
+			s_mmi_show_fota_result_times --;
+		} else { /* Òѵ½ÏÔʾ´ÎÊý*/
+			s_mmi_show_fota_result = FALSE;
+			s_mmi_fota_tip = FOTA_SHOW_FINISH;
+			mmi_set_update_flag(MMI_TASK_TIP_FOTA);
+			mmi_set_update_flag(MMI_TASK_TIP);
+		}
+	}
+}
+
+/*
+BOOL mmi_getShowingFotaResultInfo(VOID)
+{
+	return s_mmi_show_fota_result;
+}
+*/
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ÅжÏÊÇ·ñÍøÂçÁ¬ÉÏ£¬°üÀ¨WANºÍWIFI
+***********************************************************************************/
+static BOOL mmi_check_net_connect(VOID)
+{
+	BOOL ret ;
+	BOOL wifi_connect = FALSE;
+	char wifi_sta_status[64] = {0};
+	int wifi_id = msgget(MODULE_ID_WIFI, 0);
+	//sc_cfg_set("sta_ip_status", "connect");
+	sc_cfg_get("sta_ip_status", wifi_sta_status, sizeof(wifi_sta_status));
+	if (!strcmp(wifi_sta_status, "connect") && (wifi_id != -1)) {
+		wifi_connect =  TRUE;
+	}
+
+	if (mmi_net_connected() || wifi_connect) {
+		ret = TRUE;
+	} else {
+		ret = FALSE;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_check_net_connect wifi_sta_status = %s,wifi_id = %d, ret = %d\n", wifi_sta_status, wifi_id, ret);
+	return ret;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡FOTAÊÇ·ñÓÐа汾ÐÅÏ¢
+***********************************************************************************/
+BOOL mmi_getFotaNewVersionInfo(VOID)
+{
+	return s_mmi_fota_update;
+}
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡FOTAÉý¼¶ÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getFotaUpdateStateInfo(VOID)
+{
+	return s_mmi_fota_tip;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¼ì²âа汾
+***********************************************************************************/
+VOID mmi_check_new_version_state(VOID)
+{
+	char nv_ver_state[64] = {0};
+	char nv_ver_downloaded[64] = {0};
+	sc_cfg_get(NV_FOTA_NEW_VERSION_STATE, nv_ver_state, sizeof(nv_ver_state));
+	sc_cfg_get(NV_FOTA_PACKAGE_ALREADY_DOWNLOAD, nv_ver_downloaded, sizeof(nv_ver_downloaded));
+
+	if (!strcmp(nv_ver_downloaded, "yes")) {
+		s_mmi_fota_update = 0;
+	} else  if (!strcmp(nv_ver_state, HAS_OPTIONAL) || !strcmp(nv_ver_state, HAS_CRITICAL)) {
+		s_mmi_fota_update = 1;
+	} else {
+		s_mmi_fota_update = 0;
+	}
+	if (!mmi_check_net_connect()) { //ÍøÂç¶ÏÍø²»ÏÔʾÉý¼¶
+		s_mmi_fota_update = 0;
+	}
+	if (s_mmi_fota_update != s_mmi_fota_updateEx) {
+#if 0
+		if (s_mmi_update_tip == 0) {
+			mmi_set_update_flag(MMI_TASK_POWER);
+		} else {
+			mmi_set_update_flag(MMI_TASK_TIP_FOTA);
+		}
+#endif
+		mmi_set_update_flag(MMI_TASK_TIP_FOTA);
+		s_mmi_fota_updateEx = s_mmi_fota_update;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_check_new_version_state,s_mmi_update_tip=%d, s_mmi_update_tipEx = %d\n", s_mmi_fota_update, s_mmi_fota_updateEx);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡FOTA°æ±¾ÏÂÔØ×´Ì¬
+
+***********************************************************************************/
+VOID mmi_check_fota_download_state(VOID)
+{
+	char nv_download_state[64] = {0};
+	sc_cfg_get(NV_FOTA_CURR_UPGRADE_STATE, nv_download_state, sizeof(nv_download_state));
+	if (strlen(nv_download_state) > 0) {
+		if (!strcasecmp(nv_download_state, DOWNLOADING)) {
+			s_mmi_fota_tip = FOTA_DOWNLOADING;
+			s_mmi_show_fota_download_times = MMI_SHOW_FOTA_DOWNLOAD_TIMES; //ÖØÖüÆÊýÆ÷
+		} else if (!strcasecmp(nv_download_state, DOWNLOAD_FAILED)) {
+			s_mmi_fota_tip = FOTA_DOWNLOAD_FAILED;
+		} else if (!strcasecmp(nv_download_state, PREPARE_INSTALL)) {
+			//sc_cfg_set(NV_FOTA_CURR_UPGRADE_STATE,"");
+			s_mmi_fota_tip = FOTA_DOWNLOAD_OK;
+		} else if (!strcasecmp(nv_download_state, LOW_BATTERY)) {
+			s_mmi_fota_tip = FOTA_DOWNLOAD_LOWBATTERY;
+		}
+	}
+	if (s_mmi_fota_tip == FOTA_DOWNLOAD_FAILED || s_mmi_fota_tip == FOTA_DOWNLOAD_LOWBATTERY) {
+		if (s_mmi_show_fota_download_times > 0) {
+			s_mmi_show_fota_download_times--;
+		} else {
+			s_mmi_fota_tip = FOTA_SHOW_FINISH;
+		}
+	}
+	if (!mmi_check_net_connect() && (s_mmi_fota_tip ==  FOTA_DOWNLOADING)) { //ÏÂÔØ¹ý³ÌÖÐÍøÂç¶ÏÍø²»ÏÔʾ
+		s_mmi_fota_tip = FOTA_SHOW_FINISH;
+	}
+
+	if (s_mmi_fota_tip != s_mmi_fota_tipEx) {
+		mmi_set_update_flag(MMI_TASK_TIP_FOTA);
+		s_mmi_fota_tipEx = s_mmi_fota_tip;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_check_fota_download_state s_mmi_fota_tip = %d,s_mmi_fota_tipEx = %d,s_mmi_show_fota_download_times = %d\n", s_mmi_fota_tip, s_mmi_fota_tipEx, s_mmi_show_fota_download_times);
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_keystrokes.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_keystrokes.c
new file mode 100755
index 0000000..4b3de9e
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_keystrokes.c
@@ -0,0 +1,432 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_keystokes.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI°´¼ü²Ù×÷
+*  ×÷            Õß  £º
+*  °æ            ±¾  £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+/*****************************************************************************
+                         Í·Îļþ
+******************************************************************************/
+#include <fcntl.h>
+#include <sys/syscall.h>
+#include <linux/reboot.h>
+#include <linux/input.h>
+#include "mmi_common.h"
+#include "mmi_lcd.h"
+
+extern int g_customer_type;
+
+/************************************************************************************
+                            È«¾Ö±äÁ¿¶¨Òå
+***********************************************************************************/
+static int g_mmi_kpd_handle = -1;//»ñÈ¡¼üÅÌÉ豸¾ä±ú
+static BOOL g_longPressFlag = FALSE;//±ê¼ÇÊÇ·ñ³¤°´
+static BOOL g_key_wakeup_flag = FALSE;//±êʾMMIÐÝÃßʱ°´¼ü Ö»»½ÐÑµÆ £¬ÆäËû¹¦Äܲ»ÏìÓ¦
+static long s_mmi_keypress_begin = 0;//°´¼ü°´Ïºó¿ªÊ¼¼ÆÊ±
+BOOL g_mmi_key_longpress_flag = FALSE;//±ê¼ÇÊÇ·ñΪmmi³¤°´power¼ü·¢ÆðµÄ¹Ø»ú
+extern E_zMmiShowMode g_showMode;
+extern UINT32 g_fast_poweron;
+static int g_mmi_kpd_longpress_time = 3;//³¤°´¼üÅжÏʱ¼äS
+static int g_mmi_wifi_longpress_time = 5;//³¤°´wifi¼üÅжÏʱ¼äS, Ò¢Ô¶cpe
+
+BOOL mmi_get_wakeup_flag(VOID);
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡°´¼üʱ¼ä
+***********************************************************************************/
+static long mmi_get_keypress_time()
+{
+	struct timeval tv;
+	long second;
+	gettimeofday(&tv, NULL);
+	second = tv.tv_sec;
+	return second;
+}
+
+
+/************************************************************************************
+ º¯Êý×÷ÓÃ:¶ÁÈ¡°´¼üÐÅÏ¢
+***********************************************************************************/
+static VOID mmi_get_keystrokes_data(MMI_KP_INFO *kp_info)
+{
+
+	int retR = -1;
+	struct input_event kp_event = {0};
+
+	retR = read(g_mmi_kpd_handle, (CHAR *)(&kp_event), sizeof(kp_event));
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI  Key's type:%d, value:%d, code:%d\n", kp_event.type, kp_event.value, kp_event.code);
+	if (retR < 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI get_keystrokes_data read falied k-err:%d!",errno);
+		return;
+	}
+
+	if (kp_event.type == 1) {
+		if (kp_event.value == 1) {
+			set_wake_lock(MMI_MAIN_LOCK_ID);
+			kp_info->status = KEY_STATUS_DOWN;
+			s_mmi_keypress_begin = mmi_get_keypress_time();
+			if (kp_event.code == KEY_WIFI_CODE) {
+				if (mmi_get_wifi_state()) {
+					g_mmi_wifi_longpress_time = 5;
+				} else {
+					g_mmi_wifi_longpress_time = 1;
+				}
+			}
+		} else if (kp_event.value == 0) {
+			kp_info->status = KEY_STATUS_UP;
+			s_mmi_keypress_begin = 0;
+		} else if (kp_event.value == 2) {
+			long sec_end = mmi_get_keypress_time();
+			int sec_lingpress = (int)(sec_end - s_mmi_keypress_begin);
+			if (kp_event.code == KEY_WIFI_CODE) {
+				if (sec_lingpress >= g_mmi_wifi_longpress_time) {
+					kp_info->status = KEY_STATUS_LONGPRESS;
+				}
+			}
+			else {
+				if (sec_lingpress >= g_mmi_kpd_longpress_time) {
+					kp_info->status = KEY_STATUS_LONGPRESS;
+				}
+			}
+		}
+		if (kp_event.code == KEY_POWER_CODE) {
+			kp_info->type = KEY_TYPE_POWER;
+		} else if (kp_event.code == KEY_RESET_CODE) {
+			kp_info->type = KEY_TYPE_RESET;
+		} else if (kp_event.code == KEY_WPS_CODE) {
+			kp_info->type = KEY_TYPE_WPS;
+		} else if (kp_event.code == KEY_WIFI_CODE) {
+			kp_info->type = KEY_TYPE_WIFI;
+		}
+	} else {
+		kp_info->status = (KEY_STATUS)0;
+		return;
+	}
+
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:°´¼ü»½ÐÑwifi
+***********************************************************************************/
+static VOID mmi_wakeup_wifi(int key_type)
+{
+	if (key_type == KEY_TYPE_WPS || key_type == KEY_TYPE_RESET) {
+		if (!mmi_get_wifi_state()) {
+			if (g_fast_poweron) {
+				if (mmi_get_lcd_mode() != MMI_FAKE_POWEROFF_MODE && mmi_get_lcd_mode() != MMI_FAKE_POWEROFF_CHARGE_MODE
+				    && mmi_get_led_mode() != MMI_FAKE_POWEROFF_MODE && mmi_get_led_mode() != MMI_FAKE_POWEROFF_CHARGE_MODE) {
+					mmi_wifi_operate(WIFI_TURN_ON);
+				}
+			} else
+				mmi_wifi_operate(WIFI_TURN_ON);
+		}
+	}
+	if (key_type == KEY_TYPE_POWER) { //LCDģʽÏÂ×¢ÒâÃðÆÁºÍ»½ÐÑ£¬LEDģʽÏÂûÓÐÃðµÆ²Ù×÷
+		if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+			if ((mmi_get_lcd_mode() == MMI_ACTIVE_MODE || mmi_get_led_mode() == MMI_ACTIVE_MODE) && mmi_get_wakeup_flag()) {
+				mmi_wifi_operate(WIFI_TURN_ON);
+			}
+		} else {
+			if ((mmi_get_lcd_mode() == MMI_ACTIVE_MODE || mmi_get_led_mode() == MMI_ACTIVE_MODE) && !mmi_get_wifi_state()) {
+				mmi_wifi_operate(WIFI_TURN_ON);
+			}
+		}
+	}
+}
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:ÉèÖð´¼ü»½Ðѱêʶ
+***********************************************************************************/
+VOID mmi_set_wakeup_flag(BOOL flag)
+{
+	if(g_customer_type == CUSTOMER_NANDIAN){//¹úµçûÓÐlcd led£¬°´¼ü²»ÐèÒª»½Ðѹ¦ÄÜ
+		g_key_wakeup_flag = FALSE;
+	}else{
+		g_key_wakeup_flag = flag;
+	}
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:·µ»Ø°´¼ü»½Ðѱêʶ
+***********************************************************************************/
+BOOL mmi_get_wakeup_flag(VOID)
+{
+	return g_key_wakeup_flag;
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:ÉèÖð´¼ü³¤°´±êʶ
+***********************************************************************************/
+VOID mmi_set_longpress_flag(BOOL flag)
+{
+	g_longPressFlag = flag;
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:·µ»Ø°´¼ü³¤°´±êʶ
+***********************************************************************************/
+BOOL mmi_get_longpress_flag(VOID)
+{
+	return g_longPressFlag;
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:°´¼ü»½ÐÑLED/LCD ²¢ÉèÖû½Ðѱê־λ
+***********************************************************************************/
+static VOID mmi_set_active_mode_key()
+{
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		E_zMmi_Work_Mode lcd_mode = mmi_get_lcd_mode();
+		if (lcd_mode == MMI_BACKLIGHT_OFF_MODE || lcd_mode == MMI_BACKLIGHT_HALFBRIGHT_MODE) {
+			mmi_set_wakeup_flag(TRUE);
+		} else {
+			if (g_fast_poweron) {
+				if (lcd_mode == MMI_FAKE_POWEROFF_MODE && (mmi_get_charge_state() == STATE_CHARGING || mmi_get_charge_state() == STATE_FULL)) {
+					mmi_set_lcd_mode(MMI_FAKE_POWEROFF_CHARGE_MODE);
+					mmi_set_update_flag(MMI_TASK_CTRL);
+					mmi_set_wakeup_flag(TRUE);
+				}
+			}
+		}
+	}
+
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		E_zMmi_Work_Mode led_mode = mmi_get_led_mode();
+		if (led_mode == MMI_IDLE_LEDOFF_MODE || led_mode == MMI_IDLE_STANDBY_LEDOFF_MODE || led_mode == MMI_IDLE_CHG_LEDOFF_MODE) {
+			mmi_set_wakeup_flag(TRUE);
+		}
+	}
+	mmi_set_mode_active();
+}
+
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:down°´¼üÏûÏ¢´¦Àí
+***********************************************************************************/
+static VOID mmi_handle_keystroke_down()
+{
+	BOOL long_press = mmi_get_longpress_flag();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI  KEYDOWN  long_press=%d!!!\n ", long_press);
+	if (FALSE == long_press) {
+		// ÖØÖö¨Ê±Æ÷
+		if (g_fast_poweron && (mmi_get_charge_state() == STATE_DISCHARGE) && ((mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_MODE) || (mmi_get_led_mode() == MMI_FAKE_POWEROFF_MODE))) {
+			mmi_reset_fast_poweron_idle_timer();
+		} else {
+			mmi_reset_idle_timer();
+		}
+
+		mmi_set_active_mode_key();
+		
+		if (mmi_get_wifi_state()) {
+			//mmi_send_message(MODULE_ID_WIFI, (USHORT)MSG_CMD_WIFI_RESET_TIMER, 0, NULL);
+
+			ipc_send_message(MODULE_ID_MMI, MODULE_ID_WIFI, MSG_CMD_WIFI_RESET_TIMER, 0, NULL, 0);
+		}
+	}
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:up°´¼üÏûÏ¢´¦Àí
+***********************************************************************************/
+static VOID mmi_handle_keystroke_up(int key_type)
+{
+	BOOL longPress = mmi_get_longpress_flag();
+	BOOL key_wakeup = mmi_get_wakeup_flag();
+
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI  KEYUP KEYUP !!! longPress=%d key_wakeup=%d\n", longPress, key_wakeup);
+	mmi_wakeup_wifi(key_type);
+#ifndef DISABLE_LCD
+	if (FALSE == longPress && (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL)) {
+		if (key_type == KEY_TYPE_WPS) {
+			if (mmi_get_lcd_mode() == MMI_ACTIVE_MODE && key_wakeup == FALSE && mmi_getSSIDFirstShowInfo() == FALSE) {
+				mmi_handle_lcd_key_switch_page();
+			}
+		} else if (key_type == KEY_TYPE_POWER && mmi_getShowingPowerOnInfo() == FALSE) {
+			if (mmi_get_lcd_mode() == MMI_ACTIVE_MODE && key_wakeup == FALSE) {
+				slog(MMI_PRINT, SLOG_DEBUG, "MMI  mmi_handle_keystroke_up ssssss");
+				mmi_idle_timer_stop();
+				mmi_set_lcd_mode(MMI_BACKLIGHT_OFF_MODE);
+				mmi_set_update_flag(MMI_TASK_CTRL);
+
+			}
+		}
+	}
+#endif
+	if (TRUE == longPress) {
+		mmi_set_longpress_flag(FALSE); //±ê¼Ç³¤°´½áÊø
+	}
+	if (TRUE == key_wakeup) {
+		mmi_set_wakeup_flag(FALSE);
+	}
+}
+
+/***********************************************************************************
+   º¯Êý×÷Óó¤°´¼üÏûÏ¢´¦Àí
+***********************************************************************************/
+static VOID mmi_handle_keystroke_longpress(int key_type)
+{
+	BOOL longPress = mmi_get_longpress_flag();
+	BOOL key_wakeup = mmi_get_wakeup_flag();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI  mmi_handle_keystroke_longpress  longPress=%d key_wakeup=%d\n", longPress, key_wakeup);
+	if ((FALSE == longPress) && (FALSE == key_wakeup)) {
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI KEYLONGPRESS!KEYLONGPRESS!\n");
+		mmi_set_longpress_flag(TRUE);
+		if (key_type == KEY_TYPE_POWER) {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI handleKey ######KEY_POWER LONGPRESS######\n\n");
+
+			if (g_fast_poweron) {
+				if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_MODE || mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE
+				    || mmi_get_led_mode() == MMI_FAKE_POWEROFF_MODE || mmi_get_led_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+					g_mmi_key_longpress_flag = FALSE;
+					mmi_handle_fast_poweron();
+				} else {
+					g_mmi_key_longpress_flag = TRUE;
+
+					slog(MMI_PRINT, SLOG_NORMAL, "MMI poweroff,longpress!!!\n");
+					mmi_set_poweroff();
+				}
+			} else {
+				slog(MMI_PRINT, SLOG_NORMAL, "MMI poweroff,longpress!!!\n");
+				mmi_set_poweroff();
+			}
+		} else if (key_type == KEY_TYPE_RESET) {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI handleKey ######KEY_RESET LONGPRESS######\n\n");
+			if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE || mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_MODE
+			    || mmi_get_led_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE || mmi_get_led_mode() == MMI_FAKE_POWEROFF_MODE) {
+				return;//break;
+			}
+			mmi_set_factory_reset();
+		} else if ((key_type == KEY_TYPE_WPS)) {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI handleKey ######KEY_WPS LONGPRESS######\n");
+			if (mmi_get_wifi_state()) {
+				mmi_wps_operate();
+			}
+		} else if ((key_type == KEY_TYPE_WIFI)) {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI handleKey ######KEY_WIFI LONGPRESS######\n");
+			if (mmi_get_wifi_state()) {
+				mmi_wifi_operate(WIFI_TURN_OFF);
+			} else {
+				mmi_wifi_operate(WIFI_TURN_ON);
+			}
+		} else {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI invalid operation!!\n");
+		}
+	}
+}
+
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:´¦Àí°´¼ü
+***********************************************************************************/
+VOID *mmi_handle_keystrokes_thread(VOID *arg)
+{
+	MMI_KP_INFO keyData = {0};
+
+
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI handleKey handle_keystrokes_thread begin !!\n ");
+	prctl(PR_SET_NAME, "mmihandlekey", 0, 0, 0);
+	while (1) {
+		mmi_get_keystrokes_data(&keyData);
+
+		switch (keyData.status) {
+		case KEY_STATUS_DOWN: {
+			mmi_handle_keystroke_down();
+			break;
+		}
+
+		case KEY_STATUS_UP: {
+			mmi_handle_keystroke_up(keyData.type);
+			break;
+		}
+		case KEY_STATUS_LONGPRESS: {
+			mmi_handle_keystroke_longpress(keyData.type);
+			break;
+		}
+		default: {
+			break;
+		}
+		}
+	}
+
+}
+#if 0
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:×Ô¶¯»¯²âÊÔÄ£Äâ°´¼ü£¬Õý³£¿ª»ú
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Atest_Key(VOID *data)
+{
+	//value:°´¼üʼþ code:°´¼ü¼üÖµ
+	autotest_key_rspmsg *kp_event = (autotest_key_rspmsg *)data;
+	MMI_KP_INFO keyData = {0};
+
+	if (kp_event->value == 1) {
+		set_wake_lock(MMI_MAIN_LOCK_ID);
+		keyData.status = KEY_STATUS_DOWN;
+		s_mmi_keypress_begin = mmi_get_keypress_time();
+	} else if (kp_event->value == 0) {
+		keyData.status = KEY_STATUS_UP;
+		s_mmi_keypress_begin = 0;
+	} else if (kp_event->value == 2) {
+		long sec_end = mmi_get_keypress_time();
+		int sec_lingpress = (int)(sec_end - s_mmi_keypress_begin);
+		if (sec_lingpress >= g_mmi_kpd_longpress_time) {
+			keyData.status = KEY_STATUS_LONGPRESS;
+		}
+	}
+	
+	if (kp_event->code == KEY_POWER_CODE) {
+		keyData.type = KEY_TYPE_POWER;
+	} else if (kp_event->code == KEY_RESET_CODE) {
+		keyData.type = KEY_TYPE_RESET;
+	} else if (kp_event->code == KEY_WPS_CODE) {
+		keyData.type = KEY_TYPE_WPS;
+	}
+
+	switch (keyData.status) {
+		case KEY_STATUS_DOWN: {
+			mmi_handle_keystroke_down();
+			break;
+		}
+		case KEY_STATUS_UP: {
+			mmi_handle_keystroke_up(keyData.type);
+			break;
+		}
+		case KEY_STATUS_LONGPRESS: {
+			mmi_handle_keystroke_longpress(keyData.type);
+			break;
+		}
+		default: {
+			break;
+		}
+	}
+	return 0;
+}
+#endif
+
+/************************************************************************************
+ º¯Êý×÷ÓÃ:°´¼ü³õʼ»¯
+***********************************************************************************/
+VOID mmi_keyStrokes_init(VOID)
+{
+	pthread_t  mmi_handlekey_thread;
+	/*´´½¨µÆ¿ØÖÆflagÐźÅÁ¿*/
+	g_mmi_kpd_handle = open(KPD_PATH, O_RDONLY);
+	if (g_mmi_kpd_handle == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "handleKey Couldn't open kp %s\n", KPD_PATH);
+		return;//MMI_ASSERT(0);
+	}
+	if(g_customer_type == CUSTOMER_GUODIAN || g_customer_type == CUSTOMER_NANDIAN){
+		g_mmi_kpd_longpress_time = 1;//1s
+	}
+	if (pthread_create(&mmi_handlekey_thread, NULL, &mmi_handle_keystrokes_thread, NULL) == -1) {
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI create handle_keystrokes_thread error\n");
+		return ;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_keyStrokes_Init finish!!\n");
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_lcd.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_lcd.c
new file mode 100755
index 0000000..e73dd54
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_lcd.c
@@ -0,0 +1,1789 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_lcd.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £º
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#ifndef DISABLE_LCD
+#include "mmi_lcd.h"
+
+extern pthread_mutex_t g_mmi_refresh_lcd_mutex;
+extern pthread_mutex_t g_mmi_poweron_mutex;
+extern UINT32 g_mmi_poweroff_turnon_flag;
+
+extern UINT32 g_show_pagefirst;
+extern UINT32 g_show_pagethird;
+extern BOOL mmi_is_offchg_poweroff;
+
+/*****************************************************************************
+ È«¾Ö±äÁ¿¶¨Òå
+******************************************************************************/
+static T_LcdConfigInfo g_LcdConfigInfoTab[] = {
+	//===========top bar==================================
+	{LCD_SHOW_NET_SIGNAL, {1, 0, 26, 24}, LCD_SHOW_PICTURE},
+	{LCD_SHOW_NET_CONNECT, {28, 2, 45, 25}, LCD_SHOW_PICTURE},
+	{LCD_SHOW_WIFISTATION_CONNECT, {28, 2, 45, 25}, LCD_SHOW_PICTURE},
+	{LCD_SHOW_SMS, {48, 0, 65, 25}, LCD_SHOW_PICTURE}, //{48,2,65,25}
+	{LCD_SHOW_SMS_NUM, {53, 11, 67, 25}, LCD_SHOW_TEXT},
+	{LCD_SHOW_WIFI, {67, 2, 87, 23}, LCD_SHOW_PICTURE},
+	{LCD_SHOW_TIP_NEW_VERSION, {89, 0, 106, 23}, LCD_SHOW_PICTURE},
+	{LCD_SHOW_POWER, {89, 4, 106, 20}, LCD_SHOW_TEXT},
+	{LCD_SHOW_BATTERY, {108, 0, 126, 23}, LCD_SHOW_PICTURE},
+	//===================== ==PAGE1=======================
+	//================MIDDLE==============================
+	{LCD_SHOW_CMCC, {0, 38, 128, 72}, LCD_SHOW_TEXT},
+	{LCD_SHOW_TIP_WIFISTA_SSID, {0, 38, 128, 72}, LCD_SHOW_TEXT},
+	{LCD_SHOW_TIP_SIM_STATE, {0, 38, 128, 72}, LCD_SHOW_TEXT},
+	{LCD_SHOW_TIP_WPS_ACTIVE, {0, 38, 128, 72}, LCD_SHOW_TEXT},
+	{LCD_SHOW_TIP_NET_CONNECTING, {0, 38, 128, 72}, LCD_SHOW_TEXT},
+	{LCD_SHOW_TIP_NET_PROVIDER, {0, 38, 128, 72}, LCD_SHOW_TEXT},
+
+	{LCD_SHOW_TIP_UPDATE_INFO, {0, 38, 128, 72}, LCD_SHOW_TEXT}, //zk add for fotaupdate result
+
+	//================TEMP================================
+	{LCD_SHOW_WIFI_SSID, {0, 72, 128, 90}, LCD_SHOW_TEXT},
+	{LCD_SHOW_WIFI_PASSWORD, {0, 100, 128, 118}, LCD_SHOW_TEXT},
+	//===================PAGE SSID2 WIFI KEY==============================
+	{LCD_SHOW_WIFI_SSID2, {0, 72, 128, 90}, LCD_SHOW_TEXT},
+	{LCD_SHOW_WIFI_PASSWORD2, {0, 100, 128, 118}, LCD_SHOW_TEXT},
+	//===================PAGE CODE2==============================
+	{LCD_SHOW_WIFI_CODE2, {0, 0, 128, 128}, LCD_SHOW_PICTURE},
+
+
+	//==================PAGE4================================
+	{LCD_SHOW_TRAFFIC, {1, 74, 128, 90}, LCD_SHOW_TEXT},
+	{LCD_SHOW_TRAFFIC_BAR, {3, 94, 125, 103}, LCD_SHOW_RECT},
+	{LCD_SHOW_TRAFFIC_SLIDER, {3, 94, 3, 103}, LCD_SHOW_BOX},
+
+	{LCD_SHOW_TRAFFIC_WARING, {0, 94, 0, 103}, LCD_SHOW_BOX},
+	//===================PAGE3==============================
+	{LCD_SHOW_WIFI_CODE, {0, 0, 128, 128}, LCD_SHOW_PICTURE},
+
+	{LCD_SHOW_POWER_OFF_CHARGER, {0, 0, 128, 128}, LCD_SHOW_PICTURE},
+
+};
+
+/*ÏÔʾ×Ü¿ØÐÅÏ¢½á¹¹Ìå*/
+T_LcdShowInfoItem g_LcdShowInfoTab[] = {
+	//===============================top bar=================================================
+	{LCD_SHOW_NET_SIGNAL, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_NET_CONNECT, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_WIFISTATION_CONNECT, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_SMS, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_SMS_NUM, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_WIFI, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_TIP_NEW_VERSION, NULL, NULL, NULL, DT_CENTER, 0, TRUE, FALSE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_POWER, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_BATTERY, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	//===============================middle=================================================
+	{LCD_SHOW_CMCC, NULL, NULL, NULL, DT_CENTER | DT_VCENTER, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_TIP_WIFISTA_SSID, NULL, NULL, NULL, DT_CENTER | DT_VCENTER, 0, FALSE, FALSE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_TIP_SIM_STATE, NULL, NULL, NULL, DT_CENTER, 0, FALSE, FALSE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_TIP_WPS_ACTIVE, NULL, NULL, NULL, DT_CENTER, 0, FALSE, FALSE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_TIP_NET_CONNECTING, NULL, NULL, NULL, DT_CENTER, 0, FALSE, FALSE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_TIP_NET_PROVIDER, NULL, NULL, NULL, DT_CENTER, 0, FALSE, FALSE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+
+	{LCD_SHOW_TIP_UPDATE_INFO, NULL, NULL, NULL, DT_CENTER | DT_VCENTER, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},//zk add for fotaupdate result
+
+	//===============================PAGE2=================================================
+	{LCD_SHOW_WIFI_SSID, NULL, NULL, NULL, DT_LEFT, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_WIFI_PASSWORD, NULL, NULL, NULL, DT_LEFT, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	//===============================PAGE4 SSID2 WIFI KEY=================================================
+	{LCD_SHOW_WIFI_SSID2, NULL, NULL, NULL, DT_LEFT, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_WIFI_PASSWORD2, NULL, NULL, NULL, DT_LEFT, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	//=================================PAGE5 CODE2=======================================================
+	{LCD_SHOW_WIFI_CODE2, NULL, NULL, NULL, DT_CENTER, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+
+	//================================PAGE1====================================================
+	{LCD_SHOW_TRAFFIC, NULL, NULL, NULL, DT_RIGHT, 0, FALSE, TRUE, LCD_SHOW_TEXT, 0xffffffff, 0},
+	{LCD_SHOW_TRAFFIC_BAR, NULL, NULL, NULL, DT_CENTER, 0, FALSE, TRUE, LCD_SHOW_BOX, 0xffffffff, 0},
+	{LCD_SHOW_TRAFFIC_SLIDER, NULL, NULL, NULL, DT_CENTER, 0, FALSE, TRUE, LCD_SHOW_RECT, 0xffffffff, 0},
+	{LCD_SHOW_TRAFFIC_WARING, NULL, NULL, NULL, DT_CENTER, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+
+	//=================================PAGE3=======================================================
+	{LCD_SHOW_WIFI_CODE, NULL, NULL, NULL, DT_CENTER, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+
+	{LCD_SHOW_POWER_OFF_CHARGER, NULL, NULL, NULL, DT_CENTER | DT_VCENTER | DT_SINGLELINE, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+
+};
+
+/*¶ÌÏûÏ¢ÅäÖñí*/
+typedef struct {
+	E_zMmi_Sms_Recvbox_Status status;
+	CHAR* path;
+	BOOL  isNeedReload;
+	BITMAP bmp;
+
+} T_SmsConfigInfo;
+
+static T_SmsConfigInfo g_SmsConfigInfoTab[] = {
+	{SMS_RECVBOX_STATUS_UNREAD, "sms_unread_2.png", FALSE, {0}},
+	{SMS_RECVBOX_STATUS_NEW, "sms_unread_2.png", FALSE, {0}},
+	{SMS_RECVBOX_STATUS_FULL, "sms_full.png", FALSE, {0}}
+};
+
+/*µç³ØµçÁ¿ÅäÖñí*/
+typedef enum {
+	E_BATTERY_LEVEL_NULL,
+	E_BATTERY_LEVEL_LOWER,
+	E_BATTERY_LEVEL_0,
+	E_BATTERY_LEVEL_1,
+	E_BATTERY_LEVEL_2,
+	E_BATTERY_LEVEL_3,
+	E_BATTERY_LEVEL_4,
+	E_BATTERY_LEVEL_OVERVOL,
+	E_BATTERY_LEVEL_CHARGER
+} E_BATTERY_LEVER;
+
+typedef struct {
+	E_BATTERY_LEVER status;
+	SINT32 timer_period;
+	CHAR* path;
+	BOOL  isNeedReload;
+	BITMAP bmp;
+} T_BatteryConfigInfo;
+
+static T_BatteryConfigInfo g_lcdBatteryConfigInfo[] = {
+	{E_BATTERY_LEVEL_NULL, 1000, "battery_null.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_LOWER, 0, "battery_low.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_0, 0, "battery_0.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_1, 0, "battery_1.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_2, 0, "battery_2.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_3, 0, "battery_3.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_4, 0, "battery_4.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_OVERVOL, 0, "overvoltage.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_CHARGER, 1000, NULL, FALSE, {0}}
+};
+
+static T_BatteryConfigInfo g_lcdPowerOffBatteryConfigInfo[] = {
+	{E_BATTERY_LEVEL_NULL, 0, NULL, FALSE, {0}},
+	{E_BATTERY_LEVEL_LOWER, 0, NULL, FALSE, {0}},
+	{E_BATTERY_LEVEL_0, 0, "poweroff_charging0.png", TRUE, {0}},
+	{E_BATTERY_LEVEL_1, 0, "poweroff_charging1.png", TRUE, {0}},
+	{E_BATTERY_LEVEL_2, 0, "poweroff_charging2.png", TRUE, {0}},
+	{E_BATTERY_LEVEL_3, 0, "poweroff_charging3.png", TRUE, {0}},
+	{E_BATTERY_LEVEL_4, 0, "poweroff_charging4.png", TRUE, {0}},
+	{E_BATTERY_LEVEL_CHARGER, 0, NULL, TRUE, {0}}
+};
+
+/*µçÐÅÍøÂçÅäÖñí*/
+typedef struct {
+	E_zMmi_Net_Mode netMode;
+	SINT32 sigLevel;
+	BOOL isRoam;
+	CHAR *path;
+	BOOL  isNeedReload;
+	BITMAP bmp;
+} T_NetSignalConfigInfo;
+
+static T_NetSignalConfigInfo g_lcdNetSignalConfigInfoTab[] = {
+	{NET_MODE_4G, 5, FALSE, "4Gsignal5.png", FALSE, {0}},
+	{NET_MODE_4G, 4, FALSE, "4Gsignal4.png", FALSE, {0}},
+	{NET_MODE_4G, 3, FALSE, "4Gsignal3.png", FALSE, {0}},
+	{NET_MODE_4G, 2, FALSE, "4Gsignal2.png", FALSE, {0}},
+	{NET_MODE_4G, 1, FALSE, "4Gsignal1.png", FALSE, {0}},
+	{NET_MODE_4G, 0, FALSE, "4Gsignal0.png", FALSE, {0}},
+	{NET_MODE_4G, 5, TRUE, "4G_R_5.png", FALSE, {0}},
+	{NET_MODE_4G, 4, TRUE, "4G_R_4.png", FALSE, {0}},
+	{NET_MODE_4G, 3, TRUE, "4G_R_3.png", FALSE, {0}},
+	{NET_MODE_4G, 2, TRUE, "4G_R_2.png", FALSE, {0}},
+	{NET_MODE_4G, 1, TRUE, "4G_R_1.png", FALSE, {0}},
+	{NET_MODE_4G, 0, TRUE, "4G_R_0.png", FALSE, {0}},
+	{NET_MODE_3G, 5, FALSE, "3Gsignal5.png", FALSE, {0}},
+	{NET_MODE_3G, 4, FALSE, "3Gsignal4.png", FALSE, {0}},
+	{NET_MODE_3G, 3, FALSE, "3Gsignal3.png", FALSE, {0}},
+	{NET_MODE_3G, 2, FALSE, "3Gsignal2.png", FALSE, {0}},
+	{NET_MODE_3G, 1, FALSE, "3Gsignal1.png", FALSE, {0}},
+	{NET_MODE_3G, 0, FALSE, "3Gsignal0.png", FALSE, {0}},
+	{NET_MODE_3G, 5, TRUE, "3G_R_5.png", FALSE, {0}},
+	{NET_MODE_3G, 4, TRUE, "3G_R_4.png", FALSE, {0}},
+	{NET_MODE_3G, 3, TRUE, "3G_R_3.png", FALSE, {0}},
+	{NET_MODE_3G, 2, TRUE, "3G_R_2.png", FALSE, {0}},
+	{NET_MODE_3G, 1, TRUE, "3G_R_1.png", FALSE, {0}},
+	{NET_MODE_3G, 0, TRUE, "3G_R_0.png", FALSE, {0}},
+	{NET_MODE_2G, 5, FALSE, "2Gsignal5.png", FALSE, {0}},
+	{NET_MODE_2G, 4, FALSE, "2Gsignal4.png", FALSE, {0}},
+	{NET_MODE_2G, 3, FALSE, "2Gsignal3.png", FALSE, {0}},
+	{NET_MODE_2G, 2, FALSE, "2Gsignal2.png", FALSE, {0}},
+	{NET_MODE_2G, 1, FALSE, "2Gsignal1.png", FALSE, {0}},
+	{NET_MODE_2G, 0, FALSE, "2Gsignal0.png", FALSE, {0}},
+	{NET_MODE_2G, 5, TRUE, "2G_R_5.png", FALSE, {0}},
+	{NET_MODE_2G, 4, TRUE, "2G_R_4.png", FALSE, {0}},
+	{NET_MODE_2G, 3, TRUE, "2G_R_3.png", FALSE, {0}},
+	{NET_MODE_2G, 2, TRUE, "2G_R_2.png", FALSE, {0}},
+	{NET_MODE_2G, 1, TRUE, "2G_R_1.png", FALSE, {0}},
+	{NET_MODE_2G, 0, TRUE, "2G_R_0.png", FALSE, {0}},
+	{NET_MODE_NOSERVICE, 0, TRUE, "signalx.png", FALSE, {0}},
+	{NET_MODE_LIMITSERVICE, 0, TRUE, "signalx.png", FALSE, {0}},
+	{NET_MODE_DEFAULT, 0, TRUE, "signalx.png", FALSE, {0}},
+};
+
+static CHAR* g_lcdNetConnectPicPath = "download.png";
+static BITMAP g_lcdNetConnectBmp = {0};
+/*WifiÁ¬½ÓÅäÖñí*/
+typedef struct {
+	E_zMmi_Wifi_State wifiState;
+	SINT32 connected_userNum;
+	CHAR *path;
+	BOOL  isNeedReload;
+	BITMAP bmp;
+} T_WifiConfigInfo;
+
+static T_WifiConfigInfo g_lcdWifiConfigInfoTab[] = {
+	{WIFI_OFF, 0, "wifi_x.png", FALSE, {0}},
+	{WIFI_ON, 0, "wifi_0.png", FALSE, {0}},
+	{WIFI_ON, 1, "wifi_1.png", FALSE, {0}},
+	{WIFI_ON, 2, "wifi_2.png", FALSE, {0}},
+	{WIFI_ON, 3, "wifi_3.png", FALSE, {0}},
+	{WIFI_ON, 4, "wifi_4.png", FALSE, {0}},
+	{WIFI_ON, 5, "wifi_5.png", FALSE, {0}},
+	{WIFI_ON, 6, "wifi_6.png", FALSE, {0}},
+	{WIFI_ON, 7, "wifi_7.png", FALSE, {0}},
+	{WIFI_ON, 8, "wifi_8.png", FALSE, {0}},
+	{WIFI_ON, 9, "wifi_9.png", FALSE, {0}},
+	{WIFI_ON, 10, "wifi_10.png", FALSE, {0}},
+	{WIFI_ON, 11, "wifi_11.png", FALSE, {0}},
+	{WIFI_ON, 12, "wifi_12.png", FALSE, {0}},
+	{WIFI_ON, 13, "wifi_13.png", FALSE, {0}},
+	{WIFI_ON, 14, "wifi_14.png", FALSE, {0}},
+	{WIFI_ON, 15, "wifi_15.png", FALSE, {0}},
+	{WIFI_ON, 16, "wifi_16.png", FALSE, {0}},
+	{WIFI_ON, 17, "wifi_17.png", FALSE, {0}},
+	{WIFI_ON, 18, "wifi_18.png", FALSE, {0}},
+	{WIFI_ON, 19, "wifi_19.png", FALSE, {0}},
+	{WIFI_ON, 20, "wifi_20.png", FALSE, {0}},
+	{WIFI_ON, 21, "wifi_21.png", FALSE, {0}},
+	{WIFI_ON, 22, "wifi_22.png", FALSE, {0}},
+	{WIFI_ON, 23, "wifi_23.png", FALSE, {0}},
+	{WIFI_ON, 24, "wifi_24.png", FALSE, {0}},
+	{WIFI_ON, 25, "wifi_25.png", FALSE, {0}},
+	{WIFI_ON, 26, "wifi_26.png", FALSE, {0}},
+	{WIFI_ON, 27, "wifi_27.png", FALSE, {0}},
+	{WIFI_ON, 28, "wifi_28.png", FALSE, {0}},
+	{WIFI_ON, 29, "wifi_29.png", FALSE, {0}},
+	{WIFI_ON, 30, "wifi_30.png", FALSE, {0}},
+	{WIFI_ON, 31, "wifi_31.png", FALSE, {0}},
+	{WIFI_ON, 32, "wifi_32.png", FALSE, {0}}
+};
+
+typedef struct {
+	E_zMmi_WifiStation_State wifistationState;
+	SINT32 sigLevel;
+	CHAR *path;
+	BOOL  isNeedReload;
+	BITMAP bmp;
+
+} T_WifiStationConfigInfo;
+
+static T_WifiStationConfigInfo g_lcdWifiStationConfigInfoTab[] = {
+	{WIFISTATION_ON, 0, "/etc_ro/mmi/wifi_sig_0.png", FALSE, {0}},
+	{WIFISTATION_ON, 1, "/etc_ro/mmi/wifi_sig_1.png", FALSE, {0}},
+	{WIFISTATION_ON, 2, "/etc_ro/mmi/wifi_sig_2.png", FALSE, {0}},
+	{WIFISTATION_ON, 3, "/etc_ro/mmi/wifi_sig_3.png", FALSE, {0}},
+	{WIFISTATION_ON, 4, "/etc_ro/mmi/wifi_sig_4.png", FALSE, {0}}
+};
+
+typedef struct {
+	E_zMmi_WifiCode_State wificodeState;
+	CHAR *path;
+	BOOL  isNeedReload;
+	BITMAP bmp;
+} T_WifiCodeConfigInfo;
+
+static T_WifiCodeConfigInfo g_lcdWifiCodeConfigInfoTab[] = {
+	{WIFICODE_MAIN, WIFICODE_MAIN_PATH, TRUE, {0}},
+	{WIFICODE_GUST1, WIFICODE_GUST1_PATH, TRUE, {0}}
+};
+
+
+/*****************************ÌáʾÐÅÏ¢Ïà¹Ø¶¨Òå******************************************/
+CHAR* g_mmiNewVersionBmpPath =  "fota_make_ready_0.png";
+BITMAP g_mmiNewVersionBmp = {0};
+
+typedef struct {
+	E_zMmi_Sim_Tip sim_state;
+	CHAR* tipString;
+} T_SimTipStringItem;
+
+T_SimTipStringItem g_simStaTipStringTab[] = {
+	{INSERT_SIM, "Insert SIM"},
+	{PIN_LOCK, "PIN Lock"},
+	{PUK_LOCK, "PUK Lock"},
+	{SIM_BUSY, "SIM Busy"},
+	{INVALID_SIM, "Invalid SIM"},
+	{SIM_LOCK, "SIM Lock"}
+};
+
+typedef struct {
+	E_zMmi_WpsAct_Tip wps_state;
+	CHAR* tipString;
+} T_WpsActTipStringItem;
+
+T_WpsActTipStringItem g_wpsActTipStringTab[] = {
+	{WPS_ACTIVING, "WPS Active Waiting"},
+	{WPS_DEACTIVING, "WPS Deactive Waiting"},
+	{WPS_ACTIVED, "WPS Active"},
+	{WPS_DEACTIVED, "WPS Deactive"},
+	{WPS_FAIL, "WPS Start Fail"},
+};
+
+typedef struct {
+	E_zMmi_NetCon_Tip net_con;
+	CHAR* tipString;
+} T_NetConTipStringItem;
+
+T_NetConTipStringItem g_netContTipStringTab[] = {
+	{NET_CONNECTING, "Connecting..."},
+	{NET_DISCONNECTING, "Disconnecting..."},
+	{NET_NOSERVICE, "No Service"},
+	{NET_LIMITSERVICE, "Limited Service"},
+	{NET_SEARCHING, "SIM Busy"},
+};
+
+
+typedef struct {
+	E_zMmi_Poc_State state;
+	CHAR* tips;
+} T_powerOffChargerTipsItem;
+
+static T_powerOffChargerTipsItem g_powerOffChargerLowBatteryTab[] = {
+	{POC_STATE_LOWBATTERY, "Low Battery"},
+	{POC_STATE_NOBATTERY, "No Battery"}
+};
+
+typedef struct {
+	E_zMMI_Fota_Tip fota_tip;
+	CHAR* tipString;
+} T_FotaTipStringItem;
+
+T_FotaTipStringItem g_FotaTipStringTab[] = {
+	{FOTA_DOWNLOADING, "Downloading"},
+	{FOTA_DOWNLOAD_FAILED, "Download failed"},
+	{FOTA_DOWNLOAD_OK, "Prepare to restart"},
+	{FOTA_DOWNLOAD_LOWBATTERY, "Low battery, please charge before update"},
+	{FOTA_UPDATE_SUCCESS, "Update success"},
+	{FOTA_UPDATE_FAILED, "Update failed"}
+};
+
+
+#define STRING_SSID 			"SSID:"
+#define STRING_SSID1 			"SSID1:"
+#define STRING_SSID2 			"SSID2:"
+#define STRING_WIFIKEY		 	"KEY:"
+
+//extern PLOGFONT mmi_middle_fourteen_font;
+extern PLOGFONT mmi_smallest_font;
+extern PLOGFONT mmi_small_font;
+extern PLOGFONT mmi_middle_twelve_font;
+extern PLOGFONT mmi_middle_sixteen_font;
+
+/*****************************************************************************
+ ÒýÓñäÁ¿
+******************************************************************************/
+/* ÏÔʾͼƬ*/
+//static char* g_mmi_bitmem = NULL;
+static VOID mmi_showLcdPicture(HWND hwnd, T_LcdShowInfoItem showInfo, HDC hdc)
+{
+	BITMAP tempBitmap = {0};
+	VOID * temp = malloc((UINT32)(showInfo.bitmap->bmHeight * showInfo.bitmap->bmWidth * showInfo.bitmap->bmBytesPerPixel));
+	if(temp == NULL)
+	{
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_showLcdPicture no mem!!!\n");
+		return;
+	}
+	memcpy((VOID *)temp, (const VOID *)(showInfo.bitmap->bmBits), (UINT32)(showInfo.bitmap->bmHeight * showInfo.bitmap->bmWidth * showInfo.bitmap->bmBytesPerPixel));
+	memcpy((VOID *)(&tempBitmap), (const VOID *)showInfo.bitmap, sizeof(BITMAP));
+	tempBitmap.bmBits = temp;
+	FillBoxWithBitmap(hdc, g_LcdConfigInfoTab[showInfo.item].rect.left, \
+	                  g_LcdConfigInfoTab[showInfo.item].rect.top, RECTW(g_LcdConfigInfoTab[showInfo.item].rect), \
+	                  RECTH(g_LcdConfigInfoTab[showInfo.item].rect), &tempBitmap);
+	free(temp);
+}
+
+/* ÏÔʾÎÄ×Ö*/
+static BOOL g_ssid_need_scroll = FALSE;
+static BOOL g_wifikey_need_scroll = FALSE;
+static BOOL g_ssid2_need_scroll = FALSE;
+static BOOL g_wifikey2_need_scroll = FALSE;
+//static BOOL g_ssid1_need_scroll = FALSE;
+//static BOOL g_wifikey1_need_scroll = FALSE;
+static BOOL g_main_quota_need_scroll = FALSE;
+//static BOOL g_bonus_quota_need_scroll = FALSE;
+//static BOOL g_isdn_need_scroll = FALSE;
+static BOOL g_wifista_ssid_need_scroll = FALSE;
+
+static SINT32 iPos_ssid = 0;
+static SINT32 iPos_wifikey = 0;
+static SINT32 iPos_ssid2 = 0;
+static SINT32 iPos_wifikey2 = 0;
+//static SINT32 iPos_ssid1 = 0;
+//static SINT32 iPos_wifikey1 = 0;
+static SINT32 iPos_main_quota = 0;
+//static SINT32 iPos_bonus_quota = 0;
+//static SINT32 iPos_isdn = 0;
+static SINT32 iPos_wifista_ssid = 0;
+
+SINT32 mmi_scroll_text_timer_fb()
+{
+	if (g_ssid_need_scroll || g_wifikey_need_scroll || g_ssid2_need_scroll || g_wifikey2_need_scroll/* ||g_ssid1_need_scroll || g_wifikey1_need_scroll*/) {
+		mmi_set_update_flag(MMI_TASK_SSID);
+	} else if (g_main_quota_need_scroll) {
+		mmi_set_update_flag(MMI_TASK_TRAFFIC);
+	} else if (g_wifista_ssid_need_scroll) {
+		mmi_set_update_flag(MMI_TASK_TIP_WIFISTATION);
+	}
+	return 0;
+}
+
+/*ÊÇ·ñÐèÒª¹ö¶¯ÏÔʾ*/
+BOOL isNeedScroll(T_LcdShowInfoItem showInfo)
+{
+	if (showInfo.item == LCD_SHOW_WIFI_SSID || showInfo.item == LCD_SHOW_WIFI_PASSWORD ||
+	    showInfo.item == LCD_SHOW_WIFI_SSID2 || showInfo.item == LCD_SHOW_WIFI_PASSWORD2/*||
+        showInfo.item == LCD_SHOW_WIFI_PASSWORD1 || showInfo.item == LCD_SHOW_WIFI_SSID1 */) {
+		if (showInfo.textLen > MMI_LCD_CHAR8_MAX_LEN) {
+			return TRUE;
+		}
+	} else {
+		if (showInfo.textLen > MMI_LCD_CHAR9_MAX_LEN) {
+			return TRUE;
+		}
+	}
+	return FALSE;
+}
+
+static SINT32 mmi_showWifiInfoText(T_LcdShowInfoItem showInfo, HDC hdc)
+{
+	if (isNeedScroll(showInfo)) {
+		if (showInfo.item == LCD_SHOW_WIFI_SSID) {
+			g_ssid_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT | DT_VCENTER, &iPos_ssid);
+		} else if (showInfo.item == LCD_SHOW_WIFI_PASSWORD) {
+			g_wifikey_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT | DT_VCENTER, &iPos_wifikey);
+		} else if (showInfo.item == LCD_SHOW_WIFI_SSID2) {
+			g_ssid2_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT | DT_VCENTER, &iPos_ssid2);
+		} else if (showInfo.item == LCD_SHOW_WIFI_PASSWORD2) {
+			g_wifikey2_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT | DT_VCENTER, &iPos_wifikey2);
+		}
+
+		/*else if(showInfo.item == LCD_SHOW_WIFI_SSID1)
+		{
+			g_ssid1_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT|DT_VCENTER, &iPos_ssid1);
+		}
+		else if(showInfo.item == LCD_SHOW_WIFI_PASSWORD1)
+		{
+			g_wifikey1_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT|DT_VCENTER, &iPos_wifikey1);
+		}*/
+		//#if MMI_SHOW_PAGE_THIRD_ON
+		else if (g_show_pagefirst && showInfo.item == LCD_SHOW_TRAFFIC) {
+			g_main_quota_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT | DT_VCENTER, &iPos_main_quota);
+		}
+		//#endif
+		else if (showInfo.item == LCD_SHOW_TIP_WIFISTA_SSID) {
+			g_wifista_ssid_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT | DT_VCENTER | DT_SINGLELINE, &iPos_wifista_ssid);
+		}
+		/*else if(showInfo.item == LCD_SHOW_TRAFFIC1)
+		{
+			g_bonus_quota_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT|DT_VCENTER, &iPos_bonus_quota);
+		}*/
+		mmi_startLcdShowScrollSSIDTimer(mmi_scroll_text_timer_fb);
+	} else {
+		if (showInfo.item == LCD_SHOW_WIFI_SSID) {
+			iPos_ssid = 0;
+			g_ssid_need_scroll = FALSE;
+		} else if (showInfo.item == LCD_SHOW_WIFI_PASSWORD) {
+			iPos_wifikey = 0;
+			g_wifikey_need_scroll = FALSE;
+		} else if (showInfo.item == LCD_SHOW_WIFI_SSID2) {
+			iPos_ssid2 = 0;
+			g_ssid2_need_scroll = FALSE;
+		} else if (showInfo.item == LCD_SHOW_WIFI_PASSWORD2) {
+			iPos_wifikey2 = 0;
+			g_wifikey2_need_scroll = FALSE;
+		}
+		/*else if(showInfo.item == LCD_SHOW_WIFI_SSID1)
+		{
+			iPos_ssid1 = 0;
+			g_ssid1_need_scroll = FALSE;
+		}
+		else if(showInfo.item == LCD_SHOW_WIFI_PASSWORD1)
+		{
+			iPos_wifikey1= 0;
+			g_wifikey1_need_scroll = FALSE;
+		}*/
+		//#if MMI_SHOW_PAGE_THIRD_ON
+		else if (g_show_pagefirst && showInfo.item == LCD_SHOW_TRAFFIC) { //corem
+			iPos_main_quota = 0;
+			g_main_quota_need_scroll = FALSE;
+		}
+		//#endif
+		/*else if(showInfo.item == LCD_SHOW_TRAFFIC1)
+		{
+			iPos_bonus_quota= 0;
+			g_bonus_quota_need_scroll= FALSE;
+		}*/
+		else if (showInfo.item == LCD_SHOW_TIP_WIFISTA_SSID) {
+			iPos_wifista_ssid = 0;
+			g_wifista_ssid_need_scroll = FALSE;
+		}
+		if (!g_ssid_need_scroll && !g_wifikey_need_scroll && !g_ssid2_need_scroll
+		    && !g_wifikey2_need_scroll/*&& !g_ssid1_need_scroll && !g_wifikey1_need_scroll */
+		    && !g_main_quota_need_scroll && ! g_wifista_ssid_need_scroll/*&& !g_isdn_need_scroll&& !g_bonus_quota_need_scroll*/) {
+			mmi_stopLcdShowScrollSSIDTimer();
+		}
+		DrawText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), showInfo.nFormat);
+	}
+	return 0;
+}
+static SINT32 mmi_showLcdText(HWND hwnd, T_LcdShowInfoItem showInfo, HDC hdc)
+{
+	SetBkMode(hdc, BM_TRANSPARENT);
+	SelectFont(hdc, showInfo.font);
+	if (showInfo.color != 0) {
+		SetTextColor(hdc, showInfo.color);
+	} else {
+		SetTextColor(hdc, PIXEL_lightwhite);
+	}
+
+	if (showInfo.item == LCD_SHOW_WIFI_SSID || showInfo.item == LCD_SHOW_WIFI_PASSWORD ||
+	    showInfo.item == LCD_SHOW_WIFI_SSID2 || showInfo.item == LCD_SHOW_WIFI_PASSWORD2/* || */
+
+	    //#if MMI_SHOW_PAGE_THIRD_ON
+	    /* showInfo.item == LCD_SHOW_WIFI_SSID1|| showInfo.item == LCD_SHOW_WIFI_PASSWORD1*/ ||
+	    (g_show_pagefirst && showInfo.item == LCD_SHOW_TRAFFIC)/*|| showInfo.item == LCD_SHOW_TRAFFIC1 ||*/
+	    // #endif
+	    || showInfo.item == LCD_SHOW_TIP_WIFISTA_SSID) {
+		mmi_showWifiInfoText(showInfo, hdc);
+	} else if (showInfo.item == LCD_SHOW_TIP_WPS_ACTIVE) { /* ÐèÇóÒªÇówaiting·ÅÏÂÒ»ÐоÓÖÐÏÔʾ*/
+		CHAR * iPos = NULL;
+		CHAR * sPstr = "Waiting";
+
+		if (!showInfo.text) {
+			return 0;
+		}
+		if ((iPos = strstr(showInfo.text, sPstr)) != NULL) { /* Èç¹ûÓÐwaiting,·ÖÁ½ÐÐÏÔʾ*/
+			SINT32 iLen = iPos - showInfo.text ;
+			RECT nRect;
+
+			//zOss_Printf(SUBMDL_FS, PRINT_LEVEL_ABNORMAL, "MMI mmi_showLcdText showInfo.textLen is %d,  iLen is %d\n", showInfo.textLen, iLen);
+			DrawText(hdc, showInfo.text, iLen - 1, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_CENTER);
+
+			nRect.top = g_LcdConfigInfoTab[showInfo.item].rect.bottom - 17;
+			nRect.left = g_LcdConfigInfoTab[showInfo.item].rect.left;
+			nRect.right = g_LcdConfigInfoTab[showInfo.item].rect.right;
+			nRect.bottom = g_LcdConfigInfoTab[showInfo.item].rect.bottom + 17;
+			DrawText(hdc, sPstr,  strlen(sPstr), &nRect, DT_CENTER);
+		} else {
+			DrawText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), showInfo.nFormat);
+		}
+	} else {
+		DrawText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), showInfo.nFormat);
+	}
+	return 0;
+}
+/* Ìî³ä·½¿ò*/
+static SINT32 mmi_showLcdRect(HWND hwnd, T_LcdShowInfoItem showInfo, HDC hdc)
+{
+	SetBrushColor(hdc, showInfo.color);
+	FillBox(hdc, g_LcdConfigInfoTab[showInfo.item].rect.left, g_LcdConfigInfoTab[showInfo.item].rect.top, RECTW(g_LcdConfigInfoTab[showInfo.item].rect), RECTH(g_LcdConfigInfoTab[showInfo.item].rect));
+	return 0;
+}
+
+/* »æÖÆ·½¿òÉÏÏÂÁ½ÌõÏß*/
+static SINT32 mmi_showLcdRectHLines(HWND hwnd, T_LcdShowInfoItem showInfo, HDC hdc)
+{
+	SetPenColor(hdc, showInfo.color);
+	//Draw_LineToEx(hdc, g_LcdConfigInfoTab[showInfo.item].rect.left, g_LcdConfigInfoTab[showInfo.item].rect.top, g_LcdConfigInfoTab[showInfo.item].rect.right, g_LcdConfigInfoTab[showInfo.item].rect.top);
+	//Draw_LineToEx(hdc, g_LcdConfigInfoTab[showInfo.item].rect.left, g_LcdConfigInfoTab[showInfo.item].rect.bottom - 1, g_LcdConfigInfoTab[showInfo.item].rect.right, g_LcdConfigInfoTab[showInfo.item].rect.bottom - 1);
+	Draw_Rectangle(hdc, g_LcdConfigInfoTab[showInfo.item].rect.left, g_LcdConfigInfoTab[showInfo.item].rect.top, g_LcdConfigInfoTab[showInfo.item].rect.right - 1, g_LcdConfigInfoTab[showInfo.item].rect.bottom - 1);
+	return 0;
+}
+
+/* »æÖÆË®Æ½ÃæÏßÏß*/
+static SINT32 mmi_showLcdHLines(HWND hwnd, T_LcdShowInfoItem showInfo, HDC hdc)
+{
+	SetPenColor(hdc, showInfo.color);
+	Draw_MoveTo(hdc, g_LcdConfigInfoTab[showInfo.item].rect.left, g_LcdConfigInfoTab[showInfo.item].rect.top);
+	Draw_LineTo(hdc, g_LcdConfigInfoTab[showInfo.item].rect.right, g_LcdConfigInfoTab[showInfo.item].rect.bottom);
+	return 0;
+}
+
+/* Ìî³ä±³¾°Í¼Æ¬*/
+extern BITMAP g_mmiMainBg;
+static SINT32 mmi_showLcdBackgound(HWND hwnd, T_LcdShowInfoItem showInfo, HDC hdc)
+{
+	FillBoxWithBitmap(hdc, 0, 0, 128, 128, &g_mmiMainBg);
+	return 0;
+}
+
+/* Ë¢ÐÂÆÁÄ» */
+SINT32 mmi_invalidateLcd(VOID* taskinfo)
+{
+	if (taskinfo == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_showLcd lcdInfo is null!!!\n");
+		return MMI_ERROR;
+	}
+	if (mmi_Ispoweron_state()) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_invalidateLcd poweron or poweroff now!!!\n");
+		return MMI_ERROR;
+	}
+#if 0
+	if (showInfo->type == LCD_SHOW_INVLAID) {
+		zOss_Printf(SUBMDL_FS, PRINT_LEVEL_ABNORMAL, "MMI showInfo type is LCD_SHOW_INVLAID!!!\n");
+		return MMI_ERROR;
+	}
+#endif
+#if 0
+	if (showInfo->type == LCD_SHOW_PICTURE || showInfo->type == LCD_SHOW_TEXT || showInfo->type == LCD_SHOW_RECT) {
+		wndInvalidateRect(mmi_getMainWnd(), &(showInfo->rect), FALSE);
+	} else {
+		InvalidateRect(mmi_getMainWnd(), &(showInfo->rect), FALSE);
+	}
+#endif
+	InvalidateRect(mmi_getMainWnd(), NULL, FALSE);
+	return MMI_SUCCESS;
+}
+
+/*ÏÔʾÆÁÄ»ÐÅÏ¢*/
+T_LcdShowInfoItem show_item_now = {0};
+
+SINT32 mmi_showLcdItem(T_LcdShowInfoItem showInfo, HDC hdc)
+{
+
+	show_item_now = showInfo;
+	switch (showInfo.type) {
+	case LCD_SHOW_PICTURE:
+		mmi_showLcdPicture(mmi_getMainWnd(), showInfo, hdc);
+		break;
+	case LCD_SHOW_TEXT:
+		mmi_showLcdText(mmi_getMainWnd(), showInfo, hdc);
+		break;
+	case LCD_SHOW_RECT:
+		mmi_showLcdRect(mmi_getMainWnd(), showInfo, hdc);
+		break;
+	case LCD_SHOW_BOX:
+		mmi_showLcdRectHLines(mmi_getMainWnd(), showInfo, hdc);
+		break;
+	case LCD_SHOW_BACKGROUD:
+		//mmi_showLcdBackgound(mmi_getMainWnd(), showInfo, hdc);
+		break;
+	case LCD_SHOW_HLINE:
+		mmi_showLcdHLines(mmi_getMainWnd(), showInfo, hdc);
+		break;
+	default:
+		break;
+	}
+	return MMI_SUCCESS;
+}
+
+BOOL mmi_iswificodeItem(E_LCD_SHOW_CONTENT_ITEM item)
+{
+	if (g_show_pagethird)
+		return (item == LCD_SHOW_WIFI_CODE);
+
+	else
+		return FALSE;
+}
+BOOL mmi_isItemNeedShow(E_LCD_SHOW_CONTENT_ITEM item)
+{
+	if (mmi_get_lcd_page_index() == MMI_SHOW_PAGE_THIRD) { //&& mmi_get_wps_switch_flag() == TRUE)
+		return mmi_iswificodeItem(item);
+	} else {
+		return !mmi_iswificodeItem(item);
+	}
+}
+
+
+void mmi_lcd_backlight_start(void)
+{
+	send_soc_msg(NEAR_PS, MODULE_ID_AT_CTL, MSG_CMD_AT_FILTER_REQ, 0, NULL);
+
+	slog(MMI_PRINT, SLOG_NORMAL, "[TEST]mmi_lcd_backlight_start\n");
+
+	tp_man_lcd_backlight_start(255);
+}
+
+
+void mmi_lcd_backlight_end(void)
+{
+	char indNeedAt[AT_CMD_MAX] = "+ZMMI+ZURDY+ZUSLOT+ZICCID^MODE+ZPBIC+ZMSRI+CREG+CEREG+CGREG+CGEV+ZGIPDNS^DSCI+ZCPI+CMT+CMTI+CDS+CDSI";
+
+	slog(MMI_PRINT, SLOG_NORMAL, "[TEST]mmi_lcd_backlight_end\n");
+
+	send_soc_msg(NEAR_PS, MODULE_ID_AT_CTL, MSG_CMD_AT_FILTER_REQ, strlen(indNeedAt), indNeedAt);
+
+	tp_man_lcd_backlight_end();
+}
+
+/*ÏÔʾÆÁÄ»ÐÅÏ¢*/
+SINT32 mmi_showLcd(HDC hdc)
+{
+	UINT32  i = 0;
+	mmi_getMutex(&g_mmi_refresh_lcd_mutex);
+	if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+		mmi_showLcdItem(g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER], hdc);
+	} else {
+		for (i = 0; i < sizeof(g_LcdShowInfoTab) / sizeof(T_LcdShowInfoItem); ++ i) {
+			if (!mmi_isItemNeedShow(g_LcdShowInfoTab[i].item)) {
+				continue;
+			}
+			if (g_LcdShowInfoTab[i].needShowFL && g_LcdShowInfoTab[i].needShow && g_LcdShowInfoTab[i].type != LCD_SHOW_INVLAID) {
+				mmi_showLcdItem(g_LcdShowInfoTab[i], hdc);
+			}
+		}
+	}
+	zCore_Set_SkipUpdateflag(FALSE);
+	mmi_putMutex(&g_mmi_refresh_lcd_mutex);
+	return 0;
+}
+
+VOID mmi_set_poweroff_charge_show(BOOL showflag)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "mmi_set_poweroff_charge_show\n");
+	g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].needShow = showflag;
+}
+static VOID mmi_setPowerOffAniInfo(E_zMmi_Work_Mode mode)
+{
+	tp_man_Lcd_Sleep_Exit();
+	mmi_lcd_backlight_start();
+	switch (mode) {
+	case MMI_POWEROFF_MODE:
+		mmi_startPowerOffFrame();
+		break;
+	case MMI_RESET_MODE:
+		mmi_startPowerResetFrame();
+		break;
+	case MMI_RESTART_MODE:
+		mmi_startPowerRestartFrame();
+		break;
+	default:
+		break;
+	}
+}
+SINT32 mmi_getLcdCtrlInfo(UINT32 taskInfo)
+{
+	E_zMmi_Work_Mode workMode = *(E_zMmi_Work_Mode*)taskInfo;
+	switch (workMode) {
+	case MMI_POWERON_MODE:
+		mmi_startPowerOnFrame();
+		break;
+	case MMI_FAST_POWERON_MODE:
+		tp_man_Lcd_Sleep_Exit();
+		mmi_setMainWindToBg();
+		mmi_startFastPowerOnFrame();
+		mmi_set_lcd_page_index(MMI_SHOW_PAGE_SECOND);
+		mmi_lcd_backlight_start();
+		break;
+	/*case MMI_POWEROFF_MODE:
+		//tp_man_Lcd_Sleep_Exit();
+		//tp_man_lcd_backlight_start(255);
+		mmi_startPowerOffFrame();
+		break;
+	case MMI_RESET_MODE:
+		mmi_startPowerResetFrame();
+		break;
+	case MMI_RESTART_MODE:
+		mmi_startPowerRestartFrame();
+		break;*/
+	case MMI_BACKLIGHT_HALFBRIGHT_MODE:
+		tp_man_lcd_set_brightness(32);
+		break;
+	case MMI_BACKLIGHT_OFF_MODE:
+	case MMI_FAKE_POWEROFF_MODE:
+		mmi_setMainWindToBg();//¹Ø±³¹âǰ½«ÆÁĻˢºÚ
+		mmi_lcd_backlight_end();
+		tp_man_Lcd_Sleep_Enter();
+		set_wake_unlock(MMI_MAIN_LOCK_ID);
+		break;
+	case MMI_ACTIVE_MODE:
+	case MMI_FAKE_POWEROFF_CHARGE_MODE:
+		tp_man_Lcd_Sleep_Exit();
+		mmi_lcd_backlight_start();
+		break;
+	default:
+		break;
+	}
+	if (workMode == MMI_POWEROFF_MODE || workMode == MMI_RESET_MODE || workMode == MMI_RESTART_MODE) {
+		mmi_setPowerOffAniInfo(workMode);
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_getBitmapFromFile(PBITMAP pdesBitmap, CHAR* path, PBITMAP psrcBitmap, BOOL isNeedReload)
+{
+	CHAR * sPstr[2] = {"/", "\\"};
+	CHAR sPath[64] = {0};
+	CHAR *iPos = NULL;
+	int i = 0;
+	SINT32 ret = -1;
+	BITMAP tempBitmap = {0};
+	BITMAP tempBitmapFree = {0};
+
+	for (i = 0; i < 2; i++) {
+		if ((iPos = strstr(path, sPstr[i])) != NULL)
+			break;
+	}
+	if (iPos == NULL) {
+		//strcpy(sPath, MMI_RESOURCE_PATH);
+		//strcat(sPath, path);
+		snprintf(sPath, sizeof(sPath), MMI_RESOURCE_PATH"%s", path);
+	} else {
+		strncpy(sPath, path, sizeof(sPath)-1);
+	}
+
+	if (psrcBitmap == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_getBitmapFromFile psrcBitmap=NULL!!\n");
+		return -1;
+	}
+
+	if (!isNeedReload && psrcBitmap->bmBits != NULL) {
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getBitmapFromFile memcpy ,path:%s!!!\n", path);
+		memcpy((VOID *)pdesBitmap, (const VOID *)psrcBitmap, sizeof(BITMAP));
+		return 0;
+	} else {
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getBitmapFromFile reload ,path:%s!!!\n", path);
+		if (!isNeedReload) {
+			ret = LoadBitmapFromFile(HDC_SCREEN, psrcBitmap, sPath);
+			if (ret != 0) {
+				slog(MMI_PRINT, SLOG_ERR, "MMI load bitmap failed path:%s!!!\n", path);
+			}
+			memcpy((VOID *)pdesBitmap, (const VOID *)psrcBitmap, sizeof(BITMAP));
+		} else {
+			memcpy((VOID *)(&tempBitmapFree), (const VOID *)pdesBitmap, sizeof(BITMAP));
+			ret = LoadBitmapFromFile(HDC_SCREEN, &tempBitmap, sPath);
+			if (ret != 0) {
+				slog(MMI_PRINT, SLOG_ERR, "MMI load bitmap failed path:%s!!!\n", path);
+			}
+			memcpy((VOID *)pdesBitmap, (const VOID *)(&tempBitmap), sizeof(BITMAP));
+			UnloadBitmap(&tempBitmapFree);
+		}
+		return ret;
+	}
+}
+
+#if 1
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡¶ÌÐÅlcdÏÔʾÐÅÏ¢
+***********************************************************************************/
+static BOOL g_LastNewSmsHasShow = FALSE;
+static BOOL g_LastFullSmsHasShow = FALSE;
+
+VOID mmi_getLcdSmsNewInfo(SINT32 smsUnreadCount)
+{
+	if (smsUnreadCount > 0) {
+		g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_PICTURE;
+		if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_SMS].bitmap, g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_NEW].path,
+		                          &g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_NEW].bmp, g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_NEW].isNeedReload) != 0)
+
+		{
+			g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_INVLAID;
+		}
+
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].type = LCD_SHOW_TEXT;
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].font = mmi_smallest_font;
+		memset(g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].text, 0, MMI_LCD_SHOW_STRING_LEN);
+		//sprintf(g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].text, "58");
+		sprintf(g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].text, "%d", smsUnreadCount);
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].text);
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].color = PIXEL_red;
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].needShow = TRUE;
+	} else {
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].type = LCD_SHOW_INVLAID;
+		g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_INVLAID;
+	}
+}
+
+VOID mmi_getLcdSmsUnreadInfo(SINT32 smsUnreadCount)
+{
+	if (smsUnreadCount > 0) {
+		g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_PICTURE;
+		if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_SMS].bitmap, g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_UNREAD].path,
+		                          &g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_UNREAD].bmp, g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_UNREAD].isNeedReload) != 0) {
+			g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_INVLAID;
+		}
+
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].type = LCD_SHOW_TEXT;
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].font = mmi_smallest_font;
+		memset(g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].text, 0, MMI_LCD_SHOW_STRING_LEN);
+		sprintf(g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].text, "%d", smsUnreadCount);
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].text);
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].color = PIXEL_red;
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].needShow = TRUE;
+	} else {
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].type = LCD_SHOW_INVLAID;
+		g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_INVLAID;
+	}
+}
+
+VOID mmi_getLcdSmsFullInfo()
+{
+	g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].needShow = FALSE;
+	g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_PICTURE;
+	if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_SMS].bitmap, g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_FULL].path,
+	                          &g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_FULL].bmp, g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_FULL].isNeedReload) != 0) {
+		g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_INVLAID;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getLcdSmsFullInfo LastFullSmsHasShow==false!!!\n");
+}
+
+SINT32 mmi_getLcdSmsInfo(UINT32 taskInfo)
+{
+	T_zMmi_Sms_Info *pSmsInfo = (T_zMmi_Sms_Info*)taskInfo;
+	SINT32 smsUnreadNum = pSmsInfo->mSmsNum;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getLcdSmsInfo status = %d!!!", pSmsInfo->recvBox_sta);
+	switch (pSmsInfo->recvBox_sta) {
+	case SMS_RECVBOX_STATUS_UNREAD:
+		mmi_getLcdSmsUnreadInfo(smsUnreadNum);
+		break;
+	case SMS_RECVBOX_STATUS_NEW:
+		mmi_getLcdSmsNewInfo(smsUnreadNum);
+		break;
+	case SMS_RECVBOX_STATUS_FULL:
+		mmi_getLcdSmsFullInfo();
+		break;
+	default:
+		g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_INVLAID;
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].type = LCD_SHOW_INVLAID;
+		break;
+	}
+	return MMI_SUCCESS;
+}
+#endif
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡µç³ØlcdÏÔʾÐÅÏ¢
+***********************************************************************************/
+static BOOL g_LastNullBatteryHasShow = FALSE;
+static VOID mmi_getLcdBatteryLowInfo(T_zMMIBatteryInfo *pBatteryInfo)
+{
+	if (pBatteryInfo->bat_grid == 0) { //0-5%,ÐèÇóÒªÇóСµÈÓÚ5£¬ÏÔʾºì¿ò0¸ñ
+		mmi_startLcdBatteryTimer((SINT32)MMI_TASK_BATTERY);
+		if (!g_LastNullBatteryHasShow) {
+			g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = g_LcdConfigInfoTab[LCD_SHOW_BATTERY].type;
+			if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_BATTERY].bitmap, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_NULL].path,
+			                          &g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_NULL].bmp, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_NULL].isNeedReload) != 0) {
+				g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = LCD_SHOW_INVLAID;
+			}
+			g_LastNullBatteryHasShow = TRUE;
+		} else {
+			g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = LCD_SHOW_BACKGROUD;
+			g_LastNullBatteryHasShow = FALSE;
+		}
+	} else if (pBatteryInfo->bat_grid == 1) { //5%-25%ÐèÇóÒªÇó5-25£¬ÏÔʾºìÉ«1¸ñ
+		g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = g_LcdConfigInfoTab[LCD_SHOW_BATTERY].type;
+		if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_BATTERY].bitmap, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_LOWER].path,
+		                          &g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_LOWER].bmp, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_LOWER].isNeedReload) != 0) {
+			g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = LCD_SHOW_INVLAID;
+		}
+
+	}
+}
+
+static VOID mmi_innerGetLcdBatteryCharinginfo(SINT32 task, T_LcdShowInfoItem* item)
+{
+	item->type = LCD_SHOW_PICTURE;
+	if (item->last < E_BATTERY_LEVEL_0 || item->last >= E_BATTERY_LEVEL_4) {
+		item->last = E_BATTERY_LEVEL_0;
+	} else {
+		(item->last)++;
+	}
+	if (task == MMI_TASK_POWEROFF_CHARGER || mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+		if (mmi_getBitmapFromFile(item->bitmap, g_lcdPowerOffBatteryConfigInfo[item->last].path,
+		                          &g_lcdPowerOffBatteryConfigInfo[item->last].bmp, g_lcdPowerOffBatteryConfigInfo[item->last].isNeedReload) != 0) {
+			item->type = LCD_SHOW_INVLAID;
+		}
+	} else {
+		if (mmi_getBitmapFromFile(item->bitmap, g_lcdBatteryConfigInfo[item->last].path,
+		                          &g_lcdBatteryConfigInfo[item->last].bmp, g_lcdBatteryConfigInfo[item->last].isNeedReload) != 0) {
+			item->type = LCD_SHOW_INVLAID;
+		}
+	}
+	mmi_startLcdBatteryTimer(task);
+}
+static VOID mmi_getLcdBatteryCharinginfo()
+{
+	g_LcdShowInfoTab[LCD_SHOW_POWER].needShow = FALSE;
+	if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+		mmi_innerGetLcdBatteryCharinginfo(MMI_TASK_BATTERY, &(g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER]));
+	} else {
+		mmi_innerGetLcdBatteryCharinginfo(MMI_TASK_BATTERY, &(g_LcdShowInfoTab[LCD_SHOW_BATTERY]));
+	}
+
+}
+
+static VOID mmi_innerGetLcdBatteryFullinfo(T_LcdShowInfoItem* item)
+{
+	item->type = LCD_SHOW_PICTURE;
+	if (item->item == LCD_SHOW_POWER_OFF_CHARGER) {
+		if (mmi_getBitmapFromFile(item->bitmap, g_lcdPowerOffBatteryConfigInfo[E_BATTERY_LEVEL_4].path,
+		                          &g_lcdPowerOffBatteryConfigInfo[E_BATTERY_LEVEL_4].bmp, g_lcdPowerOffBatteryConfigInfo[E_BATTERY_LEVEL_4].isNeedReload) != 0) {
+			item->type = LCD_SHOW_INVLAID;
+		}
+	} else {
+		if (mmi_getBitmapFromFile(item->bitmap, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_4].path,
+		                          &g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_4].bmp, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_4].isNeedReload) != 0)
+
+		{
+			item->type = LCD_SHOW_INVLAID;
+		}
+	}
+}
+
+static VOID mmi_innerGetLcdOverVoltageinfo(T_LcdShowInfoItem* item)
+{
+	item->type = LCD_SHOW_PICTURE;
+	if (mmi_getBitmapFromFile(item->bitmap, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_OVERVOL].path,
+	                          &g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_OVERVOL].bmp, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_OVERVOL].isNeedReload) != 0) {
+		item->type = LCD_SHOW_INVLAID;
+	}
+}
+static VOID mmi_getLcdBatteryFullinfo(T_zMMIBatteryInfo *pBatteryInfo)
+{
+	if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+		mmi_innerGetLcdBatteryFullinfo(&(g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER]));
+	} else {
+		mmi_innerGetLcdBatteryFullinfo(&(g_LcdShowInfoTab[LCD_SHOW_BATTERY]));
+	}
+}
+
+static VOID mmi_getLcdBatteryNormalinfo(T_zMMIBatteryInfo *pBatteryInfo)
+{
+	g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = g_LcdConfigInfoTab[LCD_SHOW_BATTERY].type;
+
+	if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_BATTERY].bitmap, g_lcdBatteryConfigInfo[pBatteryInfo->bat_grid + E_BATTERY_LEVEL_0].path,
+	                          &g_lcdBatteryConfigInfo[pBatteryInfo->bat_grid + E_BATTERY_LEVEL_0].bmp, g_lcdBatteryConfigInfo[pBatteryInfo->bat_grid + E_BATTERY_LEVEL_0].isNeedReload) != 0) {
+		g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = LCD_SHOW_INVLAID;
+	}
+}
+
+SINT32 mmi_getLcdBatteryInfo(UINT32 taskInfo)
+{
+	T_zMMIBatteryInfo *pBatteryInfo = (T_zMMIBatteryInfo *)taskInfo;
+	g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = LCD_SHOW_INVLAID;
+	mmi_stopLcdBatteryTimer();
+	switch (pBatteryInfo->chg_state) {
+	case STATE_CHARGING://charging
+		mmi_getLcdBatteryCharinginfo();
+		break;
+	case STATE_FULL://full
+		mmi_getLcdBatteryFullinfo(pBatteryInfo);
+		break;
+	case STATE_DISCHARGE: { //discharge
+		if (pBatteryInfo->bat_level == VOLT_5PERCENTLEVEL || pBatteryInfo->bat_level == VOLT_10PERCENTLEVEL
+		    || pBatteryInfo->bat_level == VOLT_20PERCENTLEVEL || pBatteryInfo->bat_level == VOLT_25PERCENTLEVEL) {
+			mmi_getLcdBatteryLowInfo(pBatteryInfo);
+		} else {
+			mmi_getLcdBatteryNormalinfo(pBatteryInfo);
+		}
+		break;
+	}
+	case STATE_CHARGERROR:
+		break;
+	default:
+		break;
+	}
+	return MMI_SUCCESS;
+}
+SINT32 mmi_getLcdPowerInfo(UINT32 taskInfo)
+{
+	T_zMMIBatteryInfo *pBatteryInfo = (T_zMMIBatteryInfo *)taskInfo;
+	g_LcdShowInfoTab[LCD_SHOW_POWER].type = LCD_SHOW_TEXT;
+	if (!mmi_getFotaNewVersionInfo()) {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_NEW_VERSION].needShow = FALSE;
+		if (pBatteryInfo->chg_state != STATE_CHARGING) {
+			g_LcdShowInfoTab[LCD_SHOW_POWER].needShow = TRUE;
+		}
+		g_LcdShowInfoTab[LCD_SHOW_POWER].font = mmi_small_font;
+		sprintf(g_LcdShowInfoTab[LCD_SHOW_POWER].text, "%d\%%", pBatteryInfo->bat_pers);
+		g_LcdShowInfoTab[LCD_SHOW_POWER].textLen = 0;
+		if (g_LcdShowInfoTab[LCD_SHOW_POWER].text != NULL) {
+			g_LcdShowInfoTab[LCD_SHOW_POWER].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_POWER].text);
+		}
+	}
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡wifiStationÁ¬½ÓʱlcdÏÔʾͼƬµÄ·¾¶ÐÅÏ¢  (СͼƬ»º´æÐÞ¸Äʱ ¸ÄΪ·µ»ØË÷Òý)
+***********************************************************************************/
+
+UINT32 mmi_getLcdWifiStationPicturePathFromWifiStationInfo(T_zMMIWifiStationInfo * wifistationInfo)
+{
+	UINT32 i = 0;
+	for (i = 0; i < sizeof(g_lcdWifiStationConfigInfoTab) / sizeof(T_WifiStationConfigInfo); ++ i) {
+		if (wifistationInfo->signal_num == g_lcdWifiStationConfigInfoTab[i].sigLevel) {
+			break;
+		}
+	}
+	return i;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÍøÂçlcdÏÔʾÐÅÏ¢
+***********************************************************************************/
+
+UINT32 mmi_getLcdNetPicturePathFromNetInfo(T_zMMINetInfo * netInfo)
+{
+	UINT32 i = 0;
+	for (i = 0; i < sizeof(g_lcdNetSignalConfigInfoTab) / sizeof(T_NetSignalConfigInfo); ++ i) {
+		if (netInfo->net_mode == NET_MODE_NOSERVICE || netInfo->net_mode == NET_MODE_LIMITSERVICE || netInfo->net_mode == NET_MODE_DEFAULT) {
+			if (netInfo->net_mode == g_lcdNetSignalConfigInfoTab[i].netMode) {
+				break;
+			}
+		} else {
+			if (netInfo->net_mode == g_lcdNetSignalConfigInfoTab[i].netMode && netInfo->signal_num == g_lcdNetSignalConfigInfoTab[i].sigLevel &&
+			    netInfo->roam_mode == g_lcdNetSignalConfigInfoTab[i].isRoam) {
+				break;
+			}
+		}
+	}
+	return i;
+}
+SINT32 mmi_getLcdNetInfo(UINT32 taskInfo)
+{
+	T_zMMINetInfo * pNetInfo = (T_zMMINetInfo *)taskInfo;
+	UINT32 nettab_index = 0;
+
+	g_LcdShowInfoTab[LCD_SHOW_NET_SIGNAL].type = LCD_SHOW_INVLAID;
+	g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].type = LCD_SHOW_INVLAID;
+	g_LcdShowInfoTab[LCD_SHOW_NET_SIGNAL].needShow = TRUE;
+
+	nettab_index = mmi_getLcdNetPicturePathFromNetInfo(pNetInfo);
+	if (nettab_index >= sizeof(g_lcdNetSignalConfigInfoTab) / sizeof(T_NetSignalConfigInfo))
+		return MMI_ERROR;
+
+	if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_NET_SIGNAL].bitmap, g_lcdNetSignalConfigInfoTab[nettab_index].path,
+	                          &g_lcdNetSignalConfigInfoTab[nettab_index].bmp, g_lcdNetSignalConfigInfoTab[nettab_index].isNeedReload) == 0) {
+		g_LcdShowInfoTab[LCD_SHOW_NET_SIGNAL].type = LCD_SHOW_PICTURE;
+	}
+	if (pNetInfo->connect_status == 1 && pNetInfo->net_mode != NET_MODE_NOSERVICE && pNetInfo->net_mode != NET_MODE_LIMITSERVICE) { //e58
+		g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].needShow = FALSE;
+		g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].needShow = TRUE;
+
+		if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].bitmap, g_lcdNetConnectPicPath, &g_lcdNetConnectBmp, FALSE) == 0) {
+			g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].type = LCD_SHOW_PICTURE;
+		}
+	} else {
+		g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].needShow = FALSE;
+		g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].type = LCD_SHOW_INVLAID;
+		if (mmi_get_wifiStationConnect_state()) {
+			g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].needShow = TRUE;
+		}
+	}
+
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:ÉèÖÃLCDÖв¿ÏÔʾÏî
+***********************************************************************************/
+E_LCD_SHOW_CONTENT_ITEM g_mmi_cur_show_item = LCD_SHOW_MAX;
+
+static BOOL mmi_IsShowSimState(VOID)
+{
+	E_zMmi_Sim_Tip sim_sta = mmi_getSIMStateInfo();
+	return (sim_sta == INSERT_SIM || sim_sta == SIM_BUSY || sim_sta == PIN_LOCK || sim_sta == PUK_LOCK || sim_sta == SIM_LOCK || sim_sta == INVALID_SIM) ? TRUE : FALSE;
+}
+
+static BOOL mmi_IsShowNetPro(VOID)
+{
+	E_zMmi_NetCon_Tip net_sta = mmi_getNetConInfo();
+	return (net_sta != NET_MAX && net_sta != NET_SEARCHING && net_sta != NET_NOSERVICE
+	        && net_sta != NET_LIMITSERVICE && net_sta != NET_DISCONNECTING && net_sta != NET_CONNECTING) ? TRUE : FALSE;
+}
+
+static VOID mmi_set_middle_current_show(E_LCD_SHOW_CONTENT_ITEM item)
+{
+	g_LcdShowInfoTab[item].needShow = TRUE;
+	g_mmi_cur_show_item = item;
+
+}
+static VOID mmi_set_middle_needshow()
+{
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].needShow = FALSE;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].needShow = FALSE;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WPS_ACTIVE].needShow = FALSE;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_SIM_STATE].needShow = FALSE;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].needShow = FALSE;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_CONNECTING].needShow = FALSE;
+	E_zMmi_WpsAct_Tip wps_sta = mmi_get_wps_state();
+	E_zMMI_Fota_Tip  fota_sta = (E_zMMI_Fota_Tip)mmi_getFotaUpdateStateInfo();
+
+	if (wps_sta == WPS_ACTIVE_MAX && (fota_sta == FOTA_MAX || fota_sta == FOTA_SHOW_FINISH)) {
+
+		if (mmi_get_wifiStationConnect_state()) {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_middle_needshow show wifiSta!!\n");
+			mmi_set_middle_current_show(LCD_SHOW_TIP_WIFISTA_SSID);
+		} else if (mmi_IsShowSimState()) {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_middle_needshow show SIM!!\n");
+			mmi_set_middle_current_show(LCD_SHOW_TIP_SIM_STATE);
+		} else if (mmi_IsShowNetPro()) {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_middle_needshow show netpro!!\n");
+			mmi_set_middle_current_show(LCD_SHOW_TIP_NET_PROVIDER);
+		} else {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_middle_needshow show netcon!!\n");
+			mmi_set_middle_current_show(LCD_SHOW_TIP_NET_CONNECTING);
+		}
+	} else {
+		if (wps_sta != WPS_ACTIVE_MAX) {
+			if (fota_sta != FOTA_MAX && fota_sta != FOTA_SHOW_FINISH && g_mmi_cur_show_item == LCD_SHOW_TIP_WPS_ACTIVE) {
+				slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_middle_needshow WPS show FOTA!!\n");
+				mmi_set_middle_current_show(LCD_SHOW_TIP_UPDATE_INFO);
+			} else {
+				slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_middle_needshow show WPS!!\n");
+				mmi_set_middle_current_show(LCD_SHOW_TIP_WPS_ACTIVE);
+			}
+		} else {
+			//kw 3
+			//if (wps_sta != WPS_ACTIVE_MAX && g_mmi_cur_show_item == LCD_SHOW_TIP_UPDATE_INFO) {
+			//	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_middle_needshow FOTA show WPS!!\n");
+			//	mmi_set_middle_current_show(LCD_SHOW_TIP_WPS_ACTIVE);
+			//} else 
+			{
+				slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_middle_needshow show FOTA!!\n");
+				mmi_set_middle_current_show(LCD_SHOW_TIP_UPDATE_INFO);
+			}
+		}
+	}
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡WIFI¶þάÂëÏÔʾÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLcdWifiCodeInfo(UINT32 taskInfo)
+{
+	T_zMMIWifiCodeInfo *pWifiCodeInfo = (T_zMMIWifiCodeInfo *)taskInfo;
+
+	if (g_show_pagethird) {
+		g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE].type = LCD_SHOW_INVLAID;
+		if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE].bitmap, g_lcdWifiCodeConfigInfoTab[0].path,
+		                          &g_lcdWifiCodeConfigInfoTab[0].bmp, g_lcdWifiCodeConfigInfoTab[0].isNeedReload) == 0) {
+			g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE].needShow = TRUE;
+			g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE].type = LCD_SHOW_PICTURE;
+		}
+	}
+
+	if (pWifiCodeInfo->multi_ssid_switch) {
+		g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE2].type = LCD_SHOW_INVLAID;
+		if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE2].bitmap, g_lcdWifiCodeConfigInfoTab[1].path,
+		                          &g_lcdWifiCodeConfigInfoTab[1].bmp, g_lcdWifiCodeConfigInfoTab[1].isNeedReload) == 0) {
+			g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE2].needShow = TRUE;
+			g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE2].type = LCD_SHOW_PICTURE;
+		}
+	}
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡WIFI STATIONÏÔʾÐÅÏ¢
+***********************************************************************************/
+static VOID mmi_setLcdWifiStationSSID(CHAR *sta_ssid)
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_getLcdWifiStationSSID sta_ssid=%s!!\n", sta_ssid);
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].type = LCD_SHOW_TEXT;
+	memset(g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].text, 0, MMI_LCD_SHOW_STRING_LEN);
+	strncpy(g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].text, sta_ssid, MMI_LCD_SHOW_STRING_LEN);
+	if (g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].text != NULL) {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].text);
+	}
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].font = mmi_middle_sixteen_font;
+
+	mmi_set_middle_needshow();
+}
+
+SINT32 mmi_getLcdWifiStationInfo(UINT32 taskInfo)//wifistation
+{
+	T_zMMIWifiStationInfo *pWifiStationInfo = (T_zMMIWifiStationInfo *)taskInfo;
+	UINT32 wifistatab_index = 0;
+	BOOL modemConnectState = mmi_net_connected();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getLcdWifiStationInfo pWifiStationInfo->wifistation_connect_state= %d ssid=%s!!\n", pWifiStationInfo->wifistation_connect_state, pWifiStationInfo->wifista_ssid);
+
+	wifistatab_index = mmi_getLcdWifiStationPicturePathFromWifiStationInfo(pWifiStationInfo);
+	if (wifistatab_index >= sizeof(g_lcdWifiStationConfigInfoTab) / sizeof(T_WifiStationConfigInfo))
+		return MMI_ERROR;
+
+	if (modemConnectState) {
+		g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].needShow = TRUE;
+		g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].needShow = FALSE;
+	} else {
+		g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].needShow = FALSE;
+		if (pWifiStationInfo->wifistation_connect_state) {
+			g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].needShow = TRUE;
+		} else {
+			g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].needShow = FALSE;
+		}
+	}
+	if (pWifiStationInfo->wifistation_connect_state) {
+		if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].bitmap, g_lcdWifiStationConfigInfoTab[wifistatab_index].path,
+		                          &g_lcdWifiStationConfigInfoTab[wifistatab_index].bmp, g_lcdWifiStationConfigInfoTab[wifistatab_index].isNeedReload) == 0) {
+			g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].type = LCD_SHOW_PICTURE;
+		} else {
+			g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].type = LCD_SHOW_INVLAID;
+		}
+	}
+
+	mmi_setLcdWifiStationSSID(pWifiStationInfo->wifista_ssid);
+	return MMI_SUCCESS;
+}
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡WIFIlcdÏÔʾÐÅÏ¢
+***********************************************************************************/
+UINT32 mmi_getLcdWifiPicturePathFromWifiInfo(T_zMMIWifiInfo * wifiInfo)
+{
+	UINT32 i = 0;
+	for (i = 0; i < sizeof(g_lcdWifiConfigInfoTab) / sizeof(T_WifiConfigInfo); ++ i) {
+		if (g_lcdWifiConfigInfoTab[i].wifiState == wifiInfo->wifi_state &&
+		    g_lcdWifiConfigInfoTab[i].connected_userNum == wifiInfo->connected_userNum) {
+			return i;
+		}
+	}
+	return 0;
+}
+SINT32 mmi_getLcdWifiInfo(UINT32 taskInfo)
+{
+	T_zMMIWifiInfo * pWifiInfo = (T_zMMIWifiInfo *)taskInfo;
+	UINT32 wifitab_index = 0;
+
+	wifitab_index = mmi_getLcdWifiPicturePathFromWifiInfo(pWifiInfo);
+	g_LcdShowInfoTab[LCD_SHOW_WIFI].type = LCD_SHOW_INVLAID;
+
+	if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_WIFI].bitmap, g_lcdWifiConfigInfoTab[wifitab_index].path,
+	                          &g_lcdWifiConfigInfoTab[wifitab_index].bmp, g_lcdWifiConfigInfoTab[wifitab_index].isNeedReload) == 0) {
+		g_LcdShowInfoTab[LCD_SHOW_WIFI].type = LCD_SHOW_PICTURE;
+	}
+
+	return MMI_SUCCESS;
+}
+
+#define MMI_IS_VALID_TRAFFIC_NUM(num) (num >= 0 && num <= 0xFFFFFFFF)
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡Á÷Á¿lcdÏÔʾÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLcdTrafficInfo(UINT32 taskInfo)
+{
+	T_zMMITrafficInfo *pTrafficInfo = (T_zMMITrafficInfo *)taskInfo;
+
+	if (!g_show_pagefirst) {
+		return MMI_SUCCESS;
+	}
+
+	g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].type = LCD_SHOW_TEXT;
+	g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_BAR].type = LCD_SHOW_INVLAID;
+	g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_SLIDER].type = LCD_SHOW_INVLAID;
+	g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_WARING].type = LCD_SHOW_INVLAID;
+	g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_BAR].needShow = TRUE;
+	g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].needShow = TRUE;
+
+	//sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%s\MB", pTrafficInfo->quota);
+	//g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text);
+	//g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].font = mmi_middle_fourteen_font;
+	g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].font = mmi_middle_twelve_font;
+
+
+	if (MMI_IS_VALID_TRAFFIC_NUM(pTrafficInfo->uesd_traffic) && MMI_IS_VALID_TRAFFIC_NUM(pTrafficInfo->total_traffic)
+	    /*&&pTrafficInfo->uesd_traffic <=  pTrafficInfo->total_traffic*/) {
+		memset(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, 0, MMI_LCD_SHOW_STRING_LEN);
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getLcdTrafficInfo unit = %d!\n", pTrafficInfo->traffic_unit);
+		if (pTrafficInfo->traffic_unit == TRAFFIC_UNIT_DATA) {
+			if (pTrafficInfo->traffic_switch == TRAFFIC_LIMIT_SWITCH_OFF) {
+				if (pTrafficInfo->useddata_unit == TRAFFIC_DATA_UNIT_MB) {
+					sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%.2f\M/--", pTrafficInfo->uesd_traffic);
+				} else if (pTrafficInfo->useddata_unit == TRAFFIC_DATA_UNIT_GB) {
+					sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%.2f\G/--", pTrafficInfo->uesd_traffic);
+				} else if (pTrafficInfo->useddata_unit == TRAFFIC_DATA_UNIT_TB) {
+					sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%.2f\T/--", pTrafficInfo->uesd_traffic);
+				}
+			} else {
+				if (pTrafficInfo->data_unit == TRAFFIC_DATA_UNIT_MB) {
+					sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%.2f\M/%.2f\M", pTrafficInfo->uesd_traffic, pTrafficInfo->total_traffic);
+				} else if (pTrafficInfo->data_unit == TRAFFIC_DATA_UNIT_GB) {
+					sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%.2f\G/%.2f\G", pTrafficInfo->uesd_traffic, pTrafficInfo->total_traffic);
+				} else if (pTrafficInfo->data_unit == TRAFFIC_DATA_UNIT_TB) {
+					sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%.2f\T/%.2f\T", pTrafficInfo->uesd_traffic, pTrafficInfo->total_traffic);
+				}
+			}
+		} else if (pTrafficInfo->traffic_unit == TRAFFIC_UNIT_TIME) {
+			sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%.2f\hr/%.2f\hr", pTrafficInfo->uesd_traffic, pTrafficInfo->total_traffic);
+		}
+
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text);
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].nFormat = DT_RIGHT;
+
+		if (pTrafficInfo->traffic_switch == TRAFFIC_LIMIT_SWITCH_ON) {
+			g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_WARING].needShow = TRUE;
+			g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_WARING].type = LCD_SHOW_RECT;
+			g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_WARING].color = PIXEL_red;
+
+			g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_SLIDER].needShow = TRUE;
+			g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_SLIDER].type = LCD_SHOW_RECT;
+
+			if (pTrafficInfo->total_traffic > 0) { //kw 3
+				if (pTrafficInfo->uesd_traffic > pTrafficInfo->total_traffic) {
+					g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_SLIDER].color = PIXEL_red;
+					g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_SLIDER].rect.right = g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_SLIDER].rect.left + \
+					        RECTW(g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_BAR].rect);
+				} else {
+					g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_SLIDER].color = RGBA2Pixel(HDC_SCREEN, 0, 0xff, 0, 0xff);//PIXEL_green;
+					g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_SLIDER].rect.right = g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_SLIDER].rect.left + \
+					        RECTW(g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_BAR].rect) * pTrafficInfo->uesd_traffic / pTrafficInfo->total_traffic;
+				}
+			}
+			g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_WARING].rect.left = g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_BAR].rect.left + \
+			        pTrafficInfo->warning_tip_level * RECTW(g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_BAR].rect) / 100;
+			g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_WARING].rect.right = g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_WARING].rect.left + 1;
+
+		} else {
+			g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_WARING].needShow = FALSE;
+			g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_SLIDER].needShow = FALSE;
+		}
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_BAR].type = LCD_SHOW_BOX;
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_BAR].color = PIXEL_lightwhite;
+
+	} else {
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI  used trffic = %f, total traffic =%f!!!", pTrafficInfo->uesd_traffic, pTrafficInfo->total_traffic);
+		memset(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, 0, MMI_LCD_SHOW_STRING_LEN);
+		sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%s", "get traffic failed");
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text);
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].nFormat = DT_CENTER;
+	}
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡¹Ø»ú³äµçlcdÏÔʾÐÅÏ¢
+***********************************************************************************/
+static VOID mmi_getLcdPowerOffChargerBatteryFullinfo()
+{
+	g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].type = LCD_SHOW_PICTURE;
+	if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].bitmap, g_lcdPowerOffBatteryConfigInfo[E_BATTERY_LEVEL_4].path,
+	                          &g_lcdPowerOffBatteryConfigInfo[E_BATTERY_LEVEL_4].bmp, g_lcdPowerOffBatteryConfigInfo[E_BATTERY_LEVEL_4].isNeedReload) != 0) {
+		g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].type = LCD_SHOW_INVLAID;
+	}
+}
+static VOID mmi_getLcdPowerOffChargerOverVoltageinfo()
+{
+	mmi_innerGetLcdOverVoltageinfo(&(g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER]));
+}
+static VOID mmi_getLcdPowerOffChargerLowBatteryinfo(E_zMmi_Poc_State state)
+{
+	if (state == POC_STATE_LOWBATTERY || state == POC_STATE_NOBATTERY) {//klocwork
+		g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].type = LCD_SHOW_TEXT;
+		g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].font = mmi_middle_sixteen_font;//mmi_middle_fourteen_font;
+		g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].text = tp_i18n_get_text(g_powerOffChargerLowBatteryTab[state - POC_STATE_LOWBATTERY].tips);
+		if (g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].text != NULL)
+			g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].text);
+	}
+}
+SINT32 mmi_getLcdPowerOffChagerInfo(UINT32 taskInfo)
+{
+	T_zMmi_Poc_Info *pPocInfo = (T_zMmi_Poc_Info *)taskInfo;
+	if (pPocInfo->backlight_sta == 0) {
+		mmi_lcd_backlight_end();
+		tp_man_Lcd_Sleep_Enter();
+		if(FALSE == mmi_is_offchg_poweroff)	{
+			set_wake_unlock(MMI_POWEROFF_LOCK_LCD_ID);
+		}		
+	} else {
+		mmi_getMutex(&g_mmi_poweron_mutex);
+		if (!g_mmi_poweroff_turnon_flag) {
+			tp_man_Lcd_Sleep_Exit();
+			mmi_lcd_backlight_start();
+		}
+		mmi_putMutex(&g_mmi_poweron_mutex);
+	}
+	if (pPocInfo->overvoltage_mode == TRUE) {
+		mmi_getLcdPowerOffChargerOverVoltageinfo();
+	} else {
+		if (pPocInfo->poc_sta == POC_STATE_FULL) {
+			mmi_getLcdPowerOffChargerBatteryFullinfo();
+		} else if (pPocInfo->poc_sta == POC_STATE_LOWBATTERY || pPocInfo->poc_sta == POC_STATE_NOBATTERY) {
+			mmi_getLcdPowerOffChargerLowBatteryinfo(pPocInfo->poc_sta);
+		} else {
+			mmi_innerGetLcdBatteryCharinginfo(MMI_TASK_POWEROFF_CHARGER, &(g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER]));
+		}
+	}
+	return MMI_SUCCESS;
+
+}
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡Ìáʾlcd ÏÔʾÐÅÏ¢
+***********************************************************************************/
+static CHAR* mmi_findStringFromSimState(E_zMmi_Sim_Tip sim_sta)
+{
+	UINT32 i = 0;
+	for (i = 0; i < sizeof(g_simStaTipStringTab) / sizeof(T_SimTipStringItem); ++ i) {
+		if (g_simStaTipStringTab[i].sim_state == sim_sta) {
+			//return g_simStaTipStringTab[i].tipString;
+			return (CHAR*)tp_i18n_get_text(g_simStaTipStringTab[i].tipString);
+		}
+	}
+	return NULL;
+}
+static CHAR* mmi_findStringFromWpsAct(E_zMmi_WpsAct_Tip wps_act)
+{
+	UINT32 i = 0;
+	for (i = 0; i < sizeof(g_wpsActTipStringTab) / sizeof(T_WpsActTipStringItem); ++ i) {
+		if (g_wpsActTipStringTab[i].wps_state == wps_act) {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_findStringFromWpsAct %s success!!\n", g_wpsActTipStringTab[i].tipString);
+			//return g_wpsActTipStringTab[i].tipString;
+			return (CHAR*)tp_i18n_get_text(g_wpsActTipStringTab[i].tipString);
+		}
+	}
+
+	return NULL;
+}
+
+static CHAR* mmi_findStringFromNetCon(E_zMmi_NetCon_Tip net_con)
+{
+	UINT32 i = 0;
+	for (i = 0; i < sizeof(g_netContTipStringTab) / sizeof(T_NetConTipStringItem); ++ i) {
+		if (g_netContTipStringTab[i].net_con == net_con) {
+			//return g_netContTipStringTab[i].tipString;
+			return (CHAR*)tp_i18n_get_text(g_netContTipStringTab[i].tipString);
+		}
+	}
+	return NULL;
+}
+
+static CHAR* mmi_findStringFromFota(E_zMMI_Fota_Tip fota_tip)
+{
+	UINT32 i = 0;
+	for (i = 0; i < sizeof(g_FotaTipStringTab) / sizeof(T_FotaTipStringItem); ++ i) {
+		if (g_FotaTipStringTab[i].fota_tip == fota_tip) {
+			//return g_FotaTipStringTab[i].tipString;
+			return (CHAR*)tp_i18n_get_text(g_FotaTipStringTab[i].tipString);
+		}
+	}
+	return NULL;
+}
+
+static VOID mmi_setSIMStateTipInfo(E_zMmi_Sim_Tip sim_sta)
+{
+	g_LcdShowInfoTab[LCD_SHOW_TIP_SIM_STATE].type = LCD_SHOW_TEXT;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_SIM_STATE].text = mmi_findStringFromSimState(sim_sta);
+	if (g_LcdShowInfoTab[LCD_SHOW_TIP_SIM_STATE].text != NULL) {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_SIM_STATE].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TIP_SIM_STATE].text);
+	}
+	g_LcdShowInfoTab[LCD_SHOW_TIP_SIM_STATE].font = mmi_middle_sixteen_font;
+}
+
+static VOID mmi_setWpsActTipInfo(E_zMmi_WpsAct_Tip wps_act)
+{
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WPS_ACTIVE].type = LCD_SHOW_TEXT;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WPS_ACTIVE].text = mmi_findStringFromWpsAct(wps_act);
+	if (g_LcdShowInfoTab[LCD_SHOW_TIP_WPS_ACTIVE].text != NULL) {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_WPS_ACTIVE].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TIP_WPS_ACTIVE].text);
+	}
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WPS_ACTIVE].font = mmi_middle_sixteen_font;
+}
+
+static VOID mmi_setNeConTipInfo(E_zMmi_NetCon_Tip net_con)
+{
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_CONNECTING].type = LCD_SHOW_TEXT;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_CONNECTING].text = mmi_findStringFromNetCon(net_con);
+	if (g_LcdShowInfoTab[LCD_SHOW_TIP_NET_CONNECTING].text != NULL) {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_NET_CONNECTING].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TIP_NET_CONNECTING].text);
+	}
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_CONNECTING].font = mmi_middle_sixteen_font;
+}
+static VOID mmi_setNetProTipInfo(CHAR* net_pro)
+{
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].type = LCD_SHOW_TEXT;
+	//g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].text = net_pro;
+	memset(g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].text, 0, MMI_LCD_SHOW_STRING_LEN);
+	strncpy(g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].text, tp_i18n_get_text(net_pro), MMI_LCD_SHOW_STRING_LEN);
+	if (g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].text != NULL) {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].text);
+	}
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].font = mmi_middle_sixteen_font;
+}
+
+static VOID mmi_setNewVersionTipInfo()
+{
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NEW_VERSION].type = LCD_SHOW_PICTURE;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NEW_VERSION].needShow = TRUE;
+	if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_TIP_NEW_VERSION].bitmap, g_mmiNewVersionBmpPath, &g_mmiNewVersionBmp, FALSE) != 0) {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_NEW_VERSION].type = LCD_SHOW_INVLAID;
+	}
+}
+
+static VOID mmi_setFotaTipInfo(E_zMMI_Fota_Tip fota_tip)
+{
+	CHAR *str_Fota = mmi_findStringFromFota(fota_tip);
+	g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].type = LCD_SHOW_TEXT;
+	memset(g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].text, 0, MMI_LCD_SHOW_STRING_LEN);
+	if (str_Fota != NULL) {
+		sprintf(g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].text, "%s", str_Fota);
+	}
+	if (g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].text != NULL) {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].text);
+	}
+	g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].font = mmi_small_font;
+
+}
+
+static VOID mmi_strcatStringWithPre(CHAR* output, CHAR* key, CHAR* value, SINT32 totallen)
+{
+	memset(output, 0, totallen);
+	memcpy((VOID *)output, (const VOID *)key, (UINT32)strlen(key));
+	if (value != NULL && strlen(value) > 0) {
+		memcpy((VOID *)(output + strlen(key)), (const VOID *)value, (UINT32)(totallen - strlen(key) - 1));
+	} else {
+		memcpy((VOID *)(output + strlen(key)), (const VOID *)INVALID_STR, (UINT32)(strlen(INVALID_STR)));
+	}
+}
+
+static VOID mmi_setSSIDKeyTipInfo(T_LcdShowInfoItem *ssidItem, T_LcdShowInfoItem *wifikeyItem, CHAR* ssid, CHAR *wifikey)
+{
+	ssidItem->type = LCD_SHOW_TEXT;
+	ssidItem->needShow = TRUE;
+	if (mmi_get_multi_ssid_switch_flag()) {
+		mmi_strcatStringWithPre(ssidItem->text, (CHAR*)tp_i18n_get_text(STRING_SSID1), ssid, MMI_LCD_SHOW_STRING_LEN);
+	} else {
+		mmi_strcatStringWithPre(ssidItem->text, (CHAR*)tp_i18n_get_text(STRING_SSID), ssid, MMI_LCD_SHOW_STRING_LEN);
+	}
+	if (ssidItem->text != NULL) {
+		ssidItem->textLen = strlen(ssidItem->text);
+	}
+	ssidItem->font = mmi_middle_twelve_font;
+
+	wifikeyItem->type = LCD_SHOW_TEXT;
+	wifikeyItem->needShow = TRUE;
+	if (wifikeyItem->text != NULL) {
+		mmi_strcatStringWithPre(wifikeyItem->text, (CHAR*)tp_i18n_get_text(STRING_WIFIKEY), wifikey, MMI_LCD_SHOW_STRING_LEN);
+		wifikeyItem->textLen = strlen(wifikeyItem->text);
+	}
+	wifikeyItem->font = mmi_middle_twelve_font;
+}
+
+
+static VOID mmi_setSSIDKeyTip2Info(T_LcdShowInfoItem *ssidItem, T_LcdShowInfoItem *wifikeyItem, CHAR* ssid, CHAR *wifikey)
+{
+	ssidItem->type = LCD_SHOW_TEXT;
+	ssidItem->needShow = TRUE;
+	if (ssidItem->text != NULL) {
+		mmi_strcatStringWithPre(ssidItem->text, (CHAR*)tp_i18n_get_text(STRING_SSID2), ssid, MMI_LCD_SHOW_STRING_LEN);
+		ssidItem->textLen = strlen(ssidItem->text);
+	}
+	ssidItem->font = mmi_middle_twelve_font;
+
+	wifikeyItem->type = LCD_SHOW_TEXT;
+	wifikeyItem->needShow = TRUE;
+	if (wifikeyItem->text != NULL) {
+		mmi_strcatStringWithPre(wifikeyItem->text, (CHAR*)tp_i18n_get_text(STRING_WIFIKEY), wifikey, MMI_LCD_SHOW_STRING_LEN);
+		wifikeyItem->textLen = strlen(wifikeyItem->text);
+	}
+	wifikeyItem->font = mmi_middle_twelve_font;
+}
+
+SINT32 mmi_getLcdTipInfo(UINT32 taskInfo)//sim state sim cmcc
+{
+	T_zMMITipInfo *pTipInfo = (T_zMMITipInfo *)taskInfo;
+
+	if (pTipInfo->sim_tip != SIM_MAX) {
+		mmi_setSIMStateTipInfo(pTipInfo->sim_tip);
+		slog(MMI_PRINT, SLOG_DEBUG, "mmi mmi_getLcdTipInfo ready for show SIM\n");
+	} else if (mmi_IsShowNetPro()) {
+		mmi_setNetProTipInfo(pTipInfo->net_pro);
+		slog(MMI_PRINT, SLOG_DEBUG, "mmi mmi_getLcdTipInfo ready for show NET CONNECT\n");
+	}
+
+	mmi_set_middle_needshow();
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_getLcdTipNetConnInfo(UINT32 taskInfo)//net connect
+{
+	T_zMMITipInfo *pTipInfo = (T_zMMITipInfo *)taskInfo;
+	mmi_setNeConTipInfo(pTipInfo->net_tip);
+	mmi_set_middle_needshow();
+	return MMI_SUCCESS;
+}
+SINT32 mmi_getLcdTipWpsInfo(UINT32 taskInfo)//wps
+{
+	T_zMMIWifiInfo *pWpsInfo = (T_zMMIWifiInfo *)taskInfo;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getLcdTipWpsInfo pWpsInfo->wps_state= %d!!\n", pWpsInfo->wps_state);
+	mmi_setWpsActTipInfo(pWpsInfo->wps_state);
+	mmi_set_middle_needshow();
+	return MMI_SUCCESS;
+}
+SINT32 mmi_getLcdTipFotaInfo(UINT32 taskInfo)//FOTA
+{
+	T_zMMIFotaInfo *pFotaInfo = (T_zMMIFotaInfo *)taskInfo;
+	if (pFotaInfo->fota_update != 0) {
+		g_LcdShowInfoTab[LCD_SHOW_POWER].needShow = FALSE;
+		mmi_setNewVersionTipInfo();
+	} else {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_NEW_VERSION].needShow = FALSE;
+		g_LcdShowInfoTab[LCD_SHOW_POWER].needShow = TRUE;
+	}
+	mmi_setFotaTipInfo(pFotaInfo->fota_tip);
+	mmi_set_middle_needshow();
+
+	return MMI_SUCCESS;
+}
+
+#if 0
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñȡʱ¼äÏÔʾÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLcdTimeInfo(UINT32 taskInfo)
+{
+	T_zMMITimeInfo *pTimeInfo = (T_zMMITimeInfo *)taskInfo;
+	g_LcdShowInfoTab[LCD_SHOW_CURRENT_TIME].type = LCD_SHOW_TEXT;
+	sprintf(g_LcdShowInfoTab[LCD_SHOW_CURRENT_TIME].text, "%s:%s", pTimeInfo->hour, pTimeInfo->minute);
+	if (g_LcdShowInfoTab[LCD_SHOW_CURRENT_TIME].text != NULL) {
+		g_LcdShowInfoTab[LCD_SHOW_CURRENT_TIME].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_CURRENT_TIME].text);
+	}
+	g_LcdShowInfoTab[LCD_SHOW_CURRENT_TIME].font = mmi_middle_twelve_font;
+	return MMI_SUCCESS;
+}
+#endif
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡SSID/WIFIKEYÏÔʾÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLcdSSIDKeyInfo(UINT32 taskInfo)
+{
+	T_zMMISSIDInfo *pssidInfo = (T_zMMISSIDInfo *)taskInfo;
+	mmi_setSSIDKeyTipInfo(&(g_LcdShowInfoTab[LCD_SHOW_WIFI_SSID]), &(g_LcdShowInfoTab[LCD_SHOW_WIFI_PASSWORD]), pssidInfo->ssid, pssidInfo->wifi_key);
+	if (mmi_get_multi_ssid_switch_flag()) {
+		mmi_setSSIDKeyTip2Info(&(g_LcdShowInfoTab[LCD_SHOW_WIFI_SSID2]), &(g_LcdShowInfoTab[LCD_SHOW_WIFI_PASSWORD2]), pssidInfo->ssid2, pssidInfo->wifi_key2);
+	}
+	return MMI_SUCCESS;
+}
+
+VOID mmi_initLcdShowInfoTab()
+{
+	UINT32 i = 0;
+	//int length = 0;
+	//length = tp_man_get_lcd_byte_length();
+	for (i = 0; i < sizeof(g_LcdShowInfoTab) / sizeof(T_LcdShowInfoItem); ++ i) {
+		if (g_LcdConfigInfoTab[g_LcdShowInfoTab[i].item].type == LCD_SHOW_PICTURE) {
+			g_LcdShowInfoTab[i].bitmap = (BITMAP*)malloc(sizeof(BITMAP));
+			memset((VOID *)g_LcdShowInfoTab[i].bitmap, 0, sizeof(BITMAP));
+		}
+		if (g_LcdConfigInfoTab[g_LcdShowInfoTab[i].item].type == LCD_SHOW_TEXT) {
+			g_LcdShowInfoTab[i].text = (CHAR*)malloc(MMI_LCD_SHOW_STRING_LEN);
+		}
+	}
+	/*g_mmi_bitmem = (CHAR*)malloc(length);
+	if (g_mmi_bitmem == NULL) {
+		assert(0);
+	}*/
+}
+#endif
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_lcd.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_lcd.h
new file mode 100755
index 0000000..5c58eeb
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_lcd.h
@@ -0,0 +1,122 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_lcd.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £º
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#ifndef DISABLE_LCD
+#include "mmi_common.h"
+#include "mmiAppMainwin.h"
+#include "app_infos.h"
+#include "app_global_defines.h"
+
+/*****************************ÌáʾÐÅÏ¢Ïà¹Ø¶¨Òå******************************************/
+
+/*ÏÔʾÊý¾ÝÀàÐÍ*/
+typedef enum {
+	LCD_SHOW_PICTURE = 1,
+	LCD_SHOW_TEXT,
+	LCD_SHOW_RECT,
+	LCD_SHOW_BACKGROUD,
+	LCD_SHOW_ANIMATION,
+	LCD_SHOW_BOX,//»æÖÆ·½¿òµÄÉÏÏÂÁ½ÌõÏß
+	LCD_SHOW_HLINE,
+	LCD_SHOW_INVLAID,
+} E_LCD_SHOW_CONTENT_TYPE;
+
+/*ÏÔʾÏî*/
+typedef enum {
+	//===========top bar===========
+	LCD_SHOW_NET_SIGNAL,
+	LCD_SHOW_NET_CONNECT,
+	LCD_SHOW_WIFISTATION_CONNECT,
+	LCD_SHOW_SMS,
+	LCD_SHOW_SMS_NUM,
+	LCD_SHOW_WIFI,
+	LCD_SHOW_TIP_NEW_VERSION,
+	LCD_SHOW_POWER,//µçÁ¿
+	LCD_SHOW_BATTERY,//µç³Ø
+
+	//============PAGE1============
+	//============middle==========
+	LCD_SHOW_CMCC,
+	LCD_SHOW_TIP_WIFISTA_SSID,
+	LCD_SHOW_TIP_SIM_STATE,
+	LCD_SHOW_TIP_WPS_ACTIVE,
+	LCD_SHOW_TIP_NET_CONNECTING,
+	LCD_SHOW_TIP_NET_PROVIDER,
+	LCD_SHOW_TIP_UPDATE_INFO,//zk add for fotaupdate result
+
+	//============temp=============
+	LCD_SHOW_WIFI_SSID,
+	LCD_SHOW_WIFI_PASSWORD,
+	//==========PAGE SSID2 WIFI KEY=============
+	LCD_SHOW_WIFI_SSID2,
+	LCD_SHOW_WIFI_PASSWORD2,
+	LCD_SHOW_WIFI_CODE2,
+
+
+	//============PAGE1=============
+	LCD_SHOW_TRAFFIC,
+	LCD_SHOW_TRAFFIC_BAR,
+	LCD_SHOW_TRAFFIC_SLIDER,
+	LCD_SHOW_TRAFFIC_WARING,
+
+	//==========PAGE3=============
+	LCD_SHOW_WIFI_CODE,
+	//LCD_SHOW_ACESS_DURATION_PRE,
+	//LCD_SHOW_ACESS_DURATION,//add
+	//LCD_SHOW_CURRENT_USAGE_PRE,
+	//LCD_SHOW_CURRENT_USAGE,//add
+	LCD_SHOW_POWER_OFF_CHARGER	,
+
+
+	LCD_SHOW_MAX,
+
+} E_LCD_SHOW_CONTENT_ITEM;
+
+/*ÏÔÊ¾ÇøÓòλÖá¢ÄÚÈݶÔÓ¦¹ØÏµ*/
+typedef struct {
+	E_LCD_SHOW_CONTENT_ITEM item;
+	RECT rect;
+	E_LCD_SHOW_CONTENT_TYPE type;
+} T_LcdConfigInfo;
+
+
+/*ÏÔʾÐÅÏ¢*/
+typedef struct {
+	E_LCD_SHOW_CONTENT_ITEM item;
+	BITMAP* bitmap;
+	CHAR* text;
+	PLOGFONT font;
+	ZDWORD nFormat;
+	SINT32 textLen;
+	BOOL needShowFL;//½â¾öÏÔʾ¿ØÖƳåÍ»ÎÊÌ⣬¸Ã±äÁ¿ÓÅÏȼ¶¸ßÓÚneedShow
+	BOOL needShow;
+	E_LCD_SHOW_CONTENT_TYPE type;
+	UINT32 last;
+	UINT32 color;
+} T_LcdShowInfoItem;
+
+extern T_zMMITaskInfoItem g_zMMITaskInfoTab[MMI_TASK_MAX];
+
+typedef VOID (*SCROLLED_TIMER_CALLBACK)(VOID);
+
+/*ÏÔʾÆÁÄ»ÐÅÏ¢*/
+//SINT32 mmi_showLcd(UINT32 lcdInfo);
+VOID mmi_initLcdShowInfoTab();
+HWND mmi_getMainWnd();
+
+VOID mmi_startPowerOnFrame();
+VOID mmi_startPowerOffFrame();
+VOID mmi_startPowerResetFrame();
+VOID mmi_startFastPowerOnFrame();
+#endif
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_lcd_init.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_lcd_init.c
new file mode 100755
index 0000000..6d9eb15
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_lcd_init.c
@@ -0,0 +1,433 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_lcd_info.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºÏÔʾʱ¼ä¡¢¶ÌÐÅ¡¢ÍøÂçÐźš¢WIFI¡¢µçÁ¿¡¢Á÷Á¿µÈÐÅÏ¢
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2015-1-4
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+
+/*****************************************************************************
+ Í·Îļþ
+******************************************************************************/
+#ifndef DISABLE_LCD
+#include "mmi_common.h"
+#include "os_type.h"
+#include "app_infos.h"
+#include "app_global_defines.h"
+
+/****************************************************************************/
+
+#define MMI_LCD_WIDTH					128
+#define MMI_LCD_HEIGHT   				128
+
+/*
+¿ª¹Ø»ú¶¯»­
+*/
+typedef enum {
+	E_POWERONOFF_FRAME_0 = 0,
+	E_POWERONOFF_FRAME_1,
+	E_POWERONOFF_FRAME_2,
+	E_POWERONOFF_FRAME_3,
+	E_POWERONOFF_FRAME_4,
+	E_POWERONOFF_FRAME_5,
+	E_POWERONOFF_FRAME_6,
+	E_POWERONOFF_FRAME_7,
+	E_POWERONOFF_FRAME_8,
+	E_POWERONOFF_FRAME_9,
+	E_POWERONOFF_FRAME_10,
+	E_POWERONOFF_FRAME_11,
+	E_POWERONOFF_FRAME_12
+} E_POWONOFF_FRAME_ID;
+
+
+typedef struct {
+	E_zMmi_Work_Mode workMode;
+	CHAR* tipString;
+} T_PowerOnOffTipStringItem;
+
+T_PowerOnOffTipStringItem g_PowerOnOffTipStringTab[] = {
+	{MMI_POWERON_MODE, "Welcome"},
+	{MMI_POWEROFF_MODE, "Poweroff"},
+	{MMI_RESET_MODE, "Resetting"},
+	{MMI_RESTART_MODE, "Restarting"}
+};
+
+typedef struct {
+	E_POWONOFF_FRAME_ID frameID;
+	CHAR* path;
+} T_PowerOnOffFrameItem;
+
+T_PowerOnOffFrameItem g_powerOnoffFramTab[] = {
+	{E_POWERONOFF_FRAME_0, "/etc_ro/mmi/cartoon_0.png"},
+	{E_POWERONOFF_FRAME_1, "/etc_ro/mmi/cartoon_1.png"},
+	{E_POWERONOFF_FRAME_2, "/etc_ro/mmi/cartoon_2.png"},
+	{E_POWERONOFF_FRAME_3, "/etc_ro/mmi/cartoon_3.png"},
+	{E_POWERONOFF_FRAME_4, "/etc_ro/mmi/cartoon_4.png"},
+	{E_POWERONOFF_FRAME_5, "/etc_ro/mmi/cartoon_5.png"},
+	{E_POWERONOFF_FRAME_6, "/etc_ro/mmi/cartoon_6.png"},
+	{E_POWERONOFF_FRAME_7, "/etc_ro/mmi/cartoon_7.png"},
+	{E_POWERONOFF_FRAME_8, "/etc_ro/mmi/cartoon_8.png"},
+	{E_POWERONOFF_FRAME_9, "/etc_ro/mmi/cartoon_9.png"},
+	{E_POWERONOFF_FRAME_10, "/etc_ro/mmi/cartoon_10.png"},
+	{E_POWERONOFF_FRAME_11, "welcome"}
+};
+
+/********************************************************************************
+  È«¾Ö±äÁ¿ÒýÓÃ
+**********************************************************************************/
+extern UINT32 g_smstask_enable;
+extern UINT32 g_voicetask_enable;
+extern E_zMmiShowMode g_showMode;
+
+
+/********************************************************************************
+  È«¾Ö±äÁ¿¶¨Òå
+**********************************************************************************/
+CHAR* g_mmiMainWinBgPath = "/etc_ro/mmi/background.png";
+HWND  g_mmiMainWin = HWND_INVALID;
+BITMAP g_mmiMainBg = {0};
+
+PLOGFONT mmi_smallest_font = NULL;
+PLOGFONT mmi_small_font = NULL;
+PLOGFONT mmi_middle_twelve_font = NULL;
+//PLOGFONT mmi_middle_fourteen_font = NULL;
+PLOGFONT mmi_middle_sixteen_font = NULL;
+/*PLOGFONT mmi_middle_twenty_font = NULL;*/
+//PLOGFONT mmi_big_font = NULL;
+
+/**********************************************************************************
+  ³õʼ»¯×ÖÌå
+***********************************************************************************/
+void mmi_InitFont()
+{
+	mmi_smallest_font = CreateLogFont(FONT_TYPE_NAME_BITMAP_RAW, "song", "GB2312",
+	                                  FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+	                                  FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 10, 0);
+	mmi_small_font = CreateLogFont(FONT_TYPE_NAME_BITMAP_RAW, "song", "GB2312",
+	                               FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+	                               FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 11, 0);
+	mmi_middle_twelve_font = CreateLogFont(FONT_TYPE_NAME_BITMAP_RAW, "song", "GB2312",
+	                                       FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+	                                       FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 12, 0);
+
+	/*mmi_middle_fourteen_font = CreateLogFont(FONT_TYPE_NAME_BITMAP_RAW, "song", "GB2312",
+		  FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+		  FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE,  14, 0);*/
+
+	mmi_middle_sixteen_font = CreateLogFont(FONT_TYPE_NAME_BITMAP_RAW, "song", "GB2312",
+	                                        FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+	                                        FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE,  16, 0);
+
+	/*mmi_middle_twenty_font = CreateLogFont(FONT_TYPE_NAME_BITMAP_RAW, "song", "GB2312",
+		  FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+		  FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 20, 0);*/
+	/*mmi_big_font = CreateLogFont(FONT_TYPE_NAME_BITMAP_RAW, "song", "GB2312",
+		  FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+		  FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 24, 0);*/
+
+	slog(MMI_PRINT, SLOG_NORMAL, "zcore MMI_InitFont finish!!!!!\n");
+}
+
+/* power on off*/
+static SINT32 g_mmiCurrentFrameID = E_POWERONOFF_FRAME_0;
+static BOOL showingPowerOn = TRUE;
+static BOOL showingPowerOff = FALSE;
+static BOOL showingPowerOffCharger = FALSE;
+
+POWER_ON_OFF_CALLBACK_FUN g_PowerOnOffFun = NULL;
+
+BOOL mmi_Ispoweron_state(VOID)
+{
+	return showingPowerOn;
+}
+
+VOID mmi_registerLcdPowerOnOff(POWER_ON_OFF_CALLBACK_FUN fun)
+{
+	g_PowerOnOffFun = fun;
+}
+
+VOID mmi_changePowerOnOffFrame(VOID)
+{
+	if (showingPowerOn) {
+		g_mmiCurrentFrameID ++ ;
+	}
+	if (showingPowerOff) {
+		g_mmiCurrentFrameID -- ;
+	}
+}
+
+VOID mmi_showPowerOnOffFrame(HDC hdc)
+{
+	BITMAP bitmap = {0};
+	SINT32 ret = -1;
+
+	if (g_mmiCurrentFrameID == E_POWERONOFF_FRAME_11) { //show text "welcome"
+		SINT32 tempID = g_mmiCurrentFrameID;
+		RECT rect = {0, 0, MMI_LCD_WIDTH, MMI_LCD_HEIGHT};
+		FillBoxWithBitmap(hdc, 0, 0, MMI_LCD_WIDTH, MMI_LCD_HEIGHT, &g_mmiMainBg);
+		SetBkMode(hdc, BM_TRANSPARENT);
+		SelectFont(hdc, mmi_middle_sixteen_font);
+		SetTextColor(hdc, PIXEL_lightwhite);
+		DrawText(hdc, g_powerOnoffFramTab[tempID].path, strlen(g_powerOnoffFramTab[tempID].path), &rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
+		//DrawText(hdc, g_powerOnoffFramTab[E_POWERONOFF_FRAME_11].path, strlen(g_powerOnoffFramTab[E_POWERONOFF_FRAME_11].path), &rect, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
+	}
+#if 1
+	else if (g_mmiCurrentFrameID >= E_POWERONOFF_FRAME_0 && g_mmiCurrentFrameID < E_POWERONOFF_FRAME_11) { //show poweronoff ani
+		ret = LoadBitmapFromFile(hdc, &bitmap, g_powerOnoffFramTab[g_mmiCurrentFrameID].path);
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_showPowerOnOffFrame load bitmap path:%s!!!\n", g_powerOnoffFramTab[g_mmiCurrentFrameID].path);
+		if (ret != 0) {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI load bitmap failed path:%s!!!\n", g_powerOnoffFramTab[g_mmiCurrentFrameID].path);
+			return;
+		}
+		FillBoxWithBitmap(hdc, 0, 0, MMI_LCD_WIDTH, MMI_LCD_HEIGHT, &bitmap);
+		UnloadBitmap(&bitmap);
+	}
+	if (showingPowerOn) {
+		if (g_mmiCurrentFrameID <= E_POWERONOFF_FRAME_10) {
+			mmi_startLcdPowerOnOffTimer();
+		} else if (g_mmiCurrentFrameID == E_POWERONOFF_FRAME_11) {
+			mmi_startLcdPowerOnOffTextFrameTimer();
+		} else {
+			showingPowerOn = FALSE;
+			mmi_set_update_flag(MMI_TASK_BATTERY);//update all app show
+			mmi_set_update_flag(MMI_TASK_POWER);
+			mmi_set_update_flag(MMI_TASK_WIFI);
+			mmi_set_update_flag(MMI_TASK_LED_WPS);
+
+			if (g_voicetask_enable)
+				mmi_set_update_flag(MMI_TASK_VOIP);
+			else if (g_smstask_enable)
+				mmi_set_update_flag(MMI_TASK_SMS);
+
+			mmi_set_update_flag(MMI_TASK_NET);
+			mmi_set_update_flag(MMI_TASK_TIP);
+			mmi_set_lcd_mode(MMI_ACTIVE_MODE);
+		}
+	}
+	if (showingPowerOff) {
+		if (g_mmiCurrentFrameID == E_POWERONOFF_FRAME_11) {
+			mmi_startLcdPowerOnOffTextFrameTimer();
+		} else if (g_mmiCurrentFrameID >= E_POWERONOFF_FRAME_0) {
+			mmi_startLcdPowerOnOffTimer();
+		} else {
+			mmi_set_poweroff_charge_show(TRUE);
+			showingPowerOff = FALSE;
+			if (g_PowerOnOffFun != NULL) {
+				slog(MMI_PRINT, SLOG_DEBUG, "mmi_showPowerOnOffFrame  g_PowerOnOffFun!\n");
+				g_PowerOnOffFun();
+			}
+		}
+	}
+#endif
+
+}
+
+BOOL mmi_getShowingPowerOnInfo(VOID)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getShowingPowerOnInfo showingPowerOn:%d!!!\n", showingPowerOn);
+	return showingPowerOn;
+}
+
+static CHAR* mmi_findStringFromMode(E_zMmi_Work_Mode workMode)
+{
+	UINT32 i = 0;
+	for (i = 0; i < sizeof(g_PowerOnOffTipStringTab) / sizeof(T_PowerOnOffTipStringItem); ++ i) {
+		if (g_PowerOnOffTipStringTab[i].workMode == workMode) {
+			//return g_PowerOnOffTipStringTab[i].tipString;
+			return (CHAR*)tp_i18n_get_text(g_PowerOnOffTipStringTab[i].tipString);
+		}
+	}
+	return NULL;
+}
+
+VOID mmi_startPowerOnFrame()
+{
+	showingPowerOn = TRUE;
+	showingPowerOff = FALSE;
+	g_mmiCurrentFrameID = E_POWERONOFF_FRAME_0;
+	g_powerOnoffFramTab[E_POWERONOFF_FRAME_11].path = mmi_findStringFromMode(MMI_POWERON_MODE);
+}
+
+VOID mmi_startFastPowerOnFrame()
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_startFastPowerOnFrame!! \n\n");
+	mmi_set_poweroff_charge_show(FALSE);
+	showingPowerOn = TRUE;
+	showingPowerOff = FALSE;
+	g_mmiCurrentFrameID = E_POWERONOFF_FRAME_0;
+	g_powerOnoffFramTab[E_POWERONOFF_FRAME_11].path = mmi_findStringFromMode(MMI_POWERON_MODE);
+	InvalidateRect(g_mmiMainWin, NULL, FALSE);
+}
+
+VOID mmi_startPowerOffFrame()
+{
+	showingPowerOn = FALSE;
+	showingPowerOff = TRUE;
+	g_mmiCurrentFrameID = E_POWERONOFF_FRAME_10;
+	g_powerOnoffFramTab[E_POWERONOFF_FRAME_11].path = mmi_findStringFromMode(MMI_POWEROFF_MODE);
+}
+
+
+VOID mmi_startPowerResetFrame()
+{
+	showingPowerOn = FALSE;
+	showingPowerOff = TRUE;
+	g_mmiCurrentFrameID = E_POWERONOFF_FRAME_11;
+	g_powerOnoffFramTab[E_POWERONOFF_FRAME_11].path = mmi_findStringFromMode(MMI_RESET_MODE);
+}
+
+VOID mmi_startPowerRestartFrame()
+{
+	showingPowerOn = FALSE;
+	showingPowerOff = TRUE;
+	g_mmiCurrentFrameID = E_POWERONOFF_FRAME_11;
+	g_powerOnoffFramTab[E_POWERONOFF_FRAME_11].path = mmi_findStringFromMode(MMI_RESTART_MODE);
+}
+VOID mmi_startPowerOffChagerFrame()
+{
+	showingPowerOn = FALSE;
+	showingPowerOff = FALSE;
+	showingPowerOffCharger = TRUE;
+}
+
+//BITMAP testbitmap = {0};
+/**********************************************************************************
+  ʱ¼ä½çÃæ´°¿Ú¹ý³Ìº¯Êý
+***********************************************************************************/
+SINT32 mmi_InfoWinProc(HWND hWnd, SINT32 message, WPARAM wParam, LPARAM lParam)
+{
+	//HDC hdc = HDC_INVALID;
+	//slog(MMI_PRINT,SLOG_DEBUG,"zcore MMI_InfoWinProc !!!!!message=0x%x\n",message);
+
+	switch (message) {
+	case MSG_CREATE: {
+		break;
+	}
+	case MSG_PAINT: {
+		HDC hdc = BeginPaint(g_mmiMainWin);
+
+		//FillBoxWithBitmap(hdc, 0, 0, MMI_LCD_WIDTH, MMI_LCD_HEIGHT, &testbitmap);
+
+#if 1
+		if (showingPowerOn || showingPowerOff) {
+			mmi_showPowerOnOffFrame(hdc);
+		} else {
+			FillBoxWithBitmap(hdc, 0, 0, MMI_LCD_WIDTH, MMI_LCD_HEIGHT, &g_mmiMainBg);
+			zCore_Set_SkipUpdateflag(TRUE);
+			mmi_showLcd(hdc);
+		}
+#endif
+		EndPaint(g_mmiMainWin, hdc);
+		return 0;
+	}
+	case MSG_TIMER: {
+		break;
+	}
+	case MSG_KEYDOWN:
+	case MSG_KEYUP: {
+		break;
+	}
+	case MSG_CLOSE: {
+		DestroyMainWindowIndirect(hWnd);
+		g_mmiMainWin = HWND_INVALID;
+		break;
+	}
+	default: {
+		break;
+	}
+	}
+	return DefaultMainWinProc(hWnd, message, wParam, lParam);
+}
+
+
+/**********************************************************************************
+´´½¨´°¿Ú
+***********************************************************************************/
+
+VOID mmi_MainWinCreate()
+{
+	MAINWINCREATE CreateInfo = {0};
+	CreateInfo.dwStyle = WS_VISIBLE;
+	CreateInfo.dwExStyle = WS_EX_NONE;
+	CreateInfo.spCaption = "";
+	CreateInfo.hHosting = HWND_DESKTOP;
+	CreateInfo.MainWindowProc = mmi_InfoWinProc;
+	CreateInfo.lx = 0;
+	CreateInfo.ty = 0;
+	CreateInfo.rx = MMI_LCD_WIDTH;
+	CreateInfo.by = MMI_LCD_HEIGHT;
+	CreateInfo.iBkColor = PIXEL_black;
+	CreateInfo.dwAddData = 0;
+	CreateInfo.dwReserved = 0;
+	CreateInfo.hHosting = HWND_DESKTOP;
+	g_mmiMainWin = CreateMainWindow(&CreateInfo);
+
+	// ShowWindow(mmi_info_win, SW_SHOWNORMAL);
+	slog(MMI_PRINT, SLOG_NORMAL, "zcore MMI_InfoWinCreate finish!!!!!mmi_test_Win=0x%x\n", g_mmiMainWin);
+
+
+}
+
+extern OS_SEMA_ID g_mmi_init_sem_id;
+extern OS_SEMA_ID g_mmi_gui_init_sem_id;
+
+/**********************************************************************************
+  LCD³õʼ»¯Èë¿Úº¯Êý
+***********************************************************************************/
+static VOID *lcd_main_entry(VOID *arg)
+{
+	MSG msg = {0};
+
+	slog(MMI_PRINT, SLOG_DEBUG, "zcore MMI_task_main_entry!!!!\n");
+	prctl(PR_SET_NAME, "mmi_lcd_main", 0, 0, 0);
+	InitGUI();
+	//zOss_Sleep(15000);
+	mmi_InitFont();
+	LoadBitmapFromFile(HDC_SCREEN, &g_mmiMainBg, g_mmiMainWinBgPath);
+	//LoadBitmapFromFile(HDC_SCREEN, &testbitmap, "c:\\mmi\\RGB.bmp");
+	mmi_initLcdShowInfoTab();
+	mmi_MainWinCreate();
+	mmi_PutSemaphore(&g_mmi_init_sem_id);
+
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		mmi_PutSemaphore(&g_mmi_gui_init_sem_id);
+	}
+
+	while (GetMessage(&msg, g_mmiMainWin)) {
+		TranslateMessage(&msg);
+		DispatchMessage(&msg);
+	} 
+	return NULL;
+}
+
+VOID mmi_setMainWindToBg()
+{
+	RECT tmpRect = {0, 0, 128, 128};
+	FillBoxWithBitmap(HDC_SCREEN, 0, 0, MMI_LCD_WIDTH, MMI_LCD_HEIGHT, &g_mmiMainBg);
+	SDev_LcdDirectRefresh(&tmpRect);
+}
+
+HWND mmi_getMainWnd()
+{
+	return g_mmiMainWin;
+}
+
+VOID mmi_initLcd(BOOL isPowerOffChager)
+{
+	int ret = -1;
+	pthread_t mmi_lcdmain_thread;
+	if (isPowerOffChager) {
+		mmi_startPowerOffChagerFrame();
+	} else {
+		mmi_startPowerOnFrame();
+	}
+	ret = pthread_create(&mmi_lcdmain_thread, NULL, &lcd_main_entry, NULL);
+	slog(MMI_PRINT, SLOG_DEBUG, "MMIcorem mmi_initLcd end ret = %d\n", ret);
+}
+#endif
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_lcd_page.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_lcd_page.c
new file mode 100755
index 0000000..aa808e0
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_lcd_page.c
@@ -0,0 +1,240 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_lcd_page.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £º
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#ifndef DISABLE_LCD
+#include "mmi_lcd.h"
+
+extern T_LcdShowInfoItem g_LcdShowInfoTab[];
+extern E_zMmi_Sim_Tip s_mmi_sim_tip;
+extern pthread_mutex_t g_mmi_refresh_lcd_mutex;
+
+extern UINT32 g_show_pagefirst;
+extern UINT32 g_show_pagesecond;
+extern UINT32 g_show_pagethird;
+
+static E_zMMI_Lcd_Page_Index g_mmi_lcd_page_index = MMI_SHOW_PAGE_FIRST;
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:ÊÇ·ñÏÔʾ¶¥²ãͼ±ê, visible: TRUE£¬ÏÔʾ;FALSE, Òþ²Ø
+***********************************************************************************/
+static VOID mmi_set_top_bar_visibility(BOOL visible)
+{
+	g_LcdShowInfoTab[LCD_SHOW_NET_SIGNAL].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_SMS].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_WIFI].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NEW_VERSION].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_BATTERY].needShowFL = visible;
+}
+
+static VOID mmi_set_middle_visibility(BOOL visible)
+{
+	g_LcdShowInfoTab[LCD_SHOW_CMCC].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_SIM_STATE].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WPS_ACTIVE].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_CONNECTING].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].needShowFL = visible;
+}
+
+static VOID mmi_set_ssid_page_visibility(BOOL visible)
+{
+	g_LcdShowInfoTab[LCD_SHOW_WIFI_PASSWORD].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_WIFI_SSID].needShowFL = visible;
+}
+
+static VOID mmi_set_ssid2_page_visibility(BOOL visible)
+{
+	g_LcdShowInfoTab[LCD_SHOW_WIFI_PASSWORD2].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_WIFI_SSID2].needShowFL = visible;
+}
+
+static VOID mmi_set_first_page_visibility(BOOL visible)
+{
+	if (g_show_pagefirst) {
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].needShowFL = visible;
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_BAR].needShowFL = visible;
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_SLIDER].needShowFL = visible;
+	}
+}
+
+static VOID mmi_set_second_page_visibility(BOOL visible)
+{
+	if (g_show_pagesecond) {
+		mmi_set_middle_visibility(visible);
+		mmi_set_ssid_page_visibility(visible);
+	}
+}
+
+static VOID mmi_set_third_page_visibility(BOOL visible)
+{
+	if (g_show_pagethird) {
+		g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE].needShowFL = visible;
+	}
+}
+
+static VOID mmi_set_four_page_visibility(BOOL visible)
+{
+//»ùÏßÐèÇó¶àssidʱҪÏÔʾ
+	mmi_set_middle_visibility(visible);
+	mmi_set_ssid2_page_visibility(visible);
+}
+
+static VOID mmi_set_five_page_visibility(BOOL visible)
+{
+//»ùÏßÐèÇó¶àssidʱҪÏÔʾ
+	g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE2].needShowFL = visible;
+}
+
+static VOID mmi_set_all_page_invisibility()
+{
+	mmi_set_first_page_visibility(FALSE);
+	mmi_set_second_page_visibility(FALSE);
+	mmi_set_third_page_visibility(FALSE);
+	mmi_set_ssid2_page_visibility(FALSE);
+	mmi_set_five_page_visibility(FALSE);
+}
+
+
+BOOL mmi_is_the_last_page()
+{
+	int lastpage = 0;
+
+	if (g_show_pagethird)
+		lastpage = MMI_SHOW_PAGE_THIRD;
+
+	else if (g_show_pagefirst)
+		lastpage = MMI_SHOW_PAGE_SECOND;
+
+	return (g_mmi_lcd_page_index == lastpage);
+}
+
+E_zMMI_Lcd_Page_Index mmi_get_lcd_page_index(VOID)
+{
+	return g_mmi_lcd_page_index;
+}
+
+static E_zMMI_Lcd_Page_Index mmi_get_lcd_next_page_index(VOID)
+{
+	E_zMMI_Lcd_Page_Index index = mmi_get_lcd_page_index();
+	E_zMMI_Lcd_Page_Index next_index = index;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI  mmi_get_lcd_next_page_index index = %d\n", index);
+
+	while (index < MMI_SHOW_PAGE_MAX) {
+		if (index == MMI_SHOW_PAGE_FIVE) {
+			index = MMI_SHOW_PAGE_FIRST;
+		} else {
+			index++;
+		}
+
+		if (index == MMI_SHOW_PAGE_FIRST) {
+			if (g_show_pagesecond) {
+				next_index = index;
+				break;
+			}
+		} else if (index == MMI_SHOW_PAGE_SECOND) {
+			if (g_show_pagefirst) {
+				next_index = index;
+				break;
+			}
+		} else if ((index == MMI_SHOW_PAGE_THIRD) && (mmi_get_qrcode_state() == TRUE)) {
+			if (g_show_pagethird) {
+				next_index = index;
+				break;
+			}
+		}
+		if (mmi_get_multi_ssid_switch_flag()) {
+			if (index == MMI_SHOW_PAGE_FOUR) {
+				next_index = index;
+				break;
+			} else if ((index == MMI_SHOW_PAGE_FIVE) && (mmi_get_qrcode_state() == TRUE)) {
+				next_index = index;
+				break;
+			}
+		}
+	}
+
+	return next_index;
+}
+
+
+VOID mmi_set_lcd_page_index(E_zMMI_Lcd_Page_Index index)
+{
+	mmi_getMutex(&g_mmi_refresh_lcd_mutex);
+	g_mmi_lcd_page_index = index;
+	switch (index) {
+	case MMI_SHOW_PAGE_FIRST:
+		mmi_set_all_page_invisibility();
+		mmi_set_top_bar_visibility(TRUE);
+		mmi_set_middle_visibility(TRUE);
+		mmi_set_first_page_visibility(TRUE);
+		break;
+	case MMI_SHOW_PAGE_SECOND:
+		mmi_set_top_bar_visibility(TRUE);
+		mmi_set_all_page_invisibility();
+		mmi_set_second_page_visibility(TRUE);//µÚÒ»Ò³¿ÉÄÜÓÉÆäËüÒ³ÃæÖ±½ÓÇлØËùÒÔÐèÒª½«ÆäËüÒ³ÃæÈ«²¿ÖÃfalse
+		break;
+	case MMI_SHOW_PAGE_THIRD:
+		mmi_set_top_bar_visibility(FALSE);
+		mmi_set_all_page_invisibility();
+		mmi_set_third_page_visibility(TRUE);
+		break;
+	case MMI_SHOW_PAGE_FOUR:
+		mmi_set_top_bar_visibility(TRUE);
+		mmi_set_all_page_invisibility();
+		mmi_set_four_page_visibility(TRUE);
+		break;
+	case MMI_SHOW_PAGE_FIVE:
+		mmi_set_top_bar_visibility(FALSE);
+		mmi_set_all_page_invisibility();
+		mmi_set_five_page_visibility(TRUE);
+		break;
+	default:
+		break;
+	}
+	mmi_putMutex(&g_mmi_refresh_lcd_mutex);
+
+}
+
+
+VOID mmi_handle_lcd_key_switch_page()
+{
+	int page_index = mmi_get_lcd_next_page_index();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI  mmi_handle_lcd_key_switch_page page_index = %d\n", page_index);
+
+	//¹ö¶¯ÏÔʾSSID¶¨Ê±Æ÷stop £¬Î»ÖÃÖÃΪ0
+	mmi_stopLcdShowScrollSSIDTimer();
+	mmi_set_wificode_show_flag(FALSE);
+	if (page_index == MMI_SHOW_PAGE_FIRST) {
+		mmi_set_lcd_page_index(MMI_SHOW_PAGE_FIRST);
+		mmi_set_update_flag(MMI_TASK_SSID);
+	} else if (page_index == MMI_SHOW_PAGE_SECOND) {
+		mmi_set_lcd_page_index(MMI_SHOW_PAGE_SECOND);
+		mmi_set_update_flag(MMI_TASK_TRAFFIC);
+	} else if (page_index == MMI_SHOW_PAGE_THIRD) {
+		mmi_set_wificode_show_flag(TRUE);
+		mmi_set_lcd_page_index(MMI_SHOW_PAGE_THIRD);
+		mmi_set_update_flag(MMI_TASK_WIFICODE);
+	} else if (page_index == MMI_SHOW_PAGE_FOUR) {
+		mmi_set_lcd_page_index(MMI_SHOW_PAGE_FOUR);
+		mmi_set_update_flag(MMI_TASK_SSID);
+	} else if (page_index == MMI_SHOW_PAGE_FIVE) {
+		mmi_set_wificode_show_flag(TRUE);
+		mmi_set_lcd_page_index(MMI_SHOW_PAGE_FIVE);
+		mmi_set_update_flag(MMI_TASK_WIFICODE);
+	}
+
+}
+#endif
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_lcd_timer.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_lcd_timer.c
new file mode 100755
index 0000000..a25e482
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_lcd_timer.c
@@ -0,0 +1,219 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_timer.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI ¶¨Ê±Æ÷²Ù×÷
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#include "mmi_common.h"
+#include "mmi_lcd.h"
+
+#define MMI_LCD_SMS_TIME      							91
+#define MMI_LCD_BATTERY_TIME      						92
+#define MMI_LCD_POWER_ON_OFF_TIME      					93
+#define MMI_LCD_POWER_ON_LAST_FRAME_TIME      			94
+#define MMI_LCD_SCROLL_TIME     						95
+#define MMI_LED_TRAFFIC_WARN_TIME_1000					96
+#define MMI_LED_TRAFFIC_WARN_TIME_100					97
+#define MMI_LED_TRAFFIC_WARN_TIME_4000					98
+
+#define MMI_LCD_SMS_TIMER_PERIOD      					500
+#define MMI_LCD_BATTERY_TIMER_PERIOD      				500
+#define MMI_LCD_POWER_ON_OFF_TIMER_PERIOD      			100
+#define MMI_LCD_POWER_ON_LAST_FRAME_TIMER_PERIOD      	300
+#define MMI_LCD_SCROLL_TIMER_PERIOD      				600
+#define MMI_LED_TRAFFIC_WARN_TIMER_1000 				1000
+#define MMI_LED_TRAFFIC_WARN_TIMER_100 					100
+#define MMI_LED_TRAFFIC_WARN_TIMER_4000 				4000
+
+
+/*****************************************************************************
+ È«¾Ö±äÁ¿¶¨Òå
+******************************************************************************/
+
+/*****************************************************************************
+ ÒýÓñäÁ¿
+******************************************************************************/
+extern UINT32 g_mmi_poweroff_turnon_flag;
+
+/*****************************************************************************
+ º¯Êý
+******************************************************************************/
+/*charger or null battery timer*/
+static BOOL g_mmi_lcd_battery_timer_state = FALSE;
+/*scroll ssid   timer*/
+static BOOL g_mmi_lcd_scrollssid_timer_state = FALSE;
+
+extern sem_t g_mmi_traffic_warn_sem_id;
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:Á÷Á¿¸æ¾¯Ë«ÉÁµÆ¶¨Ê±Æ÷
+***********************************************************************************/
+VOID * mmi_ledon_trafficwarn_timer_callback(VOID *flag)
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_ledon_trafficwarn_timer_callback flag:%d\n", (SINT32)flag);
+	if (flag == 1) {
+		mmi_set_traffic_warn_flag(FALSE);
+		mmi_set_update_flag(MMI_TASK_TRAFFIC);
+	} else {
+		sem_post(&g_mmi_traffic_warn_sem_id);
+	}
+	return NULL;
+}
+
+VOID mmi_startLedTrafficWarnTimer(SINT32 time, SINT32 flag)
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_startLedTrafficWarnTimer time:%d flag:%d\n", time, flag);
+	if (time == 4000 && flag == 1) {
+		int ret1 = -1;
+		ret1 = sc_timer_create(MMI_LED_TRAFFIC_WARN_TIME_4000, TIMER_FLAG_ONCE, MMI_LED_TRAFFIC_WARN_TIMER_4000, &mmi_ledon_trafficwarn_timer_callback, (void *)1);
+		if (ret1 != 0) {
+			slog(MMI_PRINT, SLOG_ERR, "MMI DBB1 FAILED,cause=%d\n", ret1);
+		}
+	} else {
+		if (time == 100) {
+			int ret2 = -1;
+			ret2 = sc_timer_create(MMI_LED_TRAFFIC_WARN_TIME_100, TIMER_FLAG_ONCE, MMI_LED_TRAFFIC_WARN_TIMER_100, &mmi_ledon_trafficwarn_timer_callback, (void *)0);
+			if (ret2 != 0) {
+				slog(MMI_PRINT, SLOG_ERR, "MMI DBB2 FAILED,cause=%d\n", ret2);
+			}
+		} else {
+			int ret3 = -1;
+			ret3 = sc_timer_create(MMI_LED_TRAFFIC_WARN_TIME_1000, TIMER_FLAG_ONCE, MMI_LED_TRAFFIC_WARN_TIMER_1000, &mmi_ledon_trafficwarn_timer_callback, (void *)0);
+			if (ret3 != 0) {
+				slog(MMI_PRINT, SLOG_ERR, "MMI DBB3 FAILED,cause=%d\n", ret3);
+			}
+		}
+	}
+}
+
+VOID mmi_stopLedTrafficWarnTimer()
+{
+	sc_timer_delete(MMI_LED_TRAFFIC_WARN_TIME_100);
+	sc_timer_delete(MMI_LED_TRAFFIC_WARN_TIME_1000);
+	sc_timer_delete(MMI_LED_TRAFFIC_WARN_TIME_4000);
+}
+
+#ifndef DISABLE_LCD
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡Á÷Á¿ÐÅÏ¢¶¨Ê±Æ÷»Øµ÷º¯Êý
+***********************************************************************************/
+static VOID * mmi_lcd_sms_timer_callback(VOID *arg)
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_lcd_sms_timer_callback!!!\n");
+	mmi_set_update_flag(MMI_TASK_SMS);
+	return NULL;
+}
+VOID mmi_startLcdSmsTimer()
+{
+	int ret = -1;
+	ret = sc_timer_create(MMI_LCD_SMS_TIME, TIMER_FLAG_ONCE, MMI_LCD_SMS_TIMER_PERIOD, &mmi_lcd_sms_timer_callback, NULL);
+	if (ret != 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_startLcdSmsTimer FAILED,cause=%d\n", ret);
+	}
+
+}
+VOID mmi_stopLcdSmsTimer()
+{
+	sc_timer_delete(MMI_LCD_SMS_TIME);
+}
+
+static VOID * mmi_lcd_battery_timer_callback(SINT32 task)
+{
+	//slog(MMI_PRINT,SLOG_DEBUG,"MMI mmi_lcd_battery_timer_callback!!!\n");
+	if (!g_mmi_poweroff_turnon_flag) {
+		mmi_set_update_flag((E_zMmi_Task)task);
+	}
+	g_mmi_lcd_battery_timer_state = FALSE;
+	return NULL;
+}
+VOID mmi_startLcdBatteryTimer(SINT32 task)
+{
+	if (g_mmi_lcd_battery_timer_state == FALSE) {
+		int ret = -1;
+		ret = sc_timer_create(MMI_LCD_BATTERY_TIME, TIMER_FLAG_ONCE, MMI_LCD_BATTERY_TIMER_PERIOD, &mmi_lcd_battery_timer_callback, (void *)task);
+		if (ret != 0) {
+			slog(MMI_PRINT, SLOG_ERR, "MMI mmi_startLcdBatteryTimer FAILED,cause=%d\n", ret);
+		}
+		g_mmi_lcd_battery_timer_state = TRUE;
+	}
+
+
+}
+VOID mmi_stopLcdBatteryTimer()
+{
+	if (g_mmi_lcd_battery_timer_state) {
+		sc_timer_delete(MMI_LCD_BATTERY_TIME);
+		g_mmi_lcd_battery_timer_state = FALSE;
+	}
+}
+
+static VOID * mmi_lcd_poweronoff_timer_callback(VOID *arg)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_lcd_poweronoff_timer_callback CB!!!\n");
+	mmi_changePowerOnOffFrame();
+	InvalidateRect(mmi_getMainWnd(), NULL, FALSE);
+	return NULL;
+}
+VOID mmi_startLcdPowerOnOffTimer()
+{
+	int ret = -1;
+	ret = sc_timer_create(MMI_LCD_POWER_ON_OFF_TIME, TIMER_FLAG_ONCE, MMI_LCD_POWER_ON_OFF_TIMER_PERIOD, &mmi_lcd_poweronoff_timer_callback, NULL);
+	if (ret != 0) {
+		slog(MMI_PRINT, SLOG_ERR, " MMI mmi_startLcdPowerOnOffTimer FAILED,cause=%d!!\n", ret);
+	}
+}
+VOID mmi_startLcdPowerOnOffTextFrameTimer()
+{
+
+	int ret = -1;
+	ret = sc_timer_create(MMI_LCD_POWER_ON_LAST_FRAME_TIME, TIMER_FLAG_ONCE, MMI_LCD_POWER_ON_LAST_FRAME_TIMER_PERIOD, &mmi_lcd_poweronoff_timer_callback, NULL);
+	if (ret != 0) {
+		slog(MMI_PRINT, SLOG_ERR, " MMI mmi_startLcdPowerOnOffTextFrameTimer FAILED,cause=%d!!\n", ret);
+	}
+}
+VOID mmi_stopLcdPowerOnOffTimer()
+{
+
+	sc_timer_delete(MMI_LCD_POWER_ON_OFF_TIME);
+
+}
+
+
+/*¹ö¶¯ÏÔʾSSID WifiKey¶¨Ê±Æ÷*/
+static VOID * mmi_lcd_scrollssid_timer_callback(VOID *func)
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI =========mmi_lcd_scrollssid_timer_callback===========!!!\n");
+	if (func != 0) {
+		((SCROLLED_TIMER_CALLBACK)func)();
+	}
+	g_mmi_lcd_scrollssid_timer_state = FALSE;
+	return NULL;
+}
+
+VOID mmi_stopLcdShowScrollSSIDTimer()
+{
+	if (g_mmi_lcd_scrollssid_timer_state) {
+		sc_timer_delete(MMI_LCD_SCROLL_TIME);
+		g_mmi_lcd_scrollssid_timer_state = FALSE;
+	}
+}
+VOID mmi_startLcdShowScrollSSIDTimer(SINT32 func)
+{
+	if (!g_mmi_lcd_scrollssid_timer_state) {
+		int ret = -1;
+		ret = sc_timer_create(MMI_LCD_SCROLL_TIME, TIMER_FLAG_ONCE, MMI_LCD_SCROLL_TIMER_PERIOD, &mmi_lcd_scrollssid_timer_callback, (void *)func);
+		if (ret != 0) {
+			slog(MMI_PRINT, SLOG_ERR, " MMI mmi_startLcdShowScrollSSIDTimer FAILED,cause=%d!!\n", ret);
+		}
+		g_mmi_lcd_scrollssid_timer_state = TRUE;
+	}
+}
+#endif
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_led.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_led.c
new file mode 100755
index 0000000..c2c2cf6
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_led.c
@@ -0,0 +1,832 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_led.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £º
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#include "mmi_common.h"
+
+/********************************************************************************
+  È«¾Ö±äÁ¿ÒýÓÃ
+**********************************************************************************/
+extern UINT32 g_smstask_enable;
+extern UINT32 g_voicetask_enable;
+extern UINT32 g_led_sleep_mode;
+
+/*****************************************************************************
+ È«¾Ö±äÁ¿¶¨Òå
+******************************************************************************/
+MMI_LED_STATE s_mmi_batled_laststate = LED_STATE_MAX;//±ê¼Çµç³ØµÆµÄÉÏÒ»´Î״̬
+MMI_LED_STATE s_mmi_wanled_laststate = LED_STATE_MAX;//±ê¼ÇÍøÂçµÆµÄÉÏÒ»´Î״̬
+MMI_LED_STATE s_mmi_lanled_laststate = LED_STATE_MAX;//±ê¼ÇwifiµÆµÄÉÏÒ»´Î״̬
+MMI_LED_STATE s_mmi_smsled_laststate = LED_STATE_MAX;//±ê¼Ç¶ÌÐŵƵÄÉÏÒ»´Î״̬
+MMI_LED_STATE s_mmi_traled_laststate = LED_STATE_MAX;//±ê¼ÇÁ÷Á¿µÆµÄÉÏÒ»´Î״̬
+MMI_LED_STATE s_mmi_voiled_laststate = LED_STATE_MAX;//±ê¼ÇÓïÒôµÆµÄÉÏÒ»´Î״̬
+
+extern POWER_ON_OFF_CALLBACK_FUN g_PowerOnOffFun;
+extern T_zMmiSmsLedConfig g_mmi_smsled_config_tab[];
+extern T_zMmiWifiLedConfig g_mmi_wifiled_config_tab[];
+extern T_zMmiNetLedConfig g_mmi_netled_config_tab[];
+extern T_zMmiBatteryLedConfig g_mmi_batled_config_tab[];
+extern T_zMmiVoipLedConfig g_mmi_voipled_config_tab[];
+extern T_zMmiNetLedConfig g_mmi_signalled_config_tab[];
+extern T_zMmiWifiLedConfig g_mmi_wpsled_config_tab[];
+extern T_zMmiRj11LedConfig g_mmi_rj11led_config_tab[];
+
+
+extern sem_t g_mmi_traffic_warn_sem_id;
+BOOL s_mmi_trafficled_warn_flag = FALSE;//±ê¼ÇÁ÷Á¿¸æ¾¯µÆÊÇ·ñÕýÔÚË«ÉÁÖÐ
+extern int g_customer_type;
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:LEDµÆ²Ù×÷
+***********************************************************************************/
+static VOID mmi_led_operate_blink_off(T_zMmi_Led_Info*  userInfo)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_led_operate name= %d\n", userInfo->led_name);
+	T_zMmi_Led_Info tmpInfo = {0};
+	memcpy((VOID *)(&tmpInfo), (const VOID *)userInfo, sizeof(T_zMmi_Led_Info));
+	tmpInfo.led_state = LED_STATE_OFF;
+	tmpInfo.led_color = userInfo->led_color;
+	mmi_led_operate(&tmpInfo);
+
+}
+
+static VOID mmi_led_operate_set_blinktime(T_zMmi_Led_Blink_Time *blink_time, MMI_LED_BLINK_SPEED speed)
+{
+	switch (speed) {
+	case LED_STATE_FAST_BLINK: {
+		blink_time->uBlinkOnTime = LED_FAST_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_FAST_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_SLOW_BLINK: {
+		blink_time->uBlinkOnTime = LED_SLOW_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_SLOW_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_BAT_BLINK: {
+		blink_time->uBlinkOnTime = LED_BAT_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_BAT_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_LAN_BLINK: {
+		blink_time->uBlinkOnTime = LED_LAN_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_LAN_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_SMS_BLINK: {
+		blink_time->uBlinkOnTime = LED_SMS_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_SMS_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_WAN_BLINK: {
+		blink_time->uBlinkOnTime = LED_WAN_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_WAN_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_VOIP_BLINK: {
+		blink_time->uBlinkOnTime = LED_VOIP_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_VOIP_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_WAN_FAST_BLINK: {
+		blink_time->uBlinkOnTime = LED_WAN_FAST_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_WAN_FAST_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_WAN_SLOW_BLINK: {
+		blink_time->uBlinkOnTime = LED_WAN_SLOW_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_WAN_SLOW_BLINK_OFF_TIME;
+		break;
+	}
+	//yaoyuan cpe
+	case LED_STATE_WAN_CPE_FAST_BLINK: {
+		blink_time->uBlinkOnTime = LED_WAN_CPE_FAST_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_WAN_CPE_FAST_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_WAN_CPE_SLOW_BLINK: {
+		blink_time->uBlinkOnTime = LED_WAN_CPE_SLOW_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_WAN_CPE_SLOW_BLINK_OFF_TIME;
+		break;
+	}
+	default: {
+		break;
+	}
+	}
+}
+
+static VOID mmi_set_led_laststate(T_zMmi_Led_Info*  userInfo)
+{
+	switch (userInfo->led_name) {
+	case LED_BATTERY: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_batled_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_batled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_batled_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_batled_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+	case LED_WAN: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_wanled_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_wanled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_wanled_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_wanled_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+	case LED_LAN: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_lanled_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_lanled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_lanled_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_lanled_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+	case LED_SMS: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_smsled_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_smsled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_smsled_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_smsled_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+	case LED_TRAFFIC: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_traled_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_traled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_traled_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_traled_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+	case LED_VOIP: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_voiled_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_voiled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_voiled_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_voiled_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+#if 0
+	//yao yuan
+	case LED_SIGNAL: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_sigled_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_voiled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_sigled_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_sigled_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+	case LED_WPS: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_wpsled_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_voiled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_wpsled_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_wpsled_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+	case LED_RJ11: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_rj11led_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_voiled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_rj11led_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_rj11led_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+#endif	
+	default: {
+		break;
+	}
+	}
+}
+
+SINT32 mmi_showLed(UINT32 ledInfo)
+{
+	T_zMmi_Led_Info *led_info = (T_zMmi_Led_Info *)ledInfo;
+	T_zMmi_Led_Blink_Time blink_time = {0};
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_showLed name= %d ,state = %d, color=%d !\n", led_info->led_name, led_info->led_state, led_info->led_color);
+
+	mmi_set_led_laststate(led_info);
+	if (led_info->led_state == LED_STATE_BLINK) {
+		mmi_led_operate_set_blinktime(&blink_time, led_info->ledBlink_speed);
+		led_info->ledBlink_time = blink_time;
+	}
+	if (led_info->led_name == LED_TRAFFIC && s_mmi_traled_laststate == LED_STATE_BLINK && led_info->led_state == LED_STATE_OFF) {
+		mmi_led_operate(led_info);//Á÷Á¿µÆÉÏÒ»¸ö״̬ʱÉÁ˸£¬ÐèÒª¹ØÁ½´Î²ÅÄܹصô
+	}
+	mmi_led_operate(led_info);
+	return 0;
+}
+
+static VOID mmi_setLedShowInfo(T_zMmi_Led_Info* outLedInfo, T_zMmi_Led_Info inLedInfo)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_setLedShowInfo inLedInfo name:%d,state:%d,color:%d\n", inLedInfo.led_name, inLedInfo.led_state, inLedInfo.led_color);
+	outLedInfo->led_name = inLedInfo.led_name;
+	outLedInfo->led_color = inLedInfo.led_color;
+	outLedInfo->traffic = inLedInfo.traffic;
+	outLedInfo->led_state = inLedInfo.led_state;
+	outLedInfo->ledBlink_speed = inLedInfo.ledBlink_speed;
+
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_setLedShowInfo outLedInfo name:%d,state:%d,color:%d\n", outLedInfo->led_name, outLedInfo->led_state, outLedInfo->led_color);
+}
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡¶ÌÐŵÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedSmsInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMmi_Sms_Info *pSmsInfo = (T_zMmi_Sms_Info*)taskInfo;
+	UINT32 i = 0;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getLedSmsInfo recvBox_sta=%d\n",pSmsInfo->recvBox_sta);
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_SMS) / sizeof(T_zMmiSmsLedConfig); ++ i) {
+		if (pSmsInfo->recvBox_sta == g_mmi_smsled_config_tab[i].sms_info.recvBox_sta) {
+			mmi_setLedShowInfo(pLedInfo, g_mmi_smsled_config_tab[i].led_info);
+			return MMI_SUCCESS;
+		}
+	}
+	return MMI_ERROR;
+}
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÓïÒôÌáʾµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedVoipInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMmi_Voip_Info *pVoipInfo = (T_zMmi_Voip_Info*)taskInfo;
+	UINT32 i = 0;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getLedVoipInfo voip_sta=%d\n",pVoipInfo->voip_sta);
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_VOIP) / sizeof(T_zMmiVoipLedConfig); ++ i) {
+		if (pVoipInfo->voip_sta == g_mmi_voipled_config_tab[i].voip_info.voip_sta) {
+			mmi_setLedShowInfo(pLedInfo, g_mmi_voipled_config_tab[i].led_info);
+			return MMI_SUCCESS;
+		}
+	}
+	return MMI_ERROR;
+}
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡rj11µÆÐÅÏ¢ Ò¢Ô¶cpe
+***********************************************************************************/
+SINT32 mmi_getLedRj11Info(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMmi_Rj11_Info *pVoipInfo = (T_zMmi_Rj11_Info*)taskInfo;
+	UINT32 i = 0;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getLedRj11Info rj11_sta=%d\n",pVoipInfo->rj11_sta);
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_RJ11) / sizeof(T_zMmiRj11LedConfig); ++ i) {
+		if (pVoipInfo->rj11_sta == g_mmi_rj11led_config_tab[i].rj11_info.rj11_sta) {
+			mmi_setLedShowInfo(pLedInfo, g_mmi_rj11led_config_tab[i].led_info);
+			return MMI_SUCCESS;
+		}
+	}
+	return MMI_ERROR;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡µç³ØµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedBatteryInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMMIBatteryInfo *pBatteryInfo = (T_zMMIBatteryInfo *)taskInfo;
+	UINT32 i = 0;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getLedBatteryInfo chg_sta=%d\n", pBatteryInfo->chg_state);
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_BATTERY) / sizeof(T_zMmiBatteryLedConfig); ++ i) {
+		if (pBatteryInfo->chg_state == g_mmi_batled_config_tab[i].bat_info.chg_state) {
+			if (pBatteryInfo->chg_state == STATE_DISCHARGE) {
+				if (pBatteryInfo->bat_level == g_mmi_batled_config_tab[i].bat_info.bat_level) {
+					mmi_setLedShowInfo(pLedInfo, g_mmi_batled_config_tab[i].led_info);
+					return MMI_SUCCESS;
+				}
+			} else {
+				mmi_setLedShowInfo(pLedInfo, g_mmi_batled_config_tab[i].led_info);
+				return MMI_SUCCESS;
+			}
+		}
+	}
+	return MMI_ERROR;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÍøÂçµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedNetInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMMINetInfo *pNetInfo = (T_zMMINetInfo *)taskInfo;
+	UINT32 i = 0;
+	int customer_type = g_customer_type; 
+	E_zMmi_Net_Mode net_mode = pNetInfo->net_mode;
+	char mmi_nv_value[32] = {0};
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getLedNetInfo net_mode=%d connect %d socket %d customer_type=%d\n",pNetInfo->net_mode,pNetInfo->connect_status,pNetInfo->socket_state,g_customer_type);
+
+	sc_cfg_get("mmi_led_plan", mmi_nv_value, sizeof(mmi_nv_value));
+	if (0 == strcmp(mmi_nv_value, "yaoyuan")) {
+		customer_type = CUSTOMER_YAOYUAN;
+		
+		sc_cfg_get(NV_MODEM_MAIN_STATE, mmi_nv_value, sizeof(mmi_nv_value));
+		if (strcmp(mmi_nv_value, NV_SIM_STATE_INIT_COMPLETE)) {
+			net_mode = NET_MODE_NOTREADY;
+		}
+	}
+
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_WAN) / sizeof(T_zMmiNetLedConfig); ++ i) {
+		if ((net_mode == g_mmi_netled_config_tab[i].net_info.net_mode) && (customer_type == g_mmi_netled_config_tab[i].custom_type)) {
+			if (net_mode == NET_MODE_NOSERVICE 
+				|| net_mode == NET_MODE_LIMITSERVICE
+				|| net_mode == NET_MODE_NOTREADY) {
+				mmi_setLedShowInfo(pLedInfo, g_mmi_netled_config_tab[i].led_info);
+				return MMI_SUCCESS;
+			} else {
+				if ((pNetInfo->connect_status == g_mmi_netled_config_tab[i].net_info.connect_status) && (pNetInfo->socket_state == g_mmi_netled_config_tab[i].net_info.socket_state)) {
+					mmi_setLedShowInfo(pLedInfo, g_mmi_netled_config_tab[i].led_info);
+					slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_getLedNetInfo netmode = %d, con_sta = %d,i = %d,ledsta = %d\n", net_mode, pNetInfo->connect_status, i, g_mmi_netled_config_tab[i].led_info.led_state);
+					return MMI_SUCCESS;
+				}
+			}
+		}
+	}
+	return MMI_ERROR;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÍøÂçÐźŸñÐÅÏ¢£¨Ò¢Ô¶cpe£©
+***********************************************************************************/
+SINT32 mmi_getLedNetSigInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMMINetInfo *pNetInfo = (T_zMMINetInfo *)taskInfo;
+	UINT32 i = 0;
+	int customer_type = g_customer_type; 
+	E_zMmi_Net_Mode net_mode = pNetInfo->net_mode;
+	char mmi_nv_value[32] = {0};
+
+	sc_cfg_get("mmi_led_plan", mmi_nv_value, sizeof(mmi_nv_value));
+	if (0 == strcmp(mmi_nv_value, "yaoyuan")) {
+		customer_type = CUSTOMER_YAOYUAN;
+	}
+
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getLedNetSigInfo net_mode=%d signal_num %d customer_type=%d\n",pNetInfo->net_mode,pNetInfo->signal_num,customer_type);
+
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_SIGNAL) / sizeof(T_zMmiNetLedConfig); ++ i) {
+		if ((net_mode == g_mmi_signalled_config_tab[i].net_info.net_mode) && (customer_type == g_mmi_signalled_config_tab[i].custom_type)) {
+			if (net_mode == NET_MODE_NOSERVICE 
+				|| net_mode == NET_MODE_LIMITSERVICE
+				|| net_mode == NET_MODE_NOTREADY) {
+				mmi_setLedShowInfo(pLedInfo, g_mmi_signalled_config_tab[i].led_info);
+				return MMI_SUCCESS;
+			} else {
+				if (pNetInfo->signal_num == g_mmi_signalled_config_tab[i].net_info.signal_num) {
+					mmi_setLedShowInfo(pLedInfo, g_mmi_signalled_config_tab[i].led_info);
+					slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_getLedNetSigInfo netmode = %d, con_sta = %d,i = %d,ledsta = %d\n", net_mode, pNetInfo->connect_status, i, g_mmi_netled_config_tab[i].led_info.led_state);
+					return MMI_SUCCESS;
+				}
+			}
+		}
+	}
+	return MMI_ERROR;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡WIFIµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedWifiInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMMIWifiInfo * pWifiInfo = (T_zMMIWifiInfo *)taskInfo;
+	UINT32 i = 0;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getLedWifiInfo wifi_state=%d, wifidata_state=%d\n",pWifiInfo->wifi_state,pWifiInfo->wifidata_state);
+
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_LAN) / sizeof(T_zMmiWifiLedConfig); ++ i) {
+		if (pWifiInfo->wifi_state == g_mmi_wifiled_config_tab[i].wifi_info.wifi_state
+		    && pWifiInfo->wifidata_state == g_mmi_wifiled_config_tab[i].wifi_info.wifidata_state
+		    && (g_customer_type == g_mmi_wifiled_config_tab[i].custom_type)) {
+			mmi_setLedShowInfo(pLedInfo, g_mmi_wifiled_config_tab[i].led_info);
+			return MMI_SUCCESS;
+		}
+	}
+	return MMI_ERROR;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡wpsµÆÐÅÏ¢ Ò¢Ô¶cpe
+***********************************************************************************/
+SINT32 mmi_getLedWpsInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMMIWifiInfo * pWifiInfo = (T_zMMIWifiInfo *)taskInfo;
+	UINT32 i = 0;
+	
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getLedWpsInfo wps_state=%d customer_type=%d\n",pWifiInfo->wps_state, g_customer_type);
+
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_WPS) / sizeof(T_zMmiWifiLedConfig); ++ i) {
+		if (pWifiInfo->wps_state == g_mmi_wpsled_config_tab[i].wifi_info.wps_state
+		    && (g_customer_type == g_mmi_wpsled_config_tab[i].custom_type)) {
+			mmi_setLedShowInfo(pLedInfo, g_mmi_wpsled_config_tab[i].led_info);
+			return MMI_SUCCESS;
+		}
+	}
+	return MMI_ERROR;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:Á÷Á¿¸æ¾¯Ë«ÉÁµÆ
+***********************************************************************************/
+VOID mmi_set_led_double_blink()
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_set_led_double_blink 1000ms off\n");
+
+	T_zMmi_Led_Info userInfo = {0};
+	userInfo.led_name = LED_WAN;
+	userInfo.led_state = LED_STATE_OFF;
+	userInfo.led_color = LED_COLOR_YELLOW;
+	mmi_led_operate(&userInfo);
+	userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+	mmi_startLedTrafficWarnTimer(1000, 0);
+
+	int sem_ret1 = -1;
+	sem_ret1 = mmi_GetSemaphoreEintr(&g_mmi_traffic_warn_sem_id, MMI_WAIT_FOREVER);
+	if (sem_ret1 != MMI_SUCCESS) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI DBget1 FAILED! errno=%d\n",errno);
+	}
+	userInfo.led_color = LED_COLOR_RED;
+	userInfo.led_state = LED_STATE_ON;
+	mmi_led_operate(&userInfo);
+	mmi_startLedTrafficWarnTimer(100, 0);
+
+	int sem_ret2 = -1;
+	sem_ret2 = mmi_GetSemaphoreEintr(&g_mmi_traffic_warn_sem_id, MMI_WAIT_FOREVER);
+	if (sem_ret2 != MMI_SUCCESS) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI DBget2 FAILED! errno=%d\n",errno);
+	}
+
+	userInfo.led_state = LED_STATE_OFF;
+	mmi_led_operate(&userInfo);
+	mmi_startLedTrafficWarnTimer(100, 0);
+
+	int sem_ret3 = -1;
+	sem_ret3 = mmi_GetSemaphoreEintr(&g_mmi_traffic_warn_sem_id, MMI_WAIT_FOREVER);
+	if (sem_ret3 != MMI_SUCCESS) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI DBget3 FAILED! errno=%d\n",errno);
+	}
+
+	userInfo.led_state = LED_STATE_ON;
+	mmi_led_operate(&userInfo);
+	mmi_startLedTrafficWarnTimer(100, 0);
+
+	int sem_ret4 = -1;
+	sem_ret4 = mmi_GetSemaphoreEintr(&g_mmi_traffic_warn_sem_id, MMI_WAIT_FOREVER);
+	if (sem_ret4 != MMI_SUCCESS) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI DBget4 FAILED! errno=%d\n",errno);
+	}
+
+	userInfo.led_state = LED_STATE_OFF;
+	mmi_led_operate(&userInfo);
+	mmi_startLedTrafficWarnTimer(1000, 0);
+
+	int sem_ret5 = -1;
+	sem_ret5 = mmi_GetSemaphoreEintr(&g_mmi_traffic_warn_sem_id, MMI_WAIT_FOREVER);
+	if (sem_ret5 != MMI_SUCCESS) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI DBget5 FAILED! errno=%d\n",errno);
+	}
+
+	mmi_set_update_flag(MMI_TASK_NET);
+	mmi_startLedTrafficWarnTimer(4000, 1);
+}
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:ÉèÖÃÁ÷Á¿¾¯¸æ±êÖ¾
+***********************************************************************************/
+VOID mmi_set_traffic_warn_flag(BOOL flag)
+{
+	s_mmi_trafficled_warn_flag = flag;
+}
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡Á÷Á¿µÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedTrafficInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMMITrafficInfo * pTrafficInfo = (T_zMMITrafficInfo *)taskInfo;
+
+#if 0
+	pLedInfo->led_name = IOCTL_LED_TRAFFIC;
+	pLedInfo->userPara.uBrightness = 0;
+	pLedInfo->userPara.uColor = LED_COLOR_GREEN;
+	pLedInfo->userPara.uSleep = LED_SLEEP_MAX;
+	if (pTrafficInfo->traffic_switch == TRAFFIC_LIMIT_SWITCH_OFF) {
+		pLedInfo->userPara.uState = LED_STATE_OFF;
+		pLedInfo->speed = LED_STATE_DEFAULT_BLINK;
+		pLedInfo->userPara.uTraffic = LED_TRAFFIC_100;
+	} else {
+		if (pTrafficInfo->warning_tip_flag == 0) {
+			pLedInfo->userPara.uState = LED_STATE_ON;
+			pLedInfo->speed = LED_STATE_DEFAULT_BLINK;
+		} else {
+			pLedInfo->userPara.uState = LED_STATE_BLINK;
+			pLedInfo->speed = LED_STATE_FAST_BLINK;
+		}
+	}
+#endif
+
+	UINT32 temp = 100 * (pTrafficInfo->uesd_traffic / pTrafficInfo->total_traffic);
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getLedTrafficInfo temp = %d, level = %d\n", temp, pTrafficInfo->warning_tip_level);
+	if ((pTrafficInfo->warning_tip_level != 0) && (temp >= pTrafficInfo->warning_tip_level) && (pTrafficInfo->traffic_switch == TRAFFIC_LIMIT_SWITCH_ON)) {
+		if (!s_mmi_trafficled_warn_flag) {
+			mmi_set_traffic_warn_flag(TRUE);
+			mmi_set_led_double_blink();
+		}
+	} else {
+		mmi_set_traffic_warn_flag(FALSE);
+		mmi_stopLedTrafficWarnTimer();
+		mmi_set_update_flag(MMI_TASK_NET);
+	}
+	return MMI_ERROR;
+
+}
+
+static VOID mmi_set_allleds_off(E_zMMI_BatLed_Mode mode)
+{
+	T_zMmi_Led_Info userInfo = {0};
+
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_set_allleds_off mode = %d\n", mode);
+	mmi_set_traffic_warn_flag(FALSE);
+	mmi_stopLedTrafficWarnTimer();
+	mmi_clean_update_flag(MMI_TASK_NET);
+	mmi_clean_update_flag(MMI_TASK_TRAFFIC);
+	mmi_clean_update_flag(MMI_TASK_WIFI);
+	
+	mmi_clean_update_flag(MMI_TASK_NETSIGNAL);
+	mmi_clean_update_flag(MMI_TASK_LED_WPS);
+	mmi_clean_update_flag(MMI_TASK_RJ11);
+
+	if (g_voicetask_enable)
+		mmi_clean_update_flag(MMI_TASK_VOIP);
+	else if (g_smstask_enable)
+		mmi_clean_update_flag(MMI_TASK_SMS);
+
+	if (mode == MODE_OFF) {
+		userInfo.led_name = LED_BATTERY;
+		userInfo.led_color = LED_COLOR_YELLOW;
+		userInfo.led_state = LED_STATE_OFF;
+
+		mmi_led_operate(&userInfo);
+	} else if (mode == MODE_CHARGING) {
+
+	} else if (mode == MODE_STANDBY) {
+		userInfo.led_name = LED_BATTERY;
+		userInfo.led_color = LED_COLOR_GREEN;
+		userInfo.led_state = LED_STATE_BLINK;
+		userInfo.ledBlink_time.uBlinkOffTime = LED_BREATH_BLINK_OFF_TIME;
+		userInfo.ledBlink_time.uBlinkOnTime = LED_BREATH_BLINK_ON_TIME;
+		mmi_led_operate(&userInfo);
+	}
+	userInfo.led_name = LED_WAN;
+	userInfo.led_state = LED_STATE_OFF;
+	userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+	userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_LAN;
+	mmi_led_operate(&userInfo);
+	if (g_voicetask_enable)
+		userInfo.led_name = LED_VOIP;
+	else if (g_smstask_enable)
+		userInfo.led_name = LED_SMS;
+	mmi_led_operate(&userInfo);
+	//yaoyuan cpe
+	userInfo.led_color = LED_COLOR_BLUE;
+	userInfo.led_name = LED_WPS;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_RJ11;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_SIGNAL;
+	mmi_led_operate(&userInfo);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¹Ø»ú»òÖØÆôʱËùÓеÆÏÈÈ«ÁÁÔÙÈ«Ãð
+***********************************************************************************/
+VOID mmi_set_allleds_blink(VOID)
+{
+
+	mmi_set_traffic_warn_flag(FALSE);
+	mmi_stopLedTrafficWarnTimer();
+	mmi_clean_update_flag(MMI_TASK_NET);
+	mmi_clean_update_flag(MMI_TASK_TRAFFIC);
+	mmi_clean_update_flag(MMI_TASK_WIFI);
+	//yao yuan
+	mmi_clean_update_flag(MMI_TASK_NETSIGNAL);
+	mmi_clean_update_flag(MMI_TASK_LED_WPS);
+	mmi_clean_update_flag(MMI_TASK_RJ11);
+
+	if (g_voicetask_enable)
+		mmi_clean_update_flag(MMI_TASK_VOIP);
+	else if (g_smstask_enable)
+		mmi_clean_update_flag(MMI_TASK_SMS);
+
+	T_zMmi_Led_Info userInfo = {0};
+
+	userInfo.led_name = LED_BATTERY;
+	userInfo.led_state = LED_STATE_ON;
+	userInfo.led_color = LED_COLOR_RED;
+	mmi_led_operate(&userInfo);
+
+	userInfo.led_name = LED_LAN;
+	userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+
+	if (g_voicetask_enable)
+		userInfo.led_name = LED_VOIP;
+	else if (g_smstask_enable)
+		userInfo.led_name = LED_SMS;
+	userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+
+	userInfo.led_name = LED_WAN;
+	if(g_customer_type == CUSTOMER_SDK_MIN)
+		userInfo.led_color = LED_COLOR_GREEN;
+	else
+		userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+
+	//yaoyuan cpe
+	userInfo.led_color = LED_COLOR_BLUE;
+	userInfo.led_name = LED_WPS;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_RJ11;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_SIGNAL;
+	userInfo.traffic = TRAFFIC_LED_5;
+	mmi_led_operate(&userInfo);
+
+
+	mmi_sleep(LED_BLINK_TIME_INTERVAL);
+
+	userInfo.led_state = LED_STATE_OFF;
+
+	userInfo.led_name = LED_BATTERY;
+	userInfo.led_color = LED_COLOR_RED;
+	mmi_led_operate(&userInfo);
+
+	userInfo.led_name = LED_LAN;
+	userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+
+	if (g_voicetask_enable)
+		userInfo.led_name = LED_VOIP;
+	else if (g_smstask_enable)
+		userInfo.led_name = LED_SMS;
+	userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+
+	userInfo.led_name = LED_WAN;
+	userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+	//yaoyuan cpe
+	userInfo.led_color = LED_COLOR_BLUE;
+	userInfo.led_name = LED_WPS;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_RJ11;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_SIGNAL;
+	mmi_led_operate(&userInfo);
+	
+	slog(MMI_PRINT, SLOG_DEBUG, "mmi_set_allleds_blink  off!\n");
+}
+SINT32 mmi_getLedCtrlInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMMICtrlInfo * pCtrlInfo = (T_zMMICtrlInfo *)taskInfo;
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+
+	pLedInfo->traffic = TRAFFIC_LED_MAX;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_getLedCtrlInfo pCtrlInfo->ledmode = %d\n", pCtrlInfo->ledmode);
+	switch (pCtrlInfo->ledmode) {
+	case MMI_ACTIVE_MODE:
+		mmi_set_update_flag(MMI_TASK_BATTERY);
+
+		if (g_voicetask_enable)
+			mmi_set_update_flag(MMI_TASK_VOIP);
+		else if (g_smstask_enable)
+			mmi_set_update_flag(MMI_TASK_SMS);
+
+		mmi_set_update_flag(MMI_TASK_WIFI);
+		mmi_set_update_flag(MMI_TASK_NET);
+		mmi_set_update_flag(MMI_TASK_TRAFFIC);
+		mmi_set_update_flag(MMI_TASK_LED_WPS);
+		break;
+	case MMI_IDLE_LEDOFF_MODE:
+		if (g_customer_type == CUSTOMER_SDK || g_customer_type == CUSTOMER_SDK_MIN) {
+			mmi_set_allleds_off(MODE_OFF);
+		}		
+		set_wake_unlock(MMI_MAIN_LOCK_ID);
+		break;
+	case MMI_IDLE_STANDBY_LEDOFF_MODE:
+		if (g_customer_type == CUSTOMER_SDK || g_customer_type == CUSTOMER_SDK_MIN) {
+			mmi_set_allleds_off(MODE_STANDBY);
+		}		
+		set_wake_unlock(MMI_MAIN_LOCK_ID);
+		break;
+	case MMI_FAKE_POWEROFF_MODE:
+		mmi_set_allleds_off(MODE_OFF);
+		set_wake_unlock(MMI_MAIN_LOCK_ID);
+		break;
+	case MMI_IDLE_CHG_LEDOFF_MODE:
+		if (g_customer_type == CUSTOMER_SDK || g_customer_type == CUSTOMER_SDK_MIN) {
+			mmi_set_allleds_off(MODE_CHARGING);
+		}
+		break;
+	case MMI_FAKE_POWEROFF_CHARGE_MODE:
+		mmi_set_update_flag(MMI_TASK_BATTERY);
+		mmi_set_allleds_off(MODE_CHARGING);
+		break;
+	case MMI_POWEROFF_MODE:
+	case MMI_RESET_MODE:
+	case MMI_RESTART_MODE:
+		if(g_customer_type == CUSTOMER_SDK || g_customer_type == CUSTOMER_SDK_MIN){
+			mmi_set_allleds_blink();
+		}
+#ifndef DISABLE_LCD
+		if (g_PowerOnOffFun != NULL) {
+			slog(MMI_PRINT, SLOG_DEBUG, "mmi_set_allleds_blink  g_PowerOnOffFun!\n");
+			g_PowerOnOffFun();
+		}
+#endif
+		break;
+	case MMI_FAST_POWERON_MODE:
+		mmi_set_allleds_blink();
+		mmi_set_update_flag(MMI_TASK_BATTERY);
+
+		if (g_voicetask_enable)
+			mmi_set_update_flag(MMI_TASK_VOIP);
+		else if (g_smstask_enable)
+			mmi_set_update_flag(MMI_TASK_SMS);
+
+		mmi_set_update_flag(MMI_TASK_WIFI);
+		mmi_set_update_flag(MMI_TASK_NET);
+		mmi_set_update_flag(MMI_TASK_TRAFFIC);
+		mmi_set_update_flag(MMI_TASK_LED_WPS);
+		break;
+	case MMI_POWEROFF_ON_MODE:
+		break;
+	default:
+		break;
+	}
+	return MMI_ERROR;
+}
+
+SINT32 mmi_getLedPowerOffChagerInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Poc_Info *pPocInfo = (T_zMmi_Poc_Info *)taskInfo;
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	pLedInfo->led_name = LED_BATTERY;
+	pLedInfo->traffic = TRAFFIC_LED_MAX;
+	pLedInfo->led_color = LED_COLOR_GREEN;
+
+	if (pPocInfo->poc_sta == POC_STATE_FULL || pPocInfo->poc_sta == POC_STATE_TEMP_ERROR) {
+		pLedInfo->led_state = LED_STATE_ON;
+	}
+	else if (pPocInfo->poc_sta == POC_STATE_LOWBATTERY) {
+		pLedInfo->led_color = LED_COLOR_RED;
+		pLedInfo->led_state = LED_STATE_ON;
+	}
+	else {
+		pLedInfo->led_state = LED_STATE_BLINK;
+		pLedInfo->ledBlink_speed = LED_STATE_BAT_BLINK;
+	}
+	return MMI_SUCCESS;
+
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_led_adapter.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_led_adapter.c
new file mode 100755
index 0000000..f9ad4b7
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_led_adapter.c
@@ -0,0 +1,1430 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmiledadapter.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºLED²Ù×÷
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+
+/*****************************************************************************
+ Í·Îļþ
+******************************************************************************/
+#include "mmi_common.h"
+
+#define itoa(i,a,b) (((b) == 16) ? sprintf((a), "%x", (i)) : sprintf((a), "%d", (i)))
+
+MMI_LED_LASTSTATE g_mmi_wanled_state = LED_ALL_OFF;//±ê¼ÇÍøÂçµÆµÄµ±Ç°×´Ì¬
+MMI_LED_BLINK_SPEED g_mmi_wanled_speed = LED_STATE_DEFAULT_BLINK;//±ê¼ÇÍøÂçµÆµÄÉÁ˸ƵÂÊ
+MMI_LED_LASTSTATE g_mmi_lanled_state = LED_ALL_OFF;//±ê¼ÇwifiµÆµÄµ±Ç°×´Ì¬
+MMI_LED_LASTSTATE g_mmi_batteryled_state = LED_ALL_OFF;//±ê¼Çµç³ØµÆµÄµ±Ç°×´Ì¬
+MMI_LED_LASTSTATE g_mmi_smsled_state = LED_ALL_OFF;//±ê¼Ç¶ÌÐŵƵĵ±Ç°×´Ì¬
+MMI_LED_LASTSTATE g_mmi_voipled_state = LED_ALL_OFF;//±ê¼ÇÓïÒôµÆµÄµ±Ç°×´Ì¬
+MMI_LED_LASTSTATE g_mmi_signalled_state = LED_ALL_OFF;//±ê¼ÇÒ¢Ô¶cpeÍøÂçÐźŵƵĵ±Ç°×´Ì¬
+MMI_LED_LASTSTATE g_mmi_wpsled_state = LED_ALL_OFF;//±ê¼ÇÒ¢Ô¶cpe wpsµÆµÄµ±Ç°×´Ì¬
+MMI_LED_LASTSTATE g_mmi_rj11led_state = LED_ALL_OFF;//±ê¼ÇÒ¢Ô¶cpe rj11µÆµÄµ±Ç°×´Ì¬
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:дÎļþ²Ù×÷º¯Êý
+***********************************************************************************/
+SINT32 mmi_file_operate(char *filepath, char *buf)
+{
+#if 1
+	SINT32 ret_fd = 0;
+	SINT32 len = 0;
+
+	ret_fd = open(filepath, O_RDWR);
+	if (ret_fd == -1) {
+		slog(MMI_PRINT, SLOG_ERR,"MMI mmi_file_operate open file fail: %s!\n", filepath);
+		return MMI_ERROR;
+	}
+
+	len = strlen(buf);
+	if (write(ret_fd, buf, len) != len) {
+		slog(MMI_PRINT, SLOG_ERR,"MMI mmi_file_operate write file fail: %s!\n", filepath);
+		close((int)ret_fd);
+		return MMI_ERROR;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_file_operate write file: %s success!!\n", filepath);
+	close((int)ret_fd);
+#endif
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:µãÁÁ
+***********************************************************************************/
+static SINT32 mmi_led_opt_on(char *filepath)
+{
+	return mmi_file_operate(filepath, "1");
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:µãÃð
+***********************************************************************************/
+static SINT32 mmi_led_opt_off(char *filebrightness)
+{
+	return mmi_file_operate(filebrightness, "0");
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ÉÁ˸
+***********************************************************************************/
+static SINT32 mmi_led_opt_blinkon(T_zMmi_LedBlink_Info *info)
+{
+	char buf1[12] = {0};
+	char buf2[12] = {0};
+	SINT32 ret1, ret2, ret3 = 0;
+
+	ret1 = mmi_file_operate(info->fileblinkSwitch, LED_BLINKON_STATE);
+
+
+	itoa((int)(info->timeon), buf1, 10);
+	ret2 = mmi_file_operate(info->fileblinktimeon, buf1);
+
+	itoa((int)(info->timoff), buf2, 10);
+	ret3 = mmi_file_operate(info->fileblinktimeoff, buf2);
+	if (ret1 == MMI_ERROR || ret2 == MMI_ERROR || ret3 == MMI_ERROR) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI led_setFastBlinkOn fail ret1 = %d ret2 = %d ret3 = %d!\n", ret1, ret2, ret3);
+		return MMI_ERROR;
+	}
+	return MMI_SUCCESS;
+
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ÉÁ˸¹Ø
+***********************************************************************************/
+static SINT32 mmi_led_opt_blinkoff(char *fileblinkSwitch)
+{
+	return mmi_file_operate(fileblinkSwitch, LED_BLINKOFF_STATE);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ÉèÖÃ/»ñÈ¡µÆµÄÉÏ´Î״̬
+***********************************************************************************/
+static VOID mmi_setBatLedState(MMI_LED_LASTSTATE bat_state)
+{
+	g_mmi_batteryled_state = bat_state;
+}
+
+static VOID mmi_setWanLedState(MMI_LED_LASTSTATE wan_state)
+{
+	g_mmi_wanled_state = wan_state;
+}
+
+static VOID mmi_setWanLedSpeed(MMI_LED_BLINK_SPEED wan_speed)
+{
+	g_mmi_wanled_speed = wan_speed;
+}
+
+static VOID mmi_setLanLedState(MMI_LED_LASTSTATE lan_state)
+{
+	g_mmi_lanled_state = lan_state;
+}
+static VOID mmi_setSmsLedState(MMI_LED_LASTSTATE sms_state)
+{
+	g_mmi_smsled_state = sms_state;
+}
+static VOID mmi_setVoipLedState(MMI_LED_LASTSTATE voip_state)
+{
+	g_mmi_voipled_state = voip_state;
+}
+
+static MMI_LED_LASTSTATE mmi_getBatLedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_batteryled_state;
+	return state;
+}
+
+static MMI_LED_LASTSTATE mmi_getWanLedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_wanled_state;
+	return state;
+}
+static MMI_LED_BLINK_SPEED mmi_getWanLedSpeed(VOID)
+{
+	MMI_LED_BLINK_SPEED speed;
+	speed = g_mmi_wanled_speed;
+	return speed;
+}
+
+static MMI_LED_LASTSTATE mmi_getLanLedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_lanled_state;
+	return state;
+}
+
+static MMI_LED_LASTSTATE mmi_getSmsLedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_smsled_state;
+	return state;
+}
+
+static MMI_LED_LASTSTATE mmi_getVoipLedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_voipled_state;
+	return state;
+}
+
+/********************************************************************************
+µç³ØµÆ²Ù×÷
+**********************************************************************************/
+VOID  mmi_BatLedOffOpt()
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_BatLedOffOpt !\n");
+	mmi_led_opt_blinkoff(LED_BATTERY_GREEN_BLINKSWITCH);
+	mmi_led_opt_off(LED_BATTERY_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkoff(LED_BATTERY_RED_BLINKSWITCH);
+	mmi_led_opt_off(LED_BATTERY_RED_BRIGHTNESS);
+	mmi_setBatLedState(LED_ALL_OFF);
+}
+
+static VOID mmi_BatLedRedOn()
+{
+	mmi_led_opt_on(LED_BATTERY_RED_BRIGHTNESS);
+}
+
+static VOID mmi_BatLedRedBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_BATTERY_RED_BLINKSWITCH;
+	info.fileblinktimeoff = LED_BATTERY_RED_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_BATTERY_RED_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_BATTERY_RED_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_BatLedGreenOn()
+{
+	mmi_led_opt_on(LED_BATTERY_GREEN_BRIGHTNESS);
+}
+
+static VOID mmi_BatLedGreenBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_BATTERY_GREEN_BLINKSWITCH;
+	info.fileblinktimeoff = LED_BATTERY_GREEN_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_BATTERY_GREEN_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_BATTERY_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_BatLedYellowOn()
+{
+	mmi_led_opt_on(LED_BATTERY_RED_BRIGHTNESS);
+	mmi_led_opt_on(LED_BATTERY_GREEN_BRIGHTNESS);
+}
+
+static VOID mmi_BatLedYellowBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_BATTERY_RED_BLINKSWITCH;
+	info.fileblinktimeoff = LED_BATTERY_RED_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_BATTERY_RED_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_BATTERY_RED_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+
+	info.fileblinkSwitch = LED_BATTERY_GREEN_BLINKSWITCH;
+	info.fileblinktimeoff = LED_BATTERY_GREEN_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_BATTERY_GREEN_BLINKTIMEON;
+	mmi_led_opt_on(LED_BATTERY_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_BatLedOnOpt(MMI_LED_COLOR color)
+{
+	MMI_LED_LASTSTATE bat_sta = mmi_getBatLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_BatLedOnOpt  color=%d, bat_sta = %d!\n", color, bat_sta);
+	if (color == LED_COLOR_RED) {
+
+		if (bat_sta == LED_RED_ON) {
+			return;
+		} else {
+			mmi_BatLedOffOpt();
+			mmi_BatLedRedOn();
+		}
+		mmi_setBatLedState(LED_RED_ON);
+	} else if (color == LED_COLOR_GREEN) {
+		if (bat_sta == LED_GREEN_ON) {
+			return;
+		} else {
+			mmi_BatLedOffOpt();
+			mmi_BatLedGreenOn();
+		}
+		mmi_setBatLedState(LED_GREEN_ON);
+	} else if (color == LED_COLOR_YELLOW) {
+		if (bat_sta == LED_YELLOW_ON) {
+			return;
+		} else if (bat_sta == LED_GREEN_ON) {
+			mmi_BatLedRedOn();
+		} else if (bat_sta == LED_RED_ON) {
+			mmi_BatLedGreenOn();
+		} else {
+			mmi_BatLedOffOpt();
+			mmi_BatLedYellowOn();
+		}
+		mmi_setBatLedState(LED_YELLOW_ON);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_BatLedOnOpt invalid led color!\n");
+	}
+}
+
+static VOID mmi_BatLedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	MMI_LED_LASTSTATE bat_sta = mmi_getBatLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_BatLedFastBlinkOpt  color=%d bat_sta = %d!\n", color, bat_sta);
+	if (color == LED_COLOR_RED) {
+		if (bat_sta == LED_RED_BLINK) {
+			return;
+		} else {
+			mmi_BatLedOffOpt();
+			mmi_BatLedRedBlink(time);
+		}
+		mmi_setBatLedState(LED_RED_BLINK);
+	} else if (color == LED_COLOR_GREEN) {
+		if (bat_sta == LED_GREEN_BLINK) {
+			return;
+		} else {
+			mmi_BatLedOffOpt();
+			mmi_BatLedGreenBlink(time);
+		}
+		mmi_setBatLedState(LED_GREEN_BLINK);
+	} else if (color == LED_COLOR_YELLOW) {
+		if (bat_sta == LED_YELLOW_BLINK) {
+			return;
+		} else {
+			mmi_BatLedOffOpt();
+			mmi_BatLedYellowBlink(time);
+		}
+		mmi_setBatLedState(LED_YELLOW_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_BatLedFastBlinkOpt invalid led color!\n");
+	}
+}
+
+static VOID mmi_processbBatteryLed(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_processbBatteryLed state = %d color = %d !\n",  state, color);
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_BatLedOnOpt(color);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_BatLedOffOpt();
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_BatLedBlinkOpt(color, time);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_processbBatteryLed invalid state!\n");
+		break;
+	}
+	}
+}
+
+
+/********************************************************************************
+  ÍøÂçµÆ²Ù×÷
+**********************************************************************************/
+static VOID mmi_WanLedOffOpt()
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_WanLedOffOpt !\n");
+	mmi_led_opt_blinkoff(LED_WAN_GREEN_BLINKSWITCH);
+	mmi_led_opt_off(LED_WAN_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkoff(LED_WAN_RED_BLINKSWITCH);
+	mmi_led_opt_off(LED_WAN_RED_BRIGHTNESS);
+	mmi_led_opt_blinkoff(LED_WAN_BLUE_BLINKSWITCH);
+	mmi_led_opt_off(LED_WAN_BLUE_BRIGHTNESS);
+	mmi_setWanLedState(LED_ALL_OFF);
+}
+
+static VOID mmi_WanLedRedOn()
+{
+	mmi_led_opt_on(LED_WAN_RED_BRIGHTNESS);
+}
+
+static VOID mmi_WanLedRedBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_WAN_RED_BLINKSWITCH;
+	info.fileblinktimeoff = LED_WAN_RED_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_WAN_RED_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_WAN_RED_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_WanLedGreenOn()
+{
+	mmi_led_opt_on(LED_WAN_GREEN_BRIGHTNESS);
+}
+
+static VOID mmi_WanLedGreenBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_WAN_GREEN_BLINKSWITCH;
+	info.fileblinktimeoff = LED_WAN_GREEN_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_WAN_GREEN_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_WAN_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_WanLedYellowOn()
+{
+	mmi_led_opt_on(LED_WAN_RED_BRIGHTNESS);
+	mmi_led_opt_on(LED_WAN_GREEN_BRIGHTNESS);
+}
+
+static VOID mmi_WanLedYellowBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_WAN_RED_BLINKSWITCH;
+	info.fileblinktimeoff = LED_WAN_RED_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_WAN_RED_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_WAN_RED_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+
+	info.fileblinkSwitch = LED_WAN_GREEN_BLINKSWITCH;
+	info.fileblinktimeoff = LED_WAN_GREEN_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_WAN_GREEN_BLINKTIMEON;
+	mmi_led_opt_on(LED_WAN_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_WanLedBlueOn()
+{
+	mmi_led_opt_on(LED_WAN_BLUE_BRIGHTNESS);
+}
+
+static VOID mmi_WanLedBlueBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_WAN_BLUE_BLINKSWITCH;
+	info.fileblinktimeoff = LED_WAN_BLUE_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_WAN_BLUE_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_WAN_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_WanLedOnOpt(MMI_LED_COLOR color)
+{
+	MMI_LED_LASTSTATE wan_sta = mmi_getWanLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_WanLedOnOpt  color=%d, wan_sta = %d!\n", color, wan_sta);
+	if (color == LED_COLOR_RED) {
+		if (wan_sta == LED_RED_ON) {
+			return;
+		} else {
+			mmi_WanLedOffOpt();
+			mmi_WanLedRedOn();
+		}
+		mmi_setWanLedState(LED_RED_ON);
+	} else if (color == LED_COLOR_GREEN) {
+		if (wan_sta == LED_GREEN_ON) {
+			return;
+		} else {
+			mmi_WanLedOffOpt();
+			mmi_WanLedGreenOn();
+		}
+		mmi_setWanLedState(LED_GREEN_ON);
+	} else if (color == LED_COLOR_YELLOW) {
+		if (wan_sta == LED_YELLOW_ON) {
+			return;
+		} else if (wan_sta == LED_GREEN_ON) {
+			mmi_WanLedRedOn();
+		} else if (wan_sta == LED_RED_ON) {
+			mmi_WanLedGreenOn();
+		} else {
+			mmi_WanLedOffOpt();
+			mmi_WanLedYellowOn();
+		}
+		mmi_setWanLedState(LED_YELLOW_ON);
+	} else if (color == LED_COLOR_BLUE) {
+		if (wan_sta == LED_BLUE_ON) {
+			return;
+		} else {
+			mmi_WanLedOffOpt();
+			mmi_WanLedBlueOn();
+		}
+		mmi_setWanLedState(LED_BLUE_ON);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_WanLedOnOpt invalid led color!\n");
+	}
+}
+
+static VOID mmi_WanLedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time,MMI_LED_BLINK_SPEED speed)
+{
+	MMI_LED_LASTSTATE wan_sta = mmi_getWanLedState();
+	MMI_LED_BLINK_SPEED wan_speed = mmi_getWanLedSpeed();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_WanLedBlinkOpt  color=%d, wan_sta = %d wan_speed_last=%d!\n", color, wan_sta, wan_speed);
+	if (color == LED_COLOR_RED) {
+		if (wan_sta == LED_RED_BLINK) {
+			return;
+		} else {
+			mmi_WanLedOffOpt();
+			mmi_WanLedRedBlink(time);
+		}
+		mmi_setWanLedState(LED_RED_BLINK);
+	} else if (color == LED_COLOR_GREEN) {
+		if (wan_sta == LED_GREEN_BLINK && (speed == wan_speed)) {
+			return;
+		} else {
+			mmi_WanLedOffOpt();
+			mmi_WanLedGreenBlink(time);
+		}
+		mmi_setWanLedState(LED_GREEN_BLINK);
+		mmi_setWanLedSpeed(speed);
+	} else if (color == LED_COLOR_YELLOW) {
+		if (wan_sta == LED_YELLOW_BLINK) {
+			return;
+		} else {
+			mmi_WanLedOffOpt();
+			mmi_WanLedYellowBlink(time);
+		}
+		mmi_setWanLedState(LED_YELLOW_BLINK);
+	} else if (color == LED_COLOR_BLUE) {
+		if (wan_sta == LED_BLUE_BLINK) {
+			return;
+		} else {
+			mmi_WanLedOffOpt();
+			mmi_WanLedBlueBlink(time);
+		}
+		mmi_setWanLedState(LED_BLUE_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_WanLedFastBlinkOpt invalid led color!\n");
+	}
+}
+
+static VOID mmi_processWanLed(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time, MMI_LED_BLINK_SPEED speed)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_processWanLed state = %d color=%d speed=%d!\n",  state, color, speed);
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_WanLedOnOpt(color);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_WanLedOffOpt();
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_WanLedBlinkOpt(color, time, speed);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_processNetLed invalid state!\n");
+		break;
+	}
+	}
+}
+
+/********************************************************************************
+  WIFI µÆ²Ù×÷
+**********************************************************************************/
+static VOID mmi_LanLedOffOpt(MMI_LED_COLOR color)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_LanLedOffOpt!\n");
+	if (color == LED_COLOR_GREEN) {
+		mmi_led_opt_blinkoff(LED_LAN_GREEN_BLINKSWITCH);
+		mmi_led_opt_off(LED_LAN_GREEN_BRIGHTNESS);
+	} else if (color == LED_COLOR_BLUE) {
+		mmi_led_opt_blinkoff(LED_LAN_BLUE_BLINKSWITCH);
+		mmi_led_opt_off(LED_LAN_BLUE_BRIGHTNESS);
+	}
+	mmi_setLanLedState(LED_ALL_OFF);
+}
+static VOID mmi_LanLedGreenOn()
+{
+	mmi_led_opt_on(LED_LAN_GREEN_BRIGHTNESS);
+}
+static VOID mmi_LanLedGreenBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_LAN_GREEN_BLINKSWITCH;
+	info.fileblinktimeoff = LED_LAN_GREEN_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_LAN_GREEN_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_LAN_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_LanLedBlueOn()
+{
+	mmi_led_opt_on(LED_LAN_BLUE_BRIGHTNESS);
+}
+
+static VOID mmi_LanLedBlueBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_LAN_BLUE_BLINKSWITCH;
+	info.fileblinktimeoff = LED_LAN_BLUE_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_LAN_BLUE_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_LAN_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_LanLedOnOpt(MMI_LED_COLOR color)
+{
+	MMI_LED_LASTSTATE lan_sta = mmi_getLanLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_LanLedOnOpt lan_sta = %d!\n", lan_sta);
+	if (color == LED_COLOR_GREEN) {
+		if (lan_sta == LED_GREEN_ON) {
+			return;
+		} else {
+			mmi_LanLedOffOpt(color);
+			mmi_LanLedGreenOn();
+		}
+		mmi_setLanLedState(LED_GREEN_ON);
+	} else if (color == LED_COLOR_BLUE) {
+		if (lan_sta == LED_BLUE_ON) {
+			return;
+		} else {
+			mmi_LanLedOffOpt(color);
+			mmi_LanLedBlueOn();
+		}
+		mmi_setLanLedState(LED_BLUE_ON);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_LanLedOnOpt invalid color!!\n");
+	}
+}
+
+static VOID mmi_LanLedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	MMI_LED_LASTSTATE lan_sta = mmi_getLanLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_LanLedBlinkOpt lan_sta = %d!\n", lan_sta);
+	if (color == LED_COLOR_GREEN) {
+		if (lan_sta == LED_GREEN_BLINK) {
+			return;
+		} else {
+			mmi_LanLedOffOpt(color);
+			mmi_LanLedGreenBlink(time);
+		}
+		mmi_setLanLedState(LED_GREEN_BLINK);
+	} else if (color == LED_COLOR_BLUE) {
+		if (lan_sta == LED_BLUE_BLINK) {
+			return;
+		} else {
+			mmi_LanLedOffOpt(color);
+			mmi_LanLedBlueBlink(time);
+		}
+		mmi_setLanLedState(LED_BLUE_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_LanLedBlinkOpt invalid color!!\n");
+	}
+}
+static VOID mmi_processLanLed(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_processLanLed state=%d!\n", state);
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_LanLedOnOpt(color);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_LanLedOffOpt(color);
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_LanLedBlinkOpt(color, time);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_processLanLed invalid state!\n");
+		break;
+	}
+	}
+}
+
+
+/********************************************************************************
+  ¶ÌÐŵƲÙ×÷
+**********************************************************************************/
+static VOID mmi_SmsLedOffOpt(MMI_LED_COLOR color)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_SmsLedOffOpt!\n");
+	if (color == LED_COLOR_GREEN) {
+		mmi_led_opt_blinkoff(LED_SMS_GREEN_BLINKSWITCH);
+		mmi_led_opt_off(LED_SMS_GREEN_BRIGHTNESS);
+	} else if (color == LED_COLOR_BLUE) {
+		mmi_led_opt_blinkoff(LED_SMS_BLUE_BLINKSWITCH);
+		mmi_led_opt_off(LED_SMS_BLUE_BRIGHTNESS);
+	}
+	mmi_setSmsLedState(LED_ALL_OFF);
+}
+static VOID mmi_SmsLedGreenOn()
+{
+	mmi_led_opt_on(LED_SMS_GREEN_BRIGHTNESS);
+}
+
+static VOID mmi_SmsLedGreenBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_SMS_GREEN_BLINKSWITCH;
+	info.fileblinktimeoff = LED_SMS_GREEN_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_SMS_GREEN_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_SMS_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_SmsLedBlueOn()
+{
+	mmi_led_opt_on(LED_SMS_BLUE_BRIGHTNESS);
+}
+
+static VOID mmi_SmsLedBlueBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_SMS_BLUE_BLINKSWITCH;
+	info.fileblinktimeoff = LED_SMS_BLUE_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_SMS_BLUE_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_SMS_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_SmsLedOnOpt(MMI_LED_COLOR color)
+{
+	MMI_LED_LASTSTATE sms_sta = mmi_getSmsLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_SmsLedOnOpt  sms_sta = %d!\n", sms_sta);
+	if (color == LED_COLOR_GREEN) {
+		if (sms_sta == LED_GREEN_ON) {
+			return;
+		} else {
+			mmi_SmsLedOffOpt(color);
+			mmi_SmsLedGreenOn();
+		}
+		mmi_setSmsLedState(LED_GREEN_ON);
+	} else if (color == LED_COLOR_BLUE) {
+		if (sms_sta == LED_BLUE_ON) {
+			return;
+		} else {
+			mmi_SmsLedOffOpt(color);
+			mmi_SmsLedBlueOn();
+		}
+		mmi_setSmsLedState(LED_BLUE_ON);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_SmsLedOnOpt invalid color!!\n");
+	}
+}
+static VOID mmi_SmsLedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	MMI_LED_LASTSTATE sms_sta = mmi_getSmsLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_SmsLedBlinkOpt sms_sta = %d!\n", sms_sta);
+	if (color == LED_COLOR_GREEN) {
+		if (sms_sta == LED_GREEN_BLINK) {
+			return;
+		} else {
+			mmi_SmsLedOffOpt(color);
+			mmi_SmsLedGreenBlink(time);
+		}
+		mmi_setSmsLedState(LED_GREEN_BLINK);
+	} else if (color == LED_COLOR_BLUE) {
+		if (sms_sta == LED_BLUE_BLINK) {
+			return;
+		} else {
+			mmi_SmsLedOffOpt(color);
+			mmi_SmsLedBlueBlink(time);
+		}
+		mmi_setSmsLedState(LED_BLUE_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_SmsLedBlinkOpt invalid color!!\n");
+	}
+
+}
+static VOID mmi_processSmsLed(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_processSmsLed state=%d\n", state);
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_SmsLedOnOpt(color);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_SmsLedOffOpt(color);
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_SmsLedBlinkOpt(color, time);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_processSmsLed invalid state!\n");
+		break;
+	}
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:Á÷Á¿µÆ²Ù×÷
+***********************************************************************************/
+static VOID mmi_TrafficLedOnOpt(MMI_TRAFFIC_LED traffic)
+{
+	switch (traffic) {
+	case TRAFFIC_LED_1:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_1_ON);
+		break;
+	case TRAFFIC_LED_2:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_2_ON);
+		break;
+	case TRAFFIC_LED_3:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_3_ON);
+		break;
+	case TRAFFIC_LED_4:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_4_ON);
+		break;
+	case TRAFFIC_LED_5:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_5_ON);
+		break;
+	case TRAFFIC_LED_6:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_6_ON);
+		break;
+	case TRAFFIC_LED_7:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_7_ON);
+		break;
+	case TRAFFIC_LED_8:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_8_ON);
+		break;
+	case TRAFFIC_LED_9:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_9_ON);
+		break;
+	case TRAFFIC_LED_10:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_10_ON);
+		break;
+	default:
+		break;
+	}
+}
+
+static VOID mmi_TrafficLedBlinkOpt(MMI_TRAFFIC_LED traffic)
+{
+	switch (traffic) {
+	case TRAFFIC_LED_1:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_1_BLINK);
+		break;
+	case TRAFFIC_LED_2:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_2_BLINK);
+		break;
+	case TRAFFIC_LED_3:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_3_BLINK);
+		break;
+	case TRAFFIC_LED_4:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_4_BLINK);
+		break;
+	case TRAFFIC_LED_5:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_5_BLINK);
+		break;
+	case TRAFFIC_LED_6:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_6_BLINK);
+		break;
+	case TRAFFIC_LED_7:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_7_BLINK);
+		break;
+	case TRAFFIC_LED_8:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_8_BLINK);
+		break;
+	case TRAFFIC_LED_9:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_9_BLINK);
+		break;
+	case TRAFFIC_LED_10:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_10_BLINK);
+		break;
+	default:
+		break;
+	}
+}
+
+static VOID mmi_TrafficLedOffOpt()
+{
+	mmi_file_operate(TRAFFIC_LED_PATH, LED_TRAFFIC_ALL_OFF);
+}
+static VOID mmi_processTrafficLed(MMI_LED_STATE state, MMI_TRAFFIC_LED traffic)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_processTrafficLed state = %d traffic = %d\n", state, traffic);
+	switch (state) {
+	case LED_STATE_ON:
+		mmi_TrafficLedOnOpt(traffic);
+		break;
+	case LED_STATE_BLINK:
+		mmi_TrafficLedBlinkOpt(traffic);
+		break;
+	case LED_STATE_OFF:
+		mmi_TrafficLedOffOpt();
+		break;
+	default:
+		break;
+
+	}
+}
+
+/********************************************************************************
+  ÓïÒôÌáʾµÆ²Ù×÷
+**********************************************************************************/
+static VOID mmi_VoipLedOffOpt(MMI_LED_COLOR color)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_VoipLedOffOpt!\n");
+	if (color == LED_COLOR_BLUE) {
+		mmi_led_opt_blinkoff(LED_VOIP_BLUE_BLINKSWITCH);
+		mmi_led_opt_off(LED_VOIP_BLUE_BRIGHTNESS);
+	}
+	mmi_setVoipLedState(LED_ALL_OFF);
+}
+
+static VOID mmi_VoipLedBlueOn()
+{
+	mmi_led_opt_on(LED_VOIP_BLUE_BRIGHTNESS);
+}
+
+static VOID mmi_VoipLedBlueBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_VOIP_BLUE_BLINKSWITCH;
+	info.fileblinktimeoff = LED_VOIP_BLUE_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_VOIP_BLUE_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_VOIP_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_VoipLedOnOpt(MMI_LED_COLOR color)
+{
+	MMI_LED_LASTSTATE voip_sta = mmi_getVoipLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_VoipLedOnOpt  voip_sta = %d!\n", voip_sta);
+	if (color == LED_COLOR_BLUE) {
+		if (voip_sta == LED_BLUE_ON) {
+			return;
+		} else {
+			mmi_VoipLedOffOpt(color);
+			mmi_VoipLedBlueOn();
+		}
+		mmi_setVoipLedState(LED_BLUE_ON);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_VoipLedOnOpt invalid color!!\n");
+	}
+}
+static VOID mmi_VoipLedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	MMI_LED_LASTSTATE voip_sta = mmi_getVoipLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_VoipLedBlinkOpt voip_sta = %d!\n", voip_sta);
+	if (color == LED_COLOR_BLUE) {
+		if (voip_sta == LED_BLUE_BLINK) {
+			return;
+		} else {
+			mmi_VoipLedOffOpt(color);
+			mmi_VoipLedBlueBlink(time);
+		}
+		mmi_setVoipLedState(LED_BLUE_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_VoipLedBlinkOpt invalid color!!\n");
+	}
+
+}
+static VOID mmi_processVoipLed(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_processVoipLed state=%d\n", state);
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_VoipLedOnOpt(color);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_VoipLedOffOpt(color);
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_VoipLedBlinkOpt(color, time);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_processVoipLed invalid state!\n");
+		break;
+	}
+	}
+}
+
+/********************************************************************************
+  ÐźÅÇ¿¶ÈÌáʾµÆ²Ù×÷ Ò¢Ô¶cpe
+**********************************************************************************/
+static MMI_LED_LASTSTATE mmi_getSignalLedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_signalled_state;
+	return state;
+}
+
+static VOID mmi_setSignalLedState(MMI_LED_LASTSTATE sig_state)
+{
+	g_mmi_signalled_state = sig_state;
+}
+
+static MMI_LED_LASTSTATE mmi_transSignalLedState(MMI_TRAFFIC_LED traffic)
+{
+	MMI_LED_LASTSTATE state;
+    switch (traffic)
+    {
+    	case TRAFFIC_LED_1:
+	        state = LED_BLUE1_ON;
+	        break;
+
+    	case TRAFFIC_LED_2:
+	        state = LED_BLUE2_ON;
+	        break;
+
+		case TRAFFIC_LED_3:
+	        state = LED_BLUE3_ON;
+	        break;
+
+		case TRAFFIC_LED_4:
+	        state = LED_BLUE4_ON;
+	        break;
+
+		case TRAFFIC_LED_5:
+	        state = LED_BLUE5_ON;
+	        break;
+
+		case TRAFFIC_LED_MAX:
+			state = LED_BLUE_BLINK;
+			break;
+
+    	default:
+	        state = LED_ALL_OFF;
+	        break;
+    }
+
+	return state;
+}
+
+
+static VOID mmi_SignalLedOffOpt(MMI_LED_COLOR color)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_SignalLedOffOpt!\n");
+	if (color == LED_COLOR_BLUE) {
+		mmi_led_opt_blinkoff(LED_SIGNAL1_BLUE_BLINKSWITCH);
+		mmi_led_opt_off(LED_SIGNAL1_BLUE_BRIGHTNESS);
+		mmi_led_opt_off(LED_SIGNAL2_BLUE_BRIGHTNESS);
+		mmi_led_opt_off(LED_SIGNAL3_BLUE_BRIGHTNESS);
+		mmi_led_opt_off(LED_SIGNAL4_BLUE_BRIGHTNESS);
+		mmi_led_opt_off(LED_SIGNAL5_BLUE_BRIGHTNESS);
+	}
+	mmi_setSignalLedState(LED_ALL_OFF);
+}
+
+static VOID mmi_SignalLedBlueOn(MMI_LED_LASTSTATE state)
+{
+	switch (state)
+    {
+    	case LED_BLUE1_ON:
+			mmi_led_opt_on(LED_SIGNAL1_BLUE_BRIGHTNESS);
+	        break;
+
+    	case LED_BLUE2_ON:
+	        mmi_led_opt_on(LED_SIGNAL1_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL2_BLUE_BRIGHTNESS);
+	        break;
+
+		case LED_BLUE3_ON:
+	        mmi_led_opt_on(LED_SIGNAL1_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL2_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL3_BLUE_BRIGHTNESS);
+	        break;
+
+		case LED_BLUE4_ON:
+	        mmi_led_opt_on(LED_SIGNAL1_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL2_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL3_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL4_BLUE_BRIGHTNESS);
+	        break;
+
+		case LED_BLUE5_ON:
+	        mmi_led_opt_on(LED_SIGNAL1_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL2_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL3_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL4_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL5_BLUE_BRIGHTNESS);
+	        break;
+
+    	default:
+	        slog(MMI_PRINT, SLOG_ERR, "MMI mmi_SignalLedBlueOn  state = %d!\n", state);
+	        break;
+    }
+}
+
+static VOID mmi_SignalLedBlueBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_SIGNAL1_BLUE_BLINKSWITCH;
+	info.fileblinktimeoff = LED_SIGNAL1_BLUE_BLINKTIMEON;
+	info.fileblinktimeon = LED_SIGNAL1_BLUE_BLINKTIMEOFF;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_SIGNAL1_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_SignalLedOnOpt(MMI_LED_COLOR color, MMI_TRAFFIC_LED traffic)
+{
+	MMI_LED_LASTSTATE sig_sta = mmi_getSignalLedState();
+	MMI_LED_LASTSTATE traffic_trans = mmi_transSignalLedState(traffic);
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_SignalLedOnOpt  sig_sta = %d,%d!\n", sig_sta, traffic_trans);
+	if (color == LED_COLOR_BLUE) {
+		if (sig_sta == traffic_trans) {
+			return;
+		} else {
+			mmi_SignalLedOffOpt(color);
+			mmi_SignalLedBlueOn(traffic_trans);
+		}
+		mmi_setSignalLedState(traffic_trans);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_SignalLedOnOpt invalid color!!\n");
+	}
+}
+static VOID mmi_SignalLedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	MMI_LED_LASTSTATE sig_sta = mmi_getSignalLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_SignalLedBlinkOpt voip_sta = %d!\n", sig_sta);
+	if (color == LED_COLOR_BLUE) {
+		if (sig_sta == LED_BLUE_BLINK) {
+			return;
+		} else {
+			mmi_SignalLedOffOpt(color);
+			mmi_SignalLedBlueBlink(time);
+		}
+		mmi_setSignalLedState(LED_BLUE_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_SignalLedBlinkOpt invalid color!!\n");
+	}
+}
+
+static VOID mmi_processSignalLed(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time, MMI_TRAFFIC_LED traffic)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_processSignalLed state=%d\n", state);
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_SignalLedOnOpt(color, traffic);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_SignalLedOffOpt(color);
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_SignalLedBlinkOpt(color, time);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_processSignalLed invalid state!\n");
+		break;
+	}
+	}
+}
+
+/********************************************************************************
+  WPSµÆ²Ù×÷ Ò¢Ô¶cpe
+**********************************************************************************/
+static MMI_LED_LASTSTATE mmi_getWpsLedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_wpsled_state;
+	return state;
+}
+
+static VOID mmi_setWpsLedState(MMI_LED_LASTSTATE sig_state)
+{
+	g_mmi_wpsled_state = sig_state;
+}
+
+static VOID mmi_WpsLedOffOpt(MMI_LED_COLOR color)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_WpsLedOffOpt!\n");
+	if (color == LED_COLOR_BLUE) {
+		mmi_led_opt_blinkoff(LED_WPS_BLUE_BLINKSWITCH);
+		mmi_led_opt_off(LED_WPS_BLUE_BRIGHTNESS);
+	}
+	mmi_setWpsLedState(LED_ALL_OFF);
+}
+
+static VOID mmi_WpsLedBlueOn()
+{
+	mmi_led_opt_on(LED_WPS_BLUE_BRIGHTNESS);
+}
+
+static VOID mmi_WpsLedBlueBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_WPS_BLUE_BLINKSWITCH;
+	info.fileblinktimeoff = LED_WPS_BLUE_BLINKTIMEON;
+	info.fileblinktimeon = LED_WPS_BLUE_BLINKTIMEOFF;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_WPS_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_WpsLedOnOpt(MMI_LED_COLOR color)
+{
+	MMI_LED_LASTSTATE sig_sta = mmi_getWpsLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_WpsLedOnOpt  sig_sta = %d!\n", sig_sta);
+
+	if (color == LED_COLOR_BLUE) {
+		if (sig_sta == LED_BLUE_ON) {
+			return;
+		} else {
+			mmi_WpsLedOffOpt(color);
+			mmi_WpsLedBlueOn();
+		}
+		mmi_setWpsLedState(LED_BLUE_ON);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_WpsLedOnOpt invalid color!!\n");
+	}
+}
+static VOID mmi_WpsLedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	MMI_LED_LASTSTATE sig_sta = mmi_getWpsLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_SignalLedBlinkOpt voip_sta = %d!\n", sig_sta);
+	if (color == LED_COLOR_BLUE) {
+		if (sig_sta == LED_BLUE_BLINK) {
+			return;
+		} else {
+			mmi_WpsLedOffOpt(color);
+			mmi_WpsLedBlueBlink(time);
+		}
+		mmi_setWpsLedState(LED_BLUE_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_SignalLedBlinkOpt invalid color!!\n");
+	}
+}
+
+static VOID mmi_processWpsLed(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_processWpsLed state=%d\n", state);
+
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_WpsLedOnOpt(color);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_WpsLedOffOpt(color);
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_WpsLedBlinkOpt(color, time);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_processWpsLed invalid state!\n");
+		break;
+	}
+	}
+}
+
+/********************************************************************************
+  rj11µÆ²Ù×÷ Ò¢Ô¶cpe
+**********************************************************************************/
+static MMI_LED_LASTSTATE mmi_getRj11LedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_rj11led_state;
+	return state;
+}
+
+static VOID mmi_setRj11LedState(MMI_LED_LASTSTATE sig_state)
+{
+	g_mmi_rj11led_state = sig_state;
+}
+
+static VOID mmi_Rj11LedOffOpt(MMI_LED_COLOR color)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_Rj11LedOffOpt!\n");
+	if (color == LED_COLOR_BLUE) {
+		mmi_led_opt_blinkoff(LED_RJ11_BLUE_BLINKSWITCH);
+		mmi_led_opt_off(LED_RJ11_BLUE_BRIGHTNESS);
+	}
+	mmi_setRj11LedState(LED_ALL_OFF);
+}
+
+static VOID mmi_Rj11LedBlueOn()
+{
+	mmi_led_opt_on(LED_RJ11_BLUE_BRIGHTNESS);
+}
+
+static VOID mmi_Rj11LedBlueBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_RJ11_BLUE_BLINKSWITCH;
+	info.fileblinktimeoff = LED_RJ11_BLUE_BLINKTIMEON;
+	info.fileblinktimeon = LED_RJ11_BLUE_BLINKTIMEOFF;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_RJ11_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_Rj11LedOnOpt(MMI_LED_COLOR color)
+{
+	MMI_LED_LASTSTATE sig_sta = mmi_getRj11LedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_Rj11LedOnOpt  sig_sta = %d!\n", sig_sta);
+
+	if (color == LED_COLOR_BLUE) {
+		if (sig_sta == LED_BLUE_ON) {
+			return;
+		} else {
+			mmi_Rj11LedOffOpt(color);
+			mmi_Rj11LedBlueOn();
+		}
+		mmi_setRj11LedState(LED_BLUE_ON);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_Rj11LedOnOpt invalid color!!\n");
+	}
+}
+static VOID mmi_Rj11LedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	MMI_LED_LASTSTATE sig_sta = mmi_getRj11LedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_Rj11LedBlinkOpt voip_sta = %d!\n", sig_sta);
+	if (color == LED_COLOR_BLUE) {
+		if (sig_sta == LED_BLUE_BLINK) {
+			return;
+		} else {
+			mmi_Rj11LedOffOpt(color);
+			mmi_Rj11LedBlueBlink(time);
+		}
+		mmi_setRj11LedState(LED_BLUE_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_Rj11LedBlinkOpt invalid color!!\n");
+	}
+}
+
+static VOID mmi_processRj11Led(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_processRj11Led state=%d\n", state);
+printf("MMI mmi_processRj11Led state=%d\n", state);
+
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_Rj11LedOnOpt(color);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_Rj11LedOffOpt(color);
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_Rj11LedBlinkOpt(color, time);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_processRj11Led invalid state!\n");
+		break;
+	}
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¿ª¹Ø»úʱËùÓеÆÈ«ÁÁÈ«Ãð²Ù×÷
+***********************************************************************************/
+static VOID mmi_processAllLed(MMI_LED_STATE state)
+{
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_file_operate(ALL_LED_PATH, LED_ALL_POWER_ON);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_file_operate(ALL_LED_PATH, LED_ALL_POWER_OFF);
+		break;
+	}
+	default:
+		break;
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:µãµÆ²Ù×÷º¯Êý
+***********************************************************************************/
+VOID mmi_led_operate(T_zMmi_Led_Info *ledinfo)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_led_operate ledname = %d state = %d color=%d,traffic=%d\n", ledinfo->led_name, ledinfo->led_state, ledinfo->led_color, ledinfo->traffic);
+	switch (ledinfo->led_name) {
+	case LED_BATTERY: {
+		mmi_processbBatteryLed(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time);
+		break;
+	}
+	case LED_WAN: {
+		mmi_processWanLed(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time, ledinfo->ledBlink_speed);
+		break;
+	}
+	case LED_LAN: {
+		mmi_processLanLed(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time);
+		break;
+	}
+	case LED_SMS: {
+		mmi_processSmsLed(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time);
+		break;
+	}
+	case LED_TRAFFIC: {
+		mmi_processTrafficLed(ledinfo->led_state, ledinfo->traffic);
+		break;
+	}
+	case LED_VOIP: {
+		mmi_processVoipLed(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time);
+		break;
+	}
+	//yao yuan
+	case LED_SIGNAL: {
+		mmi_processSignalLed(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time, ledinfo->traffic);
+		break;
+	}
+	case LED_WPS: {
+		mmi_processWpsLed(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time);
+		break;
+	}
+	case LED_RJ11: {
+		mmi_processRj11Led(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time);
+		break;
+	}
+	
+	case LED_ALL: {
+		mmi_processAllLed(ledinfo->led_state);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_led_operate invalid ledname!\n");
+		break;
+	}
+	}
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_led_init.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_led_init.c
new file mode 100755
index 0000000..dc26a66
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_led_init.c
@@ -0,0 +1,34 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_led_init.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £º
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2015-1-4
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+
+/*****************************************************************************
+ Í·Îļþ
+******************************************************************************/
+#include "mmi_common.h"
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:µãµÆ²Ù×÷º¯Êý
+***********************************************************************************/
+VOID mmi_led_operate_adapter(T_zMmi_Led_Info*  userInfo)
+{
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:³õʼ»¯LEDÉ豸
+***********************************************************************************/
+VOID mmi_initLed(VOID)
+{
+
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_mo.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_mo.c
new file mode 100755
index 0000000..ff115d9
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_mo.c
@@ -0,0 +1,29 @@
+
+/*******************************************************************************
+    Copyright(c) 1998 - 2005 DaTang Mobile Communications Equipment CO.,LTD.
+    All Rights Reserved. By using this module you agree to the terms of the
+    DaTang Mobile Communications Equipment CO.,LTD License Agreement for it.
+*******************************************************************************/
+
+/*******************************************************************************
+Module Name     : i18n
+Version         : 0.1
+Description     : This file contains the initialization codes.
+Performance     : Code Size   :  Bytes
+                  Data Size   :  Bytes
+Change History  : Version   Date            Author          Comments
+                  0.1       2005-03-01                      Original
+
+*******************************************************************************/
+#ifndef DISABLE_LCD
+#include "fw_i18n.h"
+/* -------------------------------------------------------------------------- */
+extern struct msg_domain En_domain;
+extern struct msg_domain Zh_domain;
+
+struct msg_domain *language_domains[] = {
+	&En_domain,
+	&Zh_domain,
+	NULL,
+};
+#endif
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_mo_en.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_mo_en.c
new file mode 100755
index 0000000..9113c23
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_mo_en.c
@@ -0,0 +1,119 @@
+/************************************************************************
+ * °æÈ¨ËùÓÐ (C)2009,ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+ *
+ * ÎļþÃû³Æ£ºstring_data.c
+ * ÄÚÈÝÕªÒª£ºÃèÊö×Ö·û´®×ÊÔ´ÐÅÏ¢
+ *
+ * Çë×¢ÒâÒÔÏÂÐÅÏ¢ËùÔÚÐÐÇëÎðɾ³ý»òÐÞ¸Ä:Notes! increment compile label
+ * ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ     ÐÞ¸ÄÄÚÈÝ    ÐÞ¸ÄÈË
+ * ----------------------------------------------------------------------
+ * 2015/10/19    V1.0    ´´½¨    ÓÉ×ÊÔ´¹ÜÀí¹¤¾ß×Ô¶¯´´½¨
+ ************************************************************************/
+#ifndef DISABLE_LCD
+
+#include "fw_i18n.h"
+
+static char * En_original_strings[] = {
+	"\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6e\x67\xa1\xad",
+	"\x44\x69\x73\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6e\x67\xa1\xad",
+	"\x4e\x6f\x20\x53\x65\x72\x76\x69\x63\x65",
+	"\x4c\x69\x6d\x69\x74\x65\x64\x20\x53\x65\x72\x76\x69\x63\x65",
+	"\x53\x65\x61\x72\x63\x68\x69\x6e\x67",
+	"\x57\x50\x53\x20\x41\x63\x74\x69\x76\x65\x20\x57\x61\x69\x74\x69\x6e\x67",
+	"\x57\x50\x53\x20\x44\x65\x61\x63\x74\x69\x76\x65\x20\x57\x61\x69\x74\x69\x6e\x67",
+	"\x57\x50\x53\x20\x41\x63\x74\x69\x76\x65",
+	"\x57\x50\x53\x20\x44\x65\x61\x63\x74\x69\x76\x65",
+	"\x4e\x6f\x20\x42\x61\x74\x74\x65\x72\x79",
+	"\x4c\x6f\x77\x20\x42\x61\x74\x74\x65\x72\x79",
+	"\x49\x6e\x73\x65\x72\x74\x20\x53\x49\x4d",
+	"\x50\x49\x4e\x20\x4c\x6f\x63\x6b",
+	"\x50\x55\x4b\x20\x4c\x6f\x63\x6b",
+	"\x53\x49\x4d\x20\x42\x75\x73\x79",
+	"\x49\x6e\x76\x61\x6c\x69\x64\x20\x53\x49\x4d",
+	"\x44\x65\x76\x69\x63\x65\x20\x4c\x6f\x63\x6b\x65\x64",
+	"\x4e\x65\x77\x20\x76\x65\x72\x73\x69\x6f\x6e\x2c\x75\x70\x64\x61\x74\x65\x3f",
+	"\x55\x70\x64\x61\x74\x65",
+	"\x43\x61\x6e\x63\x6c\x65",
+	"\x44\x6f\x77\x6e\x6c\x6f\x61\x64\x69\x6e\x67",
+	"\x44\x6f\x77\x6e\x6c\x6f\x61\x64\x69\x6e\x67\x20\x46\x61\x69\x6c",
+	"\x44\x6f\x77\x6e\x6c\x6f\x61\x64\x69\x6e\x67\x20\x53\x75\x63\x63\x65\x73\x73",
+	"\x4c\x6f\x77\x20\x62\x61\x74\x74\x65\x72\x79\x2c\x70\x6c\x65\x61\x73\x65\x20\x63\x68\x61\x72\x67\x65\x20\x62\x65\x66\x6f\x72\x65\x20\x75\x70\x64\x61\x74\x65",
+	"\x55\x70\x64\x61\x74\x65\x20\x53\x75\x63\x63\x65\x73\x73",
+	"\x55\x70\x64\x61\x74\x65\x20\x66\x61\x69\x6c\x65\x64",
+	"\x57\x65\x6c\x63\x6f\x6d\x65",
+	"\x50\x6f\x77\x65\x72\x6f\x66\x66",
+	"\x52\x65\x73\x74\x61\x72\x74\x69\x6e\x67",
+	"\x52\x65\x73\x65\x74\x74\x69\x6e\x67",
+	"\x43\x68\x65\x63\x6b\x20\x42\x6f\x6e\x75\x73\x20\x51\x75\x6f\x74\x61\x3a",
+	"\x4d\x61\x69\x6e\x20\x51\x75\x6f\x74\x61",
+	"\x43\x4d\x43\x43",
+	"\x43\x55\x43\x43",
+	"\x43\x54\x43\x43",
+	"\x55\x6e\x4b\x6e\x6f\x77\x6e",
+	"\x54\x68\x69\x73\x20\x69\x73\x20\x74\x68\x65\x20\x6c\x61\x74\x65\x73\x74\x20\x76\x65\x72\x73\x69\x6f\x6e\x2e",
+	"\x4b\x45\x59\x3a",
+	"\x53\x53\x49\x44\x3a",
+	"\x53\x49\x4d\x20\x4c\x6f\x63\x6b",
+};
+
+static char *En_translated_strings[] = {
+	"\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6e\x67\xa1\xad",
+	"\x44\x69\x73\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6e\x67\xa1\xad",
+	"\x4e\x6f\x20\x53\x65\x72\x76\x69\x63\x65",
+	"\x4c\x69\x6d\x69\x74\x65\x64\x20\x53\x65\x72\x76\x69\x63\x65",
+	"\x53\x65\x61\x72\x63\x68\x69\x6e\x67",
+	"\x57\x50\x53\x20\x41\x63\x74\x69\x76\x65\x20\x57\x61\x69\x74\x69\x6e\x67",
+	"\x57\x50\x53\x20\x44\x65\x61\x63\x74\x69\x76\x65\x20\x57\x61\x69\x74\x69\x6e\x67",
+	"\x57\x50\x53\x20\x41\x63\x74\x69\x76\x65",
+	"\x57\x50\x53\x20\x44\x65\x61\x63\x74\x69\x76\x65",
+	"\x4e\x6f\x20\x42\x61\x74\x74\x65\x72\x79",
+	"\x4c\x6f\x77\x20\x42\x61\x74\x74\x65\x72\x79",
+	"\x49\x6e\x73\x65\x72\x74\x20\x53\x49\x4d",
+	"\x50\x49\x4e\x20\x4c\x6f\x63\x6b",
+	"\x50\x55\x4b\x20\x4c\x6f\x63\x6b",
+	"\x53\x49\x4d\x20\x42\x75\x73\x79",
+	"\x49\x6e\x76\x61\x6c\x69\x64\x20\x53\x49\x4d",
+	"\x44\x65\x76\x69\x63\x65\x20\x4c\x6f\x63\x6b\x65\x64",
+	"\x4e\x65\x77\x20\x76\x65\x72\x73\x69\x6f\x6e\x2c\x75\x70\x64\x61\x74\x65\x3f",
+	"\x55\x70\x64\x61\x74\x65",
+	"\x43\x61\x6e\x63\x6c\x65",
+	"\x44\x6f\x77\x6e\x6c\x6f\x61\x64\x69\x6e\x67",
+	"\x44\x6f\x77\x6e\x6c\x6f\x61\x64\x69\x6e\x67\x20\x46\x61\x69\x6c",
+	"\x44\x6f\x77\x6e\x6c\x6f\x61\x64\x69\x6e\x67\x20\x53\x75\x63\x63\x65\x73\x73",
+	"\x4c\x6f\x77\x20\x62\x61\x74\x74\x65\x72\x79\x2c\x70\x6c\x65\x61\x73\x65\x20\x63\x68\x61\x72\x67\x65\x20\x62\x65\x66\x6f\x72\x65\x20\x75\x70\x64\x61\x74\x65",
+	"\x55\x70\x64\x61\x74\x65\x20\x53\x75\x63\x63\x65\x73\x73",
+	"\x55\x70\x64\x61\x74\x65\x20\x66\x61\x69\x6c\x65\x64",
+	"\x57\x65\x6c\x63\x6f\x6d\x65",
+	"\x50\x6f\x77\x65\x72\x6f\x66\x66",
+	"\x52\x65\x73\x74\x61\x72\x74\x69\x6e\x67",
+	"\x52\x65\x73\x65\x74\x74\x69\x6e\x67",
+	"\x43\x68\x65\x63\x6b\x20\x42\x6f\x6e\x75\x73\x20\x51\x75\x6f\x74\x61\x3a",
+	"\x4d\x61\x69\x6e\x20\x51\x75\x6f\x74\x61",
+	"\x43\x4d\x43\x43",
+	"\x43\x55\x43\x43",
+	"\x43\x54\x43\x43",
+	"\x55\x6e\x4b\x6e\x6f\x77\x6e",
+	"\x54\x68\x69\x73\x20\x69\x73\x20\x74\x68\x65\x20\x6c\x61\x74\x65\x73\x74\x20\x76\x65\x72\x73\x69\x6f\x6e\x2e",
+	"\x4b\x45\x59\x3a",
+	"\x53\x53\x49\x44\x3a",
+	"\x53\x49\x4d\x20\x4c\x6f\x63\x6b",
+};
+
+static unsigned int En_hash_table[] = {
+	8,     9,     18,     19,     0,     0,     0,     0,     10,     0,
+	11,     21,     12,     23,     13,     25,     14,     27,     15,     29,
+	16,     0,     17,     0,     0,     33,     30,     31,     32,     24,
+	34,     35,     36,     37,     38,     26,     0,     0,     0,     39,
+	20,     28,     40,     0,     22,     0,     1,     2,     3,     4,
+	5,     6,     7
+};
+
+struct msg_domain En_domain = {
+	"en",
+	40,
+	En_original_strings,
+	En_translated_strings,
+	53,
+	En_hash_table
+};
+#endif
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_mo_zh.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_mo_zh.c
new file mode 100755
index 0000000..0b7ccdc
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_mo_zh.c
@@ -0,0 +1,123 @@
+/************************************************************************
+ * °æÈ¨ËùÓÐ (C)2009,ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+ *
+ * ÎļþÃû³Æ£ºstring_data.c
+ * ÄÚÈÝÕªÒª£ºÃèÊö×Ö·û´®×ÊÔ´ÐÅÏ¢
+ *
+ * Çë×¢ÒâÒÔÏÂÐÅÏ¢ËùÔÚÐÐÇëÎðɾ³ý»òÐÞ¸Ä:Notes! increment compile label
+ * ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ     ÐÞ¸ÄÄÚÈÝ    ÐÞ¸ÄÈË
+ * ----------------------------------------------------------------------
+ * 2015/10/19    V1.0    ´´½¨    ÓÉ×ÊÔ´¹ÜÀí¹¤¾ß×Ô¶¯´´½¨
+ ************************************************************************/
+#ifndef DISABLE_LCD
+
+#include "fw_i18n.h"
+
+
+static char *Zh_original_strings[] = {
+	"\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6e\x67\xa1\xad",
+	"\x44\x69\x73\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6e\x67\xa1\xad",
+	"\x4e\x6f\x20\x53\x65\x72\x76\x69\x63\x65",
+	"\x4c\x69\x6d\x69\x74\x65\x64\x20\x53\x65\x72\x76\x69\x63\x65",
+	"\x53\x65\x61\x72\x63\x68\x69\x6e\x67",
+	"\x57\x50\x53\x20\x41\x63\x74\x69\x76\x65\x20\x57\x61\x69\x74\x69\x6e\x67",
+	"\x57\x50\x53\x20\x44\x65\x61\x63\x74\x69\x76\x65\x20\x57\x61\x69\x74\x69\x6e\x67",
+	"\x57\x50\x53\x20\x41\x63\x74\x69\x76\x65",
+	"\x57\x50\x53\x20\x44\x65\x61\x63\x74\x69\x76\x65",
+	"\x4e\x6f\x20\x42\x61\x74\x74\x65\x72\x79",
+	"\x4c\x6f\x77\x20\x42\x61\x74\x74\x65\x72\x79",
+	"\x49\x6e\x73\x65\x72\x74\x20\x53\x49\x4d",
+	"\x50\x49\x4e\x20\x4c\x6f\x63\x6b",
+	"\x50\x55\x4b\x20\x4c\x6f\x63\x6b",
+	"\x53\x49\x4d\x20\x42\x75\x73\x79",
+	"\x49\x6e\x76\x61\x6c\x69\x64\x20\x53\x49\x4d",
+	"\x44\x65\x76\x69\x63\x65\x20\x4c\x6f\x63\x6b\x65\x64",
+	"\x4e\x65\x77\x20\x76\x65\x72\x73\x69\x6f\x6e\x2c\x75\x70\x64\x61\x74\x65\x3f",
+	"\x55\x70\x64\x61\x74\x65",
+	"\x43\x61\x6e\x63\x6c\x65",
+	"\x44\x6f\x77\x6e\x6c\x6f\x61\x64\x69\x6e\x67",
+	"\x44\x6f\x77\x6e\x6c\x6f\x61\x64\x69\x6e\x67\x20\x46\x61\x69\x6c",
+	"\x44\x6f\x77\x6e\x6c\x6f\x61\x64\x69\x6e\x67\x20\x53\x75\x63\x63\x65\x73\x73",
+	"\x4c\x6f\x77\x20\x62\x61\x74\x74\x65\x72\x79\x2c\x70\x6c\x65\x61\x73\x65\x20\x63\x68\x61\x72\x67\x65\x20\x62\x65\x66\x6f\x72\x65\x20\x75\x70\x64\x61\x74\x65",
+	"\x55\x70\x64\x61\x74\x65\x20\x53\x75\x63\x63\x65\x73\x73",
+	"\x55\x70\x64\x61\x74\x65\x20\x66\x61\x69\x6c\x65\x64",
+	"\x57\x65\x6c\x63\x6f\x6d\x65",
+	"\x50\x6f\x77\x65\x72\x6f\x66\x66",
+	"\x52\x65\x73\x74\x61\x72\x74\x69\x6e\x67",
+	"\x52\x65\x73\x65\x74\x74\x69\x6e\x67",
+	"\x43\x68\x65\x63\x6b\x20\x42\x6f\x6e\x75\x73\x20\x51\x75\x6f\x74\x61\x3a",
+	"\x4d\x61\x69\x6e\x20\x51\x75\x6f\x74\x61",
+	"\x43\x4d\x43\x43",
+	"\x43\x55\x43\x43",
+	"\x43\x54\x43\x43",
+	"\x55\x6e\x4b\x6e\x6f\x77\x6e",
+	"\x54\x68\x69\x73\x20\x69\x73\x20\x74\x68\x65\x20\x6c\x61\x74\x65\x73\x74\x20\x76\x65\x72\x73\x69\x6f\x6e\x2e",
+	"\x4b\x45\x59\x3a",
+	"\x53\x53\x49\x44\x3a",
+	"\x53\x49\x4d\x20\x4c\x6f\x63\x6b",
+
+};
+
+static char *Zh_translated_strings[] = {
+	"\xc1\xac\xbd\xd3\xd6\xd0\xa1\xad",
+	"\xb6\xcf\xbf\xaa\xd6\xd0\xa1\xad",
+	"\xce\xde\xb7\xfe\xce\xf1",
+	"\xcf\xde\xd6\xc6\xb7\xfe\xce\xf1",
+	"\xcb\xd1\xcd\xf8\xd6\xd0\xa1\xad",
+	"\x57\x50\x53\xbc\xa4\xbb\xee\xd6\xd0",
+	"\x57\x50\x53\xc8\xa5\xbc\xa4\xbb\xee\xd6\xd0",
+	"\x57\x50\x53\xbc\xa4\xbb\xee\xb3\xc9\xb9\xa6",
+	"\x57\x50\x53\xc8\xa5\xbc\xa4\xbb\xee\xb3\xc9\xb9\xa6",
+	"\xce\xde\xb5\xe7\xb3\xd8",
+	"\xb5\xcd\xb5\xe7",
+	"\xb2\xe5\xc8\xeb\x53\x49\x4d\xbf\xa8",
+	"\x50\x49\x4e\xcb\xf8",
+	"\x50\x55\x4b\xcb\xf8",
+	"\x53\x49\x4d\xbf\xa8\xb3\xf5\xca\xbc\xbb\xaf",
+	"\x53\x49\x4d\xbf\xa8\xce\xde\xd0\xa7",
+	"\xcd\xf8\xc2\xe7\xcb\xf8\xb6\xa8",
+	"\xbc\xec\xb2\xe2\xb5\xbd\xd0\xc2\xb0\xe6\xb1\xbe\xa3\xac\xca\xc7\xb7\xf1\xd0\xe8\xd2\xaa\xc9\xfd\xbc\xb6\xa3\xbf",
+	"\xc8\xb7\xb6\xa8\xc9\xfd\xbc\xb6",
+	"\xc8\xa1\xcf\xfb\xc9\xfd\xbc\xb6",
+	"\xcf\xc2\xd4\xd8\xd6\xd0",
+	"\xcf\xc2\xd4\xd8\xca\xa7\xb0\xdc",
+	"\xcf\xc2\xd4\xd8\xb3\xc9\xb9\xa6",
+	"\xb5\xcd\xb5\xe7\xa3\xac\xc7\xeb\xd4\xda\xc9\xfd\xbc\xb6\xc7\xb0\xcf\xc8\xb3\xe4\xb5\xe7",
+	"\xc9\xfd\xbc\xb6\xb3\xc9\xb9\xa6",
+	"\xc9\xfd\xbc\xb6\xca\xa7\xb0\xdc",
+	"\xbb\xb6\xd3\xad",
+	"\xb9\xd8\xbb\xfa",
+	"\xd6\xd8\xc6\xf4",
+	"\xb8\xb4\xce\xbb",
+	"\x42\x6f\x6e\x75\x73\xc1\xf7\xc1\xbf\xcd\xb3\xbc\xc6\xa3\xba",
+	"\xc1\xf7\xc1\xbf\xca\xb9\xd3\xc3",
+	"\xd6\xd0\xb9\xfa\xd2\xc6\xb6\xaf",
+	"\xd6\xd0\xb9\xfa\xc1\xaa\xcd\xa8",
+	"\xd6\xd0\xb9\xfa\xb5\xe7\xd0\xc5",
+	"\xce\xb4\xd6\xaa\xcd\xf8\xc2\xe7",
+	"\xd2\xd1\xbe\xad\xca\xc7\xd7\xee\xd0\xc2\xb0\xe6\xb1\xbe\xa1\xa3",
+	"\x57\x49\x46\x49\xc3\xdc\xc2\xeb\xa3\xba",
+	"\x57\x49\x46\x49\xc3\xfb\xb3\xc6\xa3\xba",
+	"\x53\x49\x4d\xbf\xa8\xcb\xf8\xb6\xa8",
+
+};
+
+static unsigned int Zh_hash_table[] = {
+	8,     9,     18,     19,     0,     0,     0,     0,     10,     0,
+	11,     21,     12,     23,     13,     25,     14,     27,     15,     29,
+	16,     0,     17,     0,     0,     33,     30,     31,     32,     24,
+	34,     35,     36,     37,     38,     26,     0,     0,     0,     39,
+	20,     28,     40,     0,     22,     0,     1,     2,     3,     4,
+	5,     6,     7
+};
+
+struct msg_domain Zh_domain = {
+	"zh",
+	40,
+	Zh_original_strings,
+	Zh_translated_strings,
+	53,
+	Zh_hash_table
+};
+#endif
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_msg.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_msg.c
new file mode 100755
index 0000000..f814aaa
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_msg.c
@@ -0,0 +1,55 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_msg.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMIÏûÏ¢´¦Àí
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+
+/*****************************************************************************
+                         Í·Îļþ
+******************************************************************************/
+#include <errno.h>
+#include <sys/msg.h>
+#include "softap_api.h"
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:´´½¨MMI½ø³ÌµÄÏûÏ¢¶ÓÁÐ
+***********************************************************************************/
+long mmi_create_msg_queue()
+{
+	long msgid = 0;
+	if ((msgid = msgget(MODULE_ID_MMI, IPC_CREAT | 0600)) == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI [error]:Create MODULE_ID_MMI queue faild! msgid=%ld\n", msgid);
+		return -1;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI Creating mmi message queue success! MODULE_ID_MMI=%ld\n", msgid);
+	return msgid;
+}
+
+int mmi_RecvMsgFromQueue(int msgQueueId, MSG_BUF *pstMsg, long MsgType)
+{
+	int iRet = -1;
+	long msgSize =  sizeof(MSG_BUF) - sizeof(long);
+
+	if (NULL == pstMsg) {
+		return -1;
+	}
+
+	iRet = msgrcv(msgQueueId, pstMsg, msgSize, MsgType, MSG_NOERROR);
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_RecvMsgFromQueue : iRet : %d, pstMsg->src_id:%d,  pstMsg->usMsgCmd:0x%08x \n", iRet, pstMsg->src_id, pstMsg->usMsgCmd);
+
+	if (iRet <= 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_RecvMsgFromQueue Failed : iRet : %d, pstMsg->src_id:%d,  pstMsg->usMsgCmd:0x%08x \n", iRet, pstMsg->src_id, pstMsg->usMsgCmd);
+		return -1;
+	} else {
+		return 0;
+	}
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_net.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_net.c
new file mode 100755
index 0000000..87294c8
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_net.c
@@ -0,0 +1,356 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_net.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI»ñÈ¡ÍøÂçÏà¹ØÐÅÏ¢
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+
+/*****************************************************************************
+*                       Í·Îļþ
+*******************************************************************************/
+#include "mmi_common.h"
+#include "mmi_lcd.h"
+
+/*****************************************************************************
+*                       È«¾Ö±äÁ¿¶¨Òå
+*******************************************************************************/
+#define NETWORKMODE_2G                      3
+#define NETWORKMODE_3G_5                    5
+#define NETWORKMODE_3G_15                   15
+#define NETWORKMODE_4G                      17
+#define NETTYPE_NO_SERVICE                  "No Service"
+#define NETTYPE_LIMITED_SERVICE             "Limited Service"
+#define NETTYPE_NULL                        ""
+#define NETTYPE_E                           "E"
+#define NETTYPE_G                           "G"
+#define NETTYPE_3G                          "3G"
+#define NETTYPE_4G                          "4G"
+#define NETTYPE_4G_LTE                      "LTE"
+#define PPP_STATUS_CONNECTED                "ppp_connected"
+#define PPP_STATUS_IPV6_CONNECTED           "ipv6_connected"
+#define PPP_STATUS_IPV4_IPV6_CONNECTED      "ipv4_ipv6_connected"
+
+static UINT32 NET_Connect_State  = 0;	//ÍøÂçÁ¬½Ó״̬
+static UINT32 NET_MutilConnect_State  = 0;	//¶à·PDP¼¤»î×´Ì¬ÍøÂçÁ¬½Ó״̬
+static UINT32 NET_Signal_num = 0;       //ÍøÂçÐźŸñÊý  LCDʹÓÃ
+static UINT32 NET_Signal_Weak = 0;   	//ÍøÂçÐźűäÈõ״̬ LEDʹÓÃ
+static UINT32 NET_Roam_Mode = 0;    	//ÂþÓÎģʽ
+static UINT32 NET_Socket_State = NET_SOCKET_INACTIVE;     //SOCKETÊÇ·ñ½¨Á¢Á¬½Ó״̬
+static UINT32 NET_McuSocket_State = NET_SOCKET_INACTIVE;     //SOCKETÊÇ·ñ½¨Á¢Á¬½Ó״̬
+
+struct list_head g_mmi_socket_queue;//·¢Ëͽ¨Á¢SOCKETÁ¬½ÓÏûÏ¢µÄÄ£¿éÁ´±í
+struct list_head g_mmi_multiconnect_queue;//·¢ËͶà·PDP¼¤»îÏûÏ¢µÄÄ£¿éÁ´±í
+
+static E_zMmi_Net_Mode s_mmi_net_mode = NET_MODE_DEFAULT;//ÍøÂçÖÆÊ½
+extern E_zMmiShowMode g_showMode;
+extern int g_customer_type;
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:·µ»ØÊÇ·ñÁªÍø×´Ì¬
+***********************************************************************************/
+BOOL mmi_net_connected()
+{
+	if (NET_Connect_State == 1 && s_mmi_net_mode != NET_MODE_NOSERVICE && s_mmi_net_mode != NET_MODE_LIMITSERVICE) { //e58
+		return TRUE;
+	}
+	return FALSE;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÍøÂçÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_get_netinfo(UINT32 netinfo)
+{
+	if (netinfo != 0) {
+		T_zMMINetInfo * pNetInfo = (T_zMMINetInfo *)netinfo;
+		pNetInfo->net_mode = s_mmi_net_mode;
+		pNetInfo->connect_status = (E_zMmi_Net_State)NET_Connect_State;
+		pNetInfo->signal_num = NET_Signal_num;
+		pNetInfo->signal_weak = NET_Signal_Weak;
+		pNetInfo->roam_mode = NET_Roam_Mode;
+		pNetInfo->socket_state = NET_Socket_State || NET_McuSocket_State;
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_RegisterNetTaskInfoItem()
+{
+	T_zMMITaskInfoItem netTaskInfoItem = {0};
+	netTaskInfoItem.task = MMI_TASK_NET;
+	netTaskInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMINetInfo));
+	netTaskInfoItem.get_taskinfo_fun = mmi_get_netinfo;
+	netTaskInfoItem.get_ledinfo_fun = mmi_getLedNetInfo;
+#ifndef DISABLE_LCD
+	netTaskInfoItem.get_lcdinfo_fun = mmi_getLcdNetInfo;
+#endif
+	netTaskInfoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	mmi_register_taskinfo_item(&netTaskInfoItem);
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_RegisterNetSigTaskInfoItem()
+{
+	T_zMMITaskInfoItem netTaskInfoItem = {0};
+	netTaskInfoItem.task = MMI_TASK_NETSIGNAL;
+	netTaskInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMINetInfo));
+	netTaskInfoItem.get_taskinfo_fun = mmi_get_netinfo;
+	netTaskInfoItem.get_ledinfo_fun = mmi_getLedNetSigInfo;
+#ifndef DISABLE_LCD
+	//netTaskInfoItem.get_lcdinfo_fun = mmi_getLcdNetInfo;
+#endif
+	netTaskInfoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	mmi_register_taskinfo_item(&netTaskInfoItem);
+	return MMI_SUCCESS;
+}
+
+static VOID mmi_set_net_update()
+{
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_net_update LCD!!!\n");
+		mmi_set_update_flag(MMI_TASK_NET);
+		mmi_set_update_flag(MMI_TASK_NETSIGNAL);
+	}
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		E_zMmi_Work_Mode mode = mmi_get_led_mode();
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_net_update LED mode=%d!!!\n",mode);
+		if(g_customer_type == CUSTOMER_GUODIAN || g_customer_type == CUSTOMER_NANDIAN){//guodian
+			mmi_set_update_flag(MMI_TASK_NET);
+		}else{
+			if (mode != MMI_RESET_MODE && mode != MMI_RESTART_MODE && mode != MMI_POWEROFF_MODE && mode != MMI_IDLE_LEDOFF_MODE && mode != MMI_IDLE_CHG_LEDOFF_MODE
+				&& mode != MMI_FAKE_POWEROFF_MODE && mode != MMI_FAKE_POWEROFF_CHARGE_MODE && mode != MMI_IDLE_STANDBY_LEDOFF_MODE) {
+				mmi_set_update_flag(MMI_TASK_NET);
+				mmi_set_update_flag(MMI_TASK_NETSIGNAL);
+			}
+		}
+	}
+}
+
+UINT32 mmi_get_net_state(VOID)
+{
+	return NET_Connect_State;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:SIM¿¨°Î³öʱ£¬Å¼ÏÖat_server²»Éϱ¨¶ÏÍø×´Ì¬£¬Ðè×ÔÐн«ÍøÂç״̬ÖÃΪ¶Ï¿ª×´Ì¬
+***********************************************************************************/
+VOID mmi_clean_net_state()
+{
+	s_mmi_net_mode = NET_MODE_NOSERVICE;
+	NET_Connect_State = 0;
+	mmi_set_net_update();
+	mmi_update_net_tip(NET_Connect_State, s_mmi_net_mode);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¸ù¾ÝÍøÂçÁ¬½Ó״̬²Ù×÷ÍøÂçµÆ
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Connect_Status(VOID *data)
+{
+	NET_Connect_State = *(UINT32*)data;//ÍøÂç״̬0-¶Ï¿ª£¬1-Á¬½Ó  2-Á¬½ÓÖÐ 3-¶Ï¿ªÖÐ
+	if(1 == NET_MutilConnect_State && 0 == NET_Connect_State){
+		slog(MMI_PRINT, SLOG_ERR, "MMI svr_handle_msg_connect_status NET_Connect_State = %d\n", NET_Connect_State);
+		return 0;
+	}
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI svr_handle_msg_connect_status NET_Connect_State = %d\n", NET_Connect_State);
+	if (NET_Connect_State == 1 || NET_Connect_State == 0) {
+		mmi_set_net_update();
+		ipc_send_message(MODULE_ID_MMI, MODULE_ID_FLUXSTAT, MSG_CMD_CHANNEL_CONNECT_STATUS, sizeof(NET_Connect_State), (UCHAR *)&NET_Connect_State, 0);
+	}
+	mmi_update_net_tip(NET_Connect_State, s_mmi_net_mode);
+
+	return 0;
+}
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¸ù¾Ý¶à·PDP¼¤»î״̬²Ù×÷ÍøÂçµÆ£¬,×¢Òâ¿ÉÄÜ»áÓжà¸ösocket_proxy½øÐжà·PDP¼¤»î
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_MultiConnect_Status(VOID *data, int src_id)
+{	
+	NET_MutilConnect_State = *(UINT32*)data;//ÍøÂç״̬0-¶Ï¿ª£¬1-Á¬½Ó  	
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI zMMI_Handle_Msg_MultiConnect_Status NET_MutilConnect_State = %d\n", NET_MutilConnect_State);
+
+	if(1 == NET_MutilConnect_State){
+		mmi_add_list(&g_mmi_multiconnect_queue, src_id);
+	}else{
+		mmi_del_list(&g_mmi_multiconnect_queue, src_id);
+	}
+	if(list_empty(&g_mmi_multiconnect_queue)) {
+		NET_MutilConnect_State = 0;
+	}else {
+		NET_MutilConnect_State = 1;
+	}
+	NET_Connect_State = NET_MutilConnect_State;
+	mmi_set_net_update();
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_FLUXSTAT, MSG_CMD_CHANNEL_CONNECT_STATUS, sizeof(NET_Connect_State), (UCHAR *)&NET_Connect_State, 0);
+
+	mmi_update_net_tip(NET_Connect_State, s_mmi_net_mode);
+
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¸ù¾ÝÍøÂçÖÆÊ½²Ù×÷ÍøÂçµÆ
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Network_Mode(VOID *data)
+{
+	SINT32 networkStatus = 0;
+	SINT32 networkMode = 0;
+	SINT32 netroamMode = 0;
+	networkMode = ((T_zAt_SysinfoRes*)data) ->sysMode;	//ÍøÂçÖÆÊ½
+	networkStatus = ((T_zAt_SysinfoRes*)data) ->srvStatus;//ÊÇ·ñÕý³£·þÎñ:0-ÎÞ·þÎñ 1-ÏÞÖÆ·þÎñ ÆäËû-Õý³£·þÎñ
+	netroamMode = ((T_zAt_SysinfoRes*)data) ->roamStatus;
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI svr_handle_msg_network_mode networkStatus = %d,networkMode=%d !!!\n", networkStatus, networkMode);
+
+	if (netroamMode == 1) {
+		NET_Roam_Mode = 1;
+	} else {
+		NET_Roam_Mode = 0;
+	}
+	if (networkStatus == 0) {
+		s_mmi_net_mode = NET_MODE_NOSERVICE;
+		mmi_update_net_tip(NET_Connect_State, s_mmi_net_mode);
+	} else if (networkStatus == 1) {
+		s_mmi_net_mode = NET_MODE_LIMITSERVICE;
+		mmi_update_net_tip(NET_Connect_State, s_mmi_net_mode);
+	} else {
+		if (NETWORKMODE_2G == networkMode) {
+			s_mmi_net_mode = NET_MODE_2G;
+		} else if ((NETWORKMODE_3G_5 == networkMode) || (NETWORKMODE_3G_15 == networkMode)) {
+			s_mmi_net_mode = NET_MODE_3G;
+		} else if (NETWORKMODE_4G == networkMode) {
+			s_mmi_net_mode = NET_MODE_4G;
+		} else {
+			s_mmi_net_mode = NET_MODE_NOSERVICE;
+		}
+		mmi_update_net_tip(NET_Connect_State, s_mmi_net_mode);
+	}
+	mmi_set_net_update();
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ÍøÂçÐźűäÈõʱ´¦Àíº¯Êý
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Signal_Num(VOID *data)
+{
+	UINT32 sig_num = 0;
+	sig_num = *(UINT32*)data;
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI svr_handle_msg_Signal_Num sig_num = %d\n", sig_num);
+	if (sig_num <= 2) {
+		NET_Signal_Weak = 1;
+	} else {
+		NET_Signal_Weak = 0;
+	}
+	NET_Signal_num = sig_num;
+	mmi_set_net_update();
+	return 0;
+
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:SIMcard °Î³ö»òδ²åÈë´¦Àíº¯Êý
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Simcard_Info(VOID *data)
+{
+	UINT32 sig_num = 0;
+	sig_num = *(UINT32*)data;
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI zMMI_Handle_Msg_Simcard_Info sig_num = %d\n", sig_num);
+
+	if (g_showMode == MMI_MODE_LCD)
+		return 0;
+
+	mmi_clean_net_state();
+
+	return 0;
+
+}
+/**********************************************************************************
+º¯Êý×÷ÓÃ:SOCKETÁ¬½Ó״̬±ä»¯´¦Àíº¯Êý,×¢Òâ¿ÉÄÜ»áÓжà¸ösocket_proxy½¨Á¢SOCKETÁ¬½Ó
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Socket_Status(VOID *data, int src_id)
+{
+	NET_Socket_State = *(UINT32*)data;//socket״̬0-¶Ï¿ª£¬1-Á¬½Ó 
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI zMMI_Handle_Msg_Socket_Status NET_Socket_State = %d\n", NET_Socket_State);
+	
+	if(1 == NET_Socket_State){
+		mmi_add_list(&g_mmi_socket_queue, src_id);
+	}else{
+		mmi_del_list(&g_mmi_socket_queue, src_id);
+	}
+	if(list_empty(&g_mmi_socket_queue)) {
+		NET_Socket_State = NET_SOCKET_INACTIVE;
+	}else {
+		NET_Socket_State = NET_SOCKET_ACTIVE;
+	}
+	mmi_set_net_update();
+	return 0;
+}
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ÍâÖÃSOCKETÁ¬½Ó״̬±ä»¯´¦Àíº¯Êý
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_MCUSocket_Status(VOID *data)
+{
+	NET_McuSocket_State = *(UINT32*)data;//socket״̬0-¶Ï¿ª£¬1-Á¬½Ó 
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI zMMI_Handle_Msg_MCUSocket_Status NET_McuSocket_State = %d\n", NET_McuSocket_State);
+	if (NET_McuSocket_State == NET_SOCKET_INACTIVE || NET_McuSocket_State == NET_SOCKET_ACTIVE) {
+		mmi_set_net_update();		
+	}
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:³õʼ»¯ÍøÂçָʾµÆ
+***********************************************************************************/
+static VOID mmi_init_wan_led(VOID)
+{
+	CHAR nettype[20] = {0};
+	CHAR netstate[20] = {0};
+	CHAR signal_num[2] = {0};
+
+	sc_cfg_get(NV_NETWORK_TYPE, nettype, 20);
+	sc_cfg_get(NV_PPP_STATUS, netstate, 20);
+	sc_cfg_get(NV_SIGNALBAR, signal_num, 2);
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_init_wan_led nettype = %s netstate = %s signal_num = %s\n", nettype, netstate, signal_num);
+	if (!strncmp(nettype, NETTYPE_LIMITED_SERVICE, strlen(NETTYPE_LIMITED_SERVICE))) {
+		s_mmi_net_mode = NET_MODE_LIMITSERVICE;
+	} else if ((!strncmp(nettype, NETTYPE_G, 1)) || (!strncmp(nettype, NETTYPE_E, 1))) {
+		s_mmi_net_mode = NET_MODE_2G;
+	} else if (!strncmp(nettype, NETTYPE_3G, 2)) {
+		s_mmi_net_mode = NET_MODE_3G;
+	} else if (!strncmp(nettype, NETTYPE_4G, 2)) {
+		s_mmi_net_mode = NET_MODE_4G;
+	} else if (!strncmp(nettype, NETTYPE_4G_LTE, 3)) {
+		s_mmi_net_mode = NET_MODE_4G;
+	} else {
+		s_mmi_net_mode = NET_MODE_NOSERVICE;
+	}
+	if ((!strncmp(netstate, PPP_STATUS_CONNECTED, strlen(PPP_STATUS_CONNECTED))) || (!strncmp(netstate, PPP_STATUS_IPV6_CONNECTED, strlen(PPP_STATUS_IPV6_CONNECTED))) || (!strncmp(netstate, PPP_STATUS_IPV4_IPV6_CONNECTED, strlen(PPP_STATUS_IPV4_IPV6_CONNECTED)))) {
+		NET_Connect_State = 1;
+	} else {
+		NET_Connect_State = 0;
+	}
+	if (strlen(signal_num) != 0 && (atoi(signal_num)) <= 2) {
+		NET_Signal_Weak = 1;
+	} else {
+		NET_Signal_Weak = 0;
+	}
+	NET_Signal_num = (strlen(signal_num) == 0 ? 0 : atoi(signal_num));
+	mmi_update_net_tip(NET_Connect_State, s_mmi_net_mode);
+	mmi_set_net_update();
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ÍøÂçָʾµÆ³õʼ»¯
+***********************************************************************************/
+VOID mmi_net_init(VOID)
+{
+	INIT_LIST_HEAD(&g_mmi_socket_queue);
+	INIT_LIST_HEAD(&g_mmi_multiconnect_queue);
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_net_Led_Init finish !!\n");
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_plat_adapter.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_plat_adapter.c
new file mode 100755
index 0000000..92bc844
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_plat_adapter.c
@@ -0,0 +1,246 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_batterry_adapter.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI»ñÈ¡³äµçºÍµç³ØÐÅÏ¢ÊÊÅä
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+
+
+/************************************************************************************
+                           Í·Îļþ
+***********************************************************************************/
+#include <linux/netlink.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include "mmi_common.h"
+#include "mmi_lcd.h"
+
+static BOOL g_mmi_dischg_switch_off = FALSE;//·Åµç¹Ø±Õ¿ª¹Ø£¬Ä¬ÈÏÔÊÐí·Åµç
+static BOOL g_mmi_dischg_low_current_switch = FALSE;    //ĬÈϷŵçµçÁ÷ÊǸߵçÁ÷1.5A
+static UINT32 s_mmi_dischargeoff_voltage_num_low = 0;	//¶Áµ½0.5A¶ÔÓ¦µçѹµÄ´ÎÊý£¬Á¬ÐøÈý´ÎÉèÖ÷ŵçµçÁ÷0.5A
+static UINT32 s_mmi_dischargeoff_voltage_num_high = 0;	//¶Áµ½1.5A¶ÔÓ¦µçѹµÄ´ÎÊý£¬Á¬ÐøÈý´ÎÉèÖ÷ŵçµçÁ÷1.5A
+extern E_zMmiShowMode g_showMode;
+extern UINT32 g_temp_protect;
+extern UINT32 g_discharge_protect;
+extern UINT32 g_fast_poweron;
+/***********************************************************************************
+º¯Êý˵Ã÷£º»ñÈ¡·Åµç¿ÚÊÇ·ñ²å¸ºÔØ×´Ì¬
+***********************************************************************************/
+BOOL mmi_get_load_state(VOID)
+{
+	char load_state_buf[8] = {0};
+	int len = 0;
+	FILE* fd_boost_state = NULL;
+
+	fd_boost_state = fopen(BOOST_LOAD_STATUS_PATH, "r");
+	if (fd_boost_state == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_get_load_state open boost file fail!\n");
+		//MMI_ASSERT(0);
+		return FALSE;
+	}
+	len = fread(load_state_buf, 1, 2, fd_boost_state);
+	if (len > 0) { //kw 3
+		fclose(fd_boost_state);
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_load_state load_state_buf=%s!\n", load_state_buf);
+		if (strncmp(load_state_buf, "1", strlen("1")) == 0) {
+			return TRUE;
+		} else if (strncmp(load_state_buf, "0", strlen("0")) == 0) {
+			return FALSE;
+		} else {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_load_state read load_state error!\n");
+			return FALSE;
+		}
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_get_load_state read boost file fail len = %d!\n", len);
+		fclose(fd_boost_state);
+		return FALSE;
+	}
+}
+
+/***********************************************************************************
+º¯Êý˵Ã÷£ºÉèÖ÷ŵ翪¹Ø´ò¿ª/¹Ø±Õ
+***********************************************************************************/
+VOID mmi_set_discharge_info(VOID)
+{
+	BOOL isLoadFlag = FALSE;
+	isLoadFlag = mmi_get_load_state();
+	if (isLoadFlag) {
+		if (g_mmi_dischg_switch_off) {
+			mmi_set_discharge_switch(TRUE);
+			slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_set_discharge_info HAVE_Load MMI_TURN_ON_DISCHG!!!\n");
+			g_mmi_dischg_switch_off = FALSE;
+		}
+	} else {
+		if (!g_mmi_dischg_switch_off) {
+			mmi_set_discharge_switch(FALSE);
+			slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_set_discharge_info NO_Load MMI_TURN_OFF_DISCHG!!!\n");
+			g_mmi_dischg_switch_off = TRUE;
+		}
+	}
+}
+
+/***************************************************************************************
+º¯Êý˵Ã÷:³õʼ»¯¸ºÔØ×´Ì¬£¬¼ì²âÊÇ·ñÓиºÔØ£¬¾ö¶¨ÊÇ·ñÒª´ò¿ª·Åµç¿ª¹Ø
+***************************************************************************************/
+VOID mmi_load_state_init(VOID)
+{
+	mmi_set_discharge_info();
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:¸æÖªbattery£¬´ò¿ª/¹Ø±Õ·Åµç¹¦ÄÜ
+***********************************************************************************/
+VOID mmi_set_discharge_switch(BOOL discharge_protect_flag)
+{
+	if (discharge_protect_flag) {
+		system(MMI_TURN_ON_DISCHG);
+	} else {
+		system(MMI_TURN_OFF_DISCHG);
+	}
+}
+
+/***********************************************************************************
+º¯Êý×÷ÓÃ:µÍµç·Åµç±£»¤
+***********************************************************************************/
+VOID mmi_lowbattery_discharge_protect(UINT32 voltagepower)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_lowbattery_discharge_protect voltagepower = %d !!\n", voltagepower);
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_lowbattery_discharge_protect s_mmi_dischargeoff_voltage_num_low = %d, s_mmi_dischargeoff_voltage_num_high = %d !!\n", s_mmi_dischargeoff_voltage_num_low, s_mmi_dischargeoff_voltage_num_high);
+	BOOL isLoadFlag = FALSE;
+	isLoadFlag = mmi_get_load_state();
+	if (isLoadFlag) {
+		if (voltagepower < DISCHARGELEVEL) {
+			s_mmi_dischargeoff_voltage_num_high = 0;
+			s_mmi_dischargeoff_voltage_num_low ++ ;
+			if (s_mmi_dischargeoff_voltage_num_low == 3) {
+				s_mmi_dischargeoff_voltage_num_low = 0;
+				if (!g_mmi_dischg_low_current_switch) {
+					mmi_set_discharge_low_current(TRUE);
+					slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_lowbattery_discharge_protect turn to LOW current!!!\n");
+					g_mmi_dischg_low_current_switch = TRUE;
+				}
+			}
+		} else if (voltagepower > CHARGINGLEVEL) {
+			s_mmi_dischargeoff_voltage_num_low = 0;
+			s_mmi_dischargeoff_voltage_num_high ++ ;
+			if (s_mmi_dischargeoff_voltage_num_high == 3) {
+				s_mmi_dischargeoff_voltage_num_high = 0;
+				if (g_mmi_dischg_low_current_switch) {
+					mmi_set_discharge_low_current(FALSE);
+					slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_lowbattery_discharge_protect turn to HIGH current!!!\n");
+					g_mmi_dischg_low_current_switch = FALSE;
+				}
+			}
+		} else {
+			s_mmi_dischargeoff_voltage_num_low = 0;
+			s_mmi_dischargeoff_voltage_num_high = 0;
+		}
+	} else {
+		mmi_set_discharge_switch(FALSE);
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_lowbattery_discharge_protect NO_Load MMI_TURN_OFF_DISCHG!!!\n");
+	}
+}
+
+/**
+ * @brief ¿ìËÙ¿ª/¹Ø»ú²Ù×÷ÓÐЧÐÔÅжϣ»
+ * @param 
+ * @return TRUE±íʾ²Ù×÷ÓÐЧ¼ÌÐøÖ´ÐпìËÙ¿ª/¹Ø»ú£¬ÆäËûÖµ±íʾ²Ù×÷ÎÞЧֱ½Ó·µ»Ø
+ * @note   ¿ìËÙ¿ª/¹Ø»úÐèÒªµÈ´ýÉÏÒ»´Î·¢Ë͸øATµÄ·ÉÐÐģʽÉèÖÃÏûÏ¢´¦ÀíÍê³É²Å¿ÉÒÔ¼ÌÐø
+ * @warning 
+ */
+BOOL mmi_valid_fast_onoff(){
+    char rsqFlag[NV_CONTENT_LEN] = {0};
+    BOOL longPress = TRUE;//³¤°´¼ü½áÊø±êÖ¾
+    sc_cfg_get("cfun_work", rsqFlag, sizeof(rsqFlag));//ÉÏÒ»´ÎµÄMSG_CMD_AIRMODE_SET_REQÊÇ·ñ´¦ÀíÍê³É
+    
+    if (!g_fast_poweron) {//먦Æô¿ìËÙ¿ª¹Ø»ú¹¦ÄÜ
+        slog(MMI_PRINT, SLOG_NORMAL, "MMI fast_poweron fail,g_fast_poweron=FALSE!! \n\n");
+        return FALSE;
+    }
+    
+    while (!strcmp(rsqFlag, "work")) {
+        longPress = mmi_get_longpress_flag();
+        if(FALSE == longPress){
+            slog(MMI_PRINT, SLOG_NORMAL, "MMI fast_poweron fail,no AIRMODE_RSQ!! \n\n");
+            return FALSE;
+        }
+        mmi_ms_sleep(100);
+        sc_cfg_get("cfun_work", rsqFlag, sizeof(rsqFlag));
+    }
+    return TRUE;
+}
+
+/***********************************************************************************
+º¯Êý×÷ÓÃ:´¦Àí5S¹Ø»ú
+***********************************************************************************/
+VOID mmi_handle_fast_poweroff(VOID)
+{
+	int airmode = 1;
+	int usbmode = 0;
+	struct ext_msg_data ext_data;
+
+	if(!mmi_valid_fast_onoff()){
+		slog(MMI_PRINT, SLOG_NORMAL, "MMI fast_poweron STOP!! \n\n");
+		return ;
+	}
+	sc_cfg_set(NV_FAKE_POWEROFF_STATE, "1");
+	ext_data.cmd = Ext_Cmd_POWEROFF_FAKE;
+	mmi_wifi_operate(WIFI_TURN_OFF_FAKE_POWEROFF);
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_handle_fast_poweroff!! \n\n");
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_AT_CTL, (USHORT)MSG_CMD_AIRMODE_SET_REQ, sizeof(int), (CHAR *)(&airmode), 0);
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_USBCFGMNG, (USHORT)MSG_CMD_FASTPOWER_IND, sizeof(int), (CHAR *)(&usbmode), 0);
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_MAIN_CTRL, (USHORT)MSG_CMD_POWEROFF_RSP, sizeof(struct ext_msg_data), (CHAR *)(&ext_data), 0);
+
+	slog(MMI_PRINT, SLOG_DEBUG, "mmi_handle_fast_poweroff!!! play poweroff donghua!!!\n");
+	mmi_play_poweroff_cartoon(MMI_POWEROFF_MODE);
+
+	if ((mmi_get_charge_state() == STATE_CHARGING) || (mmi_get_charge_state() == STATE_FULL)) {
+		mmi_set_lcd_mode(MMI_FAKE_POWEROFF_CHARGE_MODE);
+		mmi_set_led_mode(MMI_FAKE_POWEROFF_CHARGE_MODE);
+		mmi_set_update_flag(MMI_TASK_CTRL);
+		mmi_set_update_flag(MMI_TASK_BATTERY);
+
+	} else {
+		mmi_set_lcd_mode(MMI_FAKE_POWEROFF_MODE);
+		mmi_set_led_mode(MMI_FAKE_POWEROFF_MODE);
+		mmi_set_update_flag(MMI_TASK_CTRL);
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_handle_fast_poweroff set mode fake poweroff!!\n");
+}
+
+VOID mmi_handle_fast_poweron(VOID)
+{
+	int airmode = 0;
+	int usbmode = 1;
+
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_handle_fast_poweron!! \n\n");
+    //AT·ÉÐÐģʽÉèÖÃÏìÓ¦Âý£¬ÐèÒªµÈ´ý
+	if(!mmi_valid_fast_onoff()){
+		slog(MMI_PRINT, SLOG_NORMAL, "MMI fast_poweron fail,no AIRMODE_RSQ!! \n\n");
+		return ;
+	}
+	
+	set_wake_lock(MMI_MAIN_LOCK_ID);
+	sc_cfg_set(NV_FAKE_POWEROFF_STATE, "0");
+	mmi_wifi_operate(WIFI_TURN_ON);
+	//µãÁÁÆÁÄ» ¿ª»ú¶¯»­
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_set_work_mode MMI_FAST_POWERON_MODE!! \n\n");
+	mmi_set_lcd_mode(MMI_FAST_POWERON_MODE);
+	mmi_set_led_mode(MMI_FAST_POWERON_MODE);
+	mmi_set_update_flag(MMI_TASK_CTRL);
+
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_AT_CTL, (USHORT)MSG_CMD_AIRMODE_SET_REQ, sizeof(int), (CHAR *)(&airmode), 0);
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_USBCFGMNG, (USHORT)MSG_CMD_FASTPOWER_IND, sizeof(int), (CHAR *)(&usbmode), 0);
+
+	if (g_discharge_protect) {
+		mmi_set_discharge_switch(TRUE);
+	}
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_poweroff.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_poweroff.c
new file mode 100755
index 0000000..c5308df
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_poweroff.c
@@ -0,0 +1,372 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_poweroff.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI°´¼ü²Ù×÷
+*  ×÷            Õß  £º
+*  °æ            ±¾  £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+/*****************************************************************************
+                         Í·Îļþ
+******************************************************************************/
+#include <fcntl.h>
+#include <sys/syscall.h>
+#include <linux/reboot.h>
+#include <linux/input.h>
+#include "mmi_common.h"
+#include "mmi_lcd.h"
+
+/************************************************************************************
+                            È«¾Ö±äÁ¿ÉùÃ÷
+***********************************************************************************/
+static BOOL g_mmi_abnormal_poweroff_flag = FALSE;//Òì³£¹Ø»ú±êÖ¾£¬Ôڵ͵ç»òζÈÒ쳣ʱÈç¹û¿ìËٹػú£¬ÐèÒªÕæ¹Ø»ú
+extern sem_t g_mmi_poweroff_sem_id ;
+extern E_zMmiShowMode g_showMode;
+extern UINT32 g_temp_protect;
+extern UINT32 g_discharge_protect;
+extern UINT32 g_fast_poweron;
+/***********************************************************************************
+ º¯Êý×÷ÓÃ:²¥·Å¹Ø»ú¶¯»­ºóÃðÆÁ
+***********************************************************************************/
+VOID mmi_lcd_poweroff_end_callback()
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "mmi_lcd_poweroff_end_callback !\n");
+	mmi_PutSemaphore(&g_mmi_poweroff_sem_id);
+}
+
+VOID mmi_play_poweroff_cartoon(E_zMmi_Work_Mode mode)
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "mmi_play_poweroff_cartoon !mode=%d\n", mode);
+
+#ifndef DISABLE_LCD
+	mmi_registerLcdPowerOnOff(mmi_lcd_poweroff_end_callback);
+	mmi_set_lcd_mode(mode);
+	slog(MMI_PRINT, SLOG_DEBUG, "mmi_play_poweroff_cartoon mmi_set_lcd_mode end\n");
+#endif
+
+	mmi_set_led_mode(mode);
+	slog(MMI_PRINT, SLOG_DEBUG, "mmi_play_poweroff_cartoon mmi_set_led_mode end\n");
+	mmi_set_update_flag(MMI_TASK_CTRL);
+	slog(MMI_PRINT, SLOG_DEBUG, "mmi_play_poweroff_cartoon mmi_set_update_flag end\n");
+
+#ifndef DISABLE_LCD
+	int sem_ret = -1;
+	sem_ret = mmi_GetSemaphoreEintr(&g_mmi_poweroff_sem_id, MMI_WAIT_FOREVER);
+	if (sem_ret != MMI_SUCCESS) {
+		slog(MMI_PRINT, SLOG_ERR, "mmi_play_poweroff_cartoon FAILED! errno=%d\n",errno);
+	}    
+	slog(MMI_PRINT, SLOG_DEBUG, "mmi_play_poweroff_cartoon mmi_GetSemaphore end\n");
+
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {		
+		mmi_lcd_backlight_end();
+	}
+#endif
+}
+
+
+static VOID mmi_killtimer_for_poweroff(VOID)
+{
+	mmi_kill_idle_timer();
+	mmi_kill_tip_timer();
+	mmi_kill_wifi_data_timer();
+	mmi_kill_traffic_timer();
+}
+
+/***********************************************************************************
+ º¯Êý×÷ÓÃ:¿ìËٹػúʱ£¬²»²¥·Å¹Ø»ú¶¯»­Ö±½Ó¹Ø»ú»ò¹Ø»ú³äµç£¬²»Á¢¼´ÖØÆô
+***********************************************************************************/
+static VOID mmi_factory_reset_without_cartoon(void)
+{
+	struct ext_msg_data ext_data;
+	slog(MMI_PRINT, SLOG_NORMAL, "mmi_factory_reset_without_cartoon!!\n");
+	
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		mmi_lcd_backlight_end();
+	}
+#endif
+
+	if ((mmi_get_charge_state() == STATE_CHARGING) || (mmi_get_charge_state() == STATE_FULL)) {
+		slog(MMI_PRINT, SLOG_NORMAL, "MMI system poweroffcharging !!!\n");
+		//mmi_key_reboot();
+		ext_data.cmd = Ext_Cmd_REBOOT;
+	} else {
+		slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_poweroff!!\n");
+		//system("poweroff");
+		ext_data.cmd = Ext_Cmd_POWEROFF;
+	}
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_MAIN_CTRL, (USHORT)MSG_CMD_RESET_RSP, sizeof(struct ext_msg_data), (CHAR *)(&ext_data), 0);
+}
+
+/***********************************************************************************
+ º¯Êý×÷ÓÃ:´¦ÀíÕý³£µÄ»Ö¸´³ö³§ÉèÖò¢ÖØÆô
+***********************************************************************************/
+static VOID mmi_handle_normal_factory_reset(void)
+{
+	struct ext_msg_data ext_data;
+	slog(MMI_PRINT, SLOG_NORMAL, "mmi_handle_normal_factory_reset!!\n");
+	mmi_killtimer_for_poweroff();
+	mmi_play_poweroff_cartoon(MMI_RESET_MODE);
+
+	slog(MMI_PRINT, SLOG_NORMAL, "mmi_reboot!!\n");
+	//system("reboot");
+	ext_data.cmd = Ext_Cmd_REBOOT;
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_MAIN_CTRL, (USHORT)MSG_CMD_RESET_RSP, sizeof(struct ext_msg_data), (CHAR *)(&ext_data), 0);
+}
+
+/***********************************************************************************
+ º¯Êý×÷ÓÃ:»Ö¸´³ö³§ÉèÖò¢ÖØÆô
+***********************************************************************************/
+static VOID mmi_handle_factory_reset(VOID)
+{
+	if (g_fast_poweron && (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_MODE || mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE
+	                       || mmi_get_led_mode() == MMI_FAKE_POWEROFF_MODE || mmi_get_led_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE)) {
+		mmi_factory_reset_without_cartoon();
+	} else {
+		mmi_handle_normal_factory_reset();
+	}
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:ÉèÖÃÒì³£¹Ø»ú±êÖ¾
+   (Ôڵ͵ç»òζÈÒ쳣ʱ¼´Ê¹ÉèÖÃÁË¿ìËÙ¿ª»úÒ²ÒªÕæÕý¹Ø»ú)
+***********************************************************************************/
+VOID mmi_set_abnormal_poweroff_flag()
+{
+	//g_mmi_abnormal_poweroff_flag = TRUE;
+	sc_cfg_set("abnormal_poweroff_flag", "1");
+}
+VOID mmi_get_abnormal_poweroff_flag()
+{
+	char nv_abnormal_poweroff[2] = {0};
+	sc_cfg_get("abnormal_poweroff_flag", nv_abnormal_poweroff, sizeof(nv_abnormal_poweroff));
+
+	slog(MMI_PRINT, SLOG_DEBUG, "mmi_get_abnormal_poweroff_flag  nv_abnormal_poweroff= %s\n", nv_abnormal_poweroff);
+	if (!strncmp(nv_abnormal_poweroff, "1", 1)) {
+		g_mmi_abnormal_poweroff_flag = TRUE;
+	} else {
+		g_mmi_abnormal_poweroff_flag = FALSE;
+	}
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:´¦Àí¹Ø»ú,RJ45²åÍøÏß»òPINÂ뿪Æô²»×ß¿ìËٹػú
+***********************************************************************************/
+static void mmi_handle_poweroff(VOID)
+{
+	char rj45_sta[24] = {0};
+	char nv_poweron_mode[8] = {0};
+	char nv_sim_pin[8] = {0};
+	sc_cfg_get(NV_RJ45_PLUG, rj45_sta, sizeof(rj45_sta));
+	sc_cfg_get(POWERON_MODE, nv_poweron_mode, sizeof(nv_poweron_mode));
+	sc_cfg_get(NV_NEED_SIM_PIN, nv_sim_pin, sizeof(nv_sim_pin));
+	mmi_get_abnormal_poweroff_flag();
+	slog(MMI_PRINT, SLOG_NORMAL, "mmi_handle_poweroff poweroff_flag = %d\n", g_mmi_abnormal_poweroff_flag);
+	if (g_fast_poweron) {
+		if (g_mmi_abnormal_poweroff_flag) {
+			if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_MODE || mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE
+			    || mmi_get_led_mode() == MMI_FAKE_POWEROFF_MODE || mmi_get_led_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+				mmi_poweroff_without_cartoon();
+			} else {
+				slog(MMI_PRINT, SLOG_DEBUG, "mmi_handle_poweroff abnormal!!\n");
+				mmi_handle_normal_poweroff();
+			}
+		} else {
+			if ((!strncmp(rj45_sta, RJ45_WAN_ON_LAN_OFF, strlen(RJ45_WAN_ON_LAN_OFF)))
+			    || (!strncmp(rj45_sta, RJ45_WAN_OFF_LAN_ON, strlen(RJ45_WAN_OFF_LAN_ON)))
+			    || (!strncmp(rj45_sta, RJ45_WAN_LAN_ON, strlen(RJ45_WAN_LAN_ON)))) {
+				slog(MMI_PRINT, SLOG_DEBUG, "mmi_handle_poweroff wan_lan_on!!\n");
+				mmi_handle_normal_poweroff();
+			} else {
+				if (!strncmp(nv_poweron_mode, FAST_POWERON_MODE, sizeof(FAST_POWERON_MODE)) && strncmp(nv_sim_pin, "yes", sizeof("yes"))) {
+					slog(MMI_PRINT, SLOG_DEBUG, "mmi_handle_fast_poweroff!!\n");
+					mmi_handle_fast_poweroff();
+				} else {
+					mmi_handle_normal_poweroff();
+				}
+			}
+		}
+	} else
+		mmi_handle_normal_poweroff();
+}
+
+/***********************************************************************************
+ º¯Êý×÷ÓÃ:¿ìËٹػúʱ£¬²»²¥·Å¹Ø»ú¶¯»­Ö±½Ó¹Ø»ú»ò¹Ø»ú³äµç£¬²»Á¢¼´ÖØÆô
+***********************************************************************************/
+static VOID mmi_restart_without_cartoon(void)
+{
+	struct ext_msg_data ext_data;
+	
+	slog(MMI_PRINT, SLOG_NORMAL, "mmi_restart_without_cartoon!!\n");
+
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		mmi_lcd_backlight_end();
+	}
+#endif
+
+	if ((mmi_get_charge_state() == STATE_CHARGING) || (mmi_get_charge_state() == STATE_FULL)) {
+		slog(MMI_PRINT, SLOG_NORMAL, "MMI system poweroffcharging!!\n");
+		//mmi_key_reboot();
+		ext_data.cmd = Ext_Cmd_POWEROFF_CHARGING;
+	} else {
+		//system("poweroff");
+		ext_data.cmd = Ext_Cmd_POWEROFF;
+	}
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_MAIN_CTRL, (USHORT)MSG_CMD_RESTART_RSP, sizeof(struct ext_msg_data), (CHAR *)(&ext_data), 0);
+}
+
+/***********************************************************************************
+ º¯Êý×÷ÓÃ:´¦ÀíÕý³£µÄÖØÆô
+***********************************************************************************/
+static VOID mmi_handle_normal_restart(VOID)
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "mmi_handle_normal_restart!!\n");
+	struct ext_msg_data ext_data;
+
+	mmi_killtimer_for_poweroff();
+	mmi_play_poweroff_cartoon(MMI_RESTART_MODE);
+
+	slog(MMI_PRINT, SLOG_NORMAL, "system restart!!!\n");
+	//sc_cfg_save();
+	//system("reboot");
+	ext_data.cmd = Ext_Cmd_REBOOT;
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_MAIN_CTRL, (USHORT)MSG_CMD_RESTART_RSP, sizeof(struct ext_msg_data), (CHAR *)(&ext_data), 0);
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:´¦ÀíÖØÆô
+***********************************************************************************/
+static VOID mmi_handle_restart(VOID)
+{
+	if (g_fast_poweron) {
+		if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_MODE || mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE
+		    || mmi_get_led_mode() == MMI_FAKE_POWEROFF_MODE || mmi_get_led_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+			mmi_restart_without_cartoon();
+		} else {
+			mmi_handle_normal_restart();
+		}
+	} else
+		mmi_handle_normal_restart();
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:´¦Àí»Ö¸´³ö³§ÉèÖò¢ÖØÆôÏûÏ¢
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Factory_Reset(VOID *data)
+{
+	set_wake_lock(MMI_POWEROFF_LOCK_ID);
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI zMMI_Handle_Msg_Factory_Reset !!\n");
+	if (g_discharge_protect) {
+		mmi_set_discharge_switch(FALSE);
+	}
+	mmi_handle_factory_reset();
+	return 0;
+	//mmi_send_message(MODULE_ID_BLC_POWEROFF, MSG_CMD_MAINCTRL_RESET_RESULT, 0, NULL);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:´¦ÀíÖØÆôÏûÏ¢
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Restart(VOID *data)
+{
+	set_wake_lock(MMI_POWEROFF_LOCK_ID);
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI zMMI_Handle_Msg_Restart !!\n");
+
+	if (g_discharge_protect) {
+		mmi_set_discharge_switch(FALSE);
+	}
+	mmi_handle_restart();
+	return 0;
+}
+/**********************************************************************************
+º¯Êý×÷ÓÃ:´¦Àí¹Ø»úÏûÏ¢
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Poweroff(VOID *data)
+{
+	if (g_discharge_protect) {
+		mmi_set_discharge_switch(FALSE);
+	}
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI zMMI_Handle_Msg_Poweroff !!\n");
+	mmi_handle_poweroff();
+	return 0;
+}
+/**********************************************************************************
+º¯Êý×÷ÓÃ:´¦Àí¹Ø»úÏûÏ¢
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Plugout(VOID *data)
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI poweroff,CHARGE_STATUS_DISCHARGING !!!\n");
+
+	system("poweroff");
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:MMIÉèÖûָ´³ö³§ÉèÖÃÖØÆôÒªÇó
+***********************************************************************************/
+VOID  mmi_set_factory_reset()
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_set_factory_reset send MSG!!\n");
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_MAIN_CTRL, (USHORT)MSG_CMD_RESET_REQUEST, 0, NULL, 0);
+}
+/**********************************************************************************
+º¯Êý×÷ÓÃ:MMIÉèÖùػúÒªÇó
+***********************************************************************************/
+VOID  mmi_set_poweroff()
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_set_poweroff send MSG!!\n");
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_MAIN_CTRL, (USHORT)MSG_CMD_POWEROFF_REQUEST, 0, NULL, 0);
+}
+
+/***********************************************************************************
+º¯Êý×÷ÓÃ:´¦ÀíÕý³£¹Ø»ú
+***********************************************************************************/
+VOID mmi_poweroff_without_cartoon(void)
+{
+	struct ext_msg_data ext_data;
+	
+	slog(MMI_PRINT, SLOG_NORMAL, "mmi_poweroff_without_cartoon!!\n");
+	
+	set_wake_lock(MMI_POWEROFF_LOCK_ID);
+	
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		mmi_lcd_backlight_end();
+	}
+#endif
+
+	if ((mmi_get_charge_state() == STATE_CHARGING) || (mmi_get_charge_state() == STATE_FULL)) {
+		slog(MMI_PRINT, SLOG_NORMAL, "MMI system poweroffcharging!!\n");
+		ext_data.cmd = Ext_Cmd_REBOOT;
+	} else {
+		ext_data.cmd = Ext_Cmd_POWEROFF;
+	}
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_MAIN_CTRL, (USHORT)MSG_CMD_POWEROFF_RSP, sizeof(struct ext_msg_data), (CHAR *)(&ext_data), 0);
+}
+
+VOID mmi_handle_normal_poweroff(void)
+{
+	struct ext_msg_data ext_data;
+	slog(MMI_PRINT, SLOG_NORMAL, "mmi_handle_normal_poweroff!!\n");
+	set_wake_lock(MMI_POWEROFF_LOCK_ID);
+
+	mmi_killtimer_for_poweroff();
+	mmi_play_poweroff_cartoon(MMI_POWEROFF_MODE);
+	//if (mmi_get_usb_insert_state()) { //kw 3
+	//	slog(MMI_PRINT, SLOG_NORMAL, "MMI system poweroffcharging!!\n");
+	//	ext_data.cmd = Ext_Cmd_POWEROFF_CHARGING;
+	//} else 
+	{
+		slog(MMI_PRINT, SLOG_NORMAL, "MMI poweroff,normal!!!\n");
+		ext_data.cmd = Ext_Cmd_POWEROFF;
+	}
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_MAIN_CTRL, (USHORT)MSG_CMD_POWEROFF_RSP, sizeof(struct ext_msg_data), (CHAR *)(&ext_data), 0);
+}
+
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_poweroff_charger.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_poweroff_charger.c
new file mode 100755
index 0000000..7a3ed94
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_poweroff_charger.c
@@ -0,0 +1,718 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_poweroff_charger.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £º¹Ø»ú³äµç´¦Àí
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-8-6
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#include <linux/input.h>
+#include <linux/netlink.h>
+#include <sys/socket.h>
+#include "mmi_common.h"
+#include "mmi_lcd.h"
+
+
+extern UINT32 g_temp_protect;
+extern UINT32 g_discharge_protect;
+/*
+extern SINT32 g_mmi_hightempvol;
+extern SINT32 g_mmi_superhightempvol;
+extern SINT32 g_mmi_lowtempvol;
+extern SINT32 g_mmi_superlowtempvol;
+*/
+extern UINT32 g_mmi_poweroff_turnon_flag;
+extern pthread_mutex_t g_mmi_poweron_mutex;
+extern E_zMmiShowMode g_showMode;
+
+
+static int g_poc_kpd_handle = -1;//°´¼üÉ豸¾ä±ú£¬Ö»Ôڹػú³äµçÁ÷³ÌÓõ½
+
+
+static E_zMmi_Poc_State s_mmi_poc_state = POC_STATE_MAX;//¹Ø»ú³äµçʱµç³Ø×´Ì¬
+static E_zMmi_Poc_Type s_mmi_poc_charging_type = POC_CHARGING_TYPE_MAX;//¹Ø»ú³äµçʱµç³ØÀàÐÍ
+static SINT32 s_offchg_backlight_sta = 1;//¹Ø»ú³äµçʱ±³¹âÁÁ¶È
+
+static SINT32 s_offchg_backlight_timer_status = 0; //20s±³¹âÃðÆÁµÄ¶¨Ê±Æ÷״̬
+static BOOL s_mmi_poc_overvoltage_mode = FALSE;//Ö÷ÒªÊÇÅжϹػú³äµçʱÊÇ·ñ³öÏÖµç³ØÎ´³äµçµÄÇé¿ö
+static long s_offchg_keypress_begin = 0;//¹Ø»ú³äµçʱ£¬°´¼ü°´Ï¿ªÊ¼¼ÆÊ±
+BOOL mmi_is_offchg_poweroff = FALSE; //ÊÇ·ñΪ¹Ø»ú³äµç״̬Ϲػú
+static MMI_TEMP_DETECT offchg_last_temp = MMI_TEMP_DETECT_MAX;//¹Ø»ú³äµçʱ±£´æµç³ØÎ¶ȵÄÉÏÒ»´Î״̬
+static SINT32 s_offchg_temp_count = 0;//ζÈÒ쳣ʱ¿ªÊ¼¼ÆÊý£¬Á¬Ðø3´Îºó½øÐÐÏà¹Ø²Ù×÷
+static BOOL g_poc_chg_switch_off = FALSE;//¹Ø»ú³äµçʱ³äµç¹Ø±Õ¿ª¹Ø£¬Ä¬ÈÏÔÊÐí³äµç
+static BOOL g_poc_dischg_low_current_switch = FALSE;//¹Ø»ú³äµçʱ±ê¼Çµ±Ç°µÄ·ÅµçµçÁ÷´óС
+
+static SINT32 s_offchg_dischargeoff_voltage_num_low = 0;//·ÅµçµçÁ÷ÉèÖóÉ0.5AʱµÄÅжϼÆÊýÆ÷
+static SINT32 s_offchg_dischargeoff_voltage_num_high = 0;//·ÅµçµçÁ÷ÉèÖóÉ1.5AʱµÄÅжϼÆÊýÆ÷
+#define SET_OFFCHG_BACKLIGHT_OFF_TIME		20000//ÆÁÄ»µçÁ¿µ½×Ô¶¯ÃðÆÁµÄʱ¼ä
+
+#ifndef DISABLE_LCD
+extern OS_SEMA_ID g_mmi_gui_init_sem_id;
+#endif
+
+SINT32 offchg_voltage_state_read(VOID);
+
+
+SINT32 offchg_get_pocinfo(UINT32 pocinfo)
+{
+	if (pocinfo != 0) {
+		T_zMmi_Poc_Info * pPocInfo = (T_zMmi_Poc_Info *)pocinfo;
+		pPocInfo->backlight_sta = s_offchg_backlight_sta;
+		pPocInfo->poc_sta = s_mmi_poc_state;
+		pPocInfo->overvoltage_mode = s_mmi_poc_overvoltage_mode;
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 offchg_RegisterPocTaskInfoItem()
+{
+	T_zMMITaskInfoItem poctaskInfoItem = {0};
+	poctaskInfoItem.task = MMI_TASK_POWEROFF_CHARGER;
+	poctaskInfoItem.taskinfo = (VOID*)malloc(sizeof(T_zMmi_Poc_Info));
+	poctaskInfoItem.get_taskinfo_fun = offchg_get_pocinfo;
+#ifndef DISABLE_LCD
+	poctaskInfoItem.get_lcdinfo_fun = mmi_getLcdPowerOffChagerInfo;
+#endif
+	poctaskInfoItem.get_ledinfo_fun = mmi_getLedPowerOffChagerInfo;
+	poctaskInfoItem.ledinfo = (VOID*)malloc(sizeof(T_zMmi_Led_Info));
+	mmi_register_taskinfo_item(&poctaskInfoItem);
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¹Ø»ú³äµç¹Ø±³¹â¶¨Ê±Æ÷»Øµ÷º¯Êý
+***********************************************************************************/
+static VOID * offchg_set_backlight_off(VOID *arg)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg_set_backlight_off !\n");
+	s_offchg_backlight_sta = 0;
+	mmi_set_update_flag(MMI_TASK_POWEROFF_CHARGER);
+	s_offchg_backlight_timer_status = 0;
+	return NULL;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¹Ø»ú³äµçʱÎÞ°´¼ü¹Ø±³¹â¶¨Ê±Æ÷£¬Ê±¼ä20Ã룬һ´ÎÐÔ¶¨Ê±Æ÷
+***********************************************************************************/
+static VOID offchg_backlightoff_timer_create(VOID)
+{
+	int ret = -1;
+	ret = sc_timer_create(SET_MMI_IDLE_TIMER, TIMER_FLAG_ONCE, SET_MMI_IDLE_TIME, &offchg_set_backlight_off, NULL);
+	if (ret != 0) {
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg_backlightoff_timer_create FAILED\n");
+	}
+}
+
+static VOID offchg_backlightoff_timer_stop()
+{
+	sc_timer_delete(SET_MMI_IDLE_TIMER);
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º»ñÈ¡·Åµç¿ÚÊÇ·ñ²å¸ºÔØ×´Ì¬
+ ***********************************************************************************/
+static BOOL offchg_get_load_state(VOID)
+{
+	char load_state_buf[8] = {0};
+	int len = 0;
+	FILE* fd_boost_state = NULL;
+
+	fd_boost_state = fopen(BOOST_LOAD_STATUS_PATH, "r");
+	if (fd_boost_state == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI offchg_get_load_state open boost file fail!\n");
+		//MMI_ASSERT(0);
+		return FALSE;
+	}
+	len = fread(load_state_buf, 1, 2, fd_boost_state);
+	if (len > 0) { //kw 3
+		fclose(fd_boost_state);
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg_get_load_state load_state_buf=%s!\n", load_state_buf);
+		if (strncmp(load_state_buf, "1", strlen("1")) == 0) {
+			return TRUE;
+		} else if (strncmp(load_state_buf, "0", strlen("0")) == 0) {
+			return FALSE;
+		} else {
+			slog(MMI_PRINT, SLOG_ERR, "MMI offchg_get_load_state read load_state error!\n");
+			return FALSE;
+		}
+	} else {
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg_get_load_state read boost file fail len = %d!\n", len);
+		fclose(fd_boost_state);
+		return FALSE;
+	}
+}
+
+static int offchg_check_power_low(VOID)
+{
+	SINT32 bat_volt = 0;
+	bat_volt = offchg_voltage_state_read();
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI offchg_check_power_low bat_volt =%d\n\n", bat_volt);
+
+	if (bat_volt != -1 &&  bat_volt < POWERONLEVEL) {
+		return 1;
+	}
+	return 0;
+}
+/**********************************************************************************
+*º¯Êý˵Ã÷£º»ñÈ¡³äµç״̬
+ ***********************************************************************************/
+static VOID ofchg_get_charge_status(VOID)
+{
+	char chg_state_buf[CHARGE_STATUS_LENGTH] = {0};
+	int len = 0;
+	FILE *fd_charger = NULL;
+	fd_charger = fopen(CHARGE_STATUS_PATH, "r");
+	if (fd_charger == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI ofchg_get_charge_status open charging file fail!\n");
+		//MMI_ASSERT(0);
+		return;
+	}
+	len = fread(chg_state_buf, 1, CHARGE_STATUS_LENGTH, fd_charger);
+	if (len > 0) { //kw 3
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI ofchg_get_charge_status chg_state_buf=%s !\n", chg_state_buf);
+		if (strncmp(chg_state_buf, CHARGE_STATUS_CHARGING, CHARGE_STATUS_CHARGING_LENGTH) == 0) {
+			g_poc_chg_switch_off = FALSE;
+			if (1 == offchg_check_power_low())
+				s_mmi_poc_state = POC_STATE_LOWBATTERY;
+			else
+				s_mmi_poc_state = POC_STATE_CHARGING;
+			mmi_set_update_flag(MMI_TASK_POWEROFF_CHARGER);
+		} else if (strncmp(chg_state_buf, CHARGE_STATUS_FULL, CHARGE_STATUS_FULL_LENGTH) == 0) {
+			g_poc_chg_switch_off = FALSE;
+			s_mmi_poc_state = POC_STATE_FULL;
+			mmi_set_update_flag(MMI_TASK_POWEROFF_CHARGER);
+		} else if (strncmp(chg_state_buf, CHARGE_STATUS_NOTCHARGING, CHARGE_STATUS_NOTCHARGING_LENGTH) == 0) {
+			s_mmi_poc_state = POC_STATE_TEMP_ERROR;
+			if (!g_poc_chg_switch_off) {				
+				system(MMI_TURN_OFF_CHG);
+				g_poc_chg_switch_off = TRUE;
+				s_offchg_backlight_sta = 0;
+				mmi_set_update_flag(MMI_TASK_POWEROFF_CHARGER);
+			}
+		} else if (strncmp(chg_state_buf, CHARGE_STATUS_DISCHARGING, CHARGE_STATUS_DISCHARGING_LENGTH) == 0) {
+			//¸øRTC·¢ÏûÏ¢£¬ÇÒÐèÒªÊÕµ½»Ø¸´
+			set_wake_lock(MMI_POWEROFF_LOCK_LCD_ID);
+			if (rtc_timer_del_all(MODULE_ID_MMI, MSG_CMD_POWEROFF_RSP) == 0) {
+				slog(MMI_PRINT, SLOG_NORMAL, "MMI poweroff_msg_process: send msg to rtc ok!!!\n");
+			}
+			mmi_is_offchg_poweroff = TRUE;
+			s_mmi_poc_overvoltage_mode = TRUE;
+			mmi_set_update_flag(MMI_TASK_POWEROFF_CHARGER);
+		}
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI ofchg_get_charge_status read voltage file fail len = %d !\n", len);
+	}
+	fclose(fd_charger);
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º ¶ÁÈ¡µçѹֵ
+***********************************************************************************/
+SINT32 offchg_voltage_state_read(VOID)
+{
+	char buf_volt[CHARGE_VOLTAGE_LENGTH] = {0};
+	FILE* fd_voltage = NULL;
+	int len = 0;
+	int voltagepower = 0;
+
+	fd_voltage = fopen(CHARGE_VOLTAGE_PATH, "r");
+	if (fd_voltage == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI open voltage file fail!\n");
+		//MMI_ASSERT(0);
+		return -1;
+	}
+	len = fread(buf_volt, 1, CHARGE_VOLTAGE_LENGTH, fd_voltage);
+	if (len > 0) { //kw 3
+		voltagepower = atoi(buf_volt);
+		fclose(fd_voltage);
+		return voltagepower;
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI read voltage file fail len = %d !\n", len);
+		fclose(fd_voltage);
+		return -1;
+	}
+}
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:¹Ø»ú³äµçʱ½øÐе͵ç·Åµç±£»¤
+***********************************************************************************/
+VOID offchg_lowbattery_discharge_protect(SINT32 voltagepower)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg_lowbattery_discharge_protect voltagepower = %d !!!\n", voltagepower);
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg_lowbattery_discharge_protect s_offchg_dischargeoff_voltage_num_low = %d, s_offchg_dischargeoff_voltage_num_high = %d !!\n", s_offchg_dischargeoff_voltage_num_low, s_offchg_dischargeoff_voltage_num_high);
+	BOOL isLoadFlag = FALSE;
+	isLoadFlag = offchg_get_load_state();
+	if (isLoadFlag) {
+		if (voltagepower < DISCHARGELEVEL) {
+			s_offchg_dischargeoff_voltage_num_high = 0;
+			s_offchg_dischargeoff_voltage_num_low ++ ;
+			if (s_offchg_dischargeoff_voltage_num_low == 3) {
+				s_offchg_dischargeoff_voltage_num_low = 0;
+				if (!g_poc_dischg_low_current_switch) {
+					system(MMI_DISCHG_LOW_CURRENT);
+					slog(MMI_PRINT, SLOG_NORMAL, "MMI offchg_lowbattery_discharge_protect turn to LOW current!!!\n");
+					g_poc_dischg_low_current_switch = TRUE;
+					mmi_set_update_flag(MMI_TASK_POWEROFF_CHARGER);
+				}
+			}
+		} else if (voltagepower > CHARGINGLEVEL) {
+			s_offchg_dischargeoff_voltage_num_low = 0;
+			s_offchg_dischargeoff_voltage_num_high ++ ;
+			if (s_offchg_dischargeoff_voltage_num_high == 3) {
+				s_offchg_dischargeoff_voltage_num_high = 0;
+				if (g_poc_dischg_low_current_switch) {
+					system(MMI_DISCHG_HIGH_CURRENT);
+					slog(MMI_PRINT, SLOG_NORMAL, "MMI offchg_lowbattery_discharge_protect turn to HIGH current!!!\n");
+					g_poc_dischg_low_current_switch = FALSE;
+					mmi_set_update_flag(MMI_TASK_POWEROFF_CHARGER);
+				}
+			}
+		} else {
+			s_offchg_dischargeoff_voltage_num_low = 0;
+			s_offchg_dischargeoff_voltage_num_high = 0;
+		}
+	} else {
+		mmi_set_discharge_switch(FALSE);
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg_lowbattery_discharge_protect NO_Load MMI_TURN_OFF_DISCHG!!!\n");
+	}
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷ :¹Ø»ú³äµçʱµÍµç¼ì²âÏß³Ì
+ ***********************************************************************************/
+static VOID offchg_create_get_voltage_thread(VOID)
+{
+	system(MMI_TURN_OFF_DISCHG);
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´¦Àí¿ª»ú
+************************************************************************************/
+static VOID offchg_handle_power_on(VOID)
+{
+	SINT32 bat_volt = 0;
+	bat_volt = offchg_voltage_state_read();
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI s_mmi_poc_overvoltage_mode=%d, bat_volt =%d\n\n", s_mmi_poc_overvoltage_mode, bat_volt);
+
+	if (bat_volt != -1 &&  bat_volt < POWERONLEVEL) {
+		if(s_mmi_poc_overvoltage_mode)
+			s_mmi_poc_state = POC_STATE_LOWBATTERY;
+		mmi_set_update_flag(MMI_TASK_POWEROFF_CHARGER);
+	} else {
+		set_wake_lock(MMI_POWEROFF_LOCK_ID);
+		slog(MMI_PRINT, SLOG_NORMAL, "MMI handleKey ######KEY_POWER LONGPRESS###### POWER ON!!!!!!\n\n");
+#ifndef DISABLE_LCD
+		if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+			mmi_getMutex(&g_mmi_poweron_mutex);
+			g_mmi_poweroff_turnon_flag = TRUE;
+			mmi_putMutex(&g_mmi_poweron_mutex);
+			s_offchg_backlight_sta = 0;
+			mmi_stopLcdBatteryTimer();
+			mmi_setMainWindToBg();
+			mmi_lcd_backlight_end();
+			tp_man_Lcd_Sleep_Enter();
+		}
+#endif
+		system("reboot");//´ËʱÖ÷¿Ø²»´æÔÚËùÒÔÓÉMMI×Ô¼ºµ÷		
+	}
+}
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡°´¼üʱ¼ä
+***********************************************************************************/
+long offchg_get_keypress_time()
+{
+	struct timeval tv;
+	long second;
+	gettimeofday(&tv, NULL);
+	second = tv.tv_sec;
+	return second;
+}
+
+/************************************************************************************
+ º¯Êý×÷ÓÃ:¶ÁÈ¡°´¼üÐÅÏ¢
+***********************************************************************************/
+static VOID offchg_get_keystrokes_data(MMI_KP_INFO *kp_info)
+{
+	int retR = -1;
+	struct input_event kp_event = {0};
+
+	memset((VOID *)kp_info, 0, sizeof(MMI_KP_INFO));
+	kp_info->status = KEY_STATUS_MAX;
+
+
+	retR = read(g_poc_kpd_handle, (CHAR *)&kp_event, sizeof(kp_event));
+	if (retR < 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI get_keystrokes_data read falied c-err:%d!",errno);
+		return ;
+	}
+	if (kp_event.type == 1) {
+		if (kp_event.value == 1) {
+			set_wake_lock(MMI_POWEROFF_LOCK_LCD_ID);
+			kp_info->status = KEY_STATUS_DOWN;
+			s_offchg_keypress_begin = offchg_get_keypress_time();
+		} else if (kp_event.value == 0) {
+			kp_info->status = KEY_STATUS_UP;
+			s_offchg_keypress_begin = 0;
+		} else if (kp_event.value == 2) {
+			long sec_end = offchg_get_keypress_time();
+			int sec_lingpress = (int)(sec_end - s_offchg_keypress_begin);
+			if (sec_lingpress >= 3) {
+				kp_info->status = KEY_STATUS_LONGPRESS;
+			}
+		}
+		if (kp_event.code == KEY_POWER_CODE) {
+			kp_info->type = KEY_TYPE_POWER;
+		} else if (kp_event.code == KEY_RESET_CODE) {
+			kp_info->type = KEY_TYPE_RESET;
+		} else if (kp_event.code == KEY_WPS_CODE) {
+			kp_info->type = KEY_TYPE_WPS;
+		}
+	} else {
+		kp_info->status = KEY_STATUS_MAX;
+		return;
+	}
+
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´¦Àí°´¼ü
+************************************************************************************/
+static VOID offchg_handle_key_thread(VOID)
+{
+	MMI_KP_INFO keyData = {0};
+	BOOL longPressFlag = FALSE;
+	int ret = 0;
+	
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg_handle_key_thread  begin !!\n ");
+	
+	prctl(PR_SET_NAME, "offchghandlekey", 0, 0, 0);
+
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {	
+		while ((ret = mmi_GetSemaphore(&g_mmi_gui_init_sem_id, MMI_WAIT_FOREVER)) != MMI_SUCCESS) {
+			slog(MMI_PRINT, SLOG_DEBUG, "mmi offchg_handle_key_thread get gui_init_sem_id failed ret = %d, errno=%d\n", ret, errno);
+			continue;
+		}
+		mmi_DeleteSemaphore(&g_mmi_gui_init_sem_id);
+	}
+#endif
+
+	while (1) {
+		offchg_get_keystrokes_data(&keyData);
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg_handle_key_thread Key's type:%d, status:%d\n", keyData.type, keyData.status);
+		
+		switch (keyData.status) {
+		case KEY_STATUS_DOWN: {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg KEYDOWN !!! s_offchg_backlight_sta=%d,g_poc_chg_switch_off=%d\n", s_offchg_backlight_sta, g_poc_chg_switch_off);
+			offchg_backlightoff_timer_stop();
+			offchg_backlightoff_timer_create();
+			if (s_offchg_backlight_sta == 0 && !g_poc_chg_switch_off) {
+				s_offchg_backlight_sta = 1;
+				mmi_set_update_flag(MMI_TASK_POWEROFF_CHARGER);
+			}
+			break;
+		}
+		case KEY_STATUS_UP: {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg KEYUP KEYUP !!! longPressFlag=%d", longPressFlag);
+
+			if (TRUE == longPressFlag) {
+				longPressFlag = FALSE;		//±ê¼Ç³¤°´½áÊø
+			}
+			if (s_mmi_poc_state == POC_STATE_LOWBATTERY || s_mmi_poc_state == POC_STATE_NOBATTERY) {
+				if (1 == offchg_check_power_low()) {
+					set_wake_unlock(MMI_POWEROFF_LOCK_LCD_ID);
+				}
+				else {
+					s_mmi_poc_state = POC_STATE_CHARGING;
+					mmi_set_update_flag(MMI_TASK_POWEROFF_CHARGER);
+				}
+			}
+
+			break;
+		}
+		case KEY_STATUS_LONGPRESS: {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg KEYLONGPRESS  longPressFlag =%d\n", longPressFlag);
+			if (FALSE == longPressFlag) {
+				longPressFlag = TRUE;
+				if (keyData.type == KEY_TYPE_POWER) {
+					offchg_handle_power_on();
+				}
+			}
+			break;
+		}
+		default: {
+			break;
+		}
+		}
+	}
+
+}
+
+#if 0
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:×Ô¶¯»¯²âÊÔÄ£Äâ°´¼ü£¬¹Ø»ú³äµç
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Atest_Chg(VOID *data)
+{
+	static BOOL longPressFlag = FALSE;
+	//value:°´¼üʼþ code:°´¼ü¼üÖµ
+	autotest_key_rspmsg *kp_event = (autotest_key_rspmsg *)data;
+	MMI_KP_INFO keyData = {0};
+
+	if (kp_event->value == 1) {
+		set_wake_lock(MMI_POWEROFF_LOCK_LCD_ID);
+		keyData.status = KEY_STATUS_DOWN;
+		s_offchg_keypress_begin = offchg_get_keypress_time();
+	} else if (kp_event->value == 0) {
+		keyData.status = KEY_STATUS_UP;
+		s_offchg_keypress_begin = 0;
+	} else if (kp_event->value == 2) {
+		long sec_end = offchg_get_keypress_time();
+		int sec_lingpress = (int)(sec_end - s_offchg_keypress_begin);
+		if (sec_lingpress >= 3) {
+			keyData.status = KEY_STATUS_LONGPRESS;
+		}
+	}
+		
+	if (kp_event->code == KEY_POWER_CODE) {
+		keyData.type = KEY_TYPE_POWER;
+	} else if (kp_event->code == KEY_RESET_CODE) {
+		keyData.type = KEY_TYPE_RESET;
+	} else if (kp_event->code == KEY_WPS_CODE) {
+		keyData.type = KEY_TYPE_WPS;
+	}
+	
+	switch (keyData.status) {
+		case KEY_STATUS_DOWN: {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg KEYDOWN !!! s_offchg_backlight_sta=%d,g_poc_chg_switch_off=%d\n", s_offchg_backlight_sta, g_poc_chg_switch_off);
+			offchg_backlightoff_timer_stop();
+			offchg_backlightoff_timer_create();
+			if (s_offchg_backlight_sta == 0 && !g_poc_chg_switch_off) {
+				s_offchg_backlight_sta = 1;
+				mmi_set_update_flag(MMI_TASK_POWEROFF_CHARGER);
+			}
+			break;
+		}
+		case KEY_STATUS_UP: {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg KEYUP KEYUP !!! longPressFlag=%d", longPressFlag);
+
+			if (TRUE == longPressFlag) {
+				longPressFlag = FALSE;		//±ê¼Ç³¤°´½áÊø
+			}
+			if (s_mmi_poc_state == POC_STATE_LOWBATTERY || s_mmi_poc_state == POC_STATE_NOBATTERY) {
+				s_mmi_poc_state = POC_STATE_CHARGING;
+				mmi_set_update_flag(MMI_TASK_POWEROFF_CHARGER);
+			}
+
+			break;
+		}
+		case KEY_STATUS_LONGPRESS: {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg KEYLONGPRESS  longPressFlag =%d\n", longPressFlag);
+			if (FALSE == longPressFlag) {
+				longPressFlag = TRUE;
+				if (keyData.type == KEY_TYPE_POWER) {
+					offchg_handle_power_on();
+				}
+			}
+			break;
+		}
+		default: {
+			break;
+		}
+	}
+	return 0;
+}
+#endif
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´´½¨´¦Àí°´¼üÏûÏ¢µÄ½ø³Ì
+************************************************************************************/
+static VOID offchg_init_handle_key_thread(VOID)
+{
+	g_poc_kpd_handle = open(KPD_PATH, O_RDONLY);
+	if (g_poc_kpd_handle < 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI offchg_init_handle_key_thread open kp dev FAILED!!\n");
+		MMI_ASSERT(0);
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg_init_dev_handle success!\n");
+
+	offchg_handle_key_thread();
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º³äµç״̬(°Î³ö/²åÈë/³äÂú) ¸Ä±äʱµÄ»Øµ÷º¯Êý
+************************************************************************************/
+static void offchg_chargingstates_check()
+{
+	ofchg_get_charge_status();
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£ºnetlinkÊý¾Ý¼ìË÷º¯Êý
+ Êä             È룺const char *key£ºÖ¸Ïò¹Ø¼ü×ÖµÄÖ¸Õë
+			          const char *buf£ºÖ¸Ïò×Ö·û´®µÄÖ¸Õë
+			          size_t len£º×Ö·û´®³¤¶È
+·µ   »Ø   Öµ£º ·µ»Ø×Ö·û´®ÖжÔÓ¦¹Ø¼ü×ֵįðʼµØÖ·£¬Èô¼ìË÷²»µ½¹Ø¼ü×Ö£¬·µ»ØNULL
+***********************************************************************************/
+static const char *offchg_search_netlink(const char *key, const char *buf, size_t len)
+{
+	size_t curlen = 0;
+	size_t keylen = strlen((char *)key);
+	char *cur = (char *)buf;
+
+	while (cur < buf + len - keylen) {
+		curlen = strlen(cur);
+		if (curlen == 0)
+			break;
+		if (!strncmp(key, cur, keylen) && cur[keylen] == '=') {
+			return cur + keylen + 1;
+		}
+		cur += (curlen + 1);
+	}
+	return NULL;
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´Ónetlink¼àÌýµ½µÄÏûÏ¢×Ö·û´®´¦Àí³äµçÏûÏ¢
+ ***********************************************************************************/
+void offchg_process_netlink_event(int netlink_fd)
+{
+	char buf[1024] = {0};
+	int byte_counts = -1;
+	const char *keys = NULL, *subsys = NULL, *action = NULL;
+	const char *power_supply_name = NULL;
+	byte_counts = recv(netlink_fd, buf, sizeof(buf)-1, 0);
+	buf[sizeof(buf)-1] = '\0';//cov
+
+	if (byte_counts <= 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI receive from netlonk error/n");
+		return;
+	}
+	//´òÓ¡³öÉϱ¨µÄueventÏûÏ¢Éϱ¨µÄ×Ö·û´®
+	//slog(MMI_PRINT,SLOG_DEBUG,"MMI received data:%s\n",buf);
+	keys = (char *)(buf + strlen((char *)buf) + 1);
+	byte_counts -= (strlen((char*)buf) + 1);
+	//½âÎö³öÀ´×Ö·û´®
+	//slog(MMI_PRINT,SLOG_DEBUG,"MMI received keys:%s\n",keys);
+
+	//°ÑÀïÃæµÄ¹Ø¼ü×Ö½âÎö³öÀ´
+	subsys = offchg_search_netlink("SUBSYSTEM", keys, byte_counts);
+	//slog(MMI_PRINT,SLOG_DEBUG,"MMI subsys:%s\n",subsys);
+
+	action = offchg_search_netlink("ACTION", keys, byte_counts);
+	//slog(MMI_PRINT,SLOG_DEBUG,"MMI action:%s\n",action);
+
+	power_supply_name = offchg_search_netlink("POWER_SUPPLY_NAME", keys, byte_counts);
+	//µ±·¢ÏֵײãÊÇpower_supplyÖÐchange,ÔòÈ¥¶ÁÈ¡³äµç״̬£¬¶Ô״̬½øÐÐÏàÓ¦µÄµãµÆ²Ù×÷¡£
+	if ((subsys != NULL) && (action != NULL)) { // for kernel 3.0
+		if ((!strcmp(subsys, "power_supply")) && (!(strcmp(action, "change")))) {
+			if ((power_supply_name != NULL) && (!strcmp(power_supply_name, "charger"))) {//klocwork
+				//ÅжÏÊÇ·ñÊdzäµç״̬Îļþ·¢ÉúµÄ±ä»¯
+				offchg_chargingstates_check();
+			} else {
+				return;
+			}
+		}
+	}
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´ò¿ªcharging_netlinkÌ×½Ó×Ö
+  ·µ»ØÖµ£º ´ò¿ªµÄnetlinkÌ×½Ó×ÖÃèÊö·û£¬´ò¿ª³É¹¦·µ»Ø·Ç0Öµ
+ ***********************************************************************************/
+int offchg_open_charging_netlink()
+{
+	struct sockaddr_nl addr;
+	int s = -1;
+	memset((VOID *)(&addr), 0, sizeof(addr));
+	addr.nl_family = AF_NETLINK;
+	addr.nl_pid = 0;//getpid();
+	addr.nl_groups = 1;
+	s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
+	if (s < 0) {
+		return -1;//wk 3
+	}
+//  setsockopt(s, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz));
+	if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+		close(s);
+		return -1;//wk 3
+	}
+	return s;
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´´½¨³äµç¼àÌýÏß³Ì
+ ***********************************************************************************/
+void *offchg_chargingcheck_process_thread(void *arg)
+{
+	int charging_netlink = -1;
+	int fd_counts = -1;
+	fd_set readfds;
+	prctl(PR_SET_NAME, "offchgchgck", 0, 0, 0);
+	if ((charging_netlink = offchg_open_charging_netlink()) < 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI charging_netlink wrong \n");
+		return NULL;
+	}
+	prctl(PR_SET_NAME, "offchgcheck", 0, 0, 0);
+	while (1) {
+		FD_ZERO(&readfds);
+		FD_SET(charging_netlink, &readfds);
+		fd_counts = select(charging_netlink + 1, &readfds, NULL, NULL, NULL);
+
+		if (fd_counts < 0) {
+			slog(MMI_PRINT, SLOG_ERR, "MMI select usb_netlink error! \n");
+			continue;
+		} else if (fd_counts == 0) {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI select usb_netlink timeout\n");
+
+			continue;
+		} else {
+			if (charging_netlink > 0 && FD_ISSET(charging_netlink, &readfds)) {
+				offchg_process_netlink_event(charging_netlink);
+			}
+		}
+	}
+}
+
+static VOID offchg_create_chargestate_check_thread(VOID)
+{
+	pthread_t mmi_chgsta_thread;
+	if (pthread_create(&mmi_chgsta_thread, NULL, &offchg_chargingcheck_process_thread, NULL) == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI offchg_create_chargestate_check_thread error\n");
+		return;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI offchg_create_chargestate_check_thread success!!!\n");
+
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º¹Ø»ú³äµç´¦ÀíÈë¿Úº¯Êý
+************************************************************************************/
+int zMmi_PowerOffChargerEntry()
+{
+
+	set_wake_lock(MMI_POWEROFF_LOCK_LCD_ID);
+	mmi_poweroffcharger_init();
+	ofchg_get_charge_status();
+	offchg_backlightoff_timer_create();
+	offchg_create_chargestate_check_thread();
+
+	if (g_discharge_protect) {
+		offchg_create_get_voltage_thread();
+	}
+	
+	if (1 == offchg_check_power_low()) {
+		set_wake_unlock(MMI_POWEROFF_LOCK_LCD_ID);
+		set_wake_lock_timeout(MMI_POWEROFF_LOCK_LCD_ID, 10);
+	}
+
+	offchg_init_handle_key_thread();
+	return 0;
+
+}
+
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_pvtest.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_pvtest.c
new file mode 100755
index 0000000..2d12a3b
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_pvtest.c
@@ -0,0 +1,200 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_pvtest.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºÉú²ú²âÊÔ
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-11-21
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+
+#include "mmi_common.h"
+#include "zctrm_ext.h"
+#include "RONvParam_AMT.h"
+
+typedef struct {
+	char at[32];
+	ZCTRM_ATEXT_FUN func;
+} T_PvTest_At;
+
+#define ZPS_CTRM_MSINFO_NVINFO_BASE_ADDR 0xB8
+#define ZPS_CTRM_MSINFO_MAX_NVINFO_LEN 200
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º»ñµÃµç³ØµçÁ¿
+************************************************************************************/
+static SINT32 pvtest_GetBatteryLevel(VOID)
+{
+	UINT32 voltage_now = 0;
+	SINT32 bat_level = 0;
+	T_ZDrvIO_Handle chgHandle = NULL;
+	chgHandle = mmi_open(CHG_DEV, 1);
+	zOss_Printf(SUBMDL_FS, PRINT_LEVEL_NORMAL, "pvtest_GetBatteryLevel open CHE_DEV chgHandle = %x!!\n", chgHandle);
+	if (chgHandle == NULL) {
+		zOss_Printf(SUBMDL_FS, PRINT_LEVEL_ABNORMAL, "pvtest_GetBatteryLevel open CHE_DEV error!!\n");
+		zOss_ASSERT(0);
+	}
+	voltage_now = mmi_voltage_state_read();
+	bat_level = get_voltage_level_from_table(voltage_now);
+	return bat_level;
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´¦Àí½ÓÊÕµ½µÄAT ÃüÁî
+************************************************************************************/
+/**************************************************************************
+* º¯ÊýÃû³Æ: zPvTest_ProGetBatteryLevel
+* ¹¦ÄÜÃèÊö: ²éѯµç³ØµçÁ¿
+* ²ÎÊý˵Ã÷: (IN)
+*                         (OUT)
+* ·µ »Ø Öµ: ÎÞ
+* ÆäËü˵Ã÷:
+**************************************************************************/
+static SINT32 zPvTest_ProGetBatteryLevel(UINT8 channel_id, const UINT8 *buff, UINT16 buffer_len, T_zAti2_CtrmChInd chInd)
+{
+	CHAR  *pStrAt   = NULL;
+	SINT32 batLevel = 0;
+	char pPtr[30] = {0};
+	ZOSS_THREAD_ID m_ledtest_thread = ZOSS_INVALID_THREAD_ID;
+	if ((pStrAt = strstr((const char *)buff, "AT+ZBATTERYLEVEL?")) != 0) {
+		zOss_Printf(SUBMDL_FS, PRINT_LEVEL_NORMAL, "PVTEST zPvTest_ProGetBatteryLevel!\n");
+		batLevel = pvtest_GetBatteryLevel();
+		sprintf((char *)pPtr, "\r\n%s%ld%%", "+ZBATTERYLEVEL:", batLevel);
+		zOss_Printf(SUBMDL_FS, PRINT_LEVEL_ABNORMAL, "pPtr = %s\r", pPtr);
+		strcat((char *)pPtr, "\r\n\r\nOK\r\n");
+		zCtrm_PsCallbackEntry(channel_id, pPtr, strlen((const char *)pPtr), chInd);
+		return -1;
+	}
+	return 0;
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ: zPvTest_ProReset
+* ¹¦ÄÜÃèÊö: »Ö¸´³ö³§ÉèÖÃ(ɾ³ý¶ÌÐÅ)
+* ²ÎÊý˵Ã÷: (IN)
+*                         (OUT)
+* ·µ »Ø Öµ: ÎÞ
+* ÆäËü˵Ã÷:
+**************************************************************************/
+static SINT32 zPvTest_ProReset(UINT8 channel_id, const UINT8 *buff, UINT16 buffer_len, T_zAti2_CtrmChInd chInd)
+{
+	UINT32 retCode = ZOSS_ERROR;
+	CHAR  *pStrAt   = NULL;
+	char pPtr[15] = {0};
+	if ((pStrAt = strstr((const char *)buff, "AT+ZRESET")) != 0) {
+		zOss_Printf(SUBMDL_FS, PRINT_LEVEL_NORMAL, "PVTEST zPvTest_ProReset!\n");
+		//retCode = zte_mgmt_restore_comm(FALSE, TRUE);
+		if (retCode != ZOSS_ERROR) {
+			sprintf((char *)pPtr, "\r\nOK\r\n");
+		} else {
+			sprintf((char *)pPtr, "\r\n%s\r\n", "ERROR");
+		}
+
+		zCtrm_PsCallbackEntry(channel_id, pPtr, strlen((const char *)pPtr), chInd);
+		return -1;
+	}
+	return 0;
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ: zPvTest_ProResetSms
+* ¹¦ÄÜÃèÊö: »Ö¸´³ö³§ÉèÖ㨱£Áô¶ÌÐÅ£©
+* ²ÎÊý˵Ã÷: (IN)
+*                         (OUT)
+* ·µ »Ø Öµ: ÎÞ
+* ÆäËü˵Ã÷:
+**************************************************************************/
+/*static SINT32 zPvTest_ProResetSms(UINT8 channel_id, const UINT8 *buff, UINT16 buffer_len, T_zAti2_CtrmChInd chInd)
+{
+	CHAR  *pStrAt   = NULL;
+	char pPtr[10] = {0};
+    if((pStrAt=strstr((const char *)buff,"AT+ZRESETSMS"))!=0)
+    {
+		zOss_Printf(SUBMDL_FS, PRINT_LEVEL_NORMAL,"PVTEST zPvTest_ProReset!\n");
+		zte_mgmt_restore_comm();
+		sprintf((char *)pPtr,"\r\nOK\r\n");
+    	zCtrm_PsCallbackEntry(channel_id, pPtr, strlen((const char *)pPtr), chInd);
+		return -1;
+    }
+	return 0;
+}*/
+
+/**************************************************************************
+* º¯ÊýÃû³Æ: zPvTest_ProPoweroff
+* ¹¦ÄÜÃèÊö: ¹Ø»ú
+* ²ÎÊý˵Ã÷: (IN)
+*                         (OUT)
+* ·µ »Ø Öµ: ÎÞ
+* ÆäËü˵Ã÷:
+**************************************************************************/
+static SINT32 zPvTest_ProPoweroff(UINT8 channel_id, const UINT8 *buff, UINT16 buffer_len, T_zAti2_CtrmChInd chInd)
+{
+	CHAR  *pStrAt   = NULL;
+	char pPtr[10] = {0};
+	if ((pStrAt = strstr((const char *)buff, "AT+ZPOWEROFF")) != 0) {
+		zOss_Printf(SUBMDL_FS, PRINT_LEVEL_NORMAL, "PVTEST zPvTest_ProPoweroff!\n");
+		zOss_SysPowerdown();
+		sprintf((char *)pPtr, "\r\nOK\r\n");
+		zCtrm_PsCallbackEntry(channel_id, pPtr, strlen((const char *)pPtr), chInd);
+		return -1;
+	}
+	return 0;
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ: zPvTest_ProReadNvInfo
+* ¹¦ÄÜÃèÊö: ¶ÁNV
+* ²ÎÊý˵Ã÷: (IN)
+*                         (OUT)
+* ·µ »Ø Öµ: ÎÞ
+* ÆäËü˵Ã÷:
+**************************************************************************/
+static SINT32 zPvTest_ProReadNvInfo(UINT8 channel_id, const UINT8 *buff, UINT16 buffer_len, T_zAti2_CtrmChInd chInd)
+{
+	UINT32 retCode = ZOSS_ERROR;
+	UINT8  buffNv[ZPS_CTRM_MSINFO_MAX_NVINFO_LEN + 1] = {0};
+	CHAR  *pStrAt   = NULL;
+	char pPtr[ZPS_CTRM_MSINFO_MAX_NVINFO_LEN + 30] = {0};
+	if ((pStrAt = strstr((const char *)buff, "AT+RTESTINFO")) != 0) {
+		zOss_Printf(SUBMDL_FS, PRINT_LEVEL_NORMAL, "PVTEST zPvTest_ProReadNvInfo!\n");
+
+		retCode = zPS_NvAMTItemRead(ABTESTINFO_NVPARAM, buffNv, ZPS_CTRM_MSINFO_MAX_NVINFO_LEN);
+		if (retCode != ZOSS_ERROR) {
+			sprintf((char *)pPtr, "\r\n+RTESTINFO:%s", buffNv);
+			strcat((char *)pPtr, "\r\n\r\nOK\r\n");
+		} else {
+			sprintf((char *)pPtr, "\r\n%s\r\n", "ERROR");
+		}
+		zCtrm_PsCallbackEntry(channel_id, pPtr, strlen((const char *)pPtr), chInd);
+		return -1;
+	}
+	return 0;
+}
+
+T_PvTest_At g_PvTest_Reg_At[] = {
+	{"AT+ZBATTERYLEVEL?",   zPvTest_ProGetBatteryLevel},
+	{"AT+ZRESET",   zPvTest_ProReset},
+	//{"AT+ZRESETSMS",   zPvTest_ProResetSms},
+	{"AT+RTESTINFO",   zPvTest_ProReadNvInfo},
+	{"AT+ZPOWEROFF", zPvTest_ProPoweroff}
+};
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£ºÉú²ú²âÊÔÈë¿Úº¯Êý
+************************************************************************************/
+VOID zPvTest_Entry(VOID)
+{
+	UINT32 i = 0;
+
+	for (i = 0; i < sizeof(g_PvTest_Reg_At) / sizeof(T_PvTest_At); ++ i) {
+		if (0 == zCtrm_ExtRegisterAT(g_PvTest_Reg_At[i].at, strlen(g_PvTest_Reg_At[i].at), g_PvTest_Reg_At[i].func)) {
+			zOss_Printf(SUBMDL_FS, PRINT_LEVEL_NORMAL, "PVTEST zPvTest_Entry zCtrm_ExtRegisterAT %s success!\n", g_PvTest_Reg_At[i].at);
+		}
+	}
+}
+
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_sms.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_sms.c
new file mode 100755
index 0000000..5553787
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_sms.c
@@ -0,0 +1,183 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_sms.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI¶ÌÐŵƲÙ×÷
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#include "mmi_common.h"
+#include "mmi_lcd.h"
+
+//#define SMS_IN_BOX_STATUS_NV        "sms_init_status"
+//#define SMS_IN_BOX_STATUS_UNREAD    "sms_unread"
+//#define SMS_IN_BOX_STATUS_FULL      "sms_memory_full"
+//#define SMS_IN_BOX_STATUS_NOR       "sms_normal"
+
+static SINT32 s_mmi_sms_tip_timer_status = 0;//жÌÐÅʱÐèÒªÉèÖö¨Ê±Æ÷ÈöÌÐŵÆÉÁ˸£¬Õâ¸ö±äÁ¿±ê¼Ç¶¨Ê±Æ÷״̬
+static SINT32 s_mmi_sms_new_tip_num = 0;//Õâ¸öûÓÐÓõ½ºÃÏñ£¬ÊÇ·ñÐèҪɾµô?
+static SINT32 sms_unread_number = 0;//δ¶Á¶ÌÐÅÊýÄ¿
+static E_zMmi_Sms_Recvbox_Status recvBox_state = SMS_RECVBOX_STATUS_NOR;//¼Ç¼¶ÌÐÅ״̬
+extern E_zMmiShowMode g_showMode;
+
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡¶ÌÐŵÆÐÅÏ¢±íË÷Òý
+***********************************************************************************/
+SINT32 mmi_get_smsinfo(UINT32 smsinfo)
+{
+	if (smsinfo != 0) {
+		T_zMmi_Sms_Info * pSmsInfo = (T_zMmi_Sms_Info *)smsinfo;
+		pSmsInfo->recvBox_sta = recvBox_state;
+		pSmsInfo->mSmsNum = sms_unread_number;
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_RegisterSmsTaskInfoItem()
+{
+	T_zMMITaskInfoItem smsTaskInfoItem = {0};
+	smsTaskInfoItem.task = MMI_TASK_SMS;
+	smsTaskInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMmi_Sms_Info));
+	smsTaskInfoItem.get_taskinfo_fun = mmi_get_smsinfo;
+	smsTaskInfoItem.get_ledinfo_fun = mmi_getLedSmsInfo;
+#ifndef DISABLE_LCD
+	smsTaskInfoItem.get_lcdinfo_fun = mmi_getLcdSmsInfo;
+#endif
+	smsTaskInfoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	//smsAppInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&smsTaskInfoItem);
+	return MMI_SUCCESS;
+}
+
+static VOID mmi_set_sms_update()
+{
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		mmi_set_update_flag(MMI_TASK_SMS);
+	}
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		E_zMmi_Work_Mode mode = mmi_get_led_mode();
+		if (mode != MMI_IDLE_LEDOFF_MODE && mode != MMI_IDLE_CHG_LEDOFF_MODE
+		    && mode != MMI_FAKE_POWEROFF_MODE && mode != MMI_FAKE_POWEROFF_CHARGE_MODE && mode != MMI_IDLE_STANDBY_LEDOFF_MODE) {
+			mmi_set_update_flag(MMI_TASK_SMS);
+		}
+	}
+}
+
+/************************************************************************************
+  ¶ÌÐÅÉÁ˸Ìáʾ¶¨Ê±Æ÷
+***********************************************************************************/
+static VOID * mmi_sms_tip_timer_cb(VOID *arg)
+{
+	if(recvBox_state == SMS_RECVBOX_STATUS_NEW){
+		recvBox_state = SMS_RECVBOX_STATUS_UNREAD;
+	}
+	s_mmi_sms_tip_timer_status = 0;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_sms_tip_timer_cb rec_stat:%d!!\n", recvBox_state);
+	mmi_set_sms_update();
+	return NULL;
+}
+
+static VOID mmi_sms_tip_timer_stop(VOID)
+{
+	if (s_mmi_sms_tip_timer_status == 1) {
+		sc_timer_delete(SET_SMS_TIP_TIMER);
+		s_mmi_sms_tip_timer_status = 0;
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_sms_tip_timer_stop !!\n");
+	}
+}
+
+static VOID mmi_sms_tip_timer_create(VOID)
+{
+	char mmi_new_sms_blink_flag[NV_CONTENT_LEN] = {0};
+	sc_cfg_get("mmi_new_sms_blink_flag", mmi_new_sms_blink_flag, sizeof(mmi_new_sms_blink_flag));
+	//#if MMI_NEW_SMS_BLINK_FLAG
+	if (0 == strcmp(mmi_new_sms_blink_flag, "1") && s_mmi_sms_tip_timer_status == 0) {
+		int ret = -1;
+		ret = sc_timer_create(SET_SMS_TIP_TIMER, TIMER_FLAG_ONCE, SET_SMS_TIP_TIME, &mmi_sms_tip_timer_cb, NULL);
+		if (ret != 0) {
+			slog(MMI_PRINT, SLOG_ERR, "MMI mmi_sms_tip_timer_create FAILED\n");
+		}
+		s_mmi_sms_tip_timer_status = 1;
+	}
+	//#endif
+}
+
+/************************************************************************************
+    ×¢²áµ½at_server µÄ¶ÌÐÅÊÕ¼þÏä״̬·¢Éú±ä»¯Ê±µÄ»Øµ÷º¯Êý
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_SmsBox_Sattus(VOID * data)
+{
+	SINT32 full_ind = 0;
+	SINT32 unread_ind = 0;
+	SINT32 newsms_ind = 0;
+	SINT32 is_reading = 0;
+	SINT32 unread_count = 0;
+	if (data == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI svr_handle_msg_smsbox_status NULL message!!!");
+		return MMI_ERROR;
+	}
+	full_ind = ((T_zUfi_SmsStatusInfoInd*)data) ->sms_memory_full_ind;
+	unread_ind = ((T_zUfi_SmsStatusInfoInd*)data) ->sms_unread_ind;
+	newsms_ind = ((T_zUfi_SmsStatusInfoInd*)data) ->sms_new_ind;
+	is_reading = ((T_zUfi_SmsStatusInfoInd*)data) ->sms_is_reading;
+	unread_count = ((T_zUfi_SmsStatusInfoInd*)data) ->sms_unread_count;
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI svr_handle_msg_smsbox_status full=%d  unread=%d,newsms_ind = %d,is_reading =%d,unread_count = %d !!!\n", full_ind, unread_ind, newsms_ind, is_reading, unread_count);
+	sms_unread_number = unread_count;
+	if (unread_ind == 1) {
+		recvBox_state = SMS_RECVBOX_STATUS_UNREAD;
+	}
+	if (newsms_ind == 1) {
+		recvBox_state = SMS_RECVBOX_STATUS_NEW;
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI svr_handle_msg_smsbox_status newsms_ind == 1 s_mmi_sms_tip_timer_status = %d\n", s_mmi_sms_tip_timer_status);
+		mmi_sms_tip_timer_create();
+	}
+	if (full_ind == 1) {
+		recvBox_state = SMS_RECVBOX_STATUS_FULL;
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI svr_handle_msg_smsbox_status full_ind == 1!!!\n");
+	}
+	if (is_reading == 1) {
+		mmi_sms_tip_timer_stop();
+		if (unread_ind == 0 && full_ind == 0 && newsms_ind == 0) {
+			recvBox_state = SMS_RECVBOX_STATUS_NOR;
+		}
+	}
+	if (is_reading == 0 && unread_ind == 0 && full_ind == 0 && newsms_ind == 0) {
+		mmi_sms_tip_timer_stop();
+		recvBox_state = SMS_RECVBOX_STATUS_NOR;
+	}
+	mmi_set_sms_update();
+	return MMI_SUCCESS;
+}
+
+/************************************************************************************
+                    ³õʼ»¯¶ÌÐŵÆ
+***********************************************************************************/
+VOID mmi_sms_init(VOID)
+{
+	char smsinboxstatus[16] = {0};
+	char smsUnreadNumber[16] = {0};
+
+	sc_cfg_get(NV_SMS_INIT_STATUS, smsinboxstatus, sizeof(smsinboxstatus));
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI sms_led_init smsinboxstatus=%s!!!\n", smsinboxstatus);
+
+	if (!(strncmp(smsinboxstatus, SMS_IN_BOX_STATUS_FULL, strlen(SMS_IN_BOX_STATUS_FULL)))) {
+		recvBox_state = SMS_RECVBOX_STATUS_FULL;
+	} else if (!(strncmp(smsinboxstatus, SMS_IN_BOX_STATUS_UNREAD, strlen(SMS_IN_BOX_STATUS_UNREAD)))) {
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI sms_led_init smsinboxstatus == SMS_IN_BOX_STATUS_UNREAD!!!\n");
+		recvBox_state = SMS_RECVBOX_STATUS_UNREAD;
+		sc_cfg_get(SMS_UNREAD_COUNT_NV, smsUnreadNumber, sizeof(smsUnreadNumber));
+		sms_unread_number = atoi(smsUnreadNumber);
+	} else {
+		recvBox_state = SMS_RECVBOX_STATUS_NOR;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI sms_led_init sms_unread_number = %d !!!\n", sms_unread_number);
+	mmi_set_sms_update();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI sms_led_init finish!!!\n");
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_time.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_time.c
new file mode 100755
index 0000000..21c6401
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_time.c
@@ -0,0 +1,71 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_time.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI»ñȡʱ¼äÐÅÏ¢
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2015-2-3
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+#include "mmi_lcd.h"
+
+static BOOL s_mmi_time_mode = TRUE;
+
+static char s_mmi_hour[4] = {0};
+static char s_mmi_minute[4] = {0};
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñȡʱ¼äÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_get_timeTrafficinfo(UINT32 timeinfo)
+{
+	if (timeinfo != 0) {
+		T_zMMITimeInfo * pTimeInfo = (T_zMMITimeInfo *)timeinfo;
+		pTimeInfo->mode = s_mmi_time_mode;
+		pTimeInfo->hour = s_mmi_hour;
+		pTimeInfo->minute = s_mmi_minute;
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_RegisterTimeTaskInfoItem(VOID)
+{
+	T_zMMITaskInfoItem timeTaskInfoItem = {0};
+
+	timeTaskInfoItem.task = MMI_TASK_TIME;
+	timeTaskInfoItem.taskinfo = malloc(sizeof(T_zMMITimeInfo));
+	timeTaskInfoItem.get_taskinfo_fun = mmi_get_timeTrafficinfo;
+	timeTaskInfoItem.get_lcdinfo_fun = mmi_getLcdTimeInfo;
+	//timeAppInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&timeTaskInfoItem);
+	return MMI_SUCCESS;
+}
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ʱ¼ä¼à²â¶¨Ê±Æ÷ 1S
+***********************************************************************************/
+
+static VOID * mmi_time_check_timer_cb(VOID *arg)
+{
+	sc_cfg_get(HOUR_NV, s_mmi_hour, 4);
+	sc_cfg_get(MINUTE_NV, s_mmi_minute, 4);
+	mmi_set_update_flag(MMI_TASK_TIME);
+}
+
+static VOID mmi_time_check_timer_create(VOID)
+{
+	int ret = -1;
+	ret = sc_timer_create(SET_TIME_CHECK_TIMER, TIMER_FLAG_RESTART, SET_TIME_CHECK_TIME, &mmi_time_check_timer_cb, NULL);
+	if (ret != 0) {
+		slog(MMI_PRINT, SLOG_ERR, " MMI mmi_time_check_timer_create FAILED!!\n");
+	}
+}
+
+
+VOID mmi_init_time()
+{
+	mmi_time_check_timer_create();
+}
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_tip.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_tip.c
new file mode 100755
index 0000000..3622032
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_tip.c
@@ -0,0 +1,536 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_lcd_tip.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI»ñÈ¡ÌáʾÐÅÏ¢
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#include <limits.h>
+#include "mmi_common.h"
+
+static BOOL gMultiSSIDSwitchFlag = FALSE;//±ê¼ÇwebuiÊÇ·ñÉèÖÃÁ˶àSSID
+
+static SINT32 s_mmi_ssid_show_timer_status = 0;//ssid¹ö¶¯ÏÔʾʱÓõ½µÄ¶¨Ê±Æ÷״̬±ê¼Ç
+E_zMmi_Sim_Tip s_mmi_sim_tip = SIM_MAX;//sim¿¨×´Ì¬
+static E_zMmi_Sim_Tip s_mmi_sim_tipEx = SIM_MAX;//ÿs²éѯʱ£¬±£´æsim¿¨ÉÏÒ»´ÎµÄ״̬
+static E_zMmi_NetCon_Tip s_mmi_netcon_tip = NET_MAX;//ÍøÂçÁ¬½Ó×°Ì×
+//static E_zMmi_WpsAct_Tip s_mmi_wpsact_tip = WPS_ACTIVE_MAX;
+static CHAR s_mmi_net_pro [64] = {0};//±£´æÍøÂçÔËÓªÉÌÐÅÏ¢
+static CHAR s_mmi_ssid [36] = {"--"};//±£´æÖ÷ssid
+static CHAR s_mmi_wifikey [64] = {"--"};//±£´æÖ÷wifikey
+static CHAR s_mmi_ssid2 [36] = {"--"};//±£´æ¸±ssid
+static CHAR s_mmi_wifikey2 [64] = {"--"};//±£´æ¸±wifikey
+static CHAR s_mmi_msisdn[16] = {"--"};//ÊÇ·ñɾµô?
+static CHAR s_mmi_pci[8] = {"__"};
+static CHAR s_mmi_rapr_dBm[16] = {"--"};
+static CHAR s_mmi_sinr_dB[12] = {"--"};
+static CHAR s_mmi_acess_duration[16] = {"--"};
+static CHAR s_mmi_current_uasge[8] = {"--"};
+static CHAR s_mmi_update_result[16] = {0};
+static SINT32 s_mmi_update_tip = 0;
+static SINT32 s_mmi_update_tipEx = 0;
+extern E_zMmiShowMode g_showMode;
+//static SINT32 i_mmi_check_fota_result_times = 120;
+//static SINT32 i_mmi_show_fota_result_times = 10;
+//static BOOL b_mmi_show_fota_result = FALSE;
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡SIM¿¨×´Ì¬ÐÅÏ¢
+***********************************************************************************/
+E_zMmi_Sim_Tip mmi_getSIMStateInfo(VOID)
+{
+	return s_mmi_sim_tip;
+}
+
+E_zMmi_NetCon_Tip mmi_getNetConInfo(VOID)
+{
+	return s_mmi_netcon_tip;
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡ÌáʾÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_get_tipinfo(UINT32 tipinfo)
+{
+	if (tipinfo != 0) {
+		T_zMMITipInfo * pTipInfo = (T_zMMITipInfo *)tipinfo;
+		pTipInfo->sim_tip = s_mmi_sim_tip;
+		pTipInfo->net_tip = s_mmi_netcon_tip;
+		pTipInfo->net_pro = s_mmi_net_pro;
+		//pTipInfo->update_tip = s_mmi_update_tip;
+		//pTipInfo->update_result = s_mmi_update_result;
+	}
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:×¢²áÌáʾģ¿é
+***********************************************************************************/
+SINT32 mmi_RegisterTipTaskInfoItem()
+{
+	T_zMMITaskInfoItem tipInfoItem = {0};
+	tipInfoItem.task = MMI_TASK_TIP;
+	tipInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMITipInfo));
+	tipInfoItem.get_taskinfo_fun = mmi_get_tipinfo;
+#ifndef DISABLE_LCD
+	tipInfoItem.get_lcdinfo_fun = mmi_getLcdTipInfo;
+#endif
+	//tipInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&tipInfoItem);
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:×¢²áÌáʾģ¿é
+***********************************************************************************/
+SINT32 mmi_RegisterTipNetConnectTaskInfoItem()
+{
+	T_zMMITaskInfoItem tipInfoItem = {0};
+	tipInfoItem.task = MMI_TASK_TIP_NET_CONNECT;
+	tipInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMITipInfo));
+	tipInfoItem.get_taskinfo_fun = mmi_get_tipinfo;
+#ifndef DISABLE_LCD
+	tipInfoItem.get_lcdinfo_fun = mmi_getLcdTipNetConnInfo;
+#endif
+	//tipInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&tipInfoItem);
+	return MMI_SUCCESS;
+}
+#if 0
+/**********************************************************************************
+º¯Êý×÷ÓÃ:×¢²áFOTA Éý¼¶Ìáʾģ¿é
+***********************************************************************************/
+SINT32 mmi_RegisterTipFotaTaskInfoItem()
+{
+	T_zMMITaskInfoItem tipInfoItem = {0};
+	tipInfoItem.flag = MMI_TASK_TIP_FOTA;
+	tipInfoItem.taskinfo = malloc(sizeof(T_zMMITipInfo));
+	tipInfoItem.get_taskinfo_fun = mmi_get_tipinfo;
+	tipInfoItem.get_lcdinfo_fun = mmi_getLcdTipFotaInfo;
+	tipInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&tipInfoItem);
+	return MMI_SUCCESS;
+}
+#endif
+/**********************************************************************************
+º¯Êý×÷ÓÃ:×¢²á/»ñÈ¡SSID/WIFIKEY
+***********************************************************************************/
+SINT32 mmi_get_ssidinfo(UINT32 ssidinfo)
+{
+	if (ssidinfo != 0) {
+		T_zMMISSIDInfo * pSSIDInfo = (T_zMMISSIDInfo *)ssidinfo;
+		pSSIDInfo->ssid = s_mmi_ssid;
+		pSSIDInfo->wifi_key = s_mmi_wifikey;
+		pSSIDInfo->ssid2 = s_mmi_ssid2;
+		pSSIDInfo->wifi_key2 = s_mmi_wifikey2;
+	}
+	return MMI_SUCCESS;
+}
+SINT32 mmi_RegisterSSIDInfoTaskInfoItem()
+{
+	T_zMMITaskInfoItem ssidInfoItem = {0};
+	ssidInfoItem.task = MMI_TASK_SSID;
+	ssidInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMISSIDInfo));
+	ssidInfoItem.get_taskinfo_fun = mmi_get_ssidinfo;
+#ifndef DISABLE_LCD
+	ssidInfoItem.get_lcdinfo_fun = mmi_getLcdSSIDKeyInfo;
+#endif
+	//ssidInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&ssidInfoItem);
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡ÍøÂçÐźÅÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_get_netsignalinfo(UINT32 netsiginfo)
+{
+	if (netsiginfo != 0) {
+		T_zMMINetSignalInfo * pNetSigInfo = (T_zMMINetSignalInfo *)netsiginfo;
+		pNetSigInfo->msisdn = s_mmi_msisdn;
+		pNetSigInfo->pci = s_mmi_pci;
+		pNetSigInfo->rapr_dBm = s_mmi_rapr_dBm;
+		pNetSigInfo->sinr_dB = s_mmi_sinr_dB;
+	}
+	return MMI_SUCCESS;
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡ÔËÓªÉÌÃû³Æ
+***********************************************************************************/
+static VOID mmi_get_network_provider(VOID)
+{
+	char nv_net_pro [64] = {0};
+	sc_cfg_get(NV_NETWORK_PROVIDER, nv_net_pro, 64);
+	if (strlen(nv_net_pro) == 0) {
+		strcpy(s_mmi_net_pro, "UnKnown");
+	} else {
+		if (!strcasecmp(nv_net_pro, NV_NET_PROVIDER_CMCC)) {
+			strcpy(s_mmi_net_pro, "CMCC");
+		} else if (!strcasecmp(nv_net_pro, NV_NET_PROVIDER_CUCC)) {
+			strcpy(s_mmi_net_pro, "CUCC");
+		} else if (!strcasecmp(nv_net_pro, NV_NET_PROVIDER_CTCC)) {
+			strcpy(s_mmi_net_pro, "CTCC");
+		} else if (!strcasecmp(nv_net_pro, NV_NET_BOLT_4G_1) || !strcasecmp(nv_net_pro, NV_NET_BOLT_4G_2) || !strcasecmp(nv_net_pro, NV_NET_BOLT_4G_3) || !strcasecmp(nv_net_pro, NV_NET_BOLT_4G_4) || !strcasecmp(nv_net_pro, NV_NET_BOLT_4G_5)) {
+			strcpy(s_mmi_net_pro, "BOLT! SUPER 4G");
+		} else {
+			strcpy(s_mmi_net_pro, nv_net_pro);
+		}
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_network_provider s_mmi_net_pro_tip = %s!!\n", s_mmi_net_pro);
+}
+
+VOID mmi_update_netprovider(VOID)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_update_netprovider !!!\n");
+	mmi_get_network_provider();
+	mmi_set_update_flag(MMI_TASK_TIP);
+}
+
+VOID mmi_update_net_connect_tip(SINT32 con_state, E_zMmi_Net_Mode net_mode)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_update_net_connect_tip con_state = %d, net_mod = %d !!\n", con_state, net_mode);
+	if (net_mode == NET_MODE_NOSERVICE) {
+		s_mmi_netcon_tip = NET_NOSERVICE;
+		mmi_set_update_flag(MMI_TASK_TIP_NET_CONNECT);
+	} else if (net_mode == NET_MODE_LIMITSERVICE) {
+		s_mmi_netcon_tip = NET_LIMITSERVICE;
+		mmi_set_update_flag(MMI_TASK_TIP_NET_CONNECT);
+	} else {
+		s_mmi_netcon_tip = (E_zMmi_NetCon_Tip)con_state;
+		if (s_mmi_netcon_tip != NET_DISCONNECTED && s_mmi_netcon_tip != NET_CONNECTED) {
+			mmi_set_update_flag(MMI_TASK_TIP_NET_CONNECT);
+		}
+	}
+}
+
+VOID mmi_update_net_tip(SINT32 con_state, E_zMmi_Net_Mode net_mode)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_update_net_tip !!!\n");
+	mmi_update_net_connect_tip(con_state, net_mode);
+	mmi_update_netprovider();
+}
+SINT32 zMMI_Handle_Msg_Get_Provider(VOID *data)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI svr_Handle_Msg_Get_Provider !!!\n");
+	mmi_update_netprovider();
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:´¦Àí»Øµ÷º¯ÊýÖз¢¸ø×Ô¼ºµÄÏûÏ¢
+***********************************************************************************/
+VOID zMMI_Handle_Msg_Get_Connecting_Tip(VOID *arg)
+{
+	SINT32 tip_conntent = 0;
+	tip_conntent  = *(SINT32*)arg;
+	s_mmi_netcon_tip = (E_zMmi_NetCon_Tip)tip_conntent;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI zMMI_Handle_Msg_Get_Connecting_Tip s_mmi_netcon_tip = %d!!!\n", s_mmi_netcon_tip);
+
+	if (s_mmi_netcon_tip != NET_DISCONNECTED && s_mmi_netcon_tip != NET_CONNECTED) {
+		mmi_set_update_flag(MMI_TASK_TIP_NET_CONNECT);
+	} else {
+		if (s_mmi_netcon_tip == NET_CONNECTED) {
+			mmi_get_network_provider();
+		}
+		mmi_set_update_flag(MMI_TASK_TIP);
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:SIM¿¨×´Ì¬¼à²â¶¨Ê±Æ÷»Øµ÷
+***********************************************************************************/
+static VOID mmi_check_sim_state(VOID)
+{
+	char nv_sim_state[32] = {0};
+	static BOOL run_once = FALSE;
+	sc_cfg_get(NV_MODEM_MAIN_STATE, nv_sim_state, 32);
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_check_sim_state nv_sim_state = %s,s_mmi_sim_tipEx = %d !!\n", nv_sim_state, s_mmi_sim_tipEx);
+	if (!strcmp(nv_sim_state, NV_SIM_STATE_PUK_WATIT)) {
+		s_mmi_sim_tip = PUK_LOCK;
+	} else if (!strcmp(nv_sim_state, NV_SIM_STATE_PIN_WATIT)) {
+		s_mmi_sim_tip = PIN_LOCK;
+	} else if (!strcmp(nv_sim_state, NV_SIM_STATE_UNDETECTED)) {
+		s_mmi_sim_tip = INSERT_SIM;
+	} else if (!strcmp(nv_sim_state, NV_SIM_STATE_NCK_WAIT)) {
+		s_mmi_sim_tip = SIM_LOCK;
+	} else if (!strcmp(nv_sim_state, NV_SIM_STATE_DESTROY)) {
+		s_mmi_sim_tip = INVALID_SIM;
+	} else {
+		s_mmi_sim_tip = SIM_MAX;
+	}
+
+	if ((!strcmp(nv_sim_state, NV_SIM_STATE_INIT_COMPLETE) || !strcmp(nv_sim_state, NV_SIM_STATE_INIT_EXCPTION))) {
+		if (!run_once) {
+			s_mmi_netcon_tip = NET_SEARCHING;
+			mmi_set_update_flag(MMI_TASK_TIP_NET_CONNECT);
+			run_once = TRUE;
+		}
+	}
+	if (s_mmi_sim_tip != s_mmi_sim_tipEx) {
+		if (s_mmi_sim_tip == SIM_MAX) {
+			mmi_set_update_flag(MMI_TASK_TIP_NET_CONNECT);
+		} else if (s_mmi_sim_tip == INSERT_SIM) {
+			mmi_clean_net_state();
+		}
+		mmi_set_update_flag(MMI_TASK_TIP);
+		s_mmi_sim_tipEx = s_mmi_sim_tip;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_check_sim_state s_mmi_sim_tip = %d,s_mmi_sim_tipEx = %d !!\n", s_mmi_sim_tip, s_mmi_sim_tipEx);
+}
+
+#if 0
+static VOID mmi_check_lte_sinr(VOID)
+{
+	CHAR sinr_nv[12] = {0};
+	sc_cfg_get(NV_SINR, sinr_nv, 12);
+	if (sinr_nv != NULL && strlen(sinr_nv) > 0) {
+		memset(s_mmi_sinr_dB, 0, sizeof(s_mmi_sinr_dB));
+		snprintf(s_mmi_sinr_dB, 9, "%sdB", sinr_nv);
+	} else {
+		strcpy(s_mmi_sinr_dB, INVALID_STR);
+	}
+	//slog(MMI_PRINT,SLOG_DEBUG,"MMI mmi_check_lte_sinr s_mmi_sinr_dB  %s!!!\n",s_mmi_sinr_dB);
+	mmi_set_update_flag(MMI_CONTENT_FLAG_SIGNAL_INFO);
+}
+static VOID mmi_check_lte_pci(VOID)
+{
+	CHAR pci_nv[8] = {0};
+	sc_cfg_get(NV_PCI, pci_nv, 8);
+	if (pci_nv != NULL) {
+		strncpy(s_mmi_pci, pci_nv, 8);
+	} else {
+		strcpy(s_mmi_pci, INVALID_STR);
+	}
+	//slog(MMI_PRINT,SLOG_DEBUG,"MMI mmi_check_lte_pci s_mmi_pci  %s!!!\n",s_mmi_pci);
+	mmi_set_update_flag(MMI_CONTENT_FLAG_SIGNAL_INFO);
+}
+#endif
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¼à²â¶¨Ê±Æ÷»Øµ÷
+***********************************************************************************/
+static VOID * mmi_tip_check_timer_cb(VOID *arg)
+{
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_MMI, (USHORT)MSG_CMD_MMICHECK_TIP_INFO, 0, NULL, 0);
+	return NULL;
+}
+
+SINT32 zMMI_Handle_Msg_Check_Tip_Info(VOID *data)
+{
+	mmi_check_sim_state();
+	mmi_check_new_version_state();
+	//mmi_check_lte_sinr();
+	//mmi_check_lte_pci();
+	mmi_check_fota_upgrade_result();
+	mmi_check_fota_download_state();
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:SIM¿¨×´Ì¬¼à²â¶¨Ê±Æ÷ 1S
+***********************************************************************************/
+static VOID mmi_tip_check_timer_create(VOID)
+{
+	int ret = -1;
+	ret = sc_timer_create(SET_TIP_CHECK_TIMER, TIMER_FLAG_RESTART, SET_TIP_CHECK_TIME, &mmi_tip_check_timer_cb, NULL);
+	if (ret != 0) {
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_tip_check_timer_create FAILED !!");
+	}
+}
+
+static VOID mmi_tip_check_timer_stop(VOID)
+{
+	sc_timer_delete(SET_TIP_CHECK_TIMER);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡¸±WIFIKEY
+***********************************************************************************/
+static VOID mmi_get_multi_wifikey(VOID)
+{
+	char nv_multi_authmode[16] = {0};
+	char nv_multi_encryp_type[16] = {0};
+	char nv_multi_key[2] = {0};
+	SINT32 key_multi_index = -1;
+	char m_keystr[16] = {0};
+	sc_cfg_get("m_AuthMode", nv_multi_authmode, sizeof(nv_multi_authmode));
+	sc_cfg_get("m_EncrypType", nv_multi_encryp_type, sizeof(nv_multi_encryp_type));
+
+	if (((!strcmp("WEP", nv_multi_encryp_type)) && (!strcmp("OPEN", nv_multi_authmode))) || (!strcmp("SHARED", nv_multi_authmode)) || (!strcmp("WEPAUTO", nv_multi_authmode))) { //WEP
+		sc_cfg_get("m_DefaultKeyID", nv_multi_key, sizeof(nv_multi_key));
+		key_multi_index = atoi(nv_multi_key); //kw 3
+		if(key_multi_index < 0 || key_multi_index > INT_MAX-1) {// 0~3
+			slog(MMI_PRINT, SLOG_ERR, "MMI mmi_get_multi_wifikey %d!!\n", key_multi_index);
+			key_multi_index = 0;
+		}
+		key_multi_index = key_multi_index + 1;
+		snprintf(m_keystr, sizeof(m_keystr), "m_Key%dStr1", key_multi_index);//klocwork
+		sc_cfg_get(m_keystr, s_mmi_wifikey2, sizeof(s_mmi_wifikey2));
+	} else if (!strcmp("NONE", nv_multi_encryp_type) && !strcmp("OPEN", nv_multi_authmode)) {
+		strcpy(s_mmi_wifikey2, "");
+	} else {
+		sc_cfg_get(NV_WIFIKEY2, s_mmi_wifikey2, sizeof(s_mmi_wifikey2));
+	}
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡Ö÷WIFIKEY
+***********************************************************************************/
+static VOID mmi_get_main_wifikey(VOID)
+{
+	char nv_authmode[16] = {0};
+	char nv_encryp_type[16] = {0};
+	char nv_key[2] = {0};
+	SINT32 key_index = -1;
+	char keystr[16] = {0};
+	sc_cfg_get("AuthMode", nv_authmode, sizeof(nv_authmode));
+	sc_cfg_get("EncrypType", nv_encryp_type, sizeof(nv_encryp_type));
+
+	if (((!strcmp("WEP", nv_encryp_type)) && (!strcmp("OPEN", nv_authmode))) || (!strcmp("SHARED", nv_authmode)) || (!strcmp("WEPAUTO", nv_authmode))) { //WEP
+		sc_cfg_get("DefaultKeyID", nv_key, sizeof(nv_key));
+		key_index = atoi(nv_key); //kw 3
+		if(key_index < 0 || key_index > INT_MAX-1) {// 0~3
+			slog(MMI_PRINT, SLOG_ERR, "MMI mmi_get_main_wifikey %d!!\n", key_index);
+			key_index = 0;
+		}
+		key_index = key_index + 1;
+		snprintf(keystr, sizeof(keystr), "Key%dStr1", key_index);//klocwork
+		sc_cfg_get(keystr, s_mmi_wifikey, sizeof(s_mmi_wifikey));
+	} else if (!strcmp("NONE", nv_encryp_type) && !strcmp("OPEN", nv_authmode)) {
+		strcpy(s_mmi_wifikey, "");
+	} else {
+		sc_cfg_get(NV_WPAPSK1, s_mmi_wifikey, sizeof(s_mmi_wifikey));
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡SSID
+***********************************************************************************/
+static VOID mmi_get_ssid_wifikey(VOID)
+{
+	char nv_multi_ssid_switch[2] = {0};
+	char nv_ssid_write_flag[2] = {0};
+	sc_cfg_get(NV_SSID_WRITE_FLAG, nv_ssid_write_flag, sizeof(nv_ssid_write_flag));
+	if (!strcmp(nv_ssid_write_flag, "1")) {
+		sc_cfg_get(NV_SSID1, s_mmi_ssid, sizeof(s_mmi_ssid));
+		mmi_get_main_wifikey();
+	} else {
+		strcpy(s_mmi_ssid, "--");
+		strcpy(s_mmi_wifikey, "--");
+	}
+	sc_cfg_get(NV_MULTI_SSID_SWITCH, nv_multi_ssid_switch, sizeof(nv_multi_ssid_switch));
+	if (!strcmp(nv_multi_ssid_switch, "1")) {
+		gMultiSSIDSwitchFlag = TRUE;
+		sc_cfg_get(NV_SSID2, s_mmi_ssid2, sizeof(s_mmi_ssid2));
+		mmi_get_multi_wifikey();
+	} else {
+		gMultiSSIDSwitchFlag = FALSE;
+	}
+
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_ssid_wifikey s_mmi_ssid = %s s_mmi_wifikey= %s s_multi_mmi_ssid = %s s_multi_mmi_wifikey= %s!!\n",
+	     s_mmi_ssid, s_mmi_wifikey, s_mmi_ssid2, s_mmi_wifikey2);
+}
+
+BOOL mmi_get_multi_ssid_switch_flag(VOID)
+{
+	return gMultiSSIDSwitchFlag;
+}
+
+SINT32 zMMI_Handle_Msg_Get_SSID_Key(VOID *data)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI zMMI_Handle_Msg_Get_SSID_Key !!\n");
+	mmi_get_ssid_wifikey();
+#ifndef DISABLE_LCD
+	if (!mmi_get_multi_ssid_switch_flag()) {
+		mmi_set_lcd_page_index(MMI_SHOW_PAGE_SECOND);
+	}
+#endif
+	mmi_set_update_flag(MMI_TASK_SSID);
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:SSID&WIFIKEYÏÔʾʱ¼ä¶¨Ê±Æ÷£¬Ê±¼ä20Ã룬һ´ÎÐÔ¶¨Ê±Æ÷
+***********************************************************************************/
+static VOID * mmi_ssid_show_timer_cb(VOID *arg)
+{
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_MMI, (USHORT)MSG_CMD_MMISHOW_SSID_INFO, 0, NULL, 0);
+	return NULL;
+}
+
+SINT32 zMMI_Handle_Msg_SSID_Show_Info(VOID *data)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_ssid_show_timer_cb !!\n");
+	s_mmi_ssid_show_timer_status = 0;
+#ifndef DISABLE_LCD
+	mmi_set_lcd_page_index(MMI_SHOW_PAGE_FIRST);
+#endif
+	mmi_set_update_flag(MMI_TASK_TRAFFIC);
+	return 0;
+}
+
+BOOL mmi_getSSIDFirstShowInfo(VOID)
+{
+	return s_mmi_ssid_show_timer_status ;
+}
+
+static VOID mmi_ssid_show_timer_create(VOID)
+{
+	if (s_mmi_ssid_show_timer_status == 0) {
+		int ret = -1;
+		ret = sc_timer_create(SET_SSID_SHOW_TIMER, TIMER_FLAG_ONCE, SET_SSID_SHOW_TIME, &mmi_ssid_show_timer_cb, NULL);
+		if (ret != 0) {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_ssid_show_timer_create FAILED !!");
+		}
+		s_mmi_ssid_show_timer_status = 1;
+	}
+}
+VOID mmi_ssid_show_timer_stop(VOID)
+{
+	if (s_mmi_ssid_show_timer_status == 1) {
+		sc_timer_delete(SET_SSID_SHOW_TIMER);
+		s_mmi_ssid_show_timer_status = 0;
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_ssid_show_timer_stop !!\n");
+	}
+}
+static VOID mmi_show_ssid_poweron()
+{
+	mmi_get_ssid_wifikey();
+	mmi_set_update_flag(MMI_TASK_SSID);
+#ifndef DISABLE_LCD
+	mmi_set_lcd_page_index(MMI_SHOW_PAGE_SECOND);
+#endif
+	mmi_ssid_show_timer_create();
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:MMI SIM¼ì²â¶¨Ê±Æ÷KILL£¬  ¹Ø»úºÍÖØÆôʱµ÷ÓÃ
+***********************************************************************************/
+VOID mmi_kill_tip_timer(VOID)
+{
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		mmi_tip_check_timer_stop();
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:³õʼ»¯Ìáʾģ¿é
+***********************************************************************************/
+VOID mmi_init_lcd_tip(VOID)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_init_lcd_tip !!!\n");
+	mmi_check_sim_state();
+	mmi_show_ssid_poweron();
+	mmi_get_network_provider();
+	mmi_tip_check_timer_create();
+}
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_traffic.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_traffic.c
new file mode 100755
index 0000000..5e6d93e
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_traffic.c
@@ -0,0 +1,437 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_traffic_led.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMIÁ÷Á¿µÆ²Ù×÷
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#include <limits.h>
+#include <float.h>
+#include "mmi_common.h"
+
+/**********************************************************************************
+						È«¾Ö±äÁ¿
+***********************************************************************************/
+static MMI_TRAFFIC_SWITCH s_mmi_traffic_switch = TRAFFIC_LIMIT_SWITCH_OFF;//±ê¼ÇwebuiÊÇ·ñÆôÓÃÁ÷Á¿
+
+static MMI_TRAFFIC_LED s_mmi_t_status = TRAFFIC_LED_MAX;
+static MMI_TRAFFIC_LED s_mmi_t_status_ex = TRAFFIC_LED_MAX;
+
+static SINT32 s_low_traffic_flag = 0;//±ê¼ÇÁ÷Á¿ÊDz»Êdz¬µÍ
+static SINT32 s_warning_tip_flag = 0;
+static UINT32 s_warning_tip_level = 100;//lcd֮ǰҪÏÔʾÁ÷Á¿¸æ¾¯µÄºìÏß
+static float s_mmi_total_traffic = 0;//×ÜÁ÷Á¿
+static float s_mmi_used_traffic = 0;//ÒÑʹÓÃÁ÷Á¿
+static E_ZMmi_Traffic_Data_Unit s_mmi_data_unit = TRAFFIC_DATA_UNIT_MAX;//Á÷Á¿ÒÔÊý¾ÝÏÔʾʱµÄµ¥Î»
+static E_ZMmi_Traffic_Data_Unit s_mmi_useddata_unit = TRAFFIC_DATA_UNIT_MAX;//ÒÑʹÓÃÁ÷Á¿ÒÔÊý¾ÝÏÔʾʱµÄµ¥Î»
+static MMI_TRAFFIC_UNIT s_mmi_traffic_unit = TRAFFIC_UNIT_MAX;//±ê¼ÇÁ÷Á¿ÊÇÒÔÁ÷Á¿»¹ÊÇʱ¼äÀ´ÏÔʾ
+extern E_zMmiShowMode g_showMode;
+
+SINT32 mmi_get_trafficinfo(UINT32 trafficinfo)
+{
+	if (trafficinfo != 0) {
+		T_zMMITrafficInfo * pTrafficInfo = (T_zMMITrafficInfo *)trafficinfo;
+		pTrafficInfo->led_status = s_mmi_t_status;
+		pTrafficInfo->traffic_switch = s_mmi_traffic_switch;
+		pTrafficInfo->traffic_unit = s_mmi_traffic_unit;
+		pTrafficInfo->warning_tip_flag = s_warning_tip_flag;
+		pTrafficInfo->warning_tip_level = s_warning_tip_level;
+		pTrafficInfo->total_traffic = s_mmi_total_traffic;
+		pTrafficInfo->uesd_traffic = s_mmi_used_traffic;
+		pTrafficInfo->data_unit = s_mmi_data_unit;
+		pTrafficInfo->useddata_unit = s_mmi_useddata_unit;
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_trafficinfo total = %f  used = %f!\n", pTrafficInfo->total_traffic, pTrafficInfo->uesd_traffic);
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_RegisterTrafficTaskInfoItem()
+{
+	T_zMMITaskInfoItem trafficTaskInfoItem = {0};
+	trafficTaskInfoItem.task = MMI_TASK_TRAFFIC;
+	trafficTaskInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMITrafficInfo));
+	trafficTaskInfoItem.get_taskinfo_fun = mmi_get_trafficinfo;
+	trafficTaskInfoItem.get_ledinfo_fun = mmi_getLedTrafficInfo;
+#ifndef DISABLE_LCD
+	trafficTaskInfoItem.get_lcdinfo_fun = mmi_getLcdTrafficInfo;
+#endif
+	trafficTaskInfoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	//trafficAppInfoItem.show_mode = 2;
+
+	mmi_register_taskinfo_item(&trafficTaskInfoItem);
+	return MMI_SUCCESS;
+}
+
+static VOID mmi_set_traffic_update()
+{
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		mmi_set_update_flag(MMI_TASK_TRAFFIC);
+	}
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		E_zMmi_Work_Mode mode = mmi_get_led_mode();
+		if (mode != MMI_RESET_MODE && mode != MMI_RESTART_MODE && mode != MMI_POWEROFF_MODE && mode != MMI_IDLE_LEDOFF_MODE && mode != MMI_IDLE_CHG_LEDOFF_MODE
+		    && mode != MMI_FAKE_POWEROFF_MODE && mode != MMI_FAKE_POWEROFF_CHARGE_MODE && mode != MMI_IDLE_STANDBY_LEDOFF_MODE) {
+			mmi_set_update_flag(MMI_TASK_TRAFFIC);
+		}
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¸ù¾ÝÒÑʹÓÃÁ÷Á¿Åжϵ±Ç°Á÷Á¿×´Ì¬
+***********************************************************************************/
+static VOID mmi_judge_traffic_status(UINT32 t_traffic, UINT32 u_traffic)
+{
+	SINT32 leaved_traffic = 0;
+	UINT32 i = 0;
+	if (u_traffic == 0) {
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_judge_traffic_status  u_traffic is too small!\n");
+		s_mmi_t_status = (MMI_TRAFFIC_LED)9;
+		return;
+	}
+	leaved_traffic = t_traffic - u_traffic;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_judge_traffic_status  leaved_traffic = %d !\n", leaved_traffic);
+	if (leaved_traffic <= 0) {
+		s_mmi_t_status = (MMI_TRAFFIC_LED)0;
+		return;
+	}
+
+	leaved_traffic = leaved_traffic * 10;
+	for (i = 0; i < 10; i++) {
+#if MMI_DEBUG
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_judge_traffic_status i = %d   t_traffic * i=%d t_traffic* (i+1)=%d!\n", i, t_traffic * i, t_traffic * (i + 1));
+#endif
+		if (((UINT32)leaved_traffic > t_traffic * i) && ((UINT32)leaved_traffic <= t_traffic * (i + 1))) {
+			s_mmi_t_status = (MMI_TRAFFIC_LED)i;
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_judge_traffic_status s_mmi_t_status = %d!\n", s_mmi_t_status);
+			return;
+		}
+	}
+	//²»·ûºÏÉÏÃæÈκÎÒ»ÖÖÇé¿ö£¬×Ô¼º¸øs_mmi_t_status¸³Ò»¸öÖµ£¬·ÀÖ¹ÖµÎÞЧµ¼ÖÂÁ÷Á¿µÆ²»ÁÁ
+	s_mmi_t_status = (MMI_TRAFFIC_LED)9;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_judge_traffic_status invalid s_mmi_t_status !\n");
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡Á÷Á¿¼à²â¿ª¹Ø×´Ì¬
+***********************************************************************************/
+static VOID mmi_get_traffic_limit_switch(VOID)
+{
+	CHAR m_switch[2] = {0};
+	sc_cfg_get(NV_TRAFFIC_LIMIT_SWITCH, m_switch, sizeof(m_switch));
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_traffic_limit_switch m_switch = %s!\n", m_switch);
+	if (!(strncmp(m_switch, "1", 2))) {
+		s_mmi_traffic_switch = TRAFFIC_LIMIT_SWITCH_ON;
+	} else if (!(strncmp(m_switch, "0", 2))) {
+		s_mmi_traffic_switch = TRAFFIC_LIMIT_SWITCH_OFF;
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_get_traffic_limit_switch error!\n");
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_traffic_limit_switch s_mmi_traffic_switch = %d!\n", s_mmi_traffic_switch);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡µ±Ç°Á÷Á¿µ¥Î»
+***********************************************************************************/
+static MMI_TRAFFIC_UNIT mmi_get_traffic_unit(VOID)
+{
+	CHAR m_unit[5] = {0};
+	MMI_TRAFFIC_UNIT traffic_unit = TRAFFIC_UNIT_MAX;
+	if (s_mmi_traffic_switch == TRAFFIC_LIMIT_SWITCH_ON) {
+		sc_cfg_get(NV_TRAFFIC_LIMIT_UNIT, m_unit, sizeof(m_unit));
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_traffic_unit m_unit = %s!\n", m_unit);
+		if (!(strncmp(m_unit, NV_TRAFFIC_LIMIT_UNIT_DATA, 5))) {
+			traffic_unit = TRAFFIC_UNIT_DATA;
+		} else if (!(strncmp(m_unit, NV_TRAFFIC_LIMIT_UNIT_TIME, 5))) {
+			traffic_unit = TRAFFIC_UNIT_TIME;
+		} else {
+			slog(MMI_PRINT, SLOG_ERR, "MMI mmi_get_traffic_unit error!\n");
+		}
+	} else {
+		traffic_unit = TRAFFIC_UNIT_DATA;
+	}
+	s_mmi_traffic_unit = traffic_unit;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_traffic_unit traffic_unit = %d! s_mmi_traffic_unit = %d\n", traffic_unit, s_mmi_traffic_unit);
+	return traffic_unit;
+
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡¸æ¾¯Á÷Á¿Öµ
+***********************************************************************************/
+static UINT32 mmi_get_warning_traffic(VOID)
+{
+	char m_warn_data[4] = {0};
+	UINT32 m_warn_value = 0;
+	UINT32 warn_level = 0;
+	UINT32 i = 0;
+	sc_cfg_get(NV_TRAFFIC_ALERT_PERCENT, m_warn_data, sizeof(m_warn_data));
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_warning_traffic m_warn_data = %s!\n", m_warn_data);
+	m_warn_value = strlen(m_warn_data) == 0 ? 0 : atoi(m_warn_data);
+	s_warning_tip_level = m_warn_value;
+	if (m_warn_value == 100) {
+		warn_level = 0;
+		return warn_level;
+	} else {
+		for (i = 0; i < 10; i++) {
+			if (m_warn_value >= 10 * i && m_warn_value < 10 * (i + 1)) {
+				warn_level = 9 - i;
+				slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_warning_traffic warn_level = %d!\n", warn_level);
+				return warn_level;
+			}
+		}
+	}
+	return 0;
+
+}
+static VOID mmi_set_used_data(float used_data)
+{
+	float used_data_MB = 0;
+	float used_data_GB = 0;
+
+	used_data_MB = used_data / (1024 * 1024);
+	if (used_data_MB > 1024) {
+		used_data_GB = used_data_MB / 1024;
+		if (used_data_GB > 1024) {
+			s_mmi_useddata_unit = TRAFFIC_DATA_UNIT_TB;
+			s_mmi_used_traffic = used_data_GB / 1024;
+		} else {
+			s_mmi_useddata_unit = TRAFFIC_DATA_UNIT_GB;
+			s_mmi_used_traffic = used_data_GB;
+		}
+	} else {
+		s_mmi_useddata_unit = TRAFFIC_DATA_UNIT_MB;
+		s_mmi_used_traffic = used_data_MB;
+	}
+
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡ÒÑʹÓÃÁ÷Á¿Öµ
+***********************************************************************************/
+static UINT32 mmi_get_used_traffic(MMI_TRAFFIC_UNIT t_unit)
+{
+	char m_used_data[25] = {0};
+	UINT32 used_traffic = 0;
+	if (t_unit == TRAFFIC_UNIT_TIME) {
+		sc_cfg_get(NV_TRAFFIC_USED_TIME, m_used_data, sizeof(m_used_data));
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_used_traffic UNIT_TIME m_used_data = %s!\n", m_used_data);
+		UINT32 m_used_data_time_value = strlen(m_used_data) == 0 ? 0 : (UINT32)(atoi(m_used_data));
+		if(m_used_data_time_value > INT_MAX-1) { //kw 3
+			slog(MMI_PRINT, SLOG_ERR, "MMI UNIT_TIME err m_used_data =%s-->%u!\n", m_used_data, m_used_data_time_value);
+			m_used_data_time_value = 0;
+		}
+		used_traffic = m_used_data_time_value / (60 * 60);
+		float m_user_data_time_value_f = (float)m_used_data_time_value;
+		s_mmi_used_traffic = m_user_data_time_value_f / (60 * 60);
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_used_traffic used_traffic = %d!,s_mmi_used_traffic=%f\n", used_traffic, s_mmi_used_traffic);
+	} else if (t_unit == TRAFFIC_UNIT_DATA) {
+		sc_cfg_get(NV_TRAFFIC_USED_DATA, m_used_data, sizeof(m_used_data));
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_used_traffic UNIT_DATA m_used_data = %s!\n", m_used_data);
+		long long m_user_data_value = atoll(m_used_data);
+		if(m_user_data_value < 0 || m_user_data_value > LLONG_MAX-1) { //kw 3
+			slog(MMI_PRINT, SLOG_ERR, "MMI UNIT_DATA err m_used_data =%s-->%lld!\n", m_used_data, m_user_data_value);
+			m_user_data_value = 0;
+		}
+
+		if (s_low_traffic_flag == 1) {
+			used_traffic = (UINT32)(m_user_data_value / 1024);
+		} else {
+			used_traffic = (UINT32)(m_user_data_value / (1024 * 1024));
+		}
+		
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_used_traffic m_user_data_value = %lld!\n", m_user_data_value);
+		float m_user_data_value_f = (float)m_user_data_value;
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_used_traffic m_user_data_value_f = %f!\n", m_user_data_value_f);
+		if (s_mmi_traffic_switch == TRAFFIC_LIMIT_SWITCH_OFF) {
+			mmi_set_used_data(m_user_data_value_f);
+		} else {
+			if (s_mmi_data_unit == TRAFFIC_DATA_UNIT_MB) {
+				s_mmi_used_traffic = m_user_data_value_f / (1024 * 1024);
+			} else if (s_mmi_data_unit == TRAFFIC_DATA_UNIT_GB) {
+				s_mmi_used_traffic = m_user_data_value_f / (1024 * 1024);
+				s_mmi_used_traffic = s_mmi_used_traffic / (1024);
+			} else if (s_mmi_data_unit == TRAFFIC_DATA_UNIT_TB) {
+				s_mmi_used_traffic = m_user_data_value_f / (1024 * 1024);
+				s_mmi_used_traffic = s_mmi_used_traffic / (1024 * 1024);
+			} else {
+				s_mmi_used_traffic = m_user_data_value_f / (1024 * 1024);
+			}
+		}
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_used_traffic used_traffic = %d!,s_mmi_used_traffic=%f\n", used_traffic, s_mmi_used_traffic);
+	}
+
+	return used_traffic;
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡¿ÉʹÓÃÁ÷Á¿×ÜÖµ
+***********************************************************************************/
+static UINT32 mmi_get_total_traffic(MMI_TRAFFIC_UNIT t_unit)
+{
+	CHAR m_traffic[30] = {0};
+	float dataValue = 0;
+	UINT32 unitValue = 0;
+	float t_traffic = 0;
+	sc_cfg_get(NV_TRAFFIC_LIMIT_SIZE, m_traffic, sizeof(m_traffic));
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_total_traffic m_traffic = %s!\n", m_traffic);
+	if (s_mmi_traffic_switch == TRAFFIC_LIMIT_SWITCH_OFF) {
+		s_mmi_total_traffic = 0;
+		return t_traffic;
+	}
+	if (t_unit == TRAFFIC_UNIT_DATA) {
+		sscanf((const char *)m_traffic, "%f_%u", &dataValue, &unitValue);
+		if(dataValue < 0 || dataValue > FLT_MAX) { //kw 3
+			slog(MMI_PRINT, SLOG_ERR, "MMI mmi_get_total_traffic err dataValue =%f!\n", dataValue);
+			dataValue = 0;
+		}
+
+		if (unitValue == 1) {
+			s_mmi_data_unit = TRAFFIC_DATA_UNIT_MB;
+		} else if (unitValue == 1024) {
+			s_mmi_data_unit = TRAFFIC_DATA_UNIT_GB;
+		} else if (unitValue == 1048576) {
+			s_mmi_data_unit = TRAFFIC_DATA_UNIT_TB;
+		} else {
+			s_mmi_data_unit = TRAFFIC_DATA_UNIT_MB;
+			slog(MMI_PRINT, SLOG_ERR, "MMI mmi_get_total_traffic err unitValue=%u!\n", unitValue);//cov
+			unitValue = 1;//kw 3
+		}
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_total_traffic s_mmi_data_unit = %d!\n", s_mmi_data_unit);
+		t_traffic = dataValue * unitValue;
+		s_mmi_total_traffic = dataValue;
+		if (t_traffic <= 10) {
+			t_traffic = t_traffic * 1024;
+			s_low_traffic_flag = 1;
+		} else {
+			s_low_traffic_flag = 0;
+		}
+	} else if (t_unit == TRAFFIC_UNIT_TIME) {
+		if (strlen(m_traffic) == 0) {
+			t_traffic = 0;
+		} else {
+			t_traffic = atof(m_traffic);
+		}
+		s_mmi_total_traffic = t_traffic;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_total_traffic t_traffic = %f!\n", t_traffic);
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_total_traffic s_mmi_total_traffic = %f!\n", s_mmi_total_traffic);
+	return t_traffic;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡Á÷Á¿Ïà¹ØÐÅÏ¢---¼à²â¿ª¹Ø¡¢µ¥Î»¡¢ÒÑÓÃÁ÷Á¿Öµ
+***********************************************************************************/
+VOID mmi_get_traffic_info(VOID)
+{
+	UINT32 used_traffic = 0;
+	UINT32 total_traffic = 0;
+	MMI_TRAFFIC_UNIT t_unit = TRAFFIC_UNIT_MAX;
+	mmi_get_traffic_limit_switch();
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		if (s_mmi_traffic_switch != TRAFFIC_LIMIT_SWITCH_ON || mmi_get_net_state() == 0) {
+			return;
+		}
+	}
+
+	t_unit = mmi_get_traffic_unit();
+	total_traffic = mmi_get_total_traffic(t_unit);
+	used_traffic = mmi_get_used_traffic(t_unit);
+	mmi_get_warning_traffic();
+	mmi_judge_traffic_status(total_traffic, used_traffic);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»½ÐÑÁ÷Á¿µÆ
+***********************************************************************************/
+VOID mmi_set_trafficled_on(VOID)
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI TRAFFIC_LED ON!!!\n");
+	s_mmi_t_status_ex = (MMI_TRAFFIC_LED)0;
+	mmi_set_traffic_update();
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡Á÷Á¿ÐÅÏ¢¶¨Ê±Æ÷»Øµ÷º¯Êý
+***********************************************************************************/
+static VOID * mmi_get_traffic_info_timer_callback(VOID *arg)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_traffic_info_timer_callback!!!\n");
+	if (s_mmi_traffic_switch == TRAFFIC_LIMIT_SWITCH_ON && mmi_get_net_state() == 1) {
+		mmi_get_traffic_info();
+		mmi_set_traffic_update();
+	}
+	return NULL;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:´¦Àí»Øµ÷º¯ÊýÖз¢¸ø×Ô¼ºµÄÏûÏ¢
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Get_TafficInfo_Start(VOID* data)
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI zMMI_Handle_Msg_Get_TafficInfo_Start !!!\n");
+	int ret = -1;
+	ret = sc_timer_create(SET_TRAFFIC_INFO_WAIT_TIMER, TIMER_FLAG_RESTART, SET_TRAFFIC_INFO_WAIT_TIME, &mmi_get_traffic_info_timer_callback, NULL);
+	if (ret != 0) {
+		slog(MMI_PRINT, SLOG_ERR, " MMI TafficInfo_Start_Timer FAILED,cause=%d!!\n", ret);
+	}
+	mmi_get_traffic_info();
+	mmi_set_traffic_update();
+	return 0;
+}
+
+SINT32 zMMI_Handle_Msg_Get_TafficInfo_End(VOID* data)
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI zMMI_Handle_Msg_Get_TafficInfo_End !!!\n");
+	sc_timer_delete(SET_TRAFFIC_INFO_WAIT_TIMER);
+	//¶Ï¿ªÍøÂ磬¹Ø±ÕÍøÂç¸æ¾¯µÆ
+	s_warning_tip_level = 0;
+	mmi_set_traffic_update();
+	return 0;
+}
+
+SINT32 zMMI_Handle_Msg_TafficInfo_Reset(VOID* data)
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI zMMI_Handle_Msg_TafficInfo_Reset !!!\n");
+	s_mmi_t_status_ex = (MMI_TRAFFIC_LED)0;
+	mmi_get_traffic_info();
+	mmi_set_traffic_update();
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:MMI Á÷Á¿Ñ­»·¼ì²â¶¨Ê±Æ÷KILL£¬  ¹Ø»úºÍÖØÆôʱµ÷ÓÃ
+***********************************************************************************/
+VOID mmi_kill_traffic_timer(VOID)
+{
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		sc_timer_delete(SET_TRAFFIC_INFO_WAIT_TIMER);
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:Á÷Á¿µÆ³õʼ»¯
+***********************************************************************************/
+VOID mmi_traffic_init(VOID)
+{
+	int ret = -1;
+	mmi_get_traffic_info();
+	mmi_set_traffic_update();
+
+	if (s_mmi_traffic_switch == TRAFFIC_LIMIT_SWITCH_ON) {
+		ret = sc_timer_create(SET_TRAFFIC_INFO_WAIT_TIMER, TIMER_FLAG_RESTART, SET_TRAFFIC_INFO_WAIT_TIME, &mmi_get_traffic_info_timer_callback, NULL);
+		if (ret != 0) {
+			slog(MMI_PRINT, SLOG_ERR, " MMI Taffic init Start Timer FAILED,cause=%d!!\n", ret);
+		}
+	}
+
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_traffic_led_init finish!!!\n");
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_voip.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_voip.c
new file mode 100755
index 0000000..81ee46b
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_voip.c
@@ -0,0 +1,161 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_voip.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMIÓïÒôÌáʾµÆ²Ù×÷
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#include "mmi_common.h"
+#include "mmi_lcd.h"
+
+static SINT32 s_mmi_sms_tip_timer_status = 0;
+static SINT32 s_mmi_sms_new_tip_num = 0;
+static SINT32 sms_unread_number = 0;
+static E_zMmi_Voip_Status s_mmi_voip_state = VOIP_STATUS_NOR;//±£´ævoipµÄµ±Ç°×´Ì¬
+extern E_zMmiShowMode g_showMode;
+
+
+/**********************************************************************************
+*Ò¢Ô¶cpe rj11Ïà¹Ø
+***********************************************************************************/
+static E_zMmi_Rj11_Status s_mmi_rj11_state = RJ11_STATUS_NOR;//±£´ævoipµÄµ±Ç°×´Ì¬
+
+SINT32 mmi_get_rj11info(UINT32 rj11info)
+{
+	if (rj11info != 0) {
+		T_zMmi_Rj11_Info * pVoipInfo = (T_zMmi_Voip_Info *)rj11info;
+		pVoipInfo->rj11_sta = s_mmi_rj11_state;
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_RegisterRj11TaskInfoItem()
+{
+	T_zMMITaskInfoItem voipTaskInfoItem = {0};
+	voipTaskInfoItem.task = MMI_TASK_RJ11;
+	voipTaskInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMmi_Rj11_Info));
+	voipTaskInfoItem.get_taskinfo_fun = mmi_get_rj11info;
+	voipTaskInfoItem.get_ledinfo_fun = mmi_getLedRj11Info;
+	voipTaskInfoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	//smsAppInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&voipTaskInfoItem);
+	return MMI_SUCCESS;
+}
+
+static VOID mmi_set_rj11_update()
+{
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		E_zMmi_Work_Mode mode = mmi_get_led_mode();
+		if (mode != MMI_IDLE_LEDOFF_MODE && mode != MMI_IDLE_CHG_LEDOFF_MODE
+		    && mode != MMI_FAKE_POWEROFF_MODE && mode != MMI_FAKE_POWEROFF_CHARGE_MODE && mode != MMI_IDLE_STANDBY_LEDOFF_MODE) {
+			mmi_set_update_flag(MMI_TASK_RJ11);
+		}
+	}
+}
+
+VOID mmi_get_rj11_status(VOID)
+{
+	char nv_voip_status[16] = {0};
+	sc_cfg_get("cc_rj11_status", nv_voip_status, sizeof(nv_voip_status));
+	if (!strcmp(nv_voip_status, VOIP_IN_CALL)) {
+		s_mmi_rj11_state = RJ11_STATUS_IN;
+	} else if (!strcmp(nv_voip_status, VOIP_HANG_UP)) {
+		s_mmi_rj11_state = RJ11_STATUS_OUT;
+	} else {
+		s_mmi_rj11_state = RJ11_STATUS_NOR;
+	}
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_get_rj11_status nv_status = %s s_mmi_rj11_state= %d !\n", nv_voip_status, s_mmi_rj11_state);
+}
+
+SINT32 zMMI_Handle_Msg_Rj11_Status(VOID * data)
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI zMMI_Handle_Msg_Rj11_Status !\n");
+	mmi_get_rj11_status();
+	mmi_set_rj11_update();
+	return 0;
+}
+//-------yaoyuan cpe end--------
+
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡¶ÌÐŵÆÐÅÏ¢±íË÷Òý
+***********************************************************************************/
+SINT32 mmi_get_voipinfo(UINT32 voipinfo)
+{
+	if (voipinfo != 0) {
+		T_zMmi_Voip_Info * pVoipInfo = (T_zMmi_Voip_Info *)voipinfo;
+		pVoipInfo->voip_sta = s_mmi_voip_state;
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_RegisterVoipTaskInfoItem()
+{
+	T_zMMITaskInfoItem voipTaskInfoItem = {0};
+	voipTaskInfoItem.task = MMI_TASK_VOIP;
+	voipTaskInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMmi_Voip_Info));
+	voipTaskInfoItem.get_taskinfo_fun = mmi_get_voipinfo;
+	voipTaskInfoItem.get_ledinfo_fun = mmi_getLedVoipInfo;
+	voipTaskInfoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	//smsAppInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&voipTaskInfoItem);
+	return MMI_SUCCESS;
+}
+
+static VOID mmi_set_voip_update()
+{
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		E_zMmi_Work_Mode mode = mmi_get_led_mode();
+		if (mode != MMI_IDLE_LEDOFF_MODE && mode != MMI_IDLE_CHG_LEDOFF_MODE
+		    && mode != MMI_FAKE_POWEROFF_MODE && mode != MMI_FAKE_POWEROFF_CHARGE_MODE && mode != MMI_IDLE_STANDBY_LEDOFF_MODE) {
+			mmi_set_update_flag(MMI_TASK_VOIP);
+		}
+	}
+}
+
+/************************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡VOIP״̬¶ÔÓ¦µÄNV
+***********************************************************************************/
+VOID mmi_get_voip_status(VOID)
+{
+	char nv_voip_status[16] = {0};
+	sc_cfg_get(NV_VOIP_STATUS, nv_voip_status, sizeof(nv_voip_status));
+	if (!strcmp(nv_voip_status, VOIP_IN_CALL)) {
+		s_mmi_voip_state = VOIP_STATUS_IN_CALL;
+	} else if (!strcmp(nv_voip_status, VOIP_IN_CONNECTION)) {
+		s_mmi_voip_state = VOIP_STATUS_IN_CONNECTION;
+	} else if (!strcmp(nv_voip_status, VOIP_HANG_UP)) {
+		s_mmi_voip_state = VOIP_STATUS_HANG_UP;
+	} else {
+		s_mmi_voip_state = VOIP_STATUS_NOR;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI zMMI_Handle_Msg_Voip_Status nv_voip_status = %s s_mmi_voip_state= %d !\n", nv_voip_status, s_mmi_voip_state);
+}
+
+/************************************************************************************
+º¯Êý×÷ÓÃ:VOIPÓïÒôÌáʾ״̬·¢Éú±ä»¯Ê±£¬´¦Àí¶ÔÓ¦µÄÏûÏ¢
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Voip_Status(VOID * data)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI zMMI_Handle_Msg_Voip_Status !\n");
+	mmi_get_voip_status();
+	mmi_set_voip_update();
+	return 0;
+}
+
+/************************************************************************************
+º¯Êý×÷ÓÃ:³õʼ»¯VOIPÓïÒôÌáʾµÆ
+***********************************************************************************/
+VOID mmi_voip_init(VOID)
+{
+	mmi_get_voip_status();
+	mmi_set_voip_update();
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_voip_init finish!!!\n");
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_wifi.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_wifi.c
new file mode 100755
index 0000000..8214879
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/mmi_wifi.c
@@ -0,0 +1,855 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_wifi.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI wifiµÆ²Ù×÷
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#include <sys/inotify.h>
+#include <limits.h>
+#include "mmi_common.h"
+#include "mmi_lcd.h"
+#include "wlan_interface.h"
+
+/*****************************************************************************
+ È«¾Ö±äÁ¿¶¨Òå
+******************************************************************************/
+static BOOL s_mmi_wifiState = FALSE;//´Ó¼à¿ØÎļþÖлñÈ¡µÄwifi״̬
+static BOOL s_mmi_wifidata_state = FALSE;//ÅжÏlan¿ÚÊÇ·ñÓÐÊý¾Ý´«Êä
+static E_zMmi_WpsAct_Tip s_mmi_wpsState = WPS_ACTIVE_MAX;//´Ó¼à¿ØÎļþÖлñÈ¡µÄwps״̬
+static BOOL g_wps_switch_ssid_show = TRUE;
+static BOOL g_wifi_code_show_flag = FALSE;//±ê¼Çwifi¶þάÂëÊÇ·ñ´æÔÚ
+static SINT32 s_mmi_wifi_connect_num = 0;		//Óû§Á¬½ÓÊý
+static SINT32 s_mmi_wifi_connect_numEx = 0;
+static SINT32 s_mmi_Isconnected_user = 0;     //ÊÇ·ñÓÐÓû§Á¬½Ówifi  1:ÓÐ 0:ûÓÐ
+static BOOL s_mmi_qrcode_exist = FALSE;        //¶þάÂëÊÇ·ñ´æÔÚ
+static BOOL s_mmi_qrcode_existPre = FALSE;    //±£´æ¶þλÉÏÒ»´Î¶þάÂëÊÇ·ñ´æÔÚ
+static BOOL s_mmi_wifiStationConnected = FALSE;//wifistationÊÇ·ñ´æÔÚ
+static SINT32 s_mmi_wifistation_signal_num = 0;		//wifistationÐźŸñÊý
+static char s_mmi_wifistation_ssid[64] = {0};//wifistation¶ÔÓ¦µÄssid
+extern BOOL g_mmi_key_longpress_flag;
+
+unsigned long long s_mmi_wifidata0_lastsend = 0;//wif¶Ë¿Úva0ÉÏÒ»´ÎµÄ·¢ËÍÊý¾Ý
+unsigned long long s_mmi_wifidata0_lastrecv = 0;//wif¶Ë¿Úva0ÉÏÒ»´ÎµÄ½ÓÊÕÊý¾Ý
+unsigned long long s_mmi_wifidata1_lastsend = 0;//wif¶Ë¿Úva0ÉÏÒ»´ÎµÄ·¢ËÍÊý¾Ý
+unsigned long long s_mmi_wifidata1_lastrecv = 0;//wif¶Ë¿Úva0ÉÏÒ»´ÎµÄ½ÓÊÕÊý¾Ý
+
+struct st_files file_wd[WD_NUM];
+extern E_zMmiShowMode g_showMode;
+extern UINT32 g_led_standby_mode;
+extern UINT32 g_led_sleep_mode;
+extern UINT32 g_use_wifi_usernum;
+extern int g_customer_type;
+SINT32 mmi_get_wifiinfo(UINT32 wifiinfo)
+{
+	if (wifiinfo != 0) {
+		T_zMMIWifiInfo * pWifiInfo = (T_zMMIWifiInfo *)wifiinfo;
+		pWifiInfo->wifi_state = s_mmi_wifiState;
+		pWifiInfo->wifidata_state = s_mmi_wifidata_state;
+		pWifiInfo->wps_state = s_mmi_wpsState;
+		pWifiInfo->Isconnected_user = s_mmi_Isconnected_user;
+		pWifiInfo->connected_userNum = s_mmi_wifi_connect_num;
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_get_wificodeinfo(UINT32 wificodeinfo)
+{
+	if (wificodeinfo != 0) {
+		T_zMMIWifiCodeInfo * pWifiCodeInfo = (T_zMMIWifiCodeInfo *)wificodeinfo;
+		pWifiCodeInfo->multi_ssid_switch = mmi_get_multi_ssid_switch_flag();
+		pWifiCodeInfo->is_wificode_exist = s_mmi_qrcode_exist;
+	}
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡wifiStationÁ¬½Ó״̬
+***********************************************************************************/
+BOOL mmi_get_wifiStationConnect_state()
+{
+	return s_mmi_wifiStationConnected;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡wifiStationÁ¬½ÓºóÐźÅÇ¿¶ÈÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_get_wifiStation_signalNum()
+{
+	return s_mmi_wifistation_signal_num;
+}
+
+static VOID mmi_get_wifiStation_ssid_from_nv()
+{
+	sc_cfg_get(NV_WIFISTA_SSID, s_mmi_wifistation_ssid, sizeof(s_mmi_wifistation_ssid));
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡WifiStationÐÅϢģ¿é
+***********************************************************************************/
+SINT32 mmi_get_wifistationinfo(UINT32 wifistationinfo)
+{
+	if (wifistationinfo != 0) {
+		T_zMMIWifiStationInfo * pWifiStationInfo = (T_zMMIWifiStationInfo *)wifistationinfo;
+		pWifiStationInfo->wifistation_connect_state = mmi_get_wifiStationConnect_state();
+		pWifiStationInfo->signal_num = mmi_get_wifiStation_signalNum();
+		pWifiStationInfo->wifista_ssid = s_mmi_wifistation_ssid;
+	}
+	return MMI_SUCCESS;
+}
+
+
+SINT32 mmi_RegisterWifiTaskInfoItem()
+{
+	T_zMMITaskInfoItem wifiInfoItem = {0};
+	wifiInfoItem.task = MMI_TASK_WIFI;
+	wifiInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMIWifiInfo));
+	wifiInfoItem.get_taskinfo_fun = mmi_get_wifiinfo;
+#ifndef DISABLE_LCD
+	wifiInfoItem.get_lcdinfo_fun = mmi_getLcdWifiInfo;
+#endif
+	wifiInfoItem.get_ledinfo_fun = mmi_getLedWifiInfo;
+	wifiInfoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	//wifiAppInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&wifiInfoItem);
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_RegisterWpsTaskInfoItem()
+{
+	T_zMMITaskInfoItem wifiInfoItem = {0};
+	wifiInfoItem.task = MMI_TASK_LED_WPS;
+	wifiInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMIWifiInfo));
+	wifiInfoItem.get_taskinfo_fun = mmi_get_wifiinfo;
+#ifndef DISABLE_LCD
+	//wifiInfoItem.get_lcdinfo_fun = mmi_getLcdWifiInfo;
+#endif
+	wifiInfoItem.get_ledinfo_fun = mmi_getLedWpsInfo;
+	wifiInfoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	//wifiAppInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&wifiInfoItem);
+	return MMI_SUCCESS;
+}
+
+
+SINT32 mmi_RegisterWifiCodeTaskInfoItem()
+{
+	T_zMMITaskInfoItem wifiInfoItem = {0};
+	wifiInfoItem.task = MMI_TASK_WIFICODE;
+	wifiInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMIWifiInfo));
+	wifiInfoItem.get_taskinfo_fun = mmi_get_wificodeinfo;
+#ifndef DISABLE_LCD
+	wifiInfoItem.get_lcdinfo_fun = mmi_getLcdWifiCodeInfo;
+#endif
+	wifiInfoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	//wifiAppInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&wifiInfoItem);
+	return MMI_SUCCESS;
+}
+/**********************************************************************************
+º¯Êý×÷ÓÃ:×¢²áwifiStationÐÅϢģ¿é
+***********************************************************************************/
+SINT32 mmi_RegisterTipWifiStationConnectTaskInfoItem()
+{
+	T_zMMITaskInfoItem wifiStationInfoItem = {0};
+	wifiStationInfoItem.task = MMI_TASK_TIP_WIFISTATION;
+	wifiStationInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMIWifiStationInfo));
+	wifiStationInfoItem.get_taskinfo_fun = mmi_get_wifistationinfo;
+#ifndef DISABLE_LCD
+	wifiStationInfoItem.get_lcdinfo_fun = mmi_getLcdWifiStationInfo;
+#endif
+	//wifiStationInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&wifiStationInfoItem);
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:×¢²áWPSÌáʾģ¿é
+***********************************************************************************/
+SINT32 mmi_RegisterTipWpsTaskInfoItem()
+{
+	T_zMMITaskInfoItem wpsInfoItem = {0};
+	wpsInfoItem.task = MMI_TASK_TIP_WPS;
+	wpsInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMIWifiInfo));
+	wpsInfoItem.get_taskinfo_fun = mmi_get_wifiinfo;
+#ifndef DISABLE_LCD
+	wpsInfoItem.get_lcdinfo_fun = mmi_getLcdTipWpsInfo;
+#endif
+	//wpsInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&wpsInfoItem);
+	return MMI_SUCCESS;
+}
+
+static VOID mmi_set_wifi_update()
+{
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		mmi_set_update_flag(MMI_TASK_WIFI);
+	}
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		E_zMmi_Work_Mode mode = mmi_get_led_mode();
+		if (mode != MMI_IDLE_LEDOFF_MODE && mode != MMI_IDLE_CHG_LEDOFF_MODE
+		    && mode != MMI_FAKE_POWEROFF_MODE && mode != MMI_FAKE_POWEROFF_CHARGE_MODE && mode != MMI_IDLE_STANDBY_LEDOFF_MODE) {
+			mmi_set_update_flag(MMI_TASK_WIFI);
+		}
+	}
+}
+
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:ÊÇ·ñÏÔʾwifi ¶þάÂë
+***********************************************************************************/
+VOID mmi_set_wificode_show_flag(BOOL flag)
+{
+	g_wifi_code_show_flag = flag;
+}
+
+BOOL mmi_get_wificode_show_flag(VOID)
+{
+	return g_wifi_code_show_flag;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡wifi/wps״̬
+***********************************************************************************/
+BOOL mmi_get_wifi_state()
+{
+	return s_mmi_wifiState;
+}
+
+E_zMmi_WpsAct_Tip mmi_get_wps_state()
+{
+	return s_mmi_wpsState;
+}
+
+void mmi_ms_sleep(unsigned long mSec)
+{
+
+	struct timeval tv;
+	tv.tv_sec = mSec / 1000;
+	tv.tv_usec = (mSec % 1000) * 1000;
+	int err;
+	do {
+		err = select(0, NULL, NULL, NULL, &tv);
+	} while (err < 0 && errno == EINTR);
+
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:WIFI¿ª¹Ø
+***********************************************************************************/
+VOID mmi_wifi_operate(char* mode)
+{
+	char wifi_mode[2] = {0};
+	sc_cfg_get(WLAN_NV_CUR_STATE, wifi_mode, 2);
+	slog(MMI_PRINT, SLOG_NORMAL, "MMI handle_wifi_opt mode = %s RadioOff=%s\n", mode, wifi_mode);
+	if (!strcmp(mode, WIFI_TURN_OFF_FAKE_POWEROFF)) {
+		if (g_mmi_key_longpress_flag) {
+			g_mmi_key_longpress_flag = FALSE;
+
+			int wait_times = 0;
+			char wifi_process_state[11] = {0};
+			sc_cfg_get(WLAN_NV_PROCESS_STATE, wifi_process_state, 11);
+			//¿ìËÙ¿ª¹Ø»úʱ²Ù×÷¹ý¿ìwifi״̬»áÂÒµô£¬Ôڴ˼ӵȴýwifi¿ª¹Ø²Ù×÷½áÊø
+			while (wait_times < 100 && !strcmp(wifi_process_state, "processing")) {
+				wait_times++;
+				mmi_ms_sleep(30);
+				sc_cfg_get(WLAN_NV_PROCESS_STATE, wifi_process_state, 11);
+			}
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI wait for wifi processing end wait_times = %d\n", wait_times);
+		}
+		sc_cfg_get(WLAN_NV_CUR_STATE, wifi_mode, 2);
+		if (!strcmp(wifi_mode, WIFI_OPENED)) {
+			slog(MMI_PRINT, SLOG_NORMAL, "MMI handle_wifi_opt FAKE_POWEROFF\n");
+			ipc_send_message(MODULE_ID_MMI, MODULE_ID_WIFI, (USHORT)MSG_CMD_WIFI_CLOSE, NULL, NULL, 0);
+		}
+	} else {
+		if (strcmp(wifi_mode, mode)) {
+			if (strcmp(wifi_mode, WIFI_OPENED) == 0) {
+				slog(MMI_PRINT, SLOG_NORMAL, "MMI handle_wifi_opt mode close wifi\n");
+				ipc_send_message(MODULE_ID_MMI, MODULE_ID_WIFI, (USHORT)MSG_CMD_WIFI_CLOSE, NULL, NULL, 0); //ÏòWIFI·¢Ë͹رÕÏûÏ¢
+			} else if (strcmp(wifi_mode, WIFI_CLOSED) == 0) {
+				slog(MMI_PRINT, SLOG_NORMAL, "MMI handle_wifi_opt mode open wifi\n");
+				ipc_send_message(MODULE_ID_MMI, MODULE_ID_WIFI, (USHORT)MSG_CMD_WIFI_OPEN, NULL, NULL, 0); //ÏòWIFI·¢ËÍ»½ÐÑÏûÏ¢
+			}
+		}
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:wps¼¤»î»òÈ¥¼¤»î³É¹¦ºóÏÔʾ2Ã붨ʱÆ÷
+***********************************************************************************/
+static VOID * mmi_wps_tip_check_timer_cb(VOID *arg)
+{
+	s_mmi_wpsState = WPS_ACTIVE_MAX;
+	mmi_set_update_flag(MMI_TASK_TIP);
+	return NULL;
+}
+
+static VOID mmi_wps_tip_timer_start(VOID)
+{
+	int ret = -1;
+	ret = sc_timer_create(SET_WPS_TIP_CHECK_TIMER, TIMER_FLAG_ONCE, SET_WPS_TIP_CHECK_TIME, &mmi_wps_tip_check_timer_cb, NULL);
+	if (ret != 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_wps_tip_timer_start FAILED\n");
+	}
+}
+
+static VOID mmi_wps_tip_timer_stop(VOID)
+{
+	sc_timer_delete(SET_WPS_TIP_CHECK_TIMER);
+}
+
+VOID mmi_wps_operate(VOID)
+{
+	char authmode[16] = {0};
+	char hidessid[2] = {0};
+	char encrypType[16] = {0};
+	char WscModeOption[2] = {0};
+	char wps_mode[10] = {0};
+	long lRet = -1;
+	sc_cfg_get(WLAN_NV_AUTHMODE_NAME, authmode, sizeof(authmode));
+	sc_cfg_get(WLAN_NV_AP_HIDESSID_NAME, hidessid, sizeof(hidessid));
+	sc_cfg_get(WLAN_NV_ENCRYP_TYPE_NAME, encrypType, sizeof(encrypType));
+	sc_cfg_get(WLAN_NV_WSC_MODE_NAME, WscModeOption, sizeof(WscModeOption));
+
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_wps_operate authmode = %s, encryptype = %s, hidessid = %s \n", authmode, encrypType, hidessid);
+	if (mmi_get_wifi_state() && (mmi_get_wps_state() == WPS_ACTIVE_MAX) && (strncmp(hidessid, "1", 1))
+	    && (strcmp(encrypType, "TKIP")) && (strcmp(authmode, "WPAPSK")) //cov m ,maybe error???
+	    && ((strcmp(authmode, "SHARED")) && (strcmp(authmode, "WEPAUTO")) && (!((!strcmp(authmode, "OPEN")) && (!strcmp(encrypType, "WEP")))))) { //³¤°´Æô¶¯WPS
+		strncpy(wps_mode, "PBC", 9);
+
+		if (!strcmp(WscModeOption, "1")) {
+			return;
+		}
+		sc_cfg_set(WLAN_NV_WSC_MODE_NAME, "1");
+		sc_cfg_set(WLAM_NV_WPS_MODE_NAME, wps_mode);
+		lRet = ipc_send_message(MODULE_ID_MMI, MODULE_ID_WIFI, (USHORT)MSG_CMD_WIFI_WPS, 0, NULL, 0);
+		if (0 == lRet) {
+			slog(MMI_PRINT, SLOG_NORMAL, "MMI mmi_wps_operate send to wifi ok \n");
+			//send_rsp_str_to_farps(MODULE_ID_MMI, "\r\n+TKEYEVENT: wps actived\r\n", strlen("\r\n+TKEYEVENT: wps actived\r\n"));
+			ipc_send_message(MODULE_ID_MMI, MODULE_ID_AT_CTL, MSG_CMD_SEND_RSP_TO_OUTSIDE, strlen("\r\n+TKEYEVENT: wps actived\r\n"), "\r\n+TKEYEVENT: wps actived\r\n", 0);
+		}
+	}
+	if ((!strcmp(hidessid, "1"))
+	    || ((!strcmp(authmode, "OPEN")) && (!strcmp(encrypType, "WEP")))
+	    || ((!strcmp(authmode, "SHARED")) && (!strcmp(encrypType, "WEP")))
+	    || ((!strcmp(authmode, "WPAPSK")) && (!strcmp(encrypType, "TKIP")))
+	    || ((!strcmp(authmode, "WPAPSK")) && (!strcmp(encrypType, "AES")))
+	    || ((!strcmp(authmode, "WPAPSK")) && (!strcmp(encrypType, "TKIPCCMP")))
+	    || ((!strcmp(authmode, "WPA2PSK")) && (!strcmp(encrypType, "TKIP")))
+	    || ((!strcmp(authmode, "WPAPSKWPA2PSK")) && (!strcmp(encrypType, "TKIP")))) {
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_wps_operate authmode = %s, encryptype = %s, hidessid = %s \n", authmode, encrypType, hidessid);
+		s_mmi_wpsState = WPS_FAIL;
+		mmi_wps_tip_timer_start();
+		mmi_set_wifi_update();
+		mmi_set_update_flag(MMI_TASK_TIP_WPS);
+		mmi_set_update_flag(MMI_TASK_LED_WPS);
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ͨ¹ýnv»ñÈ¡Ö÷¡¢¸±SSIDµÄwifiÓû§Á¬½ÓÊý
+***********************************************************************************/
+static VOID mmi_get_wifi_stanum(VOID)
+{
+	char va0_wifi_num[8] = {0};
+	char va1_wifi_num[8] = {0};
+	SINT32 wifi_num = 0;
+	SINT32 m_wifi_num = 0;
+	sc_cfg_get(WLAN_NV_VA0_WIIF_NUM, va0_wifi_num, sizeof(va0_wifi_num));
+	sc_cfg_get(WLAN_NV_VA1_WIIF_NUM, va1_wifi_num, sizeof(va1_wifi_num));
+	wifi_num = atoi(va0_wifi_num);
+	m_wifi_num = atoi(va1_wifi_num);
+	if ((wifi_num < 0 || wifi_num > INT_MAX-1) ||
+		(m_wifi_num < 0 || m_wifi_num > INT_MAX-1)){//kw 3, 0~32?
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_get_wifi_stanum wifi_num = %d, m_wifi_num = %d\n", wifi_num, m_wifi_num);
+		return;
+	}
+	s_mmi_wifi_connect_num = wifi_num + m_wifi_num;
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_get_wifi_stanum wifi_num = %d,m_wifi_num = %d, s_mmi_wifi_connect_num = %d \n", wifi_num, m_wifi_num, s_mmi_wifi_connect_num);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:²éѯwifi Á¬½ÓÊý¶¨Ê±Æ÷»Øµ÷
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Get_Wifi_StaNum(VOID *data)
+{
+	//#if MMI_USE_WIFI_USERNUM
+	if (g_use_wifi_usernum) {
+#if 0
+		s_mmi_wifi_connect_num = zte_wlan_capture_sta_num();
+		if (s_mmi_wifi_connect_num != 0 && s_mmi_wifi_connect_numEx == 0) {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI zMMI_Get_wifi_Stanum_Callback s_mmi_connected_user = 1!!!\n");
+			s_mmi_Isconnected_user = 1;
+		} else if (s_mmi_wifi_connect_num == 0 && s_mmi_wifi_connect_numEx != 0) {
+			slog(MMI_PRINT, SLOG_DEBUG, "MMI zMMI_Get_wifi_Stanum_Callback s_mmi_connected_user = 0!!!\n");
+			s_mmi_Isconnected_user = 0;
+		}
+		s_mmi_wifi_connect_numEx = s_mmi_wifi_connect_num;
+		mmi_set_wifi_update();
+#else
+		SINT32 va_state = -1;
+		va_state = *(SINT32*)data;
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI zMMI_Handle_Msg_Get_Wifi_StaNum va_state = %d\n", va_state);
+		mmi_get_wifi_stanum();
+		mmi_set_wifi_update();
+#endif
+	}
+	//#endif
+	return 0;
+}
+
+static VOID * mmi_wifi_stanum_timer_cb(VOID *arg)
+{
+	if (s_mmi_wifiState) {
+		ipc_send_message(MODULE_ID_MMI, MODULE_ID_MMI, (USHORT)MSG_CMD_MMIGET_WIFI_STANUM, 0, NULL, 0);
+	}
+	return NULL;
+}
+
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:²éѯwifi Á¬½ÓÊý¶¨Ê±Æ÷ 3S
+***********************************************************************************/
+static VOID mmi_wifi_stanum_timer_create(VOID)
+{
+	int ret = -1;
+	ret = sc_timer_create(SET_WIFI_STANUM_CHECK_TIMER, TIMER_FLAG_RESTART, SET_WIFI_STANUM_CHECK_TIME, &mmi_wifi_stanum_timer_cb, NULL);
+	if (ret != 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_wifi_stanum_timer_create FAILED\n");
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:²éѯwifi Êý¾Ý´«Ê䶨ʱÆ÷»Øµ÷
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Get_Wifi_Data(VOID *data)
+{
+	unsigned long long s_mmi_wifidata0_send = 0, s_mmi_wifidata0_recv = 0;
+	unsigned long long s_mmi_wifidata1_send = 0, s_mmi_wifidata1_recv = 0;
+	getIfStatistic(WIFI_DATA_VA0, WIFI_TXBYTE, &s_mmi_wifidata0_send); //¶ÁÈ¡wif¶Ë¿Úva0µÄ·¢ËÍÊý¾Ý
+	getIfStatistic(WIFI_DATA_VA0, WIFI_RXBYTE, &s_mmi_wifidata0_recv); //¶ÁÈ¡wif¶Ë¿Úva0µÄ½ÓÊÕÊý¾Ý
+	if(g_customer_type == CUSTOMER_SDK_MIN)
+	{
+		getIfStatistic("wlan0", WIFI_TXBYTE, &s_mmi_wifidata1_send); //¶ÁÈ¡wif¶Ë¿Úva1µÄ·¢ËÍÊý¾Ý
+		getIfStatistic("wlan0", WIFI_RXBYTE, &s_mmi_wifidata1_recv); //¶ÁÈ¡wif¶Ë¿Úva1µÄ½ÓÊÕÊý¾Ý
+	}
+	else
+	{
+		getIfStatistic(WIFI_DATA_VA1, WIFI_TXBYTE, &s_mmi_wifidata1_send); //¶ÁÈ¡wif¶Ë¿Úva1µÄ·¢ËÍÊý¾Ý
+		getIfStatistic(WIFI_DATA_VA1, WIFI_RXBYTE, &s_mmi_wifidata1_recv); //¶ÁÈ¡wif¶Ë¿Úva1µÄ½ÓÊÕÊý¾Ý
+	}
+#if 0 //kw 3
+	if (s_mmi_wifidata0_send == -1 || s_mmi_wifidata0_recv == -1 || s_mmi_wifidata1_send == -1 || s_mmi_wifidata1_recv == -1) {
+		s_mmi_wifidata_state = FALSE;
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_wifi_data_timer_cb invalid wifi data!\n");
+		s_mmi_wifidata0_lastsend = 0;
+		s_mmi_wifidata0_lastrecv = 0;
+		s_mmi_wifidata1_lastsend = 0;
+		s_mmi_wifidata1_lastrecv = 0;
+		mmi_set_wifi_update();
+		return 0;
+	} else 
+#endif
+	if ((s_mmi_wifidata0_send != s_mmi_wifidata0_lastsend) || (s_mmi_wifidata0_recv != s_mmi_wifidata0_lastrecv)
+	           || (s_mmi_wifidata1_send != s_mmi_wifidata1_lastsend) || (s_mmi_wifidata1_recv != s_mmi_wifidata1_lastrecv)) {
+		s_mmi_wifidata_state = TRUE;      		//ÓÐÊý¾Ý´«Êä
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_wifi_data_timer_cb having data transfer!\n");
+	} else {
+		s_mmi_wifidata_state = FALSE;
+		slog(MMI_PRINT, SLOG_DEBUG, "MMI mmi_wifi_data_timer_cb no data transfer!\n");
+	}
+	s_mmi_wifidata0_lastsend = s_mmi_wifidata0_send;
+	s_mmi_wifidata0_lastrecv = s_mmi_wifidata0_recv;
+	s_mmi_wifidata1_lastsend = s_mmi_wifidata1_send;
+	s_mmi_wifidata1_lastrecv = s_mmi_wifidata1_recv;
+	if(g_customer_type == CUSTOMER_SDK_MIN && s_mmi_wpsState == WPS_ACTIVING) {
+		s_mmi_wifidata_state = TRUE; //ÀÖоwpsʱwlan0ÎÞÊý¾Ý
+	}
+	mmi_set_wifi_update();
+	return 0;
+}
+
+static VOID * mmi_wifi_data_timer_cb(VOID *arg)
+{
+	if (s_mmi_wifiState) {
+		ipc_send_message(MODULE_ID_MMI, MODULE_ID_MMI, (USHORT)MSG_CMD_MMIGET_WIFI_DATA, 0, NULL, 0);
+	}
+	return NULL;
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:²éѯwifi ÊÇ·ñÓÐÊý¾Ý´«Ê䶨ʱÆ÷ 3S
+***********************************************************************************/
+static VOID mmi_wifi_data_timer_create(VOID)
+{
+	int ret = -1;
+	ret = sc_timer_create(SET_WIFI_DATA_CHECK_TIMER, TIMER_FLAG_RESTART, SET_WIFI_DATA_CHECK_TIME, &mmi_wifi_data_timer_cb, NULL);
+	if (ret != 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_wifi_data_timer_create FAILED\n");
+	}
+}
+
+static VOID mmi_wifi_data_timer_stop(VOID)
+{
+	sc_timer_delete(SET_WIFI_DATA_CHECK_TIMER);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¶þάÂëÊÇ·ñ´æÔÚ״̬ÉèÖÃ
+***********************************************************************************/
+SINT32 mmi_set_qrcode_state()
+{
+	char buf_qrcode[8] = {0};
+	FILE* fd_qrcode = NULL;
+	int len = 0;
+
+
+	fd_qrcode = fopen(QRCODE_STATE_PATH, "r");
+	if (fd_qrcode == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_set_qrcode_state open qrcode file fail!\n");
+		perror(QRCODE_STATE_PATH);
+		return 0;
+	}
+	len = fread(buf_qrcode, 1, 1, fd_qrcode);
+	if (len > 0) { //kw 3, have 0x0a
+		buf_qrcode[len] = '\0';
+		if (strcmp(buf_qrcode, "1") == 0) {
+			s_mmi_qrcode_exist = TRUE;
+		} else if (strcmp(buf_qrcode, "0") == 0) {
+			s_mmi_qrcode_exist = FALSE;
+		} else {
+			slog(MMI_PRINT, SLOG_ERR, "MMI  qrcode file state error!\n");
+		}
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI read qrcode file fail!\n");
+	}
+
+	fclose(fd_qrcode);
+
+	if (mmi_get_wificode_show_flag() == TRUE && s_mmi_qrcode_existPre == FALSE && s_mmi_qrcode_exist == TRUE) {
+		mmi_set_update_flag(MMI_TASK_WIFICODE);
+	}
+
+	s_mmi_qrcode_existPre = s_mmi_qrcode_exist;
+	return 0;
+}
+
+BOOL mmi_get_qrcode_state()
+{
+	return s_mmi_qrcode_exist ;
+}
+/**********************************************************************************
+º¯Êý×÷ÓÃ:wifi¿ªÆô\¹Ø±Õ״̬ÉèÖÃ
+***********************************************************************************/
+VOID mmi_set_wifi_state(VOID)
+{
+	char buf_wifi[8] = {0};
+	FILE* fd_wifi = NULL;
+	int len = 0;
+
+	fd_wifi = fopen(WIFI_STATE_PATH, "r");
+	if (fd_wifi == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_set_wifi_state open wifi file fail!\n");
+		perror(WIFI_STATE_PATH);
+		return;
+	}
+	len = fread(buf_wifi, 1, 1, fd_wifi);
+	if (len > 0) { //kw 3
+		buf_wifi[len] = '\0';
+		if (strcmp(buf_wifi, "1") == 0) {
+			s_mmi_wifiState = TRUE;
+			ipc_send_message(MODULE_ID_MMI, MODULE_ID_MMI, (USHORT)MSG_CMD_STA_COUNT_CHANGE, 0, NULL, 0);
+		} else if (strcmp(buf_wifi, "0") == 0) {
+			s_mmi_wifiState = FALSE;
+			s_mmi_wpsState = WPS_ACTIVE_MAX;
+			s_mmi_Isconnected_user = 0;
+			s_mmi_wifi_connect_num = 0;
+			//#if MMI_LED_STANDBY_MODE
+			if (g_led_standby_mode && mmi_get_led_mode() == MMI_IDLE_LEDOFF_MODE) {
+				mmi_set_led_mode(MMI_IDLE_STANDBY_LEDOFF_MODE);
+				mmi_set_update_flag(MMI_TASK_CTRL);
+			}
+			//#endif
+		} else {
+			slog(MMI_PRINT, SLOG_ERR, "MMI wifi file state error!\n");
+		}
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI read wifi file fail!\n");
+	}
+
+	fclose(fd_wifi);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:wps¿ªÆô\¹Ø±Õ״̬ÉèÖÃ
+***********************************************************************************/
+static VOID mmi_set_wps_state(VOID)
+{
+	char buf_wps[8] = {0};
+	FILE* fd_wps = NULL;
+	int len = 0;
+
+
+	fd_wps = fopen(WPS_STATE_PATH, "r");
+	if (fd_wps == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_set_wifi_state open wps file fail!\n");
+		perror(WPS_STATE_PATH);
+		return;
+	}
+	len = fread(buf_wps, 1, 1, fd_wps);
+	if (len > 0) { //kw 3
+		buf_wps[len] = '\0';
+		if (strcmp(buf_wps, "1") == 0) {
+			s_mmi_wpsState = WPS_ACTIVING;
+		} else if (strcmp(buf_wps, "0") == 0) {
+			s_mmi_wpsState = WPS_DEACTIVED;
+			mmi_wps_tip_timer_start();
+		} else {
+			slog(MMI_PRINT, SLOG_ERR, "MMI wps file state error!\n");
+		}
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI read wps file fail!\n");
+	}
+
+	fclose(fd_wps);
+}
+
+static VOID mmi_set_wpsEx_state(VOID)
+{
+	char buf_wps[8] = {0};
+	FILE* fd_wps = NULL;
+	int len = 0;
+
+	fd_wps = fopen(WPS_STATEEX_PATH, "r");
+	if (fd_wps == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_set_wifi_state open wpsEX file fail!\n");
+		perror(WPS_STATEEX_PATH);
+		return;
+	}
+	len = fread(buf_wps, 1, 1, fd_wps);
+	if (len > 0) { //kw 3
+		buf_wps[len] = '\0';
+		if (strcmp(buf_wps, "1") == 0) {
+			s_mmi_wpsState = WPS_ACTIVED;
+			mmi_wps_tip_timer_start();
+		} else if (strcmp(buf_wps, "2") == 0) {
+			s_mmi_wpsState = WPS_DEACTIVING;
+		} else {
+			slog(MMI_PRINT, SLOG_ERR, "MMI  wps file state error!\n");
+		}
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI read wps file fail!\n");
+	}
+
+	fclose(fd_wps);
+}
+/**********************************************************************************
+º¯Êý×÷ÓÃ:wifiStation¿ªÆô\¹Ø±Õ״̬ÉèÖÃ
+***********************************************************************************/
+VOID mmi_set_wifiStation_state(VOID)
+{
+	char buf_wifiStation[8] = {0};
+	FILE* fd_wifiStation = NULL;
+	int len = 0;
+
+
+	fd_wifiStation = fopen(WIFI_STATION_PATH, "r");
+	if (fd_wifiStation == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI mmi_set_wifiStation_state open wifiStation file fail!\n");
+		perror(WIFI_STATION_PATH);
+		return;
+	}
+	len = fread(buf_wifiStation, 1, 1, fd_wifiStation);
+	if (len > 0) { //kw 3
+		buf_wifiStation[len] = '\0';
+		if (strcmp(buf_wifiStation, "F") == 0) {
+			s_mmi_wifiStationConnected = FALSE;
+		} else {
+			s_mmi_wifiStationConnected = TRUE;
+			mmi_get_wifiStation_ssid_from_nv();
+			if (strcmp(buf_wifiStation, "4") == 0) {
+				s_mmi_wifistation_signal_num = 4;
+			} else if (strcmp(buf_wifiStation, "3") == 0) {
+				s_mmi_wifistation_signal_num = 3;
+			} else if (strcmp(buf_wifiStation, "2") == 0) {
+				s_mmi_wifistation_signal_num = 2;
+			} else if (strcmp(buf_wifiStation, "1") == 0) { //cov m
+				s_mmi_wifistation_signal_num = 1;
+			} else if (strcmp(buf_wifiStation, "0") == 0) {
+				s_mmi_wifistation_signal_num = 0;
+			} else {
+				slog(MMI_PRINT, SLOG_ERR, "MMI  wifiStation file state error!\n");
+			}
+		}
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "MMI read wifiStation file fail!\n");
+	}
+	fclose(fd_wifiStation);
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:wifiָʾµÆÏß³ÌÈë¿Úº¯Êý
+***********************************************************************************/
+static void mmi_wifiwps_file_operate(char *filename)
+{
+	if (filename == NULL) {
+		return;
+	}
+	if (strcmp(filename, WIFI_STATE_PATH) == 0) {
+		mmi_set_wifi_state();
+		mmi_set_wifi_update();
+		mmi_set_update_flag(MMI_TASK_LED_WPS);
+	} else if (strcmp(filename, WPS_STATE_PATH) == 0) {
+		mmi_set_wps_state();
+		mmi_set_wifi_update();
+		mmi_set_update_flag(MMI_TASK_TIP_WPS);
+		mmi_set_update_flag(MMI_TASK_LED_WPS);
+	} else if (strcmp(filename, WPS_STATEEX_PATH) == 0) {
+		mmi_set_wpsEx_state();
+		mmi_set_wifi_update();
+		mmi_set_update_flag(MMI_TASK_TIP_WPS);
+		mmi_set_update_flag(MMI_TASK_LED_WPS);
+	} else if (strcmp(filename, QRCODE_STATE_PATH) == 0) {
+		mmi_set_qrcode_state();
+	} else if (strcmp(filename, WIFI_STATION_PATH) == 0) {
+		mmi_set_wifiStation_state();
+		mmi_set_update_flag(MMI_TASK_TIP_WIFISTATION);
+	}
+}
+
+void *mmi_wifi_thread_function(void *arg)
+{
+	int fd = -1;
+	int wd;
+	char buffer[1024] = {0};
+	char *offset = NULL;
+	struct inotify_event *event = NULL;
+	int len = 0;
+	int tmp_len = 0;
+	int offs_len = 0;
+	int i = 0;
+
+	fd = inotify_init();
+	if (fd < 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI fail to inotify_init\n");
+		assert(0);
+	}
+	prctl(PR_SET_NAME, "mmiwificheck", 0, 0, 0);
+	file_wd[0].filename = WIFI_STATE_PATH;
+	wd = inotify_add_watch(fd, file_wd[0].filename, IN_CLOSE_WRITE);
+	if (wd < 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI can't add watch for %s\n", file_wd[0].filename);
+	}
+	file_wd[0].wd = wd;
+
+	file_wd[1].filename = WPS_STATE_PATH;
+	wd = inotify_add_watch(fd, file_wd[1].filename, IN_CLOSE_WRITE);
+	if (wd < 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI can't add watch for %s\n", file_wd[1].filename);
+	}
+	file_wd[1].wd = wd;
+
+	file_wd[3].filename = WPS_STATEEX_PATH;
+	wd = inotify_add_watch(fd, file_wd[3].filename, IN_CLOSE_WRITE);
+	if (wd < 0) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI can't add watch for %s\n", file_wd[3].filename);
+	}
+	file_wd[3].wd = wd;
+	
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		file_wd[2].filename = QRCODE_STATE_PATH;
+		wd = inotify_add_watch(fd, file_wd[2].filename, IN_CLOSE_WRITE);
+		if (wd < 0) {
+			slog(MMI_PRINT, SLOG_ERR, "MMI can't add watch for %s\n", file_wd[2].filename);
+		}
+		file_wd[2].wd = wd;
+
+		file_wd[4].filename = WIFI_STATION_PATH;
+		wd = inotify_add_watch(fd, file_wd[4].filename, IN_CLOSE_WRITE);
+		if (wd < 0) {
+			slog(MMI_PRINT, SLOG_ERR, "MMI can't add watch for %s\n", file_wd[4].filename);
+		}
+		file_wd[4].wd = wd;
+	}
+#endif
+
+	while (1) {
+		if ((len = read(fd, buffer, 1024)) > 0) { //kw 3
+			offset = buffer;
+			offs_len = 0;
+
+			event = (struct inotify_event *)buffer;
+			while ((char *)event - buffer < len) {
+				int event_len = event->len;
+				if (event_len < 0 || event_len > INT_MAX-1) {//kw 3, <len-offs_len
+					slog(MMI_PRINT, SLOG_ERR, "MMI mmi_wifi_thread_function %d!!\n", event_len);
+					break;
+				}
+				for (i = 0; i < WD_NUM; i++) {
+					if (event->wd != file_wd[i].wd) {
+						continue;
+					}
+					mmi_wifiwps_file_operate(file_wd[i].filename);
+					break;
+				}
+				tmp_len = sizeof(struct inotify_event *) + event_len;
+				offs_len += tmp_len;
+				if (offs_len > len)//kw
+					break;
+				event = (struct inotify_event *)(offset + tmp_len);
+				offset += tmp_len;
+			}
+		}
+	}
+
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:create Ï̼߳ì²âwifiÎļþ±ä»¯
+***********************************************************************************/
+static VOID mmi_create_wifi_inotify_thread(VOID)
+{
+	pthread_t mmi_wifi_thread;
+	if (pthread_create(&mmi_wifi_thread, NULL, &mmi_wifi_thread_function, NULL) == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "MMI create wifi thread error!\n");
+		MMI_ASSERT(0);
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "MMI create wifi_thread success!!!\n");
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:MMI wifiÊý¾Ý´«ÊäÑ­»·¼ì²â¶¨Ê±Æ÷KILL£¬  ¹Ø»úºÍÖØÆôʱµ÷ÓÃ
+***********************************************************************************/
+VOID mmi_kill_wifi_data_timer(VOID)
+{
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		mmi_wifi_data_timer_stop();
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:wifiָʾµÆ³õʼ»¯£¬ ÉèÖûص÷º¯Êý
+***********************************************************************************/
+VOID mmi_wifi_init(VOID)
+{
+	mmi_set_wifi_state();
+	mmi_set_wifi_update();
+	mmi_set_qrcode_state();
+	mmi_create_wifi_inotify_thread();
+	mmi_wifi_data_timer_create();
+	if (g_use_wifi_usernum) {
+		mmi_get_wifi_stanum();
+	}
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/readme.txt b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/readme.txt
new file mode 100755
index 0000000..3107ca4
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/platform/zxic_mmi/readme.txt
@@ -0,0 +1,18 @@
+1.ϵͳ¿ò¼Ü£º    
+    MMIͨ¹ý¿ØÖÆLCDÆÁ¡¢LEDµÆ»ò°´¼üÀ´ÊµÏÖÈË»ú½»»¥¹¦ÄÜ£¬Ö÷Òª¸ù¾ÝÒµÎñ״̬¿ØÖÆLEDµÆ¡¢LCDÆÁµÄÏÔʾÏòÓû§Õ¹Ê¾É豸µ±Ç°»ù±¾×´Ì¬£¬¿ÉÒÔͨ¹ý¶Ô°´¼üµÄ¼à¿Ø»ñÈ¡Óû§µÄ²Ù×÷²¢Í¨ÖªÏà¹ØÄ£¿é¡£
+ÓëMMIÄ£¿éÏà¹ØµÄÄ£¿éÓÐwebui £¬wifi£¬fota¡¢at-server, pc-server£¬main_ctrl£¬Çý¶¯µÈ£¬
+
+2.ÄÚ²¿Ïß³Ì:
+    1)	Ö÷ÏûÏ¢´¦ÀíỊ̈߳ºÓÃÓÚ½ÓÊÕWIFI¡¢BLC¡¢AT SERVERµÈÄ£¿é»ò±¾Ä£¿é·¢Ë͵ÄÏûÏ¢¡£³õʼ»¯Ê±´´½¨£¬Í¨¹ýwhile(1)ÂÖѯMMIÏûÏ¢¶ÓÁУ¬»ñÈ¡µ½ÏûÏ¢Ôòµ÷ÓöÔÓ¦µÄ´¦Àíº¯Êý½øÐд¦Àí¡£
+    2)	¼üÅÌÏûÏ¢´¦ÀíỊ̈߳º¸ÃÏß³ÌÊÇÔÚ¼üÅÌÉ豸³õʼ»¯Ê±´´½¨£¬Í¨¹ýÒ»¸öwhile(1)Ñ­»·²»Í£µØ»ñÈ¡°´¼üÐÅÏ¢£¬°üÀ¨°´¼ü״̬¡¢°´¼üÀàÐͺͰ´¼üʱ¼ä£¬ÔÙ¸ù¾Ý°´¼üÐÅÏ¢µ÷Óò»Í¬µÄ°´¼ü´¦Àíº¯Êý¡£
+    3)	³äµç״̬¼à¿ØỊ̈߳ºÍ¨¹ý¼àÌýnetlinkÌ×½Ó×ֱ仯À´»ñÈ¡³äµç¿Ú״̬ÐÅÏ¢£¬½øÐд¦Àí¡£
+    4)	µç³Øµçѹ¼à¿ØỊ̈߳ºÌý¹ý¶¨Ê±Æ÷¶¨Ê±¶ÁÈ¡µ±Ç°µçѹֵ£¬½øÐд¦Àí¡£
+	5)	¿ØÖÆÏß³ÌÊǽéÓÚÒµÎñÏ̺߳ÍÏÔʾÏ̵߳ÄŦ´ø£¬ÓÃÀ´½ÓÊÕÒµÎñÏ̵߳ÄÃüÁ¸ù¾ÝÒµÎñ״̬±ä»¯À´¿ØÖÆ´¥·¢LED¡¢LCDµÄÏÔʾ¸üС£
+	6)	LCDÏÔʾÏß³ÌÊÇÒÀÍÐÓÚZCOREÏÔʾ¿âµÄ´°¿ÚÏÔʾỊ̈߳¬³õʼ»¯Ê±»á´´½¨ÏÔʾ´°¿Ú²¢×¢²áÒ»¸öÏûÏ¢´¦Àíº¯Êý£¬´°¿ÚÏûÏ¢´¦Àíº¯Êý½øÐÐÏûÏ¢´¦Àí½øÐлæÖÆ¡£
+
+3.Íⲿ½»»¥£º
+    MMIÓë¸÷¸öÒµÎñÄ£¿éµÄ½»»¥Ê±Êý¾ÝÐÅÏ¢´«µÝ¶àʹÓÃMSG¡¢NV¡¢Îļþ¼à¿ØµÄ·½Ê½£¬
+	ÓÃÓÚÍⲿ½»»¥µÄÏûÏ¢id¡¢ÃüÁîcmd¼°½á¹¹Ìå±äÁ¿µÈÔÚmmi_msg.hÖж¨Ò壬ģ¿é¿ÉÒÔ½ÓÊÕÀ´×Ôwifi£¬AT-ServerµÈÄ£¿é·¢À´µÄ״̬±ä»¯ÏûÏ¢¡£
+
+4.MMIרÓõĿâzcore£º
+    zcoreÖ÷ҪʵÏÖLCDÆÁºÍ°´¼üÏà¹ØÏûÏ¢´¦Àí¡¢´°¿Ú¹ÜÀí¡¢½çÃæ»æÖƵȡ£	
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/binder/Binder.cpp b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/binder/Binder.cpp
index 6ed3931..8f90699 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/binder/Binder.cpp
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/binder/Binder.cpp
@@ -142,7 +142,7 @@
     object_cleanup_func func)
 {
     Extras* e = reinterpret_cast<Extras*>(
-                    atomic_load_explicit(&mExtras, memory_order_acquire));
+                    atomic_load_explicit(&mExtras, std::memory_order_acquire));
 
     if (!e)
     {
@@ -151,8 +151,8 @@
         if (!atomic_compare_exchange_strong_explicit(
                     &mExtras, &expected,
                     reinterpret_cast<uintptr_t>(e),
-                    memory_order_release,
-                    memory_order_acquire))
+                    std::memory_order_release,
+                    std::memory_order_acquire))
         {
             delete e;
             e = reinterpret_cast<Extras*>(expected);  // Filled in by CAS
@@ -167,7 +167,7 @@
 void* BBinder::findObject(const void* objectID) const
 {
     Extras* e = reinterpret_cast<Extras*>(
-                    atomic_load_explicit(&mExtras, memory_order_acquire));
+                    atomic_load_explicit(&mExtras, std::memory_order_acquire));
     if (!e) return NULL;
 
     AutoMutex _l(e->mLock);
@@ -177,7 +177,7 @@
 void BBinder::detachObject(const void* objectID)
 {
     Extras* e = reinterpret_cast<Extras*>(
-                    atomic_load_explicit(&mExtras, memory_order_acquire));
+                    atomic_load_explicit(&mExtras, std::memory_order_acquire));
     if (!e) return;
 
     AutoMutex _l(e->mLock);
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/binder/include/binder/stdatomic.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/binder/include/binder/stdatomic.h
index 9369982..50a037d 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/binder/include/binder/stdatomic.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/binder/include/binder/stdatomic.h
@@ -33,7 +33,7 @@
 #include <sys/cdefs.h>
 
 
-#if defined(__cplusplus) && defined(_USING_LIBCXX)
+#if defined(__cplusplus) && __cplusplus >= 201103L && __has_include(<atomic>)
 # ifdef __clang__
 #  if __has_feature(cxx_atomic)
 #   define _STDATOMIC_HAVE_ATOMIC
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/binder/liblog/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/binder/liblog/Makefile
index 09eb431..67176c9 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/binder/liblog/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/binder/liblog/Makefile
@@ -37,8 +37,7 @@
 LOCAL_CPPFLAGS += -fPIC -g -O2 -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0 
 LOCAL_CPPFLAGS += -std=c++11
 
-LOCAL_LDLIBS  += -lsclog
-LOCAL_LDLIBS  += -lnvram
+LOCAL_LDLIBS  += 
 #LOCAL_LDFLAGS += -shared
 LDFLAGS += -shared
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/binder/liblog/logd_write.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/binder/liblog/logd_write.c
index 079cfab..ac07ef5 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/binder/liblog/logd_write.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/binder/liblog/logd_write.c
@@ -41,6 +41,10 @@
 #include <private/android_filesystem_config.h>
 
 #include <sys/syscall.h>
+#include <limits.h>
+#include <syslog.h>
+
+
 
 #define LOG_BUF_SIZE 1024
 #define gettid() syscall(__NR_gettid)
@@ -50,7 +54,119 @@
 #include "fake_log_device.h"
 #endif
 
-#include "sc_log.h"
+//??¨¨??¨¤o??¨´¡Á?¨º¡À??
+long long int get_time_us()
+{
+	int fd;
+	char buf[128] = {0};
+	
+	fd = open("/proc/uptime", O_RDWR);
+	if (fd < 0) {
+		printf("fail to open\n");
+		return -1;
+	}
+#if 1
+    int len = read(fd, buf, sizeof(buf)-1);
+    long long time = 0;
+
+    if(len < 0 ){
+		close(fd);
+		return -1;
+    }else{
+		close(fd);
+		time =  atoll(buf); 
+        if(time < 0 || time > LLONG_MAX-1)
+        {
+            time  = 0;
+        }
+
+        return time;
+    }
+#else
+	if (read(fd, buf, 127) > 0) {
+		close(fd);
+		return  atoll(buf);
+	} else {
+		close(fd);
+		return -1;
+	}
+#endif    
+}
+
+int sys_log(char *ident, int prio, const char * fmt, va_list arg)
+{
+	vsyslog(prio, fmt, arg);
+	return 0;
+}
+
+void output_syslog_time(char *mod, int prio)
+{
+	long long time_us = get_time_us();
+	if(time_us >= 0){
+		syslog(prio, "[%lld.%llds]: ", time_us / 1000000, time_us % 1000000);
+	}
+}
+
+
+#define put_to_console(mod, fmt, arg) do {\
+	char buf[1024] = {0}; \
+	snprintf(buf, 1023, "%s[%ld]: ", mod, syscall(SYS_gettid)); \
+	int n = strlen(buf); \
+	va_start(arg, fmt); \
+	vsnprintf(buf+n, 1023-n, fmt, arg); \
+	va_end(arg); \
+	printf("%s",buf); \
+}while(0)
+
+
+#define put_to_syslog(LEVEL) do { \
+	openlog(mod, LOG_PID, LOG_LPR); \
+	va_start(arg, fmt); \
+	sys_log(mod, LOG_##LEVEL, fmt, arg); \
+	va_end(arg); \
+	closelog(); \
+}while(0)
+
+int logd(char *mod, int prio, const char *fmt, ...)
+{
+	va_list arg = {0};
+	int ret = 0;
+
+	if (prio >= ANDROID_LOG_DEBUG && ANDROID_LOG_ERROR <= prio) {
+		switch (prio) {
+			case ANDROID_LOG_DEBUG: {
+				put_to_syslog(DEBUG);
+			}
+			break;
+			
+			case ANDROID_LOG_INFO: {
+				put_to_syslog(NOTICE);
+			}
+			break;
+
+			case ANDROID_LOG_WARN: {
+				put_to_syslog(WARNING);
+			}
+			break;
+
+			case ANDROID_LOG_ERROR: {
+				put_to_syslog(ERR);
+			}
+			break;
+
+			default:
+				break;
+		}
+	}
+
+	if (prio >= ANDROID_LOG_DEBUG && ANDROID_LOG_ERROR <= prio) {
+		put_to_console(mod, fmt, arg);
+	}
+
+	return ret;
+}
+
+
 
 static int __write_to_log_init(log_id_t, struct iovec *vec, size_t nr);
 static int (*write_to_log)(log_id_t, struct iovec *vec, size_t nr) = __write_to_log_init;
@@ -149,7 +265,6 @@
     logd_fd = i;
 #endif
 #endif
-	sc_log_init("MAIN");
     return ret;
 }
 
@@ -297,19 +412,11 @@
 
     return ret;
 #else
-    //printf("%s%s\n", (char*)(vec[1].iov_base), (char*)(vec[2].iov_base));
-	if ( *((int*)vec[0].iov_base) <= ANDROID_LOG_DEBUG)
-	{
-		sc_log_debug("[%s]:%s\n", (char*)(vec[1].iov_base), (char*)(vec[2].iov_base));
-	}
-	else if ( *((int*)vec[0].iov_base) == ANDROID_LOG_INFO)
-	{
-		sc_log_normal("[%s]:%s\n", (char*)(vec[1].iov_base), (char*)(vec[2].iov_base));
-	}
-	else
-	{
-		sc_log_error("[%s]:%s\n", (char*)(vec[1].iov_base), (char*)(vec[2].iov_base));
-	}
+    printf("%s%s\n",(char*)(vec[1].iov_base), (char*)(vec[2].iov_base));
+	int prio = *(int*)(vec[0].iov_base);
+	char* mode = (char*)(vec[1].iov_base);
+	char* buf = (char*)(vec[2].iov_base);
+	logd(mode, prio, buf);
 
 #endif
 }
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/gpio.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/gpio.h
old mode 100644
new mode 100755
index 4a15109..ac0ac83
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/gpio.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/gpio.h
@@ -850,6 +850,7 @@
 	/**< The internal pull-up bias is enabled. */
 	GPIOD_LINE_BIAS_PULL_DOWN,
 	/**< The internal pull-down bias is enabled. */
+	GPIOD_LINE_DRIVE_STRENGTH,
 };
 
 /**
@@ -1000,6 +1001,10 @@
 	/**< The line has pull-down resistor enabled. */
 	GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_UP	= GPIOD_BIT(5),
 	/**< The line has pull-up resistor enabled. */
+
+	/* sanechips added */
+	GPIOD_LINE_REQUEST_FLAG_DRIVE_STRENGTH	= GPIOD_BIT(13),
+	
 };
 
 /**
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/sc_eth.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/sc_eth.c
old mode 100644
new mode 100755
index 37d30f8..1038b49
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/sc_eth.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/sc_eth.c
@@ -110,7 +110,7 @@
 

 int dump_link_usettings(struct ethtool_link_usettings *link_usettings, struct sc_eth_info *info)

 {

-    printf("[%s] speed = %d\n", __func__, link_usettings->base.speed);

+//    printf("[%s] speed = %d\n", __func__, link_usettings->base.speed);

 	if (link_usettings->base.speed == 0

 		|| link_usettings->base.speed == (u16)(-1)

 		|| link_usettings->base.speed == (u32)(-1))

@@ -147,13 +147,19 @@
 		info->autoneg = SC_ETH_AUTONEG_OFF;

 	else

 		info->autoneg = SC_ETH_AUTONEG_ON;

+    

+    if (link_usettings->base.reserved1[0] == 0)

+        info->link = SC_ETH_LINK_DOWN;

+    else

+        info->link = SC_ETH_LINK_UP;

+        

 

 	return 0;

 }

 

 int sc_eth_enable(void)

 {

-    printf("[%s]\n", __func__);

+//    printf("[%s]\n", __func__);

     struct ifreq ifr;

     int fd = -1;

 

@@ -172,7 +178,7 @@
 

 int sc_eth_disable(void)

 {

-    printf("[%s]\n", __func__);

+//    printf("[%s]\n", __func__);

     struct ifreq ifr;

     int fd = -1;

 

@@ -194,7 +200,7 @@
     struct ethtool_link_usettings *link_usettings;

     int ret = 0;    

 

-    printf("[%s]\n", __func__);

+//    printf("[%s]\n", __func__);

 

     ctx.devname = "eth0";

     memset(&ctx.ifr, 0, sizeof(ctx.ifr));

@@ -233,7 +239,7 @@
     struct ethtool_link_usettings *link_usettings;

     int ret = 0;    

 

-    printf("[%s]\n", __func__);

+//    printf("[%s]\n", __func__);

 

 	memset(&info, 0, sizeof(struct sc_eth_info));

 

@@ -270,7 +276,7 @@
     struct ethtool_link_usettings *link_usettings;

     int ret = 0;    

 

-    printf("[%s]\n", __func__);

+//    printf("[%s]\n", __func__);

 

     ctx.devname = "eth0";

     memset(&ctx.ifr, 0, sizeof(ctx.ifr));

@@ -316,7 +322,7 @@
     struct ethool_link_usettings *link_usettings;

     int ret = 0;    

 

-    printf("[%s]\n", __func__);

+//    printf("[%s]\n", __func__);

 

 	memset(&info, 0, sizeof(struct sc_eth_info));

 

@@ -337,7 +343,7 @@
 		return -1;

 	}

 

-    printf("before dump_link_usettings\n");

+//    printf("before dump_link_usettings\n");

 

 	ret = dump_link_usettings(link_usettings, &info);

 	free(link_usettings);

@@ -347,7 +353,7 @@
 

 	memcpy(speed, &info.speed, sizeof(E_ETH_SPEED));

 

-    printf("[%s] exit:speed = %d\n", __func__, *speed);

+//    printf("[%s] exit:speed = %d\n", __func__, *speed);

 

     return 0;

 }

@@ -358,7 +364,7 @@
     struct ethtool_link_usettings *link_usettings;

     int ret = 0;    

 

-    printf("[%s]\n", __func__);

+//    printf("[%s]\n", __func__);

 

     ctx.devname = "eth0";

     memset(&ctx.ifr, 0, sizeof(ctx.ifr));

@@ -398,7 +404,7 @@
     struct ethool_link_usettings *link_usettings;

     int ret = 0;    

 

-    printf("[%s]\n", __func__);

+//    printf("[%s]\n", __func__);

 

 	memset(&info, 0, sizeof(struct sc_eth_info));

 

@@ -515,7 +521,7 @@
     struct interface ife;

     int ret = 0;    

 

-    printf("[%s]\n", __func__);

+//    printf("[%s]\n", __func__);

 

 	memset(&local_info, 0, sizeof(struct sc_eth_info));

 

@@ -556,195 +562,3 @@
     return 0;

 }

 

-#if 0

-int sc_i2c_open(const char *port, int flags)

-{

-    int fd = 0;

-	int ret = 0;

-    if (NULL == port) {

-		printf("[%s] open failed, port should not null\n", __func__);

-		return -1;

-	}

-

-    fd = open(port, flags);

-	if (fd < 0) {

-		printf("[%s] open failed, fd = %d\n", __func__, fd);

-        return ret;

-	} else 

-		printf("[%s] open sunccess\n", __func__);    

-

-	return fd;

-}

-

-int sc_i2c_close(int fd)

-{

-    int ret = 0;

-	if (fd < 0) {

-        printf("[%s] close failed, port should not smaller 0\n", __func__);

-		return -1;

-	}

-

-	ret = close(fd);

-	if (ret < 0) {

-	    printf("[%s] open failed, fd = %d\n", __func__, fd);

-		return ret;

-	} else 

-		printf("[%s] close sunccess\n", __func__);

-

-	return ret; 

-}

-

-int sc_i2c_write(int fd, u32 slave_addr, u32 mem_addr, u8 *pdata, u8 len)

-{

-    int i = 0;

-	int ret = 0;

-	char sendbuffer[2] = {0};

-//	memcpy(sendbuffer + 1, pdata, len);

-//	sendbuffer[0] = mem_addr;

-

-	if (fd < 0) {

-		printf("[%s] write failed, port should not smaller 0\n", __func__);

-		return -1;

-	}

-

-	if (NULL == pdata) {

-		printf("[%s] write failed, pdata should not NULL\n", __func__);

-        return -1;

-	}

-

-	if (len < 1) {

-	    printf("[%s] write failed, len should not smaller 1\n", __func__);

-	    return -1;

-	}

-	

-	ret = ioctl(fd, I2C_TENBIT, 0);

-	if (ret < 0) {		

-	    printf("[%s] write failed, ioctl failed I2C_TENBIT\n", __func__);

-		return ret;

-	}

-	

-	ret = ioctl(fd, I2C_SLAVE_FORCE, slave_addr);

-	if (ret < 0) {	

-	    printf("[%s] write failed, ioctl failed I2C_SLAVE_FORCE\n", __func__);

-		return ret;

-	}

-

-	for (i = 0; i < len; i++) {

-		sendbuffer[0] = mem_addr + i;

-		sendbuffer[1] = pdata[i];

-		ret = write(fd, sendbuffer, 2);

-		if (ret < 2) {

-			printf("[%s] write failed\n", __func__);

-			return -1;

-		}

-	}

-	

-#if 0

-	ret = write(fd, sendbuffer, len + 1);

-	if (ret < 2) {

-		printf("[%s] write failed\n", __func__);

-		return -1;

-	}	

-#endif

-

-	return 0;

-

-//	printf("write %d byte at 0x%02x\n", ret, mem_addr);	

-}

-

-int sc_i2c_read(int fd, u32 slave_addr, u32 mem_addr, u8 *pdata, u8 len)

-{

-    int i = 0;

-	int ret = 0;

-	u32 addr = mem_addr;

-

-    ret = ioctl(fd, I2C_TENBIT, 0);

-	if (ret < 0) {		

-	    printf("[%s] read failed, ioctl failed I2C_TENBIT\n", __func__);

-		return ret;

-	}

-	

-	ret = ioctl(fd, I2C_SLAVE_FORCE, slave_addr);

-	if (ret < 0) {	

-	    printf("[%s] read failed, ioctl failed I2C_SLAVE_FORCE\n", __func__);

-		return ret;

-	}

-

-    for (i = 0; i < len ; i++) {

-//		addr = addr + i;

-		ret = write(fd, &addr, 1);

-	    if (ret != 1) {

-            return -1;

-	    }

-

-		ret = read(fd, &pdata[i], 1);

-		if (ret < 0) {

-	        return ret;

-		}

-		addr++;

-	}

-	

-#if 0

-	ret = write(fd, &mem_addr, 1);

-	if (ret != 1) {

-        return -1;

-	}

-

-	ret = read(fd, pdata, len);

-	if (ret < 0) {

-        return ret;

-	}

-#endif

-

-//	for (i = 0; i < ret; i++) {

-//        printf("read %d data is : 0x%02x\n", i, pdata[i]);

-//	}

-

-	return 0;

-}

-

-int sc_i2c_ioctl(int fd, u32 cmd, void *pvalue)

-{  

-    int ret = 0;

-	u32 args = 0;

-    struct i2c_ioctl_args *ioctl_args = NULL;

-

-    if (fd < 0) {

-        return -1;

-	}

-

-    if (NULL == pvalue) {

-        return -1;

-	}

-

-	if ((cmd != I2C_RETRIES) || (cmd != I2C_TIMEOUT) || (cmd != I2C_SLAVE) ||

-	    (cmd != I2C_SLAVE_FORCE) || (cmd != I2C_TENBIT))

-	

-	ioctl_args = (struct i2c_ioctl_args *)pvalue;

-	switch (cmd) {

-        case I2C_RETRIES:

-			args = ioctl_args->retries;

-	        break;

-		case I2C_TIMEOUT:

-			args = ioctl_args->timeout;

-	        break;

-		case I2C_SLAVE:

-			args = ioctl_args->slave;

-	        break;	

-		case I2C_SLAVE_FORCE:

-			args = ioctl_args->slave_force;

-	        break;

-		case I2C_TENBIT:

-			args = ioctl_args->ten_bit;

-	        break;

-		default:

-			break;

-	}

-	

-	ret = ioctl(fd, cmd, args);

-	if (ret < 0) {

-		printf("ioctl failed!\n");

-        return ret;

-	}

-}

-#endif

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/sc_eth.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/sc_eth.h
old mode 100644
new mode 100755
index c6c6e29..49a770e
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/sc_eth.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/sc_eth.h
@@ -121,10 +121,16 @@
     SC_ETH_DUPLEX_HALF,

 } E_ETH_DUPLEX;

 

+typedef enum {

+    SC_ETH_LINK_DOWN = 0,

+    SC_ETH_LINK_UP,

+} E_ETH_LINK;

+

 struct sc_eth_info {

     E_ETH_AUTONEG autoneg;

     E_ETH_SPEED speed;

     E_ETH_DUPLEX duplex;

+    E_ETH_LINK link;

     unsigned long tx_bytes;

     unsigned long rx_bytes;

     unsigned long tx_pkts;

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/sc_gpio.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/sc_gpio.c
old mode 100644
new mode 100755
index 8ce5440..eb88484
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/sc_gpio.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/sc_gpio.c
@@ -19,6 +19,8 @@
 

 #include "gpio.h"

 

+#define GPIOHANDLE_REQUEST_DRIVE_STRENGTH (1UL << 8) /* sanechips */

+

 /*

  * These are symbols first available in linux v5.5. In order to allow to build

  * libgpiod with kernel headers as early as v4.8 we redefine them here for pre

@@ -1549,10 +1551,17 @@
 int sc_gpio_uninit(void *handle)

 {

 	struct gpiod_line *line = (struct gpiod_line *)handle;

+	struct gpiod_chip *chip;

+	unsigned int offset;

 

 	if (line) {

+		chip = line->chip;

+		offset = line->offset;

+

 		gpiod_line_release(line);

-		free(line);		

+		free(line);

+

+		chip->lines[offset] = NULL;

 	}

 

 	return 0;	

@@ -1717,3 +1726,64 @@
 }

 

 

+/*

+ *  gpio set drive strength

+ *

+ *  handle      :  gpio handle by sc_gpio_init

+ *  strength    :  a gpio's drive strength setting

+ *

+ *  return 0 if succeed, others failed

+ */

+int sc_gpio_strength_set(void *handle, int strength)

+{

+	struct gpiod_line *line = (struct gpiod_line *)handle;

+	struct gpiohandle_config hcfg;

+	int fd;

+

+	if (!line) {

+		return -EINVAL;

+	}

+

+	memset(&hcfg, 0, sizeof(hcfg));

+

+	hcfg.flags = GPIOHANDLE_REQUEST_DRIVE_STRENGTH;

+	hcfg.padding[0] = strength;

+

+	fd = line_get_fd(line);

+

+	return ioctl(fd, GPIOHANDLE_SET_CONFIG_IOCTL, &hcfg);

+}

+

+/*

+ *  gpio get drive strength

+ *

+ *  handle      :  gpio handle by sc_gpio_init

+ *  pull_sel    :  a gpio's drive strength setting

+ *

+ *  return 0 if succeed, others failed

+ */

+int sc_gpio_strength_get(void *handle, int *strength)

+{

+	struct gpiod_line *line = (struct gpiod_line *)handle;

+	struct gpio_v2_line_info lineinfo;

+

+	if (!line) {

+		return -EINVAL;

+	}

+

+	memset(&lineinfo, 0, sizeof(lineinfo));

+

+	lineinfo.flags = GPIOHANDLE_REQUEST_DRIVE_STRENGTH;

+	lineinfo.offset = line->offset;

+//	printf("sc_gpio_strength_get offset:%d\n", line->offset);

+

+	if(ioctl(line->chip->fd, GPIO_V2_GET_LINEINFO_IOCTL, &lineinfo)) {

+//		printf("sc_gpio_strength_get failed, %d \n", errno);

+		return -1;

+	}

+

+	*strength = lineinfo.padding[0];

+

+	return 0;

+}

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/sc_gpio.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/sc_gpio.h
old mode 100644
new mode 100755
index 2424101..e81a7f1
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/sc_gpio.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libbsp/sc_gpio.h
@@ -92,6 +92,25 @@
  */
 int sc_gpio_pullsel_get(void *handle, int *pull_sel);
 
+/*
+ *  gpio set drive strength
+ *
+ *  handle      :  gpio handle by sc_gpio_init
+ *  strength    :  a gpio's drive strength setting
+ *
+ *  return 0 if succeed, others failed
+ */
+int sc_gpio_strength_set(void *handle, int strength);
+
+/*
+ *  gpio get drive strength
+ *
+ *  handle      :  gpio handle by sc_gpio_init
+ *  pull_sel    :  a gpio's drive strength setting
+ *
+ *  return 0 if succeed, others failed
+ */
+int sc_gpio_strength_get(void *handle, int *strength);
 
 #ifdef __cplusplus
 } /* extern "C" */
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libscipc/sc_ipc.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libscipc/sc_ipc.c
index 4e9e6d8..d6ea6b5 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libscipc/sc_ipc.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libscipc/sc_ipc.c
@@ -112,8 +112,31 @@
 static int sc_ipc_create_msg_fd(char* name)

 {

     int ret = 0;

-    int key = MODULE_ID_SDK_DYNAMIC_BASE;

+    int key = MODULE_ID_SDK_DYNAMIC_BASE+1;

+	

+	//wifiµ¥¶À·þÎñ¶Ë

+	if (strcmp(name, "wifi_proxy_ipc") == 0) {

+		if ((ret = msgget(MODULE_ID_WLAN_PROXY, IPC_CREAT|IPC_EXCL| 0600)) < 0) {

+			SCLOGE("No MSG-QUEUE can be used!\n");

+			return ret;

+		}

+		s_local_key = MODULE_ID_WLAN_PROXY;

+	    return ret;

+	}

 

+	//whitelistµ¥¶À·þÎñ¶Ë

+	if (strcmp(name, "mnet_whitelist_proxy_ipc") == 0) {

+		if ((ret = msgget(MODULE_ID_MNET_WHITELIST_PROXY, IPC_CREAT|IPC_EXCL| 0600)) < 0) {

+			SCLOGE("No MSG-QUEUE can be used!\n");

+			return ret;

+		}

+		s_local_key = MODULE_ID_MNET_WHITELIST_PROXY;

+	    return ret;

+	}

+

+	if (0 == strcmp(name, "telecom-server"))

+		key = MODULE_ID_SDK_DYNAMIC_BASE;

+	

 	/* ´´½¨ SDK-CLIENT ÏûÏ¢¶ÓÁУ¬Ê¹ÓÃÍêºóɾ³ý */

 	while((ret = msgget(key, IPC_CREAT|IPC_EXCL| 0600)) < 0)

 	{

@@ -227,8 +250,7 @@
     sc_ipc_event_ex *pevt = 0;

 	char* p = (char *)param;

 	char name[64];

-    int ret = 0;

-	

+    

     sc_ipc_event_init();

 

 	memset(name, 0, sizeof(name));

@@ -253,23 +275,14 @@
 	

     for(;;)

     {

-		ret = 0;

-		memset(pmsg, 0, sizeof(*pmsg));

+        memset(pmsg, 0, sizeof(*pmsg));

         pmsg->fd_svr = s_local_fd;

         pmsg->data_len = SC_IPC_MSG_PAYLOAD_SIZE;

-        ret = sc_ipc_recv_msg(pmsg);

-		if (ret >= 0)

-		{

-			MUTEX_ACQUIRE();

-        	handle_ipc_event(pmsg);

-        	MUTEX_RELEASE();

-		}

-		else

-		{

-			if(errno != EINTR)

-                SCLOGE("sc_ipc_inner_event_loop: errno = %d, errmsg = %s\n", errno,strerror(errno));

-		}

-        

+        sc_ipc_recv_msg(pmsg);

+

+        MUTEX_ACQUIRE();

+        handle_ipc_event(pmsg);

+        MUTEX_RELEASE();

         if(!s_started)

         {

         	SCLOGE("Warning:The thread(%s) is term!\n",name);

@@ -388,6 +401,11 @@
 

 int sc_ipc_get_key_by_name(char* name)

 {

+	//wifiµ¥¶À·þÎñ¶Ë

+	if (strcmp(name, "wifi_proxy_ipc") == 0) {

+		return MODULE_ID_WLAN_PROXY;

+	}

+

     return MODULE_ID_SDK_DYNAMIC_BASE;

 }

 

@@ -401,6 +419,16 @@
 

     return s_remote_fd;

 #else

+	//wifiµ¥¶À·þÎñ¶Ë

+	if (name && (strcmp(name, "wifi_proxy_ipc") == 0)) {

+		return MODULE_ID_WLAN_PROXY;

+	}

+	

+	//wifiµ¥¶À·þÎñ¶Ë

+	if (name && (strcmp(name, "mnet_whitelist_proxy_ipc") == 0)) {

+		return MODULE_ID_MNET_WHITELIST_PROXY;

+	}

+

     return MODULE_ID_SDK_DYNAMIC_BASE;//-1;

 #endif

 }

@@ -472,6 +500,11 @@
 	pmsg->type = 1;

 	pmsg->token = s_ipc_msg_cnt++;

 	msg_fd = msgget(pmsg->fd_svr, 0);

+    if(0 > msg_fd)

+    {

+        SCLOGE("sc_ipc_send_msg failed(0x%x)\n", errno);

+        return -1;

+    }

     ret = msgsnd(msg_fd, pmsg, sizeof(sc_ipc_msg)-sizeof(long)+pmsg->data_len, 0);

     /* Todo : fragment process. */

 

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/Makefile
index 34d8224..9618910 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/Makefile
@@ -10,7 +10,7 @@
 LIB_SHARED = libsctel.so
 
 OBJS += $(patsubst %.c,%.o,$(wildcard ./call/*.c ./sim/*.c ./data/*.c ./at/*.c ./nw_mgr/*.c ./sms/*.c ./rtc_timer/*.c ./mnet/*.c ./mnet_whitelist/*.c))
-OBJS += $(patsubst %.c,%.o,$(wildcard ./audio/*.c))
+OBJS += $(patsubst %.c,%.o,$(wildcard ./audio/*.c ./wifi/*.c))
 
 CFLAGS += -I$(zte_app_path)/zte_comm/at_ctl/inc
 CFLAGS += -I$(APP_DIR)/include/sctel
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/call/sc_call.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/call/sc_call.c
index 36eadd5..f66777e 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/call/sc_call.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/call/sc_call.c
@@ -348,7 +348,8 @@
 			ret = SC_ERR_FAIL;

 		}

 	}

-	

+

+	sccall_ipcmsg_free(conn_req_msg);

 	sccall_ipcmsg_free(conn_rsp_msg);

 	

 	return ret;

@@ -386,7 +387,7 @@
 	}

 	

 	sccall_ipcmsg_free(cc_req_msg);

-	

+	sccall_ipcmsg_free(cc_rsp_msg);

 	return ret;

 }

 

@@ -420,7 +421,8 @@
 		}	

 	}

 

-	sccall_ipcmsg_free(dial_req_msg);	

+	sccall_ipcmsg_free(dial_req_msg);

+	sccall_ipcmsg_free(dial_rsp_msg);

 	return ret;

 }

 

@@ -482,7 +484,8 @@
 		}

 	}

 

-	sccall_ipcmsg_free(fw_req_msg);	

+	sccall_ipcmsg_free(fw_req_msg);

+	sccall_ipcmsg_free(fw_rsp_msg);

 	return ret;

 }

 

@@ -524,7 +527,8 @@
 		}

 	}

 

-	sccall_ipcmsg_free(fw_status_req_msg); 

+	sccall_ipcmsg_free(fw_status_req_msg);

+	sccall_ipcmsg_free(fw_status_rsp_msg);

 	return ret;

 }

 

@@ -560,7 +564,8 @@
 		}

 	}

 

-	sccall_ipcmsg_free(wait_req_msg); 

+	sccall_ipcmsg_free(wait_req_msg);

+	sccall_ipcmsg_free(wait_rsp_msg);

 	return ret;

 }

 

@@ -591,7 +596,8 @@
 		}

 	}

 

-	sccall_ipcmsg_free(wait_status_req_msg); 

+	sccall_ipcmsg_free(wait_status_req_msg);

+	sccall_ipcmsg_free(wait_status_rsp_msg);

 	return ret;

 }

 

@@ -628,7 +634,8 @@
 		}

 	}

 

-	sccall_ipcmsg_free(dtmf_req_msg); 

+	sccall_ipcmsg_free(dtmf_req_msg);

+	sccall_ipcmsg_free(dtmf_rsp_msg);

 	return ret;

 }

 

@@ -665,7 +672,7 @@
 	}

 	

 	sccall_ipcmsg_free(records_req_msg);

-	

+	sccall_ipcmsg_free(records_rsp_msg);

 	return ret;

 }

 /*******************************************************************************

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/include/sc_mnet_whitelist.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/include/sc_mnet_whitelist.h
index 69c24a9..2ffbdce 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/include/sc_mnet_whitelist.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/include/sc_mnet_whitelist.h
@@ -42,21 +42,25 @@
  ******************************************************************************/

 

 typedef enum{

-	MNET_WHITELIST_CMD_ID_BASE,

+	MNET_WHITELIST_CMD_BASE,

 	//ºô½Ð¿ØÖÆ

-	MNET_WHITELIST_CMD_DIAL_ID,

+	MNET_WHITELIST_CMD_CC,

 	//ÍøÂç·þÎñ¿ØÖÆ

-	MNET_WHITELIST_CMD_NET_ID,

+	MNET_WHITELIST_CMD_NET_SERVICE,

+	//GPRS ÃüÁî

+	MNET_WHITELIST_CMD_GPRS,

 	//¶ÌÏûÏ¢

-	MNET_WHITELIST_CMD_MSG_ID,

-	MNET_WHITELIST_CMD_ID_MAX

-}sc_mnet_whitelist_filter_cmd_e;

+	MNET_WHITELIST_CMD_MSG,

+	//VOLTE

+	MNET_WHITELIST_CMD_VOLTE,

+	MNET_WHITELIST_CMD_MAX

+}sc_mnet_whitelist_cmd_e;

 

 typedef struct

 {

-	sc_mnet_whitelist_filter_cmd_e type_id;

+	sc_mnet_whitelist_cmd_e cmd_id;

 	char cmd[SC_TEL_MAX_STR_LEN];

-}sc_mnet_whitelist_enum_cmd_pair;

+}sc_mnet_whitelist_pair;

 

 

 /*******************************************************************************

@@ -68,29 +72,81 @@
  ******************************************************************************/

 

 /**

- * @brief Ö÷¶¯Éϱ¨°×Ãûµ¥Ìí¼Ó¡£

- * @param (in) id ¶ÔÓ¦sc_inform_filter_cmd_eÖÐid£¬Ä¿Ç°Ö§³Öºô½Ð¿ØÖÆ¡¢ÍøÂç·þÎñ¿ØÖƺͶÌÏûÏ¢Ïà¹ØÖ÷¶¯Éϱ¨id¡£

+ * @brief Ö÷¶¯Éϱ¨°×Ãûµ¥³õʼ»¯¡£

+ * @param (in) ÎÞ¡£

  * @param (out) ÎÞ¡£

  * @return	0 - ³É¹¦

  *			ÆäËüʧ°Ü:

  * @note ×¢ÊÍ

  *		 ×¢ÊÍ¡£

  */

+int sc_mnet_whitelist_init();

 

+/**

+ * @brief Ö÷¶¯Éϱ¨°×Ãûµ¥È¥³õʼ»¯¡£

+ * @param (in) ÎÞ¡£

+ * @param (out) ÎÞ¡£

+ * @return	0 - ³É¹¦

+ *			ÆäËüʧ°Ü:

+ * @note ×¢ÊÍ

+ *		 ×¢ÊÍ¡£

+ */

+int sc_mnet_whitelist_deinit();

+

+/**

+ * @brief Ö÷¶¯Éϱ¨°×Ãûµ¥»ñÈ¡¡£

+ * @param (in) ÎÞ¡£

+ * @param (out) ÎÞ¡£

+ * @return	0 - ³É¹¦

+ *			ÆäËüʧ°Ü:

+ * @note ×¢ÊÍ

+ *		 ×¢ÊÍ¡£

+ */

+char* sc_mnet_whitelist_get();

+

+/**

+ * @brief Ö÷¶¯Éϱ¨°×Ãûµ¥Ìí¼Ó¡£

+ * @param (in) id ¶ÔÓ¦sc_mnet_whitelist_cmd_eÖÐid£¬Ä¿Ç°Ö§³Öºô½Ð¿ØÖÆ¡¢ÍøÂç·þÎñ¿ØÖƺͶÌÏûÏ¢Ïà¹ØÖ÷¶¯Éϱ¨id¡£

+ * @param (out) ÎÞ¡£

+ * @return	0 - ³É¹¦

+ *			ÆäËüʧ°Ü:

+ * @note ×¢ÊÍ

+ *		 ×¢ÊÍ¡£

+ */

 int sc_mnet_whitelist_add(int id);

 

 /**

- * @brief Ö÷¶¯Éϱ¨°×Ãûµ¥É¾³ý¡£

- * @param (in) id ¶ÔÓ¦sc_inform_filter_cmd_eÖÐid£¬Ä¿Ç°Ö§³Öºô½Ð¿ØÖÆ¡¢ÍøÂç·þÎñ¿ØÖƺͶÌÏûÏ¢Ïà¹ØÖ÷¶¯Éϱ¨id¡£

+ * @brief Ö÷¶¯Éϱ¨°×Ãûµ¥Ìí¼Ó¡£

+ * @param (cmd) cmd Ìí¼ÓµÄÖ÷¶¯Éϱ¨ÃüÁ¸ñʽ±ØÐëÊÇ+creg+»òÕß+creg+cgreg+^mode+,×Öĸ´óСд¶¼¿ÉÒÔ;

  * @param (out) ÎÞ¡£

  * @return	0 - ³É¹¦

  *			ÆäËüʧ°Ü:

  * @note ×¢ÊÍ

  *		 ×¢ÊÍ¡£

  */

+int sc_mnet_whitelist_insert(char* cmd);

 

+/**

+ * @brief Ö÷¶¯Éϱ¨°×Ãûµ¥É¾³ý¡£

+ * @param (in) id ¶ÔÓ¦sc_mnet_whitelist_cmd_eÖÐid£¬Ä¿Ç°Ö§³Öºô½Ð¿ØÖÆ¡¢ÍøÂç·þÎñ¿ØÖƺͶÌÏûÏ¢Ïà¹ØÖ÷¶¯Éϱ¨id¡£

+ * @param (out) ÎÞ¡£

+ * @return	0 - ³É¹¦

+ *			ÆäËüʧ°Ü:

+ * @note ×¢ÊÍ

+ *		 ×¢ÊÍ¡£

+ */

 int sc_mnet_whitelist_del(int id);

 

+/* * @brief Ö÷¶¯Éϱ¨°×Ãûµ¥É¾³ý¡£

+ * @param (in) cmd Ìí¼ÓµÄÖ÷¶¯Éϱ¨ÃüÁ¸ñʽ±ØÐëÊÇ+creg+»òÕß+creg+cgreg+^mode+,×Öĸ´óСд¶¼¿ÉÒÔ;

+ * @param (out) ÎÞ¡£

+ * @return	0 - ³É¹¦

+ *			ÆäËüʧ°Ü:

+ * @note ×¢ÊÍ

+ *		 ×¢ÊÍ¡£

+ */

+int sc_mnet_whitelist_erase(char* cmd);

+

 /**

  * @brief Ö÷¶¯Éϱ¨°×Ãûµ¥Çå³ý¡£

  * @param (in) ÎÞ¡£

@@ -106,4 +162,4 @@
 }

 #endif

 

-#endif // _SC_MNET_WHITELIST_H
\ No newline at end of file
+#endif // _SC_MNET_WHITELIST_H

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/include/sc_tel_types.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/include/sc_tel_types.h
index fb020fb..86b4a37 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/include/sc_tel_types.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/include/sc_tel_types.h
@@ -51,6 +51,13 @@
  * @param SC_ERR_NO_MEMORY ÄÚ´æ·ÖÅäʧ°Ü¡£

  * @param SC_ERR_BADPARAM  ²ÎÊý´íÎó¡£

  * @param SC_ERR_NOT_SUPPORT  ²»Ö§³Ö¡£ 

+ * @param SC_ERR_NOT_READY  Ïà¹Ø·þÎñδ׼±¸ºÃ¡£ 

+ * @param SC_ERR_NO_DEVICE ûÓÐÏà¹ØµÄÇý¶¯É豸¡£

+ * @param SC_ERR_NO_MAC ûÓÐmacµØÖ·¡£

+ * @param SC_ERR_IPC ½ø³Ì¼äÏûϢʧ°Ü¡£

+ * @param SC_ERR_SOC ºË¼äÏûϢʧ°Ü¡£

+ * @param SC_ERR_CONDITION Ìõ¼þ²»Âú×ã¡£

+ * @param SC_ERR_BUSY É豸æ¡£

  */

 typedef enum _SC_ERR_ENUM_TYPE{

 	SC_ERR_SUCCESS = 0,

@@ -58,6 +65,13 @@
 	SC_ERR_NO_MEMORY = 2,

 	SC_ERR_BADPARAM  = 3,

 	SC_ERR_NOT_SUPPORT  = 4,

+	SC_ERR_NOT_READY  = 5,

+	SC_ERR_NO_DEVICE  = 6,

+	SC_ERR_NO_MAC  = 7,

+	SC_ERR_IPC  = 8,

+	SC_ERR_SOC  = 9,

+	SC_ERR_CONDITION  = 10,

+	SC_ERR_BUSY  = 11,

 } SC_ERR_TYPE;

 

 /**

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/include/sc_wifi.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/include/sc_wifi.h
index 1f4faa0..9556eee 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/include/sc_wifi.h
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/include/sc_wifi.h
@@ -22,6 +22,10 @@
 #include <stdio.h>

 #include <unistd.h>

 

+#include <sys/socket.h>

+#include <netinet/in.h>

+#include <arpa/inet.h>

+

 #ifdef __cplusplus

 extern "C" {

 #endif

@@ -30,11 +34,221 @@
  *                             Macro definitions                               *

  ******************************************************************************/

 

+#define SC_WIFI_MAX_SCAN_INFO_CNT 30

 

 /*******************************************************************************

  *                             Type definitions                                *

  ******************************************************************************/

+typedef enum

+{

+	SC_WIFI_STATUS_DISABLED = 0,

+	SC_WIFI_STATUS_ENABLED,

+	SC_WIFI_STATUS_INVALID_MAC,

+	SC_WIFI_STATUS_DEV_INIT_FAIL,

+} sc_wifi_enable_status_e;

 

+typedef void (*sc_wifi_enable_status_ind_cb_f)(sc_wifi_enable_status_e pre_status, sc_wifi_enable_status_e status);

+

+

+typedef enum

+{

+	SC_WIFI_WORK_MODE_MIN = -1,

+	SC_WIFI_WORK_MODE_AP0 = 0,

+	SC_WIFI_WORK_MODE_AP0_STA,

+	SC_WIFI_WORK_MODE_MAX

+} sc_wifi_work_mode_e;

+

+

+typedef enum

+{

+	SC_WIFI_AP_INDEX_MIN = -1,

+	SC_WIFI_AP_INDEX_AP0 = 0,

+	//SC_WIFI_AP_INDEX_AP1,

+	SC_WIFI_AP_INDEX_MAX

+} sc_wifi_ap_index_e;

+

+

+typedef enum

+{

+	SC_WIFI_AP_MODE_MIN = -1,

+	SC_WIFI_AP_MODE_80211BGN = 0,

+	SC_WIFI_AP_MODE_80211BGNAX_2G,

+	//SC_WIFI_AP_MODE_80211B = 0,

+	//SC_WIFI_AP_MODE_80211BG,

+	//SC_WIFI_AP_MODE_80211BGN,

+	//SC_WIFI_AP_MODE_80211AX_2G,

+	//SC_WIFI_AP_MODE_80211A,

+	//SC_WIFI_AP_MODE_80211AN,

+	//SC_WIFI_AP_MODE_80211AC,

+	//SC_WIFI_AP_MODE_80211AX_5G,

+	SC_WIFI_AP_MODE_MAX

+} sc_wifi_ap_mode_type_e;

+

+

+typedef enum SC_WIFI_BANDWIDTH_ENUM

+{

+	SC_WIFI_BANDWIDTH_MIN = -1,

+	SC_WIFI_BANDWIDTH_20MHZ = 0,

+	SC_WIFI_BANDWIDTH_20_40MHZ,

+	//SC_WIFI_BANDWIDTH_80MHZ,

+	//SC_WIFI_BANDWIDTH_160MHZ,

+	SC_WIFI_BANDWIDTH_MAX

+} sc_wifi_bandwidth_e;

+

+typedef enum

+{

+	SC_WIFI_MAC_ACL_RULE_MIN = -1,

+	SC_WIFI_MAC_ACL_RULE_NONE = 0,

+	SC_WIFI_MAC_ACL_RULE_WHITE,

+	SC_WIFI_MAC_ACL_RULE_BLACK,

+	SC_WIFI_MAC_ACL_RULE_MAX

+} sc_wifi_mac_acl_rule_e;

+

+typedef enum

+{ 

+	SC_WIFI_AUTH_MIN = -1,

+	SC_WIFI_AUTH_OPEN = 0,

+	//SC_WIFI_AUTH_WEP,

+	//SC_WIFI_AUTH_WPA_PSK,

+	SC_WIFI_AUTH_WPA2_PSK, //AES

+	SC_WIFI_AUTH_WPA3_PSK, //AES

+	SC_WIFI_AUTH_WPA_WPA2_PSK_BOTH, //TKIP & AES

+	SC_WIFI_AUTH_WPA2_WPA3_PSK_BOTH, //AES

+	//SC_WIFI_AUTH_WPA_WPA2_WPA3_PSK_ALL,

+	SC_WIFI_AUTH_MAX

+} sc_wifi_auth_e;

+

+typedef enum

+{

+	SC_WIFI_AUTH_WPA_PAIRWISE_MIN = -1,

+	SC_WIFI_AUTH_WPA_PAIRWISE_AUTO = 0, //TKIP & AES

+	SC_WIFI_AUTH_WPA_PAIRWISE_TKIP,

+	SC_WIFI_AUTH_WPA_PAIRWISE_AES,

+	SC_WIFI_AUTH_WPA_PAIRWISE_MAX

+} sc_wifi_auth_wpa_psk_e;

+

+typedef struct

+{

+	sc_wifi_auth_e auth;

+	//sc_wifi_auth_wpa_psk_e pairwise;

+	char passwd[64 + 1];

+	//int group_rekey;

+} sc_wifi_ap_auth_t;

+

+//chang du bu yi zhi shi, yong dang qian zui da chang du cun jiu shi le

+typedef struct

+{

+	char ssid[33];

+	int ssid_hide;

+	sc_wifi_ap_mode_type_e mode;

+	sc_wifi_bandwidth_e bandwidth;

+	int channel;

+	char countrycode[3];

+	int max_sta_num;

+	

+	sc_wifi_mac_acl_rule_e acl_rule;

+    char mac_list[360]; 

+

+	sc_wifi_ap_auth_t auth;

+} sc_wifi_ap_param_t;

+

+typedef enum

+{

+	SC_WIFI_AP_STATUS_NONE = 0,

+	SC_WIFI_AP_STATUS_IDLE, //or disable

+	SC_WIFI_AP_STATUS_ENABLING,

+	SC_WIFI_AP_STATUS_ENABLED,

+	SC_WIFI_AP_STATUS_DISABLING,

+	SC_WIFI_AP_STATUS_ERROR

+} sc_wifi_ap_status_e;

+

+typedef struct

+{

+	sc_wifi_ap_status_e status;

+	char ifname[32];

+	//char bssid[18];

+}sc_wifi_ap_status_t;

+

+typedef void (*sc_wifi_ap_status_ind_cb_f)(sc_wifi_ap_index_e index, 

+ sc_wifi_ap_status_e pre_status,

+ sc_wifi_ap_status_t *p_msg);

+

+////////////////station

+ typedef struct

+ {

+ 	 char ssid[33];

+	 sc_wifi_auth_e auth; //only aic support wap3

+	 sc_wifi_auth_wpa_psk_e pairwise;

+	 char passwd[64 + 1];

+ } sc_wifi_sta_param_t;

+

+typedef enum

+{

+	SC_WIFI_STA_STATUS_NONE,

+	SC_WIFI_STA_STATUS_IDLE,

+	SC_WIFI_STA_STATUS_CONNECTING,

+	SC_WIFI_STA_STATUS_ASSOCIATED, //dhcping

+	SC_WIFI_STA_STATUS_CONNECTED,

+	SC_WIFI_STA_STATUS_DISCONNECTED, 

+	SC_WIFI_STA_STATUS_ERROR

+} sc_wifi_sta_status_e;

+

+typedef enum

+{

+	SC_WIFI_REASON_CODE_NONE,

+	SC_WIFI_REASON_CODE_WRONG_KEY,

+	SC_WIFI_REASON_CODE_AUTH_FAILED,

+	SC_WIFI_REASON_CODE_CONN_FAILED,

+	SC_WIFI_REASON_CODE_SET_FAILED,

+	SC_WIFI_REASON_CODE_DHCP_FAILED

+} sc_wifi_reason_code_e;

+

+typedef struct

+{

+	sc_wifi_sta_status_e status;

+	char ifname[32];

+	char ap_bssid[18]; //cur ap mac

+	//int rssi;

+	unsigned char signal_level;

+	unsigned char has_addr;

+	struct in_addr addr; //(addr.s_addr)

+	unsigned char has_addr6;

+	struct in6_addr addr6; //

+	sc_wifi_reason_code_e reason_code;

+} sc_wifi_sta_status_t;

+

+typedef void (*sc_wifi_sta_status_ind_cb_f)(sc_wifi_sta_status_e pre_status, 

+ sc_wifi_sta_status_t *p_msg);

+

+typedef struct

+{

+	char bssid[18];//mac

+	char essid[33];

+	//int signal;

+	unsigned char signal_level; //0-5, max 5

+	//int frequency;

+	unsigned char channel; //1-13

+	sc_wifi_auth_e auth;

+}sc_wifi_sta_scan_info_t;

+

+typedef struct

+{

+	int cnt;

+	sc_wifi_sta_scan_info_t info[SC_WIFI_MAX_SCAN_INFO_CNT];

+}sc_wifi_sta_scan_list_t;

+

+typedef void (*sc_wifi_sta_scan_result_ind_cb_f)(sc_wifi_sta_scan_list_t *p_msg);

+

+typedef void (*sc_wifi_service_error_cb_f)(int error);

+

+typedef struct

+{

+	int is_connected;

+	char macaddr[18];

+}sc_wifi_sta_connect_status_t;

+

+typedef void (*sc_wifi_ap_sta_connect_ind_cb_f)(sc_wifi_ap_index_e index,

+sc_wifi_sta_connect_status_t *p_msg);

 

 /*******************************************************************************

  *                       Global variable declarations                          *

@@ -44,27 +258,348 @@
  *						 Global function declarations						   *

  ******************************************************************************/

 /**

- * @brief ³õʼ»¯¿Í»§¶ËAT½Ó¿Ú·þÎñ¡£

- * @param (in) ÎÞ¡£

- * @param (out) ÎÞ¡£

+ * @brief ³õʼ»¯wifi·þÎñ

+ * @param (in) ÎÞ

+ * @param (out) ÎÞ

  * @return	0 - ³É¹¦

- *			ÆäËüʧ°Ü:

- * @note ×¢ÊÍ

- *		 ×¢ÊÍ¡£

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

  */

 int sc_wifi_init(void);

 

 /**

- * @brief ×¢Ïú¿Í»§¶ËAT½Ó¿Ú·þÎñ¡£

- * @param (in) ÎÞ¡£

- * @param (out) ÎÞ¡£

+ * @brief ³õʼ»¯wifi·þÎñ

+ * @param (in) ÎÞ

+ * @param (out) ÎÞ

  * @return	0 - ³É¹¦

- *			ÆäËüʧ°Ü:

- * @note ×¢ÊÍ

- *		 ×¢ÊÍ¡£

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

  */

 int sc_wifi_uninit(void);

 

+/**

+ * @brief ¿ªÆôwifi¹¦ÄÜ

+ * @param (in) ÎÞ

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_enable(void);

+

+/**

+ * @brief ¹Ø±Õwifi¹¦ÄÜ

+ * @param (in) ÎÞ

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_disable(void);

+

+/**

+ * @brief ×¢²áwifi״̬»Øµ÷º¯Êý

+ * @param (in) cb: wifi״̬»Øµ÷º¯Êý

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_set_enable_status_ind_cb(sc_wifi_enable_status_ind_cb_f cb);

+#if 0 //Ö»Ö§³Öµ¥ap¡¢ap+staģʽ,¸ù¾ÝÐèÒª¿ª¹Ø¾ÍÐУ¬²»ÐèÒªÅäÖÃ

+/**

+ * @brief ÉèÖÃwifi¹¤×÷ģʽ

+ * @param (in) mode: wifi¹¤×÷ģʽ

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÐèÔÚsc_wifi_ap_startǰÉèÖÃ

+ *		 

+ */

+int sc_wifi_work_mode_set(sc_wifi_work_mode_e mode);

+

+/**

+ * @brief »ñÈ¡µ±Ç°wifi¹¤×÷ģʽ

+ * @param (in) ÎÞ

+ * @param (out) p_mode: µ±Ç°wifi¹¤×÷ģʽ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_work_mode_get(sc_wifi_work_mode_e *p_mode);

+#endif

+/**

+ * @brief ÉèÖÃAPģʽSSID

+ * @param (in) idx: APģʽË÷Òý

+ *             ssid: SSID

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note SSID²»¿É³¬¹ý32×Ö½Ú,ÇÒ²»Îª¿Õ,²»º¬ÌØÊâ×Ö·û

+ *		 ÐèÔÚsc_wifi_ap_startǰÉèÖÃ

+ */

+int sc_wifi_ap_ssid_set(sc_wifi_ap_index_e idx, const char *ssid);

+

+/**

+ * @brief ÉèÖÃAPģʽSSIDÊÇ·ñÒþ²Ø

+ * @param (in) idx: APģʽË÷Òý

+ *             ssid_hidden: 0 Òþ²Ø; 1 ²»Òþ²Ø

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ĬÈϲ»Òþ²Ø

+ *		 ÐèÔÚsc_wifi_ap_startǰÉèÖÃ

+ */

+int sc_wifi_ap_ssid_hidden_set(sc_wifi_ap_index_e idx, int ssid_hidden);

+

+/**

+ * @brief ÉèÖÃAPģʽµÄ¹¤×÷ЭÒé

+ * @param (in) idx: APģʽË÷Òý

+ *             mode: ¹¤×÷ЭÒé

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÐèÔÚsc_wifi_ap_startǰÉèÖÃ

+ *		 

+ */

+int sc_wifi_ap_mode_set(sc_wifi_ap_index_e idx, sc_wifi_ap_mode_type_e mode);

+

+/**

+ * @brief ÉèÖÃAPģʽµÄ´ø¿í

+ * @param (in) idx: APģʽË÷Òý

+ *             bandwidth: ¹¤×÷ЭÒé

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÐèÔÚsc_wifi_ap_startǰÉèÖÃ

+ *		 

+ */

+int sc_wifi_ap_bandwidth_set(sc_wifi_ap_index_e idx, sc_wifi_bandwidth_e bandwidth);

+

+/**

+ * @brief ÉèÖÃAPģʽµÄ×î´ó½ÓÈëÊý

+ * @param (in) idx: APģʽË÷Òý

+ *             max_sta_num: ȡֵ·¶Î§1-32

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÐèÔÚsc_wifi_ap_startǰÉèÖÃ

+ *		 

+ */

+int sc_wifi_ap_max_sta_num_set(sc_wifi_ap_index_e idx, int max_sta_num);

+

+/**

+ * @brief ÉèÖÃAPģʽµÄ¹ú¼ÒÂëºÍÐŵÀ

+ * @param (in) idx: APģʽË÷Òý

+ *             country_code: ¹ú¼ÒÂë, ³¤¶ÈΪ2,ÇÒ²»Îª¿Õ,ĬÈÏCN

+ *             channel: 2.4G 1-11or13

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÐèÔÚsc_wifi_ap_startǰÉèÖÃ

+ *		 default CN

+ */

+int sc_wifi_ap_cc_ch_set(sc_wifi_ap_index_e idx, const char *country_code, int channel);

+

+/**

+ * @brief ÉèÖÃAPģʽµÄºÚ°×Ãûµ¥

+ * @param (in) idx: APģʽË÷Òý

+ *             acl_rule: ¹æÔò

+ *             mac_list: MACµØÖ·Áбí,×î´ó10¸ö

+ * @param (out) ÎÞ

+ * @return  0 - ³É¹¦

+ * 		 ÆäËûʧ°Ü

+ * @note ÎÞ

+ * 	     mac_list AA:BB:CC:DD:EE:00;AA:BB:CC:DD:EE:01;AA:BB:CC:DD:EE:02

+ */

+int sc_wifi_ap_acl_set(sc_wifi_ap_index_e idx,

+    sc_wifi_mac_acl_rule_e acl_rule,

+    char *mac_list);

+

+/**

+ * @brief ÉèÖÃAPģʽµÄ°²È«ÈÏÖ¤

+ * @param (in) idx: APģʽË÷Òý

+ *             p_auth: °²È«ÈÏÖ¤ÐÅÏ¢

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÐèÔÚsc_wifi_ap_startǰÉèÖÃ

+ *		 ½öÖ§³ÖOPEN¡¢WPA

+ */

+int sc_wifi_ap_auth_set(sc_wifi_ap_index_e idx, sc_wifi_ap_auth_t *p_auth);

+

+/**

+ * @brief »ñÈ¡APģʽµÄÅäÖÃ

+ * @param idx: APģʽË÷Òý

+ * @param (out) p_param: º¬ssid¡¢ÊÇ·ñÒþ²Ø¡¢Ð­Òéģʽ¡¢´ø¿í¡¢¹ú¼ÒÂë¡¢ÐŵÀ¡¢×î´ó½ÓÈëÊý¡¢ºÚ°×Ãûµ¥¡¢°²È«ÈÏÖ¤ÐÅÏ¢

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_ap_param_get(sc_wifi_ap_index_e idx, sc_wifi_ap_param_t *p_param);

+

+/**

+ * @brief ÉèÖÃAPģʽ״̬»Øµ÷º¯Êý

+ * @param (in) cb: APģʽ״̬»Øµ÷º¯Êý

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_ap_set_status_ind_cb(sc_wifi_ap_status_ind_cb_f cb);

+

+/**

+ * @brief ¿ªÆôAP¹¦ÄÜ

+ * @param (in) idx: APģʽË÷Òý

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_ap_start(sc_wifi_ap_index_e idx);

+

+/**

+ * @brief ¹Ø±ÕAP¹¦ÄÜ

+ * @param (in) idx: APģʽË÷Òý

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_ap_stop(sc_wifi_ap_index_e idx);

+

+/**

+ * @brief »ñÈ¡APģʽµÄ״̬ÐÅÏ¢

+ * @param (in) idx: APģʽË÷Òý

+ * @param (out) p_stat: ״̬ÐÅÏ¢

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_ap_get_status(sc_wifi_ap_index_e idx, sc_wifi_ap_status_t *p_stat);

+

+/**

+ * @brief ÉèÖÃSTAģʽµÄSSIDºÍÈÏÖ¤ÐÅÏ¢

+ * @param (in) SSID, ²»³¬¹ý32×Ö½Ú,ÇÒ·Ç¿Õ

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_sta_param_set(sc_wifi_sta_param_t *p_param);

+

+/**

+ * @brief »ñÈ¡STAģʽµÄSSIDºÍÈÏÖ¤ÐÅÏ¢

+ * @param (in) ssid_buf: Ö¸Ïò´æ·Åµ±Ç°SSIDµÄ»º´æ

+ *             buf_len: »º´æ´óС,½¨Òé33

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_sta_param_get(sc_wifi_sta_param_t *p_param);

+

+/**

+ * @brief ×¢²áSTAģʽ״̬»Øµ÷

+ * @param (in) cb: »Øµ÷

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note STAµÄÁ¬½Ó״̬

+ *		 

+ */

+int sc_wifi_sta_set_status_ind_cb(sc_wifi_sta_status_ind_cb_f cb);

+

+/**

+ * @brief ¿ªÆôSTA¹¦ÄÜ

+ * @param (in) ÎÞ

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_sta_start(void);

+

+/**

+ * @brief ¹Ø±Õwifi¹¦ÄÜ

+ * @param (in) ÎÞ

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_sta_stop(void);

+

+/**

+ * @brief »ñÈ¡STAģʽ״̬ÐÅÏ¢

+ * @param (in) ÎÞ

+ * @param (out) p_sta: ״̬ÐÅÏ¢

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_sta_get_status(sc_wifi_sta_status_t *p_sta);

+

+/**

+ * @brief STAģʽɨÃè

+ * @param (in) ÎÞ

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_sta_start_scan(void);

+

+/**

+ * @brief ×¢²áSTAģʽɨÃè½á¹û»Øµ÷

+ * @param (in) cb

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_sta_set_scan_result_ind_cb(sc_wifi_sta_scan_result_ind_cb_f cb);

+

+/**

+ * @brief ×¢²áwifi·þÎñÒì³£»Øµ÷

+ * @param (in) cb

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_set_service_error_cb(sc_wifi_service_error_cb_f cb);

+

+/**

+ * @brief ×¢²áAPÓë½ÓÈëµÄSTAÉ豸Á¬½Ó״̬µÄ»Øµ÷

+ * @param (in) cb

+ * @param (out) ÎÞ

+ * @return	0 - ³É¹¦

+ *			ÆäËûʧ°Ü

+ * @note ÎÞ

+ *		 

+ */

+int sc_wifi_set_ap_sta_connect_ind_cb(sc_wifi_ap_sta_connect_ind_cb_f cb);

+

 

 #ifdef __cplusplus

 }

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/mnet/sc_mnet.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/mnet/sc_mnet.c
index b154939..00c3bad 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/mnet/sc_mnet.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/mnet/sc_mnet.c
@@ -119,6 +119,7 @@
 		}

 	}	

 	sc_ipc_msg_free(req_msg);

+	sc_ipc_msg_free(rsp_msg);

 	return ret;

 }

 

@@ -204,6 +205,8 @@
 	}

 	cb(1, &list);

 	SCLOGD("sc_net_scan succ\n");

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -224,6 +227,8 @@
 	//memcpy(oper, ret, sizeof(sc_net_cur_operator_t));

 	memcpy(oper, pmsg_rsp->data, pmsg_rsp->data_len);

 	printf("get operator info %d %d %s %d\n", oper->mode, oper->format, oper->oper, oper->uAcT);

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -249,6 +254,8 @@
 		return ret->result;

 	}

 	SCLOGD("sc_net_select_mode succ, mode:%d \n", mode);

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -274,6 +281,8 @@
 		return SC_ERR_FAIL;

 	}

 	SCLOGD("sc_net_register succ\n");

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -299,6 +308,8 @@
 		return SC_ERR_FAIL;

 	}

 	SCLOGD("sc_net_deregister succ\n");

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -320,6 +331,8 @@
 	memcpy(sysinfo, pmsg_rsp->data, pmsg_rsp->data_len);

 	SCLOGD("sysinfo %d %d %d %d %d %d\n", 

 		sysinfo->iSvrStatus, sysinfo->iSvrDomain, sysinfo->iRoamStaus, sysinfo->iSysMode, sysinfo->iSimStatus, sysinfo->iSysSubMode);

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -339,6 +352,8 @@
 	int* ret = (int*)pmsg_rsp->data;

 	*csq=*ret;

 	SCLOGD("sc_net_get_signal_strength succ csq:%ld \n", *csq);

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -362,6 +377,8 @@
 		return SC_ERR_FAIL;

 	}

 	SCLOGD("sc_net_set_mode succ");

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 

 }

@@ -417,19 +434,23 @@
 		p_info->td_cell_info.cellId, p_info->td_cell_info.rac, p_info->td_cell_info.lac, p_info->td_cell_info.plmn, p_info->td_cell_info.cellParaId, 

 		p_info->td_cell_info.arfcn,	p_info->td_cell_info.rscp, p_info->td_cell_info.rsrq, p_info->td_cell_info.ecno, p_info->td_cell_info.band);

 	}

-	

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

 int sc_net_set_scanmode(int cardID, int Tmin, int Tstep, int Tnum, int Tmax)

 {

 	char at_cmd[64] = {0};

-	

-	snprintf(at_cmd,sizeof(at_cmd),"AT+ZSET=\"FREQ_SCAN\",%d,%d,%d,%d\r\n", Tmin, Tstep, Tnum, Tmax);

-	get_modem_info(at_cmd, NULL, NULL);

-	SCLOGI("sc_net_set_scanmode=%d %d %d %d\n", Tmin, Tstep, Tnum, Tmax);

-		

-	return SC_ERR_SUCCESS;

+

+	if((Tmin && Tstep && Tnum && Tmax) || ((Tmin | Tstep | Tnum | Tmax) == 0)){

+		snprintf(at_cmd,sizeof(at_cmd),"AT+ZSET=\"FREQ_SCAN\",%d,%d,%d,%d\r\n", Tmin, Tstep, Tnum, Tmax);

+		get_modem_info(at_cmd, NULL, NULL);

+		SCLOGI("sc_net_set_scanmode=%d %d %d %d\n", Tmin, Tstep, Tnum, Tmax);

+

+		return SC_ERR_SUCCESS;

+	}

+	return SC_ERR_FAIL;

 }

 

 int sc_net_get_scanmode(int cardID, int *pTmin, int *pTstep, int *pTnum, int *pTmax)

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/mnet_whitelist/sc_mnet_whitelist.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/mnet_whitelist/sc_mnet_whitelist.c
index 82022ab..ed3d0fc 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/mnet_whitelist/sc_mnet_whitelist.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/mnet_whitelist/sc_mnet_whitelist.c
@@ -12,6 +12,7 @@
 #include <time.h>

 #include <syslog.h>

 #include <pthread.h>

+#include <semaphore.h>

 

 #include "sc_mnet_whitelist.h"

 

@@ -19,62 +20,283 @@
 #include "softap_api.h"

 #include "message.h"

 #include "sc_tel_types.h"

+#include "mnet_whitelist_inter_msg.h"

 

-static sc_mnet_whitelist_enum_cmd_pair pair[]=

-{

-	{ MNET_WHITELIST_CMD_DIAL_ID, "+^DSCI+^ORIG+^CONF+^CONN+^CEND" },

-	{ MNET_WHITELIST_CMD_NET_ID,  "+CSQ+^MODE" },

-	{ MNET_WHITELIST_CMD_MSG_ID,  "+CMTI" },

+#define MAX_CMD_LEN   256

+int g_mnet_whitelist_init_state=0;

+int g_mnet_whitelist_deinit_state=0;

+int g_mnet_whitelist_moduleId=-1;

+pthread_t g_mnet_whitelist_thread;

+sem_t g_mnet_whitelist_sem;

+

+pthread_mutex_t g_mnet_whitelist_mutex = PTHREAD_MUTEX_INITIALIZER;

+static sc_ipc_event mnet_whitelist_auto_notify_evt[] = {

+	

 };

 

+static void scmnet_whitelist_ipcmsg_free(sc_ipc_msg *pipcmsg)

+{

+	if(NULL != pipcmsg) {

+		free(pipcmsg);

+	}

+}

 

 

+static sc_mnet_whitelist_pair pair[]=

+{

+	{ MNET_WHITELIST_CMD_CC, 			"+^DSCI+^ORIG+^CONF+^CONN+^CEND+" },

+	{ MNET_WHITELIST_CMD_NET_SERVICE,  	"+CREG+COPS+CSQ+ZMMI+^MODE+^SYSINFO+CEREG+CGREG+CIREPI+" },

+	{ MNET_WHITELIST_CMD_GPRS,  		"+ZGIPDNS+CNEMS1+" },

+	{ MNET_WHITELIST_CMD_MSG,  			"+CMTI+CDSI+CMT+CDS+CBM+" },

+	{ MNET_WHITELIST_CMD_VOLTE,  		"+IMSVMODE+" },

+};

+

+static sc_ipc_msg *scmnet_whitelist_ipcmsg_set(unsigned int req, unsigned int rsp, int wait, void *data, unsigned int datalen)

+{

+	sc_ipc_msg *pipcmsg = NULL;

+

+	if (datalen > SC_IPC_MSG_PAYLOAD_SIZE) {

+		SCLOGE("mnet_whitelist data len: %d too long!\n", datalen);

+		return NULL;

+	}

+

+	pipcmsg = (sc_ipc_msg *)malloc(sizeof(sc_ipc_msg) + datalen);

+	if(NULL == pipcmsg) {

+		SCLOGE("mnet ipcmsg no memory!\n");

+		return NULL;

+	}

+	memset(pipcmsg, 0, sizeof(sc_ipc_msg));

+

+	pipcmsg->type = 1;

+	pipcmsg->fd_svr = sc_ipc_get_svr_fd("mnet_whitelist_proxy_ipc"); //MODULE_ID_MNET_WHITELIST_PROXY

+	pipcmsg->fd_cli = sc_ipc_get_self_fd();

+	pipcmsg->token = 0;

+	pipcmsg->msg_req = req;

+	pipcmsg->msg_rsp = rsp;

+	pipcmsg->wait_rsp = wait;

+	pipcmsg->data_len = datalen;

+

+	if(0 < datalen) {		

+		memcpy(pipcmsg->data, data, pipcmsg->data_len);

+	}

+	

+	return pipcmsg;

+}

+

+static int scmnet_whitelist_connect(int enable)

+{

+	sc_ipc_msg *conn_req_msg = NULL;

+	sc_ipc_msg *conn_rsp_msg = NULL;

+	scmnet_whitelist_connect_t connect_info;

+	scmnet_whitelist_common_res_t *comm_res = NULL;

+	int ret = SC_ERR_FAIL;

+

+	memset(&connect_info, 0, sizeof(connect_info));

+	connect_info.enable = enable;

+	conn_req_msg = scmnet_whitelist_ipcmsg_set(SCMNET_WHITELIST_CMD_CONN_REQ, SCMNET_WHITELIST_CMD_CONN_RSP, 1, &connect_info, sizeof(connect_info));

+	if(NULL == conn_req_msg) {

+		SCLOGE("scmnet_whitelist_connect no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(conn_req_msg, &conn_rsp_msg)) {

+		SCLOGE("scmnet_whitelist_connect msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		comm_res = (scmnet_whitelist_common_res_t *)conn_rsp_msg->data;

+		ret = comm_res->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("scmnet_whitelist_connect fail: %d!\n", ret);

+		}

+	}

+	scmnet_whitelist_ipcmsg_free(conn_req_msg);

+	scmnet_whitelist_ipcmsg_free(conn_rsp_msg);

+	

+	return ret;

+}

+

+

+int sc_mnet_whitelist_init()

+{

+	int i;

+	sc_ipc_event *pevt;

+

+	if(g_mnet_whitelist_init_state == 1) {

+		SCLOGE("mnet_whitelist has inited!!\n");

+		return SC_ERR_SUCCESS;

+	}

+	

+	sc_ipc_start_loop("sc-mnet-whitelist");

+	sc_ipc_register_events(mnet_whitelist_auto_notify_evt, sizeof(mnet_whitelist_auto_notify_evt) / sizeof(sc_ipc_event));

+	if(0 == scmnet_whitelist_connect(1)) {

+		SCLOGD("sc_mnet_whitelist_init connect proxy success.\n");

+	}

+	SCLOGD("sc_mnet_whitelist_init finish\n");

+	return SC_ERR_SUCCESS;	

+}

+

+

+int sc_mnet_whitelist_deinit()

+{

+	int i;

+	sc_ipc_event *pevt;

+

+	if(g_mnet_whitelist_init_state == 0) {

+		SCLOGE("mnet_whitelist has deinited!!\n");

+		return SC_ERR_SUCCESS;

+	}

+	

+	for(i = 0; i < sizeof(mnet_whitelist_auto_notify_evt) / sizeof(sc_ipc_event); i++) {

+		pevt = &mnet_whitelist_auto_notify_evt[i];

+		sc_ipc_event_del(pevt);

+	}

+

+	if(SC_ERR_SUCCESS == scmnet_whitelist_connect(0)) {

+		SCLOGI("sc_mnet_whitelist_deinit disconnect success.\n");

+	}

+

+	sc_ipc_terminate_loop();

+	SCLOGI("sc_mnet_whitelist_deinit suc!\n");

+	return 0;

+}

+

 

 

 int sc_mnet_whitelist_add(int id)

 {

-	if(id <= MNET_WHITELIST_CMD_ID_BASE || id>= MNET_WHITELIST_CMD_ID_MAX){

-		SCLOGE("msg id out of range %d-%d",MNET_WHITELIST_CMD_ID_BASE+1, MNET_WHITELIST_CMD_ID_MAX-1);

+	if(id <= MNET_WHITELIST_CMD_BASE || id>= MNET_WHITELIST_CMD_MAX){

+		SCLOGE("add msg id out of range %d-%d",MNET_WHITELIST_CMD_BASE+1, MNET_WHITELIST_CMD_MAX-1);

 		return 1;

 	}

 	int ret = -1;

 	char at_str[SC_TEL_MAX_STR_LEN] = {0};

 	strcpy(at_str, pair[id-1].cmd);	

+	SCLOGE("sc_mnet_whitelist_add: cmd:%s\n",at_str);

 	ret = send_soc_msg(NEAR_PS, MODULE_ID_AT_CTL, MSG_CMD_ADD_MNET_WHITELIST, strlen(at_str), at_str);

 

 	if (ret != 0) {

-		SCLOGD("sc_mnet_whitelist_add: ipc_send_message unexpected,ret:%d\n",ret);

+		SCLOGE("sc_mnet_whitelist_add: ipc_send_message unexpected,ret:%d\n",ret);

 		return SC_ERR;

 	}

 	SCLOGD("sc_mnet_whitelist_add: ipc_send_message ok\n");

 	return SC_ERR_SUCCESS;

 }

-int sc_mnet_whitelist_del(int id)

+

+int sc_mnet_whitelist_insert(char* cmd)

 {

-	if(id <= MNET_WHITELIST_CMD_ID_BASE || id>= MNET_WHITELIST_CMD_ID_MAX){

-		SCLOGE("msg id out of range %d-%d",MNET_WHITELIST_CMD_ID_BASE+1, MNET_WHITELIST_CMD_ID_MAX-1);

+	if(strlen(cmd) > MAX_CMD_LEN){		

+		SCLOGE("sc_mnet_whitelist_add: cmd len too long\n");

+		return 1;

+	}

+	if(strlen(cmd) < 3){		

+		SCLOGE("sc_mnet_whitelist_add: cmd len too short\n");

+		return 1;

+	}

+	if(cmd[0] != '+' || cmd[strlen(cmd)-1] != '+'){

+		SCLOGE("insert wrong formate\n");

+		return 1;

+	}

+	

+	int ret = -1;	

+	ret = send_soc_msg(NEAR_PS, MODULE_ID_AT_CTL, MSG_CMD_ADD_MNET_WHITELIST, strlen(cmd), cmd);

+

+	if (ret != 0) {

+		SCLOGD("sc_mnet_whitelist_add: ipc_send_message unexpected,ret:%d\n",ret);

+		return SC_ERR_FAIL;

+	}

+	SCLOGD("sc_mnet_whitelist_add: ipc_send_message ok\n");

+	return SC_ERR_SUCCESS;	

+}

+

+int sc_mnet_whitelist_del(int id)

+{	

+	if(id <= MNET_WHITELIST_CMD_BASE || id>= MNET_WHITELIST_CMD_MAX){

+		SCLOGE("del msg id out of range %d-%d",MNET_WHITELIST_CMD_BASE+1, MNET_WHITELIST_CMD_MAX-1);

 		return 1;

 	}

 	int ret = -1;

-	char at_str[SC_TEL_MAX_STR_LEN] = {0};

+	char at_str[MAX_CMD_LEN] = {0};

 	strcpy(at_str, pair[id-1].cmd);	

 	ret = send_soc_msg(NEAR_PS, MODULE_ID_AT_CTL, MSG_CMD_DEL_MNET_WHITELIST, strlen(at_str), at_str);

 

 	if (ret != 0) {

-		SCLOGD("sc_mnet_whitelist_del: ipc_send_message unexpected,ret:%d\n",ret);

+		SCLOGE("sc_mnet_whitelist_del: ipc_send_message unexpected,ret:%d\n",ret);

 		return SC_ERR;

 	}

 	SCLOGD("sc_mnet_whitelist_del: ipc_send_message ok\n");

 	return SC_ERR_SUCCESS;

 }

+

+int sc_mnet_whitelist_erase(char* cmd)

+{

+	if(strlen(cmd) > MAX_CMD_LEN){		

+		SCLOGE("sc_mnet_whitelist_erase: cmd len too long\n");

+		return 1;

+	}

+	if(strlen(cmd) < 3){		

+		SCLOGE("sc_mnet_whitelist_erase: cmd len too short\n");

+		return 1;

+	}

+	if(cmd[0] != '+' || cmd[strlen(cmd)-1] != '+'){

+		SCLOGE("del cmd wrong formate\n");

+		return 1;

+	}

+	

+	int ret = -1;	

+	ret = send_soc_msg(NEAR_PS, MODULE_ID_AT_CTL, MSG_CMD_DEL_MNET_WHITELIST, strlen(cmd), cmd);

+

+	if (ret != 0) {

+		SCLOGD("sc_mnet_whitelist_erase: ipc_send_message unexpected,ret:%d\n",ret);

+		return SC_ERR_FAIL;

+	}

+	SCLOGD("sc_mnet_whitelist_erase: ipc_send_message ok\n");

+	return SC_ERR_SUCCESS;	

+}

+

+

+char* sc_mnet_whitelist_get()

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	scmnet_whitelist_get_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+	char* res=NULL;

+	req_msg = scmnet_whitelist_ipcmsg_set(SCMNET_WHITELIST_CMD_GET_REQ, SCMNET_WHITELIST_CMD_GET_RSP, 1, NULL, 0);

+	if(NULL == req_msg) {

+		SCLOGE("sc_mnet_whitelist_fetch no memory!\n");

+		return NULL;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_mnet_whitelist_fetch msg fail!\n");

+		scmnet_whitelist_ipcmsg_free(req_msg);

+		return NULL;

+	}

+	else {

+		rsp_data = (scmnet_whitelist_get_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_mnet_whitelist_fetch fail: %d!\n", ret);

+		}else{

+			int len = strlen(rsp_data->whitelist);

+			res = (char*)malloc(len+1);

+			memcpy(res, rsp_data->whitelist, len);

+			res[len] = '\0';

+		}

+	}	

+	scmnet_whitelist_ipcmsg_free(req_msg);

+	scmnet_whitelist_ipcmsg_free(rsp_msg);

+	return res;

+}

+

 int sc_mnet_whitelist_clear()

 {

 	int ret = -1;

 	ret = send_soc_msg(NEAR_PS, MODULE_ID_AT_CTL, MSG_CMD_CLEAR_MNET_WHITELIST, 0, NULL);

-	return ret;

 

 	if (ret != 0) {

-		SCLOGD("sc_mnet_whitelist_clear: ipc_send_message unexpected,ret:%d\n",ret);

+		SCLOGE("sc_mnet_whitelist_clear: ipc_send_message unexpected,ret:%d\n",ret);

 		return SC_ERR;

 	}

 	SCLOGD("sc_mnet_whitelist_clear: ipc_send_message ok\n");

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/sim/sc_sim.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/sim/sc_sim.c
index f0cb746..e9e3fda 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/sim/sc_sim.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/sim/sc_sim.c
@@ -119,6 +119,7 @@
 		}

 	}	

 	sc_ipc_msg_free(req_msg);

+	sc_ipc_msg_free(rsp_msg);

 	return ret;

 }

 

@@ -197,6 +198,8 @@
 	len = (pmsg_rsp->data_len < imsi_len) ? pmsg_rsp->data_len : imsi_len-1;

 	strncpy(imsi, pmsg_rsp->data, len);

 	SCLOGD("sc_sim_get_imsi imsi=%s \n", imsi);

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -233,7 +236,8 @@
 	

 	len = (pmsg_rsp->data_len < iccid_len) ? pmsg_rsp->data_len : iccid_len-1;

 	strncpy(iccid, pmsg_rsp->data, len);

-	

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -271,6 +275,8 @@
 

 	len = (pmsg_rsp->data_len < phone_num_len) ? pmsg_rsp->data_len : phone_num_len-1;

 	strncpy(phone_num, pmsg_rsp->data, len);

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -299,6 +305,8 @@
 	sc_ipc_send_msg_wait_rsp(pmsg_req, &pmsg_rsp);

 	

 	memcpy(list, pmsg_rsp->data, pmsg_rsp->data_len);

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -354,6 +362,8 @@
 		reason = sc_sim_convert_reason(ppin_op_result->reason);

 		return reason;

 	}

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -408,6 +418,8 @@
 		reason = sc_sim_convert_reason(ppin_op_result->reason);

 		return reason;

 	}

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -463,6 +475,8 @@
 		reason = sc_sim_convert_reason(ppin_op_result->reason);

 		return reason;

 	}

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -526,6 +540,8 @@
 		reason = sc_sim_convert_reason(ppin_op_result->reason);

 		return reason;

 	}

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;	

 }

 

@@ -588,6 +604,8 @@
 		reason = sc_sim_convert_reason(ppin_op_result->reason);

 		return reason;

 	}

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -620,6 +638,8 @@
 	p_info->state = pcard_info->state;

 	p_info->type = pcard_info->type;

 	memcpy(&p_info->app_3gpp, &pcard_info->app_info, sizeof(sc_sim_app_info_t));

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/sms/sc_sms.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/sms/sc_sms.c
index 213ccd7..ba95c2e 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/sms/sc_sms.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/sms/sc_sms.c
@@ -283,6 +283,7 @@
 		}

 	}	

 	sc_ipc_msg_free(req_msg);

+	sc_ipc_msg_free(rsp_msg);

 	return ret;

 }

 

@@ -375,6 +376,8 @@
 	SCLOGD("len=%d, psms_center_info->addr=%s \n", len, psms_center_info_rsp->addr);

 	

 	strncpy(addr, psms_center_info_rsp->addr, len);	

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -430,6 +433,8 @@
 		reason = sc_sms_convert_reason(psms_op_result->reason);

 		return reason;

 	}

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;	

 }

 

@@ -487,6 +492,8 @@
 		reason = sc_sms_convert_reason(psms_op_result->reason);

 		return reason;

 	}

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

@@ -547,6 +554,8 @@
 		reason = sc_sms_convert_reason(psms_op_result->reason);

 		return reason;

 	}

+	sc_ipc_msg_free(pmsg_req);

+	sc_ipc_msg_free(pmsg_rsp);

 	return SC_ERR_SUCCESS;

 }

 

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/wifi/sc_wifi.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/wifi/sc_wifi.c
index e9e1c5b..86e9443 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/wifi/sc_wifi.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/libsctel/wifi/sc_wifi.c
@@ -13,12 +13,1946 @@
 #include <syslog.h>

 #include <pthread.h>

 

+#include "sc_ipc.h"

+#include "sc_tel_types.h"

+#include "sc_wifi.h"

+

+#include "os_type_def.h"

+#include "wifi_msg.h"

+#include "wifi_inter_msg.h"

+

+/*ÉÏÏÂÎÄÐÅÏ¢*/

+struct scwifi_context {	

+	int pre_wifi_status;

+	sc_wifi_enable_status_ind_cb_f wifi_status_cb;

+

+	//ap

+	sc_wifi_ap_status_ind_cb_f ap_status_cb;

+	

+	sc_wifi_ap_sta_connect_ind_cb_f ap_sta_change_cb;

+

+	//sta

+	sc_wifi_sta_status_ind_cb_f sta_status_cb;

+	

+	sc_wifi_sta_scan_result_ind_cb_f sta_scan_cb;

+

+	/*³õʼ»¯±êÖ¾*/

+	int have_init;

+

+	//wlan_proxy

+	sc_wifi_service_error_cb_f serv_err_cb;

+};

+

+static int sc_wifi_enable_status_ind(const sc_ipc_event* const pevt, const sc_ipc_msg* const pmsg);

+static int sc_wifi_ap_status_ind(const sc_ipc_event* const pevt, const sc_ipc_msg* const pmsg);

+static int sc_wifi_sta_status_ind(const sc_ipc_event* const pevt, const sc_ipc_msg* const pmsg);

+static int sc_wifi_sta_scan_ind(const sc_ipc_event* const pevt, const sc_ipc_msg* const pmsg);

+static int sc_wifi_ap_sta_change_ind(const sc_ipc_event* const pevt, const sc_ipc_msg* const pmsg);

+static int sc_wifi_service_error_ind(const sc_ipc_event* const pevt, const sc_ipc_msg* const pmsg);

+

+

+static struct scwifi_context scwifi_ctx = {0};

+static sc_ipc_event scwifi_notify_evt[] = {

+	{0, 1, 0, SCWIFI_CMD_ENABLE_STATUS_IND, sc_wifi_enable_status_ind, NULL, NULL},

+	//ap

+	{0, 1, 0, SCWIFI_CMD_AP_STATUS_IND, sc_wifi_ap_status_ind, NULL, NULL},

+	{0, 1, 0, SCWIFI_CMD_AP_STA_CHA_IND, sc_wifi_ap_sta_change_ind, NULL, NULL},

+	//sta

+	{0, 1, 0, SCWIFI_CMD_STA_STATUS_IND, sc_wifi_sta_status_ind, NULL, NULL},

+	{0, 1, 0, SCWIFI_CMD_STA_SCAN_IND, sc_wifi_sta_scan_ind, NULL, NULL},

+	//wlan_proxy

+	{0, 1, 0, SCWIFI_CMD_SERV_ERROR_IND, sc_wifi_service_error_ind, NULL, NULL},

+};

+

+//¹ú¼ÒÂë

+//channel 0-13

+static char *cc_world[] = {

+	"AL", "DZ", "AR", "AM", "AU", "AT", "AZ", "BH", "BY",

+    "BE", "BA", "BR", "BN", "BG", "CL", "CN", "CR", "HR", "CY",

+	"CZ", "DK", "EC", "EG", "SV", "EE", "FI", "FR", "GE",

+	"DE", "GR", "HN", "HK", "HU", "IS", "IN", "ID", "IR", "IE",

+	"IL", "IT", "JM", "JO", "KZ", "KE", "KP", "KR", "KW", "LV",

+	"LB", "LI", "LT", "LU", "MO", "MK", "MY", "MT", "MC", "MA",

+	"NL", "AN", "NO", "OM", "PK", "PE", "PH", "PL", "PT", "QA",

+	"RO", "RU", "SA", "SG", "SK", "SI", "ZA", "ES", "LK",

+	"SE", "CH", "SY", "TH", "TT", "TN", "TR", "UA", "AE", "GB",

+	"UY", "VN", "YE", "ZW", "BD",

+	"JP",

+	"BZ", "BO", "NZ", "VE"};

+//channel 0-11

+static char *cc_fcca[] = {"CA", "CO", "DO", "GT", "MX", "PA", "PR", "TW", "US", "UZ"};

+

+static int sc_wifi_enable_status_ind(const sc_ipc_event* const pevt, const sc_ipc_msg* const pmsg)

+{

+	struct scwifi_context *pccctx = (struct scwifi_context *)pevt->param;

+	wlan_status_t *pstate_info = (wlan_status_t *)pmsg->data; 

+

+	if(NULL == pccctx) {

+		return SC_ERR_SUCCESS;

+	}

+	

+	if(NULL != pccctx->wifi_status_cb) {

+		SCLOGI("sc_wifi_enable_status_ind call cb!\n");

+		pccctx->wifi_status_cb(pccctx->pre_wifi_status, pstate_info->wifi_status);

+		pccctx->pre_wifi_status = pstate_info->wifi_status;

+	}

+    return SC_ERR_SUCCESS;

+} 

+

+static sc_wifi_ap_status_e transe_ap_status(int mode)

+{

+	int sc_mode = SC_WIFI_AP_STATUS_ERROR;

+	

+	switch (mode) {

+	case IN_WIFI_AP_STATUS_NONE:

+		sc_mode = SC_WIFI_AP_STATUS_NONE;

+		break;

+	

+	case IN_WIFI_AP_STATUS_IDLE:

+		sc_mode = SC_WIFI_AP_STATUS_IDLE;

+		break;

+	

+	case IN_WIFI_AP_STATUS_ENABLING:

+		sc_mode = SC_WIFI_AP_STATUS_ENABLING;

+		break;

+

+	case IN_WIFI_AP_STATUS_ENABLED:

+		sc_mode = SC_WIFI_AP_STATUS_ENABLED;

+		break;

+

+	case IN_WIFI_AP_STATUS_DISABLING:

+		sc_mode = SC_WIFI_AP_STATUS_DISABLING;

+		break;

+

+	case IN_WIFI_AP_STATUS_ERROR:

+		sc_mode = SC_WIFI_AP_STATUS_ERROR;

+		break;

+	

+	default:

+		SCLOGE("ap_status:%d not support!\n", mode);//ÀíÂÛÉϲ»Ó¦³öÏÖ

+		break;

+	}

+	return sc_mode;

+}

+

+static int sc_wifi_ap_status_ind(const sc_ipc_event* const pevt, const sc_ipc_msg* const pmsg)

+{

+	struct scwifi_context *pccctx = (struct scwifi_context *)pevt->param;

+	wlan_ap_status_t *pstate_info = (wlan_ap_status_t *)pmsg->data; 

+	sc_wifi_ap_status_t ap_msg = {0};

+	sc_wifi_ap_status_e pre_status;

+

+	if(NULL == pccctx) {

+		return SC_ERR_SUCCESS;

+	}

+	

+	if(NULL != pccctx->ap_status_cb) {

+		SCLOGI("sc_wifi_ap_status_ind call cb!\n");

+		strncpy(ap_msg.ifname, pstate_info->ifname, sizeof(ap_msg.ifname) - 1);

+		ap_msg.status = transe_ap_status(pstate_info->status);

+		pre_status = transe_ap_status(pstate_info->pre_status);

+		pccctx->ap_status_cb(pstate_info->idx, pre_status, &ap_msg);

+	}

+    return SC_ERR_SUCCESS;

+} 

+

+static int sc_wifi_ap_sta_change_ind(const sc_ipc_event* const pevt, const sc_ipc_msg* const pmsg)

+{

+	struct scwifi_context *pccctx = (struct scwifi_context *)pevt->param;

+	wlan_sta_connect_status_t *pstate_info = (wlan_sta_connect_status_t *)pmsg->data; 

+	sc_wifi_sta_connect_status_t ap_msg = {0};

+

+	if(NULL == pccctx) {

+		return SC_ERR_SUCCESS;

+	}

+	

+	if(NULL != pccctx->ap_sta_change_cb) {

+		SCLOGI("sc_wifi_ap_sta_change_ind call cb!\n");

+		strncpy(ap_msg.macaddr, pstate_info->macaddr, sizeof(ap_msg.macaddr) - 1);

+		ap_msg.is_connected = pstate_info->is_connected;

+		pccctx->ap_sta_change_cb(pstate_info->idx, &ap_msg);

+	}

+    return SC_ERR_SUCCESS;

+} 

+

+static sc_wifi_sta_status_e transe_station_status(int in_value)

+{

+	sc_wifi_sta_status_e sc_value = SC_WIFI_STA_STATUS_ERROR;

+

+	if (in_value == IN_WIFI_STA_STATUS_NONE) {

+		sc_value = SC_WIFI_STA_STATUS_NONE;

+	}

+	else if (in_value == IN_WIFI_STA_STATUS_IDLE) {

+		sc_value = SC_WIFI_STA_STATUS_IDLE;

+	}

+	else if (in_value == IN_WIFI_STA_STATUS_CONNECTING) {

+		sc_value = SC_WIFI_STA_STATUS_CONNECTING;

+	}

+	else if (in_value == IN_WIFI_STA_STATUS_ASSOCIATED) {

+		sc_value = SC_WIFI_STA_STATUS_ASSOCIATED;

+	}

+	else if (in_value == IN_WIFI_STA_STATUS_CONNECTED) {

+		sc_value = SC_WIFI_STA_STATUS_CONNECTED;

+	}

+	else if (in_value == IN_WIFI_STA_STATUS_DISCONNECTED) {

+		sc_value = SC_WIFI_STA_STATUS_DISCONNECTED;

+	}

+	else {

+		SCLOGE("transe_station_status unsuport:%d\n", in_value);

+	}

+	return sc_value;

+}

+

+static sc_wifi_reason_code_e transe_station_reason_code(int in_value)

+{

+	sc_wifi_reason_code_e sc_value = SC_WIFI_REASON_CODE_NONE;

+

+	if (in_value == IN_WIFI_REASON_CODE_NONE) {

+		sc_value = SC_WIFI_REASON_CODE_NONE;

+	}

+	else if (in_value == IN_WIFI_REASON_CODE_WRONG_KEY) {

+		sc_value = SC_WIFI_REASON_CODE_WRONG_KEY;

+	}

+	else if (in_value == IN_WIFI_REASON_CODE_AUTH_FAILED) {

+		sc_value = SC_WIFI_REASON_CODE_AUTH_FAILED;

+	}

+	else if (in_value == IN_WIFI_REASON_CODE_CONN_FAILED) {

+		sc_value = SC_WIFI_REASON_CODE_CONN_FAILED;

+	}

+	else if (in_value == IN_WIFI_REASON_CODE_SET_FAILED) {

+		sc_value = SC_WIFI_REASON_CODE_SET_FAILED;

+	}

+	else if (in_value == IN_WIFI_REASON_CODE_DHCP_FAILED) {

+		sc_value = SC_WIFI_REASON_CODE_DHCP_FAILED;

+	}

+	else {

+		SCLOGE("transe_station_reason_code unsuport:%d\n", in_value);

+	}

+	return sc_value;

+}

+

+//ͨ¹ýǰºó״̬±ä»¯À´ÅжÏ

+static int sc_wifi_sta_status_ind(const sc_ipc_event* const pevt, const sc_ipc_msg* const pmsg)

+{

+	struct scwifi_context *pccctx = (struct scwifi_context *)pevt->param;

+	wlan_sta_status_t *pind = (wlan_sta_status_t *)pmsg->data; 

+	sc_wifi_sta_status_t msg = {0};

+	sc_wifi_sta_status_e pre_status;

+

+	if(NULL == pccctx) {

+		return SC_ERR_SUCCESS;

+	}

+	

+	if(NULL != pccctx->sta_status_cb) {

+		SCLOGI("sc_wifi_sta_status_ind call cb!\n");

+		msg.status = transe_station_status(pind->status); //»»Ëã³É¶ÔÍâÍ·ÎļþÖµ

+		strncpy(msg.ifname, pind->ifname, sizeof(msg.ifname) - 1);

+		strncpy(msg.ap_bssid, pind->ap_bssid, sizeof(msg.ap_bssid) - 1);

+		msg.signal_level = pind->signal_level;

+		msg.has_addr = pind->has_addr;

+		if (msg.has_addr == 1) {

+			inet_pton(AF_INET, pind->str_addr, &msg.addr);

+		}

+		msg.has_addr6 = pind->has_addr6;

+		if (msg.has_addr6 == 1) {

+			inet_pton(AF_INET6, pind->str_addr6, &msg.addr6);

+		}

+		msg.reason_code = transe_station_reason_code(pind->reason_code);

+

+		pre_status = transe_station_status(pind->pre_status);

+		pccctx->sta_status_cb(pre_status, &msg);

+	}

+    return SC_ERR_SUCCESS;

+} 

+

+static sc_wifi_auth_e transe_scan_auth_type(int authmode)

+{

+	sc_wifi_auth_e sc_auth = SC_WIFI_AUTH_MIN;

+

+	if (authmode == CAP_WIFI_AUTH_OPEN) {

+		sc_auth = SC_WIFI_AUTH_OPEN;

+	}

+	else if (authmode == CAP_WIFI_AUTH_WPA2) {

+		sc_auth = SC_WIFI_AUTH_WPA2_PSK;

+	}

+	else if (authmode == CAP_WIFI_AUTH_WPA3) {

+		sc_auth = SC_WIFI_AUTH_WPA3_PSK;

+	}

+	else if (authmode == CAP_WIFI_AUTH_WPA12) {

+		sc_auth = SC_WIFI_AUTH_WPA_WPA2_PSK_BOTH;

+	}

+	else if (authmode == CAP_WIFI_AUTH_WPA23) {

+		sc_auth = SC_WIFI_AUTH_WPA2_WPA3_PSK_BOTH;

+	}

+	else {

+		SCLOGE("transe_scan_auth_type unsuport authmode:%d\n", authmode);

+	}

+	return sc_auth;

+}

+

+static int sc_wifi_sta_scan_ind(const sc_ipc_event* const pevt, const sc_ipc_msg* const pmsg)

+{

+	struct scwifi_context *pccctx = (struct scwifi_context *)pevt->param;

+	wlan_sta_scan_list_t *pind = (wlan_sta_scan_list_t *)pmsg->data; 

+	sc_wifi_sta_scan_list_t msg = {0};

+

+	if(NULL == pccctx) {

+		return SC_ERR_SUCCESS;

+	}

+	

+	if(NULL != pccctx->sta_scan_cb) {

+		int i = 0;

+		SCLOGI("sc_wifi_sta_scan_ind call cb!\n");

+	

+		msg.cnt = pind->cnt;

+		for (i = 0; i < msg.cnt && msg.cnt > 0; i++) {

+			msg.info[i].auth = transe_scan_auth_type(pind->info[i].auth);

+			msg.info[i].channel = pind->info[i].channel;

+			msg.info[i].signal_level = pind->info[i].signal_level;

+			strncpy(msg.info[i].essid, pind->info[i].essid, sizeof(msg.info[i].essid)-1);

+			strncpy(msg.info[i].bssid, pind->info[i].bssid, sizeof(msg.info[i].bssid)-1);

+		}

+		pccctx->sta_scan_cb(&msg);

+	}

+    return SC_ERR_SUCCESS;

+} 

+

+//Ôݶ¨wlan_proxyÖ÷¶¯exitʱ֪ͨ,ÒòproxyÕý³£³¡¾°²»»áÍ˳ö,²»»áµ÷Óõ½

+static int sc_wifi_service_error_ind(const sc_ipc_event* const pevt, const sc_ipc_msg* const pmsg)

+{

+	struct scwifi_context *pccctx = (struct scwifi_context *)pevt->param;

+	scwifi_serv_err_t *pstate_info = (scwifi_serv_err_t *)pmsg->data; 

+

+	if(NULL == pccctx) {

+		return SC_ERR_SUCCESS;

+	}

+	

+	if(NULL != pccctx->serv_err_cb) {

+		SCLOGI("sc_wifi_service_error_ind call cb!\n");

+		pccctx->serv_err_cb(pstate_info->err_code);

+	}

+    return SC_ERR_SUCCESS;

+}

+

+static sc_ipc_msg *scwifi_ipcmsg_set(unsigned int req, unsigned int rsp, int wait, void *data, unsigned int datalen)

+{

+	sc_ipc_msg *pipcmsg = NULL;

+

+	if (datalen > SC_IPC_MSG_PAYLOAD_SIZE) {

+		SCLOGE("wifi data len: %d too long!\n", datalen);

+		return NULL;

+	}

+

+	pipcmsg = (sc_ipc_msg *)malloc(sizeof(sc_ipc_msg) + datalen);

+	if(NULL == pipcmsg) {

+		SCLOGE("wifi ipcmsg no memory!\n");

+		return NULL;

+	}

+	memset(pipcmsg, 0, sizeof(sc_ipc_msg));

+

+	pipcmsg->type = 1;

+	pipcmsg->fd_svr = sc_ipc_get_svr_fd("wifi_proxy_ipc"); //MODULE_ID_WLAN_PROXY

+	pipcmsg->fd_cli = sc_ipc_get_self_fd();

+	pipcmsg->token = 0;

+	pipcmsg->msg_req = req;

+	pipcmsg->msg_rsp = rsp;

+	pipcmsg->wait_rsp = wait;

+	pipcmsg->data_len = datalen;

+

+	if(0 < datalen) {		

+		memcpy(pipcmsg->data, data, pipcmsg->data_len);

+	}

+	

+	return pipcmsg;

+}

+

+static void scwifi_ipcmsg_free(sc_ipc_msg *pipcmsg)

+{

+	if(NULL != pipcmsg) {

+		free(pipcmsg);

+	}

+}

+

+static int scwifi_connect(int enable)

+{

+	sc_ipc_msg *conn_req_msg = NULL;

+	sc_ipc_msg *conn_rsp_msg = NULL;

+	scwifi_connect_t connect_info;

+	scwifi_common_res_t *comm_res = NULL;

+	int ret = SC_ERR_FAIL;

+

+	memset(&connect_info, 0, sizeof(connect_info));

+	connect_info.enable = enable;

+	conn_req_msg = scwifi_ipcmsg_set(SCWIFI_CMD_CONN_REQ, SCWIFI_CMD_CONN_RSP, 1, &connect_info, sizeof(connect_info));

+	if(NULL == conn_req_msg) {

+		SCLOGE("scwifi_connect no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(conn_req_msg, &conn_rsp_msg)) {

+		SCLOGE("scwifi_connect msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		comm_res = (scwifi_common_res_t *)conn_rsp_msg->data;

+		ret = comm_res->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("scwifi_connect fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(conn_req_msg);

+	scwifi_ipcmsg_free(conn_rsp_msg);

+	

+	return ret;

+}

+

+//µ¥½ø³Ìµ¥´Îµ÷ÓÃ

 int sc_wifi_init(void)

 {

-	return 0;

+	int i;

+	sc_ipc_event *pevt;

+

+	if(scwifi_ctx.have_init == 1) {

+		SCLOGE("wifi has inited!!\n");

+		return SC_ERR_SUCCESS;

+	}

+

+	//Ö÷ÒªÓÃÓÚЯ´ø»Øµ÷cb

+	memset(&scwifi_ctx, 0, sizeof(struct scwifi_context));

+		

+	sc_ipc_start_loop(NULL);

+	

+	/*×¢²áʼþÉϱ¨ÏûÏ¢´¦Àí*/

+	for(i = 0; i < sizeof(scwifi_notify_evt) / sizeof(sc_ipc_event); i++) {

+		pevt = &scwifi_notify_evt[i];

+		pevt->param = &scwifi_ctx;

+		sc_ipc_register_events(pevt, 1);

+	}	

+

+	if(0 == scwifi_connect(SC_WIFI_ENABLE)) {

+		SCLOGI("connect wlan proxy success.\n");

+	}

+	

+	scwifi_ctx.pre_wifi_status = SC_WIFI_STATUS_DISABLED;

+

+	scwifi_ctx.have_init = 1;

+	

+	SCLOGI("sc_wifi_init suc!\n");

+	return SC_ERR_SUCCESS;

 }

 

 int sc_wifi_uninit(void)

 {

+	int i;

+	sc_ipc_event *pevt;

+

+	if(scwifi_ctx.have_init == 0) {

+		SCLOGE("wifi has uninited!!\n");

+		return SC_ERR_SUCCESS;

+	}

+	

+	for(i = 0; i < sizeof(scwifi_notify_evt) / sizeof(sc_ipc_event); i++) {

+		pevt = &scwifi_notify_evt[i];

+		sc_ipc_event_del(pevt);

+	}

+

+	if(SC_ERR_SUCCESS == scwifi_connect(SC_WIFI_DISABLE)) {

+		SCLOGI("sc_wifi_uninit disconnect success.\n");

+	}

+

+	sc_ipc_terminate_loop();

+	SCLOGI("wifi uninit suc!\n");

 	return 0;

 }

+

+//init dev, insmod ko

+//SC_ERR_NOT_READYʱÇëÖØÊÔ

+int sc_wifi_enable(void)

+{

+	sc_ipc_msg *conn_req_msg = NULL;

+	sc_ipc_msg *conn_rsp_msg = NULL;

+	scwifi_enable_t connect_info = {0};

+	scwifi_common_res_t *comm_res = NULL;

+	int ret = SC_ERR_FAIL;

+

+	connect_info.enable = SC_WIFI_ENABLE;

+	conn_req_msg = scwifi_ipcmsg_set(SCWIFI_CMD_ENABLE_REQ, SCWIFI_CMD_ENABLE_RSP, 1, &connect_info, sizeof(connect_info));

+	if(NULL == conn_req_msg) {

+		SCLOGE("sc_wifi_enable no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(conn_req_msg, &conn_rsp_msg)) {

+		SCLOGE("sc_wifi_enable msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		comm_res = (scwifi_common_res_t *)conn_rsp_msg->data;

+		ret = comm_res->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_enable fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(conn_req_msg);

+	scwifi_ipcmsg_free(conn_rsp_msg);

+	

+	return ret;

+}

+

+//rmmod

+int sc_wifi_disable(void)

+{

+	sc_ipc_msg *conn_req_msg = NULL;

+	sc_ipc_msg *conn_rsp_msg = NULL;

+	scwifi_enable_t connect_info = {0};

+	scwifi_common_res_t *comm_res = NULL;

+	int ret = SC_ERR_FAIL;

+

+	connect_info.enable = SC_WIFI_DISABLE;

+	conn_req_msg = scwifi_ipcmsg_set(SCWIFI_CMD_ENABLE_REQ, SCWIFI_CMD_ENABLE_RSP, 1, &connect_info, sizeof(connect_info));

+	if(NULL == conn_req_msg) {

+		SCLOGE("sc_wifi_disable no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(conn_req_msg, &conn_rsp_msg)) {

+		SCLOGE("sc_wifi_disable msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		comm_res = (scwifi_common_res_t *)conn_rsp_msg->data;

+		ret = comm_res->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_disable fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(conn_req_msg);

+	scwifi_ipcmsg_free(conn_rsp_msg);

+	

+	return ret;

+}

+

+int sc_wifi_set_enable_status_ind_cb(sc_wifi_enable_status_ind_cb_f cb)

+{

+	//when recvmsg, call cb

+	scwifi_ctx.wifi_status_cb = cb;

+	return 0;

+}

+#if 0 //Ö»Ö§³Öµ¥ap¡¢ap+staģʽ,¸ù¾ÝÐèÒª¿ª¹Ø¾ÍÐУ¬²»ÐèÒªÅäÖÃ

+static int transe_work_mode_in(sc_wifi_ap_mode_type_e mode)

+{

+	int sc_mode = IN_WIFI_WORK_MODE_MIN;

+	

+	switch (mode) {

+	case SC_WIFI_WORK_MODE_AP0:

+		sc_mode = IN_WIFI_WORK_MODE_AP0;

+		break;

+/*	

+	case SC_WIFI_WORK_MODE_STA:

+		sc_mode = IN_WIFI_WORK_MODE_STA;

+		break;

+*/		

+	case SC_WIFI_WORK_MODE_AP0_STA:

+		sc_mode = IN_WIFI_WORK_MODE_AP0_STA;

+		break;

+

+	default:

+		SCLOGE("work_mode:%d not support!\n", mode);//ÀíÂÛÉϲ»Ó¦³öÏÖ

+		break;

+	}

+	return sc_mode;

+}

+

+static sc_wifi_ap_mode_type_e transe_work_mode_out(int mode)

+{

+	sc_wifi_ap_mode_type_e sc_mode = SC_WIFI_WORK_MODE_MIN;

+	

+	switch (mode) {

+	case IN_WIFI_WORK_MODE_AP0:

+		sc_mode = SC_WIFI_WORK_MODE_AP0;

+		break;

+/*	

+	case IN_WIFI_WORK_MODE_STA:

+		sc_mode = SC_WIFI_WORK_MODE_STA;

+		break;

+*/		

+	case IN_WIFI_WORK_MODE_AP0_STA:

+		sc_mode = SC_WIFI_WORK_MODE_AP0_STA;

+		break;

+

+	default:

+		SCLOGE("work_mode:%d not support!\n", mode);//ÀíÂÛÉϲ»Ó¦³öÏÖ

+		break;

+	}

+	return sc_mode;

+}

+

+

+//ĬÈÏÇý¶¯¶¼»áÆô¶¯,²»ÐèÒªÉèÖÃ

+//ÀàËÆmtk, °´mode up wlan8, apcli0...µ«ap/sta openʱ¾ÍÄÜ´«

+int sc_wifi_work_mode_set(sc_wifi_work_mode_e mode)

+{

+	sc_ipc_msg *conn_req_msg = NULL;

+	sc_ipc_msg *conn_rsp_msg = NULL;

+	scwifi_workmode_t data_info = {0};

+	scwifi_common_res_t *comm_res = NULL;

+	int ret = SC_ERR_FAIL;

+

+	if (mode <= SC_WIFI_WORK_MODE_MIN || mode >= SC_WIFI_WORK_MODE_MAX) {

+		SCLOGE("wifi_work_mode %d not support.\n", mode);

+		return SC_ERR_BADPARAM;

+	}

+

+	data_info.work_mode = transe_work_mode_in(mode);

+	conn_req_msg = scwifi_ipcmsg_set(SCWIFI_CMD_MODE_REQ, SCWIFI_CMD_MODE_RSP, 1, &data_info, sizeof(data_info));

+	if(NULL == conn_req_msg) {

+		SCLOGE("sc_wifi_work_mode_set no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(conn_req_msg, &conn_rsp_msg)) {

+		SCLOGE("sc_wifi_work_mode_set msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		comm_res = (scwifi_common_res_t *)conn_rsp_msg->data;

+		ret = comm_res->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_work_mode_set fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(conn_req_msg);

+	scwifi_ipcmsg_free(conn_rsp_msg);

+	

+	return ret;

+}

+

+//sc_wifi_work_mode_set

+int sc_wifi_work_mode_get(sc_wifi_work_mode_e *p_mode)

+{

+	sc_ipc_msg *conn_req_msg = NULL;

+	sc_ipc_msg *conn_rsp_msg = NULL;

+	

+	scwifi_mode_res_t *data_res = NULL;

+	int ret = SC_ERR_FAIL;

+

+	conn_req_msg = scwifi_ipcmsg_set(SCWIFI_GET_MODE_REQ, SCWIFI_GET_MODE_RSP, 1, NULL, 0);

+	if(NULL == conn_req_msg) {

+		SCLOGE("sc_wifi_work_mode_get no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(conn_req_msg, &conn_rsp_msg)) {

+		SCLOGE("sc_wifi_work_mode_get msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		data_res = (scwifi_mode_res_t *)conn_rsp_msg->data;

+		ret = data_res->result;

+		if(SC_ERR_SUCCESS == ret) {

+			*p_mode = transe_work_mode_out(data_res->work_mode);

+		}

+		else {

+			SCLOGE("sc_wifi_work_mode_get fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(conn_req_msg);

+	scwifi_ipcmsg_free(conn_rsp_msg);

+	

+	return ret;

+}

+#endif

+//Èç¹ûûopen ap²àÖ»´ænv

+int sc_wifi_ap_ssid_set(sc_wifi_ap_index_e idx, const char *ssid)

+{	

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	wlan_ap_ssid_t req_data = {0};

+	scwifi_common_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+	int i;

+	

+	if (idx <= SC_WIFI_AP_INDEX_MIN || idx >= SC_WIFI_AP_INDEX_MAX) {

+		SCLOGE("sc_wifi_ap_ssid_set invalid idx:%d\n", idx);

+		return SC_ERR_BADPARAM;

+	}

+

+	if (ssid == NULL || strlen(ssid) >= WIFI_SSID_LEN) {

+		SCLOGE("sc_wifi_ap_ssid_set ssid too long:%s\n", ssid);

+		return SC_ERR_BADPARAM;

+	}

+	

+	for (i = 0; i < strlen(ssid); i++) {

+		if (strchr("`$&*\\[];:\'\"<>,",ssid[i]) || !isprint(ssid[i])) {

+			SCLOGE("sc_wifi_ap_ssid_set invalid ssid:%s\n", ssid);

+			return SC_ERR_BADPARAM;

+		}

+	}

+	req_data.idx = idx;

+	snprintf(req_data.ssid, sizeof(req_data.ssid), "%s", ssid);

+

+	req_msg = scwifi_ipcmsg_set(SCWIFI_AP_SET_SSID_REQ, SCWIFI_AP_SET_SSID_RSP, 1, &req_data, sizeof(req_data));

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_ap_ssid_set no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_ap_ssid_set msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_common_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_ap_ssid_set fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+

+	SCLOGI("sc_wifi_ap_ssid_set ret: %d\n", ret);

+	return ret;

+}

+

+//0 not hide, 1 hide Ïà·´µÄ!!!

+int sc_wifi_ap_ssid_hidden_set(sc_wifi_ap_index_e idx, int ssid_hidden)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	wlan_ap_ssid_hide_t req_data = {0};

+	scwifi_common_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+	

+	if (idx <= SC_WIFI_AP_INDEX_MIN || idx >= SC_WIFI_AP_INDEX_MAX) {

+		SCLOGE("ap_ssid_hidden_set invalid idx:%d\n", idx);

+		return SC_ERR_BADPARAM;

+	}

+

+	if (ssid_hidden != 0 && ssid_hidden != 1) {

+		SCLOGE("ap_ssid_hidden_set err hidden:%d\n", ssid_hidden);

+		return SC_ERR_BADPARAM;

+	}

+

+	req_data.idx = idx;

+	req_data.ssid_hide = ssid_hidden;

+

+	req_msg = scwifi_ipcmsg_set(SCWIFI_AP_SET_HIDE_REQ, SCWIFI_AP_SET_HIDE_RSP, 1, &req_data, sizeof(req_data));

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_ap_ssid_hidden_set no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_ap_ssid_hidden_set msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_common_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_ap_ssid_hidden_set fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+

+//¿ÉÒÔ²»ÉèÖà ÓÃĬÈÏÖµ

+//default: has ax->bgnax, other bgn

+int sc_wifi_ap_mode_set(sc_wifi_ap_index_e idx, sc_wifi_ap_mode_type_e mode)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	wlan_ap_wl_mode_t req_data = {0};

+	scwifi_common_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+	

+	if (idx <= SC_WIFI_AP_INDEX_MIN || idx >= SC_WIFI_AP_INDEX_MAX) {

+		SCLOGE("ap_mode_set invalid idx:%d\n", idx);

+		return SC_ERR_BADPARAM;

+	}

+

+	if (mode == SC_WIFI_AP_MODE_80211BGN) {

+		req_data.wl_mode = 4;

+	}

+	else if (mode == SC_WIFI_AP_MODE_80211BGNAX_2G) {

+		req_data.wl_mode = 6;

+	}

+	else {

+		SCLOGE("ap_mode_set err mode:%d\n", mode);

+		return SC_ERR_BADPARAM;

+	}

+

+	req_data.idx = idx;

+

+	req_msg = scwifi_ipcmsg_set(SCWIFI_AP_SET_MODE_REQ, SCWIFI_AP_SET_MODE_RSP, 1, &req_data, sizeof(req_data));

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_ap_mode_set no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_ap_mode_set msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_common_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_ap_mode_set fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+

+//default 20/40MHz

+int sc_wifi_ap_bandwidth_set(sc_wifi_ap_index_e idx, sc_wifi_bandwidth_e bandwidth)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	wlan_ap_bandwidth_t req_data = {0};

+	scwifi_common_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+	

+	if (idx <= SC_WIFI_AP_INDEX_MIN || idx >= SC_WIFI_AP_INDEX_MAX) {

+		SCLOGE("ap_bandwidth_set invalid idx:%d\n", idx);

+		return SC_ERR_BADPARAM;

+	}

+

+	if (bandwidth == SC_WIFI_BANDWIDTH_20MHZ) {

+		req_data.htMode = 0;

+	}

+	else if (bandwidth == SC_WIFI_BANDWIDTH_20_40MHZ) {

+		req_data.htMode = 1;

+	}

+	else {

+		SCLOGE("ap_bandwidth_set err band:%d\n", bandwidth);

+		return SC_ERR_BADPARAM;

+	}

+

+	req_data.idx = idx;

+

+	req_msg = scwifi_ipcmsg_set(SCWIFI_AP_SET_BW_REQ, SCWIFI_AP_SET_BW_RSP, 1, &req_data, sizeof(req_data));

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_ap_bandwidth_set no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_ap_bandwidth_set msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_common_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_ap_bandwidth_set fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+

+//1-32, aic: sta/ap ¹²´æ = 31,ÔÚÉèÖÃģʽʱÏÞ¶¨,Ö»ÈÃÉè31,ÉÏÏÞÊÇ31,¿ÉÔÚwlan_proxyÖÐÅжÏ

+int sc_wifi_ap_max_sta_num_set(sc_wifi_ap_index_e idx, int max_sta_num)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	wlan_ap_max_sta_t req_data = {0};

+	scwifi_common_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+	

+	if (idx <= SC_WIFI_AP_INDEX_MIN || idx >= SC_WIFI_AP_INDEX_MAX) {

+		SCLOGE("ap_channel_set invalid idx:%d\n", idx);

+		return SC_ERR_BADPARAM;

+	}

+

+	if (max_sta_num < 0 || max_sta_num > 32) {

+		SCLOGE("ap_channel_set err max_sta_num:%d\n", max_sta_num);

+		return SC_ERR_BADPARAM;

+	}

+

+	req_data.idx = idx;

+	req_data.max_sta_num = max_sta_num;

+

+	req_msg = scwifi_ipcmsg_set(SCWIFI_AP_SET_MAX_ACCESS_NUM_REQ, SCWIFI_AP_SET_MAX_ACCESS_NUM_RSP, 1, &req_data, sizeof(req_data));

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_ap_max_sta_num_set no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_ap_max_sta_num_set msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_common_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_ap_max_sta_num_set fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+

+//country_code£ºdefault CN

+int sc_wifi_ap_cc_ch_set(sc_wifi_ap_index_e idx, const char *country_code, int channel)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	wlan_ap_cc_ch_t req_data = {0};

+	scwifi_common_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+	int i = 0;

+	int code_type = 0;

+	

+	if (idx <= SC_WIFI_AP_INDEX_MIN || idx >= SC_WIFI_AP_INDEX_MAX) {

+		SCLOGE("ap_country_code_set invalid idx:%d\n", idx);

+		return SC_ERR_BADPARAM;

+	}

+

+	if (country_code == NULL || strlen(country_code) != 2) {

+		SCLOGE("ap_ssid_set length invalid:%s\n", country_code);

+		return SC_ERR_BADPARAM;

+	}

+	

+	//when code invalid??

+	for (i = 0; i < (sizeof(cc_world)/sizeof(cc_world[0])); i++) {

+		if (strcmp(cc_world[i], country_code) == 0) {

+			code_type = 1;

+			break;

+		}

+	}

+	if (code_type == 0) {

+		for (i = 0; i < (sizeof(cc_fcca)/sizeof(cc_fcca[0])); i++) {

+			if (strcmp(cc_fcca[i], country_code) == 0) {

+				code_type = 2;

+				break;

+			}

+		}

+	}

+

+	if (code_type == 1) {

+		//0-13

+		if (channel < 0 || channel > 13) {

+			SCLOGE("ap_channel_set err ch:%d\n", channel);

+			return SC_ERR_BADPARAM;

+		}

+	}

+	else if (code_type == 2) {

+		//0-11

+		if (channel < 0 || channel > 11) {

+			SCLOGE("ap_channel_set err ch:%d\n", channel);

+			return SC_ERR_BADPARAM;

+		}

+	}

+	else {

+		SCLOGE("ap_ssid_set code invalid:%s\n", country_code);

+		return SC_ERR_BADPARAM;

+	}

+	

+	req_data.idx = idx;

+	snprintf(req_data.countrycode, sizeof(req_data.countrycode), "%s", country_code);

+	req_data.channel = channel;

+

+	req_msg = scwifi_ipcmsg_set(SCWIFI_AP_SET_CC_CH_REQ, SCWIFI_AP_SET_CC_CH_RSP, 1, &req_data, sizeof(req_data));

+	if (NULL == req_msg) {

+		SCLOGE("sc_wifi_ap_cc_ch_set no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_ap_cc_ch_set msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_common_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_ap_cc_ch_set fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+

+/*char to hex*/

+static char c2x (char c)

+{

+	if ( (c >= '0') && (c <= '9')) {

+		return c - '0';

+	}

+	if ( (c >= 'a') && (c <= 'f')) {

+		return (c - 'a') + 10;

+	}

+	if ( (c >= 'A') && (c <= 'F')) {

+		return (c - 'A') + 10;

+	}

+	return 0;

+}

+

+/*string to hex*/

+static unsigned char s2x (char *s)

+{

+	int     i;

+	char    str[3];

+	unsigned char result;

+

+

+	for (i = 0; i < 3; i++) {

+		str[i] = *s++;

+		if (str[i] == '\0') {

+			break;

+		}

+	}

+

+	result = 0;

+	for (i = 0; i < 3; i++) {

+		if (str[i] == '\0') {

+			break;

+		}

+		result = (unsigned char) (c2x (str[i]) + (result << 4));

+	}

+

+	return result;

+}

+

+/*FF:FF:FF:FF:FF:FF to 0xFFFFFFFFFFFF*/

+static unsigned  char * a2xx (const unsigned char* addr, unsigned char *mac)

+{

+	int i = 0;

+	unsigned char *p = addr;

+	unsigned char str[3] = {0};

+

+	for (i = 0; i < 6; i++) {

+		strncpy (str, p, 2);

+		mac[i] = s2x (str);

+		p += 3;

+	}

+

+	return mac;

+}

+

+/**

+ * is_zero_ether_addr - Determine if give Ethernet address is all zeros.

+ * @addr: Pointer to a six-byte array containing the Ethernet address

+ *

+ * Return true if the address is all zeroes.

+ *

+ * Please note: addr must be aligned to u16.

+ */

+static  int  is_zero_ether_addr (const unsigned char * a)

+{

+	return ! (a[0] | a[1] | a[2] | a[3] | a[4] | a[5]);

+}

+

+/**

+ * is_multicast_ether_addr - Determine if the Ethernet address is a multicast.

+ * @addr: Pointer to a six-byte array containing the Ethernet address

+ *

+ * Return true if the address is a multicast address.

+ * By definition the broadcast address is also a multicast address.

+ */

+static  int  is_multicast_ether_addr (const unsigned char *addr)

+{

+	return 0x01 & addr[0];

+}

+

+/**

+ * is_valid_ether_addr - Determine if the given Ethernet address is valid

+ * @addr: Pointer to a six-byte array containing the Ethernet address

+ *

+ * Check that the Ethernet address (MAC) is not 00:00:00:00:00:00, is not

+ * a multicast address, and is not FF:FF:FF:FF:FF:FF.

+ *

+ * Return true if the address is valid.

+ *

+ * Please note: addr must be aligned to u16.

+ */

+static  int  is_valid_ether_addr (const unsigned char *addr)

+{

+	/* FF:FF:FF:FF:FF:FF is a multicast address so we don't need to

+	 * explicitly check for it here. */

+	return !is_multicast_ether_addr (addr) && !is_zero_ether_addr (addr);

+}

+

+static int check_mac_str(char *mac)

+{

+	char list_old[20] = {0};

+	int num = 0;

+

+	char *splited_string = NULL;

+	char *save = NULL;

+	const char *delimiter = ":";

+	int list_len = strlen(mac);

+

+	if (list_len != strlen("FF:FF:FF:FF:FF:FF")) {

+		SCLOGE("mac lenth err");

+		return 0;

+	}

+

+	snprintf(list_old, sizeof(list_old), "%s", mac);

+

+	//·Ö¸î×Ö·û´®£¬´æ´¢µ½½á¹¹Ìå

+	splited_string = strtok_r(list_old, delimiter, &save);

+	while (splited_string) {

+		if (strlen(splited_string) != 2) {

+			SCLOGE("mac byte lenth err");

+			return 0;

+		}

+

+		if (!((splited_string[0] >= '0' && splited_string[0] <= '9')

+        	|| (splited_string[0] >= 'A' && splited_string[0] <= 'F')

+        	|| (splited_string[0] >= 'a' && splited_string[0] <= 'f'))) {

+            SCLOGE("mac byte0 err");

+			return 0;

+        }

+		

+		if (!((splited_string[1] >= '0' && splited_string[1] <= '9')

+        	|| (splited_string[1] >= 'A' && splited_string[1] <= 'F')

+        	|| (splited_string[1] >= 'a' && splited_string[1] <= 'f'))) {

+            SCLOGE("mac byte1 err");

+			return 0;

+        }

+		

+		num++;

+		splited_string = strtok_r(NULL, delimiter, &save);

+	}

+	

+	if (num != 6) {

+		SCLOGE("mac num err");

+		return 0;

+	}

+	

+	return 1;

+}

+

+static int is_valid_mac(const char *mac)

+{

+	unsigned char a[6] = {0};

+

+	if (check_mac_str(mac) == 0) {

+		SCLOGE("%s not a mac", mac);

+		return 0;

+	}

+

+	a2xx(mac, a);

+

+	SCLOGI("addr=%02x%02x%02x%02x%02x%02x", a[0], a[1], a[2], a[3], a[4], a[5]);

+	return is_valid_ether_addr((const unsigned char *)a);

+}

+

+static int check_mac_list(char *mac_list)

+{

+	char list_old[360] = {0};

+

+	char *splited_string = NULL;

+	char *save = NULL;

+	const char *delimiter = ";";

+	int list_len = strlen(mac_list);

+

+	if (list_len == 0) {

+		SCLOGE("mac_list empty");

+		return 0;

+	}

+

+	snprintf(list_old, sizeof(list_old), "%s", mac_list);

+

+	//·Ö¸î×Ö·û´®£¬´æ´¢µ½½á¹¹Ìå

+	splited_string = strtok_r(list_old, delimiter, &save);

+	while (splited_string) {

+		if (0 == is_valid_mac(splited_string)) {

+			SCLOGE("invalid mac:%s", splited_string);

+			return 0;

+		}

+

+		splited_string = strtok_r(NULL, delimiter, &save);

+	}

+

+	return 1;

+}

+

+//»áÉè¸øËùÓеÄAP

+//ͬwebui,ÿ´ÎÉèÖÃ,Я´øËùÓеÄlist,Ö§³Ö×î¶à10¸ö

+//set rule & mac

+//mac_list AA:BB:CC:DD:EE:00;AA:BB:CC:DD:EE:01;AA:BB:CC:DD:EE:02

+int sc_wifi_ap_acl_set(sc_wifi_ap_index_e idx,

+    sc_wifi_mac_acl_rule_e acl_rule,

+    char *mac_list)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	wlan_ap_acl_t req_data = {0};

+	scwifi_common_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+	

+	if (idx <= SC_WIFI_AP_INDEX_MIN || idx >= SC_WIFI_AP_INDEX_MAX) {

+		SCLOGE("ap_acl_set invalid idx:%d\n", idx);

+		return SC_ERR_BADPARAM;

+	}

+

+	if (acl_rule <= SC_WIFI_MAC_ACL_RULE_MIN || acl_rule >= SC_WIFI_MAC_ACL_RULE_MAX) {

+		SCLOGE("ap_acl_set invalid idx:%d\n", acl_rule);

+		return SC_ERR_BADPARAM;

+	}

+

+	if (mac_list == NULL || strlen(mac_list) >= sizeof(req_data.acl_list)) {

+		SCLOGE("ap_acl_set length invalid:%s\n", mac_list);

+		return SC_ERR_BADPARAM;

+	}

+	if (check_mac_list(mac_list) == 0) {

+		SCLOGE("ap_acl_set mac invalid:%s\n", mac_list);

+		return SC_ERR_BADPARAM;

+	}

+

+	req_data.idx = idx;

+	req_data.acl_rule = acl_rule;

+	snprintf(req_data.acl_list, sizeof(req_data.acl_list), "%s", mac_list);

+

+	req_msg = scwifi_ipcmsg_set(SCWIFI_AP_SET_ACL_REQ, SCWIFI_AP_SET_ACL_RSP, 1, &req_data, sizeof(req_data));

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_ap_acl_set no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_ap_acl_set msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_common_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_ap_acl_set fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+

+//²»Éèpairwise, group_rekey

+int sc_wifi_ap_auth_set(sc_wifi_ap_index_e idx, sc_wifi_ap_auth_t *p_auth)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	wlan_ap_auth_t req_data = {0};

+	scwifi_common_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+	

+	if (idx <= SC_WIFI_AP_INDEX_MIN || idx >= SC_WIFI_AP_INDEX_MAX) {

+		SCLOGE("ap_auth_set invalid idx:%d\n", idx);

+		return SC_ERR_BADPARAM;

+	}

+

+	switch (p_auth->auth) {

+		case SC_WIFI_AUTH_OPEN:

+			strncpy(req_data.authmode, "OPEN", sizeof(req_data.authmode) - 1);

+			strncpy(req_data.encrypt, "NONE", sizeof(req_data.encrypt) - 1);

+			break;

+		

+		case SC_WIFI_AUTH_WPA2_PSK:

+			strncpy(req_data.authmode, "WPA2PSK", sizeof(req_data.authmode) - 1);

+			strncpy(req_data.encrypt, "AES", sizeof(req_data.encrypt) - 1);

+			break;

+		

+		case SC_WIFI_AUTH_WPA3_PSK:

+			strncpy(req_data.authmode, "WPA3Personal", sizeof(req_data.authmode) - 1);

+			strncpy(req_data.encrypt, "AES", sizeof(req_data.encrypt) - 1);

+			break;

+	

+		case SC_WIFI_AUTH_WPA_WPA2_PSK_BOTH:

+			strncpy(req_data.authmode, "WPAPSKWPA2PSK", sizeof(req_data.authmode) - 1);

+			strncpy(req_data.encrypt, "TKIPAES", sizeof(req_data.encrypt) - 1);

+			break;	

+		

+		case SC_WIFI_AUTH_WPA2_WPA3_PSK_BOTH:

+			strncpy(req_data.authmode, "WPA2WPA3", sizeof(req_data.authmode) - 1);

+			strncpy(req_data.encrypt, "AES", sizeof(req_data.encrypt) - 1);

+			break;

+		

+		default:

+			SCLOGE("ap_auth_set unknow auth:%d.\n", p_auth->auth);

+			return SC_ERR_BADPARAM;

+	}

+

+	if (strlen(p_auth->passwd) < 8 || strlen(p_auth->passwd) > 63) {

+		SCLOGE("ap_auth_set length invalid:%d,%s\n", strlen(p_auth->passwd), p_auth->passwd);

+		return SC_ERR_BADPARAM;

+	}

+

+	//ÅжÏÊÇ·ñÓÐЧ?

+	strncpy(req_data.pwd, p_auth->passwd, sizeof(req_data.pwd) - 1);

+	req_data.idx = idx;

+	

+	req_msg = scwifi_ipcmsg_set(SCWIFI_AP_SET_AUTH_REQ, SCWIFI_AP_SET_AUTH_RSP, 1, &req_data, sizeof(req_data));

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_ap_auth_set no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_ap_auth_set msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_common_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_ap_auth_set fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+

+static sc_wifi_ap_mode_type_e transe_ap_mode(int mode)

+{

+	sc_wifi_ap_mode_type_e sc_mode = SC_WIFI_AP_MODE_MIN;

+	if (mode == 4) {

+		sc_mode = SC_WIFI_AP_MODE_80211BGN;

+	}

+	else if (mode == 6) {

+		sc_mode = SC_WIFI_AP_MODE_80211BGNAX_2G;

+	}

+	else {

+		SCLOGE("transe_ap_mode unsuport mode:%d\n", mode);

+	}

+	return sc_mode;

+}

+

+static sc_wifi_bandwidth_e transe_ap_bandwidth(int bw)

+{

+	sc_wifi_bandwidth_e sc_bw = SC_WIFI_BANDWIDTH_MIN;

+	if (bw == 0) {

+		sc_bw = SC_WIFI_BANDWIDTH_20MHZ;

+	}

+	else if (bw == 1) {

+		sc_bw = SC_WIFI_BANDWIDTH_20_40MHZ;

+	}

+	else {

+		SCLOGE("transe_ap_bandwidth unsuport bw:%d\n", bw);

+	}

+	return sc_bw;

+}

+

+static sc_wifi_mac_acl_rule_e transe_ap_acl_rule(int rule)

+{

+	sc_wifi_mac_acl_rule_e sc_rule = SC_WIFI_MAC_ACL_RULE_MIN;

+	if (rule == 0) {

+		sc_rule = SC_WIFI_MAC_ACL_RULE_NONE;

+	}

+	else if (rule == 1) {

+		sc_rule = SC_WIFI_MAC_ACL_RULE_WHITE;

+	}

+	else if (rule == 2) {

+		sc_rule = SC_WIFI_MAC_ACL_RULE_BLACK;

+	}

+	else {

+		SCLOGE("transe_ap_acl_rule unsuport rule:%d\n", rule);

+	}

+	return sc_rule;

+}

+

+static sc_wifi_auth_e transe_ap_auth_type(char *authmode, char *encrypt)

+{

+	sc_wifi_auth_e sc_auth = SC_WIFI_AUTH_MIN;

+

+	if (strcmp(authmode, "OPEN") == 0) {

+		sc_auth = SC_WIFI_AUTH_OPEN;

+	}

+	else if (strcmp(authmode, "WPA2PSK") == 0) {

+		sc_auth = SC_WIFI_AUTH_WPA2_PSK;

+	}

+	else if (strcmp(authmode, "WPA3Personal") == 0) {

+		sc_auth = SC_WIFI_AUTH_WPA3_PSK;

+	}

+	else if (strcmp(authmode, "WPAPSKWPA2PSK") == 0) {

+		sc_auth = SC_WIFI_AUTH_WPA_WPA2_PSK_BOTH;

+	}

+	else if (strcmp(authmode, "WPA2WPA3") == 0) {

+		sc_auth = SC_WIFI_AUTH_WPA2_WPA3_PSK_BOTH;

+	}

+	else {

+		SCLOGE("transe_ap_auth_type unsuport authmode:%s\n", authmode);

+	}

+	return sc_auth;

+}

+

+int sc_wifi_ap_param_get(sc_wifi_ap_index_e idx, sc_wifi_ap_param_t *p_param)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	scwifi_ap_index_t data_req = {0};

+	scwifi_ap_param_res_t *data_res = NULL;

+	int ret = SC_ERR_FAIL;

+

+	if (idx <= SC_WIFI_AP_INDEX_MIN || idx >= SC_WIFI_AP_INDEX_MAX) {

+		SCLOGE("ap_param_get invalid idx:%d\n", idx);

+		return SC_ERR_BADPARAM;

+	}

+

+	req_msg = scwifi_ipcmsg_set(SCWIFI_GET_AP_PARAM_REQ, SCWIFI_GET_AP_PARAM_RSP, 1, &data_req, sizeof(data_req));

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_ap_param_get no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_ap_param_get msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		data_res = (scwifi_ap_param_res_t *)rsp_msg->data;

+		ret = data_res->result;

+		if(SC_ERR_SUCCESS == ret) {

+			strncpy(p_param->ssid, data_res->ssid, sizeof(p_param->ssid) - 1);

+			p_param->ssid_hide = data_res->ssid_hide;

+			p_param->mode = transe_ap_mode(data_res->mode);

+			p_param->bandwidth = transe_ap_bandwidth(data_res->bandwidth);

+			p_param->channel = data_res->channel;

+			p_param->max_sta_num = data_res->max_sta_num;

+			strncpy(p_param->countrycode, data_res->countrycode, sizeof(p_param->countrycode) - 1);

+			p_param->acl_rule = transe_ap_acl_rule(data_res->acl_rule);

+			strncpy(p_param->mac_list, data_res->mac_list, sizeof(p_param->mac_list) - 1);

+			p_param->auth.auth = transe_ap_auth_type(data_res->authmode, data_res->encrypt);

+			strncpy(p_param->auth.passwd, data_res->pwd, sizeof(p_param->auth.passwd) - 1);

+			

+		}

+		else {

+			SCLOGE("sc_wifi_ap_param_get fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+

+int sc_wifi_ap_set_status_ind_cb(sc_wifi_ap_status_ind_cb_f cb)

+{

+	scwifi_ctx.ap_status_cb = cb;

+	return 0;

+}

+

+int sc_wifi_ap_start(sc_wifi_ap_index_e idx)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	wlan_ap_enable_t req_data = {0};

+	scwifi_common_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+	

+	if (idx <= SC_WIFI_AP_INDEX_MIN || idx >= SC_WIFI_AP_INDEX_MAX) {

+		SCLOGE("ap_start invalid idx:%d\n", idx);

+		return SC_ERR_BADPARAM;

+	}

+

+	req_data.idx = idx;

+	req_data.enable = SC_WIFI_ENABLE;

+

+	req_msg = scwifi_ipcmsg_set(SCWIFI_AP_ENABLE_REQ, SCWIFI_AP_ENABLE_RSP, 1, &req_data, sizeof(req_data));

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_ap_start no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_ap_start msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_common_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_ap_start fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+

+int sc_wifi_ap_stop(sc_wifi_ap_index_e idx)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	wlan_ap_enable_t req_data = {0};

+	scwifi_common_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+	

+	if (idx <= SC_WIFI_AP_INDEX_MIN || idx >= SC_WIFI_AP_INDEX_MAX) {

+		SCLOGE("ap_stop invalid idx:%d\n", idx);

+		return SC_ERR_BADPARAM;

+	}

+

+	req_data.idx = idx;

+	req_data.enable = SC_WIFI_DISABLE;

+

+	req_msg = scwifi_ipcmsg_set(SCWIFI_AP_ENABLE_REQ, SCWIFI_AP_ENABLE_RSP, 1, &req_data, sizeof(req_data));

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_ap_stop no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_ap_stop msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_common_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_ap_stop fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+//¾¡Á¿Óûص÷»ñÈ¡, »Øµ÷ÊÇÒì²½µÄ ¿ÉÄÜÊÇͬ²½ÐèÒª

+int sc_wifi_ap_get_status(sc_wifi_ap_index_e idx, sc_wifi_ap_status_t *p_stat)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	scwifi_ap_index_t req_data = {0};

+	scwifi_ap_enable_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+

+	if (idx <= SC_WIFI_AP_INDEX_MIN || idx >= SC_WIFI_AP_INDEX_MAX) {

+		SCLOGE("ap_get_status invalid idx:%d\n", idx);

+		return SC_ERR_BADPARAM;

+	}

+

+	req_data.idx = idx;

+	req_msg = scwifi_ipcmsg_set(SCWIFI_GET_AP_STATUS_REQ, SCWIFI_GET_AP_STATUS_RSP, 1, &req_data, sizeof(req_data));

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_ap_get_status no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_ap_get_status msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_ap_enable_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS == ret) {

+			p_stat->status = transe_ap_status(rsp_data->status);

+			strncpy(p_stat->ifname, rsp_data->ifname, sizeof(p_stat->ifname) - 1);

+		}

+		else {

+			SCLOGE("sc_wifi_ap_get_status fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+

+//////////////station

+//ssid authÒ»ÆðÉèÖÃ,authÒ»¶¨Òª×¼È·,²»È»Á¬²»ÉÏÈȵã

+//½Ó¿ÚÖ»ÅжÏÁ˲ÎÊýÊÇ·ñºÏ·¨,δÅжϲÎÊý×éºÏÊÇ·ñ¿ÉÓÃ,ÈçδÅжÏwpa3/aes,ÁíÍ⻹ûÅжÏоƬÊÇ·ñÖ§³ÖÕâЩ¼øÈ¨ÐÅÏ¢

+int sc_wifi_sta_param_set(sc_wifi_sta_param_t *p_param)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	wlan_sta_param_t req_data = {0};

+	scwifi_common_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+	int i = 0;

+

+	if (p_param->ssid == NULL || strlen(p_param->ssid) >= WIFI_SSID_LEN) {

+		SCLOGE("sta_param_set ssid too long:%s\n", p_param->ssid);

+		return SC_ERR_BADPARAM;

+	}

+	

+	for (i = 0; i < strlen(p_param->ssid); i++) {

+		if (strchr("`$&*\\[];:\'\"<>,",p_param->ssid[i]) || !isprint(p_param->ssid[i])) {

+			SCLOGE("sta_param_set invalid ssid:%s\n", p_param->ssid);

+			return SC_ERR_BADPARAM;

+		}

+	}

+

+	snprintf(req_data.ssid, sizeof(req_data.ssid), "%s", p_param->ssid);

+

+	//

+	switch (p_param->auth) {

+		case SC_WIFI_AUTH_OPEN:

+			strncpy(req_data.authmode, "OPEN", sizeof(req_data.authmode) - 1);

+			strncpy(req_data.encrypt, "NONE", sizeof(req_data.encrypt) - 1);

+			break;

+		

+		case SC_WIFI_AUTH_WPA2_PSK:

+			strncpy(req_data.authmode, "WPA2PSK", sizeof(req_data.authmode) - 1);

+			break;

+		

+		case SC_WIFI_AUTH_WPA3_PSK:

+			strncpy(req_data.authmode, "WPA3Personal", sizeof(req_data.authmode) - 1);

+			break;

+	

+		case SC_WIFI_AUTH_WPA_WPA2_PSK_BOTH:

+			strncpy(req_data.authmode, "WPAPSKWPA2PSK", sizeof(req_data.authmode) - 1);

+			break;	

+		

+		case SC_WIFI_AUTH_WPA2_WPA3_PSK_BOTH:

+			strncpy(req_data.authmode, "WPA2WPA3", sizeof(req_data.authmode) - 1);

+			break;

+		

+		default:

+			SCLOGE("sta_param_set unknow auth:%d.\n", p_param->auth);

+			return SC_ERR_BADPARAM;

+	}

+

+	//

+	switch (p_param->pairwise) {

+		case SC_WIFI_AUTH_WPA_PAIRWISE_AUTO:

+			strncpy(req_data.encrypt, "TKIPCCMP", sizeof(req_data.encrypt) - 1);

+			break;

+		

+		case SC_WIFI_AUTH_WPA_PAIRWISE_TKIP:

+			strncpy(req_data.encrypt, "TKIP", sizeof(req_data.encrypt) - 1);

+			break;

+		

+		case SC_WIFI_AUTH_WPA_PAIRWISE_AES:

+			strncpy(req_data.encrypt, "CCMP", sizeof(req_data.encrypt) - 1);

+			break;

+		

+		default:

+			SCLOGE("sta_param_set unknow pairwise:%d.\n", p_param->pairwise);

+			return SC_ERR_BADPARAM;

+	}

+

+	//

+	if (strlen(p_param->passwd) < 8 || strlen(p_param->passwd) > 63) {

+		SCLOGE("sta_param_set length invalid:%d,%s\n", strlen(p_param->passwd), p_param->passwd);

+		return SC_ERR_BADPARAM;

+	}

+

+	//ÅжÏÊÇ·ñÓÐЧ?

+	strncpy(req_data.pwd, p_param->passwd, sizeof(req_data.pwd) - 1);

+

+	req_msg = scwifi_ipcmsg_set(SCWIFI_STA_SET_PARAM_REQ, SCWIFI_STA_SET_PARAM_RSP, 1, &req_data, sizeof(req_data));

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_sta_param_set no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_sta_param_set msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_common_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_sta_param_set fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+

+static sc_wifi_auth_e transe_sta_auth_type(char *authmode)

+{

+	sc_wifi_auth_e sc_auth = SC_WIFI_AUTH_MIN;

+

+	if (strcmp(authmode, "OPEN") == 0) {

+		sc_auth = SC_WIFI_AUTH_OPEN;

+	}

+	else if (strcmp(authmode, "WPA2PSK") == 0) {

+		sc_auth = SC_WIFI_AUTH_WPA2_PSK;

+	}

+	else if (strcmp(authmode, "WPA3Personal") == 0) {

+		sc_auth = SC_WIFI_AUTH_WPA3_PSK;

+	}

+	else if (strcmp(authmode, "WPAPSKWPA2PSK") == 0) {

+		sc_auth = SC_WIFI_AUTH_WPA_WPA2_PSK_BOTH;

+	}

+	else if (strcmp(authmode, "WPA2WPA3") == 0) {

+		sc_auth = SC_WIFI_AUTH_WPA2_WPA3_PSK_BOTH;

+	}

+	else {

+		SCLOGE("transe_sta_auth_type unsuport authmode:%s\n", authmode);

+	}

+	return sc_auth;

+}

+

+static sc_wifi_auth_wpa_psk_e transe_sta_encrypt_type(char *encrypt)

+{

+	sc_wifi_auth_wpa_psk_e sc_auth = SC_WIFI_AUTH_WPA_PAIRWISE_MIN;

+

+	if (strcmp(encrypt, "TKIPCCMP") == 0) {

+		sc_auth = SC_WIFI_AUTH_WPA_PAIRWISE_AUTO;

+	}

+	else if (strcmp(encrypt, "TKIP") == 0) {

+		sc_auth = SC_WIFI_AUTH_WPA_PAIRWISE_TKIP;

+	}

+	else if (strcmp(encrypt, "CCMP") == 0) {

+		sc_auth = SC_WIFI_AUTH_WPA_PAIRWISE_AES;

+	}

+	else {

+		SCLOGE("transe_sta_encrypt_type unsuport encrypt:%s\n", encrypt);

+	}

+	return sc_auth;

+}

+

+int sc_wifi_sta_param_get(sc_wifi_sta_param_t *p_param)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+

+	scwifi_sta_param_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+

+	

+	req_msg = scwifi_ipcmsg_set(SCWIFI_STA_GET_PARAM_REQ, SCWIFI_STA_GET_PARAM_RSP, 1, NULL, 0);

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_sta_param_get no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_sta_param_get msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_sta_param_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS == ret) {

+			//ת»» ·­Òë...

+			strncpy(p_param->ssid, rsp_data->ssid, sizeof(p_param->ssid) - 1);

+			p_param->auth = transe_sta_auth_type(rsp_data->authmode);

+			p_param->pairwise = transe_sta_encrypt_type(rsp_data->encrypt);

+			strncpy(p_param->passwd, rsp_data->pwd, sizeof(p_param->passwd) - 1);

+		}

+		else {

+			SCLOGE("sc_wifi_sta_param_get fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+

+

+//sc_wifi_sta_startÖ®ºó¿ÉÓÃ

+//WIFI_STA_STATUS_DISCONNECTEDºó²ÅÄÜÉèÖã¬Öмä״̬²»Èôò¶Ï£¬ÊÇ·ñÒª¸Ä»úÖÆ?

+//ipv4 ipv6µØÖ·Ã»Éè

+//ûÓÐÇø·Öwap_supplicantÓÐûÓÐÆô¶¯³É¹¦,²»¹ýwap_supplicantÉϱ¨µÄÏûÏ¢ÀïºÃÏñҲûÓÐ×ÔÉíµÄ״̬

+int sc_wifi_sta_set_status_ind_cb(sc_wifi_sta_status_ind_cb_f cb)

+{

+	scwifi_ctx.sta_status_cb = cb;

+	return 0;

+}

+

+//²»ÄÜÔÚsc_wifi_ap_stopʱµ÷ÓÃ

+int sc_wifi_sta_start(void)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	wlan_sta_enable_t req_data = {0};

+	scwifi_common_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+	

+	req_data.enable = 1;

+	req_msg = scwifi_ipcmsg_set(SCWIFI_STA_ENABLE_REQ, SCWIFI_STA_ENABLE_RSP, 1, &req_data, sizeof(req_data));

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_sta_start no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_sta_start msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_common_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_sta_start fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+

+int sc_wifi_sta_stop(void)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	wlan_sta_enable_t req_data = {0};

+	scwifi_common_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+	

+	req_data.enable = 0;

+	req_msg = scwifi_ipcmsg_set(SCWIFI_STA_ENABLE_REQ, SCWIFI_STA_ENABLE_RSP, 1, &req_data, sizeof(req_data));

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_sta_stop no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_sta_stop msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_common_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_sta_stop fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+

+int sc_wifi_sta_get_status(sc_wifi_sta_status_t *p_sta)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+

+	scwifi_sta_stat_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+

+	

+	req_msg = scwifi_ipcmsg_set(SCWIFI_GET_STA_STATUS_REQ, SCWIFI_GET_STA_STATUS_RSP, 1, NULL, 0);

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_sta_get_status no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_sta_get_status msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_sta_stat_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS == ret) {

+			//ת»» ·­Òë... ²ÎÕÕÖ÷¶¯Éϱ¨

+			p_sta->status = transe_station_status(rsp_data->status.status); //»»Ëã³É¶ÔÍâÍ·ÎļþÖµ

+			strncpy(p_sta->ifname, rsp_data->status.ifname, sizeof(p_sta->ifname) - 1);

+			strncpy(p_sta->ap_bssid, rsp_data->status.ap_bssid, sizeof(p_sta->ap_bssid) - 1);

+			p_sta->signal_level = rsp_data->status.signal_level;

+			p_sta->has_addr = rsp_data->status.has_addr;

+			if (p_sta->has_addr == 1) {

+				inet_pton(AF_INET, rsp_data->status.str_addr, &p_sta->addr);

+			}

+			p_sta->has_addr6 = rsp_data->status.has_addr6;

+			if (p_sta->has_addr6 == 1) {

+				inet_pton(AF_INET6, rsp_data->status.str_addr6, &p_sta->addr6);

+			}

+			p_sta->reason_code = transe_station_reason_code(rsp_data->status.reason_code);

+		}

+		else {

+			SCLOGE("sc_wifi_sta_get_status fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+

+//ÐèÒªÖÜÆÚɨÃèÂð?¿ÉÒԹصô

+int sc_wifi_sta_start_scan(void)

+{

+	sc_ipc_msg *req_msg = NULL;

+	sc_ipc_msg *rsp_msg = NULL;

+	scwifi_common_res_t *rsp_data = NULL;

+	int ret = SC_ERR_FAIL;

+	

+	req_msg = scwifi_ipcmsg_set(SCWIFI_STA_SCAN_REQ, SCWIFI_STA_SCAN_RSP, 1, NULL, 0);

+	if(NULL == req_msg) {

+		SCLOGE("sc_wifi_sta_start_scan no memory!\n");

+		return SC_ERR_NO_MEMORY;

+	}

+

+	if(0 != sc_ipc_send_msg_wait_rsp(req_msg, &rsp_msg)) {

+		SCLOGE("sc_wifi_sta_start_scan msg fail!\n");

+		ret = SC_ERR_IPC;

+	}

+	else {

+		rsp_data = (scwifi_common_res_t *)rsp_msg->data;

+		ret = rsp_data->result;

+		if(SC_ERR_SUCCESS != ret) {

+			SCLOGE("sc_wifi_sta_start_scan fail: %d!\n", ret);

+		}

+	}

+

+	scwifi_ipcmsg_free(req_msg);

+	scwifi_ipcmsg_free(rsp_msg);

+	

+	return ret;

+}

+

+int sc_wifi_sta_set_scan_result_ind_cb(sc_wifi_sta_scan_result_ind_cb_f cb)

+{

+	scwifi_ctx.sta_scan_cb = cb;

+	return 0;

+}

+

+int sc_wifi_set_service_error_cb(sc_wifi_service_error_cb_f cb)

+{

+	SCLOGE("not use current\n");

+	scwifi_ctx.serv_err_cb = cb;

+	return 0;

+}

+

+//hostapdµÄÉèÖÃ,¾ÍÊÇ32¸ö¶¼±¨µÄʱºò¿ÉÄÜ»áÂý

+int sc_wifi_set_ap_sta_connect_ind_cb(sc_wifi_ap_sta_connect_ind_cb_f cb)

+{

+	scwifi_ctx.ap_sta_change_cb = cb;

+	return 0;

+}

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/libril/ril.cpp b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/libril/ril.cpp
index 80743a7..421edfc 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/libril/ril.cpp
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/libril/ril.cpp
@@ -4320,17 +4320,31 @@
             issueLocalRequest(RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, &data, sizeof(data), socket_id);
 			break;
 		case SETUP_DATA_CALL:			
-			RLOGI("Debug port: Setup Data Call");
-			char pdptype[16];
+			{
+				RLOGI("Debug port: Setup Data Call");
+				char pdptype[16];
+				char def_apn[64] = {0};
+				char def_auth_type[32] = {0};
 
-			if(0 == strncmp("IP", args[1], strlen("IP")) ||
-				0 == strncmp("IPV6", args[1], strlen("IPV6")) ||
-				0 == strncmp("IPV4V6", args[1], strlen("IPV4V6"))) {
-				memset(pdptype, 0, sizeof(pdptype));
-				strncpy(pdptype, args[1], sizeof(pdptype));
-				actData[6] = pdptype;
+				if(0 == strncmp("IP", args[1], strlen("IP")) ||
+					0 == strncmp("IPV6", args[1], strlen("IPV6")) ||
+					0 == strncmp("IPV4V6", args[1], strlen("IPV4V6"))) {
+					memset(pdptype, 0, sizeof(pdptype));
+					strncpy(pdptype, args[1], sizeof(pdptype));
+					actData[6] = pdptype;
+				}
+				if(4 <= number) {
+					memset(def_apn, 0, sizeof(def_apn));
+					strncpy(def_apn, args[2], sizeof(def_apn)-1);
+					actData[2] = def_apn;
+				}
+				if(5 == number) {
+					memset(def_auth_type, 0, sizeof(def_auth_type));
+					strncpy(def_auth_type, args[3], sizeof(def_auth_type)-1);
+					actData[7] = def_auth_type;
+				}
+				issueLocalRequest(RIL_REQUEST_SETUP_DATA_CALL, &actData, (8 * sizeof(char *)), socket_id);
 			}
-			issueLocalRequest(RIL_REQUEST_SETUP_DATA_CALL, &actData, (8 * sizeof(char *)), socket_id);
 			break;
 		case DATA_CALL_LIST:
 			RLOGI("Debug port: Data Call List");
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/atchannel.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/atchannel.c
index bb4ef0e..f93a27d 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/atchannel.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/atchannel.c
@@ -663,18 +663,17 @@
         err = AT_ERROR_COMMAND_PENDING;
         goto error;
     }
-
-    err = writeline (command, channel->handle);
-
-    if (err < 0) {
-        goto error;
-    }
+    
 	RLOGD("at_send_command_full_nolock %d",__LINE__);
     channel->s_type = type;
     channel->s_responsePrefix = responsePrefix;
     channel->s_smsPDU = smspdu;
     channel->sp_response = at_response_new();
 
+	err = writeline (command, channel->handle);
+    if (err < 0) {
+        goto error;
+    }
 #ifndef USE_NP
     if (timeoutMsec != 0) {
         setTimespecRelative(&ts, timeoutMsec);
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/reference-ril.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/reference-ril.c
index 6df77ce..754aeec 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/reference-ril.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/reference-ril.c
Binary files differ
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/ril_ps.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/ril_ps.c
index 66db9ab..2cb95a3 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/ril_ps.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/ril_ps.c
@@ -42,6 +42,24 @@
 #include "pstraceint.h"

 #define __unused __attribute__((__unused__))

 

+#define DEFAULT_APN_KEY "default"

+

+#define PDP_NORMAL_CID_INVALID (-1)

+

+static int requestDefaultCid(void)

+{

+	char default_cid[30] = {0};

+	int cid = -1;

+

+	memset(default_cid, 0, sizeof(default_cid));

+	sc_cfg_get("default_cid", default_cid, sizeof(default_cid));

+

+	if(strlen(default_cid)) {

+		cid = atoi(default_cid);

+	}

+	

+	return cid;

+}

 

 static void requestOrSendDataCallList(RIL_Token *t)

 {

@@ -256,8 +274,13 @@
 			/*set ifname*/

 			memset(nv_buf, 0, sizeof(nv_buf));

 #ifdef USE_CAP_SUPPORT

-			sc_cfg_get("pswan_cap", nv_pswan_cap, sizeof(nv_pswan_cap));		

-			snprintf(nv_buf, sizeof(nv_buf), "%s%d", nv_pswan_cap, responses[i].cid);

+			if(requestDefaultCid() != responses[i].cid) {

+				sc_cfg_get("pswan_cap", nv_pswan_cap, sizeof(nv_pswan_cap));		

+				snprintf(nv_buf, sizeof(nv_buf), "%s%d", nv_pswan_cap, responses[i].cid);

+			}

+			else {

+				snprintf(nv_buf, sizeof(nv_buf), "%s%d", nv_pswan, responses[i].cid);

+			}

 #else

 			snprintf(nv_buf, sizeof(nv_buf), "%s%d", nv_pswan, responses[i].cid);

 #endif										

@@ -270,7 +293,12 @@
 				/*set V4 addresses*/

 				memset(nv_buf, 0, sizeof(nv_buf));

 				memset(ip_addr_buf, 0, sizeof(ip_addr_buf));

-				snprintf(nv_buf, sizeof(nv_buf), "%s%d_pdp_ip", nv_pswan, responses[i].cid);

+				if(requestDefaultCid() != responses[i].cid) {

+					snprintf(nv_buf, sizeof(nv_buf), "%s%d_pdp_ip", nv_pswan, responses[i].cid);

+				}

+				else {

+					snprintf(nv_buf, sizeof(nv_buf), "%s%d_ip", nv_pswan, responses[i].cid);

+				}

 				sc_cfg_get(nv_buf, ip_addr_buf, sizeof(ip_addr_buf) - 1);

 

 				if (0 != strncmp(ip_addr_buf, "0.0.0.0", NV_IP_LEN) && (0 != strncmp(ip_addr_buf, "", NV_IP_LEN))) {				

@@ -309,9 +337,13 @@
 

 				memset(nv_buf, 0, sizeof(nv_buf));

 				memset(ip_addr_buf, 0, sizeof(ip_addr_buf));

-			

-				//snprintf(nv_buf, sizeof(nv_buf), "%s%d_ipv6_ip", nv_pswan, responses[i].cid);

-				snprintf(nv_buf, sizeof(nv_buf), "%s%d_ipv6_pdp", nv_pswan, responses[i].cid);

+							

+				if(requestDefaultCid() != responses[i].cid) {

+					snprintf(nv_buf, sizeof(nv_buf), "%s%d_ipv6_pdp", nv_pswan, responses[i].cid);

+				}

+				else {

+					snprintf(nv_buf, sizeof(nv_buf), "%s%d_ipv6_ip", nv_pswan, responses[i].cid);

+				}

 				sc_cfg_get(nv_buf, ip_addr_buf, sizeof(ip_addr_buf) - 1);	

 

 				if ((0 != strcmp(ip_addr_buf, "::")) && (0 != strcmp(ip_addr_buf, ""))) {

@@ -414,7 +446,7 @@
     at_response_free(p_response);

 }

 

-static int parseSetupDataCall(char *line, RIL_Token t)

+static int parseSetupDataCall(char *line, RIL_Token t, int act_type)

 {

 	ATResponse *p_response;

     int err;

@@ -482,8 +514,13 @@
 	/*set ifname*/

 	memset(nv_buf, 0, sizeof(nv_buf));

 #ifdef USE_CAP_SUPPORT

-	sc_cfg_get("pswan_cap", nv_pswan_cap, sizeof(nv_pswan_cap));		

-	snprintf(nv_buf, sizeof(nv_buf), "%s%d", nv_pswan_cap, responses->cid);	

+	if(2 != act_type) {

+		sc_cfg_get("pswan_cap", nv_pswan_cap, sizeof(nv_pswan_cap));		

+		snprintf(nv_buf, sizeof(nv_buf), "%s%d", nv_pswan_cap, responses->cid);	

+	}

+	else{/*PDP_NORMAL*/		

+		snprintf(nv_buf, sizeof(nv_buf), "%s%d", nv_pswan, responses->cid);

+	} 

 #else

 	snprintf(nv_buf, sizeof(nv_buf), "%s%d", nv_pswan, responses->cid);

 #endif	

@@ -496,7 +533,12 @@
 		/*set V4 addresses*/

 		memset(nv_buf, 0, sizeof(nv_buf));

 		memset(ip_addr_buf, 0, sizeof(ip_addr_buf));

-		snprintf(nv_buf, sizeof(nv_buf), "%s%d_pdp_ip", nv_pswan, responses->cid);

+		if(2 != act_type) {

+			snprintf(nv_buf, sizeof(nv_buf), "%s%d_pdp_ip", nv_pswan, responses->cid);

+		}

+		else {

+			snprintf(nv_buf, sizeof(nv_buf), "%s%d_ip", nv_pswan, responses->cid);

+		}

 		sc_cfg_get(nv_buf, ip_addr_buf, sizeof(ip_addr_buf) - 1);

 

 		if (0 != strncmp(ip_addr_buf, "0.0.0.0", NV_IP_LEN) && (0 != strncmp(ip_addr_buf, "", NV_IP_LEN))) {				

@@ -535,9 +577,13 @@
 

 		memset(nv_buf, 0, sizeof(nv_buf));

 		memset(ip_addr_buf, 0, sizeof(ip_addr_buf));

-	

-		//snprintf(nv_buf, sizeof(nv_buf), "%s%d_ipv6_ip", nv_pswan, responses->cid);

-		snprintf(nv_buf, sizeof(nv_buf), "%s%d_ipv6_pdp", nv_pswan, responses->cid);

+			

+		if(2 != act_type) {

+			snprintf(nv_buf, sizeof(nv_buf), "%s%d_ipv6_pdp", nv_pswan, responses->cid);

+		}

+		else {

+			snprintf(nv_buf, sizeof(nv_buf), "%s%d_ipv6_ip", nv_pswan, responses->cid);

+		}

 		sc_cfg_get(nv_buf, ip_addr_buf, sizeof(ip_addr_buf) - 1);	

 

 		if ((0 != strcmp(ip_addr_buf, "::")) && (0 != strcmp(ip_addr_buf, ""))) {

@@ -620,6 +666,63 @@
 	return 0;		

 }

 

+static int requestDefaultApn(char *pdpType, char *defApn, char *authType)

+{					

+	char nv_sim_plmn[32] = {0};

+	char *cmd;

+	int err;

+	ATResponse *p_response = NULL;

+	ATLine *p_cur;	

+	char *out;

+

+	if(NULL == pdpType || NULL == defApn || NULL == authType) {

+		return 0;

+	}

+	memset(nv_sim_plmn, 0, sizeof(nv_sim_plmn));

+	sc_cfg_get("sim_plmn", nv_sim_plmn, sizeof(nv_sim_plmn));

+

+	asprintf(&cmd, "AT+ZDEFAPN=%s", nv_sim_plmn);

+	err = at_send_command_multiline (cmd, "+ZDEFAPN:", &p_response);

+

+	free(cmd);

+	if (err < 0 || (p_response->success == 0)) {

+        return -1;

+    }

+	/*+ZDEFAPN:IP,cmnet,1,,*/

+	for (p_cur = p_response->p_intermediates; p_cur != NULL;

+         p_cur = p_cur->p_next) {

+        char *line = p_cur->line;

+

+        err = at_tok_start(&line);

+        if (err < 0)

+            return -1;

+

+        err = at_tok_nextstr(&line, &out);//pdpType

+        if (err < 0)

+            return -1;

+		strcpy(pdpType, out);

+		

+        err = at_tok_nextstr(&line, &out);//defApn

+        if (err < 0)

+            return -1;

+		strcpy(defApn, out);

+

+		/*

+		*0 => PAP and CHAP is never performed.

+		*1 => PAP may be performed; CHAP is never performed.

+		*2 => CHAP may be performed; PAP is never performed.

+		*3 => PAP / CHAP may be performed - baseband dependent.

+		*/

+        err = at_tok_nextstr(&line, &out);//authType

+        if (err < 0)

+            return -1;

+		strcpy(authType, out);

+    }

+	at_response_free(p_response);

+

+	return 0;

+}

+

 

 void requestDeactiveDataCall(void **data, size_t datalen, RIL_Token t)

 {

@@ -686,6 +789,7 @@
     }

 	at_response_free(p_response);

 	RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);

+	

 	return;

 error:

     RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0);

@@ -713,10 +817,21 @@
 	const char *username = NULL;

 	const char *password = NULL;

 	const char *challenge = NULL;

+	/*act_typeΪ¼¤»î×éÍøÀàÐÍ£¬

+	 *0ΪAPºË±¾µØ²¦ºÅ,ÎÞЧ

+	 *1ΪCAPºË±¾µØ²¦ºÅ,

+	 *2ΪĬÈϲ¦ºÅ£¨normal£©,Æô¶¯Ä¬ÈÏ·ÓÉ,É豸ËùÓÐÓ¦Óö¼¿ÉÒÔÖ±½ÓÉÏÍø,Ö»Äܲ¥Ò»Â·;

+	 */

+	const char *active_type = NULL;

+

+	char def_pdp_type[32] = {0};

+	char def_apn[32] = {0};

+	char def_auth_type[32] = {0};

 	

 	int auth_type = 0;

 	int profile = 0;

 	char pdptype[32] = {0};	

+	int act_type = 1;

 

    	if(NULL != data) {

 		radio_technology = ((const char **) data)[0];

@@ -760,17 +875,38 @@
 		sc_cfg_get("pdp_type", pdptype, sizeof(pdptype));

 		pdp_type = pdptype;

     }

-	RLOGD("requestSetupDataCall: profile=%d,apn=%s,user=%s,passwd=%s,auth_type=%d,pdp_type=%s", \

-			profile, apn, username ? username : "NULL", password ? password : "NULL", auth_type, pdp_type);

+	if(datalen > 7 * sizeof(char *)) {

+		active_type = ((const char **)data)[7];

+		if(NULL != active_type) {

+			act_type = atoi(active_type);

+		}

+	}

+	RLOGD("requestSetupDataCall: profile=%d,apn=%s,user=%s,passwd=%s,auth_type=%d,pdp_type=%s,act_type=%d", \

+			profile, apn, username ? username : "NULL", password ? password : "NULL", auth_type, pdp_type,act_type);

 

 	memset(atstr, 0, sizeof(atstr));

 	/*AT+ZPDPACT=<cid>,<pdp_type>,<APN>[,<emergency indication>,<P-CSCF_discovery>,<IM_CN_Signalling_Flag_Ind>][,<auth_type>,\

 	 <username>,<password>,<challenge>][,<ppp_cid>][,<default_flag>][,<act_type>] */

 	if(NULL != apn) {

-		snprintf(cmd, sizeof(atstr)-1, "AT+ZPDPACT=0,\"%s\",\"%s\",,,,%d",pdp_type, apn, auth_type);				

+		if(strlen(apn) == strlen(DEFAULT_APN_KEY) && 

+			(0 == strncmp(DEFAULT_APN_KEY, apn, strlen(DEFAULT_APN_KEY)))) {

+

+			memset(def_pdp_type, 0, sizeof(def_pdp_type));

+			memset(def_apn, 0, sizeof(def_apn));

+			memset(def_auth_type, 0, sizeof(def_auth_type));

+			if(requestDefaultApn(def_pdp_type, def_apn, def_auth_type)) {

+				goto error;

+			}

+			RLOGD("requestSetupDataCall:  def_pdp_type=%s,def_apn=%s,def_auth_type=%s", def_pdp_type, def_apn, def_auth_type);

+			auth_type = atoi(def_auth_type);

+			snprintf(cmd, sizeof(atstr)-1, "AT+ZPDPACT=0,\"%s\",\"%s\",,,,%d",def_pdp_type, def_apn, auth_type);

+		}

+		else {

+			snprintf(cmd, sizeof(atstr)-1, "AT+ZPDPACT=0,\"%s\",\"%s\",,,,%d",pdp_type, apn, auth_type);				

+		}

 	}

 	else {

-		asprintf(&cmd, "AT+ZPDPACT=0,\"%s\",\"\",,,,%d", pdp_type, auth_type);

+		snprintf(cmd, sizeof(atstr)-1, "AT+ZPDPACT=0,\"%s\",\"\",,,,%d", pdp_type, auth_type);

 	}

 	

 	cmd = atstr + strlen(atstr);

@@ -799,7 +935,7 @@
 	

 	cmd = atstr + strlen(atstr);

 	/*act_typeΪ¼¤»î×éÍøÀàÐÍ£¬0ΪAPºË±¾µØ²¦ºÅ,1ΪCAPºË±¾µØ²¦ºÅ,2ΪĬÈϲ¦ºÅ,Æô¶¯Ä¬ÈÏ·ÓÉ,É豸ËùÓÐÓ¦Óö¼¿ÉÒÔÖ±½ÓÉÏÍø,Ö»Äܲ¥Ò»Â·;*/

-	snprintf(cmd, sizeof(atstr)-strlen(atstr)-1, ",,,1");

+	snprintf(cmd, sizeof(atstr)-strlen(atstr)-1, ",,,%d",act_type);

 		

     err = at_send_command_singleline_timeout(atstr, "+ZPDPACT:", &p_response, TIMEOUT_ZPDPACT);

 	if (err < 0 || (p_response->success == 0)) {

@@ -808,7 +944,7 @@
     }

 

 	/*+ZPDPACT:<cid>,<pdp_type>[,<v4_addr>,<v4_gw>,<v4_dns1>,<v4_dns2>][,<v6_addr>,<v6_gw>,<v6_dns1>,<v6_dns2>]*/

-	if(0 > parseSetupDataCall(p_response->p_intermediates->line, t)) {

+	if(0 > parseSetupDataCall(p_response->p_intermediates->line, t, act_type)) {

 		goto error;

 	}

 

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/ril_ref.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/ril_ref.c
index 9f21958..4bc6743 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/ril_ref.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/ril/reference-ril/ril_ref.c
@@ -200,7 +200,7 @@
 
 void handle_cgev (const char *s, const char *smsPdu)
 {
-	if(strstr(s, "ME PDN DEACT")) {
+	if(strstr(s, "ME PDN DEACT") || strstr(s, "NW PDN DEACT")) {
         /* Really, we can ignore NW CLASS and ME CLASS events here,
          * but right now we don't since extranous
          * RIL_UNSOL_DATA_CALL_LIST_CHANGED calls are tolerated
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/rild/radiooptions.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/rild/radiooptions.c
index 7326bf0..688fa13 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/rild/radiooptions.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/sdk/rild/radiooptions.c
@@ -237,13 +237,14 @@
 
 static int get_number_args(int argc, char *argv[]) {
     const int option = atoi(argv[1]);
-	
-    if (option != DIAL_CALL && option != SETUP_PDP && option != SETUP_DATA_CALL) {
+
+	return argc - 1;
+    /*if (option != DIAL_CALL && option != SETUP_PDP && option != SETUP_DATA_CALL) {
         return argc - 1;//3;
     } 
 	else {
         return 4;
-    }
+    }*/
 }
 
 int main(int argc, char *argv[])
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/bsp_test/gpio_cmds.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/bsp_test/gpio_cmds.c
old mode 100644
new mode 100755
index 8bccd58..a1e1202
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/bsp_test/gpio_cmds.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/bsp_test/gpio_cmds.c
@@ -103,6 +103,7 @@
 	int direction;
 	int value;
 	int pull_sel;
+	int strength;
 
 	CHECK(nargs != 5, "Usage: gpio_input <gpio> <direction> <value> <pull>\n",
 		exit(1));
@@ -149,6 +150,32 @@
 		printf("gpio%d value:%d\n", gpio, value);
 	}
 
+	/* strength */
+	ret = sc_gpio_strength_get(test_gpio_handle[gpio], &strength);
+	if (ret) {
+		printf("do_gpio_input get strength failed, err:%d\n", errno);
+//		exit(1);
+	} else {
+		printf("gpio%d get strength:%d\n", gpio, strength);
+	}
+
+	strength = 5;
+	ret = sc_gpio_strength_set(test_gpio_handle[gpio], strength);
+	if (ret) {
+		printf("do_gpio_input set strength failed, err:%d\n", errno);
+//		exit(1);
+	} else {
+		printf("gpio%d set strength:%d\n", gpio, strength);
+	}
+
+	ret = sc_gpio_strength_get(test_gpio_handle[gpio], &strength);
+	if (ret) {
+		printf("do_gpio_input get strength failed, err:%d\n", errno);
+//		exit(1);
+	} else {
+		printf("gpio%d get strength:%d\n", gpio, strength);
+	}
+
 	ret = sc_gpio_uninit(test_gpio_handle[gpio]);
 	if (ret) {
 		printf("do_gpio_input release gpio%d failed, err:%d\n", gpio, ret);
@@ -170,6 +197,7 @@
 	int direction;
 	int value;
 	int pull_sel;
+	int strength;
 
 	CHECK(nargs != 5, "Usage: gpio_output <gpio> <direction> <value> <pull>\n",
 		exit(1));
@@ -232,6 +260,29 @@
 		printf("gpio%d value:%d\n", gpio, value);
 	}
 
+	/* strength */
+	ret = sc_gpio_strength_get(test_gpio_handle[gpio], &strength);
+	if (ret) {
+		printf("do_gpio_output get strength failed, err:%d\n", errno);
+	} else {
+		printf("gpio%d get strength:%d\n", gpio, strength);
+	}
+
+	strength = 5;
+	ret = sc_gpio_strength_set(test_gpio_handle[gpio], strength);
+	if (ret) {
+		printf("do_gpio_output set strength failed, err:%d\n", errno);
+	} else {
+		printf("gpio%d set strength:%d\n", gpio, strength);
+	}
+
+	ret = sc_gpio_strength_get(test_gpio_handle[gpio], &strength);
+	if (ret) {
+		printf("do_gpio_output get strength failed, err:%d\n", errno);
+	} else {
+		printf("gpio%d get strength:%d\n", gpio, strength);
+	}
+
 	ret = sc_gpio_uninit(test_gpio_handle[gpio]);
 	if (ret) {
 		printf("do_gpio_output release gpio%d failed, err:%d\n", gpio, ret);
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/ethtest/ethtest.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/ethtest/ethtest.c
index 2185078..bf3d842 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/ethtest/ethtest.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/ethtest/ethtest.c
@@ -146,6 +146,7 @@
                 printf("\nautoneg: %s"

                        "\nduplex: %s"

                        "\nspeed: %s"

+                       "\nlink: %s"

                        "\ntx packets %lu"

                        "\ntx bytes %lu"

                        "\nrx packets %lu"

@@ -153,6 +154,7 @@
                        ((SC_ETH_AUTONEG_ON == info.autoneg)?"on":"off"),

                        ((SC_ETH_DUPLEX_FULL == info.duplex)?"FULL":"HALF"),

                        speed_msg[info.speed],

+                       ((SC_ETH_LINK_UP == info.link)?"up":"down"),

                        info.tx_pkts,

                        info.tx_bytes,

                        info.rx_pkts,

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/mnet_whitelist/mnet_whitelist.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/mnet_whitelist/mnet_whitelist.c
index fa6cc96..d0ad35b 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/mnet_whitelist/mnet_whitelist.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/mnet_whitelist/mnet_whitelist.c
@@ -20,12 +20,15 @@
 

 #define MNET_WHITELIST_CMD_MAX_LEN 256

 #define EXIT_CMD_STOP	"stop\n"

-#define EXIT_CMD_Q	"qq\n"

+#define EXIT_CMD_Q	"q\n"

 #define EXIT_CMD_EXIT	"exit\n"

 

 

-#define MNET_WHITELIST_ADD		'a' //a:+CREG

-#define MNET_WHITELIST_DEL		'd'	//d:+CREG

+#define MNET_WHITELIST_GET		'g' 

+#define MNET_WHITELIST_ADD		'a' //a:1

+#define MNET_WHITELIST_DEL		'd'	//d:1

+#define MNET_WHITELIST_INSERT	'i' //i:+CREG+¡¢i:+CREG+MODE+

+#define MNET_WHITELIST_ERASE	'e' //i:+CREG+¡¢i:+CREG+MODE+

 #define MNET_WHITELIST_CLEAR	'c'	//c

 

 static void mnet_whitelist_log(const char *fmt, ...)

@@ -48,9 +51,12 @@
 static void printUsage(const char *Opt)

 {	

 	printf("Usage: %s\n", Opt);

-	printf("a  			ÐÂÔöÖ÷¶¯Éϱ¨ÃüÁî\n");

-	printf("d		   	ɾ³ýÖ÷¶¯Éϱ¨ÃüÁî\n");

-	printf("c	    	Çå¿ÕÖ÷¶¯Éϱ¨ÃüÁî\n");

+	printf("a:1  			ÐÂÔöÊ¡µç°×Ãûµ¥ÃüÁî,ÃüÁîid:1\n");

+	printf("d:2		   		ɾ³ýÊ¡µç°×Ãûµ¥ÃüÁî,ÃüÁîid:2\n");

+	printf("i:+creg+cgreg+	ÐÂÔöÊ¡µç°×Ãûµ¥ÃüÁî,ÃüÁî¿É×Ô¼ºÌí¼Ó\n");

+	printf("e:+creg+cgreg+	ɾ³ýÊ¡µç°×Ãûµ¥ÃüÁî,ÃüÁî¿É×Ô¼ºÌí¼Ó\n");

+	printf("g	    		»ñȡʡµç°×Ãûµ¥\n");

+	printf("c	    		Çå¿ÕÊ¡µç°×Ãûµ¥\n");

 	printf("\n");

 }

 

@@ -65,9 +71,22 @@
 		mnet_whitelist_log("mnet_whitelist_add:at_tok_start error\n");

 		return -1;

 	}

-	mnet_whitelist_log("mnet_whitelist_add add cmd id:%d",id);

+	mnet_whitelist_log("mnet_whitelist_add cmd id:%d\n",id);

 	ret =  sc_mnet_whitelist_add(id);

-	mnet_whitelist_log("mnet_whitelist_add return result:%d",ret);

+	mnet_whitelist_log("mnet_whitelist_add return result:%d\n",ret);

+	return ret;

+}

+

+static void mnet_whitelist_insert(char *data)

+{

+	int ret, id;

+	if (at_tok_start(&data) < 0) {

+		mnet_whitelist_log("mnet_whitelist_insert:at_tok_start error\n");

+		return -1;

+	}

+	mnet_whitelist_log("mnet_whitelist_insert add cmd %s\n",data);

+	ret =  sc_mnet_whitelist_insert(data);

+	mnet_whitelist_log("mnet_whitelist_insert return result:%d\n",ret);

 	return ret;

 }

 

@@ -79,20 +98,46 @@
 		return -1;

 	}

 	if (at_tok_nextint(&data, &id) < 0) {

-		mnet_whitelist_log("mnet_whitelist_add:at_tok_start error\n");

+		mnet_whitelist_log("mnet_whitelist_del:at_tok_start error\n");

 		return -1;

 	}

-	mnet_whitelist_log("mnet_whitelist_del add cmd id:%d",id);

+	mnet_whitelist_log("mnet_whitelist_del id:%d\n",id);

 	ret =  sc_mnet_whitelist_del(id);

-	mnet_whitelist_log("mnet_whitelist_del return result:%d",ret);

-	return ret;

+	mnet_whitelist_log("mnet_whitelist_del return result:%d\n",ret);

+	return;

 }

 

+static void mnet_whitelist_erase(char *data)

+{

+	int ret, id;

+	if (at_tok_start(&data) < 0) {

+		mnet_whitelist_log("mnet_whitelist_erase:at_tok_start error\n");

+		return -1;

+	}

+	mnet_whitelist_log("mnet_whitelist_erase add cmd %s\n",data);

+	ret =  sc_mnet_whitelist_erase(data);

+	mnet_whitelist_log("mnet_whitelist_erase return result:%d\n",ret);

+	return;

+}

+

+static void mnet_whitelist_get()

+{

+	char* whitelist = sc_mnet_whitelist_get();

+	if(NULL != whitelist){

+		mnet_whitelist_log("sc_mnet_whitelist_get :%s\n",whitelist);

+		free(whitelist);

+	}else{

+		mnet_whitelist_log("sc_mnet_whitelist_get empty\n");

+	}

+	return;

+}

+

+

 static void mnet_whitelist_clear()

 {

-	int ret = sc_mnet_whitelist_clear(0);

-	mnet_whitelist_log("mnet_whitelist_del return result:%d",ret);

-	return ret;

+	int ret = sc_mnet_whitelist_clear();

+	mnet_whitelist_log("mnet_whitelist_del return result:%d\n",ret);

+	return;

 }

 

 static void mnet_whitelist_cmd_proc(char *cmdstr)

@@ -111,6 +156,18 @@
 		mnet_whitelist_log("mnet_whitelist_del.\n");

 		mnet_whitelist_del(data);

 		break;

+	case MNET_WHITELIST_INSERT:			

+		mnet_whitelist_log("mnet_whitelist_add.\n");	

+		mnet_whitelist_insert(data);

+		break;

+	case MNET_WHITELIST_ERASE:

+		mnet_whitelist_log("mnet_whitelist_del.\n");

+		mnet_whitelist_erase(data);

+		break;

+	case MNET_WHITELIST_GET:

+		mnet_whitelist_log("mnet_whitelist_get.\n");

+		mnet_whitelist_get();

+		break;

 	case MNET_WHITELIST_CLEAR:

 		mnet_whitelist_log("mnet_whitelist_clear.\n");

 		mnet_whitelist_clear();

@@ -124,7 +181,10 @@
 int main(int argc, char *argv[])

 {

 	char cmdstr[MNET_WHITELIST_CMD_MAX_LEN];		

-	

+	if(1 == sc_mnet_whitelist_init()){

+		mnet_whitelist_log("mnet_whitelist init failed.\n");

+		return -1;

+	}

 	mnet_whitelist_log("mnet_whitelist demo:Demo go.\n");

 	while(1) {

 		memset(cmdstr,0,MNET_WHITELIST_CMD_MAX_LEN);

@@ -138,7 +198,7 @@
 				break;

 			}

 			

-			mnet_whitelist_log("cmdstr:%d %s\n",strlen(cmdstr),cmdstr);

+			mnet_whitelist_log("cmdstr : %s\n", cmdstr);

 			if(1 >= strlen(cmdstr)) {

 				continue;

 			}

@@ -149,7 +209,7 @@
 			mnet_whitelist_cmd_proc(cmdstr);			

 		}

 	}

-

+	sc_mnet_whitelist_deinit();

 	mnet_whitelist_log("mnet_whitelist demo:Demo end.\n");

 	return 0;

 }

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_net_test/sc_net_test.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_net_test/sc_net_test.c
index 7af5659..c7ba780 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_net_test/sc_net_test.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_net_test/sc_net_test.c
@@ -270,10 +270,10 @@
 		return -1;

 	}	

 	

-	printf("FREQ_SCAN set Tmin %d Tstep %d Tnum %d Tmax %d", Tmin, Tstep, Tnum, Tmax);

+	netdemo_log("FREQ_SCAN set Tmin %d Tstep %d Tnum %d Tmax %d\n", Tmin, Tstep, Tnum, Tmax);

 	

 	ret = sc_net_set_scanmode(sID, Tmin, Tstep, Tnum, Tmax);

-	netdemo_log("FREQ_SCAN set result:%d",ret);

+	netdemo_log("FREQ_SCAN set result:%d\n",ret);

 	return ret;

 }

 

@@ -281,7 +281,7 @@
 {

 	int Tmin, Tstep, Tnum, Tmax;

 	int ret = sc_net_get_scanmode(1, &Tmin, &Tstep, &Tnum, &Tmax);

-	printf("FREQ_SCAN set result:%d Tmin %d Tstep %d Tnum %d Tmax %d", ret, Tmin, Tstep, Tnum, Tmax);

+	netdemo_log("FREQ_SCAN get result:%d Tmin %d Tstep %d Tnum %d Tmax %d\n", ret, Tmin, Tstep, Tnum, Tmax);

 }

 

 static void net_cmd_proc(char *cmdstr)

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/Makefile
index 33dcc13..11bfd6e 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/Makefile
@@ -3,10 +3,24 @@
 include $(COMMON_MK)
 
 ##############USER COMIZE BEGIN################
-EXEC = sc_shm_test
+EXEC1 = sc_shm_test
+OBJS1 = sc_shm_test.o
 
-OBJS = $(patsubst %.c,%.o,$(wildcard *.c))
-                                   
+EXEC2 = sc_shm_read
+OBJS2 = sc_shm_read.o
+
+EXEC3 = sc_shm_write
+OBJS3 = sc_shm_write.o
+
+EXEC4 = sc_shm_posix
+OBJS4 = sc_shm_posix.o
+
+EXEC5 = sc_posix_read
+OBJS5 = sc_posix_read.o
+
+EXEC6 = sc_posix_write
+OBJS6 = sc_posix_write.o
+
 CFLAGS += -I.
 CFLAGS += -I$(APP_DIR)/include
 CFLAGS += -I./../inc
@@ -14,21 +28,46 @@
 CFLAGS += -g -Werror=implicit-function-declaration
 
 LDLIBS += -lnvram
-LDLIBS += -lpthread
+LDLIBS += -lpthread -lrt
 ##############USER COMIZE END##################
 
 #*******************************************************************************
 # targets
 #*******************************************************************************
-all: $(EXEC)
+all: $(EXEC1) $(EXEC2) $(EXEC3) $(EXEC4) $(EXEC5) $(EXEC6)
 
-$(EXEC): $(OBJS)
+$(EXEC1): $(OBJS1)
+	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) $(LDLIBS_$@) -Wl,--end-group
+	@cp $@ $@.elf
+
+$(EXEC2): $(OBJS2)
+	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) $(LDLIBS_$@) -Wl,--end-group
+	@cp $@ $@.elf
+
+$(EXEC3): $(OBJS3)
+	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) $(LDLIBS_$@) -Wl,--end-group
+	@cp $@ $@.elf
+
+$(EXEC4): $(OBJS4)
+	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) $(LDLIBS_$@) -Wl,--end-group
+	@cp $@ $@.elf
+	
+$(EXEC5): $(OBJS5)
+	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) $(LDLIBS_$@) -Wl,--end-group
+	@cp $@ $@.elf
+
+$(EXEC6): $(OBJS6)
 	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) $(LDLIBS_$@) -Wl,--end-group
 	@cp $@ $@.elf
 
 romfs:
-	$(ROMFSINST) $(EXEC) /bin/$(EXEC)
-
+	$(ROMFSINST) $(EXEC1) /bin/$(EXEC1)
+	$(ROMFSINST) $(EXEC2) /bin/$(EXEC2)
+	$(ROMFSINST) $(EXEC3) /bin/$(EXEC3)
+	$(ROMFSINST) $(EXEC4) /bin/$(EXEC4)
+	$(ROMFSINST) $(EXEC5) /bin/$(EXEC5)
+	$(ROMFSINST) $(EXEC6) /bin/$(EXEC6)
+	
 clean:
-	-rm -f $(EXEC) *.elf *.gdb *.o
+	-@rm -f $(EXEC1) $(EXEC2) $(EXEC3) $(EXEC4) $(EXEC5) $(EXEC6) *.elf *.gdb *.o
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_posix_read.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_posix_read.c
new file mode 100755
index 0000000..56054b3
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_posix_read.c
@@ -0,0 +1,169 @@
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+#include <pthread.h>
+#include <sys/prctl.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <assert.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+/**
+ * ºê¶¨Òå
+ */
+#define SHM_NAME_SIZE             (128)
+#define SHM_TEXT_SIZE             (8192)
+#define SHM_PAGE_SIZE             (4096)
+#define SHM_ALLOC_ONE_PAGE_SIZE   (1024)
+#define SHM_ALLOC_TWO_PAGE_SIZE   (8100)
+#define SHM_ALLOC_FOUR_PAGE_SIZE  (16000)
+#define SHM_NAME_CROSS_PREFIX     ("remote-")
+
+typedef int bool;
+
+enum
+{
+    FALSE,
+    TRUE
+};
+
+typedef struct 
+{    
+    unsigned int shm_size;
+    char name[SHM_NAME_SIZE];
+}shm_node_t;
+
+typedef struct 
+{
+    int  write;
+    char data[SHM_TEXT_SIZE];
+}shm_use_remote;
+
+shm_node_t shm_node;
+
+bool sc_shm_is_remote(const char *shm_name)
+{
+    if (!shm_name)
+        return FALSE;
+
+    if (strncmp(shm_name, SHM_NAME_CROSS_PREFIX, strlen(SHM_NAME_CROSS_PREFIX)) == 0)
+        return TRUE;
+    else
+        return FALSE;
+}
+
+int main (int argc, char *argv[])
+{
+    int          opt;
+    int          shmfd     = 0;
+    int          ret        = 0;
+    unsigned int shm_size   = 0;
+    char         *name      = NULL;
+    char         *pshm      = NULL;
+    char         *read_data = NULL;
+    extern char  *optarg;
+
+    shm_use_remote *shared;
+
+    while ((opt = getopt(argc,argv,"n:d:s::")) != EOF)
+    {
+        switch (opt) 
+        {
+            case 'n':
+                name = optarg;
+                break;
+            case 'd':
+                read_data = optarg;
+                break;
+            case 's':
+                shm_size = atoi(optarg);
+                break;
+            default:
+                break;
+        }
+    }
+
+    if (!name || !read_data)
+    {
+        printf("param error: you can input \"shm_posix_read -n \"remote-shm_test\" -d \"123456\" -s1024 \n");    
+        printf("or \"shm_posix_read -n \"remote-shm_test\" -d \"123456\" \n");    
+        printf("-n \"remote-shm_test\": create a shm using name remote-shm_test\n");
+        printf("-d \"123456\": if we write 123456 to shm, then can read 123456 form shm, the test case is pass! \n");
+        printf("-s1024: set the size of shm, then the default size is 1024 \n");
+        return -1;
+    }
+
+    if (shm_size == 0)
+        shm_size = SHM_ALLOC_ONE_PAGE_SIZE;
+
+    printf("CAP read test: name is %s, shm_size is %d\n", name, shm_size);
+
+    shmfd = shm_open(name, O_CREAT | O_RDWR, 0666);
+    if(shmfd < 0)
+    {
+        perror("shm_open failed\n");
+        exit(1);
+    }
+    printf("CAP read test: shm_open return ok\n");
+
+    if(ftruncate(shmfd, shm_size) ==  -1)
+    {
+        perror("ftruncate failed\n");
+        exit(1);
+    }
+    pshm = (char *)mmap(NULL, shm_size, PROT_READ|PROT_WRITE, MAP_SHARED, shmfd, 0);
+    if (pshm == MAP_FAILED)
+    {
+        printf("CAP read test: mmap errno %d: %s\n", errno, strerror(errno));
+        exit(1);
+    }
+    printf("CAP read test: mmap return ok, pshm 0x%x\n", pshm);
+
+    shm_node.shm_size = shm_size;
+    strncpy(shm_node.name, name, SHM_NAME_SIZE-1);
+
+    shared = (shm_use_remote *)pshm;
+    shared->write  = 1;
+    printf("CAP read test: read_data %s ok\n", read_data);
+
+    while(1)
+    {
+        if(strncmp(shared->data, read_data, sizeof(read_data)) == 0)
+        {
+            printf("Success, AP read %s from shm\n", read_data);
+            break;
+        }
+        else
+            sleep(2);
+    }
+
+    ret = munmap(pshm, shm_size);
+    if(ret < 0)
+    {
+        printf("munmap errno %d: %s\n", errno, strerror(errno));
+        exit(1);
+    }
+    if(sc_shm_is_remote(name))
+    {
+        ret = shm_unlink(name);
+        if(ret < 0)
+        {
+            printf("shm_unlink errno %d: %s\n", errno, strerror(errno));
+            exit(1);
+        }
+    }
+
+    close(shmfd);
+
+    printf("CAP: shm posix read end\n");
+    return 0;
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_posix_write.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_posix_write.c
new file mode 100755
index 0000000..18f5ba0
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_posix_write.c
@@ -0,0 +1,152 @@
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+#include <pthread.h>
+#include <sys/prctl.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <assert.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+/**
+ * ºê¶¨Òå
+ */
+#define SHM_NAME_SIZE             (128)
+#define SHM_TEXT_SIZE             (8192)
+#define SHM_PAGE_SIZE             (4096)
+#define SHM_ALLOC_ONE_PAGE_SIZE   (1024)
+#define SHM_ALLOC_TWO_PAGE_SIZE   (8100)
+#define SHM_ALLOC_FOUR_PAGE_SIZE  (16000)
+#define SHM_MIN(x,y)              ((x)<(y)?(x):(y))
+
+typedef struct 
+{
+    unsigned int shm_size;
+    char name[SHM_NAME_SIZE];
+}shm_node_t;
+
+typedef struct 
+{
+    int  write;
+    char data[SHM_TEXT_SIZE];
+}shm_use_remote;
+
+shm_node_t shm_node;
+
+int main (int argc, char *argv[])
+{
+    int          opt;
+    int          ret       = 0;
+    int          copy_size = 0;
+    unsigned int shm_size  = 0;
+    int          shmfd     = 0;
+    char         *name     = NULL;
+    char         *pshm     = NULL;
+    char         *write_data = NULL;
+    extern char  *optarg;
+    shm_use_remote *shared;
+
+    while ((opt = getopt(argc,argv,"n:d:s::")) != EOF)
+    {
+        switch (opt) 
+        {
+            case 'n':
+                name = optarg;
+                break;
+            case 'd':
+                write_data = optarg;
+                break;
+            case 's':
+                shm_size = atoi(optarg);
+                break;
+            default:
+                break;
+        }
+    }
+
+    if (!name || !write_data)
+    {
+        printf("param error: you can input \"shm_posix_write -n \"remote-shm_test\" -d \"123456\" -s1024 \n");   
+        printf("or \"shm_posix_write -n \"remote-shm_test\" -d \"123456\" \n");   
+        printf("-k -200: create a shm using name remote-shm_test\n");
+        printf("-d \"123456\": the data write to shm: for example, if we write 123456 to shm, then can read 123456 form shm, the test case is pass! \n");
+        printf("-s1024: set the size of shm, then the default size is 1024 \n");
+        return -1;
+    }
+    if (shm_size == 0)
+        shm_size = SHM_ALLOC_ONE_PAGE_SIZE;
+
+    printf("CAP write test: name is %s, shm_size is %d\n", name, shm_size);
+
+    shmfd = shm_open(name, O_CREAT | O_RDWR, 0666);
+    if(shmfd < 0)
+    {
+        printf("CAP write test: shm_open return error\n");
+        assert(0);
+    }
+    printf("CAP write test: shm_open ok, shmfd %d\n",shmfd);
+
+    if(ftruncate(shmfd, shm_size) ==  -1)
+    {
+        perror("CAP ftruncate failed\n");
+        exit(1);
+    }
+    printf("CAP write test: ftruncate shmfd \n");
+
+    pshm = (char *)mmap(NULL, shm_size, PROT_READ|PROT_WRITE, MAP_SHARED, shmfd, 0);
+    if (pshm == MAP_FAILED)
+    {
+        perror("CAP mmap failed\n");
+        exit(1);
+    }
+    shm_node.shm_size = shm_size;
+    strncpy(shm_node.name, name, SHM_NAME_SIZE-1);
+
+    printf("CAP write test : mmap trurn ok\n");
+    shared = (shm_use_remote *)pshm;
+    copy_size = SHM_MIN(strlen(write_data), (SHM_TEXT_SIZE - 1));
+
+    printf("CAP write test : shared->write %d\n",shared->write);
+
+    while(1)
+    {        
+        if(shared->write == 1)
+        {
+            strncpy(shared->data, write_data, copy_size);
+            printf("CAP write %s to shm\n", write_data);
+            shared->write = 0;
+            break;
+        }
+        else{
+            sleep(2);
+        }
+    }
+
+    ret = munmap(pshm, shm_size);
+    if(ret < 0)
+    {
+        printf("CAP: munmap errno %d: %s\n", errno, strerror(errno));
+        exit(1);
+    }
+
+    ret = shm_unlink(name);
+    if(ret < 0)
+    {
+        printf("CAP: shm_unlink errno %d: %s\n", errno, strerror(errno));
+        exit(1);
+    }
+    close(shmfd);
+    printf("CAP: shm posix write end\n");
+
+    return 0;
+}
+
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_shm_posix.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_shm_posix.c
new file mode 100755
index 0000000..a83b826
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_shm_posix.c
@@ -0,0 +1,302 @@
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+#include <pthread.h>
+#include <sys/prctl.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <assert.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+
+/**
+ * ºê¶¨Òå
+ */
+#define SHM_TEST_ALLOC_THREAD        (0)
+#define SHM_TEST_MEMGET_THREAD       (1)
+#define SHM_TEST_UNLINK_THREAD       (2)
+#define SHM_TEST_TRANS_THREAD        (3)
+#define SHM_TEST_THREAD_NUM          (4)
+#define SHM_TEST_STR_NUM             (20)
+#define SHM_TEST_CAP_INIT_VALUE      (0x16)
+
+#define SHM_TEST_MARK_0X2            (0x2)
+#define SHM_TEST_MARK_0X4            (0x4)
+#define SHM_TEST_MARK_0X6            (0x6)
+#define SHM_TEST_MARK_0X8            (0x8)
+#define SHM_TEST_MARK_NUM            (0xA)
+
+#define SHM_PAGE_SIZE                (4096)
+#define SHM_ALLOC_ONE_PAGE_SIZE      (1024)
+#define SHM_ALLOC_TWO_PAGE_SIZE      (8100)
+#define SHM_ALLOC_FOUR_PAGE_SIZE     (16000)
+
+#define SHM_TEST_WRITE_TO_SHM_PAGE0  (0x0A)
+#define SHM_TEST_READ_FROM_SHM_PAGE1 (0x1B)
+#define SHM_TEST_WRITE_TO_SHM_PAGE2  (0x2A)
+#define SHM_TEST_READ_FROM_SHM_PAGE3 (0x3B)
+
+#define SHM_IPC_FILE_NAME     "remote-posix_test"
+#define SHM_TRANS_FILE_NAME   "remote-posix_transfer"
+
+/**
+ * È«¾Ö±äÁ¿¶¨Òå
+ */
+
+pthread_t shm_pcross_thread;
+pthread_t shm_unlink_thread;
+
+int   g_shmfd[SHM_TEST_THREAD_NUM] = {0};
+char  *g_pshm[SHM_TEST_THREAD_NUM] = {NULL};
+int   g_mark_path[SHM_TEST_MARK_NUM] = {0xFFFF};
+
+void *cap_shm_fourpage_cross(void* args)
+{
+    int i      = 0;
+    int ret    = 0;
+    int shmfd  = 0;
+    char *pshm = NULL;
+    char  test_num = 0;
+    struct stat buf;
+
+    prctl(PR_SET_NAME, "shm_transfer_task");
+
+    shmfd = shm_open(SHM_TRANS_FILE_NAME, O_CREAT | O_RDWR, 0666);
+    if(shmfd < 0)
+    {
+        printf("shm_open return error\n");
+        assert(0);
+    }
+
+    if(ftruncate(shmfd, SHM_ALLOC_FOUR_PAGE_SIZE) ==  -1)
+    {
+        perror("ftruncate failed\n");
+        exit(1);
+    }
+
+    if (fstat(shmfd, &buf) == -1)
+    {
+        printf("fstat error\n");
+    }
+    printf("size = %d, mode = %o\n",buf.st_size, buf.st_mode & 0777);
+
+    pshm = (char *)mmap(NULL, SHM_ALLOC_FOUR_PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, shmfd, 0);
+    if (pshm == MAP_FAILED)
+    {
+        printf("shmat return error\n");
+        exit(1);
+    }
+
+    g_shmfd[SHM_TEST_TRANS_THREAD] = shmfd;
+    g_pshm[SHM_TEST_TRANS_THREAD]    = pshm;
+
+    *(char *)pshm = SHM_TEST_WRITE_TO_SHM_PAGE0;
+
+    printf("mmap return ok\n");
+    for(;;)
+    {
+        while(1)
+        {
+            test_num = *(char *)(pshm + SHM_PAGE_SIZE);
+            if(test_num == SHM_TEST_READ_FROM_SHM_PAGE1)
+            {
+                g_mark_path[0] = SHM_TEST_READ_FROM_SHM_PAGE1;
+                *(char *)(pshm + 2 * SHM_PAGE_SIZE) = SHM_TEST_WRITE_TO_SHM_PAGE2;
+                printf("cap shmat test_num, CAP write 0x%x to shm\n", SHM_TEST_WRITE_TO_SHM_PAGE2);
+                break;
+            }
+            sleep(2);
+        }
+        while(1)
+        {
+            test_num = *(char *)(pshm + 3 * SHM_PAGE_SIZE);
+            if(test_num == SHM_TEST_READ_FROM_SHM_PAGE3)
+            {
+                *(char *)(pshm) = SHM_TEST_WRITE_TO_SHM_PAGE0;
+                g_mark_path[1] = SHM_TEST_READ_FROM_SHM_PAGE3;
+                printf("shmat test_num, CAP write 0x%x to shm\n", SHM_TEST_READ_FROM_SHM_PAGE3);
+                break;
+            }
+            sleep(2);
+        }
+        if (i++ >= 10)
+            break;
+    }
+    ret = munmap(pshm, SHM_ALLOC_FOUR_PAGE_SIZE);
+    if(ret < 0)
+    {
+        printf("munmap return error\n");
+        exit(1);
+    }
+    printf("munmap return ok\n");
+
+    ret = shm_unlink(SHM_TRANS_FILE_NAME);
+    if(ret < 0)
+    {
+        printf("shm_unlink return error\n");
+        return -1;
+    }
+    printf("shm_unlink return ok\n");
+    
+    close(shmfd);
+
+    while(1)
+    {
+        sleep(5);
+    }
+}
+
+void *cap_write_and_unlink(void* args)
+{
+    int   shmfd    = 0;
+    int   ret      = 0;
+    int   test_num = 0;
+    char  *pshm    = NULL;
+    struct stat buf;
+    
+    char  dest[SHM_TEST_STR_NUM] = {0};
+    prctl(PR_SET_NAME, "shm_unlink_task");
+
+    shmfd = shm_open(SHM_IPC_FILE_NAME, O_CREAT | O_RDWR, 0666);
+    if(shmfd < 0)
+    {
+        printf("shm_open return error\n");
+        assert(0);
+    }
+    
+    if(ftruncate(shmfd, SHM_ALLOC_TWO_PAGE_SIZE) ==  -1)
+    {
+        perror("ftruncate failed\n");
+        exit(1);
+    }
+    
+    if (fstat(shmfd, &buf) == -1)
+    {
+        printf("fstat error\n");
+    }
+    printf("size = %d, mode = %o\n",buf.st_size, buf.st_mode & 0777);
+    
+    pshm = (char *)mmap(NULL, SHM_ALLOC_TWO_PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, shmfd, 0);
+    if (pshm == MAP_FAILED)
+    {
+        perror("mmap failed\n");
+        exit(1);
+    }
+
+    g_shmfd[SHM_TEST_UNLINK_THREAD] = shmfd;
+    g_pshm[SHM_TEST_UNLINK_THREAD]  = pshm;
+
+    *(int *)pshm = SHM_TEST_CAP_INIT_VALUE;
+
+    while(1)
+    {
+        test_num = *(int *)pshm;
+        if(test_num == SHM_TEST_MARK_0X2)
+        {
+            g_mark_path[SHM_TEST_MARK_0X2] = SHM_TEST_MARK_0X2;
+            printf("cap shmat test_num 2, g_mark_path2 = %x\n", g_mark_path[SHM_TEST_MARK_0X2]);
+            *(int *)pshm = SHM_TEST_MARK_0X2 + 1;
+            break;
+        }
+        sleep(1);
+    }
+    while(1)
+    {
+        test_num = *(int *)pshm;
+        if(test_num == SHM_TEST_MARK_0X4)
+        {
+            g_mark_path[SHM_TEST_MARK_0X4] = SHM_TEST_MARK_0X4;
+        
+            printf("cap shmat test_num 4, g_mark_path4 = %x\n",g_mark_path[SHM_TEST_MARK_0X4]);
+            *(int *)pshm = SHM_TEST_MARK_0X4 + 1;
+            break;
+        }
+        sleep(1);
+    }
+    while(1)
+    {
+        test_num = *(int *)pshm;
+        if(test_num == SHM_TEST_MARK_0X6)
+        {
+            g_mark_path[SHM_TEST_MARK_0X6] = SHM_TEST_MARK_0X6;
+            printf("cap shmat test_num 6, g_mark_path6 = %x\n",g_mark_path[SHM_TEST_MARK_0X6]);
+            *(int *)pshm = SHM_TEST_MARK_0X6 + 1;
+            break;
+        }
+        sleep(1);
+    }
+    while(1)
+    {
+        test_num = *(int *)pshm;
+        if(test_num == SHM_TEST_MARK_0X8)
+        {
+            g_mark_path[SHM_TEST_MARK_0X8] = SHM_TEST_MARK_0X8;
+        
+            printf("cap shmat test_num 8, g_mark_path8 = %x\n",g_mark_path[SHM_TEST_MARK_0X8]);
+            *(int *)pshm = SHM_TEST_MARK_0X8 + 1;
+            break;
+        }
+        sleep(1);
+    }
+    memcpy(dest, pshm + 32, SHM_TEST_STR_NUM - 1);
+
+    if(strncmp(dest, "123456", sizeof("123456"))== 0 )
+        printf("cap shmat test_num 9,  success\n");    
+
+    ret = munmap(pshm, SHM_ALLOC_TWO_PAGE_SIZE);
+    if(ret < 0)
+    {
+        printf("munmap errno %d: %s\n", errno, strerror(errno));
+        exit(1);
+    }
+
+     ret = shm_unlink(SHM_IPC_FILE_NAME);
+    if(ret < 0)
+    {
+        printf("shm_unlink errno %d: %s\n", errno, strerror(errno));
+        assert(0);
+    }
+    
+    close(shmfd);
+    
+    while(1)
+    {
+        sleep(5);
+    }
+    return 0;
+}
+
+
+int main (int argc, char *argv[])
+{
+    int ret = 0;
+    
+    ret = pthread_create(&shm_pcross_thread, NULL, cap_shm_fourpage_cross, NULL);
+    if(ret != 0) 
+    {
+        printf("pthread_create shm_pcross_thread error \n");
+    }
+    
+    ret = pthread_create(&shm_unlink_thread, NULL, cap_write_and_unlink, NULL);
+    if(ret != 0) 
+    {
+        printf("pthread_create shm_unlink_thread error \n");
+    }
+
+    if(shm_pcross_thread > 0) 
+        pthread_join(shm_pcross_thread, NULL);
+
+    if(shm_unlink_thread > 0) 
+        pthread_join(shm_unlink_thread, NULL);
+
+return 0;
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_shm_read.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_shm_read.c
new file mode 100755
index 0000000..e8fa76f
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_shm_read.c
@@ -0,0 +1,142 @@
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+#include <pthread.h>
+#include <sys/prctl.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <assert.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+/**
+ * ºê¶¨Òå
+ */
+#define SHM_TEXT_SIZE             (8192)
+#define SHM_PAGE_SIZE             (4096)
+#define SHM_ALLOC_ONE_PAGE_SIZE   (1024)
+#define SHM_ALLOC_TWO_PAGE_SIZE   (8100)
+#define SHM_ALLOC_FOUR_PAGE_SIZE  (16000)
+
+typedef struct 
+{
+    key_t        key;
+    int          shmid;
+    unsigned int shm_size;
+}shm_node_t;
+
+typedef struct 
+{
+    int  write;
+    char data[SHM_TEXT_SIZE];
+}shm_use_remote;
+
+shm_node_t shm_node;
+
+int main (int argc, char *argv[])
+{
+    int          opt;
+    int          ret        = 0;
+    int          shmid      = 0;
+    unsigned int shm_size   = 0;
+    key_t        key        = 0;
+    char         *pshm      = NULL;
+    char         *read_data = NULL;
+    extern char  *optarg;
+
+    shm_use_remote *shared;
+
+    while ((opt = getopt(argc,argv,"k:d:s::")) != EOF)
+    {
+        switch (opt) 
+        {
+            case 'k':
+                key = atoi(optarg);
+                break;
+            case 'd':
+                read_data = optarg;
+                break;
+            case 's':
+                shm_size = atoi(optarg);
+                break;
+            default:
+                break;
+        }
+    }
+
+    if (key == 0 || !read_data)
+    {
+        printf("param error: you can input \"sc_shm_read -k -200 -d \"123456\" -s1024 \n");    
+        printf("or \"shm_read -k -200 -d \"123456\" \n");    
+        printf("-k -200: create a shm using key -200\n");
+        printf("-d \"123456\": if we write 123456 to shm, then can read 123456 form shm, the test case is pass! \n");
+        printf("-s1024: set the size of shm, then the default size is 1024 \n");
+        return -1;
+    }
+
+    if (shm_size == 0)
+        shm_size = SHM_ALLOC_ONE_PAGE_SIZE;
+
+    printf("CAP read test: key is %d, shm_size is %d\n", key, shm_size);
+
+    errno = 0;
+    shmid = shmget(key, shm_size, 0666|IPC_CREAT);
+    
+    if(shmid < 0)
+    {
+        printf("shmid return error, errno %d: %s\n", errno, strerror(errno));
+        return -1;
+    }
+    
+    errno = 0;
+    pshm = (char *)shmat(shmid, 0, 0);
+    if (pshm == NULL)
+    {
+        printf("shmid return error, errno %d: %s\n", errno, strerror(errno));
+        return -1;
+    }
+    shm_node.key       = key;
+    shm_node.shm_size = shm_size;
+    
+    shared = (shm_use_remote *)pshm;
+    shared->write  = 1;
+
+    printf("CAP read test:shared->write  = 1, strlen %d\n", strlen(read_data));
+
+    while(1)
+    {
+        if(strncmp(shared->data, read_data, strlen(read_data)) == 0)
+        {
+            printf("Success, CAP read %s from shm\n", read_data);
+            break;
+        }
+        else
+        {
+            sleep(2);
+        }
+    }
+
+    if(shmdt(pshm) < 0)
+    {
+        printf("shmdt errno %d: %s\n", errno, strerror(errno));
+        return -1;
+    }
+
+    if(shmctl(shmid, IPC_RMID, NULL) == -1)
+    {
+        printf("shmctl errno %d: %s\n", errno, strerror(errno));
+        return -1;
+    }
+
+    printf("shm read end\n");
+
+    return 0;
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_shm_test.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_shm_test.c
index 73a5144..c982ff2 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_shm_test.c
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_shm_test.c
@@ -57,18 +57,25 @@
 {
 	int  shmid = 0;
 	char *pshm = NULL;
-	key_t key = 0xFFFFF001;
+	key_t key = 0xFFFFF801;
 
 	prctl(PR_SET_NAME, "shm_alloc_task");
 
+	errno = 0;
 	/*alloc two pages*/
 	shmid = shmget(key, SHM_ALLOC_TWO_PAGE_SIZE, 0666|IPC_CREAT);
 	if(shmid < 0)
-		printf("shmid return error\n");
+	{
+		printf("shmid return error, errno %d: %s\n", errno, strerror(errno));
+		return -1;
+	}
 
 	pshm=(char *)shmat(shmid, 0, 0);
 	if (pshm==NULL)
-		printf("shmat return error\n");
+	{
+		printf("shmat return error, errno %d\n", errno, strerror(errno));
+		return -1;
+	}
 
 	g_shmid[SHM_TEST_ALLOC_THREAD] = shmid;
 	g_pshm[SHM_TEST_ALLOC_THREAD]  = pshm;
@@ -85,14 +92,17 @@
 {
 	int  shmid = 0;
 	char *pshm = NULL;
-	key_t key = 0xFFFFF002;
+	key_t key = 0xFFFFF802;
 
 	prctl(PR_SET_NAME, "shm_mem_task");
 
 	/*alloc two pages*/
 	shmid = shmget(key, SHM_ALLOC_TWO_PAGE_SIZE, 0666|IPC_CREAT);
 	if(shmid < 0)
+	{
 		printf("shmid return error\n");
+		return -1;
+	}
 
 	pshm = (char *)shmat(shmid, 0, 0);
 	if (pshm == NULL)
@@ -112,7 +122,7 @@
 	int shmid = 0;
 	int *pshm = NULL;
 	int  test_num = 0;
-	key_t key = 0xFFFFF003;
+	key_t key = 0xFFFFF803;
 	char  dest[SHM_TEST_STR_NUM] = {0};
 
 	prctl(PR_SET_NAME, "shm_task");
@@ -203,7 +213,7 @@
 	int shmid = 0;
 	char *pshm = NULL;
 	char  test_num = 0;
-	key_t key = 0xFFFFF004;
+	key_t key = 0xFFFFF804;
 
 	prctl(PR_SET_NAME, "shm_cross_task");
 
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_shm_write.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_shm_write.c
new file mode 100755
index 0000000..f14734c
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/sc_shm_test/sc_shm_write.c
@@ -0,0 +1,146 @@
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+#include <pthread.h>
+#include <sys/prctl.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <assert.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+/**
+ * ºê¶¨Òå
+ */
+#define SHM_TEXT_SIZE             (8192)
+#define SHM_PAGE_SIZE             (4096)
+#define SHM_ALLOC_ONE_PAGE_SIZE   (1024)
+#define SHM_ALLOC_TWO_PAGE_SIZE   (8100)
+#define SHM_ALLOC_FOUR_PAGE_SIZE  (16000)
+#define SHM_MIN(x,y)              ((x)<(y)?(x):(y))
+
+typedef struct 
+{
+    key_t        key;
+    int          shmid; 
+    void         *shm;
+    unsigned int shm_size;
+}shm_node_t;
+
+typedef struct 
+{
+    int  write;
+    char data[SHM_TEXT_SIZE];
+}shm_use_remote;
+
+shm_node_t shm_node;
+
+int main (int argc, char *argv[])
+{
+    int          opt;
+    int          ret      = 0;
+    int          shmid    = 0;
+    unsigned int shm_size = 0;
+    key_t        key      = 0;
+    int          copy_size = 0;
+    char         *pshm    = NULL;
+    char         *write_data = NULL;
+    extern char  *optarg;
+    shm_use_remote *shared;
+
+    while ((opt = getopt(argc,argv,"k:d:s::")) != EOF)
+    {
+        switch (opt) 
+        {
+            case 'k':
+                key = atoi(optarg);
+                break;
+            case 'd':
+                write_data = optarg;
+                break;
+            case 's':
+                shm_size = atoi(optarg);
+                break;
+            default:
+                break;
+        }
+    }
+
+    if (key == 0 || !write_data)
+    {
+        printf("param error: you can input \"sc_shm_write -k -200 -d \"123456\" -s1024 \n");    
+        printf("or \"shm_read -k -200 -d \"123456\" \n");    
+        printf("-k -200: create a shm using key -200\n");
+        printf("-d \"123456\": the data write to shm: for example, if we write 123456 to shm, then can read 123456 form shm, the test case is pass! \n");
+        printf("-s1024: set the size of shm, then the default size is 1024 \n");
+        return -1;
+    }
+
+    if (shm_size == 0)
+        shm_size = SHM_ALLOC_ONE_PAGE_SIZE;
+
+    printf("CAP write test: key is %d, shm_size is %d\n", key, shm_size);
+
+    errno = 0;
+    shmid = shmget(key, shm_size, 0666|IPC_CREAT);
+    if(shmid < 0)
+    {
+        printf("shmid return error, errno %d: %s\n", errno, strerror(errno));
+        return -1;
+    }
+
+    errno = 0;
+    pshm = (char *)shmat(shmid, 0, 0);
+    if (pshm == NULL)
+    {
+        printf("shmat return error, errno %d: %s\n", errno, strerror(errno));
+        return -1;
+    }
+    shared = (shm_use_remote *)pshm;
+
+    shm_node.key       = key;
+    shm_node.shm_size = shm_size;
+    shm_node.shm = pshm;
+
+    copy_size = SHM_MIN(strlen(write_data), (SHM_TEXT_SIZE - 1));
+
+    while(1)
+    {        
+        if(shared->write == 1)
+        {
+            strncpy(shared->data, write_data, copy_size);    
+            printf("CAP Write %s to shm\n", write_data);
+            shared->write = 0;
+            break;
+        }
+        else
+            sleep(2);
+    }
+
+	errno = 0;
+    if(shmdt(pshm) < 0)
+    {
+        printf("shmdt errno %d: %s\n", errno, strerror(errno));
+        return -1;
+    }
+    
+    errno = 0;
+    if(shmctl(shmid, IPC_RMID, NULL) == -1)
+    {
+        printf("shmctl errno %d: %s\n", errno, strerror(errno));
+        return -1;
+    }
+
+    printf("shmctl end\n");
+
+    return 0;
+}
+
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service/Makefile
new file mode 100755
index 0000000..6e167bf
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service/Makefile
@@ -0,0 +1,53 @@
+#*******************************************************************************
+# include ZTE application makefile
+#*******************************************************************************
+include $(COMMON_MK)
+
+#*******************************************************************************
+# execute
+#*******************************************************************************
+EXEC    = service
+
+#*******************************************************************************
+# objects
+#*******************************************************************************
+OBJS    = service.o
+		  
+#*******************************************************************************
+# include path
+#*******************************************************************************
+CFLAGS = -I.
+CFLAGS += -I$(zte_lib_path)/binder/include
+CFLAGS += -I$(zte_lib_path)/binder/include/utils
+CFLAGS += -I$(zte_lib_path)/binder/include/cutils
+CFLAGS += -I$(zte_lib_path)/binder/include/log
+
+CFLAGS += -g -O0 -Werror=implicit-function-declaration
+
+LOCAL_CPPFLAGS += $(CFLAGS) -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0 
+
+LDLIBS += -lpthread -lstdc++
+LDLIBS += -lbinder -L$(zte_lib_path)/binder
+LDLIBS += -lutils -L$(zte_lib_path)/binder/libutils
+LDLIBS += -lcutils -L$(zte_lib_path)/binder/libcutils
+LDLIBS += -llog -L$(zte_lib_path)/binder/liblog
+
+#*******************************************************************************
+# targets
+#*******************************************************************************
+all: $(EXEC)
+
+$(EXEC): $(OBJS)
+	$(CC) $(LDFLAGS) -o $@ $(OBJS) -Wl,--start-group $(LDLIBS) -Wl,--end-group
+	@cp $@ $@.elf
+	
+romfs:
+	$(ROMFSINST) $(EXEC) /bin/$(EXEC)
+	
+clean:
+	-rm -f $(EXEC) *.elf *.gdb *.o
+
+%.o:%.cpp
+	@echo Compile $< 
+	$(CXX) $(LOCAL_CPPFLAGS) $(LOCAL_C_INCLUDES) -c $< -o $@
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service/service.cpp b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service/service.cpp
new file mode 100755
index 0000000..110f7a4
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service/service.cpp
@@ -0,0 +1,327 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <binder/Parcel.h>
+#include <binder/ProcessState.h>
+#include <binder/IServiceManager.h>
+#include <binder/TextOutput.h>
+
+#include <getopt.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/time.h>
+
+using namespace android;
+
+void writeString16(Parcel& parcel, const char* string)
+{
+    if (string != NULL)
+    {
+        parcel.writeString16(String16(string));
+    }
+    else
+    {
+        parcel.writeInt32(-1);
+    }
+}
+
+// get the name of the generic interface we hold a reference to
+static String16 get_interface_name(sp<IBinder> service)
+{
+    if (service != NULL)
+    {
+        Parcel data, reply;
+        status_t err = service->transact(IBinder::INTERFACE_TRANSACTION, data, &reply);
+        if (err == NO_ERROR)
+        {
+            return reply.readString16();
+        }
+    }
+    return String16();
+}
+
+static String8 good_old_string(const String16& src)
+{
+    String8 name8;
+    char ch8[2];
+    ch8[1] = 0;
+    for (unsigned j = 0; j < src.size(); j++)
+    {
+        char16_t ch = src[j];
+        if (ch < 128) ch8[0] = (char)ch;
+        name8.append(ch8);
+    }
+    return name8;
+}
+
+int main(int argc, char* const argv[])
+{
+    sp<IServiceManager> sm = defaultServiceManager();
+    fflush(stdout);
+    if (sm == NULL)
+    {
+        aerr << "service: Unable to get default service manager!" << endl;
+        return 20;
+    }
+
+    bool wantsUsage = false;
+    int result = 0;
+
+    while (1)
+    {
+        int ic = getopt(argc, argv, "h?");
+        if (ic < 0)
+            break;
+
+        switch (ic)
+        {
+        case 'h':
+        case '?':
+            wantsUsage = true;
+            break;
+        default:
+            aerr << "service: Unknown option -" << ic << endl;
+            wantsUsage = true;
+            result = 10;
+            break;
+        }
+    }
+
+    if (optind >= argc)
+    {
+        wantsUsage = true;
+    }
+    else if (!wantsUsage)
+    {
+        if (strcmp(argv[optind], "check") == 0)
+        {
+            optind++;
+            if (optind < argc)
+            {
+                sp<IBinder> service = sm->checkService(String16(argv[optind]));
+                aout << "Service " << argv[optind] <<
+                     (service == NULL ? ": not found" : ": found") << endl;
+            }
+            else
+            {
+                aerr << "service: No service specified for check" << endl;
+                wantsUsage = true;
+                result = 10;
+            }
+        }
+        else if (strcmp(argv[optind], "list") == 0)
+        {
+            Vector<String16> services = sm->listServices();
+            aout << "Found " << services.size() << " services:" << endl;
+            for (unsigned i = 0; i < services.size(); i++)
+            {
+                String16 name = services[i];
+                sp<IBinder> service = sm->checkService(name);
+                aout << i
+                     << "\t" << good_old_string(name)
+                     << ": [" << good_old_string(get_interface_name(service)) << "]"
+                     << endl;
+            }
+        }
+        else if (strcmp(argv[optind], "call") == 0)
+        {
+            optind++;
+            if (optind+1 < argc)
+            {
+                int serviceArg = optind;
+                sp<IBinder> service = sm->checkService(String16(argv[optind++]));
+                String16 ifName = get_interface_name(service);
+                int32_t code = atoi(argv[optind++]);
+                if (service != NULL && ifName.size() > 0)
+                {
+                    Parcel data, reply;
+
+                    // the interface name is first
+                    data.writeInterfaceToken(ifName);
+
+                    // then the rest of the call arguments
+                    while (optind < argc)
+                    {
+                        if (strcmp(argv[optind], "i32") == 0)
+                        {
+                            optind++;
+                            if (optind >= argc)
+                            {
+                                aerr << "service: no integer supplied for 'i32'" << endl;
+                                wantsUsage = true;
+                                result = 10;
+                                break;
+                            }
+                            data.writeInt32(atoi(argv[optind++]));
+                        }
+                        else if (strcmp(argv[optind], "s16") == 0)
+                        {
+                            optind++;
+                            if (optind >= argc)
+                            {
+                                aerr << "service: no string supplied for 's16'" << endl;
+                                wantsUsage = true;
+                                result = 10;
+                                break;
+                            }
+                            data.writeString16(String16(argv[optind++]));
+                        }
+                        else if (strcmp(argv[optind], "null") == 0)
+                        {
+                            optind++;
+                            data.writeStrongBinder(NULL);
+                        }
+                        else if (strcmp(argv[optind], "intent") == 0)
+                        {
+
+                            char* action = NULL;
+                            char* dataArg = NULL;
+                            char* type = NULL;
+                            int launchFlags = 0;
+                            char* component = NULL;
+                            int categoryCount = 0;
+                            char* categories[16];
+
+                            char* context1 = NULL;
+
+                            optind++;
+
+                            while (optind < argc)
+                            {
+                                char* key = strtok_r(argv[optind], "=", &context1);
+                                char* value = strtok_r(NULL, "=", &context1);
+
+                                // we have reached the end of the XXX=XXX args.
+                                if (key == NULL) break;
+
+                                if (strcmp(key, "action") == 0)
+                                {
+                                    action = value;
+                                }
+                                else if (strcmp(key, "data") == 0)
+                                {
+                                    dataArg = value;
+                                }
+                                else if (strcmp(key, "type") == 0)
+                                {
+                                    type = value;
+                                }
+                                else if (strcmp(key, "launchFlags") == 0)
+                                {
+                                    launchFlags = atoi(value);
+                                }
+                                else if (strcmp(key, "component") == 0)
+                                {
+                                    component = value;
+                                }
+                                else if (strcmp(key, "categories") == 0)
+                                {
+                                    char* context2 = NULL;
+                                    int categoryCount = 0;
+                                    categories[categoryCount] = strtok_r(value, ",", &context2);
+
+                                    while (categories[categoryCount] != NULL)
+                                    {
+                                        categoryCount++;
+                                        categories[categoryCount] = strtok_r(NULL, ",", &context2);
+                                    }
+                                }
+
+                                optind++;
+                            }
+
+                            writeString16(data, action);
+                            writeString16(data, dataArg);
+                            writeString16(data, type);
+                            data.writeInt32(launchFlags);
+                            writeString16(data, component);
+
+                            if (categoryCount > 0)
+                            {
+                                data.writeInt32(categoryCount);
+                                for (int i = 0 ; i < categoryCount ; i++)
+                                {
+                                    writeString16(data, categories[i]);
+                                }
+                            }
+                            else
+                            {
+                                data.writeInt32(0);
+                            }
+
+                            // for now just set the extra field to be null.
+                            data.writeInt32(-1);
+                        }
+                        else
+                        {
+                            aerr << "service: unknown option " << argv[optind] << endl;
+                            wantsUsage = true;
+                            result = 10;
+                            break;
+                        }
+                    }
+
+                    service->transact(code, data, &reply);
+                    aout << "Result: " << reply << endl;
+                }
+                else
+                {
+                    aerr << "service: Service " << argv[serviceArg]
+                         << " does not exist" << endl;
+                    result = 10;
+                }
+            }
+            else
+            {
+                if (optind < argc)
+                {
+                    aerr << "service: No service specified for call" << endl;
+                }
+                else
+                {
+                    aerr << "service: No code specified for call" << endl;
+                }
+                wantsUsage = true;
+                result = 10;
+            }
+        }
+        else
+        {
+            aerr << "service: Unknown command " << argv[optind] << endl;
+            wantsUsage = true;
+            result = 10;
+        }
+    }
+
+    if (wantsUsage)
+    {
+        aout << "Usage: service [-h|-?]\n"
+             "       service list\n"
+             "       service check SERVICE\n"
+             "       service call SERVICE CODE [i32 INT | s16 STR] ...\n"
+             "Options:\n"
+             "   i32: Write the integer INT into the send parcel.\n"
+             "   s16: Write the UTF-16 string STR into the send parcel.\n";
+//                "   intent: Write and Intent int the send parcel. ARGS can be\n"
+//                "       action=STR data=STR type=STR launchFlags=INT component=STR categories=STR[,STR,...]\n";
+        return result;
+    }
+
+    return result;
+}
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/Makefile
new file mode 100755
index 0000000..3ae356d
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/Makefile
@@ -0,0 +1,46 @@
+#*******************************************************************************
+# include application makefile
+#*******************************************************************************
+include $(COMMON_MK)
+
+#*******************************************************************************
+# execute
+#*******************************************************************************
+EXEC_server = test_binder_server
+EXEC_client = test_binder_client
+
+#*******************************************************************************
+# objects
+#*******************************************************************************
+SUB_MDL = ipc client service demo
+
+#*******************************************************************************
+# targets
+#*******************************************************************************
+.PHONY: $(SUB_MDL)
+
+all: $(SUB_MDL)
+	@echo $(SUB_MDL)
+	@echo "Compiling has completed!"
+
+romfs:
+	$(ROMFSINST) $(EXEC_server) /bin/$(EXEC_server)
+	$(ROMFSINST) $(EXEC_client) /bin/$(EXEC_client)
+	@cp $(EXEC_server) $(EXEC_server).elf
+	@cp $(EXEC_client) $(EXEC_client).elf
+	
+clean:
+	for lib in ${SUB_MDL} ; do   \
+	${MAKE} -j1 -C $$lib clean ; \
+	done;
+	-rm -f $(EXEC_server) $(EXEC_client) *.elf *.gdb *.o
+
+
+#%.o:%.cpp
+#	@echo Compile $< 
+#	$(CXX) $(LOCAL_CPPFLAGS) $(LOCAL_C_INCLUDES) -c $< -o $@
+
+
+$(SUB_MDL):
+	[ ! -d $@ ] || ${MAKE} -C $@ all
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/Makefile.backup b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/Makefile.backup
new file mode 100755
index 0000000..d84b3b7
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/Makefile.backup
@@ -0,0 +1,66 @@
+#*******************************************************************************
+# include ZTE application makefile
+#*******************************************************************************
+include $(COMMON_MK)
+
+#*******************************************************************************
+# execute
+#*******************************************************************************
+EXEC_server = test_binder_server
+EXEC_client = test_binder_client
+
+#*******************************************************************************
+# objects
+#*******************************************************************************
+OBJS_IF    = ipc/ITestBinderService.o
+OBJS_client    = demo/testBinder_client.o
+OBJS_server    = demo/testBinder_server.o
+OBJS_service    = service/TestBinderService.o
+		  
+#*******************************************************************************
+# include path
+#*******************************************************************************
+CFLAGS = -I. -I./client -I./ipc -I./service
+CFLAGS += -I$(zte_lib_path)/binder/include
+CFLAGS += -I$(zte_lib_path)/binder/include/utils
+CFLAGS += -I$(zte_lib_path)/binder/include/cutils
+CFLAGS += -I$(zte_lib_path)/binder/include/log
+
+CFLAGS += -g -Werror=implicit-function-declaration
+
+LOCAL_CPPFLAGS += $(CFLAGS)
+
+LDLIBS += -lpthread -lstdc++
+LDLIBS += -lbinder -L$(zte_lib_path)/binder
+LDLIBS += -lutils -L$(zte_lib_path)/binder/libutils
+LDLIBS += -lcutils -L$(zte_lib_path)/binder/libcutils
+LDLIBS += -llog -L$(zte_lib_path)/binder/liblog
+
+#*******************************************************************************
+# targets
+#*******************************************************************************
+all: $(EXEC_server) $(EXEC_client)
+
+$(EXEC_server): $(OBJS_IF) $(OBJS_service) $(OBJS_server)
+	$(CC) $(LDFLAGS) -o $@ $(OBJS_IF) $(OBJS_service) $(OBJS_server) -Wl,--start-group $(LDLIBS) -Wl,--end-group
+	@cp $@ $@.elf
+
+$(EXEC_client): $(OBJS_IF) $(OBJS_client)
+	$(CC) $(LDFLAGS) -o $@ $(OBJS_IF) $(OBJS_client) -Wl,--start-group $(LDLIBS) -Wl,--end-group
+	@cp $@ $@.elf
+
+romfs:
+	$(ROMFSINST) $(EXEC_server) /bin/$(EXEC_server)
+	$(ROMFSINST) $(EXEC_client) /bin/$(EXEC_client)
+	
+clean:
+	-rm -f $(EXEC_server) $(EXEC_client) *.elf *.gdb *.o
+
+%.o:%.cpp
+	@echo Compile $< 
+	$(CXX) $(LOCAL_CPPFLAGS) $(LOCAL_C_INCLUDES) -c $< -o $@
+
+%.o:%.c
+	@echo Compile $< 
+	$(CXX) $(LOCAL_CPPFLAGS) $(LOCAL_C_INCLUDES) -c $< -o $@
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/client/BaseCallbackInstance.cpp b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/client/BaseCallbackInstance.cpp
new file mode 100755
index 0000000..e537c47
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/client/BaseCallbackInstance.cpp
@@ -0,0 +1,29 @@
+#define LOG_TAG "BaseCallbackInstance"

+

+#include <utils/Log.h>

+#include <binder/IServiceManager.h>

+#include <binder/IPCThreadState.h>

+

+#include "BaseCallbackInstance.h"

+

+namespace android

+{

+

+BaseCallbackInstance::BaseCallbackInstance()

+{

+    ALOGD("BaseCallbackInstance: construct.");

+}

+

+BaseCallbackInstance::~BaseCallbackInstance()

+{

+    ALOGD("BaseCallbackInstance: destroy.");

+}

+

+int BaseCallbackInstance::callback_fnc(int cmd, int type, int size, void* pdata)

+{

+    ALOGI("BaseCallbackInstance:callback_fnc(%d,%d,%d,%p).", cmd, type, size, pdata);

+    return 0;

+}

+

+}

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/client/BaseCallbackInstance.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/client/BaseCallbackInstance.h
new file mode 100755
index 0000000..e47fbcd
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/client/BaseCallbackInstance.h
@@ -0,0 +1,22 @@
+#ifndef BASECALLBACKINSTANCE_H

+#define BASECALLBACKINSTANCE_H

+

+#include "IBaseCallback.h"

+

+namespace android

+{

+

+class BaseCallbackInstance: public BnBaseCallback

+{

+public:

+    int callback_fnc(int cmd, int type, int size, void* pdata);

+

+//private:

+    BaseCallbackInstance();

+    virtual ~BaseCallbackInstance();

+};

+

+}

+

+#endif /* BASECALLBACKINSTANCE_H */

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/client/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/client/Makefile
new file mode 100755
index 0000000..df1c50c
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/client/Makefile
@@ -0,0 +1,49 @@
+#*******************************************************************************
+# include application makefile
+#*******************************************************************************
+include $(COMMON_MK)
+
+#*******************************************************************************
+# objects
+#*******************************************************************************
+ALL_OBJS  = $(patsubst %.c,%.o,$(wildcard *.c))
+ALL_OBJS += $(patsubst %.cpp,%.o,$(wildcard *.cpp))
+
+#*******************************************************************************
+# include path
+#*******************************************************************************
+CFLAGS  = -I. -I../ipc
+CFLAGS += -I$(zte_lib_path)/binder/include
+CFLAGS += -I$(zte_lib_path)/binder/include/utils
+CFLAGS += -I$(zte_lib_path)/binder/include/cutils
+CFLAGS += -I$(zte_lib_path)/binder/include/log
+
+CFLAGS += -g -O0 -Werror=implicit-function-declaration -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0 
+
+LOCAL_CPPFLAGS += $(CFLAGS)
+
+LDLIBS += -lpthread -lstdc++
+LDLIBS += -lbinder -L$(zte_lib_path)/binder
+LDLIBS += -lutils -L$(zte_lib_path)/binder/libutils
+LDLIBS += -lcutils -L$(zte_lib_path)/binder/libcutils
+LDLIBS += -llog -L$(zte_lib_path)/binder/liblog
+
+#*******************************************************************************
+# targets
+#*******************************************************************************
+all: $(ALL_OBJS)
+
+
+clean:
+	-rm -rvf *.o
+
+
+%.o:%.cpp
+	@echo Compile $< 
+	$(CXX) $(LOCAL_CPPFLAGS) $(LOCAL_C_INCLUDES) -c $< -o $@
+
+
+%.o:%.c
+	@echo Compile $< 
+	$(CC) $(LOCAL_CPPFLAGS) $(LOCAL_C_INCLUDES) -c $< -o $@
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/client/SystemClientInstance.cpp b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/client/SystemClientInstance.cpp
new file mode 100755
index 0000000..0a5caee
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/client/SystemClientInstance.cpp
@@ -0,0 +1,29 @@
+#define LOG_TAG "SystemClientInstance"

+

+#include <utils/Log.h>

+#include <binder/IServiceManager.h>

+#include <binder/IPCThreadState.h>

+

+#include "SystemClientInstance.h"

+

+namespace android

+{

+

+SystemClientInstance::SystemClientInstance()

+{

+    ALOGD("SystemClientInstance: construct.");

+}

+

+SystemClientInstance::~SystemClientInstance()

+{

+    ALOGD("SystemClientInstance: destroy.");

+}

+

+int SystemClientInstance::notify(int cmd, int type, int size, void* pdata)

+{

+    ALOGI("SystemClientInstance::notify(cmd=%d,type=%d,clientid=%d,pdata=%p)", cmd, type, size, pdata);

+    return 0;

+}

+

+}

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/client/SystemClientInstance.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/client/SystemClientInstance.h
new file mode 100755
index 0000000..0966b7a
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/client/SystemClientInstance.h
@@ -0,0 +1,22 @@
+#ifndef SYSTEMCLIENTINSTANCE_H

+#define SYSTEMCLIENTINSTANCE_H

+

+#include "ISystemClient.h"

+

+namespace android

+{

+

+class SystemClientInstance: public BnSystemClient

+{

+public:

+    virtual int notify(int cmd, int type, int size, void* pdata);

+

+//private:

+    SystemClientInstance();

+    virtual ~SystemClientInstance();

+};

+

+}

+

+#endif /* SYSTEMCLIENTINSTANCE_H */

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/demo/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/demo/Makefile
new file mode 100755
index 0000000..5ce6e4f
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/demo/Makefile
@@ -0,0 +1,67 @@
+#*******************************************************************************
+# include application makefile
+#*******************************************************************************
+include $(COMMON_MK)
+
+#*******************************************************************************
+# execute
+#*******************************************************************************
+EXEC_server = test_binder_server
+EXEC_client = test_binder_client
+
+#*******************************************************************************
+# objects
+#*******************************************************************************
+OBJS_client    = testBinder_client.o
+OBJS_server    = testBinder_server.o
+
+OBJS_IF  = $(wildcard ../ipc/*.o)
+OBJS_IF_SVR += $(wildcard ../service/*.o)
+OBJS_IF_CLI += $(wildcard ../client/*.o)
+		  
+#*******************************************************************************
+# include path
+#*******************************************************************************
+CFLAGS = -I. -I../client -I../ipc -I../service
+CFLAGS += -I$(zte_lib_path)/binder/include
+CFLAGS += -I$(zte_lib_path)/binder/include/utils
+CFLAGS += -I$(zte_lib_path)/binder/include/cutils
+CFLAGS += -I$(zte_lib_path)/binder/include/log
+
+CFLAGS += -g -O0 -Werror=implicit-function-declaration -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0 
+
+LOCAL_CPPFLAGS += $(CFLAGS)
+
+LDLIBS += -lpthread -lstdc++
+LDLIBS += -lbinder -L$(zte_lib_path)/binder
+LDLIBS += -lutils -L$(zte_lib_path)/binder/libutils
+LDLIBS += -lcutils -L$(zte_lib_path)/binder/libcutils
+LDLIBS += -llog -L$(zte_lib_path)/binder/liblog
+
+#*******************************************************************************
+# targets
+#*******************************************************************************
+all: $(EXEC_server) $(EXEC_client)
+	@mv $(EXEC_server) ../
+	@mv $(EXEC_client) ../
+
+$(EXEC_server): $(OBJS_server)
+	$(CC) $(LDFLAGS) -o $@ $(OBJS_IF) $(OBJS_IF_SVR) $(OBJS_server) -Wl,--start-group $(LDLIBS) -Wl,--end-group
+#	@cp $@ $@.elf
+
+$(EXEC_client): $(OBJS_client)
+	$(CC) $(LDFLAGS) -o $@ $(OBJS_IF) $(OBJS_IF_CLI) $(OBJS_client) -Wl,--start-group $(LDLIBS) -Wl,--end-group
+#	@cp $@ $@.elf
+
+
+clean:
+	-rm -rvf *.o
+
+%.o:%.cpp
+	@echo Compile $< 
+	$(CXX) $(LOCAL_CPPFLAGS) $(LOCAL_C_INCLUDES) -c $< -o $@
+
+%.o:%.c
+	@echo Compile $< 
+	$(CC) $(LOCAL_CPPFLAGS) $(LOCAL_C_INCLUDES) -c $< -o $@
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/demo/testBinder_client.cpp b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/demo/testBinder_client.cpp
new file mode 100755
index 0000000..285a0dc
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/demo/testBinder_client.cpp
@@ -0,0 +1,76 @@
+#define LOG_TAG "TestBinderServiceClient "

+

+#include <binder/IPCThreadState.h>

+#include <binder/ProcessState.h>

+#include <utils/Log.h>

+#include <binder/IServiceManager.h>

+//#include <binder/TextOutput.h>

+

+#include "ITestBinderService.h"

+

+#include "BaseCallbackInstance.h"

+#include "SystemClientInstance.h"

+

+

+using namespace android;

+

+int main(int argc, char** argv)

+{

+    int sum = 0;

+    sp<ITestBinderService> mTestBinserService;

+

+	sp<BaseCallbackInstance> mBaseCB;

+	sp<SystemClientInstance> mSysClientIns;

+	sp<ISystem> mSysP2P;

+

+	char name[64];

+

+	memset(name, 0, sizeof(name));

+	/*test_binder_client "ipc.test1.service" */

+	if(2 <= argc) {

+		strncpy(name, argv[1], sizeof(name)-1);

+	}

+	else {

+		strncpy(name, I_TEST_BINDER_SERVICE_NAME, sizeof(name)-1);

+	}

+

+    if (mTestBinserService.get() == 0)

+    {

+        sp<IServiceManager> sm = defaultServiceManager();

+        sp<IBinder> binder;

+        do

+        {

+            //binder = sm->getService(String16(I_TEST_BINDER_SERVICE_NAME));

+            binder = sm->getService(String16(name));

+            if (binder != 0)

+                break;

+            ALOGI("getService fail");

+            //aout << "getService fail" << endl;

+            usleep(500000); // 0.5 s

+        }

+        while (true);

+        mTestBinserService = interface_cast<ITestBinderService> (binder);

+        ALOGE_IF(mTestBinserService == 0, "no ITestBinserService!?");

+    }

+

+    sum = mTestBinserService->test_svr_if(3, 4);

+    ALOGI("test_svr_if = %d", sum);

+    //aout << "sum =" << sum << endl;

+

+	mBaseCB = new BaseCallbackInstance();

+	mTestBinserService->reg_listener(mBaseCB->asBinder());/* register. */

+	mTestBinserService->reg_listener(mBaseCB->asBinder());/* test register. */

+

+

+    mSysClientIns = new SystemClientInstance();

+	mSysP2P = mTestBinserService->connect(mSysClientIns);

+	if(0 != mSysP2P.get())

+	{

+	    mSysP2P->test_svr_p2p_if(1000,888,0,0);

+	}

+

+    ProcessState::self()->startThreadPool();

+    IPCThreadState::self()->joinThreadPool();

+

+    return 0;

+}
\ No newline at end of file
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/demo/testBinder_server.cpp b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/demo/testBinder_server.cpp
new file mode 100755
index 0000000..bbf4aa4
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/demo/testBinder_server.cpp
@@ -0,0 +1,94 @@
+#include <binder/IPCThreadState.h>

+#include <binder/ProcessState.h>

+#include <binder/IServiceManager.h>

+#include <utils/Log.h>

+

+#include <binder/TextOutput.h>

+#include "TestBinderService.h"

+

+using namespace android;

+

+#if 0

+class WorkingThread2: public Thread

+{

+public:

+

+	WorkingThread2();

+	~WorkingThread2();	

+	virtual bool threadLoop();

+};

+

+WorkingThread2::WorkingThread2():Thread(false)

+{

+	ALOGD("WorkingThread2");

+	ALOGD("WorkingThread2:mRefs=%p", getWeakRefs());

+}

+

+WorkingThread2::~WorkingThread2()

+{

+	ALOGD("~WorkingThread2");

+}

+

+bool WorkingThread2::threadLoop()

+{

+    sleep(3);

+	ALOGD("WorkingThread2::threadLoop()");

+	return false;

+}

+#endif

+

+int main(int argc, char** argv)

+{

+#if 1

+	char name[64];

+

+	memset(name, 0, sizeof(name));

+	/*test_binder_server "ipc.test1.service" */

+	if(2 <= argc) {

+		strncpy(name, argv[1], sizeof(name)-1);

+	}

+	else {

+		strncpy(name, I_TEST_BINDER_SERVICE_NAME, sizeof(name)-1);

+	}

+	

+    sp<ProcessState> proc(ProcessState::self());

+    sp<IServiceManager> sm = defaultServiceManager();

+

+    //ALOGI("TestBinderService before");

+    aout << "TestBinderService before" << endl;

+	

+    TestBinderService::instantiate(name);

+

+    //ALOGI("TestBinderService End");

+    aout << "TestBinderService End" << endl;

+

+    ProcessState::self()->startThreadPool();

+    IPCThreadState::self()->joinThreadPool();

+

+    aout << "TestBinderService Exit" << endl;

+#else

+    sp<WorkingThread2> spTh2;

+    WorkingThread2 *pTh2 = 0;

+

+	pTh2 = new WorkingThread2();

+	if(pTh2)

+	{

+	    ALOGD("TEST:mRefs=%p", pTh2->getWeakRefs());

+	}

+

+	sleep(1);

+

+	spTh2 = pTh2;

+

+	sleep(1);

+

+	spTh2->run();

+	spTh2->join();

+

+	sleep(1);

+

+    ProcessState::self()->startThreadPool();

+    IPCThreadState::self()->joinThreadPool();

+#endif

+    return 0;

+}
\ No newline at end of file
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/if_c/test_binder_if.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/if_c/test_binder_if.h
new file mode 100755
index 0000000..aad9403
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/if_c/test_binder_if.h
@@ -0,0 +1,10 @@
+#ifndef TEST_BINDER_IF_H

+#define TEST_BINDER_IF_H

+

+int test_binder_if_1(int a);

+

+int test_binder_if_2(int a, int b);

+

+int test_binder_register_listener(int c);

+

+#endif /* TEST_BINDER_IF_H */

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/IBaseCallback.cpp b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/IBaseCallback.cpp
new file mode 100755
index 0000000..7590b40
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/IBaseCallback.cpp
@@ -0,0 +1,72 @@
+#define LOG_TAG "IBaseCallback"

+

+#include <utils/Log.h>

+

+#include "IBaseCallback.h"

+

+namespace android

+{

+

+enum

+{

+    CMD_IBASE_CALLBACK = IBinder::FIRST_CALL_TRANSACTION,

+};

+

+class BpBaseCallback: public BpInterface<IBaseCallback>

+{

+public:

+    BpBaseCallback(const sp<IBinder>& impl) :

+        BpInterface<IBaseCallback> (impl)

+    {

+        ALOGI("BpBaseCallback");

+    }

+

+    int callback_fnc(int cmd, int type, int size, void* pdata)

+    {

+        Parcel data, reply;

+		ALOGI("callback_fnc cmd = %d , type = %d Regid = %d", cmd, type, size);

+        data.writeInterfaceToken(IBaseCallback::getInterfaceDescriptor());

+        data.writeInt32(cmd);

+        data.writeInt32(type);

+		data.writeInt32(size);

+		data.write(pdata, size);

+        remote()->transact(CMD_IBASE_CALLBACK, data, &reply);

+        //remote()->transact(CMD_IBASE_CALLBACK, data, &reply, TF_ONE_WAY);

+        int ret = reply.readInt32();

+        ALOGI("callback_fnc ret = %d", ret);

+        return ret;

+    }

+};

+

+IMPLEMENT_META_INTERFACE(BaseCallback, "ipc.framework.IBaseCallback");

+

+// ----------------------------------------------------------------------

+

+status_t BnBaseCallback::onTransact(uint32_t code, const Parcel& data,

+        Parcel* reply, uint32_t flags)

+{

+	char cb_data[512] = {0};

+

+    switch (code)

+    {

+    case CMD_IBASE_CALLBACK:

+    {

+        CHECK_INTERFACE(IBaseCallback, data, reply);

+		int ret = 0;

+        int cmd = data.readInt32();

+        int type = data.readInt32();

+		int size = data.readInt32();

+		data.read(cb_data, size);

+        ALOGI("onTransact cmd=%d,type=%d,Regid=%d,data=%p", cmd, type, size, cb_data);

+        ret  = callback_fnc(cmd, type, size, cb_data);

+        ALOGI("onTransact ret = %d", ret);

+        reply->writeInt32(ret);

+        return ret;

+    }

+

+    default:

+        return BBinder::onTransact(code, data, reply, flags);

+    }

+}

+

+}

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/IBaseCallback.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/IBaseCallback.h
new file mode 100755
index 0000000..8d9e114
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/IBaseCallback.h
@@ -0,0 +1,32 @@
+#ifndef IBASECALLBACK_H

+#define IBASECALLBACK_H

+

+#include <utils/RefBase.h>

+#include <binder/IInterface.h>

+#include <binder/Parcel.h>

+

+

+namespace android

+{

+

+class Parcel;

+

+class IBaseCallback: public IInterface

+{

+public:

+    DECLARE_META_INTERFACE(BaseCallback);

+

+    virtual int callback_fnc(int cmd, int type, int size, void* pdata) = 0;

+};

+

+class BnBaseCallback: public BnInterface<IBaseCallback>

+{

+public:

+    virtual status_t onTransact(uint32_t code, const Parcel& data,

+                                Parcel* reply, uint32_t flags = 0);

+};

+

+}

+

+#endif /* IBASECALLBACK_H */

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ISystem.cpp b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ISystem.cpp
new file mode 100755
index 0000000..8ea71ee
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ISystem.cpp
@@ -0,0 +1,75 @@
+#define LOG_TAG "ISystem"

+

+#include <utils/String8.h>

+#include <utils/Log.h>

+#include "ISystem.h"

+

+enum

+{

+    CMD_ISYSTEM_P2P_DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,

+    CMD_ISYSTEM_P2P_IF

+};

+	

+class BpSystem: public BpInterface<ISystem>

+{

+public:

+    explicit BpSystem(const sp<IBinder>& impl)

+        : BpInterface<ISystem>(impl)

+    {

+        ALOGD("BpSystem");

+    }

+

+	virtual void disconnect(void)

+    {

+        Parcel data, reply;

+

+		ALOGD("Send DISCONNECT\n");

+        data.writeInterfaceToken(ISystem::getInterfaceDescriptor());

+        remote()->transact(CMD_ISYSTEM_P2P_DISCONNECT, data, &reply);

+    }

+

+	virtual int test_svr_p2p_if(int cmd, int type, int size, void* pdata)

+	{

+		Parcel data, reply;

+

+		ALOGD("test_svr_p2p_if:%d,%d\n", cmd, type);

+	

+		data.writeInterfaceToken(ISystem::getInterfaceDescriptor());

+		data.writeInt32(cmd);

+		data.writeInt32(type);

+        remote()->transact(CMD_ISYSTEM_P2P_IF, data, &reply);

+

+		return 0;

+	}

+};

+

+IMPLEMENT_META_INTERFACE(System, "ipc.framework.ISystem");

+

+status_t BnSystem::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)

+{

+    switch (code)

+    {

+	case CMD_ISYSTEM_P2P_DISCONNECT:

+	{

+		CHECK_INTERFACE(ISystem, data, reply);

+	    disconnect();

+		ALOGD("BnSystem::onTransact::disconnect");

+		break;

+	}

+	case CMD_ISYSTEM_P2P_IF:

+	{

+	    int cmd = 0, type = 0;

+	

+		CHECK_INTERFACE(ISystem, data, reply);

+		cmd  = data.readInt32();

+		type = data.readInt32();

+	    test_svr_p2p_if(cmd, type, 0, 0);

+		ALOGD("BnSystem::onTransact::test_svr_p2p_if");

+	    break;

+	}

+	default:

+		break;

+	}

+	

+	return 0;

+}

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ISystem.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ISystem.h
new file mode 100755
index 0000000..33f42ca
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ISystem.h
@@ -0,0 +1,29 @@
+#ifndef ISYSTEM_H

+#define ISYSTEM_H

+

+#include <binder/IInterface.h>

+#include <binder/Parcel.h>

+

+using namespace android;

+

+class ISystem: public IInterface

+{

+public:

+    DECLARE_META_INTERFACE(System)

+	

+	virtual void disconnect(void) = 0;

+	virtual int test_svr_p2p_if(int cmd, int type, int size, void* pdata) = 0;

+};

+

+class BnSystem: public BnInterface<ISystem>

+{

+public:

+    virtual status_t onTransact(

+        uint32_t code,

+        const Parcel& data,

+        Parcel* reply,

+        uint32_t flags = 0);

+};

+

+#endif //ISYSTEM_H

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ISystemClient.cpp b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ISystemClient.cpp
new file mode 100755
index 0000000..d009dff
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ISystemClient.cpp
@@ -0,0 +1,70 @@
+#define LOG_TAG "ISystemClient"

+

+#include <utils/Log.h>

+

+#include "ISystemClient.h"

+

+namespace android

+{

+

+enum

+{

+    CMD_ISYSTEM_CLIENT_NOTIFY = IBinder::FIRST_CALL_TRANSACTION,

+};

+

+class BpSystemClient: public BpInterface<ISystemClient>

+{

+public:

+    BpSystemClient(const sp<IBinder>& impl) :

+        BpInterface<ISystemClient> (impl)

+    {

+        ALOGI("BpSystemClient");

+    }

+

+    int notify(int cmd, int type, int size, void* pdata)

+    {

+

+        Parcel data, reply;

+        ALOGI("BpSystemClient:notify cmd = %d , type = %d, clientid = %d", cmd, type, size);

+        data.writeInterfaceToken(ISystemClient::getInterfaceDescriptor());

+        data.writeInt32(cmd);

+        data.writeInt32(type);

+		data.writeInt32(size);//clientid

+

+        remote()->transact(CMD_ISYSTEM_CLIENT_NOTIFY, data, &reply);

+        int ret = reply.readInt32();

+        ALOGI("BpServiceClient:notify ret = %d", ret);

+        return ret;

+    }

+};

+

+IMPLEMENT_META_INTERFACE(SystemClient, "ipc.framework.ISystemClient");

+

+// ----------------------------------------------------------------------

+

+status_t BnSystemClient::onTransact(uint32_t code, const Parcel& data,

+        Parcel* reply, uint32_t flags)

+{

+    switch (code)

+    {

+    case CMD_ISYSTEM_CLIENT_NOTIFY:

+    {

+		int ret = 0;

+        CHECK_INTERFACE(ISystemClient, data, reply);

+        int cmd = data.readInt32();

+        int type = data.readInt32();

+		int size = data.readInt32();

+

+        ALOGI("BnSystemClient::onTransact::notify,cmd = %d , type = %d, clientid = %d", cmd, type, size);

+        ret  = notify(cmd, type, size, 0);

+        ALOGI("BnSystemClient::onTransact::notify ret = %d", ret);

+        reply->writeInt32(ret);

+        return ret;

+    }

+    default:

+        return BBinder::onTransact(code, data, reply, flags);

+    }

+}

+

+}

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ISystemClient.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ISystemClient.h
new file mode 100755
index 0000000..749a0ed
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ISystemClient.h
@@ -0,0 +1,32 @@
+#ifndef ISYSTEMCLIENT_H

+#define ISYSTEMCLIENT_H

+

+#include <utils/RefBase.h>

+#include <binder/IInterface.h>

+#include <binder/Parcel.h>

+

+

+namespace android

+{

+

+class Parcel;

+

+class ISystemClient: public IInterface

+{

+public:

+    DECLARE_META_INTERFACE(SystemClient);

+

+    virtual int notify(int cmd, int type, int size, void* pdata) = 0;

+};

+

+class BnSystemClient: public BnInterface<ISystemClient>

+{

+public:

+    virtual status_t onTransact(uint32_t code, const Parcel& data,

+                                Parcel* reply, uint32_t flags = 0);

+};

+

+}

+

+#endif /* ISYSTEMCLIENT_H */

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ITestBinderService.cpp b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ITestBinderService.cpp
new file mode 100755
index 0000000..c09fd48
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ITestBinderService.cpp
@@ -0,0 +1,142 @@
+#define LOG_TAG "ITestBinderService"

+

+#include <utils/Log.h>

+

+#include "ITestBinderService.h"

+

+namespace android

+{

+

+enum

+{

+    CMD_TEST_SVR_IF = IBinder::FIRST_CALL_TRANSACTION,

+    CMD_TEST_CONNECT,

+    CMD_TEST_REG_LISTENER

+};

+

+class BpTestBinderService: public BpInterface<ITestBinderService>

+{

+public:

+    BpTestBinderService(const sp<IBinder>& impl) :

+        BpInterface<ITestBinderService> (impl)

+    {

+        ALOGD("BpTestBinderService()");

+    }

+

+    int test_svr_if(int a, int b)

+    {

+

+        Parcel data, reply;

+        ALOGI("Enter BpTestBinderService test_svr_if,a = %d , b = %d", a, b);

+        data.writeInterfaceToken(ITestBinderService::getInterfaceDescriptor());

+        data.writeInt32(a);

+        data.writeInt32(b);

+        remote()->transact(CMD_TEST_SVR_IF, data, &reply);

+        int sum = reply.readInt32();

+        ALOGI("BpTestBinderService sum = %d", sum);

+        return sum;

+    }

+

+	int reg_listener(const sp<IBinder>& cb)

+	{

+	    status_t ret = 0;

+		Parcel data, reply;

+

+		data.writeInterfaceToken(ITestBinderService::getInterfaceDescriptor());

+		data.writeInt32(1);

+		data.writeStrongBinder(cb);

+		ret = remote()->transact(CMD_TEST_REG_LISTENER, data, &reply);

+

+		ALOGD("reg_listener()");

+

+		return ret;

+	}

+

+	int unreg_listener(const sp<IBinder>& cb)

+	{

+	    status_t ret = 0;

+		Parcel data, reply;

+

+		data.writeInterfaceToken(ITestBinderService::getInterfaceDescriptor());

+		data.writeInt32(0);

+		data.writeStrongBinder(cb);

+		ret = remote()->transact(CMD_TEST_REG_LISTENER, data, &reply);

+

+		ALOGD("unreg_listener()");

+

+		return ret;

+

+	}

+

+    sp<ISystem> connect(const sp<ISystemClient>& systemClient)

+    {

+		ALOGD("Send CONNECT");

+		Parcel data, reply;

+

+		data.writeInterfaceToken(ITestBinderService::getInterfaceDescriptor());

+		data.writeStrongBinder(systemClient->asBinder());

+		remote()->transact(CMD_TEST_CONNECT, data, &reply);

+

+		return interface_cast<ISystem>(reply.readStrongBinder());

+    }

+

+};

+

+IMPLEMENT_META_INTERFACE(TestBinderService, "ipc.framework.ITestBinderService");

+

+// ----------------------------------------------------------------------

+

+status_t BnTestBinderService::onTransact(uint32_t code, const Parcel& data,

+        Parcel* reply, uint32_t flags)

+{

+    switch (code)

+    {

+    case CMD_TEST_SVR_IF:

+	{

+        CHECK_INTERFACE(ITestBinderService, data, reply);

+        int a = data.readInt32();

+        int b = data.readInt32();

+        ALOGI("Enter BnTestBinderService add,a = %d , b = %d", a, b);

+        int sum = 0;

+        sum  = test_svr_if(a, b);

+        ALOGI("BnTestBinderService sum = %d", sum);

+        reply->writeInt32(sum);

+        return sum;

+    }

+

+	case CMD_TEST_CONNECT:

+	{

+		ALOGD("Receive CONNECT");

+		CHECK_INTERFACE(ITestBinderService, data, reply);

+		sp<ISystemClient> systemClient = interface_cast<ISystemClient>(data.readStrongBinder());

+		sp<ISystem> sys = connect(systemClient);

+		reply->writeStrongBinder(sys->asBinder());

+		break;

+	}

+

+	case CMD_TEST_REG_LISTENER:

+	{

+		int isRegCB = 0;

+		CHECK_INTERFACE(ITestBinderService, data, reply);

+		isRegCB = data.readInt32();

+		sp<IBinder> cb = data.readStrongBinder();

+

+		if(isRegCB)

+			reg_listener(cb);

+		else

+			unreg_listener(cb);

+

+		ALOGD("Receive reg listener.");

+

+		break;

+	}

+

+    default:

+        return BBinder::onTransact(code, data, reply, flags);

+    }

+

+	return 0;

+}

+

+}

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ITestBinderService.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ITestBinderService.h
new file mode 100755
index 0000000..7e76cae
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/ITestBinderService.h
@@ -0,0 +1,40 @@
+#ifndef ITESTBINDERSERVICE_H

+#define ITESTBINDERSERVICE_H

+

+#include <utils/RefBase.h>

+#include <binder/IInterface.h>

+#include <binder/Parcel.h>

+

+#include "ISystem.h"

+#include "ISystemClient.h"

+#include "IBaseCallback.h"

+

+#define I_TEST_BINDER_SERVICE_NAME "ipc.test.service"

+

+namespace android

+{

+

+class Parcel;

+

+class ITestBinderService: public IInterface

+{

+public:

+    DECLARE_META_INTERFACE(TestBinderService);

+

+    virtual int test_svr_if(int a, int b) = 0;

+	virtual sp<ISystem> connect(const sp<ISystemClient>& systemClient) = 0;

+	virtual int reg_listener(const sp<IBinder>& cb) = 0;

+	virtual int unreg_listener(const sp<IBinder>& cb) = 0;

+};

+

+class BnTestBinderService: public BnInterface<ITestBinderService>

+{

+public:

+    virtual status_t onTransact(uint32_t code, const Parcel& data,

+                                Parcel* reply, uint32_t flags = 0);

+};

+

+}

+

+#endif /* ITESTBINDERSERVICE_H */

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/Makefile
new file mode 100755
index 0000000..1de0823
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/Makefile
@@ -0,0 +1,49 @@
+#*******************************************************************************
+# include application makefile
+#*******************************************************************************
+include $(COMMON_MK)
+
+#*******************************************************************************
+# objects
+#*******************************************************************************
+ALL_OBJS  = $(patsubst %.c,%.o,$(wildcard *.c))
+ALL_OBJS += $(patsubst %.cpp,%.o,$(wildcard *.cpp))
+
+#*******************************************************************************
+# include path
+#*******************************************************************************
+CFLAGS  = -I.
+CFLAGS += -I$(zte_lib_path)/binder/include
+CFLAGS += -I$(zte_lib_path)/binder/include/utils
+CFLAGS += -I$(zte_lib_path)/binder/include/cutils
+CFLAGS += -I$(zte_lib_path)/binder/include/log
+
+CFLAGS += -g -O0 -Werror=implicit-function-declaration -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0 
+
+LOCAL_CPPFLAGS += $(CFLAGS)
+
+LDLIBS += -lpthread -lstdc++
+LDLIBS += -lbinder -L$(zte_lib_path)/binder
+LDLIBS += -lutils -L$(zte_lib_path)/binder/libutils
+LDLIBS += -lcutils -L$(zte_lib_path)/binder/libcutils
+LDLIBS += -llog -L$(zte_lib_path)/binder/liblog
+
+#*******************************************************************************
+# targets
+#*******************************************************************************
+all: $(ALL_OBJS)
+
+
+clean:
+	-rm -rvf *.o
+
+
+%.o:%.cpp
+	@echo Compile $< 
+	$(CXX) $(LOCAL_CPPFLAGS) $(LOCAL_C_INCLUDES) -c $< -o $@
+
+
+%.o:%.c
+	@echo Compile $< 
+	$(CC) $(LOCAL_CPPFLAGS) $(LOCAL_C_INCLUDES) -c $< -o $@
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/TestBinderIfC.cpp b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/TestBinderIfC.cpp
new file mode 100755
index 0000000..7f95906
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/TestBinderIfC.cpp
@@ -0,0 +1,156 @@
+#ifndef TESTBINDERIFC_H

+#define TESTBINDERIFC_H

+

+#include "pthread.h"

+

+#include <binder/IPCThreadState.h>

+#include <binder/ProcessState.h>

+#include <binder/IServiceManager.h>

+

+#include "TestBinderIfC.h"

+

+namespace android

+{

+

+static TestBinderIfC* gInstance = 0;

+static pthread_mutex_t ifc_instance_mutex;

+

+//int ifc_mutex_lock(pthread_mutex_t *mutex)

+int ifc_mutex_lock(void)

+{

+    return 0;

+}

+

+//int ifc_mutex_unlock(pthread_mutex_t *mutex)

+int ifc_mutex_unlock(void)

+{

+    return 0;

+}

+

+TestBinderIfC* TestBinderIfC::getInstance()

+{

+	ifc_mutex_lock();

+

+	if(gInstance && (gInstance->m_serverIsDied == true))

+	{

+		ALOGE("server is died");

+		delete gInstance;

+		gInstance = 0;

+	}

+

+	if (gInstance == 0)

+	{

+		TestBinderIfC* ptmp = 0;

+

+		ptmp = new TestBinderIfC();

+		if(ptmp == 0)

+		{

+			ALOGE("[%s][%d] err new\n",__FUNCTION__,__LINE__);

+			ifc_mutex_unlock();

+			return 0;

+		}

+

+		if(ptmp->m_pRemoteService == NULL)

+		{

+			delete ptmp;

+			ptmp = 0;

+			ifc_mutex_unlock();

+			return NULL;

+		}

+

+		gInstance = ptmp;

+	}

+

+	ifc_mutex_unlock();

+

+	return gInstance;

+}

+

+TestBinderIfC::TestBinderIfC()

+{

+	sp<ProcessState> proc(ProcessState::self());

+	ProcessState::self()->startThreadPool();

+

+	m_sDeathNotifier = 0;

+

+	sp<IBinder> binder = 0;

+	do

+	{

+		binder = defaultServiceManager()->getService(String16("test.ITestBinderService"));

+		if(binder != 0)

+		{

+			break;

+		}

+		sleep(1);

+	}while(binder == 0);

+

+	m_sDeathNotifier = new DeathNotifier();

+	binder->linkToDeath(m_sDeathNotifier);

+

+	m_serverIsDied = false;

+}

+

+void TestBinderIfC::DeathNotifier::binderDied(const wp<IBinder>& who)

+{

+	ALOGE("server is died");

+	if(gInstance)

+	{

+		gInstance->m_serverIsDied = true;

+	}

+}

+

+TestBinderIfC::DeathNotifier::~DeathNotifier()

+{

+}

+

+TestBinderIfC::~TestBinderIfC()

+{

+	if(m_sDeathNotifier != NULL)

+	{

+		m_pRemoteService->unlinkToDeath(m_sDeathNotifier);

+	}

+

+	m_pRemoteService = 0;

+}

+

+} //namespace android

+

+using namespace android;

+

+int test_binder_if_1(int a)

+{

+	TestBinderIfC* pIpcIF = TestBinderIfC::getInstance();

+

+	if(0 != pIpcIF)

+	{

+		;

+	}

+	

+	return 0;

+}

+

+int test_binder_if_2(int a, int b)

+{

+	TestBinderIfC* pIpcIF = TestBinderIfC::getInstance();

+

+	if(0 != pIpcIF)

+	{

+		;

+	}

+	

+	return 0;

+}

+

+int test_binder_register_listener(int c)

+{

+	TestBinderIfC* pIpcIF = TestBinderIfC::getInstance();

+

+	if(0 != pIpcIF)

+	{

+		;

+	}

+	

+	return 0;

+}

+

+#endif //TESTBINDERIFC_H

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/TestBinderIfC.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/TestBinderIfC.h
new file mode 100755
index 0000000..424b67c
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/TestBinderIfC.h
@@ -0,0 +1,41 @@
+#ifndef TEST_BINDER_IFC_H

+#define TEST_BINDER_IFC_H

+

+#include <utils/RefBase.h>

+#include <binder/IInterface.h>

+#include <binder/Parcel.h>

+

+namespace android

+{

+

+class TestBinderIfC

+{

+protected:

+	sp<IBinder> m_pRemoteService;

+

+public:

+

+	bool m_serverIsDied;

+

+	static TestBinderIfC* getInstance();

+

+	TestBinderIfC();

+	~TestBinderIfC();

+

+    class DeathNotifier: public IBinder::DeathRecipient  

+    {  

+ 	 public:  

+       	DeathNotifier() {}  

+        	virtual ~DeathNotifier();  

+        	virtual void binderDied(const wp<IBinder>& who);  

+    };  

+

+    sp<DeathNotifier> m_sDeathNotifier;

+

+private:

+

+};

+

+}//namespace android

+

+#endif //TEST_BINDER_IFC_H

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/test_binder_if.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/test_binder_if.c
new file mode 100755
index 0000000..7c1aefe
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/ipc/test_binder_if.c
@@ -0,0 +1,22 @@
+#include <stdio.h>

+#include <stdlib.h>

+

+int test_binder_if_x_1(void)

+{

+	return 0;

+}

+

+int test_binder_if_x_2(void)

+{

+	return 0;

+}

+

+int test_binder_if_x_3(void)

+{

+	return 0;

+}

+

+int test_binder_if_x_4(void)

+{

+	return 0;

+}
\ No newline at end of file
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/service/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/service/Makefile
new file mode 100755
index 0000000..fb9952e
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/service/Makefile
@@ -0,0 +1,50 @@
+#*******************************************************************************
+# include application makefile
+#*******************************************************************************
+include $(COMMON_MK)
+
+#*******************************************************************************
+# objects
+#*******************************************************************************
+ALL_OBJS  = $(patsubst %.c,%.o,$(wildcard *.c))
+ALL_OBJS += $(patsubst %.cpp,%.o,$(wildcard *.cpp))
+
+#*******************************************************************************
+# include path
+#*******************************************************************************
+CFLAGS = -I.
+CFLAGS += -I../ipc
+CFLAGS += -I$(zte_lib_path)/binder/include
+CFLAGS += -I$(zte_lib_path)/binder/include/utils
+CFLAGS += -I$(zte_lib_path)/binder/include/cutils
+CFLAGS += -I$(zte_lib_path)/binder/include/log
+
+CFLAGS += -g -O0 -Werror=implicit-function-declaration -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0 
+
+LOCAL_CPPFLAGS += $(CFLAGS)
+
+LDLIBS += -lpthread -lstdc++
+LDLIBS += -lbinder -L$(zte_lib_path)/binder
+LDLIBS += -lutils -L$(zte_lib_path)/binder/libutils
+LDLIBS += -lcutils -L$(zte_lib_path)/binder/libcutils
+LDLIBS += -llog -L$(zte_lib_path)/binder/liblog
+
+#*******************************************************************************
+# targets
+#*******************************************************************************
+all: $(ALL_OBJS)
+
+
+clean:
+	-rm -rvf *.o
+
+
+%.o:%.cpp
+	@echo Compile $< 
+	$(CXX) $(LOCAL_CPPFLAGS) $(LOCAL_C_INCLUDES) -c $< -o $@
+
+
+%.o:%.c
+	@echo Compile $< 
+	$(CC) $(LOCAL_CPPFLAGS) $(LOCAL_C_INCLUDES) -c $< -o $@
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/service/SystemInstance.cpp b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/service/SystemInstance.cpp
new file mode 100755
index 0000000..80ee83e
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/service/SystemInstance.cpp
@@ -0,0 +1,29 @@
+#define LOG_TAG "SystemInstance"

+

+#include "SystemInstance.h"

+

+namespace android

+{

+

+SystemInstance::SystemInstance()

+{

+	ALOGD("SystemInstance: construct.");

+}

+

+SystemInstance::~SystemInstance()

+{

+	ALOGD("SystemInstance: destroy.");

+}

+

+void SystemInstance::disconnect(void)

+{

+	;

+}

+

+int SystemInstance::test_svr_p2p_if(int cmd, int type, int size, void* pdata)

+{

+	ALOGD("SystemInstance: test_svr_p2p_if:%d,%d\n", cmd, type);

+	return 0;

+}

+

+}

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/service/SystemInstance.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/service/SystemInstance.h
new file mode 100755
index 0000000..b6b0bd1
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/service/SystemInstance.h
@@ -0,0 +1,22 @@
+#ifndef SYSTEMINSTANCE_H

+#define SYSTEMINSTANCE_H

+

+#include "ISystem.h"

+

+namespace android

+{

+

+class SystemInstance : public BnSystem

+{

+public:

+    virtual void disconnect(void);

+	virtual int test_svr_p2p_if(int cmd, int type, int size, void* pdata);

+

+private:

+    SystemInstance();

+    virtual ~SystemInstance();

+};

+

+}

+

+#endif //SYSTEMINSTANCE_H

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/service/TestBinderService.cpp b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/service/TestBinderService.cpp
new file mode 100755
index 0000000..ad7cf72
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/service/TestBinderService.cpp
@@ -0,0 +1,242 @@
+#define LOG_TAG "TestBinderService"

+

+#include <utils/Log.h>

+#include <binder/IServiceManager.h>

+#include <binder/IPCThreadState.h>

+

+#include <utils/Thread.h>

+

+#include "TestBinderService.h"

+

+static int debug_flag = 1;

+

+namespace android

+{

+

+void TestBinderService::instantiate(char *name)

+{

+    ALOGI("instantiate.");

+#if 0

+    status_t st = defaultServiceManager()->addService(

+                      String16(I_TEST_BINDER_SERVICE_NAME), new TestBinderService());

+#else

+	status_t st = defaultServiceManager()->addService(

+                      String16(name), new TestBinderService());                      

+#endif

+    ALOGD("ServiceManager addService ret=%d", st);

+    ALOGD("instantiate end.");

+}

+

+TestBinderService::TestBinderService()

+{

+    WorkingThread *pWorkerTh = 0;

+    void* refPtr = 0;

+

+    ALOGD("construct.");

+

+	ALOGD("construct<mRefs = %p>.", this->getWeakRefs());

+

+	pWorkerTh = new WorkingThread(this);

+    refPtr = pWorkerTh->getWeakRefs();

+	ALOGD(" WorkingThread<mRefs = %p>.", refPtr);

+

+	ALOGD(" sleep 2s.");

+    sleep(2);

+

+	m_workingTh = pWorkerTh;

+	m_workingTh->run();

+}

+

+TestBinderService::~TestBinderService()

+{

+    ALOGD("~destroy.");

+	m_workingTh.clear();

+}

+

+int TestBinderService::test_svr_if(int a,int b)

+{

+    ALOGI("test_svr_if a = %d, b = %d.", a , b);

+    return a+b;

+}

+

+int TestBinderService::reg_listener(const sp<IBinder>& cb)

+{

+    int index;

+    sp<IBaseCallback> icb;

+	sp<IBaseCallback> icb_new;

+

+	ALOGD("reg_listener cb=%p.", cb.get());

+

+	for(index = 0; index < m_listeners.size(); index++)

+	{

+	    //listener = m_sysServer->m_listeners.itemAt(index);

+		//iCB = interface_cast<IBaseCallback>(listener);

+		icb = m_listeners.itemAt(index);

+		ALOGD(" iter(@%d) cb=%p.", index, icb->asBinder().get());

+		if(icb->asBinder().get() == cb.get())

+		{

+		    ALOGI("reg_listener: cb<%p> == icb<%p>@<%d> : return.", cb.get() , icb->asBinder().get(), index);

+			return -1;

+		}

+	}

+

+    icb_new = interface_cast<IBaseCallback>(cb);

+

+    //if(0 > m_listeners.indexOf(icb))

+    {

+        m_listeners.add(icb_new);

+		ALOGD("m_listeners.add");

+    }

+

+	ALOGD("reg_listener.");

+

+    return 0;

+}

+

+int TestBinderService::unreg_listener(const sp<IBinder>& cb)

+{

+    int index;

+    sp<IBaseCallback> icb;

+	sp<IBaseCallback> icb_new;

+

+	ALOGD("unreg_listener cb=%p.", cb.get());

+

+	for(index = 0; index < m_listeners.size(); index++)

+	{

+	    //listener = m_sysServer->m_listeners.itemAt(index);

+		//iCB = interface_cast<IBaseCallback>(listener);

+		icb = m_listeners.itemAt(index);

+		ALOGD(" iter(@%d) cb=%p.", index, icb->asBinder().get());

+		if(icb->asBinder().get() == cb.get())

+		{

+		    ALOGI("unreg_listener: cb<%p> == icb<%p> : break.", cb.get() , icb->asBinder().get());

+			break;

+		}

+	}

+

+    if(index >= m_listeners.size())

+    {

+        ALOGD(" no item found<index=%d>.", index);

+		return -1;

+    }

+

+    //icb = interface_cast<IBaseCallback>(listener);

+

+    //if(0 <= m_listeners.indexOf(cb))

+    {

+        m_listeners.removeAt(index);

+		ALOGD("m_listeners.remove");

+    }

+

+	ALOGD("unreg_listener.");

+

+    return 0;

+}

+

+sp<ISystem> TestBinderService::connect(const sp<ISystemClient>& systemclient)

+{

+	static uint32_t UidCount = 1;

+    sp<Client> client;

+    uint32_t u32Pid = IPCThreadState::self()->getCallingPid();

+    uint32_t u32Uid = UidCount++;//IPCThreadState::self()->getCallingUid();

+

+    client = new (std::nothrow)Client(this, systemclient, u32Pid, u32Uid);

+    m_Clients.add(client);

+

+	ALOGD("connect.");

+

+    return client;

+}

+

+void TestBinderService::removeClient(wp<Client> client)

+{

+    m_Clients.remove(client);

+	ALOGD("removeClient.");

+}

+

+TestBinderService::Client::Client( const sp<TestBinderService>& sysServer,

+                               const sp<ISystemClient>&  sysClient,

+                               uint32_t u32ClientPid,

+                               uint32_t mClientUid)

+    : m_sysServer(sysServer)

+    , m_sysClient(sysClient)

+    , m_ClientPid(u32ClientPid)

+    , m_ClientUid(mClientUid)

+{

+    ALOGD("Client");

+}

+

+TestBinderService::Client::~Client()

+{

+    Client::disconnect();

+	ALOGD("~Client");

+}

+

+void TestBinderService::Client::disconnect(void)

+{

+    m_sysServer->removeClient(this);

+    m_sysClient.clear();

+	ALOGD("Client::disconnect");

+}

+

+int TestBinderService::Client::test_svr_p2p_if(int cmd, int type, int size, void* pdata)

+{

+    ALOGD("Client::test_svr_p2p_if(%d,%d,%d,%p)", cmd, type, size, pdata);

+	return 0;

+}

+

+TestBinderService::WorkingThread::WorkingThread(const sp<TestBinderService>& sysService)

+	:Thread(false)

+{

+    m_sysServer = sysService;

+	ALOGD("WorkingThread");

+}

+

+TestBinderService::WorkingThread::~WorkingThread()

+{

+	ALOGD("~WorkingThread");

+}

+

+bool TestBinderService::WorkingThread::threadLoop()

+{

+    static int th_loop_cnt = 0;

+	int index = 0;

+	//sp<IBinder> listener;

+	sp<IBaseCallback> iCB;

+

+	wp<Client> wp_binder;

+	sp<Client>  sp_client;

+

+	//ALOGD("threadLoop<in>");

+

+    sleep(2);

+

+    th_loop_cnt++;

+	ALOGD("threadLoop<cnt=%d>", th_loop_cnt);

+

+	for(index = 0; index < m_sysServer->m_listeners.size(); index++)

+	{

+		//ALOGD("threadLoop<index=%d> start- 1", index);

+	    //listener = m_sysServer->m_listeners.itemAt(index);

+		//iCB = interface_cast<IBaseCallback>(listener);

+		iCB = m_sysServer->m_listeners.itemAt(index);

+		iCB->callback_fnc(th_loop_cnt, index, 0, 0);

+		//ALOGD("threadLoop<index=%d> end- 1", index);

+	}

+

+	for(index = 0; index < m_sysServer->m_Clients.size(); index++)

+	{

+		//ALOGD("threadLoop<index=%d> start- 2", index);

+	    wp_binder = m_sysServer->m_Clients.itemAt(index);

+		sp_client = wp_binder.promote();

+		sp_client->m_sysClient->notify(th_loop_cnt, index, sp_client->m_ClientUid, 0);

+		//ALOGD("threadLoop<index=%d> <%d:%d> start- 2", index,sp_client->m_ClientPid,sp_client->m_ClientUid);

+	}

+

+	//ALOGD("threadLoop<out>");

+

+	return true;

+}

+

+}

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/service/TestBinderService.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/service/TestBinderService.h
new file mode 100755
index 0000000..d6e7511
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/service_test/service/TestBinderService.h
@@ -0,0 +1,73 @@
+#ifndef ANDROID_TESTBINDERSERVICE_H_

+#define ANDROID_TESTBINDERSERVICE_H_

+

+#include <utils/KeyedVector.h>

+#include "ITestBinderService.h"

+#include "IBaseCallback.h"

+

+namespace android

+{

+

+#define DISALLOW_EVIL_CONSTRUCTORS(name) \

+    name(const name &); \

+    name &operator=(const name &)

+

+

+class TestBinderService: public BnTestBinderService

+{

+	class Client;

+

+public:

+    static void instantiate(char *name);

+    virtual int test_svr_if(int a,int b);

+	virtual int reg_listener(const sp<IBinder>& cb);

+	virtual int unreg_listener(const sp<IBinder>& cb);

+	virtual sp<ISystem> connect(const sp<ISystemClient>& systemclient);

+	virtual void removeClient(wp<Client> client);

+

+private:

+    TestBinderService();

+    virtual ~TestBinderService();

+

+    class Client : public BnSystem

+    {

+    public:

+        virtual void disconnect(void);

+		virtual int test_svr_p2p_if(int cmd, int type, int size, void* pdata);

+	private:

+		friend class TestBinderService;

+		

+		Client( const sp<TestBinderService>& sysService,

+						const sp<ISystemClient>&  sysClient,

+						uint32_t u32ClientPid,

+						uint32_t u32ClientUid);

+		~Client();

+

+		sp<TestBinderService> m_sysServer;

+        sp<ISystemClient> m_sysClient;

+        uint32_t m_ClientPid;

+        uint32_t m_ClientUid;

+    };

+

+	class WorkingThread: public Thread

+	{

+	public:

+		friend class TestBinderService;

+

+		WorkingThread(const sp<TestBinderService>& sysService);

+		~WorkingThread();	

+		virtual bool threadLoop();

+

+	private:

+		sp<TestBinderService> m_sysServer;

+		DISALLOW_EVIL_CONSTRUCTORS(WorkingThread);

+	};

+

+	SortedVector< wp<Client> > m_Clients;

+	SortedVector< sp<IBaseCallback> > m_listeners;

+	sp<WorkingThread> m_workingTh;

+};

+

+}

+

+#endif /* ANDROID_TESTBINDERSERVICE_H_ */

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/servicemanager/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/servicemanager/Makefile
new file mode 100755
index 0000000..226cc1e
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/servicemanager/Makefile
@@ -0,0 +1,47 @@
+#*******************************************************************************
+# include ZTE application makefile
+#*******************************************************************************
+include $(COMMON_MK)
+
+#*******************************************************************************
+# execute
+#*******************************************************************************
+EXEC    = servicemanager
+
+#*******************************************************************************
+# objects
+#*******************************************************************************
+OBJS    = binder.o service_manager.o
+		  
+#*******************************************************************************
+# include path
+#*******************************************************************************
+CFLAGS += -I.
+CFLAGS += -I$(zte_lib_path)/binder/include
+CFLAGS += -I$(zte_lib_path)/binder/include/utils
+CFLAGS += -I$(zte_lib_path)/binder/include/cutils
+CFLAGS += -I$(zte_lib_path)/binder/include/log
+
+CFLAGS += -g -O0 -Werror=implicit-function-declaration -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0 
+
+LDLIBS += -lpthread -lstdc++
+LDLIBS += -lbinder -L$(zte_lib_path)/binder
+LDLIBS += -lutils -L$(zte_lib_path)/binder/libutils
+LDLIBS += -lcutils -L$(zte_lib_path)/binder/libcutils
+LDLIBS += -llog -L$(zte_lib_path)/binder/liblog
+
+#*******************************************************************************
+# targets
+#*******************************************************************************
+all: $(EXEC)
+
+$(EXEC): $(OBJS)
+	$(CC) $(LDFLAGS) -o $@ $(OBJS) -Wl,--start-group $(LDLIBS) -Wl,--end-group
+	@cp $@ $@.elf
+	
+romfs:
+	$(ROMFSINST) $(EXEC) /bin/$(EXEC)
+	
+clean:
+	-rm -f $(EXEC) *.elf *.gdb *.o
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/servicemanager/bctest.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/servicemanager/bctest.c
new file mode 100755
index 0000000..08bfd31
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/servicemanager/bctest.c
@@ -0,0 +1,119 @@
+/* Copyright 2008 The Android Open Source Project
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include "binder.h"
+
+uint32_t svcmgr_lookup(struct binder_state *bs, uint32_t target, const char *name)
+{
+    uint32_t handle;
+    unsigned iodata[512/4];
+    struct binder_io msg, reply;
+
+    bio_init(&msg, iodata, sizeof(iodata), 4);
+    bio_put_uint32(&msg, 0);  // strict mode header
+    bio_put_string16_x(&msg, SVC_MGR_NAME);
+    bio_put_string16_x(&msg, name);
+
+    if (binder_call(bs, &msg, &reply, target, SVC_MGR_CHECK_SERVICE))
+        return 0;
+
+    handle = bio_get_ref(&reply);
+
+    if (handle)
+        binder_acquire(bs, handle);
+
+    binder_done(bs, &msg, &reply);
+
+    return handle;
+}
+
+int svcmgr_publish(struct binder_state *bs, uint32_t target, const char *name, void *ptr)
+{
+    int status;
+    unsigned iodata[512/4];
+    struct binder_io msg, reply;
+
+    bio_init(&msg, iodata, sizeof(iodata), 4);
+    bio_put_uint32(&msg, 0);  // strict mode header
+    bio_put_string16_x(&msg, SVC_MGR_NAME);
+    bio_put_string16_x(&msg, name);
+    bio_put_obj(&msg, ptr);
+
+    if (binder_call(bs, &msg, &reply, target, SVC_MGR_ADD_SERVICE))
+        return -1;
+
+    status = bio_get_uint32(&reply);
+
+    binder_done(bs, &msg, &reply);
+
+    return status;
+}
+
+unsigned token;
+
+int main(int argc, char **argv)
+{
+    int fd;
+    struct binder_state *bs;
+    uint32_t svcmgr = BINDER_SERVICE_MANAGER;
+    uint32_t handle;
+
+    bs = binder_open(128*1024);
+    if (!bs)
+    {
+        fprintf(stderr, "failed to open binder driver\n");
+        return -1;
+    }
+
+    argc--;
+    argv++;
+    while (argc > 0)
+    {
+        if (!strcmp(argv[0],"alt"))
+        {
+            handle = svcmgr_lookup(bs, svcmgr, "alt_svc_mgr");
+            if (!handle)
+            {
+                fprintf(stderr,"cannot find alt_svc_mgr\n");
+                return -1;
+            }
+            svcmgr = handle;
+            fprintf(stderr,"svcmgr is via %x\n", handle);
+        }
+        else if (!strcmp(argv[0],"lookup"))
+        {
+            if (argc < 2)
+            {
+                fprintf(stderr,"argument required\n");
+                return -1;
+            }
+            handle = svcmgr_lookup(bs, svcmgr, argv[1]);
+            fprintf(stderr,"lookup(%s) = %x\n", argv[1], handle);
+            argc--;
+            argv++;
+        }
+        else if (!strcmp(argv[0],"publish"))
+        {
+            if (argc < 2)
+            {
+                fprintf(stderr,"argument required\n");
+                return -1;
+            }
+            svcmgr_publish(bs, svcmgr, argv[1], &token);
+            argc--;
+            argv++;
+        }
+        else
+        {
+            fprintf(stderr,"unknown command %s\n", argv[0]);
+            return -1;
+        }
+        argc--;
+        argv++;
+    }
+    return 0;
+}
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/servicemanager/binder.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/servicemanager/binder.c
new file mode 100755
index 0000000..995aeed
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/servicemanager/binder.c
@@ -0,0 +1,690 @@
+/* Copyright 2008 The Android Open Source Project
+ */
+
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#include <string.h>
+
+#include "binder.h"
+
+#define MAX_BIO_SIZE (1 << 30)
+
+#define TRACE 0
+
+#define LOG_TAG "Binder"
+#include <cutils/log.h>
+
+void bio_init_from_txn(struct binder_io *io, struct binder_transaction_data *txn);
+
+#if TRACE
+void hexdump(void *_data, size_t len)
+{
+    unsigned char *data = _data;
+    size_t count;
+
+    for (count = 0; count < len; count++)
+    {
+        if ((count & 15) == 0)
+            fprintf(stderr,"%04zu:", count);
+        fprintf(stderr," %02x %c", *data,
+                (*data < 32) || (*data > 126) ? '.' : *data);
+        data++;
+        if ((count & 15) == 15)
+            fprintf(stderr,"\n");
+    }
+    if ((count & 15) != 0)
+        fprintf(stderr,"\n");
+}
+
+void binder_dump_txn(struct binder_transaction_data *txn)
+{
+    struct flat_binder_object *obj;
+    binder_size_t *offs = (binder_size_t *)(uintptr_t)txn->data.ptr.offsets;
+    size_t count = txn->offsets_size / sizeof(binder_size_t);
+
+    fprintf(stderr,"  target %016"PRIx64"  cookie %016"PRIx64"  code %08x  flags %08x\n",
+            (uint64_t)txn->target.ptr, (uint64_t)txn->cookie, txn->code, txn->flags);
+    fprintf(stderr,"  pid %8d  uid %8d  data %"PRIu64"  offs %"PRIu64"\n",
+            txn->sender_pid, txn->sender_euid, (uint64_t)txn->data_size, (uint64_t)txn->offsets_size);
+    hexdump((void *)(uintptr_t)txn->data.ptr.buffer, txn->data_size);
+    while (count--)
+    {
+        obj = (struct flat_binder_object *) (((char*)(uintptr_t)txn->data.ptr.buffer) + *offs++);
+        fprintf(stderr,"  - type %08x  flags %08x  ptr %016"PRIx64"  cookie %016"PRIx64"\n",
+                obj->type, obj->flags, (uint64_t)obj->binder, (uint64_t)obj->cookie);
+    }
+}
+
+#define NAME(n) case n: return #n
+const char *cmd_name(uint32_t cmd)
+{
+    switch(cmd)
+    {
+        NAME(BR_NOOP);
+        NAME(BR_TRANSACTION_COMPLETE);
+        NAME(BR_INCREFS);
+        NAME(BR_ACQUIRE);
+        NAME(BR_RELEASE);
+        NAME(BR_DECREFS);
+        NAME(BR_TRANSACTION);
+        NAME(BR_REPLY);
+        NAME(BR_FAILED_REPLY);
+        NAME(BR_DEAD_REPLY);
+        NAME(BR_DEAD_BINDER);
+    default:
+        return "???";
+    }
+}
+#else
+#define hexdump(a,b) do{} while (0)
+#define binder_dump_txn(txn)  do{} while (0)
+#endif
+
+#define BIO_F_SHARED    0x01  /* needs to be buffer freed */
+#define BIO_F_OVERFLOW  0x02  /* ran out of space */
+#define BIO_F_IOERROR   0x04
+#define BIO_F_MALLOCED  0x08  /* needs to be free()'d */
+
+struct binder_state
+{
+    int fd;
+    void *mapped;
+    size_t mapsize;
+};
+
+struct binder_state *binder_open(size_t mapsize)
+{
+    struct binder_state *bs;
+    struct binder_version vers;
+
+    bs = malloc(sizeof(*bs));
+    if (!bs)
+    {
+        errno = ENOMEM;
+        return NULL;
+    }
+
+    bs->fd = open("/dev/binder", O_RDWR);
+    if (bs->fd < 0)
+    {
+        fprintf(stderr,"binder: cannot open device (%s)\n",
+                strerror(errno));
+        goto fail_open;
+    }
+
+    if ((ioctl(bs->fd, BINDER_VERSION, &vers) == -1) ||
+            (vers.protocol_version != BINDER_CURRENT_PROTOCOL_VERSION))
+    {
+        fprintf(stderr, "binder: driver version(%d) differs from user space(%d)\n",vers.protocol_version,BINDER_CURRENT_PROTOCOL_VERSION);
+		ALOGE("errno %d (%s)\n", errno, strerror(errno));
+        goto fail_open;
+    }
+
+    bs->mapsize = mapsize;
+    bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0);
+    if (bs->mapped == MAP_FAILED)
+    {
+        fprintf(stderr,"binder: cannot map device (%s)\n",
+                strerror(errno));
+        goto fail_map;
+    }
+
+    return bs;
+
+fail_map:
+    close(bs->fd);
+fail_open:
+    free(bs);
+    return NULL;
+}
+
+void binder_close(struct binder_state *bs)
+{
+    munmap(bs->mapped, bs->mapsize);
+    close(bs->fd);
+    free(bs);
+}
+
+int binder_become_context_manager(struct binder_state *bs)
+{
+    return ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0);
+}
+
+int binder_write(struct binder_state *bs, void *data, size_t len)
+{
+    struct binder_write_read bwr;
+    int res;
+
+    bwr.write_size = len;
+    bwr.write_consumed = 0;
+    bwr.write_buffer = (uintptr_t) data;
+    bwr.read_size = 0;
+    bwr.read_consumed = 0;
+    bwr.read_buffer = 0;
+    res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);
+    if (res < 0)
+    {
+        fprintf(stderr,"binder_write: ioctl failed (%s)\n",
+                strerror(errno));
+    }
+    return res;
+}
+
+void binder_send_reply(struct binder_state *bs,
+                       struct binder_io *reply,
+                       binder_uintptr_t buffer_to_free,
+                       int status)
+{
+    struct
+    {
+        uint32_t cmd_free;
+        binder_uintptr_t buffer;
+        uint32_t cmd_reply;
+        struct binder_transaction_data txn;
+    } __attribute__((packed)) data;
+
+    data.cmd_free = BC_FREE_BUFFER;
+    data.buffer = buffer_to_free;
+    data.cmd_reply = BC_REPLY;
+    data.txn.target.ptr = 0;
+    data.txn.cookie = 0;
+    data.txn.code = 0;
+    if (status)
+    {
+        data.txn.flags = TF_STATUS_CODE;
+        data.txn.data_size = sizeof(int);
+        data.txn.offsets_size = 0;
+        data.txn.data.ptr.buffer = (uintptr_t)&status;
+        data.txn.data.ptr.offsets = 0;
+		ALOGE("%s %d status=%d \n",__FUNCTION__,__LINE__,status);
+    }
+    else
+    {
+        data.txn.flags = 0;
+        data.txn.data_size = reply->data - reply->data0;
+        data.txn.offsets_size = ((char*) reply->offs) - ((char*) reply->offs0);
+        data.txn.data.ptr.buffer = (uintptr_t)reply->data0;
+        data.txn.data.ptr.offsets = (uintptr_t)reply->offs0;
+		ALOGE("%s %d data_size=%d\n",__FUNCTION__,__LINE__,data.txn.data_size);
+    }
+    binder_write(bs, &data, sizeof(data));
+}
+
+int binder_parse(struct binder_state *bs, struct binder_io *bio,
+                 uintptr_t ptr, size_t size, binder_handler func)
+{
+    int r = 1;
+    uintptr_t end = ptr + (uintptr_t) size;
+
+    while (ptr < end)
+    {
+        uint32_t cmd = *(uint32_t *) ptr;
+        ptr += sizeof(uint32_t);
+#if TRACE
+        fprintf(stderr,"%s:\n", cmd_name(cmd));
+#endif
+        switch(cmd)
+        {
+        case BR_NOOP:
+            break;
+        case BR_TRANSACTION_COMPLETE:
+            break;
+        case BR_INCREFS:
+        case BR_ACQUIRE:
+        case BR_RELEASE:
+        case BR_DECREFS:
+#if TRACE
+            fprintf(stderr,"  %p, %p\n", (void *)ptr, (void *)(ptr + sizeof(void *)));
+#endif
+            ptr += sizeof(struct binder_ptr_cookie);
+            break;
+        case BR_TRANSACTION:
+        {
+            struct binder_transaction_data *txn = (struct binder_transaction_data *) ptr;
+            if ((end - ptr) < sizeof(*txn))
+            {
+                ALOGE("parse: txn too small!\n");
+                return -1;
+            }
+            binder_dump_txn(txn);
+            if (func)
+            {
+                unsigned rdata[256/4];
+                struct binder_io msg;
+                struct binder_io reply;
+                int res;
+
+                bio_init(&reply, rdata, sizeof(rdata), 4);
+                bio_init_from_txn(&msg, txn);
+				ALOGE("%s %d code=%d \n",__FUNCTION__,__LINE__,txn->code);
+                res = func(bs, txn, &msg, &reply);
+                binder_send_reply(bs, &reply, txn->data.ptr.buffer, res);
+            }
+            ptr += sizeof(*txn);
+            break;
+        }
+        case BR_REPLY:
+        {
+            struct binder_transaction_data *txn = (struct binder_transaction_data *) ptr;
+            if ((end - ptr) < sizeof(*txn))
+            {
+                ALOGE("parse: reply too small!\n");
+                return -1;
+            }
+            binder_dump_txn(txn);
+            if (bio)
+            {
+                bio_init_from_txn(bio, txn);
+                bio = 0;
+            }
+            else
+            {
+                /* todo FREE BUFFER */
+            }
+            ptr += sizeof(*txn);
+            r = 0;
+            break;
+        }
+        case BR_DEAD_BINDER:
+        {
+            struct binder_death *death = (struct binder_death *)(uintptr_t) *(binder_uintptr_t *)ptr;
+            ptr += sizeof(binder_uintptr_t);
+            death->func(bs, death->ptr);
+            break;
+        }
+        case BR_FAILED_REPLY:
+            r = -1;
+            break;
+        case BR_DEAD_REPLY:
+            r = -1;
+            break;
+        default:
+            ALOGE("parse: OOPS %d\n", cmd);
+            return -1;
+        }
+    }
+
+    return r;
+}
+
+void binder_acquire(struct binder_state *bs, uint32_t target)
+{
+    uint32_t cmd[2];
+    cmd[0] = BC_ACQUIRE;
+    cmd[1] = target;
+    binder_write(bs, cmd, sizeof(cmd));
+}
+
+void binder_release(struct binder_state *bs, uint32_t target)
+{
+    uint32_t cmd[2];
+    cmd[0] = BC_RELEASE;
+    cmd[1] = target;
+    binder_write(bs, cmd, sizeof(cmd));
+}
+
+void binder_link_to_death(struct binder_state *bs, uint32_t target, struct binder_death *death)
+{
+    struct
+    {
+        uint32_t cmd;
+        struct binder_handle_cookie payload;
+    } __attribute__((packed)) data;
+
+    data.cmd = BC_REQUEST_DEATH_NOTIFICATION;
+    data.payload.handle = target;
+    data.payload.cookie = (uintptr_t) death;
+    binder_write(bs, &data, sizeof(data));
+}
+
+int binder_call(struct binder_state *bs,
+                struct binder_io *msg, struct binder_io *reply,
+                uint32_t target, uint32_t code)
+{
+    int res;
+    struct binder_write_read bwr;
+    struct
+    {
+        uint32_t cmd;
+        struct binder_transaction_data txn;
+    } __attribute__((packed)) writebuf;
+    unsigned readbuf[32];
+
+    if (msg->flags & BIO_F_OVERFLOW)
+    {
+        fprintf(stderr,"binder: txn buffer overflow\n");
+        goto fail;
+    }
+
+    writebuf.cmd = BC_TRANSACTION;
+    writebuf.txn.target.handle = target;
+    writebuf.txn.code = code;
+    writebuf.txn.flags = 0;
+    writebuf.txn.data_size = msg->data - msg->data0;
+    writebuf.txn.offsets_size = ((char*) msg->offs) - ((char*) msg->offs0);
+    writebuf.txn.data.ptr.buffer = (uintptr_t)msg->data0;
+    writebuf.txn.data.ptr.offsets = (uintptr_t)msg->offs0;
+
+    bwr.write_size = sizeof(writebuf);
+    bwr.write_consumed = 0;
+    bwr.write_buffer = (uintptr_t) &writebuf;
+
+    hexdump(msg->data0, msg->data - msg->data0);
+    for (;;)
+    {
+        bwr.read_size = sizeof(readbuf);
+        bwr.read_consumed = 0;
+        bwr.read_buffer = (uintptr_t) readbuf;
+
+        res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);
+
+        if (res < 0)
+        {
+            fprintf(stderr,"binder: ioctl failed (%s)\n", strerror(errno));
+            goto fail;
+        }
+
+        res = binder_parse(bs, reply, (uintptr_t) readbuf, bwr.read_consumed, 0);
+        if (res == 0) return 0;
+        if (res < 0) goto fail;
+    }
+
+fail:
+    memset(reply, 0, sizeof(*reply));
+    reply->flags |= BIO_F_IOERROR;
+    return -1;
+}
+
+void binder_loop(struct binder_state *bs, binder_handler func)
+{
+    int res;
+    struct binder_write_read bwr;
+    uint32_t readbuf[32];
+
+    bwr.write_size = 0;
+    bwr.write_consumed = 0;
+    bwr.write_buffer = 0;
+
+    readbuf[0] = BC_ENTER_LOOPER;
+    binder_write(bs, readbuf, sizeof(uint32_t));
+
+    for (;;)
+    {
+        bwr.read_size = sizeof(readbuf);
+        bwr.read_consumed = 0;
+        bwr.read_buffer = (uintptr_t) readbuf;
+
+        res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);
+
+        if (res < 0)
+        {
+            ALOGE("binder_loop: ioctl failed (%s)\n", strerror(errno));
+            break;
+        }
+
+        res = binder_parse(bs, 0, (uintptr_t) readbuf, bwr.read_consumed, func);
+        if (res == 0)
+        {
+            ALOGE("binder_loop: unexpected reply?!\n");
+            break;
+        }
+        if (res < 0)
+        {
+            ALOGE("binder_loop: io error %d %s\n", res, strerror(errno));
+            break;
+        }
+    }
+}
+
+void bio_init_from_txn(struct binder_io *bio, struct binder_transaction_data *txn)
+{
+    bio->data = bio->data0 = (char *)(intptr_t)txn->data.ptr.buffer;
+    bio->offs = bio->offs0 = (binder_size_t *)(intptr_t)txn->data.ptr.offsets;
+    bio->data_avail = txn->data_size;
+    bio->offs_avail = txn->offsets_size / sizeof(size_t);
+    bio->flags = BIO_F_SHARED;
+}
+
+void bio_init(struct binder_io *bio, void *data,
+              size_t maxdata, size_t maxoffs)
+{
+    size_t n = maxoffs * sizeof(size_t);
+
+    if (n > maxdata)
+    {
+        bio->flags = BIO_F_OVERFLOW;
+        bio->data_avail = 0;
+        bio->offs_avail = 0;
+        return;
+    }
+
+    bio->data = bio->data0 = (char *) data + n;
+    bio->offs = bio->offs0 = data;
+    bio->data_avail = maxdata - n;
+    bio->offs_avail = maxoffs;
+    bio->flags = 0;
+}
+
+static void *bio_alloc(struct binder_io *bio, size_t size)
+{
+    size = (size + 3) & (~3);
+    if (size > bio->data_avail)
+    {
+        bio->flags |= BIO_F_OVERFLOW;
+        return NULL;
+    }
+    else
+    {
+        void *ptr = bio->data;
+        bio->data += size;
+        bio->data_avail -= size;
+        return ptr;
+    }
+}
+
+void binder_done(struct binder_state *bs,
+                 struct binder_io *msg,
+                 struct binder_io *reply)
+{
+    struct
+    {
+        uint32_t cmd;
+        uintptr_t buffer;
+    } __attribute__((packed)) data;
+
+    if (reply->flags & BIO_F_SHARED)
+    {
+        data.cmd = BC_FREE_BUFFER;
+        data.buffer = (uintptr_t) reply->data0;
+        binder_write(bs, &data, sizeof(data));
+        reply->flags = 0;
+    }
+}
+
+static struct flat_binder_object *bio_alloc_obj(struct binder_io *bio)
+{
+    struct flat_binder_object *obj;
+
+    obj = bio_alloc(bio, sizeof(*obj));
+
+    if (obj && bio->offs_avail)
+    {
+        bio->offs_avail--;
+        *bio->offs++ = ((char*) obj) - ((char*) bio->data0);
+        return obj;
+    }
+
+    bio->flags |= BIO_F_OVERFLOW;
+    return NULL;
+}
+
+void bio_put_uint32(struct binder_io *bio, uint32_t n)
+{
+    uint32_t *ptr = bio_alloc(bio, sizeof(n));
+    if (ptr)
+        *ptr = n;
+}
+
+void bio_put_obj(struct binder_io *bio, void *ptr)
+{
+    struct flat_binder_object *obj;
+
+    obj = bio_alloc_obj(bio);
+    if (!obj)
+        return;
+
+    obj->flags = 0x7f | FLAT_BINDER_FLAG_ACCEPTS_FDS;
+    obj->type = BINDER_TYPE_BINDER;
+    obj->binder = (uintptr_t)ptr;
+    obj->cookie = 0;
+}
+
+void bio_put_ref(struct binder_io *bio, uint32_t handle)
+{
+    struct flat_binder_object *obj;
+
+    if (handle)
+        obj = bio_alloc_obj(bio);
+    else
+        obj = bio_alloc(bio, sizeof(*obj));
+
+    if (!obj)
+        return;
+
+    obj->flags = 0x7f | FLAT_BINDER_FLAG_ACCEPTS_FDS;
+    obj->type = BINDER_TYPE_HANDLE;
+    obj->handle = handle;
+    obj->cookie = 0;
+}
+
+void bio_put_string16(struct binder_io *bio, const uint16_t *str)
+{
+    size_t len;
+    uint16_t *ptr;
+
+    if (!str)
+    {
+        bio_put_uint32(bio, 0xffffffff);
+        return;
+    }
+
+    len = 0;
+    while (str[len]) len++;
+
+    if (len >= (MAX_BIO_SIZE / sizeof(uint16_t)))
+    {
+        bio_put_uint32(bio, 0xffffffff);
+        return;
+    }
+
+    /* Note: The payload will carry 32bit size instead of size_t */
+    bio_put_uint32(bio, (uint32_t) len);
+    len = (len + 1) * sizeof(uint16_t);
+    ptr = bio_alloc(bio, len);
+    if (ptr)
+        memcpy(ptr, str, len);
+}
+
+void bio_put_string16_x(struct binder_io *bio, const char *_str)
+{
+    unsigned char *str = (unsigned char*) _str;
+    size_t len;
+    uint16_t *ptr;
+
+    if (!str)
+    {
+        bio_put_uint32(bio, 0xffffffff);
+        return;
+    }
+
+    len = strlen(_str);
+
+    if (len >= (MAX_BIO_SIZE / sizeof(uint16_t)))
+    {
+        bio_put_uint32(bio, 0xffffffff);
+        return;
+    }
+
+    /* Note: The payload will carry 32bit size instead of size_t */
+    bio_put_uint32(bio, len);
+    ptr = bio_alloc(bio, (len + 1) * sizeof(uint16_t));
+    if (!ptr)
+        return;
+
+    while (*str)
+        *ptr++ = *str++;
+    *ptr++ = 0;
+}
+
+static void *bio_get(struct binder_io *bio, size_t size)
+{
+    size = (size + 3) & (~3);
+
+    if (bio->data_avail < size)
+    {
+        bio->data_avail = 0;
+        bio->flags |= BIO_F_OVERFLOW;
+        return NULL;
+    }
+    else
+    {
+        void *ptr = bio->data;
+        bio->data += size;
+        bio->data_avail -= size;
+        return ptr;
+    }
+}
+
+uint32_t bio_get_uint32(struct binder_io *bio)
+{
+    uint32_t *ptr = bio_get(bio, sizeof(*ptr));
+    return ptr ? *ptr : 0;
+}
+
+uint16_t *bio_get_string16(struct binder_io *bio, size_t *sz)
+{
+    size_t len;
+
+    /* Note: The payload will carry 32bit size instead of size_t */
+    len = (size_t) bio_get_uint32(bio);
+    if (sz)
+        *sz = len;
+    return bio_get(bio, (len + 1) * sizeof(uint16_t));
+}
+
+static struct flat_binder_object *_bio_get_obj(struct binder_io *bio)
+{
+    size_t n;
+    size_t off = bio->data - bio->data0;
+
+    /* TODO: be smarter about this? */
+    for (n = 0; n < bio->offs_avail; n++)
+    {
+        if (bio->offs[n] == off)
+            return bio_get(bio, sizeof(struct flat_binder_object));
+    }
+
+    bio->data_avail = 0;
+    bio->flags |= BIO_F_OVERFLOW;
+    return NULL;
+}
+
+uint32_t bio_get_ref(struct binder_io *bio)
+{
+    struct flat_binder_object *obj;
+
+    obj = _bio_get_obj(bio);
+    if (!obj)
+        return 0;
+
+    if (obj->type == BINDER_TYPE_HANDLE)
+        return obj->handle;
+
+    return 0;
+}
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/servicemanager/binder.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/servicemanager/binder.h
new file mode 100755
index 0000000..f90c32c
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/servicemanager/binder.h
@@ -0,0 +1,96 @@
+/* Copyright 2008 The Android Open Source Project
+ */
+
+#ifndef _BINDER_H_
+#define _BINDER_H_
+
+#include <sys/ioctl.h>
+#include <linux/binder.h>
+
+struct binder_state;
+
+struct binder_io
+{
+    char *data;            /* pointer to read/write from */
+    binder_size_t *offs;   /* array of offsets */
+    size_t data_avail;     /* bytes available in data buffer */
+    size_t offs_avail;     /* entries available in offsets array */
+
+    char *data0;           /* start of data buffer */
+    binder_size_t *offs0;  /* start of offsets buffer */
+    uint32_t flags;
+    uint32_t unused;
+};
+
+struct binder_death
+{
+    void (*func)(struct binder_state *bs, void *ptr);
+    void *ptr;
+};
+
+/* the one magic handle */
+#define BINDER_SERVICE_MANAGER  0U
+
+#define SVC_MGR_NAME "android.os.IServiceManager"
+
+enum
+{
+    /* Must match definitions in IBinder.h and IServiceManager.h */
+    PING_TRANSACTION  = B_PACK_CHARS('_','P','N','G'),
+    SVC_MGR_GET_SERVICE = 1,
+    SVC_MGR_CHECK_SERVICE,
+    SVC_MGR_ADD_SERVICE,
+    SVC_MGR_LIST_SERVICES,
+};
+
+typedef int (*binder_handler)(struct binder_state *bs,
+                              struct binder_transaction_data *txn,
+                              struct binder_io *msg,
+                              struct binder_io *reply);
+
+struct binder_state *binder_open(size_t mapsize);
+void binder_close(struct binder_state *bs);
+
+/* initiate a blocking binder call
+ * - returns zero on success
+ */
+int binder_call(struct binder_state *bs,
+                struct binder_io *msg, struct binder_io *reply,
+                uint32_t target, uint32_t code);
+
+/* release any state associate with the binder_io
+ * - call once any necessary data has been extracted from the
+ *   binder_io after binder_call() returns
+ * - can safely be called even if binder_call() fails
+ */
+void binder_done(struct binder_state *bs,
+                 struct binder_io *msg, struct binder_io *reply);
+
+/* manipulate strong references */
+void binder_acquire(struct binder_state *bs, uint32_t target);
+void binder_release(struct binder_state *bs, uint32_t target);
+
+void binder_link_to_death(struct binder_state *bs, uint32_t target, struct binder_death *death);
+
+void binder_loop(struct binder_state *bs, binder_handler func);
+
+int binder_become_context_manager(struct binder_state *bs);
+
+/* allocate a binder_io, providing a stack-allocated working
+ * buffer, size of the working buffer, and how many object
+ * offset entries to reserve from the buffer
+ */
+void bio_init(struct binder_io *bio, void *data,
+              size_t maxdata, size_t maxobjects);
+
+void bio_put_obj(struct binder_io *bio, void *ptr);
+void bio_put_ref(struct binder_io *bio, uint32_t handle);
+void bio_put_uint32(struct binder_io *bio, uint32_t n);
+void bio_put_string16(struct binder_io *bio, const uint16_t *str);
+void bio_put_string16_x(struct binder_io *bio, const char *_str);
+
+uint32_t bio_get_uint32(struct binder_io *bio);
+uint16_t *bio_get_string16(struct binder_io *bio, size_t *sz);
+uint32_t bio_get_ref(struct binder_io *bio);
+
+#endif
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/servicemanager/service_manager.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/servicemanager/service_manager.c
new file mode 100755
index 0000000..9575cfe
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/servicemanager/service_manager.c
@@ -0,0 +1,451 @@
+/* Copyright 2008 The Android Open Source Project
+ */
+#define ENABLE_SE_LINUX 0
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include <private/android_filesystem_config.h>
+
+#if ENABLE_SE_LINUX
+#include <selinux/android.h>
+#include <selinux/avc.h>
+#endif
+
+#include "binder.h"
+
+typedef char bool;
+#define false (const bool)0
+#define true (const bool)1
+
+
+#if 0
+#define ALOGI(x...) fprintf(stderr, "svcmgr: " x)
+#define ALOGE(x...) fprintf(stderr, "svcmgr: " x)
+#else
+#define LOG_TAG "ServiceManager"
+#include <cutils/log.h>
+#endif
+
+uint32_t svcmgr_handle;
+
+const char *str8(const uint16_t *x, size_t x_len)
+{
+    static char buf[128];
+    size_t max = 127;
+    char *p = buf;
+
+    if (x_len < max)
+    {
+        max = x_len;
+    }
+
+    if (x)
+    {
+        while ((max > 0) && (*x != '\0'))
+        {
+            *p++ = *x++;
+            max--;
+        }
+    }
+    *p++ = 0;
+    return buf;
+}
+
+int str16eq(const uint16_t *a, const char *b)
+{
+    while (*a && *b)
+        if (*a++ != *b++) return 0;
+    if (*a || *b)
+        return 0;
+    return 1;
+}
+
+static int selinux_enabled;
+static char *service_manager_context;
+#if ENABLE_SE_LINUX
+static struct selabel_handle* sehandle;
+#endif
+
+static bool check_mac_perms(pid_t spid, const char *tctx, const char *perm, const char *name)
+{
+#if ENABLE_SE_LINUX
+    char *sctx = NULL;
+    const char *class = "service_manager";
+    bool allowed;
+
+    if (getpidcon(spid, &sctx) < 0)
+    {
+        ALOGE("SELinux: getpidcon(pid=%d) failed to retrieve pid context.\n", spid);
+        return false;
+    }
+
+    int result = selinux_check_access(sctx, tctx, class, perm, (void *) name);
+    allowed = (result == 0);
+
+    freecon(sctx);
+    return allowed;
+#else
+    return true;
+#endif
+}
+
+static bool check_mac_perms_from_getcon(pid_t spid, const char *perm)
+{
+    if (selinux_enabled <= 0)
+    {
+        return true;
+    }
+
+    return check_mac_perms(spid, service_manager_context, perm, NULL);
+}
+
+static bool check_mac_perms_from_lookup(pid_t spid, const char *perm, const char *name)
+{
+#if ENABLE_SE_LINUX
+    bool allowed;
+    char *tctx = NULL;
+
+    if (selinux_enabled <= 0)
+    {
+        return true;
+    }
+
+    if (!sehandle)
+    {
+        ALOGE("SELinux: Failed to find sehandle. Aborting service_manager.\n");
+        abort();
+    }
+
+    if (selabel_lookup(sehandle, &tctx, name, 0) != 0)
+    {
+        ALOGE("SELinux: No match for %s in service_contexts.\n", name);
+        return false;
+    }
+
+    allowed = check_mac_perms(spid, tctx, perm, name);
+    freecon(tctx);
+    return allowed;
+#else
+    return true;
+#endif
+}
+
+static int svc_can_register(const uint16_t *name, size_t name_len, pid_t spid)
+{
+    const char *perm = "add";
+    return check_mac_perms_from_lookup(spid, perm, str8(name, name_len)) ? 1 : 0;
+}
+
+static int svc_can_list(pid_t spid)
+{
+    const char *perm = "list";
+    return check_mac_perms_from_getcon(spid, perm) ? 1 : 0;
+}
+
+static int svc_can_find(const uint16_t *name, size_t name_len, pid_t spid)
+{
+    const char *perm = "find";
+    return check_mac_perms_from_lookup(spid, perm, str8(name, name_len)) ? 1 : 0;
+}
+
+struct svcinfo
+{
+    struct svcinfo *next;
+    uint32_t handle;
+    struct binder_death death;
+    int allow_isolated;
+    size_t len;
+    uint16_t name[0];
+};
+
+struct svcinfo *svclist = NULL;
+
+struct svcinfo *find_svc(const uint16_t *s16, size_t len)
+{
+    struct svcinfo *si;
+
+    for (si = svclist; si; si = si->next)
+    {
+        if ((len == si->len) &&
+                !memcmp(s16, si->name, len * sizeof(uint16_t)))
+        {
+            return si;
+        }
+    }
+    return NULL;
+}
+
+void svcinfo_death(struct binder_state *bs, void *ptr)
+{
+    struct svcinfo *si = (struct svcinfo* ) ptr;
+
+    ALOGI("service '%s' died\n", str8(si->name, si->len));
+    if (si->handle)
+    {
+        binder_release(bs, si->handle);
+        si->handle = 0;
+    }
+}
+
+uint16_t svcmgr_id[] =
+{
+    'a','n','d','r','o','i','d','.','o','s','.',
+    'I','S','e','r','v','i','c','e','M','a','n','a','g','e','r'
+};
+
+
+uint32_t do_find_service(struct binder_state *bs, const uint16_t *s, size_t len, uid_t uid, pid_t spid)
+{
+    struct svcinfo *si;
+
+    if (!svc_can_find(s, len, spid))
+    {
+        ALOGE("find_service('%s') uid=%d - PERMISSION DENIED\n",
+              str8(s, len), uid);
+        return 0;
+    }
+    si = find_svc(s, len);
+    //ALOGI("check_service('%s') handle = %x\n", str8(s, len), si ? si->handle : 0);
+    if (si && si->handle)
+    {
+        if (!si->allow_isolated)
+        {
+            // If this service doesn't allow access from isolated processes,
+            // then check the uid to see if it is isolated.
+            uid_t appid = uid % AID_USER;
+            if (appid >= AID_ISOLATED_START && appid <= AID_ISOLATED_END)
+            {
+                return 0;
+            }
+        }
+        return si->handle;
+    }
+    else
+    {
+        return 0;
+    }
+}
+
+int do_add_service(struct binder_state *bs,
+                   const uint16_t *s, size_t len,
+                   uint32_t handle, uid_t uid, int allow_isolated,
+                   pid_t spid)
+{
+    struct svcinfo *si;
+
+    //ALOGI("add_service('%s',%x,%s) uid=%d\n", str8(s, len), handle,
+    //        allow_isolated ? "allow_isolated" : "!allow_isolated", uid);
+
+    if (!handle || (len == 0) || (len > 127))
+        return -1;
+
+    if (!svc_can_register(s, len, spid))
+    {
+        ALOGE("add_service('%s',%x) uid=%d - PERMISSION DENIED\n",
+              str8(s, len), handle, uid);
+        return -1;
+    }
+
+    si = find_svc(s, len);
+    if (si)
+    {
+        if (si->handle)
+        {
+            ALOGE("add_service('%s',%x) uid=%d - ALREADY REGISTERED, OVERRIDE\n",
+                  str8(s, len), handle, uid);
+            svcinfo_death(bs, si);
+        }
+        si->handle = handle;
+    }
+    else
+    {
+        si = malloc(sizeof(*si) + (len + 1) * sizeof(uint16_t));
+        if (!si)
+        {
+            ALOGE("add_service('%s',%x) uid=%d - OUT OF MEMORY\n",
+                  str8(s, len), handle, uid);
+            return -1;
+        }
+        si->handle = handle;
+        si->len = len;
+        memcpy(si->name, s, (len + 1) * sizeof(uint16_t));
+        si->name[len] = '\0';
+        si->death.func = (void*) svcinfo_death;
+        si->death.ptr = si;
+        si->allow_isolated = allow_isolated;
+        si->next = svclist;
+        svclist = si;
+    }
+
+    binder_acquire(bs, handle);
+    binder_link_to_death(bs, handle, &si->death);
+    return 0;
+}
+
+int svcmgr_handler(struct binder_state *bs,
+                   struct binder_transaction_data *txn,
+                   struct binder_io *msg,
+                   struct binder_io *reply)
+{
+    struct svcinfo *si;
+    uint16_t *s;
+    size_t len;
+    uint32_t handle;
+    uint32_t strict_policy;
+    int allow_isolated;
+
+    //ALOGI("target=%x code=%d pid=%d uid=%d\n",
+    //  txn->target.handle, txn->code, txn->sender_pid, txn->sender_euid);
+
+    if (txn->target.handle != svcmgr_handle)
+        return -1;
+
+    if (txn->code == PING_TRANSACTION)
+        return 0;
+
+    // Equivalent to Parcel::enforceInterface(), reading the RPC
+    // header with the strict mode policy mask and the interface name.
+    // Note that we ignore the strict_policy and don't propagate it
+    // further (since we do no outbound RPCs anyway).
+    strict_policy = bio_get_uint32(msg);
+    s = bio_get_string16(msg, &len);
+    if (s == NULL)
+    {
+        return -1;
+    }
+
+    if ((len != (sizeof(svcmgr_id) / 2)) ||
+            memcmp(svcmgr_id, s, sizeof(svcmgr_id)))
+    {
+        fprintf(stderr,"invalid id %s\n", str8(s, len));
+        return -1;
+    }
+
+#if ENABLE_SE_LINUX
+    if (sehandle && selinux_status_updated() > 0)
+    {
+        struct selabel_handle *tmp_sehandle = selinux_android_service_context_handle();
+        if (tmp_sehandle)
+        {
+            selabel_close(sehandle);
+            sehandle = tmp_sehandle;
+        }
+    }
+#endif
+
+    switch(txn->code)
+    {
+    case SVC_MGR_GET_SERVICE:
+    case SVC_MGR_CHECK_SERVICE:
+        s = bio_get_string16(msg, &len);
+        if (s == NULL)
+        {
+            return -1;
+        }
+        handle = do_find_service(bs, s, len, txn->sender_euid, txn->sender_pid);
+        if (!handle)
+            break;
+        bio_put_ref(reply, handle);
+        return 0;
+
+    case SVC_MGR_ADD_SERVICE:
+        s = bio_get_string16(msg, &len);
+        if (s == NULL)
+        {
+            return -1;
+        }
+        handle = bio_get_ref(msg);
+        allow_isolated = bio_get_uint32(msg) ? 1 : 0;
+        if (do_add_service(bs, s, len, handle, txn->sender_euid,
+                           allow_isolated, txn->sender_pid))
+            return -1;
+        break;
+
+    case SVC_MGR_LIST_SERVICES:
+    {
+        uint32_t n = bio_get_uint32(msg);
+
+        if (!svc_can_list(txn->sender_pid))
+        {
+            ALOGE("list_service() uid=%d - PERMISSION DENIED\n",
+                  txn->sender_euid);
+            return -1;
+        }
+        si = svclist;
+        while ((n-- > 0) && si)
+            si = si->next;
+        if (si)
+        {
+            bio_put_string16(reply, si->name);
+            return 0;
+        }
+        return -1;
+    }
+    default:
+        ALOGE("unknown code %d\n", txn->code);
+        return -1;
+    }
+
+    bio_put_uint32(reply, 0);
+    return 0;
+}
+
+#if ENABLE_SE_LINUX
+static int audit_callback(void *data, security_class_t cls, char *buf, size_t len)
+{
+    snprintf(buf, len, "service=%s", !data ? "NULL" : (char *)data);
+    return 0;
+}
+#endif
+
+int main(int argc, char **argv)
+{
+    struct binder_state *bs;
+
+    bs = binder_open(128*1024);
+    if (!bs)
+    {
+        ALOGE("failed to open binder driver\n");
+        return -1;
+    }
+
+    if (binder_become_context_manager(bs))
+    {
+        ALOGE("cannot become context manager (%s)\n", strerror(errno));
+        return -1;
+    }
+
+#if ENABLE_SE_LINUX
+    selinux_enabled = is_selinux_enabled();
+    sehandle = selinux_android_service_context_handle();
+
+    if (selinux_enabled > 0)
+    {
+        if (sehandle == NULL)
+        {
+            ALOGE("SELinux: Failed to acquire sehandle. Aborting.\n");
+            abort();
+        }
+
+        if (getcon(&service_manager_context) != 0)
+        {
+            ALOGE("SELinux: Failed to acquire service_manager context. Aborting.\n");
+            abort();
+        }
+    }
+
+    union selinux_callback cb;
+    cb.func_audit = audit_callback;
+    selinux_set_callback(SELINUX_CB_AUDIT, cb);
+    cb.func_log = selinux_log_callback;
+    selinux_set_callback(SELINUX_CB_LOG, cb);
+#endif
+
+    svcmgr_handle = BINDER_SERVICE_MANAGER;
+    binder_loop(bs, svcmgr_handler);
+
+    return 0;
+}
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/Makefile
new file mode 100755
index 0000000..6ba83b8
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/Makefile
@@ -0,0 +1,31 @@
+include $(COMMON_MK)
+
+EXEC = socket_demo
+OBJS = socket_main.o socket_tok.o linklist.o
+
+CFLAGS += -I.
+CFLAGS += -I./inc
+CFLAGS += -I$(APP_DIR)/include
+
+
+CFLAGS += -g
+CFLAGS += -g -Werror=implicit-function-declaration
+
+LDLIBS += -lpthread
+
+all: $(EXEC)
+$(EXEC)all: $(EXEC)
+
+$(EXEC): $(OBJS)
+	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) -Wl,--end-group
+	@cp $@ $@.elf
+
+romfs:
+	$(ROMFSINST) -e  /sbin/$(EXEC)
+	
+clean:
+	-rm -f $(EXEC) *.elf *.gdb *.o
+
+	$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS$(LDLIBS_$@))
+
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/linklist.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/linklist.c
new file mode 100755
index 0000000..ff055a7
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/linklist.c
@@ -0,0 +1,354 @@
+#include "linklist.h"

+

+

+linklist create_linklist(void)

+{

+	linklist L;

+	if((L=(linklist)malloc(sizeof(listnode))) == NULL)

+	{

+		printf("malloc no memmory!\n");

+		return NULL;

+	}

+	L->data.fd = 0;

+	bzero(L->data.ipv4_addr,sizeof(L->data.ipv4_addr));

+	L->data.port = 0;

+

+	L->next = NULL;

+	return L;

+}

+linklist create_n_linklist(void)

+{

+	linklist L,H,r;

+	datatype x;

+	if((L=(linklist)malloc(sizeof(listnode))) == NULL)

+	{

+		printf("malloc no memmory!\n");

+		return NULL;

+	}

+	L->data.fd = 0;

+	bzero(L->data.ipv4_addr,sizeof(L->data.ipv4_addr));

+	L->data.port = 0;

+	L->next = NULL;

+	r = L;

+	while(1)

+	{

+		printf("Please input a NUM_NL80211_WOWLAN_TRIGber(-1 exit :");

+		while(scanf("%d",&x.fd) != 1)

+		{

+			printf("Please INPUT_PROP_CNTut a number(-1 exit :");

+			getchar();

+		}

+

+		if(x.fd == -1)break;

+

+		if((H=(linklist)malloc(sizeof(listnode))) == NULL)

+		{

+			printf("malloc nexto memmory!\n");

+			return L;

+		}

+		H->data = x;

+		H->next = NULL;

+		r->next = H;

+		r=H;

+	}

+	return L;

+

+}

+int delete_pos_linklist(linklist L,int pos)

+{

+	linklist r,p;

+	int i=-1;

+	if(pos < 0 ||pos >=get_length_linklist(L))

+	{

+		printf("input pos is invalid!\n");

+		return -1;

+	}

+	r = L;

+	while(i < pos-1)

+	{

+		i++;

+		r = r->next;

+	}

+	if(r == NULL || r->next==NULL)

+	{

+		printf("argc is iavalid!\n");

+		return -1;

+	}

+	else

+	{

+		p = r->next;

+		r->next = p->next;

+		p->next = NULL;

+		free(p);

+		return 0;

+	}

+}

+int delete_locate_linklist(linklist L,datatype x)

+{

+	linklist r,p;

+	if(L->next == NULL)

+	{

+		printf("list is NULL!\n");

+		return -1;

+	}

+	r = L;

+	while(r->next->data.fd != x.fd)

+	{

+		if(r->next == NULL)

+		{

+			printf("value is not in list!\n");

+			return -1;

+		}

+		r = r->next;

+	}

+	p = r->next;

+	r->next = p->next;

+	p->next = NULL;

+	free(p);

+

+	return 0;

+}

+

+void clear_linklist(linklist L)

+{

+	while(get_length_linklist(L))

+	{

+		delete_pos_linklist(L,get_length_linklist(L)-1);

+	}

+	free(L);

+	L->next = NULL;

+	L = NULL;

+}

+int get_length_linklist(linklist L)

+{

+	int i=0;

+	linklist r;

+	r = L;

+	while(r->next)

+	{

+		r = r->next;

+		i++;

+	}

+	return i++;

+}

+linklist get_list_pos_linklist(linklist L,int pos)

+{

+	int i=0;

+	linklist r;

+	if(L->next == NULL)

+	{

+		printf("list is NULL!\n");

+		return NULL;

+	}

+	if(pos<0 || pos>=get_length_linklist(L))

+	{

+		printf("input is invalid!\n");

+		return NULL;

+	}

+	r = L->next;

+	while(i<pos)

+	{

+		r = r->next;

+		i++;

+	}

+	return r;

+}

+linklist get_list_locate_linklist(linklist L,datatype x)

+{

+	linklist r;

+	if(L->next == NULL)

+	{

+		printf("list is NULL!\n");

+		return NULL;

+	}

+	r = L->next;

+	while(r->data.fd != x.fd)

+	{

+		if(r->next == NULL)

+		{

+			printf("value is not in list!\n");

+			return NULL;

+		}

+		r = r->next;

+	}

+	return r;

+}

+

+int insert_head_linklist(linklist L,datatype x)

+{

+	linklist H;

+	if((H=(linklist)malloc(sizeof(listnode))) == NULL)

+	{

+		printf("malloc no memmory\n");

+		return -1;

+	}

+	H->data = x;

+	H->next = L->next;

+	L->next = H;

+	return 0;

+}

+int insert_n_head_linklist(linklist L)

+{

+	datatype x;

+

+	while(1)

+	{

+		printf("Please input a number(-1 exit:");

+		while(scanf("%d",&x.fd) != 1)

+		{

+			printf("Please input a number:(-1 exit");

+			getchar();

+		}

+		if(x.fd == -1)break;

+		insert_head_linklist(L,x);

+	}

+	return 0;

+}

+int insert_end_linklist(linklist L,datatype x)

+{

+	linklist r,H;

+	if((H = (linklist)malloc(sizeof(listnode))) == NULL)

+	{

+		printf("malloc no memmory!");

+		return -1;

+	}

+	r = L;

+	while(r->next)

+	{

+		r = r->next;

+	}

+	H->next = NULL;

+	H->data = x;

+	r->next = H;

+	return 0;

+}

+int insert_n_end_linklist(linklist L)

+{

+	datatype x;

+

+	while(1)

+	{

+		printf("Please input a number(-1 exit:");

+		while(scanf("%d",&x.fd) != 1)

+		{

+			printf("Please input a number:(-1 exit");

+			getchar();

+		}

+		if(x.fd == -1)break;

+		insert_end_linklist(L,x);

+	}

+	return 0;

+

+}

+int insert_pos_linklist(linklist L,datatype x,int pos)

+{

+	linklist K,r;

+	if(pos == 0)

+	{

+		r = L;

+	}

+	else

+	{

+		r = get_list_pos_linklist(L,pos-1);

+	}

+	if(r == NULL)

+	{

+		printf("argc is invalidateid!\n");

+		return -1;

+	}

+	else

+	{

+		if((K = (linklist)malloc(sizeof(listnode))) == NULL)

+		{

+			printf("malloc no memmory!");

+			return -1;

+										}

+		K->data = x;

+		K->next = r->next;

+		r->next = K;

+	}

+	return 0;

+}

+int insert_order_linklist(linklist L,datatype x)

+{

+	linklist r,H;

+	if((H = (linklist)malloc(sizeof(listnode))) == NULL)

+	{

+		printf("malloc nexto memmory!\n");

+		return -1;

+	}

+	H->data = x;

+

+	r = L;

+	while(r->next && r->next->data.fd < x.fd)

+	{

+		r = r->next;

+	}

+	H->next = r->next;

+	r->next = H;

+	return 0;

+}

+void reverse_linklist(linklist L)

+{

+	linklist r,p;

+

+	if(L->next == NULL)

+	{

+		printf("list is NULL!\n");

+		return ;

+	}

+

+	r = L->next;

+	L->next = NULL;

+	while(r)

+	{

+		p = r;

+		r = r->next;

+

+		p->next = L->next;

+		L->next = p;

+	}

+	return ;

+}

+void sort_linklist(linklist L)

+{

+	linklist r,p,q;

+	if(L == NULL)

+	{

+		printf("list is NULL!\n");

+		return ;

+	}

+	r = L->next;

+	L->next = NULL;

+	while(r)

+	{

+		p = r;

+		r = r->next;

+

+		q = L;

+		while(q->next && q->next->data.fd < p->data.fd)

+		{

+			q = q->next;

+		}

+		p->next = q->next;

+		q->next = p;

+	}

+}

+

+void show_linklist(linklist L)

+{

+	printf("list is:\n");

+	if(L->next == NULL)

+	{

+		printf("\tlist is NULL!list\n");

+		return ;

+	}

+	while(L->next)

+	{

+		printf("\t%d %s %d\t",L->next->data.fd,L->next->data.ipv4_addr,L->next->data.port);

+		L = L->next;

+		puts("");

+	}

+	//puts("");

+	return ;

+}

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/linklist.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/linklist.h
new file mode 100755
index 0000000..9bfb505
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/linklist.h
@@ -0,0 +1,42 @@
+#ifndef __SINGLE_LINKLIST_H__

+#define __SINGLE_LINKLIST_H__

+

+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <strings.h>

+

+typedef struct{

+	int fd;

+	char ipv4_addr[16];

+	int port;

+}datatype;

+

+typedef struct node{

+	datatype data;

+	struct node *next;

+}listnode,*linklist;

+

+linklist create_linklist(void);

+linklist create_n_linklist(void);

+int delete_pos_linklist(linklist L,int pos);

+int delete_locate_linklist(linklist L,datatype x);

+void clear_linklist(linklist L);

+

+int get_length_linklist(linklist L);

+linklist get_list_pos_linklist(linklist L,int pos);

+linklist get_list_locate_linklist(linklist L,datatype x);

+

+int insert_head_linklist(linklist L,datatype x);

+int insert_n_head_linklist(linklist L);

+int insert_end_linklist(linklist L,datatype x);

+int insert_n_end_linklist(linklist L);

+int insert_pos_linklist(linklist L,datatype x,int pos);

+int insert_order_linklist(linklist L,datatype x);

+

+void reverse_linklist(linklist);

+void sort_linklist(linklist L);

+

+void show_linklist(linklist L);

+

+#endif

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/socket_main.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/socket_main.c
new file mode 100755
index 0000000..5a59209
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/socket_main.c
@@ -0,0 +1,1293 @@
+#include <ctype.h>

+#include <errno.h>

+#include <unistd.h>

+#include <getopt.h>

+#include <limits.h>

+#include <netdb.h>

+#include <stdbool.h>

+#include <stdint.h>

+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <time.h>

+#include <syslog.h>

+#include <pthread.h>

+#include <sys/socket.h>

+#include <sys/types.h>

+#include <sys/un.h>

+#include <sys/ioctl.h>

+#include <fcntl.h>

+#include "linklist.h"

+#include "socket_tok.h"

+

+/*command max len 64*/

+#define SOCKET_CMD_MAX_LEN 		1024

+#define BUF_SIZE 1024

+

+#define EXIT_CMD_STOP	"stop\n"

+#define EXIT_CMD_Q	"q\n"

+#define EXIT_CMD_EXIT	"exit\n"

+

+#define SOCKET_CREATE	"sock_create"

+#define SOCKET_CREATECLIENT	"sock_createclient"

+#define SOCKET_CREATESERVER	"sock_createserver"

+#define SOCKET_BIND	    "sock_bind"

+#define SOCKET_LISTEN	"sock_listen"

+#define SOCKET_ACCEPT	"sock_accept"

+#define SOCKET_CONN	    "sock_conn"

+#define SOCKET_SEND		"sock_send"

+#define SOCKET_SENDTO	"sock_sendto"

+#define SOCKET_WRITE	"sock_write"

+#define SOCKET_RECV     "sock_recv"

+#define SOCKET_RECVFROM "sock_recvfrom"

+#define SOCKET_READ     "sock_read"

+#define SOCKET_CLOSE    "sock_close"

+#define SOCKET_LOCALTEST    "sock_localtest"

+

+#define sock_param_len 4096

+typedef unsigned short      UINT16;

+typedef unsigned long int   UINT32;

+

+static int g_sockfd = -1;

+

+static char* sms_convert_cardinfo_state(int type, int value);

+

+static void printUsage(const char *Opt)

+{

+	printf("Usage: %s\n", Opt);

+	printf("sock_create:type        create a new socket(eg. sock_create:1)\n");

+	printf("sock_createclient:type,addr       create a new client socket(eg. sock_createclient:1,/var/sockclient)\n");

+	printf("sock_createserver:type,addr,backlog       create a new server socket(eg. sock_createserver:1,/var/sockserver,30)\n");

+	printf("sock_bind:fd,addr        socket bind(eg. sock_bind:fd,/var/sockclient)\n");

+	printf("sock_listen:fd,backlog   socket listen(eg. sock_listen:fd,30)\n");

+	printf("sock_accept:fd           socket accept(eg. sock_accept:fd)\n");

+	printf("sock_conn:fd,srvaddr        conn server socket(eg. sock_conn:fd, /var/sockserver)\n");

+	printf("sock_send:fd,message         send socket message(eg. sock_send:fd,ipc test)\n");

+	printf("sock_sendto:fd,srvaddr,message   sendto socket message(eg. sock_sendto:fd,/var/sockserver,ipc test)\n");

+	printf("sock_write:fd,message         write socket message(eg. sock_write:fd,ipc test)\n");

+	printf("sock_recv:fd        recv socket message(eg. sock_recv: fd)\n");

+	printf("sock_recvfrom:fd        recvfrom socket message(eg. sock_recvfrom: fd)\n");

+	printf("sock_read:fd        read socket message(eg. sock_read: fd)\n");

+	printf("sock_close:fd       close socket message(eg. sock_close: fd)\n");

+	printf("sock_localtest:     test local socket operation\n");	

+	printf("\n");

+}

+

+static int parseOpts(int argc, char *argv[]) 

+{

+	int rc = 0;

+    int c;

+    while ((c = getopt(argc, argv, "?n:a:")) != -1) {

+        switch (c) {

+        case 'a':

+            break;

+		case 'n':

+			break;

+        case '?':

+        default:

+            printUsage(argv[0]);

+            return -1;

+        }

+    }

+

+    return rc;

+}

+

+/**

+enum sock_type {

+	SOCK_STREAM	= 1,

+	SOCK_DGRAM	= 2,

+	SOCK_RAW	= 3,

+	SOCK_RDM	= 4,

+	SOCK_SEQPACKET	= 5,

+	SOCK_DCCP	= 6,

+	SOCK_PACKET	= 10,

+};

+**/

+static int socket_create(char *data, int data_len)

+{

+	int sockfd = -1;

+	int type = 0;

+	printf("socket_create test \n");	

+	

+	if (at_tok_start(&data) < 0) {

+		printf("socket_create:at_tok_start error\n");

+	}

+	

+	if(at_tok_nextint(&data, &type) < 0) {

+		printf("socket_create:at_tok_nextstr error\n");

+	}

+	printf("socket_create:type=%d\n", type);

+	

+	sockfd = socket(AF_UNIX, type, 0);

+	if(sockfd < 0){

+		printf("socket_create error: %s(errno: %d) \n", strerror(errno), errno);

+	}else{

+		printf("socket_create sucess:sockfd=%d\n", sockfd);

+	}

+	

+	g_sockfd = sockfd;

+	return 0;

+}

+

+static int socket_test_local()

+{

+	int clientfd = -1;

+	int serverfd = -1;

+	int numRecv;

+	char data[BUF_SIZE] = {0};

+	struct sockaddr_un my_addr = {0};

+	int newfd;

+	struct sockaddr_un addr_un;

+	socklen_t cun_addr_len = sizeof(addr_un);

+	if((clientfd  = socket(AF_UNIX, 1, 0))<0){

+		printf("socket_test_local: create client socket error \n");

+		return -1;

+	}

+

+	if((serverfd  = socket(AF_UNIX, 1, 0))<0){

+		printf("socket_test_local: create server socket error \n");

+		return -1;

+	}

+

+	memset(&my_addr, 0, sizeof(struct sockaddr_un));

+	my_addr.sun_family = AF_UNIX;

+	strncpy(my_addr.sun_path, "/var/socktest", sizeof(my_addr.sun_path)-1);

+	

+	//·þÎñ¶Ë°ó¶¨µØÖ·

+	if(bind(serverfd, (struct sockaddr*)&my_addr, sizeof(my_addr)) == 0){

+		printf("server socket °ó¶¨³É¹¦ \n");

+	}

+	else{

+		printf("server socket °ó¶¨Ê§°Ü \n");		

+	}

+

+	if(listen(serverfd, 30) == 0){

+		printf("socket¼àÌý³É¹¦ \n");

+	}else{

+		printf("socket¼àÌýʧ°Ü \n");		

+	}

+

+	while(1){

+

+		if(connect(clientfd, (struct sockaddr*)&my_addr, sizeof(my_addr)) < 0){

+			printf("connect error: %s(errno: %d) \n", strerror(errno), errno);

+			return -1;

+		}

+	

+		if((newfd = accept(serverfd,(struct sockaddr *)&addr_un,&cun_addr_len)) < 0){

+			printf("connect failed: newfd=%d\n", newfd);

+		}else{

+

+			if(send(clientfd, "send data to server test two", 28, 0) < 0){

+				printf("send data to server test two failed: %s(errno: %d) \n", strerror(errno), errno);

+					

+			}else{

+				printf("send data to server test two sucess \n");

+			}

+

+			memset(data, 0, sizeof(data));

+			if(numRecv = recv(serverfd, data, sizeof(data)-1, 0) == -1){

+				printf("recv data test two failed \n");		

+			}else{

+				printf("recv data test two sucess \n");

+			}

+

+			close(clientfd);

+			close(newfd);

+			close(serverfd);

+			return;

+		}

+	}

+#if 0

+	//δÁ¬½Ó£¬¿Í»§¶ËÖ±½Ó¸ø·þÎñ¶Ë·¢ËÍÊý¾Ý

+	if(sendto(clientfd, "send data to server test one", 28, 0, &my_addr, sizeof(my_addr)) < 0){

+		printf("send data to server test one failed \n");		

+	}

+	

+	//¶ÁÈ¡Êý¾Ý

+	if(read(serverfd, data, BUF_SIZE-1) < 0){

+		printf("recv data test one failed \n");

+	}else{

+		printf("recv data test one sucess \n");

+	}

+

+	//Á¬½Ó·þÎñ¶Ë

+	if(connect(clientfd, (struct sockaddr*)&my_addr, sizeof(my_addr)) < 0){

+		printf("connect error: %s(errno: %d) \n", strerror(errno), errno);

+		return -1;

+	}

+

+	if(send(clientfd, "send data to server test two", 28, 0) < 0){

+		printf("send data to server test two failed: %s(errno: %d) \n", strerror(errno), errno);

+			

+	}else{

+		printf("send data to server test two sucess \n");

+	}	

+

+	memset(data, 0, sizeof(data));

+	if(numRecv = recv(serverfd, data, sizeof(data)-1, 0) == -1){

+		printf("recv data test two failed \n");		

+	}else{

+		printf("recv data test two sucess \n");

+	}

+

+	//²âÊÔ·þÎñ¶Ë¸ø¿Í»§¶Ë·¢ÏûÏ¢ÊÇ·ñÄÜͨ

+	if(send(serverfd, "send data to server test three", 30, 0) < 0){

+		printf("send data to server test three failed: %s(errno: %d) \n", strerror(errno), errno);			

+	}else{

+		printf("send data to server test three sucess \n");

+	}	

+	fcntl(clientfd, F_SETFL, O_NONBLOCK);

+	memset(data, 0, sizeof(data));

+	if(numRecv = recv(clientfd, data, sizeof(data)-1, 0) == -1){

+		printf("recv data test three failed \n");		

+	}else{

+		printf("recv data test three sucess \n");

+	}

+	

+#if 0

+	//¸ø¿Í»§¶Ë°ó¶¨µØÖ·

+	memset(&my_addr, 0, sizeof(struct sockaddr_un));

+	my_addr.sun_family = AF_UNIX;

+	strncpy(my_addr.sun_path, "/var/sockclient", sizeof(my_addr.sun_path)-1);

+

+	//¿Í»§¶Ë°ó¶¨µØÖ·

+	if(bind(clientfd, (struct sockaddr*)&my_addr, sizeof(my_addr)) == 0){

+		printf("client socket °ó¶¨³É¹¦ \n");

+	}

+	else{

+		printf("client socket °ó¶¨Ê§°Ü \n");		

+	}

+

+	//δÁ¬½Ó£¬·þÎñ¶ËÖ±½Ó¸ø¿Í»§¶Ë·¢ËÍÊý¾Ý

+	if(sendto(serverfd, "send data to server test four", 29, 0, &my_addr, sizeof(my_addr)) < 0){

+		printf("send data to server test four failed \n");		

+	}else{

+		printf("send data to server test four sucess \n");

+	}

+	

+	//¶ÁÈ¡Êý¾Ý

+	if(read(clientfd, data, BUF_SIZE-1) < 0){

+		printf("recv data test four failed \n");

+	}else{

+		printf("recv data test four sucess \n");

+	}

+#endif

+	close(clientfd);

+	close(serverfd);

+#endif	

+}

+

+void socket_test_dgram_data(int fd, char* paddr, char* pdata){

+	struct sockaddr_un other_addr = {0};

+	ssize_t numRead;

+	ssize_t numRecv;

+	char buf[2048] = {0};

+	int sockfd = -1;

+	sockfd = fd;

+	int ret;

+	memset(&other_addr, 0, sizeof(struct sockaddr_un));

+	other_addr.sun_family = AF_UNIX;

+	strncpy(other_addr.sun_path, paddr, sizeof(other_addr.sun_path)-1);

+	

+	//Èç¹ûµÚÒ»¸ö×Ö·ûÊÇz»òZ£¬Ôò´´½¨ÄäÃûsocket

+	if(other_addr.sun_path[0] == 'z' || other_addr.sun_path[0]=='Z'){

+		printf("socket_test_dgram_data: anonymous socket\n");

+		other_addr.sun_path[0] = '\0';

+	}

+	//δÁ¬½Ó£¬¿Í»§¶ËÖ±½Ó¸ø·þÎñ¶Ë·¢ËÍÊý¾Ý

+	if(sendto(sockfd, "send dgram data to server test one", 34, 0, &other_addr, sizeof(other_addr)) < 0){

+		printf("sendto dgram data to server test one failed \n");		

+	}else{

+		printf("sendto dgram data to server test one sucess \n");

+	}

+#if 0

+	memset(buf, 0, sizeof(buf));

+	if(recvfrom(sockfd, buf, sizeof(buf)-1, 0, (struct sockaddr*)&other_addr, sizeof(other_addr)) <= 0){

+		printf("recvfrom: dgram data to server test one failed \n");

+	}else{

+		printf("recvfrom: dgram data to server test one sucess \n");

+	}

+#endif

+	//Á¬½Ó·þÎñ¶Ë

+	if(ret = connect(sockfd, (struct sockaddr*)&other_addr, sizeof(other_addr)) < 0){

+		printf("socket_create_client: connect error:ret=%d, %s(errno: %d) \n", ret, strerror(errno), errno);

+		

+		return -1;

+	}else{

+		printf("³É¹¦Óë·þÎñÆ÷½¨Á¢Á¬½Ó: sockfd=%d\n", sockfd);

+	}

+		

+	

+	printf("send msg to server: \n");

+	memset(buf, 0, sizeof(buf));

+

+	if(sendto(sockfd, "send dgram data to server test two", 34, 0, &other_addr, sizeof(other_addr)) < 0){

+		printf("sendto dgram data to server test two failed \n");		

+	}else{

+		printf("sendto dgram data to server test two sucess \n");

+	}

+	

+#if 0

+	if(recvfrom(sockfd, buf, sizeof(buf)-1, 0, (struct sockaddr*)&other_addr, sizeof(other_addr)) <= 0){

+		printf("recvfrom: dgram data to server two failed \n");

+	}else{

+		printf("recvfrom: dgram data to server two sucess \n");

+	}

+#endif

+

+	memset(buf, 0, sizeof(buf));

+	// send¡¢recv²âÊÔ

+	if(send(sockfd, "send dgram data to server test three", 36, 0) < 0){

+		printf("send dgram data to server test three failed \n");		

+	}else{

+		printf("send dgram data to server test three sucess \n");

+	}

+

+#if 0

+	if(recv(sockfd, buf, sizeof(buf)-1, 0) <= 0){

+		printf("recvfrom: dgram data to server three failed \n");

+	}else{

+		printf("recvfrom: dgram data to server three sucess \n");

+	}

+#endif

+	memset(buf, 0, sizeof(buf));

+	// write¡¢read²âÊÔ

+	if(write(sockfd, "send dgram data to server test four", 35) < 0){

+		printf("write dgram data to server test four failed \n");		

+	}else{

+		printf("write dgram data to server test four sucess \n");

+	}

+	

+#if 0

+	if(read(sockfd, buf, sizeof(buf)-1) <= 0){

+		printf("recvfrom: dgram data to server four failed \n");

+	}else{

+		printf("recvfrom: dgram data to server four sucess \n");

+	}

+#endif

+	

+	if(pdata != NULL){

+		if(send(sockfd, pdata, strlen(pdata), 0) < 0){

+			printf("socket_create_client: send dgram msg error: %s(errno: %d) \n", strerror(errno), errno);

+			return -1;	

+		}

+		printf("send sucess: %s \n", pdata);

+	}else{

+		if(send(sockfd, "send dgram msg to server test", 29, 0) < 0){

+			printf("socket_create_client: send dgram msg error: %s(errno: %d) \n", strerror(errno), errno);

+			return -1;	

+		}

+		printf("send msg to server test \n");

+	}

+	

+#if 0

+	if(numRecv = recv(sockfd, buf, sizeof(buf), 0) == -1){

+		printf("socket_create_client: recv error \n");

+		return -1;

+	}

+	printf("socket_create_client Receieved: %s \n", buf);

+#endif	

+	if(close(sockfd) == 0){

+		printf("clsoe sockfd:%d sucess \n", sockfd);

+	}else{

+		printf("clsoe sockfd:%d failed \n", sockfd);

+	}

+}

+

+void socket_test_stream_data(int fd, char* paddr, char* pdata){

+	struct sockaddr_un other_addr = {0};

+	ssize_t numRead;

+	ssize_t numRecv;

+	char buf[2048] = {0};

+	int sockfd = -1;

+	sockfd = fd;

+	memset(&other_addr, 0, sizeof(struct sockaddr_un));

+	other_addr.sun_family = AF_UNIX;

+	strncpy(other_addr.sun_path, paddr, sizeof(other_addr.sun_path)-1);	

+	

+	//Èç¹ûµÚÒ»¸ö×Ö·ûÊÇz»òZ£¬Ôò´´½¨ÄäÃûsocket

+	if(other_addr.sun_path[0] == 'z' || other_addr.sun_path[0]=='Z'){

+		printf("socket_test_stream_data: anonymous socket\n");

+		other_addr.sun_path[0] = '\0';

+	}

+	//Á¬½Ó·þÎñ¶Ë

+	if(connect(sockfd, (struct sockaddr*)&other_addr, sizeof(other_addr)) < 0){

+		printf("socket_create_client: connect error: %s(errno: %d) \n", strerror(errno), errno);

+		close(fd);

+		return -1;

+	}else{

+		printf("³É¹¦Óë·þÎñÆ÷½¨Á¢Á¬½Ó: sockfd=%d\n", sockfd);

+	}		

+	

+	printf("send msg to server: \n");	

+

+	memset(buf, 0, sizeof(buf));

+	// send¡¢recv²âÊÔ

+	if(send(sockfd, "send stream data to server test one", 35, 0) < 0){

+		printf("send stream data to server test one failed \n");		

+	}else{

+		printf("send stream data to server test one sucess \n");

+	}

+

+	if(recv(sockfd, buf, sizeof(buf)-1, 0) <= 0){

+		printf("recv: stream data to server one failed \n");

+	}else{

+		printf("recv: stream data to server one sucess \n");

+	}

+

+	memset(buf, 0, sizeof(buf));

+	// write¡¢read²âÊÔ

+	if(write(sockfd, "send stream data to server test two", 35) < 0){

+		printf("write stream data to server test two failed \n");		

+	}else{

+		printf("write stream data to server test two sucess \n");

+	}

+

+	if(read(sockfd, buf, sizeof(buf)-1) <= 0){

+		printf("read: stream data to server two failed \n");

+	}else{

+		printf("read: stream data to server two sucess \n");

+	}

+

+	memset(buf, 0, sizeof(buf));	

+	if(pdata != NULL){

+		if(send(sockfd, pdata, strlen(pdata), 0) < 0){

+			printf("socket_create_client: send stream msg error: %s(errno: %d) \n", strerror(errno), errno);

+			close(fd);

+			return -1;	

+		}

+		printf("send sucess: %s \n", pdata);

+	}else{

+		if(send(sockfd, "send stream msg to server test", 30, 0) < 0){

+			printf("socket_create_client: send stream msg error: %s(errno: %d) \n", strerror(errno), errno);

+			close(fd);

+			return -1;	

+		}

+		printf("send stream msg to server test \n");

+	}

+

+	if(numRecv = recv(sockfd, buf, sizeof(buf), 0) == -1){

+		printf("socket_create_client: recv error \n");

+		close(fd);

+		return -1;

+	}

+	printf("recv sucess: %s \n", buf);

+	if(close(sockfd) == 0){

+		printf("clsoe sockfd:%d sucess \n", sockfd);

+	}else{

+		printf("clsoe sockfd:%d failed \n", sockfd);

+	}

+}

+static int socket_create_client(char *data, int data_len)

+{

+	int sockfd = -1;	

+	int type = 0;

+	char* paddr = NULL;

+	char* pdata = NULL;

+	struct sockaddr_un other_addr = {0};

+	int backlog = 0;

+	ssize_t numRead;

+	ssize_t numRecv;

+	char buf[2048] = {0};

+	int i=0;

+	printf("socket_create_client test \n");	

+	

+	if (at_tok_start(&data) < 0) {

+		printf("socket_create_client:at_tok_start error\n");

+	}

+	

+	if(at_tok_nextint(&data, &type) < 0) {

+		printf("socket_create_client:at_tok_nextstr error\n");

+	}

+	printf("socket_create_client:type=%d\n", type);

+

+	if(at_tok_nextstr(&data, &paddr) < 0) {

+		printf("socket_create_client:at_tok_nextstr error\n");

+	}

+

+	printf("socket_create_client: addr=%s \n", paddr);

+

+	if(at_tok_nextstr(&data, &pdata) < 0) {

+		printf("socket_create_client: no test data\n");

+	}

+	

+	if(strlen(paddr) > sizeof(other_addr.sun_path)-1)

+	{

+		printf("socket_create_client:server socket path too logn: %s\n", paddr);

+		return -1;

+	}	

+	

+    if(type == 1){

+		while(true){

+			if((sockfd = socket(AF_UNIX, type, 0))<0){

+				printf("socket_create_client: create socket error \n");

+				return -1;

+			}		

+			printf("socket_create_client: socket_create:sockfd=%d(%d´Î)\n", sockfd, i);

+			socket_test_stream_data(sockfd, paddr, pdata);

+			sleep(1);

+			i++;

+		}

+	}else if(type ==2){

+		while(true){

+			if((sockfd = socket(AF_UNIX, type, 0))<0){

+				printf("socket_create_client: create socket error \n");

+				return -1;

+			}

+				

+			printf("socket_create_client: socket_create:sockfd=%d(%d´Î)\n", sockfd, i);

+			socket_test_dgram_data(sockfd, paddr, pdata);

+			sleep(1);

+			i++;

+		}

+	}	

+	

+	return 0;

+}

+

+static void do_recv(int fd)

+{

+	int ret = -1;

+	char buf[BUF_SIZE];

+	char resp_buf[BUF_SIZE+10];

+	printf("do_recv loop enter, fd=%d \n", fd);

+	while(1)

+	{

+		memset(buf, 0, BUF_SIZE);

+		do

+		{

+			ret = read(fd,buf,BUF_SIZE-1);

+		}while(ret < 0 && errno == EINTR);//×èÈû¶Áд

+		

+		if(ret < 0)

+		{

+			printf("fd %d read error, ret=%d!\n", fd, ret);

+			continue;

+		}

+		if(ret == 0)//¶Ô·½ÒѹرÕ

+		{

+			printf("client is close!\n");

+			//close(fd);

+			continue;

+		}

+		

+		if(ret > 0)

+		{

+			printf("read sucess, fd:%d, recv data=%s \n", fd, buf);

+			

+			//ret = write(fd, buf, ret);

+			

+			//printf("write back data=%s, len=%d \n",buf, ret);

+		}

+	}

+}

+

+static void do_select(int fd)

+{

+	linklist fdlist,sun_list;

+	fdlist = create_linklist();

+	datatype sun_data = {0};

+	sun_data.fd = fd;

+	int maxfd = fd;	

+	//struct timeval tout = {5,0};

+

+	insert_end_linklist(fdlist,sun_data);//½«lsten()´¦ÀíºóµÄfd¼ÓÈëÁбí

+	//show_linklist(fdlist);

+	

+	fd_set fdset;

+	int newfd = -1;

+	int ret = -1;

+	char buf[BUF_SIZE];

+	char resp_buf[BUF_SIZE+10];

+	struct sockaddr_un addr_un;

+	socklen_t cun_addr_len = sizeof(addr_un);

+	/* ÓÃselect()º¯ÊýʵÏÖI/O¶à·¸´ÓÃ*/

+	while(1)

+	{

+		int i;

+		FD_ZERO(&fdset);

+		if(get_length_linklist(fdlist) >= 1)//½«ÁбíÖеÄfd¼ÓÈë¶Á¼¯ºÏ½øÐд¦Àí

+		{			

+			for(i=0;i<get_length_linklist(fdlist);i++)

+			{

+				sun_list = get_list_pos_linklist(fdlist,i);

+				sun_data = sun_list->data;

+				FD_SET(sun_data.fd,&fdset);

+				maxfd = sun_data.fd > maxfd ? sun_data.fd : maxfd;

+				printf("µÚ %d ¸ö£¨fd:%d£©£¨ip:%s£©£¨port:%d£©\n",i,sun_data.fd,sun_data.ipv4_addr,sun_data.port);

+			}

+			//show_linklist(fdlist);

+		}

+		else

+		{

+			continue ;

+		}

+		//switch(select(maxfd+1,&fdset,NULL,NULL,&tout))

+		switch(ret=select(maxfd+1,&fdset,NULL,NULL,NULL))

+		{			

+			case 0:

+			{

+				printf("time out!\n");

+				goto _error1;

+			}

+			case -1:

+			{

+				printf("select error\n");

+				goto _error1;

+			}

+			default:

+			{

+				printf("select ret=%d \n", ret);

+				if(FD_ISSET(fd,&fdset))//Óпͻ§¶Ë·¢ËÍÁËÁ¬½ÓÇëÇó

+				{					

+					bzero(&addr_un, sizeof(addr_un));

+					//if((newfd = accept(fd,NULL,0)) < 0)

+					if((newfd = accept(fd,(struct sockaddr *)&addr_un,&cun_addr_len)) < 0)						

+					{

+						printf("connect failed: newfd=%d\n", newfd);

+						

+						goto _error1;

+					}

+					/* ½«·ÖÅä³É¹¦µÄÌ×½Ó×ÖnewfdÉèÖóɷÇ×èÈûģʽ*/

+					int b_on = 1;

+   					ioctl(newfd, FIONBIO, &b_on);//½«·ÖÅä³É¹¦µÄÌ×½Ó×ÖnewfdÉèÖÃΪ·Ç×èÈû·½Ê½

+					sun_data.fd = newfd;

+					printf("get a new client->(ip:%s)(port:%d)(fd:%d)\n",sun_data.ipv4_addr,sun_data.port,sun_data.fd);

+					

+					insert_end_linklist(fdlist,sun_data);//½«½¨Á¢¿Í»§¶ËÁ¬½ÓµÄfd¼ÓÈëÁбí

+					//show_linklist(fdlist);

+				}

+				else//ÓÐÁ¬½ÓºÃµÄ¿Í»§¶Ë·¢ËÍÁËÊý¾Ý

+				{				

+					for(i=0;i<get_length_linklist(fdlist);i++)//½«Á´±íÖеÄfd¶¼´¦ÀíÒ»±é

+					{

+						

+						sun_list = get_list_pos_linklist(fdlist,i);

+						sun_data = sun_list->data;

+						

+						//printf("readung fd is ->(µÚ %d ¸ö)(fd:%d)(ip:%s)(port:%d)\n",i,sun_data.fd,sun_data.ipv4_addr,sun_data.port);

+						if(sun_data.fd == fd)//²»Êǽ¨Á¢Á¬½Óºó·ÖÅäµÄnewfd

+							continue ;

+												

+						bzero(buf,BUF_SIZE);

+						do

+						{

+							ret = read(sun_data.fd,buf,BUF_SIZE-1);

+						}while(ret < 0 && errno == EINTR);//×èÈû¶Áд

+						

+						if(ret < 0)

+						{

+							printf("fd %d read error, ret=%d, errno=%d!\n", sun_data.fd, ret, errno);

+							continue;

+						}

+						if(ret == 0)//¶Ô·½ÒѹرÕ

+						{

+							printf("client is close, errno=%d!\n", errno);

+							close(sun_data.fd);

+							delete_locate_linklist(fdlist,sun_data);

+							continue;

+						}

+						

+						printf("read sucess, fd(:%d) receive data: %s \n",sun_data.fd,buf);

+						ret = write(sun_data.fd, buf, ret);	

+						printf("write back data=%s, len=%d \n",buf, ret);

+					}

+				}			

+			}

+		}

+	}

+

+	close(newfd);

+_error1:

+	printf("exit cause by _error1!\n");

+	close(fd);

+	clear_linklist(fdlist);

+}

+

+//"/tmp/us_xfr"  "zmysocket"

+static int socket_create_server(char *data, int data_len)

+{

+	int sockfd = -1;

+	int cfd = -1;

+	int type = 0;

+	char* paddr = NULL;	

+	struct sockaddr_un my_addr = {0};

+	int backlog = 0;

+	ssize_t numRead;

+	char buf[2048] = {0};

+	printf("socket_create_server test \n");	

+	

+	if (at_tok_start(&data) < 0) {

+		printf("socket_create_server:at_tok_start error\n");

+	}

+	

+	if(at_tok_nextint(&data, &type) < 0) {

+		printf("socket_create_server:at_tok_nextstr error\n");

+	}

+	printf("socket_create_server:type=%d\n", type);

+

+	if(at_tok_nextstr(&data, &paddr) < 0) {

+		printf("socket_create_server:at_tok_nextstr error\n");

+	}

+

+	printf("socket_create_server: addr=%s \n", paddr);

+

+	if(at_tok_nextint(&data, &backlog) < 0) {

+		printf("socket_create_server:at_tok_nextstr error\n");

+	}

+	

+	if((sockfd = socket(AF_UNIX, type, 0)) < 0)

+	{

+		printf("socket_create_server failed, type=%d \n", type);

+		return -1;

+	}

+	g_sockfd = sockfd;

+	printf("socket_create_server:type=%d, sockfd=%d\n", type, sockfd);

+

+	/*ÔÊÐí°ó¶¨µØÖ·¿ìËÙÖØÓà */ 

+	int b_reuse = 1;

+	setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&b_reuse,sizeof(int)); 

+	

+	if(strlen(paddr) > sizeof(my_addr.sun_path)-1)

+	{

+		printf("socket_bind:server socket path too long: %s\n", paddr);

+		goto error;

+	}

+

+	if(access(paddr,F_OK))

+	{

+		unlink(paddr);//ɾ³ý¸ÃÎļþ	

+	}

+	

+	memset(&my_addr, 0, sizeof(struct sockaddr_un));

+	my_addr.sun_family = AF_UNIX;

+	strncpy(my_addr.sun_path, paddr, sizeof(my_addr.sun_path)-1);

+	//Èç¹ûµÚÒ»¸ö×Ö·ûÊÇz»òZ£¬Ôò´´½¨ÄäÃûsocket

+	if(my_addr.sun_path[0] == 'z' || my_addr.sun_path[0]=='Z'){

+		printf("socket_create_server: anonymous socket\n");

+		my_addr.sun_path[0] = '\0';

+	}

+	if(bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr)) == 0){

+		printf("socket°ó¶¨³É¹¦ \n");

+	}

+	else{

+		printf("socket°ó¶¨Ê§°Ü errno=%d, strerror=%s\n", errno, strerror(errno));	

+		goto error;

+	}

+

+	if(type == 1){

+		if(listen(sockfd, backlog) == 0){

+			printf("socket¼àÌý³É¹¦ \n");

+		}else{

+			printf("socket¼àÌýʧ°Ü \n");

+			goto error;

+		}

+		do_select(sockfd);

+	}else{

+		do_recv(sockfd);

+	}

+

+	

+	

+#if 0

+

+	for(;;){

+		cfd = accept(sockfd, NULL, NULL);

+		if(cfd  == -1){

+			printf("socket_create_server: accept failed");

+			continue;

+		}

+

+		printf("socket_create_server cfd=%d \n", cfd);

+		while((numRead = recv(cfd, buf, sizeof(buf), 0)) > 0){

+			printf("socket_create_server:read data=%s \n", buf);

+		}

+

+		if(numRead == -1){

+			printf("socket_create_server: read data failed \n");

+			

+		}

+

+		if(!fork()){

+			if(send(cfd, "you are connected! \n", 19, 0) == -1)

+			{

+				printf("socket_create_server: send error \n");

+				close(cfd);

+				exit(0);

+			}

+		}

+		if(close(cfd) == -1){

+			printf("socket_create_server: cfd close failed\n");

+		}

+		

+	}

+#endif

+

+error:

+	close(sockfd);

+	return 0;

+	

+}

+

+static int socket_bind(char *data, int data_len)

+{

+	int sockfd = -1;

+	char* paddr = NULL;

+	struct sockaddr_un my_addr = {0};

+	

+	if (at_tok_start(&data) < 0) {

+		printf("socket_bind:at_tok_start error\n");

+	}

+	

+	if(at_tok_nextint(&data, &sockfd) < 0) {

+		printf("socket_bind:at_tok_nextstr error\n");

+	}

+

+	if(at_tok_nextstr(&data, &paddr) < 0) {

+		printf("socket_bind:at_tok_nextstr error\n");

+	}

+

+	printf("socket_bind: sockfd=%d, addr=%s \n", sockfd, paddr);

+	

+	if(strlen(paddr) > sizeof(my_addr.sun_path)-1)

+	{

+		printf("socket_bind:server socket path too logn: %s\n", paddr);

+		return -1;

+	}

+

+	memset(&my_addr, 0, sizeof(struct sockaddr_un));

+	my_addr.sun_family = AF_UNIX;

+	strncpy(my_addr.sun_path, paddr, sizeof(my_addr.sun_path)-1);

+	

+	//Èç¹ûµÚÒ»¸ö×Ö·ûÊÇz»òZ£¬Ôò´´½¨ÄäÃûsocket

+	if(my_addr.sun_path[0] == 'z' || my_addr.sun_path[0]=='Z'){

+		printf("socket_bind: anonymous socket\n");

+		my_addr.sun_path[0] = '\0';

+	}

+	

+	if(bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr)) == 0){

+		printf("socket°ó¶¨³É¹¦ \n");

+	}

+	else{

+		printf("socket°ó¶¨Ê§°Ü errno=%d, strerror=%s\n", errno, strerror(errno));		

+	}

+	return 0;

+}

+

+static int socket_listen(char *data, int data_len)

+{

+	int sockfd = -1;

+	int backlog = 0;

+	struct sockaddr_un my_addr = {0};

+	

+	if (at_tok_start(&data) < 0) {

+		printf("socket_listen:at_tok_start error\n");

+	}

+	

+	if(at_tok_nextint(&data, &sockfd) < 0) {

+		printf("socket_listen:at_tok_nextint error\n");

+	}

+

+	if(at_tok_nextint(&data, &backlog) < 0) {

+		printf("socket_listen:at_tok_nextint error\n");

+	}

+

+	printf("socket_bind: sockfd=%d, backlog=%d \n", sockfd, backlog);

+

+	if(listen(sockfd, backlog) == 0){

+		printf("socket¼àÌý³É¹¦ \n");

+	}else{

+		printf("socket¼àÌýʧ°Ü \n");

+	}

+	return 0;

+}

+

+static int socket_accept(char *data, int data_len)

+{

+	int sockfd = -1;

+	int newfd = -1;

+	int ret = -1;

+	struct sockaddr_un addr_un;

+	socklen_t cun_addr_len = sizeof(addr_un);

+	

+	if (at_tok_start(&data) < 0) {

+		printf("socket_accept:at_tok_start error\n");

+	}

+	

+	if(at_tok_nextint(&data, &sockfd) < 0) {

+		printf("socket_accept:at_tok_nextint error\n");

+	}

+	

+	printf("socket_accept sockfd=%d \n", sockfd);

+	

+	if((newfd = accept(sockfd,(struct sockaddr *)&addr_un,&cun_addr_len)) < 0)						

+	{

+		printf("socket_accept failed: newfd=%d\n", newfd);		

+	}else{

+		printf("socket_accept sucess: newfd=%d\n", newfd);

+	}

+	return 0;

+}

+

+

+static int socket_connect(char *data, int data_len)

+{

+	int sockfd = -1;

+	char* paddr = NULL;

+	struct sockaddr_un my_addr = {0};

+	

+	if (at_tok_start(&data) < 0) {

+		printf("socket_connect:at_tok_start error\n");

+	}

+	

+	if(at_tok_nextint(&data, &sockfd) < 0) {

+		printf("socket_connect:at_tok_nextstr error\n");

+	}

+

+	if(at_tok_nextstr(&data, &paddr) < 0) {

+		printf("socket_connect:at_tok_nextstr error\n");

+	}

+

+	printf("socket_connect: sockfd=%d, addr=%s \n", sockfd, paddr);

+	

+	if(strlen(paddr) > sizeof(my_addr.sun_path)-1)

+	{

+		printf("socket_connect:server socket path too logn: %s\n", paddr);

+		return -1;

+	}

+

+	memset(&my_addr, 0, sizeof(struct sockaddr_un));

+	my_addr.sun_family = AF_UNIX;

+	strncpy(my_addr.sun_path, paddr, sizeof(my_addr.sun_path)-1);

+	printf("socket_connect: my_addr.sun_path=%s \n", my_addr.sun_path);

+

+	//Èç¹ûµÚÒ»¸ö×Ö·ûÊÇz»òZ£¬Ôò´´½¨ÄäÃûsocket

+	if(my_addr.sun_path[0] == 'z' || my_addr.sun_path[0]=='Z'){

+		printf("socket_connect: anonymous socket\n");

+		my_addr.sun_path[0] = '\0';

+	}

+	

+	if(connect(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr)) == 0){

+		printf("³É¹¦Óë·þÎñÆ÷½¨Á¢Á¬½Ó \n");

+	}

+	else{

+		printf("Á¬½Óʧ°Ü\n");

+	}

+

+	return 0;

+}

+

+static int socket_send(char *data, int data_len)

+{	

+	int sockfd = -1;

+	char* pdata = NULL;	

+	int len = 0;

+	if (at_tok_start(&data) < 0) {

+		printf("socket_send:at_tok_start error\n");

+	}

+	

+	if(at_tok_nextint(&data, &sockfd) < 0) {

+		printf("socket_send:at_tok_nextstr error\n");

+	}

+

+	if(at_tok_nextstr(&data, &pdata) < 0) {

+		printf("socket_send:at_tok_nextstr error\n");

+	}

+

+	printf("socket_send: sockfd=%d, pdata=%s \n", sockfd, pdata);

+	

+	len = send(sockfd, pdata, strlen(pdata), 0);

+	

+	if(len >= 0){

+		printf("socket_send sucess, len=%d \n", len);

+	}else{

+		printf("socket_send failed, error: %s(errno: %d) \n", strerror(errno), errno);

+	}

+	

+	return 0;

+}

+

+static int socket_sendto(char *data, int data_len)

+{	

+	int sockfd = -1;

+	char* pdata = NULL;

+	char* paddr = NULL;	

+	struct sockaddr_un other_addr = {0};

+	int len = 0;

+	if (at_tok_start(&data) < 0) {

+		printf("socket_sendto:at_tok_start error\n");

+	}

+	

+	if(at_tok_nextint(&data, &sockfd) < 0) {

+		printf("socket_sendto:at_tok_nextstr error\n");

+	}

+

+	if(at_tok_nextstr(&data, &paddr) < 0) {

+		printf("socket_sendto:at_tok_nextstr error\n");

+	}

+	

+	if(at_tok_nextstr(&data, &pdata) < 0) {

+		printf("socket_sendto:at_tok_nextstr error\n");

+	}

+

+	printf("socket_sendto: sockfd=%d, addr=%s \n", sockfd, paddr);

+	

+	if(strlen(paddr) > sizeof(other_addr.sun_path)-1)

+	{

+		printf("socket_sendto:server socket path too logn: %s\n", paddr);

+		return -1;

+	}

+

+	memset(&other_addr, 0, sizeof(struct sockaddr_un));

+	other_addr.sun_family = AF_UNIX;

+	strncpy(other_addr.sun_path, paddr, sizeof(other_addr.sun_path)-1);

+	printf("socket_sendto: other_addr.sun_path=%s \n", other_addr.sun_path);

+

+	//Èç¹ûµÚÒ»¸ö×Ö·ûÊÇz»òZ£¬Ôò´´½¨ÄäÃûsocket

+	if(other_addr.sun_path[0] == 'z' || other_addr.sun_path[0]=='Z'){

+		printf("socket_sendto: anonymous socket\n");

+		other_addr.sun_path[0] = '\0';

+	}		

+	

+	len = sendto(sockfd, pdata, strlen(pdata), 0, &other_addr, sizeof(other_addr));

+

+	if(len >= 0){

+		printf("socket_sendto sucess, len=%d \n", len);

+	}else{

+		printf("socket_sendto failed, error: %s(errno: %d) \n", strerror(errno), errno);

+	}

+	return 0;

+}

+

+static int socket_write(char *data, int data_len)

+{	

+	int sockfd = -1;

+	char* pdata = NULL;	

+	int len = 0;

+	if (at_tok_start(&data) < 0) {

+		printf("socket_write:at_tok_start error\n");

+	}

+	

+	if(at_tok_nextint(&data, &sockfd) < 0) {

+		printf("socket_write:at_tok_nextstr error\n");

+	}

+

+	if(at_tok_nextstr(&data, &pdata) < 0) {

+		printf("socket_write:at_tok_nextstr error\n");

+	}

+

+	printf("socket_write: sockfd=%d, pdata=%s \n", sockfd, pdata);

+		

+	len = write(sockfd, pdata, strlen(pdata));

+	if(len >= 0){

+		printf("socket_write sucess, len=%d \n", len);

+	}else{

+		printf("socket_write failed, error: %s(errno: %d) \n", strerror(errno), errno);

+	}

+	

+	return 0;

+}

+

+static int socket_recv(char *data, int data_len)

+{

+	int sockfd = -1;

+	char pdata[2048] = {0};	

+	int len = 0;

+	if (at_tok_start(&data) < 0) {

+		printf("socket_recv:at_tok_start error\n");

+	}

+	

+	if(at_tok_nextint(&data, &sockfd) < 0) {

+		printf("socket_recv:at_tok_nextstr error\n");

+	}

+

+	printf("socket_recv: sockfd=%d \n", sockfd);

+

+	len = recv(sockfd, pdata, sizeof(pdata), 0);

+	if(len >= 0){

+		printf("recv sucess, len=%d \n", len);

+	}else{

+		printf("recv failed, error: %s(errno: %d) \n", strerror(errno), errno);

+	}

+	return 0;

+}

+

+static int socket_recvfrom(char *data, int data_len)

+{

+	int sockfd = -1;

+	char pdata[2048] = {0};

+	struct sockaddr_un other_addr = {0};

+	int len = 0;

+	if (at_tok_start(&data) < 0) {

+		printf("socket_recvfrom:at_tok_start error\n");

+	}

+	

+	if(at_tok_nextint(&data, &sockfd) < 0) {

+		printf("socket_recvfrom:at_tok_nextstr error\n");

+	}

+

+	printf("socket_recvfrom: sockfd=%d \n", sockfd);

+

+	len = recvfrom(sockfd, pdata, sizeof(pdata)-1, 0, (struct sockaddr*)&other_addr, sizeof(other_addr));

+	if(len >= 0){

+		printf("recvfrom sucess:  other_addr.sun_path=%s\n", other_addr.sun_path);

+	}else{

+		printf("recvfrom failed, error: %s(errno: %d) \n", strerror(errno), errno);

+	}

+	return 0;

+}

+

+static int socket_read(char *data, int data_len)

+{

+	int sockfd = -1;

+	char pdata[2048] = {0};	

+	int len = 0;

+	if (at_tok_start(&data) < 0) {

+		printf("socket_read:at_tok_start error\n");

+	}

+	

+	if(at_tok_nextint(&data, &sockfd) < 0) {

+		printf("socket_read:at_tok_nextstr error\n");

+	}

+

+	printf("socket_read: sockfd=%d \n", sockfd);

+

+	len = read(sockfd, pdata, sizeof(pdata));

+	if(len >= 0){

+		printf("read sucess, len=%d \n", len);

+	}else{

+		printf("read failed, error: %s(errno: %d) \n", strerror(errno), errno);

+	}

+	return 0;

+}

+

+static int socket_close(char *data, int data_len)

+{

+	int sockfd = -1;

+	

+	if (at_tok_start(&data) < 0) {

+		printf("socket_close:at_tok_start error\n");

+	}

+	

+	if(at_tok_nextint(&data, &sockfd) < 0) {

+		printf("socket_close:at_tok_nextint error\n");

+	}

+

+	printf("socket_close: sockfd=%d \n", sockfd);

+	

+	if(close(sockfd) == 0){

+		printf("¹Ø±Õsocket³É¹¦ \n");

+	}else{

+		printf("¹Ø±Õsocketʧ°Ü \n");

+	}

+	return 0;

+}

+

+

+static void socket_cmd_proc(char *cmdstr)

+{	

+	char *data = cmdstr;

+	int data_len = strlen(data) - 1;/* -strlen("\r")*/	

+	char request = data[0];

+

+	cmdstr[data_len] = '\0';

+	printf("socket_cmd_proc data=%s \n", data);

+	if(0 == strncmp(data, SOCKET_CREATECLIENT, strlen(SOCKET_CREATECLIENT))) {

+		printf("Request create client socket.\n");

+		socket_create_client(data, data_len);

+	}else if(0 == strncmp(data, SOCKET_CREATESERVER, strlen(SOCKET_CREATESERVER))) {

+		printf("Request create server socket.\n");

+		socket_create_server(data, data_len);

+	}else if(0 == strncmp(data, SOCKET_CREATE, strlen(SOCKET_CREATE))) {

+		printf("Request create socket.\n");

+		socket_create(data, data_len);

+	}else if(0 == strncmp(data, SOCKET_BIND, strlen(SOCKET_BIND))) {

+		printf("Request bind socket.\n");

+		socket_bind(data, data_len);

+	}else if(0 == strncmp(data, SOCKET_LISTEN, strlen(SOCKET_LISTEN))) {

+		printf("Request listen socket.\n");

+		socket_listen(data, data_len);

+	}else if(0 == strncmp(data, SOCKET_ACCEPT, strlen(SOCKET_ACCEPT))) {

+		printf("Request accept socket.\n");

+		socket_accept(data, data_len);

+	}else if(0 == strncmp(data, SOCKET_CONN, strlen(SOCKET_CONN))) {

+		printf("Request connect socket.\n");

+		socket_connect(data, data_len);

+	}else if(0 == strncmp(data, SOCKET_SENDTO, strlen(SOCKET_SENDTO))) {

+		printf("Request sendto message.\n");

+		socket_sendto(data, data_len);

+	}else if(0 == strncmp(data, SOCKET_SEND, strlen(SOCKET_SEND))) {

+		printf("Request send message.\n");

+		socket_send(data, data_len);

+	}else if(0 == strncmp(data, SOCKET_WRITE, strlen(SOCKET_WRITE))) {

+		printf("Request write message.\n");

+		socket_write(data, data_len);

+	}else if(0 == strncmp(data, SOCKET_RECVFROM, strlen(SOCKET_RECVFROM))) {

+		printf("Request recvfrom message.\n");

+		socket_recvfrom(data, data_len);

+	}else if(0 == strncmp(data, SOCKET_RECV, strlen(SOCKET_RECV))) {

+		printf("Request recv message.\n");

+		socket_recv(data, data_len);

+	}else if(0 == strncmp(data, SOCKET_READ, strlen(SOCKET_READ))) {

+		printf("Request read message.\n");

+		socket_read(data, data_len);

+	}else if(0 == strncmp(data, SOCKET_CLOSE, strlen(SOCKET_CLOSE))) {

+		printf("Request close socket.\n");

+		socket_close(data, data_len);

+	}else if(0 == strncmp(data, SOCKET_LOCALTEST, strlen(SOCKET_LOCALTEST))){

+		printf("Request local test.\n");

+		socket_test_local();

+	}else {

+		printf("Request unknow.\n");

+		printUsage(cmdstr);

+	}

+}

+int main(int argc, char *argv[])

+{

+	char cmdstr[SOCKET_CMD_MAX_LEN] = {0};		

+#if 1	

+	printf("socket_ipc:Demo go.\n");

+	if(parseOpts(argc,argv) == -1) {

+		printf("socket_ipc:Arg error.\n");

+		return -1;

+	}

+	

+	while(1) {

+		memset(cmdstr,0,SOCKET_CMD_MAX_LEN);

+		

+		printf("Please input an socket command:\n");

+	

+		if(NULL != fgets(cmdstr,SOCKET_CMD_MAX_LEN - 1,stdin)) {			

+			if(0 == strcmp(EXIT_CMD_STOP,cmdstr) || 

+				0 == strcmp(EXIT_CMD_Q,cmdstr) || 

+				0 == strcmp(EXIT_CMD_EXIT,cmdstr)) {

+				if(g_sockfd != -1){

+					if(close(g_sockfd) == 0){

+						printf("close g_sockfd=%d sucess \n", g_sockfd);

+					}else{

+						printf("close g_sockfd=%d failed \n", g_sockfd);

+					}

+				}

+				break;

+			}

+			

+			printf("cmdstr:%d %s\n",strlen(cmdstr),cmdstr);

+			if(1 >= strlen(cmdstr)) {

+				continue;

+			}

+			

+			socket_cmd_proc(cmdstr);			

+		}

+	}

+#else

+	snprintf(cmdstr, SOCKET_CMD_MAX_LEN, "sock_createclient:%d,%s,%s", 2, "/var/socketap", "send data to ap test");

+                                                                           

+	socket_create_client(cmdstr, strlen(cmdstr));	

+#endif

+	

+	printf("socket_ipc:Demo end.\n");

+	return 0;

+}

+

diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/socket_tok.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/socket_tok.c
new file mode 100755
index 0000000..3ac2a4a
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/socket_tok.c
@@ -0,0 +1,190 @@
+/* 
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+#include "socket_tok.h"
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+/**
+ * Starts tokenizing an AT response string
+ * returns -1 if this is not a valid response string, 0 on success.
+ * updates *p_cur with current position
+ */
+int at_tok_start(char **p_cur)
+{
+    if (*p_cur == NULL) {
+        return -1;
+    }
+
+    // skip prefix
+    // consume "^[^:]:"
+
+    *p_cur = strchr(*p_cur, ':');
+
+    if (*p_cur == NULL) {
+        return -1;
+    }
+
+    (*p_cur)++;
+
+    return 0;
+}
+
+static void skipWhiteSpace(char **p_cur)
+{
+    if (*p_cur == NULL) return;
+
+    while (**p_cur != '\0' && isspace(**p_cur)) {
+        (*p_cur)++;
+    }
+}
+
+static void skipNextComma(char **p_cur)
+{
+    if (*p_cur == NULL) return;
+
+    while (**p_cur != '\0' && **p_cur != ',') {
+        (*p_cur)++;
+    }
+
+    if (**p_cur == ',') {
+        (*p_cur)++;
+    }
+}
+
+static char * nextTok(char **p_cur)
+{
+    char *ret = NULL;
+
+    skipWhiteSpace(p_cur);
+
+    if (*p_cur == NULL) {
+        ret = NULL;
+    } else if (**p_cur == '"') {
+        (*p_cur)++;
+        ret = strsep(p_cur, "\"");
+        skipNextComma(p_cur);
+    } else {
+        ret = strsep(p_cur, ",");
+    }
+
+    return ret;
+}
+
+
+/**
+ * Parses the next integer in the AT response line and places it in *p_out
+ * returns 0 on success and -1 on fail
+ * updates *p_cur
+ * "base" is the same as the base param in strtol
+ */
+
+static int at_tok_nextint_base(char **p_cur, int *p_out, int base, int  uns)
+{
+    char *ret;
+
+    if (*p_cur == NULL) {
+        return -1;
+    }
+
+    ret = nextTok(p_cur);
+
+    if (ret == NULL) {
+        return -1;
+    } else {
+        long l;
+        char *end;
+
+        if (uns)
+            l = strtoul(ret, &end, base);
+        else
+            l = strtol(ret, &end, base);
+
+        *p_out = (int)l;
+
+        if (end == ret) {
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
+/**
+ * Parses the next base 10 integer in the AT response line
+ * and places it in *p_out
+ * returns 0 on success and -1 on fail
+ * updates *p_cur
+ */
+int at_tok_nextint(char **p_cur, int *p_out)
+{
+    return at_tok_nextint_base(p_cur, p_out, 10, 0);
+}
+
+/**
+ * Parses the next base 16 integer in the AT response line
+ * and places it in *p_out
+ * returns 0 on success and -1 on fail
+ * updates *p_cur
+ */
+int at_tok_nexthexint(char **p_cur, int *p_out)
+{
+    return at_tok_nextint_base(p_cur, p_out, 16, 1);
+}
+
+int at_tok_nextbool(char **p_cur, char *p_out)
+{
+    int ret;
+    int result;
+
+    ret = at_tok_nextint(p_cur, &result);
+
+    if (ret < 0) {
+        return -1;
+    }
+
+    // booleans should be 0 or 1
+    if (!(result == 0 || result == 1)) {
+        return -1;
+    }
+
+    if (p_out != NULL) {
+        *p_out = (char)result;
+    }
+
+    return ret;
+}
+
+int at_tok_nextstr(char **p_cur, char **p_out)
+{
+    if (*p_cur == NULL) {
+        return -1;
+    }
+
+    *p_out = nextTok(p_cur);
+
+    return 0;
+}
+
+/** returns 1 on "has more tokens" and 0 if no */
+int at_tok_hasmore(char **p_cur)
+{
+    return ! (*p_cur == NULL || **p_cur == '\0');
+}
+
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/socket_tok.h b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/socket_tok.h
new file mode 100755
index 0000000..6aa6e72
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/socket_demo/socket_tok.h
@@ -0,0 +1,30 @@
+/*
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+#ifndef SC_SMS_TOK_H
+#define SC_SMS_TOK_H
+
+int at_tok_start(char **p_cur);
+int at_tok_nextint(char **p_cur, int *p_out);
+int at_tok_nexthexint(char **p_cur, int *p_out);
+
+int at_tok_nextbool(char **p_cur, char *p_out);
+int at_tok_nextstr(char **p_cur, char **out);
+
+int at_tok_hasmore(char **p_cur);
+
+#endif /*SC_CC_TOK_H */
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/wifi_demo/Makefile b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/wifi_demo/Makefile
new file mode 100755
index 0000000..8a988df
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/wifi_demo/Makefile
@@ -0,0 +1,32 @@
+include $(COMMON_MK)
+
+EXEC = wifi_demo
+OBJS = sc_wifi_main.o
+
+CFLAGS += -I.
+CFLAGS += -I./inc
+CFLAGS += -I$(APP_DIR)/include
+
+
+
+CFLAGS += -g -Werror=implicit-function-declaration
+
+LDLIBS += -lpthread
+LDLIBS += -lsctel -L$(LIB_DIR)/libsctel
+
+all: $(EXEC)
+$(EXEC)all: $(EXEC)
+
+$(EXEC): $(OBJS)
+	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) -Wl,--end-group
+	@cp $@ $@.elf
+
+romfs:
+	$(ROMFSINST) -e  /sbin/$(EXEC)
+	
+clean:
+	-rm -f $(EXEC) *.elf *.gdb *.o
+
+	$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS$(LDLIBS_$@))
+
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/wifi_demo/sc_wifi_main.c b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/wifi_demo/sc_wifi_main.c
new file mode 100755
index 0000000..1f9ffae
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/zxic_app_open/test/wifi_demo/sc_wifi_main.c
@@ -0,0 +1,394 @@
+#include <ctype.h>

+#include <errno.h>

+#include <unistd.h>

+#include <getopt.h>

+#include <limits.h>

+#include <netdb.h>

+#include <stdbool.h>

+#include <stdint.h>

+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <time.h>

+#include <syslog.h>

+#include <pthread.h>

+

+#include "sc_tel_types.h"

+

+#include "sc_wifi.h"

+

+#define EXIT_CMD_STOP	"stop\n"

+#define EXIT_CMD_Q	"q\n"

+#define EXIT_CMD_EXIT	"exit\n"

+

+static void printUsage(const char *Opt)

+{

+	printf("[wifi_demo]Usage: %s\n", Opt);	

+	printf("wifi_enable\n");

+	printf("wifi_disable\n");

+	printf("ap_ssid_set id ssid\n");

+	printf("ap_hide_set id hide\n");

+	printf("ap_mode_set id mode\n");

+	printf("ap_bw_set id bw\n");

+	printf("ap_sta_num_set id num\n");

+	printf("ap_cc_ch_set id country channel\n");

+	printf("ap_acl_set id mode list\n");

+	printf("ap_auth_set id mode pw\n");

+	printf("ap_param_get id\n");

+	printf("ap_start id\n");

+	printf("ap_stop id\n");

+	printf("ap_status_get id\n");

+	printf("sta_param_set ssid auth paris pw\n");

+	printf("sta_param_get\n");

+	printf("sta_start\n");

+	printf("sta_stop\n");

+	printf("sta_status_get\n");

+	printf("sta_scan\n");

+	printf("\n");

+}

+

+

+//demo

+static void user_status_cb(sc_wifi_enable_status_e pre_status, sc_wifi_enable_status_e status)

+{

+	printf("[wifi_demo]user_status_cb:%d,%d\n", pre_status, status);

+}

+

+static void user_ap_status_cb(sc_wifi_ap_index_e index, 

+ sc_wifi_ap_status_e pre_status,

+ sc_wifi_ap_status_t *p_msg)

+{

+	printf("[wifi_demo]user_ap_status_cb:%d,%d,%s,%d\n", index, pre_status, p_msg->ifname, p_msg->status);

+}

+

+static void user_ap_sta_conn_status_cb(sc_wifi_ap_index_e index,

+ sc_wifi_sta_connect_status_t *p_msg)

+{

+	printf("[wifi_demo]user_ap_sta_conn_status_cb:%d,%d,%s\n", index, p_msg->is_connected, p_msg->macaddr);

+} 

+

+static void print_sta_status(sc_wifi_sta_status_t *p_msg)

+{

+	printf("[wifi_demo]sta_status: %d, %s, %s, %d, %d\n", p_msg->status, p_msg->ifname, p_msg->ap_bssid, 

+	p_msg->signal_level, p_msg->reason_code);

+

+	if (p_msg->has_addr == 1) {

+		char addrtxt[48] = {0};

+		inet_ntop(AF_INET, &p_msg->addr, addrtxt, sizeof(addrtxt));

+		printf("[wifi_demo]addr inet_ntop: %s\n", addrtxt);

+

+		printf("[wifi_demo]addr: %08X\n", p_msg->addr.s_addr);

+	}

+

+	if (p_msg->has_addr6 == 1) {

+		char addrtxt[48] = {0};

+		inet_ntop(AF_INET6, &p_msg->addr6, addrtxt, sizeof(addrtxt));

+		printf("[wifi_demo]addr6 inet_ntop: %s\n", addrtxt);

+

+		printf("[wifi_demo]addr6: %02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X\n", 

+		p_msg->addr6.s6_addr[0], p_msg->addr6.s6_addr[1], p_msg->addr6.s6_addr[2], p_msg->addr6.s6_addr[3], 

+		p_msg->addr6.s6_addr[4], p_msg->addr6.s6_addr[5], p_msg->addr6.s6_addr[6], p_msg->addr6.s6_addr[7], 

+		p_msg->addr6.s6_addr[8], p_msg->addr6.s6_addr[9], p_msg->addr6.s6_addr[10], p_msg->addr6.s6_addr[11], 

+		p_msg->addr6.s6_addr[12], p_msg->addr6.s6_addr[13], p_msg->addr6.s6_addr[14], p_msg->addr6.s6_addr[15]);

+	}

+	printf("[wifi_demo]sta_status end\n");

+}

+

+static void user_sta_status_ind_cb(sc_wifi_sta_status_e pre_status, 

+  sc_wifi_sta_status_t *p_msg)

+{	 

+	 printf("[wifi_demo]user_sta_status_ind_cb pre:%d, cur:%d\n", pre_status, p_msg->status);

+	 print_sta_status(p_msg);

+}

+

+

+static void user_sta_scan_result_ind_cb(sc_wifi_sta_scan_list_t *p_msg)

+{

+	int i = 0;

+	printf("[wifi_demo]user_sta_scan_result_ind_cb:%d\n", p_msg->cnt);

+	if (p_msg->cnt <= 0) {

+		return;

+	}

+	for (i = 0; i < p_msg->cnt; i++) {

+		printf("[wifi_demo]ap[%d]:%s,%d,%d,%s,%d\n", i, p_msg->info[i].essid, p_msg->info[i].auth, 

+			p_msg->info[i].channel, p_msg->info[i].bssid, p_msg->info[i].signal_level);

+	}

+}

+

+//²»ÒªÖ±½ÓÔڻص÷Öе÷ÓÃËùÓÐapi

+void user_wifi_service_error_cb(int error)

+{

+	printf("[wifi_demo]user_wifi_service_error_cb: %d\n", error);

+	//send msg to main

+}

+

+

+static int user_wifi_init(void)

+{

+	int ret = 0;

+	

+	ret = sc_wifi_init();

+	if(0 != ret) {

+		return -1;

+	}

+	

+	//×¢²á»Øµ÷ ·ÅÔÚinitÖ®ºó

+	//wifi

+	sc_wifi_set_enable_status_ind_cb(user_status_cb);

+

+	//ap

+	sc_wifi_ap_set_status_ind_cb(user_ap_status_cb);

+	sc_wifi_set_ap_sta_connect_ind_cb(user_ap_sta_conn_status_cb);

+

+	//sta

+	sc_wifi_sta_set_status_ind_cb(user_sta_status_ind_cb);

+	sc_wifi_sta_set_scan_result_ind_cb(user_sta_scan_result_ind_cb);

+

+	//proxy

+	sc_wifi_set_service_error_cb(user_wifi_service_error_cb);

+	

+	return ret;

+}

+

+static void user_cmd_proc(char *cmdstr)

+{

+	char *data = cmdstr;

+	int data_len = strlen(data) - 1;/* -strlen("\r")*/	

+	char request = data[0];

+	int ret = 0;

+

+	cmdstr[data_len] = '\0';

+	printf("[wifi_demo]cmd=%s\n", data);

+	if(0 == strncmp(data, "wifi_enable", data_len)) {

+		ret = sc_wifi_enable();

+		printf("[wifi_demo]sc_wifi_enable ret=%d\n", ret);

+	}

+	else if(0 == strncmp(data, "wifi_disable", data_len)) {

+		ret = sc_wifi_disable();

+		printf("[wifi_demo]sc_wifi_disable ret=%d\n", ret);

+	}

+#if 0

+	else if(0 == strncmp(data, "work_mode_set", strlen("work_mode_set"))) {

+		int mode = 0;

+

+		data = cmdstr + strlen("work_mode_set");

+		sscanf(data, "%d", &mode);

+		

+		ret = sc_wifi_work_mode_set(mode);

+		printf("[wifi_demo]sc_wifi_work_mode_set[%d] ret=%d\n", mode, ret);

+	}

+	else if(0 == strncmp(data, "work_mode_get", data_len)) {

+		int mode = 0;

+		ret = sc_wifi_work_mode_get(&mode);

+		printf("[wifi_demo]sc_wifi_work_mode_get[%d] ret=%d\n", mode, ret);

+	}

+#endif

+	else if(0 == strncmp(data, "ap_ssid_set", strlen("ap_ssid_set"))) {

+		int id = 0;

+		char ssid[33] = {0};

+

+		data = cmdstr + strlen("ap_ssid_set");

+		sscanf(data, "%d %32s", &id, ssid);

+

+		ret = sc_wifi_ap_ssid_set(id, ssid);

+		printf("[wifi_demo]sc_wifi_ap_ssid_set[%d][%s] ret=%d\n", id, ssid, ret);

+	}

+	else if(0 == strncmp(data, "ap_hide_set", strlen("ap_hide_set"))) {

+		int id = 0;

+		int mode = 0;

+

+		data = cmdstr + strlen("ap_hide_set");

+		sscanf(data, "%d %d", &id, &mode);

+		

+		ret = sc_wifi_ap_ssid_hidden_set(id, mode);

+		printf("[wifi_demo]ap_hide_set[%d][%d] ret=%d\n", id, mode, ret);

+	}

+	else if(0 == strncmp(data, "ap_mode_set", strlen("ap_mode_set"))) {

+		int id = 0;

+		int mode = 0;

+

+		data = cmdstr + strlen("ap_mode_set");

+		sscanf(data, "%d %d", &id, &mode);

+		

+		ret = sc_wifi_ap_mode_set(id, mode);

+		printf("[wifi_demo]ap_mode_set[%d][%d] ret=%d\n", id, mode, ret);

+	}

+	else if(0 == strncmp(data, "ap_bw_set", strlen("ap_bw_set"))) {

+		int id = 0;

+		int mode = 0;

+

+		data = cmdstr + strlen("ap_bw_set");

+		sscanf(data, "%d %d", &id, &mode);

+		

+		ret = sc_wifi_ap_bandwidth_set(id, mode);

+		printf("[wifi_demo]ap_bw_set[%d][%d] ret=%d\n", id, mode, ret);

+	}

+	else if(0 == strncmp(data, "ap_sta_num_set", strlen("ap_sta_num_set"))) {

+		int id = 0;

+		int mode = 0;

+

+		data = cmdstr + strlen("ap_sta_num_set");

+		sscanf(data, "%d %d", &id, &mode);

+		

+		ret = sc_wifi_ap_max_sta_num_set(id, mode);

+		printf("[wifi_demo]ap_sta_num_set[%d][%d] ret=%d\n", id, mode, ret);

+	}

+	else if(0 == strncmp(data, "ap_cc_ch_set", strlen("ap_cc_ch_set"))) {

+		int id = 0;

+		int mode = 0;

+		char cc[3] = {0};

+

+		data = cmdstr + strlen("ap_cc_ch_set");

+		sscanf(data, "%d %3s %d", &id, cc, &mode);

+		

+		ret = sc_wifi_ap_cc_ch_set(id, cc, mode);

+		printf("[wifi_demo]ap_cc_ch_set[%d][%s-%d] ret=%d\n", id, cc, mode, ret);

+	}

+	else if(0 == strncmp(data, "ap_acl_set", strlen("ap_acl_set"))) {

+		int id = 0;

+		int mode = 0;

+		char mac_list[720] = {0};

+

+		data = cmdstr + strlen("ap_acl_set");

+		sscanf(data, "%d %d %720s", &id, &mode, mac_list);

+		

+		ret = sc_wifi_ap_acl_set(id, mode, mac_list);

+		printf("[wifi_demo]ap_acl_set[%d][%d-%s] ret=%d\n", id, mode, mac_list, ret);

+	}

+	else if(0 == strncmp(data, "ap_auth_set", strlen("ap_auth_set"))) {

+		int id = 0;

+		int mode = 0;

+		char pw[65] = {0};

+		sc_wifi_ap_auth_t auth = {0};

+

+		data = cmdstr + strlen("ap_auth_set");

+		sscanf(data, "%d %d %64s", &id, &mode, pw);

+		auth.auth = mode;

+		strncpy(auth.passwd, pw, sizeof(auth.passwd)-1);

+		ret = sc_wifi_ap_auth_set(id, &auth);

+		printf("[wifi_demo]ap_auth_set[%d][%d-%s] ret=%d\n", id, auth.auth, auth.passwd, ret);

+	}

+	else if(0 == strncmp(data, "ap_param_get", strlen("ap_param_get"))) {

+		int id = 0;

+		sc_wifi_ap_param_t param = {0};

+

+		data = cmdstr + strlen("ap_param_get");

+		sscanf(data, "%d", &id);

+

+		ret = sc_wifi_ap_param_get(id, &param);

+		

+		printf("[wifi_demo]ap_param_get[idx:%d] ret=%d\n"

+			"ssid:%s\nhide:%d\n"

+			"mode:%d\nbw:%d\n"

+			"cc:%s\nch:%d\n"

+			"auth:%d\npw:%s\n"

+			"access_num:%d\n"

+			"rule:%d\nmac:%s\n", 

+			id, ret, 

+			param.ssid, param.ssid_hide,

+			param.mode, param.bandwidth,

+			param.countrycode, param.channel,

+			param.auth.auth, param.auth.passwd,

+			param.max_sta_num, 

+			param.acl_rule, param.mac_list);

+	}

+	else if(0 == strncmp(data, "ap_start", strlen("ap_start"))) {

+		int id = 0;

+

+		data = cmdstr + strlen("ap_start");

+		sscanf(data, "%d", &id);

+		ret = sc_wifi_ap_start(id);

+		printf("[wifi_demo]ap_start[%d] ret=%d\n", id, ret);

+	}

+	else if(0 == strncmp(data, "ap_stop", strlen("ap_stop"))) {

+		int id = 0;

+

+		data = cmdstr + strlen("ap_stop");

+		sscanf(data, "%d", &id);

+		ret = sc_wifi_ap_stop(id);

+		printf("[wifi_demo]ap_stop[%d] ret=%d\n", id, ret);

+	}

+	else if(0 == strncmp(data, "ap_status_get", strlen("ap_status_get"))) {

+		int id = 0;

+		sc_wifi_ap_status_t stat = {0};

+

+		data = cmdstr + strlen("ap_status_get");

+		sscanf(data, "%d", &id);

+		ret = sc_wifi_ap_get_status(id, &stat);

+		printf("[wifi_demo]ap_status_get[%d] [%s, %d] ret=%d\n", id, stat.ifname, stat.status, ret);

+	}

+	//station

+	else if(0 == strncmp(data, "sta_param_set", strlen("sta_param_set"))) {

+		sc_wifi_sta_param_t stat = {0};

+

+		data = cmdstr + strlen("sta_param_set");

+		sscanf(data, "%s %d %d %s", stat.ssid, &stat.auth, &stat.pairwise, stat.passwd);

+		ret = sc_wifi_sta_param_set(&stat);

+		printf("[wifi_demo]sta_param_set[%s, %d, %d, %s] ret=%d\n", stat.ssid, stat.auth, stat.pairwise, stat.passwd, ret);

+	}

+	else if(0 == strncmp(data, "sta_param_get", data_len)) {

+		sc_wifi_sta_param_t stat = {0};

+

+		ret = sc_wifi_sta_param_get(&stat);

+		printf("[wifi_demo]sta_param_get[%s, %d, %d, %s] ret=%d\n", stat.ssid, stat.auth, stat.pairwise, stat.passwd, ret);

+	}

+	else if(0 == strncmp(data, "sta_start", data_len)) {

+		ret = sc_wifi_sta_start();

+		printf("[wifi_demo]sta_start ret=%d\n", ret);

+	}

+	else if(0 == strncmp(data, "sta_stop", data_len)) {

+		ret = sc_wifi_sta_stop();

+		printf("[wifi_demo]sta_stop ret=%d\n", ret);

+	}

+	else if(0 == strncmp(data, "sta_status_get", data_len)) {

+		sc_wifi_sta_status_t stat = {0};

+

+		ret = sc_wifi_sta_get_status(&stat);

+		printf("[wifi_demo]sta_status_get ret=%d£º\n", ret);

+		print_sta_status(&stat);

+		printf("[wifi_demo]sta_status_get end\n");

+	}

+	else if(0 == strncmp(data, "sta_scan", data_len)) {

+		ret = sc_wifi_sta_start_scan();

+		printf("[wifi_demo]sta_scan ret=%d\n", ret);

+	}

+	else {

+		printf("Request unknow.\n");

+		printUsage(cmdstr);

+	}

+}

+

+int main(int argc, char *argv[])

+{

+	char cmdstr[128];		

+	

+	printf("[wifi_demo]test begin\n");

+

+	user_wifi_init();

+

+	while(1) {

+		memset(cmdstr,0,sizeof(cmdstr));

+		

+		printf("[wifi_demo]Please input test command:\n");

+	

+		if(NULL != fgets(cmdstr,sizeof(cmdstr) - 1,stdin)) {

+			if(0 == strcmp(EXIT_CMD_STOP,cmdstr) || 

+				0 == strcmp(EXIT_CMD_Q,cmdstr) || 

+				0 == strcmp(EXIT_CMD_EXIT,cmdstr)) {

+				break;

+			}

+			

+			printf("[wifi_demo]cmdstr:%d %s\n", strlen(cmdstr), cmdstr);

+			if(1 >= strlen(cmdstr)) {

+				continue;

+			}

+

+			user_cmd_proc(cmdstr);

+		}

+	}

+

+	sc_wifi_uninit();

+	printf("[wifi_demo]test end\n");

+	return 0;

+}

+