Skip to content

Commit 912dd66

Browse files
yashifabiobaltieri
authored andcommitted
boards: sc: Add SC-OBC module V1 support
Add initial board support for the Space Cubics SC-OBC Module V1. The hardware is based on an AMD Versal AI Edge VE2302 and a Microchip IGLOO2. This Zephyr port runs on the Versal device’s Real-Time Processing Unit (dual Arm Cortex-R5F). This commit is the first in the series and only supports the basic devices needed to run samples/hello_world and samples/philosophers. Specifically, it adds the Cortex-R5F, UARTs, and the GIC interrupt controller. Signed-off-by: Yasushi SHOJI <[email protected]>
1 parent eefebb4 commit 912dd66

File tree

18 files changed

+429
-0
lines changed

18 files changed

+429
-0
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#
2+
# Copyright (c) 2025 Space Cubics Inc.
3+
#
4+
# SPDX-License-Identifier: Apache-2.0
5+
#
6+
7+
config BOARD_SCOBC_V1
8+
select SOC_VERSAL_RPU

boards/sc/scobc_v1/board.cmake

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#
2+
# Copyright (c) 2025 Space Cubics Inc.
3+
#
4+
# SPDX-License-Identifier: Apache-2.0
5+
#
6+
7+
include(${ZEPHYR_BASE}/boards/common/xsdb.board.cmake)

boards/sc/scobc_v1/board.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
board:
2+
name: scobc_v1
3+
full_name: SC-OBC Module V1
4+
vendor: sc
5+
socs:
6+
- name: versal_rpu

boards/sc/scobc_v1/doc/index.rst

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
.. zephyr:board:: scobc_v1
2+
3+
Overview
4+
********
5+
6+
The `Space Cubics`_ OBC Module V1 (SC-OBC Module V1) is an onboard computer
7+
for space missions that require reliable real-time control and edge
8+
processing. It is built around an AMD Versal Adaptive SoC and a Microchip
9+
IGLOO2 FPGA, and is designed for harsh environments such as Earth orbit and
10+
lunar missions.
11+
12+
On the Versal side, the SC-OBC V1 leverages the device’s heterogeneous
13+
architecture, combining general-purpose processors, programmable logic, and a
14+
vector processor, to run on-orbit workloads such as object detection, image
15+
compression/segmentation, and high-speed signal processing, while keeping
16+
flight-critical tasks under Zephyr RTOS’s predictable scheduling model.
17+
18+
On the IGLOO2 side, the SC-OBC V1 uses the device as the board’s safety
19+
processor, supervising the main system, providing independent watchdog and
20+
fault-management paths, and coordinating safe-mode transitions to improve fault
21+
tolerance.
22+
23+
24+
Hardware
25+
********
26+
27+
Supported Features
28+
==================
29+
30+
.. zephyr:board-supported-hw::
31+
32+
System Clock
33+
============
34+
35+
This board provides a 50 MHz reference oscillator for clock generation. The RPU
36+
(Cortex-R5F) runs at 600 MHz by default on this board.
37+
38+
In Zephyr, the "system clock" is the kernel’s tick base. By default it’s 100 Hz
39+
for periodic-tick builds and 10 kHz (10000 Hz) for tickless builds. See
40+
:kconfig:option:`CONFIG_SYS_CLOCK_TICKS_PER_SEC` for more details.
41+
42+
43+
Serial Port
44+
===========
45+
46+
The SC-OBC Module V1 has multiple UART ports. The primary ports are routed to
47+
the FT4232H on the evaluation board, so when you connect the board to your PC
48+
with a USB Type-C cable, your development machine will enumerate them.
49+
50+
- Port A is used for JTAG.
51+
- Port B connects to UART0 via LPD MIO pin 0 (RXD) and pin 1 (TXD) on Bank 502.
52+
- Port C connects to UART1 via LPD MIO pin 4 (TXD) and pin 5 (RXD) on Bank 502.
53+
For Zephyr on Versal RPU, UART1 is selected as the default console in
54+
:file:`scobc_v1_versal_rpu.dts`. On a Linux host, the console typically
55+
appears as something like ``/dev/ttyUSB2`` (device index may vary).
56+
- Port D connects to IGLOO2.
57+
58+
59+
Programming and Debugging
60+
*************************
61+
62+
.. zephyr:board-supported-runners::
63+
64+
Flashing
65+
========
66+
67+
Here is an example for building and flashing the :zephyr:code-sample:`hello_world` application
68+
for the board:
69+
70+
.. zephyr-app-commands::
71+
:zephyr-app: samples/hello_world
72+
:board: scobc_v1
73+
:goals: flash
74+
:flash-args: --pdi /path/to/your.pdi
75+
76+
After flashing, you should see message similar to the following in the terminal:
77+
78+
.. code-block:: console
79+
80+
*** Booting Zephyr OS build v4.2.0 ***
81+
Hello World! scobc_v1/versal_rpu
82+
83+
84+
References
85+
**********
86+
87+
.. target-notes::
88+
89+
.. _Space Cubics:
90+
https://spacecubics.com/
29.4 KB
Loading
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright (c) 2025 Space Cubics Inc.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
/dts-v1/;
8+
#include <arm/xilinx/versal_rpu.dtsi>
9+
10+
/ {
11+
model = "SC-OBC Module V1 Versal Cortex-R5F";
12+
13+
chosen {
14+
zephyr,sram = &tcm;
15+
zephyr,console = &uart1;
16+
zephyr,shell-uart = &uart1;
17+
zephyr,ocm = &ocm;
18+
};
19+
};
20+
21+
&uart1 {
22+
status = "okay";
23+
current-speed = <115200>;
24+
clock-frequency = <100000000>;
25+
};
26+
27+
&uart0 {
28+
status = "okay";
29+
current-speed = <115200>;
30+
clock-frequency = <100000000>;
31+
};
32+
33+
&ttc0 {
34+
status = "okay";
35+
clock-frequency = <150000000>;
36+
};
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
identifier: scobc_v1
2+
name: SC-OC Module V1 Versal AI Edge RPU
3+
arch: arm
4+
toolchain:
5+
- zephyr
6+
vendor: sc
7+
supported:
8+
- uart
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Enable UART driver
2+
CONFIG_SERIAL=y
3+
4+
# Enable console
5+
CONFIG_CONSOLE=y
6+
CONFIG_UART_CONSOLE=y
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# Copyright (c) 2025 Advanced Micro Devices, Inc.
2+
# Copyright (c) 2025 Space Cubics Inc.
3+
#
4+
# SPDX-License-Identifier: Apache-2.0
5+
6+
proc program_pdi pdi_file {
7+
targets -set -filter {name =~ "Versal *"}
8+
after 300
9+
rst
10+
device program $pdi_file
11+
}
12+
13+
proc rpu0_core0_rst {} {
14+
targets -set -filter {name =~ "Versal *"}
15+
after 300
16+
17+
# Enable write to CRF by CRL.WPROT = 0
18+
mwr -force 0xff5e001c 0
19+
20+
# Deassert CRL.POR, AMBA, RPU1, RPU0
21+
mwr -force 0xff5e0300 0
22+
}
23+
24+
proc download_elf elf_file {
25+
targets -set -filter {name =~ "Cortex-R5 #0"}
26+
after 300
27+
stop
28+
after 1000
29+
30+
dow -force $elf_file
31+
con
32+
}
33+
34+
proc load_image args {
35+
if {[llength $args] != 2} {
36+
puts stderr "\nusage: west flash --pdi /path/to/your.pdi"
37+
puts stderr "For more details, do\n\twest flash --context -r xsdb\n"
38+
}
39+
40+
set elf_file [lindex $args 0]
41+
set pdi_file [lindex $args 1]
42+
43+
if { [info exists ::env(HW_SERVER_URL)] } {
44+
connect -url $::env(HW_SERVER_URL)
45+
} else {
46+
connect
47+
}
48+
49+
program_pdi $pdi_file
50+
51+
rpu0_core0_rst
52+
53+
download_elf $elf_file
54+
55+
exit
56+
}
57+
58+
load_image {*}$argv

dts/arm/xilinx/versal_rpu.dtsi

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright (c) 2025 Space Cubics Inc.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <mem.h>
8+
#include <freq.h>
9+
#include <arm/armv7-r.dtsi>
10+
#include <zephyr/dt-bindings/interrupt-controller/arm-gic.h>
11+
#include <amd/versal.dtsi>
12+
13+
/ {
14+
#address-cells = <1>;
15+
#size-cells = <1>;
16+
17+
cpus {
18+
#address-cells = <1>;
19+
#size-cells = <0>;
20+
21+
cpu0: cpu@0 {
22+
device_type = "cpu";
23+
compatible = "arm,cortex-r5f";
24+
reg = <0>;
25+
};
26+
};
27+
28+
tcm: memory@0 {
29+
device_type = "memory";
30+
compatible = "zephyr,memory-region", "mmio-sram";
31+
reg = <0x00000000 DT_SIZE_K(128)>;
32+
zephyr,memory-region = "TCM";
33+
};
34+
35+
soc {
36+
interrupt-parent = <&gic>;
37+
38+
gic: interrupt-controller@f9000000 {
39+
compatible = "arm,gic-v1", "arm,gic";
40+
reg = <0xf9000000 0x1000>,
41+
<0xf9001000 0x1000>;
42+
interrupt-controller;
43+
#interrupt-cells = <4>;
44+
status = "okay";
45+
};
46+
};
47+
};

0 commit comments

Comments
 (0)