Browse Source

New upstream version 3.20

Boian Bonev 2 months ago
100 changed files with 14049 additions and 3660 deletions
  1. +89
  2. +24
  3. +0
  4. +166
  5. +21
  6. +3
  7. +10
  8. +225
  9. +35
  10. +12
  11. +625
  12. +870
  13. +13
  14. +131
  15. +2888
  16. +301
  17. +564
  18. +52
  19. +44
  20. +470
  21. +1223
  22. +157
  23. +104
  24. +5
  25. +77
  26. +24
  27. +29
  28. +389
  29. +107
  30. +84
  31. +73
  32. +35
  33. +42
  34. +4
  35. +11
  36. +25
  37. +3
  38. +17
  39. +7
  40. +208
  41. +64
  42. +185
  43. +616
  44. +1183
  45. +107
  46. +8
  47. +64
  48. +19
  49. +32
  50. +1
  51. +183
  52. +91
  53. +152
  54. +113
  55. +1
  56. +75
  57. +91
  58. +106
  59. +32
  60. +221
  61. +12
  62. +135
  63. +323
  64. +369
  65. +397
  66. +29
  67. +182
  68. +15
  69. +76
  70. +0
  71. +0
  72. +0
  73. +0
  74. +0
  75. +0
  76. +0
  77. +0
  78. +0
  79. +0
  80. +0
  81. +0
  82. +0
  83. +0
  84. +0
  85. +0
  86. +0
  87. +0
  88. +0
  89. +0
  90. +0
  91. +0
  92. +0
  93. +0
  94. +0
  95. +0
  96. +0
  97. +0
  98. +0
  99. +0
  100. +0

+ 89
- 0
.ci-build/ View File

@@ -0,0 +1,89 @@
#!/usr/bin/env bash
set -e
set -x

export PATH=/usr/sbin:/usr/bin:/sbin:/bin
if uname -a | grep -qi freebsd; then
export PATH="${PATH}:/usr/local/bin:/usr/local/sbin"

if [ "${USE_CCACHE}" = "true" ] && [ -n "${CCACHE_DIR}" ] && command -v ccache >/dev/null; then
if [ -d "/usr/lib64/ccache" ]; then
# fedora
export PATH="/usr/lib64/ccache:${PATH}"
elif [ -d "/usr/local/libexec/ccache/" ]; then
# freebsd
export PATH="/usr/local/libexec/ccache:${PATH}"
# debian, .....
export PATH="/usr/lib/ccache:${PATH}"
mkdir -p "${CCACHE_DIR}"
echo 'max_size = 100M' > "${CCACHE_DIR}/ccache.conf"
export USE_CCACHE="false"

if command -v lsb_release >/dev/null && lsb_release -d | grep -qi -e debian -e ubuntu; then
eval "$(dpkg-buildflags --export=sh)"
export DEB_HOST_MULTIARCH=$(dpkg-architecture -qDEB_HOST_MULTIARCH)
export PYTHONS="$(pyversions -v -r '>= 2.3'; py3versions -v -r '>= 3.4')"
SCONSOPTS="${SCONSOPTS} libdir=/usr/lib"

SCONSOPTS="${SCONSOPTS} $@ prefix=/usr"
SCONSOPTS="${SCONSOPTS} systemd=yes"
SCONSOPTS="${SCONSOPTS} nostrip=yes"
SCONSOPTS="${SCONSOPTS} dbus_export=yes"
SCONSOPTS="${SCONSOPTS} docdir=/usr/share/doc/gpsd"
SCONSOPTS="${SCONSOPTS} gpsd_user=gpsd"
SCONSOPTS="${SCONSOPTS} gpsd_group=dialout"
SCONSOPTS="${SCONSOPTS} qt_versioned=5"

export SCONS=$(command -v scons)

if command -v nproc >/dev/null; then
if [ "${SLOW_CHECK}" != "yes" ]; then
CHECK_NPROC=$(( 4 * ${NPROC} ))


if [ -z "$PYTHONS" ]; then
export PYTHONS="3"

if [ -n "${SCAN_BUILD}" ]; then
export PYTHONS="3"

for py in $PYTHONS; do
_SCONS="${SCONS} target_python=python${py}"
python${py} ${_SCONS} ${SCONSOPTS} --clean
rm -f .sconsign.*.dblite
${SCAN_BUILD} python${py} ${_SCONS} ${SCONS_PARALLEL}${SCONSOPTS} build-all
if [ -z "${NOCHECK}" ]; then

if [ "${USE_CCACHE}" = "true" ]; then
ccache -s

+ 24
- 0
.ci-build/ View File

@@ -0,0 +1,24 @@
set -e
set -x

apt -y install ccache

export PATH="/usr/lib/ccache:$PATH"

if which nproc >/dev/null; then
SCONS_PARALLEL="-j $(nproc) "

scons --help | grep -B1 'default: True' | grep 'yes|no' | sed 's,:.*,=no,' | grep -v '^gpsd$'
scons --help | grep -B1 'default: False' | grep 'yes|no' | sed 's,:.*,=yes,'
) | while read option; do
scons --clean
rm -f .sconsign.*.dblite
scons ${SCONS_PARALLEL}${option} build

+ 0
- 118
.gitignore View File

@@ -1,118 +0,0 @@

+ 166
- 0
.gitlab-ci.yml View File

@@ -0,0 +1,166 @@
key: "${CI_JOB_NAME}"
- .ccache/

USE_CCACHE: "true"
DEBIAN_FRONTEND: 'noninteractive'

- build
- advanced_build
- test

.debian_build: &debian_build
- apt update && apt -y install --no-install-recommends eatmydata
- eatmydata -- apt -y install --no-install-recommends ${PACKAGES}
- eatmydata -- .ci-build/

image: debian:latest
stage: build
SCONSOPTS: 'qt=yes xgps=yes'
PACKAGES: 'build-essential ccache debhelper po-debconf python3-all-dev python3-all-dbg python-all-dev python-all-dbg xsltproc docbook-xsl docbook-xml asciidoc libncurses-dev libusb-1.0-0-dev libdbus-1-dev libglib2.0-dev makedev libbluetooth-dev libqt4-dev lsb-release bc dpkg-dev scons chrpath dh-buildinfo pps-tools dh-systemd python-serial'
<<: *debian_build

image: debian:unstable
stage: advanced_build
SCONSOPTS: 'qt=yes xgps=yes'
PACKAGES: 'build-essential ccache debhelper po-debconf python3-all-dev python3-all-dbg python-all-dev python-all-dbg xsltproc docbook-xsl docbook-xml asciidoc libncurses-dev libusb-1.0-0-dev libdbus-1-dev libglib2.0-dev makedev libbluetooth-dev libqt4-dev lsb-release bc dpkg-dev scons chrpath dh-buildinfo pps-tools dh-systemd python-serial'
<<: *debian_build

image: debian:unstable
stage: advanced_build
SCONSOPTS: 'qt=yes xgps=yes'
CC: 'clang'
CXX: 'clang++'
PACKAGES: 'clang build-essential ccache debhelper po-debconf python3-all-dev python3-all-dbg python-all-dev python-all-dbg xsltproc docbook-xsl docbook-xml asciidoc libncurses-dev libusb-1.0-0-dev libdbus-1-dev libglib2.0-dev makedev libbluetooth-dev libqt4-dev lsb-release bc dpkg-dev scons chrpath dh-buildinfo pps-tools dh-systemd python-serial'
<<: *debian_build

image: debian:unstable
stage: advanced_build
SCONSOPTS: 'aivdm=no ashtech=no bluez=no control_socket=no controlsend=no coveraging=no dbus_export=no debug=no earthmate=no evermore=no force_global=no fury=no fv18=no garmin=no garmintxt=no geostar=no gpsclock=no gpsdclients=no greis=no implicit_link=no isync=no itrax=no leapfetch=no libgpsmm=no magic_hat=no manbuild=no minimal=no mtk3301=no navcom=no ncurses=no netfeed=no nmea0183=no nmea2000=no nostrip=no ntrip=no oceanserver=no oncore=no oscillator=no passthrough=no profiling=no python=no qt=no reconfigure=no rtcm104v2=no rtcm104v3=no shared=no shm_export=no sirf=no skytraq=no slow=no socket_export=yes squelch=no superstar2=no systemd=no timeservice=no tnt=no tripmate=no tsip=no ublox=no usb=no xgps=no'
NOCHECK: 'true'
PACKAGES: 'build-essential ccache scons chrpath lsb-release python3-all-dev'
<<: *debian_build

# the latest tag should match the last Ubuntu LTS release.
image: ubuntu:latest
stage: advanced_build
SCONSOPTS: 'qt=yes xgps=yes'
PACKAGES: 'build-essential ccache debhelper po-debconf python3-all-dev python3-all-dbg python-all-dev python-all-dbg xsltproc docbook-xsl docbook-xml asciidoc libncurses-dev libusb-1.0-0-dev libdbus-1-dev libglib2.0-dev makedev libbluetooth-dev libqt4-dev lsb-release bc dpkg-dev scons chrpath dh-buildinfo pps-tools dh-systemd python-serial'
- apt update && apt -y install scons
- sed -i "s/os.environ.has_key('DH_INTERNAL_OPTIONS')/'DH_INTERNAL_OPTIONS' in os.environ/" /usr/lib/scons/SCons/Script/
<<: *debian_build

# the "rolling" release
image: ubuntu:rolling
stage: advanced_build
SCONSOPTS: 'qt=yes xgps=yes'
PACKAGES: 'build-essential ccache debhelper po-debconf python3-all-dev python3-all-dbg python-all-dev python-all-dbg xsltproc docbook-xsl docbook-xml asciidoc libncurses-dev libusb-1.0-0-dev libdbus-1-dev libglib2.0-dev makedev libbluetooth-dev libqt4-dev lsb-release bc dpkg-dev scons chrpath dh-buildinfo pps-tools dh-systemd python-serial'
<<: *debian_build

# the devel tag should point to the docker image of the next, upcoming Ubuntu release
image: ubuntu:devel
stage: advanced_build
SCONSOPTS: 'qt=yes xgps=yes'
PACKAGES: 'build-essential ccache debhelper po-debconf python3-all-dev python3-all-dbg python-all-dev python-all-dbg xsltproc docbook-xsl docbook-xml asciidoc libncurses-dev libusb-1.0-0-dev libdbus-1-dev libglib2.0-dev makedev libbluetooth-dev libqt4-dev lsb-release bc dpkg-dev scons chrpath dh-buildinfo pps-tools dh-systemd python-serial'
<<: *debian_build

image: fedora:latest
stage: advanced_build
SCONSOPTS: 'qt=yes xgps=yes'
- dnf install -y ccache diffutils bluez-libs-devel chrpath dbus-devel desktop-file-utils gcc-c++ libXaw-devel ncurses-devel python-devel qt-devel scons xmlto pps-tools-devel
- .ci-build/

stage: advanced_build
WRITE_PAD: '0.01250'
- freebsd
- .ci-build/

allow_failure: true
image: debian:unstable
stage: test
needs: ["debian-unstable:gcc"]
SCONSOPTS: 'qt=yes xgps=yes'
SCAN_BUILD: 'scan-build -o scan_build'
PACKAGES: 'clang clang-tools build-essential debhelper po-debconf python3-all-dev python3-all-dbg python-all-dev python-all-dbg xsltproc docbook-xsl docbook-xml asciidoc libncurses-dev libusb-1.0-0-dev libdbus-1-dev libglib2.0-dev makedev libbluetooth-dev libqt4-dev lsb-release bc dpkg-dev scons chrpath dh-buildinfo pps-tools dh-systemd python-serial'
- scan_build
expire_in: 1 week
<<: *debian_build

# as long as sconstruct has so many options, this does not make sense
# needs a better / faster way to test
# image: debian:unstable
# stage: test
# needs: ["debian-unstable:gcc"]
# variables:
# DEBIAN_FRONTEND: 'noninteractive'
# when: manual
# script:
# - apt update && apt -y install build-essential debhelper po-debconf python3-all-dev python3-all-dbg python-all-dev python-all-dbg xsltproc docbook-xsl docbook-xml asciidoc libncurses-dev libusb-1.0-0-dev libdbus-1-dev libglib2.0-dev makedev libbluetooth-dev libqt4-dev lsb-release bc dpkg-dev scons chrpath dh-buildinfo pps-tools dh-systemd python-serial
# - .ci-build/

.changes_pages: &changes_pages
- 'www/*'
- 'www/*/*'
- '*.adoc'

.should_build_pages: &should_build_pages
- master
<<: *changes_pages

image: alpine:latest
stage: build
- apk update && apk add python xmlto asciidoc scons rsync musl-dev gcc
- mkdir .pages; WEBSITE=.public scons website=.pages website; mv .public public
- find public -type f -regex '.*\.\(htm\|html\|txt\|text\|js\|css\)$' -exec gzip -f -k {} \;
- ls -lR public
- public
<<: *should_build_pages

+ 21
- 0
.travis.yml View File

@@ -0,0 +1,21 @@
sudo: required
language: generic

## The used .ci-build/ is maintained for the gitlab CI.
## Please upadte the travis yaml file if necessary

# Some versions of clang++ don't work with some C++ headers, due to an
# issue with __float128. Until this is reproducible in a more debuggable
# context, we disable the C++ builds in the clang case.

- TRAVIS_DEBIAN_DISTRIBUTION=unstable TRAVIS_DEBIAN_BUILD_COMMAND="/bin/bash .ci-build/" TRAVIS_DEBIAN_BUILD_DEPENDENCIES="build-essential debhelper po-debconf python-all-dev python-all-dbg xsltproc docbook-xsl docbook-xml asciidoc libncurses-dev libusb-1.0-0-dev libdbus-1-dev libglib2.0-dev makedev libbluetooth-dev qtbase5-dev qt5-default lsb-release bc dpkg-dev scons chrpath dh-buildinfo pps-tools dh-systemd python-serial"
- TRAVIS_DEBIAN_DISTRIBUTION=unstable TRAVIS_DEBIAN_BUILD_COMMAND="/bin/bash .ci-build/" TRAVIS_DEBIAN_BUILD_DEPENDENCIES="build-essential debhelper po-debconf python-all-dev python-all-dbg xsltproc docbook-xsl docbook-xml asciidoc libncurses-dev libusb-1.0-0-dev libdbus-1-dev libglib2.0-dev makedev libbluetooth-dev libqt4-dev lsb-release bc dpkg-dev scons chrpath dh-buildinfo pps-tools dh-systemd python-serial"
- TRAVIS_DEBIAN_DISTRIBUTION=unstable TRAVIS_DEBIAN_BUILD_COMMAND="/bin/bash .ci-build/ libgpsmm=no qt=no" TRAVIS_DEBIAN_BUILD_DEPENDENCIES="build-essential debhelper po-debconf python-all-dev python-all-dbg xsltproc docbook-xsl docbook-xml asciidoc libncurses-dev libusb-1.0-0-dev libdbus-1-dev libglib2.0-dev makedev libbluetooth-dev libqt4-dev lsb-release bc dpkg-dev scons chrpath dh-buildinfo pps-tools dh-systemd clang python-serial" TRAVIS_DEBIAN_BUILD_ENVIRONMENT="CC=clang CXX=clang++"
- TRAVIS_DEBIAN_DISTRIBUTION=stable TRAVIS_DEBIAN_BUILD_COMMAND="/bin/bash .ci-build/" TRAVIS_DEBIAN_BUILD_DEPENDENCIES="build-essential debhelper po-debconf python-all-dev python-all-dbg xsltproc docbook-xsl docbook-xml asciidoc libncurses-dev libusb-1.0-0-dev libdbus-1-dev libglib2.0-dev makedev libbluetooth-dev libqt4-dev lsb-release bc dpkg-dev scons chrpath dh-buildinfo pps-tools dh-systemd python-serial"

- docker

- wget -O- | sh -

+ 3
- 0
.vimrc View File

@@ -0,0 +1,3 @@
# gpsd vim settings
# Python 3 does not like tabs in files
:set tabstop=4 shiftwidth=4 expandtab

+ 10
- 0

@@ -0,0 +1,10 @@
Remco Treffkorn <>
Derrick J. Brashear <>
Russ Nelson <>
Eric S. Raymond <>
Gary E. Miller <>
Jeff Francis <>
Amaury Jacquot <>
Chris Kuethe <>
Ville Nuorvala <>
Fulup Ar Foll <>

+ 225
- 0
Android.bp View File

@@ -0,0 +1,225 @@
cc_binary {
name: "gps_test",
vendor: true,
srcs: [
shared_libs: [
static_libs: [
cflags: [

cc_binary {
name: "gpsd",
vendor: true,
required: ["gpsd_wrapper"],
generated_headers: [
srcs: [
static_libs: [
cflags: [

cc_binary {
name: "gpsd_wrapper",
vendor: true,
init_rc: ["android/gpsd.rc"],
srcs: ["android/gpsd_wrapper.c"],
shared_libs: [

cc_library_shared {
name: "libgps",
vendor: true,
export_include_dirs: ["."],
generated_headers: [
generated_sources: ["gps_maskdump_c"],
srcs: [
cflags: [

cc_library_static {
name: "libgps_static",
vendor: true,
export_include_dirs: ["."],
generated_headers: [
generated_sources: ["gps_maskdump_c"],
srcs: [
cflags: [

genrule {
name: "gpsd_packet_names_h",
cmd: "rm -f $(out); sed -e '/^ *\\([A-Z][A-Z0-9_]*\\)," +
"/s// \"\\1\",/' < $(in) > $(out)",
srcs: ["packet_states.h"],
out: ["packet_names.h"]

genrule {
name: "gpsd_config_h",
cmd: "cat $(in)/android/ > $(out);" +
"grep \"^gpsd_version\" $(in)/SConstruct | " +
"cut -d\\= -f2 | sed -e 's/^/#define VERSION/'" +
">> $(out)",
srcs: [""],
out: ["gpsd_config.h"]

genrule {
name: "gpsd_revision_h",
cmd: "grep \"^gpsd_version\" $(in) | cut -d\\= -f2 " +
"| sed -e 's/^/#define REVISION/' > $(out)",
srcs: ["SConstruct"],
out: ["revision.h"]

python_binary_host {
name: "maskaudit",
main: "",
srcs: [""]

genrule {
name: "gps_maskdump_c",
tools: ["maskaudit"],
cmd: "$(location maskaudit) -c $(in) > $(out)",
out: ["gps_maskdump.c"],
srcs: [""]

cc_library_static {
name: "libgpsd",
vendor: true,
export_include_dirs: ["."],
generated_headers: [
srcs: [
cflags: [

+ 35
- 0

@@ -0,0 +1,35 @@

Compilation copyright is held by the GPSD project. All rights reserved.

GPSD project copyrights are assigned to the project lead, currently
Eric S. Raymond. Other portions of the GPSD code are Copyright (c)
1997, 1998, 1999, 2000, 2001, 2002 by Remco Treffkorn, and others
Copyright (c) 2005 by Eric S. Raymond. For other copyrights, see
individual files.

(SPDX short identifier: BSD-2-Clause)

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.


+ 12
- 0

@@ -0,0 +1,12 @@
For the gpsd project, the information that was traditionally placed in
this file is in the repository as:


If you only have www/, run

scons www

This builds www/hacking.html with some magic cookies usefully substituted.

+ 625
- 0
INSTALL.adoc View File

@@ -0,0 +1,625 @@
= GPSD Installation Instructions =
:title: GPSD Installation Instructions
:description: Steps for installing GPSD and verifying its performance.
:keywords: GPSD, GPS, installation
:author: Eric S. Raymond <>

Here are the steps for installing GPSD and verifying its performance.
They assume you have GPSD available as an installable binary package,

Instructions for building GPSD from source (including cross-building)
are in the file "build.adoc" in the source distribution.

Most of these installation instructions are generic to Linux (inc
There are some special notes on installation for OS X and the Raspberry Pi
near the end of this file.

== Check that your GPS is live and you can get data from it ==

Start by making sure you can get data from your GPS, otherwise the later
steps will be very frustrating. In this command

stty -F /dev/ttyXXX ispeed 4800 && cat </dev/ttyXXX

replace ttyXXX with the filename of the port. This will probably be
either /dev/ttyUSB0 or /dev/ttyS0. If you are on a *BSD Unix or MacOS X,
replace -F with -f.

When you run this command, you should see text lines beginning with $
come to stdout (possibly after a short initial burst of binary
garbage). If you don't see this, you may have OS-level problems with
your serial support, but more likely have the wrong device. Look

If you have trouble with the preceding step, check your cabling
first. Verify that the device is connected and that its power LED
(if it has one) is lit.

If you seem to have some sort of serial-device problem, check that
your kernel properly supports the device you are using. For GPSes
using an RS-232 port (which is no longer common) you will need
serial-port support compiled into your kernel. Various USB-to-serial
adapter chips found in GPSes require specific drivers.

Under a stock Linux kernel these will all be loaded on demand when
the USB system sees the appropriate vendor/product ID combinations.
See build.adoc for instructions relating to custom kernels.

== Check that your system configuration will allow GPSD to work ==

Ensure that device permissions will enable gpsd to read from and write
to GPS devices even after it drops root privileges. If you are
running Fedora Core, Ubuntu, or stock Debian you can skip this step,
as the stock configuration has the right properties.

gpsd requires two things: (1) that GPS devices have group read and
write enabled, and (2) all of them have the same group ID as a
prototypical device, typically /dev/ttyS0 under Linux or /dev/tty00
under *BSD. It does not actually matter what the owning group is, as
gpsd will look this up on startup. Alternatively, (3), you can set a
fallback group with the gpsd-group option in case the prototype is not
found: this should be the group that has write access to serial
devices. On Debian and derivatives including Ubuntu this is "dialout";
on Gentoo/Fedora/openSuse it is "uucp".

Before dropping privileges, gpsd will ensure that it has access to
devices given to it on the command line by forcing their group read
and write permissions on.

On a Linux with udev, check the files in /etc/udev/permissions.d to
ensure that /dev/tty* devices are all created with the same group
and with 0660 permissions.

When gpsd drops privileges, its default is to set uid to 'nobody' and
group to the owning group of the prototype device (the configure
option gpsd-user=foo will cause gpsd to change to 'foo'

If your system has the Linux hotplug facility installed you can skip
the permission-setting part; the hotplug scripts will force the
permissions for you. You still have to make sure all the tty devices
are in the same group.

== Check your installation prerequisites ==

A minimum build of GPSD can run pretty close to the metal; all it
absolutely needs is the C runtime support. The test clients and
various additional features have additional prerequisites:

|pps-tools | for PPS time keeping
|dbus | gpsd will issue DBUS notifications
|ncurses | for cgps and gpsmon clients
|libtinfo5 | low-level terminfo library (see below)
|libusb-1.0.x or later | for older Garmin USB devices
|Qt | libQgpsmm depends on this
|python2.x(x>=6) or 3.y(y>=2) | required for various clients and utilities
|PyGObject | for xps and xgpsspeed clients (see below)
|python-cairo | for python-GI
|GTK | for python-GI
|pyserial | for ubxtool and zerk in direct-serial mode
|gnuplot | to plot gpsprof output.

Some ncurses packages contain the terminfo library; some break it out
separately as libtinfo5 or libtinfo.

The PyGObject package goes by several names, and is split up into sub
packages different ways, depending on the distribution. Sometimes
python-gi, python-gobject, python-cairo, etc. The packages also need
the underlying system libraries (GTK, GLib, etc.)

The asynchronous python module (gps/ and its example client
( require Python 3.6+.

See below for more specific module requirements in the individual
distribution instructions.

== Installing gpsd ==

=== Install your distributions package(s) ===

Up-to-date gpsd packages are generally available for Linux distributions
including Debian and derivatives (including Ubuntu and Mint), Fedora and
derivatives (including CentOS), openSUSE, PCLinuxOS, Mageia, Gentoo, and
Slackware. In the embedded space, CeroWRT and Yocto carry GPSD. The
GPSD package in the FreeBSD ports tree is also reliably up to date.
Even if your distribution is not on this list, it is quite likely GPSD
has already been packaged for it.

Whatever distribution you are running, the name of the core GPSD
package containing the service daemon is almost certainly "gpsd".
However, many distributions break up GPSD into separate installable
packages for the core daemon and clients; you should search your
repository index for anything with gpsd as a prefix.

=== Install from source code ===

Directions for installing from source are in the file build.adoc found
in the source distribution.

== How to test the software ==

1. Start gpsd. You'll need to give it as an argument a path to
a serial or USB port with a GPS attached to it. Your test command
should look something like this:

gpsd -D 5 -N -n /dev/ttyUSB0

2. Once gpsd is running, telnet to port 2947. You should see a
greeting line that's a JSON object describing GPSD's version.
Now plug in your GPS (or AIS receiver, or RTCM2 receiver).

3. Type '?WATCH={"enable":true,"json":true};' to start raw and
watcher modes. You should see lines beginning with '{' that are
JSON objects representing reports from your GPS; these are reports
in GPSD protocol.

4. Start the xgps or cgps client. Calling it with no arguments
should do the right thing. You should see a display panel with
position/velocity-time information, and a satellite display. The
displays won't look very interesting until the GPS acquires satellite

5. Have patience. If you are cold-starting a new GPS, it may take
15-20 minutes after it gets a skyview for it to download an ephemeris
and begin delivering fixes.

6. A FAQ and troubleshooting instructions can be found at the GPSD
project site.

== Once you have verified correct operation ==

1. If you installed from a .deb under Debian or a Debian-derived
system, you may need to `dpkg-reconfigure -plow gpsd' to enable the
hotplug magic ("Start gpsd automatically").

2. Check out the list of supported hardware at the Hardware page on
the GPSD project's website. If your GPS isn't on the list, please send
us information to add a new line to the table. Directions are
included on that page. We can also use updates of the latest version
number known to work with hardware already supported.

3. GPSD includes gpsd.php, a PHP script, that you can use to generate
a PHP status page for your GPS if you wish. (It may not be in the
core package.) It should be manually copied to your HTTP document
directory. The first time it's invoked, it will generate a file
called '' in that directory containing configuration
information; edit to taste.

4. There are other non-essential scripts that may be useful; these
are in the contrib/ directory of the source. They may not be available
in the packages available from distributions.

For special instructions related to using GPSD for time service, see the
GPSD Time Service HOWTO in the distribution or on the web.

== Special Notes for OS X Installation ==

gpsd will build, install and run on OS X (osX). The easiest way to
do so is to first install the MacPorts package. Follow their install
procedure at:

Then use their port command to install scons. Optionally git if you
want to access the development source. Optionally install libxslt and
xmlto to build the documentation.

# port install scons
# port install git
# port install libxslt
# port install xmlto

Currently the osX port does not work with Qt5. To see the build

# port install qt5
# scons --config=force qt_versioned=5

If you have Qt5 installed, and want to avoid the build failure, bui.d
this way:

# scons --config=force qt=no

While running gpsd, or scons check, you may run out of shared memory
segments. If so, you will see this error message:

gpsd:ERROR: shmat failed: Too many open files

By default OS X allows a very small number of shared segments. You
can check your allowed maximum number of shared segments, then increase
the maximum number, with these commands:

# sysctl kern.sysv.shmseg=8
kern.sysv.shmseg: 32 -> 8
# sysctl -a | fgrep shmseg
kern.sysv.shmseg: 8
# sysctl kern.sysv.shmseg=16
kern.sysv.shmseg: 8 -> 16
# sysctl -a | fgrep shmseg
kern.sysv.shmseg: 16

If you are using a USB based GPS you will likely need the Prolific
PL2303 driver. You can find it here:

== Special Notes for Raspberry Pi Installation ==

gpsd will build, install and run on the Raspberry Pi (RasPi) and Pi 2
using Debian jessie. Other distributions based on
Debian (raspbian, etc) will work fine as well. The gpsd
package in Debian Wheezy is known to be flaky, be sure to update to a
new version of gpsd from source.

=== Raspbian ===
Before compiling gpsd from source, you will need to update your system
as root. Switching to the latest raspbian distribution (jessie)
is strongly recommended.

# apt-get update
# apt-get dist-upgrade
# rpi-update
# reboot

# apt-get install scons libncurses5-dev python-dev pps-tools
# apt-get install git-core

Git-core is required to build from a git repository. pps-tools is for
PPS timing.

The rest of the installation is just as for any other source based
install, as noted in the file *build.adoc* .

=== Other Debian derivatives (including stock) ===
==== Buster (10) with python2 ====
# apt-get update
# apt-get dist-upgrade
# reboot
# apt-get install scons libncurses-dev python-dev pps-tools
# apt-get install git-core
# apt-get install build-essential manpages-dev pkg-config

If "apt-get install scons" fails, check the file "/etc/apt/sources.list".

Git-core is required to build from a git repository.
pps-tools is for PPS timing.
Build-essential installs the compiler and associated tools.
Manpages-dev is the associated man pages.
Pkg-config is a helper for scons.

Gtk3 is only required to run xgps and xgpsspeed. You do not need a local
X11 server installed, but it still pulls in a lot of packages.

# apt-get install python-gi-dev python-cairo-dev
# apt-get install python-gobject-dev libgtk-3-dev

Ubxtool and zerk may optionally use the pyserial module for
direct connection to the GNSS receiver:

# apt-get install python-serial

gpsd may optional connect to dbus with the libdbus package:

# apt-get install libdbus-1-dev

Some very old Garmin USB devices need libusb:

# apt-get install libusb-1.0-0-dev

If you wish to build the documentation, be warned it pull in a
lot of packages. To build the doc install:

apt-get install xsltproc docbook-xsl xmlto asciidoc

The rest of the installation is just as for any other source based
install, as noted in the file *build.adoc* .

# git clone
# cd gpsd
# scons --config=force && scons install

==== Jessie (8) ====
# apt-get install scons libncurses5-dev python-dev pps-tools
# apt-get install git-core

Git-core is required to build from a git repository. pps-tools is for
PPS timing.

The rest of the installation is just as for any other source based
install, as noted in the file *build.adoc* .

==== Wheezy ====
Wheezy, being older, requires updating the tools for compiling
and testing gpsd:

You need scons at 2.3.0 or higher to build.
If your scons is less than 2.3.0 you will need to get a newer scons
from wheezy-backport. Partial instructions are detailed here:

Basically you need to add this line to /etc/apt/sources.list:

deb wheezy-backports main

Then do another update:

apt-get update

Which may lead you to this error if you lack a full set of debian keys:

W: GPG error: wheezy-backports Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 8B48AD6246925553

Partial but detailed instructions to fix that are here:


Use either of the following code blocks. The first is more robust:

apt-get install debian-archive-keyring

gpg --keyserver --recv 8B48AD6246925553
gpg -a --export 46925553 | apt-key add -
apt-get update

You can now install scons from the wheezy-backports repository:

apt-get -t wheezy-backports install scons

and other tools:

# apt-get install scons libncurses5-dev python-dev pps-tools
# apt-get install git-core

Git-core is required to build from a git repository. pps-tools is for
PPS timing.

The rest of the installation is just as for any other source based
install, as noted in the file *build.adoc* .

==== Ubuntu 18.04 LTS ====

Preliminary install notes.

apt install gcc scons python-gi python-gi-cairo g++
apt install libncurses5-dev pps-tools
apt install gir1.2-gtk-3.0

If you wish to build the documentation, be warned it pull in a
lot of packages. To build the doc install:

apt install xsltproc docbook-xsl xmlto asciidoc

The rest of the installation is just as for any other source based
install, as noted in the file *build.adoc* .

=== Other Raspberry Pi tips ===

Any USB connected GPS that is known to work with gpsd will work fine on
the RasPi. No special instructions apply.

A very popular option is to install the AdaFruit Ultimate GPS HAT. With
this GPS you also get a good 1PPS signal. This works as any other GPS
with gpsd, but there are two things to note. The GPS takes over the
serial console: /dev/ttyAMA0. The PPS signal will be on GPIO Pin #4.

Only three specific changes need to be made to make the HAT work. First
in the file /boot/cmdline.txt, remove this part "console=ttyAMA0,115200
kgdboc=ttyAMA0,115200)". That frees the serial port from console use so
the GPS can use it.

Second you need to tell the boot process to load the pps_gpio module
and attach /dev/pps0 to GPIO pin 4. Do that by adding this line
to the bottom of /boot/config.txt: dtoverlay=pps-gpio,gpiopin=4

Reboot so those changes take effect.

Run gpsd like this:

~ # gpsd -D 5 -N -n /dev/ttyAMA0 /dev/pps0

If you are on the RasPi with gpsd version 3.17, or above, /dev/pps0 can
be autodetected. and used for PPS if available.

gpsd 3.17 and up only:

~ # gpsd -D 5 -N -n /dev/ttyAMA0

You can verify gpsd is using the PPS by running ntpshmmon:

~ # ntpshmmon
# Name Seen@ Clock Real L Prec
sample NTP0 1461619703.641899335 1461619703.445224418 1461619703.000000000 0 -1
sample NTP2 1461619703.642203397 1461619702.999262204 1461619703.000000000 0 -20
sample NTP0 1461619704.142097363 1461619703.445224418 1461619703.000000000 0 -1
sample NTP2 1461619704.142204134 1461619703.999258157 1461619704.000000000 0 -20

If you do not see NTP2 then you misconfigured the pps_gpio driver.

The serial time is provided to ntpd on NTP0, the PPS time is on NTP2, not
on NTP1 like described earlier. So your ntp.conf will need to be adjusted

# GPS PPS reference (NTP1)
server prefer
fudge refid PPS


# GPS PPS reference (NTP2)
server prefer
fudge refid PPS

Now proceed as for any other operating system to use gpsd.

Be sure to validate that your PPS signal is not offset by the pulse
width. That would mean gpsd is using the wrong edge.

Detailed instructions are available from their web site:

You will need to dig deeper to make the PPS work, here is a good reference:

== BSD derivatives ==
=== Special Notes for FreeBSD Installation ==+

gpsd will build, install and run on FreeBSD.
Due to the missing CAN bus support (linux/can.h), NMEA2000/CAN
is not supporten on FreeBSD.

Use their pkg command to install scons, and optionally git if you
want to access the development source.

If you want to build the QT bindings, you'll also need the
qt5-network and pkgconf packages.

# pkg install scons
# pkg install git
# ln -s /usr/local/bin/python2.7 /usr/local/bin/python
# ln -s /usr/local/bin/python2.7 /usr/local/bin/python2
# ln -s /usr/local/bin/python3.6 /usr/local/bin/python3
# git clone
# cd gpsd
# scons --config=force && scons install

FreeBSD fails to create the python links as required by PEP394.
So you need to add them yourself, as above.

=== Special Notes for NetBSD 8.1 Installation ===

gpsd will build, install and run on NetBSD.

Use their pkg_add command to install pkgin. Then use pkgin to
install the required tools.

# export PKG_PATH=\
# pkg_add -v pkgin
# echo > \
# pkgin update
# pkgin install python37 py37-curses
# ln -s /usr/pkg/bin/python3.7 /usr/pkg/bin/python
# ln -s /usr/pkg/bin/python3.7 /usr/pkg/bin/python3
# pkgin install py37-scons
# pkgin install ncurses
# pkgin install openssl mozilla-rootcerts
# mozilla-rootcerts install
# pkgin install git
# git clone
# cd gpsd
# scons --config=force && scons install

=== Special Notes for OpenBSD 6.6 Installation ===

gpsd will build, install and run on NetBSD.

All you need for a basic gpsd install is scons and git. Then
create the missing python link.

# pkg_add scons
# pkg_add git
# ln -s /usr/local/bin/python2 /usr/local/bin/python

Then install the normal way.

# git clone
# cd gpsd
# scons --config=force && scons install

== Special Notes for Fedora derivatives ==
=== Special Notes for CentOS 7 Installation ===

gpsd currently will build, install and run on CentOS 7.

Install the gcc compiler and tools. Install EPEL.

Note: there is no EPEL for i386.

Use the yum command to install git if you
want to access the development source.

# yum group install "Development Tools"
# yum install git
# yum install \
# yum install scons
# yum install python-devel
# yum install ncurses-devel
# yum install pps-tools-devel
# git clone
# cd gpsd
# scons

+ 870
- 0
NEWS View File

@@ -0,0 +1,870 @@
GPSD project news

3.20: 2019-12-31
Change README into an asciidoc file and publish HTML from it
Add NED and geoid_sep to gps_fix_t and TPV JSON.
Add "-e NED" to ubxtool to enable NED messages.
gpsdata.separation replaced by gpsdata.fix.geoid_sep.
Remove nofloats build option.
TPV JSON "alt" is now fixed at WGS84. Probably.
xgps now uses XGPSOPTS environment variable.
add health variable to satellite_t
change satellite_t elevation and azimuth to double
satellite_t elevation, azimuth, and ss use NAN for unknown value.
add altMSL, altHAE, and depth, to gps_fix_t
altitude in gps_fix_t is deprecated and undefined
wgs84_separation() now return EGM2008 computed from 5x5 degree base data.
The best results are close to cm, the worst off up to 12m.
Move mag_var from gps_device_t to magnetic_var gps_data_t.
Added mag_var() to interpolate magnetic variation (deviation) from a table.
Remove true2magnetic() as mag_var() improves on it.
Remove TIMEHINT_ENABLE. It only worked when enabled.
Remove NTP_ENABLE and NTPSHM_ENABLE. It only worked when enabled.
Add dgps_age and dgps_station to gps_fix_t
Convert all timestamp_t to timespec_t.
Remove FIXED_PORT_SPEED and FIXED_STOP_BITS build options.
Add -s [speed] and -f [framing] runtime options to gpsd.
A working CC and termios.h are mandatory.
use the current leap second to determine the current GPS epoch., leapseconds.cache, timebase.h and leapfetch option gone.
See also change histories in gps.h and gpsd.h

3.19: 2019-07-01
Rearrange rawdata_t. Bump the API because gps_data_t changed.
Report sequence-ID fields in type 7 and 13 AIS messages.
Preliminary support for SiRFstar V
Improve error modeling.
Update pseudo NMEA to v3.0, with fractional time.
Improve cycle detection, mostly for NMEA.
Move epe from gps_data_t to be near its friends in gps_fix_t.
Preliminary u-blox 9 support.
Add qErr in gps_data_t to store PPS quantization error.
Add Android (AOSP) support
Improved multi gnss and multi signal support.
NMEA 4.10 multi gnss multi signal support.
The arguments to "ubxtool -p P" have been expanded and changed.
New options, -g, -x, -z, added to ubxtool for u-blox 9 support.

3.18.1: 2018-10-19 (Gary E. Miller <>)
Fix some installation issues.
A few minor updates to ubxtool and driver_ubx.
Add contrib/skyview2svg

3.18: 2018-10-02 (Gary E. Miller <>)
Add ECEF support to ievermore, italk,Skytraq, SiRF, U-blox drivers.
Add ECEF support to JSON, cgps and xgps.
Add GREIS (Javad) driver from Virgin Orbit.
Add CLI tools zerk and ubxtool to manage JAVAD and u-blox GPS.
Add gnssid:svid to satellite_t, cgps and xgps. PRN will die.
Add gnssid:svid to JSON, cgps and xgps.
Add stricter version checking (more to todo).
More and better regression tests.
Better Python dependency checking, at build time and runtime.
Fix several buffer issues.
New polar plots, and improved statistice, in gpsprof.
gpsd master/slave mode works, first time ever.
All isnan() changed to !isfinite(), fixing many bugs.
Client-side Python libraries may automatically reconnect
Too many other bug fixes and improvements to mention.
Over 1,000 commits from 46 different commiters.

3.17: 2017-09-07 (Eric S. Raymond <>)
Repair support for non-NMEA devices requring active probing
(e.g. Garmin USB GPSes). Apply OS X build fixes. Fix a SiRF driver
bug that occasionally confused NTP. Support for Spectratime iSync
GRClok and LNRClok oscillators. gpxlogger can reconnect when
the GPS loses the fix. xgps and xgpsspeed moved to python-gi,
getting shut of the deprecated pygtk2 bindings. Default mode for
xgpsspeed is now the more interesting nautical display. gpsmon
includes the hostname with the device display. gpsprof now has
centimeter precision.

3.16: 2016-01-08 (Eric S. Raymond <>)
Test rebuilds for mid-2015 leapsecond bump. Regression tests will
run even if "python" in Python 3. Build correctly on systems where
-ltinfo is split from -lncurses. Avoid some rare overflow conditions
in PPS code. Fix bugs in JSON sat-view parsing due to the JSON
parser stuffing ints into shorts. Various small fixes to AIS
interpretation. Prevent a memory leak in long-running gpsmon
instances. Fix Savannah bug #45270: serial driver does not work
properly on pipes. Fix Savannah bug #44648: GPSD won't build if
CCFLAGS contains options that are only compatible with the
cros1s-compiler. Fix Savannah bug #45342: SConstruct generates wrong
*.pc files. Fix Savannah bug #46495: gpsd_poll may crash due to
unitialized pointer (probably due to buggy FD_ISSET on host
system). Fix Savannah bug #46648: gpsd crashes and buffer overflow
is reported when terminated. Fix Savannah bug #46802: AIVDM to CSV
is broken in some weird cases. Fix Savannah bug #46804: JSON
satellite view parsing is somewhat broken.

3.15: 2015-06-03 (Eric S. Raymond <>)
Fix a rare crash bug related to devices becoming inaccessible while timed out.
Accept NMEA 4.1 GSV sentences with the trailing signal-ID field.
Fixed incorrect decode of south latitudes in AIS Type 17 messages.
splint has been retired; this removes almost 2KLOC of annotations.
chrpath is no longer a build dependency. Corrected Beidou/QZNSS display
in the Python clients so the graphics don't look like SBAS.

3.14: 2015-03-14 (Eric S. Raymond <>)
The Pi Day release, 3.14 on 3/14 2015 at 9:26. Longer timeouts on test clients.
Skyview support for the Beidou and QZSS constellations in the NMEA0183 driver.
ntpmon rename to ntpshmmon - it doesn't actually monitor NTP itself.
New HOWTO on the website: "Introduction to Time Service".

3.13: 2015-02-26 (Eric S. Raymond <>)
compiler.h inclusion removed for gps.h so it's standalone for /usr/include.
TOFF JSON report gives the offset between GPS top of second and clock time.
A new ntpmon tool supports capturing clock samples from NTP SHM segments.

3.12: 2015-02-22 (Eric S. Raymond <>)
The daemon's power utilization has been reduced by changing from
non-blocking to blocking I/O; this may be significant on mobile devices.
Better protection against false matches of Inland AIS messages; this
required a libgps version bump to 22 (as a side effect, per-device
footprint has decreased). PPS feature is no longer marked
experimental/unstable. Sentence tag fields have been dropped from
the JSON reports. GNSS and GLONASS SKY reports are now
merged. Addressed versions of AIS Type 25 and 26 are now
handled. The 'nmea' build option is now 'nmea0183'. New 'minimal'
option sets all boolean options not explicitly set on the build
command line to false. The 'limited_max_devices' option is now
'max_devices'; the 'limited_max_clients' option is now 'max_clients'
The previously deprecated 'libQgpsmm' option has been removed; use 'qt'.
A bug fix for error modeling when NMEA 0183 reports empty DOP
fields. On OS X, the "osx-pl203" driver has been explicitly listed
as unsupported. The last remnants of the old pre-JSON query protocol
have been removed from the client library.

3.11: 2014-07-23 (Eric S. Raymond <>)
A bug that prevented track interpolation has been fixed.
We now get vertical error position and speed estimates from the
u-blox driver rather than having to interpolate them.
Some unusual AIS talker IDs (NMEA 4.0 station classes) are supported.
chrpath is no longer a dependency for building and testing, and
now defaults to 'no'. Full systemd support. Fixes for handling
large PPS offsets. Improved recovery from device flakeouts,
gpsmon argument parsing.

3.10: 2013-11-22 (Eric S. Raymond <>)
AIS: Adds gps2udp, an AIS data relay, split24 option supports
passing through Type 24 halves; support for Inland AIS; "scaled" no
longer controls dumping of controlled-vocabulary fields; instead,
the're always dumped numerically and as text, with text in an
attribute name generated by appending "_text" to the name of the
base attribute. The packetizer's handling of write boundaries not
coinciding with packet boundaries is improved. Better support for
mode and speed switching in the UBX driver. PPS message now ships
nsec. PPS events are visible in gpsmon. Time-reporting fix to TSIP.

3.9: 2013-05-01 (Eric S. Raymond <>)
Note to packagers: this is an urgent release that fixes a possible
DoS or security hole! Armor the AIS driver against an implausible
overrun attack. A (different) fix for our first malformed-packet
crash since about 2007. Minor improvements to the NMEA2000
driver. New FAQ entry on how to know WAAS/EGNOS is working.
New -u and -uu options enable usec timestamps on gpspipe output.

3.8: 2013-02-25 (Eric S. Raymond <>)
Fix various minor errors in the AIVDM/AIVDO description. Repair the
xmlto support in the build system. Add two more regression
tests. Significant improvements to NMEA2000 support. Upgrade the PHP
client to v3 of the Google Maps API. Support for the Telit SL869
chipset. Added a nautical-style display to xgpsspeed. Minor
improvements to

3.7: 2012-07-02 (Eric S. Raymond <>)
Snap release to get the midnight change in the default leap-second
constant out the door. Port tests now pass on all Debian supported
architectures, including the Sparc and s390 that were giving us
trouble before. Pre-2003 Delorme Earthmate works again.

3.6: 2012-05-23 (Eric S. Raymond <>)
It's the Fernando Poo Day release. Code has zero detectible defects
under Coverity scanning and cppcheck 1.52; this is mainly a cleanup
release to get those minor fixes into the field. If a leap-second
warning is available from GPS subframe information it is passed to
ntpd. NMEA2000 is now supported via the Linux kernel CAN interface.
There's a chrpath=no config option for distribution makers, so
chrpath is no longer a build dependency; see build.txt for

3.5: 2012-04-14 (Eric S. Raymond <>)
Use pselect when it's available to cut down on wakeups and improve
signal handling. New {PPS} message exporting clock drift. The AIVDM
driver now handles up to 16 interleaved 24A and 24B pair-halves.
The NMEA driver interprets depth-sounder returns from SDDBT and
reports them as negative altitudes. The pps-pin option is gone, the
PPS code now just accepts any handshake pin. A bug that sometimes
caused RTCM packets to be dropped rather than relayed is fixed.

3.4: 2012-01-12 (Eric S. Raymond <>)
Don't barf when chrpath is not available, fall back to static linking;
helps people not running Linux.

3.3: 2011-10-29 (Eric S. Raymond <>)
Improvements to build and release-procedure documentation. Make
sirf=no build work again. Main reason for this release is to make
chrpath a mandatory build dependency and explain why in the build

3.2: 2011-10-25 (Eric S. Raymond <>)
In the build recipe, (1) set pkgconfig properly for 64-bit Fedora
systems, (2) clean up various derived files including *.pyc on scons
-c, (3) add an option to disable stripping of binaries (strip=no),
(4) for embedded targets, add an option to disable building Python
support (python=no), (5) make the help for gpsd_group and gpsd_user
a little clearer, (6) add a force_global option to build gpsd to
listen to all addresses (rather than just loopback). The packet
sniffer now accepts NMEA packets with the ECDIS packet leader 'EC'.
SBAS satellites are now properly use-flagged in SiRF and UBX
skyviews. The -G option now works under IPv6. Cross-build is now
officially supported and instructions included. gpsprof works again
and does whole-cycle profiling. gpsd.php has Open Street Map
support. The pp-on-cts option is replaced by a pps_pin option that
lets you specify the pin; the default is still DCD. New supported
device; the Jackson Labs Fury. The chrpath utility has become a
build prerequisite.

3.1: 2011-07-28 (Eric S. Raymond <>)
The Irene release, rocking you like a hurricane and brought to you
from the storm shelter in my basement. This is a snap release mainly
to get some scons recipe cleanups out the door. Parallelized builds
now work. Small but fatal problems with reconfigure=no, netfeed=no
and sock_export=no builds have been fixed. Build recipe ported for
Fedora, Darwin, FreeBSD and OpenBSD. libgps now brings -lm with it
on systems with implicit linking. One old bug fixed (code was
previously present but broken): Under Linux, gpsd will refrain from
opening serial or USB devices that another process has open,
avoiding potential problems with class 0xFF USB devices opened by
other programs. One new bug fix: we now use an atof()
implementation that ignores locale, avoiding problems where decimal
point is a comma. One new feature: Change -N semantics so it only
suppresses backgrounding; privileges are now dropped as in normal
background operation.

3.0: 2011-07-19 (Eric S. Raymond <>)
POLL subobject name changes: fixes -> tpv, skyview -> sky.
Fix a timestamp-clobbering bug in the C library revealed by an
obscure car-nav device, the MyGuide 3100. The DEVICE 'activated'
attribute becomes an ISO8601 string; the client libraries will
still backward-compatibly read a float value. gps_unpack() is
now a documented part of the library API. There is now a
shared-memory export from the daemon that can be accessed through
the C and C++ client libraries. xgps and cgps may now display
the Maidenhead grid locator for current lat/lon. xgps displays
GST noise statistics if they are available. Codebase now has
an scons build recipe. Direct support for activation of gpsd from
Mac OS/X systemd. gpsdecode can now filter reports by RTCM2, RTCM3,
or AIS message type. NMEA HEHDT is implemented. Remote gpsd instances
can now be used as data sources via a gpsd:// URL. There is a client
for live-feeding GPSD data to Google Earth. The hotplug sequence no
longer requires Python.

2.96: 2011-03-21 (Eric S. Raymond <>)
Bumped maximum channel count to 32 to accommodate GPS+GLONASS devices.
API version bumped to 5, redesign finished (changes are documented
in the Client HOWTO). cgps now handles resize signals. Code can now
link with uClibc for embedded use. Various bugs in the C++ binding
have been fixed. gpxlogger can now daemonize and write to a specified
log file. A gpsd client can now set any locale it likes, and JSON
will still be parsed using the C locale matching the daemon's. Clients
are no longer required to define a gpsd_report() hook. gpsd no longer
emits probe strings to unidentified USB devices at startup.
JSON timestamps in TPV and SKY are now ISO8601 rather than seconds since
the Unix epoch; the library handles the older style backward-compatibly.
GPGST sentences are now parsed for noise statistics when a device emits them.
AIS and RTCM2 JSON dumps have device fields. JSON reports now include 50bps
subframe data if the device allows access to it. gpsdecode can now dump NMEA
GPS binary, and subframe data to JSON. The RTCM2 code now understands and
analyzes RTCM2.3 messages 13, 14, and 31, and has been checked against another
analyzer. The ancient Sager dump format for RTCM2 is abolished in favor of
a JSON profile.

2.95: 2010-07-13 (Eric S. Raymond <>)
The autonomous robot submarine total world domination release!
Rationalize clearing and generation of DOPs, this makes epx/epy much
more generally available. Fixed the test productions for the udev
magic and added a troubleshooting note in INSTALL. cgps now displays
epx/epy rather than eph. Speed is now always reported if our last
two fixes were good, even if the GPS didn't compute it. Reading
packets from UDP datagrams by specifying a listening address and
port is now supported, and the regression-test driver cam now be
told to force this with -u; this enables regression testing in
chroot jails where access to ptys is locked out. AIS code now
interprets message type 6 and 8 application IDs correctly as a
Designated Area Code and Functional ID pair. gpspipe has a new -T
option for setting the timestamp format. xgpsspeed is completely
rewritten in Python, eliminating some dependencies on ancient X
libraries. We now ship a Qt binding for the client library. Note
a GCC 4.2.1 optimizer bug. gpsdcode now uses | as a field separator
in -c mode, as string fields can contain commas. Corrected error
in reporting of AIS rate-of-turn fields.

2.94: 2010-04-20 (Eric S. Raymond <>)
Error-checking in the 50bps subframe code has been greatly improved.
The Garmin GPS driver can now use libusb, if it is present, to do
device discovery. The libgps library has been split apart; the
service functions used by the daemon now live in libgpsd. This
will shave some code volume from GPSD client applications. A packaging
error that resulted in xgps not being shipped in 2.93 has been
corrected. We now have stronger checking for valid ephemeris before
extracting the leap-second offset; they should prevent many cases
where gpsd might previously have used an invalid leap-second offset.

2.93: 2010-04-16 (Eric S. Raymond <>)
Support for JSON dumping and parsing of AIS message types 25 and 26,
not yet observed in the wild on AISHub. Fix Debian bug #569703. by
removing non-streaming mode from the Python exerciser. Fix Debian
bug #572900 by unsetting the appropriate in-use flag in the device
array. Change the libgps default from old protocol to JSON. Add a
close() method to the C++ binding. Try to recover better from
sporadic cases of false matches to Trimble packet format from a SiRF
binary datastream. gps_poll() now returns -1 with errno not set when
the gpsd socket closes. TPV now refrains from reporting fields the
fix quality won't support. gpsmon option for listing device types is
now -L to -l can be used to enable logging (to stay consistent with
the l command). There is new FAQ material on improving fix and time
reference accuracy. New sections have been added to NMEA.txt on
error status indications and satellite IDs. New POLL command brings
back polling-mode operation. A Client-HOWTO has been added to the
documentation. gpsd no longer eats CPU when a device is unexpectedly
unplugged. Support for the TNT revolution is back (run mode only).
There is now a gpsdfake diagnostic tool that fakes being gpsd shipping
arbitrary specified data to clients.

2.92: 2010-03-03 (Eric S. Raymond <>)
Fix a packaging error. The new Python library module was
inadvertently omitted from the 2.91 tarball. Also, improve the json
import test slightly.

2.91: 2010-03-01 (Eric S. Raymond <>)
We have support for NMEA GLONASS sentences, and a regression test.
Clients now get a DEVICE notification on every driver switch. It is
possible to specify a TCP/IP AIS feed such as AISHub as a data
source. Serious bitrot in the NTRIP support has been fixed - it was
probably nonfunctional for several releases before this. Fixed
buggy display of satellite-used flags in cgps. xgps is replaced by
a rewrite in Python that uses pygtk, eliminating a dependency on
Motif; also, it now displays AIS information. Uniform treatment of
display-unit defaulting and -u in xgps, cgps, and lcdgps. Support
for AIS message types 25 and 26. Support for IPv6. A numeric
instability in the earth_distance() function affecting track error
modeling has been fixed. Old protocol has been removed from the
daemon; the library still speaks it.

2.90: 2009-12-04 (Eric S. Raymond <>)
GPSD-NG, the new JSON-based command protocol, is now deployed; as a
consequence, AIS is now fully supported in both daemon and client.
Detection of end of a fix-reporting cycle is now reliable;
accordingly data is accumulated from cycle start and the "J"
(nojitter) option on both server and client side is gone. We have
abandoned the gpsflash subproject since it has become apparent that
we can't do it without more vendor cooperation than we're likely to
get. Increase major version of shared library due to significant API
change. Added new driver for Motorola Oncore receivers, with help
from Håkan Johansson. gpsfake can now accept multiple logfiles,
interleaving test sentences from each. gpsd now accepts error
estimates from the NMEA $GPGBS sentence.

2.39: 2009-03-18 (Eric S. Raymond <>)
Fixed potential core dump in C client handling of "K" responses.
Made device hotplugging work again; had been broken by changes in udev.
Introduced major and minor API version symbols into the public interfaces.
The sirfmon utility is gone, replaced by gpsmon which does the same
job for multiple GPS types. Fixed a two-year old error in NMEA parsing
that nobody noticed because its only effect was to trash VDOP values from
GSA sentences, and gpsd computes those with an internal error model
when they look wonky. cgpxlogger has been merged into gpxlogger.
Speed-setting commands now allow parity and stop-bit setting if the
GPS chipset and adaptor can support it. Specfile and other packaging
paraphenalia now live in a packaging subdirectory. rtcmdecode becomes
gpsdecode and can now de-armor and dump AIDVM packets. The client
library now works correctly in locales where the decimal separator is
not a period.

2.38: 2009-02-10 (Eric S. Raymond <>)
Regression test load for RoyalTek RGM3800 and Blumax GPS-009 added.
Scaling on E error-estimate fields fixed to match O. Listen on
localhost only by default to avoid security problems; this can be
overridden with the -G command-line option. The packet-state machine
can now recognize RTCM3 packets, though support is not yet complete.
Added support for ublox5 and mtk-3301 devices. Add a wrapper around
gpsd_hexdump to save CPU. Lots of little fixes to various packet
parsers. Always keep the device open: "-n" is not optional any more.
xgpsspeed no longer depends on Motif. gpsctl can now ship arbitrary
payloads to a device. It's possible to send binary through the
control channel with the new "&" command. Experimental new driver
for Novatel SuperStarII. The 'g' mode switch command now requires,
and returns, 'rtcm104v2' rather than 'rtcm104'; this is design forward
for when RTCM104v3 is fully working.

2.37: 2008-02-17 (Chris Kuethe <>)
The C++ bindings, Garmin USB support, and multiple instances of ntp
pps thread starting were fixed. Handling of odd PPS signals was
improved. The eye candy in the PHP visualizers was fixed.

2.36: 2008-01-01 (Eric S. Raymond <>)
Urgent fix to leap-day calculation affecting dates from today to
28 Feb on generic NMEA GPSes, Zodiacs, and SirFs emitting message 0x62.
Integrated Garmin Simple Text Protocol driver from Peter Slansky.
Minor fixes in error modeling and a better NaN guard stabilize the
Trimble regression tests. Remove the wired-in NTP time offset from the
NMEA driver, this could only have worked by accident and should be
set in ntpd.conf. Integrated Ashtech driver from Chris Kuethe.

2.35: 2007-12-10 (Eric S. Raymond <>)
Navcom driver merged. Removed -d -f and -p options of gpsd; these
have been undocumented for a while. Make gpsd play well with pkgconfig.
Incorrect computation of VDOP when GPSes didn't supply it has been fixed.
The xgps code has been revamped and now has a much nicer interface.
Add -b (no-configuration) option as a sadly clumsy workaround for some
problems with Bluetooth receivers. Added tests for Haicom-305N and Pharos
360; separated out the tests for the unstable Trimble drivers.
32-vs-64-bit problems in the regression tests have been solved.

2.34: 2006-12-14 (Eric S. Raymond <>)
Fix for byte-swapping of Zodiac control messages on big-endian hardware.
Disable iTalk by default and note that it needs to be tested. Command line
arguments can now be DGPSIP or NTRIP URLs; -d is deprecated. Added udev
rules. Address excessive processor and memory utilization on SBCs; it's
now possible to configure compile-time limits on the number of devices
and client sessions. Eliminate use of fuser(1) in gpsfake. Get gpsd
working with EarthMates again, this had been broken since 2.15. Massive
string safety audit and OpenBSD port by Chris Kuethe. J command added.
The gpsctl and gpscat tools and the gpsd.phps script were added. Switched
to lesstif from openmotif. Better autodetection of DLE-led packet
protocols (notably TSIP and Garmin binary) and of SiRFStar I and III
devices. Fixed buggy parsing and generation of PGRME.

2.33: 2006-06-09 (Eric S. Raymond <>)
Fix bad unit conversion in V output. Clean up some man-page messes.
Fixed buggy libgps parsing of multiple responses. It's now possible
to lock gpsd to a fixed speed at compile time for embedded use. Added
NTRIP support, thanks to Ville Nuorvala. O command now ships an
explicit mode field.

2.32: 2006-03-12 (Eric S. Raymond <>)
Cleanup of the xgps layout, and minor memory-leak fixes for xgps. Fix
to cope with Antares u-blox by Andreas Stricker. Minor fix to libgps
cgpxlogger. Merge cgpxlogger and gpxlogger documentation onto
the xgps(1) manual page and rename it gps(1).

2.31: 2006-02-17 (Eric S. Raymond <>)
Now builds and runs under Cygwin. Correct the speed units in
synthetic NMEA. Slightly better time handling under NMEA. Daemon
now builds with all but NMEA disabled. Update the leap-second
offset. cgpxlogger introduced. Upgrade gpxlogger to DBUS 0.60
conformance. Jason von Nieda's patch may fix the chronic TSIP
driver problems.

2.30: 2005-09-14 (Eric S. Raymond <>)
Prevent core dump on -d option. The .log extension is no longer required for
test loads. cgps and xgps now have configurable latitude/longitude formats
via the -l option. Introduced new 'g' command that allows clients to
specify whether they want GPS or RTCM104 information.

2.29: 2005-07-19 (Eric S. Raymond <>)
Added Sony CXD2951 support, untested. All error estimates are
now nailed to 95% confidence interval. Added rtcmdecode and its
documentation; also, gpsd can now monitor serial devices emitting
RTCM104 and display differential-GPS data in a readable format.
Added dangerous alpha version of gpsflash. Work around a nasty bug
in SiRFStar III firmware version < 3.1.1. Added support for True
North Technologies Revolution 2X Digital compass. Added the
gpxlogger client for systems with DBUS support and the gpspipe
and cgps clients for general use.

2.28: 2005-07-06 (Eric S. Raymond <>)
The 2.27 source tarball somehow got truncated on upload.
Due to procedural mechanics at Berlios, shipping a new release
seems to be the least painful way to recover. This release is
identical to 2.27 except the roadmap stuff has been added to TODO.

2.27: 2005-07-06 (Eric S. Raymond <>)
Arrange for the daemon to remove its pid file on exit. Fix some
buffering problems with the Python side of the hotplug interface.
gpsfake can now run sessions under a monitor like Valgrind. Most
of the gpsfake logic now lives in a module that can be used to write
other test loads; its progress baton is now optional. Fixed
some minor bugs found by valgrind audit, including (1) a slow
memory leak, (2) a possible but unconfirmed file-descriptor leak,
and (3) a subtle error in the channel-assignment logic that only
showed up with multiple sessions active. In fact, the daemon code
no longer uses dynamic-memory allocation at all. Also, the code
no longer relies on FIONREAD working. The track error field in the
O response is now computed. The project website has some new eye candy.
Client connections now time out when the mode is neither raw nor watcher.
Fixed a core-dump that could happen if C, B or I commands were issued
at odd times.

2.26: 2005-06-22 (Eric S. Raymond <>)
Time DOP and total DOP are now passed on from GPSes that report
them. Ensure longitude has a leading zero when <100, for
compatibility with gpsdrive. Synchronous and thread hooks are now
separate in the client library. Packet-sniffing on a new device no
longer holds up incoming data on already-connected ones. There is
now a super-raw mode (R=2) that dumps a hex-encoding of every binary
packet received to the client; sirfmon uses it to operate through
the daemon if one is running. Support for Trimble TSIP GPSes
merged. gpsfake now works with SiRF and Zodiac logs. Python library
supports thread callbacks. New -p option of gpsfake supports
regression testing of the daemon, and there is a test suite included
with the distribution. PPS support is turned off, as there is some
pthreads problem that sometimes kills the daemon on pthreads exit.
Correct off-by-one error in GPZDA processing. The code has been
audited and cleaned with splint (

2.25: 2005-05-21 (Eric S. Raymond <>)
Various signedness and scaling fixes and an OpenBSD port patch for the
Zodiac driver. Command-line arguments to gpsd are now treated as a default
device list; -f is still supported but deprecated. sirfmon now tries not
changing the line speed first, so it syncs up much faster. Prevent a
potential buffer overrun in the client library. PPS-thread support is now
on by default. Lots of documentation improvements. D-BUS broadcast support
by Amaury Jacquot. Added Alfredo Pironti's thread-callback and C++
support. gpsd no longer uses the system clock for anything, so it
can be used to set that clock.

2.24: 2005-05-17 (Eric S. Raymond <>)
Crazy-speed bug is finally fixed. Autobauding now starts with the
current speed of the device, not the stored gpsd speed; this means
hunting only takes place when device and GPS speed aren't matched.
xgpsspeed unit-conversion bug introduced in 2.22 is fixed. Satellite
display now really shows 12 channels, not just 11. Major improvements
in ntp notifications.

2.23: 2005-05- 4 (Eric S. Raymond <>)
For better security, the daemon now drops root privileges after startup.
gpsd-clients is now a separate RPM; this is helpful on lean systems
that don't run X. The O command now reports speeds in meters per second
rather than knots, client code has been adjusted so there is no user-visible
change. We now compute the missing components of DOP when using SiRF chips.
/dev/gps is no longer special; there is no default GPS device unless you
specify one. The intermittent processor-hogging problem introduced by the
control-channel change in 2.21 has been solved.

2.22: 2005-04-25 (Eric S. Raymond <>)
SiRF-binary driver can now get leap-second corrections from subframe data.
Device add/delete commands now send back OK or ERROR. Error-modeling
corrections from the SiRF folks. Higher precision in position reports.

2.21: 2005-04-12 (Eric S. Raymond <>)
Add tag and timestamp to Y response. Use computed geoid separation as
SiRF packet 42 is flaky. Security fix: hotplug scripts now do device
add/removes through a separate local control channel. True multi-device
support is in place. When in watcher mode, device switches are announced.

2.20: 2005-03-31 (Eric S. Raymond <>)
Rob Janssen's patches to fix timezone issues and improve cooperation
with NTP. License changed to BSD so linking to libgps won't make people
nervous. gpsprobe and are obsolete and have been removed, the
autoprobe and profiling capabilities in the daemon more than replace
them. gpsprof now ships self-contained GNUPLOT scripts to stdout,
so they can be saved and redisplayed. Zodiac sort of works again, but
occasionally spins madly during autobauding.

2.19: 2005-03-26 (Eric S. Raymond <>)
Fix brown-paper-bag bug with NMEA parsing. Set SiRF GPSes to use
SBAS. sirfmon now displays SBAS parameters, and is included in the
installed programs. Add to FAQ a fix for spurious high speeds reported
in XTrac mode. We now interpret GPZDA. We no longer fudge a missing
ddmmyy in NMEA timestamps from the system clock, so replay will work better.

2.18-1: 2005-03-23 (Eric S. Raymond <>)
First cut at cooperating with NTP. Major library restructuring;
a fix is now a data structure of its own, and per-field timestamps
are gone. Use new 'o' command for watcher mode. Compute some estimated
error bounds.

2.17: 2005-03-16 (Eric S. Raymond <>)
Fix packet-engine problem that made disconnect/reconnect unreliable
(important!). Fix bonehead error in interpretation of PGRME. We
don't use O_SYNC (it turned out not to be reliable) so remove it to make
life easier under Mac OS X. Allow gpsfake to accept subsecond cycle times.
Add a FAQ to the HTML documentation. gps_poll() now handles multi-line
responses. Add N command for switching driver modes.

2.16: 2005-03-11 (Eric S. Raymond <>)
New F command allows changing the GPS device after startup time.
Hotplug scripts to go with it are now installed by the RPM. The
Garmin probe is working. The -T and -s options are gone. We have
achieved zero configuration!

2.15: 2005-03-02 (Eric S. Raymond <>)
A new packet engine autobauds much more quickly, and now iterates
over both 1 and 2 stopbits. Explicit support for FV18 (the -T f
option) is gone; instead, gpsd syncs with any 7N2 device and always
ships a suitable init string. New E command, supporting the Garmin
position-error sentence or computing these numbers from DOP and an
error model. New U command reports climb/sink from GPSes that report
vertical velocity. There is a prototype driver for SiRF-binary GPses,
invoked automatically when SiRF packets present themselves on the
wire after device open.

2.14: 2005-02-25 (Eric S. Raymond <>)
Pass zero magnetic variation in generated NMEA from binary GPSes
correctly. Use O_SYNC rather than timeouts to guarantee that
baud-rate change strings get to the GPS before changing the line
parameters. Introduced I command. Spatial scattergram plotting
moved from gpsprobe to gpsprof.

2.13: 2005-02-21 (Eric S. Raymond <>)
Correct a bug in binary-protocol dumping (applies to Zodiac and
Garmin only). Gary Miller's patch to deal gracefully with GPSes
like the Magellan EC10X that send only GPRMC and never GPGGA or
GPGSA, and thus never set mode or status fields. Fixed buggy
handling of units options in xgps and xgpsspeed. Bumped library
major version, since seen_sentences is now exposed and drivers have
more capabilities. Stricter NMEA buffer validation. Withdrew the
change that always passed up a timestamp; on SiRF receivers, the year
part is garbage when the PVT fields are garbage. Can now recognize
SiRF GPSes. Experimental baud-switching support for Zodiac.

2.12: 2005-02-15 (Eric S. Raymond <>)
Fixed core-dump bug in processing of the GLL variant that does not
include an FAA Mode Indicator. When using the NMEA driver, gpsd now
hunts for a baud rate rather than requiring a fixed one to be set.
A new 'B' command returns the RS232 parameters, and a new 'C'
command returns the update cycle time. Added gpsfake test harness.
Alpha driver for Garmin binary protocol added, requires Linux
garmin_usb kernel driver. The daemon now always passes up a
timestamp for every sentence that has one, even if the PVT fields
aren't valid.

2.11: 2005-02-10 (Eric S. Raymond <>)
Added gpsprof and the capability to generate GPS latency profiles.
gpsprobe now hunts through plausible baud rates when looking for NMEA
data from a GPS. The -b (baudrate) option fixes a speed, disabling
the baud-matching logic. Also, gpsprobe can now recognize SiRF
protocol, though not speak it. Fixed a math domain error in
gps.EarthDistance due to numeric blowup on points very close together,
and another in gps.MeterOffset() that was screwing up gpsprobe plots.

2.10: 2005-02-01 (Eric S. Raymond <>)
Add -N option to explicitly foreground the daemon. Fixed a bug
that was causing gpsd to keep reopening the GPS device after
leaving raw or watcher mode. Fixed Gary Miller's core-dump bug.

2.9: 2005-01-27 (Eric S. Raymond <>)
Python files restored to RPM.

2.8: 2005-01-27 (Eric S. Raymond <>)
Embarrassing typo fix in Avoid buffer overrun in xgps.c.
Plug Debian security bug 292347, CVE number CAN-2004-1388.
This version issued on an emergency basis without Python libraries,
which have packaging problems due to the 2.3/2.4 transition.

2.7: 2005-01-14 (Eric S. Raymond <>)
More compiler-warning cleanups. gps client name changed to xgps.
Added --speedunits option to xgpsspeed, --speedunits and --altunits
options to xgps. Improved GPGSV parsing so it copes gracefully if
we start in the middle of a sequence. Merged Petter Reinholdtsen's
fix for GPGSA lists with holes. In xgps, satellites used in the
last fix are now dotted in the middle. New -P option to create
pidfile. Audited for potential buffer overruns, found and fixed

2.6: 2005-01-01 (Eric S. Raymond <>)
Petter Reinholdtsen's fix for buffering. Fix syntax errors
in udev scriptlets. Clean up after GCC warning messages. Drop use of
vsprintf, so we get a link-time error on systems that might produce
buffer overruns (all modern Unixes support vsnsprintf which is safe).

2.5: 2004-12-23 (Eric S. Raymond <>)