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 \
141
	gccollect.c \
142
	pybstdio.c \
Damien George's avatar
Damien George committed
143
	help.c \
144
	input.c \
145
	modmachine.c \
146
147
	modpyb.c \
	modstm.c \
148
149
150
	moduos.c \
	modutime.c \
	moduselect.c \
151
152
	modusocket.c \
	modnetwork.c \
153
154
	import.c \
	lexerfatfs.c \
155
	extint.c \
156
	usrsw.c \
157
	rng.c \
Damien George's avatar
Damien George committed
158
	rtc.c \
159
160
	flash.c \
	storage.c \
161
	builtin_open.c \
Damien George's avatar
Damien George committed
162
	sdcard.c \
163
	fatfs_port.c \
164
	lcd.c \
165
	accel.c \
Damien George's avatar
Damien George committed
166
	servo.c \
Damien George's avatar
Damien George committed
167
	dac.c \
Dave Hylands's avatar
Dave Hylands committed
168
	adc.c \
169
	$(wildcard boards/$(BOARD)/*.c)
Dave Hylands's avatar
Dave Hylands committed
170

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

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
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
204
205
	)

206
207
208
209
SRC_USBDEV = $(addprefix $(USBDEV_DIR)/,\
	core/src/usbd_core.c \
	core/src/usbd_ctlreq.c \
	core/src/usbd_ioreq.c \
210
211
212
213
	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
214
215
	)

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

229
230
231
232
233
# for CC3000 module
ifeq ($(MICROPY_PY_CC3K),1)
CC3000_DIR=drivers/cc3000
INC += -I$(TOP)/$(CC3000_DIR)/inc
CFLAGS_MOD += -DMICROPY_PY_CC3K=1
234
SRC_MOD += modnwcc3k.c
235
236
237
238
239
240
241
242
243
244
245
246
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 \
247
248
	patch.c \
	patch_prog.c \
249
250
251
	)
endif

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

262
263
264
265
# 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.
266
$(BUILD)/$(FATFS_DIR)/ff.o: COPT += -Os
267
$(BUILD)/$(HAL_DIR)/src/stm32$(MCU_SERIES)xx_hal_sd.o: COPT += -Os
268

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

271
ifneq ($(FROZEN_DIR),)
272
CFLAGS += -DMICROPY_MODULE_FROZEN_STR
273
274
275
276
277
278
279
280
281
282
283
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

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

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

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

305
.PHONY: deploy
306

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

315
316
317
318
319
320
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

321
322
323
324
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"

325
$(BUILD)/firmware.dfu: $(BUILD)/firmware.elf
Dave Hylands's avatar
Dave Hylands committed
326
	$(ECHO) "Create $@"
327
328
329
	$(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
330

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

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

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

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

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

357
358
359
360
361
362
# 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
363
364
365
366
367
# 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.
368
$(OBJ): | $(HEADER_BUILD)/pins.h
369

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

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

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

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

386
387
GEN_STMCONST_HDR = $(HEADER_BUILD)/modstm_const.h
GEN_STMCONST_QSTR = $(BUILD)/modstm_qstr.h
388
GEN_STMCONST_MPZ = $(HEADER_BUILD)/modstm_mpz.h
389
390
391
392
393
394
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
395
$(HEADER_BUILD)/%_const.h $(BUILD)/%_qstr.h: $(CMSIS_MCU_HDR) make-stmconst.py | $(HEADER_BUILD)
396
	$(ECHO) "Create stmconst $@"
397
	$(Q)$(PYTHON) make-stmconst.py --qstr $(GEN_STMCONST_QSTR) --mpz $(GEN_STMCONST_MPZ) $(CMSIS_MCU_HDR) > $(GEN_STMCONST_HDR)
398

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

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

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