8000 mimxrt/mboot: Adds bootloader support. · alphaFred/micropython@19b7831 · GitHub
[go: up one dir, main page]

Skip to content

Commit 19b7831

Browse files
committed
mimxrt/mboot: Adds bootloader support.
Adds DFU bootloader for mimxrt port. The bootloader binary is packaged into the "normal" firmware binary. Therefore when setting up a new board the bootloader will be available automatically by just loading the normal firmware binary onto it. Signed-off-by: Philipp Ebensberger
1 parent e84825b commit 19b7831

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+3427
-186
lines changed

ports/mimxrt/Makefile

Lines changed: 53 additions & 13 deletions
F438
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
BOARD ?= TEENSY40
66
BOARD_DIR ?= boards/$(BOARD)
7+
BOOTLOADER_DIR ?= mboot
78
BUILD ?= build-$(BOARD)
89
PORT ?= /dev/ttyACM0
910
CROSS_COMPILE ?= arm-none-eabi-
@@ -39,24 +40,28 @@ include $(TOP)/extmod/extmod.mk
3940
MCU_DIR = lib/nxp_driver/sdk/devices/$(MCU_SERIES)
4041

4142
# Select linker scripts based on MCU_SERIES
42-
LD_FILES = boards/$(MCU_SERIES).ld boards/common.ld
43+
LD_FILES = boards/common.ld
4344

4445
# Parameter configurations for generation
4546
AF_FILE = boards/$(MCU_SERIES)_af.csv
4647
BOARD_PINS = $(BOARD_DIR)/pins.csv
4748
PREFIX_FILE = boards/mimxrt_prefix.c
49+
PATCH_BINARY = mboot/tools/patch-binary.py
4850
GEN_FLEXRAM_CONFIG_SRC = $(BUILD)/flexram_config.s
4951
GEN_PINS_AF_CONST = $(HEADER_BUILD)/pins_af_const.h
5052
GEN_PINS_AF_PY = $(BUILD)/pins_af.py
5153
GEN_PINS_HDR = $(HEADER_BUILD)/pins.h
5254
GEN_PINS_QSTR = $(BUILD)/pins_qstr.h
5355
GEN_PINS_SRC = $(BUILD)/pins_gen.c
56+
# Include mboot make definitions
57+
include mboot.mk
5458

5559
# =============================================================================
5660
# Includes
5761
# =============================================================================
5862

5963
INC += -I$(BOARD_DIR)
64+
INC += -I$(BOOTLOADER_DIR)/shared
6065
INC += -I$(BUILD)
6166
INC += -I$(TOP)
6267
INC += -I$(TOP)/$(MCU_DIR)
@@ -147,6 +152,9 @@ endif
147152

148153
# C source files
149154
SRC_C += \
155+
$(SRC_ETH_C) \
156+
$(SRC_HAL_IMX_C) \
157+
$(SRC_TINYUSB_C) \
150158
board_init.c \
151159
boards/$(MCU_SERIES)_clock_config.c \
152160
dma_manager.c \
@@ -201,10 +209,12 @@ SRC_C += \
201209
shared/timeutils/timeutils.c \
202210
systick.c \
203211
ticks.c \
204-
tusb_port.c \
205-
$(SRC_TINYUSB_C) \
206-
$(SRC_HAL_IMX_C) \
207-
$(SRC_ETH_C)
212+
tusb_port.c
213+
214+
# Set default values if optional variables not defined
215+
ifndef MICROPY_HW_BOARD_FLASH_FILES
216+
MICROPY_HW_BOARD_FLASH_FILES = 0
217+
endif
208218

209219
# Add sources for respective board flash type
210220
ifeq ($(MICROPY_HW_FLASH_TYPE),$(filter $(MICROPY_HW_FLASH_TYPE),qspi_nor_flash qspi_hyper_flash))
@@ -221,6 +231,15 @@ else
221231
$(error Error: Unknown board flash type $(MICROPY_HW_FLASH_TYPE))
222232
endif
223233

234+
235+
# Set default values if optional variables not defined
236+
ifndef SUPPORTS_HARDWARE_FP_DOUBLE
237+
SUPPORTS_HARDWARE_FP_DOUBLE = 0
238+
endif
239+
ifndef SUPPORTS_HARDWARE_FP_SINGLE
240+
SUPPORTS_HARDWARE_FP_SINGLE = 0
241+
endif
242+
224243
# Math library source files
225244
ifeq ($(MICROPY_FLOAT_IMPL),double)
226245
LIBM_SRC_C += $(addprefix lib/libm_dbl/,\
@@ -246,10 +265,6 @@ else
246265
endif
247266
endif
248267

249-
# Reset variables
250-
SUPPORTS_HARDWARE_FP_SINGLE = 0
251-
SUPPORTS_HARDWARE_FP_DOUBLE = 0
252-
253268
# Assembly source files
254269
SRC_SS = \
255270
$(MCU_DIR)/gcc/startup_$(MCU_SERIES).S \
@@ -405,7 +420,20 @@ LDFLAGS = \
405420

406421
LDDEFINES = \
407422
-DMICROPY_HW_FLASH_TYPE=$(MICROPY_HW_FLASH_TYPE) \
408-
-DMICROPY_HW_FLASH_SIZE=$(MICROPY_HW_FLASH_SIZE)
423+
-DMICROPY_HW_FLASH_SIZE=$(MICROPY_HW_FLASH_SIZE) \
424+
-DBOARD_LINKER_SCRIPT_H=\"$(MCU_SERIES).ld\" \
425+
-DBOOTLOADER_ENABLED=1
426+
427+
# Start of firmware is dependent on board flash type. Bootloader requires at least 32kB.
428+
# Firmware start has to be aligned to sector size to allow erase of firmware without affecting the bootloader.
429+
# Sector size is different between QPSI flash (4kB) and HyperFlash (256kB) devices!
430+
ifeq ($(MICROPY_HW_FLASH_TYPE),qspi_nor_flash)
431+
LDDEFINES += -DMICROPY_HW_FLASH_FIRMWARE_START_ADDR=0x00008000
432+
else ifeq ($(MICROPY_HW_FLASH_TYPE),qspi_hyper_flash)
433+
LDDEFINES += -DMICROPY_HW_FLASH_FIRMWARE_START_ADDR=0x00040000
434+
else
435+
$(error Error: Unknown board flash type $(MICROPY_HW_FLASH_TYPE))
436+
endif
409437

410438
ifdef MICROPY_HW_FLASH_RESERVED
411439
LDDEFINES += -DMICROPY_HW_FLASH_RESERVED=$(MICROPY_HW_FLASH_RESERVED)
@@ -454,10 +482,23 @@ $(BUILD)/firmware.elf: $(OBJ)
454482
$(Q)$(CC) -E -x c $(LDDEFINES) $(LD_FILES) | grep -v '^#' > $(BUILD)/link.ld
455483
$(ECHO) "LINK $@"
456484
$(Q)$(LD) -T$(BUILD)/link.ld $(LDFLAGS) -o $@ $^ $(LIBS)
485+
$(ECHO) ""
486+
$(ECHO) "UPDATE SECTION .fw_header"
487+
$(Q)$(OBJCOPY) -O binary $@ $(BUILD)/temp_firmware.bin
488+
$(Q)$(PYTHON) $(PATCH_BINARY) $(BUILD)/temp_firmware.bin $(BUILD)/fw_header.bin 1024 $$(($(MICROPY_BOOT_BUFFER_SIZE)))
489+
$(Q)$(OBJCOPY) $@ --update-section .fw_header=$(BUILD)/fw_header.bin
490+
$(ECHO) "$(BUILD)/fw_header.bin ==> .fw_header"
491+
$(ECHO) ""
492+
$(ECHO) "UPDATE SECTION .mboot"
493+
$(Q)$(OBJCOPY) $@ --update-section .mboot=$(BUILD_BL)/mboot.bin
494+
$(ECHO) "$(BUILD_BL)/mboot.bin ==> .mboot"
495+
$(ECHO) ""
496+
$(ECHO) "OUTPUT INFO"
457497
$(Q)$(SIZE) $@
498+
$(ECHO) ""
458499

459500
$(BUILD)/firmware.bin: $(BUILD)/firmware.elf
460-
$(Q)$(OBJCOPY) -O binary $^ $@
501+
$(Q)$(OBJCOPY) -O binary $< $@
461502

462503
$(BUILD)/firmware.hex: $(BUILD)/firmware.elf
463504
$(Q)$(OBJCOPY) -O ihex -R .eeprom $< $@
@@ -467,7 +508,7 @@ $(BUILD)/firmware.hex: $(BUILD)/firmware.elf
467508
# any of the objects. The normal dependency generation will deal with the
468509
# case when pins.h is modified. But when it doesn't exist, we don't know
469510
# which source files might need it.
470-
$(OBJ): | $(GEN_PINS_HDR) $(GEN_FLEXRAM_CONFIG_SRC)
511+
$(OBJ): | $(BUILD_BL)/mboot.bin $(BUILD_BL)/mboot.hex $(GEN_PINS_HDR) $(GEN_FLEXRAM_CONFIG_SRC)
471512

472513
# With conditional pins, we may need to regenerate qstrdefs.h when config
473514
# options change.
@@ -478,7 +519,6 @@ $(GEN_FLEXRAM_CONFIG_SRC):
478519
$(Q)$(PYTHON) $(MAKE_FLEXRAM_LD) -d $(TOP)/$(MCU_DIR)/$(MCU_SERIES).h \
479520
-f $(TOP)/$(MCU_DIR)/$(MCU_SERIES)_features.h -l boards/$(MCU_SERIES).ld -c $(MCU_SERIES) > $(GEN_FLEXRAM_CONFIG_SRC)
480521

481-
482522
# Use a pattern rule here so that make will only call make-pins.py once to make
483523
# both pins_gen.c and pins.h
484524
$(BUILD)/%_gen.c $(HEADER_BUILD)/%.h: $(BOARD_PINS) $(MAKE_PINS) $(AF_FILE) $(PREFIX_FILE) | $(HEADER_BUILD)

ports/mimxrt/boards/MIMXRT1010_EVK/mpconfigboard.mk

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ MICROPY_PY_MACHINE_SDCARD = 0
66
MICROPY_HW_FLASH_TYPE = qspi_nor_flash
77
MICROPY_HW_FLASH_SIZE = 0x1000000 # 16MB
88

9+
MICROPY_BOOT_BUFFER_SIZE = (32 * 1024)
10+
911
JLINK_PATH ?= /media/RT1010-EVK/
1012
JLINK_COMMANDER_SCRIPT = $(BUILD)/script.jlink
1113

ports/mimxrt/boards/MIMXRT1011.ld

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,16 @@ reserved_size = MICROPY_HW_FLASH_RESERVED;
44
#endif
55

66
#if MICROPY_HW_FLASH_TYPE == qspi_nor_flash
7-
flash_start = 0x60000000;
7+
flash_start 10000 = 0x60000000;
8+
flash_size = MICROPY_HW_FLASH_SIZE;
89
#else
9-
#error Unknown MICROPY_HW_FLASH_TYPE
10+
#error Unknown MICROPY_HW_FLASH_TYPE
1011
#endif
11-
flash_size = MICROPY_HW_FLASH_SIZE;
12-
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));
12+
13+
/* MIMXRT1011 requires different offset for flash configuration */
1314
flash_config_start = flash_start + 0x00000400;
1415
flash_config_size = 0x00000C00;
15-
ivt_start = flash_start + 0x00001000;
16-
ivt_size = 0x00001000;
17-
interrupts_start = flash_start + 0x00002000;
18-
interrupts_size = 0x00000400;
19-
text_start = flash_start + 0x00002400;
20-
vfs_start = flash_start + 0x00100000;
21-
text_size = ((vfs_start) - (text_start));
22-
vfs_size = ((flash_end) - (vfs_start));
16+
2317
itcm_start = 0x00000000;
2418
itcm_size = 0x00008000;
2519
dtcm_start = 0x20000000;
@@ -29,12 +23,6 @@ ocrm_size = 0x00010000;
2923

3024
/* 20kiB stack. */
3125
__stack_size__ = 0x5000;
32-
_estack = __StackTop;
33-
_sstack = __StackLimit;
3426

3527
/* Do not use the traditional C heap. */
3628
__heap_size__ = 0;
37-
38-
/* Use second OCRAM bank for GC heap. */
39-
_gc_heap_start = ORIGIN(m_ocrm);
40-
_gc_heap_end = ORIGIN(m_ocrm) + LENGTH(m_ocrm);

ports/mimxrt/boards/MIMXRT1015.ld

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,15 @@
11
/* Memory configuration */
2-
#if defined MICROPY_HW_FLASH_RESERVED
2+
#if MICROPY_HW_FLASH_RESERVED
33
reserved_size = MICROPY_HW_FLASH_RESERVED;
44
#endif
55

66
#if MICROPY_HW_FLASH_TYPE == qspi_nor_flash
7-
flash_start = 0x60000000;
7+
flash_start = 0x60000000;
8+
flash_size = MICROPY_HW_FLASH_SIZE;
89
#else
9-
#error Unknown MICROPY_HW_FLASH_TYPE
10+
#error Unknown MICROPY_HW_FLASH_TYPE
1011
#endif
11-
flash_size = MICROPY_HW_FLASH_SIZE;
12-
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));
13-
flash_config_start = flash_start;
14-
flash_config_size = 0x00001000;
15-
ivt_start = flash_start + 0x00001000;
16-
ivt_size = 0x00001000;
17-
interrupts_start = flash_start + 0x00002000;
18-
interrupts_size = 0x00000400;
19-
text_start = flash_start + 0x00002400;
20-
vfs_start = flash_start + 0x00100000;
21-
text_size = ((vfs_start) - (text_start));
22-
vfs_size = ((flash_end) - (vfs_start));
12+
2313
itcm_start = 0x00000000;
2414
itcm_size = 0x00008000;
2515
dtcm_start = 0x20000000;
@@ -29,10 +19,3 @@ ocrm_size = 0x00010000;
2919

3020
/* 24kiB stack. */
3121
__stack_size__ = 0x5000;
32-
_estack = __StackTop;
33-
_sstack = __StackLimit;
34-
35-
/* Use second OCRAM bank for GC heap. */
36-
/* Use all OCRAM for the GC heap. */
37-
_gc_heap_start = ORIGIN(m_ocrm);
38-
_gc_heap_end = ORIGIN(m_ocrm) + LENGTH(m_ocrm);

ports/mimxrt/boards/MIMXRT1020_EVK/mpconfigboard.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ MICROPY_HW_FLASH_SIZE = 0x800000 # 8MB
99
MICROPY_HW_SDRAM_AVAIL = 1
1010
MICROPY_HW_SDRAM_SIZE = 0x2000000 # 32MB
1111

12+
MICROPY_BOOT_BUFFER_SIZE = (32 * 1024)
1213
MICROPY_PY_LWIP = 1
1314
MICROPY_PY_USSL = 1
1415
MICROPY_SSL_MBEDTLS = 1

ports/mimxrt/boards/MIMXRT1021.ld

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,15 @@
11
/* Memory configuration */
2-
#if defined MICROPY_HW_FLASH_RESERVED
2+
#if MICROPY_HW_FLASH_RESERVED
33
reserved_size = MICROPY_HW_FLASH_RESERVED;
44
#endif
55

66
#if MICROPY_HW_FLASH_TYPE == qspi_nor_flash
7-
flash_start = 0x60000000;
7+
flash_start = 0x60000000;
8+
flash_size = MICROPY_HW_FLASH_SIZE;
89
#else
9-
#error Unknown MICROPY_HW_FLASH_TYPE
10+
#error Unknown MICROPY_HW_FLASH_TYPE
1011
#endif
11-
flash_size = MICROPY_HW_FLASH_SIZE;
12-
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));
13-
flash_config_start = flash_start;
14-
flash_config_size = 0x00001000;
15-
ivt_start = flash_start + 0x00001000;
16-
ivt_size = 0x00001000;
17-
interrupts_start = flash_start + 0x00002000;
18-
interrupts_size = 0x00000400;
19-
text_start = flash_start + 0x00002400;
20-
vfs_start = flash_start + 0x00100000;
21-
text_size = ((vfs_start) - (text_start));
22-
vfs_size = ((flash_end) - (vfs_start));
12+
2313
itcm_start = 0x00000000;
2414
itcm_size = 0x00010000;
2515
dtcm_start = 0x20000000;
@@ -34,15 +24,3 @@ sdram_size = MICROPY_HW_SDRAM_SIZE;
3424

3525
/* 24kiB stack. */
3626
__stack_size__ = 0x6000;
37-
_estack = __StackTop;
38-
_sstack = __StackLimit;
39-
40-
#if MICROPY_HW_SDRAM_AVAIL
41-
_gc_heap_start = ORIGIN(m_sdram);
42-
_gc_heap_end = ORIGIN(m_sdram) + LENGTH(m_sdram);
43-
#else
44-
/* Use second OCRAM bank for GC heap. */
45-
/* Use all OCRAM for the GC heap. */
46-
_gc_heap_start = ORIGIN(m_ocrm);
47-
_gc_heap_end = ORIGIN(m_ocrm) + LENGTH(m_ocrm);
48-
#endif

ports/mimxrt/boards/MIMXRT1050_EVK/mpconfigboard.mk

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ MICROPY_HW_FLASH_SIZE = 0x4000000 # 64MB
99
MICROPY_HW_SDRAM_AVAIL = 1
1010
MICROPY_HW_SDRAM_SIZE = 0x2000000 # 32MB
1111

12+
MICROPY_BOOT_BUFFER_SIZE = (64 * 1024)
13+
1214
MICROPY_PY_LWIP = 1
1315
MICROPY_PY_USSL = 1
1416
MICROPY_SSL_MBEDTLS = 1

ports/mimxrt/boards/MIMXRT1052.ld

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,16 @@ reserved_size = MICROPY_HW_FLASH_RESERVED;
44
#endif
55

66
#if MICROPY_HW_FLASH_TYPE == qspi_nor_flash
7-
flash_start = 0x60000000;
7+
flash_start = 0x60000000;
8+
flash_size = MICROPY_HW_FLASH_SIZE;
89
#elif MICROPY_HW_FLASH_TYPE == qspi_hyper_flash
9-
flash_start = 0x60000000;
10+
flash_start = 0x60000000;
11+
flash_size = MICROPY_HW_FLASH_SIZE;
1012
#else
11-
#error Unknown MICROPY_HW_FLASH_TYPE
13+
#error Unknown MICROPY_HW_FLASH_TYPE
1214
#endif
13-
flash_size = MICROPY_HW_FLASH_SIZE;
14-
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));
15-
flash_config_start = flash_start;
16-
flash_config_size = 0x00001000;
17-
ivt_start = flash_start + 0x00001000;
18-
ivt_size = 0x00001000;
19-
interrupts_start = flash_start + 0x00002000;
20-
interrupts_size = 0x00000400;
21-
text_start = flash_start + 0x00002400;
15+
2216
vfs_start = flash_start + 0x00200000;
23-
text_size = ((vfs_start) - (text_start));
24-
vfs_size = ((flash_end) - (vfs_start));
2517
itcm_start = 0x00000000;
2618
itcm_size = 0x00020000;
2719
dtcm_start = 0x20000000;
@@ -36,14 +28,3 @@ sdram_size = MICROPY_HW_SDRAM_SIZE;
3628

3729
/* 24kiB stack. */
3830
__stack_size__ = 0x6000;
39-
_estack = __StackTop;
40-
_sstack = __StackLimit;
41-
42-
#if MICROPY_HW_SDRAM_AVAIL
43-
_gc_heap_start = ORIGIN(m_sdram);
44-
_gc_heap_end = ORIGIN(m_sdram) + LENGTH(m_sdram);
45-
#else
46-
/* Use second OCRAM bank for GC heap. */
47-
_gc_heap_start = ORIGIN(m_ocrm);
48-
_gc_heap_end = ORIGIN(m_ocrm) + LENGTH(m_ocrm);
49-
#endif

ports/mimxrt/boards/MIMXRT1060_EVK/mpconfigboard.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ MICROPY_HW_FLASH_SIZE = 0x800000 # 8MB
99
MICROPY_HW_SDRAM_AVAIL = 1
1010
MICROPY_HW_SDRAM_SIZE = 0x2000000 # 32MB
1111

12+
MICROPY_BOOT_BUFFER_SIZE = (64 * 1024)
1213
MICROPY_PY_LWIP = 1
1314
MICROPY_PY_USSL = 1
1415
MICROPY_SSL_MBEDTLS = 1

0 commit comments

Comments
 (0)
0