From c0bc71b5325af17557117304deb122a45f5dfe89 Mon Sep 17 00:00:00 2001 From: Peter Feerick Date: Tue, 15 Sep 2026 00:48:29 +0000 Subject: [PATCH] chore(cmake): replace dfu-util with rs-dfu for STM32 flash targets dfu-util hardcoded 0x08000000 for the flash/flash-bl targets, which is wrong for H7 boards whose firmware lives in external QSPI/XSPI flash, and there was no flash target at all for boards that only produce a firmware.uf2. Switch flash/flash-bl to the rdfu CLI (already used by Companion via rs-dfu), and add a flash-uf2 target for FIRMWARE_FORMAT_UF2 boards. Confirmed on real hardware that FIRMWARE_QSPI boards (external QSPI/XSPI firmware, e.g. GX15) can only be flashed via flash-uf2: the bootloader's DFU interface doesn't expose the QSPI region as a directly-addressable segment, only reachable via the reboot sequence a UF2 write triggers - no raw-.bin flash address works there, so flash is skipped for those boards entirely. rdfu is resolved (find_program, falling back to downloading a release binary) at build time via RunRdfuCli.cmake, not at configure time, so ordinary firmware builds never touch it unless a flash target is run. Fixes #7210 Co-Authored-By: Claude Sonnet 5 --- cmake/FetchRdfuCli.cmake | 72 +++++++++++++++++++ .../{FetchRsDfu.cmake => FetchRsDfuLib.cmake} | 2 +- cmake/NativeTargets.cmake | 2 +- cmake/RunRdfuCli.cmake | 24 +++++++ radio/src/CMakeLists.txt | 33 +++++++-- tools/setup_buildenv_ubuntu22.04.sh | 1 - tools/setup_buildenv_ubuntu24.04.sh | 1 - 7 files changed, 125 insertions(+), 10 deletions(-) create mode 100644 cmake/FetchRdfuCli.cmake rename cmake/{FetchRsDfu.cmake => FetchRsDfuLib.cmake} (96%) create mode 100644 cmake/RunRdfuCli.cmake diff --git a/cmake/FetchRdfuCli.cmake b/cmake/FetchRdfuCli.cmake new file mode 100644 index 00000000000..799aa71d233 --- /dev/null +++ b/cmake/FetchRdfuCli.cmake @@ -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/-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() diff --git a/cmake/FetchRsDfu.cmake b/cmake/FetchRsDfuLib.cmake similarity index 96% rename from cmake/FetchRsDfu.cmake rename to cmake/FetchRsDfuLib.cmake index c6cce9fffff..c63c602cee2 100644 --- a/cmake/FetchRsDfu.cmake +++ b/cmake/FetchRsDfuLib.cmake @@ -1,4 +1,4 @@ -# Fetch rs_dfu +# Fetch rs_dfu C++ library for Companion cmake_minimum_required(VERSION 3.14) include(FetchContent) diff --git a/cmake/NativeTargets.cmake b/cmake/NativeTargets.cmake index 09800822cfd..41ade058c10 100644 --- a/cmake/NativeTargets.cmake +++ b/cmake/NativeTargets.cmake @@ -20,7 +20,7 @@ if(Qt6Core_FOUND AND NOT DISABLE_COMPANION) find_package(OpenSSL) - include(FetchRsDfu) + include(FetchRsDfuLib) find_package(rs_dfu REQUIRED) endif() diff --git a/cmake/RunRdfuCli.cmake b/cmake/RunRdfuCli.cmake new file mode 100644 index 00000000000..c15a200b7ba --- /dev/null +++ b/cmake/RunRdfuCli.cmake @@ -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() diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index c3b8e7bb676..dbcebbae4dd 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -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 diff --git a/tools/setup_buildenv_ubuntu22.04.sh b/tools/setup_buildenv_ubuntu22.04.sh index 9efe0d983ba..090af2c8403 100755 --- a/tools/setup_buildenv_ubuntu22.04.sh +++ b/tools/setup_buildenv_ubuntu22.04.sh @@ -84,7 +84,6 @@ sudo apt-get -y install --no-install-recommends \ clang \ libclang-dev \ python-is-python3 \ - dfu-util \ nodejs \ locales \ stlink-tools \ diff --git a/tools/setup_buildenv_ubuntu24.04.sh b/tools/setup_buildenv_ubuntu24.04.sh index 02ce986a0ee..acb02a7403e 100755 --- a/tools/setup_buildenv_ubuntu24.04.sh +++ b/tools/setup_buildenv_ubuntu24.04.sh @@ -80,7 +80,6 @@ sudo apt-get -y install --no-install-recommends \ clang \ libclang-dev \ python-is-python3 \ - dfu-util \ nodejs \ locales \ stlink-tools \