[Feature][T108][task-view-1878]add hd8040 fw update and hd8122 fw update

Only Configure:No
Affected branch:mbtk_source_ds
Affected module:fw_date
Is it affected on: GNSS
Self-test: Yes
Doc Update:No

Change-Id: I276760cfc11ed18565ea004824615ee5285ba8e6
diff --git a/mbtk/libmbtk_lib/gnss/mbtk_gnss.c b/mbtk/libmbtk_lib/gnss/mbtk_gnss.c
index 707b9de..aaf794b 100755
--- a/mbtk/libmbtk_lib/gnss/mbtk_gnss.c
+++ b/mbtk/libmbtk_lib/gnss/mbtk_gnss.c
@@ -868,9 +868,10 @@
         if(timeout > 0) {
             mbtk_timer_set(gnss_timer_cb, timeout * 1000);
         }
+        
 
         // gnss_dl:fw_name
-        char cmd[32] = {0};
+        char cmd[64] = {0};
         snprintf(cmd, sizeof(cmd), "gnss_dl:%s", fw_path);
         sock_write(gnss_cli_fd, cmd, strlen(cmd));
 
diff --git a/mbtk/mbtk_gnssd/gnss_hd8122.c b/mbtk/mbtk_gnssd/gnss_hd8122.c
index d9c61e2..ea1ced8 100755
--- a/mbtk/mbtk_gnssd/gnss_hd8122.c
+++ b/mbtk/mbtk_gnssd/gnss_hd8122.c
@@ -61,7 +61,7 @@
 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";
+//static char gnss_ctrl_path[128] = "/sys/devices/platform/mbtk-gnss/ctrl";
 static gnss_agps_info_t agps_info;
 static char *gnss_set_cmd_rsp = NULL;
 static int gnss_cmd_rsp_len = 0;
@@ -70,6 +70,8 @@
 int OpenUart(const char* UART_DEV);
 int uart_close(int fd);
 int fw_update_boot(int uart_fd, uint8_t *data, uint32_t len);
+int fw_update_boot_8122(int uart_fd, uint8_t *data, uint32_t len);
+
 
 static uint16 fletcher16(const uint8_t* data, int data_len)
 {
@@ -184,40 +186,6 @@
     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)
 {
@@ -634,7 +602,8 @@
 
 int gnss_8122_fw_dl(int fd, const char *fw_name, const char *dev)
 {
-    int uart_fd = OpenUart(dev);//PORT_NAME234
+    //PORT_NAME234
+    int uart_fd = open(dev , O_RDWR|O_NOCTTY);
     if (uart_fd < 0)
     {
         LOGE("open uart failed %d[%d]", uart_fd, errno);
@@ -651,6 +620,13 @@
     {
         memcpy(fw_path, GNSS_FW_GAQBS_PATH, strlen(GNSS_FW_GAQBS_PATH));
     }
+    else if(fw_name != NULL)
+    {
+        memcpy(fw_path, fw_name, strlen(fw_name));
+        LOGE("fw_path: %s",fw_path);
+    }
+
+   
     else
     {
         LOGE("fw dl param error");
@@ -669,43 +645,91 @@
         LOGE("Read file failed ,len = %d", len);
         goto error;
     }
-    if(gnss_8122_dev_open())
-    {
-        LOGE("open gnss device fail:%d", errno);
-        goto error;
+
+    int ret;
+    // branch1:gp_gl_ga & gp_bd_ga
+    if (memcmp(fw_name, "gp_gl_ga", 8) == 0 || memcmp(fw_name, "gp_bd_ga", 8) == 0) {
+        if(gnss_8122_dev_open())
+        {
+            LOGE("open gnss device fail:%d", errno);
+            goto error;
+        }
+
+        mbtk_system("echo 63 > /sys/class/gpio/export");
+        mbtk_system("echo 62 > /sys/class/gpio/export");
+        mbtk_system("echo out > /sys/class/gpio/gpio63/direction");
+        mbtk_system("echo out > /sys/class/gpio/gpio62/direction");
+        mbtk_system("echo 0 > /sys/class/gpio/gpio63/value");
+        usleep(100000);//100ms
+        mbtk_system("echo 1 > /sys/class/gpio/gpio62/value");//reset
+        usleep(1000000);//1s
+        mbtk_system("echo 0 > /sys/class/gpio/gpio62/value");
+        usleep(100000);//100ms
+        mbtk_system("echo 1 > /sys/class/gpio/gpio63/value");//boot
+        mbtk_system("echo 62 > /sys/class/gpio/unexport");
+        mbtk_system("echo 63 > /sys/class/gpio/unexport");
+
+
+        ret = fw_update_boot_8122(uart_fd, g_bin_buff, len);
+        if (ret < 0)
+        {
+            LOGE("fw_update_boot() fail : %d", ret);
+            goto error;
+        }
+
+        if(gnss_8122_dev_close(0))
+        {
+            LOGE("close gnss device fail:%d", errno);
+            goto error;
+        }
+
+        if(ret == HDBD_UPG_SUCESS)
+        {
+            LOGD("upgrade sucess!");
+        }
+        else
+        {
+            LOGD("upgrade FAIL, fail style:%d", ret);
+            goto error;
+        }
+
+        free(g_bin_buff);
+        uart_close(uart_fd);
+        return GNSS_ERR_OK;
+    }
+    // branch2: else
+    else {
+        mbtk_system("echo 0 > /sys/class/gpio/gpio41/value");//41 gnss_power_en
+        usleep(500000);//500ms
+
+        mbtk_system("echo 1 > /sys/class/gpio/gpio120/value");//120 boot
+        usleep(500000);//500ms
+        mbtk_system("echo 1 > /sys/class/gpio/gpio41/value");//41 gnss_power_en
+        usleep(500000);//500ms
+
+
+        ret = fw_update_boot(uart_fd, g_bin_buff, len);
+        if (ret < 0)
+        {
+            LOGE("fw_update_boot() fail : %d", ret);
+            goto error;
+        }
+
+        if(ret == HDBD_UPG_SUCESS)
+        {
+            LOGD("upgrade sucess!");
+        }
+        else
+        {
+            LOGD("upgrade FAIL, fail style:%d", ret);
+            goto error;
+        }
+
+        free(g_bin_buff);
+        uart_close(uart_fd);
+        return GNSS_ERR_OK;
     }
 
-    if(gnss_fwdl_enable() < 0)
-    {
-        LOGE("gnss_fwdl_enable fail");
-        goto error;
-    }
-
-    int ret = fw_update_boot(uart_fd, g_bin_buff, len);
-    if (ret < 0)
-    {
-        LOGE("fw_update_boot() fail : %d", ret);
-        goto error;
-    }
-    if(ret == HDBD_UPG_SUCESS)
-    {
-        LOGD("upgrade sucess!");
-    }
-    else
-    {
-        LOGD("upgrade FAIL, fail style:%d", ret);
-        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)
     {
diff --git a/mbtk/mbtk_gnssd/hd8122_dl/fwup.c b/mbtk/mbtk_gnssd/hd8122_dl/fwup.c
index b2662aa..9567ea6 100755
--- a/mbtk/mbtk_gnssd/hd8122_dl/fwup.c
+++ b/mbtk/mbtk_gnssd/hd8122_dl/fwup.c
@@ -313,11 +313,113 @@
   * @param  len : the length of firmware data

   * @retval None

   */

+  //8040update

 int fw_update_boot(int uart_fd, uint8_t *data, uint32_t len)

 {

 	int i = 1;

 //	uint8_t dataAck[10];

-	//1st 1KB send at last

+//  1st 1KB send at last

+	uint8_t *data1st1k = data;

+    uint8_t recvBuf[READ_LENGTH] = {0};

+	uint8_t errorCount = 0;

+	int32_t ret = 0;

+    if (NULL == data )

+    {

+        HDBD_LOG("[%s %d]firmware data error\n", __FUNCTION__, __LINE__);

+        return -1;

+    }

+

+	uart_clear_buf(uart_fd);

+	errorCount = 0;

+	while(1)

+	{

+		ret = get_mon_ver(uart_fd, (uint8_t *)recvBuf, READ_LENGTH - 1);

+		errorCount ++;

+		if (ret != 0)

+		{

+			HDBD_LOG("[%s %d]boot: Get version FAIL in baudrate 460800, return\n", __FUNCTION__, __LINE__);

+			if(errorCount >= 4)

+			{

+				HDBD_LOG("[%s %d] enter boot failed!\n", __FUNCTION__, __LINE__);

+				return -1;

+			}

+		}

+		else

+		{

+			break;

+		}

+	}

+

+	i = 0;

+	while(i < 15)

+	{

+		if( (recvBuf[i] == 'F') && (recvBuf[i+1] == 'B') && (recvBuf[i+2] == '0') && (recvBuf[i+3] == '3'))

+		{

+			goto BOOT;

+		}

+		HDBD_LOG("[%s %d] enter boot failed!\n", __FUNCTION__, __LINE__);

+		return -1;

+	}

+

+BOOT:

+	ret = uart_send(uart_fd, (uint8_t *)cmdSETFRQ, sizeof(cmdSETFRQ));

+	usleep(50000);

+

+	uart_clear_buf(uart_fd);

+	memset(recvBuf, 0x00, sizeof(recvBuf));

+	i = 10;

+

+	ret = send_cmd_and_recv_result(uart_fd,cmdBOOTERASE_100, recvBuf, sizeof(cmdBOOTERASE_100), &i, 3);

+	HDBD_LOG("[%s %d]ret:%d,cmdOpenQe_and_wrtPro(%d)(%02x,%x,%x,%x,%x,%x,%x,%x,%x,%x)\n", __FUNCTION__, __LINE__, ret, i,

+		recvBuf[0],recvBuf[1],recvBuf[2],recvBuf[3],recvBuf[4],recvBuf[5],

+		recvBuf[6],recvBuf[7],recvBuf[8],recvBuf[9]);

+	if( (recvBuf[0] == 0xF1) && (recvBuf[1] == 0xD9) && (recvBuf[2] == 0x05) && (recvBuf[3] != 0x01) )

+	{

+		HDBD_LOG("[%s %d] cmdBOOTERASE error!\n", __FUNCTION__, __LINE__);

+		return -1;

+	}

+

+	uart_clear_buf(uart_fd);

+

+	data += 1024;

+	len -= 1024;

+	for(i = 1 ;len > 1024; ++i, data += 1024, len -= 1024)

+	{

+		ret = sendfwboot(uart_fd, 0x00100000 + i * 0x400, i, data, 1024, recvBuf);

+		if (ret != 0)

+        {

+            HDBD_LOG("[%s %d] upgrade error,return!\n", __FUNCTION__, __LINE__);

+			return -1;

+        }

+	}

+

+	ret = sendfwboot(uart_fd, 0x00100000 + i * 0x400, i, data, len, recvBuf);

+	if (ret != 0)

+	{

+		HDBD_LOG("[%s %d] upgrade error,return!\n", __FUNCTION__, __LINE__);

+		return -1;

+	}

+	i++;

+

+	ret = sendfwboot(uart_fd, 0x00100000, i, data1st1k, 1024, recvBuf);

+	if (ret != 0)

+	{

+		HDBD_LOG("[%s %d] upgrade error,return!\n", __FUNCTION__, __LINE__);

+		return -1;

+	}

+

+	//uart_send((uint8_t *)cmdCFGRST, 9);

+	HDBD_LOG("[%s %d] upgrade success!\n", __FUNCTION__, __LINE__);

+	return 0;

+}

+

+

+//8122update

+int fw_update_boot_8122(int uart_fd, uint8_t *data, uint32_t len)

+{

+	int i = 1;

+//	uint8_t dataAck[10];

+//  1st 1KB send at last

 	uint8_t *data1st1k = data;

     uint8_t recvBuf[READ_LENGTH] = {0};

 	uint8_t errorCount = 0;

@@ -424,7 +526,6 @@
 		}

 	}

 

-

 	ret = send_cmd_and_recv_result(uart_fd,cmdBOOTERASE_900, recvBuf, sizeof(cmdBOOTERASE_900), &i, 3);

 	HDBD_LOG("[%s %d]ret:%d,cmdOpenQe_and_wrtPro(%d)(%02x,%x,%x,%x,%x,%x,%x,%x,%x,%x)\n", __FUNCTION__, __LINE__, ret, i,

 		recvBuf[0],recvBuf[1],recvBuf[2],recvBuf[3],recvBuf[4],recvBuf[5],

@@ -469,4 +570,3 @@
 	return 0;

 }

 

-