blob: de0a5faaba5c1b9cf4e8b0c806be7b2ec088f606 [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
yq.wang36222352024-11-06 03:31:24 -0800576static gnss_err_enum gnss_8122_ephsave(int fd, uint8 status)
577{
578 uint8 buff[GNSS_PACK_BUFF_SIZE];
579 LOGD("EPHSAVE");
580 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_EPHSAVE, 1, (uint8*)(&status), buff, sizeof(buff));
581 if(len <= 0)
582 {
583 LOGE("pack_create() fail.");
584 return GNSS_ERR_ARG;
585 }
586 log_hex("PACK", buff, len);
587 gnss_write(fd, buff, len);
588 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_EPHSAVE);
589 return GNSS_ERR_OK;
590}
591
592
b.liuf9fbfa12024-06-14 15:53:59 +0800593int gnss_8122_dev_open()
594{
yq.wang5fe6e612024-07-17 01:18:12 -0700595 //return mbtk_gpio_value_set(GNSS_POWER_GPIO, MBTK_GPIO_DIRECT_OUT, 1);
596 system("i2cset -y -f 2 0x31 0x15 0x86");
597 return 0;
b.liuf9fbfa12024-06-14 15:53:59 +0800598}
599
b.liu978f5432024-07-01 18:04:18 +0800600int gnss_8122_dev_close(int fd)
b.liuf9fbfa12024-06-14 15:53:59 +0800601{
yq.wang5fe6e612024-07-17 01:18:12 -0700602 //return mbtk_gpio_value_set(GNSS_POWER_GPIO, MBTK_GPIO_DIRECT_OUT, 0);
603 system("i2cset -y -f 2 0x31 0x15 0x00");
604 return 0;
b.liuf9fbfa12024-06-14 15:53:59 +0800605}
606
607int gnss_8122_open(const char *dev)
608{
609 pthread_mutex_init(&read_mutex, NULL);
610 pthread_cond_init(&read_cond, NULL);
611 return gnss_port_open(dev, O_RDWR | O_NONBLOCK | O_NOCTTY, UART_BITRATE_NMEA_DEF_FW, TRUE);
612}
613
614int gnss_8122_close(int fd)
615{
616 pthread_mutex_destroy(&read_mutex);
617 pthread_cond_destroy(&read_cond);
618 return gnss_port_close(fd);
619}
620
yq.wang36222352024-11-06 03:31:24 -0800621int gnss_8122_init_set(int fd)
622{
623 sleep(1); //wait 8122 ready...
624 gnss_8122_ephsave(fd, (uint8)HD8122_EPHSAVE_STATUS_DISABLE);
625 gnss_8122_cfg_save(fd);
626 return GNSS_ERR_OK;
627}
628
b.liudbc3f4b2024-06-25 18:22:24 +0800629int gnss_8122_fw_dl(int fd, const char *fw_name, const char *dev)
b.liuf9fbfa12024-06-14 15:53:59 +0800630{
b.liudbc3f4b2024-06-25 18:22:24 +0800631 int uart_fd = OpenUart(dev);//PORT_NAME234
632 if (uart_fd < 0)
633 {
634 LOGE("open uart failed %d[%d]", uart_fd, errno);
635 return GNSS_ERR_OPEN_DEV;
636 }
637
yq.wangaf363dc2024-08-06 20:16:00 -0700638 uint8_t fw_path[256] = {0};
639 memset(fw_path, 0x0, 256);
640 if(memcmp(fw_name, "gp_gl_ga", 8) == 0)
641 {
642 memcpy(fw_path, GNSS_FW_GQALS_PATH, strlen(GNSS_FW_GQALS_PATH));
643 }
644 else if(memcmp(fw_name, "gp_bd_ga", 8) == 0)
645 {
646 memcpy(fw_path, GNSS_FW_GAQBS_PATH, strlen(GNSS_FW_GAQBS_PATH));
647 }
648 else
649 {
650 LOGE("fw dl param error");
651 return GNSS_ERR_ARG;
652 }
653
b.liudbc3f4b2024-06-25 18:22:24 +0800654 uint8_t *g_bin_buff = (uint8_t*)malloc(500*1024);
655 if(g_bin_buff == NULL) {
656 LOGE("malloc() fail : %d", errno);
657 return GNSS_ERR_UNKNOWN;
658 }
659 memset(g_bin_buff, 0, 500*1024);
yq.wangaf363dc2024-08-06 20:16:00 -0700660 uint32_t len = read_bin_file(fw_path, g_bin_buff);
b.liudbc3f4b2024-06-25 18:22:24 +0800661 if (len <= 0)
662 {
663 LOGE("Read file failed ,len = %d", len);
yq.wangaf363dc2024-08-06 20:16:00 -0700664 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800665 }
yq.wangaf363dc2024-08-06 20:16:00 -0700666 if(gnss_8122_dev_open())
667 {
b.liudbc3f4b2024-06-25 18:22:24 +0800668 LOGE("open gnss device fail:%d", errno);
yq.wangaf363dc2024-08-06 20:16:00 -0700669 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800670 }
yq.wangaf363dc2024-08-06 20:16:00 -0700671
672 if(gnss_fwdl_enable() < 0)
673 {
674 LOGE("gnss_fwdl_enable fail");
675 goto error;
676 }
677
b.liudbc3f4b2024-06-25 18:22:24 +0800678 int ret = fw_update_boot(uart_fd, g_bin_buff, len);
b.liudbc3f4b2024-06-25 18:22:24 +0800679 if (ret < 0)
680 {
681 LOGE("fw_update_boot() fail : %d", ret);
yq.wangaf363dc2024-08-06 20:16:00 -0700682 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800683 }
b.liudbc3f4b2024-06-25 18:22:24 +0800684 if(ret == HDBD_UPG_SUCESS)
685 {
686 LOGD("upgrade sucess!");
b.liudbc3f4b2024-06-25 18:22:24 +0800687 }
688 else
689 {
690 LOGD("upgrade FAIL, fail style:%d", ret);
yq.wangaf363dc2024-08-06 20:16:00 -0700691 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800692 }
yq.wangaf363dc2024-08-06 20:16:00 -0700693
694 if(gnss_8122_dev_close(0))
695 {
696 LOGE("close gnss device fail:%d", errno);
697 goto error;
698 }
699 free(g_bin_buff);
700 g_bin_buff = NULL;
701 uart_close(uart_fd);
702 return GNSS_ERR_OK;
703error:
704 if(g_bin_buff)
705 {
706 free(g_bin_buff);
707 g_bin_buff = NULL;
708 }
709 if(uart_fd > 0)
710 {
711 uart_close(uart_fd);
712 uart_fd = -1;
713 }
714 return GNSS_ERR_DL_FW;
b.liuf9fbfa12024-06-14 15:53:59 +0800715}
716
yq.wang99db6f52024-09-12 01:58:48 -0700717gnss_err_enum gnss_8122_agnss_get_eph(const char *param)
718{
719 if(param == NULL)
720 {
721 LOGD("gnss_8122_agnss_get_eph param is NULL");
722 return GNSS_ERR_ARG;
723 }
724
725 int eph_type = 0;
726 int alam_flag = 0;
727 int ret = -1;
728 char url[256] = {0};
729 if(2 == sscanf(param, "%d,%d", &eph_type, &alam_flag))
730 {
731 if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS)
732 {
733 snprintf(url, 256,AGNSS_URL, AGNSS_EPH_GPS);
734 }
735 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_BDS)
736 {
737 snprintf(url, 256,AGNSS_URL, AGNSS_EPH_BDS);
738 }
739 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GLO)
740 {
741 snprintf(url, 256,AGNSS_URL, AGNSS_EPH_GLO);
742 }
743 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS_BDS)
744 {
745 snprintf(url, 256,AGNSS_URL, AGNSS_EPH_GPS_BDS);
746 }
747 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS_GLO)
748 {
749 snprintf(url, 256,AGNSS_URL, AGNSS_EPH_GPS_GLO);
750 }
yq.wang9dd771b2024-09-13 23:38:40 -0700751 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_CFG)
752 {
753 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",
754 strlen(agps_info.id) > 0 ? agps_info.id : "yikecs1",
755 strlen(agps_info.passwd) > 0 ? agps_info.passwd : "Z38w5urAuawubTxi");
756 }
yq.wang99db6f52024-09-12 01:58:48 -0700757 else
758 {
759 return GNSS_ERR_UNSUPPORT;
760 }
761
762 ret = eph_data_from_http_get(url, AGNSS_EPH_FILE_PATH);
763 if (ret < 0)
764 {
765 LOGD("eph_data_from_http_get fail");
766 return GNSS_ERR_EPH_GET_FAIL;
767 }
768 LOGD("get_eph_data_from_http success");
769 }
770 else
771 {
772 LOGD("param num error");
773 return GNSS_ERR_ARG;
774 }
775 return GNSS_ERR_OK;
776}
777
778
779gnss_err_enum gnss_8122_agnss_inject(int fd)
780{
781 int ret = 0;
782 hd_set_gnss_dev_fd(fd);
783 ret = hd_agnss_inject(AGNSS_EPH_FILE_PATH, 0, 0, 0, 0, NULL);
784 hd_set_gnss_dev_fd(-1);
785 if(ret < 0)
786 {
787 LOGD("hd_agnss_inject fail");
788 return GNSS_ERR_EPH_INJECT_FAIL;
789 }
790 return GNSS_ERR_OK;
791}
792
b.liu5f950c52024-06-15 20:13:12 +0800793void gnss_8122_set_cb(const void *data, int data_len)
794{
795 const char *buff = (const char*)data;
b.liudbc3f4b2024-06-25 18:22:24 +0800796 if(setting_busy) // Has setting cmd process.
797 {
b.liu5f950c52024-06-15 20:13:12 +0800798 gnss_cmd_rsp_process(data, data_len);
799 }
yq.wang99db6f52024-09-12 01:58:48 -0700800
yq.wang9dd771b2024-09-13 23:38:40 -0700801#if 0
yq.wang99db6f52024-09-12 01:58:48 -0700802 if(hd_get_eph_inject_status() == HD_EPH_INJECT_STATUS_WAIT_RETURN)
803 {
804 log_hex("EPH_RSP", (const char*)data, data_len);
805 int ret = hd_eph_inject_result_check(data, data_len);
806 if(ret < 0)
807 {
808 hd_set_eph_inject_status(HD_EPH_INJECT_STATUS_FAIL);
809 }
810 else
811 {
812 hd_set_eph_inject_status(HD_EPH_INJECT_STATUS_SUCCESS);
yq.wang9dd771b2024-09-13 23:38:40 -0700813 }
yq.wang99db6f52024-09-12 01:58:48 -0700814 }
yq.wang9dd771b2024-09-13 23:38:40 -0700815#endif
b.liu5f950c52024-06-15 20:13:12 +0800816}
b.liuf9fbfa12024-06-14 15:53:59 +0800817
818gnss_err_enum gnss_8122_set(int fd, const char *cmd, void *cmd_rsp, int cmd_rsp_len)
819{
b.liudbc3f4b2024-06-25 18:22:24 +0800820 if(setting_busy)
821 {
b.liu5f950c52024-06-15 20:13:12 +0800822 return GNSS_ERR_SET_BUSY;
b.liudbc3f4b2024-06-25 18:22:24 +0800823 }
824 else
825 {
b.liu5f950c52024-06-15 20:13:12 +0800826 bool should_wait_rsp = TRUE;
827 setting_busy = TRUE;
828 gnss_set_rsp_ptr = cmd_rsp;
829 gnss_set_result = GNSS_ERR_OK;
b.liud0ba7152024-06-19 14:47:21 +0800830 msg_init();
b.liu5f950c52024-06-15 20:13:12 +0800831 mbtk_timer_set(gnss_set_timer_cb, GNSS_SET_TIMEOUT);
832
b.liudbc3f4b2024-06-25 18:22:24 +0800833 if(memcmp(cmd, "$RESET", 6) == 0) // $RESET,<mode>
834 {
b.liud0ba7152024-06-19 14:47:21 +0800835 gnss_reset_type_enum mode = (gnss_reset_type_enum)atoi(cmd + 7);
yq.wang1ddd1fd2024-07-25 23:00:14 -0700836 LOGD("set reset: %d", mode);
b.liudbc3f4b2024-06-25 18:22:24 +0800837 if(mode == GNSS_RESET_TYPE_HOT)
838 {
b.liud0ba7152024-06-19 14:47:21 +0800839 gnss_set_result = gnss_8122_reset(fd, 3);
b.liudbc3f4b2024-06-25 18:22:24 +0800840 }
841 else if(mode == GNSS_RESET_TYPE_WARM)
842 {
b.liud0ba7152024-06-19 14:47:21 +0800843 gnss_set_result = gnss_8122_reset(fd, 2);
b.liudbc3f4b2024-06-25 18:22:24 +0800844 }
845 else if(mode == GNSS_RESET_TYPE_COLD)
846 {
b.liud0ba7152024-06-19 14:47:21 +0800847 gnss_set_result = gnss_8122_reset(fd, 1);
b.liudbc3f4b2024-06-25 18:22:24 +0800848 }
849 else
850 {
b.liud0ba7152024-06-19 14:47:21 +0800851 gnss_set_result = GNSS_ERR_ARG;
852 goto set_fail;
853 }
b.liudbc3f4b2024-06-25 18:22:24 +0800854 if(gnss_set_result != GNSS_ERR_OK)
855 {
b.liu5f950c52024-06-15 20:13:12 +0800856 goto set_fail;
857 }
858 should_wait_rsp = FALSE;
b.liudbc3f4b2024-06-25 18:22:24 +0800859 }
860 else if(memcmp(cmd, "$SYSCFG", 7) == 0) // $SYSCFG,<mode>
861 {
b.liud0ba7152024-06-19 14:47:21 +0800862 uint32 mode = 0;
863 mode = (uint32)atoi(cmd + 8);
864 uint32 new_mode = 0;
yq.wang51d17352024-09-23 04:54:46 -0700865 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 +0800866 {
b.liud0ba7152024-06-19 14:47:21 +0800867 gnss_set_result = GNSS_ERR_ARG;
868 goto set_fail;
869 }
870
b.liudbc3f4b2024-06-25 18:22:24 +0800871 if(mode & GNSS_SET_SYSCFG_GPS) // GPS
872 {
b.liud0ba7152024-06-19 14:47:21 +0800873 new_mode |= 0x00000001;
874 }
b.liudbc3f4b2024-06-25 18:22:24 +0800875 if(mode & GNSS_SET_SYSCFG_BDS) // BDS
876 {
yq.wang51d17352024-09-23 04:54:46 -0700877 new_mode |= 0x00000004;
b.liud0ba7152024-06-19 14:47:21 +0800878 }
b.liudbc3f4b2024-06-25 18:22:24 +0800879 if(mode & GNSS_SET_SYSCFG_GLO) // GLO
880 {
yq.wang51d17352024-09-23 04:54:46 -0700881 new_mode |= 0x00000002;
b.liud0ba7152024-06-19 14:47:21 +0800882 }
b.liudbc3f4b2024-06-25 18:22:24 +0800883 if(mode & GNSS_SET_SYSCFG_GAL) // GAL
884 {
b.liud0ba7152024-06-19 14:47:21 +0800885 new_mode |= 0x00000010;
886 }
yq.wang51d17352024-09-23 04:54:46 -0700887 if(mode & GNSS_SET_SYSCFG_SBAS) // SBAS
888 {
889 new_mode |= 0x00000020;
890 }
891 if(mode & GNSS_SET_SYSCFG_QZSS) // QZSS
892 {
893 new_mode |= 0x00000040;
894 }
b.liud0ba7152024-06-19 14:47:21 +0800895
896 gnss_set_result = gnss_8122_syscfg(fd, new_mode);
b.liudbc3f4b2024-06-25 18:22:24 +0800897 if(gnss_set_result != GNSS_ERR_OK)
898 {
b.liud0ba7152024-06-19 14:47:21 +0800899 goto set_fail;
900 }
901 should_wait_rsp = TRUE;
b.liudbc3f4b2024-06-25 18:22:24 +0800902 }
yq.wang6a3437f2024-07-27 02:57:20 -0700903 else if(memcmp(cmd, "$FREQCFG", 8) == 0) //$FREQCFG,<freq>
904 {
905 uint32 freq = 0;
906 freq = (uint32)atoi(cmd + 9);
907 LOGD("set freq: %d", freq);
908 if((GNSS_SET_FREQCFG_1 != freq) && (GNSS_SET_FREQCFG_2 != freq) && (GNSS_SET_FREQCFG_5 != freq))
909 {
910 gnss_set_result = GNSS_ERR_ARG;
911 goto set_fail;
912 }
913 gnss_set_result = gnss_8122_freqcfg(fd, (uint8)freq);
914 if(gnss_set_result != GNSS_ERR_OK)
915 {
916 goto set_fail;
917 }
yq.wang012b6522024-09-12 02:36:53 -0700918
919 gnss_set_result = gnss_8122_cfg_save(fd);
yq.wang6a3437f2024-07-27 02:57:20 -0700920 should_wait_rsp = TRUE;
921 }
b.liudbc3f4b2024-06-25 18:22:24 +0800922 else if(memcmp(cmd, "$MSGCFG", 7) == 0) // $MSGCFG,<mode>,<rate>
923 {
b.liud0ba7152024-06-19 14:47:21 +0800924 uint32 mode;
925 int rate;
b.liudbc3f4b2024-06-25 18:22:24 +0800926 if(2 == sscanf(cmd, "$MSGCFG,%d,%d", &mode, &rate))
927 {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700928 LOGD("set msgcfg: %d, %d", mode, rate);
b.liud0ba7152024-06-19 14:47:21 +0800929 int time = rate / 1000; // s
b.liudbc3f4b2024-06-25 18:22:24 +0800930 if(time < 0)
931 {
b.liud0ba7152024-06-19 14:47:21 +0800932 gnss_set_result = GNSS_ERR_ARG;
933 goto set_fail;
934 }
935
936 if(((GNSS_SET_MSGCFG_RMC | GNSS_SET_MSGCFG_VTG | GNSS_SET_MSGCFG_GGA | GNSS_SET_MSGCFG_GSA
b.liudbc3f4b2024-06-25 18:22:24 +0800937 | GNSS_SET_MSGCFG_GRS | GNSS_SET_MSGCFG_GSV | GNSS_SET_MSGCFG_GLL | GNSS_SET_MSGCFG_ZDA
938 | GNSS_SET_MSGCFG_GST | GNSS_SET_MSGCFG_TXT) & mode) != mode)
939 {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700940 LOGD("msgcfg not support mode");
b.liud0ba7152024-06-19 14:47:21 +0800941 gnss_set_result = GNSS_ERR_ARG;
942 goto set_fail;
943 }
944
b.liudbc3f4b2024-06-25 18:22:24 +0800945 if(mode & GNSS_SET_MSGCFG_RMC)
946 {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700947 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x05, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800948 if(gnss_set_result != GNSS_ERR_OK)
949 {
b.liud0ba7152024-06-19 14:47:21 +0800950 goto set_fail;
951 }
952 }
953
b.liudbc3f4b2024-06-25 18:22:24 +0800954 if(mode & GNSS_SET_MSGCFG_VTG)
955 {
b.liud0ba7152024-06-19 14:47:21 +0800956 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x06, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800957 if(gnss_set_result != GNSS_ERR_OK)
958 {
b.liud0ba7152024-06-19 14:47:21 +0800959 goto set_fail;
960 }
961 }
962
b.liudbc3f4b2024-06-25 18:22:24 +0800963 if(mode & GNSS_SET_MSGCFG_GGA)
964 {
b.liud0ba7152024-06-19 14:47:21 +0800965 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x00, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800966 if(gnss_set_result != GNSS_ERR_OK)
967 {
b.liud0ba7152024-06-19 14:47:21 +0800968 goto set_fail;
969 }
970 }
971
b.liudbc3f4b2024-06-25 18:22:24 +0800972 if(mode & GNSS_SET_MSGCFG_GSA)
973 {
b.liud0ba7152024-06-19 14:47:21 +0800974 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x02, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800975 if(gnss_set_result != GNSS_ERR_OK)
976 {
b.liud0ba7152024-06-19 14:47:21 +0800977 goto set_fail;
978 }
979 }
980
b.liudbc3f4b2024-06-25 18:22:24 +0800981 if(mode & GNSS_SET_MSGCFG_GRS)
982 {
b.liud0ba7152024-06-19 14:47:21 +0800983 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x03, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800984 if(gnss_set_result != GNSS_ERR_OK)
985 {
b.liud0ba7152024-06-19 14:47:21 +0800986 goto set_fail;
987 }
988 }
989
b.liudbc3f4b2024-06-25 18:22:24 +0800990 if(mode & GNSS_SET_MSGCFG_GSV)
991 {
b.liud0ba7152024-06-19 14:47:21 +0800992 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x04, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800993 if(gnss_set_result != GNSS_ERR_OK)
994 {
b.liud0ba7152024-06-19 14:47:21 +0800995 goto set_fail;
996 }
997 }
998
b.liudbc3f4b2024-06-25 18:22:24 +0800999 if(mode & GNSS_SET_MSGCFG_GLL)
1000 {
b.liud0ba7152024-06-19 14:47:21 +08001001 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x01, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001002 if(gnss_set_result != GNSS_ERR_OK)
1003 {
b.liud0ba7152024-06-19 14:47:21 +08001004 goto set_fail;
1005 }
1006 }
1007
b.liudbc3f4b2024-06-25 18:22:24 +08001008 if(mode & GNSS_SET_MSGCFG_ZDA)
1009 {
b.liud0ba7152024-06-19 14:47:21 +08001010 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x07, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001011 if(gnss_set_result != GNSS_ERR_OK)
1012 {
b.liud0ba7152024-06-19 14:47:21 +08001013 goto set_fail;
1014 }
1015 }
1016
b.liudbc3f4b2024-06-25 18:22:24 +08001017 if(mode & GNSS_SET_MSGCFG_GST)
1018 {
b.liud0ba7152024-06-19 14:47:21 +08001019 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x08, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001020 if(gnss_set_result != GNSS_ERR_OK)
1021 {
b.liud0ba7152024-06-19 14:47:21 +08001022 goto set_fail;
1023 }
1024 }
1025
b.liudbc3f4b2024-06-25 18:22:24 +08001026 if(mode & GNSS_SET_MSGCFG_TXT)
1027 {
b.liud0ba7152024-06-19 14:47:21 +08001028 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x20, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001029 if(gnss_set_result != GNSS_ERR_OK)
1030 {
b.liud0ba7152024-06-19 14:47:21 +08001031 goto set_fail;
1032 }
1033 }
b.liudbc3f4b2024-06-25 18:22:24 +08001034 }
1035 else
1036 {
b.liud0ba7152024-06-19 14:47:21 +08001037 gnss_set_result = GNSS_ERR_ARG;
1038 goto set_fail;
1039 }
1040
1041 should_wait_rsp = TRUE;
b.liudbc3f4b2024-06-25 18:22:24 +08001042 }
yq.wang9dd771b2024-09-13 23:38:40 -07001043 else if(memcmp(cmd, "$AGPSCFG", 8) == 0) // $AGPSCFG,<host>,<id>,<passwd>
1044 {
1045 char host[GNSS_AGPS_LEN_MAX] = {0};
1046 char id[GNSS_AGPS_LEN_MAX] = {0};
1047 char passwd[GNSS_AGPS_LEN_MAX] = {0};
1048 if(3 == sscanf(cmd, "$AGPSCFG,%[^,],%[^,],%s", host, id, passwd))
1049 {
1050 LOGD("agps: %s, %s, %s", host, id, passwd);
1051 memset(agps_info.host, 0x0, GNSS_AGPS_LEN_MAX);
1052 if(memcmp(host, "NULL", 4))
1053 {
1054 memcpy(agps_info.host, host, strlen(host));
1055 }
1056
1057 memset(agps_info.id, 0x0, GNSS_AGPS_LEN_MAX);
1058 if(memcmp(id, "NULL", 4))
1059 {
1060 memcpy(agps_info.id, id, strlen(id));
1061 }
1062
1063 memset(agps_info.passwd, 0x0, GNSS_AGPS_LEN_MAX);
1064 if(memcmp(passwd, "NULL", 4))
1065 {
1066 memcpy(agps_info.passwd, passwd, strlen(passwd));
1067 }
1068 }
1069 else
1070 {
1071 gnss_set_result = GNSS_ERR_ARG;
1072 goto set_fail;
1073 }
1074
1075 should_wait_rsp = FALSE;
1076 }
yq.wang51d17352024-09-23 04:54:46 -07001077 else if(memcmp(cmd, "$VER", 4) == 0) // $VER
b.liudbc3f4b2024-06-25 18:22:24 +08001078 {
yq.wang51d17352024-09-23 04:54:46 -07001079 gnss_set_cmd_rsp = (char *)cmd_rsp;
1080 gnss_cmd_rsp_len = cmd_rsp_len;
1081 gnss_set_result = gnss_8122_ver(fd);
b.liudbc3f4b2024-06-25 18:22:24 +08001082 if(gnss_set_result != GNSS_ERR_OK)
1083 {
b.liud0ba7152024-06-19 14:47:21 +08001084 goto set_fail;
1085 }
yq.wang51d17352024-09-23 04:54:46 -07001086 }
1087 else if(memcmp(cmd, "$MINEL", 6) == 0) // $MINEL,<elev>
1088 {
1089 uint32 elev = 0;
1090 elev = (uint32)atoi(cmd + 7);
1091 LOGD("set minel: %d", elev);
1092 if(GNSS_SET_EVEL_5 == elev)
1093 {
1094 uint8 elev_buff[8] = {0x35, 0xFA, 0x8E, 0x3C, 0xC2, 0xB8, 0xB2, 0x3D};
1095 gnss_set_result = gnss_8122_minel(fd, elev_buff);
1096 if(gnss_set_result != GNSS_ERR_OK)
1097 {
1098 goto set_fail;
1099 }
1100 }
1101 else if(GNSS_SET_EVEL_15 == elev)
1102 {
1103 uint8 elev_buff[8] = {0x35, 0xFA, 0x8E, 0x3C, 0x92, 0x0A, 0x86, 0x3E};
1104 gnss_set_result = gnss_8122_minel(fd, elev_buff);
1105 if(gnss_set_result != GNSS_ERR_OK)
1106 {
1107 goto set_fail;
1108 }
1109 }
1110 else
1111 {
1112 gnss_set_result = GNSS_ERR_ARG;
1113 goto set_fail;
1114 }
1115 }
1116 else if(memcmp(cmd, "$PZ90CONV", 9) == 0) // $PZ90CONV,local,ref
1117 {
1118 int local = 0;
1119 int ref = 0;
1120 uint8 buff[44] = {0x00, 0x00, 0x00, 0x00, 0xA6, 0x54, 0x58, 0x41,
1121 0xCD, 0x8C, 0x8F, 0xCC, 0x56, 0x77, 0x6B, 0x3F,
1122 0x8F, 0xC2, 0xF5, 0xBC, 0x0A, 0xD7, 0x23, 0xBC,
1123 0x00, 0x00, 0x00, 0x00, 0x30, 0x62, 0x9F, 0x37,
1124 0x28, 0x29, 0x30, 0xB8, 0xBD, 0x37, 0x06, 0x36,
1125 0x00, 0x00, 0x00, 0x00};
1126
1127 if(2 == sscanf(cmd, "$PZ90CONV,%d,%d", &local, &ref))
1128 {
1129 LOGD("set pz90conv: %d, %d", local, ref);
1130
1131
1132 if(local == 1 && ref == 0) //PZ90
1133 {
1134 //
1135 }
1136 else if(local == 0 && ref == 0)
1137 {
1138 memset(buff, 0x00, 44);
1139 }
1140 else
1141 {
1142 gnss_set_result = GNSS_ERR_UNSUPPORT;
1143 goto set_fail;
1144 }
1145 }
1146 else
1147 {
1148 gnss_set_result = GNSS_ERR_ARG;
1149 goto set_fail;
1150 }
1151
1152 gnss_set_result = gnss_8122_PZ90CONV(fd, buff);
1153 if(gnss_set_result != GNSS_ERR_OK)
1154 {
1155 goto set_fail;
1156 }
b.liudbc3f4b2024-06-25 18:22:24 +08001157 }
1158 else if(memcmp(cmd, "$NMEACFG", 8) == 0) // $NMEACFG,<ver>
1159 {
b.liud0ba7152024-06-19 14:47:21 +08001160#if 0
1161 gnss_memaver_type_enum version = (gnss_memaver_type_enum)atoi(cmd + 9);
b.liudbc3f4b2024-06-25 18:22:24 +08001162 if(version == GNSS_MEMAVER_TYPE_3_0)
1163 {
b.liud0ba7152024-06-19 14:47:21 +08001164 gnss_set_result = gnss_8122_nmeaver(fd, 1);
b.liudbc3f4b2024-06-25 18:22:24 +08001165 }
1166 else if(version == GNSS_MEMAVER_TYPE_4_0)
1167 {
b.liud0ba7152024-06-19 14:47:21 +08001168 gnss_set_result = gnss_8122_nmeaver(fd, 2);
b.liudbc3f4b2024-06-25 18:22:24 +08001169 }
1170 else if(version == GNSS_MEMAVER_TYPE_4_1)
1171 {
b.liud0ba7152024-06-19 14:47:21 +08001172 gnss_set_result = gnss_8122_nmeaver(fd, 3);
b.liudbc3f4b2024-06-25 18:22:24 +08001173 }
1174 else
1175 {
b.liud0ba7152024-06-19 14:47:21 +08001176 gnss_set_result = GNSS_ERR_ARG;
1177 goto set_fail;
1178 }
b.liudbc3f4b2024-06-25 18:22:24 +08001179 if(gnss_set_result != GNSS_ERR_OK)
1180 {
b.liud0ba7152024-06-19 14:47:21 +08001181 goto set_fail;
1182 }
1183 should_wait_rsp = FALSE;
1184#else
1185 gnss_set_result = GNSS_ERR_UNSUPPORT;
1186 goto set_fail;
1187#endif
b.liu5f950c52024-06-15 20:13:12 +08001188 }
1189 else
1190 {
1191 LOGW("Unknown cmd:%s", cmd);
1192 gnss_set_result = GNSS_ERR_UNSUPPORT;
1193 goto set_fail;
1194 }
1195
b.liudbc3f4b2024-06-25 18:22:24 +08001196 set_success:
1197 if(should_wait_rsp)
1198 {
b.liud0ba7152024-06-19 14:47:21 +08001199 setting_waitting = TRUE;
b.liu5f950c52024-06-15 20:13:12 +08001200 pthread_mutex_lock(&read_mutex);
1201 pthread_cond_wait(&read_cond, &read_mutex);
1202 pthread_mutex_unlock(&read_mutex);
b.liudbc3f4b2024-06-25 18:22:24 +08001203 }
1204 else
1205 {
b.liu5f950c52024-06-15 20:13:12 +08001206 mbtk_timer_clear();
1207 }
1208
yq.wang51d17352024-09-23 04:54:46 -07001209 if(gnss_set_cmd_rsp != NULL)
1210 {
1211 gnss_set_cmd_rsp = NULL;
1212 gnss_cmd_rsp_len = 0;
1213 }
b.liu5f950c52024-06-15 20:13:12 +08001214 setting_busy = FALSE;
1215 return gnss_set_result;
b.liudbc3f4b2024-06-25 18:22:24 +08001216 set_fail:
yq.wang51d17352024-09-23 04:54:46 -07001217 if(gnss_set_cmd_rsp != NULL)
1218 {
1219 gnss_set_cmd_rsp = NULL;
1220 gnss_cmd_rsp_len = 0;
1221 }
b.liu5f950c52024-06-15 20:13:12 +08001222 setting_busy = FALSE;
1223 mbtk_timer_clear();
1224 return gnss_set_result;
1225 }
b.liuf9fbfa12024-06-14 15:53:59 +08001226}
1227
b.liu5f950c52024-06-15 20:13:12 +08001228