circuitpython/nrf52/Makefile

142 lines
3.1 KiB
Makefile

include ../py/mkenv.mk
CROSS_COMPILE ?= arm-none-eabi-
BTYPE ?= debug
ifeq (${BTYPE}, release)
DEFINES += NDEBUG
CFLAGS += -Os
# CFLAGS += -flto
else
ifeq (${BTYPE}, debug)
DEBUG := 1
DEFINES += DEBUG
CFLAGS += -Og -g
else
$(error Invalid BTYPE specified)
endif
endif
BOARD ?= PCA10040
BUILD = build/${BOARD}/${BTYPE}
LINKER_PATH = .
LINKER_SCRIPT = gcc_nrf52_s132.ld
# don't set PROG as it's used by mkrules.mk
PROGRAM ?= ${BUILD}/firmware
# qstr definitions (must come before including py.mk)
QSTR_DEFS = qstrdefsport.h
# include py core make definitions
include ../py/py.mk
ifeq ($(wildcard boards/${BOARD}/.),)
$(error Invalid BOARD specified)
else
# include board makefile (if any)
-include boards/${BOARD}/build.mk
endif
# include nordic makefile
include nordic/build.mk
SRC_C += \
main.c \
mp_functions.c \
nrf52_app_error.c \
nrf52_ble.c \
lib/mp-readline/readline.c \
lib/utils/pyexec.c \
lib/utils/stdout_helpers.c
# XXX I simply copied gcc_startup_nrf52.s to .S so mkrules can compile it
OBJ += $(PY_O) $(addprefix ${BUILD}/, $(SRC_C:.c=.o))
INC += -I.
INC += -I..
INC += -I${BUILD}
INC += -Iboards/${BOARD}
INC += -I../lib/mp-readline
# transform all DEFINES entry in -DDEFINE c flags
CFLAGS += $(patsubst %,-D%,${DEFINES})
CFLAGS += ${INC}
CFLAGS += -Wall -Werror -std=gnu99
CFLAGS += -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mabi=aapcs -fsingle-precision-constant
CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing
CFLAGS += -fno-builtin --short-enums
LDFLAGS += -Wl,-Map=${PROGRAM}.map
LDFLAGS += -mthumb -mabi=aapcs -L${LINKER_PATH} -T${LINKER_SCRIPT}
LDFLAGS += -mcpu=cortex-m4
LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
LDFLAGS += -Wl,--gc-sections
LDFLAGS += --specs=nano.specs -lc -lnosys
# mkenv doesn't set these
OBJDUMP = $(CROSS_COMPILE)objdump
GDB = $(CROSS_COMPILE)gdb
all: ${PROGRAM}.hex ${PROGRAM}.bin
.PHONY: all
${PROGRAM}.elf: ${OBJ}
$(ECHO) "LINK $@"
${Q}${CC} -o $@ ${CFLAGS} ${LDFLAGS} $^ ${LDLIBS}
ifndef DEBUG
${Q}$(STRIP) $(STRIPFLAGS_EXTRA) $@
endif
${Q}$(SIZE) $@
%.hex: %.elf
${Q}${OBJCOPY} -O ihex $< $@
%.bin: %.elf
${Q}${OBJCOPY} -O binary $< $@
%.jlink: %.hex
${OBJDUMP} -h $< | \
awk '$$1 ~ /^[0-9]+$$/ {addr="0x"$$5; if (!min || addr < min) min = addr} END { printf "\
loadbin %s,%s\n\
sleep 100\n\
r\n\
g\n\
exit\n", f, min}' f="$<" > $@
%-all.jlink: %.jlink ${SOFTDEV_HEX}
@[ -e "${SOFTDEV_HEX}" ] || echo "cannot find softdevice hex image '${SOFTDEV_HEX}'" >&2
# w4 0x4001e504, 0x2 -> enable erase: CONFIG.WEN = EEN
# w4 0x4001e50c, 0x1 -> erase all: ERASEALL = 1
printf "\
device nrf52\n\
halt\n\
w4 0x4001e504, 0x2\n\
w4 0x4001e50c, 0x1\n\
sleep 100\n\
r\n\
loadbin %s,0\n" ${SOFTDEV_HEX} > $@
cat $< >> $@
flash: ${PROGRAM}.hex ${PROGRAM}.jlink
JLinkExe -device nrf52 -if SWD ${PROGRAM}.jlink
.PHONY: flash
flash-all: ${PROGRAM}.hex ${PROGRAM}-all.jlink
JLinkExe -device nrf52 -if SWD ${PROGRAM}-all.jlink
.PHONY: flash-all
gdbserver: ${PROGRAM}.elf
JLinkGDBServer -device nrf52 -if SWD
.PHONY: gdbserver
gdb: ${PROGRAM}.elf
${GDB} ${PROGRAM}.elf -ex 'target remote :2331'
.PHONY: gdb
include ../py/mkrules.mk