Zephyr 4.5.0 (Working Draft)
We are pleased to announce the release of Zephyr version 4.5.0.
Major enhancements with this release include:
New driver classes
Zephyr 4.5 adds several new driver APIs, including:
Clock Monitor for runtime observation of clock frequency
New subsystems
Zephyr 4.5 adds several new subsystem APIs, including:
Video for controlling video drivers
An overview of the changes required or recommended when migrating your application from Zephyr v4.4.0 to Zephyr v4.5.0 can be found in the separate migration guide.
The following sections provide detailed lists of changes by component.
API Changes
Removed APIs and options
Architectures
Xtensa
CONFIG_XTENSA_BACKTRACE_EXCEPTION_DUMP_HOOK
Bluetooth
Host
The
CONFIG_BT_RECV_CONTEXTchoice and its optionsCONFIG_BT_RECV_WORKQ_SYSandCONFIG_BT_RECV_WORKQ_BThave been removed. The host now always processes low-priority HCI packets on the dedicated Bluetooth RX workqueue (the formerCONFIG_BT_RECV_WORKQ_BTbehavior). See the migration guide.Selected Host work items have moved from the system workqueue to the dedicated Bluetooth RX workqueue. Application callbacks reached from those work items now run in the Bluetooth RX thread. See the migration guide for affected callback families.
The
CONFIG_BT_HCI_RAW_H4andCONFIG_BT_HCI_RAW_H4_ENABLEKconfig options have been removed. They have had no effect since Zephyr 4.2, where the HCI raw layer switched to using H:4 packet encoding for all buffers unconditionally. Applications still setting these options can simply drop them.
Counter
CONFIG_COUNTER_MAXIM_DS3231
LLEXT
llext_get_fn_table, replaced byllext_get_fn_table_entry
Networking
CONFIG_NET_TC_SKIP_FOR_HIGH_PRIOCONFIG_NET_SOCKETS_POLL_MAXCONFIG_NET_GPTP_CLOCK_ACCURACY_*net_ipv6_set_hop_limit()net_if_ipv4_get_netmask()net_if_ipv4_set_netmask()net_if_ipv4_set_netmask_by_index()openthread_state_changed_cb_register()openthread_state_changed_cb_unregister()openthread_start()openthread_api_mutex_lock()openthread_api_mutex_try_lock()openthread_api_mutex_unlock()struct openthread_state_changed_cbTLS_CREDENTIAL_SERVER_CERTIFICATEstart_11r_roaming
Random
CONFIG_CTR_DRBG_CSPRNG_GENERATORCONFIG_CS_CTR_DRBG_PERSONALIZATION
West sign support for imgtool, which was deprecated in Zephyr 4.0, has been removed.
Deprecated APIs and options
Audio Codec
The
audio_codec_apistruct has been deprecated. Audio codec drivers are now expected to use theDEVICE_APImacro to declare their driver API.
Build system
The
zephyr_file_copy()CMake function has been deprecated. Use the nativefile(COPY_FILE ...)CMake command instead.
CPU Load
CONFIG_CPU_LOAD_METRICandcpu_load_metric_get()are deprecated. The CPU load metric module has been merged into the unified CPU load module; useCONFIG_CPU_LOADwith theCONFIG_CPU_LOAD_BACKEND_RUNTIME_STATSbackend andcpu_load_get_cpu().
DMIC
The
_dmic_opsstruct has been deprecated. DMIC drivers are now expected to use theDEVICE_APImacro to declare their driver API.
Fuel Gauge
Deprecated various fuel gauge property enums and union fields in favor of new versions with explicit unit suffixes.
LoRa
Renamed
lora_recv_duty_cycle()tolora_recv_duty_cycle_async()to be consistent with the existing sync/async naming convention.
Nordic
The internal SoC platform Kconfig symbols
NRF_PLATFORM_HALTIUMandNRF_PLATFORM_LUMOShave been deprecated. Use specific SOC_SERIES_* Kconfig options instead.The sysbuild Kconfig option
SB_CONFIG_NRF_HALTIUM_GENERATE_UICRhas been renamed toSB_CONFIG_NRF_GENERATE_UICR.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.
Ring buffer
The ring buffer item API (
ring_buf_item_init(),ring_buf_item_put(),ring_buf_item_get(),ring_buf_item_space_get()) has been deprecated in favor ofsys_ringq(see sys_ringq Data Structure).
Networking
Deprecated LLMNR support (
CONFIG_LLMNR_RESOLVERandCONFIG_LLMNR_RESPONDER). LLMNR is being phased out; use mDNS (CONFIG_MDNS_RESOLVER/CONFIG_MDNS_RESPONDER) instead.
Networking Link layer
Deprecated
CONFIG_NET_L2_PTP. UsedCONFIG_NET_L2_PTP_TIMESTAMPINGinstead.
Timer
New
sys_clock_no_timeout()hook for handling ofCONFIG_SYSTEM_CLOCK_SLOPPY_IDLE, replacing the call tosys_clock_set_timeout()withticks=K_TICKS_FOREVER.New
sys_clock_idle_enter()hook for handling of entry in low-power state, replacing the call tosys_clock_set_timeout()withidle=true.
Video
All functions in the video driver API (
<zephyr/drivers/video.h>) have moved to the video subsystem (<zephyr/video/video.h>). Application only need to rename the#include.
Work queue
k_work_q.threadhas been deprecated. Usek_work_q.thread_idinstead.
New APIs and options
ADC
Optional
adc_driver_api.ref_getcallback andadc_ref_get()so applications andadc_raw_to_millivolts_dt()can use a driver-owned runtime millivolt scale for anyadc_reference. Staticadc_driver_api.ref_internalremains the fallback forADC_REF_INTERNALwhen the callback is NULL.adc_raw_to_millivolts_dt()falls back to channel DTzephyr,vref-mvwhenadc_ref_get()fails.
Architectures
CONFIG_ARM_MPU_CM7_UNMAPPED_REGION(Arm Cortex-M7 catch-all MPU region for unmapped addresses, erratum 1013783 workaround)CONFIG_EXCEPTION_DUMP(enabled by default, can be disabled to compile out the fault handler output on size constrained builds)
Audio
Bluetooth
Audio
Host
bt_le_adv_param.tx_powerandBT_LE_ADV_OPT_TX_POWERto request a specific TX power level per extended advertising set.BT_HCI_QUIRK_NO_FLOW_CONTROLHCI device quirk for controllers that advertise but reject the controller to host flow control commands.
Mesh
Crypto
Devicetree
Haptics
haptics_monitorhaptics_monitor_typehaptics_source
HWSPINLOCK
Kconfig
Add
dt_partition_mtdpreprocessor function (GitHub #111599)
Kernel
LoRa
Management
MCUmgr
Added support for SPI MCUmgr SMP transport, which can be enabled with
CONFIG_MCUMGR_TRANSPORT_SPI.
Network
Add
net_eth_set_if_type_wifi()to set the ethernet interface type to Wi-Fi.Add
net_dhcpv4_set_reboot_hint()to seed the DHCPv4 client with a previously leased address for INIT-REBOOT.Add an mDNS responder interface policy (
CONFIG_MDNS_RESPONDER_IFACE_POLICY_ALLOWLIST,CONFIG_MDNS_RESPONDER_IFACE_POLICY_DENYLIST) together withCONFIG_MDNS_RESPONDER_IFACE_LISTto control on which network interfaces the mDNS responder operates.Add
mdns_responder_enable_iface()andmdns_responder_disable_iface()(CONFIG_MDNS_RESPONDER_RUNTIME_IFACE_CONTROL) to enable or disable the mDNS responder on a network interface at runtime.Add a DHCPv6 server with IPv6 prefix delegation support (
CONFIG_NET_DHCPV6_SERVER):net_dhcpv6_server_start(),net_dhcpv6_server_stop()andnet_dhcpv6_server_foreach_lease().Add IPv6 router role, that is, transmission of Router Advertisements (
CONFIG_NET_IPV6_ND_RA_TX):net_if_ipv6_router_start(),net_if_ipv6_router_stop()andnet_if_ipv6_prefix_set_advertise().Add requesting router support to the DHCPv6 client, a delegated prefix can be sub-delegated onto downstream links via
net_dhcpv6_params.downstream_ifaces.Add
net_eth_mcast_addr_add(),net_eth_mcast_addr_rm()andnet_eth_mcast_addr_foreach(). The Ethernet L2 now keeps track of the link layer multicast addresses that an interface listens to, so an Ethernet driver is asked to change its receive filter only when a group is joined by its first user or left by its last one. Previously the IP level joins and the packet socket memberships were forwarded to the driver separately, and leaving one group could stop the device from listening to another group that needs the same link layer address. This happens easily as IPv4 multicast addresses map 32:1 to link layer addresses. A driver can also treatETHERNET_CONFIG_TYPE_FILTERas a hint that the addresses changed and reprogram its filter by iterating them withnet_eth_mcast_addr_foreach(), which suits devices that filter by a hash of the address. How many addresses an interface can track is the sum of what the enabled subsystems ask for, andCONFIG_NET_L2_ETHERNET_MCAST_FILTER_COUNTcan raise it if an application needs more. A multicast destination address given tonet_eth_mac_filter()or toNET_REQUEST_ETHERNET_SET_MAC_FILTERis counted the same way, so each such filter that an application sets must now also be unset by it, and unsetting one that was never set fails with-ENOENT.Add
ZSOCK_PACKET_ADD_MEMBERSHIPandZSOCK_PACKET_DROP_MEMBERSHIPsocket options at theZSOCK_SOL_PACKETlevel (CONFIG_NET_SOCKETS_PACKET_MCAST_MEMBERSHIP), so that a packet socket can ask the network interface to start or stop listening to an extra L2 multicast address. On Ethernet the address is programmed to the receive filter of the device if it supports filtering, and a device that does not filter passes the group up anyway. A join that the interface cannot serve is reported to the application,ENOMEMif the interface cannot track another address andENOTSUPif it is not an Ethernet interface. The membership changes are reported by theNET_EVENT_PACKET_MCAST_MEMBERSHIP_ADDandNET_EVENT_PACKET_MCAST_MEMBERSHIP_DROPnetwork management events. Memberships still held when the socket is closed are dropped automatically, andCONFIG_NET_SOCKETS_PACKET_MCAST_MEMBERSHIP_COUNTsets how many memberships can be active at the same time.
Power Management
Ring buffer
Zbus
New Boards
Arduino
Arduino Nesso N1 (
arduino_nesso_n1)
Seeed
Seeed Wio Tracker L1 (
wio_tracker_l1)
WCH
WCH CH32V103EVT (
ch32v103evt)
New Shields
New Drivers
ADC
Analog Devices AD4190-8 and AD4195-8 Sigma-Delta ADCs (
adi,ad4190-8-adc,adi,ad4195-8-adc).
GPIO
Diodes/Pericom PI4IOE5V6408 8-bit I2C-bus I/O expander (
diodes,pi4ioe5v6408).ST Zio connector for STM32 Nucleo-144 boards (
st-zio-header).
Input
VIRTIO input device (
virtio,input).
Sensors
Analog Devices ADXL313 3-axis accelerometer (
adi,adxl313).
Clock Monitor
nxp,cmu-fc— NXP Clock Monitoring Unit (Frequency Check) back-end for the new Clock Monitor subsystem.nxp,cmu-fm— NXP Clock Monitoring Unit (Frequency Meter) back-end for the new Clock Monitor subsystem.
USB
espressif,esp32-usb-otg-fs- Espressif USB-OTG full-speed controller with internal FS/LS PHY.espressif,esp32-usb-otg-hs- Espressif USB-OTG high-speed controller with internal UTMI PHY.
New Samples
MCTP I2C GPIO Top Node Sample (renamed from
mctp_i2c_bus_owner)MCTP I3C Top Node Sample (renamed from
mctp_i3c_bus_owner)samples/drivers/clock_monitor/check_freq— demonstrates WINDOW-mode out-of-window frequency checking on the new Clock Monitor.samples/drivers/clock_monitor/measure_freq— demonstrates MEASURE-mode one-shot frequency measurement on the new Clock Monitor.
Libraries / Subsystems
Crypto
Added AES CFB and OFB cipher mode support.
Mbed TLS
Mbed TLS was updated to version 4.1.1. Release notes can be found here.
TF-PSA-Crypto was updated to version 1.1.1. Release notes can be found here.
Added
CONFIG_TF_PSA_CRYPTO_DISPATCH_DIR, which enables TF-PSA-Crypto to use custom implementations of crypto operation dispatch. This makes hardware acceleration of cryptographic operations possible by using an accelerator-aware dispatch implementation.
TF-M
TF-M was updated from version 2.2.2 to version 2.3.0. Release notes can be found here.
TF-M can now be compiled using LLVM by setting
ZEPHYR_TOOLCHAIN_VARIANTtozephyr/llvm.
DFU
Added
CONFIG_IMG_CUSTOM_SECTOR_SIZEto allow MCUboot to use a different sector size for reducing the swap-using-offset status area size.
LoRa / LoRaWAN
Added a native LoRaWAN backend (
CONFIG_LORA_MODULE_BACKEND_NATIVE) that implements LoRaWAN 1.0.x Class A directly on top of the LoRa radio driver, without the Semtech LoRaMac-node dependency. Currently supports the EU868 region.
Video
Introducing a video subsystem that inherits all the function names previously in video drivers.
Zbus
CONFIG_ZBUS_MSG_SUBSCRIBER_NET_BUF_POOL_ISOLATIONnow works without requiring a dedicated pool on every channel (channels fall back to the shared pool untilzbus_chan_set_msg_sub_pool()is called)
Devicetree
Nodes can now use phandles to refer to their children without causing a cycle in the dependency graph and a build error. See dependency-mode how to use this new feature. (GitHub #108892)
Other notable changes
Build system
The minimum required CMake version has been raised to 3.28.0, a version satisfied by the CMake package in the Ubuntu 24.04 LTS package repositories. See the migration guide for options if your distribution ships an older version.
Kernel
CONFIG_SCHED_CPU_MASKno longer depends onCONFIG_SCHED_SIMPLE. CPU affinity masks are now supported on all three scheduler backends:SCHED_SIMPLE(O(N) list scan),SCHED_SCALABLE(O(N) red/black tree walk), andSCHED_MULTIQ(O(P·N) per-priority bucket scan). See the updated SMP documentation for per-backend performance notes.CONFIG_SCHED_CPU_MASK_PIN_ONLYnow enforces the one-CPU-bit invariant at both the API boundary (cpu_mask_mod()) and at queue time (thread_runq()). Callingk_thread_cpu_mask_clear(),k_thread_cpu_mask_enable_all(), ork_thread_cpu_mask_disable()in PIN_ONLY mode triggers an assertion failure. Usek_thread_cpu_pin()to reassign a thread to a different CPU.
Timer
With
CONFIG_SYSTEM_CLOCK_SLOPPY_IDLEenabled, a driver may no longer stop its time base as soon as no timeout is pending, if that breakssys_clock_cycle_get_32()/sys_clock_cycle_get_64(). Those must keep counting while the CPU runs. Stopping the time base is permitted only fromsys_clock_idle_enter(), wheresys_clock_idle_exit()is guaranteed to follow.Tickless system-timer drivers can now be built on a shared implementation header,
drivers/timer/system_timer_generic.h, which owns the tick accounting each driver previously open-coded: the cycle-to-tick conversion, the announce baseline, the tick-aligned deadline and the counter wrap and range handling. A driver reduces to a few cycle-domain primitives, a cycle-counter read plus an absolute-compare arm. See the migration guide for how to use it (GitHub #115844).
Wi-Fi
Removed the
samples/net/wifi/test_certs/rsa2kenterprise test certificates (DES-encrypted private keys). Usersa2k_no_desinstead.The transmit power ceiling properties in
wifi-tx-power-2g.yamlandwifi-tx-power-5g.yamlare no longerrequiredand now carry conservative defaults, so a board that has not been characterised errs on the side of transmitting too little rather than exceeding a regulatory limit. Boards that have measured their own limits continue to state them explicitly, so no board changes behaviour.
MCUboot
SB_CONFIG_BOOT_SIGNATURE_KEY_FILEnow accepts a comma-separated list of key files, embedding the public half of each in the MCUboot bootloader. When more than one key is given, MCUboot accepts an image signed with any of them – the typical use is a development bootloader that boots both development- and production-signed images, while production bootloaders embed only the production key. The first entry is the key the application is signed with and the rest are verification-only public keys. See Signing Binaries.
NXP
The NXP LPC DTSI files have been reorganized from the flat
dts/arm/nxp/lpc/directory into per-series subdirectories (lpc11u6x/,lpc51u68/,lpc54xxx/,lpc55xxx/,lpc84x/). See the migration guide for how to update out-of-tree board includes.The NXP Kinetis DTSI files have been reorganized from the flat
dts/arm/nxp/kinetis/directory into per-series subdirectories (k2x/,k32lx/,k6x/,k8x/,ke1xf/,ke1xz/,kl2x/,kv5x/,kwx/). See the migration guide for how to update out-of-tree board includes.The NXP MCX DTSI files have been reorganized from the flat
dts/arm/nxp/mcx/directory into per-series subdirectories (mcxa/,mcxc/,mcxe/,mcxl/,mcxn/,mcxw/). See the migration guide for how to update out-of-tree board includes.The NXP i.MX RT DTSI files have been reorganized from the flat
dts/arm/nxp/imxrt/directory into per-series subdirectories (imxrt10xx/,imxrt11xx/,imxrt5xx/,imxrt6xx/,imxrt7xx/,imxrt118x/). See the migration guide for how to update out-of-tree board includes.
Arm
- The non-secure variant of
Arm Musca-S1 (
v2m_musca_s1/musca_s1/ns) has been removed due to TF-M removing platform support for this board.
As a consequence of the above, the secure variant of Arm Musca-S1 (
v2m_musca_s1) has been deprecated. This is to avoid a confusing state of partial support.
Trusted Firmware-A
CONFIG_TFA_BUILD_FIPis introduced to configure FIP (Firmware Image Package) generation. FIP generation is by default disabled, but can be enabled by settingCONFIG_TFA_BUILD_FIP=yinprj.confor for custom boards, in the board’s<board>_defconfigfile.