8000 mimxrt/mboot: Adds bootloader support. by alphaFred · Pull Request #8229 · micropython/micropython · GitHub
[go: up one dir, main page]

Skip to content

mimxrt/mboot: Adds bootloader support. #8229

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 54 additions & 13 deletions ports/mimxrt/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

BOARD ?= TEENSY40
BOARD_DIR ?= boards/$(BOARD)
BOOTLOADER_DIR ?= mboot
BUILD ?= build-$(BOARD)
PORT ?= /dev/ttyACM0
CROSS_COMPILE ?= arm-none-eabi-
Expand Down Expand Up @@ -39,24 +40,28 @@ include $(TOP)/extmod/extmod.mk
MCU_DIR = lib/nxp_driver/sdk/devices/$(MCU_SERIES)

# Select linker scripts based on MCU_SERIES
LD_FILES = boards/$(MCU_SERIES).ld boards/common.ld
LD_FILES = boards/common.ld

# Parameter configurations for generation
AF_FILE = boards/$(MCU_SERIES)_af.csv
BOARD_PINS = $(BOARD_DIR)/pins.csv
PREFIX_FILE = boards/mimxrt_prefix.c
PATCH_BINARY = mboot/tools/patch-binary.py
GEN_FLEXRAM_CONFIG_SRC = $(BUILD)/flexram_config.s
GEN_PINS_AF_CONST = $(HEADER_BUILD)/pins_af_const.h
GEN_PINS_AF_PY = $(BUILD)/pins_af.py
GEN_PINS_HDR = $(HEADER_BUILD)/pins.h
GEN_PINS_QSTR = $(BUILD)/pins_qstr.h
GEN_PINS_SRC = $(BUILD)/pins_gen.c
# Include mboot make definitions
include mboot.mk

# =============================================================================
# Includes
# =============================================================================

INC += -I$(BOARD_DIR)
INC += -I$(BOOTLOADER_DIR)/shared
INC += -I$(BUILD)
INC += -I$(TOP)
INC += -I$(TOP)/$(MCU_DIR)
Expand Down Expand Up @@ -147,6 +152,9 @@ endif

# C source files
SRC_C += \
$(SRC_ETH_C) \
$(SRC_HAL_IMX_C) \
$(SRC_TINYUSB_C) \
board_init.c \
boards/$(MCU_SERIES)_clock_config.c \
dma_manager.c \
Expand All @@ -158,6 +166,7 @@ SRC_C += \
extmod/modusocket.c \
extmod/uos_dupterm.c \
fatfs_port.c \
flash.c \
hal/pwm_backport.c \
led.c \
machine_adc.c \
Expand Down Expand Up @@ -200,10 +209,12 @@ SRC_C += \
shared/timeutils/timeutils.c \
systick.c \
ticks.c \
tusb_port.c \
$(SRC_TINYUSB_C) \
$(SRC_HAL_IMX_C) \
$(SRC_ETH_C)
tusb_port.c

# Set default values if optional variables not defined
ifndef MICROPY_HW_BOARD_FLASH_FILES
MICROPY_HW_BOARD_FLASH_FILES = 0
endif

# Add sources for respective board flash type
ifeq ($(MICROPY_HW_FLASH_TYPE),$(filter $(MICROPY_HW_FLASH_TYPE),qspi_nor_flash qspi_hyper_flash))
Expand All @@ -220,6 +231,15 @@ else
$(error Error: Unknown board flash type $(MICROPY_HW_FLASH_TYPE))
endif


# Set default values if optional variables not defined
ifndef SUPPORTS_HARDWARE_FP_DOUBLE
SUPPORTS_HARDWARE_FP_DOUBLE = 0
endif
ifndef SUPPORTS_HARDWARE_FP_SINGLE
SUPPORTS_HARDWARE_FP_SINGLE = 0
endif

# Math library source files
ifeq ($(MICROPY_FLOAT_IMPL),double)
LIBM_SRC_C += $(addprefix lib/libm_dbl/,\
Expand All @@ -245,10 +265,6 @@ else
endif
endif

# Reset variables
SUPPORTS_HARDWARE_FP_SINGLE = 0
SUPPORTS_HARDWARE_FP_DOUBLE = 0

# Assembly source files
SRC_SS = \
$(MCU_DIR)/gcc/startup_$(MCU_SERIES).S \
Expand Down Expand Up @@ -404,7 +420,20 @@ LDFLAGS = \

LDDEFINES = \
-DMICROPY_HW_FLASH_TYPE=$(MICROPY_HW_FLASH_TYPE) \
-DMICROPY_HW_FLASH_SIZE=$(MICROPY_HW_FLASH_SIZE)
-DMICROPY_HW_FLASH_SIZE=$(MICROPY_HW_FLASH_SIZE) \
-DBOARD_LINKER_SCRIPT_H=\"$(MCU_SERIES).ld\" \
-DBOOTLOADER_ENABLED=1

# Start of firmware is dependent on board flash type. Bootloader requires at least 32kB.
# Firmware start has to be aligned to sector size to allow erase of firmware without affecting the bootloader.
# Sector size is different between QPSI flash (4kB) and HyperFlash (256kB) devices!
ifeq ($(MICROPY_HW_FLASH_TYPE),qspi_nor_flash)
LDDEFINES += -DMICROPY_HW_FLASH_FIRMWARE_START_ADDR=0x00008000
else ifeq ($(MICROPY_HW_FLASH_TYPE),qspi_hyper_flash)
LDDEFINES += -DMICROPY_HW_FLASH_FIRMWARE_START_ADDR=0x00040000
else
$(error Error: Unknown board flash type $(MICROPY_HW_FLASH_TYPE))
endif

ifdef MICROPY_HW_FLASH_RESERVED
LDDEFINES += -DMICROPY_HW_FLASH_RESERVED=$(MICROPY_HW_FLASH_RESERVED)
Expand Down Expand Up @@ -453,10 +482,23 @@ $(BUILD)/firmware.elf: $(OBJ)
$(Q)$(CC) -E -x c $(LDDEFINES) $(LD_FILES) | grep -v '^#' > $(BUILD)/link.ld
$(ECHO) "LINK $@"
$(Q)$(LD) -T$(BUILD)/link.ld $(LDFLAGS) -o $@ $^ $(LIBS)
$(ECHO) ""
$(ECHO) "UPDATE SECTION .fw_header"
$(Q)$(OBJCOPY) -O binary $@ $(BUILD)/temp_firmware.bin
$(Q)$(PYTHON) $(PATCH_BINARY) $(BUILD)/temp_firmware.bin $(BUILD)/fw_header.bin 1024 $$(($(MICROPY_BOOT_BUFFER_SIZE)))
$(Q)$(OBJCOPY) $@ --update-section .fw_header=$(BUILD)/fw_header.bin
$(ECHO) "$(BUILD)/fw_header.bin ==> .fw_header"
$(ECHO) ""
$(ECHO) "UPDATE SECTION .mboot"
$(Q)$(OBJCOPY) $@ --update-section .mboot=$(BUILD_BL)/mboot.bin
$(ECHO) "$(BUILD_BL)/mboot.bin ==> .mboot"
$(ECHO) ""
$(ECHO) "OUTPUT INFO"
$(Q)$(SIZE) $@
$(ECHO) ""

$(BUILD)/firmware.bin: $(BUILD)/firmware.elf
$(Q)$(OBJCOPY) -O binary $^ $@
$(Q)$(OBJCOPY) -O binary $< $@

$(BUILD)/firmware.hex: $(BUILD)/firmware.elf
$(Q)$(OBJCOPY) -O ihex -R .eeprom $< $@
Expand All @@ -466,7 +508,7 @@ $(BUILD)/firmware.hex: $(BUILD)/firmware.elf
# 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.
$(OBJ): | $(GEN_PINS_HDR) $(GEN_FLEXRAM_CONFIG_SRC)
$(OBJ): | $(BUILD_BL)/mboot.bin $(BUILD_BL)/mboot.hex $(GEN_PINS_HDR) $(GEN_FLEXRAM_CONFIG_SRC)

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


# Use a pattern rule here so that make will only call make-pins.py once to make
# both pins_gen.c and pins.h
$(BUILD)/%_gen.c $(HEADER_BUILD)/%.h: $(BOARD_PINS) $(MAKE_PINS) $(AF_FILE) $(PREFIX_FILE) | $(HEADER_BUILD)
Expand Down
53 changes: 26 additions & 27 deletions ports/mimxrt/board_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,10 @@
#include CLOCK_CONFIG_H
#include "modmachine.h"


const uint8_t dcd_data[] = { 0x00 };

void usb_phy0_init(uint8_t d_cal, uint8_t txcal45dp, uint8_t txcal45dn);

void board_init(void) {
// Init clock
BOARD_BootClockRUN();
Expand All @@ -59,32 +60,8 @@ void board_init(void) {
// 1ms tick timer
SysTick_Config(SystemCoreClock / 1000);

// ------------- USB0 ------------- //
// Clock
CLOCK_EnableUsbhs0PhyPllClock(kCLOCK_Usbphy480M, 480000000U);
CLOCK_EnableUsbhs0Clock(kCLOCK_Usb480M, 480000000U);

#ifdef USBPHY1
USBPHY_Type *usb_phy = USBPHY1;
#else
USBPHY_Type *usb_phy = USBPHY;
#endif

// Enable PHY support for Low speed device + LS via FS Hub
usb_phy->CTRL |= USBPHY_CTRL_SET_ENUTMILEVEL2_MASK | USBPHY_CTRL_SET_ENUTMILEVEL3_MASK;

// Enable all power for normal operation
usb_phy->PWD = 0;

// TX Timing
uint32_t phytx = usb_phy->TX;
phytx &= ~(USBPHY_TX_D_CAL_MASK | USBPHY_TX_TXCAL45DM_MASK | USBPHY_TX_TXCAL45DP_MASK);
phytx |= USBPHY_TX_D_CAL(0x0C) | USBPHY_TX_TXCAL45DP(0x06) | USBPHY_TX_TXCAL45DM(0x06);
usb_phy->TX = phytx;

// USB1
// CLOCK_EnableUsbhs1PhyPllClock(kCLOCK_Usbphy480M, 480000000U);
// CLOCK_EnableUsbhs1Clock(kCLOCK_Usb480M, 480000000U);
// USB0
usb_phy0_init(0b0111, 0b0110, 0b0110); // Configure nominal values for D_CAL and TXCAL45DP/DN

// ADC
machine_adc_init();
Expand All @@ -104,6 +81,28 @@ void board_init(void) {
machine_rtc_start();
}

void usb_phy0_init(uint8_t d_cal, uint8_t txcal45dp, uint8_t txcal45dn) {
#ifdef USBPHY1
USBPHY_Type *usb_phy = USBPHY1;
#else
USBPHY_Type *usb_phy = USBPHY;
#endif

CLOCK_EnableUsbhs0PhyPllClock(kCLOCK_Usbphy480M, BOARD_XTAL0_CLK_HZ);
CLOCK_EnableUsbhs0Clock(kCLOCK_Usb480M, BOARD_XTAL0_CLK_HZ);

#if defined(CPU_MIMXRT1176_cm7)
usb_phy->TRIM_OVERRIDE_EN = USBPHY_TRIM_OVERRIDE_EN_TRIM_DIV_SEL_OVERRIDE(1) |
USBPHY_TRIM_OVERRIDE_EN_TRIM_ENV_TAIL_ADJ_VD_OVERRIDE(1) |
USBPHY_TRIM_OVERRIDE_EN_TRIM_TX_D_CAL_OVERRIDE(1) |
USBPHY_TRIM_OVERRIDE_EN_TRIM_TX_CAL45DP_OVERRIDE(1) |
USBPHY_TRIM_OVERRIDE_EN_TRIM_TX_CAL45DN_OVERRIDE(1); // Enable override for D_CAL and TXCAL45DP/DN
#endif
usb_phy->PWD = 0U; // Set all bits in PWD register to normal operation
usb_phy->TX = ((usb_phy->TX & (~(USBPHY_TX_D_CAL_MASK | USBPHY_TX_TXCAL45DM_MASK | USBPHY_TX_TXCAL45DP_MASK))) |
(USBPHY_TX_D_CAL(d_cal) | USBPHY_TX_TXCAL45DP(txcal45dp) | USBPHY_TX_TXCAL45DM(txcal45dn))); // Configure values for D_CAL and TXCAL45DP/DN
}

void USB_OTG1_IRQHandler(void) {
tud_int_handler(0);
tud_task();
Expand Down
2 changes: 2 additions & 0 deletions ports/mimxrt/boards/MIMXRT1010_EVK/mpconfigboard.mk
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ MICROPY_PY_MACHINE_SDCARD = 0
MICROPY_HW_FLASH_TYPE = qspi_nor_flash
MICROPY_HW_FLASH_SIZE = 0x1000000 # 16MB

MICROPY_BOOT_BUFFER_SIZE = (32 * 1024)

JLINK_PATH ?= /media/RT1010-EVK/
JLINK_COMMANDER_SCRIPT = $(BUILD)/script.jlink

Expand Down
24 changes: 6 additions & 18 deletions ports/mimxrt/boards/MIMXRT1011.ld
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,16 @@ reserved_size = MICROPY_HW_FLASH_RESERVED;
#endif

#if MICROPY_HW_FLASH_TYPE == qspi_nor_flash
flash_start = 0x60000000;
flash_start = 0x60000000;
flash_size = MICROPY_HW_FLASH_SIZE;
#else
#error Unknown MICROPY_HW_FLASH_TYPE
#error Unknown MICROPY_HW_FLASH_TYPE
#endif
flash_size = MICROPY_HW_FLASH_SIZE;
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));

/* MIMXRT1011 requires different offset for flash configuration */
flash_config_start = flash_start + 0x00000400;
flash_config_size = 0x00000C00;
ivt_start = flash_start + 0x00001000;
ivt_size = 0x00001000;
interrupts_start = flash_start + 0x00002000;
interrupts_size = 0x00000400;
text_start = flash_start + 0x00002400;
vfs_start = flash_start + 0x00100000;
text_size = ((vfs_start) - (text_start));
vfs_size = ((flash_end) - (vfs_start));

itcm_start = 0x00000000;
itcm_size = 0x00008000;
dtcm_start = 0x20000000;
Expand All @@ -29,12 +23,6 @@ ocrm_size = 0x00010000;

/* 20kiB stack. */
__stack_size__ = 0x5000;
_estack = __StackTop;
_sstack = __StackLimit;

/* Do not use the traditional C heap. */
__heap_size__ = 0;

/* Use second OCRAM bank for GC heap. */
_gc_heap_start = ORIGIN(m_ocrm);
_gc_heap_end = ORIGIN(m_ocrm) + LENGTH(m_ocrm);
27 changes: 5 additions & 22 deletions ports/mimxrt/boards/MIMXRT1015.ld
Original file line number Diff line number Diff line change
@@ -1,25 +1,15 @@
/* Memory configuration */
#if defined MICROPY_HW_FLASH_RESERVED
#if MICROPY_HW_FLASH_RESERVED
reserved_size = MICROPY_HW_FLASH_RESERVED;
#endif

#if MICROPY_HW_FLASH_TYPE == qspi_nor_flash
flash_start = 0x60000000;
flash_start = 0x60000000;
flash_size = MICROPY_HW_FLASH_SIZE;
#else
#error Unknown MICROPY_HW_FLASH_TYPE
#error Unknown MICROPY_HW_FLASH_TYPE
#endif
flash_size = MICROPY_HW_FLASH_SIZE;
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));
flash_config_start = flash_start;
flash_config_size = 0x00001000;
ivt_start = flash_start + 0x00001000;
ivt_size = 0x00001000;
interrupts_start = flash_start + 0x00002000;
interrupts_size = 0x00000400;
text_start = flash_start + 0x00002400;
vfs_start = flash_start + 0x00100000;
text_size = ((vfs_start) - (text_start));
vfs_size = ((flash_end) - (vfs_start));

itcm_start = 0x00000000;
itcm_size = 0x00008000;
dtcm_start = 0x20000000;
Expand All @@ -29,10 +19,3 @@ ocrm_size = 0x00010000;

/* 24kiB stack. */
__stack_size__ = 0x5000;
_estack = __StackTop;
_sstack = __StackLimit;

/* Use second OCRAM bank for GC heap. */
/* Use all OCRAM for the GC heap. */
_gc_heap_start = ORIGIN(m_ocrm);
_gc_heap_end = ORIGIN(m_ocrm) + LENGTH(m_ocrm);
1 change: 1 addition & 0 deletions ports/mimxrt/boards/MIMXRT1020_EVK/mpconfigboard.mk
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ MICROPY_HW_FLASH_SIZE = 0x800000 # 8MB
MICROPY_HW_SDRAM_AVAIL = 1
MICROPY_HW_SDRAM_SIZE = 0x2000000 # 32MB

MICROPY_BOOT_BUFFER_SIZE = (32 * 1024)
MICROPY_PY_LWIP = 1
MICROPY_PY_USSL = 1
MICROPY_SSL_MBEDTLS = 1
Expand Down
32 changes: 5 additions & 27 deletions ports/mimxrt/boards/MIMXRT1021.ld
Original file line number Diff line number Diff line change
@@ -1,25 +1,15 @@
/* Memory configuration */
#if defined MICROPY_HW_FLASH_RESERVED
#if MICROPY_HW_FLASH_RESERVED
reserved_size = MICROPY_HW_FLASH_RESERVED;
#endif

#if MICROPY_HW_FLASH_TYPE == qspi_nor_flash
flash_start = 0x60000000;
flash_start = 0x60000000;
flash_size = MICROPY_HW_FLASH_SIZE;
#else
#error Unknown MICROPY_HW_FLASH_TYPE
#error Unknown MICROPY_HW_FLASH_TYPE
#endif
flash_size = MICROPY_HW_FLASH_SIZE;
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));
flash_config_start = flash_start;
flash_config_size = 0x00001000;
ivt_start = flash_start + 0x00001000;
ivt_size = 0x00001000;
interrupts_start = flash_start + 0x00002000;
interrupts_size = 0x00000400;
text_start = flash_start + 0x00002400;
vfs_start = flash_start + 0x00100000;
text_size = ((vfs_start) - (text_start));
vfs_size = ((flash_end) - (vfs_start));

itcm_start = 0x00000000;
itcm_size = 0x00010000;
dtcm_start = 0x20000000;
Expand All @@ -34,15 +24,3 @@ sdram_size = MICROPY_HW_SDRAM_SIZE;

/* 24kiB stack. */
__stack_size__ = 0x6000;
_estack = __StackTop;
_sstack = __StackLimit;

#if MICROPY_HW_SDRAM_AVAIL
_gc_heap_start = ORIGIN(m_sdram);
_gc_heap_end = ORIGIN(m_sdram) + LENGTH(m_sdram);
#else
/* Use second OCRAM bank for GC heap. */
/* Use all OCRAM for the GC heap. */
_gc_heap_start = ORIGIN(m_ocrm);
_gc_heap_end = ORIGIN(m_ocrm) + LENGTH(m_ocrm);
#endif
2 changes: 2 additions & 0 deletions ports/mimxrt/boards/MIMXRT1050_EVK/mpconfigboard.mk
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ MICROPY_HW_FLASH_SIZE = 0x4000000 # 64MB
MICROPY_HW_SDRAM_AVAIL = 1
MICROPY_HW_SDRAM_SIZE = 0x2000000 # 32MB

MICROPY_BOOT_BUFFER_SIZE = (64 * 1024)

MICROPY_PY_LWIP = 1
MICROPY_PY_USSL = 1
MICROPY_SSL_MBEDTLS = 1
Loading
0