Migration guide to Zephyr v4.5.0 (Working Draft)

This document describes the changes required when migrating your application from Zephyr v4.4.0 to Zephyr v4.5.0.

Any other changes (not directly related to migrating applications) can be found in the release notes.

Common

  • Header files include/zephyr/sys_clock.h is deprecated and will be removed in a future release. One shall include include/zephyr/sys/clock.h instead.

Build System

  • The minimum required CMake version is now 3.28.0. CMake 3.28.3 is shipped in the Ubuntu 24.04 LTS package repositories. Users of distributions providing an older CMake, such as Ubuntu 22.04 LTS, can get a recent version from the Kitware APT repository or with pip install cmake.

  • Support for C standard versions older than C17 has been removed after having been deprecated. The Kconfig options CONFIG_STD_C11, CONFIG_STD_C99 and CONFIG_STD_C90 have been removed. Use C17 or higher when compiling Zephyr.

  • CONFIG_LEGACY_GENERATED_INCLUDE_PATH has been deprecated, and disabled by default, includes must now be prefixed with zephyr/ for zephyr files.

  • CMake variables SOC_NAME, SOC_SERIES, SOC_FAMILY and SOC_V2_DIR have been deprecated as they duplicate variables already, the replacement variables are as follows: CONFIG_SOC, CONFIG_SOC_SERIES, CONFIG_SOC_FAMILY and SOC_FULL_DIR.

  • CONFIG_BUILD_NO_GAP_FILL has been removed. Gap filling is opt-in through CONFIG_BUILD_OUTPUT_HEX_GAP_FILL and CONFIG_BUILD_OUTPUT_S19_GAP_FILL, so simply drop the option.

  • cmake/app/boilerplate.cmake has been removed. Applications still including it directly must start their CMakeLists.txt with find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) instead.

  • Board revision Kconfig fragments named <board>_<revision>.conf are no longer read. Rename them to <board>_<revision>_defconfig.

  • zephyr_code_relocate(FILES ...) no longer expands wildcard patterns, and now fails on one. Expand the pattern with file(GLOB ...) and pass the resulting file names instead.

  • The ZephyrUnittest CMake package, deprecated since Zephyr 3.1, has been removed and west zephyr-export no longer registers it. Use find_package(Zephyr COMPONENTS unittest) instead of find_package(ZephyrUnittest).

  • west spdx --init is deprecated and will be removed in Zephyr 5.0. A build with CONFIG_BUILD_OUTPUT_META now asks CMake for the file-based API object model that west spdx reads, so generating an SBOM no longer needs the build directory to be prepared beforehand: build as usual, then run west spdx.

  • The CMake flash, debug, debugserver, attach and rtt targets have been removed. Use west flash, west debug, west debugserver, west attach and west rtt instead. The emulation run and debugserver targets are unaffected.

  • The WEST_DIR build system variable is no longer used.

  • CONFIG_DEPRECATION_TEST has been deprecated, this is because CONFIG_WARN_DEPRECATED can be used instead, simply replace lines with CONFIG_DEPRECATION_TEST=y with CONFIG_WARN_DEPRECATED=n.

  • The hardening tool’s data file scripts/kconfig/hardened.csv has been replaced by a YAML database: profiles in scripts/kconfig/hardening.yaml and per-subsystem hardening.yaml fragments next to the Kconfig files they relate to. Downstream forks that patched the CSV should migrate their entries to the new format (see Hardening Tool); out-of-tree recommendations no longer require patching the in-tree file at all and can instead be provided via -DHARDENCONFIG_EXTRA_SOURCES=. Note that CONFIG_DEBUG_COREDUMP was listed in the CSV with a syntax error and was silently skipped; it is now actually checked, so hardenconfig may report it as a new finding. Three CSV entries were dropped rather than migrated: CONFIG_STACK_USAGE, which only produces build-time .su files and does not affect the image, and CONFIG_MPU_STACK_GUARD and CONFIG_BUILTIN_STACK_GUARD, which are mutually exclusive mechanisms arbitrated by CONFIG_HW_STACK_PROTECTION — recommending both flagged the wrong one on cores with stack pointer limit registers. Enabling CONFIG_HW_STACK_PROTECTION, which is still recommended, lets the architecture pick.

Kernel

  • _k_neg_eagain has been renamed to _errno_neg_egain as errno has been migrated out of kernel into lib/libc/common.

  • k_sem_reset() no longer wakes poll waiters waiting on the semaphore. Poll waiters remain pending until the semaphore becomes available or the poll operation times out. Applications that rely on reset to wake poll waiters must use an explicit synchronization mechanism instead.

  • The CONFIG_SMP_BOOT_DELAY Kconfig option has been removed. Deferring the start of secondary CPUs to run time is now expressed per CPU in the devicetree: add the zephyr,deferred-start flag to the corresponding cpu node under /cpus (typically in a board overlay) and start the CPU later with k_smp_cpu_start() or k_smp_cpu_resume(), as before. Unlike the removed option, which skipped every secondary CPU, deferral can now be chosen for each CPU individually. Note that the flag only takes effect on cpu nodes whose devicetree binding includes cpu.yaml; a node without such a binding cannot be deferred.

  • When CONFIG_SCHED_CPU_MASK_PIN_ONLY is enabled, calling k_thread_cpu_mask_clear(), k_thread_cpu_mask_enable_all(), or k_thread_cpu_mask_disable() now triggers an assertion instead of silently producing an invalid state. Applications using these functions in PIN_ONLY mode must be updated to use k_thread_cpu_pin() instead.

  • CONFIG_SCHED_CPU_MASK is no longer restricted to CONFIG_SCHED_SIMPLE. Projects that previously selected SCHED_SCALABLE or SCHED_MULTIQ and worked around the limitation by keeping SCHED_SIMPLE for affinity purposes can now use their preferred backend directly.

  • k_sleep() and k_usleep() are no longer system calls of their own. They are now inline wrappers around the new k_sleep_ticks() system call, so that the compiler can fold or discard their unit conversions. Their prototypes, semantics and return values are unchanged, and they have moved from include/zephyr/kernel.h to a new include/zephyr/sleep.h which kernel.h includes. Code calling them needs no change. Out of tree code taking their address, or relying on K_SYSCALL_K_SLEEP or K_SYSCALL_K_USLEEP, must be updated to use k_sleep_ticks() instead. Note that it reports an early wakeup from K_FOREVER as K_TICKS_FOREVER, where k_sleep() returns -1.

  • The sys_port_trace_k_thread_sleep_*(), sys_port_trace_k_thread_msleep_*() and sys_port_trace_k_thread_usleep_*() hooks are replaced by sys_port_trace_k_thread_sleep_ticks_enter() and sys_port_trace_k_thread_sleep_ticks_exit(), since k_sleep_ticks() is now the only one of the four that is not inline. The exit hook reports the time left to sleep in ticks, so a backend that presented it as milliseconds should convert, for instance with k_ticks_to_ms_ceil64(). Out of tree tracing backends defining any of the retired hooks must be updated.

  • k_futex is no longer a kernel object and the corresponding type K_OBJ_FUTEX has been removed. Any user-accessible memory can be used as futex address. The error -EINVAL can no longer happen on futex operations.

  • The object core framework no longer links objects into per-type lists through a node in the object. Statically defined objects are enumerated in place and objects initialized at run time are referenced from a bounded registry sized by CONFIG_OBJ_CORE_MAX_DYNAMIC_OBJECTS. The node member of k_obj_core and the list member of k_obj_type are removed; tools that walked those lists must use k_obj_type_walk_locked() or k_obj_type_walk_unlocked(). K_OBJ_TYPE_DEFINE now defines the k_obj_type variable itself, so a separate declaration of that variable must be dropped. Objects located in a thread’s stack or in the interrupt stack are no longer registered, and CONFIG_OBJ_CORE selects CONFIG_THREAD_STACK_INFO, which adds the stack information fields to every k_thread. The new CONFIG_OBJ_CORE_QUEUE, enabled by default, adds an object core to every k_queue; as FIFOs and LIFOs embed a queue, they are reported by both their own object type and the queue type.

  • Object tracking (CONFIG_TRACING_OBJECT_TRACKING) is now provided by the object core framework, which it selects. The _track_list_k_* list heads, the SYS_PORT_TRACK_NEXT() macro, the sys_track_*_init() hooks and the include/zephyr/tracing/tracking.h header are removed. Code that walked the tracking lists must use k_obj_type_walk_locked() or k_obj_type_walk_unlocked() with the object type found by k_obj_type_find().

Boards

  • On NXP LPC54xxx, CONFIG_LPC54XXX_SRAM2_CLOCK has been replaced by CONFIG_SOC_SERIES_LPC54XXX_SRAM_CLOCKS. The old name fitted while the LPC54114 was the only SoC in the series, where CMSIS SystemInit() enables just SRAM2. On the LPC546xx it enables SRAM2 and SRAM3, so the option now covers more than the one bank it was named after. Both default to y. A configuration that assigned the old symbol has to be updated, and fails to build until it is.

  • On RP2040 and RP2350, the vreg node (raspberrypi,core-supply-regulator) is now disabled by default instead of okay. Out-of-tree boards that need this regulator must set status = "okay" on the &vreg node.

    On RP2040, the regulator-always-on and regulator-allowed-modes = <REGULATOR_RPI_PICO_MODE_NORMAL> properties are now set by default in the SoC dtsi. Boards that previously set them explicitly can remove those lines. (GitHub #114751)

  • On RP2350 (rpi_pico family), the hazard3 and m33 cpucluster qualifiers are deprecated in favor of hazard3_0 and m33_0, which explicitly identify the cluster as CPU0 and pave the way for dual-core support. All in-tree RP2350 boards have been migrated to the new qualifiers (e.g. rpi_pico2/rp2350a/m33 to rpi_pico2/rp2350a/m33_0). Out-of-tree boards using the bare hazard3/m33 qualifiers should rename their board files, board.yml cpucluster: entries, and Kconfig select lines to use SOC_RP2350[AB]_HAZARD3_0/SOC_RP2350[AB]_M33_0. The bare hazard3/m33 entries in soc.yml and the corresponding SOC_RP2350[AB]_HAZARD3/_M33 Kconfig symbols are deprecated and will both be removed in a future release.

  • RAK4631 WisBlock Core Module now supports the WisBlock ecosystem. A WisBlock Base Board shield (e.g. RAK19007 WisBlock Base Board 2nd Gen) is required to expose the sensor and IO slots:

    west build -b rak4631/nrf52840 --shield rakwireless_rak19007
    
  • The Kconfig options CONFIG_SRAM_SIZE and CONFIG_SRAM_BASE_ADDRESS have been deprecated, boards should instead use the devicetree zephyr.sram chosen node to specify the RAM node which will be used (whose values populated the Kconfig values). If either option is manually adjusted, it will cause CONFIG_SRAM_DEPRECATED_KCONFIG_SET to be set which indicates this deprecation.

  • The internal Nordic SoC platform Kconfig symbols NRF_PLATFORM_HALTIUM and NRF_PLATFORM_LUMOS are no longer used by in-tree code, which now relies on explicit CONFIG_SOC_SERIES_NRF54H, CONFIG_SOC_SERIES_NRF92, CONFIG_SOC_SERIES_NRF54L and CONFIG_SOC_SERIES_NRF71 checks. Both symbols are kept as deprecated stubs that default to y when the corresponding SoC series is selected and CONFIG_NRF_PLATFORM_DEPRECATED_SYMBOLS is enabled, so existing CONFIG_NRF_PLATFORM_*=y lines and depends on NRF_PLATFORM_* clauses keep building with a Kconfig deprecation warning. Out-of-tree Kconfig, CMake and code using these symbols should be updated:

  • Aesc Silicon elemrv board is renamed to elemrv_flask_n.

  • The STMicroelectronics stm32mp157c_dk2 board has been renamed to stm32mp157x_dk2 and now references both SoC variants. Build for the STM32MP157C-DK2 with -b stm32mp157x_dk2/stm32mp157cxx and for the STM32MP157F-DK2 with -b stm32mp157x_dk2/stm32mp157fxx. The previous -b stm32mp157c_dk2 is deprecated and now maps to stm32mp157x_dk2/stm32mp157cxx.

  • The Nordic sysbuild Kconfig option SB_CONFIG_NRF_HALTIUM_GENERATE_UICR has been renamed to SB_CONFIG_NRF_GENERATE_UICR. Update sysbuild configurations to use the new name.

  • The Nordic SoC headers <haltium_power.h> and <haltium_pm_s2ram.h> have been renamed to <soc_power.h> and <soc_pm_s2ram.h> respectively. Forwarder headers under the old names remain available and emit a #warning pointing to the new include paths. Out-of-tree code that includes the old paths should be updated:

    • #include <haltium_power.h> with #include <soc_power.h>.

    • #include <haltium_pm_s2ram.h> with #include <soc_pm_s2ram.h>.

  • The system clock on STM32H7RS-based boards (stm32h7s78_dk and nucleo_h7s3l8) has been increased to 600 MHz. This is achieved by increasing the PLL1 frequency to 300 MHz, which also affects the bus and kernel clocks, resulting in slightly higher frequencies.

  • CONFIG_GPIO is no longer enabled by default on most STM32 boards. (boards with GPIO hogs keep it enabled as GPIO is needed for hogs to work). Applications that relied on CONFIG_GPIO=y being the default will need to enable the option explicitly. (GitHub #109468)

  • Boards that use UF2 images that migrate to zephyr,mapped-partition should enable HEX output in their defconfig (CONFIG_BUILD_OUTPUT_HEX), as the UF2 image generation can no longer rely on CONFIG_FLASH_LOAD_OFFSET to determine the code address from a BIN output. HEX to UF2 is now the default (instead of BIN). (GitHub #107944)

  • Ezurio bl54l15u_dvk has been removed. The bl54l15_dvk remains available and supports both the bl54l15 and bl54l15u variants of the module, with the same features. Boards using the bl54l15u_dvk should migrate to bl54l15_dvk/nrf54l15/cpuapp or bl54l15_dvk/nrf54l15/cpuflpr as appropriate.

  • The default MCUboot signature type for the boards stm32h573i_dk and b_u585i_iot02a has been changed from RSA-3072 to EC-P256. This affects builds that have MCUboot enabled in TF-M (CONFIG_TFM_BL2). If you wish to keep using RSA-3072, you need to set CONFIG_TFM_MCUBOOT_SIGNATURE_TYPE to "RSA-3072". Otherwise, make sure to have your own signing keys of the signature type in use.

  • All Kconfigs under modules/hal_silabs/gecko were renamed from SOC_GECKO_* to SILABS_GECKO_*. Adapt your board accordingly.

  • The clock configuration for all Silabs Series 0 and Series 1 boards needs to be specified in the device tree now. The Kconfigs CONFIG_SOC_GECKO_HAS_HFRCO_FREQRANGE and CONFIG_CMU_* have been removed. See GitHub #111754 for examples of how to adapt your board.

  • On the nRF54LM20 DK, the nrf7002eb2 shield (and its nrf7002eb2_nrf7001 and nrf7002eb2_nrf7000 variants) no longer redirects the application console. Previously it disabled UART20 and rerouted the console (shell, mcumgr, and Bluetooth monitor) to UART30 to work around a pin conflict that only exists on the pre-production kit, not on the production nRF54LM20 DK. The console now stays on UART20 (VCOM1), matching the standard board behaviour, and button3/sw3 is no longer deleted. Existing users of this shield on the nRF54LM20 DK must move their serial terminal from VCOM0 back to VCOM1. The nRF54L15 DK is unaffected: its expansion header genuinely conflicts with UART20, so it keeps rerouting the console to UART30.

  • The mimxrt1180_evk Kconfig option NXP_BOARD_SPECIFIC_MPU_SETTINGS has been renamed to CONFIG_BOARD_NXP_SPECIFIC_MPU_SETTINGS, matching the BOARD_NXP_* naming used by the other NXP board options and by frdm_imxrt1186. Configurations setting CONFIG_NXP_BOARD_SPECIFIC_MPU_SETTINGS must be updated to the new name.

  • Boards must now select CONFIG_TFM_PARTITION_FIRMWARE_UPDATE_SUPPORTED if they support firmware update via TF-M.

  • CONFIG_SPI_STM32_INTERRUPT default activation is removed from STM32 based boards that used to do it. Choosing interrupt-driven vs polling SPI transfers is an application concern, not a board one. Applications that rely on interrupt-driven SPI (for example to use spi_transceive_signal() or spi_transceive_cb() without DMA) on an affected board must now explicitly enable CONFIG_SPI_STM32_INTERRUPT in their own configuration. (GitHub #116218)

  • The following board name aliases, deprecated in v4.3 or earlier, have been removed (GitHub #116657, GitHub #116750). Build for the board target the alias used to redirect to instead:

    • arduino_uno_r4_minima → arduino_uno_r4@minima

    • arduino_uno_r4_wifi → arduino_uno_r4@wifi

    • esp32c6_devkitc → esp32c6_devkitc/esp32c6/hpcore

    • esp32_devkitc_wroom/esp32/procpu and esp32_devkitc_wrover/esp32/procpu → esp32_devkitc/esp32/procpu

    • esp32_devkitc_wroom/esp32/appcpu and esp32_devkitc_wrover/esp32/appcpu → esp32_devkitc/esp32/appcpu

    • neorv32 → neorv32/neorv32/up5kdemo

    • panb511evb → panb611evb

    • raytac_an54l15q_db/nrf54l15/cpuapp → raytac_an54lq_db_15/nrf54l15/cpuapp

    • scobc_module1 → scobc_a1

    • xiao_esp32c6 → xiao_esp32c6/esp32c6/hpcore

  • The Nordic nRF52 Kconfig option CONFIG_GPIO_AS_PINRESET has been removed. Set the gpio-as-nreset property on the &uicr devicetree node instead.

  • The Nordic Kconfig options CONFIG_SOC_DCDC_NRF52X, CONFIG_SOC_DCDC_NRF52X_HV, CONFIG_SOC_DCDC_NRF53X_APP, CONFIG_SOC_DCDC_NRF53X_NET and CONFIG_SOC_DCDC_NRF53X_HV have been removed. Configure the regulators in devicetree instead: regulator-initial-mode = <NRF5X_REG_MODE_DCDC> on &reg1/&vregmain/ &vregradio, and status = "okay" on &reg0/&vregh.

  • The Nordic nRF53 Kconfig option CONFIG_BOARD_ENABLE_CPUNET has been removed. Use CONFIG_SOC_NRF53_CPUNET_ENABLE instead.

  • The esp_threadbr_ethernet shield has been removed. Existing users should build for esp_threadbr/esp32s3/procpu/ethernet instead of combining esp_threadbr/esp32s3/procpu with SHIELD=esp_threadbr_ethernet. Along with the shield, the esp_threadbr sub-board connector description has been removed, so the espressif,esp-threadbr-header binding, the esp_threadbr_header GPIO nexus node and the esp_threadbr_spi and esp_threadbr_i2c devicetree labels are gone. Out-of-tree overlays using them have to reference the SoC nodes (&spi2, &i2c0, &gpio0, &gpio1) directly. (GitHub #116956)

  • The STM32MP15 Cortex-M4 SoC Kconfig symbol SOC_STM32MP15_M4 has been renamed to CONFIG_SOC_STM32MP157CXX_M4. Out-of-tree STM32MP15 boards that selected SOC_STM32MP15_M4 must select CONFIG_SOC_STM32MP157CXX_M4 instead. (GitHub #118151)

  • On the Arduino UNO R4 WiFi, zephyr,console and zephyr,shell-uart now default to SCI9, which the on-board ESP32-S3 bridges to the USB-C connector as a USB CDC ACM port, instead of SCI2 on the D0/D1 header pins. Console output is now visible on the same port used to flash the board, with no external USB-serial adapter. Applications that relied on the console being on D0/D1 can select it again in an application overlay:

    / {
        chosen {
            zephyr,console = &uart2;
            zephyr,shell-uart = &uart2;
        };
    };
    

    The Arduino UNO R4 Minima is unaffected. (GitHub #118433)

  • The Espressif per-module devicetree include files and their SoC Kconfig symbols have been removed. A module or SIP part number describes how much flash and PSRAM a board carries, which is a property of the board rather than of the SoC, so both are now declared by the board itself.

    Every espressif/<soc>/<soc>_<module>.dtsi file is replaced by a single espressif/<soc>/<soc>.dtsi per SoC. The matching hidden Kconfig symbols, such as SOC_ESP32S3_WROOM_N8 and SOC_ESP32_WROVER_E_N16R8, are replaced by the plain SoC symbol, such as CONFIG_SOC_ESP32S3. SOC_PART_NUMBER now reports the SoC rather than the module.

    Out-of-tree Espressif boards must be updated, and fail to build until they are:

    • Include the plain SoC dtsi instead of the module one.

    • Select the plain SoC symbol in Kconfig.<board>.

    • Describe the flash in the board dts, giving both reg and a matching ranges, because the SoC dtsi no longer sets either.

      &flash0 {
          reg = <0x0 DT_SIZE_M(8)>;
          ranges = <0x0 0x0 DT_SIZE_M(8)>;
      };
      
    • Describe the PSRAM the same way, on boards that have it:

      &psram0 {
          size = <DT_SIZE_M(2)>;
      };
      

    On the dual-core ESP32, espressif/esp32/esp32_appcpu.dtsi no longer sets a flash either, so an APPCPU board dts has to declare the same flash as its PROCPU counterpart.

  • On NXP S32K148, the ENET nodes enet (nxp,enet), enet_mac (nxp,enet-mac), enet_mdio (nxp,enet-mdio) and enet_ptp_clock (nxp,enet-ptp-clock) are now disabled by default instead of okay. Out-of-tree boards that use Ethernet must set status = "okay" on these nodes.

  • The mimxrt1170_evk and mimxrt1160_evk cm7 targets and frdm_imxrt1152 now ship a static Arm MPU region table and enable CONFIG_ARM_MPU_CM7_UNMAPPED_REGION by default. The MPU therefore no longer falls back to the PRIVDEFENA background map, and addresses outside that table are no longer reachable. The table covers ITCM, DTCM, the CM4-shared OCRAM image region on the dual-core boards, the RAM backing the zephyr,sram chosen node, the FlexSPI NOR window and the peripheral aperture, but not the remaining on-chip banks: ocram1 and ocram2 on mimxrt1170_evk and frdm_imxrt1152, and ocram_combined on mimxrt1160_evk.

    Applications that place data in one of those banks must claim it explicitly with a zephyr,memory-attr node, which is then given an MPU region of its own, as the in-tree samples/subsys/ipc samples do for the memory they share with the CM4. Setting CONFIG_ARM_MPU_CM7_UNMAPPED_REGION to n restores the previous behavior.

  • The Silabs Kconfig option CONFIG_SOC_SILABS_IMAGE_PROPERTIES has been renamed to CONFIG_SOC_VENDOR_SILABS_IMAGE_PROPERTIES.

  • The Silabs Kconfig option CONFIG_SOC_SILABS_PM_LOW_INTERRUPT_LATENCY has been renamed to CONFIG_SOC_VENDOR_SILABS_PM_LOW_INTERRUPT_LATENCY.

  • The stm32h573i_dk, stm32h5f5j_dk disco kit are now adopting the mspi controller model. This is the next step of the migration to mspi stm32 support. For both boards, declare the xspi node as st,stm32-xspi-controller compatible.

  • The stm32l562e and stm32h735g_disco kit are now adopting the mspi controller model. This is the next step of the migration to mspi stm32 support. For that board, declare the ospi node as st,stm32-ospi-controller compatible. The stm32l5 and stm32h735 devices DTS will be updated once all the target boards are changed.

Device Drivers and Devicetree

  • The DEVICE_API macro is now mandatory for declaring device driver API instances of any upstream driver class, including in out-of-tree drivers. DEVICE_API_GET now asserts that the API belongs to the requested class, which requires the instance to live in the class’s iterable section. Out-of-tree driver classes that embed an upstream API as their first member must also declare the relationship with DEVICE_API_EXTENDS, so that DEVICE_API_GET for the parent class succeeds on devices implementing the child API. See Driver APIs for details.

ADC

  • The girqs and pcrs properties (array type) of microchip,xec-adc have been replaced by encoded girqs (using MCHP_XEC_ECIA_GIRQ_ENC macros) and pcr-scr (int type) for encoded PCR register index and bit position (GitHub #105658).

  • The CONFIG_LPADC_DO_OFFSET_CALIBRATION option is now only meaningful when CONFIG_ADC_MCUX_LPADC is enabled, and its default y is now scoped to that condition. In-tree boards no longer enable it explicitly in their defconfigs since the default already covers them.

  • The CONFIG_LPADC_CHANNEL_COUNT Kconfig option has been removed. The NXP LPADC driver now treats hardware command slots as logical ADC channels and derives the number of logical channels per instance from the channel child nodes declared for that instance in devicetree, so unused command slots no longer consume RAM. Applications that lowered the Kconfig option to save RAM should simply drop it. An instance that declares no channel node keeps the full hardware capacity available, so applications that only ever configure channels at runtime through adc_channel_setup() are unaffected; applications that mix both must declare in devicetree the highest channel identifier they set up at runtime. Declaring a channel identifier beyond the number of CMD registers implemented by the SoC is now a build error instead of a runtime HAL assertion, and adc_read() now rejects an empty channel mask, or one selecting channels beyond that limit, with -EINVAL instead of silently ignoring it (GitHub #116995).

Analog Devices

  • CONFIG_NUM_IRQS is now computed automatically for all MAX32 SoCs from the devicetree, based on active (status = "okay";) devices, using the dt_highest_controller_irq_number Kconfig preprocessor function. The hardcoded per-SoC values have been removed, and the resulting IRQ table is typically considerably smaller than before. Applications which register custom ISRs (using IRQ_CONNECT()) may encounter build failures such as the following due to CONFIG_NUM_IRQS having a lower value:

    gen_isr_tables.py: error: IRQ 88 (offset=0) exceeds the maximum of 54
    

    Explicitly set CONFIG_NUM_IRQS to an appropriate value to solve these issues. (The following documentation page explains how to do it)

    Applications that install ISRs at runtime with irq_connect_dynamic() are not covered by this build-time check and must be reviewed manually.

Audio Codec

  • The audio codec driver backend API now uses audio_codec_driver_api instead of struct audio_codec_api.

    Out-of-tree audio codec drivers must rename their backend API struct definitions and switch their API instances to DEVICE_API(audio_codec, ...). See GitHub #110631 for examples of how in-tree drivers have been updated. Application code using the audio_codec_... APIs is not impacted.

Clock Control

  • The Nordic Kconfig option CONFIG_NRFS_LOCAL_DOMAIN_DVFS_SCALE_DOWN_AFTER_INIT has been removed. Use CONFIG_CLOCK_CONTROL_NRF_HSFLL_LOCAL_REQ_LOW_FREQ instead.

  • The nxp,imxrt11xx-arm-pll binding now uses loop-div and post-div for ARM PLL configuration. The legacy clock-mult and clock-div properties remain supported but are deprecated. Existing RT11xx overlays should be updated using the mapping loop-div = clock-mult * 2 and post-div = clock-div.

  • SiWx91x clock control has been split into three managers (silabs,siwx91x-cmu-aon, silabs,siwx91x-cmu-ulp, silabs,siwx91x-cmu-hp). The legacy silabs,siwx91x-clock binding and clock0 node are removed. Out-of-tree boards and overlays must update clocks phandles to the matching CMU and use the updated SIWX91X_CLK_* IDs from siwx91x-clock.h. For example, clocks = <&clock0 SIWX91X_CLK_UART0>; becomes clocks = <&cmu_hp SIWX91X_CLK_UART0>;.

Clock control nrf deprecation

The Clock Control driver has been updated for the following clocks on nRF52, nRF53, nRF91, and nRF54L Series devices:

  • HFCLK

  • LFCLK

  • XO

  • XO24M

  • HFCLK192M

  • HFCLKAUDIO

To restore the legacy driver implementation, set CONFIG_CLOCK_CONTROL_NRF to y.

To migrate your code from zephyr v4.4.0 to zephyr v4.5.0, complete the following steps:

  1. Enable each application-controlled clock in the application-specific or board-specific devicetree overlay file.

    This enables the corresponding clock driver. For example:

    /* if nRF54L XO is to be controlled */
    &xo {
        status = "okay";
    };
    
    /* if nRF52, nRF53 HFCLK is to be controlled */
    &hfclk {
        status = "okay";
    };
    
    /* if nRF52, nRF53, nRF91 or nRF54L LFCLK is to be controlled */
    &lfclk {
        status = "okay";
    };
    
    /* if HFCLK192M is to be controlled */
    &hfclk192m {
        status = "okay";
    };
    
    /* if XO24M is to be controlled */
    &xo24m {
        status = "okay";
    };
    
    /* if HFCLKAUDIO is to be controlled */
    &hfclkaudio {
        status = "okay";
    };
    
  2. Rename the following Kconfig options:

  3. Move the following Kconfig options to the nordic,nrf-clock-lfclk devicetree node:

    • Replace CONFIG_CLOCK_CONTROL_NRF_K32SRC_FREQUENCY with the k32src-frequency property.

    • Replace CONFIG_CLOCK_CONTROL_NRF_SOURCE choice with the k32src enum property.

    • Replace CLOCK_CONTROL_NRF_K32SRC_RC and NRFX_CLOCK_LF_SRC_RC with the k32src = "rc".

    • Replace CLOCK_CONTROL_NRF_K32SRC_XTAL and NRFX_CLOCK_LF_SRC_XTAL with the k32src = "xtal".

    • Replace CLOCK_CONTROL_NRF_K32SRC_SYNTH and NRFX_CLOCK_LF_SRC_SYNTH with the k32src = "synth".

    • Replace CLOCK_CONTROL_NRF_K32SRC_EXT_LOW_SWING and NRFX_CLOCK_LF_SRC_LOW_SWING with the k32src = "ext_low_swing".

    • Replace CLOCK_CONTROL_NRF_K32SRC_EXT_FULL_SWING and NRFX_CLOCK_LF_SRC_FULL_SWING with the k32src = "ext_full_swing".

    • Replace CONFIG_CLOCK_CONTROL_NRF_ACCURACY_PPM choice with the k32src-accuracy-ppm enum property.

    • Replace CLOCK_CONTROL_NRF_K32SRC_500PPM with the k32src-accuracy-ppm = <500>.

    • Replace CLOCK_CONTROL_NRF_K32SRC_250PPM with the k32src-accuracy-ppm = <250>.

    • Replace CLOCK_CONTROL_NRF_K32SRC_150PPM with the k32src-accuracy-ppm = <150>.

    • Replace CLOCK_CONTROL_NRF_K32SRC_100PPM with the k32src-accuracy-ppm = <100>.

    • Replace CLOCK_CONTROL_NRF_K32SRC_75PPM with the k32src-accuracy-ppm = <75>.

    • Replace CLOCK_CONTROL_NRF_K32SRC_50PPM with the k32src-accuracy-ppm = <50>.

    • Replace CLOCK_CONTROL_NRF_K32SRC_30PPM with the k32src-accuracy-ppm = <30>.

    • Replace CLOCK_CONTROL_NRF_K32SRC_20PPM with the k32src-accuracy-ppm = <20>.

    • Replace CONFIG_NRFX_CLOCK_LFXO_TWO_STAGE_ENABLED with k32src = "xtal" or k32src = "ext_low_swing" or k32src = "ext_full_swing".

  4. Update your application to use the new clock control API.

    Use the following mapping when you update the API calls:

    • mgr is the on-off manager created for nordic,nrf-clock and obtained using z_nrf_clock_control_get_onoff.

    • dev is the device compatible with nordic,nrf-clock.

    • sys is the subsystem for nordic,nrf-clock.

      The new clocks implementation does not use it.

    • new_dev is the device that corresponds to the previously used sys value. It must be compatible with one of the following nodes:

      • nordic,nrf-clock-lfclk

      • nordic,nrf-clock-hfclk

      • nordic,nrf-clock-xo

      • nordic,nrf-clock-hfclk192m

      • nordic,nrf-clock-xo24m

      • nordic,nrf-clock-hfclkaudio

    The following example shows the deprecated API usage and the corresponding new API usage:

    // Old API usage (deprecated)
    z_nrf_clock_calibration_init(&mgrs);    //1
    onoff_release(mgr)                      //2
    onoff_request(mgr, &cli);               //3
    onoff_cancel_or_release(mgr, &cli);     //4
    clock_control_on(dev,sys)               //5
    clock_control_off(dev,sys)              //6
    clock_control_async_on(dev,sys)         //7
    clock_control_get_status(dev,sys)       //8
    z_nrf_clock_control_get_onoff(sys)      //9
    
    // New API usage
    z_nrf_clock_calibration_init();                             //1
    nrf_clock_control_release(new_dev, NULL);                   //2
    nrf_clock_control_request(new_dev, NULL, &cli);             //3
    nrf_clock_control_cancel_or_release(new_dev, NULL, &cli);   //4
    clock_control_on(new_dev, NULL)                             //5
    clock_control_off(new_dev, NULL)                            //6
    clock_control_async_on(new_dev, NULL)                       //7
    clock_control_get_status(new_dev, NULL)                     //8
    // Remove all uses of z_nrf_clock_control_get_onoff         //9
    

Comparator

  • The deprecated nxp,-prefixed nxp,kinetis-acmp properties have been removed: use enable-pin-out, use-unfiltered-output, enable-high-speed-mode, filter-enable-sample, filter-count, filter-period and enable-window-mode.

Controller Area Network (CAN)

  • The header files for the NXP SJA1000 (can_sja1000.h) and Bosch M_CAN (can_mcan.h) CAN controller driver backends where converted to library-specific includes. Out-of-tree drivers based on these backends will need to update their include directives accordingly.

  • The Bosch M_CAN driver now solely uses RX FIFO0 for processing received CAN frames, ensuring these are processed in the order received on the bus. Out-of-tree users may want to update any bosch,mram-cfg devicetree property overrides to allocate all FIFO elements to RX FIFO0.

  • The deprecated bus-speed and bus-speed-data CAN controller devicetree properties have been removed. Use bitrate and bitrate-data instead.

  • The CAN controllers driver ops no longer contain a can_set_state_change_callback_t function pointer as adding/removing callbacks is now handled via the generic can_add_state_change_callback(), and can_remove_state_change_callback() API functions. Out-of-tree drivers can either remove the driver op completely or replace it with can_state_change_callbacks_enabled_t as needed. Drivers must now use can_fire_state_change_callbacks() for firing CAN controller state change callbacks (GitHub #117889).

  • The CAN bus network driver (CONFIG_NET_CANBUS) now defines a network interface for each CAN controller device defined with CAN_DEVICE_DT_DEFINE or CAN_DEVICE_DT_INST_DEFINE, instead of one for the zephyr,canbus chosen node.

Counter

  • nxp,lpc-ctimer now routes its input capture signal through the generic mux subsystem. The inputmux-connections property has been removed; describe the routing with an INPUTMUX controller node (nxp,inputmux) and reference it from the timer node’s mux-states property instead. The cell layout is unchanged, so an existing inputmux-connections = <&inputmux0 0 0x06000024>; becomes mux-states = <&inputmux0 0 0x06000024>; (GitHub #112088)

  • The prescaler property of nxp,lptmr has been removed. Use prescale-glitch-filter and prescale-glitch-filter-bypass instead. The new property is an exponent, not a divisor: the prescaler divides by 2^(prescale-glitch-filter + 1).

  • adi,max32-rtc-counter and adi,max32-wut now use the shared clk_32k node for 32 kHz clock source selection. The clock source is now configured through the clocks property of the clk_32k node, instead of clock-source property in each peripheral node (GitHub #117709).

  • The NXP RTC counter drivers (nxp,rtc, nxp,lpc-rtc and nxp,imx-snvs-rtc) now return -ETIME instead of -EINVAL from counter_set_channel_alarm() when an absolute alarm is set too late, matching the counter API contract. Applications that checked for -EINVAL on the late-absolute-alarm path must check for -ETIME instead. An absolute target equal to the current counter value is now also reported as late (-ETIME), and the late check no longer applies to relative alarms.

Devicetree

  • int and array typed devicetree properties whose DTS source uses a negative literal (e.g. <(-1)>) now expand to a negative value instead of the two’s-complement unsigned value used previously. Code that relied on the old unsigned representation, for example unsigned comparisons or BUILD_ASSERT(DT_PROP(node, foo) > 0, ...) checks, must be updated to use signed types or signed-aware checks (GitHub #107271).

  • The zephyr,memory-region-mpu property has been removed. Use zephyr,memory-attr instead. It takes an integer bitmask, not a string:

    "RAM"         -> <DT_MEM_ARM_MPU_RAM>
    "RAM_NOCACHE" -> <DT_MEM_ARM_MPU_RAM_NOCACHE>
    "FLASH"       -> <DT_MEM_ARM_MPU_FLASH>
    "PPB"         -> <DT_MEM_ARM_MPU_PPB>
    "IO"          -> <DT_MEM_ARM_MPU_IO>
    "EXTMEM"      -> <DT_MEM_ARM_MPU_EXTMEM>
    

Digital Microphone

  • The DMIC driver backend API now uses dmic_driver_api instead of struct _dmic_ops.

    Out-of-tree DMIC drivers must rename their backend API struct definitions and switch their API instances to DEVICE_API(dmic, ...). See GitHub #107695 for examples of how in-tree drivers have been updated. Application code using dmic_configure(), dmic_trigger(), and dmic_read() is not impacted.

Disk

  • CONFIG_NVME_REQUEST_TIMEOUT is documented and ranged in seconds. The NVMe request timeout path previously compared that value against k_uptime_get_32() milliseconds without converting, so the default of 5 expired after about 5 ms instead of 5 seconds. The driver now converts with MSEC_PER_SEC before scheduling and expiry checks. Review any non-default setting if the application depended on the former short timeout behavior. (GitHub #117809)

Display

  • The Kconfig options CONFIG_SDL_DISPLAY_DEFAULT_PIXEL_FORMAT_* for SDL display pixel-format selection have been removed in favour of setting the pixel-format property directly in devicetree on the SDL pseudo-device node using the PANEL_PIXEL_FORMAT_* macros from include/zephyr/dt-bindings/display/panel.h. (GitHub #104099)

  • The LVGL CONFIG_LV_Z_COLOR_24_BGR_TO_RGB Kconfig option has been removed. LVGL’s RGB888 color format stores bytes in memory as blue, green, red, which matches the in-memory layout of PIXEL_FORMAT_RGB_888, so no channel swap is performed for displays reporting that format. Displays whose framebuffer instead expects a red, green, blue byte order must now report PIXEL_FORMAT_BGR_888, for which the LVGL glue performs the red/blue channel swap automatically.

  • LVGL now renders directly in its RGB565_SWAPPED color format for displays reporting PIXEL_FORMAT_RGB_565X, so CONFIG_LV_COLOR_16_SWAP is no longer needed for these displays and must not be enabled together with that pixel format, otherwise the buffer ends up byte-swapped twice. The t_deck, m5stack_core2 and wio_terminal boards no longer enable the option by default.

  • The Kconfig options CONFIG_ST730X_POWERMODE_LOW for ST7305 and ST7306 displays has been removed in favour of toggling the low-power-mode property on the device node.

  • The set_contrast function of the ST7567 display driver now expects a contrast value in the range 0-255, instead of 0-63. The driver now scales the value to the 6-bit range expected by the controller. The CONFIG_ST7567_DEFAULT_CONTRAST Kconfig option has been updated to reflect the new range. (GitHub #112528)

  • raspberrypi,bcm2711-framebuffer now requires a pixel-format property and gains an optional red-blue-swap boolean to indicate the panel expects BGR channel order. Boards relying on firmware-negotiated pixel order to correct swapped channels must also set red-blue-swap. (GitHub #115633)

  • The chipone,co5300 MIPI DSI display driver no longer maintains an internal shadow framebuffer, and the pitch-align, addr-align, and ext-ram devicetree properties have been removed from the chipone,co5300 binding. Boards previously relying on these properties to satisfy display-controller alignment requirements should instead enable CONFIG_LV_Z_AREA_X_ALIGNMENT_WIDTH and CONFIG_LV_Z_AREA_Y_ALIGNMENT_WIDTH (LVGL) so that invalidated areas are rounded to the required boundary before reaching the driver. (GitHub #117765)

  • The ssd16xx display driver now reports PIXEL_FORMAT_MONO01 instead of PIXEL_FORMAT_MONO10, which matches the controller RAM, where a set bit is a white pixel. LVGL and the character framebuffer draw with the intended colors without any change. Applications that pass their own buffers to display_write() and inverted them to compensate for the former pixel format must drop that inversion.

DMA

  • silabs,siwx91x-dma has been renamed silabs,udma. The Kconfig options have also been renamed to align with this new name (DMA_SILABS_SIWX91X in DMA_SILABS_SIWX91X_UDMA and DMA_SILABS_SIWX91X_SG_BUFFER_COUNT in DMA_SILABS_SIWX91X_UDMA_DESCR_COUNT)

  • To align with the other drivers, GPDMA_SILABS_SIWX91X_DESCRIPTOR_COUNT has been renamed in DMA_SILABS_SIWX91X_GPDMA_DESCR_COUNT.

ESPI

  • ECUSTOM_HOST_SUBS_INTERRUPT_EN has been deprecated in favor of new API that allows fine-grained enable/disable control of individual eSPI hardware interrupts. This replaces the current all-or-nothing approach, which is tightly coupled to CONFIG_ESPI_PERIPHERAL_CUSTOM_OPCODE and single eSPI ACPI HW block instance in all eSPI drivers. This will be completely removed in the next Zephyr release to give time for transition.

  • The Microchip XEC eSPI v2 driver (microchip,xec-espi-v2) has been ported from MEC172x to also support MEC174x, MEC175x, and MEC165xB. This required several devicetree changes that affect out-of-tree boards using this binding (GitHub #109519):

    • The pcrs property has been replaced by pcr-scr, which is now a single integer encoded with the MCHP_XEC_SCR_ENCODE(reg, bit) helper macro instead of a <reg bit> cell pair. Update existing overlays from pcrs = <2 19>; to pcr-scr = <MCHP_XEC_SCR_ENCODE(2, 19)>;.

    • On MEC174x/5x/165xB only, girqs cells are now a single integer per entry produced by MCHP_XEC_ECIA_GIRQ_ENC(reg, bit) rather than a <reg bit> pair. MEC172x continues to use the existing MCHP_XEC_ECIA(...) form.

    • Two new optional properties are available on the eSPI controller node for hosts whose address space exceeds 32 bits: host-memmap-addr-high (host address bits [47:32] for memory-mapped logical devices) and sram-bar-addr-high (host address bits [47:32] for both SRAM BARs).

    • The interrupt-names of the eSPI controller and its host-device children have been renamed for consistency. Update overlays accordingly:

      • Controller: rst → erst; vwct_0_6 / vwct_7_10 → ht_vw_bank0 / ht_vw_bank1. Two corresponding interrupts (ht_vw_bank0 / ht_vw_bank1) must be added to the interrupts array.

      • KBC child: kbc_obe / kbc_ibf → obe / ibf.

      • ACPI EC children: acpi_ibf / acpi_obe → ibf / obe.

    • In the MEC5 SoC DTSI (MEC174x/5x/165xB), every host-device child of the eSPI controller (mailbox, KBC, ACPI EC, ACPI PM1, port92, glue, EMI, BIOS debug port, etc.) now declares the ldn (logical device number) property required by microchip,xec-espi-host-dev. Out-of-tree boards that override or add host-device child nodes for these SoCs must set ldn on each.

  • The board power node compatible of the Enhanced Serial Peripheral Interface (eSPI) sample has been renamed from intel-rvp,board-power to intel,rvp-board-power. Out-of-tree board overlays for this sample must use the new compatible.

Ethernet

  • The WIZnet Ethernet drivers now share one set of Kconfig options. Replace CONFIG_ETH_W5500_*, CONFIG_ETH_W6100_* and CONFIG_ETH_W6300_* with the matching CONFIG_ETH_WIZNET_* option.

  • ETHERNET_CONFIG_TYPE_T1S_PARAM and the related NET_REQUEST_ETHERNET_SET_T1S_PARAM has been removed. phy_set_plca_cfg() together with net_eth_get_phy() should be used instead to set these parameters (GitHub #108136).

  • In the functions implemented by the ethernet_api a additional argument was added for a pointer to net_if. This api is not directly exposed to the application, so only out-of-tree drivers need to be updated. (GitHub #106086)

  • The pinctrl-0 and pinctrl-names devicetree properties for the nxp,enet-mac need to be moved from the MAC node to the parent Ethernet controller node. (GitHub #107352)

  • The NuMaker Ethernet driver has been removed together with CONFIG_ETH_NUMAKER. The NuMaker EMAC is now driven by CONFIG_ETH_NUMAKER_DWC_ETHER_1000, the generic Synopsys DesignWare MAC driver, which needs the MDIO controller and the PHY in devicetree. Out-of-tree boards have to enable the mdio node with the MDC and MDIO pins in its pinctrl state, add their PHY to it and point the emac node at it with phy-handle. The phy-addr property of nuvoton,numaker-ethernet has been removed.

  • port_generate_random_mac of the dsa_api got removed. Also dsa_port_config now uses net_eth_mac_config to set the MAC address. mac_addr and use_random_mac_addr members of dsa_port_config were removed. Out-of-tree DSA drivers must update their port configuration code to use the new API and structures. (GitHub #108952)

  • The Kconfig option CONFIG_ETH_NATIVE_TAP_PTP_CLOCK has been replaced by CONFIG_PTP_CLOCK_NATIVE. A new compatible zephyr,native-ptp-clock has been added for the native_sim PTP clock driver. CONFIG_PTP_CLOCK_NATIVE is enabled by default when the zephyr,native-ptp-clock compatible is present.

  • The native_sim TAP ethernet driver is now instantiated from devicetree using the zephyr,native-tap compatible. Each interface is defined by a devicetree node instead of the CONFIG_ETH_NATIVE_TAP_INTERFACE_COUNT Kconfig option, which has been removed. Multiple interfaces are created by adding multiple nodes. The following Kconfig options have been removed and replaced by devicetree properties:

    • CONFIG_ETH_NATIVE_TAP_DRV_NAME -> the host-interface property.

    • CONFIG_ETH_NATIVE_TAP_MAC_ADDR -> the local-mac-address property.

    • CONFIG_ETH_NATIVE_TAP_RANDOM_MAC -> the zephyr,random-mac-address property.

    The --eth-if, --mac-addr, --ipv4-addr, --ipv4-gw and --ipv4-nm command line options are still supported and apply to the first interface. Per-interface variants named <node>_eth-if, <node>_mac-addr, etc. have been added for the remaining interfaces.

  • port_phylink_change of the dsa_api is now optional. The DSA driver no longer needs to call net_eth_carrier_on() or net_eth_carrier_off() on PHY link change, this is now handled by the DSA core. The void *user_data argument of port_phylink_change has been changed to const struct device *dev, so it no longer needs to be cast to obtain the device pointer. Out-of-tree DSA drivers must update their port_phylink_change callback to match the new API and can remove any calls to net_eth_carrier_on() or net_eth_carrier_off() from it. (GitHub #109671)

  • The MAC address of ethernet interfaces is now checked for validity, when bringing the interface up with net_if_up(). If the MAC address is invalid, the interface will fail to come up and an error will be logged. This check is done before the start function of the ethernet_api is called. This also applies to native wifi drivers. (GitHub #110435)

  • The Xilinx GEM Ethernet driver (xlnx,gem) has been switched over to use the current MDIO and PHY facilities, splitting up the driver’s implementation into separate MDIO and Ethernet MAC drivers. The driver’s custom PHY management code has been removed. The types of Ethernet PHYs supported by the removed custom code, the Marvell Alaska GBit PHY family and the TI TLK105/DP83822 100 MBit PHYs are both covered by the standard (ethernet-phy) driver. The QEMU targets which emulate the Xilinx GEM have been updated accordingly, as have been the device trees of the Zynq-7000 and ZynqMP / UltraScale+ SoC families. (GitHub #87313)

  • Ethernet and Wi-Fi drivers that use ETHERNET_CONFIG_TYPE_EXTRA_TX_PKT_HEADROOM to request extra headroom for transmit packets must now select CONFIG_NET_L2_ETHERNET_EXTRA_TX_PKT_HEADROOM. (GitHub #112924)

  • ETHERNET_PTP flag has been removed from ethernet_hw_caps. Use net_eth_get_ptp_clock() to check if the ethernet interface has a PTP clock. Out-of-tree drivers must remove any references to these flags from their ethernet_api get_capabilities implementation. (GitHub #112788)

  • Ethernet drivers that support LLDP, no longer need to call net_lldp_set_lldpdu() in their initialization. It is now done by ethernet_init(). (GitHub #114087)

  • infineon,xmc4xxx-ethernet and wch,ethernet nodes have been merged with their parent node. The sibling MDIO nodes are not moved and become children of these ethernet nodes as a result. (GitHub #114899)

  • The property mdi-port-ctrl of infineon,xmc4xxx-mdio has been moved to the parent node (infineon,xmc4xxx-ethernet). (GitHub #114899)

  • The compatibles espressif,esp32-mdio, infineon,xmc4xxx-mdio, nxp,enet-qos-mdio, nxp,s32-gmac-mdio, st,stm32-mdio and wch,mdio have been replaced by snps,dwmac-mdio. (GitHub #114899)

  • The NXP ENET-QOS Ethernet controller (nxp,enet-qos) devicetree structure has been flattened to match other similar controllers. The clocks, interrupts, pinctrl-0, pinctrl-names, phy-handle and MAC address properties now live directly on the parent nxp,enet-qos node instead of a separate child MAC node. The nxp,enet-qos-mac compatible and its enet_mac node have been removed. Out-of-tree boards using this controller must move the properties from the old enet_mac node up to the enet node. (GitHub #115952)

  • The Kconfig option CONFIG_ETH_NXP_ENET_QOS_MAC_UNIQUE_MAC_ADDRESS has been renamed to CONFIG_ETH_NXP_ENET_QOS_UNIQUE_MAC_ADDRESS. Configurations setting the old name must be updated to use the new one. (GitHub #115952)

  • The Synopsys DesignWare MAC driver now filters multicast by default (CONFIG_ETH_DWC_ETHER_MULTICAST_FILTER), so only multicast for the addresses the network stack has joined is received. Disable this option to receive all multicast, as before. (GitHub #113235)

  • Boards with Ethernet interfaces should now enable CONFIG_ETH_DRIVER by default, instead of CONFIG_NET_L2_ETHERNET. The later is now enabled by default when the former is. (GitHub #117121)

Flash

  • jedec,spi-nand now requires a plane-bytes property, which indicates the size of each plane in the flash device. For devices with a single plane, this should be set to the same value as size-bytes.

  • The st,stm32-nv-flash property bank2-flash-size has been deprecated in favor of determining flash bank sizes using reg size cells. No changes need be made to the devicetree save for removing the aforementioned property. (GitHub #114971)

Fuel Gauge

  • Various fuel gauge property enums and union fields have been deprecated in favor of new versions with explicit unit suffixes. Applications and drivers should migrate to the unit-suffixed names. For example, FUEL_GAUGE_CURRENT (val.current) is replaced by FUEL_GAUGE_CURRENT_UA (val.current_ua).

  • Drivers had inconsistently been reporting full charge/discharge cycles or “1/100ths” of a cycle in the FUEL_GAUGE_CYCLE_COUNT property. The property now consistently reports full cycles, and drivers that previously reported fractions of a cycle (i.e. ADP5360 and BQ27Z746) have been updated to report full cycles instead. Applications that relied on the old behavior should be updated. (GitHub #112276)

GPIO

  • The STM32 GPIO driver now returns -EINVAL when attempting to configure a GPIO pin in disabled state with a pull-up/pull-down resistor using gpio_pin_configure(). The driver would previously return 0 without actually honoring those flags (no PU/PD resistor was enabled). Applications encountering this error should remove GPIO_PULL_UP/ GPIO_PULL_DOWN from the flags they provide to gpio_pin_configure(); this will result in the same behavior as before since these flags were effectively ignored. (GitHub #104690)

  • On STM32F1 series, GPIO output pins now use 50 MHz max. speed instead of 10 MHz. (GitHub #104690)

  • The awinic,aw9523b-gpio driver no longer has the reset-gpios property. This has instead been moved to the parent awinic,aw9523b MFD device.

Haptics

  • The cirrus,cs40l5x compatible has been replaced by variant-specific compatibles cirrus,cs40l50, cirrus,cs40l51, cirrus,cs40l52, and cirrus,cs40l53. Applications using the old compatible must update their devicetree nodes accordingly.

  • The vib-rated-mv and vib-overdrive-mv properties of ti,drv2605 now default to the device reset values, 1362 mV and 3075 mV, instead of 3200 mV. Boards that need the previous drive level must set them explicitly.

HWSPINLOCK

I2C

  • On controller based on CONFIG_I2C_DW the CONFIG_I2C_DW_RW_TIMEOUT_MS option has been replaced with CONFIG_I2C_TRANSFER_TIMEOUT_MS, with a default of 500ms.

  • The ITE I2C controllers ite,enhance-i2c ite,it51xxx-i2c ite,it8xxx2-i2c transfer timeout is now using the generic zephyr,transfer-timeout-ms property instead of transfer-timeout-ms, default to 500ms.

  • The nxp,sc18im704-i2c bridge no longer sends the target address unshifted to the SC18IM704. The Zephyr I2C API passes a 7-bit address to a controller’s transfer() callback, and the driver now shifts it left by one to build the address byte the bridge expects. Devicetree nodes sitting on a nxp,sc18im704-i2c bus that compensated for the missing shift by declaring a pre-shifted reg (for example reg = <0xa0> for a device at address 0x50) must now declare the real 7-bit address (reg = <0x50>).

I2S

  • i2s_buf_write() now honours the timeout from the stream configuration when it allocates the transmit block. It previously waited forever, so the documented -EAGAIN return was unreachable, as was -ENOMEM in a multithreaded build. A caller that relied on the unbounded wait can set timeout to SYS_FOREVER_MS, but the same field also bounds the driver’s enqueue wait, so no single value reproduces the old combination of an unbounded allocation and a bounded enqueue.

IEEE 802.15.4

  • The IEEE802154_HW_SLEEP_TO_TX radio capability, deprecated since Zephyr 3.6, has been removed and the capability bits above it renumbered. Every in-tree driver supports transmitting directly from a low-power state, so the capability conveyed no information; the OpenThread platform now always advertises OT_RADIO_CAPS_SLEEP_TO_TX and allows transmission from the sleep state. Out-of-tree drivers advertising the capability simply drop it.

Input

  • The no-disconnect property of gpio-keys has been replaced by enumeration property zephyr,suspend-action. The new property currently has three values, two of which are direct replacements for the old situations:

    • zephyr,suspend-action = "none"; is the remplacement for the behavior when when no-disconnect was present. Users of the no-disconnect property should replace it with zephyr,suspend-action = "none";.

    • zephyr,suspend-action = "disconnect-with-pupd"; is the replacement for the behavior when no-disconnect was not present. This is selected by default for backwards compatibility with the previous behavior.

    • zephyr,suspend-action = "full-disconnect"; is a new value. (Refer to the binding for more details)

    Users of the default configuration are advised to reconsider whether it really is appropriate; migration to zephyr,suspend-action = "full-disconnect"; is recommended. (GitHub #108294)

  • Kconfig options for the ft6146, ft5336, and cst8xx input drivers have been renamed to be consistent with the other input drivers. Applications using the following Kconfig options must update their configurations accordingly:

Interrupt Controllers

  • All interrupt controller bindings now use flags as the interrupt cell name instead of sense. The following interrupt controller bindings were updated:

    Drivers using these interrupt controllers are updated to use flags as the cell name. However, any out-of-tree drivers that directly access interrupt properties using DT_INST_IRQ(n, sense) or DT_IRQ(node, sense) should be updated to use flags instead of sense.

  • Deprecate GIC_NUM_CPU_IF from GIC header file gic.h. One shall use instead.:kconfig:option:CONFIG_MP_MAX_NUM_CPUS instead.

MBOX

  • The renesas,rz-mhu-mbox driver was reworked so that a single MHU unit serves both TX and RX on one MBOX channel, instead of dedicating each channel to one direction. A single driver instance can now own several channels. Devicetree nodes using this compatible must be updated:

    • channel was renamed to unit, because it indexes the underlying MHU hardware unit and not the MBOX channel. The two numbering schemes are independent.

    • tx-mask and rx-mask were replaced by a single channel-mask, a bitmask of the valid MBOX channels where bit n enables channel n.

    • channels-count must match the number of interrupt-names entries on the node. This is now enforced at build time.

    • shared-memory is now optional and should be left unset in most cases. The shared memory is instead provided by a single zephyr,memory-region node named mhu_shmem, which replaces the per-unit mmio-sram nodes and makes the linker emit __mhu_shmem_start for the FSP MHU driver. Boards without this memory region fail to link with an undefined reference to that symbol.

    For example:

    /* Before */
    mhu3_shm: memory@62f01018 {
            compatible = "mmio-sram";
            reg = <0x62f01018 0x8>;
    };
    
    mbox3: mhu@40400060 {
            channel = <3>;
            tx-mask = <0x00000002>;
            rx-mask = <0x00000001>;
            shared-memory = <&mhu3_shm>;
    };
    
    /* After */
    mhu_shmem: memory-region@62f01000 {
            compatible = "zephyr,memory-region";
            reg = <0x62f01000 0x1000>;
            zephyr,memory-region = "mhu_shmem";
    };
    
    mbox3: mhu@40400060 {
            unit = <3>;
            channel-mask = <0x1>;
    };
    

MSPI

  • MSPI device binding filenames now use (vendor,)device-mspi.yaml for MSPI-specific variants, while the devicetree compatible strings describe the device itself instead of encoding the MSPI bus. Boards, shields, samples, tests, and out-of-tree devicetree overlays are recommended to update MSPI child node compatibles as follows:

    • jedec,mspi-nor -> jedec,nor

    • mspi-atxp032 -> atxp032

    • mspi-is25xX0xx -> is25xX0xx

    • mspi-aps6404l -> aps6404l

    • mspi-aps-z8 -> aps-z8

    • zephyr,mspi-emul-device -> zephyr,emul-device-mspi

    • zephyr,mspi-emul-flash -> zephyr,emul-flash

    It is recommended that out-of-tree MSPI device drivers should likewise update DT_DRV_COMPAT and generated devicetree Kconfig symbol references to the new compatible names. If a driver, sample, or test must ensure that one of these generic compatibles is instantiated on an MSPI bus, add an explicit MSPI bus check, such as dt_compat_on_bus in Kconfig or dt_compat_on_bus filters in test metadata.

  • The MSPI memory mapping feature has been renamed from “XIP” to “MEMMAP”, since XIP (CONFIG_XIP) is a software configuration concept in Zephyr while the MSPI feature only memory-maps the device, which can be used for data access as well as code execution (GitHub #104657). The MSPI API is experimental, so no deprecated aliases are provided. Out-of-tree users must update:

    • CONFIG_MSPI_XIP -> CONFIG_MSPI_MEMMAP

    • CONFIG_FLASH_MSPI_XIP_READ -> CONFIG_FLASH_MSPI_MEMMAP_READ

    • struct mspi_xip_cfg -> struct mspi_memmap_cfg

    • enum mspi_xip_permit -> enum mspi_memmap_permit and its values MSPI_XIP_READ_WRITE/MSPI_XIP_READ_ONLY -> MSPI_MEMMAP_READ_WRITE/MSPI_MEMMAP_READ_ONLY

    • mspi_xip_config -> mspi_memmap_config() and the xip_config driver API entry -> memmap_config

    • MSPI_XIP_CONFIG_DT/MSPI_XIP_CONFIG_DT_INST/MSPI_XIP_CONFIG_DT_NO_CHECK -> MSPI_MEMMAP_CONFIG_DT/MSPI_MEMMAP_CONFIG_DT_INST/MSPI_MEMMAP_CONFIG_DT_NO_CHECK

    • MSPI_XIP_CFG_STRUCT_DECLARE/MSPI_XIP_BASE_ADDR_DECLARE/MSPI_XIP_BASE_ADDR_INIT -> MSPI_MEMMAP_CFG_STRUCT_DECLARE/MSPI_MEMMAP_BASE_ADDR_DECLARE/MSPI_MEMMAP_BASE_ADDR_INIT

    • devicetree property xip-config -> memmap-config on MSPI device nodes

Nordic

  • The owner-id, perm-read, perm-write, perm-execute, perm-secure and non-secure-callable properties of nordic,owned-memory and nordic,owned-partitions have been removed. Use nordic,access instead, e.g. <NRF_OWNER_ID_APPLICATION NRF_PERM_RW>. The owner is no longer implicit: an omitted owner-id used to mean the domain being compiled, so it must now be named explicitly.

NXP

  • CONFIG_MCUX_LPTMR_TIMER no longer defaults to y based on the /chosen/zephyr,system-timer chosen node being compatible with nxp,lptmr. Out-of-tree SoCs and boards that rely on the LPTMR as the system timer must now explicitly default the symbol in their Kconfig.defconfig (for example default y if PM).

  • Kinetis KE1xF no longer requires a board overlay to designate the system timer when CONFIG_PM is enabled. The SoC DTSI now sets the zephyr,system-timer chosen property, so boards that added the overlay described in the Zephyr 4.4 migration guide can remove it.

  • The NXP LPC DTSI files were reorganized from the flat directory dts/arm/nxp/lpc/ into per-series subdirectories. Out-of-tree boards that include these files directly must update their includes.

    The new subdirectory layout is:

    LPC series

    New location

    LPC11U6x

    dts/arm/nxp/lpc/lpc11u6x/

    LPC51U68

    dts/arm/nxp/lpc/lpc51u68/

    LPC54xxx

    dts/arm/nxp/lpc/lpc54xxx/

    LPC55xxx

    dts/arm/nxp/lpc/lpc55xxx/

    LPC84x

    dts/arm/nxp/lpc/lpc84x/

    Example:

    /* Before */
    #include <nxp/lpc/nxp_lpc55S6x.dtsi>
    
    /* After */
    #include <nxp/lpc/lpc55xxx/nxp_lpc55S6x.dtsi>
    
  • The NXP Kinetis DTSI files were reorganized from the flat directory dts/arm/nxp/kinetis/ into per-series subdirectories. Out-of-tree boards that include these files directly must update their includes.

    The new subdirectory layout is:

    Kinetis series

    New location

    K2X

    dts/arm/nxp/kinetis/k2x/

    K32Lx

    dts/arm/nxp/kinetis/k32lx/

    K6X

    dts/arm/nxp/kinetis/k6x/

    K8X

    dts/arm/nxp/kinetis/k8x/

    KE1xF

    dts/arm/nxp/kinetis/ke1xf/

    KE1xZ

    dts/arm/nxp/kinetis/ke1xz/

    KL2X

    dts/arm/nxp/kinetis/kl2x/

    KV5X

    dts/arm/nxp/kinetis/kv5x/

    KWX

    dts/arm/nxp/kinetis/kwx/

    Example:

    /* Before */
    #include <nxp/kinetis/nxp_k66.dtsi>
    
    /* After */
    #include <nxp/kinetis/k6x/nxp_k66.dtsi>
    
  • The NXP MCX DTSI files were reorganized from the flat directory dts/arm/nxp/mcx/ into per-series subdirectories. Out-of-tree boards that include these files directly must update their includes.

    The new subdirectory layout is:

    MCX series

    New location

    MCXA

    dts/arm/nxp/mcx/mcxa/

    MCXC

    dts/arm/nxp/mcx/mcxc/

    MCXE

    dts/arm/nxp/mcx/mcxe/

    MCXL

    dts/arm/nxp/mcx/mcxl/

    MCXN

    dts/arm/nxp/mcx/mcxn/

    MCXW

    dts/arm/nxp/mcx/mcxw/

    Example:

    /* Before */
    #include <nxp/mcx/nxp_mcxc242.dtsi>
    
    /* After */
    #include <nxp/mcx/mcxc/nxp_mcxc242.dtsi>
    
  • The NXP MCXN series gained dedicated per-part composer DTSI files for mcxn547, mcxn947 and mcxn236 (nxp_mcxn547.dtsi, nxp_mcxn947.dtsi and nxp_mcxn236.dtsi), alongside the new mcxn546, mcxn946 and mcxn235 phantom parts added this release. Each of these files just includes the existing series file (nxp_mcxn54x.dtsi, nxp_mcxn94x.dtsi and nxp_mcxn23x.dtsi respectively) with no overrides, and in-tree boards for mcxn547, mcxn947 and mcxn236 now include the new per-part file instead. The series files themselves are unchanged and still work if included directly, so this is not a required migration, but out-of-tree boards for these three parts may want to switch to the new per-part files for consistency with the rest of the series.

    Example:

    /* Before */
    #include <nxp/mcx/mcxn/nxp_mcxn94x.dtsi>
    
    /* After */
    #include <nxp/mcx/mcxn/nxp_mcxn947.dtsi>
    
  • The NXP i.MX RT DTSI files were reorganized from the flat directory dts/arm/nxp/imxrt/ into per-series subdirectories, Out-of-tree boards that include these files directly must update their includes.

    The new subdirectory layout is:

    i.MX RT series

    New location

    RT10xx

    dts/arm/nxp/imxrt/imxrt10xx/

    RT11xx

    dts/arm/nxp/imxrt/imxrt11xx/

    RT5xx

    dts/arm/nxp/imxrt/imxrt5xx/

    RT6xx

    dts/arm/nxp/imxrt/imxrt6xx/

    RT7xx

    dts/arm/nxp/imxrt/imxrt7xx/

    RT118x

    dts/arm/nxp/imxrt/imxrt118x/

    Example:

    /* Before */
    #include <nxp/imxrt/nxp_rt1060.dtsi>
    
    /* After */
    #include <nxp/imxrt/imxrt10xx/nxp_rt1060.dtsi>
    
  • The i.MX RT118x boards now include a single part-core composer file nxp_rt118<part>_cm<core>.dtsi instead of the series-core file plus a separate part overlay. Out-of-tree boards must update their devicetree includes accordingly (GitHub #110228).

    Example for a part that previously needed the series file plus a part overlay:

    /* Before */
    #include <nxp/imxrt/nxp_rt118x_cm7.dtsi>
    #include <nxp/imxrt/nxp_rt1186.dtsi>
    
    /* After */
    #include <nxp/imxrt/imxrt118x/nxp_rt1186_cm7.dtsi>
    
  • The i.MX RT7xx boards now include a single part-core composer file nxp_<part>_<core>.dtsi instead of the series-core file. Out-of-tree boards must update their devicetree includes accordingly.

    Example for a part that previously needed the series file:

    /* Before */
    #include <nxp/imxrt/imxrt7xx/nxp_rt7xx_cm33_cpu0.dtsi>
    
    /* After */
    #include <nxp/imxrt/imxrt7xx/nxp_rt798s_cm33_cpu0.dtsi>
    
  • The NXP SoC pin control headers under the hal_nxp dts/nxp/ tree were reorganized to mirror the dts/arm/nxp/<family>/<series>/ layout: every SoC *-pinctrl.h / *-pinctrl.dtsi file moved into a pinctrl/ subdirectory. Out-of-tree boards that include these SoC pin control headers directly must update their includes.

    The families that are series-organized (i.MX RT, Kinetis, LPC, MCX) place their headers in <family>/<series>/pinctrl/; the families that are flat (i.MX, S32, RW) place theirs in a family-level <family>/pinctrl/ directory. Kinetis additionally adds new series directories (k0x, km3x, kv3x) for parts that had none. In addition the former nxp_imx directory was split: nxp_imx/rt/ became the imxrt/ family and the remaining i.MX application processors became the flat imx/ family.

    Examples:

    /* Before */
    #include <nxp/nxp_imx/rt/mimxrt1151dvm8b-pinctrl.dtsi>
    #include <nxp/nxp_imx/mimx8ml8dvnlz-pinctrl.dtsi>
    #include <nxp/kinetis/MK64FN1M0VLL12-pinctrl.h>
    
    /* After */
    #include <nxp/imxrt/imxrt11xx/pinctrl/mimxrt1151dvm8b-pinctrl.dtsi>
    #include <nxp/imx/pinctrl/mimx8ml8dvnlz-pinctrl.dtsi>
    #include <nxp/kinetis/k6x/pinctrl/MK64FN1M0VLL12-pinctrl.h>
    

PWM

  • The pcrs property (array type) of microchip,xec-pwm has been replaced by pcr-scr (int type) to use encoded PCR register index and bit position macros (GitHub #104570).

  • STM32 PWM DT bindings macro PWM_STM32_COMPLEMENTARY that is deprecated since Zephyr v3.3.0 is no more defined. One shall use STM32_PWM_COMPLEMENTARY instead.

  • nxp,ctimer-pwm now routes its input capture signal through the generic mux subsystem. The inputmux-connections property has been removed; describe the routing with an INPUTMUX controller node (nxp,inputmux) and reference it from the timer node’s mux-states property instead. (GitHub #112088)

  • nxp,sctimer-pwm now routes its input capture signal through the generic mux subsystem. The input-channels property has been removed; describe the routing with an INPUTMUX controller node (nxp,inputmux) and reference it from the timer node’s mux-states property instead. (GitHub #112088)

RTC

  • The legacy counter-based DS3231 driver has been removed, completing the deprecation introduced in GitHub #95221. Applications using maxim,ds3231, CONFIG_COUNTER_MAXIM_DS3231, or <zephyr/drivers/rtc/maxim_ds3231.h> must migrate to the RTC subsystem driver.

    Replace the single legacy I2C node with a maxim,ds3231-mfd parent and a maxim,ds3231-rtc child. Move isw-gpios to the RTC child, rename old 32k-gpios usage to freq-32khz-gpios, and replace maxim_ds3231_* helper API usage with generic RTC subsystem APIs.

  • microcrystal,rv3032 properties trickle-resistor-ohms and trickle-charger-mode have moved to the parent microcrystal,rv3032-mfd device. The parent MFD device now handles configuring the backup supply mode for all child devices.

SD Host Controller

  • Renamed the Kconfig option CONFIG_SDHC_STM32_POLLING_SUPPORT to CONFIG_SDHC_STM32_DMA_MODE. The new symbol enables DMA (default y); set it to n to use polling mode. (GitHub #101617)

  • Renamed the Kconfig option CONFIG_SDHC_STM32_SDIO to CONFIG_SDHC_STM32_SDMMC. (GitHub #101617)

  • The devicetree compatible st,stm32-sdio was renamed. Use st,stm32-sdmmc instead. With this compatible, the legacy disk driver and the SDHC driver can target the same node. To migrate to the SDHC STM32 SDMMC driver, disable the legacy disk driver:

    CONFIG_SDMMC_STM32=n
    

    (GitHub #101617)

  • For st,stm32-sdmmc, the sdhi-on-gpios property has been consolidated into the existing pwr-gpios property. Replace sdhi-on-gpios with pwr-gpios in out-of-tree devicetree nodes.

  • CONFIG_SDMMC_STM32_HWFC is now enabled by default for the legacy SDMMC_STM32 disk driver to prevent FIFO underrun and overrun errors during disk access. Applications that previously set CONFIG_SDMMC_STM32_HWFC=y should remove this configuration from their board configuration files since it is now the default.

  • litex,mmc now uses the dma-coherent devicetree property to indicate that the controller’s DMA accesses are coherent with the CPU. CONFIG_SDHC_LITEX_LITESDCARD_NO_COHERENT_DMA is automatically set based on that property and is no longer user-configurable. (GitHub #108411)

Sensor

  • The pixart,paa3905 driver now enforces the sensor’s datasheet SPI contract: mode 3 is set by the driver and a devicetree spi-max-frequency above 2 MHz fails the build. Out-of-tree boards that overclocked the bus must lower the property to 2000000 or less.

  • The girqs and pcrs properties (array type) of microchip,xec-tach have been replaced by pcr-scr (int type) to use encoded PCR register index and bit position macros. GIRQ configuration is now handled via the microchip,dmec-ecia-girq binding include (GitHub #104808).

  • st,lps22hh now ignores the odr property in favor of the one-shot sampling mode unless CONFIG_LPS22HH_TRIGGER is enabled to make use of periodic sampling.

  • The devicetree compatible tdk,ntcg163jf103ft1 has been renamed to tdk,ntcgxx3jx103x to reflect that the compensation values are identical for TDK NTCG thermistor parts with the same resistance (R25) and beta (B25/85) values, as indicated in the part naming scheme (GitHub #110123).

  • nxp,mcux-qdc now routes its input signals through the generic mux subsystem. The input-channels and inputmux-connections properties have been removed; describe the routing with a mux controller node (for example nxp,inputmux) and reference it from the decoder node’s mux-states property instead. (GitHub #112088)

  • nxp,mcux-qdec now routes its input signals through the generic mux subsystem. The xbar property has been removed; describe the routing with a mux controller node (for example nxp,mcux-xbar) and reference it from the decoder node’s mux-states property instead. (GitHub #112088)

  • The pgain, again, ppulse-length and pled-boost properties of avago,apds9960 used to spell the 2-bit register fields they select in hex (0x00/0x01/0x10/0x11) and now take the physical value they select instead: gain multipliers for pgain (1/2/4/8) and again (1/4/16/64), microseconds for ppulse-length (4/8/16/32) and percent for pled-boost (100/150/200/300). Most of the old values are rejected by the new enums, but pgain = <0x01> and again = <0x01> still build and now select 1x rather than 2x and 4x, so update them explicitly. Nodes that do not set these properties are unaffected (GitHub #116079).

Serial

  • The return type of uart_irq_update() is now void instead of int. (GitHub #105231)

  • The brcm,bcm2711-aux-uart devicetree binding has been removed in favour of brcm,bcm283x-aux-uart. Nodes must add ns16550 as a compatible, replace the clocks property with clock-frequency, and specify reg-shift = <2>. The dedicated BCM2711 auxiliary UART driver has been removed in favour of the generic NS16550 driver, which now provides support for the Broadcom BCM283x auxiliary UART through vendor-specific extensions. (GitHub #115112)

  • CONFIG_UART_NS16550_DW8250_DW_APB now follows devicetree: it is enabled for snps,dw-apb-uart nodes and cannot be set otherwise. Add that compatible to the UART nodes instead of setting the option in Kconfig. (GitHub #120368)

SPI

Stepper

STM32

  • gpio-keys devices will fail to suspend unless property zephyr,suspend-action is present in Devicetree with value "none" or "full-disconnect". Refer to the migration guide entry related to this binding for more details. (GitHub #104690 / GitHub #108294)

  • The STM32MP13 SoC DTSI files have been split per part number so that crypto peripherals (the hash node) are only described on the variants that provide them. Board device trees must now include the DTSI matching their exact SoC part number instead of the generic stm32mp135.dtsi. For example, stm32mp135f_dk now includes <st/mp13/stm32mp135f.dtsi> instead of <st/mp13/stm32mp135.dtsi>. Out-of-tree boards based on an STM32MP13 SoC must update their #include accordingly. (GitHub #120085)

  • SoC DTSI files now consistently use interrupt priority zero for all peripherals. Applications must now explicitly configure interrupt priorities using Devicetree if they previously relied on the values found in SoC DTSI files. (GitHub #106188)

  • st,stm32-sai binding has been restructured to reflect the SAI hardware topology. The parent node now represents the SAI Block controller, while a new child-binding represents the SAI Sub-Block instances. The following properties shall be moved from the parent SAI node to a child sub-block node: dmas, dma-names (now validated against enum: [tx, rx]), pinctrl-0, pinctrl-names, mclk-enable, mclk-divider, synchronous, and fifo-threshold. (GitHub #104423)

  • st,stm32-adc binding has been restructured to reflect the ADC hardware topology. A parent node now represents the ADC common block, which holds the clock and the settings shared by all the ADC instances connected to it, while a new child-binding represents the ADC instances themselves.

    The existing &adcN node labels still designate the ADC instances, which are now children of a common block node labelled &adcN_common, where N lists the instances sharing the block (for example &adc1_common, &adc12_common or &adc123_common). The common block node must be enabled in addition to the instance node.

    The following properties shall be moved from the &adcN instance node to its &adcN_common parent node: clocks, clock-names, st,adc-clock-source, st,adc-prescaler and vref-mv. Since the clock is now described once per common block, instances sharing it can no longer be given conflicting clock settings.

    &adc1 {
      clocks = <&rcc STM32_CLOCK(AHB2, 13)>,
               <&rcc STM32_SRC_SYSCLK ADC_SEL(3)>;
      clock-names = "adcx", "adc_ker";
      st,adc-clock-source = "ASYNC";
      st,adc-prescaler = <4>;
      vref-mv = <3000>;
      pinctrl-0 = <&adc1_in1_pa0>;
      pinctrl-names = "default";
      status = "okay";
    };
    

    Note that vref-mv only needs to be set when it differs from its 3300 default value.

    For st,stm32f1-adc and st,stm32f4-adc, each instance keeps its own register clock, so clocks and clock-names stay on the &adcN node. (GitHub #117309)

  • STM32 ADC (st,stm32-adc): when CONFIG_ADC_STM32_VREFINT_CALIBRATE is enabled (default whenever an okay st,stm32-vref node exists), adc_ref_internal() and INTERNAL adc_raw_to_millivolts_dt() results may no longer match DT vref-mv / 3300 exactly. Disable the Kconfig to keep the previous static DT-only scale.

    adc_ref_internal() no longer reports the first common block’s vref-mv for every STM32 ADC child. Each child uses its parent common block’s vref-mv (optional, default 3300). This only affects multi-common DTs that set divergent vref-mv values and relied on the old shared DEVICE_API.

    VREFINT measurement is no longer tied to the first okay st,stm32-vref node. Any enabled ADC child named by a vref node’s io-channels (including disabled vref nodes) can refresh the shared rail cache. (GitHub #117114)

  • st,hci-stm32wba and st,stm32wba-ieee802154 nodes (with nodelabels bt_hci_wba and ieee802154 respectively) are now children of a top-level st,stm32wba-radio node with nodelabel radio. The interrupts property is now set on the &radio node instead of being duplicated on both &bt_hci_wba and &ieee802154 nodes. Out-of-tree boards which modified the interrupts property on either node must be updated to set the property on the top-level &radio node instead. (GitHub #110546)

  • Renamed ST gpio-nexus for camera and display connectors as follow: st,dsi-lcd-qsh-030 is renamed into st,dsi-lcd-qsh-030-connector st,stm32-dcmi-camera-fpu-330zh is renamed into st,dvp-cam-zif-30-connector

  • st,stm32-xspim is now also used on STM32H5 and STM32H7RS series to declare and configure XSPI Manager. Boards making use of XSPI must now enable &xspim node in addition to the desired XSPI controller to use XSPI. (GitHub #109903)

  • STM32MP13 SoC DTSI ethernet: rename labels from mac: and mdio: to mac0: and mdio0:. The goal is to distinguish the 2 Ethernet controllers available. (GitHub #108574)

  • Renamed Kconfig option CONFIG_STM32_MEMMAP to CONFIG_FLASH_STM32_NOR_MEMMAP.

  • Using the stm32_lp_tick_source nodelabel to select an LPTIM as system timer is no longer supported and will trigger a build error. Use the generic chosen zephyr,system-timer instead. (GitHub #112999)

  • Properties wkup-pins-nb, wkup-pins-srcs, wkup-pins-pol, and wkup-pins-pupd as well as the child binding of st,stm32-pwr, which were related to wake-up pins, have been removed. As a replacement, a node named wakeup-controller with new compatible st,stm32-pwr-wkupctrl is introduced as a child node to all existing st,stm32-pwr nodes.

    For most out-of-tree users, it is sufficient to move the status = "okay"; property along with wake-up pin nodes declared in board DTS (if any) from the &pwr node to its new child named wakeup-controller. The following Devicetree snippets show how this can be achieved by adding two lines in board DTS:

    &pwr {
      wkup-pin@1 {
        /* ... */
      };
    
      status = "okay";
    };
    

    Note that wake-up pin nodes are now called wkup@N instead of wkup-pin@N in tree. This change is cosmetic and has no functional impact. (GitHub #114092)

  • st,stm32-pwr nodes are now enabled by default by SoC DTSI as the status = "disabled"; property has been removed. This should have no impact since the property was not used except for the wake-up pins feature, which is now handled by st,stm32-pwr-wkupctrl. (GitHub #114092)

  • All Ethernet pinctrl nodes for STM32H5 series except eth_mdc_px0, eth_mdio_px0 and eth_pps_out_px0 have been renamed to match the Data Sheet names (GitHub #118318).

    The following table indicates the mapping between old and new names and can be used to migrate:

    Old name

    New name (mii PHY)

    New name (rmii PHY)

    eth_crs_dv_px0

    N/A for MII

    eth_rmii_crs_dv_px0

    eth_ref_clk_px0

    N/A for MII

    eth_rmii_ref_clk_px0

    eth_col_px0

    eth_mii_col_px0

    N/A for RMII

    eth_crs_px0

    eth_mii_crs_px0

    N/A for RMII

    eth_rx_clk_px0

    eth_mii_rx_clk_px0

    N/A for RMII

    eth_rx_dv_px0

    eth_mii_rx_dv_px0

    N/A for RMII

    eth_rx_er_px0

    eth_mii_rx_er_px0

    N/A for RMII

    eth_rxd0_px0

    eth_mii_rxd0_px0

    eth_rmii_rxd0_px0

    eth_rxd1_px0

    eth_mii_rxd1_px0

    eth_rmii_rxd1_px0

    eth_rxd2_px0

    eth_mii_rxd2_px0

    N/A for RMII

    eth_rxd3_px0

    eth_mii_rxd3_px0

    N/A for RMII

    eth_tx_clk_px0

    eth_mii_tx_clk_px0

    N/A for RMII

    eth_tx_en_px0

    eth_mii_tx_en_px0

    eth_rmii_tx_en_px0

    eth_txd0_px0

    eth_mii_txd0_px0

    eth_rmii_txd0_px0

    eth_txd1_px0

    eth_mii_txd1_px0

    eth_rmii_txd1_px0

    eth_txd2_px0

    eth_mii_txd2_px0

    N/A for RMII

    eth_txd3_px0

    eth_mii_txd3_px0

    N/A for RMII

    Note

    Pin names now vary depending on whether an MII PHY or an RMII PHY is used; this is indicated by property phy-connection-type (mii or rmii) on the Ethernet node in Devicetree.

    px0 is a placeholder and should be replaced with actual pin names (e.g., pa1).

    SoCs of the STM32H5Ex/STM32H5Fx line are not affected by this change as they have always used the new names since their introduction in Zephyr.

Storage

  • The fs_off element of flash_sector has been changed from type off_t to ptrdiff_t. This should make all platforms and toolchains use the native machine register size and not vary based on the POSIX off_t type inherited from the C library. Picolibc 1.8.12 always defines off_t as a 64-bit integer, even on 32-bit platforms; this change effectively returns the struct to the previous layout when using this C library. For older Picolibc versions and all other supported C libraries, ptrdiff_t uses the same underlying C type as off_t; this change is intended to preserve the undering C type used for fs_off across the Picolibc update.

Syscon

  • The syscon API functions syscon_read_reg() and syscon_write_reg() now use uint32_t for the register offset parameter instead of uint16_t. This allows for larger register offsets. Code that explicitly declares uint16_t variables for the register parameter or implements the syscon driver API functions may need to be updated.

Texas Instruments

  • Using a ti,am654-timer instance as system timer now requires the explicit selection via the generic chosen zephyr,system-timer node, which is provided for all SoCs that are using it. Downstream boards and applications that want to use another instance than the SoC default one need to overwrite this. (GitHub #115068)

Timer

USB

  • On STM32N6, the clocks cell which configures the USBPHYC clock mux has been moved from usbotg_hsN to usbphycN nodes at SoC DTSI level. Boards which use an STM32N6 SoC with custom clock mux configuration must now set the clocks property on usbphycN instead of usbotg_hsN. (GitHub #107813)

  • Indicating protocol error via errno in control transfer handlers is deprecated. Handlers should return error code directly. (GitHub #108118)

  • When host issues control transfer with data stage from host to device, the USB control transfer callbacks control_to_dev in usbd_class_api and to_dev in usbd_vreq_node are now called with NULL buf before data stage is received. This allows the stack to return STALL during data stage. Out-of-tree class and vendor handlers need to be updated. (GitHub #108840)

  • USB control transfer callbacks control_to_host in usbd_class_api and to_host in usbd_vreq_node are now expected to allocate the data stage buffer themselves. This allows allocating only as much memory as is actually needed which makes the worst case memory usage dependent on the handlers implementation and not on tainted wLength value coming from host. Out-of-tree class and vendor handlers need to be updated. (GitHub #102491)

  • The Espressif USB-OTG full-speed controller compatible espressif,esp32-usb-otg has been renamed to espressif,esp32-usb-otg-fs. The internal PHY D+/D- pad numbers are now provided through the phy-dp-pin and phy-dm-pin properties. Out-of-tree devicetrees using the old compatible must update the node compatible and add the two pin properties.

  • The clock-names property is now required on st,stm32-usbphyc nodes. A default value is provided at SoC DTSI level but might need to be overridden by board DTS. (GitHub #112477)

  • The USB host controller API struct uhc_api got renamed to uhc_driver_api. It now also uses DEVICE_API. Out-of-tree USB host controller drivers must rename their API struct definitions and switch their API instances to DEVICE_API(uhc, ...). (GitHub #108414)

  • The clock-reference property of st,stm32u5-otghs-phy is now deprecated and should be removed from DTS files; the underlying driver will compute the correct value automatically if the property doesn’t exist (and honor it otherwise). (GitHub #117882)

  • The get_desc callback in usbd_class_api now returns const void * instead of void *, so that a class can keep its array of descriptor pointers in ROM. Out-of-tree classes must update the return type of their handler. (GitHub #118251)

  • CONFIG_USBD_CDC_ACM_BUF_POOL has been removed. The CDC ACM implementation now allocates bulk IN and OUT transfer buffers from per-instance pools. The device tree properties tx-fifo-size or rx-fifo-size determine the pool sizes.

Video

  • The ovti,ov7670 and ovti,ov7675 camera drivers now assume a 24 MHz XCLK input instead of the previous 6 MHz, matching the typical XCLK frequency listed in the OV7670 datasheet. Boards driving an OV7670 or OV7675 sensor must update their board-level XCLK clock configuration accordingly. For example, frdm_mcxn236 has been switched from kFRO12M_to_CLKOUT (divided by 2 to yield 6 MHz) to kFRO_HF_to_CLKOUT (divided by 2 to yield 24 MHz), and frdm_mcxn947 keeps kMAIN_CLK_to_CLKOUT but changes the CLKOUT divider from 25 to 6 to yield 24 MHz. (GitHub #109393)

  • The APIs present in <zephyr/drivers/video.h> are now available under <zephyr/video/video.h>. (GitHub #112420)

WiFi

  • In the functions implemented by the net_wifi_mgmt_offload, internally ethernet_api and wifi_mgmt_ops, a additional argument was added for a pointer to net_if. This api is not directly exposed to the application, so only out-of-tree drivers need to be updated. (GitHub #106086)

  • The Espressif Wi-Fi driver Kconfig option CONFIG_ESP32_WIFI_STA_AUTO_DHCPV4 has been removed in favor of the generic CONFIG_WIFI_STA_AUTO_DHCPV4. Applications that previously disabled the Espressif-specific option must now disable the generic option to retain manual DHCPv4 or static IP behavior after STA connection.

  • wifi_status gained status_code and reason_code members carrying the raw IEEE 802.11 codes, so the struct is larger than the int it used to be. Code that raises or receives NET_EVENT_WIFI_SCAN_DONE, NET_EVENT_WIFI_CONNECT_RESULT, NET_EVENT_WIFI_DISCONNECT_RESULT, NET_EVENT_WIFI_DISCONNECT_COMPLETE, NET_EVENT_WIFI_AP_ENABLE_RESULT or NET_EVENT_WIFI_AP_DISABLE_RESULT must use sizeof(struct wifi_status) rather than sizeof(int) for the event payload length. Event handlers that only read the status value are unaffected, as it remains the first member. (GitHub #116704)

  • A Wi-Fi connect request that runs past its timeout now reports WIFI_STATUS_CONN_TIMEOUT in NET_EVENT_WIFI_CONNECT_RESULT instead of a raw -ETIMEDOUT. This only concerns the connections handled by the supplicant. Applications that matched on the errno value have to match on the status value instead. (GitHub #116704)

Xen

  • With the introduction of zephyr-xenlib, the path to Xen’s public headers has changed. Please use xen/public/... instead of zephyr/xen/public/....

Bluetooth

Bluetooth Audio

Bluetooth Classic

  • The BR/EDR specific callbacks role_changed and br_mode_changed in bt_conn_cb have been moved into a new sub-struct bt_conn_br_cb, accessible via the br member. Application code using these callbacks must update the designated initializers:

    • .role_changed → .br.role_changed

    • .br_mode_changed → .br.mode_changed

    (GitHub #108022)

  • Renamed CONFIG_BT_DEVICE_VEDNOR_ID to CONFIG_BT_DEVICE_VENDOR_ID to fix a typo.

  • The bt_rfcomm_dlc_ops.recv callback signature has changed from void to int. Existing implementations must be updated to return 0 to preserve previous synchronous behavior, or -EINPROGRESS to use the new asynchronous completion path.

Bluetooth HCI

  • The devicetree compatible bflb,bl70x-bt-hci has been renamed to bflb,bt-hci, now that a single binding covers all Bouffalo Lab on-chip BLE controllers (BL60x/BL70x/BL70XL). Out-of-tree boards and shields must update their devicetree nodes accordingly.

  • Bluetooth HCI drivers now have to provide a mandatory common struct as the first field of their data (bt_hci_driver_data) and config (bt_hci_driver_config) structs.

  • The HCI driver setup() op, bt_hci_setup(), bt_hci_setup_params, CONFIG_BT_HCI_SETUP and the bt_h4_vnd_setup() hook of the H:4 driver are deprecated and will be removed two releases from now. A driver that implements setup() moves that work into bt_hci_driver_api.open:

    The initialization then also runs in a build without a Host, where setup() was never called.

  • The HCI driver bt_hci_driver_api.open callback no longer has a recv parameter; rather the common HCI driver layer code takes care of managing this as part of the common data struct. There is a new bt_hci_recv() API for drivers to pass data the higher layer (e.g. the Bluetooth Host stack). For drivers that need access to any error from recv() (most don’t) there’s also a new bt_hci_recv_err() API that leaves the responsibility of unrefing the buffer to the caller in case of error situations.

  • CONFIG_BT_HCI_SET_PUBLIC_ADDR no longer selects CONFIG_BT_HCI_SETUP. Out-of-tree HCI drivers that apply the public address in their setup() implementation must now select CONFIG_BT_HCI_SETUP themselves; without it the setup member does not exist in bt_hci_driver_api and the callback is not invoked. The address is now also available from the time the transport is opened, through bt_hci_get_public_addr(), allowing drivers to apply it during open() instead.

  • The HCI driver API now documents its lifecycle contract. For its user: bt_hci_open(), bt_hci_close() and bt_hci_send() are not safe to call concurrently for the same device, bt_hci_send() is only valid on an open transport, and bt_hci_close() is not called from the receive callback. For a driver: a failed open() leaves the transport closed and is not followed by close(), a failed close() leaves it open, the receive callback is not called any more once close() has succeeded, and the driver operations other than setup() do not use the Host’s HCI command APIs. Out-of-tree HCI drivers, and out-of-tree code that calls the HCI driver API directly, may have to be changed to follow these rules.

  • An H:4 vendor extension configures its controller from bt_h4_vnd_open(), declared in include/zephyr/drivers/bluetooth/h4.h, which the H:4 driver calls at the end of its open() with a lockstep helper for the extension’s commands, instead of from bt_h4_vnd_setup() and the setup() op. The extension selects CONFIG_BT_H4_VND_OPEN in place of CONFIG_BT_HCI_SETUP and reads the public address with bt_hci_get_public_addr() instead of taking it from the setup parameters. bt_h4_vnd_setup() is still called through the setup() op by an extension that keeps selecting CONFIG_BT_HCI_SETUP.

Bluetooth Host

  • The le_param_updated callback in bt_conn_cb is no longer invoked when a connection parameter update fails (i.e. the LE Connection Update Complete event reports a non-zero status). Previously it was called unconditionally, reporting the unchanged connection parameters with no error indication, which could not be distinguished from a successful update. Applications that need to be notified about rejected, application-initiated parameter updates should enable CONFIG_BT_USER_CONN_PARAM_REJECTED and implement the new le_param_update_rejected callback.

  • The CONFIG_BT_RECV_CONTEXT Kconfig choice and its options CONFIG_BT_RECV_WORKQ_SYS and CONFIG_BT_RECV_WORKQ_BT have been removed. The host now unconditionally processes low-priority HCI packets on the dedicated Bluetooth RX workqueue (the previous CONFIG_BT_RECV_WORKQ_BT behavior). Applications that selected CONFIG_BT_RECV_WORKQ_SYS to save RAM (e.g. on nRF51) must drop that option; the dedicated RX thread is now always created. Tune CONFIG_BT_RX_STACK_SIZE (the RX thread stack) for the application’s enabled host features. Since low-priority RX no longer runs on the system workqueue, applications may be able to reduce CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE, but both stack sizes are application-specific and should be validated using stack-usage measurements.

  • When CONFIG_BT_GATT_AUTO_READ_CENTRAL_ADDR_RES is enabled (the default when possible), the host reads the Central Address Resolution characteristic of a bonded peer once when the bond is created, and bt_le_adv_start(), bt_le_ext_adv_create() and bt_le_ext_adv_update_param() now fail with -ENOTSUP when BT_LE_ADV_OPT_DIR_ADDR_RPA is used towards a peer known not to support address resolution. Such a peer cannot resolve the target address, so it would never respond to the advertising. Applications that need to know in advance can read the same answer with bt_le_bond_addr_res_support(), and reach those peers with directed advertising towards their identity address instead. Disabling the option restores the previous behavior.

  • Selected Bluetooth Host work items now run on the dedicated Bluetooth RX workqueue instead of the system workqueue. Application callbacks reached from those work items consequently run in the Bluetooth RX thread. This includes connection teardown and deferred connection work (e.g. the disconnected() connection callback and SMP pairing timeouts), as well as timeout and completion paths in ATT/GATT, L2CAP, AVDTP, and HFP AG. Applications that relied on those callbacks running in the system workqueue should review their synchronization and callback stack requirements. See pull request GitHub #93033 for details.

  • CONFIG_BT_AUTO_PHY_UPDATE has been removed. Use the per-role BT_AUTO_PHY_CENTRAL and BT_AUTO_PHY_PERIPHERAL choices instead. =n does not translate to dropping the option: the central choice defaults to CONFIG_BT_AUTO_PHY_CENTRAL_2M, so both roles must be set to _NONE explicitly.

  • The deprecated CONFIG_BT_CONN_TX_MAX Kconfig option has been removed. It has been deprecated since Zephyr 4.2, and the number of pending TX buffers with a callback always follows CONFIG_BT_BUF_ACL_TX_COUNT.

  • bt_le_ext_adv_info.sid is now being set to BT_GAP_SID_INVALID for legacy advertising sets, as SIDs are only valid for extended advertising sets. Applications should not expect the bt_le_adv_param.sid to be applied for legacy advertising sets.

  • bt_le_ext_adv_info.sid now reflects the SID given to bt_le_ext_adv_update_param(). Previously it kept the value from bt_le_ext_adv_create() even though the controller applied the new one.

  • bt_addr_le_to_str() now formats LE addresses with a single-character type prefix, P: for public and R: for random, directly followed by the address, e.g. R:11:22:33:44:55:66. The previous 11:22:33:44:55:66 (random) form is no longer produced, and address types carrying additional HCI-level bits, such as BT_ADDR_LE_RANDOM_ID, are formatted by their base type rather than as (random-id) or a raw hex value. Code that parses Zephyr log or shell output to extract addresses must be updated. BT_ADDR_LE_STR_LEN has shrunk from 30 to 20 accordingly.

  • bt_addr_le_from_str() no longer takes a separate address type string. It accepts only the P:/R: prefixed format produced by bt_addr_le_to_str(); the previous "XX:XX:XX:XX:XX:XX" + "public"/"random" form is not supported. All Bluetooth shell commands that take an LE address (for example bt connect, bt disconnect, bt clear, bt fal-add, bt per-adv-sync-create, gatt resubscribe and bap_broadcast_assistant add_src) consequently take it as a single P:XX:XX:XX:XX:XX:XX or R:XX:XX:XX:XX:XX:XX argument instead of an address followed by a separate type argument.

Bluetooth Mesh

  • The deprecated CONFIG_BT_MESH_BLOB_IO_FLASH_WITH_ERASE and CONFIG_BT_MESH_BLOB_IO_FLASH_WITHOUT_ERASE Kconfig options have been removed, with no replacement. They have been deprecated since Zephyr 4.3, where the BLOB IO Flash module started querying the erase capability at runtime, and have had no effect since.

Bluetooth Services

  • CONFIG_BT_OTS_MAX_OBJ_CNT has been changed from hex to int for a more intuitive type. Simply modify any hex values like 0x30 to their decimal values like 48.

Networking

  • The HTTP client response callback (http_response_cb_t) may now be invoked more than once for a single received buffer, once per body fragment, for example once per chunk of a chunked response. Applications that assumed a single callback per receive must append every fragment they are handed.

  • CONFIG_NET_TEST_PROTOCOL, a JSON control channel that let an out of tree TTCN-3 suite drive the TCP stack and read its internal state, has been removed, along with the samples/net/sockets/tcp sample that was its only system under test. Nothing in the tree enabled the option, and the code behind it had not compiled for several years. The suites that used it were archived by their author.

    Enabling it also turned off initial sequence number randomisation and made net_tcp_connect() return without waiting for the connection, so a build that had it did not behave like one that did not.

    There is no replacement option, because the replacement is not an option: the conformance tests under tests/net/conformance drive an unaltered build over the network instead, including a TCP suite covering the same ground. See Protocol conformance testing with TTCN-3.

  • The struct dns_server type nested in dns_resolve_context has been renamed to struct dns_server_info. A C++ class member cannot share the name of its enclosing class, so the old tag made <zephyr/net/dns_resolve.h> impossible to include from C++. No field was renamed, so accesses such as ctx->servers[i].dns_server_addr are unaffected; only code that names the type itself, for example in a CONTAINER_OF() call, needs updating.

  • Various IP routing related Kconfig options will have now IPV6 prefix added to them. This is done so that we can have IPv4 routing symbols that provide same functionality as IPv6 ones but can be controlled separately.

  • IPv4 and IPv6 unicast route-table support is now exposed through the CONFIG_NET_IPV4_ROUTE and CONFIG_NET_IPV6_ROUTE options.

    These options control the per-family unicast route tables that are used by static route management, networking shell route commands, and host-side route selection for locally originated traffic such as VPN-bound packets. They do not, by themselves, enable packet forwarding between interfaces.

  • The Kconfig options CONFIG_NET_IPV4_ROUTING and CONFIG_NET_IPV6_ROUTING have been renamed to CONFIG_NET_IPV4_FORWARDING and CONFIG_NET_IPV6_FORWARDING.

    The renamed options explicitly describe IP forwarding between interfaces. Applications that only need route-table lookups or static routes should enable CONFIG_NET_IPV4_ROUTE or CONFIG_NET_IPV6_ROUTE and leave forwarding disabled. Applications acting as routers should enable both the route-table option and the corresponding forwarding option.

  • Out-of-tree IPv6 configurations should also migrate away from the deprecated legacy aliases CONFIG_NET_ROUTE, CONFIG_NET_ROUTING, CONFIG_NET_MAX_ROUTES, and CONFIG_NET_MAX_NEXTHOPS and use the CONFIG_NET_IPV6_* symbols directly.

  • The samples/net/wifi/test_certs/rsa2k enterprise test certificates have been removed. TF-PSA-Crypto cannot decrypt their DES-encrypted PKCS#8 private keys. Use samples/net/wifi/test_certs/rsa2k_no_des instead, or set WIFI_TEST_CERTS_DIR to another AES-encrypted certificate directory.

  • CONFIG_OPENTHREAD_JOINER_PSKD no longer defaults to the publicly documented "J01NME" credential, and now has no default at all. Builds that enable CONFIG_OPENTHREAD_JOINER_AUTOSTART fail until a PSKd of 6 to 32 uppercase alphanumeric characters (0-9 and A-Z excluding I, O, Q and Z) is configured.

    A PSKd set through Kconfig is compiled into the image and is therefore identical on every unit running that firmware, which lets any commissioner in range enrol an uncommissioned device into its own network. Treat the option as a development aid: product firmware should read a per-device PSKd from factory data and call otJoinerStart() from the application instead.

  • net_if_config_get was removed as it was a duplicate of net_if_get_config(). (GitHub #110930)

  • The number of ZVFS eventfd’s is now determined by a ZVFS_EVENTFD_SIZE define instead of using the CONFIG_ZVFS_EVENTFD_MAX Kconfig option directly. Subsystems can specify their own eventfd count requirements by specifying Kconfig options with the prefix CONFIG_ZVFS_EVENTFD_ADD_SIZE_. These are summed together and the result is compared against CONFIG_ZVFS_EVENTFD_MAX; the larger of the two values is used. To force CONFIG_ZVFS_EVENTFD_MAX to be used, even when its value is less than the sum of the custom requirements, a new CONFIG_ZVFS_EVENTFD_IGNORE_MIN option has been introduced (which defaults to being disabled). As a result, networking subsystems that allocate eventfds (e.g. HTTP server, CoAP server, LwM2M, PTP, SSH, the socket service and the WPA supplicant) no longer require the application to manually bump CONFIG_ZVFS_EVENTFD_MAX to account for them. (GitHub #111201)

  • CONFIG_NET_L2_PTP has been deprecated and replaced by CONFIG_NET_L2_PTP_TIMESTAMPING. The new option more accurately describes the feature it enables. Applications or board configurations that explicitly enable CONFIG_NET_L2_PTP should be updated to use CONFIG_NET_L2_PTP_TIMESTAMPING instead.

  • The default WPA supplicant network selection criterion has changed from throughput-based to reliability-based (SNR), switching the CONFIG_WIFI_NM_WPA_SUPPLICANT_NW_SEL Kconfig default from CONFIG_WIFI_NM_WPA_SUPPLICANT_NW_SEL_THROUGHPUT to CONFIG_WIFI_NM_WPA_SUPPLICANT_NW_SEL_RELIABILITY. Previously, SNR above 25 dBm was considered sufficient and largely excluded from AP selection; SNR is now always factored in, improving connection stability for embedded Wi-Fi use cases. Users who need the previous behaviour can restore it by enabling CONFIG_WIFI_NM_WPA_SUPPLICANT_NW_SEL_THROUGHPUT.

  • LLMNR support has been deprecated. The Kconfig options CONFIG_LLMNR_RESOLVER and CONFIG_LLMNR_RESPONDER will be removed in a future release (4.7 at the earliest). LLMNR (RFC 4795) is being retired by Microsoft and is disabled by default on modern Windows. Applications that rely on local name resolution should migrate to mDNS (CONFIG_MDNS_RESOLVER / CONFIG_MDNS_RESPONDER).

  • The following MQTT-SN transport functions now take an mqtt_sn_transport instead of an mqtt_sn_client:

  • On net_if_down(), the multicast addresses are no longer cleared from the interface. A leave message is still sent, but the addresses are retained in the interface’s multicast list and will be rejoined when the interface is brought back up. This allows applications to bring the interface down and up without losing the multicast addresses. (GitHub #115307)

  • The DHCPv4 client now raises NET_EVENT_IPV4_DHCP_STOP before it gives the lease up, where it used to raise it last. An application that stops the client and inspects the interface from that handler now sees the leased address and the lease’s DNS servers still installed; they are taken away after it returns, the address last. Move such work to the handler for NET_EVENT_IPV4_ADDR_DEL, which is now the final event of a teardown.

Ethernet

  • CONFIG_NET_DEFAULT_IF_ETHERNET now allows to get the first ethernet interface, instead of the first between ethernet and wifi.

  • The CONFIG_ETH_QEMU_EXTRA_ARGS and CONFIG_NET_QEMU_USER_EXTRA_ARGS options can no longer be used to specify the MAC address for the QEMU Ethernet device. Instead, CONFIG_NET_QEMU_DEVICE_EXTRA_ARGS can be used. This is because we are no longer using the -nic option for QEMU, but the -netdev and -device options. (GitHub #107326)

  • Ethernet drivers providing RX timestamps must now call net_pkt_set_rx_timestamping() after storing a valid timestamp in the received packet. AF_PACKET sockets use net_pkt_is_rx_timestamping() as the sole indication that SO_TIMESTAMPING control data is valid. Out-of-tree drivers that only populate pkt->timestamp must be updated or their RX timestamps will not be passed to socket applications. (GitHub #110582)

Modem

PTP

gPTP

  • Converted int port to uint16_t gptp_port in ethernet_context to make it clear that the field used only by the gPTP stack to store the gPTP port number.

  • Used uint16_t for nb_ports in gptp_default_ds per IEEE 1588 standard.

  • Removed net_eth_get_ptp_port and net_eth_set_ptp_port. New gptp_get_port_number() and gptp_set_port_number() can be used instead.

  • Removed CONFIG_NET_GPTP_CLOCK_ACCURACY_*, users need to make sure right gPTP clock accuracy value configured in CONFIG_NET_GPTP_CLOCK_ACCURACY.

Modem

SIMCOM SIM7080

  • The Kconfig option CONFIG_MODEM_SIMCOM_SIM7080_LTE_BANDS has been split into CONFIG_MODEM_SIMCOM_SIM7080_LTE_BANDS_M1 and CONFIG_MODEM_SIMCOM_SIM7080_LTE_BANDS_NB1 since NB-IoT and CAT-M have slightly different usable bands. The type of the newly introduced configuration values is a hex bitmap of selected bands. By default bands 8, 20 and 28 are selected.

    Applications configuring the CONFIG_MODEM_SIMCOM_SIM7080_LTE_BANDS must update their configuration.

LoRaWAN

Libraries

Ring Buffer

The ring buffer API has been reworked to reduce the ring_buf size and to make the bookkeeping path more efficient. To accommodate these changes, the zero-copy claim/finish API (ring_buf_put_claim() / ring_buf_put_finish() and their get counterparts) has been replaced by the non-stacking ring_buf_put_ptr() and ring_buf_get_ptr().

The legacy claim/finish API is still available, but only when CONFIG_RING_BUFFER is enabled. New code should use the _ptr API directly.

Enabling CONFIG_RING_BUFFER selects the legacy ring buffer header, which also brings back the other deprecated symbols that are absent from the default header: the entire item API (ring_buf_item_init(), ring_buf_item_put(), ring_buf_item_get(), ring_buf_item_space_get(), RING_BUF_ITEM_DECLARE* and RING_BUF_ITEM_SIZEOF) and ring_buf_internal_reset(). Out-of-tree code that still uses any of these fails to compile with no other hint; enabling this option is the switch that restores them while the code is migrated to sys_ringq and the _ptr API.

ring_buf_get() no longer accepts a NULL destination to discard data in the default (slim) build; passing NULL is only tolerated when CONFIG_RING_BUFFER is enabled. To drop data without a destination buffer, advance the read index directly with ring_buf_consume(), for example ring_buf_consume(rb, MIN(count, ring_buf_size_get(rb))).

Advanced use cases such as speculative-write-then-cancel and backfilling (modifying a previously written header before committing) now rely on the trailing offset parameter of ring_buf_put_ptr() and ring_buf_get_ptr(). The offset is the number of bytes past the current write (or read) index that the caller has already tentatively reserved, wrapping handled internally. You lay out successive regions by passing an increasing offset, leaving the real ring buffer unmodified, and only advance it with ring_buf_commit() (or ring_buf_consume()). If any step fails you simply return without committing, which is the equivalent of the old ring_buf_put_finish(rb, 0) cancellation.

For example, the following claim/finish code:

int write_pkg(struct ring_buf *rb, const uint8_t *payload, size_t payload_size)
{
        struct hdr *h;
        uint8_t *ptr;
        uint32_t claim_size;

        claim_size = ring_buf_put_claim(rb, (uint8_t **)&h, sizeof(*h));
        if (claim_size < sizeof(*h)) {
                ring_buf_put_finish(rb, 0);
                return -ENOMEM;
        }

        claim_size = ring_buf_put_claim(rb, &ptr, payload_size);
        if (claim_size == 0) {
                ring_buf_put_finish(rb, 0);
                return -ENOMEM;
        }
        h->len = claim_size;
        /* ... write payload through ptr ... */
        ring_buf_put_finish(rb, sizeof(*h) + h->len);
        return h->len;
}

would roughly translate to:

int write_pkg(struct ring_buf *rb, const uint8_t *payload, size_t payload_size)
{
        struct hdr *h;
        uint8_t *ptr;
        uint32_t claim_size;

        /* Reserve the header region without committing it. */
        if (ring_buf_put_ptr(rb, (uint8_t **)&h, 0) < sizeof(*h)) {
                return -ENOMEM;
        }

        /* Expose the region right after the header via a trailing offset. */
        claim_size = ring_buf_put_ptr(rb, &ptr, sizeof(*h));
        if (claim_size == 0) {
                /* Nothing was committed to rb, so the write is cancelled. */
                return -ENOMEM;
        }
        h->len = MIN(claim_size, payload_size);
        /* ... write payload through ptr ... */

        /* Publish header and payload atomically to the real buffer. */
        ring_buf_commit(rb, sizeof(*h) + h->len);
        return h->len;
}

Other subsystems

  • Demand paging (subsys/demand_paging) is moved under Memory Management into subsys/mem_mgmt/demand_paging. Custom backing store and eviction algorithm code need to be moved there.

  • The ring buffer “item” API in <zephyr/sys/ring_buffer.h> has been deprecated in favor of the new fixed-size queue API in <zephyr/sys/ringq.h>.

    Code storing fixed-size items should migrate to sys_ringq (see sys_ringq Data Structure). Code that only used the item API at the byte level should switch to the byte-mode functions ring_buf_put() / ring_buf_get() calls on the same ring_buf. (GitHub #98255)

  • The ZTEST_BENCHMARK_SETUP_TEARDOWN() and ZTEST_BENCHMARK_TIMED_SETUP_TEARDOWN() macros have been removed. Their setup/teardown signature has been folded into ZTEST_BENCHMARK() and ZTEST_BENCHMARK_TIMED(), which now require explicit setup_fn and teardown_fn arguments at every call site. Pass NULL when a benchmark genuinely needs neither.

    Update existing call sites as follows:

    /* Before */
    ZTEST_BENCHMARK(suite, my_bench, 100) { /* ... */ }
    ZTEST_BENCHMARK_TIMED(suite, my_bench, 1000) { /* ... */ }
    ZTEST_BENCHMARK_SETUP_TEARDOWN(suite, my_bench, 100, setup, teardown) { /* ... */ }
    ZTEST_BENCHMARK_TIMED_SETUP_TEARDOWN(suite, my_bench, 1000, setup, teardown) { /* ... */ }
    
    /* After */
    ZTEST_BENCHMARK(suite, my_bench, 100, NULL, NULL) { /* ... */ }
    ZTEST_BENCHMARK_TIMED(suite, my_bench, 1000, NULL, NULL) { /* ... */ }
    ZTEST_BENCHMARK(suite, my_bench, 100, setup, teardown) { /* ... */ }
    ZTEST_BENCHMARK_TIMED(suite, my_bench, 1000, setup, teardown) { /* ... */ }
    
  • The CONFIG_ZTEST_SHUFFLE_SUITE_REPEAT_COUNT and CONFIG_ZTEST_SHUFFLE_TEST_REPEAT_COUNT Kconfig options, deprecated since Zephyr 4.0, have been removed. With CONFIG_ZTEST_SHUFFLE alone, suites and tests now run once per execution, in a shuffled order; to repeat them, enable CONFIG_ZTEST_REPEAT and set CONFIG_ZTEST_SUITE_REPEAT_COUNT and CONFIG_ZTEST_TEST_REPEAT_COUNT.

  • The CPU load metric module has been merged into the unified CPU load module. The CONFIG_CPU_LOAD_METRIC option is deprecated; enable CONFIG_CPU_LOAD with the CONFIG_CPU_LOAD_BACKEND_RUNTIME_STATS backend instead. The <zephyr/sys/cpu_load_metric.h> header now simply includes <zephyr/sys/cpu_load.h>, and cpu_load_metric_get() is a deprecated wrapper around cpu_load_get_cpu(). Note that cpu_load_get_cpu() returns the load in per mille (0…1000) rather than percent; use CPU_LOAD_PERMILLE_TO_PERCENT to convert.

  • The internal __ASSERT_ON define has been removed. Out-of-tree code should invoke __ASSERT() or __ASSERT_NO_MSG() directly, as these macros already compile out when assertions are disabled. Mark values used only by assertions with __maybe_unused or ARG_UNUSED() as appropriate.

  • Several legacy assertion Kconfig options are deprecated in favor of the per-module ZASSERT levels (CONFIG_ASSERT_MODULE_<module>_LEVEL, defaulting through the DEFAULT module):

  • The assertion hooks assert_post_action and assert_print have been removed. Use the new zassert_post_action and zassert_vprint hooks to achieve equivalent functionality. Note: The zassert_post_action hook is a terminal function, returning to the caller is not supported. If the application needs to return to the caller, enabling CONFIG_ASSERT_TEST will declare the zassert_post_action hook as a non-terminal function, allowing execution to continue after the hook runs.

  • CONFIG_ASSERT_NO_FILE_INFO does not change the zassert_post_action hook signature like the old assert_post_action hook did.

  • The zassert hook zassert_vprint, the replacement for assert_print, is now called with a va_list argument instead of a variable number of arguments. Out-of-tree code that implements this hook must be updated.

FIDO2

hawkBit

  • The legacy <zephyr/mgmt/hawkbit.h> header, deprecated since Zephyr 4.0, has been removed. Include <zephyr/mgmt/hawkbit/hawkbit.h>, <zephyr/mgmt/hawkbit/config.h> and <zephyr/mgmt/hawkbit/autohandler.h> instead.

Logging

  • The UART dictionary log parsing script scripts/logging/dictionary/log_parser_uart.py has been removed. Use scripts/logging/dictionary/live_log_parser.py instead, which takes the port and baud rate after a serial sub-command.

MCUboot

  • CONFIG_MCUBOOT_BOOTLOADER_MODE_SWAP_WITHOUT_SCRATCH has been removed. Use CONFIG_MCUBOOT_BOOTLOADER_MODE_SWAP_USING_MOVE instead.

  • Sysbuild no longer forces the MCUboot overwrite-only mode and unsigned images on Espressif SoCs. Boards using them now get the generic defaults: swap using offset, which keeps the previous image for a revert, and RSA-2048 signatures with the MCUboot development key. Projects with their own key must set SB_CONFIG_BOOT_SIGNATURE_KEY_FILE, and projects that relied on the previous behavior can select SB_CONFIG_MCUBOOT_MODE_OVERWRITE_ONLY and SB_CONFIG_BOOT_SIGNATURE_TYPE_NONE explicitly. A bootloader built after this change rejects unsigned images, so the bootloader and the application must be reflashed together when a device is moved to the new defaults.

  • The shared Espressif partition tables no longer define a scratch_partition, so SB_CONFIG_MCUBOOT_MODE_SWAP_SCRATCH is no longer available on boards using them. The other partitions keep their offsets. Projects that need it can add the partition back in a board overlay.

MCUmgr

  • CONFIG_MCUMGR_GRP_OS_INFO_HARDWARE_INFO_SHORT_HARDWARE_PLATFORM has been removed. The OS/Application Info command now always reports the board target as hardware platform; the pre-4.3 board and board revision output is no longer available.

  • CONFIG_MCUMGR_TRANSPORT_UART_MTU and CONFIG_MCUMGR_TRANSPORT_SHELL_MTU have been deprecated. They only set the value returned by the deprecated get_mtu callback, which the SMP layer does not use: serial frames are limited to 127 bytes and the maximum SMP packet size is set by CONFIG_MCUMGR_TRANSPORT_NETBUF_SIZE. Remove them from configuration files; a deprecation warning is emitted when they are changed from their default.

  • The get_mtu member of smp_transport_api_t and the smp_transport_get_mtu_fn type have been deprecated, as the SMP layer never calls them. Out-of-tree code should stop setting or calling get_mtu. Transports remain responsible for fragmenting outgoing packets in their output function (see smp_transport_out_fn).

  • The image management client (CONFIG_MCUMGR_GRP_IMG_CLIENT) now supports SHA-512 image digests in addition to SHA-256:

  • CONFIG_MCUMGR_TRANSPORT_UDP_MTU can no longer exceed CONFIG_MCUMGR_TRANSPORT_NETBUF_SIZE, and a larger value now fails at configuration time. When the buffer is smaller than 1500 bytes, the MTU now defaults to the buffer size instead of 1500.

  • smp_client_single_response() takes the SMP transport the response was received on as a new first argument, and res_hdr must be in host byte order. A response now only completes a pending command that was sent on that transport and has the same group and command ID. Responses from a server that does not echo the group and command ID are ignored, and the command is retried until it times out.

Network buffers

POSIX

Random

  • CONFIG_CTR_DRBG_CSPRNG_GENERATOR has been removed. Use CONFIG_PSA_CSPRNG_GENERATOR instead.

  • CONFIG_CS_CTR_DRBG_PERSONALIZATION has been removed. It did not have any effect.

Secure Storage

  • The following files were renamed:

    • zephyr/secure_storage/its/store/settings_get.h -> zephyr/secure_storage/its/store/settings.h

    • zephyr/secure_storage/its/transform/aead_get.h -> zephyr/secure_storage/its/transform/aead.h

  • The ZMS backend partition chosen name has been updated from secure_storage_its_partition to zephyr,secure-storage-its-partition. (GitHub #118501)

  • The psa_its_get*() functions can now return PSA_ERROR_INVALID_SIGNATURE and PSA_ERROR_DATA_CORRUPT, which were previously reported as PSA_ERROR_GENERIC_ERROR. (GitHub #118718)

  • psa_its_get() called with a data_size of 0 goes through the usual retrieval path, so it can now fail, with PSA_ERROR_DOES_NOT_EXIST for instance, instead of always returning PSA_SUCCESS. (GitHub #118718)

Shell

  • The kernel log_level <module> <severity> shell command, deprecated since Zephyr v4.1.0, has been removed. Use log enable <severity> <module> instead: the arguments are reversed and the severity is a name (none, err, wrn, inf, dbg), not a number.

Stream Flash

Tools

  • The --skip-rebuild option of the west commands that invoke a runner (flash, debug, debugserver, attach, rtt, reset, robot and simulate) has been removed. Use --no-rebuild instead.

  • The PYOCD_DAPARG environment variable is no longer read by the pyocd runner. Pass --daparg to west flash/west debug instead.

  • The openocd runner now selects a debug adapter by serial number through the canonical -i/--dev-id option, like the other runners. The previous --serial option is deprecated and kept as an alias; it maps onto the same mechanism (the value is still passed to the OpenOCD config as _ZEPHYR_BOARD_SERIAL). Update any scripts to use west flash -i <serial>.

Modules

  • The CHRE framework is no longer an optional module of the Zephyr manifest and its sample moved out of the Zephyr tree. It is now an external module; add it to the application manifest to keep using it.

  • Support for the CANopenNode protocol stack was moved to an external module.

lvgl

  • The zephyr,lvgl-pointer-input devicetree binding marks the swap-xy, invert-x, and invert-y properties as deprecated. Users should instead add the corresponding touchscreen properties swapped-x-y, inverted-x, and inverted-y to the underlying touch input controller device node, where these transformations are now defined canonically.

  • CONFIG_LV_Z_FULL_REFRESH is now part of the LV_Z_RENDERING_MODE Kconfig choice, alongside CONFIG_LV_Z_PARTIAL_REFRESH (default) and CONFIG_LV_Z_DIRECT_RENDERING. Setting CONFIG_LV_Z_FULL_REFRESH=y in a .conf fragment still works, but CONFIG_LV_Z_FULL_REFRESH=n is silently ignored because a choice member cannot be deselected that way. Out-of-tree boards or shields that used CONFIG_LV_Z_FULL_REFRESH=n to opt out of a full-refresh default must instead override the choice default in a Kconfig.defconfig or .defconfig file:

    choice LV_Z_RENDERING_MODE
      default LV_Z_PARTIAL_REFRESH
    endchoice
    

hal_nxp

  • The CONFIG_LV_USE_GPU_NXP_PXP Kconfig option has been removed. It only enabled the NXP PXP HAL driver component, which is already enabled by CONFIG_MCUX_PXP, defaulting to y when the nxp,pxp devicetree node is enabled and CONFIG_DISPLAY is set. Applications that use the PXP driver component without the display subsystem must enable CONFIG_MCUX_PXP explicitly.

  • S32K344: The pinmux header file for this SoC was renamed from S32K344-172MQFP-pinctrl.h to S32K344_K324_K314_172HDQFP-pinctrl.h. Out-of-tree boards must update their include directive accordingly:

    #include <nxp/s32/S32K344_K324_K314_172HDQFP-pinctrl.h>
    

Mbed TLS

Trusted Firmware-M (TF-M)

Snippets

  • Rename xen_dom0 to xen-dom0.

Architectures

  • A new architecture primitive, arch_cpu_irqs_are_enabled(), has been added. It returns the current interrupt-enable state of the calling CPU without modifying it, complementing arch_irq_unlocked() which inspects a saved key. Out-of-tree architecture ports must provide an implementation.

  • CONFIG_XTENSA_MPU_ONLY_SOC_RANGES is removed. For SoC or board to override the default MPU region table, override xtensa_mpu_ranges in the SoC or board layer instead.

  • xtensa_soc_mpu_ranges[] and xtensa_soc_mpu_ranges_num are removed. If SoC or board needs its own memory regions at boot, override xtensa_mpu_ranges instead.

  • CONFIG_XTENSA_MPU_DEFAULT_MEM_TYPE is removed since memory types are now defined via xtensa_mpu_mem_type_ranges[].

  • CONFIG_XTENSA_BACKTRACE_EXCEPTION_DUMP_HOOK is removed, since backtrace is now always using EXCEPTION_DUMP for output.

  • SoCs using CONFIG_XTENSA_BACKTRACE are now expected to implement xtensa_soc_stack_ptr_is_sane() and xtensa_soc_ptr_executable().

  • The ARMv7-M MPU device-type region attributes REGION_PPB_ATTR, REGION_IO_ATTR and REGION_EXTMEM_ATTR now set Execute-Never (XN=1) on all ARMv7-M cores. Executing from Device/Strongly-ordered memory is architecturally UNPREDICTABLE on ARMv7-M, so no valid use case is affected. On Cortex-M7 the XN attribute additionally prevents speculative instruction fetches into these regions, which can cause bus hangs or read side effects in peripheral space (Arm Cortex-M7 TRM, “Speculative accesses - Considerations for system design”); the memory type alone does not prevent them. Out-of-tree boards that nevertheless execute from a region mapped with these attributes must define a custom attribute instead.

  • The new CONFIG_ARM_MPU_CM7_UNMAPPED_REGION option makes the Arm MPU driver program the lowest-priority MPU region (region 0) as a 4GB Strongly-ordered, no-access, Execute-Never catch-all, implementing the workaround for Arm Cortex-M7 erratum 1013783 (SDEN-1068427) and preventing Cortex-M7 speculative accesses to unmapped addresses. Cortex-M7 boards or SoCs whose static MPU region table explicitly covers all memory the firmware uses can enable it; the static regions are then programmed starting from MPU region 1. The mimxrt1180_evk and frdm_imxrt1186 cm7 targets enable it by default, replacing their previous hand-rolled UNMAPPED MPU region table entry with identical runtime behavior.

  • CONFIG_SSE and CONFIG_SSE_FP_MATH have been removed. Use CONFIG_X86_SSE and CONFIG_X86_SSE_FP_MATH instead.

  • CONFIG_PLATFORM_SPECIFIC_INIT and its z_arm_platform_init() hook have been removed. Enable CONFIG_SOC_RESET_HOOK and rename the hook to soc_reset_hook(). The new hook runs later in the reset path, after the stack pointers have been set up, and is skipped on resume from suspend-to-RAM.

  • The RISC-V specific CONFIG_EXTRA_EXCEPTION_INFO has been removed. Use CONFIG_EXCEPTION_DEBUG instead. The option is unchanged on Arm and SPARC.

  • Both arch_mem_map() and arch_mem_unmap() have changed from returning void to int so that the caller can react to error code when assertion is disabled. If assertion is enabled, it currently retains mostly the previous behavior of halting the system.

Video

  • video_import_buffer() no longer returns the imported buffer index via a uint16_t *idx output parameter but instead returns a pointer to the imported video_buffer, or NULL on failure. This helps to make the index transparent to the application and also makes the buffer accessible from the application.

Twister

  • Faults after tests have passed are now explicitly detected and fail the whole testsuite, if a test produces a fault on purpose then the corresponding test case has to be marked with ignore_faults: true (GitHub #116359).