Newer
Older
mbed-os / tools / cmake / upload_methods / UploadMethodREDLINK.cmake
# Copyright (c) 2022 ARM Limited. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

### Redlink Upload Method
# This method needs the following parameters:
# REDLINK_PART_NUMBER - Part number (-p) argument to pass to the upload tool
# REDLINK_PART_XML_DIR - Directory where the XML files for this MCU can be found.
# REDLINK_CLOCK_SPEED - JTAG/SWD clock speed to talk to the target at.
# REDLINK_CONNECT_ARGS - Extra connect arguments to pass to Redlink tool.  These can be gotten by watching the command that MCUXpresso IDE executes when you start a debug session.
# This method creates the following options:
# REDLINK_PROBE_SN - Serial number of the debug probe to connect to.  If blank, will connect to any probe.

set(UPLOAD_SUPPORTS_DEBUG TRUE)

### Handle options
set(REDLINK_PROBE_SN "" CACHE STRING "Serial number of the debug probe to connect to for Redlink.  Set to empty to detect any matching adapter.")

if("${REDLINK_PROBE_SN}" STREQUAL "")
	# This argument causes Redlink to connect to the first available debug probe
	set(REDLINK_PROBE_ARGS --probehandle 1 CACHE INTERNAL "" FORCE)
else()
	set(REDLINK_PROBE_ARGS --probeserial ${REDLINK_PROBE_SN} CACHE INTERNAL "" FORCE)
endif()

if("${REDLINK_PART_NUMBER}" STREQUAL "")
	message(FATAL_ERROR "You must set REDLINK_PART_NUMBER in your CMake scripts to use REDLINK")
endif()

if("${REDLINK_PART_XML_DIR}" STREQUAL "")
	message(FATAL_ERROR "You must set REDLINK_PART_XML_DIR in your CMake scripts to use REDLINK")
endif()

if("${REDLINK_CLOCK_SPEED}" STREQUAL "")
	message(FATAL_ERROR "You must set REDLINK_CLOCK_SPEED in your CMake scripts to use REDLINK")
endif()

### Check if upload method can be enabled on this machine
find_package(Redlink)
set(UPLOAD_REDLINK_FOUND ${Redlink_FOUND})

### Function to generate upload target

function(gen_upload_target TARGET_NAME BIN_FILE HEX_FILE)

	add_custom_target(flash-${TARGET_NAME}
		COMMENT "Flashing ${TARGET_NAME} with Redlink..."
		COMMAND ${crt_emu_cm_redlink_PATH}
			-p ${REDLINK_PART_NUMBER}
			--flash-hashing
			-x ${REDLINK_PART_XML_DIR}
			--flash-dir ${REDLINK_FLASH_LOADER_PATH}
			-g
			-s ${REDLINK_CLOCK_SPEED}
			${REDLINK_CONNECT_ARGS}
			${REDLINK_PROBE_ARGS}
			--flash-load-exec $<TARGET_FILE:${TARGET_NAME}>)

	add_dependencies(flash-${TARGET_NAME} ${TARGET_NAME})

endfunction(gen_upload_target)

### Commands to run the debug server.
set(UPLOAD_GDBSERVER_DEBUG_COMMAND
	${crt_emu_cm_redlink_PATH}
	-p ${REDLINK_PART_NUMBER}
	--flash-hashing
	-x ${REDLINK_PART_XML_DIR}
	--flash-dir ${REDLINK_FLASH_LOADER_PATH}
	-g
	-s ${REDLINK_CLOCK_SPEED}
	-2
	${REDLINK_CONNECT_ARGS}
	${REDLINK_PROBE_ARGS}
	--server :${GDB_PORT}
	--vc
	--connect-reset system
	--kill-server # Close Redlink when GDB exits
)


# request extended-remote GDB sessions
set(UPLOAD_WANTS_EXTENDED_REMOTE TRUE)

set(UPLOAD_LAUNCH_COMMANDS
	"monitor reset" # undocumented, but works
	"load"
	"break main"
	"monitor reset"
)
set(UPLOAD_RESTART_COMMANDS
	"monitor reset"
)