Skip to content

Commit 53374c6

Browse files
is-qiankartben
authored andcommitted
boards: seeed: support XIAO nRF54L15
This is a new board of the XIAO series based on nRF54L15. Signed-off-by: Ruiqian Tang <[email protected]>
1 parent bdcd70b commit 53374c6

22 files changed

+875
-0
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Copyright (c) 2025 Seeed Technology Co., Ltd.
2+
# SPDX-License-Identifier: Apache-2.0
3+
if BOARD_XIAO_NRF54L15_NRF54L15_CPUAPP
4+
5+
config BT_CTLR
6+
default BT
7+
8+
config ROM_START_OFFSET
9+
default 0x800 if BOOTLOADER_MCUBOOT
10+
11+
endif # BOARD_XIAO_NRF54L15_NRF54L15_CPUAPP
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Copyright (c) 2025 Seeed Technology Co., Ltd.
2+
# SPDX-License-Identifier: Apache-2.0
3+
config BOARD_XIAO_NRF54L15
4+
select SOC_NRF54L15_CPUAPP if BOARD_XIAO_NRF54L15_NRF54L15_CPUAPP
5+
select SOC_NRF54L15_CPUFLPR if \
6+
BOARD_XIAO_NRF54L15_NRF54L15_CPUFLPR || \
7+
BOARD_XIAO_NRF54L15_NRF54L15_CPUFLPR_XIP
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
3+
if(CONFIG_SOC_NRF54L15_CPUAPP)
4+
board_runner_args(openocd "--cmd-load=nrf54l-load" -c "targets nrf54l.cpu")
5+
board_runner_args(jlink "--device=nRF54L15_M33" "--speed=4000")
6+
elseif(CONFIG_SOC_NRF54L15_CPUFLPR)
7+
board_runner_args(openocd "--cmd-load=nrf54l-load" -c "targets nrf54l.aux")
8+
board_runner_args(jlink "--device=nRF54L15_RV32")
9+
endif()
10+
11+
include(${ZEPHYR_BASE}/boards/common/nrfutil.board.cmake)
12+
include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake)
13+
include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)

boards/seeed/xiao_nrf54l15/board.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
board:
2+
name: xiao_nrf54l15
3+
full_name: XIAO NRF54L15
4+
vendor: seeed
5+
socs:
6+
- name: nrf54l15
7+
variants:
8+
- name: xip
9+
cpucluster: cpuflpr
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
.. zephyr:board:: xiao_nrf54l15
2+
3+
Overview
4+
********
5+
6+
`Seeed Studio XIAO nRF54L15`_ is a compact, high-performance development board featuring the cutting-edge
7+
Nordic nRF54L15 chip. This next-generation SoC integrates an ultra-low power multiprotocol 2.4 GHz
8+
radio and an MCU with a 128 MHz Arm® Cortex®-M33 processor and an Arm® Cortex®-M0+ for advanced
9+
power management. It offers scalable memory up to 1.5 MB NVM and 256 KB RAM.
10+
Designed for exceptional ultra-low power consumption, it significantly extends battery life.
11+
Its robust radio supports Bluetooth® 6.0 (including Channel Sounding), Matter, Thread, Zigbee,
12+
and a high-throughput 2.4 GHz proprietary mode (up to 4 Mbps).
13+
14+
The board includes a comprehensive set of peripherals, an integrated 128 MHz RISC-V coprocessor,
15+
and advanced security features like TrustZone® isolation and cryptographic engine protection.
16+
With built-in lithium battery management, XIAO nRF54L15 is ideal for compact, secure,
17+
and energy-efficient IoT solutions such as smart wearables, industrial sensors, and advanced human-machine interfaces.
18+
19+
20+
Hardware
21+
********
22+
23+
- 128 MHz Arm® Cortex®-M33 processor
24+
- Scalable memory configurations up to 1.5 MB NVM and up to 256 KB RAM
25+
- Multiprotocol 2.4 GHz radio supporting Bluetooth Low Energy, 802.15.4-2020,
26+
and 2.4 GHz proprietary modes (up to 4 Mbps)
27+
- Comprehensive set of peripherals including new Global RTC available in System OFF,
28+
14-bit ADC, and high-speed serial interfaces
29+
- 128 MHz RISC-V coprocessor
30+
- Advanced security including TrustZone® isolation, tamper detection,
31+
and cryptographic engine side-channel leakage protection
32+
33+
34+
For more information about the nRF54L15 SoC and XIAO nRF54L15 board, refer to these
35+
documents:
36+
37+
- `nRF54L15 Website`_
38+
- `nRF54L15 Datasheet`_
39+
- `XIAO nRF54L15 Wiki`_
40+
41+
Supported Features
42+
==================
43+
44+
.. zephyr:board-supported-hw::
45+
46+
Connections and IOs
47+
===================
48+
49+
In the following table, the column **Name** contains Pin names. For example, P2_0
50+
means Pin number 0 on PORT2, as used in the board's datasheets and manuals.
51+
52+
+-------+-------------+------------------+
53+
| Name | Function | Usage |
54+
+=======+=============+==================+
55+
| P2_0 | GPIO | LED0 |
56+
+-------+-------------+------------------+
57+
| P1_9 | USART20_TX | UART Console TX |
58+
+-------+-------------+------------------+
59+
| P1_8 | USART20_RX | UART Console RX |
60+
+-------+-------------+------------------+
61+
62+
63+
Programming and Debugging
64+
*************************
65+
66+
The XIAO nRF54L15 contains an SAMD11 with CMSIS-DAP, allowing flashing, debugging, logging, etc. over
67+
the USB port. Doing so requires a version of OpenOCD that includes support for the flash on the nRF54L15
68+
MCU. Until those changes are included in stock OpenOCD, the version bundled with Arduino can be
69+
used, or can be installed from the `OpenOCD Arduino`_.
70+
71+
When flashing, debugging, etc. you may need to include ``--openocd=/usr/local/bin/openocd
72+
--openocd-search=/usr/local/share/openocd/scripts/`` options to the command.
73+
74+
Flashing
75+
========
76+
77+
Connect the XIAO nRF54L15 board to your host computer using the USB port. A USB CDC ACM serial port
78+
should appear on the host, that can be used to view logs from the flashed application.
79+
80+
Here is an example for the :zephyr:code-sample:`hello_world` application.
81+
82+
.. zephyr-app-commands::
83+
:zephyr-app: samples/hello_world
84+
:board: xiao_nrf54l15
85+
:goals: flash
86+
87+
Open a serial terminal (minicom, putty, etc.) connecting to the UCB CDC ACM serial port.
88+
89+
Reset the board and you should see the following message in the terminal:
90+
91+
.. code-block:: console
92+
93+
Hello World! xiao_nrf54l15
94+
95+
96+
.. _Seeed Studio XIAO nRF54L15:
97+
https://www.seeedstudio.com/XIAO-nRF54L15-Sense-p-6494
98+
99+
.. _XIAO nRF54L15 Wiki:
100+
https://wiki.seeedstudio.com/getting_started_with_xiao_nrf54l15/
101+
102+
.. _nRF54L15 Website:
103+
https://www.nordicsemi.com/Products/nRF54L15
104+
105+
.. _nRF54L15 Datasheet:
106+
https://docs.nordicsemi.com/bundle/ps_nrf54L15/page/keyfeatures_html5.html
107+
108+
.. _OpenOCD Arduino:
109+
https://github.com/arduino/OpenOCD
Binary file not shown.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
# Suppress "unique_unit_address_if_enabled" to handle some overlaps
3+
list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled")
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*/
4+
5+
/ {
6+
xiao_d: connector {
7+
compatible = "seeed,xiao-gpio";
8+
#gpio-cells = <2>;
9+
gpio-map-mask = <0xffffffff 0xffffffc0>;
10+
gpio-map-pass-thru = <0 0x3f>;
11+
gpio-map = <0 0 &gpio1 4 0>, /* D0 */
12+
<1 0 &gpio1 5 0>, /* D1 */
13+
<2 0 &gpio1 6 0>, /* D2 */
14+
<3 0 &gpio1 7 0>, /* D3 */
15+
<4 0 &gpio1 10 0>, /* D4 */
16+
<5 0 &gpio1 1 0>, /* D5 */
17+
<6 0 &gpio2 8 0>, /* D6 */
18+
<7 0 &gpio2 7 0>, /* D7 */
19+
<8 0 &gpio2 1 0>, /* D8 */
20+
<9 0 &gpio2 4 0>, /* D9 */
21+
<10 0 &gpio2 2 0>; /* D10 */
22+
};
23+
};
24+
25+
xiao_i2c: &i2c22 {};
26+
xiao_spi: &spi00 {};
27+
xiao_serial: &uart21 {};
28+
xiao_adc: &adc {};
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
3+
if {[info exists env(OPENOCD_INTERFACE)]} {
4+
set INTERFACE $env(OPENOCD_INTERFACE)
5+
} else {
6+
# By default connect over Debug USB port using the CMSIS-DAP interface
7+
set INTERFACE "cmsis-dap"
8+
}
9+
10+
source [find interface/$INTERFACE.cfg]
11+
12+
set _CHIPNAME nrf54l
13+
14+
# Work-area is a space in RAM used for flash programming, by default use 16 KiB.
15+
if { [info exists WORKAREASIZE] } {
16+
set _WORKAREASIZE $WORKAREASIZE
17+
} else {
18+
set _WORKAREASIZE 0x4000
19+
}
20+
21+
if { [info exists CPUTAPID] } {
22+
set _CPUTAPID $CPUTAPID
23+
} else {
24+
set _CPUTAPID 0x6ba02477
25+
}
26+
27+
# Multidrop instance ID should be configurable by FW in TAD TINSTANCE register.
28+
# Writes to the register are ignored due to a silicon erratum.
29+
if { [info exists SWD_INSTANCE_ID] } {
30+
set _SWD_INSTANCE_ID $SWD_INSTANCE_ID
31+
} else {
32+
set _SWD_INSTANCE_ID 0
33+
}
34+
35+
transport select swd
36+
37+
swd newdap $_CHIPNAME cpu -expected-id $_CPUTAPID
38+
39+
if { [info exists SWD_MULTIDROP] } {
40+
dap create $_CHIPNAME.dap -chain-position $_CHIPNAME.cpu -dp-id 0x001c0289 -instance-id $_SWD_INSTANCE_ID
41+
} else {
42+
dap create $_CHIPNAME.dap -chain-position $_CHIPNAME.cpu
43+
}
44+
45+
set _TARGETNAME $_CHIPNAME.cpu
46+
target create $_TARGETNAME cortex_m -dap $_CHIPNAME.dap -ap-num 0
47+
48+
$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0
49+
50+
# Create target for the AUX access port (AUX-AP).
51+
target create $_CHIPNAME.aux mem_ap -dap $_CHIPNAME.dap -ap-num 1
52+
53+
# AUX-AP is accessible only if CSW Prot[0] bit (Data Access) is set
54+
$_CHIPNAME.dap apsel 1
55+
$_CHIPNAME.dap apcsw 0x01000000 0x01000000
56+
57+
adapter speed 1000
58+
59+
# Use main processor as default target.
60+
targets $_TARGETNAME
61+
62+
if {![using_hla]} {
63+
$_TARGETNAME cortex_m reset_config sysresetreq
64+
}
65+
66+
proc nrf54l-load {file} {
67+
mww 0x5004b500 0x101
68+
load_image $file
69+
}
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*/
4+
5+
&pinctrl {
6+
/omit-if-no-ref/ uart20_default: uart20_default {
7+
group1 {
8+
psels = <NRF_PSEL(UART_TX, 1, 9)>;
9+
};
10+
11+
group2 {
12+
psels = <NRF_PSEL(UART_RX, 1, 8)>;
13+
bias-pull-up;
14+
};
15+
};
16+
17+
/omit-if-no-ref/ uart20_sleep: uart20_sleep {
18+
group1 {
19+
psels = <NRF_PSEL(UART_TX, 1, 9)>,
20+
<NRF_PSEL(UART_RX, 1, 8)>;
21+
low-power-enable;
22+
};
23+
};
24+
25+
/omit-if-no-ref/ uart21_default: uart21_default {
26+
group1 {
27+
psels = <NRF_PSEL(UART_TX, 2, 8)>;
28+
};
29+
30+
group2 {
31+
psels = <NRF_PSEL(UART_RX, 2, 7)>;
32+
bias-pull-up;
33+
};
34+
};
35+
36+
/omit-if-no-ref/ uart21_sleep: uart21_sleep {
37+
group1 {
38+
psels = <NRF_PSEL(UART_TX, 2, 8)>,
39+
<NRF_PSEL(UART_RX, 2, 7)>;
40+
low-power-enable;
41+
};
42+
};
43+
44+
/omit-if-no-ref/ i2c22_default: i2c22_default {
45+
group1 {
46+
psels = <NRF_PSEL(TWIM_SDA, 1, 10)>,
47+
<NRF_PSEL(TWIM_SCL, 1, 11)>;
48+
};
49+
};
50+
51+
/omit-if-no-ref/ i2c22_sleep: i2c22_sleep {
52+
group1 {
53+
psels = <NRF_PSEL(TWIM_SDA, 1, 10)>,
54+
<NRF_PSEL(TWIM_SCL, 1, 11)>;
55+
low-power-enable;
56+
};
57+
};
58+
59+
/omit-if-no-ref/ i2c30_default: i2c30_default {
60+
group1 {
61+
psels = <NRF_PSEL(TWIM_SDA, 0, 4)>,
62+
<NRF_PSEL(TWIM_SCL, 0, 3)>;
63+
};
64+
};
65+
66+
/omit-if-no-ref/ i2c30_sleep: i2c30_sleep {
67+
group1 {
68+
psels = <NRF_PSEL(TWIM_SDA, 0, 4)>,
69+
<NRF_PSEL(TWIM_SCL, 0, 3)>;
70+
low-power-enable;
71+
};
72+
};
73+
74+
/omit-if-no-ref/ spi00_default: spi00_default {
75+
group1 {
76+
psels = <NRF_PSEL(SPIM_SCK, 2, 1)>,
77+
<NRF_PSEL(SPIM_MOSI, 2, 2)>,
78+
<NRF_PSEL(SPIM_MISO, 2, 4)>;
79+
};
80+
};
81+
82+
/omit-if-no-ref/ spi00_sleep: spi00_sleep {
83+
group1 {
84+
psels = <NRF_PSEL(SPIM_SCK, 2, 1)>,
85+
<NRF_PSEL(SPIM_MOSI, 2, 2)>,
86+
<NRF_PSEL(SPIM_MISO, 2, 4)>;
87+
low-power-enable;
88+
};
89+
};
90+
91+
/omit-if-no-ref/ spi22_default: spi22_default {
92+
group1 {
93+
psels = <NRF_PSEL(SPIM_SCK, 1, 8)>,
94+
<NRF_PSEL(SPIM_MOSI, 1, 10)>,
95+
<NRF_PSEL(SPIM_MISO, 1, 9)>;
96+
};
97+
};
98+
99+
/omit-if-no-ref/ spi22_sleep: spi22_sleep {
100+
group1 {
101+
psels = <NRF_PSEL(SPIM_SCK, 1, 8)>,
102+
<NRF_PSEL(SPIM_MOSI, 1, 10)>,
103+
<NRF_PSEL(SPIM_MISO, 1, 9)>;
104+
low-power-enable;
105+
};
106+
};
107+
108+
pdm20_default: pdm20_default {
109+
group1 {
110+
psels = <NRF_PSEL(PDM_CLK, 1, 12)>,
111+
<NRF_PSEL(PDM_DIN, 1, 13)>;
112+
};
113+
};
114+
};

0 commit comments

Comments
 (0)