From 8202d5f6434cb377d4deb186b3e94ebf964dfb33 Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Mon, 31 Mar 2025 12:27:51 +0200 Subject: [PATCH 01/10] boards: st: Add stm32wba65i-dk1 Add stm32wba65i-dk1 board support with UART console, LEDs, joystick keys using ADC channel 6. Board YAML file does not list 'supported' tags since the board is very similar to nucleo_wba65ri for which supported features are already covered. Signed-off-by: Etienne Carriere --- boards/st/stm32wba65i_dk1/Kconfig.defconfig | 13 + .../stm32wba65i_dk1/Kconfig.stm32wba65i_dk1 | 5 + .../stm32wba65i_dk1/arduino_r3_connector.dtsi | 41 ++++ boards/st/stm32wba65i_dk1/board.cmake | 7 + boards/st/stm32wba65i_dk1/board.yml | 6 + .../doc/img/stm32wba65i-dk1.webp | Bin 0 -> 40424 bytes boards/st/stm32wba65i_dk1/doc/index.rst | 232 ++++++++++++++++++ boards/st/stm32wba65i_dk1/stm32wba65i_dk1.dts | 187 ++++++++++++++ .../st/stm32wba65i_dk1/stm32wba65i_dk1.yaml | 10 + .../stm32wba65i_dk1/stm32wba65i_dk1_defconfig | 24 ++ boards/st/stm32wba65i_dk1/support/openocd.cfg | 26 ++ 11 files changed, 551 insertions(+) create mode 100644 boards/st/stm32wba65i_dk1/Kconfig.defconfig create mode 100644 boards/st/stm32wba65i_dk1/Kconfig.stm32wba65i_dk1 create mode 100644 boards/st/stm32wba65i_dk1/arduino_r3_connector.dtsi create mode 100644 boards/st/stm32wba65i_dk1/board.cmake create mode 100644 boards/st/stm32wba65i_dk1/board.yml create mode 100644 boards/st/stm32wba65i_dk1/doc/img/stm32wba65i-dk1.webp create mode 100644 boards/st/stm32wba65i_dk1/doc/index.rst create mode 100644 boards/st/stm32wba65i_dk1/stm32wba65i_dk1.dts create mode 100644 boards/st/stm32wba65i_dk1/stm32wba65i_dk1.yaml create mode 100644 boards/st/stm32wba65i_dk1/stm32wba65i_dk1_defconfig create mode 100644 boards/st/stm32wba65i_dk1/support/openocd.cfg diff --git a/boards/st/stm32wba65i_dk1/Kconfig.defconfig b/boards/st/stm32wba65i_dk1/Kconfig.defconfig new file mode 100644 index 0000000000000..620565526e58c --- /dev/null +++ b/boards/st/stm32wba65i_dk1/Kconfig.defconfig @@ -0,0 +1,13 @@ +# STM32WBA65I Discovery kit board configuration + +# Copyright (c) 2025 STMicroelectronics + +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_STM32WBA65I_DK1 + +config SPI_STM32_INTERRUPT + default y + depends on SPI + +endif # BOARD_STM32WBA65I_DK1 diff --git a/boards/st/stm32wba65i_dk1/Kconfig.stm32wba65i_dk1 b/boards/st/stm32wba65i_dk1/Kconfig.stm32wba65i_dk1 new file mode 100644 index 0000000000000..9fcfc52471d83 --- /dev/null +++ b/boards/st/stm32wba65i_dk1/Kconfig.stm32wba65i_dk1 @@ -0,0 +1,5 @@ +# Copyright (c) 2025 STMicroelectronics +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_STM32WBA65I_DK1 + select SOC_STM32WBA65XX diff --git a/boards/st/stm32wba65i_dk1/arduino_r3_connector.dtsi b/boards/st/stm32wba65i_dk1/arduino_r3_connector.dtsi new file mode 100644 index 0000000000000..999cb7600ea3c --- /dev/null +++ b/boards/st/stm32wba65i_dk1/arduino_r3_connector.dtsi @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2025 STMicroelectronics + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +/ { + arduino_header: connector { + compatible = "arduino-header-r3"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map = , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + }; +}; + +arduino_i2c: &i2c1 {}; +arduino_spi: &spi1 {}; diff --git a/boards/st/stm32wba65i_dk1/board.cmake b/boards/st/stm32wba65i_dk1/board.cmake new file mode 100644 index 0000000000000..45abc466464fe --- /dev/null +++ b/boards/st/stm32wba65i_dk1/board.cmake @@ -0,0 +1,7 @@ +# Copyright (c) 2025 STMicroelectronics +# SPDX-License-Identifier: Apache-2.0 + +board_runner_args(stm32cubeprogrammer "--port=swd" "--reset-mode=hw") + +include(${ZEPHYR_BASE}/boards/common/stm32cubeprogrammer.board.cmake) +include(${ZEPHYR_BASE}/boards/common/openocd-stm32.board.cmake) diff --git a/boards/st/stm32wba65i_dk1/board.yml b/boards/st/stm32wba65i_dk1/board.yml new file mode 100644 index 0000000000000..521ca2c3169e2 --- /dev/null +++ b/boards/st/stm32wba65i_dk1/board.yml @@ -0,0 +1,6 @@ +board: + name: stm32wba65i_dk1 + full_name: STM32WBA65I Discovery kit + vendor: st + socs: + - name: stm32wba65xx diff --git a/boards/st/stm32wba65i_dk1/doc/img/stm32wba65i-dk1.webp b/boards/st/stm32wba65i_dk1/doc/img/stm32wba65i-dk1.webp new file mode 100644 index 0000000000000000000000000000000000000000..4cae2e31f470880f264e98b0d351cffeff87aa20 GIT binary patch literal 40424 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 is required. + +Flashing an application to a STM32WBA65I-DK1 +-------------------------------------------- + +Here is an example for the :zephyr:code-sample:`blinky` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: stm32wba65i_dk1 + :goals: build flash + +You will see the LED blinking every second. + +Debugging +========= + +Debugging using OpenOCD +----------------------- + +You can debug an application in the usual way using OpenOCD. Here is an example for the +:zephyr:code-sample:`blinky` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: stm32wba65i_dk1 + :maybe-skip-config: + :goals: debug + +.. _STM32WBA Series on www.st.com: + https://www.st.com/en/microcontrollers-microprocessors/stm32wba-series.html + +.. _STM32CubeProgrammer: + https://www.st.com/en/development-tools/stm32cubeprog.html diff --git a/boards/st/stm32wba65i_dk1/stm32wba65i_dk1.dts b/boards/st/stm32wba65i_dk1/stm32wba65i_dk1.dts new file mode 100644 index 0000000000000..48e70a3e121eb --- /dev/null +++ b/boards/st/stm32wba65i_dk1/stm32wba65i_dk1.dts @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2025 STMicroelectronics + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include +#include +#include "arduino_r3_connector.dtsi" +#include + +/ { + model = "STMicroelectronics STM32WBA65I Discovery kit board"; + compatible = "st,stm32wba65i-dk1"; + + #address-cells = <1>; + #size-cells = <1>; + + chosen { + zephyr,bt-c2h-uart = &usart1; + zephyr,console = &usart1; + zephyr,shell-uart = &usart1; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + }; + + leds: leds { + compatible = "gpio-leds"; + + green_led_1: led_0 { + gpios = <&gpiod 8 GPIO_ACTIVE_LOW>; + label = "User LD6"; + }; + + red_led_2: led_1 { + gpios = <&gpiod 9 GPIO_ACTIVE_LOW>; + label = "User LD5"; + }; + + blue_led_3: led_2 { + /* Not functional w/o a 0Ohm resistor on MB2143 R42 */ + gpios = <&gpiob 10 GPIO_ACTIVE_LOW>; + label = "User LD3"; + }; + }; + + adc-keys { + compatible = "adc-keys"; + io-channels = <&adc4 6>; + keyup-threshold-mv = <3300>; + + select_key { + press-thresholds-mv = <0>; + zephyr,code = ; + }; + + left_key { + press-thresholds-mv = <670>; + zephyr,code = ; + }; + + down_key { + press-thresholds-mv = <1320>; + zephyr,code = ; + }; + + up_key { + press-thresholds-mv = <2010>; + zephyr,code = ; + }; + + right_key { + press-thresholds-mv = <2650>; + zephyr,code = ; + }; + }; + + aliases { + led0 = &green_led_1; + led1 = &red_led_2; + }; +}; + +&clk_lsi { + status = "okay"; +}; + +&clk_lse { + status = "okay"; +}; + +&clk_hse { + hse-div2; + status = "okay"; +}; + +&clk_hsi { + status = "okay"; +}; + +&rcc { + clocks = <&clk_hse>; + clock-frequency = ; + ahb-prescaler = <1>; + ahb5-prescaler = <2>; + apb1-prescaler = <1>; + apb2-prescaler = <2>; + apb7-prescaler = <1>; +}; + +&iwdg { + status = "okay"; +}; + +&rtc { + status = "okay"; + clocks = <&rcc STM32_CLOCK(APB7, 21)>, + <&rcc STM32_SRC_LSE RTC_SEL(1)>; + prescaler = <32768>; +}; + +&usart1 { + clocks = <&rcc STM32_CLOCK(APB2, 14)>, + <&rcc STM32_SRC_HSI16 USART1_SEL(2)>; + pinctrl-0 = <&usart1_tx_pb12 &usart1_rx_pa8>; + pinctrl-1 = <&analog_pb12 &analog_pa8>; + pinctrl-names = "default", "sleep"; + current-speed = <115200>; + status = "okay"; +}; + +&spi1 { + pinctrl-0 = <&spi1_nss_pa12 &spi1_sck_pb4 + &spi1_miso_pb3 &spi1_mosi_pa15>; + pinctrl-names = "default"; + status = "okay"; +}; + +&i2c1 { + pinctrl-0 = <&i2c1_scl_pb2 &i2c1_sda_pb1>; + pinctrl-names = "default"; + status = "okay"; + clock-frequency = ; +}; + +&adc4 { + pinctrl-0 = <&adc4_in6_pa3>; + pinctrl-names = "default"; + st,adc-clock-source = "ASYNC"; + st,adc-prescaler = <4>; + status = "okay"; + #address-cells = <1>; + #size-cells = <0>; + + channel@6 { + reg = <0x6>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + zephyr,vref-mv = <3300>; + }; +}; + +stm32_lp_tick_source: &lptim1 { + clocks = <&rcc STM32_CLOCK(APB7, 11)>, + <&rcc STM32_SRC_LSE LPTIM1_SEL(3)>; + status = "okay"; +}; + +&rng { + status = "okay"; +}; + +&flash0 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + storage_partition: partition@1c0000 { + label = "storage"; + reg = <0x001c0000 DT_SIZE_K(256)>; + }; + }; +}; diff --git a/boards/st/stm32wba65i_dk1/stm32wba65i_dk1.yaml b/boards/st/stm32wba65i_dk1/stm32wba65i_dk1.yaml new file mode 100644 index 0000000000000..b77e57240f1a9 --- /dev/null +++ b/boards/st/stm32wba65i_dk1/stm32wba65i_dk1.yaml @@ -0,0 +1,10 @@ +identifier: stm32wba65i_dk1/stm32wba65xx +name: ST STM32WBA65I Discovery kit +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb +ram: 512 +flash: 2048 +vendor: st diff --git a/boards/st/stm32wba65i_dk1/stm32wba65i_dk1_defconfig b/boards/st/stm32wba65i_dk1/stm32wba65i_dk1_defconfig new file mode 100644 index 0000000000000..5e650e6826cb7 --- /dev/null +++ b/boards/st/stm32wba65i_dk1/stm32wba65i_dk1_defconfig @@ -0,0 +1,24 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2025 STMicroelectronics + +# Enable UART driver +CONFIG_SERIAL=y + +# Enable GPIO +CONFIG_GPIO=y + +# Console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable HW stack protection +CONFIG_HW_STACK_PROTECTION=y + +# Enable the internal SMPS regulator +CONFIG_POWER_SUPPLY_DIRECT_SMPS=y + +# Enable ADC for joystick +CONFIG_ADC=y diff --git a/boards/st/stm32wba65i_dk1/support/openocd.cfg b/boards/st/stm32wba65i_dk1/support/openocd.cfg new file mode 100644 index 0000000000000..0745453a16a5c --- /dev/null +++ b/boards/st/stm32wba65i_dk1/support/openocd.cfg @@ -0,0 +1,26 @@ +# Note: Using OpenOCD using stm32wba65i_dk1 requires using openocd fork. +# See board documentation for more information + +source [find interface/stlink-dap.cfg] + +set WORKAREASIZE 0x8000 + +transport select "dapdirect_swd" + +# Enable debug when in low power modes +set ENABLE_LOW_POWER 1 + +# Stop Watchdog counters when halt +set STOP_WATCHDOG 1 + +# STlink Debug clock frequency +set CLOCK_FREQ 8000 + +# Reset configuration +# use hardware reset, connect under reset +# connect_assert_srst needed if low power mode application running (WFI...) +reset_config srst_only srst_nogate + +source [find target/stm32wbax.cfg] + +gdb_memory_map disable From e3ac17296bbdc9a8ea8964fa38d5d1c7ce572d3c Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Fri, 16 May 2025 09:33:16 +0200 Subject: [PATCH 02/10] modules: trusted-firmware-m: Declare stm32wba65i support Declare stm32wba65i-dk1 and nucleo_wba65ri boards support in TF-M. Both comply with TF-M integration of platform stm/stm32wba65i-dk. Signed-off-by: Etienne Carriere --- modules/trusted-firmware-m/Kconfig.tfm | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/trusted-firmware-m/Kconfig.tfm b/modules/trusted-firmware-m/Kconfig.tfm index 55e08ee45e4a9..0b7c6c5f22607 100644 --- a/modules/trusted-firmware-m/Kconfig.tfm +++ b/modules/trusted-firmware-m/Kconfig.tfm @@ -20,6 +20,7 @@ config TFM_BOARD default "stm/b_u585i_iot02a" if BOARD_B_U585I_IOT02A default "stm/nucleo_l552ze_q" if BOARD_NUCLEO_L552ZE_Q default "stm/stm32l562e_dk" if BOARD_STM32L562E_DK + default "stm/stm32wba65i_dk" if BOARD_NUCLEO_WBA65RI || BOARD_STM32WBA65I_DK1 default "arm/musca_b1" if BOARD_V2M_MUSCA_B1 default "arm/musca_s1" if BOARD_V2M_MUSCA_S1 default "adi/max32657" if BOARD_MAX32657EVKIT_MAX32657_NS From 1205f1d422880652404c3252377fcb3de0622c0e Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Fri, 18 Apr 2025 08:56:21 +0200 Subject: [PATCH 03/10] modules: trusted-firmware-m: Add STM32_FLASH_LAYOUT_BEGIN_OFFSET Add TF-M directive STM32_FLASH_LAYOUT_BEGIN_OFFSET needed to specify the gap needed by external boot stage resources at flash beginning. The offset tells STM32 TF-M firmware the base offset in the flash where the several TF-M and non-secure image areas shall be located. The CMake directive was introduced mainline TF-M commit [1] and merged in Zephyr TF-M repository [2]. Link: https://github.com/TrustedFirmware-M/trusted-firmware-m/commit/fc035b874e0ab86e2a13a328da3dce0cf18eb566 [1] Link: https://github.com/zephyrproject-rtos/trusted-firmware-m/commit/954dc805411be8fedac4ed7ddfefe966ffb35576 [2] Signed-off-by: Etienne Carriere --- modules/trusted-firmware-m/CMakeLists.txt | 6 ++++++ modules/trusted-firmware-m/Kconfig.tfm | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/modules/trusted-firmware-m/CMakeLists.txt b/modules/trusted-firmware-m/CMakeLists.txt index 5e066130b2627..59337875e9c67 100644 --- a/modules/trusted-firmware-m/CMakeLists.txt +++ b/modules/trusted-firmware-m/CMakeLists.txt @@ -281,6 +281,12 @@ if (CONFIG_BUILD_WITH_TFM) list(APPEND TFM_CMAKE_ARGS -DETHOS_DRIVER_PATH=${CONFIG_TFM_ETHOS_DRIVER_PATH_LOCAL}) endif() + if(CONFIG_TFM_STM32_FLASH_LAYOUT_BEGIN_OFFSET) + list(APPEND TFM_CMAKE_ARGS + -DSTM32_FLASH_LAYOUT_BEGIN_OFFSET=${CONFIG_TFM_STM32_FLASH_LAYOUT_BEGIN_OFFSET} + ) + endif() + file(MAKE_DIRECTORY ${TFM_BINARY_DIR}) add_custom_target(tfm_cmake DEPENDS ${TFM_BINARY_DIR}/CMakeCache.txt diff --git a/modules/trusted-firmware-m/Kconfig.tfm b/modules/trusted-firmware-m/Kconfig.tfm index 0b7c6c5f22607..afb736b1eb42c 100644 --- a/modules/trusted-firmware-m/Kconfig.tfm +++ b/modules/trusted-firmware-m/Kconfig.tfm @@ -516,4 +516,14 @@ config TFM_EXCEPTION_INFO_DUMP On fatal errors in the secure firmware, capture info about the exception. Print the info if the SPM log level is sufficient. +config TFM_STM32_FLASH_LAYOUT_BEGIN_OFFSET + int "Offset gap at beginning of flash layout" + depends on SOC_FAMILY_STM32 + default 0 + help + Set an offset at the beginning of the STM32 platform flash + layout above which TF-M resources location start. The platform uses + this gap for platform specific reason, as for example when a + bootloader that is external to TF-M is used. + endif # BUILD_WITH_TFM From a04c05de567fe3f6ce15dbb00251d01234186fec Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Fri, 26 Sep 2025 14:37:02 +0200 Subject: [PATCH 04/10] soc: st: stm32wba: TF-M does not support BL2 for WBA65x Enable TFM_BL2_NOT_SUPPORTED configuration for STM32WBA65x SoC since TF-M does not implement the BL2 boot stage for this SoC series. Signed-off-by: Etienne Carriere --- soc/st/stm32/stm32wbax/Kconfig.defconfig.stm32wba65xx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/soc/st/stm32/stm32wbax/Kconfig.defconfig.stm32wba65xx b/soc/st/stm32/stm32wbax/Kconfig.defconfig.stm32wba65xx index bd811b035ef8b..2a7138597d1bd 100644 --- a/soc/st/stm32/stm32wbax/Kconfig.defconfig.stm32wba65xx +++ b/soc/st/stm32/stm32wbax/Kconfig.defconfig.stm32wba65xx @@ -8,4 +8,8 @@ if SOC_STM32WBA65XX config NUM_IRQS default 82 +# BL2 implementation not available yet +config TFM_BL2_NOT_SUPPORTED + default y + endif # SOC_STM32WBA65XX From b83ecceb4cab5d01fe024609f2bff1d5b172b4c6 Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Fri, 9 May 2025 12:22:04 +0200 Subject: [PATCH 05/10] boards: st: stm32wba65i_dk1: Add 'ns' variant for TF-M support Add variant ns to stm32wba65i_dk1 board to embed TF-M in the SoC secure world. The flash layout is synced with the layout defined in Zephyr TF-M integration of platform STM32WBA65I. Successfully tested against a few samples and test samples: - samples/tfm_integration/psa_crypto - samples/tfm_integration/psa_protected_storage - samples/tfm_integration/tfm_ipc - samples/tfm_integration/tfm_regression_test - samples/tfm_integration/tfm_secure_partition - tests/subsys/secure_storage/psa/crypto - tests/subsys/secure_storage/psa/its (with CONFIG_TFM_ITS_MAX_ASSET_SIZE_OVERRIDE=y and CONFIG_TFM_ITS_MAX_ASSET_SIZE=256) Support for PSA Arch Tests (samples/tfm_integration/tfm_psa_test) is not yet merged but is in under review [1]. Link: https://github.com/ARM-software/psa-arch-tests/pull/406 [1] Signed-off-by: Etienne Carriere --- boards/st/stm32wba65i_dk1/board.cmake | 24 ++++++++- boards/st/stm32wba65i_dk1/board.yml | 2 + boards/st/stm32wba65i_dk1/doc/index.rst | 45 ++++++++++++++++ .../stm32wba65i_dk1_stm32wba65xx_ns.dts | 52 +++++++++++++++++++ .../stm32wba65i_dk1_stm32wba65xx_ns.yaml | 10 ++++ .../stm32wba65i_dk1_stm32wba65xx_ns_defconfig | 31 +++++++++++ 6 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 boards/st/stm32wba65i_dk1/stm32wba65i_dk1_stm32wba65xx_ns.dts create mode 100644 boards/st/stm32wba65i_dk1/stm32wba65i_dk1_stm32wba65xx_ns.yaml create mode 100644 boards/st/stm32wba65i_dk1/stm32wba65i_dk1_stm32wba65xx_ns_defconfig diff --git a/boards/st/stm32wba65i_dk1/board.cmake b/boards/st/stm32wba65i_dk1/board.cmake index 45abc466464fe..755a55bae8dcf 100644 --- a/boards/st/stm32wba65i_dk1/board.cmake +++ b/boards/st/stm32wba65i_dk1/board.cmake @@ -1,7 +1,29 @@ # Copyright (c) 2025 STMicroelectronics # SPDX-License-Identifier: Apache-2.0 -board_runner_args(stm32cubeprogrammer "--port=swd" "--reset-mode=hw") +if(CONFIG_BUILD_WITH_TFM) + set(FLASH_BASE_ADDRESS_S 0x0C000000) + + # Flash merged TF-M + Zephyr binary + set_property(TARGET runners_yaml_props_target PROPERTY hex_file tfm_merged.hex) + + if(CONFIG_HAS_FLASH_LOAD_OFFSET) + MATH(EXPR TFM_HEX_BASE_ADDRESS_NS "${FLASH_BASE_ADDRESS_S}+${CONFIG_FLASH_LOAD_OFFSET}") + else() + set(TFM_HEX_BASE_ADDRESS_NS ${TFM_FLASH_BASE_ADDRESS_S}) + endif() + + # System entry point is TF-M vector, located 1kByte after tfm_fmw_partition in DTS + dt_nodelabel(tfm_partition_path NODELABEL slot0_secure_partition REQUIRED) + dt_reg_addr(tfm_partition_offset PATH ${tfm_partition_path} REQUIRED) + math(EXPR tfm_fwm_boot_address "${tfm_partition_offset}+${FLASH_BASE_ADDRESS_S}+0x400") + + board_runner_args(stm32cubeprogrammer "--port=swd" "--reset-mode=hw" + "--erase" "--start-address=${tfm_fwm_boot_address}" + ) +else() + board_runner_args(stm32cubeprogrammer "--port=swd" "--reset-mode=hw") +endif() include(${ZEPHYR_BASE}/boards/common/stm32cubeprogrammer.board.cmake) include(${ZEPHYR_BASE}/boards/common/openocd-stm32.board.cmake) diff --git a/boards/st/stm32wba65i_dk1/board.yml b/boards/st/stm32wba65i_dk1/board.yml index 521ca2c3169e2..cb9044a106327 100644 --- a/boards/st/stm32wba65i_dk1/board.yml +++ b/boards/st/stm32wba65i_dk1/board.yml @@ -4,3 +4,5 @@ board: vendor: st socs: - name: stm32wba65xx + variants: + - name: ns diff --git a/boards/st/stm32wba65i_dk1/doc/index.rst b/boards/st/stm32wba65i_dk1/doc/index.rst index fab127b663186..3e8463798d210 100644 --- a/boards/st/stm32wba65i_dk1/doc/index.rst +++ b/boards/st/stm32wba65i_dk1/doc/index.rst @@ -151,6 +151,48 @@ Supported Features .. zephyr:board-supported-hw:: +Zephyr board options +==================== + +Zephyr supports building both Secure and Non-Secure firmware for +STM32WBA65I-DK1 board where TF-M is the embedded Secure firmware +and Zephyr the Non-Secure firmware. + +The BOARD options are summarized below: + ++---------------------------------+------------------------------------------+ +| BOARD | Description | ++=================================+==========================================+ +| stm32wba65i_dk1 | For building TrustZone Disabled firmware | ++---------------------------------+------------------------------------------+ +| stm32wba65i_dk1/stm32wba65xx/ns | For building Non-Secure firmware | ++---------------------------------+------------------------------------------+ + +Here are the instructions to build Zephyr with a non-secure configuration, +using :zephyr:code-sample:`tfm_ipc` sample: + +.. zephyr-app-commands:: + :zephyr-app: samples/tfm_integration/tfm_ipc + :board: stm32wba65i_dk1/stm32wba65xx/ns + :goals: build + +Once done, before flashing, you need to first run a generated script that +will set platform Option Bytes config and erase internal flash (among others, +Option Bit TZEN will be set). + +.. code-block:: bash + + $ ./build/tfm/api_ns/regression.sh + $ west flash + +Please note that, after having programmed the board for a TrustZone enabled system +(e.g. with ``./build/tfm/api_ns/regression.sh``), the SoC TZEN Option Byte is enabled +and you will need to operate specific sequence to disable this TZEN Option Byte +configuration to get your board back in normal state for booting with a TrustZone +disabled system (e.g. without TF-M support). +You can use STM32CubeProgrammer_ to disable the SoC TZEN Option Byte config. Refer +to `How to disable STM32WBA65 TZEN Option Byte`_. + Connections and IOs =================== @@ -230,3 +272,6 @@ You can debug an application in the usual way using OpenOCD. Here is an example .. _STM32CubeProgrammer: https://www.st.com/en/development-tools/stm32cubeprog.html + +.. _How to disable STM32WBA65 TZEN Option Byte: + https://wiki.st.com/stm32mcu/wiki/Connectivity:STM32WBA_BLE_%26_TrustZone#How_to_disable_the_TrustZone diff --git a/boards/st/stm32wba65i_dk1/stm32wba65i_dk1_stm32wba65xx_ns.dts b/boards/st/stm32wba65i_dk1/stm32wba65i_dk1_stm32wba65xx_ns.dts new file mode 100644 index 0000000000000..6545194a0eca8 --- /dev/null +++ b/boards/st/stm32wba65i_dk1/stm32wba65i_dk1_stm32wba65xx_ns.dts @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2025 STMicroelectronics + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include "stm32wba65i_dk1.dts" + +/ { + chosen { + zephyr,code-partition = &slot0_ns_partition; + }; + + /* SRAM1 (node label sram0) last 64kByte are owned by TF-M */ + sram0: memory@20000000 { + reg = <0x20000000 DT_SIZE_K(448 - 64)>; + }; + + /* SRAM2 (node label sram1) is owned by TF-M */ + /delete-node/ memory@20070000; +}; + +&flash0 { + /delete-node/ partitions; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + boot_partition: partition@0 { + label = "bootstage"; + reg = <0 DT_SIZE_K(48)>; + }; + + slot0_secure_partition: partition@c000 { + label = "image-secure"; + reg = <0xc000 DT_SIZE_K(256)>; + }; + + slot0_ns_partition: partition@4c000 { + label = "image-non-secure"; + reg = <0x4c000 DT_SIZE_K(512)>; + }; + + storage_partition: partition@cc000 { + label = "storage"; + reg = <0xcc000 (DT_SIZE_M(2) - DT_SIZE_K(48 + 256 + 512))>; + }; + }; +}; diff --git a/boards/st/stm32wba65i_dk1/stm32wba65i_dk1_stm32wba65xx_ns.yaml b/boards/st/stm32wba65i_dk1/stm32wba65i_dk1_stm32wba65xx_ns.yaml new file mode 100644 index 0000000000000..1261a46cff17f --- /dev/null +++ b/boards/st/stm32wba65i_dk1/stm32wba65i_dk1_stm32wba65xx_ns.yaml @@ -0,0 +1,10 @@ +identifier: stm32wba65i_dk1/stm32wba65xx/ns +name: ST STM32WBA65I Discovery kit with TF-M and non-secure firmware +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb +ram: 384 +flash: 512 +vendor: st diff --git a/boards/st/stm32wba65i_dk1/stm32wba65i_dk1_stm32wba65xx_ns_defconfig b/boards/st/stm32wba65i_dk1/stm32wba65i_dk1_stm32wba65xx_ns_defconfig new file mode 100644 index 0000000000000..95855969dc9bb --- /dev/null +++ b/boards/st/stm32wba65i_dk1/stm32wba65i_dk1_stm32wba65xx_ns_defconfig @@ -0,0 +1,31 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2025 STMicroelectronics + +# Enable UART driver +CONFIG_SERIAL=y + +# Enable GPIO +CONFIG_GPIO=y + +# Console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable HW stack protection +CONFIG_HW_STACK_PROTECTION=y + +# Enable the internal SMPS regulator +CONFIG_POWER_SUPPLY_DIRECT_SMPS=y + +# Enable ADC for joystick +CONFIG_ADC=y + +# Header offset since TF-M has no BL2 hence Zephyr is not signed +CONFIG_ROM_START_OFFSET=0x400 + +# Enable TZ non-secure configuration +CONFIG_TRUSTED_EXECUTION_NONSECURE=y +CONFIG_RUNTIME_NMI=y From 4c1e1bec3d95905029dd259f75f54c3b529c9e69 Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Tue, 19 Aug 2025 17:35:39 +0200 Subject: [PATCH 06/10] boards: st: nucleo_wba65ri: rename documentation file Rename nucleo_wba65ri board documentation file for consistency within Zephyr file tree. Signed-off-by: Etienne Carriere --- boards/st/nucleo_wba65ri/doc/{nucleo_wba65ri.rst => index.rst} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename boards/st/nucleo_wba65ri/doc/{nucleo_wba65ri.rst => index.rst} (100%) diff --git a/boards/st/nucleo_wba65ri/doc/nucleo_wba65ri.rst b/boards/st/nucleo_wba65ri/doc/index.rst similarity index 100% rename from boards/st/nucleo_wba65ri/doc/nucleo_wba65ri.rst rename to boards/st/nucleo_wba65ri/doc/index.rst From 42d529455ec614e2b5441eb26edac0cbe3dff7d3 Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Tue, 19 Aug 2025 17:42:23 +0200 Subject: [PATCH 07/10] boards: st: nucleo_wba65ri: fix special characters in board doc Replace (R) and (TM) special charaters with |reg| and |trade| aliases in nucleo_wba65ri board documentation file. By the way also fix some characters case, add info and move Cortex-M description in the overview section to prevent information duplication. Signed-off-by: Etienne Carriere --- boards/st/nucleo_wba65ri/doc/index.rst | 49 +++++++++++++------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/boards/st/nucleo_wba65ri/doc/index.rst b/boards/st/nucleo_wba65ri/doc/index.rst index 6a24e7a250b8b..59d265f67738a 100644 --- a/boards/st/nucleo_wba65ri/doc/index.rst +++ b/boards/st/nucleo_wba65ri/doc/index.rst @@ -3,23 +3,24 @@ Overview ******** -NUCLEO-WBA65RI is a Bluetooth® Low Energy, 802.15.4 and Zigbee® wireless -and ultra-low-power board embedding a powerful and ultra-low-power radio -compliant with the Bluetooth® Low Energy SIG specification v5.4 -with IEEE 802.15.4-2015 and Zigbee® specifications. +NUCLEO-WBA65RI is a Bluetooth |reg| Low Energy, 802.15.4 and Zigbee |reg| +wireless and ultra-low-power board embedding a powerful and ultra-low-power +radio compliant with the Bluetooth |reg| Low Energy SIG specification v5.4 +with IEEE 802.15.4-2015 and Zigbee |reg| specifications. -The ARDUINO® Uno V3 connectivity support and the ST morpho headers allow the -easy expansion of the functionality of the STM32 Nucleo open development +The ARDUINO |reg| Uno V3 connectivity support and the ST morpho headers allow +the easy expansion of the functionality of the STM32 Nucleo open development platform with a wide choice of specialized shields. -- Ultra-low-power wireless STM32WBA65RI microcontroller based on the Arm® - Cortex®‑M33 core, featuring 2 Mbyte of flash memory and 512 Kbytes of SRAM in - a VFQFPN68 package +- Ultra-low-power wireless STM32WBA65RI microcontroller based on the Arm |reg| + Cortex |reg| ‑M33 core with TrustZone |reg|, MPU, DSP, and FPU, that operates + at a frequency of up to 100 MHz, featuring 2 Mbyte of flash memory and 512 + Kbytes of SRAM in a VFQFPN68 package - MCU RF board (MB2130): - - 2.4 GHz RF transceiver supporting Bluetooth® specification v5.4 - - Arm® Cortex® M33 CPU with TrustZone®, MPU, DSP, and FPU + - 2.4 GHz RF transceiver supporting Bluetooth |reg| specification v5.4 + - Arm |reg| Cortex |reg| M33 CPU with TrustZone |reg|, MPU, DSP, and FPU - Integrated PCB antenna - Three user LEDs @@ -28,7 +29,7 @@ platform with a wide choice of specialized shields. - Board connectors: - 2 USB Type-C - - ARDUINO® Uno V3 expansion connector + - ARDUINO |reg| Uno V3 expansion connector - ST morpho headers for full access to all STM32 I/Os - Flexible power-supply options: ST-LINK USB VBUS or external sources @@ -39,19 +40,18 @@ Hardware ******** The STM32WBA65xx multiprotocol wireless and ultralow power devices embed a -powerful and ultralow power radio compliant with the Bluetooth® SIG Low Energy -specification 5.4. They contain a high-performance Arm Cortex-M33 32-bit RISC -core. They operate at a frequency of up to 100 MHz. +powerful and ultralow power radio compliant with the Bluetooth |reg| SIG Low +Energy specification 5.4. - Includes ST state-of-the-art patented technology - Ultra low power radio: - 2.4 GHz radio - - RF transceiver supporting Bluetooth® Low Energy 5.4 specification - IEEE 802.15.4-2015 PHY and MAC, supporting Thread, Matter and Zigbee® + - RF transceiver supporting Bluetooth |reg| Low Energy 5.4 specification + IEEE 802.15.4-2015 PHY and MAC, supporting Thread, Matter and Zigbee |reg| - Proprietary protocols - - RX sensitivity: -96 dBm (Bluetooth® Low Energy at 1 Mbps) + - RX sensitivity: -96 dBm (Bluetooth |reg| Low Energy at 1 Mbps) and -100 dBm (IEEE 802.15.4 at 250 kbps) - Programmable output power, up to +10 dBm with 1 dB steps - Support for external PA @@ -71,8 +71,7 @@ core. They operate at a frequency of up to 100 MHz. - TBD µA/MHz Run mode at 3.3 V - Radio: Rx TBD mA / Tx at 0 dBm TBD mA -- Core: Arm® 32-bit Cortex®-M33 CPU with TrustZone®, MPU, DSP, and FPU -- ART Accelerator™: 8-Kbyte instruction cache allowing 0-wait-state execution +- ART Accelerator |trade|: 8-Kbyte instruction cache allowing 0-wait-state execution from flash memory (frequency up to 100 MHz, 150 DMIPS) - Power management: embedded regulator LDO and SMPS step-down converter - Supporting switch on-the-fly and voltage scaling @@ -80,7 +79,7 @@ core. They operate at a frequency of up to 100 MHz. - Benchmarks: - 1.5 DMIPS/MHz (Drystone 2.1) - - 410 CoreMark® (4.10 CoreMark/MHz) + - 410 CoreMark |reg| (4.10 CoreMark/MHz) - Clock sources: @@ -104,7 +103,7 @@ core. They operate at a frequency of up to 100 MHz. - Four UARTs (ISO 7816, IrDA, modem) - Three SPIs - - Four I2C Fm+ (1 Mbit/s), SMBus/PMBus® + - Four I2C Fm+ (1 Mbit/s), SMBus/PMBus |reg| - System peripherals: @@ -121,7 +120,7 @@ core. They operate at a frequency of up to 100 MHz. - Security and cryptography: - - Arm® TrustZone® and securable I/Os, memories, and peripherals + - Arm |reg| TrustZone |reg| and securable I/Os, memories, and peripherals - Flexible life cycle scheme with RDP and password protected debug - Root of trust thanks to unique boot entry and secure hide protection area (HDP) - SFI (secure firmware installation) thanks to embedded RSS (root secure services) @@ -139,7 +138,7 @@ core. They operate at a frequency of up to 100 MHz. - Development support: - - Serial wire debug (SWD), JTAG + - Serial wire debug (SWD), JTAG, Embedded Trace Macrocell |trade| - ECOPACK2 compliant package @@ -213,7 +212,7 @@ Flashing The board is configured to be flashed using west `STM32CubeProgrammer`_ runner, so its :ref:`installation ` is required. -Alternatively, openocd can also be used to flash the board using +Alternatively, OpenOCD can also be used to flash the board using the ``--runner`` (or ``-r``) option: .. code-block:: console From 5ea55e6f99ae7e88e3bdcb76b3036709670eabab Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Tue, 19 Aug 2025 18:04:44 +0200 Subject: [PATCH 08/10] boards: st: nucleo_wba65ri: add low power numbers in board doc Add missing low power consumption numbers in nucleo_wba65ri board documentation. These numbers are dumped from the SoC datashhet. Signed-off-by: Etienne Carriere --- boards/st/nucleo_wba65ri/doc/index.rst | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/boards/st/nucleo_wba65ri/doc/index.rst b/boards/st/nucleo_wba65ri/doc/index.rst index 59d265f67738a..f712fbfbb9a4a 100644 --- a/boards/st/nucleo_wba65ri/doc/index.rst +++ b/boards/st/nucleo_wba65ri/doc/index.rst @@ -64,12 +64,11 @@ Energy specification 5.4. - 1.71 to 3.6 V power supply - - 40 °C to 85 °C temperature range - Autonomous peripherals with DMA, functional down to Stop 1 mode - - TBD nA Standby mode (16 wake-up pins) - - TBD nA Standby mode with RTC - - TBD µA Standby mode with 64 KB SRAM - - TBD µA Stop 2 mode with 64 KB SRAM - - TBD µA/MHz Run mode at 3.3 V - - Radio: Rx TBD mA / Tx at 0 dBm TBD mA + - 120 nA Standby mode (16 wake-up pins) + - 1.68 |micro| A Standby mode with 64 KB SRAM with RTC + - 5.58 |micro| A Stop 2 mode with 64 KB SRAM with RTC + - 28.75 |micro| A/MHz Run mode at 3.3 V + - Radio: Rx 4.26 mA / Tx at 0 dBm 5.94 mA - ART Accelerator |trade|: 8-Kbyte instruction cache allowing 0-wait-state execution from flash memory (frequency up to 100 MHz, 150 DMIPS) From 62e367199723c828155c8e8cc015dbfd8edd4c1c Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Fri, 9 May 2025 12:39:05 +0200 Subject: [PATCH 09/10] boards: st: nucleo_wba65ri: Add 'ns' variant for TF-M support Add variant 'ns' to nucleo_wba65ri board to embed TF-M in the SoC secure world. The flash layout is synced with the layout defined in Zephyr TF-M integration of platform STM32WBA65I. - samples/tfm_integration/psa_crypto - samples/tfm_integration/psa_protected_storage - samples/tfm_integration/tfm_ipc - samples/tfm_integration/tfm_regression_test - samples/tfm_integration/tfm_secure_partition - tests/subsys/secure_storage/psa/crypto - tests/subsys/secure_storage/psa/its (with CONFIG_TFM_ITS_MAX_ASSET_SIZE_OVERRIDE=y and CONFIG_TFM_ITS_MAX_ASSET_SIZE=256) Support for PSA Arch Tests (samples/tfm_integration/tfm_psa_test) is not yet merged but is in under review [1]. Link: https://github.com/ARM-software/psa-arch-tests/pull/406 [1] Signed-off-by: Etienne Carriere --- boards/st/nucleo_wba65ri/board.cmake | 25 ++++++++- boards/st/nucleo_wba65ri/board.yml | 2 + boards/st/nucleo_wba65ri/doc/index.rst | 45 ++++++++++++++++ .../nucleo_wba65ri_stm32wba65xx_ns.dts | 53 +++++++++++++++++++ .../nucleo_wba65ri_stm32wba65xx_ns.yaml | 10 ++++ .../nucleo_wba65ri_stm32wba65xx_ns_defconfig | 28 ++++++++++ 6 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 boards/st/nucleo_wba65ri/nucleo_wba65ri_stm32wba65xx_ns.dts create mode 100644 boards/st/nucleo_wba65ri/nucleo_wba65ri_stm32wba65xx_ns.yaml create mode 100644 boards/st/nucleo_wba65ri/nucleo_wba65ri_stm32wba65xx_ns_defconfig diff --git a/boards/st/nucleo_wba65ri/board.cmake b/boards/st/nucleo_wba65ri/board.cmake index 828d1f367ab24..755a55bae8dcf 100644 --- a/boards/st/nucleo_wba65ri/board.cmake +++ b/boards/st/nucleo_wba65ri/board.cmake @@ -1,6 +1,29 @@ +# Copyright (c) 2025 STMicroelectronics # SPDX-License-Identifier: Apache-2.0 -board_runner_args(stm32cubeprogrammer "--port=swd" "--reset-mode=hw") +if(CONFIG_BUILD_WITH_TFM) + set(FLASH_BASE_ADDRESS_S 0x0C000000) + + # Flash merged TF-M + Zephyr binary + set_property(TARGET runners_yaml_props_target PROPERTY hex_file tfm_merged.hex) + + if(CONFIG_HAS_FLASH_LOAD_OFFSET) + MATH(EXPR TFM_HEX_BASE_ADDRESS_NS "${FLASH_BASE_ADDRESS_S}+${CONFIG_FLASH_LOAD_OFFSET}") + else() + set(TFM_HEX_BASE_ADDRESS_NS ${TFM_FLASH_BASE_ADDRESS_S}) + endif() + + # System entry point is TF-M vector, located 1kByte after tfm_fmw_partition in DTS + dt_nodelabel(tfm_partition_path NODELABEL slot0_secure_partition REQUIRED) + dt_reg_addr(tfm_partition_offset PATH ${tfm_partition_path} REQUIRED) + math(EXPR tfm_fwm_boot_address "${tfm_partition_offset}+${FLASH_BASE_ADDRESS_S}+0x400") + + board_runner_args(stm32cubeprogrammer "--port=swd" "--reset-mode=hw" + "--erase" "--start-address=${tfm_fwm_boot_address}" + ) +else() + board_runner_args(stm32cubeprogrammer "--port=swd" "--reset-mode=hw") +endif() include(${ZEPHYR_BASE}/boards/common/stm32cubeprogrammer.board.cmake) include(${ZEPHYR_BASE}/boards/common/openocd-stm32.board.cmake) diff --git a/boards/st/nucleo_wba65ri/board.yml b/boards/st/nucleo_wba65ri/board.yml index 01a51d7715d1e..7d69dba2e215b 100644 --- a/boards/st/nucleo_wba65ri/board.yml +++ b/boards/st/nucleo_wba65ri/board.yml @@ -4,3 +4,5 @@ board: vendor: st socs: - name: stm32wba65xx + variants: + - name: ns diff --git a/boards/st/nucleo_wba65ri/doc/index.rst b/boards/st/nucleo_wba65ri/doc/index.rst index f712fbfbb9a4a..85675f19a3922 100644 --- a/boards/st/nucleo_wba65ri/doc/index.rst +++ b/boards/st/nucleo_wba65ri/doc/index.rst @@ -163,6 +163,48 @@ To fetch Binary Blobs: west blobs fetch hal_stm32 +Zephyr board options +==================== + +Zephyr supports building both Secure and Non-Secure firmware for +Nucleo WBA65RI board where TF-M is the embedded Secure firmware +and Zephyr the Non-Secure firmware. + +The BOARD options are summarized below: + ++---------------------------------+------------------------------------------+ +| BOARD | Description | ++=================================+==========================================+ +| stm32wba65i_dk1 | For building TrustZone Disabled firmware | ++---------------------------------+------------------------------------------+ +| stm32wba65i_dk1/stm32wba65xx/ns | For building Non-Secure firmware | ++---------------------------------+------------------------------------------+ + +Here are the instructions to build Zephyr with a non-secure configuration, +using :zephyr:code-sample:`tfm_ipc` sample: + +.. zephyr-app-commands:: + :zephyr-app: samples/tfm_integration/tfm_ipc + :board: nucleo_wba65ri/stm32wba65xx/ns + :goals: build + +Once done, before flashing, you need to first run a generated script that +will set platform Option Bytes config and erase internal flash (among others, +Option Bit TZEN will be set). + +.. code-block:: bash + + $ ./build/tfm/api_ns/regression.sh + $ west flash + +Please note that, after having programmed the board for a TrustZone enabled system +(e.g. with ``./build/tfm/api_ns/regression.sh``), the SoC TZEN Option Byte is enabled +and you will need to operate specific sequence to disable this TZEN Option Byte +configuration to get your board back in normal state for booting with a TrustZone +disabled system (e.g. without TF-M support). +You can use STM32CubeProgrammer_ to disable the SoC TZEN Option Byte config. Refer +to `How to disable STM32WBA65 TZEN Option Byte`_. + Connections and IOs =================== @@ -250,3 +292,6 @@ You can debug an application in the usual way using OpenOCD. Here is an example .. _STM32CubeProgrammer: https://www.st.com/en/development-tools/stm32cubeprog.html + +.. _How to disable STM32WBA65 TZEN Option Byte: + https://wiki.st.com/stm32mcu/wiki/Connectivity:STM32WBA_BLE_%26_TrustZone#How_to_disable_the_TrustZone diff --git a/boards/st/nucleo_wba65ri/nucleo_wba65ri_stm32wba65xx_ns.dts b/boards/st/nucleo_wba65ri/nucleo_wba65ri_stm32wba65xx_ns.dts new file mode 100644 index 0000000000000..c37209ca7c1a8 --- /dev/null +++ b/boards/st/nucleo_wba65ri/nucleo_wba65ri_stm32wba65xx_ns.dts @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2025 STMicroelectronics + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include "nucleo_wba65ri.dts" + +/ { + chosen { + zephyr,code-partition = &slot0_ns_partition; + }; + + /* SRAM1 (node label sram0) last 64kByte are owned by TF-M */ + memory@20000000 { + reg = <0x20000000 DT_SIZE_K(448 - 64)>; + }; + + /* SRAM2 (node label sram1) is owned by TF-M */ + /delete-node/ memory@20070000; +}; + + +&flash0 { + /delete-node/ partitions; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + boot_partition: partition@0 { + label = "bootstage"; + reg = <0 DT_SIZE_K(48)>; + }; + + slot0_secure_partition: partition@c000 { + label = "image-secure"; + reg = <0xc000 DT_SIZE_K(256)>; + }; + + slot0_ns_partition: partition@4c000 { + label = "image-non-secure"; + reg = <0x4c000 DT_SIZE_K(512)>; + }; + + storage_partition: partition@cc000 { + label = "storage"; + reg = <0xcc000 (DT_SIZE_M(2) - DT_SIZE_K(48 + 256 + 512))>; + }; + }; +}; diff --git a/boards/st/nucleo_wba65ri/nucleo_wba65ri_stm32wba65xx_ns.yaml b/boards/st/nucleo_wba65ri/nucleo_wba65ri_stm32wba65xx_ns.yaml new file mode 100644 index 0000000000000..09625fa81fc07 --- /dev/null +++ b/boards/st/nucleo_wba65ri/nucleo_wba65ri_stm32wba65xx_ns.yaml @@ -0,0 +1,10 @@ +identifier: nucleo_wba65ri/stm32wba65xx/ns +name: ST Nucleo WBA65RI with TF-M and non-secure firmware +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb +ram: 384 +flash: 512 +vendor: st diff --git a/boards/st/nucleo_wba65ri/nucleo_wba65ri_stm32wba65xx_ns_defconfig b/boards/st/nucleo_wba65ri/nucleo_wba65ri_stm32wba65xx_ns_defconfig new file mode 100644 index 0000000000000..94e51f719e961 --- /dev/null +++ b/boards/st/nucleo_wba65ri/nucleo_wba65ri_stm32wba65xx_ns_defconfig @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2025 STMicroelectronics + +# Enable UART driver +CONFIG_SERIAL=y + +# Enable GPIO +CONFIG_GPIO=y + +# Console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable HW stack protection +CONFIG_HW_STACK_PROTECTION=y + +# Enable the internal SMPS regulator +CONFIG_POWER_SUPPLY_DIRECT_SMPS=y + +# Header offset since TF-M has no BL2 hence Zephyr is not signed +CONFIG_ROM_START_OFFSET=0x400 + +# Enable TZ non-secure configuration +CONFIG_TRUSTED_EXECUTION_NONSECURE=y +CONFIG_RUNTIME_NMI=y From 3dc0e5dceb59e26bcf0ddbf4a086ca507d519378 Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Thu, 21 Aug 2025 15:29:21 +0200 Subject: [PATCH 10/10] samples: boards: st: power_mgmt: wkup_pins: add WBA65 boards Add WBA65RI Nucleo board to ST wkup_pins board sample. By the way, sort the board names in sample.yaml. Signed-off-by: Etienne Carriere --- .../wkup_pins/boards/nucleo_wba65ri.overlay | 15 +++++++++++++++ .../boards/st/power_mgmt/wkup_pins/sample.yaml | 7 ++++--- 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 samples/boards/st/power_mgmt/wkup_pins/boards/nucleo_wba65ri.overlay diff --git a/samples/boards/st/power_mgmt/wkup_pins/boards/nucleo_wba65ri.overlay b/samples/boards/st/power_mgmt/wkup_pins/boards/nucleo_wba65ri.overlay new file mode 100644 index 0000000000000..66b94ab492161 --- /dev/null +++ b/samples/boards/st/power_mgmt/wkup_pins/boards/nucleo_wba65ri.overlay @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2025 STMicroelectronics + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + aliases { + wkup-src = &user_button_1; + }; +}; + +&pwr { + status = "okay"; +}; diff --git a/samples/boards/st/power_mgmt/wkup_pins/sample.yaml b/samples/boards/st/power_mgmt/wkup_pins/sample.yaml index ffa78d34faeb6..80db1f2d39d6d 100644 --- a/samples/boards/st/power_mgmt/wkup_pins/sample.yaml +++ b/samples/boards/st/power_mgmt/wkup_pins/sample.yaml @@ -7,14 +7,15 @@ tests: "gpio-keys") and dt_compat_enabled("st,stm32-pwr") platform_allow: - nucleo_c092rc + - nucleo_f103rb - nucleo_g031k8 + - nucleo_l152re - nucleo_l4r5zi - nucleo_u575zi_q - nucleo_u5a5zj_q + - nucleo_wba55cg + - nucleo_wba65ri - nucleo_wl55jc - - nucleo_f103rb - stm32l1_disco - - nucleo_l152re - - nucleo_wba55cg integration_platforms: - nucleo_l4r5zi