1 /* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
12 * * Neither the name of The Linux Foundation, nor the names of its
13 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29
30 #define LOG_NDDEBUG 0
31 #define LOG_TAG "LocSvc_afw"
32
33 #include <hardware/gps.h>
34 #include <gps_extended.h>
35 #include <loc_eng.h>
36 #include <loc_target.h>
37 #include <loc_log.h>
38 #include <fcntl.h>
39 #include <errno.h>
40 #include <dlfcn.h>
41 #include <sys/types.h>
42 #include <sys/stat.h>
43 #include <fcntl.h>
44 #include <errno.h>
45 #include <LocDualContext.h>
46 #include <cutils/properties.h>
47
48 using namespace loc_core;
49
50 #define LOC_PM_CLIENT_NAME "GPS"
51
52 //Globals defns
53 static gps_location_callback gps_loc_cb = NULL;
54 static gps_sv_status_callback gps_sv_cb = NULL;
55
56 static void local_loc_cb(UlpLocation* location, void* locExt);
57 static void local_sv_cb(GpsSvStatus* sv_status, void* svExt);
58
59 static const GpsGeofencingInterface* get_geofence_interface(void);
60
61 // Function declarations for sLocEngInterface
62 static int loc_init(GpsCallbacks* callbacks);
63 static int loc_start();
64 static int loc_stop();
65 static void loc_cleanup();
66 static int loc_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty);
67 static int loc_inject_location(double latitude, double longitude, float accuracy);
68 static void loc_delete_aiding_data(GpsAidingData f);
69 static int loc_set_position_mode(GpsPositionMode mode, GpsPositionRecurrence recurrence,
70 uint32_t min_interval, uint32_t preferred_accuracy,
71 uint32_t preferred_time);
72 static const void* loc_get_extension(const char* name);
73 // Defines the GpsInterface in gps.h
74 static const GpsInterface sLocEngInterface =
75 {
76 sizeof(GpsInterface),
77 loc_init,
78 loc_start,
79 loc_stop,
80 loc_cleanup,
81 loc_inject_time,
82 loc_inject_location,
83 loc_delete_aiding_data,
84 loc_set_position_mode,
85 loc_get_extension
86 };
87
88 // Function declarations for sLocEngAGpsInterface
89 static void loc_agps_init(AGpsCallbacks* callbacks);
90 static int loc_agps_open(const char* apn);
91 static int loc_agps_closed();
92 static int loc_agps_open_failed();
93 static int loc_agps_set_server(AGpsType type, const char *hostname, int port);
94 static int loc_agps_open_with_apniptype( const char* apn, ApnIpType apnIpType);
95
96 static const AGpsInterface sLocEngAGpsInterface =
97 {
98 sizeof(AGpsInterface),
99 loc_agps_init,
100 loc_agps_open,
101 loc_agps_closed,
102 loc_agps_open_failed,
103 loc_agps_set_server,
104 loc_agps_open_with_apniptype
105 };
106
107 static int loc_xtra_init(GpsXtraCallbacks* callbacks);
108 static int loc_xtra_inject_data(char* data, int length);
109
110 static const GpsXtraInterface sLocEngXTRAInterface =
111 {
112 sizeof(GpsXtraInterface),
113 loc_xtra_init,
114 loc_xtra_inject_data
115 };
116
117 static void loc_ni_init(GpsNiCallbacks *callbacks);
118 static void loc_ni_respond(int notif_id, GpsUserResponseType user_response);
119
120 static const GpsNiInterface sLocEngNiInterface =
121 {
122 sizeof(GpsNiInterface),
123 loc_ni_init,
124 loc_ni_respond,
125 };
126
127 static int loc_gps_measurement_init(GpsMeasurementCallbacks* callbacks);
128 static void loc_gps_measurement_close();
129
130 static const GpsMeasurementInterface sLocEngGpsMeasurementInterface =
131 {
132 sizeof(GpsMeasurementInterface),
133 loc_gps_measurement_init,
134 loc_gps_measurement_close
135 };
136
137 static void loc_agps_ril_init( AGpsRilCallbacks* callbacks );
138 static void loc_agps_ril_set_ref_location(const AGpsRefLocation *agps_reflocation, size_t sz_struct);
139 static void loc_agps_ril_set_set_id(AGpsSetIDType type, const char* setid);
140 static void loc_agps_ril_ni_message(uint8_t *msg, size_t len);
141 static void loc_agps_ril_update_network_state(int connected, int type, int roaming, const char* extra_info);
142 static void loc_agps_ril_update_network_availability(int avaiable, const char* apn);
143
144 static const AGpsRilInterface sLocEngAGpsRilInterface =
145 {
146 sizeof(AGpsRilInterface),
147 loc_agps_ril_init,
148 loc_agps_ril_set_ref_location,
149 loc_agps_ril_set_set_id,
150 loc_agps_ril_ni_message,
151 loc_agps_ril_update_network_state,
152 loc_agps_ril_update_network_availability
153 };
154
155 static int loc_agps_install_certificates(const DerEncodedCertificate* certificates,
156 size_t length);
157 static int loc_agps_revoke_certificates(const Sha1CertificateFingerprint* fingerprints,
158 size_t length);
159
160 static const SuplCertificateInterface sLocEngAGpsCertInterface =
161 {
162 sizeof(SuplCertificateInterface),
163 loc_agps_install_certificates,
164 loc_agps_revoke_certificates
165 };
166
167 static void loc_configuration_update(const char* config_data, int32_t length);
168
169 static const GnssConfigurationInterface sLocEngConfigInterface =
170 {
171 sizeof(GnssConfigurationInterface),
172 loc_configuration_update
173 };
174
175 static loc_eng_data_s_type loc_afw_data;
176 static int gss_fd = -1;
177 static int sGnssType = GNSS_UNKNOWN;
178 /*===========================================================================
179 FUNCTION gps_get_hardware_interface
180
181 DESCRIPTION
182 Returns the GPS hardware interaface based on LOC API
183 if GPS is enabled.
184
185 DEPENDENCIES
186 None
187
188 RETURN VALUE
189 0: success
190
191 SIDE EFFECTS
192 N/A
193
194 ===========================================================================*/
gps_get_hardware_interface()195 const GpsInterface* gps_get_hardware_interface ()
196 {
197 ENTRY_LOG_CALLFLOW();
198 const GpsInterface* ret_val;
199
200 char propBuf[PROPERTY_VALUE_MAX];
201
202 loc_eng_read_config();
203
204 // check to see if GPS should be disabled
205 property_get("gps.disable", propBuf, "");
206 if (propBuf[0] == '1')
207 {
208 LOC_LOGD("gps_get_interface returning NULL because gps.disable=1\n");
209 ret_val = NULL;
210 } else {
211 ret_val = &sLocEngInterface;
212 }
213
214 loc_eng_read_config();
215
216 EXIT_LOG(%p, ret_val);
217 return ret_val;
218 }
219
220 // for gps.c
get_gps_interface()221 extern "C" const GpsInterface* get_gps_interface()
222 {
223 unsigned int target = TARGET_DEFAULT;
224 loc_eng_read_config();
225
226 target = loc_get_target();
227 LOC_LOGD("Target name check returned %s", loc_get_target_name(target));
228
229 sGnssType = getTargetGnssType(target);
230 switch (sGnssType)
231 {
232 case GNSS_GSS:
233 case GNSS_AUTO:
234 //APQ8064
235 gps_conf.CAPABILITIES &= ~(GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB);
236 gss_fd = open("/dev/gss", O_RDONLY);
237 if (gss_fd < 0) {
238 LOC_LOGE("GSS open failed: %s\n", strerror(errno));
239 }
240 else {
241 LOC_LOGD("GSS open success! CAPABILITIES %0lx\n",
242 gps_conf.CAPABILITIES);
243 }
244 break;
245 case GNSS_NONE:
246 //MPQ8064
247 LOC_LOGE("No GPS HW on this target. Not returning interface.");
248 return NULL;
249 case GNSS_QCA1530:
250 // qca1530 chip is present
251 gps_conf.CAPABILITIES &= ~(GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB);
252 LOC_LOGD("qca1530 present: CAPABILITIES %0lx\n", gps_conf.CAPABILITIES);
253 break;
254 }
255 return &sLocEngInterface;
256 }
257
258 /*===========================================================================
259 FUNCTION loc_init
260
261 DESCRIPTION
262 Initialize the location engine, this include setting up global datas
263 and registers location engien with loc api service.
264
265 DEPENDENCIES
266 None
267
268 RETURN VALUE
269 0: success
270
271 SIDE EFFECTS
272 N/Ax
273
274 ===========================================================================*/
loc_init(GpsCallbacks * callbacks)275 static int loc_init(GpsCallbacks* callbacks)
276 {
277 int retVal = -1;
278 ENTRY_LOG();
279 LOC_API_ADAPTER_EVENT_MASK_T event;
280
281 if (NULL == callbacks) {
282 LOC_LOGE("loc_init failed. cb = NULL\n");
283 EXIT_LOG(%d, retVal);
284 return retVal;
285 }
286
287 event = LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
288 LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT |
289 LOC_API_ADAPTER_BIT_SATELLITE_REPORT |
290 LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST |
291 LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST |
292 LOC_API_ADAPTER_BIT_IOCTL_REPORT |
293 LOC_API_ADAPTER_BIT_STATUS_REPORT |
294 LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT |
295 LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST;
296
297 LocCallbacks clientCallbacks = {local_loc_cb, /* location_cb */
298 callbacks->status_cb, /* status_cb */
299 local_sv_cb, /* sv_status_cb */
300 callbacks->nmea_cb, /* nmea_cb */
301 callbacks->set_capabilities_cb, /* set_capabilities_cb */
302 callbacks->acquire_wakelock_cb, /* acquire_wakelock_cb */
303 callbacks->release_wakelock_cb, /* release_wakelock_cb */
304 callbacks->create_thread_cb, /* create_thread_cb */
305 NULL, /* location_ext_parser */
306 NULL, /* sv_ext_parser */
307 callbacks->request_utc_time_cb, /* request_utc_time_cb */
308 callbacks->set_system_info_cb, /* set_system_info_cb */
309 callbacks->gnss_sv_status_cb, /* gnss_sv_status_cb */
310 };
311
312 gps_loc_cb = callbacks->location_cb;
313 gps_sv_cb = callbacks->sv_status_cb;
314
315 retVal = loc_eng_init(loc_afw_data, &clientCallbacks, event, NULL);
316 loc_afw_data.adapter->mSupportsAgpsRequests = !loc_afw_data.adapter->hasAgpsExtendedCapabilities();
317 loc_afw_data.adapter->mSupportsPositionInjection = !loc_afw_data.adapter->hasCPIExtendedCapabilities();
318 loc_afw_data.adapter->mSupportsTimeInjection = !loc_afw_data.adapter->hasCPIExtendedCapabilities();
319 loc_afw_data.adapter->setGpsLockMsg(0);
320 loc_afw_data.adapter->requestUlp(ContextBase::getCarrierCapabilities());
321
322 if(retVal) {
323 LOC_LOGE("loc_eng_init() fail!");
324 goto err;
325 }
326
327 loc_afw_data.adapter->setPowerVoteRight(loc_get_target() == TARGET_QCA1530);
328 loc_afw_data.adapter->setPowerVote(true);
329
330 LOC_LOGD("loc_eng_init() success!");
331
332 err:
333 EXIT_LOG(%d, retVal);
334 return retVal;
335 }
336
337 /*===========================================================================
338 FUNCTION loc_cleanup
339
340 DESCRIPTION
341 Cleans location engine. The location client handle will be released.
342
343 DEPENDENCIES
344 None
345
346 RETURN VALUE
347 None
348
349 SIDE EFFECTS
350 N/A
351
352 ===========================================================================*/
loc_cleanup()353 static void loc_cleanup()
354 {
355 ENTRY_LOG();
356
357 loc_afw_data.adapter->setPowerVote(false);
358 loc_afw_data.adapter->setGpsLockMsg(gps_conf.GPS_LOCK);
359
360 loc_eng_cleanup(loc_afw_data);
361 gps_loc_cb = NULL;
362 gps_sv_cb = NULL;
363
364 EXIT_LOG(%s, VOID_RET);
365 }
366
367 /*===========================================================================
368 FUNCTION loc_start
369
370 DESCRIPTION
371 Starts the tracking session
372
373 DEPENDENCIES
374 None
375
376 RETURN VALUE
377 0: success
378
379 SIDE EFFECTS
380 N/A
381
382 ===========================================================================*/
loc_start()383 static int loc_start()
384 {
385 ENTRY_LOG();
386 int ret_val = loc_eng_start(loc_afw_data);
387
388 EXIT_LOG(%d, ret_val);
389 return ret_val;
390 }
391
392 /*===========================================================================
393 FUNCTION loc_stop
394
395 DESCRIPTION
396 Stops the tracking session
397
398 DEPENDENCIES
399 None
400
401 RETURN VALUE
402 0: success
403
404 SIDE EFFECTS
405 N/A
406
407 ===========================================================================*/
loc_stop()408 static int loc_stop()
409 {
410 ENTRY_LOG();
411 int ret_val = -1;
412 ret_val = loc_eng_stop(loc_afw_data);
413
414 EXIT_LOG(%d, ret_val);
415 return ret_val;
416 }
417
418 /*===========================================================================
419 FUNCTION loc_set_position_mode
420
421 DESCRIPTION
422 Sets the mode and fix frequency for the tracking session.
423
424 DEPENDENCIES
425 None
426
427 RETURN VALUE
428 0: success
429
430 SIDE EFFECTS
431 N/A
432
433 ===========================================================================*/
loc_set_position_mode(GpsPositionMode mode,GpsPositionRecurrence recurrence,uint32_t min_interval,uint32_t preferred_accuracy,uint32_t preferred_time)434 static int loc_set_position_mode(GpsPositionMode mode,
435 GpsPositionRecurrence recurrence,
436 uint32_t min_interval,
437 uint32_t preferred_accuracy,
438 uint32_t preferred_time)
439 {
440 ENTRY_LOG();
441 int ret_val = -1;
442 LocPositionMode locMode;
443 switch (mode) {
444 case GPS_POSITION_MODE_MS_BASED:
445 locMode = LOC_POSITION_MODE_MS_BASED;
446 break;
447 case GPS_POSITION_MODE_MS_ASSISTED:
448 locMode = LOC_POSITION_MODE_MS_ASSISTED;
449 break;
450 default:
451 locMode = LOC_POSITION_MODE_STANDALONE;
452 break;
453 }
454
455 LocPosMode params(locMode, recurrence, min_interval,
456 preferred_accuracy, preferred_time, NULL, NULL);
457 ret_val = loc_eng_set_position_mode(loc_afw_data, params);
458
459 EXIT_LOG(%d, ret_val);
460 return ret_val;
461 }
462
463 /*===========================================================================
464 FUNCTION loc_inject_time
465
466 DESCRIPTION
467 This is used by Java native function to do time injection.
468
469 DEPENDENCIES
470 None
471
472 RETURN VALUE
473 0
474
475 SIDE EFFECTS
476 N/A
477
478 ===========================================================================*/
loc_inject_time(GpsUtcTime time,int64_t timeReference,int uncertainty)479 static int loc_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty)
480 {
481 ENTRY_LOG();
482 int ret_val = 0;
483
484 ret_val = loc_eng_inject_time(loc_afw_data, time,
485 timeReference, uncertainty);
486
487 EXIT_LOG(%d, ret_val);
488 return ret_val;
489 }
490
491
492 /*===========================================================================
493 FUNCTION loc_inject_location
494
495 DESCRIPTION
496 This is used by Java native function to do location injection.
497
498 DEPENDENCIES
499 None
500
501 RETURN VALUE
502 0 : Successful
503 error code : Failure
504
505 SIDE EFFECTS
506 N/A
507 ===========================================================================*/
loc_inject_location(double latitude,double longitude,float accuracy)508 static int loc_inject_location(double latitude, double longitude, float accuracy)
509 {
510 ENTRY_LOG();
511
512 int ret_val = 0;
513 ret_val = loc_eng_inject_location(loc_afw_data, latitude, longitude, accuracy);
514
515 EXIT_LOG(%d, ret_val);
516 return ret_val;
517 }
518
519
520 /*===========================================================================
521 FUNCTION loc_delete_aiding_data
522
523 DESCRIPTION
524 This is used by Java native function to delete the aiding data. The function
525 updates the global variable for the aiding data to be deleted. If the GPS
526 engine is off, the aiding data will be deleted. Otherwise, the actual action
527 will happen when gps engine is turned off.
528
529 DEPENDENCIES
530 Assumes the aiding data type specified in GpsAidingData matches with
531 LOC API specification.
532
533 RETURN VALUE
534 None
535
536 SIDE EFFECTS
537 N/A
538
539 ===========================================================================*/
loc_delete_aiding_data(GpsAidingData f)540 static void loc_delete_aiding_data(GpsAidingData f)
541 {
542 ENTRY_LOG();
543
544 #ifndef TARGET_BUILD_VARIANT_USER
545 loc_eng_delete_aiding_data(loc_afw_data, f);
546 #endif
547
548 EXIT_LOG(%s, VOID_RET);
549 }
550
get_geofence_interface(void)551 const GpsGeofencingInterface* get_geofence_interface(void)
552 {
553 ENTRY_LOG();
554 void *handle;
555 const char *error;
556 typedef const GpsGeofencingInterface* (*get_gps_geofence_interface_function) (void);
557 get_gps_geofence_interface_function get_gps_geofence_interface;
558 static const GpsGeofencingInterface* geofence_interface = NULL;
559
560 dlerror(); /* Clear any existing error */
561
562 handle = dlopen ("libgeofence.so", RTLD_NOW);
563
564 if (!handle)
565 {
566 if ((error = dlerror()) != NULL) {
567 LOC_LOGE ("%s, dlopen for libgeofence.so failed, error = %s\n", __func__, error);
568 }
569 goto exit;
570 }
571 dlerror(); /* Clear any existing error */
572 get_gps_geofence_interface = (get_gps_geofence_interface_function)dlsym(handle, "gps_geofence_get_interface");
573 if ((error = dlerror()) != NULL || NULL == get_gps_geofence_interface) {
574 LOC_LOGE ("%s, dlsym for get_gps_geofence_interface failed, error = %s\n", __func__, error);
575 goto exit;
576 }
577
578 geofence_interface = get_gps_geofence_interface();
579
580 exit:
581 EXIT_LOG(%d, geofence_interface == NULL);
582 return geofence_interface;
583 }
584 /*===========================================================================
585 FUNCTION loc_get_extension
586
587 DESCRIPTION
588 Get the gps extension to support XTRA.
589
590 DEPENDENCIES
591 N/A
592
593 RETURN VALUE
594 The GPS extension interface.
595
596 SIDE EFFECTS
597 N/A
598
599 ===========================================================================*/
loc_get_extension(const char * name)600 const void* loc_get_extension(const char* name)
601 {
602 ENTRY_LOG();
603 const void* ret_val = NULL;
604
605 LOC_LOGD("%s:%d] For Interface = %s\n",__func__, __LINE__, name);
606 if (strcmp(name, GPS_XTRA_INTERFACE) == 0)
607 {
608 ret_val = &sLocEngXTRAInterface;
609 }
610 else if (strcmp(name, AGPS_INTERFACE) == 0)
611 {
612 ret_val = &sLocEngAGpsInterface;
613 }
614 else if (strcmp(name, GPS_NI_INTERFACE) == 0)
615 {
616 ret_val = &sLocEngNiInterface;
617 }
618 else if (strcmp(name, AGPS_RIL_INTERFACE) == 0)
619 {
620 char baseband[PROPERTY_VALUE_MAX];
621 property_get("ro.baseband", baseband, "msm");
622 if (strcmp(baseband, "csfb") == 0)
623 {
624 ret_val = &sLocEngAGpsRilInterface;
625 }
626 }
627 else if (strcmp(name, GPS_GEOFENCING_INTERFACE) == 0)
628 {
629 if ((gps_conf.CAPABILITIES | GPS_CAPABILITY_GEOFENCING) == gps_conf.CAPABILITIES ){
630 ret_val = get_geofence_interface();
631 }
632 }
633 else if (strcmp(name, SUPL_CERTIFICATE_INTERFACE) == 0)
634 {
635 ret_val = &sLocEngAGpsCertInterface;
636 }
637 else if (strcmp(name, GNSS_CONFIGURATION_INTERFACE) == 0)
638 {
639 ret_val = &sLocEngConfigInterface;
640 }
641 else if (strcmp(name, GPS_MEASUREMENT_INTERFACE) == 0)
642 {
643 ret_val = &sLocEngGpsMeasurementInterface;
644 }
645 else
646 {
647 LOC_LOGE ("get_extension: Invalid interface passed in\n");
648 }
649 EXIT_LOG(%p, ret_val);
650 return ret_val;
651 }
652
653 /*===========================================================================
654 FUNCTION loc_agps_init
655
656 DESCRIPTION
657 Initialize the AGps interface.
658
659 DEPENDENCIES
660 NONE
661
662 RETURN VALUE
663 0
664
665 SIDE EFFECTS
666 N/A
667
668 ===========================================================================*/
loc_agps_init(AGpsCallbacks * callbacks)669 static void loc_agps_init(AGpsCallbacks* callbacks)
670 {
671 ENTRY_LOG();
672 loc_eng_agps_init(loc_afw_data, (AGpsExtCallbacks*)callbacks);
673 EXIT_LOG(%s, VOID_RET);
674 }
675
676 /*===========================================================================
677 FUNCTION loc_agps_open
678
679 DESCRIPTION
680 This function is called when on-demand data connection opening is successful.
681 It should inform ARM 9 about the data open result.
682
683 DEPENDENCIES
684 NONE
685
686 RETURN VALUE
687 0
688
689 SIDE EFFECTS
690 N/A
691
692 ===========================================================================*/
loc_agps_open(const char * apn)693 static int loc_agps_open(const char* apn)
694 {
695 ENTRY_LOG();
696 AGpsType agpsType = AGPS_TYPE_SUPL;
697 AGpsBearerType bearerType = AGPS_APN_BEARER_IPV4;
698 int ret_val = loc_eng_agps_open(loc_afw_data, agpsType, apn, bearerType);
699
700 EXIT_LOG(%d, ret_val);
701 return ret_val;
702 }
703
704 /*===========================================================================
705 FUNCTION loc_agps_open_with_apniptype
706
707 DESCRIPTION
708 This function is called when on-demand data connection opening is successful.
709 It should inform ARM 9 about the data open result.
710
711 DEPENDENCIES
712 NONE
713
714 RETURN VALUE
715 0
716
717 SIDE EFFECTS
718 N/A
719
720 ===========================================================================*/
loc_agps_open_with_apniptype(const char * apn,ApnIpType apnIpType)721 static int loc_agps_open_with_apniptype(const char* apn, ApnIpType apnIpType)
722 {
723 ENTRY_LOG();
724 AGpsType agpsType = AGPS_TYPE_SUPL;
725 AGpsBearerType bearerType;
726
727 switch (apnIpType) {
728 case APN_IP_IPV4:
729 bearerType = AGPS_APN_BEARER_IPV4;
730 break;
731 case APN_IP_IPV6:
732 bearerType = AGPS_APN_BEARER_IPV6;
733 break;
734 case APN_IP_IPV4V6:
735 bearerType = AGPS_APN_BEARER_IPV4V6;
736 break;
737 default:
738 bearerType = AGPS_APN_BEARER_IPV4;
739 break;
740 }
741
742 int ret_val = loc_eng_agps_open(loc_afw_data, agpsType, apn, bearerType);
743
744 EXIT_LOG(%d, ret_val);
745 return ret_val;
746 }
747
748 /*===========================================================================
749 FUNCTION loc_agps_closed
750
751 DESCRIPTION
752 This function is called when on-demand data connection closing is done.
753 It should inform ARM 9 about the data close result.
754
755 DEPENDENCIES
756 NONE
757
758 RETURN VALUE
759 0
760
761 SIDE EFFECTS
762 N/A
763
764 ===========================================================================*/
loc_agps_closed()765 static int loc_agps_closed()
766 {
767 ENTRY_LOG();
768 AGpsType agpsType = AGPS_TYPE_SUPL;
769 int ret_val = loc_eng_agps_closed(loc_afw_data, agpsType);
770
771 EXIT_LOG(%d, ret_val);
772 return ret_val;
773 }
774
775 /*===========================================================================
776 FUNCTION loc_agps_open_failed
777
778 DESCRIPTION
779 This function is called when on-demand data connection opening has failed.
780 It should inform ARM 9 about the data open result.
781
782 DEPENDENCIES
783 NONE
784
785 RETURN VALUE
786 0
787
788 SIDE EFFECTS
789 N/A
790
791 ===========================================================================*/
loc_agps_open_failed()792 int loc_agps_open_failed()
793 {
794 ENTRY_LOG();
795 AGpsType agpsType = AGPS_TYPE_SUPL;
796 int ret_val = loc_eng_agps_open_failed(loc_afw_data, agpsType);
797
798 EXIT_LOG(%d, ret_val);
799 return ret_val;
800 }
801
802 /*===========================================================================
803 FUNCTION loc_agps_set_server
804
805 DESCRIPTION
806 If loc_eng_set_server is called before loc_eng_init, it doesn't work. This
807 proxy buffers server settings and calls loc_eng_set_server when the client is
808 open.
809
810 DEPENDENCIES
811 NONE
812
813 RETURN VALUE
814 0
815
816 SIDE EFFECTS
817 N/A
818
819 ===========================================================================*/
loc_agps_set_server(AGpsType type,const char * hostname,int port)820 static int loc_agps_set_server(AGpsType type, const char* hostname, int port)
821 {
822 ENTRY_LOG();
823 LocServerType serverType;
824 switch (type) {
825 case AGPS_TYPE_SUPL:
826 serverType = LOC_AGPS_SUPL_SERVER;
827 break;
828 case AGPS_TYPE_C2K:
829 serverType = LOC_AGPS_CDMA_PDE_SERVER;
830 break;
831 default:
832 serverType = LOC_AGPS_SUPL_SERVER;
833 }
834 int ret_val = loc_eng_set_server_proxy(loc_afw_data, serverType, hostname, port);
835
836 EXIT_LOG(%d, ret_val);
837 return ret_val;
838 }
839
840 /*===========================================================================
841 FUNCTIONf571
842 loc_xtra_init
843
844 DESCRIPTION
845 Initialize XTRA module.
846
847 DEPENDENCIES
848 None
849
850 RETURN VALUE
851 0: success
852
853 SIDE EFFECTS
854 N/A
855
856 ===========================================================================*/
loc_xtra_init(GpsXtraCallbacks * callbacks)857 static int loc_xtra_init(GpsXtraCallbacks* callbacks)
858 {
859 ENTRY_LOG();
860 GpsXtraExtCallbacks extCallbacks;
861 memset(&extCallbacks, 0, sizeof(extCallbacks));
862 extCallbacks.download_request_cb = callbacks->download_request_cb;
863 int ret_val = loc_eng_xtra_init(loc_afw_data, &extCallbacks);
864
865 EXIT_LOG(%d, ret_val);
866 return ret_val;
867 }
868
869
870 /*===========================================================================
871 FUNCTION loc_xtra_inject_data
872
873 DESCRIPTION
874 Initialize XTRA module.
875
876 DEPENDENCIES
877 None
878
879 RETURN VALUE
880 0: success
881
882 SIDE EFFECTS
883 N/A
884
885 ===========================================================================*/
loc_xtra_inject_data(char * data,int length)886 static int loc_xtra_inject_data(char* data, int length)
887 {
888 ENTRY_LOG();
889 int ret_val = -1;
890 if( (data != NULL) && ((unsigned int)length <= XTRA_DATA_MAX_SIZE))
891 ret_val = loc_eng_xtra_inject_data(loc_afw_data, data, length);
892 else
893 LOC_LOGE("%s, Could not inject XTRA data. Buffer address: %p, length: %d",
894 __func__, data, length);
895 EXIT_LOG(%d, ret_val);
896 return ret_val;
897 }
898
899 /*===========================================================================
900 FUNCTION loc_gps_measurement_init
901
902 DESCRIPTION
903 This function initializes the gps measurement interface
904
905 DEPENDENCIES
906 NONE
907
908 RETURN VALUE
909 None
910
911 SIDE EFFECTS
912 N/A
913
914 ===========================================================================*/
loc_gps_measurement_init(GpsMeasurementCallbacks * callbacks)915 static int loc_gps_measurement_init(GpsMeasurementCallbacks* callbacks)
916 {
917 ENTRY_LOG();
918 int ret_val = loc_eng_gps_measurement_init(loc_afw_data,
919 callbacks);
920
921 EXIT_LOG(%d, ret_val);
922 return ret_val;
923 }
924
925 /*===========================================================================
926 FUNCTION loc_gps_measurement_close
927
928 DESCRIPTION
929 This function closes the gps measurement interface
930
931 DEPENDENCIES
932 NONE
933
934 RETURN VALUE
935 None
936
937 SIDE EFFECTS
938 N/A
939
940 ===========================================================================*/
loc_gps_measurement_close()941 static void loc_gps_measurement_close()
942 {
943 ENTRY_LOG();
944 loc_eng_gps_measurement_close(loc_afw_data);
945
946 EXIT_LOG(%s, VOID_RET);
947 }
948
949 /*===========================================================================
950 FUNCTION loc_ni_init
951
952 DESCRIPTION
953 This function initializes the NI interface
954
955 DEPENDENCIES
956 NONE
957
958 RETURN VALUE
959 None
960
961 SIDE EFFECTS
962 N/A
963
964 ===========================================================================*/
loc_ni_init(GpsNiCallbacks * callbacks)965 void loc_ni_init(GpsNiCallbacks *callbacks)
966 {
967 ENTRY_LOG();
968 loc_eng_ni_init(loc_afw_data,(GpsNiExtCallbacks*) callbacks);
969 EXIT_LOG(%s, VOID_RET);
970 }
971
972 /*===========================================================================
973 FUNCTION loc_ni_respond
974
975 DESCRIPTION
976 This function sends an NI respond to the modem processor
977
978 DEPENDENCIES
979 NONE
980
981 RETURN VALUE
982 None
983
984 SIDE EFFECTS
985 N/A
986
987 ===========================================================================*/
loc_ni_respond(int notif_id,GpsUserResponseType user_response)988 void loc_ni_respond(int notif_id, GpsUserResponseType user_response)
989 {
990 ENTRY_LOG();
991 loc_eng_ni_respond(loc_afw_data, notif_id, user_response);
992 EXIT_LOG(%s, VOID_RET);
993 }
994
995 // Below stub functions are members of sLocEngAGpsRilInterface
loc_agps_ril_init(AGpsRilCallbacks * callbacks)996 static void loc_agps_ril_init( AGpsRilCallbacks* callbacks ) {}
loc_agps_ril_set_ref_location(const AGpsRefLocation * agps_reflocation,size_t sz_struct)997 static void loc_agps_ril_set_ref_location(const AGpsRefLocation *agps_reflocation, size_t sz_struct) {}
loc_agps_ril_set_set_id(AGpsSetIDType type,const char * setid)998 static void loc_agps_ril_set_set_id(AGpsSetIDType type, const char* setid) {}
loc_agps_ril_ni_message(uint8_t * msg,size_t len)999 static void loc_agps_ril_ni_message(uint8_t *msg, size_t len) {}
loc_agps_ril_update_network_state(int connected,int type,int roaming,const char * extra_info)1000 static void loc_agps_ril_update_network_state(int connected, int type, int roaming, const char* extra_info) {}
1001
1002 /*===========================================================================
1003 FUNCTION loc_agps_ril_update_network_availability
1004
1005 DESCRIPTION
1006 Sets data call allow vs disallow flag to modem
1007 This is the only member of sLocEngAGpsRilInterface implemented.
1008
1009 DEPENDENCIES
1010 None
1011
1012 RETURN VALUE
1013 0: success
1014
1015 SIDE EFFECTS
1016 N/A
1017
1018 ===========================================================================*/
loc_agps_ril_update_network_availability(int available,const char * apn)1019 static void loc_agps_ril_update_network_availability(int available, const char* apn)
1020 {
1021 ENTRY_LOG();
1022 loc_eng_agps_ril_update_network_availability(loc_afw_data, available, apn);
1023 EXIT_LOG(%s, VOID_RET);
1024 }
1025
loc_agps_install_certificates(const DerEncodedCertificate * certificates,size_t length)1026 static int loc_agps_install_certificates(const DerEncodedCertificate* certificates,
1027 size_t length)
1028 {
1029 ENTRY_LOG();
1030 int ret_val = loc_eng_agps_install_certificates(loc_afw_data, certificates, length);
1031 EXIT_LOG(%d, ret_val);
1032 return ret_val;
1033 }
loc_agps_revoke_certificates(const Sha1CertificateFingerprint * fingerprints,size_t length)1034 static int loc_agps_revoke_certificates(const Sha1CertificateFingerprint* fingerprints,
1035 size_t length)
1036 {
1037 ENTRY_LOG();
1038 LOC_LOGE("%s:%d]: agps_revoke_certificates not supported");
1039 int ret_val = AGPS_CERTIFICATE_ERROR_GENERIC;
1040 EXIT_LOG(%d, ret_val);
1041 return ret_val;
1042 }
1043
loc_configuration_update(const char * config_data,int32_t length)1044 static void loc_configuration_update(const char* config_data, int32_t length)
1045 {
1046 ENTRY_LOG();
1047 loc_eng_configuration_update(loc_afw_data, config_data, length);
1048 switch (sGnssType)
1049 {
1050 case GNSS_GSS:
1051 case GNSS_AUTO:
1052 case GNSS_QCA1530:
1053 //APQ
1054 gps_conf.CAPABILITIES &= ~(GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB);
1055 break;
1056 }
1057 EXIT_LOG(%s, VOID_RET);
1058 }
1059
local_loc_cb(UlpLocation * location,void * locExt)1060 static void local_loc_cb(UlpLocation* location, void* locExt)
1061 {
1062 ENTRY_LOG();
1063 if (NULL != location) {
1064 CALLBACK_LOG_CALLFLOW("location_cb - from", %d, location->position_source);
1065
1066 if (NULL != gps_loc_cb) {
1067 gps_loc_cb(&location->gpsLocation);
1068 }
1069 }
1070 EXIT_LOG(%s, VOID_RET);
1071 }
1072
local_sv_cb(GpsSvStatus * sv_status,void * svExt)1073 static void local_sv_cb(GpsSvStatus* sv_status, void* svExt)
1074 {
1075 ENTRY_LOG();
1076 if (NULL != gps_sv_cb) {
1077 CALLBACK_LOG_CALLFLOW("sv_status_cb -", %d, sv_status->num_svs);
1078 gps_sv_cb(sv_status);
1079 }
1080 EXIT_LOG(%s, VOID_RET);
1081 }
1082
1083