MCUXpresso_MIMXRT1052xxxxB/components/spi/fsl_adapter_lpspi.c

757 lines
29 KiB
C

/*
* Copyright 2018 -2021 NXP
* All rights reserved.
*
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "fsl_common.h"
#include "fsl_lpspi.h"
#include "fsl_adapter_spi.h"
#if (defined(HAL_SPI_SLAVE_DMA_ENABLE) && (HAL_SPI_SLAVE_DMA_ENABLE > 0U)) || \
(defined(HAL_SPI_MASTER_DMA_ENABLE) && (HAL_SPI_MASTER_DMA_ENABLE > 0U))
#if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))
#include "fsl_lpspi_edma.h"
#elif (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))
#include "fsl_lpspi_dma.h"
#endif
#if defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT
#include "fsl_dmamux.h"
#endif
#endif /* HAL_UART_DMA_ENABLE */
/*******************************************************************************
* Definitions
******************************************************************************/
#if defined(__GIC_PRIO_BITS)
#ifndef HAL_SPI_ISR_PRIORITY
#define HAL_SPI_ISR_PRIORITY (25U)
#endif
#else
#if defined(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY)
#ifndef HAL_SPI_ISR_PRIORITY
#define HAL_SPI_ISR_PRIORITY (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY)
#endif
#else
/* The default value 3 is used to support different ARM Core, such as CM0P, CM4, CM7, and CM33, etc.
* The minimum number of priority bits implemented in the NVIC is 2 on these SOCs. The value of mininum
* priority is 3 (2^2 - 1). So, the default value is 3.
*/
#ifndef HAL_SPI_ISR_PRIORITY
#define HAL_SPI_ISR_PRIORITY (3U)
#endif
#endif
#endif
/*! @brief hal_spi master state structure. */
typedef struct _hal_spi_master
{
hal_spi_master_transfer_callback_t callback;
void *callbackParam;
lpspi_master_handle_t hardwareHandle;
uint8_t instance;
#if (defined(HAL_SPI_MASTER_DMA_ENABLE) && (HAL_SPI_MASTER_DMA_ENABLE > 0U))
hal_spi_master_dma_handle_t *dmaHandle;
#endif
} hal_spi_master_t;
/*! @brief hal_spi slave state structure. */
typedef struct _hal_spi_slave
{
hal_spi_slave_transfer_callback_t callback;
void *callbackParam;
lpspi_slave_handle_t hardwareHandle;
uint8_t instance;
#if (defined(HAL_SPI_SLAVE_DMA_ENABLE) && (HAL_SPI_SLAVE_DMA_ENABLE > 0U))
hal_spi_slave_dma_handle_t *dmaHandle;
#endif
} hal_spi_slave_t;
#if (defined(HAL_SPI_SLAVE_DMA_ENABLE) && (HAL_SPI_SLAVE_DMA_ENABLE > 0U))
typedef struct _hal_spi_slave_dma_state
{
uint8_t instance; /* spi instance */
hal_spi_slave_transfer_callback_t callback;
void *callbackParam;
#if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))
lpspi_slave_edma_handle_t edmaHandle;
edma_handle_t txEdmaHandle;
edma_handle_t rxEdmaHandle;
#elif (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))
lpspi_slave_dma_handle_t dmaHandle;
dma_handle_t txDmaHandle;
dma_handle_t rxDmaHandle;
#endif
} hal_spi_slave_dma_state_t;
#endif
#if (defined(HAL_SPI_MASTER_DMA_ENABLE) && (HAL_SPI_MASTER_DMA_ENABLE > 0U))
typedef struct _hal_spi_master_dma_state
{
uint8_t instance; /* spi instance */
hal_spi_master_transfer_callback_t callback;
void *callbackParam;
#if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))
lpspi_master_edma_handle_t edmaHandle;
edma_handle_t txEdmaHandle;
edma_handle_t rxEdmaHandle;
#elif (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))
lpspi_master_dma_handle_t dmaHandle;
dma_handle_t txDmaHandle;
dma_handle_t rxDmaHandle;
#endif
} hal_spi_master_dma_state_t;
#endif
/*******************************************************************************
* Prototypes
******************************************************************************/
/*******************************************************************************
* Variables
******************************************************************************/
/*! @brief Base pointer array */
static LPSPI_Type *const s_spiBases[] = LPSPI_BASE_PTRS;
/*******************************************************************************
* Code
******************************************************************************/
static hal_spi_status_t HAL_SpiGetStatus(status_t status)
{
hal_spi_status_t returnStatus;
switch (status)
{
case kStatus_Success:
{
returnStatus = kStatus_HAL_SpiSuccess;
break;
}
case kStatus_LPSPI_Busy:
{
returnStatus = kStatus_HAL_SpiBusy;
break;
}
case kStatus_LPSPI_Idle:
{
returnStatus = kStatus_HAL_SpiIdle;
break;
}
default:
{
returnStatus = kStatus_HAL_SpiError;
break;
}
}
return returnStatus;
}
#if (defined(HAL_SPI_MASTER_DMA_ENABLE) && (HAL_SPI_MASTER_DMA_ENABLE > 0U))
static void HAL_SpiMasterDMACallback(LPSPI_Type *base,
lpspi_master_edma_handle_t *handle,
status_t status,
void *callbackParam)
{
hal_spi_master_t *spiMasterHandle;
assert(callbackParam);
spiMasterHandle = (hal_spi_master_t *)callbackParam;
if (NULL != spiMasterHandle->callback)
{
spiMasterHandle->callback(spiMasterHandle, HAL_SpiGetStatus(status), spiMasterHandle->callbackParam);
}
}
#else
static void HAL_SpiMasterCallback(LPSPI_Type *base, lpspi_master_handle_t *handle, status_t status, void *callbackParam)
{
hal_spi_master_t *spiMasterHandle;
assert(callbackParam);
spiMasterHandle = (hal_spi_master_t *)callbackParam;
if (NULL != spiMasterHandle->callback)
{
spiMasterHandle->callback(spiMasterHandle, HAL_SpiGetStatus(status), spiMasterHandle->callbackParam);
}
}
#endif
#if (defined(HAL_SPI_SLAVE_DMA_ENABLE) && (HAL_SPI_SLAVE_DMA_ENABLE > 0U))
static void HAL_SpiSlaveDMACallback(LPSPI_Type *base,
lpspi_slave_edma_handle_t *handle,
status_t status,
void *callbackParam)
{
hal_spi_master_t *spiSlaveHandle;
assert(callbackParam);
spiSlaveHandle = (hal_spi_master_t *)callbackParam;
if (NULL != spiSlaveHandle->callback)
{
spiSlaveHandle->callback(spiSlaveHandle, HAL_SpiGetStatus(status), spiSlaveHandle->callbackParam);
}
}
#else
static void HAL_SpiSlaveCallback(LPSPI_Type *base, lpspi_slave_handle_t *handle, status_t status, void *callbackParam)
{
hal_spi_slave_t *spiSlaveHandle;
assert(callbackParam);
spiSlaveHandle = (hal_spi_slave_t *)callbackParam;
if (NULL != spiSlaveHandle->callback)
{
spiSlaveHandle->callback(spiSlaveHandle, HAL_SpiGetStatus(status), spiSlaveHandle->callbackParam);
}
}
#endif
hal_spi_status_t HAL_SpiMasterInit(hal_spi_master_handle_t handle, const hal_spi_master_config_t *config)
{
hal_spi_master_t *masterHandle;
lpspi_master_config_t lpspiConfig;
assert(handle);
assert(config);
assert(HAL_SPI_MASTER_HANDLE_SIZE >= sizeof(hal_spi_master_t));
masterHandle = (hal_spi_master_t *)handle;
LPSPI_MasterGetDefaultConfig(&lpspiConfig);
lpspiConfig.cpol = (kHAL_SpiClockPolarityActiveHigh == config->polarity) ? kLPSPI_ClockPolarityActiveHigh :
kLPSPI_ClockPolarityActiveLow;
lpspiConfig.cpha =
(kHAL_SpiClockPhaseFirstEdge == config->phase) ? kLPSPI_ClockPhaseFirstEdge : kLPSPI_ClockPhaseSecondEdge;
lpspiConfig.direction = (kHAL_SpiMsbFirst == config->direction) ? kLPSPI_MsbFirst : kLPSPI_LsbFirst;
lpspiConfig.baudRate = config->baudRate_Bps;
masterHandle->instance = config->instance;
LPSPI_MasterInit((LPSPI_Type *)s_spiBases[masterHandle->instance], &lpspiConfig, config->srcClock_Hz);
#if (defined(HAL_SPI_MASTER_DMA_ENABLE) && (HAL_SPI_MASTER_DMA_ENABLE > 0U))
masterHandle->dmaHandle = NULL;
#endif
return kStatus_HAL_SpiSuccess;
}
hal_spi_status_t HAL_SpiSlaveInit(hal_spi_slave_handle_t handle, const hal_spi_slave_config_t *config)
{
hal_spi_slave_t *slaveHandle;
lpspi_slave_config_t lpspiConfig;
assert(handle);
assert(config);
assert(HAL_SPI_SLAVE_HANDLE_SIZE >= sizeof(hal_spi_slave_t));
slaveHandle = (hal_spi_slave_t *)handle;
LPSPI_SlaveGetDefaultConfig(&lpspiConfig);
lpspiConfig.cpol = (kHAL_SpiClockPolarityActiveHigh == config->polarity) ? kLPSPI_ClockPolarityActiveHigh :
kLPSPI_ClockPolarityActiveLow;
lpspiConfig.cpha =
(kHAL_SpiClockPhaseFirstEdge == config->phase) ? kLPSPI_ClockPhaseFirstEdge : kLPSPI_ClockPhaseSecondEdge;
slaveHandle->instance = config->instance;
LPSPI_SlaveInit((LPSPI_Type *)s_spiBases[slaveHandle->instance], &lpspiConfig);
#if (defined(HAL_SPI_SLAVE_DMA_ENABLE) && (HAL_SPI_SLAVE_DMA_ENABLE > 0U))
slaveHandle->dmaHandle = NULL;
#endif
return kStatus_HAL_SpiSuccess;
}
hal_spi_status_t HAL_SpiMasterDeinit(hal_spi_master_handle_t handle)
{
hal_spi_master_t *masterHandle;
assert(handle);
masterHandle = (hal_spi_master_t *)handle;
LPSPI_Deinit((LPSPI_Type *)s_spiBases[masterHandle->instance]);
return kStatus_HAL_SpiSuccess;
}
hal_spi_status_t HAL_SpiSlaveDeinit(hal_spi_slave_handle_t handle)
{
hal_spi_slave_t *slaveHandle;
assert(handle);
slaveHandle = (hal_spi_slave_t *)handle;
LPSPI_Deinit((LPSPI_Type *)s_spiBases[slaveHandle->instance]);
return kStatus_HAL_SpiSuccess;
}
hal_spi_status_t HAL_SpiMasterTransferInstallCallback(hal_spi_master_handle_t handle,
hal_spi_master_transfer_callback_t callback,
void *callbackParam)
{
hal_spi_master_t *masterHandle;
#if (defined(HAL_SPI_MASTER_DMA_ENABLE) && (HAL_SPI_MASTER_DMA_ENABLE > 0U))
hal_spi_master_dma_state_t *spi_masterDmaHandle;
#endif
assert(handle);
masterHandle = (hal_spi_master_t *)handle;
masterHandle->callback = callback;
masterHandle->callbackParam = callbackParam;
#if (defined(HAL_SPI_MASTER_DMA_ENABLE) && (HAL_SPI_MASTER_DMA_ENABLE > 0U))
spi_masterDmaHandle = (hal_spi_master_dma_state_t *)masterHandle->dmaHandle;
spi_masterDmaHandle->callback = callback;
spi_masterDmaHandle->callbackParam = callbackParam;
#if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))
LPSPI_MasterTransferCreateHandleEDMA((LPSPI_Type *)s_spiBases[masterHandle->instance],
(lpspi_master_edma_handle_t *)&spi_masterDmaHandle->edmaHandle,
HAL_SpiMasterDMACallback, callbackParam, &spi_masterDmaHandle->rxEdmaHandle,
&spi_masterDmaHandle->txEdmaHandle);
#elif (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))
#endif /* FSL_FEATURE_SOC_EDMA_COUNT */
#else
LPSPI_MasterTransferCreateHandle((LPSPI_Type *)s_spiBases[masterHandle->instance], &masterHandle->hardwareHandle,
HAL_SpiMasterCallback, masterHandle);
#endif
return kStatus_HAL_SpiSuccess;
}
hal_spi_status_t HAL_SpiMasterTransferBlocking(hal_spi_master_handle_t handle, hal_spi_transfer_t *xfer)
{
hal_spi_master_t *masterHandle;
lpspi_transfer_t transfer;
assert(handle);
assert(xfer);
masterHandle = (hal_spi_master_t *)handle;
transfer.txData = xfer->txData;
transfer.rxData = xfer->rxData;
transfer.dataSize = xfer->dataSize;
transfer.configFlags = xfer->flags;
#if (defined(HAL_SPI_MASTER_DMA_ENABLE) && (HAL_SPI_MASTER_DMA_ENABLE > 0U))
(void)masterHandle;
return kStatus_HAL_SpiError;
#else
return HAL_SpiGetStatus(LPSPI_MasterTransferBlocking((LPSPI_Type *)s_spiBases[masterHandle->instance], &transfer));
#endif
}
hal_spi_status_t HAL_SpiMasterTransferNonBlocking(hal_spi_master_handle_t handle, hal_spi_transfer_t *xfer)
{
hal_spi_master_t *masterHandle;
lpspi_transfer_t transfer;
#if (defined(HAL_SPI_MASTER_DMA_ENABLE) && (HAL_SPI_MASTER_DMA_ENABLE > 0U))
hal_spi_master_dma_state_t *spi_masterDmaHandle;
#endif
assert(handle);
assert(xfer);
masterHandle = (hal_spi_master_t *)handle;
transfer.txData = xfer->txData;
transfer.rxData = xfer->rxData;
transfer.dataSize = xfer->dataSize;
transfer.configFlags = xfer->flags;
#if (defined(HAL_SPI_MASTER_DMA_ENABLE) && (HAL_SPI_MASTER_DMA_ENABLE > 0U))
spi_masterDmaHandle = (hal_spi_master_dma_state_t *)masterHandle->dmaHandle;
#if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))
return HAL_SpiGetStatus(LPSPI_MasterTransferEDMA((LPSPI_Type *)s_spiBases[masterHandle->instance],
(lpspi_master_edma_handle_t *)&spi_masterDmaHandle->edmaHandle,
&transfer));
#elif (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))
#endif /* FSL_FEATURE_SOC_EDMA_COUNT */
#else
return HAL_SpiGetStatus(LPSPI_MasterTransferNonBlocking((LPSPI_Type *)s_spiBases[masterHandle->instance],
&masterHandle->hardwareHandle, &transfer));
#endif
}
hal_spi_status_t HAL_SpiMasterTransferGetCount(hal_spi_master_handle_t handle, size_t *spiCount)
{
hal_spi_master_t *masterHandle;
#if (defined(HAL_SPI_MASTER_DMA_ENABLE) && (HAL_SPI_MASTER_DMA_ENABLE > 0U))
hal_spi_master_dma_state_t *spi_masterDmaHandle;
#endif
assert(handle);
assert(spiCount);
masterHandle = (hal_spi_master_t *)handle;
#if (defined(HAL_SPI_MASTER_DMA_ENABLE) && (HAL_SPI_MASTER_DMA_ENABLE > 0U))
spi_masterDmaHandle = (hal_spi_master_dma_state_t *)masterHandle->dmaHandle;
#if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))
return HAL_SpiGetStatus(
LPSPI_MasterTransferGetCountEDMA((LPSPI_Type *)s_spiBases[masterHandle->instance],
(lpspi_master_edma_handle_t *)&spi_masterDmaHandle->edmaHandle, spiCount));
#elif (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))
#endif /* FSL_FEATURE_SOC_EDMA_COUNT */
#else
return HAL_SpiGetStatus(LPSPI_MasterTransferGetCount((LPSPI_Type *)s_spiBases[masterHandle->instance],
&masterHandle->hardwareHandle, spiCount));
#endif
}
hal_spi_status_t HAL_SpiMasterTransferAbort(hal_spi_master_handle_t handle)
{
hal_spi_master_t *masterHandle;
#if (defined(HAL_SPI_MASTER_DMA_ENABLE) && (HAL_SPI_MASTER_DMA_ENABLE > 0U))
hal_spi_master_dma_state_t *spi_masterDmaHandle;
#endif
assert(handle);
masterHandle = (hal_spi_master_t *)handle;
#if (defined(HAL_SPI_MASTER_DMA_ENABLE) && (HAL_SPI_MASTER_DMA_ENABLE > 0U))
spi_masterDmaHandle = (hal_spi_master_dma_state_t *)masterHandle->dmaHandle;
#if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))
LPSPI_MasterTransferAbortEDMA((LPSPI_Type *)s_spiBases[masterHandle->instance],
(lpspi_master_edma_handle_t *)&spi_masterDmaHandle->edmaHandle);
#elif (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))
#endif /* FSL_FEATURE_SOC_EDMA_COUNT */
#else
LPSPI_MasterTransferAbort((LPSPI_Type *)s_spiBases[masterHandle->instance], &masterHandle->hardwareHandle);
#endif
return kStatus_HAL_SpiSuccess;
}
hal_spi_status_t HAL_SpiSlaveTransferInstallCallback(hal_spi_slave_handle_t handle,
hal_spi_slave_transfer_callback_t callback,
void *callbackParam)
{
hal_spi_slave_t *slaveHandle;
#if (defined(HAL_SPI_SLAVE_DMA_ENABLE) && (HAL_SPI_SLAVE_DMA_ENABLE > 0U))
hal_spi_slave_dma_state_t *spi_slaveDmaHandle;
#endif
assert(handle);
slaveHandle = (hal_spi_slave_t *)handle;
slaveHandle->callback = callback;
slaveHandle->callbackParam = callbackParam;
#if (defined(HAL_SPI_SLAVE_DMA_ENABLE) && (HAL_SPI_SLAVE_DMA_ENABLE > 0U))
spi_slaveDmaHandle = (hal_spi_slave_dma_state_t *)slaveHandle->dmaHandle;
spi_slaveDmaHandle->callback = callback;
spi_slaveDmaHandle->callbackParam = callbackParam;
#if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))
LPSPI_SlaveTransferCreateHandleEDMA(
(LPSPI_Type *)s_spiBases[slaveHandle->instance], (lpspi_slave_edma_handle_t *)&spi_slaveDmaHandle->edmaHandle,
HAL_SpiSlaveDMACallback, callbackParam, &spi_slaveDmaHandle->rxEdmaHandle, &spi_slaveDmaHandle->txEdmaHandle);
#elif (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))
#endif /* FSL_FEATURE_SOC_EDMA_COUNT */
#else
LPSPI_SlaveTransferCreateHandle((LPSPI_Type *)s_spiBases[slaveHandle->instance], &slaveHandle->hardwareHandle,
HAL_SpiSlaveCallback, slaveHandle);
#endif
return kStatus_HAL_SpiSuccess;
}
hal_spi_status_t HAL_SpiSlaveTransferNonBlocking(hal_spi_slave_handle_t handle, hal_spi_transfer_t *xfer)
{
hal_spi_slave_t *slaveHandle;
lpspi_transfer_t transfer;
#if (defined(HAL_SPI_SLAVE_DMA_ENABLE) && (HAL_SPI_SLAVE_DMA_ENABLE > 0U))
hal_spi_slave_dma_state_t *spi_slaveDmaHandle;
#endif
assert(handle);
assert(xfer);
slaveHandle = (hal_spi_slave_t *)handle;
transfer.txData = xfer->txData;
transfer.rxData = xfer->rxData;
transfer.dataSize = xfer->dataSize;
transfer.configFlags = xfer->flags;
#if (defined(HAL_SPI_SLAVE_DMA_ENABLE) && (HAL_SPI_SLAVE_DMA_ENABLE > 0U))
spi_slaveDmaHandle = (hal_spi_slave_dma_state_t *)slaveHandle->dmaHandle;
#if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))
return HAL_SpiGetStatus(LPSPI_SlaveTransferEDMA((LPSPI_Type *)s_spiBases[slaveHandle->instance],
(lpspi_slave_edma_handle_t *)&spi_slaveDmaHandle->edmaHandle,
&transfer));
#elif (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))
#endif /* FSL_FEATURE_SOC_EDMA_COUNT */
#else
return HAL_SpiGetStatus(LPSPI_SlaveTransferNonBlocking((LPSPI_Type *)s_spiBases[slaveHandle->instance],
&slaveHandle->hardwareHandle, &transfer));
#endif
}
hal_spi_status_t HAL_SpiSlaveTransferGetCount(hal_spi_slave_handle_t handle, size_t *spiCount)
{
hal_spi_slave_t *slaveHandle;
#if (defined(HAL_SPI_SLAVE_DMA_ENABLE) && (HAL_SPI_SLAVE_DMA_ENABLE > 0U))
hal_spi_slave_dma_state_t *spi_slaveDmaHandle;
#endif
assert(handle);
assert(spiCount);
slaveHandle = (hal_spi_slave_t *)handle;
#if (defined(HAL_SPI_SLAVE_DMA_ENABLE) && (HAL_SPI_SLAVE_DMA_ENABLE > 0U))
spi_slaveDmaHandle = (hal_spi_slave_dma_state_t *)slaveHandle->dmaHandle;
#if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))
return HAL_SpiGetStatus(
LPSPI_SlaveTransferGetCountEDMA((LPSPI_Type *)s_spiBases[slaveHandle->instance],
(lpspi_slave_edma_handle_t *)&spi_slaveDmaHandle->edmaHandle, spiCount));
#elif (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))
#endif /* FSL_FEATURE_SOC_EDMA_COUNT */
#else
return HAL_SpiGetStatus(LPSPI_SlaveTransferGetCount((LPSPI_Type *)s_spiBases[slaveHandle->instance],
&slaveHandle->hardwareHandle, spiCount));
#endif
}
hal_spi_status_t HAL_SpiSlaveTransferAbort(hal_spi_slave_handle_t handle)
{
hal_spi_slave_t *slaveHandle;
#if (defined(HAL_SPI_SLAVE_DMA_ENABLE) && (HAL_SPI_SLAVE_DMA_ENABLE > 0U))
hal_spi_slave_dma_state_t *spi_slaveDmaHandle;
#endif
assert(handle);
slaveHandle = (hal_spi_slave_t *)handle;
#if (defined(HAL_SPI_SLAVE_DMA_ENABLE) && (HAL_SPI_SLAVE_DMA_ENABLE > 0U))
spi_slaveDmaHandle = (hal_spi_slave_dma_state_t *)slaveHandle->dmaHandle;
#if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))
LPSPI_SlaveTransferAbortEDMA((LPSPI_Type *)s_spiBases[slaveHandle->instance],
(lpspi_slave_edma_handle_t *)&spi_slaveDmaHandle->edmaHandle);
#elif (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))
#endif /* FSL_FEATURE_SOC_EDMA_COUNT */
#else
LPSPI_SlaveTransferAbort((LPSPI_Type *)s_spiBases[slaveHandle->instance], &slaveHandle->hardwareHandle);
#endif
return kStatus_HAL_SpiSuccess;
}
#if (defined(HAL_SPI_SLAVE_DMA_ENABLE) && (HAL_SPI_SLAVE_DMA_ENABLE > 0U))
hal_spi_status_t HAL_SpiSlaveDMAInit(hal_spi_slave_handle_t handle,
hal_spi_slave_dma_handle_t dmaHandle,
hal_spi_dma_config_t *dmaConfig)
{
hal_spi_slave_t *spi_slaveHandle;
hal_spi_slave_dma_state_t *spi_slaveDmaHandle;
#if (defined(HAL_SPI_SLAVE_DMA_INIT_ENABLE) && (HAL_SPI_SLAVE_DMA_INIT_ENABLE > 0U))
edma_config_t config;
#endif
assert(handle);
assert(HAL_SPI_SLAVE_DMA_HANDLE_SIZE >= sizeof(hal_spi_slave_dma_state_t));
spi_slaveHandle = (hal_spi_slave_t *)handle;
spi_slaveDmaHandle = (hal_spi_slave_dma_state_t *)dmaHandle;
spi_slaveHandle->dmaHandle = dmaHandle;
/* DMA init process. */
spi_slaveDmaHandle->instance = dmaConfig->spi_instance;
spi_slaveHandle->dmaHandle = dmaHandle;
#if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))
#if (defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && (FSL_FEATURE_SOC_DMAMUX_COUNT > 0U))
dma_mux_configure_t *dmaMux = dmaConfig->dma_mux_configure;
/* Set channel for LPUART */
DMAMUX_Type *dmaMuxBases[] = DMAMUX_BASE_PTRS;
#if (defined(HAL_SPI_SLAVE_DMA_INIT_ENABLE) && (HAL_SPI_SLAVE_DMA_INIT_ENABLE > 0U))
DMAMUX_Init(dmaMuxBases[dmaMux->dma_dmamux_configure.dma_mux_instance]);
#endif
DMAMUX_SetSource(dmaMuxBases[dmaMux->dma_dmamux_configure.dma_mux_instance], dmaConfig->tx_channel,
dmaMux->dma_dmamux_configure.tx_request);
DMAMUX_SetSource(dmaMuxBases[dmaMux->dma_dmamux_configure.dma_mux_instance], dmaConfig->rx_channel,
dmaMux->dma_dmamux_configure.rx_request);
DMAMUX_EnableChannel(dmaMuxBases[dmaMux->dma_dmamux_configure.dma_mux_instance], dmaConfig->tx_channel);
DMAMUX_EnableChannel(dmaMuxBases[dmaMux->dma_dmamux_configure.dma_mux_instance], dmaConfig->rx_channel);
#endif /* FSL_FEATURE_SOC_DMAMUX_COUNT */
/* Init the EDMA module */
DMA_Type *dmaBases[] = DMA_BASE_PTRS;
IRQn_Type s_edmaIRQNumbers[][FSL_FEATURE_EDMA_MODULE_CHANNEL] = DMA_CHN_IRQS;
#if (defined(HAL_SPI_SLAVE_DMA_INIT_ENABLE) && (HAL_SPI_SLAVE_DMA_INIT_ENABLE > 0U))
EDMA_GetDefaultConfig(&config);
EDMA_Init(dmaBases[dmaConfig->dma_instance], &config);
#endif
EDMA_CreateHandle(&spi_slaveDmaHandle->txEdmaHandle, dmaBases[dmaConfig->dma_instance], dmaConfig->tx_channel);
EDMA_CreateHandle(&spi_slaveDmaHandle->rxEdmaHandle, dmaBases[dmaConfig->dma_instance], dmaConfig->rx_channel);
#if (defined(FSL_FEATURE_EDMA_HAS_CHANNEL_MUX) && (FSL_FEATURE_EDMA_HAS_CHANNEL_MUX > 0U))
dma_channel_mux_configure_t *dmaChannelMux = dmaConfig->dma_channel_mux_configure;
EDMA_SetChannelMux(dmaBases[dmaConfig->dma_instance], dmaConfig->tx_channel,
dmaChannelMux->dma_dmamux_configure.dma_tx_channel_mux);
EDMA_SetChannelMux(dmaBases[dmaConfig->dma_instance], dmaConfig->rx_channel,
dmaChannelMux->dma_dmamux_configure.dma_rx_channel_mux);
#endif /* FSL_FEATURE_EDMA_HAS_CHANNEL_MUX */
#elif (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))
#endif /* FSL_FEATURE_SOC_EDMA_COUNT */
NVIC_SetPriority(s_edmaIRQNumbers[dmaConfig->dma_instance][dmaConfig->tx_channel], HAL_SPI_ISR_PRIORITY);
NVIC_SetPriority(s_edmaIRQNumbers[dmaConfig->dma_instance][dmaConfig->rx_channel], HAL_SPI_ISR_PRIORITY);
return kStatus_HAL_SpiSuccess;
}
hal_spi_status_t HAL_SpiSlaveDMADeinit(hal_spi_slave_handle_t handle)
{
hal_spi_slave_t *spi_slaveHandle;
hal_spi_slave_dma_state_t *spi_slaveDmaHandle;
assert(handle);
spi_slaveHandle = (hal_spi_slave_t *)handle;
spi_slaveDmaHandle = (hal_spi_slave_dma_state_t *)spi_slaveHandle->dmaHandle;
spi_slaveHandle->dmaHandle = NULL;
assert(spi_slaveDmaHandle);
/* Abort rx/tx */
#if (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))
#elif (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))
/* Here we should not abort before create transfer handle. */
if (NULL != spi_slaveDmaHandle->edmaHandle.edmaRxRegToRxDataHandle)
{
LPSPI_SlaveTransferAbortEDMA(s_spiBases[spi_slaveHandle->instance],
(lpspi_slave_edma_handle_t *)&spi_slaveDmaHandle->edmaHandle);
}
#endif /* FSL_FEATURE_SOC_EDMA_COUNT */
return kStatus_HAL_SpiSuccess;
}
#endif
#if (defined(HAL_SPI_MASTER_DMA_ENABLE) && (HAL_SPI_MASTER_DMA_ENABLE > 0U))
hal_spi_status_t HAL_SpiMasterDMAInit(hal_spi_master_handle_t handle,
hal_spi_master_dma_handle_t dmaHandle,
hal_spi_dma_config_t *dmaConfig)
{
hal_spi_master_t *spi_masterHandle;
hal_spi_master_dma_state_t *spi_masterDmaHandle;
#if (defined(HAL_SPI_MASTER_DMA_INIT_ENABLE) && (HAL_SPI_MASTER_DMA_INIT_ENABLE > 0U))
edma_config_t config;
#endif
assert(handle);
assert(HAL_SPI_MASTER_DMA_HANDLE_SIZE >= sizeof(hal_spi_master_dma_state_t));
spi_masterHandle = (hal_spi_master_t *)handle;
spi_masterDmaHandle = (hal_spi_master_dma_state_t *)dmaHandle;
spi_masterHandle->dmaHandle = dmaHandle;
/* DMA init process. */
spi_masterDmaHandle->instance = dmaConfig->spi_instance;
spi_masterHandle->dmaHandle = dmaHandle;
#if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))
#if (defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && (FSL_FEATURE_SOC_DMAMUX_COUNT > 0U))
dma_mux_configure_t *dmaMux = dmaConfig->dma_mux_configure;
/* Set channel for LPUART */
DMAMUX_Type *dmaMuxBases[] = DMAMUX_BASE_PTRS;
#if (defined(HAL_SPI_MASTER_DMA_INIT_ENABLE) && (HAL_SPI_MASTER_DMA_INIT_ENABLE > 0U))
DMAMUX_Init(dmaMuxBases[dmaMux->dma_dmamux_configure.dma_mux_instance]);
#endif
DMAMUX_SetSource(dmaMuxBases[dmaMux->dma_dmamux_configure.dma_mux_instance], dmaConfig->tx_channel,
dmaMux->dma_dmamux_configure.tx_request);
DMAMUX_SetSource(dmaMuxBases[dmaMux->dma_dmamux_configure.dma_mux_instance], dmaConfig->rx_channel,
dmaMux->dma_dmamux_configure.rx_request);
DMAMUX_EnableChannel(dmaMuxBases[dmaMux->dma_dmamux_configure.dma_mux_instance], dmaConfig->tx_channel);
DMAMUX_EnableChannel(dmaMuxBases[dmaMux->dma_dmamux_configure.dma_mux_instance], dmaConfig->rx_channel);
#endif /* FSL_FEATURE_SOC_DMAMUX_COUNT */
/* Init the EDMA module */
DMA_Type *dmaBases[] = DMA_BASE_PTRS;
IRQn_Type s_edmaIRQNumbers[][FSL_FEATURE_EDMA_MODULE_CHANNEL] = DMA_CHN_IRQS;
#if (defined(HAL_SPI_MASTER_DMA_INIT_ENABLE) && (HAL_SPI_MASTER_DMA_INIT_ENABLE > 0U))
EDMA_GetDefaultConfig(&config);
EDMA_Init(dmaBases[dmaConfig->dma_instance], &config);
#endif
EDMA_CreateHandle(&spi_masterDmaHandle->txEdmaHandle, dmaBases[dmaConfig->dma_instance], dmaConfig->tx_channel);
EDMA_CreateHandle(&spi_masterDmaHandle->rxEdmaHandle, dmaBases[dmaConfig->dma_instance], dmaConfig->rx_channel);
#if (defined(FSL_FEATURE_EDMA_HAS_CHANNEL_MUX) && (FSL_FEATURE_EDMA_HAS_CHANNEL_MUX > 0U))
dma_channel_mux_configure_t *dmaChannelMux = dmaConfig->dma_channel_mux_configure;
EDMA_SetChannelMux(dmaBases[dmaConfig->dma_instance], dmaConfig->tx_channel,
dmaChannelMux->dma_dmamux_configure.dma_tx_channel_mux);
EDMA_SetChannelMux(dmaBases[dmaConfig->dma_instance], dmaConfig->rx_channel,
dmaChannelMux->dma_dmamux_configure.dma_rx_channel_mux);
#endif /* FSL_FEATURE_EDMA_HAS_CHANNEL_MUX */
#elif (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))
#endif /* FSL_FEATURE_SOC_EDMA_COUNT */
NVIC_SetPriority(s_edmaIRQNumbers[dmaConfig->dma_instance][dmaConfig->tx_channel], HAL_SPI_ISR_PRIORITY);
NVIC_SetPriority(s_edmaIRQNumbers[dmaConfig->dma_instance][dmaConfig->rx_channel], HAL_SPI_ISR_PRIORITY);
return kStatus_HAL_SpiSuccess;
}
hal_spi_status_t HAL_SpiMasterDMADeinit(hal_spi_master_handle_t handle)
{
hal_spi_master_t *spi_masterHandle;
hal_spi_master_dma_state_t *spi_masterDmaHandle;
assert(handle);
spi_masterHandle = (hal_spi_master_t *)handle;
spi_masterDmaHandle = (hal_spi_master_dma_state_t *)spi_masterHandle->dmaHandle;
spi_masterHandle->dmaHandle = NULL;
assert(spi_masterDmaHandle);
/* Abort rx/tx */
#if (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))
#elif (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))
/* Here we should not abort before create transfer handle. */
if (NULL != spi_masterDmaHandle->edmaHandle.edmaRxRegToRxDataHandle)
{
LPSPI_MasterTransferAbortEDMA((LPSPI_Type *)s_spiBases[spi_masterHandle->instance],
(lpspi_master_edma_handle_t *)&spi_masterDmaHandle->edmaHandle);
}
#endif /* FSL_FEATURE_SOC_EDMA_COUNT */
return kStatus_HAL_SpiSuccess;
}
#endif