Makefile 8.62 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 ?= 0
PYDFU = ../tools/pydfu.py
30
DFU_UTIL ?= dfu-util
31
DEVICE=0483:df11
Dave Hylands's avatar
Dave Hylands committed
32
33
34

CROSS_COMPILE = arm-none-eabi-

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

47
CFLAGS_CORTEX_M = -mthumb -mabi=aapcs-linux -mfpu=fpv4-sp-d16 -mfloat-abi=hard -fsingle-precision-constant -Wdouble-promotion
48
49
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
50
51

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

58
LDFLAGS = -nostdlib -T $(LD_FILE) -Map=$(@:.elf=.map) --cref
59
60
61
LIBS =

# Debugging/Optimization
Dave Hylands's avatar
Dave Hylands committed
62
63
64
65
ifeq ($(DEBUG), 1)
CFLAGS += -g -DPENDSV_DEBUG
COPT = -O0
else
66
CFLAGS += -fdata-sections -ffunction-sections
Dave Hylands's avatar
Dave Hylands committed
67
COPT += -Os -DNDEBUG
68
LDFLAGS += --gc-sections
Dave Hylands's avatar
Dave Hylands committed
69
70
71
72
73
endif

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

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

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

165
166
167
SRC_O = \
	startup_stm32.o \
	gchelper.o \
Dave Hylands's avatar
Dave Hylands committed
168

169
170
171
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
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
198
199
	)

200
201
202
203
SRC_USBDEV = $(addprefix $(USBDEV_DIR)/,\
	core/src/usbd_core.c \
	core/src/usbd_ctlreq.c \
	core/src/usbd_ioreq.c \
204
205
206
207
	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
208
209
	)

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

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

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

256
257
258
259
# 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.
260
$(BUILD)/$(FATFS_DIR)/ff.o: COPT += -Os
261
$(BUILD)/$(HAL_DIR)/src/stm32$(MCU_SERIES)xx_hal_sd.o: COPT += -Os
262

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

265
.PHONY: deploy
266

267
deploy: $(BUILD)/firmware.dfu
268
	$(ECHO) "Writing $< to the board"
269
270
271
ifeq ($(USE_PYDFU),1)
	$(Q)$(PYTHON) $(PYDFU) -u $<
else
272
	$(Q)$(DFU_UTIL) -a 0 -d $(DEVICE) -D $<
273
endif
274

275
$(BUILD)/firmware.dfu: $(BUILD)/firmware.elf
Dave Hylands's avatar
Dave Hylands committed
276
	$(ECHO) "Create $@"
277
278
279
	$(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
280

Windel Bouwman's avatar
Windel Bouwman committed
281
282
283
284
$(BUILD)/firmware.hex: $(BUILD)/firmware.elf
	$(ECHO) "Create $@"
	$(Q)$(OBJCOPY) -O ihex $< $@

285
$(BUILD)/firmware.elf: $(OBJ)
Dave Hylands's avatar
Dave Hylands committed
286
	$(ECHO) "LINK $@"
287
	$(Q)$(LD) $(LDFLAGS) -o $@ $^ $(LIBS)
Dave Hylands's avatar
Dave Hylands committed
288
289
290
291
	$(Q)$(SIZE) $@

MAKE_PINS = boards/make-pins.py
BOARD_PINS = boards/$(BOARD)/pins.csv
292
PREFIX_FILE = boards/stm32f4xx_prefix.c
Dave Hylands's avatar
Dave Hylands committed
293
GEN_PINS_SRC = $(BUILD)/pins_$(BOARD).c
294
GEN_PINS_HDR = $(HEADER_BUILD)/pins.h
295
GEN_PINS_QSTR = $(BUILD)/pins_qstr.h
296
GEN_PINS_AF_CONST = $(HEADER_BUILD)/pins_af_const.h
297
GEN_PINS_AF_PY = $(BUILD)/pins_af.py
Dave Hylands's avatar
Dave Hylands committed
298

299
300
301
INSERT_USB_IDS = ../tools/insert-usb-ids.py
FILE2H = ../tools/file2h.py

302
USB_IDS_FILE = usb.h
303
CDCINF_TEMPLATE = pybcdc.inf_template
304
305
GEN_CDCINF_FILE = $(HEADER_BUILD)/pybcdc.inf
GEN_CDCINF_HEADER = $(HEADER_BUILD)/pybcdc_inf.h
306

Dave Hylands's avatar
Dave Hylands committed
307
308
309
310
311
# 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.
312
$(OBJ): | $(HEADER_BUILD)/pins.h
313

314
315
316
317
# With conditional pins, we may need to regenerate qstrdefs.h when config
# options change.
$(HEADER_BUILD)/qstrdefs.generated.h: boards/$(BOARD)/mpconfigboard.h

318
319
$(BUILD)/main.o: $(GEN_CDCINF_HEADER)

Dave Hylands's avatar
Dave Hylands committed
320
321
# Use a pattern rule here so that make will only call make-pins.py once to make
# both pins_$(BOARD).c and pins.h
322
$(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
323
	$(ECHO) "Create $@"
324
	$(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
325
326
327
328

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

329
330
331
332
333
334
335
336
337
338
339
340
GEN_STMCONST_HDR = $(HEADER_BUILD)/modstm_const.h
GEN_STMCONST_QSTR = $(BUILD)/modstm_qstr.h
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
$(HEADER_BUILD)/%_const.h $(BUILD)/%_qstr.h: $(CMSIS_MCU_HDR) make-stmconst.py
	$(ECHO) "Create stmconst $@"
	$(Q)$(PYTHON) make-stmconst.py --qstr $(GEN_STMCONST_QSTR) $(CMSIS_MCU_HDR) > $(GEN_STMCONST_HDR)

341
342
343
344
345
346
347
348
$(GEN_CDCINF_HEADER): $(GEN_CDCINF_FILE) $(FILE2H)
	$(ECHO) "Create $@"
	$(Q)$(PYTHON) $(FILE2H) $< > $@

$(GEN_CDCINF_FILE): $(CDCINF_TEMPLATE) $(INSERT_USB_IDS) $(USB_IDS_FILE)
	$(ECHO) "Create $@"
	$(Q)$(PYTHON) $(INSERT_USB_IDS) $(USB_IDS_FILE) $< > $@

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