This implementation is based on GPS Library in HTC-HD2 Android Libraries. (Thanks to dan1j3l.)
You can find my modified source code and AGPS development info in the second post.
Downloads:
Mod edit: Links removed
You can install GPS Status & Toolbox or GPS TEST to test the new libs.
Credits: the XDAndroid Project, dan1j3l, rmcc, tytung, arne182, clyder, ozkaya, qwerty_7564, and everyone who participated in the related discussion or helped test the libs.
You can find my modified source code and AGPS development info in the second post.
New Features:
- Show the number of satellites before getting a location fix.
- Show or hide the GPS symbol in the status bar instantly when you start or stop a GPS app.
- Support the leap seconds. (Thanks to arne182.)
- Modify the Accuracy (i.e. Error in meter) to be more reasonable.
- Add AGPS interface. (Won't see "no AGPS interface in agps_data_conn_open" in logcat now.)
- Add the missing functions to receive the NTP, XTRA, and SUPL settings from gps.conf.
- Add AGPS implementation including injecting AGPS data (xtra.bin) and NTP time into the gpsOne engine.
- Hide Fix/Sats info and make the GPS symbol in the status bar flashing when you go to basement or tunnel.
- Show DOP/HDOP/VDOP values in GPS Status.
- Show Altitude above Geoid (i.e. mean sea level) and Geoid height. (You will see both of them in GPS Status. The value within parentheses is Geoid height.)
- Show correct SNR (Signal to noise ratio) value.
- Activate the AGPS data injection. (You can get a cold lock very quickly due to the working AGPS.) (Thanks to qwerty_7564.)
Known issues:
- Accuracy value is for reference only.
- Position Accuracy (meter) = HDOP (unitless) * Measurement Precision (meter). (Please confirm whether this formula is correct.)
- We only get the correct HDOP value, and we assume the value of Measurement Precision, and then do a post calculation to get Accuracy. So don't trust it completely.
- Some ROMs are not compatible with NMEA version of libgps.so.
- Those ROMs don't set the correct permission to /dev/smd27, so libgps.so cannot read NMEA sentences from it.
- The solution is to flash GPS_NMEA_permission_update.zip for correcting the permission after booting.
- Some ROMs suffer from the "GPS off-and-on" bug.
- Those ROMs can shutdown the gpsOne engine properly when turning off GPS setting using gps_cleanup(), but they cannot restart the gpsOne engine again because gps_init() is never called when turning GPS setting on after turning it off.
- It's a Gingerbread bug which is fixed by applying this commit from the source code.
- If you cannot modify the source code, the workaround is to set/add GPS1_CLEANUP_ENABLED=0 into gps.conf to avoid doing full cleanup.
Downloads:
Mod edit: Links removed
Installation for CWM:
- Place your downloaded file (GPS_Libraries_v1.x_for_HD2_Gingerbread_update.zip) in the SD card.
- Enter CWM (ClockworkMod) Recovery
- MAGLDR 1.13: Hold "Power" button during boot to enter MAGLDR, and then select "AD Recovery" or "Boot AD SD" (if ever copied CWM's initrd.gz and zImage to SD) to enter CMW.
- cLK 1.4.0.1: Hold "Home" button during boot to enter CMW.
- Choose install zip from sdcard and locate your downloaded file to finish the installation.
- All done.
You can install GPS Status & Toolbox or GPS TEST to test the new libs.
How to inject the AGPS data (xtra.bin):
It will be done in the following situations. (Data connection, WiFi or 3G, is a must in all of them.)
- When you turn off GPS in setting and turn it on again.
- When you keep GPS on and reboot. (also inject NTP time)
- When you keep GPS on and run Leo AGPS Injector. (also inject NTP time)
- When you keep GPS on and run GPS Status. (or any similar apps to download AGPS)
- AGPS will be downloaded when you start GPS Status if AGPS is older than X days or Y hours where X and Y are read from the settings.
- Or you can download it manually from Tools.
- When you keep GPS on and replace with the modified gps.conf to set AGPS auto-download intervals when using GPS libs v1.8 or above.
- AGPS auto-download intervals are disabled in default if you don't modify gps.conf.
How to verify if AGPS works or not:
- When AGPS works, you will be able to get a full lock (e.g. 7/7, 8/8, or 9/9) in cold start less than 20 seconds if you're outdoor in a sunny day.
(Full locks mean fix and satellites equals to each other.)- If AGPS not works, you may see 5/7, 6/7, 5/8 (fix is less than satellites) right after you get a lock.
How /system/etc/gps.conf works?
There're three stock gps.conf in AOSP repository for different regions.
1. gps.conf_AS_SUPL (Asia)
2. gps.conf_EU_SUPL (Europe)
3. gps.conf_US_SUPL (North-America)
SUPL_HOST and SUPL_PORT are not used in current GPS libs implementation, so you can delete them.# Explanations are added. Don't copy them below to your gps.conf.
NTP_SERVER=north-america.pool.ntp.org (Used for NTP time injection)
XTRA_SERVER_1=http://xtra1.gpsonextra.net/xtra.bin (Used for AGPS data xtra.bin injection. Randomly choose from one of these three servers and download xtra.bin from it.)
XTRA_SERVER_2=http://xtra2.gpsonextra.net/xtra.bin
XTRA_SERVER_3=http://xtra3.gpsonextra.net/xtra.bin
SUPL_HOST=supl.google.com (Be read but never be used)
SUPL_PORT=7276 (Be read but never be used)
Supported extra settings for /system/etc/gps.conf when using v2.0 or above. (Only valid for HD2)
Beginning with character # means this line is a comment, so you can remove it.
You don't need to add any of them if you don't know what they are.
Code:########################################### # Enable/disable automatic (periodic) # # download requests of gpsOneXTRA # # assistance data to client # # Range: 0 to 1 # # Default: 0 (Disabled) # ########################################### [COLOR="Red"]GPS1_XTRA_AUTO_DOWNLOAD_ENABLED=0[/COLOR] ########################################### # Time (in hours) between automatic # # download requests of gpsOneXTRA # # assistance data to client # # Range: 1 to 168 (168 = hr in a week) # # Default: 24 hr # ########################################### [COLOR="red"]GPS1_XTRA_DOWNLOAD_INTERVAL=24[/COLOR] ########################################### # Enable/disable to shutdown the gpsOne # # engine properly on GPS off # # Range: 0 to 1 # # Default: 1 (Enabled) # ########################################### [COLOR="red"]GPS1_CLEANUP_ENABLED=1[/COLOR] ########################################### # Time (in seconds) between invoking # # pdsm_get_position() # # Range: 2 to 120 # # Default: 2 seconds # ########################################### [COLOR="red"]GPS1_SESSION_TIMEOUT=2[/COLOR]
AGPS works in v1.7. The following workaround is for v1.6 and below versions only.
Instructions for the AGPS data Injection.
There're at least three methods (I recommend free apps here.) to be able to inject AGPS data.
GScript method is the base, so I describe it as follows.
- GScript method.
- Script Manager method.
- LeoAGpsSwitcher_0.1.apk method.
Please download libgps_Switcher_v1.6.zip, decompress it to your SD card, and follow the steps below if you want AGPS support.
You need to repeat steps 4 and 5 every time when you need AGPS.
- Put the following files in the SD card.
/sdcard/ClockworkMod/GPS_Libraries_v1.6_for_HD2_Gingerbread_update.zip (Remember to download it.)
/sdcard/ClockworkMod/libgps_with_AGPS_update.zip (Remember to download it.)
/sdcard/GScript/1_install_Magic_AGPS.sh
/sdcard/GScript/2_install_libgps_v1.6.sh- Install GScript or GScript Lite.
- Add 1_install_Magic_AGPS.sh and 2_install_libgps_v1.6.sh to GScript.
- Run 1_install_Magic_AGPS.sh, and the phone will hot reboot itself.
After reboot, make sure you have network connection, and wait at lease 1 min to let Android download and inject AGPS data.- Run 2_install_libgps_v1.6.sh, and the phone will hot reboot itself.
After reboot, you can enjoy the quicker GPS cold lock.
Changelog:
- Version 2.1 NMEA|RPC - (Aug. 26)
- Both: Remove or reduce some debugging info output to logcat. (Cleanup and optimization stage.)
- Both: Output NMEA or RPC version and parsed settings of gps.conf to logcat.
- Version 2.0 NMEA|RPC - (Aug. 6)
- Both: Add GPS1_SESSION_TIMEOUT in gps.conf to set time between invoking pdsm_get_position(). (Default is 2 seconds. Range is 2~120 seconds.)
- RPC: Hide Fix/Sats info and make the GPS symbol in the status bar flashing when you go to basement or tunnel. (NMEA already has this feature. This is for RPC version.)
- Version 1.9 NMEA|RPC - (Jul. 29)
- Both: Include v1.7's latest gps.htcleo.so, gps.leo.so, and gps.bravo.so again.
- Both: Add a new thread for getting GPS location locks: (Credits to qwerty_7564)
- gps_get_position() is called in its own thread using callbacks to request the next position.
- remove unnecessary sleep and the can_send flag in pdsm_get_position().
- Both: Remove unnecessary mallocs since there is a performance cost for use. (Credits to qwerty_7564)
- Both: Shutdown the gpsOne engine properly on GPS off. (i.e. turning off GPS from settings) (Credits to qwerty_7564)
- Both: Support loading the GPS1_CLEANUP_ENABLED flag from gps.conf. (Set it to 0 if you use a ROM that has "GPS off-and-on bug".)
- Both: Parse gps.conf and invoke pdsm_xtra_set_auto_download_params() only once until reboot.
- Both: Support the customized fix update frequency, which is set by a GPS tracking app, via gps_get_position(int timeout).
- NMEA: Add a timer thread for supporting the customized fix update frequency which is set by a GPS tracking app.
(As a result, we won't see the fast-forwarding effect in time field in GPS Status, and the random hot reboot issue in NMEA version may be fixed too.)- Version 1.8 NMEA|RPC - (Jul. 19)
- Both: Support automatic (periodic) download requests of gpsOneXTRA assistance data to client. (Default is disabled.) (Credits to qwerty_7564.)
- Both: Support enabling xtra.bin download requests and setting download interval from gps.conf.
- Both: Include v1.6's old gps.htcleo.so, gps.leo.so, and gps.bravo.so. (It seems that v1.7's new gps.xxx.so causes the battery drain in some ROMs, but not all ROMs.)
- NMEA: Disable $GPGSV report to make NMEA version more stable. (It seems that random hot reboot issue is reduced.)
- RPC: Support the negative altitude. (Credits to arne182.)
- RPC: Fix the incorrect HDOP value.
- Version 1.7 NMEA|RPC - (Jul. 10)
- Both: Activate the AGPS data injection. (You can get a cold lock very quickly due to the working AGPS.) (Thanks to qwerty_7564.)
- Both: Include updated gps.htcleo.so, gps.leo.so, and gps.bravo.so. (Fix suspension issues.) (Thanks to rmcc.)
- RPC: Disable NMEA sentences output and enable RPC Callback function output.
- Version 1.6 - (Jul. 05)
- Set Measurement Precision to 10.0 meters.
- Version 1.5 - (Jun. 26)
- Support daylight saving time (DST).
- Version 1.4 - (Jun. 24)
- A whole new version using NMEA sentences.
- Hide Fix/Sats info when you go to basement or tunnel.
- Show DOP/HDOP/VDOP values in GPS Status.
- Show Altitude above Geoid (i.e. mean sea level) and Geoid height. (You will see both of them in GPS Status. The value within parentheses is Geoid height.)
- Show correct SNR (Signal to noise ratio) value.
- Disable AGPS Ephemeris data (xtra.bin) injection.
- Assume Measurement Precision to 5.0 meters.
- Include updated gps.htcleo.so, gps.leo.so, and gps.bravo.so. (Only one file will be used by your ROM. I suggest to delete the other two files in this zip file, and then flash it.)
- Version 1.3 - (Jun. 15)
- Fix the reboot issue. (In v1.2, reboot your phone when the GPS setting is off, you will enter the boot loop.)
- Inject the correct time to the gpsOne engine.
- Comment out some debugging data.
- Version 1.2 - (Jun. 12)
- Support injecting AGPS Ephemeris data (xtra.bin) into the gpsOne engine by implementing pdsm_xtra_set_data().
- Support injecting time into the gpsOne engine by implementing pdsm_xtra_inject_time_info().
- Assume Measurement Precision to 2.5 meters.
- Version 1.1 - (Jun. 02)
- Assume Measurement Precision to 2.0 meters.
- Version 1.0 - (May 28)
- Show the number of satellites before getting a location fix.
- Show or hide the GPS icon in the status bar instantly when you start or stop a GPS app.
- Support the leap seconds. (Thanks to arne182 for figuring it out.)
- Modify the Accuracy to be more reasonable. (Assume Measurement Precision to 10 meters)
- Add AGPS interface. (Won't see "no AGPS interface in agps_data_conn_open" in logcat now.)
- Add the missing functions to receive the NTP, XTRA, and SUPL settings from gps.conf.
Credits: the XDAndroid Project, dan1j3l, rmcc, tytung, arne182, clyder, ozkaya, qwerty_7564, and everyone who participated in the related discussion or helped test the libs.
Attachments
Last edited by a moderator: