Makefile 9.7 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
.PHONY: deploy
283

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

292
293
294
295
296
297
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

298
299
300
301
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"

302
$(BUILD)/firmware.dfu: $(BUILD)/firmware.elf
Dave Hylands's avatar
Dave Hylands committed
303
	$(ECHO) "Create $@"
304
305
306
	$(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
307

Windel Bouwman's avatar
Windel Bouwman committed
308
309
310
311
$(BUILD)/firmware.hex: $(BUILD)/firmware.elf
	$(ECHO) "Create $@"
	$(Q)$(OBJCOPY) -O ihex $< $@

312
$(BUILD)/firmware.elf: $(OBJ)
Dave Hylands's avatar
Dave Hylands committed
313
	$(ECHO) "LINK $@"
314
	$(Q)$(LD) $(LDFLAGS) -o $@ $^ $(LIBS)
Dave Hylands's avatar
Dave Hylands committed
315
316
317
318
	$(Q)$(SIZE) $@

MAKE_PINS = boards/make-pins.py
BOARD_PINS = boards/$(BOARD)/pins.csv
319
PREFIX_FILE = boards/stm32f4xx_prefix.c
Dave Hylands's avatar
Dave Hylands committed
320
GEN_PINS_SRC = $(BUILD)/pins_$(BOARD).c
321
GEN_PINS_HDR = $(HEADER_BUILD)/pins.h
322
GEN_PINS_QSTR = $(BUILD)/pins_qstr.h
323
GEN_PINS_AF_CONST = $(HEADER_BUILD)/pins_af_const.h
324
GEN_PINS_AF_PY = $(BUILD)/pins_af.py
Dave Hylands's avatar
Dave Hylands committed
325

326
327
328
INSERT_USB_IDS = ../tools/insert-usb-ids.py
FILE2H = ../tools/file2h.py

329
USB_IDS_FILE = usb.h
330
CDCINF_TEMPLATE = pybcdc.inf_template
331
332
GEN_CDCINF_FILE = $(HEADER_BUILD)/pybcdc.inf
GEN_CDCINF_HEADER = $(HEADER_BUILD)/pybcdc_inf.h
333

Dave Hylands's avatar
Dave Hylands committed
334
335
336
337
338
# 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.
339
$(OBJ): | $(HEADER_BUILD)/pins.h
340

341
342
343
344
# With conditional pins, we may need to regenerate qstrdefs.h when config
# options change.
$(HEADER_BUILD)/qstrdefs.generated.h: boards/$(BOARD)/mpconfigboard.h

345
346
$(BUILD)/main.o: $(GEN_CDCINF_HEADER)

Dave Hylands's avatar
Dave Hylands committed
347
348
# Use a pattern rule here so that make will only call make-pins.py once to make
# both pins_$(BOARD).c and pins.h
349
$(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
350
	$(ECHO) "Create $@"
351
	$(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
352
353
354
355

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

356
357
GEN_STMCONST_HDR = $(HEADER_BUILD)/modstm_const.h
GEN_STMCONST_QSTR = $(BUILD)/modstm_qstr.h
358
GEN_STMCONST_MPZ = $(HEADER_BUILD)/modstm_mpz.h
359
360
361
362
363
364
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
365
$(HEADER_BUILD)/%_const.h $(BUILD)/%_qstr.h: $(CMSIS_MCU_HDR) make-stmconst.py | $(HEADER_BUILD)
366
	$(ECHO) "Create stmconst $@"
367
	$(Q)$(PYTHON) make-stmconst.py --qstr $(GEN_STMCONST_QSTR) --mpz $(GEN_STMCONST_MPZ) $(CMSIS_MCU_HDR) > $(GEN_STMCONST_HDR)
368

369
$(GEN_CDCINF_HEADER): $(GEN_CDCINF_FILE) $(FILE2H) | $(HEADER_BUILD)
370
371
372
	$(ECHO) "Create $@"
	$(Q)$(PYTHON) $(FILE2H) $< > $@

373
$(GEN_CDCINF_FILE): $(CDCINF_TEMPLATE) $(INSERT_USB_IDS) $(USB_IDS_FILE) | $(HEADER_BUILD)
374
375
376
	$(ECHO) "Create $@"
	$(Q)$(PYTHON) $(INSERT_USB_IDS) $(USB_IDS_FILE) $< > $@

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