Dual-frequency GNSS on Android devices

L1+L5 support for GPS is here! …or is it?

It’s an exciting time for Global Navigation Satellite Systems (GNSS) on Android. Android Nougat 7.0 brought official support for multiple GNSS constellations beyond U.S. GPS (including GLONASS, QZSS, BeiDou, and Galileo), as well as the ability to collect and process raw pseudorange measurements and navigation messages within an Android app. Android P is providing developer options for testing real-time kinematic (RTK), or carrier-phase measurements, for the first time using embedded GNSS. Galileo, the European Union GNSS, is now operational with 22 satellites in Initial Services and nearing completion, and is already supported by a number of mobile devices. Other embedded device sensors are being fused with GNSS measurements for better location info (e.g., barometric sensors for altitude).

One of the most promising enhancements to position accuracy is the introduction of “dual-frequency” GNSS support. Dual-frequency GNSS means that the receiver tracks more than one radio signal from each satellites on different frequencies — for GPS, this is L1 and L5, and on Galileo E1 and E5a.

A visualization of the various GNSS carrier frequencies (Image courtesy of Broadcom via GPS World)

The more advanced L5/E5a signals are less prone to multipath errors and therefore can be used to refine position accuracy to the order of 30 cm (versus today’s 5 meters). From a user’s perspective, this is the difference between a real-time navigation app knowing which road you’re on and which lane you’re in. And, because multipath errors due to building reflections are a key problem in urban canyons, dual-frequency GNSS promises better accuracy and precision in some of the most challenging city environments. This means better wayfinding directions near and in buildings, and, with other technologies, possibly even down to which floor of a building you’re on. This IEEE article, as well as the 2018 Google I/O presentation “How to get one-meter location-accuracy from Android devices,” give detailed overviews of the benefits of tracking multiple GNSS carrier frequencies.

Does your device support L1 + L5?

First, let’s start with the easiest way to tell if your Android device supports both L1 and L5 signals.

Download GPSTest by barbeauDev from Google Play (full disclosure, I’m the developer of this open-source app):

Then, look for any “L1” or “L5” values in the “CF” (Carrier Frequency) column:

No carrier frequency (CF) data on a Samsung Galaxy S8+ (using GPSTest app)

As you can see above, the Samsung Galaxy S8+ (SM-G955U) doesn’t show any CF info.

And, as of June 2018, I haven’t seen any devices that actually do show carrier frequency data.

This leads to two questions:

  1. What’s the status of Android support for dual frequency GNSS?
  2. Are there any devices out there that support dual frequency?

Android 8.0 support

In Android 8.0 Oreo (API Level 26), there is a new method to get the carrier frequency for each satellite signal in view. The developer documentation for GnssStatus.getCarrierFrequencyHz() says:

Gets the carrier frequency of the signal tracked.
For example it can be the GPS central frequency for L1 = 1575.45 MHz, or L2 = 1227.60 MHz, L5 = 1176.45 MHz, varying GLO channels, etc. If the field is not set, it is the primary common use central frequency, e.g. L1 = 1575.45 MHz for GPS. For an L1, L5 receiver tracking a satellite on L1 and L5 at the same time, two measurements will be reported for this same satellite, in one all the values related to L1 will be filled, and in the other all of the values related to L5 will be filled

GnssStatus.getCarrierFrequencyHz() returns a floating point value. So, to show the user a label like “L5” in an Android app, a developer needs to translate the raw number of 1176450000.000 Hz to the string “L5”.

This means that an app must maintain a mapping of all carrier frequency numbers to labels for all GNSS, which is a bit of a pain. I and another contributor managed to scrape together this info from a variety of authoritative (and some less authoritative) sources and turned it into this table:

I then translated that mapping into code for GPSTest, and the resulting label shows up in the CF (Carrier Frequency) column on the Status screen IF the device provides this data.

In summary — Android Oreo (API 26) and higher (and the GPSTest Android app) officially support multiple GNSS frequencies.

So, what about device support?

Device support

Broadcom made a splash in September 2017 by announcing the launch of the BCM47755 GNSS chip that officially supports multiple carrier frequencies:

More specifically, BCM47755 supports:

  • GPS — L1 C/A + L5
  • Galileo — E1 + E5a
  • QZSS — L1 + L5
  • GLONASS — L1
  • BeiDou — B1

And, Broadcom said that the BCM47755 would appear in 2018 smartphones, but not which ones.

So, is this chip included in any devices currently on the market? If so, is dual-frequency GNSS enabled? Here’s where things get a bit murkier.

Samsung Galaxy S9/S9+

The Samsung Galaxy S9 and S9+ released on March 11, 2018 are prime candidates for dual frequency support. However, the official Samsung Galaxy S9 spec only says:

…location (GPS, Galileo, Glonass, BeiDou)
*Galileo and BeiDou coverage may be limited. BeiDou may not be available for certain countries.

That doesn’t help. Let’s look at the actual hardware — here’s a teardown of the S9+:

There are two different chipset variants of the S9/S9+:

  1. Qualcomm Snapdragon 845 (U.S., Latin America, Chinese, and Japanese markets)
  2. Samsung Exynos 9810 (European and other markets)

Qualcomm is a competitor to Broadcom, and therefore it’s unlikely that a Qualcomm SoC (and therefore any device based on the Snapdragon series) will include the BCM47755. (EDIT: I thought we’d never see a Broadcom chip in a Qualcomm SoC device, but the Xiaomi Mi 8 proved me wrong! See the next section for details)

However, the teardown shows that the Exynos variant has a “Broadcom BCM47752 GNSS Receiver” — close, but this isn’t the exact “47755” that we were looking for.

So what’s the difference between the 47752 and 47755? If you find out, let me know :). Broadcom’s spec sheet for the BCM4775x family doesn’t provide any details about the 47752 (or the yet-unseen 47754), and also doesn’t say that the entire 4775x family supports dual-frequency GNSS. Only the 47755 and 47758 models are specifically called out as supporting L5 and E5a. As a result, the exact specs on the 44752 remain a mystery.

No matter what the documentation does or doesn’t say, here’s the most important info— users of the Galaxy S9 Exynos variant are reporting that they can’t see carrier frequencies. Here’s a screenshot:

Galaxy S9 Exynos variant doesn’t currently show carrier frequencies using GPSTest (Source: Imgur, via XDA Developers)

Which leads to more questions:

  1. Does the Broadcom BCM47752 chip support dual-frequency GNSS?
  2. If so, does the Galaxy S9/S9+ Exynos variant need a firmware update to enable it?

For the adventurous spirits out there, it may be possible to enable dual-frequency support on the Exynos Galaxy S9/S9+ by editing system config files — we don’t know yet.

If you want to go down this road, first note that this requires root and, as with any changes to your device unsanctioned by Samsung, could potentially brick your S9 or otherwise leave it less than fully functional. So, you’ve been warned.

According to user cr2 on XDA Developers, here are the steps that may enable dual-frequency GNSS support on the Exynos Galaxy S9/S9+:

  1. Find the file /vendor/etc/gps.xml on your device
  2. In gps.xml, find the <gll> section
  3. Replace the MultiCarrLnaMask and MultiCarrRFMode lines with the following (you also might want to save the current lines in case you need to revert these changes):
MultiCarrLnaMask ="L1_EXT_ON | L5_EXT_ON"
MultiCarrRFMode ="GL_MULTI_CARR_RF_MODE_L1_L5"

Save the file, reboot your S9 and fire up the GPSTest app — does CF data appear?

If not, try these values (it addsL2 on the 2nd line):

MultiCarrLnaMask ="L1_EXT_ON|L5_EXT_ON"
MultiCarrRFMode ="GL_MULTI_CARR_RF_MODE_L1_L2_L5"

Any luck?

Xiaomi Mi 8

According to leaks of the retail box prior to launch, the Xiaomi Mi 8 was rumored to feature “dual-GPS”. Immediately following the device launch on May 31st, The Verge and TechPP both reported that the Mi 8 does indeed support the L1 and L5 bands of GPS. The EU GSA, the organization that operates Galileo, capped this off with a definitive press release on June 4th with the following information:

Xiaomi — one of the fastest growing mobile brands — has launched the world’s first dual-frequency GNSS smartphone. Fitted with a Broadcom BCM47755 chip, the Xiaomi Mi 8, launched on May 31, is the world’s first smartphone providing up to decimetre-level accuracy for location-based services and vehicle navigation…. The BCM47755, introduced last year, is a dual-frequency (E1/L1+E5/L5) GNSS chip that can compute location with an accuracy of up to a few decimetres.…
Providing enhanced performance, the Mi 8 offers users better positioning in urban environments” (Source: EU GSA)

Interestingly, the Xiaomi Mi 8 uses a Qualcomm Snapdragon 845 SoC, and therefore must leverage the BCM47755 in addition to the main SoC to support dual-frequency GNSS.

On June 11th, a user shared the below screenshot of a Mi 8 running GPSTest:

Xiaomi Mi 8 running GPSTest on June 11th (Source: Mike Horton)

Here are my observations:

  1. 👍 Dual frequency appears to be in use for GPS (1, 8, 27, and 30), Galileo (12), and QZSS (193), as they all have two entries in the list!
  2. 👎 This Mi 8 with firmware MIUI 9.5 | Stable 9.5.6.0(OEACNFA) and Android 8.1.0 doesn’t appear to support the GnssStatus.getCarrierFrequencyHz() method to get the carrier frequency for each satellite. GPSTest will show the text classification of the carrier frequency (e.g. L1, L5) if it’s in a recognized range, and it will display the raw float value if it’s not in a recognized range. So blanks mean that the API isn’t returning any data at all. More technical details are here if you’re interested. UPDATE June 20 — MIUI 9.5 firmware 9.5.8.0 OEACNFA doesn’t show CF either (see this post). UPDATE June 21 — MIUI 10 8.6.21 firmware also doesn’t show CF.

If you have an Xiaomi Mi 8 with a newer firmware version, please run GPSTest so we can see if Xiaomi has fixed this!

Summary

It initially seemed that the mysterious Broadcom BCM47752 chip in the Exynos variant of the Samsung Galaxy S9/S9+ was the prime candidate for dual-frequency GNSS support in a commercially-available Android devices. However, the Xiaomi Mi 8 (launched on May 31st, 2018) is documented by EU GSA as supporting GPS GPS L1 + L5 and Galileo E1 + E5a and based on a user’s screenshot appears to support dual frequency for QZSS as well, but so far isn’t providing any carrier frequency information via the Android GnssStatus.getCarrierFrequencyHz() method.

So, can you see L1+L5 signals using the GPSTest app on your device? Are you willing to take the risk of rooting your S9 and editing gps.xml to see if that enables dual frequency GNSS? Did you run GPSTest on the Xiaomi Mi 8 with a firmware version greater than MIUI 9.5 | Stable 9.5.8.0(OEACNFA) or MIUI 10 | 8.6.21 firmware (Android 8.1.0) and see data in the CF column?

If so, let me know in the comments below. In the mean time, I’ll be digging for more information and will update this article when I find it.

References

  1. XDA Developers thread on S9 Exynos and dual frequency support— https://forum.xda-developers.com/galaxy-s9/help/gps-receiver-exynos-model-t3748641/
  2. European Global Navigation Satellite Systems Agency (GSA). “World’s first dual-frequency GNSS smartphone hits the market,” June 4, 2018. https://www.gsa.europa.eu/newsroom/news/world-s-first-dual-frequency-gnss-smartphone-hits-market

Non-smartphone dual-frequency hardware

  1. STMicroelectronics Teseo APP (Automotive Precise Positioning) receiver
  2. u-blox F9 technology platform (e.g., ZED-F9P multi-band GNSS module as covered by GPS World)

Acknowledgements