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