:orphan:

.. _zephyr_3.6:

Zephyr 3.6.0 (Working Draft)
############################

We are pleased to announce the release of Zephyr version 3.6.0.

Major enhancements with this release include:

* New :ref:`GNSS subsystem <gnss_api>` added, enabling geo-awareness in Zephyr applications.
* New API and drivers introduced for interfacing with :ref:`keyboard matrices <gpio-kbd>`.
* New socket and CoAP service libraries streamlining the implementation of socket and CoAP servers
  respectively, while also optimizing the use of resources.
* Integrated Trusted Firmware-M (TF-M) 2.0, including an update to Mbed TLS 3.5.2.
* Improved LLEXT tooling, simplifying module creation in the Zephyr build system.
* Userspace support extended to Xtensa architecture.
* Build system now supports Link Time Optimization (LTO), reducing the size of the final image.
* Bluetooth Mesh protocol 1.1 now supported by default.
* Major updates to the documentation of the :ref:`native simulator <native_sim>`, clarifying
  supported peripherals and how to use them.
* Over 30 new supported boards, spanning all Zephyr-supported architectures.

An overview of the changes required or recommended when migrating your application from Zephyr
v3.5.0 to Zephyr v3.6.0 can be found in the separate :ref:`migration guide<migration_3.6>`.

The following sections provide detailed lists of changes by component.

Security Vulnerability Related
******************************
The following CVEs are addressed by this release:

More detailed information can be found in:
https://docs.zephyrproject.org/latest/security/vulnerabilities.html

* CVE-2023-5779 `Zephyr project bug tracker GHSA-7cmj-963q-jj47
  <https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-7cmj-963q-jj47>`_

* CVE-2023-6249 `Zephyr project bug tracker GHSA-32f5-3p9h-2rqc
  <https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-32f5-3p9h-2rqc>`_

* CVE-2023-6749 `Zephyr project bug tracker GHSA-757h-rw37-66hw
  <https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-757h-rw37-66hw>`_

* CVE-2023-6881 `Zephyr project bug tracker GHSA-mh67-4h3q-p437
  <https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-mh67-4h3q-p437>`_

* CVE-2023-7060: Under embargo until 2024-03-14

* CVE-2024-1638 `Zephyr project bug tracker GHSA-p6f3-f63q-5mc2
  <https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-p6f3-f63q-5mc2>`_

Architectures
*************

* ARC

  * Enabled hardware prefetcher and shared cluster cache (SCM - Shared Cluster
    Memory) for ARCv3 processors (HS5x & HS6x).
  * Disabled Thread-local Storage support for platforms with two or more register banks.
  * Fixed unstable work of application built with MetaWare toolchain for hardware
    platforms (garbage in .device_states section).

* ARM

  * MPU regions are now always cleared before initialization.
  * Standardized on :c:func:`arch_secondary_cpu_init` to provide consistency
    across all architectures.
  * Renamed :c:func:`z_arm_prep_c` as :c:func:`z_prep_c` to provide
    consistency across all architectures.
  * Renamed the exception header to be consistent across all architectures.
  * GDB stubs added (currently only supports Zynq-7000).
  * Added support for custom interrupt controllers using
    :kconfig:option:`CONFIG_ARM_CUSTOM_INTERRUPT_CONTROLLER`.
  * MMU and MPU initialization moved to :c:func:`z_prep_c` for Cortex-A and
    Cortex-R to enable initialization by individual cores.
  * Common Cortex-M MPU code moved to ``arch/arm/core/mpu``.

* Xtensa

  * Removed the unused Kconfig option ``CONFIG_XTENSA_NO_IPC``.

  * Added userspace support via MMU.

Bluetooth
*********

* Audio

  * Changed ``bt_bap_scan_delegator_subgroup`` to :c:struct:`bt_bap_bass_subgroup` and
    made it independent of :kconfig:option:`CONFIG_BT_BAP_SCAN_DELEGATOR`.
  * Modified :c:func:`bt_bap_stream_send` to no longer take a timestamp as parameter,
    and added :c:func:`bt_bap_stream_send_ts` that does.
  * Modified :c:func:`bt_cap_stream_send` to no longer take a timestamp as parameter,
    and added :c:func:`bt_cap_stream_send_ts` that does.
  * Assigned number values have been moved from :file:`include/zephyr/bluetooth/audio/lc3.h` to
    :file:`include/zephyr/bluetooth/audio/audio.h` and the ``LC3`` infix have been removed.
  * The CAP initiator APIs have been streamlined and follow the same parameter pattern.
  * Added Kconfig options to make MCC functionality optional to reduce memory usage for simple
    clients.
  * Added CAP Commander change volume and change volume offset.
  * Added proper support for doing decoding in the application instead of in the controller by
    modifying how the ISO data path is configured.
  * Added :c:func:`bt_csip_set_member_unregister` to unregister a CSIS instance.
  * Added helper functions to get and set assigned number values in codec configuration and
    codec capabilities.
  * Added support for the new mono audio location.
  * Added ISO state callbacks for streams so the user knows the state of the CIS.
  * Added :c:func:`bt_pacs_set_available_contexts_for_conn` to set available context per connection.
  * Refactored the :c:struct:`bt_bap_base` to be an abstract struct with new helper functions,
    so that Zephyr supports all BASEs regardless of the size.

* Host

  * Added ``recycled()`` callback to :c:struct:`bt_conn_cb`, which notifies listeners when a
    connection object has been freed, so it can be utilized for different purposes. No guarantees
    are made to what listener will be granted the object, as only the first claim is served.
  * Modified :c:func:`bt_iso_chan_send` to no longer take a timestamp as parameter,
    and added :c:func:`bt_iso_chan_send_ts` that does.

* Mesh

  * Added the delayable messages functionality to apply random delays for
    the transmitted responses on the Access layer.
    The functionality is enabled by the :kconfig:option:`CONFIG_BT_MESH_ACCESS_DELAYABLE_MSG`
    Kconfig option.
  * The Bluetooth Mesh protocol 1.1 is now supported by default.

* Controller

  * Added deinit implementation for ESP32 controller.

* HCI Driver

  * Split ST HCI SPI Bluetooth driver from the Zephyr one to provide more features
    based on ST SPI protocols V1 and V2. As a result, :dtcompatible:`st,hci-spi-v1` and
    :dtcompatible:`st,hci-spi-v2` were introduced.

Boards & SoC Support
********************

* Added support for these SoC series:

  * Added support for Renesas R-Car Gen4 series.
  * Added support for STM32F303xB SoC variants.
  * Added support for STM32H7B0xx SoC variants.
  * Added support for STM32L010xx SoC variants.
  * Added support for STM32L081xx SoC variants.
  * Added support for STM32U5A9xx SoC variants.
  * Added support for NXP S32K1 devices.
  * Added support for NXP IMX8ULP SoC.
  * Added support for NXP MIMXRT595 DSP core.

* Made these changes in other SoC series:

  * Nordic SoCs now imply :kconfig:option:`CONFIG_XIP` instead of selecting it. This allows for
    creating RAM-based applications by disabling it.
  * BLE is now supported on STM32WBA series.
  * xtensa: imx8: Split the generic i.MX8 SoC into i.MX8QXP and i.MX8QM.
  * LPC55xxx: Fixed the system hardware clock cycle rate.

* Added support for these ARM boards:

  * Added support for Adafruit QTPy RP2040 board: ``adafruit_qt_py_rp2040``.
  * Added support for FANKE FK7B0M1-VBT6 board: ``fk7b0m1_vbt6``.
  * Added support for Renesas R-Car Spider board CR52: ``rcar_spider_cr52``.
  * Added support for ST Nucleo F722ZE board: ``nucleo_f722ze``.
  * Added support for ST STM32H750B Discovery Kit: ``stm32h750b_dk``.
  * Added support for ST STM32L4R9I Discovery board: ``stm32l4r9i_disco``.
  * Added support for ST STM32U5A9J-DK discovery kit: ``stm32u5a9j_dk``.
  * Added support for ST Nucleo WBA55CG board: ``nucleo_wba55cg``.
  * Added support for ST STM32WB5MM-DK Discovery board: ``stm32wb5mm_dk``.
  * Added support for Wiznet W5500 Evaluation Pico board: ``w5500_evb_pico``.
  * Added support for ADI boards: ``adi_sdp_k1``, ``adi_eval_adin1110ebz``,
    ``adi_eval_adin2111ebz``.
  * Added support for NXP UCANS32K1SIC board: ``ucans32k1sic``.

* Added support for these Xtensa boards:

  * Added support for NXP iMX8ULP board: ``nxp_adsp_imx8ulp``.
  * Added Heltec Wireless Stick Lite (V3) board: ``heltec_wireless_stick_lite_v3``.
  * Added KINCONY-KC868-A32 board: ``kincony_kc868_a32``.
  * Added Lolin ESP32-S2 Mini board: ``esp32s2_lolin_mini``.
  * Added M5Stack AtomS3 board: ``m5stack_atoms3``.
  * Added M5Stack AtomS3-Lite board: ``m5stack_atoms3_lite``.
  * Added M5Stack StampS3 board: ``m5stack_stamps3``.

* Made these changes for ARM boards:

  * Added support for low power on G1120B0MIPI using RT595.
  * Added support for lpspi, lpi2c on NXP board: ``mimx93_evk_a55``.
  * Fixed partition naming on ``lpcxpresso55s69`` to use the standard slot
    naming used by TFM-enabled Zephyr platforms.
  * Enabled support for linkserver debugger on ``frdm_kl25z``, ``mimxrt1015_evk``,
    ``mimxrt1020_evk``, ``mimxrt1050_evk``, ``mimxrt685_evk``, ``frdm_k64f``.
  * Switched MCUBoot FW Update mode on NXP boards from Swap & Scratch to Swap & Move.

* Made these changes for RISC-V boards:

  * Enabled ADC support on ``longan_nano``.

* Made these changes for native/POSIX boards:

  * The :ref:`simulated nrf5340 targets<nrf5340bsim>` now include the IPC and MUTEX peripherals,
    and support OpenAMP to communicate between the cores.
    It is now possible to run the BLE controller or 802.15.4 driver in the net core, and application
    and BT host in the app core.

  * The nrf*_bsim simulated targets now include models of the UART peripheral. It is now possible
    to connect a :ref:`nrf52_bsim<nrf52_bsim>` UART to another, or a UART in loopback, utilizing
    both the new and legacy nRFx UART drivers, in any mode.

  * For the native simulator based targets it is now possible to set via Kconfig command line
    options which will be handled by the executable as if they were provided from the invoking
    shell.

  * For all native boards, the native logger backend will now also be
    used even if the UART is enabled.

  * Several bugfixes and other minor additions to the nRF5x HW models.

  * Multiple documentation updates and fixes for all native boards.

* Added support for these following shields:

  * Added support for M5Stack-Core2 base: ``m5stack_core2_ext``.
  * Added support for MikroElektronika ACCEL 13 Click: ``mikroe_accel13_click``.
  * Added support for Waveshare Pico UPS-B: ``waveshare_pico_ups_b``.
  * Added support for X-NUCLEO-BNRG2A1: BLE expansion board: ``x_nucleo_bnrg2a1``.
  * Added support for X-NUCLEO-IKS4A1: MEMS Inertial and Environmental Multi
    sensor: ``x_nucleo_iks4a1``.

Build system and infrastructure
*******************************

* Added functionality for Link Time Optimization.
  This change includes interrupt script generator rebuilding and adds the
  following Kconfig options:

  - :kconfig:option:`CONFIG_ISR_TABLES_LOCAL_DECLARATION`:
    LTO compatible interrupt tables parser
  - :kconfig:option:`CONFIG_LTO`: Enable Link Time Optimization

  Currently the LTO compatible interrupt tables parser is only supported by ARM architectures and
  GCC compiler/linker.
  See pull request :github:`66392` for details.

* Dropped the ``COMPAT_INCLUDES`` option. It was unused since Zephyr v3.0.

* Fixed an issue whereby board revision ``0`` did not include overlay files for that revision.

* Added ``PRE_IMAGE_CMAKE`` and ``POST_IMAGE_CMAKE`` hooks to sysbuild modules, which allows for
  modules to run code after and before each image's cmake invocation.

* Added :kconfig:option:`CONFIG_ROM_END_OFFSET` option which allows reducing the size of an image.
  This is intended for use with firmware signing scripts which add additional data to the end of
  images outside of the build itself.

* Added MCUboot image size reduction to sysbuild images which include MCUboot. This prevents
  issues with building firmware images that are too large for MCUboot to swap.

* Deprecated :kconfig:option:`CONFIG_BOOTLOADER_SRAM_SIZE`. Users of this should transition to
  having RAM set up properly in their board devicetree files.

* Fixed an issue whereby shields were processed in order of the root they resided in rather than
  the order they were supplied to cmake in.

* Fixed an issue whereby using some shields with sysbuild would cause a cmake Kconfig error.

* Fixed an issue where the macros ``_POSIX_C_SOURCE`` and ``_XOPEN_SOURCE`` would be defined
  globally when building with Picolibc or for the native (``ARCH_POSIX``) targets.
  After this change users may need to define them for their own applications or libraries.

* Added support for sysbuild setting a signing script (``SIGNING_SCRIPT``). See
  :ref:`west-extending-signing` for details.

* Added support for ``FILE_SUFFIX`` in the build system which allows for adding suffixes to
  application Kconfig fragment file names and devicetree overlay file names. See
  :ref:`application-file-suffixes` and :ref:`sysbuild_file_suffixes` for details.

* Deprecated ``CONF_FILE`` ``prj_<build>.conf`` build type.

* Added `-Wdouble-promotion` as a default warning when compiling to warn developers with
  single-precision floats easily being promoted to double-precision.

Drivers and Sensors
*******************

* ADC

  * Power Management for ADC is now supported on STM32 devices.
  * STM32 ADC driver now supports mixing shared and separate IRQs (for instance on STM32G473
    which has 5 ADCs, ADC1 and ADC2 share one IRQ while ADC3, ADC4 and ADC5 each have unique IRQs).
    Enabling all instances in the same application is not possible on such devices as of now.

* Auxiliary Display

  * Added Sparkfun SerLCD driver.

* Audio

  * Added a driver :file:`drivers/audio/dmic_mcux.c` for NXP DMIC peripheral. This peripheral is
    present on the ``iMX RT5xx`` and ``iMX RT6xx`` parts, as well as some LPC SOCs.

* Battery backed up RAM

  * STM32WL devices now support BBRAM.

* CAN

  * Added system call :c:func:`can_get_mode()` for getting the current operation mode of a CAN
    controller.

  * Add system call :c:func:`can_get_transceiver()` for getting the CAN transceiver associated with
    a CAN controller.

  * Added accessor functions for the CAN statistics.

  * Added common bit error counter to the CAN statistics.

  * Added CAN statistics support to the following drivers:

    * :dtcompatible:`microchip,mcp2515`
    * :dtcompatible:`espressif,esp32-twai`
    * :dtcompatible:`kvaser,pcican`

  * Added CAN controller driver for the Nuvoton NuMaker series
    (:dtcompatible:`nuvoton,numaker-canfd`).

  * Added CAN controller driver for the Infineon XMC4xxx family
    (:dtcompatible:`infineon,xmc4xxx-can` and :dtcompatible:`infineon,xmc4xxx-can-node`).

  * Added support for the NXP S32K1xx family to the :dtcompatible:`nxp,flexcan` driver.

  * All Bosch M_CAN-based front-end drivers now use named IRQs, "int0" and "int1".

  * The :dtcompatible:`zephyr,native-linux-can` driver now supports being built with embedded C
    libraries.

  * Added support for setting "raw" timing values from the :ref:`CAN shell <can_shell>`.

* Clock control

  * Renesas R-Car clock control driver now supports Gen4 SoCs.
  * Renamed ``CONFIG_CLOCK_CONTROL_RA`` to :kconfig:option:`CONFIG_CLOCK_CONTROL_RENESAS_RA`.
  * On STM32 devices, :dtcompatible:`st,stm32-hse-clock` now allows setting a ``css-enabled``
    property which enables HSE clock security system (CSS).

* Counter

  * The nRFx counter driver now works with simulated nrf*_bsim targets.
  * Added support for top value configuration and fixed a bug in the native posix driver.
  * Added support for the MRT counter for NXP RT6xx, RT5xx and LPC55xxx.

* Crypto

  * STM32WB devices now support crypto API through AES block.

* Display

  * Introduced frame buffer config to STM32 LTDC driver.

* DMA

  * STM32WBA Devices now support GPDMA.
  * Introduced a new DMA driver :file:`drivers/dma/dma_nxp_edma.c` for NXP's eDMA IP.

* Entropy

  * The "native_posix" entropy driver now accepts a new command line option ``seed-random``.
    When used, the random generator will be seeded from ``/dev/urandom``
  * On STM32devices, RNG block is now suspended when pool is full to save power.

* Ethernet

  * The "native_posix" ethernet driver now supports being built with embedded C libraries.
  * Enabled HW checksum offloading for STM32H7.
  * Added implementation of Open Alliance's TC6 T1S driver.
  * Added xmc4xxx driver.
  * Added NXP enet driver with PTP support.
  * Added KSZ8081 PHY driver.
  * Added proper IPv4 multicast support to NXP mcux driver.
  * Added LAN8651 T1S support.
  * Added DSA support to STM32.
  * Added tja1103 PHY support.
  * Added Nuvoton numaker support.
  * Fixed lan865x driver. Transmission speed improvements, IRQ handling fixes.
  * Fixed s32_gmac driver. Link up/down handling fixes.
  * Fixed phy_mii driver. The invalid phy id was incorrectly checked.
  * Fixed sam_gmac driver. PTP clock adjustment was wrong for negative values.
  * Fixed adin2111 driver. Initialization was done incorrectly when working with adin2110.
  * Fixed ksz8081 driver. Logging changes, RMII clock fixes, GPIO pin fixes.
  * Added a driver :file:`drivers/ethernet/eth_nxp_enet.c` for NXP ENET which is a rework of
    the old driver :file:`drivers/ethernet/eth_mcux.c`. The old driver became
    unmaintainable due to fundamental problems with the lack of PHY abstraction. The new driver
    is still experimental and requires maturation. Eventually the old driver will be deprecated
    and this new driver will be supported instead.

* Flash

  * Redesigned the Atmel SAM controller to fully utilize flash page layout.
  * ``spi_nor`` driver now sleeps between polls in ``spi_nor_wait_until_ready``. If this is not
    desired (For example due to ROM constraints in a bootloader),
    :kconfig:option:`CONFIG_SPI_NOR_SLEEP_WHILE_WAITING_UNTIL_READY` can be disabled.
  * Flash readout protection configuration was added on STM32G4 and STM32L4 series.

  * ``nordic_qspi_nor`` driver now supports user-configurable QSPI timeout with
    :kconfig:option:`CONFIG_NORDIC_QSPI_NOR_TIMEOUT_MS`.

* GNSS

  * Added GNSS device driver API and subsystem for parsing and publishing location,
    datetime, and satellite information, enabled by
    :kconfig:option:`CONFIG_GNSS` and :kconfig:option:`CONFIG_GNSS_SATELLITES`.
    The GNSS subsystem and device drivers are based on the :ref:`modem` subsystem,
    using the ``modem_pipe`` module, modem backends, and ``modem_chat`` module to
    communicate with the modems. For systems which already contain a cellular modem,
    adding a GNSS modem is very efficient due to the reuse of subsystems.

  * Added GNSS-specific, safe, string-to-integer parsing utilities, enabled by
    :kconfig:option:`CONFIG_GNSS_PARSE`.

  * Added NMEA0183 parsing utilities, enabled by
    :kconfig:option:`CONFIG_GNSS_NMEA0183`.

  * Added extensive GNSS data logging, enabled by
    :kconfig:option:`CONFIG_GNSS_DUMP_TO_LOG`.

  * Added generic NMEA0183 over UART based modem device driver, matching the
    devicetree compatible :dtcompatible:`gnss-nmea-generic`.

  * Added fully featured device driver for the Quectel LCX6G series GNSS modems,
    matching the devicetree compatibles :dtcompatible:`quectel,lc26g`,
    :dtcompatible:`quectel,lc76g` and :dtcompatible:`quectel,lc86g`.

* GPIO

  * Renesas R-Car GPIO driver now supports Gen4 SoCs.
  * Renamed ``CONFIG_GPIO_RA`` to :kconfig:option:`CONFIG_GPIO_RENESAS_RA`.
  * Added a new GPIO driver (:file:`drivers/gpio/gpio_mcux_rgpio.c`). This
    driver is used for i.MX93 and i.MX8ULP.

* I2C

  * :c:func:`i2c_get_config` is now supported on the STM32 driver.

* I2S

  * STM32H7 devices now support I2S.

* I3C

  * The Legacy Virtual Register defines have been renamed from ``I3C_DCR_I2C_*``
    to ``I3C_LVR_I2C_*``.

  * Added the ability to specify a start address when searching for a free I3C
    address to be reserved. This requires a new function argument to
    :c:func:`i3c_addr_slots_next_free_find`.

  * Added a field named ``num_xfer`` in :c:struct:`i3c_msg` and
    :c:struct:`i3c_ccc_taget_payload` as an output to indicate the actual
    number of bytes transferred.

  * Cadence I3C driver (:file:`drivers/i3c/i3c_cdns.c`):

    * Added support to handle controller abort where the target does not emit
      end of data for register read but continues sending data.

    * Updated the timeout calculation to be coupled with CPU speed instead of
      a fixed number of retries.

  * NXP MCUX I3C driver (:file:`drivers/i3c/i3c_mcux.c`):

    * Fixed ``mcux_i3c_config_get()`` not returning the configuration to the caller.

    * Improved the FIFO read routine to support higher transfer rates.

    * Removed the infinite wait for MCTRLDONE in auto IBI.

    * Added ``disable-open-drain-high-pp`` property to
      :dtcompatible:`nxp,mcux-i3c`, which allows alternative high time for
      open-drain clock.

* IEEE 802.15.4

  * Removed :kconfig:option:`CONFIG_IEEE802154_SELECTIVE_TXPOWER` Kconfig option.

* Input

  * The ``short-codes`` property of :dtcompatible:`zephyr,input-longpress` is
    now optional. The node can be used by specifying only input and long codes.
  * Added support for keyboard matrix drivers, including a new
    :dtcompatible:`gpio-kbd-matrix` and :dtcompatible:`input-keymap` drivers.
    See :ref:`gpio-kbd` for more details.
  * Added a pair of input codes to HID codes translation functions. See
    :c:func:`input_to_hid_code` and :c:func:`input_to_hid_modifier`.
  * Added power management support to :dtcompatible:`gpio-keys`
    :dtcompatible:`focaltech,ft5336`.
  * Added a :dtcompatible:`zephyr,native-linux-evdev` device node for getting
    input events from a Linux evdev device node.
  * Added support for optical encoders and power management to :dtcompatible:`gpio-qdec`.
  * New driver :dtcompatible:`analog-axis`.
  * Added ESP32 touch sensor driver including a :dtcompatible:`espressif,esp32-touch`.

* MDIO

  * Fixed initialization priorities of NXP s32 NETC drivers.
  * Fixed SAM GMAC transfer timeout errors caused by MDIO clock not being initialized.
  * Fixed ESP32 MDIO driver being enabled when node was not status okay.
  * Added support for C22 and C45 APIs on S32 GMAC.
  * Added MDIO driver for NXP ENET peripheral.
  * Added xmc4xxx MDIO drivers.
  * Fixed build errors caused by mdio.h driver header not including errno.h

* MFD

  * Added support for :dtcompatible:`maxim,max20335`.
  * Added support for :dtcompatible:`adi,ad5592`.
  * Added separate initialization priorities for :dtcompatible:`nordic,npm1300` and
    :dtcompatible:`nordic,npm6001`.

* PCIE

  * Fixed MMIO size calculation by disabling IO/memory decoding beforehand.

  * Modified to use PNP ID for PRT retrieval.

* MEMC

  * Added a new driver for NXP FlexRAM.

* MIPI-DBI

  * Introduced a new :ref:`MIPI DBI driver class <mipi_dbi_api>`.

* Pin control

  * Renesas R-Car pinctrl driver now supports Gen4 SoCs.
  * Renamed ``CONFIG_PINCTRL_RA`` to :kconfig:option:`CONFIG_PINCTRL_RENESAS_RA`.
  * Renesas R-Car pinctrl driver now supports voltage control for R8A77951 and
    R8A77961 SoCs.
  * Added driver for ZynqMP / Mercury XU.
  * Added driver for i.MX8QM/QXP.
  * Added driver for Renesas RZ/T2M.
  * On STM32 devices, pins assigned to JTAG/SW port can now be put to analog state when
    :kconfig:option:`CONFIG_PM` enabled and :kconfig:option:`CONFIG_DEBUG` disabled.

* PWM

  * Fixed ESP32S3 low frequency PWM issue.

* Regulators

  * Added new API functions

    * :c:func:`regulator_set_active_discharge`
    * :c:func:`regulator_get_active_discharge`
    * :c:func:`regulator_list_current_limit`

  * ``startup-delay-us`` and ``off-on-delay-us`` are now supported for all regulators.
  * Added non-multithreading support.
  * Added support for :dtcompatible:`maxim,max20335-regulator`.
  * Added ASYS UVLO configuration for :dtcompatible:`nxp,pca9420`.
  * Added LDO/DCDC support for :dtcompatible:`renesas,smartbond-regulator`.
  * Added LDO soft start configuration for :dtcompatible:`nordic,npm1300-regulator`.
  * Fixed init priority for :dtcompatible:`x-powers,axp192-regulator`.
  * Fixed LDO GPIO control for :dtcompatible:`nordic,npm1300-regulator`.

* Retained memory

  * Retained memory driver backend for registers was added.

  * Retained memory API status was changed from experimental to unstable.

* RTC

  * Added Atmel SAM driver.

* SMBUS:

  * SMBUS is now supported on STM32 devices.

* SDHC

  * Added SDHC driver for Cadence SDHC IP.
  * Added SDHC driver for Infineon CAT1 IP.
  * Added support for SDIO commands to iMX USDHC SDHC driver.

* Sensor

  * Fixed arithmetic overflow in the LTRF216A driver.
  * Fixed negative temperature calculation in MAX31865 driver.
  * Added TI TMAG5273 3D Hall sensor driver.
  * Added Vishay VCNL36825T proximity sensor driver.
  * Added BMA4xx accelerometer sensor emulator.
  * Added white channel support to the VEML7700 ambient light sensor driver.
  * Added ST LIS2DE12 accelerometer sensor driver.
  * Added Bosch BMP581 pressure sensor driver.
  * Added support for triggering multiple sensor devices in the sensor shell.
  * Added Aosong AGS10 TVOC air quality gas sensor driver.
  * Extended MAX31865 temperature sensor driver to support changing three-wire
    mode at runtime.
  * Fixed Bosch BMI160 gyro range calculation and added support for getting
    attributes.
  * Optimized Bosch BMA4xx accelerometer sample calculation, improving
    accuracy.
  * Removed floating point arithmetic from the TI BQ274xx gauge driver.
  * Fixed ST drivers Kconfig dependency to the HAL_ST module.
  * Added Bosch BMA4xx accelerometer sensor driver.
  * Added ST LIS2DU12 accelerometer sensor driver.
  * Extended NTC thermistor driver to support TDK NTCG103JF103FT1.
  * Added NXP S32 quadrature decoder driver.
  * Fixed LSM6DSV16x gyro range table.
  * Fixed missing return value checks in ADLTC2990, TSL2540, MAX17055 drivers.
  * Added ST LPS28DFW pressure sensor driver.
  * Fixed interrupt in BMI323 driver.
  * Added devicetree properties macros to various ST sensor drivers.
  * Added Renesas HS300x temperature/humidity sensor driver.
  * Added Gas Sensing Solutions' ExplorIR-M CO2 sensor driver.
  * Fixed self test delay in ADXL367 accelerometer sensor driver.
  * Added ST LPS22DF pressure sensor driver.
  * Added new streaming APIs and implemented in the ICM42688 driver.
  * Added trigger support to the ADXL367 accelerometer sensor driver.
  * Added PM suspend and resume support to the LSM6DSL accelerometer sensor
    driver.
  * Added AMS TSL2561 light sensor driver.
  * Extended BQ274xx driver to support configuring and confirming the chemistry
    profile.
  * Extended LIS2DH and LSM6DSV16x drivers to support configuring INT1/INT2 in
    devicetree.
  * Added die temperature measurement support to NPM1300 charger driver.
  * Added ADLTC2990 sensor emulator.
  * Extended MPU6050 driver to support MPU6886 variant.
  * Added ADXL367 accelerometer sensor driver.
  * Added LiteOn LTR-F216A illuminance sensor driver.
  * Added Memsic MC3419 accelerometer sensor driver.
  * Added AMD SB temperature sensor driver.
  * Added ESP32S3 internal temperature sensor driver.
  * Added new self-documenting macros for setting ST sensor devicetree
    properties (e.g., LSM6DSV16X_DT_ODR_AT_60Hz).  (:github:`65410`)

* Serial

  * Added drivers to support UART on Renesas RA and RZ/T2M.
  * Added support for higher baud rate for ITE IT8xxx2.
  * Added driver to support Intel Lightweight UART.
  * Added UART asynchronous RX helper.
  * Added support for async API on NS16550 driver.
  * Updated ``uart_esp32`` to use serial port configuration from devicetree.
  * Added an adaptation API to provide interrupt driven API for drivers
    which have only implemented async API.

  * Emulated UART driver (:file:`drivers/serial/uart_emul.c`):

    * Added emulated interrupt based TX.
    * Added emulated error for testing.
    * Modified to use local work queue for data transfer.
    * Modified FIFO size and its handling to be more aligned with real hardware.

  * On STM32 devices, it is now possible to enable FIFO by setting a ``fifo-enable``
    property in targeted serial node, with the following benefits:
    In TX, FIFO allows to work in burst mode, easing scheduling of loaded applications.
    It also allows more reliable communication with UART devices sensitive to variation of inter-frames delays.
    In RX, FIFO reduces overrun occurrences.

* SPI

  * On STM32H7 devices, ``fifo-enable`` property allows using SPI block FIFO. This
    feature is still experimental and requires maturation.
  * On STM32 devices impacted by BSY bit erratum, a workaround was implemented.

* USB

  * On STM2G0 devices, property ``crs-usb-sof`` in ``clk_hsi48`` node enables support
    for Clock Recovery System, allowing a more stable HSI48 clock and hence resilient USB
    connection.
  * On compatible STM32 devices, isochronous endpoints are now functional thanks to the
    use of double buffering.
  * Added new UDC driver for DWC2 controller.
  * Added support for Nuvoton NuMaker series USBD controllers.

* W1

  * Added 1-Wire GPIO master driver. See the :dtcompatible:`zephyr,w1-gpio`
    devicetree binding for more information.

* Wi-Fi

  * Added Infineon airoc driver.
  * Fixed esp32 driver. Decreased minimum heap size, disabled automatic reconnection on leaving.
  * Fixed esp_at driver. Allow building without IPv4 support. Passive Receive mode fixes. Depend on UART runtime configuration.
  * Fixed winc1500 driver. Disconnect result event was not returned when disconnecting.

Networking
**********

* CoAP:

  * Added support for Echo and Request-Tag CoAP options (RFC 9175).
  * Changed :c:func:`coap_remove_observer` API function return type to bool.
  * Introduced CoAP service library, which simplifies implementation of CoAP
    server functionality.
  * Updated CoAP server example to use CoAP service library.
  * Added shell module for CoAP server.
  * Fixed NULL pointer dereference in :c:func:`coap_packet_remove_option`.
  * Added CoAP observer/service network events using the Network Event subsystem.
  * Changed :c:func:`coap_pending_init` API function to take
    :c:struct:`coap_transmission_parameters` instead of retry count.
  * Added new API functions:

    * :c:func:`coap_get_transmission_parameters`
    * :c:func:`coap_set_transmission_parameters`
    * :c:func:`coap_handle_request_len`
    * :c:func:`coap_well_known_core_get_len`
    * :c:func:`coap_uri_path_match`
    * :c:func:`coap_packet_is_request`
    * :c:func:`coap_find_observer`
    * :c:func:`coap_find_observer_by_token`
    * :c:func:`coap_pendings_count`
    * :c:func:`coap_header_set_code`

* Connection Manager:

  * Added a generic Wi-Fi connectivity backend.

* DHCP:

  * Added missing DHCPv6 state structure initialization when initializing
    network interface.
  * DHCP-assigned IPv4 address is now removed when interface goes down.
  * Added DHCPv4 server implementation.
  * Rearranged DHCPv4 file structure. All DHCPv4 related files are now grouped
    within ``subsys/net/lib/dhcpv4``.
  * Moved DHCPv6 files to ``subsys/net/lib/dhcpv6`` to align with DHCPv4.

* DNS:

  * Added support for enabling mDNS listener on all network interfaces.
  * Added VLAN support to the ``mdns_responder`` sample.
  * Fixed TTL/hop limit set on DNS packets.
  * Added :kconfig:option:`CONFIG_DNS_RESOLVER_AUTO_INIT` which allows to disable
    automatic initialization of the default DNS context on boot.

* Ethernet:

  * Manual registration of ARP entries is now supported.
  * Added PHY mode selection to device tree.
  * Added TX-Injection mode support.

* gPTP:

  * The local port identity is now used when forwarding sync messages.
  * Fixed double converted byte order of BMCA info.
  * GM PRIO root system id is now always used for announce messages.
  * Created gPTP handler thread stack size Kconfig option.
  * Inverted the priority of outgoing packets.

* ICMP:

  * Fixed an error being emitted when unhandled ICMP message was received.
  * Fixed a bug where ICMP Echo Reply could be sent without proper source IP
    address set.
  * Fixed a packet leak in ICMP Echo Request handlers in case priority check
    failed.
  * Improved thread safety of the module handling Neighbor Discovery.
  * Added support for IPv6 Neighbor reachability hints, allowing to reduce
    ICMPv6 traffic for active connections.

* IP:

  * Fixed L3/L4 checksum calculation/validation for IP-fragmented packets on
    interfaces that support checksum offload.
  * Fixed net_context not being set on IP fragmented packets, preventing send
    callback from being called.
  * It is now possible to have separate IPv4 TTL value and IPv6 hop limit value for
    unicast and multicast packets. This can be controlled in each socket via
    :c:func:`setsockopt` API.
  * Improved source IP address verification in the IP stack. Addresses received
    to/from loopback address on non-loopback interfaces are dropped.
  * Added new functions to verify if IPv6 address is site local or global.
  * Added support for setting peer IP address in :c:struct:`net_pkt` structure
    for offloaded interfaces. This allows for :c:func:`recvfrom` to return a
    valid address in offloaded case.

* LwM2M:

  * Added :kconfig:option:`CONFIG_LWM2M_UPDATE_PERIOD` which configures the LwM2M
    Update period regardless of the lifetime value.
  * Fixed composite read/write access rights check.
  * Added shell command to delete object and resource instances.
  * Fixed a bug in block-wise transfer where block-wise ACKs were sent with
    wrong response code.
  * Fixed object version reporting for LwM2M version 1.1.
  * Added support for DTLS Connection Identifier in the LwM2M engine.
  * Added support for LwM2M Server Disable executable resource.
  * Implemented fallback mechanism for LwM2M server selection during registration
    phase. The engine will now try to choose a different server if the current one
    becomes unavailable or disabled.
  * Added support for storing LwM2M error list in settings.
  * Fixed pmin observer attribute handling in tickless mode.
  * Added support for notifying the application about ongoing CoAP transmissions
    with ``set_socket_state()`` callback.
  * Deprecated unsigned 64-bit integer value type, as it's not represented in the spec.
    Use signed 64-bit integer instead.
  * Added a callback for LwM2M Gateway object, which allows to handle LwM2M messages
    with prefixed path.
  * Added LwM2M-specific macros for object initialization during boot.
  * Several other minor bugfixes ans improvements.

* Misc:

  * Added support for compile time network event handlers using the macro
    :c:macro:`NET_MGMT_REGISTER_EVENT_HANDLER`.
  * Added the :kconfig:option:`CONFIG_NET_MGMT_EVENT_WORKER` choice to
    allow emitting network events using the system work queue or synchronously.
  * Removed redundant Network Connectivity API documentation page.
  * Improved thread safety of the network connections subsystem.
  * Removed ``eth_native_posix`` sample.
  * Removed redundant ``arb`` and ``fv2015`` fields  from
    ``struct net_pkt_cb_ieee802154``.
  * Introduced a separate mutex for TX at the network interface level to prevent
    concurrent access on TX to drivers that are not re-entrant.
  * Fixed netmask not being registered for loopback address.
  * Added support for binding to a specific network interface at the net_context
    level.
  * Added IGMPv3 support.
  * Added a new network event, ``NET_EVENT_HOSTNAME_CHANGED``, triggered upon
    hostname change.
  * Refactored net_context option getters/setters to reduce code duplication.
  * Fixed a possible packet leak at the ARP level, in case of errors during ARP
    packet creation.
  * Added support for analyzing SNTP time uncertainty.
  * Fixed network interface being brought up even when underlying device is not
    ready.
  * Added start/stop functions for dummy interfaces.
  * Added a detailed :ref:`network configuration <network_configuration_guide>`
    guide to the documentation.
  * Added :kconfig:option:`CONFIG_NET_HOSTNAME_DYNAMIC` option, which allows to
    enable setting hostname at runtime.

* MQTT-SN:

  * Added :c:func:`mqtt_sn_get_topic_name` API function.
  * Fixed handling of incoming Register messages when wildcard subscription is used.

* OpenThread:

  * Implemented the following OpenThread platform APIs:

    * ``otPlatRadioSetRxOnWhenIdle()``
    * ``otPlatResetToBootloader()``
    * ``otPlatCryptoPbkdf2GenerateKey()``

  * Updated OpenThread platform UART driver so that it no longer waits for
    communication with a host to start during boot.
  * Added BLE TCAT implementation in OpenThread platform.
  * Updated Crypto PSA backend for OpenThread with additional algorithms.
  * Fixed ``otPlatAssertFail()`` so that it prints the location of the actual
    assert instead of the function itself.

* PPP:

  * Fixed PPP connection termination when interface goes down.

* Shell:

  * Refactored networking shell module so that instead of large single file, it
    is split into submodules, on a per command basis.
  * Fixed unexpected timeout message when executing loopback ping.
  * Added ``net sockets`` command to print information about open sockets and
    socket services.
  * Join IPv4/IPv6 multicast groups, if needed, when adding IPv4/IPv6 multicast
    addresses via shell.
  * Fixed ``tcp connect`` command operation (TCP context released prematurely).
  * Added support for Echo option in telnet shell backend.
  * Fixed unnecessary connection close in telnet shell backend in case of
    non-fatal EAGAIN or ENOBUFS errors.
  * Fixed double packet dereference in ping reply handler.
  * Fixed possible deadlock when executing ``net arp`` command.
  * Added more detailed Ethernet statistics printout for ``net stats`` command.
  * Added ``net dhcpv4 server`` commands for DHCPv4 server management.
  * Added shell module to manage TLS credentials.

* Sockets:

  * Added support for v4-mapping-to-v6, which allows IPv4 and IPv6 to share the
    same port space.
  * Added support for :c:macro:`IPV6_V6ONLY` socket option.
  * Added support for :c:macro:`SO_ERROR` socket option.
  * Fixed :c:func:`select` not setting ``writefds`` in case of errors.
  * Added support for object core, which allows to track networks sockets and
    their statistics.
  * Added support for :c:func:`recvmsg`.
  * Added support for :c:macro:`IP_PKTINFO` and :c:macro:`IPV6_RECVPKTINFO`
    socket options.
  * Added support for :c:macro:`IP_TTL` socket option.
  * Added support for IPv4 multicast :c:macro:`IP_ADD_MEMBERSHIP` and
    :c:macro:`IP_DROP_MEMBERSHIP` socket options.
  * Added support for IPv6 multicast :c:macro:`IPV6_ADD_MEMBERSHIP` and
    :c:macro:`IPV6_DROP_MEMBERSHIP` socket options.
  * Improved doxygen documentation of BSD socket API.
  * Fixed POLLERR error reporting in TLS sockets.
  * Fixed DTLS handshake processing during :c:func:`poll`.
  * Aligned DTLS socket :c:func:`connect` behavior with regular TLS (handshake
    during connect call).
  * Added Socket Service library, which allows registering multiple socket-based
    network services and processing them within a single thread.
  * Added a new ``echo_service`` sample for Socket Service.
  * Added support for :c:macro:`SO_DOMAIN` socket option.
  * Fixed DTLS connection timeout when monitoring socket with :c:func:`poll`.
  * Fixed NULL link layer address pointer dereference on packet socket, in case
    of packet loopback.
  * Several other minor bugfixes and improvements.

* TCP:

  * TCP stack now replies with RST packet in response to connection attempt on
    a closed port.
  * Fixed remote address passed in :c:func:`accept` call.
  * Fixed reference counting during active handshake to prevent TCP context
    being released prematurely.
  * Fixed compilation with :kconfig:option:`CONFIG_NET_TCP_CONGESTION_AVOIDANCE`
    disabled.
  * Reworked TCP data queueing API to prevent TCP stack from overflowing TX window.
  * Fixed possible race condition between TCP workqueue and other threads when
    releasing TCP context.
  * Fixed possible race condition between input thread and TCP workqueue.
  * Added support for TCP Keep-Alive feature.
  * Fixed a bug where TCP state machine could get stuck in LAST_ACK state
    during passive connection close.
  * Fixed a bug where TCP state machine could get stuck in FIN_WAIT_1 state
    in case peer did not respond.
  * Several other minor bugfixes ans improvements.

* TFTP:

  * Fixed potential buffer overflow when copying TFTP error message.
  * Improved logging in case of errors.

* Wi-Fi:

  * Added Wi-Fi driver version information to Wi-Fi shell.
  * Added AP (Access Point) mode support to Wi-Fi shell.
  * Added Regulatory channel information.
  * Added Wi-Fi bindings to connection manager.
  * Fixed Wi-Fi shell. SSID print fixes. Help text fixes. Channel validation fixes.
  * Fixed TWT functionality. Teardown status was not updated. Powersave fixes.

* zperf:

  * Improved IP address binding. Zperf will now bind to any address by default and
    allow to override this with Kconfig/API provided address.
  * Fixed TCP packet counting when transmitting.
  * Refactored UDP/TCP received to use Socket Service to save memory.
  * Fixed zperf session leak on interrupted downloads.
  * Fixed the calculation ratio between Mbps, Kbps and bps.
  * The zperf sample now supports relocating network code to RAM.

USB
***

* Device support:

  * Introduced new USB Audio 2 implementation that uses devicetree for
    instantiation, hiding descriptor complexity from the application. The initial
    implementation is limited to full speed only and provides the absolute
    minimum set of features required for basic implicit and explicit feedback.
    Interrupt notification is not supported.
  * Added support for SetFeature(TEST_MODE).

Devicetree
**********

Bindings
========

  * Introduced new SPI properties ``spi-cpol``, ``spi-cpha``, and ``spi-hold-cs`` to be used by
    the macro :c:macro:`SPI_CONFIG_DT` in order to set SPI mode in a Devicetree file.

Libraries / Subsystems
**********************

* Management

  * Fixed an issue in MCUmgr image management whereby erasing an already erased slot would return
    an unknown error. It now returns success.

  * Fixed MCUmgr UDP transport structs being statically initialised. This results in about a
    ~5KiB flash saving.

  * Fixed an issue in MCUmgr which would cause a user data buffer overflow if the UDP transport was
    enabled on IPv4 only but IPv6 support was enabled in the kernel.

  * Implemented datetime functionality in MCUmgr OS management group. This makes use of the RTC
    driver API.

  * Fixed an issue in MCUmgr console UART input whereby the FIFO would be read outside of an ISR,
    which is not supported in the next USB stack.

  * Fixed an issue whereby the ``mcuboot erase`` DFU shell command could be used to erase the
    MCUboot or currently running application slot.

  * Fixed an issue whereby messages that were too large to be sent over the UDP transport would
    wrongly return :c:enum:`MGMT_ERR_EINVAL` instead of :c:enum:`MGMT_ERR_EMSGSIZE`.

  * Fixed an issue where confirming an image in Direct XIP mode would always confirm the image in
    the primary slot even when executing from the secondary slot. Now the currently active image is
    always confirmed.

  * Added support for retrieving registered command groups, to support registering and deregistering
    default command groups at runtime, allowing an application to support multiple implementations
    for the same command group.

  * Fixed an issue in MCUmgr FS management whereby the semaphore lock would not be given if an
    error was returned, leading to a possible deadlock.

  * Added support for custom payload MCUmgr handlers. This can be enabled with
    :kconfig:option:`CONFIG_MCUMGR_MGMT_CUSTOM_PAYLOAD`.

  * Fixed an issue in MCUmgr image management whereby an error would be returned if a command was
    sent to erase the slot which was already erased.

  * Added support for image slot size checking to ensure an update can be utilised by MCUboot.
    This can be performed by using sysbuild when building both application and MCUboot by enabling
    :kconfig:option:`CONFIG_MCUMGR_GRP_IMG_TOO_LARGE_SYSBUILD` or by use of bootloader information
    sharing from MCUboot by enabling
    :kconfig:option:`CONFIG_MCUMGR_GRP_IMG_TOO_LARGE_BOOTLOADER_INFO`.

* Logging

  * Added an option to remove string literals from the binary when dictionary-based logging is used.

  * Optimized the most common logging messages (strings with up to 2 numeric arguments). Optimization
    is done for code size (significant gain seen on riscv32) and performance.

  * Extended logging frontend API to optionally implement dedicated functions for optimized messages.
    Optional API is enabled by :kconfig:option:`CONFIG_LOG_FRONTEND_OPT_API`.

  * Added support for runtime message filtering for the logging frontend.

  * Added option to support multiple instances of the UART logging backend.

  * Fixed userspace issue for :c:func:`printk` when :kconfig:option:`CONFIG_LOG_PRINTK` is enabled.

  * Added compile time detection of logging messages that use character pointers for ``%p``.
    It must be avoided when dictionary-based logging is used and strings are stripped from the
    binary. When an erroneous case is detected, the user message is replaced with an error message
    that suggests pointer casting must be added.

  * Removed remaining references to v2 logging. Renamed :c:func:`log2_generic` to :c:func:`log_generic`.

* Modem modules

  * Added ``TRANSMIT_IDLE`` event to the ``modem_pipe`` module which notifies the user of the pipe
    that the backend has transmitted all bytes placed in its buffer using
    :c:func:`modem_pipe_transmit()`.
    The event greatly increases the efficiency of transmitting large quantities of data if used to
    dynamically manage the delay between calls to :c:func:`modem_pipe_transmit()`.

  * Implemented ``TRANSMIT_IDLE`` event in all modem backends.

  * Extended all modem modules to utilize the ``TRANSMIT_IDLE`` event to dynamically manage the delay
    between calls to :c:func:`modem_pipe_transmit()`. This addition reduced the utilization of the
    system workqueue while transmitting large, continuous quantities of data, by 86%, while only
    reducing the throughput by 12%. This optimization additionally allows lower priority threads,
    like the deferred logging thread, to run during the transmission (it was blocked by the
    relentless, continuous calls to :c:func:`modem_pipe_transmit()`).

  * Improved ``modem_pipe`` event dispatching. The ``modem_pipe`` module now invokes the
    ``RECEIVE_READY`` event every time the pipe is attached using :c:func:`modem_pipe_attach()`
    if it has data ready to be read, and always invokes ``TRANSMIT_IDLE`` when the pipe is
    either opened or attached. This ensures event driven users of the modem pipe module can
    rely solely on the events to start read/transmit work. A test suite has been added to
    complement the improvements.

  * Extended ``modem_cmux`` module to support acting both as DTE (user application) and DCE (modem).
    With this addition, two Zephyr applications can communicate with each other through their
    respective ``modem_cmux`` instances.

* Picolibc

  * Updated to version 1.8.6. This removes the :c:macro:`_POSIX_C_SOURCE` definition from the build
    system, so applications will need to add this if they use APIs outside of the Zephyr
    requirements.

  * Added new :c:func:`printf` modes, :kconfig:option:`CONFIG_PICOLIBC_IO_LONG_LONG` and
    :kconfig:option:`CONFIG_PICOLIBC_IO_MINIMAL`. These provide applications with finer grained
    control over the level of support provided by the library to control text space usage. By
    default, the correct level of support is selected based upon other configuration parameters.

  * Added :kconfig:option:`CONFIG_PICOLIBC_ASSERT_VERBOSE`. This option, which is false by default,
    controls whether the :c:func:`assert` function displays verbose information, including the file
    name, line number, function name and failing expression text, when the assertion fails. Leaving
    this disabled saves text space.

  * :kconfig:option:`CONFIG_THREAD_LOCAL_STORAGE` can now be disabled while using Picolibc. This is
    very helpful in diagnosing issues when using Picolibc as those are often caused by enabling TLS
    and not caused by using the library itself.

  * Numerous improvements in the library including code-size reductions in areas like printf and
    ctype and various fixes in the math library.

* Power management

  * Introduced Atmel SAM SUPC functions to allow wakeup sources and poweroff.
  * STM32F4 devices now support stop mode thanks to the use of a RTC based idle timer which
    keeps track of tick evolution while cortex systick is off.

  * :c:func:`pm_device_runtime_put_async()` got a parameter to specify a minimum delay to
    the operation. This is useful to avoid multiple states transitions when a device is used.

  * Devices that don't need to block when suspending or resuming can now be defined as ISR
    safe (``PM_DEVICE_ISR_SAFE``). For those devices, Zephyr is able to reduce RAM consumption
    and runtime device power management can be safely used from interrupts.

  * Optimizations in device runtime power management. :c:func:`pm_device_runtime_get` and
    :c:func:`pm_device_runtime_put` no longer wait for a pending operation to be concluded if it is still
    in the work queue. In this case, the pending work is just canceled and the device state updated.

  * The Kconfig options below were added to customize the initialization priority of different
    power domains.

    * :kconfig:option:`CONFIG_POWER_DOMAIN_GPIO_INIT_PRIORITY`
    * :kconfig:option:`CONFIG_POWER_DOMAIN_GPIO_MONITOR_INIT_PRIORITY`
    * :kconfig:option:`CONFIG_POWER_DOMAIN_INTEL_ADSP_INIT_PRIORITY`

* Crypto

  * Mbed TLS updated to 3.5.2. Full release notes can be found in:
    https://github.com/Mbed-TLS/mbedtls/releases/tag/v3.5.2

* Retention

  * Fixed issue whereby :kconfig:option:`CONFIG_RETENTION_BUFFER_SIZE` values over 256 would cause
    an infinite loop due to use of 8-bit variables.

* SD

  * Added support for SDIO devices.

* Storage

  * File systems: LittleFS module has been updated to version 2.8.1.

  * Following Flash Map API macros, marked in 3.2 as deprecated, have been removed:
    ``FLASH_AREA_ID``, ``FLASH_AREA_OFFSET``, ``FLASH_AREA_SIZE``,
    ``FLASH_AREA_LABEL_EXISTS`` and ``FLASH_AREA_DEVICE``.

* POSIX API

  * Completed support for ``POSIX_THREADS_EXT``, ``XSI_THREADS_EXT``,
    ``POSIX_CLOCK_SELECTION``, and ``POSIX_SEMAPHORES`` Option Groups.

  * Completed support for ``_POSIX_MESSAGE_PASSING`` and
    ``_POSIX_PRIORITY_SCHEDULING`` Options.

  * Fixed Coverity-CID 211585, 334906, 334909, and 340851.

  * Improved structure and accuracy of POSIX documentation.

  * Improved navigation and organization of POSIX Kconfig options.

  * Added support to allocate and free stacks up to 8 MB with pthread_attr_t.

  * Added support for deferred and asynchronous thread cancellation.

  * Added dining philosophers sample application.

  * Added support for named semaphores.

  * Added a top-level ``posix`` command in the Zephyr shell. Zephyr shell utilities for
    the POSIX API can be added as subcommands (e.g. ``posix uname -a``)

  * Added support for async thread cancellation and ``SIGEV_THREAD``, ``CLOCK_REALTIME``.

  * Added compile-time-constant sysconf() implementation.

* LoRa/LoRaWAN

 * Added LoRaWAN remote multicast support with :kconfig:option:`CONFIG_LORAWAN_REMOTE_MULTICAST`
   in preparation for OTA firmware upgrade support.

* ZBus

  * Replaced mutexes with semaphores to lock channels and implement the Highest Locker Protocol (HLP)
    priority boost for the zbus operations. This feature avoids priority inversions and preemptions,
    making the VDED delivery process faster and more consistent. (:github:`63183`)

  * Fixed documentation for :c:func:`zbus_chan_add` and :c:func:`zbus_chan_rm` adding the timeout
    argument. (:github:`65544`)

  * Fixed warning when mixing C and C++ files using zbus. (:github:`65222`)

  * :c:macro:`ZBUS_CHANNEL_DEFINE` macro is now compatible with C++. (:github:`65196`)

  * Fixed parameter order of net buf pool fixed definition. (:github:`65039`)

  * Refactored the benchmark sample, adding message subscribers. (:github:`64524`)

  * Renamed ``CONFIG_ZBUS_MSG_SUBSCRIBER_NET_BUF_DYNAMIC`` and
    ``CONFIG_ZBUS_MSG_SUBSCRIBER_NET_BUF_STATIC`` to
    :kconfig:option:`CONFIG_ZBUS_MSG_SUBSCRIBER_BUF_ALLOC_DYNAMIC` and
    :kconfig:option:`CONFIG_ZBUS_MSG_SUBSCRIBER_BUF_ALLOC_STATIC`. (:github:`65632`)

HALs
****

* STM32

  * Updated STM32F1 to cube version V1.8.5.
  * Updated STM32F7 to cube version V1.17.1.
  * Updated STM32H7 to cube version V1.11.1.
  * Updated STM32L4 to cube version V1.18.0.
  * Updated STM32U5 to cube version V1.4.0.
  * Updated STM32WBA to cube version V1.2.0.
  * Updated STM32WB to cube version V1.18.0.

MCUboot
*******

  * Fixed compatible sector checking in bootutil.

  * Fixed Kconfig issue with saving encrypted TLVs not depending on encryption being enabled.

  * Fixed issue with missing condition check for applications in sysflash include file.

  * Fixed issue with single slot encrypted image listing support in boot_serial.

  * Fixed issue with allowing MBEDTLS Kconfig selection when tinycrypt is used.

  * Fixed missing response if echo command was disabled in boot_serial.

  * Fixed issue with USB configurations not generating usable images.

  * Added debug logging for boot status write in bootutil.

  * Added estimated image overhead size to cache in sysbuild.

  * Added firmware loader operating mode which allows for a dedicated secondary slot image that
    is used to update the primary image.

  * Added error if main thread is not pre-emptible when USB CDC serial recovery is enabled.

  * Added error if USB CDC and console are both enabled and set to the same device.

  * Removed the deprecated ``CONFIG_ZEPHYR_TRY_MASS_ERASE`` Kconfig option.

  * Updated zcbor to version 0.8.1 and re-generated boot_serial files.

  * Moved IO functions out of main to separate file.

  * Made ``align`` parameter of imgtool optional.

  * Added MCUBoot support for ``mimxrt1010_evk``, ``mimxrt1015_evk``,
    ``mimxrt1040_evk``, ``lpcxpresso55s06``, ``lpcxpresso55s16``,
    ``lpcxpresso55s28``, ``lpcxpresso55s36``, ``lpcxpresso55s69_cpu0``.

  * Added :kconfig:option:`CONFIG_MCUBOOT_IMGTOOL_OVERWRITE_ONLY` which passes the --overwrite-only option
    to imgtool to avoid adding the swap status area size when calculating overflow.
    It is used by non-swap update modes.

  * The MCUboot version in this release is version ``2.1.0+0-dev``.

zcbor
*****

zcbor has been updated from 0.7.0 to 0.8.1.
Full release notes can be found at:
https://github.com/zephyrproject-rtos/zcbor/blob/0.8.0/RELEASE_NOTES.md and
https://github.com/zephyrproject-rtos/zcbor/blob/0.8.1/RELEASE_NOTES.md

Highlights:

* Addded support for unordered maps.
* Performance improvements.
* Naming improvements for generated code.
* Bugfixes.

LVGL
****

LVGL has been updated from 8.3.7 to 8.3.11.
Detailed release notes can be found at:
https://github.com/zephyrproject-rtos/lvgl/blob/zephyr/docs/CHANGELOG.md

Additionally, the following changes in Zephyr were done:

  * Added the :dtcompatible:`zephyr,lvgl-keypad-input` compatible for keypad input.

  * Fixed issue with the Zephyr log levels not mapping properly to LVGL log levels.

  * Fixed issue where setting :kconfig:option:`CONFIG_LV_Z_FULL_REFRESH` did not
    set :kconfig:option:`CONFIG_LV_Z_VDB_SIZE` to 100 percent.

Tests and Samples
*****************

* :ref:`native_sim<native_sim>` has replaced :ref:`native_posix<native_posix>` as the default
  test platform.
  :ref:`native_posix<native_posix>` remains supported and used in testing but will be deprecated
  in a future release.

* Bluetooth split stacks tests, where the BT host and controller are run in separate MCUs, are
  now run in CI based on the :ref:`nrf5340_bsim<nrf5340bsim>` targets.
  Several other runtime AMP tests based on these targets have been added to CI, including tests
  of OpenAMP, the mbox and IPC drivers/subsystem, and the logger multidomain functionality.

* Runtime UART tests have been added to CI based on the :ref:`nrf52_bsim<nrf52_bsim>` target.
  These include tests of the nRFx UART driver and networked BT stack tests with the host and
  controller in separate devices communicating over the HCI UART driver.

* Fixed an issue in :zephyr:code-sample:`smp-svr` sample whereby if USB was already initialised,
  application would fail to boot properly.

* Added an LVGL sample :zephyr:code-sample:`lvgl-accelerometer-chart` showcasing displaying of live
  sensor data in a chart widget.

* Added ESP32-S3 IPM support in :zephyr:code-sample:`ipm-esp32`.

* Added ESP32 memory-mapped flash access sample in :zephyr:code-sample:`esp32-flash-memory-mapped`.

* Added ESP32 PWM loopback test case.

* Added support in the mbox sample for NXP boards ``MIMXRT1160-EVK``, ``MIMXRT1170-EVK``,
  ``MIMXRT1170-EVKB``, ``LPCXpresso55S69``.

* Added a sample ``flexram-magic-addr`` for ``mimxrt11xx_cm7`` to show how to use flexram magic
  address functionality when using memc flexram driver.
