Skip to content

Add xiao nrf54lm20b support - #30

Merged
cumin777 merged 13 commits into
Seeed-Studio:masterfrom
cumin777:add-xiao-nrf54lm20b-support
Aug 14, 2026
Merged

Add xiao nrf54lm20b support#30
cumin777 merged 13 commits into
Seeed-Studio:masterfrom
cumin777:add-xiao-nrf54lm20b-support

Conversation

@cumin777

Copy link
Copy Markdown
Contributor

Add xiao nrf54lm20b support

yuansheng1126 and others added 13 commits August 11, 2026 13:41
First bring-up of the XIAO nRF54LM20B, built on the nrf54lm20a/cpuapp
SoC target. SWD programming baseline (USB DFU / MCUboot / signed packages
are follow-up work).

Board definition (Zephyr):
- boards/seeed/xiao_nrf54lm20b/: Kconfig, board.cmake/yml, defconfig,
  CPUapp / CPUflpr DTS + yaml, common and pinctrl dtsi, XIAO connector
  dtsi, doc/index.rst, support/openocd.cfg
- boards/pm_static_xiao_nrf54lm20b_nrf54lm20a_cpuapp.yml

MicroPython integration:
- xiao_nrf54lm20b_manifest.py, _nrf54lm20a_cpuapp.conf/.overlay
- example/boards/xiao_nrf54lm20b.py (board pin/peripheral map)
- example/boards/xiao.py: nrf54lm20b dispatch branch + XiaoPDM guard

Tests / docs:
- example/xiao_nrf54lm20b_full_test.py
- README: "XIAO nRF54LM20B (SWD baseline)" build/flash/test section

Co-Authored-By: Claude <noreply@anthropic.com>
The board was named nRF54LM20B but every SoC-level file targeted
nrf54lm20a. nRF54LM20B is a distinct SoC: NCS v3.3.0 ships a dedicated
nrf54lm20b SoC, and Nordic's own nrf54lm20dk exposes nrf54lm20a and
nrf54lm20b as separate targets. Building the 20B board on the 20A SoC
also broke runtime board detection in example/boards/xiao.py, which
keys off implementation._machine.

Switch the whole board to nrf54lm20b:
- board.yml: soc name and runner targets
- Kconfig: SOC_NRF54LM20B_* under BOARD_XIAO_NRF54LM20B_NRF54LM20B_*
- dtsi: <nordic/nrf54lm20b_cpuapp/cpuflpr.dtsi>
- board.cmake: CONFIG_SOC_NRF54LM20B_* and openocd chipname/load proc
- yaml identifiers, dts compatible/model, and the _nrf54lm20a file names
- README build commands and the cpuapp qualifier

OpenOCD CTRL-AP comments and nRF54LM20A/B comparison prose are kept
unchanged (they describe the shared debug IP / hardware delta).

Co-Authored-By: Claude <noreply@anthropic.com>
…ot config

Replace the board device tree with the updated definitions from
cumin777/platform-seeedboards (branch xiao_nrf54lm20b_main_integration)
and add the USB CDC ACM MCUboot serial-recovery configuration.

Device tree (nrf54lm20b_cpuapp_common.dtsi):
- Flash layout: shipped 24 KiB no-log mcuboot + slot0 app (1784 KiB
  @0x6000, imgtool slot_size 0x1BE000) + slot1 loader (116 KiB) +
  storage (16 KiB) -- single-app-slot + loader scheme, replacing the
  old 68 KiB / A/B layout.
- Console/shell/mcumgr moved from uart20 to the USB CDC ACM device
  (cdc_acm_uart on &usbhs); +zephyr,boot-mode and gpregret retention;
  vregusb on; LFXO load capacitance 16000.

Board config:
- Kconfig.defconfig: source the Zephyr CDC ACM serial defconfig and
  pin the Seeed app CDC VID:PID 2886:8013 / product "XIAO_NRF54LM20B"
  (the loader CDC is 2886:0013, owned by the pre-flashed mcuboot).
- board.cmake: drop the openocd runner (USB-only flashing); jlink
  device names nRF54LM20A_M33 / nRF54LM20A_RV32.
- New mcuboot.conf + mcuboot.overlay: MCUboot serial recovery over
  USB CDC ACM, button/wait/no-app entry, RSA-3072 software signing,
  USB_DEVICE_STACK_NEXT.
- doc/index.rst: correct the nRF54LM20B description (Axon NPU).

Discard support/openocd.cfg entirely. Bootloader and KMU keys are
pre-flashed on devices; only the signed app image is built/flashed
here (signing + flash tooling in follow-up commits).

Co-Authored-By: Claude <noreply@anthropic.com>
The mcuboot.conf brought in with the platform-seeedboards DT forced
BOOT_SIGNATURE_TYPE_RSA / RSA-3072, overriding the nRF54LM20B SoC
default (Ed25519). The device's pre-flashed boot actually verifies
Ed25519 "pure" signatures with the public key in KMU -- matching the
PlatformIO flow (boards/seeed-xiao-nrf54lm20b.json signature_key_file
root-ed25519.pem, pure=true) and the GitLab boot bringup
(BOOT_SIGNATURE_TYPE_PURE + SIGNATURE_USING_KMU).

RSA-3072 and Ed25519 are mutually exclusive, so the RSA selection would
have produced images the device rejects. Switch to:
  BOOT_SIGNATURE_TYPE_ED25519 + BOOT_SIGNATURE_TYPE_PURE
  + BOOT_SIGNATURE_USING_KMU

App images are signed with the mcuboot default root-ed25519.pem.

Co-Authored-By: Claude <noreply@anthropic.com>
User-facing flashing for the XIAO nRF54LM20B -- no SWD/J-Link needed.

Flow: hold USER + press RESET to enter the MCUboot USB serial-recovery
loader (USB CDC VID:PID 2886:0013), then this helper auto-detects that
loader port and uploads the signed app image with `nrfutil mcumgr image
upload`. The bootloader and KMU public key are factory-flashed, so only
the signed application is transferred.

- xiao_nrf54lm20b_flash.py: pyserial-based loader-port detection
  (2886:0013), firmware auto-select, optional --mtu/--port, button+reset
  wait loop.
- xiao_nrf54lm20b_flash.{sh,bat}: platform wrappers (mirrors the
  xiao_nrf54lm20a_flash layout).
- .gitignore: ignore __pycache__/*.pyc so helper caches aren't committed.

Prereq: pip install nrfutil (bundles pyserial).

Co-Authored-By: Claude <noreply@anthropic.com>
… .ps1

The flasher used `nrfutil mcumgr ...`, which fails on nrfutil 8.x (the
subcommand is `mcu-manager`; `mcumgr` is not installed). Align with the
validated flow (`nrfutil mcu-manager serial image-upload`), which also
accepts a signed .bin directly.

- xiao_nrf54lm20b_flash.py: switch to `mcu-manager serial image-upload`
  (+ reset); resolve a portable bundled nrfutil before falling back to PATH
  (NRFUTIL_HOME set when a bundled home is present).
- xiao_nrf54lm20b_flash.ps1: new portable Windows flasher (WMI auto-detect
  of the 2886:0013 loader port; bundled-nrfutil resolution; zero install).
- flash_usb_dfu.cmd: double-click / cmd launcher for the .ps1.

The ~9 MB nrfutil binary is NOT committed -- it is bundled only in the
release/delivery zip so the repo stays small.

Co-Authored-By: Claude <noreply@anthropic.com>
@cumin777
cumin777 merged commit a46c7ff into Seeed-Studio:master Aug 14, 2026
2 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants