Makefile 11 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
# Select the board to build for: if not given on the command line,
# then default to PYBV10.
BOARD ?= PYBV10
ifeq ($(wildcard boards/$(BOARD)/.),)
$(error Invalid BOARD specified)
endif

# If the build directory is not given, make it reflect the board name.
BUILD ?= build-$(BOARD)

Dave Hylands's avatar
Dave Hylands committed
11
include ../py/mkenv.mk
12
-include mpconfigport.mk
13
include boards/$(BOARD)/mpconfigboard.mk
Dave Hylands's avatar
Dave Hylands committed
14
15

# qstr definitions (must come before including py.mk)
16
QSTR_DEFS = qstrdefsport.h $(BUILD)/pins_qstr.h $(BUILD)/modstm_qstr.h
Dave Hylands's avatar
Dave Hylands committed
17
18
19
20
21

# include py core make definitions
include ../py/py.mk

CMSIS_DIR=cmsis
22
HAL_DIR=hal/$(MCU_SERIES)
23
24
USBDEV_DIR=usbdev
#USBHOST_DIR=usbhost
25
FATFS_DIR=lib/fatfs
Dave Hylands's avatar
Dave Hylands committed
26
DFU=../tools/dfu.py
27
# may need to prefix dfu-util with sudo
28
29
USE_PYDFU ?= 1
PYDFU ?= ../tools/pydfu.py
30
DFU_UTIL ?= dfu-util
31
DEVICE=0483:df11
32
STFLASH ?= st-flash
33
34
OPENOCD ?= openocd
OPENOCD_CONFIG ?= boards/openocd_stm32f4.cfg
Dave Hylands's avatar
Dave Hylands committed
35
36
37

CROSS_COMPILE = arm-none-eabi-

38
INC += -I.
39
INC += -I..
40
INC += -I$(BUILD)
Dave Hylands's avatar
Dave Hylands committed
41
42
43
INC += -I$(CMSIS_DIR)/inc
INC += -I$(CMSIS_DIR)/devinc
INC += -I$(HAL_DIR)/inc
44
INC += -I$(USBDEV_DIR)/core/inc -I$(USBDEV_DIR)/class/inc
45
#INC += -I$(USBHOST_DIR)
46
INC += -I../lib/mp-readline
47
INC += -I../lib/netutils
48
INC += -I../lib/timeutils
Dave Hylands's avatar
Dave Hylands committed
49

50
CFLAGS_CORTEX_M = -mthumb -mabi=aapcs-linux -mfpu=fpv4-sp-d16 -mfloat-abi=hard -fsingle-precision-constant -Wdouble-promotion
51
52
CFLAGS_MCU_f4 = $(CFLAGS_CORTEX_M) -mtune=cortex-m4 -mcpu=cortex-m4 -DMCU_SERIES_F4
CFLAGS_MCU_f7 = $(CFLAGS_CORTEX_M) -mtune=cortex-m7 -mcpu=cortex-m7 -DMCU_SERIES_F7
53
CFLAGS_MCU_l4 = $(CFLAGS_CORTEX_M) -mtune=cortex-m4 -mcpu=cortex-m4 -DMCU_SERIES_L4
54
55

CFLAGS = $(INC) -Wall -Wpointer-arith -Werror -ansi -std=gnu99 -nostdlib $(CFLAGS_MOD)
56
CFLAGS += -D$(CMSIS_MCU)
57
58
CFLAGS += $(CFLAGS_MCU_$(MCU_SERIES))
CFLAGS += $(COPT)
Dave Hylands's avatar
Dave Hylands committed
59
CFLAGS += -Iboards/$(BOARD)
60
CFLAGS += -DSTM32_HAL_H='<stm32$(MCU_SERIES)xx_hal.h>'
Dave Hylands's avatar
Dave Hylands committed
61

62
LDFLAGS = -nostdlib -T $(LD_FILE) -Map=$(@:.elf=.map) --cref
63
64
LIBS =

65
66
67
68
# Remove uncalled code from the final image.
CFLAGS += -fdata-sections -ffunction-sections
LDFLAGS += --gc-sections

69
# Debugging/Optimization
Dave Hylands's avatar
Dave Hylands committed
70
71
72
73
74
75
76
77
78
79
ifeq ($(DEBUG), 1)
CFLAGS += -g -DPENDSV_DEBUG
COPT = -O0
else
COPT += -Os -DNDEBUG
endif

# uncomment this if you want libgcc
#LIBS += $(shell $(CC) -print-libgcc-file-name)

80
SRC_LIB = $(addprefix lib/,\
81
	libc/string0.c \
82
	libm/math.c \
83
	libm/asinfacosf.c \
84
85
	libm/atanf.c \
	libm/atan2f.c \
86
	libm/fmodf.c \
87
	libm/roundf.c \
88
89
90
91
92
93
94
95
96
	libm/log1pf.c \
	libm/acoshf.c \
	libm/asinhf.c \
	libm/atanhf.c \
	libm/kf_rem_pio2.c \
	libm/kf_sin.c \
	libm/kf_cos.c \
	libm/kf_tan.c \
	libm/ef_rem_pio2.c \
97
	libm/erf_lgamma.c \
98
99
100
	libm/sf_sin.c \
	libm/sf_cos.c \
	libm/sf_tan.c \
101
102
	libm/sf_frexp.c \
	libm/sf_modf.c \
103
104
105
106
	libm/sf_ldexp.c \
	libm/sf_erf.c \
	libm/wf_lgamma.c \
	libm/wf_tgamma.c \
107
108
	fatfs/ff.c \
	fatfs/option/ccsbcs.c \
109
	mp-readline/readline.c \
110
	netutils/netutils.c \
111
	timeutils/timeutils.c \
112
	utils/pyexec.c \
113
	utils/pyhelp.c \
114
	utils/printf.c \
115
116
	)

Dave Hylands's avatar
Dave Hylands committed
117
118
SRC_C = \
	main.c \
119
120
	system_stm32.c \
	stm32_it.c \
121
	usbd_conf.c \
122
	usbd_desc.c \
123
	usbd_cdc_interface.c \
124
	usbd_msc_storage.c \
125
	mphalport.c \
Dave Hylands's avatar
Dave Hylands committed
126
	irq.c \
127
	pendsv.c \
128
	systick.c  \
129
	timer.c \
130
131
	led.c \
	pin.c \
132
	pin_defs_stmhal.c \
133
	pin_named_pins.c \
Damien George's avatar
Damien George committed
134
	bufhelper.c \
135
	dma.c \
Damien George's avatar
Damien George committed
136
137
138
	i2c.c \
	spi.c \
	uart.c \
139
	can.c \
140
	usb.c \
Damien George's avatar
Damien George committed
141
	wdt.c \
142
	gccollect.c \
143
	pybstdio.c \
Damien George's avatar
Damien George committed
144
	help.c \
145
	input.c \
146
	modmachine.c \
147
148
	modpyb.c \
	modstm.c \
149
150
151
	moduos.c \
	modutime.c \
	moduselect.c \
152
153
	modusocket.c \
	modnetwork.c \
154
155
	import.c \
	lexerfatfs.c \
156
	extint.c \
157
	usrsw.c \
158
	rng.c \
Damien George's avatar
Damien George committed
159
	rtc.c \
160
161
	flash.c \
	storage.c \
162
	builtin_open.c \
Damien George's avatar
Damien George committed
163
	sdcard.c \
164
	fatfs_port.c \
165
	lcd.c \
166
	accel.c \
Damien George's avatar
Damien George committed
167
	servo.c \
Damien George's avatar
Damien George committed
168
	dac.c \
Dave Hylands's avatar
Dave Hylands committed
169
	adc.c \
170
	$(wildcard boards/$(BOARD)/*.c)
Dave Hylands's avatar
Dave Hylands committed
171

172
173
174
SRC_O = \
	startup_stm32.o \
	gchelper.o \
Dave Hylands's avatar
Dave Hylands committed
175

176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
SRC_HAL = $(addprefix $(HAL_DIR)/src/stm32$(MCU_SERIES)xx_,\
	hal.c \
	hal_adc.c \
	hal_adc_ex.c \
	hal_can.c \
	hal_cortex.c \
	hal_dac.c \
	hal_dac_ex.c \
	hal_dma.c \
	hal_flash.c \
	hal_flash_ex.c \
	hal_gpio.c \
	hal_i2c.c \
	hal_pcd.c \
	hal_pcd_ex.c \
	hal_pwr.c \
	hal_pwr_ex.c \
	hal_rcc.c \
	hal_rcc_ex.c \
	hal_rng.c \
	hal_rtc.c \
	hal_rtc_ex.c \
	hal_sd.c \
	hal_spi.c \
	hal_tim.c \
	hal_tim_ex.c \
	hal_uart.c \
	ll_sdmmc.c \
	ll_usb.c \
Dave Hylands's avatar
Dave Hylands committed
205
206
	)

207
208
209
210
SRC_USBDEV = $(addprefix $(USBDEV_DIR)/,\
	core/src/usbd_core.c \
	core/src/usbd_ctlreq.c \
	core/src/usbd_ioreq.c \
211
212
213
214
	class/src/usbd_cdc_msc_hid.c \
	class/src/usbd_msc_bot.c \
	class/src/usbd_msc_scsi.c \
	class/src/usbd_msc_data.c \
Dave Hylands's avatar
Dave Hylands committed
215
216
	)

217
218
219
220
ifeq ($(MICROPY_PY_WIZNET5K),1)
WIZNET5K_DIR=drivers/wiznet5k
INC += -I$(TOP)/$(WIZNET5K_DIR)
CFLAGS_MOD += -DMICROPY_PY_WIZNET5K=1
221
SRC_MOD += modnwwiznet5k.c
222
223
224
225
226
227
228
229
SRC_MOD += $(addprefix $(WIZNET5K_DIR)/,\
	ethernet/w5200/w5200.c \
	ethernet/wizchip_conf.c \
	ethernet/socket.c \
	internet/dns/dns.c \
	)
endif

230
231
232
233
234
# for CC3000 module
ifeq ($(MICROPY_PY_CC3K),1)
CC3000_DIR=drivers/cc3000
INC += -I$(TOP)/$(CC3000_DIR)/inc
CFLAGS_MOD += -DMICROPY_PY_CC3K=1
235
SRC_MOD += modnwcc3k.c
236
237
238
239
240
241
242
243
244
245
246
247
SRC_MOD += $(addprefix $(CC3000_DIR)/src/,\
	cc3000_common.c \
	evnt_handler.c \
	hci.c \
	netapp.c \
	nvmem.c \
	security.c \
	socket.c \
	wlan.c \
	ccspi.c \
	inet_ntop.c \
	inet_pton.c \
248
249
	patch.c \
	patch_prog.c \
250
251
252
	)
endif

Dave Hylands's avatar
Dave Hylands committed
253
OBJ =
254
OBJ += $(PY_O)
255
OBJ += $(addprefix $(BUILD)/, $(SRC_LIB:.c=.o))
Dave Hylands's avatar
Dave Hylands committed
256
OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
257
OBJ += $(addprefix $(BUILD)/, $(SRC_O))
Dave Hylands's avatar
Dave Hylands committed
258
OBJ += $(addprefix $(BUILD)/, $(SRC_HAL:.c=.o))
259
OBJ += $(addprefix $(BUILD)/, $(SRC_USBDEV:.c=.o))
260
OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o))
261
OBJ += $(BUILD)/pins_$(BOARD).o
Dave Hylands's avatar
Dave Hylands committed
262

263
264
265
266
# We put ff.o and stm32f4xx_hal_sd.o into the first 16K section with the ISRs.
# If we compile these using -O0 then it won't fit. So if you really want these
# to be compiled with -O0, then edit stm32f405.ld (in the .isr_vector section)
# and comment out the following 2 lines.
267
$(BUILD)/$(FATFS_DIR)/ff.o: COPT += -Os
268
$(BUILD)/$(HAL_DIR)/src/stm32$(MCU_SERIES)xx_hal_sd.o: COPT += -Os
269

Windel Bouwman's avatar
Windel Bouwman committed
270
all: $(BUILD)/firmware.dfu $(BUILD)/firmware.hex
Dave Hylands's avatar
Dave Hylands committed
271

272
ifneq ($(FROZEN_DIR),)
273
CFLAGS += -DMICROPY_MODULE_FROZEN_STR
274
275
276
277
278
279
280
281
282
283
284
OBJ += $(BUILD)/frozen-files.o
MAKE_FROZEN = ../tools/make-frozen.py

$(BUILD)/frozen-files.o: $(BUILD)/frozen-files.c
	$(call compile_c)

$(BUILD)/frozen-files.c: $(shell find $(FROZEN_DIR) -type f)
	@$(ECHO) "Creating $@"
	$(Q)$(PYTHON) $(MAKE_FROZEN) $(FROZEN_DIR) > $@
endif

285
286
287
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).
288
FROZEN_MPY_PY_FILES := $(shell find $(FROZEN_MPY_DIR) -type f -name '*.py')
289
FROZEN_MPY_MPY_FILES := $(addprefix $(BUILD)/,$(FROZEN_MPY_PY_FILES:.py=.mpy))
290
291
CFLAGS += -DMICROPY_QSTR_EXTRA_POOL=mp_qstr_frozen_const_pool
CFLAGS += -DMICROPY_MODULE_FROZEN_MPY
292
OBJ += $(BUILD)/$(BUILD)/frozen_mpy.o
293
294
295
296
297
MPY_CROSS = ../mpy-cross/mpy-cross
MPY_TOOL = ../tools/mpy-tool.py

$(BUILD)/$(FROZEN_MPY_DIR)/%.mpy: $(FROZEN_MPY_DIR)/%.py
	@$(ECHO) "MPY $<"
298
299
	$(Q)$(MKDIR) -p $(dir $@)
	$(Q)$(MPY_CROSS) -o $@ -s $(^:$(FROZEN_MPY_DIR)/%=%) $^
300

301
$(BUILD)/frozen_mpy.c: $(FROZEN_MPY_MPY_FILES) $(BUILD)/genhdr/qstrdefs.generated.h
302
	@$(ECHO) "Creating $@"
303
	$(Q)$(PYTHON) $(MPY_TOOL) -f -q $(BUILD)/genhdr/qstrdefs.preprocessed.h $(FROZEN_MPY_MPY_FILES) > $@
304
305
endif

306
.PHONY: deploy
307

308
deploy: $(BUILD)/firmware.dfu
309
	$(ECHO) "Writing $< to the board"
310
311
312
ifeq ($(USE_PYDFU),1)
	$(Q)$(PYTHON) $(PYDFU) -u $<
else
313
	$(Q)$(DFU_UTIL) -a 0 -d $(DEVICE) -D $<
314
endif
315

316
317
318
319
320
321
deploy-stlink: $(BUILD)/firmware.dfu
	$(ECHO) "Writing $(BUILD)/firmware0.bin to the board via ST-LINK"
	$(Q)$(STFLASH) write $(BUILD)/firmware0.bin 0x08000000
	$(ECHO) "Writing $(BUILD)/firmware1.bin to the board via ST-LINK"
	$(Q)$(STFLASH) --reset write $(BUILD)/firmware1.bin 0x08020000

322
323
324
325
deploy-openocd: $(BUILD)/firmware.dfu
	$(ECHO) "Writing $(BUILD)/firmware{0,1}.bin to the board via ST-LINK using OpenOCD"
	$(Q)$(OPENOCD) -f $(OPENOCD_CONFIG) -c "stm_flash $(BUILD)/firmware0.bin $(BUILD)/firmware1.bin"

326
$(BUILD)/firmware.dfu: $(BUILD)/firmware.elf
Dave Hylands's avatar
Dave Hylands committed
327
	$(ECHO) "Create $@"
328
329
330
	$(Q)$(OBJCOPY) -O binary -j .isr_vector $^ $(BUILD)/firmware0.bin
	$(Q)$(OBJCOPY) -O binary -j .text -j .data $^ $(BUILD)/firmware1.bin
	$(Q)$(PYTHON) $(DFU) -b 0x08000000:$(BUILD)/firmware0.bin -b 0x08020000:$(BUILD)/firmware1.bin $@
Dave Hylands's avatar
Dave Hylands committed
331

Windel Bouwman's avatar
Windel Bouwman committed
332
333
334
335
$(BUILD)/firmware.hex: $(BUILD)/firmware.elf
	$(ECHO) "Create $@"
	$(Q)$(OBJCOPY) -O ihex $< $@

336
$(BUILD)/firmware.elf: $(OBJ)
Dave Hylands's avatar
Dave Hylands committed
337
	$(ECHO) "LINK $@"
338
	$(Q)$(LD) $(LDFLAGS) -o $@ $^ $(LIBS)
Dave Hylands's avatar
Dave Hylands committed
339
340
341
342
	$(Q)$(SIZE) $@

MAKE_PINS = boards/make-pins.py
BOARD_PINS = boards/$(BOARD)/pins.csv
343
PREFIX_FILE = boards/stm32f4xx_prefix.c
Dave Hylands's avatar
Dave Hylands committed
344
GEN_PINS_SRC = $(BUILD)/pins_$(BOARD).c
345
GEN_PINS_HDR = $(HEADER_BUILD)/pins.h
346
GEN_PINS_QSTR = $(BUILD)/pins_qstr.h
347
GEN_PINS_AF_CONST = $(HEADER_BUILD)/pins_af_const.h
348
GEN_PINS_AF_PY = $(BUILD)/pins_af.py
Dave Hylands's avatar
Dave Hylands committed
349

350
351
352
INSERT_USB_IDS = ../tools/insert-usb-ids.py
FILE2H = ../tools/file2h.py

353
USB_IDS_FILE = usb.h
354
CDCINF_TEMPLATE = pybcdc.inf_template
355
356
GEN_CDCINF_FILE = $(HEADER_BUILD)/pybcdc.inf
GEN_CDCINF_HEADER = $(HEADER_BUILD)/pybcdc_inf.h
357

358
359
360
361
362
363
# List of sources for qstr extraction
SRC_QSTR += $(SRC_C) $(SRC_MOD) $(SRC_LIB)
# Append any auto-generated sources that are needed by sources listed in
# SRC_QSTR
SRC_QSTR_AUTO_DEPS += $(GEN_CDCINF_HEADER)

Dave Hylands's avatar
Dave Hylands committed
364
365
366
367
368
# 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.
369
$(OBJ): | $(HEADER_BUILD)/pins.h
370

371
372
373
374
# With conditional pins, we may need to regenerate qstrdefs.h when config
# options change.
$(HEADER_BUILD)/qstrdefs.generated.h: boards/$(BOARD)/mpconfigboard.h

375
376
# main.c can't be even preprocessed without $(GEN_CDCINF_HEADER)
main.c: $(GEN_CDCINF_HEADER)
377

Dave Hylands's avatar
Dave Hylands committed
378
379
# Use a pattern rule here so that make will only call make-pins.py once to make
# both pins_$(BOARD).c and pins.h
380
$(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)
Dave Hylands's avatar
Dave Hylands committed
381
	$(ECHO) "Create $@"
382
	$(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)
Dave Hylands's avatar
Dave Hylands committed
383
384
385
386

$(BUILD)/pins_$(BOARD).o: $(BUILD)/pins_$(BOARD).c
	$(call compile_c)

387
388
GEN_STMCONST_HDR = $(HEADER_BUILD)/modstm_const.h
GEN_STMCONST_QSTR = $(BUILD)/modstm_qstr.h
389
GEN_STMCONST_MPZ = $(HEADER_BUILD)/modstm_mpz.h
390
391
392
393
394
395
CMSIS_MCU_LOWER = $(shell echo $(CMSIS_MCU) | tr '[:upper:]' '[:lower:]')
CMSIS_MCU_HDR = cmsis/devinc/$(CMSIS_MCU_LOWER).h

$(BUILD)/modstm.o: $(GEN_STMCONST_HDR)
# Use a pattern rule here so that make will only call make-stmconst.py once to
# make both modstm_const.h and modstm_qstr.h
396
$(HEADER_BUILD)/%_const.h $(BUILD)/%_qstr.h: $(CMSIS_MCU_HDR) make-stmconst.py | $(HEADER_BUILD)
397
	$(ECHO) "Create stmconst $@"
398
	$(Q)$(PYTHON) make-stmconst.py --qstr $(GEN_STMCONST_QSTR) --mpz $(GEN_STMCONST_MPZ) $(CMSIS_MCU_HDR) > $(GEN_STMCONST_HDR)
399

400
$(GEN_CDCINF_HEADER): $(GEN_CDCINF_FILE) $(FILE2H) | $(HEADER_BUILD)
401
402
403
	$(ECHO) "Create $@"
	$(Q)$(PYTHON) $(FILE2H) $< > $@

404
$(GEN_CDCINF_FILE): $(CDCINF_TEMPLATE) $(INSERT_USB_IDS) $(USB_IDS_FILE) | $(HEADER_BUILD)
405
406
407
	$(ECHO) "Create $@"
	$(Q)$(PYTHON) $(INSERT_USB_IDS) $(USB_IDS_FILE) $< > $@

Dave Hylands's avatar
Dave Hylands committed
408
include ../py/mkrules.mk