AM263x MCU+ SDK  11.01.00
qspi_lld.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2024-25 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 #define QSPI_STATE_WRITE_DUMMY_CYCLES (6U)
283 
288 #define QSPI_NUM_OF_DUMMY_BITS_ZERO (0U)
289 
292 #define QSPI_CMD_ADDR_DUMMY_BYTES_LEN (5U)
293 
296 #define QSPI_MAX_FRAME_LENGTH (4096U)
297 
298 /* ========================================================================== */
299 /* Function pointers Declarations */
300 /* ========================================================================== */
301 
309 typedef uint32_t (*QSPI_Clock_getTicks)(void);
310 
320 typedef uint32_t (*QSPI_Clock_usecToTicks)(uint64_t usecs);
321 
328 /* Type definition for the callback function*/
329 typedef void (*QSPI_lld_InterruptCallback)(void* args);
330 
338 
347 /* ========================================================================== */
348 /* Structure Definitions */
349 /* ========================================================================== */
353 typedef struct
354 {
355  uint32_t count;
357  uint32_t dataLen;
359  void *buf;
361  uint32_t addrOffset;
363  bool status;
367  uint32_t cmdRegVal;
369  uint32_t currentIndex;
371  uint8_t cmd;
373  uint8_t numAddrBytes;
375  uint32_t wlen;
377  uint32_t state;
380 
384 typedef struct
385 {
386  uint8_t cmd;
388  uint32_t cmdAddr;
391  uint8_t numAddrBytes;
393  void *dataBuf;
395  uint32_t dataLen;
398 
402 typedef struct
403 {
404  uint32_t memMapBaseAddr;
406  uint32_t inputClkFreq;
408  uint32_t qspiClockDiv;
410  uint32_t chipSelect;
412  uint32_t csPol;
414  uint32_t frmFmt;
416  uint32_t dataDelay;
418  uint32_t wrdLen;
420  uint32_t rxLines;
426  uint32_t intrNum;
430  bool wordIntr;
432  bool frameIntr;
434  uint8_t intrPriority;
436  bool dmaEnable;
443 
447 typedef struct
448 {
449  /*
450  * SOC configuration
451  */
452  uint32_t baseAddr;
454  uint8_t readCmd;
456  uint8_t writeCmd;
458  uint32_t frmLength;
460  uint32_t numAddrBytes;
462  uint32_t numDummyBits;
466  uint32_t state;
468  void* args;
475  /* Interrupt Callback to be registered by the application*/
477  /* DMA Readcallback function*/
479 
482 /* ========================================================================== */
483 /* Function Declarations */
484 /* ========================================================================== */
485 
494 
503 
512 
521 
533 
546 
557 
568 
579 
591 int32_t QSPI_lld_read(QSPILLD_Handle hQspi, uint32_t count, void* rxBuf, uint32_t addrOffset, uint32_t timeout);
592 
605 int32_t QSPI_lld_readDma(QSPILLD_Handle hQspi, uint32_t count, void* rxBuf, uint32_t addrOffset, uint32_t timeout);
606 
607 /* API's used by flash driver */
608 
617 int32_t QSPI_lld_setWriteCmd(QSPILLD_Handle hQspi, uint8_t command);
618 
627 int32_t QSPI_lld_setReadCmd(QSPILLD_Handle hQspi, uint8_t command);
628 
640 int32_t QSPI_lld_setAddressByteCount(QSPILLD_Handle hQspi, uint32_t count);
641 
653 int32_t QSPI_lld_setDummyBitCount(QSPILLD_Handle hQspi, uint32_t count);
654 
664 int32_t QSPI_lld_setMemAddrSpace(QSPILLD_Handle hQspi, uint32_t memMappedPortSwitch);
665 
678 int32_t QSPI_lld_setRxLines(QSPILLD_Handle hQspi, uint32_t rxLines);
679 
697 int32_t QSPI_lld_setPreScaler(QSPILLD_Handle hQspi, uint32_t clkDividerVal);
698 
712 int32_t QSPI_lld_getInputClk(QSPILLD_Handle hQspi, uint32_t* inputClk);
713 
724 
731 void QSPI_lld_isr(void* args);
732 
739 
740 
741 #ifdef __cplusplus
742 }
743 #endif
744 
745 #endif /* #ifndef QSPI_LLD_H_ */
746 
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 This API...
QSPILLD_WriteCmdParams::dataBuf
void * dataBuf
Definition: qspi_lld.h:393
QSPILLD_InitObject::memMapBaseAddr
uint32_t memMapBaseAddr
Definition: qspi_lld.h:404
QSPILLD_Object::args
void * args
Definition: qspi_lld.h:468
QSPILLD_Transaction::readWriteFlag
bool readWriteFlag
Definition: qspi_lld.h:365
args
void * args
Definition: hsmclient_msg.h:4
QSPILLD_InitObject::inputClkFreq
uint32_t inputClkFreq
Definition: qspi_lld.h:406
QSPILLD_InitObject::wordIntr
bool wordIntr
Definition: qspi_lld.h:430
QSPILLD_Object::readCmd
uint8_t readCmd
Definition: qspi_lld.h:454
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:440
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:354
QSPILLD_InitObject::intrPriority
uint8_t intrPriority
Definition: qspi_lld.h:434
QSPILLD_TransactionHandle
struct QSPILLD_Transaction * QSPILLD_TransactionHandle
QSPILLD_Transaction::wlen
uint32_t wlen
Definition: qspi_lld.h:375
QSPILLD_InitObject::wrdLen
uint32_t wrdLen
Definition: qspi_lld.h:418
QSPILLD_InitObject::dmaEnable
bool dmaEnable
Definition: qspi_lld.h:436
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:367
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:359
QSPILLD_Object::transaction
QSPILLD_Transaction * transaction
Definition: qspi_lld.h:470
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:452
QSPILLD_InitObject
QSPI driver initialization object.
Definition: qspi_lld.h:403
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:329
QSPILLD_WriteCmdParams::dataLen
uint32_t dataLen
Definition: qspi_lld.h:395
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:408
QSPILLD_Transaction::status
bool status
Definition: qspi_lld.h:363
QSPILLD_Object::writeCmd
uint8_t writeCmd
Definition: qspi_lld.h:456
QSPILLD_Object::interruptCallback
QSPI_lld_InterruptCallback interruptCallback
Definition: qspi_lld.h:474
QSPILLD_InitObject::intrNum
uint32_t intrNum
Definition: qspi_lld.h:426
QSPILLD_InitObject::csPol
uint32_t csPol
Definition: qspi_lld.h:412
QSPILLD_Handle
struct QSPILLD_Object * QSPILLD_Handle
QSPILLD_WriteCmdParams::cmdAddr
uint32_t cmdAddr
Definition: qspi_lld.h:388
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:337
edma.h
QSPILLD_Transaction::numAddrBytes
uint8_t numAddrBytes
Definition: qspi_lld.h:373
QSPILLD_InitObject::chipSelect
uint32_t chipSelect
Definition: qspi_lld.h:410
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:458
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:448
QSPILLD_Object::readCompleteCallback
QSPI_lld_dma_readCompleteCallback readCompleteCallback
Definition: qspi_lld.h:476
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:320
QSPILLD_InitObject::qspiDmaHandle
QSPI_DmaHandle qspiDmaHandle
Definition: qspi_lld.h:422
QSPILLD_Transaction::currentIndex
uint32_t currentIndex
Definition: qspi_lld.h:369
QSPILLD_InitObject::intrEnable
bool intrEnable
Definition: qspi_lld.h:428
QSPILLD_WriteCmdParams::cmd
uint8_t cmd
Definition: qspi_lld.h:386
QSPILLD_Object::numDummyBits
uint32_t numDummyBits
Definition: qspi_lld.h:462
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:361
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:416
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:391
QSPI_lld_readData
int32_t QSPI_lld_readData(QSPILLD_Handle hQspi, QSPILLD_WriteCmdParams *writeMsg)
Function to send specific commands and receive related data from flash in configuration mode This API...
QSPILLD_WriteCmdParams
QSPI Transaction Info.
Definition: qspi_lld.h:385
QSPILLD_Transaction::cmd
uint8_t cmd
Definition: qspi_lld.h:371
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:438
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:464
QSPILLD_InitObject::frameIntr
bool frameIntr
Definition: qspi_lld.h:432
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:309
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:357
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:420
QSPILLD_Transaction::count
uint32_t count
Definition: qspi_lld.h:355
QSPILLD_Object::state
uint32_t state
Definition: qspi_lld.h:466
QSPILLD_InitObject::frmFmt
uint32_t frmFmt
Definition: qspi_lld.h:414
QSPILLD_Object::trans
QSPILLD_Transaction trans
Definition: qspi_lld.h:472
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:460
QSPILLD_Transaction::state
uint32_t state
Definition: qspi_lld.h:377
QSPILLD_InitObject::qspiDmaChConfig
QSPI_DmaChConfig qspiDmaChConfig
Definition: qspi_lld.h:424
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