mimxrt: Rework flash configuration.
- Moves definition of BOARD_FLASH_SIZE and other header files related to flash configuration into the Makefile. - Adds board specific clock_config.h. - Adds board.h, pin_mux.h, and peripherals.h as they are required by NXP MCU SDK in order to use our own clock_config.h. - Renames board specific FlexSPI configuration files. - Updates flash frequency of MIMXRT1020_EVK - Creates separated flash_config files for QSPI NOR and QSPI Hyper flash. - Unifies VFS start address to be @ 1M for 1010 and 1020 boards. - Unifies 1050EVK boards - Adds support to both NOR and HyperFlash on boards with both capabilities. - Adds automatic FlexRAM initialization to start-up code based on linker script and NXP HAL. - Applies code formatting to all files in mimxrt port. With this change the flash configuration is restructured and organized. This simplifies the configuration process and provides a better overview of each board's settings. With the integration of clock_config.h, board.h, pin_mux.h, and peripherals.h we gain better control of the settings and clock configurations. Furthermore the implementation of an explicit FlexRAM setup improves the system performance and allows for performance tuning. Signed-off-by: Philipp Ebensberger
This commit is contained in:
@@ -13,6 +13,17 @@ endif
|
|||||||
include ../../py/mkenv.mk
|
include ../../py/mkenv.mk
|
||||||
include $(BOARD_DIR)/mpconfigboard.mk
|
include $(BOARD_DIR)/mpconfigboard.mk
|
||||||
|
|
||||||
|
# Set optional flash configuration variables
|
||||||
|
BOARD_FLASH_RESERVED ?=
|
||||||
|
|
||||||
|
LD_MEMORY_CONFIG_DEFINES += \
|
||||||
|
BOARD_FLASH_TYPE=$(BOARD_FLASH_TYPE) \
|
||||||
|
BOARD_FLASH_SIZE=$(BOARD_FLASH_SIZE)
|
||||||
|
|
||||||
|
ifdef $(BOARD_FLASH_RESERVED)
|
||||||
|
LD_MEMORY_CONFIG_DEFINES += BOARD_FLASH_RESERVED=$(BOARD_FLASH_RESERVED)
|
||||||
|
endif
|
||||||
|
|
||||||
# Qstr definitions (must come before including py.mk)
|
# Qstr definitions (must come before including py.mk)
|
||||||
QSTR_DEFS = qstrdefsport.h
|
QSTR_DEFS = qstrdefsport.h
|
||||||
QSTR_GLOBAL_DEPENDENCIES = $(BOARD_DIR)/mpconfigboard.h
|
QSTR_GLOBAL_DEPENDENCIES = $(BOARD_DIR)/mpconfigboard.h
|
||||||
@@ -28,9 +39,10 @@ include $(TOP)/py/py.mk
|
|||||||
GIT_SUBMODULES = lib/tinyusb lib/nxp_driver
|
GIT_SUBMODULES = lib/tinyusb lib/nxp_driver
|
||||||
|
|
||||||
MCU_DIR = lib/nxp_driver/sdk/devices/$(MCU_SERIES)
|
MCU_DIR = lib/nxp_driver/sdk/devices/$(MCU_SERIES)
|
||||||
LD_FILES = boards/$(BOARD)/$(BOARD).ld boards/$(MCU_SERIES).ld boards/common.ld
|
LD_FILES = boards/$(MCU_SERIES).ld boards/common.ld
|
||||||
|
|
||||||
MAKE_PINS = boards/make-pins.py
|
MAKE_PINS = boards/make-pins.py
|
||||||
|
MAKE_FLEXRAM_LD = boards/make-flexram-config.py
|
||||||
BOARD_PINS = $(BOARD_DIR)/pins.csv
|
BOARD_PINS = $(BOARD_DIR)/pins.csv
|
||||||
AF_FILE = boards/$(MCU_SERIES)_af.csv
|
AF_FILE = boards/$(MCU_SERIES)_af.csv
|
||||||
PREFIX_FILE = boards/mimxrt_prefix.c
|
PREFIX_FILE = boards/mimxrt_prefix.c
|
||||||
@@ -39,18 +51,19 @@ GEN_PINS_HDR = $(HEADER_BUILD)/pins.h
|
|||||||
GEN_PINS_QSTR = $(BUILD)/pins_qstr.h
|
GEN_PINS_QSTR = $(BUILD)/pins_qstr.h
|
||||||
GEN_PINS_AF_CONST = $(HEADER_BUILD)/pins_af_const.h
|
GEN_PINS_AF_CONST = $(HEADER_BUILD)/pins_af_const.h
|
||||||
GEN_PINS_AF_PY = $(BUILD)/pins_af.py
|
GEN_PINS_AF_PY = $(BUILD)/pins_af.py
|
||||||
|
GEN_FLEXRAM_CONFIG_SRC = $(BUILD)/flexram_config.s
|
||||||
|
|
||||||
# mcu driver cause following warnings
|
# mcu driver cause following warnings
|
||||||
#CFLAGS += -Wno-error=float-equal -Wno-error=nested-externs
|
#CFLAGS += -Wno-error=float-equal -Wno-error=nested-externs
|
||||||
CFLAGS += -Wno-error=unused-parameter
|
CFLAGS += -Wno-error=unused-parameter
|
||||||
|
|
||||||
INC += -I.
|
INC += -I.
|
||||||
|
INC += -Ihal
|
||||||
INC += -I$(BOARD_DIR)
|
INC += -I$(BOARD_DIR)
|
||||||
INC += -I$(BUILD)
|
INC += -I$(BUILD)
|
||||||
INC += -I$(TOP)
|
INC += -I$(TOP)
|
||||||
INC += -I$(TOP)/$(MCU_DIR)
|
INC += -I$(TOP)/$(MCU_DIR)
|
||||||
INC += -I$(TOP)/$(MCU_DIR)/drivers
|
INC += -I$(TOP)/$(MCU_DIR)/drivers
|
||||||
INC += -I$(TOP)/$(MCU_DIR)/project_template
|
|
||||||
INC += -I$(TOP)/lib/cmsis/inc
|
INC += -I$(TOP)/lib/cmsis/inc
|
||||||
INC += -I$(TOP)/lib/oofatfs
|
INC += -I$(TOP)/lib/oofatfs
|
||||||
INC += -I$(TOP)/lib/tinyusb/hw
|
INC += -I$(TOP)/lib/tinyusb/hw
|
||||||
@@ -67,10 +80,20 @@ CFLAGS += -DXIP_EXTERNAL_FLASH=1 \
|
|||||||
-D__STARTUP_CLEAR_BSS \
|
-D__STARTUP_CLEAR_BSS \
|
||||||
-D__STARTUP_INITIALIZE_RAMFUNCTION \
|
-D__STARTUP_INITIALIZE_RAMFUNCTION \
|
||||||
-D__START=main \
|
-D__START=main \
|
||||||
-DCPU_HEADER_H='<$(MCU_SERIES).h>'
|
-DCPU_HEADER_H='<$(MCU_SERIES).h>' \
|
||||||
|
-DBOARD_FLASH_SIZE=$(BOARD_FLASH_SIZE) \
|
||||||
|
-DBOARD_FLASH_CONFIG_HEADER_H=\"$(BOARD)_flexspi_nor_config.h\"
|
||||||
|
|
||||||
|
ifeq ($(BOARD_FLASH_TYPE), qspi_nor)
|
||||||
|
CFLAGS += -DBOARD_FLASH_OPS_HEADER_H=\"hal/flexspi_nor_flash.h\"
|
||||||
|
else ifeq ($(BOARD_FLASH_TYPE), hyperflash)
|
||||||
|
CFLAGS += -DBOARD_FLASH_OPS_HEADER_H=\"hal/flexspi_hyper_flash.h\"
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(MICROPY_PY_MACHINE_SDCARD),1)
|
ifeq ($(MICROPY_PY_MACHINE_SDCARD),1)
|
||||||
CFLAGS += -DMICROPY_PY_MACHINE_SDCARD=1
|
CFLAGS += -DMICROPY_PY_MACHINE_SDCARD=1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS += $(CFLAGS_MOD) $(CFLAGS_EXTRA)
|
CFLAGS += $(CFLAGS_MOD) $(CFLAGS_EXTRA)
|
||||||
|
|
||||||
# Configure floating point support
|
# Configure floating point support
|
||||||
@@ -88,7 +111,8 @@ endif
|
|||||||
SUPPORTS_HARDWARE_FP_SINGLE = 0
|
SUPPORTS_HARDWARE_FP_SINGLE = 0
|
||||||
SUPPORTS_HARDWARE_FP_DOUBLE = 0
|
SUPPORTS_HARDWARE_FP_DOUBLE = 0
|
||||||
|
|
||||||
LDFLAGS = $(addprefix -T,$(LD_FILES)) -Map=$@.map --cref --print-memory-usage
|
LDFLAGS = -Map=$@.map --cref --print-memory-usage
|
||||||
|
LDDEFINES = $(addprefix -D, $(LD_MEMORY_CONFIG_DEFINES))
|
||||||
LIBS = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
|
LIBS = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
|
||||||
|
|
||||||
# Tune for Debugging or Optimization
|
# Tune for Debugging or Optimization
|
||||||
@@ -144,7 +168,6 @@ SRC_HAL_IMX_C += $(MCU_DIR)/drivers/fsl_usdhc.c
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
SRC_C += \
|
SRC_C += \
|
||||||
$(BOARD_DIR)/flash_config.c \
|
|
||||||
board_init.c \
|
board_init.c \
|
||||||
dma_channel.c \
|
dma_channel.c \
|
||||||
drivers/bus/softspi.c \
|
drivers/bus/softspi.c \
|
||||||
@@ -184,6 +207,18 @@ SRC_C += \
|
|||||||
$(SRC_TINYUSB_C) \
|
$(SRC_TINYUSB_C) \
|
||||||
$(SRC_HAL_IMX_C) \
|
$(SRC_HAL_IMX_C) \
|
||||||
|
|
||||||
|
ifeq ($(BOARD_FLASH_TYPE), qspi_nor)
|
||||||
|
SRC_C += \
|
||||||
|
hal/flexspi_nor_flash.c \
|
||||||
|
$(BOARD_DIR)/qspi_nor_flash_config.c
|
||||||
|
else ifeq ($(BOARD_FLASH_TYPE), hyperflash)
|
||||||
|
SRC_C += \
|
||||||
|
hal/flexspi_hyper_flash.c \
|
||||||
|
$(BOARD_DIR)/qspi_hyper_flash_config.c
|
||||||
|
else
|
||||||
|
$(error Error: Unknown board flash type $(BOARD_FLASH_TYPE))
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(MICROPY_FLOAT_IMPL),double)
|
ifeq ($(MICROPY_FLOAT_IMPL),double)
|
||||||
LIBM_SRC_C += $(addprefix lib/libm_dbl/,\
|
LIBM_SRC_C += $(addprefix lib/libm_dbl/,\
|
||||||
__cos.c \
|
__cos.c \
|
||||||
@@ -277,7 +312,9 @@ ifeq ($(MICROPY_FLOAT_IMPL),double)
|
|||||||
$(LIBM_O): CFLAGS := $(filter-out -Wdouble-promotion -Wfloat-conversion, $(CFLAGS))
|
$(LIBM_O): CFLAGS := $(filter-out -Wdouble-promotion -Wfloat-conversion, $(CFLAGS))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
SRC_SS += $(MCU_DIR)/gcc/startup_$(MCU_SERIES).S
|
SRC_SS = \
|
||||||
|
$(MCU_DIR)/gcc/startup_$(MCU_SERIES).S \
|
||||||
|
hal/resethandler_MIMXRT10xx.S
|
||||||
|
|
||||||
SRC_S += shared/runtime/gchelper_m3.s \
|
SRC_S += shared/runtime/gchelper_m3.s \
|
||||||
|
|
||||||
@@ -316,8 +353,10 @@ $(BUILD)/lib/tinyusb/src/device/usbd.o: CFLAGS += -Wno-missing-braces
|
|||||||
all: $(BUILD)/firmware.hex $(BUILD)/firmware.bin
|
all: $(BUILD)/firmware.hex $(BUILD)/firmware.bin
|
||||||
|
|
||||||
$(BUILD)/firmware.elf: $(OBJ)
|
$(BUILD)/firmware.elf: $(OBJ)
|
||||||
|
$(ECHO) "PREPROCESS LINK $@"
|
||||||
|
$(Q)$(CC) -E -x c $(LDDEFINES) $(LD_FILES) | grep -v '^#' > $(BUILD)/link.ld
|
||||||
$(ECHO) "LINK $@"
|
$(ECHO) "LINK $@"
|
||||||
$(Q)$(LD) $(LDFLAGS) -o $@ $^ $(LIBS)
|
$(Q)$(LD) -T$(BUILD)/link.ld $(LDFLAGS) -o $@ $^ $(LIBS)
|
||||||
$(Q)$(SIZE) $@
|
$(Q)$(SIZE) $@
|
||||||
|
|
||||||
$(BUILD)/firmware.bin: $(BUILD)/firmware.elf
|
$(BUILD)/firmware.bin: $(BUILD)/firmware.elf
|
||||||
@@ -326,17 +365,23 @@ $(BUILD)/firmware.bin: $(BUILD)/firmware.elf
|
|||||||
$(BUILD)/firmware.hex: $(BUILD)/firmware.elf
|
$(BUILD)/firmware.hex: $(BUILD)/firmware.elf
|
||||||
$(Q)$(OBJCOPY) -O ihex -R .eeprom $< $@
|
$(Q)$(OBJCOPY) -O ihex -R .eeprom $< $@
|
||||||
|
|
||||||
# Making OBJ use an order-only depenedency on the generated pins.h file
|
# Making OBJ use an order-only dependency on the generated pins.h file
|
||||||
# has the side effect of making the pins.h file before we actually compile
|
# 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
|
# 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
|
# case when pins.h is modified. But when it doesn't exist, we don't know
|
||||||
# which source files might need it.
|
# which source files might need it.
|
||||||
$(OBJ): | $(GEN_PINS_HDR)
|
$(OBJ): | $(GEN_PINS_HDR) $(GEN_FLEXRAM_CONFIG_SRC)
|
||||||
|
|
||||||
# With conditional pins, we may need to regenerate qstrdefs.h when config
|
# With conditional pins, we may need to regenerate qstrdefs.h when config
|
||||||
# options change.
|
# options change.
|
||||||
$(HEADER_BUILD)/qstrdefs.generated.h: $(BOARD_DIR)/mpconfigboard.h
|
$(HEADER_BUILD)/qstrdefs.generated.h: $(BOARD_DIR)/mpconfigboard.h
|
||||||
|
|
||||||
|
$(GEN_FLEXRAM_CONFIG_SRC):
|
||||||
|
$(ECHO) "Create $@"
|
||||||
|
$(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
|
# Use a pattern rule here so that make will only call make-pins.py once to make
|
||||||
# both pins_gen.c and pins.h
|
# both pins_gen.c and pins.h
|
||||||
$(BUILD)/%_gen.c $(HEADER_BUILD)/%.h: $(BOARD_PINS) $(MAKE_PINS) $(AF_FILE) $(PREFIX_FILE) | $(HEADER_BUILD)
|
$(BUILD)/%_gen.c $(HEADER_BUILD)/%.h: $(BOARD_PINS) $(MAKE_PINS) $(AF_FILE) $(PREFIX_FILE) | $(HEADER_BUILD)
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
flash_size = 16M;
|
|
||||||
@@ -0,0 +1,257 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Based on tinyusb/hw/bsp/teensy_40/evkmimxrt1010_flexspi_nor_config.h
|
||||||
|
|
||||||
|
#ifndef __EVKMIMXRT1011_FLEXSPI_NOR_CONFIG__
|
||||||
|
#define __EVKMIMXRT1011_FLEXSPI_NOR_CONFIG__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*! @name Driver version */
|
||||||
|
/*@{*/
|
||||||
|
/*! @brief XIP_BOARD driver version 2.0.0. */
|
||||||
|
#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/* FLEXSPI memory config block related defintions */
|
||||||
|
#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian
|
||||||
|
#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0
|
||||||
|
#define FLEXSPI_CFG_BLK_SIZE (512)
|
||||||
|
|
||||||
|
/* FLEXSPI Feature related definitions */
|
||||||
|
#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
|
||||||
|
|
||||||
|
/* Lookup table related defintions */
|
||||||
|
#define CMD_INDEX_READ 0
|
||||||
|
#define CMD_INDEX_READSTATUS 1
|
||||||
|
#define CMD_INDEX_WRITEENABLE 2
|
||||||
|
#define CMD_INDEX_WRITE 4
|
||||||
|
|
||||||
|
#define CMD_LUT_SEQ_IDX_READ 0
|
||||||
|
#define CMD_LUT_SEQ_IDX_READSTATUS 1
|
||||||
|
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
||||||
|
#define CMD_LUT_SEQ_IDX_WRITE 9
|
||||||
|
|
||||||
|
#define CMD_SDR 0x01
|
||||||
|
#define CMD_DDR 0x21
|
||||||
|
#define RADDR_SDR 0x02
|
||||||
|
#define RADDR_DDR 0x22
|
||||||
|
#define CADDR_SDR 0x03
|
||||||
|
#define CADDR_DDR 0x23
|
||||||
|
#define MODE1_SDR 0x04
|
||||||
|
#define MODE1_DDR 0x24
|
||||||
|
#define MODE2_SDR 0x05
|
||||||
|
#define MODE2_DDR 0x25
|
||||||
|
#define MODE4_SDR 0x06
|
||||||
|
#define MODE4_DDR 0x26
|
||||||
|
#define MODE8_SDR 0x07
|
||||||
|
#define MODE8_DDR 0x27
|
||||||
|
#define WRITE_SDR 0x08
|
||||||
|
#define WRITE_DDR 0x28
|
||||||
|
#define READ_SDR 0x09
|
||||||
|
#define READ_DDR 0x29
|
||||||
|
#define LEARN_SDR 0x0A
|
||||||
|
#define LEARN_DDR 0x2A
|
||||||
|
#define DATSZ_SDR 0x0B
|
||||||
|
#define DATSZ_DDR 0x2B
|
||||||
|
#define DUMMY_SDR 0x0C
|
||||||
|
#define DUMMY_DDR 0x2C
|
||||||
|
#define DUMMY_RWDS_SDR 0x0D
|
||||||
|
#define DUMMY_RWDS_DDR 0x2D
|
||||||
|
#define JMP_ON_CS 0x1F
|
||||||
|
#define STOP 0
|
||||||
|
|
||||||
|
#define FLEXSPI_1PAD 0
|
||||||
|
#define FLEXSPI_2PAD 1
|
||||||
|
#define FLEXSPI_4PAD 2
|
||||||
|
#define FLEXSPI_8PAD 3
|
||||||
|
|
||||||
|
#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
|
||||||
|
(FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
|
||||||
|
FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
||||||
|
|
||||||
|
// !@brief Definitions for FlexSPI Serial Clock Frequency
|
||||||
|
typedef enum _FlexSpiSerialClockFreq
|
||||||
|
{
|
||||||
|
kFlexSpiSerialClk_30MHz = 1,
|
||||||
|
kFlexSpiSerialClk_50MHz = 2,
|
||||||
|
kFlexSpiSerialClk_60MHz = 3,
|
||||||
|
kFlexSpiSerialClk_75MHz = 4,
|
||||||
|
kFlexSpiSerialClk_80MHz = 5,
|
||||||
|
kFlexSpiSerialClk_100MHz = 6,
|
||||||
|
kFlexSpiSerialClk_120MHz = 7,
|
||||||
|
kFlexSpiSerialClk_133MHz = 8,
|
||||||
|
} flexspi_serial_clk_freq_t;
|
||||||
|
|
||||||
|
// !@brief FlexSPI clock configuration type
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiClk_SDR, // !< Clock configure for SDR mode
|
||||||
|
kFlexSpiClk_DDR, // !< Clock configurat for DDR mode
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI Read Sample Clock Source definition
|
||||||
|
typedef enum _FlashReadSampleClkSource
|
||||||
|
{
|
||||||
|
kFlexSPIReadSampleClk_LoopbackInternally = 0,
|
||||||
|
kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
|
||||||
|
kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
|
||||||
|
kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
|
||||||
|
} flexspi_read_sample_clk_t;
|
||||||
|
|
||||||
|
// !@brief Misc feature bit definitions
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiMiscOffset_DiffClkEnable = 0, // !< Bit for Differential clock enable
|
||||||
|
kFlexSpiMiscOffset_Ck2Enable = 1, // !< Bit for CK2 enable
|
||||||
|
kFlexSpiMiscOffset_ParallelEnable = 2, // !< Bit for Parallel mode enable
|
||||||
|
kFlexSpiMiscOffset_WordAddressableEnable = 3, // !< Bit for Word Addressable enable
|
||||||
|
kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, // !< Bit for Safe Configuration Frequency enable
|
||||||
|
kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, // !< Bit for Pad setting override enable
|
||||||
|
kFlexSpiMiscOffset_DdrModeEnable = 6, // !< Bit for DDR clock confiuration indication.
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief Flash Type Definition
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiDeviceType_SerialNOR = 1, // !< Flash devices are Serial NOR
|
||||||
|
kFlexSpiDeviceType_SerialNAND = 2, // !< Flash devices are Serial NAND
|
||||||
|
kFlexSpiDeviceType_SerialRAM = 3, // !< Flash devices are Serial RAM/HyperFLASH
|
||||||
|
kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, // !< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND
|
||||||
|
kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, // !< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief Flash Pad Definitions
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kSerialFlash_1Pad = 1,
|
||||||
|
kSerialFlash_2Pads = 2,
|
||||||
|
kSerialFlash_4Pads = 4,
|
||||||
|
kSerialFlash_8Pads = 8,
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI LUT Sequence structure
|
||||||
|
typedef struct _lut_sequence
|
||||||
|
{
|
||||||
|
uint8_t seqNum; // !< Sequence Number, valid number: 1-16
|
||||||
|
uint8_t seqId; // !< Sequence Index, valid number: 0-15
|
||||||
|
uint16_t reserved;
|
||||||
|
} flexspi_lut_seq_t;
|
||||||
|
|
||||||
|
// !@brief Flash Configuration Command Type
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kDeviceConfigCmdType_Generic, // !< Generic command, for example: configure dummy cycles, drive strength, etc
|
||||||
|
kDeviceConfigCmdType_QuadEnable, // !< Quad Enable command
|
||||||
|
kDeviceConfigCmdType_Spi2Xpi, // !< Switch from SPI to DPI/QPI/OPI mode
|
||||||
|
kDeviceConfigCmdType_Xpi2Spi, // !< Switch from DPI/QPI/OPI to SPI mode
|
||||||
|
kDeviceConfigCmdType_Spi2NoCmd, // !< Switch to 0-4-4/0-8-8 mode
|
||||||
|
kDeviceConfigCmdType_Reset, // !< Reset device command
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI Memory Configuration Block
|
||||||
|
typedef struct _FlexSPIConfig
|
||||||
|
{
|
||||||
|
uint32_t tag; // !< [0x000-0x003] Tag, fixed value 0x42464346UL
|
||||||
|
uint32_t version; // !< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix
|
||||||
|
uint32_t reserved0; // !< [0x008-0x00b] Reserved for future use
|
||||||
|
uint8_t readSampleClkSrc; // !< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3
|
||||||
|
uint8_t csHoldTime; // !< [0x00d-0x00d] CS hold time, default value: 3
|
||||||
|
uint8_t csSetupTime; // !< [0x00e-0x00e] CS setup time, default value: 3
|
||||||
|
uint8_t columnAddressWidth; // !< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
|
||||||
|
// ! Serial NAND, need to refer to datasheet
|
||||||
|
uint8_t deviceModeCfgEnable; // !< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable
|
||||||
|
uint8_t deviceModeType; // !< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
|
||||||
|
// ! Generic configuration, etc.
|
||||||
|
uint16_t waitTimeCfgCommands; // !< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
|
||||||
|
// ! DPI/QPI/OPI switch or reset command
|
||||||
|
flexspi_lut_seq_t deviceModeSeq; // !< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
|
||||||
|
// ! sequence number, [31:16] Reserved
|
||||||
|
uint32_t deviceModeArg; // !< [0x018-0x01b] Argument/Parameter for device configuration
|
||||||
|
uint8_t configCmdEnable; // !< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable
|
||||||
|
uint8_t configModeType[3]; // !< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe
|
||||||
|
flexspi_lut_seq_t
|
||||||
|
configCmdSeqs[3]; // !< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq
|
||||||
|
uint32_t reserved1; // !< [0x02c-0x02f] Reserved for future use
|
||||||
|
uint32_t configCmdArgs[3]; // !< [0x030-0x03b] Arguments/Parameters for device Configuration commands
|
||||||
|
uint32_t reserved2; // !< [0x03c-0x03f] Reserved for future use
|
||||||
|
uint32_t controllerMiscOption; // !< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
|
||||||
|
// ! details
|
||||||
|
uint8_t deviceType; // !< [0x044-0x044] Device Type: See Flash Type Definition for more details
|
||||||
|
uint8_t sflashPadType; // !< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal
|
||||||
|
uint8_t serialClkFreq; // !< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
|
||||||
|
// ! Chapter for more details
|
||||||
|
uint8_t lutCustomSeqEnable; // !< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
|
||||||
|
// ! be done using 1 LUT sequence, currently, only applicable to HyperFLASH
|
||||||
|
uint32_t reserved3[2]; // !< [0x048-0x04f] Reserved for future use
|
||||||
|
uint32_t sflashA1Size; // !< [0x050-0x053] Size of Flash connected to A1
|
||||||
|
uint32_t sflashA2Size; // !< [0x054-0x057] Size of Flash connected to A2
|
||||||
|
uint32_t sflashB1Size; // !< [0x058-0x05b] Size of Flash connected to B1
|
||||||
|
uint32_t sflashB2Size; // !< [0x05c-0x05f] Size of Flash connected to B2
|
||||||
|
uint32_t csPadSettingOverride; // !< [0x060-0x063] CS pad setting override value
|
||||||
|
uint32_t sclkPadSettingOverride; // !< [0x064-0x067] SCK pad setting override value
|
||||||
|
uint32_t dataPadSettingOverride; // !< [0x068-0x06b] data pad setting override value
|
||||||
|
uint32_t dqsPadSettingOverride; // !< [0x06c-0x06f] DQS pad setting override value
|
||||||
|
uint32_t timeoutInMs; // !< [0x070-0x073] Timeout threshold for read status command
|
||||||
|
uint32_t commandInterval; // !< [0x074-0x077] CS deselect interval between two commands
|
||||||
|
uint16_t dataValidTime[2]; // !< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns
|
||||||
|
uint16_t busyOffset; // !< [0x07c-0x07d] Busy offset, valid value: 0-31
|
||||||
|
uint16_t busyBitPolarity; // !< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
|
||||||
|
// ! busy flag is 0 when flash device is busy
|
||||||
|
uint32_t lookupTable[64]; // !< [0x080-0x17f] Lookup table holds Flash command sequences
|
||||||
|
flexspi_lut_seq_t lutCustomSeq[12]; // !< [0x180-0x1af] Customizable LUT Sequences
|
||||||
|
uint32_t reserved4[4]; // !< [0x1b0-0x1bf] Reserved for future use
|
||||||
|
} flexspi_mem_config_t;
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL 0
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG 1
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD 2
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 4
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG 6
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD 7
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READID 8
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_ENTERQPI 10
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_EXITQPI 12
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Serial NOR configuration block
|
||||||
|
*/
|
||||||
|
typedef struct _flexspi_nor_config
|
||||||
|
{
|
||||||
|
flexspi_mem_config_t memConfig; // !< Common memory configuration info via FlexSPI
|
||||||
|
uint32_t pageSize; // !< Page size of Serial NOR
|
||||||
|
uint32_t sectorSize; // !< Sector size of Serial NOR
|
||||||
|
uint8_t ipcmdSerialClkFreq; // !< Clock frequency for IP command
|
||||||
|
uint8_t isUniformBlockSize; // !< Sector/Block size is the same
|
||||||
|
uint8_t reserved0[2]; // !< Reserved for future use
|
||||||
|
uint8_t serialNorType; // !< Serial NOR Flash type: 0/1/2/3
|
||||||
|
uint8_t needExitNoCmdMode; // !< Need to exit NoCmd mode before other IP command
|
||||||
|
uint8_t halfClkForNonReadCmd; // !< Half the Serial Clock for non-read command: true/false
|
||||||
|
uint8_t needRestoreNoCmdMode; // !< Need to Restore NoCmd mode after IP commmand execution
|
||||||
|
uint32_t blockSize; // !< Block size
|
||||||
|
uint32_t reserve2[11]; // !< Reserved for future use
|
||||||
|
} flexspi_nor_config_t;
|
||||||
|
|
||||||
|
#define FLASH_BUSY_STATUS_POL 0
|
||||||
|
#define FLASH_BUSY_STATUS_OFFSET 0
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* __EVKMIMXRT1011_FLEXSPI_NOR_CONFIG__ */
|
||||||
104
ports/mimxrt/boards/MIMXRT1010_EVK/clock_config.h
Normal file
104
ports/mimxrt/boards/MIMXRT1010_EVK/clock_config.h
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CLOCK_CONFIG_H_
|
||||||
|
#define _CLOCK_CONFIG_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_XTAL0_CLK_HZ 24000000U /*!< Board xtal0 frequency in Hz */
|
||||||
|
|
||||||
|
#define BOARD_XTAL32K_CLK_HZ 32768U /*!< Board xtal32k frequency in Hz */
|
||||||
|
/*******************************************************************************
|
||||||
|
************************ BOARD_InitBootClocks function ************************
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes default configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_InitBootClocks(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
********************** Configuration BOARD_BootClockRUN ***********************
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions for BOARD_BootClockRUN configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CORE_CLOCK 500000000U /*!< Core clock frequency: 500000000Hz */
|
||||||
|
|
||||||
|
/* Clock outputs (values are in Hz): */
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ADC_ALT_CLK 40000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT 32768UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLKO1_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLKO2_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLK_1M 1000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLK_24M 24000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CORE_CLK_ROOT 500000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET_500M_REF_CLK 500000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT 132000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ 62500000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ 62500000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT 125000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT 60000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT 105600000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_MQS_MCLK 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT 62500000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT 117333333UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT 80000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USBPHY_CLK 0UL
|
||||||
|
|
||||||
|
/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;
|
||||||
|
/*! @brief Sys PLL for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;
|
||||||
|
/*! @brief Enet PLL set for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_enet_pll_config_t enetPllConfig_BOARD_BootClockRUN;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API for BOARD_BootClockRUN configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_BootClockRUN(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
#endif /* _CLOCK_CONFIG_H_ */
|
||||||
@@ -1,257 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2019 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Based on tinyusb/hw/bsp/teensy_40/evkmimxrt1010_flexspi_nor_config.h
|
|
||||||
|
|
||||||
#ifndef __EVKMIMXRT1011_FLEXSPI_NOR_CONFIG__
|
|
||||||
#define __EVKMIMXRT1011_FLEXSPI_NOR_CONFIG__
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include "fsl_common.h"
|
|
||||||
|
|
||||||
/*! @name Driver version */
|
|
||||||
/*@{*/
|
|
||||||
/*! @brief XIP_BOARD driver version 2.0.0. */
|
|
||||||
#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
|
|
||||||
/*@}*/
|
|
||||||
|
|
||||||
/* FLEXSPI memory config block related defintions */
|
|
||||||
#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian
|
|
||||||
#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0
|
|
||||||
#define FLEXSPI_CFG_BLK_SIZE (512)
|
|
||||||
|
|
||||||
/* FLEXSPI Feature related definitions */
|
|
||||||
#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
|
|
||||||
|
|
||||||
/* Lookup table related defintions */
|
|
||||||
#define CMD_INDEX_READ 0
|
|
||||||
#define CMD_INDEX_READSTATUS 1
|
|
||||||
#define CMD_INDEX_WRITEENABLE 2
|
|
||||||
#define CMD_INDEX_WRITE 4
|
|
||||||
|
|
||||||
#define CMD_LUT_SEQ_IDX_READ 0
|
|
||||||
#define CMD_LUT_SEQ_IDX_READSTATUS 1
|
|
||||||
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
|
||||||
#define CMD_LUT_SEQ_IDX_WRITE 9
|
|
||||||
|
|
||||||
#define CMD_SDR 0x01
|
|
||||||
#define CMD_DDR 0x21
|
|
||||||
#define RADDR_SDR 0x02
|
|
||||||
#define RADDR_DDR 0x22
|
|
||||||
#define CADDR_SDR 0x03
|
|
||||||
#define CADDR_DDR 0x23
|
|
||||||
#define MODE1_SDR 0x04
|
|
||||||
#define MODE1_DDR 0x24
|
|
||||||
#define MODE2_SDR 0x05
|
|
||||||
#define MODE2_DDR 0x25
|
|
||||||
#define MODE4_SDR 0x06
|
|
||||||
#define MODE4_DDR 0x26
|
|
||||||
#define MODE8_SDR 0x07
|
|
||||||
#define MODE8_DDR 0x27
|
|
||||||
#define WRITE_SDR 0x08
|
|
||||||
#define WRITE_DDR 0x28
|
|
||||||
#define READ_SDR 0x09
|
|
||||||
#define READ_DDR 0x29
|
|
||||||
#define LEARN_SDR 0x0A
|
|
||||||
#define LEARN_DDR 0x2A
|
|
||||||
#define DATSZ_SDR 0x0B
|
|
||||||
#define DATSZ_DDR 0x2B
|
|
||||||
#define DUMMY_SDR 0x0C
|
|
||||||
#define DUMMY_DDR 0x2C
|
|
||||||
#define DUMMY_RWDS_SDR 0x0D
|
|
||||||
#define DUMMY_RWDS_DDR 0x2D
|
|
||||||
#define JMP_ON_CS 0x1F
|
|
||||||
#define STOP 0
|
|
||||||
|
|
||||||
#define FLEXSPI_1PAD 0
|
|
||||||
#define FLEXSPI_2PAD 1
|
|
||||||
#define FLEXSPI_4PAD 2
|
|
||||||
#define FLEXSPI_8PAD 3
|
|
||||||
|
|
||||||
#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
|
|
||||||
(FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
|
|
||||||
FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
|
||||||
|
|
||||||
//!@brief Definitions for FlexSPI Serial Clock Frequency
|
|
||||||
typedef enum _FlexSpiSerialClockFreq
|
|
||||||
{
|
|
||||||
kFlexSpiSerialClk_30MHz = 1,
|
|
||||||
kFlexSpiSerialClk_50MHz = 2,
|
|
||||||
kFlexSpiSerialClk_60MHz = 3,
|
|
||||||
kFlexSpiSerialClk_75MHz = 4,
|
|
||||||
kFlexSpiSerialClk_80MHz = 5,
|
|
||||||
kFlexSpiSerialClk_100MHz = 6,
|
|
||||||
kFlexSpiSerialClk_120MHz = 7,
|
|
||||||
kFlexSpiSerialClk_133MHz = 8,
|
|
||||||
} flexspi_serial_clk_freq_t;
|
|
||||||
|
|
||||||
//!@brief FlexSPI clock configuration type
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiClk_SDR, //!< Clock configure for SDR mode
|
|
||||||
kFlexSpiClk_DDR, //!< Clock configurat for DDR mode
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI Read Sample Clock Source definition
|
|
||||||
typedef enum _FlashReadSampleClkSource
|
|
||||||
{
|
|
||||||
kFlexSPIReadSampleClk_LoopbackInternally = 0,
|
|
||||||
kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
|
|
||||||
kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
|
|
||||||
kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
|
|
||||||
} flexspi_read_sample_clk_t;
|
|
||||||
|
|
||||||
//!@brief Misc feature bit definitions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiMiscOffset_DiffClkEnable = 0, //!< Bit for Differential clock enable
|
|
||||||
kFlexSpiMiscOffset_Ck2Enable = 1, //!< Bit for CK2 enable
|
|
||||||
kFlexSpiMiscOffset_ParallelEnable = 2, //!< Bit for Parallel mode enable
|
|
||||||
kFlexSpiMiscOffset_WordAddressableEnable = 3, //!< Bit for Word Addressable enable
|
|
||||||
kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, //!< Bit for Safe Configuration Frequency enable
|
|
||||||
kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable
|
|
||||||
kFlexSpiMiscOffset_DdrModeEnable = 6, //!< Bit for DDR clock confiuration indication.
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief Flash Type Definition
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiDeviceType_SerialNOR = 1, //!< Flash devices are Serial NOR
|
|
||||||
kFlexSpiDeviceType_SerialNAND = 2, //!< Flash devices are Serial NAND
|
|
||||||
kFlexSpiDeviceType_SerialRAM = 3, //!< Flash devices are Serial RAM/HyperFLASH
|
|
||||||
kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND
|
|
||||||
kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, //!< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief Flash Pad Definitions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kSerialFlash_1Pad = 1,
|
|
||||||
kSerialFlash_2Pads = 2,
|
|
||||||
kSerialFlash_4Pads = 4,
|
|
||||||
kSerialFlash_8Pads = 8,
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI LUT Sequence structure
|
|
||||||
typedef struct _lut_sequence
|
|
||||||
{
|
|
||||||
uint8_t seqNum; //!< Sequence Number, valid number: 1-16
|
|
||||||
uint8_t seqId; //!< Sequence Index, valid number: 0-15
|
|
||||||
uint16_t reserved;
|
|
||||||
} flexspi_lut_seq_t;
|
|
||||||
|
|
||||||
//!@brief Flash Configuration Command Type
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kDeviceConfigCmdType_Generic, //!< Generic command, for example: configure dummy cycles, drive strength, etc
|
|
||||||
kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command
|
|
||||||
kDeviceConfigCmdType_Spi2Xpi, //!< Switch from SPI to DPI/QPI/OPI mode
|
|
||||||
kDeviceConfigCmdType_Xpi2Spi, //!< Switch from DPI/QPI/OPI to SPI mode
|
|
||||||
kDeviceConfigCmdType_Spi2NoCmd, //!< Switch to 0-4-4/0-8-8 mode
|
|
||||||
kDeviceConfigCmdType_Reset, //!< Reset device command
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI Memory Configuration Block
|
|
||||||
typedef struct _FlexSPIConfig
|
|
||||||
{
|
|
||||||
uint32_t tag; //!< [0x000-0x003] Tag, fixed value 0x42464346UL
|
|
||||||
uint32_t version; //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix
|
|
||||||
uint32_t reserved0; //!< [0x008-0x00b] Reserved for future use
|
|
||||||
uint8_t readSampleClkSrc; //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3
|
|
||||||
uint8_t csHoldTime; //!< [0x00d-0x00d] CS hold time, default value: 3
|
|
||||||
uint8_t csSetupTime; //!< [0x00e-0x00e] CS setup time, default value: 3
|
|
||||||
uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
|
|
||||||
//! Serial NAND, need to refer to datasheet
|
|
||||||
uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable
|
|
||||||
uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
|
|
||||||
//! Generic configuration, etc.
|
|
||||||
uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
|
|
||||||
//! DPI/QPI/OPI switch or reset command
|
|
||||||
flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
|
|
||||||
//! sequence number, [31:16] Reserved
|
|
||||||
uint32_t deviceModeArg; //!< [0x018-0x01b] Argument/Parameter for device configuration
|
|
||||||
uint8_t configCmdEnable; //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable
|
|
||||||
uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe
|
|
||||||
flexspi_lut_seq_t
|
|
||||||
configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq
|
|
||||||
uint32_t reserved1; //!< [0x02c-0x02f] Reserved for future use
|
|
||||||
uint32_t configCmdArgs[3]; //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands
|
|
||||||
uint32_t reserved2; //!< [0x03c-0x03f] Reserved for future use
|
|
||||||
uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
|
|
||||||
//! details
|
|
||||||
uint8_t deviceType; //!< [0x044-0x044] Device Type: See Flash Type Definition for more details
|
|
||||||
uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal
|
|
||||||
uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
|
|
||||||
//! Chapter for more details
|
|
||||||
uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
|
|
||||||
//! be done using 1 LUT sequence, currently, only applicable to HyperFLASH
|
|
||||||
uint32_t reserved3[2]; //!< [0x048-0x04f] Reserved for future use
|
|
||||||
uint32_t sflashA1Size; //!< [0x050-0x053] Size of Flash connected to A1
|
|
||||||
uint32_t sflashA2Size; //!< [0x054-0x057] Size of Flash connected to A2
|
|
||||||
uint32_t sflashB1Size; //!< [0x058-0x05b] Size of Flash connected to B1
|
|
||||||
uint32_t sflashB2Size; //!< [0x05c-0x05f] Size of Flash connected to B2
|
|
||||||
uint32_t csPadSettingOverride; //!< [0x060-0x063] CS pad setting override value
|
|
||||||
uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value
|
|
||||||
uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value
|
|
||||||
uint32_t dqsPadSettingOverride; //!< [0x06c-0x06f] DQS pad setting override value
|
|
||||||
uint32_t timeoutInMs; //!< [0x070-0x073] Timeout threshold for read status command
|
|
||||||
uint32_t commandInterval; //!< [0x074-0x077] CS deselect interval between two commands
|
|
||||||
uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns
|
|
||||||
uint16_t busyOffset; //!< [0x07c-0x07d] Busy offset, valid value: 0-31
|
|
||||||
uint16_t busyBitPolarity; //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
|
|
||||||
//! busy flag is 0 when flash device is busy
|
|
||||||
uint32_t lookupTable[64]; //!< [0x080-0x17f] Lookup table holds Flash command sequences
|
|
||||||
flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences
|
|
||||||
uint32_t reserved4[4]; //!< [0x1b0-0x1bf] Reserved for future use
|
|
||||||
} flexspi_mem_config_t;
|
|
||||||
|
|
||||||
/* */
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL 0
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG 1
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD 2
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 4
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG 6
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD 7
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READID 8
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_ENTERQPI 10
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_EXITQPI 12
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Serial NOR configuration block
|
|
||||||
*/
|
|
||||||
typedef struct _flexspi_nor_config
|
|
||||||
{
|
|
||||||
flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI
|
|
||||||
uint32_t pageSize; //!< Page size of Serial NOR
|
|
||||||
uint32_t sectorSize; //!< Sector size of Serial NOR
|
|
||||||
uint8_t ipcmdSerialClkFreq; //!< Clock frequency for IP command
|
|
||||||
uint8_t isUniformBlockSize; //!< Sector/Block size is the same
|
|
||||||
uint8_t reserved0[2]; //!< Reserved for future use
|
|
||||||
uint8_t serialNorType; //!< Serial NOR Flash type: 0/1/2/3
|
|
||||||
uint8_t needExitNoCmdMode; //!< Need to exit NoCmd mode before other IP command
|
|
||||||
uint8_t halfClkForNonReadCmd; //!< Half the Serial Clock for non-read command: true/false
|
|
||||||
uint8_t needRestoreNoCmdMode; //!< Need to Restore NoCmd mode after IP commmand execution
|
|
||||||
uint32_t blockSize; //!< Block size
|
|
||||||
uint32_t reserve2[11]; //!< Reserved for future use
|
|
||||||
} flexspi_nor_config_t;
|
|
||||||
|
|
||||||
#define FLASH_BUSY_STATUS_POL 0
|
|
||||||
#define FLASH_BUSY_STATUS_OFFSET 0
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* __EVKMIMXRT1011_FLEXSPI_NOR_CONFIG__ */
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2019 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Based on tinyusb/hw/bsp/teensy_40/evkmimxrt1010_flexspi_nor_config.c
|
|
||||||
|
|
||||||
#include "evkmimxrt1010_flexspi_nor_config.h"
|
|
||||||
|
|
||||||
/* Component ID definition, used by tools. */
|
|
||||||
#ifndef FSL_COMPONENT_ID
|
|
||||||
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Code
|
|
||||||
******************************************************************************/
|
|
||||||
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
|
||||||
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
|
|
||||||
__attribute__((section(".boot_hdr.conf")))
|
|
||||||
#elif defined(__ICCARM__)
|
|
||||||
#pragma location = ".boot_hdr.conf"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const flexspi_nor_config_t qspiflash_config = {
|
|
||||||
.memConfig =
|
|
||||||
{
|
|
||||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
|
||||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
|
||||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
|
||||||
.csHoldTime = 3u,
|
|
||||||
.csSetupTime = 3u,
|
|
||||||
.sflashPadType = kSerialFlash_4Pads,
|
|
||||||
.serialClkFreq = kFlexSpiSerialClk_100MHz,
|
|
||||||
.sflashA1Size = 16u * 1024u * 1024u,
|
|
||||||
.lookupTable =
|
|
||||||
{
|
|
||||||
// 0 Read LUTs 0 -> 0
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
|
||||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 1 Read status register -> 1
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x01),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 2 Fast read quad mode - SDR
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x6B, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
|
||||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x08, READ_SDR, FLEXSPI_4PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 3 Write Enable -> 3
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 4 Read extend parameters
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x81, READ_SDR, FLEXSPI_1PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 5 Erase Sector -> 5
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 24),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 6 Write Status Reg
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01, WRITE_SDR, FLEXSPI_1PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 7 Page Program - quad mode (-> 9)
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
|
||||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 8 Read ID
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x90, DUMMY_SDR, FLEXSPI_1PAD, 24),
|
|
||||||
FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_1PAD, 0x00, 0, 0, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 9 Page Program - single mode -> 9
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 24),
|
|
||||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0, 0, 0, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 10 Enter QPI mode
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x35, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 11 Erase Chip
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 12 Exit QPI mode
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_4PAD, 0xF5, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.pageSize = 256u,
|
|
||||||
.sectorSize = 4u * 1024u,
|
|
||||||
.blockSize = 256u * 1024u,
|
|
||||||
.isUniformBlockSize = false,
|
|
||||||
};
|
|
||||||
#endif /* XIP_BOOT_HEADER_ENABLE */
|
|
||||||
@@ -1,14 +1,10 @@
|
|||||||
#define MICROPY_HW_BOARD_NAME "i.MX RT1010 EVK"
|
#define MICROPY_HW_BOARD_NAME "i.MX RT1010 EVK"
|
||||||
#define MICROPY_HW_MCU_NAME "MIMXRT1011DAE5A"
|
#define MICROPY_HW_MCU_NAME "MIMXRT1011DAE5A"
|
||||||
|
|
||||||
#define BOARD_FLASH_SIZE (16 * 1024 * 1024)
|
|
||||||
|
|
||||||
// i.MX RT1010 EVK has 1 board LED
|
// i.MX RT1010 EVK has 1 board LED
|
||||||
#define MICROPY_HW_LED1_PIN (pin_GPIO_11)
|
#define MICROPY_HW_LED1_PIN (pin_GPIO_11)
|
||||||
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
||||||
#define BOARD_FLASH_CONFIG_HEADER_H "evkmimxrt1010_flexspi_nor_config.h"
|
|
||||||
#define BOARD_FLASH_OPS_HEADER_H "hal/flexspi_nor_flash.h"
|
|
||||||
|
|
||||||
#define MICROPY_HW_NUM_PIN_IRQS (2 * 32)
|
#define MICROPY_HW_NUM_PIN_IRQS (2 * 32)
|
||||||
|
|
||||||
|
|||||||
@@ -3,21 +3,18 @@ MCU_VARIANT = MIMXRT1011DAE5A
|
|||||||
|
|
||||||
MICROPY_FLOAT_IMPL = single
|
MICROPY_FLOAT_IMPL = single
|
||||||
MICROPY_PY_MACHINE_SDCARD = 0
|
MICROPY_PY_MACHINE_SDCARD = 0
|
||||||
|
BOARD_FLASH_TYPE ?= qspi_nor
|
||||||
|
BOARD_FLASH_SIZE ?= 0x1000000 # 16MB
|
||||||
|
|
||||||
SRC_C += \
|
JLINK_PATH ?= /media/RT1010-EVK/
|
||||||
hal/flexspi_nor_flash.c \
|
|
||||||
|
|
||||||
JLINK_PATH = /media/RT1010-EVK/
|
|
||||||
JLINK_COMMANDER_SCRIPT = $(BUILD)/script.jlink
|
JLINK_COMMANDER_SCRIPT = $(BUILD)/script.jlink
|
||||||
|
|
||||||
|
|
||||||
ifdef JLINK_IP
|
ifdef JLINK_IP
|
||||||
JLINK_CONNECTION_SETTINGS = -IP $(JLINK_IP)
|
JLINK_CONNECTION_SETTINGS = -IP $(JLINK_IP)
|
||||||
else
|
else
|
||||||
JLINK_CONNECTION_SETTINGS = -USB
|
JLINK_CONNECTION_SETTINGS = -USB
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
deploy_jlink: $(BUILD)/firmware.hex
|
deploy_jlink: $(BUILD)/firmware.hex
|
||||||
$(Q)$(TOUCH) $(JLINK_COMMANDER_SCRIPT)
|
$(Q)$(TOUCH) $(JLINK_COMMANDER_SCRIPT)
|
||||||
$(ECHO) "ExitOnError 1" > $(JLINK_COMMANDER_SCRIPT)
|
$(ECHO) "ExitOnError 1" > $(JLINK_COMMANDER_SCRIPT)
|
||||||
|
|||||||
124
ports/mimxrt/boards/MIMXRT1010_EVK/qspi_nor_flash_config.c
Normal file
124
ports/mimxrt/boards/MIMXRT1010_EVK/qspi_nor_flash_config.c
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Based on tinyusb/hw/bsp/teensy_40/evkmimxrt1010_flexspi_nor_config.c
|
||||||
|
|
||||||
|
#include BOARD_FLASH_CONFIG_HEADER_H
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
||||||
|
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
|
||||||
|
__attribute__((section(".boot_hdr.conf")))
|
||||||
|
#elif defined(__ICCARM__)
|
||||||
|
#pragma location = ".boot_hdr.conf"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const flexspi_nor_config_t qspiflash_config = {
|
||||||
|
.memConfig =
|
||||||
|
{
|
||||||
|
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||||
|
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||||
|
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||||
|
.csHoldTime = 3u,
|
||||||
|
.csSetupTime = 3u,
|
||||||
|
.sflashPadType = kSerialFlash_4Pads,
|
||||||
|
.serialClkFreq = kFlexSpiSerialClk_100MHz,
|
||||||
|
.sflashA1Size = BOARD_FLASH_SIZE,
|
||||||
|
.lookupTable =
|
||||||
|
{
|
||||||
|
// 0 Read LUTs 0 -> 0
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 1 Read status register -> 1
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x01),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 2 Fast read quad mode - SDR
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x6B, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x08, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 3 Write Enable -> 3
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 4 Read extend parameters
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x81, READ_SDR, FLEXSPI_1PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 5 Erase Sector -> 5
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 6 Write Status Reg
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01, WRITE_SDR, FLEXSPI_1PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 7 Page Program - quad mode (-> 9)
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 8 Read ID
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x90, DUMMY_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_1PAD, 0x00, 0, 0, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 9 Page Program - single mode -> 9
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0, 0, 0, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 10 Enter QPI mode
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x35, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 11 Erase Chip
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 12 Exit QPI mode
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_4PAD, 0xF5, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.pageSize = 256u,
|
||||||
|
.sectorSize = 4u * 1024u,
|
||||||
|
.blockSize = 256u * 1024u,
|
||||||
|
.isUniformBlockSize = false,
|
||||||
|
};
|
||||||
|
#endif /* XIP_BOOT_HEADER_ENABLE */
|
||||||
@@ -1,15 +1,24 @@
|
|||||||
/* Memory configuration */
|
/* Memory configuration */
|
||||||
|
#if BOARD_FLASH_RESERVED
|
||||||
|
reserved_size = BOARD_FLASH_RESERVED;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if BOARD_FLASH_TYPE==qspi_nor
|
||||||
flash_start = 0x60000000;
|
flash_start = 0x60000000;
|
||||||
|
#else
|
||||||
|
#error Unknown BOARD_FLASH_TYPE
|
||||||
|
#endif
|
||||||
|
flash_size = BOARD_FLASH_SIZE;
|
||||||
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));
|
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));
|
||||||
flash_config_start = 0x60000400;
|
flash_config_start = flash_start + 0x00000400;
|
||||||
flash_config_size = 0x00000C00;
|
flash_config_size = 0x00000C00;
|
||||||
ivt_start = 0x60001000;
|
ivt_start = flash_start + 0x00001000;
|
||||||
ivt_size = 0x00001000;
|
ivt_size = 0x00001000;
|
||||||
interrupts_start = 0x60002000;
|
interrupts_start = flash_start + 0x00002000;
|
||||||
interrupts_size = 0x00000400;
|
interrupts_size = 0x00000400;
|
||||||
text_start = 0x60002400;
|
text_start = flash_start + 0x00002400;
|
||||||
text_size = ((((text_start) + 1M) + (4k - 1)) & ~(4k - 1)) - (text_start); /* reserve 1M for code but align on 4k boundary */
|
vfs_start = flash_start + 0x00100000;
|
||||||
vfs_start = (text_start) + (text_size);
|
text_size = ((vfs_start) - (text_start));
|
||||||
vfs_size = ((flash_end) - (vfs_start));
|
vfs_size = ((flash_end) - (vfs_start));
|
||||||
itcm_start = 0x00000000;
|
itcm_start = 0x00000000;
|
||||||
itcm_size = 0x00008000;
|
itcm_size = 0x00008000;
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
flash_size = 8M;
|
|
||||||
@@ -0,0 +1,258 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019 NXP.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Based on tinyusb/hw/bsp/teensy_40/evkmimxrt1020_flexspi_nor_config.h
|
||||||
|
|
||||||
|
#ifndef __EVKMIMXRT1020_FLEXSPI_NOR_CONFIG__
|
||||||
|
#define __EVKMIMXRT1020_FLEXSPI_NOR_CONFIG__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*! @name Driver version */
|
||||||
|
/*@{*/
|
||||||
|
/*! @brief XIP_BOARD driver version 2.0.0. */
|
||||||
|
#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/* FLEXSPI memory config block related defintions */
|
||||||
|
#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian
|
||||||
|
#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0
|
||||||
|
#define FLEXSPI_CFG_BLK_SIZE (512)
|
||||||
|
|
||||||
|
/* FLEXSPI Feature related definitions */
|
||||||
|
#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
|
||||||
|
|
||||||
|
/* Lookup table related defintions */
|
||||||
|
#define CMD_INDEX_READ 0
|
||||||
|
#define CMD_INDEX_READSTATUS 1
|
||||||
|
#define CMD_INDEX_WRITEENABLE 2
|
||||||
|
#define CMD_INDEX_WRITE 4
|
||||||
|
|
||||||
|
#define CMD_LUT_SEQ_IDX_READ 0
|
||||||
|
#define CMD_LUT_SEQ_IDX_READSTATUS 1
|
||||||
|
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
||||||
|
#define CMD_LUT_SEQ_IDX_WRITE 9
|
||||||
|
|
||||||
|
#define CMD_SDR 0x01
|
||||||
|
#define CMD_DDR 0x21
|
||||||
|
#define RADDR_SDR 0x02
|
||||||
|
#define RADDR_DDR 0x22
|
||||||
|
#define CADDR_SDR 0x03
|
||||||
|
#define CADDR_DDR 0x23
|
||||||
|
#define MODE1_SDR 0x04
|
||||||
|
#define MODE1_DDR 0x24
|
||||||
|
#define MODE2_SDR 0x05
|
||||||
|
#define MODE2_DDR 0x25
|
||||||
|
#define MODE4_SDR 0x06
|
||||||
|
#define MODE4_DDR 0x26
|
||||||
|
#define MODE8_SDR 0x07
|
||||||
|
#define MODE8_DDR 0x27
|
||||||
|
#define WRITE_SDR 0x08
|
||||||
|
#define WRITE_DDR 0x28
|
||||||
|
#define READ_SDR 0x09
|
||||||
|
#define READ_DDR 0x29
|
||||||
|
#define LEARN_SDR 0x0A
|
||||||
|
#define LEARN_DDR 0x2A
|
||||||
|
#define DATSZ_SDR 0x0B
|
||||||
|
#define DATSZ_DDR 0x2B
|
||||||
|
#define DUMMY_SDR 0x0C
|
||||||
|
#define DUMMY_DDR 0x2C
|
||||||
|
#define DUMMY_RWDS_SDR 0x0D
|
||||||
|
#define DUMMY_RWDS_DDR 0x2D
|
||||||
|
#define JMP_ON_CS 0x1F
|
||||||
|
#define STOP 0
|
||||||
|
|
||||||
|
#define FLEXSPI_1PAD 0
|
||||||
|
#define FLEXSPI_2PAD 1
|
||||||
|
#define FLEXSPI_4PAD 2
|
||||||
|
#define FLEXSPI_8PAD 3
|
||||||
|
|
||||||
|
#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
|
||||||
|
(FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
|
||||||
|
FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
||||||
|
|
||||||
|
// !@brief Definitions for FlexSPI Serial Clock Frequency
|
||||||
|
typedef enum _FlexSpiSerialClockFreq
|
||||||
|
{
|
||||||
|
kFlexSpiSerialClk_30MHz = 1,
|
||||||
|
kFlexSpiSerialClk_50MHz = 2,
|
||||||
|
kFlexSpiSerialClk_60MHz = 3,
|
||||||
|
kFlexSpiSerialClk_75MHz = 4,
|
||||||
|
kFlexSpiSerialClk_80MHz = 5,
|
||||||
|
kFlexSpiSerialClk_100MHz = 6,
|
||||||
|
kFlexSpiSerialClk_133MHz = 7,
|
||||||
|
kFlexSpiSerialClk_166MHz = 8,
|
||||||
|
kFlexSpiSerialClk_200MHz = 9,
|
||||||
|
} flexspi_serial_clk_freq_t;
|
||||||
|
|
||||||
|
// !@brief FlexSPI clock configuration type
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiClk_SDR, // !< Clock configure for SDR mode
|
||||||
|
kFlexSpiClk_DDR, // !< Clock configurat for DDR mode
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI Read Sample Clock Source definition
|
||||||
|
typedef enum _FlashReadSampleClkSource
|
||||||
|
{
|
||||||
|
kFlexSPIReadSampleClk_LoopbackInternally = 0,
|
||||||
|
kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
|
||||||
|
kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
|
||||||
|
kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
|
||||||
|
} flexspi_read_sample_clk_t;
|
||||||
|
|
||||||
|
// !@brief Misc feature bit definitions
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiMiscOffset_DiffClkEnable = 0, // !< Bit for Differential clock enable
|
||||||
|
kFlexSpiMiscOffset_Ck2Enable = 1, // !< Bit for CK2 enable
|
||||||
|
kFlexSpiMiscOffset_ParallelEnable = 2, // !< Bit for Parallel mode enable
|
||||||
|
kFlexSpiMiscOffset_WordAddressableEnable = 3, // !< Bit for Word Addressable enable
|
||||||
|
kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, // !< Bit for Safe Configuration Frequency enable
|
||||||
|
kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, // !< Bit for Pad setting override enable
|
||||||
|
kFlexSpiMiscOffset_DdrModeEnable = 6, // !< Bit for DDR clock confiuration indication.
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief Flash Type Definition
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiDeviceType_SerialNOR = 1, // !< Flash devices are Serial NOR
|
||||||
|
kFlexSpiDeviceType_SerialNAND = 2, // !< Flash devices are Serial NAND
|
||||||
|
kFlexSpiDeviceType_SerialRAM = 3, // !< Flash devices are Serial RAM/HyperFLASH
|
||||||
|
kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, // !< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND
|
||||||
|
kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, // !< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief Flash Pad Definitions
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kSerialFlash_1Pad = 1,
|
||||||
|
kSerialFlash_2Pads = 2,
|
||||||
|
kSerialFlash_4Pads = 4,
|
||||||
|
kSerialFlash_8Pads = 8,
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI LUT Sequence structure
|
||||||
|
typedef struct _lut_sequence
|
||||||
|
{
|
||||||
|
uint8_t seqNum; // !< Sequence Number, valid number: 1-16
|
||||||
|
uint8_t seqId; // !< Sequence Index, valid number: 0-15
|
||||||
|
uint16_t reserved;
|
||||||
|
} flexspi_lut_seq_t;
|
||||||
|
|
||||||
|
// !@brief Flash Configuration Command Type
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kDeviceConfigCmdType_Generic, // !< Generic command, for example: configure dummy cycles, drive strength, etc
|
||||||
|
kDeviceConfigCmdType_QuadEnable, // !< Quad Enable command
|
||||||
|
kDeviceConfigCmdType_Spi2Xpi, // !< Switch from SPI to DPI/QPI/OPI mode
|
||||||
|
kDeviceConfigCmdType_Xpi2Spi, // !< Switch from DPI/QPI/OPI to SPI mode
|
||||||
|
kDeviceConfigCmdType_Spi2NoCmd, // !< Switch to 0-4-4/0-8-8 mode
|
||||||
|
kDeviceConfigCmdType_Reset, // !< Reset device command
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI Memory Configuration Block
|
||||||
|
typedef struct _FlexSPIConfig
|
||||||
|
{
|
||||||
|
uint32_t tag; // !< [0x000-0x003] Tag, fixed value 0x42464346UL
|
||||||
|
uint32_t version; // !< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix
|
||||||
|
uint32_t reserved0; // !< [0x008-0x00b] Reserved for future use
|
||||||
|
uint8_t readSampleClkSrc; // !< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3
|
||||||
|
uint8_t csHoldTime; // !< [0x00d-0x00d] CS hold time, default value: 3
|
||||||
|
uint8_t csSetupTime; // !< [0x00e-0x00e] CS setup time, default value: 3
|
||||||
|
uint8_t columnAddressWidth; // !< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
|
||||||
|
// ! Serial NAND, need to refer to datasheet
|
||||||
|
uint8_t deviceModeCfgEnable; // !< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable
|
||||||
|
uint8_t deviceModeType; // !< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
|
||||||
|
// ! Generic configuration, etc.
|
||||||
|
uint16_t waitTimeCfgCommands; // !< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
|
||||||
|
// ! DPI/QPI/OPI switch or reset command
|
||||||
|
flexspi_lut_seq_t deviceModeSeq; // !< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
|
||||||
|
// ! sequence number, [31:16] Reserved
|
||||||
|
uint32_t deviceModeArg; // !< [0x018-0x01b] Argument/Parameter for device configuration
|
||||||
|
uint8_t configCmdEnable; // !< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable
|
||||||
|
uint8_t configModeType[3]; // !< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe
|
||||||
|
flexspi_lut_seq_t
|
||||||
|
configCmdSeqs[3]; // !< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq
|
||||||
|
uint32_t reserved1; // !< [0x02c-0x02f] Reserved for future use
|
||||||
|
uint32_t configCmdArgs[3]; // !< [0x030-0x03b] Arguments/Parameters for device Configuration commands
|
||||||
|
uint32_t reserved2; // !< [0x03c-0x03f] Reserved for future use
|
||||||
|
uint32_t controllerMiscOption; // !< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
|
||||||
|
// ! details
|
||||||
|
uint8_t deviceType; // !< [0x044-0x044] Device Type: See Flash Type Definition for more details
|
||||||
|
uint8_t sflashPadType; // !< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal
|
||||||
|
uint8_t serialClkFreq; // !< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
|
||||||
|
// ! Chapter for more details
|
||||||
|
uint8_t lutCustomSeqEnable; // !< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
|
||||||
|
// ! be done using 1 LUT sequence, currently, only applicable to HyperFLASH
|
||||||
|
uint32_t reserved3[2]; // !< [0x048-0x04f] Reserved for future use
|
||||||
|
uint32_t sflashA1Size; // !< [0x050-0x053] Size of Flash connected to A1
|
||||||
|
uint32_t sflashA2Size; // !< [0x054-0x057] Size of Flash connected to A2
|
||||||
|
uint32_t sflashB1Size; // !< [0x058-0x05b] Size of Flash connected to B1
|
||||||
|
uint32_t sflashB2Size; // !< [0x05c-0x05f] Size of Flash connected to B2
|
||||||
|
uint32_t csPadSettingOverride; // !< [0x060-0x063] CS pad setting override value
|
||||||
|
uint32_t sclkPadSettingOverride; // !< [0x064-0x067] SCK pad setting override value
|
||||||
|
uint32_t dataPadSettingOverride; // !< [0x068-0x06b] data pad setting override value
|
||||||
|
uint32_t dqsPadSettingOverride; // !< [0x06c-0x06f] DQS pad setting override value
|
||||||
|
uint32_t timeoutInMs; // !< [0x070-0x073] Timeout threshold for read status command
|
||||||
|
uint32_t commandInterval; // !< [0x074-0x077] CS deselect interval between two commands
|
||||||
|
uint16_t dataValidTime[2]; // !< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns
|
||||||
|
uint16_t busyOffset; // !< [0x07c-0x07d] Busy offset, valid value: 0-31
|
||||||
|
uint16_t busyBitPolarity; // !< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
|
||||||
|
// ! busy flag is 0 when flash device is busy
|
||||||
|
uint32_t lookupTable[64]; // !< [0x080-0x17f] Lookup table holds Flash command sequences
|
||||||
|
flexspi_lut_seq_t lutCustomSeq[12]; // !< [0x180-0x1af] Customizable LUT Sequences
|
||||||
|
uint32_t reserved4[4]; // !< [0x1b0-0x1bf] Reserved for future use
|
||||||
|
} flexspi_mem_config_t;
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL 0
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG 1
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD 2
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 4
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG 6
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD 7
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READID 8
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_ENTERQPI 10
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_EXITQPI 12
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Serial NOR configuration block
|
||||||
|
*/
|
||||||
|
typedef struct _flexspi_nor_config
|
||||||
|
{
|
||||||
|
flexspi_mem_config_t memConfig; // !< Common memory configuration info via FlexSPI
|
||||||
|
uint32_t pageSize; // !< Page size of Serial NOR
|
||||||
|
uint32_t sectorSize; // !< Sector size of Serial NOR
|
||||||
|
uint8_t ipcmdSerialClkFreq; // !< Clock frequency for IP command
|
||||||
|
uint8_t isUniformBlockSize; // !< Sector/Block size is the same
|
||||||
|
uint8_t reserved0[2]; // !< Reserved for future use
|
||||||
|
uint8_t serialNorType; // !< Serial NOR Flash type: 0/1/2/3
|
||||||
|
uint8_t needExitNoCmdMode; // !< Need to exit NoCmd mode before other IP command
|
||||||
|
uint8_t halfClkForNonReadCmd; // !< Half the Serial Clock for non-read command: true/false
|
||||||
|
uint8_t needRestoreNoCmdMode; // !< Need to Restore NoCmd mode after IP commmand execution
|
||||||
|
uint32_t blockSize; // !< Block size
|
||||||
|
uint32_t reserve2[11]; // !< Reserved for future use
|
||||||
|
} flexspi_nor_config_t;
|
||||||
|
|
||||||
|
#define FLASH_BUSY_STATUS_POL 0
|
||||||
|
#define FLASH_BUSY_STATUS_OFFSET 0
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* __EVKMIMXRT1020_FLEXSPI_NOR_CONFIG__ */
|
||||||
114
ports/mimxrt/boards/MIMXRT1020_EVK/clock_config.h
Normal file
114
ports/mimxrt/boards/MIMXRT1020_EVK/clock_config.h
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018-2019 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CLOCK_CONFIG_H_
|
||||||
|
#define _CLOCK_CONFIG_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_XTAL0_CLK_HZ 24000000U /*!< Board xtal0 frequency in Hz */
|
||||||
|
|
||||||
|
#define BOARD_XTAL32K_CLK_HZ 32768U /*!< Board xtal32k frequency in Hz */
|
||||||
|
/*******************************************************************************
|
||||||
|
************************ BOARD_InitBootClocks function ************************
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes default configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_InitBootClocks(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
********************** Configuration BOARD_BootClockRUN ***********************
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions for BOARD_BootClockRUN configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CORE_CLOCK 500000000U /*!< Core clock frequency: 500000000Hz */
|
||||||
|
|
||||||
|
/* Clock outputs (values are in Hz): */
|
||||||
|
#define BOARD_BOOTCLOCKRUN_AHB_CLK_ROOT 500000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CAN_CLK_ROOT 40000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT 32768UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLKO1_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLKO2_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLK_1M 1000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLK_24M 24000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET1_TX_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET_125M_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET_25M_REF_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET_500M_REF_CLK 500000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT 132000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ 62500000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ 62500000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT 125000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT 60000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT 105600000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_MQS_MCLK 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT 62500000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK2 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SEMC_CLK_ROOT 62500000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT 117333333UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT 80000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USBPHY1_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USDHC1_CLK_ROOT 176000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USDHC2_CLK_ROOT 176000000UL
|
||||||
|
|
||||||
|
/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;
|
||||||
|
/*! @brief Sys PLL for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;
|
||||||
|
/*! @brief Enet PLL set for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_enet_pll_config_t enetPllConfig_BOARD_BootClockRUN;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API for BOARD_BootClockRUN configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_BootClockRUN(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
#endif /* _CLOCK_CONFIG_H_ */
|
||||||
@@ -1,258 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2019 NXP.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Based on tinyusb/hw/bsp/teensy_40/evkmimxrt1020_flexspi_nor_config.h
|
|
||||||
|
|
||||||
#ifndef __EVKMIMXRT1020_FLEXSPI_NOR_CONFIG__
|
|
||||||
#define __EVKMIMXRT1020_FLEXSPI_NOR_CONFIG__
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include "fsl_common.h"
|
|
||||||
|
|
||||||
/*! @name Driver version */
|
|
||||||
/*@{*/
|
|
||||||
/*! @brief XIP_BOARD driver version 2.0.0. */
|
|
||||||
#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
|
|
||||||
/*@}*/
|
|
||||||
|
|
||||||
/* FLEXSPI memory config block related defintions */
|
|
||||||
#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian
|
|
||||||
#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0
|
|
||||||
#define FLEXSPI_CFG_BLK_SIZE (512)
|
|
||||||
|
|
||||||
/* FLEXSPI Feature related definitions */
|
|
||||||
#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
|
|
||||||
|
|
||||||
/* Lookup table related defintions */
|
|
||||||
#define CMD_INDEX_READ 0
|
|
||||||
#define CMD_INDEX_READSTATUS 1
|
|
||||||
#define CMD_INDEX_WRITEENABLE 2
|
|
||||||
#define CMD_INDEX_WRITE 4
|
|
||||||
|
|
||||||
#define CMD_LUT_SEQ_IDX_READ 0
|
|
||||||
#define CMD_LUT_SEQ_IDX_READSTATUS 1
|
|
||||||
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
|
||||||
#define CMD_LUT_SEQ_IDX_WRITE 9
|
|
||||||
|
|
||||||
#define CMD_SDR 0x01
|
|
||||||
#define CMD_DDR 0x21
|
|
||||||
#define RADDR_SDR 0x02
|
|
||||||
#define RADDR_DDR 0x22
|
|
||||||
#define CADDR_SDR 0x03
|
|
||||||
#define CADDR_DDR 0x23
|
|
||||||
#define MODE1_SDR 0x04
|
|
||||||
#define MODE1_DDR 0x24
|
|
||||||
#define MODE2_SDR 0x05
|
|
||||||
#define MODE2_DDR 0x25
|
|
||||||
#define MODE4_SDR 0x06
|
|
||||||
#define MODE4_DDR 0x26
|
|
||||||
#define MODE8_SDR 0x07
|
|
||||||
#define MODE8_DDR 0x27
|
|
||||||
#define WRITE_SDR 0x08
|
|
||||||
#define WRITE_DDR 0x28
|
|
||||||
#define READ_SDR 0x09
|
|
||||||
#define READ_DDR 0x29
|
|
||||||
#define LEARN_SDR 0x0A
|
|
||||||
#define LEARN_DDR 0x2A
|
|
||||||
#define DATSZ_SDR 0x0B
|
|
||||||
#define DATSZ_DDR 0x2B
|
|
||||||
#define DUMMY_SDR 0x0C
|
|
||||||
#define DUMMY_DDR 0x2C
|
|
||||||
#define DUMMY_RWDS_SDR 0x0D
|
|
||||||
#define DUMMY_RWDS_DDR 0x2D
|
|
||||||
#define JMP_ON_CS 0x1F
|
|
||||||
#define STOP 0
|
|
||||||
|
|
||||||
#define FLEXSPI_1PAD 0
|
|
||||||
#define FLEXSPI_2PAD 1
|
|
||||||
#define FLEXSPI_4PAD 2
|
|
||||||
#define FLEXSPI_8PAD 3
|
|
||||||
|
|
||||||
#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
|
|
||||||
(FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
|
|
||||||
FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
|
||||||
|
|
||||||
//!@brief Definitions for FlexSPI Serial Clock Frequency
|
|
||||||
typedef enum _FlexSpiSerialClockFreq
|
|
||||||
{
|
|
||||||
kFlexSpiSerialClk_30MHz = 1,
|
|
||||||
kFlexSpiSerialClk_50MHz = 2,
|
|
||||||
kFlexSpiSerialClk_60MHz = 3,
|
|
||||||
kFlexSpiSerialClk_75MHz = 4,
|
|
||||||
kFlexSpiSerialClk_80MHz = 5,
|
|
||||||
kFlexSpiSerialClk_100MHz = 6,
|
|
||||||
kFlexSpiSerialClk_133MHz = 7,
|
|
||||||
kFlexSpiSerialClk_166MHz = 8,
|
|
||||||
kFlexSpiSerialClk_200MHz = 9,
|
|
||||||
} flexspi_serial_clk_freq_t;
|
|
||||||
|
|
||||||
//!@brief FlexSPI clock configuration type
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiClk_SDR, //!< Clock configure for SDR mode
|
|
||||||
kFlexSpiClk_DDR, //!< Clock configurat for DDR mode
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI Read Sample Clock Source definition
|
|
||||||
typedef enum _FlashReadSampleClkSource
|
|
||||||
{
|
|
||||||
kFlexSPIReadSampleClk_LoopbackInternally = 0,
|
|
||||||
kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
|
|
||||||
kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
|
|
||||||
kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
|
|
||||||
} flexspi_read_sample_clk_t;
|
|
||||||
|
|
||||||
//!@brief Misc feature bit definitions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiMiscOffset_DiffClkEnable = 0, //!< Bit for Differential clock enable
|
|
||||||
kFlexSpiMiscOffset_Ck2Enable = 1, //!< Bit for CK2 enable
|
|
||||||
kFlexSpiMiscOffset_ParallelEnable = 2, //!< Bit for Parallel mode enable
|
|
||||||
kFlexSpiMiscOffset_WordAddressableEnable = 3, //!< Bit for Word Addressable enable
|
|
||||||
kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, //!< Bit for Safe Configuration Frequency enable
|
|
||||||
kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable
|
|
||||||
kFlexSpiMiscOffset_DdrModeEnable = 6, //!< Bit for DDR clock confiuration indication.
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief Flash Type Definition
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiDeviceType_SerialNOR = 1, //!< Flash devices are Serial NOR
|
|
||||||
kFlexSpiDeviceType_SerialNAND = 2, //!< Flash devices are Serial NAND
|
|
||||||
kFlexSpiDeviceType_SerialRAM = 3, //!< Flash devices are Serial RAM/HyperFLASH
|
|
||||||
kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND
|
|
||||||
kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, //!< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief Flash Pad Definitions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kSerialFlash_1Pad = 1,
|
|
||||||
kSerialFlash_2Pads = 2,
|
|
||||||
kSerialFlash_4Pads = 4,
|
|
||||||
kSerialFlash_8Pads = 8,
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI LUT Sequence structure
|
|
||||||
typedef struct _lut_sequence
|
|
||||||
{
|
|
||||||
uint8_t seqNum; //!< Sequence Number, valid number: 1-16
|
|
||||||
uint8_t seqId; //!< Sequence Index, valid number: 0-15
|
|
||||||
uint16_t reserved;
|
|
||||||
} flexspi_lut_seq_t;
|
|
||||||
|
|
||||||
//!@brief Flash Configuration Command Type
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kDeviceConfigCmdType_Generic, //!< Generic command, for example: configure dummy cycles, drive strength, etc
|
|
||||||
kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command
|
|
||||||
kDeviceConfigCmdType_Spi2Xpi, //!< Switch from SPI to DPI/QPI/OPI mode
|
|
||||||
kDeviceConfigCmdType_Xpi2Spi, //!< Switch from DPI/QPI/OPI to SPI mode
|
|
||||||
kDeviceConfigCmdType_Spi2NoCmd, //!< Switch to 0-4-4/0-8-8 mode
|
|
||||||
kDeviceConfigCmdType_Reset, //!< Reset device command
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI Memory Configuration Block
|
|
||||||
typedef struct _FlexSPIConfig
|
|
||||||
{
|
|
||||||
uint32_t tag; //!< [0x000-0x003] Tag, fixed value 0x42464346UL
|
|
||||||
uint32_t version; //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix
|
|
||||||
uint32_t reserved0; //!< [0x008-0x00b] Reserved for future use
|
|
||||||
uint8_t readSampleClkSrc; //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3
|
|
||||||
uint8_t csHoldTime; //!< [0x00d-0x00d] CS hold time, default value: 3
|
|
||||||
uint8_t csSetupTime; //!< [0x00e-0x00e] CS setup time, default value: 3
|
|
||||||
uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
|
|
||||||
//! Serial NAND, need to refer to datasheet
|
|
||||||
uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable
|
|
||||||
uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
|
|
||||||
//! Generic configuration, etc.
|
|
||||||
uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
|
|
||||||
//! DPI/QPI/OPI switch or reset command
|
|
||||||
flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
|
|
||||||
//! sequence number, [31:16] Reserved
|
|
||||||
uint32_t deviceModeArg; //!< [0x018-0x01b] Argument/Parameter for device configuration
|
|
||||||
uint8_t configCmdEnable; //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable
|
|
||||||
uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe
|
|
||||||
flexspi_lut_seq_t
|
|
||||||
configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq
|
|
||||||
uint32_t reserved1; //!< [0x02c-0x02f] Reserved for future use
|
|
||||||
uint32_t configCmdArgs[3]; //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands
|
|
||||||
uint32_t reserved2; //!< [0x03c-0x03f] Reserved for future use
|
|
||||||
uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
|
|
||||||
//! details
|
|
||||||
uint8_t deviceType; //!< [0x044-0x044] Device Type: See Flash Type Definition for more details
|
|
||||||
uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal
|
|
||||||
uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
|
|
||||||
//! Chapter for more details
|
|
||||||
uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
|
|
||||||
//! be done using 1 LUT sequence, currently, only applicable to HyperFLASH
|
|
||||||
uint32_t reserved3[2]; //!< [0x048-0x04f] Reserved for future use
|
|
||||||
uint32_t sflashA1Size; //!< [0x050-0x053] Size of Flash connected to A1
|
|
||||||
uint32_t sflashA2Size; //!< [0x054-0x057] Size of Flash connected to A2
|
|
||||||
uint32_t sflashB1Size; //!< [0x058-0x05b] Size of Flash connected to B1
|
|
||||||
uint32_t sflashB2Size; //!< [0x05c-0x05f] Size of Flash connected to B2
|
|
||||||
uint32_t csPadSettingOverride; //!< [0x060-0x063] CS pad setting override value
|
|
||||||
uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value
|
|
||||||
uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value
|
|
||||||
uint32_t dqsPadSettingOverride; //!< [0x06c-0x06f] DQS pad setting override value
|
|
||||||
uint32_t timeoutInMs; //!< [0x070-0x073] Timeout threshold for read status command
|
|
||||||
uint32_t commandInterval; //!< [0x074-0x077] CS deselect interval between two commands
|
|
||||||
uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns
|
|
||||||
uint16_t busyOffset; //!< [0x07c-0x07d] Busy offset, valid value: 0-31
|
|
||||||
uint16_t busyBitPolarity; //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
|
|
||||||
//! busy flag is 0 when flash device is busy
|
|
||||||
uint32_t lookupTable[64]; //!< [0x080-0x17f] Lookup table holds Flash command sequences
|
|
||||||
flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences
|
|
||||||
uint32_t reserved4[4]; //!< [0x1b0-0x1bf] Reserved for future use
|
|
||||||
} flexspi_mem_config_t;
|
|
||||||
|
|
||||||
/* */
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL 0
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG 1
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD 2
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 4
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG 6
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD 7
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READID 8
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_ENTERQPI 10
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_EXITQPI 12
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Serial NOR configuration block
|
|
||||||
*/
|
|
||||||
typedef struct _flexspi_nor_config
|
|
||||||
{
|
|
||||||
flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI
|
|
||||||
uint32_t pageSize; //!< Page size of Serial NOR
|
|
||||||
uint32_t sectorSize; //!< Sector size of Serial NOR
|
|
||||||
uint8_t ipcmdSerialClkFreq; //!< Clock frequency for IP command
|
|
||||||
uint8_t isUniformBlockSize; //!< Sector/Block size is the same
|
|
||||||
uint8_t reserved0[2]; //!< Reserved for future use
|
|
||||||
uint8_t serialNorType; //!< Serial NOR Flash type: 0/1/2/3
|
|
||||||
uint8_t needExitNoCmdMode; //!< Need to exit NoCmd mode before other IP command
|
|
||||||
uint8_t halfClkForNonReadCmd; //!< Half the Serial Clock for non-read command: true/false
|
|
||||||
uint8_t needRestoreNoCmdMode; //!< Need to Restore NoCmd mode after IP commmand execution
|
|
||||||
uint32_t blockSize; //!< Block size
|
|
||||||
uint32_t reserve2[11]; //!< Reserved for future use
|
|
||||||
} flexspi_nor_config_t;
|
|
||||||
|
|
||||||
#define FLASH_BUSY_STATUS_POL 0
|
|
||||||
#define FLASH_BUSY_STATUS_OFFSET 0
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* __EVKMIMXRT1020_FLEXSPI_NOR_CONFIG__ */
|
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2019 NXP.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Based on tinyusb/hw/bsp/teensy_40/evkmimxrt1010_flexspi_nor_config.c
|
|
||||||
|
|
||||||
#include "evkmimxrt1020_flexspi_nor_config.h"
|
|
||||||
|
|
||||||
/* Component ID definition, used by tools. */
|
|
||||||
#ifndef FSL_COMPONENT_ID
|
|
||||||
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Code
|
|
||||||
******************************************************************************/
|
|
||||||
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
|
||||||
#if defined(__ARMCC_VERSION) || defined(__GNUC__)
|
|
||||||
__attribute__((section(".boot_hdr.conf")))
|
|
||||||
#elif defined(__ICCARM__)
|
|
||||||
#pragma location = ".boot_hdr.conf"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const flexspi_nor_config_t qspiflash_config = {
|
|
||||||
.memConfig =
|
|
||||||
{
|
|
||||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
|
||||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
|
||||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
|
||||||
.csHoldTime = 3u,
|
|
||||||
.csSetupTime = 3u,
|
|
||||||
.busyOffset = FLASH_BUSY_STATUS_OFFSET, // Status bit 0 indicates busy.
|
|
||||||
.busyBitPolarity = FLASH_BUSY_STATUS_POL, // Busy when the bit is 1.
|
|
||||||
.deviceModeCfgEnable = 1u,
|
|
||||||
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
|
|
||||||
.deviceModeSeq = {
|
|
||||||
.seqId = 4u,
|
|
||||||
.seqNum = 1u,
|
|
||||||
},
|
|
||||||
.deviceModeArg = 0x40,
|
|
||||||
// Enable DDR mode, Wordaddassable, Safe configuration, Differential clock
|
|
||||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
|
||||||
.sflashPadType = kSerialFlash_4Pads,
|
|
||||||
.serialClkFreq = kFlexSpiSerialClk_30MHz,
|
|
||||||
.sflashA1Size = 8u * 1024u * 1024u,
|
|
||||||
.lookupTable =
|
|
||||||
{
|
|
||||||
// 0 Read LUTs 0 -> 0
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
|
||||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 1 Read status register -> 1
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x01),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 2 Fast read quad mode - SDR
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x6B, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
|
||||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x08, READ_SDR, FLEXSPI_4PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 3 Write Enable -> 3
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 4 Read extend parameters
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x81, READ_SDR, FLEXSPI_1PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 5 Erase Sector -> 5
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 24),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 6 Write Status Reg
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01, WRITE_SDR, FLEXSPI_1PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 7 Page Program - quad mode (-> 9)
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
|
||||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 8 Read ID
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x90, DUMMY_SDR, FLEXSPI_1PAD, 24),
|
|
||||||
FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_1PAD, 0x00, 0, 0, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 9 Page Program - single mode -> 9
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 24),
|
|
||||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0, 0, 0, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 10 Enter QPI mode
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x35, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 11 Erase Chip
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 12 Exit QPI mode
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_4PAD, 0xF5, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.pageSize = 256u,
|
|
||||||
.sectorSize = 4u * 1024u,
|
|
||||||
.blockSize = 256u * 1024u,
|
|
||||||
.isUniformBlockSize = false,
|
|
||||||
.ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
|
|
||||||
};
|
|
||||||
#endif /* XIP_BOOT_HEADER_ENABLE */
|
|
||||||
@@ -1,15 +1,11 @@
|
|||||||
#define MICROPY_HW_BOARD_NAME "i.MX RT1020 EVK"
|
#define MICROPY_HW_BOARD_NAME "i.MX RT1020 EVK"
|
||||||
#define MICROPY_HW_MCU_NAME "MIMXRT1021DAG5A"
|
#define MICROPY_HW_MCU_NAME "MIMXRT1021DAG5A"
|
||||||
|
|
||||||
#define BOARD_FLASH_SIZE (8 * 1024 * 1024)
|
|
||||||
|
|
||||||
// i.MX RT1020 EVK has 1 board LED
|
// i.MX RT1020 EVK has 1 board LED
|
||||||
// Todo: think about replacing the define with searching in the generated pins?
|
// Todo: think about replacing the define with searching in the generated pins?
|
||||||
#define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_05)
|
#define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_05)
|
||||||
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin))
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin))
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin))
|
||||||
#define BOARD_FLASH_CONFIG_HEADER_H "evkmimxrt1020_flexspi_nor_config.h"
|
|
||||||
#define BOARD_FLASH_OPS_HEADER_H "hal/flexspi_nor_flash.h"
|
|
||||||
|
|
||||||
#define MICROPY_HW_NUM_PIN_IRQS (3 * 32)
|
#define MICROPY_HW_NUM_PIN_IRQS (3 * 32)
|
||||||
|
|
||||||
@@ -46,10 +42,10 @@
|
|||||||
{ IOMUXC_GPIO_AD_B1_14_LPSPI3_SDO }, { IOMUXC_GPIO_AD_B1_15_LPSPI3_SDI },
|
{ IOMUXC_GPIO_AD_B1_14_LPSPI3_SDO }, { IOMUXC_GPIO_AD_B1_15_LPSPI3_SDI },
|
||||||
|
|
||||||
#define DMA_REQ_SRC_RX { 0, kDmaRequestMuxLPSPI1Rx, kDmaRequestMuxLPSPI2Rx, \
|
#define DMA_REQ_SRC_RX { 0, kDmaRequestMuxLPSPI1Rx, kDmaRequestMuxLPSPI2Rx, \
|
||||||
kDmaRequestMuxLPSPI3Rx, kDmaRequestMuxLPSPI4Rx }
|
kDmaRequestMuxLPSPI3Rx, kDmaRequestMuxLPSPI4Rx }
|
||||||
|
|
||||||
#define DMA_REQ_SRC_TX { 0, kDmaRequestMuxLPSPI1Tx, kDmaRequestMuxLPSPI2Tx, \
|
#define DMA_REQ_SRC_TX { 0, kDmaRequestMuxLPSPI1Tx, kDmaRequestMuxLPSPI2Tx, \
|
||||||
kDmaRequestMuxLPSPI3Tx, kDmaRequestMuxLPSPI4Tx }
|
kDmaRequestMuxLPSPI3Tx, kDmaRequestMuxLPSPI4Tx }
|
||||||
|
|
||||||
// Define mapping hardware I2C # to logical I2C #
|
// Define mapping hardware I2C # to logical I2C #
|
||||||
// SDA/SCL HW-I2C Logical I2C
|
// SDA/SCL HW-I2C Logical I2C
|
||||||
@@ -65,14 +61,14 @@
|
|||||||
{ 0 }, { 0 }, \
|
{ 0 }, { 0 }, \
|
||||||
{ IOMUXC_GPIO_SD_B1_02_LPI2C4_SCL }, { IOMUXC_GPIO_SD_B1_03_LPI2C4_SDA },
|
{ IOMUXC_GPIO_SD_B1_02_LPI2C4_SCL }, { IOMUXC_GPIO_SD_B1_03_LPI2C4_SDA },
|
||||||
|
|
||||||
#define USDHC_DUMMY_PIN NULL , 0
|
#define USDHC_DUMMY_PIN NULL, 0
|
||||||
#define MICROPY_USDHC1 \
|
#define MICROPY_USDHC1 \
|
||||||
{ \
|
{ \
|
||||||
.cmd = {GPIO_SD_B0_02_USDHC1_CMD}, \
|
.cmd = {GPIO_SD_B0_02_USDHC1_CMD}, \
|
||||||
.clk = { GPIO_SD_B0_03_USDHC1_CLK }, \
|
.clk = { GPIO_SD_B0_03_USDHC1_CLK }, \
|
||||||
.cd_b = { GPIO_SD_B0_06_USDHC1_CD_B },\
|
.cd_b = { GPIO_SD_B0_06_USDHC1_CD_B }, \
|
||||||
.data0 = { GPIO_SD_B0_04_USDHC1_DATA0 },\
|
.data0 = { GPIO_SD_B0_04_USDHC1_DATA0 }, \
|
||||||
.data1 = { GPIO_SD_B0_05_USDHC1_DATA1 },\
|
.data1 = { GPIO_SD_B0_05_USDHC1_DATA1 }, \
|
||||||
.data2 = { GPIO_SD_B0_00_USDHC1_DATA2 },\
|
.data2 = { GPIO_SD_B0_00_USDHC1_DATA2 }, \
|
||||||
.data3 = { GPIO_SD_B0_01_USDHC1_DATA3 },\
|
.data3 = { GPIO_SD_B0_01_USDHC1_DATA3 }, \
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,21 +3,20 @@ MCU_VARIANT = MIMXRT1021DAG5A
|
|||||||
|
|
||||||
MICROPY_FLOAT_IMPL = double
|
MICROPY_FLOAT_IMPL = double
|
||||||
MICROPY_PY_MACHINE_SDCARD = 1
|
MICROPY_PY_MACHINE_SDCARD = 1
|
||||||
|
BOARD_FLASH_TYPE ?= qspi_nor
|
||||||
|
BOARD_FLASH_SIZE ?= 0x800000 # 8MB
|
||||||
|
|
||||||
JLINK_PATH ?= /media/RT1020-EVK/
|
JLINK_PATH ?= /media/RT1020-EVK/
|
||||||
JLINK_COMMANDER_SCRIPT = $(BUILD)/script.jlink
|
JLINK_COMMANDER_SCRIPT = $(BUILD)/script.jlink
|
||||||
|
|
||||||
|
|
||||||
ifdef JLINK_IP
|
ifdef JLINK_IP
|
||||||
JLINK_CONNECTION_SETTINGS = -IP $(JLINK_IP)
|
JLINK_CONNECTION_SETTINGS = -IP $(JLINK_IP)
|
||||||
else
|
else
|
||||||
JLINK_CONNECTION_SETTINGS =
|
JLINK_CONNECTION_SETTINGS = -USB
|
||||||
endif
|
endif
|
||||||
|
|
||||||
SRC_C += \
|
|
||||||
hal/flexspi_nor_flash.c
|
|
||||||
|
|
||||||
deploy_jlink: $(BUILD)/firmware.hex
|
deploy_jlink: $(BUILD)/firmware.hex
|
||||||
|
$(Q)$(TOUCH) $(JLINK_COMMANDER_SCRIPT)
|
||||||
$(ECHO) "ExitOnError 1" > $(JLINK_COMMANDER_SCRIPT)
|
$(ECHO) "ExitOnError 1" > $(JLINK_COMMANDER_SCRIPT)
|
||||||
$(ECHO) "speed auto" >> $(JLINK_COMMANDER_SCRIPT)
|
$(ECHO) "speed auto" >> $(JLINK_COMMANDER_SCRIPT)
|
||||||
$(ECHO) "r" >> $(JLINK_COMMANDER_SCRIPT)
|
$(ECHO) "r" >> $(JLINK_COMMANDER_SCRIPT)
|
||||||
|
|||||||
136
ports/mimxrt/boards/MIMXRT1020_EVK/qspi_nor_flash_config.c
Normal file
136
ports/mimxrt/boards/MIMXRT1020_EVK/qspi_nor_flash_config.c
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019 NXP.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Based on tinyusb/hw/bsp/teensy_40/evkmimxrt1010_flexspi_nor_config.c
|
||||||
|
|
||||||
|
#include BOARD_FLASH_CONFIG_HEADER_H
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
||||||
|
#if defined(__ARMCC_VERSION) || defined(__GNUC__)
|
||||||
|
__attribute__((section(".boot_hdr.conf")))
|
||||||
|
#elif defined(__ICCARM__)
|
||||||
|
#pragma location = ".boot_hdr.conf"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const flexspi_nor_config_t qspiflash_config = {
|
||||||
|
.memConfig =
|
||||||
|
{
|
||||||
|
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||||
|
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||||
|
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||||
|
.csHoldTime = 3u,
|
||||||
|
.csSetupTime = 3u,
|
||||||
|
.busyOffset = FLASH_BUSY_STATUS_OFFSET, // Status bit 0 indicates busy.
|
||||||
|
.busyBitPolarity = FLASH_BUSY_STATUS_POL, // Busy when the bit is 1.
|
||||||
|
.deviceModeCfgEnable = 1u,
|
||||||
|
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
|
||||||
|
.deviceModeSeq = {
|
||||||
|
.seqId = 4u,
|
||||||
|
.seqNum = 1u,
|
||||||
|
},
|
||||||
|
.deviceModeArg = 0x40,
|
||||||
|
// Enable DDR mode, Wordaddassable, Safe configuration, Differential clock
|
||||||
|
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||||
|
.sflashPadType = kSerialFlash_4Pads,
|
||||||
|
.serialClkFreq = kFlexSpiSerialClk_100MHz,
|
||||||
|
.sflashA1Size = BOARD_FLASH_SIZE,
|
||||||
|
.lookupTable =
|
||||||
|
{
|
||||||
|
// 0 Read LUTs 0 -> 0
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 1 Read status register -> 1
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x01),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 2 Fast read quad mode - SDR
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x6B, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x08, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 3 Write Enable -> 3
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 4 Read extend parameters
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x81, READ_SDR, FLEXSPI_1PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 5 Erase Sector -> 5
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 6 Write Status Reg
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01, WRITE_SDR, FLEXSPI_1PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 7 Page Program - quad mode (-> 9)
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 8 Read ID
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x90, DUMMY_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_1PAD, 0x00, 0, 0, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 9 Page Program - single mode -> 9
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0, 0, 0, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 10 Enter QPI mode
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x35, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 11 Erase Chip
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 12 Exit QPI mode
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_4PAD, 0xF5, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.pageSize = 256u,
|
||||||
|
.sectorSize = 4u * 1024u,
|
||||||
|
.blockSize = 256u * 1024u,
|
||||||
|
.isUniformBlockSize = false,
|
||||||
|
// .ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
|
||||||
|
};
|
||||||
|
#endif /* XIP_BOOT_HEADER_ENABLE */
|
||||||
@@ -1,20 +1,29 @@
|
|||||||
/* Memory configuration */
|
/* Memory configuration */
|
||||||
|
#if defined BOARD_FLASH_RESERVED
|
||||||
|
reserved_size = BOARD_FLASH_RESERVED;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if BOARD_FLASH_TYPE == qspi_nor
|
||||||
flash_start = 0x60000000;
|
flash_start = 0x60000000;
|
||||||
|
#else
|
||||||
|
#error Unknown BOARD_FLASH_TYPE
|
||||||
|
#endif
|
||||||
|
flash_size = BOARD_FLASH_SIZE;
|
||||||
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));
|
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));
|
||||||
flash_config_start = flash_start;
|
flash_config_start = flash_start;
|
||||||
flash_config_size = 0x00001000;
|
flash_config_size = 0x00001000;
|
||||||
ivt_start = 0x60001000;
|
ivt_start = flash_start + 0x00001000;
|
||||||
ivt_size = 0x00001000;
|
ivt_size = 0x00001000;
|
||||||
interrupts_start = 0x60002000;
|
interrupts_start = flash_start + 0x00002000;
|
||||||
interrupts_size = 0x00000400;
|
interrupts_size = 0x00000400;
|
||||||
text_start = 0x60002400;
|
text_start = flash_start + 0x00002400;
|
||||||
text_size = ((((text_start) + 1M) + (4k - 1)) & ~(4k - 1)) - (text_start); /* reserve 1M for code but align on 4k boundary */
|
vfs_start = flash_start + 0x00100000;
|
||||||
vfs_start = (text_start) + (text_size);
|
text_size = ((vfs_start) - (text_start));
|
||||||
vfs_size = ((flash_end) - (vfs_start));
|
vfs_size = ((flash_end) - (vfs_start));
|
||||||
itcm_start = 0x00000000;
|
itcm_start = 0x00000000;
|
||||||
itcm_size = 0x00010000;
|
itcm_size = 0x00008000;
|
||||||
dtcm_start = 0x20000000;
|
dtcm_start = 0x20000000;
|
||||||
dtcm_size = 0x00010000;
|
dtcm_size = 0x00018000;
|
||||||
ocrm_start = 0x20200000;
|
ocrm_start = 0x20200000;
|
||||||
ocrm_size = 0x00020000;
|
ocrm_size = 0x00020000;
|
||||||
|
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
flash_size = 8M;
|
|
||||||
@@ -0,0 +1,263 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EVKMIMXRT1050_FLEXSPI_NOR_CONFIG__
|
||||||
|
#define __EVKMIMXRT1050_FLEXSPI_NOR_CONFIG__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "fsl_flexspi.h"
|
||||||
|
|
||||||
|
/*! @name Driver version */
|
||||||
|
/*@{*/
|
||||||
|
/*! @brief XIP_BOARD driver version 2.0.0. */
|
||||||
|
#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/* FLEXSPI memory config block related defintions */
|
||||||
|
#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian
|
||||||
|
#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0
|
||||||
|
#define FLEXSPI_CFG_BLK_SIZE (512)
|
||||||
|
|
||||||
|
/* FLEXSPI Feature related definitions */
|
||||||
|
#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
|
||||||
|
|
||||||
|
/* Lookup table related defintions */
|
||||||
|
#define CMD_INDEX_READ 0
|
||||||
|
#define CMD_INDEX_READSTATUS 1
|
||||||
|
#define CMD_INDEX_WRITEENABLE 2
|
||||||
|
#define CMD_INDEX_WRITE 4
|
||||||
|
|
||||||
|
#define CMD_LUT_SEQ_IDX_READ 0
|
||||||
|
#define CMD_LUT_SEQ_IDX_READSTATUS 1
|
||||||
|
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
||||||
|
#define CMD_LUT_SEQ_IDX_WRITE 9
|
||||||
|
|
||||||
|
#define CMD_SDR 0x01
|
||||||
|
#define CMD_DDR 0x21
|
||||||
|
#define RADDR_SDR 0x02
|
||||||
|
#define RADDR_DDR 0x22
|
||||||
|
#define CADDR_SDR 0x03
|
||||||
|
#define CADDR_DDR 0x23
|
||||||
|
#define MODE1_SDR 0x04
|
||||||
|
#define MODE1_DDR 0x24
|
||||||
|
#define MODE2_SDR 0x05
|
||||||
|
#define MODE2_DDR 0x25
|
||||||
|
#define MODE4_SDR 0x06
|
||||||
|
#define MODE4_DDR 0x26
|
||||||
|
#define MODE8_SDR 0x07
|
||||||
|
#define MODE8_DDR 0x27
|
||||||
|
#define WRITE_SDR 0x08
|
||||||
|
#define WRITE_DDR 0x28
|
||||||
|
#define READ_SDR 0x09
|
||||||
|
#define READ_DDR 0x29
|
||||||
|
#define LEARN_SDR 0x0A
|
||||||
|
#define LEARN_DDR 0x2A
|
||||||
|
#define DATSZ_SDR 0x0B
|
||||||
|
#define DATSZ_DDR 0x2B
|
||||||
|
#define DUMMY_SDR 0x0C
|
||||||
|
#define DUMMY_DDR 0x2C
|
||||||
|
#define DUMMY_RWDS_SDR 0x0D
|
||||||
|
#define DUMMY_RWDS_DDR 0x2D
|
||||||
|
#define JMP_ON_CS 0x1F
|
||||||
|
#define STOP 0
|
||||||
|
|
||||||
|
#define FLEXSPI_1PAD 0
|
||||||
|
#define FLEXSPI_2PAD 1
|
||||||
|
#define FLEXSPI_4PAD 2
|
||||||
|
#define FLEXSPI_8PAD 3
|
||||||
|
|
||||||
|
#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
|
||||||
|
(FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
|
||||||
|
FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
||||||
|
|
||||||
|
// !@brief Definitions for FlexSPI Serial Clock Frequency
|
||||||
|
typedef enum _FlexSpiSerialClockFreq
|
||||||
|
{
|
||||||
|
kFlexSpiSerialClk_30MHz = 1,
|
||||||
|
kFlexSpiSerialClk_50MHz = 2,
|
||||||
|
kFlexSpiSerialClk_60MHz = 3,
|
||||||
|
kFlexSpiSerialClk_75MHz = 4,
|
||||||
|
kFlexSpiSerialClk_80MHz = 5,
|
||||||
|
kFlexSpiSerialClk_100MHz = 6,
|
||||||
|
kFlexSpiSerialClk_133MHz = 7,
|
||||||
|
kFlexSpiSerialClk_166MHz = 8,
|
||||||
|
} flexspi_serial_clk_freq_t;
|
||||||
|
|
||||||
|
// !@brief FlexSPI clock configuration type
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiClk_SDR, // !< Clock configure for SDR mode
|
||||||
|
kFlexSpiClk_DDR, // !< Clock configurat for DDR mode
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI Read Sample Clock Source definition
|
||||||
|
typedef enum _FlashReadSampleClkSource
|
||||||
|
{
|
||||||
|
kFlexSPIReadSampleClk_LoopbackInternally = 0,
|
||||||
|
kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
|
||||||
|
kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
|
||||||
|
kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
|
||||||
|
} flexspi_read_sample_clk_t;
|
||||||
|
|
||||||
|
// !@brief Misc feature bit definitions
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiMiscOffset_DiffClkEnable = 0, // !< Bit for Differential clock enable
|
||||||
|
kFlexSpiMiscOffset_Ck2Enable = 1, // !< Bit for CK2 enable
|
||||||
|
kFlexSpiMiscOffset_ParallelEnable = 2, // !< Bit for Parallel mode enable
|
||||||
|
kFlexSpiMiscOffset_WordAddressableEnable = 3, // !< Bit for Word Addressable enable
|
||||||
|
kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, // !< Bit for Safe Configuration Frequency enable
|
||||||
|
kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, // !< Bit for Pad setting override enable
|
||||||
|
kFlexSpiMiscOffset_DdrModeEnable = 6, // !< Bit for DDR clock confiuration indication.
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief Flash Type Definition
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiDeviceType_SerialNOR = 1, // !< Flash devices are Serial NOR
|
||||||
|
kFlexSpiDeviceType_SerialNAND = 2, // !< Flash devices are Serial NAND
|
||||||
|
kFlexSpiDeviceType_SerialRAM = 3, // !< Flash devices are Serial RAM/HyperFLASH
|
||||||
|
kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, // !< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND
|
||||||
|
kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, // !< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief Flash Pad Definitions
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kSerialFlash_1Pad = 1,
|
||||||
|
kSerialFlash_2Pads = 2,
|
||||||
|
kSerialFlash_4Pads = 4,
|
||||||
|
kSerialFlash_8Pads = 8,
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI LUT Sequence structure
|
||||||
|
typedef struct _lut_sequence
|
||||||
|
{
|
||||||
|
uint8_t seqNum; // !< Sequence Number, valid number: 1-16
|
||||||
|
uint8_t seqId; // !< Sequence Index, valid number: 0-15
|
||||||
|
uint16_t reserved;
|
||||||
|
} flexspi_lut_seq_t;
|
||||||
|
|
||||||
|
// !@brief Flash Configuration Command Type
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kDeviceConfigCmdType_Generic, // !< Generic command, for example: configure dummy cycles, drive strength, etc
|
||||||
|
kDeviceConfigCmdType_QuadEnable, // !< Quad Enable command
|
||||||
|
kDeviceConfigCmdType_Spi2Xpi, // !< Switch from SPI to DPI/QPI/OPI mode
|
||||||
|
kDeviceConfigCmdType_Xpi2Spi, // !< Switch from DPI/QPI/OPI to SPI mode
|
||||||
|
kDeviceConfigCmdType_Spi2NoCmd, // !< Switch to 0-4-4/0-8-8 mode
|
||||||
|
kDeviceConfigCmdType_Reset, // !< Reset device command
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI Memory Configuration Block
|
||||||
|
typedef struct _FlexSPIConfig
|
||||||
|
{
|
||||||
|
uint32_t tag; // !< [0x000-0x003] Tag, fixed value 0x42464346UL
|
||||||
|
uint32_t version; // !< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix
|
||||||
|
uint32_t reserved0; // !< [0x008-0x00b] Reserved for future use
|
||||||
|
uint8_t readSampleClkSrc; // !< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3
|
||||||
|
uint8_t csHoldTime; // !< [0x00d-0x00d] CS hold time, default value: 3
|
||||||
|
uint8_t csSetupTime; // !< [0x00e-0x00e] CS setup time, default value: 3
|
||||||
|
uint8_t columnAddressWidth; // !< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
|
||||||
|
// ! Serial NAND, need to refer to datasheet
|
||||||
|
uint8_t deviceModeCfgEnable; // !< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable
|
||||||
|
uint8_t deviceModeType; // !< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
|
||||||
|
// ! Generic configuration, etc.
|
||||||
|
uint16_t waitTimeCfgCommands; // !< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
|
||||||
|
// ! DPI/QPI/OPI switch or reset command
|
||||||
|
flexspi_lut_seq_t deviceModeSeq; // !< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
|
||||||
|
// ! sequence number, [31:16] Reserved
|
||||||
|
uint32_t deviceModeArg; // !< [0x018-0x01b] Argument/Parameter for device configuration
|
||||||
|
uint8_t configCmdEnable; // !< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable
|
||||||
|
uint8_t configModeType[3]; // !< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe
|
||||||
|
flexspi_lut_seq_t
|
||||||
|
configCmdSeqs[3]; // !< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq
|
||||||
|
uint32_t reserved1; // !< [0x02c-0x02f] Reserved for future use
|
||||||
|
uint32_t configCmdArgs[3]; // !< [0x030-0x03b] Arguments/Parameters for device Configuration commands
|
||||||
|
uint32_t reserved2; // !< [0x03c-0x03f] Reserved for future use
|
||||||
|
uint32_t controllerMiscOption; // !< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
|
||||||
|
// ! details
|
||||||
|
uint8_t deviceType; // !< [0x044-0x044] Device Type: See Flash Type Definition for more details
|
||||||
|
uint8_t sflashPadType; // !< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal
|
||||||
|
uint8_t serialClkFreq; // !< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
|
||||||
|
// ! Chapter for more details
|
||||||
|
uint8_t lutCustomSeqEnable; // !< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
|
||||||
|
// ! be done using 1 LUT sequence, currently, only applicable to HyperFLASH
|
||||||
|
uint32_t reserved3[2]; // !< [0x048-0x04f] Reserved for future use
|
||||||
|
uint32_t sflashA1Size; // !< [0x050-0x053] Size of Flash connected to A1
|
||||||
|
uint32_t sflashA2Size; // !< [0x054-0x057] Size of Flash connected to A2
|
||||||
|
uint32_t sflashB1Size; // !< [0x058-0x05b] Size of Flash connected to B1
|
||||||
|
uint32_t sflashB2Size; // !< [0x05c-0x05f] Size of Flash connected to B2
|
||||||
|
uint32_t csPadSettingOverride; // !< [0x060-0x063] CS pad setting override value
|
||||||
|
uint32_t sclkPadSettingOverride; // !< [0x064-0x067] SCK pad setting override value
|
||||||
|
uint32_t dataPadSettingOverride; // !< [0x068-0x06b] data pad setting override value
|
||||||
|
uint32_t dqsPadSettingOverride; // !< [0x06c-0x06f] DQS pad setting override value
|
||||||
|
uint32_t timeoutInMs; // !< [0x070-0x073] Timeout threshold for read status command
|
||||||
|
uint32_t commandInterval; // !< [0x074-0x077] CS deselect interval between two commands
|
||||||
|
uint16_t dataValidTime[2]; // !< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns
|
||||||
|
uint16_t busyOffset; // !< [0x07c-0x07d] Busy offset, valid value: 0-31
|
||||||
|
uint16_t busyBitPolarity; // !< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
|
||||||
|
// ! busy flag is 0 when flash device is busy
|
||||||
|
uint32_t lookupTable[64]; // !< [0x080-0x17f] Lookup table holds Flash command sequences
|
||||||
|
flexspi_lut_seq_t lutCustomSeq[12]; // !< [0x180-0x1af] Customizable LUT Sequences
|
||||||
|
uint32_t reserved4[4]; // !< [0x1b0-0x1bf] Reserved for future use
|
||||||
|
} flexspi_mem_config_t;
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL 0
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG 1
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD 2
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 4
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG 6
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD 7
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READID 8
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_ENTERQPI 10
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_EXITQPI 12
|
||||||
|
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA 0
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA 1
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS 2
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE 4
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR 6
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM 10
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP 12
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Serial NOR configuration block
|
||||||
|
*/
|
||||||
|
typedef struct _flexspi_nor_config
|
||||||
|
{
|
||||||
|
flexspi_mem_config_t memConfig; // !< Common memory configuration info via FlexSPI
|
||||||
|
uint32_t pageSize; // !< Page size of Serial NOR
|
||||||
|
uint32_t sectorSize; // !< Sector size of Serial NOR
|
||||||
|
uint8_t ipcmdSerialClkFreq; // !< Clock frequency for IP command
|
||||||
|
uint8_t isUniformBlockSize; // !< Sector/Block size is the same
|
||||||
|
uint8_t reserved0[2]; // !< Reserved for future use
|
||||||
|
uint8_t serialNorType; // !< Serial NOR Flash type: 0/1/2/3
|
||||||
|
uint8_t needExitNoCmdMode; // !< Need to exit NoCmd mode before other IP command
|
||||||
|
uint8_t halfClkForNonReadCmd; // !< Half the Serial Clock for non-read command: true/false
|
||||||
|
uint8_t needRestoreNoCmdMode; // !< Need to Restore NoCmd mode after IP commmand execution
|
||||||
|
uint32_t blockSize; // !< Block size
|
||||||
|
uint32_t reserve2[11]; // !< Reserved for future use
|
||||||
|
} flexspi_nor_config_t;
|
||||||
|
|
||||||
|
#define FLASH_BUSY_STATUS_POL 0
|
||||||
|
#define FLASH_BUSY_STATUS_OFFSET 0
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* __EVKMIMXRT1050_FLEXSPI_NOR_CONFIG__ */
|
||||||
119
ports/mimxrt/boards/MIMXRT1050_EVK/clock_config.h
Normal file
119
ports/mimxrt/boards/MIMXRT1050_EVK/clock_config.h
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017-2019 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CLOCK_CONFIG_H_
|
||||||
|
#define _CLOCK_CONFIG_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_XTAL0_CLK_HZ 24000000U /*!< Board xtal0 frequency in Hz */
|
||||||
|
|
||||||
|
#define BOARD_XTAL32K_CLK_HZ 32768U /*!< Board xtal32k frequency in Hz */
|
||||||
|
/*******************************************************************************
|
||||||
|
************************ BOARD_InitBootClocks function ************************
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes default configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_InitBootClocks(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
********************** Configuration BOARD_BootClockRUN ***********************
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions for BOARD_BootClockRUN configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CORE_CLOCK 600000000U /*!< Core clock frequency: 600000000Hz */
|
||||||
|
|
||||||
|
/* Clock outputs (values are in Hz): */
|
||||||
|
#define BOARD_BOOTCLOCKRUN_AHB_CLK_ROOT 600000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CAN_CLK_ROOT 40000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT 32768UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLKO1_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLKO2_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLK_1M 1000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLK_24M 24000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CSI_CLK_ROOT 12000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET1_TX_CLK 2400000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET_125M_CLK 2400000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET_25M_REF_CLK 1200000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXIO2_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT 160000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT 150000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LCDIF_CLK_ROOT 9642857UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT 60000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT 105600000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LVDS1_CLK 1200000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_MQS_MCLK 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_PLL7_MAIN_CLK 24000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK2 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SEMC_CLK_ROOT 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT 117333333UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT 80000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USBPHY1_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USBPHY2_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USDHC1_CLK_ROOT 198000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USDHC2_CLK_ROOT 198000000UL
|
||||||
|
|
||||||
|
/*! @brief Arm PLL set for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN;
|
||||||
|
/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;
|
||||||
|
/*! @brief Sys PLL for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API for BOARD_BootClockRUN configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_BootClockRUN(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
#endif /* _CLOCK_CONFIG_H_ */
|
||||||
@@ -1,255 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __EVKMIMXRT1050_FLEXSPI_NOR_CONFIG__
|
|
||||||
#define __EVKMIMXRT1050_FLEXSPI_NOR_CONFIG__
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include "fsl_common.h"
|
|
||||||
|
|
||||||
/*! @name Driver version */
|
|
||||||
/*@{*/
|
|
||||||
/*! @brief XIP_BOARD driver version 2.0.0. */
|
|
||||||
#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
|
|
||||||
/*@}*/
|
|
||||||
|
|
||||||
/* FLEXSPI memory config block related defintions */
|
|
||||||
#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian
|
|
||||||
#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0
|
|
||||||
#define FLEXSPI_CFG_BLK_SIZE (512)
|
|
||||||
|
|
||||||
/* FLEXSPI Feature related definitions */
|
|
||||||
#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
|
|
||||||
|
|
||||||
/* Lookup table related defintions */
|
|
||||||
#define CMD_INDEX_READ 0
|
|
||||||
#define CMD_INDEX_READSTATUS 1
|
|
||||||
#define CMD_INDEX_WRITEENABLE 2
|
|
||||||
#define CMD_INDEX_WRITE 4
|
|
||||||
|
|
||||||
#define CMD_LUT_SEQ_IDX_READ 0
|
|
||||||
#define CMD_LUT_SEQ_IDX_READSTATUS 1
|
|
||||||
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
|
||||||
#define CMD_LUT_SEQ_IDX_WRITE 9
|
|
||||||
|
|
||||||
#define CMD_SDR 0x01
|
|
||||||
#define CMD_DDR 0x21
|
|
||||||
#define RADDR_SDR 0x02
|
|
||||||
#define RADDR_DDR 0x22
|
|
||||||
#define CADDR_SDR 0x03
|
|
||||||
#define CADDR_DDR 0x23
|
|
||||||
#define MODE1_SDR 0x04
|
|
||||||
#define MODE1_DDR 0x24
|
|
||||||
#define MODE2_SDR 0x05
|
|
||||||
#define MODE2_DDR 0x25
|
|
||||||
#define MODE4_SDR 0x06
|
|
||||||
#define MODE4_DDR 0x26
|
|
||||||
#define MODE8_SDR 0x07
|
|
||||||
#define MODE8_DDR 0x27
|
|
||||||
#define WRITE_SDR 0x08
|
|
||||||
#define WRITE_DDR 0x28
|
|
||||||
#define READ_SDR 0x09
|
|
||||||
#define READ_DDR 0x29
|
|
||||||
#define LEARN_SDR 0x0A
|
|
||||||
#define LEARN_DDR 0x2A
|
|
||||||
#define DATSZ_SDR 0x0B
|
|
||||||
#define DATSZ_DDR 0x2B
|
|
||||||
#define DUMMY_SDR 0x0C
|
|
||||||
#define DUMMY_DDR 0x2C
|
|
||||||
#define DUMMY_RWDS_SDR 0x0D
|
|
||||||
#define DUMMY_RWDS_DDR 0x2D
|
|
||||||
#define JMP_ON_CS 0x1F
|
|
||||||
#define STOP 0
|
|
||||||
|
|
||||||
#define FLEXSPI_1PAD 0
|
|
||||||
#define FLEXSPI_2PAD 1
|
|
||||||
#define FLEXSPI_4PAD 2
|
|
||||||
#define FLEXSPI_8PAD 3
|
|
||||||
|
|
||||||
#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
|
|
||||||
(FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
|
|
||||||
FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
|
||||||
|
|
||||||
//!@brief Definitions for FlexSPI Serial Clock Frequency
|
|
||||||
typedef enum _FlexSpiSerialClockFreq
|
|
||||||
{
|
|
||||||
kFlexSpiSerialClk_30MHz = 1,
|
|
||||||
kFlexSpiSerialClk_50MHz = 2,
|
|
||||||
kFlexSpiSerialClk_60MHz = 3,
|
|
||||||
kFlexSpiSerialClk_75MHz = 4,
|
|
||||||
kFlexSpiSerialClk_80MHz = 5,
|
|
||||||
kFlexSpiSerialClk_100MHz = 6,
|
|
||||||
kFlexSpiSerialClk_133MHz = 7,
|
|
||||||
kFlexSpiSerialClk_166MHz = 8,
|
|
||||||
} flexspi_serial_clk_freq_t;
|
|
||||||
|
|
||||||
//!@brief FlexSPI clock configuration type
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiClk_SDR, //!< Clock configure for SDR mode
|
|
||||||
kFlexSpiClk_DDR, //!< Clock configurat for DDR mode
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI Read Sample Clock Source definition
|
|
||||||
typedef enum _FlashReadSampleClkSource
|
|
||||||
{
|
|
||||||
kFlexSPIReadSampleClk_LoopbackInternally = 0,
|
|
||||||
kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
|
|
||||||
kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
|
|
||||||
kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
|
|
||||||
} flexspi_read_sample_clk_t;
|
|
||||||
|
|
||||||
//!@brief Misc feature bit definitions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiMiscOffset_DiffClkEnable = 0, //!< Bit for Differential clock enable
|
|
||||||
kFlexSpiMiscOffset_Ck2Enable = 1, //!< Bit for CK2 enable
|
|
||||||
kFlexSpiMiscOffset_ParallelEnable = 2, //!< Bit for Parallel mode enable
|
|
||||||
kFlexSpiMiscOffset_WordAddressableEnable = 3, //!< Bit for Word Addressable enable
|
|
||||||
kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, //!< Bit for Safe Configuration Frequency enable
|
|
||||||
kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable
|
|
||||||
kFlexSpiMiscOffset_DdrModeEnable = 6, //!< Bit for DDR clock confiuration indication.
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief Flash Type Definition
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiDeviceType_SerialNOR = 1, //!< Flash devices are Serial NOR
|
|
||||||
kFlexSpiDeviceType_SerialNAND = 2, //!< Flash devices are Serial NAND
|
|
||||||
kFlexSpiDeviceType_SerialRAM = 3, //!< Flash devices are Serial RAM/HyperFLASH
|
|
||||||
kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND
|
|
||||||
kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, //!< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief Flash Pad Definitions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kSerialFlash_1Pad = 1,
|
|
||||||
kSerialFlash_2Pads = 2,
|
|
||||||
kSerialFlash_4Pads = 4,
|
|
||||||
kSerialFlash_8Pads = 8,
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI LUT Sequence structure
|
|
||||||
typedef struct _lut_sequence
|
|
||||||
{
|
|
||||||
uint8_t seqNum; //!< Sequence Number, valid number: 1-16
|
|
||||||
uint8_t seqId; //!< Sequence Index, valid number: 0-15
|
|
||||||
uint16_t reserved;
|
|
||||||
} flexspi_lut_seq_t;
|
|
||||||
|
|
||||||
//!@brief Flash Configuration Command Type
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kDeviceConfigCmdType_Generic, //!< Generic command, for example: configure dummy cycles, drive strength, etc
|
|
||||||
kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command
|
|
||||||
kDeviceConfigCmdType_Spi2Xpi, //!< Switch from SPI to DPI/QPI/OPI mode
|
|
||||||
kDeviceConfigCmdType_Xpi2Spi, //!< Switch from DPI/QPI/OPI to SPI mode
|
|
||||||
kDeviceConfigCmdType_Spi2NoCmd, //!< Switch to 0-4-4/0-8-8 mode
|
|
||||||
kDeviceConfigCmdType_Reset, //!< Reset device command
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI Memory Configuration Block
|
|
||||||
typedef struct _FlexSPIConfig
|
|
||||||
{
|
|
||||||
uint32_t tag; //!< [0x000-0x003] Tag, fixed value 0x42464346UL
|
|
||||||
uint32_t version; //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix
|
|
||||||
uint32_t reserved0; //!< [0x008-0x00b] Reserved for future use
|
|
||||||
uint8_t readSampleClkSrc; //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3
|
|
||||||
uint8_t csHoldTime; //!< [0x00d-0x00d] CS hold time, default value: 3
|
|
||||||
uint8_t csSetupTime; //!< [0x00e-0x00e] CS setup time, default value: 3
|
|
||||||
uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
|
|
||||||
//! Serial NAND, need to refer to datasheet
|
|
||||||
uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable
|
|
||||||
uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
|
|
||||||
//! Generic configuration, etc.
|
|
||||||
uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
|
|
||||||
//! DPI/QPI/OPI switch or reset command
|
|
||||||
flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
|
|
||||||
//! sequence number, [31:16] Reserved
|
|
||||||
uint32_t deviceModeArg; //!< [0x018-0x01b] Argument/Parameter for device configuration
|
|
||||||
uint8_t configCmdEnable; //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable
|
|
||||||
uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe
|
|
||||||
flexspi_lut_seq_t
|
|
||||||
configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq
|
|
||||||
uint32_t reserved1; //!< [0x02c-0x02f] Reserved for future use
|
|
||||||
uint32_t configCmdArgs[3]; //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands
|
|
||||||
uint32_t reserved2; //!< [0x03c-0x03f] Reserved for future use
|
|
||||||
uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
|
|
||||||
//! details
|
|
||||||
uint8_t deviceType; //!< [0x044-0x044] Device Type: See Flash Type Definition for more details
|
|
||||||
uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal
|
|
||||||
uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
|
|
||||||
//! Chapter for more details
|
|
||||||
uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
|
|
||||||
//! be done using 1 LUT sequence, currently, only applicable to HyperFLASH
|
|
||||||
uint32_t reserved3[2]; //!< [0x048-0x04f] Reserved for future use
|
|
||||||
uint32_t sflashA1Size; //!< [0x050-0x053] Size of Flash connected to A1
|
|
||||||
uint32_t sflashA2Size; //!< [0x054-0x057] Size of Flash connected to A2
|
|
||||||
uint32_t sflashB1Size; //!< [0x058-0x05b] Size of Flash connected to B1
|
|
||||||
uint32_t sflashB2Size; //!< [0x05c-0x05f] Size of Flash connected to B2
|
|
||||||
uint32_t csPadSettingOverride; //!< [0x060-0x063] CS pad setting override value
|
|
||||||
uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value
|
|
||||||
uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value
|
|
||||||
uint32_t dqsPadSettingOverride; //!< [0x06c-0x06f] DQS pad setting override value
|
|
||||||
uint32_t timeoutInMs; //!< [0x070-0x073] Timeout threshold for read status command
|
|
||||||
uint32_t commandInterval; //!< [0x074-0x077] CS deselect interval between two commands
|
|
||||||
uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns
|
|
||||||
uint16_t busyOffset; //!< [0x07c-0x07d] Busy offset, valid value: 0-31
|
|
||||||
uint16_t busyBitPolarity; //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
|
|
||||||
//! busy flag is 0 when flash device is busy
|
|
||||||
uint32_t lookupTable[64]; //!< [0x080-0x17f] Lookup table holds Flash command sequences
|
|
||||||
flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences
|
|
||||||
uint32_t reserved4[4]; //!< [0x1b0-0x1bf] Reserved for future use
|
|
||||||
} flexspi_mem_config_t;
|
|
||||||
|
|
||||||
/* */
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL 0
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG 1
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD 2
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 4
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG 6
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD 7
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READID 8
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_ENTERQPI 10
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_EXITQPI 12
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Serial NOR configuration block
|
|
||||||
*/
|
|
||||||
typedef struct _flexspi_nor_config
|
|
||||||
{
|
|
||||||
flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI
|
|
||||||
uint32_t pageSize; //!< Page size of Serial NOR
|
|
||||||
uint32_t sectorSize; //!< Sector size of Serial NOR
|
|
||||||
uint8_t ipcmdSerialClkFreq; //!< Clock frequency for IP command
|
|
||||||
uint8_t isUniformBlockSize; //!< Sector/Block size is the same
|
|
||||||
uint8_t reserved0[2]; //!< Reserved for future use
|
|
||||||
uint8_t serialNorType; //!< Serial NOR Flash type: 0/1/2/3
|
|
||||||
uint8_t needExitNoCmdMode; //!< Need to exit NoCmd mode before other IP command
|
|
||||||
uint8_t halfClkForNonReadCmd; //!< Half the Serial Clock for non-read command: true/false
|
|
||||||
uint8_t needRestoreNoCmdMode; //!< Need to Restore NoCmd mode after IP commmand execution
|
|
||||||
uint32_t blockSize; //!< Block size
|
|
||||||
uint32_t reserve2[11]; //!< Reserved for future use
|
|
||||||
} flexspi_nor_config_t;
|
|
||||||
|
|
||||||
#define FLASH_BUSY_STATUS_POL 0
|
|
||||||
#define FLASH_BUSY_STATUS_OFFSET 0
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* __EVKMIMXRT1050_FLEXSPI_NOR_CONFIG__ */
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "evkmimxrt1050_flexspi_nor_config.h"
|
|
||||||
|
|
||||||
/* Component ID definition, used by tools. */
|
|
||||||
#ifndef FSL_COMPONENT_ID
|
|
||||||
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Code
|
|
||||||
******************************************************************************/
|
|
||||||
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
|
||||||
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
|
|
||||||
__attribute__((section(".boot_hdr.conf")))
|
|
||||||
#elif defined(__ICCARM__)
|
|
||||||
#pragma location = ".boot_hdr.conf"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const flexspi_nor_config_t qspiflash_config = {
|
|
||||||
.memConfig =
|
|
||||||
{
|
|
||||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
|
||||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
|
||||||
.readSampleClkSrc = kFlexSPIReadSampleClk_ExternalInputFromDqsPad,
|
|
||||||
.csHoldTime = 3u,
|
|
||||||
.csSetupTime = 3u,
|
|
||||||
.columnAddressWidth = 3u,
|
|
||||||
// Enable DDR mode, Wordaddassable, Safe configuration, Differential clock
|
|
||||||
.controllerMiscOption =
|
|
||||||
(1u << kFlexSpiMiscOffset_DdrModeEnable) | (1u << kFlexSpiMiscOffset_WordAddressableEnable) |
|
|
||||||
(1u << kFlexSpiMiscOffset_SafeConfigFreqEnable) | (1u << kFlexSpiMiscOffset_DiffClkEnable),
|
|
||||||
.sflashPadType = kSerialFlash_8Pads,
|
|
||||||
.serialClkFreq = kFlexSpiSerialClk_133MHz,
|
|
||||||
.sflashA1Size = 64u * 1024u * 1024u,
|
|
||||||
.dataValidTime = {16u, 16u},
|
|
||||||
.lookupTable =
|
|
||||||
{
|
|
||||||
// 0 Read LUTs 0 -> 0
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
|
||||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 1 Read status register -> 1
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x01),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 2 Fast read quad mode - SDR
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x6B, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
|
||||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x08, READ_SDR, FLEXSPI_4PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 3 Write Enable -> 3
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 4 Read extend parameters
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x81, READ_SDR, FLEXSPI_1PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 5 Erase Sector -> 5
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 24),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 6 Write Status Reg
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01, WRITE_SDR, FLEXSPI_1PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 7 Page Program - quad mode (-> 9)
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
|
||||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 8 Read ID
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x90, DUMMY_SDR, FLEXSPI_1PAD, 24),
|
|
||||||
FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_1PAD, 0x00, 0, 0, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 9 Page Program - single mode -> 9
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 24),
|
|
||||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0, 0, 0, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 10 Enter QPI mode
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x35, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 11 Erase Chip
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 12 Exit QPI mode
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_4PAD, 0xF5, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.pageSize = 512u,
|
|
||||||
.sectorSize = 256u * 1024u,
|
|
||||||
.blockSize = 256u * 1024u,
|
|
||||||
.isUniformBlockSize = true,
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* XIP_BOOT_HEADER_ENABLE */
|
|
||||||
@@ -1,14 +1,10 @@
|
|||||||
#define MICROPY_HW_BOARD_NAME "i.MX RT1050 EVK"
|
#define MICROPY_HW_BOARD_NAME "i.MX RT1050 EVK"
|
||||||
#define MICROPY_HW_MCU_NAME "MIMXRT1052DVL6B"
|
#define MICROPY_HW_MCU_NAME "MIMXRT1052DVL6B"
|
||||||
|
|
||||||
#define BOARD_FLASH_SIZE (64 * 1024 * 1024)
|
// MIMXRT1050_EVKB has 1 user LED
|
||||||
|
|
||||||
// MIMXRT1050_EVK has 1 user LED
|
|
||||||
#define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_09)
|
#define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_09)
|
||||||
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin))
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin))
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin))
|
||||||
#define BOARD_FLASH_CONFIG_HEADER_H "evkmimxrt1050_flexspi_nor_config.h"
|
|
||||||
#define BOARD_FLASH_OPS_HEADER_H "hal/flexspi_nor_flash.h"
|
|
||||||
|
|
||||||
#define MICROPY_HW_NUM_PIN_IRQS (4 * 32 + 3)
|
#define MICROPY_HW_NUM_PIN_IRQS (4 * 32 + 3)
|
||||||
|
|
||||||
@@ -38,10 +34,10 @@
|
|||||||
{ IOMUXC_GPIO_SD_B0_02_LPSPI1_SDO }, { IOMUXC_GPIO_SD_B0_03_LPSPI1_SDI },
|
{ IOMUXC_GPIO_SD_B0_02_LPSPI1_SDO }, { IOMUXC_GPIO_SD_B0_03_LPSPI1_SDI },
|
||||||
|
|
||||||
#define DMA_REQ_SRC_RX { 0, kDmaRequestMuxLPSPI1Rx, kDmaRequestMuxLPSPI2Rx, \
|
#define DMA_REQ_SRC_RX { 0, kDmaRequestMuxLPSPI1Rx, kDmaRequestMuxLPSPI2Rx, \
|
||||||
kDmaRequestMuxLPSPI3Rx, kDmaRequestMuxLPSPI4Rx }
|
kDmaRequestMuxLPSPI3Rx, kDmaRequestMuxLPSPI4Rx }
|
||||||
|
|
||||||
#define DMA_REQ_SRC_TX { 0, kDmaRequestMuxLPSPI1Tx, kDmaRequestMuxLPSPI2Tx, \
|
#define DMA_REQ_SRC_TX { 0, kDmaRequestMuxLPSPI1Tx, kDmaRequestMuxLPSPI2Tx, \
|
||||||
kDmaRequestMuxLPSPI3Tx, kDmaRequestMuxLPSPI4Tx }
|
kDmaRequestMuxLPSPI3Tx, kDmaRequestMuxLPSPI4Tx }
|
||||||
|
|
||||||
// Define the mapping hardware I2C # to logical I2C #
|
// Define the mapping hardware I2C # to logical I2C #
|
||||||
// SDA/SCL HW-I2C Logical I2C
|
// SDA/SCL HW-I2C Logical I2C
|
||||||
@@ -56,13 +52,14 @@
|
|||||||
{ IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL }, { IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA },
|
{ IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL }, { IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA },
|
||||||
|
|
||||||
#define USDHC_DUMMY_PIN NULL, 0
|
#define USDHC_DUMMY_PIN NULL, 0
|
||||||
|
|
||||||
#define MICROPY_USDHC1 \
|
#define MICROPY_USDHC1 \
|
||||||
{ \
|
{ \
|
||||||
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
|
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
|
||||||
.clk = { GPIO_SD_B0_01_USDHC1_CLK }, \
|
.clk = { GPIO_SD_B0_01_USDHC1_CLK }, \
|
||||||
.cd_b = { GPIO_B1_12_USDHC1_CD_B },\
|
.cd_b = { GPIO_B1_12_USDHC1_CD_B }, \
|
||||||
.data0 = { GPIO_SD_B0_02_USDHC1_DATA0 },\
|
.data0 = { GPIO_SD_B0_02_USDHC1_DATA0 }, \
|
||||||
.data1 = { GPIO_SD_B0_03_USDHC1_DATA1 },\
|
.data1 = { GPIO_SD_B0_03_USDHC1_DATA1 }, \
|
||||||
.data2 = { GPIO_SD_B0_04_USDHC1_DATA2 },\
|
.data2 = { GPIO_SD_B0_04_USDHC1_DATA2 }, \
|
||||||
.data3 = { GPIO_SD_B0_05_USDHC1_DATA3 },\
|
.data3 = { GPIO_SD_B0_05_USDHC1_DATA3 }, \
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,11 +3,10 @@ MCU_VARIANT = MIMXRT1052DVL6B
|
|||||||
|
|
||||||
MICROPY_FLOAT_IMPL = double
|
MICROPY_FLOAT_IMPL = double
|
||||||
MICROPY_PY_MACHINE_SDCARD = 1
|
MICROPY_PY_MACHINE_SDCARD = 1
|
||||||
|
BOARD_FLASH_TYPE ?= hyperflash
|
||||||
|
BOARD_FLASH_SIZE ?= 0x4000000 # 64MB
|
||||||
|
|
||||||
JLINK_PATH ?= /media/RT1050-EVK/
|
JLINK_PATH ?= /media/RT1050-EVKB/
|
||||||
|
|
||||||
deploy: $(BUILD)/firmware.bin
|
deploy: $(BUILD)/firmware.bin
|
||||||
cp $< $(JLINK_PATH)
|
cp $< $(JLINK_PATH)
|
||||||
|
|
||||||
SRC_C += \
|
|
||||||
hal/flexspi_nor_flash.c
|
|
||||||
|
|||||||
186
ports/mimxrt/boards/MIMXRT1050_EVK/qspi_hyper_flash_config.c
Normal file
186
ports/mimxrt/boards/MIMXRT1050_EVK/qspi_hyper_flash_config.c
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include BOARD_FLASH_CONFIG_HEADER_H
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
||||||
|
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
|
||||||
|
__attribute__((section(".boot_hdr.conf")))
|
||||||
|
#elif defined(__ICCARM__)
|
||||||
|
#pragma location = ".boot_hdr.conf"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const flexspi_nor_config_t qspiflash_config = {
|
||||||
|
.memConfig =
|
||||||
|
{
|
||||||
|
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||||
|
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||||
|
.readSampleClkSrc = kFlexSPIReadSampleClk_ExternalInputFromDqsPad,
|
||||||
|
.csHoldTime = 3u,
|
||||||
|
.csSetupTime = 3u,
|
||||||
|
.columnAddressWidth = 3u,
|
||||||
|
// Enable DDR mode, Wordaddressable, Safe configuration, Differential clock
|
||||||
|
.controllerMiscOption =
|
||||||
|
(1u << kFlexSpiMiscOffset_DdrModeEnable) | (1u << kFlexSpiMiscOffset_WordAddressableEnable) |
|
||||||
|
(1u << kFlexSpiMiscOffset_SafeConfigFreqEnable) | (1u << kFlexSpiMiscOffset_DiffClkEnable),
|
||||||
|
.sflashPadType = kSerialFlash_8Pads,
|
||||||
|
.serialClkFreq = kFlexSpiSerialClk_133MHz,
|
||||||
|
.sflashA1Size = BOARD_FLASH_SIZE,
|
||||||
|
.dataValidTime = {16u, 16u},
|
||||||
|
.lookupTable =
|
||||||
|
{
|
||||||
|
/* 0 Read Data */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04),
|
||||||
|
|
||||||
|
/* 1 Write Data */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_WRITE_DDR, kFLEXSPI_8PAD, 0x02),
|
||||||
|
|
||||||
|
/* 2 Read Status */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 2] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 3] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x70), // DATA 0x70
|
||||||
|
// +1
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 4] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 5] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DUMMY_RWDS_DDR, kFLEXSPI_8PAD, 0x0B),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 6] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0),
|
||||||
|
|
||||||
|
/* 4 Write Enable */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 2] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 3] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // DATA 0xAA
|
||||||
|
// +1
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 4] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 5] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 6] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 7] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
|
||||||
|
/* 6 Erase Sector */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 2] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 3] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x80), // DATA 0x80
|
||||||
|
// +1
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 4] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 5] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 6] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 7] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
||||||
|
// +2
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 8] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 9] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 10] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 11] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
// +3
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 12] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 13] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 14] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x30, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),
|
||||||
|
|
||||||
|
/* 10 program page with word program command sequence */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 2] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 3] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0), // DATA 0xA0
|
||||||
|
// +1
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 4] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 5] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_WRITE_DDR, kFLEXSPI_8PAD, 0x80),
|
||||||
|
|
||||||
|
/* 12 Erase chip */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 1] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 2] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 3] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x80),
|
||||||
|
// +1
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 4] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 5] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 6] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 7] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
||||||
|
// +2
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 8] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 9] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 10] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 11] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
// +3
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 12] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 13] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 14] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 15] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x10),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.pageSize = 512u,
|
||||||
|
.sectorSize = 256u * 1024u,
|
||||||
|
.blockSize = 256u * 1024u,
|
||||||
|
.isUniformBlockSize = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* XIP_BOOT_HEADER_ENABLE */
|
||||||
129
ports/mimxrt/boards/MIMXRT1050_EVK/qspi_nor_flash_config.c
Normal file
129
ports/mimxrt/boards/MIMXRT1050_EVK/qspi_nor_flash_config.c
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include BOARD_FLASH_CONFIG_HEADER_H
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
||||||
|
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
|
||||||
|
__attribute__((section(".boot_hdr.conf")))
|
||||||
|
#elif defined(__ICCARM__)
|
||||||
|
#pragma location = ".boot_hdr.conf"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const flexspi_nor_config_t qspiflash_config = {
|
||||||
|
.memConfig =
|
||||||
|
{
|
||||||
|
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||||
|
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||||
|
.readSampleClkSrc = kFlexSPIReadSampleClk_ExternalInputFromDqsPad,
|
||||||
|
.csHoldTime = 3u,
|
||||||
|
.csSetupTime = 3u,
|
||||||
|
.columnAddressWidth = 3u,
|
||||||
|
// Enable DDR mode, Wordaddassable, Safe configuration, Differential clock
|
||||||
|
.controllerMiscOption =
|
||||||
|
(1u << kFlexSpiMiscOffset_DdrModeEnable) | (1u << kFlexSpiMiscOffset_WordAddressableEnable) |
|
||||||
|
(1u << kFlexSpiMiscOffset_SafeConfigFreqEnable) | (1u << kFlexSpiMiscOffset_DiffClkEnable),
|
||||||
|
.sflashPadType = kSerialFlash_8Pads,
|
||||||
|
.serialClkFreq = kFlexSpiSerialClk_133MHz,
|
||||||
|
.sflashA1Size = BOARD_FLASH_SIZE,
|
||||||
|
.dataValidTime = {16u, 16u},
|
||||||
|
.lookupTable =
|
||||||
|
{
|
||||||
|
// 0 Read LUTs 0 -> 0
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 1 Read status register -> 1
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x01),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 2 Fast read quad mode - SDR
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x6B, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x08, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 3 Write Enable -> 3
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 4 Read extend parameters
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x81, READ_SDR, FLEXSPI_1PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 5 Erase Sector -> 5
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 6 Write Status Reg
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01, WRITE_SDR, FLEXSPI_1PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 7 Page Program - quad mode (-> 9)
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 8 Read ID
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x90, DUMMY_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_1PAD, 0x00, 0, 0, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 9 Page Program - single mode -> 9
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0, 0, 0, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 10 Enter QPI mode
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x35, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 11 Erase Chip
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 12 Exit QPI mode
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_4PAD, 0xF5, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.pageSize = 512u,
|
||||||
|
.sectorSize = 256u * 1024u,
|
||||||
|
.blockSize = 256u * 1024u,
|
||||||
|
.isUniformBlockSize = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* XIP_BOOT_HEADER_ENABLE */
|
||||||
@@ -1 +0,0 @@
|
|||||||
flash_size = 64M;
|
|
||||||
@@ -1,263 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __EVKMIMXRT1050_FLEXSPI_NOR_CONFIG__
|
|
||||||
#define __EVKMIMXRT1050_FLEXSPI_NOR_CONFIG__
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include "fsl_flexspi.h"
|
|
||||||
|
|
||||||
/*! @name Driver version */
|
|
||||||
/*@{*/
|
|
||||||
/*! @brief XIP_BOARD driver version 2.0.0. */
|
|
||||||
#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
|
|
||||||
/*@}*/
|
|
||||||
|
|
||||||
/* FLEXSPI memory config block related defintions */
|
|
||||||
#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian
|
|
||||||
#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0
|
|
||||||
#define FLEXSPI_CFG_BLK_SIZE (512)
|
|
||||||
|
|
||||||
/* FLEXSPI Feature related definitions */
|
|
||||||
#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
|
|
||||||
|
|
||||||
/* Lookup table related defintions */
|
|
||||||
#define CMD_INDEX_READ 0
|
|
||||||
#define CMD_INDEX_READSTATUS 1
|
|
||||||
#define CMD_INDEX_WRITEENABLE 2
|
|
||||||
#define CMD_INDEX_WRITE 4
|
|
||||||
|
|
||||||
#define CMD_LUT_SEQ_IDX_READ 0
|
|
||||||
#define CMD_LUT_SEQ_IDX_READSTATUS 1
|
|
||||||
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
|
||||||
#define CMD_LUT_SEQ_IDX_WRITE 9
|
|
||||||
|
|
||||||
#define CMD_SDR 0x01
|
|
||||||
#define CMD_DDR 0x21
|
|
||||||
#define RADDR_SDR 0x02
|
|
||||||
#define RADDR_DDR 0x22
|
|
||||||
#define CADDR_SDR 0x03
|
|
||||||
#define CADDR_DDR 0x23
|
|
||||||
#define MODE1_SDR 0x04
|
|
||||||
#define MODE1_DDR 0x24
|
|
||||||
#define MODE2_SDR 0x05
|
|
||||||
#define MODE2_DDR 0x25
|
|
||||||
#define MODE4_SDR 0x06
|
|
||||||
#define MODE4_DDR 0x26
|
|
||||||
#define MODE8_SDR 0x07
|
|
||||||
#define MODE8_DDR 0x27
|
|
||||||
#define WRITE_SDR 0x08
|
|
||||||
#define WRITE_DDR 0x28
|
|
||||||
#define READ_SDR 0x09
|
|
||||||
#define READ_DDR 0x29
|
|
||||||
#define LEARN_SDR 0x0A
|
|
||||||
#define LEARN_DDR 0x2A
|
|
||||||
#define DATSZ_SDR 0x0B
|
|
||||||
#define DATSZ_DDR 0x2B
|
|
||||||
#define DUMMY_SDR 0x0C
|
|
||||||
#define DUMMY_DDR 0x2C
|
|
||||||
#define DUMMY_RWDS_SDR 0x0D
|
|
||||||
#define DUMMY_RWDS_DDR 0x2D
|
|
||||||
#define JMP_ON_CS 0x1F
|
|
||||||
#define STOP 0
|
|
||||||
|
|
||||||
#define FLEXSPI_1PAD 0
|
|
||||||
#define FLEXSPI_2PAD 1
|
|
||||||
#define FLEXSPI_4PAD 2
|
|
||||||
#define FLEXSPI_8PAD 3
|
|
||||||
|
|
||||||
#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
|
|
||||||
(FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
|
|
||||||
FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
|
||||||
|
|
||||||
//!@brief Definitions for FlexSPI Serial Clock Frequency
|
|
||||||
typedef enum _FlexSpiSerialClockFreq
|
|
||||||
{
|
|
||||||
kFlexSpiSerialClk_30MHz = 1,
|
|
||||||
kFlexSpiSerialClk_50MHz = 2,
|
|
||||||
kFlexSpiSerialClk_60MHz = 3,
|
|
||||||
kFlexSpiSerialClk_75MHz = 4,
|
|
||||||
kFlexSpiSerialClk_80MHz = 5,
|
|
||||||
kFlexSpiSerialClk_100MHz = 6,
|
|
||||||
kFlexSpiSerialClk_133MHz = 7,
|
|
||||||
kFlexSpiSerialClk_166MHz = 8,
|
|
||||||
} flexspi_serial_clk_freq_t;
|
|
||||||
|
|
||||||
//!@brief FlexSPI clock configuration type
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiClk_SDR, //!< Clock configure for SDR mode
|
|
||||||
kFlexSpiClk_DDR, //!< Clock configurat for DDR mode
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI Read Sample Clock Source definition
|
|
||||||
typedef enum _FlashReadSampleClkSource
|
|
||||||
{
|
|
||||||
kFlexSPIReadSampleClk_LoopbackInternally = 0,
|
|
||||||
kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
|
|
||||||
kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
|
|
||||||
kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
|
|
||||||
} flexspi_read_sample_clk_t;
|
|
||||||
|
|
||||||
//!@brief Misc feature bit definitions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiMiscOffset_DiffClkEnable = 0, //!< Bit for Differential clock enable
|
|
||||||
kFlexSpiMiscOffset_Ck2Enable = 1, //!< Bit for CK2 enable
|
|
||||||
kFlexSpiMiscOffset_ParallelEnable = 2, //!< Bit for Parallel mode enable
|
|
||||||
kFlexSpiMiscOffset_WordAddressableEnable = 3, //!< Bit for Word Addressable enable
|
|
||||||
kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, //!< Bit for Safe Configuration Frequency enable
|
|
||||||
kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable
|
|
||||||
kFlexSpiMiscOffset_DdrModeEnable = 6, //!< Bit for DDR clock confiuration indication.
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief Flash Type Definition
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiDeviceType_SerialNOR = 1, //!< Flash devices are Serial NOR
|
|
||||||
kFlexSpiDeviceType_SerialNAND = 2, //!< Flash devices are Serial NAND
|
|
||||||
kFlexSpiDeviceType_SerialRAM = 3, //!< Flash devices are Serial RAM/HyperFLASH
|
|
||||||
kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND
|
|
||||||
kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, //!< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief Flash Pad Definitions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kSerialFlash_1Pad = 1,
|
|
||||||
kSerialFlash_2Pads = 2,
|
|
||||||
kSerialFlash_4Pads = 4,
|
|
||||||
kSerialFlash_8Pads = 8,
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI LUT Sequence structure
|
|
||||||
typedef struct _lut_sequence
|
|
||||||
{
|
|
||||||
uint8_t seqNum; //!< Sequence Number, valid number: 1-16
|
|
||||||
uint8_t seqId; //!< Sequence Index, valid number: 0-15
|
|
||||||
uint16_t reserved;
|
|
||||||
} flexspi_lut_seq_t;
|
|
||||||
|
|
||||||
//!@brief Flash Configuration Command Type
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kDeviceConfigCmdType_Generic, //!< Generic command, for example: configure dummy cycles, drive strength, etc
|
|
||||||
kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command
|
|
||||||
kDeviceConfigCmdType_Spi2Xpi, //!< Switch from SPI to DPI/QPI/OPI mode
|
|
||||||
kDeviceConfigCmdType_Xpi2Spi, //!< Switch from DPI/QPI/OPI to SPI mode
|
|
||||||
kDeviceConfigCmdType_Spi2NoCmd, //!< Switch to 0-4-4/0-8-8 mode
|
|
||||||
kDeviceConfigCmdType_Reset, //!< Reset device command
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI Memory Configuration Block
|
|
||||||
typedef struct _FlexSPIConfig
|
|
||||||
{
|
|
||||||
uint32_t tag; //!< [0x000-0x003] Tag, fixed value 0x42464346UL
|
|
||||||
uint32_t version; //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix
|
|
||||||
uint32_t reserved0; //!< [0x008-0x00b] Reserved for future use
|
|
||||||
uint8_t readSampleClkSrc; //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3
|
|
||||||
uint8_t csHoldTime; //!< [0x00d-0x00d] CS hold time, default value: 3
|
|
||||||
uint8_t csSetupTime; //!< [0x00e-0x00e] CS setup time, default value: 3
|
|
||||||
uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
|
|
||||||
//! Serial NAND, need to refer to datasheet
|
|
||||||
uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable
|
|
||||||
uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
|
|
||||||
//! Generic configuration, etc.
|
|
||||||
uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
|
|
||||||
//! DPI/QPI/OPI switch or reset command
|
|
||||||
flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
|
|
||||||
//! sequence number, [31:16] Reserved
|
|
||||||
uint32_t deviceModeArg; //!< [0x018-0x01b] Argument/Parameter for device configuration
|
|
||||||
uint8_t configCmdEnable; //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable
|
|
||||||
uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe
|
|
||||||
flexspi_lut_seq_t
|
|
||||||
configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq
|
|
||||||
uint32_t reserved1; //!< [0x02c-0x02f] Reserved for future use
|
|
||||||
uint32_t configCmdArgs[3]; //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands
|
|
||||||
uint32_t reserved2; //!< [0x03c-0x03f] Reserved for future use
|
|
||||||
uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
|
|
||||||
//! details
|
|
||||||
uint8_t deviceType; //!< [0x044-0x044] Device Type: See Flash Type Definition for more details
|
|
||||||
uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal
|
|
||||||
uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
|
|
||||||
//! Chapter for more details
|
|
||||||
uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
|
|
||||||
//! be done using 1 LUT sequence, currently, only applicable to HyperFLASH
|
|
||||||
uint32_t reserved3[2]; //!< [0x048-0x04f] Reserved for future use
|
|
||||||
uint32_t sflashA1Size; //!< [0x050-0x053] Size of Flash connected to A1
|
|
||||||
uint32_t sflashA2Size; //!< [0x054-0x057] Size of Flash connected to A2
|
|
||||||
uint32_t sflashB1Size; //!< [0x058-0x05b] Size of Flash connected to B1
|
|
||||||
uint32_t sflashB2Size; //!< [0x05c-0x05f] Size of Flash connected to B2
|
|
||||||
uint32_t csPadSettingOverride; //!< [0x060-0x063] CS pad setting override value
|
|
||||||
uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value
|
|
||||||
uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value
|
|
||||||
uint32_t dqsPadSettingOverride; //!< [0x06c-0x06f] DQS pad setting override value
|
|
||||||
uint32_t timeoutInMs; //!< [0x070-0x073] Timeout threshold for read status command
|
|
||||||
uint32_t commandInterval; //!< [0x074-0x077] CS deselect interval between two commands
|
|
||||||
uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns
|
|
||||||
uint16_t busyOffset; //!< [0x07c-0x07d] Busy offset, valid value: 0-31
|
|
||||||
uint16_t busyBitPolarity; //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
|
|
||||||
//! busy flag is 0 when flash device is busy
|
|
||||||
uint32_t lookupTable[64]; //!< [0x080-0x17f] Lookup table holds Flash command sequences
|
|
||||||
flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences
|
|
||||||
uint32_t reserved4[4]; //!< [0x1b0-0x1bf] Reserved for future use
|
|
||||||
} flexspi_mem_config_t;
|
|
||||||
|
|
||||||
/* */
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL 0
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG 1
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD 2
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 4
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG 6
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD 7
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READID 8
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_ENTERQPI 10
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_EXITQPI 12
|
|
||||||
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA 0
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA 1
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS 2
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE 4
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR 6
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM 10
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP 12
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Serial NOR configuration block
|
|
||||||
*/
|
|
||||||
typedef struct _flexspi_nor_config
|
|
||||||
{
|
|
||||||
flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI
|
|
||||||
uint32_t pageSize; //!< Page size of Serial NOR
|
|
||||||
uint32_t sectorSize; //!< Sector size of Serial NOR
|
|
||||||
uint8_t ipcmdSerialClkFreq; //!< Clock frequency for IP command
|
|
||||||
uint8_t isUniformBlockSize; //!< Sector/Block size is the same
|
|
||||||
uint8_t reserved0[2]; //!< Reserved for future use
|
|
||||||
uint8_t serialNorType; //!< Serial NOR Flash type: 0/1/2/3
|
|
||||||
uint8_t needExitNoCmdMode; //!< Need to exit NoCmd mode before other IP command
|
|
||||||
uint8_t halfClkForNonReadCmd; //!< Half the Serial Clock for non-read command: true/false
|
|
||||||
uint8_t needRestoreNoCmdMode; //!< Need to Restore NoCmd mode after IP commmand execution
|
|
||||||
uint32_t blockSize; //!< Block size
|
|
||||||
uint32_t reserve2[11]; //!< Reserved for future use
|
|
||||||
} flexspi_nor_config_t;
|
|
||||||
|
|
||||||
#define FLASH_BUSY_STATUS_POL 0
|
|
||||||
#define FLASH_BUSY_STATUS_OFFSET 0
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* __EVKMIMXRT1050_FLEXSPI_NOR_CONFIG__ */
|
|
||||||
@@ -1,186 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "evkbmimxrt1050_flexspi_nor_config.h"
|
|
||||||
|
|
||||||
/* Component ID definition, used by tools. */
|
|
||||||
#ifndef FSL_COMPONENT_ID
|
|
||||||
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Code
|
|
||||||
******************************************************************************/
|
|
||||||
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
|
||||||
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
|
|
||||||
__attribute__((section(".boot_hdr.conf")))
|
|
||||||
#elif defined(__ICCARM__)
|
|
||||||
#pragma location = ".boot_hdr.conf"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const flexspi_nor_config_t qspiflash_config = {
|
|
||||||
.memConfig =
|
|
||||||
{
|
|
||||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
|
||||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
|
||||||
.readSampleClkSrc = kFlexSPIReadSampleClk_ExternalInputFromDqsPad,
|
|
||||||
.csHoldTime = 3u,
|
|
||||||
.csSetupTime = 3u,
|
|
||||||
.columnAddressWidth = 3u,
|
|
||||||
// Enable DDR mode, Wordaddressable, Safe configuration, Differential clock
|
|
||||||
.controllerMiscOption =
|
|
||||||
(1u << kFlexSpiMiscOffset_DdrModeEnable) | (1u << kFlexSpiMiscOffset_WordAddressableEnable) |
|
|
||||||
(1u << kFlexSpiMiscOffset_SafeConfigFreqEnable) | (1u << kFlexSpiMiscOffset_DiffClkEnable),
|
|
||||||
.sflashPadType = kSerialFlash_8Pads,
|
|
||||||
.serialClkFreq = kFlexSpiSerialClk_133MHz,
|
|
||||||
.sflashA1Size = 64u * 1024u * 1024u,
|
|
||||||
.dataValidTime = {16u, 16u},
|
|
||||||
.lookupTable =
|
|
||||||
{
|
|
||||||
/* 0 Read Data */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04),
|
|
||||||
|
|
||||||
/* 1 Write Data */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_WRITE_DDR, kFLEXSPI_8PAD, 0x02),
|
|
||||||
|
|
||||||
/* 2 Read Status */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 2] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 3] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x70), // DATA 0x70
|
|
||||||
// +1
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 4] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 5] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DUMMY_RWDS_DDR, kFLEXSPI_8PAD, 0x0B),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 6] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0),
|
|
||||||
|
|
||||||
/* 4 Write Enable */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 2] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 3] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // DATA 0xAA
|
|
||||||
// +1
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 4] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 5] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 6] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 7] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
|
|
||||||
/* 6 Erase Sector */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 2] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 3] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x80), // DATA 0x80
|
|
||||||
// +1
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 4] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 5] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 6] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 7] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
|
||||||
// +2
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 8] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 9] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 10] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 11] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
// +3
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 12] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 13] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 14] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x30, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),
|
|
||||||
|
|
||||||
/* 10 program page with word program command sequence */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 2] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 3] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0), // DATA 0xA0
|
|
||||||
// +1
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 4] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 5] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_WRITE_DDR, kFLEXSPI_8PAD, 0x80),
|
|
||||||
|
|
||||||
/* 12 Erase chip */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 1] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 2] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 3] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x80),
|
|
||||||
// +1
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 4] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 5] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 6] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 7] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
|
||||||
// +2
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 8] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 9] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 10] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 11] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
// +3
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 12] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 13] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 14] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 15] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x10),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.pageSize = 512u,
|
|
||||||
.sectorSize = 256u * 1024u,
|
|
||||||
.blockSize = 256u * 1024u,
|
|
||||||
.isUniformBlockSize = true,
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* XIP_BOOT_HEADER_ENABLE */
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
#define MICROPY_HW_BOARD_NAME "i.MX RT1050 EVKB"
|
|
||||||
#define MICROPY_HW_MCU_NAME "MIMXRT1052DVL6B"
|
|
||||||
|
|
||||||
#define BOARD_FLASH_SIZE (64 * 1024 * 1024)
|
|
||||||
|
|
||||||
// MIMXRT1050_EVKB has 1 user LED
|
|
||||||
#define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_09)
|
|
||||||
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin))
|
|
||||||
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin))
|
|
||||||
#define BOARD_FLASH_CONFIG_HEADER_H "evkbmimxrt1050_flexspi_nor_config.h"
|
|
||||||
#define BOARD_FLASH_OPS_HEADER_H "hal/flexspi_hyper_flash.h"
|
|
||||||
|
|
||||||
#define MICROPY_HW_NUM_PIN_IRQS (4 * 32 + 3)
|
|
||||||
|
|
||||||
// Define mapping logical UART # to hardware UART #
|
|
||||||
// LPUART3 on D0/D1 -> 1
|
|
||||||
// LPUART2 on D7/D6 -> 2
|
|
||||||
// LPUART6 on D8/D9 -> 3
|
|
||||||
// LPUART8 on A1/A0 -> 4
|
|
||||||
|
|
||||||
#define MICROPY_HW_UART_NUM (sizeof(uart_index_table) / sizeof(uart_index_table)[0])
|
|
||||||
#define MICROPY_HW_UART_INDEX { 0, 3, 2, 6, 8 }
|
|
||||||
|
|
||||||
#define IOMUX_TABLE_UART \
|
|
||||||
{ 0 }, { 0 }, \
|
|
||||||
{ IOMUXC_GPIO_AD_B1_02_LPUART2_TX }, { IOMUXC_GPIO_AD_B1_03_LPUART2_RX }, \
|
|
||||||
{ IOMUXC_GPIO_AD_B1_06_LPUART3_TX }, { IOMUXC_GPIO_AD_B1_07_LPUART3_RX }, \
|
|
||||||
{ 0 }, { 0 }, \
|
|
||||||
{ 0 }, { 0 }, \
|
|
||||||
{ IOMUXC_GPIO_AD_B0_02_LPUART6_TX }, { IOMUXC_GPIO_AD_B0_03_LPUART6_RX }, \
|
|
||||||
{ 0 }, { 0 }, \
|
|
||||||
{ IOMUXC_GPIO_AD_B1_10_LPUART8_TX }, { IOMUXC_GPIO_AD_B1_11_LPUART8_RX },
|
|
||||||
|
|
||||||
#define MICROPY_HW_SPI_INDEX { 1 }
|
|
||||||
|
|
||||||
#define IOMUX_TABLE_SPI \
|
|
||||||
{ IOMUXC_GPIO_SD_B0_00_LPSPI1_SCK }, { IOMUXC_GPIO_SD_B0_01_LPSPI1_PCS0 }, \
|
|
||||||
{ IOMUXC_GPIO_SD_B0_02_LPSPI1_SDO }, { IOMUXC_GPIO_SD_B0_03_LPSPI1_SDI },
|
|
||||||
|
|
||||||
#define DMA_REQ_SRC_RX { 0, kDmaRequestMuxLPSPI1Rx, kDmaRequestMuxLPSPI2Rx, \
|
|
||||||
kDmaRequestMuxLPSPI3Rx, kDmaRequestMuxLPSPI4Rx }
|
|
||||||
|
|
||||||
#define DMA_REQ_SRC_TX { 0, kDmaRequestMuxLPSPI1Tx, kDmaRequestMuxLPSPI2Tx, \
|
|
||||||
kDmaRequestMuxLPSPI3Tx, kDmaRequestMuxLPSPI4Tx }
|
|
||||||
|
|
||||||
// Define the mapping hardware I2C # to logical I2C #
|
|
||||||
// SDA/SCL HW-I2C Logical I2C
|
|
||||||
// D14/D15 LPI2C1 -> 0
|
|
||||||
// D1/D0 LPI2C3 -> 1
|
|
||||||
|
|
||||||
#define MICROPY_HW_I2C_INDEX { 1, 3 }
|
|
||||||
|
|
||||||
#define IOMUX_TABLE_I2C \
|
|
||||||
{ IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL }, { IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA }, \
|
|
||||||
{ 0 }, { 0 }, \
|
|
||||||
{ IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL }, { IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA },
|
|
||||||
|
|
||||||
#define USDHC_DUMMY_PIN NULL , 0
|
|
||||||
#define MICROPY_USDHC1 \
|
|
||||||
{ \
|
|
||||||
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
|
|
||||||
.clk = { GPIO_SD_B0_01_USDHC1_CLK }, \
|
|
||||||
.cd_b = { GPIO_B1_12_USDHC1_CD_B },\
|
|
||||||
.data0 = { GPIO_SD_B0_02_USDHC1_DATA0 },\
|
|
||||||
.data1 = { GPIO_SD_B0_03_USDHC1_DATA1 },\
|
|
||||||
.data2 = { GPIO_SD_B0_04_USDHC1_DATA2 },\
|
|
||||||
.data3 = { GPIO_SD_B0_05_USDHC1_DATA3 },\
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
MCU_SERIES = MIMXRT1052
|
|
||||||
MCU_VARIANT = MIMXRT1052DVL6B
|
|
||||||
|
|
||||||
MICROPY_FLOAT_IMPL = double
|
|
||||||
MICROPY_PY_MACHINE_SDCARD = 1
|
|
||||||
|
|
||||||
JLINK_PATH ?= /media/RT1050-EVKB/
|
|
||||||
|
|
||||||
SRC_C += \
|
|
||||||
hal/flexspi_hyper_flash.c
|
|
||||||
|
|
||||||
deploy: $(BUILD)/firmware.bin
|
|
||||||
cp $< $(JLINK_PATH)
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
D0,GPIO_AD_B1_07
|
|
||||||
D1,GPIO_AD_B1_06
|
|
||||||
D2,GPIO_AD_B0_11
|
|
||||||
D3,GPIO_AD_B1_08
|
|
||||||
D4,GPIO_AD_B0_09
|
|
||||||
D5,GPIO_AD_B0_10
|
|
||||||
D6,GPIO_AD_B1_02
|
|
||||||
D7,GPIO_AD_B1_03
|
|
||||||
D8,GPIO_AD_B0_03
|
|
||||||
D9,GPIO_AD_B0_02
|
|
||||||
D10,GPIO_SD_B0_01
|
|
||||||
D11,GPIO_SD_B0_02
|
|
||||||
D12,GPIO_SD_B0_03
|
|
||||||
D13,GPIO_SD_B0_00
|
|
||||||
D14,GPIO_AD_B1_01
|
|
||||||
D15,GPIO_AD_B1_00
|
|
||||||
A0,GPIO_AD_B1_10
|
|
||||||
A1,GPIO_AD_B1_11
|
|
||||||
A2,GPIO_AD_B1_04
|
|
||||||
A3,GPIO_AD_B1_05
|
|
||||||
A4,GPIO_AD_B1_01
|
|
||||||
A5,GPIO_AD_B1_00
|
|
||||||
RX,GPIO_AD_B1_07
|
|
||||||
TX,GPIO_AD_B1_06
|
|
||||||
SCL,GPIO_AD_B1_00
|
|
||||||
SDA,GPIO_AD_B1_01
|
|
||||||
SCK,GPIO_SD_B0_00
|
|
||||||
SDI,GPIO_SD_B0_03
|
|
||||||
SDO,GPIO_SD_B0_02
|
|
||||||
CS,GPIO_SD_B0_01
|
|
||||||
LED_GREEN,GPIO_AD_B0_09
|
|
||||||
|
@@ -1,14 +1,25 @@
|
|||||||
/* Memory configuration */
|
/* Memory configuration */
|
||||||
|
#if BOARD_FLASH_RESERVED
|
||||||
|
reserved_size = BOARD_FLASH_RESERVED;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if BOARD_FLASH_TYPE==qspi_nor
|
||||||
flash_start = 0x60000000;
|
flash_start = 0x60000000;
|
||||||
|
#elif BOARD_FLASH_TYPE==hyperflash
|
||||||
|
flash_start = 0x60000000;
|
||||||
|
#else
|
||||||
|
#error Unknown BOARD_FLASH_TYPE
|
||||||
|
#endif
|
||||||
|
flash_size = BOARD_FLASH_SIZE;
|
||||||
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));
|
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));
|
||||||
flash_config_start = flash_start;
|
flash_config_start = flash_start;
|
||||||
flash_config_size = 0x00001000;
|
flash_config_size = 0x00001000;
|
||||||
ivt_start = 0x60001000;
|
ivt_start = flash_start + 0x00001000;
|
||||||
ivt_size = 0x00001000;
|
ivt_size = 0x00001000;
|
||||||
interrupts_start = 0x60002000;
|
interrupts_start = flash_start + 0x00002000;
|
||||||
interrupts_size = 0x00000400;
|
interrupts_size = 0x00000400;
|
||||||
text_start = 0x60002400;
|
text_start = flash_start + 0x00002400;
|
||||||
vfs_start = 0x60100000;
|
vfs_start = flash_start + 0x00100000;
|
||||||
text_size = ((vfs_start) - (text_start));
|
text_size = ((vfs_start) - (text_start));
|
||||||
vfs_size = ((flash_end) - (vfs_start));
|
vfs_size = ((flash_end) - (vfs_start));
|
||||||
itcm_start = 0x00000000;
|
itcm_start = 0x00000000;
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
flash_size = 64M;
|
|
||||||
@@ -0,0 +1,264 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EVKMIMXRT1060_FLEXSPI_NOR_CONFIG__
|
||||||
|
#define __EVKMIMXRT1060_FLEXSPI_NOR_CONFIG__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "fsl_flexspi.h"
|
||||||
|
|
||||||
|
/*! @name Driver version */
|
||||||
|
/*@{*/
|
||||||
|
/*! @brief XIP_BOARD driver version 2.0.0. */
|
||||||
|
#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/* FLEXSPI memory config block related defintions */
|
||||||
|
#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian
|
||||||
|
#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0
|
||||||
|
#define FLEXSPI_CFG_BLK_SIZE (512)
|
||||||
|
|
||||||
|
/* FLEXSPI Feature related definitions */
|
||||||
|
#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
|
||||||
|
|
||||||
|
/* Lookup table related defintions */
|
||||||
|
#define CMD_INDEX_READ 0
|
||||||
|
#define CMD_INDEX_READSTATUS 1
|
||||||
|
#define CMD_INDEX_WRITEENABLE 2
|
||||||
|
#define CMD_INDEX_WRITE 4
|
||||||
|
|
||||||
|
#define CMD_LUT_SEQ_IDX_READ 0
|
||||||
|
#define CMD_LUT_SEQ_IDX_READSTATUS 1
|
||||||
|
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
||||||
|
#define CMD_LUT_SEQ_IDX_WRITE 9
|
||||||
|
|
||||||
|
#define CMD_SDR 0x01
|
||||||
|
#define CMD_DDR 0x21
|
||||||
|
#define RADDR_SDR 0x02
|
||||||
|
#define RADDR_DDR 0x22
|
||||||
|
#define CADDR_SDR 0x03
|
||||||
|
#define CADDR_DDR 0x23
|
||||||
|
#define MODE1_SDR 0x04
|
||||||
|
#define MODE1_DDR 0x24
|
||||||
|
#define MODE2_SDR 0x05
|
||||||
|
#define MODE2_DDR 0x25
|
||||||
|
#define MODE4_SDR 0x06
|
||||||
|
#define MODE4_DDR 0x26
|
||||||
|
#define MODE8_SDR 0x07
|
||||||
|
#define MODE8_DDR 0x27
|
||||||
|
#define WRITE_SDR 0x08
|
||||||
|
#define WRITE_DDR 0x28
|
||||||
|
#define READ_SDR 0x09
|
||||||
|
#define READ_DDR 0x29
|
||||||
|
#define LEARN_SDR 0x0A
|
||||||
|
#define LEARN_DDR 0x2A
|
||||||
|
#define DATSZ_SDR 0x0B
|
||||||
|
#define DATSZ_DDR 0x2B
|
||||||
|
#define DUMMY_SDR 0x0C
|
||||||
|
#define DUMMY_DDR 0x2C
|
||||||
|
#define DUMMY_RWDS_SDR 0x0D
|
||||||
|
#define DUMMY_RWDS_DDR 0x2D
|
||||||
|
#define JMP_ON_CS 0x1F
|
||||||
|
#define STOP 0
|
||||||
|
|
||||||
|
#define FLEXSPI_1PAD 0
|
||||||
|
#define FLEXSPI_2PAD 1
|
||||||
|
#define FLEXSPI_4PAD 2
|
||||||
|
#define FLEXSPI_8PAD 3
|
||||||
|
|
||||||
|
#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
|
||||||
|
(FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
|
||||||
|
FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
||||||
|
|
||||||
|
// !@brief Definitions for FlexSPI Serial Clock Frequency
|
||||||
|
typedef enum _FlexSpiSerialClockFreq
|
||||||
|
{
|
||||||
|
kFlexSpiSerialClk_30MHz = 1,
|
||||||
|
kFlexSpiSerialClk_50MHz = 2,
|
||||||
|
kFlexSpiSerialClk_60MHz = 3,
|
||||||
|
kFlexSpiSerialClk_75MHz = 4,
|
||||||
|
kFlexSpiSerialClk_80MHz = 5,
|
||||||
|
kFlexSpiSerialClk_100MHz = 6,
|
||||||
|
kFlexSpiSerialClk_120MHz = 7,
|
||||||
|
kFlexSpiSerialClk_133MHz = 8,
|
||||||
|
kFlexSpiSerialClk_166MHz = 9,
|
||||||
|
} flexspi_serial_clk_freq_t;
|
||||||
|
|
||||||
|
// !@brief FlexSPI clock configuration type
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiClk_SDR, // !< Clock configure for SDR mode
|
||||||
|
kFlexSpiClk_DDR, // !< Clock configurat for DDR mode
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI Read Sample Clock Source definition
|
||||||
|
typedef enum _FlashReadSampleClkSource
|
||||||
|
{
|
||||||
|
kFlexSPIReadSampleClk_LoopbackInternally = 0,
|
||||||
|
kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
|
||||||
|
kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
|
||||||
|
kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
|
||||||
|
} flexspi_read_sample_clk_t;
|
||||||
|
|
||||||
|
// !@brief Misc feature bit definitions
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiMiscOffset_DiffClkEnable = 0, // !< Bit for Differential clock enable
|
||||||
|
kFlexSpiMiscOffset_Ck2Enable = 1, // !< Bit for CK2 enable
|
||||||
|
kFlexSpiMiscOffset_ParallelEnable = 2, // !< Bit for Parallel mode enable
|
||||||
|
kFlexSpiMiscOffset_WordAddressableEnable = 3, // !< Bit for Word Addressable enable
|
||||||
|
kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, // !< Bit for Safe Configuration Frequency enable
|
||||||
|
kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, // !< Bit for Pad setting override enable
|
||||||
|
kFlexSpiMiscOffset_DdrModeEnable = 6, // !< Bit for DDR clock confiuration indication.
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief Flash Type Definition
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiDeviceType_SerialNOR = 1, // !< Flash devices are Serial NOR
|
||||||
|
kFlexSpiDeviceType_SerialNAND = 2, // !< Flash devices are Serial NAND
|
||||||
|
kFlexSpiDeviceType_SerialRAM = 3, // !< Flash devices are Serial RAM/HyperFLASH
|
||||||
|
kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, // !< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND
|
||||||
|
kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, // !< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief Flash Pad Definitions
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kSerialFlash_1Pad = 1,
|
||||||
|
kSerialFlash_2Pads = 2,
|
||||||
|
kSerialFlash_4Pads = 4,
|
||||||
|
kSerialFlash_8Pads = 8,
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI LUT Sequence structure
|
||||||
|
typedef struct _lut_sequence
|
||||||
|
{
|
||||||
|
uint8_t seqNum; // !< Sequence Number, valid number: 1-16
|
||||||
|
uint8_t seqId; // !< Sequence Index, valid number: 0-15
|
||||||
|
uint16_t reserved;
|
||||||
|
} flexspi_lut_seq_t;
|
||||||
|
|
||||||
|
// !@brief Flash Configuration Command Type
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kDeviceConfigCmdType_Generic, // !< Generic command, for example: configure dummy cycles, drive strength, etc
|
||||||
|
kDeviceConfigCmdType_QuadEnable, // !< Quad Enable command
|
||||||
|
kDeviceConfigCmdType_Spi2Xpi, // !< Switch from SPI to DPI/QPI/OPI mode
|
||||||
|
kDeviceConfigCmdType_Xpi2Spi, // !< Switch from DPI/QPI/OPI to SPI mode
|
||||||
|
kDeviceConfigCmdType_Spi2NoCmd, // !< Switch to 0-4-4/0-8-8 mode
|
||||||
|
kDeviceConfigCmdType_Reset, // !< Reset device command
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI Memory Configuration Block
|
||||||
|
typedef struct _FlexSPIConfig
|
||||||
|
{
|
||||||
|
uint32_t tag; // !< [0x000-0x003] Tag, fixed value 0x42464346UL
|
||||||
|
uint32_t version; // !< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix
|
||||||
|
uint32_t reserved0; // !< [0x008-0x00b] Reserved for future use
|
||||||
|
uint8_t readSampleClkSrc; // !< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3
|
||||||
|
uint8_t csHoldTime; // !< [0x00d-0x00d] CS hold time, default value: 3
|
||||||
|
uint8_t csSetupTime; // !< [0x00e-0x00e] CS setup time, default value: 3
|
||||||
|
uint8_t columnAddressWidth; // !< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
|
||||||
|
// ! Serial NAND, need to refer to datasheet
|
||||||
|
uint8_t deviceModeCfgEnable; // !< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable
|
||||||
|
uint8_t deviceModeType; // !< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
|
||||||
|
// ! Generic configuration, etc.
|
||||||
|
uint16_t waitTimeCfgCommands; // !< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
|
||||||
|
// ! DPI/QPI/OPI switch or reset command
|
||||||
|
flexspi_lut_seq_t deviceModeSeq; // !< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
|
||||||
|
// ! sequence number, [31:16] Reserved
|
||||||
|
uint32_t deviceModeArg; // !< [0x018-0x01b] Argument/Parameter for device configuration
|
||||||
|
uint8_t configCmdEnable; // !< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable
|
||||||
|
uint8_t configModeType[3]; // !< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe
|
||||||
|
flexspi_lut_seq_t
|
||||||
|
configCmdSeqs[3]; // !< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq
|
||||||
|
uint32_t reserved1; // !< [0x02c-0x02f] Reserved for future use
|
||||||
|
uint32_t configCmdArgs[3]; // !< [0x030-0x03b] Arguments/Parameters for device Configuration commands
|
||||||
|
uint32_t reserved2; // !< [0x03c-0x03f] Reserved for future use
|
||||||
|
uint32_t controllerMiscOption; // !< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
|
||||||
|
// ! details
|
||||||
|
uint8_t deviceType; // !< [0x044-0x044] Device Type: See Flash Type Definition for more details
|
||||||
|
uint8_t sflashPadType; // !< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal
|
||||||
|
uint8_t serialClkFreq; // !< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
|
||||||
|
// ! Chapter for more details
|
||||||
|
uint8_t lutCustomSeqEnable; // !< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
|
||||||
|
// ! be done using 1 LUT sequence, currently, only applicable to HyperFLASH
|
||||||
|
uint32_t reserved3[2]; // !< [0x048-0x04f] Reserved for future use
|
||||||
|
uint32_t sflashA1Size; // !< [0x050-0x053] Size of Flash connected to A1
|
||||||
|
uint32_t sflashA2Size; // !< [0x054-0x057] Size of Flash connected to A2
|
||||||
|
uint32_t sflashB1Size; // !< [0x058-0x05b] Size of Flash connected to B1
|
||||||
|
uint32_t sflashB2Size; // !< [0x05c-0x05f] Size of Flash connected to B2
|
||||||
|
uint32_t csPadSettingOverride; // !< [0x060-0x063] CS pad setting override value
|
||||||
|
uint32_t sclkPadSettingOverride; // !< [0x064-0x067] SCK pad setting override value
|
||||||
|
uint32_t dataPadSettingOverride; // !< [0x068-0x06b] data pad setting override value
|
||||||
|
uint32_t dqsPadSettingOverride; // !< [0x06c-0x06f] DQS pad setting override value
|
||||||
|
uint32_t timeoutInMs; // !< [0x070-0x073] Timeout threshold for read status command
|
||||||
|
uint32_t commandInterval; // !< [0x074-0x077] CS deselect interval between two commands
|
||||||
|
uint16_t dataValidTime[2]; // !< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns
|
||||||
|
uint16_t busyOffset; // !< [0x07c-0x07d] Busy offset, valid value: 0-31
|
||||||
|
uint16_t busyBitPolarity; // !< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
|
||||||
|
// ! busy flag is 0 when flash device is busy
|
||||||
|
uint32_t lookupTable[64]; // !< [0x080-0x17f] Lookup table holds Flash command sequences
|
||||||
|
flexspi_lut_seq_t lutCustomSeq[12]; // !< [0x180-0x1af] Customizable LUT Sequences
|
||||||
|
uint32_t reserved4[4]; // !< [0x1b0-0x1bf] Reserved for future use
|
||||||
|
} flexspi_mem_config_t;
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL 0
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG 1
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD 2
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 4
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG 6
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD 7
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READID 8
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_ENTERQPI 10
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_EXITQPI 12
|
||||||
|
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA 0
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA 1
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS 2
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE 4
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR 6
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM 10
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP 12
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Serial NOR configuration block
|
||||||
|
*/
|
||||||
|
typedef struct _flexspi_nor_config
|
||||||
|
{
|
||||||
|
flexspi_mem_config_t memConfig; // !< Common memory configuration info via FlexSPI
|
||||||
|
uint32_t pageSize; // !< Page size of Serial NOR
|
||||||
|
uint32_t sectorSize; // !< Sector size of Serial NOR
|
||||||
|
uint8_t ipcmdSerialClkFreq; // !< Clock frequency for IP command
|
||||||
|
uint8_t isUniformBlockSize; // !< Sector/Block size is the same
|
||||||
|
uint8_t reserved0[2]; // !< Reserved for future use
|
||||||
|
uint8_t serialNorType; // !< Serial NOR Flash type: 0/1/2/3
|
||||||
|
uint8_t needExitNoCmdMode; // !< Need to exit NoCmd mode before other IP command
|
||||||
|
uint8_t halfClkForNonReadCmd; // !< Half the Serial Clock for non-read command: true/false
|
||||||
|
uint8_t needRestoreNoCmdMode; // !< Need to Restore NoCmd mode after IP commmand execution
|
||||||
|
uint32_t blockSize; // !< Block size
|
||||||
|
uint32_t reserve2[11]; // !< Reserved for future use
|
||||||
|
} flexspi_nor_config_t;
|
||||||
|
|
||||||
|
#define FLASH_BUSY_STATUS_POL 0
|
||||||
|
#define FLASH_BUSY_STATUS_OFFSET 0
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* __EVKMIMXRT1060_FLEXSPI_NOR_CONFIG__ */
|
||||||
122
ports/mimxrt/boards/MIMXRT1060_EVK/clock_config.h
Normal file
122
ports/mimxrt/boards/MIMXRT1060_EVK/clock_config.h
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018-2019 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CLOCK_CONFIG_H_
|
||||||
|
#define _CLOCK_CONFIG_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_XTAL0_CLK_HZ 24000000U /*!< Board xtal0 frequency in Hz */
|
||||||
|
|
||||||
|
#define BOARD_XTAL32K_CLK_HZ 32768U /*!< Board xtal32k frequency in Hz */
|
||||||
|
/*******************************************************************************
|
||||||
|
************************ BOARD_InitBootClocks function ************************
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes default configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_InitBootClocks(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
********************** Configuration BOARD_BootClockRUN ***********************
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions for BOARD_BootClockRUN configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CORE_CLOCK 600000000U /*!< Core clock frequency: 600000000Hz */
|
||||||
|
|
||||||
|
/* Clock outputs (values are in Hz): */
|
||||||
|
#define BOARD_BOOTCLOCKRUN_AHB_CLK_ROOT 600000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CAN_CLK_ROOT 40000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT 32768UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLKO1_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLKO2_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLK_1M 1000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLK_24M 24000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CSI_CLK_ROOT 12000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET1_TX_CLK 2400000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET2_125M_CLK 1200000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET2_TX_CLK 1200000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET_125M_CLK 2400000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET_25M_REF_CLK 1200000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXIO2_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXSPI2_CLK_ROOT 130909090UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT 130909090UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT 150000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LCDIF_CLK_ROOT 9642857UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT 60000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT 105600000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LVDS1_CLK 1200000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_MQS_MCLK 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_PLL7_MAIN_CLK 24000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK2 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SEMC_CLK_ROOT 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT 117333333UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT 80000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USBPHY1_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USBPHY2_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USDHC1_CLK_ROOT 198000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USDHC2_CLK_ROOT 198000000UL
|
||||||
|
|
||||||
|
/*! @brief Arm PLL set for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN;
|
||||||
|
/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;
|
||||||
|
/*! @brief Sys PLL for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API for BOARD_BootClockRUN configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_BootClockRUN(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
#endif /* _CLOCK_CONFIG_H_ */
|
||||||
@@ -1,264 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __EVKMIMXRT1060_FLEXSPI_NOR_CONFIG__
|
|
||||||
#define __EVKMIMXRT1060_FLEXSPI_NOR_CONFIG__
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include "fsl_flexspi.h"
|
|
||||||
|
|
||||||
/*! @name Driver version */
|
|
||||||
/*@{*/
|
|
||||||
/*! @brief XIP_BOARD driver version 2.0.0. */
|
|
||||||
#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
|
|
||||||
/*@}*/
|
|
||||||
|
|
||||||
/* FLEXSPI memory config block related defintions */
|
|
||||||
#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian
|
|
||||||
#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0
|
|
||||||
#define FLEXSPI_CFG_BLK_SIZE (512)
|
|
||||||
|
|
||||||
/* FLEXSPI Feature related definitions */
|
|
||||||
#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
|
|
||||||
|
|
||||||
/* Lookup table related defintions */
|
|
||||||
#define CMD_INDEX_READ 0
|
|
||||||
#define CMD_INDEX_READSTATUS 1
|
|
||||||
#define CMD_INDEX_WRITEENABLE 2
|
|
||||||
#define CMD_INDEX_WRITE 4
|
|
||||||
|
|
||||||
#define CMD_LUT_SEQ_IDX_READ 0
|
|
||||||
#define CMD_LUT_SEQ_IDX_READSTATUS 1
|
|
||||||
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
|
||||||
#define CMD_LUT_SEQ_IDX_WRITE 9
|
|
||||||
|
|
||||||
#define CMD_SDR 0x01
|
|
||||||
#define CMD_DDR 0x21
|
|
||||||
#define RADDR_SDR 0x02
|
|
||||||
#define RADDR_DDR 0x22
|
|
||||||
#define CADDR_SDR 0x03
|
|
||||||
#define CADDR_DDR 0x23
|
|
||||||
#define MODE1_SDR 0x04
|
|
||||||
#define MODE1_DDR 0x24
|
|
||||||
#define MODE2_SDR 0x05
|
|
||||||
#define MODE2_DDR 0x25
|
|
||||||
#define MODE4_SDR 0x06
|
|
||||||
#define MODE4_DDR 0x26
|
|
||||||
#define MODE8_SDR 0x07
|
|
||||||
#define MODE8_DDR 0x27
|
|
||||||
#define WRITE_SDR 0x08
|
|
||||||
#define WRITE_DDR 0x28
|
|
||||||
#define READ_SDR 0x09
|
|
||||||
#define READ_DDR 0x29
|
|
||||||
#define LEARN_SDR 0x0A
|
|
||||||
#define LEARN_DDR 0x2A
|
|
||||||
#define DATSZ_SDR 0x0B
|
|
||||||
#define DATSZ_DDR 0x2B
|
|
||||||
#define DUMMY_SDR 0x0C
|
|
||||||
#define DUMMY_DDR 0x2C
|
|
||||||
#define DUMMY_RWDS_SDR 0x0D
|
|
||||||
#define DUMMY_RWDS_DDR 0x2D
|
|
||||||
#define JMP_ON_CS 0x1F
|
|
||||||
#define STOP 0
|
|
||||||
|
|
||||||
#define FLEXSPI_1PAD 0
|
|
||||||
#define FLEXSPI_2PAD 1
|
|
||||||
#define FLEXSPI_4PAD 2
|
|
||||||
#define FLEXSPI_8PAD 3
|
|
||||||
|
|
||||||
#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
|
|
||||||
(FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
|
|
||||||
FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
|
||||||
|
|
||||||
//!@brief Definitions for FlexSPI Serial Clock Frequency
|
|
||||||
typedef enum _FlexSpiSerialClockFreq
|
|
||||||
{
|
|
||||||
kFlexSpiSerialClk_30MHz = 1,
|
|
||||||
kFlexSpiSerialClk_50MHz = 2,
|
|
||||||
kFlexSpiSerialClk_60MHz = 3,
|
|
||||||
kFlexSpiSerialClk_75MHz = 4,
|
|
||||||
kFlexSpiSerialClk_80MHz = 5,
|
|
||||||
kFlexSpiSerialClk_100MHz = 6,
|
|
||||||
kFlexSpiSerialClk_120MHz = 7,
|
|
||||||
kFlexSpiSerialClk_133MHz = 8,
|
|
||||||
kFlexSpiSerialClk_166MHz = 9,
|
|
||||||
} flexspi_serial_clk_freq_t;
|
|
||||||
|
|
||||||
//!@brief FlexSPI clock configuration type
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiClk_SDR, //!< Clock configure for SDR mode
|
|
||||||
kFlexSpiClk_DDR, //!< Clock configurat for DDR mode
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI Read Sample Clock Source definition
|
|
||||||
typedef enum _FlashReadSampleClkSource
|
|
||||||
{
|
|
||||||
kFlexSPIReadSampleClk_LoopbackInternally = 0,
|
|
||||||
kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
|
|
||||||
kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
|
|
||||||
kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
|
|
||||||
} flexspi_read_sample_clk_t;
|
|
||||||
|
|
||||||
//!@brief Misc feature bit definitions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiMiscOffset_DiffClkEnable = 0, //!< Bit for Differential clock enable
|
|
||||||
kFlexSpiMiscOffset_Ck2Enable = 1, //!< Bit for CK2 enable
|
|
||||||
kFlexSpiMiscOffset_ParallelEnable = 2, //!< Bit for Parallel mode enable
|
|
||||||
kFlexSpiMiscOffset_WordAddressableEnable = 3, //!< Bit for Word Addressable enable
|
|
||||||
kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, //!< Bit for Safe Configuration Frequency enable
|
|
||||||
kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable
|
|
||||||
kFlexSpiMiscOffset_DdrModeEnable = 6, //!< Bit for DDR clock confiuration indication.
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief Flash Type Definition
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiDeviceType_SerialNOR = 1, //!< Flash devices are Serial NOR
|
|
||||||
kFlexSpiDeviceType_SerialNAND = 2, //!< Flash devices are Serial NAND
|
|
||||||
kFlexSpiDeviceType_SerialRAM = 3, //!< Flash devices are Serial RAM/HyperFLASH
|
|
||||||
kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND
|
|
||||||
kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, //!< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief Flash Pad Definitions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kSerialFlash_1Pad = 1,
|
|
||||||
kSerialFlash_2Pads = 2,
|
|
||||||
kSerialFlash_4Pads = 4,
|
|
||||||
kSerialFlash_8Pads = 8,
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI LUT Sequence structure
|
|
||||||
typedef struct _lut_sequence
|
|
||||||
{
|
|
||||||
uint8_t seqNum; //!< Sequence Number, valid number: 1-16
|
|
||||||
uint8_t seqId; //!< Sequence Index, valid number: 0-15
|
|
||||||
uint16_t reserved;
|
|
||||||
} flexspi_lut_seq_t;
|
|
||||||
|
|
||||||
//!@brief Flash Configuration Command Type
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kDeviceConfigCmdType_Generic, //!< Generic command, for example: configure dummy cycles, drive strength, etc
|
|
||||||
kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command
|
|
||||||
kDeviceConfigCmdType_Spi2Xpi, //!< Switch from SPI to DPI/QPI/OPI mode
|
|
||||||
kDeviceConfigCmdType_Xpi2Spi, //!< Switch from DPI/QPI/OPI to SPI mode
|
|
||||||
kDeviceConfigCmdType_Spi2NoCmd, //!< Switch to 0-4-4/0-8-8 mode
|
|
||||||
kDeviceConfigCmdType_Reset, //!< Reset device command
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI Memory Configuration Block
|
|
||||||
typedef struct _FlexSPIConfig
|
|
||||||
{
|
|
||||||
uint32_t tag; //!< [0x000-0x003] Tag, fixed value 0x42464346UL
|
|
||||||
uint32_t version; //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix
|
|
||||||
uint32_t reserved0; //!< [0x008-0x00b] Reserved for future use
|
|
||||||
uint8_t readSampleClkSrc; //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3
|
|
||||||
uint8_t csHoldTime; //!< [0x00d-0x00d] CS hold time, default value: 3
|
|
||||||
uint8_t csSetupTime; //!< [0x00e-0x00e] CS setup time, default value: 3
|
|
||||||
uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
|
|
||||||
//! Serial NAND, need to refer to datasheet
|
|
||||||
uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable
|
|
||||||
uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
|
|
||||||
//! Generic configuration, etc.
|
|
||||||
uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
|
|
||||||
//! DPI/QPI/OPI switch or reset command
|
|
||||||
flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
|
|
||||||
//! sequence number, [31:16] Reserved
|
|
||||||
uint32_t deviceModeArg; //!< [0x018-0x01b] Argument/Parameter for device configuration
|
|
||||||
uint8_t configCmdEnable; //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable
|
|
||||||
uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe
|
|
||||||
flexspi_lut_seq_t
|
|
||||||
configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq
|
|
||||||
uint32_t reserved1; //!< [0x02c-0x02f] Reserved for future use
|
|
||||||
uint32_t configCmdArgs[3]; //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands
|
|
||||||
uint32_t reserved2; //!< [0x03c-0x03f] Reserved for future use
|
|
||||||
uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
|
|
||||||
//! details
|
|
||||||
uint8_t deviceType; //!< [0x044-0x044] Device Type: See Flash Type Definition for more details
|
|
||||||
uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal
|
|
||||||
uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
|
|
||||||
//! Chapter for more details
|
|
||||||
uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
|
|
||||||
//! be done using 1 LUT sequence, currently, only applicable to HyperFLASH
|
|
||||||
uint32_t reserved3[2]; //!< [0x048-0x04f] Reserved for future use
|
|
||||||
uint32_t sflashA1Size; //!< [0x050-0x053] Size of Flash connected to A1
|
|
||||||
uint32_t sflashA2Size; //!< [0x054-0x057] Size of Flash connected to A2
|
|
||||||
uint32_t sflashB1Size; //!< [0x058-0x05b] Size of Flash connected to B1
|
|
||||||
uint32_t sflashB2Size; //!< [0x05c-0x05f] Size of Flash connected to B2
|
|
||||||
uint32_t csPadSettingOverride; //!< [0x060-0x063] CS pad setting override value
|
|
||||||
uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value
|
|
||||||
uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value
|
|
||||||
uint32_t dqsPadSettingOverride; //!< [0x06c-0x06f] DQS pad setting override value
|
|
||||||
uint32_t timeoutInMs; //!< [0x070-0x073] Timeout threshold for read status command
|
|
||||||
uint32_t commandInterval; //!< [0x074-0x077] CS deselect interval between two commands
|
|
||||||
uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns
|
|
||||||
uint16_t busyOffset; //!< [0x07c-0x07d] Busy offset, valid value: 0-31
|
|
||||||
uint16_t busyBitPolarity; //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
|
|
||||||
//! busy flag is 0 when flash device is busy
|
|
||||||
uint32_t lookupTable[64]; //!< [0x080-0x17f] Lookup table holds Flash command sequences
|
|
||||||
flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences
|
|
||||||
uint32_t reserved4[4]; //!< [0x1b0-0x1bf] Reserved for future use
|
|
||||||
} flexspi_mem_config_t;
|
|
||||||
|
|
||||||
/* */
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL 0
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG 1
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD 2
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 4
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG 6
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD 7
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READID 8
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_ENTERQPI 10
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_EXITQPI 12
|
|
||||||
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA 0
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA 1
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS 2
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE 4
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR 6
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM 10
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP 12
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Serial NOR configuration block
|
|
||||||
*/
|
|
||||||
typedef struct _flexspi_nor_config
|
|
||||||
{
|
|
||||||
flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI
|
|
||||||
uint32_t pageSize; //!< Page size of Serial NOR
|
|
||||||
uint32_t sectorSize; //!< Sector size of Serial NOR
|
|
||||||
uint8_t ipcmdSerialClkFreq; //!< Clock frequency for IP command
|
|
||||||
uint8_t isUniformBlockSize; //!< Sector/Block size is the same
|
|
||||||
uint8_t reserved0[2]; //!< Reserved for future use
|
|
||||||
uint8_t serialNorType; //!< Serial NOR Flash type: 0/1/2/3
|
|
||||||
uint8_t needExitNoCmdMode; //!< Need to exit NoCmd mode before other IP command
|
|
||||||
uint8_t halfClkForNonReadCmd; //!< Half the Serial Clock for non-read command: true/false
|
|
||||||
uint8_t needRestoreNoCmdMode; //!< Need to Restore NoCmd mode after IP commmand execution
|
|
||||||
uint32_t blockSize; //!< Block size
|
|
||||||
uint32_t reserve2[11]; //!< Reserved for future use
|
|
||||||
} flexspi_nor_config_t;
|
|
||||||
|
|
||||||
#define FLASH_BUSY_STATUS_POL 0
|
|
||||||
#define FLASH_BUSY_STATUS_OFFSET 0
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* __EVKMIMXRT1060_FLEXSPI_NOR_CONFIG__ */
|
|
||||||
@@ -1,186 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "evkmimxrt1060_flexspi_nor_config.h"
|
|
||||||
|
|
||||||
/* Component ID definition, used by tools. */
|
|
||||||
#ifndef FSL_COMPONENT_ID
|
|
||||||
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Code
|
|
||||||
******************************************************************************/
|
|
||||||
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
|
||||||
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
|
|
||||||
__attribute__((section(".boot_hdr.conf")))
|
|
||||||
#elif defined(__ICCARM__)
|
|
||||||
#pragma location = ".boot_hdr.conf"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const flexspi_nor_config_t qspiflash_config = {
|
|
||||||
.memConfig =
|
|
||||||
{
|
|
||||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
|
||||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
|
||||||
.readSampleClkSrc = kFlexSPIReadSampleClk_ExternalInputFromDqsPad,
|
|
||||||
.csHoldTime = 3u,
|
|
||||||
.csSetupTime = 3u,
|
|
||||||
.columnAddressWidth = 3u,
|
|
||||||
// Enable DDR mode, Wordaddressable, Safe configuration, Differential clock
|
|
||||||
.controllerMiscOption =
|
|
||||||
(1u << kFlexSpiMiscOffset_DdrModeEnable) | (1u << kFlexSpiMiscOffset_WordAddressableEnable) |
|
|
||||||
(1u << kFlexSpiMiscOffset_SafeConfigFreqEnable) | (1u << kFlexSpiMiscOffset_DiffClkEnable),
|
|
||||||
.sflashPadType = kSerialFlash_8Pads,
|
|
||||||
.serialClkFreq = kFlexSpiSerialClk_133MHz,
|
|
||||||
.sflashA1Size = 64u * 1024u * 1024u,
|
|
||||||
.dataValidTime = {16u, 16u},
|
|
||||||
.lookupTable =
|
|
||||||
{
|
|
||||||
/* 0 Read Data */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04),
|
|
||||||
|
|
||||||
/* 1 Write Data */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_WRITE_DDR, kFLEXSPI_8PAD, 0x02),
|
|
||||||
|
|
||||||
/* 2 Read Status */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 2] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 3] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x70), // DATA 0x70
|
|
||||||
// +1
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 4] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 5] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DUMMY_RWDS_DDR, kFLEXSPI_8PAD, 0x0B),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 6] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0),
|
|
||||||
|
|
||||||
/* 4 Write Enable */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 2] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 3] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // DATA 0xAA
|
|
||||||
// +1
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 4] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 5] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 6] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 7] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
|
|
||||||
/* 6 Erase Sector */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 2] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 3] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x80), // DATA 0x80
|
|
||||||
// +1
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 4] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 5] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 6] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 7] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
|
||||||
// +2
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 8] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 9] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 10] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 11] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
// +3
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 12] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 13] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 14] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x30, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),
|
|
||||||
|
|
||||||
/* 10 program page with word program command sequence */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 2] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 3] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0), // DATA 0xA0
|
|
||||||
// +1
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 4] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 5] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_WRITE_DDR, kFLEXSPI_8PAD, 0x80),
|
|
||||||
|
|
||||||
/* 12 Erase chip */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 1] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 2] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 3] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x80),
|
|
||||||
// +1
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 4] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 5] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 6] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 7] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
|
||||||
// +2
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 8] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 9] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 10] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 11] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
// +3
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 12] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 13] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 14] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 15] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x10),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.pageSize = 512u,
|
|
||||||
.sectorSize = 256u * 1024u,
|
|
||||||
.blockSize = 256u * 1024u,
|
|
||||||
.isUniformBlockSize = true,
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* XIP_BOOT_HEADER_ENABLE */
|
|
||||||
@@ -1,14 +1,10 @@
|
|||||||
#define MICROPY_HW_BOARD_NAME "i.MX RT1060 EVK"
|
#define MICROPY_HW_BOARD_NAME "i.MX RT1060 EVK"
|
||||||
#define MICROPY_HW_MCU_NAME "MIMXRT1062DVJ6A"
|
#define MICROPY_HW_MCU_NAME "MIMXRT1062DVJ6A"
|
||||||
|
|
||||||
#define BOARD_FLASH_SIZE (8 * 1024 * 1024)
|
|
||||||
|
|
||||||
// MIMXRT1060_EVK has 1 user LED
|
// MIMXRT1060_EVK has 1 user LED
|
||||||
#define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_09)
|
#define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_09)
|
||||||
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin))
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin))
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin))
|
||||||
#define BOARD_FLASH_CONFIG_HEADER_H "evkmimxrt1060_flexspi_nor_config.h"
|
|
||||||
#define BOARD_FLASH_OPS_HEADER_H "hal/flexspi_hyper_flash.h"
|
|
||||||
|
|
||||||
#define MICROPY_HW_NUM_PIN_IRQS (4 * 32 + 3)
|
#define MICROPY_HW_NUM_PIN_IRQS (4 * 32 + 3)
|
||||||
|
|
||||||
@@ -38,10 +34,10 @@
|
|||||||
{ IOMUXC_GPIO_SD_B0_02_LPSPI1_SDO }, { IOMUXC_GPIO_SD_B0_03_LPSPI1_SDI },
|
{ IOMUXC_GPIO_SD_B0_02_LPSPI1_SDO }, { IOMUXC_GPIO_SD_B0_03_LPSPI1_SDI },
|
||||||
|
|
||||||
#define DMA_REQ_SRC_RX { 0, kDmaRequestMuxLPSPI1Rx, kDmaRequestMuxLPSPI2Rx, \
|
#define DMA_REQ_SRC_RX { 0, kDmaRequestMuxLPSPI1Rx, kDmaRequestMuxLPSPI2Rx, \
|
||||||
kDmaRequestMuxLPSPI3Rx, kDmaRequestMuxLPSPI4Rx }
|
kDmaRequestMuxLPSPI3Rx, kDmaRequestMuxLPSPI4Rx }
|
||||||
|
|
||||||
#define DMA_REQ_SRC_TX { 0, kDmaRequestMuxLPSPI1Tx, kDmaRequestMuxLPSPI2Tx, \
|
#define DMA_REQ_SRC_TX { 0, kDmaRequestMuxLPSPI1Tx, kDmaRequestMuxLPSPI2Tx, \
|
||||||
kDmaRequestMuxLPSPI3Tx, kDmaRequestMuxLPSPI4Tx }
|
kDmaRequestMuxLPSPI3Tx, kDmaRequestMuxLPSPI4Tx }
|
||||||
|
|
||||||
// Define the mapping hardware I2C # to logical I2C #
|
// Define the mapping hardware I2C # to logical I2C #
|
||||||
// SDA/SCL HW-I2C Logical I2C
|
// SDA/SCL HW-I2C Logical I2C
|
||||||
@@ -60,9 +56,9 @@
|
|||||||
{ \
|
{ \
|
||||||
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
|
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
|
||||||
.clk = { GPIO_SD_B0_01_USDHC1_CLK }, \
|
.clk = { GPIO_SD_B0_01_USDHC1_CLK }, \
|
||||||
.cd_b = { GPIO_B1_12_USDHC1_CD_B },\
|
.cd_b = { GPIO_B1_12_USDHC1_CD_B }, \
|
||||||
.data0 = { GPIO_SD_B0_02_USDHC1_DATA0 },\
|
.data0 = { GPIO_SD_B0_02_USDHC1_DATA0 }, \
|
||||||
.data1 = { GPIO_SD_B0_03_USDHC1_DATA1 },\
|
.data1 = { GPIO_SD_B0_03_USDHC1_DATA1 }, \
|
||||||
.data2 = { GPIO_SD_B0_04_USDHC1_DATA2 },\
|
.data2 = { GPIO_SD_B0_04_USDHC1_DATA2 }, \
|
||||||
.data3 = { GPIO_SD_B0_05_USDHC1_DATA3 },\
|
.data3 = { GPIO_SD_B0_05_USDHC1_DATA3 }, \
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,20 +3,18 @@ MCU_VARIANT = MIMXRT1062DVJ6A
|
|||||||
|
|
||||||
MICROPY_FLOAT_IMPL = double
|
MICROPY_FLOAT_IMPL = double
|
||||||
MICROPY_PY_MACHINE_SDCARD = 1
|
MICROPY_PY_MACHINE_SDCARD = 1
|
||||||
|
BOARD_FLASH_TYPE ?= qspi_nor
|
||||||
|
BOARD_FLASH_SIZE ?= 0x800000 # 8MB
|
||||||
|
|
||||||
JLINK_PATH ?= /media/RT1060-EVK/
|
JLINK_PATH ?= /media/RT1060-EVK/
|
||||||
JLINK_COMMANDER_SCRIPT = $(BUILD)/script.jlink
|
JLINK_COMMANDER_SCRIPT = $(BUILD)/script.jlink
|
||||||
|
|
||||||
|
|
||||||
ifdef JLINK_IP
|
ifdef JLINK_IP
|
||||||
JLINK_CONNECTION_SETTINGS = -IP $(JLINK_IP)
|
JLINK_CONNECTION_SETTINGS = -IP $(JLINK_IP)
|
||||||
else
|
else
|
||||||
JLINK_CONNECTION_SETTINGS = -USB
|
JLINK_CONNECTION_SETTINGS = -USB
|
||||||
endif
|
endif
|
||||||
|
|
||||||
SRC_C += \
|
|
||||||
hal/flexspi_hyper_flash.c
|
|
||||||
|
|
||||||
deploy_jlink: $(BUILD)/firmware.hex
|
deploy_jlink: $(BUILD)/firmware.hex
|
||||||
$(Q)$(TOUCH) $(JLINK_COMMANDER_SCRIPT)
|
$(Q)$(TOUCH) $(JLINK_COMMANDER_SCRIPT)
|
||||||
$(ECHO) "ExitOnError 1" > $(JLINK_COMMANDER_SCRIPT)
|
$(ECHO) "ExitOnError 1" > $(JLINK_COMMANDER_SCRIPT)
|
||||||
|
|||||||
186
ports/mimxrt/boards/MIMXRT1060_EVK/qspi_hyper_flash_config.c
Normal file
186
ports/mimxrt/boards/MIMXRT1060_EVK/qspi_hyper_flash_config.c
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include BOARD_FLASH_CONFIG_HEADER_H
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
||||||
|
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
|
||||||
|
__attribute__((section(".boot_hdr.conf")))
|
||||||
|
#elif defined(__ICCARM__)
|
||||||
|
#pragma location = ".boot_hdr.conf"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const flexspi_nor_config_t qspiflash_config = {
|
||||||
|
.memConfig =
|
||||||
|
{
|
||||||
|
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||||
|
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||||
|
.readSampleClkSrc = kFlexSPIReadSampleClk_ExternalInputFromDqsPad,
|
||||||
|
.csHoldTime = 3u,
|
||||||
|
.csSetupTime = 3u,
|
||||||
|
.columnAddressWidth = 3u,
|
||||||
|
// Enable DDR mode, Wordaddressable, Safe configuration, Differential clock
|
||||||
|
.controllerMiscOption =
|
||||||
|
(1u << kFlexSpiMiscOffset_DdrModeEnable) | (1u << kFlexSpiMiscOffset_WordAddressableEnable) |
|
||||||
|
(1u << kFlexSpiMiscOffset_SafeConfigFreqEnable) | (1u << kFlexSpiMiscOffset_DiffClkEnable),
|
||||||
|
.sflashPadType = kSerialFlash_8Pads,
|
||||||
|
.serialClkFreq = kFlexSpiSerialClk_133MHz,
|
||||||
|
.sflashA1Size = BOARD_FLASH_SIZE,
|
||||||
|
.dataValidTime = {16u, 16u},
|
||||||
|
.lookupTable =
|
||||||
|
{
|
||||||
|
/* 0 Read Data */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04),
|
||||||
|
|
||||||
|
/* 1 Write Data */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_WRITE_DDR, kFLEXSPI_8PAD, 0x02),
|
||||||
|
|
||||||
|
/* 2 Read Status */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 2] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 3] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x70), // DATA 0x70
|
||||||
|
// +1
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 4] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 5] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DUMMY_RWDS_DDR, kFLEXSPI_8PAD, 0x0B),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 6] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0),
|
||||||
|
|
||||||
|
/* 4 Write Enable */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 2] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 3] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // DATA 0xAA
|
||||||
|
// +1
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 4] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 5] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 6] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 7] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
|
||||||
|
/* 6 Erase Sector */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 2] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 3] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x80), // DATA 0x80
|
||||||
|
// +1
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 4] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 5] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 6] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 7] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
||||||
|
// +2
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 8] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 9] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 10] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 11] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
// +3
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 12] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 13] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 14] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x30, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),
|
||||||
|
|
||||||
|
/* 10 program page with word program command sequence */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 2] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 3] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0), // DATA 0xA0
|
||||||
|
// +1
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 4] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 5] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_WRITE_DDR, kFLEXSPI_8PAD, 0x80),
|
||||||
|
|
||||||
|
/* 12 Erase chip */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 1] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 2] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 3] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x80),
|
||||||
|
// +1
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 4] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 5] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 6] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 7] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
||||||
|
// +2
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 8] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 9] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 10] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 11] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
// +3
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 12] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 13] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 14] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 15] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x10),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.pageSize = 512u,
|
||||||
|
.sectorSize = 256u * 1024u,
|
||||||
|
.blockSize = 256u * 1024u,
|
||||||
|
.isUniformBlockSize = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* XIP_BOOT_HEADER_ENABLE */
|
||||||
129
ports/mimxrt/boards/MIMXRT1060_EVK/qspi_nor_flash_config.c
Normal file
129
ports/mimxrt/boards/MIMXRT1060_EVK/qspi_nor_flash_config.c
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include BOARD_FLASH_CONFIG_HEADER_H
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
||||||
|
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
|
||||||
|
__attribute__((section(".boot_hdr.conf")))
|
||||||
|
#elif defined(__ICCARM__)
|
||||||
|
#pragma location = ".boot_hdr.conf"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const flexspi_nor_config_t qspiflash_config = {
|
||||||
|
.memConfig =
|
||||||
|
{
|
||||||
|
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||||
|
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||||
|
.readSampleClkSrc = kFlexSPIReadSampleClk_ExternalInputFromDqsPad,
|
||||||
|
.csHoldTime = 3u,
|
||||||
|
.csSetupTime = 3u,
|
||||||
|
.columnAddressWidth = 3u,
|
||||||
|
// Enable DDR mode, Wordaddassable, Safe configuration, Differential clock
|
||||||
|
.controllerMiscOption =
|
||||||
|
(1u << kFlexSpiMiscOffset_DdrModeEnable) | (1u << kFlexSpiMiscOffset_WordAddressableEnable) |
|
||||||
|
(1u << kFlexSpiMiscOffset_SafeConfigFreqEnable) | (1u << kFlexSpiMiscOffset_DiffClkEnable),
|
||||||
|
.sflashPadType = kSerialFlash_8Pads,
|
||||||
|
.serialClkFreq = kFlexSpiSerialClk_133MHz,
|
||||||
|
.sflashA1Size = BOARD_FLASH_SIZE,
|
||||||
|
.dataValidTime = {16u, 16u},
|
||||||
|
.lookupTable =
|
||||||
|
{
|
||||||
|
// 0 Read LUTs 0 -> 0
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 1 Read status register -> 1
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x01),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 2 Fast read quad mode - SDR
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x6B, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x08, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 3 Write Enable -> 3
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 4 Read extend parameters
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x81, READ_SDR, FLEXSPI_1PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 5 Erase Sector -> 5
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 6 Write Status Reg
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01, WRITE_SDR, FLEXSPI_1PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 7 Page Program - quad mode (-> 9)
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 8 Read ID
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x90, DUMMY_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_1PAD, 0x00, 0, 0, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 9 Page Program - single mode -> 9
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0, 0, 0, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 10 Enter QPI mode
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x35, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 11 Erase Chip
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 12 Exit QPI mode
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_4PAD, 0xF5, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.pageSize = 512u,
|
||||||
|
.sectorSize = 256u * 1024u,
|
||||||
|
.blockSize = 256u * 1024u,
|
||||||
|
.isUniformBlockSize = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* XIP_BOOT_HEADER_ENABLE */
|
||||||
@@ -1,14 +1,25 @@
|
|||||||
/* Memory configuration */
|
/* Memory configuration */
|
||||||
|
#if BOARD_FLASH_RESERVED
|
||||||
|
reserved_size = BOARD_FLASH_RESERVED;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if BOARD_FLASH_TYPE==qspi_nor
|
||||||
flash_start = 0x60000000;
|
flash_start = 0x60000000;
|
||||||
|
#elif BOARD_FLASH_TYPE==hyperflash
|
||||||
|
flash_start = 0x60000000;
|
||||||
|
#else
|
||||||
|
#error Unknown BOARD_FLASH_TYPE
|
||||||
|
#endif
|
||||||
|
flash_size = BOARD_FLASH_SIZE;
|
||||||
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));
|
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));
|
||||||
flash_config_start = flash_start;
|
flash_config_start = flash_start;
|
||||||
flash_config_size = 0x00001000;
|
flash_config_size = 0x00001000;
|
||||||
ivt_start = 0x60001000;
|
ivt_start = flash_start + 0x00001000;
|
||||||
ivt_size = 0x00001000;
|
ivt_size = 0x00001000;
|
||||||
interrupts_start = 0x60002000;
|
interrupts_start = flash_start + 0x00002000;
|
||||||
interrupts_size = 0x00000400;
|
interrupts_size = 0x00000400;
|
||||||
text_start = 0x60002400;
|
text_start = flash_start + 0x00002400;
|
||||||
vfs_start = 0x60100000;
|
vfs_start = flash_start + 0x00100000;
|
||||||
text_size = ((vfs_start) - (text_start));
|
text_size = ((vfs_start) - (text_start));
|
||||||
vfs_size = ((flash_end) - (vfs_start));
|
vfs_size = ((flash_end) - (vfs_start));
|
||||||
itcm_start = 0x00000000;
|
itcm_start = 0x00000000;
|
||||||
|
|||||||
@@ -1,14 +1,27 @@
|
|||||||
/* Memory configuration */
|
/* Memory configuration */
|
||||||
|
#if BOARD_FLASH_RESERVED
|
||||||
|
reserved_size = BOARD_FLASH_RESERVED;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if BOARD_FLASH_TYPE==qspi_nor
|
||||||
flash_start = 0x60000000;
|
flash_start = 0x60000000;
|
||||||
|
#elif BOARD_FLASH_TYPE==hyperflash
|
||||||
|
flash_start = 0x60000000;
|
||||||
|
#elif BOARD_FLASH_TYPE==internal
|
||||||
|
flash_start = 0x70000000;
|
||||||
|
#else
|
||||||
|
#error Unknown BOARD_FLASH_TYPE
|
||||||
|
#endif
|
||||||
|
flash_size = BOARD_FLASH_SIZE;
|
||||||
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));
|
flash_end = DEFINED(reserved_size) ? ((flash_start) + (flash_size - reserved_size)) : ((flash_start) + (flash_size));
|
||||||
flash_config_start = flash_start;
|
flash_config_start = flash_start;
|
||||||
flash_config_size = 0x00001000;
|
flash_config_size = 0x00001000;
|
||||||
ivt_start = 0x60001000;
|
ivt_start = flash_start + 0x00001000;
|
||||||
ivt_size = 0x00001000;
|
ivt_size = 0x00001000;
|
||||||
interrupts_start = 0x60002000;
|
interrupts_start = flash_start + 0x00002000;
|
||||||
interrupts_size = 0x00000400;
|
interrupts_size = 0x00000400;
|
||||||
text_start = 0x60002400;
|
text_start = flash_start + 0x00002400;
|
||||||
vfs_start = 0x60100000;
|
vfs_start = flash_start + 0x00100000;
|
||||||
text_size = ((vfs_start) - (text_start));
|
text_size = ((vfs_start) - (text_start));
|
||||||
vfs_size = ((flash_end) - (vfs_start));
|
vfs_size = ((flash_end) - (vfs_start));
|
||||||
itcm_start = 0x00000000;
|
itcm_start = 0x00000000;
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
flash_size = 64M;
|
|
||||||
@@ -0,0 +1,264 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EVKMIMXRT1064_FLEXSPI_NOR_CONFIG__
|
||||||
|
#define __EVKMIMXRT1064_FLEXSPI_NOR_CONFIG__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "fsl_flexspi.h"
|
||||||
|
|
||||||
|
/*! @name Driver version */
|
||||||
|
/*@{*/
|
||||||
|
/*! @brief XIP_BOARD driver version 2.0.0. */
|
||||||
|
#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/* FLEXSPI memory config block related defintions */
|
||||||
|
#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian
|
||||||
|
#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0
|
||||||
|
#define FLEXSPI_CFG_BLK_SIZE (512)
|
||||||
|
|
||||||
|
/* FLEXSPI Feature related definitions */
|
||||||
|
#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
|
||||||
|
|
||||||
|
/* Lookup table related defintions */
|
||||||
|
#define CMD_INDEX_READ 0
|
||||||
|
#define CMD_INDEX_READSTATUS 1
|
||||||
|
#define CMD_INDEX_WRITEENABLE 2
|
||||||
|
#define CMD_INDEX_WRITE 4
|
||||||
|
|
||||||
|
#define CMD_LUT_SEQ_IDX_READ 0
|
||||||
|
#define CMD_LUT_SEQ_IDX_READSTATUS 1
|
||||||
|
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
||||||
|
#define CMD_LUT_SEQ_IDX_WRITE 9
|
||||||
|
|
||||||
|
#define CMD_SDR 0x01
|
||||||
|
#define CMD_DDR 0x21
|
||||||
|
#define RADDR_SDR 0x02
|
||||||
|
#define RADDR_DDR 0x22
|
||||||
|
#define CADDR_SDR 0x03
|
||||||
|
#define CADDR_DDR 0x23
|
||||||
|
#define MODE1_SDR 0x04
|
||||||
|
#define MODE1_DDR 0x24
|
||||||
|
#define MODE2_SDR 0x05
|
||||||
|
#define MODE2_DDR 0x25
|
||||||
|
#define MODE4_SDR 0x06
|
||||||
|
#define MODE4_DDR 0x26
|
||||||
|
#define MODE8_SDR 0x07
|
||||||
|
#define MODE8_DDR 0x27
|
||||||
|
#define WRITE_SDR 0x08
|
||||||
|
#define WRITE_DDR 0x28
|
||||||
|
#define READ_SDR 0x09
|
||||||
|
#define READ_DDR 0x29
|
||||||
|
#define LEARN_SDR 0x0A
|
||||||
|
#define LEARN_DDR 0x2A
|
||||||
|
#define DATSZ_SDR 0x0B
|
||||||
|
#define DATSZ_DDR 0x2B
|
||||||
|
#define DUMMY_SDR 0x0C
|
||||||
|
#define DUMMY_DDR 0x2C
|
||||||
|
#define DUMMY_RWDS_SDR 0x0D
|
||||||
|
#define DUMMY_RWDS_DDR 0x2D
|
||||||
|
#define JMP_ON_CS 0x1F
|
||||||
|
#define STOP 0
|
||||||
|
|
||||||
|
#define FLEXSPI_1PAD 0
|
||||||
|
#define FLEXSPI_2PAD 1
|
||||||
|
#define FLEXSPI_4PAD 2
|
||||||
|
#define FLEXSPI_8PAD 3
|
||||||
|
|
||||||
|
#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
|
||||||
|
(FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
|
||||||
|
FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
||||||
|
|
||||||
|
// !@brief Definitions for FlexSPI Serial Clock Frequency
|
||||||
|
typedef enum _FlexSpiSerialClockFreq
|
||||||
|
{
|
||||||
|
kFlexSpiSerialClk_30MHz = 1,
|
||||||
|
kFlexSpiSerialClk_50MHz = 2,
|
||||||
|
kFlexSpiSerialClk_60MHz = 3,
|
||||||
|
kFlexSpiSerialClk_75MHz = 4,
|
||||||
|
kFlexSpiSerialClk_80MHz = 5,
|
||||||
|
kFlexSpiSerialClk_100MHz = 6,
|
||||||
|
kFlexSpiSerialClk_120MHz = 7,
|
||||||
|
kFlexSpiSerialClk_133MHz = 8,
|
||||||
|
kFlexSpiSerialClk_166MHz = 9,
|
||||||
|
} flexspi_serial_clk_freq_t;
|
||||||
|
|
||||||
|
// !@brief FlexSPI clock configuration type
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiClk_SDR, // !< Clock configure for SDR mode
|
||||||
|
kFlexSpiClk_DDR, // !< Clock configurat for DDR mode
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI Read Sample Clock Source definition
|
||||||
|
typedef enum _FlashReadSampleClkSource
|
||||||
|
{
|
||||||
|
kFlexSPIReadSampleClk_LoopbackInternally = 0,
|
||||||
|
kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
|
||||||
|
kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
|
||||||
|
kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
|
||||||
|
} flexspi_read_sample_clk_t;
|
||||||
|
|
||||||
|
// !@brief Misc feature bit definitions
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiMiscOffset_DiffClkEnable = 0, // !< Bit for Differential clock enable
|
||||||
|
kFlexSpiMiscOffset_Ck2Enable = 1, // !< Bit for CK2 enable
|
||||||
|
kFlexSpiMiscOffset_ParallelEnable = 2, // !< Bit for Parallel mode enable
|
||||||
|
kFlexSpiMiscOffset_WordAddressableEnable = 3, // !< Bit for Word Addressable enable
|
||||||
|
kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, // !< Bit for Safe Configuration Frequency enable
|
||||||
|
kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, // !< Bit for Pad setting override enable
|
||||||
|
kFlexSpiMiscOffset_DdrModeEnable = 6, // !< Bit for DDR clock confiuration indication.
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief Flash Type Definition
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiDeviceType_SerialNOR = 1, // !< Flash devices are Serial NOR
|
||||||
|
kFlexSpiDeviceType_SerialNAND = 2, // !< Flash devices are Serial NAND
|
||||||
|
kFlexSpiDeviceType_SerialRAM = 3, // !< Flash devices are Serial RAM/HyperFLASH
|
||||||
|
kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, // !< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND
|
||||||
|
kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, // !< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief Flash Pad Definitions
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kSerialFlash_1Pad = 1,
|
||||||
|
kSerialFlash_2Pads = 2,
|
||||||
|
kSerialFlash_4Pads = 4,
|
||||||
|
kSerialFlash_8Pads = 8,
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI LUT Sequence structure
|
||||||
|
typedef struct _lut_sequence
|
||||||
|
{
|
||||||
|
uint8_t seqNum; // !< Sequence Number, valid number: 1-16
|
||||||
|
uint8_t seqId; // !< Sequence Index, valid number: 0-15
|
||||||
|
uint16_t reserved;
|
||||||
|
} flexspi_lut_seq_t;
|
||||||
|
|
||||||
|
// !@brief Flash Configuration Command Type
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kDeviceConfigCmdType_Generic, // !< Generic command, for example: configure dummy cycles, drive strength, etc
|
||||||
|
kDeviceConfigCmdType_QuadEnable, // !< Quad Enable command
|
||||||
|
kDeviceConfigCmdType_Spi2Xpi, // !< Switch from SPI to DPI/QPI/OPI mode
|
||||||
|
kDeviceConfigCmdType_Xpi2Spi, // !< Switch from DPI/QPI/OPI to SPI mode
|
||||||
|
kDeviceConfigCmdType_Spi2NoCmd, // !< Switch to 0-4-4/0-8-8 mode
|
||||||
|
kDeviceConfigCmdType_Reset, // !< Reset device command
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI Memory Configuration Block
|
||||||
|
typedef struct _FlexSPIConfig
|
||||||
|
{
|
||||||
|
uint32_t tag; // !< [0x000-0x003] Tag, fixed value 0x42464346UL
|
||||||
|
uint32_t version; // !< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix
|
||||||
|
uint32_t reserved0; // !< [0x008-0x00b] Reserved for future use
|
||||||
|
uint8_t readSampleClkSrc; // !< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3
|
||||||
|
uint8_t csHoldTime; // !< [0x00d-0x00d] CS hold time, default value: 3
|
||||||
|
uint8_t csSetupTime; // !< [0x00e-0x00e] CS setup time, default value: 3
|
||||||
|
uint8_t columnAddressWidth; // !< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
|
||||||
|
// ! Serial NAND, need to refer to datasheet
|
||||||
|
uint8_t deviceModeCfgEnable; // !< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable
|
||||||
|
uint8_t deviceModeType; // !< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
|
||||||
|
// ! Generic configuration, etc.
|
||||||
|
uint16_t waitTimeCfgCommands; // !< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
|
||||||
|
// ! DPI/QPI/OPI switch or reset command
|
||||||
|
flexspi_lut_seq_t deviceModeSeq; // !< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
|
||||||
|
// ! sequence number, [31:16] Reserved
|
||||||
|
uint32_t deviceModeArg; // !< [0x018-0x01b] Argument/Parameter for device configuration
|
||||||
|
uint8_t configCmdEnable; // !< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable
|
||||||
|
uint8_t configModeType[3]; // !< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe
|
||||||
|
flexspi_lut_seq_t
|
||||||
|
configCmdSeqs[3]; // !< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq
|
||||||
|
uint32_t reserved1; // !< [0x02c-0x02f] Reserved for future use
|
||||||
|
uint32_t configCmdArgs[3]; // !< [0x030-0x03b] Arguments/Parameters for device Configuration commands
|
||||||
|
uint32_t reserved2; // !< [0x03c-0x03f] Reserved for future use
|
||||||
|
uint32_t controllerMiscOption; // !< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
|
||||||
|
// ! details
|
||||||
|
uint8_t deviceType; // !< [0x044-0x044] Device Type: See Flash Type Definition for more details
|
||||||
|
uint8_t sflashPadType; // !< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal
|
||||||
|
uint8_t serialClkFreq; // !< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
|
||||||
|
// ! Chapter for more details
|
||||||
|
uint8_t lutCustomSeqEnable; // !< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
|
||||||
|
// ! be done using 1 LUT sequence, currently, only applicable to HyperFLASH
|
||||||
|
uint32_t reserved3[2]; // !< [0x048-0x04f] Reserved for future use
|
||||||
|
uint32_t sflashA1Size; // !< [0x050-0x053] Size of Flash connected to A1
|
||||||
|
uint32_t sflashA2Size; // !< [0x054-0x057] Size of Flash connected to A2
|
||||||
|
uint32_t sflashB1Size; // !< [0x058-0x05b] Size of Flash connected to B1
|
||||||
|
uint32_t sflashB2Size; // !< [0x05c-0x05f] Size of Flash connected to B2
|
||||||
|
uint32_t csPadSettingOverride; // !< [0x060-0x063] CS pad setting override value
|
||||||
|
uint32_t sclkPadSettingOverride; // !< [0x064-0x067] SCK pad setting override value
|
||||||
|
uint32_t dataPadSettingOverride; // !< [0x068-0x06b] data pad setting override value
|
||||||
|
uint32_t dqsPadSettingOverride; // !< [0x06c-0x06f] DQS pad setting override value
|
||||||
|
uint32_t timeoutInMs; // !< [0x070-0x073] Timeout threshold for read status command
|
||||||
|
uint32_t commandInterval; // !< [0x074-0x077] CS deselect interval between two commands
|
||||||
|
uint16_t dataValidTime[2]; // !< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns
|
||||||
|
uint16_t busyOffset; // !< [0x07c-0x07d] Busy offset, valid value: 0-31
|
||||||
|
uint16_t busyBitPolarity; // !< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
|
||||||
|
// ! busy flag is 0 when flash device is busy
|
||||||
|
uint32_t lookupTable[64]; // !< [0x080-0x17f] Lookup table holds Flash command sequences
|
||||||
|
flexspi_lut_seq_t lutCustomSeq[12]; // !< [0x180-0x1af] Customizable LUT Sequences
|
||||||
|
uint32_t reserved4[4]; // !< [0x1b0-0x1bf] Reserved for future use
|
||||||
|
} flexspi_mem_config_t;
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL 0
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG 1
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD 2
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 4
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG 6
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD 7
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READID 8
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_ENTERQPI 10
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_EXITQPI 12
|
||||||
|
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA 0
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA 1
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS 2
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE 4
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR 6
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM 10
|
||||||
|
#define HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP 12
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Serial NOR configuration block
|
||||||
|
*/
|
||||||
|
typedef struct _flexspi_nor_config
|
||||||
|
{
|
||||||
|
flexspi_mem_config_t memConfig; // !< Common memory configuration info via FlexSPI
|
||||||
|
uint32_t pageSize; // !< Page size of Serial NOR
|
||||||
|
uint32_t sectorSize; // !< Sector size of Serial NOR
|
||||||
|
uint8_t ipcmdSerialClkFreq; // !< Clock frequency for IP command
|
||||||
|
uint8_t isUniformBlockSize; // !< Sector/Block size is the same
|
||||||
|
uint8_t reserved0[2]; // !< Reserved for future use
|
||||||
|
uint8_t serialNorType; // !< Serial NOR Flash type: 0/1/2/3
|
||||||
|
uint8_t needExitNoCmdMode; // !< Need to exit NoCmd mode before other IP command
|
||||||
|
uint8_t halfClkForNonReadCmd; // !< Half the Serial Clock for non-read command: true/false
|
||||||
|
uint8_t needRestoreNoCmdMode; // !< Need to Restore NoCmd mode after IP commmand execution
|
||||||
|
uint32_t blockSize; // !< Block size
|
||||||
|
uint32_t reserve2[11]; // !< Reserved for future use
|
||||||
|
} flexspi_nor_config_t;
|
||||||
|
|
||||||
|
#define FLASH_BUSY_STATUS_POL 0
|
||||||
|
#define FLASH_BUSY_STATUS_OFFSET 0
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* __EVKMIMXRT1064_FLEXSPI_NOR_CONFIG__ */
|
||||||
122
ports/mimxrt/boards/MIMXRT1064_EVK/clock_config.h
Normal file
122
ports/mimxrt/boards/MIMXRT1064_EVK/clock_config.h
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018-2019 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CLOCK_CONFIG_H_
|
||||||
|
#define _CLOCK_CONFIG_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_XTAL0_CLK_HZ 24000000U /*!< Board xtal0 frequency in Hz */
|
||||||
|
|
||||||
|
#define BOARD_XTAL32K_CLK_HZ 32768U /*!< Board xtal32k frequency in Hz */
|
||||||
|
/*******************************************************************************
|
||||||
|
************************ BOARD_InitBootClocks function ************************
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes default configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_InitBootClocks(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
********************** Configuration BOARD_BootClockRUN ***********************
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions for BOARD_BootClockRUN configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CORE_CLOCK 600000000U /*!< Core clock frequency: 600000000Hz */
|
||||||
|
|
||||||
|
/* Clock outputs (values are in Hz): */
|
||||||
|
#define BOARD_BOOTCLOCKRUN_AHB_CLK_ROOT 600000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CAN_CLK_ROOT 40000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT 32768UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLKO1_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLKO2_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLK_1M 1000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLK_24M 24000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CSI_CLK_ROOT 12000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET1_TX_CLK 2400000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET2_125M_CLK 1200000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET2_TX_CLK 1200000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET_125M_CLK 2400000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET_25M_REF_CLK 1200000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXIO2_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXSPI2_CLK_ROOT 130909090UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT 130909090UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT 150000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LCDIF_CLK_ROOT 67500000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT 60000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT 105600000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LVDS1_CLK 1200000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_MQS_MCLK 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_PLL7_MAIN_CLK 24000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK2 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SEMC_CLK_ROOT 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT 117333333UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT 80000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USBPHY1_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USBPHY2_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USDHC1_CLK_ROOT 198000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USDHC2_CLK_ROOT 198000000UL
|
||||||
|
|
||||||
|
/*! @brief Arm PLL set for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN;
|
||||||
|
/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;
|
||||||
|
/*! @brief Sys PLL for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API for BOARD_BootClockRUN configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_BootClockRUN(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
#endif /* _CLOCK_CONFIG_H_ */
|
||||||
@@ -1,264 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __EVKMIMXRT1064_FLEXSPI_NOR_CONFIG__
|
|
||||||
#define __EVKMIMXRT1064_FLEXSPI_NOR_CONFIG__
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include "fsl_flexspi.h"
|
|
||||||
|
|
||||||
/*! @name Driver version */
|
|
||||||
/*@{*/
|
|
||||||
/*! @brief XIP_BOARD driver version 2.0.0. */
|
|
||||||
#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
|
|
||||||
/*@}*/
|
|
||||||
|
|
||||||
/* FLEXSPI memory config block related defintions */
|
|
||||||
#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian
|
|
||||||
#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0
|
|
||||||
#define FLEXSPI_CFG_BLK_SIZE (512)
|
|
||||||
|
|
||||||
/* FLEXSPI Feature related definitions */
|
|
||||||
#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
|
|
||||||
|
|
||||||
/* Lookup table related defintions */
|
|
||||||
#define CMD_INDEX_READ 0
|
|
||||||
#define CMD_INDEX_READSTATUS 1
|
|
||||||
#define CMD_INDEX_WRITEENABLE 2
|
|
||||||
#define CMD_INDEX_WRITE 4
|
|
||||||
|
|
||||||
#define CMD_LUT_SEQ_IDX_READ 0
|
|
||||||
#define CMD_LUT_SEQ_IDX_READSTATUS 1
|
|
||||||
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
|
||||||
#define CMD_LUT_SEQ_IDX_WRITE 9
|
|
||||||
|
|
||||||
#define CMD_SDR 0x01
|
|
||||||
#define CMD_DDR 0x21
|
|
||||||
#define RADDR_SDR 0x02
|
|
||||||
#define RADDR_DDR 0x22
|
|
||||||
#define CADDR_SDR 0x03
|
|
||||||
#define CADDR_DDR 0x23
|
|
||||||
#define MODE1_SDR 0x04
|
|
||||||
#define MODE1_DDR 0x24
|
|
||||||
#define MODE2_SDR 0x05
|
|
||||||
#define MODE2_DDR 0x25
|
|
||||||
#define MODE4_SDR 0x06
|
|
||||||
#define MODE4_DDR 0x26
|
|
||||||
#define MODE8_SDR 0x07
|
|
||||||
#define MODE8_DDR 0x27
|
|
||||||
#define WRITE_SDR 0x08
|
|
||||||
#define WRITE_DDR 0x28
|
|
||||||
#define READ_SDR 0x09
|
|
||||||
#define READ_DDR 0x29
|
|
||||||
#define LEARN_SDR 0x0A
|
|
||||||
#define LEARN_DDR 0x2A
|
|
||||||
#define DATSZ_SDR 0x0B
|
|
||||||
#define DATSZ_DDR 0x2B
|
|
||||||
#define DUMMY_SDR 0x0C
|
|
||||||
#define DUMMY_DDR 0x2C
|
|
||||||
#define DUMMY_RWDS_SDR 0x0D
|
|
||||||
#define DUMMY_RWDS_DDR 0x2D
|
|
||||||
#define JMP_ON_CS 0x1F
|
|
||||||
#define STOP 0
|
|
||||||
|
|
||||||
#define FLEXSPI_1PAD 0
|
|
||||||
#define FLEXSPI_2PAD 1
|
|
||||||
#define FLEXSPI_4PAD 2
|
|
||||||
#define FLEXSPI_8PAD 3
|
|
||||||
|
|
||||||
#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
|
|
||||||
(FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
|
|
||||||
FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
|
||||||
|
|
||||||
//!@brief Definitions for FlexSPI Serial Clock Frequency
|
|
||||||
typedef enum _FlexSpiSerialClockFreq
|
|
||||||
{
|
|
||||||
kFlexSpiSerialClk_30MHz = 1,
|
|
||||||
kFlexSpiSerialClk_50MHz = 2,
|
|
||||||
kFlexSpiSerialClk_60MHz = 3,
|
|
||||||
kFlexSpiSerialClk_75MHz = 4,
|
|
||||||
kFlexSpiSerialClk_80MHz = 5,
|
|
||||||
kFlexSpiSerialClk_100MHz = 6,
|
|
||||||
kFlexSpiSerialClk_120MHz = 7,
|
|
||||||
kFlexSpiSerialClk_133MHz = 8,
|
|
||||||
kFlexSpiSerialClk_166MHz = 9,
|
|
||||||
} flexspi_serial_clk_freq_t;
|
|
||||||
|
|
||||||
//!@brief FlexSPI clock configuration type
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiClk_SDR, //!< Clock configure for SDR mode
|
|
||||||
kFlexSpiClk_DDR, //!< Clock configurat for DDR mode
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI Read Sample Clock Source definition
|
|
||||||
typedef enum _FlashReadSampleClkSource
|
|
||||||
{
|
|
||||||
kFlexSPIReadSampleClk_LoopbackInternally = 0,
|
|
||||||
kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
|
|
||||||
kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
|
|
||||||
kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
|
|
||||||
} flexspi_read_sample_clk_t;
|
|
||||||
|
|
||||||
//!@brief Misc feature bit definitions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiMiscOffset_DiffClkEnable = 0, //!< Bit for Differential clock enable
|
|
||||||
kFlexSpiMiscOffset_Ck2Enable = 1, //!< Bit for CK2 enable
|
|
||||||
kFlexSpiMiscOffset_ParallelEnable = 2, //!< Bit for Parallel mode enable
|
|
||||||
kFlexSpiMiscOffset_WordAddressableEnable = 3, //!< Bit for Word Addressable enable
|
|
||||||
kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, //!< Bit for Safe Configuration Frequency enable
|
|
||||||
kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable
|
|
||||||
kFlexSpiMiscOffset_DdrModeEnable = 6, //!< Bit for DDR clock confiuration indication.
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief Flash Type Definition
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiDeviceType_SerialNOR = 1, //!< Flash devices are Serial NOR
|
|
||||||
kFlexSpiDeviceType_SerialNAND = 2, //!< Flash devices are Serial NAND
|
|
||||||
kFlexSpiDeviceType_SerialRAM = 3, //!< Flash devices are Serial RAM/HyperFLASH
|
|
||||||
kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND
|
|
||||||
kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, //!< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief Flash Pad Definitions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kSerialFlash_1Pad = 1,
|
|
||||||
kSerialFlash_2Pads = 2,
|
|
||||||
kSerialFlash_4Pads = 4,
|
|
||||||
kSerialFlash_8Pads = 8,
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI LUT Sequence structure
|
|
||||||
typedef struct _lut_sequence
|
|
||||||
{
|
|
||||||
uint8_t seqNum; //!< Sequence Number, valid number: 1-16
|
|
||||||
uint8_t seqId; //!< Sequence Index, valid number: 0-15
|
|
||||||
uint16_t reserved;
|
|
||||||
} flexspi_lut_seq_t;
|
|
||||||
|
|
||||||
//!@brief Flash Configuration Command Type
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kDeviceConfigCmdType_Generic, //!< Generic command, for example: configure dummy cycles, drive strength, etc
|
|
||||||
kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command
|
|
||||||
kDeviceConfigCmdType_Spi2Xpi, //!< Switch from SPI to DPI/QPI/OPI mode
|
|
||||||
kDeviceConfigCmdType_Xpi2Spi, //!< Switch from DPI/QPI/OPI to SPI mode
|
|
||||||
kDeviceConfigCmdType_Spi2NoCmd, //!< Switch to 0-4-4/0-8-8 mode
|
|
||||||
kDeviceConfigCmdType_Reset, //!< Reset device command
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI Memory Configuration Block
|
|
||||||
typedef struct _FlexSPIConfig
|
|
||||||
{
|
|
||||||
uint32_t tag; //!< [0x000-0x003] Tag, fixed value 0x42464346UL
|
|
||||||
uint32_t version; //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix
|
|
||||||
uint32_t reserved0; //!< [0x008-0x00b] Reserved for future use
|
|
||||||
uint8_t readSampleClkSrc; //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3
|
|
||||||
uint8_t csHoldTime; //!< [0x00d-0x00d] CS hold time, default value: 3
|
|
||||||
uint8_t csSetupTime; //!< [0x00e-0x00e] CS setup time, default value: 3
|
|
||||||
uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
|
|
||||||
//! Serial NAND, need to refer to datasheet
|
|
||||||
uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable
|
|
||||||
uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
|
|
||||||
//! Generic configuration, etc.
|
|
||||||
uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
|
|
||||||
//! DPI/QPI/OPI switch or reset command
|
|
||||||
flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
|
|
||||||
//! sequence number, [31:16] Reserved
|
|
||||||
uint32_t deviceModeArg; //!< [0x018-0x01b] Argument/Parameter for device configuration
|
|
||||||
uint8_t configCmdEnable; //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable
|
|
||||||
uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe
|
|
||||||
flexspi_lut_seq_t
|
|
||||||
configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq
|
|
||||||
uint32_t reserved1; //!< [0x02c-0x02f] Reserved for future use
|
|
||||||
uint32_t configCmdArgs[3]; //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands
|
|
||||||
uint32_t reserved2; //!< [0x03c-0x03f] Reserved for future use
|
|
||||||
uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
|
|
||||||
//! details
|
|
||||||
uint8_t deviceType; //!< [0x044-0x044] Device Type: See Flash Type Definition for more details
|
|
||||||
uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal
|
|
||||||
uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
|
|
||||||
//! Chapter for more details
|
|
||||||
uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
|
|
||||||
//! be done using 1 LUT sequence, currently, only applicable to HyperFLASH
|
|
||||||
uint32_t reserved3[2]; //!< [0x048-0x04f] Reserved for future use
|
|
||||||
uint32_t sflashA1Size; //!< [0x050-0x053] Size of Flash connected to A1
|
|
||||||
uint32_t sflashA2Size; //!< [0x054-0x057] Size of Flash connected to A2
|
|
||||||
uint32_t sflashB1Size; //!< [0x058-0x05b] Size of Flash connected to B1
|
|
||||||
uint32_t sflashB2Size; //!< [0x05c-0x05f] Size of Flash connected to B2
|
|
||||||
uint32_t csPadSettingOverride; //!< [0x060-0x063] CS pad setting override value
|
|
||||||
uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value
|
|
||||||
uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value
|
|
||||||
uint32_t dqsPadSettingOverride; //!< [0x06c-0x06f] DQS pad setting override value
|
|
||||||
uint32_t timeoutInMs; //!< [0x070-0x073] Timeout threshold for read status command
|
|
||||||
uint32_t commandInterval; //!< [0x074-0x077] CS deselect interval between two commands
|
|
||||||
uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns
|
|
||||||
uint16_t busyOffset; //!< [0x07c-0x07d] Busy offset, valid value: 0-31
|
|
||||||
uint16_t busyBitPolarity; //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
|
|
||||||
//! busy flag is 0 when flash device is busy
|
|
||||||
uint32_t lookupTable[64]; //!< [0x080-0x17f] Lookup table holds Flash command sequences
|
|
||||||
flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences
|
|
||||||
uint32_t reserved4[4]; //!< [0x1b0-0x1bf] Reserved for future use
|
|
||||||
} flexspi_mem_config_t;
|
|
||||||
|
|
||||||
/* */
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL 0
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG 1
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD 2
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 4
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG 6
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD 7
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READID 8
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_ENTERQPI 10
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_EXITQPI 12
|
|
||||||
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA 0
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA 1
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS 2
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE 4
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR 6
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM 10
|
|
||||||
#define HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP 12
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Serial NOR configuration block
|
|
||||||
*/
|
|
||||||
typedef struct _flexspi_nor_config
|
|
||||||
{
|
|
||||||
flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI
|
|
||||||
uint32_t pageSize; //!< Page size of Serial NOR
|
|
||||||
uint32_t sectorSize; //!< Sector size of Serial NOR
|
|
||||||
uint8_t ipcmdSerialClkFreq; //!< Clock frequency for IP command
|
|
||||||
uint8_t isUniformBlockSize; //!< Sector/Block size is the same
|
|
||||||
uint8_t reserved0[2]; //!< Reserved for future use
|
|
||||||
uint8_t serialNorType; //!< Serial NOR Flash type: 0/1/2/3
|
|
||||||
uint8_t needExitNoCmdMode; //!< Need to exit NoCmd mode before other IP command
|
|
||||||
uint8_t halfClkForNonReadCmd; //!< Half the Serial Clock for non-read command: true/false
|
|
||||||
uint8_t needRestoreNoCmdMode; //!< Need to Restore NoCmd mode after IP commmand execution
|
|
||||||
uint32_t blockSize; //!< Block size
|
|
||||||
uint32_t reserve2[11]; //!< Reserved for future use
|
|
||||||
} flexspi_nor_config_t;
|
|
||||||
|
|
||||||
#define FLASH_BUSY_STATUS_POL 0
|
|
||||||
#define FLASH_BUSY_STATUS_OFFSET 0
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* __EVKMIMXRT1064_FLEXSPI_NOR_CONFIG__ */
|
|
||||||
@@ -1,186 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "evkmimxrt1064_flexspi_nor_config.h"
|
|
||||||
|
|
||||||
/* Component ID definition, used by tools. */
|
|
||||||
#ifndef FSL_COMPONENT_ID
|
|
||||||
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Code
|
|
||||||
******************************************************************************/
|
|
||||||
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
|
||||||
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
|
|
||||||
__attribute__((section(".boot_hdr.conf")))
|
|
||||||
#elif defined(__ICCARM__)
|
|
||||||
#pragma location = ".boot_hdr.conf"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const flexspi_nor_config_t qspiflash_config = {
|
|
||||||
.memConfig =
|
|
||||||
{
|
|
||||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
|
||||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
|
||||||
.readSampleClkSrc = kFlexSPIReadSampleClk_ExternalInputFromDqsPad,
|
|
||||||
.csHoldTime = 3u,
|
|
||||||
.csSetupTime = 3u,
|
|
||||||
.columnAddressWidth = 3u,
|
|
||||||
// Enable DDR mode, Wordaddressable, Safe configuration, Differential clock
|
|
||||||
.controllerMiscOption =
|
|
||||||
(1u << kFlexSpiMiscOffset_DdrModeEnable) | (1u << kFlexSpiMiscOffset_WordAddressableEnable) |
|
|
||||||
(1u << kFlexSpiMiscOffset_SafeConfigFreqEnable) | (1u << kFlexSpiMiscOffset_DiffClkEnable),
|
|
||||||
.sflashPadType = kSerialFlash_8Pads,
|
|
||||||
.serialClkFreq = kFlexSpiSerialClk_133MHz,
|
|
||||||
.sflashA1Size = 64u * 1024u * 1024u,
|
|
||||||
.dataValidTime = {16u, 16u},
|
|
||||||
.lookupTable =
|
|
||||||
{
|
|
||||||
/* 0 Read Data */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04),
|
|
||||||
|
|
||||||
/* 1 Write Data */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_WRITE_DDR, kFLEXSPI_8PAD, 0x02),
|
|
||||||
|
|
||||||
/* 2 Read Status */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 2] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 3] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x70), // DATA 0x70
|
|
||||||
// +1
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 4] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 5] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DUMMY_RWDS_DDR, kFLEXSPI_8PAD, 0x0B),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 6] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0),
|
|
||||||
|
|
||||||
/* 4 Write Enable */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 2] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 3] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // DATA 0xAA
|
|
||||||
// +1
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 4] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 5] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 6] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 7] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
|
|
||||||
/* 6 Erase Sector */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 2] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 3] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x80), // DATA 0x80
|
|
||||||
// +1
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 4] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 5] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 6] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 7] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
|
||||||
// +2
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 8] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 9] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 10] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 11] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
// +3
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 12] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 13] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 14] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x30, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),
|
|
||||||
|
|
||||||
/* 10 program page with word program command sequence */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 1] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 2] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 3] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0), // DATA 0xA0
|
|
||||||
// +1
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 4] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 5] = FLEXSPI_LUT_SEQ(
|
|
||||||
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_WRITE_DDR, kFLEXSPI_8PAD, 0x80),
|
|
||||||
|
|
||||||
/* 12 Erase chip */
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 1] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 2] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 3] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x80),
|
|
||||||
// +1
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 4] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 5] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 6] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 7] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
|
||||||
// +2
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 8] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 9] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 10] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 11] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
|
||||||
// +3
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 12] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 13] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 14] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
|
||||||
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 15] =
|
|
||||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x10),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.pageSize = 512u,
|
|
||||||
.sectorSize = 256u * 1024u,
|
|
||||||
.blockSize = 256u * 1024u,
|
|
||||||
.isUniformBlockSize = true,
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* XIP_BOOT_HEADER_ENABLE */
|
|
||||||
@@ -5,8 +5,6 @@
|
|||||||
#define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_09)
|
#define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_09)
|
||||||
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin))
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin))
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin))
|
||||||
#define BOARD_FLASH_CONFIG_HEADER_H "evkmimxrt1064_flexspi_nor_config.h"
|
|
||||||
#define BOARD_FLASH_OPS_HEADER_H "hal/flexspi_hyper_flash.h"
|
|
||||||
|
|
||||||
#define MICROPY_HW_NUM_PIN_IRQS (4 * 32 + 3)
|
#define MICROPY_HW_NUM_PIN_IRQS (4 * 32 + 3)
|
||||||
|
|
||||||
@@ -36,10 +34,10 @@
|
|||||||
{ IOMUXC_GPIO_SD_B0_02_LPSPI1_SDO }, { IOMUXC_GPIO_SD_B0_03_LPSPI1_SDI },
|
{ IOMUXC_GPIO_SD_B0_02_LPSPI1_SDO }, { IOMUXC_GPIO_SD_B0_03_LPSPI1_SDI },
|
||||||
|
|
||||||
#define DMA_REQ_SRC_RX { 0, kDmaRequestMuxLPSPI1Rx, kDmaRequestMuxLPSPI2Rx, \
|
#define DMA_REQ_SRC_RX { 0, kDmaRequestMuxLPSPI1Rx, kDmaRequestMuxLPSPI2Rx, \
|
||||||
kDmaRequestMuxLPSPI3Rx, kDmaRequestMuxLPSPI4Rx }
|
kDmaRequestMuxLPSPI3Rx, kDmaRequestMuxLPSPI4Rx }
|
||||||
|
|
||||||
#define DMA_REQ_SRC_TX { 0, kDmaRequestMuxLPSPI1Tx, kDmaRequestMuxLPSPI2Tx, \
|
#define DMA_REQ_SRC_TX { 0, kDmaRequestMuxLPSPI1Tx, kDmaRequestMuxLPSPI2Tx, \
|
||||||
kDmaRequestMuxLPSPI3Tx, kDmaRequestMuxLPSPI4Tx }
|
kDmaRequestMuxLPSPI3Tx, kDmaRequestMuxLPSPI4Tx }
|
||||||
|
|
||||||
// Define the mapping hardware I2C # to logical I2C #
|
// Define the mapping hardware I2C # to logical I2C #
|
||||||
// SDA/SCL HW-I2C Logical I2C
|
// SDA/SCL HW-I2C Logical I2C
|
||||||
@@ -58,9 +56,9 @@
|
|||||||
{ \
|
{ \
|
||||||
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
|
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
|
||||||
.clk = { GPIO_SD_B0_01_USDHC1_CLK }, \
|
.clk = { GPIO_SD_B0_01_USDHC1_CLK }, \
|
||||||
.cd_b = { GPIO_B1_12_USDHC1_CD_B },\
|
.cd_b = { GPIO_B1_12_USDHC1_CD_B }, \
|
||||||
.data0 = { GPIO_SD_B0_02_USDHC1_DATA0 },\
|
.data0 = { GPIO_SD_B0_02_USDHC1_DATA0 }, \
|
||||||
.data1 = { GPIO_SD_B0_03_USDHC1_DATA1 },\
|
.data1 = { GPIO_SD_B0_03_USDHC1_DATA1 }, \
|
||||||
.data2 = { GPIO_SD_B0_04_USDHC1_DATA2 },\
|
.data2 = { GPIO_SD_B0_04_USDHC1_DATA2 }, \
|
||||||
.data3 = { GPIO_SD_B0_05_USDHC1_DATA3 },\
|
.data3 = { GPIO_SD_B0_05_USDHC1_DATA3 }, \
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,13 +3,10 @@ MCU_VARIANT = MIMXRT1064DVL6A
|
|||||||
|
|
||||||
MICROPY_FLOAT_IMPL = double
|
MICROPY_FLOAT_IMPL = double
|
||||||
MICROPY_PY_MACHINE_SDCARD = 1
|
MICROPY_PY_MACHINE_SDCARD = 1
|
||||||
|
BOARD_FLASH_TYPE ?= hyperflash
|
||||||
|
BOARD_FLASH_SIZE ?= 0x4000000 # 64MB
|
||||||
|
|
||||||
JLINK_PATH ?= /media/RT1064-EVK/
|
JLINK_PATH ?= /media/RT1064-EVK/
|
||||||
|
|
||||||
CFLAGS += -DBOARD_FLASH_SIZE=0x400000
|
|
||||||
|
|
||||||
deploy: $(BUILD)/firmware.bin
|
deploy: $(BUILD)/firmware.bin
|
||||||
cp $< $(JLINK_PATH)
|
cp $< $(JLINK_PATH)
|
||||||
|
|
||||||
SRC_C += \
|
|
||||||
hal/flexspi_hyper_flash.c
|
|
||||||
|
|||||||
186
ports/mimxrt/boards/MIMXRT1064_EVK/qspi_hyper_flash_config.c
Normal file
186
ports/mimxrt/boards/MIMXRT1064_EVK/qspi_hyper_flash_config.c
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include BOARD_FLASH_CONFIG_HEADER_H
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
||||||
|
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
|
||||||
|
__attribute__((section(".boot_hdr.conf")))
|
||||||
|
#elif defined(__ICCARM__)
|
||||||
|
#pragma location = ".boot_hdr.conf"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const flexspi_nor_config_t qspiflash_config = {
|
||||||
|
.memConfig =
|
||||||
|
{
|
||||||
|
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||||
|
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||||
|
.readSampleClkSrc = kFlexSPIReadSampleClk_ExternalInputFromDqsPad,
|
||||||
|
.csHoldTime = 3u,
|
||||||
|
.csSetupTime = 3u,
|
||||||
|
.columnAddressWidth = 3u,
|
||||||
|
// Enable DDR mode, Wordaddressable, Safe configuration, Differential clock
|
||||||
|
.controllerMiscOption =
|
||||||
|
(1u << kFlexSpiMiscOffset_DdrModeEnable) | (1u << kFlexSpiMiscOffset_WordAddressableEnable) |
|
||||||
|
(1u << kFlexSpiMiscOffset_SafeConfigFreqEnable) | (1u << kFlexSpiMiscOffset_DiffClkEnable),
|
||||||
|
.sflashPadType = kSerialFlash_8Pads,
|
||||||
|
.serialClkFreq = kFlexSpiSerialClk_133MHz,
|
||||||
|
.sflashA1Size = BOARD_FLASH_SIZE,
|
||||||
|
.dataValidTime = {16u, 16u},
|
||||||
|
.lookupTable =
|
||||||
|
{
|
||||||
|
/* 0 Read Data */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04),
|
||||||
|
|
||||||
|
/* 1 Write Data */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_WRITE_DDR, kFLEXSPI_8PAD, 0x02),
|
||||||
|
|
||||||
|
/* 2 Read Status */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 2] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 3] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x70), // DATA 0x70
|
||||||
|
// +1
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 4] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 5] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DUMMY_RWDS_DDR, kFLEXSPI_8PAD, 0x0B),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS + 6] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0),
|
||||||
|
|
||||||
|
/* 4 Write Enable */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 2] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 3] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // DATA 0xAA
|
||||||
|
// +1
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 4] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 5] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 6] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE + 7] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
|
||||||
|
/* 6 Erase Sector */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 2] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 3] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x80), // DATA 0x80
|
||||||
|
// +1
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 4] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 5] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 6] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 7] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
||||||
|
// +2
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 8] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 9] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 10] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 11] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
// +3
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 12] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 13] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR + 14] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x30, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),
|
||||||
|
|
||||||
|
/* 10 program page with word program command sequence */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 1] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA), // ADDR 0x555
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 2] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 3] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0), // DATA 0xA0
|
||||||
|
// +1
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 4] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM + 5] = FLEXSPI_LUT_SEQ(
|
||||||
|
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_WRITE_DDR, kFLEXSPI_8PAD, 0x80),
|
||||||
|
|
||||||
|
/* 12 Erase chip */
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 1] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 2] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 3] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x80),
|
||||||
|
// +1
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 4] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 5] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 6] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 7] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
||||||
|
// +2
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 8] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 9] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 10] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x02),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 11] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x55),
|
||||||
|
// +3
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 12] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 13] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xAA),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 14] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x05),
|
||||||
|
[4 * HYPERFLASH_CMD_LUT_SEQ_IDX_ERASECHIP + 15] =
|
||||||
|
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x00, kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x10),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.pageSize = 512u,
|
||||||
|
.sectorSize = 256u * 1024u,
|
||||||
|
.blockSize = 256u * 1024u,
|
||||||
|
.isUniformBlockSize = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* XIP_BOOT_HEADER_ENABLE */
|
||||||
129
ports/mimxrt/boards/MIMXRT1064_EVK/qspi_nor_flash_config.c
Normal file
129
ports/mimxrt/boards/MIMXRT1064_EVK/qspi_nor_flash_config.c
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include BOARD_FLASH_CONFIG_HEADER_H
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
||||||
|
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
|
||||||
|
__attribute__((section(".boot_hdr.conf")))
|
||||||
|
#elif defined(__ICCARM__)
|
||||||
|
#pragma location = ".boot_hdr.conf"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const flexspi_nor_config_t qspiflash_config = {
|
||||||
|
.memConfig =
|
||||||
|
{
|
||||||
|
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||||
|
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||||
|
.readSampleClkSrc = kFlexSPIReadSampleClk_ExternalInputFromDqsPad,
|
||||||
|
.csHoldTime = 3u,
|
||||||
|
.csSetupTime = 3u,
|
||||||
|
.columnAddressWidth = 3u,
|
||||||
|
// Enable DDR mode, Wordaddassable, Safe configuration, Differential clock
|
||||||
|
.controllerMiscOption =
|
||||||
|
(1u << kFlexSpiMiscOffset_DdrModeEnable) | (1u << kFlexSpiMiscOffset_WordAddressableEnable) |
|
||||||
|
(1u << kFlexSpiMiscOffset_SafeConfigFreqEnable) | (1u << kFlexSpiMiscOffset_DiffClkEnable),
|
||||||
|
.sflashPadType = kSerialFlash_8Pads,
|
||||||
|
.serialClkFreq = kFlexSpiSerialClk_133MHz,
|
||||||
|
.sflashA1Size = BOARD_FLASH_SIZE,
|
||||||
|
.dataValidTime = {16u, 16u},
|
||||||
|
.lookupTable =
|
||||||
|
{
|
||||||
|
// 0 Read LUTs 0 -> 0
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 1 Read status register -> 1
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x01),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 2 Fast read quad mode - SDR
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x6B, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x08, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 3 Write Enable -> 3
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 4 Read extend parameters
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x81, READ_SDR, FLEXSPI_1PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 5 Erase Sector -> 5
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 6 Write Status Reg
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01, WRITE_SDR, FLEXSPI_1PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 7 Page Program - quad mode (-> 9)
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 8 Read ID
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x90, DUMMY_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_1PAD, 0x00, 0, 0, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 9 Page Program - single mode -> 9
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0, 0, 0, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 10 Enter QPI mode
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x35, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 11 Erase Chip
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 12 Exit QPI mode
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_4PAD, 0xF5, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.pageSize = 512u,
|
||||||
|
.sectorSize = 256u * 1024u,
|
||||||
|
.blockSize = 256u * 1024u,
|
||||||
|
.isUniformBlockSize = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* XIP_BOOT_HEADER_ENABLE */
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
flash_size = 2M;
|
|
||||||
reserved_size = 4K;
|
|
||||||
259
ports/mimxrt/boards/TEENSY40/TEENSY40_flexspi_nor_config.h
Normal file
259
ports/mimxrt/boards/TEENSY40/TEENSY40_flexspi_nor_config.h
Normal file
@@ -0,0 +1,259 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Based on tinyusb/hw/bsp/teensy_40/teensy40_flexspi_nor_config.h
|
||||||
|
|
||||||
|
#ifndef __TEENSY40_FLEXSPI_NOR_CONFIG__
|
||||||
|
#define __TEENSY40_FLEXSPI_NOR_CONFIG__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*! @name Driver version */
|
||||||
|
/*@{*/
|
||||||
|
/*! @brief XIP_BOARD driver version 2.0.0. */
|
||||||
|
#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/* FLEXSPI memory config block related defintions */
|
||||||
|
#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian
|
||||||
|
#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0
|
||||||
|
#define FLEXSPI_CFG_BLK_SIZE (512)
|
||||||
|
|
||||||
|
/* FLEXSPI Feature related definitions */
|
||||||
|
#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
|
||||||
|
|
||||||
|
/* Lookup table related definitions */
|
||||||
|
#define CMD_INDEX_READ 0
|
||||||
|
#define CMD_INDEX_READSTATUS 1
|
||||||
|
#define CMD_INDEX_WRITEENABLE 2
|
||||||
|
#define CMD_INDEX_WRITE 4
|
||||||
|
|
||||||
|
#define CMD_LUT_SEQ_IDX_READ 0
|
||||||
|
#define CMD_LUT_SEQ_IDX_READSTATUS 1
|
||||||
|
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
||||||
|
#define CMD_LUT_SEQ_IDX_ERASE 5
|
||||||
|
#define CMD_LUT_SEQ_IDX_WRITE 9
|
||||||
|
|
||||||
|
#define CMD_SDR 0x01
|
||||||
|
#define CMD_DDR 0x21
|
||||||
|
#define RADDR_SDR 0x02
|
||||||
|
#define RADDR_DDR 0x22
|
||||||
|
#define CADDR_SDR 0x03
|
||||||
|
#define CADDR_DDR 0x23
|
||||||
|
#define MODE1_SDR 0x04
|
||||||
|
#define MODE1_DDR 0x24
|
||||||
|
#define MODE2_SDR 0x05
|
||||||
|
#define MODE2_DDR 0x25
|
||||||
|
#define MODE4_SDR 0x06
|
||||||
|
#define MODE4_DDR 0x26
|
||||||
|
#define MODE8_SDR 0x07
|
||||||
|
#define MODE8_DDR 0x27
|
||||||
|
#define WRITE_SDR 0x08
|
||||||
|
#define WRITE_DDR 0x28
|
||||||
|
#define READ_SDR 0x09
|
||||||
|
#define READ_DDR 0x29
|
||||||
|
#define LEARN_SDR 0x0A
|
||||||
|
#define LEARN_DDR 0x2A
|
||||||
|
#define DATSZ_SDR 0x0B
|
||||||
|
#define DATSZ_DDR 0x2B
|
||||||
|
#define DUMMY_SDR 0x0C
|
||||||
|
#define DUMMY_DDR 0x2C
|
||||||
|
#define DUMMY_RWDS_SDR 0x0D
|
||||||
|
#define DUMMY_RWDS_DDR 0x2D
|
||||||
|
#define JMP_ON_CS 0x1F
|
||||||
|
#define STOP 0
|
||||||
|
|
||||||
|
#define FLEXSPI_1PAD 0
|
||||||
|
#define FLEXSPI_2PAD 1
|
||||||
|
#define FLEXSPI_4PAD 2
|
||||||
|
#define FLEXSPI_8PAD 3
|
||||||
|
|
||||||
|
#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
|
||||||
|
(FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
|
||||||
|
FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
||||||
|
|
||||||
|
// !@brief Definitions for FlexSPI Serial Clock Frequency
|
||||||
|
typedef enum _FlexSpiSerialClockFreq
|
||||||
|
{
|
||||||
|
kFlexSpiSerialClk_30MHz = 1,
|
||||||
|
kFlexSpiSerialClk_50MHz = 2,
|
||||||
|
kFlexSpiSerialClk_60MHz = 3,
|
||||||
|
kFlexSpiSerialClk_75MHz = 4,
|
||||||
|
kFlexSpiSerialClk_80MHz = 5,
|
||||||
|
kFlexSpiSerialClk_100MHz = 6,
|
||||||
|
kFlexSpiSerialClk_120MHz = 7,
|
||||||
|
kFlexSpiSerialClk_133MHz = 8,
|
||||||
|
kFlexSpiSerialClk_166MHz = 9,
|
||||||
|
} flexspi_serial_clk_freq_t;
|
||||||
|
|
||||||
|
// !@brief FlexSPI clock configuration type
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiClk_SDR, // !< Clock configure for SDR mode
|
||||||
|
kFlexSpiClk_DDR, // !< Clock configurat for DDR mode
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI Read Sample Clock Source definition
|
||||||
|
typedef enum _FlashReadSampleClkSource
|
||||||
|
{
|
||||||
|
kFlexSPIReadSampleClk_LoopbackInternally = 0,
|
||||||
|
kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
|
||||||
|
kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
|
||||||
|
kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
|
||||||
|
} flexspi_read_sample_clk_t;
|
||||||
|
|
||||||
|
// !@brief Misc feature bit definitions
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiMiscOffset_DiffClkEnable = 0, // !< Bit for Differential clock enable
|
||||||
|
kFlexSpiMiscOffset_Ck2Enable = 1, // !< Bit for CK2 enable
|
||||||
|
kFlexSpiMiscOffset_ParallelEnable = 2, // !< Bit for Parallel mode enable
|
||||||
|
kFlexSpiMiscOffset_WordAddressableEnable = 3, // !< Bit for Word Addressable enable
|
||||||
|
kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, // !< Bit for Safe Configuration Frequency enable
|
||||||
|
kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, // !< Bit for Pad setting override enable
|
||||||
|
kFlexSpiMiscOffset_DdrModeEnable = 6, // !< Bit for DDR clock confiuration indication.
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief Flash Type Definition
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiDeviceType_SerialNOR = 1, // !< Flash devices are Serial NOR
|
||||||
|
kFlexSpiDeviceType_SerialNAND = 2, // !< Flash devices are Serial NAND
|
||||||
|
kFlexSpiDeviceType_SerialRAM = 3, // !< Flash devices are Serial RAM/HyperFLASH
|
||||||
|
kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, // !< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND
|
||||||
|
kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, // !< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief Flash Pad Definitions
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kSerialFlash_1Pad = 1,
|
||||||
|
kSerialFlash_2Pads = 2,
|
||||||
|
kSerialFlash_4Pads = 4,
|
||||||
|
kSerialFlash_8Pads = 8,
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI LUT Sequence structure
|
||||||
|
typedef struct _lut_sequence
|
||||||
|
{
|
||||||
|
uint8_t seqNum; // !< Sequence Number, valid number: 1-16
|
||||||
|
uint8_t seqId; // !< Sequence Index, valid number: 0-15
|
||||||
|
uint16_t reserved;
|
||||||
|
} flexspi_lut_seq_t;
|
||||||
|
|
||||||
|
// !@brief Flash Configuration Command Type
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kDeviceConfigCmdType_Generic, // !< Generic command, for example: configure dummy cycles, drive strength, etc
|
||||||
|
kDeviceConfigCmdType_QuadEnable, // !< Quad Enable command
|
||||||
|
kDeviceConfigCmdType_Spi2Xpi, // !< Switch from SPI to DPI/QPI/OPI mode
|
||||||
|
kDeviceConfigCmdType_Xpi2Spi, // !< Switch from DPI/QPI/OPI to SPI mode
|
||||||
|
kDeviceConfigCmdType_Spi2NoCmd, // !< Switch to 0-4-4/0-8-8 mode
|
||||||
|
kDeviceConfigCmdType_Reset, // !< Reset device command
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI Memory Configuration Block
|
||||||
|
typedef struct _FlexSPIConfig
|
||||||
|
{
|
||||||
|
uint32_t tag; // !< [0x000-0x003] Tag, fixed value 0x42464346UL
|
||||||
|
uint32_t version; // !< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix
|
||||||
|
uint32_t reserved0; // !< [0x008-0x00b] Reserved for future use
|
||||||
|
uint8_t readSampleClkSrc; // !< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3
|
||||||
|
uint8_t csHoldTime; // !< [0x00d-0x00d] CS hold time, default value: 3
|
||||||
|
uint8_t csSetupTime; // !< [0x00e-0x00e] CS setup time, default value: 3
|
||||||
|
uint8_t columnAddressWidth; // !< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
|
||||||
|
// ! Serial NAND, need to refer to datasheet
|
||||||
|
uint8_t deviceModeCfgEnable; // !< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable
|
||||||
|
uint8_t deviceModeType; // !< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
|
||||||
|
// ! Generic configuration, etc.
|
||||||
|
uint16_t waitTimeCfgCommands; // !< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
|
||||||
|
// ! DPI/QPI/OPI switch or reset command
|
||||||
|
flexspi_lut_seq_t deviceModeSeq; // !< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
|
||||||
|
// ! sequence number, [31:16] Reserved
|
||||||
|
uint32_t deviceModeArg; // !< [0x018-0x01b] Argument/Parameter for device configuration
|
||||||
|
uint8_t configCmdEnable; // !< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable
|
||||||
|
uint8_t configModeType[3]; // !< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe
|
||||||
|
flexspi_lut_seq_t
|
||||||
|
configCmdSeqs[3]; // !< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq
|
||||||
|
uint32_t reserved1; // !< [0x02c-0x02f] Reserved for future use
|
||||||
|
uint32_t configCmdArgs[3]; // !< [0x030-0x03b] Arguments/Parameters for device Configuration commands
|
||||||
|
uint32_t reserved2; // !< [0x03c-0x03f] Reserved for future use
|
||||||
|
uint32_t controllerMiscOption; // !< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
|
||||||
|
// ! details
|
||||||
|
uint8_t deviceType; // !< [0x044-0x044] Device Type: See Flash Type Definition for more details
|
||||||
|
uint8_t sflashPadType; // !< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal
|
||||||
|
uint8_t serialClkFreq; // !< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
|
||||||
|
// ! Chapter for more details
|
||||||
|
uint8_t lutCustomSeqEnable; // !< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
|
||||||
|
// ! be done using 1 LUT sequence, currently, only applicable to HyperFLASH
|
||||||
|
uint32_t reserved3[2]; // !< [0x048-0x04f] Reserved for future use
|
||||||
|
uint32_t sflashA1Size; // !< [0x050-0x053] Size of Flash connected to A1
|
||||||
|
uint32_t sflashA2Size; // !< [0x054-0x057] Size of Flash connected to A2
|
||||||
|
uint32_t sflashB1Size; // !< [0x058-0x05b] Size of Flash connected to B1
|
||||||
|
uint32_t sflashB2Size; // !< [0x05c-0x05f] Size of Flash connected to B2
|
||||||
|
uint32_t csPadSettingOverride; // !< [0x060-0x063] CS pad setting override value
|
||||||
|
uint32_t sclkPadSettingOverride; // !< [0x064-0x067] SCK pad setting override value
|
||||||
|
uint32_t dataPadSettingOverride; // !< [0x068-0x06b] data pad setting override value
|
||||||
|
uint32_t dqsPadSettingOverride; // !< [0x06c-0x06f] DQS pad setting override value
|
||||||
|
uint32_t timeoutInMs; // !< [0x070-0x073] Timeout threshold for read status command
|
||||||
|
uint32_t commandInterval; // !< [0x074-0x077] CS deselect interval between two commands
|
||||||
|
uint16_t dataValidTime[2]; // !< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns
|
||||||
|
uint16_t busyOffset; // !< [0x07c-0x07d] Busy offset, valid value: 0-31
|
||||||
|
uint16_t busyBitPolarity; // !< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
|
||||||
|
// ! busy flag is 0 when flash device is busy
|
||||||
|
uint32_t lookupTable[64]; // !< [0x080-0x17f] Lookup table holds Flash command sequences
|
||||||
|
flexspi_lut_seq_t lutCustomSeq[12]; // !< [0x180-0x1af] Customizable LUT Sequences
|
||||||
|
uint32_t reserved4[4]; // !< [0x1b0-0x1bf] Reserved for future use
|
||||||
|
} flexspi_mem_config_t;
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL 0
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG 1
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD 2
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 4
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG 6
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD 7
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READID 8
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_ENTERQPI 10
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_EXITQPI 12
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Serial NOR configuration block
|
||||||
|
*/
|
||||||
|
typedef struct _flexspi_nor_config
|
||||||
|
{
|
||||||
|
flexspi_mem_config_t memConfig; // !< Common memory configuration info via FlexSPI
|
||||||
|
uint32_t pageSize; // !< Page size of Serial NOR
|
||||||
|
uint32_t sectorSize; // !< Sector size of Serial NOR
|
||||||
|
uint8_t ipcmdSerialClkFreq; // !< Clock frequency for IP command
|
||||||
|
uint8_t isUniformBlockSize; // !< Sector/Block size is the same
|
||||||
|
uint8_t reserved0[2]; // !< Reserved for future use
|
||||||
|
uint8_t serialNorType; // !< Serial NOR Flash type: 0/1/2/3
|
||||||
|
uint8_t needExitNoCmdMode; // !< Need to exit NoCmd mode before other IP command
|
||||||
|
uint8_t halfClkForNonReadCmd; // !< Half the Serial Clock for non-read command: true/false
|
||||||
|
uint8_t needRestoreNoCmdMode; // !< Need to Restore NoCmd mode after IP commmand execution
|
||||||
|
uint32_t blockSize; // !< Block size
|
||||||
|
uint32_t reserve2[11]; // !< Reserved for future use
|
||||||
|
} flexspi_nor_config_t;
|
||||||
|
|
||||||
|
#define FLASH_BUSY_STATUS_POL 0
|
||||||
|
#define FLASH_BUSY_STATUS_OFFSET 0
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* __EVKMIMXRT1060_FLEXSPI_NOR_CONFIG__ */
|
||||||
122
ports/mimxrt/boards/TEENSY40/clock_config.h
Normal file
122
ports/mimxrt/boards/TEENSY40/clock_config.h
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018-2019 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CLOCK_CONFIG_H_
|
||||||
|
#define _CLOCK_CONFIG_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_XTAL0_CLK_HZ 24000000U /*!< Board xtal0 frequency in Hz */
|
||||||
|
|
||||||
|
#define BOARD_XTAL32K_CLK_HZ 32768U /*!< Board xtal32k frequency in Hz */
|
||||||
|
/*******************************************************************************
|
||||||
|
************************ BOARD_InitBootClocks function ************************
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes default configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_InitBootClocks(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
********************** Configuration BOARD_BootClockRUN ***********************
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions for BOARD_BootClockRUN configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CORE_CLOCK 600000000U /*!< Core clock frequency: 600000000Hz */
|
||||||
|
|
||||||
|
/* Clock outputs (values are in Hz): */
|
||||||
|
#define BOARD_BOOTCLOCKRUN_AHB_CLK_ROOT 600000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CAN_CLK_ROOT 40000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT 32768UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLKO1_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLKO2_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLK_1M 1000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLK_24M 24000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CSI_CLK_ROOT 12000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET1_TX_CLK 2400000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET2_125M_CLK 1200000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET2_TX_CLK 1200000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET_125M_CLK 2400000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET_25M_REF_CLK 1200000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXIO2_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXSPI2_CLK_ROOT 130909090UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT 130909090UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT 150000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LCDIF_CLK_ROOT 9642857UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT 60000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT 105600000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LVDS1_CLK 1200000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_MQS_MCLK 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_PLL7_MAIN_CLK 24000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK2 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SEMC_CLK_ROOT 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT 117333333UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT 80000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USBPHY1_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USBPHY2_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USDHC1_CLK_ROOT 198000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USDHC2_CLK_ROOT 198000000UL
|
||||||
|
|
||||||
|
/*! @brief Arm PLL set for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN;
|
||||||
|
/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;
|
||||||
|
/*! @brief Sys PLL for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API for BOARD_BootClockRUN configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_BootClockRUN(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
#endif /* _CLOCK_CONFIG_H_ */
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Based on tinyusb/hw/bsp/teensy_40/teensy40_flexspi_nor_config.c
|
|
||||||
|
|
||||||
#include "teensy40_flexspi_nor_config.h"
|
|
||||||
|
|
||||||
/* Component ID definition, used by tools. */
|
|
||||||
#ifndef FSL_COMPONENT_ID
|
|
||||||
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Code
|
|
||||||
******************************************************************************/
|
|
||||||
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
|
||||||
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
|
|
||||||
__attribute__((section(".boot_hdr.conf")))
|
|
||||||
#elif defined(__ICCARM__)
|
|
||||||
#pragma location = ".boot_hdr.conf"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const flexspi_nor_config_t qspiflash_config = {
|
|
||||||
.memConfig =
|
|
||||||
{
|
|
||||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
|
||||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
|
||||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
|
||||||
.csHoldTime = 3u,
|
|
||||||
.csSetupTime = 3u,
|
|
||||||
|
|
||||||
.busyOffset = FLASH_BUSY_STATUS_OFFSET, // Status bit 0 indicates busy.
|
|
||||||
.busyBitPolarity = FLASH_BUSY_STATUS_POL, // Busy when the bit is 1.
|
|
||||||
|
|
||||||
.deviceModeCfgEnable = 1u,
|
|
||||||
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
|
|
||||||
.deviceModeSeq = {
|
|
||||||
.seqId = 4u,
|
|
||||||
.seqNum = 1u,
|
|
||||||
},
|
|
||||||
.deviceModeArg = 0x0200,
|
|
||||||
.configCmdEnable = 1u,
|
|
||||||
.configModeType[0] = kDeviceConfigCmdType_Generic,
|
|
||||||
.configCmdSeqs[0] = {
|
|
||||||
.seqId = 2u,
|
|
||||||
.seqNum = 1u,
|
|
||||||
},
|
|
||||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
|
||||||
// Enable DDR mode, Wordaddassable, Safe configuration, Differential clock
|
|
||||||
.sflashPadType = kSerialFlash_4Pads,
|
|
||||||
.serialClkFreq = kFlexSpiSerialClk_60MHz,
|
|
||||||
.sflashA1Size = 2u * 1024u * 1024u,
|
|
||||||
.lookupTable =
|
|
||||||
{
|
|
||||||
// 0 Read LUTs 0 -> 0
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
|
||||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 1 Read status register -> 1
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x01),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 2 Fast read quad mode - SDR
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x6B, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
|
||||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x08, READ_SDR, FLEXSPI_4PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 3 Write Enable -> 3
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 4 Read extend parameters
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x81, READ_SDR, FLEXSPI_1PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 5 Erase Sector -> 5
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 24),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 6 Write Status Reg
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01, WRITE_SDR, FLEXSPI_1PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 7 Page Program - quad mode (-> 9)
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
|
||||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 8 Read ID
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x90, DUMMY_SDR, FLEXSPI_1PAD, 24),
|
|
||||||
FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_1PAD, 0x00, 0, 0, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 9 Page Program - single mode -> 9
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 24),
|
|
||||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0, 0, 0, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 10 Enter QPI mode
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x35, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 11 Erase Chip
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 12 Exit QPI mode
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_4PAD, 0xF5, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.pageSize = 256u,
|
|
||||||
.sectorSize = 4u * 1024u,
|
|
||||||
.ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
|
|
||||||
.blockSize = 0x00010000,
|
|
||||||
.isUniformBlockSize = false,
|
|
||||||
};
|
|
||||||
#endif /* XIP_BOOT_HEADER_ENABLE */
|
|
||||||
@@ -1,14 +1,10 @@
|
|||||||
#define MICROPY_HW_BOARD_NAME "Teensy 4.0"
|
#define MICROPY_HW_BOARD_NAME "Teensy 4.0"
|
||||||
#define MICROPY_HW_MCU_NAME "MIMXRT1062DVJ6A"
|
#define MICROPY_HW_MCU_NAME "MIMXRT1062DVJ6A"
|
||||||
|
|
||||||
#define BOARD_FLASH_SIZE (2 * 1024 * 1024)
|
|
||||||
|
|
||||||
// Teensy 4.0 has 1 board LED
|
// Teensy 4.0 has 1 board LED
|
||||||
#define MICROPY_HW_LED1_PIN (pin_GPIO_B0_03)
|
#define MICROPY_HW_LED1_PIN (pin_GPIO_B0_03)
|
||||||
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
||||||
#define BOARD_FLASH_CONFIG_HEADER_H "teensy40_flexspi_nor_config.h"
|
|
||||||
#define BOARD_FLASH_OPS_HEADER_H "hal/flexspi_nor_flash.h"
|
|
||||||
|
|
||||||
#define MICROPY_HW_NUM_PIN_IRQS (4 * 32 + 3)
|
#define MICROPY_HW_NUM_PIN_IRQS (4 * 32 + 3)
|
||||||
|
|
||||||
@@ -39,10 +35,10 @@
|
|||||||
{ IOMUXC_GPIO_B0_02_LPSPI4_SDO }, { IOMUXC_GPIO_B0_01_LPSPI4_SDI },
|
{ IOMUXC_GPIO_B0_02_LPSPI4_SDO }, { IOMUXC_GPIO_B0_01_LPSPI4_SDI },
|
||||||
|
|
||||||
#define DMA_REQ_SRC_RX { 0, kDmaRequestMuxLPSPI1Rx, kDmaRequestMuxLPSPI2Rx, \
|
#define DMA_REQ_SRC_RX { 0, kDmaRequestMuxLPSPI1Rx, kDmaRequestMuxLPSPI2Rx, \
|
||||||
kDmaRequestMuxLPSPI3Rx, kDmaRequestMuxLPSPI4Rx }
|
kDmaRequestMuxLPSPI3Rx, kDmaRequestMuxLPSPI4Rx }
|
||||||
|
|
||||||
#define DMA_REQ_SRC_TX { 0, kDmaRequestMuxLPSPI1Tx, kDmaRequestMuxLPSPI2Tx, \
|
#define DMA_REQ_SRC_TX { 0, kDmaRequestMuxLPSPI1Tx, kDmaRequestMuxLPSPI2Tx, \
|
||||||
kDmaRequestMuxLPSPI3Tx, kDmaRequestMuxLPSPI4Tx }
|
kDmaRequestMuxLPSPI3Tx, kDmaRequestMuxLPSPI4Tx }
|
||||||
|
|
||||||
// Define mapping hardware I2C # to logical I2C #
|
// Define mapping hardware I2C # to logical I2C #
|
||||||
// SDA/SCL HW-I2C Logical I2C
|
// SDA/SCL HW-I2C Logical I2C
|
||||||
@@ -63,9 +59,9 @@
|
|||||||
{ \
|
{ \
|
||||||
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
|
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
|
||||||
.clk = { GPIO_SD_B0_01_USDHC1_CLK }, \
|
.clk = { GPIO_SD_B0_01_USDHC1_CLK }, \
|
||||||
.cd_b = { USDHC_DUMMY_PIN },\
|
.cd_b = { USDHC_DUMMY_PIN }, \
|
||||||
.data0 = { GPIO_SD_B0_02_USDHC1_DATA0 },\
|
.data0 = { GPIO_SD_B0_02_USDHC1_DATA0 }, \
|
||||||
.data1 = { GPIO_SD_B0_03_USDHC1_DATA1 },\
|
.data1 = { GPIO_SD_B0_03_USDHC1_DATA1 }, \
|
||||||
.data2 = { GPIO_SD_B0_04_USDHC1_DATA2 },\
|
.data2 = { GPIO_SD_B0_04_USDHC1_DATA2 }, \
|
||||||
.data3 = { GPIO_SD_B0_05_USDHC1_DATA3 },\
|
.data3 = { GPIO_SD_B0_05_USDHC1_DATA3 }, \
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ MCU_VARIANT = MIMXRT1062DVJ6A
|
|||||||
|
|
||||||
MICROPY_FLOAT_IMPL = double
|
MICROPY_FLOAT_IMPL = double
|
||||||
MICROPY_PY_MACHINE_SDCARD = 1
|
MICROPY_PY_MACHINE_SDCARD = 1
|
||||||
|
BOARD_FLASH_TYPE ?= qspi_nor
|
||||||
|
BOARD_FLASH_SIZE ?= 0x200000 # 2MB
|
||||||
|
BOARD_FLASH_RESERVED ?= 0x1000 # 4KB
|
||||||
|
|
||||||
deploy: $(BUILD)/firmware.hex
|
deploy: $(BUILD)/firmware.hex
|
||||||
teensy_loader_cli --mcu=imxrt1062 -v -w $<
|
teensy_loader_cli --mcu=imxrt1062 -v -w $<
|
||||||
|
|
||||||
SRC_C += \
|
|
||||||
hal/flexspi_nor_flash.c
|
|
||||||
|
|||||||
144
ports/mimxrt/boards/TEENSY40/qspi_nor_flash_config.c
Normal file
144
ports/mimxrt/boards/TEENSY40/qspi_nor_flash_config.c
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Based on tinyusb/hw/bsp/teensy_40/teensy40_flexspi_nor_config.c
|
||||||
|
|
||||||
|
#include BOARD_FLASH_CONFIG_HEADER_H
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
||||||
|
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
|
||||||
|
__attribute__((section(".boot_hdr.conf")))
|
||||||
|
#elif defined(__ICCARM__)
|
||||||
|
#pragma location = ".boot_hdr.conf"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const flexspi_nor_config_t qspiflash_config = {
|
||||||
|
.memConfig =
|
||||||
|
{
|
||||||
|
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||||
|
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||||
|
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||||
|
.csHoldTime = 3u,
|
||||||
|
.csSetupTime = 3u,
|
||||||
|
|
||||||
|
.busyOffset = FLASH_BUSY_STATUS_OFFSET, // Status bit 0 indicates busy.
|
||||||
|
.busyBitPolarity = FLASH_BUSY_STATUS_POL, // Busy when the bit is 1.
|
||||||
|
|
||||||
|
.deviceModeCfgEnable = 1u,
|
||||||
|
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
|
||||||
|
.deviceModeSeq = {
|
||||||
|
.seqId = 4u,
|
||||||
|
.seqNum = 1u,
|
||||||
|
},
|
||||||
|
.deviceModeArg = 0x0200,
|
||||||
|
.configCmdEnable = 1u,
|
||||||
|
.configModeType[0] = kDeviceConfigCmdType_Generic,
|
||||||
|
.configCmdSeqs[0] = {
|
||||||
|
.seqId = 2u,
|
||||||
|
.seqNum = 1u,
|
||||||
|
},
|
||||||
|
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||||
|
// Enable DDR mode, Wordaddassable, Safe configuration, Differential clock
|
||||||
|
.sflashPadType = kSerialFlash_4Pads,
|
||||||
|
.serialClkFreq = kFlexSpiSerialClk_60MHz,
|
||||||
|
.sflashA1Size = BOARD_FLASH_SIZE,
|
||||||
|
.lookupTable =
|
||||||
|
{
|
||||||
|
// 0 Read LUTs 0 -> 0
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 1 Read status register -> 1
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x01),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 2 Fast read quad mode - SDR
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x6B, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x08, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 3 Write Enable -> 3
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 4 Read extend parameters
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x81, READ_SDR, FLEXSPI_1PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 5 Erase Sector -> 5
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 6 Write Status Reg
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01, WRITE_SDR, FLEXSPI_1PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 7 Page Program - quad mode (-> 9)
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 8 Read ID
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x90, DUMMY_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_1PAD, 0x00, 0, 0, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 9 Page Program - single mode -> 9
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0, 0, 0, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 10 Enter QPI mode
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x35, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 11 Erase Chip
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 12 Exit QPI mode
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_4PAD, 0xF5, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.pageSize = 256u,
|
||||||
|
.sectorSize = 4u * 1024u,
|
||||||
|
.ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
|
||||||
|
.blockSize = 0x00010000,
|
||||||
|
.isUniformBlockSize = false,
|
||||||
|
};
|
||||||
|
#endif /* XIP_BOOT_HEADER_ENABLE */
|
||||||
@@ -1,259 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Based on tinyusb/hw/bsp/teensy_40/teensy40_flexspi_nor_config.h
|
|
||||||
|
|
||||||
#ifndef __TEENSY40_FLEXSPI_NOR_CONFIG__
|
|
||||||
#define __TEENSY40_FLEXSPI_NOR_CONFIG__
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include "fsl_common.h"
|
|
||||||
|
|
||||||
/*! @name Driver version */
|
|
||||||
/*@{*/
|
|
||||||
/*! @brief XIP_BOARD driver version 2.0.0. */
|
|
||||||
#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
|
|
||||||
/*@}*/
|
|
||||||
|
|
||||||
/* FLEXSPI memory config block related defintions */
|
|
||||||
#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian
|
|
||||||
#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0
|
|
||||||
#define FLEXSPI_CFG_BLK_SIZE (512)
|
|
||||||
|
|
||||||
/* FLEXSPI Feature related definitions */
|
|
||||||
#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
|
|
||||||
|
|
||||||
/* Lookup table related definitions */
|
|
||||||
#define CMD_INDEX_READ 0
|
|
||||||
#define CMD_INDEX_READSTATUS 1
|
|
||||||
#define CMD_INDEX_WRITEENABLE 2
|
|
||||||
#define CMD_INDEX_WRITE 4
|
|
||||||
|
|
||||||
#define CMD_LUT_SEQ_IDX_READ 0
|
|
||||||
#define CMD_LUT_SEQ_IDX_READSTATUS 1
|
|
||||||
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
|
||||||
#define CMD_LUT_SEQ_IDX_ERASE 5
|
|
||||||
#define CMD_LUT_SEQ_IDX_WRITE 9
|
|
||||||
|
|
||||||
#define CMD_SDR 0x01
|
|
||||||
#define CMD_DDR 0x21
|
|
||||||
#define RADDR_SDR 0x02
|
|
||||||
#define RADDR_DDR 0x22
|
|
||||||
#define CADDR_SDR 0x03
|
|
||||||
#define CADDR_DDR 0x23
|
|
||||||
#define MODE1_SDR 0x04
|
|
||||||
#define MODE1_DDR 0x24
|
|
||||||
#define MODE2_SDR 0x05
|
|
||||||
#define MODE2_DDR 0x25
|
|
||||||
#define MODE4_SDR 0x06
|
|
||||||
#define MODE4_DDR 0x26
|
|
||||||
#define MODE8_SDR 0x07
|
|
||||||
#define MODE8_DDR 0x27
|
|
||||||
#define WRITE_SDR 0x08
|
|
||||||
#define WRITE_DDR 0x28
|
|
||||||
#define READ_SDR 0x09
|
|
||||||
#define READ_DDR 0x29
|
|
||||||
#define LEARN_SDR 0x0A
|
|
||||||
#define LEARN_DDR 0x2A
|
|
||||||
#define DATSZ_SDR 0x0B
|
|
||||||
#define DATSZ_DDR 0x2B
|
|
||||||
#define DUMMY_SDR 0x0C
|
|
||||||
#define DUMMY_DDR 0x2C
|
|
||||||
#define DUMMY_RWDS_SDR 0x0D
|
|
||||||
#define DUMMY_RWDS_DDR 0x2D
|
|
||||||
#define JMP_ON_CS 0x1F
|
|
||||||
#define STOP 0
|
|
||||||
|
|
||||||
#define FLEXSPI_1PAD 0
|
|
||||||
#define FLEXSPI_2PAD 1
|
|
||||||
#define FLEXSPI_4PAD 2
|
|
||||||
#define FLEXSPI_8PAD 3
|
|
||||||
|
|
||||||
#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
|
|
||||||
(FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
|
|
||||||
FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
|
||||||
|
|
||||||
//!@brief Definitions for FlexSPI Serial Clock Frequency
|
|
||||||
typedef enum _FlexSpiSerialClockFreq
|
|
||||||
{
|
|
||||||
kFlexSpiSerialClk_30MHz = 1,
|
|
||||||
kFlexSpiSerialClk_50MHz = 2,
|
|
||||||
kFlexSpiSerialClk_60MHz = 3,
|
|
||||||
kFlexSpiSerialClk_75MHz = 4,
|
|
||||||
kFlexSpiSerialClk_80MHz = 5,
|
|
||||||
kFlexSpiSerialClk_100MHz = 6,
|
|
||||||
kFlexSpiSerialClk_120MHz = 7,
|
|
||||||
kFlexSpiSerialClk_133MHz = 8,
|
|
||||||
kFlexSpiSerialClk_166MHz = 9,
|
|
||||||
} flexspi_serial_clk_freq_t;
|
|
||||||
|
|
||||||
//!@brief FlexSPI clock configuration type
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiClk_SDR, //!< Clock configure for SDR mode
|
|
||||||
kFlexSpiClk_DDR, //!< Clock configurat for DDR mode
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI Read Sample Clock Source definition
|
|
||||||
typedef enum _FlashReadSampleClkSource
|
|
||||||
{
|
|
||||||
kFlexSPIReadSampleClk_LoopbackInternally = 0,
|
|
||||||
kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
|
|
||||||
kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
|
|
||||||
kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
|
|
||||||
} flexspi_read_sample_clk_t;
|
|
||||||
|
|
||||||
//!@brief Misc feature bit definitions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiMiscOffset_DiffClkEnable = 0, //!< Bit for Differential clock enable
|
|
||||||
kFlexSpiMiscOffset_Ck2Enable = 1, //!< Bit for CK2 enable
|
|
||||||
kFlexSpiMiscOffset_ParallelEnable = 2, //!< Bit for Parallel mode enable
|
|
||||||
kFlexSpiMiscOffset_WordAddressableEnable = 3, //!< Bit for Word Addressable enable
|
|
||||||
kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, //!< Bit for Safe Configuration Frequency enable
|
|
||||||
kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable
|
|
||||||
kFlexSpiMiscOffset_DdrModeEnable = 6, //!< Bit for DDR clock confiuration indication.
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief Flash Type Definition
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiDeviceType_SerialNOR = 1, //!< Flash devices are Serial NOR
|
|
||||||
kFlexSpiDeviceType_SerialNAND = 2, //!< Flash devices are Serial NAND
|
|
||||||
kFlexSpiDeviceType_SerialRAM = 3, //!< Flash devices are Serial RAM/HyperFLASH
|
|
||||||
kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND
|
|
||||||
kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, //!< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief Flash Pad Definitions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kSerialFlash_1Pad = 1,
|
|
||||||
kSerialFlash_2Pads = 2,
|
|
||||||
kSerialFlash_4Pads = 4,
|
|
||||||
kSerialFlash_8Pads = 8,
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI LUT Sequence structure
|
|
||||||
typedef struct _lut_sequence
|
|
||||||
{
|
|
||||||
uint8_t seqNum; //!< Sequence Number, valid number: 1-16
|
|
||||||
uint8_t seqId; //!< Sequence Index, valid number: 0-15
|
|
||||||
uint16_t reserved;
|
|
||||||
} flexspi_lut_seq_t;
|
|
||||||
|
|
||||||
//!@brief Flash Configuration Command Type
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kDeviceConfigCmdType_Generic, //!< Generic command, for example: configure dummy cycles, drive strength, etc
|
|
||||||
kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command
|
|
||||||
kDeviceConfigCmdType_Spi2Xpi, //!< Switch from SPI to DPI/QPI/OPI mode
|
|
||||||
kDeviceConfigCmdType_Xpi2Spi, //!< Switch from DPI/QPI/OPI to SPI mode
|
|
||||||
kDeviceConfigCmdType_Spi2NoCmd, //!< Switch to 0-4-4/0-8-8 mode
|
|
||||||
kDeviceConfigCmdType_Reset, //!< Reset device command
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI Memory Configuration Block
|
|
||||||
typedef struct _FlexSPIConfig
|
|
||||||
{
|
|
||||||
uint32_t tag; //!< [0x000-0x003] Tag, fixed value 0x42464346UL
|
|
||||||
uint32_t version; //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix
|
|
||||||
uint32_t reserved0; //!< [0x008-0x00b] Reserved for future use
|
|
||||||
uint8_t readSampleClkSrc; //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3
|
|
||||||
uint8_t csHoldTime; //!< [0x00d-0x00d] CS hold time, default value: 3
|
|
||||||
uint8_t csSetupTime; //!< [0x00e-0x00e] CS setup time, default value: 3
|
|
||||||
uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
|
|
||||||
//! Serial NAND, need to refer to datasheet
|
|
||||||
uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable
|
|
||||||
uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
|
|
||||||
//! Generic configuration, etc.
|
|
||||||
uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
|
|
||||||
//! DPI/QPI/OPI switch or reset command
|
|
||||||
flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
|
|
||||||
//! sequence number, [31:16] Reserved
|
|
||||||
uint32_t deviceModeArg; //!< [0x018-0x01b] Argument/Parameter for device configuration
|
|
||||||
uint8_t configCmdEnable; //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable
|
|
||||||
uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe
|
|
||||||
flexspi_lut_seq_t
|
|
||||||
configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq
|
|
||||||
uint32_t reserved1; //!< [0x02c-0x02f] Reserved for future use
|
|
||||||
uint32_t configCmdArgs[3]; //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands
|
|
||||||
uint32_t reserved2; //!< [0x03c-0x03f] Reserved for future use
|
|
||||||
uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
|
|
||||||
//! details
|
|
||||||
uint8_t deviceType; //!< [0x044-0x044] Device Type: See Flash Type Definition for more details
|
|
||||||
uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal
|
|
||||||
uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
|
|
||||||
//! Chapter for more details
|
|
||||||
uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
|
|
||||||
//! be done using 1 LUT sequence, currently, only applicable to HyperFLASH
|
|
||||||
uint32_t reserved3[2]; //!< [0x048-0x04f] Reserved for future use
|
|
||||||
uint32_t sflashA1Size; //!< [0x050-0x053] Size of Flash connected to A1
|
|
||||||
uint32_t sflashA2Size; //!< [0x054-0x057] Size of Flash connected to A2
|
|
||||||
uint32_t sflashB1Size; //!< [0x058-0x05b] Size of Flash connected to B1
|
|
||||||
uint32_t sflashB2Size; //!< [0x05c-0x05f] Size of Flash connected to B2
|
|
||||||
uint32_t csPadSettingOverride; //!< [0x060-0x063] CS pad setting override value
|
|
||||||
uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value
|
|
||||||
uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value
|
|
||||||
uint32_t dqsPadSettingOverride; //!< [0x06c-0x06f] DQS pad setting override value
|
|
||||||
uint32_t timeoutInMs; //!< [0x070-0x073] Timeout threshold for read status command
|
|
||||||
uint32_t commandInterval; //!< [0x074-0x077] CS deselect interval between two commands
|
|
||||||
uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns
|
|
||||||
uint16_t busyOffset; //!< [0x07c-0x07d] Busy offset, valid value: 0-31
|
|
||||||
uint16_t busyBitPolarity; //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
|
|
||||||
//! busy flag is 0 when flash device is busy
|
|
||||||
uint32_t lookupTable[64]; //!< [0x080-0x17f] Lookup table holds Flash command sequences
|
|
||||||
flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences
|
|
||||||
uint32_t reserved4[4]; //!< [0x1b0-0x1bf] Reserved for future use
|
|
||||||
} flexspi_mem_config_t;
|
|
||||||
|
|
||||||
/* */
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL 0
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG 1
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD 2
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 4
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG 6
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD 7
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READID 8
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_ENTERQPI 10
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_EXITQPI 12
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Serial NOR configuration block
|
|
||||||
*/
|
|
||||||
typedef struct _flexspi_nor_config
|
|
||||||
{
|
|
||||||
flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI
|
|
||||||
uint32_t pageSize; //!< Page size of Serial NOR
|
|
||||||
uint32_t sectorSize; //!< Sector size of Serial NOR
|
|
||||||
uint8_t ipcmdSerialClkFreq; //!< Clock frequency for IP command
|
|
||||||
uint8_t isUniformBlockSize; //!< Sector/Block size is the same
|
|
||||||
uint8_t reserved0[2]; //!< Reserved for future use
|
|
||||||
uint8_t serialNorType; //!< Serial NOR Flash type: 0/1/2/3
|
|
||||||
uint8_t needExitNoCmdMode; //!< Need to exit NoCmd mode before other IP command
|
|
||||||
uint8_t halfClkForNonReadCmd; //!< Half the Serial Clock for non-read command: true/false
|
|
||||||
uint8_t needRestoreNoCmdMode; //!< Need to Restore NoCmd mode after IP commmand execution
|
|
||||||
uint32_t blockSize; //!< Block size
|
|
||||||
uint32_t reserve2[11]; //!< Reserved for future use
|
|
||||||
} flexspi_nor_config_t;
|
|
||||||
|
|
||||||
#define FLASH_BUSY_STATUS_POL 0
|
|
||||||
#define FLASH_BUSY_STATUS_OFFSET 0
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* __EVKMIMXRT1060_FLEXSPI_NOR_CONFIG__ */
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
flash_size = 8M;
|
|
||||||
reserved_size = 4K;
|
|
||||||
259
ports/mimxrt/boards/TEENSY41/TEENSY41_flexspi_nor_config.h
Normal file
259
ports/mimxrt/boards/TEENSY41/TEENSY41_flexspi_nor_config.h
Normal file
@@ -0,0 +1,259 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Based on tinyusb/hw/bsp/teensy_40/teensy40_flexspi_nor_config.h
|
||||||
|
|
||||||
|
#ifndef __TEENSY40_FLEXSPI_NOR_CONFIG__
|
||||||
|
#define __TEENSY40_FLEXSPI_NOR_CONFIG__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*! @name Driver version */
|
||||||
|
/*@{*/
|
||||||
|
/*! @brief XIP_BOARD driver version 2.0.0. */
|
||||||
|
#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
/* FLEXSPI memory config block related defintions */
|
||||||
|
#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian
|
||||||
|
#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0
|
||||||
|
#define FLEXSPI_CFG_BLK_SIZE (512)
|
||||||
|
|
||||||
|
/* FLEXSPI Feature related definitions */
|
||||||
|
#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
|
||||||
|
|
||||||
|
/* Lookup table related definitions */
|
||||||
|
#define CMD_INDEX_READ 0
|
||||||
|
#define CMD_INDEX_READSTATUS 1
|
||||||
|
#define CMD_INDEX_WRITEENABLE 2
|
||||||
|
#define CMD_INDEX_WRITE 4
|
||||||
|
|
||||||
|
#define CMD_LUT_SEQ_IDX_READ 0
|
||||||
|
#define CMD_LUT_SEQ_IDX_READSTATUS 1
|
||||||
|
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
||||||
|
#define CMD_LUT_SEQ_IDX_ERASE 5
|
||||||
|
#define CMD_LUT_SEQ_IDX_WRITE 9
|
||||||
|
|
||||||
|
#define CMD_SDR 0x01
|
||||||
|
#define CMD_DDR 0x21
|
||||||
|
#define RADDR_SDR 0x02
|
||||||
|
#define RADDR_DDR 0x22
|
||||||
|
#define CADDR_SDR 0x03
|
||||||
|
#define CADDR_DDR 0x23
|
||||||
|
#define MODE1_SDR 0x04
|
||||||
|
#define MODE1_DDR 0x24
|
||||||
|
#define MODE2_SDR 0x05
|
||||||
|
#define MODE2_DDR 0x25
|
||||||
|
#define MODE4_SDR 0x06
|
||||||
|
#define MODE4_DDR 0x26
|
||||||
|
#define MODE8_SDR 0x07
|
||||||
|
#define MODE8_DDR 0x27
|
||||||
|
#define WRITE_SDR 0x08
|
||||||
|
#define WRITE_DDR 0x28
|
||||||
|
#define READ_SDR 0x09
|
||||||
|
#define READ_DDR 0x29
|
||||||
|
#define LEARN_SDR 0x0A
|
||||||
|
#define LEARN_DDR 0x2A
|
||||||
|
#define DATSZ_SDR 0x0B
|
||||||
|
#define DATSZ_DDR 0x2B
|
||||||
|
#define DUMMY_SDR 0x0C
|
||||||
|
#define DUMMY_DDR 0x2C
|
||||||
|
#define DUMMY_RWDS_SDR 0x0D
|
||||||
|
#define DUMMY_RWDS_DDR 0x2D
|
||||||
|
#define JMP_ON_CS 0x1F
|
||||||
|
#define STOP 0
|
||||||
|
|
||||||
|
#define FLEXSPI_1PAD 0
|
||||||
|
#define FLEXSPI_2PAD 1
|
||||||
|
#define FLEXSPI_4PAD 2
|
||||||
|
#define FLEXSPI_8PAD 3
|
||||||
|
|
||||||
|
#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
|
||||||
|
(FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
|
||||||
|
FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
||||||
|
|
||||||
|
// !@brief Definitions for FlexSPI Serial Clock Frequency
|
||||||
|
typedef enum _FlexSpiSerialClockFreq
|
||||||
|
{
|
||||||
|
kFlexSpiSerialClk_30MHz = 1,
|
||||||
|
kFlexSpiSerialClk_50MHz = 2,
|
||||||
|
kFlexSpiSerialClk_60MHz = 3,
|
||||||
|
kFlexSpiSerialClk_75MHz = 4,
|
||||||
|
kFlexSpiSerialClk_80MHz = 5,
|
||||||
|
kFlexSpiSerialClk_100MHz = 6,
|
||||||
|
kFlexSpiSerialClk_120MHz = 7,
|
||||||
|
kFlexSpiSerialClk_133MHz = 8,
|
||||||
|
kFlexSpiSerialClk_166MHz = 9,
|
||||||
|
} flexspi_serial_clk_freq_t;
|
||||||
|
|
||||||
|
// !@brief FlexSPI clock configuration type
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiClk_SDR, // !< Clock configure for SDR mode
|
||||||
|
kFlexSpiClk_DDR, // !< Clock configurat for DDR mode
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI Read Sample Clock Source definition
|
||||||
|
typedef enum _FlashReadSampleClkSource
|
||||||
|
{
|
||||||
|
kFlexSPIReadSampleClk_LoopbackInternally = 0,
|
||||||
|
kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
|
||||||
|
kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
|
||||||
|
kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
|
||||||
|
} flexspi_read_sample_clk_t;
|
||||||
|
|
||||||
|
// !@brief Misc feature bit definitions
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiMiscOffset_DiffClkEnable = 0, // !< Bit for Differential clock enable
|
||||||
|
kFlexSpiMiscOffset_Ck2Enable = 1, // !< Bit for CK2 enable
|
||||||
|
kFlexSpiMiscOffset_ParallelEnable = 2, // !< Bit for Parallel mode enable
|
||||||
|
kFlexSpiMiscOffset_WordAddressableEnable = 3, // !< Bit for Word Addressable enable
|
||||||
|
kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, // !< Bit for Safe Configuration Frequency enable
|
||||||
|
kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, // !< Bit for Pad setting override enable
|
||||||
|
kFlexSpiMiscOffset_DdrModeEnable = 6, // !< Bit for DDR clock confiuration indication.
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief Flash Type Definition
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kFlexSpiDeviceType_SerialNOR = 1, // !< Flash devices are Serial NOR
|
||||||
|
kFlexSpiDeviceType_SerialNAND = 2, // !< Flash devices are Serial NAND
|
||||||
|
kFlexSpiDeviceType_SerialRAM = 3, // !< Flash devices are Serial RAM/HyperFLASH
|
||||||
|
kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, // !< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND
|
||||||
|
kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, // !< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief Flash Pad Definitions
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kSerialFlash_1Pad = 1,
|
||||||
|
kSerialFlash_2Pads = 2,
|
||||||
|
kSerialFlash_4Pads = 4,
|
||||||
|
kSerialFlash_8Pads = 8,
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI LUT Sequence structure
|
||||||
|
typedef struct _lut_sequence
|
||||||
|
{
|
||||||
|
uint8_t seqNum; // !< Sequence Number, valid number: 1-16
|
||||||
|
uint8_t seqId; // !< Sequence Index, valid number: 0-15
|
||||||
|
uint16_t reserved;
|
||||||
|
} flexspi_lut_seq_t;
|
||||||
|
|
||||||
|
// !@brief Flash Configuration Command Type
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kDeviceConfigCmdType_Generic, // !< Generic command, for example: configure dummy cycles, drive strength, etc
|
||||||
|
kDeviceConfigCmdType_QuadEnable, // !< Quad Enable command
|
||||||
|
kDeviceConfigCmdType_Spi2Xpi, // !< Switch from SPI to DPI/QPI/OPI mode
|
||||||
|
kDeviceConfigCmdType_Xpi2Spi, // !< Switch from DPI/QPI/OPI to SPI mode
|
||||||
|
kDeviceConfigCmdType_Spi2NoCmd, // !< Switch to 0-4-4/0-8-8 mode
|
||||||
|
kDeviceConfigCmdType_Reset, // !< Reset device command
|
||||||
|
};
|
||||||
|
|
||||||
|
// !@brief FlexSPI Memory Configuration Block
|
||||||
|
typedef struct _FlexSPIConfig
|
||||||
|
{
|
||||||
|
uint32_t tag; // !< [0x000-0x003] Tag, fixed value 0x42464346UL
|
||||||
|
uint32_t version; // !< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix
|
||||||
|
uint32_t reserved0; // !< [0x008-0x00b] Reserved for future use
|
||||||
|
uint8_t readSampleClkSrc; // !< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3
|
||||||
|
uint8_t csHoldTime; // !< [0x00d-0x00d] CS hold time, default value: 3
|
||||||
|
uint8_t csSetupTime; // !< [0x00e-0x00e] CS setup time, default value: 3
|
||||||
|
uint8_t columnAddressWidth; // !< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
|
||||||
|
// ! Serial NAND, need to refer to datasheet
|
||||||
|
uint8_t deviceModeCfgEnable; // !< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable
|
||||||
|
uint8_t deviceModeType; // !< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
|
||||||
|
// ! Generic configuration, etc.
|
||||||
|
uint16_t waitTimeCfgCommands; // !< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
|
||||||
|
// ! DPI/QPI/OPI switch or reset command
|
||||||
|
flexspi_lut_seq_t deviceModeSeq; // !< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
|
||||||
|
// ! sequence number, [31:16] Reserved
|
||||||
|
uint32_t deviceModeArg; // !< [0x018-0x01b] Argument/Parameter for device configuration
|
||||||
|
uint8_t configCmdEnable; // !< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable
|
||||||
|
uint8_t configModeType[3]; // !< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe
|
||||||
|
flexspi_lut_seq_t
|
||||||
|
configCmdSeqs[3]; // !< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq
|
||||||
|
uint32_t reserved1; // !< [0x02c-0x02f] Reserved for future use
|
||||||
|
uint32_t configCmdArgs[3]; // !< [0x030-0x03b] Arguments/Parameters for device Configuration commands
|
||||||
|
uint32_t reserved2; // !< [0x03c-0x03f] Reserved for future use
|
||||||
|
uint32_t controllerMiscOption; // !< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
|
||||||
|
// ! details
|
||||||
|
uint8_t deviceType; // !< [0x044-0x044] Device Type: See Flash Type Definition for more details
|
||||||
|
uint8_t sflashPadType; // !< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal
|
||||||
|
uint8_t serialClkFreq; // !< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
|
||||||
|
// ! Chapter for more details
|
||||||
|
uint8_t lutCustomSeqEnable; // !< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
|
||||||
|
// ! be done using 1 LUT sequence, currently, only applicable to HyperFLASH
|
||||||
|
uint32_t reserved3[2]; // !< [0x048-0x04f] Reserved for future use
|
||||||
|
uint32_t sflashA1Size; // !< [0x050-0x053] Size of Flash connected to A1
|
||||||
|
uint32_t sflashA2Size; // !< [0x054-0x057] Size of Flash connected to A2
|
||||||
|
uint32_t sflashB1Size; // !< [0x058-0x05b] Size of Flash connected to B1
|
||||||
|
uint32_t sflashB2Size; // !< [0x05c-0x05f] Size of Flash connected to B2
|
||||||
|
uint32_t csPadSettingOverride; // !< [0x060-0x063] CS pad setting override value
|
||||||
|
uint32_t sclkPadSettingOverride; // !< [0x064-0x067] SCK pad setting override value
|
||||||
|
uint32_t dataPadSettingOverride; // !< [0x068-0x06b] data pad setting override value
|
||||||
|
uint32_t dqsPadSettingOverride; // !< [0x06c-0x06f] DQS pad setting override value
|
||||||
|
uint32_t timeoutInMs; // !< [0x070-0x073] Timeout threshold for read status command
|
||||||
|
uint32_t commandInterval; // !< [0x074-0x077] CS deselect interval between two commands
|
||||||
|
uint16_t dataValidTime[2]; // !< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns
|
||||||
|
uint16_t busyOffset; // !< [0x07c-0x07d] Busy offset, valid value: 0-31
|
||||||
|
uint16_t busyBitPolarity; // !< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
|
||||||
|
// ! busy flag is 0 when flash device is busy
|
||||||
|
uint32_t lookupTable[64]; // !< [0x080-0x17f] Lookup table holds Flash command sequences
|
||||||
|
flexspi_lut_seq_t lutCustomSeq[12]; // !< [0x180-0x1af] Customizable LUT Sequences
|
||||||
|
uint32_t reserved4[4]; // !< [0x1b0-0x1bf] Reserved for future use
|
||||||
|
} flexspi_mem_config_t;
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL 0
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG 1
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD 2
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 4
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG 6
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD 7
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_READID 8
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_ENTERQPI 10
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
|
||||||
|
#define NOR_CMD_LUT_SEQ_IDX_EXITQPI 12
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Serial NOR configuration block
|
||||||
|
*/
|
||||||
|
typedef struct _flexspi_nor_config
|
||||||
|
{
|
||||||
|
flexspi_mem_config_t memConfig; // !< Common memory configuration info via FlexSPI
|
||||||
|
uint32_t pageSize; // !< Page size of Serial NOR
|
||||||
|
uint32_t sectorSize; // !< Sector size of Serial NOR
|
||||||
|
uint8_t ipcmdSerialClkFreq; // !< Clock frequency for IP command
|
||||||
|
uint8_t isUniformBlockSize; // !< Sector/Block size is the same
|
||||||
|
uint8_t reserved0[2]; // !< Reserved for future use
|
||||||
|
uint8_t serialNorType; // !< Serial NOR Flash type: 0/1/2/3
|
||||||
|
uint8_t needExitNoCmdMode; // !< Need to exit NoCmd mode before other IP command
|
||||||
|
uint8_t halfClkForNonReadCmd; // !< Half the Serial Clock for non-read command: true/false
|
||||||
|
uint8_t needRestoreNoCmdMode; // !< Need to Restore NoCmd mode after IP commmand execution
|
||||||
|
uint32_t blockSize; // !< Block size
|
||||||
|
uint32_t reserve2[11]; // !< Reserved for future use
|
||||||
|
} flexspi_nor_config_t;
|
||||||
|
|
||||||
|
#define FLASH_BUSY_STATUS_POL 0
|
||||||
|
#define FLASH_BUSY_STATUS_OFFSET 0
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* __EVKMIMXRT1060_FLEXSPI_NOR_CONFIG__ */
|
||||||
122
ports/mimxrt/boards/TEENSY41/clock_config.h
Normal file
122
ports/mimxrt/boards/TEENSY41/clock_config.h
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018-2019 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CLOCK_CONFIG_H_
|
||||||
|
#define _CLOCK_CONFIG_H_
|
||||||
|
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_XTAL0_CLK_HZ 24000000U /*!< Board xtal0 frequency in Hz */
|
||||||
|
|
||||||
|
#define BOARD_XTAL32K_CLK_HZ 32768U /*!< Board xtal32k frequency in Hz */
|
||||||
|
/*******************************************************************************
|
||||||
|
************************ BOARD_InitBootClocks function ************************
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes default configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_InitBootClocks(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
********************** Configuration BOARD_BootClockRUN ***********************
|
||||||
|
******************************************************************************/
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions for BOARD_BootClockRUN configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CORE_CLOCK 600000000U /*!< Core clock frequency: 600000000Hz */
|
||||||
|
|
||||||
|
/* Clock outputs (values are in Hz): */
|
||||||
|
#define BOARD_BOOTCLOCKRUN_AHB_CLK_ROOT 600000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CAN_CLK_ROOT 40000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT 32768UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLKO1_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLKO2_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLK_1M 1000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CLK_24M 24000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_CSI_CLK_ROOT 12000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET1_TX_CLK 2400000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET2_125M_CLK 1200000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET2_TX_CLK 1200000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET_125M_CLK 2400000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_ENET_25M_REF_CLK 1200000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXIO2_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXSPI2_CLK_ROOT 130909090UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT 130909090UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT 150000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LCDIF_CLK_ROOT 9642857UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT 60000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT 105600000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_LVDS1_CLK 1200000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_MQS_MCLK 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_PLL7_MAIN_CLK 24000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK2 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI2_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1 63529411UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SEMC_CLK_ROOT 75000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT 30000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT 117333333UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT 80000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USBPHY1_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USBPHY2_CLK 0UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USDHC1_CLK_ROOT 198000000UL
|
||||||
|
#define BOARD_BOOTCLOCKRUN_USDHC2_CLK_ROOT 198000000UL
|
||||||
|
|
||||||
|
/*! @brief Arm PLL set for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN;
|
||||||
|
/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;
|
||||||
|
/*! @brief Sys PLL for BOARD_BootClockRUN configuration.
|
||||||
|
*/
|
||||||
|
extern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API for BOARD_BootClockRUN configuration
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This function executes configuration of clocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void BOARD_BootClockRUN(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus*/
|
||||||
|
|
||||||
|
#endif /* _CLOCK_CONFIG_H_ */
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Based on tinyusb/hw/bsp/teensy_40/teensy40_flexspi_nor_config.c
|
|
||||||
|
|
||||||
#include "teensy41_flexspi_nor_config.h"
|
|
||||||
|
|
||||||
/* Component ID definition, used by tools. */
|
|
||||||
#ifndef FSL_COMPONENT_ID
|
|
||||||
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Code
|
|
||||||
******************************************************************************/
|
|
||||||
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
|
||||||
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
|
|
||||||
__attribute__((section(".boot_hdr.conf")))
|
|
||||||
#elif defined(__ICCARM__)
|
|
||||||
#pragma location = ".boot_hdr.conf"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const flexspi_nor_config_t qspiflash_config = {
|
|
||||||
.memConfig =
|
|
||||||
{
|
|
||||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
|
||||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
|
||||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
|
||||||
.csHoldTime = 3u,
|
|
||||||
.csSetupTime = 3u,
|
|
||||||
|
|
||||||
.busyOffset = FLASH_BUSY_STATUS_OFFSET, // Status bit 0 indicates busy.
|
|
||||||
.busyBitPolarity = FLASH_BUSY_STATUS_POL, // Busy when the bit is 1.
|
|
||||||
|
|
||||||
.deviceModeCfgEnable = 1u,
|
|
||||||
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
|
|
||||||
.deviceModeSeq = {
|
|
||||||
.seqId = 4u,
|
|
||||||
.seqNum = 1u,
|
|
||||||
},
|
|
||||||
.deviceModeArg = 0x0200,
|
|
||||||
.configCmdEnable = 1u,
|
|
||||||
.configModeType[0] = kDeviceConfigCmdType_Generic,
|
|
||||||
.configCmdSeqs[0] = {
|
|
||||||
.seqId = 2u,
|
|
||||||
.seqNum = 1u,
|
|
||||||
},
|
|
||||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
|
||||||
// Enable DDR mode, Wordaddassable, Safe configuration, Differential clock
|
|
||||||
.sflashPadType = kSerialFlash_4Pads,
|
|
||||||
.serialClkFreq = kFlexSpiSerialClk_60MHz,
|
|
||||||
.sflashA1Size = 8u * 1024u * 1024u,
|
|
||||||
.lookupTable =
|
|
||||||
{
|
|
||||||
// 0 Read LUTs 0 -> 0
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
|
||||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 1 Read status register -> 1
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x01),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 2 Fast read quad mode - SDR
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x6B, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
|
||||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x08, READ_SDR, FLEXSPI_4PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 3 Write Enable -> 3
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 4 Read extend parameters
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x81, READ_SDR, FLEXSPI_1PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 5 Erase Sector -> 5
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 24),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 6 Write Status Reg
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01, WRITE_SDR, FLEXSPI_1PAD, 0x04),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 7 Page Program - quad mode (-> 9)
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
|
||||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 8 Read ID
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x90, DUMMY_SDR, FLEXSPI_1PAD, 24),
|
|
||||||
FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_1PAD, 0x00, 0, 0, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 9 Page Program - single mode -> 9
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 24),
|
|
||||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0, 0, 0, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 10 Enter QPI mode
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x35, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 11 Erase Chip
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
|
|
||||||
// 12 Exit QPI mode
|
|
||||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_4PAD, 0xF5, STOP, FLEXSPI_1PAD, 0),
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.pageSize = 256u,
|
|
||||||
.sectorSize = 4u * 1024u,
|
|
||||||
.ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
|
|
||||||
.blockSize = 0x00010000,
|
|
||||||
.isUniformBlockSize = false,
|
|
||||||
};
|
|
||||||
#endif /* XIP_BOOT_HEADER_ENABLE */
|
|
||||||
@@ -1,14 +1,10 @@
|
|||||||
#define MICROPY_HW_BOARD_NAME "Teensy 4.1"
|
#define MICROPY_HW_BOARD_NAME "Teensy 4.1"
|
||||||
#define MICROPY_HW_MCU_NAME "MIMXRT1062DVJ6A"
|
#define MICROPY_HW_MCU_NAME "MIMXRT1062DVJ6A"
|
||||||
|
|
||||||
#define BOARD_FLASH_SIZE (8 * 1024 * 1024)
|
|
||||||
|
|
||||||
// Teensy 4.1 has 1 board LED
|
// Teensy 4.1 has 1 board LED
|
||||||
#define MICROPY_HW_LED1_PIN (pin_GPIO_B0_03)
|
#define MICROPY_HW_LED1_PIN (pin_GPIO_B0_03)
|
||||||
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
||||||
#define BOARD_FLASH_CONFIG_HEADER_H "teensy41_flexspi_nor_config.h"
|
|
||||||
#define BOARD_FLASH_OPS_HEADER_H "hal/flexspi_nor_flash.h"
|
|
||||||
|
|
||||||
#define MICROPY_HW_NUM_PIN_IRQS (4 * 32 + 3)
|
#define MICROPY_HW_NUM_PIN_IRQS (4 * 32 + 3)
|
||||||
|
|
||||||
@@ -39,10 +35,10 @@
|
|||||||
{ IOMUXC_GPIO_B0_02_LPSPI4_SDO }, { IOMUXC_GPIO_B0_01_LPSPI4_SDI },
|
{ IOMUXC_GPIO_B0_02_LPSPI4_SDO }, { IOMUXC_GPIO_B0_01_LPSPI4_SDI },
|
||||||
|
|
||||||
#define DMA_REQ_SRC_RX { 0, kDmaRequestMuxLPSPI1Rx, kDmaRequestMuxLPSPI2Rx, \
|
#define DMA_REQ_SRC_RX { 0, kDmaRequestMuxLPSPI1Rx, kDmaRequestMuxLPSPI2Rx, \
|
||||||
kDmaRequestMuxLPSPI3Rx, kDmaRequestMuxLPSPI4Rx }
|
kDmaRequestMuxLPSPI3Rx, kDmaRequestMuxLPSPI4Rx }
|
||||||
|
|
||||||
#define DMA_REQ_SRC_TX { 0, kDmaRequestMuxLPSPI1Tx, kDmaRequestMuxLPSPI2Tx, \
|
#define DMA_REQ_SRC_TX { 0, kDmaRequestMuxLPSPI1Tx, kDmaRequestMuxLPSPI2Tx, \
|
||||||
kDmaRequestMuxLPSPI3Tx, kDmaRequestMuxLPSPI4Tx }
|
kDmaRequestMuxLPSPI3Tx, kDmaRequestMuxLPSPI4Tx }
|
||||||
|
|
||||||
// Define mapping hardware I2C # to logical I2C #
|
// Define mapping hardware I2C # to logical I2C #
|
||||||
// SDA/SCL HW-I2C Logical I2C
|
// SDA/SCL HW-I2C Logical I2C
|
||||||
@@ -63,9 +59,9 @@
|
|||||||
{ \
|
{ \
|
||||||
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
|
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
|
||||||
.clk = { GPIO_SD_B0_01_USDHC1_CLK }, \
|
.clk = { GPIO_SD_B0_01_USDHC1_CLK }, \
|
||||||
.cd_b = { USDHC_DUMMY_PIN },\
|
.cd_b = { USDHC_DUMMY_PIN }, \
|
||||||
.data0 = { GPIO_SD_B0_02_USDHC1_DATA0 },\
|
.data0 = { GPIO_SD_B0_02_USDHC1_DATA0 }, \
|
||||||
.data1 = { GPIO_SD_B0_03_USDHC1_DATA1 },\
|
.data1 = { GPIO_SD_B0_03_USDHC1_DATA1 }, \
|
||||||
.data2 = { GPIO_SD_B0_04_USDHC1_DATA2 },\
|
.data2 = { GPIO_SD_B0_04_USDHC1_DATA2 }, \
|
||||||
.data3 = { GPIO_SD_B0_05_USDHC1_DATA3 },\
|
.data3 = { GPIO_SD_B0_05_USDHC1_DATA3 }, \
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ MCU_VARIANT = MIMXRT1062DVJ6A
|
|||||||
|
|
||||||
MICROPY_FLOAT_IMPL = double
|
MICROPY_FLOAT_IMPL = double
|
||||||
MICROPY_PY_MACHINE_SDCARD = 1
|
MICROPY_PY_MACHINE_SDCARD = 1
|
||||||
|
BOARD_FLASH_TYPE ?= qspi_nor
|
||||||
|
BOARD_FLASH_SIZE ?= 0x800000 # 8MB
|
||||||
|
BOARD_FLASH_RESERVED ?= 0x1000 # 4KB
|
||||||
|
|
||||||
deploy: $(BUILD)/firmware.hex
|
deploy: $(BUILD)/firmware.hex
|
||||||
teensy_loader_cli --mcu=imxrt1062 -v -w $<
|
teensy_loader_cli --mcu=imxrt1062 -v -w $<
|
||||||
|
|
||||||
SRC_C += \
|
|
||||||
hal/flexspi_nor_flash.c
|
|
||||||
|
|||||||
144
ports/mimxrt/boards/TEENSY41/qspi_nor_flash_config.c
Normal file
144
ports/mimxrt/boards/TEENSY41/qspi_nor_flash_config.c
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 NXP
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Based on tinyusb/hw/bsp/teensy_40/teensy40_flexspi_nor_config.c
|
||||||
|
|
||||||
|
#include BOARD_FLASH_CONFIG_HEADER_H
|
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */
|
||||||
|
#ifndef FSL_COMPONENT_ID
|
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
||||||
|
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
|
||||||
|
__attribute__((section(".boot_hdr.conf")))
|
||||||
|
#elif defined(__ICCARM__)
|
||||||
|
#pragma location = ".boot_hdr.conf"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const flexspi_nor_config_t qspiflash_config = {
|
||||||
|
.memConfig =
|
||||||
|
{
|
||||||
|
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||||
|
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||||
|
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||||
|
.csHoldTime = 3u,
|
||||||
|
.csSetupTime = 3u,
|
||||||
|
|
||||||
|
.busyOffset = FLASH_BUSY_STATUS_OFFSET, // Status bit 0 indicates busy.
|
||||||
|
.busyBitPolarity = FLASH_BUSY_STATUS_POL, // Busy when the bit is 1.
|
||||||
|
|
||||||
|
.deviceModeCfgEnable = 1u,
|
||||||
|
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
|
||||||
|
.deviceModeSeq = {
|
||||||
|
.seqId = 4u,
|
||||||
|
.seqNum = 1u,
|
||||||
|
},
|
||||||
|
.deviceModeArg = 0x0200,
|
||||||
|
.configCmdEnable = 1u,
|
||||||
|
.configModeType[0] = kDeviceConfigCmdType_Generic,
|
||||||
|
.configCmdSeqs[0] = {
|
||||||
|
.seqId = 2u,
|
||||||
|
.seqNum = 1u,
|
||||||
|
},
|
||||||
|
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||||
|
// Enable DDR mode, Wordaddassable, Safe configuration, Differential clock
|
||||||
|
.sflashPadType = kSerialFlash_4Pads,
|
||||||
|
.serialClkFreq = kFlexSpiSerialClk_60MHz,
|
||||||
|
.sflashA1Size = BOARD_FLASH_SIZE,
|
||||||
|
.lookupTable =
|
||||||
|
{
|
||||||
|
// 0 Read LUTs 0 -> 0
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 1 Read status register -> 1
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x01),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 2 Fast read quad mode - SDR
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x6B, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x08, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 3 Write Enable -> 3
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 4 Read extend parameters
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x81, READ_SDR, FLEXSPI_1PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 5 Erase Sector -> 5
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 6 Write Status Reg
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01, WRITE_SDR, FLEXSPI_1PAD, 0x04),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 7 Page Program - quad mode (-> 9)
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
||||||
|
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 8 Read ID
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x90, DUMMY_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_1PAD, 0x00, 0, 0, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 9 Page Program - single mode -> 9
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 24),
|
||||||
|
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0, 0, 0, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 10 Enter QPI mode
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x35, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 11 Erase Chip
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
|
||||||
|
// 12 Exit QPI mode
|
||||||
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_4PAD, 0xF5, STOP, FLEXSPI_1PAD, 0),
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.pageSize = 256u,
|
||||||
|
.sectorSize = 4u * 1024u,
|
||||||
|
.ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
|
||||||
|
.blockSize = 0x00010000,
|
||||||
|
.isUniformBlockSize = false,
|
||||||
|
};
|
||||||
|
#endif /* XIP_BOOT_HEADER_ENABLE */
|
||||||
@@ -1,259 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Based on tinyusb/hw/bsp/teensy_40/teensy40_flexspi_nor_config.h
|
|
||||||
|
|
||||||
#ifndef __TEENSY40_FLEXSPI_NOR_CONFIG__
|
|
||||||
#define __TEENSY40_FLEXSPI_NOR_CONFIG__
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include "fsl_common.h"
|
|
||||||
|
|
||||||
/*! @name Driver version */
|
|
||||||
/*@{*/
|
|
||||||
/*! @brief XIP_BOARD driver version 2.0.0. */
|
|
||||||
#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
|
|
||||||
/*@}*/
|
|
||||||
|
|
||||||
/* FLEXSPI memory config block related defintions */
|
|
||||||
#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian
|
|
||||||
#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0
|
|
||||||
#define FLEXSPI_CFG_BLK_SIZE (512)
|
|
||||||
|
|
||||||
/* FLEXSPI Feature related definitions */
|
|
||||||
#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
|
|
||||||
|
|
||||||
/* Lookup table related definitions */
|
|
||||||
#define CMD_INDEX_READ 0
|
|
||||||
#define CMD_INDEX_READSTATUS 1
|
|
||||||
#define CMD_INDEX_WRITEENABLE 2
|
|
||||||
#define CMD_INDEX_WRITE 4
|
|
||||||
|
|
||||||
#define CMD_LUT_SEQ_IDX_READ 0
|
|
||||||
#define CMD_LUT_SEQ_IDX_READSTATUS 1
|
|
||||||
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
|
||||||
#define CMD_LUT_SEQ_IDX_ERASE 5
|
|
||||||
#define CMD_LUT_SEQ_IDX_WRITE 9
|
|
||||||
|
|
||||||
#define CMD_SDR 0x01
|
|
||||||
#define CMD_DDR 0x21
|
|
||||||
#define RADDR_SDR 0x02
|
|
||||||
#define RADDR_DDR 0x22
|
|
||||||
#define CADDR_SDR 0x03
|
|
||||||
#define CADDR_DDR 0x23
|
|
||||||
#define MODE1_SDR 0x04
|
|
||||||
#define MODE1_DDR 0x24
|
|
||||||
#define MODE2_SDR 0x05
|
|
||||||
#define MODE2_DDR 0x25
|
|
||||||
#define MODE4_SDR 0x06
|
|
||||||
#define MODE4_DDR 0x26
|
|
||||||
#define MODE8_SDR 0x07
|
|
||||||
#define MODE8_DDR 0x27
|
|
||||||
#define WRITE_SDR 0x08
|
|
||||||
#define WRITE_DDR 0x28
|
|
||||||
#define READ_SDR 0x09
|
|
||||||
#define READ_DDR 0x29
|
|
||||||
#define LEARN_SDR 0x0A
|
|
||||||
#define LEARN_DDR 0x2A
|
|
||||||
#define DATSZ_SDR 0x0B
|
|
||||||
#define DATSZ_DDR 0x2B
|
|
||||||
#define DUMMY_SDR 0x0C
|
|
||||||
#define DUMMY_DDR 0x2C
|
|
||||||
#define DUMMY_RWDS_SDR 0x0D
|
|
||||||
#define DUMMY_RWDS_DDR 0x2D
|
|
||||||
#define JMP_ON_CS 0x1F
|
|
||||||
#define STOP 0
|
|
||||||
|
|
||||||
#define FLEXSPI_1PAD 0
|
|
||||||
#define FLEXSPI_2PAD 1
|
|
||||||
#define FLEXSPI_4PAD 2
|
|
||||||
#define FLEXSPI_8PAD 3
|
|
||||||
|
|
||||||
#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
|
|
||||||
(FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
|
|
||||||
FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
|
||||||
|
|
||||||
//!@brief Definitions for FlexSPI Serial Clock Frequency
|
|
||||||
typedef enum _FlexSpiSerialClockFreq
|
|
||||||
{
|
|
||||||
kFlexSpiSerialClk_30MHz = 1,
|
|
||||||
kFlexSpiSerialClk_50MHz = 2,
|
|
||||||
kFlexSpiSerialClk_60MHz = 3,
|
|
||||||
kFlexSpiSerialClk_75MHz = 4,
|
|
||||||
kFlexSpiSerialClk_80MHz = 5,
|
|
||||||
kFlexSpiSerialClk_100MHz = 6,
|
|
||||||
kFlexSpiSerialClk_120MHz = 7,
|
|
||||||
kFlexSpiSerialClk_133MHz = 8,
|
|
||||||
kFlexSpiSerialClk_166MHz = 9,
|
|
||||||
} flexspi_serial_clk_freq_t;
|
|
||||||
|
|
||||||
//!@brief FlexSPI clock configuration type
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiClk_SDR, //!< Clock configure for SDR mode
|
|
||||||
kFlexSpiClk_DDR, //!< Clock configurat for DDR mode
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI Read Sample Clock Source definition
|
|
||||||
typedef enum _FlashReadSampleClkSource
|
|
||||||
{
|
|
||||||
kFlexSPIReadSampleClk_LoopbackInternally = 0,
|
|
||||||
kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
|
|
||||||
kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
|
|
||||||
kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
|
|
||||||
} flexspi_read_sample_clk_t;
|
|
||||||
|
|
||||||
//!@brief Misc feature bit definitions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiMiscOffset_DiffClkEnable = 0, //!< Bit for Differential clock enable
|
|
||||||
kFlexSpiMiscOffset_Ck2Enable = 1, //!< Bit for CK2 enable
|
|
||||||
kFlexSpiMiscOffset_ParallelEnable = 2, //!< Bit for Parallel mode enable
|
|
||||||
kFlexSpiMiscOffset_WordAddressableEnable = 3, //!< Bit for Word Addressable enable
|
|
||||||
kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, //!< Bit for Safe Configuration Frequency enable
|
|
||||||
kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable
|
|
||||||
kFlexSpiMiscOffset_DdrModeEnable = 6, //!< Bit for DDR clock confiuration indication.
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief Flash Type Definition
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kFlexSpiDeviceType_SerialNOR = 1, //!< Flash devices are Serial NOR
|
|
||||||
kFlexSpiDeviceType_SerialNAND = 2, //!< Flash devices are Serial NAND
|
|
||||||
kFlexSpiDeviceType_SerialRAM = 3, //!< Flash devices are Serial RAM/HyperFLASH
|
|
||||||
kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND
|
|
||||||
kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, //!< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief Flash Pad Definitions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kSerialFlash_1Pad = 1,
|
|
||||||
kSerialFlash_2Pads = 2,
|
|
||||||
kSerialFlash_4Pads = 4,
|
|
||||||
kSerialFlash_8Pads = 8,
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI LUT Sequence structure
|
|
||||||
typedef struct _lut_sequence
|
|
||||||
{
|
|
||||||
uint8_t seqNum; //!< Sequence Number, valid number: 1-16
|
|
||||||
uint8_t seqId; //!< Sequence Index, valid number: 0-15
|
|
||||||
uint16_t reserved;
|
|
||||||
} flexspi_lut_seq_t;
|
|
||||||
|
|
||||||
//!@brief Flash Configuration Command Type
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kDeviceConfigCmdType_Generic, //!< Generic command, for example: configure dummy cycles, drive strength, etc
|
|
||||||
kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command
|
|
||||||
kDeviceConfigCmdType_Spi2Xpi, //!< Switch from SPI to DPI/QPI/OPI mode
|
|
||||||
kDeviceConfigCmdType_Xpi2Spi, //!< Switch from DPI/QPI/OPI to SPI mode
|
|
||||||
kDeviceConfigCmdType_Spi2NoCmd, //!< Switch to 0-4-4/0-8-8 mode
|
|
||||||
kDeviceConfigCmdType_Reset, //!< Reset device command
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@brief FlexSPI Memory Configuration Block
|
|
||||||
typedef struct _FlexSPIConfig
|
|
||||||
{
|
|
||||||
uint32_t tag; //!< [0x000-0x003] Tag, fixed value 0x42464346UL
|
|
||||||
uint32_t version; //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix
|
|
||||||
uint32_t reserved0; //!< [0x008-0x00b] Reserved for future use
|
|
||||||
uint8_t readSampleClkSrc; //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3
|
|
||||||
uint8_t csHoldTime; //!< [0x00d-0x00d] CS hold time, default value: 3
|
|
||||||
uint8_t csSetupTime; //!< [0x00e-0x00e] CS setup time, default value: 3
|
|
||||||
uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
|
|
||||||
//! Serial NAND, need to refer to datasheet
|
|
||||||
uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable
|
|
||||||
uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
|
|
||||||
//! Generic configuration, etc.
|
|
||||||
uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
|
|
||||||
//! DPI/QPI/OPI switch or reset command
|
|
||||||
flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
|
|
||||||
//! sequence number, [31:16] Reserved
|
|
||||||
uint32_t deviceModeArg; //!< [0x018-0x01b] Argument/Parameter for device configuration
|
|
||||||
uint8_t configCmdEnable; //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable
|
|
||||||
uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe
|
|
||||||
flexspi_lut_seq_t
|
|
||||||
configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq
|
|
||||||
uint32_t reserved1; //!< [0x02c-0x02f] Reserved for future use
|
|
||||||
uint32_t configCmdArgs[3]; //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands
|
|
||||||
uint32_t reserved2; //!< [0x03c-0x03f] Reserved for future use
|
|
||||||
uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
|
|
||||||
//! details
|
|
||||||
uint8_t deviceType; //!< [0x044-0x044] Device Type: See Flash Type Definition for more details
|
|
||||||
uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal
|
|
||||||
uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
|
|
||||||
//! Chapter for more details
|
|
||||||
uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
|
|
||||||
//! be done using 1 LUT sequence, currently, only applicable to HyperFLASH
|
|
||||||
uint32_t reserved3[2]; //!< [0x048-0x04f] Reserved for future use
|
|
||||||
uint32_t sflashA1Size; //!< [0x050-0x053] Size of Flash connected to A1
|
|
||||||
uint32_t sflashA2Size; //!< [0x054-0x057] Size of Flash connected to A2
|
|
||||||
uint32_t sflashB1Size; //!< [0x058-0x05b] Size of Flash connected to B1
|
|
||||||
uint32_t sflashB2Size; //!< [0x05c-0x05f] Size of Flash connected to B2
|
|
||||||
uint32_t csPadSettingOverride; //!< [0x060-0x063] CS pad setting override value
|
|
||||||
uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value
|
|
||||||
uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value
|
|
||||||
uint32_t dqsPadSettingOverride; //!< [0x06c-0x06f] DQS pad setting override value
|
|
||||||
uint32_t timeoutInMs; //!< [0x070-0x073] Timeout threshold for read status command
|
|
||||||
uint32_t commandInterval; //!< [0x074-0x077] CS deselect interval between two commands
|
|
||||||
uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns
|
|
||||||
uint16_t busyOffset; //!< [0x07c-0x07d] Busy offset, valid value: 0-31
|
|
||||||
uint16_t busyBitPolarity; //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
|
|
||||||
//! busy flag is 0 when flash device is busy
|
|
||||||
uint32_t lookupTable[64]; //!< [0x080-0x17f] Lookup table holds Flash command sequences
|
|
||||||
flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences
|
|
||||||
uint32_t reserved4[4]; //!< [0x1b0-0x1bf] Reserved for future use
|
|
||||||
} flexspi_mem_config_t;
|
|
||||||
|
|
||||||
/* */
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL 0
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG 1
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD 2
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 4
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG 6
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD 7
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_READID 8
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_ENTERQPI 10
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
|
|
||||||
#define NOR_CMD_LUT_SEQ_IDX_EXITQPI 12
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Serial NOR configuration block
|
|
||||||
*/
|
|
||||||
typedef struct _flexspi_nor_config
|
|
||||||
{
|
|
||||||
flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI
|
|
||||||
uint32_t pageSize; //!< Page size of Serial NOR
|
|
||||||
uint32_t sectorSize; //!< Sector size of Serial NOR
|
|
||||||
uint8_t ipcmdSerialClkFreq; //!< Clock frequency for IP command
|
|
||||||
uint8_t isUniformBlockSize; //!< Sector/Block size is the same
|
|
||||||
uint8_t reserved0[2]; //!< Reserved for future use
|
|
||||||
uint8_t serialNorType; //!< Serial NOR Flash type: 0/1/2/3
|
|
||||||
uint8_t needExitNoCmdMode; //!< Need to exit NoCmd mode before other IP command
|
|
||||||
uint8_t halfClkForNonReadCmd; //!< Half the Serial Clock for non-read command: true/false
|
|
||||||
uint8_t needRestoreNoCmdMode; //!< Need to Restore NoCmd mode after IP commmand execution
|
|
||||||
uint32_t blockSize; //!< Block size
|
|
||||||
uint32_t reserve2[11]; //!< Reserved for future use
|
|
||||||
} flexspi_nor_config_t;
|
|
||||||
|
|
||||||
#define FLASH_BUSY_STATUS_POL 0
|
|
||||||
#define FLASH_BUSY_STATUS_OFFSET 0
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* __EVKMIMXRT1060_FLEXSPI_NOR_CONFIG__ */
|
|
||||||
219
ports/mimxrt/boards/make-flexram-config.py
Normal file
219
ports/mimxrt/boards/make-flexram-config.py
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
#
|
||||||
|
# This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
#
|
||||||
|
# The MIT License (MIT)
|
||||||
|
#
|
||||||
|
# Copyright (c) 2021 Philipp Ebensberger
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
|
# in the Software without restriction, including without limitation the rights
|
||||||
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
# copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in
|
||||||
|
# all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
# THE SOFTWARE.
|
||||||
|
|
||||||
|
"""Evaluate FlexRAM configuration and generate startup code."""
|
||||||
|
|
||||||
|
import re
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
# Regex for linker script configuration
|
||||||
|
ocram_regex = r"^\s*ocrm_size\s*=\s*(?P<size>.*);"
|
||||||
|
dtcm_regex = r"^\s*dtcm_size\s*=\s*(?P<size>.*);"
|
||||||
|
itcm_regex = r"^\s*itcm_size\s*=\s*(?P<size>.*);"
|
||||||
|
|
||||||
|
# Regex for GPR register base define in NXL hal
|
||||||
|
gpr_base_regex = r"^.*IOMUXC_GPR_BASE\s*\((?P<base_addr>\w*)u\)"
|
||||||
|
|
||||||
|
# Regex for FlexRAM parameters in NXP HAL
|
||||||
|
fsl_ram_bank_size_regex = r"^.*FSL_FEATURE_FLEXRAM_INTERNAL_RAM_BANK_SIZE\s*\((?P<size>\w*)\)"
|
||||||
|
fsl_bank_nbr_regex = (
|
||||||
|
r"^.*FSL_FEATURE_FLEXRAM_INTERNAL_RAM_TOTAL_BANK_NUMBERS\s*\((?P<number>\w*)\)"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
According to AN12077:
|
||||||
|
The minimum configuration of OCRAM is 64 KB. This is required
|
||||||
|
due to ROM code requires at least 64 KB of RAM for its execution.
|
||||||
|
|
||||||
|
2.1.1.1. Static configuration - Page 4
|
||||||
|
"""
|
||||||
|
ocram_min_size = 0x00010000 # 64 KB
|
||||||
|
|
||||||
|
# Value parser
|
||||||
|
def mimxrt_default_parser(defines_file, features_file, ld_script):
|
||||||
|
with open(ld_script, "r") as input_file:
|
||||||
|
input_str = input_file.read()
|
||||||
|
#
|
||||||
|
ocram_match = re.search(ocram_regex, input_str, re.MULTILINE)
|
||||||
|
dtcm_match = re.search(dtcm_regex, input_str, re.MULTILINE)
|
||||||
|
itcm_match = re.search(itcm_regex, input_str, re.MULTILINE)
|
||||||
|
|
||||||
|
with open(defines_file, "r") as input_file:
|
||||||
|
input_str = input_file.read()
|
||||||
|
mcu_define_file_match = re.search(gpr_base_regex, input_str, re.MULTILINE)
|
||||||
|
|
||||||
|
with open(features_file, "r") as input_file:
|
||||||
|
input_str = input_file.read()
|
||||||
|
fsl_ram_bank_size_match = re.search(fsl_ram_bank_size_regex, input_str, re.MULTILINE)
|
||||||
|
fsl_bank_nbr_match = re.search(fsl_bank_nbr_regex, input_str, re.MULTILINE)
|
||||||
|
#
|
||||||
|
extract = {
|
||||||
|
"ocram_size": int(ocram_match.group("size"), 16),
|
||||||
|
"dtcm_size": int(dtcm_match.group("size"), 16),
|
||||||
|
"itcm_size": int(itcm_match.group("size"), 16),
|
||||||
|
"gpr_base_addr": int(mcu_define_file_match.group("base_addr"), 16),
|
||||||
|
"fsl_ram_bank_size": int(fsl_ram_bank_size_match.group("size")),
|
||||||
|
"fsl_bank_nbr": int(fsl_bank_nbr_match.group("number")),
|
||||||
|
}
|
||||||
|
# Evaluate configuration
|
||||||
|
if extract["ocram_size"] < ocram_min_size:
|
||||||
|
raise ValueError("OCRAM size must be at least {:08X}!".format(ocram_min_size))
|
||||||
|
|
||||||
|
if (extract["ocram_size"] % extract["fsl_ram_bank_size"]) != 0:
|
||||||
|
raise ValueError("Configuration invalid!")
|
||||||
|
|
||||||
|
# Check if DTCM and ITCM size is either multiple of 32k or 4k,8k or 16k
|
||||||
|
if extract["dtcm_size"] != 0x0:
|
||||||
|
if extract["dtcm_size"] % extract["fsl_ram_bank_size"] != 0:
|
||||||
|
if extract["dtcm_size"] not in (0x00000000, 0x00001000, 0x00002000, 0x00004000):
|
||||||
|
raise ValueError("Configuration invalid!")
|
||||||
|
|
||||||
|
if extract["itcm_size"] != 0x0:
|
||||||
|
if extract["itcm_size"] % extract["fsl_ram_bank_size"] != 0:
|
||||||
|
if extract["itcm_size"] not in (0x00000000, 0x00001000, 0x00002000, 0x00004000):
|
||||||
|
raise ValueError("Configuration invalid!")
|
||||||
|
#
|
||||||
|
return extract
|
||||||
|
|
||||||
|
|
||||||
|
# Code generators
|
||||||
|
def mimxrt_default_gen_code(extract_dict):
|
||||||
|
flexram_bank_cfg = "0b"
|
||||||
|
avail_flexram = extract_dict["fsl_ram_bank_size"] * extract_dict["fsl_bank_nbr"]
|
||||||
|
|
||||||
|
if (
|
||||||
|
extract_dict["ocram_size"] + extract_dict["dtcm_size"] + extract_dict["itcm_size"]
|
||||||
|
) > avail_flexram:
|
||||||
|
raise ValueError("Configuration exceeds available FlexRAM!")
|
||||||
|
|
||||||
|
bit_patterns = (
|
||||||
|
(extract_dict["ocram_size"], "01"),
|
||||||
|
(extract_dict["dtcm_size"], "10"),
|
||||||
|
(extract_dict["itcm_size"], "11"),
|
||||||
|
)
|
||||||
|
|
||||||
|
for size, pattern in bit_patterns:
|
||||||
|
for _ in range(0, size, extract_dict["fsl_ram_bank_size"]):
|
||||||
|
flexram_bank_cfg += pattern
|
||||||
|
|
||||||
|
# Generate GPR Register config
|
||||||
|
print(".equ __iomux_gpr14_adr, 0x{:08X}".format(extract_dict["gpr_base_addr"] + 0x38))
|
||||||
|
print(".equ __iomux_gpr16_adr, 0x{:08X}".format(extract_dict["gpr_base_addr"] + 0x40))
|
||||||
|
print(".equ __iomux_gpr17_adr, 0x{:08X}".format(extract_dict["gpr_base_addr"] + 0x44))
|
||||||
|
print(
|
||||||
|
".equ __iomux_gpr17_value, 0x{:08X} /* {}k OCRAM, {}k DTCM, {}k ITCM */".format(
|
||||||
|
int(flexram_bank_cfg, 2),
|
||||||
|
extract_dict["ocram_size"] // 1024,
|
||||||
|
extract_dict["dtcm_size"] // 1024,
|
||||||
|
extract_dict["itcm_size"] // 1024,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def mimxrt_106x_gen_code(extract_dict):
|
||||||
|
flexram_bank_cfg = "0b"
|
||||||
|
avail_flexram = extract_dict["fsl_ram_bank_size"] * extract_dict["fsl_bank_nbr"]
|
||||||
|
flexram_configurable_ocram = (
|
||||||
|
extract_dict["ocram_size"] % 524288
|
||||||
|
) # 512kB OCRAM are not part of FlexRAM configurable memory
|
||||||
|
|
||||||
|
if (
|
||||||
|
flexram_configurable_ocram + extract_dict["dtcm_size"] + extract_dict["itcm_size"]
|
||||||
|
) > avail_flexram:
|
||||||
|
raise ValueError("Configuration exceeds available FlexRAM!")
|
||||||
|
|
||||||
|
for size, pattern in (
|
||||||
|
(flexram_configurable_ocram, "01"),
|
||||||
|
(extract_dict["dtcm_size"], "10"),
|
||||||
|
(extract_dict["itcm_size"], "11"),
|
||||||
|
):
|
||||||
|
for _ in range(0, size, extract_dict["fsl_ram_bank_size"]):
|
||||||
|
flexram_bank_cfg += pattern
|
||||||
|
|
||||||
|
# Generate GPR Register config
|
||||||
|
print(".equ __iomux_gpr14_adr, 0x{:08X}".format(extract_dict["gpr_base_addr"] + 0x38))
|
||||||
|
print(".equ __iomux_gpr16_adr, 0x{:08X}".format(extract_dict["gpr_base_addr"] + 0x40))
|
||||||
|
print(".equ __iomux_gpr17_adr, 0x{:08X}".format(extract_dict["gpr_base_addr"] + 0x44))
|
||||||
|
print(
|
||||||
|
".equ __iomux_gpr17_value, 0x{:08X} /* {}k OCRAM (512k OCRAM, {}k from FlexRAM), {}k DTCM, {}k ITCM */".format(
|
||||||
|
int(flexram_bank_cfg, 2),
|
||||||
|
extract_dict["ocram_size"] // 1024,
|
||||||
|
flexram_configurable_ocram // 1024,
|
||||||
|
extract_dict["dtcm_size"] // 1024,
|
||||||
|
extract_dict["itcm_size"] // 1024,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def main(defines_file, features_file, ld_script, controller):
|
||||||
|
dispatcher = {
|
||||||
|
"MIMXRT1011": (mimxrt_default_parser, mimxrt_default_gen_code),
|
||||||
|
"MIMXRT1021": (mimxrt_default_parser, mimxrt_default_gen_code),
|
||||||
|
"MIMXRT1052": (mimxrt_default_parser, mimxrt_default_gen_code),
|
||||||
|
"MIMXRT1062": (mimxrt_default_parser, mimxrt_106x_gen_code),
|
||||||
|
"MIMXRT1064": (mimxrt_default_parser, mimxrt_106x_gen_code),
|
||||||
|
}
|
||||||
|
|
||||||
|
extractor, code_generator = dispatcher[controller]
|
||||||
|
|
||||||
|
extract_dict = extractor(defines_file, features_file, ld_script)
|
||||||
|
code_generator(extract_dict)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
prog="make-flexram-ld.py",
|
||||||
|
usage="%(prog)s [options] [command]",
|
||||||
|
description="Evaluate FlexRAM configuration and generate startup code.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-d",
|
||||||
|
"--defines_file",
|
||||||
|
dest="defines_file",
|
||||||
|
help="Path to MCU defines file",
|
||||||
|
default="../../../lib/nxp_driver/sdk/devices/MIMXRT1021/MIMXRT1021.h",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-f",
|
||||||
|
"--features_file",
|
||||||
|
dest="features_file",
|
||||||
|
help="Path to MCU features file",
|
||||||
|
default="../../../lib/nxp_driver/sdk/devices/MIMXRT1021/MIMXRT1021_features.h",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-l",
|
||||||
|
"--ld_file",
|
||||||
|
dest="linker_file",
|
||||||
|
help="Path to the aggregated linker-script",
|
||||||
|
default="MIMXRT1021.ld",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-c", "--controller", dest="controller", help="Controller name", default="MIMXRT1021"
|
||||||
|
)
|
||||||
|
#
|
||||||
|
args = parser.parse_args()
|
||||||
|
main(args.defines_file, args.features_file, args.linker_file, args.controller)
|
||||||
33
ports/mimxrt/hal/board.h
Normal file
33
ports/mimxrt/hal/board.h
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021 Philipp Ebensberger
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MICROPY_INCLUDED_MIMXRT_BOARD_H
|
||||||
|
#define MICROPY_INCLUDED_MIMXRT_BOARD_H
|
||||||
|
|
||||||
|
#include "clock_config.h"
|
||||||
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
#endif /* MICROPY_INCLUDED_MIMXRT_BOARD_H */
|
||||||
@@ -16,14 +16,15 @@
|
|||||||
__attribute__((always_inline)) static inline void clock_set_div(clock_div_t divider, uint32_t value) {
|
__attribute__((always_inline)) static inline void clock_set_div(clock_div_t divider, uint32_t value) {
|
||||||
uint32_t busyShift;
|
uint32_t busyShift;
|
||||||
|
|
||||||
busyShift = CCM_TUPLE_BUSY_SHIFT(divider);
|
busyShift = CCM_TUPLE_BUSY_SHIFT(divider);
|
||||||
CCM_TUPLE_REG(CCM, divider) = (CCM_TUPLE_REG(CCM, divider) & (~CCM_TUPLE_MASK(divider))) |
|
CCM_TUPLE_REG(CCM, divider) = (CCM_TUPLE_REG(CCM, divider) & (~CCM_TUPLE_MASK(divider))) |
|
||||||
(((uint32_t)((value) << CCM_TUPLE_SHIFT(divider))) & CCM_TUPLE_MASK(divider));
|
(((uint32_t)((value) << CCM_TUPLE_SHIFT(divider))) & CCM_TUPLE_MASK(divider));
|
||||||
|
|
||||||
/* Clock switch need Handshake? */
|
/* Clock switch need Handshake? */
|
||||||
if (CCM_NO_BUSY_WAIT != busyShift) {
|
if (CCM_NO_BUSY_WAIT != busyShift) {
|
||||||
/* Wait until CCM internal handshake finish. */
|
/* Wait until CCM internal handshake finish. */
|
||||||
while (CCM->CDHIPR & (1U << busyShift)) {}
|
while (CCM->CDHIPR & (1U << busyShift)) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,7 +33,7 @@ __attribute__((always_inline)) static inline void clock_control_gate(clock_ip_na
|
|||||||
uint32_t shift = ((uint32_t)name) & 0x1FU;
|
uint32_t shift = ((uint32_t)name) & 0x1FU;
|
||||||
volatile uint32_t *reg;
|
volatile uint32_t *reg;
|
||||||
|
|
||||||
reg = ((volatile uint32_t *)&CCM->CCGR0) + index;
|
reg = ((volatile uint32_t *)&CCM->CCGR0) + index;
|
||||||
*reg = ((*reg) & ~(3U << shift)) | (((uint32_t)value) << shift);
|
*reg = ((*reg) & ~(3U << shift)) | (((uint32_t)value) << shift);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,9 +45,9 @@ __attribute__((always_inline)) static inline void clock_disable_clock(clock_ip_n
|
|||||||
clock_control_gate(name, kCLOCK_ClockNotNeeded);
|
clock_control_gate(name, kCLOCK_ClockNotNeeded);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DIV_PAGE_PGM 4
|
#define DIV_PAGE_PGM 4
|
||||||
#define DIV_ERASE_PGM 4
|
#define DIV_ERASE_PGM 4
|
||||||
#define DIV_READ 0
|
#define DIV_READ 0
|
||||||
|
|
||||||
static void SetFlexSPIDiv(uint32_t div) __attribute__((section(".ram_functions")));
|
static void SetFlexSPIDiv(uint32_t div) __attribute__((section(".ram_functions")));
|
||||||
static void SetFlexSPIDiv(uint32_t div) {
|
static void SetFlexSPIDiv(uint32_t div) {
|
||||||
@@ -63,13 +64,13 @@ status_t flexspi_nor_hyperbus_read(FLEXSPI_Type *base, uint32_t addr, uint32_t *
|
|||||||
status_t status;
|
status_t status;
|
||||||
|
|
||||||
flashXfer.deviceAddress = addr * 2;
|
flashXfer.deviceAddress = addr * 2;
|
||||||
flashXfer.port = kFLEXSPI_PortA1;
|
flashXfer.port = kFLEXSPI_PortA1;
|
||||||
flashXfer.cmdType = kFLEXSPI_Read;
|
flashXfer.cmdType = kFLEXSPI_Read;
|
||||||
flashXfer.SeqNumber = 1;
|
flashXfer.SeqNumber = 1;
|
||||||
flashXfer.seqIndex = HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA;
|
flashXfer.seqIndex = HYPERFLASH_CMD_LUT_SEQ_IDX_READDATA;
|
||||||
flashXfer.data = buffer;
|
flashXfer.data = buffer;
|
||||||
flashXfer.dataSize = bytes;
|
flashXfer.dataSize = bytes;
|
||||||
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -80,13 +81,13 @@ status_t flexspi_nor_hyperbus_write(FLEXSPI_Type *base, uint32_t addr, uint32_t
|
|||||||
status_t status;
|
status_t status;
|
||||||
|
|
||||||
flashXfer.deviceAddress = addr * 2;
|
flashXfer.deviceAddress = addr * 2;
|
||||||
flashXfer.port = kFLEXSPI_PortA1;
|
flashXfer.port = kFLEXSPI_PortA1;
|
||||||
flashXfer.cmdType = kFLEXSPI_Write;
|
flashXfer.cmdType = kFLEXSPI_Write;
|
||||||
flashXfer.SeqNumber = 1;
|
flashXfer.SeqNumber = 1;
|
||||||
flashXfer.seqIndex = HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA;
|
flashXfer.seqIndex = HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEDATA;
|
||||||
flashXfer.data = buffer;
|
flashXfer.data = buffer;
|
||||||
flashXfer.dataSize = bytes;
|
flashXfer.dataSize = bytes;
|
||||||
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -98,10 +99,10 @@ status_t flexspi_nor_write_enable(FLEXSPI_Type *base, uint32_t baseAddr) {
|
|||||||
|
|
||||||
/* Write enable */
|
/* Write enable */
|
||||||
flashXfer.deviceAddress = baseAddr;
|
flashXfer.deviceAddress = baseAddr;
|
||||||
flashXfer.port = kFLEXSPI_PortA1;
|
flashXfer.port = kFLEXSPI_PortA1;
|
||||||
flashXfer.cmdType = kFLEXSPI_Command;
|
flashXfer.cmdType = kFLEXSPI_Command;
|
||||||
flashXfer.SeqNumber = 2;
|
flashXfer.SeqNumber = 2;
|
||||||
flashXfer.seqIndex = HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE;
|
flashXfer.seqIndex = HYPERFLASH_CMD_LUT_SEQ_IDX_WRITEENABLE;
|
||||||
|
|
||||||
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
||||||
|
|
||||||
@@ -117,12 +118,12 @@ status_t flexspi_nor_wait_bus_busy(FLEXSPI_Type *base) {
|
|||||||
flexspi_transfer_t flashXfer;
|
flexspi_transfer_t flashXfer;
|
||||||
|
|
||||||
flashXfer.deviceAddress = 0;
|
flashXfer.deviceAddress = 0;
|
||||||
flashXfer.port = kFLEXSPI_PortA1;
|
flashXfer.port = kFLEXSPI_PortA1;
|
||||||
flashXfer.cmdType = kFLEXSPI_Read;
|
flashXfer.cmdType = kFLEXSPI_Read;
|
||||||
flashXfer.SeqNumber = 2;
|
flashXfer.SeqNumber = 2;
|
||||||
flashXfer.seqIndex = HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS;
|
flashXfer.seqIndex = HYPERFLASH_CMD_LUT_SEQ_IDX_READSTATUS;
|
||||||
flashXfer.data = &readValue;
|
flashXfer.data = &readValue;
|
||||||
flashXfer.dataSize = 2;
|
flashXfer.dataSize = 2;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
||||||
@@ -159,11 +160,11 @@ status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
flashXfer.deviceAddress = address;
|
flashXfer.deviceAddress = address;
|
||||||
flashXfer.port = kFLEXSPI_PortA1;
|
flashXfer.port = kFLEXSPI_PortA1;
|
||||||
flashXfer.cmdType = kFLEXSPI_Command;
|
flashXfer.cmdType = kFLEXSPI_Command;
|
||||||
flashXfer.SeqNumber = 4;
|
flashXfer.SeqNumber = 4;
|
||||||
flashXfer.seqIndex = HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR;
|
flashXfer.seqIndex = HYPERFLASH_CMD_LUT_SEQ_IDX_ERASESECTOR;
|
||||||
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
||||||
|
|
||||||
if (status != kStatus_Success) {
|
if (status != kStatus_Success) {
|
||||||
return status;
|
return status;
|
||||||
@@ -174,13 +175,13 @@ status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address) {
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t address, const uint32_t *src, uint32_t size ) __attribute__((section(".ram_functions")));
|
status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t address, const uint32_t *src, uint32_t size) __attribute__((section(".ram_functions")));
|
||||||
status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t address, const uint32_t *src, uint32_t size) {
|
status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t address, const uint32_t *src, uint32_t size) {
|
||||||
status_t status;
|
status_t status;
|
||||||
flexspi_transfer_t flashXfer;
|
flexspi_transfer_t flashXfer;
|
||||||
|
|
||||||
/* Speed down flexspi clock */
|
/* Speed down flexspi clock */
|
||||||
SetFlexSPIDiv(DIV_PAGE_PGM);
|
SetFlexSPIDiv(DIV_PAGE_PGM);
|
||||||
|
|
||||||
/* Write enable */
|
/* Write enable */
|
||||||
status = flexspi_nor_write_enable(base, address);
|
status = flexspi_nor_write_enable(base, address);
|
||||||
@@ -191,13 +192,13 @@ status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t address, co
|
|||||||
|
|
||||||
/* Prepare page program command */
|
/* Prepare page program command */
|
||||||
flashXfer.deviceAddress = address;
|
flashXfer.deviceAddress = address;
|
||||||
flashXfer.port = kFLEXSPI_PortA1;
|
flashXfer.port = kFLEXSPI_PortA1;
|
||||||
flashXfer.cmdType = kFLEXSPI_Write;
|
flashXfer.cmdType = kFLEXSPI_Write;
|
||||||
flashXfer.SeqNumber = 2;
|
flashXfer.SeqNumber = 2;
|
||||||
flashXfer.seqIndex = HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM;
|
flashXfer.seqIndex = HYPERFLASH_CMD_LUT_SEQ_IDX_PAGEPROGRAM;
|
||||||
flashXfer.data = (uint32_t *)src;
|
flashXfer.data = (uint32_t *)src;
|
||||||
flashXfer.dataSize = size;
|
flashXfer.dataSize = size;
|
||||||
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
||||||
|
|
||||||
if (status != kStatus_Success) {
|
if (status != kStatus_Success) {
|
||||||
return status;
|
return status;
|
||||||
@@ -205,7 +206,7 @@ status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t address, co
|
|||||||
|
|
||||||
status = flexspi_nor_wait_bus_busy(base);
|
status = flexspi_nor_wait_bus_busy(base);
|
||||||
|
|
||||||
SetFlexSPIDiv(DIV_READ);
|
SetFlexSPIDiv(DIV_READ);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -219,7 +220,7 @@ status_t flexspi_nor_hyperflash_cfi(FLEXSPI_Type *base) {
|
|||||||
status_t status;
|
status_t status;
|
||||||
uint32_t buffer[2];
|
uint32_t buffer[2];
|
||||||
uint8_t data[4] = {0x00, 0x98};
|
uint8_t data[4] = {0x00, 0x98};
|
||||||
status = flexspi_nor_hyperbus_write(base, 0x555, (uint32_t *)data, 2);
|
status = flexspi_nor_hyperbus_write(base, 0x555, (uint32_t *)data, 2);
|
||||||
if (status != kStatus_Success) {
|
if (status != kStatus_Success) {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -238,7 +239,7 @@ status_t flexspi_nor_hyperflash_cfi(FLEXSPI_Type *base) {
|
|||||||
}
|
}
|
||||||
// ASO Exit 0xF000
|
// ASO Exit 0xF000
|
||||||
data[1] = 0xF0;
|
data[1] = 0xF0;
|
||||||
status = flexspi_nor_hyperbus_write(base, 0x0, (uint32_t *)data, 2);
|
status = flexspi_nor_hyperbus_write(base, 0x0, (uint32_t *)data, 2);
|
||||||
if (status != kStatus_Success) {
|
if (status != kStatus_Success) {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,15 +26,14 @@
|
|||||||
#ifndef MICROPY_INCLUDED_MIMXRT_HAL_FLEXSPI_HYPER_FLASH_H
|
#ifndef MICROPY_INCLUDED_MIMXRT_HAL_FLEXSPI_HYPER_FLASH_H
|
||||||
#define MICROPY_INCLUDED_MIMXRT_HAL_FLEXSPI_HYPER_FLASH_H
|
#define MICROPY_INCLUDED_MIMXRT_HAL_FLEXSPI_HYPER_FLASH_H
|
||||||
|
|
||||||
#include "mpconfigboard.h"
|
|
||||||
#include "fsl_flexspi.h"
|
#include "fsl_flexspi.h"
|
||||||
|
#include "mpconfigboard.h"
|
||||||
#include BOARD_FLASH_CONFIG_HEADER_H
|
#include BOARD_FLASH_CONFIG_HEADER_H
|
||||||
|
|
||||||
// Defined in boards flash_config.c
|
// Defined in boards flash_config.c
|
||||||
extern flexspi_nor_config_t qspiflash_config;
|
extern flexspi_nor_config_t qspiflash_config;
|
||||||
|
|
||||||
status_t flexspi_nor_hyperflash_cfi(FLEXSPI_Type *base);
|
status_t flexspi_nor_hyperflash_cfi(FLEXSPI_Type *base);
|
||||||
void flexspi_hyper_flash_init(void);
|
|
||||||
void flexspi_nor_update_lut(void);
|
void flexspi_nor_update_lut(void);
|
||||||
status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address);
|
status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address);
|
||||||
status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t address, const uint32_t *src, uint32_t size);
|
status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t address, const uint32_t *src, uint32_t size);
|
||||||
|
|||||||
@@ -41,8 +41,7 @@ void flexspi_nor_reset(FLEXSPI_Type *base) __attribute__((section(".ram_function
|
|||||||
void flexspi_nor_reset(FLEXSPI_Type *base) {
|
void flexspi_nor_reset(FLEXSPI_Type *base) {
|
||||||
// Using content of FLEXSPI_SoftwareReset directly to prevent issues when compiler does not inline function
|
// Using content of FLEXSPI_SoftwareReset directly to prevent issues when compiler does not inline function
|
||||||
base->MCR0 |= FLEXSPI_MCR0_SWRESET_MASK;
|
base->MCR0 |= FLEXSPI_MCR0_SWRESET_MASK;
|
||||||
while (base->MCR0 & FLEXSPI_MCR0_SWRESET_MASK)
|
while (base->MCR0 & FLEXSPI_MCR0_SWRESET_MASK) {
|
||||||
{
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,7 +62,7 @@ status_t flexspi_nor_write_enable(FLEXSPI_Type *base, uint32_t baseAddr) {
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t flexspi_nor_wait_bus_busy(FLEXSPI_Type *base) __attribute__((section(".ram_functions"))) ;
|
status_t flexspi_nor_wait_bus_busy(FLEXSPI_Type *base) __attribute__((section(".ram_functions")));
|
||||||
status_t flexspi_nor_wait_bus_busy(FLEXSPI_Type *base) {
|
status_t flexspi_nor_wait_bus_busy(FLEXSPI_Type *base) {
|
||||||
/* Wait status ready. */
|
/* Wait status ready. */
|
||||||
bool isBusy;
|
bool isBusy;
|
||||||
@@ -103,7 +102,7 @@ status_t flexspi_nor_wait_bus_busy(FLEXSPI_Type *base) {
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t flexspi_nor_enable_quad_mode(FLEXSPI_Type *base) __attribute__((section(".ram_functions"))) ;
|
status_t flexspi_nor_enable_quad_mode(FLEXSPI_Type *base) __attribute__((section(".ram_functions")));
|
||||||
status_t flexspi_nor_enable_quad_mode(FLEXSPI_Type *base) {
|
status_t flexspi_nor_enable_quad_mode(FLEXSPI_Type *base) {
|
||||||
flexspi_transfer_t flashXfer;
|
flexspi_transfer_t flashXfer;
|
||||||
status_t status;
|
status_t status;
|
||||||
@@ -135,7 +134,7 @@ status_t flexspi_nor_enable_quad_mode(FLEXSPI_Type *base) {
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address) __attribute__((section(".ram_functions"))) ;
|
status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address) __attribute__((section(".ram_functions")));
|
||||||
status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address) {
|
status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address) {
|
||||||
status_t status;
|
status_t status;
|
||||||
flexspi_transfer_t flashXfer;
|
flexspi_transfer_t flashXfer;
|
||||||
@@ -166,7 +165,7 @@ status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address) {
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t dstAddr, const uint32_t *src, uint32_t size) __attribute__((section(".ram_functions"))) ;
|
status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t dstAddr, const uint32_t *src, uint32_t size) __attribute__((section(".ram_functions")));
|
||||||
status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t dstAddr, const uint32_t *src, uint32_t size) {
|
status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t dstAddr, const uint32_t *src, uint32_t size) {
|
||||||
status_t status;
|
status_t status;
|
||||||
flexspi_transfer_t flashXfer;
|
flexspi_transfer_t flashXfer;
|
||||||
@@ -184,7 +183,7 @@ status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t dstAddr, co
|
|||||||
flashXfer.cmdType = kFLEXSPI_Write;
|
flashXfer.cmdType = kFLEXSPI_Write;
|
||||||
flashXfer.SeqNumber = 1;
|
flashXfer.SeqNumber = 1;
|
||||||
flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD;
|
flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD;
|
||||||
flashXfer.data = (uint32_t *) src;
|
flashXfer.data = (uint32_t *)src;
|
||||||
flashXfer.dataSize = size;
|
flashXfer.dataSize = size;
|
||||||
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
||||||
|
|
||||||
@@ -199,7 +198,7 @@ status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t dstAddr, co
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t flexspi_nor_get_vendor_id(FLEXSPI_Type *base, uint8_t *vendorId) __attribute__((section(".ram_functions"))) ;
|
status_t flexspi_nor_get_vendor_id(FLEXSPI_Type *base, uint8_t *vendorId) __attribute__((section(".ram_functions")));
|
||||||
status_t flexspi_nor_get_vendor_id(FLEXSPI_Type *base, uint8_t *vendorId) {
|
status_t flexspi_nor_get_vendor_id(FLEXSPI_Type *base, uint8_t *vendorId) {
|
||||||
uint32_t temp;
|
uint32_t temp;
|
||||||
flexspi_transfer_t flashXfer;
|
flexspi_transfer_t flashXfer;
|
||||||
|
|||||||
@@ -34,7 +34,6 @@
|
|||||||
extern flexspi_nor_config_t qspiflash_config;
|
extern flexspi_nor_config_t qspiflash_config;
|
||||||
|
|
||||||
status_t flexspi_nor_get_vendor_id(FLEXSPI_Type *base, uint8_t *vendorId);
|
status_t flexspi_nor_get_vendor_id(FLEXSPI_Type *base, uint8_t *vendorId);
|
||||||
status_t flexspi_nor_init(void);
|
|
||||||
void flexspi_nor_update_lut(void);
|
void flexspi_nor_update_lut(void);
|
||||||
status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address);
|
status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address);
|
||||||
status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t address, const uint32_t *src, uint32_t size);
|
status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t address, const uint32_t *src, uint32_t size);
|
||||||
|
|||||||
1
ports/mimxrt/hal/peripherals.h
Normal file
1
ports/mimxrt/hal/peripherals.h
Normal file
@@ -0,0 +1 @@
|
|||||||
|
// Empty file, necessary for compilation with NXP MCU SDK
|
||||||
1
ports/mimxrt/hal/pin_mux.h
Normal file
1
ports/mimxrt/hal/pin_mux.h
Normal file
@@ -0,0 +1 @@
|
|||||||
|
// Empty file, necessary for compilation with NXP MCU SDK
|
||||||
175
ports/mimxrt/hal/resethandler_MIMXRT10xx.S
Normal file
175
ports/mimxrt/hal/resethandler_MIMXRT10xx.S
Normal file
@@ -0,0 +1,175 @@
|
|||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
/* */
|
||||||
|
/* Copyright 1997-2016 Freescale Semiconductor, Inc. */
|
||||||
|
/* Copyright 2016-2019 NXP */
|
||||||
|
/* All rights reserved. */
|
||||||
|
/* */
|
||||||
|
/* SPDX-License-Identifier: BSD-3-Clause */
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Version: GCC for ARM Embedded Processors */
|
||||||
|
/*****************************************************************************/
|
||||||
|
.syntax unified
|
||||||
|
.arch armv7-m
|
||||||
|
|
||||||
|
#include"flexram_config.s"
|
||||||
|
|
||||||
|
|
||||||
|
/* Reset Handler */
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.align 2
|
||||||
|
.globl Reset_Handler
|
||||||
|
.type Reset_Handler, %function
|
||||||
|
Reset_Handler:
|
||||||
|
cpsid i /* Mask interrupts */
|
||||||
|
.equ VTOR, 0xE000ED08
|
||||||
|
ldr r0, =VTOR
|
||||||
|
ldr r1, =__isr_vector
|
||||||
|
str r1, [r0]
|
||||||
|
ldr r2, [r1]
|
||||||
|
msr msp, r2
|
||||||
|
|
||||||
|
/* Reconfigure the memory map, which must match the setting of the linker script */
|
||||||
|
dsb
|
||||||
|
isb
|
||||||
|
ldr r0, =__iomux_gpr17_adr /* load IOMUXC_GPR17 register address to R0 */
|
||||||
|
ldr r1, =__iomux_gpr17_value /* move FlexRAM configuration value to R1 */
|
||||||
|
str r1,[r0] /* store FLEXRAM configuration value to IOMUXC_GPR17 */
|
||||||
|
dsb
|
||||||
|
isb
|
||||||
|
ldr r0, =__iomux_gpr16_adr /* load IOMUXC_GPR16 register address to R0 */
|
||||||
|
ldr r1,[r0] /* load IOMUXC_GPR16 register value to R1 */
|
||||||
|
orr r1, r1, #4 /* set corresponding FLEXRAM_BANK_CFG_SEL bit */
|
||||||
|
str r1,[r0] /* store the value to IOMUXC_GPR16 (FLEXRAM_BANK_CFG_SEL = '1') */
|
||||||
|
dsb
|
||||||
|
isb
|
||||||
|
|
||||||
|
#ifndef __NO_SYSTEM_INIT
|
||||||
|
ldr r0,=SystemInit
|
||||||
|
blx r0
|
||||||
|
#endif
|
||||||
|
/* Loop to copy data from read only memory to RAM. The ranges
|
||||||
|
* of copy from/to are specified by following symbols evaluated in
|
||||||
|
* linker script.
|
||||||
|
* __etext: End of code section, i.e., begin of data sections to copy from.
|
||||||
|
* __data_start__/__data_end__: RAM address range that data should be
|
||||||
|
* __noncachedata_start__/__noncachedata_end__ : none cachable region
|
||||||
|
* __ram_function_start__/__ram_function_end__ : ramfunction region
|
||||||
|
* copied to. Both must be aligned to 4 bytes boundary. */
|
||||||
|
|
||||||
|
ldr r1, =__etext
|
||||||
|
ldr r2, =__data_start__
|
||||||
|
ldr r3, =__data_end__
|
||||||
|
|
||||||
|
#ifdef __PERFORMANCE_IMPLEMENTATION
|
||||||
|
/* Here are two copies of loop implementations. First one favors performance
|
||||||
|
* and the second one favors code size. Default uses the second one.
|
||||||
|
* Define macro "__PERFORMANCE_IMPLEMENTATION" in project to use the first one */
|
||||||
|
subs r3, r2
|
||||||
|
ble .LC1
|
||||||
|
.LC0:
|
||||||
|
subs r3, #4
|
||||||
|
ldr r0, [r1, r3]
|
||||||
|
str r0, [r2, r3]
|
||||||
|
bgt .LC0
|
||||||
|
.LC1:
|
||||||
|
#else /* code size implemenation */
|
||||||
|
.LC0:
|
||||||
|
cmp r2, r3
|
||||||
|
ittt lt
|
||||||
|
ldrlt r0, [r1], #4
|
||||||
|
strlt r0, [r2], #4
|
||||||
|
blt .LC0
|
||||||
|
#endif
|
||||||
|
#ifdef __STARTUP_INITIALIZE_RAMFUNCTION
|
||||||
|
ldr r2, =__ram_function_start__
|
||||||
|
ldr r3, =__ram_function_end__
|
||||||
|
#ifdef __PERFORMANCE_IMPLEMENTATION
|
||||||
|
/* Here are two copies of loop implementations. First one favors performance
|
||||||
|
* and the second one favors code size. Default uses the second one.
|
||||||
|
* Define macro "__PERFORMANCE_IMPLEMENTATION" in project to use the first one */
|
||||||
|
subs r3, r2
|
||||||
|
ble .LC_ramfunc_copy_end
|
||||||
|
.LC_ramfunc_copy_start:
|
||||||
|
subs r3, #4
|
||||||
|
ldr r0, [r1, r3]
|
||||||
|
str r0, [r2, r3]
|
||||||
|
bgt .LC_ramfunc_copy_start
|
||||||
|
.LC_ramfunc_copy_end:
|
||||||
|
#else /* code size implemenation */
|
||||||
|
.LC_ramfunc_copy_start:
|
||||||
|
cmp r2, r3
|
||||||
|
ittt lt
|
||||||
|
ldrlt r0, [r1], #4
|
||||||
|
strlt r0, [r2], #4
|
||||||
|
blt .LC_ramfunc_copy_start
|
||||||
|
#endif
|
||||||
|
#endif /* __STARTUP_INITIALIZE_RAMFUNCTION */
|
||||||
|
#ifdef __STARTUP_INITIALIZE_NONCACHEDATA
|
||||||
|
ldr r2, =__noncachedata_start__
|
||||||
|
ldr r3, =__noncachedata_init_end__
|
||||||
|
#ifdef __PERFORMANCE_IMPLEMENTATION
|
||||||
|
/* Here are two copies of loop implementations. First one favors performance
|
||||||
|
* and the second one favors code size. Default uses the second one.
|
||||||
|
* Define macro "__PERFORMANCE_IMPLEMENTATION" in project to use the first one */
|
||||||
|
subs r3, r2
|
||||||
|
ble .LC3
|
||||||
|
.LC2:
|
||||||
|
subs r3, #4
|
||||||
|
ldr r0, [r1, r3]
|
||||||
|
str r0, [r2, r3]
|
||||||
|
bgt .LC2
|
||||||
|
.LC3:
|
||||||
|
#else /* code size implemenation */
|
||||||
|
.LC2:
|
||||||
|
cmp r2, r3
|
||||||
|
ittt lt
|
||||||
|
ldrlt r0, [r1], #4
|
||||||
|
strlt r0, [r2], #4
|
||||||
|
blt .LC2
|
||||||
|
#endif
|
||||||
|
/* zero inited ncache section initialization */
|
||||||
|
ldr r3, =__noncachedata_end__
|
||||||
|
movs r0,0
|
||||||
|
.LC4:
|
||||||
|
cmp r2,r3
|
||||||
|
itt lt
|
||||||
|
strlt r0,[r2],#4
|
||||||
|
blt .LC4
|
||||||
|
#endif /* __STARTUP_INITIALIZE_NONCACHEDATA */
|
||||||
|
|
||||||
|
#ifdef __STARTUP_CLEAR_BSS
|
||||||
|
/* This part of work usually is done in C library startup code. Otherwise,
|
||||||
|
* define this macro to enable it in this startup.
|
||||||
|
*
|
||||||
|
* Loop to zero out BSS section, which uses following symbols
|
||||||
|
* in linker script:
|
||||||
|
* __bss_start__: start of BSS section. Must align to 4
|
||||||
|
* __bss_end__: end of BSS section. Must align to 4
|
||||||
|
*/
|
||||||
|
ldr r1, =__bss_start__
|
||||||
|
ldr r2, =__bss_end__
|
||||||
|
|
||||||
|
movs r0, 0
|
||||||
|
.LC5:
|
||||||
|
cmp r1, r2
|
||||||
|
itt lt
|
||||||
|
strlt r0, [r1], #4
|
||||||
|
blt .LC5
|
||||||
|
#endif /* __STARTUP_CLEAR_BSS */
|
||||||
|
|
||||||
|
cpsie i /* Unmask interrupts */
|
||||||
|
#ifndef __START
|
||||||
|
#define __START _start
|
||||||
|
#endif
|
||||||
|
#ifndef __ATOLLIC__
|
||||||
|
ldr r0,=__START
|
||||||
|
blx r0
|
||||||
|
#else
|
||||||
|
ldr r0,=__libc_init_array
|
||||||
|
blx r0
|
||||||
|
ldr r0,=main
|
||||||
|
bx r0
|
||||||
|
#endif
|
||||||
|
.pool
|
||||||
|
.size Reset_Handler, . - Reset_Handler
|
||||||
@@ -34,4 +34,4 @@ fi
|
|||||||
do_build TEENSY40 TEENSY40 hex
|
do_build TEENSY40 TEENSY40 hex
|
||||||
do_build TEENSY41 TEENSY41 hex
|
do_build TEENSY41 TEENSY41 hex
|
||||||
do_build MIMXRT1020_EVK MIMXRT1020_EVK bin
|
do_build MIMXRT1020_EVK MIMXRT1020_EVK bin
|
||||||
do_build MIMXRT1050_EVKB MIMXRT1050_EVKB bin
|
do_build MIMXRT1050_EVK MIMXRT1050_EVK bin
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ PATHS = [
|
|||||||
"examples/**/*.py",
|
"examples/**/*.py",
|
||||||
"extmod/**/*.py",
|
"extmod/**/*.py",
|
||||||
"ports/**/*.py",
|
"ports/**/*.py",
|
||||||
|
"ports/mimxrt/**/*.[ch]",
|
||||||
"py/**/*.py",
|
"py/**/*.py",
|
||||||
"tools/**/*.py",
|
"tools/**/*.py",
|
||||||
"tests/**/*.py",
|
"tests/**/*.py",
|
||||||
|
|||||||
Reference in New Issue
Block a user