chore(cmake): replace dfu-util with rs-dfu for STM32 flash targets (#7789)

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Peter Feerick
2026-09-20 12:25:06 +10:00
committed by GitHub
co-authored by Claude Sonnet 5
parent 4aa9a258ee
commit 850ae73cdd
7 changed files with 125 additions and 10 deletions
+72
View File
@@ -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()
@@ -1,4 +1,4 @@
# Fetch rs_dfu # Fetch rs_dfu C++ library for Companion
cmake_minimum_required(VERSION 3.14) cmake_minimum_required(VERSION 3.14)
include(FetchContent) include(FetchContent)
+1 -1
View File
@@ -20,7 +20,7 @@ if(Qt6Core_FOUND AND NOT DISABLE_COMPANION)
find_package(OpenSSL) find_package(OpenSSL)
include(FetchRsDfu) include(FetchRsDfuLib)
find_package(rs_dfu REQUIRED) find_package(rs_dfu REQUIRED)
endif() endif()
+24
View File
@@ -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()
+27 -6
View File
@@ -820,18 +820,39 @@ else()
endif() endif()
if(CPU_FAMILY STREQUAL STM32) if(CPU_FAMILY STREQUAL STM32)
add_custom_target(flash # FIRMWARE_QSPI boards can only be firmware-flashed via flash-uf2 below;
COMMAND dfu-util --alt 0 --dfuse-address 0x08000000:leave -d 0483:df11 -D firmware.bin # the bootloader doesn't expose external QSPI/XSPI flash as a DFU segment.
DEPENDS firmware if(NOT FIRMWARE_QSPI)
WORKING_DIRECTORY ${CMAKE_BINARY_DIR} 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 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 DEPENDS bootloader
WORKING_DIRECTORY ${CMAKE_BINARY_DIR} 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 add_custom_target(flash-jtag
COMMAND st-flash --reset write firmware.bin 0x8000000 COMMAND st-flash --reset write firmware.bin 0x8000000
DEPENDS firmware DEPENDS firmware
-1
View File
@@ -84,7 +84,6 @@ sudo apt-get -y install --no-install-recommends \
clang \ clang \
libclang-dev \ libclang-dev \
python-is-python3 \ python-is-python3 \
dfu-util \
nodejs \ nodejs \
locales \ locales \
stlink-tools \ stlink-tools \
-1
View File
@@ -80,7 +80,6 @@ sudo apt-get -y install --no-install-recommends \
clang \ clang \
libclang-dev \ libclang-dev \
python-is-python3 \ python-is-python3 \
dfu-util \
nodejs \ nodejs \
locales \ locales \
stlink-tools \ stlink-tools \