PROG=main

DEFINES =

#if not defined then we use a timer
#DEFINES += -DBOOTLOADER_BUTTON=BSP_BUTTON_1


DEFINES += -DSWI_DISABLE0
#DEFINES += -DBOARD_PCA10028
DEFINES += -DBOARD_BLE400
DEFINES += -DSOFTDEVICE_PRESENT
DEFINES += -DNRF51
DEFINES += -D__HEAP_SIZE=0
DEFINES += -DS130
DEFINES += -DBLE_STACK_SUPPORT_REQD
DEFINES += -DBSP_DEFINES_ONLY

CFLAGS=-Os -g
LDFLAGS=
ASFLAGS=
INCLUDES=

SDK=sdk-9.0.0

BDADDR=FD:F9:62:4A:8A:C8


SDKCSRCS= \
	ble/ble_services/ble_dfu/ble_dfu.c \
	ble/common/ble_advdata.c \
	ble/common/ble_conn_params.c \
	ble/common/ble_srv_common.c \
	drivers_nrf/hal/nrf_delay.c \
	drivers_nrf/pstorage/pstorage_raw.c \
	libraries/crc16/crc16.c \
	libraries/bootloader_dfu/bootloader.c \
	libraries/bootloader_dfu/bootloader_settings.c \
	libraries/bootloader_dfu/bootloader_util.c \
	libraries/bootloader_dfu/dfu_init_template.c \
	libraries/bootloader_dfu/dfu_single_bank.c \
	libraries/bootloader_dfu/dfu_transport_ble.c \
	libraries/hci/hci_mem_pool.c \
	libraries/scheduler/app_scheduler.c \
	libraries/timer/app_timer.c \
	libraries/timer/app_timer_appsh.c \
	libraries/util/app_error.c \
	libraries/util/nrf_assert.c \
	softdevice/common/softdevice_handler/softdevice_handler.c \
	softdevice/common/softdevice_handler/softdevice_handler_appsh.c \
	toolchain/system_nrf51.c 

SDKSSRCS  = toolchain/gcc/gcc_startup_nrf51.s


CSRCS = \
	dfu_ble_svc.c \
	main.c  \


SOFTDEVICE=${SDK}/sdk/softdevice/s130/hex/s130_softdevice.hex

APP_VERSION=0xFFFFFFFF
DEV_REVISION=0xFFFF
DEV_TYPE=0xFFFF
SD_REQ=0xFFFE


LINKER_SCRIPT=dfu_gcc_nrf51.ld 

INCLUDES += -Isdk-config -I${SDK} -I.

OOCD=openocd
OOCD_CFG=openocd.cfg


CROSS=arm-none-eabi-
CC       		:= $(CROSS)gcc
AS       		:= $(CROSS)as
AR       		:= $(CROSS)ar
LD       		:= $(CROSS)ld
NM       		:= $(CROSS)nm
OBJDUMP  		:= $(CROSS)objdump
OBJCOPY  		:= $(CROSS)objcopy
SIZE    		:= $(CROSS)size
GDB	    		:= $(CROSS)gdb
NRFUTIL			:= nrfutil
NRFDFU			:= nrfdfu


CFLAGS += -mcpu=cortex-m0
CFLAGS += -mthumb -mabi=aapcs --std=gnu99
CFLAGS += -Wall -Werror -Os
CFLAGS += -mfloat-abi=soft
# keep every function in separate section. This will allow linker to dump unused functions
CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing
CFLAGS += -fno-builtin --short-enums

# keep every function in separate section. This will allow linker to dump unused functions
LDFLAGS += -Xlinker -Map=$(PROG).map
LDFLAGS += -mthumb -mabi=aapcs -L${SDK} -T$(LINKER_SCRIPT)
LDFLAGS += -mcpu=cortex-m0
# let linker to dump unused sections
LDFLAGS += -Wl,--gc-sections
# use newlib in nano version
#LDFLAGS += --specs=nano.specs -lc -lnosys
LIBS += -lc -lnosys

# Assembler flags
ASFLAGS += -x assembler-with-cpp

CPPFLAGS=$(DEFINES) $(INCLUDES)


OBJS=${CSRCS:%.c=%.o} ${SDKCSRCS:%.c=${SDK}/sdk/%.o} ${SDKSSRCS:%.s=${SDK}/sdk/%.o}

default: ${PROG}.bin ${PROG}.hex 

clean:
	/bin/rm -f ${OBJS} ${PROG} ${PROG}.bin ${PROG}.hex

${PROG}:${OBJS}
	$(CC) $(LDFLAGS) $(CFLAGS) $(OBJS) $(LIBS) -o $@
	$(SIZE) $@

%.bin:%
	$(OBJCOPY) -O binary $< $@
%.hex:%
	$(OBJCOPY) -O ihex $< $@


twongle.o:twongle.c
	$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

%.o:%.c
	$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
	
%.o:%.s
	$(CC) $(CPPFLAGS) $(ASFLAGS) -c -o $@ $<


flash: ${PROG}.hex
	${OOCD} -f ${OOCD_CFG} \
		-c "init" -c "reset init" \
		-c "flash write_image erase $<" \
		-c "reset" \
		-c "shutdown"



flash_softdevice: ${SOFTDEVICE}
	${OOCD} -f ${OOCD_CFG} \
		-c "init" -c "reset init" \
		-c "nrf51 mass_erase"  \
		-c "flash write_image erase $<" \
		-c "reset" \
		-c "shutdown"

flashall: ${SOFTDEVICE} ${PROG}.hex
	${OOCD} -f ${OOCD_CFG} \
		-c "init" -c "reset init" \
		-c "nrf51 mass_erase"  \
		-c "flash write_image ${SOFTDEVICE}" \
		-c "flash write_image ${PROG}.hex" \
		-c "reset" \
		-c "shutdown"


ds:
	$(OOCD) -f $(OOCD_CFG)

debug: ${PROG}
	${GDB} -x gdb.script ${PROG}

reset:
	${OOCD} -f ${OOCD_CFG} \
		-c "init" \
		-c "reset init" \
		-c "reset" \
		-c "shutdown"

%.zip: %.hex
	${NRFUTIL} dfu genpkg  --dev-revision ${DEV_REVISION} --dev-type ${DEV_TYPE} --application-version ${APP_VERSION} --sd-req ${SD_REQ} --bootloader $<  $@

dfu: ${PROG}.zip
	${NRFDFU} -b ${BDADDR} -p ${PROG}.zip








#flash: $(MAKECMDGOALS)
#	@echo Flashing: $(OUTPUT_BINARY_DIRECTORY)/$<.hex
#	nrfjprog --reset --program $(OUTPUT_BINARY_DIRECTORY)/$<.hex
#
### Flash softdevice
#flash_softdevice: 
#	@echo Flashing: s130_softdevice.hex
#	nrfjprog --reset --program softdevice/s130/hex/s130_softdevice.hex