Makefile 9.13 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
LIBS =

61
62
63
64
# Remove uncalled code from the final image.
CFLAGS += -fdata-sections -ffunction-sections
LDFLAGS += --gc-sections

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

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

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

168
169
170
SRC_O = \
	startup_stm32.o \
	gchelper.o \
Dave Hylands's avatar
Dave Hylands committed
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
199
200
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
201
202
	)

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

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

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

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

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

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

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

281
.PHONY: deploy
282

283
deploy: $(BUILD)/firmware.dfu
284
	$(ECHO) "Writing $< to the board"
285
286
287
ifeq ($(USE_PYDFU),1)
	$(Q)$(PYTHON) $(PYDFU) -u $<
else
288
	$(Q)$(DFU_UTIL) -a 0 -d $(DEVICE) -D $<
289
endif
290

291
$(BUILD)/firmware.dfu: $(BUILD)/firmware.elf
Dave Hylands's avatar
Dave Hylands committed
292
	$(ECHO) "Create $@"
293
294
295
	$(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
296

Windel Bouwman's avatar
Windel Bouwman committed
297
298
299
300
$(BUILD)/firmware.hex: $(BUILD)/firmware.elf
	$(ECHO) "Create $@"
	$(Q)$(OBJCOPY) -O ihex $< $@

301
$(BUILD)/firmware.elf: $(OBJ)
Dave Hylands's avatar
Dave Hylands committed
302
	$(ECHO) "LINK $@"
303
	$(Q)$(LD) $(LDFLAGS) -o $@ $^ $(LIBS)
Dave Hylands's avatar
Dave Hylands committed
304
305
306
307
	$(Q)$(SIZE) $@

MAKE_PINS = boards/make-pins.py
BOARD_PINS = boards/$(BOARD)/pins.csv
308
PREFIX_FILE = boards/stm32f4xx_prefix.c
Dave Hylands's avatar
Dave Hylands committed
309
GEN_PINS_SRC = $(BUILD)/pins_$(BOARD).c
310
GEN_PINS_HDR = $(HEADER_BUILD)/pins.h
311
GEN_PINS_QSTR = $(BUILD)/pins_qstr.h
312
GEN_PINS_AF_CONST = $(HEADER_BUILD)/pins_af_const.h
313
GEN_PINS_AF_PY = $(BUILD)/pins_af.py
Dave Hylands's avatar
Dave Hylands committed
314

315
316
317
INSERT_USB_IDS = ../tools/insert-usb-ids.py
FILE2H = ../tools/file2h.py

318
USB_IDS_FILE = usb.h
319
CDCINF_TEMPLATE = pybcdc.inf_template
320
321
GEN_CDCINF_FILE = $(HEADER_BUILD)/pybcdc.inf
GEN_CDCINF_HEADER = $(HEADER_BUILD)/pybcdc_inf.h
322

Dave Hylands's avatar
Dave Hylands committed
323
324
325
326
327
# 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.
328
$(OBJ): | $(HEADER_BUILD)/pins.h
329

330
331
332
333
# With conditional pins, we may need to regenerate qstrdefs.h when config
# options change.
$(HEADER_BUILD)/qstrdefs.generated.h: boards/$(BOARD)/mpconfigboard.h

334
335
$(BUILD)/main.o: $(GEN_CDCINF_HEADER)

Dave Hylands's avatar
Dave Hylands committed
336
337
# Use a pattern rule here so that make will only call make-pins.py once to make
# both pins_$(BOARD).c and pins.h
338
$(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
339
	$(ECHO) "Create $@"
340
	$(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
341
342
343
344

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

345
346
GEN_STMCONST_HDR = $(HEADER_BUILD)/modstm_const.h
GEN_STMCONST_QSTR = $(BUILD)/modstm_qstr.h
347
GEN_STMCONST_MPZ = $(HEADER_BUILD)/modstm_mpz.h
348
349
350
351
352
353
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
354
$(HEADER_BUILD)/%_const.h $(BUILD)/%_qstr.h: $(CMSIS_MCU_HDR) make-stmconst.py | $(HEADER_BUILD)
355
	$(ECHO) "Create stmconst $@"
356
	$(Q)$(PYTHON) make-stmconst.py --qstr $(GEN_STMCONST_QSTR) --mpz $(GEN_STMCONST_MPZ) $(CMSIS_MCU_HDR) > $(GEN_STMCONST_HDR)
357

358
$(GEN_CDCINF_HEADER): $(GEN_CDCINF_FILE) $(FILE2H) | $(HEADER_BUILD)
359
360
361
	$(ECHO) "Create $@"
	$(Q)$(PYTHON) $(FILE2H) $< > $@

362
$(GEN_CDCINF_FILE): $(CDCINF_TEMPLATE) $(INSERT_USB_IDS) $(USB_IDS_FILE) | $(HEADER_BUILD)
363
364
365
	$(ECHO) "Create $@"
	$(Q)$(PYTHON) $(INSERT_USB_IDS) $(USB_IDS_FILE) $< > $@

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