Makefile 7.8 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
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
35

CROSS_COMPILE = arm-none-eabi-

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
48
49
50
51
52
53
CFLAGS_CORTEX_M = -mthumb -mabi=aapcs-linux -mfpu=fpv4-sp-d16 -mfloat-abi=hard -fsingle-precision-constant -Wdouble-promotion
CFLAGS_MCU_f4 = $(CFLAGS_CORTEX_M) -mtune=cortex-m4 -mcpu=cortex-m4
CFLAGS_MCU_f7 = $(CFLAGS_CORTEX_M) -mtune=cortex-m7 -mcpu=cortex-m7

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

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

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

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

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

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

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

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
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
197
198
	)

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

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

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

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

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

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

264
.PHONY: deploy
265

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

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

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

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

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

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

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

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

313
314
$(BUILD)/main.o: $(GEN_CDCINF_HEADER)

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

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

324
325
326
327
328
329
330
331
$(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
332
include ../py/mkrules.mk