gnss: update gnss fw download code

Change-Id: Iaba40436629ee6ff4b63961d697eeb27ced814c2
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)