diff --git a/mbtk/mbtk_gnssd/gnss_hd8122.c b/mbtk/mbtk_gnssd/gnss_hd8122.c
index 5a328de..8b476ce 100755
--- a/mbtk/mbtk_gnssd/gnss_hd8122.c
+++ b/mbtk/mbtk_gnssd/gnss_hd8122.c
@@ -34,7 +34,8 @@
 #define GNSS_PACK_BUFF_SIZE           1024
 #define GNSS_MSG_NUM_MAX 30
 #define READ_LEN_MAX 1024 //BOOT_UPGRADE_BUFF_MAX_1
-
+#define GNSS_FW_GQALS_PATH "/lib/firmware/HD8122.YIKE.GN3.115200.0035.720e5.53ef0.GQALS.ANT.EPH.CFG.PPS13.240115R1.bin"
+#define GNSS_FW_GAQBS_PATH "/lib/firmware/HD8122.YIKE.GN3.115200.0037.dbd12.53ef0.GAQBS.B1C.ANT.EPH.CFG.PPS13.240416R1.bin"
 
 static pthread_cond_t read_cond;
 static pthread_mutex_t read_mutex;
@@ -43,6 +44,8 @@
 static void *gnss_set_rsp_ptr = NULL;
 static gnss_err_enum gnss_set_result = GNSS_ERR_OK;
 static hd8122_msg_id_t msg_array[GNSS_MSG_NUM_MAX];
+static char gnss_ctrl_path[128] = "/sys/devices/platform/mbtk-gnss/ctrl";
+
 
 int gnss_write(int fd, const void *data, int data_len);
 int OpenUart(char* UART_DEV);
@@ -160,6 +163,41 @@
     return count;
 }
 
+static int gnss_ctrl_write(char* str)
+{
+    int fd = -1;
+    int ret = -1;
+    fd = open((const char*)gnss_ctrl_path, O_WRONLY);
+    if (fd < 0)
+    {
+        LOGE("open %s fail", gnss_ctrl_path);
+        return -1;
+    }
+    else
+    {
+        ret = write(fd, str, strlen(str));
+        close(fd);
+        if(ret < 0)
+        {
+            LOGE("write %s fail", str);
+            return -1;
+        }
+    }
+    return 0;
+}
+
+static int gnss_fwdl_enable()
+{
+    int ret = -1;
+	ret = gnss_ctrl_write("fdl");
+    if(ret < 0)
+    {
+        LOGE("gnss_ctrl_write fail");
+        return -1;
+    }
+    return 0;
+}
+
 static uint32_t read_bin_file(uint8_t *path, uint8_t *buff)
 {
     int fp = -1;
@@ -469,40 +507,83 @@
         return GNSS_ERR_OPEN_DEV;
     }
 
+    uint8_t fw_path[256] = {0};
+    memset(fw_path, 0x0, 256);
+    if(memcmp(fw_name, "gp_gl_ga", 8) == 0)
+    {
+        memcpy(fw_path, GNSS_FW_GQALS_PATH, strlen(GNSS_FW_GQALS_PATH));
+    }
+    else if(memcmp(fw_name, "gp_bd_ga", 8) == 0)
+    {
+        memcpy(fw_path, GNSS_FW_GAQBS_PATH, strlen(GNSS_FW_GAQBS_PATH));
+    }
+    else
+    {
+        LOGE("fw dl param error");
+        return GNSS_ERR_ARG;
+    }
+
     uint8_t *g_bin_buff = (uint8_t*)malloc(500*1024);
     if(g_bin_buff == NULL) {
         LOGE("malloc() fail : %d", errno);
         return GNSS_ERR_UNKNOWN;
     }
     memset(g_bin_buff, 0, 500*1024);
-    uint32_t len = read_bin_file(fw_name, g_bin_buff);
+    uint32_t len = read_bin_file(fw_path, g_bin_buff);
     if (len <= 0)
     {
         LOGE("Read file failed ,len = %d", len);
-        return GNSS_ERR_DL_FW;
+        goto error;
     }
-    if(gnss_8122_dev_open()) {
+    if(gnss_8122_dev_open())
+    {
         LOGE("open gnss device fail:%d", errno);
-        return GNSS_ERR_DL_FW;
+        goto error;
     }
+
+    if(gnss_fwdl_enable() < 0)
+    {
+        LOGE("gnss_fwdl_enable fail");
+        goto error;
+    }
+    
     int ret = fw_update_boot(uart_fd, g_bin_buff, len);
-    free(g_bin_buff);
     if (ret < 0)
     {
         LOGE("fw_update_boot() fail : %d", ret);
-        return GNSS_ERR_DL_FW;
+        goto error;
     }
-    uart_close(uart_fd);
     if(ret == HDBD_UPG_SUCESS)
     {
         LOGD("upgrade sucess!");
-        return GNSS_ERR_OK;
     }
     else
     {
         LOGD("upgrade FAIL, fail style:%d", ret);
-        return GNSS_ERR_DL_FW;
+        goto error;
     }
+    
+    if(gnss_8122_dev_close(0))
+    {
+        LOGE("close gnss device fail:%d", errno);
+        goto error;
+    }
+    free(g_bin_buff);
+    g_bin_buff = NULL;
+    uart_close(uart_fd);
+    return GNSS_ERR_OK;
+error:
+    if(g_bin_buff)
+    {
+        free(g_bin_buff);
+        g_bin_buff = NULL;
+    }
+    if(uart_fd > 0)
+    {
+        uart_close(uart_fd);
+        uart_fd = -1;
+    }
+    return GNSS_ERR_DL_FW;
 }
 
 void gnss_8122_set_cb(const void *data, int data_len)
