At present 'make flash' target for boards that support flashing with OpenOCD works only with Zephyr SDK. This patch enables flashing without Zephyr SDK as long as openocd itself is installed. Change-Id: I4594d795225e54b7638839d590e4c0620f9ca88c Jira: ZEP-1893 Signed-off-by: Piotr Mienkowski <piotr.mienkowski@gmail.com>
106 lines
2.7 KiB
Bash
Executable File
106 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 'reset halt' \
|
|
-c ${OPENOCD_LOAD_CMD} \
|
|
-c 'reset halt' \
|
|
-c ${OPENOCD_VERIFY_CMD} \
|
|
${OPENOCD_POST_CMD} \
|
|
-c 'reset run' \
|
|
-c 'shutdown'"
|
|
echo 'Done flashing'
|
|
}
|
|
|
|
|
|
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
|
|
|
|
case "${CMD}" in
|
|
flash)
|
|
echo "Flashing Target Device"
|
|
do_flash "$@"
|
|
;;
|
|
debugserver)
|
|
do_debugserver "$@"
|
|
;;
|
|
debug)
|
|
do_debug "$@"
|
|
;;
|
|
esac
|