Skip to content

Commit

Permalink
better cmake support for imxrt
Browse files Browse the repository at this point in the history
  • Loading branch information
hathach committed Jul 11, 2023
1 parent 9e49afa commit 75fdc4d
Show file tree
Hide file tree
Showing 13 changed files with 462 additions and 202 deletions.
19 changes: 16 additions & 3 deletions cmake/cpu/cortex-m4.cmake
Original file line number Diff line number Diff line change
@@ -1,10 +1,23 @@
if (TOOLCHAIN STREQUAL "gcc")
list(APPEND TOOLCHAIN_COMMON_FLAGS
set(TOOLCHAIN_COMMON_FLAGS
-mthumb
-mcpu=cortex-m4
-mfloat-abi=hard
-mfpu=fpv4-sp-d16
)
else ()
# TODO support IAR

if (NOT DEFINED FREERTOS_PORT)
set(FREERTOS_PORT GCC_ARM_CM4F CACHE INTERNAL "")
endif ()

elseif (TOOLCHAIN STREQUAL "iar")
set(TOOLCHAIN_COMMON_FLAGS
--cpu cortex-m4
--fpu VFPv4
)

if (NOT DEFINED FREERTOS_PORT)
set(FREERTOS_PORT IAR_ARM_CM4F CACHE INTERNAL "")
endif ()

endif ()
25 changes: 19 additions & 6 deletions cmake/cpu/cortex-m7.cmake
Original file line number Diff line number Diff line change
@@ -1,6 +1,19 @@
set(TOOLCHAIN_COMMON_FLAGS
-mthumb
-mcpu=cortex-m7
-mfloat-abi=hard
-mfpu=fpv5-d16
)
if (TOOLCHAIN STREQUAL "gcc")
set(TOOLCHAIN_COMMON_FLAGS
-mthumb
-mcpu=cortex-m7
-mfloat-abi=hard
-mfpu=fpv5-d16
)

set(FREERTOS_PORT GCC_ARM_CM7 CACHE INTERNAL "")

elseif (TOOLCHAIN STREQUAL "iar")
set(TOOLCHAIN_COMMON_FLAGS
--cpu cortex-m7
--fpu VFPv5_D16
)

set(FREERTOS_PORT IAR_ARM_CM7 CACHE INTERNAL "")

endif ()
15 changes: 11 additions & 4 deletions cmake/toolchain/arm_gcc.cmake
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
set(CMAKE_SYSTEM_NAME Generic)

set(CMAKE_ASM_COMPILER "arm-none-eabi-gcc")
set(CMAKE_C_COMPILER "arm-none-eabi-gcc")
set(CMAKE_CXX_COMPILER "arm-none-eabi-g++")
set(CMAKE_ASM_COMPILER "arm-none-eabi-gcc")

set(CMAKE_SIZE "arm-none-eabi-size" CACHE FILEPATH "")
set(CMAKE_OBJCOPY "arm-none-eabi-objcopy" CACHE FILEPATH "")
Expand All @@ -29,11 +29,18 @@ list(APPEND TOOLCHAIN_COMMON_FLAGS
-fno-strict-aliasing
)

list(APPEND TOOLCHAIN_EXE_LINKER_FLAGS
-fshort-enums
set(TOOLCHAIN_EXE_LINKER_FLAGS
-Wl,--print-memory-usage
-Wl,--gc-sections
-Wl,--cref
#-Wl,--cref
)

include(${CMAKE_CURRENT_LIST_DIR}/set_flags.cmake)

# try_compile is cmake test compiling its own example,
# pass -nostdlib to skip stdlib linking
get_property(IS_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE)
if (IS_IN_TRY_COMPILE)
set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -nostdlib")
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -nostdlib")
endif ()
20 changes: 6 additions & 14 deletions cmake/toolchain/set_flags.cmake
Original file line number Diff line number Diff line change
@@ -1,20 +1,12 @@
include(CMakePrintHelpers)
foreach (LANG IN ITEMS C CXX ASM)
# join the toolchain flags into a single string
list(APPEND TOOLCHAIN_${LANG}_FLAGS ${TOOLCHAIN_COMMON_FLAGS})
list(JOIN TOOLCHAIN_${LANG}_FLAGS " " TOOLCHAIN_${LANG}_FLAGS)
set(CMAKE_${LANG}_FLAGS_INIT "${TOOLCHAIN_${LANG}_FLAGS}")

# cmake_print_variables(CMAKE_${LANG}_FLAGS_INIT)
# join the toolchain flags into a single string
list(JOIN TOOLCHAIN_COMMON_FLAGS " " TOOLCHAIN_COMMON_FLAGS)

foreach (LANG IN ITEMS C CXX ASM)
set(CMAKE_${LANG}_FLAGS_INIT ${TOOLCHAIN_COMMON_FLAGS})
#cmake_print_variables(CMAKE_${LANG}_FLAGS_INIT)
endforeach ()

# Linker
list(JOIN TOOLCHAIN_EXE_LINKER_FLAGS " " CMAKE_EXE_LINKER_FLAGS_INIT)

# try_compile is cmake test compiling its own example,
# pass -nostdlib to skip stdlib linking
get_property(IS_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE)
if (IS_IN_TRY_COMPILE)
set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -nostdlib")
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -nostdlib")
endif ()
7 changes: 7 additions & 0 deletions ports/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
cmake_minimum_required(VERSION 3.17)

include(${CMAKE_CURRENT_LIST_DIR}/family_support.cmake)

project(tinyuf2_all C ASM)

add_subdirectory(${FAMILY})
146 changes: 109 additions & 37 deletions cmake/family_support.cmake → ports/family_support.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -4,45 +4,68 @@ include(CMakePrintHelpers)
find_package(Python COMPONENTS Interpreter)

# TOP is path to root directory
set(TOP "${CMAKE_CURRENT_LIST_DIR}/..")
set(TOP ${CMAKE_CURRENT_LIST_DIR}/..)

# Default to gcc
if (NOT DEFINED TOOLCHAIN)
set(TOOLCHAIN gcc)
endif ()

if (NOT BOARD)
message(FATAL_ERROR "BOARD not specified")
endif ()

# Default to gcc
if (NOT DEFINED TOOLCHAIN)
set(TOOLCHAIN gcc)
# FAMILY not defined, try to detect it from BOARD
if (NOT DEFINED FAMILY)
# Find path contains BOARD
file(GLOB BOARD_PATH LIST_DIRECTORIES true
RELATIVE ${TOP}/ports
${TOP}/ports/*/boards/${BOARD}
)
if (NOT BOARD_PATH)
message(FATAL_ERROR "Could not detect FAMILY from BOARD=${BOARD}")
endif ()

# replace / with ; so that we can get the first element as FAMILY
string(REPLACE "/" ";" BOARD_PATH ${BOARD_PATH})
list(GET BOARD_PATH 0 FAMILY)
endif ()

set(UF2CONV_PY ${TOP}/lib/uf2/utils/uf2conv.py)

# enable LTO if supported
include(CheckIPOSupported)
check_ipo_supported(RESULT IPO_SUPPORTED)
if (IPO_SUPPORTED)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
endif ()

#------------------------------------
# Functions
#------------------------------------
function(family_add_default_example_warnings TARGET)
target_compile_options(${TARGET} PUBLIC
-Wall
-Wextra
-Werror
-Wfatal-errors
-Wdouble-promotion
-Wfloat-equal
-Wshadow
-Wwrite-strings
-Wsign-compare
-Wmissing-format-attribute
-Wunreachable-code
-Wcast-align
-Wcast-qual
-Wnull-dereference
-Wuninitialized
-Wunused
-Wredundant-decls
#-Wstrict-prototypes
#-Werror-implicit-function-declaration
#-Wundef
)
# target_compile_options(${TARGET} PUBLIC
# -Wall
# -Wextra
# -Werror
# -Wfatal-errors
# -Wdouble-promotion
# -Wfloat-equal
# -Wshadow
# -Wwrite-strings
# -Wsign-compare
# -Wmissing-format-attribute
# -Wunreachable-code
# -Wcast-align
# -Wcast-qual
# -Wnull-dereference
# -Wuninitialized
# -Wunused
# -Wredundant-decls
# #-Wstrict-prototypes
# #-Werror-implicit-function-declaration
# #-Wundef
# )

if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.0)
Expand All @@ -67,20 +90,38 @@ function(family_add_default_example_warnings TARGET)
endfunction()


function(family_configure TARGET)
# set output suffix to .elf
set(CMAKE_EXECUTABLE_SUFFIX .elf PARENT_SCOPE)

function(family_configure_common TARGET)
# run size after build
add_custom_command(TARGET ${TARGET} POST_BUILD
COMMAND ${CMAKE_SIZE} $<TARGET_FILE:${TARGET}>
)

# add hex, bin and uf2 targets
family_add_bin_hex(${TARGET})

# Add warnings flags

# Generate map file
target_link_options(${TARGET} PUBLIC
# link map
"LINKER:-Map=$<TARGET_FILE:${TARGET}>.map"
)
target_link_options(${TARGET} PUBLIC "LINKER:-Map=$<TARGET_FILE:${TARGET}>.map")

# ETM Trace option
if (TRACE_ETM STREQUAL "1")
target_compile_definitions(${TARGET} PUBLIC TRACE_ETM)
endif ()

# LOGGER option
if (DEFINED LOGGER)
target_compile_definitions(${TARGET} PUBLIC LOGGER_${LOGGER})

# Add segger rtt to example
if(LOGGER STREQUAL "RTT" OR LOGGER STREQUAL "rtt")
if (NOT TARGET segger_rtt)
add_library(segger_rtt STATIC ${TOP}/lib/SEGGER_RTT/RTT/SEGGER_RTT.c)
target_include_directories(segger_rtt PUBLIC ${TOP}/lib/SEGGER_RTT/RTT)
endif()
target_link_libraries(${TARGET} PUBLIC segger_rtt)
endif ()
endif ()
endfunction()

function(family_add_bin_hex TARGET)
Expand All @@ -97,16 +138,27 @@ function(family_add_uf2 TARGET FAMILY_ID)
VERBATIM)
endfunction()

# Add flash jlink target

#----------------------------------
# Flashing target
#----------------------------------

# Add flash jlink target, optional parameter is the extension of the binary file
function(family_flash_jlink TARGET)
if (NOT DEFINED JLINKEXE)
set(JLINKEXE JLinkExe)
endif ()

if (ARGC GREATER 1)
set(BIN_FILE $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.${ARGV1})
else ()
set(BIN_FILE $<TARGET_FILE:${TARGET}>)
endif ()

file(GENERATE
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.jlink
CONTENT "halt
loadfile $<TARGET_FILE:${TARGET}>
loadfile ${BIN_FILE}
r
go
exit"
Expand All @@ -118,6 +170,20 @@ exit"
)
endfunction()


# Add flash stlink target
function(family_flash_stlink TARGET)
if (NOT DEFINED STM32_PROGRAMMER_CLI)
set(STM32_PROGRAMMER_CLI STM32_Programmer_CLI)
endif ()

add_custom_target(${TARGET}-stlink
DEPENDS ${TARGET}
COMMAND ${STM32_PROGRAMMER_CLI} --connect port=swd --write $<TARGET_FILE:${TARGET}> --go
)
endfunction()


# Add flash pycod target
function(family_flash_pyocd TARGET)
if (NOT DEFINED PYOC)
Expand All @@ -130,6 +196,7 @@ function(family_flash_pyocd TARGET)
)
endfunction()


# Add flash using NXP's LinkServer (redserver)
# https://www.nxp.com/design/software/development-software/mcuxpresso-software-and-tools-/linkserver-for-microcontrollers:LINKERSERVER
function(family_flash_nxplink TARGET)
Expand All @@ -147,4 +214,9 @@ function(family_flash_nxplink TARGET)
)
endfunction()

#include(${CMAKE_CURRENT_LIST_DIR}/${FAMILY}/family.cmake)

#----------------------------------
# Family specific
#----------------------------------

include(${CMAKE_CURRENT_LIST_DIR}/${FAMILY}/family.cmake)
26 changes: 12 additions & 14 deletions ports/mimxrt10xx/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,24 +1,22 @@
cmake_minimum_required(VERSION 3.17)
include(CMakePrintHelpers)

set(TOOLCHAIN gcc)
include(family.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/../family_support.cmake)

project(tinyuf2 C ASM)

# Bootloader
add_executable(tinyuf2)
#------------------------------------
# TinyUF2
#------------------------------------

family_configure_target(tinyuf2)
set(CMAKE_EXECUTABLE_SUFFIX .elf)
add_executable(tinyuf2)

target_sources(tinyuf2 PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/board_flash.c
${CMAKE_CURRENT_SOURCE_DIR}/boards.c
${CMAKE_CURRENT_SOURCE_DIR}/romapi_flash.c
board_flash.c
boards.c
romapi_flash.c
)
#target_compile_definitions(tinyuf2 PUBLIC)
#target_link_options(tinyuf2 PUBLIC)

include(${CMAKE_CURRENT_SOURCE_DIR}/../../src/tinyuf2.cmake)
add_tinyuf2(tinyuf2)

# include tinyusb cmake
#include(${CMAKE_CURRENT_SOURCE_DIR}/../lib/tinyusb/src/CMakeLists.txt)
family_configure_tinyuf2(tinyuf2)
19 changes: 12 additions & 7 deletions ports/mimxrt10xx/boards/metro_m7_1011/board.cmake
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
set(MCU_VARIANT MIMXRT1011)

target_sources(${TARGET} PUBLIC
${CMAKE_CURRENT_LIST_DIR}/clock_config.c
${CMAKE_CURRENT_LIST_DIR}/flash_config.c
)
set(JLINK_DEVICE MIMXRT1011DAE5A)
set(PYOCD_TARGET mimxrt1010)
set(NXPLINK_DEVICE MIMXRT1011xxxxx:EVK-MIMXRT1010)

target_compile_definitions(${TARGET} PUBLIC
CPU_MIMXRT1011DAE5A
)
function(update_board TARGET)
target_sources(${TARGET} PUBLIC
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clock_config.c
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/flash_config.c
)
target_compile_definitions(${TARGET} PUBLIC
CPU_MIMXRT1011DAE5A
)
endfunction()
Loading

0 comments on commit 75fdc4d

Please sign in to comment.