From 9f7029abaa40f8f825bc6e21f0c3c1a82b18129f Mon Sep 17 00:00:00 2001 From: liquidraver <504870+liquidraver@users.noreply.github.com> Date: Tue, 2 Jun 2026 21:22:55 +0200 Subject: [PATCH] GAT562 cleanup + gps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cleanups 1–3 (cosmetic): Removed the dead uart1_default/uart1_sleep pinctrl groups + stale "GPS on UART1" comments → gat562_30s-pinctrl.dtsi Removed the QSPI pinctrl groups (board has no QSPI; pins collide with the joystick) and replaced them with a comment explaining why Untangled the GPS UART0-vs-async rationale in the DTS and the &uart1 comment GPS driver switch (functional, you approved the full switch) → gat562_30s.dts, board.conf: gnss-nmea-generic → luatos,air530z with on-off-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH> (matches the sibling rak_wismesh_tag, same AT6558R chip) Deleted the always-on gps_power_en gpio-hog (the driver owns P1.02 now → GPS can be powered down) Removed the CONFIG_UART_ASYNC_API=y override Updated all related comments --- .../boards/nrf52840/gat562_30s/board.conf | 17 ++++--- .../gat562_30s/gat562_30s-pinctrl.dtsi | 51 +++---------------- .../boards/nrf52840/gat562_30s/gat562_30s.dts | 45 ++++++++-------- 3 files changed, 41 insertions(+), 72 deletions(-) diff --git a/zephcore/boards/nrf52840/gat562_30s/board.conf b/zephcore/boards/nrf52840/gat562_30s/board.conf index 1dc2792..56b29a9 100644 --- a/zephcore/boards/nrf52840/gat562_30s/board.conf +++ b/zephcore/boards/nrf52840/gat562_30s/board.conf @@ -22,13 +22,14 @@ CONFIG_ZEPHCORE_SD_FWID=0x00B6 # Compile in the UI display stack; the OLED panel is optional at runtime. CONFIG_ZEPHCORE_UI_DISPLAY=y -# GPS: AT6558R UART NMEA receiver on UART0 @ 9600 baud (P0.15 RX / P0.16 TX), -# powered by the WB_IO2/P1.02 gpio-hog (see gat562_30s.dts). The -# gnss-nmea-generic driver is auto-selected from the DTS node; CONFIG_GNSS and +# GPS: AT6558R UART NMEA receiver on UART0 @ 9600 baud (P0.15 RX / P0.16 TX). +# The luatos,air530z driver is auto-selected from the DTS node; it sends the +# AT6558R the CASIC $PCAS03 sentence-select init (and $PMTK869 EASY fast-TTFF) +# and owns GPS power via on-off-gpios on WB_IO2/P1.02 (see gat562_30s.dts), so +# ZephyrGPSManager can power the receiver down. CONFIG_GNSS and # CONFIG_MODEM_MODULES come from boards/common/zephcore_common.conf. # -# Use the async (DMA) UART receive path for the GPS: nRF UARTE's interrupt- -# driven RX did not feed modem_backend_uart reliably here, so the modem chat -# never saw any NMEA. CONFIG_UART_ASYNC_API switches the backend to its -# DMA-based receiver, which delivers the stream correctly. -CONFIG_UART_ASYNC_API=y +# No CONFIG_UART_ASYNC_API override: the air530z driver powers the module up +# only after the UART backend is ready, so the interrupt-driven RX feeds +# modem_backend_uart correctly (unlike the previous always-on gpio-hog, which +# powered the GPS before the backend existed and lost the opening NMEA burst). diff --git a/zephcore/boards/nrf52840/gat562_30s/gat562_30s-pinctrl.dtsi b/zephcore/boards/nrf52840/gat562_30s/gat562_30s-pinctrl.dtsi index 06ad2c7..6c8f3e0 100644 --- a/zephcore/boards/nrf52840/gat562_30s/gat562_30s-pinctrl.dtsi +++ b/zephcore/boards/nrf52840/gat562_30s/gat562_30s-pinctrl.dtsi @@ -7,10 +7,7 @@ */ &pinctrl { - /* GPS on UART0: MCU TX P0.16 -> GPS RX, MCU RX P0.15 <- GPS TX. - * The GPS is wired to P0.15/P0.16; it runs on UARTE0 because UARTE1's - * interrupt-driven RX did not feed the modem backend on this SoC (the - * other nRF52 GPS boards in this tree also use uart0 + gnss-nmea-generic). */ + /* GPS (AT6558R) on UART0: MCU TX P0.16 -> GPS RX, MCU RX P0.15 <- GPS TX. */ uart0_default: uart0_default { group1 { psels = , @@ -26,22 +23,6 @@ }; }; - /* GPS on UART1: MCU TX P0.16 -> GPS RX, MCU RX P0.15 <- GPS TX */ - uart1_default: uart1_default { - group1 { - psels = , - ; - }; - }; - - uart1_sleep: uart1_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; - /* I2C0: SSD1306 OLED + sensors (SDA P0.13 / SCL P0.14) */ i2c0_default: i2c0_default { group1 { @@ -106,27 +87,11 @@ }; }; - /* QSPI pins (kept for parity; &qspi is disabled on this board) */ - qspi_default: qspi_default { - group1 { - psels = , - , - , - , - , - ; - }; - }; - - qspi_sleep: qspi_sleep { - group1 { - psels = , - , - , - , - , - ; - low-power-enable; - }; - }; + /* + * No QSPI pinctrl: the GAT562 core module has no external QSPI flash + * (&qspi is disabled in the DTS), and the upstream RAK4631 QSPI pins + * P0.26 / P0.28 / P0.30 are reused here as joystick inputs. Defining a + * qspi group "for parity" would silently collide with the joystick if + * QSPI were ever re-enabled, so it is intentionally omitted. + */ }; diff --git a/zephcore/boards/nrf52840/gat562_30s/gat562_30s.dts b/zephcore/boards/nrf52840/gat562_30s/gat562_30s.dts index 15683e4..3930f07 100644 --- a/zephcore/boards/nrf52840/gat562_30s/gat562_30s.dts +++ b/zephcore/boards/nrf52840/gat562_30s/gat562_30s.dts @@ -13,7 +13,8 @@ * - DIO3 TCXO at 1.8 V (matches the official MeshCore GAT562 variant) * - Battery multiplier 6232 (vs 6161): 3 * 1.75 * 1.187 * 1000 * - Buzzer on P1.01 (PWM0) - * - GPS: UART NMEA on UART0 @ 9600 (MCU RX P0.15 / TX P0.16), always-on + * - GPS: AT6558R on UART0 @ 9600 (MCU RX P0.15 / TX P0.16), luatos,air530z + * driver, power via on-off-gpios on WB_IO2/P1.02 * - 6 buttons on GPIO SENSE (sense-edge-mask) so DIO1 keeps a GPIOTE chan * - LEDs active-high: green P1.03 (LoRa TX), blue P1.04 * - User button P0.09 (NFC1) @@ -196,16 +197,10 @@ line-name = "sx1262-power-en"; }; - /* GPS power-enable on WB_IO2 / P1.02: held HIGH so the AT6558R GNSS is - * powered and transmitting NMEA at boot. Without this the receiver is - * silent (no UART data at all). Hogged (not driven by the GPS manager) - * because the module is simply always-on while the board is powered. */ - gps_power_en { - gpio-hog; - gpios = <2 GPIO_ACTIVE_HIGH>; - output-high; - line-name = "gps-power-en"; - }; + /* GPS power-enable on WB_IO2 / P1.02 is NOT hogged here: the AT6558R is + * driven by the luatos,air530z driver, which owns this line via + * on-off-gpios (see &uart0) so ZephyrGPSManager can power the receiver + * down for low-power operation. */ }; &adc { @@ -224,27 +219,35 @@ }; /* - * GPS: UART NMEA receiver on UART0 @ 9600 baud (MCU RX P0.15 <- GPS TX, - * MCU TX P0.16 -> GPS RX). Multi-constellation (GPS + GLONASS), always - * powered — no enable pin. Matches the official MeshCore gat562_30s_mesh_kit - * variant (MicroNMEALocationProvider on Serial1, 9600 baud). Runs on UARTE0 - * (like the other nRF52 GPS boards here): UARTE1's interrupt-driven RX did - * not deliver to the modem backend on this SoC. Zephyr's gnss-nmea-generic - * driver parses the stream and publishes via the GNSS subsystem. + * GPS: AT6558R UART NMEA receiver on UART0 @ 9600 baud (MCU RX P0.15 <- GPS + * TX, MCU TX P0.16 -> GPS RX). Multi-constellation (GPS + GLONASS). Matches + * the official MeshCore gat562_30s_mesh_kit variant (MicroNMEALocationProvider + * on Serial1, 9600 baud). + * + * Driven by the luatos,air530z driver — the AT6558R is a CASIC-protocol part, + * so the driver's $PCAS03 init trims the NMEA stream to GGA+RMC (+GSV when + * CONFIG_GNSS_SATELLITES) and $PMTK869 enables EASY fast-TTFF. Same driver and + * chip as the rak_wismesh_tag board. GPS power is managed by the driver via + * on-off-gpios (WB_IO2 / P1.02, active-high), so ZephyrGPSManager can power + * the receiver down — no always-on gpio-hog. Because the driver brings the + * module up only after the UART backend is ready, the plain interrupt-driven + * RX feeds the modem backend correctly and no CONFIG_UART_ASYNC_API is needed. */ &uart0 { + compatible = "nordic,nrf-uarte"; status = "okay"; current-speed = <9600>; pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; pinctrl-names = "default", "sleep"; - gnss: gnss-nmea-generic { - compatible = "gnss-nmea-generic"; + gnss: gnss { + compatible = "luatos,air530z"; + on-off-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>; /* WB_IO2 / P1.02 GPS power */ }; }; -/* UART1 unused — the GPS moved to UART0 (see above). */ +/* UART1 unused — the GPS is on UART0 (see above). */ &uart1 { status = "disabled"; };