SDK upgrade guide
nRF Connect SDK 2.9 to nRF Connect SDK 3.0: what needs attention
Migratorisk's knowledge base lists 15 documented changes between nRF Connect SDK 2.9 and nRF Connect SDK 3.0 across 2 releases. 11 of them are rated likely to break code, configuration or builds that use them. Below is each change, what a scan also reviews on this path, and how to see which ones apply to your project.
Find which of these affect your firmware
Migratorisk scans your project on your own computer and reports only the changes your code, configuration and build actually touch. Your source code is not uploaded.
python -m pip install migratorisk migratorisk scan --project ./your-firmware --from ncs-2.9.0 --to ncs-3.0.0 --out report.html
Requires Python 3.12 or newer. Results are free and complete without sign-up; sharing a report with us is optional.
Set up the local scanOr answer a few questions insteadWhere the changes are
What changes between nRF Connect SDK 2.9 and nRF Connect SDK 3.0
Ordered by impact. Each item names the release that introduced it and links to the official source. A change only matters if your project uses what changed; the scan checks that.
Devicetree compatibles microchip,mcp230xx and 1 more were removed
The devicetree bindings for the Microchip mcp23xxx series have been split up. Users of microchip,mcp230xx and microchip,mcp23sxx should change their devicetree compatible values to the specific chip variant, e.g. microchip,mcp23017. The ngpios devicetree property has been removed, since it is implied by the model name. Covers 2 names.
Kconfig options CONFIG_MBEDTLS_TLS_VERSION_1_0 and 1 more were removed
The Kconfig options CONFIG_MBEDTLS_TLS_VERSION_1_0 and CONFIG_MBEDTLS_TLS_VERSION_1_1 have been removed because Mbed TLS doesn't support TLS 1.0 and 1.1 anymore since v3.0. Covers 2 names.
API BT_AUDIO_BROADCAST_CODE_SIZE was removed
BT_AUDIO_BROADCAST_CODE_SIZE has been removed and BT_ISO_BROADCAST_CODE_SIZE should be used instead.
API NET_SOCKET_SERVICE_SYNC_DEFINE_STATIC was removed
The work_q parameter to NET_SOCKET_SERVICE_SYNC_DEFINE and NET_SOCKET_SERVICE_SYNC_DEFINE_STATIC has been removed as it was always ignored.
Devicetree compatible litex,eth0 was renamed
The compatible of the LiteX ethernet controller has been renamed from litex,eth0 to litex,liteeth.
Devicetree compatible litex,uart0 was renamed
The compatible of the LiteX uart controller has been renamed from litex,uart0 to litex,uart.
Devicetree compatible microchip,mcp9808 was renamed
The existing driver for the Microchip MCP9808 temperature sensor transformed and renamed to support all JEDEC JC 42.4 compatible temperature sensors. It now uses the jedec,jc-42.4-temp compatible string instead to the microchip,mcp9808 string.
Kconfig option CONFIG_MBEDTLS_SSL_EXPORT_KEYS was removed
The Kconfig option CONFIG_MBEDTLS_SSL_EXPORT_KEYS was removed because the corresponding build symbol was removed in Mbed TLS 3.1.0 and is now assumed to be enabled.
Kconfig option CONFIG_MCUBOOT_CMAKE_WEST_SIGN_PARAMS was removed
Removed the CONFIG_MCUBOOT_CMAKE_WEST_SIGN_PARAMS Kconfig option as west sign is no longer called by the build system when signing images for MCUboot.
Kconfig option CONFIG_SPI_NOR_IDLE_IN_DPD was removed
CONFIG_SPI_NOR_IDLE_IN_DPD has been removed from the CONFIG_SPI_NOR driver. An enhanced version of this functionality can be obtained by enabling pm-device-runtime on the device (Tunable with CONFIG_SPI_NOR_ACTIVE_DWELL_MS).
Kconfig option CONFIG_UART_LITEUART was renamed
LiteX: CONFIG_UART_LITEUART has been renamed to CONFIG_UART_LITEX.
Bluetooth automatic advertiser resumption macros deprecated
Zephyr 4.0 deprecates BT_LE_ADV_OPT_CONNECTABLE, BT_LE_ADV_OPT_ONE_TIME and BT_LE_ADV_CONN (automatic advertiser resumption); later releases drop the related shorthand macros. Covers 4 names.
ZMS legacy name-cache Kconfig options must be removed
NCS 3.0 says projects migrating the ZMS settings backend must remove CONFIG_SETTINGS_ZMS_NAME_CACHE and CONFIG_SETTINGS_ZMS_NAME_CACHE_SIZE from configuration files unless intentionally staying on the legacy backend. Covers 2 names.
CRACEN microcode initialization moved to sysbuild
NCS 3.0 moves CRACEN initialization control from image-level CONFIG_CRACEN_LOAD_MICROCODE to sysbuild-level SB_CONFIG_CRACEN_MICROCODE_LOAD_ONCE.
Kconfig option CONFIG_NET_SOCKETS_POLL_MAX is deprecated
Deprecated the CONFIG_NET_SOCKETS_POLL_MAX option in favour of CONFIG_ZVFS_POLL_MAX.
What a scan of this path also reviews
Beyond the documented changes, Migratorisk reviews these upgrade risks for nRF Connect SDK projects on this path. Each one is reported only when the project shows the trigger.
MCUboot-related header missing in build log
When it applies: Build log reports a missing MCUboot or boot utility header.
Why it matters: Include paths and module dependencies can shift during SDK upgrades.
What to do: Fix MCUboot/module dependency resolution before source API cleanup.
Bootloader-related undefined reference found
When it applies: Build log reports an unresolved bootloader or flash-map symbol.
Why it matters: Bootloader and flash-map dependencies are commonly exposed by migration builds.
What to do: Check MCUboot, flash map, and image manager dependencies before changing application logic.
Build log contains devicetree binding error
When it applies: Build log reports a devicetree binding error.
Why it matters: Binding and board model changes can break overlays and custom boards.
What to do: Fix devicetree binding errors before source-level API cleanup.
Build log contains undefined Kconfig symbol
When it applies: Build log reports an undefined Kconfig symbol.
Why it matters: Removed or renamed symbols are common during NCS and Zephyr upgrades.
What to do: Resolve undefined symbols before chasing later cascading build errors.
Static partition manager file present
When it applies: pm_static.yml exists and may need validation during the upgrade.
Why it matters: MCUboot slots, settings, and image sizes are common migration failure points.
What to do: Validate partition addresses, slot sizes, and generated partition output after the sysbuild transition.
MCUboot primary and secondary slot sizes differ
When it applies: MCUboot slot sizes differ in pm_static.yml.
Why it matters: Slot mismatch can break image swapping, DFU, or upgraded image layout assumptions.
What to do: Recalculate primary and secondary slots and compare generated partitions after upgrade.
child_image used with sysbuild target
When it applies: Project uses legacy child_image configuration without sysbuild.conf.
Why it matters: NCS 3.0 projects commonly need sysbuild-aware image configuration.
What to do: Review bootloader/image configuration and add sysbuild.conf where needed.
MCUboot enabled in image config without sysbuild config
When it applies: MCUboot is enabled but no sysbuild.conf was found.
Why it matters: Bootloader selection and image configuration can move into sysbuild-aware settings.
What to do: Validate SB_CONFIG_BOOTLOADER_MCUBOOT and bootloader image configuration.
Sysbuild-controlled option found in image config
When it applies: A likely sysbuild-controlled Kconfig option is set in image configuration.
Why it matters: Sysbuild can force or override selected image Kconfig options.
What to do: Move applicable settings to sysbuild configuration using SB_CONFIG equivalents where supported.
Custom board files found
When it applies: Project contains custom board files.
Why it matters: Custom boards may need hardware model and devicetree migration review.
What to do: Review board structure against the NCS 3.0 hardware model guidance.
Board revision overlay pattern found
When it applies: Board revision overlay naming was detected.
Why it matters: Board revision handling can change with hardware model updates.
What to do: Verify board revision selection and overlay application after upgrade.
Old hardware model indicator found
When it applies: Board devicetree content needs hardware model review.
Why it matters: Hardware model changes may require board directory or metadata updates.
What to do: Compare custom board files with NCS 3.0 hardware model migration docs.
Generic missing header in build log
When it applies: Build log reports a missing header.
Why it matters: Missing headers often indicate module, include path, or API movement after SDK updates.
What to do: Identify whether the header moved, the module is missing, or the API was removed.
Undefined reference found in build log
When it applies: Build log reports an undefined reference.
Why it matters: Link failures can be caused by missing modules, changed Kconfig dependencies, or removed APIs.
What to do: Resolve earlier Kconfig/devicetree errors first, then review the missing symbol owner.
Hardcoded Zephyr or NCS path found
When it applies: CMake contains a hardcoded SDK path.
Why it matters: Hardcoded SDK paths often break when workspaces move or versions change.
What to do: Replace hardcoded paths with west/CMake discovery mechanisms.
External flash partition hint found
When it applies: External flash partitioning is present.
Why it matters: External flash layouts can affect MCUboot, secondary slots, and generated partitions.
What to do: Compare generated partitions before and after upgrade.
Settings partition present with OTA-oriented profile
When it applies: Settings storage appears alongside OTA or MCUboot usage.
Why it matters: Settings partitions can interact with DFU, image slots, and flash layout changes.
What to do: Verify settings persistence and DFU behavior on upgraded images.
MCUboot slot size may be tight
When it applies: An MCUboot slot is at or below 0x40000 bytes.
Why it matters: SDK upgrades can increase image size and expose tight partition layouts.
What to do: Check post-upgrade image size against slot size before runtime validation.
MCUboot signing key configured
When it applies: MCUboot signing key configuration is present.
Why it matters: Signing paths and image generation settings should be verified before release builds.
What to do: Confirm signing key path, image signing output, and release build process after upgrade.
Multiple legacy image configuration files found
When it applies: Project has application and child image configuration files.
Why it matters: Multi-image configuration may need to be split or moved into sysbuild-aware locations.
What to do: Inventory app, bootloader, and child image config ownership before the first upgraded build.
VelocityCreate
Want us to handle the upgrade?
VelocityCreate can review your assessment, agree on the migration scope, and carry out the firmware changes and agreed verification. Discuss your deadline, hardware, and requirements with an embedded engineer.
Discuss my migrationBook a technical callThe initial discussion is free. Implementation is quoted separately.
Related upgrade paths
- nRF Connect SDK 2.6 to nRF Connect SDK 3.0
- nRF Connect SDK 2.9 to nRF Connect SDK 3.4
- nRF Connect SDK 3.0 to nRF Connect SDK 3.1
Generated from the rule catalog of Migratorisk 0.3.0. This is an automated summary of published SDK changes, not a review of your project, and it does not replace builds and device tests. How the scanner is validated.