From b531f43434779c5946973d141bf6dd942c5d946c Mon Sep 17 00:00:00 2001 From: hathach Date: Mon, 28 Jul 2025 22:58:32 +0700 Subject: [PATCH] add ci build for at32: f402_405, f403a_407, f423 --- .github/workflows/ci_set_matrix.py | 1 + .../boards/AT_START_F402_405/board.cmake | 6 + .../boards/AT_START_F402_405/board.mk | 1 + hw/bsp/at32f402_405/family.c | 8 +- hw/bsp/at32f402_405/family.cmake | 122 ++++++++++++++++++ hw/bsp/at32f402_405/family.mk | 2 +- .../boards/AT_START_F403A_407/board.cmake | 3 - hw/bsp/at32f403a_407/family.cmake | 18 ++- hw/bsp/at32f413/family.mk | 2 +- hw/bsp/at32f415/family.c | 8 +- hw/bsp/at32f415/family.mk | 2 +- .../at32f423/boards/AT_START_F423/board.cmake | 3 - hw/bsp/at32f423/family.c | 4 +- hw/bsp/at32f423/family.cmake | 18 ++- hw/bsp/at32f425/family.c | 8 +- hw/bsp/at32f425/family.mk | 2 +- hw/bsp/at32f435_437/family.c | 8 +- hw/bsp/at32f435_437/family.mk | 2 +- 18 files changed, 193 insertions(+), 25 deletions(-) create mode 100644 hw/bsp/at32f402_405/boards/AT_START_F402_405/board.cmake create mode 100644 hw/bsp/at32f402_405/family.cmake diff --git a/.github/workflows/ci_set_matrix.py b/.github/workflows/ci_set_matrix.py index ddb3ee1fb..5fe805c82 100755 --- a/.github/workflows/ci_set_matrix.py +++ b/.github/workflows/ci_set_matrix.py @@ -15,6 +15,7 @@ toolchain_list = [ # family: [supported toolchain] family_list = { + "at32f403a_407 at32f423": ["arm-gcc"], "broadcom_32bit": ["arm-gcc"], "broadcom_64bit": ["aarch64-gcc"], "ch32v10x ch32v20x ch32v307 fomu gd32vf103": ["riscv-gcc"], diff --git a/hw/bsp/at32f402_405/boards/AT_START_F402_405/board.cmake b/hw/bsp/at32f402_405/boards/AT_START_F402_405/board.cmake new file mode 100644 index 000000000..f27d73d7b --- /dev/null +++ b/hw/bsp/at32f402_405/boards/AT_START_F402_405/board.cmake @@ -0,0 +1,6 @@ +set(MCU_VARIANT AT32F405RCT7) +set(JLINK_DEVICE ${MCU_VARIANT}) + +function(update_board TARGET) + target_compile_definitions(${TARGET} PUBLIC ${MCU_VARIANT}) +endfunction() diff --git a/hw/bsp/at32f402_405/boards/AT_START_F402_405/board.mk b/hw/bsp/at32f402_405/boards/AT_START_F402_405/board.mk index 527d3706b..e09211794 100644 --- a/hw/bsp/at32f402_405/boards/AT_START_F402_405/board.mk +++ b/hw/bsp/at32f402_405/boards/AT_START_F402_405/board.mk @@ -1,3 +1,4 @@ +JLINK_DEVICE = AT32F405RCT7 LD_FILE = $(BOARD_PATH)/AT32F405xC_FLASH.ld CFLAGS += \ diff --git a/hw/bsp/at32f402_405/family.c b/hw/bsp/at32f402_405/family.c index e6a3bce22..2dbc538b8 100644 --- a/hw/bsp/at32f402_405/family.c +++ b/hw/bsp/at32f402_405/family.c @@ -280,11 +280,15 @@ size_t board_get_unique_id(uint8_t id[], size_t max_len) } #endif -void HardFault_Handler(void) -{ +void HardFault_Handler(void) { __asm("BKPT #0\n"); } +// Required by __libc_init_array in startup code if we are compiling using +// -nostdlib/-nostartfiles. +void _init(void) { +} + #ifdef USE_FULL_ASSERT void assert_failed(const char *file, uint32_t line) { diff --git a/hw/bsp/at32f402_405/family.cmake b/hw/bsp/at32f402_405/family.cmake new file mode 100644 index 000000000..2d2cdc026 --- /dev/null +++ b/hw/bsp/at32f402_405/family.cmake @@ -0,0 +1,122 @@ +include_guard() + +set(AT_FAMILY at32f402_405) +set(AT_SDK_LIB ${TOP}/hw/mcu/artery/${AT_FAMILY}/libraries) + +string(TOUPPER ${AT_FAMILY} AT_FAMILY_UPPER) + +# include board specific +include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake) + +# toolchain set up +set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor") +set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake) + +set(FAMILY_MCUS ${AT_FAMILY_UPPER} CACHE INTERNAL "") + +# extract variant linker name +string(LENGTH ${MCU_VARIANT} MCU_VARIANT_LEN) +math(EXPR MCU_FLASH_CODE_INDEX "${MCU_VARIANT_LEN} - 3") +math(EXPR MCU_VARIANT_PREFIX_LEN "${MCU_FLASH_CODE_INDEX} - 1") +string(SUBSTRING ${MCU_VARIANT} ${MCU_FLASH_CODE_INDEX} 1 MCU_FLASH_CODE) +string(SUBSTRING ${MCU_VARIANT} 0 ${MCU_VARIANT_PREFIX_LEN} MCU_VARIANT_PREFIX) +set(MCU_LINKER_NAME ${MCU_VARIANT_PREFIX}x${MCU_FLASH_CODE}) + +#------------------------------------ +# BOARD_TARGET +#------------------------------------ +# only need to be built ONCE for all examples +function(add_board_target BOARD_TARGET) + if (TARGET ${BOARD_TARGET}) + return() + endif () + + # Startup & Linker script + set(STARTUP_FILE_GNU ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/startup_${AT_FAMILY}.s) + set(STARTUP_FILE_Clang ${STARTUP_FILE_GNU}) + set(STARTUP_FILE_IAR ${AT_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT_FAMILY}.s) + + if (NOT DEFINED LD_FILE_GNU) + set(LD_FILE_GNU ${AT_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld) + endif () + set(LD_FILE_Clang ${LD_FILE_GNU}) + set(LD_FILE_IAR ${AT_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf) + + add_library(${BOARD_TARGET} STATIC + ${AT_SDK_LIB}/cmsis/cm4/device_support/system_${AT_FAMILY}.c + ${AT_SDK_LIB}/drivers/src/${AT_FAMILY}_gpio.c + ${AT_SDK_LIB}/drivers/src/${AT_FAMILY}_misc.c + ${AT_SDK_LIB}/drivers/src/${AT_FAMILY}_usart.c + ${AT_SDK_LIB}/drivers/src/${AT_FAMILY}_acc.c + ${AT_SDK_LIB}/drivers/src/${AT_FAMILY}_crm.c + ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} + ) + target_include_directories(${BOARD_TARGET} PUBLIC + ${CMAKE_CURRENT_FUNCTION_LIST_DIR} + ${AT_SDK_LIB}/cmsis/cm4/core_support + ${AT_SDK_LIB}/cmsis/cm4/device_support + ${AT_SDK_LIB}/drivers/inc + ) + target_compile_definitions(${BOARD_TARGET} PUBLIC + BOARD_TUD_RHPORT=0 + BOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED + ) + + update_board(${BOARD_TARGET}) + + if (CMAKE_C_COMPILER_ID STREQUAL "GNU") + target_link_options(${BOARD_TARGET} PUBLIC + "LINKER:--script=${LD_FILE_GNU}" + -nostartfiles + --specs=nosys.specs --specs=nano.specs + ) + elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang") + target_link_options(${BOARD_TARGET} PUBLIC + "LINKER:--script=${LD_FILE_Clang}" + ) + elseif (CMAKE_C_COMPILER_ID STREQUAL "IAR") + target_link_options(${BOARD_TARGET} PUBLIC + "LINKER:--config=${LD_FILE_IAR}" + ) + endif () +endfunction() + + +#------------------------------------ +# Functions +#------------------------------------ +function(family_configure_example TARGET RTOS) + family_configure_common(${TARGET} ${RTOS}) + + # Board target + add_board_target(board_${BOARD}) + + #---------- Port Specific ---------- + # These files are built for each example since it depends on example's tusb_config.h + target_sources(${TARGET} PUBLIC + # BSP + ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c + ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c + ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT_FAMILY}_clock.c + ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT_FAMILY}_int.c + ) + target_include_directories(${TARGET} PUBLIC + # family, hw, board + ${CMAKE_CURRENT_FUNCTION_LIST_DIR} + ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../ + ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD} + ) + + # Add TinyUSB target and port source + family_add_tinyusb(${TARGET} OPT_MCU_${AT_FAMILY_UPPER}) + target_sources(${TARGET} PUBLIC + ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c + ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c + ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c + ) + target_link_libraries(${TARGET} PUBLIC board_${BOARD}) + + # Flashing + family_add_bin_hex(${TARGET}) + family_flash_jlink(${TARGET}) +endfunction() diff --git a/hw/bsp/at32f402_405/family.mk b/hw/bsp/at32f402_405/family.mk index 461264561..91b5baffb 100644 --- a/hw/bsp/at32f402_405/family.mk +++ b/hw/bsp/at32f402_405/family.mk @@ -16,7 +16,7 @@ CFLAGS += \ -DBOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED LDFLAGS_GCC += \ - -flto --specs=nosys.specs + -flto --specs=nosys.specs -nostdlib -nostartfiles SRC_C += \ src/portable/synopsys/dwc2/dcd_dwc2.c \ diff --git a/hw/bsp/at32f403a_407/boards/AT_START_F403A_407/board.cmake b/hw/bsp/at32f403a_407/boards/AT_START_F403A_407/board.cmake index fb45caf23..72ace807a 100644 --- a/hw/bsp/at32f403a_407/boards/AT_START_F403A_407/board.cmake +++ b/hw/bsp/at32f403a_407/boards/AT_START_F403A_407/board.cmake @@ -1,9 +1,6 @@ set(MCU_VARIANT AT32F403ACGU7) set(JLINK_DEVICE ${MCU_VARIANT}) -set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/AT32F403AxG_FLASH.ld) -set(LD_FILE_IAR ${AT_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/AT32F403AxG.icf) - function(update_board TARGET) target_compile_definitions(${TARGET} PUBLIC ${MCU_VARIANT}) endfunction() diff --git a/hw/bsp/at32f403a_407/family.cmake b/hw/bsp/at32f403a_407/family.cmake index c121b166b..19b392015 100644 --- a/hw/bsp/at32f403a_407/family.cmake +++ b/hw/bsp/at32f403a_407/family.cmake @@ -3,6 +3,8 @@ include_guard() set(AT_FAMILY at32f403a_407) set(AT_SDK_LIB ${TOP}/hw/mcu/artery/${AT_FAMILY}/libraries) +string(TOUPPER ${AT_FAMILY} AT_FAMILY_UPPER) + # include board specific include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake) @@ -10,7 +12,15 @@ include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake) set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor") set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake) -set(FAMILY_MCUS AT32F403A_407 CACHE INTERNAL "") +set(FAMILY_MCUS ${AT_FAMILY_UPPER} CACHE INTERNAL "") + +# extract variant linker name +string(LENGTH ${MCU_VARIANT} MCU_VARIANT_LEN) +math(EXPR MCU_FLASH_CODE_INDEX "${MCU_VARIANT_LEN} - 3") +math(EXPR MCU_VARIANT_PREFIX_LEN "${MCU_FLASH_CODE_INDEX} - 1") +string(SUBSTRING ${MCU_VARIANT} ${MCU_FLASH_CODE_INDEX} 1 MCU_FLASH_CODE) +string(SUBSTRING ${MCU_VARIANT} 0 ${MCU_VARIANT_PREFIX_LEN} MCU_VARIANT_PREFIX) +set(MCU_LINKER_NAME ${MCU_VARIANT_PREFIX}x${MCU_FLASH_CODE}) #------------------------------------ # BOARD_TARGET @@ -26,7 +36,11 @@ function(add_board_target BOARD_TARGET) set(STARTUP_FILE_Clang ${STARTUP_FILE_GNU}) set(STARTUP_FILE_IAR ${AT_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT_FAMILY}.s) + if (NOT DEFINED LD_FILE_GNU) + set(LD_FILE_GNU ${AT_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld) + endif () set(LD_FILE_Clang ${LD_FILE_GNU}) + set(LD_FILE_IAR ${AT_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf) add_library(${BOARD_TARGET} STATIC ${AT_SDK_LIB}/cmsis/cm4/device_support/system_${AT_FAMILY}.c @@ -90,7 +104,7 @@ function(family_configure_example TARGET RTOS) ) # Add TinyUSB target and port source - family_add_tinyusb(${TARGET} OPT_MCU_AT32F403A_407) + family_add_tinyusb(${TARGET} OPT_MCU_${AT_FAMILY_UPPER}) target_sources(${TARGET} PUBLIC ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c ) diff --git a/hw/bsp/at32f413/family.mk b/hw/bsp/at32f413/family.mk index a88c248dd..cf02445c0 100644 --- a/hw/bsp/at32f413/family.mk +++ b/hw/bsp/at32f413/family.mk @@ -15,7 +15,7 @@ CFLAGS += \ -DCFG_TUSB_MCU=OPT_MCU_AT32F413 LDFLAGS_GCC += \ - -flto --specs=nosys.specs + -flto --specs=nosys.specs -nostdlib -nostartfiles SRC_C += \ src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \ diff --git a/hw/bsp/at32f415/family.c b/hw/bsp/at32f415/family.c index 53897243a..516095dfb 100644 --- a/hw/bsp/at32f415/family.c +++ b/hw/bsp/at32f415/family.c @@ -271,11 +271,15 @@ size_t board_get_unique_id(uint8_t id[], size_t max_len) } #endif -void HardFault_Handler(void) -{ +void HardFault_Handler(void) { __asm("BKPT #0\n"); } +// Required by __libc_init_array in startup code if we are compiling using +// -nostdlib/-nostartfiles. +void _init(void) { +} + #ifdef USE_FULL_ASSERT void assert_failed(const char *file, uint32_t line) { diff --git a/hw/bsp/at32f415/family.mk b/hw/bsp/at32f415/family.mk index 7af6a8cb8..1edf6be4e 100644 --- a/hw/bsp/at32f415/family.mk +++ b/hw/bsp/at32f415/family.mk @@ -15,7 +15,7 @@ CFLAGS += \ -DCFG_TUSB_MCU=OPT_MCU_AT32F415 \ LDFLAGS_GCC += \ - -flto --specs=nosys.specs + -flto --specs=nosys.specs -nostdlib -nostartfiles SRC_C += \ src/portable/synopsys/dwc2/dcd_dwc2.c \ diff --git a/hw/bsp/at32f423/boards/AT_START_F423/board.cmake b/hw/bsp/at32f423/boards/AT_START_F423/board.cmake index 17e665a0b..45aa39900 100644 --- a/hw/bsp/at32f423/boards/AT_START_F423/board.cmake +++ b/hw/bsp/at32f423/boards/AT_START_F423/board.cmake @@ -1,9 +1,6 @@ set(MCU_VARIANT AT32F423VCT7) set(JLINK_DEVICE ${MCU_VARIANT}) -set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/AT32F423xC_FLASH.ld) -set(LD_FILE_IAR ${AT_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/AT32F423xC.icf) - function(update_board TARGET) target_compile_definitions(${TARGET} PUBLIC ${MCU_VARIANT}) endfunction() diff --git a/hw/bsp/at32f423/family.c b/hw/bsp/at32f423/family.c index afe3758ca..5e9e70dd8 100644 --- a/hw/bsp/at32f423/family.c +++ b/hw/bsp/at32f423/family.c @@ -262,8 +262,8 @@ void HardFault_Handler(void) { // Required by __libc_init_array in startup code if we are compiling using // -nostdlib/-nostartfiles. -// void _init(void) { -// } +void _init(void) { +} #ifdef USE_FULL_ASSERT void assert_failed(const char *file, uint32_t line) { diff --git a/hw/bsp/at32f423/family.cmake b/hw/bsp/at32f423/family.cmake index ebc855949..3845f13ad 100644 --- a/hw/bsp/at32f423/family.cmake +++ b/hw/bsp/at32f423/family.cmake @@ -3,6 +3,8 @@ include_guard() set(AT_FAMILY at32f423) set(AT_SDK_LIB ${TOP}/hw/mcu/artery/${AT_FAMILY}/libraries) +string(TOUPPER ${AT_FAMILY} AT_FAMILY_UPPER) + # include board specific include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake) @@ -10,7 +12,15 @@ include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake) set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor") set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake) -set(FAMILY_MCUS AT32F423 CACHE INTERNAL "") +set(FAMILY_MCUS ${AT_FAMILY_UPPER} CACHE INTERNAL "") + +# extract variant linker name +string(LENGTH ${MCU_VARIANT} MCU_VARIANT_LEN) +math(EXPR MCU_FLASH_CODE_INDEX "${MCU_VARIANT_LEN} - 3") +math(EXPR MCU_VARIANT_PREFIX_LEN "${MCU_FLASH_CODE_INDEX} - 1") +string(SUBSTRING ${MCU_VARIANT} ${MCU_FLASH_CODE_INDEX} 1 MCU_FLASH_CODE) +string(SUBSTRING ${MCU_VARIANT} 0 ${MCU_VARIANT_PREFIX_LEN} MCU_VARIANT_PREFIX) +set(MCU_LINKER_NAME ${MCU_VARIANT_PREFIX}x${MCU_FLASH_CODE}) #------------------------------------ # BOARD_TARGET @@ -26,7 +36,11 @@ function(add_board_target BOARD_TARGET) set(STARTUP_FILE_Clang ${STARTUP_FILE_GNU}) set(STARTUP_FILE_IAR ${AT_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT_FAMILY}.s) + if (NOT DEFINED LD_FILE_GNU) + set(LD_FILE_GNU ${AT_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld) + endif () set(LD_FILE_Clang ${LD_FILE_GNU}) + set(LD_FILE_IAR ${AT_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf) add_library(${BOARD_TARGET} STATIC ${AT_SDK_LIB}/cmsis/cm4/device_support/system_${AT_FAMILY}.c @@ -90,7 +104,7 @@ function(family_configure_example TARGET RTOS) ) # Add TinyUSB target and port source - family_add_tinyusb(${TARGET} OPT_MCU_AT32F423) + family_add_tinyusb(${TARGET} OPT_MCU_${AT_FAMILY_UPPER}) target_sources(${TARGET} PUBLIC ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c diff --git a/hw/bsp/at32f425/family.c b/hw/bsp/at32f425/family.c index 7c2db9258..59a485210 100644 --- a/hw/bsp/at32f425/family.c +++ b/hw/bsp/at32f425/family.c @@ -282,11 +282,15 @@ size_t board_get_unique_id(uint8_t id[], size_t max_len) } #endif -void HardFault_Handler(void) -{ +void HardFault_Handler(void) { __asm("BKPT #0\n"); } +// Required by __libc_init_array in startup code if we are compiling using +// -nostdlib/-nostartfiles. +void _init(void) { +} + #ifdef USE_FULL_ASSERT void assert_failed(const char *file, uint32_t line) { diff --git a/hw/bsp/at32f425/family.mk b/hw/bsp/at32f425/family.mk index 07b383ce9..81d5ffc97 100644 --- a/hw/bsp/at32f425/family.mk +++ b/hw/bsp/at32f425/family.mk @@ -15,7 +15,7 @@ CFLAGS += \ -DCFG_TUSB_MCU=OPT_MCU_AT32F425 \ LDFLAGS_GCC += \ - -flto --specs=nosys.specs + -flto --specs=nosys.specs -nostdlib -nostartfiles SRC_C += \ src/portable/synopsys/dwc2/dcd_dwc2.c \ diff --git a/hw/bsp/at32f435_437/family.c b/hw/bsp/at32f435_437/family.c index 03bb5674b..af1fb30e0 100644 --- a/hw/bsp/at32f435_437/family.c +++ b/hw/bsp/at32f435_437/family.c @@ -354,11 +354,15 @@ size_t board_get_unique_id(uint8_t id[], size_t max_len) } #endif -void HardFault_Handler(void) -{ +void HardFault_Handler(void) { __asm("BKPT #0\n"); } +// Required by __libc_init_array in startup code if we are compiling using +// -nostdlib/-nostartfiles. +void _init(void) { +} + #ifdef USE_FULL_ASSERT void assert_failed(const char *file, uint32_t line) { diff --git a/hw/bsp/at32f435_437/family.mk b/hw/bsp/at32f435_437/family.mk index f712a573d..891c7501c 100644 --- a/hw/bsp/at32f435_437/family.mk +++ b/hw/bsp/at32f435_437/family.mk @@ -15,7 +15,7 @@ CFLAGS += \ -DCFG_TUSB_MCU=OPT_MCU_AT32F435_437 \ LDFLAGS_GCC += \ - -flto --specs=nosys.specs + -flto --specs=nosys.specs -nostdlib -nostartfiles SRC_C += \ src/portable/synopsys/dwc2/dcd_dwc2.c \