===== 1. Choosing the Right Raspberry Pi =====
For a PTP (Precision Time Protocol) server, the Ethernet controller is the most important component.
* **Best Choice:** **Raspberry Pi 4 or Raspberry Pi 5**. These models have Ethernet controllers (BCM54213PE) that support **Hardware Timestamping**, which is essential for PTP to achieve sub-microsecond accuracy.
* **Avoid:** Pi 3 or Zero. These use USB-to-Ethernet bridges or lack hardware timestamping support, which forces you to use “Software PTP,” significantly degrading accuracy.
[[https://gemini.google.com/share/9fe616a57ef0|Gemini link]]
===== 2. Hardware Connections =====
You must use a **Logic Level Shifter** (or a simple resistor voltage divider) to drop the QLG2’s 5V signals down to 3.3V.
^**QLG2 Pin**^**Connection to Raspberry Pi**^**Note** ^
|**GND** |GND (e.g., Pin 6) |Common ground is required. |
|**TX** |RXD (GPIO 15 / Pin 10) |**Must be shifted to 3.3V.**|
|**1 PPS** |GPIO 18 (Pin 12) |**Must be shifted to 3.3V.**|
|**5V** |5V (Pin 2 or 4) |To power the QLG2. |
Set the QLG2 to 2.8V PPS voltage level: * UPPER: 5V logic level (DEFAULT) * LOWER: 2.8V logic level SER voltage level (GNSS module serial data output, which is the TXD pin on the 4-pin header at the right of the board): * UPPER: 5V logic level (DEFAULT) * LOWER: 2.8V logic level
----
===== 3. Software Configuration =====
==== Step A: Enable Serial and PPS ====
Edit your boot configuration file: ''%%sudo nano /boot/firmware/config.txt%%'' (or ''%%/boot/config.txt%%'' on older OS versions).
Add these lines:
# Enable the hardware UART
enable_uart=1
# Define the PPS pin
dtoverlay=pps-gpio,gpiopin=18
Then, disable the serial console (so the OS doesn’t try to use the GPS data as a login terminal):
''%%sudo raspi-config%%'' -> **Interface Options** -> **Serial Port** -> **No** (Login Shell) / **Yes** (Hardware enabled).
==== Step B: Install Time Tools ====
sudo apt update
sudo apt install pps-tools chrony linuxptp
* **PPS Check:** Run ''%%sudo ppstest /dev/pps0%%''. You should see “source fetch sampled” messages once per second.
* **GPS Check:** Run ''%%cat /dev/ttyS0%%'' (or ''%%ttyAMA0%%'') to see the NMEA sentences ($GPRMC, etc.).
==== Step C: Configure Chrony (The Grandmaster Clock) ====
PTP usually gets its time from the System Clock, which should be disciplined by GPS/PPS via ''%%chrony%%''.
Edit ''%%/etc/chrony/chrony.conf%%'':
refclock SHM 0 offset 0.1 delay 0.2 refid GPS
refclock PPS /dev/pps0 lock GPS refid PPS
==== Step D: Configure PTP (linuxptp) ====
PTP on Linux uses ''%%ptp4l%%'' to manage the hardware clock and ''%%phc2sys%%'' to sync the System Clock (disciplined by your GPS) to the Ethernet controller’s PTP Hardware Clock (PHC).
**Sync System Clock to PHC:**
* ''%%sudo phc2sys -s CLOCK_REALTIME -c eth0 -w &%%''
**Run PTP4L:**
* ''%%sudo ptp4l -i eth0 -m -S%%'' (The ''%%-S%%'' is for software-assisted hardware timestamping).
To turn your Raspberry Pi 4 into a **PTP Grandmaster**, you need a configuration that tells ''%%ptp4l%%'' two things: “I am the boss” and “Never listen to anyone else’s clock.”
Since the Pi 4 supports hardware timestamping, we will leverage that for maximum precision.
----
===== The ptp4l.conf File =====
Create or edit the file (usually located at ''%%/etc/linuxptp/ptp4l.conf%%''):
Ini, TOML
[global]
# --- Hardware Settings ---
# Use hardware timestamping (Pi 4 supports this on eth0)
time_stamping hardware
# Two-step is standard for the Pi's Ethernet controller
twoStepFlag 1
# --- Grandmaster Role ---
# Priority 1: Lower values win the Best Master Clock Algorithm (BMCA)
# Default is 128. Setting it to 127 or lower makes it likely to be Master.
priority1 127
priority2 128
domainNumber 0
# We are NOT a slave-only device
slaveOnly 0
# We ARE capable of being a Grandmaster
gmCapable 1
# --- Network Transport ---
network_transport UDPv4
delay_mechanism E2E
# How often to send Sync messages (2^0 = 1 second)
logAnnounceInterval 1
logSyncInterval 0
# --- Clock Discipline ---
# Use the Pi's Proportional-Integral servo
clockServo pi
# Point to the local PTP Hardware Clock (PHC)
# ptp4l will find this automatically based on the interface
----
===== How to Run It =====
To start the service using this configuration on your Ethernet interface:
Bash
sudo ptp4l -f /etc/linuxptp/ptp4l.conf -i eth0 -m
==== The “Secret Sauce”: phc2sys ====
Running ''%%ptp4l%%'' alone only manages the clock inside your Ethernet chip. It doesn’t know about the GPS time yet. You must use ''%%phc2sys%%'' to “push” the high-accuracy time from your System Clock (which Chrony is fixing with the QLG2) into the Ethernet Hardware Clock (PHC).
Run this in a separate terminal or as a service:
Bash
# -s: source (System Clock / CLOCK_REALTIME)
# -c: destination (Ethernet interface / eth0)
# -w: wait for ptp4l to be ready
sudo phc2sys -s CLOCK_REALTIME -c eth0 -w -m
----
===== Key Parameters Explained =====
* **''%%priority1%%''**: This is the “override” switch. By setting this lower than your other devices, the network will automatically elect the Pi as the Grandmaster.
* **''%%twoStepFlag%%''**: The Pi 4 hardware requires “two-step” mode, where the precise timestamp of a sync message is sent in a follow-up packet rather than inside the original packet.
* **''%%delay_mechanism E2E%%''**: “End-to-End” is the standard for most local networks. If you are using specialized PTP-aware switches, you might change this to ''%%P2P%%'' (Peer-to-Peer), but ''%%E2E%%'' is the safest default.
===== Verification =====
Once it’s running, look for these lines in the ''%%ptp4l%%'' output:
* ''%%selected local clock as best master%%'': This means the Pi has won the election.
* ''%%assuming the role of MASTER%%'': This confirms it is broadcasting time to the network.