Linux kernel module PPS Client Driver using OMAP Timer hardware
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

Beaglebone Black Hardware Counter Capture Driver

Building the kernel

  • put kernel source from in the directory linux
  • The official beaglebone 3.8.x kernel (branch "3.8") needs commit 8fc7fcb593ac3c5730c8391c2d7db5b87e2d0bf2
  • You can backport it with the command: git cherry-pick 8fc7fcb593ac3c5730
  • To build on an Intel Linux machine, you'll need to install a cross compiler
    • (Fedora) sudo yum install gcc-arm-linux-gnu
  • uncompress /proc/config.gz from beaglebone and put it in linux/.config
  • modify .config: CONFIG_CROSS_COMPILE="arm-linux-gnu-"

make ARCH=arm oldconfig make ARCH=arm zImage make ARCH=arm modules

Building the module

The makefile assumes the kernel sources are in ../linux. If this is incorrect, change the KDIR variable

to build the module, type: make

Installing the Device Tree Overlay

on the BBB:

  • install zImage and modules
  • make DD-GPS-00A0.dtbo
  • cp DD-GPS-00A0.dtbo /lib/firmware/
  • add DD-GPS to your list of capes in /etc/default/capemgr

Using an external oscillator (TCLKIN)

To use an external clock source on pin P9.41 (TCLKIN). It accepts up to a 24MHz clock.

  • apply the patch kernel-tclkin.patch to your kernel
  • If you're not using a 24MHz clock, update the DEFINE_CLK_FIXED_RATE tclkin_ck definition in arch/arm/mach-omap2/cclock33xx_data.c
  • rebuild your kernel
  • Use the device tree overlay file DD-GPS-TCLKIN-00A0.dtbo, which has the pinctl changes needed

To use this clock as your system time source:

echo timer4 > /sys/devices/system/clocksource/clocksource0/current_clocksource

If you're not using the timer4 hardware, use the other timer's name in place.

To switch back to the default time source:

echo gp_timer > /sys/devices/system/clocksource/clocksource0/current_clocksource

Monitoring operation

The sysfs files in /sys/devices/ocp.3/pps_gmtimer.* contain the counter's current state:

  • capture - the counter's raw value at PPS capture
  • count_at_interrupt - the counter's value at interrupt time
  • interrupt_delta - the value used for the interrupt latency offset
  • pps_ts - the final timestamp value sent to the pps system
  • timer_counter - the raw counter value
  • stats - the number of captures and timer overflows
  • timer_name - the name of time timer hardware
  • ctrlstatus - the state of the TCLR register (see the AM335x Technical Reference Manual for bit meanings)

The program "watch-pps" will watch these files and produce an output that looks like:

1423775690.000 24000010 169 0.000007041 0 3988681035 -0.000001434

The columns are: pps timestamp, capture difference, cycles between capture and interrupt, interrupt_delta, raw capture value, offset