#11914·firmware

t-echo-lite: GPS_TX_PIN / GPS_RX_PIN are swapped, GPS never detected

Author: iknoxCreated Sep 19, 2026Updated Sep 19, 2026
Labelsfirst-contribution

Board

LILYGO T-Echo Lite Core (nRF52840) + H770 L76K GPS module on the 1x7 header, firmware 2.7.26 (t-echo-lite, HW model 109).

Symptom

Boot log shows the GPS probe cycling every family and giving up with zero bytes received, on two separate (known-good) L76K modules:

[GPS] Trying $PCAS06,0*1B (L76K)...
[GPS] No GNSS Module (baudrate 9600)
[GPS] Give up on GPS probe and set to 9600

(Note: only 9600 is tried because the variant defines GPS_BAUDRATE, which sets GPS_BAUDRATE_FIXED. That's fine — the L76K default is 9600 — just noting the probe can't exonerate other bauds here.)

Root cause

variants/nrf52840/t-echo-lite/variant.h has the UART pins backwards:

cpp
#define GPS_TX_PIN (32 + 10) // L76K module RX PIN
#define GPS_RX_PIN (0 + 29)  // L76K module TX PIN

GPS::createGps() (nRF52 path) calls _serial_gps->setPins(rx_gpio, tx_gpio), and Adafruit's signature is setPins(pin_rx, pin_tx) (cores/nRF5/Uart.h). So Meshtastic listens on P0.29 and talks on P1.10.

But LILYGO's factory GPS.ino (verified working hardware) does Serial2.setPins(GPS_UART_RX, GPS_UART_TX) with GPS_UART_RX = P1.10, GPS_UART_TX = P0.29 (libraries/private_library/t_echo_lite_config.h) — i.e. MCU RX on P1.10, MCU TX on P0.29. Exactly opposite. The MCU was listening on the module's RX line and talking into its TX output, so total silence in both directions.

The variant author's comments even show the mix-up: the P1.10/P0.29 values were read off the header table's RX/TX labels from the module's perspective instead of the MCU's. (Compare the working t-echo variant, where GPS_TX_PIN/GPS_RX_PIN follow the MCU-TX/MCU-RX convention.)

Suggested fix

Swap the two defines (which also fixes PIN_SERIAL1_RX/PIN_SERIAL1_TX, derived from them):

cpp
#define GPS_TX_PIN (0 + 29)  // MCU TX -> L76K RX
#define GPS_RX_PIN (32 + 10) // MCU RX <- L76K TX

Verification (runtime workaround, no rebuild)

Setting the config overrides instead — position.rx_gpio = 42 (P1.10), position.tx_gpio = 29 (P0.29) — the module answers the very first probe after reboot:

Use GPIO42 for GPS RX
Use GPIO29 for GPS TX
[GPS] L76K detected
NMEA GPS time set ... Time source acquired (None -> GPS)

Thanks for the t-echo-lite port — happy to test a fixed build if useful.