diff --git a/mbtk/libgsw_lib/gsw_uart_interface.c b/mbtk/libgsw_lib/gsw_uart_interface.c
index e09aefd..d706aae 100755
--- a/mbtk/libgsw_lib/gsw_uart_interface.c
+++ b/mbtk/libgsw_lib/gsw_uart_interface.c
@@ -15,100 +15,10 @@
 
 #define MODEM_CONNECT_MCU_PORT      "/dev/ttyS1"
 
-#ifndef LOG_ERR_LEVEL
-#define LOG_ERR_LEVEL  3      /* error conditions */
-#endif
-#ifndef LOG_WARN_LEVEL
-#define LOG_WARN_LEVEL 4   /* warning conditions */
-#endif
-#ifndef LOG_INFO_LEVEL
-#define LOG_INFO_LEVEL 6      /* informational */
-#endif
-#ifndef LOG_DEBUG_LEVEL
-#define LOG_DEBUG_LEVEL 7     /* debug-level messages */
-#endif
-#ifndef LOG_VERBOSE_LEVEL
-#define LOG_VERBOSE_LEVEL 8
-#endif
-
+#include "gsw_log_interface.h"
 #define GSW_UART "[HAL][GSW_UART]"
 
 
-#define LOGV(fmt, args ...) \
-    do{ \
-        char *file_ptr_1001 = __FILE__; \
-        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
-        char line_1001[10] = {0}; \
-        sprintf(line_1001, "%d", __LINE__); \
-        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
-            if(*ptr_1001 == '/') \
-                 break; \
-            ptr_1001--; \
-        } \
-        fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_UART"" fmt, ptr_1001 + 1, line_1001, ##args); \
-    } while(0)
-
-#define LOGI(fmt, args...) \
-    do{ \
-        char *file_ptr_1001 = __FILE__; \
-        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
-        char line_1001[10] = {0}; \
-        sprintf(line_1001, "%d", __LINE__); \
-        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
-            if(*ptr_1001 == '/') \
-                 break; \
-            ptr_1001--; \
-        } \
-        fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: "GSW_UART"" fmt, ptr_1001 + 1, line_1001, ##args); \
-    } while(0)
-
-#define LOGD(fmt, args...) \
-    do{ \
-        char *file_ptr_1001 = __FILE__; \
-        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
-        char line_1001[10] = {0}; \
-        sprintf(line_1001, "%d", __LINE__); \
-        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
-            if(*ptr_1001 == '/') \
-                 break; \
-            ptr_1001--; \
-        } \
-        fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_UART"" fmt, ptr_1001 + 1, line_1001, ##args); \
-    } while(0)
-
-#define LOGW(fmt, args...) \
-    do{ \
-        char *file_ptr_1001 = __FILE__; \
-        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
-        char line_1001[10] = {0}; \
-        sprintf(line_1001, "%d", __LINE__); \
-        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
-            if(*ptr_1001 == '/') \
-                 break; \
-            ptr_1001--; \
-        } \
-        fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: "GSW_UART"" fmt, ptr_1001 + 1, line_1001, ##args); \
-    } while(0)
-
-#define LOGE(fmt, args...) \
-    do{ \
-        char *file_ptr_1001 = __FILE__; \
-        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
-        char line_1001[10] = {0}; \
-        sprintf(line_1001, "%d", __LINE__); \
-        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
-            if(*ptr_1001 == '/') \
-                 break; \
-            ptr_1001--; \
-        } \
-        fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: "GSW_UART"" fmt, ptr_1001 + 1, line_1001, ##args); \
-    } while(0)
-    
-typedef void (*mbtk_log)(int level, const char *format,...);
-static mbtk_log fun_ptr_log = NULL;
-void *dlHandle_uart = NULL;
-char *lynqLib_uart = "/lib/libmbtk_lib.so";
-
 typedef enum
 {
   GSW_HAL_BAUDRATE_1200=1200,
@@ -126,17 +36,8 @@
   GSW_HAL_BAUDRATE_921600=921600
 }gsw_hal_uart_baudrate;
 
-static int handle()
+static inline int handle()
 {
-    if(dlHandle_uart == NULL || fun_ptr_log == NULL)
-    {
-        dlHandle_uart = dlopen(lynqLib_uart, RTLD_NOW);
-        fun_ptr_log = (mbtk_log)dlsym(dlHandle_uart, "mbtk_log");
-        if(fun_ptr_log == NULL || dlHandle_uart == NULL)
-        {
-            return GSW_HAL_NORMAL_FAIL;
-        }
-    }
     return GSW_HAL_SUCCESS;
 }
 
@@ -147,16 +48,16 @@
     int fd = -1;
     if((fd = open((const char *)port, O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0)
     {
-        LOGE("open %s failed - %d", port, errno);
+        LOGE(GSW_UART,"open %s failed - %d", port, errno);
         return -1;
     }
-    LOGD("Open %s success.", port);
+    LOGD(GSW_UART,"Open %s success.", port);
 
     /* set newtio */
     struct termios newtio;
     memset(&newtio, 0, sizeof(newtio));
     if (tcflush(fd, TCIOFLUSH) < 0) {
-        LOGE("Could not flush uart port");
+        LOGE(GSW_UART,"Could not flush uart port");
         return -1;
     }
 
@@ -263,7 +164,7 @@
             newtio.c_cflag |= CS8;
             break;
         default:
-            LOGD("No set databit.");
+            LOGD(GSW_UART,"No set databit.");
             break;
     }
 
@@ -290,12 +191,12 @@
             newtio.c_cflag &= ~PARENB;
             break;
         default:
-            LOGD("No set parity.");
+            LOGD(GSW_UART,"No set parity.");
             break;
     }
 
     if (tcsetattr(fd, TCSANOW, &newtio) < 0) {
-        LOGE("Can't set port setting");
+        LOGE(GSW_UART,"Can't set port setting");
         return -1;
     }
 
@@ -308,11 +209,11 @@
         return;
     if (tcflush(fd, TCIOFLUSH) < 0)
     {
-        LOGE("flush fail\n");
+        LOGE(GSW_UART,"flush fail\n");
         //return GSW_HAL_NORMAL_FAIL;
     }
     else
-        LOGD("flush success\n");
+        LOGD(GSW_UART,"flush success\n");
     //return GSW_HAL_SUCCESS;
 }
 
@@ -322,7 +223,7 @@
         return GSW_HAL_NORMAL_FAIL;
     if(len <= 0 || timeout_ms < -1)
     {
-        LOGE("timeout_ms = %d, len = %d; timeout_ms needs to be greater than -1 and len needs to be greater than 0!\n",timeout_ms, len);
+        LOGE(GSW_UART,"timeout_ms = %d, len = %d; timeout_ms needs to be greater than -1 and len needs to be greater than 0!\n",timeout_ms, len);
         return GSW_HAL_NORMAL_FAIL;
     }
     int flags = fcntl(fd, F_GETFL); // 获取当前状态标志  
@@ -359,7 +260,7 @@
         newtio.c_cc[VTIME] = timeout_ms/100;
     }
     if(timeout_ms != 0)
-        LOGI("%s :VMIN = %d ;VTIME = %d\n",__func__,newtio.c_cc[VMIN],newtio.c_cc[VTIME]);  
+        LOGI(GSW_UART,"%s :VMIN = %d ;VTIME = %d\n",__func__,newtio.c_cc[VMIN],newtio.c_cc[VTIME]);  
     if (tcsetattr(fd, TCSANOW, &newtio) != 0)
     {  
         perror("tcsetattr");  
@@ -394,12 +295,12 @@
         return GSW_HAL_NORMAL_FAIL;
     if (fd < 0 || pvalue == NULL)
     {  
-        LOGE("Invalid file descriptor");  
+        LOGE(GSW_UART,"Invalid file descriptor");  
         return GSW_HAL_NORMAL_FAIL;  
     }  
     if (ioctl(fd, cmd, pvalue) < 0)
     {  
-        LOGE("Could not set DCB,error:%d, %s\n",errno, strerror(errno));  
+        LOGE(GSW_UART,"Could not set DCB,error:%d, %s\n",errno, strerror(errno));  
         return GSW_HAL_NORMAL_FAIL;  
     }
     return GSW_HAL_SUCCESS;
@@ -410,7 +311,7 @@
     if (handle())
         return;
     if (fd <= 0)
-        LOGE("fd = %d fail\n",fd);
+        LOGE(GSW_UART,"fd = %d fail\n",fd);
         //return GSW_HAL_NORMAL_FAIL;
     else
     {
@@ -418,11 +319,11 @@
         int ret = close(fd);
         if(ret < 0)
         {
-            LOGE("close fail ret = %d\n",ret);
+            LOGE(GSW_UART,"close fail ret = %d\n",ret);
         }
         else
         {
-            LOGI("close success ret = %d\n",ret);
+            LOGI(GSW_UART,"close success ret = %d\n",ret);
         }
     }
     
