blob: bca402bf0c829451f36491c89ca59165b3b559c9 [file] [log] [blame]
b.liu99c645d2024-06-20 10:52:15 +08001/*
2* gnss_asr5311.c
3*
4* ASR 5311 gnss support source.
5*
6*/
7/******************************************************************************
8
9 EDIT HISTORY FOR FILE
10
11 WHEN WHO WHAT,WHERE,WHY
12-------- -------- -------------------------------------------------------
132024/6/19 LiuBin Initial version
14
15******************************************************************************/
16#include <stdio.h>
17#include <stdlib.h>
18#include <unistd.h>
19#include <errno.h>
20#include <fcntl.h>
b.liu778645e2024-06-21 16:47:42 +080021#include <pthread.h>
b.liu99c645d2024-06-20 10:52:15 +080022
23#include "mbtk_log.h"
24#include "mbtk_type.h"
25#include "mbtk_gpio.h"
b.liu778645e2024-06-21 16:47:42 +080026#include "mbtk_utils.h"
b.liu99c645d2024-06-20 10:52:15 +080027#include "gnss_utils.h"
28#include "gnss_asr5311.h"
29
30#define UART_BITRATE_NMEA_DEF_FW 115200 // Default bitrate.
31#define GNSS_SET_TIMEOUT 3000 // 3s
32
33static pthread_cond_t read_cond;
34static pthread_mutex_t read_mutex;
35static bool setting_waitting = FALSE;
36static bool setting_busy = FALSE;
37static void *gnss_set_rsp_ptr = NULL;
38static gnss_err_enum gnss_set_result = GNSS_ERR_OK;
39
40int gnss_write(int fd, const void *data, int data_len);
41
42static void gnss_set_timer_cb(int signo)
43{
44 if(setting_busy) {
45 pthread_mutex_lock(&read_mutex);
46 pthread_cond_signal(&read_cond);
47 pthread_mutex_unlock(&read_mutex);
48 gnss_set_result = GNSS_ERR_TIMEOUT;
49 }
50 return;
51}
52
53static void gnss_hal_gpioctrl(char* str)
54{
55 int fd;
56 fd = open("/sys/devices/platform/asr-gps/ctrl", O_WRONLY);
57
58 if (fd >= 0) {
59 write(fd, str, strlen(str));
60 close(fd);
61 }
62}
63
64static int gnss_module_wait_fw_download_done()
65{
66 int fd;
67 char buf[64];
68 int len;
69 int ret = -1;
70
71 fd = open("/sys/devices/platform/asr-gps/status", O_RDONLY);
72 if (fd >= 0) {
73 sleep(1);
74 len = read(fd, buf, 64);
75 LOGD("FW DONE %s, %d", buf, len);
76 if(!memcmp(buf, "status: on", 10)) {
77 /* FW Downloading is OK. */
78 ret = 0;
79 }
80
81 close(fd);
82 }
83
84 if(ret)
85 gnss_hal_gpioctrl("off");
86
87 return ret;
88}
89
90
91int gnss_5311_dev_open()
92{
93 return 0;
94}
95
96int gnss_5311_dev_close()
97{
98 return 0;
99}
100
101int gnss_5311_open(const char *dev)
102{
103 pthread_mutex_init(&read_mutex, NULL);
104 pthread_cond_init(&read_cond, NULL);
105 return gnss_port_open(dev, O_RDWR | O_NONBLOCK | O_NOCTTY, UART_BITRATE_NMEA_DEF_FW, TRUE);
106}
107
108int gnss_5311_close(int fd)
109{
110 pthread_mutex_destroy(&read_mutex);
111 pthread_cond_destroy(&read_cond);
112 return gnss_port_close(fd);
113}
114
b.liudbc3f4b2024-06-25 18:22:24 +0800115int gnss_5311_fw_dl(int fd, const char *fw_name, const char *dev)
b.liu99c645d2024-06-20 10:52:15 +0800116{
117 char cmd[256] = {0};
118 if(memcmp(dev, "/dev/", 5) == 0) {
b.liuced8dd02024-06-28 13:28:29 +0800119 snprintf(cmd, sizeof(cmd), "nice -n -10 aboot-tiny -B 2000000 -s %s -F /etc/jacana_fw.bin -P /etc/jacana_pvt.bin", dev + 5);
b.liu99c645d2024-06-20 10:52:15 +0800120 } else {
b.liuced8dd02024-06-28 13:28:29 +0800121 snprintf(cmd, sizeof(cmd), "nice -n -10 aboot-tiny -B 2000000 -s %s -F /etc/jacana_fw.bin -P /etc/jacana_pvt.bin", dev);
b.liu99c645d2024-06-20 10:52:15 +0800122 }
123 system(cmd);
124
125 return gnss_module_wait_fw_download_done();
126}
127
128void gnss_5311_set_cb(const void *data, int data_len)
129{
130 const char *buff = (const char*)data;
131 if(setting_busy) { // Has setting cmd process.
132
133 }
134}
135
136gnss_err_enum gnss_5311_set(int fd, const char *cmd, void *cmd_rsp, int cmd_rsp_len)
137{
138 if(setting_busy) {
139 return GNSS_ERR_SET_BUSY;
140 } else {
141 bool should_wait_rsp = TRUE;
142 setting_busy = TRUE;
143 gnss_set_rsp_ptr = cmd_rsp;
144 gnss_set_result = GNSS_ERR_OK;
145
146 mbtk_timer_set(gnss_set_timer_cb, GNSS_SET_TIMEOUT);
147
148 if(memcmp(cmd, "$RESET", 6) == 0) { // $RESET,<mode>
149 gnss_reset_type_enum mode = (gnss_reset_type_enum)atoi(cmd + 7);
150 if(mode == GNSS_RESET_TYPE_HOT) {
151
152 } else if(mode == GNSS_RESET_TYPE_WARM) {
153
154 } else if(mode == GNSS_RESET_TYPE_COLD) {
155
156 } else {
157 gnss_set_result = GNSS_ERR_ARG;
158 goto set_fail;
159 }
160 if(gnss_set_result != GNSS_ERR_OK) {
161 goto set_fail;
162 }
163 should_wait_rsp = FALSE;
164 } else if(memcmp(cmd, "$SYSCFG", 7) == 0) { // $SYSCFG,<mode>
165 uint32 mode = 0;
166 mode = (uint32)atoi(cmd + 8);
167 uint32 new_mode = 0;
168 if(((GNSS_SET_SYSCFG_GPS | GNSS_SET_SYSCFG_BDS | GNSS_SET_SYSCFG_GLO | GNSS_SET_SYSCFG_GAL) & mode) != mode) {
169 gnss_set_result = GNSS_ERR_ARG;
170 goto set_fail;
171 }
172
173 if(mode & GNSS_SET_SYSCFG_GPS) { // GPS
174 new_mode |= 0x00000001;
175 }
176 if(mode & GNSS_SET_SYSCFG_BDS) { // BDS
177 new_mode |= 0x00000002;
178 }
179 if(mode & GNSS_SET_SYSCFG_GLO) { // GLO
180 new_mode |= 0x00000004;
181 }
182 if(mode & GNSS_SET_SYSCFG_GAL) { // GAL
183 new_mode |= 0x00000010;
184 }
185
186
187 if(gnss_set_result != GNSS_ERR_OK) {
188 goto set_fail;
189 }
190 should_wait_rsp = TRUE;
191 } else if(memcmp(cmd, "$MSGCFG", 7) == 0) { // $MSGCFG,<mode>,<rate>
192 uint32 mode;
193 int rate;
194 if(2 == sscanf(cmd, "$MSGCFG,%d,%d", &mode, &rate)) {
195 int time = rate / 1000; // s
196 if(time < 0) {
197 gnss_set_result = GNSS_ERR_ARG;
198 goto set_fail;
199 }
200
201 if(((GNSS_SET_MSGCFG_RMC | GNSS_SET_MSGCFG_VTG | GNSS_SET_MSGCFG_GGA | GNSS_SET_MSGCFG_GSA
202 | GNSS_SET_MSGCFG_GRS | GNSS_SET_MSGCFG_GSV | GNSS_SET_MSGCFG_GLL | GNSS_SET_MSGCFG_ZDA
203 | GNSS_SET_MSGCFG_GST | GNSS_SET_MSGCFG_TXT) & mode) != mode) {
204 gnss_set_result = GNSS_ERR_ARG;
205 goto set_fail;
206 }
207
208 if(mode & GNSS_SET_MSGCFG_RMC) {
209
210 }
211
212 if(mode & GNSS_SET_MSGCFG_VTG) {
213
214 }
215
216 if(mode & GNSS_SET_MSGCFG_GGA) {
217
218 }
219
220 if(mode & GNSS_SET_MSGCFG_GSA) {
221
222 }
223
224 if(mode & GNSS_SET_MSGCFG_GRS) {
225
226 }
227
228 if(mode & GNSS_SET_MSGCFG_GSV) {
229
230 }
231
232 if(mode & GNSS_SET_MSGCFG_GLL) {
233
234 }
235
236 if(mode & GNSS_SET_MSGCFG_ZDA) {
237
238 }
239
240 if(mode & GNSS_SET_MSGCFG_GST) {
241
242 }
243
244 if(mode & GNSS_SET_MSGCFG_TXT) {
245
246 }
247 } else {
248 gnss_set_result = GNSS_ERR_ARG;
249 goto set_fail;
250 }
251
252 should_wait_rsp = TRUE;
253 } else if(memcmp(cmd, "$MINEL", 6) == 0) { // $MINEL,<elev>
254#if 0
255 float elev = 0.0f;
256 elev = (float)atof(cmd + 7);
257// LOGD("ELEV : %f", elev);
258// log_hex("ELEV", &elev, sizeof(double));
259 if(elev < -90.0f || elev > 90.0f) {
260 gnss_set_result = GNSS_ERR_ARG;
261 goto set_fail;
262 }
263 float elevs[2];
264 elevs[0] = elev;
265 elevs[1] = elev;
266 gnss_set_result = gnss_8122_minel(fd, elevs);
267 if(gnss_set_result != GNSS_ERR_OK) {
268 goto set_fail;
269 }
270 should_wait_rsp = FALSE;
271#else
272 gnss_set_result = GNSS_ERR_UNSUPPORT;
273 goto set_fail;
274#endif
275 } else if(memcmp(cmd, "$NMEACFG", 8) == 0) { // $NMEACFG,<ver>
276#if 0
277 gnss_memaver_type_enum version = (gnss_memaver_type_enum)atoi(cmd + 9);
278 if(version == GNSS_MEMAVER_TYPE_3_0) {
279 gnss_set_result = gnss_8122_nmeaver(fd, 1);
280 } else if(version == GNSS_MEMAVER_TYPE_4_0) {
281 gnss_set_result = gnss_8122_nmeaver(fd, 2);
282 } else if(version == GNSS_MEMAVER_TYPE_4_1) {
283 gnss_set_result = gnss_8122_nmeaver(fd, 3);
284 } else {
285 gnss_set_result = GNSS_ERR_ARG;
286 goto set_fail;
287 }
288 if(gnss_set_result != GNSS_ERR_OK) {
289 goto set_fail;
290 }
291 should_wait_rsp = FALSE;
292#else
293 gnss_set_result = GNSS_ERR_UNSUPPORT;
294 goto set_fail;
295#endif
296 }
297 else
298 {
299 LOGW("Unknown cmd:%s", cmd);
300 gnss_set_result = GNSS_ERR_UNSUPPORT;
301 goto set_fail;
302 }
303
304set_success:
305 if(should_wait_rsp) {
306 setting_waitting = TRUE;
307 pthread_mutex_lock(&read_mutex);
308 pthread_cond_wait(&read_cond, &read_mutex);
309 pthread_mutex_unlock(&read_mutex);
310 } else {
311 mbtk_timer_clear();
312 }
313
314 setting_busy = FALSE;
315 return gnss_set_result;
316set_fail:
317 setting_busy = FALSE;
318 mbtk_timer_clear();
319 return gnss_set_result;
320 }
321}
322