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:
co-authored by
Claude Sonnet 5
parent
4aa9a258ee
commit
850ae73cdd
@@ -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)
|
||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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 \
|
||||||
|
|||||||
@@ -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 \
|
||||||
|
|||||||
Reference in New Issue
Block a user