Fix mbtk from v1265 GSW

Change-Id: I5d8d395616f284bc74c8b9448cfa347164b5a668
diff --git a/mbtk/libgsw_lib/Makefile b/mbtk/libgsw_lib/Makefile
new file mode 100755
index 0000000..edeb244
--- /dev/null
+++ b/mbtk/libgsw_lib/Makefile
@@ -0,0 +1,55 @@
+BUILD_ROOT = $(shell pwd)/..
+include $(BUILD_ROOT)/Make.defines
+INSTALL_DIR := $(BUILD_ROOT)/../mbtk/rootfs/lib
+
+LOCAL_PATH=$(BUILD_ROOT)/libgsw_lib
+
+INC_DIR += \
+		-I$(LOCAL_PATH)
+
+LIB_DIR +=
+
+LIBS += -lmbtk_lib -llog -ldl
+
+CFLAGS += -shared -Wl,-shared,-Bsymbolic
+
+DEFINE +=
+
+MY_FILES_PATH:=$(LOCAL_PATH)
+#ifeq ($(CONFIG_MBTK_QL_SUPPORT),y)
+#MY_FILES_PATH += $(LOCAL_PATH)/ql
+#endif
+
+#ifeq ($(CONFIG_MBTK_PLATFORM),linux)
+#MY_FILES_PATH += $(LOCAL_PATH)/platform/linux
+#endif
+
+MY_FILES_SUFFIX:=%.c %.cpp
+My_All_Files := $(foreach src_path,$(MY_FILES_PATH), $(shell find "$(src_path)" -type f))
+MY_SRC_LIST  := $(filter $(MY_FILES_SUFFIX),$(My_All_Files))
+MY_SRC_LIST  := $(MY_SRC_LIST:$(LOCAL_PATH)/%=%)
+LOCAL_SRC_FILES += $(MY_SRC_LIST)
+$(info LOCAL_SRC_FILES = $(LOCAL_SRC_FILES))
+OBJS = $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(LOCAL_SRC_FILES)))
+$(info OBJS = $(OBJS))
+
+dtarget := $(OUT_DIR)/lib/libgsw_lib.so
+
+all: $(dtarget) install
+
+$(dtarget): $(OBJS)
+	$(CC) $(CFLAGS) $(LIB_DIR) $(LIBS) $(OBJS) -o $@
+
+install:
+	cp $(dtarget) $(INSTALL_DIR)
+	@echo "Installed $(dtarget) to $(INSTALL_DIR)"
+
+%.o:%.c
+	$(CC) $(CFLAGS) $(INC_DIR) $(DEFINE) -c $< -o $@
+
+%.o:%.cpp
+	$(CC) $(CFLAGS) $(INC_DIR) $(DEFINE) -c $< -o $@
+
+clean:
+	rm -f $(OBJS) $(dtarget)
+
diff --git a/mbtk/libgsw_lib/gsw_at.c b/mbtk/libgsw_lib/gsw_at.c
new file mode 100755
index 0000000..fa34eda
--- /dev/null
+++ b/mbtk/libgsw_lib/gsw_at.c
@@ -0,0 +1,342 @@
+#include <sys/types.h>

+#include <sys/socket.h>

+#include <sys/un.h>

+#include <unistd.h>

+#include <arpa/inet.h>

+#include <stdio.h>

+#include <stdlib.h>

+#include <signal.h>

+#include <string.h>

+#include <pthread.h>

+#include <fcntl.h>

+#include <errno.h>

+#include <stdint.h>

+#include <dlfcn.h>

+#include <stdbool.h>

+#include "gsw_at.h"

+

+#ifndef LOG_ERR_LEVEL

+#define LOG_ERR_LEVEL  3      /* error conditions */

+#endif

+#ifndef LOG_WARN_LEVEL

+#define LOG_WARN_LEVEL 4   /* warning conditions */

+#endif

+#ifndef LOG_INFO_LEVEL

+#define LOG_INFO_LEVEL 6      /* informational */

+#endif

+#ifndef LOG_DEBUG_LEVEL

+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */

+#endif

+#ifndef LOG_VERBOSE_LEVEL

+#define LOG_VERBOSE_LEVEL 8

+#endif

+

+#define LOGV(fmt, args ...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGI(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGD(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGW(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGE(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+    

+

+#define GSW_HAL_SUCCESS 0

+#define GSW_HAL_FAIL -1	//表示失败(通用性)

+#define GSW_HAL_MEM_INVAILD -2 //表示入参地址为NULL

+

+#define OUT_MAX_SIZE 1024

+#define LINE __LINE__

+#define FUNC __FUNCTION__

+#define AT_EXTERSION_SOCKET_NAME "/tmp/atcmdext"

+#define SOCKET_ZERO   0

+#define SOCKET_SUCC   1

+#define SOCKET_FAIL  -1

+

+typedef void (*mbtk_log)(int level, const char *format,...);

+typedef enum

+{

+    A_SUCCESS = 0,

+    A_ERROR = -1

+}LYNQ_AT_E;

+

+static mbtk_log fun_ptr_log = NULL;

+void *dlHandle_at = NULL;

+char *lynqLib_at = "/lib/libmbtk_lib.so";

+char *output = NULL;

+int sockfd = 0;

+int result = A_SUCCESS;

+char buffer_at[OUT_MAX_SIZE] = {0};

+struct sockaddr_in addr_serv;

+struct sockaddr_un addr_server;

+AT_CALLBACK tmp = NULL;

+static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;

+socklen_t len;

+bool connect_state = false;

+

+

+int socket_local_client (char* name) {

+    LOGD("[%d][%s] enter",LINE,FUNC);

+    sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

+    if (sockfd < 0)

+    {

+        LOGD("Can't open stream socket (%s)", name);

+        return -1;

+    }

+    addr_server.sun_family = AF_UNIX;

+    memset(addr_server.sun_path, '\0', sizeof(addr_server.sun_path));

+    strncpy(addr_server.sun_path, name, sizeof(addr_server.sun_path) - 1);

+    if (connect(sockfd, (struct sockaddr *) &addr_server, sizeof(struct sockaddr_un)) < 0)

+    {

+        close(sockfd);

+        LOGD("Can't connect to server side, path: %s, %s", name, strerror(errno));

+        return -1;

+    }

+    LOGD("[%d][%s] connect %s success",LINE,FUNC,name);

+    return sockfd;

+}

+bool send_msg_to_service(int fd,char *msg,int size)

+{

+    LOGD("[%d][%s] enter",LINE,FUNC);

+    if (fd < 0)

+    {

+        LOGD("fd invalid when send to atci service. errno = %d", errno);

+        return false;

+    }

+    if(NULL == msg)

+    {

+        LOGD("atcmd is null.");

+        return false;

+    }

+    int sendLen = send(fd, msg, size, 0);

+    if (sendLen != size)

+    {

+        LOGD("lose data when send to atci service. errno = %d", errno);

+        return false;

+    }

+    LOGD("client send to app demo: %s", msg);

+    return true;

+}

+

+int atsvc_cmd_recv(int fd, char *buf, int len)

+{

+    int ret = 0;

+    ret = recv(fd, buf, len, 0);

+    LOGD("[%d][%s] recv after",LINE,FUNC);

+    if (ret < 0)

+    {

+        LOGD("acti_cmd_recv client select error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);

+        return SOCKET_FAIL;

+    }

+    else if(ret == 0)

+    {

+        LOGD("acti_cmd_recv client recv error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);

+        return SOCKET_ZERO;

+    }

+  return SOCKET_SUCC;

+}

+/**

+ * @brief send third cmd to service and receive input,then send output to service

+ * 

+ * @param parm 

+ * @return void* 

+ */

+void *thread_recv(void *parm)

+{

+    LOGD("[%d][%s] enter",LINE,FUNC);

+    char at_cmd[100] = {0};

+    int fd = -1;

+    int ret = 0;

+    fd = socket_local_client(AT_EXTERSION_SOCKET_NAME);

+    if(fd <= 0)

+    {

+        LOGE("socket_local_client  fail\n");

+        connect_state = false;

+        pthread_mutex_unlock(&s_startupMutex);

+        return NULL;

+    }

+    int len_buf = strlen(buffer_at);

+    if(!send_msg_to_service(fd,buffer_at,len_buf))

+    {

+        LOGE("send_msg_to_service  fail\n");

+        connect_state = false;

+        pthread_mutex_unlock(&s_startupMutex);

+        return NULL;

+    }

+    connect_state = true;

+    pthread_mutex_unlock(&s_startupMutex);

+    char *input = NULL;

+    output = (char *)malloc(sizeof(char)*OUT_MAX_SIZE);

+    if(NULL == output)

+    {

+        LOGE("thread_recv malloc fail\n");

+        return NULL;

+    }

+    TryNewLink:

+    if(connect_state == false)

+    {

+        if (connect(fd, (struct sockaddr *) &addr_server, sizeof(struct sockaddr_un)) < 0)

+        {

+            close(fd);

+            LOGE("Can't connect to server side, path: %s, errno:%d", AT_EXTERSION_SOCKET_NAME, errno);

+            return NULL;

+        }

+        connect_state = true;

+    }

+    while (1)

+    {

+        /*receive at cmd*/

+        memset(at_cmd, 0, sizeof(at_cmd));

+        ret = atsvc_cmd_recv(fd, at_cmd,sizeof(at_cmd));

+        if (ret < 0)

+        {

+            LOGE("[%d][%s]receive CMD error",LINE,FUNC);

+            continue;

+        }

+        else if(ret == SOCKET_ZERO)

+        {

+            LOGE("maybe client socket closed 1. retry new link!");

+            connect_state = false;

+            goto TryNewLink;

+        }

+        input = at_cmd;

+        int len = strlen(input);

+        while (len > 0 && (input[len - 1] == '\r' || input[len - 1] == '\n'))

+	    {

+            input[--len] = '\0';

+	    }

+        //begin deal with callback

+        tmp(input, output, OUT_MAX_SIZE);

+        LOGD("lynq_reg_third_at send output to service\n");

+        if(!send_msg_to_service(fd,output, strlen(output)))

+        {

+            LOGE("thread_recv send fail\n");

+            continue;

+        }

+    }

+    free(output);

+    output = NULL;

+    if(fd != 0)

+    {

+        close(fd);

+    }

+    return NULL;

+}

+

+/**

+ * @brief Threads are created to communicate with the server

+ * 

+ * @return int 

+ */

+int lynq_connect_service_start(void)

+{

+    LOGD("[%d][%s] enter",LINE,FUNC);

+    pthread_t lynq_at_tid;

+    int rt = pthread_create(&lynq_at_tid, NULL, thread_recv, NULL);

+    pthread_mutex_lock(&s_startupMutex);

+    LOGD("[%d][%s] pthread mutex unlock",LINE,FUNC);

+    if((connect_state != true) && rt < 0)

+    {

+        LOGE("connect fail,rt:%d,connect state:%d\n",rt,connect_state);

+        return -1;

+    }

+    return 0;

+}

+

+/**

+ * @brief Type:[IN] send third at cmd to service

+ * @param ext_at Type:[IN] input at cmd

+ * @param callback Type:[IN]

+ * @return int 

+ */

+int32_t gsw_reg_atcmd(const char *atcmd,AT_CALLBACK func)

+{

+    if(NULL == atcmd || NULL == func)

+    {

+        return GSW_HAL_FAIL;

+    }

+    dlHandle_at = dlopen(lynqLib_at, RTLD_NOW);

+    fun_ptr_log = (mbtk_log)dlsym(dlHandle_at, "mbtk_log");

+    if(fun_ptr_log == NULL || dlHandle_at == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+    memcpy(buffer_at, atcmd, strlen(atcmd));

+    tmp = func;

+    LOGD("lynq_reg_third_at start\n");

+    int ret = lynq_connect_service_start();

+    

+    if(ret != 0)

+    {

+        LOGE("lynq_connect_service_start start failed\n");

+        return GSW_HAL_FAIL;

+    }

+    LOGD("lynq_connect_service_start success ret:%d\n",ret);

+    return GSW_HAL_SUCCESS;

+}

+

+int32_t gsw_sdk_at_init(void)

+{

+    return GSW_HAL_SUCCESS;

+}

diff --git a/mbtk/libgsw_lib/gsw_data.c b/mbtk/libgsw_lib/gsw_data.c
new file mode 100755
index 0000000..e26e35b
--- /dev/null
+++ b/mbtk/libgsw_lib/gsw_data.c
@@ -0,0 +1,931 @@
+#include "gsw_nw_interface.h"

+#include <stdint.h>

+#include <string.h>

+#include <stdbool.h>

+#include <stdio.h>

+#include <dlfcn.h>

+#include <stdlib.h>

+#include <sys/socket.h>

+#include <netinet/in.h>

+#include <arpa/inet.h>

+#include <pthread.h>

+

+

+//mbtk include

+#define MBTK_APN_NAME_SIZE 150+1

+#define MBTK_APN_USERNAME_SIZE 127+1

+#define MBTK_APN_PASSWORD_SIZE 127+1

+#define MBTK_APN_TYPE_SIZE 127+1

+

+

+#ifndef FALSE

+#define FALSE   (0)

+#endif

+ 

+ 

+#ifndef TRUE

+#define TRUE    (!FALSE)

+#endif

+

+

+

+

+typedef unsigned int uint32;

+typedef unsigned char uint8;

+typedef unsigned short uint16;

+typedef void (*mbtk_info_callback_func)(const void* data, int data_len);

+typedef unsigned long long uint64_t;

+

+typedef struct

+{

+    int client_fd;

+    pthread_t read_thread_id;

+    int exit_fd[2];

+    bool is_waitting;

+    pthread_cond_t cond;

+    pthread_mutex_t mutex;

+

+    pthread_mutex_t send_mutex;

+

+    // Temp response data.

+    uint16 info_err;

+    uint16 data_len;

+    void *data;

+

+    //mbtk wyq for server_ready_status add start

+    char server_ready_status;

+    //mbtk wyq for server_ready_status add end

+

+    mbtk_info_callback_func net_state_cb;

+    mbtk_info_callback_func call_state_cb;

+    mbtk_info_callback_func sms_state_cb;

+    mbtk_info_callback_func radio_state_cb;

+    mbtk_info_callback_func sim_state_cb;

+    mbtk_info_callback_func pdp_state_cb;

+    //add signal by xr

+    mbtk_info_callback_func signal_state_cb;

+} mbtk_info_handle_t;

+

+typedef enum {

+    MBTK_IP_TYPE_IP,

+    MBTK_IP_TYPE_IPV6,

+    MBTK_IP_TYPE_IPV4V6,

+    MBTK_IP_TYPE_PPP

+} mbtk_ip_type_enum;

+

+typedef enum {

+    MBTK_APN_REQ_TYPE_SET = 0,   // set apn req

+    MBTK_APN_REQ_TYPE_ADD        // add apn req

+}mbtk_apn_req_type_enum;

+

+typedef enum {

+	MBTK_APN_AUTH_PROTO_DEFAULT = 0,

+	MBTK_APN_AUTH_PROTO_NONE,

+	MBTK_APN_AUTH_PROTO_PAP,

+	MBTK_APN_AUTH_PROTO_CHAP,

+#if 0

+	MBTK_APN_AUTH_PROTO_PAP_CHAP,

+    //NOT SUPPORT

+#endif

+} mbtk_apn_auth_proto_enum;

+

+

+typedef struct {

+    bool valid;

+    uint32 IPAddr;

+    uint32 PrimaryDNS;

+    uint32 SecondaryDNS;

+    uint32 GateWay;

+    uint32 NetMask;

+} __attribute__((packed)) mbtk_ipv4_info_t;

+

+typedef struct {

+    bool valid;

+    uint32 IPV6Addr[4];

+    uint32 PrimaryDNS[4];

+    uint32 SecondaryDNS[4];

+    uint32 GateWay[4];

+    uint32 NetMask[4];

+} __attribute__((packed)) mbtk_ipv6_info_t;

+

+

+

+typedef struct {

+	int cid;                /*!< UMTS/CDMA profile ID. range: 0 - 7*/

+	mbtk_ip_type_enum ip_type;               /*!< Packet Data Protocol (PDP) type specifies the type of data payload

+	                                             exchanged over the airlink when the packet data session is

+	                                             established with this profile. */

+	mbtk_apn_req_type_enum req_type;          /*!< apn req type*/

+	mbtk_apn_auth_proto_enum auth_proto;         /*!< Authentication Protocol. */

+	uint8 apn_name[MBTK_APN_NAME_SIZE];        /*!< A string parameter that is a logical name used to select the GGSN

+	                                             and external packet data network. */

+	uint8 user_name[MBTK_APN_USERNAME_SIZE];    /*!< Username used during data network authentication. */

+	uint8 user_pass[MBTK_APN_PASSWORD_SIZE];    /*!< Password to be used during data network authentication. */

+    uint8 apn_type[MBTK_APN_TYPE_SIZE];

+} mbtk_qser_apn_info_s;

+

+static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);

+static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);

+int (*mbtk_pdp_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);

+int (*mbtk_qser_apn_set)(mbtk_info_handle_t* handle, mbtk_qser_apn_info_s *apninfo, unsigned char *cid);

+int (*mbtk_data_call_start)(mbtk_info_handle_t* handle, int cid, int auto_conn_interval, bool boot_conn, int timeout);

+int (*mbtk_data_call_stop)(mbtk_info_handle_t* handle, int cid, int timeout);

+int (*mbtk_data_call_state_get)(mbtk_info_handle_t* handle, int cid, mbtk_ipv4_info_t *ipv4, mbtk_ipv6_info_t *ipv6);

+int (*mbtk_apn_set)(mbtk_info_handle_t* handle, int cid, mbtk_ip_type_enum ip_type, const void* apn_name, const void *user_name, const void *user_pass, const void *auth);

+int (*ipv6_2_str)(const void *ipv6, void *ipv6_str);

+static void (*mbtk_log)(int level, const char *format, ...);

+static void (*mbtk_log_init)(char *path, char *tag);

+

+#ifndef LOG_ERR_LEVEL

+#define LOG_ERR_LEVEL  3      /* error conditions */

+#endif

+#ifndef LOG_WARN_LEVEL

+#define LOG_WARN_LEVEL 4   /* warning conditions */

+#endif

+#ifndef LOG_INFO_LEVEL

+#define LOG_INFO_LEVEL 6      /* informational */

+#endif

+#ifndef LOG_DEBUG_LEVEL

+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */

+#endif

+#ifndef LOG_VERBOSE_LEVEL

+#define LOG_VERBOSE_LEVEL 8

+#endif

+

+#define LOGV(fmt, args ...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGI(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGD(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGW(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGE(fmt, args...) \

+    do{ \

+		char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+

+//define

+#define GSW_HAL_FAIL GSW_HAL_NORMAL_FAIL

+#define lib_mbtk_path "/lib/libmbtk_lib.so"

+pthread_mutex_t data_mutex = PTHREAD_MUTEX_INITIALIZER;

+static int data_call_lock = 0;

+static int data_init_flag = 0;

+static void *dlHandle_mbtk;

+static mbtk_info_handle_t* data_info_handle = NULL;

+static gsw_data_call_evt_cb_t gsw_data_call_evt_cb;

+

+Wan_State_ind_s *linkState_arr;

+

+static int Wan_State_ind_malloc(Wan_State_ind_s **linkState)

+{

+    (*linkState) = (Wan_State_ind_s *)malloc(sizeof(Wan_State_ind_s));

+    if((*linkState) == NULL)

+    {

+        LOGE("malloc Wan_State_ind_s fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    memset((*linkState), 0x00, sizeof(Wan_State_ind_s));

+

+    (*linkState)->handle = -1;

+    (*linkState)->cid = -1;

+    (*linkState)->state = 0;

+    (*linkState)->fail_cause = 0;

+

+    (*linkState)->type = (char *)malloc(GSW_PDP_TYPE_MAX_LEN);

+    memset((*linkState)->type, 0x00, GSW_PDP_TYPE_MAX_LEN);

+

+    (*linkState)->ifname = (char *)malloc(GSW_IFACE_NAME_MAX_LEN);

+    memset((*linkState)->ifname, 0x00, GSW_IFACE_NAME_MAX_LEN);

+

+    (*linkState)->v4_ip = (char *)malloc(GSW_PDP_ADDR_MAX_LEN);

+    memset((*linkState)->v4_ip, 0x00, GSW_PDP_ADDR_MAX_LEN);

+

+    (*linkState)->v4_pdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);

+    memset((*linkState)->v4_pdns, 0x00, GSW_DNS_ADDR_MAX_LEN);

+

+    (*linkState)->v4_sdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);

+    memset((*linkState)->v4_sdns, 0x00, GSW_DNS_ADDR_MAX_LEN);

+

+    (*linkState)->v4_gw = (char *)malloc(GSW_GETWAYS_ADDR_MAX_LEN);

+    memset((*linkState)->v4_gw, 0x00, GSW_GETWAYS_ADDR_MAX_LEN);

+

+    (*linkState)->v6_ip = (char *)malloc(GSW_PDP_ADDR_MAX_LEN);

+    memset((*linkState)->v6_ip, 0x00, GSW_PDP_ADDR_MAX_LEN);

+

+    (*linkState)->v6_pdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);

+    memset((*linkState)->v6_pdns, 0x00, GSW_DNS_ADDR_MAX_LEN);

+

+    (*linkState)->v6_sdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);

+    memset((*linkState)->v6_sdns, 0x00, GSW_DNS_ADDR_MAX_LEN);

+

+    return GSW_HAL_SUCCESS;

+}

+

+static int Wan_State_ind_free(Wan_State_ind_s **linkState)

+{

+    if ((*linkState) == NULL) 

+    {

+        LOGE("(*linkState) is null\n");

+        return GSW_HAL_FAIL;

+    }

+

+    free((*linkState)->type);

+    (*linkState)->type = NULL;

+

+    free((*linkState)->ifname);

+    (*linkState)->ifname = NULL;

+

+    free((*linkState)->v4_ip);

+    (*linkState)->v4_ip = NULL;

+

+    free((*linkState)->v4_pdns);

+    (*linkState)->v4_pdns = NULL;

+

+    free((*linkState)->v4_sdns);

+    (*linkState)->v4_sdns = NULL;

+

+    free((*linkState)->v4_gw);

+    (*linkState)->v4_gw = NULL;

+

+    free((*linkState)->v6_ip);

+    (*linkState)->v6_ip = NULL;

+

+    free((*linkState)->v6_pdns);

+    (*linkState)->v6_pdns = NULL;

+

+    free((*linkState)->v6_sdns);

+    (*linkState)->v6_sdns = NULL;

+

+

+    free((*linkState));

+    (*linkState) = NULL;

+

+    return GSW_HAL_SUCCESS;

+}

+

+static int mbtk_data_api_import()

+{

+    dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);

+    if (dlHandle_mbtk == NULL) 

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");

+    if (mbtk_log_init == NULL) 

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");

+    if (mbtk_log == NULL) 

+    {

+        return GSW_HAL_FAIL;

+    }

+    

+    mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");

+    if (mbtk_info_handle_get == NULL) 

+    {

+        LOGE("mbtk_info_handle_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");

+    if (mbtk_info_handle_free == NULL) 

+    {

+        LOGE("mbtk_info_handle_free dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_pdp_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_pdp_state_change_cb_reg");

+    if (mbtk_pdp_state_change_cb_reg == NULL) 

+    {

+        LOGE("mbtk_pdp_state_change_cb_reg dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_qser_apn_set = (int (*)(mbtk_info_handle_t* handle, mbtk_qser_apn_info_s *apninfo, unsigned char *cid))dlsym(dlHandle_mbtk, "mbtk_qser_apn_set");

+    if (mbtk_qser_apn_set == NULL) 

+    {

+        LOGE("mbtk_qser_apn_set dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_data_call_start = (int (*)(mbtk_info_handle_t* handle, int cid, int auto_conn_interval, bool boot_conn, int timeout))dlsym(dlHandle_mbtk, "mbtk_data_call_start");

+    if (mbtk_data_call_start == NULL) 

+    {

+        LOGE("mbtk_data_call_start dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_data_call_stop = (int (*)(mbtk_info_handle_t* handle, int cid, int timeout))dlsym(dlHandle_mbtk, "mbtk_data_call_stop");

+    if (mbtk_data_call_stop == NULL) 

+    {

+        LOGE("mbtk_data_call_stop dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_data_call_state_get = (int (*)(mbtk_info_handle_t* handle, int cid, mbtk_ipv4_info_t *ipv4, mbtk_ipv6_info_t *ipv6))dlsym(dlHandle_mbtk, "mbtk_data_call_state_get");

+    if (mbtk_data_call_state_get == NULL) 

+    {

+        LOGE("mbtk_data_call_state_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_apn_set = (int (*)(mbtk_info_handle_t* handle, int cid, mbtk_ip_type_enum ip_type, const void* apn_name, const void *user_name, const void *user_pass, const void *auth))dlsym(dlHandle_mbtk, "mbtk_apn_set");

+    if (mbtk_apn_set == NULL) 

+    {

+        LOGE("mbtk_apn_set dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    ipv6_2_str = (int (*)(const void *ipv6, void *ipv6_str))dlsym(dlHandle_mbtk, "ipv6_2_str");

+    if (ipv6_2_str == NULL) 

+    {

+        LOGE("ipv6_2_str dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+

+

+static int data_call_state_query(int call_id,Wan_State_ind_s *linkState)

+{

+    int ret = -1;

+    mbtk_ipv4_info_t ipv4;

+    mbtk_ipv6_info_t ipv6;

+

+    LOGE("mbtk_data_call_state_get start\n");

+    ret = mbtk_data_call_state_get(data_info_handle, call_id, &ipv4, &ipv6);

+    LOGE("mbtk_data_call_state_get end\n");

+    if (ret != 0) 

+    {

+        LOGE("mbtk_data_call_state_get fail\n");

+        return ret;

+    }

+

+    //ifname

+    sprintf(linkState->ifname, "ccinet%d", call_id-1);

+

+    //type

+    if(ipv4.valid)

+    {

+        if(ipv6.valid)

+        {

+            strcpy(linkState->type, "IPV4V6");

+        } 

+        else {

+            strcpy(linkState->type, "IP");

+        }

+    }

+    else if(ipv6.valid)

+    {

+        strcpy(linkState->type, "IPV6");

+    }

+

+    //ip

+    LOGE("ipv4.valid = %d\n", ipv4.valid);

+    if(ipv4.valid)

+    {

+        if(linkState==NULL)

+        {

+            LOGE("linkState is NULL\n");

+            return GSW_HAL_FAIL;

+        }

+

+        //parse ipv4_addr,gw,dns,sdns

+        if(inet_ntop(AF_INET, &(ipv4.IPAddr), linkState->v4_ip , GSW_PDP_ADDR_MAX_LEN) == NULL) {

+            LOGE("IPv4 error.\n");

+        } else {

+            LOGE("IPv4 : %s\n", linkState->v4_ip);

+            

+        }

+

+

+        if(inet_ntop(AF_INET, &(ipv4.GateWay), linkState->v4_gw , GSW_PDP_ADDR_MAX_LEN) == NULL) {

+            LOGE("GateWay error.\n");

+        } else {

+            LOGE("GateWay : %s\n", linkState->v4_gw);

+        }

+

+        if(inet_ntop(AF_INET, &(ipv4.PrimaryDNS), linkState->v4_pdns , GSW_DNS_ADDR_MAX_LEN) == NULL) {

+            LOGE("PrimaryDNS error.\n");

+        } else {

+            LOGE("PrimaryDNS : %s\n", linkState->v4_pdns);

+        }

+

+        if(inet_ntop(AF_INET, &(ipv4.SecondaryDNS), linkState->v4_sdns , GSW_DNS_ADDR_MAX_LEN) == NULL) {

+            LOGE("SecondaryDNS error.\n");

+        } else {

+            LOGE("SecondaryDNS : %s\n", linkState->v4_sdns);

+        }

+    }

+

+    LOGE("ipv6.valid = %d\n", ipv6.valid);

+    if(ipv6.valid)

+    {

+        //parse ipv6_addr,gw,dns,sdns

+        if(ipv6_2_str(&(ipv6.IPV6Addr), linkState->v6_ip)) {

+            LOGE("IPv6 error.\n");

+        } else {

+            LOGE("IPv6 : %s\n", linkState->v6_ip);

+        }

+

+        if(ipv6_2_str(&(ipv6.PrimaryDNS), linkState->v6_pdns)) {

+            LOGE("PrimaryDNS error.\n");

+        } else {

+            LOGE("PrimaryDNS : %s\n", linkState->v6_pdns);

+        }

+

+        if(ipv6_2_str(&(ipv6.SecondaryDNS), linkState->v6_sdns)) {

+            LOGE("SecondaryDNS error.\n");

+        } else {

+            LOGE("SecondaryDNS : %s\n", linkState->v6_sdns);

+        }

+    }

+

+

+

+    return GSW_HAL_SUCCESS;

+}

+

+

+static void data_call_state_change_cb(const void* data, int data_len)

+{

+    LOGE("data_call_state_change_cb() start\n");

+

+    if(data == NULL || data_len == 0)

+    {

+        return;

+    }

+

+    int ret = -1;

+

+    LOGD("Wan_State_ind_malloc start\n");

+    ret = Wan_State_ind_malloc(&linkState_arr);

+    if (ret != 0) 

+    {

+        LOGE("Wan_State_ind_malloc[0] fail\n");

+        return ;

+    }

+

+    if(linkState_arr == NULL)

+    {

+        LOGE("linkState_arr is NULL");

+        return ;

+    }

+    else

+    {

+        LOGE("linkState_arr is not NULL");

+    }

+

+    uint8 *net_data = NULL;

+    net_data = (uint8 *)data;

+    //disconnected

+    LOGE("net_data = %d\n", *net_data);

+    if(*net_data > 100 && *net_data < 200)

+    {   

+        int apn_id = *net_data - 100;

+        int handle_temp = apn_id-2;

+        LOGE("apn_id = %d\n", apn_id);

+        linkState_arr->state = 0;//disconnected

+        linkState_arr->cid = -1;

+        linkState_arr->handle = handle_temp;

+

+        //get data_call_state

+        if(!data_call_lock)

+        {

+            data_call_state_query(apn_id, linkState_arr);

+        }

+

+        if(gsw_data_call_evt_cb)

+        {

+            gsw_data_call_evt_cb(linkState_arr);

+        }

+    }

+

+    else if(*net_data > 200 && *net_data < 220)

+    {

+        LOGE("cid[%d] is open.\n", *net_data - 200);

+        int apn_id = *net_data-200;

+        int handle_temp = apn_id-2;

+

+        linkState_arr->state = 2;//connected

+        linkState_arr->cid = apn_id;

+        linkState_arr->handle = handle_temp;

+        //get data_call_state

+        if(!data_call_lock)

+        {

+            data_call_state_query(apn_id, linkState_arr);

+        }

+        

+        if(gsw_data_call_evt_cb)

+        {

+            gsw_data_call_evt_cb(linkState_arr);

+        }

+    }

+

+    else if(*net_data > 220)

+    {

+        LOGE("cid [%d] is reopen.\n", *net_data - 220);

+        int apn_id = *net_data-220;

+        int handle_temp = apn_id-2;

+        

+        linkState_arr->state = 2;//connected

+        linkState_arr->cid = apn_id;

+        linkState_arr->handle = handle_temp;

+

+        //get data_call_state

+        if(!data_call_lock)

+        {

+            data_call_state_query(apn_id, linkState_arr);

+        }

+

+        if(gsw_data_call_evt_cb)

+        {

+            gsw_data_call_evt_cb(linkState_arr);

+        }

+    }

+

+    else if(*net_data == 1)

+    {

+        LOGE("pdp is open.\n");

+    }

+

+    else

+    {

+        LOGE("unknown param [%d].\n", *net_data);

+    }

+

+    ret = Wan_State_ind_free(&linkState_arr);

+    if (ret != 0) 

+    {

+        LOGE("Wan_State_ind_free fail\n");

+    }

+

+}

+

+

+

+

+

+

+/**

+ * @brief datacall sdk init

+ * @param  [in] evt_cb callback function for data connection state change event

+ * call back;

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_data_call_init(gsw_data_call_evt_cb_t evt_cb)

+{

+    int ret;

+    ret = mbtk_data_api_import();

+    if (ret != 0) 

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    if(data_init_flag != 0 && data_info_handle != NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    if (ret != GSW_HAL_SUCCESS) 

+    {

+        LOGE("mbtk_data_api_import fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    data_info_handle = (mbtk_info_handle_t*)mbtk_info_handle_get();

+    if (data_info_handle == NULL) 

+    {

+        LOGE("mbtk_info_handle_get fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    ret = mbtk_pdp_state_change_cb_reg((mbtk_info_handle_t*)data_info_handle, data_call_state_change_cb);

+    if (ret != 0) 

+    {

+        LOGE("mbtk_pdp_state_change_cb_reg fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    gsw_data_call_evt_cb = evt_cb;

+    data_init_flag = 1;

+    return GSW_HAL_SUCCESS;

+}

+

+

+/**

+ * @brief data_call sdk deinit

+ * @param 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_data_call_deinit(void)

+{

+    int ret;

+    if(data_init_flag == 0 && data_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    ret = mbtk_info_handle_free((mbtk_info_handle_t**)&data_info_handle);

+    if (ret != 0) 

+    {

+        LOGE("mbtk_info_handle_free fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    data_init_flag = 0;

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief set apn parameters for data call

+ * @param  [in/out] LinkInf apn info for pub or private datacall

+ * inlcude apn name  mcc mnc, passwork apnid  type cid etc

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_data_call_set_apn(Link_Info_s *LinkInf)

+{

+    if(data_init_flag == 0 && data_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    if(LinkInf == NULL)

+    {

+        LOGE("apn info is null\n");

+        return GSW_HAL_FAIL;

+    }

+

+    int ret = 0;

+    mbtk_ip_type_enum ip_type;

+    int auth_type = -1;

+

+    //pdp type

+    if(strcmp(LinkInf->normalProtocol,"IPV4") == 0)

+    {

+        ip_type = MBTK_IP_TYPE_IP;

+        LOGE("pdp_type(protocol) is IPV4\n");

+    }

+    else if(strcmp(LinkInf->normalProtocol,"IPV6") == 0)

+    {

+        ip_type = MBTK_IP_TYPE_IPV6;

+        LOGE("pdp_type(protocol) is IPV6\n");

+    }

+    else if(strcmp(LinkInf->normalProtocol,"IPV4V6") == 0)

+    {

+        ip_type = MBTK_IP_TYPE_IPV4V6;

+        LOGE("pdp_type(protocol) is IPV4V6\n");

+    }

+    else

+    {

+        LOGE("pdp_type(protocol) error\n");

+        return GSW_HAL_FAIL;

+    }

+

+    //auth type

+    auth_type = atoi(LinkInf->authType);

+

+    ret = mbtk_apn_set(data_info_handle, LinkInf->handle+2, ip_type, LinkInf -> apn, LinkInf -> usr, LinkInf -> pwd, (const void *)auth_type);

+

+    if(ret != 0)

+    {

+        LOGE("mbtk_apn_set fail.");

+        return GSW_HAL_FAIL;

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+

+/**

+ * @brief set apn parameters for data call

+ * @param  [in] linkid data connetion link number

+ * @param  [in/out] LinkInf link info req: apn info for pub or private datacall

+ * inlcude apn name  mcc mnc, passwork apnid etc

+ * resp: data call link state ipaddress type  etc

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_data_call_connect(int linkid, Link_Info_s *LinkInf)

+{

+    int ret = -1;

+    if(data_init_flag == 0 && data_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    if(LinkInf == NULL)

+    {

+        LOGE("apn info is null\n");

+        return GSW_HAL_FAIL;

+    }

+

+    data_call_lock = 1;

+    ret = mbtk_data_call_start((mbtk_info_handle_t*)data_info_handle, linkid + 2, 0, FALSE, 0);

+    data_call_lock = 0;

+    if(ret != 0)

+    {

+        LOGE("mbtk_data_call_start fail,\n");

+        return GSW_HAL_FAIL;

+    }

+

+    uint8_t cid_temp = (uint8_t)(linkid + 202);

+    data_call_state_change_cb(&cid_temp,1);

+

+    return GSW_HAL_SUCCESS;

+}

+

+

+/**

+ * @brief set apn parameters for data call

+ * @param  [in] linkid 

+ * @param  [in/out] LinkInf link info req: apn info for pub or private datacall

+ * inlcude apn name  mcc mnc, passwork apnid etc

+ * resp: data call link state ipaddress type  etc

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_data_call_disconnect(int linkid, Link_Info_s *LinkInf)

+{

+    int ret = -1;

+    if(data_init_flag == 0 && data_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    if(LinkInf == NULL)

+    {

+        LOGE("apn info is null\n");

+        return GSW_HAL_FAIL;

+    }

+    data_call_lock = 1;

+    ret = mbtk_data_call_stop((mbtk_info_handle_t*)data_info_handle, linkid + 2, 15);

+    data_call_lock = 0;

+    if(ret != 0)

+    {

+        LOGE("mbtk_data_call_stop fail,ret = %d\n",ret);

+        return GSW_HAL_FAIL;

+    }

+

+    uint8_t cid_temp = (uint8_t)(linkid + 102);

+    data_call_state_change_cb(&cid_temp,1);

+

+    return GSW_HAL_SUCCESS;

+}

+

+

+/*

+ * @brief get mobile operator name

+   @param [in] linkid apn id

+   @param [out] data_pkt obtian actual data call network card data traffic

+   @retval 0: success

+   @retval 0: other: fail

+ */

+int gsw_get_data_call_pkt_stats(int linkid, gsw_data_pkt_stats *data_pkt)

+{

+    char temp_linkid[12] = {0};

+    char interface_name[32] = {0};

+    sprintf(temp_linkid,"%d",linkid+1);

+    snprintf(interface_name, sizeof(interface_name),"ccinet%s", temp_linkid);

+    

+    uint64_t tx_bytes = 0;

+    uint64_t tx_packets = 0;

+    uint64_t tx_dropped = 0;

+    uint64_t rx_bytes = 0;

+    uint64_t rx_packets = 0;

+    uint64_t rx_dropped = 0;

+    char command[128] = {0};

+    char* temp;

+    char buffer[512] = {0};

+

+    snprintf(command, sizeof(command), "ifconfig %s", interface_name);

+

+    FILE *fp = popen(command, "r");

+    if(fp == NULL)

+    {

+        LOGE("popen fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    //read line by line

+    while (fgets(buffer, sizeof(buffer), fp) != NULL) {

+        //  TX bytes

+        if (strstr(buffer, "TX bytes")) {

+            temp = strstr(buffer, "TX bytes");

+            sscanf(temp, " TX bytes:%llu ", &tx_bytes);

+        }

+        //  TX packets

+        if (strstr(buffer, "TX packets")) {

+            sscanf(buffer, " TX packets:%llu ", &tx_packets);

+            sscanf(buffer, " TX packets:%*u errors:%*u dropped:%llu", &tx_dropped);

+        }

+        //  RX bytes

+        if (strstr(buffer, "RX bytes")) {

+            LOGE("RX bytes %s\n",strstr(buffer, "RX bytes"));

+            sscanf(buffer, " RX bytes:%llu ", &rx_bytes);

+        }

+        //  RX packets

+        if (strstr(buffer, "RX packets")) {

+            sscanf(buffer, " RX packets:%llu ", &rx_packets);

+            sscanf(buffer, " RX packets:%*u errors:%*u dropped:%llu", &rx_dropped);

+        }

+    }

+

+    // 关闭管道

+    pclose(fp);

+

+    // 输出结果

+    LOGE("TX Bytes: %llu\n", tx_bytes);

+    LOGE("TX Packets: %llu\n", tx_packets);

+    LOGE("TX Dropped: %llu\n", tx_dropped);

+    LOGE("RX Bytes: %llu\n", rx_bytes);

+    LOGE("RX Packets: %llu\n", rx_packets);

+    LOGE("RX Dropped: %llu\n", rx_dropped);

+

+    if(data_pkt == NULL)

+    {

+        LOGE("data_pkt is null\n");

+        return GSW_HAL_FAIL;

+    }

+

+    else

+    {

+        data_pkt->tx_bytes = tx_bytes;

+        data_pkt->tx_pkts = tx_packets;

+        data_pkt->tx_dropped_pkts = tx_dropped;

+        data_pkt->rx_bytes = rx_bytes;

+        data_pkt->rx_pkts = rx_packets;

+        data_pkt->rx_dropped_pkts = rx_dropped;

+    }

+    

+    return GSW_HAL_SUCCESS;

+

+}

diff --git a/mbtk/libgsw_lib/gsw_ecall.c b/mbtk/libgsw_lib/gsw_ecall.c
new file mode 100755
index 0000000..e2c6d8f
--- /dev/null
+++ b/mbtk/libgsw_lib/gsw_ecall.c
@@ -0,0 +1,1193 @@
+#include <stdlib.h>

+#include <stdio.h>

+#include <string.h>

+#include <sys/stat.h>

+#include <sys/types.h>

+#include <unistd.h>

+#include <dlfcn.h>

+#include <stdint.h>

+

+#include <errno.h>

+#include <stdbool.h>

+#include <pthread.h>

+

+#include "gsw_ecall.h"

+

+#define RIL_MAX_NUMBER_LEN 40

+#define MBTK_ECALL_MSD_LEN_MAX      600

+

+#ifndef LOG_ERR_LEVEL

+#define LOG_ERR_LEVEL  3      /* error conditions */

+#endif

+#ifndef LOG_WARN_LEVEL

+#define LOG_WARN_LEVEL 4   /* warning conditions */

+#endif

+#ifndef LOG_INFO_LEVEL

+#define LOG_INFO_LEVEL 6      /* informational */

+#endif

+#ifndef LOG_DEBUG_LEVEL

+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */

+#endif

+#ifndef LOG_VERBOSE_LEVEL

+#define LOG_VERBOSE_LEVEL 8

+#endif

+

+#define LOGV(fmt, args ...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGI(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGD(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGW(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGE(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+typedef void (*mbtk_log)(int level, const char *format,...);

+

+

+typedef unsigned int uint32;

+typedef unsigned char uint8;

+typedef unsigned short uint16;

+

+typedef enum {

+    MBTK_ECALL_URC_ID_ALACK = 0,    // AL-ACK signal received (refer to : urc_data)

+    MBTK_ECALL_URC_ID_SYNC_LOST,    // eIM lost synchronization with PSAP

+                                    // (A resynch occurs after the synchronization is lost.)

+    MBTK_ECALL_URC_ID_NACK,         // NACK signal received

+    MBTK_ECALL_URC_ID_RESERVED_3,

+    MBTK_ECALL_URC_ID_RESERVED_4,

+    MBTK_ECALL_URC_ID_RESERVED_5,   // 5

+    MBTK_ECALL_URC_ID_3GPP_FATAL,   // eIM is terminated: fatal error (3GPP Abort function)

+    MBTK_ECALL_URC_ID_CALL_DROP,    // eIM is terminated: call drop

+    MBTK_ECALL_URC_ID_GENERIC,      // Generic error

+    MBTK_ECALL_URC_ID_MSD_REQ,      // PSAP request MSD (Only for PULL modem)

+    MBTK_ECALL_URC_ID_MSD_SEND_START,   // 10 : eIM starts sending MSD

+    MBTK_ECALL_URC_ID_INITIATION,   // The eIM starts sending the Initiation signal (Only for PUSH modem).

+                                    // It also indicates that the call setup is completed.

+    MBTK_ECALL_URC_ID_SEND_MSD,     // PUSH: SEND_MSD -> MSD_SEND_START

+                                    // PULL: SEND_MSD -> MSD_REQ -> MSD_SEND_START

+    MBTK_ECALL_URC_ID_SEND_MSD_FULL,// SEND MSD signal received too often, PSAP sync failure assumed

+    MBTK_ECALL_URC_ID_SYNCED_PSAP,  // IVS eIM is synced with PSAP

+    MBTK_ECALL_URC_ID_SYNCED_PSAP_EIM,  // 15: IVS eIM is synced with PSAP eIM

+    MBTK_ECALL_URC_ID_LLACK,        // Link layer ACK received

+    MBTK_ECALL_URC_ID_HLACK,        //  Higher Layer ACK received (similar to AL-ACK (#0) but without data)

+    MBTK_ECALL_URC_ID_EIM_RESET,    // The eIM transmitter idles after a full reset. The eIM transmitter is reset after sync loss

+                                    // (for example, because of the end of PSAP transmission).

+    MBTK_ECALL_URC_ID_EIM_IDLES,    // The eIM transmitter idles after the transmission of the Initiation signal (push mode)

+    MBTK_ECALL_URC_ID_MSD_UPDATE,   // 20 : MSD update request is received.

+    MBTK_ECALL_URC_ID_MSD_UPDATE_DONE, // MSD update is done.

+    MBTK_ECALL_URC_ID_MSD_UPDATE_ERR, // MSD update request cannot be processed.

+    MBTK_ECALL_URC_ID_T3_EXPIRED,   // T3 expired

+    MBTK_ECALL_URC_ID_T5_EXPIRED,   // T5 expired

+    MBTK_ECALL_URC_ID_T6_EXPIRED,   // 25 : T6 expired

+    MBTK_ECALL_URC_ID_T7_EXPIRED,   // T7 expired

+    MBTK_ECALL_URC_ID_TH_EXPIRED,   // TH expired

+    MBTK_ECALL_URC_ID_RESERVED_28,

+    MBTK_ECALL_URC_ID_RESERVED_29,

+    MBTK_ECALL_URC_ID_RESERVED_30,  // 30

+    MBTK_ECALL_URC_ID_IVS_EVENT_TIMEOUT,

+    MBTK_ECALL_URC_ID_PSAP_REQ,     // Only for ERA

+    MBTK_ECALL_URC_ID_MSD_SEND_FAIL_FOR_NG  // NG-eCall fail to transfer MSD

+} mbtk_ecall_urc_id_enum;

+

+typedef enum {

+    MBTK_CLCC = 1,

+    MBTK_CPAS,

+    MBTK_DISCONNECTED,

+} mbtk_call_enum;

+

+typedef enum {

+    MBTK_CALL_RADY,                 //MT allows commands from TA/TE

+    MBTK_CALL_UNAVAILABLE,          //MT does not allow commands from TA/TE

+    MBTK_CALL_UNKNOWN,              //MT is not guaranteed to respond to instructions

+    MBTK_CALL_RINGING,              //MT is ready for commands from TA/TE, but the ringer is active

+    MBTK_CALL_PROGRESS,             //MT is ready for commands from TA/TE, but a call is in progress

+    MBTK_CALL_ASLEEP,               //MT is unable to process commands from TA/TE because it is in a low functionality state

+    MBTK_CALL_ACTIVE,

+} mbtk_call_pas_enum;

+

+#define MBTK_ECALL_CFG_T3   (1 << MBTK_ECALL_CFG_ITEM_T3)       // ms

+#define MBTK_ECALL_CFG_T5   (1 << MBTK_ECALL_CFG_ITEM_T5)       // ms

+#define MBTK_ECALL_CFG_T6   (1 << MBTK_ECALL_CFG_ITEM_T6)       // ms

+#define MBTK_ECALL_CFG_T7   (1 << MBTK_ECALL_CFG_ITEM_T7)       // ms

+#define MBTK_ECALL_CFG_TH   (1 << MBTK_ECALL_CFG_ITEM_TH)       // ms

+#define MBTK_ECALL_CFG_TIMER_CALLBACK   (1 << MBTK_ECALL_CFG_ITEM_TIMER_CALLBACK)   // T9

+#define MBTK_ECALL_CFG_TIMER_CLEARDOWN  (1 << MBTK_ECALL_CFG_ITEM_TIMER_CLEARDOWN)  // T2

+#define MBTK_ECALL_CFG_TIMER_DEREG  (1 << MBTK_ECALL_CFG_ITEM_TIMER_DEREG)      // T10

+#define MBTK_ECALL_CFG_TIMER_DIAL   (1 << MBTK_ECALL_CFG_ITEM_TIMER_DIAL)     // "dial"

+#define MBTK_ECALL_CFG_TIMER_REDIAL (1 << MBTK_ECALL_CFG_ITEM_TIMER_REDIAL)  // "redialtmr"

+#define MBTK_ECALL_CFG_TIMER_SMS    (1 << MBTK_ECALL_CFG_ITEM_TIMER_SMS)  // "sms"        // 10

+#define MBTK_ECALL_CFG_REDIALCNT    (1 << MBTK_ECALL_CFG_ITEM_REDIALCNT)  // "redialcnt"

+#define MBTK_ECALL_CFG_SMSPROCESS   (1 << MBTK_ECALL_CFG_ITEM_SMSPROCESS)  // "smsprocess"

+#define MBTK_ECALL_CFG_SMSMSDCNT    (1 << MBTK_ECALL_CFG_ITEM_SMSMSDCNT)  // "smsmsdcnt"

+

+

+typedef void (*mbtk_info_callback_func)(const void* data, int data_len);

+

+typedef struct

+{

+    int client_fd;

+    pthread_t read_thread_id;

+    int exit_fd[2];

+    bool is_waitting;

+    pthread_cond_t cond;

+    pthread_mutex_t mutex;

+

+    pthread_mutex_t send_mutex;

+

+    // Temp response data.

+    uint16 info_err;

+    uint16 data_len;

+    void *data;

+

+    //mbtk wyq for server_ready_status add start

+    char server_ready_status;

+    //mbtk wyq for server_ready_status add end

+

+    mbtk_info_callback_func net_state_cb;

+    mbtk_info_callback_func call_state_cb;

+    mbtk_info_callback_func sms_state_cb;

+    mbtk_info_callback_func radio_state_cb;

+    mbtk_info_callback_func sim_state_cb;

+    mbtk_info_callback_func pdp_state_cb;

+    //add signal by xr

+    mbtk_info_callback_func signal_state_cb;

+} mbtk_info_handle_t;

+

+typedef enum {

+    MBTK_ECALL_CFG_ITEM_T3 = 0,         // ms

+    MBTK_ECALL_CFG_ITEM_T5,             // ms

+    MBTK_ECALL_CFG_ITEM_T6,             // ms

+    MBTK_ECALL_CFG_ITEM_T7,             // ms

+    MBTK_ECALL_CFG_ITEM_TH,             // ms

+    MBTK_ECALL_CFG_ITEM_TIMER_CALLBACK,     // T9       // 5

+    MBTK_ECALL_CFG_ITEM_TIMER_CLEARDOWN,     // T2

+    MBTK_ECALL_CFG_ITEM_TIMER_DEREG,    // T10

+    MBTK_ECALL_CFG_ITEM_TIMER_DIAL,     // "dial"

+    MBTK_ECALL_CFG_ITEM_TIMER_REDIAL,   // "redialtmr"

+    MBTK_ECALL_CFG_ITEM_TIMER_SMS,      // "sms"        // 10

+    MBTK_ECALL_CFG_ITEM_REDIALCNT,      // "redialcnt"

+    MBTK_ECALL_CFG_ITEM_SMSPROCESS,     // "smsprocess"

+    MBTK_ECALL_CFG_ITEM_SMSMSDCNT,       // "smsmsdcnt"

+

+    MBTK_ECALL_CFG_ITEM_MAX

+} mbtk_ecall_cfg_item_enum;

+

+

+typedef enum {

+    MBTK_ECALL_MSD_ITEM_VERSION = 0,

+    MBTK_ECALL_MSD_ITEM_MSG_ID,

+    MBTK_ECALL_MSD_ITEM_CONTROLTYPE,

+    MBTK_ECALL_MSD_ITEM_VIN,

+    MBTK_ECALL_MSD_ITEM_STORAGETYPE,

+    MBTK_ECALL_MSD_ITEM_TIMESTAMP,

+    MBTK_ECALL_MSD_ITEM_LOCATION,

+    MBTK_ECALL_MSD_ITEM_DIRECTION,

+    MBTK_ECALL_MSD_ITEM_LOCATIONN1,

+    MBTK_ECALL_MSD_ITEM_LOCATIONN2,

+    MBTK_ECALL_MSD_ITEM_NUMBEROFOCCUPANTS,

+    MBTK_ECALL_MSD_ITEM_ADDITIONALDATA,

+    MBTK_ECALL_MSD_ITEM_ALL_IN_ONE,

+    MBTK_ECALL_MSD_ITEM_ASI,

+    MBTK_ECALL_MSD_ITEM_VEHICLE_DIAGNOSTIC,

+    MBTK_ECALL_MSD_ITEM_CRASH_INFO,

+    MBTK_ECALL_MSD_ITEM_GNSS_TYPE

+} mbtk_ecall_msd_item_enum;

+    

+typedef enum {

+    MBTK_ECALL_ONLY_TYPE_DISABLE = 0,

+    MBTK_ECALL_ONLY_TYPE_ENABLE_ECALL,

+    MBTK_ECALL_ONLY_TYPE_ENABLE_NG_ECALL,

+    MBTK_ECALL_ONLY_TYPE_ENABLE_ALL,

+    MBTK_ECALL_ONLY_TYPE_CONF_NUM,

+    MBTK_ECALL_ONLY_TYPE_NORMAL

+} mbtk_ecall_only_type_enum;

+

+typedef struct

+{

+    mbtk_ecall_msd_item_enum item_type;

+

+    uint8 data[64];

+} mbtk_ecall_msd_cfg_info_t;

+

+typedef enum {

+    MBTK_ECALL_SIM_TYPE_NO_SUPPORT = 0,

+    MBTK_ECALL_SIM_TYPE_SUPPORT_ECALL,

+    MBTK_ECALL_SIM_TYPE_SUPPORT_ECALL_ONLY

+} mbtk_ecall_sim_type_enum;

+

+

+typedef struct {

+    mbtk_ecall_only_type_enum active : 8;

+    mbtk_ecall_sim_type_enum sim_type : 8;     // Only for GET.

+    uint8 test_num[RIL_MAX_NUMBER_LEN];

+    uint8 reconfig_num[RIL_MAX_NUMBER_LEN];

+} mbtk_ecall_only_info_t;

+

+typedef enum {

+    MBTK_ECALL_MODE_TYPE_EU = 0,

+    MBTK_ECALL_MODE_TYPE_ERA

+} mbtk_ecall_mode_type_enum;

+

+

+typedef enum {

+    MBTK_ECALL_DIAL_TYPE_TEST = 0,

+    MBTK_ECALL_DIAL_TYPE_RECONFIG,

+    MBTK_ECALL_DIAL_TYPE_MANUALLY,

+    MBTK_ECALL_DIAL_TYPE_AUTO,

+    MBTK_ECALL_DIAL_TYPE_NOT_ACTIVATED,

+    MBTK_ECALL_DIAL_TYPE_RELEASE

+} mbtk_ecall_dial_type_enum;

+

+typedef struct {

+    uint32 type;            // mbtk_ecall_cfg_item_enum

+

+#if 0

+    uint32 timer_t3;    // ms

+    uint32 timer_t5;    // ms

+    uint32 timer_t6;    // ms

+    uint32 timer_t7;    // ms

+    uint32 timer_th;    // ms

+

+    uint32 timer_callback; // s (T9)

+    uint32 timer_cleardown; // s (T2)

+    uint32 timer_dereg;     // s (T10)

+    uint32 timer_dial;  // s

+    uint32 timer_redialtmr; // s

+    uint32 timer_sms;   // s

+

+    uint32 redialcnt;

+    uint32 smsprocess;

+    uint32 smsmsdcnt;

+#else

+    uint8 data_valid[MBTK_ECALL_CFG_ITEM_MAX];

+    uint32 data[MBTK_ECALL_CFG_ITEM_MAX];

+#endif

+} mbtk_ecall_cfg_info_t;

+

+

+typedef struct

+{

+    uint8 urc_id;

+    uint8 urc_data[5];

+} mbtk_ril_ecall_state_info_t;

+

+

+typedef mbtk_info_handle_t* (*mbtk_info_handle_get)(void);

+static mbtk_info_handle_get mbtk_info_handle_get_ptr = NULL;

+

+typedef int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);

+static mbtk_info_handle_free mbtk_info_handle_free_ptr = NULL;

+

+static gsw_eu_ecall_status_cb_f  gsw_eu_ecall_status_cb;

+

+static pthread_t gsw_ecall_status_cb_thread;

+static pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;

+static pthread_cond_t g_cond = PTHREAD_COND_INITIALIZER;

+static bool g_thread_running = false;

+

+static uint32_t g_sta_cb_id = 0;

+static gsw_eu_ecall_msd_trans_status_e  g_msd_send_status = 0;

+

+#define LIB_PATH "/lib/libmbtk_lib.so"

+

+

+

+

+

+

+typedef int (*mbtk_ecall_msd_set)(mbtk_info_handle_t* handle, const void* msd);

+static mbtk_ecall_msd_set mbtk_ecall_msd_set_ptr = NULL;

+

+typedef int (*mbtk_ecall_push)(mbtk_info_handle_t* handle);

+static mbtk_ecall_push mbtk_ecall_push_ptr = NULL;

+

+typedef int  (*mbtk_ecall_only_set)(mbtk_info_handle_t* handle, const mbtk_ecall_only_info_t* info);

+static mbtk_ecall_only_set mbtk_ecall_only_set_ptr = NULL;

+

+

+typedef int (*mbtk_ecall_reg_set)(mbtk_info_handle_t* handle, int reg);

+static mbtk_ecall_reg_set mbtk_ecall_reg_set_ptr = NULL;

+

+typedef int (*mbtk_ecall_dial_start)(mbtk_info_handle_t* handle, mbtk_ecall_dial_type_enum type);

+static   mbtk_ecall_dial_start mbtk_ecall_dial_start_ptr = NULL;

+

+typedef int (*mbtk_ecall_mode_set)(mbtk_info_handle_t* handle, mbtk_ecall_mode_type_enum mode);

+static mbtk_ecall_mode_set mbtk_ecall_mode_set_ptr = NULL;

+

+

+typedef int (*mbtk_ecall_cfg_set)(mbtk_info_handle_t* handle, const mbtk_ecall_cfg_info_t *cfg);

+static mbtk_ecall_cfg_set mbtk_ecall_cfg_set_ptr = NULL;

+

+typedef int (*mbtk_ecall_cfg_get)(mbtk_info_handle_t* handle, mbtk_ecall_cfg_info_t* cfg);

+static mbtk_ecall_cfg_get mbtk_ecall_cfg_get_ptr = NULL;

+

+typedef int (*mbtk_ecall_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);

+static mbtk_ecall_state_change_cb_reg mbtk_ecall_state_change_cb_reg_ptr = NULL;

+

+typedef int (*mbtk_call_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);

+static mbtk_call_state_change_cb_reg mbtk_call_state_change_cb_reg_ptr = NULL;

+

+

+

+static int state_t = -1;

+

+

+

+typedef struct

+{

+    uint8 call_wait;

+    uint8 dir1;

+    uint8 dir;

+    uint8 state;

+    uint8 mode;

+    uint8 mpty;

+    char phone_number[100];

+    uint8 type;

+    uint8 pas;

+    uint8 disconnected_id;

+    uint8 end_reason[128];

+} __attribute__((packed)) mbtk_call_info_t;

+

+

+//static mbtk_info_handle_t* ecall_info_handle = NULL;

+

+

+typedef void (*mbtk_log_init)(char *path, char *tag);

+static mbtk_log_init  mbtk_log_init_ptr = NULL;

+

+static void *handle = NULL;

+typedef void (*mbtk_log)(int level, const char *format,...);

+static mbtk_log fun_ptr_log = NULL;

+static int ecall_init_flag = 0;

+static mbtk_info_handle_t* ecall_info_handle = NULL;

+

+

+

+static uint8_t  fail_redial = 1;

+

+static gsw_eu_ecall_event_cb_f gsw_eu_ecall_event_cb = NULL;

+static bool g_setevent_cb = false;

+

+static void mbtk_send_singnal()

+{

+    pthread_mutex_lock(&g_mutex);

+    pthread_cond_signal(&g_cond);

+    pthread_mutex_unlock(&g_mutex);

+

+}

+

+static void mbtk_wait_signal()

+{

+

+    pthread_mutex_lock(&g_mutex);

+    pthread_cond_wait(&g_cond, &g_mutex); 

+    pthread_mutex_unlock(&g_mutex);

+}

+

+static void mbtk_ecall_api_ptr_deinit()

+{

+    dlclose(handle);

+    handle = NULL;

+    mbtk_log_init_ptr = NULL;

+    mbtk_info_handle_get_ptr=NULL;

+    mbtk_info_handle_free_ptr=NULL;

+    mbtk_ecall_msd_set_ptr=NULL;

+    mbtk_ecall_push_ptr=NULL;

+    mbtk_ecall_only_set_ptr=NULL;

+    mbtk_ecall_reg_set_ptr=NULL;

+    mbtk_ecall_dial_start_ptr=NULL;

+    mbtk_ecall_mode_set_ptr=NULL;

+    mbtk_ecall_cfg_set_ptr=NULL;

+    mbtk_ecall_cfg_get_ptr=NULL;

+    mbtk_ecall_state_change_cb_reg_ptr=NULL;

+    gsw_eu_ecall_status_cb=NULL;

+    gsw_eu_ecall_event_cb=NULL;

+    g_setevent_cb=false;

+    mbtk_ecall_only_set_ptr = NULL;

+    fun_ptr_log=NULL;

+    

+}

+

+

+static int mbtk_ecall_api_import()

+{

+    handle = dlopen(LIB_PATH, RTLD_NOW);

+    if (handle == NULL) 

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    if(fun_ptr_log == NULL)

+    {

+        fun_ptr_log = (mbtk_log)dlsym(handle, "mbtk_log");

+        if(fun_ptr_log ==  NULL)

+        {

+            return GSW_HAL_FAIL;

+        }

+    }

+

+    if(mbtk_log_init_ptr == NULL)

+    {

+        mbtk_log_init_ptr = (mbtk_log_init)dlsym(handle, "mbtk_log_init");

+        if(mbtk_log_init_ptr ==  NULL)

+        {

+            return GSW_HAL_FAIL;            

+        }

+    }

+    

+    if(mbtk_info_handle_get_ptr == NULL)

+    {

+        mbtk_info_handle_get_ptr = (mbtk_info_handle_get)dlsym(handle, "mbtk_info_handle_get");

+        if(mbtk_info_handle_get_ptr ==  NULL)

+        {

+            return GSW_HAL_FAIL;            

+        }

+    }

+    

+    if(mbtk_info_handle_free_ptr == NULL)

+    {

+        mbtk_info_handle_free_ptr = (mbtk_info_handle_free)dlsym(handle, "mbtk_info_handle_free");

+        if(mbtk_info_handle_free_ptr ==  NULL)

+        {

+            return GSW_HAL_FAIL;            

+        }

+    }

+    

+    

+    

+    if(mbtk_ecall_msd_set_ptr == NULL)

+    {

+        mbtk_ecall_msd_set_ptr = (mbtk_ecall_msd_set)dlsym(handle, "mbtk_ecall_msd_set");

+        if(mbtk_ecall_msd_set_ptr ==  NULL)

+        {

+            return GSW_HAL_FAIL;            

+        }

+    }

+

+    if(mbtk_ecall_push_ptr == NULL)

+    {

+        mbtk_ecall_push_ptr = (mbtk_ecall_push)dlsym(handle, "mbtk_ecall_push");

+        if(mbtk_ecall_push_ptr ==  NULL)

+        {

+            return GSW_HAL_FAIL;            

+        }

+    }

+    if(mbtk_ecall_only_set_ptr == NULL)

+    {

+        mbtk_ecall_only_set_ptr = (mbtk_ecall_only_set)dlsym(handle, "mbtk_ecall_only_set");

+        if(mbtk_ecall_only_set_ptr ==  NULL)

+        {

+            return GSW_HAL_FAIL;            

+        }

+    }

+

+    if(mbtk_ecall_reg_set_ptr == NULL)

+    {

+        mbtk_ecall_reg_set_ptr = (mbtk_ecall_reg_set)dlsym(handle, "mbtk_ecall_reg_set");

+        if(mbtk_ecall_reg_set_ptr ==  NULL)

+        {

+            return GSW_HAL_FAIL;            

+        }

+    }            

+    if(mbtk_ecall_dial_start_ptr == NULL)

+    {

+        mbtk_ecall_dial_start_ptr = (mbtk_ecall_dial_start)dlsym(handle, "mbtk_ecall_dial_start");

+        if(mbtk_ecall_dial_start_ptr ==  NULL)

+        {

+            return GSW_HAL_FAIL;            

+        }

+    }

+    

+    if(mbtk_ecall_mode_set_ptr == NULL)

+    {

+        mbtk_ecall_mode_set_ptr = (mbtk_ecall_mode_set)dlsym(handle, "mbtk_ecall_mode_set");

+        if(mbtk_ecall_mode_set_ptr ==  NULL)

+        {

+            return GSW_HAL_FAIL;            

+        }

+    }

+

+    if(mbtk_ecall_cfg_set_ptr == NULL)

+    {

+        mbtk_ecall_cfg_set_ptr = (mbtk_ecall_cfg_set)dlsym(handle, "mbtk_ecall_cfg_set");

+        if(mbtk_ecall_cfg_set_ptr ==  NULL)

+        {

+            return GSW_HAL_FAIL;            

+        }

+    }

+    if(mbtk_ecall_cfg_get_ptr == NULL)

+    {

+        mbtk_ecall_cfg_get_ptr = (mbtk_ecall_cfg_get)dlsym(handle, "mbtk_ecall_cfg_get");

+        if(mbtk_ecall_cfg_get_ptr ==  NULL)

+        {

+            return GSW_HAL_FAIL;            

+        }

+    }

+    if(mbtk_ecall_state_change_cb_reg_ptr == NULL)

+    {

+        mbtk_ecall_state_change_cb_reg_ptr = (mbtk_ecall_state_change_cb_reg)dlsym(handle, "mbtk_ecall_state_change_cb_reg");

+        if(mbtk_ecall_state_change_cb_reg_ptr ==  NULL)

+        {

+            return GSW_HAL_FAIL;            

+        }

+    }

+    

+    if(mbtk_call_state_change_cb_reg_ptr == NULL)

+    {

+        mbtk_call_state_change_cb_reg_ptr = (mbtk_call_state_change_cb_reg)dlsym(handle, "mbtk_call_state_change_cb_reg");

+        if(mbtk_call_state_change_cb_reg_ptr ==  NULL)

+        {

+            return GSW_HAL_FAIL;            

+        }

+    }

+    

+    return GSW_HAL_SUCCESS;

+}

+

+

+static void gsw_call_state_change_cb(const void *data, int data_len)

+{

+    mbtk_call_info_t *reg = (mbtk_call_info_t *)data;

+    switch (reg->call_wait)

+    {

+        case MBTK_CLCC:

+            {

+                LOGD("RING : %d, %d, %d, %d, %d, %s, %d, %d", reg->dir1, reg->dir, reg->state, reg->mode, reg->mpty, reg->phone_number, reg->type, reg->disconnected_id);

+                switch(reg->state)

+                {

+                    case 0:

+                        state_t = 0;

+                        LOGD("reg->state = GSW_VOICE_CALL_CONNECTED ");

+                        break;

+                    case 1:

+                        //state_t = GSW_VOICE_CALL_HOLDING;

+                        LOGD("reg->state = GSW_VOICE_CALL_HOLDING ");

+                        break;

+                    case 2:

+                        //state_t = GSW_VOICE_CALL_DIALING;

+                        LOGD("reg->state = GSW_VOICE_CALL_DIALING ");

+                        break;

+                    case 3:

+                        //state_t = GSW_VOICE_CALL_ALERTING;

+                        LOGD("reg->state = GSW_VOICE_CALL_ALERTING ");

+                        break;

+                    case 4:

+                        //state_t = GSW_VOICE_CALL_INCOMING;

+                        

+                        LOGD("reg->state = GSW_VOICE_CALL_INCOMING  ");

+                        break;

+                    case 5:

+                        //state_t = GSW_VOICE_CALL_WAITING;

+                        LOGD("reg->state = GSW_VOICE_CALL_WAITING  ");

+                        break;

+                    case 6:

+                        //state_t = GSW_VOICE_CALL_END;

+                        LOGD("reg->state = GSW_VOICE_CALL_END ");

+                        break;

+                }

+               

+                g_sta_cb_id = reg->dir1;

+            }

+        

+            break;

+        default:

+            LOGE("RING : None call_wait = %d", reg->call_wait);

+            break;

+    }

+}

+

+

+/**

+* @brief init the Europe Ecall voice

+* @param  [in] None

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+

+int32_t gsw_eu_ecall_voice_init(void)

+{

+    int ret =-1;

+    ret = mbtk_ecall_api_import();

+    if(ret <0)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_log_init_ptr("syslog", "GSW_ECALL");

+    

+    ecall_info_handle = mbtk_info_handle_get_ptr();

+    if(ecall_info_handle == NULL)

+    {

+        LOGE("mbtk_info_handle_get_ptr fail!!!");

+        return GSW_HAL_FAIL;

+    }

+    

+    if(ecall_init_flag == 0)

+    {

+        ecall_init_flag =  1;

+    }

+    ret = mbtk_call_state_change_cb_reg_ptr(ecall_info_handle, gsw_call_state_change_cb);

+    if(ret < 0)

+    {

+        LOGE("mbtk_call_state_change_cb_reg_ptr failed");

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+

+}

+

+

+/**

+* @brief deinit the Europe Ecall voice

+* @param  [in] None

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_eu_ecall_voice_deinit(void)

+{

+    int ret = -1;

+    if(ecall_info_handle == NULL || ecall_init_flag ==0)

+    {

+        LOGE("No init can not deinit");

+        return GSW_HAL_FAIL;

+    }

+

+    g_thread_running = false;

+    mbtk_send_singnal();

+    if (gsw_ecall_status_cb_thread != 0)

+    {

+        pthread_cancel(gsw_ecall_status_cb_thread);

+        pthread_join(gsw_ecall_status_cb_thread, NULL);

+        gsw_ecall_status_cb_thread = 0;

+    }

+    

+    ret = mbtk_info_handle_free_ptr(&ecall_info_handle);

+    if(ret < 0 )

+    {

+        LOGE("mbtk_info_handle_free handle faile");

+    }

+    ecall_info_handle = NULL;

+    ecall_init_flag = 0;

+    

+    mbtk_ecall_api_ptr_deinit();

+    return GSW_HAL_SUCCESS;

+

+}

+

+

+/**

+* @brief start a Europe Ecall

+* @param  [in] gsw_eu_ecall_info_t *p_info: ecall info

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_eu_ecall_start(gsw_eu_ecall_info_t *p_info)

+{

+    int ret = -1;

+    mbtk_ecall_dial_type_enum ecall_type= -1;

+    mbtk_ecall_only_info_t only_info;

+

+   

+    char tmp_number[GSW_EU_ECALL_MAX_PHONE_NUMBER] = {0};

+

+    char msd_data[500] = {0};

+    

+    memset(&only_info, 0, sizeof(mbtk_ecall_only_info_t));

+    

+    if(ecall_init_flag !=1)

+    {

+        return GSW_HAL_FAIL;

+    }

+    

+    if(p_info == NULL || p_info->msd_len > GSW_EU_ECALL_MAX_MSD )

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    

+    if(p_info->type == GSW_EU_ECALL_TYPE_TEST)

+    {

+        //AT+CECALL =0

+        ecall_type = MBTK_ECALL_DIAL_TYPE_TEST;

+        snprintf(tmp_number,sizeof(tmp_number),"%s",p_info->ecall_number);

+        strncpy((char *)only_info.test_num,tmp_number,RIL_MAX_NUMBER_LEN);

+        //snprintf((char*)only_info.test_num,sizeof(only_info.test_num),"%s",p_info->ecall_number);

+    }

+    

+    if(p_info->type == GSW_EU_ECALL_TYPE_RECONFIG  )

+    {

+        //AT+CECALL =1

+        ecall_type = MBTK_ECALL_DIAL_TYPE_RECONFIG;

+        snprintf(tmp_number,sizeof(tmp_number),"%s",p_info->ecall_number);

+        strncpy((char *)only_info.test_num,tmp_number,RIL_MAX_NUMBER_LEN);

+    }

+    

+    if(p_info->type == GSW_EU_ECALL_TYPE_EMERGENCY  )

+    {

+        if(p_info->auto_trigger)

+        {

+            //AT+CECALL =1

+            ecall_type = MBTK_ECALL_DIAL_TYPE_AUTO;

+        }

+        else

+        {

+            //AT+CECALL =1

+            ecall_type = MBTK_ECALL_DIAL_TYPE_MANUALLY;//手动

+        }

+        

+    }

+

+    //msd

+    for (int i = 0; i < p_info->msd_len; i++)

+    {

+        sprintf(msd_data + (i * 2), "%02x", p_info->msd[i]);

+    }

+

+    //

+    only_info.active = MBTK_ECALL_ONLY_TYPE_DISABLE ;

+

+    ret=mbtk_ecall_only_set_ptr(ecall_info_handle,&only_info);

+    if (ret != 0)

+    {

+        LOGE("mbtk_ecall_only_set_success failed");

+        return GSW_HAL_FAIL;

+    }

+

+    //set msd

+    ret= mbtk_ecall_msd_set_ptr(ecall_info_handle,(const void*)msd_data);

+    if (ret != 0)

+    {

+        LOGE("mbtk_ecall_msd_set_ptr failed");

+        return GSW_HAL_FAIL;

+    }

+

+    //dial

+    ret= mbtk_ecall_dial_start_ptr(ecall_info_handle,ecall_type);

+    if (ret != 0)

+    {

+        LOGE("mbtk_ecall_dial_start_ptr failed");

+        return GSW_HAL_FAIL;

+    }

+    

+    //push mst

+    ret= mbtk_ecall_push_ptr(ecall_info_handle);

+    if (ret != 0)

+    {   

+        g_msd_send_status = GSW_EU_ECALL_MSD_TRANS_STATUS_FAILURE;

+        mbtk_send_singnal();

+        LOGE("mbtk_ecall_push_ptr failed");

+        return GSW_HAL_FAIL;

+    }

+    

+    g_msd_send_status = GSW_EU_ECALL_MSD_TRANS_STATUS_SUCCESS;

+    mbtk_send_singnal();

+    return GSW_HAL_SUCCESS;

+   

+}

+

+

+/**

+* @brief hangup a Europe Ecall

+* @param  [in] None

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_eu_ecall_hangup(void)

+{

+    int32_t ret = -1;

+    if(ecall_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+   

+    ret = mbtk_ecall_dial_start_ptr(ecall_info_handle,MBTK_ECALL_DIAL_TYPE_RELEASE);

+    if(ret != 0)

+    {

+        LOGE("hangup ecall faile ");

+        return GSW_HAL_FAIL;

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+* @brief using push mode send msd data

+* @param  [in] GSW_EU_ECALL_STATE_E state: ecall state

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+

+int32_t gsw_eu_ecall_updateMsd(const uint8_t *msd, uint32_t msd_len)

+{

+    int ret = -1;

+    char msd_data[500] = {0};

+    

+    if(msd == NULL || msd_len == 0 ||ecall_info_handle == NULL)

+    {

+        return GSW_HAL_MEM_INVAILD;

+    }

+

+    //msd

+    for (int i = 0; i < msd_len; i++)

+    {

+        sprintf(msd_data + i * 2, "%02x", *(msd + i));

+    }

+    ret = mbtk_ecall_msd_set_ptr(ecall_info_handle,(const void*)msd_data);

+    if (ret != 0)

+    {

+        LOGE("mbtk_ecall_msd_get_ptr failed");  

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+    

+}

+

+

+int32_t gsw_eu_ecall_pushMsd(gsw_eu_ecall_state_e state)

+{

+    int ret = -1;

+    if(ecall_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    ret = mbtk_ecall_push_ptr(ecall_info_handle);

+    if(ret != 0)

+    {   

+        g_msd_send_status = GSW_EU_ECALL_MSD_TRANS_STATUS_FAILURE;

+        mbtk_send_singnal();

+        return GSW_HAL_FAIL;

+    }

+     g_msd_send_status = GSW_EU_ECALL_MSD_TRANS_STATUS_SUCCESS;

+     mbtk_send_singnal();

+    return GSW_HAL_SUCCESS;

+

+    

+}

+

+/**

+* @brief get ecall config

+* @param  [in] None

+* @param  [out] gsw_eu_ecall_config_t *p_config: ecall config

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_eu_ecall_getConfig(gsw_eu_ecall_config_t *p_config)

+{

+

+    if(ecall_info_handle==NULL || p_config == NULL)

+    {

+        LOGE("mbtk_ecall_cfg_get() fail.");

+        return GSW_HAL_MEM_INVAILD;

+    }

+

+    p_config->fail_redial = fail_redial;

+

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+* @brief set ecall config

+* @param  [in] int32_t item: config item

+* @param  [in] gsw_eu_ecall_config_t  *p_config: config info

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+

+int32_t gsw_eu_ecall_setConfig(int32_t item, gsw_eu_ecall_config_t *p_config)

+{

+    if(ecall_info_handle == NULL || p_config == NULL)

+    {

+        LOGE("gsw_eu_ecall_setConfig no init");

+        return GSW_HAL_MEM_INVAILD;

+    }

+    

+    mbtk_ecall_cfg_info_t cfg_info = {0}; 

+    

+    int ret =-1;

+    cfg_info.type = 0;

+    

+    if(item & GSW_EU_ECALL_CONFIG_FAIL_REDIAL)

+    {

+        fail_redial = p_config->fail_redial;

+        if(p_config->fail_redial)

+        {

+            cfg_info.type |= MBTK_ECALL_CFG_TIMER_DIAL;

+            cfg_info.data[MBTK_ECALL_CFG_ITEM_TIMER_DIAL] = 60000;//timer 60s

+           

+        }

+        else

+        {

+            cfg_info.type |= MBTK_ECALL_CFG_TIMER_DIAL;

+            cfg_info.data[MBTK_ECALL_CFG_ITEM_TIMER_DIAL] = 0;

+        }

+    }

+    

+    ret = mbtk_ecall_cfg_set_ptr(ecall_info_handle, &cfg_info);

+    if (ret < 0) 

+    {

+        LOGE("mbtk_ecall_cfg_set_ptr fail");

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+

+}

+

+

+

+static void mbtk_ecall_state_change_cb(const void* data, int data_len)

+{

+    static gsw_eu_ecall_event_t event;

+    if(data)

+    {

+        mbtk_ril_ecall_state_info_t *ecall_data = (mbtk_ril_ecall_state_info_t*)data;

+        switch(ecall_data->urc_id)

+        {

+            case MBTK_ECALL_URC_ID_MSD_REQ:

+            {

+                LOGD("MBTK_ECALL_URC_ID_MSD_REQ");

+                event.process = GSW_EU_ECALL_EVENT_PROCESS_IVS_START_RECEIVED_MSD;

+                event.msdupdate = GSW_EU_ECALL_EVENT_MSDUPDATE_PSAP_REQURE_UPDATE_MSD;

+                event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_NONE;

+                event.establish = GSW_EU_ECALL_EVENT_ESTABLISH_NONE;

+                break;

+            }

+            case MBTK_ECALL_URC_ID_MSD_SEND_START:

+            {

+                LOGD("MBTK_ECALL_URC_ID_MSD_SEND_START");

+                

+                event.process = GSW_EU_ECALL_EVENT_PROCESS_IVS_START_RECEIVED_MSD;

+                event.msdupdate = GSW_EU_ECALL_EVENT_MSDUPDATE_PSAP_REQURE_UPDATE_MSD;

+                event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_NONE;

+                event.establish = GSW_EU_ECALL_EVENT_ESTABLISH_NONE;

+                break;

+            }

+            case MBTK_ECALL_URC_ID_NACK:

+            {

+                LOGD("MBTK_ECALL_URC_ID_NACK");

+                

+                event.process = GSW_EU_ECALL_EVENT_PROCESS_IVS_NACK_RECEIVED;

+                event.msdupdate = GSW_EU_ECALL_EVENT_MSDUPADTE_NONE;

+                event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_NONE;

+                event.establish = GSW_EU_ECALL_EVENT_ESTABLISH_NONE;

+                break;

+            }

+            case MBTK_ECALL_URC_ID_LLACK:

+            {

+                LOGD("MBTK_ECALL_URC_ID_LLACK");

+               

+                event.process = GSW_EU_ECALL_EVENT_PROCESS_IVS_ACK_RECEIVED;

+                event.msdupdate = GSW_EU_ECALL_EVENT_MSDUPADTE_NONE;

+                event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_IVS_LLACK_RECEIVED;

+                event.establish = GSW_EU_ECALL_EVENT_ESTABLISH_SUCCESS;

+                g_msd_send_status = GSW_EU_ECALL_MSD_TRANS_STATUS_SUCCESS;

+                mbtk_send_singnal();

+                break;

+            }

+            case MBTK_ECALL_URC_ID_HLACK:

+            {

+                LOGD("MBTK_ECALL_URC_ID_HLACK");

+                event.fail = GSW_EU_ECALL_EVENT_FAIL_NONE;

+                event.process = GSW_EU_ECALL_EVENT_PROCESS_IVS_HLACK_RECEIVED;

+

+                event.msdupdate = GSW_EU_ECALL_EVENT_MSDUPADTE_NONE;

+                event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_NONE;

+                event.establish = GSW_EU_ECALL_EVENT_ESTABLISH_SUCCESS;

+                g_msd_send_status = GSW_EU_ECALL_MSD_TRANS_STATUS_SUCCESS;

+                mbtk_send_singnal();

+                break;

+            }

+            case MBTK_ECALL_URC_ID_ALACK:

+            {

+                LOGD("MBTK_ECALL_URC_ID_ALACK");

+                event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_IVS_ALACK_RECEIVED;

+            }

+            case MBTK_ECALL_URC_ID_MSD_UPDATE_DONE:

+            {

+                LOGD("MBTK_ECALL_URC_ID_MSD_UPDATE_DONE");

+                event.process = GSW_EU_ECALL_EVENT_PROCESS_IVS_NONE;

+                event.msdupdate = GSW_EU_ECALL_EVENT_MSDUPADTE_NONE;

+                event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_NONE;

+                event.establish = GSW_EU_ECALL_EVENT_ESTABLISH_SUCCESS;

+            

+            }

+            case MBTK_ECALL_URC_ID_T5_EXPIRED:

+            case MBTK_ECALL_URC_ID_T6_EXPIRED:

+            case MBTK_ECALL_URC_ID_T7_EXPIRED:

+            {

+                LOGD("MBTK_ECALL_URC_ID_T5_EXPIRED | MBTK_ECALL_URC_ID_T5_EXPIRED | MBTK_ECALL_URC_ID_T7_EXPIRED");

+                event.msdupdate = GSW_EU_ECALL_EVENT_MSDUPDATE_IVS_UPDATE_MSD_TIMEOUT;

+                event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_NONE;

+                event.establish = GSW_EU_ECALL_EVENT_ESTABLISH_SUCCESS;

+                g_msd_send_status = GSW_EU_ECALL_MSD_TRANS_STATUS_FAILURE;

+                mbtk_send_singnal();

+                break;

+            }

+            case MBTK_ECALL_URC_ID_3GPP_FATAL:

+            case MBTK_ECALL_URC_ID_GENERIC:

+            {

+                LOGD("MBTK_ECALL_URC_ID_GENERIC|MBTK_ECALL_URC_ID_3GPP_FATAL");

+                 event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_NONE;

+            }

+            case MBTK_ECALL_URC_ID_MSD_UPDATE_ERR:

+            {   

+                LOGD("MBTK_ECALL_URC_ID_MSD_UPDATE_ERR");

+                event.msdupdate = GSW_EU_ECALL_EVENT_MSDUPDATE_IVS_UPDATE_MSD_TIMEOUT;

+                

+            }

+            default:

+            {

+               

+                LOGE("No process urc_id : %d", ecall_data->urc_id);

+                break;

+            }

+        }

+

+    }

+    if(gsw_eu_ecall_event_cb) 

+    {

+            gsw_eu_ecall_event_cb(&event);

+    }

+}

+

+

+/**

+ * @brief register the ecall status callback

+* @param  [in] gsw_eu_ecall_status_cb_f cb:callback

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_eu_ecall_setEventCB(gsw_eu_ecall_event_cb_f cb)

+{

+    int ret = -1;

+    if(ecall_info_handle==NULL)

+    {

+        return GSW_HAL_MEM_INVAILD;

+    }

+    

+    gsw_eu_ecall_event_cb = cb;

+    if(!g_setevent_cb)

+     {

+         ret = mbtk_ecall_state_change_cb_reg_ptr(ecall_info_handle, mbtk_ecall_state_change_cb);

+         if(ret < 0)

+         {

+

+            LOGE("mbtk_ecall_state_change_cb_reg_ptr failed");

+            return GSW_HAL_FAIL;

+        }

+        g_setevent_cb = true;

+    }

+    

+    return GSW_HAL_SUCCESS;

+

+}

+

+

+

+static void* ecall_msd_status_cb_thread(void* arg)

+{

+    while(g_thread_running)

+    {

+        mbtk_wait_signal();

+        if(g_thread_running == false)

+        {

+            return NULL;

+        }

+        if(gsw_eu_ecall_status_cb)

+        {

+            gsw_eu_ecall_status_cb(g_sta_cb_id,g_msd_send_status);

+        }

+       

+    }

+    return NULL;

+}

+

+/**

+* @brief register the ecall status callback

+* @param  [in] gsw_eu_ecall_status_cb_f cb:callback

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_eu_ecall_setStatusCB(gsw_eu_ecall_status_cb_f cb)

+{

+    int ret = -1;

+    if(ecall_info_handle==NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+    gsw_eu_ecall_status_cb = cb;

+    if (!g_thread_running) 

+    {

+        ret = pthread_create(&gsw_ecall_status_cb_thread, NULL, ecall_msd_status_cb_thread, NULL);    

+        if(ret < 0)

+        {

+            LOGE("pthread_create failed");

+            g_thread_running = false;

+            return GSW_HAL_FAIL;

+        }

+        g_thread_running = true;

+    }

+

+    return GSW_HAL_SUCCESS;

+

+}

diff --git a/mbtk/libgsw_lib/gsw_gnss.c b/mbtk/libgsw_lib/gsw_gnss.c
new file mode 100755
index 0000000..7beb0d1
--- /dev/null
+++ b/mbtk/libgsw_lib/gsw_gnss.c
@@ -0,0 +1,567 @@
+#include <stdio.h>

+#include <string.h>

+#include <strings.h>

+#include <stdlib.h>

+#include <errno.h>

+#include <fcntl.h>

+#include <signal.h>

+#include <sys/types.h>

+#include <unistd.h>

+#include <pthread.h>

+#include <termios.h>

+#include <time.h>

+#include <sys/ioctl.h>

+#include <dlfcn.h>

+#include <stdint.h>

+#include <stdbool.h>

+

+#include "gsw_gnss.h"

+

+#ifndef LOG_ERR_LEVEL

+#define LOG_ERR_LEVEL  3      /* error conditions */

+#endif

+#ifndef LOG_WARN_LEVEL

+#define LOG_WARN_LEVEL 4   /* warning conditions */

+#endif

+#ifndef LOG_INFO_LEVEL

+#define LOG_INFO_LEVEL 6      /* informational */

+#endif

+#ifndef LOG_DEBUG_LEVEL

+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */

+#endif

+#ifndef LOG_VERBOSE_LEVEL

+#define LOG_VERBOSE_LEVEL 8

+#endif

+

+#define LOGV(fmt, args ...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGI(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGD(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGW(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGE(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+    

+

+#define GSW_HAL_SUCCESS 0

+#define GSW_HAL_FAIL -1	//表示失败(通用性)

+#define GSW_HAL_MEM_INVAILD -2 //表示入参地址为NULL

+

+#define MOPEN_GNSS_NMEA_MAX_LENGTH  255                 /**  NMEA string maximum length. */

+static gsw_gnss_cb *gsw_cb = NULL;

+static bool inited = false;

+static bool strated = false;

+

+typedef void (*mbtk_gnss_callback_func)(uint32_t ind_type, const void* data, uint32_t data_len);

+typedef void (*mbtk_log)(int level, const char *format,...);

+static mbtk_log fun_ptr_log = NULL;

+

+int (*mbtk_gnss_init)(mbtk_gnss_callback_func cb);

+int (*mbtk_gnss_deinit)();

+

+int (*mbtk_gnss_ind_set)(uint32_t ,int);

+int (*mbtk_gnss_open)(int, int);

+int (*mbtk_gnss_close)(int);

+int (*mbtk_gnss_setting)(const char *setting_cmd, int);

+

+int (*mbtk_gnss_eph_download)(int);

+int (*mbtk_gnss_eph_inject)(int);

+

+int gnss_freq = -1;

+GSW_GNSS_MODE_CONFIGURATION gnss_startmode = -1;

+GSW_GNSS_CONF_SWITCH gnss_switch_op = -1;

+void *dlHandle_gnss;

+char *lynqLib_gnss = "/lib/libmbtk_lib.so";

+

+typedef enum

+{

+    E_MT_LOC_MSG_ID_LOCATION_INFO = 1, /**< pv_data = & mopen_location_info_t */

+    E_MT_LOC_MSG_ID_NMEA_INFO = 3, /**< pv_data = & mopen_gnss_nmea_info_t */

+} e_msg_id_t;

+

+typedef struct

+{

+    int64_t     timestamp;                              /**<   System Timestamp, marked for when got the nmea data */

+    int         length;                                 /**<   NMEA string length. */

+    char        nmea[MOPEN_GNSS_NMEA_MAX_LENGTH + 1];   /**<   NMEA string.*/

+}mopen_gnss_nmea_info_t;  /* Message */

+

+typedef struct

+{

+    uint32_t    size;                   /**<   Set to the size of mcm_gps_location_t. */

+    int flags;                          /**<   Contains GPS location flags bits. */

+    int position_source;                /**<   Provider indicator for HYBRID or GPS. */ //功能暂未实现,可不用添加进结构体

+    double      latitude;               /**<   Latitude in degrees. */

+    double      longitude;              /**<   Longitude in degrees. */

+    double      altitude;               /**<   Altitude in meters above the WGS 84 reference ellipsoid. */

+    float       speed;                  /**<   Speed in meters per second. */

+    float       bearing;                /**<   Heading in degrees. */ //功能暂未实现,可不用添加进结构体

+    float       accuracy;               /**<   Expected accuracy in meters. */ //功能暂未实现,可不用添加进结构体

+    int64_t     timestamp;              /**<   Timestamp for the location fix in UTC million-second base.  */

+    int32_t     is_indoor;              /**<   Location is indoors. */ //功能暂未实现,可不用添加进结构体

+    float       floor_number;           /**<   Indicates the floor number. */

+}mopen_location_info_t;//功能暂未实现,可不用添加进结构体

+

+

+typedef struct {

+    uint32_t      flags;

+    double      latitude;               /**<   Latitude in degrees. */

+    double      longitude;              /**<   Longitude in degrees. */

+    double      altitude;               /**<   Altitude in meters above the WGS 84 reference ellipsoid. */

+    float       speed;                  /**<   Speed in meters per second. */

+    float       bearing;                /**<   Heading in degrees. */

+    int64_t     timestamp;              /**<   Timestamp for the location fix in UTC million-second base.  */

+} mbtk_gnss_location_info_t;

+

+typedef enum{

+    MODE_GPS = 1,                               /**< GPS only */

+    MODE_BEIDOU,                                /**< BEIDOU only*/

+    MODE_GPS_BEIDOU,                            /**< GPS+BEIDOU */

+    MODE_GLONASS,                               /**< GLONASS only */

+    MODE_GPS_GLONASS,                           /**< GPS+GLONASS */

+    MODE_GLONASS_BEIDOU,                        /**< GLONASS+BEIDOU */ /* The type does not support this type */

+    MODE_GPS_GLONASS_BEIDOU,                    /**< GPS+GLONASS+BEIDOU */ /* The type does not support this type */          

+    MODE_GALILEO,                               /**< GALILEO only */ 

+    MODE_GPS_GALILEO,                           /**< GPS+GALILEO */ 

+    MODE_BEIDOU_GALILEO,                        /**< BEIDOU+GALILEO */ 

+    MODE_GPS_BEIDOU_GALILEO,                    /**< GPS+BEIDOU+GALILEO */ 

+    MODE_GLONASS_GALILEO,                       /**< GLONASS+GALILEO */ 

+    MODE_GPS_GLONASS_GALILEO,                   /**< GPS+GLONASS+GALILEO */ 

+    MODE_BEIDOU_GLONASS_GALILEO,                /**< BEIDOU+GLONASS+GALILEO */ /* The type does not support this type */

+    MODE_END = -1,                              /**< init value */

+}GSW_GNSS_MODE_CONFIGURATION_HD;

+

+

+GSW_GNSS_MODE_CONFIGURATION_HD map_gnss_mode(GSW_GNSS_MODE_CONFIGURATION mode)

+{

+    switch (mode)

+    {

+        case GSW_MODE_GPS_GLONASS:

+            return MODE_GPS_GLONASS;

+        case GSW_MODE_GPS_BEIDOU:

+            return MODE_GPS_BEIDOU;

+        case GSW_MODE_GPS_GLONASS_BEIDOU:

+            return MODE_END;

+        case GSW_MODE_GPS:

+            return MODE_GPS;

+        case GSW_MODE_BEIDOU:

+            return MODE_BEIDOU;

+        case GSW_MODE_GLONASS:

+            return MODE_GLONASS;

+        case GSW_MODE_GPS_GLONASS_BEIDOU_GALILEO:

+            return MODE_END;

+        case GSW_MODE_GPS_GALILEO:

+            return MODE_GPS_GALILEO;

+        case GSW_MODE_GPS_GLONASS_GALILEO:

+            return MODE_GPS_GLONASS_GALILEO;

+        case GSW_MODE_GPS_GALILEO_ONLY:

+            return MODE_GALILEO;

+        case GSW_MODE_GPS_GLONASS_BEIDOU_GALILEO_NAVIC:

+            return MODE_END;

+        case GSW_MODE_GNSS_END:

+            return MODE_END;

+        default:

+            return MODE_END;

+    }

+}  

+

+int mbtk_gnss_set_VTG()

+{

+    int ret;

+    char param_buf[32] = {0};

+    snprintf(param_buf, 32, "$MSGCFG,2,1000");

+    mbtk_gnss_setting=(int(*)(const char *setting_cmd, int))dlsym(dlHandle_gnss, "mbtk_gnss_setting");

+    ret = mbtk_gnss_setting(param_buf, QSER_GNSS_TIMEOUT);

+    if(ret != 0)

+    {

+        LOGE("[qser_gnss] mbtk_gnss_setting fail.ret = [%d]", ret);

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief SDK interface to set gnss sampling frequency, support 1Hz、2Hz、5Hz

+ * @param  [in] freq

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_gnss_set_freq(int freq)

+{

+    int ret;

+    if (!strated)

+    {

+        gnss_freq = freq;

+        return GSW_HAL_SUCCESS;

+    }

+    char param_buf[32] = {0};

+    snprintf(param_buf, 32, "$FREQCFG,%d", freq);

+    mbtk_gnss_setting=(int(*)(const char *setting_cmd, int))dlsym(dlHandle_gnss, "mbtk_gnss_setting");

+    ret = mbtk_gnss_setting(param_buf, QSER_GNSS_TIMEOUT);

+    if(ret != 0)

+    {

+        LOGE("[qser_gnss] mbtk_gnss_setting fail.ret = [%d]", ret);

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief SDK interface to set gnss start mode,specific mode refreence GSW_HAL_GNSS_MODE_CONFIGURATION

+ * @param  [in] start_mode 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_gnss_set_start_mode(GSW_GNSS_MODE_CONFIGURATION start_mode)

+{

+    int ret;

+    if (!strated)

+    {

+        gnss_startmode = start_mode;

+        return GSW_HAL_SUCCESS;

+    }

+    char param_buf[32] = {0};

+    snprintf(param_buf, 32, "$SYSCFG,%d", map_gnss_mode(start_mode));

+    if(map_gnss_mode(start_mode) == -1)

+    {

+        LOGE("[qser_gnss] mbtk_gnss_start_mode con't support");

+        return GSW_HAL_FAIL;

+    }

+    mbtk_gnss_setting=(int(*)(const char *setting_cmd, int))dlsym(dlHandle_gnss, "mbtk_gnss_setting");

+    ret = mbtk_gnss_setting(param_buf, QSER_GNSS_TIMEOUT);

+    if(ret != 0)

+    {

+        LOGE("[qser_gnss] mbtk_gnss_setting fail.ret = [%d]", ret);

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief SDK interface to set EPO switch if open or close

+ * @param  [in] switch_op

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_gnss_epo_switch(GSW_GNSS_CONF_SWITCH switch_op)

+{

+    int ret;

+    if (!strated)

+    {

+        gnss_switch_op = switch_op;

+        return GSW_HAL_SUCCESS;

+    }

+    

+    if(switch_op)

+    {

+        mbtk_gnss_eph_download=(int(*)(int))dlsym(dlHandle_gnss, "mbtk_gnss_eph_download");

+        ret = mbtk_gnss_eph_download(QSER_GNSS_TIMEOUT);

+        if(ret != 0)

+        {

+            LOGE("[qser_gnss] mbtk_gnss_eph_download fail.ret = [%d]", ret);

+            return GSW_HAL_FAIL;

+        }

+        mbtk_gnss_eph_inject=(int(*)(int))dlsym(dlHandle_gnss, "mbtk_gnss_eph_inject");

+        ret = mbtk_gnss_eph_inject(QSER_GNSS_TIMEOUT);

+        if(ret != 0)

+        {

+            LOGE("[qser_gnss] mbtk_gnss_eph_inject fail.ret = [%d]", ret);

+            return GSW_HAL_FAIL;

+        }

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+static void gnss_callback(uint32_t ind_type, const void* data, uint32_t data_len)

+{

+    if(data == NULL || data_len <= 0)

+    {

+        LOGE("[GSW_gnss] data is NULL.");

+        return;

+    }

+

+    if(gsw_cb == NULL)

+    {

+        //LOGE("[qser_gnss] qser_gnss_callback is NULL.");

+        return;

+    }

+    

+    if(ind_type == MBTK_GNSS_IND_LOCATION) {

+        if(data_len != sizeof(mbtk_gnss_location_info_t))

+		{

+			LOGE("[GSW_gnss] data size error");

+			return;

+		}

+		GSW_GNSS_LOCATION_EXT_T gsw_location;

+        GSW_GNSS_LOCATION_T gsw_location_t;

+        mbtk_gnss_location_info_t *locl_info = (mbtk_gnss_location_info_t *)data;

+        gsw_location_t.altitude = locl_info->altitude;

+        gsw_location_t.latitude = locl_info->latitude;

+        gsw_location_t.longitude = locl_info->longitude;

+        gsw_location_t.speed = locl_info->speed;

+        gsw_location_t.bearing = locl_info->bearing;

+        gsw_location_t.timestamp = locl_info->timestamp;

+        gsw_location.legacyLocation = gsw_location_t;

+        gsw_cb->gsw_location_cb(&gsw_location);  

+    } else if(ind_type == MBTK_GNSS_IND_NMEA) {

+        mopen_gnss_nmea_info_t qser_nmea = {0};

+        memset(&qser_nmea, 0x0, sizeof(mopen_gnss_nmea_info_t));

+        qser_nmea.length = data_len;

+        memcpy(qser_nmea.nmea, (char *)data, data_len);

+        //qser_nmea.timestamp = qser_get_gnss_time_sec(data, data_len);

+        gsw_cb->gsw_nmea_cb(data,data_len);

+    } else {

+        LOGD("Unknown IND : %d\n", ind_type);

+    }

+}

+

+int gsw_gnss_init(void)

+{

+    int ret;

+    if(!inited)

+    {

+        dlHandle_gnss = dlopen(lynqLib_gnss, RTLD_NOW);

+        fun_ptr_log = (mbtk_log)dlsym(dlHandle_gnss, "mbtk_log");

+        if(fun_ptr_log == NULL || dlHandle_gnss == NULL)

+        {

+            return GSW_HAL_FAIL;

+        }

+        mbtk_gnss_init=(int(*)(mbtk_gnss_callback_func))dlsym(dlHandle_gnss, "mbtk_gnss_init");

+        ret = mbtk_gnss_init(gnss_callback);

+        if(ret == 0)

+        {

+            mbtk_gnss_ind_set=(int(*)(uint32_t ,int))dlsym(dlHandle_gnss, "mbtk_gnss_ind_set");

+            ret = mbtk_gnss_ind_set(MBTK_GNSS_IND_NMEA, QSER_GNSS_TIMEOUT);

+            if(ret == 0)

+            {

+                inited = true;

+            }

+            else

+            {

+                LOGE("[GSW_gnss] init mbtk_gnss_ind_set() fail.ret = [%d]", ret);

+                return GSW_HAL_FAIL;

+            }

+        }

+        else

+        {

+            LOGE("[GSW_gnss] mbtk_gnss_init() fail.ret = [%d]", ret);

+            return GSW_HAL_FAIL;

+        }

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief SDK interface to registered callback function

+ * @param [in] callback

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_gnss_reg_cb_group(gsw_gnss_cb callback)

+{

+    if(callback.gsw_location_cb == NULL && callback.gsw_nmea_cb == NULL)

+    {

+        LOGE("[GSW_gnss] handler_ptr is NULL.");

+        return GSW_HAL_FAIL;

+    }

+    if (gsw_cb == NULL)

+    {

+        gsw_cb = (gsw_gnss_cb *)malloc(sizeof(gsw_gnss_cb));

+        if (gsw_cb == NULL)

+        {

+            LOGE("[GSW_gnss] Memory allocation failed.");

+            return GSW_HAL_FAIL;

+        }

+    }

+    gsw_cb->gsw_location_cb = callback.gsw_location_cb;

+    gsw_cb->gsw_nmea_cb = callback.gsw_nmea_cb;

+    return GSW_HAL_SUCCESS;

+}

+/**

+ * @brief SDK interface to start gnss

+ * @param 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_gnss_start(void)

+{

+    int ret;

+    mbtk_gnss_open=(int(*)(int,int))dlsym(dlHandle_gnss, "mbtk_gnss_open");

+    ret = mbtk_gnss_open(255, QSER_GNSS_TIMEOUT);

+    if(ret != 0)

+    {

+        LOGE("[GSW_gnss] mbtk_gnss_open is error.ret = [%d]", ret);

+        return GSW_HAL_FAIL;

+    }

+    strated = true;

+    if (gnss_freq > 0)

+        gsw_gnss_set_freq(gnss_freq);

+    if (gnss_startmode >= 0)

+        gsw_gnss_set_start_mode(gnss_startmode);

+    if (gnss_switch_op > 0)

+        gsw_gnss_epo_switch(gnss_switch_op);

+

+    mbtk_gnss_set_VTG();

+

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief SDK interface to stop gnss

+ * @param 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_gnss_stop(void)

+{

+    int ret;

+    mbtk_gnss_close=(int(*)(int))dlsym(dlHandle_gnss, "mbtk_gnss_close");

+    ret = mbtk_gnss_close(QSER_GNSS_TIMEOUT);

+    if(ret != 0)

+    {

+        LOGE("[GSW_gnss] mbtk_gnss_close is error.ret = [%d]", ret);

+        return GSW_HAL_FAIL;

+    }

+    strated = false;

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief SDK interface to de initialization gnss

+ * @param 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_gnss_deinit(void)

+{

+    int ret;

+    if(inited)

+    {

+        mbtk_gnss_deinit=(int(*)())dlsym(dlHandle_gnss, "mbtk_gnss_deinit");

+        ret = mbtk_gnss_deinit();

+        if(ret == 0)

+        {

+            inited = false;

+        }

+        else

+        {

+            LOGE("[GSW_gnss] mbtk_gnss_init() fail.ret = [%d]", ret);

+            dlclose(dlHandle_gnss);

+            dlHandle_gnss = NULL;

+            return GSW_HAL_FAIL;

+        }

+    }

+

+    dlclose(dlHandle_gnss);

+    dlHandle_gnss = NULL;

+    gnss_freq = -1;

+    gnss_startmode = -1;

+    gnss_switch_op = -1;

+    return GSW_HAL_SUCCESS;

+}

+

+

+/**

+ * @brief SDK interface to enable XTRA switch

+ * @param [in] state

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_gnss_xtra_is_enable(gsw_xtra_state_e state)

+{

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief SDK interface to delete aiding data,delete aiding data for cold start(1-H,2-W,3-C)

+ * @param [in] switch_op

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_gnss_delete_aiding_data(unsigned int flags) /*1-don`t delete == hot_start ; 2-delete EPH == warm start ; 3-delete all == cold start*/

+{

+    int ret;

+    char param_buf[32] = {0};

+    snprintf(param_buf, 32, "$RESET,%u", flags);

+    mbtk_gnss_setting=(int(*)(const char *setting_cmd, int))dlsym(dlHandle_gnss, "mbtk_gnss_setting");

+    ret = mbtk_gnss_setting(param_buf, QSER_GNSS_TIMEOUT);

+    if(ret != 0)

+    {

+        LOGE("[qser_gnss] mbtk_gnss_setting fail.ret = [%d]", ret);

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief init and configure gps

+ * @param [in] init_configure

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_gnss_init_configure_gps(gsw_gnss_init_configure_t init_configure)

+{

+    return GSW_HAL_SUCCESS;

+}

diff --git a/mbtk/libgsw_lib/gsw_gpio.c b/mbtk/libgsw_lib/gsw_gpio.c
new file mode 100755
index 0000000..9bd8a79
--- /dev/null
+++ b/mbtk/libgsw_lib/gsw_gpio.c
@@ -0,0 +1,379 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <unistd.h>

+#include <fcntl.h>

+#include <errno.h>

+#include <stdint.h>

+#include <string.h>

+#include <dlfcn.h>

+

+#include "gsw_gpio.h"

+

+#ifndef LOG_ERR_LEVEL

+#define LOG_ERR_LEVEL  3      /* error conditions */

+#endif

+#ifndef LOG_WARN_LEVEL

+#define LOG_WARN_LEVEL 4   /* warning conditions */

+#endif

+#ifndef LOG_INFO_LEVEL

+#define LOG_INFO_LEVEL 6      /* informational */

+#endif

+#ifndef LOG_DEBUG_LEVEL

+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */

+#endif

+#ifndef LOG_VERBOSE_LEVEL

+#define LOG_VERBOSE_LEVEL 8

+#endif

+

+#define LOGV(fmt, args ...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGI(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGD(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGW(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGE(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+    

+

+#define GSW_HAL_SUCCESS 0

+#define GSW_HAL_FAIL -1	//表示失败(通用性)

+#define GSW_HAL_MEM_INVAILD -2 //表示入参地址为NULL

+

+#define wakeout 117

+

+typedef void (*mbtk_log)(int level, const char *format,...);

+static mbtk_log fun_ptr_log = NULL;

+void *dlHandle_gpio = NULL;

+char *lynqLib_gpio = "/lib/libmbtk_lib.so";

+

+int gpio_check(int gpio)

+{

+    char buffer[128];

+    memset(buffer,0,128);

+    sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);

+    return access(buffer , F_OK);

+}

+

+static int handle()

+{

+    if(dlHandle_gpio == NULL || fun_ptr_log == NULL)

+    {

+        dlHandle_gpio = dlopen(lynqLib_gpio, RTLD_NOW);

+        fun_ptr_log = (mbtk_log)dlsym(dlHandle_gpio, "mbtk_log");

+        if(fun_ptr_log == NULL || dlHandle_gpio == NULL)

+        {

+            return GSW_HAL_FAIL;

+        }

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+static int gpio_export(int gpio)

+{

+    int file=-1;

+    int result =-1;

+    char pin_index_buffer[5]= {0};

+

+    if (gpio_check(gpio) == 0)

+    {

+        LOGE("export has been add\n");

+        return 0;

+    }

+

+    file = open("/sys/class/gpio/export",O_WRONLY);

+    if(file == -1)

+    {

+        LOGE("Open gpio export file fail.");

+        return -1;

+    }

+

+    memset(pin_index_buffer,0,5);

+    sprintf(pin_index_buffer,"%d", gpio);

+    result = write(file,pin_index_buffer,strlen(pin_index_buffer));

+    if(result < 0)

+    {

+        LOGE("Gpio[%d] export fail.", gpio);

+        close(file);

+        return -1;

+    }

+    close(file);

+

+    return 0;

+}

+

+static int gpio_unexport(int gpio)

+{

+    int file=-1;

+    int result =-1;

+    char pin_index_buffer[5]= {0};

+    if (gpio_check(gpio) == -1)

+    {

+        LOGE("export has been not add\n");

+        return -1;

+    }

+

+    file = open("/sys/class/gpio/unexport",O_WRONLY);

+    if(file == -1)

+    {

+        LOGE("Open gpio unexport file fail.");

+        return -1;

+    }

+

+    memset(pin_index_buffer,0,5);

+    sprintf(pin_index_buffer,"%d", gpio);

+    result=write(file,pin_index_buffer,strlen(pin_index_buffer));

+    if(result < 0)

+    {

+        close(file);

+        LOGE("Gpio[%d] unexport fail.", gpio);

+        return -1;

+    }

+    close(file);

+

+    return 0;

+}

+

+int32_t gsw_gpio_SetDirection(uint32_t gpioNum, gsw_hal_pinDirection dir)

+{

+    char buffer[128]= {0};

+    int file =-1;

+    int result =-1;

+    char direction[10] = {0};

+    memset(buffer,0,128);

+    if (handle())

+        return GSW_HAL_FAIL;

+    

+    if (gpio_check(gpioNum) == -1)

+    {

+        LOGD("in dir export has been not add\n");

+        gpio_export(gpioNum);

+    }

+

+

+    sprintf(buffer,"/sys/class/gpio/gpio%u/direction", gpioNum);

+    file = open(buffer, O_WRONLY);

+    if(file == -1)

+    {

+        LOGE("Open gpio[%d] direct fail.", gpioNum);

+        return -1;

+    }

+    if (dir == GSW_HAL_PINDIR_IN)

+        sprintf(direction,"in");

+    else if (dir == GSW_HAL_PINDIR_OUT)

+        sprintf(direction,"out");

+    

+    result = write(file,direction,strlen(direction));

+    if(result != strlen(direction))

+    {

+        LOGE("Set gpio[%d] direct fail.", gpioNum);

+        close(file);

+        gpio_unexport(gpioNum);

+        return GSW_HAL_FAIL;

+    }

+    close(file);

+    gpio_unexport(gpioNum);

+    return GSW_HAL_SUCCESS;

+}

+

+gsw_hal_pinLevel gsw_gpio_GetLevel(uint32_t gpioNum)

+{

+    char buffer[50];

+    char path[128];

+    int file =-1;

+    int result =-1;

+    memset(path,0,128);

+    memset(buffer,0,50);

+    if (handle())

+        return GSW_HAL_FAIL;

+

+    if (gpio_check(gpioNum) == -1)

+    {

+        LOGD("in get value export has been not add\n");

+        gpio_export(gpioNum);

+    }

+    sprintf(path,"/sys/class/gpio/gpio%u/value", gpioNum);

+    file = open(path,O_RDONLY);

+    if(file == -1)

+    {

+        LOGE("Open gpio[%d] fail.", gpioNum);

+        return -1;

+    }

+    result = read(file,buffer,50);

+    if(result <= 0)

+    {

+        LOGE("Get gpio[%d] value fail", gpioNum);

+        close(file);

+        gpio_unexport(gpioNum);

+        return GSW_HAL_FAIL;

+    }

+    close(file);

+    gpio_unexport(gpioNum);

+    return atoi(buffer);

+}

+

+int32_t gsw_gpio_SetLevel(uint32_t gpioNum, gsw_hal_pinLevel level)

+{

+    char buffer[128]= {0};

+    int file =-1;

+    int result =-1;

+    memset(buffer,0,50);

+    if (handle())

+        return GSW_HAL_FAIL;

+

+    if (gpio_check(gpioNum) == -1)

+    {

+        LOGD("in set value export has been not add\n");

+        gpio_export(gpioNum);

+    }

+

+    sprintf(buffer,"/sys/class/gpio/gpio%u/value", gpioNum);

+    file = open(buffer,O_WRONLY);

+    if(file == -1)

+    {

+        LOGE("Open gpio[%d] value fail.", gpioNum);

+        return -1;

+    }

+    if(level == GSW_HAL_LEVEL_LOW) {

+        result = write(file,"0",1);

+    } else {

+        result = write(file,"1",1);

+    }

+    if(result != 1)

+    {

+        LOGE("Set gpio[%d] value fail err =%d.", gpioNum, errno);

+        close(file);

+        gpio_unexport(gpioNum);

+        return GSW_HAL_FAIL;

+    }

+    close(file);

+    gpio_unexport(gpioNum);

+    return GSW_HAL_SUCCESS;

+}

+

+

+int32_t gsw_gpio_Init(uint32_t gpioNum, gsw_hal_pinDirection dir, gsw_hal_pinLevel level, gsw_hal_pinPullSel pullsel)

+{

+    if (handle())

+        return GSW_HAL_FAIL;

+

+    if (dir != 1 && dir != 0)

+    {

+        LOGE("[lynq_gpio_init] direction fail.");

+        return -1;

+    }

+

+    if (level != 1 && level != 0)

+    {

+        LOGE("[lynq_gpio_init] value fail.");

+        return GSW_HAL_FAIL;

+    }

+

+    if(gpio_export(gpioNum))

+    {

+        LOGE("[lynq_gpio_init]gpio_export fail.");

+        return GSW_HAL_FAIL;

+    }

+

+    if(gsw_gpio_SetDirection(gpioNum, dir))

+    {

+        LOGE("[lynq_gpio_init]gpio_direct_set fail.");

+        return GSW_HAL_FAIL;

+    }

+

+    if(dir == 1 && (gsw_gpio_SetLevel(gpioNum, level) != 0))

+    {

+        LOGE("[lynq_gpio_init]gpio_value_set fail.");

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+}

+gsw_hal_usbStatus gsw_hwpin_is_usb_connected(void)

+{

+    FILE *fp;

+    char cmd[128] = {0};

+    char tmp_rsp[20] = {0};

+    //char *CONNECTED = "configured";

+    char *DISCONNECTED = "not attached";

+    if (handle())

+        return GSW_HAL_FAIL;

+

+    sprintf(cmd,"cat /sys/devices/platform/soc/d4200000.axi/c0000000.usb/udc/c0000000.usb/state");

+    fp=popen(cmd, "r");

+    if (fgets(tmp_rsp,sizeof(tmp_rsp),fp) == NULL)

+        LOGE("gsw_hwpin_is_usb_connected fail.");

+    pclose(fp);

+    if (strncmp(tmp_rsp,DISCONNECTED,strlen(DISCONNECTED)) == 0)

+        return GSW_HAL_USB_DISCONNECTED;

+    else

+        return GSW_HAL_USB_CONNECTED;

+}

+

+int32_t gsw_setWakeupLevel(gsw_hal_pinLevel level)

+{

+    if (gsw_gpio_SetLevel(wakeout, level) == GSW_HAL_FAIL)

+    {

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+}

diff --git a/mbtk/libgsw_lib/gsw_nw.c b/mbtk/libgsw_lib/gsw_nw.c
new file mode 100755
index 0000000..e485574
--- /dev/null
+++ b/mbtk/libgsw_lib/gsw_nw.c
@@ -0,0 +1,2572 @@
+#include "gsw_nw_interface.h"

+#include <dlfcn.h>

+#include <time.h>

+#include <pthread.h>

+

+//mbtk include

+#define LYNQ_AIR_PLANE_MODE_OFF      1    //at+cfun = 1

+#define LYNQ_AIR_PLANE_MODE_ON     4   // at+cfun = 4

+#define LYNQ_AIR_CFUN_MODE_OFF     0   // at+cfun = 0

+

+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))

+

+#define FPLMN_STRING_LENGTH 120

+#define ENTRY_LENGTH 6

+#define FPLMN_ARRAY_SIZE (FPLMN_STRING_LENGTH / 6) + 1

+

+#ifndef FALSE

+#define FALSE   (0)

+#endif

+ 

+ 

+#ifndef TRUE

+#define TRUE    (!FALSE)

+#endif

+

+typedef unsigned int uint32;

+typedef unsigned char uint8;

+typedef unsigned short uint16;

+typedef void (*mbtk_info_callback_func)(const void* data, int data_len);

+

+typedef enum

+{

+    MBTK_DEV_MODEM_MIN_FUN,                                   //Modem 最小功能

+    MBTK_DEV_MODEM_FULL_FUN,                                  //Modem 全功能

+    MBTK_DEV_MODEM_DISABLE_RECEIVE_RF_CIRCUITS = 3,           //Modem 禁用射频接收电路

+    MBTK_DEV_MODEM_DISABLE_TRANSMIT_AND_RECEIVE_RF_CIRCUITS,  //Modem禁用射频发射和接收电路

+    MBTK_DEV_MODEM_DISABLE_SIM,                               //Modem 禁用(U)SIM 卡

+    MBTK_DEV_MODEM_TURN_OFF_FULL_SECONDARY_RECEIVE,           //Modem 完全禁用辅助接收

+}MBTK_DEV_MODEM_FUNCTION;

+

+typedef enum

+{

+    MBTK_CELL_TYPE_GSM = 0,

+    MBTK_CELL_TYPE_UMTS,

+    MBTK_CELL_TYPE_LTE

+} mbtk_cell_type_enum;

+

+typedef struct

+{

+    MBTK_DEV_MODEM_FUNCTION fun;

+    int rst;

+} mbtk_modem_info_t;

+

+typedef struct

+{

+    int client_fd;

+    pthread_t read_thread_id;

+    int exit_fd[2];

+    bool is_waitting;

+    pthread_cond_t cond;

+    pthread_mutex_t mutex;

+

+    pthread_mutex_t send_mutex;

+

+    // Temp response data.

+    uint16 info_err;

+    uint16 data_len;

+    void *data;

+

+    //mbtk wyq for server_ready_status add start

+    char server_ready_status;

+    //mbtk wyq for server_ready_status add end

+

+    mbtk_info_callback_func net_state_cb;

+    mbtk_info_callback_func call_state_cb;

+    mbtk_info_callback_func sms_state_cb;

+    mbtk_info_callback_func radio_state_cb;

+    mbtk_info_callback_func sim_state_cb;

+    mbtk_info_callback_func pdp_state_cb;

+    //add signal by xr

+    mbtk_info_callback_func signal_state_cb;

+} mbtk_info_handle_t;

+

+

+

+typedef struct

+{

+    // LTE server cell: tac, PCI, dlEuarfcn, ulEuarfcn, band

+    // LTE cell: phyCellId,euArfcn,rsrp,rsrq

+    // WCDMA server cell: lac, ci, arfcn

+    // WCDMA cell: lac, ci, arfcn

+    // GSM server cell: lac, ci, arfcn, bsic

+    // GSM cell:

+    uint32 value1;

+    uint32 value2;

+    uint32 value3;

+    uint32 value4;

+    uint32 value5;

+	uint32 value6;

+    uint32 value7;

+    uint32 value8;

+    uint32 value9;

+    uint32 value10;

+} __attribute__((packed)) mbtk_cell_info_t;

+

+

+

+

+

+typedef struct

+{

+    uint8 net_pref;     // mbtk_net_pref_enum

+    uint16 gsm_band;    // mbtk_gsm_band_enum

+    uint16 umts_band;   // mbtk_umts_band_enum

+    uint32 tdlte_band;  // mbtk_tdlte_band_enum

+    uint32 fddlte_band; // mbtk_fddlte_band_enum

+    uint32 lte_ext_band; // mbtk_lte_ext_band_enum

+} __attribute__((packed)) mbtk_band_info_t;

+

+typedef struct list_arraynode

+{

+    void *data;

+    struct list_arraynode *next;

+} list_arraynode_t;

+

+typedef struct list_treenode

+{

+    list_arraynode_t *data;

+    int count;

+    struct list_treenode *left;

+    struct list_treenode *right;

+} list_treenode_t;

+

+typedef int (*list_sort_func)(void *data1, void *data2);

+typedef void (*list_free_func)(void *data);

+

+typedef struct list_node

+{

+    uint32 size;

+    list_sort_func sort_func;

+    list_free_func free_func;

+

+    uint32 cur_index;

+    list_arraynode_t *cur_array_data;

+

+    list_arraynode_t array_data;

+    list_treenode_t tree_data;

+} list_node_t;

+

+/*

+0: GSM

+1: GSM Compact

+2: UTRAN

+3: GSM w/EGPRS

+4: UTRAN w/HSDPA

+5: UTRAN w/HSUPA

+6: UTRAN w/HSDPA and HSUPA

+7: E-UTRAN

+8: UTRAN HSPA+

+*/

+typedef enum {

+    MBTK_RADIO_TECH_GSM = 0,

+    MBTK_RADIO_TECH_GSM_COMPACT,

+    MBTK_RADIO_TECH_UTRAN,

+    MBTK_RADIO_TECH_GSM_EGPRS,

+    MBTK_RADIO_TECH_UTRAN_HSDPA,

+    MBTK_RADIO_TECH_UTRAN_HSUPA,

+    MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA,

+    MBTK_RADIO_TECH_E_UTRAN,      // LTE

+    MBTK_RADIO_TECH_UTRAN_HSPA

+} mbtk_radio_technology_enum;

+

+typedef struct

+{

+    /*

+    0: automatic

+    1: manual

+    */

+    uint8 net_sel_mode;

+    /*

+    0: GSM

+    1: GSM Compact

+    2: UTRAN

+    3: GSM w/EGPRS

+    4: UTRAN w/HSDPA

+    5: UTRAN w/HSUPA

+    6: UTRAN w/HSDPA and HSUPA

+    7: E-UTRAN

+    8: UTRAN HSPA+

+    0xFF: Unused

+    */

+    uint8 net_type;

+    //uint8 plmn[10]; // 46000

+    /*

+    0: unknown

+    1: available

+    2: current

+    3: forbidden

+    */

+    uint8 net_state;

+    uint32 plmn;

+} __attribute__((packed)) mbtk_net_info_t;

+

+

+typedef enum

+{

+    MBTK_NET_REG_STATE_NON = 0,

+    MBTK_NET_REG_STATE_HOME,

+    MBTK_NET_REG_STATE_SEARCHING,

+    MBTK_NET_REG_STATE_DENIED,

+    MBTK_NET_REG_STATE_UNKNOWN,

+    MBTK_NET_REG_STATE_ROAMING,

+    MBTK_NET_REG_STATE_SMS_ONLY,

+    MBTK_NET_REG_STATE_ROAMING_SMS,

+    MBTK_NET_REG_STATE_ATTACHED_EMERGENCY,

+    MBTK_NET_REG_STATE_CSFB_HOME,

+    MBTK_NET_REG_STATE_CSFB_ROAMING,

+    MBTK_NET_REG_STATE_EMERGENCY_ONLY

+} mbtk_net_reg_state_enum;

+

+typedef struct

+{

+    uint8 call_state;// mbtk_net_reg_state_enum

+    uint8 data_state;// mbtk_net_reg_state_enum

+    uint8 ims_state;// mbtk_net_reg_state_enum

+    uint8 type; // mbtk_radio_technology_enum

+    uint16 lac;

+    uint32 ci;

+} __attribute__((packed)) mbtk_net_reg_info_t;

+

+typedef struct

+{

+    uint8 type; // mbtk_radio_technology_enum

+    uint8 rssi; // 0: 113 dBm or less

+                // 1: 111 dBm

+                // 2��30: 109��53 dBm

+                // 31: 51 dBm or greater

+                // 99: not known or not detectable

+    uint8 rxlev;// 0:rssi < -110 dBm

+                // 1: -110 dBm �� rssi < -109 dBm

+                // 2: -109 dBm �� rssi < -108 dBm

+                // ......

+                // 61: -50 dBm �� rssi < -49 dBm

+                // 62: -49 dBm �� rssi < -48 dBm

+                // 63: -48 dBm �� rssi

+                // 99: not known or not detectable

+    uint8 ber;  // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4

+                // 99 not known or not detectable

+    uint8 rscp; // 0: rscp < -120 dBm

+                // 1: -120 dBm �� rscp < -119 dBm

+                // 2: -119 dBm �� rscp < -118 dBm

+                // ......

+                // 94: -27 dBm �� rscp < -26 dBm

+                // 95: -26 dBm �� rscp < -25 dBm

+                // 96: - 25 dBm �� rscp

+                // 255: not known or not detectable

+    uint8 ecno; // 0: Ec/Io < -24 dB

+                // 1: -24 dB �� Ec/Io < -23.5 dB

+                // 2: -23.5 dB �� Ec/Io < -23 dB

+                // ......

+                // 47: -1 dB �� Ec/Io < -0.5 dB

+                // 48: -0.5 dB �� Ec/Io < 0 dB

+                // 49: 0 dB �� Ec/Io

+                // 255: not known or not detectable

+    uint8 rsrq; // 0: rsrq < -19.5 dB

+                // 1: -19.5 dB �� rsrq < -19 dB

+                // 2: -19 dB �� rsrq < -18.5 dB

+                // ......

+                // 32: -4 dB �� rsrq < -3.5 dB

+                // 33: -3.5 dB �� rsrq < -3 dB

+                // 34: -3 dB �� rsrq

+                // 255: not known or not detectable

+    uint8 rsrp; // 0: rsrp < -140 dBm

+                // 1: -140 dBm �� rsrp < -139 dBm

+                // 2: -139 dBm �� rsrp < -138 dBm

+                // ......

+                // 95: -46 dBm �� rsrp < -45 dBm

+                // 96: -45 dBm �� rsrp < -44 dBm

+                // 97: -44 dBm �� rsrp

+                // 255: not known or not detectable

+} __attribute__((packed)) mbtk_signal_info_t;

+

+typedef struct{

+    uint8_t         mode;

+    uint32_t        oosPhase[3];   //单位为秒

+} mbtk_oos_info;

+

+typedef struct

+{

+    /*    Configuration parameters for MCM network full band network scan when OOS (out of service)*/

+    int t_min;

+    int t_step;

+    int t_max;

+}GSW_NW_OOS_CONFIG_INFO_T;

+

+

+#define GSW_HAL_FAIL GSW_HAL_NORMAL_FAIL

+#define GSW_HAL_MEM_INVAILD GSW_HAL_ARG_INVALID

+#define lib_mbtk_path "/lib/libmbtk_lib.so"

+mbtk_info_handle_t*       nw_info_handle = NULL;

+

+static GSW_NW_ServingInfoHandlePtr serving_cb;

+static GSW_NW_SigInfoHandlePtr sig_cb;

+static GSW_NW_RejectCauseHandlePtr reject_cb;

+static GSW_NW_ModemStateHandlePtr modem_cb;

+

+static void *dlHandle_mbtk;

+int nw_init_flag = 0;

+int mode = -1;

+int fplmn_max_length = 0;

+

+gsw_nw_plmn_list_t gsw_nw_plmn_list;

+char fplmn_array[FPLMN_ARRAY_SIZE][7];

+int fplmn_index = 0;

+

+static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);

+static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);

+int (*mbtk_net_sel_mode_get)(mbtk_info_handle_t* handle, mbtk_net_info_t *net);

+int (*mbtk_net_reg_get)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg);

+int (*mbtk_cell_get)(mbtk_info_handle_t* handle, mbtk_cell_type_enum *type, list_node_t **cell_list);

+int (*mbtk_get_modem_fun)(mbtk_info_handle_t* handle, int* fun);

+static int (*mbtk_set_modem_fun)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info);

+int (*mbtk_current_band_get)(mbtk_info_handle_t* handle, mbtk_band_info_t *band);

+int (*mbtk_current_band_set)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band);

+int (*mbtk_net_signal_get)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal);

+int (*mbtk_wakeup_state_set)(mbtk_info_handle_t* handle, uint32 wakeup_state);

+int (*mbtk_signal_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);

+int (*mbtk_net_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);

+int (*mbtk_fplmn_get)(mbtk_info_handle_t *handle, void *fplmn);

+int (*mbtk_fplmn_set)(mbtk_info_handle_t *handle, void *fplmn);

+int (*mbtk_radio_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);

+int (*mbtk_oos_get)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);

+int (*mbtk_oos_set)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);

+

+static void (*mbtk_log)(int level, const char *format, ...);

+static void (*mbtk_log_init)(char *path, char *tag);

+

+#ifndef LOG_ERR_LEVEL

+#define LOG_ERR_LEVEL  3      /* error conditions */

+#endif

+#ifndef LOG_WARN_LEVEL

+#define LOG_WARN_LEVEL 4   /* warning conditions */

+#endif

+#ifndef LOG_INFO_LEVEL

+#define LOG_INFO_LEVEL 6      /* informational */

+#endif

+#ifndef LOG_DEBUG_LEVEL

+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */

+#endif

+#ifndef LOG_VERBOSE_LEVEL

+#define LOG_VERBOSE_LEVEL 8

+#endif

+

+#define LOGV(fmt, args ...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGI(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGD(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGW(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGE(fmt, args...) \

+    do{ \

+		char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+

+

+typedef struct

+{

+    char *lynq_operator_l;

+    char *lynq_operator_s;

+    uint32 lynq_mcc_mnc;

+} lynq_operator_mcc_mnc_t;

+

+static lynq_operator_mcc_mnc_t lynq_operator_mcc_mnc[] =

+{

+    {"China Mobile","CMCC",46000},

+    {"China Unicom","CU",46001},

+    {"China Mobile","CMCC",46002},

+    {"China Telecom","CT",46003},

+    {"China Mobile","CMCC",46004},

+    {"China Telecom","CT",46005},

+    {"China Unicom","CU",46006},

+    {"China Mobile","CMCC",46007},

+    {"China Mobile","CMCC",46008},

+    {"China Unicom","CU",46009},

+    {"China Telecom","CT",46011}

+};

+

+

+//GSW include

+typedef enum prefer_mode

+{

+    GSW_PREFER_MODE_GSW    = 1,   /**<2G only*/

+    GSW_PREFER_MODE_WCDMA    = 2,   /**< 3G only*/ 

+    GSW_PREFER_MODE_WCDMA_GSM    = 3,   /**< 3G/2G*/

+    GSW_PREFER_MODE_LTE    = 4,   /**< 4G only*/

+    GSW_PREFER_MODE_NR5G    = 5,   /**< 5G only*/

+    GSW_PREFER_MODE_NR5G_LTE    = 8,   /**< 5G/4G*/

+    GSW_PREFER_MODE_LTE_WCDMA_GSM    = 9,   /**< 4G/3G/2G*/

+    GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM    = 32,   /**<  5G/4G/3G/2G*/

+} PREFER_MODE_E;

+

+static int mbtk_nw_api_import()

+{

+    dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);

+    if (dlHandle_mbtk == NULL) 

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");

+    if (mbtk_log_init == NULL) 

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");

+    if (mbtk_log == NULL) 

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");

+    if (mbtk_info_handle_get == NULL) 

+    {

+        LOGE("mbtk_info_handle_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");

+    if (mbtk_info_handle_free == NULL) 

+    {

+        LOGE("mbtk_info_handle_free dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_net_sel_mode_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_info_t *net))dlsym(dlHandle_mbtk, "mbtk_net_sel_mode_get");

+    if (mbtk_net_sel_mode_get == NULL) 

+    {

+        LOGE("mbtk_net_sel_mode_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_net_reg_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg))dlsym(dlHandle_mbtk, "mbtk_net_reg_get");

+    if (mbtk_net_reg_get == NULL) 

+    {

+        LOGE("mbtk_net_reg_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_get_modem_fun = (int (*)(mbtk_info_handle_t* handle, int* fun))dlsym(dlHandle_mbtk, "mbtk_get_modem_fun");

+    if (mbtk_get_modem_fun == NULL) 

+    {

+        LOGE("mbtk_get_modem_fun dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_set_modem_fun = (int (*)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info))dlsym(dlHandle_mbtk, "mbtk_set_modem_fun");

+    if (mbtk_set_modem_fun == NULL) 

+    {

+        LOGE("mbtk_set_modem_fun dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_current_band_get = (int (*)(mbtk_info_handle_t* handle, mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_get");

+    if (mbtk_current_band_get == NULL) 

+    {

+        LOGE("mbtk_current_band_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_current_band_set = (int (*)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_set");

+    if (mbtk_current_band_set == NULL) 

+    {

+        LOGE("mbtk_current_band_set dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_net_signal_get = (int (*)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal))dlsym(dlHandle_mbtk, "mbtk_net_signal_get");

+    if (mbtk_net_signal_get == NULL) 

+    {

+        LOGE("mbtk_net_signal_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_wakeup_state_set = (int (*)(mbtk_info_handle_t* handle, uint32 wakeup_state))dlsym(dlHandle_mbtk, "mbtk_wakeup_state_set");

+    if (mbtk_wakeup_state_set == NULL) 

+    {

+        LOGE("mbtk_wakeup_state_set dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_cell_get = (int (*)(mbtk_info_handle_t* handle, mbtk_cell_type_enum *type, list_node_t **cell_list))dlsym(dlHandle_mbtk, "mbtk_cell_get");

+    if (mbtk_cell_get == NULL) 

+    {

+        LOGE("mbtk_cell_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_signal_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_signal_state_change_cb_reg");

+    if (mbtk_signal_state_change_cb_reg == NULL) 

+    {

+        LOGE("mbtk_signal_state_change_cb_reg dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_net_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_net_state_change_cb_reg");

+    if (mbtk_net_state_change_cb_reg == NULL) 

+    {

+        LOGE("mbtk_net_state_change_cb_reg dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_fplmn_get = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_get");

+    if (mbtk_fplmn_get == NULL) 

+    {

+        LOGE("mbtk_fplmn_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_fplmn_set = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_set");

+    if (mbtk_fplmn_set == NULL) 

+    {

+        LOGE("mbtk_fplmn_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_radio_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_radio_state_change_cb_reg");

+    if (mbtk_radio_state_change_cb_reg == NULL) 

+    {

+        LOGE("mbtk_radio_state_change_cb_reg dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_oos_get = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_get");

+    if (mbtk_oos_get == NULL) 

+    {

+        LOGE("mbtk_oos_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_oos_set = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_set");

+    if (mbtk_oos_set == NULL) 

+    {

+        LOGE("mbtk_oos_set dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+void list_first(list_node_t *list)

+{

+    if (list) {

+        list->cur_index = 0;

+        list->cur_array_data = list->array_data.next;

+    }

+}

+

+void* list_next(list_node_t *list)

+{

+    if (list) {

+        list_arraynode_t *node = list->cur_array_data;

+        if (node) {

+            LOGE("node is not null\n");

+            list->cur_array_data = list->cur_array_data->next;

+            list->cur_index++;

+            return node->data;

+        } else {

+            LOGE("node is null\n");

+            return NULL;

+        }

+    } else {

+        LOGE("list is null\n");

+        return NULL;

+    }

+}

+

+void list_free(list_node_t *list)

+{

+    if (list) {

+        list_arraynode_t *node = &(list->array_data); // Head node

+        list_arraynode_t *node_temp = NULL;

+        while (node->next) {

+            node_temp = node->next;

+            node->next = node->next->next;

+

+            if (list->free_func) {

+                list->free_func(node_temp->data);

+            } else {

+                free(node_temp->data);

+            }

+            free(node_temp);

+        }

+        free(list);

+    }

+}

+

+static int gsw_rssi_to_csq(int rssi)

+{

+    LOGD("rssi = %d\n",rssi);

+    if(rssi >= -113 && rssi <= -51)

+    {

+        return (rssi + 113) / 2;

+    }

+

+    else

+    {

+        return 99;

+    }

+}

+

+static int gsw_rscp_to_csq(int rscp)

+{

+    LOGD("rscp = %d\n",rscp);

+    if(rscp <= -25 && rscp > -120)

+    {

+        return rscp + 120;

+    }

+    else

+    {

+        return 255;

+    }

+

+}

+

+static int gsw_rsrp_to_csq(int rsrp)

+{

+    LOGD("rsrp = %d\n",rsrp);

+

+    if(rsrp <= -44 && rsrp > -140)

+    {

+        return rsrp + 140;

+    }

+

+    else

+    {

+        return 255;

+    }

+}

+

+static int rscp_convert_to_dBm(int rscp)

+{

+    if(rscp <= 96 && rscp >= 0)

+    {

+        return rscp - 120;

+    }

+    else

+    {

+        return -25; 

+    }

+}

+

+

+static int8_t rssi_convert_to_dBm(uint8 rssi)

+{

+    if(rssi <= 31)

+    {

+        return rssi * 2 - 113;

+    }

+    else

+    {

+        return -125;

+    }

+}

+

+static int16_t rsrp_convert_to_dBm(uint8 rsrp)

+{

+    if(rsrp <= 96)

+    {

+        return rsrp - 140;

+    }

+    else

+    {

+        return -44;

+    }

+}

+

+static int16_t rsrq_convert_to_dB(uint8 rsrq)

+{

+    if(rsrq >= 1 && rsrq <= 34)

+    {

+        return (rsrq + 1) / 2 - 20;

+    }

+    else

+    {

+        return  -20; 

+    }

+}

+

+static int16_t ecno_convert_to_dB(uint8 ecno)

+{

+    if(ecno >= 48)

+    {

+        return 0;

+    }

+    else if(ecno == 255)

+    {

+        return 255;

+    }

+    else

+    {

+        return 48 - ecno;

+    }

+}

+

+

+static int convert_reg_state(int reg_state_t)

+{

+    LOGD("reg_state_t = %d\n",reg_state_t);

+    int reg_state = 0;

+

+    switch (reg_state_t)

+    {

+        case MBTK_NET_REG_STATE_NON:

+        {

+            reg_state = GSW_NETWORK_REG_NOT_REGISTERED;

+            break;

+        }

+        case MBTK_NET_REG_STATE_HOME:

+        {

+            reg_state = GSW_NETWORK_REG_REGISTERED;

+            break;

+        }

+        case MBTK_NET_REG_STATE_SEARCHING:

+        {

+            reg_state = GSW_NETWORK_REG_NOT_REGISTERED_SEARCHING;

+            break;

+        }

+        case MBTK_NET_REG_STATE_DENIED:

+        {

+            reg_state = GSW_NETWORK_REG_REGISTRATION_DENIED;

+            break;

+        }

+        case MBTK_NET_REG_STATE_UNKNOWN:

+        {

+            reg_state = GSW_NETWORK_REG_REGISTRATION_UNKNOWN;

+            break;

+        }

+        case MBTK_NET_REG_STATE_ROAMING:

+        {

+            reg_state = GSW_NETWORK_REG_REGISTRATION_ROAMING;

+            break;

+        }

+        case MBTK_NET_REG_STATE_SMS_ONLY:

+        case MBTK_NET_REG_STATE_ROAMING_SMS:

+        case MBTK_NET_REG_STATE_ATTACHED_EMERGENCY:

+        case MBTK_NET_REG_STATE_CSFB_HOME:

+        case MBTK_NET_REG_STATE_CSFB_ROAMING:

+        case MBTK_NET_REG_STATE_EMERGENCY_ONLY:

+        {

+            reg_state = GSW_NETWORK_REG_LIMITED_SERVICE;

+            break;

+        }

+    }

+

+    return reg_state;

+}

+

+

+static int convert_net_mode(int net_mode)

+{

+    LOGD("net_mode = %d\n",net_mode);

+    switch(net_mode)

+    {

+        case MBTK_RADIO_TECH_GSM:

+        case MBTK_RADIO_TECH_GSM_COMPACT:

+        case MBTK_RADIO_TECH_GSM_EGPRS:

+        {

+            return GSW_NETWORK_RADIO_GSM;

+        }

+        case MBTK_RADIO_TECH_UTRAN:

+        case MBTK_RADIO_TECH_UTRAN_HSDPA:

+        case MBTK_RADIO_TECH_UTRAN_HSUPA:

+        case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:

+        case MBTK_RADIO_TECH_UTRAN_HSPA:

+        {

+            return GSW_NETWORK_RADIO_UMTS;

+        }

+        case MBTK_RADIO_TECH_E_UTRAN:

+        {

+            return GSW_NETWORK_RADIO_LTE;

+        }

+        

+        default:

+        {

+            return GSW_NETWORK_RADIO_NO_SVC;

+        }

+    }

+

+    return GSW_NETWORK_RADIO_NO_SVC;

+}

+

+static int convert_mbtk_net_config(int config)

+{

+    int net_pref = -1;

+

+    switch(config)

+    {

+        case GSW_PREFER_MODE_GSW:

+        {

+            net_pref = 0;

+            break;

+        }

+        

+        case GSW_PREFER_MODE_WCDMA:

+        {

+            net_pref = 1;

+            break;

+        }

+

+        case GSW_PREFER_MODE_WCDMA_GSM:

+        {

+            net_pref = 2;

+            break;

+        }

+

+        case GSW_PREFER_MODE_LTE:

+        case GSW_PREFER_MODE_NR5G:

+        case GSW_PREFER_MODE_NR5G_LTE:

+        {

+            net_pref = 5;

+            break;

+        }

+

+        case GSW_PREFER_MODE_LTE_WCDMA_GSM:

+        case GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM:

+        {

+            net_pref = 15;

+            break;

+        }

+    }

+

+    return net_pref;

+}

+

+

+static int convert_gsw_net_config(int config)

+{

+    int net_config = -1;

+    LOGD("config = %d\n");

+

+    switch (config)

+    {

+        case 0:

+        {

+            net_config = GSW_PREFER_MODE_GSW;

+            break;

+        }

+

+        case 1:

+        {

+            net_config = GSW_PREFER_MODE_WCDMA;

+            break;

+        }

+

+        case 2:

+        {

+            net_config = GSW_PREFER_MODE_WCDMA_GSM;

+            break;

+        }

+

+        case 5:

+        {

+            net_config = GSW_PREFER_MODE_LTE;

+            break;

+        }

+

+        case 15:

+        {

+            net_config = GSW_PREFER_MODE_LTE_WCDMA_GSM;

+            break;

+        }

+    }

+

+    return net_config;

+}

+

+//64F010 -> 46001 (64->46,F0->0,10->01)

+static void transform_fplmn_str_to_plmn(char *entry)

+{

+    if (strncmp(entry, "FFFFFF", ENTRY_LENGTH) == 0) {

+        return; //if FFFFFF,means invalid fplmn, do nothing

+    }

+

+    char temp = entry[0];

+    entry[0] = entry[1];

+    entry[1] = temp;

+

+    temp = entry[ENTRY_LENGTH - 2];

+    entry[ENTRY_LENGTH - 2] = entry[ENTRY_LENGTH - 1];

+    entry[ENTRY_LENGTH - 1] = temp;

+

+    memmove(entry + 2, entry + 3, ENTRY_LENGTH - 2);

+

+    LOGE("after transform_fplmn_str_to_plmn: %s\n", entry);

+

+    //valid fplmn

+    fplmn_index++;

+}

+

+static void extract_mcc_mnc(char *entry, char *mcc, char *mnc)

+{

+    strncpy(mcc,entry,3);

+    mcc[3] = '\0';

+    strncpy(mnc,entry + 3,2);

+    mnc[2] = '\0';

+

+    LOGE("entry = %s, mcc = %s, mnc = %s\n", entry, mcc, mnc);

+}

+

+

+static void update_fplmn_list(char *fplmn_str)

+{

+    LOGE("fplmn_str = %s\n",fplmn_str);

+    char temp_fplmn_array[FPLMN_ARRAY_SIZE][7];

+    memset(fplmn_array, 0, sizeof(fplmn_array));

+    memset(temp_fplmn_array, 0, sizeof(temp_fplmn_array));

+    fplmn_index = 0;

+    int array_length = 0;

+

+    for (int i = 0; i < strlen(fplmn_str); i += 6) {

+        

+        int length = (i + 6 < strlen(fplmn_str)) ? 6 : strlen(fplmn_str) - i;

+        strncpy(temp_fplmn_array[array_length], fplmn_str + i, length);

+        temp_fplmn_array[array_length][length] = '\0'; 

+        array_length++;

+        if (i + 6 >= strlen(fplmn_str)) {

+            break;

+        }

+    }

+

+    for (int i = 0; i < array_length; i++) {

+        LOGE("array[%d] = %s\n", i, temp_fplmn_array[i]);

+        transform_fplmn_str_to_plmn(temp_fplmn_array[i]);

+        strncpy(fplmn_array[i], temp_fplmn_array[i], ENTRY_LENGTH);

+        LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);

+    }

+

+}

+

+static void format_plmn(char *result, char *plmn_entry)

+{

+    strncpy(result, plmn_entry, strlen(plmn_entry));

+    LOGE("result = %s, numStr = %s\n",result, plmn_entry);

+

+    if (strlen(result) >= 2) {

+        char temp = result[0];

+        result[0] = result[1];

+        result[1] = temp;

+    }

+    

+    LOGE("1.result = %s\n",result);

+

+    if (strlen(result) >= 3) {

+        memmove(&result[3], &result[2], strlen(result) - 2 + 1);

+        result[2] = 'F';

+    }

+

+    LOGE("2.result = %s\n",result);

+

+    if (strlen(result) >= 2) {

+        char temp = result[strlen(result) - 1];

+        result[strlen(result) - 1] = result[strlen(result) - 2];

+        result[strlen(result) - 2] = temp;

+    }

+

+    LOGE("3.result = %s\n",result);

+}

+

+

+static void convert_plmn_to_fplmn_str(char *fplmn_str)

+{

+    char temp_fplmn_str[128] = {0};

+    char temp[20]; // 临时存储单个格式化后的数字

+    int index = 0;

+

+    for (int i = 0; i < fplmn_index; i++) {

+        memset(temp, 0x0, sizeof(temp));

+        format_plmn(temp, fplmn_array[i]);

+        strcat(temp_fplmn_str, temp);

+        index += strlen(temp);

+    }

+

+    while(index < (6 * fplmn_max_length))

+    {

+        temp_fplmn_str[index++] = 'F';

+    }

+

+    // 修剪或截断formattedNumbers,确保它不超过6 * fplmn_max_length个字符

+    if (index > (6 * fplmn_max_length)) {

+        temp_fplmn_str[(6 * fplmn_max_length)] = '\0';

+    }

+

+    LOGE("%s\n", temp_fplmn_str);

+    strncpy(fplmn_str, temp_fplmn_str, strlen(temp_fplmn_str));

+    LOGE("fplmn_str = %s\n", fplmn_str);

+}

+

+static int check_index(char *mcc, char *mnc)

+{

+    int i = 0;

+

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

+    {

+        if(strncmp(fplmn_array[i], mcc, 3) == 0 && strncmp(fplmn_array[i] + 3, mnc, 2) == 0)

+        {

+            LOGE("index = %d\n", i);

+            return i;

+        }

+    }

+

+    LOGE("not find\n");

+    return -1;

+}

+

+static void remove_fplmn(int index)

+{

+    int write_index = 0;

+    for (int i = 0; i < fplmn_index; i++) {

+        if (i != index) {

+            strncpy(fplmn_array[write_index++], fplmn_array[i], ENTRY_LENGTH);

+        }

+    }

+    fplmn_index--;

+}

+

+static void gsw_serving_info_callback_thread()

+{

+    GSW_NW_SERVING_INFO *serving_info = (GSW_NW_SERVING_INFO*)malloc(sizeof(GSW_NW_SERVING_INFO));

+    memset(serving_info, 0x0, sizeof(GSW_NW_SERVING_INFO));

+    int ret = -1;

+    ret = gsw_get_nwinfo(serving_info);

+    if(ret != 0)

+    {

+        LOGE("gsw_get_nwinfo failed\n");

+        free(serving_info);

+        return; 

+    }

+

+    if(serving_cb)

+    {

+        serving_cb(*serving_info);

+        free(serving_info);

+    }

+}

+

+static void gsw_serving_info_callback(const void* data, int data_len)

+{

+    LOGE("gsw_serving_info_callback start\n");

+

+    if(data && data_len > 0)

+    {

+        pthread_t thread;

+        pthread_create(&thread, NULL, (void*)gsw_serving_info_callback_thread, NULL);

+    }

+

+    else

+    {

+        LOGE("data is NULL\n");

+        return;

+    }

+

+}

+

+static void gsw_sig_info_callback(const void* data, int data_len)

+{

+    LOGE("gsw_sig_info_callback start\n");

+

+    if(data && data_len == 8)

+    {

+        uint8 *net_data = (uint8*)data;

+        mbtk_radio_technology_enum type = (mbtk_radio_technology_enum)net_data[0];

+

+        signalStrength_t sig_strength;

+        memset(&sig_strength, 0x0, sizeof(signalStrength_t));

+

+        sig_strength.gw_sig_valid = 0;

+        sig_strength.wcdma_sig_valid = 0;

+        sig_strength.lte_sig_valid = 0;

+        sig_strength.nr_sig_valid = 0;

+

+        if(type == MBTK_RADIO_TECH_GSM || type == MBTK_RADIO_TECH_GSM_COMPACT || \

+           type == MBTK_RADIO_TECH_GSM_EGPRS)              //GSM

+        {

+            sig_strength.gw_sig_valid = 1;

+            sig_strength.rssi = rssi_convert_to_dBm(net_data[1]);

+        }

+

+        else if(type == MBTK_RADIO_TECH_E_UTRAN) 

+        {

+            sig_strength.lte_sig_valid = 1;

+            sig_strength.rsrp = rsrp_convert_to_dBm(net_data[7]);

+            sig_strength.rsrq = rsrq_convert_to_dB(net_data[6]);

+            sig_strength.rssnr = -99;

+        }

+

+        else if (type == MBTK_RADIO_TECH_UTRAN || type == MBTK_RADIO_TECH_UTRAN_HSDPA || \

+                 type == MBTK_RADIO_TECH_UTRAN_HSUPA || type == MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA ||  \

+                 type == MBTK_RADIO_TECH_UTRAN_HSPA )//WCDMA

+        {

+            sig_strength.wcdma_sig_valid = 1;

+            sig_strength.rscp = rssi_convert_to_dBm(net_data[1]);

+            sig_strength.ecno = ecno_convert_to_dB(net_data[5]);

+        }

+

+        if(sig_cb != NULL)

+        {

+            sig_cb(sig_strength);

+        }

+    }

+

+    else

+    {

+        LOGE("data is NULL\n");

+    }

+}

+

+static void gsw_modem_status_event_callback(const void* data, int data_len)

+{

+    LOGE("gsw_modem_status_event_callback start\n");

+

+    gsw_mode_state_e state = GSW_MODEM_STATE_UNKNOWN;

+

+    if(data && data_len > 0)

+    {

+        uint8 *net_data = (uint8*)data;

+        LOGE("gsw_modem_status_event_callback,data = %d\n", *net_data);

+        if(*net_data == 1)

+        {

+            state = GSW_MODEM_STATE_ONLINE;

+        }

+        else if(*net_data == 0)

+        {

+            state = GSW_MODEM_STATE_OFFLINE;

+        }

+

+        if(modem_cb != NULL)

+        {

+            modem_cb(state);

+        }

+    }

+

+}

+

+static void gsw_reject_callback(GSW_NW_RADIO_ACCESS_TECH_E rat, GSW_SERVICE_DOMAIN_E domain, int cause)

+{

+    LOGE("gsw_reject_callback start,rat = %d,domain = %d,cause = %d\n",rat,domain,cause);

+

+    GSW_NW_REJ_CAUSE_E *rej_cause = (GSW_NW_REJ_CAUSE_E*)malloc(sizeof(GSW_NW_REJ_CAUSE_E));

+    memset(rej_cause, 0x0, sizeof(GSW_NW_REJ_CAUSE_E));

+    

+    rej_cause->rej_cause = cause;

+    rej_cause->rej_rat = rat;

+    rej_cause->rej_domain = domain;

+

+    if(reject_cb != NULL)

+    {

+        LOGE("reject_cb is not NULL\n");

+        reject_cb(rej_cause);

+    }

+    else

+    {

+        LOGE("reject_cb is NULL\n");

+    }

+

+    free(rej_cause);

+    LOGE("gsw_reject_callback end\n");

+}

+

+

+

+/**

+ * @brief SDK interface to call back serving info

+ * @param  [in] handle_ptr 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_reg_serving_info_callback(GSW_NW_ServingInfoHandlePtr handle_ptr)

+{

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    if(handle_ptr == NULL)

+    {

+        LOGE("handle_ptr is NULL\n");

+        return GSW_HAL_FAIL;

+    }

+

+    serving_cb = handle_ptr;

+

+    return GSW_HAL_SUCCESS;

+

+}

+

+

+/**

+ * @brief SDK interface to call back sig info

+ * @param  [in] handle_ptr 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_reg_sig_info_callback(GSW_NW_SigInfoHandlePtr handle_ptr)

+{

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    if(handle_ptr == NULL)

+    {

+        LOGE("handle_ptr is NULL\n");

+        return GSW_HAL_FAIL;

+    }

+

+    sig_cb = handle_ptr;

+

+    return GSW_HAL_SUCCESS;

+

+}

+

+

+/**

+ * @brief SDK interface to call back rej cause

+ * @param  [in] handle_ptr 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_reg_rej_cause_callback(GSW_NW_RejectCauseHandlePtr handle_ptr)

+{

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    if(handle_ptr == NULL)

+    {

+        LOGE("handle_ptr is NULL\n");

+        return GSW_HAL_FAIL;

+    }

+

+    reject_cb = handle_ptr;

+

+    return GSW_HAL_SUCCESS;

+}

+

+

+/**

+ * @brief network sdk init

+ * @param  [in] token usr id define by who use

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_nw_sdk_init(int token)

+{

+    int ret = -1;

+

+    if (nw_init_flag == 1 && nw_info_handle != NULL)

+    {

+        return GSW_HAL_SUCCESS;

+    }

+

+    ret = mbtk_nw_api_import();

+    if (ret != 0)

+    {

+        LOGE("mbtk_nw_api_import fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    nw_info_handle = mbtk_info_handle_get();

+

+    if (nw_info_handle == NULL)

+    {

+        LOGE("mbtk_info_handle_get fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    char fplmn[256] = {0};

+    ret = mbtk_fplmn_get(nw_info_handle, fplmn);

+    if(ret != 0)

+    {

+        LOGE("mbtk_fplmn_get failed : %d\n",ret);

+        return GSW_HAL_FAIL;

+    }

+    fplmn_max_length = (strlen(fplmn)/6);

+    LOGE("fplmn = %s, fplmn_max_length = %d\n",fplmn,fplmn_max_length);

+    ret = mbtk_signal_state_change_cb_reg(nw_info_handle, gsw_sig_info_callback);

+

+    if (ret != 0)

+    {

+        LOGE("mbtk_signal_state_change_cb_reg fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    ret = mbtk_net_state_change_cb_reg(nw_info_handle, gsw_serving_info_callback);

+    if (ret != 0)

+    {

+        LOGE("mbtk_net_state_change_cb_reg fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    nw_init_flag = 1;

+

+    return GSW_HAL_SUCCESS;

+}

+

+

+/**

+ * @brief network sdk deinit

+ * @param 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_nw_sdk_deinit(void)

+{

+    int ret = -1;

+

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    ret = mbtk_info_handle_free(&nw_info_handle);

+    if(ret != GSW_HAL_SUCCESS)

+    {

+        LOGE("mbtk_info_handle_free fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    dlclose(dlHandle_mbtk);

+    nw_info_handle = NULL;

+    nw_init_flag = 0;

+

+    return GSW_HAL_SUCCESS;

+

+}

+

+

+/**

+ * @brief get current network reg info

+ * @param  [out] serving_info struct for network info

+ * include regstate ps_state opreator name mcc mcn etc

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_get_nwinfo(GSW_NW_SERVING_INFO *serving_info)

+{

+

+    int ret = -1;

+    LOGE("gsw_get_nwinfo start\n");

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        LOGE("nw_sdk_deinit not init\n");

+        return GSW_HAL_FAIL;

+    }

+

+    LOGE("mbtk_net_reg_get start \n");

+    //regstate

+    mbtk_net_reg_info_t reg;

+    memset(&reg, 0x0, sizeof(mbtk_net_reg_info_t));

+    ret = mbtk_net_reg_get(nw_info_handle, &reg);

+    if(ret)

+    {

+        LOGE("mbtk_net_reg_get fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    LOGE("convert_cs_reg_state\n");

+    //cs_state

+    serving_info->reg_state = convert_reg_state(reg.call_state);

+    LOGE("convert_ps_reg_state\n");

+    //ps_state

+    serving_info->ps_state = convert_reg_state(reg.data_state);

+    LOGE("convert_rat_mode\n");

+    //reg_rat

+    serving_info->reg_rat = convert_net_mode(reg.type);

+    //srv_domain

+    if(serving_info->reg_state == GSW_NETWORK_REG_REGISTERED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)

+    {

+        if(serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)

+        {

+            serving_info->srv_domain = GSW_SRV_DOMAIN_CS_PS;

+        }

+

+        else

+        {

+            serving_info->srv_domain = GSW_SRV_DOMAIN_CS_ONLY;

+        }

+    }

+

+    else if (serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)

+    {

+        serving_info->srv_domain = GSW_SRV_DOMAIN_PS_ONLY;

+    }

+

+    else

+    {

+        serving_info->srv_domain = GSW_SRV_DOMAIN_NO_SVC;

+        //if ps and cs is both not registed, reg_rat seted to GSW_NETWORK_RADIO_NO_SVC

+        serving_info->reg_rat = GSW_NETWORK_RADIO_NO_SVC;

+    }

+

+    LOGD("roaming_ind\n");

+    //roaming_ind

+    if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)

+    {

+        serving_info->roaming_ind = GSW_NETWORK_ROAMING_ON;

+    }

+    else

+    {

+        serving_info->roaming_ind = GSW_NETWORK_ROAMING_OFF;

+    }

+

+    LOGD("reject\n");

+    //reject

+    if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_DENIED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_DENIED)

+    {

+        LOGD("reject_callback\n");

+        gsw_reject_callback(serving_info->reg_rat,serving_info->srv_domain,99);

+    }

+

+    LOGD("reg_plmn / operator name\n");

+    //reg_plmn / operator name

+    mbtk_net_info_t net;

+    memset(&net, 0x0, sizeof(mbtk_net_info_t));

+    LOGD("mbtk_net_sel_mode_get start \n");

+    ret = mbtk_net_sel_mode_get(nw_info_handle, &net);

+    LOGD("mbtk_net_sel_mode_get end \n");

+    if(ret == 0 && net.plmn > 0)

+    {

+        int i = 0;

+

+        LOGD("start to find mcc");

+        while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))

+        {

+            if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)

+            {

+                LOGD("find mcc\n");

+                break;

+            }

+            i++;

+        }

+

+

+        if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))

+        {

+            LOGD("not find mcc");

+            strcpy(serving_info->operator_name, "unknown");

+            sprintf(serving_info->reg_plmn, "%d", net.plmn);

+        }

+

+        else

+        {

+            LOGD("find mcc\n");

+            strcpy(serving_info->operator_name, lynq_operator_mcc_mnc[i].lynq_operator_l);

+            sprintf(serving_info->reg_plmn, "%d", net.plmn);

+        }

+

+        LOGE("operator_name = %s\n", serving_info->operator_name);

+        LOGE("reg_plmn = %s\n", serving_info->reg_plmn);

+    }

+

+

+    LOGD("get cell id/tac/lac/sid/nid\n");

+    //cell id/tac/lac/sid/nid

+    mbtk_cell_type_enum cell_type;

+    if(serving_info->reg_rat == GSW_NETWORK_RADIO_GSM)

+    {

+        cell_type = MBTK_CELL_TYPE_GSM;

+    }

+    else if(serving_info->reg_rat == GSW_NETWORK_RADIO_UMTS)

+    {

+        cell_type = MBTK_CELL_TYPE_UMTS;

+    }

+    else

+    {

+        cell_type = MBTK_CELL_TYPE_LTE;

+    }

+

+    list_node_t* cell_list = NULL;

+    

+    LOGD("mbtk_cell_get start\n");

+    ret = mbtk_cell_get(nw_info_handle, &cell_type, &cell_list);

+    if(ret != 0 || cell_list == NULL)

+    {

+        LOGE("mbtk_cell_get fail\n");

+        return GSW_HAL_FAIL;

+    }

+    else

+    {

+        LOGE("mbtk_cell_get end,start to get node\n");

+        list_first(cell_list);

+        LOGE("list_first end\n");

+        mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);

+        if(cell)

+        {

+            LOGE("cell is not null,value2 = %u\n",cell->value2);

+            switch(cell_type)

+            {

+                case MBTK_CELL_TYPE_LTE:

+                {

+                    LOGE("is lte\n");

+                    //LOGE("LTE : tac=%x, PCI=%x, dlEuarfcn=%x, ulEuarfcn=%x, band=%x\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);

+                    LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);

+                    snprintf(serving_info->tac,sizeof(serving_info->tac),"%d",cell->value1);

+                    strcpy(serving_info->lac,"");

+                    snprintf(serving_info->cell_id,sizeof(serving_info->cell_id),"%d",cell->value8);

+                    break;

+                }

+

+                case MBTK_CELL_TYPE_GSM:

+                {

+                    LOGE("is gsm\n");

+                    LOGE("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);

+                    sprintf(serving_info->lac,"%d",cell->value1);

+                    memset(serving_info->tac,0,sizeof(serving_info->tac));

+                    sprintf(serving_info->cell_id,"%d",cell->value2);

+                    break;

+                }    

+                case MBTK_CELL_TYPE_UMTS:

+                {

+                    LOGE("is wcdma\n");

+                    LOGE("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);

+                    sprintf(serving_info->lac,"%d",cell->value1);

+                    memset(serving_info->tac,0,sizeof(serving_info->tac));

+                    sprintf(serving_info->cell_id,"%d",cell->value2);

+                    break;

+                }

+                

+                default:

+                    break;

+            }

+        }

+        else

+        {

+            LOGE("cell is null\n");

+        }

+    }

+

+    //not support now

+    serving_info->sid = 0;

+    serving_info->nid = 0;

+

+    return GSW_HAL_SUCCESS;

+}

+

+

+/**

+ * @brief get current network type

+ * @param  [out] netype as GSW_NW_RADIO_ACCESS_TECH_E type

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_get_netype(int *netype)

+{

+    int ret = -1;

+

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    //regstate

+    mbtk_net_reg_info_t reg;

+    ret = mbtk_net_reg_get(nw_info_handle, &reg);

+    if(ret)

+    {

+        LOGE("mbtk_net_reg_get fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    if(reg.data_state == MBTK_NET_REG_STATE_HOME || reg.data_state == MBTK_NET_REG_STATE_ROAMING)

+    {

+        *netype = convert_net_mode(reg.type);

+    }

+    else

+    {

+        *netype = GSW_NETWORK_RADIO_NO_SVC;

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+

+/**

+ * @brief get radio opmode, as open and close airplane mode

+ * @param  [out] op_mode 1 is radio on, 0 is radio off

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_get_opmode(int *op_mode)

+{

+    int tmp_rf = -1;

+    int ret = -1;

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    ret = mbtk_get_modem_fun(nw_info_handle, &tmp_rf);

+    if (ret != 0)

+    {

+        LOGE("mbtk_get_modem_fun fail\n");

+        return GSW_HAL_FAIL;

+    }

+    if(tmp_rf == LYNQ_AIR_CFUN_MODE_OFF)

+    {

+        *op_mode = GSW_OP_MODE_LPM;

+    }

+

+    if(tmp_rf == LYNQ_AIR_PLANE_MODE_ON)

+    {

+        *op_mode = GSW_OP_MODE_OFFLINE;

+    }

+

+    if(tmp_rf == LYNQ_AIR_PLANE_MODE_OFF)

+    {

+        *op_mode = GSW_OP_MODE_ONLINE;

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+

+

+/**

+ * @brief set radio opmode, as open and close airplane mode

+ * @param  [in] op_mode 1 is radio on, 0 is radio off

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_set_opmode(int op_mode)

+{

+    mbtk_modem_info_t info;

+    int rf_mode = -1;

+    int ret = -1;

+

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    if(op_mode == GSW_OP_MODE_LPM)

+    {

+        rf_mode = LYNQ_AIR_CFUN_MODE_OFF;

+    }

+

+    if(op_mode == GSW_OP_MODE_ONLINE)

+    {

+        rf_mode = LYNQ_AIR_PLANE_MODE_OFF;

+    }

+

+    if(op_mode == GSW_OP_MODE_OFFLINE)

+    {

+        rf_mode = LYNQ_AIR_PLANE_MODE_ON;

+    }

+

+    if (rf_mode != LYNQ_AIR_PLANE_MODE_ON && rf_mode != LYNQ_AIR_PLANE_MODE_OFF && rf_mode != LYNQ_AIR_CFUN_MODE_OFF) 

+    {

+        LOGE("Input mode is error!\n");

+        return GSW_HAL_FAIL;

+    }

+

+    info.fun = rf_mode;

+    info.rst = 0;

+    ret = mbtk_set_modem_fun(nw_info_handle, &info);

+    if (ret != 0)

+    {

+        LOGE("gsw_set_opmode fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    return GSW_HAL_SUCCESS;

+

+}

+

+

+/**

+ * @brief get network mode preference of mdm search network scale

+ * @param  [out] mode_pref net_work pref mode:

+ *    enum prefer_mode

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_get_mode_preference(int *mode_pref)

+{

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    int ret = -1;

+    mbtk_band_info_t band;

+    memset(&band, 0, sizeof(mbtk_band_info_t));

+

+    ret = mbtk_current_band_get(nw_info_handle, &band);

+    if(ret != 0)

+    {

+        LOGE("mbtk_current_band_get fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    *mode_pref = convert_gsw_net_config(band.net_pref);

+    LOGE("band.net_pref = %d\n", *mode_pref);

+    if(*mode_pref <= 0)

+    {

+        LOGE("no support mode\n");

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+

+

+}

+

+/**

+ * @brief set network mode preference of mdm search network scale

+ * @param  [in] mode_pref net_work pref mode:

+ *     enum prefer_mode

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_set_mode_preference(int mode_pref)

+{

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    int ret = -1;

+

+    mbtk_band_info_t band;

+    memset(&band, 0, sizeof(mbtk_band_info_t));

+

+    band.net_pref = convert_mbtk_net_config(mode_pref);

+    LOGE("band.net_pref = %d\n", band.net_pref);

+

+    if(band.net_pref < 0)

+    {

+        LOGE("no support mode\n");

+        return GSW_HAL_FAIL;

+    }

+

+    ret = mbtk_current_band_set(nw_info_handle, &band);

+    if(ret != 0)

+    {

+        LOGE("mbtk_current_band_set fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief get signal csq value

+ * @param  [out] csq_value csq of signalstrengh 0 - 31, 99 invalid

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_get_sig_info(int *csq_value)

+{

+    int ret = -1;

+

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_signal_info_t signal;

+    memset(&signal, 0x0, sizeof(mbtk_signal_info_t));

+    ret = mbtk_net_signal_get(nw_info_handle, &signal);

+    if(ret != 0)

+    {

+        LOGE("mbtk_net_signal_get fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    LOGD("signal.type=%d\n", signal.type);

+    switch(signal.type)

+    {

+        case MBTK_RADIO_TECH_GSM:

+        case MBTK_RADIO_TECH_GSM_COMPACT:

+        case MBTK_RADIO_TECH_GSM_EGPRS:

+        {

+            LOGD("rssi = %d\n",signal.rssi);

+            *csq_value = rssi_convert_to_dBm(signal.rssi);

+            break;

+        }

+        case MBTK_RADIO_TECH_E_UTRAN:

+        {

+            LOGD("rsrp = %d\n",signal.rsrp);

+            *csq_value = rsrp_convert_to_dBm(signal.rsrp);

+            break;

+        }

+        case MBTK_RADIO_TECH_UTRAN:

+        case MBTK_RADIO_TECH_UTRAN_HSDPA:

+        case MBTK_RADIO_TECH_UTRAN_HSUPA:

+        case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:

+        case MBTK_RADIO_TECH_UTRAN_HSPA:

+        {

+            LOGD("rscp = %d\n",signal.rscp);

+            *csq_value = rscp_convert_to_dBm(signal.rscp);

+            break;

+        }

+        default:

+        {

+            LOGD("[%s] unknown reg type.[%d]\n", __func__, signal.type);

+            return GSW_HAL_FAIL;

+        }

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief set nework power mode, for tcam enter standby or exit standby

+ * @param  [in] mode TRUE(1) when enter standby, FALSE(0) after wake up

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_network_set_power_mode(char mode)

+{

+    int ret = -1;

+

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    if(mode != 0 && mode != 1)

+    {

+        LOGE("Input mode is error!\n");

+        return GSW_HAL_FAIL;

+    }

+

+    if(mode == 1)

+    {

+        mode = 6;

+    }

+

+    ret = mbtk_wakeup_state_set(nw_info_handle, mode);

+    if(ret != 0)

+    {

+        LOGE("mbtk_wakeup_state_set fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    return GSW_HAL_SUCCESS;

+

+

+

+}

+

+/**

+ * @brief convert rsrp rscp rssi to csq value.

+ * @param  [in] netType signal radio tech 2 means 2G 3 mens 3G,4 is 4G,5 is 5G

+ * @param  [in] sigvalue input signal_strength for different nettype

+ * rsrp  for 4G/5G, rscp for 3G, rssi for 2G

+

+ * @retval csq

+ * @retval other: fail

+ */

+int gsw_sigInfo_to_csq(int netType, int sigValue)

+{

+    switch(netType)

+    {

+        case 1:

+        case 2:

+        case 3:

+        case 4:        //GSM

+        {

+            return gsw_rssi_to_csq(sigValue);

+        }

+            

+        case 5:        //WCDMA

+        {

+            return gsw_rscp_to_csq(sigValue);

+        }

+            

+        case 6:        //LTE

+        {

+            return gsw_rsrp_to_csq(sigValue);

+        }

+            

+        default:

+        {

+            LOGE("parameter error\n");

+            return GSW_HAL_FAIL;

+        }

+    }

+}

+

+/*

+ * @brief get mobile operator name

+   @param [out] nw_operator_name_infos get the long and short operator name info 

+   @retval 0: success

+   @retval 0: other: fail

+ */

+int gsw_get_mobile_operator_name(gsw_mobile_operator_name *nw_operator_name_infos)

+{

+    char OperatorFN[128];

+    char OperatorSH[128];

+    char temp[12] = {0};

+    mbtk_net_info_t net;

+

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    if(!mbtk_net_sel_mode_get(nw_info_handle, &net) && net.plmn > 0)

+    {

+        LOGE("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);

+        int i = 0;

+        while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))

+        {

+            if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)

+                break;

+            i++;

+        }

+

+        if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))   // No found mcc&mnc

+        {

+            strcpy(OperatorFN, "UNKNOWN");

+            strcpy(OperatorSH, "UNKNOWN");

+        }

+        else

+        {

+            strcpy(OperatorFN, lynq_operator_mcc_mnc[i].lynq_operator_l);

+            strcpy(OperatorSH, lynq_operator_mcc_mnc[i].lynq_operator_s);

+

+            memset(temp,0,12);

+            memset(nw_operator_name_infos->mcc,0,4);

+            sprintf(temp, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);

+            strncpy(nw_operator_name_infos->mcc, temp, strlen(temp));

+

+            memset(temp,0,12);

+            memset(nw_operator_name_infos->mnc,0,4);

+            sprintf(temp, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);

+            strncpy(nw_operator_name_infos->mnc, temp, strlen(temp));

+        }

+

+        memset(nw_operator_name_infos->long_eons,0,128);

+        memcpy(nw_operator_name_infos->long_eons,OperatorFN,strlen(OperatorFN));

+        memset(nw_operator_name_infos->short_eons,0,128);

+        memcpy(nw_operator_name_infos->short_eons,OperatorSH,strlen(OperatorSH));

+        

+        return GSW_HAL_SUCCESS;

+    }

+

+    else

+    {

+        LOGE("mbtk_net_sel_mode_get fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+

+/*

+ * @brief get current serving cell info

+ * @param cell_info: [out] struct for current cell info

+ * include earfcn mcc mnc pci psc tac lac etc.

+ * @return int: 0 is success, other failed

+ */

+int gsw_get_cell_info(GSW_NW_CELL_INFO *cell_info)

+{

+    int ret = -1;

+

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        LOGE("nw_sdk_deinit not init\n");

+        return GSW_HAL_FAIL;

+    }

+

+    list_node_t* cell_list = NULL;

+    int neibor_count = 0;

+    mbtk_cell_type_enum type;

+    ret = mbtk_cell_get(nw_info_handle, &type, &cell_list);

+    if(ret || cell_list == NULL) {

+        LOGE("mbtk_cell_get failed : %d\n", ret);

+    } else {

+        list_first(cell_list);

+        mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);

+        if(cell) { // Current server cell.

+            switch(type)

+            {

+                case 0:

+                {

+                    LOGD("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);

+                    char gsm_temp[12] = {0};

+

+                    cell_info->rat = GSW_NETWORK_RADIO_GSM;

+

+                    cell_info->mcc_valid = 1;

+                    snprintf(gsm_temp, sizeof(gsm_temp) ,"%d", cell->value5);

+                    strncpy(cell_info->mcc, gsm_temp, sizeof(cell_info->mcc));

+

+                    memset(gsm_temp, 0, sizeof(gsm_temp));

+

+                    cell_info->mnc_valid = 1;

+                    snprintf(gsm_temp, sizeof(gsm_temp) ,"%d", cell->value6);

+                    strncpy(cell_info->mnc, gsm_temp, sizeof(cell_info->mnc));

+

+                    cell_info->cell_id_valid = 1;

+                    cell_info->cell_id = cell->value2;

+

+                    cell_info->lac_valid = 1;

+                    cell_info->lac = cell->value1;

+

+                    cell_info->arfcn_valid = 1;

+                    cell_info->arfcn = cell->value3;

+                    

+                    break;

+                }

+                    

+                case 1:

+                {

+                    LOGD("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);

+                    char wcdma_temp[12] = {0};

+

+                    cell_info->rat = GSW_NETWORK_RADIO_UMTS;

+

+                    cell_info->mcc_valid = 1;

+                    snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%d", cell->value4);

+                    strncpy(cell_info->mcc, wcdma_temp, sizeof(cell_info->mcc));

+

+                    memset(wcdma_temp, 0, sizeof(wcdma_temp));

+

+                    cell_info->mnc_valid = 1;

+                    snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%d", cell->value5);

+                    strncpy(cell_info->mnc, wcdma_temp, sizeof(cell_info->mnc));

+

+                    cell_info->lac_valid = 1;

+                    cell_info->lac = cell->value1;

+

+                    cell_info->cell_id_valid = 1;

+                    cell_info->cell_id = cell->value2;

+

+                    cell_info->uarfcn_valid = 1;

+                    cell_info->uarfcn = cell->value3;

+

+                    cell_info->psc_valid = 1;

+                    cell_info->psc = cell->value6;

+                    break;

+                }

+                    

+                case 2:

+                {

+                    LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);

+                    

+                    char lte_temp[12] = {0};

+

+                    cell_info->rat = GSW_NETWORK_RADIO_LTE;

+

+                    cell_info->mcc_valid = 1;

+                    snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);

+                    strncpy(cell_info->mcc, lte_temp, sizeof(cell_info->mcc));

+

+                    memset(lte_temp, 0, sizeof(lte_temp));

+

+                    cell_info->mnc_valid = 1;

+                    snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);

+                    strncpy(cell_info->mnc, lte_temp, sizeof(cell_info->mnc));

+

+                    cell_info->tac_valid = 1;

+                    cell_info->tac = cell->value1;

+

+                    cell_info->pci_valid = 1;

+                    cell_info->pci = cell->value2;

+

+                    cell_info->earfcn_valid = 1;

+                    cell_info->earfcn = cell->value3;

+

+                    cell_info->bler_valid = 1;

+                    cell_info->bler = cell->value4;

+

+                    cell_info->band_valid = 1;

+                    cell_info->band = cell->value5;

+

+                    cell_info->rsrp_valid = 1;

+                    cell_info->rsrp = cell->value8;

+

+                    cell_info->rsrq_valid = 1;

+                    cell_info->rsrq = cell->value9;

+

+                    cell_info->cell_id_valid = 1;

+                    cell_info->cell_id = cell->value10;

+

+                    break;

+                }

+

+                default:

+                    break;

+            }

+        }

+

+        while ((cell = (mbtk_cell_info_t*) list_next(cell_list)) && neibor_count < 5)

+        {

+            switch(type)

+            {

+                //GSM

+                case 0:

+                {

+

+                }

+                //WCDMA

+                case 1:

+                {

+                    LOGE("CELL : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);

+

+                    //cell_info->ext_info[neibor_count]->lac = cell->value1;

+

+                    cell_info->ext_info[neibor_count].cell_id_valid = 1;

+                    cell_info->ext_info[neibor_count].cell_id = cell->value2;

+

+                    cell_info->ext_info[neibor_count].arfcn_valid = 1;

+                    cell_info->ext_info[neibor_count].arfcn = cell->value3;

+

+                    cell_info->ext_info[neibor_count].rat = cell_info->rat = GSW_NETWORK_RADIO_UMTS;

+

+                    neibor_count++;

+

+                }

+                //LTE

+                case 2:

+                {

+                    LOGE("CELL : phyCellId=%d, euArfcn=%d, rsrp=%d, rsrq=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);

+                    char lte_temp[12] = {0};

+                    cell_info->ext_info[neibor_count].rat = GSW_NETWORK_RADIO_LTE;

+

+                    snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);

+                    strncpy(cell_info->ext_info[neibor_count].mcc, lte_temp, sizeof(cell_info->mcc));

+

+                    memset(lte_temp, 0, sizeof(lte_temp));

+

+                    snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);

+                    strncpy(cell_info->ext_info[neibor_count].mnc, lte_temp, sizeof(cell_info->mnc));

+

+                    cell_info->ext_info[neibor_count].pci = cell->value1;

+                    cell_info->ext_info[neibor_count].pci_valid = 1;

+

+                    cell_info->ext_info[neibor_count].arfcn = cell->value2;

+                    cell_info->ext_info[neibor_count].arfcn_valid = 1;

+

+                    cell_info->ext_info[neibor_count].rsrp = cell->value3;

+                    cell_info->ext_info[neibor_count].rsrp_valid = 1;

+

+                    cell_info->ext_info[neibor_count].rsrq = cell->value4;

+                    cell_info->ext_info[neibor_count].rsrq_valid = 1;

+

+                    cell_info->ext_info[neibor_count].cell_id = cell->value5;

+                    cell_info->ext_info[neibor_count].cell_id_valid = 1;

+

+                    cell_info->ext_info[neibor_count].band = cell->value9;

+                    cell_info->ext_info[neibor_count].band_valid = 1;

+

+                    cell_info->ext_info[neibor_count].rssi = cell->value10;

+                    cell_info->ext_info[neibor_count].rssi_valid = 1;

+

+                    neibor_count++;

+                }

+

+                default:

+                    break;

+            }

+        }

+    }

+    list_free(cell_list);

+

+    return GSW_HAL_SUCCESS;

+}

+

+/*

+ * @brief set modem status event callback

+   @param [in] handle_ptr callback function address

+   @retval 0: success

+   @retval 0: other: fail

+ */

+int gsw_reg_set_modem_status_event_callback(GSW_NW_ModemStateHandlePtr handle_ptr)

+{

+

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    int ret = -1;

+

+    if(handle_ptr == NULL)

+    {

+        LOGE("handle_ptr is NULL\n");

+        return GSW_HAL_FAIL;

+    }

+

+    modem_cb = handle_ptr;

+

+    ret = mbtk_radio_state_change_cb_reg(nw_info_handle,gsw_modem_status_event_callback);

+    if(ret != 0)

+    {

+        LOGE("mbtk_radio_state_change_cb_reg failed : %d\n", ret);

+        return GSW_HAL_FAIL;

+    }

+

+    return GSW_HAL_SUCCESS;

+

+}

+

+

+/*

+ * @brief get PLMNs from the FPLMN list

+ * @param [inout] plmn_list: 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_get_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)

+{

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    int ret = -1;

+    char fplmn[256] = {0};

+    LOGE("mbtk_fplmn_get enter\n");

+    ret = mbtk_fplmn_get(nw_info_handle, fplmn);

+    LOGE("mbtk_fplmn_get exit\n");

+    if(ret != 0)

+    {

+        LOGE("mbtk_fplmn_get failed : %d\n",ret);

+        return GSW_HAL_FAIL;

+    }

+

+    update_fplmn_list(fplmn);

+    for(int i = 0; i < fplmn_index; i++)

+    {

+        if(strcmp(fplmn_array[i],"FFFFFF") == 0)

+        {

+            continue;

+        }

+        extract_mcc_mnc(fplmn_array[i], plmn_list->plmn_list[plmn_list->plmn_list_len].mcc, plmn_list->plmn_list[plmn_list->plmn_list_len].mnc);

+        LOGE("mcc = %s, mnc = %s\n", plmn_list->plmn_list[plmn_list->plmn_list_len].mcc, plmn_list->plmn_list[plmn_list->plmn_list_len].mnc);

+        plmn_list->plmn_list_len++;

+    }

+

+    LOGE("fplmn = %s\n", fplmn);

+    return GSW_HAL_SUCCESS;

+}

+

+/*

+ * @brief add PLMNs from the plmn_list to the FPLMN list

+ * @param [in] plmn_list: 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_add_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)

+{

+

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    if(plmn_list->plmn_list_len >= fplmn_max_length)

+    {

+        LOGE("can't save all the plmn\n");

+        return GSW_HAL_FAIL;

+    }

+

+    int i = 0;

+    int index = -1;

+

+    for(i = 0; i < plmn_list->plmn_list_len; i++)

+    {

+        index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);

+

+        if(index == -1)

+        {

+            LOGE("no this PLMN, add it\n");

+            if((fplmn_index + plmn_list->plmn_list_len) > fplmn_max_length)

+            {

+                LOGE("can't save all the plmn\n");

+                return GSW_HAL_FAIL;

+            }

+

+            else

+            {

+                memcpy(fplmn_array[fplmn_index], plmn_list->plmn_list[i].mcc, 3);

+                memcpy(fplmn_array[fplmn_index] + 3, plmn_list->plmn_list[i].mnc, 2);

+                fplmn_array[fplmn_index][5] = '\0';

+                LOGE("fplmn_array[%d] = %s\n", fplmn_index, fplmn_array[fplmn_index]);

+                fplmn_index++;

+            }

+        }

+

+        else

+        {

+            LOGE("already have this PLMN, don't add it\n");

+        }

+    }

+

+    char fplmn_str[256] = {0};

+    convert_plmn_to_fplmn_str(fplmn_str);

+

+    LOGE("fplmn_str = %s\n", fplmn_str);

+

+    int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);

+    if(ret != 0)

+    {

+        LOGE("mbtk_fplmn_set failed : %d\n",ret);

+        return GSW_HAL_FAIL;

+    }

+

+    LOGE("gsw_add_forbidden_networks exit\n");

+    return GSW_HAL_SUCCESS;

+}

+

+/*

+ * @brief Remove PLMNs from the plmn_list from the FPLMN list

+ * @param [in] plmn_list: 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_remove_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)

+{

+    LOGE("gsw_remove_forbidden_networks enter\n");

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    int i = 0;

+    int index = -1;

+

+    for(i = 0; i < plmn_list->plmn_list_len; i++)

+    {

+        index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);

+        if(index != -1)

+        {

+            remove_fplmn(index);

+        }

+        else

+        {

+            LOGE("no this PLMN, can't remove it\n");

+        }

+    }

+

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

+    {

+        LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);

+    }

+

+    char fplmn_str[256] = {0};

+    convert_plmn_to_fplmn_str(fplmn_str);

+    LOGE("fplmn_str = %s\n", fplmn_str);

+

+    int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);

+    if(ret != 0)

+    {

+        LOGE("mbtk_fplmn_set failed : %d\n",ret);

+        return GSW_HAL_FAIL;

+    }

+

+    LOGE("gsw_remove_forbidden_networks exit\n");

+    return GSW_HAL_SUCCESS;

+}

+

+/*

+ * @brief clear FPLMN list

+ * @param

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_clear_forbidden_networks(void)

+{

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    char fplmn_str[FPLMN_STRING_LENGTH+1]; 

+    memset(fplmn_str, 'F', (6 * fplmn_max_length));

+    fplmn_str[(6 * fplmn_max_length)] = '\0'; 

+

+    LOGE("%s\n", fplmn_str);

+    int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);

+    if(ret != 0)

+    {

+        LOGE("mbtk_fplmn_set failed : %d\n",ret);

+        return GSW_HAL_FAIL;

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+/*

+ * @brief get oos config

+ * @param [in] oos_config

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_oos_config_get(GSW_NW_OOS_CONFIG_INFO_T *pt_info)

+{

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    if(pt_info == NULL)

+    {

+        LOGE("pt_info is null\n");

+        return GSW_HAL_FAIL;

+    }

+

+    int ret = -1;

+

+    mbtk_oos_info oos_info;

+    memset(&oos_info, 0x00, sizeof(mbtk_oos_info));

+

+    ret = mbtk_oos_get(nw_info_handle, &oos_info);

+    if(ret != 0)

+    {

+        LOGE("mbtk_oos_get failed : %d\n",ret);

+        return GSW_HAL_FAIL;

+    }

+

+    if(oos_info.mode == 0)

+    {

+        pt_info->t_min = 0;

+        pt_info->t_step = 0;

+        pt_info->t_max = 0;

+    }

+

+    else

+    {

+        pt_info->t_min = (int)oos_info.oosPhase[0];

+        pt_info->t_step = (int)oos_info.oosPhase[1];

+        pt_info->t_max = (int)oos_info.oosPhase[2];

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+

+/*

+ * @brief set oos config

+ * @param [in] oos_config

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_oos_config_set(GSW_NW_OOS_CONFIG_INFO_T *pt_info)

+{

+    if (nw_init_flag == 0 || nw_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    if(pt_info == NULL)

+    {

+        LOGE("pt_info is null\n");

+        return GSW_HAL_FAIL;

+    }

+

+    int ret = -1;

+    mbtk_oos_info oos_info;

+    memset(&oos_info, 0x00, sizeof(mbtk_oos_info));

+

+    if (pt_info->t_min < 0 || pt_info->t_step < 0 || pt_info->t_max < 0)

+    {

+        LOGE("gsw_oos_config_set set time < 0 ");

+        return GSW_HAL_FAIL;

+    }

+    else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && pt_info->t_step == 0 && pt_info->t_max == 0)

+    {

+        oos_info.mode = 1;

+        oos_info.oosPhase[0] = pt_info->t_min;

+    }

+    else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && (pt_info->t_step > 0 && pt_info->t_step <= 255) && pt_info->t_max == 0)

+    {

+        oos_info.mode = 1;

+        oos_info.oosPhase[0] = pt_info->t_min;

+        oos_info.oosPhase[1] = pt_info->t_step;

+    }

+    else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && (pt_info->t_step > 0 && pt_info->t_step <= 255) && (pt_info->t_max > 0 && pt_info->t_max <= 255))

+    {

+        oos_info.mode = 1;

+        oos_info.oosPhase[0] = pt_info->t_min;

+        oos_info.oosPhase[1] = pt_info->t_step;

+        oos_info.oosPhase[2] = pt_info->t_max;

+    }

+    else if (pt_info->t_min == 0 && pt_info->t_step == 0 && pt_info->t_max == 0)

+    {

+        oos_info.mode = 0;

+    }

+    else

+    {

+        LOGE("gsw_oos_config_set set Format err");

+        return GSW_HAL_FAIL;

+    }

+

+    ret = mbtk_oos_set(nw_info_handle, &oos_info);

+    if(ret != 0)

+    {

+        LOGE("mbtk_oos_set failed : %d\n",ret);

+        return GSW_HAL_FAIL;

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+

+

diff --git a/mbtk/libgsw_lib/gsw_oem_rw_interface.c b/mbtk/libgsw_lib/gsw_oem_rw_interface.c
new file mode 100755
index 0000000..6c60e98
--- /dev/null
+++ b/mbtk/libgsw_lib/gsw_oem_rw_interface.c
@@ -0,0 +1,262 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <fcntl.h>

+#include <unistd.h>

+#include <sys/ioctl.h>

+#include <mtd/mtd-user.h>

+#include <errno.h>

+#include <dlfcn.h>

+

+#include "gsw_oem_rw_interface.h"

+

+

+#ifndef LOG_ERR_LEVEL
+#define LOG_ERR_LEVEL  3      /* error conditions */
+#endif
+#ifndef LOG_WARN_LEVEL
+#define LOG_WARN_LEVEL 4   /* warning conditions */
+#endif
+#ifndef LOG_INFO_LEVEL
+#define LOG_INFO_LEVEL 6      /* informational */
+#endif
+#ifndef LOG_DEBUG_LEVEL
+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */
+#endif
+#ifndef LOG_VERBOSE_LEVEL
+#define LOG_VERBOSE_LEVEL 8
+#endif

+

+#define ERASE_BLOCK_SIZE (256*1024)

+

+#define LIB_PATH "/lib/libmbtk_lib.so"

+

+

+#define StatFunc(x,y) stat(x,y)

+

+#define LOGV(fmt, args ...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)
+
+#define LOGI(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)
+
+#define LOGD(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)
+
+#define LOGW(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)
+
+#define LOGE(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+    

+typedef void (*mbtk_log)(int level, const char *format,...);

+           

+typedef int (*mbtk_oem_read_data_ext)(unsigned int block_id, void *data, unsigned int *len);

+            

+typedef int (*mbtk_oem_write_data_ext)(unsigned int block_id, void *data, unsigned int len);

+

+static mbtk_log fun_ptr_log = NULL;

+

+static mbtk_oem_read_data_ext mbtk_read_fun_ptr = NULL;

+static mbtk_oem_write_data_ext mbtk_write_fun_ptr = NULL;

+

+static void *handle = NULL;

+

+static int  init_fun_handle()

+{

+    if(handle == NULL)

+    {

+        handle = dlopen(LIB_PATH, RTLD_NOW );

+        if(handle == NULL)

+        {

+            return -1;

+        }

+        if(fun_ptr_log == NULL)

+        {

+            fun_ptr_log = (mbtk_log)dlsym(handle, "mbtk_log");

+            if(fun_ptr_log ==  NULL)

+            {

+                return -1;

+            }

+        }

+        if(mbtk_read_fun_ptr == NULL)

+        {

+            mbtk_read_fun_ptr = (mbtk_oem_read_data_ext)dlsym(handle, "mbtk_oem_read_data_ext");

+            if(mbtk_read_fun_ptr ==  NULL)

+            {

+                return -1;

+            }

+        }

+        if(mbtk_write_fun_ptr == NULL)

+        {

+            mbtk_write_fun_ptr = (mbtk_oem_write_data_ext)dlsym(handle, "mbtk_oem_write_data_ext");

+            if(mbtk_write_fun_ptr ==  NULL)

+            {

+                return -1;

+            }

+        }

+       

+     }

+    return 0;

+}

+

+static void deinit_fun_handle()

+{

+    if(handle != NULL)

+    {

+        dlclose(handle);

+        handle = NULL;

+    }

+    

+    fun_ptr_log = NULL;

+    mbtk_write_fun_ptr = NULL;

+    mbtk_read_fun_ptr = NULL;

+    

+}

+

+/**

+ * @brief Read data from spec block of flash

+ * @param [in] unsigned int

+ * @param [out] void *

+ * @param [out] unsigned int * 

+ * @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+ */

+

+int gsw_oem_read_data_ext(unsigned int block_id, void *data, unsigned int *len) 

+{

+

+    int ret = -1;

+    unsigned int actual_len = 0;

+    char *temp_buffer = NULL;

+    ret  = init_fun_handle();

+    if(ret == -1)

+    {

+        printf(" init_fun_handle error ret %d\n",ret);

+        deinit_fun_handle();

+        return GSW_HAL_NORMAL_FAIL;

+    }

+   

+    if (!data || !len) 

+    {

+        LOGE("invalid :data or len us NULL\n");

+        deinit_fun_handle();

+        return GSW_HAL_ARG_INVALID;

+    }

+

+    temp_buffer = (char *)malloc(ERASE_BLOCK_SIZE);

+    if (temp_buffer == NULL) 

+    {

+        LOGE("Failed to allocate read buffer ");

+        deinit_fun_handle();

+        return -1;

+    }

+    

+    memset(temp_buffer, 0, ERASE_BLOCK_SIZE);

+    

+    ret = mbtk_read_fun_ptr(block_id,temp_buffer,&actual_len);

+    if(ret != 0)

+    {

+        LOGE("mbtk_read_fun_ptr  failed");

+        free(temp_buffer); 

+        deinit_fun_handle();

+        return GSW_HAL_NORMAL_FAIL;

+    }

+    *len = actual_len;

+    memcpy(data, temp_buffer, *len);

+    free(temp_buffer); 

+    deinit_fun_handle();

+    

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief Write data to spec block of flash

+ * @param  [in] unsigned int

+ * @param  [in] void *

+ * @param  [in] unsigned int

+ * @retval 0: success

+ * @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+ */

+

+int gsw_oem_write_data_ext(unsigned int block_id, void *data, unsigned int len) 

+{

+    int ret = -1;

+    ret  = init_fun_handle();

+    if(ret == -1)

+    {

+        printf("init log error ret %d\n",ret);

+        deinit_fun_handle();

+        return GSW_HAL_NORMAL_FAIL;

+    }

+    if (!data || len > ERASE_BLOCK_SIZE) 

+    {

+        LOGE("invalid data is NULL ");

+        deinit_fun_handle();

+        return GSW_HAL_ARG_INVALID;

+    }

+    

+    ret = mbtk_write_fun_ptr(block_id,data,len);

+    if(ret != 0)

+    {

+        LOGE("mbtk_write_fun_ptr  failed");

+        deinit_fun_handle();

+        return GSW_HAL_NORMAL_FAIL;

+    }

+    deinit_fun_handle();

+    return GSW_HAL_SUCCESS;

+}

diff --git a/mbtk/libgsw_lib/gsw_pm.c b/mbtk/libgsw_lib/gsw_pm.c
new file mode 100755
index 0000000..abf1a0d
--- /dev/null
+++ b/mbtk/libgsw_lib/gsw_pm.c
@@ -0,0 +1,363 @@
+#include <stdio.h>

+#include <string.h>

+#include <strings.h>

+#include <stdlib.h>

+#include <errno.h>

+#include <termios.h>

+#include <fcntl.h>

+#include <signal.h>

+#include <sys/types.h>

+#include <unistd.h>

+#include <pthread.h>

+#include <time.h>

+#include <sys/ioctl.h>

+#include <dlfcn.h>

+#include <stdint.h>

+#include "gsw_pm.h"

+

+#ifndef LOG_ERR_LEVEL

+#define LOG_ERR_LEVEL  3      /* error conditions */

+#endif

+#ifndef LOG_WARN_LEVEL

+#define LOG_WARN_LEVEL 4   /* warning conditions */

+#endif

+#ifndef LOG_INFO_LEVEL

+#define LOG_INFO_LEVEL 6      /* informational */

+#endif

+#ifndef LOG_DEBUG_LEVEL

+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */

+#endif

+#ifndef LOG_VERBOSE_LEVEL

+#define LOG_VERBOSE_LEVEL 8

+#endif

+

+#define LOGV(fmt, args ...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGI(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGD(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGW(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGE(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+    

+

+#define GSW_HAL_SUCCESS 0

+#define GSW_HAL_FAIL -1	//表示失败(通用性)

+#define GSW_HAL_MEM_INVAILD -2 //表示入参地址为NULL

+#define LOCK_MAX_SIZE 129

+

+typedef void (*mbtk_lpm_handler_t)(int32_t wakeup_in);

+typedef void (*mbtk_log)(int level, const char *format,...);

+

+int (*mbtk_autosuspend_enable)(char);

+int (*mbtk_wakelock_create)(const char* name , size_t);

+int (*mbtk_wakelock_lock)(int);

+int (*mbtk_wakelock_unlock)(int);

+int (*mbtk_wakelock_destroy)(int);

+int (*mbtk_lpm_init)(mbtk_lpm_handler_t );

+int lock_fd = -1;

+

+typedef struct

+{

+    int fd;

+    char *name;

+} mbtk_lock_name_s;

+static mbtk_lock_name_s lock_name[LOCK_MAX_SIZE]={0};

+

+static mbtk_log fun_ptr_log = NULL;

+void *dlHandle_sleep = NULL;

+char *lynqLib_sleep = "/lib/libmbtk_lib.so";

+

+

+/**

+* @brief Enable autosleep

+* @param void

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+

+static int handle()

+{

+    if(dlHandle_sleep == NULL || fun_ptr_log == NULL)

+    {

+        dlHandle_sleep = dlopen(lynqLib_sleep, RTLD_NOW);

+        fun_ptr_log = (mbtk_log)dlsym(dlHandle_sleep, "mbtk_log");

+        if(fun_ptr_log == NULL || dlHandle_sleep == NULL)

+        {

+            return GSW_HAL_FAIL;

+        }

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+int32_t gsw_autosleep_enable(void)

+{

+    int ret;

+    if (handle())

+        return GSW_HAL_FAIL;

+    mbtk_autosuspend_enable=(int(*)(char))dlsym(dlHandle_sleep, "mbtk_autosuspend_enable");

+    ret = mbtk_autosuspend_enable(1);

+    if(ret < 0)

+    {

+        LOGE("mbtk_autosuspend_enable FAIL.\n");

+        dlclose(dlHandle_sleep);

+        dlHandle_sleep = NULL;

+        return GSW_HAL_FAIL;

+    }

+    dlclose(dlHandle_sleep);

+    dlHandle_sleep = NULL;

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+* @brief Disable autosleep

+* @param void

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_autosleep_disenable(void)

+{

+    int ret;

+    if (handle())

+        return GSW_HAL_FAIL;

+    mbtk_autosuspend_enable=(int(*)(char))dlsym(dlHandle_sleep, "mbtk_autosuspend_enable");

+    ret = mbtk_autosuspend_enable(0);

+    if(ret < 0)

+    {

+        LOGE("mbtk_autosuspend_enable FAIL.\n");

+        dlclose(dlHandle_sleep);

+        dlHandle_sleep = NULL;

+        return GSW_HAL_FAIL;

+    }

+    dlclose(dlHandle_sleep);

+    dlHandle_sleep = NULL;

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+* @brief Init power manager module

+* @param [in]GSW_PM_WAKEUPCALLBACKHandler wakeup_callback

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_pm_sdk_init(GSW_PM_WAKEUPCALLBACK wakeup_callback)

+{

+    int ret;

+    if (handle())

+        return GSW_HAL_FAIL;

+    mbtk_lpm_init=(int(*)(mbtk_lpm_handler_t))dlsym(dlHandle_sleep, "mbtk_lpm_init");

+    ret = mbtk_lpm_init((mbtk_lpm_handler_t)wakeup_callback);

+    if(ret < 0)

+    {

+        LOGE("mbtk_lpm_init FAIL.\n");

+        dlclose(dlHandle_sleep);

+        dlHandle_sleep = NULL;

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+* @brief Release wake lock, enter sleep

+* @param [in]int32_t wakeup_in

+* @retval int

+*/

+int32_t gsw_pm_enter_sleep(const char *gsw_wakelock_name)

+{

+    int ret;

+    int i;

+    if (handle())

+        return GSW_HAL_FAIL;

+    if (gsw_wakelock_name == NULL)

+        return GSW_HAL_FAIL;

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

+    {

+        if(lock_name[i].name != NULL && strcmp(lock_name[i].name, gsw_wakelock_name) == 0)

+        {

+            lock_fd = lock_name[i].fd;

+            break;

+        }

+    }

+    if (i >= LOCK_MAX_SIZE)

+    {

+        LOGE("mbtk_wakelock_lock not create.\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_wakelock_unlock=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_unlock");

+    ret = mbtk_wakelock_unlock(lock_fd);

+    if(ret < 0)

+    {

+        LOGE("mbtk_wakelock_unlock FAIL.\n");

+        dlclose(dlHandle_sleep);

+        dlHandle_sleep = NULL;

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_wakelock_destroy=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_destroy");

+    ret = mbtk_wakelock_destroy(lock_fd);

+    if(ret < 0)

+    {

+        LOGE("mbtk_wakelock_destroy FAIL.\n");

+        dlclose(dlHandle_sleep);

+        dlHandle_sleep = NULL;

+        return GSW_HAL_FAIL;

+    }

+    if (lock_name[i].name != NULL)

+    {

+        free(lock_name[i].name);

+        lock_name[i].name = NULL;

+        lock_name[i].fd = -1;

+    }

+    

+    dlclose(dlHandle_sleep);

+    dlHandle_sleep = NULL;

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+* @brief Creat wakeup lock

+* @param [in]int32_t wakeup_in

+* @retval int

+*/

+int32_t gsw_pm_exit_sleep(const char *gsw_wakelock_name)

+{

+    int ret;

+    int i;

+    if (handle())

+        return GSW_HAL_FAIL;

+    if (gsw_wakelock_name == NULL)

+        return GSW_HAL_FAIL;

+    mbtk_wakelock_create=(int(*)(const char* name , size_t))dlsym(dlHandle_sleep, "mbtk_wakelock_create");

+    lock_fd = mbtk_wakelock_create(gsw_wakelock_name, strlen(gsw_wakelock_name));

+    if(lock_fd < 0)

+    {

+        LOGE("mbtk_wakelock_create FAIL.\n");

+        dlclose(dlHandle_sleep);

+        dlHandle_sleep = NULL;

+        return GSW_HAL_FAIL;

+    }

+    mbtk_wakelock_lock=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_lock");

+

+    ret = mbtk_wakelock_lock(lock_fd);

+    if(ret < 0)

+    {

+        LOGE("mbtk_wakelock_lock FAIL.\n");

+        dlclose(dlHandle_sleep);

+        dlHandle_sleep = NULL;

+        return GSW_HAL_FAIL;

+    }

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

+    {

+        if(lock_name[i].name == NULL)

+            break;

+    }

+    lock_name[i].name = malloc(strlen(gsw_wakelock_name)+1);

+    if (lock_name[i].name == NULL)

+    {

+        LOGE("mbtk_wakelock_lock remeber FAIL.\n");

+        return GSW_HAL_FAIL;

+    }

+    memcpy(lock_name[i].name, gsw_wakelock_name, strlen(gsw_wakelock_name)+1);

+    lock_name[i].fd = lock_fd;

+

+    dlclose(dlHandle_sleep);

+    dlHandle_sleep = NULL;

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+* @brief Module log disk drop, used when restarting or hibernating

+* @param [in]void

+* @retval void

+*/

+void gsw_modem_log_sync(void)

+{

+    FILE *fp;

+    char command[256];

+    char buffer[256];

+    int pid = -1;

+    const char *process_name = "mbtk_logd";

+    

+    snprintf(command, sizeof(command), "pgrep %s", process_name);

+    fp = popen(command, "r");

+    if (fp == NULL)

+    {

+        perror("error comman");

+        return;

+    }

+

+    if (fgets(buffer, sizeof(buffer), fp) != NULL)

+    {

+        pid = atoi(buffer);

+    }

+    pclose(fp);

+

+    if (pid != -1)

+    {

+        if (kill(pid, SIGTERM) == -1)

+        {

+            perror("send SIGTERM signal failed");

+            return;

+        }

+    }

+    return;

+}
\ No newline at end of file
diff --git a/mbtk/libgsw_lib/gsw_sim.c b/mbtk/libgsw_lib/gsw_sim.c
new file mode 100755
index 0000000..b8cfa52
--- /dev/null
+++ b/mbtk/libgsw_lib/gsw_sim.c
@@ -0,0 +1,660 @@
+#include "gsw_nw_interface.h"

+#include <unistd.h>

+#include <dlfcn.h>

+#include <time.h>

+

+#define MBTK_BUFF_TEMP_SIZE_32  32

+#define MBTK_ERR_OK             0

+#define MBTK_ERR_FAIL             -1

+#define GSW_SIM_ICCID_LENGTH 20+1 

+#define GSW_SIM_IMSI_LENGTH 20+1 

+#define GSW_SIM_MSISDN_LENGTH 20+1

+#define GSW_SIM_IMEI_LENGTH 20+1

+

+//mbtk include

+typedef unsigned int uint32;

+typedef unsigned char uint8;

+typedef unsigned short uint16;

+typedef void (*mbtk_info_callback_func)(const void* data, int data_len);

+typedef struct

+{

+    int client_fd;

+    pthread_t read_thread_id;

+    int exit_fd[2];

+    bool is_waitting;

+    pthread_cond_t cond;

+    pthread_mutex_t mutex;

+

+    pthread_mutex_t send_mutex;

+

+    // Temp response data.

+    uint16 info_err;

+    uint16 data_len;

+    void *data;

+

+    //mbtk wyq for server_ready_status add start

+    char server_ready_status;

+    //mbtk wyq for server_ready_status add end

+

+    mbtk_info_callback_func net_state_cb;

+    mbtk_info_callback_func call_state_cb;

+    mbtk_info_callback_func sms_state_cb;

+    mbtk_info_callback_func radio_state_cb;

+    mbtk_info_callback_func sim_state_cb;

+    mbtk_info_callback_func pdp_state_cb;

+    //add signal by xr

+    mbtk_info_callback_func signal_state_cb;

+} mbtk_info_handle_t;

+

+typedef enum {

+    MBTK_SIM_ABSENT = 0,

+    MBTK_SIM_NOT_READY = 1,

+    MBTK_SIM_READY = 2,

+    MBTK_SIM_PIN = 3,

+    MBTK_SIM_PUK = 4,

+    MBTK_SIM_NETWORK_PERSONALIZATION = 5

+} mbtk_sim_state_enum;

+

+typedef enum

+{

+    MBTK_DEV_MODEM_MIN_FUN,                                   //Modem 最小功能

+    MBTK_DEV_MODEM_FULL_FUN,                                  //Modem 全功能

+    MBTK_DEV_MODEM_DISABLE_RECEIVE_RF_CIRCUITS = 3,           //Modem 禁用射频接收电路

+    MBTK_DEV_MODEM_DISABLE_TRANSMIT_AND_RECEIVE_RF_CIRCUITS,  //Modem禁用射频发射和接收电路

+    MBTK_DEV_MODEM_DISABLE_SIM,                               //Modem 禁用(U)SIM 卡

+    MBTK_DEV_MODEM_TURN_OFF_FULL_SECONDARY_RECEIVE,           //Modem 完全禁用辅助接收

+}MBTK_DEV_MODEM_FUNCTION;

+

+typedef struct

+{

+    MBTK_DEV_MODEM_FUNCTION fun;

+    int rst;

+} mbtk_modem_info_t;

+

+//api

+

+static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);

+#define GSW_HAL_FAIL GSW_HAL_NORMAL_FAIL

+#define GSW_HAL_MEM_INVAILD GSW_HAL_ARG_INVALID

+#define lib_mbtk_path "/lib/libmbtk_lib.so"

+

+static int sim_init_flag = 0;

+mbtk_info_handle_t*       sim_info_handle = NULL;

+static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);

+int (*mbtk_sim_state_get)(mbtk_info_handle_t* handle, mbtk_sim_state_enum *sim_state);

+int (*mbtk_imsi_get)(mbtk_info_handle_t* handle, void *imsi);

+int (*mbtk_iccid_get)(mbtk_info_handle_t* handle, void *iccid);

+int (*mbtk_phone_number_get)(mbtk_info_handle_t* handle, void *phone_number);

+int (*mbtk_imei_get)(mbtk_info_handle_t* handle, void *imei);

+int (*mbtk_set_modem_fun)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info);

+int (*mbtk_sim_power_set)(int power);

+static void (*mbtk_log)(int level, const char *format, ...);

+static void (*mbtk_log_init)(char *path, char *tag);

+

+#ifndef LOG_ERR_LEVEL

+#define LOG_ERR_LEVEL  3      /* error conditions */

+#endif

+#ifndef LOG_WARN_LEVEL

+#define LOG_WARN_LEVEL 4   /* warning conditions */

+#endif

+#ifndef LOG_INFO_LEVEL

+#define LOG_INFO_LEVEL 6      /* informational */

+#endif

+#ifndef LOG_DEBUG_LEVEL

+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */

+#endif

+#ifndef LOG_VERBOSE_LEVEL

+#define LOG_VERBOSE_LEVEL 8

+#endif

+

+#define LOGV(fmt, args ...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGI(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGD(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGW(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGE(fmt, args...) \

+    do{ \

+		char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+

+

+

+static void *dlHandle_mbtk;

+

+

+static int gsw_sim_api_import()

+{

+    dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);

+    if (dlHandle_mbtk == NULL) 

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");

+    if (mbtk_log_init == NULL) 

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");

+    if (mbtk_log == NULL) 

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");

+    if (mbtk_info_handle_get == NULL) 

+    {

+        LOGE("mbtk_info_handle_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");

+    if (mbtk_info_handle_free == NULL) 

+    {

+        LOGE("mbtk_info_handle_free dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_imsi_get = (int (*)(mbtk_info_handle_t* handle, void *imsi))dlsym(dlHandle_mbtk, "mbtk_imsi_get");

+    if (mbtk_imsi_get == NULL) 

+    {

+        LOGE("mbtk_imsi_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_iccid_get = (int (*)(mbtk_info_handle_t* handle, void *iccid))dlsym(dlHandle_mbtk, "mbtk_iccid_get");

+    if (mbtk_iccid_get == NULL) 

+    {

+        LOGE("mbtk_iccid_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_phone_number_get = (int (*)(mbtk_info_handle_t* handle, void *phone_number))dlsym(dlHandle_mbtk, "mbtk_phone_number_get");

+    if (mbtk_phone_number_get == NULL) 

+    {

+        LOGE("mbtk_phone_number_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_imei_get = (int (*)(mbtk_info_handle_t* handle, void *imei))dlsym(dlHandle_mbtk, "mbtk_imei_get");

+    if (mbtk_imei_get == NULL) 

+    {

+        LOGE("mbtk_imei_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_sim_state_get = (int (*)(mbtk_info_handle_t* handle, mbtk_sim_state_enum *sim_state))dlsym(dlHandle_mbtk, "mbtk_sim_state_get");

+    if (mbtk_sim_state_get == NULL) 

+    {

+        LOGE("mbtk_sim_state_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_set_modem_fun = (int (*)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info))dlsym(dlHandle_mbtk, "mbtk_set_modem_fun");

+    if (mbtk_set_modem_fun == NULL) 

+    {

+        LOGE("mbtk_set_modem_fun dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_sim_power_set = (int (*)(int power))dlsym(dlHandle_mbtk, "mbtk_sim_power_set");

+    if (mbtk_sim_power_set == NULL)

+    {

+        LOGE("mbtk_sim_power_set dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    LOGD("gsw_sim_api_import end\n");

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief sim sdk init

+ * @param  [in] token usr id define by who use

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_sim_sdk_init(int32_t token)

+{

+    int ret = GSW_HAL_FAIL;

+

+    if(sim_init_flag == 1 && sim_info_handle != NULL)

+    {

+        return GSW_HAL_SUCCESS;

+    }

+

+    ret = gsw_sim_api_import();

+    if(ret != GSW_HAL_SUCCESS)

+    {

+        if(mbtk_log != NULL)

+        {

+            LOGE("gsw_sim_import fail\n");

+        }

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_log_init("syslog", "MBTK_RIL");

+

+    sim_info_handle = mbtk_info_handle_get();

+    if(sim_info_handle == NULL)

+    {

+        LOGE("mbtk_info_handle_get fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    sim_init_flag = 1;

+    return GSW_HAL_SUCCESS;

+}

+

+

+/**

+ * @brief sim sdk deinit

+ * @param 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_sim_sdk_deinit(void)

+{

+    int ret = -1;

+

+    if(sim_init_flag == 0 && sim_info_handle == NULL)

+    {

+        LOGE("sim sdk has been deinit\n");

+        return GSW_HAL_FAIL;

+    }

+

+    ret = mbtk_info_handle_free(&sim_info_handle);

+    if(ret != GSW_HAL_SUCCESS)

+    {

+        LOGE("mbtk_info_handle_free fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    sim_init_flag = 0;

+    sim_info_handle = NULL;

+    dlclose(dlHandle_mbtk);

+

+    return GSW_HAL_SUCCESS;

+

+}

+

+

+/**

+ * @brief get sim state

+ * @param  [out] sim_state sim status as sim_status_e_type

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_get_sim_status(int *sim_state)

+{

+    LOGD("gsw_get_sim_status enter\n");

+    int ret = -1;

+

+    if(sim_init_flag == 0 && sim_info_handle == NULL)

+    {

+        LOGE("sim sdk has been deinit\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_sim_state_enum sim = MBTK_SIM_ABSENT;

+

+    LOGD("mbtk_get_sim_status start\n");

+    ret = mbtk_sim_state_get(sim_info_handle, &sim);

+    if(ret)

+    {

+        LOGE("[gsw_get_sim_status] mbtk_sim_state_get fail [err = %d].", ret);

+        return GSW_HAL_FAIL;

+    }

+

+    else

+    {

+        LOGD("[gsw_get_sim_status] sim = %d\n", sim);

+        switch (sim)

+        {

+            case MBTK_SIM_ABSENT:

+            {

+                *sim_state = SIM_STATUS_ABSENT;

+                break;

+            }

+            case MBTK_SIM_NOT_READY:

+            {

+                *sim_state = SIM_STATUS_PRESENT;

+                break;

+            }

+                

+            case MBTK_SIM_READY:

+            {

+                *sim_state = SIM_STATUS_READY;

+                break;

+            }

+                

+            case MBTK_SIM_PIN:

+            {

+                *sim_state = SIM_STATUS_PIN;

+                break;

+            }

+

+            case MBTK_SIM_PUK:

+            {

+                break;

+            }

+

+            case MBTK_SIM_NETWORK_PERSONALIZATION:

+            {

+                break;

+            }

+        

+        }

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief get iccid function

+ * @param  [in] len iccid length,max is 20

+ * @param  [out] iccid return iccid from this func

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_get_sim_iccid(int len, char *iccid)

+{

+    int ret = -1;

+

+    if(sim_init_flag == 0 && sim_info_handle == NULL)

+    {

+        LOGE("sim sdk has been deinit\n");

+        return GSW_HAL_FAIL;

+    }

+

+    if(iccid == NULL)

+    {

+        LOGE("iccid is NULL.");

+        return GSW_HAL_MEM_INVAILD;

+    }

+

+    if(len < GSW_SIM_ICCID_LENGTH)

+    {

+        LOGE("iccid len is too short,len = %d\n", len);

+        return GSW_HAL_FAIL;

+    }

+

+    ret = mbtk_iccid_get(sim_info_handle, (void *)iccid);

+    if(ret != MBTK_ERR_OK)

+    {

+        LOGE("[gsw_sim] mbtk_iccid_get fail [err = %d].", ret);

+        return GSW_HAL_FAIL;

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief get imsi function

+ * @param  [in] len imsi length,max is 20

+ * @param  [out] iccid return imsi from this func

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_get_sim_imsi(int len, char *imsi)

+{

+    int ret = -1;

+

+    if(sim_init_flag == 0 && sim_info_handle == NULL)

+    {

+        LOGE("sim sdk has been deinit\n");

+        return GSW_HAL_FAIL;

+    }

+

+    if(imsi == NULL)

+    {

+        LOGE("imsi is NULL.");

+        return GSW_HAL_MEM_INVAILD;

+    }

+

+    if(len < GSW_SIM_IMSI_LENGTH)

+    {

+        LOGE("imsi len is too short,len = %d\n", len);

+        return GSW_HAL_FAIL;

+    }

+

+    ret = mbtk_imsi_get(sim_info_handle, (void *)imsi);

+    if(ret != MBTK_ERR_OK)

+    {

+        LOGE("[gsw_sim] mbtk_imsi_get fail [err = %d].", ret);

+        return GSW_HAL_FAIL;

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief get sim msisdn function

+ * @param  [in] len msisdn length,max is 20

+ * @param  [out] msisdn msisdn length,max is 20

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_get_sim_msisdn(int len, char *msisdn)

+{

+    int ret = -1;

+

+    if(sim_init_flag == 0 && sim_info_handle == NULL)

+    {

+        printf("sim sdk has been deinit\n");

+        return GSW_HAL_FAIL;

+    }

+

+    if(msisdn == NULL)

+    {

+        printf("msisdn is NULL.");

+        return GSW_HAL_MEM_INVAILD;

+    }

+

+    if(len < GSW_SIM_MSISDN_LENGTH)

+    {

+        printf("msisdn len is too short,len = %d\n", len);

+        return GSW_HAL_FAIL;

+    }

+

+    ret = mbtk_phone_number_get(sim_info_handle, (void *)msisdn);

+    if(ret != MBTK_ERR_OK)

+    {

+        LOGE("[gsw_sim] mbtk_phone_number_get fail [err = %d].", ret);

+        return GSW_HAL_FAIL;

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief get imei function

+ * @param  [in] len imei length,max is 20

+ * @param  [out] imei return imei from this func

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_get_imei(int len, char *imei)

+{

+    int ret = -1;

+

+    if(sim_init_flag == 0 && sim_info_handle == NULL)

+    {

+        LOGE("sim sdk has been deinit\n");

+        return GSW_HAL_FAIL;

+    }

+

+    if(imei == NULL)

+    {

+        LOGE("imei is NULL.");

+        return GSW_HAL_MEM_INVAILD;

+    }

+

+    if(len < GSW_SIM_MSISDN_LENGTH)

+    {

+        LOGE("imei len is too short,len = %d\n", len);

+        return GSW_HAL_FAIL;

+    }

+

+    ret = mbtk_imei_get(sim_info_handle, (void *)imei);

+    if(ret != MBTK_ERR_OK)

+    {

+        LOGE("[gsw_sim] mbtk_imei_get fail [err = %d].", ret);

+        return GSW_HAL_FAIL;

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+

+/**

+ * @brief set sim power down

+ * @param  

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_set_sim_power_down(void)

+{

+    int ret = -1;

+    if(sim_init_flag == 0 && sim_info_handle == NULL)

+    {

+        LOGE("sim sdk has been deinit\n");

+        return GSW_HAL_FAIL;

+    }

+

+    ret = mbtk_sim_power_set(0);

+    if(ret != MBTK_ERR_OK)

+    {

+        LOGE("[gsw_sim] mbtk_sim_power_set fail [err = %d].", ret);

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+

+

+/**

+ * @brief set sim power up

+ * @param 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_set_sim_power_up(void)

+{

+    int ret = -1;

+    if(sim_init_flag == 0 && sim_info_handle == NULL)

+    {

+        LOGE("sim sdk has been deinit\n");

+        return GSW_HAL_FAIL;

+    }

+

+    ret = mbtk_sim_power_set(1);

+    if(ret != MBTK_ERR_OK)

+    {

+        LOGE("[gsw_sim] mbtk_sim_power_set fail [err = %d].", ret);

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+

+/**

+ * @brief reset modem stack only, notice: after use this method, all ril sdk

+ * need restart by app, means network, sim, sms, data need deinit then init!

+ * @param  

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_reset_modem(void)

+{

+    int ret = -1;

+    if(sim_init_flag == 0 && sim_info_handle == NULL)

+    {

+        LOGE("sim sdk has been deinit\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_modem_info_t info;

+    info.fun = MBTK_DEV_MODEM_MIN_FUN;

+    info.rst = 0;

+

+    ret = mbtk_set_modem_fun(sim_info_handle, &info);

+    if(ret)

+    {

+        LOGE("[gsw_sim] mbtk_set_modem_fun fail [err = %d].", ret);

+        return GSW_HAL_FAIL;

+    }

+

+    sleep(1);

+

+    info.fun = MBTK_DEV_MODEM_FULL_FUN;

+    ret = mbtk_set_modem_fun(sim_info_handle, &info);

+    if(ret)

+    {

+        LOGE("[gsw_sim] mbtk_set_modem_fun fail [err = %d].", ret);

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+}
\ No newline at end of file
diff --git a/mbtk/libgsw_lib/gsw_sms.c b/mbtk/libgsw_lib/gsw_sms.c
new file mode 100755
index 0000000..403bd4d
--- /dev/null
+++ b/mbtk/libgsw_lib/gsw_sms.c
@@ -0,0 +1,866 @@
+#include "gsw_nw_interface.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <dlfcn.h>
+#include <time.h>
+
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+typedef unsigned char uint8_t;
+typedef unsigned short uint16;
+typedef uint32_t sms_client_handle_type;
+typedef int kal_int32;
+
+
+//qser include
+
+
+
+//mbtk include
+typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
+typedef unsigned char uint8;
+
+typedef struct
+{
+    int client_fd;
+    pthread_t read_thread_id;
+    int exit_fd[2];
+    bool is_waitting;
+    pthread_cond_t cond;
+    pthread_mutex_t mutex;
+
+    pthread_mutex_t send_mutex;
+
+    // Temp response data.
+    uint16 info_err;
+    uint16 data_len;
+    void *data;
+
+    //mbtk wyq for server_ready_status add start
+    char server_ready_status;
+    //mbtk wyq for server_ready_status add end
+
+    mbtk_info_callback_func net_state_cb;
+    mbtk_info_callback_func call_state_cb;
+    mbtk_info_callback_func sms_state_cb;
+    mbtk_info_callback_func radio_state_cb;
+    mbtk_info_callback_func sim_state_cb;
+    mbtk_info_callback_func pdp_state_cb;
+    //add signal by xr
+    mbtk_info_callback_func signal_state_cb;
+} mbtk_info_handle_t;
+
+// PDU include
+enum EnumDCS {
+    BIT7 = 0,            // GSM 字符集
+    BIT8 = 1,            // ASCII字符集
+    UCS2 = 2             // Unicode 字符集
+};
+
+struct SMS_Struct {
+    char *SCA;         // 服务中心地址
+    char *OA;          // 发送方地址
+    char *SCTS;        // 服务中心时间戳
+    struct UDHS *UDH;     // 用户数据头
+    char *UD;          // 用户数据
+
+    bool RP;              // 应答路径
+    bool UDHI;            // 用户数据头标识
+    bool SRI;             // 状态报告指示
+    bool MMS;             // 更多信息发送
+    int MTI;              // 信息类型指示
+
+    char PID;          // PID 协议标识
+
+    enum EnumDCS DCS;      // 数据编码方案
+    bool TC;              // 文本压缩指示 0: 未压缩 1:压缩
+    int MC;               // 消息类型 -1: 无 1:移动设备特定类型 2:SIM特定类型 3:终端设备特定类型
+
+};
+
+struct PDUS {
+    unsigned int count;
+    char **PDU;
+};
+
+enum MDAPI_RET_e {
+    MDAPI_RET_SUCCESS       = 0,
+    MDAPI_RET_ERROR         = 1,
+    MDAPI_RET_TIMEOUT       = 2,
+    MDAPI_RET_NOT_SUPPORT   = 3,
+};
+
+#define MDAPI_TIME_STR_SIZE         22
+#define MDAPI_PHONE_NUMBER_SIZE     32
+#define MDAPI_MAX_PDU_SIZE          512
+#define MSM_NUMBER_MAX 2048+1
+#define RES_NUM_MIN 128
+#define MIN_MSM_PARAM_NUM 4
+#define MIN_IMS_MSM_PARAM_NUM 6
+#define MIN_WRITMSM_PARAM_NUM 5
+#define MSG_MAX_LEN 1024
+#define TELEPHONNUM_LEN 64
+#define STORAGSMS_MAX_SIZE 128
+#define SMSC_MAX_LEN 22
+#define SMS_NUM_MAX 255
+#define MAX_OUT_SIZE 512
+#define MAX_PDU_SIZE 512
+#define MAX_DATE_SIZE 32
+
+
+GSW_SMS_Callback_fun gsw_sms_callback = NULL;
+
+#define lib_mbtk_path "/lib/libmbtk_lib.so"
+#define lib_qser_sms_path "/lib/liblynq-qser-sms.so"
+
+#define GSW_HAL_FAIL GSW_HAL_NORMAL_FAIL
+#define GSW_HAL_MEM_INVAILD GSW_HAL_ARG_INVALID
+
+
+static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
+int (*mbtk_sms_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
+static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
+struct SMS_Struct (*PDUDecoding)(const char *data);
+char *(*SCADecoding)(const char *data, int *EndIndex);
+char *(*SCAEncoding)(char *SCA);
+struct PDUS *(*PDUEncoding)(char *SCA, char *DA, char *UDC, struct UDHS *udhs);
+int (*mbtk_sms_cmgf_set)(mbtk_info_handle_t* handle, int mode);
+int (*mbtk_sms_cmgs_set)(mbtk_info_handle_t* handle, char * cmgs, char *resp);
+int (*mbtk_sms_csca_set)(mbtk_info_handle_t* handle, char * csca);
+int (*mbtk_sms_csca_get)(mbtk_info_handle_t* handle, char *buf);
+int (*mbtk_sms_cnmi_set)(mbtk_info_handle_t* handle);
+static void (*mbtk_log)(int level, const char *format, ...);
+static void (*mbtk_log_init)(char *path, char *tag);
+int (*smsPduEncode)(const char *smsc, const char *da_num, const char *msg, int charset, char *smsc_pdu, char **pdu);
+int (*smsPduDecode)(const char *pdu_str, int pdu_len, char *da_num, char *smsc, char *msg, int *charset, int *curr_pack, int *total_pack, char *date);
+kal_int32 (*_mdapi_sms_get_msg_num)(const char *msg, int charset, kal_int32 *msg_num, kal_int32 *msg_len);
+
+#ifndef LOG_ERR_LEVEL
+#define LOG_ERR_LEVEL  3      /* error conditions */
+#endif
+#ifndef LOG_WARN_LEVEL
+#define LOG_WARN_LEVEL 4   /* warning conditions */
+#endif
+#ifndef LOG_INFO_LEVEL
+#define LOG_INFO_LEVEL 6      /* informational */
+#endif
+#ifndef LOG_DEBUG_LEVEL
+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */
+#endif
+#ifndef LOG_VERBOSE_LEVEL
+#define LOG_VERBOSE_LEVEL 8
+#endif
+
+#define LOGV(fmt, args ...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
+    } while(0)
+
+#define LOGI(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        mbtk_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
+    } while(0)
+
+#define LOGD(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
+    } while(0)
+
+#define LOGW(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        mbtk_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
+    } while(0)
+
+#define LOGE(fmt, args...) \
+    do{ \
+		char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        mbtk_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
+    } while(0)
+
+
+
+static mbtk_info_handle_t* sms_info_handle = NULL;
+static sms_client_handle_type handle;
+static char sms_center_address[SMSC_MAX_LEN] = {0};
+static void *dlHandle_mbtk;
+static int init_flag = 0;
+
+static int mbtk_sms_import()
+{
+    dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
+    if (dlHandle_mbtk == NULL) 
+    {
+        return GSW_HAL_FAIL;
+    }
+
+    mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
+    if (mbtk_log_init == NULL) 
+    {
+        return GSW_HAL_FAIL;
+    }
+
+    mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
+    if (mbtk_log == NULL) 
+    {
+        return GSW_HAL_FAIL;
+    }
+
+    mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
+    if (mbtk_info_handle_get == NULL) 
+    {
+        LOGE("mbtk_info_handle_get dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    mbtk_sms_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_sms_state_change_cb_reg");
+    if (mbtk_sms_state_change_cb_reg == NULL) 
+    {
+        LOGE("mbtk_sms_state_change_cb_reg dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
+    if (mbtk_info_handle_free == NULL) 
+    {
+        LOGE("mbtk_info_handle_free dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    PDUDecoding = (struct SMS_Struct (*)(const char *data))dlsym(dlHandle_mbtk, "PDUDecoding");
+    if (PDUDecoding == NULL) 
+    {
+        LOGE("PDUDecoding dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    SCADecoding = (char *(*)(const char *data, int *EndIndex))dlsym(dlHandle_mbtk, "SCADecoding");
+    if (SCADecoding == NULL) 
+    {
+        LOGE("SCADecoding dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    SCAEncoding = (char *(*)(char *SCA))dlsym(dlHandle_mbtk, "SCAEncoding");
+    if (SCAEncoding == NULL) 
+    {
+        LOGE("SCAEncoding dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    PDUEncoding = (struct PDUS *(*)(char *SCA, char *DA, char *UDC, struct UDHS *udhs))dlsym(dlHandle_mbtk, "PDUEncoding");
+    if (PDUEncoding == NULL) 
+    {
+        LOGE("PDUEncoding dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    mbtk_sms_cmgf_set = (int (*)(mbtk_info_handle_t* handle, int mode))dlsym(dlHandle_mbtk, "mbtk_sms_cmgf_set");
+    if (mbtk_sms_cmgf_set == NULL) 
+    {
+        LOGE("mbtk_sms_cmgf_set dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    mbtk_sms_cmgs_set = (int (*)(mbtk_info_handle_t* handle, char * cmgs, char *resp))dlsym(dlHandle_mbtk, "mbtk_sms_cmgs_set");
+    if (mbtk_sms_cmgs_set == NULL) 
+    {
+        LOGE("mbtk_sms_cmgs_set dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    mbtk_sms_csca_set = (int (*)(mbtk_info_handle_t* handle, char * csca))dlsym(dlHandle_mbtk, "mbtk_sms_csca_set");
+    if (mbtk_sms_csca_set == NULL) 
+    {
+        LOGE("mbtk_sms_csca_set dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    mbtk_sms_csca_get = (int (*)(mbtk_info_handle_t* handle, char *buf))dlsym(dlHandle_mbtk, "mbtk_sms_csca_get");
+    if (mbtk_sms_csca_get == NULL) 
+    {
+        LOGE("mbtk_sms_csca_get dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    mbtk_sms_cnmi_set = (int (*)(mbtk_info_handle_t* handle))dlsym(dlHandle_mbtk, "mbtk_sms_cnmi_set");
+    if (mbtk_sms_cnmi_set == NULL) 
+    {
+        LOGE("mbtk_sms_cnmi_set dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    smsPduEncode = (int (*)(const char *smsc, const char *da_num, const char *msg, int charset, char *smsc_pdu, char **pdu))dlsym(dlHandle_mbtk, "smsPduEncode");
+    if (smsPduEncode == NULL) 
+    {
+        LOGE("smsPduEncode dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    
+    smsPduDecode = (int (*)(const char *pdu_str, int pdu_len, char *da_num, char *smsc, char *msg, int *charset, int *curr_pack, int *total_pack, char *date))dlsym(dlHandle_mbtk,"smsPduDecode");
+    if (smsPduDecode == NULL) 
+    {
+        LOGE("smsPduDecode dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    _mdapi_sms_get_msg_num = (kal_int32 (*)(const char *msg, int charset, kal_int32 *msg_num, kal_int32 *msg_len))dlsym(dlHandle_mbtk,"_mdapi_sms_get_msg_num");
+    if (_mdapi_sms_get_msg_num == NULL) 
+    {
+        LOGE("_mdapi_sms_get_msg_num dlsym fail");
+        return GSW_HAL_FAIL;
+    }
+
+    return GSW_HAL_SUCCESS;
+
+}
+
+void ArrayToStr(unsigned char *Buff, unsigned int BuffLen, char *OutputStr)
+{
+    int i = 0;
+    char TempBuff[MSG_MAX_LEN * 2 +1] = {0};
+    char strBuff[MSG_MAX_LEN * 2 +1] = {0};
+
+    for(i = 0; i<BuffLen;i++)
+    {
+        sprintf(TempBuff,"%02x",(unsigned char)Buff[i]);
+        strncat(strBuff,TempBuff,BuffLen*2);
+    }
+    strncpy(OutputStr, strBuff, BuffLen*2);
+    return;
+}
+
+void gsw_sms_state_change_cb(const void* data, int data_len) {
+    LOGD("gsw_sms_state_change_cb -------start\n");
+
+    uint8 *ptr = (uint8*)data;
+
+    if (!strncmp("+CMT:", (const char *)ptr, 5))//丢弃无用消息
+        return ;
+
+    gsw_sms_msg_type_t gsw_sms_msg;
+    gsw_sms_date_t gsw_sms_date;
+
+    memset(&gsw_sms_msg, 0, sizeof(gsw_sms_msg_type_t));
+    memset(&gsw_sms_date, 0, sizeof(gsw_sms_date_t));
+
+    char smsc[MDAPI_MAX_PDU_SIZE] = {0};
+    char received_pdu[MDAPI_MAX_PDU_SIZE] = {0};
+    char msg[MDAPI_MAX_PDU_SIZE] = {0};
+    char num[MDAPI_MAX_PDU_SIZE] = {0};
+    char date[MAX_DATE_SIZE] = {0};
+    int charset = 0;
+    int ret = -1;
+    int curr_pack = 1;
+    int total_pack = 1;
+    if(ptr == NULL)
+    {
+        LOGE("ptr is null");
+    }
+    LOGE("ptr: %s\n,data_len = %d\n", (char *)ptr, data_len);
+    if(data_len > MDAPI_MAX_PDU_SIZE)
+    {
+        strncpy(received_pdu, (const char *)ptr, MDAPI_MAX_PDU_SIZE-1);
+    }
+    else
+    {
+        strncpy(received_pdu, (const char *)ptr, data_len);
+    }
+    ret = smsPduDecode((const char *)received_pdu, data_len, num, smsc, msg, &charset, &curr_pack, &total_pack,date);
+    if(ret != 0)
+    {
+        LOGE("smsPduDecode fail\n");
+        return ;
+    }
+    LOGE("smsPduDecode ret: %d\n", ret);
+    LOGE("SMS :%s, %s, %d\n", __FILE__, __FUNCTION__, __LINE__);
+    LOGE("[EVENT][MT_SMS]PDU decode:smsc: %s\n, phone number: %s\ncharset: %d\n msg_len: %d\n message content: %s\n curr_pack: %d\n total_pack: %d\n date: %s", smsc, num, charset, strlen(msg), msg, curr_pack, total_pack, date);
+
+    gsw_sms_msg.content_encode = charset;
+    memcpy(gsw_sms_msg.src_num, num, strlen(num));
+    gsw_sms_msg.content_len = strlen(msg);
+    memcpy(gsw_sms_msg.content, msg, strlen(msg));
+
+    if(sscanf(date, "%4[^-]-%2[^-]-%2[^ ] %2[^:]:%2[^:]:%2s", (char*)gsw_sms_date.year, (char*)gsw_sms_date.month, (char*)gsw_sms_date.day, (char*)gsw_sms_date.hour, (char*)gsw_sms_date.minutes, (char*)gsw_sms_date.seconds)<=0)
+    {
+        LOGE("sscanf failed\n");
+    }
+
+    snprintf((char *)gsw_sms_date.timezone, sizeof(gsw_sms_date.timezone), "%s","+8");
+
+    LOGE("Year: %s\n", (char*)gsw_sms_date.year);
+    LOGE("Month: %s\n", (char*)gsw_sms_date.month);
+    LOGE("Day: %s\n", (char*)gsw_sms_date.day);
+    LOGE("Hour: %s\n", (char*)gsw_sms_date.hour);
+    LOGE("Minute: %s\n", (char*)gsw_sms_date.minutes);
+    LOGE("Second: %s\n", (char*)gsw_sms_date.seconds);
+
+    gsw_sms_msg.date = gsw_sms_date;
+
+    if(gsw_sms_callback)
+    {
+        if(total_pack > 1 && curr_pack < total_pack)
+        {
+            gsw_sms_callback(GSW_SMS_RECEIVED_FLG, &gsw_sms_msg);
+        }
+        else
+        {
+            gsw_sms_callback(GSW_SMS_FULL_FLG, &gsw_sms_msg);
+        }
+        
+    }
+
+}
+
+
+/**
+ * @brief SDK interface to call back sms messages
+ * @param  [in] handle_ptr 
+ * @retval 0: success
+ * @retval other: fail
+ */
+int gsw_sms_reg_callback(GSW_SMS_Callback_fun handle_ptr)
+{ 
+    if(init_flag == 0)
+    {
+        return -1;
+    }
+
+    if(handle_ptr == NULL)
+    {
+        LOGE("gsw_sms_reg_callback fail,handle_ptr is null\n");
+        return -1;
+    }
+    else
+    { 
+        gsw_sms_callback = handle_ptr;
+    }
+    return GSW_HAL_SUCCESS;
+}
+
+/**
+ * @brief sms sdk init
+ * @param  [in] token 
+ * @retval 0: success
+ * @retval other: fail
+ */
+int gsw_sms_sdk_init(int token)
+{
+    handle = token;
+    int ret = -1;
+
+    if(init_flag == 1)
+    {
+        LOGE("has init sms sdk,return\n");
+        return GSW_HAL_SUCCESS;
+    }
+
+    ret = mbtk_sms_import();
+    if(ret != 0)
+    {
+        if(mbtk_log != NULL)
+        {
+            LOGE("[gsw_sms_sdk_init]mbtk_sms_import fail\n");
+        }
+        return GSW_HAL_FAIL;
+    }
+
+    mbtk_log_init("syslog", "MBTK_RIL");
+
+    sms_info_handle = mbtk_info_handle_get();
+    if(sms_info_handle == NULL)
+    {
+        LOGE("[gsw_sms_sdk_init] mbtk handle init fail\n");
+        dlclose(dlHandle_mbtk);
+        return GSW_HAL_FAIL;
+    }
+
+    ret = mbtk_sms_cnmi_set(sms_info_handle);
+    if(ret != 0)
+    {
+        LOGE("mbtk_sms_cnmi_set fail.[%d]\n", ret);
+        return GSW_HAL_FAIL;
+    }
+
+    ret = mbtk_sms_state_change_cb_reg(sms_info_handle, gsw_sms_state_change_cb);
+    if(ret != 0)
+    {
+        LOGE("mbtk_sms_state_change_cb_reg fail.[%d]\n", ret);
+        if(sms_info_handle)
+        {
+            mbtk_info_handle_free(&sms_info_handle);
+            sms_info_handle = NULL;
+        }
+        return GSW_HAL_FAIL;
+    }
+
+    LOGD("[gsw_sms_sdk_init]gsw_sms_sdk_init success\n");
+    init_flag = 1;
+    return GSW_HAL_SUCCESS;
+}
+
+/**
+ * @brief sms sdk deinit
+ * @param  
+ * @retval 0: success
+ * @retval other: fail
+ */
+int gsw_sms_sdk_deinit(void)
+{
+    int ret = -1;
+
+    if(init_flag == 0)
+    {
+        return -1;
+    }
+
+    LOGD("callback clear\n");
+    gsw_sms_callback = NULL;
+
+    LOGD("handle_free\n");
+    if(sms_info_handle != NULL)
+    {
+        ret = mbtk_info_handle_free(&sms_info_handle);
+        if(ret != 0)
+        {
+            LOGE("[gsw_sms_sdk_deinit]mbtk_info_handle_free fail\n");
+            return GSW_HAL_FAIL;
+        }
+        sms_info_handle = NULL;
+    }
+
+    LOGD("dlclose start\n");
+    if(dlHandle_mbtk == NULL)
+    {
+        LOGE("[gsw_sms_sdk_deinit]dlHandle_sms is null\n");
+    }
+    else
+    {
+        dlclose(dlHandle_mbtk);
+    }
+    LOGD("dlclose end\n");
+    init_flag = 0;
+    return GSW_HAL_SUCCESS;
+}
+
+/**
+ * @brief send sms fuction *
+ * @param  [in] phone_num dest phone num send sms
+ * @param  [in] char_set encode format for sms 0 7bit 1 binary 2 usc2
+ * @param  [in] msg sms content
+ * @param  [in] msg_len send sms length,max is 1024
+ * @retval 0: success
+ * @retval other: fail
+ */
+int gsw_send_sms(char *phone_num, int char_set, char *msg, int msg_len)
+{
+
+    if(init_flag == 0)
+    {
+        return GSW_HAL_FAIL;
+    }
+
+    if(phone_num == NULL || msg == NULL)
+    {
+        return GSW_HAL_MEM_INVAILD;
+    }
+
+    if(strlen((char *)msg) > GSW_SMS_RECV_CONT_MAX || strlen((char *)msg) == 0 || strlen((char *)phone_num) == 0)
+    {
+        LOGE("strlen(telephony_num):%d", strlen((char *)phone_num));
+        LOGE("strlen(msg):%d", strlen((char *)msg));
+        return GSW_HAL_MEM_INVAILD;
+    }
+
+    int err = -1;
+
+    char smscPDU[30] = {0};
+    char **pdu = NULL;
+    char smsc[4] = {0};
+    char cmgs[MSM_NUMBER_MAX] = {0};
+    char resp[RES_NUM_MIN] = {0};
+    char msg_e_b[GSW_SMS_RECV_CONT_MAX+1] = {0};// +1 for end of string.*2:A char array contains two elements of a string for each value
+
+    kal_int32 msg_num = 0;
+    kal_int32 pdu_msg_len = 0;
+    kal_int32 status = MDAPI_RET_ERROR;
+    kal_int32 index = 0;
+
+    if(char_set == 1) //8bit
+    {
+        ArrayToStr((unsigned char *)msg, (unsigned int)msg_len, msg_e_b);
+        status = _mdapi_sms_get_msg_num(msg_e_b, char_set, &msg_num, &pdu_msg_len);
+    }
+    
+    else //7bit usc2
+    {
+        status = _mdapi_sms_get_msg_num((char *)msg, char_set, &msg_num, &pdu_msg_len);
+    }
+    
+    LOGE("%s, %s, %d, msg_len = [%d] ,msg_num=[%d]\n", __FILE__, __FUNCTION__, __LINE__, msg_len, msg_num);
+    if(status == MDAPI_RET_ERROR)
+    {
+        LOGE("get message number failed\n");
+        //return GSW_HAL_FAIL;
+    }
+    else
+    {
+        //allocate memery for **pdu
+        pdu = (char **)malloc(sizeof(char *) * msg_num);
+        if(pdu == NULL)
+        {
+            LOGE("%s, %s, %d, allocate memory for pdu failed\n", __FILE__, __FUNCTION__, __LINE__);
+            return GSW_HAL_FAIL;
+        }
+
+        else
+        {
+            for(index = 0; index < msg_num; index++)
+            {
+                pdu[index] = (char *)malloc(sizeof(char)*MAX_PDU_SIZE);
+                if(pdu[index] == NULL)
+                {
+                    for(int i = 0; i < index; i++)
+                    {
+                        free(pdu[i]);
+                        pdu[i] = NULL;
+                    }
+                    free(pdu);
+                    pdu = NULL;
+                    LOGE("%s, %s, %d, allocate memory for pdu[%d] failed\n", __FILE__, __FUNCTION__, __LINE__,index);
+                    return GSW_HAL_FAIL;
+                }
+                else
+                {
+                    memset(pdu[index], 0, MAX_PDU_SIZE);
+                    LOGE("%s, %s, %d, pdu[%d} init value is: %s \n", __FILE__, __FUNCTION__, __LINE__, index, pdu[index]);
+                }
+            }
+        }
+    }
+
+    //allocate memory for **pdu success
+    if(index == msg_num)
+    {
+        if(char_set == 1)//8bit
+        {
+            smsPduEncode(smsc, (char *)phone_num, msg_e_b, char_set, smscPDU, pdu);
+        }
+        else
+        {
+            smsPduEncode(smsc, (char *)phone_num, (char *)msg, char_set, smscPDU, pdu);
+        }
+        for(index = 0; index < msg_num; index++)
+        {
+            char pdu_data[MAX_PDU_SIZE] = {0};
+            char *p = pdu_data;
+
+            LOGE("index:%d\n",index);
+            LOGE("%s, %s, %d, smscPDU: %s, pdu: %s",__FILE__, __FUNCTION__, __LINE__, smscPDU, pdu[index]);
+            sprintf(p, "%s",smscPDU);
+            LOGE("pdu_data:%s\n", pdu_data);
+            int sc = strlen(pdu_data);
+            sprintf(p+strlen(p), "%s", pdu[index]);
+            LOGE("pdu_data:%s\n", pdu_data);
+
+            int t = strlen(pdu_data);
+            sprintf(cmgs, "%d,%s", (t-sc)/2, pdu_data);
+            LOGE("cmgs:%s\n", cmgs);
+            memset(resp, 0, sizeof(resp));
+
+            err = mbtk_sms_cmgf_set(sms_info_handle, 0);
+            if(err)
+            {
+                LOGE("cmgf set error : %d\n", err);
+                for(index = 0; index < msg_num; index++){
+                    free(pdu[index]);
+                    pdu[index] = NULL;
+                }
+                free(pdu);
+                pdu = NULL;
+                return GSW_HAL_FAIL;
+            }
+            else
+            {
+                LOGD("cmgf set success\n");
+            }
+
+            err = mbtk_sms_cmgs_set(sms_info_handle, cmgs, resp);
+            if(err)
+            {
+                LOGE("cmgs send fail\n");
+                for(index = 0; index < msg_num; index++){
+                    free(pdu[index]);
+                    pdu[index] = NULL;
+                }
+                free(pdu);
+                pdu = NULL;
+                return GSW_HAL_FAIL;
+            }
+            else
+            {
+                LOGD("cmgs send success, resp:%s\n", resp);
+            }
+
+        }
+    }
+
+    for(index = 0; index < msg_num; index++){
+        free(pdu[index]);
+        pdu[index] = NULL;
+    }
+    free(pdu);
+    pdu = NULL;
+
+    return GSW_HAL_SUCCESS;
+}
+
+
+/**
+ * @brief get smsc fuction *
+ * @param  [in] len input buf len for smsc,max is 32
+ * @param  [out] smsc address for smsc get from this func *
+ * @retval 0: success
+ * @retval other: fail
+ */
+int gsw_get_smsc_address(int len, char *smsc)
+{
+    int ret = -1;
+    int len_t = 0;
+    char smsc_temp[SMSC_MAX_LEN] = {0};
+    char *p1, *p2 ,*substr;
+
+    if(init_flag == 0)
+    {
+        return GSW_HAL_FAIL;
+    }
+
+    if(smsc == NULL || len <= 0)
+    {
+        LOGE("smsc is null or len = %d\n",len);
+        return GSW_HAL_MEM_INVAILD;
+    }
+
+    ret = mbtk_sms_csca_get(sms_info_handle, smsc_temp);
+    if(smsc_temp[0] == '\0')
+    {
+        LOGE("gsw_get_smsc_address Error : %d\n", ret);
+        return GSW_HAL_FAIL;
+    }
+
+    else
+    {
+        p1 = strchr(smsc_temp, '\"');
+        p2 = strrchr(smsc_temp, '\"');
+        if (p1 && p2 && p2 > p1)
+        {
+            len_t = p2 - p1 - 1;
+            char* substr_t = NULL;
+            substr_t = (char *)malloc(len_t + 1);
+            if(substr_t == NULL)
+            {
+                LOGE("malloc substr_t fail\n");
+                return GSW_HAL_MEM_INVAILD;
+            }
+            strncpy(substr_t, p1 + 1, len_t);
+            substr_t[len_t] = '\0';
+
+            substr = substr_t;
+            
+            memcpy(smsc, substr, strlen(substr));
+            memcpy(sms_center_address, substr, strlen(substr));
+
+            LOGE("qser_sms_getsmscenteraddress success, smsc = %s\n", sms_center_address);
+            free(substr_t);
+        }
+        else
+        {
+            LOGE("String inside double quotes not found\n");
+            return GSW_HAL_FAIL;
+        }
+    }
+    
+
+    return GSW_HAL_SUCCESS;
+}
+
+/**
+ * @brief set smsc fuction
+ * @param  [out] smsc string value for smsc,max length is 32 *
+ * @retval 0: success
+ * @retval other: fail
+ */
+int gsw_set_smsc_address(const char *smsc)
+{
+    int ret = -1;
+
+    if(init_flag == 0)
+    {
+        return GSW_HAL_FAIL;
+    }
+
+    if(smsc == NULL || strlen((char *)smsc) == 0)
+    {
+        LOGE("smsc is null or empty\n");
+        return GSW_HAL_MEM_INVAILD;
+    }
+
+    ret = mbtk_sms_csca_set(sms_info_handle, (char *)smsc);
+
+    if(ret == 0)
+    {
+        LOGE("set smsc success,smsc = %s\n",smsc);
+    }
+    else
+    {
+        LOGE("set smsc fail,ret = %d\n", ret);
+        return GSW_HAL_FAIL;
+    }
+
+    return GSW_HAL_SUCCESS;
+}
\ No newline at end of file
diff --git a/mbtk/libgsw_lib/gsw_tee.c b/mbtk/libgsw_lib/gsw_tee.c
new file mode 100755
index 0000000..2ba8ece
--- /dev/null
+++ b/mbtk/libgsw_lib/gsw_tee.c
@@ -0,0 +1,331 @@
+
+#include "gsw/gsw_tee.h"
+#include <dlfcn.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+
+
+#include <tee_client_api.h>
+
+#ifndef LOG_ERR_LEVEL
+#define LOG_ERR_LEVEL  3      /* error conditions */
+#endif
+#ifndef LOG_WARN_LEVEL
+#define LOG_WARN_LEVEL 4   /* warning conditions */
+#endif
+#ifndef LOG_INFO_LEVEL
+#define LOG_INFO_LEVEL 6      /* informational */
+#endif
+#ifndef LOG_DEBUG_LEVEL
+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */
+#endif
+#ifndef LOG_VERBOSE_LEVEL
+#define LOG_VERBOSE_LEVEL 8
+#endif
+
+#define LOGV(fmt, args ...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
+    } while(0)
+
+#define LOGI(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        mbtk_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
+    } while(0)
+
+#define LOGD(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
+    } while(0)
+
+#define LOGW(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        mbtk_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
+    } while(0)
+
+#define LOGE(fmt, args...) \
+    do{ \
+		char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        mbtk_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
+    } while(0)
+
+struct test_ctx {
+	TEEC_Context ctx;
+	TEEC_Session sess;
+};
+
+
+struct test_ctx ctx;
+
+#define lib_secure_path "/lib/libsecure_storage.so"
+static void *dlHandle_secure;
+
+#define lib_mbtk_path "/lib/libmbtk_lib.so"
+static void *dlHandle_mbtk;
+
+
+
+
+
+static void (*mbtk_log)(int level, const char *format, ...);
+static void (*mbtk_log_init)(char *path, char *tag);
+
+
+
+int (*prepare_tee_session)(struct test_ctx *ctx);
+void (*terminate_tee_session)(struct test_ctx *ctx);
+TEEC_Result (*read_secure_object)(struct test_ctx *ctx, const char *id,char *data, size_t data_len);
+TEEC_Result (*write_secure_object)(struct test_ctx *ctx, const char *id,char *data, size_t data_len);
+TEEC_Result (*delete_secure_object)(struct test_ctx *ctx, const char *id);
+
+
+static int tee_api_import(void)
+{
+
+    dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
+    if (dlHandle_mbtk == NULL) 
+    {
+        return GSW_HAL_FAIL;
+    }
+
+    dlHandle_secure = dlopen(lib_secure_path, RTLD_NOW);
+    if (dlHandle_secure == NULL) 
+    {
+        return GSW_HAL_FAIL;
+    }
+
+    mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
+    if (mbtk_log_init == NULL) 
+    {
+        return GSW_HAL_FAIL;
+    }
+
+    mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
+    if (mbtk_log == NULL) 
+    {
+        return GSW_HAL_FAIL;
+    }
+
+    prepare_tee_session = (int (*)(struct test_ctx *ctx))dlsym(dlHandle_secure, "prepare_tee_session");
+    if (prepare_tee_session == NULL) 
+    {
+        LOGE("prepare_tee_session dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    terminate_tee_session = (void (*)(struct test_ctx *ctx))dlsym(dlHandle_secure, "terminate_tee_session");
+    if (terminate_tee_session == NULL) 
+    {
+        LOGE("terminate_tee_session dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    read_secure_object = (TEEC_Result (*)(struct test_ctx *ctx, const char *id,char *data, size_t data_len))dlsym(dlHandle_secure, "read_secure_object");
+    if (read_secure_object == NULL) 
+    {
+        LOGE("read_secure_object dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    write_secure_object = (TEEC_Result (*)(struct test_ctx *ctx, const char *id,char *data, size_t data_len))dlsym(dlHandle_secure, "write_secure_object");
+    if (write_secure_object == NULL) 
+    {
+        LOGE("write_secure_object dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    delete_secure_object = (TEEC_Result (*)(struct test_ctx *ctx, const char *id))dlsym(dlHandle_secure, "delete_secure_object");
+    if (delete_secure_object == NULL) 
+    {
+        LOGE("delete_secure_object dlsym fail\n");
+        return GSW_HAL_FAIL;
+    }
+
+    return GSW_HAL_SUCCESS;
+}
+
+/**
+* @brief init tee sdk
+* @param  [in] None
+* @param  [out] None
+* @retval GSW_HAL_SUCCESS is success\other is fail
+*/
+int32_t gsw_tee_sdk_init(void)
+{
+    int32_t ret = 0;
+    ret = tee_api_import();
+    if(ret)
+    {
+	LOGE("tee_api_import fail\n");
+        return ret;
+    }
+    ret = prepare_tee_session(&ctx);
+
+    return ret;
+}
+
+
+/**
+* @brief read sensitive data from tee
+* @param  [in] char* in_obj_name :Sensitive data name
+* @param  [in] unsigned int* p_out_buf_len:The size of sensitive data output cache
+* @param  [out] char* out_buf:Cache of sensitive data output
+* @param  [out] unsigned int* p_out_buf_len:Sensitive data length
+* @retval GSW_HAL_SUCCESS is success\other is fail
+*/
+#define basic_buf_len  7000
+int32_t gsw_tee_read_secure_data(const char* in_obj_name, char* out_buf, unsigned int* p_out_buf_len)
+{
+    int32_t ret = 0;
+    TEEC_Result res;
+    res = read_secure_object(&ctx, in_obj_name, out_buf, basic_buf_len);
+    if (res != TEEC_SUCCESS)
+    {
+	LOGE("Failed to read an object from the secure storage");
+        ret = -1;
+    }
+
+    *p_out_buf_len = strlen(out_buf);
+    return ret;
+}
+
+
+/**
+* @brief write sensitive data to tee
+* @param  [in] char* in_obj_name :Sensitive data name
+* @param  [in] char* in_buf:A cache for writing sensitive data
+* @param  [out] unsigned int in_buf_len:Sensitive data length
+* @retval GSW_HAL_SUCCESS is success\other is fail
+*/
+int32_t gsw_tee_write_secure_data(const char* in_obj_name, char* in_buf, unsigned int in_buf_len)
+{
+    int32_t ret = 0;
+    TEEC_Result res;
+    res = write_secure_object(&ctx, in_obj_name,in_buf, in_buf_len);
+    if (res != TEEC_SUCCESS)
+    {
+	LOGE("Failed to write an object from the secure storage");
+        ret = -1;
+    }
+
+    return ret;
+}
+
+
+/**
+* @brief delete sensitive data from tee
+* @param  [in] char* in_obj_name :Sensitive data name
+* @retval GSW_HAL_SUCCESS is success\other is fail
+*/
+int32_t gsw_tee_delete_secure_data(const char* in_obj_name)
+{
+    int32_t ret = 0;
+    TEEC_Result res;
+    res = delete_secure_object(&ctx, in_obj_name);
+    if (res != TEEC_SUCCESS)
+    {
+	LOGE("Failed to delete the object: 0x%x", res);
+        ret = -1;
+    }
+
+
+    return ret;
+
+}
+
+/**
+* @brief check sensitive data from tee
+* @param  [in] char* in_obj_name :Sensitive data name
+* @retval GSW_HAL_SUCCESS is exist\ other is not exist or fail
+*/
+int32_t gsw_tee_check_secure_data(const char* in_obj_name)
+{
+    int32_t ret = 1;
+    TEEC_Result res;
+    char out_buf[4];
+    res = read_secure_object(&ctx, in_obj_name, out_buf, sizeof(out_buf));
+
+    if (res == TEEC_ERROR_ITEM_NOT_FOUND)
+    {
+        LOGE("the obj no found\n");
+        ret = GSW_HAL_NOFOUND;
+    }
+    else if (res == TEEC_SUCCESS)
+    {
+        LOGE("the obj is exist\n");
+        ret = GSW_HAL_SUCCESS;
+    }
+    else
+    {
+        LOGE("Failed to read an object from the secure storage");
+        ret = GSW_HAL_FAIL;
+    }
+
+    return ret;
+}
+
+int32_t gsw_tee_sdk_deinit(void)
+{
+    if (terminate_tee_session) {
+        terminate_tee_session(&ctx);  // 终止TEE会话
+        terminate_tee_session = NULL;
+    }
+
+    if (dlHandle_secure) {
+        dlclose(dlHandle_secure);  // 卸载安全库
+        dlHandle_secure = NULL;
+    }
+
+    if (dlHandle_mbtk) {
+        dlclose(dlHandle_mbtk);  // 卸载日志库
+        dlHandle_mbtk = NULL;
+    }
+
+    return GSW_HAL_SUCCESS;
+}
+
diff --git a/mbtk/libgsw_lib/gsw_uart.c b/mbtk/libgsw_lib/gsw_uart.c
new file mode 100755
index 0000000..5b9738c
--- /dev/null
+++ b/mbtk/libgsw_lib/gsw_uart.c
@@ -0,0 +1,388 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <fcntl.h>

+#include <sys/types.h>

+#include <sys/stat.h>

+#include <string.h>

+#include <errno.h>

+#include <termios.h>

+#include <unistd.h>

+#include <stdint.h>

+#include <sys/ioctl.h>

+#include <dlfcn.h>

+

+#include "gsw_uart.h"

+

+#ifndef LOG_ERR_LEVEL

+#define LOG_ERR_LEVEL  3      /* error conditions */

+#endif

+#ifndef LOG_WARN_LEVEL

+#define LOG_WARN_LEVEL 4   /* warning conditions */

+#endif

+#ifndef LOG_INFO_LEVEL

+#define LOG_INFO_LEVEL 6      /* informational */

+#endif

+#ifndef LOG_DEBUG_LEVEL

+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */

+#endif

+#ifndef LOG_VERBOSE_LEVEL

+#define LOG_VERBOSE_LEVEL 8

+#endif

+

+#define LOGV(fmt, args ...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGI(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGD(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGW(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGE(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+    

+typedef void (*mbtk_log)(int level, const char *format,...);

+static mbtk_log fun_ptr_log = NULL;

+void *dlHandle_uart = NULL;

+char *lynqLib_uart = "/lib/libmbtk_lib.so";

+

+static int handle()

+{

+    if(dlHandle_uart == NULL || fun_ptr_log == NULL)

+    {

+        dlHandle_uart = dlopen(lynqLib_uart, RTLD_NOW);

+        fun_ptr_log = (mbtk_log)dlsym(dlHandle_uart, "mbtk_log");

+        if(fun_ptr_log == NULL || dlHandle_uart == NULL)

+        {

+            return GSW_HAL_FAIL;

+        }

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+

+

+

+int32_t gsw_uart_open_ex(int8_t *port, gsw_hal_uart_baudrate baudrate, uint32_t bits, int8_t parity, uint32_t stop)

+{

+    if (handle())

+        return GSW_HAL_FAIL;

+    int fd = -1;

+    if((fd = open((const char *)port, O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0)

+    {

+        LOGE("open %s failed - %d", port, errno);

+        return -1;

+    }

+    LOGD("Open %s success.", port);

+

+    /* set newtio */

+    struct termios newtio;

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

+    if (tcflush(fd, TCIOFLUSH) < 0) {

+        LOGE("Could not flush uart port");

+        return -1;

+    }

+

+    newtio.c_cc[VTIME]    = 0;   /* inter-character timer unused */

+    newtio.c_cc[VMIN]      = 0;   /* blocking read until 5 chars received */

+

+    /* c_iflag 输入模式 */

+    newtio.c_iflag &= ~(ICRNL |  INLCR);

+    newtio.c_iflag &= ~(IXON | IXOFF | IXANY);

+

+    // /* c_lflag 本地模式 */

+    newtio.c_cflag &= ~ INPCK;

+    newtio.c_cflag |= (CLOCAL |  CREAD);

+

+    // /* c_lflag 本地模式 */

+    newtio.c_lflag &= ~(ICANON | ECHO | ECHOE |  ISIG);

+    /* c_oflag 输出模式 */

+    newtio.c_oflag &= ~ OPOST;

+    newtio.c_oflag &= ~(ONLCR | OCRNL);

+

+    /* c_cflag 控制模式 */

+    newtio.c_cflag &= ~ CSIZE;

+    newtio.c_cflag |=  CS8;

+    newtio.c_cflag &= ~ CSTOPB;

+    newtio.c_cflag &= ~ PARENB;

+

+

+    switch(baudrate)

+    {

+        case GSW_HAL_BAUDRATE_1200:

+            cfsetospeed(&newtio, B1200);

+            cfsetispeed(&newtio, B1200);

+            break;

+        case GSW_HAL_BAUDRATE_1800:

+            cfsetospeed(&newtio, B1800);

+            cfsetispeed(&newtio, B1800);

+            break;

+        case GSW_HAL_BAUDRATE_4800:

+            cfsetospeed(&newtio, B4800);

+            cfsetispeed(&newtio, B4800);

+            break;

+        case GSW_HAL_BAUDRATE_9600:

+            cfsetospeed(&newtio, B9600);

+            cfsetispeed(&newtio, B9600);

+            break;

+        case GSW_HAL_BAUDRATE_19200:

+            cfsetospeed(&newtio, B19200);

+            cfsetispeed(&newtio, B19200);

+            break;

+        case GSW_HAL_BAUDRATE_38400:

+            cfsetospeed(&newtio, B38400);

+            cfsetispeed(&newtio, B38400);

+            break;

+        case GSW_HAL_BAUDRATE_57600:

+            cfsetospeed(&newtio, B57600);

+            cfsetispeed(&newtio, B57600);

+            break;

+        case GSW_HAL_BAUDRATE_115200:

+            cfsetospeed(&newtio, B115200);

+            cfsetispeed(&newtio, B115200);

+            break;

+        case GSW_HAL_BAUDRATE_230400:

+            cfsetospeed(&newtio, B230400);

+            cfsetispeed(&newtio, B230400);

+            break;

+        case GSW_HAL_BAUDRATE_460800:

+            cfsetospeed(&newtio, B460800);

+            cfsetispeed(&newtio, B460800);

+            break;

+        case GSW_HAL_BAUDRATE_500000:

+            cfsetospeed(&newtio, B500000);

+            cfsetispeed(&newtio, B500000);

+            break;

+        case GSW_HAL_BAUDRATE_576000:

+            cfsetospeed(&newtio, B576000);

+            cfsetispeed(&newtio, B576000);

+            break;

+        case GSW_HAL_BAUDRATE_921600:

+            cfsetospeed(&newtio, B921600);

+            cfsetispeed(&newtio, B921600);

+            break;

+        default:

+            cfsetospeed(&newtio, B115200);

+            cfsetispeed(&newtio, B115200);

+            break;

+    }

+

+    switch(bits)

+    {

+        case CS5:

+            newtio.c_cflag &= ~CSIZE;

+            newtio.c_cflag |= CS5;

+            break;

+        case CS6:

+            newtio.c_cflag &= ~CSIZE;

+            newtio.c_cflag |= CS6;

+            break;

+        case CS7:

+            newtio.c_cflag &= ~CSIZE;

+            newtio.c_cflag |= CS7;

+            break;

+        case CS8:

+            newtio.c_cflag &= ~CSIZE;

+            newtio.c_cflag |= CS8;

+            break;

+        default:

+            LOGD("No set databit.");

+            break;

+    }

+

+    if(stop == 2) {

+        newtio.c_cflag |= CSTOPB;

+    } else {

+        newtio.c_cflag &= ~CSTOPB;

+    }

+

+    switch (parity)

+    {

+        case '1':// 奇校验

+            newtio.c_cflag |= PARENB;

+            newtio.c_cflag |= PARODD;

+            break;

+        case '2':// 偶校验

+            newtio.c_cflag |= PARENB;

+            newtio.c_cflag &= ~PARODD;

+            break;

+        case '0':// 无奇偶校验

+            newtio.c_cflag &= ~PARENB;

+            break;

+        default:

+            LOGD("No set parity.");

+            break;

+    }

+

+    if (tcsetattr(fd, TCSANOW, &newtio) < 0) {

+        LOGE("Can't set port setting");

+        return -1;

+    }

+

+    return fd;

+}

+

+int32_t gsw_uart_flush(int32_t fd)

+{

+    if (tcflush(fd, TCIOFLUSH) < 0)

+    {

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+

+int32_t gsw_uart_read(int32_t fd, uint8_t *buffer, uint32_t len, int32_t timeout_ms)

+{

+    if (handle())

+        return GSW_HAL_FAIL;

+    int flags = fcntl(fd, F_GETFL); // 获取当前状态标志  

+    if (flags == -1)

+    {

+        perror("fcntl get");

+        return GSW_HAL_FAIL;

+    }

+

+    struct termios newtio;

+    if (tcgetattr(fd, &newtio) < 0) {

+        perror("tcgetattr failed");

+        return -1;

+    }

+    if (timeout_ms == 0)

+    {

+        flags |= O_NONBLOCK; // 设置非阻塞标志 

+        fcntl(fd, F_SETFL, flags);

+        newtio.c_cc[VMIN] = 0;

+        newtio.c_cc[VTIME] = 0;

+    }

+    else if (timeout_ms == 1)

+    {

+        flags &= ~O_NONBLOCK; // 清除非阻塞标志

+        fcntl(fd, F_SETFL, flags);

+        newtio.c_cc[VMIN] = 1;

+        newtio.c_cc[VTIME] = timeout_ms/100;

+    }

+    else

+    {

+        flags &= ~O_NONBLOCK; // 清除非阻塞标志

+        fcntl(fd, F_SETFL, flags);

+        newtio.c_cc[VMIN] = 0;

+        newtio.c_cc[VTIME] = timeout_ms/100;

+    }

+    if(timeout_ms != 0)

+        LOGI("%s :VMIN = %d ;VTIME = %d\n",__func__,newtio.c_cc[VMIN],newtio.c_cc[VTIME]);  

+    if (tcsetattr(fd, TCSANOW, &newtio) != 0)

+    {  

+        perror("tcsetattr");  

+        return -1;

+    }

+    //gsw_uart_flush(fd);

+    int data_len =  read(fd, buffer, len);

+    if (data_len < 0)

+    {

+        if(errno == EAGAIN || errno == EWOULDBLOCK)

+            return 0;

+        else

+            return GSW_HAL_FAIL;

+    }

+    return data_len;

+}

+

+

+int32_t gsw_uart_write(int32_t fd, const uint8_t *buffer, uint32_t len)

+{

+    //gsw_uart_flush(fd);

+    if (write(fd, buffer, len) < 0)

+    {

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+int32_t gsw_uart_ioctl(int32_t fd, uint32_t cmd, void *pvalue)

+{

+    if (handle())

+        return GSW_HAL_FAIL;

+    if (fd < 0 || pvalue == NULL)

+    {  

+        LOGE("Invalid file descriptor");  

+        return GSW_HAL_FAIL;  

+    }  

+    if (ioctl(fd, cmd, pvalue) < 0)

+    {  

+        LOGE("Could not set DCB,error:%d, %s\n",errno, strerror(errno));  

+        return GSW_HAL_FAIL;  

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+

+

+

+int32_t gsw_uart_close(int32_t fd)

+{

+    if (fd <= 0)

+        return GSW_HAL_FAIL;

+    //gsw_uart_flush(fd);

+    close(fd);

+    return GSW_HAL_SUCCESS;

+}

+

diff --git a/mbtk/libgsw_lib/gsw_voice.c b/mbtk/libgsw_lib/gsw_voice.c
new file mode 100755
index 0000000..a6f0883
--- /dev/null
+++ b/mbtk/libgsw_lib/gsw_voice.c
@@ -0,0 +1,1007 @@
+#include "gsw/gsw_voice.h"

+#include <dlfcn.h>

+#include <pthread.h>

+

+// mbtk includes

+

+typedef unsigned int uint32;

+typedef unsigned char uint8;

+typedef unsigned short uint16;

+typedef void (*mbtk_info_callback_func)(const void* data, int data_len);

+

+typedef struct

+{

+    int client_fd;

+    pthread_t read_thread_id;

+    int exit_fd[2];

+    bool is_waitting;

+    pthread_cond_t cond;

+    pthread_mutex_t mutex;

+

+    pthread_mutex_t send_mutex;

+

+    // Temp response data.

+    uint16 info_err;

+    uint16 data_len;

+    void *data;

+

+    //mbtk wyq for server_ready_status add start

+    char server_ready_status;

+    //mbtk wyq for server_ready_status add end

+

+    mbtk_info_callback_func net_state_cb;

+    mbtk_info_callback_func call_state_cb;

+    mbtk_info_callback_func sms_state_cb;

+    mbtk_info_callback_func radio_state_cb;

+    mbtk_info_callback_func sim_state_cb;

+    mbtk_info_callback_func pdp_state_cb;

+    //add signal by xr

+    mbtk_info_callback_func signal_state_cb;

+} mbtk_info_handle_t;

+

+typedef struct

+{

+    uint8 call_wait;

+    uint8 dir1;

+    uint8 dir;

+    uint8 state;

+    uint8 mode;

+    uint8 mpty;

+    char phone_number[100];

+    uint8 type;

+    uint8 pas;

+    uint8 disconnected_id;

+    uint8 end_reason[128];

+} __attribute__((packed)) mbtk_call_info_t;

+

+typedef enum {

+    MBTK_CLCC = 1,

+    MBTK_CPAS,

+    MBTK_DISCONNECTED,

+} mbtk_call_enum;

+

+typedef enum {

+    MBTK_CALL_RADY,                 //MT allows commands from TA/TE

+    MBTK_CALL_UNAVAILABLE,          //MT does not allow commands from TA/TE

+    MBTK_CALL_UNKNOWN,              //MT is not guaranteed to respond to instructions

+    MBTK_CALL_RINGING,              //MT is ready for commands from TA/TE, but the ringer is active

+    MBTK_CALL_PROGRESS,             //MT is ready for commands from TA/TE, but a call is in progress

+    MBTK_CALL_ASLEEP,               //MT is unable to process commands from TA/TE because it is in a low functionality state

+    MBTK_CALL_ACTIVE,

+} mbtk_call_pas_enum;

+

+

+//----------------end_reason start------------

+//mbtk end_reason define

+#define MBTK_VOICE_END_REASON_UNKNOWN "0 " 

+#define MBTK_VOICE_END_REASON_UNASSIGNED_NUMBER "1 " 

+#define MBTK_VOICE_END_REASON_NO_ROUTE_DES "3 " 

+#define MBTK_VOICE_END_REASON_CHANNEL_UNACCEPTABLE "6 " 

+#define MBTK_VOICE_END_REASON_OPERATOR_DETERMINED_BARRING "8 " 

+#define MBTK_VOICE_END_REASON_NORMAL_CALL_CLEARING "16 " 

+#define MBTK_VOICE_END_REASON_USER_BUSY "17 " 

+#define MBTK_VOICE_END_REASON_NO_USER_RESPONDING "18 " 

+#define MBTK_VOICE_END_REASON_USER_ALERTING_NO_ANSWER "19 " 

+#define MBTK_VOICE_END_REASON_CALL_REJECTED "21 " 

+#define MBTK_VOICE_END_REASON_NUMBER_CHANGED "22 " 

+#define MBTK_VOICE_END_REASON_PREEMPTION "25 " 

+#define MBTK_VOICE_END_REASON_NON_SELECTED_USER_CLEARING "26 " 

+#define MBTK_VOICE_END_REASON_DESTINATION_OUT_OF_ORDER "27 " 

+#define MBTK_VOICE_END_REASON_INVALID_NUMBER_FORMAT "28 " 

+#define MBTK_VOICE_END_REASON_FACILITY_REJECTED "29 " 

+#define MBTK_VOICE_END_REASON_STATUS_ENQUIRY "30 " 

+#define MBTK_VOICE_END_REASON_NORMAL_UNSPECIFIED "31 " 

+#define MBTK_VOICE_END_REASON_NO_CIRCUIT_AVAILABLE "34 " 

+#define MBTK_VOICE_END_REASON_NETWORK_OUT_OF_ORDER "38 " 

+#define MBTK_VOICE_END_REASON_TEMPORARY_FAILURE "41 " 

+#define MBTK_VOICE_END_REASON_SWITCHING_EQUIPMENT_CONGESTION "42 " 

+#define MBTK_VOICE_END_REASON_ACCESS_INFORMATION_DISCARDED "43 " 

+#define MBTK_VOICE_END_REASON_REQUESTED_CIRCUIT_UNAVAILABLE "44 " 

+#define MBTK_VOICE_END_REASON_RESOURCE_UNAVAILABLE "47 " 

+#define MBTK_VOICE_END_REASON_QOS_UNAVAILABLE "49 " 

+#define MBTK_VOICE_END_REASON_REQUESTED_FACILITY_NOT_SUBSCRIBED "50 " 

+#define MBTK_VOICE_END_REASON_INCOMING_CALLS_BARRED_WITHIN_CUG "55 " 

+#define MBTK_VOICE_END_REASON_BEARER_CAPABILITY_NOT_AUTHORIZED "57 " 

+#define MBTK_VOICE_END_REASON_BEARER_CAPABILITY_NOT_AVAILABLE "58 " 

+#define MBTK_VOICE_END_REASON_SERVICE_NOT_AVAILABLE "63 " 

+#define MBTK_VOICE_END_REASON_BEARER_SERVICE_NOT_IMPLEMENTED "65 " 

+#define MBTK_VOICE_END_REASON_ACM_MAX_REACHED "68 " 

+#define MBTK_VOICE_END_REASON_FACILITY_NOT_IMPLEMENTED "69 " 

+#define MBTK_VOICE_END_REASON_ONLY_RDI_BEARER_CAPABILITY_AVAILABLE "70 " 

+#define MBTK_VOICE_END_REASON_SERVICE_NOT_IMPLEMENTED "79 " 

+#define MBTK_VOICE_END_REASON_INVALID_TRANSACTION_ID "81 " 

+#define MBTK_VOICE_END_REASON_USER_NOT_MEMBER_OF_CUG "87 " 

+#define MBTK_VOICE_END_REASON_INCOMPATIBLE_DESTINATION "88 " 

+#define MBTK_VOICE_END_REASON_INVALID_TRANSIT_NETWORK_SELECTION "91 " 

+#define MBTK_VOICE_END_REASON_INCORRECT_MESSAGE "95 " 

+#define MBTK_VOICE_END_REASON_INVALID_MANDATORY_INFORMATION "96 " 

+#define MBTK_VOICE_END_REASON_MESSAGE_TYPE_NON_EXISTENT "97 " 

+#define MBTK_VOICE_END_REASON_MESSAGE_TYPE_WRONG_STATE "98 " 

+#define MBTK_VOICE_END_REASON_INFORMATION_ELEMENT_NOT_EXISTENT "99 " 

+#define MBTK_VOICE_END_REASON_CONDITIONAL_IE_ERROR "100 " 

+#define MBTK_VOICE_END_REASON_MESSAGE_WRONG_STATE "101 " 

+#define MBTK_VOICE_END_REASON_RECOVERY_AFTER_TIMER_EXPIRY "102 " 

+#define MBTK_VOICE_END_REASON_PROTOCOL_ERROR_UNSPECIFIED "111 " 

+#define MBTK_VOICE_END_REASON_INERWORKING_UNSPECIFIED "127 " 

+#define MBTK_VOICE_END_REASON_CALL_BARRING "224 " 

+#define MBTK_VOICE_END_REASON_FDN_BLOCKED "241 "

+#define MBTK_VOICE_END_REASON_END "end"

+

+typedef enum{

+    GSW_LOCAL_END_NORMAL = 0,

+    GSW_PEER_END_NORMAL,

+    GSW_OTHER_END_NORMAL,

+    GSW_END_ABNORMAL,

+} gsw_call_end_reason_enum;

+

+//mbtk end_reason enum define

+typedef struct {

+    char mbtk_end_reason[128];

+    gsw_call_end_reason_enum end_reason;

+}end_reason_t;

+

+end_reason_t g_end_reason[] = {

+{MBTK_VOICE_END_REASON_UNASSIGNED_NUMBER, GSW_PEER_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_NO_ROUTE_DES, GSW_END_ABNORMAL}, 

+{MBTK_VOICE_END_REASON_CHANNEL_UNACCEPTABLE, GSW_END_ABNORMAL}, 

+{MBTK_VOICE_END_REASON_OPERATOR_DETERMINED_BARRING, GSW_END_ABNORMAL}, 

+{MBTK_VOICE_END_REASON_NORMAL_CALL_CLEARING, GSW_LOCAL_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_USER_BUSY, GSW_OTHER_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_NO_USER_RESPONDING, GSW_OTHER_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_USER_ALERTING_NO_ANSWER, GSW_LOCAL_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_CALL_REJECTED, GSW_LOCAL_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_NUMBER_CHANGED, GSW_OTHER_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_PREEMPTION, GSW_OTHER_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_NON_SELECTED_USER_CLEARING, GSW_OTHER_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_DESTINATION_OUT_OF_ORDER, GSW_OTHER_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_INVALID_NUMBER_FORMAT, GSW_OTHER_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_FACILITY_REJECTED, GSW_OTHER_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_STATUS_ENQUIRY, GSW_OTHER_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_NORMAL_UNSPECIFIED, GSW_PEER_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_NO_CIRCUIT_AVAILABLE, GSW_OTHER_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_NETWORK_OUT_OF_ORDER, GSW_END_ABNORMAL}, 

+{MBTK_VOICE_END_REASON_TEMPORARY_FAILURE, GSW_END_ABNORMAL}, 

+{MBTK_VOICE_END_REASON_SWITCHING_EQUIPMENT_CONGESTION, GSW_OTHER_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_ACCESS_INFORMATION_DISCARDED, GSW_OTHER_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_REQUESTED_CIRCUIT_UNAVAILABLE, GSW_OTHER_END_NORMAL}, 

+{MBTK_VOICE_END_REASON_SERVICE_NOT_AVAILABLE, GSW_END_ABNORMAL},

+{MBTK_VOICE_END_REASON_END, GSW_OTHER_END_NORMAL}

+

+};

+

+int gsw_global_end_reason = GSW_OTHER_END_NORMAL;

+

+//----------------end_reason end------------

+

+

+typedef uint32_t voice_client_handle_type;

+

+

+

+static mbtk_info_handle_t* call_info_handle = NULL;

+static int level_call = 0;

+int gsw_voice_init_flag = 0;

+int auto_answer_flag = 0;

+voice_client_handle_type g_call_val = -1;

+CallStateInd gsw_voice_callback = NULL;

+

+

+int state_t = 0;

+char* phone_num_t = NULL;

+char* phone_num_t2 = NULL;

+int call_id_t = 0;

+int call_id_t2 = 0;

+

+#define lib_mbtk_path "/lib/libmbtk_lib.so"

+static void *dlHandle_mbtk;

+

+static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);

+int (*mbtk_call_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);

+int (*mbtk_call_start)(mbtk_info_handle_t* handle, char* phone_number);

+int (*mbtk_call_hang)(mbtk_info_handle_t* handle);

+int (*mbtk_a_call_hang)(mbtk_info_handle_t* handle, int phone_id);

+int (*mbtk_call_answer)(mbtk_info_handle_t* handle);

+int (*mbtk_call_reg_get)(mbtk_info_handle_t* handle, mbtk_call_info_t *reg);

+static void (*mbtk_log)(int level, const char *format, ...);

+static void (*mbtk_log_init)(char *path, char *tag);

+

+/*rtp begin*/

+int (*mbtk_rtp_init)();

+int (*mbtk_rtp_deinit)();

+int (*mbtk_rtp_enable)(bool enable);

+int (*mbtk_rtp_remote_ip_set)(const char *ipv4);

+int (*mbtk_rtp_server_port_set)(int port);

+int (*mbtk_rtp_client_port_set)(int port);

+int (*mbtk_rtp_sample_rate_set)(int sample_rate);

+int (*mbtk_rtp_channel_set)(int channel);

+/*rtp end*/

+

+

+#ifndef LOG_ERR_LEVEL

+#define LOG_ERR_LEVEL  3      /* error conditions */

+#endif

+#ifndef LOG_WARN_LEVEL

+#define LOG_WARN_LEVEL 4   /* warning conditions */

+#endif

+#ifndef LOG_INFO_LEVEL

+#define LOG_INFO_LEVEL 6      /* informational */

+#endif

+#ifndef LOG_DEBUG_LEVEL

+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */

+#endif

+#ifndef LOG_VERBOSE_LEVEL

+#define LOG_VERBOSE_LEVEL 8

+#endif

+

+#define LOGV(fmt, args ...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGI(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGD(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGW(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGE(fmt, args...) \

+    do{ \

+		char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+static int mbtk_rtp_api_import()

+{  

+    mbtk_rtp_init = (int (*)(void))dlsym(dlHandle_mbtk, "mbtk_rtp_init");

+    if (mbtk_rtp_init == NULL) 

+    {

+         LOGE("mbtk_rtp_init dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_rtp_deinit = (int (*)(void))dlsym(dlHandle_mbtk, "mbtk_rtp_deinit");

+    if (mbtk_rtp_deinit == NULL) 

+    {

+        LOGE("mbtk_rtp_deinit dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_rtp_enable = (int (*)(bool enable))dlsym(dlHandle_mbtk, "mbtk_rtp_enable");

+    if (mbtk_rtp_enable == NULL) 

+    {

+        LOGE("mbtk_rtp_enable dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_rtp_remote_ip_set = (int (*)(const char *ipv4))dlsym(dlHandle_mbtk, "mbtk_rtp_remote_ip_set");

+    if (mbtk_rtp_remote_ip_set == NULL) 

+    {

+        LOGE("mbtk_rtp_remote_ip_set dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_rtp_server_port_set = (int (*)(int port))dlsym(dlHandle_mbtk, "mbtk_rtp_server_port_set");

+    if (mbtk_rtp_server_port_set == NULL) 

+    {

+        LOGE("mbtk_rtp_server_port_set dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_rtp_client_port_set = (int (*)(int port))dlsym(dlHandle_mbtk, "mbtk_rtp_client_port_set");

+    if (mbtk_rtp_client_port_set == NULL) 

+    {

+        LOGE("mbtk_rtp_client_port_set dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_rtp_sample_rate_set = (int (*)(int sample_rate))dlsym(dlHandle_mbtk, "mbtk_rtp_sample_rate_set");

+    if (mbtk_rtp_sample_rate_set == NULL) 

+    {

+        LOGE("mbtk_rtp_sample_rate_set dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_rtp_channel_set = (int (*)(int channel))dlsym(dlHandle_mbtk, "mbtk_rtp_channel_set");

+    if (mbtk_rtp_channel_set == NULL) 

+    {

+        LOGE("mbtk_rtp_channel_set dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+   

+    return GSW_HAL_SUCCESS;

+}

+

+

+

+static int mbtk_call_api_import()

+{

+    dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);

+    if (dlHandle_mbtk == NULL) 

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");

+    if (mbtk_log_init == NULL) 

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");

+    if (mbtk_log == NULL) 

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");

+    if (mbtk_info_handle_get == NULL) 

+    {

+        LOGE("mbtk_info_handle_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_call_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_call_state_change_cb_reg");

+    if(mbtk_call_state_change_cb_reg == NULL)

+    {

+        LOGE("mbtk_call_state_change_cb_reg dlsym fail\n");

+         return GSW_HAL_FAIL;

+    }

+

+    mbtk_call_start = (int (*)(mbtk_info_handle_t* handle, char* phone_number))dlsym(dlHandle_mbtk, "mbtk_call_start");

+    if(mbtk_call_start == NULL)

+    {

+        LOGE("mbtk_call_start dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_call_answer = (int (*)(mbtk_info_handle_t* handle))dlsym(dlHandle_mbtk, "mbtk_call_answer");

+    if(mbtk_call_answer == NULL)

+    {

+        LOGE("mbtk_call_answer dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_call_hang = (int (*)(mbtk_info_handle_t* handle))dlsym(dlHandle_mbtk, "mbtk_call_hang");

+    if(mbtk_call_hang == NULL)

+    {

+        LOGE("mbtk_call_hang dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_a_call_hang = (int (*)(mbtk_info_handle_t* handle, int phone_id))dlsym(dlHandle_mbtk, "mbtk_a_call_hang");

+    if(mbtk_a_call_hang == NULL)

+    {

+        LOGE("mbtk_a_call_hang dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_call_reg_get = (int (*)(mbtk_info_handle_t* handle, mbtk_call_info_t *reg))dlsym(dlHandle_mbtk, "mbtk_call_reg_get");

+    if(mbtk_call_reg_get == NULL)

+    {

+        LOGE("mbtk_call_reg_get dlsym fail\n");

+        return GSW_HAL_FAIL;

+    }

+

+    return mbtk_rtp_api_import();

+}

+

+static int end_reason_mbtk_to_gsw(char* mbtk_reason)

+{

+    LOGE("mbtk_reason:%s\n", mbtk_reason);

+    gsw_global_end_reason = GSW_OTHER_END_NORMAL;

+    for(int i = 0; 0 != strncmp(g_end_reason[i].mbtk_end_reason, MBTK_VOICE_END_REASON_END, strlen(MBTK_VOICE_END_REASON_END)); i++)

+    {

+         if(0 == strncmp(mbtk_reason, g_end_reason[i].mbtk_end_reason, strlen(g_end_reason[i].mbtk_end_reason)))

+         {

+            gsw_global_end_reason = g_end_reason[i].end_reason;

+            LOGE("gsw_global_end_reason:%d\n", gsw_global_end_reason);

+            break;

+         }

+    }

+

+    return 0;

+}

+

+void gsw_call_state_change_cb(const void *data, int data_len)

+{

+    mbtk_call_info_t *reg = (mbtk_call_info_t *)data;

+    switch (reg->call_wait)

+    {

+        case MBTK_CLCC:

+            {

+				LOGD("RING : %d, %d, %d, %d, %d, %s, %d, %d, end_reason:%s", reg->dir1, reg->dir, reg->state, reg->mode, reg->mpty, reg->phone_number, reg->type, reg->disconnected_id, reg->end_reason);

+                switch(reg->state)

+                {

+                    case 0:

+                        state_t = GSW_VOICE_CALL_CONNECTED;

+                        break;

+                    case 1:

+                        state_t = GSW_VOICE_CALL_HOLDING;

+                        break;

+                    case 2:

+                        state_t = GSW_VOICE_CALL_DIALING;

+                        break;

+                    case 3:

+                        state_t = GSW_VOICE_CALL_ALERTING;

+                        break;

+                    case 4:

+                        state_t = GSW_VOICE_CALL_INCOMING;

+                        break;

+                    case 5:

+                        state_t = GSW_VOICE_CALL_WAITING;

+                        break;

+                    case 6:

+                    {

+                        state_t = GSW_VOICE_CALL_END;

+                        call_id_t = reg->dir1;

+                        end_reason_mbtk_to_gsw((char *)reg->end_reason);

+                        break;

+                    }

+                        

+                }

+        

+                if(gsw_voice_callback)

+                {

+                    gsw_voice_callback(reg->dir1, state_t);

+                }

+

+            }

+			break;

+        case MBTK_DISCONNECTED:

+            {

+				LOGD("RING : call dis connected!");

+                LOGD("RING : %d, %d, %d, %d, %d, %s, %d, %d, end_reason:%s", reg->dir1, reg->dir, reg->state, reg->mode, reg->mpty, reg->phone_number, reg->type, reg->disconnected_id, reg->end_reason);

+				state_t = GSW_VOICE_CALL_END;

+                call_id_t = reg->dir1;

+                end_reason_mbtk_to_gsw((char *)reg->end_reason);

+				if(gsw_voice_callback)

+                {

+                    gsw_voice_callback(reg->disconnected_id, state_t);

+                }

+            }

+			break;

+        case MBTK_CPAS:

+            LOGD("CALL : Call state = %d", reg->pas);

+			switch (reg->pas)

+			{

+                case MBTK_CALL_RADY:

+                    LOGD("CALL: call READY");

+                    break;

+                case MBTK_CALL_UNAVAILABLE:

+                    LOGD("CALL: call unavaliable");

+                    break;

+                case MBTK_CALL_UNKNOWN:

+                    LOGD("CALL: call unknown");

+                    break;

+                case MBTK_CALL_RINGING:

+                    LOGD("CALL: call ringing");

+                    break;

+                case MBTK_CALL_PROGRESS:

+                    LOGD("CALL: call progress");

+                    break;

+                case MBTK_CALL_ASLEEP:

+                    LOGD("CALL: call asleep");

+                    break;

+                case MBTK_CALL_ACTIVE:

+                    LOGD("CALL: call active");

+                    break;

+                default:

+                    //LOGE("\r\n");

+                    break;

+			}

+            break;

+        default:

+            LOGE("RING : None call_wait = %d", reg->call_wait);

+            break;

+    }

+}

+

+

+/**

+* @brief init voice sdk,and  register the status indicated callback function

+* @param  [in] CallStateInd ind: status indicated callback function

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_sdk_init(CallStateInd ind)

+{

+    int ret;

+

+    if (gsw_voice_init_flag == 1 && call_info_handle != NULL)

+    {

+        return GSW_HAL_SUCCESS;

+    }

+

+    if(ind == NULL)

+    {

+        LOGE("parameter is null\n");

+        return GSW_HAL_MEM_INVAILD;

+    }

+

+    ret = mbtk_call_api_import();

+    if(ret != 0)

+    {

+        if(mbtk_log != NULL)

+        {

+            LOGE("[gsw_voice_sdk_init]mbtk_call_api_import fail\n");

+        }

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_log_init("syslog", "MBTK_RIL");

+

+    

+    if(ret < 0)

+    {

+        LOGE("mbtk_call_api_import fail,ret = %d\n",ret);

+        return GSW_HAL_FAIL;

+    }

+

+    ret=mbtk_rtp_init();

+

+    if(ret!=0)

+    {

+        LOGE("[gsw_voice_sdk_init]mbtk_rtp_init fail\n");        

+        return GSW_HAL_FAIL;        

+    }

+

+    if(call_info_handle == NULL)

+    {

+        call_info_handle = mbtk_info_handle_get();

+        if(call_info_handle != NULL)

+        {

+            LOGE("create gsw_voice_sdk_init success\n");

+            

+            ret = mbtk_call_state_change_cb_reg(call_info_handle, gsw_call_state_change_cb);

+            if(ret)

+            {

+                LOGE("mbtk_call_state_change_cb_reg fail,ret = %d\n",ret);

+                (void) mbtk_rtp_deinit();

+                return GSW_HAL_FAIL;

+            }

+            else

+            {

+                gsw_voice_init_flag = 1;

+                gsw_voice_callback = ind;

+                LOGE("create gsw_voice_sdk_init success\n");

+                return GSW_HAL_SUCCESS;

+            }

+

+        }

+

+        else

+        {

+           (void) mbtk_rtp_deinit();

+            LOGE("create gsw_voice_sdk_init fail\n");

+            return GSW_HAL_FAIL;

+        }

+    }    

+    

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+* @brief set speaker_volume

+* @param  [in] int32_t volume:1(Min)-7(Max)

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_set_speaker_volume(int32_t volume)

+{

+    //UNUSED(volume);

+    

+#if 0

+

+    if(volume < 0 || volume > 5)

+    {

+        level_call = 0;

+    }

+    else

+    {

+        //支持-36~12

+        switch(volume)

+        {

+            case 0 :

+            level_call = -20;

+            break;

+            case 1 :

+            level_call = -14;

+            break;

+            case 2 :

+            level_call = -8;

+            break;

+            case 3 :

+            level_call = 0;

+            break;

+            case 4 :

+            level_call = 5;

+            break;

+            case 5 :

+            level_call = 12;

+            break;

+            default:

+            break;

+        }

+    }

+

+    mbtk_audio_dsp_set(1, level_call);

+    if(err)

+    {

+        LOGE("Error : %d\n", err);

+        return -1;

+    }

+    else

+    {

+        LOGE("Set success.\n");

+    }

+#endif

+

+    char cmd[128] = {0};

+    int lv = 0;

+

+    memset(cmd ,0x00, sizeof(cmd));

+

+    if(volume < 1 || volume > 7)

+    {

+        LOGE("Error volume : %d", volume);

+        return GSW_HAL_FAIL;

+    }

+    else

+    {

+        switch(volume)

+        {

+            case 1 :

+                lv = -36;

+                break;

+            case 2 :

+                lv = -36;

+                break;

+            case 3 :

+                lv = -27;

+                break;

+            case 4 :

+                lv = -18;

+                break;

+            case 5 :

+                lv = -9;

+                break;

+            case 6 :

+                lv = 0;

+                break;

+            case 7:

+                lv = 12;

+                break;

+            default:

+                break;

+        }

+    }

+

+    sprintf(cmd, "ubus call audio_if config_dspgain \"{\'type\':%d,\'gain\':%d}\"", 1, lv);

+//    sLOGE(cmd, "ubus call audio_if volume_set \'{\"param0\":%d}\'", lv);

+    int err = system(cmd);

+    if ((err != -1) && (err != 127))

+    {

+        LOGE("Set success.");

+        level_call = volume;

+    }

+    else

+    {

+        LOGE("Error : %d", err);

+        return GSW_HAL_FAIL;

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+* @brief start a voice call

+* @param  [in] char *callNumber

+* @param  [out] CallHandle *handle

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_normal_voice_start(CallHandle *handle, const char *callNumber)

+{

+    if(gsw_voice_init_flag == 0)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    mbtk_call_info_t reg = {0};

+    int ret = -1;

+

+

+    if(handle == NULL)

+    {

+        LOGE("handle is null\n");

+        return GSW_HAL_MEM_INVAILD;

+    }

+

+    if(callNumber == NULL)

+    {

+        LOGE("callNumber is null\n");

+        return GSW_HAL_MEM_INVAILD;

+    }

+

+

+    ret = mbtk_call_start(call_info_handle, (char *)callNumber);

+

+    if(ret != 0)

+    {

+        LOGE("mbtk_call_start fail,ret = %d\n",ret);

+        return GSW_HAL_FAIL;

+    }

+

+    //get call id

+    mbtk_call_reg_get(call_info_handle, &reg);

+    LOGE("call id = %d\n",reg.dir1);

+    *handle = reg.dir1;

+    LOGE("gsw_voice_normal_voice_start id = %d\n", (int)*handle);

+

+

+    return GSW_HAL_SUCCESS;

+

+}

+

+/**

+* @brief answer a voice call

+* @param  [in] CallHandle handle

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_answer(CallHandle handle)

+{

+    if(gsw_voice_init_flag == 0)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    int ret = -1;

+

+

+    ret = mbtk_call_answer(call_info_handle);

+

+    if(ret != 0)

+    {

+        LOGE("mbtk_call_answer fail,ret = %d\n", ret);

+        return GSW_HAL_FAIL;

+    }

+    else

+    {

+        LOGE("mbtk_call_answer success\n");

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+

+/**

+* @brief hangup a voice call

+* @param  [in] CallHandle handle

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_hangup(CallHandle handle)

+{

+    if(gsw_voice_init_flag == 0)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    int ret = -1;

+

+    ret = mbtk_a_call_hang(call_info_handle,handle);

+

+    if(ret != 0)

+    {

+        LOGE("mbtk_a_call_hang fail,ret = %d\n", ret);

+        return GSW_HAL_FAIL;

+    }

+    else

+    {

+        LOGE("mbtk_a_call_hang success\n");

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+* @brief set auto answer mode

+* @param  [in] int32_t mode:0-1,  0:NO(close auto answer),  1:YES(auto answer)

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_set_auto_answer_mode(int32_t mode)

+{

+    if(gsw_voice_init_flag == 0)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    if(mode == 1)

+    {

+        int ret = -1;

+

+        ret = mbtk_call_answer(call_info_handle);

+        if(ret != 0)

+        {

+            LOGE("mbtk_call_answer fail,ret = %d\n", ret);

+            return GSW_HAL_FAIL;

+        }

+        else

+        {

+            LOGE("mbtk_call_answer success\n");

+        }

+    }

+

+    return GSW_HAL_SUCCESS;

+}

+

+int32_t gsw_voice_get_current_call_end_reason(CallHandle handle)

+{

+    if(gsw_voice_init_flag == 0 || call_info_handle == NULL)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    int reason = gsw_global_end_reason;

+

+    return reason;

+}

+

+

+

+/*##########################################rtp begin*/

+/**

+* @brief set audio mode

+* @param  [in] AudioMode audioMode

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_set_audio_mode(AudioMode audioMode)

+{

+    if(gsw_voice_init_flag == 0)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    int ret=mbtk_rtp_enable(audioMode);

+    if(ret !=0 )

+    {

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;  

+}

+

+/**

+* @brief set rtp ip address of remote

+* @param  [in] char *ip :ip address

+* @param  [in] int32_t len: length

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_set_remote_rtp_ip(const char *ip, int32_t len)

+{

+    if(gsw_voice_init_flag == 0)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    int ret=mbtk_rtp_remote_ip_set(ip);

+    if(ret !=0 )

+    {

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+* @brief set rtp mode and port

+* @param  [in] RTPMode rtpMode: rtp mode

+* @param  [in] int32_t port:rtp port

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_set_rtp_port(RTPMode rtpMode, int32_t port)

+{

+    if(gsw_voice_init_flag == 0)

+    {

+        return GSW_HAL_FAIL;

+    }

+

+    int ret;

+    if(rtpMode==GSW_RTP_CLIENT)

+    {      

+        ret = mbtk_rtp_client_port_set(port);

+    }

+    else

+    {

+        ret = mbtk_rtp_server_port_set(port);   

+    }

+    if(ret !=0 )

+    {

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+* @brief set rtp mode and port

+* @param  [in] int32_t clockRate: clock rate

+* @param  [in] int32_t channel:channel

+* @param  [in] int32_t latency:latency

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_set_rtp_param(int32_t clockRate, int32_t channel, int32_t latency)

+{

+    if(gsw_voice_init_flag == 0)

+    {

+       return GSW_HAL_FAIL;

+    }

+

+    int ret=mbtk_rtp_channel_set(channel);

+    if(ret==0)

+    {

+       ret=mbtk_rtp_sample_rate_set(clockRate);    

+    }

+    if(ret !=0 )

+    {

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;  

+}

+/*##########################################rtp end*/

+

diff --git a/mbtk/libgsw_lib/libgsw_ota.c b/mbtk/libgsw_lib/libgsw_ota.c
new file mode 100755
index 0000000..93d1a6a
--- /dev/null
+++ b/mbtk/libgsw_lib/libgsw_ota.c
@@ -0,0 +1,552 @@
+#include <stdlib.h>

+#include <stdio.h>

+#include <string.h>

+#include <sys/stat.h>

+#include <sys/types.h>

+#include <unistd.h>

+#include <dlfcn.h>

+#include <stdint.h>

+

+#include <errno.h>

+#include <stdbool.h>

+

+#include "gsw_ota.h"

+

+

+

+#define LYNQ_OTA_INPROCESS 3

+#define LYNQ_OTA_SUCCESS   4

+#define LYNQ_OTA_FAILED   5

+

+#ifndef LOG_ERR_LEVEL
+#define LOG_ERR_LEVEL  3      /* error conditions */
+#endif
+#ifndef LOG_WARN_LEVEL
+#define LOG_WARN_LEVEL 4   /* warning conditions */
+#endif
+#ifndef LOG_INFO_LEVEL
+#define LOG_INFO_LEVEL 6      /* informational */
+#endif
+#ifndef LOG_DEBUG_LEVEL
+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */
+#endif
+#ifndef LOG_VERBOSE_LEVEL
+#define LOG_VERBOSE_LEVEL 8
+#endif

+

+

+#define LIB_PATH "/lib/libmbtk_lib.so"

+

+

+#define StatFunc(x,y) stat(x,y)

+

+#define LOGV(fmt, args ...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)
+
+#define LOGI(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)
+
+#define LOGD(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)
+
+#define LOGW(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)
+
+#define LOGE(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+    

+

+

+typedef int  (*mbtk_fota_get_active_absys_type)(void);

+typedef int  (*mbtk_fota_fw_write)(char* fname, int segment_size);

+typedef int  (*mbtk_fota_fw_write_by_url)(char* url, int segment_size,

+                            int conn_timeout, int download_timeout);

+

+typedef int(*fota_callback)(int state, int percent);

+typedef int  (*mbtk_fota_init)(fota_callback cb);

+typedef int  (*mbtk_fota_status)(void);

+

+typedef void (*mbtk_log)(int level, const char *format,...);

+

+static int segment_size =0;

+static int Process_flag = 0;

+char  addr_buf[256] = {0};

+static void *handle = NULL;

+static mbtk_log fun_ptr_log = NULL;

+

+static int s_ota_flag = -1;

+

+int fota_cb(int status, int percent)

+{

+    Process_flag = percent;

+    return 0;

+}

+

+static int funstat(  char *filename)

+{
+    int ret = 0;
+    struct stat tmep_s;
+
+    memset(&tmep_s, 0, sizeof(stat));
+    ret = StatFunc(filename, &tmep_s);
+    
+    if (ret)
+    {
+        LOGE("stat %s failed! error_code: %s", filename ,strerror(errno));
+        return -1;
+    }
+
+    if (tmep_s.st_size > 0)
+    {
+        segment_size = tmep_s.st_size;
+    }
+
+    return 0;
+}

+

+int32_t init_handle()

+{

+    if(handle == NULL)

+    {

+        handle = dlopen(LIB_PATH, RTLD_NOW );

+        if(handle == NULL)

+        {

+            return GSW_HAL_FAIL;

+        }

+        if(fun_ptr_log == NULL)

+        {

+            fun_ptr_log = (mbtk_log)dlsym(handle, "mbtk_log");

+            if(fun_ptr_log ==  NULL)

+            {

+                return GSW_HAL_FAIL;

+            }

+        }

+       

+    }

+    

+

+    

+    return GSW_HAL_SUCCESS;

+}

+

+void deinit_handle()

+{

+    dlclose(handle);

+    handle = NULL;

+    fun_ptr_log = NULL;

+    

+}

+

+/**

+* @brief Start install modem software

+* @param  [in] char* file_path

+* @param  [out] NULL

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_start_autobackup(char* file_path)

+{

+

+    if(file_path == NULL)

+    {

+        LOGE("invalid file_path \n");

+        return GSW_HAL_FAIL;

+    }

+    

+    

+    mbtk_fota_fw_write func_ptr_update = NULL;

+    mbtk_fota_init func_ptr_init= NULL;

+    mbtk_fota_fw_write_by_url func_ptr_update_url = NULL;

+    

+    

+        

+    int ret = -1;

+    ret = init_handle();

+    if(ret < 0)

+    {

+        LOGE("init_handle fail");

+        return GSW_HAL_FAIL;

+    }

+    

+    func_ptr_update_url = (mbtk_fota_fw_write_by_url)dlsym(handle, "mbtk_fota_fw_write_by_url");

+    if(func_ptr_update_url == NULL)

+    {

+        LOGE("Error: %s", dlerror());

+        return GSW_HAL_FAIL;

+    }

+

+    

+    // Get the function pointer 

+    func_ptr_update = (mbtk_fota_fw_write)dlsym(handle, "mbtk_fota_fw_write");

+    if (func_ptr_update == NULL)

+     {

+        LOGE("Error: %s", dlerror());

+        deinit_handle();

+        return GSW_HAL_FAIL;

+    }

+    

+    func_ptr_init = (mbtk_fota_init)dlsym(handle, "mbtk_fota_init");

+    if(func_ptr_init == NULL)

+     {

+        LOGE("Error: %s", dlerror());

+        deinit_handle();

+        return GSW_HAL_FAIL;

+    }

+    

+

+    if(s_ota_flag == -1)

+    {

+        ret = func_ptr_init(fota_cb);

+        if(ret < 0)

+        {

+            LOGE("Error: mbtk_fota_init failed");

+        

+            deinit_handle();

+            return GSW_HAL_FAIL;

+        }

+        else

+        {

+            s_ota_flag = 0;

+        }

+    }

+

+    if(strncmp(file_path, "http", 4) == 0)

+    {

+        segment_size = 62914560;

+        ret = func_ptr_update_url(file_path, segment_size,10, 600);

+    }

+    else

+    {

+        if(strstr(file_path,"updata.bin") == NULL)

+        {

+            LOGE("Bad file path ");

+            deinit_handle();

+            return GSW_HAL_FAIL;

+        }

+        else

+        {

+            if(access(file_path,F_OK) !=0)

+            {

+                LOGE("update  file no exist");

+                deinit_handle();

+                return GSW_HAL_FAIL;

+            }

+        }

+            

+        ret = funstat(file_path);

+        if (ret)
+        {
+            LOGE("get segment_size fail");

+            deinit_handle();

+            return GSW_HAL_FAIL;  

+        }

+        ret = func_ptr_update(file_path, segment_size);

+        if(ret < 0)

+        {

+            LOGE("Error: mbtk_fota_fw_write failed\n");

+            deinit_handle();

+            return GSW_HAL_FAIL;

+        }

+     }

+    return GSW_HAL_SUCCESS;

+

+}

+

+/**

+* @brief check the modem update condition

+* @param  [in] NULL

+* @param  [out] NULL

+* @retval TRUE/FALSE

+*/

+bool gsw_update_modem_check_condition(void)

+{

+    char command[32] = {0};

+    char buffer[64] = {0};

+    const char *process_ota = "{otad}";

+

+    snprintf(command,sizeof(command), "ps | grep %s | grep -v grep", process_ota);

+    FILE *fp = popen(command, "r");

+    if (fp == NULL) 

+    {

+        return false;

+    }

+    

+    if(fgets(buffer, sizeof(buffer), fp)!= NULL)

+    {

+        pclose(fp);

+        return true;

+    }

+    pclose(fp);

+    return false;

+

+}

+

+/**

+* @brief get update modem result

+* @param  [in] NULL

+* @param  [out] NULL

+* @retval E_GSW_OTA_RET

+*/

+E_GSW_OTA_RET gsw_update_modem_result_query(void)

+{   

+   

+    mbtk_fota_status func_ptr_get_result = NULL;

+    int ret = -1;

+    

+    ret = init_handle();

+    if(ret < 0)

+    {

+        LOGE("init_handle fail");

+        return GSW_HAL_FAIL;

+    }

+    

+    // Get the function pointer 

+    func_ptr_get_result = (mbtk_fota_status)dlsym(handle, "mbtk_fota_status");

+    if (func_ptr_get_result == NULL)

+     {

+        LOGE("Error: %s\n", dlerror());

+        return GSW_HAL_FAIL;

+    }

+    ret = func_ptr_get_result();

+    if(ret < 0 && ret !=-1)

+    {

+        LOGE("Error: mbtk_fota_status failed\n");

+        deinit_handle();

+        return GSW_HAL_FAIL;

+    }

+

+    deinit_handle();

+    

+    if(ret == LYNQ_OTA_INPROCESS)

+    {

+        return GSW_OTA_INPROCESS;

+

+    }

+    else if(ret == LYNQ_OTA_SUCCESS)

+    {

+        return GSW_OTA_SUCCESS;

+    }

+    else if(ret == -1)

+    {

+        return GSW_OTA_NO_TASK;

+    }

+    

+    return GSW_OTA_FAILURE;

+    

+    

+}

+

+/**

+* @brief Start install modem software

+* @param  [in] char* file_path

+* @param  [out] NULL

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_start_nobackup(char* file_path)

+{

+    

+    return GSW_HAL_SUCCESS;

+}

+

+

+/**

+* @brief get current system

+* @param  [in] NULL

+* @param  [out] NULL

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+E_GSW_OTA_SYSTEM gsw_update_modem_get_system(void)

+{

+    int ret = -1;

+   

+    mbtk_fota_get_active_absys_type func_ptr;

+    ret = init_handle();

+    if(ret < 0)

+    {

+        LOGE("init_handle fail");

+        return GSW_HAL_FAIL;

+    }

+

+    // Get the function pointer 

+    func_ptr = (mbtk_fota_get_active_absys_type)dlsym(handle, "mbtk_fota_get_active_absys_type");

+    if (func_ptr == NULL)

+     {

+        LOGE("Error: %s", dlerror());

+        return GSW_HAL_FAIL;

+    }

+    ret = func_ptr();

+    if(ret < 0)

+    {

+        LOGE("Error: mbtk_fota_get_active_absys_type failed");

+        deinit_handle();

+        return GSW_HAL_FAIL;

+

+    }

+    

+    deinit_handle();

+    

+    return ret;

+

+}

+

+/**

+* @brief cancel update

+* @param  [in] NULL

+* @param  [out] NULL

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_cancel(void)

+{

+    

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+* @brief get modem update info

+* @param  [in] NULL

+* @param  [out] gsw_update_info_s 

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_get_info(gsw_update_info_s *update_info)

+{

+    int ret = -1;

+        

+    mbtk_fota_status     func_ptr_get_info = NULL;

+    

+    ret = init_handle();

+    if(ret < 0)

+    {

+        LOGE("init_handle fail");

+        return GSW_HAL_FAIL;

+    }

+    

+    // Get the function pointer 

+    func_ptr_get_info = (mbtk_fota_status)dlsym(handle, "mbtk_fota_status");

+    if (func_ptr_get_info == NULL)

+     {

+        LOGE("Error: %s\n", dlerror());

+        return GSW_HAL_FAIL;

+    }

+    ret = func_ptr_get_info();

+    if(ret < 0 &&  ret != -1)

+    {

+        LOGE("Error: mbtk_fota_status failed\n");

+        deinit_handle();

+        return GSW_HAL_FAIL;

+    }

+

+    //升级成功之后,未重启,不可重复升级

+    if(ret == LYNQ_OTA_INPROCESS)

+    {

+        update_info->exit_code = GSW_UPDATE_NOGOING;

+        update_info->percentage = Process_flag;

+        update_info->update_state = GSW_UPDATE_INPROGRESS;

+    }

+    if(ret == LYNQ_OTA_SUCCESS)

+    {

+        update_info->exit_code = GSW_UPDATE_NOERROR;

+        update_info->percentage = Process_flag;

+        update_info->update_state = GSW_UPDATE_WAITEDONE;

+    }

+

+    

+    if(ret == LYNQ_OTA_FAILED || ret == -1)

+    {

+        update_info->exit_code = GSW_UPDATE_GETOLDSOFTWAREFAILED;

+        update_info->percentage = Process_flag;

+        update_info->update_state = GSW_UPDATE_FAILED;

+    }

+    

+    deinit_handle();

+    return GSW_HAL_SUCCESS;

+

+}

+

+

+/**

+* @brief get modem system status

+* @param  [in] NULL

+* @param  [out] gsw_system_status_s 

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_get_status(gsw_system_status_s *system_status)

+{

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+* @brief A/B system sync

+* @param  [in] NULL

+* @param  [out] NULL 

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_sync(void)

+{

+    return GSW_HAL_SUCCESS;

+

+}

+

+/**

+* @brief A/B system switch

+* @param  [in] NULL

+* @param  [out] NULL 

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_switch(void)

+{

+    return GSW_HAL_SUCCESS;

+}

diff --git a/mbtk/libgsw_lib/libgsw_passwd.c b/mbtk/libgsw_lib/libgsw_passwd.c
new file mode 100755
index 0000000..ef3fdda
--- /dev/null
+++ b/mbtk/libgsw_lib/libgsw_passwd.c
@@ -0,0 +1,29 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <errno.h>
+#include <termios.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <sys/ioctl.h>
+#include <dlfcn.h>
+
+
+#include "gsw_passwd.h"
+
+
+int gsw_set_passwd(char *username, char *passwd)
+{
+    int ret;
+    char cmd[256];
+    if((username == NULL) || (passwd ==NULL))
+    {
+        return -1;
+    }
+    sprintf(cmd, "echo \"%s:%s\"|chpasswd", username, passwd);
+    ret = system(cmd);
+    return ret;
+}
diff --git a/mbtk/libgsw_lib/libgsw_usb.c b/mbtk/libgsw_lib/libgsw_usb.c
new file mode 100755
index 0000000..400fcb2
--- /dev/null
+++ b/mbtk/libgsw_lib/libgsw_usb.c
@@ -0,0 +1,41 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <errno.h>
+#include <termios.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <sys/ioctl.h>
+#include <dlfcn.h>
+
+
+#include "gsw_usb.h"
+
+#define TMP_USB_RESTART "/sbin/tmp_usb_init"
+#define USB_OPEN 3300
+#define USB_CLOSE 3329
+
+int32_t gsw_usb_permanent_switch(EN_GSW_USB_SWITCH_TYPE type)
+{
+    int ret;
+    char cmd[256];
+    if(type != EN_GSW_USB_SWITCH_OPEN && type != EN_GSW_USB_SWITCH_CLOSE)
+        return GSW_HAL_FAIL;
+    sprintf(cmd, "setprop persist.mbtk.usb_pid %d && %s %d &", type?USB_OPEN:USB_CLOSE, TMP_USB_RESTART, type?USB_OPEN:USB_CLOSE);
+    ret = system(cmd);
+    return ret;
+}
+
+int32_t gsw_usb_tempporary_switch(EN_GSW_USB_SWITCH_TYPE type)
+{
+    int ret;
+    char cmd[256];
+    if(type != EN_GSW_USB_SWITCH_OPEN && type != EN_GSW_USB_SWITCH_CLOSE)
+        return GSW_HAL_FAIL;
+    sprintf(cmd, "%s %d &", TMP_USB_RESTART, type?USB_OPEN:USB_CLOSE);
+    ret = system(cmd);
+    return ret;
+}
\ No newline at end of file