TimeNIC - I226 PCIe NIC with PPS In/Out and TCXO

TimeNIC - I226 PCIe NIC with PPS In/Out and TCXO

$200.00
Skip to product information
TimeNIC - I226 PCIe NIC with PPS In/Out and TCXO

TimeNIC - I226 PCIe NIC with PPS In/Out and TCXO

$200.00

PCIe Card with I226 NIC, SMA, and TCXO

The TimeNIC PCIe card is designed to bring precision timing and advanced network functionality to any platform with a PCIe slot. A small form factor PCIe NIC, the TimeNIC integrates a high-performance I226 Ethernet NIC with precise timing inputs and outputs via SMA connectors. It's a powerful tool for building small form-factor PTP (Precision Time Protocol) clients or even grandmasters, ideal for time-sensitive networking applications.

The default BOM includes a TCXO as the oscillator behind the I226, allowing high stability timing. The specification of the TCXO used is here:
ECS-TXO53-S3-33-250-BN-TR, https://ecsxtal.com/store/pdf/ECS-TXO53-S3.pdf

Included in box

  • TimeNIC
  • PCIe full height bracket installed with 2 M2.5x6 screws and 2 M2.5 nuts

Key features

SMA for PPS input and output

Only I226 NIC on the market with easy front panel SMAs for SDP0 and SDP1, allowing PPS input and PPS output. Allows validation of PTP and PTM performance, or injecting 1PPS from a valid source like GPS or atomic clock and then distribute that time over PTP.

TCXO

Only I226 NIC, and (probably?) cheapest PTP NIC, on the market with a TCXO backing the chipset. This high stability TCXO allows for low jitter timing distribution and stable frequency across temperature.

TimeHATV6 reference

Very similar design to TimeHATV6, intended for Raspberry Pi 5 use case.

Most of the description for TimeHATV6 also applies here, since it's at its core a I226 NIC. The main differences come in installing the kernel patch to fix PPS input.

PTM (Precision Time Measurement) over PCIe

The biggest feature this card can do that TimeHATV6 can not is PTM. PTM is basically PTP over PCIe, allowing you to transfer nanosecond time from the NIC to the CPU and userland code. Newer Consumer Intel CPUs (Gen 11 and newer) support PTM, as well as others.

As part of OCP TAP, we maintain a list of devices, both CPU and endpoints, that support PTM. You can find this list here: https://www.opencompute.org/wiki/PTM_Readiness

Kevin Stanton, formerly of Intel, was the architect behind PTM, and gave talks about how PTM works and what it does through OCP TAP Tech Talks. Kevin's talk about PTM is here: YouTube, slides are here: Google Slides

You can find a list of all OCP talks, including by Kevin about PTM, here: https://www.opencompute.org/wiki/Time_Appliances_Project

Usage steps, tested on Ubuntu 24.04 fresh install

Pre-setup steps

A. Install linuxptp and utilities

sudo apt install linuxptp
sudo apt install gcc

B. Download testptp

cd ~ ; mkdir testptp; cd testptp
wget https://raw.githubusercontent.com/torvalds/linux/refs/heads/master/tools/testing/selftests/ptp/testptp.c
wget https://raw.githubusercontent.com/torvalds/linux/refs/heads/master/include/uapi/linux/ptp_clock.h
sudo cp ptp_clock.h /usr/include/linux/ptp_clock.h

C. Compile testptp

gcc -Wall -lrt testptp.c -o testptp

D. Install testptp

sudo cp testptp /usr/bin/

E. Figure out which ptp interface maps to the NIC, use ethtool -T

On my system, the NIC is enp1s0, the PTP Hardware clock is the number to use with /dev/ptp0

homemachine@homemachine:~/testptp$ ethtool -T enp1s0
Time stamping parameters for enp1s0:
Capabilities:
        hardware-transmit
        software-transmit
        hardware-receive
        software-receive
        software-system-clock
        hardware-raw-clock
PTP Hardware Clock: 0
Hardware Transmit Timestamp Modes:
        off
        on
Hardware Receive Filter Modes:
        none
        all

F. Verify testptp works

sudo testptp -d /dev/ptp0 -l

Should see:

homemachine@homemachine:~/testptp$ sudo testptp -d /dev/ptp0 -l
name SDP0 index 0 func 0 chan 0
name SDP1 index 1 func 0 chan 0
name SDP2 index 2 func 0 chan 0
name SDP3 index 3 func 0 chan 0

Configure 1PPS Output

1. Setup SDP0 (SMA1, furthest from PCIe fingers, above RJ45) as periodic output

sudo testptp -d /dev/ptp0 -L0,2
sudo testptp -d /dev/ptp0 -p 1000000000

Read 1PPS SMA Input

A. Setup SDP1 (SMA2, furthest from HAT header, below RJ45) as timestamp input

sudo testptp -d /dev/ptp0 -L1,1

B. Read timestamps

Use -1 to read forever and ctrl+C to stop, using 5 here as demo. Note: I226 driver passes both edges to Linux, so both rising and falling edges will be listed. A fix for this is listed below, requires patching and building kernel.

sudo testptp -d /dev/ptp0 -e 5

Discipline to 1PPS SMA Input

Note: To have this work properly, you'll need to install the PPS in kernel patch fix below

A. Verify PPS input on SMA2 using the testptp steps above

B. Set NIC PHC based on system time to get Time-Of-Day

sudo phc_ctl enp1s0 "set;" adj 37

C. Use ts2phc to discipline NIC from 1PPS

sudo ts2phc -c /dev/ptp0 -s generic --ts2phc.pin_index 1 -m -l 7

Fix 1PPS input to only use rising edge (Advanced) (Work in Progress instructions Method 0)

Instructions detailed on Github (easier to format and read on Github): https://github.com/Time-Appliances-Project/TimeNIC

You may also like