File indexing completed on 2025-05-11 08:22:50
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef __FSL_FLEXSPI_NOR_CONFIG__
0011 #define __FSL_FLEXSPI_NOR_CONFIG__
0012
0013 #include <stdint.h>
0014 #include <stdbool.h>
0015 #include "fsl_common.h"
0016
0017
0018
0019
0020 #define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 1))
0021
0022
0023
0024 #define FLEXSPI_CFG_BLK_TAG (0x42464346UL)
0025 #define FLEXSPI_CFG_BLK_VERSION (0x56010400UL)
0026 #define FLEXSPI_CFG_BLK_SIZE (512)
0027
0028
0029 #define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
0030
0031
0032 #define CMD_INDEX_READ 0
0033 #define CMD_INDEX_READSTATUS 1
0034 #define CMD_INDEX_WRITEENABLE 2
0035 #define CMD_INDEX_WRITE 4
0036
0037 #define CMD_LUT_SEQ_IDX_READ 0
0038 #define CMD_LUT_SEQ_IDX_READSTATUS 1
0039 #define CMD_LUT_SEQ_IDX_WRITEENABLE 3
0040 #define CMD_LUT_SEQ_IDX_WRITE 9
0041
0042 #define CMD_SDR 0x01
0043 #define CMD_DDR 0x21
0044 #define RADDR_SDR 0x02
0045 #define RADDR_DDR 0x22
0046 #define CADDR_SDR 0x03
0047 #define CADDR_DDR 0x23
0048 #define MODE1_SDR 0x04
0049 #define MODE1_DDR 0x24
0050 #define MODE2_SDR 0x05
0051 #define MODE2_DDR 0x25
0052 #define MODE4_SDR 0x06
0053 #define MODE4_DDR 0x26
0054 #define MODE8_SDR 0x07
0055 #define MODE8_DDR 0x27
0056 #define WRITE_SDR 0x08
0057 #define WRITE_DDR 0x28
0058 #define READ_SDR 0x09
0059 #define READ_DDR 0x29
0060 #define LEARN_SDR 0x0A
0061 #define LEARN_DDR 0x2A
0062 #define DATSZ_SDR 0x0B
0063 #define DATSZ_DDR 0x2B
0064 #define DUMMY_SDR 0x0C
0065 #define DUMMY_DDR 0x2C
0066 #define DUMMY_RWDS_SDR 0x0D
0067 #define DUMMY_RWDS_DDR 0x2D
0068 #define JMP_ON_CS 0x1F
0069 #define STOP 0
0070
0071 #define FLEXSPI_1PAD 0
0072 #define FLEXSPI_2PAD 1
0073 #define FLEXSPI_4PAD 2
0074 #define FLEXSPI_8PAD 3
0075
0076 #define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
0077 (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
0078 FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
0079
0080
0081 typedef enum _FlexSpiSerialClockFreq
0082 {
0083 kFlexSpiSerialClk_30MHz = 1,
0084 kFlexSpiSerialClk_50MHz = 2,
0085 kFlexSpiSerialClk_60MHz = 3,
0086 #if defined(MIMXRT1011_SERIES)
0087 kFlexSpiSerialClk_75MHz = 4,
0088 kFlexSpiSerialClk_80MHz = 5,
0089 kFlexSpiSerialClk_100MHz = 6,
0090 kFlexSpiSerialClk_120MHz = 7,
0091 kFlexSpiSerialClk_133MHz = 8,
0092 #elif defined(MIMXRT1015_SERIES) || defined(MIMXRT1021_SERIES) || defined(MIMXRT1024_SERIES)
0093 kFlexSpiSerialClk_75MHz = 4,
0094 kFlexSpiSerialClk_80MHz = 5,
0095 kFlexSpiSerialClk_100MHz = 6,
0096 kFlexSpiSerialClk_133MHz = 7,
0097 #elif defined(MIMXRT1052_SERIES)
0098 kFlexSpiSerialClk_75MHz = 4,
0099 kFlexSpiSerialClk_80MHz = 5,
0100 kFlexSpiSerialClk_100MHz = 6,
0101 kFlexSpiSerialClk_133MHz = 7,
0102 kFlexSpiSerialClk_166MHz = 8,
0103 #elif defined(MIMXRT1042_SERIES) || defined(MIMXRT1062_SERIES) || defined(MIMXRT1064_SERIES)
0104 kFlexSpiSerialClk_75MHz = 4,
0105 kFlexSpiSerialClk_80MHz = 5,
0106 kFlexSpiSerialClk_100MHz = 6,
0107 kFlexSpiSerialClk_120MHz = 7,
0108 kFlexSpiSerialClk_133MHz = 8,
0109 kFlexSpiSerialClk_166MHz = 9,
0110 #elif defined(MIMXRT1166_cm4_SERIES) || defined(MIMXRT1166_cm7_SERIES) || \
0111 defined(MIMXRT1176_cm4_SERIES) || defined(MIMXRT1176_cm7_SERIES)
0112 kFlexSpiSerialClk_80MHz = 4,
0113 kFlexSpiSerialClk_100MHz = 5,
0114 kFlexSpiSerialClk_120MHz = 6,
0115 kFlexSpiSerialClk_133MHz = 7,
0116 kFlexSpiSerialClk_166MHz = 8,
0117 kFlexSpiSerialClk_200MHz = 9,
0118 #endif
0119 } flexspi_serial_clk_freq_t;
0120
0121
0122 enum
0123 {
0124 kFlexSpiClk_SDR,
0125 kFlexSpiClk_DDR,
0126 };
0127
0128
0129 typedef enum _FlashReadSampleClkSource
0130 {
0131 kFlexSPIReadSampleClk_LoopbackInternally = 0,
0132 kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
0133 kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
0134 kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
0135 } flexspi_read_sample_clk_t;
0136
0137
0138 enum
0139 {
0140 kFlexSpiMiscOffset_DiffClkEnable = 0,
0141 kFlexSpiMiscOffset_Ck2Enable = 1,
0142 kFlexSpiMiscOffset_ParallelEnable = 2,
0143 kFlexSpiMiscOffset_WordAddressableEnable = 3,
0144 kFlexSpiMiscOffset_SafeConfigFreqEnable = 4,
0145 kFlexSpiMiscOffset_PadSettingOverrideEnable = 5,
0146 kFlexSpiMiscOffset_DdrModeEnable = 6,
0147 };
0148
0149
0150 enum
0151 {
0152 kFlexSpiDeviceType_SerialNOR = 1,
0153 kFlexSpiDeviceType_SerialNAND = 2,
0154 kFlexSpiDeviceType_SerialRAM = 3,
0155 kFlexSpiDeviceType_MCP_NOR_NAND = 0x12,
0156 kFlexSpiDeviceType_MCP_NOR_RAM = 0x13,
0157 };
0158
0159
0160 enum
0161 {
0162 kSerialFlash_1Pad = 1,
0163 kSerialFlash_2Pads = 2,
0164 kSerialFlash_4Pads = 4,
0165 kSerialFlash_8Pads = 8,
0166 };
0167
0168
0169 typedef struct _lut_sequence
0170 {
0171 uint8_t seqNum;
0172 uint8_t seqId;
0173 uint16_t reserved;
0174 } flexspi_lut_seq_t;
0175
0176
0177 enum
0178 {
0179 kDeviceConfigCmdType_Generic,
0180 kDeviceConfigCmdType_QuadEnable,
0181 kDeviceConfigCmdType_Spi2Xpi,
0182 kDeviceConfigCmdType_Xpi2Spi,
0183 kDeviceConfigCmdType_Spi2NoCmd,
0184 kDeviceConfigCmdType_Reset,
0185 };
0186
0187
0188 typedef struct _FlexSPIConfig
0189 {
0190 uint32_t tag;
0191 uint32_t version;
0192 uint32_t reserved0;
0193 uint8_t readSampleClkSrc;
0194 uint8_t csHoldTime;
0195 uint8_t csSetupTime;
0196 uint8_t columnAddressWidth;
0197
0198 uint8_t deviceModeCfgEnable;
0199 uint8_t deviceModeType;
0200
0201 uint16_t waitTimeCfgCommands;
0202
0203 flexspi_lut_seq_t deviceModeSeq;
0204
0205 uint32_t deviceModeArg;
0206 uint8_t configCmdEnable;
0207 uint8_t configModeType[3];
0208 flexspi_lut_seq_t
0209 configCmdSeqs[3];
0210 uint32_t reserved1;
0211 uint32_t configCmdArgs[3];
0212 uint32_t reserved2;
0213 uint32_t controllerMiscOption;
0214
0215 uint8_t deviceType;
0216 uint8_t sflashPadType;
0217 uint8_t serialClkFreq;
0218
0219 uint8_t lutCustomSeqEnable;
0220
0221 uint32_t reserved3[2];
0222 uint32_t sflashA1Size;
0223 uint32_t sflashA2Size;
0224 uint32_t sflashB1Size;
0225 uint32_t sflashB2Size;
0226 uint32_t csPadSettingOverride;
0227 uint32_t sclkPadSettingOverride;
0228 uint32_t dataPadSettingOverride;
0229 uint32_t dqsPadSettingOverride;
0230 uint32_t timeoutInMs;
0231 uint32_t commandInterval;
0232 uint16_t dataValidTime[2];
0233 uint16_t busyOffset;
0234 uint16_t busyBitPolarity;
0235
0236 uint32_t lookupTable[64];
0237 flexspi_lut_seq_t lutCustomSeq[12];
0238 uint32_t reserved4[4];
0239 } flexspi_mem_config_t;
0240
0241
0242 #define NOR_CMD_INDEX_READ CMD_INDEX_READ
0243 #define NOR_CMD_INDEX_READSTATUS CMD_INDEX_READSTATUS
0244 #define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE
0245 #define NOR_CMD_INDEX_ERASESECTOR 3
0246 #define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE
0247 #define NOR_CMD_INDEX_CHIPERASE 5
0248 #define NOR_CMD_INDEX_DUMMY 6
0249 #define NOR_CMD_INDEX_ERASEBLOCK 7
0250
0251 #define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ
0252 #define NOR_CMD_LUT_SEQ_IDX_READSTATUS \
0253 CMD_LUT_SEQ_IDX_READSTATUS
0254 #define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI \
0255 2
0256 #define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE \
0257 CMD_LUT_SEQ_IDX_WRITEENABLE
0258 #define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI \
0259 4
0260 #define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
0261 #define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK 8
0262 #define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM \
0263 CMD_LUT_SEQ_IDX_WRITE
0264 #define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
0265 #define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13
0266 #define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD \
0267 14
0268 #define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD \
0269 15
0270
0271
0272
0273
0274 typedef struct _flexspi_nor_config
0275 {
0276 flexspi_mem_config_t memConfig;
0277 uint32_t pageSize;
0278 uint32_t sectorSize;
0279 uint8_t ipcmdSerialClkFreq;
0280 uint8_t isUniformBlockSize;
0281 uint8_t isDataOrderSwapped;
0282 uint8_t reserved0;
0283 uint8_t serialNorType;
0284 uint8_t needExitNoCmdMode;
0285 uint8_t halfClkForNonReadCmd;
0286 uint8_t needRestoreNoCmdMode;
0287 uint32_t blockSize;
0288 uint32_t FlashStateCtx;
0289 uint32_t reserve2[10];
0290 } flexspi_nor_config_t;
0291
0292 #ifdef __cplusplus
0293 extern "C" {
0294 #endif
0295
0296 #ifdef __cplusplus
0297 }
0298 #endif
0299 #endif