mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-09-11 02:23:09 +00:00
Currently running "make V=1 flash/debug" does not result in the caller discovering what commands are run to perform the action because make calls into an opaque script (which then makes complex invokations of both openocd and gdb). Make the script more transparent by conditionally enabling enabling tracing within the script. We also remove the "Done flashing" message. It is pointless because openocd has already *told* us it has done flashing ["wrote 16384 bytes from file .../zephyr.elf in 0.802135s (19.947 KiB/s)"]. It is also potentially misleading since it tells us we are "Done flashing" even when we failed to flash anything which risks misleading someone unfamiliar with openocd. Change-Id: Icaea28c4b00ac10965726dd4502162b7de080953 Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
110 lines
2.7 KiB
Bash
Executable File
110 lines
2.7 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# This script is loosly based on a script with same purpose provided
|
|
# by RIOT-OS (https://github.com/RIOT-OS/RIOT)
|
|
|
|
OPENOCD=${OPENOCD:-openocd}
|
|
OPENOCD_CMD="${OPENOCD}${OPENOCD_DEFAULT_PATH:+ -s $OPENOCD_DEFAULT_PATH}"
|
|
OPENOCD_CONFIG=${ZEPHYR_BASE}/boards/${ARCH}/${BOARD_NAME}/support/openocd.cfg
|
|
BIN_NAME=${O}/${KERNEL_BIN_NAME}
|
|
ELF_NAME=${O}/${KERNEL_ELF_NAME}
|
|
|
|
test_config() {
|
|
if [ ! -f "${OPENOCD_CONFIG}" ]; then
|
|
echo "Error: Unable to locate OpenOCD configuration file: ${OPENOCD_CONFIG}"
|
|
exit 1
|
|
fi
|
|
if ! which ${OPENOCD} >/dev/null 2>&1; then
|
|
echo "Error: Unable to locate OpenOCD executable: ${OPENOCD}"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
test_bin() {
|
|
if [ ! -f "${BIN_NAME}" ]; then
|
|
echo "Error: Unable to locate image binary: ${BIN_NAME}"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
do_flash() {
|
|
test_config
|
|
test_bin
|
|
|
|
# flash device with specified image
|
|
sh -c "${OPENOCD_CMD} -f '${OPENOCD_CONFIG}' \
|
|
-c 'init' \
|
|
-c 'targets' \
|
|
${OPENOCD_PRE_CMD:+-c $OPENOCD_PRE_CMD} \
|
|
-c 'reset halt' \
|
|
-c ${OPENOCD_LOAD_CMD} \
|
|
-c 'reset halt' \
|
|
-c ${OPENOCD_VERIFY_CMD} \
|
|
${OPENOCD_POST_CMD:+-c $OPENOCD_POST_CMD} \
|
|
-c 'reset run' \
|
|
-c 'shutdown'"
|
|
}
|
|
|
|
|
|
do_debug() {
|
|
test_config
|
|
test_bin
|
|
# setsid is needed so that Ctrl+C in GDB doesn't kill OpenOCD
|
|
[ -z "${SETSID}" ] && SETSID="$(which setsid)"
|
|
# temporary file that saves OpenOCD pid
|
|
OCD_PIDFILE=$(mktemp -t "openocd_pid.XXXXXXXXXX")
|
|
# cleanup after script terminates
|
|
trap "cleanup ${OCD_PIDFILE}" EXIT
|
|
# don't trap on Ctrl+C, because GDB keeps running
|
|
trap '' INT
|
|
# start OpenOCD as GDB server
|
|
${SETSID} sh -c "${OPENOCD_CMD} -f '${OPENOCD_CONFIG}' \
|
|
${OPENOCD_EXTRA_INIT} \
|
|
-c 'tcl_port ${TCL_PORT:-6333}' \
|
|
-c 'telnet_port ${TELNET_PORT:-4444}' \
|
|
-c 'gdb_port ${GDB_PORT:-3333}' \
|
|
-c 'init' \
|
|
-c 'targets' \
|
|
-c 'halt' \
|
|
& \
|
|
echo \$! > $OCD_PIDFILE" &
|
|
# connect to the GDB server
|
|
${GDB} ${TUI} -ex "target remote :${GDB_PORT:-3333}" ${ELF_NAME}
|
|
# will be called by trap
|
|
cleanup() {
|
|
OCD_PID="$(cat $OCD_PIDFILE)"
|
|
kill ${OCD_PID} &>/dev/null
|
|
rm -f "$OCD_PIDFILE"
|
|
exit 0
|
|
}
|
|
}
|
|
|
|
do_debugserver() {
|
|
test_config
|
|
sh -c "${OPENOCD_CMD} -f '${OPENOCD_CONFIG}' \
|
|
-c 'init' \
|
|
-c 'targets' \
|
|
-c 'reset halt'"
|
|
}
|
|
|
|
CMD="$1"
|
|
shift
|
|
|
|
if [ "$KBUILD_VERBOSE" -eq 1 ]
|
|
then
|
|
set -x
|
|
fi
|
|
|
|
case "${CMD}" in
|
|
flash)
|
|
echo "Flashing Target Device"
|
|
do_flash "$@"
|
|
;;
|
|
debugserver)
|
|
do_debugserver "$@"
|
|
;;
|
|
debug)
|
|
do_debug "$@"
|
|
;;
|
|
esac
|