Add mbtk ecall v1 API.

Change-Id: Icfdb8ccf399a4e052484f6419e44755780c04725
diff --git a/mbtk/include/mbtk/mbtk_info_api.h b/mbtk/include/mbtk/mbtk_info_api.h
index 3877e54..627f3ab 100755
--- a/mbtk/include/mbtk/mbtk_info_api.h
+++ b/mbtk/include/mbtk/mbtk_info_api.h
@@ -20,6 +20,9 @@
 // LOG_DEBUG_LEVEL 7

 #define LOG LOGI

 

+#define RIL_MAX_NUMBER_LEN 40

+#define MBTK_ECALL_MSD_LEN_MAX      600

+

 #define CELL_NUM_MAX 50

 #define APN_STR_MAX 128

 #if (defined(MBTK_AF_SUPPORT) || defined(MBTK_ALL_CID_SUPPORT))

@@ -525,10 +528,10 @@
 #endif

 } mbtk_apn_auth_proto_enum;

 

-typedef struct

-{

-    uint8 urc_id;

-    uint8 urc_data[5];

+typedef struct
+{
+    uint8 urc_id;
+    uint8 urc_data[5];
 } mbtk_ril_ecall_state_info_t;

 

 typedef struct {

@@ -546,6 +549,110 @@
 } mbtk_qser_apn_info_s;

 /**************qser data_call*****************/

 

+
+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 struct
+{
+    mbtk_ecall_msd_item_enum item_type;
+
+    uint8 data[64];
+} mbtk_ecall_msd_cfg_info_t;

+

+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 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_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 enum {
+    MBTK_ECALL_MODE_TYPE_EU = 0,
+    MBTK_ECALL_MODE_TYPE_ERA
+} mbtk_ecall_mode_type_enum;
+
+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 struct {
+    mbtk_ecall_cfg_item_enum type;
+

+    uint32 data;
+} mbtk_ecall_cfg_info_t;
+
+typedef enum {
+    MBTK_ECALL_GAIN_MODE_TX = 0,
+    MBTK_ECALL_GAIN_MODE_RX,
+    MBTK_ECALL_GAIN_MODE_SIDETONE
+} mbtk_ecall_gain_mode_enum;
+
+typedef struct {
+    mbtk_ecall_gain_mode_enum mode;
+
+    int8 gain;
+} mbtk_ecall_gain_info_t;

+

+

+

+

 mbtk_info_handle_t* mbtk_info_handle_get();

 

 int mbtk_info_handle_free(mbtk_info_handle_t** handle);

diff --git a/mbtk/libmbtk_lib/ril/mbtk_info.h b/mbtk/libmbtk_lib/ril/mbtk_info.h
index d51ed69..462e2b9 100755
--- a/mbtk/libmbtk_lib/ril/mbtk_info.h
+++ b/mbtk/libmbtk_lib/ril/mbtk_info.h
@@ -254,6 +254,47 @@
     MBTK_INFO_ID_LED_RSP,
     MBTK_INFO_ID_LED_END,
 
+    // Ecall
+    RIL_MSG_ID_ECALL_BEGIN = 9000,
+    // mbtk_ecall_msd_cfg_info_t
+    RIL_MSG_ID_ECALL_MSDCFG_REQ,
+    RIL_MSG_ID_ECALL_MSDCFG_RSP,
+    // NULL
+    RIL_MSG_ID_ECALL_MSDGEN_REQ,
+    RIL_MSG_ID_ECALL_MSDGEN_RSP,
+    // uint8[]
+    RIL_MSG_ID_ECALL_MSD_REQ,
+    RIL_MSG_ID_ECALL_MSD_RSP,
+    // NULL
+    RIL_MSG_ID_ECALL_PUSH_REQ,
+    RIL_MSG_ID_ECALL_PUSH_RSP,
+    // mbtk_ecall_only_info_t
+    RIL_MSG_ID_ECALL_ONLY_REQ,
+    RIL_MSG_ID_ECALL_ONLY_RSP,
+    // reg <uint8>
+    RIL_MSG_ID_ECALL_REG_REQ,
+    RIL_MSG_ID_ECALL_REG_RSP,
+    // mbtk_ecall_dial_type_enum
+    RIL_MSG_ID_ECALL_DIAL_REQ,
+    RIL_MSG_ID_ECALL_DIAL_RSP,
+    // mbtk_ecall_mode_type_enum
+    RIL_MSG_ID_ECALL_MODE_REQ,
+    RIL_MSG_ID_ECALL_MODE_RSP,
+    // mbtk_ecall_cfg_item_enum / mbtk_ecall_cfg_info_t
+    RIL_MSG_ID_ECALL_CFG_REQ,
+    RIL_MSG_ID_ECALL_CFG_RSP,
+    // uint8[]
+    RIL_MSG_ID_ECALL_SMS_NUM_REQ,
+    RIL_MSG_ID_ECALL_SMS_NUM_RSP,
+    // uint8
+    RIL_MSG_ID_ECALL_MUTESPK_REQ,
+    RIL_MSG_ID_ECALL_MUTESPK_RSP,
+    // mbtk_ecall_gain_info_t
+    RIL_MSG_ID_ECALL_DSP_GAIN_REQ,
+    RIL_MSG_ID_ECALL_DSP_GAIN_RSP,
+
+    RIL_MSG_ID_ECALL_END,
+
     // IND Information
     MBTK_INFO_ID_IND_BEGIN = 10000,
     // <uint8>  State
diff --git a/mbtk/libmbtk_lib/ril/mbtk_info_api.c b/mbtk/libmbtk_lib/ril/mbtk_info_api.c
index 222bcf1..b751aa6 100755
--- a/mbtk/libmbtk_lib/ril/mbtk_info_api.c
+++ b/mbtk/libmbtk_lib/ril/mbtk_info_api.c
@@ -2490,6 +2490,415 @@
     return info_item_process(handle, MBTK_INFO_ID_LED_REQ, buff, 2, NULL) ? handle->info_err : 0;
 }
 
+
+/*
+* Set msd item.
+*
+*/
+int mbtk_ecall_msd_item_set(mbtk_info_handle_t* handle, const mbtk_ecall_msd_cfg_info_t *msd_cfg)
+{
+    if(handle == NULL)
+    {
+        return -1;
+    }
+
+    if(msd_cfg == NULL)
+    {
+        LOGE("ARG error.");
+        return -1;
+    }
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_MSDCFG_REQ, msd_cfg, sizeof(mbtk_ecall_msd_cfg_info_t), NULL) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+/*
+* Generate msd after msd item set.
+*
+*/
+int mbtk_ecall_msd_gen(mbtk_info_handle_t* handle)
+{
+    if(handle == NULL)
+    {
+        return -1;
+    }
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_MSDGEN_REQ, NULL, 0, NULL) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+/*
+* Set ecall msd.
+*
+*/
+int mbtk_ecall_msd_set(mbtk_info_handle_t* handle, const void* msd)
+{
+    if(handle == NULL || str_empty(msd))
+    {
+        LOGE("ARG error.");
+        return -1;
+    }
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_MSD_REQ, msd, strlen(msd), NULL) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+/*
+* Get ecall msd.
+*
+*/
+int mbtk_ecall_msd_get(mbtk_info_handle_t* handle, void* msd)
+{
+    if(!handle)
+    {
+        return -1;
+    }
+
+    if(msd == NULL)
+    {
+        LOGE("ARG error.");
+        return -1;
+    }
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_MSD_REQ, NULL, 0, msd) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+
+/*
+* Set ecall msd item.
+*
+*/
+int mbtk_ecall_push(mbtk_info_handle_t* handle)
+{
+    if(!handle)
+    {
+        return -1;
+    }
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_PUSH_REQ, NULL, 0, NULL) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+/*
+* Set ecall only configs.
+*
+*/
+int mbtk_ecall_only_set(mbtk_info_handle_t* handle, const mbtk_ecall_only_info_t* info)
+{
+    if(!handle)
+    {
+        return -1;
+    }
+
+    if(info == NULL)
+    {
+        LOGE("ARG error.");
+        return -1;
+    }
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_ONLY_REQ, info, sizeof(mbtk_ecall_only_info_t), NULL) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+/*
+* Get ecall only configs.
+*
+*/
+int mbtk_ecall_only_get(mbtk_info_handle_t* handle, mbtk_ecall_only_info_t* info)
+{
+    if(!handle)
+    {
+        return -1;
+    }
+
+    if(info == NULL)
+    {
+        LOGE("ARG error.");
+        return -1;
+    }
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_ONLY_REQ, NULL, 0, info) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+/*
+* Set ecall network reg.
+*
+*/
+int mbtk_ecall_reg_set(mbtk_info_handle_t* handle, int reg)
+{
+    if(!handle)
+    {
+        return -1;
+    }
+
+    if(reg != 0 && reg != 1)
+    {
+        LOGE("ARG error.");
+        return -1;
+    }
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_REG_REQ, &reg, 1, NULL) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+/*
+* Start ecall dial start.
+*
+*/
+int mbtk_ecall_dial_start(mbtk_info_handle_t* handle, mbtk_ecall_dial_type_enum type)
+{
+    if(!handle)
+    {
+        return -1;
+    }
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_DIAL_REQ, &type, 1, NULL) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+/*
+* Get ecall dial state.
+*
+*/
+int mbtk_ecall_dial_state_get(mbtk_info_handle_t* handle, mbtk_ecall_dial_type_enum* type)
+{
+    if(!handle)
+    {
+        return -1;
+    }
+
+    if(type == NULL)
+    {
+        LOGE("ARG error.");
+        return -1;
+    }
+    memset(type, 0, sizeof(mbtk_ecall_dial_type_enum));
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_DIAL_REQ, NULL, 0, type) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+/*
+* Set ecall mode.
+*
+*/
+int mbtk_ecall_mode_set(mbtk_info_handle_t* handle, mbtk_ecall_mode_type_enum mode)
+{
+    if(handle == NULL)
+    {
+        return -1;
+    }
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_MODE_REQ, &mode, 1, NULL) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+/*
+* Get ecall mode.
+*
+*/
+int mbtk_ecall_mode_get(mbtk_info_handle_t* handle, mbtk_ecall_mode_type_enum *mode)
+{
+    if(handle == NULL)
+    {
+        return -1;
+    }
+
+    if(mode == NULL)
+    {
+        LOGE("ARG error.");
+        return -1;
+    }
+    memset(mode, 0, sizeof(mbtk_ecall_mode_type_enum));
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_MODE_REQ, NULL, 0, mode) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+/*
+* Set ecall configs.
+*
+*/
+int mbtk_ecall_cfg_set(mbtk_info_handle_t* handle, const mbtk_ecall_cfg_info_t *cfg)
+{
+    if(handle == NULL)
+    {
+        return -1;
+    }
+
+    if(cfg == NULL || cfg->type >= MBTK_ECALL_CFG_ITEM_MAX)
+    {
+        LOGE("ARG error.");
+        return -1;
+    }
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_CFG_REQ, cfg, sizeof(mbtk_ecall_cfg_info_t), NULL) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+/*
+* Get ecall configs.
+*
+*/
+int mbtk_ecall_cfg_get(mbtk_info_handle_t* handle, mbtk_ecall_cfg_info_t* cfg)
+{
+    if(handle == NULL)
+    {
+        return -1;
+    }
+
+    if(cfg == NULL || cfg->type >= MBTK_ECALL_CFG_ITEM_MAX)
+    {
+        LOGE("ARG error.");
+        return -1;
+    }
+    mbtk_ecall_cfg_item_enum type = cfg->type;
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_CFG_REQ, &type, 1, cfg) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+/*
+* Set ecall sms number.
+*
+*/
+int mbtk_ecall_sms_number_set(mbtk_info_handle_t* handle, const void *number)
+{
+    if(handle == NULL)
+    {
+        return -1;
+    }
+
+    if(str_empty(number))
+    {
+        LOGE("ARG error.");
+        return -1;
+    }
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_SMS_NUM_REQ, number, strlen(number), NULL) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+/*
+* Get ecall sms number.
+*
+*/
+int mbtk_ecall_sms_number_get(mbtk_info_handle_t* handle, void *number)
+{
+    if(handle == NULL)
+    {
+        return -1;
+    }
+
+    if(number == NULL)
+    {
+        LOGE("ARG error.");
+        return -1;
+    }
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_SMS_NUM_REQ, NULL, 0, number) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+/*
+* Set ecall mute speaker.
+*
+*/
+int mbtk_ecall_mute_spk_set(mbtk_info_handle_t* handle, int mute)
+{
+    if(handle == NULL)
+    {
+        return -1;
+    }
+
+    if(mute != 0 && mute != 1)
+    {
+        LOGE("ARG error.");
+        return -1;
+    }
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_MUTESPK_REQ, &mute, 1, NULL) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+/*
+* Set ecall dsp gain.
+*
+*/
+int mbtk_ecall_dsp_gain_set(mbtk_info_handle_t* handle, const mbtk_ecall_gain_info_t *gain_info)
+{
+    if(handle == NULL)
+    {
+        return -1;
+    }
+
+    if(gain_info == NULL)
+    {
+        LOGE("ARG error.");
+        return -1;
+    }
+
+    if(info_item_process(handle, RIL_MSG_ID_ECALL_DSP_GAIN_REQ, gain_info, sizeof(mbtk_ecall_gain_info_t), NULL) >= 0) {
+        return 0;
+    } else {
+        return handle->info_err;
+    }
+}
+
+
 /*
 * Set pdp state change callback function.
 */
diff --git a/mbtk/libmbtk_lib_v2/ril/mbtk_pdu_sms.c b/mbtk/libmbtk_lib_v2/ril/mbtk_pdu_sms.c
index 5825cb6..05da8a8 100755
--- a/mbtk/libmbtk_lib_v2/ril/mbtk_pdu_sms.c
+++ b/mbtk/libmbtk_lib_v2/ril/mbtk_pdu_sms.c
@@ -842,7 +842,7 @@
     }

     char *result, *buf;

     int len = strlen(DA);

-    int index;

+    int index = 0;

 

     result = (char *) malloc(sizeof(char) * (len + 5));

     buf = result;

diff --git a/mbtk/libmbtk_lib_v2/wifi/sta_cli.c b/mbtk/libmbtk_lib_v2/wifi/sta_cli.c
index 316d70f..0cf37fd 100755
--- a/mbtk/libmbtk_lib_v2/wifi/sta_cli.c
+++ b/mbtk/libmbtk_lib_v2/wifi/sta_cli.c
@@ -16,6 +16,8 @@
 

 #include "sta_cli.h"

 #include "sta_ctrl.h"

+#include "mbtk_log.h"

+

 //#include "sta_log.h"

 //#include "mbtk_string.h"

 

@@ -83,14 +85,14 @@
         fgets(ssid,200,fd_tmp); 

         pclose(fd_tmp);

         if(strlen(ssid) > 0){

-           printf("test 100:%s, len:%d\n", ssid, strlen(ssid));

+           LOGE("test 100:%s, len:%d\n", ssid, strlen(ssid));

             

         }else{// Open wpa_supplicant

-            printf("test 101:%s\n", ssid);

+            LOGE("test 101:%s\n", ssid);

         }

     }else{

        

-            printf("test 102:%s\n");

+            LOGE("test 102:%s\n");

     }

 

     return 0;

@@ -107,20 +109,47 @@
         fgets(psk,200,fd_tmp);

         pclose(fd_tmp);

         if(strlen(psk) > 0){

-           printf("test 100:%s\n", psk);

+           LOGE("test 100:%s\n", psk);

             

         }else{// Open wpa_supplicant

-            printf("test 101:%s\n", psk);

+            LOGE("test 101:%s\n", psk);

         }

     }else{

        

-            printf("test 102:%s\n");

+            LOGE("test 102:%s\n");

     }

 

     return 0;

 }

 

 

+int sta_cli_ssid_set(char *ssid)

+{

+

+    char buf[100] = {0};

+    snprintf(buf, 100, "sed -i 's/SSID=.*$/SSID=%s/g' /etc/wifi/sta_network.conf", ssid);

+    LOGE("set ssid:%s", buf);

+    system(buf);

+    

+    

+    return 0;

+}

+

+int sta_cli_psk_set(char *psk)

+{

+

+    char buf[100] = {0};

+    snprintf(buf, 100, "sed -i 's/PASSWORD=.*$/PASSWORD=%s/g' /etc/wifi/sta_network.conf", psk);

+    LOGE("set ssid:%s", buf);

+    system(buf);

+    

+    

+    return 0;

+}

+

+

+

+

 

 static char*

 sta_cli_ssid_process

@@ -135,7 +164,7 @@
     int i;

     for (i = 0; i < strlen(ssid); i++){

         if (!isascii(ssid[i])){

-            //printf("0x%02x\n",(unsigned char)ssid[i]);

+            //LOGE("0x%02x\n",(unsigned char)ssid[i]);

             //return 0;

             ascii = 0;

             break;

@@ -149,7 +178,7 @@
     }else{

 		int pos = 0;

         for (i = 0; i < strlen(ssid); i++){

-            printf("0x%02x\n",(unsigned char)ssid[i]);

+            LOGE("0x%02x\n",(unsigned char)ssid[i]);

         	snprintf(result + pos,len - pos,

                 "%02x",(unsigned char)ssid[i]);

 			pos += 2;

@@ -173,13 +202,13 @@
 

     if((sock=socket(AF_INET,SOCK_STREAM,0))<0)

     {

-        printf("socket:errno(%d)\n",errno);

+        LOGE("socket:errno(%d)\n",errno);

         return NULL;

     }

     strcpy(ifreq.ifr_name,ifname);

     if(ioctl(sock,SIOCGIFHWADDR,&ifreq) <0)

     {

-		printf("ioctl:errno(%d)\n",errno);

+		LOGE("ioctl:errno(%d)\n",errno);

         return NULL;

     }

     snprintf(mac,mac_len,

@@ -268,12 +297,12 @@
     buf[len] = '\0';

     if(sta_cli_conn_fd != -1){

         if(write(sta_cli_conn_fd,buf,len) != len){

-            printf("Send open msg to client fail.\n");

+            LOGE("Send open msg to client fail.\n");

         }else{

-            printf("Send open msg to client success.\n");

+            LOGE("Send open msg to client success.\n");

         }

     }else{

-        printf("No client connected.\n");

+        LOGE("No client connected.\n");

     }

 	sta_should_send_connected_msg = FALSE;

 }

@@ -285,16 +314,16 @@
     char *msg

 )

 {

-    printf("cmd_id = %d,[%s]\n",sta_cli_cmd_id,msg);

+    LOGE("cmd_id = %d,[%s]\n",sta_cli_cmd_id,msg);

 

 //    if(sta_cli_conn_fd != -1){

 //        if(write(sta_cli_conn_fd,msg,strlen(msg)) != strlen(msg)){

-//            printf("Send msg to client fail.\n");

+//            LOGE("Send msg to client fail.\n");

 //        }else{

-//            printf("Send msg to client success.\n");

+//            LOGE("Send msg to client success.\n");

 //        }

 //    }else{

-//        printf("No client connected.\n");

+//        LOGE("No client connected.\n");

 //    }

 

 	// Send msg(CMD_OPEN_SUCCESS) to wifi_server.

@@ -321,12 +350,12 @@
             if(sta_cli_conn_fd != -1){

 				usleep(500);

                 if(write(sta_cli_conn_fd,buf,len) != len){

-                    printf("Send msg to client fail.\n");

+                    LOGE("Send msg to client fail.\n");

                 }else{

-                    printf("Send msg to client success.\n");

+                    LOGE("Send msg to client success.\n");

                 }

             }else{

-                printf("No client connected.\n");

+                LOGE("No client connected.\n");

             }

         }

         return;

@@ -346,12 +375,12 @@
 	        buf[len] = '\0';

 	        if(sta_cli_conn_fd != -1){

 	            if(write(sta_cli_conn_fd,buf,len) != len){

-	                printf("Send msg to client fail.\n");

+	                LOGE("Send msg to client fail.\n");

 	            }else{

-	                printf("Send msg to client success.\n");

+	                LOGE("Send msg to client success.\n");

 	            }

 	        }else{

-	            printf("No client connected.\n");

+	            LOGE("No client connected.\n");

 	        }

 			//sta_connected = FALSE;

 			//pthread_mutex_unlock(&sta_mutex);

@@ -371,7 +400,7 @@
         case CMD_ID_SCAN:

         {

             if(str_contains(msg, "CTRL-EVENT-SCAN-RESULTS")){

-                printf("Start resume thread.\n");

+                LOGE("Start resume thread.\n");

                 pthread_mutex_lock(&mutex);

                 pthread_cond_signal(&cond);

                 //pthread_cond_broadcast(&cond);

@@ -380,7 +409,7 @@
             break;

         }

         default:

-            printf("cmd_id[%d] unknown.\n",sta_cli_cmd_id);

+            LOGE("cmd_id[%d] unknown.\n",sta_cli_cmd_id);

             break;

     }

 }

@@ -394,14 +423,14 @@
     struct timeval now_1;

     struct timespec outtime;

     int thread_id = pthread_self();

-    printf("Thread(%ld) pause.\n",thread_id);

+    LOGE("Thread(%ld) pause.\n",thread_id);

     pthread_mutex_lock(&mutex);

     gettimeofday(&now_1, NULL);

     outtime.tv_sec = now_1.tv_sec + time / 1000;

     outtime.tv_nsec = now_1.tv_usec * 1000;

     pthread_cond_timedwait(&cond, &mutex, &outtime);

     pthread_mutex_unlock(&mutex);

-    printf("Thread(%ld) resume.\n",thread_id);

+    LOGE("Thread(%ld) resume.\n",thread_id);

 }

 

 static bool

@@ -451,7 +480,7 @@
 )

 {

 	char *data_base = data;

-    printf("SCAN:\n%s\n",reply);

+    LOGE("SCAN:\n%s\n",reply);

     bzero(data,len);

     const char *ptr = reply;

     bool start = FALSE;

@@ -488,7 +517,7 @@
         }

     }

 

-    printf("SCAN 0:\n%s\n",data_base);

+    LOGE("SCAN 0:\n%s\n",data_base);

 

 	// Delete empty ssid line.

 	char *tmp = (char*)calloc(len,1);

@@ -497,16 +526,16 @@
 

 	char *ptr_pre = tmp;

 	ptr = strstr(ptr_pre,"\r\n");

-	printf("line:%s\n",ptr == NULL?"NULL":ptr);

+	LOGE("line:%s\n",ptr == NULL?"NULL":ptr);

 	char ssid[STA_BUF_SIZE] = {0};

 	char *p;

 	while(ptr)

 	{

-		printf("Get line.\n");

+		LOGE("Get line.\n");

 		// Get ssid.

 		if(*(ptr - 1) == ',') // No ssid

 		{

-			printf("Delete one line.\n");

+			LOGE("Delete one line.\n");

 		}else{

 			char s[STA_BUF_SIZE] = {0};

 			p = ptr - 1;

@@ -516,10 +545,10 @@
 			}

 			p += 2;

 			memcpy(s,p,len);

-			printf("ssid = %s;s = %s\n",ssid,s);

+			LOGE("ssid = %s;s = %s\n",ssid,s);

 			if(str_contains(ssid,s))

 			{

-				printf("Jump the same ssid:%s\n",s);

+				LOGE("Jump the same ssid:%s\n",s);

 				ptr_pre = ptr + 2;

 				ptr = strstr(ptr_pre,"\r\n");

 				continue;

@@ -531,18 +560,18 @@
 			memcpy(ssid + strlen(ssid),s,len);

 

 			memcpy(data_base + strlen(data_base),ptr_pre,ptr + 2 - ptr_pre);

-			printf("Copy ssid:\"%s\"\n",s);

+			LOGE("Copy ssid:\"%s\"\n",s);

 		}

 		ptr_pre = ptr + 2;

 		ptr = strstr(ptr_pre,"\r\n");

 	}

 

-	printf("Scan parse end.\n");

+	LOGE("Scan parse end.\n");

 

 	free(tmp);

 	tmp = NULL;

 

-	printf("SCAN 1:\n%s\n",data_base);

+	LOGE("SCAN 1:\n%s\n",data_base);

 

     return STA_ERR_SUCCESS;

 }

@@ -555,7 +584,7 @@
     size_t data_len

 )

 {

-    printf("STATUS:\n%s\n",reply);

+    LOGE("STATUS:\n%s\n",reply);

 

     bzero(data,data_len);

 

@@ -597,7 +626,7 @@
 		}else{

 			memcpy(data + len,",",1);

 			len += 1;

-			printf("Not get own MAC address.\n");

+			LOGE("Not get own MAC address.\n");

 		}

 

 		// net_id

@@ -612,7 +641,7 @@
 		}else{

 			memcpy(data + len,",",1);

 			len += 1;

-			printf("Not get net id.\n");

+			LOGE("Not get net id.\n");

 		}

 

 		// ssid

@@ -627,7 +656,7 @@
 		}else{

 			memcpy(data + len,",",1);

 			len += 1;

-			printf("Not get ssid.\n");

+			LOGE("Not get ssid.\n");

 		}

 

 		// freq

@@ -644,7 +673,7 @@
 		}else{

 			memcpy(data + len,",",1);

 			len += 1;

-			printf("Not get freq.\n");

+			LOGE("Not get freq.\n");

 		}

 

 		// auth

@@ -679,13 +708,13 @@
 				}else{

 					memcpy(data + len,",",1);

 					len += 1;

-					printf("Not get group_cipher.\n");

+					LOGE("Not get group_cipher.\n");

 				}

 			}

 		}else{

 			memcpy(data + len,",",1);

 			len += 1;

-			printf("Not get key_mgmt.\n");

+			LOGE("Not get key_mgmt.\n");

 		}

 

 		// mac_ap

@@ -705,7 +734,7 @@
 		}else{

 			memcpy(data + len,",",1);

 			len += 1;

-			printf("Not get IP.\n");

+			LOGE("Not get IP.\n");

 		}

 	}else{

 		memcpy(data + len,"0",1);

@@ -723,7 +752,7 @@
 		}else{

 			memcpy(data + len,",",1);

 			len += 1;

-			printf("Not get MAC address.\n");

+			LOGE("Not get MAC address.\n");

 		}

 

 		memcpy(data + len,",,,,,,,",7);

@@ -734,7 +763,7 @@
 	len += 2;

 	data[len] = '\0';

 

-    printf("STATUS:\n%s\n",data);

+    LOGE("STATUS:\n%s\n",data);

 #undef BUF_SIZE

     return STA_ERR_SUCCESS;

 }

@@ -747,7 +776,7 @@
     size_t len

 )

 {

-    printf("MIB:\n%s\n",reply);

+    LOGE("MIB:\n%s\n",reply);

 

     memcpy(data,reply,strlen(reply));

 

@@ -762,7 +791,7 @@
     size_t len

 )

 {

-    printf("LIST_NETWORK:\n%s\n",reply);

+    LOGE("LIST_NETWORK:\n%s\n",reply);

 

     bzero(data,len);

     const char *ptr = reply;

@@ -808,7 +837,7 @@
 

     //memcpy(data,reply,strlen(reply));

 

-    printf("LIST_NETWORK:\n%s\n",data);

+    LOGE("LIST_NETWORK:\n%s\n",data);

 

     return STA_ERR_SUCCESS;

 }

@@ -823,17 +852,17 @@
     if(err == STA_ERR_SUCCESS){

         if(strncmp(cmd,STA_CMD_SCAN,strlen(STA_CMD_SCAN)) == 0

             && strncmp(sta_cli_cmd_reply,STA_TAG_CMD_FAIL_BUSY,strlen(STA_TAG_CMD_FAIL_BUSY)) == 0){

-            printf("\"%s\" busy.\n",cmd);

+            LOGE("\"%s\" busy.\n",cmd);

             return STA_ERR_SUCCESS;

         }

 

         if(strncmp(sta_cli_cmd_reply,STA_TAG_CMD_FAIL,strlen(STA_TAG_CMD_FAIL)) == 0){

-            printf("\"%s\" fail.\n",cmd);

+            LOGE("\"%s\" fail.\n",cmd);

             return STA_ERR_UNKNOWN;

         }

-        printf("[%s]:\n%s\n",cmd,sta_cli_cmd_reply);

+        LOGE("[%s]:\n%s\n",cmd,sta_cli_cmd_reply);

     }else{

-        printf("[%s]:FAIL\n",cmd);

+        LOGE("[%s]:FAIL\n",cmd);

     }

     return err;

 }

@@ -864,17 +893,17 @@
                     data,

                     len);

             }else{

-                printf("SCAN_RESULTS cmd fail.\n");

+                LOGE("SCAN_RESULTS cmd fail.\n");

                 return STA_ERR_UNKNOWN;

             }

         }else{

             sta_cli_cmd_id = CMD_ID_NON;

-            printf("SCAN cmd fail.\n");

+            LOGE("SCAN cmd fail.\n");

             return STA_ERR_UNKNOWN;

         }

     }else{

         sta_cli_cmd_id = CMD_ID_NON;

-        printf("SCAN cmd fail.\n");

+        LOGE("SCAN cmd fail.\n");

         return err;

     }

 }

@@ -910,11 +939,11 @@
 			ptr++; // Point to flag.

 

 			memcpy(flag,ptr,len);

-			printf("%s : %s\n",ssid,flag);

+			LOGE("%s : %s\n",ssid,flag);

 			return flag;

 		}

     }else{

-		printf("SCAN_RESULTS cmd fail.");

+		LOGE("SCAN_RESULTS cmd fail.");

 		return NULL;

     }

     return NULL;

@@ -938,7 +967,7 @@
             data,

             len);

     }else{

-        printf("STATUS cmd fail.\n");

+        LOGE("STATUS cmd fail.\n");

         return err;

     }

 }

@@ -960,7 +989,7 @@
             data,

             len);

     }else{

-        printf("MIB cmd fail.\n");

+        LOGE("MIB cmd fail.\n");

         return err;

     }

 }

@@ -978,12 +1007,12 @@
         if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){

             return STA_ERR_SUCCESS;

         }else{

-            printf("RECONFIGURE cmd fail.\n");

+            LOGE("RECONFIGURE cmd fail.\n");

             return STA_ERR_UNKNOWN;

         }

     }else{

         sta_cli_cmd_id = CMD_ID_NON;

-        printf("RECONFIGURE cmd fail.\n");

+        LOGE("RECONFIGURE cmd fail.\n");

         return err;

     }

 }

@@ -1001,12 +1030,12 @@
         if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){

             return STA_ERR_SUCCESS;

         }else{

-            printf("DISCONNECT cmd fail.\n");

+            LOGE("DISCONNECT cmd fail.\n");

             return STA_ERR_UNKNOWN;

         }

     }else{

         sta_cli_cmd_id = CMD_ID_NON;

-        printf("DISCONNECT cmd fail.\n");

+        LOGE("DISCONNECT cmd fail.\n");

         return err;

     }

 }

@@ -1024,12 +1053,12 @@
         if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){

             return STA_ERR_SUCCESS;

         }else{

-            printf("RECONNECT cmd fail.\n");

+            LOGE("RECONNECT cmd fail.\n");

             return STA_ERR_UNKNOWN;

         }

     }else{

         sta_cli_cmd_id = CMD_ID_NON;

-        printf("RECONNECT cmd fail.\n");

+        LOGE("RECONNECT cmd fail.\n");

         return err;

     }

 }

@@ -1048,12 +1077,12 @@
         if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){

             return STA_ERR_SUCCESS;

         }else{

-            printf("SAVE_CONFIG cmd fail.\n");

+            LOGE("SAVE_CONFIG cmd fail.\n");

             return STA_ERR_UNKNOWN;

         }

     }else{

         sta_cli_cmd_id = CMD_ID_NON;

-        printf("SAVE_CONFIG cmd fail.\n");

+        LOGE("SAVE_CONFIG cmd fail.\n");

         return err;

     }

 }

@@ -1064,7 +1093,7 @@
 	char *c

 )

 {

-	printf("cmd = %s\n",c);

+	LOGE("cmd = %s\n",c);

 	char *ptr = c;

 

     sta_cli_cmd_id = CMD_ID_SET_NETWORK;

@@ -1088,22 +1117,22 @@
 	    if(STA_ERR_SUCCESS == err){

 	        if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){

 	            //return STA_ERR_SUCCESS;

-	            printf("Success:%s\n",cmd);

+	            LOGE("Success:%s\n",cmd);

 	        }else{

-	            printf("Fail:%s\n",cmd);

+	            LOGE("Fail:%s\n",cmd);

 				sta_cli_cmd_id = CMD_ID_NON;

 	            return STA_ERR_UNKNOWN;

 	        }

 	    }else{

 	        sta_cli_cmd_id = CMD_ID_NON;

-	        printf("Fail:%s\n",cmd);

+	        LOGE("Fail:%s\n",cmd);

 	        return err;

 	    }

 

 		if(ptr == NULL)

 			break;

 

-		printf("ptr = %s",ptr);

+		LOGE("ptr = %s",ptr);

 

 		index = str_indexof(ptr,"#");

 		bzero(cmd,100);

@@ -1129,26 +1158,26 @@
     const char *flag

 )

 {

-	printf("cmd = %s\n",cmd);

+	LOGE("cmd = %s\n",cmd);

 	char buf[500];

-    printf("test11\n");

+    LOGE("test11\n");

 	int index = str_indexof(cmd," psk ");

-    printf("test12\n");

+    LOGE("test12\n");

 	int net_id = atoi(cmd + strlen(STA_CMD_SET_NETWORK) + 1);

-    printf("test13\n");

+    LOGE("test13\n");

 	if(index > 0){ // Is set "psk"

-	    printf("test14\n");

+	    LOGE("test14\n");

 		char psk[64] = {0};

 		int start = index + 5; // " psk "

 		if(*(cmd + start) == '"')

 		{

-		    printf("test15\n");

+		    LOGE("test15\n");

 			memcpy(psk,cmd + start + 1,strlen(cmd) - start - 2);

 		}else{

-            printf("test16\n");

+            LOGE("test16\n");

 			memcpy(psk,cmd + start,strlen(cmd) - start);

 		}

-		printf("psk = %s\n",psk);

+		LOGE("psk = %s\n",psk);

 

 		// Set to OPEN (No psk)

 		// SET_NETWORK <net_id> key_mgmt NONE

@@ -1212,7 +1241,7 @@
 	}

 	else // SSID

 	{

-	    printf("test21\n");

+	    LOGE("test21\n");

 		index = str_indexof(cmd," ssid ");

 		char ssid[STA_BUF_SIZE] = {0};

 		int start = index + 6; // " ssid "

@@ -1222,12 +1251,12 @@
 		}else{

 			memcpy(ssid,cmd + start,strlen(cmd) - start);

 		}

-		printf("ssid = %s\n",ssid);

+		LOGE("ssid = %s\n",ssid);

 

 

 		//char ssid_result[STA_SSID_MAX_LEN + 1];

 		//sta_cli_ssid_process(ssid,ssid_result,STA_SSID_MAX_LEN + 2 + 1);

-       // printf("test22, ssid_result: %s\n", ssid_result);

+       // LOGE("test22, ssid_result: %s\n", ssid_result);

 		char cmd_result[STA_BUF_SIZE];

 		int size = snprintf(cmd_result,STA_BUF_SIZE,

 			"%s %d ssid %s",

@@ -1235,7 +1264,7 @@
 			net_id,

 			ssid);

 		cmd_result[size] = '\0';

-		printf("cmd = %s\n",cmd_result);

+		LOGE("cmd = %s\n",cmd_result);

 

 		return sta_cli_cmd_set_network_process(cmd);

 	}

@@ -1269,11 +1298,11 @@
             tmp--;

         }

 

-        printf("GET_NETWORK:%s.\n",value);

+        LOGE("GET_NETWORK:%s.\n",value);

         return STA_ERR_SUCCESS;

     }else{

         sta_cli_cmd_id = CMD_ID_NON;

-        printf("GET_NETWORK cmd fail.\n");

+        LOGE("GET_NETWORK cmd fail.\n");

         return err;

     }

 }

@@ -1291,12 +1320,12 @@
         if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){

             return STA_ERR_SUCCESS;

         }else{

-            printf("REMOVE_NETWORK cmd fail.\n");

+            LOGE("REMOVE_NETWORK cmd fail.\n");

             return STA_ERR_UNKNOWN;

         }

     }else{

         sta_cli_cmd_id = CMD_ID_NON;

-        printf("REMOVE_NETWORK cmd fail.\n");

+        LOGE("REMOVE_NETWORK cmd fail.\n");

         return err;

     }

 }

@@ -1308,17 +1337,17 @@
     const char *cmd

 )

 {

-	printf("cmd = %s\n",cmd);

+	LOGE("cmd = %s\n",cmd);

     sta_cli_cmd_id = CMD_ID_ADD_NETWORK;

     sta_err_enum err = sta_cli_process_cmd(STA_CMD_ADD_NETWORK);

-    printf("test1\n");

+    LOGE("test1\n");

     if(STA_ERR_SUCCESS == err){

         sta_cli_cmd_id = CMD_ID_NON;

         int net_id = atoi(sta_cli_cmd_reply);

-        printf("test2\n");

+        LOGE("test2\n");

         if(net_id >= 0){ // Add network success.

             // Point to ssid

-            printf("test3\n");

+            LOGE("test3\n");

             /*

             const char *ptr = cmd + strlen(STA_CMD_ADD_NETWORK) + 1;

 

@@ -1331,7 +1360,7 @@
 

 

             char ssid[STA_BUF_SIZE] = {0};

-            printf("test4\n");

+            LOGE("test4\n");

             memcpy(ssid,ptr,pass_ptr - ptr - 1);

             */

 

@@ -1339,7 +1368,7 @@
             char ssid[STA_BUF_SIZE] = {'\0'};

             char psk[STA_BUF_SIZE] = {'\0'};

             int len = 0;

-            printf("test5\n");

+            LOGE("test5\n");

 

             sta_cli_ssid_get(ssid);

             len = strlen(ssid);

@@ -1355,12 +1384,12 @@
                 STA_CMD_SET_NETWORK,

                 net_id,

                 ssid);

-            printf("test6\n");

+            LOGE("test6\n");

             buf[size] = '\0';

 

          

             err = sta_cli_cmd_set_network(buf,NULL);

-            printf("test7\n");

+            LOGE("test7\n");

             if(STA_ERR_SUCCESS == err){

 				char flag[50];

 				sta_cli_flag_get(ssid,flag,50);

@@ -1388,11 +1417,11 @@
 

             return err;

         }else{

-            printf("ADD_NETWORK cmd fail.\n");

+            LOGE("ADD_NETWORK cmd fail.\n");

             return STA_ERR_UNKNOWN;

         }

     }else{

-        printf("ADD_NETWORK cmd fail.\n");

+        LOGE("ADD_NETWORK cmd fail.\n");

         sta_cli_cmd_id = CMD_ID_NON;

         return err;

     }

@@ -1411,12 +1440,12 @@
         if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){

             return STA_ERR_SUCCESS;

         }else{

-            printf("DISABLE_NETWORK cmd fail.\n");

+            LOGE("DISABLE_NETWORK cmd fail.\n");

             return STA_ERR_UNKNOWN;

         }

     }else{

         sta_cli_cmd_id = CMD_ID_NON;

-        printf("DISABLE_NETWORK cmd fail.\n");

+        LOGE("DISABLE_NETWORK cmd fail.\n");

         return err;

     }

 }

@@ -1434,12 +1463,12 @@
         if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){

             return STA_ERR_SUCCESS;

         }else{

-            printf("ENABLE_NETWORK cmd fail.\n");

+            LOGE("ENABLE_NETWORK cmd fail.\n");

             return STA_ERR_UNKNOWN;

         }

     }else{

         sta_cli_cmd_id = CMD_ID_NON;

-        printf("ENABLE_NETWORK cmd fail.\n");

+        LOGE("ENABLE_NETWORK cmd fail.\n");

         return err;

     }

 }

@@ -1457,12 +1486,12 @@
         if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){

             return STA_ERR_SUCCESS;

         }else{

-            printf("SELECT_NETWORK cmd fail.\n");

+            LOGE("SELECT_NETWORK cmd fail.\n");

             return STA_ERR_UNKNOWN;

         }

     }else{

         sta_cli_cmd_id = CMD_ID_NON;

-        printf("SELECT_NETWORK cmd fail.\n");

+        LOGE("SELECT_NETWORK cmd fail.\n");

         return err;

     }

 }

@@ -1484,7 +1513,7 @@
             data,

             len);

     }else{

-        printf("LIST_NETWORKS cmd fail.\n");

+        LOGE("LIST_NETWORKS cmd fail.\n");

         return err;

     }

 }

@@ -1502,12 +1531,12 @@
         if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){

             return STA_ERR_SUCCESS;

         }else{

-            printf("REASSOCIATE cmd fail.\n");

+            LOGE("REASSOCIATE cmd fail.\n");

             return STA_ERR_UNKNOWN;

         }

     }else{

         sta_cli_cmd_id = CMD_ID_NON;

-        printf("REASSOCIATE cmd fail.\n");

+        LOGE("REASSOCIATE cmd fail.\n");

         return err;

     }

 }

@@ -1525,12 +1554,12 @@
         if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){

             return STA_ERR_SUCCESS;

         }else{

-            printf("REATTACH cmd fail.\n");

+            LOGE("REATTACH cmd fail.\n");

             return STA_ERR_UNKNOWN;

         }

     }else{

         sta_cli_cmd_id = CMD_ID_NON;

-        printf("REATTACH cmd fail.\n");

+        LOGE("REATTACH cmd fail.\n");

         return err;

     }

 }

@@ -1543,7 +1572,7 @@
 {

     sta_err_enum result = STA_ERR_SUCCESS;

     if((result = sta_ctrl_driver_init(TRUE)) != STA_ERR_SUCCESS){

-        printf("Driver init fail(%d).\n",result);

+        LOGE("Driver init fail(%d).\n",result);

         return result;

     }

 

@@ -1551,7 +1580,7 @@
         "/etc/wifi/wpa_supplicant.conf",

         "wlan0",

         sta_cli_wpa_msg_cb)) != STA_ERR_SUCCESS){

-        printf("wpa_supplicant init fail(%d).\n",result);

+        LOGE("wpa_supplicant init fail(%d).\n",result);

         return result;

     }

 	//pthread_mutex_init(&sta_mutex,NULL);

@@ -1566,12 +1595,12 @@
 {

     sta_err_enum result = STA_ERR_SUCCESS;

     if((result = sta_ctrl_wpa_deinit()) != STA_ERR_SUCCESS){

-        printf("sta_ctrl_wpa_deinit fail(%d).",result);

+        LOGE("sta_ctrl_wpa_deinit fail(%d).",result);

         return result;

     }

 

     if((result = sta_ctrl_driver_init(FALSE)) != STA_ERR_SUCCESS){

-        printf("Driver close fail(%d).\n",result);

+        LOGE("Driver close fail(%d).\n",result);

         return result;

     }

 	//pthread_mutex_destroy(&sta_mutex);

@@ -1594,7 +1623,7 @@
     size_t reply_len

 )

 {

-	printf("cmd:%s\n",cmd);

+	LOGE("cmd:%s\n",cmd);

     bzero(reply,reply_len);

     sta_err_enum err = STA_ERR_UNKNOWN;

     if(strncmp(cmd,(STA_CMD_OPEN),strlen(STA_CMD_OPEN)) == 0){

@@ -1637,9 +1666,7 @@
         err = sta_cli_cmd_scan(cmd, data,STA_BUF_SIZE);

         if(err == STA_ERR_SUCCESS){

             snprintf(reply,reply_len,

-                "%s-%s-%s"STA_CMD_SEPARATED,

-                STA_TAG_CMD,

-                cmd,

+                "%s"STA_CMD_SEPARATED,

                 data);

         }else{

             snprintf(reply,reply_len,

@@ -1721,7 +1748,7 @@
 #endif

 		if(err == STA_ERR_SUCCESS)

 		{

-			printf("sta_cli_cmd_disconnect success.\n");

+			LOGE("sta_cli_cmd_disconnect success.\n");

 			//pthread_mutex_lock(&sta_mutex);

 			//if(sta_connected)

 			//{

@@ -1739,7 +1766,7 @@
 							mac_ap,

 							STA_MAC_LEN + 1)) // Disconnected.

 						{

-							printf("Disconnected success.\n");

+							LOGE("Disconnected success.\n");

 							snprintf(reply,reply_len,

 								"%s-%s-%s"STA_CMD_SEPARATED,

 								STA_TAG_CMD,

@@ -1748,18 +1775,18 @@
 							ok = TRUE;

 							break;

 						}else{ // Connected.

-							printf("Not disconnected.Try again(STATUS).\n");

+							LOGE("Not disconnected.Try again(STATUS).\n");

 							usleep(500);

 						}

 				    }else{

-				        printf("STATUS cmd fail.\n");

+				        LOGE("STATUS cmd fail.\n");

 				        break;

 				    }

 				}

 

 				if(!ok) // fail

 				{

-					printf("Disconnect fail.\n");

+					LOGE("Disconnect fail.\n");

 		            snprintf(reply,reply_len,

 		                "%s-%s-%s:%d"STA_CMD_SEPARATED,

 		                STA_TAG_CMD,

@@ -1771,7 +1798,7 @@
 			//}

 			//pthread_mutex_unlock(&sta_mutex);

 		}else{

-			printf("sta_cli_cmd_disconnect fail.\n");

+			LOGE("sta_cli_cmd_disconnect fail.\n");

             snprintf(reply,reply_len,

                 "%s-%s-%s:%d"STA_CMD_SEPARATED,

                 STA_TAG_CMD,

@@ -1999,7 +2026,7 @@
                 err);

         }

     }else{

-        printf("Unknown cmd:%s\n",cmd);

+        LOGE("Unknown cmd:%s\n",cmd);

         return FALSE;

     }

     return TRUE;

diff --git a/mbtk/libmbtk_lib_v2/wifi/sta_ctrl.c b/mbtk/libmbtk_lib_v2/wifi/sta_ctrl.c
index 66c55f5..e5e24aa 100755
--- a/mbtk/libmbtk_lib_v2/wifi/sta_ctrl.c
+++ b/mbtk/libmbtk_lib_v2/wifi/sta_ctrl.c
@@ -10,6 +10,8 @@
 

 #include "wpa_ctrl.h"

 #include "sta_ctrl.h"

+#include "mbtk_log.h"

+

 //#include "sta_log.h"

 

 #define WPA_SUPPLICANT_LOG_FILE "/data/wpa_supplicant.log"

@@ -54,7 +56,7 @@
 static void

 sta_ctrl_wpa_req_cb(char *msg, size_t len)

 {

-	printf("%s\n", msg);

+	LOGE("%s\n", msg);

 }

 

 bool

@@ -66,17 +68,17 @@
     int result = TRUE;

     FILE *stream = NULL;

 

-    printf("system call: %s\n", command);

+    LOGE("system call: %s\n", command);

 

     stream = popen( command, "w" );

     if( stream == NULL )

     {

-        printf("system command failed\n");

+        LOGE("system command failed\n");

         result = FALSE;

     }

     else if( 0 > pclose( stream ) )

     {

-        printf("pclose command failed\n");

+        LOGE("pclose command failed\n");

     }

 

     return result;

@@ -110,7 +112,7 @@
             pclose(cmd);

         }

         pid = atoi(pid_s);

-        printf("%s pid =%d\n", name,pid);

+        LOGE("%s pid =%d\n", name,pid);

         /* If pid is zero we break from while*/

         if(pid == 0)

         {

@@ -119,7 +121,7 @@
         }

     }

 

-    printf("PID still running after waiting 2 second.\n");

+    LOGE("PID still running after waiting 2 second.\n");

     result = FALSE;

 exit_end:

 #undef PROCESS_KILL_RETRY

@@ -145,14 +147,14 @@
     }

 

     int pid = atoi(pid_s);

-    printf("%s pid =%d\n", name,pid);

+    LOGE("%s pid =%d\n", name,pid);

     /* If pid is zero we break from while*/

     if(pid == 0)

     {

-        printf("%s not runnig.\n",name);

+        LOGE("%s not runnig.\n",name);

         return FALSE;

     }else{

-        printf("%s is runnig.\n",name);

+        LOGE("%s is runnig.\n",name);

         return TRUE;

     }

 }

@@ -161,7 +163,7 @@
 static void*

 sta_ctrl_event_thread_run( void *arg )

 {

-    printf("Thread[%ld] run().\n",pthread_self());

+    LOGE("Thread[%ld] run().\n",pthread_self());

 

     int nready;

     struct epoll_event ev_sock,ev_pipe,events[20];

@@ -178,9 +180,9 @@
         if(!sta_event_thread_is_running){

             break;

         }

-		printf("epoll_wait waitting...\n",nready);

+		LOGE("epoll_wait waitting...\n",nready);

         nready = epoll_wait(epfd,events,20,-1);

-        printf("epoll_wait return.(count = %d)\n",nready);

+        LOGE("epoll_wait return.(count = %d)\n",nready);

         int i;

         for(i=0;i<nready;++i) {

             if (events[i].events & EPOLLIN) {// Read

@@ -191,7 +193,7 @@
                     && events[i].data.fd == wpa_ctrl_get_fd(sta_mon_conn)){

                     sta_ctrl_recv_event();

                 }else if(events[i].data.fd == sta_ctrl_pipe_fd[0]){

-                    printf("Thread end.[fd = %d]\n",events[i].data.fd);

+                    LOGE("Thread end.[fd = %d]\n",events[i].data.fd);

                     // End thread

                     char buf_end[10] = {0};

                     if(read(sta_ctrl_pipe_fd[0],buf_end,10) > 0

@@ -200,23 +202,23 @@
                         break;

                     }

                 }else{

-                    printf("No such fd[%d].\n",events[i].data.fd);

+                    LOGE("No such fd[%d].\n",events[i].data.fd);

                 }

             } else {

-                printf("event error.\n");

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

             }

         }

     }

 

     close(epfd);

-    printf("Thread exit.\n");

+    LOGE("Thread exit.\n");

     return ((void*)0);

 }

 

 static sta_err_enum

 sta_ctrl_close_connection(void)

 {

-    printf("start.\n");

+    LOGE("start.\n");

     if (sta_ctrl_conn == NULL)

         return STA_ERR_UNKNOWN;

 

@@ -231,7 +233,7 @@
         sta_mon_conn = NULL;

     }

 

-    printf("end.\n");

+    LOGE("end.\n");

     return STA_ERR_SUCCESS;

 }

 

@@ -247,14 +249,14 @@
     char ctrl_path[100] = {0};

     result = sta_ctrl_conf_file_parse("ctrl_interface", ctrl_path);

     if(STA_ERR_SUCCESS != result){

-        printf("sta_ctrl_conf_file_parse() fail(%d).\n",result);

+        LOGE("sta_ctrl_conf_file_parse() fail(%d).\n",result);

         return result;

     }

     snprintf(ctrl_path + strlen(ctrl_path),10,

         "/%s",

         sta_ctrl_ifname);

 

-	printf("ctrl_path = \"%s\"\n",ctrl_path);

+	LOGE("ctrl_path = \"%s\"\n",ctrl_path);

 

     sta_ctrl_conn = wpa_ctrl_open(ctrl_path);

     if (sta_ctrl_conn == NULL) {

@@ -270,7 +272,7 @@
     if (wpa_ctrl_attach(sta_mon_conn) == 0) {

         sta_ctrl_attached = 1;

     } else {

-        printf("Warning: Failed to attach to "

+        LOGE("Warning: Failed to attach to "

                "wpa_supplicant.\n");

         sta_ctrl_close_connection();

         return STA_ERR_UNKNOWN;

@@ -283,10 +285,10 @@
             sta_ctrl_event_thread_run,

             NULL);

         if( ret != 0 ) {

-            printf( "Create thread error!\n");

+            LOGE( "Create thread error!\n");

         }

     }else{

-        printf("sta_event_thread is running.\n");

+        LOGE("sta_event_thread is running.\n");

         return STA_ERR_UNKNOWN;

     }

     return result;

@@ -305,10 +307,10 @@
 static void

 sta_ctrl_recv_event(void)

 {

-	printf("start.\n");

+	LOGE("start.\n");

     if (sta_ctrl_conn == NULL) {

         sta_ctrl_reconnect();

-		printf("sta_ctrl_conn == NULL:end.\n");

+		LOGE("sta_ctrl_conn == NULL:end.\n");

         return;

     }

 

@@ -317,22 +319,22 @@
         size_t len = sizeof(buf) - 1;

         if (wpa_ctrl_recv(sta_mon_conn, buf, &len) == 0) {

             buf[len] = '\0';

-            printf("<<%s>>\n",buf);

+            LOGE("<<%s>>\n",buf);

             if(sta_ctrl_msg)

                 sta_ctrl_msg(buf);

         } else {

-            printf("Could not read pending message.\n");

+            LOGE("Could not read pending message.\n");

             break;

         }

     }

 

     if (wpa_ctrl_pending(sta_mon_conn) < 0) {

-        printf("Connection to wpa_supplicant lost - trying to "

+        LOGE("Connection to wpa_supplicant lost - trying to "

                "reconnect\n");

         sta_ctrl_reconnect();

     }

 

-	printf("end.\n");

+	LOGE("end.\n");

 }

 

 static sta_err_enum

@@ -345,7 +347,7 @@
     sta_err_enum result = STA_ERR_UNKNOWN;

     FILE *fd = fopen(sta_ctrl_conf_file_path,"r");

     if(!fd){

-        printf("Open file(%s) fail(%d).\n",sta_ctrl_conf_file_path,errno);

+        LOGE("Open file(%s) fail(%d).\n",sta_ctrl_conf_file_path,errno);

         return STA_ERR_UNKNOWN;

     }

 

@@ -399,19 +401,19 @@
         &reply_len,

         sta_ctrl_wpa_req_cb);

     if (ret == -2) {

-        printf("command timed out.\n");

+        LOGE("command timed out.\n");

         result = STA_ERR_TIMEOUT;

         goto end_fail;

     } else if (ret < 0) {

-        printf("command failed.\n");

+        LOGE("command failed.\n");

         result = STA_ERR_UNKNOWN;

         goto end_fail;

     } else {

         reply[reply_len] = '\0';

-        printf("1:%s\n", reply);

+        LOGE("1:%s\n", reply);

 

         if(reply_len > 0 && reply[reply_len - 1] != '\n')

-            printf("\n");

+            LOGE("\n");

     }

 

 end_success:

@@ -434,7 +436,7 @@
     if(open){

         fd_tmp = popen("/etc/wifi/mbtk_wifi_driver.sh sta start","r");

     }else{

-        fd_tmp = popen("/etc/wifi/mbtk_wifi_driver.sh driver_rmmod","r");

+        fd_tmp = popen("/etc/wifi/mbtk_wifi_driver.sh sta stop","r");

     }

 

     if(fd_tmp){

@@ -442,13 +444,13 @@
         fgets(buf,200,fd_tmp);

         pclose(fd_tmp);

         if(strlen(buf) > 0){

-            printf("Driver %s fail.(%s)\n",(open?"open":"close"),buf);

+            LOGE("Driver %s fail.(%s)\n",(open?"open":"close"),buf);

             result = STA_ERR_DRIVER;

         }else{// Open wpa_supplicant

-            printf("Driver %s success.\n",(open?"open":"close"));

+            LOGE("Driver %s success.\n",(open?"open":"close"));

         }

     }else{

-        printf("Driver %s fail.(%s)\n",(open?"open":"close"));

+        LOGE("Driver %s fail.(%s)\n",(open?"open":"close"));

         result = STA_ERR_DRIVER;

     }

 

@@ -490,7 +492,7 @@
     sta_ctrl_ifname[size] = '\0';

 

     if(pipe(sta_ctrl_pipe_fd)){

-        printf("pipe() fail(%d).\n",errno);

+        LOGE("pipe() fail(%d).\n",errno);

         result = STA_ERR_UNKNOWN;

         goto end_fail;

     }

@@ -501,7 +503,7 @@
         fgets(buf,200,fd_tmp);

         pclose(fd_tmp);

         if(strlen(buf) > 0){

-            printf("wpa_supplicant is running.(%s)\n",buf);

+            LOGE("wpa_supplicant is running.(%s)\n",buf);

         }else{// Open wpa_supplicant

             bzero(buf,200);

             

@@ -516,23 +518,23 @@
                 "wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wifi/wpa_supplicant.conf -B");

                 */

             if (sta_ctrl_system(buf)){

-                printf("\"%s\" success.\n",buf);

+                LOGE("\"%s\" success.\n",buf);

                 sleep(1);

             }else{

-                printf("\"%s\" fail.\n",buf);

+                LOGE("\"%s\" fail.\n",buf);

                 result = STA_ERR_UNKNOWN;

                 goto end_fail;

             }

         }

     }else{

-        printf("\"pidof wpa_supplicant\" fail\n");

+        LOGE("\"pidof wpa_supplicant\" fail\n");

         result = STA_ERR_UNKNOWN;

         goto end_fail;

     }

 

     result = sta_ctrl_open_connection();

     if(STA_ERR_SUCCESS != result) {

-        printf("sta_ctrl_open_connection() fail(%d).\n",result);

+        LOGE("sta_ctrl_open_connection() fail(%d).\n",result);

         goto end_fail;

     }

 

@@ -564,11 +566,11 @@
     write(sta_ctrl_pipe_fd[1],"0",1);

 

 

-    printf("Waitting for thread(%ld) exit.\n",sta_event_thread_id);

+    LOGE("Waitting for thread(%ld) exit.\n",sta_event_thread_id);

 

     pthread_join(sta_event_thread_id,NULL);

 

-    printf("pthread_join() return.\n");

+    LOGE("pthread_join() return.\n");

 

 

     close(sta_ctrl_pipe_fd[0]);

@@ -580,20 +582,20 @@
     // Stop process wpa_supplicant

     if(sta_ctrl_system("killall -15 wpa_supplicant")

         && sta_ctrl_kill_check("wpa_supplicant")){

-        printf("\"killall -15 wpa_supplicant\" success.\n");

+        LOGE("\"killall -15 wpa_supplicant\" success.\n");

     }else{

         if(sta_ctrl_system("killall -9 wpa_supplicant")){

-            printf("\"killall -9 wpa_supplicant\" success.\n");

+            LOGE("\"killall -9 wpa_supplicant\" success.\n");

         }else{

-            printf("\"killall -9 wpa_supplicant\" fail.\n");

+            LOGE("\"killall -9 wpa_supplicant\" fail.\n");

         }

     }

 

 end_success:

-    printf("sta_ctrl_wpa_deinit() end(success).\n");

+    LOGE("sta_ctrl_wpa_deinit() end(success).\n");

     return result;

 end_fail:

-    printf("sta_ctrl_wpa_deinit() end(fail)[%s].\n",result);

+    LOGE("sta_ctrl_wpa_deinit() end(fail)[%s].\n",result);

     return result;

 }

 

diff --git a/mbtk/mbtk_rild/src/atchannel.c b/mbtk/mbtk_rild/src/atchannel.c
index a1a9f21..56b1d08 100755
--- a/mbtk/mbtk_rild/src/atchannel.c
+++ b/mbtk/mbtk_rild/src/atchannel.c
@@ -36,7 +36,7 @@
 #define MAX_AT_RESPONSE (8 * 1024)
 #define HANDSHAKE_RETRY_COUNT 20
 #define HANDSHAKE_TIMEOUT_MSEC 500
-#define AT_BUFF_MAX 100
+#define AT_BUFF_MAX 1024
 
 static pthread_t s_tid_reader;
 static int s_at_fd = -1;    /* fd of the AT channel */
diff --git a/mbtk/mbtk_rild/src/mbtk_info_server.c b/mbtk/mbtk_rild/src/mbtk_info_server.c
index f09e33c..27d08d4 100755
--- a/mbtk/mbtk_rild/src/mbtk_info_server.c
+++ b/mbtk/mbtk_rild/src/mbtk_info_server.c
@@ -65,6 +65,7 @@
 
 static mbtk_signal_info_t signal_globe;
 
+mbtk_info_err_enum ecall_pack_req_process(sock_client_info_t* cli_info, mbtk_info_pack_t* pack);
 
 /*
 AT*POWERIND=0"
@@ -596,7 +597,7 @@
         ret = MBTK_SIM_NOT_READY;
         goto done;
     }
-    
+
     /* CPIN? has succeeded, now look at the result */
 
     cpinLine = p_response->p_intermediates->line;
@@ -1220,27 +1221,27 @@
     {
         line = lines_ptr->line;
         char *start = strstr(line, "FALCON_CP_SDK");
-        if(start) 
+        if(start)
         {
             char *end = strstr(start, "_Linux");
-            if(end) 
+            if(end)
             {
-                end += strlen("_Linux"); 
+                end += strlen("_Linux");
                 int length = end - start;
                 if (length)
                 {
                     strncpy(data, start, length);
                     ((char*)data)[length] = '\0';
                     break;
-                } 
+                }
                 else
                 {
                     err = -1;
                     goto exit;
-                    
+
                 }
-            } 
-            else 
+            }
+            else
             {
                 err = -1;
                 goto exit;
@@ -1248,7 +1249,7 @@
         }
         lines_ptr = lines_ptr->p_next;
     }
-    
+
     goto exit;
 exit:
     at_response_free(response);
@@ -1862,7 +1863,7 @@
 {
     ATResponse *response = NULL;
     char cmd[64]={0};
-    
+
     int err = at_send_command_singleline("AT+CLCK=SC,2", "+CLCK:", &response);
     if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates)
     {
@@ -1886,7 +1887,7 @@
         LOGE("[req_get_pin_state] at_tok_start fail.[%d]", err);
         goto exit;
     }
-    
+
     int clck;
     err = at_tok_nextint(&line, &clck);
     if (err < 0)
@@ -4182,6 +4183,8 @@
         return sms_pack_req_process(cli_info, pack);
     } else if(pack->info_id > MBTK_INFO_ID_PB_BEGIN && pack->info_id < MBTK_INFO_ID_PB_END) {
         return pb_pack_req_process(cli_info, pack);
+    } else if(pack->info_id > RIL_MSG_ID_ECALL_BEGIN && pack->info_id < RIL_MSG_ID_ECALL_END) {
+        return ecall_pack_req_process(cli_info, pack);
     } else {
         mbtk_info_err_enum err = MBTK_INFO_ERR_SUCCESS;
         int cme_err = MBTK_INFO_ERR_CME_NON;
@@ -6773,7 +6776,7 @@
                 strftime(tmp, 50, "%F %T", tm_t);
                 snprintf(buff, sizeof(buff), "%s:%d,%d,%d,%d,%d,%d,%d,%d", tmp, signal.type, signal.rssi, signal.rxlev, signal.ber, signal.rscp, signal.ecno,
                     signal.rsrq, signal.rsrp);
-                mbtk_signal_log(buff);             
+                mbtk_signal_log(buff);
             }
 
             if(signal_globe.type != signal.type)
diff --git a/mbtk/mbtk_rild/src/ril_ecall.c b/mbtk/mbtk_rild/src/ril_ecall.c
new file mode 100755
index 0000000..8d7a5e8
--- /dev/null
+++ b/mbtk/mbtk_rild/src/ril_ecall.c
@@ -0,0 +1,1141 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <netinet/in.h>
+#include <pthread.h>
+#include <sys/epoll.h>
+#include <fcntl.h>
+#include <signal.h>
+
+#include "mbtk_type.h"
+#include "info_data.h"
+#include "atchannel.h"
+#include "at_tok.h"
+#include "mbtk_utils.h"
+#include "mbtk_info.h"
+
+static mbtk_ecall_mode_type_enum ecall_mode = MBTK_ECALL_MODE_TYPE_EU;
+
+void pack_rsp_send(int fd, int info_id, const void* data, int data_len);
+
+static int req_ecall_msdcfg(mbtk_ecall_msd_cfg_info_t *cfg_info, int *cme_err)
+{
+    ATResponse *response = NULL;
+    char cmd[1024] = {0};
+    sprintf(cmd, "AT*ECALLMSDCFG=%d,\"%s\",0", cfg_info->item_type, cfg_info->data);
+    int err = at_send_command(cmd, &response);
+    if (err < 0 || response->success == 0){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+exit:
+    at_response_free(response);
+    return err;
+}
+
+static int req_ecall_msdgen(int *cme_err)
+{
+    ATResponse *response = NULL;
+    int err = at_send_command("AT*ECALLMSDGEN", &response);
+    if (err < 0 || response->success == 0){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+exit:
+    at_response_free(response);
+    return err;
+}
+
+static int req_ecall_msd_set(const uint8 *msd, int *cme_err)
+{
+    ATResponse *response = NULL;
+    char cmd[1024] = {0};
+    sprintf(cmd, "AT*ECALLMSD=\"%s\"", msd);
+    int err = at_send_command(cmd, &response);
+    if (err < 0 || response->success == 0){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+exit:
+    at_response_free(response);
+    return err;
+}
+
+static int req_ecall_msd_get(uint8 *msd, int *cme_err)
+{
+    ATResponse *response = NULL;
+    char *tmp_ptr = NULL;
+    int err = at_send_command_singleline("AT*ECALLMSD?", "*ECALLMSD:", &response);
+
+    if (err < 0 || response->success == 0 || !response->p_intermediates){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+    char *line = response->p_intermediates->line;
+    err = at_tok_start(&line);
+    if (err < 0)
+    {
+        goto exit;
+    }
+
+    err = at_tok_nextstr(&line, &tmp_ptr);
+    if (err < 0)
+    {
+        goto exit;
+    }
+
+    if(tmp_ptr && strlen(tmp_ptr) > 0) {
+        memcpy(msd, tmp_ptr, strlen(tmp_ptr));
+    }
+
+    goto exit;
+exit:
+    at_response_free(response);
+    return err;
+}
+
+static int req_ecall_push(int *cme_err)
+{
+    ATResponse *response = NULL;
+    int err = at_send_command("AT*ECALLPUSH", &response);
+    if (err < 0 || response->success == 0){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+exit:
+    at_response_free(response);
+    return err;
+}
+
+/*
+AT*ECALLONLY?
+*ECALLONLY: 0,0,18981911691,18981911691
+
+OK
+
+*/
+static int req_ecall_only_get(mbtk_ecall_only_info_t *only_info, int *cme_err)
+{
+    ATResponse *response = NULL;
+    char *tmp_ptr = NULL;
+    int tmp_int;
+    int err = at_send_command_singleline("AT*ECALLONLY?", "*ECALLONLY:", &response);
+
+    if (err < 0 || response->success == 0 || !response->p_intermediates){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+    char *line = response->p_intermediates->line;
+    err = at_tok_start(&line);
+    if (err < 0)
+    {
+        goto exit;
+    }
+
+    err = at_tok_nextint(&line, &tmp_int);
+    if (err < 0)
+    {
+        goto exit;
+    }
+    only_info->active = (mbtk_ecall_only_type_enum)tmp_int;
+
+    err = at_tok_nextint(&line, &tmp_int);
+    if (err < 0)
+    {
+        goto exit;
+    }
+    only_info->sim_type = (mbtk_ecall_sim_type_enum)tmp_int;
+
+    err = at_tok_nextstr(&line, &tmp_ptr);
+    if (err < 0)
+    {
+        goto exit;
+    }
+
+    if(tmp_ptr && strlen(tmp_ptr) > 0) {
+        memcpy(only_info->test_num, tmp_ptr, strlen(tmp_ptr));
+    }
+
+    err = at_tok_nextstr(&line, &tmp_ptr);
+    if (err < 0)
+    {
+        goto exit;
+    }
+
+    if(tmp_ptr && strlen(tmp_ptr) > 0) {
+        memcpy(only_info->reconfig_num, tmp_ptr, strlen(tmp_ptr));
+    }
+
+    goto exit;
+exit:
+    at_response_free(response);
+    return err;
+}
+
+/*
+AT*ECALLONLY?
+*ECALLONLY: 0,0,18981911691,18981911691
+
+OK
+
+*/
+static int req_ecall_only_set(const mbtk_ecall_only_info_t *only_info, int *cme_err)
+{
+    ATResponse *response = NULL;
+    char cmd[1024] = {0};
+    sprintf(cmd, "AT*ECALLONLY=%d,%s,%s", only_info->active,only_info->test_num,only_info->reconfig_num);
+    int err = at_send_command(cmd, &response);
+    if (err < 0 || response->success == 0){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+exit:
+    at_response_free(response);
+    return err;
+}
+
+/*
+AT*ECALLREG=0/1
+
+*/
+static int req_ecall_reg_set(uint8 reg, int *cme_err)
+{
+    ATResponse *response = NULL;
+    char cmd[30] = {0};
+    sprintf(cmd, "AT*ECALLREG=%d", reg);
+    int err = at_send_command(cmd, &response);
+    if (err < 0 || response->success == 0){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+exit:
+    at_response_free(response);
+    return err;
+}
+
+/*
+AT+CECALL?
++CECALL: 4
+
+OK
+
+*/
+static int req_ecall_dial_state_get(mbtk_ecall_dial_type_enum *type, int *cme_err)
+{
+    ATResponse *response = NULL;
+    int tmp_int;
+    int err = at_send_command_singleline("AT+CECALL?", "+CECALL:", &response);
+
+    if (err < 0 || response->success == 0 || !response->p_intermediates){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+    char *line = response->p_intermediates->line;
+    err = at_tok_start(&line);
+    if (err < 0)
+    {
+        goto exit;
+    }
+
+    err = at_tok_nextint(&line, &tmp_int);
+    if (err < 0)
+    {
+        goto exit;
+    }
+    *type = (mbtk_ecall_dial_type_enum)tmp_int;
+
+    goto exit;
+exit:
+    at_response_free(response);
+    return err;
+}
+
+/*
+AT+CECALL=<ecalltype>
+OK
+*/
+static int req_ecall_dial_start(mbtk_ecall_dial_type_enum type, int *cme_err)
+{
+    ATResponse *response = NULL;
+    char cmd[1024] = {0};
+    sprintf(cmd, "AT+CECALL=%d", type);
+    int err = at_send_command(cmd, &response);
+    if (err < 0 || response->success == 0){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+exit:
+    at_response_free(response);
+    return err;
+}
+
+
+/*
+AT*ECALLMODE?
+*ECALLMODE: "ERA"
+
+OK
+
+*/
+static int req_ecall_mode_get(mbtk_ecall_mode_type_enum *mode, int *cme_err)
+{
+    ATResponse *response = NULL;
+    char *tmp_ptr = NULL;
+    int err = at_send_command_singleline("AT*ECALLMODE?", "*ECALLMODE:", &response);
+
+    if (err < 0 || response->success == 0 || !response->p_intermediates){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+    char *line = response->p_intermediates->line;
+    err = at_tok_start(&line);
+    if (err < 0)
+    {
+        goto exit;
+    }
+
+    err = at_tok_nextstr(&line, &tmp_ptr);
+    if (err < 0)
+    {
+        goto exit;
+    }
+
+    if(tmp_ptr && strlen(tmp_ptr) > 0) {
+        if(strcmp(tmp_ptr, "ERA") == 0) {
+            *mode = MBTK_ECALL_MODE_TYPE_ERA;
+        } else {
+            *mode = MBTK_ECALL_MODE_TYPE_EU;
+        }
+
+        ecall_mode = *mode;
+    } else {
+        err =  -1;
+    }
+
+    goto exit;
+exit:
+    at_response_free(response);
+    return err;
+}
+
+/*
+AT*ECALLMODE="ERA"
+OK
+
+*/
+static int req_ecall_mode_set(mbtk_ecall_mode_type_enum mode, int *cme_err)
+{
+    ATResponse *response = NULL;
+    char cmd[1024] = {0};
+    if(mode == MBTK_ECALL_MODE_TYPE_EU) {
+        sprintf(cmd, "AT*ECALLMODE=\"EU\"");
+    } else {
+        sprintf(cmd, "AT*ECALLMODE=\"ERA\"");
+    }
+    int err = at_send_command(cmd, &response);
+    if (err < 0 || response->success == 0){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+    ecall_mode = mode;
+
+exit:
+    at_response_free(response);
+    return err;
+}
+
+/*
+AT*ECALLDATA=5,2
+*ECALLDATA: 5,2,250
+
+OK
+
+AT*ECALLTIMER?
+*ECALLTIMER: ERA mode, callback timer: 1200s, dial setup timer: 30s, NAD deregister timer: 7200s, cleardown timer: 3600s, redial attempts count: 10, redial wait timer: 30s, smsprocess: 1, SMS resend timer: 3600s, sms msd send count: 10.
+
+OK
+
+*/
+static int req_ecall_cfg_get(mbtk_ecall_cfg_item_enum type, mbtk_ecall_cfg_info_t *cfg, int *cme_err)
+{
+    ATResponse *response = NULL;
+    char *tmp_ptr = NULL;
+    int tmp_int;
+    char cmd[1024] = {0};
+    int err = 0;
+
+    cfg->type = type;
+    switch(type)
+    {
+        case MBTK_ECALL_CFG_ITEM_T3:
+        case MBTK_ECALL_CFG_ITEM_T5:
+        case MBTK_ECALL_CFG_ITEM_T6:
+        case MBTK_ECALL_CFG_ITEM_T7:
+        case MBTK_ECALL_CFG_ITEM_TH:
+            snprintf(cmd, sizeof(cmd), "AT*ECALLDATA=5,%d", type);
+
+            err = at_send_command_singleline(cmd, "*ECALLDATA:", &response);
+            break;
+        default:
+            snprintf(cmd, sizeof(cmd), "AT*ECALLTIMER?");
+
+            err = at_send_command_singleline(cmd, "*ECALLTIMER:", &response);
+            break;
+    }
+
+    if (err < 0 || response->success == 0 || !response->p_intermediates){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+    char *line = response->p_intermediates->line;
+    err = at_tok_start(&line);
+    if (err < 0)
+    {
+        goto exit;
+    }
+
+    if(strstr(cmd, "AT*ECALLDATA")) {
+        err = at_tok_nextint(&line, &tmp_int);
+        if (err < 0)
+        {
+            goto exit;
+        }
+
+        err = at_tok_nextint(&line, &tmp_int);
+        if (err < 0)
+        {
+            goto exit;
+        }
+
+        err = at_tok_nextint(&line, &tmp_int);
+        if (err < 0)
+        {
+            goto exit;
+        }
+
+        cfg->data = (uint32)(tmp_int * 20);   // ms
+    } else {
+        // *ECALLTIMER: ERA mode, callback timer: 1200s,
+        // dial setup timer: 30s, NAD deregister timer: 7200s,
+        // cleardown timer: 3600s, redial attempts count: 10,
+        // redial wait timer: 30s, smsprocess: 1, SMS resend timer: 3600s,
+        // sms msd send count: 10.
+
+        if(strstr(line, "ERA mode") != NULL) {
+            ecall_mode = MBTK_ECALL_MODE_TYPE_ERA;
+        } else {
+            ecall_mode = MBTK_ECALL_MODE_TYPE_EU;
+        }
+
+        switch(type)
+        {
+            case MBTK_ECALL_CFG_ITEM_TIMER_CALLBACK:
+            {
+                if((tmp_ptr = strstr(line, "callback timer: ")) != NULL) {
+                    cfg->data = (uint32)atoi(tmp_ptr + 16);   // s
+                    cfg->data *= 1000; // s -> ms
+                }
+                break;
+            }
+            case MBTK_ECALL_CFG_ITEM_TIMER_CLEARDOWN:
+            {
+                if((tmp_ptr = strstr(line, "cleardown timer: ")) != NULL) {
+                    cfg->data = (uint32)atoi(tmp_ptr + 17);   // s
+                    cfg->data *= 1000; // s -> ms
+                }
+                break;
+            }
+            case MBTK_ECALL_CFG_ITEM_TIMER_DEREG:
+            {
+                if((tmp_ptr = strstr(line, "deregister timer: ")) != NULL) {
+                    cfg->data = (uint32)atoi(tmp_ptr + 18);   // s
+                    cfg->data *= 1000; // s -> ms
+                }
+                break;
+            }
+            case MBTK_ECALL_CFG_ITEM_TIMER_DIAL:
+            {
+                if((tmp_ptr = strstr(line, "dial setup timer: ")) != NULL) {
+                    cfg->data = (uint32)atoi(tmp_ptr + 18);   // s
+                }
+                break;
+            }
+            case MBTK_ECALL_CFG_ITEM_TIMER_REDIAL:
+            {
+                if((tmp_ptr = strstr(line, "redial wait timer: ")) != NULL) {
+                    cfg->data = (uint32)atoi(tmp_ptr + 19);   // s
+                    cfg->data *= 1000; // s -> ms
+                }
+                break;
+            }
+            case MBTK_ECALL_CFG_ITEM_TIMER_SMS:
+            {
+                if((tmp_ptr = strstr(line, "SMS resend timer: ")) != NULL) {
+                    cfg->data = (uint32)atoi(tmp_ptr + 18);
+                    cfg->data *= 1000; // s -> ms
+                }
+                break;
+            }
+            case MBTK_ECALL_CFG_ITEM_REDIALCNT:
+            {
+                if((tmp_ptr = strstr(line, "redial attempts count: ")) != NULL) {
+                    cfg->data = (uint32)atoi(tmp_ptr + 23);
+                }
+                break;
+            }
+            case MBTK_ECALL_CFG_ITEM_SMSPROCESS:
+            {
+                if((tmp_ptr = strstr(line, "smsprocess: ")) != NULL) {
+                    cfg->data = (uint32)atoi(tmp_ptr + 12);
+                }
+                break;
+            }
+            case MBTK_ECALL_CFG_ITEM_SMSMSDCNT:
+            {
+                if((tmp_ptr = strstr(line, "sms msd send count: ")) != NULL) {
+                    cfg->data = (uint32)atoi(tmp_ptr + 20);
+                }
+                break;
+            }
+            default:
+                LOGE("Unknown config item : %d", type);
+                err = -1;
+                break;
+        }
+    }
+
+    goto exit;
+exit:
+    at_response_free(response);
+    return err;
+}
+
+/*
+AT*ECALLDATA=5,2,250
+OK
+
+AT*ECALLTIMER=dereg,300
+OK
+*/
+static int req_ecall_cfg_set(const mbtk_ecall_cfg_info_t *cfg_info, int *cme_err)
+{
+    ATResponse *response = NULL;
+    char cmd[1024] = {0};
+    int err = 0;
+
+    if(ecall_mode == MBTK_ECALL_MODE_TYPE_EU) {
+        if(cfg_info->type != MBTK_ECALL_CFG_ITEM_TIMER_CALLBACK
+            && cfg_info->type != MBTK_ECALL_CFG_ITEM_TIMER_DIAL
+            && cfg_info->type != MBTK_ECALL_CFG_ITEM_TIMER_DEREG
+            && cfg_info->type != MBTK_ECALL_CFG_ITEM_TIMER_CLEARDOWN){
+            LOGW("No support for EU.");
+            return -1;
+        }
+    }
+
+    switch(cfg_info->type)
+    {
+        case MBTK_ECALL_CFG_ITEM_T3:
+        case MBTK_ECALL_CFG_ITEM_T5:
+        case MBTK_ECALL_CFG_ITEM_T6:
+        case MBTK_ECALL_CFG_ITEM_T7:
+        case MBTK_ECALL_CFG_ITEM_TH:
+            snprintf(cmd, sizeof(cmd), "AT*ECALLDATA=5,%d,%d", cfg_info->type, cfg_info->data / 20);
+            break;
+        case MBTK_ECALL_CFG_ITEM_TIMER_CALLBACK:
+        {
+            snprintf(cmd, sizeof(cmd), "AT*ECALLTIMER=callback,%d", cfg_info->data / 1000);
+            break;
+        }
+        case MBTK_ECALL_CFG_ITEM_TIMER_CLEARDOWN:
+        {
+            snprintf(cmd, sizeof(cmd), "AT*ECALLTIMER=cleardown,%d", cfg_info->data / 1000);
+            break;
+        }
+        case MBTK_ECALL_CFG_ITEM_TIMER_DEREG:
+        {
+            snprintf(cmd, sizeof(cmd), "AT*ECALLTIMER=dereg,%d", cfg_info->data / 1000);
+            break;
+        }
+        case MBTK_ECALL_CFG_ITEM_TIMER_DIAL:
+        {
+            snprintf(cmd, sizeof(cmd), "AT*ECALLTIMER=dial,%d", cfg_info->data / 1000);
+            break;
+        }
+        case MBTK_ECALL_CFG_ITEM_TIMER_REDIAL:
+        {
+            snprintf(cmd, sizeof(cmd), "AT*ECALLTIMER=redialtmr,%d", cfg_info->data / 1000);
+            break;
+        }
+        case MBTK_ECALL_CFG_ITEM_TIMER_SMS:
+        {
+            snprintf(cmd, sizeof(cmd), "AT*ECALLTIMER=sms,%d", cfg_info->data / 1000);
+            break;
+        }
+        case MBTK_ECALL_CFG_ITEM_REDIALCNT:
+        {
+            snprintf(cmd, sizeof(cmd), "AT*ECALLTIMER=redialcnt,%d", cfg_info->data);
+            break;
+        }
+        case MBTK_ECALL_CFG_ITEM_SMSPROCESS:
+        {
+            snprintf(cmd, sizeof(cmd), "AT*ECALLTIMER=smsprocess,%d", cfg_info->data);
+            break;
+        }
+        case MBTK_ECALL_CFG_ITEM_SMSMSDCNT:
+        {
+            snprintf(cmd, sizeof(cmd), "AT*ECALLTIMER=smsmsdcnt,%d", cfg_info->data);
+            break;
+        }
+        default:
+            LOGE("Unknown config item : %d", cfg_info->type);
+            err = -1;
+            goto exit;
+    }
+
+    err = at_send_command(cmd, &response);
+    if (err < 0 || response->success == 0){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+exit:
+    at_response_free(response);
+    return err;
+}
+
+/*
+AT*ECALLMUTESPK=1
+OK
+
+*/
+static int req_ecall_spkmute_set(int mute, int *cme_err)
+{
+    ATResponse *response = NULL;
+    char cmd[100] = {0};
+    sprintf(cmd, "AT*ECALLMUTESPK=%d", mute);
+    int err = at_send_command(cmd, &response);
+    if (err < 0 || response->success == 0){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+exit:
+    at_response_free(response);
+    return err;
+}
+
+
+/*
+AT*ECALLSMSNUM?
+*ECALLSMSNUM: "18981991452"
+
+OK
+
+*/
+static int req_ecall_sms_num_get(uint8 *number, int *cme_err)
+{
+    ATResponse *response = NULL;
+    char *tmp_ptr = NULL;
+    int err = at_send_command_singleline("AT*ECALLSMSNUM?", "*ECALLSMSNUM:", &response);
+
+    if (err < 0 || response->success == 0 || !response->p_intermediates){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+    char *line = response->p_intermediates->line;
+    err = at_tok_start(&line);
+    if (err < 0)
+    {
+        goto exit;
+    }
+
+    err = at_tok_nextstr(&line, &tmp_ptr);
+    if (err < 0)
+    {
+        goto exit;
+    }
+
+    if(tmp_ptr && strlen(tmp_ptr) > 0) {
+        memcpy(number, tmp_ptr, strlen(tmp_ptr));
+    }
+
+    goto exit;
+exit:
+    at_response_free(response);
+    return err;
+}
+
+/*
+AT*ECALLSMSNUM=18981991452
+OK
+
+*/
+static int req_ecall_sms_num_set(const uint8 *number, int *cme_err)
+{
+    ATResponse *response = NULL;
+    char cmd[100] = {0};
+    sprintf(cmd, "AT*ECALLSMSNUM=%s", number);
+    int err = at_send_command(cmd, &response);
+    if (err < 0 || response->success == 0){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+exit:
+    at_response_free(response);
+    return err;
+}
+
+/*
+AT*AUDGAIN=8,1 // Set Rx voice gain = 8dB
+OK
+
+*/
+static int req_ecall_gain_set(mbtk_ecall_gain_info_t *gain, int *cme_err)
+{
+    ATResponse *response = NULL;
+    char cmd[100] = {0};
+    sprintf(cmd, "AT*AUDGAIN=%d,%d", gain->gain, gain->mode);
+    int err = at_send_command(cmd, &response);
+    if (err < 0 || response->success == 0){
+        *cme_err = at_get_cme_error(response);
+        goto exit;
+    }
+
+exit:
+    at_response_free(response);
+    return err;
+}
+
+//void net_list_free(void *data);
+// Return MBTK_INFO_ERR_SUCCESS,will call pack_error_send() to send RSP.
+// Otherwise, do not call pack_error_send().
+mbtk_info_err_enum ecall_pack_req_process(sock_client_info_t* cli_info, mbtk_info_pack_t* pack)
+{
+    mbtk_info_err_enum err = MBTK_INFO_ERR_SUCCESS;
+    int cme_err = MBTK_INFO_ERR_CME_NON;
+    switch(pack->info_id)
+    {
+        case RIL_MSG_ID_ECALL_MSDCFG_REQ:       // mbtk_ecall_msd_cfg_info_t
+        {
+            if(pack->data_len == 0 || pack->data == NULL)
+            {
+                err = MBTK_INFO_ERR_UNSUPPORTED;
+            }
+            else     // Set
+            {
+                mbtk_ecall_msd_cfg_info_t *cfg_info = (mbtk_ecall_msd_cfg_info_t*)(pack->data);
+                if(req_ecall_msdcfg(cfg_info, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                {
+                    if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                        err = MBTK_INFO_ERR_CME + cme_err;
+                    } else {
+                        err = MBTK_INFO_ERR_UNKNOWN;
+                    }
+                    LOG("AT*ECALLMSDCFG fail.");
+                }
+                else
+                {
+                    pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_MSDCFG_RSP, NULL, 0);
+                }
+            }
+            break;
+        }
+        case RIL_MSG_ID_ECALL_MSDGEN_REQ:
+        {
+            if(pack->data_len == 0 || pack->data == NULL)
+            {
+                if(req_ecall_msdgen(&cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                {
+                    if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                        err = MBTK_INFO_ERR_CME + cme_err;
+                    } else {
+                        err = MBTK_INFO_ERR_UNKNOWN;
+                    }
+                    LOG("AT*ECALLMSDGEN fail.");
+                }
+                else
+                {
+                    pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_MSDGEN_RSP, NULL, 0);
+                }
+            }
+            else     // Set
+            {
+                err = MBTK_INFO_ERR_UNSUPPORTED;
+            }
+            break;
+        }
+        case RIL_MSG_ID_ECALL_MSD_REQ: // uint8[]
+        {
+            uint8 msd[MBTK_ECALL_MSD_LEN_MAX];
+            memset(msd, 0, sizeof(msd));
+            if(pack->data_len == 0 || pack->data == NULL)
+            {
+                if(req_ecall_msd_get(msd, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                {
+                    if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                        err = MBTK_INFO_ERR_CME + cme_err;
+                    } else {
+                        err = MBTK_INFO_ERR_UNKNOWN;
+                    }
+                    LOG("Get MSD fail.");
+                }
+                else
+                {
+                    pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_MSD_RSP, msd, strlen(msd));
+                }
+            }
+            else     // Set
+            {
+                memcpy(msd, pack->data, pack->data_len);
+                if(req_ecall_msd_set(msd, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                {
+                    if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                        err = MBTK_INFO_ERR_CME + cme_err;
+                    } else {
+                        err = MBTK_INFO_ERR_UNKNOWN;
+                    }
+                    LOG("AT*ECALLMSD fail.");
+                }
+                else
+                {
+                    pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_MSD_RSP, NULL, 0);
+                }
+            }
+            break;
+        }
+        case RIL_MSG_ID_ECALL_PUSH_REQ:
+        {
+            if(pack->data_len == 0 || pack->data == NULL)
+            {
+                if(req_ecall_push(&cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                {
+                    if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                        err = MBTK_INFO_ERR_CME + cme_err;
+                    } else {
+                        err = MBTK_INFO_ERR_UNKNOWN;
+                    }
+                    LOG("AT*ECALLPUSH fail.");
+                }
+                else
+                {
+                    pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_PUSH_RSP, NULL, 0);
+                }
+            }
+            else     // Set
+            {
+                err = MBTK_INFO_ERR_UNSUPPORTED;
+            }
+            break;
+        }
+        case RIL_MSG_ID_ECALL_ONLY_REQ:     // mbtk_ecall_only_info_t
+        {
+            if(pack->data_len == 0 || pack->data == NULL)
+            {
+                mbtk_ecall_only_info_t only_info;
+                memset(&only_info, 0, sizeof(mbtk_ecall_only_info_t));
+                if(req_ecall_only_get(&only_info, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                {
+                    if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                        err = MBTK_INFO_ERR_CME + cme_err;
+                    } else {
+                        err = MBTK_INFO_ERR_UNKNOWN;
+                    }
+                    LOG("Get ecall only mode fail.");
+                }
+                else
+                {
+                    pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_ONLY_RSP, &only_info, sizeof(mbtk_ecall_only_info_t));
+                }
+            }
+            else     // Set
+            {
+                mbtk_ecall_only_info_t *only_info = (mbtk_ecall_only_info_t*)(pack->data);
+                if(req_ecall_only_set(only_info, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                {
+                    if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                        err = MBTK_INFO_ERR_CME + cme_err;
+                    } else {
+                        err = MBTK_INFO_ERR_UNKNOWN;
+                    }
+                    LOG("AT*ECALLONLY fail.");
+                }
+                else
+                {
+                    pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_ONLY_RSP, NULL, 0);
+                }
+            }
+            break;
+        }
+        case RIL_MSG_ID_ECALL_REG_REQ:  // reg <uint8>
+        {
+            if(pack->data_len == 0 || pack->data == NULL)
+            {
+                err = MBTK_INFO_ERR_UNSUPPORTED;
+            }
+            else
+            {
+                uint8 reg = pack->data[0];
+                if(req_ecall_reg_set(reg, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                {
+                    if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                        err = MBTK_INFO_ERR_CME + cme_err;
+                    } else {
+                        err = MBTK_INFO_ERR_UNKNOWN;
+                    }
+                    LOG("ecall reg(%d) fail.", reg);
+                }
+                else
+                {
+                    pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_REG_RSP, NULL, 0);
+                }
+            }
+            break;
+        }
+        case RIL_MSG_ID_ECALL_DIAL_REQ: // mbtk_ecall_dial_type_enum
+        {
+            if(pack->data_len == 0 || pack->data == NULL)
+            {
+                mbtk_ecall_dial_type_enum type;
+                if(req_ecall_dial_state_get(&type, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                {
+                    if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                        err = MBTK_INFO_ERR_CME + cme_err;
+                    } else {
+                        err = MBTK_INFO_ERR_UNKNOWN;
+                    }
+                    LOG("Get ecall type fail.");
+                }
+                else
+                {
+                    pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_DIAL_RSP, &type, sizeof(uint8));
+                }
+            }
+            else
+            {
+                mbtk_ecall_dial_type_enum type = (mbtk_ecall_dial_type_enum)pack->data[0];
+                if(req_ecall_dial_start(type, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                {
+                    if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                        err = MBTK_INFO_ERR_CME + cme_err;
+                    } else {
+                        err = MBTK_INFO_ERR_UNKNOWN;
+                    }
+                    LOG("Start ecall %d fail.", type);
+                }
+                else
+                {
+                    pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_DIAL_RSP, NULL, 0);
+                }
+            }
+            break;
+        }
+        case RIL_MSG_ID_ECALL_MODE_REQ:  // mbtk_ecall_cfg_item_enum / mbtk_ecall_cfg_info_t
+        {
+            if(pack->data_len == 0 || pack->data == NULL)
+            {
+                mbtk_ecall_mode_type_enum mode;
+                if(req_ecall_mode_get(&mode, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                {
+                    if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                        err = MBTK_INFO_ERR_CME + cme_err;
+                    } else {
+                        err = MBTK_INFO_ERR_UNKNOWN;
+                    }
+                    LOG("Get ecall mode fail.");
+                }
+                else
+                {
+                    pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_MODE_RSP, &mode, sizeof(uint8));
+                }
+            }
+            else
+            {
+                mbtk_ecall_mode_type_enum mode = (mbtk_ecall_mode_type_enum)pack->data[0];
+                if(req_ecall_mode_set(mode, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                {
+                    if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                        err = MBTK_INFO_ERR_CME + cme_err;
+                    } else {
+                        err = MBTK_INFO_ERR_UNKNOWN;
+                    }
+                    LOG("Set ecall mode %d fail.", mode);
+                }
+                else
+                {
+                    pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_MODE_RSP, NULL, 0);
+                }
+            }
+            break;
+        }
+        case RIL_MSG_ID_ECALL_CFG_REQ:  // mbtk_ecall_cfg_item_enum / mbtk_ecall_cfg_info_t
+        {
+            if(pack->data_len == 0 || pack->data == NULL)
+            {
+                err = MBTK_INFO_ERR_UNSUPPORTED;
+            }
+            else
+            {
+                if(pack->data_len == sizeof(mbtk_ecall_cfg_info_t)) { // Set
+                    mbtk_ecall_cfg_info_t *cfg_info = (mbtk_ecall_cfg_info_t*)pack->data;
+                    if(req_ecall_cfg_set(cfg_info, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                    {
+                        if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                            err = MBTK_INFO_ERR_CME + cme_err;
+                        } else {
+                            err = MBTK_INFO_ERR_UNKNOWN;
+                        }
+                        LOG("Set ecall config[%d] fail.", cfg_info->type);
+                    }
+                    else
+                    {
+                        pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_CFG_RSP, NULL, 0);
+                    }
+                } else { // Get
+                    mbtk_ecall_cfg_info_t cfg_info;
+                    memset(&cfg_info, 0, sizeof(mbtk_ecall_cfg_info_t));
+                    mbtk_ecall_cfg_item_enum type = (mbtk_ecall_cfg_item_enum)pack->data[0];
+                    if(req_ecall_cfg_get(type, &cfg_info, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                    {
+                        if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                            err = MBTK_INFO_ERR_CME + cme_err;
+                        } else {
+                            err = MBTK_INFO_ERR_UNKNOWN;
+                        }
+                        LOG("Get ecall config[%d] fail.", type);
+                    }
+                    else
+                    {
+                        pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_CFG_RSP, &cfg_info, sizeof(mbtk_ecall_cfg_info_t));
+                    }
+                }
+            }
+            break;
+        }
+        case RIL_MSG_ID_ECALL_SMS_NUM_REQ: // uint8[]
+        {
+            uint8 number[RIL_MAX_NUMBER_LEN];
+            memset(number, 0, sizeof(number));
+            if(pack->data_len == 0 || pack->data == NULL)
+            {
+                if(req_ecall_sms_num_get(number, &cme_err) || strlen(number) == 0 || cme_err != MBTK_INFO_ERR_CME_NON)
+                {
+                    if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                        err = MBTK_INFO_ERR_CME + cme_err;
+                    } else {
+                        err = MBTK_INFO_ERR_UNKNOWN;
+                    }
+                    LOG("Get ecall sms number fail.");
+                }
+                else
+                {
+                    pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_SMS_NUM_RSP, number, strlen(number));
+                }
+            }
+            else     // Set
+            {
+                memcpy(number, pack->data, pack->data_len);
+                if(req_ecall_sms_num_set(number, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                {
+                    if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                        err = MBTK_INFO_ERR_CME + cme_err;
+                    } else {
+                        err = MBTK_INFO_ERR_UNKNOWN;
+                    }
+                    LOG("Set ecall sms number fail.");
+                }
+                else
+                {
+                    pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_SMS_NUM_RSP, NULL, 0);
+                }
+            }
+            break;
+        }
+        case RIL_MSG_ID_ECALL_MUTESPK_REQ:
+        {
+            if(pack->data_len == 0 || pack->data == NULL)
+            {
+                err = MBTK_INFO_ERR_UNSUPPORTED;
+            }
+            else     // Set mute state.
+            {
+                uint8 mute = pack->data[0];
+                if(pack->data_len != sizeof(uint8) || (mute != 0 && mute != 1))
+                {
+                    err = MBTK_INFO_ERR_REQ_PARAMETER;
+                    LOG("Set spk mute parameter error.");
+                    break;
+                }
+
+                if(req_ecall_spkmute_set(mute, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                {
+                    if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                        err = MBTK_INFO_ERR_CME + cme_err;
+                    } else {
+                        err = MBTK_INFO_ERR_UNKNOWN;
+                    }
+                    LOG("Set spk mute state fail.");
+                }
+                else
+                {
+                    pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_MUTESPK_RSP, NULL, 0);
+                }
+            }
+            break;
+        }
+        case RIL_MSG_ID_ECALL_DSP_GAIN_REQ: // mbtk_ecall_gain_info_t
+        {
+            if(pack->data_len == 0 || pack->data == NULL)
+            {
+                err = MBTK_INFO_ERR_UNSUPPORTED;
+            }
+            else     // Set
+            {
+                mbtk_ecall_gain_info_t *gain_info = (mbtk_ecall_gain_info_t *)pack->data;
+                if(req_ecall_gain_set(gain_info, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                {
+                    if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                        err = MBTK_INFO_ERR_CME + cme_err;
+                    } else {
+                        err = MBTK_INFO_ERR_UNKNOWN;
+                    }
+                    LOGE("Set ecall gain fail.");
+                }
+                else
+                {
+                    pack_rsp_send(cli_info->fd, RIL_MSG_ID_ECALL_DSP_GAIN_RSP, NULL, 0);
+                }
+            }
+            break;
+        }
+        default:
+        {
+            err = MBTK_INFO_ERR_REQ_UNKNOWN;
+            LOG("Unknown request : %s", id2str(pack->info_id));
+            break;
+        }
+    }
+
+    return err;
+}
+
+
+
diff --git a/mbtk/mbtk_rild_v2/src/atchannel.c b/mbtk/mbtk_rild_v2/src/atchannel.c
index 316e62a..56b1d08 100755
--- a/mbtk/mbtk_rild_v2/src/atchannel.c
+++ b/mbtk/mbtk_rild_v2/src/atchannel.c
@@ -621,6 +621,14 @@
     }
 }
 
+typedef struct
+{
+    int cid;
+    bool act;
+    bool waitting;
+} info_cgact_wait_t;
+extern info_cgact_wait_t cgact_wait;
+
 static void *readerLoop(void *arg)
 {
     UNUSED(arg);
@@ -638,6 +646,10 @@
         if(strStartsWith(line, "MBTK_AT_READY")) {
             //handleUnsolicited(line);
             continue;
+        } else if(strStartsWith(line, "CONNECT")) {
+            if(cgact_wait.waitting && cgact_wait.act) {
+                cgact_wait.waitting = false;
+            }
         }
 
         if(isSMSUnsolicited(line))
@@ -835,7 +847,7 @@
 
     pthread_attr_init (&attr);
     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-    ret = pthread_create(&s_tid_reader, &attr, readerLoop, NULL);
+    ret = pthread_create(&s_tid_reader, &attr, readerLoop, &attr);
     if (ret < 0)
     {
         LOGE("AT thread create fail.");
@@ -843,7 +855,7 @@
     }
 
     pthread_t uart_tid_reader;
-    ret = pthread_create(&uart_tid_reader, &attr, readerUrcLoop, NULL);
+    ret = pthread_create(&uart_tid_reader, &attr, readerUrcLoop, &attr);
     if (ret < 0)
     {
         LOGE("Uart thread create fail.");
diff --git a/mbtk/test/libmbtk_ecall/mbtk_ecall_test_v1.c b/mbtk/test/libmbtk_ecall/mbtk_ecall_test_v1.c
index 0f18108..d6b2b32 100755
--- a/mbtk/test/libmbtk_ecall/mbtk_ecall_test_v1.c
+++ b/mbtk/test/libmbtk_ecall/mbtk_ecall_test_v1.c
@@ -115,6 +115,7 @@
     while(1)
     {
         memset(cmd, 0, sizeof(cmd));
+        int err;
         if(fgets(cmd, sizeof(cmd), stdin))
         {
             char *ptr = cmd + strlen(cmd) - 1;
@@ -122,8 +123,219 @@
             {
                 *ptr-- = '\0';
             }
-			
-			if(!strcasecmp(cmd, "h") || !strcasecmp(cmd, "help")) {
+
+            if(!strncasecmp(cmd, "msdcfg", 6)) // msdcfg <item> <value>
+            {
+                mbtk_ecall_msd_cfg_info_t cfg;
+                memset(&cfg, 0, sizeof(mbtk_ecall_msd_cfg_info_t));
+                int item;
+                int count = sscanf(cmd, "msdcfg %d %s", &item, cfg.data);
+                if(count == 2 && strlen(cfg.data) > 0) {
+                    cfg.item_type = (mbtk_ecall_msd_item_enum)item;
+                    err = mbtk_ecall_msd_item_set(info_handle, &cfg);
+                    if(err) {
+                        printf("Error : %d\n", err);
+                    } else {
+                        printf("MSD item set success\n");
+                    }
+                }
+            }
+            else if(!strncasecmp(cmd, "msdgen", 6)){
+                err = mbtk_ecall_msd_gen(info_handle);
+                if(err) {
+                    printf("Error : %d\n", err);
+                } else {
+                    printf("MSD gen success\n");
+                }
+            } else if(!strncasecmp(cmd, "msdpush", 7)){
+                err = mbtk_ecall_push(info_handle);
+                if(err) {
+                    printf("Error : %d\n", err);
+                } else {
+                    printf("MSD PUSH success\n");
+                }
+            } else if(!strncasecmp(cmd, "msd", 3)){ // msd <MSD>
+                uint8 msd[500] = {0};
+                if(!strcasecmp(cmd, "msd")) { // Get
+                    err = mbtk_ecall_msd_get(info_handle, msd);
+                    if(err) {
+                        printf("Error : %d\n", err);
+                    } else {
+                        printf("MSD : %s\n", msd);
+                    }
+                } else { // Set
+                    int count = sscanf(cmd, "msd %s", msd);
+                    if(count == 1 && strlen(msd) > 0) { // set
+                        err = mbtk_ecall_msd_set(info_handle, msd);
+                        if(err) {
+                            printf("Error : %d\n", err);
+                        } else {
+                            printf("MSD set success\n");
+                        }
+                    }
+                }
+            } else if(!strncasecmp(cmd, "only", 4)){ // only <0-5> <test_num> <reconfig_num>
+                mbtk_ecall_only_info_t only_info;
+                if(strcasecmp(cmd, "only") == 0) { // Get
+                    memset(&only_info, 0, sizeof(mbtk_ecall_only_info_t));
+                    err = mbtk_ecall_only_get(info_handle, &only_info);
+                    if(err) {
+                        printf("Error : %d\n", err);
+                    } else {
+                        printf("Only : active-%d,sim_type-%d,test_num-%s,reconfig_num-%s\n", only_info.active, only_info.sim_type, only_info.test_num, only_info.reconfig_num);
+                    }
+                } else { // Set
+                    memset(&only_info, 0, sizeof(mbtk_ecall_only_info_t));
+                    int tmp_int = -1;
+                    int count = sscanf(cmd, "only %d %s %s", &tmp_int, only_info.test_num, only_info.reconfig_num);
+                    if(count > 0 && tmp_int >= 0) { // set
+                        only_info.active = (mbtk_ecall_only_type_enum)tmp_int;
+                        err = mbtk_ecall_only_set(info_handle, &only_info);
+                        if(err) {
+                            printf("Error : %d\n", err);
+                        } else {
+                            printf("MSD set success\n");
+                        }
+                    }
+                }
+            } else if(!strncasecmp(cmd, "dial", 4)){ // dial <0-5>
+                mbtk_ecall_dial_type_enum type;
+                if(!strcasecmp(cmd, "dial")) { // Get
+                    err = mbtk_ecall_dial_state_get(info_handle, &type);
+                    if(err) {
+                        printf("Error : %d\n", err);
+                    } else {
+                        printf("Type : %d\n", type);
+                    }
+                } else { // Set
+                    int reset;
+                    int count = sscanf(cmd, "dial %d", &reset);
+                    if(count == 1) {
+                        err = mbtk_ecall_dial_start(info_handle, (mbtk_ecall_dial_type_enum)reset);
+                        if(err) {
+                            printf("Error : %d\n", err);
+                        } else {
+                            printf("Start ecall dial success\n");
+                        }
+                    }
+                }
+            } else if(!strncasecmp(cmd, "reg", 3)){ // reg <0/1>
+                if(!strcasecmp(cmd, "reg 0")) {
+                    err = mbtk_ecall_reg_set(info_handle, 0);
+                    if(err) {
+                        printf("Error : %d\n", err);
+                    } else {
+                        printf("Set net reg 0\n");
+                    }
+                } else if(!strcasecmp(cmd, "reg 1")) {
+                    err = mbtk_ecall_reg_set(info_handle, 1);
+                    if(err) {
+                        printf("Error : %d\n", err);
+                    } else {
+                        printf("Set net reg 1\n");
+                    }
+                }
+            } else if(!strncasecmp(cmd, "mode", 4)){ // mode EU/ERA
+                if(!strcasecmp(cmd, "mode")) {
+                    mbtk_ecall_mode_type_enum mode;
+                    err = mbtk_ecall_mode_get(info_handle, &mode);
+                    if(err) {
+                        printf("Error : %d\n", err);
+                    } else {
+                        printf("Ecall mode[%d] : %s\n", mode, mode == MBTK_ECALL_MODE_TYPE_EU ? "EU" : "ERA");
+                    }
+                } else if(!strcasecmp(cmd, "mode EU")) {
+                    err = mbtk_ecall_mode_set(info_handle, MBTK_ECALL_MODE_TYPE_EU);
+                    if(err) {
+                        printf("Error : %d\n", err);
+                    } else {
+                        printf("Set mode EU\n");
+                    }
+                } else if(!strcasecmp(cmd, "mode ERA")) {
+                    err = mbtk_ecall_mode_set(info_handle, MBTK_ECALL_MODE_TYPE_ERA);
+                    if(err) {
+                        printf("Error : %d\n", err);
+                    } else {
+                        printf("Set mode ERA\n");
+                    }
+                }
+            } else if(!strncasecmp(cmd, "cfg", 3)){ // cfg <type> <value>
+                int tmp1 = -1, tmp2 = -1;
+                int count = sscanf(cmd, "cfg %d %d", &tmp1, &tmp2);
+                mbtk_ecall_cfg_info_t cfg;
+                if(count == 1 && tmp1 >= 0) { // Get
+                    memset(&cfg, 0, sizeof(cfg));
+                    cfg.type = (mbtk_ecall_cfg_item_enum)tmp1;
+                    err = mbtk_ecall_cfg_get(info_handle, &cfg);
+                    if(err) {
+                        printf("Error : %d\n", err);
+                    } else {
+                        printf("Ecall config[%d] is %d\n", cfg.type, cfg.data);
+                    }
+                } else if(count == 2 && tmp1 >= 0 && tmp2 >= 0) { // Set
+                    memset(&cfg, 0, sizeof(cfg));
+                    cfg.type = (mbtk_ecall_cfg_item_enum)tmp1;
+                    cfg.data = (uint32)tmp2;
+                    err = mbtk_ecall_cfg_set(info_handle, &cfg);
+                    if(err) {
+                        printf("Error : %d\n", err);
+                    } else {
+                        printf("Set ecall config[%d] to %d success\n", cfg.type, cfg.data);
+                    }
+                }
+            } else if(!strncasecmp(cmd, "sms_num", 7)){ // sms_num <number>
+                uint8 number[RIL_MAX_NUMBER_LEN] = {0};
+                if(!strcasecmp(cmd, "sms_num")) { // Get
+                    err = mbtk_ecall_sms_number_get(info_handle, number);
+                    if(err) {
+                        printf("Error : %d\n", err);
+                    } else {
+                        printf("SMS number : %s\n", number);
+                    }
+                } else { // Set
+                    int count = sscanf(cmd, "sms_num %s", number);
+                    if(count == 1 && strlen(number) > 0) {
+                        err = mbtk_ecall_sms_number_set(info_handle, number);
+                        if(err) {
+                            printf("Error : %d\n", err);
+                        } else {
+                            printf("Set SMS number[%s] success\n", number);
+                        }
+                    }
+                }
+            } else if(!strncasecmp(cmd, "mute_spk", 8)){ // mute_spk <0/1>
+                if(!strcasecmp(cmd, "mute_spk 0")) {
+                    err = mbtk_ecall_mute_spk_set(info_handle, 0);
+                    if(err) {
+                        printf("Error : %d\n", err);
+                    } else {
+                        printf("Set mute spk to 0\n");
+                    }
+                } else if(!strcasecmp(cmd, "mute_spk 1")) {
+                    err = mbtk_ecall_mute_spk_set(info_handle, 1);
+                    if(err) {
+                        printf("Error : %d\n", err);
+                    } else {
+                        printf("Set mute spk to 1\n");
+                    }
+                }
+            } else if(!strncasecmp(cmd, "gain", 4)){    // gain <0/1/2> <gain>
+                int tmp1 = -1, tmp2 = -1;
+                int count = sscanf(cmd, "gain %d %d", &tmp1, &tmp2);
+                mbtk_ecall_gain_info_t gain;
+                if(count == 2 && tmp1 >= 0) { // Get
+                    memset(&gain, 0, sizeof(gain));
+                    gain.mode = (mbtk_ecall_gain_mode_enum)tmp1;
+                    gain.gain = (int8)tmp2;
+                    err = mbtk_ecall_dsp_gain_set(info_handle, &gain);
+                    if(err) {
+                        printf("Error : %d\n", err);
+                    } else {
+                        printf("Set DSP gain[%d] to %d\n", gain.mode, gain.gain);
+                    }
+                }
+            }
+            else if(!strcasecmp(cmd, "h") || !strcasecmp(cmd, "help")) {
                 help();
             } else if(!strcasecmp(cmd, "q")) {
                 break;