diff --git a/cmake/cpu/cortex-m4.cmake b/cmake/cpu/cortex-m4.cmake index 9288b4989..79f97e24a 100644 --- a/cmake/cpu/cortex-m4.cmake +++ b/cmake/cpu/cortex-m4.cmake @@ -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 () diff --git a/cmake/cpu/cortex-m7.cmake b/cmake/cpu/cortex-m7.cmake index c2d825f62..b5a8ac496 100644 --- a/cmake/cpu/cortex-m7.cmake +++ b/cmake/cpu/cortex-m7.cmake @@ -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 () diff --git a/cmake/toolchain/arm_gcc.cmake b/cmake/toolchain/arm_gcc.cmake index 06ee88960..5203d1e4d 100644 --- a/cmake/toolchain/arm_gcc.cmake +++ b/cmake/toolchain/arm_gcc.cmake @@ -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 "") @@ -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 () diff --git a/cmake/toolchain/set_flags.cmake b/cmake/toolchain/set_flags.cmake index 125923e50..3aabf145f 100644 --- a/cmake/toolchain/set_flags.cmake +++ b/cmake/toolchain/set_flags.cmake @@ -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 () diff --git a/ports/CMakeLists.txt b/ports/CMakeLists.txt new file mode 100644 index 000000000..98838dbd4 --- /dev/null +++ b/ports/CMakeLists.txt @@ -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}) diff --git a/cmake/family_support.cmake b/ports/family_support.cmake similarity index 52% rename from cmake/family_support.cmake rename to ports/family_support.cmake index a314dcb95..dd003f5b4 100644 --- a/cmake/family_support.cmake +++ b/ports/family_support.cmake @@ -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) @@ -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} $ ) + # 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=$.map" - ) + target_link_options(${TARGET} PUBLIC "LINKER:-Map=$.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) @@ -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}.${ARGV1}) + else () + set(BIN_FILE $) + endif () + file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.jlink CONTENT "halt -loadfile $ +loadfile ${BIN_FILE} r go exit" @@ -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 $ --go + ) +endfunction() + + # Add flash pycod target function(family_flash_pyocd TARGET) if (NOT DEFINED PYOC) @@ -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) @@ -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) diff --git a/ports/mimxrt10xx/CMakeLists.txt b/ports/mimxrt10xx/CMakeLists.txt index 2374bf6fc..a7eb5073e 100644 --- a/ports/mimxrt10xx/CMakeLists.txt +++ b/ports/mimxrt10xx/CMakeLists.txt @@ -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) \ No newline at end of file +family_configure_tinyuf2(tinyuf2) diff --git a/ports/mimxrt10xx/boards/metro_m7_1011/board.cmake b/ports/mimxrt10xx/boards/metro_m7_1011/board.cmake index 04e11e99a..7cda807d1 100644 --- a/ports/mimxrt10xx/boards/metro_m7_1011/board.cmake +++ b/ports/mimxrt10xx/boards/metro_m7_1011/board.cmake @@ -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() \ No newline at end of file diff --git a/ports/mimxrt10xx/family.cmake b/ports/mimxrt10xx/family.cmake index 355cf8827..42404c555 100644 --- a/ports/mimxrt10xx/family.cmake +++ b/ports/mimxrt10xx/family.cmake @@ -1,42 +1,78 @@ -# toolchain set up +include_guard() + +if (NOT BOARD) + message(FATAL_ERROR "BOARD not specified") +endif () + +#------------------------------------ +# Config +#------------------------------------ +set(UF2_FAMILY_ID 0x4fb2d5bd) +set(SDK_DIR ${TOP}/lib/nxp/mcux-sdk) +set(CMSIS_DIR ${TOP}/lib/CMSIS_5) + +include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake) + set(CMAKE_SYSTEM_PROCESSOR cortex-m7 CACHE INTERNAL "System Processor") set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_LIST_DIR}/../../cmake/toolchain/arm_${TOOLCHAIN}.cmake) -function(family_configure_target TARGET) - if (NOT BOARD) - message(FATAL_ERROR "BOARD not specified") - endif () +#--------------------------------------------------------- +# Load to SRAM using sdphost +# Note: you may need to give the sdphost binary executable permission first. +# +# SDP loads the image into the RAM locations specified in the .ld files. +# - "SDP Write Address" must equal _fcfb_origin +# - "SDP Jump Address" must equal _ivt_origin +# +# TinyUF2 will copy itself to the correct location in flash. +# "UF2 Write Address" shows where the image will reside in flash if you +# want to use a tool like pyocd to write the binary into flash through SWD +# Note: The .elf file cannot be written directly to flash since the target +# is RAM and the addresses need to be translated. +#--------------------------------------------------------- +set(SDP_MIMXRT1011_PID 0x0145) +set(UF2_MIMXRT1011_WRITE_ADDR 0x60000400) - set(SDK_DIR ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../lib/nxp/mcux-sdk) +set(SDP_MIMXRT1015_PID 0x0130) +set(UF2_MIMXRT1015_WRITE_ADDR 0x60000000) - # set output name to .elf - set_target_properties(${TARGET} PROPERTIES OUTPUT_NAME ${TARGET}.elf) - set_target_properties(${TARGET} PROPERTIES DEPS_SUBMODULES ${SDK_DIR}) +set(SDP_MIMXRT1021_PID 0x0130) +set(UF2_MIMXRT1021_WRITE_ADDR 0x60000000) - include(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}/board.cmake) +set(SDP_MIMXRT1024_PID 0x0130) +set(UF2_MIMXRT1024_WRITE_ADDR 0x60000000) - set(UF2_FAMILY_ID 0x4fb2d5bd) +set(SDP_MIMXRT1042_PID 0x0135) +set(UF2_MIMXRT1042_WRITE_ADDR 0x60000000) - target_compile_definitions(${TARGET} PUBLIC - BOARD_UF2_FAMILY_ID=${UF2_FAMILY_ID} - CFG_TUSB_MCU=OPT_MCU_MIMXRT - __ARMVFP__=0 - __ARMFPV5__=0 - XIP_EXTERNAL_FLASH=1 - XIP_BOOT_HEADER_ENABLE=1 - ) +set(SDP_MIMXRT1052_PID 0x0130) +set(UF2_MIMXRT1052_WRITE_ADDR 0x60000000) - target_link_options(${TARGET} PUBLIC - --specs=nosys.specs - --specs=nano.specs - ) +set(SDP_MIMXRT1062_PID 0x0135) +set(UF2_MIMXRT1062_WRITE_ADDR 0x60000000) - target_sources(${TARGET} PUBLIC - # TinyUSB - ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../lib/tinyusb/src/portable/chipidea/ci_hs/dcd_ci_hs.c - # BSP - ${SDK_DIR}/devices/${MCU_VARIANT}/system_${MCU_VARIANT}.c +set(SDP_MIMXRT1064_PID 0x0135) +set(UF2_MIMXRT1064_WRITE_ADDR 0x70000000) + +set(SDP_MIMXRT1176_PID 0x013d) +set(UF2_MIMXRT1176_WRITE_ADDR 0x30000000) + +set(SDP_PID ${SDP_${MCU_VARIANT}_PID}) +set(UF2_WRITE_ADDR ${UF2_${MCU_VARIANT}_WRITE_ADDR}) + +#------------------------------------ +# BOARD_TARGET +#------------------------------------ +# used by all executable targets +function(add_board_target BOARD_TARGET) + if (TARGET ${BOARD_TARGET}) + return() + endif () + + add_library(${BOARD_TARGET} STATIC ${SDK_DIR}/devices/${MCU_VARIANT}/drivers/fsl_clock.c + ${SDK_DIR}/devices/${MCU_VARIANT}/system_${MCU_VARIANT}.c + ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/startup_${MCU_VARIANT}.S ${SDK_DIR}/drivers/cache/armv7-m7/fsl_cache.c ${SDK_DIR}/drivers/common/fsl_common.c ${SDK_DIR}/drivers/igpio/fsl_gpio.c @@ -45,25 +81,12 @@ function(family_configure_target TARGET) ${SDK_DIR}/drivers/pwm/fsl_pwm.c ${SDK_DIR}/drivers/xbara/fsl_xbara.c ) - - if (TOOLCHAIN STREQUAL "gcc") - target_sources(${TARGET} PUBLIC - ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/startup_${MCU_VARIANT}.S - ) - - target_link_options(${TARGET} PUBLIC - "LINKER:--script=${CMAKE_CURRENT_FUNCTION_LIST_DIR}/linker/${MCU_VARIANT}_ram.ld" - "LINKER:--script=${CMAKE_CURRENT_FUNCTION_LIST_DIR}/linker/memory.ld" - "LINKER:--script=${CMAKE_CURRENT_FUNCTION_LIST_DIR}/linker/common.ld" - ) - else () - # TODO support IAR - endif () - - target_include_directories(${TARGET} PUBLIC + target_include_directories(${BOARD_TARGET} PUBLIC + # port & board ${CMAKE_CURRENT_FUNCTION_LIST_DIR} ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD} - ${SDK_DIR}/CMSIS/Include + # sdk + ${CMSIS_DIR}/CMSIS/Core/Include ${SDK_DIR}/devices/${MCU_VARIANT} ${SDK_DIR}/devices/${MCU_VARIANT}/xip ${SDK_DIR}/devices/${MCU_VARIANT}/drivers @@ -77,4 +100,105 @@ function(family_configure_target TARGET) ${SDK_DIR}/drivers/xbara ${SDK_DIR}/drivers/wdog01 ) + + update_board(${BOARD_TARGET}) + + target_compile_definitions(${BOARD_TARGET} PUBLIC + BOARD_UF2_FAMILY_ID=${UF2_FAMILY_ID} + __ARMVFP__=0 + __ARMFPV5__=0 + XIP_EXTERNAL_FLASH=1 + XIP_BOOT_HEADER_ENABLE=1 + CFG_TUSB_MCU=OPT_MCU_MIMXRT + ) + target_link_options(${BOARD_TARGET} PUBLIC + --specs=nosys.specs + --specs=nano.specs + ) +endfunction() + +#------------------------------------ +# override one in family_supoort.cmake +#------------------------------------ + +function(family_add_bin_hex TARGET) + add_custom_command(TARGET ${TARGET} POST_BUILD + COMMAND ${CMAKE_OBJCOPY} -Obinary $ $/${TARGET}.bin + COMMAND ${CMAKE_OBJCOPY} -Oihex --change-addresses ${UF2_WRITE_ADDR} $ $/${TARGET}.hex + VERBATIM) +endfunction() + +function(family_flash_jlink TARGET) + if (NOT DEFINED JLINKEXE) + set(JLINKEXE JLinkExe) + endif () + + if (ARGC GREATER 1) + set(BIN_FILE $/${TARGET}.${ARGV1}) + else () + set(BIN_FILE $) + endif () + + file(GENERATE + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.jlink + CONTENT "halt +loadfile ${BIN_FILE} +r +go +exit" + ) + + add_custom_target(${TARGET}-jlink + DEPENDS ${TARGET} + COMMAND ${JLINKEXE} -device ${JLINK_DEVICE} -if swd -JTAGConf -1,-1 -speed auto -CommandFile ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.jlink + ) +endfunction() + +function(family_flash_sdp TARGET) + if (NOT DEFINED SDPHOST) + set(SDPHOST sdphost) + endif () + + file(STRINGS ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/linker/${MCU_VARIANT}_ram.ld FCFB_ORIGIN + REGEX "_fcfb_origin *=" + ) + file(STRINGS ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/linker/${MCU_VARIANT}_ram.ld IVT_ORIGIN + REGEX "_ivt_origin *=" + ) + string(REGEX REPLACE ".*= *(0x[0-9a-fA-F]+).*" "\\1" FCFB_ORIGIN ${FCFB_ORIGIN}) + string(REGEX REPLACE ".*= *(0x[0-9a-fA-F]+).*" "\\1" IVT_ORIGIN ${IVT_ORIGIN}) + + add_custom_target(${TARGET}-sdp + DEPENDS ${TARGET} + COMMAND ${SDPHOST} -u 0x1fc9,${SDP_PID} write-file ${FCFB_ORIGIN} $/${TARGET}.bin + COMMAND ${SDPHOST} -u 0x1fc9,${SDP_PID} jump-address ${IVT_ORIGIN} + ) +endfunction() + +#------------------------------------ +# Main target +#------------------------------------ +function(family_configure_tinyuf2 TARGET) + family_configure_common(${TARGET}) + add_board_target(board_${BOARD}) + + #---------- Port Specific ---------- + target_sources(${TARGET} PUBLIC + ${TOP}/lib/tinyusb/src/portable/chipidea/ci_hs/dcd_ci_hs.c + ) + #target_include_directories(${TARGET} PUBLIC) + #target_compile_definitions(${TARGET} PUBLIC) + target_link_options(${TARGET} PUBLIC + "LINKER:--script=${CMAKE_CURRENT_FUNCTION_LIST_DIR}/linker/${MCU_VARIANT}_ram.ld" + "LINKER:--script=${CMAKE_CURRENT_FUNCTION_LIST_DIR}/linker/memory.ld" + "LINKER:--script=${CMAKE_CURRENT_FUNCTION_LIST_DIR}/linker/common.ld" + ) + + include(${TOP}/src/tinyuf2.cmake) + add_tinyuf2(${TARGET}) + + target_link_libraries(${TARGET} PUBLIC board_${BOARD}) + + family_flash_sdp(${TARGET}) + family_flash_jlink(${TARGET} hex) endfunction() diff --git a/ports/rules.mk b/ports/rules.mk index 1fe750a65..1d627587e 100644 --- a/ports/rules.mk +++ b/ports/rules.mk @@ -47,7 +47,7 @@ $(BUILD)/$(OUTNAME).bin: $(BUILD)/$(OUTNAME).elf @echo CREATE $@ @$(OBJCOPY) -O binary $^ $@ -# skip hex rul if building bootloader for imxrt since it needs spceial rule +# skip hex rule if building bootloader for imxrt since it needs spceial rule ifneq ($(PORT)$(BUILD_APPLICATION),mimxrt10xx) $(BUILD)/$(OUTNAME).hex: $(BUILD)/$(OUTNAME).elf diff --git a/ports/stm32f3/CMakeLists.txt b/ports/stm32f3/CMakeLists.txt index d1b12bc91..b7ebe4779 100644 --- a/ports/stm32f3/CMakeLists.txt +++ b/ports/stm32f3/CMakeLists.txt @@ -1,23 +1,6 @@ cmake_minimum_required(VERSION 3.17) -#------------------------------------ -# Config -#------------------------------------ -include(${CMAKE_CURRENT_LIST_DIR}/../../cmake/family_support.cmake) -set(ST_HAL_DRIVER ${TOP}/lib/st/stm32f3xx_hal_driver) -set(ST_CMSIS ${TOP}/lib/st/cmsis_device_f3) -set(CMSIS_5 ${TOP}/lib/CMSIS_5) -set(PORT_DIR ${CMAKE_CURRENT_LIST_DIR}) - -include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake) - -# enable LTO for all targets -set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) - -set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor") -set(CMAKE_TOOLCHAIN_FILE ${TOP}/cmake/toolchain/arm_${TOOLCHAIN}.cmake) - -set(UF2_FAMILY_ID 0x6b846188) +include(${CMAKE_CURRENT_LIST_DIR}/../family_support.cmake) project(tinyuf2 C ASM) @@ -25,32 +8,18 @@ project(tinyuf2 C ASM) # TinyUF2 #------------------------------------ +set(CMAKE_EXECUTABLE_SUFFIX .elf) add_executable(tinyuf2) -family_configure(tinyuf2) target_sources(tinyuf2 PUBLIC board_flash.c boards.c boards.h - # tinyusb port - ${TOP}/lib/tinyusb/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c - ) -target_include_directories(tinyuf2 PUBLIC - . - ) -target_compile_options(tinyuf2 PUBLIC ) -target_link_options(tinyuf2 PUBLIC - "LINKER:--script=${CMAKE_CURRENT_LIST_DIR}/linker/stm32f3_boot.ld" - ) - -include(${CMAKE_CURRENT_SOURCE_DIR}/../../src/tinyuf2.cmake) -add_tinyuf2(tinyuf2) +#target_compile_options(tinyuf2 PUBLIC) +#target_link_options(tinyuf2 PUBLIC) -# include tinyusb cmake -#include(${CMAKE_CURRENT_SOURCE_DIR}/../lib/tinyusb/src/CMakeLists.txt) - -target_link_libraries(tinyuf2 board_${BOARD}) +family_configure_tinyuf2(tinyuf2) family_add_bin_hex(tinyuf2) family_flash_jlink(tinyuf2) @@ -60,39 +29,6 @@ add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/apps/self_update) #------------------------------------ # BOARD_TARGET -#------------------------------------ - # used by all executable -add_library(board_${BOARD} STATIC - ${ST_CMSIS}/Source/Templates/system_stm32f3xx.c - ${ST_HAL_DRIVER}/Src/stm32f3xx_hal.c - ${ST_HAL_DRIVER}/Src/stm32f3xx_hal_cortex.c - ${ST_HAL_DRIVER}/Src/stm32f3xx_hal_rcc.c - ${ST_HAL_DRIVER}/Src/stm32f3xx_hal_rcc_ex.c - ${ST_HAL_DRIVER}/Src/stm32f3xx_hal_gpio.c - ${ST_HAL_DRIVER}/Src/stm32f3xx_hal_flash.c - ${ST_HAL_DRIVER}/Src/stm32f3xx_hal_flash_ex.c - ${ST_HAL_DRIVER}/Src/stm32f3xx_hal_uart.c - ) -target_include_directories(board_${BOARD} PUBLIC - . - boards/${BOARD} - ${CMSIS_5}/CMSIS/Core/Include - ${ST_CMSIS}/Include - ${ST_HAL_DRIVER}/Inc - ) -target_compile_definitions(board_${BOARD} PUBLIC - CFG_TUSB_MCU=OPT_MCU_STM32F3 - BOARD_UF2_FAMILY_ID=${UF2_FAMILY_ID} - ) -target_compile_options(board_${BOARD} PUBLIC - ) -target_link_options(board_${BOARD} PUBLIC - -nostartfiles - # nanolib - --specs=nosys.specs - --specs=nano.specs - ) +#------------------------------------ -# board specific -update_board(board_${BOARD}) diff --git a/ports/stm32f3/apps/self_update/CMakeLists.txt b/ports/stm32f3/apps/self_update/CMakeLists.txt index 61dd7041b..06fe14127 100644 --- a/ports/stm32f3/apps/self_update/CMakeLists.txt +++ b/ports/stm32f3/apps/self_update/CMakeLists.txt @@ -29,7 +29,7 @@ target_link_options(self_update PUBLIC "LINKER:--script=${PORT_DIR}/linker/stm32f3_app.ld" ) -family_configure(self_update) +family_configure_common(self_update) target_link_libraries(self_update board_${BOARD}) family_add_bin_hex(self_update) family_add_uf2(self_update ${UF2_FAMILY_ID}) \ No newline at end of file diff --git a/ports/stm32f3/family.cmake b/ports/stm32f3/family.cmake new file mode 100644 index 000000000..9ab63bcf1 --- /dev/null +++ b/ports/stm32f3/family.cmake @@ -0,0 +1,93 @@ +include_guard() + +if (NOT BOARD) + message(FATAL_ERROR "BOARD not specified") +endif () + +#------------------------------------ +# Config +#------------------------------------ + +set(UF2_FAMILY_ID 0x6b846188) +set(ST_HAL_DRIVER ${TOP}/lib/st/stm32f3xx_hal_driver) +set(ST_CMSIS ${TOP}/lib/st/cmsis_device_f3) +set(CMSIS_5 ${TOP}/lib/CMSIS_5) +set(PORT_DIR ${CMAKE_CURRENT_LIST_DIR}) + +include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake) + +# enable LTO +set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) + +set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor") +set(CMAKE_TOOLCHAIN_FILE ${TOP}/cmake/toolchain/arm_${TOOLCHAIN}.cmake) + +#------------------------------------ +# BOARD_TARGET +#------------------------------------ +# used by all executable targets + +function(add_board_target BOARD_TARGET) + if (TARGET ${BOARD_TARGET}) + return() + endif () + + add_library(${BOARD_TARGET} STATIC + ${ST_CMSIS}/Source/Templates/system_stm32f3xx.c + ${ST_HAL_DRIVER}/Src/stm32f3xx_hal.c + ${ST_HAL_DRIVER}/Src/stm32f3xx_hal_cortex.c + ${ST_HAL_DRIVER}/Src/stm32f3xx_hal_rcc.c + ${ST_HAL_DRIVER}/Src/stm32f3xx_hal_rcc_ex.c + ${ST_HAL_DRIVER}/Src/stm32f3xx_hal_gpio.c + ${ST_HAL_DRIVER}/Src/stm32f3xx_hal_flash.c + ${ST_HAL_DRIVER}/Src/stm32f3xx_hal_flash_ex.c + ${ST_HAL_DRIVER}/Src/stm32f3xx_hal_uart.c + ) + target_include_directories(${BOARD_TARGET} PUBLIC + # port & board + ${CMAKE_CURRENT_FUNCTION_LIST_DIR} + ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD} + # sdk + ${CMSIS_5}/CMSIS/Core/Include + ${ST_CMSIS}/Include + ${ST_HAL_DRIVER}/Inc + ) + + update_board(${BOARD_TARGET}) + + target_compile_definitions(${BOARD_TARGET} PUBLIC + CFG_TUSB_MCU=OPT_MCU_STM32F3 + BOARD_UF2_FAMILY_ID=${UF2_FAMILY_ID} + ) + target_compile_options(${BOARD_TARGET} PUBLIC + ) + target_link_options(${BOARD_TARGET} PUBLIC + -nostartfiles + # nanolib + --specs=nosys.specs + --specs=nano.specs + ) +endfunction() + +#------------------------------------ +# Main target +#------------------------------------ +function(family_configure_tinyuf2 TARGET) + family_configure_common(${TARGET}) + add_board_target(board_${BOARD}) + + #---------- Port Specific ---------- + target_sources(${TARGET} PUBLIC + ${TOP}/lib/tinyusb/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c + ) + #target_include_directories(${TARGET} PUBLIC) + #target_compile_definitions(${TARGET} PUBLIC) + target_link_options(${TARGET} PUBLIC + "LINKER:--script=${CMAKE_CURRENT_FUNCTION_LIST_DIR}/linker/stm32f3_boot.ld" + ) + + include(${TOP}/src/tinyuf2.cmake) + add_tinyuf2(${TARGET}) + + target_link_libraries(${TARGET} PUBLIC board_${BOARD}) +endfunction() \ No newline at end of file