Summary
On the Elecrow ThinkNode M6, the MeshCore companion app reports the device has no GPS / GPS not supported, even though the M6 has a GPS module and it works correctly on Meshtastic (confirmed real position fixes with 8 satellites on the same unit). This is a firmware gap, not a hardware fault — and it almost certainly affects the ThinkNode M1 and M5 as well (same GPS family).
Root cause
The M6's "L76K" GPS is an Airoha AG3335. It does not auto-stream NMEA on power-up — it stays completely silent until it receives a UART wake command ($PAIR382,1*2E), and it must be baud-probed (9600 / 115200 / 38400) and then configured for NMEA output.
Meshtastic handles all of this in src/gps/GPS.cpp (the GNSS_AIROHA path: wakeAirohaForActiveProbe() sends $PAIR382,1, followed by $PAIR021 identify and the NMEA-output config commands).
MeshCore's MicroNMEALocationProvider only powers the module (EN pin) and reads — it assumes the GPS free-runs NMEA. On an Airoha chip nothing ever arrives, so EnvironmentSensorManager::initBasicGPS() sees no data, sets gps_detected = false, and the GPS feature is hidden from the app/CLI.
Evidence (on-hardware)
- With the GPS powered and
PIN_GPS_EN / PIN_PWR_EN / PIN_GPS_STANDBY / PIN_GPS_RESET driven in every combination, there is zero serial activity on any GPIO at any baud — confirmed by both UART reads (15 s) and a baud-agnostic GPIO edge-count scan across all pins.
- Sending the Airoha wake (
$PAIR382,1) at 9600/115200/38400 from a standalone sketch did not elicit a response either, so the full Meshtastic probe/config sequence (not just the wake) appears to be required.
- Meshtastic, which performs that sequence, gets fixes on the same board and pins (GPS EN = pin 6, RX = pin 3 default).
Implementation note / caveat
A naive port that switches the GPS UART baud (Serial1.end()/begin()) inside the companion BLE firmware hangs the nRF52 — re-initializing the UART while the SoftDevice is active locks up. So the Airoha bring-up needs SoftDevice-safe baud handling, not a quick patch.
Affected boards
ThinkNode M6 (confirmed), and very likely M1 / M5 (all L76K / AG3335).
Suggested fix
Add Airoha / AG3335 support to MeshCore's GPS bring-up: send the wake ($PAIR382,1), probe baud, and issue the NMEA-output config commands — portable from Meshtastic's GPS.cpp, with care around UART re-init under the SoftDevice. Happy to test on an M6.
Summary
On the Elecrow ThinkNode M6, the MeshCore companion app reports the device has no GPS / GPS not supported, even though the M6 has a GPS module and it works correctly on Meshtastic (confirmed real position fixes with 8 satellites on the same unit). This is a firmware gap, not a hardware fault — and it almost certainly affects the ThinkNode M1 and M5 as well (same GPS family).
Root cause
The M6's "L76K" GPS is an Airoha AG3335. It does not auto-stream NMEA on power-up — it stays completely silent until it receives a UART wake command (
$PAIR382,1*2E), and it must be baud-probed (9600 / 115200 / 38400) and then configured for NMEA output.Meshtastic handles all of this in
src/gps/GPS.cpp(theGNSS_AIROHApath:wakeAirohaForActiveProbe()sends$PAIR382,1, followed by$PAIR021identify and the NMEA-output config commands).MeshCore's
MicroNMEALocationProvideronly powers the module (EN pin) and reads — it assumes the GPS free-runs NMEA. On an Airoha chip nothing ever arrives, soEnvironmentSensorManager::initBasicGPS()sees no data, setsgps_detected = false, and the GPS feature is hidden from the app/CLI.Evidence (on-hardware)
PIN_GPS_EN/PIN_PWR_EN/PIN_GPS_STANDBY/PIN_GPS_RESETdriven in every combination, there is zero serial activity on any GPIO at any baud — confirmed by both UART reads (15 s) and a baud-agnostic GPIO edge-count scan across all pins.$PAIR382,1) at 9600/115200/38400 from a standalone sketch did not elicit a response either, so the full Meshtastic probe/config sequence (not just the wake) appears to be required.Implementation note / caveat
A naive port that switches the GPS UART baud (
Serial1.end()/begin()) inside the companion BLE firmware hangs the nRF52 — re-initializing the UART while the SoftDevice is active locks up. So the Airoha bring-up needs SoftDevice-safe baud handling, not a quick patch.Affected boards
ThinkNode M6 (confirmed), and very likely M1 / M5 (all L76K / AG3335).
Suggested fix
Add Airoha / AG3335 support to MeshCore's GPS bring-up: send the wake (
$PAIR382,1), probe baud, and issue the NMEA-output config commands — portable from Meshtastic'sGPS.cpp, with care around UART re-init under the SoftDevice. Happy to test on an M6.