mirror of
https://github.com/liquidraver/ZephCore.git
synced 2026-09-01 21:08:19 +00:00
Merge pull request #24 from rlwilliamson-dev/board/gat562-30s
boards: add GAT562 30S Mesh Kit (nRF52840, RAK4631 core)
This commit is contained in:
@@ -29,6 +29,7 @@ Other benefits:
|
||||
| **ThinkNode M6** | SX1262 | GPS (L76K), QSPI flash, RGB LEDs |
|
||||
| **LilyGo T-Echo** | SX1262 (TCXO 1.8V) | GPS (L76K), 1.54" e-paper (SSD1681), BME280, QSPI flash, touch-button backlight |
|
||||
| **Ikoka Nano 30dBm** | SX1262 (E22-900M30S, 30 dBm PA) | RGB LEDs |
|
||||
| **GAT562 30S Mesh Kit** | SX1262 (30 dBm / 1 W PA) | RAK4631 core module. OLED (SSD1306), 5-way joystick, buzzer, GPS, BME280 pad, 2×18650 + solar |
|
||||
| **SenseCAP Solar** | SX1262 | GPS (L76K), QSPI flash, battery monitor |
|
||||
| **XIAO nRF52840 + Wio-SX1262** | SX1262 | Bare XIAO + Wio-SX1262 expansion |
|
||||
| **ProMicro SX1262** | SX1262 (E22-900M30S) | GPS, battery ADC, button, LED |
|
||||
|
||||
@@ -20,6 +20,7 @@ nRF_boards=(
|
||||
lilygo_techo
|
||||
promicro_sx1262
|
||||
heltec_t114
|
||||
gat562_30s
|
||||
)
|
||||
|
||||
ESP32_boards=(
|
||||
|
||||
@@ -255,7 +255,7 @@ set(ZEPHCORE_COMMON_CONF "${CMAKE_CURRENT_SOURCE_DIR}/boards/common/zephcore_com
|
||||
# Detect platform from board name and add platform-specific common config
|
||||
# For boards with qualifiers like "wio_tracker_l1/nrf52840", check both the full BOARD
|
||||
# string and the BOARD_QUALIFIERS which contains just the qualifier (e.g., "nrf52840")
|
||||
if(BOARD MATCHES ".*nrf52.*" OR BOARD MATCHES "rak4631" OR BOARD MATCHES "rak_wismesh_tag" OR BOARD MATCHES "rak3401_1watt" OR BOARD MATCHES "wio_tracker" OR BOARD MATCHES "ikoka_nano" OR BOARD MATCHES "t1000_e" OR BOARD MATCHES "thinknode_m1" OR BOARD MATCHES "thinknode_m3" OR BOARD MATCHES "thinknode_m6" OR BOARD MATCHES "promicro_lr2021" OR BOARD MATCHES "promicro_sx1262" OR BOARD MATCHES "sensecap_solar" OR BOARD MATCHES "xiao_nrf52840" OR BOARD MATCHES "lilygo_techo" OR BOARD MATCHES "heltec_t114")
|
||||
if(BOARD MATCHES ".*nrf52.*" OR BOARD MATCHES "rak4631" OR BOARD MATCHES "rak_wismesh_tag" OR BOARD MATCHES "rak3401_1watt" OR BOARD MATCHES "wio_tracker" OR BOARD MATCHES "ikoka_nano" OR BOARD MATCHES "t1000_e" OR BOARD MATCHES "thinknode_m1" OR BOARD MATCHES "thinknode_m3" OR BOARD MATCHES "thinknode_m6" OR BOARD MATCHES "promicro_lr2021" OR BOARD MATCHES "promicro_sx1262" OR BOARD MATCHES "sensecap_solar" OR BOARD MATCHES "xiao_nrf52840" OR BOARD MATCHES "lilygo_techo" OR BOARD MATCHES "heltec_t114" OR BOARD MATCHES "gat562")
|
||||
set(ZEPHCORE_PLATFORM_CONF "${CMAKE_CURRENT_SOURCE_DIR}/boards/common/nrf52_common.conf")
|
||||
elseif(DEFINED BOARD_QUALIFIERS AND BOARD_QUALIFIERS MATCHES ".*nrf52.*")
|
||||
set(ZEPHCORE_PLATFORM_CONF "${CMAKE_CURRENT_SOURCE_DIR}/boards/common/nrf52_common.conf")
|
||||
|
||||
@@ -21,6 +21,7 @@ Supported Boards
|
||||
| ThinkNode M6 | `west build -b thinknode_m6 zephcore` | UF2 drag-drop or `west flash` |
|
||||
| RAK WisMesh Tag | `west build -b rak_wismesh_tag zephcore` | UF2 drag-drop or `west flash` |
|
||||
| Ikoka Nano 30dBm | `west build -b ikoka_nano_30dbm zephcore` | UF2 drag-drop |
|
||||
| GAT562 30S Mesh Kit | `west build -b gat562_30s zephcore` | UF2 drag-drop or `west flash` |
|
||||
| LilyGo T-Echo | `west build -b lilygo_techo zephcore` | UF2 drag-drop or `west flash` |
|
||||
| Heltec T114 | `west build -b heltec_t114 zephcore` | UF2 drag-drop or `west flash` |
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
# GAT562 30S Mesh Kit board selection
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
config BOARD_GAT562_30S
|
||||
select SOC_NRF52840_QIAA
|
||||
select ZEPHCORE_UI_JOYSTICK # 5-way joystick -> full companion menu UI
|
||||
@@ -0,0 +1,10 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# GAT562 30S Mesh Kit — nRF52840 (same SWD/UF2 runners as RAK4631)
|
||||
|
||||
board_runner_args(jlink "--device=nRF52840_xxAA" "--speed=4000")
|
||||
board_runner_args(pyocd "--target=nrf52840" "--frequency=4000000")
|
||||
include(${ZEPHYR_BASE}/boards/common/nrfutil.board.cmake)
|
||||
include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake)
|
||||
include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)
|
||||
include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake)
|
||||
include(${ZEPHYR_BASE}/boards/common/openocd-nrf5.board.cmake)
|
||||
@@ -0,0 +1,34 @@
|
||||
# GAT562 30S Mesh Kit (nRF52840 + SX1262)
|
||||
#
|
||||
# Built on the RAK4631 core module with a 30 dBm (1 W) external PA. The SX1262
|
||||
# is driven at the ZephCore default 22 dBm; the onboard PA brings the antenna
|
||||
# output up to ~30 dBm. DIO2 keys the T/R switch, DIO3 supplies the 1.8 V TCXO
|
||||
# (see gat562_30s.dts). Flash layout matches RAK4631 (SoftDevice s140 v6,
|
||||
# app @ 0x26000), so the stock UF2 bootloader is reused — no re-flash needed.
|
||||
#
|
||||
# Most features are auto-detected from devicetree:
|
||||
# - PWM + buzzer (buzzer nodelabel)
|
||||
# - SSD1306 OLED (zephyr,display chosen) -> also UI_DISPLAY below
|
||||
# - LoRa RX duty cycle (companion + SX1262)
|
||||
# - battery ADC, GPS, LEDs, user button
|
||||
|
||||
# Board identification
|
||||
CONFIG_ZEPHCORE_BOARD_NAME="GAT562 30S Mesh Kit"
|
||||
CONFIG_BT_DIS_MODEL_NUMBER_STR="GAT562_30S"
|
||||
|
||||
# SoftDevice firmware ID (s140 v6.1.1 — same as RAK4631)
|
||||
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
|
||||
# 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
|
||||
@@ -0,0 +1,6 @@
|
||||
board:
|
||||
name: gat562_30s
|
||||
full_name: GAT562 30S Mesh Kit (nRF52840 + SX1262, 30dBm/1W)
|
||||
vendor: gat
|
||||
socs:
|
||||
- name: nrf52840
|
||||
@@ -0,0 +1,132 @@
|
||||
/*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
* GAT562 30S Mesh Kit pin control.
|
||||
*
|
||||
* RAK4631 core-module pinout (UART/I2C/SPI/QSPI identical to upstream
|
||||
* rak4631) plus a PWM channel for the onboard buzzer on P1.01.
|
||||
*/
|
||||
|
||||
&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). */
|
||||
uart0_default: uart0_default {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(UART_TX, 0, 16)>,
|
||||
<NRF_PSEL(UART_RX, 0, 15)>;
|
||||
};
|
||||
};
|
||||
|
||||
uart0_sleep: uart0_sleep {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(UART_TX, 0, 16)>,
|
||||
<NRF_PSEL(UART_RX, 0, 15)>;
|
||||
low-power-enable;
|
||||
};
|
||||
};
|
||||
|
||||
/* GPS on UART1: MCU TX P0.16 -> GPS RX, MCU RX P0.15 <- GPS TX */
|
||||
uart1_default: uart1_default {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(UART_TX, 0, 16)>,
|
||||
<NRF_PSEL(UART_RX, 0, 15)>;
|
||||
};
|
||||
};
|
||||
|
||||
uart1_sleep: uart1_sleep {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(UART_TX, 0, 16)>,
|
||||
<NRF_PSEL(UART_RX, 0, 15)>;
|
||||
low-power-enable;
|
||||
};
|
||||
};
|
||||
|
||||
/* I2C0: SSD1306 OLED + sensors (SDA P0.13 / SCL P0.14) */
|
||||
i2c0_default: i2c0_default {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(TWIM_SDA, 0, 13)>,
|
||||
<NRF_PSEL(TWIM_SCL, 0, 14)>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c0_sleep: i2c0_sleep {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(TWIM_SDA, 0, 13)>,
|
||||
<NRF_PSEL(TWIM_SCL, 0, 14)>;
|
||||
low-power-enable;
|
||||
};
|
||||
};
|
||||
|
||||
/* I2C1 (P0.24/P0.25) — defined for parity, not enabled */
|
||||
i2c1_default: i2c1_default {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(TWIM_SDA, 0, 24)>,
|
||||
<NRF_PSEL(TWIM_SCL, 0, 25)>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c1_sleep: i2c1_sleep {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(TWIM_SDA, 0, 24)>,
|
||||
<NRF_PSEL(TWIM_SCL, 0, 25)>;
|
||||
low-power-enable;
|
||||
};
|
||||
};
|
||||
|
||||
/* LoRa SX1262 on SPI1: SCK P1.11 / MOSI P1.12 / MISO P1.13 */
|
||||
spi1_default: spi1_default {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(SPIM_SCK, 1, 11)>,
|
||||
<NRF_PSEL(SPIM_MOSI, 1, 12)>,
|
||||
<NRF_PSEL(SPIM_MISO, 1, 13)>;
|
||||
};
|
||||
};
|
||||
|
||||
spi1_sleep: spi1_sleep {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(SPIM_SCK, 1, 11)>,
|
||||
<NRF_PSEL(SPIM_MOSI, 1, 12)>,
|
||||
<NRF_PSEL(SPIM_MISO, 1, 13)>;
|
||||
low-power-enable;
|
||||
};
|
||||
};
|
||||
|
||||
/* Buzzer on PWM0 -> P1.01 */
|
||||
pwm0_default: pwm0_default {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(PWM_OUT0, 1, 1)>;
|
||||
};
|
||||
};
|
||||
|
||||
pwm0_sleep: pwm0_sleep {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(PWM_OUT0, 1, 1)>;
|
||||
low-power-enable;
|
||||
};
|
||||
};
|
||||
|
||||
/* QSPI pins (kept for parity; &qspi is disabled on this board) */
|
||||
qspi_default: qspi_default {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(QSPI_SCK, 0, 3)>,
|
||||
<NRF_PSEL(QSPI_IO0, 0, 30)>,
|
||||
<NRF_PSEL(QSPI_IO1, 0, 29)>,
|
||||
<NRF_PSEL(QSPI_IO2, 0, 28)>,
|
||||
<NRF_PSEL(QSPI_IO3, 0, 2)>,
|
||||
<NRF_PSEL(QSPI_CSN, 0, 26)>;
|
||||
};
|
||||
};
|
||||
|
||||
qspi_sleep: qspi_sleep {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(QSPI_SCK, 0, 3)>,
|
||||
<NRF_PSEL(QSPI_IO0, 0, 30)>,
|
||||
<NRF_PSEL(QSPI_IO1, 0, 29)>,
|
||||
<NRF_PSEL(QSPI_IO2, 0, 28)>,
|
||||
<NRF_PSEL(QSPI_IO3, 0, 2)>,
|
||||
<NRF_PSEL(QSPI_CSN, 0, 26)>;
|
||||
low-power-enable;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,340 @@
|
||||
/*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* GAT562 30S Mesh Kit — nRF52840 + SX1262 on a RAK4631 core module, with a
|
||||
* 30 dBm (1 W) external PA, SSD1306 OLED, GPS, buzzer, 2x18650 + solar input.
|
||||
*
|
||||
* LoRa wiring is identical to the RAK4631 WisBlock core:
|
||||
* SCK P1.11 MOSI P1.12 MISO P1.13 NSS P1.10
|
||||
* RST P1.06 BUSY P1.14 DIO1 P1.15 PWR_EN P1.05 (hog HIGH)
|
||||
* DIO2 = T/R switch, DIO3 = TCXO.
|
||||
*
|
||||
* GAT562-specific vs a stock RAK4631:
|
||||
* - 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
|
||||
* - 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)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include <nordic/nrf52840_qiaa.dtsi>
|
||||
#include "gat562_30s-pinctrl.dtsi"
|
||||
#include <zephyr/dt-bindings/adc/nrf-saadc.h>
|
||||
#include <zephyr/dt-bindings/lora/sx126x.h>
|
||||
#include <zephyr/dt-bindings/input/input-event-codes.h>
|
||||
#include <zephyr/dt-bindings/pwm/pwm.h>
|
||||
|
||||
/ {
|
||||
model = "GAT562 30S Mesh Kit";
|
||||
compatible = "gat,gat562-30s";
|
||||
|
||||
chosen {
|
||||
zephyr,sram = &sram0;
|
||||
zephyr,flash = &flash0;
|
||||
zephyr,code-partition = &code_partition;
|
||||
zephyr,console = &cdc_acm_uart;
|
||||
zephyr,shell-uart = &cdc_acm_uart;
|
||||
zephyr,display = &ssd1306;
|
||||
};
|
||||
|
||||
aliases {
|
||||
lora0 = &lora;
|
||||
led0 = &green_led;
|
||||
led1 = &blue_led;
|
||||
lora-tx-led = &green_led;
|
||||
sw0 = &user_button;
|
||||
buzzer = &buzzer;
|
||||
watchdog0 = &wdt0;
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
/* Active-high on GAT562 (LED_STATE_ON = 1; TX LED driven HIGH) */
|
||||
green_led: led_1 {
|
||||
gpios = <&gpio1 3 GPIO_ACTIVE_HIGH>;
|
||||
label = "Green LED";
|
||||
};
|
||||
blue_led: led_2 {
|
||||
gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>;
|
||||
label = "Blue LED";
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
* Inputs: back/menu button (P0.09) + 5-way joystick (P0.28/04/30/31/26).
|
||||
* The joystick drives the companion menu UI (ZEPHCORE_UI_JOYSTICK). The
|
||||
* back button is a single GPIO whose tap-count/hold is decoded by the
|
||||
* filters below — same scheme as the Wio Tracker L1:
|
||||
* 1 tap -> KEY_1 (back/cancel) long hold -> KEY_POWER
|
||||
* 2 taps -> KEY_B (advert) 3 -> KEY_D (buzzer)
|
||||
* 4 taps -> KEY_C (GPS) 5 -> KEY_E (LED)
|
||||
* (NFC pins P0.09/P0.10 are freed for GPIO by nfct-pins-as-gpios above.)
|
||||
*/
|
||||
buttons: buttons {
|
||||
compatible = "gpio-keys";
|
||||
|
||||
user_button: button_0 {
|
||||
gpios = <&gpio0 9 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
|
||||
zephyr,code = <INPUT_KEY_0>;
|
||||
label = "Back Button";
|
||||
};
|
||||
|
||||
joystick_up: button_1 {
|
||||
gpios = <&gpio0 28 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
|
||||
zephyr,code = <INPUT_KEY_UP>;
|
||||
label = "Joystick Up";
|
||||
};
|
||||
|
||||
joystick_down: button_2 {
|
||||
gpios = <&gpio0 4 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
|
||||
zephyr,code = <INPUT_KEY_DOWN>;
|
||||
label = "Joystick Down";
|
||||
};
|
||||
|
||||
joystick_left: button_3 {
|
||||
gpios = <&gpio0 30 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
|
||||
zephyr,code = <INPUT_KEY_LEFT>;
|
||||
label = "Joystick Left";
|
||||
};
|
||||
|
||||
joystick_right: button_4 {
|
||||
gpios = <&gpio0 31 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
|
||||
zephyr,code = <INPUT_KEY_RIGHT>;
|
||||
label = "Joystick Right";
|
||||
};
|
||||
|
||||
joystick_press: button_5 {
|
||||
gpios = <&gpio0 26 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
|
||||
zephyr,code = <INPUT_KEY_ENTER>;
|
||||
label = "Joystick Press";
|
||||
};
|
||||
};
|
||||
|
||||
/* Back button: short tap -> KEY_A (feeds multitap), hold >=1s -> KEY_POWER */
|
||||
user_btn_longpress {
|
||||
compatible = "zephyr,input-longpress";
|
||||
input = <&buttons>;
|
||||
input-codes = <INPUT_KEY_0>;
|
||||
short-codes = <INPUT_KEY_A>;
|
||||
long-codes = <INPUT_KEY_POWER>;
|
||||
long-delay-ms = <1000>;
|
||||
};
|
||||
|
||||
/* Tap-count decode of the back button. No 'input' phandle: KEY_A is
|
||||
* emitted by the longpress pseudo-device, not by &buttons. */
|
||||
user_btn_multitap {
|
||||
compatible = "zephcore,input-multi-tap";
|
||||
input-codes = <INPUT_KEY_A>;
|
||||
tap-codes = <INPUT_KEY_1 INPUT_KEY_B INPUT_KEY_D INPUT_KEY_C INPUT_KEY_E>;
|
||||
tap-delay-ms = <400>;
|
||||
};
|
||||
|
||||
/* Onboard buzzer on P1.01 (PWM0). The official MeshCore variant defines
|
||||
* PIN_BUZZER=33 (P1.01); its PIN_GPS_EN=33 is vestigial template cruft —
|
||||
* the UART GPS is always-on and needs no enable, so P1.01 is the buzzer. */
|
||||
pwmbuzzer {
|
||||
compatible = "pwm-leds";
|
||||
buzzer: buzzer {
|
||||
pwms = <&pwm0 0 PWM_MSEC(20) PWM_POLARITY_NORMAL>;
|
||||
};
|
||||
};
|
||||
|
||||
/* Battery sense: AIN3 = P0.05 with the GAT562 divider (~1.73x) */
|
||||
zephyr,user {
|
||||
io-channels = <&adc 3>;
|
||||
vbat-mv-multiplier = <6232>; /* mv = raw * multiplier / 4096 */
|
||||
};
|
||||
};
|
||||
|
||||
®0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
®1 {
|
||||
regulator-initial-mode = <NRF5X_REG_MODE_DCDC>;
|
||||
};
|
||||
|
||||
&uicr {
|
||||
gpio-as-nreset;
|
||||
nfct-pins-as-gpios; /* free P0.09 / P0.10 for the user button */
|
||||
};
|
||||
|
||||
&gpiote {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&gpio0 {
|
||||
status = "okay";
|
||||
|
||||
/*
|
||||
* Route the 6 button/joystick edge interrupts (P0.04/09/26/28/30/31)
|
||||
* through the shared GPIO SENSE/PORT event instead of dedicating a
|
||||
* GPIOTE IN channel to each. The nRF52840 has only 8 GPIOTE channels;
|
||||
* with 6 buttons each taking one (gpio-keys uses GPIO_INT_EDGE_BOTH),
|
||||
* the SX1262 DIO1 interrupt could be starved of a channel, so CAD/TX/RX
|
||||
* "done" IRQs never fire and every RF op times out (CAD failed -116).
|
||||
* Moving the slow button inputs to sense frees all 6 channels for DIO1.
|
||||
* Mask = (1<<4)|(1<<9)|(1<<26)|(1<<28)|(1<<30)|(1<<31).
|
||||
*/
|
||||
sense-edge-mask = <0xD4000210>;
|
||||
};
|
||||
|
||||
&gpio1 {
|
||||
status = "okay";
|
||||
|
||||
/* SX1262 module power-enable on P1.05: held HIGH. The native sx126x
|
||||
* driver must not toggle this per-direction (it is module power, not a
|
||||
* per-TX/RX antenna switch), so it is hogged instead of being a
|
||||
* rx-enable-gpios on the lora node. */
|
||||
sx1262_power_en {
|
||||
gpio-hog;
|
||||
gpios = <5 GPIO_ACTIVE_HIGH>;
|
||||
output-high;
|
||||
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";
|
||||
};
|
||||
};
|
||||
|
||||
&adc {
|
||||
status = "okay";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
channel@3 {
|
||||
reg = <3>;
|
||||
zephyr,gain = "ADC_GAIN_1_6";
|
||||
zephyr,reference = "ADC_REF_INTERNAL";
|
||||
zephyr,acquisition-time = <ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 10)>;
|
||||
zephyr,input-positive = <NRF_SAADC_AIN3>; /* P0.05 */
|
||||
zephyr,resolution = <12>;
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
&uart0 {
|
||||
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";
|
||||
};
|
||||
};
|
||||
|
||||
/* UART1 unused — the GPS moved to UART0 (see above). */
|
||||
&uart1 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
/* LoRa SX1262 on SPI1 — RAK4631 core-module wiring */
|
||||
&spi1 {
|
||||
compatible = "nordic,nrf-spi";
|
||||
status = "okay";
|
||||
cs-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>; /* NSS P1.10 */
|
||||
pinctrl-0 = <&spi1_default>;
|
||||
pinctrl-1 = <&spi1_sleep>;
|
||||
pinctrl-names = "default", "sleep";
|
||||
|
||||
lora: lora@0 {
|
||||
compatible = "semtech,sx1262";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <1000000>;
|
||||
reset-gpios = <&gpio1 6 GPIO_ACTIVE_LOW>; /* RST P1.06 */
|
||||
busy-gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>; /* BUSY P1.14 */
|
||||
dio1-gpios = <&gpio1 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>; /* DIO1 P1.15 */
|
||||
dio2-tx-enable; /* DIO2 = T/R switch */
|
||||
/* 1.8 V TCXO via DIO3 — matches the official MeshCore GAT562 variant
|
||||
* (SX126X_DIO3_TCXO_VOLTAGE 1.8). The TCXO on the RAK4631 core runs
|
||||
* fine at 1.8 V; 3.3 V also works on this unit, but 1.8 V mirrors the
|
||||
* vendor's known-good value. The module is a TCXO part: without DIO3
|
||||
* control it has no clock and sits in permanent BUSY. NOTE: the SX1262
|
||||
* signals CAD/TX/RX "done" on DIO1, which needs a free nRF GPIOTE
|
||||
* channel. This board's 6 buttons are routed to GPIO SENSE (see
|
||||
* sense-edge-mask on &gpio0) so they don't consume all 8 channels and
|
||||
* starve DIO1 — without that, every RF op times out ("CAD failed -116"). */
|
||||
dio3-tcxo-voltage = <SX126X_DIO3_TCXO_1V8>;
|
||||
tcxo-power-startup-delay-ms = <5>;
|
||||
rx-boosted;
|
||||
};
|
||||
};
|
||||
|
||||
/* I2C0: SSD1306 OLED @ 0x3C + auto-detected sensors (BME280 pad, etc.) */
|
||||
&i2c0 {
|
||||
compatible = "nordic,nrf-twi";
|
||||
status = "okay";
|
||||
pinctrl-0 = <&i2c0_default>;
|
||||
pinctrl-1 = <&i2c0_sleep>;
|
||||
pinctrl-names = "default", "sleep";
|
||||
|
||||
ssd1306: ssd1306@3c {
|
||||
compatible = "solomon,ssd1306";
|
||||
reg = <0x3c>;
|
||||
width = <128>;
|
||||
height = <64>;
|
||||
segment-offset = <0>;
|
||||
page-offset = <0>;
|
||||
display-offset = <0>;
|
||||
multiplex-ratio = <63>;
|
||||
segment-remap;
|
||||
com-invdir;
|
||||
prechargep = <0x22>;
|
||||
};
|
||||
|
||||
#include "../../common/sensors-i2c.dtsi"
|
||||
};
|
||||
|
||||
/* PWM0 drives the buzzer on P1.01 */
|
||||
&pwm0 {
|
||||
status = "okay";
|
||||
pinctrl-0 = <&pwm0_default>;
|
||||
pinctrl-1 = <&pwm0_sleep>;
|
||||
pinctrl-names = "default", "sleep";
|
||||
};
|
||||
|
||||
/*
|
||||
* No external QSPI flash on the GAT562 core module. The SoC leaves &qspi
|
||||
* disabled by default; pin it explicitly so a probe of an absent chip can
|
||||
* never hang boot.
|
||||
*/
|
||||
&qspi {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
/* USB CDC-ACM: console + repeater CLI */
|
||||
zephyr_udc0: &usbd {
|
||||
compatible = "nordic,nrf-usbd";
|
||||
status = "okay";
|
||||
|
||||
cdc_acm_uart: cdc_acm_uart {
|
||||
compatible = "zephyr,cdc-acm-uart";
|
||||
};
|
||||
};
|
||||
|
||||
/* SoftDevice s140 v6 + UF2 bootloader flash layout (app @ 0x26000) */
|
||||
#include "../../common/nrf52_partitions_sdv6.dtsi"
|
||||
|
||||
/* Mark the buttons node as a System OFF wakeup source */
|
||||
#include "../../common/nrf52_wakeup.dtsi"
|
||||
@@ -0,0 +1,30 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# GAT562 30S Mesh Kit default configuration
|
||||
# (most subsystems also come from zephcore_common.conf + nrf52_common.conf;
|
||||
# these are the board essentials, kept self-contained like other custom boards)
|
||||
|
||||
# MPU + hardware stack protection
|
||||
CONFIG_ARM_MPU=y
|
||||
CONFIG_HW_STACK_PROTECTION=y
|
||||
|
||||
# GPIO + pin control
|
||||
CONFIG_GPIO=y
|
||||
CONFIG_PINCTRL=y
|
||||
|
||||
# Console over USB CDC-ACM (DT node + nrf52_common.conf USB stack)
|
||||
CONFIG_CONSOLE=y
|
||||
CONFIG_UART_CONSOLE=y
|
||||
CONFIG_SERIAL=y
|
||||
CONFIG_UART_LINE_CTRL=y
|
||||
|
||||
# Flash / NVS (LittleFS app data partition)
|
||||
CONFIG_FLASH=y
|
||||
CONFIG_FLASH_MAP=y
|
||||
CONFIG_NVS=y
|
||||
|
||||
# SPI for LoRa, ADC for battery sense
|
||||
CONFIG_SPI=y
|
||||
CONFIG_ADC=y
|
||||
|
||||
# SEGGER RTT (matches the RAK4631 base this board derives from)
|
||||
CONFIG_USE_SEGGER_RTT=y
|
||||
@@ -0,0 +1,5 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Suppress unique_unit_address warnings for the overlapping nRF52840
|
||||
# peripherals (power/clock/bprot @ 0x40000000, acl/flash-controller @
|
||||
# 0x4001e000) — same as the upstream rak4631 board.
|
||||
list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled")
|
||||
@@ -19,6 +19,7 @@ xiao_nrf52840
|
||||
lilygo_techo
|
||||
promicro_sx1262
|
||||
heltec_t114
|
||||
gat562_30s
|
||||
```
|
||||
|
||||
> **RAK WisMesh Pocket** (WisBlock pocket): use `-b rak4631` — same board string and firmware as **RAK4631**.
|
||||
|
||||
Reference in New Issue
Block a user