From 7f5521e8a5533255f3f26829d78010671df0eb90 Mon Sep 17 00:00:00 2001 From: Sue Wu Date: Tue, 19 May 2026 15:56:23 +0800 Subject: [PATCH 1/2] add zephyr_cs320_mps4 to learning path --- .../zephyr_cs320_mps4/_index.md | 52 ++++ .../zephyr_cs320_mps4/_next-steps.md | 8 + .../zephyr_cs320_mps4/how-to-1.md | 15 + .../zephyr_cs320_mps4/how-to-2.md | 269 ++++++++++++++++++ .../zephyr_cs320_mps4/how-to-3.md | 55 ++++ .../zephyr_cs320_mps4/image.png | Bin 0 -> 9242 bytes 6 files changed, 399 insertions(+) create mode 100644 content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/_index.md create mode 100644 content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/_next-steps.md create mode 100644 content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/how-to-1.md create mode 100644 content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/how-to-2.md create mode 100644 content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/how-to-3.md create mode 100644 content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/image.png diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/_index.md b/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/_index.md new file mode 100644 index 0000000000..6596518762 --- /dev/null +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/_index.md @@ -0,0 +1,52 @@ +--- +title: Porting Zephyr and Running Applications on the Corstone-320 MPS4 Platform +minutes_to_complete: 45 + +who_is_this_for: + This topic is for embedded developers who want to run the Zephyr RTOS on the Arm Corstone-320 MPS4 FPGA platform. It focuses on the board enablement work and application workflow. + +learning_objectives: + - Set up Zephyr development environment for Corstone-320 MPS4 + - Configure device tree and board support packages to port Zephyr RTOS to MPS4 platform + - Build and run applications + +prerequisites: + - Basic familiarity with embedded C programming + - Basic knowledge of Zephyr RTOS + - A Corstone-320 MPS4 FPGA development board + - A Linux development environment, for example Ubuntu 20.04 or later + - Git + - Python 3.8 or higher + +author: Sue Wu, Arm + +skilllevels: Introductory +subjects: RTOS Fundamentals +armips: + - Cortex-M + - Corstone-320 +tools_software_languages: + - Zephyr + - GCC + - C + - MPS4 board + + +further_reading: + - resource: + title: Zephyr Project Documentation + link: https://docs.zephyrproject.org/latest/index.html + type: website + - resource: + title: Zephyr Sample applications and Demo + link: https://docs.zephyrproject.org/latest/samples/index.html + type: website + - resource: + title: MPS4 board + link: https://developer.arm.com/documentation/102577/0000?lang=en + type: website + +weight: 1 +layout: "learningpathall" +learning_path_main_page: "yes" +--- diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/_next-steps.md b/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/_next-steps.md new file mode 100644 index 0000000000..727b395ddd --- /dev/null +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/_next-steps.md @@ -0,0 +1,8 @@ +--- +# ================================================================================ +# FIXED, DO NOT MODIFY THIS FILE +# ================================================================================ +weight: 21 # The weight controls the order of the pages. _index.md always has weight 1. +title: "Next Steps" # Always the same, html page title. +layout: "learningpathall" # All files under learning paths have this same wrapper for Hugo processing. +--- diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/how-to-1.md b/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/how-to-1.md new file mode 100644 index 0000000000..cd6e285122 --- /dev/null +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/how-to-1.md @@ -0,0 +1,15 @@ +--- +title: Set up Zephyr build environment +weight: 2 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Set up the development environment +This section describes the tools and environment you need for Corstone-320 MPS4 development with Zephyr. + +### Install the Zephyr build tools + +- Follow the Zephyr Project [Getting Started Guide — Zephyr Project Documentation](https://docs.zephyrproject.org/latest/develop/getting_started/index.html) to install the required packages and set up the Zephyr workspace. +- Download and install [arm-gnu-toolchain from Arm GNU Toolchain](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads) diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/how-to-2.md b/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/how-to-2.md new file mode 100644 index 0000000000..d68ded74b1 --- /dev/null +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/how-to-2.md @@ -0,0 +1,269 @@ +--- +title: Add Zephyr board support for Corstone-320 MPS4 platform +weight: 3 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Port Zephyr and run an application on Corstone-320 MPS4 + +### CS320 MPS4 Platform overview + +The Arm® Corstone™ SSE-320 FPGA Image for MPS4 (FI101) provides an FPGA implementation that runs on the MPS4 board. The image includes an Arm Cortex-M85 processor, an Arm Ethos-U85 NPU, and an Arm CoreLink DMA-350 direct memory access (DMA) controller. This setup provides a practical environment for developing and evaluating embedded applications, including machine learning workloads. + +Download the latest Corstone-320 FPGA image and review the platform documentations: +* [Arm® Corstone™ SSE-320 with Cortex®-M85 and Ethos™-U85 : Example FPGA (FI101)](https://developer.arm.com/downloads/view/FI101) +* [SSE-320 FPGA Image for MPS4 Application Note](https://developer.arm.com/documentation/109762/0100/?lang=en) +* [Arm® MPS4 FPGA Prototyping Board Technical Reference Manual](https://developer.arm.com/documentation/102577/latest/) +* [Arm® Corstone™ SSE-320 Example Subsystem Software Programmers Guide](https://developer.arm.com/documentation/109759/latest/) + + +### Add Zephyr board support for Corstone-320 MPS4 + +#### Understanding Zephyr board support architecture +Zephyr organizes hardware support in a hierarchy: + +``` +Board → SoC → CPU Cluster → CPU Core → Architecture +``` + +For Corstone-320 MPS4, this hierarchy looks like: +- **Board**: `mps4` (your custom board name in Zephyr) +- **SoC**: `corstone320` (Corstone-320 subsystem) +- **CPU Cluster**: `m85` (Cortex-M85 cluster) +- **CPU Core**: Single Cortex-M85 core +- **Architecture**: ARMv8.1-M with Helium + +#### Create the board directory structure + +Create a board directory under boards/arm/mps4/. Use the following structure: + +``` +boards/arm/mps4/ +├── board.yml # Board metadata +├── board.cmake # Build system integration +├── doc/ # Optional documentation +│ ├── index.rst +├── Kconfig.mps4 # Board Kconfig entry +├── Kconfig.defconfig # Default Kconfig settings +├── mps4_corstone320_fpga_defconfig # Board defconfig fragment +├── mps4_corstone320_fpga.dts # Device tree source +└── mps4_corstone320_fpga.yaml # Test runner metadata +``` + +#### Add the essential board files + +- board.yml +board.yml is board metadata, use board.yml to describe the board name, vendor, SoC, and variants. + +``` +board: + name: mps4 + full_name: MPS4 + vendor: arm + socs: + - name: 'corstone320' + variants: + - name: 'fpga' +``` + +- mps4_corstone320_fpga.dts + +The device tree describes the Corstone-320 MPS4 hardware. Base on the content on [SSE-320 FPGA Image for MPS4 Application Note](https://developer.arm.com/documentation/109762/0100/?lang=en) and tailor it to the peripherals and memory map you use. + +The following example shows a device tree that defines memory regions and enables UART and Ethos-U: + + +```dts +/dts-v1/; + +#include +#include +#include +#include + +{ + compatible = "arm,mps4-fpga"; + #address-cells = <1>; + #size-cells = <1>; + + chosen { + zephyr,console = &uart0; + zephyr,shell-uart = &uart0; + zephyr,sram = &sram; + zephyr,flash = &isram; + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + cpu@0 { + device_type = "cpu"; + compatible = "arm,cortex-m85"; + reg = <0>; + #address-cells = <1>; + #size-cells = <1>; + + mpu: mpu@e000ed90 { + compatible = "arm,armv8.1m-mpu"; + reg = <0xe000ed90 0x40>; + }; + }; + }; + + ethosu { + #address-cells = <1>; + #size-cells = <0>; + interrupt-parent = <&nvic>; + + ethosu0: ethosu@50004000 { + compatible = "arm,ethos-u"; + reg = <0x50004000>; + interrupts = <16 3>; + secure-enable; + privilege-enable; + status = "okay"; + }; + }; + + + itcm: itcm@10000000 { + compatible = "zephyr,memory-region"; + reg = <0x10000000 DT_SIZE_K(32)>; + zephyr,memory-region = "ITCM"; + }; + + sram: sram@12000000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x12000000 DT_SIZE_M(2)>; + zephyr,memory-region = "SRAM"; + }; + + rom: rom@11000000 { + compatible = "zephyr,memory-region"; + reg = <0x11000000 DT_SIZE_K(128)>; + zephyr,memory-region = "ROM"; + }; + + dtcm: dtcm@30000000 { + compatible = "zephyr,memory-region"; + reg = <0x30000000 DT_SIZE_K(32)>; + zephyr,memory-region = "DTCM"; + }; + + isram: sram@31000000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x31000000 DT_SIZE_M(4)>; + zephyr,memory-region = "ISRAM"; + }; + + + soc { + peripheral@50000000 { + #address-cells = <1>; + #size-cells = <1>; + ranges = <0x0 0x50000000 0x10000000>; + + #include "mps4_common_soc_peripheral_fpga.dtsi" + }; + }; +}; + +#include "mps4_common.dtsi" +``` +- mps4_common_soc_peripheral_fpga.dtsi + +This file defines the SoC peripherals for the MPS4 FPGA build. The following example configures a fixed system clock and two UART instances. + +``` +sysclk: system-clock { + compatible = "fixed-clock"; + clock-frequency = <50000000>; + #clock-cells = <0>; +}; + +uart0: uart@9303000 { + compatible = "arm,cmsdk-uart"; + reg = <0x9303000 0x1000>; + interrupts = <34 3 49 3>; + interrupt-names = "tx", "rx"; + clocks = <&sysclk>; + current-speed = <115200>; +}; + +uart1: uart@9304000 { + compatible = "arm,cmsdk-uart"; + reg = <0x9304000 0x1000>; + interrupts = <36 3 35 3>; + interrupt-names = "tx", "rx"; + clocks = <&sysclk>; + current-speed = <115200>; +}; + +pinctrl: pinctrl { + compatible = "arm,mps4-pinctrl"; + status = "okay"; +}; + +``` + +- Kconfig Files + +Zephyr uses Kconfig to configure build-time features. The MPS4 platform uses three Kconfig-related files: + +- Kconfig.mps4 +- Kconfig.defconfig +- Kconfig + +Kconfig.mps4 is the base configuration, it selects the SoC series and the specific SoC variant. + +```kconfig.mps4 +config BOARD_MPS4 + select SOC_SERIES_MPS4 + select SOC_MPS4_CORSTONE315 if BOARD_MPS4_CORSTONE315_FVP || BOARD_MPS4_CORSTONE315_FVP_NS + select SOC_MPS4_CORSTONE320 if BOARD_MPS4_CORSTONE320_FVP || BOARD_MPS4_CORSTONE320_FVP_NS || BOARD_MPS4_CORSTONE320_FPGA + +``` + +Kconfig.defconfig and Kconfig are to provide default values for features and drivers that your board requires. + +```kconfig.defconfig +if BOARD_MPS4_CORSTONE315_FVP || BOARD_MPS4_CORSTONE320_FVP || BOARD_MPS4_CORSTONE320_FPGA + +config UART_INTERRUPT_DRIVEN + default y # 串口默认启用中断驱动 + +config ROMSTART_REGION_ADDRESS + default $(dt_nodelabel_reg_addr_hex,rom) if BOARD_MPS4_CORSTONE320_FPGA + default $(dt_nodelabel_reg_addr_hex,itcm) + +config ROMSTART_REGION_SIZE + default $(dt_nodelabel_reg_size_hex,rom,0,k) if BOARD_MPS4_CORSTONE320_FPGA + default $(dt_nodelabel_reg_size_hex,itcm,0,k) + +``` + +The mps4_corstone320_fpga_defconfig file is a Kconfig fragment that Zephyr merges into the final .config when you build an application for this board. The following example enables TrustZone, MPU support, GPIO, and console over UART, and it builds a Secure image that relocates the ROM start region. + +```kconfig +CONFIG_RUNTIME_NMI=y +CONFIG_ARM_TRUSTZONE_M=y +CONFIG_ARM_MPU=y + +# GPIOs +CONFIG_GPIO=y + +# Serial +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y +CONFIG_SERIAL=y + +# Build a Secure firmware image +CONFIG_TRUSTED_EXECUTION_SECURE=y +# ROMSTART_REGION address and size are defined in Kconfig.defconfig +CONFIG_ROMSTART_RELOCATION_ROM=y + +``` + diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/how-to-3.md b/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/how-to-3.md new file mode 100644 index 0000000000..2bcd25b6e0 --- /dev/null +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/how-to-3.md @@ -0,0 +1,55 @@ +--- +title: Build and run the hello_world sample for CS320 MPS4 platform +weight: 4 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Build the hello_world sample for MPS4 + +The Zephyr hello_world sample prints “Hello World” to the console. Use it to validate that your board support and toolchain configuration work. + +1. Activate your Python virtual environment for Zephyr. +2. Set the toolchain environment variables. Replace with the directory where you installed the Arm GNU Toolchain. + ```bash + export ZEPHYR_TOOLCHAIN_VARIANT=gnuarmemb + export GNUARMEMB_TOOLCHAIN_PATH=arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi-install-path/ + ``` +3. Build the sample for the Corstone-320 FPGA variant: + ```bash + west build -p always -b mps4/corstone320/fpga zephyr/samples/hello_world -- -DCONFIG_ROMSTART_RELOCATION_ROM=y + ``` +After a successful build, the output file zephyr.elf is available under build/zephyr/. The ELF image contains the application and the Zephyr kernel libraries. + +## Run the application on the MPS4 board +1. Download the board files from [FI101](https://developer.arm.com/downloads/view/FI101?sortBy=availableBy&revision=r1p0-00eac0-2), +2. Set up the MPS4 platform according to the [Using the FI101 on MPS4 board](https://developer.arm.com/documentation/109762/0100/?lang=en). + +For the hello_world application, place the vector table in the FPGA boot ROM at address 0x11000000, and place the remaining code and data in SRAM at address 0x31000000. Create vector.bin and app.bin from zephyr.elf by using arm-none-eabi-objcopy. + +Update images.txt under /MB/HBI0376B/FI101 to load the two images: + + ``` +IMAGE0PORT: 2 +IMAGE0ADDRESS: 0x00_1100_0000 ; Address to load into +IMAGE0UPDATE: RAM +IMAGE0FILE: \SOFTWARE\vector.bin ; Image/data to be loaded + +IMAGE1PORT: 1 +IMAGE1ADDRESS: 0x31000000 ; Address to load into +IMAGE1UPDATE: RAM +IMAGE1FILE: \SOFTWARE\app.bin ; Image/data to be loaded + ``` + +Copy vector.bin and app.bin to \SOFTWARE, then power on the board. +If the setup is correct, the UART console prints the “Hello World” message, similar to the following example: + + ![alt text](image.png) + +## What you accomplished +In this Learning Path, you learned +- How to explore the Corstone‑320 architecture, created board support files and configured device tree and Kconfig options to port Zephyr RTOS for the target hardware. +- How to built and run the Zephyr hello_world sample on MPS4 board. + +These steps help you further customize Zephyr on the CS320 MPS4 platform and validate a complete build-and-run workflow. diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/image.png b/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/image.png new file mode 100644 index 0000000000000000000000000000000000000000..5628bb32e6a65f0f78ef3784125f44f10749faea GIT binary patch literal 9242 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 G)c*sk2R1GM literal 0 HcmV?d00001 From 9be2e43fe1425eb5ce57abb084b5803eb9d1c4c9 Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Thu, 21 May 2026 14:03:10 -0500 Subject: [PATCH 2/2] Add Linux to operatingsystems tag --- .../embedded-and-microcontrollers/zephyr_cs320_mps4/_index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/_index.md b/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/_index.md index 6596518762..411eb97625 100644 --- a/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/_index.md +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/_index.md @@ -30,7 +30,8 @@ tools_software_languages: - GCC - C - MPS4 board - +operatingsystems: + - Linux further_reading: - resource: