Sync inav to Gitea
Make sure docs are updated / settings_md (push) Canceled after 0s
Build firmware / test (push) Canceled after 0s
Build firmware / build-SITL-Windows (push) Canceled after 0s
Build firmware / build-SITL-Mac (push) Canceled after 0s
Build firmware / build-SITL-Linux (push) Canceled after 0s
Build firmware / build-SITL-Linux-arm64 (push) Canceled after 0s
Build firmware / upload-artifacts (push) Canceled after 0s
Build firmware / build-single-target (push) Canceled after 0s
Build firmware / build (9) (push) Canceled after 0s
Build firmware / build (8) (push) Canceled after 0s
Build firmware / build (7) (push) Canceled after 0s
Build firmware / build (6) (push) Canceled after 0s
Build firmware / build (5) (push) Canceled after 0s
Build firmware / build (4) (push) Canceled after 0s
Build firmware / build (3) (push) Canceled after 0s
Build firmware / build (2) (push) Canceled after 0s
Build firmware / build (14) (push) Canceled after 0s
Build firmware / build (13) (push) Canceled after 0s
Build firmware / build (12) (push) Canceled after 0s
Build firmware / build (11) (push) Canceled after 0s
Build firmware / build (10) (push) Canceled after 0s
Build firmware / build (1) (push) Canceled after 0s
Build firmware / build (0) (push) Canceled after 0s
Build firmware / detect (push) Canceled after 0s
Build pre-release / build (push) Canceled after 0s
Build pre-release / Release (push) Canceled after 0s
Make sure docs are updated / settings_md (push) Canceled after 0s
Build firmware / test (push) Canceled after 0s
Build firmware / build-SITL-Windows (push) Canceled after 0s
Build firmware / build-SITL-Mac (push) Canceled after 0s
Build firmware / build-SITL-Linux (push) Canceled after 0s
Build firmware / build-SITL-Linux-arm64 (push) Canceled after 0s
Build firmware / upload-artifacts (push) Canceled after 0s
Build firmware / build-single-target (push) Canceled after 0s
Build firmware / build (9) (push) Canceled after 0s
Build firmware / build (8) (push) Canceled after 0s
Build firmware / build (7) (push) Canceled after 0s
Build firmware / build (6) (push) Canceled after 0s
Build firmware / build (5) (push) Canceled after 0s
Build firmware / build (4) (push) Canceled after 0s
Build firmware / build (3) (push) Canceled after 0s
Build firmware / build (2) (push) Canceled after 0s
Build firmware / build (14) (push) Canceled after 0s
Build firmware / build (13) (push) Canceled after 0s
Build firmware / build (12) (push) Canceled after 0s
Build firmware / build (11) (push) Canceled after 0s
Build firmware / build (10) (push) Canceled after 0s
Build firmware / build (1) (push) Canceled after 0s
Build firmware / build (0) (push) Canceled after 0s
Build firmware / detect (push) Canceled after 0s
Build pre-release / build (push) Canceled after 0s
Build pre-release / Release (push) Canceled after 0s
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
# - Returns a version string from Git
|
||||
#
|
||||
# These functions force a re-configure on each git commit so that you can
|
||||
# trust the values of the variables in your build system.
|
||||
#
|
||||
# get_git_head_revision(<refspecvar> <hashvar> [<additional arguments to git describe> ...])
|
||||
#
|
||||
# Returns the refspec and sha hash of the current head revision
|
||||
#
|
||||
# git_describe(<var> [<additional arguments to git describe> ...])
|
||||
#
|
||||
# Returns the results of git describe on the source tree, and adjusting
|
||||
# the output so that it tests false if an error occurs.
|
||||
#
|
||||
# git_get_exact_tag(<var> [<additional arguments to git describe> ...])
|
||||
#
|
||||
# Returns the results of git describe --exact-match on the source tree,
|
||||
# and adjusting the output so that it tests false if there was no exact
|
||||
# matching tag.
|
||||
#
|
||||
# git_local_changes(<var>)
|
||||
#
|
||||
# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes.
|
||||
# Uses the return code of "git diff-index --quiet HEAD --".
|
||||
# Does not regard untracked files.
|
||||
#
|
||||
# Requires CMake 2.6 or newer (uses the 'function' command)
|
||||
#
|
||||
# Original Author:
|
||||
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
|
||||
# http://academic.cleardefinition.com
|
||||
# Iowa State University HCI Graduate Program/VRAC
|
||||
#
|
||||
# Copyright Iowa State University 2009-2010.
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
if(__get_git_revision_description)
|
||||
return()
|
||||
endif()
|
||||
set(__get_git_revision_description YES)
|
||||
|
||||
# We must run the following at "include" time, not at function call time,
|
||||
# to find the path to this module rather than the path to a calling list file
|
||||
get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
|
||||
|
||||
function(get_git_head_revision _refspecvar _hashvar)
|
||||
set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
set(GIT_DIR "${GIT_PARENT_DIR}/.git")
|
||||
while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories
|
||||
set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}")
|
||||
get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH)
|
||||
if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT)
|
||||
# We have reached the root directory, we are not in git
|
||||
set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
|
||||
set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
set(GIT_DIR "${GIT_PARENT_DIR}/.git")
|
||||
endwhile()
|
||||
# check if this is a submodule
|
||||
if(NOT IS_DIRECTORY ${GIT_DIR})
|
||||
file(READ ${GIT_DIR} submodule)
|
||||
string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule})
|
||||
get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
|
||||
get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE)
|
||||
endif()
|
||||
if(NOT IS_DIRECTORY "${GIT_DIR}")
|
||||
file(READ ${GIT_DIR} worktree)
|
||||
string(REGEX REPLACE "gitdir: (.*)worktrees(.*)\n$" "\\1" GIT_DIR ${worktree})
|
||||
endif()
|
||||
set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
|
||||
if(NOT EXISTS "${GIT_DATA}")
|
||||
file(MAKE_DIRECTORY "${GIT_DATA}")
|
||||
endif()
|
||||
|
||||
if(NOT EXISTS "${GIT_DIR}/HEAD")
|
||||
return()
|
||||
endif()
|
||||
set(HEAD_FILE "${GIT_DATA}/HEAD")
|
||||
configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY)
|
||||
|
||||
configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in"
|
||||
"${GIT_DATA}/grabRef.cmake"
|
||||
@ONLY)
|
||||
include("${GIT_DATA}/grabRef.cmake")
|
||||
|
||||
set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE)
|
||||
set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(git_describe _var)
|
||||
if(NOT GIT_FOUND)
|
||||
find_package(Git QUIET)
|
||||
endif()
|
||||
get_git_head_revision(refspec hash)
|
||||
if(NOT GIT_FOUND)
|
||||
set(${_var} "GIT-NOTFOUND" PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(NOT hash)
|
||||
set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
|
||||
# TODO sanitize
|
||||
#if((${ARGN}" MATCHES "&&") OR
|
||||
# (ARGN MATCHES "||") OR
|
||||
# (ARGN MATCHES "\\;"))
|
||||
# message("Please report the following error to the project!")
|
||||
# message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}")
|
||||
#endif()
|
||||
|
||||
#message(STATUS "Arguments to execute_process: ${ARGN}")
|
||||
|
||||
execute_process(COMMAND
|
||||
"${GIT_EXECUTABLE}"
|
||||
describe
|
||||
${hash}
|
||||
${ARGN}
|
||||
WORKING_DIRECTORY
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
RESULT_VARIABLE
|
||||
res
|
||||
OUTPUT_VARIABLE
|
||||
out
|
||||
ERROR_QUIET
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
if(NOT res EQUAL 0)
|
||||
set(out "${out}-${res}-NOTFOUND")
|
||||
endif()
|
||||
|
||||
set(${_var} "${out}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(git_get_exact_tag _var)
|
||||
git_describe(out --exact-match ${ARGN})
|
||||
set(${_var} "${out}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(git_local_changes _var)
|
||||
if(NOT GIT_FOUND)
|
||||
find_package(Git QUIET)
|
||||
endif()
|
||||
get_git_head_revision(refspec hash)
|
||||
if(NOT GIT_FOUND)
|
||||
set(${_var} "GIT-NOTFOUND" PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(NOT hash)
|
||||
set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
|
||||
execute_process(COMMAND
|
||||
"${GIT_EXECUTABLE}"
|
||||
diff-index --quiet HEAD --
|
||||
WORKING_DIRECTORY
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
RESULT_VARIABLE
|
||||
res
|
||||
OUTPUT_VARIABLE
|
||||
out
|
||||
ERROR_QUIET
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
if(res EQUAL 0)
|
||||
set(${_var} "CLEAN" PARENT_SCOPE)
|
||||
else()
|
||||
set(${_var} "DIRTY" PARENT_SCOPE)
|
||||
endif()
|
||||
endfunction()
|
||||
@@ -0,0 +1,41 @@
|
||||
#
|
||||
# Internal file for GetGitRevisionDescription.cmake
|
||||
#
|
||||
# Requires CMake 2.6 or newer (uses the 'function' command)
|
||||
#
|
||||
# Original Author:
|
||||
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
|
||||
# http://academic.cleardefinition.com
|
||||
# Iowa State University HCI Graduate Program/VRAC
|
||||
#
|
||||
# Copyright Iowa State University 2009-2010.
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
set(HEAD_HASH)
|
||||
|
||||
file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024)
|
||||
|
||||
string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
|
||||
if(HEAD_CONTENTS MATCHES "ref")
|
||||
# named branch
|
||||
string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}")
|
||||
if(EXISTS "@GIT_DIR@/${HEAD_REF}")
|
||||
configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
|
||||
else()
|
||||
configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY)
|
||||
file(READ "@GIT_DATA@/packed-refs" PACKED_REFS)
|
||||
if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}")
|
||||
set(HEAD_HASH "${CMAKE_MATCH_1}")
|
||||
endif()
|
||||
endif()
|
||||
else()
|
||||
# detached HEAD
|
||||
configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY)
|
||||
endif()
|
||||
|
||||
if(NOT HEAD_HASH)
|
||||
file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024)
|
||||
string(STRIP "${HEAD_HASH}" HEAD_HASH)
|
||||
endif()
|
||||
@@ -0,0 +1,150 @@
|
||||
include(gcc)
|
||||
set(arm_none_eabi_triplet "arm-none-eabi")
|
||||
|
||||
# Keep version in sync with the distribution files below
|
||||
set(arm_none_eabi_gcc_version "13.2.1")
|
||||
# This is the output directory "pretty" name and URI name prefix
|
||||
set(base_dir_name "arm-gnu-toolchain-13.2.rel1")
|
||||
# This is the name inside the archive, which is no longer evincible from URI, alas
|
||||
set(archive_base_dir_name "arm-gnu-toolchain-13.2.Rel1")
|
||||
set(arm_none_eabi_base_url "https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/${base_dir_name}")
|
||||
# suffix and checksum
|
||||
set(arm_none_eabi_win32 "mingw-w64-i686-arm-none-eabi.zip" 7fd677088038cdf82f33f149e2e943ee)
|
||||
set(arm_none_eabi_linux_amd64 "x86_64-arm-none-eabi.tar.xz" 791754852f8c18ea04da7139f153a5b7)
|
||||
set(arm_none_eabi_linux_aarch64 "aarch64-arm-none-eabi.tar.xz" 5a08122e6d4caf97c6ccd1d29e62599c)
|
||||
set(arm_none_eabi_darwin_amd64 "darwin-x86_64-arm-none-eabi.tar.xz" 41d49840b0fc676d2ae35aab21a58693)
|
||||
set(arm_none_eabi_darwin_aarch64 "darwin-arm64-arm-none-eabi.tar.xz" 2c43e9d72206c1f81227b0a685df5ea6)
|
||||
|
||||
function(host_uname_machine var)
|
||||
# We need to call uname -m manually, since at the point
|
||||
# this file is included CMAKE_HOST_SYSTEM_PROCESSOR is
|
||||
# empty because we haven't called project() yet.
|
||||
execute_process(COMMAND uname -m
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
OUTPUT_VARIABLE machine)
|
||||
|
||||
set(${var} ${machine} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(arm_none_eabi_gcc_install)
|
||||
set(dist "")
|
||||
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
|
||||
set(dist ${arm_none_eabi_win32})
|
||||
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_HOST_SYSTEM_NAME STREQUAL "FreeBSD")
|
||||
if(NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
|
||||
message("-- no compiler binaries available for ${CMAKE_HOST_SYSTEM_NAME}, using Linux binaries as a fallback")
|
||||
endif()
|
||||
host_uname_machine(machine)
|
||||
# Linux returns x86_64, FreeBSD returns amd64
|
||||
if(machine STREQUAL "x86_64" OR machine STREQUAL "amd64")
|
||||
set(dist ${arm_none_eabi_linux_amd64})
|
||||
elseif(machine STREQUAL "aarch64")
|
||||
set(dist ${arm_none_eabi_linux_aarch64})
|
||||
else()
|
||||
message("-- no precompiled ${arm_none_eabi_triplet} toolchain for machine ${machine}")
|
||||
endif()
|
||||
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
|
||||
host_uname_machine(machine)
|
||||
if(machine STREQUAL "x86_64" OR machine STREQUAL "amd64")
|
||||
set(dist ${arm_none_eabi_darwin_amd64})
|
||||
elseif(machine STREQUAL "aarch64" OR machine STREQUAL "arm64")
|
||||
set(dist ${arm_none_eabi_darwin_aarch64})
|
||||
else()
|
||||
message("-- no precompiled ${arm_none_eabi_triplet} toolchain for machine ${machine}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(dist STREQUAL "")
|
||||
message(FATAL_ERROR "could not install ${arm_none_eabi_triplet}-gcc automatically")
|
||||
endif()
|
||||
list(GET dist 0 dist_suffix)
|
||||
list(GET dist 1 dist_checksum)
|
||||
set(dist_url "${arm_none_eabi_base_url}-${dist_suffix}")
|
||||
string(REPLACE "/" ";" url_parts ${dist_url})
|
||||
list(LENGTH url_parts n)
|
||||
math(EXPR last "${n} - 1")
|
||||
list(GET url_parts ${last} basename)
|
||||
set(output "${DOWNLOADS_DIR}/${basename}")
|
||||
message("-- downloading ${arm_none_eabi_triplet}-gcc ${arm_none_eabi_gcc_version} from ${dist_url}")
|
||||
file(DOWNLOAD ${dist_url} ${output}
|
||||
INACTIVITY_TIMEOUT 30
|
||||
STATUS status
|
||||
SHOW_PROGRESS
|
||||
EXPECTED_HASH MD5=${dist_checksum}
|
||||
TLS_VERIFY ON
|
||||
)
|
||||
list(GET status 0 status_code)
|
||||
if(NOT status_code EQUAL 0)
|
||||
list(GET status 1 status_message)
|
||||
message(FATAL_ERROR "error downloading ${basename}: ${status_message}")
|
||||
endif()
|
||||
message("-- extracting ${basename}")
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${TOOLS_DIR})
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf ${output}
|
||||
RESULT_VARIABLE status
|
||||
WORKING_DIRECTORY ${TOOLS_DIR}
|
||||
)
|
||||
if(NOT status EQUAL 0)
|
||||
message(FATAL_ERROR "error extracting ${basename}: ${status}")
|
||||
endif()
|
||||
string(REPLACE "." ";" url_parts ${dist_suffix})
|
||||
list(GET url_parts 0 host_dir_name)
|
||||
set(dir_name "${archive_base_dir_name}-${host_dir_name}")
|
||||
file(REMOVE_RECURSE "${TOOLS_DIR}/${base_dir_name}")
|
||||
file(RENAME "${TOOLS_DIR}/${dir_name}" "${TOOLS_DIR}/${base_dir_name}")
|
||||
# This is **somewhat ugly**
|
||||
# the newlib distributed by ARM generates suprious warnings from re-entrant POSIX functions
|
||||
# that INAV doesn't use. These "harmless" warnings can be surpressed by removing the
|
||||
# errant section from the only libnosys used by INAV ...
|
||||
# So look the other way ... while this is "fixed"
|
||||
execute_process(COMMAND arm-none-eabi-objcopy -w -R .gnu.warning.* "${TOOLS_DIR}/${base_dir_name}/arm-none-eabi/lib/thumb/v7e-m+fp/hard/libnosys.a"
|
||||
RESULT_VARIABLE status
|
||||
WORKING_DIRECTORY ${TOOLS_DIR}
|
||||
)
|
||||
if(NOT status EQUAL 0)
|
||||
message(FATAL_ERROR "error fixing libnosys.a: ${status}")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(arm_none_eabi_gcc_add_path)
|
||||
set(gcc_path "${TOOLS_DIR}/${base_dir_name}/bin")
|
||||
if(CMAKE_HOST_SYSTEM MATCHES ".*Windows.*")
|
||||
set(sep "\\;")
|
||||
else()
|
||||
set(sep ":")
|
||||
endif()
|
||||
set(ENV{PATH} "${gcc_path}${sep}$ENV{PATH}")
|
||||
endfunction()
|
||||
|
||||
function(arm_none_eabi_gcc_check)
|
||||
gcc_get_version(version
|
||||
TRIPLET ${arm_none_eabi_triplet}
|
||||
PROGRAM_NAME prog
|
||||
PROGRAM_PATH prog_path
|
||||
)
|
||||
if(NOT version)
|
||||
message("-- could not find ${prog}")
|
||||
arm_none_eabi_gcc_install()
|
||||
gcc_get_version(version
|
||||
TRIPLET ${arm_none_eabi_triplet}
|
||||
PROGRAM_NAME prog
|
||||
PROGRAM_PATH prog_path
|
||||
)
|
||||
return()
|
||||
endif()
|
||||
message("-- found ${prog} ${version} at ${prog_path}")
|
||||
if(COMPILER_VERSION_CHECK AND NOT arm_none_eabi_gcc_version STREQUAL version)
|
||||
message("-- expecting ${prog} version ${arm_none_eabi_gcc_version}, but got version ${version} instead")
|
||||
arm_none_eabi_gcc_install()
|
||||
unset(gcc CACHE)
|
||||
gcc_get_version(version
|
||||
TRIPLET ${arm_none_eabi_triplet}
|
||||
PROGRAM_NAME prog
|
||||
PROGRAM_PATH prog_path
|
||||
)
|
||||
return()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
arm_none_eabi_gcc_add_path()
|
||||
arm_none_eabi_gcc_check()
|
||||
@@ -0,0 +1,48 @@
|
||||
set(CMAKE_SYSTEM_NAME Generic)
|
||||
set(CMAKE_SYSTEM_PROCESSOR arm)
|
||||
|
||||
if(WIN32)
|
||||
set(TOOL_EXECUTABLE_SUFFIX ".exe")
|
||||
endif()
|
||||
|
||||
set(TARGET_TRIPLET "arm-none-eabi")
|
||||
|
||||
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
|
||||
set(CMAKE_ASM_COMPILER "${TARGET_TRIPLET}-gcc${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "asm compiler")
|
||||
set(CMAKE_C_COMPILER "${TARGET_TRIPLET}-gcc${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "c compiler")
|
||||
set(CMAKE_CXX_COMPILER "${TARGET_TRIPLET}-g++${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "c++ compiler")
|
||||
set(CMAKE_OBJCOPY "${TARGET_TRIPLET}-objcopy${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "objcopy tool")
|
||||
set(CMAKE_OBJDUMP "${TARGET_TRIPLET}-objdump${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "objdump tool")
|
||||
set(CMAKE_SIZE "${TARGET_TRIPLET}-size${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "size tool")
|
||||
set(CMAKE_DEBUGGER "${TARGET_TRIPLET}-gdb${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "debugger")
|
||||
set(CMAKE_CPPFILT "${TARGET_TRIPLET}-c++filt${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "c++filt")
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||
set(CMAKE_EXECUTABLE_SUFFIX ".elf")
|
||||
|
||||
if(NOT CMAKE_CONFIGURATION_TYPES)
|
||||
set(CMAKE_CONFIGURATION_TYPES Debug Release RelWithDebInfo)
|
||||
endif()
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "")
|
||||
set(CMAKE_BUILD_TYPE RelWithDebInfo)
|
||||
endif()
|
||||
set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Build Type" FORCE)
|
||||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${CMAKE_CONFIGURATION_TYPES})
|
||||
|
||||
set(arm_none_eabi_debug "-Og -g")
|
||||
# We set -Os or -O2 depending on the MCU family
|
||||
set(arm_none_eabi_release "-DNDEBUG")
|
||||
set(arm_none_eabi_relwithdebinfo "-ggdb3 ${arm_none_eabi_release}")
|
||||
|
||||
set(CMAKE_C_FLAGS_DEBUG ${arm_none_eabi_debug} CACHE INTERNAL "c compiler flags debug")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG ${arm_none_eabi_debug} CACHE INTERNAL "c++ compiler flags debug")
|
||||
set(CMAKE_ASM_FLAGS_DEBUG ${arm_none_eabi_debug} CACHE INTERNAL "asm compiler flags debug")
|
||||
|
||||
set(CMAKE_C_FLAGS_RELEASE ${arm_none_eabi_release} CACHE INTERNAL "c compiler flags release")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE ${arm_none_eabi_release} CACHE INTERNAL "cxx compiler flags release")
|
||||
set(CMAKE_ASM_FLAGS_RELEASE ${arm_none_eabi_release} CACHE INTERNAL "asm compiler flags release")
|
||||
|
||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO ${arm_none_eabi_relwithdebinfo} CACHE INTERNAL "c compiler flags release")
|
||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO ${arm_none_eabi_relwithdebinfo} CACHE INTERNAL "cxx compiler flags release")
|
||||
set(CMAKE_ASM_FLAGS_RELWITHDEBINFO ${arm_none_eabi_relwithdebinfo} CACHE INTERNAL "asm compiler flags release")
|
||||
@@ -0,0 +1,33 @@
|
||||
main_sources(BOOTLOADER_SOURCES
|
||||
common/log.c
|
||||
common/log.h
|
||||
common/printf.c
|
||||
common/printf.h
|
||||
common/string_light.c
|
||||
common/string_light.h
|
||||
common/typeconversion.c
|
||||
common/typeconversion.h
|
||||
|
||||
drivers/bus.c
|
||||
drivers/bus_busdev_i2c.c
|
||||
drivers/bus_busdev_spi.c
|
||||
drivers/bus_i2c_soft.c
|
||||
drivers/io.c
|
||||
drivers/light_led.c
|
||||
drivers/persistent.c
|
||||
drivers/rcc.c
|
||||
drivers/serial.c
|
||||
drivers/system.c
|
||||
drivers/time.c
|
||||
drivers/timer.c
|
||||
drivers/flash_m25p16.c
|
||||
drivers/flash_w25n.c
|
||||
drivers/flash.c
|
||||
|
||||
fc/firmware_update_common.c
|
||||
fc/firmware_update_common.h
|
||||
|
||||
target/common_hardware.c
|
||||
)
|
||||
|
||||
list(APPEND BOOTLOADER_SOURCES ${MAIN_DIR}/src/bl/bl_main.c)
|
||||
@@ -0,0 +1,4 @@
|
||||
main_sources(AT32_STDPERIPH_SRC
|
||||
drivers/bus_spi_at32f43x.c
|
||||
drivers/serial_uart_hal_at32f43x.c
|
||||
)
|
||||
@@ -0,0 +1,442 @@
|
||||
include(at32-bootloader)
|
||||
include(at32f4)
|
||||
|
||||
include(CMakeParseArguments)
|
||||
|
||||
option(DEBUG_HARDFAULTS "Enable debugging of hard faults via custom handler")
|
||||
option(SEMIHOSTING "Enable semihosting")
|
||||
|
||||
message("-- DEBUG_HARDFAULTS: ${DEBUG_HARDFAULTS}, SEMIHOSTING: ${SEMIHOSTING}")
|
||||
|
||||
set(CMSIS_DIR "${MAIN_LIB_DIR}/lib/main/AT32F43x/Drivers/CMSIS")
|
||||
set(CMSIS_INCLUDE_DIR "${CMSIS_DIR}/cm4/core_support")
|
||||
# DSP use common
|
||||
set(CMSIS_DSP_DIR "${MAIN_LIB_DIR}/main/CMSIS/DSP")
|
||||
set(CMSIS_DSP_INCLUDE_DIR "${CMSIS_DSP_DIR}/Include")
|
||||
|
||||
set(CMSIS_DSP_SRC
|
||||
BasicMathFunctions/arm_scale_f32.c
|
||||
BasicMathFunctions/arm_sub_f32.c
|
||||
BasicMathFunctions/arm_mult_f32.c
|
||||
BasicMathFunctions/arm_offset_f32.c
|
||||
TransformFunctions/arm_rfft_fast_f32.c
|
||||
TransformFunctions/arm_cfft_f32.c
|
||||
TransformFunctions/arm_rfft_fast_init_f32.c
|
||||
TransformFunctions/arm_cfft_radix8_f32.c
|
||||
TransformFunctions/arm_bitreversal2.S
|
||||
CommonTables/arm_common_tables.c
|
||||
ComplexMathFunctions/arm_cmplx_mag_f32.c
|
||||
StatisticsFunctions/arm_max_f32.c
|
||||
StatisticsFunctions/arm_rms_f32.c
|
||||
StatisticsFunctions/arm_std_f32.c
|
||||
StatisticsFunctions/arm_mean_f32.c
|
||||
)
|
||||
list(TRANSFORM CMSIS_DSP_SRC PREPEND "${CMSIS_DSP_DIR}/Source/")
|
||||
|
||||
set(AT32_STARTUP_DIR "${MAIN_SRC_DIR}/startup")
|
||||
|
||||
main_sources(AT32_VCP_SRC
|
||||
drivers/serial_usb_vcp_at32f43x.c
|
||||
drivers/usb_io.c
|
||||
)
|
||||
# SDCARD not supported yet
|
||||
main_sources(AT32_SDCARD_SRC
|
||||
drivers/sdcard/sdcard.c
|
||||
drivers/sdcard/sdcard_spi.c
|
||||
drivers/sdcard/sdcard_sdio.c
|
||||
drivers/sdcard/sdcard_standard.c
|
||||
)
|
||||
|
||||
# XXX: This code is not STM32 specific
|
||||
main_sources(AT32_ASYNCFATFS_SRC
|
||||
io/asyncfatfs/asyncfatfs.c
|
||||
io/asyncfatfs/fat_standard.c
|
||||
)
|
||||
|
||||
main_sources(AT32_MSC_SRC
|
||||
msc/at32_msc_diskio.c
|
||||
msc/emfat.c
|
||||
msc/emfat_file.c
|
||||
)
|
||||
|
||||
set(AT32_INCLUDE_DIRS
|
||||
"${CMSIS_INCLUDE_DIR}"
|
||||
"${CMSIS_DSP_INCLUDE_DIR}"
|
||||
"${MAIN_SRC_DIR}/target"
|
||||
)
|
||||
|
||||
set(AT32_DEFINITIONS
|
||||
)
|
||||
set(AT32_DEFAULT_HSE_MHZ 8)
|
||||
set(AT32_LINKER_DIR "${MAIN_SRC_DIR}/target/link")
|
||||
set(AT32_COMPILE_OPTIONS
|
||||
-ffunction-sections
|
||||
-fdata-sections
|
||||
-fno-common
|
||||
)
|
||||
|
||||
set(AT32_LINK_LIBRARIES
|
||||
-lm
|
||||
-lc
|
||||
)
|
||||
|
||||
if(SEMIHOSTING)
|
||||
list(APPEND AT32_LINK_LIBRARIES --specs=rdimon.specs -lrdimon)
|
||||
list(APPEND AT32_DEFINITIONS SEMIHOSTING)
|
||||
else()
|
||||
list(APPEND AT32_LINK_LIBRARIES -lnosys)
|
||||
endif()
|
||||
|
||||
set(AT32_LINK_OPTIONS
|
||||
#-nostartfiles
|
||||
--specs=nano.specs
|
||||
-static
|
||||
-Wl,-gc-sections
|
||||
-Wl,-L${AT32_LINKER_DIR}
|
||||
-Wl,--cref
|
||||
-Wl,--no-wchar-size-warning
|
||||
-Wl,--print-memory-usage
|
||||
-Wl,--no-warn-rwx-segments
|
||||
)
|
||||
# Get target features
|
||||
macro(get_at32_target_features output_var dir target_name)
|
||||
execute_process(COMMAND "${CMAKE_C_COMPILER}" -E -dD -D${ARGV2} "${ARGV1}/target.h"
|
||||
ERROR_VARIABLE _errors
|
||||
RESULT_VARIABLE _result
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
OUTPUT_VARIABLE _contents)
|
||||
|
||||
if(NOT _result EQUAL 0)
|
||||
message(FATAL_ERROR "error extracting features for AT32 target ${ARGV2}: ${_errors}")
|
||||
endif()
|
||||
|
||||
string(REGEX MATCH "#define[\t ]+USE_VCP" HAS_VCP ${_contents})
|
||||
if(HAS_VCP)
|
||||
list(APPEND ${ARGV0} VCP)
|
||||
endif()
|
||||
string(REGEX MATCH "define[\t ]+USE_FLASHFS" HAS_FLASHFS ${_contents})
|
||||
if(HAS_FLASHFS)
|
||||
list(APPEND ${ARGV0} FLASHFS)
|
||||
endif()
|
||||
string(REGEX MATCH "define[\t ]+USE_SDCARD" HAS_SDCARD ${_contents})
|
||||
if (HAS_SDCARD)
|
||||
list(APPEND ${ARGV0} SDCARD)
|
||||
string(REGEX MATCH "define[\t ]+USE_SDCARD_SDIO" HAS_SDIO ${_contents})
|
||||
if (HAS_SDIO)
|
||||
list(APPEND ${ARGV0} SDIO)
|
||||
endif()
|
||||
endif()
|
||||
if(HAS_FLASHFS OR HAS_SDCARD)
|
||||
list(APPEND ${ARGV0} MSC)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
function(get_at32_flash_size out size)
|
||||
# 4: 16, 6: 32, 8: 64, B: 128, C: 256, D: 384, E: 512, F: 768, G: 1024, H: 1536, I: 2048 KiB
|
||||
string(TOUPPER ${size} s)
|
||||
if(${s} STREQUAL "4")
|
||||
set(${out} 16 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "6")
|
||||
set(${out} 32 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "8")
|
||||
set(${out} 64 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "8")
|
||||
set(${out} 64 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "B")
|
||||
set(${out} 128 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "C")
|
||||
set(${out} 256 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "D")
|
||||
set(${out} 384 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "E")
|
||||
set(${out} 512 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "F")
|
||||
set(${out} 768 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "G")
|
||||
set(${out} 1024 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "H")
|
||||
set(${out} 1536 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "I")
|
||||
set(${out} 2048 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(add_hex_target name exe hex)
|
||||
add_custom_target(${name} ALL
|
||||
cmake -E env PATH="$ENV{PATH}"
|
||||
# TODO: Overriding the start address with --set-start 0x08000000
|
||||
# seems to be required due to some incorrect assumptions about .hex
|
||||
# files in the configurator. Verify wether that's the case and fix
|
||||
# the bug in configurator or delete this comment.
|
||||
${CMAKE_OBJCOPY} -Oihex --set-start 0x08000000 $<TARGET_FILE:${exe}> ${hex}
|
||||
BYPRODUCTS ${hex}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
function(add_bin_target name exe bin)
|
||||
add_custom_target(${name}
|
||||
cmake -E env PATH="$ENV{PATH}"
|
||||
${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${exe}> ${bin}
|
||||
BYPRODUCTS ${bin}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
function(generate_map_file target)
|
||||
if(CMAKE_VERSION VERSION_LESS 3.15)
|
||||
set(map "$<TARGET_FILE:${target}>.map")
|
||||
else()
|
||||
set(map "$<TARGET_FILE_DIR:${target}>/$<TARGET_FILE_BASE_NAME:${target}>.map")
|
||||
endif()
|
||||
target_link_options(${target} PRIVATE "-Wl,-Map,${map}")
|
||||
endfunction()
|
||||
|
||||
function(set_linker_script target script)
|
||||
set(script_path ${AT32_LINKER_DIR}/${args_LINKER_SCRIPT}.ld)
|
||||
if(NOT EXISTS ${script_path})
|
||||
message(FATAL_ERROR "linker script ${script_path} doesn't exist")
|
||||
endif()
|
||||
set_target_properties(${target} PROPERTIES LINK_DEPENDS ${script_path})
|
||||
target_link_options(${elf_target} PRIVATE -T${script_path})
|
||||
endfunction()
|
||||
|
||||
function(add_at32_executable)
|
||||
cmake_parse_arguments(
|
||||
args
|
||||
# Boolean arguments
|
||||
""
|
||||
# Single value arguments
|
||||
"FILENAME;NAME;OPTIMIZATION;OUTPUT_BIN_FILENAME;OUTPUT_HEX_FILENAME;OUTPUT_TARGET_NAME"
|
||||
# Multi-value arguments
|
||||
"COMPILE_DEFINITIONS;COMPILE_OPTIONS;INCLUDE_DIRECTORIES;LINK_OPTIONS;LINKER_SCRIPT;SOURCES"
|
||||
# Start parsing after the known arguments
|
||||
${ARGN}
|
||||
)
|
||||
set(elf_target ${args_NAME}.elf)
|
||||
add_executable(${elf_target})
|
||||
target_sources(${elf_target} PRIVATE ${args_SOURCES})
|
||||
target_include_directories(${elf_target} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${args_INCLUDE_DIRECTORIES} ${AT32_INCLUDE_DIRS})
|
||||
target_compile_definitions(${elf_target} PRIVATE ${args_COMPILE_DEFINITIONS})
|
||||
target_compile_options(${elf_target} PRIVATE ${AT32_COMPILE_OPTIONS} ${args_COMPILE_OPTIONS})
|
||||
if(WARNINGS_AS_ERRORS)
|
||||
target_compile_options(${elf_target} PRIVATE -Werror)
|
||||
endif()
|
||||
if (IS_RELEASE_BUILD)
|
||||
target_compile_options(${elf_target} PRIVATE ${args_OPTIMIZATION})
|
||||
target_link_options(${elf_target} PRIVATE ${args_OPTIMIZATION})
|
||||
endif()
|
||||
target_link_libraries(${elf_target} PRIVATE ${AT32_LINK_LIBRARIES})
|
||||
target_link_options(${elf_target} PRIVATE ${AT32_LINK_OPTIONS} ${args_LINK_OPTIONS})
|
||||
generate_map_file(${elf_target})
|
||||
set_linker_script(${elf_target} ${args_LINKER_SCRIPT})
|
||||
if(args_FILENAME)
|
||||
set(basename ${CMAKE_BINARY_DIR}/${args_FILENAME})
|
||||
set(hex_filename ${basename}.hex)
|
||||
add_hex_target(${args_NAME} ${elf_target} ${hex_filename})
|
||||
set(bin_filename ${basename}.bin)
|
||||
add_bin_target(${args_NAME}.bin ${elf_target} ${bin_filename})
|
||||
endif()
|
||||
if(args_OUTPUT_BIN_FILENAME)
|
||||
set(${args_OUTPUT_BIN_FILENAME} ${bin_filename} PARENT_SCOPE)
|
||||
endif()
|
||||
if(args_OUTPUT_TARGET_NAME)
|
||||
set(${args_OUTPUT_TARGET_NAME} ${elf_target} PARENT_SCOPE)
|
||||
endif()
|
||||
if(args_OUTPUT_HEX_FILENAME)
|
||||
set(${args_OUTPUT_HEX_FILENAME} ${hex_filename} PARENT_SCOPE)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# Main function of AT32
|
||||
function(target_at32)
|
||||
if(NOT arm-none-eabi STREQUAL TOOLCHAIN)
|
||||
return()
|
||||
endif()
|
||||
# Parse keyword arguments
|
||||
cmake_parse_arguments(
|
||||
args
|
||||
# Boolean arguments
|
||||
"DISABLE_MSC;BOOTLOADER"
|
||||
# Single value arguments
|
||||
"HSE_MHZ;LINKER_SCRIPT;NAME;OPENOCD_TARGET;OPTIMIZATION;STARTUP;SVD"
|
||||
# Multi-value arguments
|
||||
"COMPILE_DEFINITIONS;COMPILE_OPTIONS;INCLUDE_DIRECTORIES;LINK_OPTIONS;SOURCES;MSC_SOURCES;MSC_INCLUDE_DIRECTORIES;VCP_SOURCES;VCP_INCLUDE_DIRECTORIES"
|
||||
# Start parsing after the known arguments
|
||||
${ARGN}
|
||||
)
|
||||
set(name ${args_NAME})
|
||||
|
||||
if (args_HSE_MHZ)
|
||||
set(hse_mhz ${args_HSE_MHZ})
|
||||
else()
|
||||
set(hse_mhz ${AT32_DEFAULT_HSE_MHZ})
|
||||
endif()
|
||||
|
||||
set(target_sources ${AT32_STARTUP_DIR}/${args_STARTUP})
|
||||
list(APPEND target_sources ${args_SOURCES})
|
||||
file(GLOB target_c_sources "${CMAKE_CURRENT_SOURCE_DIR}/*.c")
|
||||
file(GLOB target_h_sources "${CMAKE_CURRENT_SOURCE_DIR}/*.h")
|
||||
list(APPEND target_sources ${target_c_sources} ${target_h_sources})
|
||||
|
||||
set(target_include_directories ${args_INCLUDE_DIRECTORIES})
|
||||
|
||||
set(target_definitions ${AT32_DEFINITIONS} ${COMMON_COMPILE_DEFINITIONS})
|
||||
|
||||
get_at32_target_features(features "${CMAKE_CURRENT_SOURCE_DIR}" ${name})
|
||||
set_property(TARGET ${elf_target} PROPERTY FEATURES ${features})
|
||||
|
||||
if(VCP IN_LIST features)
|
||||
list(APPEND target_sources ${AT32_VCP_SRC} ${args_VCP_SOURCES})
|
||||
list(APPEND target_include_directories ${args_VCP_INCLUDE_DIRECTORIES})
|
||||
endif()
|
||||
if(SDCARD IN_LIST features)
|
||||
list(APPEND target_sources ${AT32_SDCARD_SRC} ${AT32_ASYNCFATFS_SRC})
|
||||
endif()
|
||||
|
||||
set(msc_sources)
|
||||
if(NOT args_DISABLE_MSC AND MSC IN_LIST features)
|
||||
list(APPEND target_include_directories ${args_MSC_INCLUDE_DIRECTORIES})
|
||||
list(APPEND msc_sources ${AT32_MSC_SRC} ${args_MSC_SOURCES})
|
||||
list(APPEND target_definitions USE_USB_MSC)
|
||||
if(FLASHFS IN_LIST features)
|
||||
list(APPEND msc_sources ${AT32_MSC_FLASH_SRC})
|
||||
endif()
|
||||
if (SDCARD IN_LIST features)
|
||||
list(APPEND msc_sources ${AT32_MSC_SDCARD_SRC})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
math(EXPR hse_value "${hse_mhz} * 1000000")
|
||||
list(APPEND target_definitions "HSE_VALUE=${hse_value}")
|
||||
|
||||
if (MSP_UART)
|
||||
list(APPEND target_definitions "MSP_UART=${MSP_UART}")
|
||||
endif()
|
||||
|
||||
if(args_COMPILE_DEFINITIONS)
|
||||
list(APPEND target_definitions ${args_COMPILE_DEFINITIONS})
|
||||
endif()
|
||||
if(DEBUG_HARDFAULTS)
|
||||
list(APPEND target_definitions DEBUG_HARDFAULTS)
|
||||
endif()
|
||||
|
||||
string(TOLOWER ${PROJECT_NAME} lowercase_project_name)
|
||||
set(binary_name ${lowercase_project_name}_${FIRMWARE_VERSION}_${name})
|
||||
if(DEFINED BUILD_SUFFIX AND NOT "" STREQUAL "${BUILD_SUFFIX}")
|
||||
set(binary_name "${binary_name}_${BUILD_SUFFIX}")
|
||||
endif()
|
||||
|
||||
# Main firmware
|
||||
add_at32_executable(
|
||||
NAME ${name}
|
||||
FILENAME ${binary_name}
|
||||
SOURCES ${target_sources} ${msc_sources} ${CMSIS_DSP_SRC} ${COMMON_SRC}
|
||||
COMPILE_DEFINITIONS ${target_definitions}
|
||||
COMPILE_OPTIONS ${args_COMPILE_OPTIONS}
|
||||
INCLUDE_DIRECTORIES ${target_include_directories}
|
||||
LINK_OPTIONS ${args_LINK_OPTIONS}
|
||||
LINKER_SCRIPT ${args_LINKER_SCRIPT}
|
||||
OPTIMIZATION ${args_OPTIMIZATION}
|
||||
|
||||
OUTPUT_BIN_FILENAME main_bin_filename
|
||||
OUTPUT_HEX_FILENAME main_hex_filename
|
||||
OUTPUT_TARGET_NAME main_target_name
|
||||
|
||||
)
|
||||
|
||||
set_property(TARGET ${main_target_name} PROPERTY OPENOCD_TARGET ${args_OPENOCD_TARGET})
|
||||
set_property(TARGET ${main_target_name} PROPERTY OPENOCD_DEFAULT_INTERFACE atlink)
|
||||
set_property(TARGET ${main_target_name} PROPERTY SVD ${args_SVD})
|
||||
|
||||
setup_firmware_target(${main_target_name} ${name} ${ARGN})
|
||||
|
||||
if(args_BOOTLOADER)
|
||||
# Bootloader for the target
|
||||
set(bl_suffix _bl)
|
||||
add_at32_executable(
|
||||
NAME ${name}${bl_suffix}
|
||||
FILENAME ${binary_name}${bl_suffix}
|
||||
SOURCES ${target_sources} ${BOOTLOADER_SOURCES}
|
||||
COMPILE_DEFINITIONS ${target_definitions} BOOTLOADER MSP_FIRMWARE_UPDATE
|
||||
COMPILE_OPTIONS ${args_COMPILE_OPTIONS}
|
||||
INCLUDE_DIRECTORIES ${target_include_directories}
|
||||
LINK_OPTIONS ${args_LINK_OPTIONS}
|
||||
LINKER_SCRIPT ${args_LINKER_SCRIPT}${bl_suffix}
|
||||
OPTIMIZATION ${args_OPTIMIZATION}
|
||||
|
||||
OUTPUT_BIN_FILENAME bl_bin_filename
|
||||
OUTPUT_HEX_FILENAME bl_hex_filename
|
||||
OUTPUT_TARGET_NAME bl_target_name
|
||||
)
|
||||
setup_executable(${bl_target_name} ${name})
|
||||
|
||||
# Main firmware, but for running with the bootloader
|
||||
set(for_bl_suffix _for_bl)
|
||||
add_at32_executable(
|
||||
NAME ${name}${for_bl_suffix}
|
||||
FILENAME ${binary_name}${for_bl_suffix}
|
||||
SOURCES ${target_sources} ${msc_sources} ${CMSIS_DSP_SRC} ${COMMON_SRC}
|
||||
COMPILE_DEFINITIONS ${target_definitions} MSP_FIRMWARE_UPDATE
|
||||
COMPILE_OPTIONS ${args_COMPILE_OPTIONS}
|
||||
INCLUDE_DIRECTORIES ${target_include_directories}
|
||||
LINK_OPTIONS ${args_LINK_OPTIONS}
|
||||
LINKER_SCRIPT ${args_LINKER_SCRIPT}${for_bl_suffix}
|
||||
OPTIMIZATION ${args_OPTIMIZATION}
|
||||
|
||||
OUTPUT_BIN_FILENAME for_bl_bin_filename
|
||||
OUTPUT_HEX_FILENAME for_bl_hex_filename
|
||||
OUTPUT_TARGET_NAME for_bl_target_name
|
||||
)
|
||||
setup_executable(${for_bl_target_name} ${name})
|
||||
|
||||
# Combined with bootloader and main firmware
|
||||
set(with_bl_suffix _with_bl)
|
||||
set(combined_hex ${CMAKE_BINARY_DIR}/${binary_name}${with_bl_suffix}.hex)
|
||||
set(with_bl_target ${name}${with_bl_suffix})
|
||||
add_custom_target(${with_bl_target}
|
||||
${CMAKE_SOURCE_DIR}/src/utils/combine_tool ${bl_bin_filename} ${for_bl_bin_filename} ${combined_hex}
|
||||
BYPRODUCTS ${combined_hex}
|
||||
)
|
||||
add_dependencies(${with_bl_target} ${bl_target_name} ${for_bl_target_name})
|
||||
endif()
|
||||
|
||||
# clean_<target>
|
||||
set(generator_cmd "")
|
||||
if (CMAKE_GENERATOR STREQUAL "Unix Makefiles")
|
||||
set(generator_cmd "make")
|
||||
elseif(CMAKE_GENERATOR STREQUAL "Ninja")
|
||||
set(generator_cmd "ninja")
|
||||
endif()
|
||||
if (NOT generator_cmd STREQUAL "")
|
||||
set(clean_target "clean_${name}")
|
||||
add_custom_target(${clean_target}
|
||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||||
COMMAND ${generator_cmd} clean
|
||||
COMMENT "Removing intermediate files for ${name}")
|
||||
set_property(TARGET ${clean_target} PROPERTY
|
||||
EXCLUDE_FROM_ALL 1
|
||||
EXCLUDE_FROM_DEFAULT_BUILD 1)
|
||||
endif()
|
||||
endfunction()
|
||||
@@ -0,0 +1,45 @@
|
||||
set(AT32_USBCORE_DIR "${MAIN_LIB_DIR}/main/AT32F43x/Middlewares/AT/AT32_USB_Device_Library/Core")
|
||||
set(AT32_USBCDC_DIR "${MAIN_LIB_DIR}/main/AT32F43x/Middlewares/AT/AT32_USB_Device_Library/Class/usbd_class/cdc")
|
||||
set(AT32_USBMSC_DIR "${MAIN_LIB_DIR}/main/AT32F43x/Middlewares/AT/AT32_USB_Device_Library/Class/usbd_class/msc")
|
||||
|
||||
set(AT32F4_USB_INCLUDE_DIRS
|
||||
"${AT32_USBCORE_DIR}/Inc"
|
||||
"${AT32_USBCDC_DIR}"
|
||||
"${AT32_USBMSC_DIR}"
|
||||
)
|
||||
|
||||
set(AT32_USBCORE_SRC
|
||||
usb_core.c
|
||||
usbd_core.c
|
||||
usbd_int.c
|
||||
usbd_sdr.c
|
||||
)
|
||||
list(TRANSFORM AT32_USBCORE_SRC PREPEND "${AT32_USBCORE_DIR}/Src/")
|
||||
|
||||
|
||||
set(AT32_USBCDC_SRC
|
||||
"${AT32_USBCDC_DIR}/cdc_class.c"
|
||||
"${AT32_USBCDC_DIR}/cdc_desc.c"
|
||||
)
|
||||
|
||||
main_sources(AT32F4_VCP_SRC
|
||||
drivers/serial_usb_vcp_at32f43x.c
|
||||
drivers/usb_io.c
|
||||
)
|
||||
|
||||
set(AT32F4_USBMSC_SRC
|
||||
msc_desc.c
|
||||
msc_class.c
|
||||
msc_bot_scsi.c
|
||||
)
|
||||
|
||||
main_sources(AT32F4_MSC_SRC
|
||||
drivers/usb_msc_at32f43x.c
|
||||
)
|
||||
|
||||
list(TRANSFORM AT32F4_USBMSC_SRC PREPEND "${AT32_USBMSC_DIR}/")
|
||||
list(APPEND AT32F4_USBMSC_SRC ${AT32F4_MSC_SRC})
|
||||
|
||||
list(APPEND AT32F4_USB_SRC ${AT32F4_VCP_SRC})
|
||||
list(APPEND AT32F4_USB_SRC ${AT32_USBCORE_SRC})
|
||||
list(APPEND AT32F4_USB_SRC ${AT32_USBCDC_SRC})
|
||||
@@ -0,0 +1,114 @@
|
||||
include(cortex-m4f)
|
||||
include(at32-stdperiph)
|
||||
include(at32f4-usb)
|
||||
|
||||
set(AT32F4_STDPERIPH_DIR "${MAIN_LIB_DIR}/main/AT32F43x/Drivers/AT32F43x_StdPeriph_Driver")
|
||||
set(AT32F4_CMSIS_DEVICE_DIR "${MAIN_LIB_DIR}/main/AT32F43x/Drivers/CMSIS/Device/ST/AT32F43x")
|
||||
set(AT32F4_CMSIS_DRIVERS_DIR "${MAIN_LIB_DIR}/main/AT32F43x/Drivers/CMSIS")
|
||||
|
||||
|
||||
set(AT32F4_STDPERIPH_SRC_EXCLUDES
|
||||
at32f435_437_can.c
|
||||
at32f435_437_dvp.c
|
||||
at32f435_437_emac
|
||||
at32f435_437_xmc.c
|
||||
)
|
||||
|
||||
set(AT32F4_STDPERIPH_SRC_DIR "${AT32F4_STDPERIPH_DIR}/src")
|
||||
glob_except(AT32F4_STDPERIPH_SRC "${AT32F4_STDPERIPH_SRC_DIR}/*.c" "${AT32F4_STDPERIPH_SRC_EXCLUDES}")
|
||||
|
||||
list(APPEND AT32F4_STDPERIPH_SRC "${AT32F4_CMSIS_DEVICE_DIR}/at32f435_437_clock.c" )
|
||||
|
||||
main_sources(AT32F4_SRC
|
||||
target/system_at32f435_437.c
|
||||
config/config_streamer_at32f43x.c
|
||||
config/config_streamer_ram.c
|
||||
config/config_streamer_extflash.c
|
||||
drivers/adc_at32f43x.c
|
||||
drivers/i2c_application.c
|
||||
drivers/bus_i2c_at32f43x.c
|
||||
drivers/bus_spi_at32f43x
|
||||
drivers/serial_uart_hal_at32f43x.c
|
||||
drivers/serial_uart_at32f43x.c
|
||||
|
||||
drivers/system_at32f43x.c
|
||||
drivers/timer.c
|
||||
drivers/timer_impl_stdperiph_at32.c
|
||||
drivers/timer_at32f43x.c
|
||||
drivers/uart_inverter.c
|
||||
drivers/dma_at32f43x.c
|
||||
)
|
||||
|
||||
set(AT32F4_INCLUDE_DIRS
|
||||
${CMSIS_INCLUDE_DIR}
|
||||
${CMSIS_DSP_INCLUDE_DIR}
|
||||
${AT32F4_CMSIS_DRIVERS_DIR}
|
||||
${AT32F4_STDPERIPH_DIR}/inc
|
||||
${AT32F4_CMSIS_DEVICE_DIR}
|
||||
#"${AT32F4_I2C_DIR}"
|
||||
)
|
||||
|
||||
set(AT32F4_DEFINITIONS
|
||||
${CORTEX_M4F_DEFINITIONS}
|
||||
AT32F43x
|
||||
USE_STDPERIPH_DRIVER
|
||||
)
|
||||
|
||||
function(target_at32f43x)
|
||||
target_at32(
|
||||
SOURCES ${AT32_STDPERIPH_SRC} ${AT32F4_SRC}
|
||||
COMPILE_DEFINITIONS ${AT32F4_DEFINITIONS}
|
||||
COMPILE_OPTIONS ${CORTEX_M4F_COMMON_OPTIONS} ${CORTEX_M4F_COMPILE_OPTIONS}
|
||||
INCLUDE_DIRECTORIES ${AT32F4_INCLUDE_DIRS}
|
||||
LINK_OPTIONS ${CORTEX_M4F_COMMON_OPTIONS} ${CORTEX_M4F_LINK_OPTIONS}
|
||||
|
||||
MSC_SOURCES ${AT32F4_USBMSC_SRC} ${AT32F4_MSC_SRC}
|
||||
VCP_SOURCES ${AT32F4_USB_SRC} ${AT32F4_VCP_SRC}
|
||||
VCP_INCLUDE_DIRECTORIES ${AT32F4_USB_INCLUDE_DIRS}
|
||||
|
||||
OPTIMIZATION -O2
|
||||
|
||||
OPENOCD_TARGET at32f437xx
|
||||
|
||||
${ARGN}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
#target_at32f43x_xMT7
|
||||
#target_at32f43x_xGT7
|
||||
|
||||
set(at32f43x_xMT7_COMPILE_DEFINITIONS
|
||||
AT32F437VMT7
|
||||
MCU_FLASH_SIZE=4032
|
||||
)
|
||||
|
||||
function(target_at32f43x_xMT7 name)
|
||||
target_at32f43x(
|
||||
NAME ${name}
|
||||
STARTUP startup_at32f435_437.s
|
||||
SOURCES ${AT32F4_STDPERIPH_SRC}
|
||||
COMPILE_DEFINITIONS ${at32f43x_xMT7_COMPILE_DEFINITIONS}
|
||||
LINKER_SCRIPT at32_flash_f43xM
|
||||
#BOOTLOADER
|
||||
SVD at32f43x_xMT7
|
||||
${ARGN}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
set(at32f43x_xGT7_COMPILE_DEFINITIONS
|
||||
AT32F435RGT7
|
||||
MCU_FLASH_SIZE=1024
|
||||
)
|
||||
|
||||
function(target_at32f43x_xGT7 name)
|
||||
target_at32f43x(
|
||||
NAME ${name}
|
||||
STARTUP startup_at32f435_437.s
|
||||
SOURCES ${AT32F4_STDPERIPH_SRC}
|
||||
COMPILE_DEFINITIONS ${at32f43x_xGT7_COMPILE_DEFINITIONS}
|
||||
LINKER_SCRIPT at32_flash_f43xG
|
||||
#BOOTLOADER
|
||||
SVD at32f43x_xGT7
|
||||
${ARGN}
|
||||
)
|
||||
endfunction()
|
||||
@@ -0,0 +1,22 @@
|
||||
if(DEFINED CI_JOB_INDEX AND DEFINED CI_JOB_COUNT)
|
||||
math(EXPR job_name "${CI_JOB_INDEX}+1")
|
||||
message("-- configuring CI job ${job_name}/${CI_JOB_COUNT}")
|
||||
get_property(targets GLOBAL PROPERTY RELEASE_TARGETS)
|
||||
list(LENGTH targets count)
|
||||
message("-- ${count} total targets")
|
||||
math(EXPR per_job "(${count}+${CI_JOB_COUNT}-1)/${CI_JOB_COUNT}")
|
||||
math(EXPR start "${CI_JOB_INDEX}*${per_job}")
|
||||
message("-- ${per_job} targets per job, starting at ${start}")
|
||||
if(${start} LESS ${count})
|
||||
list(SUBLIST targets ${start} ${per_job} ci_targets)
|
||||
message("-- will build targets: ${ci_targets}")
|
||||
add_custom_target(ci
|
||||
${CMAKE_COMMAND} -E true
|
||||
DEPENDS ${ci_targets}
|
||||
)
|
||||
else()
|
||||
add_custom_target(ci
|
||||
${CMAKE_COMMAND} -E true
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
@@ -0,0 +1,23 @@
|
||||
set(CORTEX_M4F_COMMON_OPTIONS
|
||||
-mthumb
|
||||
-mcpu=cortex-m4
|
||||
-march=armv7e-m
|
||||
-mfloat-abi=hard
|
||||
-mfpu=fpv4-sp-d16
|
||||
-fsingle-precision-constant
|
||||
-Wdouble-promotion
|
||||
)
|
||||
|
||||
set(CORTEX_M4F_COMPILE_OPTIONS
|
||||
)
|
||||
|
||||
set(CORTEX_M4F_LINK_OPTIONS
|
||||
)
|
||||
|
||||
set(CORTEX_M4F_DEFINITIONS
|
||||
__FPU_PRESENT=1
|
||||
ARM_MATH_CM4
|
||||
ARM_MATH_MATRIX_CHECK
|
||||
ARM_MATH_ROUNDING
|
||||
UNALIGNED_SUPPORT_DISABLE
|
||||
)
|
||||
@@ -0,0 +1,22 @@
|
||||
set(CORTEX_M7_COMMON_OPTIONS
|
||||
-mthumb
|
||||
-mcpu=cortex-m7
|
||||
-mfloat-abi=hard
|
||||
-mfpu=fpv5-sp-d16
|
||||
-fsingle-precision-constant
|
||||
-Wdouble-promotion
|
||||
)
|
||||
|
||||
set(CORTEX_M7_COMPILE_OPTIONS
|
||||
)
|
||||
|
||||
set(CORTEX_M7_LINK_OPTIONS
|
||||
)
|
||||
|
||||
set(CORTEX_M7_DEFINITIONS
|
||||
__FPU_PRESENT=1
|
||||
ARM_MATH_CM7
|
||||
ARM_MATH_MATRIX_CHECK
|
||||
ARM_MATH_ROUNDING
|
||||
UNALIGNED_SUPPORT_DISABLE
|
||||
)
|
||||
Executable
+29
@@ -0,0 +1,29 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
LAST_CMAKE_AT_REV_FILE="docker_cmake.rev"
|
||||
CURR_REV="$(git rev-parse HEAD)"
|
||||
|
||||
initialize_cmake() {
|
||||
echo -e "*** CMake was not initialized yet, doing it now.\n"
|
||||
cmake -GNinja ..
|
||||
echo "$CURR_REV" > "$LAST_CMAKE_AT_REV_FILE"
|
||||
}
|
||||
|
||||
# Check if CMake has never been initialized
|
||||
if [ ! -f build.ninja ]; then
|
||||
initialize_cmake
|
||||
fi
|
||||
|
||||
# Check if CMake was initialized for a different Git revision (new targets may have been added)
|
||||
if [ -f "$LAST_CMAKE_AT_REV_FILE" ]; then
|
||||
LAST_CMAKE_AT_REV="$(cat $LAST_CMAKE_AT_REV_FILE)"
|
||||
if [[ "$LAST_CMAKE_AT_REV" != "SKIP" ]] && [[ "$LAST_CMAKE_AT_REV" != "$CURR_REV" ]]; then
|
||||
initialize_cmake
|
||||
fi
|
||||
else
|
||||
initialize_cmake
|
||||
fi
|
||||
|
||||
# Let Make handle the arguments coming from the build script
|
||||
ninja "$@"
|
||||
@@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
rm -r build_SITL
|
||||
mkdir -p build_SITL
|
||||
#cmake -DSITL=ON -DWARNINGS_AS_ERRORS=ON -GNinja -B build_SITL ..
|
||||
cmake -DSITL=ON -DDEBUG=ON -DWARNINGS_AS_ERRORS=ON -GNinja -B build_SITL ..
|
||||
cd build_SITL
|
||||
ninja
|
||||
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
cd /src/
|
||||
python3 src/utils/update_cli_docs.py
|
||||
@@ -0,0 +1,8 @@
|
||||
#!/bin/bash
|
||||
cd build_SITL
|
||||
|
||||
#Lauch SITL - configurator only mode
|
||||
./inav_7.0.0_SITL
|
||||
|
||||
#Launch SITL - connect to X-Plane. IP address should be host IP address, not 127.0.0.1. Can be found in X-Plane "Network" tab.
|
||||
#./inav_7.0.0_SITL --sim=xp --simip=192.168.2.105 --simport=49000
|
||||
@@ -0,0 +1,34 @@
|
||||
function(gcc_get_version var)
|
||||
cmake_parse_arguments(args
|
||||
""
|
||||
"TRIPLET;PROGRAM_NAME;PROGRAM_PATH"
|
||||
""
|
||||
${ARGN}
|
||||
)
|
||||
set(prog "gcc")
|
||||
if(args_TRIPLET)
|
||||
set(prog "${args_TRIPLET}-${prog}")
|
||||
endif()
|
||||
if(args_PROGRAM_NAME)
|
||||
set(${args_PROGRAM_NAME} ${prog} PARENT_SCOPE)
|
||||
endif()
|
||||
|
||||
find_program(gcc ${prog})
|
||||
if (NOT gcc)
|
||||
set(${var} OFF PARENT_SCOPE)
|
||||
endif()
|
||||
|
||||
if(args_PROGRAM_PATH)
|
||||
set(${args_PROGRAM_PATH} ${gcc} PARENT_SCOPE)
|
||||
endif()
|
||||
|
||||
execute_process(COMMAND "${gcc}" -dumpversion
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
OUTPUT_VARIABLE version)
|
||||
|
||||
if("" STREQUAL version)
|
||||
set(${var} OFF PARENT_SCOPE)
|
||||
else()
|
||||
set(${var} ${version} PARENT_SCOPE)
|
||||
endif()
|
||||
endfunction()
|
||||
@@ -0,0 +1,47 @@
|
||||
|
||||
if(NOT CMAKE_CONFIGURATION_TYPES)
|
||||
set(CMAKE_CONFIGURATION_TYPES Debug Release RelWithDebInfo)
|
||||
endif()
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "")
|
||||
set(CMAKE_BUILD_TYPE RelWithDebInfo)
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
set(TOOL_EXECUTABLE_SUFFIX ".exe")
|
||||
endif()
|
||||
|
||||
set(CMAKE_ASM_COMPILER "gcc${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "asm compiler")
|
||||
set(CMAKE_C_COMPILER "gcc${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "c compiler")
|
||||
set(CMAKE_CXX_COMPILER "g++${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "c++ compiler")
|
||||
set(CMAKE_OBJCOPY "objcopy${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "objcopy tool")
|
||||
set(CMAKE_OBJDUMP "objdump${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "objdump tool")
|
||||
set(CMAKE_SIZE "size${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "size tool")
|
||||
if(CMAKE_HOST_APPLE)
|
||||
set(CMAKE_DEBUGGER "lldb${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "debugger")
|
||||
else()
|
||||
set(CMAKE_DEBUGGER "gdb${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "debugger")
|
||||
endif()
|
||||
set(CMAKE_CPPFILT "c++filt${TOOL_EXECUTABLE_SUFFIX}" CACHE INTERNAL "c++filt")
|
||||
|
||||
set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Build Type" FORCE)
|
||||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${CMAKE_CONFIGURATION_TYPES})
|
||||
|
||||
set(debug_options "-Og -O0 -g")
|
||||
set(release_options "-Os -DNDEBUG")
|
||||
if(CMAKE_HOST_APPLE)
|
||||
set(relwithdebinfo_options "-g ${release_options}")
|
||||
else()
|
||||
set(relwithdebinfo_options "-ggdb3 ${release_options}")
|
||||
endif()
|
||||
|
||||
set(CMAKE_C_FLAGS_DEBUG ${debug_options} CACHE INTERNAL "c compiler flags debug")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG ${debug_options} CACHE INTERNAL "c++ compiler flags debug")
|
||||
set(CMAKE_ASM_FLAGS_DEBUG ${debug_options} CACHE INTERNAL "asm compiler flags debug")
|
||||
|
||||
set(CMAKE_C_FLAGS_RELEASE ${release_options} CACHE INTERNAL "c compiler flags release")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE ${release_options} CACHE INTERNAL "cxx compiler flags release")
|
||||
set(CMAKE_ASM_FLAGS_RELEASE ${release_options} CACHE INTERNAL "asm compiler flags release")
|
||||
|
||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO ${relwithdebinfo_options} CACHE INTERNAL "c compiler flags release")
|
||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO ${relwithdebinfo_options} CACHE INTERNAL "cxx compiler flags release")
|
||||
set(CMAKE_ASM_FLAGS_RELWITHDEBINFO ${relwithdebinfo_options} CACHE INTERNAL "asm compiler flags release")
|
||||
@@ -0,0 +1,146 @@
|
||||
set(MAIN_INCLUDE_DIRS
|
||||
"${MAIN_LIB_DIR}"
|
||||
"${MAIN_SRC_DIR}"
|
||||
"${MAIN_LIB_DIR}/main/MAVLink"
|
||||
)
|
||||
|
||||
set(MAIN_DEFINITIONS
|
||||
__FORKNAME__=inav
|
||||
__REVISION__="${GIT_REV}"
|
||||
)
|
||||
|
||||
|
||||
# Can't check for OSX yet at this point
|
||||
if(SITL)
|
||||
set(MAIN_COMPILE_OPTIONS
|
||||
-Wall
|
||||
-Wextra
|
||||
-Wdouble-promotion
|
||||
-Wstrict-prototypes
|
||||
-Werror=switch
|
||||
#-Wno-unknown-warning-option
|
||||
)
|
||||
else()
|
||||
set(MAIN_COMPILE_OPTIONS
|
||||
-Wall
|
||||
-Wextra
|
||||
-Wunsafe-loop-optimizations
|
||||
-Wdouble-promotion
|
||||
-Wstrict-prototypes
|
||||
-Werror=switch
|
||||
)
|
||||
endif()
|
||||
|
||||
macro(main_sources var) # list-var src-1...src-n
|
||||
set(${var} ${ARGN})
|
||||
list(TRANSFORM ${var} PREPEND "${MAIN_SRC_DIR}/")
|
||||
endmacro()
|
||||
|
||||
function(exclude var excludes)
|
||||
set(filtered "")
|
||||
foreach(item ${${var}})
|
||||
if (NOT ${item} IN_LIST excludes)
|
||||
list(APPEND filtered ${item})
|
||||
endif()
|
||||
endforeach()
|
||||
set(${var} ${filtered} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(exclude_basenames var excludes)
|
||||
set(filtered "")
|
||||
foreach(item ${${var}})
|
||||
get_filename_component(basename ${item} NAME)
|
||||
if (NOT ${basename} IN_LIST excludes)
|
||||
list(APPEND filtered ${item})
|
||||
endif()
|
||||
endforeach()
|
||||
set(${var} ${filtered} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(glob_except var pattern excludes)
|
||||
file(GLOB results ${pattern})
|
||||
list(LENGTH results count)
|
||||
if(count EQUAL 0)
|
||||
message(FATAL_ERROR "glob with pattern '${pattern}' returned no results")
|
||||
endif()
|
||||
exclude_basenames(results "${excludes}")
|
||||
set(${var} ${results} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(get_generated_files_dir output target_name)
|
||||
set(${output} ${CMAKE_CURRENT_BINARY_DIR}/${target_name} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(setup_executable exe name)
|
||||
get_generated_files_dir(generated_dir ${name})
|
||||
target_compile_options(${exe} PRIVATE ${MAIN_COMPILE_OPTIONS})
|
||||
target_include_directories(${exe} PRIVATE ${generated_dir} ${MAIN_INCLUDE_DIRS})
|
||||
target_compile_definitions(${exe} PRIVATE ${MAIN_DEFINITIONS} __TARGET__="${name}" ${name})
|
||||
# XXX: Don't make SETTINGS_GENERATED_C part of the build,
|
||||
# since it's compiled via #include in settings.c. This will
|
||||
# change once we move off PGs
|
||||
target_sources(${exe} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/${name}/${SETTINGS_GENERATED_H}")
|
||||
set_target_properties(${exe} PROPERTIES
|
||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
|
||||
)
|
||||
if(IS_RELEASE_BUILD AND NOT (CMAKE_HOST_APPLE AND SITL))
|
||||
set_target_properties(${exe} PROPERTIES
|
||||
INTERPROCEDURAL_OPTIMIZATION ON
|
||||
)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(setup_firmware_target exe name)
|
||||
setup_executable(${exe} ${name})
|
||||
enable_settings(${exe} ${name})
|
||||
get_property(targets GLOBAL PROPERTY VALID_TARGETS)
|
||||
list(APPEND targets ${name})
|
||||
set_property(GLOBAL PROPERTY VALID_TARGETS "${targets}")
|
||||
if(NOT SITL)
|
||||
setup_openocd(${exe} ${name})
|
||||
setup_svd(${exe} ${name})
|
||||
endif()
|
||||
|
||||
cmake_parse_arguments(args "SKIP_RELEASES" "" "" ${ARGN})
|
||||
if(args_SKIP_RELEASES)
|
||||
set_target_properties(${exe} ${name} PROPERTIES SKIP_RELEASES ON)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(exclude_from_all target)
|
||||
set_target_properties(${target} PROPERTIES
|
||||
TARGET_MESSAGES OFF
|
||||
EXCLUDE_FROM_ALL ON
|
||||
EXCLUDE_FROM_DEFAULT_BUILD ON)
|
||||
endfunction()
|
||||
|
||||
function(collect_targets)
|
||||
get_property(targets GLOBAL PROPERTY VALID_TARGETS)
|
||||
list(SORT targets)
|
||||
set(release_targets)
|
||||
foreach(target ${targets})
|
||||
get_target_property(skip_releases ${target} SKIP_RELEASES)
|
||||
if(NOT skip_releases)
|
||||
list(APPEND release_targets ${target})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
list(JOIN targets " " target_names)
|
||||
list(JOIN release_targets " " release_targets_names)
|
||||
set_property(GLOBAL PROPERTY RELEASE_TARGETS ${release_targets})
|
||||
|
||||
set(list_target_name "targets")
|
||||
add_custom_target(${list_target_name}
|
||||
COMMAND ${CMAKE_COMMAND} -E echo "Valid targets: ${target_names}"
|
||||
COMMAND ${CMAKE_COMMAND} -E echo "Release targets: ${release_targets_names}"
|
||||
)
|
||||
exclude_from_all(${list_target_name})
|
||||
set(release_target_name "release")
|
||||
add_custom_target(${release_target_name}
|
||||
${CMAKE_COMMAND} -E true
|
||||
DEPENDS ${release_targets}
|
||||
)
|
||||
list(LENGTH targets target_count)
|
||||
list(LENGTH release_targets release_target_count)
|
||||
message("-- ${target_count} targets (${release_target_count} for release) found for toolchain ${TOOLCHAIN}")
|
||||
endfunction()
|
||||
@@ -0,0 +1,84 @@
|
||||
set(OPENOCD "" CACHE STRING "path to openocd (default: search for it)")
|
||||
set(OPENOCD_CFG "" CACHE STRING "path to openocd configuration (default: generate automatically)")
|
||||
set(OPENOCD_INTERFACE "" CACHE STRING "openocd interface name (default: automatic depending on target)")
|
||||
|
||||
if (OPENOCD)
|
||||
set(OPENOCD_PATH ${OPENOCD})
|
||||
else()
|
||||
find_program(OPENOCD_FOUND_PATH NAMES openocd openocd.exe)
|
||||
if (NOT OPENOCD_FOUND_PATH)
|
||||
message(STATUS "Could not find openocd, debugging won't be available")
|
||||
else()
|
||||
set(OPENOCD_PATH ${OPENOCD_FOUND_PATH})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(OPENOCD_PATH)
|
||||
# Retrieve version number as a sanity check
|
||||
execute_process(COMMAND ${OPENOCD_PATH} -v
|
||||
OUTPUT_QUIET
|
||||
ERROR_VARIABLE OPENOCD_HELP
|
||||
RESULT_VARIABLE OPENOCD_RESULT)
|
||||
|
||||
string(REPLACE "\n" ";" OPENOCD_HELP_LINES ${OPENOCD_HELP})
|
||||
list(GET OPENOCD_HELP_LINES 0 OPENOCD_FIRST_HELP_LINE)
|
||||
string(REPLACE "\r" "" OPENOCD_HELP_LINE ${OPENOCD_FIRST_HELP_LINE})
|
||||
if (NOT OPENOCD_RESULT EQUAL 0)
|
||||
# User provided an incorrect path
|
||||
message(FATAL_ERROR "error executing ${OPENOCD_PATH} (${OPENOCD_RESULT})")
|
||||
endif()
|
||||
message(STATUS "using openocd: ${OPENOCD_HELP_LINE}")
|
||||
add_custom_target(openocd ${OPENOCD_PATH} -f ${OPENOCD_CFG}
|
||||
COMMENT "Run openocd using OPENOCD_CFG=(${OPENOCD_CFG}) as configuration"
|
||||
USES_TERMINAL
|
||||
)
|
||||
endif()
|
||||
|
||||
function(setup_openocd target_exe target_name)
|
||||
if(OPENOCD_INTERFACE)
|
||||
set(openocd_interface ${OPENOCD_INTERFACE})
|
||||
else()
|
||||
get_property(openocd_interface TARGET ${target_exe} PROPERTY OPENOCD_DEFAULT_INTERFACE)
|
||||
endif()
|
||||
get_property(openocd_target TARGET ${target_exe} PROPERTY OPENOCD_TARGET)
|
||||
if(OPENOCD_CFG OR (openocd_target AND openocd_interface))
|
||||
set(openocd_run_target "openocd_${target_name}")
|
||||
if (OPENOCD_CFG AND NOT OPENOCD_CFG STREQUAL "")
|
||||
get_filename_component(openocd_cfg_path ${OPENOCD_CFG}
|
||||
ABSOLUTE
|
||||
BASE_DIR ${CMAKE_BINARY_DIR})
|
||||
else()
|
||||
set(openocd_cfg_path ${CMAKE_BINARY_DIR}/openocd/${target_name}.cfg)
|
||||
add_custom_command(
|
||||
OUTPUT ${openocd_cfg_path}
|
||||
COMMENT "Generating openocd configuration for ${openocd_target} via ${openocd_interface}"
|
||||
COMMAND ${CMAKE_COMMAND} -P ${MAIN_DIR}/cmake/openocd_cfg.cmake
|
||||
${openocd_target} ${openocd_interface} ${openocd_cfg_path}
|
||||
)
|
||||
endif()
|
||||
|
||||
# Target for openocd configuration
|
||||
set(openocd_cfg_target "openocd_cfg_${target_name}")
|
||||
add_custom_target(${openocd_cfg_target} DEPENDS ${openocd_cfg_path})
|
||||
exclude_from_all(${openocd_cfg_target})
|
||||
|
||||
# Target for running openocd
|
||||
add_custom_target(${openocd_run_target} ${OPENOCD_PATH} -f ${openocd_cfg_path}
|
||||
COMMENT "Running openocd for target ${target_name} via ${openocd_interface}"
|
||||
DEPENDS ${openocd_cfg_path}
|
||||
USES_TERMINAL
|
||||
)
|
||||
exclude_from_all(${openocd_run_target})
|
||||
# Target for flashing via openocd
|
||||
set(openocd_flash_target "openocd_flash_${target_name}")
|
||||
add_custom_target(${openocd_flash_target} ${CMAKE_COMMAND} -E env
|
||||
OPENOCD_CMD=${OPENOCD_PATH}
|
||||
${MAIN_UTILS_DIR}/openocd_flash.py -f
|
||||
${openocd_cfg_path} $<TARGET_FILE:${target_exe}>
|
||||
|
||||
COMMENT "Flashing ${target_name} with openocd"
|
||||
DEPENDS ${openocd_cfg_path} ${target_exe}
|
||||
)
|
||||
exclude_from_all(${openocd_flash_target})
|
||||
endif()
|
||||
endfunction()
|
||||
@@ -0,0 +1,20 @@
|
||||
# This is called from the targets that build the
|
||||
# openocd.cfg file
|
||||
if(NOT CMAKE_ARGC EQUAL 6)
|
||||
message(FATAL_ERROR "usage: cmake -P openocd_cfg.cmake <target> <interface> <output>")
|
||||
endif()
|
||||
|
||||
set(OPENOCD_TARGET ${CMAKE_ARGV3})
|
||||
set(OPENOCD_INTERFACE ${CMAKE_ARGV4})
|
||||
set(OUTPUT ${CMAKE_ARGV5})
|
||||
|
||||
set(opencd_cfg)
|
||||
list(APPEND openocd_cfg "source [find interface/${OPENOCD_INTERFACE}.cfg]")
|
||||
list(APPEND openocd_cfg "source [find target/${OPENOCD_TARGET}.cfg]")
|
||||
list(APPEND openocd_cfg "init")
|
||||
list(APPEND openocd_cfg "arm semihosting enable")
|
||||
list(APPEND openocd_cfg "reset halt")
|
||||
list(JOIN openocd_cfg "\n" contents)
|
||||
set(contents "${contents}\n")
|
||||
|
||||
file(WRITE ${OUTPUT} ${contents})
|
||||
@@ -0,0 +1,50 @@
|
||||
adcChannelConfig_t 4 0
|
||||
armingConfig_t 6 3
|
||||
barometerConfig_t 8 5
|
||||
batteryMetersConfig_t 24 2
|
||||
beeperConfig_t 12 2
|
||||
blackboxConfig_t 16 4
|
||||
compassConfig_t 24 6
|
||||
displayConfig_t 1 0
|
||||
djiOsdConfig_t 6 3
|
||||
escSensorConfig_t 4 1
|
||||
ezTuneSettings_t 12 1
|
||||
failsafeConfig_t 22 3
|
||||
featureConfig_t 4 0
|
||||
generalSettings_t 1 0
|
||||
geozone_config_t 20 0
|
||||
gimbalConfig_t 10 1
|
||||
gimbalSerialConfig_t 1 0
|
||||
gpsConfig_t 11 5
|
||||
gyroConfig_t 64 12
|
||||
headTrackerConfig_t 16 1
|
||||
imuConfig_t 16 2
|
||||
ledPinConfig_t 1 0
|
||||
logConfig_t 8 0
|
||||
modeActivationOperatorConfig_t 1 0
|
||||
motorConfig_t 10 11
|
||||
navConfig_t 156 7
|
||||
navFwAutolandConfig_t 16 0
|
||||
opticalFlowConfig_t 8 2
|
||||
osdCommonConfig_t 1 0
|
||||
osdConfig_t 160 15
|
||||
osdJoystickConfig_t 6 0
|
||||
pidAutotuneConfig_t 10 2
|
||||
pidProfile_t 292 11
|
||||
pitotmeterConfig_t 8 2
|
||||
positionEstimationConfig_t 72 8
|
||||
powerLimitsConfig_t 8 1
|
||||
rangefinderConfig_t 2 3
|
||||
rcControlsConfig_t 10 4
|
||||
reversibleMotorsConfig_t 6 0
|
||||
rpmFilterConfig_t 10 1
|
||||
rxConfig_t 36 13
|
||||
servoConfig_t 12 3
|
||||
smartportMasterConfig_t 2 0
|
||||
statsConfig_t 20 2
|
||||
systemConfig_t 40 7
|
||||
telemetryConfig_t 58 8
|
||||
timeConfig_t 4 1
|
||||
vtxConfig_t 55 4
|
||||
vtxSettingsConfig_t 12 2
|
||||
pinioBoxConfig_t 4 1
|
||||
@@ -0,0 +1,49 @@
|
||||
set(SETTINGS_GENERATED "settings_generated")
|
||||
set(SETTINGS_GENERATED_C "${SETTINGS_GENERATED}.c")
|
||||
set(SETTINGS_GENERATED_H "${SETTINGS_GENERATED}.h")
|
||||
set(SETTINGS_FILE "${MAIN_SRC_DIR}/fc/settings.yaml")
|
||||
set(SETTINGS_GENERATOR "${MAIN_UTILS_DIR}/settings.rb")
|
||||
|
||||
include(CMakeParseArguments)
|
||||
|
||||
function(enable_settings exe name)
|
||||
get_generated_files_dir(dir ${name})
|
||||
get_target_property(options ${exe} COMPILE_OPTIONS)
|
||||
get_target_property(includes ${exe} INCLUDE_DIRECTORIES)
|
||||
list(TRANSFORM includes PREPEND "-I")
|
||||
get_target_property(defs ${exe} COMPILE_DEFINITIONS)
|
||||
list(TRANSFORM defs PREPEND "-D")
|
||||
list(APPEND cflags ${options})
|
||||
list(APPEND cflags ${includes})
|
||||
list(APPEND cflags ${defs})
|
||||
|
||||
cmake_parse_arguments(
|
||||
args
|
||||
# Boolean arguments
|
||||
""
|
||||
# Single value arguments
|
||||
"OUTPUTS;SETTINGS_CXX"
|
||||
# Multi-value arguments
|
||||
""
|
||||
# Start parsing after the known arguments
|
||||
${ARGN}
|
||||
)
|
||||
|
||||
find_program(RUBY_EXECUTABLE ruby)
|
||||
if (NOT RUBY_EXECUTABLE)
|
||||
message(FATAL_ERROR "Could not find ruby")
|
||||
endif()
|
||||
|
||||
if(host STREQUAL TOOLCHAIN)
|
||||
set(USE_HOST_GCC "-g")
|
||||
endif()
|
||||
set(output ${dir}/${SETTINGS_GENERATED_H} ${dir}/${SETTINGS_GENERATED_C})
|
||||
add_custom_command(
|
||||
OUTPUT ${output}
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} -E env CFLAGS="${cflags}" TARGET=${name} PATH="$ENV{PATH}" SETTINGS_CXX=${args_SETTINGS_CXX}
|
||||
${RUBY_EXECUTABLE} ${SETTINGS_GENERATOR} ${MAIN_DIR} ${SETTINGS_FILE} -o "${dir}" ${USE_HOST_GCC}
|
||||
DEPENDS ${SETTINGS_GENERATOR} ${SETTINGS_FILE}
|
||||
)
|
||||
set(${args_OUTPUTS} ${output} PARENT_SCOPE)
|
||||
endfunction()
|
||||
@@ -0,0 +1,176 @@
|
||||
|
||||
main_sources(SITL_COMMON_SRC_EXCLUDES
|
||||
build/atomic.h
|
||||
drivers/system.c
|
||||
drivers/time.c
|
||||
drivers/timer.c
|
||||
drivers/rcc.c
|
||||
drivers/persistent.c
|
||||
drivers/accgyro/accgyro_mpu.c
|
||||
drivers/display_ug2864hsweg01.c
|
||||
io/displayport_oled.c
|
||||
)
|
||||
|
||||
main_sources(SITL_SRC
|
||||
config/config_streamer_file.c
|
||||
drivers/serial_tcp.c
|
||||
drivers/serial_tcp.h
|
||||
target/SITL/sim/realFlight.c
|
||||
target/SITL/sim/realFlight.h
|
||||
target/SITL/sim/simHelper.c
|
||||
target/SITL/sim/simHelper.h
|
||||
target/SITL/sim/soap_client.c
|
||||
target/SITL/sim/soap_client.h
|
||||
target/SITL/sim/xplane.c
|
||||
target/SITL/sim/xplane.h
|
||||
)
|
||||
|
||||
|
||||
if(CMAKE_HOST_APPLE)
|
||||
set(MACOSX ON)
|
||||
endif()
|
||||
|
||||
set(SITL_LINK_OPTIONS
|
||||
-Wl,-L${STM32_LINKER_DIR}
|
||||
)
|
||||
|
||||
if(${CYGWIN})
|
||||
set(SITL_LINK_OPTIONS ${SITL_LINK_OPTIONS} "-static-libgcc")
|
||||
endif()
|
||||
|
||||
set(SITL_LINK_LIBRARIS
|
||||
-lpthread
|
||||
-lm
|
||||
-lc
|
||||
)
|
||||
|
||||
if(NOT MACOSX)
|
||||
set(SITL_LINK_LIBRARIS ${SITL_LINK_LIBRARIS} -lrt)
|
||||
endif()
|
||||
|
||||
set(SITL_COMPILE_OPTIONS
|
||||
-Wno-format #Fixme: Compile for 32bit, but settings.rb has to be adjusted
|
||||
-funsigned-char
|
||||
)
|
||||
|
||||
if(DEBUG)
|
||||
message(STATUS "Debug mode enabled. Adding -g to SITL_COMPILE_OPTIONS.")
|
||||
list(APPEND SITL_COMPILE_OPTIONS -g)
|
||||
endif()
|
||||
|
||||
if(ASAN)
|
||||
message(STATUS "AddressSanitizer enabled.")
|
||||
list(APPEND SITL_COMPILE_OPTIONS -fsanitize=address -fno-omit-frame-pointer)
|
||||
list(APPEND SITL_LINK_OPTIONS -fsanitize=address)
|
||||
endif()
|
||||
|
||||
if(NOT MACOSX)
|
||||
set(SITL_COMPILE_OPTIONS ${SITL_COMPILE_OPTIONS}
|
||||
-Wno-return-local-addr
|
||||
-Wno-error=maybe-uninitialized
|
||||
-fsingle-precision-constant
|
||||
)
|
||||
include(CheckLinkerFlag OPTIONAL)
|
||||
if(COMMAND check_linker_flag)
|
||||
check_linker_flag(C "-Wl,--no-warn-rwx-segments" LINKER_SUPPORTS_NO_RWX_WARNING)
|
||||
endif()
|
||||
if(LINKER_SUPPORTS_NO_RWX_WARNING)
|
||||
set(SITL_LINK_OPTIONS ${SITL_LINK_OPTIONS} "-Wl,--no-warn-rwx-segments")
|
||||
endif()
|
||||
else()
|
||||
set(SITL_COMPILE_OPTIONS ${SITL_COMPILE_OPTIONS}
|
||||
)
|
||||
endif()
|
||||
|
||||
set(SITL_DEFINITIONS
|
||||
SITL_BUILD
|
||||
)
|
||||
|
||||
function (target_sitl name)
|
||||
if(CMAKE_VERSION VERSION_GREATER 3.22)
|
||||
set(CMAKE_C_STANDARD 17)
|
||||
endif()
|
||||
|
||||
if(NOT host STREQUAL TOOLCHAIN)
|
||||
return()
|
||||
endif()
|
||||
|
||||
exclude(COMMON_SRC "${SITL_COMMON_SRC_EXCLUDES}")
|
||||
|
||||
set(target_sources)
|
||||
list(APPEND target_sources ${SITL_SRC})
|
||||
file(GLOB target_c_sources "${CMAKE_CURRENT_SOURCE_DIR}/*.c")
|
||||
file(GLOB target_h_sources "${CMAKE_CURRENT_SOURCE_DIR}/*.h")
|
||||
list(APPEND target_sources ${target_c_sources} ${target_h_sources})
|
||||
|
||||
set(target_definitions ${COMMON_COMPILE_DEFINITIONS})
|
||||
|
||||
set(hse_mhz ${STM32_DEFAULT_HSE_MHZ})
|
||||
math(EXPR hse_value "${hse_mhz} * 1000000")
|
||||
list(APPEND target_definitions "HSE_VALUE=${hse_value}")
|
||||
|
||||
if (MSP_UART)
|
||||
list(APPEND target_definitions "MSP_UART=${MSP_UART}")
|
||||
endif()
|
||||
|
||||
string(TOLOWER ${PROJECT_NAME} lowercase_project_name)
|
||||
set(binary_name ${lowercase_project_name}_${FIRMWARE_VERSION}_${name})
|
||||
if(DEFINED BUILD_SUFFIX AND NOT "" STREQUAL "${BUILD_SUFFIX}")
|
||||
set(binary_name "${binary_name}_${BUILD_SUFFIX}")
|
||||
endif()
|
||||
|
||||
list(APPEND target_definitions ${SITL_DEFINITIONS})
|
||||
set(exe_target ${name}.elf)
|
||||
add_executable(${exe_target})
|
||||
target_sources(${exe_target} PRIVATE ${target_sources} ${COMMON_SRC})
|
||||
target_include_directories(${exe_target} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
target_compile_definitions(${exe_target} PRIVATE ${target_definitions})
|
||||
|
||||
|
||||
if(WARNINGS_AS_ERRORS)
|
||||
target_compile_options(${exe_target} PRIVATE -Werror)
|
||||
endif()
|
||||
|
||||
target_compile_options(${exe_target} PRIVATE ${SITL_COMPILE_OPTIONS})
|
||||
|
||||
target_link_libraries(${exe_target} PRIVATE ${SITL_LINK_LIBRARIS})
|
||||
target_link_options(${exe_target} PRIVATE ${SITL_LINK_OPTIONS})
|
||||
|
||||
set(script_path ${MAIN_SRC_DIR}/target/link/sitl.ld)
|
||||
if(NOT EXISTS ${script_path})
|
||||
message(FATAL_ERROR "linker script ${script_path} doesn't exist")
|
||||
endif()
|
||||
set_target_properties(${exe_target} PROPERTIES LINK_DEPENDS ${script_path})
|
||||
if(NOT MACOSX)
|
||||
target_link_options(${exe_target} PRIVATE -T${script_path})
|
||||
endif()
|
||||
|
||||
if(${CYGWIN})
|
||||
set(exe_filename ${CMAKE_BINARY_DIR}/${binary_name}.exe)
|
||||
else()
|
||||
set(exe_filename ${CMAKE_BINARY_DIR}/${binary_name})
|
||||
endif()
|
||||
|
||||
add_custom_target(${name} ALL
|
||||
cmake -E copy $<TARGET_FILE:${exe_target}> ${exe_filename}
|
||||
)
|
||||
|
||||
setup_firmware_target(${exe_target} ${name} ${ARGN})
|
||||
#clean_<target>
|
||||
set(generator_cmd "")
|
||||
if (CMAKE_GENERATOR STREQUAL "Unix Makefiles")
|
||||
set(generator_cmd "make")
|
||||
elseif(CMAKE_GENERATOR STREQUAL "Ninja")
|
||||
set(generator_cmd "ninja")
|
||||
endif()
|
||||
if (NOT generator_cmd STREQUAL "")
|
||||
set(clean_target "clean_${name}")
|
||||
add_custom_target(${clean_target}
|
||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||||
COMMAND ${generator_cmd} clean
|
||||
COMMENT "Removing intermediate files for ${name}")
|
||||
set_target_properties(${clean_target} PROPERTIES
|
||||
EXCLUDE_FROM_ALL ON
|
||||
EXCLUDE_FROM_DEFAULT_BUILD ON)
|
||||
endif()
|
||||
endfunction()
|
||||
@@ -0,0 +1,30 @@
|
||||
main_sources(BOOTLOADER_SOURCES
|
||||
common/log.c
|
||||
common/log.h
|
||||
common/printf.c
|
||||
common/printf.h
|
||||
common/string_light.c
|
||||
common/string_light.h
|
||||
common/typeconversion.c
|
||||
common/typeconversion.h
|
||||
|
||||
drivers/bus.c
|
||||
drivers/bus_busdev_i2c.c
|
||||
drivers/bus_busdev_spi.c
|
||||
drivers/bus_i2c_soft.c
|
||||
drivers/io.c
|
||||
drivers/light_led.c
|
||||
drivers/persistent.c
|
||||
drivers/rcc.c
|
||||
drivers/serial.c
|
||||
drivers/system.c
|
||||
drivers/time.c
|
||||
drivers/timer.c
|
||||
|
||||
fc/firmware_update_common.c
|
||||
fc/firmware_update_common.h
|
||||
|
||||
target/common_hardware.c
|
||||
)
|
||||
|
||||
list(APPEND BOOTLOADER_SOURCES ${MAIN_DIR}/src/bl/bl_main.c)
|
||||
@@ -0,0 +1,4 @@
|
||||
main_sources(STM32_STDPERIPH_SRC
|
||||
drivers/bus_spi.c
|
||||
drivers/serial_uart.c
|
||||
)
|
||||
@@ -0,0 +1,447 @@
|
||||
include(stm32-bootloader)
|
||||
include(stm32f4)
|
||||
include(stm32f7)
|
||||
include(stm32h7)
|
||||
|
||||
include(CMakeParseArguments)
|
||||
|
||||
option(DEBUG_HARDFAULTS "Enable debugging of hard faults via custom handler")
|
||||
option(SEMIHOSTING "Enable semihosting")
|
||||
|
||||
message("-- DEBUG_HARDFAULTS: ${DEBUG_HARDFAULTS}, SEMIHOSTING: ${SEMIHOSTING}")
|
||||
|
||||
set(CMSIS_DIR "${MAIN_LIB_DIR}/main/CMSIS")
|
||||
set(CMSIS_INCLUDE_DIR "${CMSIS_DIR}/Core/Include")
|
||||
set(CMSIS_DSP_DIR "${MAIN_LIB_DIR}/main/CMSIS/DSP")
|
||||
set(CMSIS_DSP_INCLUDE_DIR "${CMSIS_DSP_DIR}/Include")
|
||||
|
||||
set(CMSIS_DSP_SRC
|
||||
BasicMathFunctions/arm_scale_f32.c
|
||||
BasicMathFunctions/arm_sub_f32.c
|
||||
BasicMathFunctions/arm_mult_f32.c
|
||||
BasicMathFunctions/arm_offset_f32.c
|
||||
TransformFunctions/arm_rfft_fast_f32.c
|
||||
TransformFunctions/arm_cfft_f32.c
|
||||
TransformFunctions/arm_rfft_fast_init_f32.c
|
||||
TransformFunctions/arm_cfft_radix8_f32.c
|
||||
TransformFunctions/arm_bitreversal2.S
|
||||
CommonTables/arm_common_tables.c
|
||||
ComplexMathFunctions/arm_cmplx_mag_f32.c
|
||||
StatisticsFunctions/arm_max_f32.c
|
||||
StatisticsFunctions/arm_rms_f32.c
|
||||
StatisticsFunctions/arm_std_f32.c
|
||||
StatisticsFunctions/arm_mean_f32.c
|
||||
)
|
||||
list(TRANSFORM CMSIS_DSP_SRC PREPEND "${CMSIS_DSP_DIR}/Source/")
|
||||
|
||||
set(STM32_STARTUP_DIR "${MAIN_SRC_DIR}/startup")
|
||||
|
||||
main_sources(STM32_VCP_SRC
|
||||
drivers/serial_usb_vcp.c
|
||||
drivers/usb_io.c
|
||||
)
|
||||
|
||||
main_sources(STM32_SDCARD_SRC
|
||||
drivers/sdcard/sdcard.c
|
||||
drivers/sdcard/sdcard_spi.c
|
||||
drivers/sdcard/sdcard_sdio.c
|
||||
drivers/sdcard/sdcard_standard.c
|
||||
)
|
||||
|
||||
# XXX: This code is not STM32 specific
|
||||
main_sources(STM32_ASYNCFATFS_SRC
|
||||
io/asyncfatfs/asyncfatfs.c
|
||||
io/asyncfatfs/fat_standard.c
|
||||
)
|
||||
|
||||
main_sources(STM32_MSC_SRC
|
||||
msc/usbd_storage.c
|
||||
)
|
||||
|
||||
main_sources(STM32_MSC_FLASH_SRC
|
||||
msc/usbd_storage_emfat.c
|
||||
msc/emfat.c
|
||||
msc/emfat_file.c
|
||||
)
|
||||
|
||||
main_sources(STM32_MSC_SDCARD_SRC
|
||||
msc/usbd_storage_sd_spi.c
|
||||
)
|
||||
|
||||
set(STM32_INCLUDE_DIRS
|
||||
"${CMSIS_INCLUDE_DIR}"
|
||||
"${CMSIS_DSP_INCLUDE_DIR}"
|
||||
"${MAIN_SRC_DIR}/target"
|
||||
)
|
||||
|
||||
set(STM32_DEFINITIONS
|
||||
)
|
||||
set(STM32_DEFAULT_HSE_MHZ 8)
|
||||
set(STM32_LINKER_DIR "${MAIN_SRC_DIR}/target/link")
|
||||
set(STM32_COMPILE_OPTIONS
|
||||
-ffunction-sections
|
||||
-fdata-sections
|
||||
-fno-common
|
||||
)
|
||||
|
||||
set(STM32_LINK_LIBRARIES
|
||||
-lm
|
||||
-lc
|
||||
)
|
||||
|
||||
if(SEMIHOSTING)
|
||||
list(APPEND STM32_LINK_LIBRARIES --specs=rdimon.specs -lrdimon)
|
||||
list(APPEND STM32_DEFINITIONS SEMIHOSTING)
|
||||
else()
|
||||
list(APPEND STM32_LINK_LIBRARIES -lnosys)
|
||||
endif()
|
||||
|
||||
set(STM32_LINK_OPTIONS
|
||||
-nostartfiles
|
||||
--specs=nano.specs
|
||||
-static
|
||||
-Wl,-gc-sections
|
||||
-Wl,-L${STM32_LINKER_DIR}
|
||||
-Wl,--cref
|
||||
-Wl,--no-wchar-size-warning
|
||||
-Wl,--print-memory-usage
|
||||
)
|
||||
|
||||
macro(get_stm32_target_features output_var dir target_name)
|
||||
execute_process(COMMAND "${CMAKE_C_COMPILER}" -E -dD -D${ARGV2} "${ARGV1}/target.h"
|
||||
ERROR_VARIABLE _errors
|
||||
RESULT_VARIABLE _result
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
OUTPUT_VARIABLE _contents)
|
||||
|
||||
if(NOT _result EQUAL 0)
|
||||
message(FATAL_ERROR "error extracting features for stm32 target ${ARGV2}: ${_errors}")
|
||||
endif()
|
||||
|
||||
string(REGEX MATCH "#define[\t ]+USE_VCP" HAS_VCP ${_contents})
|
||||
if(HAS_VCP)
|
||||
list(APPEND ${ARGV0} VCP)
|
||||
endif()
|
||||
string(REGEX MATCH "define[\t ]+USE_FLASHFS" HAS_FLASHFS ${_contents})
|
||||
if(HAS_FLASHFS)
|
||||
list(APPEND ${ARGV0} FLASHFS)
|
||||
endif()
|
||||
string(REGEX MATCH "define[\t ]+USE_SDCARD" HAS_SDCARD ${_contents})
|
||||
if (HAS_SDCARD)
|
||||
list(APPEND ${ARGV0} SDCARD)
|
||||
string(REGEX MATCH "define[\t ]+USE_SDCARD_SDIO" HAS_SDIO ${_contents})
|
||||
if (HAS_SDIO)
|
||||
list(APPEND ${ARGV0} SDIO)
|
||||
endif()
|
||||
endif()
|
||||
if(HAS_FLASHFS OR HAS_SDCARD)
|
||||
list(APPEND ${ARGV0} MSC)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
function(get_stm32_flash_size out size)
|
||||
# 4: 16, 6: 32, 8: 64, B: 128, C: 256, D: 384, E: 512, F: 768, G: 1024, H: 1536, I: 2048 KiB
|
||||
string(TOUPPER ${size} s)
|
||||
if(${s} STREQUAL "4")
|
||||
set(${out} 16 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "6")
|
||||
set(${out} 32 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "8")
|
||||
set(${out} 64 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "8")
|
||||
set(${out} 64 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "B")
|
||||
set(${out} 128 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "C")
|
||||
set(${out} 256 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "D")
|
||||
set(${out} 384 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "E")
|
||||
set(${out} 512 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "F")
|
||||
set(${out} 768 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "G")
|
||||
set(${out} 1024 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "H")
|
||||
set(${out} 1536 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
if(${s} STREQUAL "I")
|
||||
set(${out} 2048 PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(add_hex_target name exe hex)
|
||||
add_custom_target(${name} ALL
|
||||
cmake -E env PATH="$ENV{PATH}"
|
||||
# TODO: Overriding the start address with --set-start 0x08000000
|
||||
# seems to be required due to some incorrect assumptions about .hex
|
||||
# files in the configurator. Verify wether that's the case and fix
|
||||
# the bug in configurator or delete this comment.
|
||||
${CMAKE_OBJCOPY} -Oihex --set-start 0x08000000 $<TARGET_FILE:${exe}> ${hex}
|
||||
BYPRODUCTS ${hex}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
function(add_bin_target name exe bin)
|
||||
add_custom_target(${name}
|
||||
cmake -E env PATH="$ENV{PATH}"
|
||||
${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${exe}> ${bin}
|
||||
BYPRODUCTS ${bin}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
function(generate_map_file target)
|
||||
if(CMAKE_VERSION VERSION_LESS 3.15)
|
||||
set(map "$<TARGET_FILE:${target}>.map")
|
||||
else()
|
||||
set(map "$<TARGET_FILE_DIR:${target}>/$<TARGET_FILE_BASE_NAME:${target}>.map")
|
||||
endif()
|
||||
target_link_options(${target} PRIVATE "-Wl,-Map,${map}")
|
||||
endfunction()
|
||||
|
||||
function(set_linker_script target script)
|
||||
set(script_path ${STM32_LINKER_DIR}/${args_LINKER_SCRIPT}.ld)
|
||||
if(NOT EXISTS ${script_path})
|
||||
message(FATAL_ERROR "linker script ${script_path} doesn't exist")
|
||||
endif()
|
||||
set_target_properties(${target} PROPERTIES LINK_DEPENDS ${script_path})
|
||||
target_link_options(${elf_target} PRIVATE -T${script_path})
|
||||
endfunction()
|
||||
|
||||
function(add_stm32_executable)
|
||||
cmake_parse_arguments(
|
||||
args
|
||||
# Boolean arguments
|
||||
""
|
||||
# Single value arguments
|
||||
"FILENAME;NAME;OPTIMIZATION;OUTPUT_BIN_FILENAME;OUTPUT_HEX_FILENAME;OUTPUT_TARGET_NAME"
|
||||
# Multi-value arguments
|
||||
"COMPILE_DEFINITIONS;COMPILE_OPTIONS;INCLUDE_DIRECTORIES;LINK_OPTIONS;LINKER_SCRIPT;SOURCES"
|
||||
# Start parsing after the known arguments
|
||||
${ARGN}
|
||||
)
|
||||
set(elf_target ${args_NAME}.elf)
|
||||
add_executable(${elf_target})
|
||||
target_sources(${elf_target} PRIVATE ${args_SOURCES})
|
||||
target_include_directories(${elf_target} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${args_INCLUDE_DIRECTORIES} ${STM32_INCLUDE_DIRS})
|
||||
target_compile_definitions(${elf_target} PRIVATE ${args_COMPILE_DEFINITIONS})
|
||||
target_compile_options(${elf_target} PRIVATE ${STM32_COMPILE_OPTIONS} ${args_COMPILE_OPTIONS})
|
||||
if(WARNINGS_AS_ERRORS)
|
||||
target_compile_options(${elf_target} PRIVATE -Werror)
|
||||
endif()
|
||||
if (IS_RELEASE_BUILD)
|
||||
target_compile_options(${elf_target} PRIVATE ${args_OPTIMIZATION})
|
||||
target_link_options(${elf_target} PRIVATE ${args_OPTIMIZATION})
|
||||
endif()
|
||||
target_link_libraries(${elf_target} PRIVATE ${STM32_LINK_LIBRARIES})
|
||||
target_link_options(${elf_target} PRIVATE ${STM32_LINK_OPTIONS} ${args_LINK_OPTIONS})
|
||||
generate_map_file(${elf_target})
|
||||
set_linker_script(${elf_target} ${args_LINKER_SCRIPT})
|
||||
if(args_FILENAME)
|
||||
set(basename ${CMAKE_BINARY_DIR}/${args_FILENAME})
|
||||
set(hex_filename ${basename}.hex)
|
||||
add_hex_target(${args_NAME} ${elf_target} ${hex_filename})
|
||||
set(bin_filename ${basename}.bin)
|
||||
add_bin_target(${args_NAME}.bin ${elf_target} ${bin_filename})
|
||||
endif()
|
||||
if(args_OUTPUT_BIN_FILENAME)
|
||||
set(${args_OUTPUT_BIN_FILENAME} ${bin_filename} PARENT_SCOPE)
|
||||
endif()
|
||||
if(args_OUTPUT_TARGET_NAME)
|
||||
set(${args_OUTPUT_TARGET_NAME} ${elf_target} PARENT_SCOPE)
|
||||
endif()
|
||||
if(args_OUTPUT_HEX_FILENAME)
|
||||
set(${args_OUTPUT_HEX_FILENAME} ${hex_filename} PARENT_SCOPE)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(target_stm32)
|
||||
if(NOT arm-none-eabi STREQUAL TOOLCHAIN)
|
||||
return()
|
||||
endif()
|
||||
# Parse keyword arguments
|
||||
cmake_parse_arguments(
|
||||
args
|
||||
# Boolean arguments
|
||||
"DISABLE_MSC;BOOTLOADER;NO_BOOTLOADER"
|
||||
# Single value arguments
|
||||
"HSE_MHZ;LINKER_SCRIPT;NAME;OPENOCD_TARGET;OPTIMIZATION;STARTUP;SVD"
|
||||
# Multi-value arguments
|
||||
"COMPILE_DEFINITIONS;COMPILE_OPTIONS;INCLUDE_DIRECTORIES;LINK_OPTIONS;SOURCES;MSC_SOURCES;MSC_INCLUDE_DIRECTORIES;VCP_SOURCES;VCP_INCLUDE_DIRECTORIES"
|
||||
# Start parsing after the known arguments
|
||||
${ARGN}
|
||||
)
|
||||
set(name ${args_NAME})
|
||||
|
||||
if (args_HSE_MHZ)
|
||||
set(hse_mhz ${args_HSE_MHZ})
|
||||
else()
|
||||
set(hse_mhz ${STM32_DEFAULT_HSE_MHZ})
|
||||
endif()
|
||||
|
||||
set(target_sources ${STM32_STARTUP_DIR}/${args_STARTUP})
|
||||
list(APPEND target_sources ${args_SOURCES})
|
||||
file(GLOB target_c_sources "${CMAKE_CURRENT_SOURCE_DIR}/*.c")
|
||||
file(GLOB target_h_sources "${CMAKE_CURRENT_SOURCE_DIR}/*.h")
|
||||
list(APPEND target_sources ${target_c_sources} ${target_h_sources})
|
||||
|
||||
set(target_include_directories ${args_INCLUDE_DIRECTORIES})
|
||||
|
||||
set(target_definitions ${STM32_DEFINITIONS} ${COMMON_COMPILE_DEFINITIONS})
|
||||
|
||||
get_stm32_target_features(features "${CMAKE_CURRENT_SOURCE_DIR}" ${name})
|
||||
set_property(TARGET ${elf_target} PROPERTY FEATURES ${features})
|
||||
|
||||
if(VCP IN_LIST features)
|
||||
list(APPEND target_sources ${STM32_VCP_SRC} ${args_VCP_SOURCES})
|
||||
list(APPEND target_include_directories ${args_VCP_INCLUDE_DIRECTORIES})
|
||||
endif()
|
||||
if(SDCARD IN_LIST features)
|
||||
list(APPEND target_sources ${STM32_SDCARD_SRC} ${STM32_ASYNCFATFS_SRC})
|
||||
endif()
|
||||
|
||||
set(msc_sources)
|
||||
if(NOT args_DISABLE_MSC AND MSC IN_LIST features)
|
||||
list(APPEND target_include_directories ${args_MSC_INCLUDE_DIRECTORIES})
|
||||
list(APPEND msc_sources ${STM32_MSC_SRC} ${args_MSC_SOURCES})
|
||||
list(APPEND target_definitions USE_USB_MSC)
|
||||
if(FLASHFS IN_LIST features)
|
||||
list(APPEND msc_sources ${STM32_MSC_FLASH_SRC})
|
||||
endif()
|
||||
if (SDCARD IN_LIST features)
|
||||
list(APPEND msc_sources ${STM32_MSC_SDCARD_SRC})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
math(EXPR hse_value "${hse_mhz} * 1000000")
|
||||
list(APPEND target_definitions "HSE_VALUE=${hse_value}")
|
||||
|
||||
if (MSP_UART)
|
||||
list(APPEND target_definitions "MSP_UART=${MSP_UART}")
|
||||
endif()
|
||||
|
||||
if(args_COMPILE_DEFINITIONS)
|
||||
list(APPEND target_definitions ${args_COMPILE_DEFINITIONS})
|
||||
endif()
|
||||
if(DEBUG_HARDFAULTS)
|
||||
list(APPEND target_definitions DEBUG_HARDFAULTS)
|
||||
endif()
|
||||
|
||||
string(TOLOWER ${PROJECT_NAME} lowercase_project_name)
|
||||
set(binary_name ${lowercase_project_name}_${FIRMWARE_VERSION}_${name})
|
||||
if(DEFINED BUILD_SUFFIX AND NOT "" STREQUAL "${BUILD_SUFFIX}")
|
||||
set(binary_name "${binary_name}_${BUILD_SUFFIX}")
|
||||
endif()
|
||||
|
||||
# Main firmware
|
||||
add_stm32_executable(
|
||||
NAME ${name}
|
||||
FILENAME ${binary_name}
|
||||
SOURCES ${target_sources} ${msc_sources} ${CMSIS_DSP_SRC} ${COMMON_SRC}
|
||||
COMPILE_DEFINITIONS ${target_definitions}
|
||||
COMPILE_OPTIONS ${args_COMPILE_OPTIONS}
|
||||
INCLUDE_DIRECTORIES ${target_include_directories}
|
||||
LINK_OPTIONS ${args_LINK_OPTIONS}
|
||||
LINKER_SCRIPT ${args_LINKER_SCRIPT}
|
||||
OPTIMIZATION ${args_OPTIMIZATION}
|
||||
|
||||
OUTPUT_HEX_FILENAME main_hex_filename
|
||||
OUTPUT_TARGET_NAME main_target_name
|
||||
)
|
||||
|
||||
set_property(TARGET ${main_target_name} PROPERTY OPENOCD_TARGET ${args_OPENOCD_TARGET})
|
||||
set_property(TARGET ${main_target_name} PROPERTY OPENOCD_DEFAULT_INTERFACE stlink)
|
||||
set_property(TARGET ${main_target_name} PROPERTY SVD ${args_SVD})
|
||||
|
||||
setup_firmware_target(${main_target_name} ${name} ${ARGN})
|
||||
|
||||
if(args_BOOTLOADER AND NOT args_NO_BOOTLOADER)
|
||||
# Bootloader for the target
|
||||
set(bl_suffix _bl)
|
||||
add_stm32_executable(
|
||||
NAME ${name}${bl_suffix}
|
||||
FILENAME ${binary_name}${bl_suffix}
|
||||
SOURCES ${target_sources} ${BOOTLOADER_SOURCES}
|
||||
COMPILE_DEFINITIONS ${target_definitions} BOOTLOADER MSP_FIRMWARE_UPDATE
|
||||
COMPILE_OPTIONS ${args_COMPILE_OPTIONS}
|
||||
INCLUDE_DIRECTORIES ${target_include_directories}
|
||||
LINK_OPTIONS ${args_LINK_OPTIONS}
|
||||
LINKER_SCRIPT ${args_LINKER_SCRIPT}${bl_suffix}
|
||||
OPTIMIZATION ${args_OPTIMIZATION}
|
||||
|
||||
OUTPUT_BIN_FILENAME bl_bin_filename
|
||||
OUTPUT_HEX_FILENAME bl_hex_filename
|
||||
OUTPUT_TARGET_NAME bl_target_name
|
||||
)
|
||||
setup_executable(${bl_target_name} ${name})
|
||||
|
||||
# Main firmware, but for running with the bootloader
|
||||
set(for_bl_suffix _for_bl)
|
||||
add_stm32_executable(
|
||||
NAME ${name}${for_bl_suffix}
|
||||
FILENAME ${binary_name}${for_bl_suffix}
|
||||
SOURCES ${target_sources} ${msc_sources} ${CMSIS_DSP_SRC} ${COMMON_SRC}
|
||||
COMPILE_DEFINITIONS ${target_definitions} MSP_FIRMWARE_UPDATE
|
||||
COMPILE_OPTIONS ${args_COMPILE_OPTIONS}
|
||||
INCLUDE_DIRECTORIES ${target_include_directories}
|
||||
LINK_OPTIONS ${args_LINK_OPTIONS}
|
||||
LINKER_SCRIPT ${args_LINKER_SCRIPT}${for_bl_suffix}
|
||||
OPTIMIZATION ${args_OPTIMIZATION}
|
||||
|
||||
OUTPUT_BIN_FILENAME for_bl_bin_filename
|
||||
OUTPUT_HEX_FILENAME for_bl_hex_filename
|
||||
OUTPUT_TARGET_NAME for_bl_target_name
|
||||
)
|
||||
setup_executable(${for_bl_target_name} ${name})
|
||||
|
||||
# Combined with bootloader and main firmware
|
||||
set(with_bl_suffix _with_bl)
|
||||
set(combined_hex ${CMAKE_BINARY_DIR}/${binary_name}${with_bl_suffix}.hex)
|
||||
set(with_bl_target ${name}${with_bl_suffix})
|
||||
add_custom_target(${with_bl_target}
|
||||
${CMAKE_SOURCE_DIR}/src/utils/combine_tool ${bl_bin_filename} ${for_bl_bin_filename} ${combined_hex}
|
||||
BYPRODUCTS ${combined_hex}
|
||||
)
|
||||
add_dependencies(${with_bl_target} ${bl_target_name} ${for_bl_target_name})
|
||||
endif()
|
||||
|
||||
# clean_<target>
|
||||
set(generator_cmd "")
|
||||
if (CMAKE_GENERATOR STREQUAL "Unix Makefiles")
|
||||
set(generator_cmd "make")
|
||||
elseif(CMAKE_GENERATOR STREQUAL "Ninja")
|
||||
set(generator_cmd "ninja")
|
||||
endif()
|
||||
if (NOT generator_cmd STREQUAL "")
|
||||
set(clean_target "clean_${name}")
|
||||
add_custom_target(${clean_target}
|
||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||||
COMMAND ${generator_cmd} clean
|
||||
COMMENT "Removing intermediate files for ${name}")
|
||||
set_property(TARGET ${clean_target} PROPERTY
|
||||
EXCLUDE_FROM_ALL 1
|
||||
EXCLUDE_FROM_DEFAULT_BUILD 1)
|
||||
endif()
|
||||
endfunction()
|
||||
@@ -0,0 +1,59 @@
|
||||
set(STM32_USBOTG_DIR "${MAIN_LIB_DIR}/main/STM32_USB_OTG_Driver")
|
||||
set(STM32_USBCORE_DIR "${MAIN_LIB_DIR}/main/STM32_USB_Device_Library/Core")
|
||||
set(STM32_USBCDC_DIR "${MAIN_LIB_DIR}/main/STM32_USB_Device_Library/Class/cdc")
|
||||
set(STM32_USBHID_DIR "${MAIN_LIB_DIR}/main/STM32_USB_Device_Library/Class/hid")
|
||||
set(STM32_USBWRAPPER_DIR "${MAIN_LIB_DIR}/main/STM32_USB_Device_Library/Class/hid_cdc_wrapper")
|
||||
set(STM32_USBMSC_DIR "${MAIN_LIB_DIR}/main/STM32_USB_Device_Library/Class/msc")
|
||||
|
||||
set(STM32F4_USB_INCLUDE_DIRS
|
||||
"${STM32_USBOTG_DIR}/inc"
|
||||
"${STM32_USBCORE_DIR}/inc"
|
||||
"${STM32_USBCDC_DIR}/inc"
|
||||
"${STM32_USBHID_DIR}/inc"
|
||||
"${STM32_USBWRAPPER_DIR}/inc"
|
||||
"${STM32_USBMSC_DIR}/inc"
|
||||
)
|
||||
|
||||
set(STM32_USBOTG_SRC
|
||||
usb_core.c
|
||||
usb_dcd.c
|
||||
usb_dcd_int.c
|
||||
)
|
||||
list(TRANSFORM STM32_USBOTG_SRC PREPEND "${STM32_USBOTG_DIR}/src/")
|
||||
|
||||
set(STM32_USBCORE_SRC
|
||||
usbd_core.c
|
||||
usbd_ioreq.c
|
||||
usbd_req.c
|
||||
)
|
||||
list(TRANSFORM STM32_USBCORE_SRC PREPEND "${STM32_USBCORE_DIR}/src/")
|
||||
|
||||
set(STM32_USBCDC_SRC
|
||||
"${STM32_USBCDC_DIR}/src/usbd_cdc_core.c"
|
||||
)
|
||||
|
||||
set(STM32_USBHID_SRC
|
||||
"${STM32_USBHID_DIR}/src/usbd_hid_core.c"
|
||||
)
|
||||
|
||||
set(STM32_USBWRAPPER_SRC
|
||||
"${STM32_USBWRAPPER_DIR}/src/usbd_hid_cdc_wrapper.c"
|
||||
)
|
||||
|
||||
set(STM32F4_USBMSC_SRC
|
||||
usbd_msc_bot.c
|
||||
usbd_msc_core.c
|
||||
usbd_msc_data.c
|
||||
usbd_msc_scsi.c
|
||||
)
|
||||
main_sources(STM32F4_MSC_SRC
|
||||
msc/usbd_msc_desc.c
|
||||
)
|
||||
list(TRANSFORM STM32F4_USBMSC_SRC PREPEND "${STM32_USBMSC_DIR}/src/")
|
||||
list(APPEND STM32F4_USBMSC_SRC ${STM32F4_MSC_SRC})
|
||||
|
||||
list(APPEND STM32F4_USB_SRC ${STM32_USBOTG_SRC})
|
||||
list(APPEND STM32F4_USB_SRC ${STM32_USBCORE_SRC})
|
||||
list(APPEND STM32F4_USB_SRC ${STM32_USBCDC_SRC})
|
||||
list(APPEND STM32F4_USB_SRC ${STM32_USBHID_SRC})
|
||||
list(APPEND STM32F4_USB_SRC ${STM32_USBWRAPPER_SRC})
|
||||
@@ -0,0 +1,158 @@
|
||||
include(cortex-m4f)
|
||||
include(stm32-stdperiph)
|
||||
include(stm32f4-usb)
|
||||
|
||||
set(STM32F4_STDPERIPH_DIR "${MAIN_LIB_DIR}/main/STM32F4/Drivers/STM32F4xx_StdPeriph_Driver")
|
||||
set(STM32F4_CMSIS_DEVICE_DIR "${MAIN_LIB_DIR}/main/STM32F4/Drivers/CMSIS/Device/ST/STM32F4xx")
|
||||
set(STM32F4_CMSIS_DRIVERS_DIR "${MAIN_LIB_DIR}/main/STM32F4/Drivers/CMSIS")
|
||||
set(STM32F4_VCP_DIR "${MAIN_SRC_DIR}/vcpf4")
|
||||
|
||||
set(STM32F4_STDPERIPH_SRC_EXCLUDES
|
||||
stm32f4xx_can.c
|
||||
stm32f4xx_cec.c
|
||||
stm32f4xx_crc.c
|
||||
stm32f4xx_cryp.c
|
||||
stm32f4xx_cryp_aes.c
|
||||
stm32f4xx_cryp_des.c
|
||||
stm32f4xx_cryp_tdes.c
|
||||
stm32f4xx_dbgmcu.c
|
||||
stm32f4xx_dsi.c
|
||||
stm32f4xx_flash_ramfunc.c
|
||||
stm32f4xx_fmpi2c.c
|
||||
stm32f4xx_fmc.c
|
||||
stm32f4xx_hash.c
|
||||
stm32f4xx_hash_md5.c
|
||||
stm32f4xx_hash_sha1.c
|
||||
stm32f4xx_lptim.c
|
||||
stm32f4xx_qspi.c
|
||||
stm32f4xx_sai.c
|
||||
stm32f4xx_spdifrx.c
|
||||
)
|
||||
|
||||
set(STM32F4_STDPERIPH_SRC_DIR "${STM32F4_STDPERIPH_DIR}/src")
|
||||
glob_except(STM32F4_STDPERIPH_SRC "${STM32F4_STDPERIPH_SRC_DIR}/*.c" "${STM32F4_STDPERIPH_SRC_EXCLUDES}")
|
||||
|
||||
main_sources(STM32F4_SRC
|
||||
target/system_stm32f4xx.c
|
||||
|
||||
config/config_streamer_stm32f4.c
|
||||
config/config_streamer_ram.c
|
||||
config/config_streamer_extflash.c
|
||||
|
||||
drivers/adc_stm32f4xx.c
|
||||
drivers/adc_stm32f4xx.c
|
||||
drivers/bus_i2c_stm32f40x.c
|
||||
drivers/serial_uart_stm32f4xx.c
|
||||
drivers/system_stm32f4xx.c
|
||||
drivers/timer.c
|
||||
drivers/timer_impl_stdperiph.c
|
||||
drivers/timer_stm32f4xx.c
|
||||
drivers/uart_inverter.c
|
||||
drivers/dma_stm32f4xx.c
|
||||
drivers/sdcard/sdmmc_sdio_f4xx.c
|
||||
)
|
||||
|
||||
set(STM32F4_VCP_SRC
|
||||
stm32f4xx_it.c
|
||||
usb_bsp.c
|
||||
usbd_desc.c
|
||||
usbd_usr.c
|
||||
usbd_cdc_vcp.c
|
||||
)
|
||||
list(TRANSFORM STM32F4_VCP_SRC PREPEND "${STM32F4_VCP_DIR}/")
|
||||
|
||||
main_sources(STM32F4_MSC_SRC
|
||||
drivers/usb_msc_f4xx.c
|
||||
)
|
||||
|
||||
set(STM32F4_INCLUDE_DIRS
|
||||
"${CMSIS_INCLUDE_DIR}"
|
||||
"${CMSIS_DSP_INCLUDE_DIR}"
|
||||
"${STM32F4_STDPERIPH_DIR}/inc"
|
||||
"${STM32F4_CMSIS_DEVICE_DIR}"
|
||||
"${STM32F4_CMSIS_DRIVERS_DIR}"
|
||||
"${STM32F4_VCP_DIR}"
|
||||
)
|
||||
|
||||
set(STM32F4_DEFINITIONS
|
||||
${CORTEX_M4F_DEFINITIONS}
|
||||
STM32F4
|
||||
USE_STDPERIPH_DRIVER
|
||||
)
|
||||
|
||||
function(target_stm32f4xx)
|
||||
target_stm32(
|
||||
SOURCES ${STM32_STDPERIPH_SRC} ${STM32F4_SRC}
|
||||
COMPILE_DEFINITIONS ${STM32F4_DEFINITIONS}
|
||||
COMPILE_OPTIONS ${CORTEX_M4F_COMMON_OPTIONS} ${CORTEX_M4F_COMPILE_OPTIONS}
|
||||
INCLUDE_DIRECTORIES ${STM32F4_INCLUDE_DIRS}
|
||||
LINK_OPTIONS ${CORTEX_M4F_COMMON_OPTIONS} ${CORTEX_M4F_LINK_OPTIONS}
|
||||
|
||||
MSC_SOURCES ${STM32F4_USBMSC_SRC} ${STM32F4_MSC_SRC}
|
||||
VCP_SOURCES ${STM32F4_USB_SRC} ${STM32F4_VCP_SRC}
|
||||
VCP_INCLUDE_DIRECTORIES ${STM32F4_USB_INCLUDE_DIRS}
|
||||
|
||||
OPTIMIZATION -O2
|
||||
|
||||
OPENOCD_TARGET stm32f4x
|
||||
|
||||
${ARGN}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
set(STM32F405_COMPILE_DEFINITIONS
|
||||
STM32F40_41xxx
|
||||
STM32F405xx
|
||||
MCU_FLASH_SIZE=1024
|
||||
)
|
||||
|
||||
function(target_stm32f405xg name)
|
||||
target_stm32f4xx(
|
||||
NAME ${name}
|
||||
STARTUP startup_stm32f40xx.s
|
||||
SOURCES ${STM32F4_STDPERIPH_SRC}
|
||||
COMPILE_DEFINITIONS ${STM32F405_COMPILE_DEFINITIONS}
|
||||
LINKER_SCRIPT stm32_flash_f405xg
|
||||
SVD STM32F405
|
||||
BOOTLOADER
|
||||
${ARGN}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
set(STM32F411_OR_F427_STDPERIPH_SRC ${STM32F4_STDPERIPH_SRC})
|
||||
set(STM32F411_OR_F427_STDPERIPH_SRC_EXCLUDES "stm32f4xx_fsmc.c")
|
||||
exclude_basenames(STM32F411_OR_F427_STDPERIPH_SRC ${STM32F411_OR_F427_STDPERIPH_SRC_EXCLUDES})
|
||||
|
||||
set(STM32F411_COMPILE_DEFINITIONS
|
||||
STM32F411xE
|
||||
MCU_FLASH_SIZE=512
|
||||
OPTIMIZATION -Os
|
||||
)
|
||||
|
||||
function(target_stm32f411xe name)
|
||||
target_stm32f4xx(
|
||||
NAME ${name}
|
||||
STARTUP startup_stm32f411xe.s
|
||||
SOURCES ${STM32F411_OR_F427_STDPERIPH_SRC}
|
||||
COMPILE_DEFINITIONS ${STM32F411_COMPILE_DEFINITIONS}
|
||||
LINKER_SCRIPT stm32_flash_f411xe
|
||||
SVD STM32F411
|
||||
${ARGN}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
set(STM32F427_COMPILE_DEFINITIONS
|
||||
STM32F427_437xx
|
||||
MCU_FLASH_SIZE=1024
|
||||
)
|
||||
function(target_stm32f427xg name)
|
||||
target_stm32f4xx(
|
||||
NAME ${name}
|
||||
STARTUP startup_stm32f427xx.s
|
||||
SOURCES ${STM32F411_OR_F427_STDPERIPH_SRC}
|
||||
COMPILE_DEFINITIONS ${STM32F427_COMPILE_DEFINITIONS}
|
||||
LINKER_SCRIPT stm32_flash_f427xg
|
||||
SVD STM32F411
|
||||
${ARGN}
|
||||
)
|
||||
endfunction()
|
||||
@@ -0,0 +1,48 @@
|
||||
set(STM32F7_USBCORE_DIR "${MAIN_LIB_DIR}/main/STM32F7/Middlewares/ST/STM32_USB_Device_Library/Core")
|
||||
set(STM32F7_USBCORE_SRC
|
||||
usbd_core.c
|
||||
usbd_ctlreq.c
|
||||
usbd_ioreq.c
|
||||
)
|
||||
list(TRANSFORM STM32F7_USBCORE_SRC PREPEND "${STM32F7_USBCORE_DIR}/Src/")
|
||||
|
||||
set(STM32F7_USBCDC_DIR "${MAIN_LIB_DIR}/main/STM32F7/Middlewares/ST/STM32_USB_Device_Library/Class/CDC")
|
||||
set(STM32F7_USBCDC_SRC
|
||||
usbd_cdc.c
|
||||
)
|
||||
list(TRANSFORM STM32F7_USBCDC_SRC PREPEND "${STM32F7_USBCDC_DIR}/Src/")
|
||||
|
||||
set(STM32F7_USBHID_DIR "${MAIN_LIB_DIR}/main/STM32F7/Middlewares/ST/STM32_USB_Device_Library/Class/HID")
|
||||
set(STM32F7_USBHID_SRC
|
||||
usbd_hid.c
|
||||
)
|
||||
list(TRANSFORM STM32F7_USBHID_SRC PREPEND "${STM32F7_USBHID_DIR}/Src/")
|
||||
|
||||
set(STM32F7_USBCDCHID_DIR "${MAIN_LIB_DIR}/main/STM32F7/Middlewares/ST/STM32_USB_Device_Library/Class/CDC_HID")
|
||||
set(STM32F7_USBCDCHID_SRC
|
||||
usbd_cdc_hid.c
|
||||
)
|
||||
list(TRANSFORM STM32F7_USBCDCHID_SRC PREPEND "${STM32F7_USBCDCHID_DIR}/Src/")
|
||||
|
||||
set(STM32F7_USBMSC_DIR "${MAIN_LIB_DIR}/main/STM32F7/Middlewares/ST/STM32_USB_Device_Library/Class/MSC")
|
||||
set(STM32F7_USBMSC_SRC
|
||||
usbd_msc.c
|
||||
usbd_msc_bot.c
|
||||
usbd_msc_data.c
|
||||
usbd_msc_scsi.c
|
||||
)
|
||||
list(TRANSFORM STM32F7_USBMSC_SRC PREPEND "${STM32F7_USBMSC_DIR}/Src/")
|
||||
|
||||
set(STM32F7_USB_INCLUDE_DIRS
|
||||
"${STM32F7_USBCORE_DIR}/Inc"
|
||||
"${STM32F7_USBCDC_DIR}/Inc"
|
||||
"${STM32F7_USBHID_DIR}/Inc"
|
||||
"${STM32F7_USBCDCHID_DIR}/Inc"
|
||||
"${STM32F7_USBMSC_DIR}/Inc"
|
||||
)
|
||||
|
||||
list(APPEND STM32F7_USB_SRC ${STM32F7_USBCORE_SRC})
|
||||
list(APPEND STM32F7_USB_SRC ${STM32F7_USBCDC_SRC})
|
||||
list(APPEND STM32F7_USB_SRC ${STM32F7_USBHID_SRC})
|
||||
list(APPEND STM32F7_USB_SRC ${STM32F7_USBCDCHID_SRC})
|
||||
list(APPEND STM32F7_USB_SRC ${STM32F7_USBMSC_SRC})
|
||||
@@ -0,0 +1,144 @@
|
||||
include(cortex-m7)
|
||||
include(stm32f7-usb)
|
||||
|
||||
set(STM32F7_HAL_DIR "${MAIN_LIB_DIR}/main/STM32F7/Drivers/STM32F7xx_HAL_Driver")
|
||||
|
||||
set(STM32F7_HAL_SRC
|
||||
stm32f7xx_hal.c
|
||||
stm32f7xx_hal_adc.c
|
||||
stm32f7xx_hal_adc_ex.c
|
||||
stm32f7xx_hal_cortex.c
|
||||
stm32f7xx_hal_dac.c
|
||||
stm32f7xx_hal_dac_ex.c
|
||||
stm32f7xx_hal_dma.c
|
||||
stm32f7xx_hal_dma_ex.c
|
||||
stm32f7xx_hal_flash.c
|
||||
stm32f7xx_hal_flash_ex.c
|
||||
stm32f7xx_hal_gpio.c
|
||||
stm32f7xx_hal_i2c.c
|
||||
stm32f7xx_hal_i2c_ex.c
|
||||
stm32f7xx_hal_pcd.c
|
||||
stm32f7xx_hal_pcd_ex.c
|
||||
stm32f7xx_hal_pwr.c
|
||||
stm32f7xx_hal_pwr_ex.c
|
||||
stm32f7xx_hal_rcc.c
|
||||
stm32f7xx_hal_rcc_ex.c
|
||||
stm32f7xx_hal_rtc.c
|
||||
stm32f7xx_hal_rtc_ex.c
|
||||
stm32f7xx_hal_spi.c
|
||||
stm32f7xx_hal_tim.c
|
||||
stm32f7xx_hal_tim_ex.c
|
||||
stm32f7xx_hal_uart.c
|
||||
stm32f7xx_hal_usart.c
|
||||
stm32f7xx_ll_dma.c
|
||||
stm32f7xx_ll_dma2d.c
|
||||
stm32f7xx_ll_gpio.c
|
||||
stm32f7xx_ll_rcc.c
|
||||
stm32f7xx_ll_spi.c
|
||||
stm32f7xx_ll_tim.c
|
||||
stm32f7xx_ll_usb.c
|
||||
stm32f7xx_ll_utils.c
|
||||
stm32f7xx_hal_sd.c
|
||||
stm32f7xx_ll_sdmmc.c
|
||||
)
|
||||
list(TRANSFORM STM32F7_HAL_SRC PREPEND "${STM32F7_HAL_DIR}/Src/")
|
||||
|
||||
set(STM32F7_CMSIS_DEVICE_DIR "${MAIN_LIB_DIR}/main/STM32F7/Drivers/CMSIS/Device/ST/STM32F7xx")
|
||||
|
||||
set(STM32F7_VCP_DIR "${MAIN_SRC_DIR}/vcp_hal")
|
||||
|
||||
set(STM32F7_VCP_SRC
|
||||
usbd_desc.c
|
||||
usbd_conf_stm32f7xx.c
|
||||
usbd_cdc_interface.c
|
||||
)
|
||||
list(TRANSFORM STM32F7_VCP_SRC PREPEND "${STM32F7_VCP_DIR}/")
|
||||
|
||||
set(STM32F7_INCLUDE_DIRS
|
||||
${STM32F7_HAL_DIR}/Inc
|
||||
${STM32F7_CMSIS_DEVICE_DIR}/Include
|
||||
)
|
||||
|
||||
main_sources(STM32F7_SRC
|
||||
target/system_stm32f7xx.c
|
||||
|
||||
config/config_streamer_stm32f7.c
|
||||
config/config_streamer_ram.c
|
||||
config/config_streamer_extflash.c
|
||||
|
||||
drivers/adc_stm32f7xx.c
|
||||
drivers/bus_i2c_hal.c
|
||||
drivers/dma_stm32f7xx.c
|
||||
drivers/bus_spi_hal_ll.c
|
||||
drivers/timer.c
|
||||
drivers/timer_impl_hal.c
|
||||
drivers/timer_stm32f7xx.c
|
||||
drivers/system_stm32f7xx.c
|
||||
drivers/serial_uart_stm32f7xx.c
|
||||
drivers/serial_uart_hal.c
|
||||
drivers/sdcard/sdmmc_sdio_hal.c
|
||||
)
|
||||
|
||||
main_sources(STM32F7_MSC_SRC
|
||||
drivers/usb_msc_f7xx.c
|
||||
)
|
||||
|
||||
set(STM32F7_DEFINITIONS
|
||||
${CORTEX_M7_DEFINITIONS}
|
||||
USE_HAL_DRIVER
|
||||
USE_FULL_LL_DRIVER
|
||||
)
|
||||
|
||||
function(target_stm32f7xx)
|
||||
target_stm32(
|
||||
SOURCES ${STM32F7_HAL_SRC} ${STM32F7_SRC}
|
||||
COMPILE_DEFINITIONS ${STM32F7_DEFINITIONS}
|
||||
COMPILE_OPTIONS ${CORTEX_M7_COMMON_OPTIONS} ${CORTEX_M7_COMPILE_OPTIONS}
|
||||
INCLUDE_DIRECTORIES ${STM32F7_INCLUDE_DIRS}
|
||||
LINK_OPTIONS ${CORTEX_M7_COMMON_OPTIONS} ${CORTEX_M7_LINK_OPTIONS}
|
||||
|
||||
MSC_SOURCES ${STM32F7_USBMSC_SRC} ${STM32F7_MSC_SRC}
|
||||
VCP_SOURCES ${STM32F7_USB_SRC} ${STM32F7_VCP_SRC}
|
||||
VCP_INCLUDE_DIRECTORIES ${STM32F7_USB_INCLUDE_DIRS} ${STM32F7_VCP_DIR}
|
||||
|
||||
OPENOCD_TARGET stm32f7x
|
||||
|
||||
BOOTLOADER
|
||||
|
||||
${ARGN}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
macro(define_target_stm32f7 subfamily size)
|
||||
function(target_stm32f7${subfamily}x${size} name)
|
||||
set(func_ARGV ARGV)
|
||||
string(TOUPPER ${size} upper_size)
|
||||
get_stm32_flash_size(flash_size ${size})
|
||||
if(flash_size GREATER 512)
|
||||
set(opt -O2)
|
||||
else()
|
||||
set(opt -Os)
|
||||
endif()
|
||||
set(definitions
|
||||
STM32F7
|
||||
STM32F7${subfamily}xx
|
||||
STM32F7${subfamily}x${upper_size}
|
||||
MCU_FLASH_SIZE=${flash_size}
|
||||
)
|
||||
target_stm32f7xx(
|
||||
NAME ${name}
|
||||
STARTUP startup_stm32f7${subfamily}xx.s
|
||||
COMPILE_DEFINITIONS ${definitions}
|
||||
LINKER_SCRIPT stm32_flash_f7${subfamily}x${size}
|
||||
OPTIMIZATION ${opt}
|
||||
|
||||
${${func_ARGV}}
|
||||
)
|
||||
endfunction()
|
||||
endmacro()
|
||||
|
||||
define_target_stm32f7(22 e)
|
||||
define_target_stm32f7(45 g)
|
||||
define_target_stm32f7(46 g)
|
||||
define_target_stm32f7(65 g)
|
||||
define_target_stm32f7(65 i)
|
||||
@@ -0,0 +1,41 @@
|
||||
set(STM32H7_USBCORE_DIR "${MAIN_LIB_DIR}/main/STM32H7/Middlewares/ST/STM32_USB_Device_Library/Core")
|
||||
set(STM32H7_USBCORE_SRC
|
||||
usbd_core.c
|
||||
usbd_ctlreq.c
|
||||
usbd_ioreq.c
|
||||
)
|
||||
list(TRANSFORM STM32H7_USBCORE_SRC PREPEND "${STM32H7_USBCORE_DIR}/Src/")
|
||||
|
||||
set(STM32H7_USBCDC_DIR "${MAIN_LIB_DIR}/main/STM32H7/Middlewares/ST/STM32_USB_Device_Library/Class/CDC")
|
||||
set(STM32H7_USBCDC_SRC
|
||||
usbd_cdc.c
|
||||
)
|
||||
list(TRANSFORM STM32H7_USBCDC_SRC PREPEND "${STM32H7_USBCDC_DIR}/Src/")
|
||||
|
||||
set(STM32H7_USBHID_DIR "${MAIN_LIB_DIR}/main/STM32H7/Middlewares/ST/STM32_USB_Device_Library/Class/HID")
|
||||
set(STM32H7_USBHID_SRC
|
||||
usbd_hid.c
|
||||
)
|
||||
list(TRANSFORM STM32H7_USBHID_SRC PREPEND "${STM32H7_USBHID_DIR}/Src/")
|
||||
|
||||
set(STM32H7_USBMSC_DIR "${MAIN_LIB_DIR}/main/STM32H7/Middlewares/ST/STM32_USB_Device_Library/Class/MSC")
|
||||
set(STM32H7_USBMSC_SRC
|
||||
usbd_msc.c
|
||||
usbd_msc_bot.c
|
||||
usbd_msc_data.c
|
||||
usbd_msc_scsi.c
|
||||
)
|
||||
list(TRANSFORM STM32H7_USBMSC_SRC PREPEND "${STM32H7_USBMSC_DIR}/Src/")
|
||||
|
||||
set(STM32H7_USB_INCLUDE_DIRS
|
||||
"${STM32H7_USBCORE_DIR}/Inc"
|
||||
"${STM32H7_USBCDC_DIR}/Inc"
|
||||
"${STM32H7_USBHID_DIR}/Inc"
|
||||
"${STM32H7_USBMSC_DIR}/Inc"
|
||||
)
|
||||
|
||||
list(APPEND STM32H7_USB_SRC ${STM32H7_USBCORE_SRC})
|
||||
list(APPEND STM32H7_USB_SRC ${STM32H7_USBCDC_SRC})
|
||||
list(APPEND STM32H7_USB_SRC ${STM32H7_USBHID_SRC})
|
||||
#XXX: Not working yet
|
||||
#list(APPEND STM32H7_USB_SRC ${STM32H7_USBMSC_SRC})
|
||||
@@ -0,0 +1,225 @@
|
||||
include(cortex-m7)
|
||||
include(stm32h7-usb)
|
||||
|
||||
set(STM32H7_CMSIS_DEVICE_DIR "${MAIN_LIB_DIR}/main/STM32H7/Drivers/CMSIS/Device/ST/STM32H7xx")
|
||||
set(STM32H7_HAL_DIR "${MAIN_LIB_DIR}/main/STM32H7/Drivers/STM32H7xx_HAL_Driver")
|
||||
|
||||
set(STM32H7_HAL_SRC
|
||||
stm32h7xx_hal.c
|
||||
stm32h7xx_hal_adc.c
|
||||
stm32h7xx_hal_adc_ex.c
|
||||
# stm32h7xx_hal_cec.c
|
||||
# stm32h7xx_hal_comp.c
|
||||
stm32h7xx_hal_cortex.c
|
||||
# stm32h7xx_hal_crc.c
|
||||
# stm32h7xx_hal_crc_ex.c
|
||||
# stm32h7xx_hal_cryp.c
|
||||
# stm32h7xx_hal_cryp_ex.c
|
||||
stm32h7xx_hal_dac.c
|
||||
stm32h7xx_hal_dac_ex.c
|
||||
# stm32h7xx_hal_dcmi.c
|
||||
# stm32h7xx_hal_dfsdm.c
|
||||
# stm32h7xx_hal_dfsdm_ex.c
|
||||
stm32h7xx_hal_dma.c
|
||||
# stm32h7xx_hal_dma2d.c
|
||||
stm32h7xx_hal_dma_ex.c
|
||||
# stm32h7xx_hal_dsi.c
|
||||
stm32h7xx_hal_dts.c
|
||||
# stm32h7xx_hal_eth.c
|
||||
# stm32h7xx_hal_eth_ex.c
|
||||
stm32h7xx_hal_exti.c
|
||||
# stm32h7xx_hal_fdcan.c
|
||||
stm32h7xx_hal_flash.c
|
||||
stm32h7xx_hal_flash_ex.c
|
||||
stm32h7xx_hal_gfxmmu.c
|
||||
stm32h7xx_hal_gpio.c
|
||||
# stm32h7xx_hal_hash.c
|
||||
# stm32h7xx_hal_hash_ex.c
|
||||
# stm32h7xx_hal_hcd.c
|
||||
# stm32h7xx_hal_hrtim.c
|
||||
# stm32h7xx_hal_hsem.c
|
||||
stm32h7xx_hal_i2c.c
|
||||
stm32h7xx_hal_i2c_ex.c
|
||||
# stm32h7xx_hal_i2s.c
|
||||
# stm32h7xx_hal_i2s_ex.c
|
||||
# stm32h7xx_hal_irda.c
|
||||
# stm32h7xx_hal_iwdg.c
|
||||
# stm32h7xx_hal_jpeg.c
|
||||
# stm32h7xx_hal_lptim.c
|
||||
# stm32h7xx_hal_ltdc.c
|
||||
# stm32h7xx_hal_ltdc_ex.c
|
||||
# stm32h7xx_hal_mdios.c
|
||||
# stm32h7xx_hal_mdma.c
|
||||
# stm32h7xx_hal_mmc.c
|
||||
# stm32h7xx_hal_mmc_ex.c
|
||||
# stm32h7xx_hal_nand.c
|
||||
# stm32h7xx_hal_nor.c
|
||||
# stm32h7xx_hal_opamp.c
|
||||
# stm32h7xx_hal_opamp_ex.c
|
||||
stm32h7xx_hal_ospi.c
|
||||
stm32h7xx_hal_otfdec.c
|
||||
stm32h7xx_hal_pcd.c
|
||||
stm32h7xx_hal_pcd_ex.c
|
||||
stm32h7xx_hal_pssi.c
|
||||
stm32h7xx_hal_pwr.c
|
||||
stm32h7xx_hal_pwr_ex.c
|
||||
stm32h7xx_hal_qspi.c
|
||||
# stm32h7xx_hal_ramecc.c
|
||||
stm32h7xx_hal_rcc.c
|
||||
stm32h7xx_hal_rcc_ex.c
|
||||
# stm32h7xx_hal_rng.c
|
||||
# stm32h7xx_hal_rng_ex.c
|
||||
stm32h7xx_hal_rtc.c
|
||||
stm32h7xx_hal_rtc_ex.c
|
||||
# stm32h7xx_hal_sai.c
|
||||
# stm32h7xx_hal_sai_ex.c
|
||||
stm32h7xx_hal_sd.c
|
||||
stm32h7xx_hal_sd_ex.c
|
||||
# stm32h7xx_hal_sdram.c
|
||||
# stm32h7xx_hal_smartcard.c
|
||||
# stm32h7xx_hal_smartcard_ex.c
|
||||
# stm32h7xx_hal_smbus.c
|
||||
# stm32h7xx_hal_spdifrx.c
|
||||
stm32h7xx_hal_spi.c
|
||||
stm32h7xx_hal_spi_ex.c
|
||||
# stm32h7xx_hal_sram.c
|
||||
# stm32h7xx_hal_swpmi.c
|
||||
stm32h7xx_hal_tim.c
|
||||
stm32h7xx_hal_tim_ex.c
|
||||
stm32h7xx_hal_uart.c
|
||||
stm32h7xx_hal_uart_ex.c
|
||||
# stm32h7xx_hal_usart.c
|
||||
# stm32h7xx_hal_usart_ex.c
|
||||
# stm32h7xx_hal_wwdg.c
|
||||
# stm32h7xx_ll_adc.c
|
||||
# stm32h7xx_ll_bdma.c
|
||||
# stm32h7xx_ll_comp.c
|
||||
# stm32h7xx_ll_crc.c
|
||||
stm32h7xx_ll_crs.c
|
||||
# stm32h7xx_ll_dac.c
|
||||
# stm32h7xx_ll_delayblock.c
|
||||
stm32h7xx_ll_dma.c
|
||||
# stm32h7xx_ll_dma2d.c
|
||||
stm32h7xx_ll_exti.c
|
||||
# stm32h7xx_ll_fmc.c
|
||||
# stm32h7xx_ll_gpio.c
|
||||
# stm32h7xx_ll_hrtim.c
|
||||
stm32h7xx_ll_i2c.c
|
||||
# stm32h7xx_ll_lptim.c
|
||||
# stm32h7xx_ll_lpuart.c
|
||||
# stm32h7xx_ll_mdma.c
|
||||
# stm32h7xx_ll_opamp.c
|
||||
# stm32h7xx_ll_pwr.c
|
||||
# stm32h7xx_ll_rcc.c
|
||||
# stm32h7xx_ll_rng.c
|
||||
# stm32h7xx_ll_rtc.c
|
||||
stm32h7xx_ll_sdmmc.c
|
||||
stm32h7xx_ll_spi.c
|
||||
# stm32h7xx_ll_swpmi.c
|
||||
stm32h7xx_ll_tim.c
|
||||
# stm32h7xx_ll_usart.c
|
||||
stm32h7xx_ll_usb.c
|
||||
# stm32h7xx_ll_utils.c
|
||||
)
|
||||
|
||||
list(TRANSFORM STM32H7_HAL_SRC PREPEND "${STM32H7_HAL_DIR}/Src/")
|
||||
|
||||
set(STM32H7_VCP_DIR "${MAIN_SRC_DIR}/vcp_hal")
|
||||
|
||||
set(STM32H7_VCP_SRC
|
||||
usbd_desc.c
|
||||
usbd_conf_stm32h7xx.c
|
||||
usbd_cdc_interface.c
|
||||
)
|
||||
list(TRANSFORM STM32H7_VCP_SRC PREPEND "${STM32H7_VCP_DIR}/")
|
||||
|
||||
set(STM32H7_INCLUDE_DIRS
|
||||
${STM32H7_HAL_DIR}/Inc
|
||||
${STM32H7_CMSIS_DEVICE_DIR}/Include
|
||||
)
|
||||
|
||||
main_sources(STM32H7_SRC
|
||||
target/system_stm32h7xx.c
|
||||
|
||||
config/config_streamer_stm32h7.c
|
||||
config/config_streamer_ram.c
|
||||
config/config_streamer_extflash.c
|
||||
|
||||
drivers/adc_stm32h7xx.c
|
||||
drivers/bus_i2c_hal.c
|
||||
drivers/dma_stm32h7xx.c
|
||||
drivers/bus_spi_hal_ll.c
|
||||
drivers/bus_quadspi.c
|
||||
drivers/bus_quadspi_hal.c
|
||||
drivers/memprot.h
|
||||
drivers/memprot_hal.c
|
||||
drivers/memprot_stm32h7xx.c
|
||||
drivers/timer.c
|
||||
drivers/timer_impl_hal.c
|
||||
drivers/timer_stm32h7xx.c
|
||||
drivers/system_stm32h7xx.c
|
||||
drivers/serial_uart_stm32h7xx.c
|
||||
drivers/serial_uart_hal.c
|
||||
drivers/sdio.h
|
||||
drivers/sdcard/sdmmc_sdio_hal.c
|
||||
)
|
||||
|
||||
main_sources(STM32H7_MSC_SRC
|
||||
drivers/usb_msc_h7xx.c
|
||||
)
|
||||
|
||||
set(STM32H7_DEFINITIONS
|
||||
${CORTEX_M7_DEFINITIONS}
|
||||
USE_HAL_DRIVER
|
||||
USE_FULL_LL_DRIVER
|
||||
MAX_MPU_REGIONS=16
|
||||
)
|
||||
|
||||
function(target_stm32h7xx)
|
||||
target_stm32(
|
||||
SOURCES ${STM32H7_HAL_SRC} ${STM32H7_SRC}
|
||||
COMPILE_DEFINITIONS ${STM32H7_DEFINITIONS}
|
||||
COMPILE_OPTIONS ${CORTEX_M7_COMMON_OPTIONS} ${CORTEX_M7_COMPILE_OPTIONS}
|
||||
INCLUDE_DIRECTORIES ${STM32H7_INCLUDE_DIRS}
|
||||
LINK_OPTIONS ${CORTEX_M7_COMMON_OPTIONS} ${CORTEX_M7_LINK_OPTIONS}
|
||||
|
||||
MSC_SOURCES ${STM32H7_USBMSC_SRC} ${STM32H7_MSC_SRC}
|
||||
VCP_SOURCES ${STM32H7_USB_SRC} ${STM32H7_VCP_SRC}
|
||||
VCP_INCLUDE_DIRECTORIES ${STM32H7_USB_INCLUDE_DIRS} ${STM32H7_VCP_DIR}
|
||||
|
||||
OPTIMIZATION -O2
|
||||
|
||||
OPENOCD_TARGET stm32h7x
|
||||
|
||||
# BOOTLOADER
|
||||
|
||||
${ARGN}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
macro(define_target_stm32h7 subfamily size)
|
||||
function(target_stm32h7${subfamily}x${size} name)
|
||||
set(func_ARGV ARGV)
|
||||
string(TOUPPER ${size} upper_size)
|
||||
get_stm32_flash_size(flash_size ${size})
|
||||
set(definitions
|
||||
STM32H7
|
||||
STM32H7${subfamily}xx
|
||||
STM32H7${subfamily}x${upper_size}
|
||||
# stm32h743xx.h defined FLASH_SIZE, used by HAL, but in bytes
|
||||
# use MCU_FLASH_SIZE since we use KiB in our code
|
||||
MCU_FLASH_SIZE=${flash_size}
|
||||
)
|
||||
target_stm32h7xx(
|
||||
NAME ${name}
|
||||
STARTUP startup_stm32h7${subfamily}xx.s
|
||||
COMPILE_DEFINITIONS ${definitions}
|
||||
LINKER_SCRIPT stm32_flash_h7${subfamily}x${size}
|
||||
${${func_ARGV}}
|
||||
SVD STM32H7${subfamily}
|
||||
)
|
||||
endfunction()
|
||||
endmacro()
|
||||
|
||||
define_target_stm32h7(43 i)
|
||||
define_target_stm32h7(A3 i)
|
||||
@@ -0,0 +1,16 @@
|
||||
function(setup_svd target_exe target_name)
|
||||
get_property(svd_name TARGET ${target_exe} PROPERTY SVD)
|
||||
set(svd_target_name "svd_${target_name}")
|
||||
if (svd_name AND NOT svd_name STREQUAL "")
|
||||
add_custom_target(${svd_target_name}
|
||||
COMMAND ${CMAKE_COMMAND} -E copy
|
||||
${SVD_DIR}/${svd_name}.svd
|
||||
${CMAKE_BINARY_DIR}/svd/${target_name}.svd
|
||||
)
|
||||
else()
|
||||
add_custom_target(${svd_target_name}
|
||||
${CMAKE_COMMAND} -E echo "target ${target_name} does not declare an SVD filename"
|
||||
COMMAND ${CMAKE_COMMAND} -E false)
|
||||
endif()
|
||||
exclude_from_all(${svd_target_name})
|
||||
endfunction()
|
||||
Executable
+224
@@ -0,0 +1,224 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# PG Validation for Release Preparation
|
||||
#
|
||||
# This script validates Parameter Group struct sizes against the reference
|
||||
# target (SPEEDYBEEF745AIO) to catch unversioned struct changes before release.
|
||||
#
|
||||
# Usage: ./cmake/validate-pg-for-release.sh
|
||||
#
|
||||
# Exit codes:
|
||||
# 0 - Validation passed
|
||||
# 1 - Validation failed (size changed without version increment)
|
||||
# 2 - Build or setup error
|
||||
#
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR=$(dirname "$0")
|
||||
REPO_ROOT=$(cd "$SCRIPT_DIR/.." && pwd)
|
||||
REFERENCE_TARGET="SPEEDYBEEF745AIO"
|
||||
BUILD_DIR="$REPO_ROOT/build"
|
||||
DB_FILE="$SCRIPT_DIR/pg_struct_sizes.reference.db"
|
||||
|
||||
echo "🔍 Validating PG struct sizes for release..."
|
||||
echo ""
|
||||
|
||||
# Check prerequisites
|
||||
if ! command -v arm-none-eabi-gcc &> /dev/null; then
|
||||
echo "❌ Error: arm-none-eabi-gcc not found" >&2
|
||||
echo " Install ARM toolchain first" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
if ! command -v cmake &> /dev/null; then
|
||||
echo "❌ Error: cmake not found" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
if [ ! -f "$DB_FILE" ]; then
|
||||
echo "❌ Error: Reference database not found: $DB_FILE" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# Setup build directory
|
||||
if [ ! -d "$BUILD_DIR" ]; then
|
||||
echo "📁 Creating build directory..."
|
||||
mkdir -p "$BUILD_DIR"
|
||||
cd "$BUILD_DIR"
|
||||
cmake -G "Unix Makefiles" ..
|
||||
else
|
||||
echo "📁 Using existing build directory"
|
||||
cd "$BUILD_DIR"
|
||||
fi
|
||||
|
||||
# Build reference target
|
||||
echo "🔨 Building reference target: $REFERENCE_TARGET..."
|
||||
echo " (This may take a few minutes on first build)"
|
||||
echo ""
|
||||
|
||||
BUILD_LOG=$(mktemp)
|
||||
if ! make "$REFERENCE_TARGET.elf" > "$BUILD_LOG" 2>&1; then
|
||||
echo "❌ Build failed. See $BUILD_LOG for details" >&2
|
||||
tail -30 "$BUILD_LOG" >&2
|
||||
exit 2
|
||||
fi
|
||||
rm -f "$BUILD_LOG"
|
||||
|
||||
ELF_FILE="$BUILD_DIR/bin/$REFERENCE_TARGET.elf"
|
||||
|
||||
if [ ! -f "$ELF_FILE" ]; then
|
||||
echo "❌ Error: ELF file not found: $ELF_FILE" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
echo "✓ Build completed successfully"
|
||||
echo ""
|
||||
|
||||
# Extract PG struct sizes from ELF binary
|
||||
echo "📊 Extracting PG struct sizes from binary..."
|
||||
echo ""
|
||||
|
||||
# Detect architecture for correct nm command
|
||||
if command -v arm-none-eabi-nm &> /dev/null && [[ $(file "$ELF_FILE") == *"ARM"* ]]; then
|
||||
NM_CMD="arm-none-eabi-nm"
|
||||
else
|
||||
NM_CMD="nm"
|
||||
fi
|
||||
|
||||
# Extract current sizes and versions
|
||||
TEMP_CURRENT=$(mktemp)
|
||||
cd "$REPO_ROOT"
|
||||
|
||||
$NM_CMD --print-size "$ELF_FILE" 2>/dev/null | grep "pgResetTemplate_" | \
|
||||
while read addr size_hex type symbol; do
|
||||
# Extract config name from symbol
|
||||
config_name="${symbol#pgResetTemplate_}"
|
||||
|
||||
# Convert hex size to decimal
|
||||
size_dec=$((16#$size_hex))
|
||||
|
||||
# Find corresponding struct type and version from PG_REGISTER
|
||||
pg_register_line=$(grep -rh "PG_REGISTER.*$config_name" src/main --include="*.c" 2>/dev/null | head -1)
|
||||
|
||||
struct_type=$(echo "$pg_register_line" | grep -oP 'PG_REGISTER[^(]*\(\K[^,]+' | head -1)
|
||||
|
||||
if [ -z "$struct_type" ]; then
|
||||
# Fallback: convert config name to struct type
|
||||
struct_type="${config_name}_t"
|
||||
fi
|
||||
|
||||
# Extract PG version (4th parameter in PG_REGISTER)
|
||||
version=$(echo "$pg_register_line" | grep -oP 'PG_REGISTER[^(]*\([^,]+,[^,]+,[^,]+,\s*\K\d+' | head -1)
|
||||
|
||||
if [ -z "$version" ]; then
|
||||
version="0"
|
||||
fi
|
||||
|
||||
printf "%-30s %3s %s\n" "$struct_type" "$size_dec" "$version"
|
||||
done | sort -u > "$TEMP_CURRENT"
|
||||
|
||||
# Validate against reference database
|
||||
echo "🔍 Validating against reference database..."
|
||||
echo ""
|
||||
|
||||
FAILED=0
|
||||
ISSUES=""
|
||||
UPDATED=""
|
||||
|
||||
# Check each struct in current binary
|
||||
while read -r struct_type current_size current_version; do
|
||||
[ -z "$struct_type" ] && continue
|
||||
|
||||
# Look up in database
|
||||
db_entry=$(grep "^$struct_type " "$DB_FILE" 2>/dev/null || echo "")
|
||||
|
||||
if [ -z "$db_entry" ]; then
|
||||
# New struct not in database - add it automatically
|
||||
if [ -z "$current_version" ]; then
|
||||
echo " ⚠️ Warning: Cannot find PG version for new struct $struct_type" >&2
|
||||
echo " ℹ️ New: $struct_type (${current_size}B) - skipping (no PG_REGISTER found)"
|
||||
continue
|
||||
fi
|
||||
|
||||
echo " ➕ New: $struct_type (${current_size}B, v$current_version)"
|
||||
|
||||
# Add to database
|
||||
printf "%-30s %3s %s\n" "$struct_type" "$current_size" "$current_version" >> "$DB_FILE"
|
||||
UPDATED="$UPDATED\n • $struct_type: NEW (${current_size}B, v$current_version)"
|
||||
continue
|
||||
fi
|
||||
|
||||
db_size=$(echo "$db_entry" | awk '{print $2}')
|
||||
db_version=$(echo "$db_entry" | awk '{print $3}')
|
||||
|
||||
if [ "$current_size" != "$db_size" ]; then
|
||||
# Size changed - check if version was incremented
|
||||
if [ -z "$current_version" ]; then
|
||||
echo " ⚠️ Warning: Cannot find PG version for $struct_type" >&2
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ "$current_version" -le "$db_version" ]; then
|
||||
# SIZE CHANGED BUT VERSION NOT INCREMENTED - FAIL BUILD
|
||||
echo " ❌ $struct_type: size changed ${db_size}B → ${current_size}B but version not incremented (still v$current_version)"
|
||||
ISSUES="$ISSUES\n • $struct_type: ${db_size}B → ${current_size}B (version $current_version should be $((current_version + 1)))"
|
||||
FAILED=1
|
||||
else
|
||||
# Version was incremented - this is valid, update database
|
||||
echo " ✅ $struct_type: size changed ${db_size}B → ${current_size}B with version increment v$db_version → v$current_version"
|
||||
|
||||
# Update database entry with new size and version
|
||||
sed -i "s|^$struct_type[[:space:]]\+[0-9]\+[[:space:]]\+[0-9]\+$|$(printf "%-30s %3s %s" "$struct_type" "$current_size" "$current_version")|" "$DB_FILE"
|
||||
UPDATED="$UPDATED\n • $struct_type: ${db_size}B → ${current_size}B (v$db_version → v$current_version)"
|
||||
fi
|
||||
else
|
||||
# Size unchanged
|
||||
echo " ✓ $struct_type (${current_size}B)"
|
||||
fi
|
||||
done < "$TEMP_CURRENT"
|
||||
|
||||
rm -f "$TEMP_CURRENT"
|
||||
|
||||
# Report results
|
||||
echo ""
|
||||
|
||||
if [ $FAILED -eq 1 ]; then
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
echo "❌ PG VALIDATION FAILED - DO NOT PROCEED WITH RELEASE"
|
||||
echo ""
|
||||
echo "The following structs changed size without version increments:"
|
||||
echo -e "$ISSUES"
|
||||
echo ""
|
||||
echo "Action required:"
|
||||
echo " 1. Identify which PR(s) changed the affected struct(s)"
|
||||
echo " 2. Create hotfix PR to increment PG version(s)"
|
||||
echo " 3. Merge hotfix to target branch"
|
||||
echo " 4. Re-run this validation"
|
||||
echo ""
|
||||
echo "Fix: Increment PG version in PG_REGISTER for affected structs"
|
||||
echo ""
|
||||
echo "See claude/release-manager/guides/7-pg-validation.md for details"
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -n "$UPDATED" ]; then
|
||||
echo "📝 Database auto-updated for structs with version increments:"
|
||||
echo -e "$UPDATED"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
echo "✅ PG VALIDATION PASSED"
|
||||
echo ""
|
||||
echo "All struct sizes validated successfully against reference target."
|
||||
echo "Safe to proceed with release preparation."
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
|
||||
exit 0
|
||||
Reference in New Issue
Block a user