| #!/bin/bash |
| |
| set -e |
| |
| HEX_NAME=${O}/${KERNEL_HEX_NAME} |
| ELF_NAME=${O}/${KERNEL_ELF_NAME} |
| |
| # XXX nios2-gdb-server doesn't seem to clean up after itself properly, |
| # and often will report "Unable to bind (98)" when restarting a session. |
| # Eventually the kernel cleans things up, but it takes a couple minutes. |
| # Use a random port each time so this doesn't annoy users. Use netstat to |
| # confirm that the randomly selected port isn't being used. |
| GDB_TCP_PORT= |
| while [ -z "$GDB_TCP_PORT" ]; do |
| GDB_TCP_PORT=$(shuf -i1024-49151 -n1) |
| netstat -atn | grep "127[.]0[.]0[.]1[:]$GDB_TCP_PORT" || break |
| GDB_TCP_PORT= |
| done |
| |
| REQUIRED_PROGRAMS="quartus_cpf quartus_pgm nios2-gdb-server nios2-download" |
| |
| |
| for pgm in ${REQUIRED_PROGRAMS}; do |
| type -P $pgm > /dev/null 2>&1 || { echo >&2 "$pgm not found in PATH"; exit 1; } |
| done |
| |
| # XXX do_flash() and do_debug() only support cases where the .elf is sent |
| # over the JTAG and the CPU directly boots from __start. CONFIG_XIP and |
| # CONFIG_INCLUDE_RESET_VECTOR must be disabled. |
| |
| do_flash() { |
| if [ -z "${NIOS2_CPU_SOF}" ]; then |
| echo "Please set NIOS2_CPU_SOF variable to location of CPU .sof data" |
| exit 1 |
| fi |
| |
| ${ZEPHYR_BASE}/scripts/support/quartus-flash.py \ |
| --sof ${NIOS2_CPU_SOF} \ |
| --kernel ${HEX_NAME} |
| } |
| |
| do_debug() { |
| do_debugserver 1 & |
| |
| # connect to the GDB server |
| ${GDB} ${TUI} ${ELF_NAME} -ex "target remote :${GDB_TCP_PORT}" |
| } |
| |
| do_debugserver() { |
| # 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 "Nios II GDB server running on port ${GDB_TCP_PORT}" |
| ${SETSID} nios2-gdb-server --tcpport ${GDB_TCP_PORT} --stop --reset-target |
| } |
| |
| |
| CMD="$1" |
| shift |
| |
| case "${CMD}" in |
| flash) |
| do_flash |
| ;; |
| debugserver) |
| do_debugserver |
| ;; |
| debug) |
| do_debug |
| ;; |
| esac |