1
1
BOARD ?= TEENSY40
2
2
BOARD_DIR ?= boards/$(BOARD )
3
+ BOOTLOADER_DIR ?= bootloader
3
4
BUILD ?= build-$(BOARD )
4
5
5
6
PORT ?= /dev/ttyACM0
13
14
include ../../py/mkenv.mk
14
15
include $(BOARD_DIR ) /mpconfigboard.mk
15
16
17
+ ifeq ($(MICROPY_HW_FLASH_TYPE ) , qspi_nor)
18
+ MICROPY_HW_FLASH_FIRMWARE_START_ADDR = 0x00008000
19
+ else ifeq ($(MICROPY_HW_FLASH_TYPE), hyperflash)
20
+ MICROPY_HW_FLASH_FIRMWARE_START_ADDR = 0x00040000
21
+ endif
22
+
16
23
LD_MEMORY_CONFIG_DEFINES += \
17
24
MICROPY_HW_FLASH_TYPE=$(MICROPY_HW_FLASH_TYPE ) \
18
- MICROPY_HW_FLASH_SIZE=$(MICROPY_HW_FLASH_SIZE )
25
+ MICROPY_HW_FLASH_SIZE=$(MICROPY_HW_FLASH_SIZE ) \
26
+ MICROPY_HW_FLASH_FIRMWARE_START_ADDR=$(MICROPY_HW_FLASH_FIRMWARE_START_ADDR )
19
27
20
28
ifdef MICROPY_HW_FLASH_RESERVED
21
29
LD_MEMORY_CONFIG_DEFINES += MICROPY_HW_FLASH_RESERVED=$(MICROPY_HW_FLASH_RESERVED )
@@ -46,9 +54,10 @@ include $(TOP)/py/py.mk
46
54
GIT_SUBMODULES = lib/tinyusb lib/nxp_driver lib/lwip lib/mbedtls
47
55
48
56
MCU_DIR = lib/nxp_driver/sdk/devices/$(MCU_SERIES )
49
- LD_FILES = boards/$( MCU_SERIES ) .ld boards/ common.ld
57
+ LD_FILES = boards/common.ld
50
58
51
59
MAKE_PINS = boards/make-pins.py
60
+ PATCH_BINARY = bootloader/tools/patch-binary.py
52
61
MAKE_FLEXRAM_LD = boards/make-flexram-config.py
53
62
BOARD_PINS = $(BOARD_DIR ) /pins.csv
54
63
AF_FILE = boards/$(MCU_SERIES ) _af.csv
@@ -76,20 +85,45 @@ INC += -I$(TOP)/lib/oofatfs
76
85
INC += -I$(TOP ) /lib/tinyusb/hw
77
86
INC += -I$(TOP ) /lib/tinyusb/hw/bsp/teensy_40
78
87
INC += -I$(TOP ) /lib/tinyusb/src
88
+ INC += -I$(BOOTLOADER_DIR ) /shared
79
89
80
90
CFLAGS_MCU = -mtune=cortex-m7 -mcpu=cortex-m7 -mfloat-abi=hard -mfpu=fpv5-d16
81
- CFLAGS += $(INC ) -Wall -Werror -Wdouble-promotion -Wfloat-conversion -std=c99 -nostdlib -mthumb $(CFLAGS_MCU )
82
- CFLAGS += -DCPU_$(MCU_SERIES ) -DCPU_$(MCU_VARIANT ) -DBOARD_$(BOARD )
83
- CFLAGS += -DXIP_EXTERNAL_FLASH=1 \
84
- -DXIP_BOOT_HEADER_ENABLE=1 \
85
- -DFSL_SDK_ENABLE_DRIVER_CACHE_CONTROL=1 \
86
- -DCFG_TUSB_MCU=OPT_MCU_MIMXRT10XX \
91
+ CFLAGS_COMMON = -Wall -Werror -Wdouble-promotion -Wfloat-conversion -std=c99 -nostdlib -mthumb -fdata-sections -ffunction-sections
92
+
93
+
94
+ # Tune for Debugging or Optimization
95
+ ifeq ($(DEBUG ) ,1)
96
+ CFLAGS_DEBUG += -Og -ggdb
97
+ else
98
+ CFLAGS_DEBUG += -Os -DNDEBUG
99
+ endif
100
+
101
+ CFLAGS_DEFINES_COMMON += \
102
+ -D__START=main \
87
103
-D__STARTUP_CLEAR_BSS \
88
104
-D__STARTUP_INITIALIZE_RAMFUNCTION \
89
- -D__START=main \
105
+ -DBOARD_$(BOARD ) \
106
+ -DCFG_TUSB_MCU=OPT_MCU_MIMXRT10XX \
107
+ -DCPU_$(MCU_SERIES ) \
108
+ -DCPU_$(MCU_VARIANT ) \
90
109
-DCPU_HEADER_H='<$(MCU_SERIES ) .h>' \
91
- -DBOARD_FLASH_SIZE= $( MICROPY_HW_FLASH_SIZE ) \
110
+ -DFSL_SDK_ENABLE_DRIVER_CACHE_CONTROL=1 \
92
111
-DMICROPY_HW_FLASH_SIZE=$(MICROPY_HW_FLASH_SIZE ) \
112
+ -DXIP_BOOT_HEADER_ENABLE=1 \
113
+ -DXIP_EXTERNAL_FLASH=1
114
+
115
+
116
+ CFLAGS_DEFINES_FW += \
117
+ -DBOARD_FLASH_SIZE=$(MICROPY_HW_FLASH_SIZE ) \
118
+ -DMICROPY_BOOTLOADER_BINARY='"$(BUILD_BL ) /bootloader.bin"'
119
+
120
+ CFLAGS += \
121
+ $(CFLAGS_COMMON ) \
122
+ $(CFLAGS_DEBUG ) \
123
+ $(CFLAGS_DEFINES_COMMON ) \
124
+ $(CFLAGS_DEFINES_FW ) \
125
+ $(CFLAGS_MCU ) \
126
+ $(INC )
93
127
94
128
ifeq ($(MICROPY_PY_MACHINE_SDCARD ) ,1)
95
129
CFLAGS += -DMICROPY_PY_MACHINE_SDCARD=1
@@ -112,20 +146,10 @@ endif
112
146
SUPPORTS_HARDWARE_FP_SINGLE = 0
113
147
SUPPORTS_HARDWARE_FP_DOUBLE = 0
114
148
115
- LDFLAGS = -Map=$@ .map --cref --print-memory-usage
116
- LDDEFINES = $(addprefix -D, $(LD_MEMORY_CONFIG_DEFINES ) )
149
+ LDFLAGS = -Map=$@ .map --cref --print-memory-usage --gc-sections
150
+ LDDEFINES = $(addprefix -D, $(LD_MEMORY_CONFIG_DEFINES ) BOARD_LINKER_SCRIPT_H=\" $( MCU_SERIES ) .ld\" BOOTLOADER_ENABLED=1 )
117
151
LIBS = $(shell $(CC ) $(CFLAGS ) -print-libgcc-file-name)
118
152
119
- # Tune for Debugging or Optimization
120
- ifeq ($(DEBUG ) ,1)
121
- CFLAGS += -Og -ggdb
122
- LDFLAGS += --gc-sections
123
- CFLAGS += -fdata-sections -ffunction-sections
124
- else
125
- CFLAGS += -Os -DNDEBUG
126
- LDFLAGS += --gc-sections
127
- CFLAGS += -fdata-sections -ffunction-sections
128
- endif
129
153
130
154
# All settings for Ethernet support are controller by the value of MICROPY_PY_LWIP
131
155
ifeq ($(MICROPY_PY_LWIP ) , 1)
@@ -205,8 +229,38 @@ SRC_HAL_IMX_C += $(MCU_DIR)/drivers/fsl_usdhc.c
205
229
endif
206
230
207
231
ifeq ($(MCU_SERIES ) ,$(filter $(MCU_SERIES ) , MIMXRT1015 MIMXRT1021 MIMXRT1052 MIMXRT1062 MIMXRT1064) )
208
- SRC_HAL_IMX_C += \
209
- $(MCU_DIR ) /drivers/fsl_qtmr.c
232
+ SRC_HAL_IMX_C += $(MCU_DIR ) /drivers/fsl_qtmr.c
233
+ endif
234
+
235
+ SRC_C_COMMON += \
236
+ flash.c
237
+
238
+ ifeq ($(MICROPY_HW_FLASH_TYPE ) , qspi_nor)
239
+ CFLAGS_DEFINES_COMMON += -DBOARD_FLASH_OPS_HEADER_H=\"hal/flexspi_nor_flash.h\"
240
+ SRC_C_COMMON += hal/flexspi_nor_flash.c
241
+
242
+ ifeq ($(MICROPY_HW_BOARD_FLASH_FILES ) , 1)
243
+ CFLAGS_DEFINES_COMMON += -DBOARD_FLASH_CONFIG_HEADER_H=\"$(BOARD ) _flexspi_flash_config.h\"
244
+ SRC_C_COMMON += $(BOARD_DIR ) /qspi_nor_flash_config.c
245
+ else
246
+ CFLAGS_DEFINES_COMMON += -DBOARD_FLASH_CONFIG_HEADER_H=\"hal/flexspi_flash_config.h\"
247
+ SRC_C_COMMON += hal/qspi_nor_flash_config.c
248
+ endif
249
+ #
250
+ else ifeq ($(MICROPY_HW_FLASH_TYPE), hyperflash)
251
+ CFLAGS_DEFINES_COMMON += -DBOARD_FLASH_OPS_HEADER_H=\"hal/flexspi_hyper_flash.h\"
252
+ SRC_C_COMMON += hal/flexspi_hyper_flash.c
253
+
254
+ ifeq ($(MICROPY_HW_BOARD_FLASH_FILES ) , 1)
255
+ CFLAGS_DEFINES_COMMON += -DBOARD_FLASH_CONFIG_HEADER_H=\"$(BOARD ) _flexspi_flash_config.h\"
256
+ SRC_C_COMMON += $(BOARD_DIR ) /qspi_hyper_flash_config.c
257
+ else
258
+ CFLAGS_DEFINES_COMMON += -DBOARD_FLASH_CONFIG_HEADER_H=\"hal/flexspi_flash_config.h\"
259
+ SRC_C_COMMON += hal/qspi_hyper_flash_config.c
260
+ endif
261
+ #
262
+ else
263
+ $(error Error : Unknown board flash type $(MICROPY_HW_FLASH_TYPE ) )
210
264
endif
211
265
212
266
SRC_C += \
@@ -262,37 +316,10 @@ SRC_C += \
262
316
systick.c \
263
317
ticks.c \
264
318
tusb_port.c \
265
- $(SRC_TINYUSB_C ) \
319
+ $(SRC_C_COMMON ) \
266
320
$(SRC_HAL_IMX_C ) \
267
321
$(SRC_ETH_C ) \
268
-
269
- ifeq ($(MICROPY_HW_FLASH_TYPE ) , qspi_nor)
270
- CFLAGS += -DBOARD_FLASH_OPS_HEADER_H=\"hal/flexspi_nor_flash.h\"
271
- SRC_C += hal/flexspi_nor_flash.c
272
-
273
- ifeq ($(MICROPY_HW_BOARD_FLASH_FILES ) , 1)
274
- CFLAGS += -DBOARD_FLASH_CONFIG_HEADER_H=\"$(BOARD ) _flexspi_flash_config.h\"
275
- SRC_C += $(BOARD_DIR ) /qspi_nor_flash_config.c
276
- else
277
- CFLAGS += -DBOARD_FLASH_CONFIG_HEADER_H=\"hal/flexspi_flash_config.h\"
278
- SRC_C += hal/qspi_nor_flash_config.c
279
- endif
280
- #
281
- else ifeq ($(MICROPY_HW_FLASH_TYPE), hyperflash)
282
- CFLAGS += -DBOARD_FLASH_OPS_HEADER_H=\"hal/flexspi_hyper_flash.h\"
283
- SRC_C += hal/flexspi_hyper_flash.c
284
-
285
- ifeq ($(MICROPY_HW_BOARD_FLASH_FILES ) , 1)
286
- CFLAGS += -DBOARD_FLASH_CONFIG_HEADER_H=\"$(BOARD ) _flexspi_flash_config.h\"
287
- SRC_C += $(BOARD_DIR ) /qspi_hyper_flash_config.c
288
- else
289
- CFLAGS += -DBOARD_FLASH_CONFIG_HEADER_H=\"hal/flexspi_flash_config.h\"
290
- SRC_C += hal/qspi_hyper_flash_config.c
291
- endif
292
- #
293
- else
294
- $(error Error : Unknown board flash type $(MICROPY_HW_FLASH_TYPE ) )
295
- endif
322
+ $(SRC_TINYUSB_C )
296
323
297
324
ifeq ($(MICROPY_FLOAT_IMPL ) ,double)
298
325
LIBM_SRC_C += $(addprefix lib/libm_dbl/,\
@@ -425,20 +452,35 @@ OBJ += $(addprefix $(BUILD)/, $(SRC_SS:.S=.o))
425
452
OBJ += $(addprefix $(BUILD ) /, $(SRC_MOD:.c=.o ) )
426
453
OBJ += $(BUILD ) /pins_gen.o
427
454
455
+ include bootloader.mk
456
+
428
457
# Workaround for bug in older gcc, warning on "static usbd_device_t _usbd_dev = { 0 };"
429
458
$(BUILD ) /lib/tinyusb/src/device/usbd.o : CFLAGS += -Wno-missing-braces
430
459
431
- all : $(BUILD ) /firmware.hex $(BUILD ) /firmware.bin
460
+ all : $(BUILD ) /firmware.bin $(BUILD ) /firmware.hex
432
461
433
462
$(BUILD ) /firmware.elf : $(OBJ )
434
- $(ECHO ) " PREPROCESS LINK $@ "
463
+ $(ECHO ) " GENERATING $( BUILD ) /link.ld "
435
464
$(Q )$(CC ) -E -x c $(LDDEFINES ) $(LD_FILES ) | grep -v ' ^#' > $(BUILD ) /link.ld
436
- $(ECHO ) " LINK $@ "
465
+ $(ECHO ) " LINKING $@ "
437
466
$(Q )$(LD ) -T$(BUILD ) /link.ld $(LDFLAGS ) -o $@ $^ $(LIBS )
467
+ $(ECHO ) " "
468
+ $(ECHO ) " UPDATE SECTION .fw_header"
469
+ $(Q )$(OBJCOPY ) -O binary $@ $(BUILD ) /temp_firmware.bin
470
+ $(Q )$(PYTHON ) $(PATCH_BINARY ) $(BUILD ) /temp_firmware.bin $(BUILD ) /fw_header.bin 1024 $$(($(MICROPY_BOOT_BUFFER_SIZE ) ) )
471
+ $(Q )$(OBJCOPY ) $@ --update-section .fw_header=$(BUILD ) /fw_header.bin
472
+ $(ECHO ) " $( BUILD) /fw_header.bin ==> .fw_header"
473
+ $(ECHO ) " "
474
+ $(ECHO ) " UPDATE SECTION .bootloader"
475
+ $(Q )$(OBJCOPY ) $@ --update-section .bootloader=$(BUILD_BL ) /bootloader.bin
476
+ $(ECHO ) " $( BUILD_BL) /bootloader.bin ==> .bootloader"
477
+ $(ECHO ) " "
478
+ $(ECHO ) " OUTPUT INFO"
438
479
$(Q )$(SIZE ) $@
480
+ $(ECHO ) " "
439
481
440
482
$(BUILD ) /firmware.bin : $(BUILD ) /firmware.elf
441
- $(Q )$(OBJCOPY ) -O binary $^ $@
483
+ $(Q )$(OBJCOPY ) -O binary $< $@
442
484
443
485
$(BUILD ) /firmware.hex : $(BUILD ) /firmware.elf
444
486
$(Q )$(OBJCOPY ) -O ihex -R .eeprom $< $@
@@ -448,7 +490,7 @@ $(BUILD)/firmware.hex: $(BUILD)/firmware.elf
448
490
# any of the objects. The normal dependency generation will deal with the
449
491
# case when pins.h is modified. But when it doesn't exist, we don't know
450
492
# which source files might need it.
451
- $(OBJ ) : | $(GEN_PINS_HDR ) $(GEN_FLEXRAM_CONFIG_SRC )
493
+ $(OBJ ) : | $(BUILD_BL ) /bootloader.bin $( BUILD_BL ) /bootloader.hex $( GEN_PINS_HDR ) $(GEN_FLEXRAM_CONFIG_SRC )
452
494
453
495
# With conditional pins, we may need to regenerate qstrdefs.h when config
454
496
# options change.
@@ -459,7 +501,6 @@ $(GEN_FLEXRAM_CONFIG_SRC):
459
501
$(Q )$(PYTHON ) $(MAKE_FLEXRAM_LD ) -d $(TOP ) /$(MCU_DIR ) /$(MCU_SERIES ) .h \
460
502
-f $(TOP ) /$(MCU_DIR ) /$(MCU_SERIES ) _features.h -l boards/$(MCU_SERIES ) .ld -c $(MCU_SERIES ) > $(GEN_FLEXRAM_CONFIG_SRC )
461
503
462
-
463
504
# Use a pattern rule here so that make will only call make-pins.py once to make
464
505
# both pins_gen.c and pins.h
465
506
$(BUILD ) /% _gen.c $(HEADER_BUILD ) /% .h : $(BOARD_PINS ) $(MAKE_PINS ) $(AF_FILE ) $(PREFIX_FILE ) | $(HEADER_BUILD )
0 commit comments