From 6aab6996dbd890c5788bf4e330454a3490268174 Mon Sep 17 00:00:00 2001 From: Nathaniel Graff Date: Wed, 6 Mar 2019 13:08:22 -0800 Subject: Add support for Segger J-Link Signed-off-by: Nathaniel Graff --- Makefile | 21 ++++++++++++++++----- scripts/debug | 13 ++++++++++++- scripts/standalone.mk | 16 ++++++++++++++++ scripts/upload | 17 +++++++++++++++-- 4 files changed, 59 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 20a4a5d..4afdacf 100644 --- a/Makefile +++ b/Makefile @@ -216,20 +216,21 @@ endif endif ############################################################# -# MEE Software Compilation +# CoreIP RTL Simulation Hex File Creation ############################################################# -# Generation of $(PROGRAM_ELF) is handled by scripts/standalone.mk -# In this top level Makefile, just describe how to turn the elf into -# $(PROGRAM_HEX) - ifeq ($(BSP),metal) + +# Use elf2hex if we're not using Segger J-Link OB (i.e. for coreip-rtl targets) +ifeq ($(SEGGER_JLINK_OB),) $(PROGRAM_HEX): \ scripts/elf2hex/install/bin/$(CROSS_COMPILE)-elf2hex \ $(PROGRAM_ELF) $< --output $@ --input $(PROGRAM_ELF) --bit-width $(COREIP_MEM_WIDTH) endif +endif + ############################################################# # Legacy Software Compilation ############################################################# @@ -263,11 +264,21 @@ endif ifeq ($(BSP),metal) +ifneq ($(SEGGER_JLINK_OB),) +upload: $(PROGRAM_HEX) + scripts/upload --hex $(PROGRAM_HEX) --jlink $(SEGGER_JLINK_EXE) +else upload: $(PROGRAM_ELF) scripts/upload --elf $(PROGRAM_ELF) --openocd $(RISCV_OPENOCD) --gdb $(RISCV_GDB) --openocd-config bsp/$(TARGET)/openocd.cfg +endif +ifneq ($(SEGGER_JLINK_OB),) +debug: $(PROGRAM_ELF) + scripts/debug --elf $(PROGRAM_ELF) --jlink $(SEGGER_JLINK_GDB_SERVER) --gdb $(RISCV_GDB) +else debug: $(PROGRAM_ELF) scripts/debug --elf $(PROGRAM_ELF) --openocd $(RISCV_OPENOCD) --gdb $(RISCV_GDB) --openocd-config bsp/$(TARGET)/openocd.cfg +endif else # BSP != metal diff --git a/scripts/debug b/scripts/debug index d02c42c..87068c5 100755 --- a/scripts/debug +++ b/scripts/debug @@ -5,6 +5,7 @@ set -o pipefail unset elf unset cfg +unset jlink unset openocd unset gdb while [[ "$1" != "" ]] @@ -13,13 +14,14 @@ do in --elf) elf="$2"; shift 2;; --openocd) openocd="$2"; shift 2;; + --jlink) jlink="$2"; shift 2;; --openocd-config) cfg="$2"; shift 2;; --gdb) gdb="$2"; shift 2;; *) echo "$0: Unknown argument $1"; exit 1;; esac done -if [[ "$elf" == "" ]] +if [ "$elf" == "" ] then echo "$0: --elf is required" >&2 exit 1 @@ -27,8 +29,17 @@ fi export GDB_PORT=3333 +if [ "$jlink" != "" ] +then + +$jlink -device RISC-V -port $GDB_PORT & + +else + $openocd -f $cfg & +fi + $gdb $elf -ex "set remotetimeout 240" -ex "target extended-remote localhost:${GDB_PORT}" kill %1 diff --git a/scripts/standalone.mk b/scripts/standalone.mk index e80e0c1..921d6a1 100644 --- a/scripts/standalone.mk +++ b/scripts/standalone.mk @@ -54,6 +54,7 @@ ifeq ($(RISCV_PATH),) RISCV_GCC := $(CROSS_COMPILE)-gcc RISCV_GXX := $(CROSS_COMPILE)-g++ RISCV_OBJDUMP := $(CROSS_COMPILE)-objdump +RISCV_OBJCOPY := $(CROSS_COMPILE)-objcopy RISCV_GDB := $(CROSS_COMPILE)-gdb RISCV_AR := $(CROSS_COMPILE)-ar RISCV_SIZE := $(CROSS_COMPILE)-size @@ -61,12 +62,16 @@ else RISCV_GCC := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)-gcc) RISCV_GXX := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)-g++) RISCV_OBJDUMP := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)-objdump) +RISCV_OBJCOPY := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)-objcopy) RISCV_GDB := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)-gdb) RISCV_AR := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)-ar) RISCV_SIZE := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)-size) PATH := $(abspath $(RISCV_PATH)/bin):$(PATH) endif +SEGGER_JLINK_EXE := JLinkExe +SEGGER_JLINK_GDB_SERVER := JLinkGDBServer + ############################################################# # Software ############################################################# @@ -84,6 +89,9 @@ software: $(PROGRAM_ELF) ifneq ($(COREIP_MEM_WIDTH),) software: $(PROGRAM_HEX) endif +ifneq ($(SEGGER_JLINK_OB),) +software: $(PROGRAM_HEX) +endif PROGRAM_SRCS = $(wildcard $(SRC_DIR)/*.c) $(wildcard $(SRC_DIR)/*.h) $(wildcard $(SRC_DIR)/*.S) @@ -104,6 +112,14 @@ $(PROGRAM_ELF): \ $(RISCV_SIZE) $@ +ifneq ($(SEGGER_JLINK_OB),) +# If we're using Segger J-Link OB, use objcopy to create an Intel hex file for programming +$(PROGRAM_HEX): \ + $(RISCV_OBJCOPY) \ + $(PROGRAM_ELF) + $< -O ihex $(PROGRAM_ELF) $@ +endif + .PHONY: clean-software clean-software: $(MAKE) -C $(SRC_DIR) clean diff --git a/scripts/upload b/scripts/upload index 66e9ed8..a52fc0a 100755 --- a/scripts/upload +++ b/scripts/upload @@ -4,31 +4,44 @@ set -e set -o pipefail unset elf +unset hex unset cfg unset openocd +unset jlink unset gdb while [[ "$1" != "" ]] do case "$1" in --elf) elf="$2"; shift 2;; + --hex) hex="$2"; shift 2;; --openocd) openocd="$2"; shift 2;; --openocd-config) cfg="$2"; shift 2;; + --jlink) jlink="$2"; shift 2;; --gdb) gdb="$2"; shift 2;; *) echo "$0: Unknown argument $1"; exit 1;; esac done -if [[ "$elf" == "" ]] +if [ "$elf" == "" -a "$hex" == "" ] then - echo "$0: --elf is required" >&2 + echo "$0: --elf or --hex is required" >&2 exit 1 fi export GDB_PORT=3333 +if [ "$jlink" != "" ] +then + +echo -e "loadfile $hex\nrnh\nexit" | $jlink -device FE310 -if JTAG -speed 4000 -jtagconf -1,-1 -autoconnect 1 + +else + $openocd -f $cfg & $gdb $elf --batch -ex "set remotetimeout 240" -ex "target extended-remote localhost:${GDB_PORT}" -ex "monitor reset halt" -ex "monitor flash protect 0 64 last off" -ex "load" -ex "monitor resume" -ex "monitor shutdown" -ex "quit" kill %1 + +fi -- cgit v1.2.1-18-gbd029