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

$(BUILD)/$(FROZEN_MPY_DIR)/%.mpy: $(FROZEN_MPY_DIR)/%.py
	@$(ECHO) "MPY $<"
	$(Q)$(MPY_CROSS) -o $@ $^

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

$(BUILD)/$(FROZEN_MPY_DIR)/frozen_mpy.o: $(BUILD)/$(FROZEN_MPY_DIR)/frozen_mpy.c
	$(call compile_c)
endif

307
.PHONY: deploy
308

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

317
318
319
320
321
322
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

323
324
325
326
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"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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