Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
#
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#

name: SampleX CI Verification Pipeline

on:
push:
branches: [ main, master, dev, 'feat/**' ]
pull_request:
branches: [ main, master, dev ]

jobs:
build-riscv-polarfire:
name: Build PolarFire SoC Icicle Kit (64-Bit RISC-V)
runs-on: ubuntu-24.04
timeout-minutes: 20
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Install CMake and Ninja
run: |
sudo apt-get update
sudo apt-get install -y cmake ninja-build

- name: Install Pinned xPack RISC-V GCC 14.2.0
env:
XPACK_TARBALL: xpack-riscv-none-elf-gcc-14.2.0-1-linux-x64.tar.gz
XPACK_SHA256: a5eb707595e1424ff4127cc8b21b8b8cb076e6f0070b670485e72b9f74806200
run: |
set -euo pipefail
wget -q "https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v14.2.0-1/${XPACK_TARBALL}"
echo "${XPACK_SHA256} ${XPACK_TARBALL}" | sha256sum --check --strict
mkdir -p $HOME/riscv-gcc
tar -xzf "${XPACK_TARBALL}" -C $HOME/riscv-gcc --strip-components=1
rm "${XPACK_TARBALL}"
echo "$HOME/riscv-gcc/bin" >> $GITHUB_PATH

- name: Build SampleX PolarFire Condition-Monitoring Demo
run: |
bash targets/Microchip/POLARFIRE_ICICLE_RENODE/scripts/build.sh --rebuild

- name: Verify SampleX Demo ELF
run: |
test -f targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app/polarfire_icicle_demo.elf
echo "[OK] PolarFire SampleX demo ELF verified."

- name: Archive Built PolarFire ELF
uses: actions/upload-artifact@v4
with:
name: polarfire-demo-elf
path: targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app/polarfire_icicle_demo.elf
retention-days: 1

test-polarfire-renode:
name: Headless Renode Emulation & Assertion Test
needs: build-riscv-polarfire
runs-on: ubuntu-24.04
# Backstop in case Renode itself wedges before the in-script deadline fires.
timeout-minutes: 15
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Set Up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Download Built PolarFire ELF
uses: actions/download-artifact@v4
with:
name: polarfire-demo-elf
path: targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app

- name: Install Pinned Portable Renode Emulation Environment
env:
RENODE_VERSION: 1.16.1
RENODE_SHA256: 1a532d4b5b82de0dd154970c401e0c7b0e498d17304b2cecc007e306c8f9617c
run: |
set -euo pipefail
TARBALL="renode-${RENODE_VERSION}.linux-portable.tar.gz"
wget -q "https://github.com/renode/renode/releases/download/v${RENODE_VERSION}/${TARBALL}"
echo "${RENODE_SHA256} ${TARBALL}" | sha256sum --check --strict
mkdir -p $HOME/renode
tar -xzf "${TARBALL}" -C $HOME/renode --strip-components=1
rm "${TARBALL}"
echo "$HOME/renode" >> $GITHUB_PATH

- name: Run Deterministic Headless Renode Test
run: |
python3 targets/Microchip/POLARFIRE_ICICLE_RENODE/scripts/test_renode.py
19 changes: 19 additions & 0 deletions bsp/include/bsp/board.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_BOARD_H
#define BSP_BOARD_H

/**
* @brief Initialize the system core (clocks, flash latency, system configuration).
*/
void bsp_board_init(void);

#endif /* BSP_BOARD_H */
29 changes: 29 additions & 0 deletions bsp/include/bsp/console.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_CONSOLE_H
#define BSP_CONSOLE_H

#include <stddef.h>

/**
* @brief Initialize the serial console peripheral and pin muxing.
*/
void bsp_console_init(void);

/**
* @brief Write a buffer of data to the serial console.
*
* @param data Pointer to the character buffer to send.
* @param length Number of characters to transmit.
*/
void bsp_console_write(const char *data, size_t length);

#endif /* BSP_CONSOLE_H */
34 changes: 34 additions & 0 deletions bsp/include/bsp/led.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_LED_H
#define BSP_LED_H

/**
* @brief Initialize the user LED hardware pin/peripherals.
*/
void bsp_led_init(void);

/**
* @brief Turn the user LED on.
*/
void bsp_led_on(void);

/**
* @brief Turn the user LED off.
*/
void bsp_led_off(void);

/**
* @brief Toggle the state of the user LED.
*/
void bsp_led_toggle(void);

#endif /* BSP_LED_H */
50 changes: 50 additions & 0 deletions cmake/utilities.cmake
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
# Copyright (c) Microsoft
# Copyright (c) 2024 Eclipse Foundation
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#
# Contributors:
# Microsoft - Initial version
# Frédéric Desbiens - 2024 version.

function(post_build TARGET)
if(CMAKE_C_COMPILER_ID STREQUAL "IAR")
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_IAR_ELFTOOL} --bin ${TARGET}.elf ${TARGET}.bin)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET}.elf ${TARGET}.bin
COMMAND ${CMAKE_OBJCOPY} -Oihex ${TARGET}.elf ${TARGET}.hex)
else()
message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}")
endif()
endfunction()

function(set_target_linker TARGET LINKER_SCRIPT)
if(CMAKE_C_COMPILER_ID STREQUAL "IAR")
target_link_options(${TARGET} PRIVATE --config ${LINKER_SCRIPT})
target_link_options(${TARGET} PRIVATE --map=${TARGET}.map)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_link_options(${TARGET} PRIVATE -T${LINKER_SCRIPT})
target_link_options(${TARGET} PRIVATE -Wl,-Map=${TARGET}.map)
set_target_properties(${TARGET} PROPERTIES SUFFIX ".elf")

else()
message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}")
endif()
endfunction()

macro(print_all_variables)
message(STATUS "print_all_variables------------------------------------------{")
get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
message(STATUS "${_variableName}=${${_variableName}}")
endforeach()
message(STATUS "print_all_variables------------------------------------------}")
endmacro()
67 changes: 67 additions & 0 deletions docs/architecture.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
# Eclipse ThreadX BSP Framework Architecture

This document describes the architecture, design philosophy, directory structure, and onboarding process for the reusable Board Support Package (BSP) framework.

---

## 1. Design Philosophy

The BSP framework is designed to be **additive and non-invasive**, allowing new boards to be integrated without modifying existing board implementations.

1. **Legacy Isolation**: The board directories that predate this framework (`/MXChip`, `/OpenHW`, `/STMicroelectronics`) remain completely untouched, preserving their drivers, submodules, and build systems.
2. **Platform-Independent Applications**: Target applications use only the abstract BSP interfaces and have no compile-time dependency on vendor-specific HALs, SDKs, or hardware registers.
3. **Reusable Infrastructure**: Shared CMake toolchains and build utilities are centralized under `/cmake` to eliminate duplicated build configuration across supported boards.

---

## 2. Directory Structure

```text
samplex/ (repository root)
├── libs/ # Shared RTOS components (ThreadX, NetX Duo, FileX, USBX)
├── scripts/ # Repository-wide helper scripts
├── MXChip/ # [Pre-framework] Standalone board sample
├── OpenHW/ # [Pre-framework] Standalone board sample
├── STMicroelectronics/ # [Pre-framework] Standalone board samples
├── targets/ # [Framework] Supported BSP target boards
│ └── Microchip/
│ └── POLARFIRE_ICICLE_RENODE/ # Board-specific BSP implementation & Renode target
├── bsp/ # [Framework] Abstract BSP interface definitions
│ └── include/bsp/ # board.h, led.h, console.h
├── cmake/ # [Framework] Shared CMake configuration and utilities
├── docs/ # [Framework] Architecture and onboarding documentation
└── templates/ # [Framework] Templates for onboarding new boards
```

---

## 3. BSP Interface Contract

Every board added to the framework under `/targets` must implement the abstract APIs defined in `/bsp/include/bsp/`.

### Core Board Control (`board.h`)

* `void bsp_board_init(void)`: Initializes the board, including system clocks, GPIO, and required peripherals.

### LED Control (`led.h`)

* `void bsp_led_init(void)`: Configures the board's user LED.
* `void bsp_led_on(void)`: Turns the LED on.
* `void bsp_led_off(void)`: Turns the LED off.
* `void bsp_led_toggle(void)`: Toggles the LED state.

### Serial Console (`console.h`)

* `void bsp_console_init(void)`: Initializes the default UART console.
* `void bsp_console_write(const char *data, size_t length)`: Transmits a block of data over the console interface.

---

## 4. How to Onboard a New Board

1. **Create the Target Folder**: Create a new directory under `targets/<Vendor>/<Board_Name>/` using `/templates/target/` as the starting point.
2. **Define Local Configuration**: Create a `board_config.h` file containing board-specific settings such as clock configuration, UART parameters, and ThreadX memory allocation.
3. **Implement the BSP APIs**: Implement the interfaces defined in `/bsp/include/bsp/` using the vendor SDK or direct register access.
4. **Configure CMake**: Add the board target to `CMakeLists.txt`, build the BSP as a static library, and link it with the desired application from `/apps/`.

Once a board implements the required BSP interfaces, any compatible application under `/apps` can be built for that board without modifying the application source.
41 changes: 41 additions & 0 deletions targets/Microchip/POLARFIRE_ICICLE_RENODE/CMakeLists.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
#
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#

cmake_minimum_required(VERSION 3.20)

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR riscv64)

# Set 64-bit RISC-V Cross Compiler
if(DEFINED ENV{RISCV64_TOOLCHAIN_PATH})
set(TOOLCHAIN_BIN_DIR "$ENV{RISCV64_TOOLCHAIN_PATH}/bin")
find_program(CMAKE_C_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
find_program(CMAKE_CXX_COMPILER NAMES riscv-none-elf-g++ riscv64-none-elf-g++ riscv64-unknown-elf-g++ PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
find_program(CMAKE_ASM_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
else()
find_program(CMAKE_C_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc REQUIRED)
find_program(CMAKE_CXX_COMPILER NAMES riscv-none-elf-g++ riscv64-none-elf-g++ riscv64-unknown-elf-g++ REQUIRED)
find_program(CMAKE_ASM_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc REQUIRED)
endif()

project(polarfire_icicle_renode C ASM)

# Root Directories
set(SAMPLEX_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/../../..")
set(THREADX_DIR "${SAMPLEX_ROOT_DIR}/libs/threadx")

# Architecture flags for SiFive U54 64-Bit RISC-V Core (RV64GC / lp64d)
set(RISCV_FLAGS "-march=rv64gc -mabi=lp64d -mcmodel=medany")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${RISCV_FLAGS} -O2 -g -Wall -Wextra")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${RISCV_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${RISCV_FLAGS} -T${CMAKE_CURRENT_LIST_DIR}/app/common/linker/linker.ld -nostartfiles -Wl,--gc-sections")

add_subdirectory(lib)
add_subdirectory(app)
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Added generic BSP framework and PolarFire SoC Icicle Kit target by AmmarOkla12772 · Pull Request #49 · eclipse-threadx/samplex · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
#
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#

name: SampleX CI Verification Pipeline

on:
push:
branches: [ main, master, dev, 'feat/**' ]
pull_request:
branches: [ main, master, dev ]

jobs:
build-riscv-polarfire:
name: Build PolarFire SoC Icicle Kit (64-Bit RISC-V)
runs-on: ubuntu-24.04
timeout-minutes: 20
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Install CMake and Ninja
run: |
sudo apt-get update
sudo apt-get install -y cmake ninja-build

- name: Install Pinned xPack RISC-V GCC 14.2.0
env:
XPACK_TARBALL: xpack-riscv-none-elf-gcc-14.2.0-1-linux-x64.tar.gz
XPACK_SHA256: a5eb707595e1424ff4127cc8b21b8b8cb076e6f0070b670485e72b9f74806200
run: |
set -euo pipefail
wget -q "https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v14.2.0-1/${XPACK_TARBALL}"
echo "${XPACK_SHA256} ${XPACK_TARBALL}" | sha256sum --check --strict
mkdir -p $HOME/riscv-gcc
tar -xzf "${XPACK_TARBALL}" -C $HOME/riscv-gcc --strip-components=1
rm "${XPACK_TARBALL}"
echo "$HOME/riscv-gcc/bin" >> $GITHUB_PATH

- name: Build SampleX PolarFire Condition-Monitoring Demo
run: |
bash targets/Microchip/POLARFIRE_ICICLE_RENODE/scripts/build.sh --rebuild

- name: Verify SampleX Demo ELF
run: |
test -f targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app/polarfire_icicle_demo.elf
echo "[OK] PolarFire SampleX demo ELF verified."

- name: Archive Built PolarFire ELF
uses: actions/upload-artifact@v4
with:
name: polarfire-demo-elf
path: targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app/polarfire_icicle_demo.elf
retention-days: 1

test-polarfire-renode:
name: Headless Renode Emulation & Assertion Test
needs: build-riscv-polarfire
runs-on: ubuntu-24.04
# Backstop in case Renode itself wedges before the in-script deadline fires.
timeout-minutes: 15
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Set Up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Download Built PolarFire ELF
uses: actions/download-artifact@v4
with:
name: polarfire-demo-elf
path: targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app

- name: Install Pinned Portable Renode Emulation Environment
env:
RENODE_VERSION: 1.16.1
RENODE_SHA256: 1a532d4b5b82de0dd154970c401e0c7b0e498d17304b2cecc007e306c8f9617c
run: |
set -euo pipefail
TARBALL="renode-${RENODE_VERSION}.linux-portable.tar.gz"
wget -q "https://github.com/renode/renode/releases/download/v${RENODE_VERSION}/${TARBALL}"
echo "${RENODE_SHA256} ${TARBALL}" | sha256sum --check --strict
mkdir -p $HOME/renode
tar -xzf "${TARBALL}" -C $HOME/renode --strip-components=1
rm "${TARBALL}"
echo "$HOME/renode" >> $GITHUB_PATH

- name: Run Deterministic Headless Renode Test
run: |
python3 targets/Microchip/POLARFIRE_ICICLE_RENODE/scripts/test_renode.py
19 changes: 19 additions & 0 deletions bsp/include/bsp/board.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_BOARD_H
#define BSP_BOARD_H

/**
* @brief Initialize the system core (clocks, flash latency, system configuration).
*/
void bsp_board_init(void);

#endif /* BSP_BOARD_H */
29 changes: 29 additions & 0 deletions bsp/include/bsp/console.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_CONSOLE_H
#define BSP_CONSOLE_H

#include <stddef.h>

/**
* @brief Initialize the serial console peripheral and pin muxing.
*/
void bsp_console_init(void);

/**
* @brief Write a buffer of data to the serial console.
*
* @param data Pointer to the character buffer to send.
* @param length Number of characters to transmit.
*/
void bsp_console_write(const char *data, size_t length);

#endif /* BSP_CONSOLE_H */
34 changes: 34 additions & 0 deletions bsp/include/bsp/led.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_LED_H
#define BSP_LED_H

/**
* @brief Initialize the user LED hardware pin/peripherals.
*/
void bsp_led_init(void);

/**
* @brief Turn the user LED on.
*/
void bsp_led_on(void);

/**
* @brief Turn the user LED off.
*/
void bsp_led_off(void);

/**
* @brief Toggle the state of the user LED.
*/
void bsp_led_toggle(void);

#endif /* BSP_LED_H */
50 changes: 50 additions & 0 deletions cmake/utilities.cmake
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
# Copyright (c) Microsoft
# Copyright (c) 2024 Eclipse Foundation
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#
# Contributors:
# Microsoft - Initial version
# Frédéric Desbiens - 2024 version.

function(post_build TARGET)
if(CMAKE_C_COMPILER_ID STREQUAL "IAR")
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_IAR_ELFTOOL} --bin ${TARGET}.elf ${TARGET}.bin)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET}.elf ${TARGET}.bin
COMMAND ${CMAKE_OBJCOPY} -Oihex ${TARGET}.elf ${TARGET}.hex)
else()
message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}")
endif()
endfunction()

function(set_target_linker TARGET LINKER_SCRIPT)
if(CMAKE_C_COMPILER_ID STREQUAL "IAR")
target_link_options(${TARGET} PRIVATE --config ${LINKER_SCRIPT})
target_link_options(${TARGET} PRIVATE --map=${TARGET}.map)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_link_options(${TARGET} PRIVATE -T${LINKER_SCRIPT})
target_link_options(${TARGET} PRIVATE -Wl,-Map=${TARGET}.map)
set_target_properties(${TARGET} PROPERTIES SUFFIX ".elf")

else()
message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}")
endif()
endfunction()

macro(print_all_variables)
message(STATUS "print_all_variables------------------------------------------{")
get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
message(STATUS "${_variableName}=${${_variableName}}")
endforeach()
message(STATUS "print_all_variables------------------------------------------}")
endmacro()
67 changes: 67 additions & 0 deletions docs/architecture.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
# Eclipse ThreadX BSP Framework Architecture

This document describes the architecture, design philosophy, directory structure, and onboarding process for the reusable Board Support Package (BSP) framework.

---

## 1. Design Philosophy

The BSP framework is designed to be **additive and non-invasive**, allowing new boards to be integrated without modifying existing board implementations.

1. **Legacy Isolation**: The board directories that predate this framework (`/MXChip`, `/OpenHW`, `/STMicroelectronics`) remain completely untouched, preserving their drivers, submodules, and build systems.
2. **Platform-Independent Applications**: Target applications use only the abstract BSP interfaces and have no compile-time dependency on vendor-specific HALs, SDKs, or hardware registers.
3. **Reusable Infrastructure**: Shared CMake toolchains and build utilities are centralized under `/cmake` to eliminate duplicated build configuration across supported boards.

---

## 2. Directory Structure

```text
samplex/ (repository root)
├── libs/ # Shared RTOS components (ThreadX, NetX Duo, FileX, USBX)
├── scripts/ # Repository-wide helper scripts
├── MXChip/ # [Pre-framework] Standalone board sample
├── OpenHW/ # [Pre-framework] Standalone board sample
├── STMicroelectronics/ # [Pre-framework] Standalone board samples
├── targets/ # [Framework] Supported BSP target boards
│ └── Microchip/
│ └── POLARFIRE_ICICLE_RENODE/ # Board-specific BSP implementation & Renode target
├── bsp/ # [Framework] Abstract BSP interface definitions
│ └── include/bsp/ # board.h, led.h, console.h
├── cmake/ # [Framework] Shared CMake configuration and utilities
├── docs/ # [Framework] Architecture and onboarding documentation
└── templates/ # [Framework] Templates for onboarding new boards
```

---

## 3. BSP Interface Contract

Every board added to the framework under `/targets` must implement the abstract APIs defined in `/bsp/include/bsp/`.

### Core Board Control (`board.h`)

* `void bsp_board_init(void)`: Initializes the board, including system clocks, GPIO, and required peripherals.

### LED Control (`led.h`)

* `void bsp_led_init(void)`: Configures the board's user LED.
* `void bsp_led_on(void)`: Turns the LED on.
* `void bsp_led_off(void)`: Turns the LED off.
* `void bsp_led_toggle(void)`: Toggles the LED state.

### Serial Console (`console.h`)

* `void bsp_console_init(void)`: Initializes the default UART console.
* `void bsp_console_write(const char *data, size_t length)`: Transmits a block of data over the console interface.

---

## 4. How to Onboard a New Board

1. **Create the Target Folder**: Create a new directory under `targets/<Vendor>/<Board_Name>/` using `/templates/target/` as the starting point.
2. **Define Local Configuration**: Create a `board_config.h` file containing board-specific settings such as clock configuration, UART parameters, and ThreadX memory allocation.
3. **Implement the BSP APIs**: Implement the interfaces defined in `/bsp/include/bsp/` using the vendor SDK or direct register access.
4. **Configure CMake**: Add the board target to `CMakeLists.txt`, build the BSP as a static library, and link it with the desired application from `/apps/`.

Once a board implements the required BSP interfaces, any compatible application under `/apps` can be built for that board without modifying the application source.
41 changes: 41 additions & 0 deletions targets/Microchip/POLARFIRE_ICICLE_RENODE/CMakeLists.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
#
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#

cmake_minimum_required(VERSION 3.20)

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR riscv64)

# Set 64-bit RISC-V Cross Compiler
if(DEFINED ENV{RISCV64_TOOLCHAIN_PATH})
set(TOOLCHAIN_BIN_DIR "$ENV{RISCV64_TOOLCHAIN_PATH}/bin")
find_program(CMAKE_C_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
find_program(CMAKE_CXX_COMPILER NAMES riscv-none-elf-g++ riscv64-none-elf-g++ riscv64-unknown-elf-g++ PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
find_program(CMAKE_ASM_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
else()
find_program(CMAKE_C_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc REQUIRED)
find_program(CMAKE_CXX_COMPILER NAMES riscv-none-elf-g++ riscv64-none-elf-g++ riscv64-unknown-elf-g++ REQUIRED)
find_program(CMAKE_ASM_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc REQUIRED)
endif()

project(polarfire_icicle_renode C ASM)

# Root Directories
set(SAMPLEX_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/../../..")
set(THREADX_DIR "${SAMPLEX_ROOT_DIR}/libs/threadx")

# Architecture flags for SiFive U54 64-Bit RISC-V Core (RV64GC / lp64d)
set(RISCV_FLAGS "-march=rv64gc -mabi=lp64d -mcmodel=medany")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${RISCV_FLAGS} -O2 -g -Wall -Wextra")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${RISCV_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${RISCV_FLAGS} -T${CMAKE_CURRENT_LIST_DIR}/app/common/linker/linker.ld -nostartfiles -Wl,--gc-sections")

add_subdirectory(lib)
add_subdirectory(app)
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Added generic BSP framework and PolarFire SoC Icicle Kit target by AmmarOkla12772 · Pull Request #49 · eclipse-threadx/samplex · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
#
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#

name: SampleX CI Verification Pipeline

on:
push:
branches: [ main, master, dev, 'feat/**' ]
pull_request:
branches: [ main, master, dev ]

jobs:
build-riscv-polarfire:
name: Build PolarFire SoC Icicle Kit (64-Bit RISC-V)
runs-on: ubuntu-24.04
timeout-minutes: 20
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Install CMake and Ninja
run: |
sudo apt-get update
sudo apt-get install -y cmake ninja-build

- name: Install Pinned xPack RISC-V GCC 14.2.0
env:
XPACK_TARBALL: xpack-riscv-none-elf-gcc-14.2.0-1-linux-x64.tar.gz
XPACK_SHA256: a5eb707595e1424ff4127cc8b21b8b8cb076e6f0070b670485e72b9f74806200
run: |
set -euo pipefail
wget -q "https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v14.2.0-1/${XPACK_TARBALL}"
echo "${XPACK_SHA256} ${XPACK_TARBALL}" | sha256sum --check --strict
mkdir -p $HOME/riscv-gcc
tar -xzf "${XPACK_TARBALL}" -C $HOME/riscv-gcc --strip-components=1
rm "${XPACK_TARBALL}"
echo "$HOME/riscv-gcc/bin" >> $GITHUB_PATH

- name: Build SampleX PolarFire Condition-Monitoring Demo
run: |
bash targets/Microchip/POLARFIRE_ICICLE_RENODE/scripts/build.sh --rebuild

- name: Verify SampleX Demo ELF
run: |
test -f targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app/polarfire_icicle_demo.elf
echo "[OK] PolarFire SampleX demo ELF verified."

- name: Archive Built PolarFire ELF
uses: actions/upload-artifact@v4
with:
name: polarfire-demo-elf
path: targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app/polarfire_icicle_demo.elf
retention-days: 1

test-polarfire-renode:
name: Headless Renode Emulation & Assertion Test
needs: build-riscv-polarfire
runs-on: ubuntu-24.04
# Backstop in case Renode itself wedges before the in-script deadline fires.
timeout-minutes: 15
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Set Up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Download Built PolarFire ELF
uses: actions/download-artifact@v4
with:
name: polarfire-demo-elf
path: targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app

- name: Install Pinned Portable Renode Emulation Environment
env:
RENODE_VERSION: 1.16.1
RENODE_SHA256: 1a532d4b5b82de0dd154970c401e0c7b0e498d17304b2cecc007e306c8f9617c
run: |
set -euo pipefail
TARBALL="renode-${RENODE_VERSION}.linux-portable.tar.gz"
wget -q "https://github.com/renode/renode/releases/download/v${RENODE_VERSION}/${TARBALL}"
echo "${RENODE_SHA256} ${TARBALL}" | sha256sum --check --strict
mkdir -p $HOME/renode
tar -xzf "${TARBALL}" -C $HOME/renode --strip-components=1
rm "${TARBALL}"
echo "$HOME/renode" >> $GITHUB_PATH

- name: Run Deterministic Headless Renode Test
run: |
python3 targets/Microchip/POLARFIRE_ICICLE_RENODE/scripts/test_renode.py
19 changes: 19 additions & 0 deletions bsp/include/bsp/board.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_BOARD_H
#define BSP_BOARD_H

/**
* @brief Initialize the system core (clocks, flash latency, system configuration).
*/
void bsp_board_init(void);

#endif /* BSP_BOARD_H */
29 changes: 29 additions & 0 deletions bsp/include/bsp/console.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_CONSOLE_H
#define BSP_CONSOLE_H

#include <stddef.h>

/**
* @brief Initialize the serial console peripheral and pin muxing.
*/
void bsp_console_init(void);

/**
* @brief Write a buffer of data to the serial console.
*
* @param data Pointer to the character buffer to send.
* @param length Number of characters to transmit.
*/
void bsp_console_write(const char *data, size_t length);

#endif /* BSP_CONSOLE_H */
34 changes: 34 additions & 0 deletions bsp/include/bsp/led.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_LED_H
#define BSP_LED_H

/**
* @brief Initialize the user LED hardware pin/peripherals.
*/
void bsp_led_init(void);

/**
* @brief Turn the user LED on.
*/
void bsp_led_on(void);

/**
* @brief Turn the user LED off.
*/
void bsp_led_off(void);

/**
* @brief Toggle the state of the user LED.
*/
void bsp_led_toggle(void);

#endif /* BSP_LED_H */
50 changes: 50 additions & 0 deletions cmake/utilities.cmake
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
# Copyright (c) Microsoft
# Copyright (c) 2024 Eclipse Foundation
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#
# Contributors:
# Microsoft - Initial version
# Frédéric Desbiens - 2024 version.

function(post_build TARGET)
if(CMAKE_C_COMPILER_ID STREQUAL "IAR")
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_IAR_ELFTOOL} --bin ${TARGET}.elf ${TARGET}.bin)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET}.elf ${TARGET}.bin
COMMAND ${CMAKE_OBJCOPY} -Oihex ${TARGET}.elf ${TARGET}.hex)
else()
message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}")
endif()
endfunction()

function(set_target_linker TARGET LINKER_SCRIPT)
if(CMAKE_C_COMPILER_ID STREQUAL "IAR")
target_link_options(${TARGET} PRIVATE --config ${LINKER_SCRIPT})
target_link_options(${TARGET} PRIVATE --map=${TARGET}.map)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_link_options(${TARGET} PRIVATE -T${LINKER_SCRIPT})
target_link_options(${TARGET} PRIVATE -Wl,-Map=${TARGET}.map)
set_target_properties(${TARGET} PROPERTIES SUFFIX ".elf")

else()
message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}")
endif()
endfunction()

macro(print_all_variables)
message(STATUS "print_all_variables------------------------------------------{")
get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
message(STATUS "${_variableName}=${${_variableName}}")
endforeach()
message(STATUS "print_all_variables------------------------------------------}")
endmacro()
67 changes: 67 additions & 0 deletions docs/architecture.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
# Eclipse ThreadX BSP Framework Architecture

This document describes the architecture, design philosophy, directory structure, and onboarding process for the reusable Board Support Package (BSP) framework.

---

## 1. Design Philosophy

The BSP framework is designed to be **additive and non-invasive**, allowing new boards to be integrated without modifying existing board implementations.

1. **Legacy Isolation**: The board directories that predate this framework (`/MXChip`, `/OpenHW`, `/STMicroelectronics`) remain completely untouched, preserving their drivers, submodules, and build systems.
2. **Platform-Independent Applications**: Target applications use only the abstract BSP interfaces and have no compile-time dependency on vendor-specific HALs, SDKs, or hardware registers.
3. **Reusable Infrastructure**: Shared CMake toolchains and build utilities are centralized under `/cmake` to eliminate duplicated build configuration across supported boards.

---

## 2. Directory Structure

```text
samplex/ (repository root)
├── libs/ # Shared RTOS components (ThreadX, NetX Duo, FileX, USBX)
├── scripts/ # Repository-wide helper scripts
├── MXChip/ # [Pre-framework] Standalone board sample
├── OpenHW/ # [Pre-framework] Standalone board sample
├── STMicroelectronics/ # [Pre-framework] Standalone board samples
├── targets/ # [Framework] Supported BSP target boards
│ └── Microchip/
│ └── POLARFIRE_ICICLE_RENODE/ # Board-specific BSP implementation & Renode target
├── bsp/ # [Framework] Abstract BSP interface definitions
│ └── include/bsp/ # board.h, led.h, console.h
├── cmake/ # [Framework] Shared CMake configuration and utilities
├── docs/ # [Framework] Architecture and onboarding documentation
└── templates/ # [Framework] Templates for onboarding new boards
```

---

## 3. BSP Interface Contract

Every board added to the framework under `/targets` must implement the abstract APIs defined in `/bsp/include/bsp/`.

### Core Board Control (`board.h`)

* `void bsp_board_init(void)`: Initializes the board, including system clocks, GPIO, and required peripherals.

### LED Control (`led.h`)

* `void bsp_led_init(void)`: Configures the board's user LED.
* `void bsp_led_on(void)`: Turns the LED on.
* `void bsp_led_off(void)`: Turns the LED off.
* `void bsp_led_toggle(void)`: Toggles the LED state.

### Serial Console (`console.h`)

* `void bsp_console_init(void)`: Initializes the default UART console.
* `void bsp_console_write(const char *data, size_t length)`: Transmits a block of data over the console interface.

---

## 4. How to Onboard a New Board

1. **Create the Target Folder**: Create a new directory under `targets/<Vendor>/<Board_Name>/` using `/templates/target/` as the starting point.
2. **Define Local Configuration**: Create a `board_config.h` file containing board-specific settings such as clock configuration, UART parameters, and ThreadX memory allocation.
3. **Implement the BSP APIs**: Implement the interfaces defined in `/bsp/include/bsp/` using the vendor SDK or direct register access.
4. **Configure CMake**: Add the board target to `CMakeLists.txt`, build the BSP as a static library, and link it with the desired application from `/apps/`.

Once a board implements the required BSP interfaces, any compatible application under `/apps` can be built for that board without modifying the application source.
41 changes: 41 additions & 0 deletions targets/Microchip/POLARFIRE_ICICLE_RENODE/CMakeLists.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
#
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#

cmake_minimum_required(VERSION 3.20)

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR riscv64)

# Set 64-bit RISC-V Cross Compiler
if(DEFINED ENV{RISCV64_TOOLCHAIN_PATH})
set(TOOLCHAIN_BIN_DIR "$ENV{RISCV64_TOOLCHAIN_PATH}/bin")
find_program(CMAKE_C_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
find_program(CMAKE_CXX_COMPILER NAMES riscv-none-elf-g++ riscv64-none-elf-g++ riscv64-unknown-elf-g++ PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
find_program(CMAKE_ASM_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
else()
find_program(CMAKE_C_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc REQUIRED)
find_program(CMAKE_CXX_COMPILER NAMES riscv-none-elf-g++ riscv64-none-elf-g++ riscv64-unknown-elf-g++ REQUIRED)
find_program(CMAKE_ASM_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc REQUIRED)
endif()

project(polarfire_icicle_renode C ASM)

# Root Directories
set(SAMPLEX_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/../../..")
set(THREADX_DIR "${SAMPLEX_ROOT_DIR}/libs/threadx")

# Architecture flags for SiFive U54 64-Bit RISC-V Core (RV64GC / lp64d)
set(RISCV_FLAGS "-march=rv64gc -mabi=lp64d -mcmodel=medany")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${RISCV_FLAGS} -O2 -g -Wall -Wextra")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${RISCV_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${RISCV_FLAGS} -T${CMAKE_CURRENT_LIST_DIR}/app/common/linker/linker.ld -nostartfiles -Wl,--gc-sections")

add_subdirectory(lib)
add_subdirectory(app)
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Added generic BSP framework and PolarFire SoC Icicle Kit target by AmmarOkla12772 · Pull Request #49 · eclipse-threadx/samplex · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
#
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#

name: SampleX CI Verification Pipeline

on:
push:
branches: [ main, master, dev, 'feat/**' ]
pull_request:
branches: [ main, master, dev ]

jobs:
build-riscv-polarfire:
name: Build PolarFire SoC Icicle Kit (64-Bit RISC-V)
runs-on: ubuntu-24.04
timeout-minutes: 20
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Install CMake and Ninja
run: |
sudo apt-get update
sudo apt-get install -y cmake ninja-build

- name: Install Pinned xPack RISC-V GCC 14.2.0
env:
XPACK_TARBALL: xpack-riscv-none-elf-gcc-14.2.0-1-linux-x64.tar.gz
XPACK_SHA256: a5eb707595e1424ff4127cc8b21b8b8cb076e6f0070b670485e72b9f74806200
run: |
set -euo pipefail
wget -q "https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v14.2.0-1/${XPACK_TARBALL}"
echo "${XPACK_SHA256} ${XPACK_TARBALL}" | sha256sum --check --strict
mkdir -p $HOME/riscv-gcc
tar -xzf "${XPACK_TARBALL}" -C $HOME/riscv-gcc --strip-components=1
rm "${XPACK_TARBALL}"
echo "$HOME/riscv-gcc/bin" >> $GITHUB_PATH

- name: Build SampleX PolarFire Condition-Monitoring Demo
run: |
bash targets/Microchip/POLARFIRE_ICICLE_RENODE/scripts/build.sh --rebuild

- name: Verify SampleX Demo ELF
run: |
test -f targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app/polarfire_icicle_demo.elf
echo "[OK] PolarFire SampleX demo ELF verified."

- name: Archive Built PolarFire ELF
uses: actions/upload-artifact@v4
with:
name: polarfire-demo-elf
path: targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app/polarfire_icicle_demo.elf
retention-days: 1

test-polarfire-renode:
name: Headless Renode Emulation & Assertion Test
needs: build-riscv-polarfire
runs-on: ubuntu-24.04
# Backstop in case Renode itself wedges before the in-script deadline fires.
timeout-minutes: 15
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Set Up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Download Built PolarFire ELF
uses: actions/download-artifact@v4
with:
name: polarfire-demo-elf
path: targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app

- name: Install Pinned Portable Renode Emulation Environment
env:
RENODE_VERSION: 1.16.1
RENODE_SHA256: 1a532d4b5b82de0dd154970c401e0c7b0e498d17304b2cecc007e306c8f9617c
run: |
set -euo pipefail
TARBALL="renode-${RENODE_VERSION}.linux-portable.tar.gz"
wget -q "https://github.com/renode/renode/releases/download/v${RENODE_VERSION}/${TARBALL}"
echo "${RENODE_SHA256} ${TARBALL}" | sha256sum --check --strict
mkdir -p $HOME/renode
tar -xzf "${TARBALL}" -C $HOME/renode --strip-components=1
rm "${TARBALL}"
echo "$HOME/renode" >> $GITHUB_PATH

- name: Run Deterministic Headless Renode Test
run: |
python3 targets/Microchip/POLARFIRE_ICICLE_RENODE/scripts/test_renode.py
19 changes: 19 additions & 0 deletions bsp/include/bsp/board.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_BOARD_H
#define BSP_BOARD_H

/**
* @brief Initialize the system core (clocks, flash latency, system configuration).
*/
void bsp_board_init(void);

#endif /* BSP_BOARD_H */
29 changes: 29 additions & 0 deletions bsp/include/bsp/console.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_CONSOLE_H
#define BSP_CONSOLE_H

#include <stddef.h>

/**
* @brief Initialize the serial console peripheral and pin muxing.
*/
void bsp_console_init(void);

/**
* @brief Write a buffer of data to the serial console.
*
* @param data Pointer to the character buffer to send.
* @param length Number of characters to transmit.
*/
void bsp_console_write(const char *data, size_t length);

#endif /* BSP_CONSOLE_H */
34 changes: 34 additions & 0 deletions bsp/include/bsp/led.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_LED_H
#define BSP_LED_H

/**
* @brief Initialize the user LED hardware pin/peripherals.
*/
void bsp_led_init(void);

/**
* @brief Turn the user LED on.
*/
void bsp_led_on(void);

/**
* @brief Turn the user LED off.
*/
void bsp_led_off(void);

/**
* @brief Toggle the state of the user LED.
*/
void bsp_led_toggle(void);

#endif /* BSP_LED_H */
50 changes: 50 additions & 0 deletions cmake/utilities.cmake
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
# Copyright (c) Microsoft
# Copyright (c) 2024 Eclipse Foundation
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#
# Contributors:
# Microsoft - Initial version
# Frédéric Desbiens - 2024 version.

function(post_build TARGET)
if(CMAKE_C_COMPILER_ID STREQUAL "IAR")
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_IAR_ELFTOOL} --bin ${TARGET}.elf ${TARGET}.bin)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET}.elf ${TARGET}.bin
COMMAND ${CMAKE_OBJCOPY} -Oihex ${TARGET}.elf ${TARGET}.hex)
else()
message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}")
endif()
endfunction()

function(set_target_linker TARGET LINKER_SCRIPT)
if(CMAKE_C_COMPILER_ID STREQUAL "IAR")
target_link_options(${TARGET} PRIVATE --config ${LINKER_SCRIPT})
target_link_options(${TARGET} PRIVATE --map=${TARGET}.map)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_link_options(${TARGET} PRIVATE -T${LINKER_SCRIPT})
target_link_options(${TARGET} PRIVATE -Wl,-Map=${TARGET}.map)
set_target_properties(${TARGET} PROPERTIES SUFFIX ".elf")

else()
message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}")
endif()
endfunction()

macro(print_all_variables)
message(STATUS "print_all_variables------------------------------------------{")
get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
message(STATUS "${_variableName}=${${_variableName}}")
endforeach()
message(STATUS "print_all_variables------------------------------------------}")
endmacro()
67 changes: 67 additions & 0 deletions docs/architecture.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
# Eclipse ThreadX BSP Framework Architecture

This document describes the architecture, design philosophy, directory structure, and onboarding process for the reusable Board Support Package (BSP) framework.

---

## 1. Design Philosophy

The BSP framework is designed to be **additive and non-invasive**, allowing new boards to be integrated without modifying existing board implementations.

1. **Legacy Isolation**: The board directories that predate this framework (`/MXChip`, `/OpenHW`, `/STMicroelectronics`) remain completely untouched, preserving their drivers, submodules, and build systems.
2. **Platform-Independent Applications**: Target applications use only the abstract BSP interfaces and have no compile-time dependency on vendor-specific HALs, SDKs, or hardware registers.
3. **Reusable Infrastructure**: Shared CMake toolchains and build utilities are centralized under `/cmake` to eliminate duplicated build configuration across supported boards.

---

## 2. Directory Structure

```text
samplex/ (repository root)
├── libs/ # Shared RTOS components (ThreadX, NetX Duo, FileX, USBX)
├── scripts/ # Repository-wide helper scripts
├── MXChip/ # [Pre-framework] Standalone board sample
├── OpenHW/ # [Pre-framework] Standalone board sample
├── STMicroelectronics/ # [Pre-framework] Standalone board samples
├── targets/ # [Framework] Supported BSP target boards
│ └── Microchip/
│ └── POLARFIRE_ICICLE_RENODE/ # Board-specific BSP implementation & Renode target
├── bsp/ # [Framework] Abstract BSP interface definitions
│ └── include/bsp/ # board.h, led.h, console.h
├── cmake/ # [Framework] Shared CMake configuration and utilities
├── docs/ # [Framework] Architecture and onboarding documentation
└── templates/ # [Framework] Templates for onboarding new boards
```

---

## 3. BSP Interface Contract

Every board added to the framework under `/targets` must implement the abstract APIs defined in `/bsp/include/bsp/`.

### Core Board Control (`board.h`)

* `void bsp_board_init(void)`: Initializes the board, including system clocks, GPIO, and required peripherals.

### LED Control (`led.h`)

* `void bsp_led_init(void)`: Configures the board's user LED.
* `void bsp_led_on(void)`: Turns the LED on.
* `void bsp_led_off(void)`: Turns the LED off.
* `void bsp_led_toggle(void)`: Toggles the LED state.

### Serial Console (`console.h`)

* `void bsp_console_init(void)`: Initializes the default UART console.
* `void bsp_console_write(const char *data, size_t length)`: Transmits a block of data over the console interface.

---

## 4. How to Onboard a New Board

1. **Create the Target Folder**: Create a new directory under `targets/<Vendor>/<Board_Name>/` using `/templates/target/` as the starting point.
2. **Define Local Configuration**: Create a `board_config.h` file containing board-specific settings such as clock configuration, UART parameters, and ThreadX memory allocation.
3. **Implement the BSP APIs**: Implement the interfaces defined in `/bsp/include/bsp/` using the vendor SDK or direct register access.
4. **Configure CMake**: Add the board target to `CMakeLists.txt`, build the BSP as a static library, and link it with the desired application from `/apps/`.

Once a board implements the required BSP interfaces, any compatible application under `/apps` can be built for that board without modifying the application source.
41 changes: 41 additions & 0 deletions targets/Microchip/POLARFIRE_ICICLE_RENODE/CMakeLists.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
#
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#

cmake_minimum_required(VERSION 3.20)

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR riscv64)

# Set 64-bit RISC-V Cross Compiler
if(DEFINED ENV{RISCV64_TOOLCHAIN_PATH})
set(TOOLCHAIN_BIN_DIR "$ENV{RISCV64_TOOLCHAIN_PATH}/bin")
find_program(CMAKE_C_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
find_program(CMAKE_CXX_COMPILER NAMES riscv-none-elf-g++ riscv64-none-elf-g++ riscv64-unknown-elf-g++ PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
find_program(CMAKE_ASM_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
else()
find_program(CMAKE_C_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc REQUIRED)
find_program(CMAKE_CXX_COMPILER NAMES riscv-none-elf-g++ riscv64-none-elf-g++ riscv64-unknown-elf-g++ REQUIRED)
find_program(CMAKE_ASM_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc REQUIRED)
endif()

project(polarfire_icicle_renode C ASM)

# Root Directories
set(SAMPLEX_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/../../..")
set(THREADX_DIR "${SAMPLEX_ROOT_DIR}/libs/threadx")

# Architecture flags for SiFive U54 64-Bit RISC-V Core (RV64GC / lp64d)
set(RISCV_FLAGS "-march=rv64gc -mabi=lp64d -mcmodel=medany")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${RISCV_FLAGS} -O2 -g -Wall -Wextra")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${RISCV_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${RISCV_FLAGS} -T${CMAKE_CURRENT_LIST_DIR}/app/common/linker/linker.ld -nostartfiles -Wl,--gc-sections")

add_subdirectory(lib)
add_subdirectory(app)
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Added generic BSP framework and PolarFire SoC Icicle Kit target by AmmarOkla12772 · Pull Request #49 · eclipse-threadx/samplex · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
#
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#

name: SampleX CI Verification Pipeline

on:
push:
branches: [ main, master, dev, 'feat/**' ]
pull_request:
branches: [ main, master, dev ]

jobs:
build-riscv-polarfire:
name: Build PolarFire SoC Icicle Kit (64-Bit RISC-V)
runs-on: ubuntu-24.04
timeout-minutes: 20
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Install CMake and Ninja
run: |
sudo apt-get update
sudo apt-get install -y cmake ninja-build

- name: Install Pinned xPack RISC-V GCC 14.2.0
env:
XPACK_TARBALL: xpack-riscv-none-elf-gcc-14.2.0-1-linux-x64.tar.gz
XPACK_SHA256: a5eb707595e1424ff4127cc8b21b8b8cb076e6f0070b670485e72b9f74806200
run: |
set -euo pipefail
wget -q "https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v14.2.0-1/${XPACK_TARBALL}"
echo "${XPACK_SHA256} ${XPACK_TARBALL}" | sha256sum --check --strict
mkdir -p $HOME/riscv-gcc
tar -xzf "${XPACK_TARBALL}" -C $HOME/riscv-gcc --strip-components=1
rm "${XPACK_TARBALL}"
echo "$HOME/riscv-gcc/bin" >> $GITHUB_PATH

- name: Build SampleX PolarFire Condition-Monitoring Demo
run: |
bash targets/Microchip/POLARFIRE_ICICLE_RENODE/scripts/build.sh --rebuild

- name: Verify SampleX Demo ELF
run: |
test -f targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app/polarfire_icicle_demo.elf
echo "[OK] PolarFire SampleX demo ELF verified."

- name: Archive Built PolarFire ELF
uses: actions/upload-artifact@v4
with:
name: polarfire-demo-elf
path: targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app/polarfire_icicle_demo.elf
retention-days: 1

test-polarfire-renode:
name: Headless Renode Emulation & Assertion Test
needs: build-riscv-polarfire
runs-on: ubuntu-24.04
# Backstop in case Renode itself wedges before the in-script deadline fires.
timeout-minutes: 15
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Set Up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Download Built PolarFire ELF
uses: actions/download-artifact@v4
with:
name: polarfire-demo-elf
path: targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app

- name: Install Pinned Portable Renode Emulation Environment
env:
RENODE_VERSION: 1.16.1
RENODE_SHA256: 1a532d4b5b82de0dd154970c401e0c7b0e498d17304b2cecc007e306c8f9617c
run: |
set -euo pipefail
TARBALL="renode-${RENODE_VERSION}.linux-portable.tar.gz"
wget -q "https://github.com/renode/renode/releases/download/v${RENODE_VERSION}/${TARBALL}"
echo "${RENODE_SHA256} ${TARBALL}" | sha256sum --check --strict
mkdir -p $HOME/renode
tar -xzf "${TARBALL}" -C $HOME/renode --strip-components=1
rm "${TARBALL}"
echo "$HOME/renode" >> $GITHUB_PATH

- name: Run Deterministic Headless Renode Test
run: |
python3 targets/Microchip/POLARFIRE_ICICLE_RENODE/scripts/test_renode.py
19 changes: 19 additions & 0 deletions bsp/include/bsp/board.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_BOARD_H
#define BSP_BOARD_H

/**
* @brief Initialize the system core (clocks, flash latency, system configuration).
*/
void bsp_board_init(void);

#endif /* BSP_BOARD_H */
29 changes: 29 additions & 0 deletions bsp/include/bsp/console.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_CONSOLE_H
#define BSP_CONSOLE_H

#include <stddef.h>

/**
* @brief Initialize the serial console peripheral and pin muxing.
*/
void bsp_console_init(void);

/**
* @brief Write a buffer of data to the serial console.
*
* @param data Pointer to the character buffer to send.
* @param length Number of characters to transmit.
*/
void bsp_console_write(const char *data, size_t length);

#endif /* BSP_CONSOLE_H */
34 changes: 34 additions & 0 deletions bsp/include/bsp/led.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_LED_H
#define BSP_LED_H

/**
* @brief Initialize the user LED hardware pin/peripherals.
*/
void bsp_led_init(void);

/**
* @brief Turn the user LED on.
*/
void bsp_led_on(void);

/**
* @brief Turn the user LED off.
*/
void bsp_led_off(void);

/**
* @brief Toggle the state of the user LED.
*/
void bsp_led_toggle(void);

#endif /* BSP_LED_H */
50 changes: 50 additions & 0 deletions cmake/utilities.cmake
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
# Copyright (c) Microsoft
# Copyright (c) 2024 Eclipse Foundation
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#
# Contributors:
# Microsoft - Initial version
# Frédéric Desbiens - 2024 version.

function(post_build TARGET)
if(CMAKE_C_COMPILER_ID STREQUAL "IAR")
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_IAR_ELFTOOL} --bin ${TARGET}.elf ${TARGET}.bin)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET}.elf ${TARGET}.bin
COMMAND ${CMAKE_OBJCOPY} -Oihex ${TARGET}.elf ${TARGET}.hex)
else()
message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}")
endif()
endfunction()

function(set_target_linker TARGET LINKER_SCRIPT)
if(CMAKE_C_COMPILER_ID STREQUAL "IAR")
target_link_options(${TARGET} PRIVATE --config ${LINKER_SCRIPT})
target_link_options(${TARGET} PRIVATE --map=${TARGET}.map)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_link_options(${TARGET} PRIVATE -T${LINKER_SCRIPT})
target_link_options(${TARGET} PRIVATE -Wl,-Map=${TARGET}.map)
set_target_properties(${TARGET} PROPERTIES SUFFIX ".elf")

else()
message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}")
endif()
endfunction()

macro(print_all_variables)
message(STATUS "print_all_variables------------------------------------------{")
get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
message(STATUS "${_variableName}=${${_variableName}}")
endforeach()
message(STATUS "print_all_variables------------------------------------------}")
endmacro()
67 changes: 67 additions & 0 deletions docs/architecture.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
# Eclipse ThreadX BSP Framework Architecture

This document describes the architecture, design philosophy, directory structure, and onboarding process for the reusable Board Support Package (BSP) framework.

---

## 1. Design Philosophy

The BSP framework is designed to be **additive and non-invasive**, allowing new boards to be integrated without modifying existing board implementations.

1. **Legacy Isolation**: The board directories that predate this framework (`/MXChip`, `/OpenHW`, `/STMicroelectronics`) remain completely untouched, preserving their drivers, submodules, and build systems.
2. **Platform-Independent Applications**: Target applications use only the abstract BSP interfaces and have no compile-time dependency on vendor-specific HALs, SDKs, or hardware registers.
3. **Reusable Infrastructure**: Shared CMake toolchains and build utilities are centralized under `/cmake` to eliminate duplicated build configuration across supported boards.

---

## 2. Directory Structure

```text
samplex/ (repository root)
├── libs/ # Shared RTOS components (ThreadX, NetX Duo, FileX, USBX)
├── scripts/ # Repository-wide helper scripts
├── MXChip/ # [Pre-framework] Standalone board sample
├── OpenHW/ # [Pre-framework] Standalone board sample
├── STMicroelectronics/ # [Pre-framework] Standalone board samples
├── targets/ # [Framework] Supported BSP target boards
│ └── Microchip/
│ └── POLARFIRE_ICICLE_RENODE/ # Board-specific BSP implementation & Renode target
├── bsp/ # [Framework] Abstract BSP interface definitions
│ └── include/bsp/ # board.h, led.h, console.h
├── cmake/ # [Framework] Shared CMake configuration and utilities
├── docs/ # [Framework] Architecture and onboarding documentation
└── templates/ # [Framework] Templates for onboarding new boards
```

---

## 3. BSP Interface Contract

Every board added to the framework under `/targets` must implement the abstract APIs defined in `/bsp/include/bsp/`.

### Core Board Control (`board.h`)

* `void bsp_board_init(void)`: Initializes the board, including system clocks, GPIO, and required peripherals.

### LED Control (`led.h`)

* `void bsp_led_init(void)`: Configures the board's user LED.
* `void bsp_led_on(void)`: Turns the LED on.
* `void bsp_led_off(void)`: Turns the LED off.
* `void bsp_led_toggle(void)`: Toggles the LED state.

### Serial Console (`console.h`)

* `void bsp_console_init(void)`: Initializes the default UART console.
* `void bsp_console_write(const char *data, size_t length)`: Transmits a block of data over the console interface.

---

## 4. How to Onboard a New Board

1. **Create the Target Folder**: Create a new directory under `targets/<Vendor>/<Board_Name>/` using `/templates/target/` as the starting point.
2. **Define Local Configuration**: Create a `board_config.h` file containing board-specific settings such as clock configuration, UART parameters, and ThreadX memory allocation.
3. **Implement the BSP APIs**: Implement the interfaces defined in `/bsp/include/bsp/` using the vendor SDK or direct register access.
4. **Configure CMake**: Add the board target to `CMakeLists.txt`, build the BSP as a static library, and link it with the desired application from `/apps/`.

Once a board implements the required BSP interfaces, any compatible application under `/apps` can be built for that board without modifying the application source.
41 changes: 41 additions & 0 deletions targets/Microchip/POLARFIRE_ICICLE_RENODE/CMakeLists.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
#
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#

cmake_minimum_required(VERSION 3.20)

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR riscv64)

# Set 64-bit RISC-V Cross Compiler
if(DEFINED ENV{RISCV64_TOOLCHAIN_PATH})
set(TOOLCHAIN_BIN_DIR "$ENV{RISCV64_TOOLCHAIN_PATH}/bin")
find_program(CMAKE_C_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
find_program(CMAKE_CXX_COMPILER NAMES riscv-none-elf-g++ riscv64-none-elf-g++ riscv64-unknown-elf-g++ PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
find_program(CMAKE_ASM_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
else()
find_program(CMAKE_C_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc REQUIRED)
find_program(CMAKE_CXX_COMPILER NAMES riscv-none-elf-g++ riscv64-none-elf-g++ riscv64-unknown-elf-g++ REQUIRED)
find_program(CMAKE_ASM_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc REQUIRED)
endif()

project(polarfire_icicle_renode C ASM)

# Root Directories
set(SAMPLEX_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/../../..")
set(THREADX_DIR "${SAMPLEX_ROOT_DIR}/libs/threadx")

# Architecture flags for SiFive U54 64-Bit RISC-V Core (RV64GC / lp64d)
set(RISCV_FLAGS "-march=rv64gc -mabi=lp64d -mcmodel=medany")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${RISCV_FLAGS} -O2 -g -Wall -Wextra")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${RISCV_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${RISCV_FLAGS} -T${CMAKE_CURRENT_LIST_DIR}/app/common/linker/linker.ld -nostartfiles -Wl,--gc-sections")

add_subdirectory(lib)
add_subdirectory(app)
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Added generic BSP framework and PolarFire SoC Icicle Kit target by AmmarOkla12772 · Pull Request #49 · eclipse-threadx/samplex · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
#
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#

name: SampleX CI Verification Pipeline

on:
push:
branches: [ main, master, dev, 'feat/**' ]
pull_request:
branches: [ main, master, dev ]

jobs:
build-riscv-polarfire:
name: Build PolarFire SoC Icicle Kit (64-Bit RISC-V)
runs-on: ubuntu-24.04
timeout-minutes: 20
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Install CMake and Ninja
run: |
sudo apt-get update
sudo apt-get install -y cmake ninja-build

- name: Install Pinned xPack RISC-V GCC 14.2.0
env:
XPACK_TARBALL: xpack-riscv-none-elf-gcc-14.2.0-1-linux-x64.tar.gz
XPACK_SHA256: a5eb707595e1424ff4127cc8b21b8b8cb076e6f0070b670485e72b9f74806200
run: |
set -euo pipefail
wget -q "https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v14.2.0-1/${XPACK_TARBALL}"
echo "${XPACK_SHA256} ${XPACK_TARBALL}" | sha256sum --check --strict
mkdir -p $HOME/riscv-gcc
tar -xzf "${XPACK_TARBALL}" -C $HOME/riscv-gcc --strip-components=1
rm "${XPACK_TARBALL}"
echo "$HOME/riscv-gcc/bin" >> $GITHUB_PATH

- name: Build SampleX PolarFire Condition-Monitoring Demo
run: |
bash targets/Microchip/POLARFIRE_ICICLE_RENODE/scripts/build.sh --rebuild

- name: Verify SampleX Demo ELF
run: |
test -f targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app/polarfire_icicle_demo.elf
echo "[OK] PolarFire SampleX demo ELF verified."

- name: Archive Built PolarFire ELF
uses: actions/upload-artifact@v4
with:
name: polarfire-demo-elf
path: targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app/polarfire_icicle_demo.elf
retention-days: 1

test-polarfire-renode:
name: Headless Renode Emulation & Assertion Test
needs: build-riscv-polarfire
runs-on: ubuntu-24.04
# Backstop in case Renode itself wedges before the in-script deadline fires.
timeout-minutes: 15
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Set Up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Download Built PolarFire ELF
uses: actions/download-artifact@v4
with:
name: polarfire-demo-elf
path: targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app

- name: Install Pinned Portable Renode Emulation Environment
env:
RENODE_VERSION: 1.16.1
RENODE_SHA256: 1a532d4b5b82de0dd154970c401e0c7b0e498d17304b2cecc007e306c8f9617c
run: |
set -euo pipefail
TARBALL="renode-${RENODE_VERSION}.linux-portable.tar.gz"
wget -q "https://github.com/renode/renode/releases/download/v${RENODE_VERSION}/${TARBALL}"
echo "${RENODE_SHA256} ${TARBALL}" | sha256sum --check --strict
mkdir -p $HOME/renode
tar -xzf "${TARBALL}" -C $HOME/renode --strip-components=1
rm "${TARBALL}"
echo "$HOME/renode" >> $GITHUB_PATH

- name: Run Deterministic Headless Renode Test
run: |
python3 targets/Microchip/POLARFIRE_ICICLE_RENODE/scripts/test_renode.py
19 changes: 19 additions & 0 deletions bsp/include/bsp/board.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_BOARD_H
#define BSP_BOARD_H

/**
* @brief Initialize the system core (clocks, flash latency, system configuration).
*/
void bsp_board_init(void);

#endif /* BSP_BOARD_H */
29 changes: 29 additions & 0 deletions bsp/include/bsp/console.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_CONSOLE_H
#define BSP_CONSOLE_H

#include <stddef.h>

/**
* @brief Initialize the serial console peripheral and pin muxing.
*/
void bsp_console_init(void);

/**
* @brief Write a buffer of data to the serial console.
*
* @param data Pointer to the character buffer to send.
* @param length Number of characters to transmit.
*/
void bsp_console_write(const char *data, size_t length);

#endif /* BSP_CONSOLE_H */
34 changes: 34 additions & 0 deletions bsp/include/bsp/led.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_LED_H
#define BSP_LED_H

/**
* @brief Initialize the user LED hardware pin/peripherals.
*/
void bsp_led_init(void);

/**
* @brief Turn the user LED on.
*/
void bsp_led_on(void);

/**
* @brief Turn the user LED off.
*/
void bsp_led_off(void);

/**
* @brief Toggle the state of the user LED.
*/
void bsp_led_toggle(void);

#endif /* BSP_LED_H */
50 changes: 50 additions & 0 deletions cmake/utilities.cmake
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
# Copyright (c) Microsoft
# Copyright (c) 2024 Eclipse Foundation
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#
# Contributors:
# Microsoft - Initial version
# Frédéric Desbiens - 2024 version.

function(post_build TARGET)
if(CMAKE_C_COMPILER_ID STREQUAL "IAR")
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_IAR_ELFTOOL} --bin ${TARGET}.elf ${TARGET}.bin)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET}.elf ${TARGET}.bin
COMMAND ${CMAKE_OBJCOPY} -Oihex ${TARGET}.elf ${TARGET}.hex)
else()
message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}")
endif()
endfunction()

function(set_target_linker TARGET LINKER_SCRIPT)
if(CMAKE_C_COMPILER_ID STREQUAL "IAR")
target_link_options(${TARGET} PRIVATE --config ${LINKER_SCRIPT})
target_link_options(${TARGET} PRIVATE --map=${TARGET}.map)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_link_options(${TARGET} PRIVATE -T${LINKER_SCRIPT})
target_link_options(${TARGET} PRIVATE -Wl,-Map=${TARGET}.map)
set_target_properties(${TARGET} PROPERTIES SUFFIX ".elf")

else()
message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}")
endif()
endfunction()

macro(print_all_variables)
message(STATUS "print_all_variables------------------------------------------{")
get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
message(STATUS "${_variableName}=${${_variableName}}")
endforeach()
message(STATUS "print_all_variables------------------------------------------}")
endmacro()
67 changes: 67 additions & 0 deletions docs/architecture.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
# Eclipse ThreadX BSP Framework Architecture

This document describes the architecture, design philosophy, directory structure, and onboarding process for the reusable Board Support Package (BSP) framework.

---

## 1. Design Philosophy

The BSP framework is designed to be **additive and non-invasive**, allowing new boards to be integrated without modifying existing board implementations.

1. **Legacy Isolation**: The board directories that predate this framework (`/MXChip`, `/OpenHW`, `/STMicroelectronics`) remain completely untouched, preserving their drivers, submodules, and build systems.
2. **Platform-Independent Applications**: Target applications use only the abstract BSP interfaces and have no compile-time dependency on vendor-specific HALs, SDKs, or hardware registers.
3. **Reusable Infrastructure**: Shared CMake toolchains and build utilities are centralized under `/cmake` to eliminate duplicated build configuration across supported boards.

---

## 2. Directory Structure

```text
samplex/ (repository root)
├── libs/ # Shared RTOS components (ThreadX, NetX Duo, FileX, USBX)
├── scripts/ # Repository-wide helper scripts
├── MXChip/ # [Pre-framework] Standalone board sample
├── OpenHW/ # [Pre-framework] Standalone board sample
├── STMicroelectronics/ # [Pre-framework] Standalone board samples
├── targets/ # [Framework] Supported BSP target boards
│ └── Microchip/
│ └── POLARFIRE_ICICLE_RENODE/ # Board-specific BSP implementation & Renode target
├── bsp/ # [Framework] Abstract BSP interface definitions
│ └── include/bsp/ # board.h, led.h, console.h
├── cmake/ # [Framework] Shared CMake configuration and utilities
├── docs/ # [Framework] Architecture and onboarding documentation
└── templates/ # [Framework] Templates for onboarding new boards
```

---

## 3. BSP Interface Contract

Every board added to the framework under `/targets` must implement the abstract APIs defined in `/bsp/include/bsp/`.

### Core Board Control (`board.h`)

* `void bsp_board_init(void)`: Initializes the board, including system clocks, GPIO, and required peripherals.

### LED Control (`led.h`)

* `void bsp_led_init(void)`: Configures the board's user LED.
* `void bsp_led_on(void)`: Turns the LED on.
* `void bsp_led_off(void)`: Turns the LED off.
* `void bsp_led_toggle(void)`: Toggles the LED state.

### Serial Console (`console.h`)

* `void bsp_console_init(void)`: Initializes the default UART console.
* `void bsp_console_write(const char *data, size_t length)`: Transmits a block of data over the console interface.

---

## 4. How to Onboard a New Board

1. **Create the Target Folder**: Create a new directory under `targets/<Vendor>/<Board_Name>/` using `/templates/target/` as the starting point.
2. **Define Local Configuration**: Create a `board_config.h` file containing board-specific settings such as clock configuration, UART parameters, and ThreadX memory allocation.
3. **Implement the BSP APIs**: Implement the interfaces defined in `/bsp/include/bsp/` using the vendor SDK or direct register access.
4. **Configure CMake**: Add the board target to `CMakeLists.txt`, build the BSP as a static library, and link it with the desired application from `/apps/`.

Once a board implements the required BSP interfaces, any compatible application under `/apps` can be built for that board without modifying the application source.
41 changes: 41 additions & 0 deletions targets/Microchip/POLARFIRE_ICICLE_RENODE/CMakeLists.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
#
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#

cmake_minimum_required(VERSION 3.20)

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR riscv64)

# Set 64-bit RISC-V Cross Compiler
if(DEFINED ENV{RISCV64_TOOLCHAIN_PATH})
set(TOOLCHAIN_BIN_DIR "$ENV{RISCV64_TOOLCHAIN_PATH}/bin")
find_program(CMAKE_C_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
find_program(CMAKE_CXX_COMPILER NAMES riscv-none-elf-g++ riscv64-none-elf-g++ riscv64-unknown-elf-g++ PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
find_program(CMAKE_ASM_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
else()
find_program(CMAKE_C_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc REQUIRED)
find_program(CMAKE_CXX_COMPILER NAMES riscv-none-elf-g++ riscv64-none-elf-g++ riscv64-unknown-elf-g++ REQUIRED)
find_program(CMAKE_ASM_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc REQUIRED)
endif()

project(polarfire_icicle_renode C ASM)

# Root Directories
set(SAMPLEX_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/../../..")
set(THREADX_DIR "${SAMPLEX_ROOT_DIR}/libs/threadx")

# Architecture flags for SiFive U54 64-Bit RISC-V Core (RV64GC / lp64d)
set(RISCV_FLAGS "-march=rv64gc -mabi=lp64d -mcmodel=medany")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${RISCV_FLAGS} -O2 -g -Wall -Wextra")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${RISCV_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${RISCV_FLAGS} -T${CMAKE_CURRENT_LIST_DIR}/app/common/linker/linker.ld -nostartfiles -Wl,--gc-sections")

add_subdirectory(lib)
add_subdirectory(app)
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Added generic BSP framework and PolarFire SoC Icicle Kit target by AmmarOkla12772 · Pull Request #49 · eclipse-threadx/samplex · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
#
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#

name: SampleX CI Verification Pipeline

on:
push:
branches: [ main, master, dev, 'feat/**' ]
pull_request:
branches: [ main, master, dev ]

jobs:
build-riscv-polarfire:
name: Build PolarFire SoC Icicle Kit (64-Bit RISC-V)
runs-on: ubuntu-24.04
timeout-minutes: 20
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Install CMake and Ninja
run: |
sudo apt-get update
sudo apt-get install -y cmake ninja-build

- name: Install Pinned xPack RISC-V GCC 14.2.0
env:
XPACK_TARBALL: xpack-riscv-none-elf-gcc-14.2.0-1-linux-x64.tar.gz
XPACK_SHA256: a5eb707595e1424ff4127cc8b21b8b8cb076e6f0070b670485e72b9f74806200
run: |
set -euo pipefail
wget -q "https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v14.2.0-1/${XPACK_TARBALL}"
echo "${XPACK_SHA256} ${XPACK_TARBALL}" | sha256sum --check --strict
mkdir -p $HOME/riscv-gcc
tar -xzf "${XPACK_TARBALL}" -C $HOME/riscv-gcc --strip-components=1
rm "${XPACK_TARBALL}"
echo "$HOME/riscv-gcc/bin" >> $GITHUB_PATH

- name: Build SampleX PolarFire Condition-Monitoring Demo
run: |
bash targets/Microchip/POLARFIRE_ICICLE_RENODE/scripts/build.sh --rebuild

- name: Verify SampleX Demo ELF
run: |
test -f targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app/polarfire_icicle_demo.elf
echo "[OK] PolarFire SampleX demo ELF verified."

- name: Archive Built PolarFire ELF
uses: actions/upload-artifact@v4
with:
name: polarfire-demo-elf
path: targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app/polarfire_icicle_demo.elf
retention-days: 1

test-polarfire-renode:
name: Headless Renode Emulation & Assertion Test
needs: build-riscv-polarfire
runs-on: ubuntu-24.04
# Backstop in case Renode itself wedges before the in-script deadline fires.
timeout-minutes: 15
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Set Up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Download Built PolarFire ELF
uses: actions/download-artifact@v4
with:
name: polarfire-demo-elf
path: targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app

- name: Install Pinned Portable Renode Emulation Environment
env:
RENODE_VERSION: 1.16.1
RENODE_SHA256: 1a532d4b5b82de0dd154970c401e0c7b0e498d17304b2cecc007e306c8f9617c
run: |
set -euo pipefail
TARBALL="renode-${RENODE_VERSION}.linux-portable.tar.gz"
wget -q "https://github.com/renode/renode/releases/download/v${RENODE_VERSION}/${TARBALL}"
echo "${RENODE_SHA256} ${TARBALL}" | sha256sum --check --strict
mkdir -p $HOME/renode
tar -xzf "${TARBALL}" -C $HOME/renode --strip-components=1
rm "${TARBALL}"
echo "$HOME/renode" >> $GITHUB_PATH

- name: Run Deterministic Headless Renode Test
run: |
python3 targets/Microchip/POLARFIRE_ICICLE_RENODE/scripts/test_renode.py
19 changes: 19 additions & 0 deletions bsp/include/bsp/board.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_BOARD_H
#define BSP_BOARD_H

/**
* @brief Initialize the system core (clocks, flash latency, system configuration).
*/
void bsp_board_init(void);

#endif /* BSP_BOARD_H */
29 changes: 29 additions & 0 deletions bsp/include/bsp/console.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_CONSOLE_H
#define BSP_CONSOLE_H

#include <stddef.h>

/**
* @brief Initialize the serial console peripheral and pin muxing.
*/
void bsp_console_init(void);

/**
* @brief Write a buffer of data to the serial console.
*
* @param data Pointer to the character buffer to send.
* @param length Number of characters to transmit.
*/
void bsp_console_write(const char *data, size_t length);

#endif /* BSP_CONSOLE_H */
34 changes: 34 additions & 0 deletions bsp/include/bsp/led.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_LED_H
#define BSP_LED_H

/**
* @brief Initialize the user LED hardware pin/peripherals.
*/
void bsp_led_init(void);

/**
* @brief Turn the user LED on.
*/
void bsp_led_on(void);

/**
* @brief Turn the user LED off.
*/
void bsp_led_off(void);

/**
* @brief Toggle the state of the user LED.
*/
void bsp_led_toggle(void);

#endif /* BSP_LED_H */
50 changes: 50 additions & 0 deletions cmake/utilities.cmake
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
# Copyright (c) Microsoft
# Copyright (c) 2024 Eclipse Foundation
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#
# Contributors:
# Microsoft - Initial version
# Frédéric Desbiens - 2024 version.

function(post_build TARGET)
if(CMAKE_C_COMPILER_ID STREQUAL "IAR")
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_IAR_ELFTOOL} --bin ${TARGET}.elf ${TARGET}.bin)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET}.elf ${TARGET}.bin
COMMAND ${CMAKE_OBJCOPY} -Oihex ${TARGET}.elf ${TARGET}.hex)
else()
message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}")
endif()
endfunction()

function(set_target_linker TARGET LINKER_SCRIPT)
if(CMAKE_C_COMPILER_ID STREQUAL "IAR")
target_link_options(${TARGET} PRIVATE --config ${LINKER_SCRIPT})
target_link_options(${TARGET} PRIVATE --map=${TARGET}.map)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_link_options(${TARGET} PRIVATE -T${LINKER_SCRIPT})
target_link_options(${TARGET} PRIVATE -Wl,-Map=${TARGET}.map)
set_target_properties(${TARGET} PROPERTIES SUFFIX ".elf")

else()
message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}")
endif()
endfunction()

macro(print_all_variables)
message(STATUS "print_all_variables------------------------------------------{")
get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
message(STATUS "${_variableName}=${${_variableName}}")
endforeach()
message(STATUS "print_all_variables------------------------------------------}")
endmacro()
67 changes: 67 additions & 0 deletions docs/architecture.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
# Eclipse ThreadX BSP Framework Architecture

This document describes the architecture, design philosophy, directory structure, and onboarding process for the reusable Board Support Package (BSP) framework.

---

## 1. Design Philosophy

The BSP framework is designed to be **additive and non-invasive**, allowing new boards to be integrated without modifying existing board implementations.

1. **Legacy Isolation**: The board directories that predate this framework (`/MXChip`, `/OpenHW`, `/STMicroelectronics`) remain completely untouched, preserving their drivers, submodules, and build systems.
2. **Platform-Independent Applications**: Target applications use only the abstract BSP interfaces and have no compile-time dependency on vendor-specific HALs, SDKs, or hardware registers.
3. **Reusable Infrastructure**: Shared CMake toolchains and build utilities are centralized under `/cmake` to eliminate duplicated build configuration across supported boards.

---

## 2. Directory Structure

```text
samplex/ (repository root)
├── libs/ # Shared RTOS components (ThreadX, NetX Duo, FileX, USBX)
├── scripts/ # Repository-wide helper scripts
├── MXChip/ # [Pre-framework] Standalone board sample
├── OpenHW/ # [Pre-framework] Standalone board sample
├── STMicroelectronics/ # [Pre-framework] Standalone board samples
├── targets/ # [Framework] Supported BSP target boards
│ └── Microchip/
│ └── POLARFIRE_ICICLE_RENODE/ # Board-specific BSP implementation & Renode target
├── bsp/ # [Framework] Abstract BSP interface definitions
│ └── include/bsp/ # board.h, led.h, console.h
├── cmake/ # [Framework] Shared CMake configuration and utilities
├── docs/ # [Framework] Architecture and onboarding documentation
└── templates/ # [Framework] Templates for onboarding new boards
```

---

## 3. BSP Interface Contract

Every board added to the framework under `/targets` must implement the abstract APIs defined in `/bsp/include/bsp/`.

### Core Board Control (`board.h`)

* `void bsp_board_init(void)`: Initializes the board, including system clocks, GPIO, and required peripherals.

### LED Control (`led.h`)

* `void bsp_led_init(void)`: Configures the board's user LED.
* `void bsp_led_on(void)`: Turns the LED on.
* `void bsp_led_off(void)`: Turns the LED off.
* `void bsp_led_toggle(void)`: Toggles the LED state.

### Serial Console (`console.h`)

* `void bsp_console_init(void)`: Initializes the default UART console.
* `void bsp_console_write(const char *data, size_t length)`: Transmits a block of data over the console interface.

---

## 4. How to Onboard a New Board

1. **Create the Target Folder**: Create a new directory under `targets/<Vendor>/<Board_Name>/` using `/templates/target/` as the starting point.
2. **Define Local Configuration**: Create a `board_config.h` file containing board-specific settings such as clock configuration, UART parameters, and ThreadX memory allocation.
3. **Implement the BSP APIs**: Implement the interfaces defined in `/bsp/include/bsp/` using the vendor SDK or direct register access.
4. **Configure CMake**: Add the board target to `CMakeLists.txt`, build the BSP as a static library, and link it with the desired application from `/apps/`.

Once a board implements the required BSP interfaces, any compatible application under `/apps` can be built for that board without modifying the application source.
41 changes: 41 additions & 0 deletions targets/Microchip/POLARFIRE_ICICLE_RENODE/CMakeLists.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
#
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#

cmake_minimum_required(VERSION 3.20)

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR riscv64)

# Set 64-bit RISC-V Cross Compiler
if(DEFINED ENV{RISCV64_TOOLCHAIN_PATH})
set(TOOLCHAIN_BIN_DIR "$ENV{RISCV64_TOOLCHAIN_PATH}/bin")
find_program(CMAKE_C_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
find_program(CMAKE_CXX_COMPILER NAMES riscv-none-elf-g++ riscv64-none-elf-g++ riscv64-unknown-elf-g++ PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
find_program(CMAKE_ASM_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
else()
find_program(CMAKE_C_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc REQUIRED)
find_program(CMAKE_CXX_COMPILER NAMES riscv-none-elf-g++ riscv64-none-elf-g++ riscv64-unknown-elf-g++ REQUIRED)
find_program(CMAKE_ASM_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc REQUIRED)
endif()

project(polarfire_icicle_renode C ASM)

# Root Directories
set(SAMPLEX_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/../../..")
set(THREADX_DIR "${SAMPLEX_ROOT_DIR}/libs/threadx")

# Architecture flags for SiFive U54 64-Bit RISC-V Core (RV64GC / lp64d)
set(RISCV_FLAGS "-march=rv64gc -mabi=lp64d -mcmodel=medany")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${RISCV_FLAGS} -O2 -g -Wall -Wextra")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${RISCV_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${RISCV_FLAGS} -T${CMAKE_CURRENT_LIST_DIR}/app/common/linker/linker.ld -nostartfiles -Wl,--gc-sections")

add_subdirectory(lib)
add_subdirectory(app)
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Added generic BSP framework and PolarFire SoC Icicle Kit target by AmmarOkla12772 · Pull Request #49 · eclipse-threadx/samplex · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
#
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#

name: SampleX CI Verification Pipeline

on:
push:
branches: [ main, master, dev, 'feat/**' ]
pull_request:
branches: [ main, master, dev ]

jobs:
build-riscv-polarfire:
name: Build PolarFire SoC Icicle Kit (64-Bit RISC-V)
runs-on: ubuntu-24.04
timeout-minutes: 20
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Install CMake and Ninja
run: |
sudo apt-get update
sudo apt-get install -y cmake ninja-build

- name: Install Pinned xPack RISC-V GCC 14.2.0
env:
XPACK_TARBALL: xpack-riscv-none-elf-gcc-14.2.0-1-linux-x64.tar.gz
XPACK_SHA256: a5eb707595e1424ff4127cc8b21b8b8cb076e6f0070b670485e72b9f74806200
run: |
set -euo pipefail
wget -q "https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v14.2.0-1/${XPACK_TARBALL}"
echo "${XPACK_SHA256} ${XPACK_TARBALL}" | sha256sum --check --strict
mkdir -p $HOME/riscv-gcc
tar -xzf "${XPACK_TARBALL}" -C $HOME/riscv-gcc --strip-components=1
rm "${XPACK_TARBALL}"
echo "$HOME/riscv-gcc/bin" >> $GITHUB_PATH

- name: Build SampleX PolarFire Condition-Monitoring Demo
run: |
bash targets/Microchip/POLARFIRE_ICICLE_RENODE/scripts/build.sh --rebuild

- name: Verify SampleX Demo ELF
run: |
test -f targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app/polarfire_icicle_demo.elf
echo "[OK] PolarFire SampleX demo ELF verified."

- name: Archive Built PolarFire ELF
uses: actions/upload-artifact@v4
with:
name: polarfire-demo-elf
path: targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app/polarfire_icicle_demo.elf
retention-days: 1

test-polarfire-renode:
name: Headless Renode Emulation & Assertion Test
needs: build-riscv-polarfire
runs-on: ubuntu-24.04
# Backstop in case Renode itself wedges before the in-script deadline fires.
timeout-minutes: 15
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Set Up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Download Built PolarFire ELF
uses: actions/download-artifact@v4
with:
name: polarfire-demo-elf
path: targets/Microchip/POLARFIRE_ICICLE_RENODE/build/app

- name: Install Pinned Portable Renode Emulation Environment
env:
RENODE_VERSION: 1.16.1
RENODE_SHA256: 1a532d4b5b82de0dd154970c401e0c7b0e498d17304b2cecc007e306c8f9617c
run: |
set -euo pipefail
TARBALL="renode-${RENODE_VERSION}.linux-portable.tar.gz"
wget -q "https://github.com/renode/renode/releases/download/v${RENODE_VERSION}/${TARBALL}"
echo "${RENODE_SHA256} ${TARBALL}" | sha256sum --check --strict
mkdir -p $HOME/renode
tar -xzf "${TARBALL}" -C $HOME/renode --strip-components=1
rm "${TARBALL}"
echo "$HOME/renode" >> $GITHUB_PATH

- name: Run Deterministic Headless Renode Test
run: |
python3 targets/Microchip/POLARFIRE_ICICLE_RENODE/scripts/test_renode.py
19 changes: 19 additions & 0 deletions bsp/include/bsp/board.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_BOARD_H
#define BSP_BOARD_H

/**
* @brief Initialize the system core (clocks, flash latency, system configuration).
*/
void bsp_board_init(void);

#endif /* BSP_BOARD_H */
29 changes: 29 additions & 0 deletions bsp/include/bsp/console.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_CONSOLE_H
#define BSP_CONSOLE_H

#include <stddef.h>

/**
* @brief Initialize the serial console peripheral and pin muxing.
*/
void bsp_console_init(void);

/**
* @brief Write a buffer of data to the serial console.
*
* @param data Pointer to the character buffer to send.
* @param length Number of characters to transmit.
*/
void bsp_console_write(const char *data, size_t length);

#endif /* BSP_CONSOLE_H */
34 changes: 34 additions & 0 deletions bsp/include/bsp/led.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
/*
* Copyright (c) 2026 Eclipse ThreadX contributors
*
* This program and the accompanying materials are made available
* under the terms of the MIT license which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
*/

#ifndef BSP_LED_H
#define BSP_LED_H

/**
* @brief Initialize the user LED hardware pin/peripherals.
*/
void bsp_led_init(void);

/**
* @brief Turn the user LED on.
*/
void bsp_led_on(void);

/**
* @brief Turn the user LED off.
*/
void bsp_led_off(void);

/**
* @brief Toggle the state of the user LED.
*/
void bsp_led_toggle(void);

#endif /* BSP_LED_H */
50 changes: 50 additions & 0 deletions cmake/utilities.cmake
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
# Copyright (c) Microsoft
# Copyright (c) 2024 Eclipse Foundation
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#
# Contributors:
# Microsoft - Initial version
# Frédéric Desbiens - 2024 version.

function(post_build TARGET)
if(CMAKE_C_COMPILER_ID STREQUAL "IAR")
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_IAR_ELFTOOL} --bin ${TARGET}.elf ${TARGET}.bin)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
add_custom_target(${TARGET}.bin ALL
DEPENDS ${TARGET}
COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET}.elf ${TARGET}.bin
COMMAND ${CMAKE_OBJCOPY} -Oihex ${TARGET}.elf ${TARGET}.hex)
else()
message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}")
endif()
endfunction()

function(set_target_linker TARGET LINKER_SCRIPT)
if(CMAKE_C_COMPILER_ID STREQUAL "IAR")
target_link_options(${TARGET} PRIVATE --config ${LINKER_SCRIPT})
target_link_options(${TARGET} PRIVATE --map=${TARGET}.map)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_link_options(${TARGET} PRIVATE -T${LINKER_SCRIPT})
target_link_options(${TARGET} PRIVATE -Wl,-Map=${TARGET}.map)
set_target_properties(${TARGET} PROPERTIES SUFFIX ".elf")

else()
message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}")
endif()
endfunction()

macro(print_all_variables)
message(STATUS "print_all_variables------------------------------------------{")
get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
message(STATUS "${_variableName}=${${_variableName}}")
endforeach()
message(STATUS "print_all_variables------------------------------------------}")
endmacro()
67 changes: 67 additions & 0 deletions docs/architecture.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
# Eclipse ThreadX BSP Framework Architecture

This document describes the architecture, design philosophy, directory structure, and onboarding process for the reusable Board Support Package (BSP) framework.

---

## 1. Design Philosophy

The BSP framework is designed to be **additive and non-invasive**, allowing new boards to be integrated without modifying existing board implementations.

1. **Legacy Isolation**: The board directories that predate this framework (`/MXChip`, `/OpenHW`, `/STMicroelectronics`) remain completely untouched, preserving their drivers, submodules, and build systems.
2. **Platform-Independent Applications**: Target applications use only the abstract BSP interfaces and have no compile-time dependency on vendor-specific HALs, SDKs, or hardware registers.
3. **Reusable Infrastructure**: Shared CMake toolchains and build utilities are centralized under `/cmake` to eliminate duplicated build configuration across supported boards.

---

## 2. Directory Structure

```text
samplex/ (repository root)
├── libs/ # Shared RTOS components (ThreadX, NetX Duo, FileX, USBX)
├── scripts/ # Repository-wide helper scripts
├── MXChip/ # [Pre-framework] Standalone board sample
├── OpenHW/ # [Pre-framework] Standalone board sample
├── STMicroelectronics/ # [Pre-framework] Standalone board samples
├── targets/ # [Framework] Supported BSP target boards
│ └── Microchip/
│ └── POLARFIRE_ICICLE_RENODE/ # Board-specific BSP implementation & Renode target
├── bsp/ # [Framework] Abstract BSP interface definitions
│ └── include/bsp/ # board.h, led.h, console.h
├── cmake/ # [Framework] Shared CMake configuration and utilities
├── docs/ # [Framework] Architecture and onboarding documentation
└── templates/ # [Framework] Templates for onboarding new boards
```

---

## 3. BSP Interface Contract

Every board added to the framework under `/targets` must implement the abstract APIs defined in `/bsp/include/bsp/`.

### Core Board Control (`board.h`)

* `void bsp_board_init(void)`: Initializes the board, including system clocks, GPIO, and required peripherals.

### LED Control (`led.h`)

* `void bsp_led_init(void)`: Configures the board's user LED.
* `void bsp_led_on(void)`: Turns the LED on.
* `void bsp_led_off(void)`: Turns the LED off.
* `void bsp_led_toggle(void)`: Toggles the LED state.

### Serial Console (`console.h`)

* `void bsp_console_init(void)`: Initializes the default UART console.
* `void bsp_console_write(const char *data, size_t length)`: Transmits a block of data over the console interface.

---

## 4. How to Onboard a New Board

1. **Create the Target Folder**: Create a new directory under `targets/<Vendor>/<Board_Name>/` using `/templates/target/` as the starting point.
2. **Define Local Configuration**: Create a `board_config.h` file containing board-specific settings such as clock configuration, UART parameters, and ThreadX memory allocation.
3. **Implement the BSP APIs**: Implement the interfaces defined in `/bsp/include/bsp/` using the vendor SDK or direct register access.
4. **Configure CMake**: Add the board target to `CMakeLists.txt`, build the BSP as a static library, and link it with the desired application from `/apps/`.

Once a board implements the required BSP interfaces, any compatible application under `/apps` can be built for that board without modifying the application source.
41 changes: 41 additions & 0 deletions targets/Microchip/POLARFIRE_ICICLE_RENODE/CMakeLists.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
#
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available
# under the terms of the MIT license which is available at
# https://opensource.org/licenses/MIT.
#
# SPDX-License-Identifier: MIT
#

cmake_minimum_required(VERSION 3.20)

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR riscv64)

# Set 64-bit RISC-V Cross Compiler
if(DEFINED ENV{RISCV64_TOOLCHAIN_PATH})
set(TOOLCHAIN_BIN_DIR "$ENV{RISCV64_TOOLCHAIN_PATH}/bin")
find_program(CMAKE_C_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
find_program(CMAKE_CXX_COMPILER NAMES riscv-none-elf-g++ riscv64-none-elf-g++ riscv64-unknown-elf-g++ PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
find_program(CMAKE_ASM_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc PATHS ${TOOLCHAIN_BIN_DIR} NO_DEFAULT_PATH REQUIRED)
else()
find_program(CMAKE_C_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc REQUIRED)
find_program(CMAKE_CXX_COMPILER NAMES riscv-none-elf-g++ riscv64-none-elf-g++ riscv64-unknown-elf-g++ REQUIRED)
find_program(CMAKE_ASM_COMPILER NAMES riscv-none-elf-gcc riscv64-none-elf-gcc riscv64-unknown-elf-gcc REQUIRED)
endif()

project(polarfire_icicle_renode C ASM)

# Root Directories
set(SAMPLEX_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/../../..")
set(THREADX_DIR "${SAMPLEX_ROOT_DIR}/libs/threadx")

# Architecture flags for SiFive U54 64-Bit RISC-V Core (RV64GC / lp64d)
set(RISCV_FLAGS "-march=rv64gc -mabi=lp64d -mcmodel=medany")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${RISCV_FLAGS} -O2 -g -Wall -Wextra")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${RISCV_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${RISCV_FLAGS} -T${CMAKE_CURRENT_LIST_DIR}/app/common/linker/linker.ld -nostartfiles -Wl,--gc-sections")

add_subdirectory(lib)
add_subdirectory(app)
Loading
Loading