1 /*
2  * Copyright 2022 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 #ifndef __SPI_MEM_ADAPTER_H__
8 #define __SPI_MEM_ADAPTER_H__
9 
10 #include "fsl_common.h"
11 
12 /*******************************************************************************
13  * Definitions
14  ******************************************************************************/
15 //!@brief SPI Master Configuration for Adapter
16 typedef struct
17 {
18     uint32_t whichPcs;  //!< PCS index
19     uint32_t clockFreq; //!< Clock requency for SPI
20     uint32_t baudRate;  //!< Baudrate for SPI
21 } spi_master_config_t;
22 
23 //!@brief SPI Memory transfer mode defintions
24 typedef enum _spi_mem_xfer_mode
25 {
26     kSpiMem_Xfer_CommandOnly,      //!< Command Only
27     kSpiMem_Xfer_CommandWriteData, //!< Command then Write Data
28     kSpiMem_Xfer_CommandReadData,  //!< Comamdn then Read Data
29 } spi_mem_xfer_mode_t;
30 
31 //!@brief SPI Memory Transfer Context
32 typedef struct __spi_mem_xfer
33 {
34     uint8_t *cmd;             //!< Command buffer
35     uint8_t *data;            //!< Data Buffer
36     size_t cmdSize;           //!< Command buffer size
37     size_t dataSize;          //!< Data buffer size
38     spi_mem_xfer_mode_t mode; //!< Transfer mode
39 } spi_mem_xfer_t;
40 
41 //!@brief Flash ID definition
42 typedef struct _flash_id
43 {
44     uint8_t mid;    //!< Manufacturer Identifier
45     uint8_t did[2]; //!< Device Identifier
46     uint8_t reserved[17];
47 } flash_id_t;
48 
49 typedef enum
50 {
51     kSpiIomux_SpiMode,
52     kSpiIomux_DefaultMode
53 } spi_pin_mode_t;
54 
55 typedef enum
56 {
57     kSpiClockMode_Spi,
58     kSpiClockMode_Default
59 } spi_clock_mode_t;
60 
61 typedef enum
62 {
63     kSize_ErasePage = 0x1,
64     kSize_Erase4K   = 0x2,
65     kSize_Erase32K  = 0x3,
66     kSize_Erase64K  = 0x4,
67     kSize_EraseAll  = 0x5,
68 } eraseOptions_t;
69 
70 /*******************************************************************************
71  * API
72  ******************************************************************************/
73 
74 #if defined(__cplusplus)
75 extern "C" {
76 #endif /* __cplusplus */
77 
78 //!@brief Initialize SPI Memory
79 status_t LPSPI_MemInit(spi_master_config_t *config, LPSPI_Type *base);
80 
81 //!@brief Issue SPI Memory Transfer
82 status_t LPSPI_MemXfer(spi_mem_xfer_t *xfer, LPSPI_Type *base);
83 
84 //!@brief Read SPI Memory ID
85 status_t LPSPI_MemReadId(flash_id_t *flashId, LPSPI_Type *base);
86 
87 //!@brief Read Data from SPI Memory
88 status_t LPSPI_MemRead(uint32_t addr, uint8_t *buffer, uint32_t lengthInBytes, bool isFastRead, LPSPI_Type *base);
89 
90 //!@brief Enable SPI flash writes
91 status_t LPSPI_MemWriteEnable(LPSPI_Type *base);
92 
93 //!@brief Write Data to SPI Memory
94 status_t LPSPI_MemWritePage(uint32_t addr, uint8_t *buffer, uint32_t lengthInBytes, bool blocking, LPSPI_Type *base);
95 
96 //!@brief Erase data from SPI Memory to 0xFF
97 status_t LPSPI_MemErase(uint32_t addr, eraseOptions_t option, bool blocking, LPSPI_Type *base);
98 
99 //!@brief Get the busy status of the NOR flash.
100 status_t LPSPI_MemIsBusy(LPSPI_Type *base, bool *isBusy);
101 
102 //!@brief Deinitialize the SPI memory
103 status_t LPSPI_MemDeinit(LPSPI_Type *base);
104 
105 #if defined(__cplusplus)
106 }
107 #endif /* __cplusplus */
108 
109 #endif // SPI_ADAPTER_H__
110