Hardware
The board
Section titled “The board”BerryGPS-IMU v4 (Ozzmaker) on a Raspberry Pi 4. The GPS is a u-blox CAM-M8C — 72-channel M8 engine, concurrent GPS/GLONASS/Galileo/BeiDou, with an onboard antenna and a uFL connector for an external one.
Reported by the module itself:
$ ubxtool -p MON-VER swVersion ROM CORE 3.01 (107888) hwVersion 00080000 # M8 generation extension FWVER=SPG 3.01 extension PROTVER=18.00 extension GPS;GLO;GAL;BDSThe PPS pin is not on the header
Section titled “The PPS pin is not on the header”This costs people hours, so: the BerryGPS-IMU’s PPS is not wired to any GPIO.
The board’s normal header connection carries power, the GPS UART (GPIO14/15), and
the IMU’s I²C — but the timepulse comes out of a separate T_PULSE pad, and
you have to run a wire from it yourself.
The schematic confirms it: the CAM-M8C’s TIMEPULSE pin goes through a 2N2222
buffer that drives both the on-board PPS LED and the T_PULSE pad. Nothing
routes it to the Pi.
We soldered a jumper from T_PULSE → GPIO18 (physical pin 12), then:
dtoverlay=pps-gpio,gpiopin=18Verify with a hardware-timestamped check, not a polling loop — a 100 ms pulse is easy to miss by polling:
$ sudo ppstest /dev/pps0source 0 - assert 1783875773.176667184, sequence: 28source 0 - assert 1783875774.176667944, sequence: 29 # 1.000000760 s laterThe UART needs freeing first
Section titled “The UART needs freeing first”The Pi 4’s good UART (PL011) is wired to Bluetooth by default; GPIO14/15 get the flaky mini-UART whose baud drifts with the CPU clock. And a serial console may be sitting on the port. Both must go:
enable_uart=1dtoverlay=disable-bt# /boot/firmware/cmdline.txt — remove this:console=serial0,115200