[Feature][T108][task-view-1945]Provide complete firmware version and Resolve timeout problems
Only Configure:No
Affected branch:GSW_V1453
Affected module:firmware update
Is it affected on:asr
Doc Update:No
Change-Id: I3505dc78b2dad33aef3685d31682f5bd286f4af2
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;
+ }
}
-