scripts: Add support for 'make debug' using Segger JLink on NXP boards

Adds a new debug support script using Segger JLink and configures all
NXP boards so they can use it. Tested with Segger JLink GDB server
V6.14b and OpenSDA v2.1 firmware.

Change-Id: Ia1b297d9c93d21db61379e22f27ae54cda3ad461
Signed-off-by: Maureen Helm <maureen.helm@nxp.com>
diff --git a/boards/arm/frdm_k64f/Makefile.board b/boards/arm/frdm_k64f/Makefile.board
index e473331..6684d0a 100644
--- a/boards/arm/frdm_k64f/Makefile.board
+++ b/boards/arm/frdm_k64f/Makefile.board
@@ -4,4 +4,6 @@
 OPENOCD_LOAD_CMD = "flash write_image erase ${O}/${KERNEL_BIN_NAME} ${CONFIG_FLASH_BASE_ADDRESS}"
 OPENOCD_VERIFY_CMD = "verify_image ${O}/${KERNEL_BIN_NAME} ${CONFIG_FLASH_BASE_ADDRESS}"
 
-export FLASH_SCRIPT OPENOCD_LOAD_CMD OPENOCD_VERIFY_CMD
+JLINK_DEVICE = MK64FN1M0xxx12
+
+export FLASH_SCRIPT OPENOCD_LOAD_CMD OPENOCD_VERIFY_CMD JLINK_DEVICE
diff --git a/boards/arm/frdm_kl25z/Makefile.board b/boards/arm/frdm_kl25z/Makefile.board
new file mode 100644
index 0000000..2823a94
--- /dev/null
+++ b/boards/arm/frdm_kl25z/Makefile.board
@@ -0,0 +1,5 @@
+DEBUG_SCRIPT = jlink.sh
+
+JLINK_DEVICE = MKL25Z128xxx4
+
+export JLINK_DEVICE
diff --git a/boards/arm/frdm_kw41z/Makefile.board b/boards/arm/frdm_kw41z/Makefile.board
new file mode 100644
index 0000000..3dd9817
--- /dev/null
+++ b/boards/arm/frdm_kw41z/Makefile.board
@@ -0,0 +1,5 @@
+DEBUG_SCRIPT = jlink.sh
+
+JLINK_DEVICE = MKW41Z512xxx4
+
+export JLINK_DEVICE
diff --git a/boards/arm/hexiwear_k64/Makefile.board b/boards/arm/hexiwear_k64/Makefile.board
new file mode 100644
index 0000000..ef762a99
--- /dev/null
+++ b/boards/arm/hexiwear_k64/Makefile.board
@@ -0,0 +1,5 @@
+DEBUG_SCRIPT = jlink.sh
+
+JLINK_DEVICE = MK64FN1M0xxx12
+
+export JLINK_DEVICE
diff --git a/boards/arm/hexiwear_kw40z/Makefile.board b/boards/arm/hexiwear_kw40z/Makefile.board
new file mode 100644
index 0000000..ad405ee
--- /dev/null
+++ b/boards/arm/hexiwear_kw40z/Makefile.board
@@ -0,0 +1,5 @@
+DEBUG_SCRIPT = jlink.sh
+
+JLINK_DEVICE = MKW40Z160xxx4
+
+export JLINK_DEVICE
diff --git a/scripts/support/jlink.sh b/scripts/support/jlink.sh
new file mode 100755
index 0000000..30ca46b
--- /dev/null
+++ b/scripts/support/jlink.sh
@@ -0,0 +1,67 @@
+#!/bin/sh
+
+# This script is loosly based on a script with same purpose provided
+# by RIOT-OS (https://github.com/RIOT-OS/RIOT)
+
+JLINK_GDBSERVER=${JLINK_GDBSERVER:-JLinkGDBServer}
+JLINK_IF=${JLINK_IF:-swd}
+BIN_NAME=${O}/${KERNEL_BIN_NAME}
+ELF_NAME=${O}/${KERNEL_ELF_NAME}
+GDB_PORT=${GDB_PORT:-2331}
+
+test_config() {
+    if ! which ${JLINK_GDBSERVER} >/dev/null 2>&1; then
+        echo "Error: Unable to locate JLink GDB server: ${JLINK_GDBSERVER}"
+        exit 1
+    fi
+}
+
+test_bin() {
+    if [ ! -f "${BIN_NAME}" ]; then
+        echo "Error: Unable to locate image binary: ${BIN_NAME}"
+        exit 1
+    fi
+}
+
+do_debug() {
+    do_debugserver 1 &
+
+    # connect to the GDB server
+    ${GDB} ${TUI} ${ELF_NAME} \
+	-ex "target remote :${GDB_PORT}" \
+	-ex 'monitor halt' \
+	-ex 'load' \
+	-ex 'monitor reset'
+}
+
+do_debugserver() {
+    test_config
+
+    # Calling with an arg will result in setsid being used, which will prevent
+    # Ctrl-C in GDB from killing the server. The server automatically exits
+    # when the remote GDB disconnects.
+    if [ -n "$1" ]; then
+        SETSID=/usr/bin/setsid
+    else
+        SETSID=
+    fi
+
+    echo "JLink GDB server running on port ${GDB_PORT}"
+    ${SETSID} ${JLINK_GDBSERVER} \
+	-port ${GDB_PORT} \
+	-if ${JLINK_IF} \
+	-device ${JLINK_DEVICE} \
+	-singlerun
+}
+
+CMD="$1"
+shift
+
+case "${CMD}" in
+  debugserver)
+    do_debugserver "$@"
+    ;;
+  debug)
+    do_debug "$@"
+    ;;
+esac