diff --git a/mbtk/libgsw_lib/gsw_gnss_interface.c b/mbtk/libgsw_lib/gsw_gnss_interface.c
index 73b31d7..5b7f455 100755
--- a/mbtk/libgsw_lib/gsw_gnss_interface.c
+++ b/mbtk/libgsw_lib/gsw_gnss_interface.c
@@ -14,6 +14,7 @@
 #include <dlfcn.h>
 #include <stdint.h>
 #include <stdbool.h>
+#include <ctype.h>
 
 #include "gsw_gnss_interface.h"
 
@@ -124,6 +125,13 @@
     GSW_DEVICE got_hd8;
 } rx_ctx;
 
+typedef struct {
+    int  fd;
+    char *buf_8040_1;
+    char *buf_8040_2;
+    char *buf_8040;
+} rx_ctx_8040;
+
 static GSW_DEVICE gsw_device = NO_DEVICE;
 GSW_GNSS_MODE_CONFIGURATION_HD map_gnss_mode(GSW_GNSS_MODE_CONFIGURATION mode)
 {
@@ -158,13 +166,85 @@
     }
 }  
 
+static void *rx_thread_8040(void *arg)
+{
+    rx_ctx_8040 *c = (rx_ctx_8040 *)arg;
+    char buf[128];
+    ssize_t n;
+    time_t end = time(NULL) + 1;//1s
+    
+    while (time(NULL) < end) {
+        n = read(c->fd, buf, sizeof(buf));
+        if (n > 0 && memmem(buf, n, "HD8040D", 7)) 
+        {
+            int start_index = 6;
+
+            int part1_start = start_index;
+            int part1_end = 19;
+            int part1_len = part1_end - part1_start + 1;
+
+            int part2_start = 22;
+            int part2_end = 37;
+            int part2_len = part2_end - part2_start + 1;
+
+            if (c->buf_8040_1 != NULL)
+            {
+                free(c->buf_8040_1);
+                c->buf_8040_1 = NULL;
+            }
+            
+            c->buf_8040_1 = (char *)malloc(part1_len + 1);
+            if (c->buf_8040_1 != NULL)
+            {
+                memcpy(c->buf_8040_1, buf + part1_start, part1_len);
+                c->buf_8040_1[part1_len] = '\0';
+            }
+
+            if (c->buf_8040_2 != NULL)
+            {
+                free(c->buf_8040_2);
+                c->buf_8040_2 = NULL;
+            }
+            
+            c->buf_8040_2 = (char *)malloc(part2_len + 1);
+            if (c->buf_8040_2 != NULL)
+            {
+                memcpy(c->buf_8040_2, buf + part2_start, part2_len);
+                c->buf_8040_2[part2_len] = '\0';
+            }
+
+            if (c->buf_8040_1 != NULL && c->buf_8040_2 != NULL)
+            {
+                if (c->buf_8040 != NULL)
+                {
+                    free(c->buf_8040);
+                    c->buf_8040 = NULL;
+                }
+
+                int total_len = strlen(c->buf_8040_1) + strlen(c->buf_8040_2) + 1;
+                c->buf_8040 = (char *)malloc(total_len);
+                if (c->buf_8040 != NULL)
+                {
+                    strcpy(c->buf_8040, c->buf_8040_1);
+                    strcat(c->buf_8040, c->buf_8040_2);
+                }
+            }
+            else
+            {
+                LOGE(GSW_GNSS, "Failed to extract version parts");
+            }
+            break;
+        }
+    }
+    return NULL;
+}
+
 static void *rx_thread(void *arg)
 {
     rx_ctx *c = (rx_ctx *)arg;
     char buf[128];
     ssize_t n;
     time_t end = time(NULL) + 1;            /* 1 秒超时 */
-
     while (time(NULL) < end) {
         n = read(c->fd, buf, sizeof(buf));
         if (n > 0 && memmem(buf, n, "HD8040D", 7)) {
@@ -176,6 +256,7 @@
 			break;
 		}
     }
+
     return NULL;
 }
 
@@ -206,6 +287,7 @@
     return gsw_device;
 }
 
+
 int mbtk_gnss_set_VTG()
 {
     int ret;
@@ -736,7 +818,6 @@
     }
 }
 
-
 /**
 * @brief Start install gnss software
 * @param  [in] char* file_path
@@ -745,24 +826,31 @@
 */
 int gsw_update_gnss_start(const char *fw_path)
 {
-    int ret;
-    mbtk_gnss_dl_ptr = (int(*)(const char *, int))dlsym(dlHandle_gnss, "mbtk_gnss_dl");
-    if (!mbtk_gnss_dl_ptr) 
+    if (fw_path == NULL)
     {
-        LOGE(GSW_GNSS,"[qser_gnss] dlsym failed for mbtk_gnss_dl: %s", dlerror());
+        LOGE(GSW_GNSS, "[qser_gnss] Input fw_path is null");
         return GSW_HAL_NORMAL_FAIL;
     }
 
-    ret = mbtk_gnss_dl_ptr(fw_path, QSER_GNSS_TIMEOUT);
+    int ret;
+    mbtk_gnss_dl_ptr = (int(*)(const char *, int))dlsym(dlHandle_gnss, "mbtk_gnss_dl");
+
+    ret = mbtk_gnss_dl_ptr(fw_path, 60);
     if(ret != 0)
     {
-        LOGE(GSW_GNSS,"[qser_gnss] Firmware download failed. ret = [%d]", ret);
-        return GSW_HAL_NORMAL_FAIL;
+        if(ret != 4)
+        {
+            LOGE(GSW_GNSS,"[qser_gnss] Firmware download failed. ret = [%d]", ret);
+            return GSW_HAL_NORMAL_FAIL;
+        }
+        else
+        {
+            LOGW(GSW_GNSS,"[qser_gnss] Firmware download warning (ignored). ret = [%d]", ret);
+        }
     }
     return GSW_HAL_SUCCESS;
 }
 
-
 /**
 * @brief get gnss version info
 * @param  [in] NULL
@@ -771,31 +859,57 @@
 */
 int32_t gsw_get_gnss_version_info(char* version_info)
 {
-    if (!version_info)
+    if (version_info == NULL)
     {
-        LOGE(GSW_GNSS, "[GSW_gnss] version_info is NULL");
-        return GSW_HAL_NORMAL_FAIL;
+        LOGE(GSW_GNSS, "version_info is NULL");
+        return GSW_HAL_ERROR_GNSS_FAIL;
     }
 
-    GSW_DEVICE dev_type = get_gnss_device_version();
-    switch (dev_type)
+    int fd = open("/dev/ttyS3", O_RDWR | O_NOCTTY);
+    if (fd < 0)
     {
-        case HD8122:
-            strncpy(version_info, "HD8122", 255);
-            break;
-        case HD8040D:
-            strncpy(version_info, "HD8040D", 255);
-            break;
-        case NO_DEVICE:
-        default:
-            LOGE(GSW_GNSS, "[GSW_gnss] Failed to detect GNSS device");
-            return GSW_HAL_NORMAL_FAIL;
+        LOGE(GSW_GNSS, "Failed to open /dev/ttyS3: %s", strerror(errno));
+        return GSW_HAL_ERROR_GNSS_FAIL;
     }
 
-    version_info[255] = '\0';
-    LOGE(GSW_GNSS, "[GSW_gnss] Retrieved GNSS version: %s", version_info);
-    return GSW_HAL_SUCCESS;
+    rx_ctx_8040 thread_args = {
+        .fd = fd,
+        .buf_8040 = NULL
+    };
+
+    pthread_t read_thread_8040;
+    if (pthread_create(&read_thread_8040, NULL, rx_thread_8040, &thread_args) != 0)
+    {
+        LOGE(GSW_GNSS, "Failed to create read thread");
+        close(fd);
+        return GSW_HAL_ERROR_GNSS_FAIL;
+    }
+
+    unsigned char tx_cmd[] = {0xF1, 0xD9, 0x0A, 0x04, 0x00, 0x00, 0x0E, 0x34};
+    int ret = write(fd, tx_cmd, sizeof(tx_cmd));
+    if (ret != sizeof(tx_cmd))
+    {
+        LOGE(GSW_GNSS, "[GSW_gnss] send_and_wait write fail.ret = [%d]", ret);
+        pthread_cancel(read_thread_8040);
+        close(fd);
+        return GSW_HAL_ERROR_GNSS_FAIL;
+    }
+
+    pthread_join(read_thread_8040, NULL);
+    close(fd);
+    if (thread_args.buf_8040 != NULL)
+    {
+        strncpy(version_info, thread_args.buf_8040, 128);
+        version_info[127] = '\0';
+        free(thread_args.buf_8040);
+        LOGE(GSW_GNSS, "Final version info: %s", version_info);
+        return GSW_HAL_SUCCESS;
+    }
+    else
+    {
+        LOGE(GSW_GNSS, "No data received or HD8040 not found");
+        return GSW_HAL_ERROR_GNSS_FAIL;
+    }
 }
 
 
-
