17#ifndef FSL_COMPONENT_ID
18#define FSL_COMPONENT_ID "platform.drivers.lpspi_edma"
24typedef struct _lpspi_master_edma_private_handle
33typedef struct _lpspi_slave_edma_private_handle
56 void *g_lpspiEdmaPrivateHandle,
65 void *g_lpspiEdmaPrivateHandle,
107 switch (bytesEachRead)
117 *rxData = readData >> 24;
127 *rxData = readData >> 8;
132 *rxData = readData >> 16;
134 *rxData = readData >> 24;
143 *rxData = readData >> 8;
145 *rxData = readData >> 16;
147 *rxData = readData >> 24;
185 assert(edmaRxRegToRxDataHandle);
186 assert(edmaTxDataToTxRegHandle);
189 memset(handle, 0,
sizeof(*handle));
225 uint32_t bitsPerFrame = ((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) + 1;
226 uint32_t bytesPerFrame = (bitsPerFrame + 7) / 8;
235 if ((bytesPerFrame % 4U) == 3)
252 uint32_t whichPcs = (transfer->
configFlags & LPSPI_MASTER_PCS_MASK) >> LPSPI_MASTER_PCS_SHIFT;
255 uint8_t txWatermark = 0;
256 uint8_t rxWatermark = 0;
261 uint8_t bytesLastWrite = 0;
263 bool isThereExtraTxBytes =
false;
283 ((uint32_t)dummyData) | ((uint32_t)dummyData << 8) | ((uint32_t)dummyData << 16) | ((uint32_t)dummyData << 24);
295 base->CFGR1 &= (~LPSPI_CFGR1_NOSTALL_MASK);
298 temp &= LPSPI_CFGR1_PINCFG_MASK;
303 base->CFGR1 |= LPSPI_CFGR1_OUTCFG_MASK;
320 base->TCR = (base->TCR & ~(LPSPI_TCR_CONT_MASK | LPSPI_TCR_CONTC_MASK | LPSPI_TCR_BYSW_MASK | LPSPI_TCR_PCS_MASK)) |
322 LPSPI_TCR_PCS(whichPcs);
324 isThereExtraTxBytes =
false;
328 if (bytesPerFrame <= 4)
344 bytesLastWrite = transfer->
dataSize % 4;
347 isThereExtraTxBytes =
true;
409 transferConfigRx.
srcAddr = (uint32_t)rxAddr + dif;
418 &transferConfigRx, NULL);
425 if (isThereExtraTxBytes)
443 switch (bytesLastWrite)
470 transferConfigTx.
destAddr = (uint32_t)txAddr + dif;
487 handle->
transmitCommand = base->TCR & ~(LPSPI_TCR_CONTC_MASK | LPSPI_TCR_CONT_MASK);
492 transferConfigTx.
destAddr = (uint32_t) & (base->TCR);
553 transferConfigTx.
destAddr = (uint32_t)txAddr + dif;
557 if (isThereExtraTxBytes)
560 &transferConfigTx, softwareTCD_extraBytes);
565 &transferConfigTx, softwareTCD_pcsContinuous);
570 &transferConfigTx, NULL);
583 void *g_lpspiEdmaPrivateHandle,
588 assert(g_lpspiEdmaPrivateHandle);
598 if (lpspiEdmaPrivateHandle->handle->isThereExtraRxBytes)
605 if (lpspiEdmaPrivateHandle->handle->rxData)
608 &(lpspiEdmaPrivateHandle->handle->rxData[lpspiEdmaPrivateHandle->handle->rxRemainingByteCount -
609 lpspiEdmaPrivateHandle->handle->bytesLastRead]),
610 readData, lpspiEdmaPrivateHandle->handle->bytesLastRead, lpspiEdmaPrivateHandle->handle->isByteSwap);
614 lpspiEdmaPrivateHandle->handle->state =
kLPSPI_Idle;
616 if (lpspiEdmaPrivateHandle->handle->callback)
618 lpspiEdmaPrivateHandle->handle->callback(lpspiEdmaPrivateHandle->base, lpspiEdmaPrivateHandle->handle,
669 size_t remainingByte;
708 assert(edmaRxRegToRxDataHandle);
709 assert(edmaTxDataToTxRegHandle);
712 memset(handle, 0,
sizeof(*handle));
748 uint32_t bitsPerFrame = ((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) + 1;
749 uint32_t bytesPerFrame = (bitsPerFrame + 7) / 8;
760 if ((bytesPerFrame % 4U) == 3)
778 uint32_t whichPcs = (transfer->
configFlags & LPSPI_MASTER_PCS_MASK) >> LPSPI_MASTER_PCS_SHIFT;
781 uint8_t txWatermark = 0;
782 uint8_t rxWatermark = 0;
787 uint8_t bytesLastWrite = 0;
794 bool isThereExtraTxBytes =
false;
806 ((uint32_t)dummyData) | ((uint32_t)dummyData << 8) | ((uint32_t)dummyData << 16) | ((uint32_t)dummyData << 24);
817 base->CFGR1 &= (~LPSPI_CFGR1_NOSTALL_MASK);
820 temp &= LPSPI_CFGR1_PINCFG_MASK;
825 base->CFGR1 |= LPSPI_CFGR1_OUTCFG_MASK;
842 base->TCR = (base->TCR & ~(LPSPI_TCR_CONT_MASK | LPSPI_TCR_CONTC_MASK | LPSPI_TCR_BYSW_MASK)) |
843 LPSPI_TCR_CONTC(0U) | LPSPI_TCR_BYSW(handle->
isByteSwap) | LPSPI_TCR_PCS(whichPcs);
845 isThereExtraTxBytes =
false;
849 if (bytesPerFrame <= 4)
865 bytesLastWrite = transfer->
dataSize % 4;
868 isThereExtraTxBytes =
true;
931 transferConfigRx.
srcAddr = (uint32_t)rxAddr + dif;
940 &transferConfigRx, NULL);
948 if (isThereExtraTxBytes)
966 switch (bytesLastWrite)
993 transferConfigTx.
destAddr = (uint32_t)txAddr + dif;
1050 transferConfigTx.
destAddr = (uint32_t)txAddr + dif;
1054 if (isThereExtraTxBytes)
1057 &transferConfigTx, softwareTCD_extraBytes);
1062 &transferConfigTx, NULL);
1075 void *g_lpspiEdmaPrivateHandle,
1080 assert(g_lpspiEdmaPrivateHandle);
1090 if (lpspiEdmaPrivateHandle->handle->isThereExtraRxBytes)
1097 if (lpspiEdmaPrivateHandle->handle->rxData)
1100 &(lpspiEdmaPrivateHandle->handle->rxData[lpspiEdmaPrivateHandle->handle->rxRemainingByteCount -
1101 lpspiEdmaPrivateHandle->handle->bytesLastRead]),
1102 readData, lpspiEdmaPrivateHandle->handle->bytesLastRead, lpspiEdmaPrivateHandle->handle->isByteSwap);
1106 lpspiEdmaPrivateHandle->handle->state =
kLPSPI_Idle;
1108 if (lpspiEdmaPrivateHandle->handle->callback)
1110 lpspiEdmaPrivateHandle->handle->callback(lpspiEdmaPrivateHandle->base, lpspiEdmaPrivateHandle->handle,
1161 size_t remainingByte;
static BenchController instance
static void EDMA_LpspiMasterCallback(edma_handle_t *edmaHandle, void *g_lpspiEdmaPrivateHandle, bool transferDone, uint32_t tcds)
EDMA_LpspiMasterCallback after the LPSPI master transfer completed by using EDMA. This is not a publi...
static void EDMA_LpspiSlaveCallback(edma_handle_t *edmaHandle, void *g_lpspiEdmaPrivateHandle, bool transferDone, uint32_t tcds)
EDMA_LpspiSlaveCallback after the LPSPI slave transfer completed by using EDMA. This is not a public ...
static uint32_t LPSPI_GetInstance(LPSPI_Type *base)
Get instance number for LPSPI module.
struct _lpspi_slave_edma_private_handle lpspi_slave_edma_private_handle_t
Structure definition for dspi_slave_edma_private_handle_t. The structure is private.
static void LPSPI_SeparateEdmaReadData(uint8_t *rxData, uint32_t readData, uint32_t bytesEachRead, bool isByteSwap)
static LPSPI_Type *const s_lpspiBases[]
Pointers to lpspi bases for each instance.
struct _lpspi_master_edma_private_handle lpspi_master_edma_private_handle_t
Structure definition for dspi_master_edma_private_handle_t. The structure is private.
static lpspi_master_edma_private_handle_t s_lpspiMasterEdmaPrivateHandle[ARRAY_SIZE(s_lpspiBases)]
Pointers to lpspi edma handles for each instance.
static lpspi_slave_edma_private_handle_t s_lpspiSlaveEdmaPrivateHandle[ARRAY_SIZE(s_lpspiBases)]
uint32_t EDMA_GetRemainingMajorLoopCount(DMA_Type *base, uint32_t channel)
Gets the remaining major loop count from the eDMA current channel TCD.
edma_transfer_size_t destTransferSize
void EDMA_EnableChannelInterrupts(DMA_Type *base, uint32_t channel, uint32_t mask)
Enables the interrupt source for the eDMA transfer.
void EDMA_AbortTransfer(edma_handle_t *handle)
eDMA aborts transfer.
void EDMA_TcdReset(edma_tcd_t *tcd)
Sets all fields to default values for the TCD structure.
edma_transfer_size_t srcTransferSize
void EDMA_SetCallback(edma_handle_t *handle, edma_callback callback, void *userData)
Installs a callback function for the eDMA transfer.
void EDMA_SetTransferConfig(DMA_Type *base, uint32_t channel, const edma_transfer_config_t *config, edma_tcd_t *nextTcd)
Configures the eDMA transfer attribute.
void EDMA_StartTransfer(edma_handle_t *handle)
eDMA starts transfer.
void EDMA_TcdSetTransferConfig(edma_tcd_t *tcd, const edma_transfer_config_t *config, edma_tcd_t *nextTcd)
Configures the eDMA TCD transfer attribute.
void EDMA_ResetChannel(DMA_Type *base, uint32_t channel)
Sets all TCD registers to default values.
@ kEDMA_MajorInterruptEnable
@ kEDMA_TransferSize4Bytes
@ kEDMA_TransferSize2Bytes
@ kEDMA_TransferSize1Bytes
int32_t status_t
Type used for all status and error return values.
@ kStatus_NoTransferInProgress
@ kStatus_InvalidArgument
static uint32_t LPSPI_GetRxFifoSize(LPSPI_Type *base)
Gets the LPSPI Rx FIFO size.
static void LPSPI_FlushFifo(LPSPI_Type *base, bool flushTxFifo, bool flushRxFifo)
Flushes the LPSPI FIFOs.
static void LPSPI_DisableInterrupts(LPSPI_Type *base, uint32_t mask)
Disables the LPSPI interrupts.
static uint32_t LPSPI_GetRxRegisterAddress(LPSPI_Type *base)
Gets the LPSPI Receive Data Register address for a DMA operation.
static void LPSPI_ClearStatusFlags(LPSPI_Type *base, uint32_t statusFlags)
Clears the LPSPI status flag.
static void LPSPI_Enable(LPSPI_Type *base, bool enable)
Enables the LPSPI peripheral and sets the MCR MDIS to 0.
static void LPSPI_SetFifoWatermarks(LPSPI_Type *base, uint32_t txWater, uint32_t rxWater)
Sets the transmit and receive FIFO watermark values.
volatile uint8_t g_lpspiDummyData[ARRAY_SIZE(s_lpspiBases)]
Global variable for dummy data value setting.
static void LPSPI_EnableDMA(LPSPI_Type *base, uint32_t mask)
Enables the LPSPI DMA request.
static uint32_t LPSPI_ReadData(LPSPI_Type *base)
Reads data from the data buffer.
bool LPSPI_CheckTransferArgument(lpspi_transfer_t *transfer, uint32_t bitsPerFrame, uint32_t bytesPerFrame)
Check the argument for transfer .
static uint32_t LPSPI_GetRxFifoCount(LPSPI_Type *base)
Gets the LPSPI Rx FIFO count.
static uint32_t LPSPI_GetTxRegisterAddress(LPSPI_Type *base)
Gets the LPSPI Transmit Data Register address for a DMA operation.
static void LPSPI_DisableDMA(LPSPI_Type *base, uint32_t mask)
Disables the LPSPI DMA request.
@ kLPSPI_MasterPcsContinuous
@ kLPSPI_AllInterruptEnable
status_t LPSPI_MasterTransferGetCountEDMA(LPSPI_Type *base, lpspi_master_edma_handle_t *handle, size_t *count)
Gets the master eDMA transfer remaining bytes.
edma_handle_t * edmaTxDataToTxRegHandle
edma_tcd_t lpspiSoftwareTCD[3]
lpspi_master_edma_transfer_callback_t callback
void LPSPI_MasterTransferCreateHandleEDMA(LPSPI_Type *base, lpspi_master_edma_handle_t *handle, lpspi_master_edma_transfer_callback_t callback, void *userData, edma_handle_t *edmaRxRegToRxDataHandle, edma_handle_t *edmaTxDataToTxRegHandle)
Initializes the LPSPI master eDMA handle.
volatile uint8_t fifoSize
volatile uint8_t bytesEachWrite
volatile uint8_t bytesEachRead
edma_tcd_t lpspiSoftwareTCD[2]
edma_handle_t * edmaRxRegToRxDataHandle
volatile uint32_t readRegRemainingTimes
void(* lpspi_master_edma_transfer_callback_t)(LPSPI_Type *base, lpspi_master_edma_handle_t *handle, status_t status, void *userData)
Completion callback function pointer type.
volatile uint32_t writeRegRemainingTimes
void LPSPI_SlaveTransferAbortEDMA(LPSPI_Type *base, lpspi_slave_edma_handle_t *handle)
LPSPI slave aborts a transfer which is using eDMA.
volatile uint8_t bytesLastRead
volatile uint8_t bytesEachWrite
volatile size_t rxRemainingByteCount
volatile uint8_t isThereExtraRxBytes
lpspi_slave_edma_transfer_callback_t callback
volatile uint8_t isThereExtraRxBytes
volatile uint8_t fifoSize
volatile uint8_t bytesEachRead
volatile uint32_t writeRegRemainingTimes
edma_handle_t * edmaTxDataToTxRegHandle
volatile bool isPcsContinuous
status_t LPSPI_MasterTransferEDMA(LPSPI_Type *base, lpspi_master_edma_handle_t *handle, lpspi_transfer_t *transfer)
LPSPI master transfer data using eDMA.
void LPSPI_MasterTransferAbortEDMA(LPSPI_Type *base, lpspi_master_edma_handle_t *handle)
LPSPI master aborts a transfer which is using eDMA.
volatile size_t rxRemainingByteCount
void LPSPI_SlaveTransferCreateHandleEDMA(LPSPI_Type *base, lpspi_slave_edma_handle_t *handle, lpspi_slave_edma_transfer_callback_t callback, void *userData, edma_handle_t *edmaRxRegToRxDataHandle, edma_handle_t *edmaTxDataToTxRegHandle)
Initializes the LPSPI slave eDMA handle.
status_t LPSPI_SlaveTransferEDMA(LPSPI_Type *base, lpspi_slave_edma_handle_t *handle, lpspi_transfer_t *transfer)
LPSPI slave transfers data using eDMA.
edma_handle_t * edmaRxRegToRxDataHandle
volatile size_t txRemainingByteCount
volatile uint32_t readRegRemainingTimes
status_t LPSPI_SlaveTransferGetCountEDMA(LPSPI_Type *base, lpspi_slave_edma_handle_t *handle, size_t *count)
Gets the slave eDMA transfer remaining bytes.
volatile size_t txRemainingByteCount
volatile uint8_t bytesLastRead
void(* lpspi_slave_edma_transfer_callback_t)(LPSPI_Type *base, lpspi_slave_edma_handle_t *handle, status_t status, void *userData)
Completion callback function pointer type.
eDMA transfer handle structure
eDMA transfer configuration
LPSPI master eDMA transfer handle structure used for transactional API.
LPSPI slave eDMA transfer handle structure used for transactional API.
LPSPI master/slave transfer structure.