diff --git a/mbtk/lynq_lib/src/lynq_sms.c b/mbtk/lynq_lib/src/lynq_sms.c
index 37cc6a1..0fbed26 100755
--- a/mbtk/lynq_lib/src/lynq_sms.c
+++ b/mbtk/lynq_lib/src/lynq_sms.c
@@ -79,13 +79,13 @@
         sms_info_handle = mbtk_info_handle_get();
         if(sms_info_handle)
         {
-            printf("creat sms_info_handle is success\n");
+            LOGI("creat sms_info_handle is success");
             *ph_sms = sms_info_handle->client_fd;
             g_sms_val = sms_info_handle->client_fd;
         }
         else
         {
-            printf("creat sms_info_handle is fail\n");
+            LOGE("creat sms_info_handle is fail");
             return -1;
         }
     }
@@ -98,19 +98,18 @@
     //UNUSED(h_sms);
     if (h_sms != g_sms_val || g_sms_val == -1)
     {
-        printf("handle NULL\n");
+        LOGE("handle NULL\n");
         return -1;
     }
 
-
     if(sms_info_handle)
     {
         mbtk_info_handle_free(&sms_info_handle);
-        printf("deinit sms_info_handle is succuess\n");
+        LOGI("deinit sms_info_handle is succuess");
     }
     else
     {
-        printf("deinit sms_info_handle is fail\n");
+        LOGE("deinit sms_info_handle is fail");
         return -1;
     }
 
@@ -123,20 +122,19 @@
     //UNUSED(pt_sms_info);
     if (h_sms != g_sms_val || g_sms_val == -1)
     {
-        printf("handle NULL\n");
+        LOGE("handle NULL");
         return -1;
     }
 
-
     if (pt_sms_info == NULL)
     {
-        printf("QSER_sms_info_t NULL\n");
+        LOGE("QSER_sms_info_t NULL");
         return -1;
     }
 
     if(sms_info_handle == NULL)
     {
-        printf("qser_sms_send_sms sms_info_handle NULL\n");
+        LOGE("qser_sms_send_sms sms_info_handle NULL");
         return -1;
     }
 
@@ -169,43 +167,42 @@
 
     if (pt_sms_info->storage == 0)
     {
-        strncpy(mem, "SM", 2);
+        strcpy(mem, "SM");
     }
     else if (pt_sms_info->storage == 1)
     {
-        strncpy(mem, "ME", 2);
+        strcpy(mem, "ME");
     }
     else
     {
-        printf("qser_sms_deletefromstorage storage is no Support \n");
+        LOGE("qser_sms_deletefromstorage storage is no Support");
         return -1;
     }
 
     memset(resp, 0, sizeof(resp));
     err = mbtk_sms_cpms_set(sms_info_handle, mem, resp);
     if(err) {
-        printf("Error : %d\n", err);
+        LOGE("Error : %d", err);
     } else {
-        printf("cpms set success. resp:%s\n", resp);
+        LOGI("cpms set success. resp:%s", resp);
     }
 
     if(data == NULL)
     {
-        printf("qser_sms_send_sms data NULL\n");
+        LOGE("qser_sms_send_sms data NULL");
         return -1;
     }
 
     if(phone_num == NULL)
     {
-        printf("qser_sms_send_sms phone_num NULL\n");
+        LOGE("qser_sms_send_sms phone_num NULL");
         return -1;
     }
 
-
     if(strlen(data) > 512 || strlen(data) == 0 || strlen(phone_num) == 0)
     {
-        printf("strlen(telephony_num):%d\n", strlen(phone_num));
-        printf("strlen(msg):%d\n", strlen(data));
+        LOGE("strlen(telephony_num):%d", strlen(phone_num));
+        LOGE("strlen(msg):%d", strlen(data));
         return -1;
     }
 
@@ -228,20 +225,20 @@
 
         for (i = 0; i < pdus->count; i++)
         {
-             printf("第 %d 条:\n", i + 1);
-             printf("%s\n", pdus->PDU[i]);
+             LOGI("第 %d 条:", i + 1);
+             LOGI("%s\n", pdus->PDU[i]);
              pdu = pdus->PDU[i];
         }
 
         sprintf(p, "%s",smsc);
-        printf("pdu_data:%s\n", pdu_data);
+        LOGI("pdu_data:%s", pdu_data);
         sprintf(p+strlen(p), "%s", pdu);
-        printf("pdu_data:%s\n",pdu_data);
+        LOGI("pdu_data:%s",pdu_data);
 
         //sprintf(cmgs,"%d,%s",strlen(pdu_data), pdu_data);
         int t = strlen(pdu_data);
         sprintf(cmgs,"%d,%s",(t-18)/2, pdu_data);
-        printf("cmgs:%s\n", cmgs);
+        LOGI("cmgs:%s", cmgs);
 #else
         char *tmp_t = "0891683108200805F011000D91688189914026F3000800044F60597D";
         sprintf(cmgs,"%d,%s",19,tmp_t);
@@ -253,22 +250,22 @@
         err = mbtk_sms_cmgf_set(sms_info_handle, mode);
         if(err)
         {
-           printf("cmgf set error : %d\n", err);
+           LOGE("cmgf set error : %d", err);
         }
         else
         {
-           printf("cmgf set success\n");
+           LOGI("cmgf set success");
         }
 
         err = mbtk_sms_cmgs_set(sms_info_handle, cmgs, resp);
         if(err)
         {
-            printf("Error : %d\n", err);
+            LOGE("Error : %d", err);
             return -1;
         }
         else
         {
-            printf("cmgs set success . resp:%s\n", resp);
+            LOGI("cmgs set success . resp:%s", resp);
         }
     }
     else if (mode == 1)   // text
@@ -276,32 +273,32 @@
         err = mbtk_sms_cmgf_set(sms_info_handle, mode);
         if(err)
         {
-           printf("cmgf set error : %d\n", err);
+           LOGE("cmgf set error : %d", err);
         }
         else
         {
-           printf("cmgf set success\n");
+           LOGI("cmgf set success");
         }
 
         sprintf(cmgs,"%s,%s", phone_num, data);
-        printf("cmgs:%s\n", cmgs);
+        LOGI("cmgs:%s", cmgs);
 
         memset(resp, 0, sizeof(resp));
 
         err = mbtk_sms_cmgs_set(sms_info_handle, cmgs, resp);
         if(err)
         {
-            printf("Error : %d\n", err);
+            LOGE("Error : %d", err);
             return -1;
         }
         else
         {
-            printf("cmgs set success . resp:%s\n", resp);
+            LOGI("cmgs set success . resp:%s", resp);
         }
     }
     else
     {
-        printf("Error : mode\n");
+        LOGE("Error : mode");
         return -1;
     }
 
@@ -316,14 +313,14 @@
 
     if(sms_info_handle == NULL)
     {
-        printf("qser_sms_addrxmsghandler sms_info_handle NULL\n");
+        LOGE("qser_sms_addrxmsghandler sms_info_handle NULL");
         return -1;
     }
 
     int err = mbtk_sms_cnmi_set(sms_info_handle);
     if(err)
     {
-        printf("set cnmi fail\n");
+        LOGE("set cnmi fail");
         return -1;
     }
 
@@ -349,20 +346,19 @@
 
     if (h_sms != g_sms_val || g_sms_val == -1)
     {
-        printf("handle NULL\n");
+        LOGE("handle NULL");
         return -1;
     }
 
-
     if(pt_sms_storage == NULL)
     {
-        printf("qser_sms_deletefromstorage pt_sms_storage NULL\n");
+        LOGE("qser_sms_deletefromstorage pt_sms_storage NULL");
         return -1;
     }
 
     if(sms_info_handle == NULL)
     {
-        printf("qser_sms_deletefromstorage sms_info_handle NULL\n");
+        LOGE("qser_sms_deletefromstorage sms_info_handle NULL");
         return -1;
     }
 
@@ -378,16 +374,16 @@
     }
     else
     {
-        printf("qser_sms_deletefromstorage storage is no Support \n");
+        LOGE("qser_sms_deletefromstorage storage is no Support");
         return -1;
     }
 
     memset(resp, 0, sizeof(resp));
     err = mbtk_sms_cpms_set(sms_info_handle, mem, resp);
     if(err) {
-        printf("Error : %d\n", err);
+        LOGE("Error : %d", err);
     } else {
-        printf("cpms set success. resp:%s\n", resp);
+        LOGI("cpms set success. resp:%s", resp);
     }
 
     id_x = pt_sms_storage->storage_idx;//获取idx的值
@@ -401,17 +397,17 @@
         sprintf(cmgd,"%d",id_x);
     }
 
-    printf("cmgd:%s\n", cmgd);
+    LOGI("cmgd:%s", cmgd);
 
     err = mbtk_sms_cmgd_set(sms_info_handle, cmgd);
     if(err)
     {
-        printf("qser_sms_deletefromstorage Error : %d\n", err);
+        LOGE("qser_sms_deletefromstorage Error : %d", err);
         return -1;
     }
     else
     {
-        printf("qser_sms_deletefromstorage set success\n");
+        LOGI("qser_sms_deletefromstorage set success");
     }
 
     return 0;
@@ -428,51 +424,49 @@
 
     if (h_sms != g_sms_val || g_sms_val == -1)
     {
-        printf("handle NULL\n");
+        LOGE("handle NULL");
         return -1;
     }
 
-
     if (set_sca_cfg == NULL)
     {
-        printf("QSER_sms_service_center_cfg_t NULL\n");
+        LOGE("QSER_sms_service_center_cfg_t NULL");
         return -1;
     }
 
-
     if(sms_info_handle == NULL)
     {
-        printf("qser_sms_getsmscenteraddress sms_info_handle NULL\n");
+        LOGE("qser_sms_getsmscenteraddress sms_info_handle NULL");
         return -1;
     }
 
     int err = mbtk_sms_csca_get(sms_info_handle, sms_center_addree);
     if(sms_center_addree[0] == '\0')
     {
-        printf("qser_sms_getsmscenteraddress Error : %d\n", err);
+        LOGE("qser_sms_getsmscenteraddress Error : %d", err);
         return -1;
     }
     else
     {
-        p1 = strchr(sms_center_addree, '\"'); // 查找第一个双引号
-        p2 = strrchr(sms_center_addree, '\"'); // 查找最后一个双引号
-        if (p1 && p2 && p2 > p1) // 如果找到了两个双引号
+        p1 = strchr(sms_center_addree, '\"');
+        p2 = strrchr(sms_center_addree, '\"');
+        if (p1 && p2 && p2 > p1)
         {
-            len_t = p2 - p1 - 1; // 计算双引号内的字符串长度
-            char substr_t[len_t + 1]; // 定义一个新的字符串
-            strncpy(substr_t, p1 + 1, len_t); // 复制双引号内的字符串到新的字符串中
-            substr_t[len_t] = '\0'; // 在新的字符串末尾添加结束符
-            //printf("双引号内的字符串为：%s\n", substr_t); // 输出结果
+            len_t = p2 - p1 - 1;
+            char substr_t[len_t + 1];
+            strncpy(substr_t, p1 + 1, len_t);
+            substr_t[len_t] = '\0';
+
             substr = substr_t;
             
             memcpy(set_sca_cfg->service_center_addr, substr, strlen(substr));
             memcpy(sms_center_address, substr, strlen(substr));
 
-            printf("qser_sms_getsmscenteraddress success\n");
+            LOGI("qser_sms_getsmscenteraddress success");
         }
         else
         {
-            printf("未找到双引号内的字符串\n"); // 输出结果
+            LOGE("String inside double quotes not found");
             return -1;
         }
     }
@@ -489,20 +483,19 @@
 
     if (h_sms != g_sms_val || g_sms_val == -1)
     {
-        printf("handle NULL\n");
+        LOGE("handle NULL");
         return -1;
     }
 
-
     if(sms_info_handle == NULL)
     {
-        printf("qser_sms_setsmscenteraddress sms_info_handle NULL\n");
+        LOGE("qser_sms_setsmscenteraddress sms_info_handle NULL");
         return -1;
     }
 
     if(get_sca_cfg == NULL)
     {
-        printf("qser_sms_setsmscenteraddress get_sca_cfg NULL\n");
+        LOGE("qser_sms_setsmscenteraddress get_sca_cfg NULL");
         return -1;
     }
 
@@ -514,14 +507,14 @@
 
     if (destNum == NULL)
     {
-        printf("qser_sms_setsmscenteraddress destNum NULL\n");
+        LOGE("qser_sms_setsmscenteraddress destNum NULL");
         return -1;
     }
 
     int err = mbtk_sms_csca_set(sms_info_handle, destNum);
     if(err)
     {
-        printf("Error : %d\n", err);
+        LOGE("Error : %d", err);
         return -1;
     }
     else
@@ -529,7 +522,36 @@
     //    memset(sms_center_address, 0, sizeof(sms_center_address));
     //    memcpy(sms_center_address, destNum, strlen(destNum));
         //printf("destNum:%s\n", destNum);
-        printf("qser_sms_setsmscenteraddress success\n");
+        LOGI("qser_sms_setsmscenteraddress success");
+    }
+
+    return 0;
+}
+
+
+//显示删除列表
+int qser_sms_deletefromstoragelist( sms_client_handle_type h_sms, char* del_list)//in out
+{
+    //UNUSED(h_sms);
+    //UNUSED(get_sca_cfg);
+
+    if (h_sms != g_sms_val || g_sms_val == -1)
+    {
+        LOGE("handle NULL");
+        return -1;
+    }
+
+    if(sms_info_handle == NULL)
+    {
+        LOGE("qser_sms_deletefromstoragelist sms_info_handle NULL");
+        return -1;
+    }
+
+    int err = mbtk_sms_cmgd_get(sms_info_handle, del_list);
+    if(err > 0  && err != 300)//MBTK_INFO_ERR_SUCCESS
+    {
+        LOGE("Error : %d", err);
+        return -1;
     }
 
     return 0;
diff --git a/mbtk/lynq_lib/src/lynq_voice_call.c b/mbtk/lynq_lib/src/lynq_voice_call.c
index 96e6f63..5b6bfb1 100755
--- a/mbtk/lynq_lib/src/lynq_voice_call.c
+++ b/mbtk/lynq_lib/src/lynq_voice_call.c
Binary files differ
