From 335df30a50987ae4a05af67a56f010b407b6fd71 Mon Sep 17 00:00:00 2001 From: Luc BEAUFILS Date: Fri, 27 Jun 2025 15:04:47 +0200 Subject: [PATCH] boards: st: add support for stm32mp257f_dk board Introduce initial board support for the STM32MP257F-DK Discovery Kit. This includes: - Board metadata (board.yml, stm32mp257f_dk.yaml) - Base software configuration (Kconfig.stm32mp257f_dk) - CMake build integration (board.cmake) - Default configuration (stm32mp257f_dk_stm32mp257fxx_m33_defconfig) - Minimal device tree (stm32mp257f_dk_stm32mp257fxx_m33.dts) - Initial documentation and image for the stm32mp257f_dk board. - OpenOCD configuration files for debugging support. Signed-off-by: Luc BEAUFILS --- .../st/stm32mp257f_dk/Kconfig.stm32mp257f_dk | 5 + boards/st/stm32mp257f_dk/board.cmake | 10 + boards/st/stm32mp257f_dk/board.yml | 6 + .../doc/img/stm32mp257f_dk.webp | Bin 0 -> 40572 bytes boards/st/stm32mp257f_dk/doc/index.rst | 245 ++++++++++++++++++ .../stm32mp257f_dk_stm32mp257fxx_m33.dts | 80 ++++++ .../stm32mp257f_dk_stm32mp257fxx_m33.yaml | 24 ++ ...stm32mp257f_dk_stm32mp257fxx_m33_defconfig | 19 ++ .../support/openocd_stm32mp257f_dk_m33.cfg | 10 + 9 files changed, 399 insertions(+) create mode 100644 boards/st/stm32mp257f_dk/Kconfig.stm32mp257f_dk create mode 100644 boards/st/stm32mp257f_dk/board.cmake create mode 100644 boards/st/stm32mp257f_dk/board.yml create mode 100644 boards/st/stm32mp257f_dk/doc/img/stm32mp257f_dk.webp create mode 100644 boards/st/stm32mp257f_dk/doc/index.rst create mode 100644 boards/st/stm32mp257f_dk/stm32mp257f_dk_stm32mp257fxx_m33.dts create mode 100644 boards/st/stm32mp257f_dk/stm32mp257f_dk_stm32mp257fxx_m33.yaml create mode 100644 boards/st/stm32mp257f_dk/stm32mp257f_dk_stm32mp257fxx_m33_defconfig create mode 100644 boards/st/stm32mp257f_dk/support/openocd_stm32mp257f_dk_m33.cfg diff --git a/boards/st/stm32mp257f_dk/Kconfig.stm32mp257f_dk b/boards/st/stm32mp257f_dk/Kconfig.stm32mp257f_dk new file mode 100644 index 000000000000..8998e76c8bc2 --- /dev/null +++ b/boards/st/stm32mp257f_dk/Kconfig.stm32mp257f_dk @@ -0,0 +1,5 @@ +# Copyright (C) 2025 Savoir-faire Linux, Inc. +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_STM32MP257F_DK + select SOC_STM32MP2X_M33 if BOARD_STM32MP257F_DK_STM32MP257FXX_M33 diff --git a/boards/st/stm32mp257f_dk/board.cmake b/boards/st/stm32mp257f_dk/board.cmake new file mode 100644 index 000000000000..1a979285e468 --- /dev/null +++ b/boards/st/stm32mp257f_dk/board.cmake @@ -0,0 +1,10 @@ +# Copyright (C) 2025 Savoir-faire Linux, Inc. +# SPDX-License-Identifier: Apache-2.0 + +if(CONFIG_BOARD_STM32MP257F_DK_STM32MP257FXX_M33) + board_runner_args( + openocd "--config=${BOARD_DIR}/support/openocd_stm32mp257f_dk_m33.cfg") + board_runner_args(openocd "--gdb-init=target extended-remote :3334") +endif() + +include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) diff --git a/boards/st/stm32mp257f_dk/board.yml b/boards/st/stm32mp257f_dk/board.yml new file mode 100644 index 000000000000..a598095e6e8d --- /dev/null +++ b/boards/st/stm32mp257f_dk/board.yml @@ -0,0 +1,6 @@ +board: + name: stm32mp257f_dk + full_name: STM32MP257F-DK Discovery Kit + vendor: st + socs: + - name: stm32mp257fxx diff --git a/boards/st/stm32mp257f_dk/doc/img/stm32mp257f_dk.webp b/boards/st/stm32mp257f_dk/doc/img/stm32mp257f_dk.webp new file mode 100644 index 0000000000000000000000000000000000000000..24e047708508328624748c396ae0be8ada351049 GIT binary patch literal 40572 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 RHvj+t00000000000037Zi9G-S literal 0 HcmV?d00001 diff --git a/boards/st/stm32mp257f_dk/doc/index.rst b/boards/st/stm32mp257f_dk/doc/index.rst new file mode 100644 index 000000000000..87d95075a7e1 --- /dev/null +++ b/boards/st/stm32mp257f_dk/doc/index.rst @@ -0,0 +1,245 @@ +.. zephyr:board:: stm32mp257f_dk + +Overview +******** + +The STM32MP257F-DK Discovery kit is designed as a complete demonstration +and development platform for the STMicroelectronics STM32MP257F microprocessor +based on Arm |reg| dual-core Cortex |reg|-A35 (1.5 GHz) and Cortex |reg|-M33 +(400 MHz), and the STPMIC25 companion chip. +Zephyr OS is ported to run on the Cortex |reg|-M33 core, as a coprocessor of +the Cortex |reg|-A35 core. + +Features: +========= + +- STM32MP257FAI3 microprocessor featuring dual-core Arm |reg| Cortex |reg|-A35, + a Cortex |reg|-M33 in a VFBGA424 package +- ST power management STPMIC25 +- 32‑Gbit LPDDR4 DRAM +- 64-Gbit eMMC v5.1 +- 1‑Gbit/s Ethernet (RGMII) +- Two USB 2.0 high speed +- USB 3.0 SuperSpeed PD (DRP/DRD) +- Wi‑Fi® 802.11b/g/n +- Bluetooth® LE +- Four user LEDs +- Two user, one tamper, and one reset push-buttons +- Wake-up button +- Four boot pin switches +- Board connectors: + + - Ethernet RJ45 + - Two stacked USB 2.0 HS Type-A + - USB 3.0 USB Type-C |reg| PD + - microSD |trade| card holder + - Dual-lane MIPI CSI-2 |reg| camera module expansion connector + - HDMI |reg| + - LVDS + - GPIO expansion connector + - VBAT for power backup + +- On-board STLINK-V3EC: + + - Debugger with USB re-enumeration capability: Virtual COM port and debug port + - Board power source through USB Type-C |reg| + +- Mainlined open-source Linux |reg| STM32 MPU OpenSTLinux Distribution and + STM32CubeMP2 software with examples +- Linux |reg| Yocto project |reg|, Buildroot, and STM32CubeIDE as + development environments + +More information about the board can be found at the +`STM32MP257F-DK website`_. + +Hardware +******** + +Cores: +====== + +- 64-bit dual-core Arm |reg| Cortex |reg|-A35 with 1.5 GHz max frequency + - 32-Kbyte I + 32-Kbyte D level 1 cache for each Cortex |reg|-A35 core + - 512-Kbyte unified level 2 cache + - Arm |reg| NEON |trade| and Arm |reg| TrustZone |reg| +- 32-bit Arm |reg| Cortex |reg|-M33 with FPU/MPU, Arm |reg| TrustZone |reg|, + and 400 MHz max frequency + - L1 16-Kbyte ICache / 16-Kbyte DCache for Cortex |reg|-M33 + +Memories: +========= + +- External DDR memory up to 4 Gbytes + - Up to DDR3L-2133 16/32-bit + - Up to DDR4-2400 16/32-bit + - Up to LPDDR4-2400 16/32-bit +- 808-Kbyte internal SRAM: 256-Kbyte AXI SYSRAM, 128-Kbyte AXI video RAM or + SYSRAM extension, 256-Kbyte AHB SRAM, 128-Kbyte AHB SRAM with ECC in backup + domain, 8-Kbyte SRAM with ECC in backup domain, 32 Kbytes in SmartRun domain +- Two Octo-SPI memory interfaces +- Flexible external memory controller with up to 16-bit data bus: parallel + interface to connect external ICs, and SLC NAND memories with up to 8-bit ECC + +Power +===== + +- STPMIC25 for voltage regulation (multiple buck/LDO regulators) +- USB-C power input + +Clock management +================ + +- External oscillators: + - 32.768 kHz LSE crystal + - 40 MHz HSE crystal +- Internal oscillators: + - 64 MHz HSI oscillator + - 4 MHz CSI oscillator + - 32 kHz LSI oscillator + - Five separate PLLs with integer and fractional mode + +Security/Safety +=============== + +- Secure boot, TrustZone |reg| peripherals, active tamper, environmental + monitors, display secure layers, hardware accelerators +- Complete resource isolation framework + +Connectivity +============ + +- 1x Gigabit Ethernet (RGMII) +- USB 2.0 High-Speed Host (dual-port) +- USB Type-C |reg| DRP +- GPIO expansion connector + +Display & Camera +================ + +- LVDS interface (4-lane) +- Camera CSI-2 interface (2-lane) + +Debug +===== + +- STLINK-V3EC (onboard debugger with VCP, JTAG and SWD) + +More information about STM32MP257F can be found here: + +- `STM32MP257F on www.st.com`_ + +Supported Features +================== + +.. zephyr:board-supported-hw:: + +Connections and IOs +=================== + +STM32MP257F-DK Discovery kit schematic is available here: +`STM32MP257F-DK Discovery kit schematics`_ + +System Clock +============ + +Cortex |reg|-A35 +---------------- + +Not yet supported in Zephyr. + +Cortex |reg|-M33 +---------------- + +The Cortex |reg|-M33 Core is configured to run at a 400 MHz clock speed. + +Programming and Debugging +************************* + +.. zephyr:board-supported-runners:: + +Prerequisite +============ + +Before you can run Zephyr on the STM32MP257F-DK Discovery kit, you need to +set up the Cortex |reg|-A35 core with a Linux |reg| environment. The Cortex +|reg|-M33 core runs Zephyr as a coprocessor, and it requires the Cortex +|reg|-A35 to load and start the firmware using remoteproc. + +One way to set up the Linux environment is to use the official ST +OpenSTLinux distribution, following the `Starter Package`_. (more information +about the procedure can be found in the `STM32MPU Wiki`_) + +Loading the firmware +==================== + +Once the OpenSTLinux distribution is installed on the board, the Cortex |reg| +-A35 is responsible (in the current distribution) for loading the Zephyr +firmware image in DDR and/or SRAM and starting the Cortex |reg| -M33 core. The +application can be built using west, taking the :zephyr:code-sample:`blinky` as +an example. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: stm32mp257f_dk/stm32mp257fxx/m33 + :goals: build + +The firmware can be copied to the board file system and started with the Linux +remoteproc framework. (more information about the procedure can be found in the +`STM32MP257F boot Cortex-M33 firmware`_) + +Debugging +========= +Applications can be debugged using OpenOCD and GDB. The OpenOCD files can be +found at `device-stm-openocd`_. +The firmware must first be started by the Cortex |reg|-A35. The debugger can +then be attached to the running Zephyr firmware using OpenOCD. + +- Build the sample: + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: stm32mp257f_dk/stm32mp257fxx/m33 + :goals: build + +- Copy the firmware to the board, load it and start it with remoteproc + (`STM32MP257F boot Cortex-M33 firmware`_). The orange LED should be blinking. +- Attach to the target: + +.. code-block:: console + + $ west attach + +References +========== + +.. target-notes:: + +.. _STM32MP257F-DK website: + https://www.st.com/en/evaluation-tools/stm32mp257f-dk.html#overview + +.. _STM32MP257F-DK Discovery kit User Manual: + https://www.st.com/resource/en/user_manual/um3385-discovery-kit-with-stm32mp257f-mpu-stmicroelectronics.pdf + +.. _STM32MP257F-DK Discovery kit schematics: + https://www.st.com/resource/en/schematic_pack/mb1605-mp257f-c01-schematic.pdf + +.. _STM32MP25xC/F Discovery kit datasheet: + https://www.st.com/resource/en/datasheet/stm32mp257c.pdf + +.. _STM32MP257F on www.st.com: + https://www.st.com/en/microcontrollers-microprocessors/stm32mp257f.html + +.. _STM32MP257F reference manual: + https://www.st.com/resource/en/reference_manual/rm0457-stm32mp25xx-advanced-armbased-3264bit-mpus-stmicroelectronics.pdf + +.. _STM32MP257F boot Cortex-M33 firmware: + https://wiki.st.com/stm32mpu/wiki/Linux_remoteproc_framework_overview#Remote_processor_boot_through_sysfs + +.. _Starter Package: + https://wiki.stmicroelectronics.cn/stm32mpu/wiki/STM32MP25_Discovery_kits_-_Starter_Package + +.. _STM32MPU Wiki: + https://wiki.st.com/stm32mpu/wiki/Main_Page + +.. _device-stm-openocd: + https://github.com/STMicroelectronics/device-stm-openocd/tree/main diff --git a/boards/st/stm32mp257f_dk/stm32mp257f_dk_stm32mp257fxx_m33.dts b/boards/st/stm32mp257f_dk/stm32mp257f_dk_stm32mp257fxx_m33.dts new file mode 100644 index 000000000000..66e2e34eb4db --- /dev/null +++ b/boards/st/stm32mp257f_dk/stm32mp257f_dk_stm32mp257fxx_m33.dts @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2025 Savoir-faire Linux, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include +#include +#include + +/ { + model = "STMicroelectronics STM32MP257F-DK board"; + compatible = "st,stm32mp257f-dk", "st,stm32mp25"; + + chosen { + zephyr,console = &uart5; + zephyr,flash = &ddr_code; + zephyr,shell-uart = &uart5; + zephyr,sram = &ddr_sys; + }; + + leds { + compatible = "gpio-leds"; + + orange_led_9: led_9 { + gpios = <&gpioh 6 GPIO_ACTIVE_HIGH>; + label = "LD9"; + }; + }; + + gpio_keys { + compatible = "gpio-keys"; + + button_user2: button4 { + gpios = <&gpioc 11 GPIO_ACTIVE_LOW>; + label = "User 2"; + zephyr,code = ; + }; + }; + + aliases { + led0 = &orange_led_9; + sw0 = &button_user2; + }; +}; + +&rcc { + clock-frequency = ; +}; + +&gpioc { + status = "okay"; +}; + +&gpiof { + status = "okay"; +}; + +&gpiog { + status = "okay"; +}; + +&gpioh { + status = "okay"; +}; + +&uart5 { + pinctrl-0 = <&uart5_tx_pg9 &uart5_rx_pg10>; + pinctrl-names = "default"; + current-speed = <115200>; + status = "okay"; +}; + +&usart6 { + pinctrl-0 = <&usart6_tx_pf13 &usart6_rx_pf14>; + pinctrl-names = "default"; + current-speed = <115200>; + status = "okay"; +}; diff --git a/boards/st/stm32mp257f_dk/stm32mp257f_dk_stm32mp257fxx_m33.yaml b/boards/st/stm32mp257f_dk/stm32mp257f_dk_stm32mp257fxx_m33.yaml new file mode 100644 index 000000000000..394c8b33a35b --- /dev/null +++ b/boards/st/stm32mp257f_dk/stm32mp257f_dk_stm32mp257fxx_m33.yaml @@ -0,0 +1,24 @@ +identifier: stm32mp257f_dk/stm32mp257fxx/m33 +name: STM32MP257F_DK +type: mcu +arch: arm +toolchain: + - zephyr + - gccarmemb +supported: + - LED + - gpio + - shell +testing: + ignore_tags: + - cmsis_rtos_v2 + - net + - mpu + - tinycrypt + - crypto + - aes + - cmm + - nfc +ram: 8192 +flash: 8192 +vendor: st diff --git a/boards/st/stm32mp257f_dk/stm32mp257f_dk_stm32mp257fxx_m33_defconfig b/boards/st/stm32mp257f_dk/stm32mp257f_dk_stm32mp257fxx_m33_defconfig new file mode 100644 index 000000000000..f67a6f9d0503 --- /dev/null +++ b/boards/st/stm32mp257f_dk/stm32mp257f_dk_stm32mp257fxx_m33_defconfig @@ -0,0 +1,19 @@ +# Copyright (C) 2025 Savoir-faire Linux, Inc. +# SPDX-License-Identifier: Apache-2.0 + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable GPIO +CONFIG_GPIO=y + +# Enable HW stack protection +CONFIG_HW_STACK_PROTECTION=y + +# Enable UART driver +CONFIG_SERIAL=y +CONFIG_UART_INTERRUPT_DRIVEN=y + +# UART console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y diff --git a/boards/st/stm32mp257f_dk/support/openocd_stm32mp257f_dk_m33.cfg b/boards/st/stm32mp257f_dk/support/openocd_stm32mp257f_dk_m33.cfg new file mode 100644 index 000000000000..a690cfa54995 --- /dev/null +++ b/boards/st/stm32mp257f_dk/support/openocd_stm32mp257f_dk_m33.cfg @@ -0,0 +1,10 @@ +# Only enable the Cortex-M33 debugger +set EN_CA35_0 0 +set EN_CA35_1 0 +set EN_CM33 1 +set EN_CM0P 0 + +source [find board/stm32mp25x_dk.cfg] + +# Set active target to Cortex-M33 +targets stm32mp25x.m33