blob: ea1ced848cd8753e208defb0dbd985f763012786 [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];
rx.xiecf3a3782025-08-08 05:07:12 -070064//static 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);
rx.xiecf3a3782025-08-08 05:07:12 -070073int fw_update_boot_8122(int uart_fd, uint8_t *data, uint32_t len);
74
b.liu5f950c52024-06-15 20:13:12 +080075
b.liudbc3f4b2024-06-25 18:22:24 +080076static uint16 fletcher16(const uint8_t* data, int data_len)
77{
b.liud0ba7152024-06-19 14:47:21 +080078 uint32_t sum1 = 0;
79 uint32_t sum2 = 0;
b.liu5f950c52024-06-15 20:13:12 +080080 int index;
81
b.liudbc3f4b2024-06-25 18:22:24 +080082 for (index = 0; index < data_len; ++index )
83 {
b.liud0ba7152024-06-19 14:47:21 +080084 sum1 += data[index];
85 sum2 += sum1;
b.liu5f950c52024-06-15 20:13:12 +080086 }
87
b.liud0ba7152024-06-19 14:47:21 +080088 return ((0xFF & sum2) << 8) | (0xFF & sum1);
b.liu5f950c52024-06-15 20:13:12 +080089}
90
91static void gnss_set_timer_cb(int signo)
92{
b.liudbc3f4b2024-06-25 18:22:24 +080093 if(setting_busy)
94 {
b.liu5f950c52024-06-15 20:13:12 +080095 pthread_mutex_lock(&read_mutex);
96 pthread_cond_signal(&read_cond);
97 pthread_mutex_unlock(&read_mutex);
98 gnss_set_result = GNSS_ERR_TIMEOUT;
99 }
100 return;
101}
102
b.liud0ba7152024-06-19 14:47:21 +0800103static void msg_init()
104{
b.liu778645e2024-06-21 16:47:42 +0800105 unsigned int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800106 while(i < ARRAY_SIZE(msg_array))
107 {
b.liud0ba7152024-06-19 14:47:21 +0800108 msg_array[i].enable = FALSE;
109 i++;
110 }
111}
112
b.liud0ba7152024-06-19 14:47:21 +0800113static int msg_insert(uint8 gid, uint8 sid)
114{
b.liu778645e2024-06-21 16:47:42 +0800115 unsigned int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800116 while(i < ARRAY_SIZE(msg_array))
117 {
b.liud0ba7152024-06-19 14:47:21 +0800118 if(!msg_array[i].enable)
119 break;
120 i++;
121 }
122
b.liudbc3f4b2024-06-25 18:22:24 +0800123 if(i == ARRAY_SIZE(msg_array))
124 {
b.liud0ba7152024-06-19 14:47:21 +0800125 LOGE("Msg full : %d", i);
126 return -1;
b.liudbc3f4b2024-06-25 18:22:24 +0800127 }
128 else
129 {
b.liud0ba7152024-06-19 14:47:21 +0800130 msg_array[i].enable = TRUE;
131 msg_array[i].gid = gid;
132 msg_array[i].sid = sid;
133 return 0;
134 }
135}
136
137static int msg_find(uint8 gid, uint8 sid)
138{
b.liu778645e2024-06-21 16:47:42 +0800139 unsigned int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800140 while(i < ARRAY_SIZE(msg_array))
141 {
b.liud0ba7152024-06-19 14:47:21 +0800142 if(msg_array[i].enable && gid == msg_array[i].gid && sid == msg_array[i].sid)
143 break;
144 i++;
145 }
146
b.liudbc3f4b2024-06-25 18:22:24 +0800147 if(i == ARRAY_SIZE(msg_array))
148 {
b.liud0ba7152024-06-19 14:47:21 +0800149 LOGE("No found %d - %d", gid, sid);
150 return -1;
b.liudbc3f4b2024-06-25 18:22:24 +0800151 }
152 else
153 {
b.liud0ba7152024-06-19 14:47:21 +0800154 return i;
155 }
156}
157
b.liu9e8584b2024-11-06 19:21:28 +0800158#if 0
b.liud0ba7152024-06-19 14:47:21 +0800159static int msg_remove(uint8 gid, uint8 sid)
160{
161 int i = msg_find(gid, sid);
b.liudbc3f4b2024-06-25 18:22:24 +0800162 if(i >= 0)
163 {
b.liud0ba7152024-06-19 14:47:21 +0800164 msg_array[i].enable = FALSE;
165 msg_array[i].gid = 0;
166 msg_array[i].sid = 0;
167 return 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800168 }
169 else
170 {
b.liud0ba7152024-06-19 14:47:21 +0800171 return -1;
172 }
173}
b.liu9e8584b2024-11-06 19:21:28 +0800174#endif
b.liud0ba7152024-06-19 14:47:21 +0800175
176static int msg_count()
177{
b.liu778645e2024-06-21 16:47:42 +0800178 unsigned int i = 0;
b.liud0ba7152024-06-19 14:47:21 +0800179 int count = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800180 while(i < ARRAY_SIZE(msg_array))
181 {
b.liud0ba7152024-06-19 14:47:21 +0800182 if(msg_array[i].enable)
183 count++;
184 i++;
185 }
186 return count;
187}
b.liu5f950c52024-06-15 20:13:12 +0800188
yq.wangaf363dc2024-08-06 20:16:00 -0700189
b.liudbc3f4b2024-06-25 18:22:24 +0800190static uint32_t read_bin_file(uint8_t *path, uint8_t *buff)
191{
192 int fp = -1;
193 int ret = 0;
194 int i = 0;
195 int size = 0;
196
197 if (NULL == path || NULL == buff)
198 {
199 LOGE("ARG error");
200 return 0;
201 }
202
203 fp = open((char *)path, O_RDONLY);
204 if(fp < 0)
205 {
206 LOGE( "open file failed ! errno is %d", errno);
207 return 0;
208 }
209
210 size = lseek(fp, 0x00, SEEK_END);
211 if(size <= 0)
212 {
213 LOGE( "file is empty.");
214 return 0;
215 }
216
217 LOGD( "file size is:%d", size);
218 lseek(fp, 0x00, SEEK_SET);
219 while(1)
220 {
221 ret = read(fp, buff, READ_LEN_MAX);
222 i += ret;
223 if(ret == READ_LEN_MAX)
224 {
225 buff += READ_LEN_MAX;
226 }
227 else
228 {
229 break;
230 }
231 }
232
233 LOGD("file size is:%d,i:%d", size, i);
234 close(fp);
235 if(size != i)
236 {
237 return 0;
238 }
239 return size;
240}
241
242
b.liu5f950c52024-06-15 20:13:12 +0800243static int pack_create(hd8122_id_type_enum id_type, uint8 id, uint16 data_len, const uint8 *data, uint8 *pack, int pack_len)
244{
b.liudbc3f4b2024-06-25 18:22:24 +0800245 if(pack == NULL || pack_len < HD8122_PACK_LEN_MIN)
246 {
b.liu5f950c52024-06-15 20:13:12 +0800247 return -1;
248 }
249 memset(pack, 0, pack_len);
250 uint8 *data_ptr = pack;
251 data_ptr += uint16_2_byte(HD8122_PACK_HEAD, data_ptr, false);
252 *data_ptr++ = (uint8)id_type;
253 *data_ptr++ = id;
254 data_ptr += uint16_2_byte(data_len, data_ptr, false);
b.liudbc3f4b2024-06-25 18:22:24 +0800255 if(data_len > 0)
256 {
b.liu5f950c52024-06-15 20:13:12 +0800257 memcpy(data_ptr, data, data_len);
258 data_ptr += data_len;
259 }
260 data_ptr += uint16_2_byte(fletcher16(pack + 2, 4 + data_len), data_ptr, false);
261 return (data_ptr - pack);
262}
263
b.liud0ba7152024-06-19 14:47:21 +0800264// f1 d9 05 01 02 00 06 01 0f 38
265// or
266// f1 d9 05 00 02 00 06 01 0f 38
267static int msg_array_change(const uint8 *pack, int pack_len, hd8122_id_ack_enum *ack_nak)
268{
yq.wang51d17352024-09-23 04:54:46 -0700269 if(pack_len == 0)
270 {
271 LOGE("pack_len(%d) error.", pack_len);
272 return -1;
273 }
274
275 //info result
276 if(gnss_set_cmd_rsp != NULL)
277 {
278 if(pack_len > 4 && pack[2] == 0x0a && pack[3] == 0x04) //VER INFO
279 {
280 char sw_ver[32] = {0};
281 char hw_ver[32] = {0};
282 memcpy(sw_ver, pack + 6, 16);
283 memcpy(hw_ver, pack + 22, 16);
284 snprintf(gnss_set_cmd_rsp, gnss_cmd_rsp_len, "%s,%s", sw_ver, hw_ver);
285 LOGE("fw ver:%s", gnss_set_cmd_rsp);
286 int index = msg_find(pack[2], pack[3]);
287 if(index >= 0)
288 {
289 msg_array[index].enable = FALSE;
290 }
291 else
292 {
293 LOGE("Unknown gid - %d, sid - %d", pack[2], pack[3]);
294 return -1;
295 }
296 return 0;
297 }
298 }
299
300 //set result
301 if(pack_len % 10)
b.liudbc3f4b2024-06-25 18:22:24 +0800302 {
b.liud0ba7152024-06-19 14:47:21 +0800303 LOGE("pack_len(%d) error.", pack_len);
304 return -1;
305 }
306 int count = pack_len / 10;
307 int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800308 while(i < count)
309 {
b.liu778645e2024-06-21 16:47:42 +0800310 const uint8 *ptr = pack + i * 10;
b.liudbc3f4b2024-06-25 18:22:24 +0800311 if(ptr[0] != 0xf1 || ptr[1] != 0xd9)
312 {
b.liud0ba7152024-06-19 14:47:21 +0800313 LOGE("Pack head error : %02x %02x", ptr[0], ptr[1]);
314 return -1;
315 }
316
b.liudbc3f4b2024-06-25 18:22:24 +0800317 if(ptr[2] != 0x05)
318 {
b.liud0ba7152024-06-19 14:47:21 +0800319 LOGE("Type not 0x05 : %02x", ptr[2]);
320 return -1;
321 }
322
323 int index = msg_find(ptr[6], ptr[7]);
b.liudbc3f4b2024-06-25 18:22:24 +0800324 if(index >= 0)
325 {
326 if(ptr[3] == 0x01)
327 {
b.liud0ba7152024-06-19 14:47:21 +0800328 msg_array[index].ack_nak = HD8122_ID_ACK_ACK;
b.liudbc3f4b2024-06-25 18:22:24 +0800329 }
330 else if(ptr[3] == 0x00)
331 {
b.liud0ba7152024-06-19 14:47:21 +0800332 msg_array[index].ack_nak = HD8122_ID_ACK_NAK;
333
334 // There is a nak as a failure.
335 *ack_nak = HD8122_ID_ACK_NAK;
b.liudbc3f4b2024-06-25 18:22:24 +0800336 }
337 else
338 {
b.liud0ba7152024-06-19 14:47:21 +0800339 LOGE("ID not 0x00 or 0x01 : %02x", ptr[3]);
340 return -1;
341 }
342
343 msg_array[index].enable = FALSE;
b.liudbc3f4b2024-06-25 18:22:24 +0800344 }
345 else
346 {
b.liud0ba7152024-06-19 14:47:21 +0800347 LOGE("Unknown gid - %d, sid - %d", ptr[6], ptr[7]);
348 return -1;
349 }
350 i++;
351 }
352
353 return 0;
354}
355
b.liudbc3f4b2024-06-25 18:22:24 +0800356static void gnss_cmd_rsp_process(const void *data, int data_len)
357{
b.liu9e8584b2024-11-06 19:21:28 +0800358// const char *ptr = (const char*)data;
b.liu5f950c52024-06-15 20:13:12 +0800359 log_hex("RSP", data, data_len);
b.liu5f950c52024-06-15 20:13:12 +0800360
b.liud0ba7152024-06-19 14:47:21 +0800361 hd8122_id_ack_enum ack_nak = HD8122_ID_ACK_ACK;
b.liudbc3f4b2024-06-25 18:22:24 +0800362 if(!msg_array_change((const uint8*)data, data_len, &ack_nak))
363 {
b.liud0ba7152024-06-19 14:47:21 +0800364 if(setting_waitting && msg_count() == 0)
365 {
b.liudbc3f4b2024-06-25 18:22:24 +0800366 if(ack_nak == HD8122_ID_ACK_ACK)
367 {
b.liud0ba7152024-06-19 14:47:21 +0800368 gnss_set_result = GNSS_ERR_OK;
b.liudbc3f4b2024-06-25 18:22:24 +0800369 }
370 else
371 {
b.liud0ba7152024-06-19 14:47:21 +0800372 gnss_set_result = GNSS_ERR_UNKNOWN;
373 }
374
375 mbtk_timer_clear();
376
377 pthread_mutex_lock(&read_mutex);
378 pthread_cond_signal(&read_cond);
379 pthread_mutex_unlock(&read_mutex);
380 setting_waitting = FALSE;
381 }
b.liu9e8584b2024-11-06 19:21:28 +0800382
b.liudbc3f4b2024-06-25 18:22:24 +0800383 }
384 else
385 {
b.liud0ba7152024-06-19 14:47:21 +0800386 LOGW("Unknown rsp data.");
b.liu5f950c52024-06-15 20:13:12 +0800387 }
388}
389
b.liud0ba7152024-06-19 14:47:21 +0800390static gnss_err_enum gnss_8122_reset(int fd, uint8 reset)
b.liu5f950c52024-06-15 20:13:12 +0800391{
392 uint8 buff[GNSS_PACK_BUFF_SIZE];
393 LOGD("RESET");
394 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 +0800395 if(len <= 0)
396 {
b.liu5f950c52024-06-15 20:13:12 +0800397 LOGE("pack_create() fail.");
398 return GNSS_ERR_ARG;
399 }
400 log_hex("PACK", buff, len);
401 gnss_write(fd, buff, len);
402 return GNSS_ERR_OK;
403}
b.liuf9fbfa12024-06-14 15:53:59 +0800404
b.liud0ba7152024-06-19 14:47:21 +0800405static gnss_err_enum gnss_8122_syscfg(int fd, uint32 mode)
406{
407 uint8 buff[GNSS_PACK_BUFF_SIZE];
408 LOGD("SYSCFG");
409 //uint8 mode_str[4];
410 //uint32_2_byte(mode, mode_str, TRUE);
411 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 +0800412 if(len <= 0)
413 {
b.liud0ba7152024-06-19 14:47:21 +0800414 LOGE("pack_create() fail.");
415 return GNSS_ERR_ARG;
416 }
417 log_hex("PACK", buff, len);
418 gnss_write(fd, buff, len);
419 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_NAVSAT);
420 return GNSS_ERR_OK;
421}
422
yq.wang6a3437f2024-07-27 02:57:20 -0700423static gnss_err_enum gnss_8122_freqcfg(int fd, uint8 mode)
424{
425 uint8 buff[GNSS_PACK_BUFF_SIZE];
426 LOGD("FREQCFG");
427 uint8 data[20];
428 memset(data, 0x00, 20);
429 data[1] = mode;
430 data[2] = 0x66;
431 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_PWRCTL, 20, data, buff, sizeof(buff));
432 if(len <= 0)
433 {
434 LOGE("pack_create() fail.");
435 return GNSS_ERR_ARG;
436 }
437 log_hex("PACK", buff, len);
438 gnss_write(fd, buff, len);
439 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_PWRCTL);
440 return GNSS_ERR_OK;
441}
442
yq.wang012b6522024-09-12 02:36:53 -0700443static gnss_err_enum gnss_8122_cfg_save(int fd)
444{
445 uint8 buff[GNSS_PACK_BUFF_SIZE];
446 LOGD("CFG SAVE");
447 uint8 data[8];
448 memset(data, 0x00, 8);
449 data[4] = 0x0f;
450 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_CFG, 8, data, buff, sizeof(buff));
451 if(len <= 0)
452 {
453 LOGE("pack_create() fail.");
454 return GNSS_ERR_ARG;
455 }
456 log_hex("PACK", buff, len);
457 gnss_write(fd, buff, len);
458 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_CFG);
459 return GNSS_ERR_OK;
460}
461
b.liud0ba7152024-06-19 14:47:21 +0800462static gnss_err_enum gnss_8122_msgcfg(int fd, uint8 type, uint8 id, uint8 period)
463{
464 uint8 buff[GNSS_PACK_BUFF_SIZE];
465 LOGD("MSGCFG");
466 uint8 data[3];
467 data[0] = type;
468 data[1] = id;
469 data[2] = period;
470 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_MSG, 3, data, buff, sizeof(buff));
b.liudbc3f4b2024-06-25 18:22:24 +0800471 if(len <= 0)
472 {
b.liud0ba7152024-06-19 14:47:21 +0800473 LOGE("pack_create() fail.");
474 return GNSS_ERR_ARG;
475 }
476 log_hex("PACK", buff, len);
477 gnss_write(fd, buff, len);
478 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_MSG);
479 return GNSS_ERR_OK;
480}
481
yq.wang51d17352024-09-23 04:54:46 -0700482static gnss_err_enum gnss_8122_ver(int fd)
b.liud0ba7152024-06-19 14:47:21 +0800483{
484 uint8 buff[GNSS_PACK_BUFF_SIZE];
yq.wang51d17352024-09-23 04:54:46 -0700485 LOGD("VER");
486 int len = pack_create(HD8122_ID_TYPE_MON, HD8122_ID_MON_VER, 0, NULL, buff, sizeof(buff));
b.liudbc3f4b2024-06-25 18:22:24 +0800487 if(len <= 0)
488 {
b.liud0ba7152024-06-19 14:47:21 +0800489 LOGE("pack_create() fail.");
490 return GNSS_ERR_ARG;
491 }
492 log_hex("PACK", buff, len);
493 gnss_write(fd, buff, len);
yq.wang51d17352024-09-23 04:54:46 -0700494 msg_insert(HD8122_ID_TYPE_MON, HD8122_ID_MON_VER);
b.liud0ba7152024-06-19 14:47:21 +0800495 return GNSS_ERR_OK;
496}
497
yq.wang51d17352024-09-23 04:54:46 -0700498
499static gnss_err_enum gnss_8122_minel(int fd, uint8 *elev)
500{
501 uint8 buff[GNSS_PACK_BUFF_SIZE];
502 LOGD("ELEV");
503 //uint8 elev_buff[4];
504 //uint32_2_byte((uint32)elev, elev_buff, TRUE);
505 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_ELEV, 8, elev, buff, sizeof(buff));
506 if(len <= 0)
507 {
508 LOGE("pack_create() fail.");
509 return GNSS_ERR_ARG;
510 }
511 log_hex("PACK", buff, len);
512 gnss_write(fd, buff, len);
513 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_ELEV);
514 return GNSS_ERR_OK;
515}
516
517static gnss_err_enum gnss_8122_PZ90CONV(int fd, uint8 *coord)
518{
519 uint8 buff[GNSS_PACK_BUFF_SIZE];
520 LOGD("PZ90CONV");
521 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_COORD, 44, coord, buff, sizeof(buff));
522 if(len <= 0)
523 {
524 LOGE("pack_create() fail.");
525 return GNSS_ERR_ARG;
526 }
527 log_hex("PACK", buff, len);
528 gnss_write(fd, buff, len);
529 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_COORD);
530 return GNSS_ERR_OK;
531}
532
b.liu9e8584b2024-11-06 19:21:28 +0800533#if 0
b.liud0ba7152024-06-19 14:47:21 +0800534static gnss_err_enum gnss_8122_nmeaver(int fd, uint8 ver)
535{
536 uint8 buff[GNSS_PACK_BUFF_SIZE];
537 LOGD("NMEA-VER");
538 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 +0800539 if(len <= 0)
540 {
b.liud0ba7152024-06-19 14:47:21 +0800541 LOGE("pack_create() fail.");
542 return GNSS_ERR_ARG;
543 }
544 log_hex("PACK", buff, len);
545 gnss_write(fd, buff, len);
546 return GNSS_ERR_OK;
547}
b.liu9e8584b2024-11-06 19:21:28 +0800548#endif
b.liud0ba7152024-06-19 14:47:21 +0800549
yq.wang36222352024-11-06 03:31:24 -0800550static gnss_err_enum gnss_8122_ephsave(int fd, uint8 status)
551{
552 uint8 buff[GNSS_PACK_BUFF_SIZE];
553 LOGD("EPHSAVE");
554 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_EPHSAVE, 1, (uint8*)(&status), buff, sizeof(buff));
555 if(len <= 0)
556 {
557 LOGE("pack_create() fail.");
558 return GNSS_ERR_ARG;
559 }
560 log_hex("PACK", buff, len);
561 gnss_write(fd, buff, len);
562 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_EPHSAVE);
563 return GNSS_ERR_OK;
564}
565
566
b.liuf9fbfa12024-06-14 15:53:59 +0800567int gnss_8122_dev_open()
568{
yq.wang5fe6e612024-07-17 01:18:12 -0700569 //return mbtk_gpio_value_set(GNSS_POWER_GPIO, MBTK_GPIO_DIRECT_OUT, 1);
b.liu9e8584b2024-11-06 19:21:28 +0800570 mbtk_system("i2cset -y -f 2 0x31 0x15 0x86");
yq.wang5fe6e612024-07-17 01:18:12 -0700571 return 0;
b.liuf9fbfa12024-06-14 15:53:59 +0800572}
573
b.liu978f5432024-07-01 18:04:18 +0800574int gnss_8122_dev_close(int fd)
b.liuf9fbfa12024-06-14 15:53:59 +0800575{
yq.wang5fe6e612024-07-17 01:18:12 -0700576 //return mbtk_gpio_value_set(GNSS_POWER_GPIO, MBTK_GPIO_DIRECT_OUT, 0);
b.liu9e8584b2024-11-06 19:21:28 +0800577 mbtk_system("i2cset -y -f 2 0x31 0x15 0x00");
yq.wang5fe6e612024-07-17 01:18:12 -0700578 return 0;
b.liuf9fbfa12024-06-14 15:53:59 +0800579}
580
581int gnss_8122_open(const char *dev)
582{
583 pthread_mutex_init(&read_mutex, NULL);
584 pthread_cond_init(&read_cond, NULL);
585 return gnss_port_open(dev, O_RDWR | O_NONBLOCK | O_NOCTTY, UART_BITRATE_NMEA_DEF_FW, TRUE);
586}
587
588int gnss_8122_close(int fd)
589{
590 pthread_mutex_destroy(&read_mutex);
591 pthread_cond_destroy(&read_cond);
592 return gnss_port_close(fd);
593}
594
yq.wang36222352024-11-06 03:31:24 -0800595int gnss_8122_init_set(int fd)
596{
597 sleep(1); //wait 8122 ready...
598 gnss_8122_ephsave(fd, (uint8)HD8122_EPHSAVE_STATUS_DISABLE);
599 gnss_8122_cfg_save(fd);
600 return GNSS_ERR_OK;
601}
602
b.liudbc3f4b2024-06-25 18:22:24 +0800603int gnss_8122_fw_dl(int fd, const char *fw_name, const char *dev)
b.liuf9fbfa12024-06-14 15:53:59 +0800604{
rx.xiecf3a3782025-08-08 05:07:12 -0700605 //PORT_NAME234
606 int uart_fd = open(dev , O_RDWR|O_NOCTTY);
b.liudbc3f4b2024-06-25 18:22:24 +0800607 if (uart_fd < 0)
608 {
609 LOGE("open uart failed %d[%d]", uart_fd, errno);
610 return GNSS_ERR_OPEN_DEV;
611 }
612
yq.wangaf363dc2024-08-06 20:16:00 -0700613 uint8_t fw_path[256] = {0};
614 memset(fw_path, 0x0, 256);
615 if(memcmp(fw_name, "gp_gl_ga", 8) == 0)
616 {
617 memcpy(fw_path, GNSS_FW_GQALS_PATH, strlen(GNSS_FW_GQALS_PATH));
618 }
619 else if(memcmp(fw_name, "gp_bd_ga", 8) == 0)
620 {
621 memcpy(fw_path, GNSS_FW_GAQBS_PATH, strlen(GNSS_FW_GAQBS_PATH));
622 }
rx.xiecf3a3782025-08-08 05:07:12 -0700623 else if(fw_name != NULL)
624 {
625 memcpy(fw_path, fw_name, strlen(fw_name));
626 LOGE("fw_path: %s",fw_path);
627 }
628
629
yq.wangaf363dc2024-08-06 20:16:00 -0700630 else
631 {
632 LOGE("fw dl param error");
633 return GNSS_ERR_ARG;
634 }
635
b.liudbc3f4b2024-06-25 18:22:24 +0800636 uint8_t *g_bin_buff = (uint8_t*)malloc(500*1024);
637 if(g_bin_buff == NULL) {
638 LOGE("malloc() fail : %d", errno);
639 return GNSS_ERR_UNKNOWN;
640 }
641 memset(g_bin_buff, 0, 500*1024);
yq.wangaf363dc2024-08-06 20:16:00 -0700642 uint32_t len = read_bin_file(fw_path, g_bin_buff);
b.liudbc3f4b2024-06-25 18:22:24 +0800643 if (len <= 0)
644 {
645 LOGE("Read file failed ,len = %d", len);
yq.wangaf363dc2024-08-06 20:16:00 -0700646 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800647 }
rx.xiecf3a3782025-08-08 05:07:12 -0700648
649 int ret;
650 // branch1:gp_gl_ga & gp_bd_ga
651 if (memcmp(fw_name, "gp_gl_ga", 8) == 0 || memcmp(fw_name, "gp_bd_ga", 8) == 0) {
652 if(gnss_8122_dev_open())
653 {
654 LOGE("open gnss device fail:%d", errno);
655 goto error;
656 }
657
658 mbtk_system("echo 63 > /sys/class/gpio/export");
659 mbtk_system("echo 62 > /sys/class/gpio/export");
660 mbtk_system("echo out > /sys/class/gpio/gpio63/direction");
661 mbtk_system("echo out > /sys/class/gpio/gpio62/direction");
662 mbtk_system("echo 0 > /sys/class/gpio/gpio63/value");
663 usleep(100000);//100ms
664 mbtk_system("echo 1 > /sys/class/gpio/gpio62/value");//reset
665 usleep(1000000);//1s
666 mbtk_system("echo 0 > /sys/class/gpio/gpio62/value");
667 usleep(100000);//100ms
668 mbtk_system("echo 1 > /sys/class/gpio/gpio63/value");//boot
669 mbtk_system("echo 62 > /sys/class/gpio/unexport");
670 mbtk_system("echo 63 > /sys/class/gpio/unexport");
671
672
673 ret = fw_update_boot_8122(uart_fd, g_bin_buff, len);
674 if (ret < 0)
675 {
676 LOGE("fw_update_boot() fail : %d", ret);
677 goto error;
678 }
679
680 if(gnss_8122_dev_close(0))
681 {
682 LOGE("close gnss device fail:%d", errno);
683 goto error;
684 }
685
686 if(ret == HDBD_UPG_SUCESS)
687 {
688 LOGD("upgrade sucess!");
689 }
690 else
691 {
692 LOGD("upgrade FAIL, fail style:%d", ret);
693 goto error;
694 }
695
696 free(g_bin_buff);
697 uart_close(uart_fd);
698 return GNSS_ERR_OK;
699 }
700 // branch2: else
701 else {
702 mbtk_system("echo 0 > /sys/class/gpio/gpio41/value");//41 gnss_power_en
703 usleep(500000);//500ms
704
705 mbtk_system("echo 1 > /sys/class/gpio/gpio120/value");//120 boot
706 usleep(500000);//500ms
707 mbtk_system("echo 1 > /sys/class/gpio/gpio41/value");//41 gnss_power_en
708 usleep(500000);//500ms
709
710
711 ret = fw_update_boot(uart_fd, g_bin_buff, len);
712 if (ret < 0)
713 {
714 LOGE("fw_update_boot() fail : %d", ret);
715 goto error;
716 }
717
718 if(ret == HDBD_UPG_SUCESS)
719 {
720 LOGD("upgrade sucess!");
721 }
722 else
723 {
724 LOGD("upgrade FAIL, fail style:%d", ret);
725 goto error;
726 }
727
728 free(g_bin_buff);
729 uart_close(uart_fd);
730 return GNSS_ERR_OK;
b.liudbc3f4b2024-06-25 18:22:24 +0800731 }
yq.wangaf363dc2024-08-06 20:16:00 -0700732
yq.wangaf363dc2024-08-06 20:16:00 -0700733error:
734 if(g_bin_buff)
735 {
736 free(g_bin_buff);
737 g_bin_buff = NULL;
738 }
739 if(uart_fd > 0)
740 {
741 uart_close(uart_fd);
742 uart_fd = -1;
743 }
744 return GNSS_ERR_DL_FW;
b.liuf9fbfa12024-06-14 15:53:59 +0800745}
746
yq.wang99db6f52024-09-12 01:58:48 -0700747gnss_err_enum gnss_8122_agnss_get_eph(const char *param)
748{
749 if(param == NULL)
750 {
751 LOGD("gnss_8122_agnss_get_eph param is NULL");
752 return GNSS_ERR_ARG;
753 }
754
755 int eph_type = 0;
756 int alam_flag = 0;
757 int ret = -1;
b.liu9e8584b2024-11-06 19:21:28 +0800758 char url[1024] = {0};
yq.wang99db6f52024-09-12 01:58:48 -0700759 if(2 == sscanf(param, "%d,%d", &eph_type, &alam_flag))
760 {
761 if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS)
762 {
b.liu9e8584b2024-11-06 19:21:28 +0800763 snprintf(url, sizeof(url),AGNSS_URL, AGNSS_EPH_GPS);
yq.wang99db6f52024-09-12 01:58:48 -0700764 }
765 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_BDS)
766 {
b.liu9e8584b2024-11-06 19:21:28 +0800767 snprintf(url, sizeof(url),AGNSS_URL, AGNSS_EPH_BDS);
yq.wang99db6f52024-09-12 01:58:48 -0700768 }
769 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GLO)
770 {
b.liu9e8584b2024-11-06 19:21:28 +0800771 snprintf(url, sizeof(url),AGNSS_URL, AGNSS_EPH_GLO);
yq.wang99db6f52024-09-12 01:58:48 -0700772 }
773 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS_BDS)
774 {
b.liu9e8584b2024-11-06 19:21:28 +0800775 snprintf(url, sizeof(url),AGNSS_URL, AGNSS_EPH_GPS_BDS);
yq.wang99db6f52024-09-12 01:58:48 -0700776 }
777 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS_GLO)
778 {
b.liu9e8584b2024-11-06 19:21:28 +0800779 snprintf(url, sizeof(url),AGNSS_URL, AGNSS_EPH_GPS_GLO);
yq.wang99db6f52024-09-12 01:58:48 -0700780 }
yq.wang9dd771b2024-09-13 23:38:40 -0700781 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_CFG)
782 {
b.liu9e8584b2024-11-06 19:21:28 +0800783 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 -0700784 strlen(agps_info.id) > 0 ? agps_info.id : "yikecs1",
785 strlen(agps_info.passwd) > 0 ? agps_info.passwd : "Z38w5urAuawubTxi");
786 }
yq.wang99db6f52024-09-12 01:58:48 -0700787 else
788 {
789 return GNSS_ERR_UNSUPPORT;
790 }
791
792 ret = eph_data_from_http_get(url, AGNSS_EPH_FILE_PATH);
793 if (ret < 0)
794 {
795 LOGD("eph_data_from_http_get fail");
796 return GNSS_ERR_EPH_GET_FAIL;
797 }
798 LOGD("get_eph_data_from_http success");
799 }
800 else
801 {
802 LOGD("param num error");
803 return GNSS_ERR_ARG;
804 }
805 return GNSS_ERR_OK;
806}
807
808
809gnss_err_enum gnss_8122_agnss_inject(int fd)
810{
811 int ret = 0;
812 hd_set_gnss_dev_fd(fd);
813 ret = hd_agnss_inject(AGNSS_EPH_FILE_PATH, 0, 0, 0, 0, NULL);
814 hd_set_gnss_dev_fd(-1);
815 if(ret < 0)
816 {
817 LOGD("hd_agnss_inject fail");
818 return GNSS_ERR_EPH_INJECT_FAIL;
819 }
820 return GNSS_ERR_OK;
821}
822
b.liu5f950c52024-06-15 20:13:12 +0800823void gnss_8122_set_cb(const void *data, int data_len)
824{
b.liu9e8584b2024-11-06 19:21:28 +0800825// const char *buff = (const char*)data;
b.liudbc3f4b2024-06-25 18:22:24 +0800826 if(setting_busy) // Has setting cmd process.
827 {
b.liu5f950c52024-06-15 20:13:12 +0800828 gnss_cmd_rsp_process(data, data_len);
829 }
yq.wang99db6f52024-09-12 01:58:48 -0700830
yq.wang9dd771b2024-09-13 23:38:40 -0700831#if 0
yq.wang99db6f52024-09-12 01:58:48 -0700832 if(hd_get_eph_inject_status() == HD_EPH_INJECT_STATUS_WAIT_RETURN)
833 {
834 log_hex("EPH_RSP", (const char*)data, data_len);
835 int ret = hd_eph_inject_result_check(data, data_len);
836 if(ret < 0)
837 {
838 hd_set_eph_inject_status(HD_EPH_INJECT_STATUS_FAIL);
839 }
840 else
841 {
842 hd_set_eph_inject_status(HD_EPH_INJECT_STATUS_SUCCESS);
yq.wang9dd771b2024-09-13 23:38:40 -0700843 }
yq.wang99db6f52024-09-12 01:58:48 -0700844 }
yq.wang9dd771b2024-09-13 23:38:40 -0700845#endif
b.liu5f950c52024-06-15 20:13:12 +0800846}
b.liuf9fbfa12024-06-14 15:53:59 +0800847
848gnss_err_enum gnss_8122_set(int fd, const char *cmd, void *cmd_rsp, int cmd_rsp_len)
849{
b.liudbc3f4b2024-06-25 18:22:24 +0800850 if(setting_busy)
851 {
b.liu5f950c52024-06-15 20:13:12 +0800852 return GNSS_ERR_SET_BUSY;
b.liudbc3f4b2024-06-25 18:22:24 +0800853 }
854 else
855 {
b.liu5f950c52024-06-15 20:13:12 +0800856 bool should_wait_rsp = TRUE;
857 setting_busy = TRUE;
858 gnss_set_rsp_ptr = cmd_rsp;
859 gnss_set_result = GNSS_ERR_OK;
b.liud0ba7152024-06-19 14:47:21 +0800860 msg_init();
b.liu5f950c52024-06-15 20:13:12 +0800861 mbtk_timer_set(gnss_set_timer_cb, GNSS_SET_TIMEOUT);
862
b.liudbc3f4b2024-06-25 18:22:24 +0800863 if(memcmp(cmd, "$RESET", 6) == 0) // $RESET,<mode>
864 {
b.liud0ba7152024-06-19 14:47:21 +0800865 gnss_reset_type_enum mode = (gnss_reset_type_enum)atoi(cmd + 7);
yq.wang1ddd1fd2024-07-25 23:00:14 -0700866 LOGD("set reset: %d", mode);
b.liudbc3f4b2024-06-25 18:22:24 +0800867 if(mode == GNSS_RESET_TYPE_HOT)
868 {
b.liud0ba7152024-06-19 14:47:21 +0800869 gnss_set_result = gnss_8122_reset(fd, 3);
b.liudbc3f4b2024-06-25 18:22:24 +0800870 }
871 else if(mode == GNSS_RESET_TYPE_WARM)
872 {
b.liud0ba7152024-06-19 14:47:21 +0800873 gnss_set_result = gnss_8122_reset(fd, 2);
b.liudbc3f4b2024-06-25 18:22:24 +0800874 }
875 else if(mode == GNSS_RESET_TYPE_COLD)
876 {
b.liud0ba7152024-06-19 14:47:21 +0800877 gnss_set_result = gnss_8122_reset(fd, 1);
b.liudbc3f4b2024-06-25 18:22:24 +0800878 }
879 else
880 {
b.liud0ba7152024-06-19 14:47:21 +0800881 gnss_set_result = GNSS_ERR_ARG;
882 goto set_fail;
883 }
b.liudbc3f4b2024-06-25 18:22:24 +0800884 if(gnss_set_result != GNSS_ERR_OK)
885 {
b.liu5f950c52024-06-15 20:13:12 +0800886 goto set_fail;
887 }
888 should_wait_rsp = FALSE;
b.liudbc3f4b2024-06-25 18:22:24 +0800889 }
890 else if(memcmp(cmd, "$SYSCFG", 7) == 0) // $SYSCFG,<mode>
891 {
b.liud0ba7152024-06-19 14:47:21 +0800892 uint32 mode = 0;
893 mode = (uint32)atoi(cmd + 8);
894 uint32 new_mode = 0;
yq.wang51d17352024-09-23 04:54:46 -0700895 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 +0800896 {
b.liud0ba7152024-06-19 14:47:21 +0800897 gnss_set_result = GNSS_ERR_ARG;
898 goto set_fail;
899 }
900
b.liudbc3f4b2024-06-25 18:22:24 +0800901 if(mode & GNSS_SET_SYSCFG_GPS) // GPS
902 {
b.liud0ba7152024-06-19 14:47:21 +0800903 new_mode |= 0x00000001;
904 }
b.liudbc3f4b2024-06-25 18:22:24 +0800905 if(mode & GNSS_SET_SYSCFG_BDS) // BDS
906 {
yq.wang51d17352024-09-23 04:54:46 -0700907 new_mode |= 0x00000004;
b.liud0ba7152024-06-19 14:47:21 +0800908 }
b.liudbc3f4b2024-06-25 18:22:24 +0800909 if(mode & GNSS_SET_SYSCFG_GLO) // GLO
910 {
yq.wang51d17352024-09-23 04:54:46 -0700911 new_mode |= 0x00000002;
b.liud0ba7152024-06-19 14:47:21 +0800912 }
b.liudbc3f4b2024-06-25 18:22:24 +0800913 if(mode & GNSS_SET_SYSCFG_GAL) // GAL
914 {
b.liud0ba7152024-06-19 14:47:21 +0800915 new_mode |= 0x00000010;
916 }
yq.wang40c242f2024-11-27 02:43:35 -0800917 if(mode & GNSS_SET_SYSCFG_QZSS) // QZSS
yq.wang51d17352024-09-23 04:54:46 -0700918 {
919 new_mode |= 0x00000020;
920 }
yq.wang40c242f2024-11-27 02:43:35 -0800921 if(mode & GNSS_SET_SYSCFG_SBAS) // SBAS
yq.wang51d17352024-09-23 04:54:46 -0700922 {
923 new_mode |= 0x00000040;
924 }
b.liud0ba7152024-06-19 14:47:21 +0800925
926 gnss_set_result = gnss_8122_syscfg(fd, new_mode);
b.liudbc3f4b2024-06-25 18:22:24 +0800927 if(gnss_set_result != GNSS_ERR_OK)
928 {
b.liud0ba7152024-06-19 14:47:21 +0800929 goto set_fail;
930 }
931 should_wait_rsp = TRUE;
b.liudbc3f4b2024-06-25 18:22:24 +0800932 }
yq.wang6a3437f2024-07-27 02:57:20 -0700933 else if(memcmp(cmd, "$FREQCFG", 8) == 0) //$FREQCFG,<freq>
934 {
935 uint32 freq = 0;
936 freq = (uint32)atoi(cmd + 9);
937 LOGD("set freq: %d", freq);
938 if((GNSS_SET_FREQCFG_1 != freq) && (GNSS_SET_FREQCFG_2 != freq) && (GNSS_SET_FREQCFG_5 != freq))
939 {
940 gnss_set_result = GNSS_ERR_ARG;
941 goto set_fail;
942 }
943 gnss_set_result = gnss_8122_freqcfg(fd, (uint8)freq);
944 if(gnss_set_result != GNSS_ERR_OK)
945 {
946 goto set_fail;
947 }
yq.wang012b6522024-09-12 02:36:53 -0700948
949 gnss_set_result = gnss_8122_cfg_save(fd);
yq.wang6a3437f2024-07-27 02:57:20 -0700950 should_wait_rsp = TRUE;
951 }
b.liudbc3f4b2024-06-25 18:22:24 +0800952 else if(memcmp(cmd, "$MSGCFG", 7) == 0) // $MSGCFG,<mode>,<rate>
953 {
b.liud0ba7152024-06-19 14:47:21 +0800954 uint32 mode;
955 int rate;
b.liudbc3f4b2024-06-25 18:22:24 +0800956 if(2 == sscanf(cmd, "$MSGCFG,%d,%d", &mode, &rate))
957 {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700958 LOGD("set msgcfg: %d, %d", mode, rate);
b.liud0ba7152024-06-19 14:47:21 +0800959 int time = rate / 1000; // s
b.liudbc3f4b2024-06-25 18:22:24 +0800960 if(time < 0)
961 {
b.liud0ba7152024-06-19 14:47:21 +0800962 gnss_set_result = GNSS_ERR_ARG;
963 goto set_fail;
964 }
965
966 if(((GNSS_SET_MSGCFG_RMC | GNSS_SET_MSGCFG_VTG | GNSS_SET_MSGCFG_GGA | GNSS_SET_MSGCFG_GSA
b.liudbc3f4b2024-06-25 18:22:24 +0800967 | GNSS_SET_MSGCFG_GRS | GNSS_SET_MSGCFG_GSV | GNSS_SET_MSGCFG_GLL | GNSS_SET_MSGCFG_ZDA
968 | GNSS_SET_MSGCFG_GST | GNSS_SET_MSGCFG_TXT) & mode) != mode)
969 {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700970 LOGD("msgcfg not support mode");
b.liud0ba7152024-06-19 14:47:21 +0800971 gnss_set_result = GNSS_ERR_ARG;
972 goto set_fail;
973 }
974
b.liudbc3f4b2024-06-25 18:22:24 +0800975 if(mode & GNSS_SET_MSGCFG_RMC)
976 {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700977 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x05, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800978 if(gnss_set_result != GNSS_ERR_OK)
979 {
b.liud0ba7152024-06-19 14:47:21 +0800980 goto set_fail;
981 }
982 }
983
b.liudbc3f4b2024-06-25 18:22:24 +0800984 if(mode & GNSS_SET_MSGCFG_VTG)
985 {
b.liud0ba7152024-06-19 14:47:21 +0800986 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x06, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800987 if(gnss_set_result != GNSS_ERR_OK)
988 {
b.liud0ba7152024-06-19 14:47:21 +0800989 goto set_fail;
990 }
991 }
992
b.liudbc3f4b2024-06-25 18:22:24 +0800993 if(mode & GNSS_SET_MSGCFG_GGA)
994 {
b.liud0ba7152024-06-19 14:47:21 +0800995 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x00, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800996 if(gnss_set_result != GNSS_ERR_OK)
997 {
b.liud0ba7152024-06-19 14:47:21 +0800998 goto set_fail;
999 }
1000 }
1001
b.liudbc3f4b2024-06-25 18:22:24 +08001002 if(mode & GNSS_SET_MSGCFG_GSA)
1003 {
b.liud0ba7152024-06-19 14:47:21 +08001004 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x02, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001005 if(gnss_set_result != GNSS_ERR_OK)
1006 {
b.liud0ba7152024-06-19 14:47:21 +08001007 goto set_fail;
1008 }
1009 }
1010
b.liudbc3f4b2024-06-25 18:22:24 +08001011 if(mode & GNSS_SET_MSGCFG_GRS)
1012 {
b.liud0ba7152024-06-19 14:47:21 +08001013 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x03, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001014 if(gnss_set_result != GNSS_ERR_OK)
1015 {
b.liud0ba7152024-06-19 14:47:21 +08001016 goto set_fail;
1017 }
1018 }
1019
b.liudbc3f4b2024-06-25 18:22:24 +08001020 if(mode & GNSS_SET_MSGCFG_GSV)
1021 {
b.liud0ba7152024-06-19 14:47:21 +08001022 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x04, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001023 if(gnss_set_result != GNSS_ERR_OK)
1024 {
b.liud0ba7152024-06-19 14:47:21 +08001025 goto set_fail;
1026 }
1027 }
1028
b.liudbc3f4b2024-06-25 18:22:24 +08001029 if(mode & GNSS_SET_MSGCFG_GLL)
1030 {
b.liud0ba7152024-06-19 14:47:21 +08001031 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x01, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001032 if(gnss_set_result != GNSS_ERR_OK)
1033 {
b.liud0ba7152024-06-19 14:47:21 +08001034 goto set_fail;
1035 }
1036 }
1037
b.liudbc3f4b2024-06-25 18:22:24 +08001038 if(mode & GNSS_SET_MSGCFG_ZDA)
1039 {
b.liud0ba7152024-06-19 14:47:21 +08001040 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x07, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001041 if(gnss_set_result != GNSS_ERR_OK)
1042 {
b.liud0ba7152024-06-19 14:47:21 +08001043 goto set_fail;
1044 }
1045 }
1046
b.liudbc3f4b2024-06-25 18:22:24 +08001047 if(mode & GNSS_SET_MSGCFG_GST)
1048 {
b.liud0ba7152024-06-19 14:47:21 +08001049 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x08, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001050 if(gnss_set_result != GNSS_ERR_OK)
1051 {
b.liud0ba7152024-06-19 14:47:21 +08001052 goto set_fail;
1053 }
1054 }
1055
b.liudbc3f4b2024-06-25 18:22:24 +08001056 if(mode & GNSS_SET_MSGCFG_TXT)
1057 {
b.liud0ba7152024-06-19 14:47:21 +08001058 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x20, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001059 if(gnss_set_result != GNSS_ERR_OK)
1060 {
b.liud0ba7152024-06-19 14:47:21 +08001061 goto set_fail;
1062 }
1063 }
b.liudbc3f4b2024-06-25 18:22:24 +08001064 }
1065 else
1066 {
b.liud0ba7152024-06-19 14:47:21 +08001067 gnss_set_result = GNSS_ERR_ARG;
1068 goto set_fail;
1069 }
1070
1071 should_wait_rsp = TRUE;
b.liudbc3f4b2024-06-25 18:22:24 +08001072 }
yq.wang9dd771b2024-09-13 23:38:40 -07001073 else if(memcmp(cmd, "$AGPSCFG", 8) == 0) // $AGPSCFG,<host>,<id>,<passwd>
1074 {
1075 char host[GNSS_AGPS_LEN_MAX] = {0};
1076 char id[GNSS_AGPS_LEN_MAX] = {0};
1077 char passwd[GNSS_AGPS_LEN_MAX] = {0};
1078 if(3 == sscanf(cmd, "$AGPSCFG,%[^,],%[^,],%s", host, id, passwd))
1079 {
1080 LOGD("agps: %s, %s, %s", host, id, passwd);
1081 memset(agps_info.host, 0x0, GNSS_AGPS_LEN_MAX);
1082 if(memcmp(host, "NULL", 4))
1083 {
1084 memcpy(agps_info.host, host, strlen(host));
1085 }
1086
1087 memset(agps_info.id, 0x0, GNSS_AGPS_LEN_MAX);
1088 if(memcmp(id, "NULL", 4))
1089 {
1090 memcpy(agps_info.id, id, strlen(id));
1091 }
1092
1093 memset(agps_info.passwd, 0x0, GNSS_AGPS_LEN_MAX);
1094 if(memcmp(passwd, "NULL", 4))
1095 {
1096 memcpy(agps_info.passwd, passwd, strlen(passwd));
1097 }
1098 }
1099 else
1100 {
1101 gnss_set_result = GNSS_ERR_ARG;
1102 goto set_fail;
1103 }
1104
1105 should_wait_rsp = FALSE;
1106 }
yq.wang51d17352024-09-23 04:54:46 -07001107 else if(memcmp(cmd, "$VER", 4) == 0) // $VER
b.liudbc3f4b2024-06-25 18:22:24 +08001108 {
yq.wang51d17352024-09-23 04:54:46 -07001109 gnss_set_cmd_rsp = (char *)cmd_rsp;
1110 gnss_cmd_rsp_len = cmd_rsp_len;
1111 gnss_set_result = gnss_8122_ver(fd);
b.liudbc3f4b2024-06-25 18:22:24 +08001112 if(gnss_set_result != GNSS_ERR_OK)
1113 {
b.liud0ba7152024-06-19 14:47:21 +08001114 goto set_fail;
1115 }
yq.wang51d17352024-09-23 04:54:46 -07001116 }
1117 else if(memcmp(cmd, "$MINEL", 6) == 0) // $MINEL,<elev>
1118 {
1119 uint32 elev = 0;
1120 elev = (uint32)atoi(cmd + 7);
1121 LOGD("set minel: %d", elev);
1122 if(GNSS_SET_EVEL_5 == elev)
1123 {
1124 uint8 elev_buff[8] = {0x35, 0xFA, 0x8E, 0x3C, 0xC2, 0xB8, 0xB2, 0x3D};
1125 gnss_set_result = gnss_8122_minel(fd, elev_buff);
1126 if(gnss_set_result != GNSS_ERR_OK)
1127 {
1128 goto set_fail;
1129 }
1130 }
1131 else if(GNSS_SET_EVEL_15 == elev)
1132 {
1133 uint8 elev_buff[8] = {0x35, 0xFA, 0x8E, 0x3C, 0x92, 0x0A, 0x86, 0x3E};
1134 gnss_set_result = gnss_8122_minel(fd, elev_buff);
1135 if(gnss_set_result != GNSS_ERR_OK)
1136 {
1137 goto set_fail;
1138 }
1139 }
1140 else
1141 {
1142 gnss_set_result = GNSS_ERR_ARG;
1143 goto set_fail;
1144 }
1145 }
1146 else if(memcmp(cmd, "$PZ90CONV", 9) == 0) // $PZ90CONV,local,ref
1147 {
1148 int local = 0;
1149 int ref = 0;
1150 uint8 buff[44] = {0x00, 0x00, 0x00, 0x00, 0xA6, 0x54, 0x58, 0x41,
1151 0xCD, 0x8C, 0x8F, 0xCC, 0x56, 0x77, 0x6B, 0x3F,
1152 0x8F, 0xC2, 0xF5, 0xBC, 0x0A, 0xD7, 0x23, 0xBC,
1153 0x00, 0x00, 0x00, 0x00, 0x30, 0x62, 0x9F, 0x37,
1154 0x28, 0x29, 0x30, 0xB8, 0xBD, 0x37, 0x06, 0x36,
1155 0x00, 0x00, 0x00, 0x00};
b.liu9e8584b2024-11-06 19:21:28 +08001156
yq.wang51d17352024-09-23 04:54:46 -07001157 if(2 == sscanf(cmd, "$PZ90CONV,%d,%d", &local, &ref))
1158 {
1159 LOGD("set pz90conv: %d, %d", local, ref);
1160
b.liu9e8584b2024-11-06 19:21:28 +08001161
yq.wang51d17352024-09-23 04:54:46 -07001162 if(local == 1 && ref == 0) //PZ90
1163 {
1164 //
1165 }
1166 else if(local == 0 && ref == 0)
1167 {
1168 memset(buff, 0x00, 44);
1169 }
1170 else
1171 {
1172 gnss_set_result = GNSS_ERR_UNSUPPORT;
1173 goto set_fail;
1174 }
1175 }
1176 else
1177 {
1178 gnss_set_result = GNSS_ERR_ARG;
1179 goto set_fail;
1180 }
1181
1182 gnss_set_result = gnss_8122_PZ90CONV(fd, buff);
1183 if(gnss_set_result != GNSS_ERR_OK)
1184 {
1185 goto set_fail;
1186 }
b.liudbc3f4b2024-06-25 18:22:24 +08001187 }
1188 else if(memcmp(cmd, "$NMEACFG", 8) == 0) // $NMEACFG,<ver>
1189 {
b.liud0ba7152024-06-19 14:47:21 +08001190#if 0
1191 gnss_memaver_type_enum version = (gnss_memaver_type_enum)atoi(cmd + 9);
b.liudbc3f4b2024-06-25 18:22:24 +08001192 if(version == GNSS_MEMAVER_TYPE_3_0)
1193 {
b.liud0ba7152024-06-19 14:47:21 +08001194 gnss_set_result = gnss_8122_nmeaver(fd, 1);
b.liudbc3f4b2024-06-25 18:22:24 +08001195 }
1196 else if(version == GNSS_MEMAVER_TYPE_4_0)
1197 {
b.liud0ba7152024-06-19 14:47:21 +08001198 gnss_set_result = gnss_8122_nmeaver(fd, 2);
b.liudbc3f4b2024-06-25 18:22:24 +08001199 }
1200 else if(version == GNSS_MEMAVER_TYPE_4_1)
1201 {
b.liud0ba7152024-06-19 14:47:21 +08001202 gnss_set_result = gnss_8122_nmeaver(fd, 3);
b.liudbc3f4b2024-06-25 18:22:24 +08001203 }
1204 else
1205 {
b.liud0ba7152024-06-19 14:47:21 +08001206 gnss_set_result = GNSS_ERR_ARG;
1207 goto set_fail;
1208 }
b.liudbc3f4b2024-06-25 18:22:24 +08001209 if(gnss_set_result != GNSS_ERR_OK)
1210 {
b.liud0ba7152024-06-19 14:47:21 +08001211 goto set_fail;
1212 }
1213 should_wait_rsp = FALSE;
1214#else
1215 gnss_set_result = GNSS_ERR_UNSUPPORT;
1216 goto set_fail;
1217#endif
b.liu5f950c52024-06-15 20:13:12 +08001218 }
1219 else
1220 {
1221 LOGW("Unknown cmd:%s", cmd);
1222 gnss_set_result = GNSS_ERR_UNSUPPORT;
1223 goto set_fail;
1224 }
1225
b.liu9e8584b2024-11-06 19:21:28 +08001226// set_success:
b.liudbc3f4b2024-06-25 18:22:24 +08001227 if(should_wait_rsp)
1228 {
b.liud0ba7152024-06-19 14:47:21 +08001229 setting_waitting = TRUE;
b.liu5f950c52024-06-15 20:13:12 +08001230 pthread_mutex_lock(&read_mutex);
1231 pthread_cond_wait(&read_cond, &read_mutex);
1232 pthread_mutex_unlock(&read_mutex);
b.liudbc3f4b2024-06-25 18:22:24 +08001233 }
1234 else
1235 {
b.liu5f950c52024-06-15 20:13:12 +08001236 mbtk_timer_clear();
1237 }
1238
yq.wang51d17352024-09-23 04:54:46 -07001239 if(gnss_set_cmd_rsp != NULL)
1240 {
1241 gnss_set_cmd_rsp = NULL;
1242 gnss_cmd_rsp_len = 0;
1243 }
b.liu5f950c52024-06-15 20:13:12 +08001244 setting_busy = FALSE;
1245 return gnss_set_result;
b.liudbc3f4b2024-06-25 18:22:24 +08001246 set_fail:
yq.wang51d17352024-09-23 04:54:46 -07001247 if(gnss_set_cmd_rsp != NULL)
1248 {
1249 gnss_set_cmd_rsp = NULL;
1250 gnss_cmd_rsp_len = 0;
1251 }
b.liu5f950c52024-06-15 20:13:12 +08001252 setting_busy = FALSE;
1253 mbtk_timer_clear();
1254 return gnss_set_result;
1255 }
b.liuf9fbfa12024-06-14 15:53:59 +08001256}
1257
b.liu5f950c52024-06-15 20:13:12 +08001258