AM263x MCU+ SDK  11.00.00
qspi_lld.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2024 Texas Instruments Incorporated
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the
14  * distribution.
15  *
16  * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
50 #ifndef QSPI_LLD_H_
51 #define QSPI_LLD_H_
52 
53 /* ========================================================================== */
54 /* Include Files */
55 /* ========================================================================== */
56 
57 #include <drivers/hw_include/cslr_qspi.h>
58 #include <drivers/edma.h>
59 #include <stdbool.h>
60 
61 #ifdef __cplusplus
62 extern "C" {
63 #endif
64 
65 /* ========================================================================== */
66 /* Macros & Typedefs */
67 /* ========================================================================== */
68 
71 
73 typedef struct QSPI_EdmaParams_s *QSPI_DmaChConfig;
74 
83 #define QSPI_CS0 (0U)
84 #define QSPI_CS1 (1U)
85 #define QSPI_CS2 (2U)
86 #define QSPI_CS3 (3U)
87 
92 #define QSPI_NOT_IN_USE(x) (void) 0
93 
99 #define QSPI_LLD_CMD_INVALID_ADDR (0xFFFFFFFFU)
100 
111 #define QSPI_RX_LINES_SINGLE (0U)
112 #define QSPI_RX_LINES_DUAL (1U)
113 #define QSPI_RX_LINES_QUAD (2U)
114 
130 #define QSPI_FF_POL0_PHA0 ((CSL_QSPI_SPI_DC_REG_CKPH0_CKP_0_SHIFT_OUT_FALLING_EDGE \
131  << CSL_QSPI_SPI_DC_REG_CKPH0_SHIFT) | \
132  (CSL_QSPI_SPI_DC_REG_CKP0_DATA_INACTIVE << \
133  CSL_QSPI_SPI_DC_REG_CKP0_SHIFT))
134 #define QSPI_FF_POL0_PHA1 ((CSL_QSPI_SPI_DC_REG_CKPH0_CKP_0_SHIFT_OUT_RISING_EDGE \
135  << CSL_QSPI_SPI_DC_REG_CKPH0_SHIFT) | \
136  (CSL_QSPI_SPI_DC_REG_CKP0_DATA_INACTIVE << \
137  CSL_QSPI_SPI_DC_REG_CKP0_SHIFT))
138 #define QSPI_FF_POL1_PHA0 ((CSL_QSPI_SPI_DC_REG_CKPH0_CKP_1_SHIFT_OUT_RISING_EDGE \
139  << CSL_QSPI_SPI_DC_REG_CKPH0_SHIFT) | \
140  (CSL_QSPI_SPI_DC_REG_CKP0_DATA_ACTIVE << \
141  CSL_QSPI_SPI_DC_REG_CKP0_SHIFT))
142 #define QSPI_FF_POL1_PHA1 ((CSL_QSPI_SPI_DC_REG_CKPH0_CKP_1_SHIFT_OUT_FALLING_EDGE \
143  << CSL_QSPI_SPI_DC_REG_CKPH0_SHIFT) | \
144  (CSL_QSPI_SPI_DC_REG_CKP0_DATA_ACTIVE << \
145  CSL_QSPI_SPI_DC_REG_CKP0_SHIFT))
146 
156 #define QSPI_CS_POL_ACTIVE_LOW (CSL_QSPI_SPI_DC_REG_CSP0_ACTIVE_LOW)
157 #define QSPI_CS_POL_ACTIVE_HIGH (CSL_QSPI_SPI_DC_REG_CSP0_ACTIVE_HIGH)
158 
168 #define QSPI_DATA_DELAY_0 (CSL_QSPI_SPI_DC_REG_DD0_CS_TO_DATA_DELAY_0)
169 #define QSPI_DATA_DELAY_1 (CSL_QSPI_SPI_DC_REG_DD0_CS_TO_DATA_DELAY_1)
170 #define QSPI_DATA_DELAY_2 (CSL_QSPI_SPI_DC_REG_DD0_CS_TO_DATA_DELAY_2)
171 #define QSPI_DATA_DELAY_3 (CSL_QSPI_SPI_DC_REG_DD0_CS_TO_DATA_DELAY_3)
172 
183 #define QSPI_MEM_MAP_PORT_SEL_CFG_PORT \
184  (CSL_QSPI_SPI_SWITCH_REG_MMPT_S_SEL_CFG_PORT)
185 #define QSPI_MEM_MAP_PORT_SEL_MEM_MAP_PORT \
186  (CSL_QSPI_SPI_SWITCH_REG_MMPT_S_SEL_MM_PORT)
187 
190 #define QSPI_MAX_WORD_LENGTH (128U)
191 
198 #define QSPI_SYSTEM_SUCCESS ((int32_t )0)
199 
203 #define QSPI_SYSTEM_FAILURE ((int32_t)-1)
204 
208 #define QSPI_TIMEOUT ((int32_t)-2)
209 
213 #define QSPI_LLD_INVALID_PARAM ((int32_t)-3)
214 
218 #define QSPI_BUSY ((int32_t)-4)
219 
223 #define QSPI_INVALID_STATE ((int32_t)-5)
224 
233 #define QSPI_STATE_RESET (0U)
234 
238 #define QSPI_STATE_READY (1U)
239 
243 #define QSPI_STATE_BUSY (2U)
244 
248 #define QSPI_STATE_ERROR (3U)
249 
258 #define QSPI_STATE_IDLE (0U)
259 
262 #define QSPI_STATE_ADDRESS_WRITE (1U)
263 
266 #define QSPI_STATE_DATA_WRITE (2U)
267 
270 #define QSPI_STATE_DATA_READ (3U)
271 
274 #define QSPI_STATE_BLOCK (4U)
275 
278 #define QSPI_STATE_NON_BLOCK (5U)
279 
282 /* ========================================================================== */
283 /* Function pointers Declarations */
284 /* ========================================================================== */
285 
293 typedef uint32_t (*QSPI_Clock_getTicks)(void);
294 
304 typedef uint32_t (*QSPI_Clock_usecToTicks)(uint64_t usecs);
305 
312 /* Type definition for the callback function*/
313 typedef void (*QSPI_lld_InterruptCallback)(void* args);
314 
322 
331 /* ========================================================================== */
332 /* Structure Definitions */
333 /* ========================================================================== */
337 typedef struct
338 {
339  uint32_t count;
341  uint32_t dataLen;
343  void *buf;
345  uint32_t addrOffset;
347  bool status;
351  uint32_t cmdRegVal;
353  uint32_t currentIndex;
355  uint8_t cmd;
357  uint8_t numAddrBytes;
359  uint32_t wlen;
361  uint32_t state;
364 
368 typedef struct
369 {
370  uint8_t cmd;
372  uint32_t cmdAddr;
375  uint8_t numAddrBytes;
377  void *dataBuf;
379  uint32_t dataLen;
382 
386 typedef struct
387 {
388  uint32_t memMapBaseAddr;
390  uint32_t inputClkFreq;
392  uint32_t qspiClockDiv;
394  uint32_t chipSelect;
396  uint32_t csPol;
398  uint32_t frmFmt;
400  uint32_t dataDelay;
402  uint32_t wrdLen;
404  uint32_t rxLines;
410  uint32_t intrNum;
414  bool wordIntr;
416  bool frameIntr;
418  uint8_t intrPriority;
420  bool dmaEnable;
427 
431 typedef struct
432 {
433  /*
434  * SOC configuration
435  */
436  uint32_t baseAddr;
438  uint8_t readCmd;
440  uint8_t writeCmd;
442  uint32_t frmLength;
444  uint32_t numAddrBytes;
446  uint32_t numDummyBits;
450  uint32_t state;
452  void* args;
459  /* Interrupt Callback to be registered by the application*/
461  /* DMA Readcallback function*/
463 
466 /* ========================================================================== */
467 /* Function Declarations */
468 /* ========================================================================== */
469 
478 
487 
496 
505 
516 
527 
538 
549 
561 int32_t QSPI_lld_read(QSPILLD_Handle hQspi, uint32_t count, void* rxBuf, uint32_t addrOffset, uint32_t timeout);
562 
575 int32_t QSPI_lld_readDma(QSPILLD_Handle hQspi, uint32_t count, void* rxBuf, uint32_t addrOffset, uint32_t timeout);
576 
577 /* API's used by flash driver */
578 
587 int32_t QSPI_lld_setWriteCmd(QSPILLD_Handle hQspi, uint8_t command);
588 
597 int32_t QSPI_lld_setReadCmd(QSPILLD_Handle hQspi, uint8_t command);
598 
610 int32_t QSPI_lld_setAddressByteCount(QSPILLD_Handle hQspi, uint32_t count);
611 
623 int32_t QSPI_lld_setDummyBitCount(QSPILLD_Handle hQspi, uint32_t count);
624 
634 int32_t QSPI_lld_setMemAddrSpace(QSPILLD_Handle hQspi, uint32_t memMappedPortSwitch);
635 
648 int32_t QSPI_lld_setRxLines(QSPILLD_Handle hQspi, uint32_t rxLines);
649 
667 int32_t QSPI_lld_setPreScaler(QSPILLD_Handle hQspi, uint32_t clkDividerVal);
668 
682 int32_t QSPI_lld_getInputClk(QSPILLD_Handle hQspi, uint32_t* inputClk);
683 
694 
701 void QSPI_lld_isr(void* args);
702 
709 
710 
711 #ifdef __cplusplus
712 }
713 #endif
714 
715 #endif /* #ifndef QSPI_LLD_H_ */
716 
QSPI_lld_readCmd
int32_t QSPI_lld_readCmd(QSPILLD_Handle hQspi, QSPILLD_WriteCmdParams *writeMsg)
Function to send specific commands and receive related data from flash in configuration mode.
QSPILLD_WriteCmdParams::dataBuf
void * dataBuf
Definition: qspi_lld.h:377
QSPILLD_InitObject::memMapBaseAddr
uint32_t memMapBaseAddr
Definition: qspi_lld.h:388
QSPILLD_Object::args
void * args
Definition: qspi_lld.h:452
QSPILLD_Transaction::readWriteFlag
bool readWriteFlag
Definition: qspi_lld.h:349
args
void * args
Definition: hsmclient_msg.h:4
QSPILLD_InitObject::inputClkFreq
uint32_t inputClkFreq
Definition: qspi_lld.h:390
QSPILLD_InitObject::wordIntr
bool wordIntr
Definition: qspi_lld.h:414
QSPILLD_Object::readCmd
uint8_t readCmd
Definition: qspi_lld.h:438
QSPI_lld_setRxLines
int32_t QSPI_lld_setRxLines(QSPILLD_Handle hQspi, uint32_t rxLines)
Set QSPI Rx lines in the QSPI object.
QSPILLD_InitObject::Clock_usecToTicks
QSPI_Clock_usecToTicks Clock_usecToTicks
Definition: qspi_lld.h:424
QSPI_lld_readDma
int32_t QSPI_lld_readDma(QSPILLD_Handle hQspi, uint32_t count, void *rxBuf, uint32_t addrOffset, uint32_t timeout)
Function to perform read from the flash in DMA mode.
QSPILLD_Transaction
QSPI Driver Transaction.
Definition: qspi_lld.h:338
QSPILLD_InitObject::intrPriority
uint8_t intrPriority
Definition: qspi_lld.h:418
QSPILLD_TransactionHandle
struct QSPILLD_Transaction * QSPILLD_TransactionHandle
QSPILLD_Transaction::wlen
uint32_t wlen
Definition: qspi_lld.h:359
QSPILLD_InitObject::wrdLen
uint32_t wrdLen
Definition: qspi_lld.h:402
QSPILLD_InitObject::dmaEnable
bool dmaEnable
Definition: qspi_lld.h:420
QSPI_lld_getInputClk
int32_t QSPI_lld_getInputClk(QSPILLD_Handle hQspi, uint32_t *inputClk)
This function returns the input clock at which QSPI was programmed.
QSPILLD_Transaction::cmdRegVal
uint32_t cmdRegVal
Definition: qspi_lld.h:351
QSPI_lld_setReadCmd
int32_t QSPI_lld_setReadCmd(QSPILLD_Handle hQspi, uint8_t command)
Function to set read command to be used.
QSPILLD_Transaction::buf
void * buf
Definition: qspi_lld.h:343
QSPILLD_Object::transaction
QSPILLD_Transaction * transaction
Definition: qspi_lld.h:454
QSPI_lld_read
int32_t QSPI_lld_read(QSPILLD_Handle hQspi, uint32_t count, void *rxBuf, uint32_t addrOffset, uint32_t timeout)
Function to perform reads from the flash in memory map mode.
QSPILLD_Object::baseAddr
uint32_t baseAddr
Definition: qspi_lld.h:436
QSPILLD_InitObject
QSPI driver initialization object.
Definition: qspi_lld.h:387
QSPI_lld_InterruptCallback
void(* QSPI_lld_InterruptCallback)(void *args)
The definition of a interrupt completion callback function used by the QSPI driver.
Definition: qspi_lld.h:313
QSPILLD_WriteCmdParams::dataLen
uint32_t dataLen
Definition: qspi_lld.h:379
QSPI_lld_isr
void QSPI_lld_isr(void *args)
QSPI ISR for Read and Write Functionality.
QSPILLD_InitObject::qspiClockDiv
uint32_t qspiClockDiv
Definition: qspi_lld.h:392
QSPILLD_Transaction::status
bool status
Definition: qspi_lld.h:347
QSPILLD_Object::writeCmd
uint8_t writeCmd
Definition: qspi_lld.h:440
QSPILLD_Object::interruptCallback
QSPI_lld_InterruptCallback interruptCallback
Definition: qspi_lld.h:458
QSPILLD_InitObject::intrNum
uint32_t intrNum
Definition: qspi_lld.h:410
QSPILLD_InitObject::csPol
uint32_t csPol
Definition: qspi_lld.h:396
QSPILLD_Handle
struct QSPILLD_Object * QSPILLD_Handle
QSPILLD_WriteCmdParams::cmdAddr
uint32_t cmdAddr
Definition: qspi_lld.h:372
QSPI_lld_dma_readCompleteCallback
void(* QSPI_lld_dma_readCompleteCallback)(void *args)
The definition of a dma read completion callback function used by the QSPI driver.
Definition: qspi_lld.h:321
edma.h
QSPILLD_Transaction::numAddrBytes
uint8_t numAddrBytes
Definition: qspi_lld.h:357
QSPILLD_InitObject::chipSelect
uint32_t chipSelect
Definition: qspi_lld.h:394
QSPI_DmaHandle
EDMA_Handle QSPI_DmaHandle
The handle for DMA instance used with QSPI.
Definition: qspi_lld.h:70
QSPILLD_Object::frmLength
uint32_t frmLength
Definition: qspi_lld.h:442
QSPI_lld_readCmdIntr
int32_t QSPI_lld_readCmdIntr(QSPILLD_Handle hQspi, const QSPILLD_WriteCmdParams *msg)
Function to send specific commands and receive related data from flash in interrupt mode.
QSPILLD_Object
QSPI driver object.
Definition: qspi_lld.h:432
QSPILLD_Object::readCompleteCallback
QSPI_lld_dma_readCompleteCallback readCompleteCallback
Definition: qspi_lld.h:460
QSPI_Clock_usecToTicks
uint32_t(* QSPI_Clock_usecToTicks)(uint64_t usecs)
The definition of a micro seconds to ticks function used by the QSPI driver to get ticks from microse...
Definition: qspi_lld.h:304
QSPILLD_InitObject::qspiDmaHandle
QSPI_DmaHandle qspiDmaHandle
Definition: qspi_lld.h:406
QSPILLD_Transaction::currentIndex
uint32_t currentIndex
Definition: qspi_lld.h:353
QSPILLD_InitObject::intrEnable
bool intrEnable
Definition: qspi_lld.h:412
QSPILLD_WriteCmdParams::cmd
uint8_t cmd
Definition: qspi_lld.h:370
QSPILLD_Object::numDummyBits
uint32_t numDummyBits
Definition: qspi_lld.h:446
QSPI_lld_setDummyBitCount
int32_t QSPI_lld_setDummyBitCount(QSPILLD_Handle hQspi, uint32_t count)
Function to set number of dummy bits to be used.
QSPI_lld_writeCmd
int32_t QSPI_lld_writeCmd(QSPILLD_Handle hQspi, QSPILLD_WriteCmdParams *writeMsg)
Function to send specific commands and write data into flash in configuration mode.
QSPILLD_Transaction::addrOffset
uint32_t addrOffset
Definition: qspi_lld.h:345
QSPI_lld_setWriteCmd
int32_t QSPI_lld_setWriteCmd(QSPILLD_Handle hQspi, uint8_t command)
Function to set write command to be used.
QSPILLD_InitObject::dataDelay
uint32_t dataDelay
Definition: qspi_lld.h:400
QSPI_lld_initDma
int32_t QSPI_lld_initDma(QSPILLD_Handle hQspi)
This function initializes the QSPI module in DMA Mode.
QSPILLD_WriteCmdParams::numAddrBytes
uint8_t numAddrBytes
Definition: qspi_lld.h:375
QSPILLD_WriteCmdParams
QSPI Transaction Info.
Definition: qspi_lld.h:369
QSPILLD_Transaction::cmd
uint8_t cmd
Definition: qspi_lld.h:355
QSPI_lld_setMemAddrSpace
int32_t QSPI_lld_setMemAddrSpace(QSPILLD_Handle hQspi, uint32_t memMappedPortSwitch)
This function is used to switch between memory mapped and configuration mode.
EDMA_Handle
void * EDMA_Handle
A handle that is returned from a EDMA_open() call.
Definition: edma/v0/edma.h:596
QSPILLD_InitObject::Clock_getTicks
QSPI_Clock_getTicks Clock_getTicks
Definition: qspi_lld.h:422
QSPI_lld_setPreScaler
int32_t QSPI_lld_setPreScaler(QSPILLD_Handle hQspi, uint32_t clkDividerVal)
Set the QSPI clock register divider value.
QSPILLD_Object::hQspiInit
QSPILLD_InitHandle hQspiInit
Definition: qspi_lld.h:448
QSPILLD_InitObject::frameIntr
bool frameIntr
Definition: qspi_lld.h:416
QSPI_Clock_getTicks
uint32_t(* QSPI_Clock_getTicks)(void)
The definition of a get System Tick function used by the QSPI driver to keep track of time.
Definition: qspi_lld.h:293
QSPI_lld_setAddressByteCount
int32_t QSPI_lld_setAddressByteCount(QSPILLD_Handle hQspi, uint32_t count)
Function to set number of address bytes to be used.
QSPILLD_Transaction::dataLen
uint32_t dataLen
Definition: qspi_lld.h:341
QSPI_lld_deInit
int32_t QSPI_lld_deInit(QSPILLD_Handle hQspi)
This function de-initializes the QSPI module.
QSPI_lld_deInitDma
int32_t QSPI_lld_deInitDma(QSPILLD_Handle hQspi)
This function de-initializes the QSPI module in DMA Mode.
QSPI_DmaChConfig
struct QSPI_EdmaParams_s * QSPI_DmaChConfig
A handle that holds DMA configuration parameters for QSPI.
Definition: qspi_lld.h:73
QSPILLD_InitObject::rxLines
uint32_t rxLines
Definition: qspi_lld.h:404
QSPILLD_Transaction::count
uint32_t count
Definition: qspi_lld.h:339
QSPILLD_Object::state
uint32_t state
Definition: qspi_lld.h:450
QSPILLD_InitObject::frmFmt
uint32_t frmFmt
Definition: qspi_lld.h:398
QSPILLD_Object::trans
QSPILLD_Transaction trans
Definition: qspi_lld.h:456
QSPI_lld_readCompleteCallback
void QSPI_lld_readCompleteCallback(void *args)
QSPI Read complete callback for DMA mode.
QSPI_lld_getRxLines
uint32_t QSPI_lld_getRxLines(QSPILLD_Handle hQspi)
Get QSPI Rx lines in the QSPI object.
QSPI_lld_init
int32_t QSPI_lld_init(QSPILLD_Handle hQspi)
This function initializes the QSPI module.
QSPILLD_Object::numAddrBytes
uint32_t numAddrBytes
Definition: qspi_lld.h:444
QSPILLD_Transaction::state
uint32_t state
Definition: qspi_lld.h:361
QSPILLD_InitObject::qspiDmaChConfig
QSPI_DmaChConfig qspiDmaChConfig
Definition: qspi_lld.h:408
QSPI_lld_writeCmdIntr
int32_t QSPI_lld_writeCmdIntr(QSPILLD_Handle hQspi, const QSPILLD_WriteCmdParams *msg)
Function to send specific commands and write data into flash in interrupt mode.
QSPILLD_InitHandle
struct QSPILLD_InitObject * QSPILLD_InitHandle