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
107
	)

Dave Hylands's avatar
Dave Hylands committed
108
109
SRC_C = \
	main.c \
110
111
	system_stm32.c \
	stm32_it.c \
112
	usbd_conf.c \
113
	usbd_desc.c \
114
	usbd_cdc_interface.c \
115
	usbd_msc_storage.c \
116
	mphalport.c \
Dave Hylands's avatar
Dave Hylands committed
117
	irq.c \
118
	pendsv.c \
119
	systick.c  \
120
	timer.c \
121
122
	led.c \
	pin.c \
123
	pin_defs_stmhal.c \
124
	pin_named_pins.c \
Damien George's avatar
Damien George committed
125
	bufhelper.c \
126
	dma.c \
Damien George's avatar
Damien George committed
127
128
129
	i2c.c \
	spi.c \
	uart.c \
130
	can.c \
131
	usb.c \
132
133
	printf.c \
	gccollect.c \
134
	pybstdio.c \
135
	pyexec.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
	fsusermount.c \
157
	diskio.c \
158
	ffconf.c \
159
	lcd.c \
160
	accel.c \
Damien George's avatar
Damien George committed
161
	servo.c \
Damien George's avatar
Damien George committed
162
	dac.c \
Dave Hylands's avatar
Dave Hylands committed
163
	adc.c \
164
	$(wildcard boards/$(BOARD)/*.c)
Dave Hylands's avatar
Dave Hylands committed
165

166
167
168
SRC_O = \
	startup_stm32.o \
	gchelper.o \
Dave Hylands's avatar
Dave Hylands committed
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
198
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
199
200
	)

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

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

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

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

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

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

266
.PHONY: deploy
267

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

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

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

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

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

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

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

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

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

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

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

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

330
331
332
333
334
335
336
337
338
339
340
341
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)

342
343
344
345
346
347
348
349
$(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
350
include ../py/mkrules.mk