Skip to content

Bump MDK to 8.75.1 and add nRF54LM20A device headers - #8

Open
cvaldess wants to merge 1 commit into
meshtastic:masterfrom
cvaldess:pr/mdk-8.75.1
Open

cvaldess wants to merge 1 commit into
meshtastic:masterfrom
cvaldess:pr/mdk-8.75.1

Conversation

@cvaldess

@cvaldess cvaldess commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

First of the pieces @andyshinn suggested in andyshinn#1 for bringing his nRF54LM20A work over: his MDK bump, 2aa44f6 from ashinn/nrf54lm20a, cherry-picked onto master unchanged and with his authorship. It applies cleanly, and only touches cores/nRF5/nordic/nrfx/.

What it changes

From the commit message: MDK 8.73.2 → 8.75.1, the MDK pinned by NCS 3.3.0 and the first with the production nRF54LM20A headers (NRF54LM20A_XXAA, where 8.73.2 only knew NRF54LM20A_ENGA_XXAA). The LM20A branches in the nrfx dispatch are renamed from the ENGA names, content unchanged. nrfx itself stays at 4.2.0.

The move to the s145 10.0.1 SoftDevice is not in here; it will be a separate PR.

Effect on the nRF54L15

I built Meshtastic's nrf54l15dk env twice from the same firmware tree (clean builds), once against master and once against master + this commit, and compared the two ELFs:

  • Only SystemInit changes (+16 bytes): RRAMC->POWER.LOWPOWERCONFIG is now read-modify-write (clear MODE, then set PowerOff) instead of a plain write of PowerOff. Every other function is the same, instruction for instruction. The remaining byte differences are pointers to code placed after SystemInit, shifted by 16 bytes (vector table and data tables). .data and .bss are unchanged.
  • The header changes that could matter on the L15 (SAADC_EASYDMA_CURRENT_AMOUNT_REGISTER_INCLUDED 0 → 1, the new TWIMxx_CORE_FREQUENCY and UARTExx_DMAEND_PRESENT) change no code in that build.
  • Both builds print the same warnings.

Testing

nRF54L15-DK, bootloader v0.3.0, s145 9.0.0. Flashed the application over SWD, then read the state over SWD without halting the CPU:

  • the CPU is running, and the reset reason is 0x40 (the debugger's reset)
  • LOWPOWERCONFIG reads 3 (PowerOff)
  • the FreeRTOS tick runs at 1024 Hz against the GRTC (3082 ticks in 3.0095 s), and GRTC TIMEOUT/WAKETIME are 5/4
  • on the mesh it sent its NodeInfo 32 s after the reset and its telemetry 30 s later, both heard by a gateway of the local mesh

Not covered: the L05 and L10 (no hardware here), and core code that the Meshtastic build doesn't link. Nothing on master builds for the LM20A yet, so this PR on its own doesn't exercise the new headers.

Summary by CodeRabbit

  • New Features

    • Added device support for the nRF54LM20A application and low-power processor domains.
    • Added memory, peripheral, interrupt, TrustZone, and compatibility definitions for the new device.
    • Added support for non-secure high-speed GPIO pad control.
    • Added radio capability definitions, internal SAADC input support, and DMA list-mode configuration for supported peripherals.
    • Added support for additional nRF54L and nRF92 device variants.
  • Bug Fixes

    • Corrected device selection and production-device configuration across supported nRF54 families.
    • Improved device initialization, errata handling, memory protection, and register configuration.

The bundled MDK was 8.73.2, which knows the nRF54LM20A only as
NRF54LM20A_ENGA_XXAA (engineering rev A) and whose nrf.h dispatched to
nrf54lm20a_enga{,_interim,_name_change}.h -- files that were never in the
tree. Production silicon, including the Seeed XIAO nRF54LM20A, identifies
as plain NRF54LM20A_XXAA, so restoring the deleted ENGA files would have
been the wrong target.

8.75.1 is the MDK pinned by NCS 3.3.0, the same SDK the s145 v10.0.1
SoftDevice is built from. It is the first version carrying production
nrf54lm20a.* headers. 8.76.0 was rejected: it additionally moves
NRF_MEMORY_PERIPHERALSAPB{S,NS}_BASE for nRF54L15, which is risk without
benefit here.

Cost to the existing L05/L10/L15 targets is small -- the per-SoC headers
change by a copyright year and one added NRF_GPIOHSPADCTRL define;
system_nrf54l.c picks up the ENGA-to-production renames; nrf54l_erratas.h
grows for the new SoCs.

The nrfx dispatch already carried NRF54LM20A branches under the ENGA name,
so this renames rather than adds: the guards in nrfx_soc_defines.h,
nrfx_irqs.h and nrfx_mdk_fixups.h, and the two nrfx_irqs_nrf54lm20a_enga_*
headers. All nine LM20A blocks were verified byte-identical to the
production blocks in upstream nrfx at the same revision, so the rename is
content-preserving.

No LM20A .svd is added; the tree carries none for any SoC.
@coderabbitai

coderabbitai Bot commented Oct 14, 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: a8d7297b-4ebe-4de4-81e5-ed25f3946a64
📥 Commits

Reviewing files that changed from the base of the PR and between 79a7ad6 and dcc160b.

📒 Files selected for processing: 66
  • cores/nRF5/nordic/nrfx/bsp/stable/soc/irqs/nrfx_irqs_nrf54lm20a_application.h
  • cores/nRF5/nordic/nrfx/bsp/stable/soc/irqs/nrfx_irqs_nrf54lm20a_flpr.h
  • cores/nRF5/nordic/nrfx/bsp/stable/soc/nrfx_irqs.h
  • cores/nRF5/nordic/nrfx/bsp/stable/soc/nrfx_mdk_fixups.h
  • cores/nRF5/nordic/nrfx/bsp/stable/soc/nrfx_soc_defines.h
  • cores/nRF5/nordic/nrfx/mdk/compiler_abstraction.h
  • cores/nRF5/nordic/nrfx/mdk/nrf.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l05.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l05_application.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l05_application_peripherals.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l05_flpr.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l05_global.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l05_interim.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l05_name_change.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l05_peripherals.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l05_types.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l05_version.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l05_xxaa_application_memory.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l05_xxaa_flpr_memory.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l10.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l10_application.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l10_application_peripherals.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l10_flpr.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l10_global.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l10_interim.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l10_name_change.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l10_peripherals.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l10_types.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l10_version.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l10_xxaa_application_memory.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l10_xxaa_flpr_memory.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l15.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l15_application.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l15_application_peripherals.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l15_flpr.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l15_global.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l15_interim.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l15_name_change.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l15_peripherals.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l15_types.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l15_version.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l15_xxaa_application_memory.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l15_xxaa_flpr_memory.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54l_erratas.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54lm20a.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54lm20a_application.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54lm20a_application_peripherals.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54lm20a_flpr.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54lm20a_global.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54lm20a_interim.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54lm20a_name_change.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54lm20a_peripherals.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54lm20a_types.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54lm20a_version.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54lm20a_xxaa_application_memory.h
  • cores/nRF5/nordic/nrfx/mdk/nrf54lm20a_xxaa_flpr_memory.h
  • cores/nRF5/nordic/nrfx/mdk/nrf_erratas.h
  • cores/nRF5/nordic/nrfx/mdk/nrf_mem.h
  • cores/nRF5/nordic/nrfx/mdk/nrf_peripherals.h
  • cores/nRF5/nordic/nrfx/mdk/system_config_sau.h
  • cores/nRF5/nordic/nrfx/mdk/system_nrf.h
  • cores/nRF5/nordic/nrfx/mdk/system_nrf54l.c
  • cores/nRF5/nordic/nrfx/mdk/system_nrf54l.h
  • cores/nRF5/nordic/nrfx/mdk/system_nrf54l_approtect.h
  • cores/nRF5/nordic/nrfx/soc/irqs/nrfx_irqs_nrf54lm20a_application.h
  • cores/nRF5/nordic/nrfx/soc/irqs/nrfx_irqs_nrf54lm20a_flpr.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

Priority: ➖ Normal

Change: Feature

Merge Risk: ⚪ Minimal · up to dcc16

This updates the bundled Nordic MDK and adds nRF54LM20A headers, which are not yet built. The author reports unchanged nRF54L15 behavior on hardware. No merge-blocking issues were found.

Pre-merge checks: Passed 5
Passed Passed checks: 5 passed
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly and concisely summarizes the two main changes: updating the MDK to 8.75.1 and adding nRF54LM20A device headers.
Docstring Coverage Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 4…
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.
  • 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 each header,
New device names join the list,
DMA fields settle into place,
Radio shortcuts mark the way,
Memory maps span the garden,
The patch hops into review.

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

@caveman99

Copy link
Copy Markdown
Member

Afaik the 10.1 softdevice asks for a different memory layout, that would be a breaking change on L15 for no real gain on that architecture. Does it make sense to split that between the trees or shoulld wee break once and early?

@cvaldess

Copy link
Copy Markdown
Contributor Author

#8 itself is only the MDK bump; it doesn't touch the SoftDevice. The 10.0.1 move would have been the next piece, so I tried it on an L15-DK first (details in andyshinn/nRF54_Arduino#1).

On the L15 the layout change is only the SoftDevice base, 0x158C00 → 0x15A800 (10.0.1 is about 7 KB smaller). The application, InternalFS and the bootloader settings page stay where they are, and after an SWD reflash without a chip erase the node kept its config and BLE bonds.

The break is getting there. A board on 9.0.0 can't do it by DFU: the bootloader can't replace the SoftDevice, and its interrupt forwarding is built for the old base. Every L15 out there would need a one-time SWD reflash of SoftDevice + bootloader. And a 10.0.1 package sent over DFU to a v0.3.0 bootloader erases the application before it's rejected, which leaves the board in the bootloader.

So I'd split it: keep L05/L10/L15 on 9.0.0 and use 10.0.1 only for the LM20A, which needs it. The platform already picks the SoftDevice per board through sd_version, so the two can live side by side. I've put the same question to @andyshinn in andyshinn#1.

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.

3 participants