Zephyr v3.7.0 迁移指南
本文档介绍将应用从 Zephyr v3.6.0 迁移到 Zephyr v3.7.0 所需的变更。
其他变更(与迁移应用不直接相关)请参见 版本说明。
构建系统
彻底重构了 SoC 和开发板的定义方式。这要求所有树外 SoC 和开发板都移植到新模型。更详细的信息请参见 迁移到当前硬件模型。(GitHub #69607)
以下构建时生成的头文件:
受影响的头文件
app_version.hautoconf.hcmake_intdef.hcore-isa-dM.hdevicetree_generated.hdriver-validation.hkobj-types-enum.hlinker-kobject-prebuilt-data.hlinker-kobject-prebuilt-priv-stacks.hlinker-kobject-prebuilt-rodata.hmcuboot_version.hoffsets.hotype-to-size.hotype-to-str.hstrerror_table.hstrsignal_table.hsyscall_list.hversion.hzsr.h以及系统调用头文件和源文件,现在都已纳入
zephyr/文件夹的命名空间。此变更基本上是自动完成的,脚本见 GitHub #63973。目前,兼容性 Kconfig(CONFIG_LEGACY_GENERATED_INCLUDE_PATH)默认启用,以便下游应用仍能编译,但在 CMake 配置期间会产生一条警告消息。该 Kconfig 将在未来弃用并最终移除,建议开发者尽快更新这些受影响头文件的包含路径。
内核
现在要求所有架构都定义新的
struct arch_esf,用于描述栈帧的成员。这个新结构体取代了具名结构体z_arch_esf_t。(GitHub #73593)具名结构体
z_arch_esf_t现已弃用。请改用struct arch_esf。(GitHub #73593)头文件 include/zephyr/arch/arch_interface.h 已从
include/zephyr/sys/移到include/zephyr/arch/。树外源文件需要更新包含路径。(GitHub #64987)
开发板
重新排列了 SparkFun Pro Micro RP2040 的
pro_micro连接器 gpio-map 中 D1 和 D0 的顺序,以与原始 Pro Micro 定义一致。树外扩展板必须更新以反映此变更。(GitHub #69994)ITE:重命名所有 SoC 变体 Kconfig 选项,例如
CONFIG_SOC_IT82202_AX重命名为CONFIG_SOC_IT82202AX。所有符号的重命名如下:SOC_IT81202BX、SOC_IT81202CX、SOC_IT81302BX、SOC_IT81302CX、SOC_IT82002AW、SOC_IT82202AX、SOC_IT82302AX。此外,将SOC_SERIES_ITE_IT8XXX2重命名为SOC_SERIES_IT8XXX2。(GitHub #71680)对于 native_sim/posix:当设置了
CONFIG_I2C时,CONFIG_EMUL不再默认启用。需要启用该设置的用户应在其项目配置文件中自行设置。(GitHub #73067)LiteX:将 LiteX VexRiscV 中断控制器节点的
compatible从vexriscv-intc0重命名为litex,vexriscv-intc0。(GitHub #73211)lairdconnect开发板现在改为ezurio开发板。Laird Connectivity 已更名为 Ezurio。
模块
Mbed TLS
TLS 1.2、RSA、AES、DES 以及除 SHA-256 之外的所有哈希算法(SHA-224、SHA-384、SHA-512、MD5 和 SHA-1)不再默认启用。现在需要显式启用各自的 Kconfig 选项才能使用它们。(GitHub #72078)
以前命名为
CONFIG_MBEDTLS_MAC_*_ENABLED的 Kconfig 选项已重命名,名称中的_MAC和_ENABLED部分已被去掉。(GitHub #73267)CONFIG_MBEDTLS_HASH_ALL_ENABLEDKconfig 选项已修复,现在会真正启用所有可用的哈希算法。以前它只启用 SHA-2 系列。(GitHub #73267)CONFIG_MBEDTLS_HASH_SHA*_ENABLEDKconfig 选项已被移除。它们与其他 Kconfig 选项重复,后者现在命名为CONFIG_MBEDTLS_SHA*。(GitHub #73267)CONFIG_MBEDTLS_MAC_ALL_ENABLEDKconfig 选项已被移除。其等效项是CONFIG_MBEDTLS_HASH_ALL_ENABLED与CONFIG_MBEDTLS_CMAC的组合。(GitHub #73267)Kconfig 选项
CONFIG_MBEDTLS_MAC_MD4_ENABLED、CONFIG_MBEDTLS_CIPHER_ARC4_ENABLED和CONFIG_MBEDTLS_CIPHER_BLOWFISH_ENABLED已被移除,因为 Mbed TLS 不再支持它们。(GitHub #73222)当系统中存在任何 PSA 加密提供者时(即设置了
CONFIG_MBEDTLS_PSA_CRYPTO_CLIENT),所需的 PSA 加密功能必须通过相应的CONFIG_PSA_WANT_*显式启用。(GitHub #72243)只要系统中存在任何 PSA 加密提供者(即设置了
CONFIG_MBEDTLS_PSA_CRYPTO_CLIENT),TLS/X509/PK/MD 模块就会使用 PSA 加密 API,而不再使用旧版 API。(GitHub #72243)
Trusted Firmware-M
默认的 MCUboot 签名类型已从 RSA-3072 改为 EC-P256。这会影响在 TF-M 中启用 MCUboot 的构建(
CONFIG_TFM_BL2)。如果你希望继续使用 RSA-3072,需要将CONFIG_TFM_MCUBOOT_SIGNATURE_TYPE设置为"RSA-3072"。否则,请确保拥有并使用该签名类型对应的签名密钥。
LVGL
CONFIG_LV_Z_POINTER_KSCAN已被移除,你需要将基于 kscan 的驱动转换为输入子系统,并改为在设备树中使用zephyr,lvgl-pointer-input。(GitHub #73800)
设备驱动与设备树
nxp,kinetis-pitpit 驱动的兼容属性已改为nxp,pit,并已更新为支持多个通道。要配置各个通道,必须添加一个兼容属性为nxp,pit-channel的子节点,并按下面所示进行配置。随着 pit 绑定的重命名,CONFIG_COUNTER_MCUX_PIT也已重命名为CONFIG_COUNTER_NXP_PIT。(GitHub #66336)示例如下:/ { 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"; }; };
nxp,kinetis-ethernet已弃用,取而代之的是nxp,enet。所有树内 SoC 都已改用这一新方案。因此,所有使用 NXP ENET 外设的开发板都需要在设备树中改为使用该绑定,同时也需要配套使用不同版本的驱动。或者,也可以删除以太网节点,并按旧绑定重新定义,以使用已弃用的旧版驱动。新绑定的主要优势是能够通过 MDIO API 抽象任意 PHY。(GitHub #70400)基本开发板级 ENET 设备树定义示例:&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"; }; };
nxp,kinetis-lptmr的兼容字符串已改为nxp,lptmr。旧字符串在短时间内仍可使用,但应尽早替换,因为它将在未来移除。一些驱动 API 结构体已重命名,以带上必需的
_driver_api后缀。(GitHub #72182)以下类型已重命名:emul_sensor_backend_api改为emul_sensor_driver_apiemul_bbram_backend_api改为emul_bbram_driver_apiusbc_ppc_drv改为usbc_ppc_driver_api
maxim,max31790的驱动已拆分为一个 MFD 和一个实际的 PWM 驱动。(GitHub #68433)以前,该器件的一个实例可以这样定义:max31790_max31790: max31790@20 { compatible = "maxim,max31790"; status = "okay"; reg = <0x20>; pwm-controller; #pwm-cells = <2>; };
可以转换为:
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>; }; };
invensense,icm42688的驱动现在能正确支持设备树配置(GitHub #74267)。以前的设备树可能尝试使用绑定来设置加速度计/陀螺仪的采样率和量程,但没有任何效果。现在使用设备树时应使用所提供的定义和包含文件,以及采用这些值的新绑定。例如:
#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>; };
st,lis2mdl的属性spi-full-duplex已改为duplex = SPI_FULL_DUPLEX。全双工现在是默认设置。nxp,lpc-lpadc驱动的设备树属性nxp,reference-supply已被移除,如果设备树中存在该属性,用户应将其删除。新增了 phandle-array 类型的设备树属性nxp,references,用户可以用该属性指定 lpadc 要使用的参考电压及其数值。(GitHub #75005)
microchip,ksz8081PHY 绑定的设备树属性mc,interface-type、mc,reset-gpio和mc,interrupt-gpio已分别改为microchip,interface-type、reset-gpios和int-gpios,参见 GitHub #73725
充电器
从
charger_max20335驱动中删除了constant-charge-current-max-microamp属性,因为它不能反映芯片的真实功能。(GitHub #69910)在
maxim,max20335-charger绑定中为constant-charge-voltage-max-microvolt属性添加了枚举键,以便在构建时指示无效的设备树值。(GitHub #69910)
控制器局域网(CAN)
移除了以下已弃用的 CAN 控制器设备树属性。使用这些属性的树外开发板可以改用
bitrate、sample-point、bitrate-data和sample-point-data设备树属性(或依赖CONFIG_CAN_DEFAULT_BITRATE和CONFIG_CAN_DEFAULT_BITRATE_DATA)来指定初始 CAN 位速率:sjwprop-segphase-seg1phase-seg2sjw-dataprop-seg-dataphase-seg1-dataphase-seg2-data
CAN 控制器的设备树属性
bus-speed和bus-speed-data已弃用。手动总线关闭恢复的支持已重构(GitHub #69460):
无论 Kconfig 选项如何,自动总线恢复都将在驱动初始化时启用。由于 CAN 控制器初始化时处于 “stopped” 状态,此时不会启动不必要的总线关闭恢复。
Kconfig
CONFIG_CAN_AUTO_BUS_OFF_RECOVERY已重命名(并取反)为CONFIG_CAN_MANUAL_RECOVERY_MODE,后者默认禁用。该 Kconfig 选项启用对can_recover()API 函数以及新的手动恢复模式的支持(参见下一条)。新增了 CAN 控制器运行模式
CAN_MODE_MANUAL_RECOVERY。仅当启用CONFIG_CAN_MANUAL_RECOVERY_MODE时才支持该模式。将其作为一种模式,使应用可以通过can_get_capabilities()API 函数查询 CAN 控制器是否支持手动恢复模式。随后应用可以选择让初始化失败,或者依赖自动总线关闭恢复。将其作为一种模式还可以让不支持手动恢复模式的 CAN 控制器驱动在应用启动期间的can_set_mode()中提前失败,而不是在稍后调用can_recover()时才失败。
加密
CSS 驱动在 NXP lpc55s36 上已弃用(GitHub #71173)。
显示
基于 GC9X01 的显示屏现在使用 MIPI DBI 驱动类。这些显示屏现在必须声明在 MIPI DBI 驱动包装设备中,由后者管理与显示屏的接口。(GitHub #73686)示例请见下文:
/* 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 的显示屏现在使用 MIPI DBI 驱动类。这些显示屏现在必须声明在 MIPI DBI 驱动包装设备中,由后者管理与显示屏的接口。请注意,随着此次更新,
cmd-data-gpios引脚极性已改变,以更好地与新名称dc-gpios保持一致。示例请见下文:/* 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 的显示屏现在使用 MIPI DBI 驱动类。这些显示屏现在必须声明在 MIPI DBI 驱动包装设备中,由后者管理与显示屏的接口。(GitHub #73812)请注意,随着此次更新,
dc-gpios引脚极性已改变,示例请见下文:/* 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 的显示屏现在使用 MIPI DBI 驱动类。这些显示屏现在必须声明在 MIPI DBI 驱动包装设备中,由后者管理与显示屏的接口。(GitHub #73750)请注意,随着此次更新,
cmd-data-gpios引脚极性已改变,以更好地与新名称dc-gpios保持一致。示例请见下文:/* 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 的显示屏现在使用 MIPI DBI 驱动类(GitHub #73946)。这些显示屏现在必须声明在 MIPI DBI 驱动包装设备中,由后者管理与显示屏的接口。请注意,随着此次更新,
dc-gpios引脚极性已改变。示例请见下文:/* 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>; ... }; };
SSD16XX 显示驱动中的
orientation-flipped属性已被移除,因为该驱动现在支持显示旋转。用户应从设备树中删除该属性,并在运行时通过display_set_orientation()设置方向(GitHub #73360)
增强型串行外设接口(eSPI)
宏
ESPI_SLAVE_TO_MASTER和ESPI_MASTER_TO_SLAVE已分别重命名为ESPI_TARGET_TO_CONTROLLER和ESPI_CONTROLLER_TO_TARGET,以反映 eSPI 1.5 规范中的新术语。枚举值ESPI_VWIRE_SIGNAL_SLV_BOOT_STS、ESPI_VWIRE_SIGNAL_SLV_BOOT_DONE以及所有ESPI_VWIRE_SIGNAL_SLV_GPIO_<NUMBER>信号已分别重命名为ESPI_VWIRE_SIGNAL_TARGET_BOOT_STS、ESPI_VWIRE_SIGNAL_TARGET_BOOT_DONE和ESPI_VWIRE_SIGNAL_TARGET_GPIO_<NUMBER>,以反映 eSPI 1.5 规范中的新术语。(GitHub #68492)KconfigCONFIG_ESPI_SLAVE已重命名为CONFIG_ESPI_TARGET,类似地CONFIG_ESPI_SAF已重命名为CONFIG_ESPI_TAF,参见 GitHub #73887
GNSS
gnss-nmea-generic驱动新增了基本的电源管理支持。如果CONFIG_PM_DEVICE=y,该驱动现在会以挂起模式初始化,应用需要调用pm_device_action_run()并传入PM_DEVICE_ACTION_RESUME来启动驱动。(GitHub #71774)
输入
analog-axis死区校准值已改为相对于原始 ADC 值,与最小值和最大值类似。数据结构与属性也已相应重命名(从out-deadzone改为in-deadzone),迁移到新定义时,该值应按比例缩放。(GitHub #70377)holtek,ht16k33-keyscan驱动已改为使用 输入 子系统,回调必须迁移为使用输入 API,zephyr,kscan-input可用于向后兼容。(GitHub #69875)
中断控制器
多级中断控制器查找表的静态自动生成已被弃用,只有在启用新的兼容性 Kconfig
CONFIG_LEGACY_MULTI_LEVEL_TABLE_GENERATION时才会编译,后者最终将在未来版本中移除。多级中断控制器驱动应更新为使用新建的
IRQ_PARENT_ENTRY_DEFINE宏,以便向新的多级中断架构注册自身。为便于使用该宏,新增了INTC_INST_ISR_TBL_OFFSET宏,用于推导给定驱动实例的软件 ISR 表偏移量;对于伪中断控制器子节点,请改用INTC_CHILD_ISR_TBL_OFFSET宏。此外还新增了设备树宏(DT_INTC_GET_AGGREGATOR_LEVEL和DT_INST_INTC_GET_AGGREGATOR_LEVEL),供中断控制器驱动实例将自己的聚合器层级传递给IRQ_PARENT_ENTRY_DEFINE宏。
LED 灯带
worldsemi,ws2812-gpio中定义的in-gpios属性已重命名为gpios。(GitHub #68514)chain-length和color-mapping属性已添加到所有 LED 灯带绑定中,并且现在是必需的。新增了必需的
length函数,用于返回 LED 灯带设备的长度(像素数量)。将
update_channels函数改为可选,并移除了未实现的函数。CONFIG_WS2812_STRIP_DRIVERKconfig 选项已被移除。以前,使用CONFIG_WS2812_STRIP_SPI、CONFIG_WS2812_STRIP_I2S、CONFIG_WS2812_STRIP_GPIO或CONFIG_WS2812_STRIP_RPI_PICO_PIO时必须通过CONFIG_WS2812_STRIP_DRIVER选择其中之一,但现在不再需要。请直接设置各个选项。
MDIO
CONFIG_MDIO_NXP_ENET_TIMEOUT现在的单位是微秒,而不再是毫秒。(GitHub #75625)
传感器
sensirion,shtcx传感器驱动的chip设备树属性已被移除。芯片变体现在通过匹配的 compatible 属性选择(GitHub #74033)。新的 shtc3 配置示例请见下文:&i2c0 { status = "okay"; shtc3: shtc3@70 { compatible = "sensirion,shtc3", "sensirion,shtcx"; reg = <0x70>; measure-mode = "normal"; clock-stretching; }; };
串行接口
Raspberry Pi UART 驱动
uart_rpi_pico已被移除。请改用uart_pl011驱动(arm,pl011)。(GitHub #71074)
稳压器
nxp,vref驱动不再支持地选择功能,因为该设置不应由用户修改。设备树属性nxp,ground-select已被移除,如果设备树中存在该属性,用户应将其删除。(GitHub #70642)
W1
zephyr,w1-gpio1-Wire 主机驱动不再默认启用 GPIO 引脚的内部上拉电阻。现在该配置取自设备树中指定的引脚配置标志。(GitHub #71789)
看门狗
nuvoton,npcx-watchdog驱动已更改,以延长最大超时时间。一次看门狗计数的时长会随不同的预分频设置而变化。移除了CONFIG_WDT_NPCX_DELAY_CYCLES,因为它不再适合用于设置前置警告时间。取而代之,新增了CONFIG_WDT_NPCX_WARNING_LEADING_TIME_MS,用于以毫秒为单位设置前置警告时间。
蓝牙
蓝牙 HCI
引入了新的 HCI 驱动 API(GitHub #72323),旧 API 已弃用。新 API 遵循 Zephyr 常规的驱动模型,使用设备树节点等。主机现在通过查找
zephyr,bt-hcichosen 属性来选择使用哪个驱动实例作为控制器。所有 HCI 驱动的设备树绑定都派生自通用的bt-hci.yaml基础绑定。
作为新 HCI 驱动 API 的一部分,不再使用
zephyr,bt-uartchosen 属性;UART HCI 驱动改为查找 HCI 驱动实例节点的父设备树节点来选择其 UART。作为新 HCI 驱动 API 的一部分,
zephyr,bt-hci-ipcchosen 属性仅用于控制器侧,而 HCI 驱动现在依赖兼容字符串为zephyr,bt-hci-ipc的节点。
BT_NO_DRIVERKconfig 选项已被移除。HCI 驱动不再置于 Kconfig choice 之下,现在可以独立启用和禁用,主要取决于各自设备树节点是否启用。
BT_HCI_VS_EXTKconfig 选项已被删除,该功能现已包含在CONFIG_BT_HCI_VSKconfig 选项中。
BT_HCI_VS_EVTKconfig 选项已被移除,因为只要启用CONFIG_BT_HCI_VS选项,厂商事件支持就是隐含的。bt_read_static_addr() API 已被移除。它严格来说并不是一个完全公开的 API,但由于它经由公开的 hci_driver.h 头文件暴露,因此在此提及这一移除。请改为启用
CONFIG_BT_HCI_VSKconfig 选项,并使用厂商特定的 HCI 命令 API 在可用时获取控制器的蓝牙静态地址。
蓝牙 Mesh
bt_mesh_model的模型元数据指针声明已更改,添加了const限定符。bt_mesh_models_metadata_entry的数据指针也加上了const限定符。模型的元数据结构体和元数据原始值可以声明为非易失性存储器中的永久常量。(GitHub #69679)bt_mesh_model的模型元数据指针声明已改为单个const *,并移除了bt_mesh_health_srv中多余的元数据指针。因此,BT_MESH_MODEL_HEALTH_SRV定义已改为使用可变参数表示法。现在,当你的实现支持CONFIG_BT_MESH_LARGE_COMP_DATA_SRV并且需要为 Health Server 模型指定元数据时,只需将元数据作为最后一个参数传给BT_MESH_MODEL_HEALTH_SRV宏;否则省略最后一个参数。(GitHub #71281)
蓝牙音频
启用
CONFIG_BT_BAP_UNICAST_SERVER时,CONFIG_BT_ASCS、CONFIG_BT_PERIPHERAL和CONFIG_BT_ISO_PERIPHERAL不再自动启用,现在必须在项目配置文件中显式设置。(GitHub #71993)CAP 的发现回调函数
bt_cap_initiator_cb.unicast_discovery_complete和bt_cap_commander_cb.discovery_complete现在多了一个用于集合成员的参数。所有已定义的 CAP 发现回调函数实例都需要添加该参数。(GitHub #72797)bt_bap_stream_start()不再连接 CIS。要连接 CIS,现在应在bt_bap_stream_start()之前调用bt_bap_stream_connect()。(GitHub #73032)将
stream_lang重命名为lang,以更好地与分配编号文档保持一致。这会影响BT_AUDIO_METADATA_TYPE_LANG宏以及以下函数:将
lang从uint32_t改为uint8_t [3]。这会修改以下函数:这样做的结果是,现在可以使用
"eng"和"deu"之类的字符串值来设置新值,并且可以避免获取值时不必要的数据拷贝。(GitHub #72584)所有
set_sirk的出现都已改为sirk,因为sirk中的s就代表 set。(GitHub #73413)为
bt_audio_codec_cfg_get_chan_allocation()添加了fallback_to_default参数。要保持现有行为,请将该参数设置为false。(GitHub #72090)为
bt_audio_codec_cap_get_supported_audio_chan_counts()添加了fallback_to_default参数。要保持现有行为,请将该参数设置为false。(GitHub #72090)为
bt_audio_codec_cap_get_max_codec_frames_per_sdu()添加了fallback_to_default参数。要保持现有行为,请将该参数设置为false。(GitHub #72090)为
bt_audio_codec_cfg_meta_get_pref_context()添加了fallback_to_default参数。要保持现有行为,请将该参数设置为false。(GitHub #72090)
经典蓝牙
Host BR/EDR 的源文件已移到
subsys/bluetooth/host/classic。Host BR/EDR 的头文件已移到include/zephyr/bluetooth/classic。移除了CONFIG_BT_BREDR,它已被新选项CONFIG_BT_CLASSIC取代。(GitHub #69651)
蓝牙主机
广播选项
BT_LE_ADV_OPT_USE_NAME和BT_LE_ADV_OPT_FORCE_NAME_IN_AD在此版本中已弃用。应用需要显式包含设备名称。一种做法是将以下内容添加到传给主机的广播数据或扫描响应数据中:BT_DATA(BT_DATA_NAME_COMPLETE, CONFIG_BT_DEVICE_NAME, sizeof(CONFIG_BT_DEVICE_NAME) - 1)
bt_l2cap_le_endpoint中的字段init_credits已被移除,因为它在 Zephyr 3.4.0 及更高版本中已不再使用。任何对该字段的引用都应删除。无需其他操作。BT_LE_ADV_PARAM现在返回const指针。任何将结果存储到局部变量的地方,例如struct bt_le_adv_param *param = BT_LE_ADV_CONN;,都需要改为const struct bt_le_adv_param *param = BT_LE_ADV_CONN;,或者像struct bt_le_adv_param param = *BT_LE_ADV_CONN;这样用于初始化对
BT_LE_ADV_PARAM的更改也影响其所有派生宏,包括但不限于:BT_LE_ADV_CONNBT_LE_EXT_ADV_CODED_NCONN_NAME
CONFIG_BT_BUF_ACL_RX_COUNT现在需要大于CONFIG_BT_MAX_CONN。由于 HCI 接口的设计,这一直是必需的。现在通过构建时断言强制执行。
蓝牙加密
新增了
CONFIG_BT_USE_PSA_API,用于显式请求加密操作使用 PSA API 而不是 TinyCrypt。当然,只有在系统中存在可用的 PSA 加密提供者(即设置了CONFIG_PSA_CRYPTO_CLIENT)时才能这样做。(GitHub #73378)
网络
弃用
CONFIG_NET_SOCKETS_POSIX_NAMES选项。这是一个旧选项,用于允许用户在未启用 POSIX API 的情况下调用 BSD 套接字 API。这可能会在构建希望启用CONFIG_POSIX_API选项的应用时带来复杂性。这意味着,如果应用想使用常规 BSD 套接字接口,就需要启用CONFIG_POSIX_API。如果应用不想或无法启用该选项,则套接字 API 调用需要以zsock_字符串为前缀。所有使用 BSD 套接字接口的示例应用都已改为启用CONFIG_POSIX_API。在网络协议栈内部,将不再启用 POSIX API 选项,这意味着各种使用套接字的网络库都已改为使用zsock_*API 调用。(GitHub #69950)zperf 的 zperf_results 结构体已更改,以支持 64 位的传输字节数(total_len)和测试时长(time_in_us 和 client_time_in_us),而不再是 32 位。这将使长时间的 zperf 测试显示正确的吞吐量结果。(GitHub #69500)
分配给网络接口的每个 IPv4 地址现在各自带有一个 IPv4 子网掩码,而不再为整个接口设置一个。如果网络接口只指定了一个 IPv4 地址,则从用户角度看没有任何变化。但如果存在多个 IPv4 地址/网络接口,则必须为每个 IPv4 地址单独指定子网掩码。(GitHub #68419)
虚拟网络接口 API 不再提供
input回调。input 回调过去用于读取 IP 隧道中的内部 IPv4/IPv6 报文。这种入向隧道读取现在改在recv回调中实现。(GitHub #70549)虚拟局域网(VLAN)的实现已改为使用虚拟网络接口。API 没有变化,但 VLAN 网络接口的类型已从
ETHERNET改为VIRTUAL。这可能需要改动为网络接口设置 VLAN 标签的代码。例如在net_eth_is_vlan_enabled()API 中,第 2 个接口参数必须指向主以太网接口,而不是 VLAN 接口。(GitHub #70345)将
wifi connect命令改为对参数使用键值格式。在此前的实现中,我们通过选项在参数字符串中的位置来识别它。这使得处理可选参数或扩展对其他选项的支持变得困难。采用键值格式后,更容易扩展可传给 connect 命令的选项。wifi -h会提供有关 connect 命令用法的更多信息。(GitHub #70024)Kconfig
CONFIG_NET_TCP_ACK_TIMEOUT已弃用。它的用途仅限于 TCP 握手,而在这种情况下,总超时应该取决于总重传超时(与其他情况一样),这使得该配置项既多余又容易混淆。请改用CONFIG_NET_TCP_INIT_RETRANSMISSION_TIMEOUT和CONFIG_NET_TCP_RETRY_COUNT来控制 TCP 层的总超时。(GitHub #70731)在 LwM2M API 中,回调类型
lwm2m_engine_set_data_cb_t现在多了一个offset参数。该参数用于指示 CoAP 块传输(Block-wise transfer)期间数据的偏移量。任何写入后、校验或固件相关的回调都应更新以包含该参数。(GitHub #72590)DNS 解析器以及 mDNS/LLMNR 应答器已改为使用套接字服务 API。这意味着系统中可轮询套接字数量可能需要增加。请检查
CONFIG_NET_SOCKETS_POLL_MAX和CONFIG_POSIX_MAX_FDS的值是否足够大。遗憾的是,无法给出这两个值的准确数值,因为这取决于应用的需求和使用情况。(GitHub #72834)socketAPI 调用中数据包套接字(类型AF_PACKET)的协议字段已更改。协议字段应使用网络字节序,以便与 Linux 套接字调用兼容。如果希望接收所有网络报文,Linux 期望协议字段为htons(ETH_P_ALL)。详情请参见 https://www.man7.org/linux/man-pages/man7/packet.7.html 文档。(GitHub #73338)TCP 现在使用 SHA-256 而不是 MD5 来生成 ISN。该哈希计算的加密支持也已从 Mbed TLS 改为 PSA API。实现方式是将
CONFIG_NET_TCP_ISN_RFC6528改为依赖PSA_WANT_ALG_SHA_256,而不再依赖旧的CONFIG_MBEDTLS_*特性。(GitHub #71827)
其他子系统
Flash 映射
flash 校验功能(
CONFIG_FLASH_AREA_CHECK_INTEGRITY_BACKEND)的加密后端以前由 TinyCrypt 或 Mbed TLS 提供,现在改为由 PSA 或 Mbed TLS 提供。更新后的 Mbed TLS 实现比先前的 TinyCrypt 实现占用略小,而 PSA 实现对于使用 TF-M 构建的设备能进一步减小占用。PSA 是受支持的未来方向,不过目前如果你无法承担启用 PSA API 的一次性开销(对于没有 TF-M 的设备是CONFIG_MBEDTLS_PSA_CRYPTO_C),仍然可以使用 Mbed TLS。GitHub #73511
hawkBit
CONFIG_HAWKBIT_PORT现在是 int 类型而不是字符串类型。使用 hawkBit 需要启用CONFIG_SETTINGS,因为它现在使用 settings 子系统来存储 hawkBit 配置。(GitHub #68806)
MCUmgr
对 SHA-256 的支持(在使用校验和/哈希函数时)以前由 TinyCrypt 或 Mbed TLS 提供,现在改为由 PSA 或 Mbed TLS 提供。PSA 是今后推荐的 API,不过,如果尚未启用它(
CONFIG_MBEDTLS_PSA_CRYPTO_CLIENT)并且你在代码大小上有严格限制,那么改用 Mbed TLS 也许可以节省 1.3 KB。
调制解调器
CONFIG_MODEM_CHAT_LOG_BUFFERKconfig 选项已重命名为CONFIG_MODEM_CHAT_LOG_BUFFER_SIZE。(GitHub #70405)
POSIX API
POSIX API Kconfig 弃用项 可能需要对 Kconfig 文件(
prj.conf等)进行更改,具体如版本说明中所述。也可以通过所提供的迁移脚本采用更自动化的方式。只需运行以下命令:$ python ${ZEPHYR_BASE}/scripts/utils/migrate_posix_kconfigs.py -r root_path
状态机框架
SMF_CREATE_STATE宏现在始终接受 5 个参数。参数数量现在与CONFIG_SMF_ANCESTOR_SUPPORT和CONFIG_SMF_INITIAL_TRANSITION的取值无关。如果不使用额外的参数,则必须将它们设置为NULL。(GitHub #71250)当转换源是
smf_run_state()所调用状态的父状态时,SMF 现在遵循更接近 UML 的转换流程。将执行从转换源到转换目标状态的最小公共祖先(LCA,不含该祖先)为止的所有退出动作,以及从 LCA(不含该 LCA)向下到目标状态的所有进入动作。(GitHub #71675)以前,使用设置为 NULL 的
new_state调用smf_set_state()会执行从当前状态到最顶层父状态的所有退出动作,并期望最顶层的退出动作会终止状态机。现在不允许传入NULL。请改为在最顶层创建一个“终止”状态,并在其进入动作中调用smf_set_terminate()。
UpdateHub
用于执行完整性检查的 SHA-256 实现不再通过
CONFIG_FLASH_AREA_CHECK_INTEGRITY_BACKEND选择。现在,所使用的实现(Mbed TLS 或 PSA)根据CONFIG_PSA_CRYPTO_CLIENT来选择。除非开发板使用 TF-M 构建或启用了CONFIG_MBEDTLS_PSA_CRYPTO_C,否则仍默认使用 Mbed TLS(占用比之前更小)。(GitHub #73511)
架构
函数
arch_start_cpu()已重命名为arch_cpu_start()。(GitHub #64987)CONFIG_ARM64_ENABLE_FRAME_POINTER已弃用。请改用CONFIG_FRAME_POINTER。(GitHub #72646)x86
Kconfig 选项
CONFIG_DISABLE_SSBD和CONFIG_ENABLE_EXTENDED_IBRS已弃用。请改用CONFIG_X86_DISABLE_SSBD和CONFIG_X86_ENABLE_EXTENDED_IBRS。(GitHub #69690)
POSIX 架构:
LLVM 模糊测试支持已重构。测试应用现在需要提供自己的
LLVMFuzzerTestOneInput()钩子,而不再依赖开发板提供的钩子。示例请参见samples/subsys/debug/fuzz/。(GitHub #71378)