blob: e61bfe6ecee55b6ddd898d5a1bde8df26d3aed1a [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.liuf9fbfa12024-06-14 15:53:59 +080032
33#define UART_BITRATE_NMEA_DEF_FW 115200 // Default bitrate.
34#define GNSS_POWER_GPIO 43
b.liu5f950c52024-06-15 20:13:12 +080035#define GNSS_SET_TIMEOUT 3000 // 3s
36#define GNSS_PACK_BUFF_SIZE 1024
b.liud0ba7152024-06-19 14:47:21 +080037#define GNSS_MSG_NUM_MAX 30
b.liudbc3f4b2024-06-25 18:22:24 +080038#define READ_LEN_MAX 1024 //BOOT_UPGRADE_BUFF_MAX_1
yq.wang6eacd292024-09-14 03:01:07 -070039#define GNSS_FW_GQALS_PATH "/lib/firmware/gp_gl_ga_fw.bin"
40#define GNSS_FW_GAQBS_PATH "/lib/firmware/gp_bd_ga_fw.bin"
b.liuf9fbfa12024-06-14 15:53:59 +080041
yq.wang99db6f52024-09-12 01:58:48 -070042//#define AGNSS_TEST_URL "http://aclientt.allystar.com:80/ephemeris/HD_GPS_BDS.hdb"
43#define AGNSS_URL "http://uagnss.allystar.com:80/ephemeris/%s?compid=yikecs1&token=Z38w5urAuawubTxi"
44#define AGNSS_INDIVIDUATION_URL_HEAD "http://cagnss.allystar.com/api/v1/eph/rt?"
45#define AGNSS_ALLSTAR_URL_HEAD "http://cagnss.allystar.com/api/v1/eph/rta?"
46#define AGNSS_EPH_FILE_PATH "/lib/firmware/eph_data.txt"
47
48#define AGNSS_EPH_GPS "HD_GPS.hdb"
49#define AGNSS_EPH_BDS "HD_BDS.hdb"
50#define AGNSS_EPH_GLO "HD_GLO.hdb"
51#define AGNSS_EPH_GPS_BDS "HD_GPS_BDS.hdb"
52#define AGNSS_EPH_GPS_GLO "HD_GPS_GLO.hdb"
53
b.liuf9fbfa12024-06-14 15:53:59 +080054static pthread_cond_t read_cond;
55static pthread_mutex_t read_mutex;
b.liud0ba7152024-06-19 14:47:21 +080056static bool setting_waitting = FALSE;
b.liu5f950c52024-06-15 20:13:12 +080057static bool setting_busy = FALSE;
58static void *gnss_set_rsp_ptr = NULL;
59static gnss_err_enum gnss_set_result = GNSS_ERR_OK;
b.liud0ba7152024-06-19 14:47:21 +080060static hd8122_msg_id_t msg_array[GNSS_MSG_NUM_MAX];
yq.wangaf363dc2024-08-06 20:16:00 -070061static char gnss_ctrl_path[128] = "/sys/devices/platform/mbtk-gnss/ctrl";
yq.wang9dd771b2024-09-13 23:38:40 -070062static gnss_agps_info_t agps_info;
yq.wang51d17352024-09-23 04:54:46 -070063static char *gnss_set_cmd_rsp = NULL;
64static int gnss_cmd_rsp_len = 0;
b.liuf9fbfa12024-06-14 15:53:59 +080065
b.liu5f950c52024-06-15 20:13:12 +080066int gnss_write(int fd, const void *data, int data_len);
b.liudbc3f4b2024-06-25 18:22:24 +080067int OpenUart(char* UART_DEV);
68int uart_close(int fd);
69int fw_update_boot(int uart_fd, uint8_t *data, uint32_t len);
b.liu5f950c52024-06-15 20:13:12 +080070
b.liudbc3f4b2024-06-25 18:22:24 +080071static uint16 fletcher16(const uint8_t* data, int data_len)
72{
b.liud0ba7152024-06-19 14:47:21 +080073 uint32_t sum1 = 0;
74 uint32_t sum2 = 0;
b.liu5f950c52024-06-15 20:13:12 +080075 int index;
76
b.liudbc3f4b2024-06-25 18:22:24 +080077 for (index = 0; index < data_len; ++index )
78 {
b.liud0ba7152024-06-19 14:47:21 +080079 sum1 += data[index];
80 sum2 += sum1;
b.liu5f950c52024-06-15 20:13:12 +080081 }
82
b.liud0ba7152024-06-19 14:47:21 +080083 return ((0xFF & sum2) << 8) | (0xFF & sum1);
b.liu5f950c52024-06-15 20:13:12 +080084}
85
86static void gnss_set_timer_cb(int signo)
87{
b.liudbc3f4b2024-06-25 18:22:24 +080088 if(setting_busy)
89 {
b.liu5f950c52024-06-15 20:13:12 +080090 pthread_mutex_lock(&read_mutex);
91 pthread_cond_signal(&read_cond);
92 pthread_mutex_unlock(&read_mutex);
93 gnss_set_result = GNSS_ERR_TIMEOUT;
94 }
95 return;
96}
97
b.liud0ba7152024-06-19 14:47:21 +080098static void msg_init()
99{
b.liu778645e2024-06-21 16:47:42 +0800100 unsigned int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800101 while(i < ARRAY_SIZE(msg_array))
102 {
b.liud0ba7152024-06-19 14:47:21 +0800103 msg_array[i].enable = FALSE;
104 i++;
105 }
106}
107
b.liud0ba7152024-06-19 14:47:21 +0800108static int msg_insert(uint8 gid, uint8 sid)
109{
b.liu778645e2024-06-21 16:47:42 +0800110 unsigned int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800111 while(i < ARRAY_SIZE(msg_array))
112 {
b.liud0ba7152024-06-19 14:47:21 +0800113 if(!msg_array[i].enable)
114 break;
115 i++;
116 }
117
b.liudbc3f4b2024-06-25 18:22:24 +0800118 if(i == ARRAY_SIZE(msg_array))
119 {
b.liud0ba7152024-06-19 14:47:21 +0800120 LOGE("Msg full : %d", i);
121 return -1;
b.liudbc3f4b2024-06-25 18:22:24 +0800122 }
123 else
124 {
b.liud0ba7152024-06-19 14:47:21 +0800125 msg_array[i].enable = TRUE;
126 msg_array[i].gid = gid;
127 msg_array[i].sid = sid;
128 return 0;
129 }
130}
131
132static int msg_find(uint8 gid, uint8 sid)
133{
b.liu778645e2024-06-21 16:47:42 +0800134 unsigned int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800135 while(i < ARRAY_SIZE(msg_array))
136 {
b.liud0ba7152024-06-19 14:47:21 +0800137 if(msg_array[i].enable && gid == msg_array[i].gid && sid == msg_array[i].sid)
138 break;
139 i++;
140 }
141
b.liudbc3f4b2024-06-25 18:22:24 +0800142 if(i == ARRAY_SIZE(msg_array))
143 {
b.liud0ba7152024-06-19 14:47:21 +0800144 LOGE("No found %d - %d", gid, sid);
145 return -1;
b.liudbc3f4b2024-06-25 18:22:24 +0800146 }
147 else
148 {
b.liud0ba7152024-06-19 14:47:21 +0800149 return i;
150 }
151}
152
153static int msg_remove(uint8 gid, uint8 sid)
154{
155 int i = msg_find(gid, sid);
b.liudbc3f4b2024-06-25 18:22:24 +0800156 if(i >= 0)
157 {
b.liud0ba7152024-06-19 14:47:21 +0800158 msg_array[i].enable = FALSE;
159 msg_array[i].gid = 0;
160 msg_array[i].sid = 0;
161 return 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800162 }
163 else
164 {
b.liud0ba7152024-06-19 14:47:21 +0800165 return -1;
166 }
167}
168
169static int msg_count()
170{
b.liu778645e2024-06-21 16:47:42 +0800171 unsigned int i = 0;
b.liud0ba7152024-06-19 14:47:21 +0800172 int count = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800173 while(i < ARRAY_SIZE(msg_array))
174 {
b.liud0ba7152024-06-19 14:47:21 +0800175 if(msg_array[i].enable)
176 count++;
177 i++;
178 }
179 return count;
180}
b.liu5f950c52024-06-15 20:13:12 +0800181
yq.wangaf363dc2024-08-06 20:16:00 -0700182static int gnss_ctrl_write(char* str)
183{
184 int fd = -1;
185 int ret = -1;
186 fd = open((const char*)gnss_ctrl_path, O_WRONLY);
187 if (fd < 0)
188 {
189 LOGE("open %s fail", gnss_ctrl_path);
190 return -1;
191 }
192 else
193 {
194 ret = write(fd, str, strlen(str));
195 close(fd);
196 if(ret < 0)
197 {
198 LOGE("write %s fail", str);
199 return -1;
200 }
201 }
202 return 0;
203}
204
205static int gnss_fwdl_enable()
206{
207 int ret = -1;
208 ret = gnss_ctrl_write("fdl");
209 if(ret < 0)
210 {
211 LOGE("gnss_ctrl_write fail");
212 return -1;
213 }
214 return 0;
215}
216
b.liudbc3f4b2024-06-25 18:22:24 +0800217static uint32_t read_bin_file(uint8_t *path, uint8_t *buff)
218{
219 int fp = -1;
220 int ret = 0;
221 int i = 0;
222 int size = 0;
223
224 if (NULL == path || NULL == buff)
225 {
226 LOGE("ARG error");
227 return 0;
228 }
229
230 fp = open((char *)path, O_RDONLY);
231 if(fp < 0)
232 {
233 LOGE( "open file failed ! errno is %d", errno);
234 return 0;
235 }
236
237 size = lseek(fp, 0x00, SEEK_END);
238 if(size <= 0)
239 {
240 LOGE( "file is empty.");
241 return 0;
242 }
243
244 LOGD( "file size is:%d", size);
245 lseek(fp, 0x00, SEEK_SET);
246 while(1)
247 {
248 ret = read(fp, buff, READ_LEN_MAX);
249 i += ret;
250 if(ret == READ_LEN_MAX)
251 {
252 buff += READ_LEN_MAX;
253 }
254 else
255 {
256 break;
257 }
258 }
259
260 LOGD("file size is:%d,i:%d", size, i);
261 close(fp);
262 if(size != i)
263 {
264 return 0;
265 }
266 return size;
267}
268
269
b.liu5f950c52024-06-15 20:13:12 +0800270static int pack_create(hd8122_id_type_enum id_type, uint8 id, uint16 data_len, const uint8 *data, uint8 *pack, int pack_len)
271{
b.liudbc3f4b2024-06-25 18:22:24 +0800272 if(pack == NULL || pack_len < HD8122_PACK_LEN_MIN)
273 {
b.liu5f950c52024-06-15 20:13:12 +0800274 return -1;
275 }
276 memset(pack, 0, pack_len);
277 uint8 *data_ptr = pack;
278 data_ptr += uint16_2_byte(HD8122_PACK_HEAD, data_ptr, false);
279 *data_ptr++ = (uint8)id_type;
280 *data_ptr++ = id;
281 data_ptr += uint16_2_byte(data_len, data_ptr, false);
b.liudbc3f4b2024-06-25 18:22:24 +0800282 if(data_len > 0)
283 {
b.liu5f950c52024-06-15 20:13:12 +0800284 memcpy(data_ptr, data, data_len);
285 data_ptr += data_len;
286 }
287 data_ptr += uint16_2_byte(fletcher16(pack + 2, 4 + data_len), data_ptr, false);
288 return (data_ptr - pack);
289}
290
b.liud0ba7152024-06-19 14:47:21 +0800291// f1 d9 05 01 02 00 06 01 0f 38
292// or
293// f1 d9 05 00 02 00 06 01 0f 38
294static int msg_array_change(const uint8 *pack, int pack_len, hd8122_id_ack_enum *ack_nak)
295{
yq.wang51d17352024-09-23 04:54:46 -0700296 if(pack_len == 0)
297 {
298 LOGE("pack_len(%d) error.", pack_len);
299 return -1;
300 }
301
302 //info result
303 if(gnss_set_cmd_rsp != NULL)
304 {
305 if(pack_len > 4 && pack[2] == 0x0a && pack[3] == 0x04) //VER INFO
306 {
307 char sw_ver[32] = {0};
308 char hw_ver[32] = {0};
309 memcpy(sw_ver, pack + 6, 16);
310 memcpy(hw_ver, pack + 22, 16);
311 snprintf(gnss_set_cmd_rsp, gnss_cmd_rsp_len, "%s,%s", sw_ver, hw_ver);
312 LOGE("fw ver:%s", gnss_set_cmd_rsp);
313 int index = msg_find(pack[2], pack[3]);
314 if(index >= 0)
315 {
316 msg_array[index].enable = FALSE;
317 }
318 else
319 {
320 LOGE("Unknown gid - %d, sid - %d", pack[2], pack[3]);
321 return -1;
322 }
323 return 0;
324 }
325 }
326
327 //set result
328 if(pack_len % 10)
b.liudbc3f4b2024-06-25 18:22:24 +0800329 {
b.liud0ba7152024-06-19 14:47:21 +0800330 LOGE("pack_len(%d) error.", pack_len);
331 return -1;
332 }
333 int count = pack_len / 10;
334 int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800335 while(i < count)
336 {
b.liu778645e2024-06-21 16:47:42 +0800337 const uint8 *ptr = pack + i * 10;
b.liudbc3f4b2024-06-25 18:22:24 +0800338 if(ptr[0] != 0xf1 || ptr[1] != 0xd9)
339 {
b.liud0ba7152024-06-19 14:47:21 +0800340 LOGE("Pack head error : %02x %02x", ptr[0], ptr[1]);
341 return -1;
342 }
343
b.liudbc3f4b2024-06-25 18:22:24 +0800344 if(ptr[2] != 0x05)
345 {
b.liud0ba7152024-06-19 14:47:21 +0800346 LOGE("Type not 0x05 : %02x", ptr[2]);
347 return -1;
348 }
349
350 int index = msg_find(ptr[6], ptr[7]);
b.liudbc3f4b2024-06-25 18:22:24 +0800351 if(index >= 0)
352 {
353 if(ptr[3] == 0x01)
354 {
b.liud0ba7152024-06-19 14:47:21 +0800355 msg_array[index].ack_nak = HD8122_ID_ACK_ACK;
b.liudbc3f4b2024-06-25 18:22:24 +0800356 }
357 else if(ptr[3] == 0x00)
358 {
b.liud0ba7152024-06-19 14:47:21 +0800359 msg_array[index].ack_nak = HD8122_ID_ACK_NAK;
360
361 // There is a nak as a failure.
362 *ack_nak = HD8122_ID_ACK_NAK;
b.liudbc3f4b2024-06-25 18:22:24 +0800363 }
364 else
365 {
b.liud0ba7152024-06-19 14:47:21 +0800366 LOGE("ID not 0x00 or 0x01 : %02x", ptr[3]);
367 return -1;
368 }
369
370 msg_array[index].enable = FALSE;
b.liudbc3f4b2024-06-25 18:22:24 +0800371 }
372 else
373 {
b.liud0ba7152024-06-19 14:47:21 +0800374 LOGE("Unknown gid - %d, sid - %d", ptr[6], ptr[7]);
375 return -1;
376 }
377 i++;
378 }
379
380 return 0;
381}
382
b.liudbc3f4b2024-06-25 18:22:24 +0800383static void gnss_cmd_rsp_process(const void *data, int data_len)
384{
b.liu5f950c52024-06-15 20:13:12 +0800385 const char *ptr = (const char*)data;
386 log_hex("RSP", data, data_len);
b.liu5f950c52024-06-15 20:13:12 +0800387
b.liud0ba7152024-06-19 14:47:21 +0800388 hd8122_id_ack_enum ack_nak = HD8122_ID_ACK_ACK;
b.liudbc3f4b2024-06-25 18:22:24 +0800389 if(!msg_array_change((const uint8*)data, data_len, &ack_nak))
390 {
b.liud0ba7152024-06-19 14:47:21 +0800391 if(setting_waitting && msg_count() == 0)
392 {
b.liudbc3f4b2024-06-25 18:22:24 +0800393 if(ack_nak == HD8122_ID_ACK_ACK)
394 {
b.liud0ba7152024-06-19 14:47:21 +0800395 gnss_set_result = GNSS_ERR_OK;
b.liudbc3f4b2024-06-25 18:22:24 +0800396 }
397 else
398 {
b.liud0ba7152024-06-19 14:47:21 +0800399 gnss_set_result = GNSS_ERR_UNKNOWN;
400 }
401
402 mbtk_timer_clear();
403
404 pthread_mutex_lock(&read_mutex);
405 pthread_cond_signal(&read_cond);
406 pthread_mutex_unlock(&read_mutex);
407 setting_waitting = FALSE;
408 }
yq.wang99db6f52024-09-12 01:58:48 -0700409
b.liudbc3f4b2024-06-25 18:22:24 +0800410 }
411 else
412 {
b.liud0ba7152024-06-19 14:47:21 +0800413 LOGW("Unknown rsp data.");
b.liu5f950c52024-06-15 20:13:12 +0800414 }
415}
416
b.liud0ba7152024-06-19 14:47:21 +0800417static gnss_err_enum gnss_8122_reset(int fd, uint8 reset)
b.liu5f950c52024-06-15 20:13:12 +0800418{
419 uint8 buff[GNSS_PACK_BUFF_SIZE];
420 LOGD("RESET");
421 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 +0800422 if(len <= 0)
423 {
b.liu5f950c52024-06-15 20:13:12 +0800424 LOGE("pack_create() fail.");
425 return GNSS_ERR_ARG;
426 }
427 log_hex("PACK", buff, len);
428 gnss_write(fd, buff, len);
429 return GNSS_ERR_OK;
430}
b.liuf9fbfa12024-06-14 15:53:59 +0800431
b.liud0ba7152024-06-19 14:47:21 +0800432static gnss_err_enum gnss_8122_syscfg(int fd, uint32 mode)
433{
434 uint8 buff[GNSS_PACK_BUFF_SIZE];
435 LOGD("SYSCFG");
436 //uint8 mode_str[4];
437 //uint32_2_byte(mode, mode_str, TRUE);
438 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 +0800439 if(len <= 0)
440 {
b.liud0ba7152024-06-19 14:47:21 +0800441 LOGE("pack_create() fail.");
442 return GNSS_ERR_ARG;
443 }
444 log_hex("PACK", buff, len);
445 gnss_write(fd, buff, len);
446 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_NAVSAT);
447 return GNSS_ERR_OK;
448}
449
yq.wang6a3437f2024-07-27 02:57:20 -0700450static gnss_err_enum gnss_8122_freqcfg(int fd, uint8 mode)
451{
452 uint8 buff[GNSS_PACK_BUFF_SIZE];
453 LOGD("FREQCFG");
454 uint8 data[20];
455 memset(data, 0x00, 20);
456 data[1] = mode;
457 data[2] = 0x66;
458 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_PWRCTL, 20, data, buff, sizeof(buff));
459 if(len <= 0)
460 {
461 LOGE("pack_create() fail.");
462 return GNSS_ERR_ARG;
463 }
464 log_hex("PACK", buff, len);
465 gnss_write(fd, buff, len);
466 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_PWRCTL);
467 return GNSS_ERR_OK;
468}
469
yq.wang012b6522024-09-12 02:36:53 -0700470static gnss_err_enum gnss_8122_cfg_save(int fd)
471{
472 uint8 buff[GNSS_PACK_BUFF_SIZE];
473 LOGD("CFG SAVE");
474 uint8 data[8];
475 memset(data, 0x00, 8);
476 data[4] = 0x0f;
477 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_CFG, 8, data, buff, sizeof(buff));
478 if(len <= 0)
479 {
480 LOGE("pack_create() fail.");
481 return GNSS_ERR_ARG;
482 }
483 log_hex("PACK", buff, len);
484 gnss_write(fd, buff, len);
485 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_CFG);
486 return GNSS_ERR_OK;
487}
488
b.liud0ba7152024-06-19 14:47:21 +0800489static gnss_err_enum gnss_8122_msgcfg(int fd, uint8 type, uint8 id, uint8 period)
490{
491 uint8 buff[GNSS_PACK_BUFF_SIZE];
492 LOGD("MSGCFG");
493 uint8 data[3];
494 data[0] = type;
495 data[1] = id;
496 data[2] = period;
497 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_MSG, 3, data, buff, sizeof(buff));
b.liudbc3f4b2024-06-25 18:22:24 +0800498 if(len <= 0)
499 {
b.liud0ba7152024-06-19 14:47:21 +0800500 LOGE("pack_create() fail.");
501 return GNSS_ERR_ARG;
502 }
503 log_hex("PACK", buff, len);
504 gnss_write(fd, buff, len);
505 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_MSG);
506 return GNSS_ERR_OK;
507}
508
yq.wang51d17352024-09-23 04:54:46 -0700509static gnss_err_enum gnss_8122_ver(int fd)
b.liud0ba7152024-06-19 14:47:21 +0800510{
511 uint8 buff[GNSS_PACK_BUFF_SIZE];
yq.wang51d17352024-09-23 04:54:46 -0700512 LOGD("VER");
513 int len = pack_create(HD8122_ID_TYPE_MON, HD8122_ID_MON_VER, 0, NULL, buff, sizeof(buff));
b.liudbc3f4b2024-06-25 18:22:24 +0800514 if(len <= 0)
515 {
b.liud0ba7152024-06-19 14:47:21 +0800516 LOGE("pack_create() fail.");
517 return GNSS_ERR_ARG;
518 }
519 log_hex("PACK", buff, len);
520 gnss_write(fd, buff, len);
yq.wang51d17352024-09-23 04:54:46 -0700521 msg_insert(HD8122_ID_TYPE_MON, HD8122_ID_MON_VER);
b.liud0ba7152024-06-19 14:47:21 +0800522 return GNSS_ERR_OK;
523}
524
yq.wang51d17352024-09-23 04:54:46 -0700525
526static gnss_err_enum gnss_8122_minel(int fd, uint8 *elev)
527{
528 uint8 buff[GNSS_PACK_BUFF_SIZE];
529 LOGD("ELEV");
530 //uint8 elev_buff[4];
531 //uint32_2_byte((uint32)elev, elev_buff, TRUE);
532 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_ELEV, 8, elev, buff, sizeof(buff));
533 if(len <= 0)
534 {
535 LOGE("pack_create() fail.");
536 return GNSS_ERR_ARG;
537 }
538 log_hex("PACK", buff, len);
539 gnss_write(fd, buff, len);
540 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_ELEV);
541 return GNSS_ERR_OK;
542}
543
544static gnss_err_enum gnss_8122_PZ90CONV(int fd, uint8 *coord)
545{
546 uint8 buff[GNSS_PACK_BUFF_SIZE];
547 LOGD("PZ90CONV");
548 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_COORD, 44, coord, buff, sizeof(buff));
549 if(len <= 0)
550 {
551 LOGE("pack_create() fail.");
552 return GNSS_ERR_ARG;
553 }
554 log_hex("PACK", buff, len);
555 gnss_write(fd, buff, len);
556 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_COORD);
557 return GNSS_ERR_OK;
558}
559
560
b.liud0ba7152024-06-19 14:47:21 +0800561static gnss_err_enum gnss_8122_nmeaver(int fd, uint8 ver)
562{
563 uint8 buff[GNSS_PACK_BUFF_SIZE];
564 LOGD("NMEA-VER");
565 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 +0800566 if(len <= 0)
567 {
b.liud0ba7152024-06-19 14:47:21 +0800568 LOGE("pack_create() fail.");
569 return GNSS_ERR_ARG;
570 }
571 log_hex("PACK", buff, len);
572 gnss_write(fd, buff, len);
573 return GNSS_ERR_OK;
574}
575
b.liuf9fbfa12024-06-14 15:53:59 +0800576int gnss_8122_dev_open()
577{
yq.wang5fe6e612024-07-17 01:18:12 -0700578 //return mbtk_gpio_value_set(GNSS_POWER_GPIO, MBTK_GPIO_DIRECT_OUT, 1);
579 system("i2cset -y -f 2 0x31 0x15 0x86");
580 return 0;
b.liuf9fbfa12024-06-14 15:53:59 +0800581}
582
b.liu978f5432024-07-01 18:04:18 +0800583int gnss_8122_dev_close(int fd)
b.liuf9fbfa12024-06-14 15:53:59 +0800584{
yq.wang5fe6e612024-07-17 01:18:12 -0700585 //return mbtk_gpio_value_set(GNSS_POWER_GPIO, MBTK_GPIO_DIRECT_OUT, 0);
586 system("i2cset -y -f 2 0x31 0x15 0x00");
587 return 0;
b.liuf9fbfa12024-06-14 15:53:59 +0800588}
589
590int gnss_8122_open(const char *dev)
591{
592 pthread_mutex_init(&read_mutex, NULL);
593 pthread_cond_init(&read_cond, NULL);
594 return gnss_port_open(dev, O_RDWR | O_NONBLOCK | O_NOCTTY, UART_BITRATE_NMEA_DEF_FW, TRUE);
595}
596
597int gnss_8122_close(int fd)
598{
599 pthread_mutex_destroy(&read_mutex);
600 pthread_cond_destroy(&read_cond);
601 return gnss_port_close(fd);
602}
603
b.liudbc3f4b2024-06-25 18:22:24 +0800604int gnss_8122_fw_dl(int fd, const char *fw_name, const char *dev)
b.liuf9fbfa12024-06-14 15:53:59 +0800605{
b.liudbc3f4b2024-06-25 18:22:24 +0800606 int uart_fd = OpenUart(dev);//PORT_NAME234
607 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 }
623 else
624 {
625 LOGE("fw dl param error");
626 return GNSS_ERR_ARG;
627 }
628
b.liudbc3f4b2024-06-25 18:22:24 +0800629 uint8_t *g_bin_buff = (uint8_t*)malloc(500*1024);
630 if(g_bin_buff == NULL) {
631 LOGE("malloc() fail : %d", errno);
632 return GNSS_ERR_UNKNOWN;
633 }
634 memset(g_bin_buff, 0, 500*1024);
yq.wangaf363dc2024-08-06 20:16:00 -0700635 uint32_t len = read_bin_file(fw_path, g_bin_buff);
b.liudbc3f4b2024-06-25 18:22:24 +0800636 if (len <= 0)
637 {
638 LOGE("Read file failed ,len = %d", len);
yq.wangaf363dc2024-08-06 20:16:00 -0700639 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800640 }
yq.wangaf363dc2024-08-06 20:16:00 -0700641 if(gnss_8122_dev_open())
642 {
b.liudbc3f4b2024-06-25 18:22:24 +0800643 LOGE("open gnss device fail:%d", errno);
yq.wangaf363dc2024-08-06 20:16:00 -0700644 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800645 }
yq.wangaf363dc2024-08-06 20:16:00 -0700646
647 if(gnss_fwdl_enable() < 0)
648 {
649 LOGE("gnss_fwdl_enable fail");
650 goto error;
651 }
652
b.liudbc3f4b2024-06-25 18:22:24 +0800653 int ret = fw_update_boot(uart_fd, g_bin_buff, len);
b.liudbc3f4b2024-06-25 18:22:24 +0800654 if (ret < 0)
655 {
656 LOGE("fw_update_boot() fail : %d", ret);
yq.wangaf363dc2024-08-06 20:16:00 -0700657 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800658 }
b.liudbc3f4b2024-06-25 18:22:24 +0800659 if(ret == HDBD_UPG_SUCESS)
660 {
661 LOGD("upgrade sucess!");
b.liudbc3f4b2024-06-25 18:22:24 +0800662 }
663 else
664 {
665 LOGD("upgrade FAIL, fail style:%d", ret);
yq.wangaf363dc2024-08-06 20:16:00 -0700666 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800667 }
yq.wangaf363dc2024-08-06 20:16:00 -0700668
669 if(gnss_8122_dev_close(0))
670 {
671 LOGE("close gnss device fail:%d", errno);
672 goto error;
673 }
674 free(g_bin_buff);
675 g_bin_buff = NULL;
676 uart_close(uart_fd);
677 return GNSS_ERR_OK;
678error:
679 if(g_bin_buff)
680 {
681 free(g_bin_buff);
682 g_bin_buff = NULL;
683 }
684 if(uart_fd > 0)
685 {
686 uart_close(uart_fd);
687 uart_fd = -1;
688 }
689 return GNSS_ERR_DL_FW;
b.liuf9fbfa12024-06-14 15:53:59 +0800690}
691
yq.wang99db6f52024-09-12 01:58:48 -0700692gnss_err_enum gnss_8122_agnss_get_eph(const char *param)
693{
694 if(param == NULL)
695 {
696 LOGD("gnss_8122_agnss_get_eph param is NULL");
697 return GNSS_ERR_ARG;
698 }
699
700 int eph_type = 0;
701 int alam_flag = 0;
702 int ret = -1;
703 char url[256] = {0};
704 if(2 == sscanf(param, "%d,%d", &eph_type, &alam_flag))
705 {
706 if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS)
707 {
708 snprintf(url, 256,AGNSS_URL, AGNSS_EPH_GPS);
709 }
710 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_BDS)
711 {
712 snprintf(url, 256,AGNSS_URL, AGNSS_EPH_BDS);
713 }
714 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GLO)
715 {
716 snprintf(url, 256,AGNSS_URL, AGNSS_EPH_GLO);
717 }
718 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS_BDS)
719 {
720 snprintf(url, 256,AGNSS_URL, AGNSS_EPH_GPS_BDS);
721 }
722 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS_GLO)
723 {
724 snprintf(url, 256,AGNSS_URL, AGNSS_EPH_GPS_GLO);
725 }
yq.wang9dd771b2024-09-13 23:38:40 -0700726 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_CFG)
727 {
728 snprintf(url, 256,"%s?compid=%s&token=%s", strlen(agps_info.host) > 0 ? agps_info.host : "http://uagnss.allystar.com:80/ephemeris/HD_GPS.hdb",
729 strlen(agps_info.id) > 0 ? agps_info.id : "yikecs1",
730 strlen(agps_info.passwd) > 0 ? agps_info.passwd : "Z38w5urAuawubTxi");
731 }
yq.wang99db6f52024-09-12 01:58:48 -0700732 else
733 {
734 return GNSS_ERR_UNSUPPORT;
735 }
736
737 ret = eph_data_from_http_get(url, AGNSS_EPH_FILE_PATH);
738 if (ret < 0)
739 {
740 LOGD("eph_data_from_http_get fail");
741 return GNSS_ERR_EPH_GET_FAIL;
742 }
743 LOGD("get_eph_data_from_http success");
744 }
745 else
746 {
747 LOGD("param num error");
748 return GNSS_ERR_ARG;
749 }
750 return GNSS_ERR_OK;
751}
752
753
754gnss_err_enum gnss_8122_agnss_inject(int fd)
755{
756 int ret = 0;
757 hd_set_gnss_dev_fd(fd);
758 ret = hd_agnss_inject(AGNSS_EPH_FILE_PATH, 0, 0, 0, 0, NULL);
759 hd_set_gnss_dev_fd(-1);
760 if(ret < 0)
761 {
762 LOGD("hd_agnss_inject fail");
763 return GNSS_ERR_EPH_INJECT_FAIL;
764 }
765 return GNSS_ERR_OK;
766}
767
b.liu5f950c52024-06-15 20:13:12 +0800768void gnss_8122_set_cb(const void *data, int data_len)
769{
770 const char *buff = (const char*)data;
b.liudbc3f4b2024-06-25 18:22:24 +0800771 if(setting_busy) // Has setting cmd process.
772 {
b.liu5f950c52024-06-15 20:13:12 +0800773 gnss_cmd_rsp_process(data, data_len);
774 }
yq.wang99db6f52024-09-12 01:58:48 -0700775
yq.wang9dd771b2024-09-13 23:38:40 -0700776#if 0
yq.wang99db6f52024-09-12 01:58:48 -0700777 if(hd_get_eph_inject_status() == HD_EPH_INJECT_STATUS_WAIT_RETURN)
778 {
779 log_hex("EPH_RSP", (const char*)data, data_len);
780 int ret = hd_eph_inject_result_check(data, data_len);
781 if(ret < 0)
782 {
783 hd_set_eph_inject_status(HD_EPH_INJECT_STATUS_FAIL);
784 }
785 else
786 {
787 hd_set_eph_inject_status(HD_EPH_INJECT_STATUS_SUCCESS);
yq.wang9dd771b2024-09-13 23:38:40 -0700788 }
yq.wang99db6f52024-09-12 01:58:48 -0700789 }
yq.wang9dd771b2024-09-13 23:38:40 -0700790#endif
b.liu5f950c52024-06-15 20:13:12 +0800791}
b.liuf9fbfa12024-06-14 15:53:59 +0800792
793gnss_err_enum gnss_8122_set(int fd, const char *cmd, void *cmd_rsp, int cmd_rsp_len)
794{
b.liudbc3f4b2024-06-25 18:22:24 +0800795 if(setting_busy)
796 {
b.liu5f950c52024-06-15 20:13:12 +0800797 return GNSS_ERR_SET_BUSY;
b.liudbc3f4b2024-06-25 18:22:24 +0800798 }
799 else
800 {
b.liu5f950c52024-06-15 20:13:12 +0800801 bool should_wait_rsp = TRUE;
802 setting_busy = TRUE;
803 gnss_set_rsp_ptr = cmd_rsp;
804 gnss_set_result = GNSS_ERR_OK;
b.liud0ba7152024-06-19 14:47:21 +0800805 msg_init();
b.liu5f950c52024-06-15 20:13:12 +0800806 mbtk_timer_set(gnss_set_timer_cb, GNSS_SET_TIMEOUT);
807
b.liudbc3f4b2024-06-25 18:22:24 +0800808 if(memcmp(cmd, "$RESET", 6) == 0) // $RESET,<mode>
809 {
b.liud0ba7152024-06-19 14:47:21 +0800810 gnss_reset_type_enum mode = (gnss_reset_type_enum)atoi(cmd + 7);
yq.wang1ddd1fd2024-07-25 23:00:14 -0700811 LOGD("set reset: %d", mode);
b.liudbc3f4b2024-06-25 18:22:24 +0800812 if(mode == GNSS_RESET_TYPE_HOT)
813 {
b.liud0ba7152024-06-19 14:47:21 +0800814 gnss_set_result = gnss_8122_reset(fd, 3);
b.liudbc3f4b2024-06-25 18:22:24 +0800815 }
816 else if(mode == GNSS_RESET_TYPE_WARM)
817 {
b.liud0ba7152024-06-19 14:47:21 +0800818 gnss_set_result = gnss_8122_reset(fd, 2);
b.liudbc3f4b2024-06-25 18:22:24 +0800819 }
820 else if(mode == GNSS_RESET_TYPE_COLD)
821 {
b.liud0ba7152024-06-19 14:47:21 +0800822 gnss_set_result = gnss_8122_reset(fd, 1);
b.liudbc3f4b2024-06-25 18:22:24 +0800823 }
824 else
825 {
b.liud0ba7152024-06-19 14:47:21 +0800826 gnss_set_result = GNSS_ERR_ARG;
827 goto set_fail;
828 }
b.liudbc3f4b2024-06-25 18:22:24 +0800829 if(gnss_set_result != GNSS_ERR_OK)
830 {
b.liu5f950c52024-06-15 20:13:12 +0800831 goto set_fail;
832 }
833 should_wait_rsp = FALSE;
b.liudbc3f4b2024-06-25 18:22:24 +0800834 }
835 else if(memcmp(cmd, "$SYSCFG", 7) == 0) // $SYSCFG,<mode>
836 {
b.liud0ba7152024-06-19 14:47:21 +0800837 uint32 mode = 0;
838 mode = (uint32)atoi(cmd + 8);
839 uint32 new_mode = 0;
yq.wang51d17352024-09-23 04:54:46 -0700840 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 +0800841 {
b.liud0ba7152024-06-19 14:47:21 +0800842 gnss_set_result = GNSS_ERR_ARG;
843 goto set_fail;
844 }
845
b.liudbc3f4b2024-06-25 18:22:24 +0800846 if(mode & GNSS_SET_SYSCFG_GPS) // GPS
847 {
b.liud0ba7152024-06-19 14:47:21 +0800848 new_mode |= 0x00000001;
849 }
b.liudbc3f4b2024-06-25 18:22:24 +0800850 if(mode & GNSS_SET_SYSCFG_BDS) // BDS
851 {
yq.wang51d17352024-09-23 04:54:46 -0700852 new_mode |= 0x00000004;
b.liud0ba7152024-06-19 14:47:21 +0800853 }
b.liudbc3f4b2024-06-25 18:22:24 +0800854 if(mode & GNSS_SET_SYSCFG_GLO) // GLO
855 {
yq.wang51d17352024-09-23 04:54:46 -0700856 new_mode |= 0x00000002;
b.liud0ba7152024-06-19 14:47:21 +0800857 }
b.liudbc3f4b2024-06-25 18:22:24 +0800858 if(mode & GNSS_SET_SYSCFG_GAL) // GAL
859 {
b.liud0ba7152024-06-19 14:47:21 +0800860 new_mode |= 0x00000010;
861 }
yq.wang51d17352024-09-23 04:54:46 -0700862 if(mode & GNSS_SET_SYSCFG_SBAS) // SBAS
863 {
864 new_mode |= 0x00000020;
865 }
866 if(mode & GNSS_SET_SYSCFG_QZSS) // QZSS
867 {
868 new_mode |= 0x00000040;
869 }
b.liud0ba7152024-06-19 14:47:21 +0800870
871 gnss_set_result = gnss_8122_syscfg(fd, new_mode);
b.liudbc3f4b2024-06-25 18:22:24 +0800872 if(gnss_set_result != GNSS_ERR_OK)
873 {
b.liud0ba7152024-06-19 14:47:21 +0800874 goto set_fail;
875 }
876 should_wait_rsp = TRUE;
b.liudbc3f4b2024-06-25 18:22:24 +0800877 }
yq.wang6a3437f2024-07-27 02:57:20 -0700878 else if(memcmp(cmd, "$FREQCFG", 8) == 0) //$FREQCFG,<freq>
879 {
880 uint32 freq = 0;
881 freq = (uint32)atoi(cmd + 9);
882 LOGD("set freq: %d", freq);
883 if((GNSS_SET_FREQCFG_1 != freq) && (GNSS_SET_FREQCFG_2 != freq) && (GNSS_SET_FREQCFG_5 != freq))
884 {
885 gnss_set_result = GNSS_ERR_ARG;
886 goto set_fail;
887 }
888 gnss_set_result = gnss_8122_freqcfg(fd, (uint8)freq);
889 if(gnss_set_result != GNSS_ERR_OK)
890 {
891 goto set_fail;
892 }
yq.wang012b6522024-09-12 02:36:53 -0700893
894 gnss_set_result = gnss_8122_cfg_save(fd);
yq.wang6a3437f2024-07-27 02:57:20 -0700895 should_wait_rsp = TRUE;
896 }
b.liudbc3f4b2024-06-25 18:22:24 +0800897 else if(memcmp(cmd, "$MSGCFG", 7) == 0) // $MSGCFG,<mode>,<rate>
898 {
b.liud0ba7152024-06-19 14:47:21 +0800899 uint32 mode;
900 int rate;
b.liudbc3f4b2024-06-25 18:22:24 +0800901 if(2 == sscanf(cmd, "$MSGCFG,%d,%d", &mode, &rate))
902 {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700903 LOGD("set msgcfg: %d, %d", mode, rate);
b.liud0ba7152024-06-19 14:47:21 +0800904 int time = rate / 1000; // s
b.liudbc3f4b2024-06-25 18:22:24 +0800905 if(time < 0)
906 {
b.liud0ba7152024-06-19 14:47:21 +0800907 gnss_set_result = GNSS_ERR_ARG;
908 goto set_fail;
909 }
910
911 if(((GNSS_SET_MSGCFG_RMC | GNSS_SET_MSGCFG_VTG | GNSS_SET_MSGCFG_GGA | GNSS_SET_MSGCFG_GSA
b.liudbc3f4b2024-06-25 18:22:24 +0800912 | GNSS_SET_MSGCFG_GRS | GNSS_SET_MSGCFG_GSV | GNSS_SET_MSGCFG_GLL | GNSS_SET_MSGCFG_ZDA
913 | GNSS_SET_MSGCFG_GST | GNSS_SET_MSGCFG_TXT) & mode) != mode)
914 {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700915 LOGD("msgcfg not support mode");
b.liud0ba7152024-06-19 14:47:21 +0800916 gnss_set_result = GNSS_ERR_ARG;
917 goto set_fail;
918 }
919
b.liudbc3f4b2024-06-25 18:22:24 +0800920 if(mode & GNSS_SET_MSGCFG_RMC)
921 {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700922 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x05, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800923 if(gnss_set_result != GNSS_ERR_OK)
924 {
b.liud0ba7152024-06-19 14:47:21 +0800925 goto set_fail;
926 }
927 }
928
b.liudbc3f4b2024-06-25 18:22:24 +0800929 if(mode & GNSS_SET_MSGCFG_VTG)
930 {
b.liud0ba7152024-06-19 14:47:21 +0800931 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x06, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800932 if(gnss_set_result != GNSS_ERR_OK)
933 {
b.liud0ba7152024-06-19 14:47:21 +0800934 goto set_fail;
935 }
936 }
937
b.liudbc3f4b2024-06-25 18:22:24 +0800938 if(mode & GNSS_SET_MSGCFG_GGA)
939 {
b.liud0ba7152024-06-19 14:47:21 +0800940 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x00, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800941 if(gnss_set_result != GNSS_ERR_OK)
942 {
b.liud0ba7152024-06-19 14:47:21 +0800943 goto set_fail;
944 }
945 }
946
b.liudbc3f4b2024-06-25 18:22:24 +0800947 if(mode & GNSS_SET_MSGCFG_GSA)
948 {
b.liud0ba7152024-06-19 14:47:21 +0800949 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x02, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800950 if(gnss_set_result != GNSS_ERR_OK)
951 {
b.liud0ba7152024-06-19 14:47:21 +0800952 goto set_fail;
953 }
954 }
955
b.liudbc3f4b2024-06-25 18:22:24 +0800956 if(mode & GNSS_SET_MSGCFG_GRS)
957 {
b.liud0ba7152024-06-19 14:47:21 +0800958 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x03, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800959 if(gnss_set_result != GNSS_ERR_OK)
960 {
b.liud0ba7152024-06-19 14:47:21 +0800961 goto set_fail;
962 }
963 }
964
b.liudbc3f4b2024-06-25 18:22:24 +0800965 if(mode & GNSS_SET_MSGCFG_GSV)
966 {
b.liud0ba7152024-06-19 14:47:21 +0800967 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x04, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800968 if(gnss_set_result != GNSS_ERR_OK)
969 {
b.liud0ba7152024-06-19 14:47:21 +0800970 goto set_fail;
971 }
972 }
973
b.liudbc3f4b2024-06-25 18:22:24 +0800974 if(mode & GNSS_SET_MSGCFG_GLL)
975 {
b.liud0ba7152024-06-19 14:47:21 +0800976 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x01, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800977 if(gnss_set_result != GNSS_ERR_OK)
978 {
b.liud0ba7152024-06-19 14:47:21 +0800979 goto set_fail;
980 }
981 }
982
b.liudbc3f4b2024-06-25 18:22:24 +0800983 if(mode & GNSS_SET_MSGCFG_ZDA)
984 {
b.liud0ba7152024-06-19 14:47:21 +0800985 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x07, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800986 if(gnss_set_result != GNSS_ERR_OK)
987 {
b.liud0ba7152024-06-19 14:47:21 +0800988 goto set_fail;
989 }
990 }
991
b.liudbc3f4b2024-06-25 18:22:24 +0800992 if(mode & GNSS_SET_MSGCFG_GST)
993 {
b.liud0ba7152024-06-19 14:47:21 +0800994 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x08, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800995 if(gnss_set_result != GNSS_ERR_OK)
996 {
b.liud0ba7152024-06-19 14:47:21 +0800997 goto set_fail;
998 }
999 }
1000
b.liudbc3f4b2024-06-25 18:22:24 +08001001 if(mode & GNSS_SET_MSGCFG_TXT)
1002 {
b.liud0ba7152024-06-19 14:47:21 +08001003 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x20, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001004 if(gnss_set_result != GNSS_ERR_OK)
1005 {
b.liud0ba7152024-06-19 14:47:21 +08001006 goto set_fail;
1007 }
1008 }
b.liudbc3f4b2024-06-25 18:22:24 +08001009 }
1010 else
1011 {
b.liud0ba7152024-06-19 14:47:21 +08001012 gnss_set_result = GNSS_ERR_ARG;
1013 goto set_fail;
1014 }
1015
1016 should_wait_rsp = TRUE;
b.liudbc3f4b2024-06-25 18:22:24 +08001017 }
yq.wang9dd771b2024-09-13 23:38:40 -07001018 else if(memcmp(cmd, "$AGPSCFG", 8) == 0) // $AGPSCFG,<host>,<id>,<passwd>
1019 {
1020 char host[GNSS_AGPS_LEN_MAX] = {0};
1021 char id[GNSS_AGPS_LEN_MAX] = {0};
1022 char passwd[GNSS_AGPS_LEN_MAX] = {0};
1023 if(3 == sscanf(cmd, "$AGPSCFG,%[^,],%[^,],%s", host, id, passwd))
1024 {
1025 LOGD("agps: %s, %s, %s", host, id, passwd);
1026 memset(agps_info.host, 0x0, GNSS_AGPS_LEN_MAX);
1027 if(memcmp(host, "NULL", 4))
1028 {
1029 memcpy(agps_info.host, host, strlen(host));
1030 }
1031
1032 memset(agps_info.id, 0x0, GNSS_AGPS_LEN_MAX);
1033 if(memcmp(id, "NULL", 4))
1034 {
1035 memcpy(agps_info.id, id, strlen(id));
1036 }
1037
1038 memset(agps_info.passwd, 0x0, GNSS_AGPS_LEN_MAX);
1039 if(memcmp(passwd, "NULL", 4))
1040 {
1041 memcpy(agps_info.passwd, passwd, strlen(passwd));
1042 }
1043 }
1044 else
1045 {
1046 gnss_set_result = GNSS_ERR_ARG;
1047 goto set_fail;
1048 }
1049
1050 should_wait_rsp = FALSE;
1051 }
yq.wang51d17352024-09-23 04:54:46 -07001052 else if(memcmp(cmd, "$VER", 4) == 0) // $VER
b.liudbc3f4b2024-06-25 18:22:24 +08001053 {
yq.wang51d17352024-09-23 04:54:46 -07001054 gnss_set_cmd_rsp = (char *)cmd_rsp;
1055 gnss_cmd_rsp_len = cmd_rsp_len;
1056 gnss_set_result = gnss_8122_ver(fd);
b.liudbc3f4b2024-06-25 18:22:24 +08001057 if(gnss_set_result != GNSS_ERR_OK)
1058 {
b.liud0ba7152024-06-19 14:47:21 +08001059 goto set_fail;
1060 }
yq.wang51d17352024-09-23 04:54:46 -07001061 }
1062 else if(memcmp(cmd, "$MINEL", 6) == 0) // $MINEL,<elev>
1063 {
1064 uint32 elev = 0;
1065 elev = (uint32)atoi(cmd + 7);
1066 LOGD("set minel: %d", elev);
1067 if(GNSS_SET_EVEL_5 == elev)
1068 {
1069 uint8 elev_buff[8] = {0x35, 0xFA, 0x8E, 0x3C, 0xC2, 0xB8, 0xB2, 0x3D};
1070 gnss_set_result = gnss_8122_minel(fd, elev_buff);
1071 if(gnss_set_result != GNSS_ERR_OK)
1072 {
1073 goto set_fail;
1074 }
1075 }
1076 else if(GNSS_SET_EVEL_15 == elev)
1077 {
1078 uint8 elev_buff[8] = {0x35, 0xFA, 0x8E, 0x3C, 0x92, 0x0A, 0x86, 0x3E};
1079 gnss_set_result = gnss_8122_minel(fd, elev_buff);
1080 if(gnss_set_result != GNSS_ERR_OK)
1081 {
1082 goto set_fail;
1083 }
1084 }
1085 else
1086 {
1087 gnss_set_result = GNSS_ERR_ARG;
1088 goto set_fail;
1089 }
1090 }
1091 else if(memcmp(cmd, "$PZ90CONV", 9) == 0) // $PZ90CONV,local,ref
1092 {
1093 int local = 0;
1094 int ref = 0;
1095 uint8 buff[44] = {0x00, 0x00, 0x00, 0x00, 0xA6, 0x54, 0x58, 0x41,
1096 0xCD, 0x8C, 0x8F, 0xCC, 0x56, 0x77, 0x6B, 0x3F,
1097 0x8F, 0xC2, 0xF5, 0xBC, 0x0A, 0xD7, 0x23, 0xBC,
1098 0x00, 0x00, 0x00, 0x00, 0x30, 0x62, 0x9F, 0x37,
1099 0x28, 0x29, 0x30, 0xB8, 0xBD, 0x37, 0x06, 0x36,
1100 0x00, 0x00, 0x00, 0x00};
1101
1102 if(2 == sscanf(cmd, "$PZ90CONV,%d,%d", &local, &ref))
1103 {
1104 LOGD("set pz90conv: %d, %d", local, ref);
1105
1106
1107 if(local == 1 && ref == 0) //PZ90
1108 {
1109 //
1110 }
1111 else if(local == 0 && ref == 0)
1112 {
1113 memset(buff, 0x00, 44);
1114 }
1115 else
1116 {
1117 gnss_set_result = GNSS_ERR_UNSUPPORT;
1118 goto set_fail;
1119 }
1120 }
1121 else
1122 {
1123 gnss_set_result = GNSS_ERR_ARG;
1124 goto set_fail;
1125 }
1126
1127 gnss_set_result = gnss_8122_PZ90CONV(fd, buff);
1128 if(gnss_set_result != GNSS_ERR_OK)
1129 {
1130 goto set_fail;
1131 }
b.liudbc3f4b2024-06-25 18:22:24 +08001132 }
1133 else if(memcmp(cmd, "$NMEACFG", 8) == 0) // $NMEACFG,<ver>
1134 {
b.liud0ba7152024-06-19 14:47:21 +08001135#if 0
1136 gnss_memaver_type_enum version = (gnss_memaver_type_enum)atoi(cmd + 9);
b.liudbc3f4b2024-06-25 18:22:24 +08001137 if(version == GNSS_MEMAVER_TYPE_3_0)
1138 {
b.liud0ba7152024-06-19 14:47:21 +08001139 gnss_set_result = gnss_8122_nmeaver(fd, 1);
b.liudbc3f4b2024-06-25 18:22:24 +08001140 }
1141 else if(version == GNSS_MEMAVER_TYPE_4_0)
1142 {
b.liud0ba7152024-06-19 14:47:21 +08001143 gnss_set_result = gnss_8122_nmeaver(fd, 2);
b.liudbc3f4b2024-06-25 18:22:24 +08001144 }
1145 else if(version == GNSS_MEMAVER_TYPE_4_1)
1146 {
b.liud0ba7152024-06-19 14:47:21 +08001147 gnss_set_result = gnss_8122_nmeaver(fd, 3);
b.liudbc3f4b2024-06-25 18:22:24 +08001148 }
1149 else
1150 {
b.liud0ba7152024-06-19 14:47:21 +08001151 gnss_set_result = GNSS_ERR_ARG;
1152 goto set_fail;
1153 }
b.liudbc3f4b2024-06-25 18:22:24 +08001154 if(gnss_set_result != GNSS_ERR_OK)
1155 {
b.liud0ba7152024-06-19 14:47:21 +08001156 goto set_fail;
1157 }
1158 should_wait_rsp = FALSE;
1159#else
1160 gnss_set_result = GNSS_ERR_UNSUPPORT;
1161 goto set_fail;
1162#endif
b.liu5f950c52024-06-15 20:13:12 +08001163 }
1164 else
1165 {
1166 LOGW("Unknown cmd:%s", cmd);
1167 gnss_set_result = GNSS_ERR_UNSUPPORT;
1168 goto set_fail;
1169 }
1170
b.liudbc3f4b2024-06-25 18:22:24 +08001171 set_success:
1172 if(should_wait_rsp)
1173 {
b.liud0ba7152024-06-19 14:47:21 +08001174 setting_waitting = TRUE;
b.liu5f950c52024-06-15 20:13:12 +08001175 pthread_mutex_lock(&read_mutex);
1176 pthread_cond_wait(&read_cond, &read_mutex);
1177 pthread_mutex_unlock(&read_mutex);
b.liudbc3f4b2024-06-25 18:22:24 +08001178 }
1179 else
1180 {
b.liu5f950c52024-06-15 20:13:12 +08001181 mbtk_timer_clear();
1182 }
1183
yq.wang51d17352024-09-23 04:54:46 -07001184 if(gnss_set_cmd_rsp != NULL)
1185 {
1186 gnss_set_cmd_rsp = NULL;
1187 gnss_cmd_rsp_len = 0;
1188 }
b.liu5f950c52024-06-15 20:13:12 +08001189 setting_busy = FALSE;
1190 return gnss_set_result;
b.liudbc3f4b2024-06-25 18:22:24 +08001191 set_fail:
yq.wang51d17352024-09-23 04:54:46 -07001192 if(gnss_set_cmd_rsp != NULL)
1193 {
1194 gnss_set_cmd_rsp = NULL;
1195 gnss_cmd_rsp_len = 0;
1196 }
b.liu5f950c52024-06-15 20:13:12 +08001197 setting_busy = FALSE;
1198 mbtk_timer_clear();
1199 return gnss_set_result;
1200 }
b.liuf9fbfa12024-06-14 15:53:59 +08001201}
1202
b.liu5f950c52024-06-15 20:13:12 +08001203