Makefile 10.8 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
54

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

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

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

68
# Debugging/Optimization
Dave Hylands's avatar
Dave Hylands committed
69
70
71
72
73
74
75
76
77
78
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)

79
SRC_LIB = $(addprefix lib/,\
80
	libc/string0.c \
81
	libm/math.c \
82
	libm/asinfacosf.c \
83
84
	libm/atanf.c \
	libm/atan2f.c \
85
	libm/fmodf.c \
86
	libm/roundf.c \
87
88
89
90
91
92
93
94
95
	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 \
96
	libm/erf_lgamma.c \
97
98
99
	libm/sf_sin.c \
	libm/sf_cos.c \
	libm/sf_tan.c \
100
101
	libm/sf_frexp.c \
	libm/sf_modf.c \
102
103
104
105
	libm/sf_ldexp.c \
	libm/sf_erf.c \
	libm/wf_lgamma.c \
	libm/wf_tgamma.c \
106
107
	fatfs/ff.c \
	fatfs/option/ccsbcs.c \
108
	mp-readline/readline.c \
109
	netutils/netutils.c \
110
	timeutils/timeutils.c \
111
	utils/pyexec.c \
112
	utils/printf.c \
113
114
	)

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

169
170
171
SRC_O = \
	startup_stm32.o \
	gchelper.o \
Dave Hylands's avatar
Dave Hylands committed
172

173
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
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
202
203
	)

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

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

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

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

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

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

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

282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
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).
FROZEN_MPY_FILES := $(wildcard $(FROZEN_MPY_DIR)/*.py)
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 $@ $^

$(BUILD)/$(FROZEN_MPY_DIR)/frozen_mpy.c: $(addprefix $(BUILD)/,$(FROZEN_MPY_FILES:.py=.mpy))
	@$(ECHO) "Creating $@"
	$(Q)$(PYTHON) $(MPY_TOOL) -f -q $(BUILD)/genhdr/qstrdefs.preprocessed.h $^ > $@

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

304
.PHONY: deploy
305

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

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

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

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

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

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

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

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

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

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

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

373
374
$(BUILD)/main.o: $(GEN_CDCINF_HEADER)

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

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

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

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

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

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