Home › SDK migration

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.

15documented changes
11rated will or likely to break
26review checks on this path

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 instead

Where the changes are

Build settings · 7Hardware description · 4Application code · 3Security and keys · 1

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.

Likely to break

Devicetree compatibles microchip,mcp230xx and 1 more were removed

Hardware description · Zephyr 4.0.0 · Source

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.

Likely to break

Kconfig options CONFIG_MBEDTLS_TLS_VERSION_1_0 and 1 more were removed

Build settings · Zephyr 4.0.0 · Source

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.

Likely to break

API BT_AUDIO_BROADCAST_CODE_SIZE was removed

Application code · Zephyr 4.0.0 · Source

BT_AUDIO_BROADCAST_CODE_SIZE has been removed and BT_ISO_BROADCAST_CODE_SIZE should be used instead.

Likely to break

API NET_SOCKET_SERVICE_SYNC_DEFINE_STATIC was removed

Application code · Zephyr 4.0.0 · Source

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.

Likely to break

Devicetree compatible litex,eth0 was renamed

Hardware description · Zephyr 4.0.0 · Source

The compatible of the LiteX ethernet controller has been renamed from litex,eth0 to litex,liteeth.

Likely to break

Devicetree compatible litex,uart0 was renamed

Hardware description · Zephyr 4.0.0 · Source

The compatible of the LiteX uart controller has been renamed from litex,uart0 to litex,uart.

Likely to break

Devicetree compatible microchip,mcp9808 was renamed

Hardware description · Zephyr 4.0.0 · Source

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.

Likely to break

Kconfig option CONFIG_MBEDTLS_SSL_EXPORT_KEYS was removed

Build settings · Zephyr 4.0.0 · Source

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.

Likely to break

Kconfig option CONFIG_MCUBOOT_CMAKE_WEST_SIGN_PARAMS was removed

Build settings · Zephyr 4.0.0 · Source

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.

Likely to break

Kconfig option CONFIG_SPI_NOR_IDLE_IN_DPD was removed

Build settings · Zephyr 4.0.0 · Source

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).

Likely to break

Kconfig option CONFIG_UART_LITEUART was renamed

Build settings · Zephyr 4.0.0 · Source

LiteX: CONFIG_UART_LITEUART has been renamed to CONFIG_UART_LITEX.

Needs attention

Bluetooth automatic advertiser resumption macros deprecated

Application code · Zephyr 4.0.0 · Source

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.

Needs attention

ZMS legacy name-cache Kconfig options must be removed

Build settings · nRF Connect SDK 3.0.0 · Source

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.

Needs attention

CRACEN microcode initialization moved to sysbuild

Security and keys · nRF Connect SDK 3.0.0 · Source

NCS 3.0 moves CRACEN initialization control from image-level CONFIG_CRACEN_LOAD_MICROCODE to sysbuild-level SB_CONFIG_CRACEN_MICROCODE_LOAD_ONCE.

Worth checking

Kconfig option CONFIG_NET_SOCKETS_POLL_MAX is deprecated

Build settings · Zephyr 4.0.0 · Source

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 call

The initial discussion is free. Implementation is quoted separately.

Related upgrade paths

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.