blob: 34cda3293d3b149f6daca1db60b18697bcd1668b [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"
rx.xie9be080b2025-09-08 07:03:43 -070044#define GNSS_FW_8040_PATH "/lib/firmware/gnss8040_fw.bin"
b.liuf9fbfa12024-06-14 15:53:59 +080045
yq.wang99db6f52024-09-12 01:58:48 -070046//#define AGNSS_TEST_URL "http://aclientt.allystar.com:80/ephemeris/HD_GPS_BDS.hdb"
47#define AGNSS_URL "http://uagnss.allystar.com:80/ephemeris/%s?compid=yikecs1&token=Z38w5urAuawubTxi"
48#define AGNSS_INDIVIDUATION_URL_HEAD "http://cagnss.allystar.com/api/v1/eph/rt?"
49#define AGNSS_ALLSTAR_URL_HEAD "http://cagnss.allystar.com/api/v1/eph/rta?"
50#define AGNSS_EPH_FILE_PATH "/lib/firmware/eph_data.txt"
51
52#define AGNSS_EPH_GPS "HD_GPS.hdb"
53#define AGNSS_EPH_BDS "HD_BDS.hdb"
54#define AGNSS_EPH_GLO "HD_GLO.hdb"
55#define AGNSS_EPH_GPS_BDS "HD_GPS_BDS.hdb"
56#define AGNSS_EPH_GPS_GLO "HD_GPS_GLO.hdb"
57
b.liuf9fbfa12024-06-14 15:53:59 +080058static pthread_cond_t read_cond;
59static pthread_mutex_t read_mutex;
b.liud0ba7152024-06-19 14:47:21 +080060static bool setting_waitting = FALSE;
b.liu5f950c52024-06-15 20:13:12 +080061static bool setting_busy = FALSE;
62static void *gnss_set_rsp_ptr = NULL;
63static gnss_err_enum gnss_set_result = GNSS_ERR_OK;
b.liud0ba7152024-06-19 14:47:21 +080064static hd8122_msg_id_t msg_array[GNSS_MSG_NUM_MAX];
rx.xiecf3a3782025-08-08 05:07:12 -070065//static char gnss_ctrl_path[128] = "/sys/devices/platform/mbtk-gnss/ctrl";
yq.wang9dd771b2024-09-13 23:38:40 -070066static gnss_agps_info_t agps_info;
yq.wang51d17352024-09-23 04:54:46 -070067static char *gnss_set_cmd_rsp = NULL;
68static int gnss_cmd_rsp_len = 0;
b.liuf9fbfa12024-06-14 15:53:59 +080069
b.liu5f950c52024-06-15 20:13:12 +080070int gnss_write(int fd, const void *data, int data_len);
b.liu9e8584b2024-11-06 19:21:28 +080071int OpenUart(const char* UART_DEV);
b.liudbc3f4b2024-06-25 18:22:24 +080072int uart_close(int fd);
73int fw_update_boot(int uart_fd, uint8_t *data, uint32_t len);
rx.xiecf3a3782025-08-08 05:07:12 -070074int fw_update_boot_8122(int uart_fd, uint8_t *data, uint32_t len);
75
b.liu5f950c52024-06-15 20:13:12 +080076
b.liudbc3f4b2024-06-25 18:22:24 +080077static uint16 fletcher16(const uint8_t* data, int data_len)
78{
b.liud0ba7152024-06-19 14:47:21 +080079 uint32_t sum1 = 0;
80 uint32_t sum2 = 0;
b.liu5f950c52024-06-15 20:13:12 +080081 int index;
82
b.liudbc3f4b2024-06-25 18:22:24 +080083 for (index = 0; index < data_len; ++index )
84 {
b.liud0ba7152024-06-19 14:47:21 +080085 sum1 += data[index];
86 sum2 += sum1;
b.liu5f950c52024-06-15 20:13:12 +080087 }
88
b.liud0ba7152024-06-19 14:47:21 +080089 return ((0xFF & sum2) << 8) | (0xFF & sum1);
b.liu5f950c52024-06-15 20:13:12 +080090}
91
92static void gnss_set_timer_cb(int signo)
93{
b.liudbc3f4b2024-06-25 18:22:24 +080094 if(setting_busy)
95 {
b.liu5f950c52024-06-15 20:13:12 +080096 pthread_mutex_lock(&read_mutex);
97 pthread_cond_signal(&read_cond);
98 pthread_mutex_unlock(&read_mutex);
99 gnss_set_result = GNSS_ERR_TIMEOUT;
100 }
101 return;
102}
103
b.liud0ba7152024-06-19 14:47:21 +0800104static void msg_init()
105{
b.liu778645e2024-06-21 16:47:42 +0800106 unsigned int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800107 while(i < ARRAY_SIZE(msg_array))
108 {
b.liud0ba7152024-06-19 14:47:21 +0800109 msg_array[i].enable = FALSE;
110 i++;
111 }
112}
113
b.liud0ba7152024-06-19 14:47:21 +0800114static int msg_insert(uint8 gid, uint8 sid)
115{
b.liu778645e2024-06-21 16:47:42 +0800116 unsigned int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800117 while(i < ARRAY_SIZE(msg_array))
118 {
b.liud0ba7152024-06-19 14:47:21 +0800119 if(!msg_array[i].enable)
120 break;
121 i++;
122 }
123
b.liudbc3f4b2024-06-25 18:22:24 +0800124 if(i == ARRAY_SIZE(msg_array))
125 {
b.liud0ba7152024-06-19 14:47:21 +0800126 LOGE("Msg full : %d", i);
127 return -1;
b.liudbc3f4b2024-06-25 18:22:24 +0800128 }
129 else
130 {
b.liud0ba7152024-06-19 14:47:21 +0800131 msg_array[i].enable = TRUE;
132 msg_array[i].gid = gid;
133 msg_array[i].sid = sid;
134 return 0;
135 }
136}
137
138static int msg_find(uint8 gid, uint8 sid)
139{
b.liu778645e2024-06-21 16:47:42 +0800140 unsigned int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800141 while(i < ARRAY_SIZE(msg_array))
142 {
b.liud0ba7152024-06-19 14:47:21 +0800143 if(msg_array[i].enable && gid == msg_array[i].gid && sid == msg_array[i].sid)
144 break;
145 i++;
146 }
147
b.liudbc3f4b2024-06-25 18:22:24 +0800148 if(i == ARRAY_SIZE(msg_array))
149 {
b.liud0ba7152024-06-19 14:47:21 +0800150 LOGE("No found %d - %d", gid, sid);
151 return -1;
b.liudbc3f4b2024-06-25 18:22:24 +0800152 }
153 else
154 {
b.liud0ba7152024-06-19 14:47:21 +0800155 return i;
156 }
157}
158
b.liu9e8584b2024-11-06 19:21:28 +0800159#if 0
b.liud0ba7152024-06-19 14:47:21 +0800160static int msg_remove(uint8 gid, uint8 sid)
161{
162 int i = msg_find(gid, sid);
b.liudbc3f4b2024-06-25 18:22:24 +0800163 if(i >= 0)
164 {
b.liud0ba7152024-06-19 14:47:21 +0800165 msg_array[i].enable = FALSE;
166 msg_array[i].gid = 0;
167 msg_array[i].sid = 0;
168 return 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800169 }
170 else
171 {
b.liud0ba7152024-06-19 14:47:21 +0800172 return -1;
173 }
174}
b.liu9e8584b2024-11-06 19:21:28 +0800175#endif
b.liud0ba7152024-06-19 14:47:21 +0800176
177static int msg_count()
178{
b.liu778645e2024-06-21 16:47:42 +0800179 unsigned int i = 0;
b.liud0ba7152024-06-19 14:47:21 +0800180 int count = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800181 while(i < ARRAY_SIZE(msg_array))
182 {
b.liud0ba7152024-06-19 14:47:21 +0800183 if(msg_array[i].enable)
184 count++;
185 i++;
186 }
187 return count;
188}
b.liu5f950c52024-06-15 20:13:12 +0800189
yq.wangaf363dc2024-08-06 20:16:00 -0700190
b.liudbc3f4b2024-06-25 18:22:24 +0800191static uint32_t read_bin_file(uint8_t *path, uint8_t *buff)
192{
193 int fp = -1;
194 int ret = 0;
195 int i = 0;
196 int size = 0;
197
198 if (NULL == path || NULL == buff)
199 {
200 LOGE("ARG error");
201 return 0;
202 }
203
204 fp = open((char *)path, O_RDONLY);
205 if(fp < 0)
206 {
207 LOGE( "open file failed ! errno is %d", errno);
208 return 0;
209 }
210
211 size = lseek(fp, 0x00, SEEK_END);
212 if(size <= 0)
213 {
214 LOGE( "file is empty.");
215 return 0;
216 }
217
218 LOGD( "file size is:%d", size);
219 lseek(fp, 0x00, SEEK_SET);
220 while(1)
221 {
222 ret = read(fp, buff, READ_LEN_MAX);
223 i += ret;
224 if(ret == READ_LEN_MAX)
225 {
226 buff += READ_LEN_MAX;
227 }
228 else
229 {
230 break;
231 }
232 }
233
234 LOGD("file size is:%d,i:%d", size, i);
235 close(fp);
236 if(size != i)
237 {
238 return 0;
239 }
240 return size;
241}
242
243
b.liu5f950c52024-06-15 20:13:12 +0800244static int pack_create(hd8122_id_type_enum id_type, uint8 id, uint16 data_len, const uint8 *data, uint8 *pack, int pack_len)
245{
b.liudbc3f4b2024-06-25 18:22:24 +0800246 if(pack == NULL || pack_len < HD8122_PACK_LEN_MIN)
247 {
b.liu5f950c52024-06-15 20:13:12 +0800248 return -1;
249 }
250 memset(pack, 0, pack_len);
251 uint8 *data_ptr = pack;
252 data_ptr += uint16_2_byte(HD8122_PACK_HEAD, data_ptr, false);
253 *data_ptr++ = (uint8)id_type;
254 *data_ptr++ = id;
255 data_ptr += uint16_2_byte(data_len, data_ptr, false);
b.liudbc3f4b2024-06-25 18:22:24 +0800256 if(data_len > 0)
257 {
b.liu5f950c52024-06-15 20:13:12 +0800258 memcpy(data_ptr, data, data_len);
259 data_ptr += data_len;
260 }
261 data_ptr += uint16_2_byte(fletcher16(pack + 2, 4 + data_len), data_ptr, false);
262 return (data_ptr - pack);
263}
264
b.liud0ba7152024-06-19 14:47:21 +0800265// f1 d9 05 01 02 00 06 01 0f 38
266// or
267// f1 d9 05 00 02 00 06 01 0f 38
268static int msg_array_change(const uint8 *pack, int pack_len, hd8122_id_ack_enum *ack_nak)
269{
yq.wang51d17352024-09-23 04:54:46 -0700270 if(pack_len == 0)
271 {
272 LOGE("pack_len(%d) error.", pack_len);
273 return -1;
274 }
275
276 //info result
277 if(gnss_set_cmd_rsp != NULL)
278 {
279 if(pack_len > 4 && pack[2] == 0x0a && pack[3] == 0x04) //VER INFO
280 {
281 char sw_ver[32] = {0};
282 char hw_ver[32] = {0};
283 memcpy(sw_ver, pack + 6, 16);
284 memcpy(hw_ver, pack + 22, 16);
285 snprintf(gnss_set_cmd_rsp, gnss_cmd_rsp_len, "%s,%s", sw_ver, hw_ver);
286 LOGE("fw ver:%s", gnss_set_cmd_rsp);
287 int index = msg_find(pack[2], pack[3]);
288 if(index >= 0)
289 {
290 msg_array[index].enable = FALSE;
291 }
292 else
293 {
294 LOGE("Unknown gid - %d, sid - %d", pack[2], pack[3]);
295 return -1;
296 }
297 return 0;
298 }
299 }
300
301 //set result
302 if(pack_len % 10)
b.liudbc3f4b2024-06-25 18:22:24 +0800303 {
b.liud0ba7152024-06-19 14:47:21 +0800304 LOGE("pack_len(%d) error.", pack_len);
305 return -1;
306 }
307 int count = pack_len / 10;
308 int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800309 while(i < count)
310 {
b.liu778645e2024-06-21 16:47:42 +0800311 const uint8 *ptr = pack + i * 10;
b.liudbc3f4b2024-06-25 18:22:24 +0800312 if(ptr[0] != 0xf1 || ptr[1] != 0xd9)
313 {
b.liud0ba7152024-06-19 14:47:21 +0800314 LOGE("Pack head error : %02x %02x", ptr[0], ptr[1]);
315 return -1;
316 }
317
b.liudbc3f4b2024-06-25 18:22:24 +0800318 if(ptr[2] != 0x05)
319 {
b.liud0ba7152024-06-19 14:47:21 +0800320 LOGE("Type not 0x05 : %02x", ptr[2]);
321 return -1;
322 }
323
324 int index = msg_find(ptr[6], ptr[7]);
b.liudbc3f4b2024-06-25 18:22:24 +0800325 if(index >= 0)
326 {
327 if(ptr[3] == 0x01)
328 {
b.liud0ba7152024-06-19 14:47:21 +0800329 msg_array[index].ack_nak = HD8122_ID_ACK_ACK;
b.liudbc3f4b2024-06-25 18:22:24 +0800330 }
331 else if(ptr[3] == 0x00)
332 {
b.liud0ba7152024-06-19 14:47:21 +0800333 msg_array[index].ack_nak = HD8122_ID_ACK_NAK;
334
335 // There is a nak as a failure.
336 *ack_nak = HD8122_ID_ACK_NAK;
b.liudbc3f4b2024-06-25 18:22:24 +0800337 }
338 else
339 {
b.liud0ba7152024-06-19 14:47:21 +0800340 LOGE("ID not 0x00 or 0x01 : %02x", ptr[3]);
341 return -1;
342 }
343
344 msg_array[index].enable = FALSE;
b.liudbc3f4b2024-06-25 18:22:24 +0800345 }
346 else
347 {
b.liud0ba7152024-06-19 14:47:21 +0800348 LOGE("Unknown gid - %d, sid - %d", ptr[6], ptr[7]);
349 return -1;
350 }
351 i++;
352 }
353
354 return 0;
355}
356
b.liudbc3f4b2024-06-25 18:22:24 +0800357static void gnss_cmd_rsp_process(const void *data, int data_len)
358{
b.liu9e8584b2024-11-06 19:21:28 +0800359// const char *ptr = (const char*)data;
b.liu5f950c52024-06-15 20:13:12 +0800360 log_hex("RSP", data, data_len);
b.liu5f950c52024-06-15 20:13:12 +0800361
b.liud0ba7152024-06-19 14:47:21 +0800362 hd8122_id_ack_enum ack_nak = HD8122_ID_ACK_ACK;
b.liudbc3f4b2024-06-25 18:22:24 +0800363 if(!msg_array_change((const uint8*)data, data_len, &ack_nak))
364 {
b.liud0ba7152024-06-19 14:47:21 +0800365 if(setting_waitting && msg_count() == 0)
366 {
b.liudbc3f4b2024-06-25 18:22:24 +0800367 if(ack_nak == HD8122_ID_ACK_ACK)
368 {
b.liud0ba7152024-06-19 14:47:21 +0800369 gnss_set_result = GNSS_ERR_OK;
b.liudbc3f4b2024-06-25 18:22:24 +0800370 }
371 else
372 {
b.liud0ba7152024-06-19 14:47:21 +0800373 gnss_set_result = GNSS_ERR_UNKNOWN;
374 }
375
376 mbtk_timer_clear();
377
378 pthread_mutex_lock(&read_mutex);
379 pthread_cond_signal(&read_cond);
380 pthread_mutex_unlock(&read_mutex);
381 setting_waitting = FALSE;
382 }
b.liu9e8584b2024-11-06 19:21:28 +0800383
b.liudbc3f4b2024-06-25 18:22:24 +0800384 }
385 else
386 {
b.liud0ba7152024-06-19 14:47:21 +0800387 LOGW("Unknown rsp data.");
b.liu5f950c52024-06-15 20:13:12 +0800388 }
389}
390
b.liud0ba7152024-06-19 14:47:21 +0800391static gnss_err_enum gnss_8122_reset(int fd, uint8 reset)
b.liu5f950c52024-06-15 20:13:12 +0800392{
393 uint8 buff[GNSS_PACK_BUFF_SIZE];
394 LOGD("RESET");
395 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 +0800396 if(len <= 0)
397 {
b.liu5f950c52024-06-15 20:13:12 +0800398 LOGE("pack_create() fail.");
399 return GNSS_ERR_ARG;
400 }
401 log_hex("PACK", buff, len);
402 gnss_write(fd, buff, len);
403 return GNSS_ERR_OK;
404}
b.liuf9fbfa12024-06-14 15:53:59 +0800405
b.liud0ba7152024-06-19 14:47:21 +0800406static gnss_err_enum gnss_8122_syscfg(int fd, uint32 mode)
407{
408 uint8 buff[GNSS_PACK_BUFF_SIZE];
409 LOGD("SYSCFG");
410 //uint8 mode_str[4];
411 //uint32_2_byte(mode, mode_str, TRUE);
412 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 +0800413 if(len <= 0)
414 {
b.liud0ba7152024-06-19 14:47:21 +0800415 LOGE("pack_create() fail.");
416 return GNSS_ERR_ARG;
417 }
418 log_hex("PACK", buff, len);
419 gnss_write(fd, buff, len);
420 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_NAVSAT);
421 return GNSS_ERR_OK;
422}
423
yq.wang6a3437f2024-07-27 02:57:20 -0700424static gnss_err_enum gnss_8122_freqcfg(int fd, uint8 mode)
425{
426 uint8 buff[GNSS_PACK_BUFF_SIZE];
427 LOGD("FREQCFG");
428 uint8 data[20];
429 memset(data, 0x00, 20);
430 data[1] = mode;
431 data[2] = 0x66;
432 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_PWRCTL, 20, data, buff, sizeof(buff));
433 if(len <= 0)
434 {
435 LOGE("pack_create() fail.");
436 return GNSS_ERR_ARG;
437 }
438 log_hex("PACK", buff, len);
439 gnss_write(fd, buff, len);
440 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_PWRCTL);
441 return GNSS_ERR_OK;
442}
443
yq.wang012b6522024-09-12 02:36:53 -0700444static gnss_err_enum gnss_8122_cfg_save(int fd)
445{
446 uint8 buff[GNSS_PACK_BUFF_SIZE];
447 LOGD("CFG SAVE");
448 uint8 data[8];
449 memset(data, 0x00, 8);
450 data[4] = 0x0f;
451 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_CFG, 8, data, buff, sizeof(buff));
452 if(len <= 0)
453 {
454 LOGE("pack_create() fail.");
455 return GNSS_ERR_ARG;
456 }
457 log_hex("PACK", buff, len);
458 gnss_write(fd, buff, len);
459 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_CFG);
460 return GNSS_ERR_OK;
461}
462
b.liud0ba7152024-06-19 14:47:21 +0800463static gnss_err_enum gnss_8122_msgcfg(int fd, uint8 type, uint8 id, uint8 period)
464{
465 uint8 buff[GNSS_PACK_BUFF_SIZE];
466 LOGD("MSGCFG");
467 uint8 data[3];
468 data[0] = type;
469 data[1] = id;
470 data[2] = period;
471 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_MSG, 3, data, buff, sizeof(buff));
b.liudbc3f4b2024-06-25 18:22:24 +0800472 if(len <= 0)
473 {
b.liud0ba7152024-06-19 14:47:21 +0800474 LOGE("pack_create() fail.");
475 return GNSS_ERR_ARG;
476 }
477 log_hex("PACK", buff, len);
478 gnss_write(fd, buff, len);
479 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_MSG);
480 return GNSS_ERR_OK;
481}
482
yq.wang51d17352024-09-23 04:54:46 -0700483static gnss_err_enum gnss_8122_ver(int fd)
b.liud0ba7152024-06-19 14:47:21 +0800484{
485 uint8 buff[GNSS_PACK_BUFF_SIZE];
yq.wang51d17352024-09-23 04:54:46 -0700486 LOGD("VER");
487 int len = pack_create(HD8122_ID_TYPE_MON, HD8122_ID_MON_VER, 0, NULL, buff, sizeof(buff));
b.liudbc3f4b2024-06-25 18:22:24 +0800488 if(len <= 0)
489 {
b.liud0ba7152024-06-19 14:47:21 +0800490 LOGE("pack_create() fail.");
491 return GNSS_ERR_ARG;
492 }
493 log_hex("PACK", buff, len);
494 gnss_write(fd, buff, len);
yq.wang51d17352024-09-23 04:54:46 -0700495 msg_insert(HD8122_ID_TYPE_MON, HD8122_ID_MON_VER);
b.liud0ba7152024-06-19 14:47:21 +0800496 return GNSS_ERR_OK;
497}
498
yq.wang51d17352024-09-23 04:54:46 -0700499
500static gnss_err_enum gnss_8122_minel(int fd, uint8 *elev)
501{
502 uint8 buff[GNSS_PACK_BUFF_SIZE];
503 LOGD("ELEV");
504 //uint8 elev_buff[4];
505 //uint32_2_byte((uint32)elev, elev_buff, TRUE);
506 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_ELEV, 8, elev, buff, sizeof(buff));
507 if(len <= 0)
508 {
509 LOGE("pack_create() fail.");
510 return GNSS_ERR_ARG;
511 }
512 log_hex("PACK", buff, len);
513 gnss_write(fd, buff, len);
514 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_ELEV);
515 return GNSS_ERR_OK;
516}
517
518static gnss_err_enum gnss_8122_PZ90CONV(int fd, uint8 *coord)
519{
520 uint8 buff[GNSS_PACK_BUFF_SIZE];
521 LOGD("PZ90CONV");
522 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_COORD, 44, coord, buff, sizeof(buff));
523 if(len <= 0)
524 {
525 LOGE("pack_create() fail.");
526 return GNSS_ERR_ARG;
527 }
528 log_hex("PACK", buff, len);
529 gnss_write(fd, buff, len);
530 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_COORD);
531 return GNSS_ERR_OK;
532}
533
b.liu9e8584b2024-11-06 19:21:28 +0800534#if 0
b.liud0ba7152024-06-19 14:47:21 +0800535static gnss_err_enum gnss_8122_nmeaver(int fd, uint8 ver)
536{
537 uint8 buff[GNSS_PACK_BUFF_SIZE];
538 LOGD("NMEA-VER");
539 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 +0800540 if(len <= 0)
541 {
b.liud0ba7152024-06-19 14:47:21 +0800542 LOGE("pack_create() fail.");
543 return GNSS_ERR_ARG;
544 }
545 log_hex("PACK", buff, len);
546 gnss_write(fd, buff, len);
547 return GNSS_ERR_OK;
548}
b.liu9e8584b2024-11-06 19:21:28 +0800549#endif
b.liud0ba7152024-06-19 14:47:21 +0800550
yq.wang36222352024-11-06 03:31:24 -0800551static gnss_err_enum gnss_8122_ephsave(int fd, uint8 status)
552{
553 uint8 buff[GNSS_PACK_BUFF_SIZE];
554 LOGD("EPHSAVE");
555 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_EPHSAVE, 1, (uint8*)(&status), buff, sizeof(buff));
556 if(len <= 0)
557 {
558 LOGE("pack_create() fail.");
559 return GNSS_ERR_ARG;
560 }
561 log_hex("PACK", buff, len);
562 gnss_write(fd, buff, len);
563 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_EPHSAVE);
564 return GNSS_ERR_OK;
565}
566
567
b.liuf9fbfa12024-06-14 15:53:59 +0800568int gnss_8122_dev_open()
569{
yq.wang5fe6e612024-07-17 01:18:12 -0700570 //return mbtk_gpio_value_set(GNSS_POWER_GPIO, MBTK_GPIO_DIRECT_OUT, 1);
b.liu9e8584b2024-11-06 19:21:28 +0800571 mbtk_system("i2cset -y -f 2 0x31 0x15 0x86");
yq.wang5fe6e612024-07-17 01:18:12 -0700572 return 0;
b.liuf9fbfa12024-06-14 15:53:59 +0800573}
574
b.liu978f5432024-07-01 18:04:18 +0800575int gnss_8122_dev_close(int fd)
b.liuf9fbfa12024-06-14 15:53:59 +0800576{
yq.wang5fe6e612024-07-17 01:18:12 -0700577 //return mbtk_gpio_value_set(GNSS_POWER_GPIO, MBTK_GPIO_DIRECT_OUT, 0);
b.liu9e8584b2024-11-06 19:21:28 +0800578 mbtk_system("i2cset -y -f 2 0x31 0x15 0x00");
yq.wang5fe6e612024-07-17 01:18:12 -0700579 return 0;
b.liuf9fbfa12024-06-14 15:53:59 +0800580}
581
582int gnss_8122_open(const char *dev)
583{
584 pthread_mutex_init(&read_mutex, NULL);
585 pthread_cond_init(&read_cond, NULL);
586 return gnss_port_open(dev, O_RDWR | O_NONBLOCK | O_NOCTTY, UART_BITRATE_NMEA_DEF_FW, TRUE);
587}
588
589int gnss_8122_close(int fd)
590{
591 pthread_mutex_destroy(&read_mutex);
592 pthread_cond_destroy(&read_cond);
593 return gnss_port_close(fd);
594}
595
yq.wang36222352024-11-06 03:31:24 -0800596int gnss_8122_init_set(int fd)
597{
598 sleep(1); //wait 8122 ready...
599 gnss_8122_ephsave(fd, (uint8)HD8122_EPHSAVE_STATUS_DISABLE);
600 gnss_8122_cfg_save(fd);
601 return GNSS_ERR_OK;
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{
rx.xiecf3a3782025-08-08 05:07:12 -0700606 //PORT_NAME234
607 int uart_fd = open(dev , O_RDWR|O_NOCTTY);
b.liudbc3f4b2024-06-25 18:22:24 +0800608 if (uart_fd < 0)
609 {
610 LOGE("open uart failed %d[%d]", uart_fd, errno);
611 return GNSS_ERR_OPEN_DEV;
612 }
613
yq.wangaf363dc2024-08-06 20:16:00 -0700614 uint8_t fw_path[256] = {0};
615 memset(fw_path, 0x0, 256);
616 if(memcmp(fw_name, "gp_gl_ga", 8) == 0)
617 {
618 memcpy(fw_path, GNSS_FW_GQALS_PATH, strlen(GNSS_FW_GQALS_PATH));
619 }
620 else if(memcmp(fw_name, "gp_bd_ga", 8) == 0)
621 {
622 memcpy(fw_path, GNSS_FW_GAQBS_PATH, strlen(GNSS_FW_GAQBS_PATH));
623 }
rx.xie9be080b2025-09-08 07:03:43 -0700624 else if(memcmp(fw_name, "gnss8040", 8) == 0)
625 {
626 memcpy(fw_path, GNSS_FW_8040_PATH, strlen(GNSS_FW_8040_PATH));
627 }
rx.xiecf3a3782025-08-08 05:07:12 -0700628 else if(fw_name != NULL)
629 {
630 memcpy(fw_path, fw_name, strlen(fw_name));
631 LOGE("fw_path: %s",fw_path);
632 }
633
634
yq.wangaf363dc2024-08-06 20:16:00 -0700635 else
636 {
637 LOGE("fw dl param error");
638 return GNSS_ERR_ARG;
639 }
640
b.liudbc3f4b2024-06-25 18:22:24 +0800641 uint8_t *g_bin_buff = (uint8_t*)malloc(500*1024);
642 if(g_bin_buff == NULL) {
643 LOGE("malloc() fail : %d", errno);
644 return GNSS_ERR_UNKNOWN;
645 }
646 memset(g_bin_buff, 0, 500*1024);
yq.wangaf363dc2024-08-06 20:16:00 -0700647 uint32_t len = read_bin_file(fw_path, g_bin_buff);
b.liudbc3f4b2024-06-25 18:22:24 +0800648 if (len <= 0)
649 {
650 LOGE("Read file failed ,len = %d", len);
yq.wangaf363dc2024-08-06 20:16:00 -0700651 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800652 }
rx.xiecf3a3782025-08-08 05:07:12 -0700653
654 int ret;
655 // branch1:gp_gl_ga & gp_bd_ga
656 if (memcmp(fw_name, "gp_gl_ga", 8) == 0 || memcmp(fw_name, "gp_bd_ga", 8) == 0) {
657 if(gnss_8122_dev_open())
658 {
659 LOGE("open gnss device fail:%d", errno);
660 goto error;
661 }
662
663 mbtk_system("echo 63 > /sys/class/gpio/export");
664 mbtk_system("echo 62 > /sys/class/gpio/export");
665 mbtk_system("echo out > /sys/class/gpio/gpio63/direction");
666 mbtk_system("echo out > /sys/class/gpio/gpio62/direction");
667 mbtk_system("echo 0 > /sys/class/gpio/gpio63/value");
668 usleep(100000);//100ms
669 mbtk_system("echo 1 > /sys/class/gpio/gpio62/value");//reset
670 usleep(1000000);//1s
671 mbtk_system("echo 0 > /sys/class/gpio/gpio62/value");
672 usleep(100000);//100ms
673 mbtk_system("echo 1 > /sys/class/gpio/gpio63/value");//boot
rx.xie9be080b2025-09-08 07:03:43 -0700674 usleep(100000);//100ms
675 mbtk_system("echo 0 > /sys/class/gpio/gpio63/value");
676 usleep(100000);//100ms
677 mbtk_system("echo in > /sys/class/gpio/gpio63/direction");
rx.xiecf3a3782025-08-08 05:07:12 -0700678 mbtk_system("echo 62 > /sys/class/gpio/unexport");
679 mbtk_system("echo 63 > /sys/class/gpio/unexport");
680
681
682 ret = fw_update_boot_8122(uart_fd, g_bin_buff, len);
683 if (ret < 0)
684 {
685 LOGE("fw_update_boot() fail : %d", ret);
686 goto error;
687 }
688
689 if(gnss_8122_dev_close(0))
690 {
691 LOGE("close gnss device fail:%d", errno);
692 goto error;
693 }
694
695 if(ret == HDBD_UPG_SUCESS)
696 {
697 LOGD("upgrade sucess!");
698 }
699 else
700 {
701 LOGD("upgrade FAIL, fail style:%d", ret);
702 goto error;
703 }
704
705 free(g_bin_buff);
706 uart_close(uart_fd);
707 return GNSS_ERR_OK;
708 }
rx.xie9be080b2025-09-08 07:03:43 -0700709 // branch2: gns_8040
710 else if (memcmp(fw_name, "gnss8040", 8) == 0)
711 {
712 if(gnss_8122_dev_open())
713 {
714 LOGE("open gnss device fail:%d", errno);
715 goto error;
716 }
717
718 mbtk_system("echo 63 > /sys/class/gpio/export");
719 mbtk_system("echo 62 > /sys/class/gpio/export");
720 mbtk_system("echo out > /sys/class/gpio/gpio63/direction");
721 mbtk_system("echo out > /sys/class/gpio/gpio62/direction");
722 mbtk_system("echo 0 > /sys/class/gpio/gpio63/value");
723 usleep(100000);//100ms
724 mbtk_system("echo 1 > /sys/class/gpio/gpio62/value");//reset
725 usleep(1000000);//1s
726 mbtk_system("echo 0 > /sys/class/gpio/gpio62/value");
727 usleep(100000);//100ms
728 mbtk_system("echo 1 > /sys/class/gpio/gpio63/value");//boot
729 usleep(100000);//100ms
730 mbtk_system("echo 0 > /sys/class/gpio/gpio63/value");
731 usleep(100000);//100ms
732 mbtk_system("echo in > /sys/class/gpio/gpio63/direction");
733 mbtk_system("echo 62 > /sys/class/gpio/unexport");
734 mbtk_system("echo 63 > /sys/class/gpio/unexport");
735
736 ret = fw_update_boot(uart_fd, g_bin_buff, len);
737 if (ret < 0)
738 {
739 LOGE("fw_update_boot() fail : %d", ret);
740 goto error;
741 }
742 if(gnss_8122_dev_close(0))
743 {
744 LOGE("close gnss device fail:%d", errno);
745 goto error;
746 }
747
748 if(ret == HDBD_UPG_SUCESS)
749 {
750 LOGD("upgrade sucess!");
751 }
752 else
753 {
754 LOGD("upgrade FAIL, fail style:%d", ret);
755 goto error;
756 }
757
758 free(g_bin_buff);
759 uart_close(uart_fd);
760 return GNSS_ERR_OK;
761 }
762 // branch3: else
rx.xiecf3a3782025-08-08 05:07:12 -0700763 else {
rx.xie9be080b2025-09-08 07:03:43 -0700764 mbtk_system("echo 1 > /sys/class/gpio/gpio47/value");//47 reset
rx.xiecf3a3782025-08-08 05:07:12 -0700765 usleep(500000);//500ms
rx.xie9be080b2025-09-08 07:03:43 -0700766
rx.xiecf3a3782025-08-08 05:07:12 -0700767 mbtk_system("echo 1 > /sys/class/gpio/gpio120/value");//120 boot
768 usleep(500000);//500ms
rx.xie9be080b2025-09-08 07:03:43 -0700769 mbtk_system("echo 0 > /sys/class/gpio/gpio47/value");//47 reset
770 usleep(500000);//500ms
771 mbtk_system("echo 0 > /sys/class/gpio/gpio120/value");
rx.xiecf3a3782025-08-08 05:07:12 -0700772 usleep(500000);//500ms
773
774
775 ret = fw_update_boot(uart_fd, g_bin_buff, len);
776 if (ret < 0)
777 {
778 LOGE("fw_update_boot() fail : %d", ret);
779 goto error;
780 }
781
782 if(ret == HDBD_UPG_SUCESS)
783 {
784 LOGD("upgrade sucess!");
785 }
786 else
787 {
788 LOGD("upgrade FAIL, fail style:%d", ret);
789 goto error;
790 }
791
792 free(g_bin_buff);
793 uart_close(uart_fd);
794 return GNSS_ERR_OK;
b.liudbc3f4b2024-06-25 18:22:24 +0800795 }
yq.wangaf363dc2024-08-06 20:16:00 -0700796
yq.wangaf363dc2024-08-06 20:16:00 -0700797error:
798 if(g_bin_buff)
799 {
800 free(g_bin_buff);
801 g_bin_buff = NULL;
802 }
803 if(uart_fd > 0)
804 {
805 uart_close(uart_fd);
806 uart_fd = -1;
807 }
808 return GNSS_ERR_DL_FW;
b.liuf9fbfa12024-06-14 15:53:59 +0800809}
810
yq.wang99db6f52024-09-12 01:58:48 -0700811gnss_err_enum gnss_8122_agnss_get_eph(const char *param)
812{
813 if(param == NULL)
814 {
815 LOGD("gnss_8122_agnss_get_eph param is NULL");
816 return GNSS_ERR_ARG;
817 }
818
819 int eph_type = 0;
820 int alam_flag = 0;
821 int ret = -1;
b.liu9e8584b2024-11-06 19:21:28 +0800822 char url[1024] = {0};
yq.wang99db6f52024-09-12 01:58:48 -0700823 if(2 == sscanf(param, "%d,%d", &eph_type, &alam_flag))
824 {
825 if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS)
826 {
b.liu9e8584b2024-11-06 19:21:28 +0800827 snprintf(url, sizeof(url),AGNSS_URL, AGNSS_EPH_GPS);
yq.wang99db6f52024-09-12 01:58:48 -0700828 }
829 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_BDS)
830 {
b.liu9e8584b2024-11-06 19:21:28 +0800831 snprintf(url, sizeof(url),AGNSS_URL, AGNSS_EPH_BDS);
yq.wang99db6f52024-09-12 01:58:48 -0700832 }
833 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GLO)
834 {
b.liu9e8584b2024-11-06 19:21:28 +0800835 snprintf(url, sizeof(url),AGNSS_URL, AGNSS_EPH_GLO);
yq.wang99db6f52024-09-12 01:58:48 -0700836 }
837 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS_BDS)
838 {
b.liu9e8584b2024-11-06 19:21:28 +0800839 snprintf(url, sizeof(url),AGNSS_URL, AGNSS_EPH_GPS_BDS);
yq.wang99db6f52024-09-12 01:58:48 -0700840 }
841 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS_GLO)
842 {
b.liu9e8584b2024-11-06 19:21:28 +0800843 snprintf(url, sizeof(url),AGNSS_URL, AGNSS_EPH_GPS_GLO);
yq.wang99db6f52024-09-12 01:58:48 -0700844 }
yq.wang9dd771b2024-09-13 23:38:40 -0700845 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_CFG)
846 {
b.liu9e8584b2024-11-06 19:21:28 +0800847 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 -0700848 strlen(agps_info.id) > 0 ? agps_info.id : "yikecs1",
849 strlen(agps_info.passwd) > 0 ? agps_info.passwd : "Z38w5urAuawubTxi");
850 }
yq.wang99db6f52024-09-12 01:58:48 -0700851 else
852 {
853 return GNSS_ERR_UNSUPPORT;
854 }
855
856 ret = eph_data_from_http_get(url, AGNSS_EPH_FILE_PATH);
857 if (ret < 0)
858 {
859 LOGD("eph_data_from_http_get fail");
860 return GNSS_ERR_EPH_GET_FAIL;
861 }
862 LOGD("get_eph_data_from_http success");
863 }
864 else
865 {
866 LOGD("param num error");
867 return GNSS_ERR_ARG;
868 }
869 return GNSS_ERR_OK;
870}
871
872
873gnss_err_enum gnss_8122_agnss_inject(int fd)
874{
875 int ret = 0;
876 hd_set_gnss_dev_fd(fd);
877 ret = hd_agnss_inject(AGNSS_EPH_FILE_PATH, 0, 0, 0, 0, NULL);
878 hd_set_gnss_dev_fd(-1);
879 if(ret < 0)
880 {
881 LOGD("hd_agnss_inject fail");
882 return GNSS_ERR_EPH_INJECT_FAIL;
883 }
884 return GNSS_ERR_OK;
885}
886
b.liu5f950c52024-06-15 20:13:12 +0800887void gnss_8122_set_cb(const void *data, int data_len)
888{
b.liu9e8584b2024-11-06 19:21:28 +0800889// const char *buff = (const char*)data;
b.liudbc3f4b2024-06-25 18:22:24 +0800890 if(setting_busy) // Has setting cmd process.
891 {
b.liu5f950c52024-06-15 20:13:12 +0800892 gnss_cmd_rsp_process(data, data_len);
893 }
yq.wang99db6f52024-09-12 01:58:48 -0700894
yq.wang9dd771b2024-09-13 23:38:40 -0700895#if 0
yq.wang99db6f52024-09-12 01:58:48 -0700896 if(hd_get_eph_inject_status() == HD_EPH_INJECT_STATUS_WAIT_RETURN)
897 {
898 log_hex("EPH_RSP", (const char*)data, data_len);
899 int ret = hd_eph_inject_result_check(data, data_len);
900 if(ret < 0)
901 {
902 hd_set_eph_inject_status(HD_EPH_INJECT_STATUS_FAIL);
903 }
904 else
905 {
906 hd_set_eph_inject_status(HD_EPH_INJECT_STATUS_SUCCESS);
yq.wang9dd771b2024-09-13 23:38:40 -0700907 }
yq.wang99db6f52024-09-12 01:58:48 -0700908 }
yq.wang9dd771b2024-09-13 23:38:40 -0700909#endif
b.liu5f950c52024-06-15 20:13:12 +0800910}
b.liuf9fbfa12024-06-14 15:53:59 +0800911
912gnss_err_enum gnss_8122_set(int fd, const char *cmd, void *cmd_rsp, int cmd_rsp_len)
913{
b.liudbc3f4b2024-06-25 18:22:24 +0800914 if(setting_busy)
915 {
b.liu5f950c52024-06-15 20:13:12 +0800916 return GNSS_ERR_SET_BUSY;
b.liudbc3f4b2024-06-25 18:22:24 +0800917 }
918 else
919 {
b.liu5f950c52024-06-15 20:13:12 +0800920 bool should_wait_rsp = TRUE;
921 setting_busy = TRUE;
922 gnss_set_rsp_ptr = cmd_rsp;
923 gnss_set_result = GNSS_ERR_OK;
b.liud0ba7152024-06-19 14:47:21 +0800924 msg_init();
b.liu5f950c52024-06-15 20:13:12 +0800925 mbtk_timer_set(gnss_set_timer_cb, GNSS_SET_TIMEOUT);
926
b.liudbc3f4b2024-06-25 18:22:24 +0800927 if(memcmp(cmd, "$RESET", 6) == 0) // $RESET,<mode>
928 {
b.liud0ba7152024-06-19 14:47:21 +0800929 gnss_reset_type_enum mode = (gnss_reset_type_enum)atoi(cmd + 7);
yq.wang1ddd1fd2024-07-25 23:00:14 -0700930 LOGD("set reset: %d", mode);
b.liudbc3f4b2024-06-25 18:22:24 +0800931 if(mode == GNSS_RESET_TYPE_HOT)
932 {
b.liud0ba7152024-06-19 14:47:21 +0800933 gnss_set_result = gnss_8122_reset(fd, 3);
b.liudbc3f4b2024-06-25 18:22:24 +0800934 }
935 else if(mode == GNSS_RESET_TYPE_WARM)
936 {
b.liud0ba7152024-06-19 14:47:21 +0800937 gnss_set_result = gnss_8122_reset(fd, 2);
b.liudbc3f4b2024-06-25 18:22:24 +0800938 }
939 else if(mode == GNSS_RESET_TYPE_COLD)
940 {
b.liud0ba7152024-06-19 14:47:21 +0800941 gnss_set_result = gnss_8122_reset(fd, 1);
b.liudbc3f4b2024-06-25 18:22:24 +0800942 }
943 else
944 {
b.liud0ba7152024-06-19 14:47:21 +0800945 gnss_set_result = GNSS_ERR_ARG;
946 goto set_fail;
947 }
b.liudbc3f4b2024-06-25 18:22:24 +0800948 if(gnss_set_result != GNSS_ERR_OK)
949 {
b.liu5f950c52024-06-15 20:13:12 +0800950 goto set_fail;
951 }
952 should_wait_rsp = FALSE;
b.liudbc3f4b2024-06-25 18:22:24 +0800953 }
954 else if(memcmp(cmd, "$SYSCFG", 7) == 0) // $SYSCFG,<mode>
955 {
b.liud0ba7152024-06-19 14:47:21 +0800956 uint32 mode = 0;
957 mode = (uint32)atoi(cmd + 8);
958 uint32 new_mode = 0;
yq.wang51d17352024-09-23 04:54:46 -0700959 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 +0800960 {
b.liud0ba7152024-06-19 14:47:21 +0800961 gnss_set_result = GNSS_ERR_ARG;
962 goto set_fail;
963 }
964
b.liudbc3f4b2024-06-25 18:22:24 +0800965 if(mode & GNSS_SET_SYSCFG_GPS) // GPS
966 {
b.liud0ba7152024-06-19 14:47:21 +0800967 new_mode |= 0x00000001;
968 }
b.liudbc3f4b2024-06-25 18:22:24 +0800969 if(mode & GNSS_SET_SYSCFG_BDS) // BDS
970 {
yq.wang51d17352024-09-23 04:54:46 -0700971 new_mode |= 0x00000004;
b.liud0ba7152024-06-19 14:47:21 +0800972 }
b.liudbc3f4b2024-06-25 18:22:24 +0800973 if(mode & GNSS_SET_SYSCFG_GLO) // GLO
974 {
yq.wang51d17352024-09-23 04:54:46 -0700975 new_mode |= 0x00000002;
b.liud0ba7152024-06-19 14:47:21 +0800976 }
b.liudbc3f4b2024-06-25 18:22:24 +0800977 if(mode & GNSS_SET_SYSCFG_GAL) // GAL
978 {
b.liud0ba7152024-06-19 14:47:21 +0800979 new_mode |= 0x00000010;
980 }
yq.wang40c242f2024-11-27 02:43:35 -0800981 if(mode & GNSS_SET_SYSCFG_QZSS) // QZSS
yq.wang51d17352024-09-23 04:54:46 -0700982 {
983 new_mode |= 0x00000020;
984 }
yq.wang40c242f2024-11-27 02:43:35 -0800985 if(mode & GNSS_SET_SYSCFG_SBAS) // SBAS
yq.wang51d17352024-09-23 04:54:46 -0700986 {
987 new_mode |= 0x00000040;
988 }
b.liud0ba7152024-06-19 14:47:21 +0800989
990 gnss_set_result = gnss_8122_syscfg(fd, new_mode);
b.liudbc3f4b2024-06-25 18:22:24 +0800991 if(gnss_set_result != GNSS_ERR_OK)
992 {
b.liud0ba7152024-06-19 14:47:21 +0800993 goto set_fail;
994 }
995 should_wait_rsp = TRUE;
b.liudbc3f4b2024-06-25 18:22:24 +0800996 }
yq.wang6a3437f2024-07-27 02:57:20 -0700997 else if(memcmp(cmd, "$FREQCFG", 8) == 0) //$FREQCFG,<freq>
998 {
999 uint32 freq = 0;
1000 freq = (uint32)atoi(cmd + 9);
1001 LOGD("set freq: %d", freq);
1002 if((GNSS_SET_FREQCFG_1 != freq) && (GNSS_SET_FREQCFG_2 != freq) && (GNSS_SET_FREQCFG_5 != freq))
1003 {
1004 gnss_set_result = GNSS_ERR_ARG;
1005 goto set_fail;
1006 }
1007 gnss_set_result = gnss_8122_freqcfg(fd, (uint8)freq);
1008 if(gnss_set_result != GNSS_ERR_OK)
1009 {
1010 goto set_fail;
1011 }
yq.wang012b6522024-09-12 02:36:53 -07001012
1013 gnss_set_result = gnss_8122_cfg_save(fd);
yq.wang6a3437f2024-07-27 02:57:20 -07001014 should_wait_rsp = TRUE;
1015 }
b.liudbc3f4b2024-06-25 18:22:24 +08001016 else if(memcmp(cmd, "$MSGCFG", 7) == 0) // $MSGCFG,<mode>,<rate>
1017 {
b.liud0ba7152024-06-19 14:47:21 +08001018 uint32 mode;
1019 int rate;
b.liudbc3f4b2024-06-25 18:22:24 +08001020 if(2 == sscanf(cmd, "$MSGCFG,%d,%d", &mode, &rate))
1021 {
yq.wang1ddd1fd2024-07-25 23:00:14 -07001022 LOGD("set msgcfg: %d, %d", mode, rate);
b.liud0ba7152024-06-19 14:47:21 +08001023 int time = rate / 1000; // s
b.liudbc3f4b2024-06-25 18:22:24 +08001024 if(time < 0)
1025 {
b.liud0ba7152024-06-19 14:47:21 +08001026 gnss_set_result = GNSS_ERR_ARG;
1027 goto set_fail;
1028 }
1029
1030 if(((GNSS_SET_MSGCFG_RMC | GNSS_SET_MSGCFG_VTG | GNSS_SET_MSGCFG_GGA | GNSS_SET_MSGCFG_GSA
b.liudbc3f4b2024-06-25 18:22:24 +08001031 | GNSS_SET_MSGCFG_GRS | GNSS_SET_MSGCFG_GSV | GNSS_SET_MSGCFG_GLL | GNSS_SET_MSGCFG_ZDA
1032 | GNSS_SET_MSGCFG_GST | GNSS_SET_MSGCFG_TXT) & mode) != mode)
1033 {
yq.wang1ddd1fd2024-07-25 23:00:14 -07001034 LOGD("msgcfg not support mode");
b.liud0ba7152024-06-19 14:47:21 +08001035 gnss_set_result = GNSS_ERR_ARG;
1036 goto set_fail;
1037 }
1038
b.liudbc3f4b2024-06-25 18:22:24 +08001039 if(mode & GNSS_SET_MSGCFG_RMC)
1040 {
yq.wang1ddd1fd2024-07-25 23:00:14 -07001041 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x05, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001042 if(gnss_set_result != GNSS_ERR_OK)
1043 {
b.liud0ba7152024-06-19 14:47:21 +08001044 goto set_fail;
1045 }
1046 }
1047
b.liudbc3f4b2024-06-25 18:22:24 +08001048 if(mode & GNSS_SET_MSGCFG_VTG)
1049 {
b.liud0ba7152024-06-19 14:47:21 +08001050 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x06, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001051 if(gnss_set_result != GNSS_ERR_OK)
1052 {
b.liud0ba7152024-06-19 14:47:21 +08001053 goto set_fail;
1054 }
1055 }
1056
b.liudbc3f4b2024-06-25 18:22:24 +08001057 if(mode & GNSS_SET_MSGCFG_GGA)
1058 {
b.liud0ba7152024-06-19 14:47:21 +08001059 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x00, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001060 if(gnss_set_result != GNSS_ERR_OK)
1061 {
b.liud0ba7152024-06-19 14:47:21 +08001062 goto set_fail;
1063 }
1064 }
1065
b.liudbc3f4b2024-06-25 18:22:24 +08001066 if(mode & GNSS_SET_MSGCFG_GSA)
1067 {
b.liud0ba7152024-06-19 14:47:21 +08001068 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x02, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001069 if(gnss_set_result != GNSS_ERR_OK)
1070 {
b.liud0ba7152024-06-19 14:47:21 +08001071 goto set_fail;
1072 }
1073 }
1074
b.liudbc3f4b2024-06-25 18:22:24 +08001075 if(mode & GNSS_SET_MSGCFG_GRS)
1076 {
b.liud0ba7152024-06-19 14:47:21 +08001077 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x03, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001078 if(gnss_set_result != GNSS_ERR_OK)
1079 {
b.liud0ba7152024-06-19 14:47:21 +08001080 goto set_fail;
1081 }
1082 }
1083
b.liudbc3f4b2024-06-25 18:22:24 +08001084 if(mode & GNSS_SET_MSGCFG_GSV)
1085 {
b.liud0ba7152024-06-19 14:47:21 +08001086 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x04, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001087 if(gnss_set_result != GNSS_ERR_OK)
1088 {
b.liud0ba7152024-06-19 14:47:21 +08001089 goto set_fail;
1090 }
1091 }
1092
b.liudbc3f4b2024-06-25 18:22:24 +08001093 if(mode & GNSS_SET_MSGCFG_GLL)
1094 {
b.liud0ba7152024-06-19 14:47:21 +08001095 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x01, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001096 if(gnss_set_result != GNSS_ERR_OK)
1097 {
b.liud0ba7152024-06-19 14:47:21 +08001098 goto set_fail;
1099 }
1100 }
1101
b.liudbc3f4b2024-06-25 18:22:24 +08001102 if(mode & GNSS_SET_MSGCFG_ZDA)
1103 {
b.liud0ba7152024-06-19 14:47:21 +08001104 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x07, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001105 if(gnss_set_result != GNSS_ERR_OK)
1106 {
b.liud0ba7152024-06-19 14:47:21 +08001107 goto set_fail;
1108 }
1109 }
1110
b.liudbc3f4b2024-06-25 18:22:24 +08001111 if(mode & GNSS_SET_MSGCFG_GST)
1112 {
b.liud0ba7152024-06-19 14:47:21 +08001113 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x08, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001114 if(gnss_set_result != GNSS_ERR_OK)
1115 {
b.liud0ba7152024-06-19 14:47:21 +08001116 goto set_fail;
1117 }
1118 }
1119
b.liudbc3f4b2024-06-25 18:22:24 +08001120 if(mode & GNSS_SET_MSGCFG_TXT)
1121 {
b.liud0ba7152024-06-19 14:47:21 +08001122 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x20, time);
b.liudbc3f4b2024-06-25 18:22:24 +08001123 if(gnss_set_result != GNSS_ERR_OK)
1124 {
b.liud0ba7152024-06-19 14:47:21 +08001125 goto set_fail;
1126 }
1127 }
b.liudbc3f4b2024-06-25 18:22:24 +08001128 }
1129 else
1130 {
b.liud0ba7152024-06-19 14:47:21 +08001131 gnss_set_result = GNSS_ERR_ARG;
1132 goto set_fail;
1133 }
1134
1135 should_wait_rsp = TRUE;
b.liudbc3f4b2024-06-25 18:22:24 +08001136 }
yq.wang9dd771b2024-09-13 23:38:40 -07001137 else if(memcmp(cmd, "$AGPSCFG", 8) == 0) // $AGPSCFG,<host>,<id>,<passwd>
1138 {
1139 char host[GNSS_AGPS_LEN_MAX] = {0};
1140 char id[GNSS_AGPS_LEN_MAX] = {0};
1141 char passwd[GNSS_AGPS_LEN_MAX] = {0};
1142 if(3 == sscanf(cmd, "$AGPSCFG,%[^,],%[^,],%s", host, id, passwd))
1143 {
1144 LOGD("agps: %s, %s, %s", host, id, passwd);
1145 memset(agps_info.host, 0x0, GNSS_AGPS_LEN_MAX);
1146 if(memcmp(host, "NULL", 4))
1147 {
1148 memcpy(agps_info.host, host, strlen(host));
1149 }
1150
1151 memset(agps_info.id, 0x0, GNSS_AGPS_LEN_MAX);
1152 if(memcmp(id, "NULL", 4))
1153 {
1154 memcpy(agps_info.id, id, strlen(id));
1155 }
1156
1157 memset(agps_info.passwd, 0x0, GNSS_AGPS_LEN_MAX);
1158 if(memcmp(passwd, "NULL", 4))
1159 {
1160 memcpy(agps_info.passwd, passwd, strlen(passwd));
1161 }
1162 }
1163 else
1164 {
1165 gnss_set_result = GNSS_ERR_ARG;
1166 goto set_fail;
1167 }
1168
1169 should_wait_rsp = FALSE;
1170 }
yq.wang51d17352024-09-23 04:54:46 -07001171 else if(memcmp(cmd, "$VER", 4) == 0) // $VER
b.liudbc3f4b2024-06-25 18:22:24 +08001172 {
yq.wang51d17352024-09-23 04:54:46 -07001173 gnss_set_cmd_rsp = (char *)cmd_rsp;
1174 gnss_cmd_rsp_len = cmd_rsp_len;
1175 gnss_set_result = gnss_8122_ver(fd);
b.liudbc3f4b2024-06-25 18:22:24 +08001176 if(gnss_set_result != GNSS_ERR_OK)
1177 {
b.liud0ba7152024-06-19 14:47:21 +08001178 goto set_fail;
1179 }
yq.wang51d17352024-09-23 04:54:46 -07001180 }
1181 else if(memcmp(cmd, "$MINEL", 6) == 0) // $MINEL,<elev>
1182 {
1183 uint32 elev = 0;
1184 elev = (uint32)atoi(cmd + 7);
1185 LOGD("set minel: %d", elev);
1186 if(GNSS_SET_EVEL_5 == elev)
1187 {
1188 uint8 elev_buff[8] = {0x35, 0xFA, 0x8E, 0x3C, 0xC2, 0xB8, 0xB2, 0x3D};
1189 gnss_set_result = gnss_8122_minel(fd, elev_buff);
1190 if(gnss_set_result != GNSS_ERR_OK)
1191 {
1192 goto set_fail;
1193 }
1194 }
1195 else if(GNSS_SET_EVEL_15 == elev)
1196 {
1197 uint8 elev_buff[8] = {0x35, 0xFA, 0x8E, 0x3C, 0x92, 0x0A, 0x86, 0x3E};
1198 gnss_set_result = gnss_8122_minel(fd, elev_buff);
1199 if(gnss_set_result != GNSS_ERR_OK)
1200 {
1201 goto set_fail;
1202 }
1203 }
1204 else
1205 {
1206 gnss_set_result = GNSS_ERR_ARG;
1207 goto set_fail;
1208 }
1209 }
1210 else if(memcmp(cmd, "$PZ90CONV", 9) == 0) // $PZ90CONV,local,ref
1211 {
1212 int local = 0;
1213 int ref = 0;
1214 uint8 buff[44] = {0x00, 0x00, 0x00, 0x00, 0xA6, 0x54, 0x58, 0x41,
1215 0xCD, 0x8C, 0x8F, 0xCC, 0x56, 0x77, 0x6B, 0x3F,
1216 0x8F, 0xC2, 0xF5, 0xBC, 0x0A, 0xD7, 0x23, 0xBC,
1217 0x00, 0x00, 0x00, 0x00, 0x30, 0x62, 0x9F, 0x37,
1218 0x28, 0x29, 0x30, 0xB8, 0xBD, 0x37, 0x06, 0x36,
1219 0x00, 0x00, 0x00, 0x00};
b.liu9e8584b2024-11-06 19:21:28 +08001220
yq.wang51d17352024-09-23 04:54:46 -07001221 if(2 == sscanf(cmd, "$PZ90CONV,%d,%d", &local, &ref))
1222 {
1223 LOGD("set pz90conv: %d, %d", local, ref);
1224
b.liu9e8584b2024-11-06 19:21:28 +08001225
yq.wang51d17352024-09-23 04:54:46 -07001226 if(local == 1 && ref == 0) //PZ90
1227 {
1228 //
1229 }
1230 else if(local == 0 && ref == 0)
1231 {
1232 memset(buff, 0x00, 44);
1233 }
1234 else
1235 {
1236 gnss_set_result = GNSS_ERR_UNSUPPORT;
1237 goto set_fail;
1238 }
1239 }
1240 else
1241 {
1242 gnss_set_result = GNSS_ERR_ARG;
1243 goto set_fail;
1244 }
1245
1246 gnss_set_result = gnss_8122_PZ90CONV(fd, buff);
1247 if(gnss_set_result != GNSS_ERR_OK)
1248 {
1249 goto set_fail;
1250 }
b.liudbc3f4b2024-06-25 18:22:24 +08001251 }
1252 else if(memcmp(cmd, "$NMEACFG", 8) == 0) // $NMEACFG,<ver>
1253 {
b.liud0ba7152024-06-19 14:47:21 +08001254#if 0
1255 gnss_memaver_type_enum version = (gnss_memaver_type_enum)atoi(cmd + 9);
b.liudbc3f4b2024-06-25 18:22:24 +08001256 if(version == GNSS_MEMAVER_TYPE_3_0)
1257 {
b.liud0ba7152024-06-19 14:47:21 +08001258 gnss_set_result = gnss_8122_nmeaver(fd, 1);
b.liudbc3f4b2024-06-25 18:22:24 +08001259 }
1260 else if(version == GNSS_MEMAVER_TYPE_4_0)
1261 {
b.liud0ba7152024-06-19 14:47:21 +08001262 gnss_set_result = gnss_8122_nmeaver(fd, 2);
b.liudbc3f4b2024-06-25 18:22:24 +08001263 }
1264 else if(version == GNSS_MEMAVER_TYPE_4_1)
1265 {
b.liud0ba7152024-06-19 14:47:21 +08001266 gnss_set_result = gnss_8122_nmeaver(fd, 3);
b.liudbc3f4b2024-06-25 18:22:24 +08001267 }
1268 else
1269 {
b.liud0ba7152024-06-19 14:47:21 +08001270 gnss_set_result = GNSS_ERR_ARG;
1271 goto set_fail;
1272 }
b.liudbc3f4b2024-06-25 18:22:24 +08001273 if(gnss_set_result != GNSS_ERR_OK)
1274 {
b.liud0ba7152024-06-19 14:47:21 +08001275 goto set_fail;
1276 }
1277 should_wait_rsp = FALSE;
1278#else
1279 gnss_set_result = GNSS_ERR_UNSUPPORT;
1280 goto set_fail;
1281#endif
b.liu5f950c52024-06-15 20:13:12 +08001282 }
1283 else
1284 {
1285 LOGW("Unknown cmd:%s", cmd);
1286 gnss_set_result = GNSS_ERR_UNSUPPORT;
1287 goto set_fail;
1288 }
1289
b.liu9e8584b2024-11-06 19:21:28 +08001290// set_success:
b.liudbc3f4b2024-06-25 18:22:24 +08001291 if(should_wait_rsp)
1292 {
b.liud0ba7152024-06-19 14:47:21 +08001293 setting_waitting = TRUE;
b.liu5f950c52024-06-15 20:13:12 +08001294 pthread_mutex_lock(&read_mutex);
1295 pthread_cond_wait(&read_cond, &read_mutex);
1296 pthread_mutex_unlock(&read_mutex);
b.liudbc3f4b2024-06-25 18:22:24 +08001297 }
1298 else
1299 {
b.liu5f950c52024-06-15 20:13:12 +08001300 mbtk_timer_clear();
1301 }
1302
yq.wang51d17352024-09-23 04:54:46 -07001303 if(gnss_set_cmd_rsp != NULL)
1304 {
1305 gnss_set_cmd_rsp = NULL;
1306 gnss_cmd_rsp_len = 0;
1307 }
b.liu5f950c52024-06-15 20:13:12 +08001308 setting_busy = FALSE;
1309 return gnss_set_result;
b.liudbc3f4b2024-06-25 18:22:24 +08001310 set_fail:
yq.wang51d17352024-09-23 04:54:46 -07001311 if(gnss_set_cmd_rsp != NULL)
1312 {
1313 gnss_set_cmd_rsp = NULL;
1314 gnss_cmd_rsp_len = 0;
1315 }
b.liu5f950c52024-06-15 20:13:12 +08001316 setting_busy = FALSE;
1317 mbtk_timer_clear();
1318 return gnss_set_result;
1319 }
b.liuf9fbfa12024-06-14 15:53:59 +08001320}
1321
b.liu5f950c52024-06-15 20:13:12 +08001322