[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, ¶m);
+
+ 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 = ®ulator_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,®_val);
+ if (ret) {
+ return -EIO;
+ }
+ reg_val = reg_val&(~(1<<5));
+ ret = zx234290_i2c_write_simple(reg_addr, ®_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|0xff;
+ ret += zx234290_i2c_write_simple(0xf, ®);
+ ret = zx234290_i2c_read_simple(0xe, ®);
+ reg = reg|0x3;
+ ret += zx234290_i2c_write_simple(0xe, ®);
+ 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, ®);
+ 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, ®);
+ 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, ®);
+ 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, ®);
+ 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, ®_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, ¶m);
+
+ 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, ®);
+ irq_sts = reg;
+ zx234290->read(zx234290, ZX234290_REG_ADDR_INTB, 1, ®);
+ 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, ®);
+ irq_mask = reg;
+ zx234290->read(zx234290, ZX234290_REG_ADDR_INTB_MASK, 1, ®);
+ 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 &= ~(0x1<<7);
+ //zx234290->write(zx234290, ZX234290_REG_ADDR_INTA, 1, ®);
+ #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 = irq_sts & 0xFF;
+ irq_sts >>= 8;
+ if (reg)
+ zx234290->write(zx234290, ZX234290_REG_ADDR_INTB, 1, ®);
+ #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_mask = reg;
+ zx234290->read(zx234290, ZX234290_REG_ADDR_INTB_MASK, 1, ®);
+ reg_mask |= reg << 8;
+ /* take ldo6 & ldo8 error as buck error */
+ zx234290->read(zx234290, ZX234290_REG_ADDR_BUCK_INT_MASK, 1, ®);
+ if (reg)
+ reg_mask |= BIT(ZX234290_INT_BUCK_FAUL);
+ zx234290->read(zx234290, ZX234290_REG_ADDR_LDO_INT_MASK, 1, ®);
+ 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 = zx234290->irq_mask >> 8 & 0xFF;
+ zx234290->write(zx234290, ZX234290_REG_ADDR_INTB_MASK, 1, ®);
+
+ reg = (zx234290->irq_mask & BIT(ZX234290_INT_BUCK_FAUL)) ? 0xFF : 0;
+ zx234290->write(zx234290, ZX234290_REG_ADDR_BUCK_INT_MASK, 1, ®);
+
+ reg = (zx234290->irq_mask & BIT(ZX234290_INT_LDO_FAUL)) ? 0xFF : 0;
+ zx234290->write(zx234290, ZX234290_REG_ADDR_LDO_INT_MASK, 1, ®);
+ }
+
+ 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, ®);
+ //zx234290->write(zx234290, ZX234290_REG_ADDR_INTA, 1, ®);
+ zx234290->read(zx234290, ZX234290_REG_ADDR_INTB, 1, ®);
+ //zx234290->write(zx234290, ZX234290_REG_ADDR_INTB, 1, ®);
+
+ /*write bit7 to be 0, clear pmu INT*/
+ zx234290->read(zx234290, ZX234290_REG_ADDR_INTA, 1, ®);
+ reg &= ~(0x1<<7);
+ zx234290->write(zx234290, ZX234290_REG_ADDR_INTA, 1, ®);
+
+ /* 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,®_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, ®_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, ®_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,¶m1,¶m2,¶m3);
+ 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, ¶m);
+
+ 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;
+}
+