|
| 1 | +# Select the board to build for: if not given on the command line, |
| 2 | +# then default to pca10040. |
| 3 | +BOARD ?= pca10040 |
| 4 | +ifeq ($(wildcard boards/$(BOARD)/.),) |
| 5 | +$(error Invalid BOARD specified) |
| 6 | +endif |
| 7 | + |
| 8 | +# If SoftDevice is selected, try to use that one. |
| 9 | +SD ?= |
| 10 | +SD_LOWER = $(shell echo $(SD) | tr '[:upper:]' '[:lower:]') |
| 11 | + |
| 12 | +# TODO: Verify that it is a valid target. |
| 13 | + |
| 14 | + |
| 15 | +ifeq ($(SD), ) |
| 16 | + # If the build directory is not given, make it reflect the board name. |
| 17 | + BUILD ?= build-$(BOARD) |
| 18 | + include ../py/mkenv.mk |
| 19 | + include boards/$(BOARD)/mpconfigboard.mk |
| 20 | +else |
| 21 | + # If the build directory is not given, make it reflect the board name. |
| 22 | + BUILD ?= build-$(BOARD)-$(SD_LOWER) |
| 23 | + include ../py/mkenv.mk |
| 24 | + include boards/$(BOARD)/mpconfigboard_$(SD_LOWER).mk |
| 25 | + |
| 26 | + include drivers/bluetooth/bluetooth_common.mk |
| 27 | +endif |
| 28 | + |
| 29 | +# qstr definitions (must come before including py.mk) |
| 30 | +QSTR_DEFS = qstrdefsport.h $(BUILD)/pins_qstr.h |
| 31 | + |
| 32 | +FROZEN_MPY_DIR = freeze |
| 33 | + |
| 34 | +# include py core make definitions |
| 35 | +include ../py/py.mk |
| 36 | + |
| 37 | + |
| 38 | +FATFS_DIR = lib/oofatfs |
| 39 | +MPY_CROSS = ../mpy-cross/mpy-cross |
| 40 | +MPY_TOOL = ../tools/mpy-tool.py |
| 41 | + |
| 42 | +CROSS_COMPILE = arm-none-eabi- |
| 43 | + |
| 44 | +MCU_VARIANT_UPPER = $(shell echo $(MCU_VARIANT) | tr '[:lower:]' '[:upper:]') |
| 45 | + |
| 46 | +INC += -I. |
| 47 | +INC += -I.. |
| 48 | +INC += -I$(BUILD) |
| 49 | +INC += -I./../lib/cmsis/inc |
| 50 | +INC += -I./device |
| 51 | +INC += -I./device/$(MCU_VARIANT) |
| 52 | +INC += -I./hal |
| 53 | +INC += -I./hal/$(MCU_VARIANT) |
| 54 | +INC += -I./modules/machine |
| 55 | +INC += -I./modules/ubluepy |
| 56 | +INC += -I./modules/music |
| 57 | +INC += -I./modules/random |
| 58 | +INC += -I./modules/ble |
| 59 | +INC += -I../lib/mp-readline |
| 60 | +INC += -I./drivers/bluetooth |
| 61 | +INC += -I./drivers |
| 62 | + |
| 63 | +NRF_DEFINES += -D$(MCU_VARIANT_UPPER) |
| 64 | +NRF_DEFINES += -DCONFIG_GPIO_AS_PINRESET |
| 65 | + |
| 66 | +CFLAGS_CORTEX_M = -mthumb -mabi=aapcs -fsingle-precision-constant -Wdouble-promotion |
| 67 | + |
| 68 | +CFLAGS_MCU_m4 = $(CFLAGS_CORTEX_M) -mtune=cortex-m4 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections |
| 69 | + |
| 70 | +CFLAGS_MCU_m0 = $(CFLAGS_CORTEX_M) --short-enums -mtune=cortex-m0 -mcpu=cortex-m0 -mfloat-abi=soft -fno-builtin |
| 71 | + |
| 72 | + |
| 73 | +CFLAGS += $(CFLAGS_MCU_$(MCU_SERIES)) |
| 74 | +CFLAGS += $(INC) -Wall -Werror -ansi -std=gnu99 -nostdlib $(COPT) $(NRF_DEFINES) $(CFLAGS_MOD) |
| 75 | +CFLAGS += -fno-strict-aliasing |
| 76 | +CFLAGS += -fstack-usage |
| 77 | +CFLAGS += -Iboards/$(BOARD) |
| 78 | +CFLAGS += -DNRF5_HAL_H='<$(MCU_VARIANT)_hal.h>' |
| 79 | + |
| 80 | +LDFLAGS = $(CFLAGS) |
| 81 | +LDFLAGS += -Xlinker -Map=$(@:.elf=.map) |
| 82 | +LDFLAGS += -mthumb -mabi=aapcs -T $(LD_FILE) -L boards/ |
| 83 | + |
| 84 | +#Debugging/Optimization |
| 85 | +ifeq ($(DEBUG), 1) |
| 86 | +#ASMFLAGS += -g -gtabs+ |
| 87 | +CFLAGS += -O0 -ggdb |
| 88 | +LDFLAGS += -O0 |
| 89 | +else |
| 90 | +CFLAGS += -Os -DNDEBUG |
| 91 | +LDFLAGS += -Os |
| 92 | +endif |
| 93 | + |
| 94 | +LIBS = \ |
| 95 | + |
| 96 | +ifeq ($(MCU_VARIANT), nrf52) |
| 97 | +LIBM_FILE_NAME = $(shell $(CC) $(CFLAGS) -print-file-name=libm.a) |
| 98 | +LIBC_FILE_NAME = $(shell $(CC) $(CFLAGS) -print-file-name=libc.a) |
| 99 | +LIBGCC_FILE_NAME = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name) |
| 100 | + |
| 101 | +LIBS += -L $(dir $(LIBM_FILE_NAME)) -lm |
| 102 | +LIBS += -L $(dir $(LIBC_FILE_NAME)) -lc |
| 103 | +LIBS += -L $(dir $(LIBGCC_FILE_NAME)) -lgcc |
| 104 | +endif |
| 105 | + |
| 106 | +SRC_LIB = $(addprefix lib/,\ |
| 107 | + libc/string0.c \ |
| 108 | + mp-readline/readline.c \ |
| 109 | + utils/pyexec.c \ |
| 110 | + timeutils/timeutils.c \ |
| 111 | + oofatfs/ff.c \ |
| 112 | + oofatfs/option/unicode.c \ |
| 113 | + ) |
| 114 | + |
| 115 | +SRC_HAL = $(addprefix hal/,\ |
| 116 | + hal_uart.c \ |
| 117 | + hal_uarte.c \ |
| 118 | + hal_spi.c \ |
| 119 | + hal_spie.c \ |
| 120 | + hal_time.c \ |
| 121 | + hal_rtc.c \ |
| 122 | + hal_timer.c \ |
| 123 | + hal_twi.c \ |
| 124 | + hal_adc.c \ |
| 125 | + hal_adce.c \ |
| 126 | + hal_temp.c \ |
| 127 | + hal_gpio.c \ |
| 128 | + hal_rng.c \ |
| 129 | + ) |
| 130 | + |
| 131 | +ifeq ($(MCU_VARIANT), nrf52) |
| 132 | +SRC_HAL += $(addprefix hal/,\ |
| 133 | + hal_pwm.c \ |
| 134 | + ) |
| 135 | +endif |
| 136 | + |
| 137 | +SRC_C += \ |
| 138 | + main.c \ |
| 139 | + mphalport.c \ |
| 140 | + help.c \ |
| 141 | + gccollect.c \ |
| 142 | + pin_named_pins.c \ |
| 143 | + fatfs_port.c \ |
| 144 | + drivers/softpwm.c \ |
| 145 | + drivers/ticker.c \ |
| 146 | + drivers/bluetooth/ble_drv.c \ |
| 147 | + drivers/bluetooth/ble_uart.c \ |
| 148 | + |
| 149 | +DRIVERS_SRC_C += $(addprefix modules/,\ |
| 150 | + machine/modmachine.c \ |
| 151 | + machine/uart.c \ |
| 152 | + machine/spi.c \ |
| 153 | + machine/i2c.c \ |
| 154 | + machine/adc.c \ |
| 155 | + machine/pin.c \ |
| 156 | + machine/timer.c \ |
| 157 | + machine/rtc.c \ |
| 158 | + machine/pwm.c \ |
| 159 | + machine/led.c \ |
| 160 | + machine/temp.c \ |
| 161 | + uos/moduos.c \ |
| 162 | + utime/modutime.c \ |
| 163 | + pyb/modpyb.c \ |
| 164 | + ubluepy/modubluepy.c \ |
| 165 | + ubluepy/ubluepy_peripheral.c \ |
| 166 | + ubluepy/ubluepy_service.c \ |
| 167 | + ubluepy/ubluepy_characteristic.c \ |
| 168 | + ubluepy/ubluepy_uuid.c \ |
| 169 | + ubluepy/ubluepy_delegate.c \ |
| 170 | + ubluepy/ubluepy_constants.c \ |
| 171 | + ubluepy/ubluepy_descriptor.c \ |
| 172 | + ubluepy/ubluepy_scanner.c \ |
| 173 | + ubluepy/ubluepy_scan_entry.c \ |
| 174 | + music/modmusic.c \ |
| 175 | + music/musictunes.c \ |
| 176 | + ble/modble.c \ |
| 177 | + random/modrandom.c \ |
| 178 | + ) |
| 179 | + |
| 180 | +SRC_C += \ |
| 181 | + device/$(MCU_VARIANT)/system_$(MCU_SUB_VARIANT).c \ |
| 182 | + device/$(MCU_VARIANT)/startup_$(MCU_SUB_VARIANT).c \ |
| 183 | + |
| 184 | +FROZEN_MPY_PY_FILES := $(shell find -L $(FROZEN_MPY_DIR) -type f -name '*.py') |
| 185 | +FROZEN_MPY_MPY_FILES := $(addprefix $(BUILD)/,$(FROZEN_MPY_PY_FILES:.py=.mpy)) |
| 186 | + |
| 187 | +OBJ += $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) |
| 188 | +OBJ += $(addprefix $(BUILD)/, $(SRC_LIB:.c=.o)) |
| 189 | +OBJ += $(addprefix $(BUILD)/, $(SRC_HAL:.c=.o)) |
| 190 | +OBJ += $(addprefix $(BUILD)/, $(DRIVERS_SRC_C:.c=.o)) |
| 191 | +OBJ += $(BUILD)/pins_gen.o |
| 192 | + |
| 193 | +$(BUILD)/$(FATFS_DIR)/ff.o: COPT += -Os |
| 194 | +$(filter $(PY_BUILD)/../extmod/vfs_fat_%.o, $(PY_O)): COPT += -Os |
| 195 | + |
| 196 | +.phony: all flash sd binary hex |
| 197 | + |
| 198 | +all: binary hex |
| 199 | + |
| 200 | +OUTPUT_FILENAME = firmware |
| 201 | + |
| 202 | +## Create binary .bin file from the .out file |
| 203 | +binary: $(BUILD)/$(OUTPUT_FILENAME).bin |
| 204 | + |
| 205 | +$(BUILD)/$(OUTPUT_FILENAME).bin: $(BUILD)/$(OUTPUT_FILENAME).elf |
| 206 | + $(OBJCOPY) -O binary $< $@ |
| 207 | + |
| 208 | +## Create binary .hex file from the .out file |
| 209 | +hex: $(BUILD)/$(OUTPUT_FILENAME).hex |
| 210 | + |
| 211 | +$(BUILD)/$(OUTPUT_FILENAME).hex: $(BUILD)/$(OUTPUT_FILENAME).elf |
| 212 | + $(OBJCOPY) -O ihex $< $@ |
| 213 | + |
| 214 | +FLASHER ?= |
| 215 | + |
| 216 | +ifeq ($(FLASHER),) |
| 217 | + |
| 218 | +flash: $(BUILD)/$(OUTPUT_FILENAME).hex |
| 219 | + nrfjprog --program $< --sectorerase -f $(MCU_VARIANT) |
| 220 | + nrfjprog --reset -f $(MCU_VARIANT) |
| 221 | + |
| 222 | +sd: $(BUILD)/$(OUTPUT_FILENAME).hex |
| 223 | + nrfjprog --eraseall -f $(MCU_VARIANT) |
| 224 | + nrfjprog --program $(SOFTDEV_HEX) -f $(MCU_VARIANT) |
| 225 | + nrfjprog --program $< --sectorerase -f $(MCU_VARIANT) |
| 226 | + nrfjprog --reset -f $(MCU_VARIANT) |
| 227 | + |
| 228 | +else ifeq ($(FLASHER), pyocd) |
| 229 | + |
| 230 | +flash: $(BUILD)/$(OUTPUT_FILENAME).hex |
| 231 | + pyocd-flashtool -t $(MCU_VARIANT) $< |
| 232 | + |
| 233 | +sd: $(BUILD)/$(OUTPUT_FILENAME).hex |
| 234 | + pyocd-flashtool -t $(MCU_VARIANT) --chip_erase |
| 235 | + pyocd-flashtool -t $(MCU_VARIANT) $(SOFTDEV_HEX) |
| 236 | + pyocd-flashtool -t $(MCU_VARIANT) $< |
| 237 | + |
| 238 | +endif |
| 239 | + |
| 240 | +$(BUILD)/$(OUTPUT_FILENAME).elf: $(OBJ) |
| 241 | + $(ECHO) "LINK $@" |
| 242 | + $(Q)$(CC) $(LDFLAGS) -o $@ $(OBJ) $(LIBS) |
| 243 | + $(Q)$(SIZE) $@ |
| 244 | + |
| 245 | +# List of sources for qstr extraction |
| 246 | +SRC_QSTR += $(SRC_C) $(SRC_MOD) $(SRC_LIB) $(DRIVERS_SRC_C) |
| 247 | + |
| 248 | +# Append any auto-generated sources that are needed by sources listed in |
| 249 | +# SRC_QSTR |
| 250 | +SRC_QSTR_AUTO_DEPS += |
| 251 | + |
| 252 | +# Making OBJ use an order-only depenedency on the generated pins.h file |
| 253 | +# has the side effect of making the pins.h file before we actually compile |
| 254 | +# any of the objects. The normal dependency generation will deal with the |
| 255 | +# case when pins.h is modified. But when it doesn't exist, we don't know |
| 256 | +# which source files might need it. |
| 257 | +$(OBJ): | $(HEADER_BUILD)/pins.h |
| 258 | + |
| 259 | +# Use a pattern rule here so that make will only call make-pins.py once to make |
| 260 | +# both pins_$(BOARD).c and pins.h |
| 261 | +$(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) |
| 262 | + $(ECHO) "Create $@" |
| 263 | + $(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) |
| 264 | + |
| 265 | +$(BUILD)/pins_gen.o: $(BUILD)/pins_gen.c |
| 266 | + $(call compile_c) |
| 267 | + |
| 268 | +MAKE_PINS = boards/make-pins.py |
| 269 | +BOARD_PINS = boards/$(BOARD)/pins.csv |
| 270 | +AF_FILE = $(MCU_VARIANT)_af.csv |
| 271 | +PREFIX_FILE = boards/$(MCU_VARIANT)_prefix.c |
| 272 | +GEN_PINS_SRC = $(BUILD)/pins_gen.c |
| 273 | +GEN_PINS_HDR = $(HEADER_BUILD)/pins.h |
| 274 | +GEN_PINS_QSTR = $(BUILD)/pins_qstr.h |
| 275 | +GEN_PINS_AF_CONST = $(HEADER_BUILD)/pins_af_const.h |
| 276 | +GEN_PINS_AF_PY = $(BUILD)/pins_af.py |
| 277 | + |
| 278 | +ifneq ($(FROZEN_DIR),) |
| 279 | +# To use frozen source modules, put your .py files in a subdirectory (eg scripts/) |
| 280 | +# and then invoke make with FROZEN_DIR=scripts (be sure to build from scratch). |
| 281 | +CFLAGS += -DMICROPY_MODULE_FROZEN_STR |
| 282 | +endif |
| 283 | + |
| 284 | +ifneq ($(FROZEN_MPY_DIR),) |
| 285 | +# To use frozen bytecode, put your .py files in a subdirectory (eg frozen/) and |
| 286 | +# then invoke make with FROZEN_MPY_DIR=frozen (be sure to build from scratch). |
| 287 | +CFLAGS += -DMICROPY_QSTR_EXTRA_POOL=mp_qstr_frozen_const_pool |
| 288 | +CFLAGS += -DMICROPY_MODULE_FROZEN_MPY |
| 289 | +endif |
| 290 | + |
| 291 | +include ../py/mkrules.mk |
| 292 | + |
0 commit comments