From Brandon's Tinkerings
Jump to: navigation, search
(Random Notes (The building blocks))
(Random Notes (The building blocks))
Line 54: Line 54:
  
 
== Random Notes (The building blocks) ==
 
== Random Notes (The building blocks) ==
 +
 
http://www.satsignal.eu/ntp/Raspberry-Pi-NTP.html
 
http://www.satsignal.eu/ntp/Raspberry-Pi-NTP.html
  
 
set user password
 
set user password
  
Advanced options  
+
Advanced options
  
 
-set hostname - NTP1
 
-set hostname - NTP1
Line 69: Line 70:
  
 
finish, reboot.
 
finish, reboot.
 +
 
login as pi
 
login as pi
 +
 
sudo -s
 
sudo -s
 +
 
set root password
 
set root password
  
Line 76: Line 80:
  
 
apt-get update
 
apt-get update
 +
 
apt-get dist-upgrade
 
apt-get dist-upgrade
 +
 
rpi-update
 
rpi-update
  
Line 84: Line 90:
  
 
edit /boot/cmdline.txt, remove serial references (AMA0) (only needed if you don't select to turn off serial console above)
 
edit /boot/cmdline.txt, remove serial references (AMA0) (only needed if you don't select to turn off serial console above)
edit /etc/inittab, remove serial console  (only needed if you don't select to turn off serial console above)
 
  
 +
edit /etc/inittab, remove serial console (only needed if you don't select to turn off serial console above)
  
 
KERNEL TIME
 
KERNEL TIME
  
 
Build Machine
 
Build Machine
 +
 
crossdev -S -v -t arm-unknown-linux-gnueabi
 
crossdev -S -v -t arm-unknown-linux-gnueabi
  
 +
Recommend to compile kernel on another system --http://elinux.org/Raspberry_Pi_Kernel_Compilation
  
Recommend to compile kernel on another system --http://elinux.org/Raspberry_Pi_Kernel_Compilation
 
 
export CCPREFIX=arm-unknown-linux-gnueabi-
 
export CCPREFIX=arm-unknown-linux-gnueabi-
  
Line 103: Line 110:
  
 
make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig
 
make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig
 
  
 
modify kernelmake ARCH=arm CROSS_COMPILE=${CCPREFIX} menuconfig
 
modify kernelmake ARCH=arm CROSS_COMPILE=${CCPREFIX} menuconfig
 
  
 
(Required!)General -> Default Hostname (NTP1)
 
(Required!)General -> Default Hostname (NTP1)
  
General -> Timers Subsystem -> Timer Tick Handling (Idle Dynticks System (Tickless Idle)) -> Periodic Timer Ticks (Constant rate, no dynticks) -- This is needed for NTP_PPSGeneral  
+
General -> Timers Subsystem -> Timer Tick Handling (Idle Dynticks System (Tickless Idle)) -> Periodic Timer Ticks (Constant rate, no dynticks) -- This is needed for NTP_PPSGeneral
  
 
-> Deselect "Old Idle Dynticks Config"
 
-> Deselect "Old Idle Dynticks Config"
Line 121: Line 126:
  
 
Device Drivers -> Real Time Clock -> (*) Dallas/Maxim DS1307/37/38/39/40, ST M41T00, EPSon RX-8025 (For RTC 3231 option below)
 
Device Drivers -> Real Time Clock -> (*) Dallas/Maxim DS1307/37/38/39/40, ST M41T00, EPSon RX-8025 (For RTC 3231 option below)
 
  
 
(Optional)Kernel Features -> memory split -> 2G/2G
 
(Optional)Kernel Features -> memory split -> 2G/2G
Line 139: Line 143:
 
>=3.18.x?
 
>=3.18.x?
  
Use DeviceTable?
+
Use DeviceTable - No patching
 
 
Edit arch/arm/mach-bcm2708/bcm2708.c
 
 
 
line 282 - change gpio to pin 23
 
 
 
Custom PCB uses GPIO23
 
  
 
make ARCH=arm CROSS_COMPILE=${CCPREFIX} -j4
 
make ARCH=arm CROSS_COMPILE=${CCPREFIX} -j4
  
 
mkdir modtmp
 
mkdir modtmp
 +
 
make ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=./modtmp modules_install
 
make ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=./modtmp modules_install
 +
 
tar -cjf modules.tar.bz2 modtmp/
 
tar -cjf modules.tar.bz2 modtmp/
 +
 
scp modules.tar.bz2 root@ntp1:~/
 
scp modules.tar.bz2 root@ntp1:~/
 +
 
scp arch/arm/boot/Image root@10.0.3.14:/boot/Image-31229
 
scp arch/arm/boot/Image root@10.0.3.14:/boot/Image-31229
  
tar -xjf modules.tar.bz2  
+
tar -xjf modules.tar.bz2
 +
 
 
mv /lib/modules/<version> /lib/modules/<version>-orig
 
mv /lib/modules/<version> /lib/modules/<version>-orig
 +
 
mv modtmp/lib/modules/<version> /lib/modules
 
mv modtmp/lib/modules/<version> /lib/modules
 +
 
cp -R modtmp/lib/firmware/* /lib/firmware
 
cp -R modtmp/lib/firmware/* /lib/firmware
  
Line 165: Line 170:
  
 
kernel=Image-3187
 
kernel=Image-3187
 +
 +
dtoverlay=pps-gpio,gpiopin=<x>
 +
 +
Custom PCB uses GPIO23
  
 
Grab latest NTP from: http://www.ntp.org/downloads.html, for compile computer
 
Grab latest NTP from: http://www.ntp.org/downloads.html, for compile computer
 +
 
extract
 
extract
 +
 
./configure --prefix=/usr --enable-ATOM --enable-NMEA --enable-GPSD --enable-SHM --enable-WWV --with-ntpsnmpd --enable-ipv6 --enable-linuxcaps --enable-clockctl
 
./configure --prefix=/usr --enable-ATOM --enable-NMEA --enable-GPSD --enable-SHM --enable-WWV --with-ntpsnmpd --enable-ipv6 --enable-linuxcaps --enable-clockctl
 +
 
make
 
make
 +
 
now wait ~20minutes
 
now wait ~20minutes
 +
 
rm /var/lib/ntp/ntp.conf.dhcp if DHCP, static recommended
 
rm /var/lib/ntp/ntp.conf.dhcp if DHCP, static recommended
  
##Cross-compile NTP:  
+
##Cross-compile NTP:
 +
 
 
##mkdir tmpinstall##make -j2##make install
 
##mkdir tmpinstall##make -j2##make install
 +
 
##tar -cjf ntp.tar.bz2 tmpinstall
 
##tar -cjf ntp.tar.bz2 tmpinstall
 +
 
##copy files out cp bin/ntpd bin/ntp-wait bin/ntptime /usr/sbin
 
##copy files out cp bin/ntpd bin/ntp-wait bin/ntptime /usr/sbin
 +
 
##https://support.ntp.org/bin/view/Dev/Cross-compilingNTP
 
##https://support.ntp.org/bin/view/Dev/Cross-compilingNTP
  
 
create /etc/udev/rules/09-gps.rules
 
create /etc/udev/rules/09-gps.rules
 +
 
file contents:
 
file contents:
 +
 
# Adds symlink from serial interface to /dev/gps0 for ntpd
 
# Adds symlink from serial interface to /dev/gps0 for ntpd
 +
 
KERNEL=="ttyAMA0", SYMLINK+="gps0"
 
KERNEL=="ttyAMA0", SYMLINK+="gps0"
  
 +
Edit /etc/ntp.conf
  
Edit /etc/ntp.conf
 
 
enable calibrate
 
enable calibrate
 +
 
enable kernel
 
enable kernel
 +
 
# GPS Module
 
# GPS Module
 +
 
server 127.127.20.0 mode 82 minpoll 4 maxpoll 6
 
server 127.127.20.0 mode 82 minpoll 4 maxpoll 6
 +
 
fudge 127.127.20.0 time2 +0.1939
 
fudge 127.127.20.0 time2 +0.1939
  
 
# PPS of GPS Module
 
# PPS of GPS Module
 +
 
server 127.127.22.0 minpoll 4
 
server 127.127.22.0 minpoll 4
 +
 
fudge 127.127.22.0 flag3 1
 
fudge 127.127.22.0 flag3 1
  
Line 203: Line 230:
  
 
modules/i2c already enabled in kernel from above
 
modules/i2c already enabled in kernel from above
 +
 
i2c-dev module
 
i2c-dev module
i2cdetect -y 1 - verify on 68
+
 
 +
i2cdetect -y 1 - verify on 68
 +
 
 
echo "ds3231 0x68" > /sys/class/i2c-adapter/i2c-1/new_device
 
echo "ds3231 0x68" > /sys/class/i2c-adapter/i2c-1/new_device
set timezone -  
+
 
 +
set timezone -
 +
 
 
rm /etc/localtime
 
rm /etc/localtime
 +
 
ln -s /usr/share/zoneinfo/America/New_York /etc/localtime
 
ln -s /usr/share/zoneinfo/America/New_York /etc/localtime
 +
 
edit /etc/default/hwclock
 
edit /etc/default/hwclock
 +
 
HWCLOCKACCESS=YES
 
HWCLOCKACCESS=YES
 +
 
HCTOSYS_DEVICE=rtc0
 
HCTOSYS_DEVICE=rtc0
  
 
edit /etc/init.d/hwclock.sh, line 64, comment out if statement for udev
 
edit /etc/init.d/hwclock.sh, line 64, comment out if statement for udev
 +
 
The RTC isn't handled by udev, so this check needs to be removed.
 
The RTC isn't handled by udev, so this check needs to be removed.
  
 
Add after unset TZ in hwclock.sh
 
Add after unset TZ in hwclock.sh
 +
 
modprobe i2c-bcm2708
 
modprobe i2c-bcm2708
 +
 
modprobe i2c-dev
 
modprobe i2c-dev
 +
 
modprobe rtc-ds1307
 
modprobe rtc-ds1307
 +
 
echo "ds3231 0x68" > /sys/class/i2c-adapter/i2c-1/new_device
 
echo "ds3231 0x68" > /sys/class/i2c-adapter/i2c-1/new_device
  
 +
#Static IP
  
#Static IP
 
 
Edit /etc/networking/interfaces
 
Edit /etc/networking/interfaces
 +
 
iface eth0 inet static
 
iface eth0 inet static
 +
 
address
 
address
 +
 
netmask
 
netmask
 +
 
gateway
 
gateway
  
 
#http://www.raspberrypi.org/forums/viewtopic.php?f=44&t=16218
 
#http://www.raspberrypi.org/forums/viewtopic.php?f=44&t=16218
 +
 
dpkg --purge fake-hwclock
 
dpkg --purge fake-hwclock
 +
 
cd /etc/rcS.d
 
cd /etc/rcS.d
 +
 
update-rc.d hwclock.sh enable
 
update-rc.d hwclock.sh enable
  
 
update-rc.d alsa-utils disable
 
update-rc.d alsa-utils disable
 +
 
update-rc.d x11-common disable
 
update-rc.d x11-common disable
  
 
## OLD
 
## OLD
 
  
 
apt-get install gpsd gpsd-clients python-gps
 
apt-get install gpsd gpsd-clients python-gps
  
 
edit /etc/defaults/gpsd
 
edit /etc/defaults/gpsd
 +
 
start_daemon = true
 
start_daemon = true
 +
 
devices="/dev/ttyAMA0"
 
devices="/dev/ttyAMA0"
 +
 
flags -b -n
 
flags -b -n
 +
 
stty -F /dev/ttyAMA0 115200
 
stty -F /dev/ttyAMA0 115200
 +
 
set base_baud before gpsd starts, scans faster.
 
set base_baud before gpsd starts, scans faster.
  
 
service gpsd enable
 
service gpsd enable
 +
 
reboot, confirm with cgps -s
 
reboot, confirm with cgps -s
  
Line 258: Line 312:
  
 
Instead of gpsd - symlink /dev/ttyAMA0 to /dev/gps0, use 127.127.20.0 mode 82 in ntp config, adds GPS_NEMA driver
 
Instead of gpsd - symlink /dev/ttyAMA0 to /dev/gps0, use 127.127.20.0 mode 82 in ntp config, adds GPS_NEMA driver
 
 
  
 
Uninstall existing ntp, compile/install latest ntp
 
Uninstall existing ntp, compile/install latest ntp

Revision as of 19:10, 17 February 2015

Intro

Here are my notes for getting a NavSpark GPS+GLONASS module working with a Raspberry Pi (Model B) for Timing/NTP purposes. They have since come out with a specific timing module that would probably be better suited for this. But alas, it's not what I have right now :)

What is this all about?

For a long time now, I've wanted to setup a Stratum 1 time source. It allows better matching of logs for debugging, and allows a more accurate time source for local network devices.

This page goes over the module, getting it wired up to a Pi, then getting the Pi working with the module. I've also added a i2c TCXO RTC (DS3231) for timekeeping while the unit does not have power. This was added as the Pi does not have an RTC built in, and it may take some time for the Pi to sync with peers and/or GPS to get time set.

This will give me a time source on my network that is extremely accurate for my needs.

I created a custom PCB for attaching the NavSpark module, DS3231, and associated parts to the Pi. This makes it nice and compact to put to the side to just run. Gives it a nice SAF. (Spouse Approval Factor)

What does this page assume?

  • You have a NavSpark (or similar) GPS Module that outputs RS232 TTL NEMA GPS code, as well as a 1PPS (Pulse per second) output.
  • You have a Raspberry Pi (B or B+ preferred, since it has the wired network interface already on it)
  • You know how to wire/breadboard stuff to the Pi
  • Fresh install of Raspbian (either directly or through NOOBS)

Other

  • Logic Level Converter - If your GPS module outputs 5v, as the Pi need 3v in. (Note: The NavSpark outputs 3v)
  • Solder
  • Soldering Iron
  • Materials in BOM below if using custom adapter board
  • Pi Case
  • Good, solid/stable output, 5v USB Power Supply (a good quality power supply can make a big difference, especially when used in timing situations)
  • Setting up a cross-compile environment
  • Comfortable compiling and installing software/kernel
  • Comfortable applying patches

My Testing Environment

DevSetup.jpg



The Code

Caveats

Resources Used to Complete this

Fin

Random Notes (The building blocks)

http://www.satsignal.eu/ntp/Raspberry-Pi-NTP.html

set user password

Advanced options

-set hostname - NTP1

-Change GPU memory to 16M (not used for NTP, more memory available to the system)

-Enable Kernel i2c

-Disable Kernel/Shell over Serial

finish, reboot.

login as pi

sudo -s

set root password

Update Pi

apt-get update

apt-get dist-upgrade

rpi-update

reboot

apt-get install pps-tools snmp libcap-dev i2c-tools

edit /boot/cmdline.txt, remove serial references (AMA0) (only needed if you don't select to turn off serial console above)

edit /etc/inittab, remove serial console (only needed if you don't select to turn off serial console above)

KERNEL TIME

Build Machine

crossdev -S -v -t arm-unknown-linux-gnueabi

Recommend to compile kernel on another system --http://elinux.org/Raspberry_Pi_Kernel_Compilation

export CCPREFIX=arm-unknown-linux-gnueabi-

may need gcc-config to set current version if updated

get kernel source: git clone --depth 1 git://github.com/raspberrypi/linux.git pikern

grab default /proc/config.gz from Pi, uncompress and copy to pikern/.config

make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig

modify kernelmake ARCH=arm CROSS_COMPILE=${CCPREFIX} menuconfig

(Required!)General -> Default Hostname (NTP1)

General -> Timers Subsystem -> Timer Tick Handling (Idle Dynticks System (Tickless Idle)) -> Periodic Timer Ticks (Constant rate, no dynticks) -- This is needed for NTP_PPSGeneral

-> Deselect "Old Idle Dynticks Config"

Boot Options -> Default Kernel Command -> Remove "console=ttyAMA0,115200"

Device Drivers -> PPS Support (*)-> (*) PPS Kernel Consumer Support (Will not show up if the timer subsystem options above are not set)

-> (*) PPS Client using GPIO

Device Drivers -> Real Time Clock -> (*) Dallas/Maxim DS1307/37/38/39/40, ST M41T00, EPSon RX-8025 (For RTC 3231 option below)

(Optional)Kernel Features -> memory split -> 2G/2G

Preemption Model -> No forced preemption (Server)

CPU Power Management -> CPU Frequency Scaling -> Default CPU Freq Governor -> Performance

OldKernel

Patch Kernel: http://ntpi.openchaos.org/pps_pi/ - https://raw.githubusercontent.com/lampeh/rpi-misc/master/linux-pps/linux-rpi-pps-gpio-bcm2708.diff

Note: Line numbers are different with newer kernel. Provide updated patch....

NewKernel

>=3.18.x?

Use DeviceTable - No patching

make ARCH=arm CROSS_COMPILE=${CCPREFIX} -j4

mkdir modtmp

make ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=./modtmp modules_install

tar -cjf modules.tar.bz2 modtmp/

scp modules.tar.bz2 root@ntp1:~/

scp arch/arm/boot/Image root@10.0.3.14:/boot/Image-31229

tar -xjf modules.tar.bz2

mv /lib/modules/<version> /lib/modules/<version>-orig

mv modtmp/lib/modules/<version> /lib/modules

cp -R modtmp/lib/firmware/* /lib/firmware

edit /boot/config.txt

add:

kernel=Image-3187

dtoverlay=pps-gpio,gpiopin=<x>

Custom PCB uses GPIO23

Grab latest NTP from: http://www.ntp.org/downloads.html, for compile computer

extract

./configure --prefix=/usr --enable-ATOM --enable-NMEA --enable-GPSD --enable-SHM --enable-WWV --with-ntpsnmpd --enable-ipv6 --enable-linuxcaps --enable-clockctl

make

now wait ~20minutes

rm /var/lib/ntp/ntp.conf.dhcp if DHCP, static recommended

    1. Cross-compile NTP:
    1. mkdir tmpinstall##make -j2##make install
    1. tar -cjf ntp.tar.bz2 tmpinstall
    1. copy files out cp bin/ntpd bin/ntp-wait bin/ntptime /usr/sbin
    1. https://support.ntp.org/bin/view/Dev/Cross-compilingNTP

create /etc/udev/rules/09-gps.rules

file contents:

  1. Adds symlink from serial interface to /dev/gps0 for ntpd

KERNEL=="ttyAMA0", SYMLINK+="gps0"

Edit /etc/ntp.conf

enable calibrate

enable kernel

  1. GPS Module

server 127.127.20.0 mode 82 minpoll 4 maxpoll 6

fudge 127.127.20.0 time2 +0.1939

  1. PPS of GPS Module

server 127.127.22.0 minpoll 4

fudge 127.127.22.0 flag3 1

Add other servers/peers, set one as prefer (needed to get PPS lock, see http://ntpi.openchaos.org/pps_pi/)

Tune the offset http://www.catb.org/gpsd/gpsd-time-service-howto.html

    1. RTC

modules/i2c already enabled in kernel from above

i2c-dev module

i2cdetect -y 1 - verify on 68

echo "ds3231 0x68" > /sys/class/i2c-adapter/i2c-1/new_device

set timezone -

rm /etc/localtime

ln -s /usr/share/zoneinfo/America/New_York /etc/localtime

edit /etc/default/hwclock

HWCLOCKACCESS=YES

HCTOSYS_DEVICE=rtc0

edit /etc/init.d/hwclock.sh, line 64, comment out if statement for udev

The RTC isn't handled by udev, so this check needs to be removed.

Add after unset TZ in hwclock.sh

modprobe i2c-bcm2708

modprobe i2c-dev

modprobe rtc-ds1307

echo "ds3231 0x68" > /sys/class/i2c-adapter/i2c-1/new_device

  1. Static IP

Edit /etc/networking/interfaces

iface eth0 inet static

address

netmask

gateway

  1. http://www.raspberrypi.org/forums/viewtopic.php?f=44&t=16218

dpkg --purge fake-hwclock

cd /etc/rcS.d

update-rc.d hwclock.sh enable

update-rc.d alsa-utils disable

update-rc.d x11-common disable

    1. OLD

apt-get install gpsd gpsd-clients python-gps

edit /etc/defaults/gpsd

start_daemon = true

devices="/dev/ttyAMA0"

flags -b -n

stty -F /dev/ttyAMA0 115200

set base_baud before gpsd starts, scans faster.

service gpsd enable

reboot, confirm with cgps -s

apt-get install libncurses5-dev bc

edit modules, include pps-gpio

Instead of gpsd - symlink /dev/ttyAMA0 to /dev/gps0, use 127.127.20.0 mode 82 in ntp config, adds GPS_NEMA driver

Uninstall existing ntp, compile/install latest ntp