DEVICE := NRF51 DEVICESERIES := nrf51 # TODO: check that DEVICE_VARIANT, TARGET_CHIP and is set ifeq ($(PROJECT_NAME),) $(error PROJECT_NAME has to be set) endif ifeq ($(BOARD),) $(error BOARD has to be set) endif ifeq ($(DEVICE_VARIANT),) $(error DEVICE_VARIANT has to be set) endif ifeq ($(TARGET_CHIP),) $(error TARGET_CHIP has to be set) endif USE_SOFTDEVICE ?= NO SDK_INCLUDE_PATH = $(SDK_PATH)/Include SDK_SOURCE_PATH ?= $(SDK_PATH)/Source # TEMPLATE_PATH += $(SDK_SOURCE_PATH)/templates/gcc OUTPUT_BINARY_DIRECTORY := build # Modern (> 4.98?) exits with 0 on success JLINK_OUTPUT ?= 0 ifeq ($(OS),Windows_NT) include $(TEMPLATE_PATH)/Makefile.windows else include $(TEMPLATE_PATH)/Makefile.posix UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Linux) STAT_SIZE=stat --format %s endif ifeq ($(UNAME_S),Darwin) STAT_SIZE=stat -f %z endif endif # TODO: it should be possible to read the start address from the ld script, they're very structured. ifeq ($(LINKER_SCRIPT),) CFLAGS += -DSOFTDEVICE_PRESENT ifeq ($(USE_SOFTDEVICE), S110-v6) LINKER_SCRIPT = $(SDK_PATH)/components/toolchain/gcc/gcc_$(DEVICESERIES)_s110_$(DEVICE_VARIANT).ld OUTPUT_FILENAME := $(PROJECT_NAME)_s110-v6_$(DEVICE_VARIANT)_$(BOARD) STARTADDRESS = 0x14000 else ifeq ($(USE_SOFTDEVICE), S1xx_iot) LINKER_SCRIPT = $(SDK_PATH)/components/toolchain/gcc/gcc_$(DEVICESERIES)_s1xx_iot_$(DEVICE_VARIANT).ld OUTPUT_FILENAME := $(PROJECT_NAME)_s1xx_iot_$(DEVICE_VARIANT)_$(BOARD) STARTADDRESS = 0x18000 else ifeq ($(USE_SOFTDEVICE), S110) LINKER_SCRIPT = $(SDK_PATH)/components/toolchain/gcc/gcc_$(DEVICESERIES)_s110_$(DEVICE_VARIANT).ld OUTPUT_FILENAME := $(PROJECT_NAME)_s110_$(DEVICE_VARIANT)_$(BOARD) STARTADDRESS = 0x16000 else ifeq ($(USE_SOFTDEVICE), S120) LINKER_SCRIPT = $(SDK_PATH)/components/toolchain/gcc/gcc_$(DEVICESERIES)_s120_$(DEVICE_VARIANT).ld OUTPUT_FILENAME := $(PROJECT_NAME)_s120_$(DEVICE_VARIANT)_$(BOARD) STARTADDRESS = 0x18000 else ifeq ($(USE_SOFTDEVICE), NO) LINKER_SCRIPT = $(SDK_PATH)/components/toolchain/gcc/gcc_$(DEVICESERIES)_blank_$(DEVICE_VARIANT).ld OUTPUT_FILENAME := $(PROJECT_NAME)_$(DEVICE_VARIANT)_$(BOARD) STARTADDRESS = 0x0 else $(error Unknown softdevice: $(USE_SOFTDEVICE)) endif else # Use externally defined settings # TODO: verify that STARTADDRESS is set endif CPU := cortex-m0 #Flasher selection FLASHER := JLink #FLASHER := OpenOCD # Toolchain commands #JLINK := JLinkExe -Device nrf51822 -speed 100 -if swd JLINK := JLinkExe -device nrf51822 -speed 1000 -if swd #JLINK := JLinkExe -IP localhost #You need to change openOCD clause depending your dongle. I have stlink-v2 and it's working. Jlink will work if you fetch latest trunk from git. OPENOCD := /usr/local/bin/openocd -f interface/stlink-v2.cfg -c"transport select hla_swd" -f target/nrf51.cfg #OPENOCD := /usr/local/bin/openocd -f interface/jlink.cfg -c"transport select swd ; adapter_khz 1000 ; adapter_nsrst_delay 10" -f /home/death/de/nrf51.cfg CC := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-gcc" AS := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-as" AR := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-ar" -r LD := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-ld" NM := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-nm" OBJDUMP := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-objdump" OBJCOPY := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-objcopy" GDB := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-gdb" MK := mkdir RM := rm -rf OBJECT_DIRECTORY := build LISTING_DIRECTORY := build C_SOURCE_FILES += system_$(DEVICESERIES).c ASSEMBLER_SOURCE_FILES += gcc_startup_$(DEVICESERIES).s # Linker flags #LDFLAGS += -L"$(GNU_INSTALL_ROOT)/arm-none-eabi/lib/armv6-m" #LDFLAGS += -L"$(GNU_INSTALL_ROOT)/lib/gcc/arm-none-eabi/$(GNU_VERSION)/armv6-m" LDFLAGS += -Xlinker -Map=$(LISTING_DIRECTORY)/$(OUTPUT_FILENAME).map LDFLAGS += -mcpu=$(CPU) -mthumb -mabi=aapcs -L$(SDK_PATH)/components/toolchain/gcc -T$(LINKER_SCRIPT) # Compiler flags CFLAGS += -mcpu=$(CPU) -mthumb -mabi=aapcs -D$(DEVICE) -D$(BOARD) -D$(TARGET_CHIP) --std=gnu99 CFLAGS += -Wall CFLAGS += -mfloat-abi=soft # Assembler flags ASMFLAGS += -x assembler-with-cpp # TODO: should probably be called SDK_INCLUDES as they are all relative to the SDK INCLUDES += components/ble/ble_db_discovery INCLUDES += components/ble/ble_debug_assert_handler INCLUDES += components/ble/ble_dtm INCLUDES += components/ble/ble_error_log INCLUDES += components/ble/ble_racp INCLUDES += components/ble/ble_radio_notification INCLUDES += components/ble/ble_services/ble_ans_c INCLUDES += components/ble/ble_services/ble_bas INCLUDES += components/ble/ble_services/ble_bas_c INCLUDES += components/ble/ble_services/ble_bps INCLUDES += components/ble/ble_services/ble_cgm INCLUDES += components/ble/ble_services/ble_cscs INCLUDES += components/ble/ble_services/ble_dfu INCLUDES += components/ble/ble_services/ble_dis INCLUDES += components/ble/ble_services/ble_gls INCLUDES += components/ble/ble_services/ble_hids INCLUDES += components/ble/ble_services/ble_hrs INCLUDES += components/ble/ble_services/ble_hrs_c INCLUDES += components/ble/ble_services/ble_hts INCLUDES += components/ble/ble_services/ble_ias INCLUDES += components/ble/ble_services/ble_ias_c INCLUDES += components/ble/ble_services/ble_lls INCLUDES += components/ble/ble_services/ble_rscs INCLUDES += components/ble/ble_services/ble_sps INCLUDES += components/ble/ble_services/ble_tps INCLUDES += components/ble/common INCLUDES += components/ble/device_manager INCLUDES += components/ble/device_manager/config INCLUDES += components/drivers_ext/adns2080 INCLUDES += components/drivers_ext/cherry8x16 INCLUDES += components/drivers_ext/ds1624 INCLUDES += components/drivers_ext/mpu6050 INCLUDES += components/drivers_ext/nrf6350 INCLUDES += components/drivers_ext/synaptics_touchpad INCLUDES += components/drivers_nrf/ble_flash INCLUDES += components/drivers_nrf/hal INCLUDES += components/drivers_nrf/pstorage INCLUDES += components/drivers_nrf/pstorage/config INCLUDES += components/drivers_nrf/radio_config INCLUDES += components/drivers_nrf/sdio INCLUDES += components/drivers_nrf/sdio/config INCLUDES += components/drivers_nrf/simple_uart INCLUDES += components/drivers_nrf/spi_master INCLUDES += components/drivers_nrf/spi_slave INCLUDES += components/drivers_nrf/twi_master INCLUDES += components/drivers_nrf/twi_master/config INCLUDES += components/drivers_nrf/uart INCLUDES += components/libraries/ant_fs INCLUDES += components/libraries/bootloader_dfu INCLUDES += components/libraries/bootloader_dfu INCLUDES += components/libraries/bootloader_dfu INCLUDES += components/libraries/bootloader_dfu/ble_transport INCLUDES += components/libraries/bootloader_dfu/experimental INCLUDES += components/libraries/bootloader_dfu/hci_transport INCLUDES += components/libraries/button INCLUDES += components/libraries/console INCLUDES += components/libraries/crc16 INCLUDES += components/libraries/fifo INCLUDES += components/libraries/gpiote INCLUDES += components/libraries/hci INCLUDES += components/libraries/hci/config INCLUDES += components/libraries/scheduler INCLUDES += components/libraries/sensorsim INCLUDES += components/libraries/timer INCLUDES += components/libraries/trace INCLUDES += components/libraries/util INCLUDES += components/properitary_rf/esb INCLUDES += components/properitary_rf/gzll INCLUDES += components/properitary_rf/gzll/config INCLUDES += components/toolchain INCLUDES += components/toolchain/arm INCLUDES += components/toolchain/gcc INCLUDES += components/serialization/application/codecs/common INCLUDES += components/serialization/application/hal INCLUDES += components/serialization/application/transport INCLUDES += components/serialization/common INCLUDES += components/serialization/common/transport INCLUDES += components/serialization/common/transport/debug INCLUDES += components/serialization/common/transport INCLUDES += components/serialization/common/transport/ser_phy/config INCLUDES += components/serialization/common/transport/ser_phy INCLUDES += components/serialization/common INCLUDES += components/serialization/connectivity INCLUDES += components/serialization/connectivity/codecs/common INCLUDES += components/serialization/connectivity/hal INCLUDES += components/serialization/connectivity INCLUDES += components/softdevice/common/softdevice_handler # Softdevice-specific includes ifeq ($(USE_SOFTDEVICE), S110) INCLUDES += components/serialization/application/codecs/s110/serializers INCLUDES += components/serialization/common/struct_ser/s110 INCLUDES += components/serialization/connectivity/codecs/s110/middleware INCLUDES += components/serialization/connectivity/codecs/s110/serializers INCLUDES += components/softdevice/s110/headers else ifeq ($(USE_SOFTDEVICE),S110-v6) INCLUDES += components/softdevice/s110/headers else ifeq ($(USE_SOFTDEVICE), S120) INCLUDES += components/serialization/application/codecs/s120/serializers INCLUDES += components/serialization/common/struct_ser/s120 INCLUDES += components/serialization/connectivity/codecs/s120/middleware INCLUDES += components/serialization/connectivity/codecs/s120/serializers INCLUDES += components/softdevice/s120/headers else ifeq ($(USE_SOFTDEVICE),S130) INCLUDES += components/softdevice/s130/headers else ifeq ($(USE_SOFTDEVICE),S310) INCLUDES += components/softdevice/s310/headers else ifeq ($(USE_SOFTDEVICE),S1xx_iot) INCLUDES += components/ble/ble_6lowpan INCLUDES += components/ble/ble_services/ble_ipsp INCLUDES += components/iot/coap INCLUDES += components/iot/context_manager INCLUDES += components/iot/include INCLUDES += components/iot/ipv6_stack/icmp6 INCLUDES += components/iot/ipv6_stack/include INCLUDES += components/iot/ipv6_stack/ipv6 INCLUDES += components/iot/ipv6_stack/pbuffer INCLUDES += components/iot/ipv6_stack/udp INCLUDES += components/iot/ipv6_stack/utils INCLUDES += components/libraries/mem_manager INCLUDES += components/softdevice/s1xx_iot/headers else ifeq ($(USE_SOFTDEVICE),NO) INCLUDES += components/drivers_nrf/nrf_soc_nosd endif INCLUDES += examples/bsp #INCLUDEPATHS += -I./src #INCLUDEPATHS += "-I$(SDK_PATH)" INCLUDEPATHS += $(addprefix -I$(SDK_PATH)/,$(INCLUDES)) # Sorting removes duplicates BUILD_DIRECTORIES := $(sort $(OBJECT_DIRECTORY) $(OUTPUT_BINARY_DIRECTORY) $(LISTING_DIRECTORY) ) #################################################################### # Rules # #################################################################### C_SOURCE_FILENAMES = $(notdir $(C_SOURCE_FILES) ) ASSEMBLER_SOURCE_FILENAMES = $(notdir $(ASSEMBLER_SOURCE_FILES) ) # Make a list of source paths C_SOURCE_PATHS += $(SDK_SOURCE_PATH) C_SOURCE_PATHS += $(TEMPLATE_PATH) C_SOURCE_PATHS += $(wildcard $(SDK_SOURCE_PATH)/*/) C_SOURCE_PATHS += $(wildcard $(SDK_SOURCE_PATH)/ext_sensors/*/) C_SOURCE_PATHS += $(wildcard $(SDK_SOURCE_PATH)/ble/*/) C_SOURCE_PATHS += $(wildcard $(SDK_SOURCE_PATH)/ble/ble_services/*/) C_SOURCE_PATHS += $(wildcard $(SDK_SOURCE_PATH)/drivers_nrf/*/) C_SOURCE_PATHS += $(wildcard $(SDK_SOURCE_PATH)/libraries/*/) C_SOURCE_PATHS += $(wildcard $(SDK_SOURCE_PATH)/iot/*) C_SOURCE_PATHS += $(wildcard $(SDK_SOURCE_PATH)/iot/ipv6_stack/*) C_SOURCE_PATHS += $(SDK_PATH)/examples/bsp C_SOURCE_PATHS += $(SDK_PATH)/components/softdevice/common/softdevice_handler C_SOURCE_PATHS += $(BUILD_SCRIPTS_PATH) C_SOURCE_PATHS += src ASSEMBLER_SOURCE_PATHS += $(SDK_SOURCE_PATH) ASSEMBLER_SOURCE_PATHS += $(TEMPLATE_PATH) ASSEMBLER_SOURCE_PATHS += $(wildcard $(SDK_SOURCE_PATH)/*/) ASSEMBLER_SOURCE_PATHS += $(BUILD_SCRIPTS_PATH) C_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILENAMES:.c=.o) ) ASSEMBLER_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(ASSEMBLER_SOURCE_FILENAMES:.s=.o) ) # Set source lookup paths vpath %.c $(C_SOURCE_PATHS) vpath %.s $(ASSEMBLER_SOURCE_PATHS) # Include automatically previously generated dependencies -include $(C_OBJECTS:.o=.d) ### Targets # debug: OUTPUT_FILENAME:=$(OUTPUT_FILENAME)-debug debug: CFLAGS += -DDEBUG -g3 -O0 debug: ASMFLAGS += -DDEBUG -g3 -O0 debug: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex .PHONY: release # release: OUTPUT_FILENAME:=$(OUTPUT_FILENAME)-release release: CFLAGS += -DNDEBUG -O3 release: ASMFLAGS += -DNDEBUG -O3 release: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex echostuff: @echo "CPU: $(CPU)" @echo "DEVICE: $(DEVICE)" @echo "BOARD: $(BOARD)" @echo "TARGET_CHIP: $(TARGET_CHIP)" @echo "STARTADDRESS: $(STARTADDRESS)" @echo CFLAGS: @$(foreach X,$(CFLAGS), echo " $(X)";) @echo LDFLAGS: @$(foreach X,$(LDFLAGS), echo " $(X)";) @echo C_OBJECTS: @$(foreach X,$(C_OBJECTS), echo " $(X)";) @echo C_SOURCE_FILES: @$(foreach X,$(C_SOURCE_FILES), echo " $(X)";) @echo C_SOURCE_PATHS: @$(foreach X,$(C_SOURCE_PATHS), echo " $(X)";) @echo INCLUDEPATHS: @$(foreach X,$(INCLUDEPATHS), echo " $(X)";) ## Create build directories $(BUILD_DIRECTORIES): $(MK) $@ ## Create objects from C source files $(OBJECT_DIRECTORY)/%.o: %.c | $(BUILD_DIRECTORIES) # Build header dependencies @$(CC) $(CFLAGS) $(INCLUDEPATHS) -M $< -MF "$(@:.o=.d)" -MT $@ # Do the actual compilation @echo CC $@ @$(CC) $(CFLAGS) $(INCLUDEPATHS) -g -c -o $@ $< ## Assemble .s files $(OBJECT_DIRECTORY)/%.o: %.s @echo AS $@ @$(CC) $(ASMFLAGS) $(INCLUDEPATHS) -c -o $@ $< ## Link C and assembler objects to an .out file $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out: $(C_OBJECTS) $(ASSEMBLER_OBJECTS) $(LIBRARIES) | $(BUILD_DIRECTORIES) @echo LD $@ $(CC) $(LDFLAGS) -o $@ $^ ## Create binary .bin file from the .out file $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OBJCOPY) -O binary $< $@ ## Create binary .hex file from the .out file $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OBJCOPY) -O ihex $< $@ ## Default build target .PHONY: all all: debug $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).dump clean: $(RM) $(OUTPUT_BINARY_DIRECTORY) %.dump: %.out $(OBJDUMP) -d $< > $@ # Create binary file from the softdevice 7 hex file $(OUTPUT_BINARY_DIRECTORY)/softdevice.bin: $(BUILD_DIRECTORIES) $(OBJCOPY) -I ihex -O binary $(SOFTDEVICE_HEX_PATH) $(OUTPUT_BINARY_DIRECTORY)/softdevice.bin # Create IUCR binary file from the softdevice 6 UICR hex file $(OUTPUT_BINARY_DIRECTORY)/softdevice_uicr.bin: $(SOFTDEVICE_HEX_PATH) $(BUILD_DIRECTORIES) $(OBJCOPY) -Iihex -Obinary --only-section .sec3 $< $@ # Create binary file from the softdevice 6 hex file $(OUTPUT_BINARY_DIRECTORY)/softdevice_main.bin: $(SOFTDEVICE_HEX_PATH) $(BUILD_DIRECTORIES) $(OBJCOPY) -Iihex -Obinary --remove-section .sec3 $< $@ #OpenOCD Flasher Scripts ifeq ($(FLASHER), OpenOCD) flash: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin $(OPENOCD) -c "program $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin $(STARTADDRESS) verify" ifeq ($(USE_SOFTDEVICE), S110-v6) flash_softdevice: $(OUTPUT_BINARY_DIRECTORY)/softdevice_main.bin $(OUTPUT_BINARY_DIRECTORY)/softdevice_uicr.bin $(OPENOCD) -c "init ; reset halt ; nrf51 mass_erase ; sleep 500 ; flash write_image $(OUTPUT_BINARY_DIRECTORY)/softdevice_uicr.bin 0x10001000 ; verify_image $(OUTPUT_BINARY_DIRECTORY)/softdevice_uicr.bin 0x10001000 ; flash write_image $(OUTPUT_BINARY_DIRECTORY)/softdevice_main.bin 0x0 ; verify_image $(OUTPUT_BINARY_DIRECTORY)/softdevice_main.bin 0; shutdown" else flash_softdevice: $(OUTPUT_BINARY_DIRECTORY)/softdevice.bin $(OPENOCD) -c "init ; reset halt ; nrf51 mass_erase ; sleep 500 ; flash write_image $(OUTPUT_BINARY_DIRECTORY)/softdevice.bin 0x0 ; verify_image $(OUTPUT_BINARY_DIRECTORY)/softdevice.bin 0x0 ; mww 0x4001e504 1 ; mww 0x10001000 $(STARTADDRESS) ; mww 0x4001e504 0 ; shutdown" endif erase_all: $(OPENOCD) -c "init ; reset halt ; nrf51 mass_erase ; shutdown" pinreset: $(OPENOCD) -c "init ; reset halt ; mww 0x4001e504 2 ; mww 0x40000544 1 ; reset ; shutdown" gdbserver: $(OPENOCD) GDB_COMMAND_SCRIPT=$(OUTPUT_BINARY_DIRECTORY)/gdbinit $(GDB_COMMAND_SCRIPT): debug echo -e -n "target remote localhost:3333 \n\ monitor reset halt \n\ file $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out \n\ load \n\ b main \n\ b app_error_handler \n\ monitor reset \n\ continue" > $(GDB_COMMAND_SCRIPT) #JLink Flasher Scripts else $(OUTPUT_BINARY_DIRECTORY)/erase_all.jlink : $(BUILD_DIRECTORIES) @echo "\ r \n\ h \n\ w4 0x4001e504,2 # enable erase all \n\ w4 0x4001e50c,1 # start erasing \n\ sleep 1000 \n\ w4 0x4001e514,1 # start erasing UICR \n\ sleep 500 \n\ r \n\ q \n\ " \ > $@ erase_all: $(OUTPUT_BINARY_DIRECTORY)/erase_all.jlink $(JLINK) -CommanderScript $(OUTPUT_BINARY_DIRECTORY)/erase_all.jlink; [ "$$?" -eq $(JLINK_OUTPUT) ] $(OUTPUT_BINARY_DIRECTORY)/flash_softdevice.jlink: $(BUILD_DIRECTORIES) @echo " \n\ r \n\ h \n\ w4 0x4001e504,2 # enable erase \n\ w4 0x4001e50c,1 # start erasing all \n\ sleep 1000 \n\ w4 0x4001e514,1 # start erasing UICR \n\ sleep 500 \n\ w4 0x10001000, $(STARTADDRESS) # write code region size \n\ sleep 1000 \n\ w4 0x4001e504,1 \n\ sleep 1000 \n\ loadbin \"$(OUTPUT_BINARY_DIRECTORY)/softdevice.bin\", 0x0 \n\ verifybin \"$(OUTPUT_BINARY_DIRECTORY)/softdevice.bin\", 0x0 \n\ r \n\ qc \n\ " > $(OUTPUT_BINARY_DIRECTORY)/flash_softdevice.jlink flash_softdevice: $(OUTPUT_BINARY_DIRECTORY)/flash_softdevice.jlink $(OUTPUT_BINARY_DIRECTORY)/softdevice.bin $(JLINK) -CommanderScript $(OUTPUT_BINARY_DIRECTORY)/flash_softdevice.jlink; [ "$$?" -eq $(JLINK_OUTPUT) ] $(OUTPUT_BINARY_DIRECTORY)/flash2.jlink: $(BUILD_DIRECTORIES) $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin @echo " \n\ r \n\ h \n\ w4 0x4001e504,2 # enable erase \n\ " > $@ set -e; \ binsize=`$(STAT_SIZE) $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin`; \ starthexaddr=$(STARTADDRESS); \ startaddr=`printf "%d" $$starthexaddr`; \ page=0; \ while [ $$binsize -gt 0 ]; \ do \ echo "w4 0x4001e508, $$starthexaddr # start erasing code region 1 page $$page" >> $@ ; \ binsize=`expr $$binsize - 1024`; \ page=`expr $$page + 1`; \ startaddr=`expr $$startaddr + 1024`; \ starthexaddr=`printf "0x%x" $$startaddr`; \ done echo "sleep 1000 \n\ r \n\ w4 0x4001e504,1 # enable write \n\ loadbin \"$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin\", $(STARTADDRESS)\n\ verifybin \"$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin\", $(STARTADDRESS)\n\ r \n\ g \n\ qc \n\ " >> $@ $(OUTPUT_BINARY_DIRECTORY)/flash.jlink: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin | $(BUILD_DIRECTORIES) echo "w4 0x4001e504,1 # enable write \n\ loadbin \"$<\", $(STARTADDRESS)\n\ verifybin \"$<\", $(STARTADDRESS)\n\ r \n\ g \n\ qc \n\ " >> $@ flash: $(OUTPUT_BINARY_DIRECTORY)/flash.jlink $(JLINK) -CommanderScript $(OUTPUT_BINARY_DIRECTORY)/flash.jlink; [ "$$?" -eq $(JLINK_OUTPUT) ] $(OUTPUT_BINARY_DIRECTORY)/pinreset.jlink: $(BUILD_DIRECTORIES) @echo "\n\ r \n\ h \n\ w4 4001e504 2 \n\ w4 40000544 1 \n\ r \n\ qc \n\ " > $@ pin-reset: $(OUTPUT_BINARY_DIRECTORY)/pinreset.jlink $(JLINK) -CommanderScript $(OUTPUT_BINARY_DIRECTORY)/pinreset.jlink; [ "$$?" -eq $(JLINK_OUTPUT) ] START_GDB_SERVER_SCRIPT=$(OUTPUT_BINARY_DIRECTORY)/start_gdbserver.sh $(START_GDB_SERVER_SCRIPT): $(BUILD_DIRECTORIES) echo "JLinkGDBServer -if swd -device nrf51822 -LocalHostOnly" > $(START_GDB_SERVER_SCRIPT) gdbserver: $(START_GDB_SERVER_SCRIPT) /bin/sh $(START_GDB_SERVER_SCRIPT) GDB_COMMAND_SCRIPT=$(OUTPUT_BINARY_DIRECTORY)/gdbinit $(GDB_COMMAND_SCRIPT): debug @echo " \n\ target remote localhost:2331 \n\ mon flash breakpoints = 1 \n\ monitor reset \n\ file $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out \n\ load \n\ b main \n\ b app_error_handler \n\ monitor reset \n\ continue" > $@ .PHONY: jlink jlink: $(JLINK) #end of FLASHER selection endif gdb: $(GDB_COMMAND_SCRIPT) debug $(GDB) -x $(GDB_COMMAND_SCRIPT) serial: screen /dev/ttyUSB1cu.usbmodem1411 38400