:orphan:

.. _migration_3.7:

Migration guide to Zephyr v3.7.0
################################

This document describes the changes required when migrating your application from Zephyr v3.6.0 to
Zephyr v3.7.0.

Any other changes (not directly related to migrating applications) can be found in
the :ref:`release notes<zephyr_3.7>`.

.. contents::
    :local:
    :depth: 2

Build System
************

* Completely overhauled the way SoCs and boards are defined. This requires all
  out-of-tree SoCs and boards to be ported to the new model. See the
  :ref:`hw_model_v2` for more detailed information. (:github:`69607`)

* The following build-time generated headers:

  .. list-table::
     :header-rows: 1

     * - Affected header files
     * - ``app_version.h``
     * - ``autoconf.h``
     * - ``cmake_intdef.h``
     * - ``core-isa-dM.h``
     * - ``devicetree_generated.h``
     * - ``driver-validation.h``
     * - ``kobj-types-enum.h``
     * - ``linker-kobject-prebuilt-data.h``
     * - ``linker-kobject-prebuilt-priv-stacks.h``
     * - ``linker-kobject-prebuilt-rodata.h``
     * - ``mcuboot_version.h``
     * - ``offsets.h``
     * - ``otype-to-size.h``
     * - ``otype-to-str.h``
     * - ``strerror_table.h``
     * - ``strsignal_table.h``
     * - ``syscall_list.h``
     * - ``version.h``
     * - ``zsr.h``

  as well as syscall headers & sources are now namespaced into the ``zephyr/`` folder. The change is largely
  automated, and the script can be found in :github:`63973`.
  For the time being, the compatibility Kconfig (:kconfig:option:`CONFIG_LEGACY_GENERATED_INCLUDE_PATH`)
  is enabled by default so that downstream applications will continue to compile, a warning message
  will be generated during CMake configuration time.
  This Kconfig will be deprecated and eventually removed in the future, developers are advised to
  update the include paths of these affected headers as soon as possible.

Kernel
******

* All architectures are now required to define the new ``struct arch_esf``, which describes the members
  of a stack frame. This new struct replaces the named struct ``z_arch_esf_t``. (:github:`73593`)

* The named struct ``z_arch_esf_t`` is now deprecated. Use ``struct arch_esf`` instead. (:github:`73593`)

* The header file :zephyr_file:`include/zephyr/arch/arch_interface.h` has been moved from
  ``include/zephyr/sys/`` into ``include/zephyr/arch/``. Out-of-tree source files will need to
  update the include path. (:github:`64987`)

Boards
******

* Reordered D1 and D0 in the ``pro_micro`` connector gpio-map for SparkFun Pro Micro RP2040 to match
  original Pro Micro definition. Out-of-tree shields must be updated to reflect this change. (:github:`69994`)
* ITE: Rename all SoC variant Kconfig options, e.g., ``CONFIG_SOC_IT82202_AX`` is renamed to
  :kconfig:option:`CONFIG_SOC_IT82202AX`.
  All symbols are renamed as follows: ``SOC_IT81202BX``, ``SOC_IT81202CX``, ``SOC_IT81302BX``,
  ``SOC_IT81302CX``, ``SOC_IT82002AW``, ``SOC_IT82202AX``, ``SOC_IT82302AX``.
  And, rename the ``SOC_SERIES_ITE_IT8XXX2`` to ``SOC_SERIES_IT8XXX2``. (:github:`71680`)
* For native_sim/posix: :kconfig:option:`CONFIG_EMUL` is no longer enabled by default when
  :kconfig:option:`CONFIG_I2C` is set. Users who need this setting enabled should set it in
  their project config file. (:github:`73067`)

* LiteX: Renamed the ``compatible`` of the LiteX VexRiscV interrupt controller node from
  ``vexriscv-intc0`` to :dtcompatible:`litex,vexriscv-intc0`. (:github:`73211`)

* ``lairdconnect`` boards are now ``ezurio`` boards. Laird Connectivity has rebranded to `Ezurio <https://www.ezurio.com/laird-connectivity>`_.

Modules
*******

Mbed TLS
========

* TLS 1.2, RSA, AES, DES, and all the hash algorithms except SHA-256
  (SHA-224, SHA-384, SHA-512, MD5 and SHA-1) are not enabled by default anymore.
  Their respective Kconfig options now need to be explicitly enabled to be able to use them.
  (:github:`72078`)
* The Kconfig options previously named ``CONFIG_MBEDTLS_MAC_*_ENABLED`` have been renamed.
  The ``_MAC`` and ``_ENABLED`` parts have been removed from their names. (:github:`73267`)
* The :kconfig:option:`CONFIG_MBEDTLS_HASH_ALL_ENABLED` Kconfig option has been fixed to actually
  enable all the available hash algorithms. Previously, it used to only enable the SHA-2 ones.
  (:github:`73267`)
* The ``CONFIG_MBEDTLS_HASH_SHA*_ENABLED`` Kconfig options have been removed. They were duplicates
  of other Kconfig options which are now named ``CONFIG_MBEDTLS_SHA*``. (:github:`73267`)
* The ``CONFIG_MBEDTLS_MAC_ALL_ENABLED`` Kconfig option has been removed. Its equivalent is the
  combination of :kconfig:option:`CONFIG_MBEDTLS_HASH_ALL_ENABLED` and :kconfig:option:`CONFIG_MBEDTLS_CMAC`.
  (:github:`73267`)
* The Kconfig options ``CONFIG_MBEDTLS_MAC_MD4_ENABLED``, ``CONFIG_MBEDTLS_CIPHER_ARC4_ENABLED``
  and ``CONFIG_MBEDTLS_CIPHER_BLOWFISH_ENABLED`` were removed because they are no more supported
  in Mbed TLS. (:github:`73222`)
* When there is any PSA crypto provider available in the system
  (i.e. :kconfig:option:`CONFIG_MBEDTLS_PSA_CRYPTO_CLIENT` is set), desired PSA crypto
  features must be explicitly enabled using proper ``CONFIG_PSA_WANT_*``. (:github:`72243`)
* TLS/X509/PK/MD modules will use PSA crypto APIs instead of legacy ones as soon
  as there is any PSA crypto provider available in the system
  (i.e. :kconfig:option:`CONFIG_MBEDTLS_PSA_CRYPTO_CLIENT` is set). (:github:`72243`)

Trusted Firmware-M
==================

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

LVGL
====

* :kconfig:option:`CONFIG_LV_Z_POINTER_KSCAN` was removed, you need to convert your kscan based
  driver to the input subsystem and use a :dtcompatible:`zephyr,lvgl-pointer-input` in your
  devicetree instead. (:github:`73800`)


Device Drivers and Devicetree
*****************************

* The :dtcompatible:`nxp,kinetis-pit` pit driver has changed its compatible
  to :dtcompatible:`nxp,pit` and has been updated to support multiple channels.
  To configure the individual channels, you must add a child node with the
  compatible :dtcompatible:`nxp,pit-channel` and configure as below.
  The :kconfig:option:`CONFIG_COUNTER_MCUX_PIT` has also been renamed to
  :kconfig:option:`CONFIG_COUNTER_NXP_PIT` with regards to the renaming
  of the binding for the pit. (:github:`66336`)
  example:

  .. code-block:: devicetree

    / {
        pit0: pit@40037000 {
            /* Other Pit DT Attributes */
            compatible = "nxp,pit";
            status = "disabled";
            num-channels = <1>;
            #address-cells = <1>;
            #size-cells = <0>;

            pit0_channel0: pit0_channel@0 {
                compatible = "nxp,pit-channel";
                reg = <0>;
                status = "disabled";
            };
    };

* The :dtcompatible:`nxp,kinetis-ethernet` has been deprecated in favor of
  :dtcompatible:`nxp,enet`. All in tree SOCs were converted to use this new schema.
  Thus, all boards using NXP's ENET peripheral will need to align to this binding
  in DT, which also comes with a different version driver. Alternatively,
  the Ethernet node can be deleted and redefined as the old binding to use
  the deprecated legacy driver. The primary advantage of the new binding
  is to be able to abstract an arbitrary phy through the mdio API. (:github:`70400`)
  Example of a basic board level ENET DT definition:

  .. code-block:: devicetree

    &enet_mac {
        status = "okay";
        pinctrl-0 = <&pinmux_enet>;
        pinctrl-names = "default";
        phy-handle = <&phy>;
        zephyr,random-mac-address;
        phy-connection-type = "rmii";
    };

    &enet_mdio {
        status = "okay";
        pinctrl-0 = <&pinmux_enet_mdio>;
        pinctrl-names = "default";
        phy: phy@3 {
            compatible = "ethernet-phy";
            reg = <3>;
            status = "okay";
        };
    };

* The :dtcompatible:`nxp,kinetis-lptmr` compatible string has been changed to
  :dtcompatible:`nxp,lptmr`. The old string will be usable for a short time, but
  should be replaced for it will be removed in the future.

* Some of the driver API structs have been rename to have the required ``_driver_api`` suffix. (:github:`72182`)
  The following types have been renamed:

  * ``emul_sensor_backend_api`` to :c:struct:`emul_sensor_driver_api`
  * ``emul_bbram_backend_api`` to :c:struct:`emul_bbram_driver_api`
  * ``usbc_ppc_drv`` to :c:struct:`usbc_ppc_driver_api`

* The driver for :dtcompatible:`maxim,max31790` got split up into a MFD and an
  actual PWM driver. (:github:`68433`)
  Previously, an instance of this device could have been defined like this:

  .. code-block:: devicetree

    max31790_max31790: max31790@20 {
        compatible = "maxim,max31790";
        status = "okay";
        reg = <0x20>;
        pwm-controller;
        #pwm-cells = <2>;
    };

  This can be converted to:

  .. code-block:: devicetree

    max31790_max31790: max31790@20 {
        compatible = "maxim,max31790";
        status = "okay";
        reg = <0x20>;

        max31790_max31790_pwm: max31790_max31790_pwm {
            compatible = "maxim,max31790-pwm";
            status = "okay";
            pwm-controller;
            #pwm-cells = <2>;
        };
    };

* The driver for :dtcompatible:`invensense,icm42688` now correctly supports device
  tree configuration(:github:`74267`). Prior devicetrees may have tried to use
  the bindings to set sample rate and scale for the accel/gyro without any
  effect. The devicetree usage should now use the provided defines and include
  file along with new bindings which take these values.

  For example:

  .. code-block:: devicetree

    #include <zephyr/dt-bindings/sensor/icm42688.h>

    icm42688: icm42688@0 {
        accel-pwr-mode = <ICM42688_ACCEL_LN>;
        accel-fs = <ICM42688_ACCEL_FS_16G>;
        accel-odr = <ICM42688_ACCEL_ODR_2000>;
        gyro-pwr-mode= <ICM42688_GYRO_LN>;
        gyro-fs = <ICM42688_GYRO_FS_2000>;
        gyro-odr = <ICM42688_GYRO_ODR_2000>;
    };

* :dtcompatible:`st,lis2mdl` property ``spi-full-duplex`` changed to ``duplex =
  SPI_FULL_DUPLEX``. Full duplex is now the default.

* The DT property ``nxp,reference-supply`` of :dtcompatible:`nxp,lpc-lpadc` driver has
  been removed, users should remove this property from their devicetree if it is present.
  Added new phandle-array type DT property ``nxp,references``, the user can use this
  property to specify the reference voltage and reference voltage value to be used by
  the lpadc. (:github:`75005`)

 * The DT properties ``mc,interface-type``, ``mc,reset-gpio``, and ``mc,interrupt-gpio`` of
   the :dtcompatible:`microchip,ksz8081` phy binding have changed to
   ``microchip,interface-type``, ``reset-gpios``, and ``int-gpios``, respectively (:github:`73725`)

Charger
=======

* Dropped ``constant-charge-current-max-microamp`` property in ``charger_max20335`` driver because
  it did not reflect real chip functionality. (:github:`69910`)

* Added enum key to ``constant-charge-voltage-max-microvolt`` property in ``maxim,max20335-charger``
  binding to indicate invalid devicetree values at build time. (:github:`69910`)

Controller Area Network (CAN)
=============================

* Removed the following deprecated CAN controller devicetree properties. Out-of-tree boards using
  these properties can switch to using the ``bitrate``, ``sample-point``, ``bitrate-data``, and
  ``sample-point-data`` devicetree properties (or rely on
  :kconfig:option:`CONFIG_CAN_DEFAULT_BITRATE` and
  :kconfig:option:`CONFIG_CAN_DEFAULT_BITRATE_DATA`) for specifying the initial CAN bitrate:

  * ``sjw``
  * ``prop-seg``
  * ``phase-seg1``
  * ``phase-seg2``
  * ``sjw-data``
  * ``prop-seg-data``
  * ``phase-seg1-data``
  * ``phase-seg2-data``

  The ``bus-speed`` and ``bus-speed-data`` CAN controller devicetree properties have been
  deprecated.

  (:github:`68714`)

* Support for manual bus-off recovery was reworked (:github:`69460`):

  * Automatic bus recovery will always be enabled upon driver initialization regardless of Kconfig
    options. Since CAN controllers are initialized in "stopped" state, no unwanted bus-off recovery
    will be started at this point.
  * The Kconfig ``CONFIG_CAN_AUTO_BUS_OFF_RECOVERY`` was renamed (and inverted) to
    :kconfig:option:`CONFIG_CAN_MANUAL_RECOVERY_MODE`, which is disabled by default. This Kconfig
    option enables support for the :c:func:`can_recover()` API function and a new manual recovery mode
    (see the next bullet).
  * A new CAN controller operational mode :c:macro:`CAN_MODE_MANUAL_RECOVERY` was added. Support for
    this is only enabled if :kconfig:option:`CONFIG_CAN_MANUAL_RECOVERY_MODE` is enabled. Having
    this as a mode allows applications to inquire whether the CAN controller supports manual
    recovery mode via the :c:func:`can_get_capabilities` API function. The application can then
    either fail initialization or rely on automatic bus-off recovery. Having this as a mode
    furthermore allows CAN controller drivers not supporting manual recovery mode to fail early in
    :c:func:`can_set_mode` during application startup instead of failing when :c:func:`can_recover`
    is called at a later point in time.

Crypto
======

* The CSS driver has been deprecated on NXP lpc55s36 (:github:`71173`).

Display
=======

* GC9X01 based displays now use the MIPI DBI driver class. These displays
  must now be declared within a MIPI DBI driver wrapper device, which will
  manage interfacing with the display. (:github:`73686`)
  For an example, see below:

  .. code-block:: devicetree

    /* Legacy GC9X01 display definition */
    &spi0 {
        gc9a01: gc9a01@0 {
            status = "okay";
            compatible = "galaxycore,gc9x01x";
            reg = <0>;
            spi-max-frequency = <100000000>;
            cmd-data-gpios = <&gpio0 8 GPIO_ACTIVE_HIGH>;
            reset-gpios = <&gpio0 14 GPIO_ACTIVE_LOW>;
            ...
        };
    };

    /* New display definition with MIPI DBI device */

    #include <zephyr/dt-bindings/mipi_dbi/mipi_dbi.h>

    ...

    mipi_dbi {
        compatible = "zephyr,mipi-dbi-spi";
        dc-gpios = <&gpio0 8 GPIO_ACTIVE_HIGH>;
        reset-gpios = <&gpio0 14 GPIO_ACTIVE_LOW>;
        spi-dev = <&spi0>;
        #address-cells = <1>;
        #size-cells = <0>;

        gc9a01: gc9a01@0 {
            status = "okay";
            compatible = "galaxycore,gc9x01x";
            reg = <0>;
            mipi-max-frequency = <100000000>;
            ...
        };
    };


* ST7735R based displays now use the MIPI DBI driver class. These displays
  must now be declared within a MIPI DBI driver wrapper device, which will
  manage interfacing with the display. Note that the ``cmd-data-gpios`` pin has
  changed polarity with this update, to align better with the new
  ``dc-gpios`` name. For an example, see below:

  .. code-block:: devicetree

    /* Legacy ST7735R display definition */
    &spi0 {
        st7735r: st7735r@0 {
            compatible = "sitronix,st7735r";
            reg = <0>;
            spi-max-frequency = <32000000>;
            reset-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
            cmd-data-gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
            ...
        };
    };

    /* New display definition with MIPI DBI device */

    #include <zephyr/dt-bindings/mipi_dbi/mipi_dbi.h>

    ...

    mipi_dbi {
        compatible = "zephyr,mipi-dbi-spi";
        reset-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
        dc-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
        spi-dev = <&spi0>;
        #address-cells = <1>;
        #size-cells = <0>;

        st7735r: st7735r@0 {
            compatible = "sitronix,st7735r";
            reg = <0>;
            mipi-max-frequency = <32000000>;
            mipi-mode = <MIPI_DBI_MODE_SPI_4WIRE>;
            ...
        };
    };

* UC81XX based displays now use the MIPI DBI driver class. These displays must
  now be declared within a MIPI DBI driver wrapper device, which will manage
  interfacing with the display. (:github:`73812`) Note that the ``dc-gpios``
  pin has changed polarity with this update, for an example, see below:

  .. code-block:: devicetree

    /* Legacy UC81XX display definition */
    &spi0 {
        uc8179: uc8179@0 {
            compatible = "ultrachip,uc8179";
            reg = <0>;
            spi-max-frequency = <4000000>;
            reset-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
            dc-gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
            ...
        };
    };

    /* New display definition with MIPI DBI device */

    #include <zephyr/dt-bindings/mipi_dbi/mipi_dbi.h>

    ...

    mipi_dbi {
        compatible = "zephyr,mipi-dbi-spi";
        reset-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
        dc-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
        spi-dev = <&spi0>;
        #address-cells = <1>;
        #size-cells = <0>;
        uc8179: uc8179@0 {
            compatible = "ultrachip,uc8179";
            reg = <0>;
            mipi-max-frequency = <4000000>;
            ...
        };
    };

* ST7789V based displays now use the MIPI DBI driver class. These displays
  must now be declared within a MIPI DBI driver wrapper device, which will
  manage interfacing with the display. (:github:`73750`) Note that the
  ``cmd-data-gpios`` pin has changed polarity with this update, to align better
  with the new ``dc-gpios`` name. For an example, see below:

  .. code-block:: devicetree

    /* Legacy ST7789V display definition */
    &spi0 {
        st7789: st7789@0 {
            compatible = "sitronix,st7789v";
            reg = <0>;
            spi-max-frequency = <32000000>;
            reset-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
            cmd-data-gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
            ...
        };
    };

    /* New display definition with MIPI DBI device */

    #include <zephyr/dt-bindings/mipi_dbi/mipi_dbi.h>

    ...

    mipi_dbi {
        compatible = "zephyr,mipi-dbi-spi";
        reset-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
        dc-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
        spi-dev = <&spi0>;
        #address-cells = <1>;
        #size-cells = <0>;

        st7789: st7789@0 {
            compatible = "sitronix,st7789v";
            reg = <0>;
            mipi-max-frequency = <32000000>;
            mipi-mode = <MIPI_DBI_MODE_SPI_4WIRE>;
            ...
        };
    };

* SSD16XX based displays now use the MIPI DBI driver class (:github:`73946`).
  These displays must now be declared within a MIPI DBI driver wrapper device,
  which will manage interfacing with the display. Note that the ``dc-gpios``
  pin has changed polarity with this update. For an example, see below:

  .. code-block:: devicetree

    /* Legacy SSD16XX display definition */
    &spi0 {
        ssd1680: ssd1680@0 {
            compatible = "solomon,ssd1680";
            reg = <0>;
            spi-max-frequency = <4000000>;
            reset-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
            dc-gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
            ...
        };
    };

    /* New display definition with MIPI DBI device */

    #include <zephyr/dt-bindings/mipi_dbi/mipi_dbi.h>

    ...

    mipi_dbi {
        compatible = "zephyr,mipi-dbi-spi";
        reset-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
        dc-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
        spi-dev = <&spi0>;
        #address-cells = <1>;
        #size-cells = <0>;

        ssd1680: ssd1680@0 {
            compatible = "solomon,ssd1680";
            reg = <0>;
            mipi-max-frequency = <4000000>;
            ...
        };
    };

* The ``orientation-flipped`` property has been removed from the SSD16XX
  display driver, as the driver now supports display rotation. Users should
  drop this property from their devicetree, and set orientation at runtime
  via :c:func:`display_set_orientation` (:github:`73360`)

Enhanced Serial Peripheral Interface (eSPI)
===========================================

* The macros ``ESPI_SLAVE_TO_MASTER`` and ``ESPI_MASTER_TO_SLAVE`` were renamed to
  ``ESPI_TARGET_TO_CONTROLLER`` and ``ESPI_CONTROLLER_TO_TARGET`` respectively to reflect
  the new terminology in eSPI 1.5 specification.
  The enum values ``ESPI_VWIRE_SIGNAL_SLV_BOOT_STS``, ``ESPI_VWIRE_SIGNAL_SLV_BOOT_DONE`` and
  all ``ESPI_VWIRE_SIGNAL_SLV_GPIO_<NUMBER>`` signals were renamed to
  ``ESPI_VWIRE_SIGNAL_TARGET_BOOT_STS``, ``ESPI_VWIRE_SIGNAL_TARGET_BOOT_DONE`` and
  ``ESPI_VWIRE_SIGNAL_TARGET_GPIO_<NUMBER>`` respectively to reflect the new terminology
  in eSPI 1.5 specification. (:github:`68492`)
  The Kconfig ``CONFIG_ESPI_SLAVE`` was renamed to  :kconfig:option:`CONFIG_ESPI_TARGET`, similarly
  ``CONFIG_ESPI_SAF`` was renamed as :kconfig:option:`CONFIG_ESPI_TAF` (:github:`73887`)

GNSS
====

* Basic power management support has been added to the ``gnss-nmea-generic`` driver.
  If ``CONFIG_PM_DEVICE=y`` the driver is now initialized in suspended mode and the
  application needs to call :c:func:`pm_device_action_run` with :c:macro:`PM_DEVICE_ACTION_RESUME`
  to start up the driver. (:github:`71774`)

Input
=====

* The ``analog-axis`` deadzone calibration value has been changed to be
  relative to the raw ADC values, similarly to min and max. The data structures
  and properties have been renamed to reflect that (from ``out-deadzone`` to
  ``in-deadzone``) and when migrating to the new definition the value should be
  scaled accordingly. (:github:`70377`)

* The ``holtek,ht16k33-keyscan`` driver has been converted to use the
  :ref:`input` subsystem, callbacks have to be migrated to use the input APIs,
  :dtcompatible:`zephyr,kscan-input` can be used for backward compatibility. (:github:`69875`)

Interrupt Controller
====================

* The static auto-generation of the multilevel interrupt controller lookup table has been
  deprecated, and will be compiled only when the new compatibility Kconfig:
  :kconfig:option:`CONFIG_LEGACY_MULTI_LEVEL_TABLE_GENERATION` is enabled, which will eventually
  be removed in the coming releases.

  Multi-level interrupt controller drivers should be updated to use the newly created
  ``IRQ_PARENT_ENTRY_DEFINE`` macro to register itself with the new multi-level interrupt
  architecture. To make the macro easier to use, ``INTC_INST_ISR_TBL_OFFSET`` macro is made to
  deduce the software ISR table offset for a given driver instance, for pseudo interrupt controller
  child, use the ``INTC_CHILD_ISR_TBL_OFFSET`` macro instead. New devicetree macros
  (``DT_INTC_GET_AGGREGATOR_LEVEL`` & ``DT_INST_INTC_GET_AGGREGATOR_LEVEL``) have been added
  for an interrupt controller driver instance to pass its aggregator level into the
  ``IRQ_PARENT_ENTRY_DEFINE`` macro.

LED Strip
=========

* The property ``in-gpios`` defined in :dtcompatible:`worldsemi,ws2812-gpio` has been
  renamed to ``gpios``. (:github:`68514`)

* The ``chain-length`` and ``color-mapping`` properties have been added to all LED strip bindings
  and are now mandatory.

* Added a new mandatory ``length`` function which returns the length (number of pixels) of an LED
  strip device.

* Made ``update_channels`` function optional and removed unimplemented functions.

* The ``CONFIG_WS2812_STRIP_DRIVER`` kconfig option has been removed.
  Previously, when using :kconfig:option:`CONFIG_WS2812_STRIP_SPI`,
  :kconfig:option:`CONFIG_WS2812_STRIP_I2S`, :kconfig:option:`CONFIG_WS2812_STRIP_GPIO`,
  or :kconfig:option:`CONFIG_WS2812_STRIP_RPI_PICO_PIO`, one of them had to be selected with
  ``CONFIG_WS2812_STRIP_DRIVER``, but this is no longer necessary. Please set each option directly.

MDIO
====

* :kconfig:option:`CONFIG_MDIO_NXP_ENET_TIMEOUT` is now in units of
  microseconds instead of milliseconds. (:github:`75625`)

Sensors
=======

* The ``chip`` devicetree property from the :dtcompatible:`sensirion,shtcx` sensor driver has been
  removed. Chip variants are now selected using the matching compatible property (:github:`74033`).
  For an example of the new shtc3 configuration, see below:

  .. code-block:: devicetree

    &i2c0 {
        status = "okay";

        shtc3: shtc3@70 {
            compatible = "sensirion,shtc3", "sensirion,shtcx";
            reg = <0x70>;
            measure-mode = "normal";
            clock-stretching;
        };
    };

Serial
======

* The Raspberry Pi UART driver ``uart_rpi_pico`` has been removed.
  Use ``uart_pl011`` (:dtcompatible:`arm,pl011`) instead. (:github:`71074`)

Regulator
=========

* The :dtcompatible:`nxp,vref` driver no longer supports the ground selection function,
  as this setting should not be modified by the user. The DT property ``nxp,ground-select``
  has been removed, users should remove this property from their devicetree if it is present.
  (:github:`70642`)

W1
==

* The :dtcompatible:`zephyr,w1-gpio` 1-Wire master driver no longer defaults to enabling the
  internal pull-up resistor of the GPIO pin. The configuration is now taken from the pin's
  configuration flags specified in devicetree. (:github:`71789`)

Watchdog
========

* The ``nuvoton,npcx-watchdog`` driver has been changed to extend the max timeout period.
  The time of one watchdog count varies with the different pre-scalar settings.
  Removed :kconfig:option:`CONFIG_WDT_NPCX_DELAY_CYCLES` because it is no longer suitable to
  set the leading warning time.
  Instead, added the :kconfig:option:`CONFIG_WDT_NPCX_WARNING_LEADING_TIME_MS` to set
  the leading warning time in milliseconds.

Bluetooth
*********

Bluetooth HCI
=============

 * A new HCI driver API was introduced (:github:`72323`) and the old one deprecated. The new API
   follows the normal Zephyr driver model, with devicetree nodes, etc. The host now
   selects which driver instance to use as the controller by looking for a ``zephyr,bt-hci``
   chosen property. The devicetree bindings for all HCI drivers derive from a common
   ``bt-hci.yaml`` base binding.

  * As part of the new HCI driver API, the ``zephyr,bt-uart`` chosen property is no longer used,
    rather the UART HCI drivers select their UART by looking for the parent devicetree node of the
    HCI driver instance node.
  * As part of the new HCI driver API, the ``zephyr,bt-hci-ipc`` chosen property is only used for
    the controller side, whereas the HCI driver now relies on nodes with the compatible string
    ``zephyr,bt-hci-ipc``.
  * The ``BT_NO_DRIVER`` Kconfig option was removed. HCI drivers are no-longer behind a Kconfig
    choice, rather they can now be enabled and disabled independently, mostly based on their
    respective devicetree node being enabled or not.
  * The ``BT_HCI_VS_EXT`` Kconfig option was deleted and the feature is now included in the
    :kconfig:option:`CONFIG_BT_HCI_VS` Kconfig option.
  * The ``BT_HCI_VS_EVT`` Kconfig option was removed, since vendor event support is implicit if
    the :kconfig:option:`CONFIG_BT_HCI_VS` option is enabled.
  * The bt_read_static_addr() API was removed. This wasn't really a completely public API, but
    since it was exposed by the public hci_driver.h header file the removal is mentioned here.
    Enable the :kconfig:option:`CONFIG_BT_HCI_VS` Kconfig option instead, and use vendor specific
    HCI commands API to get the Controller's Bluetooth static address when available.

Bluetooth Mesh
==============

* The model metadata pointer declaration of :c:struct:`bt_mesh_model` has been changed
  to add ``const`` qualifiers. The data pointer of :c:struct:`bt_mesh_models_metadata_entry`
  got ``const`` qualifier too. The model's metadata structure and metadata raw value
  can be declared as permanent constants in the non-volatile memory. (:github:`69679`)

* The model metadata pointer declaration of :c:struct:`bt_mesh_model` has been changed
  to a single ``const *`` and redundant metadata pointer from :c:struct:`bt_mesh_health_srv`
  is removed. Consequently, :code:`BT_MESH_MODEL_HEALTH_SRV` definition is changed
  to use variable argument notation. Now, when your implementation
  supports :kconfig:option:`CONFIG_BT_MESH_LARGE_COMP_DATA_SRV` and when you need to
  specify metadata for Health Server model, simply pass metadata as the last argument
  to the :code:`BT_MESH_MODEL_HEALTH_SRV` macro, otherwise omit the last argument. (:github:`71281`)

Bluetooth Audio
===============

* :kconfig:option:`CONFIG_BT_ASCS`, :kconfig:option:`CONFIG_BT_PERIPHERAL` and
  :kconfig:option:`CONFIG_BT_ISO_PERIPHERAL` are no longer enabled automatically when
  enabling :kconfig:option:`CONFIG_BT_BAP_UNICAST_SERVER`, and these must now be set explicitly
  in the project configuration file. (:github:`71993`)

* The discover callback functions :code:`bt_cap_initiator_cb.unicast_discovery_complete` and
  :code:`bt_cap_commander_cb.discovery_complete` for CAP now contain an additional parameter for
  the set member.
  This needs to be added to all instances of CAP discovery callback functions defined.
  (:github:`72797`)

* :c:func:`bt_bap_stream_start` no longer connects the CIS. To connect the CIS,
  the :c:func:`bt_bap_stream_connect` shall now be called before :c:func:`bt_bap_stream_start`.
  (:github:`73032`)

* Renamed ``stream_lang`` to just ``lang`` to better fit with the assigned numbers document.
  This affects the ``BT_AUDIO_METADATA_TYPE_LANG`` macro and the following functions:

  * :c:func:`bt_audio_codec_cap_meta_set_lang`
  * :c:func:`bt_audio_codec_cap_meta_get_lang`
  * :c:func:`bt_audio_codec_cfg_meta_set_lang`
  * :c:func:`bt_audio_codec_cfg_meta_get_lang`

  (:github:`72584`)

* Changed ``lang`` from ``uint32_t`` to ``uint8_t [3]``. This modifies the following functions:

  * :c:func:`bt_audio_codec_cap_meta_set_lang`
  * :c:func:`bt_audio_codec_cap_meta_get_lang`
  * :c:func:`bt_audio_codec_cfg_meta_set_lang`
  * :c:func:`bt_audio_codec_cfg_meta_get_lang`

  The result of this is that string values such as ``"eng"`` and ``"deu"`` can now be used to set
  new values, and to prevent unnecessary copies of data when getting the values. (:github:`72584`)

* All occurrences of ``set_sirk`` have been changed to just ``sirk`` as the ``s`` in ``sirk`` stands
  for set. (:github:`73413`)

* Added ``fallback_to_default`` parameter to :c:func:`bt_audio_codec_cfg_get_chan_allocation`.
  To maintain existing behavior set the parameter to ``false``. (:github:`72090`)

* Added ``fallback_to_default`` parameter to
  :c:func:`bt_audio_codec_cap_get_supported_audio_chan_counts`.
  To maintain existing behavior set the parameter to ``false``. (:github:`72090`)

* Added ``fallback_to_default`` parameter to
  :c:func:`bt_audio_codec_cap_get_max_codec_frames_per_sdu`.
  To maintain existing behavior set the parameter to ``false``. (:github:`72090`)

* Added ``fallback_to_default`` parameter to
  :c:func:`bt_audio_codec_cfg_meta_get_pref_context`.
  To maintain existing behavior set the parameter to ``false``. (:github:`72090`)

Bluetooth Classic
=================

* The source files of Host BR/EDR have been moved to ``subsys/bluetooth/host/classic``.
  The Header files of Host BR/EDR have been moved to ``include/zephyr/bluetooth/classic``.
  Removed the :kconfig:option:`CONFIG_BT_BREDR`. It is replaced by new option
  :kconfig:option:`CONFIG_BT_CLASSIC`. (:github:`69651`)

Bluetooth Host
==============

* The advertiser options :code:`BT_LE_ADV_OPT_USE_NAME` and :code:`BT_LE_ADV_OPT_FORCE_NAME_IN_AD`
  are deprecated in this release. The application need to include the device name explicitly. One
  way to do it is by adding the following to the advertising data or scan response data passed to
  the host:

  .. code-block:: c

   BT_DATA(BT_DATA_NAME_COMPLETE, CONFIG_BT_DEVICE_NAME, sizeof(CONFIG_BT_DEVICE_NAME) - 1)

  (:github:`71686`)

* The field :code:`init_credits` in :c:type:`bt_l2cap_le_endpoint` has been removed as it was no
  longer used in Zephyr 3.4.0 and later. Any references to this field should be removed. No further
  action is needed.

* :c:macro:`BT_LE_ADV_PARAM` now returns a :code:`const` pointer.
  Any place where the result is stored in a local variable such as
  :code:`struct bt_le_adv_param *param = BT_LE_ADV_CONN;` will need to
  be updated to :code:`const struct bt_le_adv_param *param = BT_LE_ADV_CONN;` or use it for
  initialization like :code:`struct bt_le_adv_param param = *BT_LE_ADV_CONN;`

  The change to :c:macro:`BT_LE_ADV_PARAM` also affects all of its derivatives, including but not
  limited to:

  * :c:macro:`BT_LE_ADV_CONN`
  * :c:macro:`BT_LE_ADV_NCONN`
  * :c:macro:`BT_LE_EXT_ADV_SCAN`
  * :c:macro:`BT_LE_EXT_ADV_CODED_NCONN_NAME`

  (:github:`75065`)

* :kconfig:option:`CONFIG_BT_BUF_ACL_RX_COUNT` now needs to be larger than
  :kconfig:option:`CONFIG_BT_MAX_CONN`. This was always the case due to the design of the HCI
  interface. It is now being enforced through a build-time assertion.

  (:github:`75592`)

Bluetooth Crypto
================

* :kconfig:option:`CONFIG_BT_USE_PSA_API` was added to explicitly request use
  of PSA APIs instead of TinyCrypt for crypto operations. Of course, this is
  possible only a PSA crypto provider available in the system, i.e.
  :kconfig:option:`CONFIG_PSA_CRYPTO_CLIENT` is set. (:github:`73378`)

Networking
**********

* Deprecate the :kconfig:option:`CONFIG_NET_SOCKETS_POSIX_NAMES` option. It is a legacy option
  and was used to allow user to call BSD socket API while not enabling POSIX API.
  This could cause complications when building applications that wanted to enable the
  :kconfig:option:`CONFIG_POSIX_API` option. This means that if the application wants to use
  normal BSD socket interface, then it needs to enable :kconfig:option:`CONFIG_POSIX_API`.
  If the application does not want or is not able to enable that option, then the socket API
  calls need to be prefixed by a ``zsock_`` string.
  All the sample applications that use BSD socket interface are changed to enable
  :kconfig:option:`CONFIG_POSIX_API`. Internally the network stack will not enable POSIX API
  option which means that various network libraries that use sockets, are converted to
  use the ``zsock_*`` API calls. (:github:`69950`)

* The zperf zperf_results struct is changed to support 64 bits transferred bytes (total_len)
  and test duration (time_in_us and client_time_in_us), instead of 32 bits. This will make
  the long-duration zperf test show with correct throughput result. (:github:`69500`)

* Each IPv4 address assigned to a network interface has an IPv4 netmask
  tied to it instead of being set for the whole interface.
  If there is only one IPv4 address specified for a network interface,
  nothing changes from the user point of view. But, if there is more than
  one IPv4 address / network interface, the netmask must be specified
  for each IPv4 address separately. (:github:`68419`)

* Virtual network interface API no longer has the ``input`` callback. The input callback was
  used to read the inner IPv4/IPv6 packets in an IP tunnel. This incoming tunnel read is now
  implemented in the ``recv`` callback. (:github:`70549`)

* Virtual LAN (VLAN) implementation is changed to use the Virtual network interfaces.
  There are no API changes, but the type of a VLAN network interface is changed from ``ETHERNET``
  to ``VIRTUAL``. This could require changes to the code that sets the VLAN tags to a network
  interface. For example in the :c:func:`net_eth_is_vlan_enabled()` API, the 2nd interface parameter
  must point to the main Ethernet interface, and not to the VLAN interface. (:github:`70345`)

* Modified the ``wifi connect`` command to use key-value format for the arguments. In the
  previous implementation, we were identifying an option using its position in the argument string.
  This made it difficult to deal with optional arguments or extending the support
  for other options. Having this key-value format makes it easier to extend the options that
  can be passed to the connect command.
  ``wifi -h`` will give more information about the usage of connect command.
  (:github:`70024`)

* The Kconfig :kconfig:option:`CONFIG_NET_TCP_ACK_TIMEOUT` has been deprecated. Its usage was
  limited to TCP handshake only, and in such case the total timeout should depend
  on the total retransmission timeout (as in other cases) making the config
  redundant and confusing. Use :kconfig:option:`CONFIG_NET_TCP_INIT_RETRANSMISSION_TIMEOUT` and
  :kconfig:option:`CONFIG_NET_TCP_RETRY_COUNT` instead to control the total timeout at the
  TCP level. (:github:`70731`)

* In LwM2M API, the callback type :c:type:`lwm2m_engine_set_data_cb_t` has now an additional
  parameter ``offset``. This parameter is used to indicate the offset of the data
  during a Coap Block-wise transfer. Any post write, validate or some firmware callbacks
  should be updated to include this parameter. (:github:`72590`)

* The DNS resolver and mDNS/LLMNR responders are converted to use socket service API.
  This means that the number of pollable sockets in the system might need to be increased.
  Please check that the values of :kconfig:option:`CONFIG_NET_SOCKETS_POLL_MAX` and
  :kconfig:option:`CONFIG_POSIX_MAX_FDS` are high enough. Unfortunately no exact values
  for these can be given as it depends on application needs and usage. (:github:`72834`)

* The packet socket (type ``AF_PACKET``) protocol field in ``socket`` API call has changed.
  The protocol field should be in network byte order so that we are compatible with Linux
  socket calls. Linux expects the protocol field to be ``htons(ETH_P_ALL)`` if it is desired
  to receive all the network packets. See details in
  https://www.man7.org/linux/man-pages/man7/packet.7.html documentation. (:github:`73338`)

* TCP now uses SHA-256 instead of MD5 for ISN generation. The crypto support for
  this hash computation was also changed from Mbed TLS to PSA APIs. This was achieved
  by making :kconfig:option:`CONFIG_NET_TCP_ISN_RFC6528` depend on
  :kconfig:option:`PSA_WANT_ALG_SHA_256` instead of legacy ``CONFIG_MBEDTLS_*``
  features. (:github:`71827`)

Other Subsystems
****************

Flash map
=========

* The crypto backend for the flash check functions (:kconfig:option:`CONFIG_FLASH_AREA_CHECK_INTEGRITY_BACKEND`),
  previously provided through either TinyCrypt or Mbed TLS, is now provided through either PSA or Mbed TLS.
  The updated Mbed TLS implementation has a slightly smaller footprint than the previous TinyCrypt one,
  and the PSA implementation offers an even greater footprint reduction for devices built with TF-M.
  PSA is the supported way forward, however as of now you may still use Mbed TLS if you cannot afford the
  one-time cost of enabling the PSA API (:kconfig:option:`CONFIG_MBEDTLS_PSA_CRYPTO_C` for devices without TF-M).
  :github:`73511`

hawkBit
=======

* :kconfig:option:`CONFIG_HAWKBIT_PORT` is now an int instead of a string.
  :kconfig:option:`CONFIG_SETTINGS` needs to be enabled to use hawkBit, as it now uses the
  settings subsystem to store the hawkBit configuration. (:github:`68806`)

MCUmgr
======

* The support for SHA-256 (when using checksum/hash functions), previously provided
  by either TinyCrypt or Mbed TLS, is now provided by either PSA or Mbed TLS.
  PSA is the recommended API going forward, however, if it is not already enabled
  (:kconfig:option:`CONFIG_MBEDTLS_PSA_CRYPTO_CLIENT`) and you have tight code size
  constraints, you may be able to save 1.3 KB by using Mbed TLS instead.

Modem
=====

* The ``CONFIG_MODEM_CHAT_LOG_BUFFER`` Kconfig option was
  renamed to :kconfig:option:`CONFIG_MODEM_CHAT_LOG_BUFFER_SIZE`. (:github:`70405`)

.. _zephyr_3.7_posix_api_migration:

POSIX API
=========

* The :ref:`POSIX API Kconfig deprecations <zephyr_3.7_posix_api_deprecations>` may require
  changes to Kconfig files (``prj.conf``, etc), as outlined in the release notes. A more automated
  approach is available via the provided migration script. Simply run the following:

  .. code-block:: bash

    $ python ${ZEPHYR_BASE}/scripts/utils/migrate_posix_kconfigs.py -r root_path

State Machine Framework
=======================

* The :c:macro:`SMF_CREATE_STATE` macro now always takes 5 arguments. The amount of arguments is
  now independent of the values of :kconfig:option:`CONFIG_SMF_ANCESTOR_SUPPORT` and
  :kconfig:option:`CONFIG_SMF_INITIAL_TRANSITION`. If the additional arguments are not used, they
  have to be set to ``NULL``. (:github:`71250`)
* SMF now follows a more UML-like transition flow when the transition source is a parent of the
  state called by :c:func:`smf_run_state`. Exit actions up to (but not including) the Least Common
  Ancestor of the transition source and target state will be executed, as will entry actions from
  (but not including) the LCA down to the target state. (:github:`71675`)
* Previously, calling :c:func:`smf_set_state` with a ``new_state`` set to NULL would execute all
  exit actions from the current state to the topmost parent, with the expectation the topmost exit
  action would terminate the state machine. Passing ``NULL`` is now not allowed. Instead create a
  'terminate' state at the top level, and call :c:func:`smf_set_terminate` from its entry action.

UpdateHub
=========

* The SHA-256 implementation used to perform integrity checks is not chosen with
  :kconfig:option:`CONFIG_FLASH_AREA_CHECK_INTEGRITY_BACKEND` anymore. Instead, the implementation
  used (now either Mbed TLS or PSA) is chosen based on :kconfig:option:`CONFIG_PSA_CRYPTO_CLIENT`.
  It still defaults to using Mbed TLS (with a smaller footprint than previously) unless the
  board is built with TF-M or :kconfig:option:`CONFIG_MBEDTLS_PSA_CRYPTO_C` is enabled. (:github:`73511`)

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

* Function :c:func:`arch_start_cpu` has been renamed to :c:func:`arch_cpu_start`. (:github:`64987`)

* ``CONFIG_ARM64_ENABLE_FRAME_POINTER`` is deprecated. Use :kconfig:option:`CONFIG_FRAME_POINTER`
  instead. (:github:`72646`)

* x86

  * Kconfigs ``CONFIG_DISABLE_SSBD`` and ``CONFIG_ENABLE_EXTENDED_IBRS``
    are deprecated. Use :kconfig:option:`CONFIG_X86_DISABLE_SSBD` and
    :kconfig:option:`CONFIG_X86_ENABLE_EXTENDED_IBRS` instead. (:github:`69690`)

* POSIX arch:

  * LLVM fuzzing support has been refactored. A test application now needs to provide its own
    ``LLVMFuzzerTestOneInput()`` hook instead of relying on a board provided one. Check
    ``samples/subsys/debug/fuzz/`` for an example. (:github:`71378`)
