Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ nRF_boards=(
thinknode_m6
rak_wismesh_tag
ikoka_nano_30dbm
ikoka_stick_22dbm
ikoka_stick_30dbm
ikoka_stick_33dbm
sensecap_solar
xiao_nrf52840
)
Expand Down
2 changes: 1 addition & 1 deletion zephcore/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,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 "sensecap_solar" OR BOARD MATCHES "xiao_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 "ikoka_stick" 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 "sensecap_solar" OR BOARD MATCHES "xiao_nrf52840")
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")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Ikoka Stick 22dBm board configuration
# DC/DC converter enabled via DTS: &reg1 { regulator-initial-mode = <NRF5X_REG_MODE_DCDC>; }

config BOARD_IKOKA_STICK_22DBM
select SOC_NRF52840_QIAA
37 changes: 37 additions & 0 deletions zephcore/boards/nrf52840/ikoka_stick_22dbm/board.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Ikoka Stick 22dBm (XIAO nRF52840 + E22-900M22S)
# Board-specific configuration
#
# Hardware:
# - XIAO nRF52840 base board (socketed via pin headers)
# - E22-900M22S LoRa module (bare SX1262, no external PA, 22 dBm output)
# - User button on D0 (P0.02)
# - Optional SSD1306 0.96" OLED @ 0x3C on I2C1 (auto-detected)
# - Battery ADC on AIN7 (P0.31), enable on P0.14
# - LEDs: RED=P0.26, BLUE=P0.06, GREEN=P0.30
#
# Pin Mapping (XIAO D-pins to nRF52840 GPIOs):
# D0 = P0.02 (User button) D4 = P0.04 (SX1262 NSS) D8 = P1.13 (SCK)
# D1 = P0.03 (SX1262 DIO1) D5 = P0.05 (PA RXEN) D9 = P1.14 (MISO)
# D2 = P0.28 (SX1262 RESET) D6 = P1.11 (I2C SDA) D10 = P1.15 (MOSI)
# D3 = P0.29 (SX1262 BUSY) D7 = P1.12 (I2C SCL)
#
# LoRa Module E22-900M22S Notes:
# - Bare SX1262. No external PA stage; SX1262 drives the antenna directly
# up to +22 dBm. No input-power restriction beyond the SX1262's own spec.
# - DIO2 drives the internal TX/RX antenna switch (dio2-tx-enable).
# - RXEN (P0.05) is still wired on the PCB (shared trace across all three
# Stick variants) but has no external-PA function on this module — the
# line toggles are harmless.

# Board identification (matches Arduino variant name)
CONFIG_ZEPHCORE_BOARD_NAME="Ikoka Stick-E22-22dBm (Xiao_nrf52)"

# Device Information Service model name
CONFIG_BT_DIS_MODEL_NUMBER_STR="Ikoka Stick 22dBm"

# SoftDevice firmware ID (XIAO nRF52840 uses S140 v7.3.0)
CONFIG_ZEPHCORE_SD_FWID=0x0123

# SX1262 TX power caps — full rated output (22 dBm) is safe on the bare module.
CONFIG_ZEPHCORE_DEFAULT_TX_POWER_DBM=22
CONFIG_ZEPHCORE_MAX_TX_POWER_DBM=22
6 changes: 6 additions & 0 deletions zephcore/boards/nrf52840/ikoka_stick_22dbm/board.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
board:
name: ikoka_stick_22dbm
full_name: Ikoka Stick 22dBm (XIAO nRF52840 + E22-900M22S)
vendor: ikoka
socs:
- name: nrf52840
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
/*
* SPDX-License-Identifier: Apache-2.0
* Ikoka Stick 22dBm pin control - based on XIAO nRF52840
*
* Pin Mapping (XIAO D-pins to nRF52840 GPIOs):
* D0 = P0.02 (User button) D4 = P0.04 (SX1262 NSS) D8 = P1.13 (SCK)
* D1 = P0.03 (SX1262 DIO1) D5 = P0.05 (PA RXEN) D9 = P1.14 (MISO)
* D2 = P0.28 (SX1262 RESET) D6 = P1.11 (I2C SDA) D10 = P1.15 (MOSI)
* D3 = P0.29 (SX1262 BUSY) D7 = P1.12 (I2C SCL)
*
* UART0 is NOT wired on this board (console is USB-CDC). The pinctrl
* nodes below are kept so that upstream nRF52840 SoC defaults that
* reference &uart0_default/&uart0_sleep still resolve. &uart0 itself
* is disabled in the .dts to prevent the driver from driving pins.
* Dummy pins P0.08 / P0.09 are not brought out to a connector on XIAO.
*/

&pinctrl {
/* UART0 placeholder — driver is disabled, pins are not brought out */
uart0_default: uart0_default {
group1 {
psels = <NRF_PSEL(UART_TX, 0, 8)>;
};
group2 {
psels = <NRF_PSEL(UART_RX, 0, 9)>;
bias-pull-up;
};
};

uart0_sleep: uart0_sleep {
group1 {
psels = <NRF_PSEL(UART_TX, 0, 8)>,
<NRF_PSEL(UART_RX, 0, 9)>;
low-power-enable;
};
};

/* I2C1 on D6/D7 for optional SSD1306 OLED and any external sensors */
i2c1_default: i2c1_default {
group1 {
psels = <NRF_PSEL(TWIM_SDA, 1, 11)>, /* D6 = P1.11 */
<NRF_PSEL(TWIM_SCL, 1, 12)>; /* D7 = P1.12 */
};
};

i2c1_sleep: i2c1_sleep {
group1 {
psels = <NRF_PSEL(TWIM_SDA, 1, 11)>,
<NRF_PSEL(TWIM_SCL, 1, 12)>;
low-power-enable;
};
};

/* SPI2 for LoRa on D8/D9/D10 */
spi2_default: spi2_default {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 1, 13)>, /* D8 = P1.13 */
<NRF_PSEL(SPIM_MOSI, 1, 15)>, /* D10 = P1.15 */
<NRF_PSEL(SPIM_MISO, 1, 14)>; /* D9 = P1.14 */
};
};

spi2_sleep: spi2_sleep {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 1, 13)>,
<NRF_PSEL(SPIM_MOSI, 1, 15)>,
<NRF_PSEL(SPIM_MISO, 1, 14)>;
low-power-enable;
};
};

/* QSPI for onboard flash (disabled on XIAO nRF52840 — kept for symmetry) */
qspi_default: qspi_default {
group1 {
psels = <NRF_PSEL(QSPI_SCK, 0, 21)>,
<NRF_PSEL(QSPI_IO0, 0, 20)>,
<NRF_PSEL(QSPI_IO1, 0, 24)>,
<NRF_PSEL(QSPI_IO2, 0, 22)>,
<NRF_PSEL(QSPI_IO3, 0, 23)>,
<NRF_PSEL(QSPI_CSN, 0, 25)>;
};
};

qspi_sleep: qspi_sleep {
group1 {
psels = <NRF_PSEL(QSPI_SCK, 0, 21)>,
<NRF_PSEL(QSPI_IO0, 0, 20)>,
<NRF_PSEL(QSPI_IO1, 0, 24)>,
<NRF_PSEL(QSPI_IO2, 0, 22)>,
<NRF_PSEL(QSPI_IO3, 0, 23)>;
low-power-enable;
};
group2 {
psels = <NRF_PSEL(QSPI_CSN, 0, 25)>;
low-power-enable;
bias-pull-up;
};
};
};
Loading