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
72 changes: 72 additions & 0 deletions cmake/FetchRdfuCli.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Resolves RDFU_EXECUTABLE, the CLI tool used by the flash/flash-bl/flash-uf2
# targets (separate from FetchRsDfuLib.cmake, Companion's rs_dfu C++ library).
cmake_minimum_required(VERSION 3.14)

find_program(RDFU_EXECUTABLE NAMES rdfu)

if(NOT RDFU_EXECUTABLE)
# Host, not target: must run on the machine invoking `make flash`.
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
set(RDFU_OS "Linux")
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
set(RDFU_OS "macOS")
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
set(RDFU_OS "Windows")
else()
message(FATAL_ERROR "rdfu: unsupported host platform '${CMAKE_HOST_SYSTEM_NAME}'")
endif()

if(RDFU_OS STREQUAL "macOS")
set(RDFU_ARCH "universal")
else()
# CMAKE_HOST_SYSTEM_PROCESSOR is empty in `cmake -P` script mode.
cmake_host_system_information(RESULT RDFU_HOST_ARCH QUERY OS_PLATFORM)
if(RDFU_HOST_ARCH MATCHES "x86_64|amd64|AMD64")
set(RDFU_ARCH "x86_64")
elseif(RDFU_HOST_ARCH MATCHES "aarch64|arm64|ARM64")
set(RDFU_ARCH "arm64")
else()
message(FATAL_ERROR "rdfu: unsupported host architecture '${RDFU_HOST_ARCH}'")
endif()
endif()

set(RDFU_EXT "")
if(RDFU_OS STREQUAL "Windows")
set(RDFU_EXT ".exe")
endif()

set(RDFU_FILENAME "rdfu-${RDFU_OS}-${RDFU_ARCH}${RDFU_EXT}")
set(RDFU_URL "https://github.com/EdgeTX/rs-dfu/releases/latest/download/${RDFU_FILENAME}")

# Manual cache (FetchContent needs a project/generator, unavailable in
# -P mode), mirroring FetchContent's _deps/<name>-src/ layout.
set(RDFU_CACHE_DIR "_deps/rdfucli-src")
set(RDFU_CACHED_PATH "${RDFU_CACHE_DIR}/${RDFU_FILENAME}")

if(NOT EXISTS "${RDFU_CACHED_PATH}")
file(MAKE_DIRECTORY "${RDFU_CACHE_DIR}")
message(STATUS "Fetching rdfu CLI tool from ${RDFU_URL}")
file(DOWNLOAD "${RDFU_URL}" "${RDFU_CACHED_PATH}" STATUS RDFU_DOWNLOAD_STATUS)

list(GET RDFU_DOWNLOAD_STATUS 0 RDFU_DOWNLOAD_CODE)
if(NOT RDFU_DOWNLOAD_CODE EQUAL 0)
list(GET RDFU_DOWNLOAD_STATUS 1 RDFU_DOWNLOAD_MSG)
file(REMOVE "${RDFU_CACHED_PATH}")
message(FATAL_ERROR "Failed to download rdfu CLI tool from ${RDFU_URL}: ${RDFU_DOWNLOAD_MSG}")
endif()

if(NOT RDFU_OS STREQUAL "Windows")
file(CHMOD "${RDFU_CACHED_PATH}" PERMISSIONS
OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE
)
endif()
endif()

file(REAL_PATH "${RDFU_CACHED_PATH}" RDFU_EXECUTABLE)
endif()

if(NOT RDFU_EXECUTABLE)
message(FATAL_ERROR "Could not find or fetch the rdfu CLI tool (see https://github.com/EdgeTX/rs-dfu)")
endif()
2 changes: 1 addition & 1 deletion cmake/FetchRsDfu.cmake → cmake/FetchRsDfuLib.cmake
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Fetch rs_dfu
# Fetch rs_dfu C++ library for Companion
cmake_minimum_required(VERSION 3.14)

include(FetchContent)
Expand Down
2 changes: 1 addition & 1 deletion cmake/NativeTargets.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ if(Qt6Core_FOUND AND NOT DISABLE_COMPANION)

find_package(OpenSSL)

include(FetchRsDfu)
include(FetchRsDfuLib)
find_package(rs_dfu REQUIRED)
endif()

Expand Down
24 changes: 24 additions & 0 deletions cmake/RunRdfuCli.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Runs rdfu for the flash/flash-bl/flash-uf2 targets in radio/src/CMakeLists.txt.
# Invoked via `cmake -P` so resolving/fetching the binary happens at build
# time, not on every configure.
#
# -D args: RDFU_SUBCOMMAND, RDFU_FILE, RDFU_VENDOR, RDFU_PRODUCT,
# RDFU_START_ADDRESS (optional, omitted for UF2 writes)
cmake_minimum_required(VERSION 3.14)

include(${CMAKE_CURRENT_LIST_DIR}/FetchRdfuCli.cmake)

set(RDFU_ARGS ${RDFU_SUBCOMMAND} --vendor ${RDFU_VENDOR} --product ${RDFU_PRODUCT})
if(DEFINED RDFU_START_ADDRESS AND NOT RDFU_START_ADDRESS STREQUAL "")
list(APPEND RDFU_ARGS --start-address ${RDFU_START_ADDRESS})
endif()
list(APPEND RDFU_ARGS ${RDFU_FILE})

execute_process(
COMMAND ${RDFU_EXECUTABLE} ${RDFU_ARGS}
RESULT_VARIABLE RDFU_RESULT
)

if(NOT RDFU_RESULT EQUAL 0)
message(FATAL_ERROR "rdfu ${RDFU_SUBCOMMAND} failed (exit code ${RDFU_RESULT})")
endif()
33 changes: 27 additions & 6 deletions radio/src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -820,18 +820,39 @@ else()
endif()

if(CPU_FAMILY STREQUAL STM32)
add_custom_target(flash
COMMAND dfu-util --alt 0 --dfuse-address 0x08000000:leave -d 0483:df11 -D firmware.bin
DEPENDS firmware
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
# FIRMWARE_QSPI boards can only be firmware-flashed via flash-uf2 below;
# the bootloader doesn't expose external QSPI/XSPI flash as a DFU segment.
if(NOT FIRMWARE_QSPI)
add_custom_target(flash
COMMAND ${CMAKE_COMMAND}
-DRDFU_SUBCOMMAND=write -DRDFU_VENDOR=0483 -DRDFU_PRODUCT=df11
-DRDFU_START_ADDRESS=0x08000000 -DRDFU_FILE=firmware.bin
-P ${CMAKE_SOURCE_DIR}/cmake/RunRdfuCli.cmake
DEPENDS firmware
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
endif()

add_custom_target(flash-bl
COMMAND dfu-util --alt 0 --dfuse-address 0x08000000:leave -d 0483:df11 -D bootloader.bin
COMMAND ${CMAKE_COMMAND}
-DRDFU_SUBCOMMAND=write -DRDFU_VENDOR=0483 -DRDFU_PRODUCT=df11
-DRDFU_START_ADDRESS=0x08000000 -DRDFU_FILE=bootloader.bin
-P ${CMAKE_SOURCE_DIR}/cmake/RunRdfuCli.cmake
DEPENDS bootloader
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)

if(FIRMWARE_FORMAT_UF2)
add_custom_target(flash-uf2
COMMAND ${CMAKE_COMMAND}
-DRDFU_SUBCOMMAND=write -DRDFU_VENDOR=0483 -DRDFU_PRODUCT=df11
-DRDFU_FILE=firmware.uf2
-P ${CMAKE_SOURCE_DIR}/cmake/RunRdfuCli.cmake
DEPENDS firmware
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
endif()

add_custom_target(flash-jtag
COMMAND st-flash --reset write firmware.bin 0x8000000
DEPENDS firmware
Expand Down
1 change: 0 additions & 1 deletion tools/setup_buildenv_ubuntu22.04.sh
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ sudo apt-get -y install --no-install-recommends \
clang \
libclang-dev \
python-is-python3 \
dfu-util \
nodejs \
locales \
stlink-tools \
Expand Down
1 change: 0 additions & 1 deletion tools/setup_buildenv_ubuntu24.04.sh
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@ sudo apt-get -y install --no-install-recommends \
clang \
libclang-dev \
python-is-python3 \
dfu-util \
nodejs \
locales \
stlink-tools \
Expand Down