Skip to content

Move nRF54L05/L10/L15 to the s145 10.0.1 SoftDevice - #4

Open
cvaldess wants to merge 2 commits into
meshtastic:masterfrom
cvaldess:pr/s145-10.0.1
Open

cvaldess wants to merge 2 commits into
meshtastic:masterfrom
cvaldess:pr/s145-10.0.1

Conversation

@cvaldess

@cvaldess cvaldess commented Oct 15, 2026 •

Copy link
Copy Markdown

First of the three PRs for the move to s145 10.0.1, in the order @caveman99 set in andyshinn/nRF54_Arduino#1: this bootloader first, released so the hex files are on the tag; then the core, meshtastic/nRF54_Arduino#9; then the platform, meshtastic/platform-nordicnrf54#3, moving both pins and the boards together.

It's @andyshinn's c4778bd and 1d14806 from ashinn/nrf54lm20a, cherry-picked onto master with his authorship:

  • c4778bd moves the nrf_nvic.h and ble_l2cap.h shims out of the vendored SoftDevice tree into src/. 1d14806 needs it: without it the build loses both headers when the 9.0.0 directory goes away.
  • 1d14806 moves the L05/L10/L15 to 10.0.1: one SoftDevice hex per SoC (SD_CHIP instead of SD_CHIP_FAMILY), SOFTDEVICE_REGION_START at 0x5A800 / 0xDA800 / 0x15A800, and the DFU FWID from 0x3024 to 0x310D. It also fixes the L05 and L10 being handed the L15's 9.0.0 hex. Master has no nRF54LM20A support yet, so its branches in CMakeLists.txt and dfu_types.h, its README column and the MCU_STARTUP selection are left out; the commit message says so.

Migration

This bootloader only runs with the 10.0.1 SoftDevice, and the v0.3.0 bootloader can't be updated by DFU (no MBR). Boards on 9.0.0 need a one-time reflash over SWD of the SoftDevice, this bootloader and an application built for 10.0.1 (the XIAO boards through their onboard CMSIS-DAP).

  • Without a chip erase, InternalFS and the settings page stay where they are, so the node keeps its config and BLE bonds. flash-sd and flash-bootloader only erase the sectors they write, so they keep them (then the application as usual).
  • With a chip erase both are lost: flash-all starts with --eraseall.

Until then, don't send a DFU package built for 10.0.1 to a board on v0.3.0: the single-bank code erases bank 0 when the start packet arrives and only checks --sd-req afterwards, so the board is left in the bootloader with no application. #3 fixes that for later updates (the package is checked before bank 0 is invalidated) and is meant to go in before this release.

Testing

Built for all five boards (nrf54l05dk, nrf54l10dk, nrf54l15dk, xiao_nrf54l15, xiao_nrf54l15_sense, MinSizeRel as in CI); each one forwards to its own 10.0.1 base.

nRF54L15-DK, from bootloader v0.3.0 + s145 9.0.0: flashed this bootloader, the 10.0.1 SoftDevice and a Meshtastic build for 10.0.1 over SWD, without a chip erase. It boots into the application, which keeps its config and BLE bonds: an existing bond reconnected, and a fresh LESC pairing worked. Details in meshtastic/nRF54_Arduino#9.

Not covered: the L05, L10 and XIAO boards on hardware, serial DFU and BLE OTA through this bootloader.

Summary by CodeRabbit

  • New Features
    • Added support for SoftDevice S145 version 10.0.1 across the nRF54L05, nRF54L10, and nRF54L15, including updated BLE and system APIs.
    • Added clearer BLE documentation for unavailable RSSI readings.
  • Updates
    • Updated firmware package instructions and identifiers for the new SoftDevice release. Devices using the previous 0x3024 identifier require a SoftDevice reflash.
    • Updated SoftDevice memory addresses for supported chips.

andyshinn and others added 2 commits October 15, 2026 13:02
…ice tree

No S145 release ships either header; they belong to this port. Keeping them
under s145_nrf54l_9.0.0 ties the build to that one SoftDevice directory.
src/ precedes the SoftDevice API directory on the include path.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Brings every variant onto one SoftDevice version, matching what
nRF54LM20A already used. Sourced from nrfconnect/sdk-nrf-bm
components/softdevice/nrf54l/s145 (git_revision 75a7b53a).

10.0.1 ships a separate hex per SoC, where 9.0.0 shipped one for the
family, so SD_CHIP_FAMILY becomes SD_CHIP and names the SoC. That also
fixes a real bug: nrf54l05 and nrf54l10 were both handed the 9.0.0 hex,
which is built for nRF54L15 and links at 0x158C00. Flashing it to an
L05 or L10 put the SoftDevice outside the part's RRAM.

10.0.1 is 5.4 KB smaller than 9.0.0, so it starts 0x1C00 higher:
0x5A800 / 0xDA800 / 0x15A800. SOFTDEVICE_REGION_START has to follow or
is_sd_existed() reads the wrong address, finds no magic number and
quietly falls back to serial DFU. The bootloader settings page stays
put, so the freed 7 KB goes to the application data region and existing
app data survives the upgrade.

No API migration: the s145 migration document has no 10.0.1 section,
its newest entry is 9.0.0, and the 10.0.1 headers are byte-identical to
the ones already vendored for nRF54LM20A. The SoftDevice RAM
requirement drops from 0x1780 to 0x1480, so the 0x20004800 split stays
valid.

The DFU FWID changes from 0x3024 to 0x310D, so --sd-req must be updated
when generating packages.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

[cvaldess: cherry-picked onto meshtastic master, which has no nRF54LM20A
support yet: the nRF54LM20A branches in CMakeLists.txt and dfu_types.h, its
README column and the MCU_STARTUP selection are left out; the L05/L10/L15
changes are as in the original.]
@coderabbitai

coderabbitai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 6141222a-2e49-4630-9511-31335c518c52
📥 Commits

Reviewing files that changed from the base of the PR and between dbbaa99 and fb2f553.

📒 Files selected for processing: 66
  • CMakeLists.txt
  • README.md
  • lib/sdk11/components/libraries/bootloader_dfu/dfu_types.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/ble.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/ble_err.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/ble_gap.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/ble_gatt.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/ble_gattc.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/ble_gatts.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/ble_hci.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/ble_ranges.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/ble_types.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/nrf_error.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/nrf_error_sdm.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/nrf_error_soc.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/nrf_sd_def.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/nrf_sd_isr.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/nrf_sdm.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/nrf_soc.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_API/include/nrf_svc.h
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_license-agreement.txt
  • lib/softdevice/s145_nrf54l05_10.0.1/s145_nrf54l05_10.0.1_softdevice.hex
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/ble.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/ble_err.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/ble_gap.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/ble_gatt.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/ble_gattc.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/ble_gatts.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/ble_hci.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/ble_ranges.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/ble_types.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/nrf_error.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/nrf_error_sdm.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/nrf_error_soc.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/nrf_sd_def.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/nrf_sd_isr.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/nrf_sdm.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/nrf_soc.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_API/include/nrf_svc.h
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_license-agreement.txt
  • lib/softdevice/s145_nrf54l10_10.0.1/s145_nrf54l10_10.0.1_softdevice.hex
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/ble.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/ble_err.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/ble_gap.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/ble_gatt.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/ble_gattc.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/ble_gatts.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/ble_hci.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/ble_ranges.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/ble_types.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/nrf_error.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/nrf_error_sdm.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/nrf_error_soc.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/nrf_sd_def.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/nrf_sd_isr.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/nrf_sdm.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/nrf_soc.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_API/include/nrf_svc.h
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_license-agreement.txt
  • lib/softdevice/s145_nrf54l15_10.0.1/s145_nrf54l15_10.0.1_softdevice.hex
  • lib/softdevice/s145_nrf54l_9.0.0/s145_nrf54l_9.0.0_softdevice.hex
  • linker/nrf54l05.ld
  • linker/nrf54l10.ld
  • linker/nrf54l15.ld
  • src/ble_l2cap.h
  • src/nrf_nvic.h

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

📝 Walkthrough

This change updates the project to use SoftDevice S145 10.0.1 with SoC-specific hex files and revised memory addresses. It adds nRF54L10 and nRF54L15 API headers and updates selected nRF54L05 API definitions.

Changes: S145 10.0.1 support

Layer / File(s) Summary
SoftDevice selection and memory layout
CMakeLists.txt, README.md, lib/sdk11/components/libraries/bootloader_dfu/dfu_types.h, linker/*.ld
CMake selects the SoftDevice hex file by SoC variant. Documentation, DFU examples, DFU region addresses, and linker comments refer to version 10.0.1 and the updated addresses.
nRF54L05 API updates
lib/softdevice/s145_nrf54l05_10.0.1/...
The headers update version and flash-size definitions, add an unavailable-RSSI constant, and update timeslot timer references. Other listed headers are reformatted or replaced without changes to their described declarations or behavior.
SoftDevice Manager and SoC APIs
lib/softdevice/s145_nrf54l10_10.0.1/.../include/*, lib/softdevice/s145_nrf54l15_10.0.1/.../include/nrf_*
The new headers define SoftDevice Manager and SoC APIs, error codes, reserved resources, interrupt offsets, and SVC calling conventions.
Common BLE APIs and data types
lib/softdevice/s145_nrf54l10_10.0.1/.../include/ble*, lib/softdevice/s145_nrf54l15_10.0.1/.../include/ble*
The new headers define common BLE types and identifiers, error and range constants, HCI and GATT constants, and BLE stack configuration, event, UUID, and option APIs.
GATT Client and Server APIs
lib/softdevice/s145_nrf54l10_10.0.1/.../include/ble_gatt*, lib/softdevice/s145_nrf54l15_10.0.1/.../include/ble_gatt*
The new headers define GATT Client discovery, read, write, and event interfaces, and GATT Server service, attribute, value, authorization, and event interfaces.

Priority: ➖ Normal

Estimated code review effort: 4 (Complex) | ~45 minutes

Change: Feature

Merge Risk: ⚪ Minimal · up to fb2f5

This change moves the nRF54L05, L10, and L15 boards to the s145 10.0.1 SoftDevice, using a separate SoftDevice image and updated addresses for each SoC. No concrete defects were identified. Boards still running 9.0.0 need the one-time SWD reflash described in the README.

Pre-merge checks: Passed 4 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 2 functions across 40 files. (8 skipped: 8… Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks: 4 passed
Check name Status Explanation
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly and concisely describes the primary change: moving the nRF54L05, nRF54L10, and nRF54L15 configurations to the s145 10.0.1 SoftDevice.
Full details: Docstring Coverage

Explanation

Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 2 functions across 40 files. (8 skipped: 8 unsupported.)

  • Fix all pre-merge checks with AI
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

A rabbit checks the hex files by moonlit light
New SoC paths are sorted just right
GATT types hop into place
SoftDevice numbers find their space
Then quiet paws review the change tonight

Comment @coderabbitai help to get the list of available commands.

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