blob: d9c61e2aace1681ef6418a838007a192f6035bb2 [file] [log] [blame]
b.liuf9fbfa12024-06-14 15:53:59 +08001/*
2* gnss_hd8122.c
3*
4* HD8122 GNSS source.
5*
6*/
7/******************************************************************************
8
9 EDIT HISTORY FOR FILE
10
11 WHEN WHO WHAT,WHERE,WHY
12-------- -------- -------------------------------------------------------
132024/6/14 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.liuf9fbfa12024-06-14 15:53:59 +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.liuf9fbfa12024-06-14 15:53:59 +080027#include "gnss_utils.h"
28#include "gnss_hd8122.h"
b.liudbc3f4b2024-06-25 18:22:24 +080029#include "hd8122_dl/hd8040_upgrade.h"
yq.wang99db6f52024-09-12 01:58:48 -070030#include "agps/agnss_http_download.h"
31#include "agps/8122_agnss.h"
b.liu9e8584b2024-11-06 19:21:28 +080032#include "mbtk_utils.h"
33// #include "hd8122_dl/port.h"
34
b.liuf9fbfa12024-06-14 15:53:59 +080035
36#define UART_BITRATE_NMEA_DEF_FW 115200 // Default bitrate.
37#define GNSS_POWER_GPIO 43
b.liu5f950c52024-06-15 20:13:12 +080038#define GNSS_SET_TIMEOUT 3000 // 3s
39#define GNSS_PACK_BUFF_SIZE 1024
b.liud0ba7152024-06-19 14:47:21 +080040#define GNSS_MSG_NUM_MAX 30
b.liudbc3f4b2024-06-25 18:22:24 +080041#define READ_LEN_MAX 1024 //BOOT_UPGRADE_BUFF_MAX_1
yq.wang6eacd292024-09-14 03:01:07 -070042#define GNSS_FW_GQALS_PATH "/lib/firmware/gp_gl_ga_fw.bin"
43#define GNSS_FW_GAQBS_PATH "/lib/firmware/gp_bd_ga_fw.bin"
b.liuf9fbfa12024-06-14 15:53:59 +080044
yq.wang99db6f52024-09-12 01:58:48 -070045//#define AGNSS_TEST_URL "http://aclientt.allystar.com:80/ephemeris/HD_GPS_BDS.hdb"
46#define AGNSS_URL "http://uagnss.allystar.com:80/ephemeris/%s?compid=yikecs1&token=Z38w5urAuawubTxi"
47#define AGNSS_INDIVIDUATION_URL_HEAD "http://cagnss.allystar.com/api/v1/eph/rt?"
48#define AGNSS_ALLSTAR_URL_HEAD "http://cagnss.allystar.com/api/v1/eph/rta?"
49#define AGNSS_EPH_FILE_PATH "/lib/firmware/eph_data.txt"
50
51#define AGNSS_EPH_GPS "HD_GPS.hdb"
52#define AGNSS_EPH_BDS "HD_BDS.hdb"
53#define AGNSS_EPH_GLO "HD_GLO.hdb"
54#define AGNSS_EPH_GPS_BDS "HD_GPS_BDS.hdb"
55#define AGNSS_EPH_GPS_GLO "HD_GPS_GLO.hdb"
56
b.liuf9fbfa12024-06-14 15:53:59 +080057static pthread_cond_t read_cond;
58static pthread_mutex_t read_mutex;
b.liud0ba7152024-06-19 14:47:21 +080059static bool setting_waitting = FALSE;
b.liu5f950c52024-06-15 20:13:12 +080060static bool setting_busy = FALSE;
61static void *gnss_set_rsp_ptr = NULL;
62static gnss_err_enum gnss_set_result = GNSS_ERR_OK;
b.liud0ba7152024-06-19 14:47:21 +080063static hd8122_msg_id_t msg_array[GNSS_MSG_NUM_MAX];
yq.wangaf363dc2024-08-06 20:16:00 -070064static char gnss_ctrl_path[128] = "/sys/devices/platform/mbtk-gnss/ctrl";
yq.wang9dd771b2024-09-13 23:38:40 -070065static gnss_agps_info_t agps_info;
yq.wang51d17352024-09-23 04:54:46 -070066static char *gnss_set_cmd_rsp = NULL;
67static int gnss_cmd_rsp_len = 0;
b.liuf9fbfa12024-06-14 15:53:59 +080068
b.liu5f950c52024-06-15 20:13:12 +080069int gnss_write(int fd, const void *data, int data_len);
b.liu9e8584b2024-11-06 19:21:28 +080070int OpenUart(const char* UART_DEV);
b.liudbc3f4b2024-06-25 18:22:24 +080071int uart_close(int fd);
72int fw_update_boot(int uart_fd, uint8_t *data, uint32_t len);
b.liu5f950c52024-06-15 20:13:12 +080073
b.liudbc3f4b2024-06-25 18:22:24 +080074static uint16 fletcher16(const uint8_t* data, int data_len)
75{
b.liud0ba7152024-06-19 14:47:21 +080076 uint32_t sum1 = 0;
77 uint32_t sum2 = 0;
b.liu5f950c52024-06-15 20:13:12 +080078 int index;
79
b.liudbc3f4b2024-06-25 18:22:24 +080080 for (index = 0; index < data_len; ++index )
81 {
b.liud0ba7152024-06-19 14:47:21 +080082 sum1 += data[index];
83 sum2 += sum1;
b.liu5f950c52024-06-15 20:13:12 +080084 }
85
b.liud0ba7152024-06-19 14:47:21 +080086 return ((0xFF & sum2) << 8) | (0xFF & sum1);
b.liu5f950c52024-06-15 20:13:12 +080087}
88
89static void gnss_set_timer_cb(int signo)
90{
b.liudbc3f4b2024-06-25 18:22:24 +080091 if(setting_busy)
92 {
b.liu5f950c52024-06-15 20:13:12 +080093 pthread_mutex_lock(&read_mutex);
94 pthread_cond_signal(&read_cond);
95 pthread_mutex_unlock(&read_mutex);
96 gnss_set_result = GNSS_ERR_TIMEOUT;
97 }
98 return;
99}
100
b.liud0ba7152024-06-19 14:47:21 +0800101static void msg_init()
102{
b.liu778645e2024-06-21 16:47:42 +0800103 unsigned int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800104 while(i < ARRAY_SIZE(msg_array))
105 {
b.liud0ba7152024-06-19 14:47:21 +0800106 msg_array[i].enable = FALSE;
107 i++;
108 }
109}
110
b.liud0ba7152024-06-19 14:47:21 +0800111static int msg_insert(uint8 gid, uint8 sid)
112{
b.liu778645e2024-06-21 16:47:42 +0800113 unsigned int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800114 while(i < ARRAY_SIZE(msg_array))
115 {
b.liud0ba7152024-06-19 14:47:21 +0800116 if(!msg_array[i].enable)
117 break;
118 i++;
119 }
120
b.liudbc3f4b2024-06-25 18:22:24 +0800121 if(i == ARRAY_SIZE(msg_array))
122 {
b.liud0ba7152024-06-19 14:47:21 +0800123 LOGE("Msg full : %d", i);
124 return -1;
b.liudbc3f4b2024-06-25 18:22:24 +0800125 }
126 else
127 {
b.liud0ba7152024-06-19 14:47:21 +0800128 msg_array[i].enable = TRUE;
129 msg_array[i].gid = gid;
130 msg_array[i].sid = sid;
131 return 0;
132 }
133}
134
135static int msg_find(uint8 gid, uint8 sid)
136{
b.liu778645e2024-06-21 16:47:42 +0800137 unsigned int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800138 while(i < ARRAY_SIZE(msg_array))
139 {
b.liud0ba7152024-06-19 14:47:21 +0800140 if(msg_array[i].enable && gid == msg_array[i].gid && sid == msg_array[i].sid)
141 break;
142 i++;
143 }
144
b.liudbc3f4b2024-06-25 18:22:24 +0800145 if(i == ARRAY_SIZE(msg_array))
146 {
b.liud0ba7152024-06-19 14:47:21 +0800147 LOGE("No found %d - %d", gid, sid);
148 return -1;
b.liudbc3f4b2024-06-25 18:22:24 +0800149 }
150 else
151 {
b.liud0ba7152024-06-19 14:47:21 +0800152 return i;
153 }
154}
155
b.liu9e8584b2024-11-06 19:21:28 +0800156#if 0
b.liud0ba7152024-06-19 14:47:21 +0800157static int msg_remove(uint8 gid, uint8 sid)
158{
159 int i = msg_find(gid, sid);
b.liudbc3f4b2024-06-25 18:22:24 +0800160 if(i >= 0)
161 {
b.liud0ba7152024-06-19 14:47:21 +0800162 msg_array[i].enable = FALSE;
163 msg_array[i].gid = 0;
164 msg_array[i].sid = 0;
165 return 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800166 }
167 else
168 {
b.liud0ba7152024-06-19 14:47:21 +0800169 return -1;
170 }
171}
b.liu9e8584b2024-11-06 19:21:28 +0800172#endif
b.liud0ba7152024-06-19 14:47:21 +0800173
174static int msg_count()
175{
b.liu778645e2024-06-21 16:47:42 +0800176 unsigned int i = 0;
b.liud0ba7152024-06-19 14:47:21 +0800177 int count = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800178 while(i < ARRAY_SIZE(msg_array))
179 {
b.liud0ba7152024-06-19 14:47:21 +0800180 if(msg_array[i].enable)
181 count++;
182 i++;
183 }
184 return count;
185}
b.liu5f950c52024-06-15 20:13:12 +0800186
yq.wangaf363dc2024-08-06 20:16:00 -0700187static int gnss_ctrl_write(char* str)
188{
189 int fd = -1;
190 int ret = -1;
191 fd = open((const char*)gnss_ctrl_path, O_WRONLY);
192 if (fd < 0)
193 {
194 LOGE("open %s fail", gnss_ctrl_path);
195 return -1;
196 }
197 else
198 {
199 ret = write(fd, str, strlen(str));
200 close(fd);
201 if(ret < 0)
202 {
203 LOGE("write %s fail", str);
204 return -1;
205 }
206 }
207 return 0;
208}
209
210static int gnss_fwdl_enable()
211{
212 int ret = -1;
213 ret = gnss_ctrl_write("fdl");
214 if(ret < 0)
215 {
216 LOGE("gnss_ctrl_write fail");
217 return -1;
218 }
219 return 0;
220}
221
b.liudbc3f4b2024-06-25 18:22:24 +0800222static uint32_t read_bin_file(uint8_t *path, uint8_t *buff)
223{
224 int fp = -1;
225 int ret = 0;
226 int i = 0;
227 int size = 0;
228
229 if (NULL == path || NULL == buff)
230 {
231 LOGE("ARG error");
232 return 0;
233 }
234
235 fp = open((char *)path, O_RDONLY);
236 if(fp < 0)
237 {
238 LOGE( "open file failed ! errno is %d", errno);
239 return 0;
240 }
241
242 size = lseek(fp, 0x00, SEEK_END);
243 if(size <= 0)
244 {
245 LOGE( "file is empty.");
246 return 0;
247 }
248
249 LOGD( "file size is:%d", size);
250 lseek(fp, 0x00, SEEK_SET);
251 while(1)
252 {
253 ret = read(fp, buff, READ_LEN_MAX);
254 i += ret;
255 if(ret == READ_LEN_MAX)
256 {
257 buff += READ_LEN_MAX;
258 }
259 else
260 {
261 break;
262 }
263 }
264
265 LOGD("file size is:%d,i:%d", size, i);
266 close(fp);
267 if(size != i)
268 {
269 return 0;
270 }
271 return size;
272}
273
274
b.liu5f950c52024-06-15 20:13:12 +0800275static int pack_create(hd8122_id_type_enum id_type, uint8 id, uint16 data_len, const uint8 *data, uint8 *pack, int pack_len)
276{
b.liudbc3f4b2024-06-25 18:22:24 +0800277 if(pack == NULL || pack_len < HD8122_PACK_LEN_MIN)
278 {
b.liu5f950c52024-06-15 20:13:12 +0800279 return -1;
280 }
281 memset(pack, 0, pack_len);
282 uint8 *data_ptr = pack;
283 data_ptr += uint16_2_byte(HD8122_PACK_HEAD, data_ptr, false);
284 *data_ptr++ = (uint8)id_type;
285 *data_ptr++ = id;
286 data_ptr += uint16_2_byte(data_len, data_ptr, false);
b.liudbc3f4b2024-06-25 18:22:24 +0800287 if(data_len > 0)
288 {
b.liu5f950c52024-06-15 20:13:12 +0800289 memcpy(data_ptr, data, data_len);
290 data_ptr += data_len;
291 }
292 data_ptr += uint16_2_byte(fletcher16(pack + 2, 4 + data_len), data_ptr, false);
293 return (data_ptr - pack);
294}
295
b.liud0ba7152024-06-19 14:47:21 +0800296// f1 d9 05 01 02 00 06 01 0f 38
297// or
298// f1 d9 05 00 02 00 06 01 0f 38
299static int msg_array_change(const uint8 *pack, int pack_len, hd8122_id_ack_enum *ack_nak)
300{
yq.wang51d17352024-09-23 04:54:46 -0700301 if(pack_len == 0)
302 {
303 LOGE("pack_len(%d) error.", pack_len);
304 return -1;
305 }
306
307 //info result
308 if(gnss_set_cmd_rsp != NULL)
309 {
310 if(pack_len > 4 && pack[2] == 0x0a && pack[3] == 0x04) //VER INFO
311 {
312 char sw_ver[32] = {0};
313 char hw_ver[32] = {0};
314 memcpy(sw_ver, pack + 6, 16);
315 memcpy(hw_ver, pack + 22, 16);
316 snprintf(gnss_set_cmd_rsp, gnss_cmd_rsp_len, "%s,%s", sw_ver, hw_ver);
317 LOGE("fw ver:%s", gnss_set_cmd_rsp);
318 int index = msg_find(pack[2], pack[3]);
319 if(index >= 0)
320 {
321 msg_array[index].enable = FALSE;
322 }
323 else
324 {
325 LOGE("Unknown gid - %d, sid - %d", pack[2], pack[3]);
326 return -1;
327 }
328 return 0;
329 }
330 }
331
332 //set result
333 if(pack_len % 10)
b.liudbc3f4b2024-06-25 18:22:24 +0800334 {
b.liud0ba7152024-06-19 14:47:21 +0800335 LOGE("pack_len(%d) error.", pack_len);
336 return -1;
337 }
338 int count = pack_len / 10;
339 int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800340 while(i < count)
341 {
b.liu778645e2024-06-21 16:47:42 +0800342 const uint8 *ptr = pack + i * 10;
b.liudbc3f4b2024-06-25 18:22:24 +0800343 if(ptr[0] != 0xf1 || ptr[1] != 0xd9)
344 {
b.liud0ba7152024-06-19 14:47:21 +0800345 LOGE("Pack head error : %02x %02x", ptr[0], ptr[1]);
346 return -1;
347 }
348
b.liudbc3f4b2024-06-25 18:22:24 +0800349 if(ptr[2] != 0x05)
350 {
b.liud0ba7152024-06-19 14:47:21 +0800351 LOGE("Type not 0x05 : %02x", ptr[2]);
352 return -1;
353 }
354
355 int index = msg_find(ptr[6], ptr[7]);
b.liudbc3f4b2024-06-25 18:22:24 +0800356 if(index >= 0)
357 {
358 if(ptr[3] == 0x01)
359 {
b.liud0ba7152024-06-19 14:47:21 +0800360 msg_array[index].ack_nak = HD8122_ID_ACK_ACK;
b.liudbc3f4b2024-06-25 18:22:24 +0800361 }
362 else if(ptr[3] == 0x00)
363 {
b.liud0ba7152024-06-19 14:47:21 +0800364 msg_array[index].ack_nak = HD8122_ID_ACK_NAK;
365
366 // There is a nak as a failure.
367 *ack_nak = HD8122_ID_ACK_NAK;
b.liudbc3f4b2024-06-25 18:22:24 +0800368 }
369 else
370 {
b.liud0ba7152024-06-19 14:47:21 +0800371 LOGE("ID not 0x00 or 0x01 : %02x", ptr[3]);
372 return -1;
373 }
374
375 msg_array[index].enable = FALSE;
b.liudbc3f4b2024-06-25 18:22:24 +0800376 }
377 else
378 {
b.liud0ba7152024-06-19 14:47:21 +0800379 LOGE("Unknown gid - %d, sid - %d", ptr[6], ptr[7]);
380 return -1;
381 }
382 i++;
383 }
384
385 return 0;
386}
387
b.liudbc3f4b2024-06-25 18:22:24 +0800388static void gnss_cmd_rsp_process(const void *data, int data_len)
389{
b.liu9e8584b2024-11-06 19:21:28 +0800390// const char *ptr = (const char*)data;
b.liu5f950c52024-06-15 20:13:12 +0800391 log_hex("RSP", data, data_len);
b.liu5f950c52024-06-15 20:13:12 +0800392
b.liud0ba7152024-06-19 14:47:21 +0800393 hd8122_id_ack_enum ack_nak = HD8122_ID_ACK_ACK;
b.liudbc3f4b2024-06-25 18:22:24 +0800394 if(!msg_array_change((const uint8*)data, data_len, &ack_nak))
395 {
b.liud0ba7152024-06-19 14:47:21 +0800396 if(setting_waitting && msg_count() == 0)
397 {
b.liudbc3f4b2024-06-25 18:22:24 +0800398 if(ack_nak == HD8122_ID_ACK_ACK)
399 {
b.liud0ba7152024-06-19 14:47:21 +0800400 gnss_set_result = GNSS_ERR_OK;
b.liudbc3f4b2024-06-25 18:22:24 +0800401 }
402 else
403 {
b.liud0ba7152024-06-19 14:47:21 +0800404 gnss_set_result = GNSS_ERR_UNKNOWN;
405 }
406
407 mbtk_timer_clear();
408
409 pthread_mutex_lock(&read_mutex);
410 pthread_cond_signal(&read_cond);
411 pthread_mutex_unlock(&read_mutex);
412 setting_waitting = FALSE;
413 }
b.liu9e8584b2024-11-06 19:21:28 +0800414
b.liudbc3f4b2024-06-25 18:22:24 +0800415 }
416 else
417 {
b.liud0ba7152024-06-19 14:47:21 +0800418 LOGW("Unknown rsp data.");
b.liu5f950c52024-06-15 20:13:12 +0800419 }
420}
421
b.liud0ba7152024-06-19 14:47:21 +0800422static gnss_err_enum gnss_8122_reset(int fd, uint8 reset)
b.liu5f950c52024-06-15 20:13:12 +0800423{
424 uint8 buff[GNSS_PACK_BUFF_SIZE];
425 LOGD("RESET");
426 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_SIMPLERST, 1, (uint8*)(&reset), buff, sizeof(buff));
b.liudbc3f4b2024-06-25 18:22:24 +0800427 if(len <= 0)
428 {
b.liu5f950c52024-06-15 20:13:12 +0800429 LOGE("pack_create() fail.");
430 return GNSS_ERR_ARG;
431 }
432 log_hex("PACK", buff, len);
433 gnss_write(fd, buff, len);
434 return GNSS_ERR_OK;
435}
b.liuf9fbfa12024-06-14 15:53:59 +0800436
b.liud0ba7152024-06-19 14:47:21 +0800437static gnss_err_enum gnss_8122_syscfg(int fd, uint32 mode)
438{
439 uint8 buff[GNSS_PACK_BUFF_SIZE];
440 LOGD("SYSCFG");
441 //uint8 mode_str[4];
442 //uint32_2_byte(mode, mode_str, TRUE);
443 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_NAVSAT, 4, (uint8*)(&mode), buff, sizeof(buff));
b.liudbc3f4b2024-06-25 18:22:24 +0800444 if(len <= 0)
445 {
b.liud0ba7152024-06-19 14:47:21 +0800446 LOGE("pack_create() fail.");
447 return GNSS_ERR_ARG;
448 }
449 log_hex("PACK", buff, len);
450 gnss_write(fd, buff, len);
451 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_NAVSAT);
452 return GNSS_ERR_OK;
453}
454
yq.wang6a3437f2024-07-27 02:57:20 -0700455static gnss_err_enum gnss_8122_freqcfg(int fd, uint8 mode)
456{
457 uint8 buff[GNSS_PACK_BUFF_SIZE];
458 LOGD("FREQCFG");
459 uint8 data[20];
460 memset(data, 0x00, 20);
461 data[1] = mode;
462 data[2] = 0x66;
463 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_PWRCTL, 20, data, buff, sizeof(buff));
464 if(len <= 0)
465 {
466 LOGE("pack_create() fail.");
467 return GNSS_ERR_ARG;
468 }
469 log_hex("PACK", buff, len);
470 gnss_write(fd, buff, len);
471 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_PWRCTL);
472 return GNSS_ERR_OK;
473}
474
yq.wang012b6522024-09-12 02:36:53 -0700475static gnss_err_enum gnss_8122_cfg_save(int fd)
476{
477 uint8 buff[GNSS_PACK_BUFF_SIZE];
478 LOGD("CFG SAVE");
479 uint8 data[8];
480 memset(data, 0x00, 8);
481 data[4] = 0x0f;
482 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_CFG, 8, data, buff, sizeof(buff));
483 if(len <= 0)
484 {
485 LOGE("pack_create() fail.");
486 return GNSS_ERR_ARG;
487 }
488 log_hex("PACK", buff, len);
489 gnss_write(fd, buff, len);
490 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_CFG);
491 return GNSS_ERR_OK;
492}
493
b.liud0ba7152024-06-19 14:47:21 +0800494static gnss_err_enum gnss_8122_msgcfg(int fd, uint8 type, uint8 id, uint8 period)
495{
496 uint8 buff[GNSS_PACK_BUFF_SIZE];
497 LOGD("MSGCFG");
498 uint8 data[3];
499 data[0] = type;
500 data[1] = id;
501 data[2] = period;
502 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_MSG, 3, data, buff, sizeof(buff));
b.liudbc3f4b2024-06-25 18:22:24 +0800503 if(len <= 0)
504 {
b.liud0ba7152024-06-19 14:47:21 +0800505 LOGE("pack_create() fail.");
506 return GNSS_ERR_ARG;
507 }
508 log_hex("PACK", buff, len);
509 gnss_write(fd, buff, len);
510 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_MSG);
511 return GNSS_ERR_OK;
512}
513
yq.wang51d17352024-09-23 04:54:46 -0700514static gnss_err_enum gnss_8122_ver(int fd)
b.liud0ba7152024-06-19 14:47:21 +0800515{
516 uint8 buff[GNSS_PACK_BUFF_SIZE];
yq.wang51d17352024-09-23 04:54:46 -0700517 LOGD("VER");
518 int len = pack_create(HD8122_ID_TYPE_MON, HD8122_ID_MON_VER, 0, NULL, buff, sizeof(buff));
b.liudbc3f4b2024-06-25 18:22:24 +0800519 if(len <= 0)
520 {
b.liud0ba7152024-06-19 14:47:21 +0800521 LOGE("pack_create() fail.");
522 return GNSS_ERR_ARG;
523 }
524 log_hex("PACK", buff, len);
525 gnss_write(fd, buff, len);
yq.wang51d17352024-09-23 04:54:46 -0700526 msg_insert(HD8122_ID_TYPE_MON, HD8122_ID_MON_VER);
b.liud0ba7152024-06-19 14:47:21 +0800527 return GNSS_ERR_OK;
528}
529
yq.wang51d17352024-09-23 04:54:46 -0700530
531static gnss_err_enum gnss_8122_minel(int fd, uint8 *elev)
532{
533 uint8 buff[GNSS_PACK_BUFF_SIZE];
534 LOGD("ELEV");
535 //uint8 elev_buff[4];
536 //uint32_2_byte((uint32)elev, elev_buff, TRUE);
537 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_ELEV, 8, elev, buff, sizeof(buff));
538 if(len <= 0)
539 {
540 LOGE("pack_create() fail.");
541 return GNSS_ERR_ARG;
542 }
543 log_hex("PACK", buff, len);
544 gnss_write(fd, buff, len);
545 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_ELEV);
546 return GNSS_ERR_OK;
547}
548
549static gnss_err_enum gnss_8122_PZ90CONV(int fd, uint8 *coord)
550{
551 uint8 buff[GNSS_PACK_BUFF_SIZE];
552 LOGD("PZ90CONV");
553 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_COORD, 44, coord, buff, sizeof(buff));
554 if(len <= 0)
555 {
556 LOGE("pack_create() fail.");
557 return GNSS_ERR_ARG;
558 }
559 log_hex("PACK", buff, len);
560 gnss_write(fd, buff, len);
561 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_COORD);
562 return GNSS_ERR_OK;
563}
564
b.liu9e8584b2024-11-06 19:21:28 +0800565#if 0
b.liud0ba7152024-06-19 14:47:21 +0800566static gnss_err_enum gnss_8122_nmeaver(int fd, uint8 ver)
567{
568 uint8 buff[GNSS_PACK_BUFF_SIZE];
569 LOGD("NMEA-VER");
570 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_NMEAVER, 1, (uint8*)(&ver), buff, sizeof(buff));
b.liudbc3f4b2024-06-25 18:22:24 +0800571 if(len <= 0)
572 {
b.liud0ba7152024-06-19 14:47:21 +0800573 LOGE("pack_create() fail.");
574 return GNSS_ERR_ARG;
575 }
576 log_hex("PACK", buff, len);
577 gnss_write(fd, buff, len);
578 return GNSS_ERR_OK;
579}
b.liu9e8584b2024-11-06 19:21:28 +0800580#endif
b.liud0ba7152024-06-19 14:47:21 +0800581
yq.wang36222352024-11-06 03:31:24 -0800582static gnss_err_enum gnss_8122_ephsave(int fd, uint8 status)
583{
584 uint8 buff[GNSS_PACK_BUFF_SIZE];
585 LOGD("EPHSAVE");
586 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_EPHSAVE, 1, (uint8*)(&status), buff, sizeof(buff));
587 if(len <= 0)
588 {
589 LOGE("pack_create() fail.");
590 return GNSS_ERR_ARG;
591 }
592 log_hex("PACK", buff, len);
593 gnss_write(fd, buff, len);
594 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_EPHSAVE);
595 return GNSS_ERR_OK;
596}
597
598
b.liuf9fbfa12024-06-14 15:53:59 +0800599int gnss_8122_dev_open()
600{
yq.wang5fe6e612024-07-17 01:18:12 -0700601 //return mbtk_gpio_value_set(GNSS_POWER_GPIO, MBTK_GPIO_DIRECT_OUT, 1);
b.liu9e8584b2024-11-06 19:21:28 +0800602 mbtk_system("i2cset -y -f 2 0x31 0x15 0x86");
yq.wang5fe6e612024-07-17 01:18:12 -0700603 return 0;
b.liuf9fbfa12024-06-14 15:53:59 +0800604}
605
b.liu978f5432024-07-01 18:04:18 +0800606int gnss_8122_dev_close(int fd)
b.liuf9fbfa12024-06-14 15:53:59 +0800607{
yq.wang5fe6e612024-07-17 01:18:12 -0700608 //return mbtk_gpio_value_set(GNSS_POWER_GPIO, MBTK_GPIO_DIRECT_OUT, 0);
b.liu9e8584b2024-11-06 19:21:28 +0800609 mbtk_system("i2cset -y -f 2 0x31 0x15 0x00");
yq.wang5fe6e612024-07-17 01:18:12 -0700610 return 0;
b.liuf9fbfa12024-06-14 15:53:59 +0800611}
612
613int gnss_8122_open(const char *dev)
614{
615 pthread_mutex_init(&read_mutex, NULL);
616 pthread_cond_init(&read_cond, NULL);
617 return gnss_port_open(dev, O_RDWR | O_NONBLOCK | O_NOCTTY, UART_BITRATE_NMEA_DEF_FW, TRUE);
618}
619
620int gnss_8122_close(int fd)
621{
622 pthread_mutex_destroy(&read_mutex);
623 pthread_cond_destroy(&read_cond);
624 return gnss_port_close(fd);
625}
626
yq.wang36222352024-11-06 03:31:24 -0800627int gnss_8122_init_set(int fd)
628{
629 sleep(1); //wait 8122 ready...
630 gnss_8122_ephsave(fd, (uint8)HD8122_EPHSAVE_STATUS_DISABLE);
631 gnss_8122_cfg_save(fd);
632 return GNSS_ERR_OK;
633}
634
b.liudbc3f4b2024-06-25 18:22:24 +0800635int gnss_8122_fw_dl(int fd, const char *fw_name, const char *dev)
b.liuf9fbfa12024-06-14 15:53:59 +0800636{
b.liudbc3f4b2024-06-25 18:22:24 +0800637 int uart_fd = OpenUart(dev);//PORT_NAME234
638 if (uart_fd < 0)
639 {
640 LOGE("open uart failed %d[%d]", uart_fd, errno);
641 return GNSS_ERR_OPEN_DEV;
642 }
643
yq.wangaf363dc2024-08-06 20:16:00 -0700644 uint8_t fw_path[256] = {0};
645 memset(fw_path, 0x0, 256);
646 if(memcmp(fw_name, "gp_gl_ga", 8) == 0)
647 {
648 memcpy(fw_path, GNSS_FW_GQALS_PATH, strlen(GNSS_FW_GQALS_PATH));
649 }
650 else if(memcmp(fw_name, "gp_bd_ga", 8) == 0)
651 {
652 memcpy(fw_path, GNSS_FW_GAQBS_PATH, strlen(GNSS_FW_GAQBS_PATH));
653 }
654 else
655 {
656 LOGE("fw dl param error");
657 return GNSS_ERR_ARG;
658 }
659
b.liudbc3f4b2024-06-25 18:22:24 +0800660 uint8_t *g_bin_buff = (uint8_t*)malloc(500*1024);
661 if(g_bin_buff == NULL) {
662 LOGE("malloc() fail : %d", errno);
663 return GNSS_ERR_UNKNOWN;
664 }
665 memset(g_bin_buff, 0, 500*1024);
yq.wangaf363dc2024-08-06 20:16:00 -0700666 uint32_t len = read_bin_file(fw_path, g_bin_buff);
b.liudbc3f4b2024-06-25 18:22:24 +0800667 if (len <= 0)
668 {
669 LOGE("Read file failed ,len = %d", len);
yq.wangaf363dc2024-08-06 20:16:00 -0700670 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800671 }
yq.wangaf363dc2024-08-06 20:16:00 -0700672 if(gnss_8122_dev_open())
673 {
b.liudbc3f4b2024-06-25 18:22:24 +0800674 LOGE("open gnss device fail:%d", errno);
yq.wangaf363dc2024-08-06 20:16:00 -0700675 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800676 }
yq.wangaf363dc2024-08-06 20:16:00 -0700677
678 if(gnss_fwdl_enable() < 0)
679 {
680 LOGE("gnss_fwdl_enable fail");
681 goto error;
682 }
b.liu9e8584b2024-11-06 19:21:28 +0800683
b.liudbc3f4b2024-06-25 18:22:24 +0800684 int ret = fw_update_boot(uart_fd, g_bin_buff, len);
b.liudbc3f4b2024-06-25 18:22:24 +0800685 if (ret < 0)
686 {
687 LOGE("fw_update_boot() fail : %d", ret);
yq.wangaf363dc2024-08-06 20:16:00 -0700688 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800689 }
b.liudbc3f4b2024-06-25 18:22:24 +0800690 if(ret == HDBD_UPG_SUCESS)
691 {
692 LOGD("upgrade sucess!");
b.liudbc3f4b2024-06-25 18:22:24 +0800693 }
694 else
695 {
696 LOGD("upgrade FAIL, fail style:%d", ret);
yq.wangaf363dc2024-08-06 20:16:00 -0700697 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800698 }
b.liu9e8584b2024-11-06 19:21:28 +0800699
yq.wangaf363dc2024-08-06 20:16:00 -0700700 if(gnss_8122_dev_close(0))
701 {
702 LOGE("close gnss device fail:%d", errno);
703 goto error;
704 }
705 free(g_bin_buff);
706 g_bin_buff = NULL;
707 uart_close(uart_fd);
708 return GNSS_ERR_OK;
709error:
710 if(g_bin_buff)
711 {
712 free(g_bin_buff);
713 g_bin_buff = NULL;
714 }
715 if(uart_fd > 0)
716 {
717 uart_close(uart_fd);
718 uart_fd = -1;
719 }
720 return GNSS_ERR_DL_FW;
b.liuf9fbfa12024-06-14 15:53:59 +0800721}
722
yq.wang99db6f52024-09-12 01:58:48 -0700723gnss_err_enum gnss_8122_agnss_get_eph(const char *param)
724{
725 if(param == NULL)
726 {
727 LOGD("gnss_8122_agnss_get_eph param is NULL");
728 return GNSS_ERR_ARG;
729 }
730
731 int eph_type = 0;
732 int alam_flag = 0;
733 int ret = -1;
b.liu9e8584b2024-11-06 19:21:28 +0800734 char url[1024] = {0};
yq.wang99db6f52024-09-12 01:58:48 -0700735 if(2 == sscanf(param, "%d,%d", &eph_type, &alam_flag))
736 {
737 if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS)
738 {
b.liu9e8584b2024-11-06 19:21:28 +0800739 snprintf(url, sizeof(url),AGNSS_URL, AGNSS_EPH_GPS);
yq.wang99db6f52024-09-12 01:58:48 -0700740 }
741 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_BDS)
742 {
b.liu9e8584b2024-11-06 19:21:28 +0800743 snprintf(url, sizeof(url),AGNSS_URL, AGNSS_EPH_BDS);
yq.wang99db6f52024-09-12 01:58:48 -0700744 }
745 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GLO)
746 {
b.liu9e8584b2024-11-06 19:21:28 +0800747 snprintf(url, sizeof(url),AGNSS_URL, AGNSS_EPH_GLO);
yq.wang99db6f52024-09-12 01:58:48 -0700748 }
749 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS_BDS)
750 {
b.liu9e8584b2024-11-06 19:21:28 +0800751 snprintf(url, sizeof(url),AGNSS_URL, AGNSS_EPH_GPS_BDS);
yq.wang99db6f52024-09-12 01:58:48 -0700752 }
753 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS_GLO)
754 {
b.liu9e8584b2024-11-06 19:21:28 +0800755 snprintf(url, sizeof(url),AGNSS_URL, AGNSS_EPH_GPS_GLO);
yq.wang99db6f52024-09-12 01:58:48 -0700756 }
yq.wang9dd771b2024-09-13 23:38:40 -0700757 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_CFG)
758 {
b.liu9e8584b2024-11-06 19:21:28 +0800759 snprintf(url, sizeof(url),"%s?compid=%s&token=%s", strlen(agps_info.host) > 0 ? agps_info.host : "http://uagnss.allystar.com:80/ephemeris/HD_GPS.hdb",
yq.wang9dd771b2024-09-13 23:38:40 -0700760 strlen(agps_info.id) > 0 ? agps_info.id : "yikecs1",
761 strlen(agps_info.passwd) > 0 ? agps_info.passwd : "Z38w5urAuawubTxi");
762 }
yq.wang99db6f52024-09-12 01:58:48 -0700763 else
764 {
765 return GNSS_ERR_UNSUPPORT;
766 }
767
768 ret = eph_data_from_http_get(url, AGNSS_EPH_FILE_PATH);
769 if (ret < 0)
770 {
771 LOGD("eph_data_from_http_get fail");
772 return GNSS_ERR_EPH_GET_FAIL;
773 }
774 LOGD("get_eph_data_from_http success");
775 }
776 else
777 {
778 LOGD("param num error");
779 return GNSS_ERR_ARG;
780 }
781 return GNSS_ERR_OK;
782}
783
784
785gnss_err_enum gnss_8122_agnss_inject(int fd)
786{
787 int ret = 0;
788 hd_set_gnss_dev_fd(fd);
789 ret = hd_agnss_inject(AGNSS_EPH_FILE_PATH, 0, 0, 0, 0, NULL);
790 hd_set_gnss_dev_fd(-1);
791 if(ret < 0)
792 {
793 LOGD("hd_agnss_inject fail");
794 return GNSS_ERR_EPH_INJECT_FAIL;
795 }
796 return GNSS_ERR_OK;
797}
798
b.liu5f950c52024-06-15 20:13:12 +0800799void gnss_8122_set_cb(const void *data, int data_len)
800{
b.liu9e8584b2024-11-06 19:21:28 +0800801// const char *buff = (const char*)data;
b.liudbc3f4b2024-06-25 18:22:24 +0800802 if(setting_busy) // Has setting cmd process.
803 {
b.liu5f950c52024-06-15 20:13:12 +0800804 gnss_cmd_rsp_process(data, data_len);
805 }
yq.wang99db6f52024-09-12 01:58:48 -0700806
yq.wang9dd771b2024-09-13 23:38:40 -0700807#if 0
yq.wang99db6f52024-09-12 01:58:48 -0700808 if(hd_get_eph_inject_status() == HD_EPH_INJECT_STATUS_WAIT_RETURN)
809 {
810 log_hex("EPH_RSP", (const char*)data, data_len);
811 int ret = hd_eph_inject_result_check(data, data_len);
812 if(ret < 0)
813 {
814 hd_set_eph_inject_status(HD_EPH_INJECT_STATUS_FAIL);
815 }
816 else
817 {
818 hd_set_eph_inject_status(HD_EPH_INJECT_STATUS_SUCCESS);
yq.wang9dd771b2024-09-13 23:38:40 -0700819 }
yq.wang99db6f52024-09-12 01:58:48 -0700820 }
yq.wang9dd771b2024-09-13 23:38:40 -0700821#endif
b.liu5f950c52024-06-15 20:13:12 +0800822}
b.liuf9fbfa12024-06-14 15:53:59 +0800823
824gnss_err_enum gnss_8122_set(int fd, const char *cmd, void *cmd_rsp, int cmd_rsp_len)
825{
b.liudbc3f4b2024-06-25 18:22:24 +0800826 if(setting_busy)
827 {
b.liu5f950c52024-06-15 20:13:12 +0800828 return GNSS_ERR_SET_BUSY;
b.liudbc3f4b2024-06-25 18:22:24 +0800829 }
830 else
831 {
b.liu5f950c52024-06-15 20:13:12 +0800832 bool should_wait_rsp = TRUE;
833 setting_busy = TRUE;
834 gnss_set_rsp_ptr = cmd_rsp;
835 gnss_set_result = GNSS_ERR_OK;
b.liud0ba7152024-06-19 14:47:21 +0800836 msg_init();
b.liu5f950c52024-06-15 20:13:12 +0800837 mbtk_timer_set(gnss_set_timer_cb, GNSS_SET_TIMEOUT);
838
b.liudbc3f4b2024-06-25 18:22:24 +0800839 if(memcmp(cmd, "$RESET", 6) == 0) // $RESET,<mode>
840 {
b.liud0ba7152024-06-19 14:47:21 +0800841 gnss_reset_type_enum mode = (gnss_reset_type_enum)atoi(cmd + 7);
yq.wang1ddd1fd2024-07-25 23:00:14 -0700842 LOGD("set reset: %d", mode);
b.liudbc3f4b2024-06-25 18:22:24 +0800843 if(mode == GNSS_RESET_TYPE_HOT)
844 {
b.liud0ba7152024-06-19 14:47:21 +0800845 gnss_set_result = gnss_8122_reset(fd, 3);
b.liudbc3f4b2024-06-25 18:22:24 +0800846 }
847 else if(mode == GNSS_RESET_TYPE_WARM)
848 {
b.liud0ba7152024-06-19 14:47:21 +0800849 gnss_set_result = gnss_8122_reset(fd, 2);
b.liudbc3f4b2024-06-25 18:22:24 +0800850 }
851 else if(mode == GNSS_RESET_TYPE_COLD)
852 {
b.liud0ba7152024-06-19 14:47:21 +0800853 gnss_set_result = gnss_8122_reset(fd, 1);
b.liudbc3f4b2024-06-25 18:22:24 +0800854 }
855 else
856 {
b.liud0ba7152024-06-19 14:47:21 +0800857 gnss_set_result = GNSS_ERR_ARG;
858 goto set_fail;
859 }
b.liudbc3f4b2024-06-25 18:22:24 +0800860 if(gnss_set_result != GNSS_ERR_OK)
861 {
b.liu5f950c52024-06-15 20:13:12 +0800862 goto set_fail;
863 }
864 should_wait_rsp = FALSE;
b.liudbc3f4b2024-06-25 18:22:24 +0800865 }
866 else if(memcmp(cmd, "$SYSCFG", 7) == 0) // $SYSCFG,<mode>
867 {
b.liud0ba7152024-06-19 14:47:21 +0800868 uint32 mode = 0;
869 mode = (uint32)atoi(cmd + 8);
870 uint32 new_mode = 0;
yq.wang51d17352024-09-23 04:54:46 -0700871 if(((GNSS_SET_SYSCFG_GPS | GNSS_SET_SYSCFG_BDS | GNSS_SET_SYSCFG_GLO | GNSS_SET_SYSCFG_GAL | GNSS_SET_SYSCFG_SBAS | GNSS_SET_SYSCFG_QZSS) & mode) != mode)
b.liudbc3f4b2024-06-25 18:22:24 +0800872 {
b.liud0ba7152024-06-19 14:47:21 +0800873 gnss_set_result = GNSS_ERR_ARG;
874 goto set_fail;
875 }
876
b.liudbc3f4b2024-06-25 18:22:24 +0800877 if(mode & GNSS_SET_SYSCFG_GPS) // GPS
878 {
b.liud0ba7152024-06-19 14:47:21 +0800879 new_mode |= 0x00000001;
880 }
b.liudbc3f4b2024-06-25 18:22:24 +0800881 if(mode & GNSS_SET_SYSCFG_BDS) // BDS
882 {
yq.wang51d17352024-09-23 04:54:46 -0700883 new_mode |= 0x00000004;
b.liud0ba7152024-06-19 14:47:21 +0800884 }
b.liudbc3f4b2024-06-25 18:22:24 +0800885 if(mode & GNSS_SET_SYSCFG_GLO) // GLO
886 {
yq.wang51d17352024-09-23 04:54:46 -0700887 new_mode |= 0x00000002;
b.liud0ba7152024-06-19 14:47:21 +0800888 }
b.liudbc3f4b2024-06-25 18:22:24 +0800889 if(mode & GNSS_SET_SYSCFG_GAL) // GAL
890 {
b.liud0ba7152024-06-19 14:47:21 +0800891 new_mode |= 0x00000010;
892 }
yq.wang40c242f2024-11-27 02:43:35 -0800893 if(mode & GNSS_SET_SYSCFG_QZSS) // QZSS
yq.wang51d17352024-09-23 04:54:46 -0700894 {
895 new_mode |= 0x00000020;
896 }
yq.wang40c242f2024-11-27 02:43:35 -0800897 if(mode & GNSS_SET_SYSCFG_SBAS) // SBAS
yq.wang51d17352024-09-23 04:54:46 -0700898 {
899 new_mode |= 0x00000040;
900 }
b.liud0ba7152024-06-19 14:47:21 +0800901
902 gnss_set_result = gnss_8122_syscfg(fd, new_mode);
b.liudbc3f4b2024-06-25 18:22:24 +0800903 if(gnss_set_result != GNSS_ERR_OK)
904 {
b.liud0ba7152024-06-19 14:47:21 +0800905 goto set_fail;
906 }
907 should_wait_rsp = TRUE;
b.liudbc3f4b2024-06-25 18:22:24 +0800908 }
yq.wang6a3437f2024-07-27 02:57:20 -0700909 else if(memcmp(cmd, "$FREQCFG", 8) == 0) //$FREQCFG,<freq>
910 {
911 uint32 freq = 0;
912 freq = (uint32)atoi(cmd + 9);
913 LOGD("set freq: %d", freq);
914 if((GNSS_SET_FREQCFG_1 != freq) && (GNSS_SET_FREQCFG_2 != freq) && (GNSS_SET_FREQCFG_5 != freq))
915 {
916 gnss_set_result = GNSS_ERR_ARG;
917 goto set_fail;
918 }
919 gnss_set_result = gnss_8122_freqcfg(fd, (uint8)freq);
920 if(gnss_set_result != GNSS_ERR_OK)
921 {
922 goto set_fail;
923 }
yq.wang012b6522024-09-12 02:36:53 -0700924
925 gnss_set_result = gnss_8122_cfg_save(fd);
yq.wang6a3437f2024-07-27 02:57:20 -0700926 should_wait_rsp = TRUE;
927 }
b.liudbc3f4b2024-06-25 18:22:24 +0800928 else if(memcmp(cmd, "$MSGCFG", 7) == 0) // $MSGCFG,<mode>,<rate>
929 {
b.liud0ba7152024-06-19 14:47:21 +0800930 uint32 mode;
931 int rate;
b.liudbc3f4b2024-06-25 18:22:24 +0800932 if(2 == sscanf(cmd, "$MSGCFG,%d,%d", &mode, &rate))
933 {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700934 LOGD("set msgcfg: %d, %d", mode, rate);
b.liud0ba7152024-06-19 14:47:21 +0800935 int time = rate / 1000; // s
b.liudbc3f4b2024-06-25 18:22:24 +0800936 if(time < 0)
937 {
b.liud0ba7152024-06-19 14:47:21 +0800938 gnss_set_result = GNSS_ERR_ARG;
939 goto set_fail;
940 }
941
942 if(((GNSS_SET_MSGCFG_RMC | GNSS_SET_MSGCFG_VTG | GNSS_SET_MSGCFG_GGA | GNSS_SET_MSGCFG_GSA
b.liudbc3f4b2024-06-25 18:22:24 +0800943 | GNSS_SET_MSGCFG_GRS | GNSS_SET_MSGCFG_GSV | GNSS_SET_MSGCFG_GLL | GNSS_SET_MSGCFG_ZDA
944 | GNSS_SET_MSGCFG_GST | GNSS_SET_MSGCFG_TXT) & mode) != mode)
945 {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700946 LOGD("msgcfg not support mode");
b.liud0ba7152024-06-19 14:47:21 +0800947 gnss_set_result = GNSS_ERR_ARG;
948 goto set_fail;
949 }
950
b.liudbc3f4b2024-06-25 18:22:24 +0800951 if(mode & GNSS_SET_MSGCFG_RMC)
952 {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700953 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x05, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800954 if(gnss_set_result != GNSS_ERR_OK)
955 {
b.liud0ba7152024-06-19 14:47:21 +0800956 goto set_fail;
957 }
958 }
959
b.liudbc3f4b2024-06-25 18:22:24 +0800960 if(mode & GNSS_SET_MSGCFG_VTG)
961 {
b.liud0ba7152024-06-19 14:47:21 +0800962 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x06, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800963 if(gnss_set_result != GNSS_ERR_OK)
964 {
b.liud0ba7152024-06-19 14:47:21 +0800965 goto set_fail;
966 }
967 }
968
b.liudbc3f4b2024-06-25 18:22:24 +0800969 if(mode & GNSS_SET_MSGCFG_GGA)
970 {
b.liud0ba7152024-06-19 14:47:21 +0800971 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x00, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800972 if(gnss_set_result != GNSS_ERR_OK)
973 {
b.liud0ba7152024-06-19 14:47:21 +0800974 goto set_fail;
975 }
976 }
977
b.liudbc3f4b2024-06-25 18:22:24 +0800978 if(mode & GNSS_SET_MSGCFG_GSA)
979 {
b.liud0ba7152024-06-19 14:47:21 +0800980 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x02, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800981 if(gnss_set_result != GNSS_ERR_OK)
982 {
b.liud0ba7152024-06-19 14:47:21 +0800983 goto set_fail;
984 }
985 }
986
b.liudbc3f4b2024-06-25 18:22:24 +0800987 if(mode & GNSS_SET_MSGCFG_GRS)
988 {
b.liud0ba7152024-06-19 14:47:21 +0800989 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x03, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800990 if(gnss_set_result != GNSS_ERR_OK)
991 {
b.liud0ba7152024-06-19 14:47:21 +0800992 goto set_fail;
993 }
994 }
995
b.liudbc3f4b2024-06-25 18:22:24 +0800996 if(mode & GNSS_SET_MSGCFG_GSV)
997 {
b.liud0ba7152024-06-19 14:47:21 +0800998 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x04, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800999 if(gnss_set_result != GNSS_ERR_OK)
1000 {
b.liud0ba7152024-06-19 14:47:21 +08001001 goto set_fail;
1002 }
1003 }
1004
b.liudbc3f4b2024-06-25 18:22:24 +08001005 if(mode & GNSS_SET_MSGCFG_GLL)
1006 {
b.liud0ba7152024-06-19 14:47:21 +08001007 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x01, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001008 if(gnss_set_result != GNSS_ERR_OK)
1009 {
b.liud0ba7152024-06-19 14:47:21 +08001010 goto set_fail;
1011 }
1012 }
1013
b.liudbc3f4b2024-06-25 18:22:24 +08001014 if(mode & GNSS_SET_MSGCFG_ZDA)
1015 {
b.liud0ba7152024-06-19 14:47:21 +08001016 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x07, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001017 if(gnss_set_result != GNSS_ERR_OK)
1018 {
b.liud0ba7152024-06-19 14:47:21 +08001019 goto set_fail;
1020 }
1021 }
1022
b.liudbc3f4b2024-06-25 18:22:24 +08001023 if(mode & GNSS_SET_MSGCFG_GST)
1024 {
b.liud0ba7152024-06-19 14:47:21 +08001025 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x08, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001026 if(gnss_set_result != GNSS_ERR_OK)
1027 {
b.liud0ba7152024-06-19 14:47:21 +08001028 goto set_fail;
1029 }
1030 }
1031
b.liudbc3f4b2024-06-25 18:22:24 +08001032 if(mode & GNSS_SET_MSGCFG_TXT)
1033 {
b.liud0ba7152024-06-19 14:47:21 +08001034 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x20, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001035 if(gnss_set_result != GNSS_ERR_OK)
1036 {
b.liud0ba7152024-06-19 14:47:21 +08001037 goto set_fail;
1038 }
1039 }
b.liudbc3f4b2024-06-25 18:22:24 +08001040 }
1041 else
1042 {
b.liud0ba7152024-06-19 14:47:21 +08001043 gnss_set_result = GNSS_ERR_ARG;
1044 goto set_fail;
1045 }
1046
1047 should_wait_rsp = TRUE;
b.liudbc3f4b2024-06-25 18:22:24 +08001048 }
yq.wang9dd771b2024-09-13 23:38:40 -07001049 else if(memcmp(cmd, "$AGPSCFG", 8) == 0) // $AGPSCFG,<host>,<id>,<passwd>
1050 {
1051 char host[GNSS_AGPS_LEN_MAX] = {0};
1052 char id[GNSS_AGPS_LEN_MAX] = {0};
1053 char passwd[GNSS_AGPS_LEN_MAX] = {0};
1054 if(3 == sscanf(cmd, "$AGPSCFG,%[^,],%[^,],%s", host, id, passwd))
1055 {
1056 LOGD("agps: %s, %s, %s", host, id, passwd);
1057 memset(agps_info.host, 0x0, GNSS_AGPS_LEN_MAX);
1058 if(memcmp(host, "NULL", 4))
1059 {
1060 memcpy(agps_info.host, host, strlen(host));
1061 }
1062
1063 memset(agps_info.id, 0x0, GNSS_AGPS_LEN_MAX);
1064 if(memcmp(id, "NULL", 4))
1065 {
1066 memcpy(agps_info.id, id, strlen(id));
1067 }
1068
1069 memset(agps_info.passwd, 0x0, GNSS_AGPS_LEN_MAX);
1070 if(memcmp(passwd, "NULL", 4))
1071 {
1072 memcpy(agps_info.passwd, passwd, strlen(passwd));
1073 }
1074 }
1075 else
1076 {
1077 gnss_set_result = GNSS_ERR_ARG;
1078 goto set_fail;
1079 }
1080
1081 should_wait_rsp = FALSE;
1082 }
yq.wang51d17352024-09-23 04:54:46 -07001083 else if(memcmp(cmd, "$VER", 4) == 0) // $VER
b.liudbc3f4b2024-06-25 18:22:24 +08001084 {
yq.wang51d17352024-09-23 04:54:46 -07001085 gnss_set_cmd_rsp = (char *)cmd_rsp;
1086 gnss_cmd_rsp_len = cmd_rsp_len;
1087 gnss_set_result = gnss_8122_ver(fd);
b.liudbc3f4b2024-06-25 18:22:24 +08001088 if(gnss_set_result != GNSS_ERR_OK)
1089 {
b.liud0ba7152024-06-19 14:47:21 +08001090 goto set_fail;
1091 }
yq.wang51d17352024-09-23 04:54:46 -07001092 }
1093 else if(memcmp(cmd, "$MINEL", 6) == 0) // $MINEL,<elev>
1094 {
1095 uint32 elev = 0;
1096 elev = (uint32)atoi(cmd + 7);
1097 LOGD("set minel: %d", elev);
1098 if(GNSS_SET_EVEL_5 == elev)
1099 {
1100 uint8 elev_buff[8] = {0x35, 0xFA, 0x8E, 0x3C, 0xC2, 0xB8, 0xB2, 0x3D};
1101 gnss_set_result = gnss_8122_minel(fd, elev_buff);
1102 if(gnss_set_result != GNSS_ERR_OK)
1103 {
1104 goto set_fail;
1105 }
1106 }
1107 else if(GNSS_SET_EVEL_15 == elev)
1108 {
1109 uint8 elev_buff[8] = {0x35, 0xFA, 0x8E, 0x3C, 0x92, 0x0A, 0x86, 0x3E};
1110 gnss_set_result = gnss_8122_minel(fd, elev_buff);
1111 if(gnss_set_result != GNSS_ERR_OK)
1112 {
1113 goto set_fail;
1114 }
1115 }
1116 else
1117 {
1118 gnss_set_result = GNSS_ERR_ARG;
1119 goto set_fail;
1120 }
1121 }
1122 else if(memcmp(cmd, "$PZ90CONV", 9) == 0) // $PZ90CONV,local,ref
1123 {
1124 int local = 0;
1125 int ref = 0;
1126 uint8 buff[44] = {0x00, 0x00, 0x00, 0x00, 0xA6, 0x54, 0x58, 0x41,
1127 0xCD, 0x8C, 0x8F, 0xCC, 0x56, 0x77, 0x6B, 0x3F,
1128 0x8F, 0xC2, 0xF5, 0xBC, 0x0A, 0xD7, 0x23, 0xBC,
1129 0x00, 0x00, 0x00, 0x00, 0x30, 0x62, 0x9F, 0x37,
1130 0x28, 0x29, 0x30, 0xB8, 0xBD, 0x37, 0x06, 0x36,
1131 0x00, 0x00, 0x00, 0x00};
b.liu9e8584b2024-11-06 19:21:28 +08001132
yq.wang51d17352024-09-23 04:54:46 -07001133 if(2 == sscanf(cmd, "$PZ90CONV,%d,%d", &local, &ref))
1134 {
1135 LOGD("set pz90conv: %d, %d", local, ref);
1136
b.liu9e8584b2024-11-06 19:21:28 +08001137
yq.wang51d17352024-09-23 04:54:46 -07001138 if(local == 1 && ref == 0) //PZ90
1139 {
1140 //
1141 }
1142 else if(local == 0 && ref == 0)
1143 {
1144 memset(buff, 0x00, 44);
1145 }
1146 else
1147 {
1148 gnss_set_result = GNSS_ERR_UNSUPPORT;
1149 goto set_fail;
1150 }
1151 }
1152 else
1153 {
1154 gnss_set_result = GNSS_ERR_ARG;
1155 goto set_fail;
1156 }
1157
1158 gnss_set_result = gnss_8122_PZ90CONV(fd, buff);
1159 if(gnss_set_result != GNSS_ERR_OK)
1160 {
1161 goto set_fail;
1162 }
b.liudbc3f4b2024-06-25 18:22:24 +08001163 }
1164 else if(memcmp(cmd, "$NMEACFG", 8) == 0) // $NMEACFG,<ver>
1165 {
b.liud0ba7152024-06-19 14:47:21 +08001166#if 0
1167 gnss_memaver_type_enum version = (gnss_memaver_type_enum)atoi(cmd + 9);
b.liudbc3f4b2024-06-25 18:22:24 +08001168 if(version == GNSS_MEMAVER_TYPE_3_0)
1169 {
b.liud0ba7152024-06-19 14:47:21 +08001170 gnss_set_result = gnss_8122_nmeaver(fd, 1);
b.liudbc3f4b2024-06-25 18:22:24 +08001171 }
1172 else if(version == GNSS_MEMAVER_TYPE_4_0)
1173 {
b.liud0ba7152024-06-19 14:47:21 +08001174 gnss_set_result = gnss_8122_nmeaver(fd, 2);
b.liudbc3f4b2024-06-25 18:22:24 +08001175 }
1176 else if(version == GNSS_MEMAVER_TYPE_4_1)
1177 {
b.liud0ba7152024-06-19 14:47:21 +08001178 gnss_set_result = gnss_8122_nmeaver(fd, 3);
b.liudbc3f4b2024-06-25 18:22:24 +08001179 }
1180 else
1181 {
b.liud0ba7152024-06-19 14:47:21 +08001182 gnss_set_result = GNSS_ERR_ARG;
1183 goto set_fail;
1184 }
b.liudbc3f4b2024-06-25 18:22:24 +08001185 if(gnss_set_result != GNSS_ERR_OK)
1186 {
b.liud0ba7152024-06-19 14:47:21 +08001187 goto set_fail;
1188 }
1189 should_wait_rsp = FALSE;
1190#else
1191 gnss_set_result = GNSS_ERR_UNSUPPORT;
1192 goto set_fail;
1193#endif
b.liu5f950c52024-06-15 20:13:12 +08001194 }
1195 else
1196 {
1197 LOGW("Unknown cmd:%s", cmd);
1198 gnss_set_result = GNSS_ERR_UNSUPPORT;
1199 goto set_fail;
1200 }
1201
b.liu9e8584b2024-11-06 19:21:28 +08001202// set_success:
b.liudbc3f4b2024-06-25 18:22:24 +08001203 if(should_wait_rsp)
1204 {
b.liud0ba7152024-06-19 14:47:21 +08001205 setting_waitting = TRUE;
b.liu5f950c52024-06-15 20:13:12 +08001206 pthread_mutex_lock(&read_mutex);
1207 pthread_cond_wait(&read_cond, &read_mutex);
1208 pthread_mutex_unlock(&read_mutex);
b.liudbc3f4b2024-06-25 18:22:24 +08001209 }
1210 else
1211 {
b.liu5f950c52024-06-15 20:13:12 +08001212 mbtk_timer_clear();
1213 }
1214
yq.wang51d17352024-09-23 04:54:46 -07001215 if(gnss_set_cmd_rsp != NULL)
1216 {
1217 gnss_set_cmd_rsp = NULL;
1218 gnss_cmd_rsp_len = 0;
1219 }
b.liu5f950c52024-06-15 20:13:12 +08001220 setting_busy = FALSE;
1221 return gnss_set_result;
b.liudbc3f4b2024-06-25 18:22:24 +08001222 set_fail:
yq.wang51d17352024-09-23 04:54:46 -07001223 if(gnss_set_cmd_rsp != NULL)
1224 {
1225 gnss_set_cmd_rsp = NULL;
1226 gnss_cmd_rsp_len = 0;
1227 }
b.liu5f950c52024-06-15 20:13:12 +08001228 setting_busy = FALSE;
1229 mbtk_timer_clear();
1230 return gnss_set_result;
1231 }
b.liuf9fbfa12024-06-14 15:53:59 +08001232}
1233
b.liu5f950c52024-06-15 20:13:12 +08001234