Skip to content

PSS_Chrony_setup

aniket_thor edited this page Jul 16, 2025 · 1 revision

🛰️ GPS + PPS + Chrony Setup on Jetson Orin Nano

This guide walks you through setting up a PPS-enabled GPS for time synchronization using chrony, gpsd, and Jetson GPIOs.


🔌 Hardware Setup

Connections:

GPS Pin Jetson Pin Description
TP2 PIN 7 PPS
GND PIN 6 Ground
TX2 PIN 10 UART RXD

🧰 Useful References


✅ PPS Initial Setup & Testing

Check GPIO Header Info

  • Jetson Orin NX PIN 7 = GPIO09 = GPIO number 144 = gpio492
  • PAC.06 → Soc: TEGRA234_MAIN_GPIO_PORT_AC = 20
  • PPS GPIO calculation: 20 * 8 + 6 = 166

Install and Test GPIO

sudo apt-get install gpiod
sudo gpiomon gpiochip0 144

Should output rising edge timestamps when PPS signal is received.


📄 Device Tree Overlay for PPS

Create and Edit Device Tree

sudo apt install nano
sudo nano pps-pin7.dts

Paste:

/dts-v1/;
/plugin/;

/ {
    compatible = "nvidia,p3768-0000+p3767-0003";
    overlay-name = "PPS Overlay";
    jetson-header-name = "Jetson 40pin Header";

    fragment@0 {
        target-path = "/";
        __overlay__ {
            pps: pps-gpio {
                status = "okay";
                compatible = "pps-gpio";
                gpios = <&gpio 166 0>;
                assert-rising-edge;
            };
        };
    };
};

Compile & Apply Overlay

dtc -O dtb -o pps-pin7.dtbo pps-pin7.dts
sudo cp pps-pin7.dtbo /boot
sudo /opt/nvidia/jetson-io/jetson-io.py
  • Select: Configure Jetson 40pin HeaderCompatible hardwarePPS Overlay
  • Save and reboot

Test PPS GPIO Binding

sudo gpiomon gpiochip0 144   # Should say 'busy'
sudo apt-get install pps-tools
sudo dmesg | grep pps
ls /dev/pps*                 # Should show /dev/pps1 and /dev/pps0
sudo ppstest /dev/pps1       # Should output pulse data (Should update at 1 Hz)

⏱️ Chrony + GPSD Configuration

1. Install Dependencies

sudo apt install minicom gpsd gpsd-clients chrony
sudo apt install pps-tools

2. Verify UART Output

sudo stty -F /dev/ttyTHS1 115200
sudo cat /dev/ttyTHS1

Quick test with:

sudo minicom -b 115200 -D /dev/ttyTHS1

3. Set Up Udev Rules

echo 'KERNEL=="pps1", GROUP="_chrony", MODE="0660"' | sudo tee /etc/udev/rules.d/99-pps.rules
sudo udevadm control --reload-rules
sudo udevadm trigger
sudo reboot

⚙️ Configure gpsd

Edit:

sudo nano /etc/default/gpsd

Paste:

GPSD_OPTIONS="-n"
DEVICES="/dev/ttyTHS1 /dev/pps1"
USBAUTO="false"

Kill Conflicting Instances (e.g., neuroam)

ps aux | grep gpsd
sudo systemctl stop gpsd.socket gpsd
sudo killall gpsd
sudo rm -f /var/run/gpsd.sock

Restart gpsd

sudo gpsd -n -b -D 4 /dev/ttyTHS1 /dev/pps1 -F /var/run/gpsd.sock

Test:

sudo stty -F /dev/ttyTHS1 115200
cgps                         # Should show live GPS data
sudo ppstest /dev/pps1       # Should tick every second

🕰️ Configure Chrony for PPS

sudo nano /etc/chrony/chrony.conf

Paste at the top:

refclock SHM 0 delay 0.5 refid NMEA
refclock PPS /dev/pps1 refid PPS lock NMEA

(Optional) Disable Default Pools

Comment out all default pool lines, or add noselect to refclock lines for testing:

# pool 2.debian.pool.ntp.org iburst

Then:

sudo systemctl restart chrony
chronyc sources -v

ChronyC sources out


🛠️ Troubleshooting

Stop Old Services

sudo killall gpsd
sudo systemctl stop gpsd.socket gpsd
sudo rm /var/run/gpsd.sock

Start with debug info:

sudo gpsd -n -N -D 4 /dev/ttyTHS1 /dev/pps1 -F /var/run/gpsd.sock

Set System Time (if needed)

sudo date -s "2025-06-19 17:35:00"