diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/cmake/bare-metal-sources.cmake | 42 | ||||
-rw-r--r-- | scripts/cmake/bare-metal-toolchain.cmake | 65 | ||||
-rw-r--r-- | scripts/cmake/cmsis-dsp.cmake | 25 | ||||
-rw-r--r-- | scripts/cmake/native-sources.cmake | 8 | ||||
-rw-r--r-- | scripts/cmake/toolchains/bare-metal-armclang.cmake | 134 | ||||
-rw-r--r-- | scripts/cmake/toolchains/bare-metal-gcc.cmake | 145 | ||||
-rw-r--r-- | scripts/cmake/toolchains/native-gcc.cmake (renamed from scripts/cmake/native-toolchain.cmake) | 40 | ||||
-rw-r--r-- | scripts/mps3/sse-300/images.txt | 23 | ||||
-rw-r--r-- | scripts/py/gen_fpga_mem_map.py | 178 |
9 files changed, 377 insertions, 283 deletions
diff --git a/scripts/cmake/bare-metal-sources.cmake b/scripts/cmake/bare-metal-sources.cmake index 8b348e3..2bfe616 100644 --- a/scripts/cmake/bare-metal-sources.cmake +++ b/scripts/cmake/bare-metal-sources.cmake @@ -28,13 +28,15 @@ set(SOURCE_GEN_DIR ${CMAKE_BINARY_DIR}/generated/bsp) if (NOT DEFINED MEM_PROFILES_SRC_DIR) set(MEM_PROFILES_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/subsystem-profiles) endif() + set(MEM_PROFILE_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/templates/peripheral_memmap.h.template) set(IRQ_PROFILE_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/templates/peripheral_irqs.h.template) set(MEM_REGIONS_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/templates/mem_regions.h.template) set(TA_SETTINGS_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/templates/timing_adapter_settings.template) +set(LINKER_SCRIPT_DIR "${PLAT_HAL}/bsp/mem_layout") set(TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME "libtensorflow-microlite.a") set(TENSORFLOW_LITE_MICRO_FLAG "-DTF_LITE_STATIC_MEMORY") -set(ETHOS_U55_FLAG "-DARM_NPU=1") +set(ETHOS_U55_FLAG "-DARM_NPU=1") if (ETHOS_U55_ENABLED) set(OPTIONAL_FLAGS "${OPTIONAL_FLAGS} ${ETHOS_U55_FLAG}") @@ -54,23 +56,33 @@ if (TARGET_PLATFORM STREQUAL mps3) if (TARGET_SUBSYSTEM STREQUAL sse-300) message(STATUS "target subsystem is ${TARGET_SUBSYSTEM}") set(BSP_PACKAGE_DIR "${PLAT_HAL}/bsp/bsp-packs/mps3") - set(SCAT_FILE "${PLAT_HAL}/bsp/mem_layout/mps3-${TARGET_SUBSYSTEM}.sct") + set(LINKER_SCRIPT_NAME "${TARGET_PLATFORM}-${TARGET_SUBSYSTEM}") # Include the mem profile definitions specific to our target subsystem include(${MEM_PROFILES_SRC_DIR}/corstone-${TARGET_SUBSYSTEM}.cmake) set(OPTIONAL_FLAGS "${OPTIONAL_FLAGS} ${MPS3_PLATFORM_FLAG}") + + # For deployment on the MPS3 FPGA platform, we need to produce + # two bin files - one that is loaded into the ITCM, and another + # that is loaded into the DDR region. + set(MPS3_SECTION_PATTERNS "*.at_itcm" "*.at_ddr") + set(MPS3_OUTPUT_BIN_NAMES "itcm.bin" "ddr.bin") + set(MPS3_FPGA_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/scripts/${TARGET_PLATFORM}/${TARGET_SUBSYSTEM}/images.txt") else () message(FATAL_ERROR "Non compatible target subsystem: ${TARGET_SUBSYSTEM}") endif () elseif (TARGET_PLATFORM STREQUAL simple_platform) set(BSP_PACKAGE_DIR "${PLAT_HAL}/bsp/bsp-packs/${TARGET_PLATFORM}") - set(SCAT_FILE "${PLAT_HAL}/bsp/mem_layout/${TARGET_PLATFORM}.sct") + set(LINKER_SCRIPT_NAME "${TARGET_PLATFORM}") include(${MEM_PROFILES_SRC_DIR}/${TARGET_PLATFORM}.cmake) set(OPTIONAL_FLAGS "${OPTIONAL_FLAGS}") else () message(FATAL_ERROR "Non compatible target platform ${TARGET_PLATFORM}") endif () +# Add link options for the linker script to be used: +add_linker_script(${LINKER_SCRIPT_DIR} ${LINKER_SCRIPT_NAME}) + if (ETHOS_U55_ENABLED) USER_OPTION(TA_CONFIG_FILE "Path to the timing adapter configuration file" "${CMAKE_SCRIPTS_DIR}/ta_config.cmake" @@ -91,7 +103,6 @@ configure_file("${IRQ_PROFILE_TEMPLATE}" "${SOURCE_GEN_DIR}/peripheral_irqs.h") configure_file("${MEM_REGIONS_TEMPLATE}" "${SOURCE_GEN_DIR}/mem_regions.h") configure_file("${TA_SETTINGS_TEMPLATE}" "${SOURCE_GEN_DIR}/timing_adapter_settings.h") -message(STATUS "Scatter file: ${SCAT_FILE}") message(STATUS "Using BSP package from: ${BSP_PACKAGE_DIR}") if (DEFINED VERIFY_TEST_OUTPUT) @@ -114,27 +125,14 @@ if (DEFINED ARMCLANG_DEBUG_DWARF_LEVEL) set(OPTIONAL_FLAGS "${OPTIONAL_FLAGS} -gdwarf-${ARMCLANG_DEBUG_DWARF_LEVEL}") endif() -set(COMPILER_FLAGS "${ALL_COMMON_FLAGS} ${TENSORFLOW_LITE_MICRO_FLAG} ${PROFILING_OPT} ${OPTIONAL_FLAGS}") +set(COMPILER_FLAGS "${TENSORFLOW_LITE_MICRO_FLAG} ${PROFILING_OPT} ${OPTIONAL_FLAGS}") # For some reason, cmake doesn't pass the c++ standard flag, adding it manually set(CMAKE_CXX_FLAGS "${COMPILER_FLAGS} -std=c++11" CACHE INTERNAL "") set(CMAKE_C_FLAGS "${COMPILER_FLAGS}" CACHE INTERNAL "") -set(CMAKE_ASM_FLAGS "${CPU_LD}") set(CMAKE_ASM_COMPILE_OBJECT ${CMAKE_CXX_FLAGS}) -add_link_options(--strict --callgraph --load_addr_map_info --map) -add_link_options(--symbols --xref --scatter=${SCAT_FILE}) - -# Warnings to be ignored: -# L6314W = No section matches pattern -# L6439W = Multiply defined Global Symbol -add_link_options(--diag_suppress=L6439W,L6314W) -add_link_options(--info sizes,totals,unused,veneers --entry Reset_Handler) - -if (CMAKE_BUILD_TYPE STREQUAL Release) - add_link_options(--no_debug) -endif () - -set(CMAKE_EXE_LINKER_FLAGS "${CPU_LD}") +# Tell linker that reset interrupt handler is our entry point +add_link_options(--entry Reset_Handler) set(PLAT_BSP_INCLUDES ${PLAT_HAL}/bsp/cmsis-device/include @@ -168,3 +166,7 @@ file(GLOB_RECURSE SRC_PLAT_HAL "${PLAT_HAL}/bsp/bsp-core/*.c" "${BSP_PACKAGE_DIR}/*.c" ) + +# Special retarget source to direct stdin, stdout and stderr streams to the +# UART block. +set(PLAT_RETARGET_SOURCE "${PLAT_HAL}/bsp/bsp-core/retarget.c") diff --git a/scripts/cmake/bare-metal-toolchain.cmake b/scripts/cmake/bare-metal-toolchain.cmake deleted file mode 100644 index 5d91b98..0000000 --- a/scripts/cmake/bare-metal-toolchain.cmake +++ /dev/null @@ -1,65 +0,0 @@ -#---------------------------------------------------------------------------- -# Copyright (c) 2021 Arm Limited. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#---------------------------------------------------------------------------- -# specify the cross compiler -set(CMAKE_C_COMPILER armclang) -set(CMAKE_CXX_COMPILER armclang) -set(CMAKE_C_LINKER_PREFERENCE armlink) -set(CMAKE_ASM_LINKER_PREFERENCE armlink) -set(CMAKE_ASM_COMPILER armasm) -set(CMAKE_ASM_COMPILER_AR armar) - -set(CMAKE_CROSSCOMPILING true) -set(CMAKE_SYSTEM_NAME Generic) - -set(MIN_ARM_CLANG_VERSION 6.14) - -if (NOT DEFINED CMAKE_SYSTEM_PROCESSOR) - set(CMAKE_SYSTEM_PROCESSOR cortex-m55) -endif() - -# Skip compiler test execution -set(CMAKE_C_COMPILER_WORKS 1) -set(CMAKE_CXX_COMPILER_WORKS 1) - -set(PLATFORM_HAL 1) - -set(WARNING_OPTS "-Wall -Wextra -Wvla") -set(SPECIAL_OPTS "-fno-rtti -funsigned-char -fno-function-sections -fno-exceptions") -set(PLATFORM_FLAGS "-mthumb --target=arm-arm-non-eabi -mlittle-endian -DPLATFORM_HAL=${PLATFORM_HAL}") - -set(CMAKE_C_FLAGS_DEBUG "-DDEBUG -O0") -set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O3") - -set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -O0") -set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O3") - -if (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m55) - # Flags for cortex-m55 - set(CPU_CORTEX_M55 1) - set(CPU_CC "-mcpu=cortex-m55 -mfloat-abi=hard -MD -DCPU_CORTEX_M55=1 -DARM_MATH_DSP -DARM_MATH_LOOPUNROLL -D__FPU_USED=1") - set(CPU_LD "--cpu=8.1-M.Main.dsp") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m33) - # Flags for cortex-m33 to go here -endif() - -set(ALL_COMMON_FLAGS "${CPU_CC} ${WARNING_OPTS} ${SPECIAL_OPTS} ${PLATFORM_FLAGS}") - -function(enforce_compiler_version) - if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${MIN_ARM_CLANG_VERSION}) - message( FATAL_ERROR "Arm compiler version must be ${MIN_ARM_CLANG_VERSION} or greater to support ${CMAKE_SYSTEM_PROCESSOR} architecture." ) - endif() -endfunction() diff --git a/scripts/cmake/cmsis-dsp.cmake b/scripts/cmake/cmsis-dsp.cmake index cb0243b..bb26b69 100644 --- a/scripts/cmake/cmsis-dsp.cmake +++ b/scripts/cmake/cmsis-dsp.cmake @@ -37,7 +37,16 @@ set(CMSIS_CORE_INC_DIR "${CMSIS_SRC_PATH}/${CMSIS_CORE_PATH_SUFFIX}/Include file(GLOB_RECURSE CMSIS_DSP_SRC - "${CMSIS_DSP_SRC_DIR}/arm_*.c") + + "${CMSIS_DSP_SRC_DIR}/BasicMathFunctions/arm_*.c" + "${CMSIS_DSP_SRC_DIR}/FastMathFunctions/arm_*.c" + "${CMSIS_DSP_SRC_DIR}/CommonTables/arm_*.c" + "${CMSIS_DSP_SRC_DIR}/TransformFunctions/arm_*.c" + "${CMSIS_DSP_SRC_DIR}/StatisticsFunctions/arm_*.c" + + # Issue with q15 and q31 functions with Arm GNU toolchain, we only + # need f32 functions. + "${CMSIS_DSP_SRC_DIR}/ComplexMathFunctions/arm_*f32.c") # 4. Create static library set(CMSIS_DSP_TARGET cmsis-dsp) @@ -50,6 +59,20 @@ target_include_directories(${CMSIS_DSP_TARGET} PUBLIC target_include_directories(${CMSIS_DSP_TARGET} PRIVATE ${CMSIS_DSP_PRI_INC_DIR}) +if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + target_compile_options(${CMSIS_DSP_TARGET} PUBLIC -flax-vector-conversions) + + # There is a known issue with -O0 optimisation option that affects + # FFT functions from CMSIS-DSP when compiling with Arm GNU embedded + # toolchain version 10.2.1 + if (CMAKE_BUILD_TYPE STREQUAL Debug) + message(WARNING "There are known issues with CMSIS-DSP builds using " + "MVE extension without optimisation. Forcing -O3 " + "optimisation level") + target_compile_options(${CMSIS_DSP_TARGET} PUBLIC -O3) + endif() +endif () + # 5. Add any custom/conditional flags for compilation or linkage if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL cortex-m55) target_compile_definitions(${CMSIS_DSP_TARGET} PUBLIC diff --git a/scripts/cmake/native-sources.cmake b/scripts/cmake/native-sources.cmake index 743e075..1b1431a 100644 --- a/scripts/cmake/native-sources.cmake +++ b/scripts/cmake/native-sources.cmake @@ -34,13 +34,11 @@ set(TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME "libtensorflow-microlite.a") set(TENSORFLOW_LITE_MICRO_FLAGS "-DTF_LITE_STATIC_MEMORY -DACTIVATION_BUF_SRAM_SZ=0") set(CMAKE_C_FLAGS - "${WARNING_FLAGS} ${SPECIAL_OPTS} ${PLATFORM_FLAGS}\ - ${PROFILING_OPT} ${TF_FLAG} ${LOG_FLAG} ${TENSORFLOW_LITE_MICRO_FLAGS}" + "${PROFILING_OPT} ${LOG_FLAG} ${TENSORFLOW_LITE_MICRO_FLAGS}" CACHE INTERNAL "") + set(CMAKE_CXX_FLAGS - "${WARNING_FLAGS} ${SPECIAL_OPTS} ${SPECIAL_OPTS_CXX}\ - ${PLATFORM_FLAGS} ${PROFILING_OPT} ${TF_FLAG} ${LOG_FLAG}\ - ${TENSORFLOW_LITE_MICRO_FLAGS}" + "${PROFILING_OPT} ${LOG_FLAG} ${TENSORFLOW_LITE_MICRO_FLAGS}" CACHE INTERNAL "") # Include directories: diff --git a/scripts/cmake/toolchains/bare-metal-armclang.cmake b/scripts/cmake/toolchains/bare-metal-armclang.cmake new file mode 100644 index 0000000..0a86eb6 --- /dev/null +++ b/scripts/cmake/toolchains/bare-metal-armclang.cmake @@ -0,0 +1,134 @@ +#---------------------------------------------------------------------------- +# Copyright (c) 2021 Arm Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#---------------------------------------------------------------------------- +# specify the cross compiler +set(CMAKE_C_COMPILER armclang) +set(CMAKE_CXX_COMPILER armclang) +set(CMAKE_C_LINKER_PREFERENCE armlink) +set(CMAKE_ASM_LINKER_PREFERENCE armlink) +set(CMAKE_ASM_COMPILER armasm) +set(CMAKE_ASM_COMPILER_AR armar) + +set(CMAKE_CROSSCOMPILING true) +set(CMAKE_SYSTEM_NAME Generic) + +set(MIN_ARM_CLANG_VERSION 6.14) + +# Skip compiler test execution +set(CMAKE_C_COMPILER_WORKS 1) +set(CMAKE_CXX_COMPILER_WORKS 1) +set(PLATFORM_HAL 1) + +if (NOT DEFINED CMAKE_SYSTEM_PROCESSOR) + set(CMAKE_SYSTEM_PROCESSOR cortex-m55) +endif() + +if (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m55) + # Flags for cortex-m55 + set(CPU_COMPILE_DEF CPU_CORTEX_M55) + set(CPU_NAME ${CMAKE_SYSTEM_PROCESSOR}) + set(FLOAT_ABI hard) + set(ARM_MATH_DSP 1) + set(ARM_MATH_LOOPUNROLL 1) + set(CPU_LINK_OPT "--cpu=8.1-M.Main.dsp") +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m33) + # Flags for cortex-m33 to go here +endif() + +set(${CPU_COMPILE_DEF} 1) + +# Warning options +add_compile_options( + -Wall + -Wextra + -Wvla) + +# General purpose compile options: +add_compile_options( + -funsigned-char + -fno-function-sections + "$<$<COMPILE_LANGUAGE:CXX>:-fno-unwind-tables;-fno-rtti;-fno-exceptions>") + +# Arch compile options: +add_compile_options( + -mthumb + -mcpu=${CPU_NAME} + -mfloat-abi=${FLOAT_ABI} + --target=arm-arm-non-eabi + -mlittle-endian + -MD) + +# Compile definitions: +add_compile_definitions( + PLATFORM_HAL=${PLATFORM_HAL} + ${CPU_COMPILE_DEF}=1 + $<$<BOOL:${ARM_MATH_DSP}>:ARM_MATH_DSP> + $<$<BOOL:${ARM_MATH_LOOPUNROLL}>:ARM_MATH_LOOPUNROLL>) + +# Link options: +add_link_options(${CPU_LINK_OPT}) +set(CMAKE_ASM_FLAGS "${CPU_LINK_OPT}") + +# Warnings to be ignored: +# L6314W = No section matches pattern +# L6439W = Multiply defined Global Symbol +add_link_options( + --diag_suppress=L6439W,L6314W + --info sizes,totals,unused,veneers + --strict + --callgraph + --load_addr_map_info + --xref + "$<$<CONFIG:RELEASE>:--no_debug>") + +# Function to add a map file output for the linker to dump diagnostic information to. +function(add_target_map_file TARGET_NAME MAP_FILE_PATH) + target_link_options(${TARGET_NAME} PUBLIC + --map --symbols --list=${MAP_FILE_PATH}) +endfunction() + +# Function to add linker option to use the chosen linker script (scatter file). +function(add_linker_script SCRIPT_DIR SCRIPT_NAME) + set(LINKER_SCRIPT_PATH ${SCRIPT_DIR}/${SCRIPT_NAME}.sct + CACHE STRING "Linker script path") + if (NOT EXISTS ${LINKER_SCRIPT_PATH}) + message(FATAL_ERROR "Scatter file not found: ${LINKER_SCRIPT_PATH}") + endif() + message(STATUS "Using linker script: ${LINKER_SCRIPT_PATH}") + add_link_options(--scatter=${LINKER_SCRIPT_PATH}) +endfunction() + +# Function to set the command to copy/extract contents from an elf +# into a binary file. +function(add_bin_generation_command) + + set(multiValueArgs SECTION_PATTERNS OUTPUT_BIN_NAMES) + set(oneValueArgs TARGET_NAME OUTPUT_DIR AXF_PATH) + cmake_parse_arguments(PARSED "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + add_custom_command(TARGET ${PARSED_TARGET_NAME} + POST_BUILD + COMMAND fromelf --bin --output=${PARSED_OUTPUT_DIR}/ + ${PARSED_AXF_PATH}) + +endfunction() + +# Function to assert the compiler version +function(enforce_compiler_version) + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${MIN_ARM_CLANG_VERSION}) + message( FATAL_ERROR "Arm compiler version must be ${MIN_ARM_CLANG_VERSION} or greater to support ${CMAKE_SYSTEM_PROCESSOR} architecture." ) + endif() +endfunction() diff --git a/scripts/cmake/toolchains/bare-metal-gcc.cmake b/scripts/cmake/toolchains/bare-metal-gcc.cmake new file mode 100644 index 0000000..2ffc1bb --- /dev/null +++ b/scripts/cmake/toolchains/bare-metal-gcc.cmake @@ -0,0 +1,145 @@ +#---------------------------------------------------------------------------- +# Copyright (c) 2021 Arm Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#---------------------------------------------------------------------------- +# specify the cross compiler +set(TRIPLET arm-none-eabi) + +set(CMAKE_C_COMPILER ${TRIPLET}-gcc) +set(CMAKE_CXX_COMPILER ${TRIPLET}-g++) + +set(CMAKE_CROSSCOMPILING true) +set(CMAKE_SYSTEM_NAME Generic) + +set(MIN_GCC_VERSION 10.2.1) + +# Skip compiler test execution +set(CMAKE_C_COMPILER_WORKS 1) +set(CMAKE_CXX_COMPILER_WORKS 1) +set(PLATFORM_HAL 1) + +if (NOT DEFINED CMAKE_SYSTEM_PROCESSOR) + set(CMAKE_SYSTEM_PROCESSOR cortex-m55) +endif() + +if (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m55) + # Flags for cortex-m55 + set(CPU_COMPILE_DEF CPU_CORTEX_M55) + set(CPU_NAME ${CMAKE_SYSTEM_PROCESSOR}) + set(FLOAT_ABI hard) + set(ARM_MATH_DSP 1) + set(ARM_MATH_LOOPUNROLL 1) +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m33) + # Flags for cortex-m33 to go here +endif() + +set(${CPU_COMPILE_DEF} 1) + +# Warning options +add_compile_options( + -Wall + -Wextra + -Wvla + -Wno-psabi) + +# General purpose compile options: +add_compile_options( + -funsigned-char + -fno-function-sections + "$<$<COMPILE_LANGUAGE:CXX>:-fno-unwind-tables;-fno-rtti;-fno-exceptions>") + +# Arch compile options: +add_compile_options( + -mthumb + -mcpu=${CPU_NAME} + -mfloat-abi=${FLOAT_ABI} + -mlittle-endian + -MD) + +# Compile definitions: +add_compile_definitions( + PLATFORM_HAL=${PLATFORM_HAL} + ${CPU_COMPILE_DEF}=1 + $<$<BOOL:${ARM_MATH_DSP}>:ARM_MATH_DSP> + $<$<BOOL:${ARM_MATH_LOOPUNROLL}>:ARM_MATH_LOOPUNROLL>) + +# Link options: +add_link_options( + -mthumb + -mcpu=${CPU_NAME} + -mfloat-abi=${FLOAT_ABI} + -mlittle-endian + --specs=nosys.specs + --stats + "$<$<CONFIG:RELEASE>:--no-debug>") + +# Function to add a map file output for the linker to dump diagnostic information to. +function(add_target_map_file TARGET_NAME MAP_FILE_PATH) + target_link_options(${TARGET_NAME} PUBLIC + -Xlinker -Map=${MAP_FILE_PATH}) +endfunction() + +# Function to add linker option to use the chosen linker script. +function(add_linker_script SCRIPT_DIR SCRIPT_NAME) + set(LINKER_SCRIPT_PATH ${SCRIPT_DIR}/${SCRIPT_NAME}.ld + CACHE STRING "Linker script path") + if (NOT EXISTS ${LINKER_SCRIPT_PATH}) + message(FATAL_ERROR "Linker script not found: ${LINKER_SCRIPT_PATH}") + endif() + message(STATUS "Using linker script: ${LINKER_SCRIPT_PATH}") + add_link_options("SHELL:-T ${LINKER_SCRIPT_PATH}") +endfunction() + +# Function to set the command to copy/extract contents from an elf +# into a binary file. +function(add_bin_generation_command) + + set(multiValueArgs SECTION_PATTERNS OUTPUT_BIN_NAMES) + set(oneValueArgs TARGET_NAME OUTPUT_DIR AXF_PATH) + cmake_parse_arguments(PARSED "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + list(LENGTH PARSED_SECTION_PATTERNS N_SECTION_PATTERNS) + list(LENGTH PARSED_OUTPUT_BIN_NAMES N_OUTPUT_BIN_NAMES) + + if (NOT ${N_SECTION_PATTERNS} STREQUAL ${N_OUTPUT_BIN_NAMES}) + message(FATAL_ERROR "Section patterns and the output binary names " + "should be of the same length") + endif() + + message(STATUS "${TRIPLET}-objcopy requested to generate " + "${N_OUTPUT_BIN_NAMES} bin files.") + + math(EXPR MAX_IDX "${N_SECTION_PATTERNS} - 1") + + foreach(IDX RANGE ${MAX_IDX}) + + list(GET PARSED_OUTPUT_BIN_NAMES ${IDX} OUTPUT_BIN_NAME) + list(GET PARSED_SECTION_PATTERNS ${IDX} SECTION_PATTERN) + + add_custom_command(TARGET ${PARSED_TARGET_NAME} + POST_BUILD + COMMAND ${TRIPLET}-objcopy -O binary + --only-section ${SECTION_PATTERN} ${PARSED_AXF_PATH} + ${PARSED_OUTPUT_DIR}/${OUTPUT_BIN_NAME}) + endforeach() + +endfunction() + +# Function to assert the compiler version +function(enforce_compiler_version) + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${MIN_GCC_VERSION}) + message( FATAL_ERROR "arm-none-eabi-gcc version must be ${MIN_GCC_VERSION} or greater to support ${CMAKE_SYSTEM_PROCESSOR} architecture." ) + endif() +endfunction() diff --git a/scripts/cmake/native-toolchain.cmake b/scripts/cmake/toolchains/native-gcc.cmake index 2e28cd4..4b5a62b 100644 --- a/scripts/cmake/native-toolchain.cmake +++ b/scripts/cmake/toolchains/native-gcc.cmake @@ -19,22 +19,34 @@ set(CMAKE_C_COMPILER gcc) set(CMAKE_C_LINKER_PREFERENCE gcc) set(CMAKE_CXX_LINKER_PREFERENCE gcc) -set(CMAKE_C_FLAGS_DEBUG "-DDEBUG -O0 -g") -set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O3") - -set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -O0 -g") -set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O3") - # Platform specific directory: set(PLATFORM_HAL 3) -set(WARNING_FLAGS "-Wsign-compare -Wshadow \ - -Wextra -Wall -Wunused-function \ - -Wmissing-field-initializers \ - -Wswitch -Wvla -Wunused-parameter") -set(SPECIAL_OPTS "-fPIC -pthread") -set(PLATFORM_FLAGS "-DPLATFORM_HAL=${PLATFORM_HAL}") -set(SPECIAL_OPTS_CXX "-fno-threadsafe-statics") -set(CMAKE_EXE_LINKER_FLAGS "-lm -lc -lstdc++ --verbose") + +# Warning compiler definitions: +add_compile_options( + -Wsign-compare + -Wshadow + -Wextra + -Wall + -Wunused-function + -Wmissing-field-initializers + -Wswitch + -Wvla + -Wunused-parameter) + +# General purpose compile definitions: +add_compile_options( + -fPIC + -pthread + -DPLATFORM_HAL=${PLATFORM_HAL} + "$<$<COMPILE_LANGUAGE:CXX>:-fno-threadsafe-statics>") + +# Linker options +add_link_options( + -lm + -lc + -lstdc++ + --verbose) function(enforce_compiler_version) endfunction() diff --git a/scripts/mps3/sse-300/images.txt b/scripts/mps3/sse-300/images.txt new file mode 100644 index 0000000..b00c8b7 --- /dev/null +++ b/scripts/mps3/sse-300/images.txt @@ -0,0 +1,23 @@ +TITLE: Arm MPS3 FPGA prototyping board Images Configuration File + +; MCC mapping for Corstone-300 MPS3 bitfile package AN547 +; +-------------+---------------+-------------------------------+ +; | FPGA addr | MCC addr | Region | +; +-------------+---------------+-------------------------------+ +; | 0x00000000 | 0x00000000 | ITCM (NS) | +; | 0x01000000 | 0x02000000 | BRAM or FPGA's data SRAM (NS) | +; | 0x60000000 | 0x08000000 | DDR (NS) | +; | 0x70000000 | 0x0c000000 | DDR (S) | +; +-------------+---------------+-------------------------------+ + +[IMAGES] + +TOTALIMAGES: 2 ;Number of Images (Max: 32) + +IMAGE0ADDRESS: 0x00000000 ; MCC@0x00000000 <=> FPGA@0x00000000 +IMAGE0UPDATE: AUTO +IMAGE0FILE: \SOFTWARE\itcm.bin + +IMAGE1ADDRESS: 0x0c000000 ; MCC@0x0c000000 <=> FPGA@0x70000000 +IMAGE1UPDATE: AUTO +IMAGE1FILE: \SOFTWARE\ddr.bin diff --git a/scripts/py/gen_fpga_mem_map.py b/scripts/py/gen_fpga_mem_map.py deleted file mode 100644 index 5703a8d..0000000 --- a/scripts/py/gen_fpga_mem_map.py +++ /dev/null @@ -1,178 +0,0 @@ -# Copyright (c) 2021 Arm Limited. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -from argparse import ArgumentParser - -""" -This file is used as part of post build steps to generate 'images.txt' file -which can be copied over onto the MPS3 board's SD card. The purpose is to -limit having to manually edit the file based on different load regions that -the build scatter file might dictate. -""" - -def is_commented(line): - if (line.startswith(";")): - return True - else: - return False - - -def is_load_rom(line): - load_region_specifiers = ['LOAD_ROM', 'LD_ROM', 'LOAD_REGION'] - - for load_specifier in load_region_specifiers: - if line.startswith(load_specifier): - return True - - return False - - -class TargetSubsystem: - - def __init__(self, target_subsystem_name: str): - """ - Constructor for target class. - Arguments: - target_subsystem_name: name of the target subsystem - """ - # Dict with mem map and binary names we expect - self.subsystems = { - "sse-300": { - "mmap_mcc" : { - # FPGA addr | MCC addr | - "0x00000000": "0x00000000", # ITCM (NS) - "0x01000000": "0x02000000", # BRAM or FPGA's data SRAM (NS) - "0x60000000": "0x08000000", # DDR (NS) - "0x70000000": "0x0c000000" # DDR (S) - }, - "bin_names": { - 0: "itcm.bin", - 1: "dram.bin" - } - } - } - - self.name = target_subsystem_name - - - def is_supported(self, target_subsystem: str) -> bool: - """ - Checks if the target subsystem exists within systems - supported by this script - """ - if target_subsystem in self.subsystems.keys(): - return True - - print(f"Platforms supported: {self.subsystems.keys()}") - return False - - - def mps3_mappings(self) -> dict: - """ - Returns the FPGA <--> MCC address translations - as a dict - """ - if self.is_supported(self.name): - return self.subsystems[self.name]['mmap_mcc'] - return {} - - - def mps3_bin_names(self) -> dict: - """ - Returns expected binary names for the executable built - for Cortex-M55 or Cortex-M55+Ethos-U55 targets in the - form of a dict with index and name - """ - if self.is_supported(self.name): - return self.subsystems[self.name]['bin_names'] - - return {} - - -def main(args): - """ - Generates the output txt file with MCC to FPGA address mapping used - that is used by the MCC on FPGA to load executable regions into - correct regions in memory. - """ - # List out arguments used: - scatter_file_path = args.scatter_file_path - target_subsystem_name = args.target_subsystem - output_file_path = args.output_file_path - - target = TargetSubsystem(target_subsystem_name=target_subsystem_name) - - if target.is_supported(target_subsystem_name) != True: - print(f'Target {target_subsystem_name} not supported.') - return - - with open(scatter_file_path,'r') as scatter_file: - lines_read = scatter_file.readlines() - str_list = [] - - bin_names = None - mem_map = None - - mem_map = target.mps3_mappings() - bin_names = target.mps3_bin_names() - - str_list.append("TITLE: Arm MPS3 FPGA prototyping board Images Configuration File\n") - str_list.append("[IMAGES]\n\n") - - cnt = 0 - for line in lines_read: - if is_commented(line) or is_load_rom(line) != True: - continue - - addr = line.split()[1] - - if mem_map.get(addr, None) == None: - raise RuntimeError( - 'Translation for this address unavailable') - if cnt > len(bin_names): - raise RuntimeError( - f"bin names len exceeded: {cnt}") - - str_list.append("IMAGE" + str(cnt) + "ADDRESS: " + - mem_map[addr] + " ; MCC@" + mem_map[addr] + - " <=> FPGA@" + addr + "\n") - str_list.append("IMAGE" + str(cnt) + "UPDATE: AUTO\n") - str_list.append("IMAGE" + str(cnt) + "FILE: \SOFTWARE\\" + - bin_names[cnt] + "\n\n") - cnt += 1 - - if cnt > 0 and cnt < 33: - str_list.insert(2, - "TOTALIMAGES: {} ;Number of Images (Max: 32)\n\n".format( - cnt)) - else: - raise RuntimeError('Invalid image count') - - if os.path.exists(output_file_path): - os.remove(output_file_path) - print(''.join(str_list), file=open(output_file_path, "a")) - - -if __name__ == "__main__": - parser = ArgumentParser() - parser.add_argument("--scatter_file_path", type=str, required=True, - help="Path to the scatter file") - parser.add_argument("--target_subsystem", type=str, required=True, - help="Target subsystem in use") - parser.add_argument("--output_file_path", type=str, required=True, - help="Output file path") - args = parser.parse_args() - main(args) |