| :orphan: |
| |
| .. _migration_3.5: |
| |
| Migration guide to Zephyr v3.5.0 |
| ################################ |
| |
| This document describes the changes required or recommended when migrating your |
| application from Zephyr v3.4.0 to Zephyr v3.5.0. |
| |
| Any other changes (not directly related to migrating applications) can be found in |
| the :ref:`release notes<zephyr_3.5>`. |
| |
| Required changes |
| **************** |
| |
| Kernel |
| ====== |
| |
| * The kernel :c:func:`k_mem_slab_free` function has changed its signature, now |
| taking a ``void *mem`` pointer instead of a ``void **mem`` double-pointer. |
| The new signature will not immediately trigger a compiler error or warning, |
| instead likely causing a invalid memory access at runtime. A new ``_ASSERT`` |
| statement, that you can enable with :kconfig:option:`CONFIG_ASSERT`, will |
| detect if you pass the function memory not belonging to the memory blocks in |
| the slab. |
| |
| * :c:macro:`CONTAINER_OF` now performs type checking, this was very commonly |
| misused to obtain user structure from :c:struct:`k_work` pointers without |
| passing from :c:struct:`k_work_delayable`. This would now result in a build |
| error and have to be done correctly using |
| :c:func:`k_work_delayable_from_work`. |
| |
| C Library |
| ========= |
| |
| * The default C library used on most targets has changed from the built-in |
| minimal C library to Picolibc. While both provide standard C library |
| interfaces and shouldn't cause any behavioral regressions for applications, |
| there are a few side effects to be aware of when migrating to Picolibc. |
| |
| * Picolibc enables thread local storage |
| (:kconfig:option:`CONFIG_THREAD_LOCAL_STORAGE`) where supported. This |
| changes some internal operations within the kernel that improve |
| performance using some TLS variables. Zephyr places TLS variables in the |
| memory reserved for the stack, so stack usage for every thread will |
| increase by 8-16 bytes. |
| |
| * Picolibc uses the same malloc implementation as the minimal C library, but |
| the default heap size depends on which C library is in use. When using the |
| minimal C library, the default heap is zero bytes, which means that malloc |
| will always fail. When using Picolibc, the default is 16kB with |
| :kconfig:option:`CONFIG_MMU` or :kconfig:option:`ARCH_POSIX`, 2kB with |
| :kconfig:option:`CONFIG_USERSPACE` and |
| :kconfig:option:`CONFIG_MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT`. For all |
| other targets, the default heap uses all remaining memory on the system. |
| You can change this by adjusting |
| :kconfig:option:`CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE`. |
| |
| * Picolibc can either be built as part of the OS build or pulled from the |
| toolchain. When building as part of the OS, the build will increase by |
| approximately 1000 files. |
| |
| * When using the standard C++ library with Picolibc, both of those must come |
| from the toolchain as the standard C++ library depends upon the C library |
| ABI. |
| |
| * Picolibc removes the ``-ffreestanding`` compiler option. This allows |
| significant compiler optimization improvements, but also means that the |
| compiler will now warn about declarations of `main` which don't conform to |
| the Zephyr required type -- ``int main(void)``. |
| |
| * Picolibc has four different printf/scanf variants supported in Zephyr, |
| 'double', 'long long', 'integer', and 'minimal. 'double' offers a |
| complete printf implementation with exact floating point in decimal and |
| hexadecimal formats, full integer support including long long, C99 |
| integer size specifiers (j, z, t) and POSIX positional arguments. 'long |
| long' mode removes float support, 'integer' removes long long support |
| while 'minimal' mode also removes support for format modifiers and |
| positional arguments. Building the library as a module allows finer |
| control over the feature set provided at each level. |
| |
| * Picolibc's default floating point input/output code is larger than the |
| minimal C library version (this is necessary to conform with the C |
| language "round trip" requirements for these operations). If you use |
| :kconfig:option:`CONFIG_CBPRINTF_FP_SUPPORT`, you will see increased |
| memory usage unless you also disable |
| :kconfig:option:`CONFIG_PICOLIBC_IO_FLOAT_EXACT`, which switches Picolibc |
| to a smaller, but inexact conversion algorithm. This requires building |
| Picolibc as a module. |
| |
| Optional Modules |
| ================ |
| |
| The following modules have been made optional and are not downloaded with `west update` by default anymore: |
| |
| * ``chre`` |
| * ``lz4`` |
| * ``nanopb`` |
| * ``psa-arch-tests`` |
| * ``sof`` |
| * ``tf-m-tests`` |
| * ``tflite-micro`` |
| * ``thrift`` |
| * ``zscilib`` |
| |
| To enable them again use the ``west config manifest.project-filter -- +<module |
| name>`` command, or ``west config manifest.group-filter -- +optional`` to |
| enable all optional modules, and then run ``west update`` again. |
| |
| Device Drivers and Device Tree |
| ============================== |
| |
| * ``zephyr,memory-region-mpu`` was renamed ``zephyr,memory-attr`` and its type |
| moved from 'enum' to 'int'. To have a seamless conversion this is the |
| required change in the DT: |
| |
| .. code-block:: none |
| |
| - "RAM" -> <( DT_MEM_ARM(ATTR_MPU_RAM) )> |
| - "RAM_NOCACHE" -> <( DT_MEM_ARM(ATTR_MPU_RAM_NOCACHE) )> |
| - "FLASH" -> <( DT_MEM_ARM(ATTR_MPU_FLASH) )> |
| - "PPB" -> <( DT_MEM_ARM(ATTR_MPU_PPB) )> |
| - "IO" -> <( DT_MEM_ARM(ATTR_MPU_IO) )> |
| - "EXTMEM" -> <( DT_MEM_ARM(ATTR_MPU_EXTMEM) )> |
| |
| * Device dependencies (incorrectly referred as "device handles" in some areas) |
| are now an optional feature enabled by :kconfig:option:`CONFIG_DEVICE_DEPS`. |
| This means that an extra linker stage is no longer necessary if this option is |
| not enabled. |
| |
| * On all STM32 ADC, it is no longer possible to read sensor channels (Vref, |
| Vbat or temperature) using the ADC driver. The dedicated sensor driver should |
| be used instead. This change is due to a limitation on STM32F4 where the |
| channels for temperature and Vbat are identical, and the impossibility of |
| determining what we want to measure using solely the ADC API. |
| |
| * The RAM disk driver has been changed to support multiple instances and instantiation |
| using devicetree. As a result, Kconfig option :kconfig:option:`CONFIG_DISK_RAM_VOLUME_SIZE` |
| and Kconfig option :kconfig:option:`CONFIG_DISK_RAM_VOLUME_NAME` are removed, |
| and the application using the RAM disk must instantiate it using devicetree, |
| as in the following example: |
| |
| .. code-block:: devicetree |
| |
| / { |
| ramdisk0 { |
| compatible = "zephyr,ram-disk"; |
| disk-name = "RAM"; |
| sector-size = <512>; |
| sector-count = <192>; |
| }; |
| }; |
| |
| * The :dtcompatible:`goodix,gt911`, :dtcompatible:`xptek,xpt2046` and |
| :dtcompatible:`hynitron,cst816s` drivers have been converted from Kscan to |
| Input, they can still be used with Kscan applications by adding a |
| :dtcompatible:`zephyr,kscan-input` node. |
| |
| * The ``zephyr,gpio-keys`` binding has been merged into |
| :dtcompatible:`gpio-keys` and the callback definition has been renamed from |
| ``INPUT_LISTENER_CB_DEFINE`` to :c:macro:`INPUT_CALLBACK_DEFINE`. |
| |
| * The :dtcompatible:`ti,bq274xx` driver was using incorrect units for capacity |
| and power channels, these have been fixed and scaled by x1000 factor from the |
| previous implementation, any application using them has to be changed |
| accordingly. |
| |
| * The configuration options for the SSD1306 display driver can now be provided |
| via the Devicetree binding :dtcompatible:`solomon,ssd1306fb`. The following |
| Kconfig options: ``CONFIG_SSD1306_DEFAULT``, |
| ``CONFIG_SSD1306_SH1106_COMPATIBLE``, and ``CONFIG_SSD1306_REVERSE_MODE`` have |
| been removed. |
| |
| * You can remove ``CONFIG_SSD1306_DEFAULT`` without any other modification. |
| |
| * ``CONFIG_SSD1306_SH1106_COMPATIBLE`` was used to assert that the device is |
| (compatible with) SH1106. This has been replaced by a dedicated dts |
| compatible declaration. You may update an existing sh1106 node to change the |
| ``compatible`` designation from :dtcompatible:`solomon,ssd1306fb` to |
| :dtcompatible:`sinowealth,sh1106`. |
| |
| * ``CONFIG_SSD1306_REVERSE_MODE`` is now set using the ``inversion-on`` |
| property of the devicetree node. |
| |
| * GPIO drivers not implementing IRQ related operations must now provide |
| ``NULL`` to the relevant operations: ``pin_interrupt_configure``, |
| ``manage_callback``, ``get_pending_int``. The public API will return |
| ``-ENOSYS`` when these are not available, instead of ``-ENOTSUP``. |
| |
| * STM32 Ethernet driver was misusing :c:func:`hwinfo_get_device_id` to generate |
| last 3 bytes of mac address, resulting in a high risk of collision when using |
| SoCs from the same lot. This is now fixed to use the whole range of entropy |
| available from the unique ID (96 bits). Devices using unique ID based mac address |
| will see last 3 bytes of their MAC address modified by this change. |
| |
| * On all STM32 (except F1x and F37x series), two new required properties have been |
| added to ADC to configure the source clock and the prescaler. |
| ``st,adc-clock-source`` allows choosing either synchronous or asynchronous clock source. |
| ``st,adc-prescaler`` allows setting the value of the prescaler for the chosen clock source. |
| Not all combinations are allowed. Refer to the appropriate RefMan for more information. |
| When choosing asynchronous clock, the choice of the kernel source clock is made in the |
| ``clocks`` node as it is done for other peripherals, for example, to select |
| HSI16 as clock source for STM32G0: |
| |
| .. code-block:: devicetree |
| |
| &adc { |
| clocks = <&rcc STM32_CLOCK_BUS_APB1_2 0x00100000>, |
| <&rcc STM32_SRC_HSI ADC_SEL(2)>; |
| }; |
| |
| * On NXP boards with LPC DMA, the DMA controller node used to have its ``dma-channels`` property |
| set in the board DTS as a way to configure the amount of structures the driver will allocate. |
| This did not match the zephyr dma-controller binding, so this property is now fixed and set |
| in the SOC devicetree definition. Downstream boards should not override this property and |
| instead use the new driver Kconfig |
| :kconfig:option:`CONFIG_DMA_MCUX_LPC_NUMBER_OF_CHANNELS_ALLOCATED`. |
| |
| * The LPC55XXX series SOC (except LPC55S06) default main clock has been |
| updated to PLL1 source from XTAL32K running at 144MHZ. If the new |
| kconfig option :kconfig:option:`CONFIG_INIT_PLL1` |
| is disabled then the main clock is muxed to FRO_HR as before. |
| |
| * The Kconfig option ``CONFIG_GPIO_NCT38XX_INTERRUPT`` has been renamed to |
| :kconfig:option:`CONFIG_GPIO_NCT38XX_ALERT`. |
| |
| * The CAN controller timing API functions :c:func:`can_set_timing` and :c:func:`can_set_timing_data` |
| no longer fallback to the (Re-)Synchronization Jump Width (SJW) value set in the devicetree |
| properties for the given CAN controller upon encountering an SJW value corresponding to |
| ``CAN_SJW_NO_CHANGE`` (which is no longer available). The caller will therefore need to fill in |
| the ``sjw`` field in :c:struct:`can_timing`. To aid in this, the :c:func:`can_calc_timing` and |
| :c:func:`can_calc_timing_data` functions now automatically calculate a suitable SJW. The |
| calculated SJW can be overwritten by the caller if needed. The CAN controller API functions |
| :c:func:`can_set_bitrate` and :c:func:`can_set_bitrate_data` now also automatically calculate a |
| suitable SJW, but their SJW cannot be overwritten by the caller. |
| |
| * The CAN ISO-TP message configuration in :c:struct:`isotp_msg_id` is changed to use the following |
| flags instead of bit fields: |
| |
| * :c:macro:`ISOTP_MSG_EXT_ADDR` to enable ISO-TP extended addressing |
| * :c:macro:`ISOTP_MSG_FIXED_ADDR` to enable ISO-TP fixed addressing |
| * :c:macro:`ISOTP_MSG_IDE` to use extended (29-bit) CAN IDs |
| |
| The two new flags :c:macro:`ISOTP_MSG_FDF` and :c:macro:`ISOTP_MSG_BRS` were added for CAN FD |
| mode. |
| |
| * NXP i.MX RT based boards should now enable |
| :kconfig:option:`CONFIG_DEVICE_CONFIGURATION_DATA` at the board level when |
| using a DCD with the RT bootrom, and enable |
| :kconfig:option:`CONFIG_NXP_IMX_EXTERNAL_SDRAM` when using external SDRAM |
| via the SEMC |
| |
| * NXP i.MX RT11xx series SNVS pin control name identifiers have been updated to |
| match with the source data for these SOCs. The pin names have had the |
| suffix ``dig`` added. For example, ``iomuxc_snvs_wakeup_gpio13_io00`` has |
| been renamed to ``iomuxc_snvs_wakeup_dig_gpio13_io00`` |
| |
| Power Management |
| ================ |
| |
| * Platforms that implement power management hooks must explicitly select |
| :kconfig:option:`CONFIG_HAS_PM` in Kconfig. This is now a dependency of |
| :kconfig:option:`CONFIG_PM`. Before this change all platforms could enable |
| :kconfig:option:`CONFIG_PM` because empty weak stubs were provided, however, |
| this is no longer supported. As a result of this change, power management |
| hooks are no longer defined as weaks. |
| |
| * Multiple platforms no longer support powering the system off using |
| :c:func:`pm_state_force`. The new :c:func:`sys_poweroff` API must be used. |
| Migrated platforms include Nordic nRF, STM32, ESP32 and TI CC13XX/26XX. The |
| new API is independent from :kconfig:option:`CONFIG_PM`. It requires |
| :kconfig:option:`CONFIG_POWEROFF` to be enabled, which depends on |
| :kconfig:option:`CONFIG_HAS_POWEROFF`, an option selected by platforms |
| implementing the required new hooks. |
| |
| Bootloader |
| ========== |
| |
| * The :kconfig:option:`CONFIG_BOOTLOADER_SRAM_SIZE` default value is now ``0`` (was |
| ``16``). Bootloaders that use a part of the SRAM should set this value to an |
| appropriate size. :github:`60371` |
| |
| Bluetooth |
| ========= |
| |
| * The ``accept()`` callback's signature in :c:struct:`bt_l2cap_server` has |
| changed to ``int (*accept)(struct bt_conn *conn, struct bt_l2cap_server |
| *server, struct bt_l2cap_chan **chan)``, |
| adding a new ``server`` parameter pointing to the :c:struct:`bt_l2cap_server` |
| structure instance the callback relates to. :github:`60536` |
| |
| Networking |
| ========== |
| |
| * A new networking Kconfig option :kconfig:option:`CONFIG_NET_INTERFACE_NAME` |
| defaults to ``y``. The option allows user to set a name to a network interface. |
| During system startup a default name is assigned to the network interface like |
| ``eth0`` to the first Ethernet network interface. The option affects the behavior |
| of ``SO_BINDTODEVICE`` BSD socket option. If the Kconfig option is set to ``n``, |
| which is how the system worked earlier, then the name of the device assigned |
| to the network interface is used by the ``SO_BINDTODEVICE`` socket option. |
| If the Kconfig option is set to ``y`` (current default), then the network |
| interface name is used by the ``SO_BINDTODEVICE`` socket option. |
| |
| * Ethernet PHY devicetree bindings were updated to use the standard ``reg`` |
| property for the PHY address instead of a custom ``address`` property. As a |
| result, MDIO controller nodes now require ``#address-cells`` and |
| ``#size-cells`` properties. Similarly, Ethernet PHY devicetree nodes and |
| corresponding driver were updated to consistently use the node name |
| ``ethernet-phy`` instead of ``phy``. Devicetrees and overlays must be updated |
| accordingly: |
| |
| .. code-block:: devicetree |
| |
| mdio { |
| compatible = "mdio-controller"; |
| #address-cells = <1>; |
| #size-cells = <0>; |
| |
| ethernet-phy@0 { |
| compatible = "ethernet-phy"; |
| reg = <0>; |
| }; |
| }; |
| |
| Other Subsystems |
| ================ |
| |
| * ZBus runtime observers implementation now relies on the HEAP memory instead of a memory slab. |
| Thus, zbus' configuration (kconfig) related to runtime observers has changed. To keep your runtime |
| observers code working correctly, you need to: |
| |
| - Replace the integer ``CONFIG_ZBUS_RUNTIME_OBSERVERS_POOL_SIZE`` with the boolean |
| :kconfig:option:`CONFIG_ZBUS_RUNTIME_OBSERVERS`; |
| - Set the HEAP size with the :kconfig:option:`CONFIG_HEAP_MEM_POOL_SIZE`. |
| |
| * The zbus VDED delivery sequence has changed. Check the :ref:`documentation<zbus delivery |
| sequence>` to verify if it will affect your code. |
| |
| * MCUmgr SMP version 2 error codes entry has changed due to a collision with an |
| existing response in shell_mgmt. Previously, these errors had the entry ``ret`` |
| but now have the entry ``err``. ``smp_add_cmd_ret()`` is now deprecated and |
| :c:func:`smp_add_cmd_err` should be used instead, ``MGMT_CB_ERROR_RET`` is |
| now deprecated and :c:enumerator:`MGMT_CB_ERROR_ERR` should be used instead. |
| SMP version 2 error code defines for in-tree modules have been updated to |
| replace the ``*_RET_RC_*`` parts with ``*_ERR_*``. |
| |
| * MCUmgr SMP version 2 error translation (to legacy MCUmgr error code) is now |
| handled in function handlers by setting the ``mg_translate_error`` function |
| pointer of :c:struct:`mgmt_group` when registering a group. See |
| :c:type:`smp_translate_error_fn` for function details. Any SMP version 2 |
| handlers made for Zephyr 3.4 need to be updated to include these translation |
| functions when the groups are registered. |
| |
| ARM |
| === |
| |
| * ARM SoC initialization routines no longer need to call `NMI_INIT()`. The |
| macro call has been removed as it was not doing anything useful. |
| |
| RISC V |
| ====== |
| |
| * The :kconfig:option:`CONFIG_RISCV_MTVEC_VECTORED_MODE` Kconfig option was renamed to |
| :kconfig:option:`CONFIG_RISCV_VECTORED_MODE`. |
| |
| Recommended Changes |
| ******************* |
| |
| * Setting the GIC architecture version by selecting |
| :kconfig:option:`CONFIG_GIC_V1`, :kconfig:option:`CONFIG_GIC_V2` and |
| :kconfig:option:`CONFIG_GIC_V3` directly in Kconfig has been deprecated. |
| The GIC version should now be specified by adding the appropriate compatible, for |
| example :dtcompatible:`arm,gic-v2`, to the GIC node in the device tree. |
| |
| * Nordic nRF based boards using :kconfig:option:`CONFIG_NFCT_PINS_AS_GPIOS` |
| to configure NFCT pins as GPIOs, should instead set the new UICR |
| ``nfct-pins-as-gpios`` property in devicetree. It can be set like this in the |
| board devicetree files: |
| |
| .. code-block:: devicetree |
| |
| &uicr { |
| nfct-pins-as-gpios; |
| }; |
| |
| * Nordic nRF based boards using :kconfig:option:`CONFIG_GPIO_AS_PINRESET` |
| to configure reset GPIO as nRESET, should instead set the new UICR |
| ``gpio-as-nreset`` property in devicetree. It can be set like this in the |
| board devicetree files: |
| |
| .. code-block:: devicetree |
| |
| &uicr { |
| gpio-as-nreset; |
| }; |
| |
| * The :kconfig:option:`CONFIG_MODEM_GSM_PPP` modem driver is obsolete. |
| Instead the new :kconfig:option:`CONFIG_MODEM_CELLULAR` driver should be used. |
| As part of this :kconfig:option:`CONFIG_GSM_MUX` and :kconfig:option:`CONFIG_UART_MUX` are being |
| marked as deprecated as well. The new modem subsystem :kconfig:option:`CONFIG_MODEM_CMUX` |
| and :kconfig:option:`CONFIG_MODEM_PPP` should be used instead. |
| |
| * Device drivers should now be restricted to ``PRE_KERNEL_1``, ``PRE_KERNEL_2`` |
| and ``POST_KERNEL`` initialization levels. Other device initialization levels, |
| including ``EARLY``, ``APPLICATION``, and ``SMP``, have been deprecated and |
| will be removed in future releases. Note that these changes do not apply to |
| initialization levels used in the context of the ``init.h`` API, |
| e.g. :c:macro:`SYS_INIT`. |
| |
| * The following CAN controller devicetree properties are now deprecated in favor specifying the |
| initial CAN bitrate using the ``bus-speed``, ``sample-point``, ``bus-speed-data``, and |
| ``sample-point-data`` properties: |
| |
| * ``sjw`` |
| * ``prop-seg`` |
| * ``phase-seg1`` |
| * ``phase-seg1`` |
| * ``sjw-data`` |
| * ``prop-seg-data`` |
| * ``phase-seg1-data`` |
| * ``phase-seg1-data`` |
| |
| * ``<zephyr/arch/arm/aarch32/cortex_a_r/cmsis.h>`` and |
| ``<zephyr/arch/arm/aarch32/cortex_m/cmsis.h>`` are now deprecated in favor of |
| including ``<cmsis_core.h>`` instead. The new header is part of the CMSIS glue |
| code in the ``modules`` directory. |
| |
| * Random API header ``<zephyr/random/rand32.h>`` is deprecated in favor of |
| ``<zephyr/random/random.h>``. The old header will be removed in future releases |
| and its usage should be avoided. |