Skip to content

Commit 9c22450

Browse files
committed
NuttX - RV32 blink_leds (QEMU) example
1 parent 1abae89 commit 9c22450

File tree

8 files changed

+533
-0
lines changed

8 files changed

+533
-0
lines changed

nuttx-riscv-blink/CMakeLists.txt

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
cmake_minimum_required(VERSION 3.14...3.30)
2+
3+
project(blink
4+
VERSION 1.0
5+
DESCRIPTION "Blink on NuttX"
6+
LANGUAGES Swift
7+
)
8+
9+
if("${CMAKE_Swift_COMPILER_VERSION}" VERSION_LESS 6.0)
10+
message(FATAL_ERROR "Swift 6.0 or later is required")
11+
endif()
12+
13+
if(POLICY CMP0169)
14+
# allow to call FetchContent_Populate directly
15+
cmake_policy(SET CMP0169 OLD)
16+
endif()
17+
18+
option(LIST_ALL_BOARDS "List all available boards" OFF)
19+
option(ENABLE_NUTTX_TRACE "Enable NuttX trace" OFF)
20+
21+
if(ENABLE_NUTTX_TRACE)
22+
set(TRACEFLAG "--trace")
23+
else()
24+
set(TRACEFLAG "")
25+
endif()
26+
27+
set(FETCHCONTENT_QUIET FALSE)
28+
include(FetchContent)
29+
FetchContent_Declare(
30+
apps
31+
GIT_REPOSITORY https://github.com/apache/nuttx-apps.git
32+
GIT_TAG nuttx-12.7.0-RC0
33+
SOURCE_DIR ${CMAKE_BINARY_DIR}/apps
34+
FIND_PACKAGE_ARGS
35+
)
36+
FetchContent_GetProperties(apps)
37+
if(NOT apps_POPULATED)
38+
FetchContent_Populate(apps)
39+
endif()
40+
41+
FetchContent_Declare(
42+
nuttx
43+
GIT_REPOSITORY https://github.com/apache/nuttx.git
44+
GIT_TAG nuttx-12.7.0-RC0
45+
SOURCE_DIR ${CMAKE_BINARY_DIR}/nuttx
46+
FIND_PACKAGE_ARGS
47+
)
48+
FetchContent_GetProperties(nuttx)
49+
if(NOT nuttx_POPULATED)
50+
FetchContent_Populate(nuttx)
51+
endif()
52+
53+
54+
if(NOT "${nuttx_SOURCE_DIR}" STREQUAL "")
55+
list(APPEND CMAKE_MODULE_PATH ${apps_SOURCE_DIR}/cmake)
56+
list(APPEND CMAKE_MODULE_PATH ${nuttx_SOURCE_DIR}/cmake)
57+
endif()
58+
59+
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
60+
set(SCRIPT_SUFFIX .bat)
61+
else()
62+
set(SCRIPT_SUFFIX .sh)
63+
endif()
64+
65+
if(LIST_ALL_BOARDS)
66+
execute_process(
67+
COMMAND ${CMAKE_COMMAND} -E chdir ${nuttx_SOURCE_DIR}
68+
${CMAKE_COMMAND} -E env PATH=${nuttx_SOURCE_DIR}/tools:$ENV{PATH}
69+
${nuttx_SOURCE_DIR}/tools/configure${SCRIPT_SUFFIX} -L
70+
RESULT_VARIABLE result
71+
)
72+
if(result)
73+
message(FATAL_ERROR "Failed to run tools/configure")
74+
endif()
75+
else()
76+
if(NOT DEFINED BOARD_CONFIG)
77+
message(FATAL_ERROR "Please define configuration with BOARD_CONFIG")
78+
else()
79+
message(STATUS "BOARD_CONFIG: ${BOARD_CONFIG}")
80+
endif()
81+
82+
# Send swift-blinky example to nuttx-apps path
83+
file(COPY ${CMAKE_SOURCE_DIR}/leds_swift DESTINATION ${apps_SOURCE_DIR}/examples)
84+
file(COPY ${CMAKE_SOURCE_DIR}/defconfig DESTINATION ${nuttx_SOURCE_DIR}/boards/risc-v/qemu-rv/rv-virt/configs/leds_swift)
85+
86+
add_custom_target(distclean
87+
COMMAND ${CMAKE_COMMAND} -E chdir ${nuttx_SOURCE_DIR}
88+
${CMAKE_COMMAND} -E env PATH=${nuttx_SOURCE_DIR}/tools:$ENV{PATH}
89+
make distclean
90+
COMMENT "Clean NuttX"
91+
)
92+
93+
execute_process(
94+
COMMAND ${CMAKE_COMMAND} -E chdir ${nuttx_SOURCE_DIR}
95+
${CMAKE_COMMAND} -E env PATH=${nuttx_SOURCE_DIR}/tools:$ENV{PATH}
96+
${nuttx_SOURCE_DIR}/tools/configure${SCRIPT_SUFFIX} -l ${BOARD_CONFIG}
97+
RESULT_VARIABLE result
98+
)
99+
if(result)
100+
message(FATAL_ERROR "Failed to run tools/configure")
101+
endif()
102+
103+
add_custom_target(copy_swift_example
104+
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/leds_swift ${apps_SOURCE_DIR}/examples/leds_swift
105+
COMMENT "Copying leds_swift example to nuttx-apps"
106+
)
107+
108+
add_custom_target(build_nuttx ALL
109+
COMMAND ${CMAKE_COMMAND} -E chdir ${nuttx_SOURCE_DIR}
110+
${CMAKE_COMMAND} -E env PATH=${nuttx_SOURCE_DIR}/tools:$ENV{PATH}
111+
make ${TRACEFLAG} -j ${JOB_POOLS}
112+
DEPENDS copy_swift_example
113+
COMMENT "Building NuttX"
114+
)
115+
116+
add_custom_command(
117+
TARGET build_nuttx
118+
POST_BUILD
119+
COMMAND ${CMAKE_COMMAND} -E copy ${nuttx_SOURCE_DIR}/nuttx ${CMAKE_BINARY_DIR}/nuttx.elf
120+
)
121+
122+
add_custom_target(export_nuttx
123+
COMMAND ${CMAKE_COMMAND} -E chdir ${nuttx_SOURCE_DIR}
124+
${CMAKE_COMMAND} -E env PATH=${nuttx_SOURCE_DIR}/tools:$ENV{PATH}
125+
make export
126+
COMMENT "Exporting NuttX"
127+
)
128+
129+
add_custom_target(extract_nuttx_export
130+
COMMAND ${CMAKE_COMMAND} -E tar xzf ${nuttx_SOURCE_DIR}/nuttx-export-12.7.0.tar.gz
131+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
132+
COMMAND ${CMAKE_COMMAND} -E remove ${nuttx_SOURCE_DIR}/nuttx-export-12.7.0.tar.gz
133+
DEPENDS export_nuttx
134+
COMMENT "Extracting NuttX export"
135+
)
136+
137+
add_custom_target(nuttx-libs
138+
DEPENDS build_nuttx export_nuttx extract_nuttx_export
139+
)
140+
endif()

nuttx-riscv-blink/README.md

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# Swift 6 on NuttX RTOS using CMake
2+
3+
## Description
4+
5+
Run blink rv32-blink_leds (QEMU) example on NuttX RTOS.
6+
7+
> [!NOTE]
8+
> CMake is adapted to build NuttX and NuttX-apps (Makefiles) with Swift 6.
9+
10+
## Requirements
11+
12+
- [NuttX](https://github.com/apache/nuttx) & [NuttX-apps](https://github.com/apache/nuttx-apps)
13+
- [kconfig-frontends](https://bitbucket.org/nuttx/tools)
14+
- [CMake](https://cmake.org/download/)
15+
- [QEMU](https://www.qemu.org/)
16+
- [Swift 6](https://swift.org/download/)
17+
- [RISC-V GNU Toolchain](https://github.com/riscv-collab/riscv-gnu-toolchain/releases)
18+
19+
## How to build
20+
21+
```bash
22+
# list all supported boards
23+
cmake -B build -DLIST_ALL_BOARDS=ON | less
24+
# build configuration
25+
cmake -B build -GNinja -DBOARD_CONFIG=rv-virt:leds_swift -DENABLE_NUTTX_TRACE=[ON|OFF]
26+
# build
27+
cmake --build build
28+
# clean
29+
cmake --build build -t distclean
30+
# export NuttX as library
31+
cmake --build build -t nuttx-libs
32+
```
33+
34+
- **Output**
35+
```bash
36+
qemu-system-riscv32 \
37+
-semihosting \
38+
-M virt,aclint=on \
39+
-cpu rv32 -smp 8 \
40+
-bios none \
41+
-kernel build/nuttx.elf -nographic
42+
NuttShell (NSH) NuttX-12.7.0
43+
nsh> leds_swift
44+
leds_main: led_daemon started
45+
46+
led_daemon (pid# 4): Running
47+
led_daemon: Opening /dev/userleds
48+
led_daemon: Supported LEDs 0x7
49+
led_daemon: LED set 0x1
50+
board_userled: LED 1 set to 1
51+
board_userled: LED 2 set to 0
52+
board_userled: LED 3 set to 0
53+
nsh> led_daemon: LED set 0x0
54+
board_userled: LED 1 set to 0
55+
board_userled: LED 2 set to 0
56+
board_userled: LED 3 set to 0
57+
led_daemon: LED set 0x1
58+
board_userled: LED 1 set to 1
59+
board_userled: LED 2 set to 0
60+
board_userled: LED 3 set to 0
61+
led_daemon: LED set 0x0
62+
# [...] see output in QEMU
63+
```
64+
65+
Quit from QEMU: `Ctrl-a x`
66+
67+
## References
68+
69+
- [Nuttx - Compiling with CMake](https://nuttx.apache.org/docs/latest/quickstart/compiling_cmake.html)
70+
- [NuttX - C++ Example using CMake](https://nuttx.apache.org/docs/latest/guides/cpp_cmake.html)
71+
- [NuttX - leds_rust](https://lupyuen.github.io/articles/rust6)

nuttx-riscv-blink/defconfig

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#
2+
# This file is autogenerated: PLEASE DO NOT EDIT IT.
3+
#
4+
# You can use "make menuconfig" to make any modifications to the installed .config file.
5+
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
6+
# modifications.
7+
#
8+
# CONFIG_DISABLE_OS_API is not set
9+
# CONFIG_NSH_DISABLE_LOSMART is not set
10+
CONFIG_16550_ADDRWIDTH=0
11+
CONFIG_16550_UART0=y
12+
CONFIG_16550_UART0_BASE=0x10000000
13+
CONFIG_16550_UART0_CLOCK=3686400
14+
CONFIG_16550_UART0_IRQ=37
15+
CONFIG_16550_UART0_SERIAL_CONSOLE=y
16+
CONFIG_16550_UART=y
17+
CONFIG_ARCH="risc-v"
18+
CONFIG_ARCH_BOARD="rv-virt"
19+
CONFIG_ARCH_BOARD_QEMU_RV_VIRT=y
20+
CONFIG_ARCH_CHIP="qemu-rv"
21+
# CONFIG_ARCH_CHIP_QEMU_RV64=y
22+
CONFIG_ARCH_CHIP_QEMU_RV=y
23+
CONFIG_ARCH_CHIP_QEMU_RV_ISA_A=y
24+
CONFIG_ARCH_CHIP_QEMU_RV_ISA_C=y
25+
CONFIG_ARCH_CHIP_QEMU_RV_ISA_M=y
26+
CONFIG_ARCH_INTERRUPTSTACK=2048
27+
CONFIG_ARCH_RISCV=y
28+
CONFIG_ARCH_STACKDUMP=y
29+
CONFIG_BCH=y
30+
CONFIG_BOARDCTL_POWEROFF=y
31+
CONFIG_BOARD_LATE_INITIALIZE=y
32+
CONFIG_BOARD_LOOPSPERMSEC=6366
33+
CONFIG_BUILTIN=y
34+
CONFIG_DEBUG_FEATURES=y
35+
CONFIG_DEBUG_FULLOPT=y
36+
CONFIG_DEBUG_SYMBOLS=y
37+
CONFIG_DEVICE_TREE=y
38+
CONFIG_DEV_ZERO=y
39+
CONFIG_ELF=y
40+
# CONFIG_EXAMPLES_HELLO=y
41+
CONFIG_EXAMPLES_LEDS=y
42+
CONFIG_EXAMPLES_LEDS_SWIFT=y
43+
CONFIG_FS_HOSTFS=y
44+
CONFIG_FS_PROCFS=y
45+
CONFIG_IDLETHREAD_STACKSIZE=2048
46+
CONFIG_INIT_ENTRYPOINT="nsh_main"
47+
CONFIG_INIT_STACKSIZE=3072
48+
CONFIG_LIBC_ENVPATH=y
49+
CONFIG_LIBC_EXECFUNCS=y
50+
CONFIG_LIBC_PERROR_STDOUT=y
51+
CONFIG_LIBC_STRERROR=y
52+
CONFIG_LIBM=y
53+
CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
54+
CONFIG_NSH_ARCHINIT=y
55+
CONFIG_NSH_BUILTIN_APPS=y
56+
CONFIG_NSH_FILEIOSIZE=512
57+
CONFIG_NSH_READLINE=y
58+
CONFIG_PATH_INITIAL="/system/bin"
59+
CONFIG_RAM_SIZE=33554432
60+
CONFIG_RAM_START=0x80000000
61+
CONFIG_READLINE_CMD_HISTORY=y
62+
CONFIG_RISCV_SEMIHOSTING_HOSTFS=y
63+
CONFIG_RR_INTERVAL=200
64+
CONFIG_SCHED_WAITPID=y
65+
CONFIG_SERIAL_UART_ARCH_MMIO=y
66+
CONFIG_STACK_COLORATION=y
67+
CONFIG_START_MONTH=12
68+
CONFIG_START_YEAR=2021
69+
CONFIG_SYMTAB_ORDEREDBYNAME=y
70+
CONFIG_SYSTEM_NSH=y
71+
CONFIG_SYSTEM_NSH_STACKSIZE=3072
72+
CONFIG_TESTING_GETPRIME=y
73+
CONFIG_TESTING_OSTEST=y
74+
CONFIG_USEC_PER_TICK=1000
75+
CONFIG_USERLED=y
76+
CONFIG_USERLED_LOWER=y

0 commit comments

Comments
 (0)