1 /* 2 * Copyright 2018-2020, 2022 NXP 3 * All rights reserved. 4 * 5 * SPDX-License-Identifier: Apache-2.0 6 */ 7 8 #ifndef __EVKMIMXRT1170_FLEXSPI_NOR_CONFIG__ 9 #define __EVKMIMXRT1170_FLEXSPI_NOR_CONFIG__ 10 11 #include <stdint.h> 12 #include <stdbool.h> 13 #include "fsl_common.h" 14 15 /*! @name Driver version */ 16 /*@{*/ 17 /*! @brief XIP_BOARD driver version 2.0.1. */ 18 #define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 1)) 19 /*@}*/ 20 21 /* FLEXSPI memory config block related definitions */ 22 #define FLEXSPI_CFG_BLK_TAG (0x42464346UL) /* ascii "FCFB" Big Endian */ 23 #define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) /* V1.4.0 */ 24 #define FLEXSPI_CFG_BLK_SIZE (512) 25 26 /* FLEXSPI Feature related definitions */ 27 #define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1 28 29 /* Lookup table related definitions */ 30 #define CMD_INDEX_READ 0 31 #define CMD_INDEX_READSTATUS 1 32 #define CMD_INDEX_WRITEENABLE 2 33 #define CMD_INDEX_WRITE 4 34 35 #define CMD_LUT_SEQ_IDX_READ 0 36 #define CMD_LUT_SEQ_IDX_READSTATUS 1 37 #define CMD_LUT_SEQ_IDX_WRITEENABLE 3 38 #define CMD_LUT_SEQ_IDX_WRITE 9 39 40 #define CMD_SDR 0x01 41 #define CMD_DDR 0x21 42 #define RADDR_SDR 0x02 43 #define RADDR_DDR 0x22 44 #define CADDR_SDR 0x03 45 #define CADDR_DDR 0x23 46 #define MODE1_SDR 0x04 47 #define MODE1_DDR 0x24 48 #define MODE2_SDR 0x05 49 #define MODE2_DDR 0x25 50 #define MODE4_SDR 0x06 51 #define MODE4_DDR 0x26 52 #define MODE8_SDR 0x07 53 #define MODE8_DDR 0x27 54 #define WRITE_SDR 0x08 55 #define WRITE_DDR 0x28 56 #define READ_SDR 0x09 57 #define READ_DDR 0x29 58 #define LEARN_SDR 0x0A 59 #define LEARN_DDR 0x2A 60 #define DATSZ_SDR 0x0B 61 #define DATSZ_DDR 0x2B 62 #define DUMMY_SDR 0x0C 63 #define DUMMY_DDR 0x2C 64 #define DUMMY_RWDS_SDR 0x0D 65 #define DUMMY_RWDS_DDR 0x2D 66 #define JMP_ON_CS 0x1F 67 #define STOP 0 68 69 #define FLEXSPI_1PAD 0 70 #define FLEXSPI_2PAD 1 71 #define FLEXSPI_4PAD 2 72 #define FLEXSPI_8PAD 3 73 74 #define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \ 75 (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | \ 76 FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \ 77 FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1)) 78 79 /*! @brief Definitions for FlexSPI Serial Clock Frequency */ 80 typedef enum _FlexSpiSerialClockFreq { 81 kFlexSpiSerialClk_30MHz = 1, 82 kFlexSpiSerialClk_50MHz = 2, 83 kFlexSpiSerialClk_60MHz = 3, 84 kFlexSpiSerialClk_80MHz = 4, 85 kFlexSpiSerialClk_100MHz = 5, 86 kFlexSpiSerialClk_120MHz = 6, 87 kFlexSpiSerialClk_133MHz = 7, 88 kFlexSpiSerialClk_166MHz = 8, 89 kFlexSpiSerialClk_200MHz = 9, 90 } flexspi_serial_clk_freq_t; 91 92 /*! @brief FlexSPI clock configuration type */ 93 enum { 94 /* Clock configure for SDR mode */ 95 kFlexSpiClk_SDR, 96 /* Clock configurat for DDR mode */ 97 kFlexSpiClk_DDR, 98 }; 99 100 /*! @brief FlexSPI Read Sample Clock Source definition */ 101 typedef enum _FlashReadSampleClkSource { 102 kFlexSPIReadSampleClk_LoopbackInternally = 0, 103 kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1, 104 kFlexSPIReadSampleClk_LoopbackFromSckPad = 2, 105 kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3, 106 } flexspi_read_sample_clk_t; 107 108 /*! @brief Misc feature bit definitions */ 109 enum { 110 /* Bit for Differential clock enable */ 111 kFlexSpiMiscOffset_DiffClkEnable = 0, 112 /* Bit for CK2 enable */ 113 kFlexSpiMiscOffset_Ck2Enable = 1, 114 /* Bit for Parallel mode enable */ 115 kFlexSpiMiscOffset_ParallelEnable = 2, 116 /* Bit for Word Addressable enable */ 117 kFlexSpiMiscOffset_WordAddressableEnable = 3, 118 /* Bit for Safe Configuration Frequency enable */ 119 kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, 120 /* Bit for Pad setting override enable */ 121 kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, 122 /* Bit for DDR clock confiuration indication. */ 123 kFlexSpiMiscOffset_DdrModeEnable = 6, 124 }; 125 126 /*! @brief Flash Type Definition */ 127 enum { 128 /* Flash devices are Serial NOR */ 129 kFlexSpiDeviceType_SerialNOR = 1, 130 /* Flash devices are Serial NAND */ 131 kFlexSpiDeviceType_SerialNAND = 2, 132 /* Flash devices are Serial RAM/HyperFLASH */ 133 kFlexSpiDeviceType_SerialRAM = 3, 134 /* Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND */ 135 kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, 136 /* Flash device is MCP device, A1 is Serial NOR, A2 is Serial RAMs */ 137 kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, 138 }; 139 140 /*! @brief Flash Pad Definitions */ 141 enum { 142 kSerialFlash_1Pad = 1, 143 kSerialFlash_2Pads = 2, 144 kSerialFlash_4Pads = 4, 145 kSerialFlash_8Pads = 8, 146 }; 147 148 /*! @brief FlexSPI LUT Sequence structure */ 149 typedef struct _lut_sequence { 150 uint8_t seqNum; /* Sequence Number, valid number: 1-16 */ 151 uint8_t seqId; /* Sequence Index, valid number: 0-15 */ 152 uint16_t reserved; 153 } flexspi_lut_seq_t; 154 155 /*! @brief Flash Configuration Command Type */ 156 enum { 157 /* Generic command, for example: configure dummy cycles, 158 * drive strength, etc 159 */ 160 kDeviceConfigCmdType_Generic, 161 /* Quad Enable command */ 162 kDeviceConfigCmdType_QuadEnable, 163 /* Switch from SPI to DPI/QPI/OPI mode */ 164 kDeviceConfigCmdType_Spi2Xpi, 165 /* Switch from DPI/QPI/OPI to SPI mode */ 166 kDeviceConfigCmdType_Xpi2Spi, 167 /* Switch to 0-4-4/0-8-8 mode */ 168 kDeviceConfigCmdType_Spi2NoCmd, 169 /* Reset device command */ 170 kDeviceConfigCmdType_Reset, 171 }; 172 173 /*! @brief FlexSPI Memory Configuration Block */ 174 typedef struct _FlexSPIConfig { 175 /* [0x000-0x003] Tag, fixed value 0x42464346UL */ 176 uint32_t tag; 177 /* [0x004-0x007] Version, [31:24] -'V', 178 * [23:16] - Major, 179 * [15:8] - Minor, 180 * [7:0] - bugfix 181 */ 182 uint32_t version; 183 /* [0x008-0x00b] Reserved for future use */ 184 uint32_t reserved0; 185 /* [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3 */ 186 uint8_t readSampleClkSrc; 187 /* [0x00d-0x00d] CS hold time, default value: 3 */ 188 uint8_t csHoldTime; 189 /* [0x00e-0x00e] CS setup time, default value: 3 */ 190 uint8_t csSetupTime; 191 /* [0x00f-0x00f] Column Address with, for HyperBus protocol, 192 * it is fixed to 3, For Serial NAND, need to refer to datasheet 193 */ 194 uint8_t columnAddressWidth; 195 /* [0x010-0x010] Device Mode Configure enable flag, 196 * 1 - Enable, 0 - Disable 197 */ 198 uint8_t deviceModeCfgEnable; 199 /* [0x011-0x011] Specify the configuration command type:Quad Enable, 200 * DPI/QPI/OPI switch, Generic configuration, etc. 201 */ 202 uint8_t deviceModeType; 203 /* [0x012-0x013] Wait time for all configuration commands, 204 * unit: 100us, Used for DPI/QPI/OPI switch or reset command 205 */ 206 uint16_t waitTimeCfgCommands; 207 /* [0x014-0x017] Device mode sequence info, 208 * [7:0] - LUT sequence id, 209 * [15:8] - LUt sequence number, 210 * [31:16] Reserved 211 */ 212 flexspi_lut_seq_t deviceModeSeq; 213 /* [0x018-0x01b] Argument/Parameter for device configuration */ 214 uint32_t deviceModeArg; 215 /* [0x01c-0x01c] Configure command Enable Flag, 216 * 1 - Enable, 0 - Disable 217 */ 218 uint8_t configCmdEnable; 219 /* [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe */ 220 uint8_t configModeType[3]; 221 /* [0x020-0x02b] Sequence info for Device Configuration command, 222 * similar as deviceModeSeq 223 */ 224 flexspi_lut_seq_t configCmdSeqs[3]; 225 /* [0x02c-0x02f] Reserved for future use */ 226 uint32_t reserved1; 227 /* [0x030-0x03b] Arguments/Parameters for 228 * device Configuration commands 229 */ 230 uint32_t configCmdArgs[3]; 231 /* [0x03c-0x03f] Reserved for future use */ 232 uint32_t reserved2; 233 /* [0x040-0x043] Controller Misc Options, see Misc feature bit 234 * definitions for more details 235 */ 236 uint32_t controllerMiscOption; 237 /* [0x044-0x044] Device Type: 238 * See Flash Type Definition for more details 239 */ 240 uint8_t deviceType; 241 /* [0x045-0x045] Serial Flash Pad Type: 242 * 1 - Single, 243 * 2 - Dual, 244 * 4 - Quad, 245 * 8 - Octal 246 */ 247 uint8_t sflashPadType; 248 /* [0x046-0x046] Serial Flash Frequencey, device specific 249 * definitions, See System Boot Chapter for more details 250 */ 251 uint8_t serialClkFreq; 252 /* [0x047-0x047] LUT customization Enable, it is required if 253 * the program/erase cannot be done using 1 LUT sequence, 254 * currently, only applicable to HyperFLASH 255 */ 256 uint8_t lutCustomSeqEnable; 257 /* [0x048-0x04f] Reserved for future use */ 258 uint32_t reserved3[2]; 259 /* [0x050-0x053] Size of Flash connected to A1 */ 260 uint32_t sflashA1Size; 261 /* [0x054-0x057] Size of Flash connected to A2 */ 262 uint32_t sflashA2Size; 263 /* [0x058-0x05b] Size of Flash connected to B1 */ 264 uint32_t sflashB1Size; 265 /* [0x05c-0x05f] Size of Flash connected to B2 */ 266 uint32_t sflashB2Size; 267 /* [0x060-0x063] CS pad setting override value */ 268 uint32_t csPadSettingOverride; 269 /* [0x064-0x067] SCK pad setting override value */ 270 uint32_t sclkPadSettingOverride; 271 /* [0x068-0x06b] data pad setting override value */ 272 uint32_t dataPadSettingOverride; 273 /* [0x06c-0x06f] DQS pad setting override value */ 274 uint32_t dqsPadSettingOverride; 275 /* [0x070-0x073] Timeout threshold for read status command */ 276 uint32_t timeoutInMs; 277 /* [0x074-0x077] CS deselect interval between two commands */ 278 uint32_t commandInterval; 279 /* [0x078-0x07b] CLK edge to data valid time 280 * for PORT A and PORT B, in terms of 0.1ns 281 */ 282 uint16_t dataValidTime[2]; 283 /* [0x07c-0x07d] Busy offset, valid value: 0-31 */ 284 uint16_t busyOffset; 285 /* [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 286 * when flash device is busy, 1 - busy flag is 0 when 287 * flash device is busy 288 */ 289 uint16_t busyBitPolarity; 290 /* [0x080-0x17f] Lookup table holds Flash command sequences */ 291 uint32_t lookupTable[64]; 292 /* [0x180-0x1af] Customizable LUT Sequences */ 293 flexspi_lut_seq_t lutCustomSeq[12]; 294 /* [0x1b0-0x1bf] Reserved for future use */ 295 uint32_t reserved4[4]; 296 } flexspi_mem_config_t; 297 298 #define NOR_CMD_INDEX_READ CMD_INDEX_READ /* 0 */ 299 #define NOR_CMD_INDEX_READSTATUS CMD_INDEX_READSTATUS /* 1 */ 300 #define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE /* 2 */ 301 #define NOR_CMD_INDEX_ERASESECTOR 3 /* 3 */ 302 #define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE /* 4 */ 303 #define NOR_CMD_INDEX_CHIPERASE 5 /* 5 */ 304 #define NOR_CMD_INDEX_DUMMY 6 /* 6 */ 305 #define NOR_CMD_INDEX_ERASEBLOCK 7 /* 7 */ 306 307 /* 0 READ LUT sequence id in lookupTable stored in config block */ 308 #define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ 309 /* 1 Read Status LUT sequence id in lookupTable stored in config block */ 310 #define NOR_CMD_LUT_SEQ_IDX_READSTATUS CMD_LUT_SEQ_IDX_READSTATUS 311 /* 2 Read status DPI/QPI/OPI sequence id in 312 * lookupTable stored in config block 313 */ 314 #define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 2 315 /* 3 Write Enable sequence id in lookupTable stored in config block */ 316 #define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE CMD_LUT_SEQ_IDX_WRITEENABLE 317 /* 4 Write Enable DPI/QPI/OPI sequence id in 318 * lookupTable stored in config block 319 */ 320 #define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI 4 321 /* 5 Erase Sector sequence id in lookupTable stored in config block */ 322 #define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5 323 /* 8 Erase Block sequence id in lookupTable stored in config block */ 324 #define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK 8 325 /* 9 Program sequence id in lookupTable stored in config block */ 326 #define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM CMD_LUT_SEQ_IDX_WRITE 327 /* 11 Chip Erase sequence in lookupTable id stored in config block */ 328 #define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11 329 /* 13 Read SFDP sequence in lookupTable id stored in config block */ 330 #define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13 331 /* 14 Restore 0-4-4/0-8-8 mode sequence id in 332 * lookupTable stored in config block 333 */ 334 #define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD 14 335 /* 15 Exit 0-4-4/0-8-8 mode sequence id in 336 * lookupTable stored in config blobk 337 */ 338 #define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD 15 339 340 /* 341 * Serial NOR configuration block 342 */ 343 typedef struct _flexspi_nor_config { 344 /* Common memory configuration info via FlexSPI */ 345 flexspi_mem_config_t memConfig; 346 /* Page size of Serial NOR */ 347 uint32_t pageSize; 348 /* Sector size of Serial NOR */ 349 uint32_t sectorSize; 350 /* Clock frequency for IP command */ 351 uint8_t ipcmdSerialClkFreq; 352 /* Sector/Block size is the same */ 353 uint8_t isUniformBlockSize; 354 /* The data order is swapped in OPI DDR mode */ 355 uint8_t isDataOrderSwapped; 356 /* Reserved for future use */ 357 uint8_t reserved0; 358 /* Serial NOR Flash type: 0/1/2/3 */ 359 uint8_t serialNorType; 360 /* Need to exit NoCmd mode before other IP command */ 361 uint8_t needExitNoCmdMode; 362 /* Half the Serial Clock for non-read command: true/false */ 363 uint8_t halfClkForNonReadCmd; 364 /* Need to Restore NoCmd mode after IP commmand execution */ 365 uint8_t needRestoreNoCmdMode; 366 /* Block size */ 367 uint32_t blockSize; 368 /* Flash State Context after being configured */ 369 uint32_t FlashStateCtx; 370 /* Reserved for future use */ 371 uint32_t reserve2[10]; 372 } flexspi_nor_config_t; 373 374 #ifdef __cplusplus 375 extern "C" { 376 #endif 377 378 #ifdef __cplusplus 379 } 380 #endif 381 #endif /* #ifndef __EVKMIMXRT1170_FLEXSPI_NOR_CONFIG__ */ 382