GPS-Time-Synchronisation

The goal is to precisely synchronize all Linux system clocks in the network to global time obtained from a GPS receiver. Note how the following description traverses the clock hierarchy top-down starting with the GPS receiver down to the linux clock on the host node.

General Structure

The primary node is connected to a u-blox GPS receiver, from which it receives a PPS signal via GPIO and global time via UART if the GPS-Modul has a position-fix. One kernel module and two services work in tandem to provide a grandmaster clock:

  • pps_gmtimer (kernel module) timestamps edges on a GPIO pin with respect to an internal hardware timer on the AM335x and feeds the timestamps as a Linux pps device.

  • gpsd talks to the GPS via a serial interface, parses the protocol and extracts timing information that is fed to the following service (chrony).

  • chrony combines the global timing information from gpsd and the precise PPS signal from the pps device and synchronizes the Linux system clock to global GPS time.

Hardware setup

The GPS-capelet (see hardware/capelets/gps) is stacked on top of the shepherd cape.

  • The PPS signal is connected to Timer4 on pin P8_7

  • The GPS-Uart is connected over UART2 on pins P9_21 and P9_22

  • The currently used gps-chip is the u-blox SAM-M8Q

Note

The capelets were designed for shepherd v1, but are mostly compatible with v2.

Configuring GNSS module

The u-blox GPS receiver can be configured to optimize its performance. To do this directly from the host node the python script: ubloxmsg_exchange was written (see https://github.com/kugelbit/ubx-packet-exchange). The configuration files can be found under config_files. To this end the following configurations were set:

  • SBAS was disabled for better timing information

  • The stationary mode was enabled to get a better percussion and a stable performance

  • the GPS- and galileo-satellite-systems were enabled to get a fast and stable fix

In addition, the standard config of the receiver leads to the following behavior:

  • If the PPS is not locked, the LED on the capelet will not blink. After the lock is attained, the LED will start blinking at 1 Hz.

  • NMEA messages are enabled for the UART link which connects to the BeagleBone.

Note

Recent versions of gpsd include a tool ubxtool, allowing convenient configuration of ublox receivers:

  • Poll GNSS config: ubxtool -p CFG-GNSS

  • Enable Galileo: ubxtool -e GALILEO

  • Enable binary messages: ubxtool -e BINARY

  • Disable NMEA messages: ubxtool -d NMEA

  • Disable SBAS: ubxtool -d SBAS

  • Poll time pulse config: ubxtool -p CFG-TP5

Deploy

Please use the ansible gps-host role. ansible-playbook deploy.yml

Useful commands

Check if PPS pulses are coming: cat /sys/class/pps/pps0/assert On the primary node check that gpsd and chrony are running:

  • systemctl status gpsd

  • systemctl status chrony

gpsd comes with a command line client that display GPS data on the commandline: cgps Familiarize with chrony output:

  • chronyc sources -v

  • chronyc sourcestats -v

  • chronyc tracking -v

Configuration files

  • chrony: /etc/chrony/chrony.conf

  • gpsd: /etc/default/gpsd

  • the device tree file (dts) for the GPS-caplet is found in the pps-gmtimer folder (DD-GPS-00A0.dts).

DEBUG

If you want to see what’s going on you can run the services in DEBUG-Mode:

  • chrony: sudo chronyd -dd

  • gpsd: sudo gpsd -N /dev/ttyO2 -D15 -n

Pitfalls

  • For a good result (fast and stable fixes) it is import to provide a clear sky view to the gps-caplet.

  • There are lots of possible configuration options for the u-blox chip (see SAM-M8Q Receiver Description) that may further optimize performance. For more research in this direction use the u-blox u-center software.

  • The currently used u-blox chip does not support the u-blox time mode. This mode can increase the timing accuracy (see u-blox M8 Receiver Description).