From 3976df728c49ebd310bf8821b3a9834b5c032203 Mon Sep 17 00:00:00 2001 From: Jamie Smith Date: Sun, 8 May 2022 13:40:04 -0700 Subject: [PATCH] Add default upload method configuration for each target, make greentea tests use cmake upload methods --- CMakeLists.txt | 11 +++- targets/upload_method_cfg/NUCLEO_F429ZI.cmake | 47 ++++++++++++++ .../upload_method_cfg/NUCLEO_L452RE_P.cmake | 48 ++++++++++++++ targets/upload_method_cfg/README.md | 3 + .../openocd_cfgs/stm32f429-disco.cfg | 17 +++++ .../openocd_cfgs/stm32l452re.cfg | 14 +++++ tools/cmake/UploadMethodConfig-Sample.cmake | 63 ------------------- tools/cmake/UploadMethodManager.cmake | 9 ++- tools/cmake/UploadMethods.md | 4 +- tools/cmake/app.cmake | 14 +++-- tools/cmake/mbed-run-greentea-test.in.cmake | 14 +++++ tools/cmake/mbed_greentea.cmake | 29 ++++----- 12 files changed, 184 insertions(+), 89 deletions(-) create mode 100644 targets/upload_method_cfg/NUCLEO_F429ZI.cmake create mode 100644 targets/upload_method_cfg/NUCLEO_L452RE_P.cmake create mode 100644 targets/upload_method_cfg/README.md create mode 100644 targets/upload_method_cfg/openocd_cfgs/stm32f429-disco.cfg create mode 100644 targets/upload_method_cfg/openocd_cfgs/stm32l452re.cfg delete mode 100644 tools/cmake/UploadMethodConfig-Sample.cmake create mode 100644 tools/cmake/mbed-run-greentea-test.in.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 212aa0e27a..d8819199f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,9 +85,13 @@ endif() # Create project and find compilers (if not already found) project(mbed-os LANGUAGES C CXX ASM) -# Add all paths to the list files within Mbed OS +# Add all paths to the module files within Mbed OS list(APPEND CMAKE_MODULE_PATH - "${mbed-os_SOURCE_DIR}/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_LATEST/scripts;${mbed-os_SOURCE_DIR}/targets/TARGET_Cypress/scripts;${mbed-os_SOURCE_DIR}/targets/TARGET_NXP/scripts;${mbed-os_SOURCE_DIR}/targets/TARGET_NUVOTON/scripts/" + ${mbed-os_SOURCE_DIR}/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_LATEST/scripts + ${mbed-os_SOURCE_DIR}/targets/TARGET_Cypress/scripts + ${mbed-os_SOURCE_DIR}/targets/TARGET_NXP/scripts + ${mbed-os_SOURCE_DIR}/targets/TARGET_NUVOTON/scripts/ + ${mbed-os_SOURCE_DIR}/tools/cmake/upload_methods ) add_subdirectory(extern) @@ -209,6 +213,9 @@ if(NOT MBED_IS_NATIVE_BUILD) string(REPLACE "_" "-" MBED_TARGET_CMAKE_NAME ${MBED_TARGET_CMAKE_NAME}) string(PREPEND MBED_TARGET_CMAKE_NAME "mbed-") + # Load upload method if one is set up + include(UploadMethodManager) + endif() if(MBED_IS_NATIVE_BUILD) diff --git a/targets/upload_method_cfg/NUCLEO_F429ZI.cmake b/targets/upload_method_cfg/NUCLEO_F429ZI.cmake new file mode 100644 index 0000000000..664293ae6a --- /dev/null +++ b/targets/upload_method_cfg/NUCLEO_F429ZI.cmake @@ -0,0 +1,47 @@ +# Mbed OS upload method configuration file for target NUCLEO_F429ZI. +# To change any of these parameters from their default values, set them in your build script between where you +# include app.cmake and where you add mbed os as a subdirectory. + +# Notes: +# 1. Using the JLINK upload method with your dev board requires converting its ST-LINK into a J-Link. See here for details: https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board/ + +# General config parameters +# ------------------------------------------------------------- +set(UPLOAD_METHOD_DEFAULT MBED) + +# Config options for MBED +# ------------------------------------------------------------- + +set(MBED_UPLOAD_ENABLED TRUE) +set(MBED_RESET_BAUDRATE 115200) + +# Config options for JLINK +# ------------------------------------------------------------- + +set(JLINK_UPLOAD_ENABLED TRUE) +set(JLINK_CPU_NAME STM32F429ZI) +set(JLINK_CLOCK_SPEED 4000) +set(JLINK_UPLOAD_INTERFACE SWD) + +# Config options for PYOCD +# ------------------------------------------------------------- + +set(PYOCD_UPLOAD_ENABLED TRUE) +set(PYOCD_TARGET_NAME stm32f429xi) +set(PYOCD_CLOCK_SPEED 4000k) + +# Config options for OPENOCD +# ------------------------------------------------------------- + +set(OPENOCD_UPLOAD_ENABLED TRUE) +set(OPENOCD_CHIP_CONFIG_COMMANDS + -f ${CMAKE_CURRENT_LIST_DIR}/openocd_cfgs/stm32f429-disco.cfg + -c "gdb_memory_map disable" # prevents OpenOCD crash on GDB connect + ) + +# Config options for STM32Cube +# ------------------------------------------------------------- + +set(STM32CUBE_UPLOAD_ENABLED TRUE) +set(STM32CUBE_CONNECT_COMMAND -c port=SWD reset=HWrst) +set(STM32CUBE_GDBSERVER_ARGS --swd) diff --git a/targets/upload_method_cfg/NUCLEO_L452RE_P.cmake b/targets/upload_method_cfg/NUCLEO_L452RE_P.cmake new file mode 100644 index 0000000000..f152e191f0 --- /dev/null +++ b/targets/upload_method_cfg/NUCLEO_L452RE_P.cmake @@ -0,0 +1,48 @@ +# Mbed OS upload method configuration file for target NUCLEO_F429ZI. +# To change any of these parameters from their default values, set them in your build script between where you +# include app.cmake and where you add mbed os as a subdirectory. + +# Notes: +# 1. Using the JLINK upload method with your dev board requires converting its ST-LINK into a J-Link. See here for details: https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board/ +# 2. Using pyocd with this device requires installing a pack: `pyocd pack -i STM32L4xx_DFP` + +# General config parameters +# ------------------------------------------------------------- +set(UPLOAD_METHOD_DEFAULT MBED) + +# Config options for MBED +# ------------------------------------------------------------- + +set(MBED_UPLOAD_ENABLED TRUE) +set(MBED_RESET_BAUDRATE 115200) + +# Config options for JLINK +# ------------------------------------------------------------- + +set(JLINK_UPLOAD_ENABLED TRUE) +set(JLINK_CPU_NAME STM32L452RE) +set(JLINK_CLOCK_SPEED 4000) +set(JLINK_UPLOAD_INTERFACE SWD) + +# Config options for PYOCD +# ------------------------------------------------------------- + +set(PYOCD_UPLOAD_ENABLED TRUE) +set(PYOCD_TARGET_NAME stm32l452retxp) # The nucleo board carries the -P version of the chip with SMPS support +set(PYOCD_CLOCK_SPEED 4000k) + +# Config options for OPENOCD +# ------------------------------------------------------------- + +set(OPENOCD_UPLOAD_ENABLED TRUE) +set(OPENOCD_CHIP_CONFIG_COMMANDS + -f ${CMAKE_CURRENT_LIST_DIR}/openocd_cfgs/stm32l452re.cfg + -c "gdb_memory_map disable" # prevents OpenOCD crash on GDB connect + ) + +# Config options for STM32Cube +# ------------------------------------------------------------- + +set(STM32CUBE_UPLOAD_ENABLED TRUE) +set(STM32CUBE_CONNECT_COMMAND -c port=SWD reset=HWrst) +set(STM32CUBE_GDBSERVER_ARGS --swd) diff --git a/targets/upload_method_cfg/README.md b/targets/upload_method_cfg/README.md new file mode 100644 index 0000000000..c68dc9fad2 --- /dev/null +++ b/targets/upload_method_cfg/README.md @@ -0,0 +1,3 @@ +## Upload Method Configuration +This folder contains upload method configuration scripts for each Mbed target. +The build system will attempt to load `${MBED_TARGET}.cmake` in this folder when setting up for a given Mbed target. \ No newline at end of file diff --git a/targets/upload_method_cfg/openocd_cfgs/stm32f429-disco.cfg b/targets/upload_method_cfg/openocd_cfgs/stm32f429-disco.cfg new file mode 100644 index 0000000000..d81911babd --- /dev/null +++ b/targets/upload_method_cfg/openocd_cfgs/stm32f429-disco.cfg @@ -0,0 +1,17 @@ +# OpenOCD config file for the STM32F429ZI +# Originally from: https://gist.github.com/nathantsoi/82021c774f33eb2bfb600da4bf0dfab3 +# openocd -f stm32f429-disco.cfg -c "program FILE_NAME.elf verify reset exit" +# for: http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/PF259090 + +interface hla +hla_layout stlink +hla_device_desc "ST-LINK/V2" + +# stm32f429 discovery 0483:374b +hla_vid_pid 0x0483 0x374b + +transport select hla_swd + +source [find target/stm32f4x.cfg] + +reset_config srst_only \ No newline at end of file diff --git a/targets/upload_method_cfg/openocd_cfgs/stm32l452re.cfg b/targets/upload_method_cfg/openocd_cfgs/stm32l452re.cfg new file mode 100644 index 0000000000..bbe91b9929 --- /dev/null +++ b/targets/upload_method_cfg/openocd_cfgs/stm32l452re.cfg @@ -0,0 +1,14 @@ +# OpenOCD config file for the STM32L452RE + +interface hla +hla_layout stlink +hla_device_desc "ST-LINK/V2" + +# ST-LINK V2.1 0483:374b +hla_vid_pid 0x0483 0x374b + +transport select hla_swd + +source [find target/stm32l4x.cfg] + +reset_config srst_only \ No newline at end of file diff --git a/tools/cmake/UploadMethodConfig-Sample.cmake b/tools/cmake/UploadMethodConfig-Sample.cmake deleted file mode 100644 index 44b4c7620a..0000000000 --- a/tools/cmake/UploadMethodConfig-Sample.cmake +++ /dev/null @@ -1,63 +0,0 @@ -# Copyright (c) 2020 ARM Limited. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Edit this file to configure the upload methods for your processor. - -# See here for documentation about these options: https://github.com/USCRPL/mbed-cmake/wiki/Upload-Methods - -# General config options -# ------------------------------------------------------------- -set(UPLOAD_METHOD_DEFAULT MBED) - -# use a higher numbered port to allow use without root on Linux/Mac -set(GDB_PORT 23331) - -# Config options for MBED -# ------------------------------------------------------------- - -set(MBED_UPLOAD_ENABLED TRUE) -set(MBED_RESET_BAUDRATE 9600) - -# Config options for JLINK -# ------------------------------------------------------------- - -set(JLINK_UPLOAD_ENABLED FALSE) - -if(JLINK_UPLOAD_ENABLED) - set(JLINK_CPU_NAME STM32F429ZI) - set(JLINK_JTAG_SPEED 4000) -endif() - -# Config options for PYOCD -# ------------------------------------------------------------- - -set(PYOCD_UPLOAD_ENABLED TRUE) - -if(PYOCD_UPLOAD_ENABLED) - set(PYOCD_TARGET_NAME stm32f429xi) - set(PYOCD_CLOCK_SPEED 4000k) -endif() - -# Config options for OPENOCD -# ------------------------------------------------------------- - -set(OPENOCD_UPLOAD_ENABLED FALSE) - -if(OPENOCD_UPLOAD_ENABLED) - set(OPENOCD_CHIP_CONFIG_COMMANDS - -f ${CMAKE_CURRENT_LIST_DIR}/stm32f429-disco.cfg - -c "gdb_memory_map disable" # prevents OpenOCD crash on GDB connect - ) -endif() - -# Config options for STM32Cube -# ------------------------------------------------------------- - -set(STM32CUBE_UPLOAD_ENABLED TRUE) - -if(STM32CUBE_UPLOAD_ENABLED) - - set(STM32CUBE_CONNECT_COMMAND -c port=SWD reset=HWrst) - set(STM32CUBE_GDBSERVER_ARGS --swd) - -endif() diff --git a/tools/cmake/UploadMethodManager.cmake b/tools/cmake/UploadMethodManager.cmake index 4533a4e12d..9bdda93ed1 100644 --- a/tools/cmake/UploadMethodManager.cmake +++ b/tools/cmake/UploadMethodManager.cmake @@ -4,13 +4,16 @@ # ---------------------------------------------- # Load the upload method that the user selects +# This variable should have been set in app.cmake or by the upload method cfg file, sanity check here if(NOT DEFINED UPLOAD_METHOD_DEFAULT) - message(STATUS "Note: UPLOAD_METHOD_DEFAULT not found. Please create an upload method config file if you wish to use CMake's auto uploading and debugging support.") - set(UPLOAD_METHOD_DEFAULT "NONE") + message(FATAL_ERROR "UPLOAD_METHOD_DEFAULT not found.") endif() set(UPLOAD_METHOD "${UPLOAD_METHOD_DEFAULT}" CACHE STRING "Method for uploading programs to the mbed") +# use a higher numbered port to allow use without root on Linux/Mac +set(GDB_PORT 23331 CACHE STRING "Port that the GDB server will be started on.") + include(UploadMethod${UPLOAD_METHOD}) if(NOT "${UPLOAD_${UPLOAD_METHOD}_FOUND}") @@ -42,7 +45,7 @@ endif() function(mbed_generate_upload_debug_targets target) # add upload target - gen_upload_target(${target} ${CMAKE_BINARY_DIR}/${target}.bin ${CMAKE_BINARY_DIR}/${target}.hex) + gen_upload_target(${target} ${CMAKE_CURRENT_BINARY_DIR}/${target}.bin ${CMAKE_CURRENT_BINARY_DIR}/${target}.hex) # add debug target if(UPLOAD_SUPPORTS_DEBUG) diff --git a/tools/cmake/UploadMethods.md b/tools/cmake/UploadMethods.md index e9d4125917..7edbd4b5a2 100644 --- a/tools/cmake/UploadMethods.md +++ b/tools/cmake/UploadMethods.md @@ -21,7 +21,7 @@ To debug, first run `make gdbserver` in one terminal to start up the debug probe |STM32Cube|`-DUPLOAD_METHOD=STM32CUBE`|✔️|✔️|Fast|All STMicroelectronics Mbed boards, custom boards with ST_Link probes. -### Common Parameters (for all methods) +### Common Parameter (for all methods) > UPLOAD_METHOD_DEFAULT @@ -29,6 +29,8 @@ To debug, first run `make gdbserver` in one terminal to start up the debug probe This sets the default upload method that CMake will use if one is not explicitly set. +### Common Options (for all methods) + > GDB_PORT **Type:** Integer diff --git a/tools/cmake/app.cmake b/tools/cmake/app.cmake index f6130c7434..3b439e9bd8 100644 --- a/tools/cmake/app.cmake +++ b/tools/cmake/app.cmake @@ -64,8 +64,14 @@ else() endif() # load mbed_create_distro -include(${CMAKE_CURRENT_LIST_DIR}/create_distro.cmake) +include(${CMAKE_CURRENT_LIST_DIR}/mbed_create_distro.cmake) -# load upload method -list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/upload_methods) -include(${CMAKE_CURRENT_LIST_DIR}/UploadMethodManager.cmake) +# load upload method configuration defaults for this target +set(EXPECTED_MBED_UPLOAD_CFG_FILE_PATH targets/upload_method_cfg/${MBED_TARGET}.cmake) +if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/../../${EXPECTED_MBED_UPLOAD_CFG_FILE_PATH}) + message(STATUS "Mbed: Loading default upload method configuration from ${EXPECTED_MBED_UPLOAD_CFG_FILE_PATH}") + include(${CMAKE_CURRENT_LIST_DIR}/../../${EXPECTED_MBED_UPLOAD_CFG_FILE_PATH}) +else() + message(STATUS "Mbed: Target does not have any upload method configuration. 'make flash-' commands will not be available unless configured by the upper-level project.") + set(UPLOAD_METHOD_DEFAULT "NONE") +endif() diff --git a/tools/cmake/mbed-run-greentea-test.in.cmake b/tools/cmake/mbed-run-greentea-test.in.cmake new file mode 100644 index 0000000000..21d34d3d46 --- /dev/null +++ b/tools/cmake/mbed-run-greentea-test.in.cmake @@ -0,0 +1,14 @@ +# This file is configured by CMake to create the script used to execute each Greentea test. + +# First flash the target using its configured Mbed OS upload method +execute_process( + # Note: we don't use cmake --build because that performs a reconfigure of the build system each time + COMMAND @CMAKE_MAKE_PROGRAM@ flash-@MBED_GREENTEA_TEST_NAME@ + WORKING_DIRECTORY @CMAKE_BINARY_DIR@ + COMMAND_ERROR_IS_FATAL ANY) + +# Then run and communicate with the test +execute_process( + COMMAND mbedhtrun --skip-flashing -f @MBED_GREENTEA_TEST_IMAGE_NAME@ @MBED_HTRUN_ARGUMENTS@ + WORKING_DIRECTORY "@CMAKE_CURRENT_BINARY_DIR@" + COMMAND_ERROR_IS_FATAL ANY) \ No newline at end of file diff --git a/tools/cmake/mbed_greentea.cmake b/tools/cmake/mbed_greentea.cmake index d02e2532ee..bb760c3a0d 100644 --- a/tools/cmake/mbed_greentea.cmake +++ b/tools/cmake/mbed_greentea.cmake @@ -5,14 +5,6 @@ option(MBED_GREENTEA_TEST_BAREMETAL "Select baremetal greentea tests" OFF) set(MBED_HTRUN_ARGUMENTS "" CACHE STRING "Argument list to forward to htrun.") -# TODO: After we convert all greentea tests to use CTest, remove this code. We -# define these parameters in mbed-os/CMakeLists.txt for greentea tests. -if(NOT BUILD_GREENTEA_TESTS) - set(MBED_CONFIG_PATH ${CMAKE_CURRENT_BINARY_DIR} CACHE INTERNAL "") - include(${CMAKE_CURRENT_LIST_DIR}/app.cmake) - set(MBED_ROOT ${CMAKE_CURRENT_LIST_DIR}/../.. CACHE INTERNAL "") -endif() - # CMake Macro for generalizing CMake configuration across the greentea test suite with configurable parameters # Macro args: # TEST_NAME - Test suite name @@ -137,17 +129,22 @@ function(mbed_greentea_add_test) list(APPEND MBED_HTRUN_ARGUMENTS "--baud-rate=${BAUD_RATE}") endif() + # Configure the CMake script which runs the test. + # We have to use a helper script in order to run both the flashing and htrun in one test + configure_file( + ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/mbed-run-greentea-test.in.cmake + ${CMAKE_CURRENT_BINARY_DIR}/mbed-run-greentea-${MBED_GREENTEA_TEST_NAME}.cmake + @ONLY) + + # Make sure the cmake script gets removed later + set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_CLEAN_FILES ${CMAKE_CURRENT_BINARY_DIR}/mbed-run-greentea-${MBED_GREENTEA_TEST_NAME}.cmake) + add_test( NAME ${MBED_GREENTEA_TEST_NAME} - COMMAND mbedhtrun - -f ${MBED_GREENTEA_TEST_IMAGE_NAME} - ${MBED_HTRUN_ARGUMENTS} - COMMAND_EXPAND_LISTS + COMMAND + ${CMAKE_COMMAND} -P mbed-run-greentea-${MBED_GREENTEA_TEST_NAME}.cmake + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) - option(VERBOSE_BUILD "Have a verbose build process") - if(VERBOSE_BUILD) - set(CMAKE_VERBOSE_MAKEFILE ON) - endif() endfunction()