Makefile 9.42 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
Dave Hylands's avatar
Dave Hylands committed
33
34
35

CROSS_COMPILE = arm-none-eabi-

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

267
268
269
270
271
272
273
274
275
276
277
278
279
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

280
.PHONY: deploy
281

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

290
291
292
293
294
295
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

296
$(BUILD)/firmware.dfu: $(BUILD)/firmware.elf
Dave Hylands's avatar
Dave Hylands committed
297
	$(ECHO) "Create $@"
298
299
300
	$(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
301

Windel Bouwman's avatar
Windel Bouwman committed
302
303
304
305
$(BUILD)/firmware.hex: $(BUILD)/firmware.elf
	$(ECHO) "Create $@"
	$(Q)$(OBJCOPY) -O ihex $< $@

306
$(BUILD)/firmware.elf: $(OBJ)
Dave Hylands's avatar
Dave Hylands committed
307
	$(ECHO) "LINK $@"
308
	$(Q)$(LD) $(LDFLAGS) -o $@ $^ $(LIBS)
Dave Hylands's avatar
Dave Hylands committed
309
310
311
312
	$(Q)$(SIZE) $@

MAKE_PINS = boards/make-pins.py
BOARD_PINS = boards/$(BOARD)/pins.csv
313
PREFIX_FILE = boards/stm32f4xx_prefix.c
Dave Hylands's avatar
Dave Hylands committed
314
GEN_PINS_SRC = $(BUILD)/pins_$(BOARD).c
315
GEN_PINS_HDR = $(HEADER_BUILD)/pins.h
316
GEN_PINS_QSTR = $(BUILD)/pins_qstr.h
317
GEN_PINS_AF_CONST = $(HEADER_BUILD)/pins_af_const.h
318
GEN_PINS_AF_PY = $(BUILD)/pins_af.py
Dave Hylands's avatar
Dave Hylands committed
319

320
321
322
INSERT_USB_IDS = ../tools/insert-usb-ids.py
FILE2H = ../tools/file2h.py

323
USB_IDS_FILE = usb.h
324
CDCINF_TEMPLATE = pybcdc.inf_template
325
326
GEN_CDCINF_FILE = $(HEADER_BUILD)/pybcdc.inf
GEN_CDCINF_HEADER = $(HEADER_BUILD)/pybcdc_inf.h
327

Dave Hylands's avatar
Dave Hylands committed
328
329
330
331
332
# 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.
333
$(OBJ): | $(HEADER_BUILD)/pins.h
334

335
336
337
338
# With conditional pins, we may need to regenerate qstrdefs.h when config
# options change.
$(HEADER_BUILD)/qstrdefs.generated.h: boards/$(BOARD)/mpconfigboard.h

339
340
$(BUILD)/main.o: $(GEN_CDCINF_HEADER)

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

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

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

363
$(GEN_CDCINF_HEADER): $(GEN_CDCINF_FILE) $(FILE2H) | $(HEADER_BUILD)
364
365
366
	$(ECHO) "Create $@"
	$(Q)$(PYTHON) $(FILE2H) $< > $@

367
$(GEN_CDCINF_FILE): $(CDCINF_TEMPLATE) $(INSERT_USB_IDS) $(USB_IDS_FILE) | $(HEADER_BUILD)
368
369
370
	$(ECHO) "Create $@"
	$(Q)$(PYTHON) $(INSERT_USB_IDS) $(USB_IDS_FILE) $< > $@

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