Add gnss 5311 support.
Change-Id: I436cbc7eabe8e6448d318b6eee81f49dddcce756
diff --git a/mbtk/mbtk_gnssd/gnss_asr5311.c b/mbtk/mbtk_gnssd/gnss_asr5311.c
new file mode 100755
index 0000000..654fcdc
--- /dev/null
+++ b/mbtk/mbtk_gnssd/gnss_asr5311.c
@@ -0,0 +1,320 @@
+/*
+* gnss_asr5311.c
+*
+* ASR 5311 gnss support source.
+*
+*/
+/******************************************************************************
+
+ EDIT HISTORY FOR FILE
+
+ WHEN WHO WHAT,WHERE,WHY
+-------- -------- -------------------------------------------------------
+2024/6/19 LiuBin Initial version
+
+******************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include "mbtk_log.h"
+#include "mbtk_type.h"
+#include "mbtk_gpio.h"
+#include "gnss_utils.h"
+#include "gnss_asr5311.h"
+
+#define UART_BITRATE_NMEA_DEF_FW 115200 // Default bitrate.
+#define GNSS_SET_TIMEOUT 3000 // 3s
+
+static pthread_cond_t read_cond;
+static pthread_mutex_t read_mutex;
+static bool setting_waitting = FALSE;
+static bool setting_busy = FALSE;
+static void *gnss_set_rsp_ptr = NULL;
+static gnss_err_enum gnss_set_result = GNSS_ERR_OK;
+
+int gnss_write(int fd, const void *data, int data_len);
+
+static void gnss_set_timer_cb(int signo)
+{
+ if(setting_busy) {
+ pthread_mutex_lock(&read_mutex);
+ pthread_cond_signal(&read_cond);
+ pthread_mutex_unlock(&read_mutex);
+ gnss_set_result = GNSS_ERR_TIMEOUT;
+ }
+ return;
+}
+
+static void gnss_hal_gpioctrl(char* str)
+{
+ int fd;
+ fd = open("/sys/devices/platform/asr-gps/ctrl", O_WRONLY);
+
+ if (fd >= 0) {
+ write(fd, str, strlen(str));
+ close(fd);
+ }
+}
+
+static int gnss_module_wait_fw_download_done()
+{
+ int fd;
+ char buf[64];
+ int len;
+ int ret = -1;
+
+ fd = open("/sys/devices/platform/asr-gps/status", O_RDONLY);
+ if (fd >= 0) {
+ sleep(1);
+ len = read(fd, buf, 64);
+ LOGD("FW DONE %s, %d", buf, len);
+ if(!memcmp(buf, "status: on", 10)) {
+ /* FW Downloading is OK. */
+ ret = 0;
+ }
+
+ close(fd);
+ }
+
+ if(ret)
+ gnss_hal_gpioctrl("off");
+
+ return ret;
+}
+
+
+int gnss_5311_dev_open()
+{
+ return 0;
+}
+
+int gnss_5311_dev_close()
+{
+ return 0;
+}
+
+int gnss_5311_open(const char *dev)
+{
+ pthread_mutex_init(&read_mutex, NULL);
+ pthread_cond_init(&read_cond, NULL);
+ return gnss_port_open(dev, O_RDWR | O_NONBLOCK | O_NOCTTY, UART_BITRATE_NMEA_DEF_FW, TRUE);
+}
+
+int gnss_5311_close(int fd)
+{
+ pthread_mutex_destroy(&read_mutex);
+ pthread_cond_destroy(&read_cond);
+ return gnss_port_close(fd);
+}
+
+int gnss_5311_fw_dl(int fd, const char *dev)
+{
+ char cmd[256] = {0};
+ if(memcmp(dev, "/dev/", 5) == 0) {
+ snprintf(cmd, sizeof(cmd), "nice -n -10 aboot-tiny -B 2000000 -s %s -F /lib/firmware/jacana_fw.bin -P /system/etc/jacana_pvt.bin", dev + 5);
+ } else {
+ snprintf(cmd, sizeof(cmd), "nice -n -10 aboot-tiny -B 2000000 -s %s -F /lib/firmware/jacana_fw.bin -P /system/etc/jacana_pvt.bin", dev);
+ }
+ system(cmd);
+
+ return gnss_module_wait_fw_download_done();
+}
+
+void gnss_5311_set_cb(const void *data, int data_len)
+{
+ const char *buff = (const char*)data;
+ if(setting_busy) { // Has setting cmd process.
+
+ }
+}
+
+gnss_err_enum gnss_5311_set(int fd, const char *cmd, void *cmd_rsp, int cmd_rsp_len)
+{
+ if(setting_busy) {
+ return GNSS_ERR_SET_BUSY;
+ } else {
+ bool should_wait_rsp = TRUE;
+ setting_busy = TRUE;
+ gnss_set_rsp_ptr = cmd_rsp;
+ gnss_set_result = GNSS_ERR_OK;
+
+ mbtk_timer_set(gnss_set_timer_cb, GNSS_SET_TIMEOUT);
+
+ if(memcmp(cmd, "$RESET", 6) == 0) { // $RESET,<mode>
+ gnss_reset_type_enum mode = (gnss_reset_type_enum)atoi(cmd + 7);
+ if(mode == GNSS_RESET_TYPE_HOT) {
+
+ } else if(mode == GNSS_RESET_TYPE_WARM) {
+
+ } else if(mode == GNSS_RESET_TYPE_COLD) {
+
+ } else {
+ gnss_set_result = GNSS_ERR_ARG;
+ goto set_fail;
+ }
+ if(gnss_set_result != GNSS_ERR_OK) {
+ goto set_fail;
+ }
+ should_wait_rsp = FALSE;
+ } else if(memcmp(cmd, "$SYSCFG", 7) == 0) { // $SYSCFG,<mode>
+ uint32 mode = 0;
+ mode = (uint32)atoi(cmd + 8);
+ uint32 new_mode = 0;
+ if(((GNSS_SET_SYSCFG_GPS | GNSS_SET_SYSCFG_BDS | GNSS_SET_SYSCFG_GLO | GNSS_SET_SYSCFG_GAL) & mode) != mode) {
+ gnss_set_result = GNSS_ERR_ARG;
+ goto set_fail;
+ }
+
+ if(mode & GNSS_SET_SYSCFG_GPS) { // GPS
+ new_mode |= 0x00000001;
+ }
+ if(mode & GNSS_SET_SYSCFG_BDS) { // BDS
+ new_mode |= 0x00000002;
+ }
+ if(mode & GNSS_SET_SYSCFG_GLO) { // GLO
+ new_mode |= 0x00000004;
+ }
+ if(mode & GNSS_SET_SYSCFG_GAL) { // GAL
+ new_mode |= 0x00000010;
+ }
+
+
+ if(gnss_set_result != GNSS_ERR_OK) {
+ goto set_fail;
+ }
+ should_wait_rsp = TRUE;
+ } else if(memcmp(cmd, "$MSGCFG", 7) == 0) { // $MSGCFG,<mode>,<rate>
+ uint32 mode;
+ int rate;
+ if(2 == sscanf(cmd, "$MSGCFG,%d,%d", &mode, &rate)) {
+ int time = rate / 1000; // s
+ if(time < 0) {
+ gnss_set_result = GNSS_ERR_ARG;
+ goto set_fail;
+ }
+
+ if(((GNSS_SET_MSGCFG_RMC | GNSS_SET_MSGCFG_VTG | GNSS_SET_MSGCFG_GGA | GNSS_SET_MSGCFG_GSA
+ | GNSS_SET_MSGCFG_GRS | GNSS_SET_MSGCFG_GSV | GNSS_SET_MSGCFG_GLL | GNSS_SET_MSGCFG_ZDA
+ | GNSS_SET_MSGCFG_GST | GNSS_SET_MSGCFG_TXT) & mode) != mode) {
+ gnss_set_result = GNSS_ERR_ARG;
+ goto set_fail;
+ }
+
+ if(mode & GNSS_SET_MSGCFG_RMC) {
+
+ }
+
+ if(mode & GNSS_SET_MSGCFG_VTG) {
+
+ }
+
+ if(mode & GNSS_SET_MSGCFG_GGA) {
+
+ }
+
+ if(mode & GNSS_SET_MSGCFG_GSA) {
+
+ }
+
+ if(mode & GNSS_SET_MSGCFG_GRS) {
+
+ }
+
+ if(mode & GNSS_SET_MSGCFG_GSV) {
+
+ }
+
+ if(mode & GNSS_SET_MSGCFG_GLL) {
+
+ }
+
+ if(mode & GNSS_SET_MSGCFG_ZDA) {
+
+ }
+
+ if(mode & GNSS_SET_MSGCFG_GST) {
+
+ }
+
+ if(mode & GNSS_SET_MSGCFG_TXT) {
+
+ }
+ } else {
+ gnss_set_result = GNSS_ERR_ARG;
+ goto set_fail;
+ }
+
+ should_wait_rsp = TRUE;
+ } else if(memcmp(cmd, "$MINEL", 6) == 0) { // $MINEL,<elev>
+#if 0
+ float elev = 0.0f;
+ elev = (float)atof(cmd + 7);
+// LOGD("ELEV : %f", elev);
+// log_hex("ELEV", &elev, sizeof(double));
+ if(elev < -90.0f || elev > 90.0f) {
+ gnss_set_result = GNSS_ERR_ARG;
+ goto set_fail;
+ }
+ float elevs[2];
+ elevs[0] = elev;
+ elevs[1] = elev;
+ gnss_set_result = gnss_8122_minel(fd, elevs);
+ if(gnss_set_result != GNSS_ERR_OK) {
+ goto set_fail;
+ }
+ should_wait_rsp = FALSE;
+#else
+ gnss_set_result = GNSS_ERR_UNSUPPORT;
+ goto set_fail;
+#endif
+ } else if(memcmp(cmd, "$NMEACFG", 8) == 0) { // $NMEACFG,<ver>
+#if 0
+ gnss_memaver_type_enum version = (gnss_memaver_type_enum)atoi(cmd + 9);
+ if(version == GNSS_MEMAVER_TYPE_3_0) {
+ gnss_set_result = gnss_8122_nmeaver(fd, 1);
+ } else if(version == GNSS_MEMAVER_TYPE_4_0) {
+ gnss_set_result = gnss_8122_nmeaver(fd, 2);
+ } else if(version == GNSS_MEMAVER_TYPE_4_1) {
+ gnss_set_result = gnss_8122_nmeaver(fd, 3);
+ } else {
+ gnss_set_result = GNSS_ERR_ARG;
+ goto set_fail;
+ }
+ if(gnss_set_result != GNSS_ERR_OK) {
+ goto set_fail;
+ }
+ should_wait_rsp = FALSE;
+#else
+ gnss_set_result = GNSS_ERR_UNSUPPORT;
+ goto set_fail;
+#endif
+ }
+ else
+ {
+ LOGW("Unknown cmd:%s", cmd);
+ gnss_set_result = GNSS_ERR_UNSUPPORT;
+ goto set_fail;
+ }
+
+set_success:
+ if(should_wait_rsp) {
+ setting_waitting = TRUE;
+ pthread_mutex_lock(&read_mutex);
+ pthread_cond_wait(&read_cond, &read_mutex);
+ pthread_mutex_unlock(&read_mutex);
+ } else {
+ mbtk_timer_clear();
+ }
+
+ setting_busy = FALSE;
+ return gnss_set_result;
+set_fail:
+ setting_busy = FALSE;
+ mbtk_timer_clear();
+ return gnss_set_result;
+ }
+}
+