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
|