Baseline update from LYNQ_SDK_ASR_T108_V05.03.01.00(kernel build error.)

Change-Id: I56fc72cd096e82c589920026553170e5cb9692eb
diff --git a/mbtk/Make.defines b/mbtk/Make.defines
index 9967897..0d77ff7 100755
--- a/mbtk/Make.defines
+++ b/mbtk/Make.defines
@@ -50,7 +50,8 @@
 	-I$(BUILD_ROOT)/include/mbtk \

 	-I$(BUILD_ROOT)/include/lynq \

 	-I$(BUILD_ROOT)/include/mqtt \

-	-I$(BUILD_ROOT)/include/ql_v2

+	-I$(BUILD_ROOT)/include/ql_v2 \

+	-I$(BUILD_ROOT)/include/gsw

 

 # -DCONFIG_AB_SYSTEM

 DEFINE = \

diff --git a/mbtk/include/gsw/gsw_at.h b/mbtk/include/gsw/gsw_at.h
new file mode 100755
index 0000000..5d9c486
--- /dev/null
+++ b/mbtk/include/gsw/gsw_at.h
@@ -0,0 +1,60 @@
+/**

+ * @brief AT registered callback function

+ * @param  [in] const char *input:atcmd command

+ * @param  [out] char *output:A cache of output command execution results

+ * @param  [in] out_max_size:Output cache size

+ * @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+ */

+typedef void(*AT_CALLBACK)(char input[],char output[],int out_max_size);

+

+typedef enum

+{

+ soc_max = 0,

+ cpu0,

+ cpu1,

+ cpu2,

+ cpu3,

+ gpu0,

+ gpu1,

+ dramc,

+ mmsys,

+ md_5g,

+ md_4g,

+ md_3g,

+ soc_dram_ntc,

+ pa_5g,

+ pa_4g,

+ rf_ntc,

+ pmic,

+ pmic_vcore,

+ pmic_vpro,

+ pmic_vgpu=19,

+}ZONE_NUM;

+

+

+

+

+

+/**

+* @brief Registration interface of AT

+* @param  [in] const char *atcmd

+* @param  [in] AT_CALLBACK func

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

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

+

+/**

+ * @brief Initializes the at module in the sdk

+ * @param [in/out] None

+ * @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+ */

+int32_t gsw_sdk_at_init(void);

+

+/**

+* @brief get temperature of specify zone

+* @param  [in] ZONE_NUM num

+* @param  [out] int *temp

+* @retval RET_SUCCESS\RET_NORMAL_FAIL

+*/

+int32_t gsw_get_modem_temperture(ZONE_NUM num,int32_t *temp);

+

diff --git a/mbtk/include/gsw/gsw_gnss.h b/mbtk/include/gsw/gsw_gnss.h
new file mode 100755
index 0000000..90508f6
--- /dev/null
+++ b/mbtk/include/gsw/gsw_gnss.h
@@ -0,0 +1,184 @@
+#define MBTK_GNSS_IND_LOCATION (1)      // 1

+#define MBTK_GNSS_IND_NMEA (1 << 1)     // 2

+#define QSER_GNSS_TIMEOUT 5

+

+typedef enum{

+    GSW_SWITCH_DISABLE = 0,    /**< configuration switch disable :0 */

+    GSW_SWITCH_ENABLE          /**< configuration switch enable :1 */

+}GSW_GNSS_CONF_SWITCH;

+

+typedef enum{

+GSW_XTRA_STATE_MIN = 0,

+GSW_XTRA_STATE_DISBALE = GSW_XTRA_STATE_MIN,

+GSW_XTRA_STATE_ENABLE,

+GSW_XTRA_STATE_MAX

+}gsw_xtra_state_e;

+

+typedef enum{

+    GSW_FREQ_1HZ = 1,    /**< 1hZ */

+    GSW_FREQ_2HZ = 2,    /**< 2hZ */

+    GSW_FREQ_5HZ = 5,    /**< 5hZ */

+    GSW_FREQ_10HZ = 10,   /**< 10hZ */

+}GSW_FREQ_TYPE_T;

+

+

+

+typedef enum{

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

+    GSW_MODE_BEIDOU,                                /**< BEIDOU only*/

+    GSW_MODE_GPS_BEIDOU,                            /**< GPS+BEIDOU */

+    GSW_MODE_GLONASS,                               /**< GLONASS only */ /* The high-tech platform does not support this type */

+    GSW_MODE_GPS_GLONASS,                           /**< GPS+GLONASS */

+    GSW_MODE_GLONASS_BEIDOU,                        /**< GLONASS+BEIDOU */ /* The high-tech platform does not support this type */

+    GSW_MODE_GPS_GLONASS_BEIDOU,                    /**< GPS+GLONASS+BEIDOU */ /* The high-tech platform does not support this type */           

+    GSW_MODE_GALILEO,                               /**< GALILEO only */ 

+    GSW_MODE_GPS_GALILEO,                           /**< GPS+GALILEO */ 

+    GSW_MODE_BEIDOU_GALILEO,                        /**< BEIDOU+GALILEO */ 

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

+    GSW_MODE_GLONASS_GALILEO,                       /**< GLONASS+GALILEO */ 

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

+    GSW_MODE_BEIDOU_GLONASS_GALILEO,                /**< BEIDOU+GLONASS+GALILEO */ /* The high-tech platform does not support this type */

+}GSW_GNSS_MODE_CONFIGURATION;

+

+

+

+typedef struct

+{

+    /**< set to sizeof(GpsLocation) */

+    size_t       size;

+    /**< Contains GpsLocationFlags bits. */

+    unsigned short int     flags;

+    /**< Represents latitude in degrees. */

+    double      latitude;

+    /**< Represents longitude in degrees. */

+    double      longitude;

+    /**< Represents altitude in meters above the WGS 84 reference ellipsoid. */

+    double      altitude;

+    /**< Represents speed in meters per second. */

+    float        speed;

+    /**< Represents heading in degrees. */

+    float        bearing;

+    /**< Represents expected accuracy in meters. */

+    float        accuracy;

+    /**< Timestamp for the location fix. */

+    long long int      timestamp;

+}GSW_GNSS_LOCATION_T;

+

+typedef struct {

+    GSW_GNSS_LOCATION_T legacyLocation;

+    float           horizontalAccuracyMeters;

+    /**< Represents expected vertical position accuracy in meters

+    * (68% confidence).*/

+    float           verticalAccuracyMeters;

+    /**< Represents expected speed accuracy in meter per seconds

+    * (68% confidence).*/

+    float           speedAccuracyMetersPerSecond;

+    /**< Represents expected bearing accuracy in degrees

+    * (68% confidence).*/

+    float           bearingAccuracyDegrees;

+}GSW_GNSS_LOCATION_EXT_T;

+

+typedef void (*gsw_gnss_location_callback_ext)(GSW_GNSS_LOCATION_EXT_T* location);

+typedef void (*gsw_gnss_nmea_callback )(const char* nmea, int length);

+

+typedef struct{

+gsw_gnss_location_callback_ext gsw_location_cb;

+gsw_gnss_nmea_callback gsw_nmea_cb;

+}gsw_gnss_cb;

+

+typedef struct{

+GSW_GNSS_MODE_CONFIGURATION start_mode;

+GSW_FREQ_TYPE_T freq;

+gsw_gnss_cb callback;

+}gsw_gnss_init_configure_t;

+

+

+

+/**

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

+ * @param  [in] freq

+ * @retval 0: success

+ * @retval other: fail

+ */

+int32_t gsw_gnss_set_freq(int32_t freq);

+

+/**

+ * @brief SDK interface to initialization gnss

+ * @param 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int32_t gsw_gnss_init(void);

+

+/**

+ * @brief SDK interface to start gnss

+ * @param 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int32_t gsw_gnss_start(void);

+

+/**

+ * @brief SDK interface to stop gnss

+ * @param 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int32_t gsw_gnss_stop(void);

+

+/**

+ * @brief SDK interface to de initialization gnss

+ * @param 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int32_t gsw_gnss_deinit(void);

+

+/**

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

+ * @param  [in] start_mode 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int32_t gsw_gnss_set_start_mode(GSW_GNSS_MODE_CONFIGURATION start_mode);

+

+/**

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

+ * @param  [in] switch_op

+ * @retval 0: success

+ * @retval other: fail

+ */

+int32_t gsw_gnss_epo_switch(GSW_GNSS_CONF_SWITCH switch_op);  /* The high-tech platform does not support this type */

+

+/**

+ * @brief SDK interface to registered callback function

+ * @param [in] callback

+ * @retval 0: success

+ * @retval other: fail

+ */

+int32_t gsw_gnss_reg_cb_group(gsw_gnss_cb callback);

+

+/**

+ * @brief SDK interface to enable XTRA switch

+ * @param [in] state

+ * @retval 0: success

+ * @retval other: fail

+ */

+int32_t gsw_gnss_xtra_is_enable(gsw_xtra_state_e state);

+

+/**

+ * @brief SDK interface to delete aiding data,delete aiding data for cold start

+ * @param [in] switch_op

+ * @retval 0: success

+ * @retval other: fail

+ */

+int32_t gsw_gnss_delete_aiding_data(unsigned int flags);

+

+/**

+ * @brief init and configure gps

+ * @param [in] init_configure

+ * @retval 0: success

+ * @retval other: fail

+ */

+int32_t gsw_gnss_init_configure_gps(gsw_gnss_init_configure_t init_configure);

+

diff --git a/mbtk/include/gsw/gsw_gpio.h b/mbtk/include/gsw/gsw_gpio.h
new file mode 100755
index 0000000..e3737aa
--- /dev/null
+++ b/mbtk/include/gsw/gsw_gpio.h
@@ -0,0 +1,66 @@
+typedef enum{

+  GSW_HAL_PINDIR_IN,

+  GSW_HAL_PINDIR_OUT,

+}gsw_hal_pinDirection;

+

+typedef enum{

+  GSW_HAL_LEVEL_LOW,

+  GSW_HAL_LEVEL_HIGH,

+}gsw_hal_pinLevel;

+

+typedef enum{

+  GSW_HAL_PULL_NULL,

+  GSW_HAL_PULL_DOWN,

+  GSW_HAL_PULL_UP,

+}gsw_hal_pinPullSel;

+

+typedef enum{

+  GSW_HAL_USB_DISCONNECTED,

+  GSW_HAL_USB_CONNECTED,

+}gsw_hal_usbStatus;

+

+

+/**

+* @brief Gpio init

+* @param [in]uint32_t gpioNum

+* @param [in]gsw_hal_pinDirection dir

+* @param [in]gsw_hal_pinLevel level

+* @param [in]gsw_hal_pinPullSel pullsel

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

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

+

+

+/**

+* @brief Gpio set direction

+* @param [in]uint32_t gpioNum

+* @param [in]gsw_hal_pinDirection dir

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_gpio_SetDirection(uint32_t gpioNum, gsw_hal_pinDirection dir);

+/**

+* @brief Gpio set level

+* @param [in]uint32_t gpioNum

+* @param [in]gsw_hal_pinLevel level

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_gpio_SetLevel(uint32_t gpioNum, gsw_hal_pinLevel level);

+

+/**

+* @brief Gpio get level

+* @param [in]uint32_t gpioNum

+* @retval gsw_hal_pinLevel

+*/

+gsw_hal_pinLevel gsw_gpio_GetLevel(uint32_t gpioNum);

+

+/**

+* @brief check whether the usb is connected

+* @retval gsw_hal_usbStatus

+*/

+gsw_hal_usbStatus gsw_hwpin_is_usb_connected(void);

+

+/**

+* @brief Wakeup_out set level

+* @retval int32_t

+*/

+int32_t gsw_setWakeupLevel(gsw_hal_pinLevel level);
\ No newline at end of file
diff --git a/mbtk/include/gsw/gsw_ota.h b/mbtk/include/gsw/gsw_ota.h
new file mode 100755
index 0000000..c36c91d
--- /dev/null
+++ b/mbtk/include/gsw/gsw_ota.h
@@ -0,0 +1,163 @@
+#ifndef __GSW_OTA_UA_INTERFACE_H_

+#define __GSW_OTA_UA_INTERFACE_H_

+

+#include <stdio.h>

+#include <stdint.h>

+#include <stdbool.h>

+

+#define GSW_HAL_SUCCESS                                 (0x0000)

+#define GSW_HAL_FAIL                                    (-0x0001)

+

+

+typedef enum 

+{

+    GSW_OTA_SUCCESS,

+    GSW_OTA_FAILURE,

+    GSW_OTA_TIMEOUT,

+    GSW_OTA_INPROCESS,

+    GSW_OTA_NO_TASK

+}E_GSW_OTA_RET;

+

+typedef enum _gsw_ota_ret

+{

+    GSW_OTA_SYSTEM_A,

+    GSW_OTA_SYSTEM_B,

+}E_GSW_OTA_SYSTEM;

+

+

+typedef enum

+{

+    GSW_UPDATE_SUCCEED = 0, //update succeed

+    GSW_UPDATE_INPROGRESS,  //update in progress

+    GSW_UPDATE_BACKUP,      //A/B partition sync in progress

+    GSW_UPDATE_FAILED,      //update failed

+    GSW_UPDATE_WAITEDONE,   //update in-active part finished,not switch update part.

+    GSW_UPDATE_NEEDSYNC,    //switch update part, need sync A/B part

+    GSW_UPDATE_CANCEL       //updata cancel success

+}gsw_update_state_t;

+

+typedef enum

+{

+    GSW_UPDATE_NOERROR=0,          //升级成功

+    GSW_UPDATE_ARGUMENTERROR,      //升级程序启动参数错误

+    GSW_UPDATE_SDCARDNOEXIST,      //未挂载外置FLASH等存储设备

+    GSW_UPDATE_PACKAGENOEXIST,     //升级包不存在

+    GSW_UPDATE_UNZIPFAILED,        //解压升级包出错

+    GSW_UPDATE_PARTITIONFLUSHERROR,//写入分区出错

+    GSW_UPDATE_XMLPARSEERROR,      //解析 fotaconfig.xml 文件出错

+    GSW_UPDATE_DIFFUBIUNATTACH,    //差分升级 UBI 分区挂载异常

+    GSW_UPDATE_NOSPACELEFT,        //空间不足

+    GSW_UPDATE_FILECHECKFAILED,    //MD5 值校验失败

+    GSW_UPDATE_BSPATCHFAILED,      //bspatch 合成新文件夹失败

+    GSW_UPDATE_NOFINDPARTITION,    //待升级分区不存在

+    GSW_UPDATE_UBIVOLUMEERROR,      //差分升级,待升级 UBI 卷不存在

+    GSW_UPDATE_NOFOTACONFIGFILE,   //升级包中无 fotaconfig.xml 文件

+    GSW_UPDATE_GETOLDSOFTWAREFAILED,//读取原始版本固件失败

+    GSW_UPDATE_FILENOTEXIST,       //文件不存在

+    GSW_UPDATE_UPGRADECANCELED,    //升级或分区同步被取消

+    GSW_UPDATE_NONEEDCANCEL,       //取消升级失败

+    GSW_UPDATE_NOGOING             //升级或分区同步正在进行,不可重复操作

+}gsw_update_exit_code_t;

+

+

+typedef struct

+{

+    unsigned int percentage; //update progress0-100

+    gsw_update_state_t update_state;

+    gsw_update_exit_code_t exit_code; 

+}gsw_update_info_s;

+

+typedef struct

+{

+    gsw_update_state_t update_state;

+    uint8_t is_damaged; //TURE: damaged FALSE:no damaged

+    uint8_t damaged_partname[16];

+}gsw_system_status_s;

+

+

+/**

+* @brief Start install modem software

+* @param  [in] void* file_path

+* @param  [out] NULL

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_start_autobackup(char* file_path);

+

+/**

+* @brief check the modem update condition

+* @param  [in] NULL

+* @param  [out] NULL

+* @retval TRUE/FALSE

+*/

+bool gsw_update_modem_check_condition(void);

+

+/**

+* @brief get update modem result

+* @param  [in] NULL

+* @param  [out] NULL

+* @retval E_GSW_OTA_RET

+*/

+E_GSW_OTA_RET gsw_update_modem_result_query(void);

+

+/**

+* @brief Start install modem software

+* @param  [in] void* file_path

+* @param  [out] NULL

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_start_nobackup(char* file_path);   

+

+/**

+* @brief get current system

+* @param  [in] NULL

+* @param  [out] NULL

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+E_GSW_OTA_SYSTEM gsw_update_modem_get_system(void);

+

+/**

+* @brief cancel update

+* @param  [in] NULL

+* @param  [out] NULL

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_cancel(void);

+

+/**

+* @brief get modem update info

+* @param  [in] NULL

+* @param  [out] gsw_update_info_s 

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_get_info(gsw_update_info_s *update_info);

+

+/**

+* @brief get modem system status

+* @param  [in] NULL

+* @param  [out] gsw_system_status_s 

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_get_status(gsw_system_status_s *system_status);

+

+/**

+* @brief A/B system sync

+* @param  [in] NULL

+* @param  [out] NULL 

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_sync(void);

+

+/**

+* @brief A/B system switch

+* @param  [in] NULL

+* @param  [out] NULL 

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_switch(void);

+

+#endif

+

+

+

+

+

diff --git a/mbtk/include/gsw/gsw_pm.h b/mbtk/include/gsw/gsw_pm.h
new file mode 100755
index 0000000..9ff11cc
--- /dev/null
+++ b/mbtk/include/gsw/gsw_pm.h
@@ -0,0 +1,54 @@
+/**

+* @brief Modem wakeup callback

+* @param [in]int32_t wakeup_in

+* @retval void

+*/

+

+/* 0 -- Falling, Means wakeupin falling to wakeup the module, or wakeupout falling to wakeup mcu. */

+/* 1 -- Rising, Means  wakeupin rising to wakeup the module,  or wakeupout rising to wakeup  mcu. */

+typedef void (*GSW_PM_WAKEUPCALLBACK)(int32_t wakeup_in);

+

+

+/**

+* @brief Enable autosleep

+* @param void

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_autosleep_enable(void);

+

+/**

+* @brief Disable autosleep

+* @param void

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_autosleep_disenable(void);

+

+/**

+* @brief Init power manager module

+* @param [in]GSW_PM_WAKEUPCALLBACKHandler wakeup_callback

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_pm_sdk_init(GSW_PM_WAKEUPCALLBACK wakeup_callback);

+

+

+

+/**

+* @brief Release wake lock, enter sleep

+* @param [in]int32_t wakeup_in

+* @retval int

+*/

+int32_t gsw_pm_enter_sleep(const char *gsw_wakelock_name);

+

+/**

+* @brief Creat wakeup lock

+* @param [in]int32_t wakeup_in

+* @retval int

+*/

+int32_t gsw_pm_exit_sleep(const char *gsw_wakelock_name);

+

+/**

+* @brief Module log disk drop, used when restarting or hibernating

+* @param [in]void

+* @retval void

+*/

+void gsw_modem_log_sync(void);
\ No newline at end of file
diff --git a/mbtk/include/gsw/gsw_sim.h b/mbtk/include/gsw/gsw_sim.h
new file mode 100755
index 0000000..5e19211
--- /dev/null
+++ b/mbtk/include/gsw/gsw_sim.h
@@ -0,0 +1,111 @@
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdbool.h>
+#include <stdio.h>
+//gsw include
+#define GSW_HAL_SUCCESS 0
+#define GSW_HAL_FAIL -1
+#define GSW_HAL_MEM_INVAILD -2
+#define GSW_SIM_ICCID_LENGTH 20+1 
+#define GSW_SIM_IMSI_LENGTH 20+1 
+#define GSW_SIM_MSISDN_LENGTH 20+1
+#define GSW_SIM_IMEI_LENGTH 20+1
+
+typedef enum sim_status
+{
+    SIM_STATUS_ABSENT = 0,   /**< sim absent*/
+    SIM_STATUS_PRESENT = 1,   /**< sim present mtk as ready*/
+    SIM_STATUS_ERROR = 2,   /**< sim error*/
+    SIM_STATUS_READY = 3,   /**< sim state ready mtk no this value*/
+    SIM_STATUS_PIN = 4,     /**< pinlock status*/
+} sim_status_e_type;
+
+
+
+/**
+ * @brief sim sdk init
+ * @param  [in] token usr id define by who use
+ * @retval 0: success
+ * @retval other: fail
+ */
+int gsw_sim_sdk_init(int32_t token);
+
+
+/**
+ * @brief sim sdk deinit
+ * @param 
+ * @retval 0: success
+ * @retval other: fail
+ */
+int gsw_sim_sdk_deinit(void);
+
+/**
+ * @brief get sim state
+ * @param  [out] sim_state sim status as sim_status_e_type
+ * @retval 0: success
+ * @retval other: fail
+ */
+int gsw_get_sim_status(int32_t *sim_state);
+
+/**
+ * @brief get iccid function
+ * @param  [in] len iccid length,max is 20
+ * @param  [out] iccid return iccid from this func
+ * @retval 0: success
+ * @retval other: fail
+ */
+int gsw_get_sim_iccid(int32_t len, int8_t *iccid);
+
+/**
+ * @brief get imsi function
+ * @param  [in] len imsi length,max is 20
+ * @param  [out] iccid return imsi from this func
+ * @retval 0: success
+ * @retval other: fail
+ */
+int gsw_get_sim_imsi(int32_t len, int8_t *imsi);
+
+/**
+ * @brief get sim msisdn function
+ * @param  [in] len msisdn length,max is 20
+ * @param  [out] msisdn msisdn length,max is 20
+ * @retval 0: success
+ * @retval other: fail
+ */
+int gsw_get_sim_msisdn(int32_t len, int8_t *msisdn);
+
+/**
+ * @brief get imei function
+ * @param  [in] len imei length,max is 20
+ * @param  [out] imei return imei from this func
+ * @retval 0: success
+ * @retval other: fail
+ */
+int gsw_get_imei(int32_t len, int8_t *imei);
+
+/**
+ * @brief set sim power down
+ * @param  
+ * @retval 0: success
+ * @retval other: fail
+ */
+int gsw_set_sim_power_down(void);
+
+/**
+ * @brief set sim power up
+ * @param 
+ * @retval 0: success
+ * @retval other: fail
+ */
+int gsw_set_sim_power_up(void);
+
+/**
+ * @brief reset modem stack only, notice: after use this method, all ril sdk
+ * need restart by app, means network, sim, sms, data need deinit then init!
+ * @param  
+ * @retval 0: success
+ * @retval other: fail
+ */
+int gsw_reset_modem(void);
+
diff --git a/mbtk/include/gsw/gsw_sms.h b/mbtk/include/gsw/gsw_sms.h
new file mode 100755
index 0000000..916110c
--- /dev/null
+++ b/mbtk/include/gsw/gsw_sms.h
@@ -0,0 +1,112 @@
+#include <stdlib.h>

+#include <stdint.h>

+#include <string.h>

+#include <stdbool.h>

+

+#define GSW_HAL_SMS_ADDRESS_LEN 16

+#define GSW_HAL_SMS_RECV_CONT_MAX 1024

+#define GSW_HAL_SMS_CONTENT_LEN 1024

+#define MIN_MSM_PARAM_NUM 4

+#define MIN_IMS_MSM_PARAM_NUM 6

+#define MIN_WRITMSM_PARAM_NUM 5

+#define MSG_MAX_LEN 1024

+#define TELEPHONNUM_LEN 64

+#define STORAGSMS_MAX_SIZE 128

+#define SMSC_MAX_LEN 22

+#define SMS_NUM_MAX 255

+#define MSM_NUMBER_MAX 1024+1

+#define RES_NUM_MIN 128

+

+// gsw include

+

+#define GSW_HAL_SUCCESS 0

+#define GSW_HAL_FAIL -1

+#define GSW_HAL_MEM_INVAILD -2

+

+typedef enum gsw_hal_sms_state

+{

+    GSW_SMS_FULL_FLG,               /**< sms full flag*/

+    GSW_SMS_RECEIVED_FLG,           /**<recv new sms flag*/

+} gsw_hal_sms_state_e;

+

+typedef enum gsw_hal_sms_format

+{

+    SMS_FORMAT_GSM_7BIT        = 0,   /**< 7bit econde*/

+    SMS_FORMAT_BINARY_DATA     = 1,   /**< 8bit binary encode*/

+    SMS_FORMAT_UCS2            = 2,   /**< ucs2 encode*/

+} gsw_hal_sms_format_e;

+

+typedef struct gsw_hal_sms_date

+{

+    uint8_t   year[5];            /**< year of date*/

+    uint8_t   month[3];           /**< month of date*/

+    uint8_t   day[3];             /**< day of date*/

+    uint8_t   hour[3];            /**< hour of  time*/

+    uint8_t   minutes[3];         /**< minute of  time*/

+    uint8_t   seconds[3];         /**< second of time*/

+    uint8_t   timezone[4];        /**< timezone*/

+} gsw_hal_sms_date_s;

+

+typedef struct gsw_hal_sms_msg_type

+{

+    int8_t                  src_num[GSW_HAL_SMS_ADDRESS_LEN+1];      /**< sms phone num send msg*/

+    int8_t                  dest_num[GSW_HAL_SMS_ADDRESS_LEN + 1];   /**< sms phone num recv msg*/

+    gsw_hal_sms_format_e    content_encode;                      /**< sms content is 7bit or 8bit or Ucs2 encode*/

+    uint32_t                content_len;                         /**< sms content size*/

+    int8_t                  content[GSW_HAL_SMS_RECV_CONT_MAX + 1];  /**< sms content*/

+    gsw_hal_sms_date_s      date;                                /**< message time*/

+} gsw_hal_sms_msg_type_s;

+

+typedef void (* GSW_HAL_SMS_CALLBACK_FUN)(gsw_hal_sms_state_e state, gsw_hal_sms_msg_type_s *report_info);

+

+/**

+ * @brief SDK interface to call back sms messages

+ * @param  [in] handle_ptr 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_sms_reg_callback(GSW_HAL_SMS_CALLBACK_FUN handle_ptr);

+

+/**

+ * @brief sms sdk init

+ * @param  [in] token 

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_sms_sdk_init(int32_t token);

+

+/**

+ * @brief sms sdk deinit

+ * @param  

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_sms_sdk_deinit(void);

+

+/**

+ * @brief send sms fuction *

+ * @param  [in] phone_num dest phone num send sms

+ * @param  [in] char_set encode format for sms 0 7bit 1 binary 2 usc2

+ * @param  [in] msg sms content

+ * @param  [in] msg_len send sms length,max is 1024

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_send_sms(int8_t *phone_num, int32_t char_set, int8_t *msg, int32_t msg_len);

+

+/**

+ * @brief get smsc fuction *

+ * @param  [in] len input buf len for smsc,max is 32

+ * @param  [out] smsc address for smsc get from this func *

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_get_smsc_address(int32_t len, int8_t *smsc);

+

+/**

+ * @brief set smsc fuction

+ * @param  [out] smsc string value for smsc,max length is 32 *

+ * @retval 0: success

+ * @retval other: fail

+ */

+int gsw_set_smsc_address(const int8_t *smsc);
\ No newline at end of file
diff --git a/mbtk/include/gsw/gsw_uart.h b/mbtk/include/gsw/gsw_uart.h
new file mode 100755
index 0000000..137b80f
--- /dev/null
+++ b/mbtk/include/gsw/gsw_uart.h
@@ -0,0 +1,75 @@
+#define GSW_HAL_SUCCESS 0

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

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

+

+

+typedef enum{

+  GSW_HAL_BAUDRATE_1200=1200,

+  GSW_HAL_BAUDRATE_1800=1800,

+  GSW_HAL_BAUDRATE_4800=4800,

+  GSW_HAL_BAUDRATE_9600=9600,

+  GSW_HAL_BAUDRATE_19200=19200,

+  GSW_HAL_BAUDRATE_38400=38400,

+  GSW_HAL_BAUDRATE_57600=57600,

+  GSW_HAL_BAUDRATE_115200=115200,

+  GSW_HAL_BAUDRATE_230400=230400,

+  GSW_HAL_BAUDRATE_460800=460800,

+  GSW_HAL_BAUDRATE_500000=500000,

+  GSW_HAL_BAUDRATE_576000=576000,

+  GSW_HAL_BAUDRATE_921600=921600

+}gsw_hal_uart_baudrate;

+

+

+/**

+* @brief uart open

+* @param [in]int8_t *port

+* @param [in]gsw_hal_uart_baudrate baudrate

+* @param [in]uint32_t bits

+* @param [in]int8_t parity

+* @param [in]uint32_t stop

+* @retval int GSW_HAL_FAIL:fail other:success 

+*/

+int32_t gsw_uart_open_ex(int8_t *port, gsw_hal_uart_baudrate baudrate, uint32_t bits, int8_t parity, uint32_t stop);

+

+/**

+* @brief uart flush

+* @param [in]int32_t fd

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_uart_flush(int32_t fd);

+

+/**

+* @brief uart close

+* @param [in]int32_t fd

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_uart_close(int32_t fd);

+

+/**

+* @brief uart write

+* @param [in]int32_t fd

+* @param [in]const uint8_t *buffer

+* @param [in]uint32_t len

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_uart_write(int32_t fd, const uint8_t *buffer, uint32_t len);

+

+/**

+* @brief uart read

+* @param [in]int32_t fd

+* @param [out]uint8_t *buffer

+* @param [in]uint32_t len

+* @param [in]int32_t timout_ms

+* @retval GSW_HAL_FAIL:fail 0~len:success

+*/

+int32_t gsw_uart_read(int32_t fd, uint8_t *buffer, uint32_t len, int32_t timeout_ms);

+

+/**

+* @brief uart ioctl

+* @param [in]int32_t fd

+* @param [in]uint32_t cmd

+* @param [in]void * pvalue

+* @retval GSW_HAL_FAIL:fail 0~len:success

+*/

+int32_t gsw_uart_ioctl(int32_t fd, uint32_t cmd, void *pvalue);

+

diff --git a/mbtk/include/gsw/gsw_voice.h b/mbtk/include/gsw/gsw_voice.h
new file mode 100755
index 0000000..ef465dc
--- /dev/null
+++ b/mbtk/include/gsw/gsw_voice.h
@@ -0,0 +1,131 @@
+#include <stdlib.h>

+#include <stdint.h>

+#include <string.h>

+#include <stdbool.h>

+#include <stdio.h>

+

+// GSW includes

+#define GSW_HAL_SUCCESS 0

+#define GSW_HAL_FAIL -1

+#define GSW_HAL_MEM_INVAILD -2

+

+

+typedef int CallHandle;

+typedef enum {

+    GSW_VOICE_CALL_HOLDING = 0,

+    GSW_VOICE_CALL_DIALING,

+    GSW_VOICE_CALL_ALERTING,

+    GSW_VOICE_CALL_CONNECTED,

+    GSW_VOICE_CALL_INCOMING,

+    GSW_VOICE_CALL_WAITING,

+    GSW_VOICE_CALL_END,

+}VoiceCallState;

+

+typedef enum{

+    GSW_AUDIO_MODE_CODEC = 0,

+    GSW_AUDIO_MODE_RTP = 1,

+}AudioMode;

+

+typedef enum {

+    GSW_RTP_CLIENT = 0,

+    GSW_RTP_SERVER,

+}RTPMode;

+

+typedef void (*CallStateInd)(CallHandle, VoiceCallState);

+

+/**

+* @brief init voice sdk,and  register the status indicated callback function

+* @param  [in] CallStateInd ind: status indicated callback function

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_sdk_init(CallStateInd ind);

+

+

+/**

+* @brief set speaker_volume

+* @param  [in] int32_t volume:1(Min)-7(Max)

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_set_speaker_volume(int32_t volume);

+

+

+/**

+* @brief set audio mode

+* @param  [in] AudioMode audioMode

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_set_audio_mode(AudioMode audioMode);

+

+/**

+* @brief start a voice call

+* @param  [in] char *callNumber

+* @param  [out] CallHandle *handle

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_normal_voice_start(CallHandle *handle, const char *callNumber);

+

+/**

+* @brief answer a voice call

+* @param  [in] CallHandle handle

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_answer(CallHandle handle);

+

+/**

+* @brief hangup a voice call

+* @param  [in] CallHandle handle

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_hangup(CallHandle handle);

+

+

+/**

+* @brief set auto answer mode

+* @param  [in] int32_t mode:0-1,  0:NO(close auto answer),  1:YES(auto answer)

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_set_auto_answer_mode(int32_t mode);

+

+/**

+* @brief set rtp ip address of remote

+* @param  [in] char *ip :ip address

+* @param  [in] int32_t len: length

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_set_remote_rtp_ip(const char *ip, int32_t len);

+

+

+/**

+* @brief set rtp vlan Noneme

+* @param  [in] char *interfaceNoneme:vlan Noneme

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_set_rtp_vlan_info(const char *interfaceNoneme);

+

+

+/**

+* @brief set rtp mode and port

+* @param  [in] RTPMode rtpMode: rtp mode

+* @param  [in] int32_t port:rtp port

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_set_rtp_port(RTPMode rtpMode, int32_t port);

+

+/**

+* @brief set rtp mode and port

+* @param  [in] int32_t clockRate: clock rate

+* @param  [in] int32_t channel:channel

+* @param  [in] int32_t latency:latency

+* @param  [out] None

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_voice_set_rtp_param(int32_t clockRate, int32_t channel, int32_t latency);

diff --git a/mbtk/include/lynq/lynq_gnss.h b/mbtk/include/lynq/lynq_gnss.h
index 893f6a8..a7b738a 100755
--- a/mbtk/include/lynq/lynq_gnss.h
+++ b/mbtk/include/lynq/lynq_gnss.h
@@ -116,5 +116,6 @@
 
 int qser_Gnss_injectEphemeris(uint32_t h_gnss);
 
+int qser_Gnss_PZ90_switch(uint32_t h_gnss);
 
 #endif /* _QSER_GNSS_H */
diff --git a/mbtk/include/mbtk_device_info.h b/mbtk/include/mbtk_device_info.h
index f03303a..079990b 100755
--- a/mbtk/include/mbtk_device_info.h
+++ b/mbtk/include/mbtk_device_info.h
@@ -12,6 +12,6 @@
 
 #define MBTK_DEVICES_MODEL "LYNQ_T108"
 
-#define MBTK_DEVICES_REVISION "T108v05.04b01_V2.00"
+#define MBTK_DEVICES_REVISION "T108v05.04b01_4G.001"
 
 #endif /* MBTK_DEVICES_INFO_H */
diff --git a/mbtk/include/ql_v2/ql_tee_asymm_utils.h b/mbtk/include/ql_v2/ql_tee_asymm_utils.h
new file mode 100755
index 0000000..94d9d53
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_tee_asymm_utils.h
@@ -0,0 +1,13 @@
+#ifndef QL_TEE_ASYMM_UTILS_H
+#define QL_TEE_ASYMM_UTILS_H
+
+#include "ql_tee_service.h"
+
+ql_tee_error_t ql_rsa_genkey_args(uint64_t exponent, uint32_t bits, ql_km_key_args_t *args);
+
+ql_tee_error_t ql_ec_genkey_args(ql_km_ec_curve_t curve, ql_km_key_args_t *args);
+
+ql_tee_error_t ql_rsa_operation_args(ql_km_purpose_t purpose, ql_km_rsa_padding_t padding,
+                                     ql_km_digest_t digest, ql_km_operation_args_t *args);
+
+#endif /* QL_TEE_ASYMM_UTILS_H */
\ No newline at end of file
diff --git a/mbtk/include/ql_v2/ql_tee_service.h b/mbtk/include/ql_v2/ql_tee_service.h
new file mode 100755
index 0000000..7b724c1
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_tee_service.h
@@ -0,0 +1,306 @@
+#ifndef QL_TEE_SERVICE_H
+#define QL_TEE_SERVICE_H
+
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif // __cplusplus
+
+
+#define SINGLE_OBJ_MAX_SIZE (512 * 1024)
+#define OPERATION_BUF_MAX_SIZE 4096
+
+
+typedef enum {
+    QL_TEE_OK = 0,
+
+    QL_KM_ERROR_ROOT_OF_TRUST_ALREADY_SET = -1,
+    QL_KM_ERROR_UNSUPPORTED_PURPOSE = -2,
+    QL_KM_ERROR_INCOMPATIBLE_PURPOSE = -3,
+    QL_KM_ERROR_UNSUPPORTED_ALGORITHM = -4,
+    QL_KM_ERROR_INCOMPATIBLE_ALGORITHM = -5,
+    QL_KM_ERROR_UNSUPPORTED_KEY_SIZE = -6,
+    QL_KM_ERROR_UNSUPPORTED_BLOCK_MODE = -7,
+    QL_KM_ERROR_INCOMPATIBLE_BLOCK_MODE = -8,
+    QL_KM_ERROR_UNSUPPORTED_MAC_LENGTH = -9,
+    QL_KM_ERROR_UNSUPPORTED_PADDING_MODE = -10,
+    QL_KM_ERROR_INCOMPATIBLE_PADDING_MODE = -11,
+    QL_KM_ERROR_UNSUPPORTED_DIGEST = -12,
+    QL_KM_ERROR_INCOMPATIBLE_DIGEST = -13,
+    QL_KM_ERROR_INVALID_EXPIRATION_TIME = -14,
+    QL_KM_ERROR_INVALID_USER_ID = -15,
+    QL_KM_ERROR_INVALID_AUTHORIZATION_TIMEOUT = -16,
+    QL_KM_ERROR_UNSUPPORTED_KEY_FORMAT = -17,
+    QL_KM_ERROR_INCOMPATIBLE_KEY_FORMAT = -18,
+    QL_KM_ERROR_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM = -19,   /* For PKCS8 & PKCS12 */
+    QL_KM_ERROR_UNSUPPORTED_KEY_VERIFICATION_ALGORITHM = -20, /* For PKCS8 & PKCS12 */
+    QL_KM_ERROR_INVALID_INPUT_LENGTH = -21,
+    QL_KM_ERROR_KEY_EXPORT_OPTIONS_INVALID = -22,
+    QL_KM_ERROR_DELEGATION_NOT_ALLOWED = -23,
+    QL_KM_ERROR_KEY_NOT_YET_VALID = -24,
+    QL_KM_ERROR_KEY_EXPIRED = -25,
+    QL_KM_ERROR_KEY_USER_NOT_AUTHENTICATED = -26,
+    QL_KM_ERROR_OUTPUT_PARAMETER_NULL = -27,
+    QL_KM_ERROR_INVALID_OPERATION_HANDLE = -28,
+    QL_KM_ERROR_INSUFFICIENT_BUFFER_SPACE = -29,
+    QL_KM_ERROR_VERIFICATION_FAILED = -30,
+    QL_KM_ERROR_TOO_MANY_OPERATIONS = -31,
+    QL_KM_ERROR_UNEXPECTED_NULL_POINTER = -32,
+    QL_KM_ERROR_INVALID_KEY_BLOB = -33,
+    QL_KM_ERROR_IMPORTED_KEY_NOT_ENCRYPTED = -34,
+    QL_KM_ERROR_IMPORTED_KEY_DECRYPTION_FAILED = -35,
+    QL_KM_ERROR_IMPORTED_KEY_NOT_SIGNED = -36,
+    QL_KM_ERROR_IMPORTED_KEY_VERIFICATION_FAILED = -37,
+    QL_KM_ERROR_INVALID_ARGUMENT = -38,
+    QL_KM_ERROR_UNSUPPORTED_TAG = -39,
+    QL_KM_ERROR_INVALID_TAG = -40,
+    QL_KM_ERROR_MEMORY_ALLOCATION_FAILED = -41,
+    QL_KM_ERROR_IMPORT_PARAMETER_MISMATCH = -44,
+    QL_KM_ERROR_SECURE_HW_ACCESS_DENIED = -45,
+    QL_KM_ERROR_OPERATION_CANCELLED = -46,
+    QL_KM_ERROR_CONCURRENT_ACCESS_CONFLICT = -47,
+    QL_KM_ERROR_SECURE_HW_BUSY = -48,
+    QL_KM_ERROR_SECURE_HW_COMMUNICATION_FAILED = -49,
+    QL_KM_ERROR_UNSUPPORTED_EC_FIELD = -50,
+    QL_KM_ERROR_MISSING_NONCE = -51,
+    QL_KM_ERROR_INVALID_NONCE = -52,
+    QL_KM_ERROR_MISSING_MAC_LENGTH = -53,
+    QL_KM_ERROR_KEY_RATE_LIMIT_EXCEEDED = -54,
+    QL_KM_ERROR_CALLER_NONCE_PROHIBITED = -55,
+    QL_KM_ERROR_KEY_MAX_OPS_EXCEEDED = -56,
+    QL_KM_ERROR_INVALID_MAC_LENGTH = -57,
+    QL_KM_ERROR_MISSING_MIN_MAC_LENGTH = -58,
+    QL_KM_ERROR_UNSUPPORTED_MIN_MAC_LENGTH = -59,
+    QL_KM_ERROR_UNSUPPORTED_KDF = -60,
+    QL_KM_ERROR_UNSUPPORTED_EC_CURVE = -61,
+    QL_KM_ERROR_KEY_REQUIRES_UPGRADE = -62,
+    QL_KM_ERROR_ATTESTATION_CHALLENGE_MISSING = -63,
+    QL_KM_ERROR_KEYMASTER_NOT_CONFIGURED = -64,
+    QL_KM_ERROR_ATTESTATION_APPLICATION_ID_MISSING = -65,
+
+    QL_KM_ERROR_UNIMPLEMENTED = -100,
+    QL_KM_ERROR_VERSION_MISMATCH = -101,
+
+    QL_KM_ERROR_UNKNOWN_ERROR = -1000,
+
+    QL_SS_ERROR_GENERIC = -200,
+    QL_SS_ERROR_ACCESS_DENIED = -201,
+    QL_SS_ERROR_CANCEL = -202,
+    QL_SS_ERROR_ACCESS_CONFLICT = -203,
+    QL_SS_ERROR_EXCESS_DATA = -204,
+    QL_SS_ERROR_BAD_FORMAT = -205,
+    QL_SS_ERROR_BAD_PARAMETERS = -206,
+    QL_SS_ERROR_BAD_STATE = -207,
+    QL_SS_ERROR_ITEM_NOT_FOUND = -208,
+    QL_SS_ERROR_NOT_IMPLEMENTED = -209,
+    QL_SS_ERROR_NOT_SUPPORTED = -210,
+    QL_SS_ERROR_NO_DATA = -211,
+    QL_SS_ERROR_OUT_OF_MEMORY = -212,
+    QL_SS_ERROR_BUSY = -213,
+    QL_SS_ERROR_COMMUNICATION = -214,
+    QL_SS_ERROR_SECURITY = -215,
+    QL_SS_ERROR_SHORT_BUFFER = -216,
+    QL_SS_ERROR_EXTERNAL_CANCEL = -217,
+
+    QL_SS_ERROR_TARGET_DEAD = -2000,
+    QL_SS_ERROR_UNKNOWN_ERROR = -2001,
+} ql_tee_error_t;
+
+
+typedef enum {
+    QL_SS_SEEK_SET = 0,
+    QL_SS_SEEK_CUR = 1,
+    QL_SS_SEEK_END = 2
+} ql_ss_whence_t;
+
+
+
+typedef enum {
+    QL_KM_ALGO_RSA = 1,
+    QL_KM_ALGO_EC = 3,
+    QL_KM_ALGO_AES = 32,
+} ql_km_algo_t;
+
+typedef enum {
+    QL_KM_MODE_ECB = 1,
+    QL_KM_MODE_CBC = 2,
+    QL_KM_MODE_CTR = 3,
+    QL_KM_MODE_GCM = 32,
+} ql_km_aes_mode_t;
+
+
+typedef enum {
+    QL_KM_PAD_RSA_NONE = 1, 
+    QL_KM_PAD_RSA_OAEP = 2,
+    QL_KM_PAD_RSA_PSS = 3,
+    QL_KM_PAD_RSA_PKCS1_1_5_ENCRYPT = 4,
+    QL_KM_PAD_RSA_PKCS1_1_5_SIGN = 5,
+} ql_km_rsa_padding_t;
+
+
+typedef enum {
+    QL_KM_DIGEST_NONE = 0,
+    QL_KM_DIGEST_MD5 = 1, 
+    QL_KM_DIGEST_SHA1 = 2,
+    QL_KM_DIGEST_SHA_2_224 = 3,
+    QL_KM_DIGEST_SHA_2_256 = 4,
+    QL_KM_DIGEST_SHA_2_384 = 5,
+    QL_KM_DIGEST_SHA_2_512 = 6,
+} ql_km_digest_t;
+
+
+typedef enum {
+    QL_KM_EC_CURVE_P_224 = 0,
+    QL_KM_EC_CURVE_P_256 = 1,
+    QL_KM_EC_CURVE_P_384 = 2,
+    QL_KM_EC_CURVE_P_521 = 3,
+} ql_km_ec_curve_t;
+
+
+typedef enum {
+	QL_KM_PURPOSE_ENCRYPT = 0,    /* Usable with RSA, EC and AES keys. */
+	QL_KM_PURPOSE_DECRYPT = 1,    /* Usable with RSA, EC and AES keys. */
+	QL_KM_PURPOSE_SIGN = 2,       /* Usable with RSA, EC keys. */
+	QL_KM_PURPOSE_VERIFY = 3,     /* Usable with RSA, EC keys. */
+} ql_km_purpose_t;
+
+
+typedef struct {
+    uint8_t *key_blob;
+    uint32_t key_blob_size;
+} ql_km_key_t;
+
+
+typedef struct {
+    ql_km_algo_t algo;
+    union {
+        struct {
+            ql_km_aes_mode_t mode;
+            uint32_t bits;
+            uint32_t min_mac_len;
+        } aes_args;
+        struct {
+            uint64_t exponent;
+            uint32_t bits;
+        } rsa_args;
+        struct {
+            ql_km_ec_curve_t curve;
+        } ec_args;
+    };
+} ql_km_key_args_t;
+
+
+typedef struct {
+    uint8_t *data;
+    uint32_t data_size;
+} ql_km_blob_t;
+
+
+typedef struct {
+    ql_km_algo_t algo;
+    ql_km_purpose_t purpose;
+    uint64_t handle;
+} ql_km_operation_handle_t;
+
+
+typedef struct {
+    ql_km_algo_t algo;
+    ql_km_purpose_t purpose;
+    union {
+        struct {
+            ql_km_aes_mode_t mode;
+            ql_km_blob_t iv;
+        } aes_args;
+        struct {
+            ql_km_rsa_padding_t padding;
+            ql_km_digest_t digest;
+        } rsa_args;
+    };
+} ql_km_operation_args_t;
+
+
+/*
+ * Secure Storage APIs
+ */
+ql_tee_error_t ql_ss_initialize();
+
+void ql_ss_deinitialize();
+
+ql_tee_error_t ql_ss_open(const void *id, uint32_t id_size, uint32_t *object);
+
+ql_tee_error_t ql_ss_create(const void *id, uint32_t id_size,
+                            void *data, uint32_t data_size,
+                            uint32_t *object, bool overwrite);
+
+ql_tee_error_t ql_ss_close(uint32_t object);
+
+ql_tee_error_t ql_ss_read(uint32_t object, void *data, uint32_t data_size, uint32_t *count);
+
+ql_tee_error_t ql_ss_write(uint32_t object, void *data, uint32_t data_size);
+
+ql_tee_error_t ql_ss_seek(uint32_t object, int32_t offset, ql_ss_whence_t whence);
+
+ql_tee_error_t ql_ss_unlink(uint32_t object);
+
+ql_tee_error_t ql_ss_trunc(uint32_t object, uint32_t len);
+
+ql_tee_error_t ql_ss_rename(uint32_t object, const void *id, uint32_t id_size);
+
+ql_tee_error_t ql_ss_get_info(uint32_t object, uint32_t *obj_size, uint32_t *cur_pos);
+
+
+/*
+ * Key Master APIs
+ */
+
+ql_tee_error_t ql_km_initialize();
+
+void ql_km_deinitialize();
+
+ql_tee_error_t ql_km_gen_key(const ql_km_key_args_t *key_args, ql_km_key_t *key);
+
+ql_tee_error_t ql_km_import_key(const ql_km_key_args_t *key_args, const ql_km_blob_t *rawkey, ql_km_key_t *key);
+
+ql_tee_error_t ql_km_destroy_key(ql_km_key_t *key);
+
+ql_tee_error_t ql_km_destroy_blob(ql_km_blob_t *blob);
+
+ql_tee_error_t ql_km_operation_begin(const ql_km_key_t *key, 
+                                     ql_km_operation_args_t *op_args,
+                                     ql_km_operation_handle_t *op_handle);
+
+
+ql_tee_error_t ql_km_operation_update(ql_km_operation_handle_t *op_handle, 
+                                      uint8_t *input, uint32_t input_size,
+                                      ql_km_blob_t *output, uint32_t *consumed);
+
+/*
+ * ql_tee_error_t ql_km_operation_finish(ql_km_operation_handle_t *op_handle, 
+ *                                       uint8_t *input, uint32_t input_size, 
+ *                                       ql_km_blob_t *output);
+ * 
+ * ql_tee_error_t ql_km_operation_finish(ql_km_operation_handle_t *op_handle, 
+ *                                       uint8_t *input, uint32_t input_size, 
+ *                                       ql_km_blob_t *output, uint8_t *signature, uint32_t sig_size);
+ * 
+ */
+ql_tee_error_t ql_km_operation_finish(ql_km_operation_handle_t *op_handle, 
+                                      uint8_t *input, uint32_t input_size, 
+                                      ql_km_blob_t *output, ...);
+
+
+ql_tee_error_t ql_km_export_key(ql_km_key_t *keypair, ql_km_blob_t *pubkey);
+
+
+ql_tee_error_t ql_km_get_key_algo(ql_km_key_t *keyblob, ql_km_algo_t *algo);
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* __cplusplus */
+
+#endif /* QL_TEE_SERVICE_H */
\ No newline at end of file
diff --git a/mbtk/include/ql_v2/ql_tee_symm_utils.h b/mbtk/include/ql_v2/ql_tee_symm_utils.h
new file mode 100755
index 0000000..741024d
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_tee_symm_utils.h
@@ -0,0 +1,12 @@
+#ifndef QL_TEE_SYMM_UTILS_H
+#define QL_TEE_SYMM_UTILS_H
+
+#include "ql_tee_service.h"
+
+ql_tee_error_t ql_aes_genkey_args(ql_km_aes_mode_t mode, uint32_t bits, 
+                                  ql_km_key_args_t *args, ...);
+
+ql_tee_error_t ql_aes_operation_args(ql_km_purpose_t purpose, ql_km_aes_mode_t mode,
+                                     ql_km_blob_t *iv, ql_km_operation_args_t *args);
+
+#endif /* QL_TEE_SYMM_UTILS_H */
\ No newline at end of file
diff --git a/mbtk/liblynq_lib_rilv2/lynq_thermal.c b/mbtk/liblynq_lib_rilv2/lynq_thermal.c
index 6d0c76f..c4056d5 100755
--- a/mbtk/liblynq_lib_rilv2/lynq_thermal.c
+++ b/mbtk/liblynq_lib_rilv2/lynq_thermal.c
@@ -57,9 +57,9 @@
 /****************************API***************************************/
 int get_thermal_zone(int *numbers, int size)
 {
-    if(numbers == NULL)
+    if(numbers == NULL || size < 6)
     {
-        LOGE("[qser_thermal]: numbers is NULL!");
+        LOGE("[qser_thermal]: numbers is NULL! || size < 6! ");
         return QSER_RESULT_FAIL;
     }
     
@@ -91,7 +91,7 @@
         numbers[thermal_num] = 0;
     }
 
-    return size;
+    return 6;
 }
 /****************************API***************************************/
 
diff --git a/mbtk/libql_lib_v2_rilv2/ql_dm.c b/mbtk/libql_lib_v2_rilv2/ql_dm.c
index ddf304c..ca0bd6e 100755
--- a/mbtk/libql_lib_v2_rilv2/ql_dm.c
+++ b/mbtk/libql_lib_v2_rilv2/ql_dm.c
@@ -42,6 +42,7 @@
 #define LYNQ_AIR_PLANE_MODE_OFF     1   // at+cfun = 1
 
 
+
 #define MBTK_RILD_ERR      -1
 #define IMEI_VALID          1
 
@@ -121,7 +122,7 @@
             ql_info = QL_DM_AIR_PLANE_MODE_ON;
         }
         
-        if(mbtk_info != MBTK_RADIO_STATE_FULL_FUNC  && mbtk_info !=MBTK_RADIO_STATE_DIS_RF)
+        if(mbtk_info != MBTK_RADIO_STATE_FULL_FUNC && mbtk_info !=MBTK_RADIO_STATE_DIS_RF)
         {
             
             ql_info = QL_DM_AIR_PLANE_MODE_UNKNOWN;
@@ -290,34 +291,34 @@
 /*-----------------------------------------------------------------------------------------------*/
 int ql_dm_get_modem_state(QL_DM_MODEM_STATE_TYPE_E *modem_state)
 {
-        int ret = -1;
-        mbtk_radio_state_enum tmp_rf;
-        if(ql_info_handle == NULL)
-        {
-            LOGE("DM no init");
-            return QL_ERR_NOT_INIT;
-        }
-        ret = mbtk_radio_state_get(ql_info_handle, &tmp_rf);
-        if (ret != 0)
-        {
-            LOGE("mbtk_radio_state_get fail.");
-            return QL_ERR_FAILED;
-        }
-
-        if(tmp_rf == 0 )
-        {
-            *modem_state = QL_DM_MODEM_STATE_OFFLINE;
-        }
-        else if(tmp_rf == 1)
-        {
-            *modem_state = QL_DM_MODEM_STATE_ONLINE;
-        }
-        else
-        {
-            *modem_state = QL_DM_MODEM_STATE_UNKNOWN;
-        }
-            
-        return QL_ERR_OK;
+    int ret = -1;
+    mbtk_radio_state_enum tmp_rf;
+    if(ql_info_handle == NULL)
+    {
+        LOGE("DM no init");
+        return QL_ERR_NOT_INIT;
+    }
+    ret = mbtk_radio_state_get(ql_info_handle, &tmp_rf);
+    if (ret != 0)
+    {
+        LOGE("mbtk_radio_state_get fail.");
+        return QL_ERR_FAILED;
+    }
+    
+    if(tmp_rf == 0 )
+    {
+        *modem_state = QL_DM_MODEM_STATE_OFFLINE;
+    }
+    else if(tmp_rf == 1)
+    {
+        *modem_state = QL_DM_MODEM_STATE_ONLINE;
+    }
+    else
+    {
+        *modem_state = QL_DM_MODEM_STATE_UNKNOWN;
+    }
+        
+    return QL_ERR_OK;
 
 }
 
diff --git a/mbtk/libql_lib_v2_rilv2/ql_ecall.c b/mbtk/libql_lib_v2_rilv2/ql_ecall.c
index 0d77b7d..00b0bac 100755
--- a/mbtk/libql_lib_v2_rilv2/ql_ecall.c
+++ b/mbtk/libql_lib_v2_rilv2/ql_ecall.c
Binary files differ
diff --git a/mbtk/libql_lib_v2_rilv2/ql_tee_service.c b/mbtk/libql_lib_v2_rilv2/ql_tee_service.c
new file mode 100755
index 0000000..14d3b46
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_tee_service.c
@@ -0,0 +1,195 @@
+#include <dlfcn.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+
+#include "ql_tee_service.h"
+#include "mbtk_log.h"
+#include <tee_client_api.h>
+
+
+struct test_ctx {
+	TEEC_Context ctx;
+	TEEC_Session sess;
+};
+
+
+struct test_ctx ctx;
+
+const void *obj_id;
+uint32_t obj_size;
+
+#define lib_secure_path "/lib/libsecure_storage.so"
+static void *dlHandle_secure;
+
+
+
+
+int (*prepare_tee_session)(struct test_ctx *ctx);
+void (*terminate_tee_session)(struct test_ctx *ctx);
+TEEC_Result (*read_secure_object)(struct test_ctx *ctx, const void *id, uint32_t id_size, char *data, size_t data_len);
+TEEC_Result (*write_secure_object)(struct test_ctx *ctx, const void *id, uint32_t id_size, char *data, size_t data_len);
+TEEC_Result (*delete_secure_object)(struct test_ctx *ctx, const void *id, uint32_t id_size);
+
+
+static int tee_api_import(void)
+{
+    dlHandle_secure = dlopen(lib_secure_path, RTLD_NOW);
+    if (dlHandle_secure == NULL) 
+    {
+        return -1;
+    }
+
+    prepare_tee_session = (int (*)(struct test_ctx *ctx))dlsym(dlHandle_secure, "prepare_tee_session");
+    if (prepare_tee_session == NULL) 
+    {
+        LOGE("prepare_tee_session dlsym fail\n");
+        return -1;
+    }
+
+    terminate_tee_session = (void (*)(struct test_ctx *ctx))dlsym(dlHandle_secure, "terminate_tee_session");
+    if (terminate_tee_session == NULL) 
+    {
+        LOGE("terminate_tee_session dlsym fail\n");
+        return -1;
+    }
+
+    read_secure_object = (TEEC_Result (*)(struct test_ctx *ctx, const void *id, uint32_t id_size,char *data, size_t data_len))dlsym(dlHandle_secure, "read_secure_object");
+    if (read_secure_object == NULL) 
+    {
+        LOGE("read_secure_object dlsym fail\n");
+        return -1;
+    }
+
+    write_secure_object = (TEEC_Result (*)(struct test_ctx *ctx, const void *id, uint32_t id_size, char *data, size_t data_len))dlsym(dlHandle_secure, "write_secure_object");
+    if (write_secure_object == NULL) 
+    {
+        LOGE("write_secure_object dlsym fail\n");
+        return -1;
+    }
+
+    delete_secure_object = (TEEC_Result (*)(struct test_ctx *ctx, const void *id, uint32_t id_size))dlsym(dlHandle_secure, "delete_secure_object");
+    if (delete_secure_object == NULL) 
+    {
+        LOGE("delete_secure_object dlsym fail\n");
+        return -1;
+    }
+
+    return 0;
+}
+
+/**
+* @brief init tee sdk
+* @param  [in] None
+* @param  [out] None
+* @retval GSW_HAL_SUCCESS is success\other is fail
+*/
+ql_tee_error_t ql_ss_initialize(void)
+{
+    int32_t ret = 0;
+    ret = tee_api_import();
+    if(ret)
+    {
+	LOGE("tee_api_import fail\n");
+        return ret;
+    }
+    ret = prepare_tee_session(&ctx);
+
+    return ret;
+}
+
+void ql_ss_deinitialize(void)
+{
+    
+     terminate_tee_session(&ctx);
+
+}
+ql_tee_error_t ql_ss_open(const void *id, uint32_t id_size, uint32_t *object)
+{
+
+    obj_id = id;
+    obj_size = id_size;
+    return 0;
+}
+
+ql_tee_error_t ql_ss_close(uint32_t object)
+{
+   
+    obj_id = NULL;
+    obj_size = 0;
+    return 0;
+
+}
+
+/**
+* @brief read sensitive data from tee
+* @param  [in] char* in_obj_name :Sensitive data name
+* @param  [in] unsigned int* p_out_buf_len:The size of sensitive data output cache
+* @param  [out] char* out_buf:Cache of sensitive data output
+* @param  [out] unsigned int* p_out_buf_len:Sensitive data length
+* @retval GSW_HAL_SUCCESS is success\other is fail
+*/
+
+ql_tee_error_t ql_ss_read(uint32_t object, void *data, uint32_t data_size, uint32_t *count)
+{
+    int32_t ret = 0;
+    TEEC_Result res;
+
+    res = read_secure_object(&ctx, obj_id, obj_size, data, data_size);
+    if (res != TEEC_SUCCESS)
+    {
+	LOGE("Failed to read an object from the secure storage");
+        ret = -1;
+    }
+
+    *count = strlen(data);
+    return ret;
+}
+
+
+/**
+* @brief write sensitive data to tee
+* @param  [in] char* in_obj_name :Sensitive data name
+* @param  [in] char* in_buf:A cache for writing sensitive data
+* @param  [out] unsigned int in_buf_len:Sensitive data length
+* @retval GSW_HAL_SUCCESS is success\other is fail
+*/
+ql_tee_error_t ql_ss_write(uint32_t object, void *data, uint32_t data_size)
+{
+    int32_t ret = 0;
+    TEEC_Result res;
+    res = write_secure_object(&ctx, obj_id, obj_size, data, data_size);
+    if (res != TEEC_SUCCESS)
+    {
+	LOGE("Failed to write an object from the secure storage");
+        ret = -1;
+    }
+
+    return ret;
+}
+
+
+/**
+* @brief delete sensitive data from tee
+* @param  [in] char* in_obj_name :Sensitive data name
+* @retval GSW_HAL_SUCCESS is success\other is fail
+*/
+ql_tee_error_t ql_ss_unlink(uint32_t object)
+{
+    int32_t ret = 0;
+    TEEC_Result res;
+    res = delete_secure_object(&ctx, obj_id, obj_size);
+    if (res != TEEC_SUCCESS)
+    {
+	LOGE("Failed to delete the object: 0x%x", res);
+        ret = -1;
+    }
+
+
+    return ret;
+
+}
+
+
+
+
diff --git a/mbtk/mbtk_toolchain_config/Build.defines b/mbtk/mbtk_toolchain_config/Build.defines
new file mode 100755
index 0000000..a7c78ba
--- /dev/null
+++ b/mbtk/mbtk_toolchain_config/Build.defines
@@ -0,0 +1,43 @@
+# Common make definitions, customized for each platform

+

+# Definitions required in all program directories to compile and link

+# C programs using gcc.

+

+INC_DIR += $(addprefix -I, $(MBTK_INC_DIR))

+	

+LIB_DIR += $(addprefix -L, $(MBTK_LIB_DIR))

+

+LIBS += $(addprefix -l, $(MBTK_LIBS))

+

+CFLAGS += $(MBTK_CFLAGS)

+

+ifeq ($(MBTK_BUILD_LIB), Y)

+CFLAGS += -shared -Wl,-shared,-Bsymbolic

+endif

+

+DEFINE += $(addprefix -D, $(MBTK_DEFINE))

+

+LOCAL_SRC_FILES := $(foreach dir,$(MBTK_SRC_DIR),$(wildcard $(dir)/*.c)) $(foreach dir,$(MBTK_SRC_DIR),$(wildcard $(dir)/*.cpp))

+

+OBJS = $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(LOCAL_SRC_FILES)))

+$(info OBJS = $(OBJS))

+

+ifeq ($(MBTK_BUILD_LIB), Y)

+dtarget := $(OUT_DIR)/lib/lib$(MBTK_PROJECT_NAME).so

+else

+dtarget := $(OUT_DIR)/bin/$(MBTK_PROJECT_NAME)

+endif

+

+all: $(dtarget)

+

+$(dtarget): $(OBJS)

+	$(CC) $(CFLAGS) $(LIB_DIR) $(LIBS) $(OBJS) -o $@

+

+%.o:%.c

+	$(CC) $(CFLAGS) $(INC_DIR) $(DEFINE) -c $< -o $@

+

+%.o:%.cpp

+	$(CC) $(CFLAGS) $(INC_DIR) $(DEFINE) -c $< -o $@

+

+clean:

+	rm -f $(OBJS) $(dtarget)
\ No newline at end of file
diff --git a/mbtk/mbtk_toolchain_config/Make.defines b/mbtk/mbtk_toolchain_config/Make.defines
new file mode 100755
index 0000000..4d6a1df
--- /dev/null
+++ b/mbtk/mbtk_toolchain_config/Make.defines
@@ -0,0 +1,65 @@
+# Common make definitions, customized for each platform

+

+# Definitions required in all program directories to compile and link

+# C programs using gcc.

+

+# static / shared

+BUILD_LIB_TYPE = shared

+

+ROOT = $(BUILD_ROOT)

+OUT_DIR = $(ROOT)/out

+BUILD_TOOLCHAIN_DIR = $(ROOT)/toolchain

+LOCAL_PATH=.

+

+export STAGING_DIR=

+

+CC=$(BUILD_TOOLCHAIN_DIR)/bin/arm-openwrt-linux-gnueabi-gcc

+AR=$(BUILD_TOOLCHAIN_DIR)/bin/arm-openwrt-linux-gnueabi-ar

+

+MAKE=make

+

+$(info BUILD_LIB_TYPE=$(BUILD_LIB_TYPE))

+$(info ROOT=$(ROOT))

+$(info CC=$(CC))

+$(info AR=$(AR))

+

+# -Werror=non-virtual-dtor

+#CFLAGS= --sysroot=$(BUILD_TOOLCHAIN_DIR) -Os -pipe -rdynamic -march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -fno-caller-saves -fhonour-copts -Wno-error=unused-but-set-variable -mfloat-abi=hard -fno-exceptions -Wno-multichar -ffunction-sections -fdata-sections -funwind-tables -Wa,--noexecstack -fno-short-enums -no-canonical-prefixes -fno-canonical-system-headers -mfpu=neon -fno-builtin-sin -fno-strict-volatile-bitfields -Wno-psabi -mthumb-interwork -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith  -g -Wstrict-aliasing=2 -fgcse-after-reload -frerun-cse-after-loop -frename-registers -mthumb -fomit-frame-pointer -fno-strict-aliasing -Werror=format-security -Werror=return-type -Werror=address -Werror=sequence-point -ffunction-sections -Wl,--gc-sections -Wl,--no-undefined -Wno-sign-compare -Wno-pointer-arith

+CFLAGS_DEF = --sysroot=$(BUILD_TOOLCHAIN_DIR) -Os -pipe -rdynamic -march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -Wall -Werror -g

+

+CFLAGS_IGNORE_WARN = --sysroot=$(BUILD_TOOLCHAIN_DIR) -Os -pipe -rdynamic -march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -fno-caller-saves -fhonour-copts -Wno-error=unused-but-set-variable -mfloat-abi=hard -fno-exceptions -Wno-multichar -ffunction-sections -fdata-sections -funwind-tables -Wa,--noexecstack -fno-short-enums -no-canonical-prefixes -fno-canonical-system-headers -mfpu=neon -fno-builtin-sin -fno-strict-volatile-bitfields -Wno-psabi -mthumb-interwork -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith  -g -Wstrict-aliasing=2 -fgcse-after-reload -frerun-cse-after-loop -frename-registers -mthumb -fomit-frame-pointer -fno-strict-aliasing -Werror=format-security -Werror=return-type -Werror=address -Werror=sequence-point -ffunction-sections -Wl,--gc-sections -Wl,--no-undefined -Wno-sign-compare -Wno-pointer-arith

+

+AWK=awk

+

+#CFLAGS += -Wno-error=format-truncation -Wno-error=format-overflow= -Wno-error=stringop-overread -Wno-error=deprecated-declarations

+

+CFLAGS=$(CFLAGS_IGNORE_WARN)

+

+INC_DIR = \

+	-I$(LOCAL_PATH)/ \

+	-I$(BUILD_ROOT)/mbtk/include \

+	-I$(BUILD_ROOT)/mbtk/include/mbtk \

+	-I$(BUILD_ROOT)/mbtk/include/lynq \

+	-I$(BUILD_ROOT)/mbtk/include/mqtt \

+	-I$(BUILD_ROOT)/mbtk/include/ql_v2

+

+# -DCONFIG_AB_SYSTEM

+DEFINE = \

+	-DMBTK_SUPPORT \

+	-DMARVELL_EXTENDED \

+	-DPXA1826_AUDIO \

+	-D__USE_GNU \

+	-DNOT_DROPPED_FLAGS_TEST \

+	-DNDEBUG \

+	-UDEBUG \

+	-D_FORTIFY_SOURCE=2 \

+	-D_GNU_SOURCE

+

+# 	-L$(OUT_DIR)/lib

+LIB_DIR = \

+	-L$(BUILD_ROOT)/mbtk/lib

+

+LIBS = -lpthread -lstdc++

+

+# Common temp files to delete from each directory.

+TEMPFILES=core core.* *.o temp.* *.out

diff --git a/mbtk/mbtk_toolchain_config/Makefile b/mbtk/mbtk_toolchain_config/Makefile
new file mode 100755
index 0000000..58b0270
--- /dev/null
+++ b/mbtk/mbtk_toolchain_config/Makefile
@@ -0,0 +1,50 @@
+BUILD_ROOT = $(shell pwd)
+include Make.defines
+
+#DIRS = helloworld test_ql
+include config
+
+# (cd $$i && echo "making $$i" && $(MAKE))
+all:
+	@echo ROOT=$(ROOT)
+	@echo CC=$(CC)
+	@echo OUT_DIR=$(OUT_DIR)
+	@rm -rf $(OUT_DIR)
+	@ [ ! -d out/bin ] && mkdir -p out/bin
+	@ [ ! -d out/lib ] && mkdir -p out/lib
+	@for i in $(MBTK_BUILD_DIRS); do \
+		if [ -d $$i ];then \
+			($(MAKE) -C $$i) || exit 1; \
+		fi \
+	done
+	@echo "Success"
+
+clean:
+	@for i in $(MBTK_BUILD_DIRS); do \
+		(cd $$i && echo "Cleaning $$i" && $(MAKE) clean) || exit 1; \
+	done
+	rm -rf $(OUT_DIR)
+
+
+#SUBDIRS := $(wildcard */)
+#SUBDIRS_WITH_MAKEFILES := $(foreach dir,$(SUBDIRS),$(if $(wildcard $(dir)Makefile),$(dir),))
+# 
+#all:
+#	@echo $(ROOT)
+#	@echo $(CC)
+#	@echo $(OUT_DIR)
+#	@rm -rf $(OUT_DIR)
+#	@ [ ! -d out/bin ] && mkdir -p out/bin
+#	@ [ ! -d out/lib ] && mkdir -p out/lib
+#	@echo DIR=$(SUBDIRS_WITH_MAKEFILES)
+#	@for dir in $(SUBDIRS_WITH_MAKEFILES); do \
+#		echo "Building $$dir"; \
+#		$(MAKE) -C $$dir || exit 1; \
+#	done
+#
+#clean:
+#	@echo DIR=$(SUBDIRS_WITH_MAKEFILES)
+#	@for i in $(SUBDIRS_WITH_MAKEFILES); do \
+#		(cd $$i && echo "Cleaning $$i" && $(MAKE) clean) || exit 1; \
+#	done
+#	rm -rf $(OUT_DIR)
\ No newline at end of file
diff --git a/mbtk/mbtk_toolchain_config/ReadMe.txt b/mbtk/mbtk_toolchain_config/ReadMe.txt
new file mode 100755
index 0000000..1130180
--- /dev/null
+++ b/mbtk/mbtk_toolchain_config/ReadMe.txt
@@ -0,0 +1,13 @@
+说明:

+1、把需要编译的工程放在目录 mbtk_toolchain 下面,可以放置多个工程;

+2、配置需要编译的工程目录:

+	修改文件 config 中的变量 MBTK_BUILD_DIRS,指定要编译的工程目录,注意:如果工程存在依赖关系,请将被依赖的工程放在前面;

+3、在要编译的工程目录下创建文件 Makefile,可直接从 bin_test/lib_test 中复制;

+4、修改 Makefile ,具体见 bin_test/lib_test 中的 Makefile;

+5、执行 make 命令编译,要clean可执行: make clean

+6、编译成功后,如果是可执行文件位于 out/bin ;如果是库文件位于 out/lib

+

+

+注:平台库文件 ql_lib/lynq_lib 是开源的,代码分别位于SDK的 mbtk/libql_lib_v2_rilv2 和 mbtk/liblynq_lib_rilv2,如果修改了这部分代码可能需要重新生成编译工具链。

+	在SDK中编译完成后可执行如下命令生成上述编译工具链 : ./build.sh toolchain

+

diff --git a/mbtk/mbtk_toolchain_config/bin_test/Makefile b/mbtk/mbtk_toolchain_config/bin_test/Makefile
new file mode 100755
index 0000000..f49a76d
--- /dev/null
+++ b/mbtk/mbtk_toolchain_config/bin_test/Makefile
@@ -0,0 +1,33 @@
+BUILD_ROOT = $(shell pwd)/..
+include $(BUILD_ROOT)/Make.defines
+LOCAL_PATH=$(shell pwd)
+
+#####################################################################
+
+# 工程名(编译后生成文件名)
+MBTK_PROJECT_NAME=bin_test
+
+# 编译库文件或可执行文件(Y/N),N为编译可执行文件
+MBTK_BUILD_LIB=N
+
+# 指定代码路径,用空格分隔(不支持子目录)
+MBTK_SRC_DIR=$(LOCAL_PATH)/src
+
+# 指定依赖的头文件目录,用空格分隔
+MBTK_INC_DIR=$(LOCAL_PATH)/inc $(BUILD_ROOT)/lib_test/inc
+
+# 指定依赖的库文件目录,用空格分隔
+MBTK_LIB_DIR=$(BUILD_ROOT)/out/lib
+
+# 指定依赖的库文件,用空格分隔
+MBTK_LIBS=mbtk_lib ql_lib lib_test
+
+# 指定额外的编译选项,用空格分隔
+MBTK_CFLAGS=
+
+# 指定需要添加的宏,用空格分隔,如 MBTK_TEST_SUPPORT
+MBTK_DEFINE=
+
+
+######################################################################
+include $(BUILD_ROOT)/Build.defines
diff --git a/mbtk/mbtk_toolchain_config/bin_test/inc/helloworld.h b/mbtk/mbtk_toolchain_config/bin_test/inc/helloworld.h
new file mode 100755
index 0000000..3ba512c
--- /dev/null
+++ b/mbtk/mbtk_toolchain_config/bin_test/inc/helloworld.h
@@ -0,0 +1,6 @@
+#ifndef _HELLO_WORLD_H

+#define _HELLO_WORLD_H

+

+#define HELLO_WORLD "Hello World!"

+

+#endif /* _HELLO_WORLD_H */
\ No newline at end of file
diff --git a/mbtk/mbtk_toolchain_config/bin_test/src/main.c b/mbtk/mbtk_toolchain_config/bin_test/src/main.c
new file mode 100755
index 0000000..40f73f5
--- /dev/null
+++ b/mbtk/mbtk_toolchain_config/bin_test/src/main.c
@@ -0,0 +1,11 @@
+#include <stdio.h>
+
+#include "helloworld.h"
+#include "lib_test.h"
+
+int main(int argc, char *argv[])
+{
+	printf("%s\n", HELLO_WORLD);
+	
+	return test_at("ATI");
+}
\ No newline at end of file
diff --git a/mbtk/mbtk_toolchain_config/config b/mbtk/mbtk_toolchain_config/config
new file mode 100755
index 0000000..5f9e5ac
--- /dev/null
+++ b/mbtk/mbtk_toolchain_config/config
@@ -0,0 +1,2 @@
+# 指定需要编译的工程,如果工程存在依赖关系,请将被依赖的工程放在前面。
+MBTK_BUILD_DIRS = lib_test bin_test
diff --git a/mbtk/mbtk_toolchain_config/lib_test/Makefile b/mbtk/mbtk_toolchain_config/lib_test/Makefile
new file mode 100755
index 0000000..aa76930
--- /dev/null
+++ b/mbtk/mbtk_toolchain_config/lib_test/Makefile
@@ -0,0 +1,33 @@
+BUILD_ROOT = $(shell pwd)/..
+include $(BUILD_ROOT)/Make.defines
+LOCAL_PATH=$(shell pwd)
+
+#####################################################################
+
+# 工程名(编译后生成文件名)
+MBTK_PROJECT_NAME=lib_test
+
+# 编译库文件或可执行文件(Y/N),N为编译可执行文件
+MBTK_BUILD_LIB=Y
+
+# 指定代码路径,用空格分隔(不支持子目录)
+MBTK_SRC_DIR=$(LOCAL_PATH)/src
+
+# 指定依赖的头文件目录,用空格分隔
+MBTK_INC_DIR=$(LOCAL_PATH)/inc
+
+# 指定依赖的库文件目录,用空格分隔
+MBTK_LIB_DIR=
+
+# 指定依赖的库文件,用空格分隔
+MBTK_LIBS=mbtk_lib ql_lib
+
+# 指定额外的编译选项,用空格分隔
+MBTK_CFLAGS=
+
+# 指定需要添加的宏,用空格分隔,如 MBTK_TEST_SUPPORT
+MBTK_DEFINE=
+
+
+######################################################################
+include $(BUILD_ROOT)/Build.defines
diff --git a/mbtk/mbtk_toolchain_config/lib_test/inc/lib_test.h b/mbtk/mbtk_toolchain_config/lib_test/inc/lib_test.h
new file mode 100755
index 0000000..ddb17b2
--- /dev/null
+++ b/mbtk/mbtk_toolchain_config/lib_test/inc/lib_test.h
@@ -0,0 +1,6 @@
+#ifndef _LIB_TEST_H

+#define _LIB_TEST_H

+

+int test_at(const char *argv);

+

+#endif /* _LIB_TEST_H */
\ No newline at end of file
diff --git a/mbtk/mbtk_toolchain_config/lib_test/src/lib_test.c b/mbtk/mbtk_toolchain_config/lib_test/src/lib_test.c
new file mode 100755
index 0000000..460582c
--- /dev/null
+++ b/mbtk/mbtk_toolchain_config/lib_test/src/lib_test.c
@@ -0,0 +1,25 @@
+#include <stdio.h>
+#include "ql_atc.h"
+
+int test_at(char *argv)
+{
+    if(ql_atc_init()) {
+        printf("ql_atc_init() fail.\n");
+        return -1;
+    }
+
+    char resp[1024];
+    if(ql_atc_send(argv, resp, sizeof(resp))) {
+        printf("ql_atc_send() fail.\n");
+        return -1;
+    }
+
+    if(ql_atc_deinit()) {
+        printf("ql_atc_deinit() fail.\n");
+        return -1;
+    }
+
+    printf("RSP : %s\n", resp);
+
+    return 0;
+}
diff --git "a/mbtk/optee_test/T108_TEE_API\347\224\250\346\210\267\346\211\213\345\206\214V1.0.pdf" "b/mbtk/optee_test/T108_TEE_API\347\224\250\346\210\267\346\211\213\345\206\214V1.0.pdf"
new file mode 100755
index 0000000..53b1e28
--- /dev/null
+++ "b/mbtk/optee_test/T108_TEE_API\347\224\250\346\210\267\346\211\213\345\206\214V1.0.pdf"
Binary files differ
diff --git a/mbtk/rootfs/etc/init.d/mbtk_boot_eary b/mbtk/rootfs/etc/init.d/mbtk_boot_eary
index 07c5c9f..5bffd35 100755
--- a/mbtk/rootfs/etc/init.d/mbtk_boot_eary
+++ b/mbtk/rootfs/etc/init.d/mbtk_boot_eary
@@ -34,12 +34,12 @@
 	
 	if [ "$project" == "T108_2" ];then
 		i2cset -y -f 2 0x31 0x15 0x00
-#		mbtk_start /bin/mbtk_gnssd 8122 /dev/ttyS3 0
+		[ -e /bin/mbtk_gnssd ] && mbtk_start /bin/mbtk_gnssd 8122 /dev/ttyS3 0
 	elif [ "$project" == "L508_X6" ];then
-		mbtk_start /bin/mbtk_gnssd 5311 /dev/ttyS3 255
+		[ -e /bin/mbtk_gnssd ] && mbtk_start /bin/mbtk_gnssd 5311 /dev/ttyS3 255
 	else
 		# Only auto open gnss but not open any port.
-		mbtk_start /bin/mbtk_gnssd 5311 /dev/ttyS2 255
+		[ -e /bin/mbtk_gnssd ] && mbtk_start /bin/mbtk_gnssd 5311 /dev/ttyS2 255
 	fi
 
 	if [ "$project" == "L508_X6" -o "$project" == "L509" ]
@@ -47,11 +47,6 @@
 		#echo "$project"
 		i2cset -y -f 2 0x32 0x0d 0x00
 	fi
-
-	if [ "$project" == "T108_2" ]
-	then
-		i2cset -y -f 2 0x31 0x15 0x00
-	fi
 	echo "--mbtk eary boot end--" > /dev/kmsg
 }
 
diff --git a/mbtk/rootfs/etc/init.d/mbtk_boot_server_ready b/mbtk/rootfs/etc/init.d/mbtk_boot_server_ready
index 7d50c92..983f5fa 100755
--- a/mbtk/rootfs/etc/init.d/mbtk_boot_server_ready
+++ b/mbtk/rootfs/etc/init.d/mbtk_boot_server_ready
@@ -14,8 +14,9 @@
 	echo "--mbtk server ready boot start--" > /dev/kmsg
 
 	#mbtk_start /bin/mbtk_info_test
-	#mbtk_start /bin/mbtk_logd
-
+	mbtk_start /bin/mbtk_logd
+    # i2s ×ó¶ÔÆë´«ÊäģʽÉèÖÃÖ¸Áî
+	#ubus call audio_if config_pcmexpert "{ 'frame_format': 1, 'invert_frame' : 0, 'frame_polarity' : 1, 'bitclk_polarity' : 0, 'fsyc_shift' : 1}"
 	echo "--mbtk server ready boot end--" > /dev/kmsg
 }
 
diff --git a/mbtk/test/Mobiletek_Tester_RDIT/Makefile b/mbtk/test/Mobiletek_Tester_RDIT/Makefile
new file mode 100755
index 0000000..150ba51
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/Makefile
@@ -0,0 +1,56 @@
+BUILD_ROOT = $(shell pwd)/../..
+include $(BUILD_ROOT)/Make.defines
+
+INC_DIR += 
+
+LIB_DIR += -I.
+
+LIBS += -lmbtk_lib -llynq_lib -ldl -lprop2uci
+
+CFLAGS = $(CFLAGS_TEST)
+
+DEFINE +=
+
+LOCAL_SRC_FILES = $(wildcard *.c) $(wildcard *.cpp)
+
+LOCAL_SRC_FILES = $(wildcard src/*.c) $(wildcard src/*.cpp)
+OBJS = $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(LOCAL_SRC_FILES)))
+$(info OBJS = $(OBJS))
+
+SOURCES = main.cpp dispatch.cpp sms.cpp network.cpp data.cpp qser-voice.cpp sim.cpp
+SOURCES_TOOL = sms.cpp network.cpp data.cpp qser-voice.cpp sim.cpp dispatch.cpp socket-tool.cpp
+
+EXECUTABLE := $(OUT_DIR)/bin/Mobiletek-Tester-RDIT
+EXEC_TOOL =  $(OUT_DIR)/bin/socket-tool
+
+#EXECUTABLE := Mobiletek-Tester-RDIT
+#EXEC_TOOL := socket-tool
+
+OBJECTS=$(SOURCES:.cpp=.o)
+
+OBJECTS_TOOL=$(SOURCES_TOOL:.cpp=.o)
+
+all: $(EXECUTABLE) $(EXEC_TOOL)
+
+$(EXECUTABLE): $(OBJECTS)
+	@echo "  BIN     $@"
+	$(CC) $(CFLAGS) $(LIB_DIR) $(LIBS) $(OBJECTS) -o $@
+
+%.o:%.c
+	$(CC) $(CFLAGS) $(INC_DIR) $(LIBS) $(DEFINE) -c $< -o $@
+	
+%.o:%.cpp
+	$(CC) $(CFLAGS) $(INC_DIR) $(LIBS) $(DEFINE) -c $< -o $@
+
+$(EXEC_TOOL): $(OBJECTS_TOOL)
+	@echo "  BIN     $@"
+	$(CC) $(CFLAGS) $(LIB_DIR) $(LIBS) $(OBJECTS_TOOL) -o $@
+
+%.o:%.c
+	$(CC) $(CFLAGS) $(INC_DIR) $(LIBS) $(DEFINE) -c $< -o $@
+	
+%.o:%.cpp
+	$(CC) $(CFLAGS) $(INC_DIR) $(LIBS) $(DEFINE) -c $< -o $@
+
+clean:
+	rm -f $(OBJECTS) $(OBJECTS_TOOL) $(EXECUTABLE) $(EXEC_TOOL)
diff --git a/mbtk/test/Mobiletek_Tester_RDIT/cc.cpp b/mbtk/test/Mobiletek_Tester_RDIT/cc.cpp
new file mode 100755
index 0000000..8c5b2ad
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/cc.cpp
@@ -0,0 +1,41 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "lynq_call.h"
+#include "cc.h"
+#define TEST_RESULT "lynq_result="
+
+static int handle = 0;
+
+int init_call(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = -1;
+    int uToken = atoi(argv[1]);
+    ret = lynq_init_call(uToken);
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
+int dial_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = -1;
+    ret = lynq_call(&handle,argv[1]);
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
+int answer_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = -1;
+    ret = lynq_call_answer();
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
+int hungup_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = -1;
+    ret = lynq_call_hungup(&handle);
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
diff --git a/mbtk/test/Mobiletek_Tester_RDIT/cc.h b/mbtk/test/Mobiletek_Tester_RDIT/cc.h
new file mode 100755
index 0000000..a746002
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/cc.h
@@ -0,0 +1,4 @@
+int init_call(int argc, char *argv[], int sp_test);
+int dial_test(int argc, char *argv[], int sp_test);
+int answer_test(int argc, char *argv[], int sp_test);
+int hungup_test(int argc, char *argv[], int sp_test);
diff --git a/mbtk/test/Mobiletek_Tester_RDIT/data.cpp b/mbtk/test/Mobiletek_Tester_RDIT/data.cpp
new file mode 100755
index 0000000..e628023
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/data.cpp
@@ -0,0 +1,458 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <sys/socket.h>

+#include <netinet/in.h>

+#include <arpa/inet.h>

+#include "lynq_data.h"

+#include "lynq_qser_data.h"

+#include "data.h"

+#define TEST_RESULT "lynq_result="

+

+// int init_data(int argc, char *argv[], int sp_test)

+// {   

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int uToken = atoi(argv[1]);

+//     ret = lynq_init_data(uToken);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     return ret;

+// }

+// int deinit_data(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     ret = lynq_deinit_data();

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     return ret;

+// }

+// int setup_data_call(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int handle = atoi(argv[1]);

+

+//     ret = lynq_setup_data_call(&handle);

+    

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     printf("handle = %d\n", handle);

+//     return ret;

+// }

+// int deactivte_data_call(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int handle = atoi(argv[1]);

+

+//     ret = lynq_deactive_data_call(&handle);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     return ret;   

+// }

+// int wait_data_call(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int handle = atoi(argv[1]);

+

+//     ret = lynq_wait_data_call_state_change(&handle);

+//     printf("LYNQ_WAIT_DATA_CALL: handle = %d\n", handle);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     return ret;   

+// }

+// int setup_data_call_sp(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int flag = atoi(argv[5]);

+//     int handle = atoi(argv[1]);

+

+//     ret = lynq_setup_data_call_sp(&handle, argv[2], argv[3], NULL, NULL, NULL, argv[4], NULL);

+    

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     printf("handle = %d\n", handle);

+//     return ret;

+// }

+// int get_data_call_list(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int handle = atoi(argv[1]);

+//     lynq_data_call_response_v11_t dataCallList = {-1, -1, -1, -1,"", "", "", "", "", "", -1};

+

+//     ret = lynq_get_data_call_list(&handle, &dataCallList);

+

+//     printf("LYNQ_GET_DATA_CALL_LIST: handle = %d\n", handle);

+//     printf("LYNQ_GET_DATA_CALL_LIST: status=%d, suggestedRetryTime=%d, cid=%d, active=%d, type=%s, ifname=%s, addresses=%s, dnses=%s, gateways=%s, pcscf=%s, mtu=%d\n",

+//         dataCallList.status, dataCallList.suggestedRetryTime, dataCallList.cid, dataCallList.active, 

+//         dataCallList.type, dataCallList.ifname, dataCallList.addresses, dataCallList.dnses, dataCallList.gateways, dataCallList.pcscf, 

+//         dataCallList.mtu);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     return ret;  

+// }

+//=====================================QSER-DATA=========================================================

+

+qser_data_call_state_s state = {0};

+void evt_cb(qser_data_call_state_s *state)

+{

+    char buf_ip[64] = {0};

+    char buf_gateway[64] = {0};

+    char buf_pri_dns[64] = {0};

+    char buf_sec_dns[64] = {0};

+    printf("LYNQ_QSER_DATA_INIT: profile_idx=%d, name=%s, ip_family=%d, state=%d, error=%d\n"

+        , state->profile_idx, state->name, state->ip_family, state->state, state->err);

+    printf("LYNQ_QSER_DATA_INIT: v4.ip=%s\n"

+        , inet_ntoa(state->v4.ip));

+    printf("LYNQ_QSER_DATA_INIT: v4.gateway=%s\n"

+        , inet_ntoa(state->v4.gateway));

+    printf("LYNQ_QSER_DATA_INIT: v4.pri_dns=%s\n"

+        , inet_ntoa(state->v4.pri_dns));

+    printf("LYNQ_QSER_DATA_INIT: v4.sec_dns=%s\n"

+        , inet_ntoa(state->v4.sec_dns));

+    inet_ntop(AF_INET6, &(state->v6.ip), buf_ip, sizeof(buf_ip));

+    inet_ntop(AF_INET6, &(state->v6.gateway), buf_gateway, sizeof(buf_gateway));

+    inet_ntop(AF_INET6, &(state->v6.pri_dns), buf_pri_dns, sizeof(buf_pri_dns));

+    inet_ntop(AF_INET6, &(state->v6.sec_dns), buf_sec_dns, sizeof(buf_sec_dns));

+    printf("LYNQ_QSER_DATA_INIT: v6.ip=%s, v6.gateway=%s, v6.pri_dns=%s, v6.sec_dns=%s\n"

+        , buf_ip, buf_gateway, buf_pri_dns, buf_sec_dns);

+}

+

+int qser_init_data(int argc, char *argv[], int sp_test)

+{   

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+    int ret = -1;

+    int uToken = atoi(argv[1]);

+    ret = qser_data_call_init(evt_cb);

+    printf("%s%d\n",TEST_RESULT,ret);

+    return ret;

+}

+

+int qser_deinit_data(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+

+    qser_data_call_destroy();

+    printf("LYNQ_QSER_DATA_DEINIT end\n");

+    return 0;

+}

+int qser_setup_data_call(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+    int ret = -1;

+    qser_data_call_s datacall;

+    qser_data_call_error_e err = QSER_DATA_CALL_ERROR_NONE;

+    int ip_family_flag = atoi(argv[3]);

+

+    datacall.profile_idx = atoi(argv[1]);

+    datacall.reconnect = (bool)atoi(argv[2]);

+

+    if(strcmp(argv[3], "QSER_DATA_CALL_TYPE_IPV4") == 0)

+    {

+        datacall.ip_family = QSER_DATA_CALL_TYPE_IPV4;

+    }

+    else if(strcmp(argv[3], "QSER_DATA_CALL_TYPE_IPV6") == 0)

+    {

+        datacall.ip_family = QSER_DATA_CALL_TYPE_IPV6;

+    }

+    else if(strcmp(argv[3], "QSER_DATA_CALL_TYPE_IPV4V6") == 0)

+    {

+        datacall.ip_family = QSER_DATA_CALL_TYPE_IPV4V6;

+    }

+    else

+    {

+        printf("LYNQ_QSER_SETUP_DATA_CALL: ip_family input error\n");

+        return ret;

+    }

+

+    memcpy(datacall.cdma_username, argv[4], QSER_APN_USERNAME_SIZE);

+    memcpy(datacall.cdma_password, argv[5], QSER_APN_PASSWORD_SIZE);    

+    

+    ret = qser_data_call_start(&datacall, &err);

+    printf("LYNQ_QSER_SETUP_DATA_CALL err = %d\n", err);

+    printf("%s%d\n",TEST_RESULT,ret);

+    return ret;

+}

+int qser_setup_data_call_async(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+    int ret = -1;

+    qser_data_call_s datacall;

+    qser_data_call_error_e err = QSER_DATA_CALL_ERROR_NONE;

+    int ip_family_flag = atoi(argv[3]);

+

+    datacall.profile_idx = atoi(argv[1]);

+    datacall.reconnect = (bool)atoi(argv[2]);

+

+    if(strcmp(argv[3], "QSER_DATA_CALL_TYPE_IPV4") == 0)

+    {

+        datacall.ip_family = QSER_DATA_CALL_TYPE_IPV4;

+    }

+    else if(strcmp(argv[3], "QSER_DATA_CALL_TYPE_IPV6") == 0)

+    {

+        datacall.ip_family = QSER_DATA_CALL_TYPE_IPV6;

+    }

+    else if(strcmp(argv[3], "QSER_DATA_CALL_TYPE_IPV4V6") == 0)

+    {

+        datacall.ip_family = QSER_DATA_CALL_TYPE_IPV4V6;

+    }

+    else

+    {

+        printf("LYNQ_QSER_SETUP_DATA_CALL_ASYNC: ip_family input error\n");

+        return ret;

+    }

+

+    memcpy(datacall.cdma_username, argv[4], QSER_APN_USERNAME_SIZE);

+    memcpy(datacall.cdma_password, argv[5], QSER_APN_PASSWORD_SIZE);    

+    

+    ret = qser_data_call_start_async(&datacall, &err);

+    printf("LYNQ_QSER_SETUP_DATA_CALL_ASYNC err = %d\n", err);

+    printf("%s%d\n",TEST_RESULT,ret);

+    return ret;

+}

+int qser_deactivte_data_call(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+    int ret = -1;

+    int profile_idx_int = atoi(argv[1]);

+    qser_data_call_ip_family_e ip_family = QSER_DATA_CALL_TYPE_IPV4V6;

+    qser_data_call_error_e err = QSER_DATA_CALL_ERROR_NONE;

+

+    if(strcmp(argv[2], "QSER_DATA_CALL_TYPE_IPV4") == 0)

+    {

+        ip_family = QSER_DATA_CALL_TYPE_IPV4;

+    }

+    else if(strcmp(argv[2], "QSER_DATA_CALL_TYPE_IPV6") == 0)

+    {

+        ip_family = QSER_DATA_CALL_TYPE_IPV6;

+    }

+    else if(strcmp(argv[2], "QSER_DATA_CALL_TYPE_IPV4V6") == 0)

+    {

+        ip_family = QSER_DATA_CALL_TYPE_IPV4V6;

+    }

+    else

+    {

+        printf("LYNQ_QSER_DEACTIVATE_DATA_CALL: ip_family input error\n");

+        return ret;

+    }

+

+    ret = qser_data_call_stop(profile_idx_int, ip_family, &err);

+    printf("LYNQ_QSER_DEACTIVATE_DATA_CALL err = %d\n", err);

+    printf("%s%d\n",TEST_RESULT,ret);

+    return ret;

+}

+int qser_get_data_call_list(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+    int ret = -1;

+    char buf_ip[64] = {0};

+    char buf_gateway[64] = {0};

+    char buf_pri_dns[64] = {0};

+    char buf_sec_dns[64] = {0};

+    qser_data_call_info_s info = {0};

+    int profile_idx_int = atoi(argv[1]);

+    qser_data_call_error_e err = QSER_DATA_CALL_ERROR_NONE;

+    qser_data_call_ip_family_e ip_family = QSER_DATA_CALL_TYPE_IPV4V6;

+

+    if(strcmp(argv[2], "QSER_DATA_CALL_TYPE_IPV4") == 0)

+    {

+        ip_family = QSER_DATA_CALL_TYPE_IPV4;

+    }

+    else if(strcmp(argv[2], "QSER_DATA_CALL_TYPE_IPV6") == 0)

+    {

+        ip_family = QSER_DATA_CALL_TYPE_IPV6;

+    }

+    else if(strcmp(argv[2], "QSER_DATA_CALL_TYPE_IPV4V6") == 0)

+    {

+        ip_family = QSER_DATA_CALL_TYPE_IPV4V6;

+    }

+    else

+    {

+        printf("LYNQ_QSER_GET_DATA_CALL_LIST: ip_family input error\n");

+        return ret;

+    }

+    

+    ret = qser_data_call_info_get(profile_idx_int, ip_family, &info, &err);

+    printf("%s%d\n",TEST_RESULT,ret);

+    printf("LYNQ_QSER_GET_DATA_CALL_LIST: error=%d, profile_idx=%d, ip_family=%d\n", err, info.profile_idx, info.ip_family);

+    printf("LYNQ_QSER_GET_DATA_CALL_LIST: v4.name=%s, v4.state=%d, v4.reconnect=%d\n", info.v4.name, info.v4.state, info.v4.reconnect);

+    printf("LYNQ_QSER_GET_DATA_CALL_LIST: v4.ip=%s\n"

+        , inet_ntoa(info.v4.addr.ip));

+    printf("LYNQ_QSER_GET_DATA_CALL_LIST: v4.gateway=%s\n"

+        , inet_ntoa(info.v4.addr.gateway));

+    printf("LYNQ_QSER_GET_DATA_CALL_LIST: v4.pri_dns=%s\n"

+        , inet_ntoa(info.v4.addr.pri_dns));

+    printf("LYNQ_QSER_GET_DATA_CALL_LIST: v4.sec_dns=%s\n"

+        , inet_ntoa(info.v4.addr.sec_dns));

+

+    printf("LYNQ_QSER_GET_DATA_CALL_LIST: v6.name=%s, v6.state=%d, v6.reconnect=%d\n", info.v6.name, info.v6.state, info.v6.reconnect);

+    inet_ntop(AF_INET6, &(info.v6.addr.ip), buf_ip, sizeof(buf_ip));

+    inet_ntop(AF_INET6, &(info.v6.addr.gateway), buf_gateway, sizeof(buf_gateway));

+    inet_ntop(AF_INET6, &(info.v6.addr.pri_dns), buf_pri_dns, sizeof(buf_pri_dns));

+    inet_ntop(AF_INET6, &(info.v6.addr.sec_dns), buf_sec_dns, sizeof(buf_sec_dns));

+    printf("LYNQ_QSER_GET_DATA_CALL_LIST: v6.ip=%s, v6.gateway=%s, v6.pri_dns=%s, v6.sec_dns=%s\n"

+        , buf_ip, buf_gateway, buf_pri_dns, buf_sec_dns);

+    return ret;

+}

+

+int lynq_qser_apn_set(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+    int ret = -1;

+    qser_apn_info_s apn = {'1', QSER_APN_PDP_TYPE_IPV4V6, QSER_APN_AUTH_PROTO_DEFAULT, NULL, NULL, NULL, NULL};

+

+    apn.profile_idx = atoi(argv[1]);

+    //set pdptype

+    if(strcmp(argv[2], "QSER_APN_PDP_TYPE_IPV4") == 0)

+    {

+        apn.pdp_type = QSER_APN_PDP_TYPE_IPV4;

+    }

+    else if(strcmp(argv[2], "QSER_APN_PDP_TYPE_PPP") == 0)

+    {

+        apn.pdp_type = QSER_APN_PDP_TYPE_PPP;

+    }

+    else if(strcmp(argv[2], "QSER_APN_PDP_TYPE_IPV6") == 0)

+    {

+        apn.pdp_type = QSER_APN_PDP_TYPE_IPV6;

+    }

+    else if(strcmp(argv[2], "QSER_APN_PDP_TYPE_IPV4V6") == 0)

+    {

+        apn.pdp_type = QSER_APN_PDP_TYPE_IPV4V6;

+    }

+    else

+    {

+        printf("LYNQ_QSER_APN_SET: pdp_type input error\n");

+        return ret;

+    }

+    //set auth_proto

+    if(strcmp(argv[3], "QSER_APN_AUTH_PROTO_DEFAULT") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_DEFAULT;

+    }

+    else if(strcmp(argv[3], "QSER_APN_AUTH_PROTO_NONE") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_NONE;

+    }

+    else if(strcmp(argv[3], "QSER_APN_AUTH_PROTO_PAP") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_PAP;

+    }

+    else if(strcmp(argv[3], "QSER_APN_AUTH_PROTO_CHAP") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_CHAP;

+    }

+    else if(strcmp(argv[3], "QSER_APN_AUTH_PROTO_PAP_CHAP") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_PAP_CHAP;

+    }

+    else

+    {

+        printf("LYNQ_QSER_APN_SET: auth_proto input error\n");

+        return ret;

+    }

+    memcpy(apn.apn_name,argv[4],QSER_APN_NAME_SIZE);

+    memcpy(apn.username,argv[5],QSER_APN_USERNAME_SIZE);

+    memcpy(apn.password,argv[6],QSER_APN_PASSWORD_SIZE);

+    memcpy(apn.apn_type,argv[7],QSER_APN_NAME_SIZE);

+    ret = qser_apn_set(&apn);

+    printf("%s%d\n",TEST_RESULT,ret);

+    return ret;

+}

+int lynq_qser_apn_get(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+    int ret = -1;

+    qser_apn_info_s apn = {0};

+    int profile_idx_int = atoi(argv[1]);

+    ret = qser_apn_get(profile_idx_int, &apn);

+    printf("%s%d\n",TEST_RESULT,ret);

+    printf("LYNQ_QSER_APN_GET: pdp_type=%d, auth_proto=%d, apn_name=%s, username=%s, password=%s, apn_type=%s\n"

+        ,apn.pdp_type, apn.auth_proto, apn.apn_name, apn.username, apn.password, apn.apn_type);

+    return ret;

+}

+int lynq_qser_apn_add(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+    int ret = -1;

+    unsigned char profile_idx_char;

+    qser_apn_add_s apn = {QSER_APN_PDP_TYPE_IPV4V6, QSER_APN_AUTH_PROTO_DEFAULT, "cmnet", NULL, NULL, NULL};

+

+    if(strcmp(argv[1], "QSER_APN_PDP_TYPE_IPV4") == 0)

+    {

+        apn.pdp_type = QSER_APN_PDP_TYPE_IPV4;

+    }

+    else if(strcmp(argv[1], "QSER_APN_PDP_TYPE_PPP") == 0)

+    {

+        apn.pdp_type = QSER_APN_PDP_TYPE_PPP;

+    }

+    else if(strcmp(argv[1], "QSER_APN_PDP_TYPE_IPV6") == 0)

+    {

+        apn.pdp_type = QSER_APN_PDP_TYPE_IPV6;

+    }

+    else if(strcmp(argv[1], "QSER_APN_PDP_TYPE_IPV4V6") == 0)

+    {

+        apn.pdp_type = QSER_APN_PDP_TYPE_IPV4V6;

+    }

+    else

+    {

+        printf("LYNQ_QSER_APN_ADD: pdp_type input error\n");

+        return ret;

+    }

+    //set auth_proto

+    if(strcmp(argv[2], "QSER_APN_AUTH_PROTO_DEFAULT") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_DEFAULT;

+    }

+    else if(strcmp(argv[2], "QSER_APN_AUTH_PROTO_NONE") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_NONE;

+    }

+    else if(strcmp(argv[2], "QSER_APN_AUTH_PROTO_PAP") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_PAP;

+    }

+    else if(strcmp(argv[2], "QSER_APN_AUTH_PROTO_CHAP") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_CHAP;

+    }

+    else if(strcmp(argv[2], "QSER_APN_AUTH_PROTO_PAP_CHAP") == 0)

+    {

+        apn.auth_proto = QSER_APN_AUTH_PROTO_PAP_CHAP;

+    }

+    else

+    {

+        printf("LYNQ_QSER_APN_ADD: auth_proto input error\n");

+        return ret;

+    }

+

+    memcpy(apn.apn_name,argv[3],QSER_APN_NAME_SIZE);

+    memcpy(apn.username,argv[4],QSER_APN_USERNAME_SIZE);

+    memcpy(apn.password,argv[5],QSER_APN_PASSWORD_SIZE);

+    memcpy(apn.apn_type,argv[6],QSER_APN_NAME_SIZE);

+

+    printf("LYNQ_QSER_APN_ADD: ready to qser_apn_add\n");

+    ret = qser_apn_add(&apn, &profile_idx_char);

+    printf("%s%d,profile = %d\n",TEST_RESULT,ret,profile_idx_char);

+    return ret;

+}

+int lynq_qser_apn_del(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+    int ret = -1;

+    int profile_idx_int = atoi(argv[1]);

+    ret = qser_apn_del(profile_idx_int);

+    printf("%s%d\n",TEST_RESULT,ret);

+    return ret;

+}

+int lynq_qser_apn_get_list(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+    int ret = -1;

+    qser_apn_info_list_s apn_list = {0};

+    ret = qser_apn_get_list(&apn_list);

+    printf("%s%d\n",TEST_RESULT,ret);

+    for(int i = 0; i < apn_list.cnt; i++)

+    {

+        printf("LYNQ_QSER_APN_GET_LIST: profile_idx=%d, pdp_type=%d, auth_proto=%d, apn_name=%s, username=%s, password=%s, apn_type=%s\n"

+            ,apn_list.apn[i].profile_idx, apn_list.apn[i].pdp_type, apn_list.apn[i].auth_proto, apn_list.apn[i].apn_name, apn_list.apn[i].username, apn_list.apn[i].password, apn_list.apn[i].apn_type);

+    }

+    return ret;

+}

diff --git a/mbtk/test/Mobiletek_Tester_RDIT/data.h b/mbtk/test/Mobiletek_Tester_RDIT/data.h
new file mode 100755
index 0000000..33364fb
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/data.h
@@ -0,0 +1,19 @@
+//DATA

+int init_data(int argc, char *argv[], int sp_test);

+int deinit_data(int argc, char *argv[], int sp_test);

+int setup_data_call(int argc, char *argv[], int sp_test);

+int deactivte_data_call(int argc, char *argv[], int sp_test);

+int wait_data_call(int argc, char *argv[], int sp_test);

+int setup_data_call_sp(int argc, char *argv[], int sp_test);

+int get_data_call_list(int argc, char *argv[], int sp_test);

+int qser_init_data(int argc, char *argv[], int sp_test);

+int qser_deinit_data(int argc, char *argv[], int sp_test);

+int qser_setup_data_call(int argc, char *argv[], int sp_test);

+int qser_setup_data_call_async(int argc, char *argv[], int sp_test);

+int qser_deactivte_data_call(int argc, char *argv[], int sp_test);

+int qser_get_data_call_list(int argc, char *argv[], int sp_test);

+int lynq_qser_apn_set(int argc, char *argv[], int sp_test);

+int lynq_qser_apn_get(int argc, char *argv[], int sp_test);

+int lynq_qser_apn_add(int argc, char *argv[], int sp_test);

+int lynq_qser_apn_del(int argc, char *argv[], int sp_test);

+int lynq_qser_apn_get_list(int argc, char *argv[], int sp_test);
\ No newline at end of file
diff --git a/mbtk/test/Mobiletek_Tester_RDIT/dispatch.cpp b/mbtk/test/Mobiletek_Tester_RDIT/dispatch.cpp
new file mode 100755
index 0000000..a4f6071
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/dispatch.cpp
@@ -0,0 +1,396 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/types.h>
+#include <pthread.h>
+#include <errno.h>
+
+#include "dispatch.h"
+#include "lynq.h"
+#include "cc.h"
+#include "sms.h"
+#include "network.h"
+#include "data.h"
+#include "qser-voice.h"
+#include "sim.h"
+
+#define SOCKET_BUF_SIZE 512
+typedef struct {
+    char *name;           /* User printable name of the function. */
+    int (*func)(int argc, char *argv[], int sp_test);       /* Function to call to do the job. */
+    char *doc;            /* Documentation for this function.  */
+    int request;
+} COMMAND;
+
+COMMAND commands[] = {
+#include "req_commands.h"
+};
+
+int g_rdit_socket_fd = 0;
+int g_rdit_client_connect = -1;
+static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_startupCond = PTHREAD_COND_INITIALIZER;
+
+int has_registe_cmd = 0;
+struct sockaddr_un g_remote_addr = {0};
+struct sockaddr_un g_local_addr = {0};
+int g_create_socket = 0;
+int g_start_main_loop = 0;
+
+
+COMMAND* find_command (char *name)
+{
+  register int i;
+
+  for (i = 0; commands[i].name; i++)
+    if (strcmp (name, commands[i].name) == 0)
+      return (&commands[i]);
+
+  return ((COMMAND *)NULL);
+}
+
+const char *requestToString(int request)
+{
+    switch(request)
+    {
+        case LYNQ_DIAL: return "LYNQ_DIAL";
+        case LYNQ_ANSWER: return "LYNQ_ANSWER";
+        case LYNQ_HUNGUP: return "LYNQ_HUNGUP";
+        case LYNQ_QSER_CALL_INIT :return  "LYNQ_QSER_CALL_INIT";
+        case LYNQ_QSER_CALL_DEINIT : return "LYNQ_QSER_CALL_DEINIT";
+        case LYNQ_QSER_CALL_START : return "LYNQ_QSER_CALL_START";
+        case LYNQ_QSER_CALL_ANSWER : return "LYNQ_QSER_CALL_ANSWER";
+        case LYNQ_QSER_CALL_END : return "LYNQ_QSER_CALL_END";
+        case LYNQ_QSER_CALL_HANDLER : return "LYNQ_QSER_CALL_HANDLER";
+        case LYNQ_QSER_CALL_REMOVE : return "LYNQ_QSER_CALL_REMOVE ";
+        default: return "<unknown request>";
+    }
+}
+int parse_param(char *cmd, char *argv[], int max_args)
+{
+    char *pos, *pos2;
+    int argc = 0;
+    printf("recive tester cmd=%s\n",cmd);
+    pos = cmd;
+    while (1) {
+        // Trim the space characters.
+        while (*pos == ' ') {
+            pos++;
+        }
+
+        if (*pos == '\0') {
+            break;
+        }
+
+        // One token may start with '"' or other characters.
+        if (*pos == '"' && (pos2 = strrchr(pos+1, '"'))) {
+            argv[argc++] = pos + 1;
+            *pos2 = '\0';
+            pos = pos2 + 1;
+            if(*pos == '\n'){
+                *pos = '\0';
+                pos = pos + 1;
+            }
+
+        } else {
+            argv[argc++] = pos;
+            while (*pos != '\0' && *pos != ' '&& *pos != '\n') {
+                pos++;
+            }
+            *pos++ = '\0';
+
+            if(argc == 1) {
+              char* at_cmd = strstr(argv[0], "RIL_REQUEST_OEM_HOOK_RAW");
+              if(at_cmd != NULL) {
+                while (*pos == ' ') {
+                    pos++;
+                }
+                argv[argc++] = pos;
+                while (*pos != '\0' && *pos != '\n') {
+                    pos++;
+                }
+                *pos++ = '\0';
+                break;
+              }
+            }
+
+        }
+
+        // Check if the maximum of arguments is reached.
+        if (argc == max_args) {
+            break;
+        }
+    }
+
+    return argc;
+}
+dispatch_manager::dispatch_manager()
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    __init_msg();
+}
+dispatch_manager::~ dispatch_manager(){}
+
+int dispatch_manager::__init_msg()
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    __request = 0;
+    __argc = 0;
+    __argv = NULL;
+    __socket_name = NULL;
+    return 0;
+}
+int dispatch_manager::__set_request_msg(int req,int argc,char *argv)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    printf("requet=%d,argc=%d,argv p=%x\n");
+    __request = req;
+    __argc = argc;
+    __argv = argv;
+    return 0;
+}
+int dispatch_manager::set_request_msg(int req,int argc,char *argv)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    return __set_request_msg(req,argc,argv);
+}
+
+
+int actsvc_cmd_recv(int fd, char *buf, int len)
+{
+    int ret = 0;
+    ret = recv(fd, buf, len, 0);
+    printf("[%d][%s] recv before\n",__LINE__,__FUNCTION__);
+    if (ret < 0)
+    {
+        printf("acti_cmd_recv service select error, ret=%d, error=%s(%d),fd=%d\n", ret,strerror(errno), errno, fd);
+        return LYNQ_E_SOCKET_FAIL;
+    }
+    else if(ret == 0)
+    {
+        printf("acti_cmd_recv service recv error, ret=%d, error=%s(%d),fd=%d\n", ret,strerror(errno), errno, fd);
+        return LYNQ_E_SOCKET_ZERO;
+    }
+    else
+    {
+        printf("[%d][%s] buf is:%s\n",__LINE__,__FUNCTION__,buf);
+        return LYNQ_E_SOCKET_SUCC;
+    }
+}
+
+int create_socket(const int domain, const int type, const int protocol,const int port,const char *IP,const char *socket_name,void * addr,int backlog,int cs)
+{
+    printf("[%d][%s]start create socket\n",__LINE__,__FUNCTION__);
+    printf("domain:%d,type:%d,protocol:%d,port:%d,IP:%s,socket_name:%s,backlog:%d\n",domain,type,protocol,port,IP,socket_name,backlog);
+    int socket_fd = -1;
+    char acBuf[1024] = {0};
+    struct sockaddr_un *local_addr = NULL;
+    local_addr = (struct sockaddr_un *)addr;
+    socket_fd = socket(domain, type,protocol);
+    if(0 > socket_fd)
+    {
+        printf("create socket fail:fd = %d\n",socket_fd);
+        return socket_fd;
+    }
+    switch (domain)
+    {
+        case AF_UNIX:
+        {
+            if (strlen(socket_name) > sizeof(local_addr->sun_path) - 1)
+            {
+                printf("Server socket path too long: %s\n", socket_name);
+                return (-strlen(socket_name));
+            }
+            if(cs == 0)//0:service 1:client
+            {
+                printf("remove %s\n", socket_name);
+                if (remove(socket_name) == -1 && errno != ENOENT)
+                { 
+                    printf("remove-%s fail and errno:%d\n", socket_name,errno);
+                }
+            }
+            if(type == SOCK_STREAM)
+            {
+                while(access(socket_name, R_OK)==0)
+                {
+                    printf("%s still exist\n", socket_name);
+                    usleep(10);
+                }
+            }
+            local_addr->sun_family = AF_UNIX;
+            sprintf(local_addr->sun_path, "%s", socket_name);
+            if(cs == 0)//0:service 1:client
+            {
+                if(bind(socket_fd, (struct sockaddr *)local_addr, sizeof(struct sockaddr_un)) < 0)
+                {
+                    printf("bind failed name=[%s] reason=[%s]\n", socket_name, strerror(errno));
+                    //printf("[%d][%s]bind fail and errno: %d",LINE,FUNC,errno);
+                    close(socket_fd);
+                    return -1;
+                }
+                if(type == SOCK_STREAM)
+                {
+                    if(listen(socket_fd,backlog) == -1)
+                    {
+                        printf("[%d]listen fd: %dfail\n",__LINE__);
+                        close(socket_fd);
+                        return -1;
+                    }
+                }
+            }
+            else
+            {
+                printf("init this client\n");
+            }
+            break;
+        }
+        case AF_INET:
+        {
+            break;
+        }
+        default:
+            break;
+    }
+    return socket_fd;
+}
+
+int dispatch_manager::init_socket(char *socket_name)
+{
+    socklen_t client_len;
+    int ret;
+    char parser_buf[SOCKET_BUF_SIZE];
+    TryNewSocket:
+    g_rdit_socket_fd = create_socket(AF_UNIX, SOCK_DGRAM,0, 0, NULL,socket_name, (void *)&g_local_addr, 2, 0);
+    if(0 > g_rdit_socket_fd)
+    {
+        printf("init socket fail and fd:%d",g_rdit_socket_fd);
+        g_create_socket++;
+        if(g_create_socket == 10)
+        {
+            printf("create_socket max try count is %d\n", g_create_socket);
+            return LYNQ_E_SOCKET_CREATE_FAIL;
+        }
+        else
+        {
+            printf("create_socket try again %d\n", g_create_socket);
+            usleep(500*1000);
+            goto TryNewSocket;
+        }
+    }
+    set_socket_fd(g_rdit_socket_fd);
+    return LYNQ_E_SUCCESS;
+}
+
+void *socket_read_loop(void *param)
+{
+    socklen_t client_len;
+    int ret = -1;
+    int socket_fd = -1;
+    char parser_buf[SOCKET_BUF_SIZE];
+    char *argv[32] = {0};
+    int  argc = 0;
+    int *temp = (int*)param;
+    printf("in socket_read_loop , param=%p, *param=%d\n", param, (int)*(int*)param);
+    printf("[%d][%s] TryNewLink!\n", __LINE__,__FUNCTION__);
+    socket_fd = (int)*(int*)param;
+    pthread_mutex_lock(&s_startupMutex);
+    g_start_main_loop = 1;
+    pthread_cond_broadcast(&s_startupCond);
+    pthread_mutex_unlock(&s_startupMutex);
+    client_len = sizeof(g_local_addr);
+    printf("[%d][%s] socket_fd = %d,*temp=%d,%p, *param=%d!\n",__LINE__,__FUNCTION__,socket_fd,*temp, temp, (int)*(int*)param);
+#if 0
+    int conn = accept(socket_fd,(struct sockaddr *) &g_local_addr, &client_len);
+    if (conn <= 0)
+    {
+        printf("[%d][%s] accept error!",__LINE__,__FUNCTION__);
+        close(conn);
+        return NULL;
+    }
+    printf("Accept a client , fd is %d", conn);
+    if(g_rdit_client_connect >= 0)
+    {
+        printf("g_rdit_client_connect need close!");
+        close(g_rdit_client_connect);
+    }
+    g_rdit_client_connect = conn;
+#endif
+    /* tranlate data */
+    while (true)
+    {
+        memset(parser_buf, 0, sizeof(parser_buf));
+        ret = actsvc_cmd_recv(socket_fd, parser_buf, SOCKET_BUF_SIZE);
+        if (ret == LYNQ_E_SOCKET_FAIL)
+        {
+            printf("[%d][%s] LYNQ_E_SOCKET_FAIL receive CMD error\n",__LINE__,__FUNCTION__);
+            continue;
+        }
+        argc = parse_param(parser_buf,argv,32);
+        if(argc < 1)
+        {
+            printf("%s: error input.\n", parser_buf);
+            continue;
+        }
+        for(int i = 0;i < argc;i++)
+        {
+            printf("argc:%d---argv = %s\n",i,argv[i]);
+        }
+        COMMAND *command =  find_command(argv[0]);
+        if(!command)
+        {
+            printf("%s: No such command for MobileTek_Tester_RDIT\n", argv[0]);
+            continue;
+        }
+        (*(command->func))(argc,argv,0);
+    }
+    return NULL;
+}
+
+
+void dispatch_manager::start_main_loop()
+{
+    printf("[%d][%s] enter!\n",__LINE__,__FUNCTION__);
+    g_start_main_loop = 0;
+    pthread_t s_tid_dispatch;
+    pthread_mutex_lock(&s_startupMutex);
+    pthread_attr_t attr;
+    pthread_attr_init(&attr);
+    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+    int socket_fd = get_socket_fd();
+    printf("[%d][%s] socket_fd = %d,%p!\n",__LINE__,__FUNCTION__,socket_fd,&socket_fd);
+    int result = pthread_create(&s_tid_dispatch, &attr,socket_read_loop, (void *)&socket_fd);
+    if (result != 0) {
+        printf("Failed to create dispatch thread: %s\n", strerror(result));
+        goto done;
+    }
+   
+    while (g_start_main_loop == 0) {
+        pthread_cond_wait(&s_startupCond, &s_startupMutex);
+    }
+    //warren delete,beacuse of update at fwk.
+    /*mobiletek add*
+    s_started = 0;
+    result = pthread_create(&s_tid_dispatch, &attr, eventLoop_at, NULL);
+    if (result != 0) {
+        printf("Failed to create dispatch thread: %s", strerror(result));
+        goto done;
+    }
+
+    while (s_started == 0) {
+        pthread_cond_wait(&s_startupCond, &s_startupMutex);
+    }
+    *mobiletek add
+    result = pthread_create(&s_tid_dispatch, &attr, responseLoop, NULL);
+    if (result != 0) {
+        printf("Failed to create response dispatch thread: %s", strerror(result));
+        goto done;
+    }
+
+    while (s_responseDispatch == 0) {
+        pthread_cond_wait(&s_startupCond, &s_startupMutex);
+    }
+    */
+done:
+    pthread_mutex_unlock(&s_startupMutex);
+}
diff --git a/mbtk/test/Mobiletek_Tester_RDIT/dispatch.h b/mbtk/test/Mobiletek_Tester_RDIT/dispatch.h
new file mode 100755
index 0000000..5c3fb49
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/dispatch.h
@@ -0,0 +1,53 @@
+/*============================================================================= 
+#     FileName: dispatch.h
+#     Desc: 
+#     Author: Warren
+#     Version: V1.0
+#     LastChange: 2023-04-17 
+#     History: 
+=============================================================================*/
+#ifndef __LYNQ_DISPATCH__
+#define __LYNQ_DISPATCH__
+#ifdef __cplusplus
+extern "C" {
+#endif
+class dispatch_manager
+{
+    public:
+        dispatch_manager(void);
+        virtual ~ dispatch_manager();
+        char *get_socket_name()
+        {
+            return __socket_name;
+        }
+        int get_request_msg()
+        {
+            return __request;
+        }
+        int get_socket_fd()
+        {
+            return __socket_fd;
+        }
+        void set_socket_fd(int fd)
+        {
+            __socket_fd = fd;
+        }
+        int set_request_msg(int req,int argc,char *argv);
+        int init_socket(char *socket_name);
+        void start_main_loop();
+        int dispatch_request();
+        int run_event();
+        
+    private:
+        int __init_msg();
+        int __set_request_msg(int req,int argc,char *argv);
+        int __request;
+        int __argc;
+        int __socket_fd;
+        char *__argv;
+        char *__socket_name;
+};
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/mbtk/test/Mobiletek_Tester_RDIT/lynq.h b/mbtk/test/Mobiletek_Tester_RDIT/lynq.h
new file mode 100755
index 0000000..19ec1f0
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/lynq.h
@@ -0,0 +1,127 @@
+
+typedef enum
+{
+    LYNQ_E_SUCCESS=0,
+    LYNQ_E_SOCKET_CREATE_FAIL,
+    LYNQ_E_SOCKET_FAIL,
+    LYNQ_E_SOCKET_ZERO,
+    LYNQ_E_SOCKET_SUCC,
+    LYNQ_E_SOCKET_LINK_FAIL
+}LYNQ_E_T;
+
+#define LYNQ_BASE 100
+#define LYNQ_DIAL LYNQ_BASE + 1
+#define LYNQ_ANSWER LYNQ_BASE + 2
+#define LYNQ_HUNGUP LYNQ_BASE + 3
+#define LYNQ_CALL_INIT LYNQ_BASE + 4
+
+#define LYNQ_SMS LYNQ_BASE + 20
+#define LYNQ_SMS_INIT LYNQ_SMS + 1
+#define LYNQ_SMS_DEINIT LYNQ_SMS + 2
+#define LYNQ_SEND_SMS LYNQ_SMS + 3
+#define LYNQ_READ_SMS LYNQ_SMS + 4
+#define LYNQ_LIST_SMS LYNQ_SMS + 5
+#define LYNQ_DELETE_SMS LYNQ_SMS + 6
+#define LYNQ_WAIT_SMS LYNQ_SMS + 7
+#define LYNQ_GET_SMSC_ADDRESS LYNQ_SMS + 8
+#define LYNQ_SET_SMSC_ADDRESS  LYNQ_SMS + 9
+
+#define LYNQ_NETWORK LYNQ_BASE + 30
+#define LYNQ_NETWORK_INIT LYNQ_NETWORK + 1
+#define LYNQ_NETWORK_DEINIT LYNQ_NETWORK + 2
+#define LYNQ_QUERY_OPERATER LYNQ_NETWORK + 3
+#define LYNQ_QUERY_NETWORK_SELECTION_MODE LYNQ_NETWORK + 4
+#define LYNQ_SET_NETWORK_SELECTION_MODE LYNQ_NETWORK + 5
+#define LYNQ_QUERY_AVAILABLE_NETWORK LYNQ_NETWORK + 6
+#define LYNQ_QUERY_REGISTRATION_STATE LYNQ_NETWORK + 7
+#define LYNQ_QUERY_PREFFERRED_NETWORKTYPE LYNQ_NETWORK + 8
+#define LYNQ_SET_PREFFERRED_NETWORKTYPE LYNQ_NETWORK + 9
+#define LYNQ_SOLICITED_SIGNAL_STRENGTH LYNQ_NETWORK + 10
+#define LYNQ_SET_IMS LYNQ_NETWORK + 11
+
+#define LYNQ_DATA LYNQ_BASE + 60
+#define LYNQ_DATA_INIT LYNQ_DATA + 1
+#define LYNQ_DATA_DEINIT LYNQ_DATA + 2
+#define LYNQ_DEACTIVATE_DATA_CALL LYNQ_DATA + 3
+#define LYNQ_WAIT_DATA_CALL LYNQ_DATA + 4
+#define LYNQ_SETUP_DATA_CALL LYNQ_DATA + 5
+#define LYNQ_SETUP_DATA_CALL_SP LYNQ_DATA + 6
+#define LYNQ_GET_DATA_CALL_LIST LYNQ_DATA + 7
+
+#define LYNQ_QSER_DATA LYNQ_BASE + 70
+#define LYNQ_QSER_DATA_INIT LYNQ_QSER_DATA + 1
+#define LYNQ_QSER_DATA_DEINIT LYNQ_QSER_DATA + 2
+#define LYNQ_QSER_SETUP_DATA_CALL LYNQ_QSER_DATA + 3
+#define LYNQ_QSER_DEACTIVATE_DATA_CALL LYNQ_QSER_DATA + 4
+#define LYNQ_QSER_GET_DATA_CALL_LIST LYNQ_QSER_DATA + 5
+#define LYNQ_QSER_APN_SET LYNQ_QSER_DATA + 6
+#define LYNQ_QSER_APN_GET LYNQ_QSER_DATA + 7
+#define LYNQ_QSER_APN_ADD LYNQ_QSER_DATA + 8
+#define LYNQ_QSER_APN_DEL LYNQ_QSER_DATA + 9
+#define LYNQ_QSER_APN_GET_LIST LYNQ_QSER_DATA + 10
+#define LYNQ_QSER_SETUP_DATA_CALL_ASYNC LYNQ_QSER_DATA + 11
+
+
+#define LYNQ_QSER_NETWORK LYNQ_BASE + 100
+#define LYNQ_QSER_NETWORK_INIT LYNQ_QSER_NETWORK + 1
+#define LYNQ_QSER_NETWORK_DEINIT LYNQ_QSER_NETWORK + 2
+#define LYNQ_QSER_NETWORK_SET_CONCIFG LYNQ_QSER_NETWORK + 3
+#define LYNQ_QSER_NETWORK_GTE_OPERRATOR_NAME LYNQ_QSER_NETWORK + 4
+#define LYNQ_QSER_NETWORK_GET_REG_STATUS LYNQ_QSER_NETWORK + 5
+#define LYNQ_QSER_NETWORK_SOLICITED_SIGNAL_STRENGTH LYNQ_QSER_NETWORK + 6
+
+#define LYNQ_QSER LYNQ_BASE + 110
+#define LYNQ_QSER_CALL_INIT       LYNQ_QSER + 1
+#define LYNQ_QSER_CALL_DEINIT     LYNQ_QSER + 2
+#define LYNQ_QSER_CALL_START      LYNQ_QSER + 3
+#define LYNQ_QSER_CALL_ANSWER     LYNQ_QSER + 4
+#define LYNQ_QSER_CALL_END        LYNQ_QSER + 5
+#define LYNQ_QSER_CALL_HANDLER    LYNQ_QSER + 6
+#define LYNQ_QSER_CALL_REMOVE     LYNQ_QSER + 7
+
+#define LYNQ_SIM LYNQ_BASE + 120
+#define LYNQ_SIM_INIT LYNQ_SIM + 1
+#define LYNQ_GET_IMSI LYNQ_SIM + 2
+#define LYNQ_GET_SIM_STATUS LYNQ_SIM + 3
+#define LYNQ_GET_ICCID LYNQ_SIM + 4
+#define LYNQ_ENABLE_PIN LYNQ_SIM + 5
+#define LYNQ_DISABLE_PIN LYNQ_SIM + 6
+#define LYNQ_SIM_POWER LYNQ_SIM + 7
+#define LYNQ_QUERY_PIN_LOCK LYNQ_SIM + 8
+#define LYNQ_VERIFY_PIN LYNQ_SIM + 9
+#define LYNQ_CHANGE_PIN LYNQ_SIM + 10
+#define LYNQ_UNLOCK_PIN LYNQ_SIM + 11
+#define LYNQ_GET_IMEI_AND_SV LYNQ_SIM + 12
+#define LYNQ_GETPHONENUMBER LYNQ_SIM + 13
+#define LYNQ_SIM_DEINIT LYNQ_SIM + 14
+#define LYNQ_GET_IMEI LYNQ_SIM + 15
+#define LYNQ_GET_VERSION LYNQ_SIM + 16
+#define LYNQ_RESET_MD LYNQ_SIM + 17
+#define LYNQ_GET_MSISDN LYNQ_SIM + 18
+#define LYNQ_RESET_SIMCARD LYNQ_SIM + 19
+
+
+#define LYNQ_QSER_SIM LYNQ_BASE + 140
+#define LYNQ_QSER_SIM_INIT LYNQ_QSER_SIM + 1
+#define LYNQ_QSER_GET_IMSI LYNQ_QSER_SIM + 2
+#define LYNQ_QSER_GET_ICCID LYNQ_QSER_SIM + 3
+#define LYNQ_QSER_GETPHONENUMBER LYNQ_QSER_SIM + 4
+#define LYNQ_QSER_VERIFY_PIN LYNQ_QSER_SIM + 5
+#define LYNQ_QSER_CHANGE_PIN LYNQ_QSER_SIM + 6
+#define LYNQ_QSER_UNLOCK_PIN LYNQ_QSER_SIM + 7
+#define LYNQ_QSER_ENABLE_PIN LYNQ_QSER_SIM + 8
+#define LYNQ_QSER_DISABLE_PIN LYNQ_QSER_SIM + 9
+#define LYNQ_QSER_GET_SIM_STATUS LYNQ_QSER_SIM + 10
+#define LYNQ_QSER_SIM_DEINIT LYNQ_QSER_SIM + 11
+
+#define LYNQ_QSER_SMS LYNQ_BASE + 160
+#define LYNQ_QSER_SMS_INIT LYNQ_QSER_SMS + 1
+#define LYNQ_QSER_SEND_SMS LYNQ_QSER_SMS + 2
+#define LYNQ_QSER_READ_SMS LYNQ_QSER_SMS + 3
+#define LYNQ_QSER_LIST_SMS LYNQ_QSER_SMS + 4
+#define LYNQ_QSER_DELETE_SMS LYNQ_QSER_SMS + 5
+#define LYNQ_QSER_WAIT_SMS LYNQ_QSER_SMS + 6
+#define LYNQ_QSER_SMS_DEINIT LYNQ_QSER_SMS + 7
+
+
+int create_socket(const int domain, const int type, const int protocol,const int port,const char *IP,const char *socket_name,void * addr,int backlog,int cs);
diff --git a/mbtk/test/Mobiletek_Tester_RDIT/main.cpp b/mbtk/test/Mobiletek_Tester_RDIT/main.cpp
new file mode 100755
index 0000000..3f7bbf0
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/main.cpp
@@ -0,0 +1,58 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "dispatch.h"
+#include "lynq.h"
+dispatch_manager *g_dispatch;
+
+int init_msg_dispatch(char * socket_name,int token)
+{
+    int ret;
+    g_dispatch = new dispatch_manager;
+    if(g_dispatch == NULL)
+    {
+        printf("[%s][%d] new class fail!\n",__FUNCTION__,__LINE__);
+        return -1;
+    }
+    ret = g_dispatch->init_socket(socket_name);
+    if(ret!=LYNQ_E_SUCCESS)
+    {
+        printf("[%s][%d] create socket fail!\n",__FUNCTION__,__LINE__);
+        return ret;
+    }
+    g_dispatch->start_main_loop();
+    return LYNQ_E_SUCCESS;
+}
+int main(int argc,char*argv[])
+{
+    printf("[%s][%d] enter\n",__FUNCTION__,__LINE__);
+    int ret = 0;
+    char socket_name[64]={0};
+
+    system("rm -rf /var/run/socket");
+    system("mkdir -p /var/run/socket");
+
+    if(argc < 3)
+    {
+        printf("[%s][%d] please input socket name and token\n",__FUNCTION__,__LINE__);
+        exit(1);
+    }
+    if((argv[1] != NULL) && (argv[2]!=NULL))
+    {
+        sprintf(socket_name,"/var/run/socket/%s",argv[1]);
+        if(LYNQ_E_SUCCESS != init_msg_dispatch(socket_name, atoi(argv[2])))
+        {
+            exit(1);
+        }
+    }
+    else
+    {
+	printf("[%s][%d] param fail!\n",__FUNCTION__,__LINE__);
+        exit(1);
+    }
+    while (1)
+    {
+        sleep(1);
+    }
+    return 0;
+}
diff --git a/mbtk/test/Mobiletek_Tester_RDIT/network.cpp b/mbtk/test/Mobiletek_Tester_RDIT/network.cpp
new file mode 100755
index 0000000..c78f218
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/network.cpp
@@ -0,0 +1,311 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <stdint.h>

+#include <string.h>

+#include "lynq_network.h"

+#include "network.h"

+#include "lynq_qser_network.h"

+#define TEST_RESULT "lynq_result="

+

+// int init_network(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int uToken = atoi(argv[1]);

+//     ret = lynq_network_init(uToken);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     return ret;

+// }

+// int deinit_network(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     ret = lynq_network_deinit();

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     return ret;

+// }

+// int query_operater(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     ret = lynq_query_operater(argv[1], argv[2], argv[3]);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     printf("LYNQ_QUERY_OPERATER: OperatorFN=%s, OperatorSH=%s, MccMnc=%s\n", argv[1], argv[2], argv[3]);

+//     return ret;

+// }

+// int query_network_selection_mode(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int netselMode = atoi(argv[1]);

+//     ret = lynq_query_network_selection_mode(&netselMode);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     printf("LYNQ_QUERY_NETWORK_SELECTION_MODE: netselMode=%d\n", netselMode);

+//     return ret;

+// }

+// int set_network_selection_mode(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     ret = lynq_set_network_selection_mode(argv[1], argv[2]);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     return ret;

+// }

+// int query_available_network(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     ret = lynq_query_available_network(argv[1], argv[2], argv[3], argv[4]);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     printf("LYNQ_QUERY_AVAILABLE_NETWORK: OperatorFN=%s, OperatorSH=%s, MccMnc=%s, NetStatus=%s\n", argv[1], argv[2], argv[3], argv[4]);

+//     return ret;    

+// }

+// int query_registration_state(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int regState = atoi(argv[2]);

+//     int imsRegState = atoi(argv[3]);

+//     int netType = atoi(argv[6]);

+//     int radioTechFam = atoi(argv[7]);

+//     int netRejected = atoi(argv[8]);

+//     ret = lynq_query_registration_state(argv[1], &regState, &imsRegState, argv[4], argv[5], &netType, &radioTechFam, &netRejected);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     printf("LYNQ_QUERY_REGISTRATION_STATE: regState=%d, imsRegState=%d, LAC=%s, CID=%s, netType=%d, radioTechFam=%d, netRejected=%d\n", regState, imsRegState, argv[4], argv[5], netType, radioTechFam, netRejected);

+//     return ret;  

+// }

+// int query_prefferred_networktype(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int preNetType = atoi(argv[1]);

+//     ret = lynq_query_prefferred_networktype(&preNetType);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     printf("LYNQ_QUERY_PREFFERRED_NETWORKTYPE: preNetType=%d\n", preNetType);

+//     return ret;

+// }

+// int set_prefferred_networktype(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int preNetType = atoi(argv[1]);

+//     ret = lynq_set_prefferred_networktype(preNetType);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     return ret;

+// }

+// int solicited_signal_strength(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     signalStrength_t solSigStren = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};

+

+//     ret = lynq_solicited_signal_strength(&solSigStren);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     if(ret==0)

+//     {

+//         printf("solicited_signal_strength gw_sig_valid = %d\n"

+//                                                " rssi = %d\n"

+//                                                " wcdma_sig_valid = %d\n"                                                

+//                                                " wcdma_signalstrength = %d\n"

+//                                                " rscp"

+//                                                " ecio = %d\n"                                      

+//                                                " lte_sig_info_valid = %d\n"

+//                                                " lte_signalstrength = %d\n"

+//                                                " rsrp = %d\n"

+//                                                " rsrq = %d\n"

+//                                                " rssnr = %d\n"                                             

+//                                                " nr_sig_valid = %d\n"

+//                                                " ssRsrp = %d\n"

+//                                                " ssRsrq = %d\n"

+//                                                " ssSinr = %d\n"

+//                                                " csiRsrp = %d\n"

+//                                                " csiRsrq = %d\n"

+//                                                " nr_sig_info.csiSinr = %d\n",

+//               solSigStren.gw_sig_valid, solSigStren.rssi,

+//                 solSigStren.wcdma_sig_valid, solSigStren.wcdma_signalstrength,  solSigStren.rscp,solSigStren.ecno,        

+//               solSigStren.lte_sig_valid, solSigStren.lte_signalstrength, solSigStren.rsrp, solSigStren.rsrq, solSigStren.rssnr,    

+//               solSigStren.nr_sig_valid, solSigStren.ssRsrp, solSigStren.ssRsrq, solSigStren.ssSinr,

+//               solSigStren.csiRsrp, solSigStren.csiRsrq, solSigStren.csiSinr);

+//     }    

+//     return ret;

+// }

+// int set_ims(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int ims_mode = atoi(argv[1]);

+//     ret = lynq_set_ims(ims_mode);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     return ret;

+// }

+

+int qser_network_init(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+    

+    int ret = -1;  

+    nw_client_handle_type h_nw;

+    

+    ret = qser_nw_client_init(&h_nw);       

+    printf("%s%d\n",TEST_RESULT,ret);

+    if(ret==0)

+    {

+        printf("qser_nw_client_init: h_nw=%d\n", h_nw);          

+    }    

+    return ret;    

+}

+

+int qser_network_deinit(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+

+    if(argc !=2)

+    {

+        printf("error, argc %d is not equal 2 \n",argc);

+        return -1;

+    }

+    

+    int ret = -1;  

+    nw_client_handle_type h_nw;

+    

+    h_nw=atoi(argv[1]);

+    ret = qser_nw_client_deinit(h_nw);

+    printf("%s%d\n",TEST_RESULT,ret);    

+    return ret;    

+}

+

+int qser_network_set_config(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+

+    if(argc !=3)

+    {

+        printf("error, argc %d is not equal 3 \n",argc);

+        return -1;

+    }

+

+    nw_client_handle_type       h_nw;

+    QSER_NW_CONFIG_INFO_T     t_info;

+

+    h_nw=atoi(argv[1]);

+    t_info.preferred_nw_mode=atoi(argv[2]);

+    

+    int ret = -1;  

+    ret = qser_nw_set_config(h_nw,&t_info);

+    printf("%s%d\n",TEST_RESULT,ret);    

+    return ret;    

+}

+

+int qser_network_get_operator_name(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+

+    if(argc !=2)

+    {

+        printf("error, argc %d is not equal 2 \n",argc);

+        return -1;

+    }

+

+    nw_client_handle_type       h_nw;

+    QSER_NW_OPERATOR_NAME_INFO_T  t_info;

+

+    h_nw=atoi(argv[1]);    

+    

+    int ret = -1;  

+    ret = qser_nw_get_operator_name(h_nw,&t_info);

+    printf("%s%d\n",TEST_RESULT,ret);    

+    if(ret==0)

+    {

+        printf("qser_nw_get_operator_name: h_nw=%d, long_eons=%s, short_eons=%s, mcc=%s, mnc=%s \n", h_nw, t_info.long_eons,t_info.short_eons,t_info.mcc,t_info.mnc);          

+    }    

+    return ret;    

+}

+

+int qser_network_get_reg_status(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+

+    if(argc !=2)

+    {

+        printf("error, argc %d is not equal 3 \n",argc);

+        return -1;

+    }

+

+    nw_client_handle_type       h_nw;

+    QSER_NW_REG_STATUS_INFO_T  t_info;

+

+    h_nw=atoi(argv[1]);    

+    

+    int ret = -1;  

+    ret = qser_nw_get_reg_status(h_nw,&t_info);

+    printf("%s%d\n",TEST_RESULT,ret);    

+    if(ret==0)

+    {    

+        printf("qser_nw_get_reg_status: voice_registration_valid=%d, tech_domain=%d, radio_tech=%d, roaming=%d deny_reason=%d registration_state=%d\n", 

+                      t_info.voice_registration_valid,

+                      t_info.voice_registration.tech_domain,

+                      t_info.voice_registration.radio_tech,

+                      t_info.voice_registration.roaming,

+                      t_info.voice_registration.deny_reason,

+                      t_info.voice_registration.registration_state);         

+        printf("qser_nw_get_reg_status: data_registration_valid=%d, tech_domain=%d, radio_tech=%d, roaming=%d deny_reason=%d registration_state=%d\n", 

+                      t_info.data_registration_valid,

+                      t_info.data_registration.tech_domain,

+                      t_info.data_registration.radio_tech,

+                      t_info.data_registration.roaming,

+                      t_info.data_registration.deny_reason,

+                      t_info.data_registration.registration_state);       

+    }    

+    return ret;        

+}

+

+

+int qser_network_solicited_signal_strength(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+    if(argc !=2)

+    {

+        printf("error, argc %d is not equal 2 \n",argc);

+        return -1;

+    }

+    int ret = -1;  

+    nw_client_handle_type h_nw;

+    QSER_NW_SIGNAL_STRENGTH_INFO_T t_info;

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

+    h_nw=atoi(argv[1]);

+    ret = qser_nw_get_signal_strength(h_nw,&t_info);

+    printf("%s%d\n",TEST_RESULT,ret);

+    if(ret==0)

+    {         

+        printf("qser_solicited_signal_strength gsm_sig_info_valid = %d\n"

+               "                               gsm_sig_info.rssi = %d\n"

+               "                               wcdma     _sig_info_valid = %d\n" 

+               "                               wcdma_sig_info.rssi = %d\n"

+               "                               wcdma_sig_info.ecio = %d\n"

+               "                               tdscdma_sig_info_valid = %d\n"

+               "                               lte_sig_info_valid = %d\n"

+               "                               lte_sig_info.rssi = %d\n"

+               "                               lte_sig_info.rsrp = %d\n"

+               "                               lte_sig_info.rsrq = %d\n"

+               "                               lte_sig_info.snr = %d\n"

+               "                               cdma_sig_info_valid = %d\n"

+               "                               hdr_sig_info_valid = %d\n"

+               "                               nr_sig_info_valid = %d\n"

+               "                               nr_sig_info.ssRsrp = %d\n"

+               "                               nr_sig_info.ssRsrq = %d\n"

+               "                               nr_sig_info.ssSinr = %d\n"

+               "                               nr_sig_info.csiRsrp = %d\n"

+               "                               nr_sig_info.csiRsrq = %d\n"

+               "                               nr_sig_info.csiSinr = %d\n",

+              t_info.gsm_sig_info_valid, t_info.gsm_sig_info.rssi,

+                t_info.wcdma_sig_info_valid, t_info.wcdma_sig_info.rssi,  t_info.wcdma_sig_info.ecio,

+              t_info.tdscdma_sig_info_valid,

+              t_info.lte_sig_info_valid, t_info.lte_sig_info.rssi, t_info.lte_sig_info.rsrp, t_info.lte_sig_info.rsrq, t_info.lte_sig_info.snr,

+              t_info.cdma_sig_info_valid, 

+              t_info.hdr_sig_info_valid, 

+              t_info.nr_sig_info_valid, t_info.nr_sig_info.ssRsrp, t_info.nr_sig_info.ssRsrq, t_info.nr_sig_info.ssSinr,

+              t_info.nr_sig_info.csiRsrp, t_info.nr_sig_info.csiRsrq, t_info.nr_sig_info.csiSinr);

+    }    

+    return ret;

+}

+

diff --git a/mbtk/test/Mobiletek_Tester_RDIT/network.h b/mbtk/test/Mobiletek_Tester_RDIT/network.h
new file mode 100755
index 0000000..c7791b1
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/network.h
@@ -0,0 +1,18 @@
+//network

+int init_network(int argc, char *argv[], int sp_test);

+int deinit_network(int argc, char *argv[], int sp_test);

+int query_operater(int argc, char *argv[], int sp_test);

+int query_network_selection_mode(int argc, char *argv[], int sp_test);

+int set_network_selection_mode(int argc, char *argv[], int sp_test);

+int query_available_network(int argc, char *argv[], int sp_test);

+int query_registration_state(int argc, char *argv[], int sp_test);

+int query_prefferred_networktype(int argc, char *argv[], int sp_test);

+int set_prefferred_networktype(int argc, char *argv[], int sp_test);

+int solicited_signal_strength(int argc, char *argv[], int sp_test);

+int set_ims(int argc, char *argv[], int sp_test);

+int qser_network_init(int argc, char *argv[], int sp_test);

+int qser_network_deinit(int argc, char *argv[], int sp_test);

+int qser_network_set_config(int argc, char *argv[], int sp_test);

+int qser_network_get_operator_name(int argc, char *argv[], int sp_test);

+int qser_network_get_reg_status(int argc, char *argv[], int sp_test);

+int qser_network_solicited_signal_strength(int argc, char *argv[], int sp_test);
\ No newline at end of file
diff --git a/mbtk/test/Mobiletek_Tester_RDIT/qser-voice.cpp b/mbtk/test/Mobiletek_Tester_RDIT/qser-voice.cpp
new file mode 100755
index 0000000..30efe86
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/qser-voice.cpp
@@ -0,0 +1,104 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <cstring>
+#include "lynq-qser-voice.h"
+
+#include "qser-voice.h"
+
+#define TEST_RESULT "lynq_result="
+
+static int qser_hadler = 1 ;
+
+
+static int handle = -1;
+void callback_state_handler_fun(int id,char *num,qser_voice_call_state_t  state, void  *contextPtr )
+{
+    printf("callback show call id is %d,call num %s,call_state is %d,\n",id,num,state);
+    handle = id;
+    return ;
+}
+
+
+//lynq_call_init
+int qser_voice_call_client_init_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret= 0;
+    unsigned int uToken = atoi(argv[1]);
+    ret = qser_voice_call_client_init(&uToken);//
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
+
+//call deinit
+int qser_voice_call_client_deinit_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = 0;
+    ret = qser_voice_call_client_deinit(qser_hadler);
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+
+}
+
+//lynq_call
+int qser_voice_call_start_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = 0;
+    int call_id = -1;
+    char addr[16] = {0};
+    strncpy(addr,argv[1],sizeof(addr) - 1);
+    ret = qser_voice_call_start(qser_hadler,E_QSER_VCALL_EXTERNAL_SLOT_1,addr,&call_id);
+    printf("%s%d%d\n",TEST_RESULT,ret,call_id);
+    return ret;
+
+}
+
+//lynq_call_answer
+int qser_voice_call_answer_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = 0;
+    ret = qser_voice_call_answer(qser_hadler,qser_hadler);
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
+
+//hugup
+int qser_voice_call_end_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = 0;
+    ret = qser_voice_call_end(qser_hadler,handle);
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
+
+
+//add callback
+int qser_voice_call_addstatehandler_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = 0;
+    ret = qser_voice_call_addstatehandler(qser_hadler,callback_state_handler_fun,NULL);
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret ;
+}
+
+//remove
+int qser_voice_call_removestatehandle_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = 0;
+    ret = qser_voice_call_removestatehandle(qser_hadler);
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret ;
+
+}
+
+
+
+
diff --git a/mbtk/test/Mobiletek_Tester_RDIT/qser-voice.h b/mbtk/test/Mobiletek_Tester_RDIT/qser-voice.h
new file mode 100755
index 0000000..2f365f0
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/qser-voice.h
@@ -0,0 +1,10 @@
+
+int qser_voice_call_client_init_test(int argc, char *argv[], int sp_test);
+int qser_voice_call_client_deinit_test(int argc, char *argv[], int sp_test);
+int qser_voice_call_start_test(int argc, char *argv[], int sp_test);
+int qser_voice_call_answer_test(int argc, char *argv[], int sp_test);
+int qser_voice_call_end_test(int argc, char *argv[], int sp_test);
+int qser_voice_call_addstatehandler_test(int argc, char *argv[], int sp_test);
+int qser_voice_call_removestatehandle_test(int argc, char *argv[], int sp_test);
+
+
diff --git a/mbtk/test/Mobiletek_Tester_RDIT/req_commands.h b/mbtk/test/Mobiletek_Tester_RDIT/req_commands.h
new file mode 100755
index 0000000..d6f32f7
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/req_commands.h
@@ -0,0 +1,113 @@
+// //CC
+//     {"LYNQ_DIAL",dial_test, "dial a call", LYNQ_DIAL},
+//     {"LYNQ_CALL_INIT",init_call, "init the call lib", LYNQ_CALL_INIT},
+//     {"LYNQ_ANSWER",answer_test, "answer a call", LYNQ_ANSWER},
+//     {"LYNQ_HUNGUP",hungup_test, "hungup a call", LYNQ_HUNGUP},
+// //SMS
+//     {"LYNQ_SMS_INIT",init_sms, "init the sms lib", LYNQ_SMS_INIT},
+//     {"LYNQ_SMS_DEINIT",deinit_sms, "deinit the sms lib", LYNQ_SMS_DEINIT},
+//     {"LYNQ_SEND_SMS",send_sms, "send short message", LYNQ_SEND_SMS},
+//     {"LYNQ_READ_SMS",read_sms, "read short message", LYNQ_READ_SMS},
+//     {"LYNQ_LIST_SMS",list_sms, "list short message", LYNQ_LIST_SMS},
+//     {"LYNQ_DELETE_SMS",delete_sms, "delete short messsage", LYNQ_DELETE_SMS},
+//     {"LYNQ_WAIT_SMS",wait_sms, "wait short messsage", LYNQ_WAIT_SMS},
+//     {"LYNQ_GET_SMSC_ADDRESS",get_smsc_address, "get smsc address", LYNQ_GET_SMSC_ADDRESS},
+//     {"LYNQ_SET_SMSC_ADDRESS",set_smsc_address, "set smsc address", LYNQ_SET_SMSC_ADDRESS},
+// //NETWORK
+//     {"LYNQ_NETWORK_INIT",init_network, "init the network lib", LYNQ_NETWORK_INIT},
+//     {"LYNQ_NETWORK_DEINIT",deinit_network, "deinit the network lib", LYNQ_NETWORK_DEINIT},
+//     {"LYNQ_QUERY_OPERATER",query_operater, "query operater infomation ", LYNQ_QUERY_OPERATER},
+//     {"LYNQ_QUERY_NETWORK_SELECTION_MODE",query_network_selection_mode, "query network selection mode", LYNQ_QUERY_NETWORK_SELECTION_MODE},
+//     {"LYNQ_SET_NETWORK_SELECTION_MODE",set_network_selection_mode, "set network selection mode", LYNQ_SET_NETWORK_SELECTION_MODE},
+//     {"LYNQ_QUERY_AVAILABLE_NETWORK",query_available_network, "query available network", LYNQ_QUERY_AVAILABLE_NETWORK},
+//     {"LYNQ_QUERY_REGISTRATION_STATE",query_registration_state, "query registration state", LYNQ_QUERY_REGISTRATION_STATE},
+//     {"LYNQ_QUERY_PREFFERRED_NETWORKTYPE",query_prefferred_networktype, "query prefferred networktype", LYNQ_QUERY_PREFFERRED_NETWORKTYPE},
+//     {"LYNQ_SET_PREFFERRED_NETWORKTYPE",set_prefferred_networktype, "set prefferred networktype", LYNQ_SET_PREFFERRED_NETWORKTYPE},
+//     {"LYNQ_SOLICITED_SIGNAL_STRENGTH",solicited_signal_strength, "solicited signal strength", LYNQ_SOLICITED_SIGNAL_STRENGTH},
+//     {"LYNQ_SET_IMS",set_ims, "set ims open or close", LYNQ_SET_IMS},
+// //DATA
+//     {"LYNQ_DATA_INIT",init_data, "init the data lib", LYNQ_DATA_INIT},
+//     {"LYNQ_DATA_DEINIT",deinit_data, "deinit the data lib", LYNQ_DATA_DEINIT},
+//     {"LYNQ_SETUP_DATA_CALL",setup_data_call, "set up data call", LYNQ_SETUP_DATA_CALL},
+//     {"LYNQ_SETUP_DATA_CALL_SP",setup_data_call_sp, "set up data call sp", LYNQ_SETUP_DATA_CALL_SP},
+//     {"LYNQ_DEACTIVATE_DATA_CALL",deactivte_data_call, "deactive data call", LYNQ_DEACTIVATE_DATA_CALL},
+//     {"LYNQ_WAIT_DATA_CALL",wait_data_call, "wait data call", LYNQ_WAIT_DATA_CALL},
+//     {"LYNQ_GET_DATA_CALL_LIST",get_data_call_list, "get data call list", LYNQ_GET_DATA_CALL_LIST},
+//QSER_NETWORK
+    {"LYNQ_QSER_NETWORK_INIT",qser_network_init, "init the network lib", LYNQ_QSER_NETWORK_INIT},
+    {"LYNQ_QSER_NETWORK_DEINIT",qser_network_deinit, "deinit the network lib", LYNQ_QSER_NETWORK_DEINIT},
+    {"LYNQ_QSER_NETWORK_SET_CONCIFG",qser_network_set_config, "set network config", LYNQ_QSER_NETWORK_SET_CONCIFG},
+    {"LYNQ_QSER_NETWORK_GTE_OPERRATOR_NAME",qser_network_get_operator_name, "query operater infomation", LYNQ_QSER_NETWORK_GTE_OPERRATOR_NAME},
+    {"LYNQ_QSER_NETWORK_GET_REG_STATUS",qser_network_get_reg_status, "query registration status", LYNQ_QSER_NETWORK_GET_REG_STATUS},
+    {"LYNQ_QSER_NETWORK_SOLICITED_SIGNAL_STRENGTH",qser_network_solicited_signal_strength, "solicited signal strength", LYNQ_QSER_NETWORK_SOLICITED_SIGNAL_STRENGTH},
+//QSER_DATA
+    {"LYNQ_QSER_DATA_INIT",qser_init_data, "init the data lib", LYNQ_QSER_DATA_INIT},
+    {"LYNQ_QSER_DATA_DEINIT",qser_deinit_data, "deinit the data lib", LYNQ_QSER_DATA_DEINIT},
+    {"LYNQ_QSER_SETUP_DATA_CALL",qser_setup_data_call, "set up data call", LYNQ_QSER_SETUP_DATA_CALL},
+    {"LYNQ_QSER_SETUP_DATA_CALL_ASYNC",qser_setup_data_call_async, "set up data call asynchronously", LYNQ_QSER_SETUP_DATA_CALL_ASYNC},
+    {"LYNQ_QSER_DEACTIVATE_DATA_CALL",qser_deactivte_data_call, "deactive data call", LYNQ_QSER_DEACTIVATE_DATA_CALL},
+    {"LYNQ_QSER_GET_DATA_CALL_LIST",qser_get_data_call_list, "get data call list", LYNQ_QSER_GET_DATA_CALL_LIST},
+    {"LYNQ_QSER_APN_SET",lynq_qser_apn_set, "set apn", LYNQ_QSER_APN_SET},
+    {"LYNQ_QSER_APN_GET",lynq_qser_apn_get, "get apn", LYNQ_QSER_APN_GET},
+    {"LYNQ_QSER_APN_ADD",lynq_qser_apn_add, "set apn", LYNQ_QSER_APN_ADD},
+    {"LYNQ_QSER_APN_DEL",lynq_qser_apn_del, "del apn", LYNQ_QSER_APN_DEL},
+    {"LYNQ_QSER_APN_GET_LIST",lynq_qser_apn_get_list, "get apn list", LYNQ_QSER_APN_GET_LIST},
+//QSER VOICE
+    {"LYNQ_QSER_CALL_INIT",qser_voice_call_client_init_test,"qser_voice_call_client_init_test",LYNQ_QSER_CALL_INIT},
+    {"LYNQ_QSER_CALL_DEINIT",qser_voice_call_client_deinit_test,"qser_voice_call_client_deinit_test",LYNQ_QSER_CALL_DEINIT},
+    {"LYNQ_QSER_CALL_START",qser_voice_call_start_test,"qser_voice_call_start_test",LYNQ_QSER_CALL_START},
+    {"LYNQ_QSER_CALL_ANSWER",qser_voice_call_answer_test,"qser_voice_call_answer_test",LYNQ_QSER_CALL_ANSWER},
+    {"LYNQ_QSER_CALL_END",qser_voice_call_end_test,"qser_voice_call_end_test",LYNQ_QSER_CALL_END},
+    {"LYNQ_QSER_CALL_HANDLER",qser_voice_call_addstatehandler_test,"qser_voice_call_addstatehandler_test",LYNQ_QSER_CALL_HANDLER},
+    {"LYNQ_QSER_CALL_REMOVE",qser_voice_call_removestatehandle_test,"qser_voice_call_removestatehandle_test",LYNQ_QSER_CALL_REMOVE},
+
+// //SIM
+//     {"LYNQ_SIM_INIT",init_sim, "init sim lib", LYNQ_SIM_INIT},
+//     {"LYNQ_GET_IMSI",get_imsi_test, "get imsi", LYNQ_GET_IMSI},
+//     {"LYNQ_GET_SIM_STATUS",get_sim_status_test, "get sim status", LYNQ_GET_SIM_STATUS}, 
+//     //GET_SIM_STATUS,					/*radiooptions 11 1 0*/
+//     {"LYNQ_GET_ICCID",get_iccid_test, "get iccid", LYNQ_GET_ICCID},
+//     //QUERY_ICCID,					/*radiooptions 30 1 0*/
+//     {"LYNQ_ENABLE_PIN",enable_pin_test, "enable pin", LYNQ_ENABLE_PIN},
+//     {"LYNQ_SIM_POWER",sim_power_test, "sim power", LYNQ_SIM_POWER},
+//     {"LYNQ_DISABLE_PIN",disable_pin_test, "disable pin", LYNQ_DISABLE_PIN},
+//     {"LYNQ_QUERY_PIN_LOCK",query_pin_lock_test, "query pin lock", LYNQ_QUERY_PIN_LOCK},
+//     //QUERY_FACILITY_LOCK,			/*radiooptions 35 fac 1 0*/
+//     {"LYNQ_VERIFY_PIN",verify_pin_test, "verify pin", LYNQ_VERIFY_PIN},
+//     {"LYNQ_CHANGE_PIN",change_pin_test, "change pin", LYNQ_CHANGE_PIN},
+//     {"LYNQ_UNLOCK_PIN",unlock_pin_test, "unlock pin", LYNQ_UNLOCK_PIN},
+//     {"LYNQ_GET_IMEI",get_imei_test, "get imei", LYNQ_GET_IMEI},//lynq_get_imei ,at cmd
+//     {"LYNQ_GET_IMEI_AND_SV",get_imei_and_sv_test, "get imei and sv", LYNQ_GET_IMEI_AND_SV},
+//     {"LYNQ_SWITCH_CARD",switch_card_test, "switch card", LYNQ_GET_IMEI_AND_SV},
+//     {"LYNQ_GETPHONENUMBER",query_phone_number_test, "query phone num", LYNQ_GETPHONENUMBER},//LYNQ_RIL_REQUEST_OEM_HOOK_RAW
+//     //RIL_REQUEST_OEM_HOOK_RAW
+//     {"LYNQ_SIM_DEINIT",deinit_sim, "deinit sim lib", LYNQ_SIM_DEINIT},
+//     {"LYNQ_GET_VERSION",get_version, "lynq get version", LYNQ_GET_VERSION},
+//     {"LYNQ_RESET_MD",reset_modem,"reset modem",LYNQ_RESET_MD},
+//     {"LYNQ_GET_MSISDN",get_msisdn, "lynq get msisdn", LYNQ_GET_MSISDN},
+
+
+//QSER SIM
+    {"LYNQ_QSER_SIM_INIT",qser_init_sim, "init sim lib", LYNQ_QSER_SIM_INIT},
+    {"LYNQ_QSER_GET_IMSI",qser_get_imsi_test, "get imsi", LYNQ_QSER_GET_IMSI},
+    {"LYNQ_QSER_GET_ICCID",qser_get_iccid_test, "get iccid", LYNQ_QSER_GET_ICCID},
+    {"LYNQ_QSER_GETPHONENUMBER",qser_get_phonenumber_test, "get phonenumber", LYNQ_QSER_GETPHONENUMBER},
+    {"LYNQ_QSER_VERIFY_PIN",qser_verify_pin_test, "verify pin", LYNQ_QSER_VERIFY_PIN},
+    {"LYNQ_QSER_CHANGE_PIN",qser_change_pin_test, "change pin", LYNQ_QSER_CHANGE_PIN},
+    {"LYNQ_QSER_UNLOCK_PIN",qser_unlock_pin_test, "unlock pin", LYNQ_QSER_UNLOCK_PIN},
+    {"LYNQ_QSER_ENABLE_PIN",qser_enable_pin_test, "enable pin", LYNQ_QSER_ENABLE_PIN},
+    {"LYNQ_QSER_DISABLE_PIN",qser_disable_pin_test, "disable pin", LYNQ_QSER_DISABLE_PIN},
+    {"LYNQ_QSER_GET_SIM_STATUS",qser_get_sim_status_test, "get sim status", LYNQ_QSER_GET_SIM_STATUS},
+    {"LYNQ_QSER_SIM_DEINIT",qser_deinit_sim, "deinit sim lib", LYNQ_QSER_SIM_DEINIT},
+//QSER SMS
+    {"LYNQ_QSER_SMS_INIT",qser_init_sms, "init the sms lib", LYNQ_QSER_SMS_INIT},
+    {"LYNQ_QSER_SMS_DEINIT",qser_deinit_sms, "deinit the sms lib", LYNQ_QSER_SMS_DEINIT},
+    {"LYNQ_QSER_SEND_SMS",qser_send_sms, "send short message", LYNQ_QSER_SEND_SMS},
+    //{"LYNQ_QSER_READ_SMS",qser_read_sms, "read short message", LYNQ_QSER_READ_SMS},
+    //{"LYNQ_QSER_LIST_SMS",qser_list_sms, "list short message", LYNQ_QSER_LIST_SMS},
+    {"LYNQ_QSER_DELETE_SMS",qser_delete_sms, "delete short messsage", LYNQ_QSER_DELETE_SMS},
+    //{"LYNQ_QSER_WAIT_SMS",qser_wait_sms, "wait short messsage", LYNQ_QSER_WAIT_SMS},
+
+    {(char *)NULL, NULL, (char *)NULL , -1},
+
+
diff --git a/mbtk/test/Mobiletek_Tester_RDIT/sim.cpp b/mbtk/test/Mobiletek_Tester_RDIT/sim.cpp
new file mode 100755
index 0000000..9a8a2a6
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/sim.cpp
@@ -0,0 +1,363 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "lynq_sim.h"
+#include "lynq_qser_sim.h"
+#include "sim.h"
+#define TEST_RESULT "lynq_result="
+
+static int handle = 0;
+
+
+// int init_sim(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     int ret = -1;
+//     int uToken = atoi(argv[1]);
+//     ret = lynq_sim_init(uToken);
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     return ret;
+// }
+
+// int get_imsi_test(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     int ret = -1;
+//     char imsi_buf[SIM_BUF] = "";
+//     ret = lynq_get_imsi(imsi_buf);
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     printf("[%s-%d] IMSI:%s\n", __FUNCTION__, __LINE__, imsi_buf);
+//     return ret;
+// }
+
+// int get_sim_status_test(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     int ret = -1;
+//     int sim_status = -1;
+//     //ret = lynq_get_sim_status(&sim_status);
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     return ret;
+// }
+
+// int get_iccid_test(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     int ret = -1;
+//     char iccid[SIM_BUF] = "";
+//     ret = lynq_get_iccid(iccid);
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     if(!ret)
+//         printf("[%s-%d] ICCID:%s\n", __FUNCTION__, __LINE__, iccid);
+
+//     return ret;
+// }
+
+// int enable_pin_test(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     int ret = -1;
+//     char pin[SIM_BUF] = "";
+//     ret = lynq_enable_pin(pin);
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     return ret;
+// }
+
+
+
+// int sim_power_test(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     int ret = -1;
+//     int mode = 0;
+// #ifdef MOBILETEK_TARGET_PLATFORM_T106
+//     ret = lynq_reset_sim();
+// #else
+//     ret = lynq_sim_power(mode);
+// #endif
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     return ret;
+// }
+
+// int disable_pin_test(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     int ret = -1;
+//     char pin[SIM_BUF] = "";
+//     ret = lynq_disable_pin(pin);
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     return ret;
+// }
+
+// int query_pin_lock_test(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     int ret = -1;
+//     char pin[SIM_BUF] = "";
+//     int lock[SIM_BUF] = {0};
+//     ret = lynq_query_pin_lock(pin,lock);
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     return ret;
+// }
+
+// int verify_pin_test(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     int ret = -1;
+//     char pin[SIM_BUF] = "";
+//     ret = lynq_verify_pin(pin);
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     return ret;
+// }
+
+// int change_pin_test(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     int ret = -1;
+//     char old_pin[SIM_BUF] = "";
+//     char new_pin[SIM_BUF] = "";
+//     ret = lynq_change_pin(old_pin, new_pin);
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     return ret;
+// }
+
+// int unlock_pin_test(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     int ret = -1;
+//     char puk[SIM_BUF] = "";
+//     char new_pin[SIM_BUF] = "";
+//     ret = lynq_unlock_pin(puk, new_pin);
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     return ret;
+// }
+// //#error rita
+
+// int get_imei_test(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     int ret = -1;
+//     char buf[SIM_BUF] = "";
+//     ret = lynq_get_imei(buf);
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     printf("[%s-%d] IMEI:%s\n", __FUNCTION__, __LINE__, buf);
+//     return ret;
+// }
+
+// int get_imei_and_sv_test(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     int ret = -1;
+//     char imei[SIM_BUF] = "";
+//     char sv[SIM_BUF] = "";
+//     ret = lynq_get_imei_and_sv(imei, sv);
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     printf("[%s-%d] IMEI:%s, SV:%s\n", __FUNCTION__, __LINE__, imei, sv);
+//     return ret;
+// }
+
+// int switch_card_test(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     int ret = -1;
+//     char solt = 0;
+//     ret = lynq_switch_card(solt);
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     return ret;
+// }
+
+// int query_phone_number_test(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     int ret = -1;
+//     char buf[SIM_BUF] = "";
+//     ret = lynq_query_phone_number(buf);
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     printf("[%s-%d] PHONE_NUM:%s\n", __FUNCTION__, __LINE__, buf);
+//     return ret;
+// }
+
+// int deinit_sim(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     int ret = -1;
+//     ret = lynq_sim_deinit();
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     return ret;
+// }
+// int get_version(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     char buf[128] = "";
+//     int ret = -1;
+//     ret = lynq_get_version(buf);
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     printf("[%s-%d] VERSION:%s\n", __FUNCTION__, __LINE__, buf);
+//     return ret;
+// }
+
+// int reset_modem(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     char buf[128] = "";
+//     int ret = -1;
+//     ret = lynq_reset_modem();
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     return ret;
+// }
+
+// int get_msisdn(int argc, char *argv[], int sp_test)
+// {
+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+//     char buf[128] = "";
+//     int ret = -1;
+//     ret = lynq_query_phone_number(buf);
+//     printf("[%s][%d] buf = %s\n",__FUNCTION__,__LINE__, buf);
+//     printf("%s%d\n",TEST_RESULT,ret);
+//     return ret;
+// }
+
+//qser api
+sim_client_handle_type  ph_sim;
+int qser_init_sim(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = -1;
+    ph_sim = (sim_client_handle_type)atoi(argv[1]);
+    ret = qser_sim_client_init(&ph_sim);
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
+
+int qser_get_imsi_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = -1;
+    char imsi_buf[SIM_BUF] = "";
+    //sim_client_handle_type h_sim = ph_sim;
+    QSER_SIM_APP_ID_INFO_T pt_info; 
+    size_t imsiLen = 0;
+    ret = qser_sim_getimsi(ph_sim, &pt_info, imsi_buf, imsiLen);
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
+
+int qser_get_iccid_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = -1;
+    char iccid[SIM_BUF] = "";
+    int uToken = atoi(argv[1]);
+    //sim_client_handle_type h_sim = gtoken;
+    QSER_SIM_SLOT_ID_TYPE_T simId;
+    int iccidLen = 0;
+    ret = qser_sim_geticcid(ph_sim, simId, iccid, iccidLen);
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
+
+int qser_get_phonenumber_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = -1;
+    char phone_num[SIM_BUF] = "";
+    //sim_client_handle_type h_sim = gtoken;
+    QSER_SIM_APP_ID_INFO_T pt_info; 
+    int phoneLen = 0;
+    ret = qser_sim_getphonenumber(ph_sim, &pt_info, phone_num, phoneLen);
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
+
+int qser_verify_pin_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = -1;
+    //sim_client_handle_type h_sim = gtoken;
+    QSER_SIM_VERIFY_PIN_INFO_T pt_info;
+    strcpy(pt_info.pin_value, argv[1]);
+    ret =  qser_sim_verifypin(ph_sim, &pt_info);
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
+
+int qser_change_pin_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = -1;
+    //sim_client_handle_type h_sim = gtoken;
+    QSER_SIM_CHANGE_PIN_INFO_T pt_info;
+
+    strcpy(pt_info.old_pin_value, argv[1]);
+    strcpy(pt_info.new_pin_value, argv[2]);
+    ret =  qser_sim_changepin(ph_sim, &pt_info);
+    
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
+
+int qser_unlock_pin_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = -1;
+    //sim_client_handle_type h_sim = gtoken;
+    QSER_SIM_UNBLOCK_PIN_INFO_T pt_info;
+
+    strcpy(pt_info.puk_value, argv[1]);
+    strcpy(pt_info.new_pin_value, argv[2]);
+    ret =  qser_sim_unblockpin(ph_sim, &pt_info);
+    
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
+
+int qser_enable_pin_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = -1;
+    //sim_client_handle_type h_sim = gtoken;
+    QSER_SIM_ENABLE_PIN_INFO_T pt_info;
+
+    strcpy(pt_info.pin_value, argv[1]);
+    ret =  qser_sim_enablepin(ph_sim, &pt_info);
+    
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
+
+int qser_disable_pin_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = -1;
+    //sim_client_handle_type h_sim = gtoken;
+    QSER_SIM_DISABLE_PIN_INFO_T pt_info;
+
+    strcpy(pt_info.pin_value, argv[1]);
+    ret =  qser_sim_disablepin(ph_sim, &pt_info);
+    
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
+
+int qser_get_sim_status_test(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = -1;
+    //sim_client_handle_type h_sim = gtoken;
+    QSER_SIM_SLOT_ID_TYPE_T simId;
+    QSER_SIM_CARD_STATUS_INFO_T pt_info;
+
+    ret =  qser_sim_getcardstatus(ph_sim, simId, &pt_info);
+    
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
+
+int qser_deinit_sim(int argc, char *argv[], int sp_test)
+{
+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+    int ret = -1;
+    ret = qser_sim_client_deinit(ph_sim);
+    printf("%s%d\n",TEST_RESULT,ret);
+    return ret;
+}
diff --git a/mbtk/test/Mobiletek_Tester_RDIT/sim.h b/mbtk/test/Mobiletek_Tester_RDIT/sim.h
new file mode 100755
index 0000000..bd6511f
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/sim.h
@@ -0,0 +1,36 @@
+//SIM
+#define SIM_BUF 32
+int init_sim(int argc, char *argv[], int sp_test);
+int get_imsi_test(int argc, char *argv[], int sp_test);
+int get_sim_status_test(int argc, char *argv[], int sp_test);
+int get_iccid_test(int argc, char *argv[], int sp_test);
+int enable_pin_test(int argc, char *argv[], int sp_test);
+int sim_power_test(int argc, char *argv[], int sp_test);
+int disable_pin_test(int argc, char *argv[], int sp_test);
+int query_pin_lock_test(int argc, char *argv[], int sp_test);
+int verify_pin_test(int argc, char *argv[], int sp_test);
+int change_pin_test(int argc, char *argv[], int sp_test);
+int unlock_pin_test(int argc, char *argv[], int sp_test);
+int get_imei_test(int argc, char *argv[], int sp_test);
+int get_imei_and_sv_test(int argc, char *argv[], int sp_test);
+int switch_card_test(int argc, char *argv[], int sp_test);
+int query_phone_number_test(int argc, char *argv[], int sp_test);
+int deinit_sim(int argc, char *argv[], int sp_test);
+int get_version(int argc, char *argv[], int sp_test);
+int reset_modem(int argc, char *argv[], int sp_test);
+int get_msisdn(int argc, char *argv[], int sp_test);
+int reset_simcard(int argc, char *argv[], int sp_test);
+
+//QSER SIM
+int qser_init_sim(int argc, char *argv[], int sp_test);
+int qser_get_imsi_test(int argc, char *argv[], int sp_test);
+int qser_get_iccid_test(int argc, char *argv[], int sp_test);
+int qser_get_phonenumber_test(int argc, char *argv[], int sp_test);
+int qser_verify_pin_test(int argc, char *argv[], int sp_test);
+int qser_change_pin_test(int argc, char *argv[], int sp_test);
+int qser_unlock_pin_test(int argc, char *argv[], int sp_test);
+int qser_enable_pin_test(int argc, char *argv[], int sp_test);
+int qser_disable_pin_test(int argc, char *argv[], int sp_test);
+int qser_get_sim_status_test(int argc, char *argv[], int sp_test);
+int qser_deinit_sim(int argc, char *argv[], int sp_test);
+
diff --git a/mbtk/test/Mobiletek_Tester_RDIT/sms.cpp b/mbtk/test/Mobiletek_Tester_RDIT/sms.cpp
new file mode 100755
index 0000000..ef22c29
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/sms.cpp
@@ -0,0 +1,157 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include "lynq_sms.h"

+#include "lynq_qser_sms.h"

+#include "sms.h"

+#define TEST_RESULT "lynq_result="

+

+// int init_sms(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int uToken = atoi(argv[1]);

+//     ret = lynq_sms_init(uToken);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     return ret;

+// }

+// int deinit_sms(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     ret = lynq_sms_deinit();

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     return ret;

+// }

+// int send_sms(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int charset = atoi(argv[2]);

+//     int msglen = atoi(argv[4]);

+//     ret = lynq_send_sms(argv[1], charset, argv[3], msglen);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     return ret;

+// }

+// int read_sms(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int index = atoi(argv[1]);

+//     int status = atoi(argv[2]);

+//     int charset = atoi(argv[3]);

+//     int smscLen = atoi(argv[5]);

+//     int smslen = atoi(argv[7]);

+//     int numLen = atoi(argv[9]);

+//     int current = atoi(argv[10]);

+//     int total = atoi(argv[11]);

+//     ret = lynq_read_sms(index, &status, &charset, argv[4], &smscLen, &smslen, argv[6], argv[8], &numLen, &current, &total);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     printf("LYNQ_SMS_READ: status=%d, charset=%d, smsc=%s, smscLen=%d, message=%s, smslen=%d, teleNum=%s, numLen=%d, current=%d, total=%d\n", status, charset, argv[4], smscLen, argv[6], smslen, argv[8], numLen, current, total);

+//     return ret;

+// }

+// int list_sms(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+    

+//     ret = lynq_list_sms(argv[1]);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     printf("LYNQ_LIST_SMS: index_list=%s\n", argv[1]);

+//     return ret;

+// }

+// int delete_sms(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int index = atoi(argv[1]);

+

+//     ret = lynq_delete_sms(index);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     return ret;

+// }

+// int wait_sms(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     int handle = atoi(argv[1]);

+

+//     ret = lynq_wait_receive_new_sms(&handle);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     printf("LYNQ_WAIT_SMS: handle=%d\n", handle);

+//     return ret;

+// }

+

+// int get_smsc_address(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     //int handle = atoi(argv[1]);

+//     char service_num[22] = "";

+//     ret = lynq_get_smsc_address(service_num);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     printf("LYNQ_GET_SMSC_ADDRESS: %s\n", service_num);

+//     return ret;

+// }

+

+// int set_smsc_address(int argc, char *argv[], int sp_test)

+// {

+//     printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+//     int ret = -1;

+//     //int handle = atoi(argv[1]);

+//     char service_num[22] = "";

+//     strncpy(service_num, argv[1], 22);

+//     ret = lynq_set_smsc_address(service_num);

+//     printf("%s%d\n",TEST_RESULT,ret);

+//     return ret;

+// }

+

+//QSER API

+sms_client_handle_type  ph_sms;

+int qser_init_sms(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+    int ret = -1;

+    ph_sms = atoi(argv[1]);

+    ret = qser_sms_client_init(&ph_sms);

+    printf("%s%d\n",TEST_RESULT,ret);

+    return ret;

+}

+

+int qser_deinit_sms(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+    int ret = -1;

+    ret = qser_sms_client_deinit(ph_sms);

+    printf("%s%d\n",TEST_RESULT,ret);

+    return ret;

+}

+

+int qser_send_sms(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+    int ret = -1;

+    QSER_sms_info_t pt_sms_info;

+    

+    strcpy(pt_sms_info.src_addr, argv[1]);

+    pt_sms_info.format = (QSER_SMS_T)atoi(argv[2]);

+    strcpy(pt_sms_info.sms_data, argv[3]);

+    pt_sms_info.sms_data_len = atoi(argv[4]);

+    

+    ret = qser_sms_send_sms(ph_sms, &pt_sms_info);

+    printf("%s%d\n",TEST_RESULT,ret);

+    return ret;

+}

+#if 1

+int qser_delete_sms(int argc, char *argv[], int sp_test)

+{

+    printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);

+    int ret = -1;

+    QSER_sms_storage_info_t  pt_sms_storage;

+    

+    pt_sms_storage.storage_idx= atoi(argv[1]);

+    ret = qser_sms_deletefromstorage(ph_sms, &pt_sms_storage);

+    printf("%s%d\n",TEST_RESULT,ret);

+    return ret;

+}

+#endif

diff --git a/mbtk/test/Mobiletek_Tester_RDIT/sms.h b/mbtk/test/Mobiletek_Tester_RDIT/sms.h
new file mode 100755
index 0000000..307ff56
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/sms.h
@@ -0,0 +1,15 @@
+//SMS

+int init_sms(int argc, char *argv[], int sp_test);

+int deinit_sms(int argc, char *argv[], int sp_test);

+int send_sms(int argc, char *argv[], int sp_test);

+int read_sms(int argc, char *argv[], int sp_test);

+int list_sms(int argc, char *argv[], int sp_test);

+int delete_sms(int argc, char *argv[], int sp_test);

+int wait_sms(int argc, char *argv[], int sp_test);

+int get_smsc_address(int argc, char *argv[], int sp_test);

+int set_smsc_address(int argc, char *argv[], int sp_test);

+//QSER SMS

+int qser_init_sms(int argc, char *argv[], int sp_test);

+int qser_deinit_sms(int argc, char *argv[], int sp_test);

+int qser_send_sms(int argc, char *argv[], int sp_test);

+int qser_delete_sms(int argc, char *argv[], int sp_test);
\ No newline at end of file
diff --git a/mbtk/test/Mobiletek_Tester_RDIT/socket-tool.cpp b/mbtk/test/Mobiletek_Tester_RDIT/socket-tool.cpp
new file mode 100755
index 0000000..990a910
--- /dev/null
+++ b/mbtk/test/Mobiletek_Tester_RDIT/socket-tool.cpp
@@ -0,0 +1,48 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/types.h>
+#include <pthread.h>
+#include <errno.h>
+#include "lynq.h"
+
+struct sockaddr_un g_client_local_addr = {0};
+
+int main(int argc,char*argv[])
+{
+    int client_socket_fd = -1;
+    char socket_name_client[64]={0};
+    char socket_name_service[64]={0};
+    memset(&g_client_local_addr,0,sizeof(g_client_local_addr));
+    socklen_t addrlen = sizeof(g_client_local_addr);
+    if(argc < 3)
+    {
+        printf("please input socket name and msg\n");
+    }
+    if((argv[1] != NULL) && (argv[2]!=NULL))
+    {
+        sprintf(socket_name_service,"/var/run/socket/%s",argv[1]);
+        //sprintf(socket_name_client,"/var/socket/%s-client",argv[1]);
+        client_socket_fd = create_socket(AF_UNIX, SOCK_DGRAM,0, 0, NULL,socket_name_service, (void *)&g_client_local_addr, 2, 1);
+        if(0 > client_socket_fd)
+        {
+            printf("init socket fail and fd:%d\n",client_socket_fd);
+            return -1;
+        }
+    }
+    else
+    {
+        return -1;
+    }
+    //g_client_local_addr.sun_family = AF_UNIX;
+    //sprintf(g_client_local_addr.sun_path, socket_name_service);
+    int data_len = sendto(client_socket_fd, argv[2], strlen(argv[2]), 0, (sockaddr*)&g_client_local_addr,addrlen);
+    //int data_len = send(client_socket_fd,argv[2],strlen(argv[2]),0);
+    if(data_len <= 0 )
+    {
+         printf("end msg fail er_code:%s\n",strerror(errno));
+    }
+    close(client_socket_fd);
+    return 0;
+}
diff --git a/mbtk/test/libql_lib_v2/ql_ecall_test.c b/mbtk/test/libql_lib_v2/ql_ecall_test.c
index 0ad1113..5ce5d2e 100755
--- a/mbtk/test/libql_lib_v2/ql_ecall_test.c
+++ b/mbtk/test/libql_lib_v2/ql_ecall_test.c
@@ -821,6 +821,7 @@
 void item_ql_ecall_set_config_info(void)
 {
     ql_ecall_config_t ecall_context_info;
+    memset(&ecall_context_info, 0, sizeof(ql_ecall_config_t));
 
     printf("Whether the time of T5 timer is valid(0:no, 1:yes):\n");
     scanf("%hhd", &ecall_context_info.t5_timeout_ms_valid);
diff --git a/mbtk/test/libql_lib_v2/ql_tee_test.c b/mbtk/test/libql_lib_v2/ql_tee_test.c
new file mode 100755
index 0000000..58c7463
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_tee_test.c
@@ -0,0 +1,67 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include "ql_tee_service.h"
+
+
+#define TEST_OBJECT_SIZE	128
+
+int main(void)
+{
+    int ret;
+    unsigned int len;
+    char obj1_id[] = "object#1";
+    char obj1_data[] = "123456789";
+    char read_data[TEST_OBJECT_SIZE];
+    uint32_t object;
+    uint32_t count;
+
+
+    printf("ql_ss_initialize start\n");
+    ret =  ql_ss_initialize();
+    if(ret != 0)
+    {
+        printf("ql_ss_initialize fail\n");
+    }
+
+    ret = ql_ss_open(obj1_id, sizeof(obj1_id), &object);
+    if(ret != 0)
+    {
+        printf("ql_ss_open fail\n");
+	return 0;
+    }
+
+    ret = ql_ss_write(object, obj1_data, sizeof(obj1_data));
+    if(ret != 0)
+    {
+        printf("ql_ss_write fail\n");
+        return 0;
+    }
+
+    ret = ql_ss_read(object, read_data, sizeof(obj1_data), &count);
+    if(ret != 0)
+    {
+        printf("ql_ss_read fail\n");
+        return 0;
+    }
+    printf("read_data: %s\n", read_data);
+    
+
+    ret = ql_ss_unlink(object);
+    if(ret != 0)
+    {
+        printf("ql_ss_unlink fail\n");
+        return 0;
+    }
+
+    ql_ss_close(object);
+    ql_ss_deinitialize();
+
+    return 0;
+
+
+}
+
+
+
diff --git a/mbtk/test/others/key_ev_demo.c b/mbtk/test/others/key_ev_demo.c
new file mode 100755
index 0000000..728b5d0
--- /dev/null
+++ b/mbtk/test/others/key_ev_demo.c
@@ -0,0 +1,251 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <poll.h>
+#include <errno.h>
+#include <linux/input.h>
+#include <sys/stat.h>
+#include <sys/reboot.h>
+#include <sys/timerfd.h>
+#include <time.h>
+
+#include "mbtk_type.h"
+#include "mbtk_log.h"
+
+
+#define MAX_DEVICES 16
+#define EVIOCSSUSPENDBLOCK _IOW('E', 0x91, int)
+#define POWER_KEY_LONG_PRESS_TIMEOUT 8000  // 8s
+#define POWER_KEY_PRESS_TIMEOUT 2000  // 2s
+
+static struct pollfd ev_fds[MAX_DEVICES];
+static unsigned ev_count = 0;
+
+
+static int ev_init(void)
+{
+    DIR *dir;
+    struct dirent *de;
+    int fd;
+
+    fd = open("/dev/rtc0", O_RDONLY);
+    if (fd < 0)
+    {
+        LOGW("open rtc0 error\n");
+    }
+    else
+    {
+        ev_fds[ev_count].fd = fd;
+        ev_fds[ev_count].events = POLLIN;
+        ev_count++;
+        LOGI("Monitor /dev/rtc0");
+    }
+
+    dir = opendir("/dev/input");
+    if (dir != NULL)
+    {
+        LOGI("dir = /dev/input");
+        while ((de = readdir(dir)) != NULL)
+        {
+            if (strncmp(de->d_name, "event", 5))
+                continue;
+            fd = openat(dirfd(dir), de->d_name, O_RDONLY);
+            if (fd < 0)
+                continue;
+
+            ev_fds[ev_count].fd = fd;
+            ev_fds[ev_count].events = POLLIN;
+            ioctl(fd, EVIOCSSUSPENDBLOCK, 1);
+            ev_count++;
+            if (ev_count == MAX_DEVICES)
+                break;
+
+            LOGI("Monitor /dev/input/%s", de->d_name);
+        }
+
+        closedir(dir);
+    }
+    else
+    {
+        LOGE("opendir() fail.[%d]",errno);
+        return -1;
+    }
+    return 0;
+}
+
+#if 0
+static void ev_exit(void)
+{
+    while (ev_count > 0)
+    {
+        close(ev_fds[--ev_count].fd);
+    }
+}
+#endif
+
+/* wait: 0 dont wait; -1 wait forever; >0 wait ms */
+static int ev_get(struct input_event *ev, int wait_ms)
+{
+    int r;
+    unsigned n;
+    unsigned long alarm_data;
+
+//    if(wait_ms < 0)
+//    {
+//        LOGE("poll event return\n");
+//        return -1;
+//    }
+
+    LOGI("Waitting data...");
+    r = poll(ev_fds, ev_count, wait_ms);
+    LOGI("Get Data:result = %d",r);
+
+    if (r > 0)
+    {
+        for (n = 0; n < ev_count; n++)
+        {
+            if (ev_fds[n].revents & POLLIN)
+            {
+                if (n == 0)
+                {
+                    r = read(ev_fds[n].fd, &alarm_data, sizeof(alarm_data));
+                    LOGD("get form 0 is %ld", alarm_data);
+                    ev->type = EV_KEY;
+                    ev->code = KEY_BRL_DOT8;
+                    ev->value = 1;
+                    return 0;
+                }
+                else
+                {
+                    r = read(ev_fds[n].fd, ev, sizeof(*ev));
+                    if (r == sizeof(*ev))
+                        return 0;
+                }
+            }
+        }
+    }
+    return -1;
+}
+
+
+static void power_process(bool down, struct timeval *time)
+{
+    printf("POWER_KEY - %s,Time : %ld %ld \n", down ? "DOWN" : "UP", time->tv_sec, time->tv_usec);
+#if 0
+	static struct timeval down_time;
+    static bool key_down;
+    if(down)  // Down
+    {
+        key_down = true;
+        power_long_press_timeout = false;
+        down_time.tv_sec = time->tv_sec;
+        down_time.tv_usec = time->tv_usec;
+        signal(SIGALRM, power_key_timer_alrm);
+        struct itimerval val;
+        // Only time
+        val.it_interval.tv_sec  = 0;
+        val.it_interval.tv_usec = 0;
+        // Time
+        if(POWER_KEY_LONG_PRESS_TIMEOUT >= 1000)
+        {
+            val.it_value.tv_sec  = POWER_KEY_LONG_PRESS_TIMEOUT/1000;
+            val.it_value.tv_usec = POWER_KEY_LONG_PRESS_TIMEOUT%1000;
+        }
+        else
+        {
+            val.it_value.tv_sec  = 0;
+            val.it_value.tv_usec = POWER_KEY_LONG_PRESS_TIMEOUT;
+        }
+        if (setitimer(ITIMER_REAL, &val, NULL) == -1)
+        {
+            LOGE("setitimer fail.[%d]",errno);
+            return;
+        }
+    }
+    else     // UP
+    {
+        if(key_down)
+        {
+            // ms
+            long time_used = (time->tv_sec - down_time.tv_sec) * 1000 + (time->tv_usec - down_time.tv_usec) / 1000;
+            LOGI("Down time[%ld,%ld], Up time[%ld,%ld], time_used = %ld ms",down_time.tv_sec,down_time.tv_usec,
+                 time->tv_sec,time->tv_usec,time_used);
+
+            if(!power_long_press_timeout)
+            {
+                // Cancel alarm
+                struct itimerval value;
+                value.it_value.tv_sec = 0;
+                value.it_value.tv_usec = 0;
+                value.it_interval = value.it_value;
+                setitimer(ITIMER_REAL, &value, NULL);
+
+                if(time_used <= POWER_KEY_PRESS_TIMEOUT)
+                {
+                    screen_state_change(false);
+                }
+                else
+                {
+                    LOGI("Press timeout.");
+                }
+            }
+            else
+            {
+                LOGI("Long Press timeout.");
+            }
+        }
+        else
+        {
+            LOGI("UP key for screen on.");
+        }
+
+        key_down = false;
+    }
+#endif
+}
+
+
+int main(int argc, char *argv[])
+{
+	mbtk_log_init(NULL, "MBTK_KEY");
+    // Open dev
+    ev_init();
+
+    int ret = 0;
+    struct input_event ev;
+    while(1)
+    {
+        ret = ev_get(&ev, -1);
+        if(ret)
+        {
+            LOGW("ev_get() fail.");
+            continue;
+        }
+
+        LOGI("ev:time[%ld,%ld],type:%d,code:%d,value:%d",ev.time.tv_sec,ev.time.tv_usec,
+             ev.type,ev.code,ev.value);
+        if(ev.type != EV_KEY)
+        {
+            LOGW("event type error.[%d]",ev.type);
+            continue;
+        }
+
+        switch(ev.code)
+        {
+            case KEY_POWER:   // Power key
+            {
+                power_process(ev.value, &(ev.time));
+                break;
+            }
+            default:
+            {
+                LOGD("Unknown KEY[%d]",ev.code);
+                break;
+            }
+        }
+    }
+    return 0;
+}
diff --git a/mbtk/test/others/rtc_alarm_test.c b/mbtk/test/others/rtc_alarm_test.c
new file mode 100755
index 0000000..805aef9
--- /dev/null
+++ b/mbtk/test/others/rtc_alarm_test.c
@@ -0,0 +1,62 @@
+#include <stdio.h>

+#include <fcntl.h>

+#include <sys/ioctl.h>

+#include <linux/rtc.h>

+

+int main() {

+    int rtc_fd = open("/dev/rtc0", O_RDWR);

+    if (rtc_fd == -1) {

+        perror("open");

+        return 1;

+    }

+

+    struct rtc_time rtc_tm;

+    struct rtc_wkalrm rtc_alarm;

+    int flags;

+

+    // ......

+    if (ioctl(rtc_fd, RTC_RD_TIME, &rtc_alarm.time) == -1) {

+        perror("ioctl RTC_RD_TIME");

+        close(rtc_fd);

+        return 1;

+    }

+

+    // ......

+    printf("Current RTC time: %d-%d-%d   %02d:%02d:%02d\n",

+           rtc_alarm.time.tm_year, rtc_alarm.time.tm_mon, rtc_alarm.time.tm_mday, rtc_alarm.time.tm_hour, rtc_alarm.time.tm_min, rtc_alarm.time.tm_sec);

+

+    // .. RTC ...

+    rtc_alarm.time.tm_sec = rtc_tm.tm_sec + 10;  // 10 .......

+    rtc_alarm.enabled = 1;

+

+    if (ioctl(rtc_fd, RTC_WKALM_SET, &rtc_alarm) == -1) {

+        perror("ioctl RTC_WKALM_SET1");

+        close(rtc_fd);

+        return 1;

+    }

+    if (ioctl(rtc_fd, RTC_AIE_ON) == -1) {

+        perror("ioctl RTC_AIE_ON");

+        close(rtc_fd);

+        return 1;

+    }

+    printf("RTC alarm set for 10 seconds from now1\n");

+

+#if 0

+    rtc_alarm.time.tm_sec = rtc_tm.tm_sec + 10;  // 10 .......

+    rtc_alarm.enabled = 0;

+

+    if (ioctl(rtc_fd, RTC_WKALM_SET, &rtc_alarm) == -1) {

+        perror("ioctl RTC_WKALM_SET2");

+        close(rtc_fd);

+        return 1;

+    }

+    if (ioctl(rtc_fd, RTC_AIE_OFF) == -1) {

+        perror("ioctl RTC_AIE_OFF");

+        close(rtc_fd);

+        return 1;

+    }

+    printf("RTC alarm disable2\n");

+#endif

+    close(rtc_fd);

+    return 0;

+}
\ No newline at end of file