58f0886de9378d0dba530b1c0adf529fd130fb77
[KenyonWiki.git] / Time_server.mdwn
1 This page documents my project to build a stratum 1 NTP [[!wikipedia time server]] at my house.
2 <!-- link to this page from http://wiki.northgrum.com/wiki/Network_Time_Protocol#Stratum_1_time_servers -->
3 [[!toc levels=2]]
4
5 ## GPS selection
6
7 I selected the [Garmin GPS 18x LVC](http://www.amazon.com/gp/product/B0016O3T7A) for the following reasons:
8
9 * Plenty of documentation exists by people who have used this unit as an NTP timing source.
10 * The receiver and antenna are integrated into one enclosure.
11 * Minimal assembly and soldering necessary, compared to bare-board receivers.
12 * Available on [Amazon](http://amazon.com/) for a decent price.
13
14 I ordered the 18x (and a [serial cable](http://www.amazon.com/gp/product/B000ZKNANO)) on Amazon on 2011-09-05. UPS delivered it on 2011-09-09.
15
16 ## Cable Construction
17
18 I simply spliced the GPS 18x LVC wires onto serial and USB wires. This matches what's documented in Garmin's GPS 18x LVC Technical Specifications.
19
20 ## GPS preparation
21
22 I used a Windows Vista computer with Garmin's SNSRXCFG_270.exe to upgrade the firmware from version 3.60 to the latest, 3.70. I also used SNSRXCFG_270.exe to set the PPS pulse width to 200 ms, and disable all NMEA sentences except GPGGA.
23
24 ## NTP setup
25
26 I first tried using the GPS with an old Pentium III computer running Ubuntu 11.04 natty running kernel 2.6.38-11-generic-pae. I could see the NMEA sentences with `gpsd` and `gpspipe -r`, but a few seconds after I did `sudo ldattach PPS /dev/ttyS0` the system would lock up hard due to some kernel bug in some driver for my hardware. I saw `BUG: scheduling while atomic` in the syslog, but I wasn't able to capture the whole bug output. The same bug would occur if I just did `cat /dev/ttyS0`. So I just gave up with that old hardware and moved the GPS to my newer desktop computer running Debian squeeze and kernel 2.6.39-bpo.2-amd64. No lockups on this machine.
27
28 You need to have `/usr/include/timepps.h` to compile ntpd with proper PPS support. This header [does not exist in Debian yet](http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=570233), so I used the one from [Alexander Gordeev's git repository](https://github.com/ago/pps-tools/).
29
30 The ntpd in Debian squeeze [does not have debugging enabled](http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=643954), which makes it difficult to see what is going on with your local reference clock. I [rebuilt the squeeze package](http://raphaelhertzog.com/2010/12/15/howto-to-rebuild-debian-packages/) with debugging enabled, but I still wasn't getting very good results.
31
32 When you do `sudo ldattach PPS /dev/ttyS0`, the PPS modules will be loaded automatically and the device `/dev/pps0` will be created. I have some udev rules to create device symlinks:
33
34     KERNEL=="ttyS0" SYMLINK+="gps0"
35     KERNEL=="pps0" SYMLINK+="gpspps0"
36
37 I'm going to try setting up a time server with FreeBSD next to see if it's any easier.
38
39 ## Notes
40
41 * Show serial port settings: `stty --all --file=/dev/ttyS0`
42 * Set serial port baud rate to 4800: `stty --file=/dev/ttyS0 4800`
43
44 ## References
45
46 * NTP documentation: [Reference Clock Support](http://www.eecis.udel.edu/~mills/ntp/html/refclock.html)
47 * NTP support wiki: [Configuring Garmin Refclocks](https://support.ntp.org/bin/view/Support/ConfiguringGarminRefclocks)
48 * NTP support wiki: [Configuring NMEA Refclocks](https://support.ntp.org/bin/view/Support/ConfiguringNMEARefclocks)
49 * NTP support wiki: [Garmin Refclock Users](https://support.ntp.org/bin/view/Support/GarminRefclockUsers)
50 * [Adding a FreeBSD NTP server based on an GPS 18 LVC device](http://www.satsignal.eu/ntp/FreeBSD-GPS-PPS.htm) by David Taylor
51 * [Enabling ntpd PPS support for Debian Lenny Linux](http://www.worldtimesolutions.com/support/ntp/Debian_Lenny_Linux_PPS_support_for_ntpd.html) by World Time Solutions
52 * [Garmin GPS 18x OEM](https://buy.garmin.com/shop/shop.do?cID=158&pID=27594)
53 * [LinuxPPS installation](http://wiki.enneenne.com/index.php/LinuxPPS_installation) and [ntpd support](http://wiki.enneenne.com/index.php/LinuxPPS_NTPD_support)
54 * [NTP server using PC gnu/linux and freebsd](http://www.wraith.sf.ca.us/ntp/) by Steven Bjork
55 * [NTP](http://en.gentoo-wiki.com/wiki/NTP) on Gentoo Wiki
56 * [Stratum 1 NTP, Garmin GPS 18 LVC on FreeBSD 8.0](http://blog.doylenet.net/?p=145) by Ryan Doyle
57 * [Synchronising to a Garmin GPS 18 LVC](http://www.sput.nl/time/garmin.html) by R.J. van der Putten
58 * [Synchronizing an NTP server to GPS/PPS](http://linlog.blogspot.com/2009/07/synchronizing-ntp-server-to-gpspps.html) by Pela-Suros
59 * [Synchronizing ntpd to a Garmin GPS 18 LVC via gpsd](http://www.rjsystems.nl/en/2100-ntpd-garmin-gps-18-lvc-gpsd.php) by Jaap Winius
60 * [Ubuntu bug 805661](https://bugs.launchpad.net/bugs/805661)
61 * [Using a Garmin GPS 18 LVC as NTP stratum-0 on Linux 2.6](http://time.qnan.org/) by Philip M. White