For a PTP (Precision Time Protocol) server, the Ethernet controller is the most important component.
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
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).
sudo apt update sudo apt install pps-tools chrony linuxptp
sudo ppstest /dev/pps0. You should see “source fetch sampled” messages once per second.cat /dev/ttyS0 (or ttyAMA0) to see the NMEA sentences ($GPRMC, etc.).
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
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.
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
To start the service using this configuration on your Ethernet interface:
Bash
sudo ptp4l -f /etc/linuxptp/ptp4l.conf -i eth0 -m
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
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.
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.