This is the documentation for the latest (main) development branch of Zephyr. If you are looking for the documentation of previous releases, use the drop-down menu on the left and select the desired version.

Migration guide to Zephyr v3.6.0 (Working Draft)

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

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

Required changes


  • The deprecated Nordic SoC Kconfig option NRF_STORE_REBOOT_TYPE_GPREGRET has been removed, applications that use this should switch to using the Boot mode instead.


C Library

Optional Modules

The following modules have been made optional and are not downloaded with west update by default anymore:

To enable them again use the west config manifest.project-filter -- +<module name> command, or west config -- +optional to enable all optional modules, and then run west update again.

Device Drivers and Device Tree

  • The st,lsm6dsv16x sensor driver has been changed to support configuration of both int1 and int2 pins. The DT attribute irq-gpios has been removed and substituted by two new attributes, int1-gpios and int2-gpios. These attributes must be configured in the Device Tree similarly to the following example:

    / {
        lsm6dsv16x@0 {
            compatible = "st,lsm6dsv16x";
            int1-gpios = <&gpioa 4 GPIO_ACTIVE_HIGH>;
            int2-gpios = <&gpiod 11 GPIO_ACTIVE_HIGH>;
            drdy-pin = <2>;
  • The optional setup() function in the Bluetooth HCI driver API (enabled through CONFIG_BT_HCI_SETUP) has gained a function parameter of type bt_hci_setup_params. By default, the struct is empty, but drivers can opt-in to CONFIG_BT_HCI_SET_PUBLIC_ADDR if they support setting the controller’s public identity address, which will then be passed in the public_addr field.

    (GitHub #62994)

Power Management



  • MCUboot’s deprecated CONFIG_ZEPHYR_TRY_MASS_ERASE Kconfig option has been removed. If an erase is needed when flashing MCUboot, this should now be provided directly to the west command e.g. west flash --erase. (GitHub #64703)


  • The HCI implementation for both the Host and the Controller sides has been renamed for the IPC transport. The CONFIG_BT_RPMSG Kconfig option is now CONFIG_BT_HCI_IPC, and the zephyr,bt-hci-rpmsg-ipc Devicetree chosen is now zephyr,bt-hci-ipc. The existing sample has also been renamed, from samples/bluetooth/hci_rpmsg to samples/bluetooth/hci_ipc. (GitHub #64391)

  • The BT GATT callback list, appended to by bt_gatt_cb_register(), is no longer cleared on bt_enable(). Callbacks can now be registered before the initial call to bt_enable(), and should no longer be re-registered after a bt_disable() bt_enable() cycle. (GitHub #63693)

  • The Bluetooth Mesh model declaration has been changed to add prefix const. The model->user_data, model->elem_idx and model->mod_idx field has been changed to the new runtime structure, replaced by model->rt->user_data, model->rt->elem_idx and model->rt->mod_idx separately. (GitHub #65152)

  • The Bluetooth Mesh element declaration has been changed to add prefix const. The elem->addr field has been changed to the new runtime structure, replaced by elem->rt->addr. (GitHub #65388)


  • The API to register a callback to provide battery level information to the LoRaWAN stack has been renamed from lorawan_set_battery_level_callback to lorawan_register_battery_level_callback() and the return type is now void. This is more consistent with similar functions for downlink and data rate changed callbacks. (GitHub #65103)


  • The CoAP public API has some minor changes to take into account. The coap_remove_observer() now returns a result if the observer was removed. This change is used by the newly introduced CoAP server subsystem. Also, the request argument for coap_well_known_core_get() is made const. (GitHub #64265)

  • The IGMP multicast library now supports IGMPv3. This results in a minor change to the existing api. The net_ipv4_igmp_join() now takes an additional argument of the type const struct igmp_param *param. This allows IGMPv3 to exclude/include certain groups of addresses. If this functionality is not used or available (when using IGMPv2), you can safely pass a NULL pointer. IGMPv3 can be enabled using the Kconfig CONFIG_NET_IPV4_IGMPV3. (GitHub #65293)

Other Subsystems

  • MCUmgr applications that make use of serial transports (shell or UART) must now select CONFIG_CRC, this was previously erroneously selected if MCUmgr was enabled, when for non-serial transports it was not needed. (GitHub #64078)

  • Touchscreen drivers focaltech,ft5336 and goodix,gt911 were using the incorrect polarity for the respective reset-gpios. This has been fixed so those signals now have to be flagged as GPIO_ACTIVE_LOW in the devicetree. (GitHub #64800)