Table of Contents

Enable PPS support in Raspian

DUNE has a task called Supervisors.ClockPPS that is used to dicipline the clock from both IMC::GpsFix messages and a PPS source. To get this to work, the kernel has to be compiled with two options not currently enabled by default:

Install dependencies

sudo apt install git bc bison flex libssl-dev

Download kernel

mkdir ppskernel
cd ppskernel
git clone https://github.com/raspberrypi/linux.git
cd linux
make mrproper
zcat /proc/config.gz > .config
make oldconfig

Configure kernel build options

Then comes the hard part, setting the options. Normally this is straight forward, but due to some options only showing when others are disabled, it may be a little tricky.


          <M> PPS support  
          [ ]    PPS debugging messages
          [*]    PPS kernel consumer support   
                 *** PPS clients support ***         
          < >    Kernel timer client (Testing client, use for debug)
          <M>    PPS line discipline
          <M>    PPS client using GPIO
                 *** PPS generators support *** 



CONFIG_PPS=y
CONFIG_NTP_PPS=y
#
# Timers subsystem
#
CONFIG_TICK_ONESHOT=y
CONFIG_HZ_PERIODIC=y
# CONFIG_NO_HZ_IDLE is not set
# CONFIG_NO_HZ_FULL is not set
# CONFIG_NO_HZ is not set
CONFIG_HIGH_RES_TIMERS=y
# CONFIG_PREEMPT_NONE is not set
CONFIG_PREEMPT_VOLUNTARY=y
# CONFIG_PREEMPT is not set

Compile the kernel

make -j4
make modules



sudo -i
cd ~pi/ppskernel/linux-rpi-[kernel version number].y
make modules_install
cp ./arch/arm/boot/zImage /boot/kernel_new.img


Add PPS source and load kernel module

Test and make permanent


apt-get install pps-tools
sudo ppstest /dev/pps0



trying PPS source "/dev/pps0"
found PPS source "/dev/pps0"
ok, found 1 source(s), now start fetching data...
source 0 - assert 1572772437.999997402, sequence: 6168 - clear  0.000000000, sequence: 0
source 0 - assert 1572772438.999997803, sequence: 6169 - clear  0.000000000, sequence: 0
source 0 - assert 1572772440.000000924, sequence: 6170 - clear  0.000000000, sequence: 0
source 0 - assert 1572772440.999998834, sequence: 6171 - clear  0.000000000, sequence: 0
source 0 - assert 1572772442.000001424, sequence: 6172 - clear  0.000000000, sequence: 0
source 0 - assert 1572772442.999999478, sequence: 6173 - clear  0.000000000, sequence: 0
source 0 - assert 1572772444.000000128, sequence: 6174 - clear  0.000000000, sequence: 0
source 0 - assert 1572772444.999999537, sequence: 6175 - clear  0.000000000, sequence: 0
source 0 - assert 1572772446.000000578, sequence: 6176 - clear  0.000000000, sequence: 0