1 /*
2  * Copyright 2017-2020 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #ifndef _FSL_ROMAPI_H_
9 #define _FSL_ROMAPI_H_
10 
11 #include "fsl_common.h"
12 
13 /*!
14  * @addtogroup romapi
15  * @{
16  */
17 
18 /*! @brief ROMAPI version 1.1.1. */
19 #define FSL_ROM_ROMAPI_VERSION (MAKE_VERSION(1U, 1U, 1U))
20 /*! @brief ROM FLEXSPI NOR driver version 1.4.0. */
21 #define FSL_ROM_FLEXSPINOR_DRIVER_VERSION (MAKE_VERSION(1U, 4U, 0U))
22 
23 /*!
24  * @name Common ROMAPI fearures info defines
25  * @{
26  */
27 /* @brief ROM has FLEXSPI NOR API. */
28 #define FSL_ROM_HAS_FLEXSPINOR_API (1)
29 /* @brief ROM has run bootloader API. */
30 #define FSL_ROM_HAS_RUNBOOTLOADER_API (0)
31 /* @brief ROM has FLEXSPI NOR get config API. */
32 #define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_GET_CONFIG (0)
33 /* @brief ROM has flash init API. */
34 #define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_FLASH_INIT (1)
35 /* @brief ROM has erase API. */
36 #define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE (1)
37 /* @brief ROM has erase sector API. */
38 #define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_SECTOR (1)
39 /* @brief ROM has erase block API. */
40 #define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_BLOCK (0)
41 /* @brief ROM has erase all API. */
42 #define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_ALL (1)
43 /* @brief ROM has page program API. */
44 #define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_PAGE_PROGRAM (1)
45 /* @brief ROM has update lut API. */
46 #define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_UPDATE_LUT (1)
47 /* @brief ROM has FLEXSPI command API. */
48 #define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_CMD_XFER (1)
49 
50 /*@}*/
51 
52 #define kROM_StatusGroup_FLEXSPI    60U  /*!< ROM FLEXSPI status group number.*/
53 #define kROM_StatusGroup_FLEXSPINOR 200U /*!< ROM FLEXSPI NOR status group number.*/
54 
55 #define FSL_ROM_FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)                                                      \
56     (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
57      FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
58 
59 /*! @brief Generate bit mask */
60 #define FSL_ROM_FLEXSPI_BITMASK(bit_offset) (1U << (bit_offset))
61 
62 /*! @brief FLEXSPI memory config block related defintions */
63 #define FLEXSPI_CFG_BLK_TAG     (0x42464346UL) /*!< ascii "FCFB" Big Endian */
64 #define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) /*!< V1.4.0 */
65 
66 #define CMD_SDR        0x01U
67 #define CMD_DDR        0x21U
68 #define RADDR_SDR      0x02U
69 #define RADDR_DDR      0x22U
70 #define CADDR_SDR      0x03U
71 #define CADDR_DDR      0x23U
72 #define MODE1_SDR      0x04U
73 #define MODE1_DDR      0x24U
74 #define MODE2_SDR      0x05U
75 #define MODE2_DDR      0x25U
76 #define MODE4_SDR      0x06U
77 #define MODE4_DDR      0x26U
78 #define MODE8_SDR      0x07U
79 #define MODE8_DDR      0x27U
80 #define WRITE_SDR      0x08U
81 #define WRITE_DDR      0x28U
82 #define READ_SDR       0x09U
83 #define READ_DDR       0x29U
84 #define LEARN_SDR      0x0AU
85 #define LEARN_DDR      0x2AU
86 #define DATSZ_SDR      0x0BU
87 #define DATSZ_DDR      0x2BU
88 #define DUMMY_SDR      0x0CU
89 #define DUMMY_DDR      0x2CU
90 #define DUMMY_RWDS_SDR 0x0DU
91 #define DUMMY_RWDS_DDR 0x2DU
92 #define JMP_ON_CS      0x1FU
93 #define STOP           0U
94 
95 #define FLEXSPI_1PAD 0U
96 #define FLEXSPI_2PAD 1U
97 #define FLEXSPI_4PAD 2U
98 #define FLEXSPI_8PAD 3U
99 
100 /* Lookup table related defintions */
101 #define NOR_CMD_INDEX_READ        0U
102 #define NOR_CMD_INDEX_READSTATUS  1U
103 #define NOR_CMD_INDEX_WRITEENABLE 2U
104 #define NOR_CMD_INDEX_ERASESECTOR 3U
105 #define NOR_CMD_INDEX_PAGEPROGRAM 4U
106 #define NOR_CMD_INDEX_CHIPERASE   5U
107 #define NOR_CMD_INDEX_DUMMY       6U
108 #define NOR_CMD_INDEX_ERASEBLOCK  7U
109 
110 /*!
111  * NOR LUT sequence index used for default LUT assignment
112  * NOTE:
113  *      The will take effect if the lut sequences are not customized.
114  */
115 #define NOR_CMD_LUT_SEQ_IDX_READ       0U /*!< READ LUT sequence id in lookupTable stored in config block */
116 #define NOR_CMD_LUT_SEQ_IDX_READSTATUS 1U /*!< Read Status LUT sequence id in lookupTable stored in config block */
117 #define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI \
118     2U /*!< Read status DPI/QPI/OPI sequence id in lookupTable stored in config block */
119 #define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3U /*!< Write Enable sequence id in lookupTable stored in config block */
120 #define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI \
121     4U /*!< Write Enable DPI/QPI/OPI sequence id in lookupTable stored in config block */
122 #define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5U  /*!< Erase Sector sequence id in lookupTable stored in config block */
123 #define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK  8U  /*!< Erase Block sequence id in lookupTable stored in config block */
124 #define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9U  /*!< Program sequence id in lookupTable stored in config block */
125 #define NOR_CMD_LUT_SEQ_IDX_CHIPERASE   11U /*!< Chip Erase sequence in lookupTable id stored in config block */
126 #define NOR_CMD_LUT_SEQ_IDX_READ_SFDP   13U /*!< Read SFDP sequence in lookupTable id stored in config block */
127 #define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD \
128     14U /*!< Restore 0-4-4/0-8-8 mode sequence id in lookupTable stored in config block */
129 #define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD \
130     15U /*!< Exit 0-4-4/0-8-8 mode sequence id in lookupTable stored in config blobk */
131 
132 /*!
133  * @name Support for init FLEXSPI NOR configuration
134  * @{
135  */
136 /*! @brief Flash Pad Definitions */
137 enum
138 {
139     kSerialFlash_1Pad  = 1U,
140     kSerialFlash_2Pads = 2U,
141     kSerialFlash_4Pads = 4U,
142     kSerialFlash_8Pads = 8U,
143 };
144 
145 /*! @brief FLEXSPI clock configuration type */
146 enum
147 {
148     kFLEXSPIClk_SDR, /*!< Clock configure for SDR mode */
149     kFLEXSPIClk_DDR, /*!< Clock configurat for DDR mode */
150 };
151 
152 /*! @brief FLEXSPI Read Sample Clock Source definition */
153 enum _flexspi_read_sample_clk
154 {
155     kFLEXSPIReadSampleClk_LoopbackInternally      = 0U,
156     kFLEXSPIReadSampleClk_LoopbackFromDqsPad      = 1U,
157     kFLEXSPIReadSampleClk_LoopbackFromSckPad      = 2U,
158     kFLEXSPIReadSampleClk_ExternalInputFromDqsPad = 3U,
159 };
160 
161 /*! @brief Flash Type Definition */
162 enum
163 {
164     kFLEXSPIDeviceType_SerialNOR = 1U, /*!< Flash device is Serial NOR */
165 };
166 
167 /*! @brief Flash Configuration Command Type */
168 enum
169 {
170     kDeviceConfigCmdType_Generic,    /*!< Generic command, for example: configure dummy cycles, drive strength, etc */
171     kDeviceConfigCmdType_QuadEnable, /*!< Quad Enable command */
172     kDeviceConfigCmdType_Spi2Xpi,    /*!< Switch from SPI to DPI/QPI/OPI mode */
173     kDeviceConfigCmdType_Xpi2Spi,    /*!< Switch from DPI/QPI/OPI to SPI mode */
174     kDeviceConfigCmdType_Spi2NoCmd,  /*!< Switch to 0-4-4/0-8-8 mode */
175     kDeviceConfigCmdType_Reset,      /*!< Reset device command */
176 };
177 
178 /*! @brief Defintions for FLEXSPI Serial Clock Frequency */
179 enum _flexspi_serial_clk_freq
180 {
181     kFLEXSPISerialClk_NoChange = 0U,
182     kFLEXSPISerialClk_30MHz    = 1U,
183     kFLEXSPISerialClk_50MHz    = 2U,
184     kFLEXSPISerialClk_60MHz    = 3U,
185     kFLEXSPISerialClk_75MHz    = 4U,
186     kFLEXSPISerialClk_80MHz    = 5U,
187     kFLEXSPISerialClk_100MHz   = 6U,
188     kFLEXSPISerialClk_133MHz   = 7U,
189     kFLEXSPISerialClk_166MHz   = 8U,
190     kFLEXSPISerialClk_200MHz   = 9U,
191 };
192 
193 /*! @brief Misc feature bit definitions */
194 enum
195 {
196     kFLEXSPIMiscOffset_DiffClkEnable            = 0U, /*!< Bit for Differential clock enable */
197     kFLEXSPIMiscOffset_Ck2Enable                = 1U, /*!< Bit for CK2 enable */
198     kFLEXSPIMiscOffset_ParallelEnable           = 2U, /*!< Bit for Parallel mode enable */
199     kFLEXSPIMiscOffset_WordAddressableEnable    = 3U, /*!< Bit for Word Addressable enable */
200     kFLEXSPIMiscOffset_SafeConfigFreqEnable     = 4U, /*!< Bit for Safe Configuration Frequency enable */
201     kFLEXSPIMiscOffset_PadSettingOverrideEnable = 5U, /*!< Bit for Pad setting override enable */
202     kFLEXSPIMiscOffset_DdrModeEnable            = 6U, /*!< Bit for DDR clock confiuration indication. */
203     kFLEXSPIMiscOffset_UseValidTimeForAllFreq   = 7U, /*!< Bit for DLLCR settings under all modes */
204 };
205 
206 enum
207 {
208     kSerialNorType_StandardSPI, /*!< Device that support Standard SPI and Extended SPI mode */
209     kSerialNorType_HyperBus,    /*!< Device that supports HyperBus only */
210     kSerialNorType_XPI,         /*!< Device that works under DPI, QPI or OPI mode */
211     kSerialNorType_NoCmd,       /*!< Device that works under No command mode (XIP mode/Performance Enhance
212                                      mode/continous read mode) */
213 };
214 
215 /*@}*/
216 
217 /*!
218  * @name FLEXSPI NOR Configuration
219  * @{
220  */
221 
222 /*! @brief FLEXSPI LUT Sequence structure */
223 typedef struct _flexspi_lut_seq
224 {
225     uint8_t seqNum; /*!< Sequence Number, valid number: 1-16 */
226     uint8_t seqId;  /*!< Sequence Index, valid number: 0-15 */
227     uint16_t reserved;
228 } flexspi_lut_seq_t;
229 
230 typedef struct
231 {
232     uint8_t time_100ps;  /*!< Data valid time, in terms of 100ps */
233     uint8_t delay_cells; /*!< Data valid time, in terms of delay cells */
234 } flexspi_dll_time_t;
235 
236 /*! @brief FLEXSPI Memory Configuration Block */
237 typedef struct _flexspi_mem_config
238 {
239     uint32_t tag;       /*!< [0x000-0x003] Tag, fixed value 0x42464346UL */
240     uint32_t version;   /*!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix */
241     uint32_t reserved0; /*!< [0x008-0x00b] Reserved for future use */
242     uint8_t readSampleClkSrc;    /*!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3 */
243     uint8_t csHoldTime;          /*!< [0x00d-0x00d] Data hold time, default value: 3 */
244     uint8_t csSetupTime;         /*!< [0x00e-0x00e] Date setup time, default value: 3 */
245     uint8_t columnAddressWidth;  /*!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
246                                                     Serial NAND, need to refer to datasheet */
247     uint8_t deviceModeCfgEnable; /*!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable */
248     uint8_t deviceModeType; /*!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
249                                                Generic configuration, etc. */
250     uint16_t waitTimeCfgCommands;    /*!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
251                                                         DPI/QPI/OPI switch or reset command */
252     flexspi_lut_seq_t deviceModeSeq; /*!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
253                                                         sequence number, [31:16] Reserved */
254     uint32_t deviceModeArg;          /*!< [0x018-0x01b] Argument/Parameter for device configuration */
255     uint8_t configCmdEnable;         /*!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable */
256     uint8_t configModeType[3];       /*!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe */
257     flexspi_lut_seq_t
258         configCmdSeqs[3]; /*!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq */
259     uint32_t reserved1;   /*!< [0x02c-0x02f] Reserved for future use */
260     uint32_t configCmdArgs[3];     /*!< [0x030-0x03b] Arguments/Parameters for device Configuration commands */
261     uint32_t reserved2;            /*!< [0x03c-0x03f] Reserved for future use */
262     uint32_t controllerMiscOption; /*!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
263                                       details */
264     uint8_t deviceType;            /*!< [0x044-0x044] Device Type:  See Flash Type Definition for more details */
265     uint8_t sflashPadType; /*!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal */
266     uint8_t serialClkFreq; /*!< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
267                                               Chapter for more details */
268     uint8_t
269         lutCustomSeqEnable; /*!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
270                                               be done using 1 LUT sequence, currently, only applicable to HyperFLASH */
271     uint32_t reserved3[2];  /*!< [0x048-0x04f] Reserved for future use */
272     uint32_t sflashA1Size;  /*!< [0x050-0x053] Size of Flash connected to A1 */
273     uint32_t sflashA2Size;  /*!< [0x054-0x057] Size of Flash connected to A2 */
274     uint32_t sflashB1Size;  /*!< [0x058-0x05b] Size of Flash connected to B1 */
275     uint32_t sflashB2Size;  /*!< [0x05c-0x05f] Size of Flash connected to B2 */
276     uint32_t csPadSettingOverride;       /*!< [0x060-0x063] CS pad setting override value */
277     uint32_t sclkPadSettingOverride;     /*!< [0x064-0x067] SCK pad setting override value */
278     uint32_t dataPadSettingOverride;     /*!< [0x068-0x06b] data pad setting override value */
279     uint32_t dqsPadSettingOverride;      /*!< [0x06c-0x06f] DQS pad setting override value */
280     uint32_t timeoutInMs;                /*!< [0x070-0x073] Timeout threshold for read status command */
281     uint32_t commandInterval;            /*!< [0x074-0x077] CS deselect interval between two commands */
282     flexspi_dll_time_t dataValidTime[2]; /*!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B */
283     uint16_t busyOffset;                 /*!< [0x07c-0x07d] Busy offset, valid value: 0-31 */
284     uint16_t busyBitPolarity; /*!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
285                                                  busy flag is 0 when flash device is busy */
286     uint32_t lookupTable[64]; /*!< [0x080-0x17f] Lookup table holds Flash command sequences */
287     flexspi_lut_seq_t lutCustomSeq[12]; /*!< [0x180-0x1af] Customizable LUT Sequences */
288     uint32_t reserved4[4];              /*!< [0x1b0-0x1bf] Reserved for future use */
289 } flexspi_mem_config_t;
290 
291 /*! @brief  Serial NOR configuration block */
292 typedef struct _flexspi_nor_config
293 {
294     flexspi_mem_config_t memConfig; /*!< Common memory configuration info via FLEXSPI */
295     uint32_t pageSize;              /*!< Page size of Serial NOR */
296     uint32_t sectorSize;            /*!< Sector size of Serial NOR */
297     uint8_t ipcmdSerialClkFreq;     /*!< Clock frequency for IP command */
298     uint8_t isUniformBlockSize;     /*!< Sector/Block size is the same */
299     uint8_t isDataOrderSwapped;     /*!< Data order (D0, D1, D2, D3) is swapped (D1,D0, D3, D2) */
300     uint8_t reserved0[1];           /*!< Reserved for future use */
301     uint8_t serialNorType;          /*!< Serial NOR Flash type: 0/1/2/3 */
302     uint8_t needExitNoCmdMode;      /*!< Need to exit NoCmd mode before other IP command */
303     uint8_t halfClkForNonReadCmd;   /*!< Half the Serial Clock for non-read command: true/false */
304     uint8_t needRestoreNoCmdMode;   /*!< Need to Restore NoCmd mode after IP commmand execution */
305     uint32_t blockSize;             /*!< Block size */
306     uint32_t reserve2[11];          /*!< Reserved for future use */
307 } flexspi_nor_config_t;
308 
309 /*@}*/
310 
311 /*! @brief Manufacturer ID */
312 enum
313 {
314     kSerialFlash_ISSI_ManufacturerID    = 0x9DU, /*!< Manufacturer ID of the ISSI serial flash */
315     kSerialFlash_Adesto_ManufacturerID  = 0x1F,  /*!< Manufacturer ID of the Adesto Technologies serial flash*/
316     kSerialFlash_Winbond_ManufacturerID = 0xEFU, /*!< Manufacturer ID of the Winbond serial flash */
317     kSerialFlash_Cypress_ManufacturerID = 0x01U, /*!< Manufacturer ID for Cypress */
318 };
319 
320 /*! @brief ROM FLEXSPI NOR flash status */
321 enum _flexspi_nor_status
322 {
323     kStatus_ROM_FLEXSPI_SequenceExecutionTimeout =
324         MAKE_STATUS(kROM_StatusGroup_FLEXSPI, 0), /*!< Status for Sequence Execution timeout */
325     kStatus_ROM_FLEXSPI_InvalidSequence = MAKE_STATUS(kROM_StatusGroup_FLEXSPI, 1), /*!< Status for Invalid Sequence */
326     kStatus_ROM_FLEXSPI_DeviceTimeout   = MAKE_STATUS(kROM_StatusGroup_FLEXSPI, 2), /*!< Status for Device timeout */
327     kStatus_FLEXSPINOR_DTRRead_DummyProbeFailed =
328         MAKE_STATUS(kROM_StatusGroup_FLEXSPINOR, 10), /*!< Status for DDR Read dummy probe failure */
329     kStatus_ROM_FLEXSPINOR_SFDP_NotFound =
330         MAKE_STATUS(kROM_StatusGroup_FLEXSPINOR, 7), /*!< Status for SFDP read failure */
331     kStatus_ROM_FLEXSPINOR_Flash_NotFound =
332         MAKE_STATUS(kROM_StatusGroup_FLEXSPINOR, 9), /*!< Status for Flash detection failure */
333 };
334 
335 /*! @brief FLEXSPI Operation Context */
336 typedef enum _flexspi_operation
337 {
338     kFLEXSPIOperation_Command, /*!< FLEXSPI operation: Only command, both TX and RX buffer are ignored. */
339     kFLEXSPIOperation_Config,  /*!< FLEXSPI operation: Configure device mode, the TX FIFO size is fixed in LUT. */
340     kFLEXSPIOperation_Write,   /*!< FLEXSPI operation: Write, only TX buffer is effective */
341     kFLEXSPIOperation_Read,    /*!< FLEXSPI operation: Read, only Rx Buffer is effective. */
342     kFLEXSPIOperation_End = kFLEXSPIOperation_Read,
343 } flexspi_operation_t;
344 
345 /*! @brief FLEXSPI Transfer Context */
346 typedef struct _flexspi_xfer
347 {
348     flexspi_operation_t operation; /*!< FLEXSPI operation */
349     uint32_t baseAddress;          /*!< FLEXSPI operation base address */
350     uint32_t seqId;                /*!< Sequence Id */
351     uint32_t seqNum;               /*!< Sequence Number */
352     bool isParallelModeEnable;     /*!< Is a parallel transfer */
353     uint32_t *txBuffer;            /*!< Tx buffer */
354     uint32_t txSize;               /*!< Tx size in bytes */
355     uint32_t *rxBuffer;            /*!< Rx buffer */
356     uint32_t rxSize;               /*!< Rx size in bytes */
357 } flexspi_xfer_t;
358 
359 #ifdef __cplusplus
360 extern "C" {
361 #endif
362 
363 #if defined(FSL_FEATURE_BOOT_ROM_HAS_ROMAPI) && FSL_FEATURE_BOOT_ROM_HAS_ROMAPI
364 
365 /*!
366  * @name Initialization
367  * @{
368  */
369 
370 /*!
371  * @brief Initialize Serial NOR flash via FLEXSPI
372  *
373  * This function checks and initializes the FLEXSPI module for the other FLEXSPI APIs.
374  *
375  * @param instance storage the instance of FLEXSPI.
376  * @param config A pointer to the storage for the driver runtime state.
377  *
378  * @retval kStatus_Success Api was executed succesfuly.
379  * @retval kStatus_InvalidArgument A invalid argument is provided.
380  * @retval kStatus_ROM_FLEXSPI_InvalidSequence A invalid Sequence is provided.
381  * @retval kStatus_ROM_FLEXSPI_SequenceExecutionTimeout Sequence Execution timeout.
382  * @retval kStatus_ROM_FLEXSPI_DeviceTimeout the device timeout
383  */
384 status_t ROM_FLEXSPI_NorFlash_Init(uint32_t instance, flexspi_nor_config_t *config);
385 
386 /*@}*/
387 
388 /*!
389  * @name Programming
390  * @{
391  */
392 /*!
393  * @brief Program data to Serial NOR flash via FLEXSPI.
394  *
395  * This function programs the NOR flash memory with the dest address for a given
396  * flash area as determined by the dst address and the length.
397  *
398  * @param instance storage the instance of FLEXSPI.
399  * @param config  A pointer to the storage for the driver runtime state.
400  * @param dstAddr A pointer to the desired flash memory to be programmed.
401  *                NOTE:
402  *                It is recommended that use page aligned access;
403  *                If the dstAddr is not aligned to page,the driver automatically
404  *                aligns address down with the page address.
405  * @param src A pointer to the source buffer of data that is to be programmed
406  *            into the NOR flash.
407  *
408  * @retval kStatus_Success Api was executed succesfuly.
409  * @retval kStatus_InvalidArgument A invalid argument is provided.
410  * @retval kStatus_ROM_FLEXSPI_InvalidSequence A invalid Sequence is provided.
411  * @retval kStatus_ROM_FLEXSPI_SequenceExecutionTimeout Sequence Execution timeout.
412  * @retval kStatus_ROM_FLEXSPI_DeviceTimeout the device timeout
413  */
414 status_t ROM_FLEXSPI_NorFlash_ProgramPage(uint32_t instance,
415                                           flexspi_nor_config_t *config,
416                                           uint32_t dstAddr,
417                                           const uint32_t *src);
418 
419 /*@}*/
420 
421 /*!
422  * @name Erasing
423  * @{
424  */
425 #if defined(FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_SECTOR) && FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_SECTOR
426 /*!
427  * @brief Erase one sector specified by address
428  *
429  * This function erases one of NOR flash sectors based on the desired address.
430  *
431  * @param instance storage the index of FLEXSPI.
432  * @param config A pointer to the storage for the driver runtime state.
433  * @param address The start address of the desired NOR flash memory to be erased.
434  *                NOTE:
435  *                It is recommended that use sector-aligned access nor device;
436  *                If dstAddr is not aligned with the sector,The driver automatically
437  *                aligns address down with the sector address.
438  *
439  * @retval kStatus_Success Api was executed succesfuly.
440  * @retval kStatus_InvalidArgument A invalid argument is provided.
441  * @retval kStatus_ROM_FLEXSPI_InvalidSequence A invalid Sequence is provided.
442  * @retval kStatus_ROM_FLEXSPI_SequenceExecutionTimeout Sequence Execution timeout.
443  * @retval kStatus_ROM_FLEXSPI_DeviceTimeout the device timeout
444  */
445 status_t ROM_FLEXSPI_NorFlash_EraseSector(uint32_t instance, flexspi_nor_config_t *config, uint32_t address);
446 #endif /* FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_SECTOR */
447 
448 #if defined(FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_ALL) && FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_ALL
449 /*!
450  * @brief Erase all the Serial NOR flash connected on FLEXSPI.
451  *
452  * @param instance storage the instance of FLEXSPI.
453  * @param config A pointer to the storage for the driver runtime state.
454  *
455  * @retval kStatus_Success Api was executed succesfuly.
456  * @retval kStatus_InvalidArgument A invalid argument is provided.
457  * @retval kStatus_ROM_FLEXSPI_InvalidSequence A invalid Sequence is provided.
458  * @retval kStatus_ROM_FLEXSPI_SequenceExecutionTimeout Sequence Execution timeout.
459  * @retval kStatus_ROM_FLEXSPI_DeviceTimeout the device timeout
460  */
461 status_t ROM_FLEXSPI_NorFlash_EraseAll(uint32_t instance, flexspi_nor_config_t *config);
462 #endif /* FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_ALL */
463 
464 /*!
465  * @brief Erase Flash Region specified by address and length
466  *
467  * This function erases the appropriate number of flash sectors based on the
468  * desired start address and length.
469  *
470  * @param instance storage the index of FLEXSPI.
471  * @param config A pointer to the storage for the driver runtime state.
472  * @param start The start address of the desired NOR flash memory to be erased.
473  *              NOTE:
474  *              It is recommended that use sector-aligned access NOR flash;
475  *              If dstAddr is not aligned with the sector,the driver automatically
476  *              aligns address down with the sector address.
477  * @param length The length, given in bytes to be erased.
478  *              NOTE:
479  *              It is recommended that use sector-aligned access NOR flash;
480  *              If length is not aligned with the sector,the driver automatically
481  *              aligns up with the sector.
482  * @retval kStatus_Success Api was executed succesfuly.
483  * @retval kStatus_InvalidArgument A invalid argument is provided.
484  * @retval kStatus_ROM_FLEXSPI_InvalidSequence A invalid Sequence is provided.
485  * @retval kStatus_ROM_FLEXSPI_SequenceExecutionTimeout Sequence Execution timeout.
486  * @retval kStatus_ROM_FLEXSPI_DeviceTimeout the device timeout
487  */
488 status_t ROM_FLEXSPI_NorFlash_Erase(uint32_t instance, flexspi_nor_config_t *config, uint32_t start, uint32_t length);
489 
490 /*@}*/
491 
492 /*!
493  * @name Command
494  * @{
495  */
496 
497 #if defined(FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_CMD_XFER) && FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_CMD_XFER
498 /*!
499  * @brief FLEXSPI command
500  *
501  * This function is used to perform the command write sequence to the NOR flash.
502  *
503  * @param instance storage the index of FLEXSPI.
504  * @param xfer A pointer to the storage FLEXSPI Transfer Context.
505  *
506  * @retval kStatus_Success Api was executed succesfuly.
507  * @retval kStatus_InvalidArgument A invalid argument is provided.
508  * @retval kStatus_ROM_FLEXSPI_InvalidSequence A invalid Sequence is provided.
509  * @retval kStatus_ROM_FLEXSPI_SequenceExecutionTimeout Sequence Execution timeout.
510  */
511 status_t ROM_FLEXSPI_NorFlash_CommandXfer(uint32_t instance, flexspi_xfer_t *xfer);
512 #endif /* FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_CMD_XFER */
513 /*@}*/
514 
515 /*!
516  * @name UpdateLut
517  * @{
518  */
519 #if defined(FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_UPDATE_LUT) && FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_UPDATE_LUT
520 /*!
521  * @brief Configure FLEXSPI Lookup table
522  *
523  * @param instance storage the index of FLEXSPI.
524  * @param seqIndex storage the sequence Id.
525  * @param lutBase A pointer to the look-up-table for command sequences.
526  * @param seqNumber storage sequence number.
527  *
528  * @retval kStatus_Success Api was executed succesfuly.
529  * @retval kStatus_InvalidArgument A invalid argument is provided.
530  * @retval kStatus_ROM_FLEXSPI_InvalidSequence A invalid Sequence is provided.
531  * @retval kStatus_ROM_FLEXSPI_SequenceExecutionTimeout Sequence Execution timeout.
532  */
533 status_t ROM_FLEXSPI_NorFlash_UpdateLut(uint32_t instance,
534                                         uint32_t seqIndex,
535                                         const uint32_t *lutBase,
536                                         uint32_t seqNumber);
537 #endif /* FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_UPDATE_LUT */
538 
539 /*@}*/
540 
541 /*!
542  * @name ClearCache
543  * @{
544  */
545 
546 /*!
547  * @brief Software reset for the FLEXSPI logic.
548  *
549  * This function sets the software reset flags for both AHB and buffer domain and
550  * resets both AHB buffer and also IP FIFOs.
551  *
552  * @param instance storage the index of FLEXSPI.
553  */
554 void ROM_FLEXSPI_NorFlash_ClearCache(uint32_t instance);
555 
556 /*@}*/
557 
558 #endif /* FSL_FEATURE_BOOT_ROM_HAS_ROMAPI */
559 
560 #ifdef __cplusplus
561 }
562 #endif
563 
564 /*! @}*/
565 
566 #endif /* _FSL_ROMAPI_H_ */
567