2016-11-16 15:38:25 -05:00
|
|
|
# Select the board to build for: if not given on the command line,
|
|
|
|
# then default to pca10040.
|
|
|
|
BOARD ?= pca10040
|
|
|
|
ifeq ($(wildcard boards/$(BOARD)/.),)
|
|
|
|
$(error Invalid BOARD specified)
|
|
|
|
endif
|
|
|
|
|
2016-12-13 14:27:26 -05:00
|
|
|
check_defined = \
|
|
|
|
$(strip $(foreach 1,$1, \
|
|
|
|
$(call __check_defined,$1,$(strip $(value 2)))))
|
|
|
|
__check_defined = \
|
|
|
|
$(if $(value $1),, \
|
|
|
|
$(error Undefined $1$(if $2, ($2))))
|
|
|
|
|
2016-11-16 15:38:25 -05:00
|
|
|
# If SoftDevice is selected, try to use that one.
|
2016-12-13 14:27:26 -05:00
|
|
|
SD ?=
|
2016-11-16 15:38:25 -05:00
|
|
|
SD_LOWER = $(shell echo $(SD) | tr '[:upper:]' '[:lower:]')
|
|
|
|
|
|
|
|
# TODO: Verify that it is a valid target.
|
|
|
|
|
|
|
|
|
2016-12-13 14:27:26 -05:00
|
|
|
ifeq ($(SD), )
|
2016-11-16 15:38:25 -05:00
|
|
|
# If the build directory is not given, make it reflect the board name.
|
|
|
|
BUILD ?= build-$(BOARD)
|
|
|
|
include ../py/mkenv.mk
|
|
|
|
include boards/$(BOARD)/mpconfigboard.mk
|
|
|
|
else
|
2016-12-13 14:27:26 -05:00
|
|
|
$(call check_defined, SDK_ROOT, path to SDK containing softdevice)
|
2016-11-16 15:38:25 -05:00
|
|
|
# If the build directory is not given, make it reflect the board name.
|
|
|
|
BUILD ?= build-$(BOARD)-$(SD_LOWER)
|
|
|
|
include ../py/mkenv.mk
|
|
|
|
include boards/$(BOARD)/mpconfigboard_$(SD_LOWER).mk
|
2016-12-13 14:27:26 -05:00
|
|
|
|
2017-03-04 11:58:31 -05:00
|
|
|
include bluetooth/bluetooth_common.mk
|
2016-11-16 15:38:25 -05:00
|
|
|
endif
|
|
|
|
|
|
|
|
# qstr definitions (must come before including py.mk)
|
2016-12-13 14:27:26 -05:00
|
|
|
QSTR_DEFS = qstrdefsport.h $(BUILD)/pins_qstr.h
|
|
|
|
|
2017-02-25 19:30:33 -05:00
|
|
|
FROZEN_MPY_DIR = freeze
|
2016-11-16 15:38:25 -05:00
|
|
|
|
|
|
|
# include py core make definitions
|
|
|
|
include ../py/py.mk
|
|
|
|
|
2016-12-13 14:27:26 -05:00
|
|
|
|
2017-02-07 17:30:12 -05:00
|
|
|
FATFS_DIR = lib/oofatfs
|
2016-12-13 14:27:26 -05:00
|
|
|
MPY_CROSS = ../mpy-cross/mpy-cross
|
|
|
|
MPY_TOOL = ../tools/mpy-tool.py
|
|
|
|
|
2016-11-16 15:38:25 -05:00
|
|
|
CROSS_COMPILE = arm-none-eabi-
|
|
|
|
|
2016-12-13 14:27:26 -05:00
|
|
|
MCU_VARIANT_UPPER = $(shell echo $(MCU_VARIANT) | tr '[:lower:]' '[:upper:]')
|
2016-11-16 15:38:25 -05:00
|
|
|
|
2016-12-13 14:27:26 -05:00
|
|
|
INC += -I.
|
2016-11-16 15:38:25 -05:00
|
|
|
INC += -I..
|
|
|
|
INC += -I$(BUILD)
|
|
|
|
INC += -I./device
|
|
|
|
INC += -I./../lib/cmsis/inc
|
|
|
|
INC += -I./device
|
2016-12-13 14:27:26 -05:00
|
|
|
INC += -I./device/$(MCU_VARIANT)
|
2016-11-16 15:38:25 -05:00
|
|
|
INC += -I./hal
|
2016-12-13 14:27:26 -05:00
|
|
|
INC += -I./hal/$(MCU_VARIANT)
|
2017-02-04 17:51:11 -05:00
|
|
|
INC += -I./modules/display
|
2017-02-04 17:56:42 -05:00
|
|
|
INC += -I./modules/machine
|
2017-02-05 14:19:52 -05:00
|
|
|
INC += -I./modules/network
|
2017-02-10 15:03:30 -05:00
|
|
|
INC += -I./modules/ubluepy
|
2016-11-16 15:38:25 -05:00
|
|
|
INC += -I../lib/mp-readline
|
|
|
|
|
2017-01-08 09:15:36 -05:00
|
|
|
NRF_DEFINES += -D$(MCU_VARIANT_UPPER)
|
2016-11-16 15:38:25 -05:00
|
|
|
NRF_DEFINES += -DCONFIG_GPIO_AS_PINRESET
|
|
|
|
|
|
|
|
CFLAGS_CORTEX_M = -mthumb -mabi=aapcs -fsingle-precision-constant -Wdouble-promotion
|
|
|
|
|
2016-12-13 14:27:26 -05:00
|
|
|
CFLAGS_MCU_m4 = $(CFLAGS_CORTEX_M) -mtune=cortex-m4 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections
|
2016-11-16 15:38:25 -05:00
|
|
|
|
|
|
|
CFLAGS_MCU_m0 = $(CFLAGS_CORTEX_M) --short-enums -mtune=cortex-m0 -mcpu=cortex-m0 -mfloat-abi=soft -fno-builtin
|
|
|
|
|
2016-12-13 14:27:26 -05:00
|
|
|
|
2016-11-16 18:29:16 -05:00
|
|
|
CFLAGS += $(CFLAGS_MCU_$(MCU_SERIES))
|
2017-02-07 17:30:12 -05:00
|
|
|
CFLAGS += $(INC) -Wall -Werror -ansi -std=gnu99 -nostdlib $(COPT) $(NRF_DEFINES) $(CFLAGS_MOD)
|
2016-12-13 14:27:26 -05:00
|
|
|
CFLAGS += -fno-strict-aliasing
|
2016-11-16 15:38:25 -05:00
|
|
|
CFLAGS += -Iboards/$(BOARD)
|
2016-12-13 14:27:26 -05:00
|
|
|
CFLAGS += -DNRF5_HAL_H='<$(MCU_VARIANT)_hal.h>'
|
2016-11-16 15:38:25 -05:00
|
|
|
|
|
|
|
LDFLAGS = $(CFLAGS)
|
|
|
|
LDFLAGS += -Xlinker -Map=$(@:.elf=.map)
|
2016-12-13 14:27:26 -05:00
|
|
|
LDFLAGS += -mthumb -mabi=aapcs -T $(LD_FILE) -L boards/
|
2016-11-16 15:38:25 -05:00
|
|
|
|
|
|
|
#Debugging/Optimization
|
|
|
|
ifeq ($(DEBUG), 1)
|
2016-12-13 14:27:26 -05:00
|
|
|
#ASMFLAGS += -g -gtabs+
|
2016-11-16 15:38:25 -05:00
|
|
|
CFLAGS += -O0 -ggdb
|
|
|
|
LDFLAGS += -O0
|
|
|
|
else
|
|
|
|
CFLAGS += -Os -DNDEBUG
|
|
|
|
LDFLAGS += -Os
|
|
|
|
endif
|
|
|
|
|
2016-12-13 14:27:26 -05:00
|
|
|
LIBS += \
|
2016-11-16 15:38:25 -05:00
|
|
|
|
|
|
|
SRC_LIB = $(addprefix lib/,\
|
|
|
|
libc/string0.c \
|
|
|
|
mp-readline/readline.c \
|
|
|
|
utils/pyexec.c \
|
2016-12-13 14:27:26 -05:00
|
|
|
timeutils/timeutils.c \
|
2017-02-07 17:30:12 -05:00
|
|
|
oofatfs/ff.c \
|
|
|
|
oofatfs/option/unicode.c \
|
2016-12-13 14:27:26 -05:00
|
|
|
netutils/netutils.c \
|
|
|
|
)
|
|
|
|
|
|
|
|
SRC_HAL = $(addprefix hal/,\
|
|
|
|
hal_uart.c \
|
|
|
|
hal_uarte.c \
|
|
|
|
hal_spi.c \
|
|
|
|
hal_spie.c \
|
|
|
|
hal_time.c \
|
2016-12-25 12:12:51 -05:00
|
|
|
hal_rtc.c \
|
|
|
|
hal_timer.c \
|
2017-01-11 10:54:56 -05:00
|
|
|
hal_twi.c \
|
2017-01-11 11:04:53 -05:00
|
|
|
hal_adc.c \
|
|
|
|
hal_adce.c \
|
2017-02-23 16:38:08 -05:00
|
|
|
hal_temp.c \
|
2016-12-16 19:16:38 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
ifeq ($(MCU_VARIANT), nrf52)
|
|
|
|
SRC_HAL += $(addprefix hal/,\
|
2016-12-16 13:50:35 -05:00
|
|
|
hal_pwm.c \
|
2016-11-16 15:38:25 -05:00
|
|
|
)
|
2016-12-16 19:16:38 -05:00
|
|
|
endif
|
2016-11-16 15:38:25 -05:00
|
|
|
|
2016-11-16 17:39:40 -05:00
|
|
|
SRC_C += \
|
2016-11-16 15:38:25 -05:00
|
|
|
main.c \
|
|
|
|
mphalport.c \
|
|
|
|
help.c \
|
|
|
|
gccollect.c \
|
2016-12-13 14:27:26 -05:00
|
|
|
pin_named_pins.c \
|
|
|
|
fatfs_port.c \
|
|
|
|
|
2017-02-04 17:51:11 -05:00
|
|
|
DRIVERS_SRC_C += $(addprefix modules/,\
|
2017-01-04 11:13:19 -05:00
|
|
|
display/moddisplay.c \
|
2017-01-05 04:35:39 -05:00
|
|
|
display/epaper_sld00200p_obj.c \
|
|
|
|
display/epaper_sld00200p_driver.c \
|
2017-01-05 14:16:24 -05:00
|
|
|
display/lcd_ili9341_obj.c \
|
|
|
|
display/lcd_ili9341_driver.c \
|
2017-01-19 14:44:27 -05:00
|
|
|
display/lcd_ls0xxb7dxxx_obj.c \
|
|
|
|
display/lcd_ls0xxb7dxxx_driver.c \
|
2017-01-25 13:49:30 -05:00
|
|
|
display/lcd_ssd1289_obj.c \
|
|
|
|
display/lcd_ssd1289_driver.c \
|
2017-01-19 14:44:27 -05:00
|
|
|
display/oled_ssd1305_obj.c \
|
|
|
|
display/oled_ssd1305_driver.c \
|
2017-01-10 12:26:58 -05:00
|
|
|
display/oled_ssd1306_obj.c \
|
|
|
|
display/oled_ssd1306_driver.c \
|
2017-01-15 13:32:59 -05:00
|
|
|
display/framebuffer.c \
|
|
|
|
graphic/draw.c \
|
2017-02-04 17:56:42 -05:00
|
|
|
machine/modmachine.c \
|
2017-02-04 18:00:42 -05:00
|
|
|
machine/uart.c \
|
2017-02-04 18:03:49 -05:00
|
|
|
machine/spi.c \
|
2017-02-04 18:05:20 -05:00
|
|
|
machine/i2c.c \
|
2017-02-05 10:17:12 -05:00
|
|
|
machine/adc.c \
|
2017-02-05 13:56:24 -05:00
|
|
|
machine/pin.c \
|
2017-02-05 13:59:34 -05:00
|
|
|
machine/timer.c \
|
2017-02-05 14:01:15 -05:00
|
|
|
machine/rtc.c \
|
2017-02-05 14:03:52 -05:00
|
|
|
machine/pwm.c \
|
2017-02-05 14:06:24 -05:00
|
|
|
machine/led.c \
|
2017-02-23 16:38:08 -05:00
|
|
|
machine/temp.c \
|
2017-02-05 14:15:50 -05:00
|
|
|
usocket/modusocket.c \
|
2017-02-05 14:19:52 -05:00
|
|
|
network/modnetwork.c \
|
2017-02-05 14:25:27 -05:00
|
|
|
uos/moduos.c \
|
2017-02-05 14:28:26 -05:00
|
|
|
utime/modutime.c \
|
2017-02-05 14:30:58 -05:00
|
|
|
pyb/modpyb.c \
|
2017-02-07 18:05:37 -05:00
|
|
|
ubluepy/modubluepy.c \
|
|
|
|
ubluepy/ubluepy_peripheral.c \
|
|
|
|
ubluepy/ubluepy_service.c \
|
|
|
|
ubluepy/ubluepy_characteristic.c \
|
|
|
|
ubluepy/ubluepy_uuid.c \
|
2017-02-14 18:17:47 -05:00
|
|
|
ubluepy/ubluepy_delegate.c \
|
2017-02-17 18:11:10 -05:00
|
|
|
ubluepy/ubluepy_constants.c \
|
2017-02-18 16:49:50 -05:00
|
|
|
ubluepy/ubluepy_descriptor.c \
|
2017-03-12 09:21:27 -04:00
|
|
|
ubluepy/ubluepy_scanner.c \
|
|
|
|
ubluepy/ubluepy_scan_entry.c \
|
2017-01-04 11:13:19 -05:00
|
|
|
)
|
|
|
|
|
2016-12-13 14:27:26 -05:00
|
|
|
#ifeq ($(SD), )
|
|
|
|
|
|
|
|
SRC_C += \
|
2017-01-08 09:15:36 -05:00
|
|
|
device/$(MCU_VARIANT)/system_$(MCU_SUB_VARIANT).c \
|
2016-11-16 15:38:25 -05:00
|
|
|
|
|
|
|
SRC_S = \
|
2016-12-13 14:27:26 -05:00
|
|
|
device/$(MCU_VARIANT)/startup_$(MCU_VARIANT).s \
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
FROZEN_MPY_PY_FILES := $(shell find -L $(FROZEN_MPY_DIR) -type f -name '*.py')
|
|
|
|
FROZEN_MPY_MPY_FILES := $(addprefix $(BUILD)/,$(FROZEN_MPY_PY_FILES:.py=.mpy))
|
2016-11-16 15:38:25 -05:00
|
|
|
|
2016-12-13 14:27:26 -05:00
|
|
|
OBJ += $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(SRC_S:.s=.o))
|
2016-11-16 15:38:25 -05:00
|
|
|
OBJ += $(addprefix $(BUILD)/, $(SRC_LIB:.c=.o))
|
2016-12-13 14:27:26 -05:00
|
|
|
OBJ += $(addprefix $(BUILD)/, $(SRC_HAL:.c=.o))
|
2017-01-04 11:13:19 -05:00
|
|
|
OBJ += $(addprefix $(BUILD)/, $(DRIVERS_SRC_C:.c=.o))
|
2016-12-13 14:27:26 -05:00
|
|
|
OBJ += $(BUILD)/pins_gen.o
|
2016-11-16 15:38:25 -05:00
|
|
|
|
2016-12-13 14:27:26 -05:00
|
|
|
$(BUILD)/$(FATFS_DIR)/ff.o: COPT += -Os
|
|
|
|
$(filter $(PY_BUILD)/../extmod/vfs_fat_%.o, $(PY_O)): COPT += -Os
|
|
|
|
|
2017-02-25 19:52:46 -05:00
|
|
|
.phony: all flash sd binary hex
|
2016-11-16 15:38:25 -05:00
|
|
|
|
2017-02-25 19:52:46 -05:00
|
|
|
all: binary hex
|
|
|
|
|
|
|
|
OUTPUT_FILENAME = firmware
|
|
|
|
|
|
|
|
## Create binary .bin file from the .out file
|
|
|
|
binary: $(BUILD)/$(OUTPUT_FILENAME).bin
|
|
|
|
|
|
|
|
$(BUILD)/$(OUTPUT_FILENAME).bin: $(BUILD)/$(OUTPUT_FILENAME).elf
|
|
|
|
$(OBJCOPY) -O binary $< $@
|
|
|
|
|
|
|
|
## Create binary .hex file from the .out file
|
|
|
|
hex: $(BUILD)/$(OUTPUT_FILENAME).hex
|
|
|
|
|
|
|
|
$(BUILD)/$(OUTPUT_FILENAME).hex: $(BUILD)/$(OUTPUT_FILENAME).elf
|
|
|
|
$(OBJCOPY) -O ihex $< $@
|
2016-11-16 15:38:25 -05:00
|
|
|
|
2017-01-03 11:00:06 -05:00
|
|
|
FLASHER ?=
|
|
|
|
|
|
|
|
ifeq ($(FLASHER),)
|
|
|
|
|
2017-02-25 19:52:46 -05:00
|
|
|
flash: $(BUILD)/$(OUTPUT_FILENAME).hex
|
|
|
|
nrfjprog --program $< --sectorerase -f $(MCU_VARIANT)
|
2017-01-08 09:17:03 -05:00
|
|
|
nrfjprog --reset -f $(MCU_VARIANT)
|
2016-12-13 14:27:26 -05:00
|
|
|
|
2017-02-25 19:52:46 -05:00
|
|
|
sd: $(BUILD)/$(OUTPUT_FILENAME).hex
|
2016-12-13 14:27:26 -05:00
|
|
|
nrfjprog --eraseall -f $(MCU_VARIANT)
|
|
|
|
nrfjprog --program $(SOFTDEV_HEX) -f $(MCU_VARIANT)
|
2017-02-25 19:52:46 -05:00
|
|
|
nrfjprog --program $< --sectorerase -f $(MCU_VARIANT)
|
2017-01-08 09:17:03 -05:00
|
|
|
nrfjprog --reset -f $(MCU_VARIANT)
|
2016-11-16 15:38:25 -05:00
|
|
|
|
2017-01-03 11:00:06 -05:00
|
|
|
else ifeq ($(FLASHER), pyocd)
|
|
|
|
|
2017-02-25 19:52:46 -05:00
|
|
|
flash: $(BUILD)/$(OUTPUT_FILENAME).hex
|
|
|
|
pyocd-flashtool -t $(MCU_VARIANT) $<
|
2017-01-03 11:00:06 -05:00
|
|
|
|
2017-02-25 19:52:46 -05:00
|
|
|
sd: $(BUILD)/$(OUTPUT_FILENAME).hex
|
2017-02-16 17:18:07 -05:00
|
|
|
pyocd-flashtool -t $(MCU_VARIANT) --chip_erase
|
|
|
|
pyocd-flashtool -t $(MCU_VARIANT) $(SOFTDEV_HEX)
|
2017-02-25 19:52:46 -05:00
|
|
|
pyocd-flashtool -t $(MCU_VARIANT) $<
|
2017-02-16 17:18:07 -05:00
|
|
|
|
2017-01-03 11:00:06 -05:00
|
|
|
endif
|
|
|
|
|
2017-02-25 19:52:46 -05:00
|
|
|
$(BUILD)/$(OUTPUT_FILENAME).elf: $(OBJ)
|
2016-11-16 15:38:25 -05:00
|
|
|
$(ECHO) "LINK $@"
|
|
|
|
$(Q)$(CC) $(LDFLAGS) -o $@ $(OBJ) $(LIBS)
|
|
|
|
$(Q)$(SIZE) $@
|
|
|
|
|
2016-12-13 14:27:26 -05:00
|
|
|
# List of sources for qstr extraction
|
2017-01-04 11:13:19 -05:00
|
|
|
SRC_QSTR += $(SRC_C) $(SRC_MOD) $(SRC_LIB) $(DRIVERS_SRC_C)
|
2016-11-16 15:38:25 -05:00
|
|
|
|
2016-12-13 14:27:26 -05:00
|
|
|
# Append any auto-generated sources that are needed by sources listed in
|
|
|
|
# SRC_QSTR
|
|
|
|
SRC_QSTR_AUTO_DEPS +=
|
|
|
|
|
|
|
|
# Making OBJ use an order-only depenedency on the generated pins.h file
|
|
|
|
# has the side effect of making the pins.h file before we actually compile
|
|
|
|
# any of the objects. The normal dependency generation will deal with the
|
|
|
|
# case when pins.h is modified. But when it doesn't exist, we don't know
|
|
|
|
# which source files might need it.
|
|
|
|
$(OBJ): | $(HEADER_BUILD)/pins.h
|
|
|
|
|
|
|
|
# Use a pattern rule here so that make will only call make-pins.py once to make
|
|
|
|
# both pins_$(BOARD).c and pins.h
|
|
|
|
$(BUILD)/%_$(BOARD).c $(HEADER_BUILD)/%.h $(HEADER_BUILD)/%_af_const.h $(BUILD)/%_qstr.h: boards/$(BOARD)/%.csv $(MAKE_PINS) $(AF_FILE) $(PREFIX_FILE) | $(HEADER_BUILD)
|
|
|
|
$(ECHO) "Create $@"
|
|
|
|
$(Q)$(PYTHON) $(MAKE_PINS) --board $(BOARD_PINS) --af $(AF_FILE) --prefix $(PREFIX_FILE) --hdr $(GEN_PINS_HDR) --qstr $(GEN_PINS_QSTR) --af-const $(GEN_PINS_AF_CONST) --af-py $(GEN_PINS_AF_PY) > $(GEN_PINS_SRC)
|
|
|
|
|
|
|
|
$(BUILD)/pins_gen.o: $(BUILD)/pins_gen.c
|
|
|
|
$(call compile_c)
|
|
|
|
|
|
|
|
MAKE_PINS = boards/make-pins.py
|
|
|
|
BOARD_PINS = boards/$(BOARD)/pins.csv
|
|
|
|
AF_FILE = $(MCU_VARIANT)_af.csv
|
|
|
|
PREFIX_FILE = boards/$(MCU_VARIANT)_prefix.c
|
|
|
|
GEN_PINS_SRC = $(BUILD)/pins_gen.c
|
|
|
|
GEN_PINS_HDR = $(HEADER_BUILD)/pins.h
|
|
|
|
GEN_PINS_QSTR = $(BUILD)/pins_qstr.h
|
|
|
|
GEN_PINS_AF_CONST = $(HEADER_BUILD)/pins_af_const.h
|
|
|
|
GEN_PINS_AF_PY = $(BUILD)/pins_af.py
|
|
|
|
|
2017-01-22 16:18:44 -05:00
|
|
|
ifneq ($(FROZEN_DIR),)
|
|
|
|
# To use frozen source modules, put your .py files in a subdirectory (eg scripts/)
|
|
|
|
# and then invoke make with FROZEN_DIR=scripts (be sure to build from scratch).
|
|
|
|
CFLAGS += -DMICROPY_MODULE_FROZEN_STR
|
|
|
|
endif
|
2016-12-13 14:27:26 -05:00
|
|
|
|
2017-01-22 16:18:44 -05:00
|
|
|
ifneq ($(FROZEN_MPY_DIR),)
|
|
|
|
# To use frozen bytecode, put your .py files in a subdirectory (eg frozen/) and
|
|
|
|
# then invoke make with FROZEN_MPY_DIR=frozen (be sure to build from scratch).
|
|
|
|
CFLAGS += -DMICROPY_QSTR_EXTRA_POOL=mp_qstr_frozen_const_pool
|
|
|
|
CFLAGS += -DMICROPY_MODULE_FROZEN_MPY
|
|
|
|
endif
|
2016-12-13 14:27:26 -05:00
|
|
|
|
2016-11-16 15:38:25 -05:00
|
|
|
include ../py/mkrules.mk
|
2017-02-25 19:52:46 -05:00
|
|
|
|