diff --git a/mbtk/lynq_lib/src/lynq_adc.c b/mbtk/lynq_lib/src/lynq_adc.c
new file mode 100755
index 0000000..ae40db6
--- /dev/null
+++ b/mbtk/lynq_lib/src/lynq_adc.c
@@ -0,0 +1,25 @@
+#include "lynq-adc.h"
+#include "mbtk_type.h"
+#include "mbtk_adc.h"
+#include "mbtk_log.h"
+
+int qser_adc_show(ADC_CHANNEL_E qadc)
+{
+    UNUSED(qadc);
+
+    mbtk_adc_enum adc = MBTK_ADC0;
+    switch(qadc) {
+        case ADC0:
+            adc = MBTK_ADC0;
+            break;
+        case ADC1:
+            adc = MBTK_ADC1;
+            break;
+        default:
+            LOGE("Unsupport adc : %d", qadc);
+            return -1;
+    }
+
+    return mbtk_adc_get(adc);
+}
+
diff --git a/mbtk/lynq_lib/src/lynq_alarm.c b/mbtk/lynq_lib/src/lynq_alarm.c
new file mode 100755
index 0000000..2419ac0
--- /dev/null
+++ b/mbtk/lynq_lib/src/lynq_alarm.c
@@ -0,0 +1,35 @@
+#include "mbtk_alarm.h"
+#include "lynq_alarm.h"
+
+int lynq_set_wakealarm(unsigned long time_sec)
+{
+    UNUSED(time_sec);
+
+    return 0;
+}
+
+int lynq_set_poweralarm(unsigned long time_sec)
+{
+    UNUSED(time_sec);
+
+    return 0;
+}
+
+ssize_t wakealarm(char *buffer)
+{
+    UNUSED(buffer);
+
+    return 0;
+}
+
+ssize_t poweralarm(char *buffer)
+{
+    UNUSED(buffer);
+
+    return 0;
+}
+
+int cancel_wakealarm(void)
+{
+    return 0;
+}
\ No newline at end of file
diff --git a/mbtk/lynq_lib/src/lynq_audio.c b/mbtk/lynq_lib/src/lynq_audio.c
index f783f5f..7cdb9be 100755
--- a/mbtk/lynq_lib/src/lynq_audio.c
+++ b/mbtk/lynq_lib/src/lynq_audio.c
@@ -1,363 +1,97 @@
-/**
- *   \file lynq_audio_api.c
- *   \brief A Documented file.
- *
- *  Detailed description
- *   \Author:  luojian
- *   \Version: 1.0.0
- *   \Date: 2022-10-27
- */
-#include <fcntl.h>
-#include <stdint.h>
-#include <limits.h>
-#include <termios.h>
-#include <stdarg.h>
-#include <dirent.h>
-#include <sys/stat.h>
-#include <sys/statfs.h>
-#include <sys/types.h>
-#include <string.h>
-#include <unistd.h>
-#include <pthread.h>
-#include <time.h>
-#include <sys/ioctl.h>
-#include <stdio.h>
-#include <signal.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <pthread.h>
-
-#include "mbtk_log.h"
+#include "lynq-qser-audio.h"
 #include "mbtk_type.h"
+#include "mbtk_log.h"
 
-#ifdef MBTK_PLATFORM_ASR1803
-
-#include "mbtk_audio.h"
-
-static int rec_fd = 0;
-static int play_fd = 0;
-static mbtk_audio_handle play_hdl = NULL;
-static mbtk_audio_handle record_hdl = NULL;
-int volume_size = 0;
-pthread_t  paly_thread;
-
-
-void dtmf_cb(char dtmf)
+int qser_AudPlayer_Open(char* device, _cb_onPlayer cb_fun)
 {
-    printf("%s:%c\n", __FUNCTION__, dtmf);
-}
-
-void audio_volume_cb(int volume)
-{
-	volume_size = volume;
-    printf("%s:%d\n", __FUNCTION__, volume);
-}
-
-int lynq_memscpy
-(
-  void        *dst,
-  int      dst_size,
-  const void  *src,
-  int      src_size
-)
-{
-  if(dst_size == 0 || src_size == 0 || dst == NULL || src == NULL)
-  {
-    return 0;
-  }
-  else
-  {
-    return memcpy( dst, src,src_size);
-  }
-} /* dsatutil_free_memory() */
-
-static int lynq_get_path_name ( const char* path_name,char* path )
-{
-    int i=0;
-    int last = -1;
-    int len = strlen ( path_name );
-    if ( len > 0 )
-    {
-        for ( i=len - 1; i >= 0; i-- )
-        {
-            if ( path_name[i] == '/' )
-            {
-                last = i;
-                break;
-            }
-        }
-        if ( i != -1 )
-        {
-            lynq_memscpy ( path, ( i + 1 ) * sizeof ( char ), path_name, ( i + 1 ) * sizeof ( char ) );
-            printf ( "mbtk_get_path %s", path );
-            return 0;
-        }
-    }
-    return -1;
-}
-
-int lynq_create_audio_dir(const char *dirname)
-{
-    DIR *p_dir;
-    int res = -1, i = 0;;
-	char str[512];
-    strncpy(str, dirname, 512);
-    int len=strlen(str);
-
-    if(NULL == (p_dir = opendir((const char *)dirname)))
-    {
-		for(i=0; i<len; i++ )
-	    {
-	        if( str[i]=='/' )
-	        {
-	            str[i] = '\0';
-	            if( access(str,0)!=0 )
-	            {
-					if(mkdir(dirname, 0777) == 0)
-					{
-					    res = 0;
-					}
-					else
-					{
-					    fprintf(stderr, "create audio dir error \n");
-					    res = -1;
-					}
-	            }
-	            str[i]='/';
-	        }
-	    }
-	    if( len>0 && access(str,0)!=0 )
-	    {
-	        if(mkdir(dirname, 0777) == 0)
-	        {
-	            res = 0;
-	        }
-	        else
-	        {
-	            fprintf(stderr, "create audio dir error \n");
-	            res = -1;
-	        }
-	    }
-    }
-    else
-    {
-        closedir(p_dir);
-        res = 0;
-    }
-    return res;
-}
-
-void lynq_record_cb_func(int cb_result, char* databuf, unsigned int len)
-{
-    int rc;
- //   printf("lynq_record_cb_func()        len:%d, rec_fd:%d\n", len, rec_fd);
-    if(NULL == databuf)
-    {
-        printf("NULL == databuf\n");
-    }
-
-    if(NULL != databuf && len > 0 && rec_fd > 0)
-    {
-        //for debug:save into file
-        rc = write(rec_fd, databuf, len);
-        if (rc < 0) {
-            printf("%s: error writing to file!\n", __FUNCTION__);
-        } else if (rc < len) {
-            printf("%s: wrote less the buffer size!\n", __FUNCTION__);
-        }
-    }
-}
-#else
-
-#endif
-
-int lynq_media_rec_audio(const char *path)
-{
-#ifdef MBTK_PLATFORM_ASR1803
-	int ret = 0;
-	char audio_dir[50] ={0};
-	char audio_wav[10] = {0};
-	lynq_get_path_name(path, audio_dir);
-    printf("path:%s, audio_dir:%s\n", path, audio_dir);
-
-    record_hdl = mbtk_audio_open(MBTK_AUTIO_TYPE_IN, 1, 8000, NULL);
-    if (record_hdl == 0)
-    {
-        printf("AudRecorder open error\n");
-        return -1;
-    }
-
-    lynq_create_audio_dir(audio_dir);
-    rec_fd = open(path, O_RDWR|O_CREAT|O_TRUNC, 0644);
-    if (rec_fd <= 0)
-    {
-        printf("file open error\n");
-        goto err;
-    }
-
-    if(-1 == mbtk_audio_record(record_hdl, lynq_record_cb_func, NULL))
-    {
-        printf("file write error\n");
-        goto err;
-    }
+    UNUSED(device);
+    UNUSED(cb_fun);
 
     return 0;
-//    sleep(10);
-err:
-//    Ql_AudRecorder_Close();
-	if(rec_fd > 0)
-	{
-		close(rec_fd);
-		rec_fd = 0;
-	}
-
-	return -1;
-#else
-
-    return -1;
-#endif
 }
 
-
-
-//停止录制音频文件
-void lynq_media_rec_stop_audio(void)
+int qser_AudPlayer_PlayFrmFile(int hdl, const char *fd, int offset)
 {
-#ifdef MBTK_PLATFORM_ASR1803
-//	sleep(10);
-    mbtk_audio_close(record_hdl);
-    if(rec_fd > 0)
-    {
-        close(rec_fd);
-        rec_fd = 0;
-    }
-#else
-
-#endif
-}
-
-#ifdef MBTK_PLATFORM_ASR1803
-//播放音频文件
-int lynq_media_play_audio_thread_handle(void *argv)
-{
-    char databuf[1024];
-    int size;
-
-    char *path = (char *)argv;
-	printf("lynq_media_play_audio() start \npath:%s\n",path);
-    LOGI("%s %d", __FUNCTION__, __LINE__);
-    play_hdl = mbtk_audio_open(MBTK_AUTIO_TYPE_OUT, 1, 8000, NULL);
-    if(NULL == play_hdl)
-        printf("mbtk_audio_open fail\n");
-
-    play_fd = open(path, O_RDWR);
-    if (play_fd <= 0)
-    {
-        printf("file open error\n");
-        goto err;
-    }
-    memset(databuf, 0, sizeof(databuf));
-    while(0 < (size = read(play_fd, databuf, sizeof(databuf))))
-    {
-        if(-1 == mbtk_audio_play_stream(play_hdl, databuf, size))
-            break;
-    }
-    printf("aplay Stream end \n");
-
-err:
-	if(play_fd > 0)
-	{
-		close(play_fd);
-		play_fd = 0;
-	}
-
-	pthread_exit(&paly_thread);
-    mbtk_audio_close(play_hdl);
-	return 0;
-}
-#endif
-
-//创建线程播放音频文件
-int lynq_media_play_audio(const char *path)
-{
-#ifdef MBTK_PLATFORM_ASR1803
-	int ret = pthread_create(&paly_thread, NULL, lynq_media_play_audio_thread_handle, (void *)path);
-	if (ret != 0) {
-		printf("create thread failed!\n");
-		return -1;
-	}
-
-	pthread_detach(paly_thread);
-	return 0;
-#else
+    UNUSED(hdl);
+    UNUSED(fd);
+    UNUSED(offset);
 
     return 0;
-#endif
 }
 
-
-//停止播放音频文件
-void lynq_media_stop_audio(void)
+int qser_AudPlayer_Pause(int hdl)
 {
-#ifdef MBTK_PLATFORM_ASR1803
-	printf("lynq_media_stop_audio()----\n");
-	if(play_fd > 0)
-	{
-	    int ret = pthread_cancel(paly_thread);
-	    if (ret != 0) {
-	        printf("cancle paly_thread fail\n");
-	        return ;
-	    }
-		close(play_fd);
-        play_fd = 0;
-	}
-	mbtk_audio_close(play_hdl);
-#else
+    UNUSED(hdl);
 
-#endif
-}
-
-#ifdef MBTK_PLATFORM_ASR1803
-int lynq_audio_ubus_client_init(mbtk_audio_client_handle_type *ph_audio, mbtk_dtmf_cb cb)
-{
-    if(rec_fd > 0 || play_fd > 0)
-	{
-		printf("rec or play need close\n");
-		return -1;
-	}
-	return mbtk_audio_ubus_client_init(ph_audio, cb);
-}
-
-int lynq_audio_ubus_client_deinit(mbtk_audio_client_handle_type h_audio)
-{
-    if(rec_fd > 0 || play_fd > 0)
-	{
-		printf("rec or play need close\n");
-		return -1;
-	}
-	return mbtk_audio_ubus_client_deinit(h_audio);
-}
-#endif
-
-int lynq_get_spk_volume(int * volume)
-{
-#ifdef MBTK_PLATFORM_ASR1803
-	mbtk_audio_ubus_volume_get(audio_volume_cb);
-	*volume = volume_size;
-	return 0;
-#else
     return 0;
-#endif
+}
+
+int qser_AudPlayer_Resume(int hdl)
+{
+    UNUSED(hdl);
+
+    return 0;
+}
+
+void qser_AudPlayer_Stop(int hdl)
+{
+    UNUSED(hdl);
+
+    return 0;
 }
 
 
-int lynq_set_spk_volume(const int volume)
+void qser_AudPlayer_Close(int hdl)
 {
-#ifdef MBTK_PLATFORM_ASR1803
-    mbtk_audio_ubus_volume_set(volume);
+    UNUSED(hdl);
+
     return 0;
-#else
+}
+
+
+int qser_AudRecorder_Open(char* device, _cb_onPlayer cb_fun)
+{
+    UNUSED(device);
+    UNUSED(cb_fun);
+
+
     return 0;
-#endif
+}
+
+int qser_AudRecorder_StartRecord(int hdl, const char *fd, int offset)
+{
+    UNUSED(hdl);
+    UNUSED(fd);
+    UNUSED(offset);
+
+
+    return 0;
+}
+
+int qser_AudRecorder_Pause(void)
+{
+
+    return 0;
+}
+
+int qser_AudRecorder_Resume(void)
+{
+
+    return 0;
+}
+
+void qser_AudRecorder_Stop(void)
+{
+
+}
+
+void qser_AudRecorder_Close(void)
+{
+
+}
+
+void qser_Audio_Deinit(void)
+{
+
 }
 
diff --git a/mbtk/lynq_lib/src/lynq_call_api.c b/mbtk/lynq_lib/src/lynq_call_api.c
deleted file mode 100755
index ccab09f..0000000
--- a/mbtk/lynq_lib/src/lynq_call_api.c
+++ /dev/null
@@ -1,458 +0,0 @@
-#include "lynq/lynq_call_api.h"
-#include "mbtk_info_api.h"
-
-static mbtk_info_handle_t* info_handle = NULL;
-int lynq_volume_size = 0;
-#ifdef MBTK_PLATFORM_ASR1803
-mbtk_audio_client_handle_type lynq_dtmf_handle;
-#endif
-mbtk_call_info_t lynq_reg[5]={0};
-int *handle_ptr=null;
-void (*incoming_call_cb_p)(int x)=NULL;
-void lynq_call_state_change_cb(const void* data, int data_len)
-{
-    mbtk_call_info_t *reg = (mbtk_call_info_t *)data;
-    switch (reg->call_wait)
-    {
-        case MBTK_CLCC:
-        {
-            lynq_reg[reg->dir1].dir1 = reg->dir1;
-            lynq_reg[reg->dir1].dir = reg->dir;
-            lynq_reg[reg->dir1].state = reg->state;
-            lynq_reg[reg->dir1].mode = reg->mode;
-            lynq_reg[reg->dir1].mpty = reg->mpty;
-            memset(lynq_reg[reg->dir1].phone_number,0,strlen(reg->phone_number));
-            memcpy(lynq_reg[reg->dir1].phone_number,reg->phone_number,strlen(reg->phone_number));
-            lynq_reg[reg->dir1].type = reg->type;
-            printf("\r\nRING : %d, %d, %d, %d, %d, %s, %d, %d\r\n", reg->dir1, reg->dir, reg->state, reg->mode, reg->mpty, reg->phone_number, reg->type,strlen(reg->phone_number));
-            if(handle_ptr != null)
-            {
-                if(*handle_ptr != reg->dir1)
-                {
-                    *handle_ptr = reg->dir1;
-                    printf("reg->dir1 : %d\r\n handle=%d\n", reg->dir1,*handle_ptr);
-                    handle_ptr = NULL;
-                }
-            }
-            if(reg->dir == 1)
-                (*incoming_call_cb_p)(reg->dir1);
-            break;
-        }
-        case MBTK_DISCONNECTED:
-            memset(&(lynq_reg[reg->disconnected_id]),0,sizeof(lynq_reg[reg->disconnected_id]));
-            printf("\r\nRING : call dis connected: %d!\r\n", reg->disconnected_id);
-            printf("phone number : %s",lynq_reg[reg->disconnected_id].phone_number);
-            lynq_set_mute_mic(0);
-            break;
-        case MBTK_CPAS:
-            printf("\r\nCALL : Call state = %d\r\n", reg->pas);
-            /*
-                MBTK_CALL_RADY,                 //MT allows commands from TA/TE
-                MBTK_CALL_UNAVAILABLE,          //MT does not allow commands from TA/TE
-                MBTK_CALL_UNKNOWN,              //MT is not guaranteed to respond to instructions
-                MBTK_CALL_RINGING,              //MT is ready for commands from TA/TE, but the ringer is active
-                MBTK_CALL_PROGRESS,             //MT is ready for commands from TA/TE, but a call is in progress
-                MBTK_CALL_ASLEEP,               //MT is unable to process commands from TA/TE because it is in a low functionality state
-                MBTK_CALL_ACTIVE,
-            */
-           switch (reg->pas)
-           {
-                case MBTK_CALL_RADY:
-                    printf("CALL: call READY\r\n");
-                    break;
-                case MBTK_CALL_UNAVAILABLE:
-                    printf("CALL: call unavaliable\r\n");
-                    break;
-                case MBTK_CALL_UNKNOWN:
-                    printf("CALL: call unknown\r\n");
-                    break;
-                case MBTK_CALL_RINGING:
-                    printf("CALL: call ringing\r\n");
-                    break;
-                case MBTK_CALL_PROGRESS:
-                    printf("CALL: call progress\r\n");
-                    break;
-                case MBTK_CALL_ASLEEP:
-                    printf("CALL: call asleep\r\n");
-                    break;
-                case MBTK_CALL_ACTIVE:
-                    printf("CALL: call active\r\n");
-                    break;
-                default:
-                    printf("\r\n");
-                    break;
-           }
-            break;
-        default:
-            printf("\r\nRING : None call_wait = %d\r\n", reg->call_wait);
-            break;
-    }
-    /*
-    if(reg->call_wait == )         //CLCC
-    {
-        printf("\r\nRING : %d, %d, %d, %d, %d, %s, %d\r\n", reg->dir1, reg->dir, reg->state, reg->mode, reg->mpty, reg->phone_number, reg->type);
-    }
-    else if(reg->call_wait == 2)    //Disconnected
-    {
-        printf("\r\nRING : call dis connected!\r\n");
-    }
-    else
-    {
-        printf("\r\nRING : None\r\n");
-    }
-    */
-}
-
-#ifdef MBTK_PLATFORM_ASR1803
-void lynq_dtmf_cb(char dtmf)
-{
-    printf("%s:%c\n", __FUNCTION__, dtmf);
-}
-#endif
-
-int lynq_init_call(int uToken)
-{
-    UNUSED(uToken);
-#ifdef MBTK_PLATFORM_ASR1803
-    mbtk_audio_ubus_client_init(&lynq_dtmf_handle, lynq_dtmf_cb);
-#endif
-    if(info_handle == NULL)
-    {
-        info_handle = mbtk_info_handle_get();
-        if(info_handle)
-        {
-            int err = mbtk_call_state_change_cb_reg(info_handle, lynq_call_state_change_cb);
-            if(err) {
-                return -1;
-            } else {
-                return 0;
-            }
-        }
-    }
-
-    return -1;
-}
-
-int lynq_deinit_call(void)
-{
-    if(info_handle)
-    {
-        return mbtk_info_handle_free(&info_handle);
-    }
-    else
-    {
-        return -1;
-    }
-}
-
-int lynq_call(int *handle, char addr[])
-{
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-    if(strlen(addr)>=90)
-    {
-        printf("\ninput phone number over load!\n");
-        return -1;
-    }
-    char *buf = addr;
-    int err = mbtk_call_start(info_handle, buf);
-    if(err) {
-        return -1;
-    } else {
-        handle_ptr = handle;
-        return 0;
-    }
-}
-
-int lynq_call_answer()
-{
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-    int err = mbtk_call_answer(info_handle);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_call_hungup_all()
-{
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-    int err = mbtk_call_hang(info_handle);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_call_hungup(int *handle)
-{
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-    int err = mbtk_a_call_hang(info_handle, *handle);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_hangup_waiting_or_background(void)
-{
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-    int err = mbtk_waiting_or_background_call_hang(info_handle);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_hangup_foreground_resume_background(void)
-{
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-    int err = mbtk_foreground_resume_background_call_hang(info_handle);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_switch_waiting_or_holding_and_active(void)
-{
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-    int err = mbtk_call_answer(info_handle);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_wait_incoming_call(void *incoming_call_cb)
-{
-    if(incoming_call_cb == NULL)
-        return -1;
-    incoming_call_cb_p = incoming_call_cb;
-    return 0;
-}
-
-int lynq_get_mute_mic (int *status)
-{
-    if(status == NULL)
-    {
-        return -1;
-    }
-    int err = mbtk_mute_state_get(info_handle, status);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_set_mute_mic(const int enable)
-{
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-    int err = mbtk_mute_state_set(info_handle, enable);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_set_DTMF(const char callnum)
-{
-    //0......9 A B C D * #
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-    char callnum_default[17]="0123456789ABCD*#";
-    if((strchr(callnum_default,callnum))==NULL)
-    {
-        printf("please input 0123456789ABCD*#\n");
-        return -1;
-    }
-    mbtk_call_dtmf_info_t dtmf_character;
-    dtmf_character.character = callnum;
-    dtmf_character.duration = 500;
-    int err = mbtk_dtmf_send(info_handle, &dtmf_character);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_get_current_call_state(int *handle,int *call_state,int*toa,int *direction,char addr[])
-{
-    int flag=0;
-    int i;
-    for (i = 0; i < 5; i++)
-    {
-        if(lynq_reg[i].dir1 == *handle)
-        {
-            *direction = lynq_reg[i].dir;
-            *toa = lynq_reg[i].type;
-            memset(addr,0,sizeof(addr));
-            memcpy(addr, lynq_reg[i].phone_number, strlen(lynq_reg[i].phone_number));
-            int len = strlen(lynq_reg[i].phone_number);
-            addr[len]='\0';
-            switch (lynq_reg[i].state)
-            {
-                case MBTK_ACTIVE:
-                    *call_state = LYNQ_CALL_ACTIVE;
-                    break;
-                case MBTK_HELD:
-                    *call_state = LYNQ_CALL_HOLDING;
-                    break;
-                case MBTK_DIALING:
-                    *call_state = LYNQ_CALL_DIALING;
-                    break;
-                case MBTK_ALERTING:
-                    *call_state = LYNQ_CALL_ALERTING;
-                    break;
-                case MBTK_INCOMING:
-                    *call_state = LYNQ_CALL_INCOMING;
-                    break;
-                case MBTK_WAITING:
-                    *call_state = LYNQ_CALL_WAITING;
-                    break;
-                case MBTK_OFFERING:
-                    *call_state = LYNQ_CALL_OFFERING;
-                    break;
-                default:
-                    break;
-            }
-            flag = 1;
-            break;
-        }
-    }
-    if(flag == 0)
-    {
-        return -1;
-    }
-    return 0;
-
-    /*
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-    int err = mbtk_call_reg_get(info_handle, &reg);
-    if(err) {
-        return -1;
-    } else {
-        printf("CLCC : %d, %d, %d, %d, %d, %s, %d", reg.dir1, reg.dir, reg.state, reg.mode, reg.mpty, reg.phone_number, reg.type);
-        *direction = reg.dir;
-        *toa = reg.type;
-        memcpy(addr, reg.phone_number, strlen(reg.phone_number));
-        switch (reg.state)
-        {
-            case MBTK_ACTIVE:
-                *call_state = LYNQ_CALL_ACTIVE;
-                break;
-            case MBTK_HELD:
-                *call_state = LYNQ_CALL_HOLDING;
-                break;
-            case MBTK_DIALING:
-                *call_state = LYNQ_CALL_DIALING;
-                break;
-            case MBTK_ALERTING:
-                *call_state = LYNQ_CALL_ALERTING;
-                break;
-            case MBTK_INCOMING:
-                *call_state = LYNQ_CALL_INCOMING;
-                break;
-            case MBTK_WAITING:
-                *call_state = LYNQ_CALL_WAITING;
-                break;
-            case MBTK_OFFERING:
-                *call_state = LYNQ_CALL_OFFERING;
-                break;
-            default:
-                break;
-        }
-        return 0;
-    }
-    */
-
-}
-
-
-#ifdef MBTK_PLATFORM_ASR1803
-void lynq_audio_volume_cb(int volume)
-{
-	lynq_volume_size = volume;
-    if(lynq_volume_size <= 0 || lynq_volume_size > 100)
-    {
-
-    }
-    else
-    {
-        //printf("%s:%d\n", __FUNCTION__, volume);
-        printf("%s:%d\n", __FUNCTION__, lynq_volume_size);
-    }
-}
-#endif
-
-int lynq_set_speech_volume(const int volume)
-{
-
-#ifdef MBTK_PLATFORM_ASR1803
-    if(volume <= 0 || volume >= 101)
-    {
-        printf("input error\n");
-        return -1;
-    }
-    else
-    {
-        int set_volume = 0;
-        set_volume = volume;
-        mbtk_audio_ubus_volume_set(set_volume);
-        return 0;
-    }
-#else
-
-    return 0;
-#endif
-}
-
-int lynq_get_speech_volume(int * volume)
-{
-#ifdef MBTK_PLATFORM_ASR1803
-	mbtk_audio_ubus_volume_get(lynq_audio_volume_cb);
-    sleep(1);
-	*volume = lynq_volume_size;
-	return 0;
-#else
-
-    return 0;
-#endif
-}
\ No newline at end of file
diff --git a/mbtk/lynq_lib/src/lynq_data_call.c b/mbtk/lynq_lib/src/lynq_data_call.c
new file mode 100755
index 0000000..fae8e3f
--- /dev/null
+++ b/mbtk/lynq_lib/src/lynq_data_call.c
@@ -0,0 +1,81 @@
+#include "lynq-qser-data.h"
+#include "mbtk_type.h"
+
+
+int qser_data_call_init(qser_data_call_evt_cb_t evt_cb)
+{
+    UNUSED(evt_cb);
+
+    return 0;
+}
+
+void qser_data_call_destroy(void)
+{
+
+}
+
+int qser_data_call_start(qser_data_call_s *data_call, qser_data_call_error_e *err)
+{
+    UNUSED(data_call);
+    UNUSED(err);
+
+    return 0;
+}
+
+int qser_data_call_stop(char profile_idx, qser_data_call_ip_family_e ip_family, qser_data_call_error_e *err)
+{
+    UNUSED(profile_idx);
+    UNUSED(ip_family);
+    UNUSED(err);
+
+    return 0;
+}
+
+int qser_data_call_info_get(char profile_idx,qser_data_call_ip_family_e ip_family,
+        qser_data_call_info_s *info, qser_data_call_error_e *err)
+{
+    UNUSED(profile_idx);
+    UNUSED(ip_family);
+    UNUSED(info);
+    UNUSED(err);
+
+    return 0;
+}
+
+int qser_apn_set(qser_apn_info_s *apn)
+{
+    UNUSED(apn);
+
+    return 0;
+}
+
+int qser_apn_get(unsigned char profile_idx, qser_apn_info_s *apn)
+{
+    UNUSED(profile_idx);
+    UNUSED(apn);
+
+    return 0;
+}
+
+int qser_apn_add(qser_apn_add_s *apn, unsigned char *profile_idx)
+{
+    UNUSED(apn);
+    UNUSED(profile_idx);
+
+    return 0;
+}
+
+int qser_apn_del(unsigned char profile_idx)
+{
+    UNUSED(profile_idx);
+
+    return 0;
+}
+
+int qser_apn_get_list(qser_apn_info_list_s *apn_list)
+{
+    UNUSED(apn_list);
+
+    return 0;
+}
+
diff --git a/mbtk/lynq_lib/src/lynq_fota.c b/mbtk/lynq_lib/src/lynq_fota.c
new file mode 100755
index 0000000..049bc08
--- /dev/null
+++ b/mbtk/lynq_lib/src/lynq_fota.c
@@ -0,0 +1,32 @@
+#include "lynq-qser-fota.h"
+#include "mbtk_type.h"
+
+int lynq_rock_main(int first_run)
+{
+    UNUSED(first_run);
+
+
+    return 0;
+}
+
+int lynq_fota_set_addr_value(char *value,int size)
+{
+    UNUSED(value);
+    UNUSED(size);
+
+
+    return 0;
+}
+
+int lynq_fota_nrestart(void)
+{
+
+    return 0;
+}
+
+int lynq_get_upgrade_status(void)
+{
+
+    return 0;
+}
+
diff --git a/mbtk/lynq_lib/src/lynq_gnss.c b/mbtk/lynq_lib/src/lynq_gnss.c
index 19c2d42..d86124c 100755
--- a/mbtk/lynq_lib/src/lynq_gnss.c
+++ b/mbtk/lynq_lib/src/lynq_gnss.c
@@ -1,212 +1,79 @@
-/**
- *   \file gnss_test.c
- *   \brief A Documented file.
- *
- *  Detailed description
- *   \Author:  Sniper <e190@163.com>
- *   \Version: 1.0.0
- *   \Date: 2022-03-26
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <pthread.h>
-#include <errno.h>
-#include <termios.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <pthread.h>
-#include <termios.h>
-#include <sys/ioctl.h>
-#include "mbtk_type.h"
-#include "lynq/lynq_gnss.h"
+#include "lynq_gnss.h"
 
-#ifdef MBTK_GNSS_6228
-#include "mbtk_gnss_6228.h"
-
-static mbtk_gnss_client_handle _gnss_handle = 0;
-
-#else
-
-#endif
-
-
-static lynq_gnss_rx_ind_msg_handler_t handler_ptr = NULL;
-
-#ifdef MBTK_GNSS_6228
-void lynq_gnss_handler_function
-(
-    mbtk_gnss_client_handle  h_loc,
-    int   e_msg_id,
-    void                    *pv_data,
-    void                    *context_ptr
-)
+int qser_Gnss_Init (uint32_t *h_gnss)
 {
-    if(NULL == handler_ptr)
-        return;
+    UNUSED(h_gnss);
 
-    if(E_LYNQ_LOC_MSG_ID_NMEA_INFO == e_msg_id) {
-        handler_ptr(h_loc, e_msg_id, pv_data, context_ptr);
-    } else {
-    }
-}
 
-//该函数用于进行GNSS初始化
-int lynq_gnss_init(void)
-{
-	int ret=0;
-
-    ret = mbtk_gnss_client_init(&_gnss_handle);
-	if(ret < 0) {
-		printf("mopen_gnss_client_init FAIL.	ret:%d\n",ret);
-		return -1;
-	}
-
-	return 0;
-}
-
-//该函数用于取消GNSS初始化
-int lynq_gnss_deinit(void)
-{
-    int ret;
-	if(0 == _gnss_handle) {
-		return -1;
-	}
-
-    ret = mbtk_gnss_client_deinit(_gnss_handle);
-	if(ret < 0) {
-		printf("mopen_gnss_client_deinit FAIL.	ret:%d\n",ret);
-		return -1;
-	}
-
-	_gnss_handle = 0;
     return 0;
 }
 
-//该函数用于GNSS回调函数初始化
-
-int lynq_gnss_callback_reg(lynq_gnss_rx_ind_msg_handler_t handlerPtr)
+int qser_Gnss_Deinit (uint32_t h_gnss)
 {
-    int ret;
-
-	if(0 == _gnss_handle) {
-		return -1;
-	}
-	mbtk_gnss_print_version(_gnss_handle);
-
-    ret = mbtk_gnss_add_rx_msg_handler(_gnss_handle, lynq_gnss_handler_function);
-    if(0 == ret && handlerPtr)
-        handler_ptr = handlerPtr;
-    else
-        return -1;
-	return 0;
-}
-
-//该函数用于启动GNSS。
-int lynq_gnss_start(void)
-{
-	if(0 == _gnss_handle) {
-		return -1;
-	}
-
-    mbtk_gnss_set_mode(_gnss_handle, 0);
-    return mbtk_gnss_set_mode(_gnss_handle, 3);
-}
-
-//该函数用于关闭GNSS。
-int lynq_gnss_stop(void)
-{
-	if(0 == _gnss_handle) {
-		return -1;
-	}
-
-    return mbtk_gnss_set_mode(_gnss_handle, 0);
-}
+    UNUSED(h_gnss);
 
 
-int lynq_gnss_agps_dataconnopen(void)
-{
-    int ret;
-
-    ret = mbtk_gnss_download_tle();
-    if(ret)
-    {
-        printf("%s: download injects failed!!\n", __FUNCTION__);
-        return -1;
-    }
-    return mbtk_gnss_injects_aidpos(_gnss_handle);
-}
-
-int lynq_gnss_dev_reset(void)
-{
-	int ret = 0;
-	if(_gnss_handle < 0)
-	{
-		return -1;
-	}
-	ret = mbtk_gnss_dev_reset(_gnss_handle, 0, 0);
-	return ret;
-}
-
-int lynq_gnss_enable_glonass(void)
-{
-    mbtk_gnss_firmware_update();
     return 0;
 }
-#else
-//该函数用于进行GNSS初始化
-int lynq_gnss_init(void)
-{
 
-	return 0;
+int qser_AddRxIndMsgHandler (gnss_handler_func_t handler_ptr,uint32_t h_gnss)
+{
+    UNUSED(handler_ptr);
+    UNUSED(h_gnss);
+
+
+    return 0;
 }
 
-//该函数用于取消GNSS初始化
-int lynq_gnss_deinit(void)
+int qser_Set_Indications (uint32_t h_gnss,e_msg_id_t type)
+{
+    UNUSED(h_gnss);
+    UNUSED(type);
+
+
+    return 0;
+}
+
+int qser_Gnss_Start (uint32_t h_gnss)
+{
+    UNUSED(h_gnss);
+
+    return 0;
+}
+
+int qser_Gnss_Stop (uint32_t h_gnss)
+{
+    UNUSED(h_gnss);
+
+    return 0;
+}
+
+int qser_Gnss_InjectTime (uint32_t h_gnss,LYNQ_INJECT_TIME_INTO_T *time_info)
+{
+    UNUSED(h_gnss);
+    UNUSED(time_info);
+
+    return 0;
+}
+
+int qser_Gnss_Delete_Aiding_Data (uint32_t h_gnss,DELETE_AIDING_DATA_TYPE_T flags)
+{
+    UNUSED(h_gnss);
+    UNUSED(flags);
+
+    return 0;
+}
+
+int qser_Gnss_download_tle()
 {
 
     return 0;
 }
 
-//该函数用于GNSS回调函数初始化
-
-int lynq_gnss_callback_reg(lynq_gnss_rx_ind_msg_handler_t handlerPtr)
+int qser_Gnss_injectEphemeris(uint32_t h_gnss)
 {
-    UNUSED(handlerPtr);
+    UNUSED(h_gnss);
 
-
-	return 0;
-}
-
-//该函数用于启动GNSS。
-int lynq_gnss_start(void)
-{
-	return 0;
-}
-
-//该函数用于关闭GNSS。
-int lynq_gnss_stop(void)
-{
-	return 0;
-}
-
-
-int lynq_gnss_agps_dataconnopen(void)
-{
     return 0;
 }
 
-int lynq_gnss_dev_reset(void)
-{
-	return 0;
-}
-
-int lynq_gnss_enable_glonass(void)
-{
-    return 0;
-}
-#endif
\ No newline at end of file
diff --git a/mbtk/lynq_lib/src/lynq_gpio.c b/mbtk/lynq_lib/src/lynq_gpio.c
new file mode 100755
index 0000000..ef1c522
--- /dev/null
+++ b/mbtk/lynq_lib/src/lynq_gpio.c
@@ -0,0 +1,62 @@
+#include "mbtk_type.h"
+#include "lynq-gpio.h"
+
+int lynq_gpio_init(int gpio, int direction, int value, int pullsel)
+{
+    UNUSED(gpio);
+    UNUSED(direction);
+    UNUSED(value);
+    UNUSED(pullsel);
+
+    return 0;
+}
+
+int lynq_gpio_deinit(int gpio)
+{
+    UNUSED(gpio);
+
+    return 0;
+}
+
+int lynq_gpio_direction_set(int gpio, int direction)
+{
+    UNUSED(gpio);
+    UNUSED(direction);
+
+    return 0;
+}
+
+
+int lynq_gpio_value_set(int gpio, int value)
+{
+    UNUSED(gpio);
+    UNUSED(value);
+
+    return 0;
+}
+
+int lynq_gpio_value_get(int gpio)
+{
+    UNUSED(gpio);
+
+    return 0;
+}
+
+int lynq_gpio_pullsel_set(int gpio, int pullsel)
+{
+    UNUSED(gpio);
+    UNUSED(pullsel);
+
+    return 0;
+}
+
+
+int lynq_gpio_pullsel_get(int gpio)
+{
+    UNUSED(gpio);
+
+    return 0;
+}
+
+
+
diff --git a/mbtk/lynq_lib/src/lynq_irq.c b/mbtk/lynq_lib/src/lynq_irq.c
new file mode 100755
index 0000000..ea63736
--- /dev/null
+++ b/mbtk/lynq_lib/src/lynq_irq.c
@@ -0,0 +1,43 @@
+#include "lynq-irq.h"
+#include "mbtk_type.h"
+
+int lynq_irq_install(int line, irq_handler irq_test_handler, int trig_type)
+{
+    UNUSED(line);
+    UNUSED(irq_test_handler);
+    UNUSED(trig_type);
+
+    return 0;
+}
+
+int lynq_irq_unstall(int line)
+{
+    UNUSED(line);
+
+    return 0;
+}
+
+int lynq_irq_set_type(int line, int trig_type)
+{
+    UNUSED(line);
+    UNUSED(trig_type);
+
+    return 0;
+}
+
+int lynq_set_wake(int line, int en)
+{
+    UNUSED(line);
+    UNUSED(en);
+
+    return 0;
+}
+
+int lynq_irq_get_wake(int line)
+{
+    UNUSED(line);
+
+    return 0;
+}
+
+
diff --git a/mbtk/lynq_lib/src/lynq_log.c b/mbtk/lynq_lib/src/lynq_log.c
new file mode 100755
index 0000000..7824d3f
--- /dev/null
+++ b/mbtk/lynq_lib/src/lynq_log.c
@@ -0,0 +1,124 @@
+#include "liblog.h"
+#include "mbtk_type.h"
+
+
+void lynq_log_configuration_init(const char *log_name)
+{
+    UNUSED(log_name);
+
+
+}
+
+void lynq_log_global_output(log_level_enum Level,const char *format,...)
+{
+    UNUSED(Level);
+    UNUSED(format);
+
+
+}
+
+int lynq_syslog_set_file_size(int value)
+{
+    UNUSED(value);
+
+    return 0;
+}
+
+int lynq_syslog_get_file_size(void)
+{
+
+    return -1;
+}
+
+int lynq_syslog_set_file_rotate(int value)
+{
+    UNUSED(value);
+
+    return 0;
+}
+
+int lynq_syslog_get_file_rotate(void)
+{
+
+    return 0;
+}
+
+int lynq_set_log_level(const char * module_name, log_level_enum level)
+{
+    UNUSED(module_name);
+    UNUSED(level);
+
+
+    return 0;
+}
+
+int lynq_get_log_level(const char * module_name, log_level_enum *level)
+{
+    UNUSED(module_name);
+    UNUSED(level);
+
+
+    return 0;
+}
+
+int lynq_set_special_log_level(const char * exe_name, const char * module_name, log_level_enum level)
+{
+    UNUSED(exe_name);
+    UNUSED(module_name);
+    UNUSED(level);
+
+
+    return 0;
+}
+
+int lynq_get_special_log_level(const char * exe_name, const char * module_name, log_level_enum *level)
+{
+    UNUSED(exe_name);
+    UNUSED(module_name);
+    UNUSED(level);
+
+
+    return 0;
+}
+
+int lynq_notify_recalc_log_level(pid_t pid)
+{
+    UNUSED(pid);
+
+    return 0;
+}
+
+void lynq_log_debug(const char *format,...)
+{
+    UNUSED(format);
+
+
+}
+
+void lynq_log_info(const char *format,...)
+{
+    UNUSED(format);
+
+
+}
+
+void lynq_log_warning(const char *format,...)
+{
+    UNUSED(format);
+
+
+}
+
+void lynq_log_error(const char *format,...)
+{
+    UNUSED(format);
+
+
+}
+
+void lynq_log_verbose(const char *format,...)
+{
+    UNUSED(format);
+
+
+}
diff --git a/mbtk/lynq_lib/src/lynq_net_api.c b/mbtk/lynq_lib/src/lynq_net_api.c
deleted file mode 100755
index f2195e0..0000000
--- a/mbtk/lynq_lib/src/lynq_net_api.c
+++ /dev/null
@@ -1,708 +0,0 @@
-#include "lynq/lynq_net_api.h"
-
-static mbtk_info_handle_t* info_handle = NULL;
-
-typedef struct
-{
-    uint8 *operator_l;
-    uint8 *operator_s;
-    uint32 mcc_mnc;
-} operator_mcc_mnc_t;
-
-static operator_mcc_mnc_t operator_mcc_mnc[] =
-{
-    {"China Mobile","CMCC",46000},
-    {"China Unicom","CU",46001},
-    {"China Mobile","CMCC",46002},
-    {"China Telecom","CT",46003},
-    {"China Mobile","CMCC",46004},
-    {"China Telecom","CT",46005},
-    {"China Unicom","CU",46006},
-    {"China Mobile","CMCC",46007},
-    {"China Mobile","CMCC",46008},
-    {"China Unicom","CU",46009},
-    {"China Telecom","CT",46011}
-};
-
-int lynq_network_init(int uToken)
-{
-    UNUSED(uToken);
-    if(info_handle == NULL)
-    {
-        info_handle = mbtk_info_handle_get();
-        if(info_handle)
-        {
-            return 0;
-        }
-    }
-
-    return -1;
-}
-
-int lynq_network_deinit(void)
-{
-    if(info_handle)
-    {
-        return mbtk_info_handle_free(&info_handle);
-    }
-    else
-    {
-        return -1;
-    }
-}
-
-int lynq_get_version(char buf[])
-{
-    if(info_handle == NULL || buf == NULL)
-    {
-        return -1;
-    }
-
-    int err = mbtk_version_get(info_handle, buf);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_get_imei(char buf[])
-{
-    if(info_handle == NULL || buf == NULL)
-    {
-        return -1;
-    }
-
-    int err = mbtk_imei_get(info_handle, buf);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_get_sn(char buf[])
-{
-    if(info_handle == NULL || buf == NULL)
-    {
-        return -1;
-    }
-
-    int err = mbtk_sn_get(info_handle, buf);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_get_zone_tmp(ZONE_NUM num, int *temp)
-{
-    if(info_handle == NULL || temp == NULL)
-    {
-        return -1;
-    }
-
-    return mbtk_temp_get(info_handle, num, temp);
-}
-
-int lynq_shutdown(char options[])
-{
-    if(options == NULL)
-    {
-        return -1;
-    }
-
-    if(!strcmp(options, "reboot")) {
-        return mbtk_system_reboot(0);
-    } else if(!strcmp(options, "poweroff")) {
-        return mbtk_system_reboot(1);
-    } else if(!strcmp(options, "halt")) {
-        return mbtk_system_reboot(2);
-    } else {
-        return -1;
-    }
-    return 0;
-}
-
-int lynq_time_set(mbtk_time_type_enum time_type, char* time_str)
-{
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-
-    return mbtk_time_set(info_handle, time_type, time_str);
-}
-
-int lynq_get_sim_status(int *card_status)
-{
-    if(info_handle == NULL || card_status == NULL)
-    {
-        return -1;
-    }
-
-    mbtk_sim_state_enum sim;
-    int err = mbtk_sim_state_get(info_handle, &sim);
-    if(err) {
-        return -1;
-    } else {
-        *card_status = sim;
-        return 0;
-    }
-}
-
-int lynq_get_imsi(char buf[])
-{
-    if(info_handle == NULL || buf == NULL)
-    {
-        return -1;
-    }
-
-    int err = mbtk_imsi_get(info_handle, buf);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_get_iccid(char buf[])
-{
-    if(info_handle == NULL || buf == NULL)
-    {
-        return -1;
-    }
-
-    int err = mbtk_iccid_get(info_handle, buf);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_query_phone_number(char buf[])
-{
-    if(info_handle == NULL || buf == NULL)
-    {
-        return -1;
-    }
-
-    int err = mbtk_phone_number_get(info_handle, buf);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_sim_power (int mode)
-{
-    if(mode != 0 && mode != 1)
-    {
-        return -1;
-    }
-
-    return mbtk_sim_power_set(mode);
-}
-
-int lynq_query_operater(char *OperatorFN,char *OperatorSH,char *MccMnc)
-{
-    if(info_handle == NULL || OperatorFN == NULL || OperatorSH == NULL || MccMnc == NULL)
-    {
-        return -1;
-    }
-
-    mbtk_net_info_t net;
-    if(!mbtk_net_sel_mode_get(info_handle, &net) && net.plmn > 0)
-    {
-        // printf("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
-        int i = 0;
-        while(i < ARRAY_SIZE(operator_mcc_mnc))
-        {
-            if(operator_mcc_mnc[i].mcc_mnc == net.plmn)
-                break;
-            i++;
-        }
-
-        if(i == ARRAY_SIZE(operator_mcc_mnc))   // No found mcc&mnc
-        {
-            strcpy(OperatorFN, "UNKNOWN");
-            strcpy(OperatorSH, "UNKNOWN");
-            sprintf(MccMnc, "%d", net.plmn);
-        }
-        else
-        {
-            strcpy(OperatorFN, operator_mcc_mnc[i].operator_l);
-            strcpy(OperatorSH, operator_mcc_mnc[i].operator_s);
-            sprintf(MccMnc, "%d", operator_mcc_mnc[i].mcc_mnc);
-        }
-        return 0;
-    }
-
-    return -1;
-}
-
-int lynq_query_network_selection_mode (int *netselMode)
-{
-    if(info_handle == NULL || netselMode == NULL)
-    {
-        return -1;
-    }
-
-    mbtk_net_info_t net;
-    if(!mbtk_net_sel_mode_get(info_handle, &net))
-    {
-        // printf("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
-        *netselMode = net.net_sel_mode;
-        return 0;
-    }
-
-    return -1;
-}
-
-int lynq_set_network_selection_mode(const char *mode, const char* mccmnc)
-{
-    if(info_handle == NULL || str_empty(mode))
-    {
-        return -1;
-    }
-
-    mbtk_net_info_t net;
-    net.net_type = 0xFF;
-    if(!strcmp(mode, "Auto"))
-    {
-        net.net_sel_mode = 0;
-        net.plmn = 0;
-    }
-    else if(!strcmp(mode, "Manual") && !str_empty(mccmnc))
-    {
-        net.net_sel_mode = 1;
-        net.plmn = (uint32)atoi(mccmnc);
-    }
-    else
-    {
-        return -1;
-    }
-    if(!mbtk_net_sel_mode_set(info_handle, &net))
-    {
-        return 0;
-    }
-
-    return -1;
-}
-
-int lynq_query_available_network(list_node_t** net_list)
-{
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-
-    return mbtk_available_net_get(info_handle, net_list);
-}
-
-int lynq_query_registration_state(const char *type, int* regState,int *imsRegState,char * LAC,char *CID,int *netType,int * radioTechFam,int *netRejected)
-{
-    if(info_handle == NULL || str_empty(type) || regState == NULL || imsRegState == NULL
-        || LAC == NULL || CID == NULL || netType == NULL || radioTechFam == NULL || netRejected == NULL)
-    {
-        return -1;
-    }
-    mbtk_net_reg_info_t reg;
-    int err = mbtk_net_reg_get(info_handle, &reg);
-    if(err) {
-        *netRejected = err;
-        return -1;
-    } else {
-        //printf("REG : %d, %d, %d, %04x, %08o\n", reg.state, reg.type, reg.ims_reg, reg.lac, reg.ci);
-        // Voice/Data/IMS
-        if(strcmp("Voice", type) == 0) {
-            *regState = reg.call_state;
-        } else if(strcmp("Data", type) == 0) {
-            *regState = reg.data_state;
-        } else if(strcmp("IMS", type) == 0) {
-            *imsRegState = reg.ims_state;
-        } else {
-            return -1;
-        }
-
-        if(reg.call_state != MBTK_NET_REG_STATE_NON || reg.data_state != MBTK_NET_REG_STATE_NON || reg.ims_state != MBTK_NET_REG_STATE_NON) {
-            sprintf(LAC, "%04x", reg.lac);
-            sprintf(CID, "%08o", reg.ci);
-            *netType = reg.type;
-            *radioTechFam = RADIO_TECH_3GPP;
-        }
-        return 0;
-    }
-}
-
-int lynq_query_prefferred_networktype (int *preNetType)
-{
-    if(info_handle == NULL || preNetType == NULL)
-    {
-        return -1;
-    }
-
-    mbtk_band_info_t band;
-    int err = mbtk_current_band_get(info_handle, &band);
-    if(err) {
-        return -1;
-    } else {
-        //printf("Band : %d, %d, %d, %d, %d\n", band.net_pref, band.gsm_band, band.umts_band, band.tdlte_band, band.fddlte_band);
-        *preNetType = band.net_pref;
-        return 0;
-    }
-}
-
-int lynq_set_prefferred_networktype (const int preNetType)
-{
-
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-	if(preNetType < 0 || preNetType > 15)
-	{
-		return -2;
-	}
-    mbtk_band_info_t band;
-    memset(&band, 0, sizeof(mbtk_band_info_t));
-    band.net_pref = preNetType;
-    int err = mbtk_current_band_set(info_handle, &band);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_set_band_mode(int gsm_band, int umts_band, int tdlte_band, int fddlte_band)
-{
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-
-    mbtk_band_info_t band;
-    band.net_pref = 0xFF; // No change network pref.
-    band.gsm_band = (uint16)gsm_band;
-    band.umts_band = (uint16)umts_band;
-    band.tdlte_band = (uint32)tdlte_band;
-    band.fddlte_band = (uint32)fddlte_band;
-    int err = mbtk_current_band_set(info_handle, &band);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_query_available_bandmode (int *gsm_band, int *umts_band, int *tdlte_band, int *fddlte_band)
-{
-    if(info_handle == NULL || gsm_band == NULL || umts_band == NULL || tdlte_band == NULL || fddlte_band == NULL)
-    {
-        return -1;
-    }
-
-    mbtk_band_info_t band;
-    int err = mbtk_support_band_get(info_handle, &band);
-    if(err) {
-        return -1;
-    } else {
-        //printf("Band : %d, %d, %d, %d, %d\n", band.net_pref, band.gsm_band, band.umts_band, band.tdlte_band, band.fddlte_band);
-        *gsm_band = band.gsm_band;
-        *umts_band = band.umts_band;
-        *tdlte_band = band.tdlte_band;
-        *fddlte_band = band.fddlte_band;
-        return 0;
-    }
-}
-
-int lynq_radio_on (const int data)
-{
-    if(info_handle == NULL || (data != 0 && data != 1))
-    {
-        return -1;
-    }
-
-    int err = mbtk_radio_state_set(info_handle, data);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_query_radio_tech (int* radioTech)
-{
-    if(info_handle == NULL || radioTech == NULL)
-    {
-        return -1;
-    }
-
-    int err = mbtk_radio_state_get(info_handle, radioTech);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_solicited_signal_strength (signalStrength_t *solSigStren)
-{
-    if(info_handle == NULL || solSigStren == NULL)
-    {
-        return -1;
-    }
-
-    mbtk_signal_info_t signal;
-    int err = mbtk_net_signal_get(info_handle, &signal);
-    if(err) {
-        return -1;
-    } else {
-        memset(solSigStren, 0, sizeof(signalStrength_t));
-        switch(mbtk_net_type_get(signal.type))
-        {
-            case MBTK_NET_TYPE_GSM:
-                solSigStren->gsm_sig_valid = 1;
-                break;
-            case MBTK_NET_TYPE_UMTS:
-                solSigStren->umts_sig_valid = 1;
-                break;
-            case MBTK_NET_TYPE_LTE:
-                solSigStren->lte_sig_valid = 1;
-                break;
-            default:
-                break;
-        }
-        solSigStren->rssi = signal.rssi;
-        solSigStren->ber = signal.ber;
-        solSigStren->rxlev = signal.rxlev;
-        solSigStren->rscp = signal.rscp;
-        solSigStren->ecno = signal.ecno;
-        solSigStren->rsrq = signal.rsrq;
-        solSigStren->rsrp = signal.rsrp;
-        return 0;
-    }
-}
-
-int lynq_set_ims (const int ims_mode)
-{
-    if(info_handle == NULL || (ims_mode != 0 && ims_mode != 1))
-    {
-        return -1;
-    }
-
-    int err = mbtk_volte_state_set(info_handle, ims_mode);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int lynq_init_cell(void)
-{
-    if(info_handle == NULL)
-    {
-        info_handle = mbtk_info_handle_get();
-        if(info_handle)
-        {
-			printf("creat info_handle is success\n");
-        }
-		else{
-			printf("creat info_handle is fail\n");
-			return -1;
-		}
-    }
-
-    return 0;
-}
-
-int lynq_deinit_cell(void)
-{
-    if(info_handle)
-    {
-        return mbtk_info_handle_free(&info_handle);
-    }
-    else
-    {
-        return -1;
-    }
-}
-
-/*
-* Get current cell infomation.
-*/
-int lynq_query_cell_info(int *type, list_node_t **cell_list)
-{
-    if(info_handle == NULL || type == NULL)
-    {
-        return -1;
-    }
-
-    return mbtk_cell_get(info_handle, type, cell_list);
-}
-
-/*
-* set current cell infomation.
-*/
-void lynq_set_cell_info(char *mem)
-{
-    if(info_handle == NULL || mem == NULL)
-    {
-        return -1;
-    }
-
-	char resp[1024] = {0};
-    mbtk_cell_set(info_handle, mem, resp);
-
-	return ;
-}
-
-/*
-* Set specific APN informations.
-*
-* cid : 2-7
-*/
-int lynq_apn_set(int cid, mbtk_ip_type_enum ip_type, const void* apn_name,
-                    const void *user_name, const void *user_pass, const void *auth)
-{
-    if(info_handle == NULL || str_empty(apn_name))
-    {
-        return -1;
-    }
-
-    return mbtk_apn_set(info_handle, cid, ip_type, apn_name, user_name, user_pass, auth);
-}
-
-/*
-* Get current all APN informations.
-*/
-int lynq_apn_get(int *apn_num, mbtk_apn_info_t apns[])
-{
-    if(info_handle == NULL || apn_num == NULL || apns == NULL)
-    {
-        return -1;
-    }
-
-    return mbtk_apn_get(info_handle, apn_num, apns);
-}
-
-/*
-* Start data call.
-*/
-int lynq_data_call_start(int cid, int timeout)
-{
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-
-    return mbtk_data_call_start(info_handle, cid, 0, FALSE, timeout);
-}
-
-/*
-* Stop data call.
-*/
-int lynq_data_call_stop(int cid, int timeout)
-{
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-
-    return mbtk_data_call_stop(info_handle, cid, timeout);
-}
-
-/*
-* Query data call state.
-*/
-int lynq_data_call_query(int cid, mbtk_ipv4_info_t *ipv4, mbtk_ipv6_info_t *ipv6)
-{
-    if(info_handle == NULL || ipv4 == NULL || ipv6 == NULL)
-    {
-        return -1;
-    }
-
-    return mbtk_data_call_state_get(info_handle, cid, ipv4, ipv6);
-}
-
-/*
- * Get the native ip and free port.
- */
-int lynq_get_ip_and_port(char *ipBuf_out,int *port,int iptype)
-{
-    char psz_port_cmd[128];
-    int i=0;
-
-    *port = rand() % (60000 - 50000 + 1) + 50000;
-    sprintf(psz_port_cmd, "netstat -an | grep :%d > /dev/null", *port);
-
-        char ipBuf[32] = "";
-        FILE *fstream=NULL;
-
-        char buff[1024];
-        char iptype_str[8];
-        memset(buff,0,sizeof(buff));
-        /*eth0????eth1?docker0?em1?lo?*/
-        if(iptype == 1)
-        {
-
-            if(NULL==(fstream=popen("ifconfig ccinet0 | grep \"inet6 addr: 2\" | awk '{print $3}'","r")))
-            {
-                snprintf(ipBuf, 39, "%s","0:0:0:0:0:0:0:0");
-            }
-            if(NULL!=fgets(buff, sizeof(buff), fstream))
-            {
-                snprintf(ipBuf, 39, "%s",buff);
-            }
-            else
-            {
-                snprintf(ipBuf, 39, "%s","0:0:0:0:0:0:0:0");
-                pclose(fstream);
-            }
-        }
-        else if(iptype == 0)
-        {
-            if(NULL==(fstream=popen("ifconfig ccinet0 | grep \"inet addr:\" | awk \'{print $2}\' | cut -c 6-","r")))
-            {
-                snprintf(ipBuf, 18, "%s","0.0.0.0");
-            }
-            if(NULL!=fgets(buff, sizeof(buff), fstream))
-            {
-                snprintf(ipBuf, 18, "%s",buff);
-            }
-            else
-            {
-                snprintf(ipBuf, 18, "%s","0.0.0.0");
-                pclose(fstream);
-            }
-        }
-        else
-        {
-            return -1;
-        }
-            pclose(fstream);
-
-        printf("ip:%s\n", ipBuf);
-        memcpy(ipBuf_out, ipBuf, 32);
-        return 0;
-}
-
-int lynq_get_modem_fun(MBTK_DEV_MODEM_FUNCTION *fun)
-{
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-
-    int err = mbtk_get_modem_fun(info_handle, fun);
-    if(err) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
diff --git a/mbtk/lynq_lib/src/lynq_net_light.c b/mbtk/lynq_lib/src/lynq_net_light.c
new file mode 100755
index 0000000..34394af
--- /dev/null
+++ b/mbtk/lynq_lib/src/lynq_net_light.c
@@ -0,0 +1,17 @@
+#include "lynq_led.h"
+#include "mbtk_type.h"
+
+int lynq_set_netled_on(int led_mode)
+{
+    UNUSED(led_mode);
+
+    return 0;
+}
+
+int lynq_set_statusled_on(int led_mode)
+{
+    UNUSED(led_mode);
+
+    return 0;
+}
+
diff --git a/mbtk/lynq_lib/src/lynq_network.c b/mbtk/lynq_lib/src/lynq_network.c
new file mode 100755
index 0000000..5212da5
--- /dev/null
+++ b/mbtk/lynq_lib/src/lynq_network.c
@@ -0,0 +1,72 @@
+#include "lynq_qser_network.h"
+
+int qser_nw_client_init(nw_client_handle_type *ph_nw)
+{
+    UNUSED(ph_nw);
+
+    return 0;
+}
+
+int qser_nw_client_deinit(nw_client_handle_type h_nw)
+{
+    UNUSED(h_nw);
+
+    return 0;
+}
+
+int qser_nw_set_config(nw_client_handle_type h_nw,QSER_NW_CONFIG_INFO_T *pt_info)
+{
+    UNUSED(h_nw);
+    UNUSED(pt_info);
+
+    return 0;
+}
+
+int qser_nw_get_operator_name(nw_client_handle_type h_nw, QSER_NW_OPERATOR_NAME_INFO_T *pt_info)
+{
+    UNUSED(h_nw);
+    UNUSED(pt_info);
+
+    return 0;
+}
+
+int qser_nw_get_reg_status(nw_client_handle_type h_nw, QSER_NW_REG_STATUS_INFO_T *pt_info)
+{
+    UNUSED(h_nw);
+    UNUSED(pt_info);
+
+    return 0;
+}
+
+int qser_nw_get_signal_strength(nw_client_handle_type h_nw,QSER_NW_SIGNAL_STRENGTH_INFO_T *pt_info)
+{
+    UNUSED(h_nw);
+    UNUSED(pt_info);
+
+    return 0;
+}
+
+int qser_nw_add_rx_msg_handler (nw_client_handle_type h_nw, QSER_NW_RxMsgHandlerFunc_t handlerPtr, void* contextPtr)
+{
+    UNUSED(h_nw);
+    UNUSED(handlerPtr);
+    UNUSED(contextPtr);
+
+    return 0;
+}
+
+int qser_nw_set_oos_config (nw_client_handle_type h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info)
+{
+    UNUSED(h_nw);
+    UNUSED(pt_info);
+
+    return 0;
+}
+
+int qser_nw_get_oos_config (nw_client_handle_type h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info)
+{
+    UNUSED(h_nw);
+    UNUSED(pt_info);
+
+    return 0;
+}
\ No newline at end of file
diff --git a/mbtk/lynq_lib/src/lynq_sim.c b/mbtk/lynq_lib/src/lynq_sim.c
new file mode 100755
index 0000000..6bb6ed1
--- /dev/null
+++ b/mbtk/lynq_lib/src/lynq_sim.c
@@ -0,0 +1,96 @@
+#include "lynq_qser_sim.h"
+#include "mbtk_type.h"
+
+int qser_sim_client_init(sim_client_handle_type *ph_sim)
+{
+    UNUSED(ph_sim);
+
+    return 0;
+}
+
+int qser_sim_getimsi(sim_client_handle_type h_sim, QSER_SIM_APP_ID_INFO_T *pt_info,char *imsi,size_t imsiLen)
+{
+    UNUSED(h_sim);
+    UNUSED(pt_info);
+    UNUSED(imsi);
+    UNUSED(imsiLen);
+
+    return 0;
+}
+
+int qser_sim_geticcid(sim_client_handle_type h_sim,QSER_SIM_SLOT_ID_TYPE_T simId,char *iccid, size_t iccidLen)
+{
+    UNUSED(h_sim);
+    UNUSED(simId);
+    UNUSED(iccid);
+    UNUSED(iccidLen);
+
+    return 0;
+}
+
+int qser_sim_getphonenumber(sim_client_handle_type h_sim,QSER_SIM_APP_ID_INFO_T *pt_info, char*phone_num, size_t phoneLen)
+{
+    UNUSED(h_sim);
+    UNUSED(pt_info);
+    UNUSED(phone_num);
+    UNUSED(phoneLen);
+
+    return 0;
+}
+
+int qser_sim_verifypin(sim_client_handle_type h_sim,QSER_SIM_VERIFY_PIN_INFO_T *pt_info)
+{
+    UNUSED(h_sim);
+    UNUSED(pt_info);
+
+    return 0;
+}
+
+int qser_sim_changepin(sim_client_handle_type h_sim,QSER_SIM_CHANGE_PIN_INFO_T *pt_info)
+{
+    UNUSED(h_sim);
+    UNUSED(pt_info);
+
+    return 0;
+}
+
+int qser_sim_unblockpin(sim_client_handle_type h_sim, QSER_SIM_UNBLOCK_PIN_INFO_T *pt_info)
+{
+    UNUSED(h_sim);
+    UNUSED(pt_info);
+
+    return 0;
+}
+
+int qser_sim_enablepin(sim_client_handle_type h_sim, QSER_SIM_ENABLE_PIN_INFO_T *pt_info)
+{
+    UNUSED(h_sim);
+    UNUSED(pt_info);
+
+    return 0;
+}
+
+int qser_sim_disablepin(sim_client_handle_type h_sim, QSER_SIM_DISABLE_PIN_INFO_T *pt_info)
+{
+    UNUSED(h_sim);
+    UNUSED(pt_info);
+
+    return 0;
+}
+
+int qser_sim_getcardstatus(sim_client_handle_type h_sim,QSER_SIM_SLOT_ID_TYPE_T simId,QSER_SIM_CARD_STATUS_INFO_T *pt_info)
+{
+    UNUSED(h_sim);
+    UNUSED(simId);
+    UNUSED(pt_info);
+
+    return 0;
+}
+
+int qser_sim_client_deinit(sim_client_handle_type h_sim)
+{
+    UNUSED(h_sim);
+
+    return 0;
+}
+
diff --git a/mbtk/lynq_lib/src/lynq_sleep.c b/mbtk/lynq_lib/src/lynq_sleep.c
new file mode 100755
index 0000000..59a363f
--- /dev/null
+++ b/mbtk/lynq_lib/src/lynq_sleep.c
@@ -0,0 +1,41 @@
+#include "lynq-qser-autosuspend.h"
+#include "mbtk_type.h"
+
+int qser_autosuspend_enable(char enable)
+{
+    UNUSED(enable);
+
+    return 0;
+}
+
+int qser_wakelock_create(const char* name , size_t len)
+{
+    UNUSED(name);
+    UNUSED(len);
+
+    return 0;
+}
+
+int qser_wakelock_lock(int fd)
+{
+    UNUSED(fd);
+
+    return 0;
+}
+
+int qser_wakelock_unlock(int fd)
+{
+    UNUSED(fd);
+
+    return 0;
+}
+
+int qser_wakelock_destroy(int fd)
+{
+    UNUSED(fd);
+
+    return 0;
+}
+
+
+
diff --git a/mbtk/lynq_lib/src/lynq_sms.c b/mbtk/lynq_lib/src/lynq_sms.c
new file mode 100755
index 0000000..5699e52
--- /dev/null
+++ b/mbtk/lynq_lib/src/lynq_sms.c
@@ -0,0 +1,57 @@
+#include "lynq_qser_sms.h"
+#include "mbtk_type.h"
+
+int qser_sms_client_init(sms_client_handle_type *ph_sms)
+{
+    UNUSED(ph_sms);
+
+    return 0;
+}
+
+int qser_sms_client_deinit(sms_client_handle_type h_sms)
+{
+    UNUSED(h_sms);
+
+    return 0;
+}
+
+int qser_sms_send_sms(sms_client_handle_type h_sms, QSER_sms_info_t *pt_sms_info)
+{
+    UNUSED(h_sms);
+    UNUSED(pt_sms_info);
+
+    return 0;
+}
+
+int qser_sms_addrxmsghandler(QSER_SMS_RxMsgHandlerFunc_t handlerPtr, void* contextPtr)
+{
+    UNUSED(handlerPtr);
+    UNUSED(contextPtr);
+
+    return 0;
+}
+
+int qser_sms_deletefromstorage(sms_client_handle_type h_sms, QSER_sms_storage_info_t *pt_sms_storage)
+{
+    UNUSED(h_sms);
+    UNUSED(pt_sms_storage);
+
+    return 0;
+}
+
+int qser_sms_getsmscenteraddress( sms_client_handle_type h_sms,QSER_sms_service_center_cfg_t *set_sca_cfg)
+{
+    UNUSED(h_sms);
+    UNUSED(set_sca_cfg);
+
+    return 0;
+}
+
+int qser_sms_setsmscenteraddress( sms_client_handle_type h_sms, QSER_sms_service_center_cfg_t *get_sca_cfg)
+{
+    UNUSED(h_sms);
+    UNUSED(get_sca_cfg);
+
+    return 0;
+}
+
diff --git a/mbtk/lynq_lib/src/lynq_sms_api.c b/mbtk/lynq_lib/src/lynq_sms_api.c
deleted file mode 100755
index 4fa4007..0000000
--- a/mbtk/lynq_lib/src/lynq_sms_api.c
+++ /dev/null
@@ -1,291 +0,0 @@
-#include "lynq/lynq_sms_api.h"
-#include "mbtk_info_api.h"
-
-
-static mbtk_info_handle_t* info_handle = NULL;
-
-
-void lynq_sms_state_change_cb(const void* data, int data_len)
-{
-	LOGV("sms_state_change_cb()----------start\n");
-	uint8 *ptr = (uint8*)data;
-		printf("3sms_state_change_cb() : %s\n", ptr);
-
-	struct SMS_Struct s = PDUDecoding(ptr);
-	printf("服务中心地址: %s\n", s.SCA);
-	printf("发送方地址: %s\n", s.OA);
-	printf("服务中心时间戳: %s\n", s.SCTS);
-	printf("消息内容: %s\n", s.UD);
-	printf("数据编码方案： %s\n", DSC_to_msg(s.DCS));
-}
-
-
-int lynq_init_sms(int uToken)
-{
-    UNUSED(uToken);
-    if(info_handle == NULL)
-    {
-        info_handle = mbtk_info_handle_get();
-        if(info_handle)
-        {
-			printf("creat info_handle is success\n");
-        }
-		else{
-			printf("creat info_handle is fail\n");
-			return -1;
-		}
-    }
-
-    return 0;
-}
-
-int lynq_deinit_sms(void)
-{
-    if(info_handle)
-    {
-        return mbtk_info_handle_free(&info_handle);
-    }
-    else
-    {
-        return -1;
-    }
-}
-
-
-/*
-*AT+CMGS="10086", CMGS TEST 				  // Send a SMS
-> CMGS TEST
-+CMGS: 17
-OK
-*/
-/*
-int charset: send sms mode
-	 0:pdu, 1:text
-
-*/
-
-int lynq_send_sms(char *telephony_num, int state, char *msg)
-{
-    if(info_handle == NULL || msg == NULL || telephony_num == NULL)
-    {
-        return -1;
-    }
-
-	char cmgs[MSM_NUMBER_MAX] = {0};
-	char resp[RES_NUM_MIN] = {0};
-	int mode = 0;
-	int err = 0;
-	if(strlen(msg) > 512 || strlen(msg) == 0 || strlen(telephony_num) == 0)
-	{
-		printf("strlen(telephony_num):%d\n", strlen(telephony_num));
-		printf("strlen(msg):%d\n", strlen(msg));
-		return -1;
-	}
-
-	if(state)	// text
-	{
-		mode = 1;
-	}
-
-	err = mbtk_sms_cmgf_set(info_handle, mode);
-	if(err) {
-	   printf("cmgf set error : %d\n", err);
-	} else {
-	   printf("cmgf set success\n");
-	}
-
-	sprintf(cmgs,"%s,%s",telephony_num, msg);
-	printf("cmgs:%s\n", cmgs);
-
-/*	char *ptr = strstr(cmd, "cmgs,");	   //CMGS="10086",hf
-	if(ptr != NULL)
-	{
-		ptr = strstr(cmd, ",");
-		ptr++;
-		memset(cmgs, 0, sizeof(cmgs));
-		memcpy(cmgs, ptr, strlen(ptr));
-		printf("1cmgs:%s, strlen(cmgs):%d\n", cmgs, strlen(cmgs));
-	}
-*/
-
-	memset(resp, 0, sizeof(resp));
-
-	err = mbtk_sms_cmgs_set(info_handle, cmgs, resp);
-	if(err) {
-		printf("Error : %d\n", err);
-		return -1;
-	} else {
-		printf("cmgs set success . resp:%s\n", resp);
-	}
-
-	return 0;
-}
-
-int lynq_wait_receive_new_sms(int *handle)
-{
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-
-	int ret = mbtk_sms_cnmi_set(info_handle);
-	if(ret)
-	{
-		printf("set cnmi fail\n");
-		return -1;
-	}
-
-	mbtk_sms_state_change_cb_reg(info_handle, lynq_sms_state_change_cb);
-	return 0;
-}
-
-/*
-	AT+CMGD=<index>[,<delflag>]
-
-	Deletes message based on index
-	node:
-		index is -1, delete all message
-		delflag set 4
-*/
-int lynq_delete_sms(int index)
-{
-	char cmgd[128] = {0};
-	int err = 0;
-
-	if(index == -1)		//delete all
-	{
-		memcpy(cmgd, ",4", strlen(",4"));
-	}
-	else
-	{
-		sprintf(cmgd,"%d",index);
-	}
-
-	printf("cmgd:%s\n", cmgd);
-
-	err = mbtk_sms_cmgd_set(info_handle, cmgd);
-	if(err) {
-		printf("lynq_delete_sms Error : %d\n", err);
-		return -1;
-	} else {
-		printf("lynq_delete_sms set success\n");
-	}
-
-	return 0;
-}
-
-
-/*
-function: lynq_list_sms
-stat:0:pud, 1:text
-index: 0, list index;
-	  > 0,
-
-*/
-int lynq_list_sms(int stat, int index, char *data)
-{
-    if(info_handle == NULL)
-    {
-        return -1;
-    }
-
-	char cmgs[MSM_NUMBER_MAX] = {0};
-	int mode = 0;
-	int err = 0;
-
-	if(stat)	// text
-	{
-		mode = 1;
-	}
-
-	err = mbtk_sms_cmgf_set(info_handle, mode);
-	if(err) {
-	   printf("cmgf set error : %d\n", err);
-	} else {
-	   printf("cmgf set success\n");
-	}
-
-
-	char cmgl[128] = {0};
-	char resp[1024+1] ={0};
-	sprintf(cmgl,"%d,%s", index, data);
-/*
-	char *ptr = strstr(cmd, "cmgl,");  //  AT+CMGL[=<stat>]
-	if(ptr != NULL)
-	{
-		ptr = strstr(cmd, ",");
-		ptr++;
-		memset(cmgl, 0, sizeof(cmgl));
-		memcpy(cmgl, ptr, strlen(ptr));
-		printf("0cmgl:%s\n", cmgl);
-	}
-*/
-	memset(resp, 0, sizeof(resp));
-	err = mbtk_sms_cmgl_set(info_handle, cmgl, resp);
-	if(err) {
-		printf("lynq_list_sms Error : %d\n", err);
-		return -1;
-	} else {
-	    printf("cmgl set success, reg:%s\n",resp);
-	}
-
-	return 0;
-}
-
-
-int lynq_query_sms_storage_status(void)
-{
-	char mem[128] = {0};
-	int err = mbtk_sms_cpms_get(info_handle, mem);
-    if(err) {
-        printf("cpms query is fail Error : %d\n", err);
-		return -1;
-    } else {
-        printf("cpms query is success : %s\n", mem);
-    }
-
-	return 0;
-}
-
-
-int lynq_get_smsc_address(char *serviceNumber)
-{
-	char csca[128] = {0};
-	if(info_handle == NULL || serviceNumber == NULL)
-    {
-		return -1;
-	}
-
-	int err = mbtk_sms_csca_get(info_handle, serviceNumber);
-	if(err) {
-		printf("lynq_get_smsc_address Error : %d\n", err);
-		return err;
-	} else {
-		printf("lynq_get_smsc_address success\n");
-	}
-
-	return 0;
-}
-
-
-int lynq_set_smsc_address(const char* service_num)
-{
-	if(info_handle == NULL || service_num == NULL)
-	{
-		return -1;
-	}
-
-	int err = mbtk_sms_csca_set(info_handle, service_num);
-	if(err) {
-		printf("Error : %d\n", err);
-		return err;
-	} else {
-		printf("lynq_set_smsc_address success\n");
-	}
-	return 0;
-}
-
-
-
-
-
diff --git a/mbtk/lynq_lib/src/lynq_time.c b/mbtk/lynq_lib/src/lynq_time.c
new file mode 100755
index 0000000..ce3d3ec
--- /dev/null
+++ b/mbtk/lynq_lib/src/lynq_time.c
@@ -0,0 +1,58 @@
+#include "lynq_systime.h"
+#include "mbtk_type.h"
+
+int ntp_sync_time(int enable)
+{
+    UNUSED(enable);
+
+    return 0;
+}
+
+int modem_time_enable(int enable)
+{
+    UNUSED(enable);
+
+    return 0;
+}
+
+int gnss_time_enable(int enable)
+{
+    UNUSED(enable);
+
+    return 0;
+}
+
+int user_set_time(char* date, char* time)
+{
+    UNUSED(date);
+    UNUSED(time);
+
+    return 0;
+}
+
+int lynq_sync_time_from_rtc(void)
+{
+
+    return 0;
+}
+
+int lynq_get_time_src_status (time_src_status_s * time_src)
+{
+    UNUSED(time_src);
+
+    return 0;
+}
+
+int lynq_set_rtc_time(void)
+{
+
+    return 0;
+}
+
+int lynq_get_rtc_time(unsigned long *ulsec)
+{
+    UNUSED(ulsec);
+
+    return 0;
+}
+
diff --git a/mbtk/lynq_lib/src/lynq_voice_call.c b/mbtk/lynq_lib/src/lynq_voice_call.c
new file mode 100755
index 0000000..8c891d4
--- /dev/null
+++ b/mbtk/lynq_lib/src/lynq_voice_call.c
Binary files differ
