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