Gordon Craig / mbed-dev

Fork of mbed-dev by mbed official

Committer:
Dollyparton
Date:
Tue Dec 19 12:50:13 2017 +0000
Revision:
174:ed647f63e28d
Parent:
154:37f96f9d4de2
Added RAW socket.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 154:37f96f9d4de2 1 /*
<> 154:37f96f9d4de2 2 * Copyright (c) 2015, Freescale Semiconductor, Inc.
<> 154:37f96f9d4de2 3 * All rights reserved.
<> 154:37f96f9d4de2 4 *
<> 154:37f96f9d4de2 5 * Redistribution and use in source and binary forms, with or without modification,
<> 154:37f96f9d4de2 6 * are permitted provided that the following conditions are met:
<> 154:37f96f9d4de2 7 *
<> 154:37f96f9d4de2 8 * o Redistributions of source code must retain the above copyright notice, this list
<> 154:37f96f9d4de2 9 * of conditions and the following disclaimer.
<> 154:37f96f9d4de2 10 *
<> 154:37f96f9d4de2 11 * o Redistributions in binary form must reproduce the above copyright notice, this
<> 154:37f96f9d4de2 12 * list of conditions and the following disclaimer in the documentation and/or
<> 154:37f96f9d4de2 13 * other materials provided with the distribution.
<> 154:37f96f9d4de2 14 *
<> 154:37f96f9d4de2 15 * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
<> 154:37f96f9d4de2 16 * contributors may be used to endorse or promote products derived from this
<> 154:37f96f9d4de2 17 * software without specific prior written permission.
<> 154:37f96f9d4de2 18 *
<> 154:37f96f9d4de2 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
<> 154:37f96f9d4de2 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
<> 154:37f96f9d4de2 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
<> 154:37f96f9d4de2 22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
<> 154:37f96f9d4de2 23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
<> 154:37f96f9d4de2 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
<> 154:37f96f9d4de2 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
<> 154:37f96f9d4de2 26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
<> 154:37f96f9d4de2 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
<> 154:37f96f9d4de2 28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<> 154:37f96f9d4de2 29 */
<> 154:37f96f9d4de2 30
<> 154:37f96f9d4de2 31 #include "fsl_sai_edma.h"
<> 154:37f96f9d4de2 32
<> 154:37f96f9d4de2 33 /*******************************************************************************
<> 154:37f96f9d4de2 34 * Definitations
<> 154:37f96f9d4de2 35 ******************************************************************************/
<> 154:37f96f9d4de2 36 /* Used for 32byte aligned */
<> 154:37f96f9d4de2 37 #define STCD_ADDR(address) (edma_tcd_t *)(((uint32_t)address + 32) & ~0x1FU)
<> 154:37f96f9d4de2 38
<> 154:37f96f9d4de2 39 /*<! Structure definition for uart_edma_private_handle_t. The structure is private. */
<> 154:37f96f9d4de2 40 typedef struct _sai_edma_private_handle
<> 154:37f96f9d4de2 41 {
<> 154:37f96f9d4de2 42 I2S_Type *base;
<> 154:37f96f9d4de2 43 sai_edma_handle_t *handle;
<> 154:37f96f9d4de2 44 } sai_edma_private_handle_t;
<> 154:37f96f9d4de2 45
<> 154:37f96f9d4de2 46 enum _sai_edma_transfer_state
<> 154:37f96f9d4de2 47 {
<> 154:37f96f9d4de2 48 kSAI_Busy = 0x0U, /*!< SAI is busy */
<> 154:37f96f9d4de2 49 kSAI_Idle, /*!< Transfer is done. */
<> 154:37f96f9d4de2 50 };
<> 154:37f96f9d4de2 51
<> 154:37f96f9d4de2 52 /*<! Private handle only used for internally. */
<> 154:37f96f9d4de2 53 static sai_edma_private_handle_t s_edmaPrivateHandle[FSL_FEATURE_SOC_I2S_COUNT][2];
<> 154:37f96f9d4de2 54
<> 154:37f96f9d4de2 55 /*******************************************************************************
<> 154:37f96f9d4de2 56 * Prototypes
<> 154:37f96f9d4de2 57 ******************************************************************************/
<> 154:37f96f9d4de2 58 /*!
<> 154:37f96f9d4de2 59 * @brief Get the instance number for SAI.
<> 154:37f96f9d4de2 60 *
<> 154:37f96f9d4de2 61 * @param base SAI base pointer.
<> 154:37f96f9d4de2 62 */
<> 154:37f96f9d4de2 63 extern uint32_t SAI_GetInstance(I2S_Type *base);
<> 154:37f96f9d4de2 64
<> 154:37f96f9d4de2 65 /*!
<> 154:37f96f9d4de2 66 * @brief SAI EDMA callback for send.
<> 154:37f96f9d4de2 67 *
<> 154:37f96f9d4de2 68 * @param handle pointer to sai_edma_handle_t structure which stores the transfer state.
<> 154:37f96f9d4de2 69 * @param userData Parameter for user callback.
<> 154:37f96f9d4de2 70 * @param done If the DMA transfer finished.
<> 154:37f96f9d4de2 71 * @param tcds The TCD index.
<> 154:37f96f9d4de2 72 */
<> 154:37f96f9d4de2 73 static void SAI_TxEDMACallback(edma_handle_t *handle, void *userData, bool done, uint32_t tcds);
<> 154:37f96f9d4de2 74
<> 154:37f96f9d4de2 75 /*!
<> 154:37f96f9d4de2 76 * @brief SAI EDMA callback for receive.
<> 154:37f96f9d4de2 77 *
<> 154:37f96f9d4de2 78 * @param handle pointer to sai_edma_handle_t structure which stores the transfer state.
<> 154:37f96f9d4de2 79 * @param userData Parameter for user callback.
<> 154:37f96f9d4de2 80 * @param done If the DMA transfer finished.
<> 154:37f96f9d4de2 81 * @param tcds The TCD index.
<> 154:37f96f9d4de2 82 */
<> 154:37f96f9d4de2 83 static void SAI_RxEDMACallback(edma_handle_t *handle, void *userData, bool done, uint32_t tcds);
<> 154:37f96f9d4de2 84
<> 154:37f96f9d4de2 85 /*******************************************************************************
<> 154:37f96f9d4de2 86 * Code
<> 154:37f96f9d4de2 87 ******************************************************************************/
<> 154:37f96f9d4de2 88 static void SAI_TxEDMACallback(edma_handle_t *handle, void *userData, bool done, uint32_t tcds)
<> 154:37f96f9d4de2 89 {
<> 154:37f96f9d4de2 90 sai_edma_private_handle_t *privHandle = (sai_edma_private_handle_t *)userData;
<> 154:37f96f9d4de2 91 sai_edma_handle_t *saiHandle = privHandle->handle;
<> 154:37f96f9d4de2 92
<> 154:37f96f9d4de2 93 /* If finished a blcok, call the callback function */
<> 154:37f96f9d4de2 94 memset(&saiHandle->saiQueue[saiHandle->queueDriver], 0, sizeof(sai_transfer_t));
<> 154:37f96f9d4de2 95 saiHandle->queueDriver = (saiHandle->queueDriver + 1) % SAI_XFER_QUEUE_SIZE;
<> 154:37f96f9d4de2 96 if (saiHandle->callback)
<> 154:37f96f9d4de2 97 {
<> 154:37f96f9d4de2 98 (saiHandle->callback)(privHandle->base, saiHandle, kStatus_SAI_TxIdle, saiHandle->userData);
<> 154:37f96f9d4de2 99 }
<> 154:37f96f9d4de2 100
<> 154:37f96f9d4de2 101 /* If all data finished, just stop the transfer */
<> 154:37f96f9d4de2 102 if (saiHandle->saiQueue[saiHandle->queueDriver].data == NULL)
<> 154:37f96f9d4de2 103 {
<> 154:37f96f9d4de2 104 SAI_TransferAbortSendEDMA(privHandle->base, saiHandle);
<> 154:37f96f9d4de2 105 }
<> 154:37f96f9d4de2 106 }
<> 154:37f96f9d4de2 107
<> 154:37f96f9d4de2 108 static void SAI_RxEDMACallback(edma_handle_t *handle, void *userData, bool done, uint32_t tcds)
<> 154:37f96f9d4de2 109 {
<> 154:37f96f9d4de2 110 sai_edma_private_handle_t *privHandle = (sai_edma_private_handle_t *)userData;
<> 154:37f96f9d4de2 111 sai_edma_handle_t *saiHandle = privHandle->handle;
<> 154:37f96f9d4de2 112
<> 154:37f96f9d4de2 113 /* If finished a blcok, call the callback function */
<> 154:37f96f9d4de2 114 memset(&saiHandle->saiQueue[saiHandle->queueDriver], 0, sizeof(sai_transfer_t));
<> 154:37f96f9d4de2 115 saiHandle->queueDriver = (saiHandle->queueDriver + 1) % SAI_XFER_QUEUE_SIZE;
<> 154:37f96f9d4de2 116 if (saiHandle->callback)
<> 154:37f96f9d4de2 117 {
<> 154:37f96f9d4de2 118 (saiHandle->callback)(privHandle->base, saiHandle, kStatus_SAI_RxIdle, saiHandle->userData);
<> 154:37f96f9d4de2 119 }
<> 154:37f96f9d4de2 120
<> 154:37f96f9d4de2 121 /* If all data finished, just stop the transfer */
<> 154:37f96f9d4de2 122 if (saiHandle->saiQueue[saiHandle->queueDriver].data == NULL)
<> 154:37f96f9d4de2 123 {
<> 154:37f96f9d4de2 124 SAI_TransferAbortReceiveEDMA(privHandle->base, saiHandle);
<> 154:37f96f9d4de2 125 }
<> 154:37f96f9d4de2 126 }
<> 154:37f96f9d4de2 127
<> 154:37f96f9d4de2 128 void SAI_TransferTxCreateHandleEDMA(
<> 154:37f96f9d4de2 129 I2S_Type *base, sai_edma_handle_t *handle, sai_edma_callback_t callback, void *userData, edma_handle_t *dmaHandle)
<> 154:37f96f9d4de2 130 {
<> 154:37f96f9d4de2 131 assert(handle && dmaHandle);
<> 154:37f96f9d4de2 132
<> 154:37f96f9d4de2 133 uint32_t instance = SAI_GetInstance(base);
<> 154:37f96f9d4de2 134
<> 154:37f96f9d4de2 135 /* Set sai base to handle */
<> 154:37f96f9d4de2 136 handle->dmaHandle = dmaHandle;
<> 154:37f96f9d4de2 137 handle->callback = callback;
<> 154:37f96f9d4de2 138 handle->userData = userData;
<> 154:37f96f9d4de2 139
<> 154:37f96f9d4de2 140 /* Set SAI state to idle */
<> 154:37f96f9d4de2 141 handle->state = kSAI_Idle;
<> 154:37f96f9d4de2 142
<> 154:37f96f9d4de2 143 s_edmaPrivateHandle[instance][0].base = base;
<> 154:37f96f9d4de2 144 s_edmaPrivateHandle[instance][0].handle = handle;
<> 154:37f96f9d4de2 145
<> 154:37f96f9d4de2 146 /* Need to use scatter gather */
<> 154:37f96f9d4de2 147 EDMA_InstallTCDMemory(dmaHandle, STCD_ADDR(handle->tcd), SAI_XFER_QUEUE_SIZE);
<> 154:37f96f9d4de2 148
<> 154:37f96f9d4de2 149 /* Install callback for Tx dma channel */
<> 154:37f96f9d4de2 150 EDMA_SetCallback(dmaHandle, SAI_TxEDMACallback, &s_edmaPrivateHandle[instance][0]);
<> 154:37f96f9d4de2 151 }
<> 154:37f96f9d4de2 152
<> 154:37f96f9d4de2 153 void SAI_TransferRxCreateHandleEDMA(
<> 154:37f96f9d4de2 154 I2S_Type *base, sai_edma_handle_t *handle, sai_edma_callback_t callback, void *userData, edma_handle_t *dmaHandle)
<> 154:37f96f9d4de2 155 {
<> 154:37f96f9d4de2 156 assert(handle && dmaHandle);
<> 154:37f96f9d4de2 157
<> 154:37f96f9d4de2 158 uint32_t instance = SAI_GetInstance(base);
<> 154:37f96f9d4de2 159
<> 154:37f96f9d4de2 160 /* Set sai base to handle */
<> 154:37f96f9d4de2 161 handle->dmaHandle = dmaHandle;
<> 154:37f96f9d4de2 162 handle->callback = callback;
<> 154:37f96f9d4de2 163 handle->userData = userData;
<> 154:37f96f9d4de2 164
<> 154:37f96f9d4de2 165 /* Set SAI state to idle */
<> 154:37f96f9d4de2 166 handle->state = kSAI_Idle;
<> 154:37f96f9d4de2 167
<> 154:37f96f9d4de2 168 s_edmaPrivateHandle[instance][1].base = base;
<> 154:37f96f9d4de2 169 s_edmaPrivateHandle[instance][1].handle = handle;
<> 154:37f96f9d4de2 170
<> 154:37f96f9d4de2 171 /* Need to use scatter gather */
<> 154:37f96f9d4de2 172 EDMA_InstallTCDMemory(dmaHandle, STCD_ADDR(handle->tcd), SAI_XFER_QUEUE_SIZE);
<> 154:37f96f9d4de2 173
<> 154:37f96f9d4de2 174 /* Install callback for Tx dma channel */
<> 154:37f96f9d4de2 175 EDMA_SetCallback(dmaHandle, SAI_RxEDMACallback, &s_edmaPrivateHandle[instance][1]);
<> 154:37f96f9d4de2 176 }
<> 154:37f96f9d4de2 177
<> 154:37f96f9d4de2 178 void SAI_TransferTxSetFormatEDMA(I2S_Type *base,
<> 154:37f96f9d4de2 179 sai_edma_handle_t *handle,
<> 154:37f96f9d4de2 180 sai_transfer_format_t *format,
<> 154:37f96f9d4de2 181 uint32_t mclkSourceClockHz,
<> 154:37f96f9d4de2 182 uint32_t bclkSourceClockHz)
<> 154:37f96f9d4de2 183 {
<> 154:37f96f9d4de2 184 assert(handle && format);
<> 154:37f96f9d4de2 185
<> 154:37f96f9d4de2 186 /* Configure the audio format to SAI registers */
<> 154:37f96f9d4de2 187 SAI_TxSetFormat(base, format, mclkSourceClockHz, bclkSourceClockHz);
<> 154:37f96f9d4de2 188
<> 154:37f96f9d4de2 189 /* Get the tranfer size from format, this should be used in EDMA configuration */
<> 154:37f96f9d4de2 190 handle->bytesPerFrame = format->bitWidth / 8U;
<> 154:37f96f9d4de2 191
<> 154:37f96f9d4de2 192 /* Update the data channel SAI used */
<> 154:37f96f9d4de2 193 handle->channel = format->channel;
<> 154:37f96f9d4de2 194 #if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1)
<> 154:37f96f9d4de2 195 handle->count = FSL_FEATURE_SAI_FIFO_COUNT - format->watermark;
<> 154:37f96f9d4de2 196 #else
<> 154:37f96f9d4de2 197 handle->count = 1U;
<> 154:37f96f9d4de2 198 #endif /* FSL_FEATURE_SAI_FIFO_COUNT */
<> 154:37f96f9d4de2 199 }
<> 154:37f96f9d4de2 200
<> 154:37f96f9d4de2 201 void SAI_TransferRxSetFormatEDMA(I2S_Type *base,
<> 154:37f96f9d4de2 202 sai_edma_handle_t *handle,
<> 154:37f96f9d4de2 203 sai_transfer_format_t *format,
<> 154:37f96f9d4de2 204 uint32_t mclkSourceClockHz,
<> 154:37f96f9d4de2 205 uint32_t bclkSourceClockHz)
<> 154:37f96f9d4de2 206 {
<> 154:37f96f9d4de2 207 assert(handle && format);
<> 154:37f96f9d4de2 208
<> 154:37f96f9d4de2 209 /* Configure the audio format to SAI registers */
<> 154:37f96f9d4de2 210 SAI_RxSetFormat(base, format, mclkSourceClockHz, bclkSourceClockHz);
<> 154:37f96f9d4de2 211
<> 154:37f96f9d4de2 212 /* Get the tranfer size from format, this should be used in EDMA configuration */
<> 154:37f96f9d4de2 213 handle->bytesPerFrame = format->bitWidth / 8U;
<> 154:37f96f9d4de2 214
<> 154:37f96f9d4de2 215 /* Update the data channel SAI used */
<> 154:37f96f9d4de2 216 handle->channel = format->channel;
<> 154:37f96f9d4de2 217
<> 154:37f96f9d4de2 218 #if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1)
<> 154:37f96f9d4de2 219 handle->count = format->watermark;
<> 154:37f96f9d4de2 220 #else
<> 154:37f96f9d4de2 221 handle->count = 1U;
<> 154:37f96f9d4de2 222 #endif /* FSL_FEATURE_SAI_FIFO_COUNT */
<> 154:37f96f9d4de2 223 }
<> 154:37f96f9d4de2 224
<> 154:37f96f9d4de2 225 status_t SAI_TransferSendEDMA(I2S_Type *base, sai_edma_handle_t *handle, sai_transfer_t *xfer)
<> 154:37f96f9d4de2 226 {
<> 154:37f96f9d4de2 227 assert(handle && xfer);
<> 154:37f96f9d4de2 228
<> 154:37f96f9d4de2 229 edma_transfer_config_t config = {0};
<> 154:37f96f9d4de2 230 uint32_t destAddr = SAI_TxGetDataRegisterAddress(base, handle->channel);
<> 154:37f96f9d4de2 231
<> 154:37f96f9d4de2 232 /* Check if input parameter invalid */
<> 154:37f96f9d4de2 233 if ((xfer->data == NULL) || (xfer->dataSize == 0U))
<> 154:37f96f9d4de2 234 {
<> 154:37f96f9d4de2 235 return kStatus_InvalidArgument;
<> 154:37f96f9d4de2 236 }
<> 154:37f96f9d4de2 237
<> 154:37f96f9d4de2 238 if (handle->saiQueue[handle->queueUser].data)
<> 154:37f96f9d4de2 239 {
<> 154:37f96f9d4de2 240 return kStatus_SAI_QueueFull;
<> 154:37f96f9d4de2 241 }
<> 154:37f96f9d4de2 242
<> 154:37f96f9d4de2 243 /* Change the state of handle */
<> 154:37f96f9d4de2 244 handle->state = kSAI_Busy;
<> 154:37f96f9d4de2 245
<> 154:37f96f9d4de2 246 /* Update the queue state */
<> 154:37f96f9d4de2 247 handle->transferSize[handle->queueUser] = xfer->dataSize;
<> 154:37f96f9d4de2 248 handle->saiQueue[handle->queueUser].data = xfer->data;
<> 154:37f96f9d4de2 249 handle->saiQueue[handle->queueUser].dataSize = xfer->dataSize;
<> 154:37f96f9d4de2 250 handle->queueUser = (handle->queueUser + 1) % SAI_XFER_QUEUE_SIZE;
<> 154:37f96f9d4de2 251
<> 154:37f96f9d4de2 252 /* Prepare edma configure */
<> 154:37f96f9d4de2 253 EDMA_PrepareTransfer(&config, xfer->data, handle->bytesPerFrame, (void *)destAddr, handle->bytesPerFrame,
<> 154:37f96f9d4de2 254 handle->count * handle->bytesPerFrame, xfer->dataSize, kEDMA_MemoryToPeripheral);
<> 154:37f96f9d4de2 255
<> 154:37f96f9d4de2 256 /* Store the initially configured eDMA minor byte transfer count into the SAI handle */
<> 154:37f96f9d4de2 257 handle->nbytes = handle->count * handle->bytesPerFrame;
<> 154:37f96f9d4de2 258
<> 154:37f96f9d4de2 259 EDMA_SubmitTransfer(handle->dmaHandle, &config);
<> 154:37f96f9d4de2 260
<> 154:37f96f9d4de2 261 /* Start DMA transfer */
<> 154:37f96f9d4de2 262 EDMA_StartTransfer(handle->dmaHandle);
<> 154:37f96f9d4de2 263
<> 154:37f96f9d4de2 264 /* Enable DMA enable bit */
<> 154:37f96f9d4de2 265 SAI_TxEnableDMA(base, kSAI_FIFORequestDMAEnable, true);
<> 154:37f96f9d4de2 266
<> 154:37f96f9d4de2 267 /* Enable SAI Tx clock */
<> 154:37f96f9d4de2 268 SAI_TxEnable(base, true);
<> 154:37f96f9d4de2 269
<> 154:37f96f9d4de2 270 return kStatus_Success;
<> 154:37f96f9d4de2 271 }
<> 154:37f96f9d4de2 272
<> 154:37f96f9d4de2 273 status_t SAI_TransferReceiveEDMA(I2S_Type *base, sai_edma_handle_t *handle, sai_transfer_t *xfer)
<> 154:37f96f9d4de2 274 {
<> 154:37f96f9d4de2 275 assert(handle && xfer);
<> 154:37f96f9d4de2 276
<> 154:37f96f9d4de2 277 edma_transfer_config_t config = {0};
<> 154:37f96f9d4de2 278 uint32_t srcAddr = SAI_RxGetDataRegisterAddress(base, handle->channel);
<> 154:37f96f9d4de2 279
<> 154:37f96f9d4de2 280 /* Check if input parameter invalid */
<> 154:37f96f9d4de2 281 if ((xfer->data == NULL) || (xfer->dataSize == 0U))
<> 154:37f96f9d4de2 282 {
<> 154:37f96f9d4de2 283 return kStatus_InvalidArgument;
<> 154:37f96f9d4de2 284 }
<> 154:37f96f9d4de2 285
<> 154:37f96f9d4de2 286 if (handle->saiQueue[handle->queueUser].data)
<> 154:37f96f9d4de2 287 {
<> 154:37f96f9d4de2 288 return kStatus_SAI_QueueFull;
<> 154:37f96f9d4de2 289 }
<> 154:37f96f9d4de2 290
<> 154:37f96f9d4de2 291 /* Change the state of handle */
<> 154:37f96f9d4de2 292 handle->state = kSAI_Busy;
<> 154:37f96f9d4de2 293
<> 154:37f96f9d4de2 294 /* Update queue state */
<> 154:37f96f9d4de2 295 handle->transferSize[handle->queueUser] = xfer->dataSize;
<> 154:37f96f9d4de2 296 handle->saiQueue[handle->queueUser].data = xfer->data;
<> 154:37f96f9d4de2 297 handle->saiQueue[handle->queueUser].dataSize = xfer->dataSize;
<> 154:37f96f9d4de2 298 handle->queueUser = (handle->queueUser + 1) % SAI_XFER_QUEUE_SIZE;
<> 154:37f96f9d4de2 299
<> 154:37f96f9d4de2 300 /* Prepare edma configure */
<> 154:37f96f9d4de2 301 EDMA_PrepareTransfer(&config, (void *)srcAddr, handle->bytesPerFrame, xfer->data, handle->bytesPerFrame,
<> 154:37f96f9d4de2 302 handle->count * handle->bytesPerFrame, xfer->dataSize, kEDMA_PeripheralToMemory);
<> 154:37f96f9d4de2 303
<> 154:37f96f9d4de2 304 /* Store the initially configured eDMA minor byte transfer count into the SAI handle */
<> 154:37f96f9d4de2 305 handle->nbytes = handle->count * handle->bytesPerFrame;
<> 154:37f96f9d4de2 306
<> 154:37f96f9d4de2 307 EDMA_SubmitTransfer(handle->dmaHandle, &config);
<> 154:37f96f9d4de2 308
<> 154:37f96f9d4de2 309 /* Start DMA transfer */
<> 154:37f96f9d4de2 310 EDMA_StartTransfer(handle->dmaHandle);
<> 154:37f96f9d4de2 311
<> 154:37f96f9d4de2 312 /* Enable DMA enable bit */
<> 154:37f96f9d4de2 313 SAI_RxEnableDMA(base, kSAI_FIFORequestDMAEnable, true);
<> 154:37f96f9d4de2 314
<> 154:37f96f9d4de2 315 /* Enable SAI Rx clock */
<> 154:37f96f9d4de2 316 SAI_RxEnable(base, true);
<> 154:37f96f9d4de2 317
<> 154:37f96f9d4de2 318 return kStatus_Success;
<> 154:37f96f9d4de2 319 }
<> 154:37f96f9d4de2 320
<> 154:37f96f9d4de2 321 void SAI_TransferAbortSendEDMA(I2S_Type *base, sai_edma_handle_t *handle)
<> 154:37f96f9d4de2 322 {
<> 154:37f96f9d4de2 323 assert(handle);
<> 154:37f96f9d4de2 324
<> 154:37f96f9d4de2 325 /* Disable dma */
<> 154:37f96f9d4de2 326 EDMA_AbortTransfer(handle->dmaHandle);
<> 154:37f96f9d4de2 327
<> 154:37f96f9d4de2 328 /* Disable DMA enable bit */
<> 154:37f96f9d4de2 329 SAI_TxEnableDMA(base, kSAI_FIFORequestDMAEnable, false);
<> 154:37f96f9d4de2 330
<> 154:37f96f9d4de2 331 /* Disable Tx */
<> 154:37f96f9d4de2 332 SAI_TxEnable(base, false);
<> 154:37f96f9d4de2 333
<> 154:37f96f9d4de2 334 /* Set the handle state */
<> 154:37f96f9d4de2 335 handle->state = kSAI_Idle;
<> 154:37f96f9d4de2 336 }
<> 154:37f96f9d4de2 337
<> 154:37f96f9d4de2 338 void SAI_TransferAbortReceiveEDMA(I2S_Type *base, sai_edma_handle_t *handle)
<> 154:37f96f9d4de2 339 {
<> 154:37f96f9d4de2 340 assert(handle);
<> 154:37f96f9d4de2 341
<> 154:37f96f9d4de2 342 /* Disable dma */
<> 154:37f96f9d4de2 343 EDMA_AbortTransfer(handle->dmaHandle);
<> 154:37f96f9d4de2 344
<> 154:37f96f9d4de2 345 /* Disable DMA enable bit */
<> 154:37f96f9d4de2 346 SAI_RxEnableDMA(base, kSAI_FIFORequestDMAEnable, false);
<> 154:37f96f9d4de2 347
<> 154:37f96f9d4de2 348 /* Disable Rx */
<> 154:37f96f9d4de2 349 SAI_RxEnable(base, false);
<> 154:37f96f9d4de2 350
<> 154:37f96f9d4de2 351 /* Set the handle state */
<> 154:37f96f9d4de2 352 handle->state = kSAI_Idle;
<> 154:37f96f9d4de2 353 }
<> 154:37f96f9d4de2 354
<> 154:37f96f9d4de2 355 status_t SAI_TransferGetSendCountEDMA(I2S_Type *base, sai_edma_handle_t *handle, size_t *count)
<> 154:37f96f9d4de2 356 {
<> 154:37f96f9d4de2 357 assert(handle);
<> 154:37f96f9d4de2 358
<> 154:37f96f9d4de2 359 status_t status = kStatus_Success;
<> 154:37f96f9d4de2 360
<> 154:37f96f9d4de2 361 if (handle->state != kSAI_Busy)
<> 154:37f96f9d4de2 362 {
<> 154:37f96f9d4de2 363 status = kStatus_NoTransferInProgress;
<> 154:37f96f9d4de2 364 }
<> 154:37f96f9d4de2 365 else
<> 154:37f96f9d4de2 366 {
<> 154:37f96f9d4de2 367 *count = (handle->transferSize[handle->queueDriver] -
<> 154:37f96f9d4de2 368 (uint32_t)handle->nbytes *
<> 154:37f96f9d4de2 369 EDMA_GetRemainingMajorLoopCount(handle->dmaHandle->base, handle->dmaHandle->channel));
<> 154:37f96f9d4de2 370 }
<> 154:37f96f9d4de2 371
<> 154:37f96f9d4de2 372 return status;
<> 154:37f96f9d4de2 373 }
<> 154:37f96f9d4de2 374
<> 154:37f96f9d4de2 375 status_t SAI_TransferGetReceiveCountEDMA(I2S_Type *base, sai_edma_handle_t *handle, size_t *count)
<> 154:37f96f9d4de2 376 {
<> 154:37f96f9d4de2 377 assert(handle);
<> 154:37f96f9d4de2 378
<> 154:37f96f9d4de2 379 status_t status = kStatus_Success;
<> 154:37f96f9d4de2 380
<> 154:37f96f9d4de2 381 if (handle->state != kSAI_Busy)
<> 154:37f96f9d4de2 382 {
<> 154:37f96f9d4de2 383 status = kStatus_NoTransferInProgress;
<> 154:37f96f9d4de2 384 }
<> 154:37f96f9d4de2 385 else
<> 154:37f96f9d4de2 386 {
<> 154:37f96f9d4de2 387 *count = (handle->transferSize[handle->queueDriver] -
<> 154:37f96f9d4de2 388 (uint32_t)handle->nbytes *
<> 154:37f96f9d4de2 389 EDMA_GetRemainingMajorLoopCount(handle->dmaHandle->base, handle->dmaHandle->channel));
<> 154:37f96f9d4de2 390 }
<> 154:37f96f9d4de2 391
<> 154:37f96f9d4de2 392 return status;
<> 154:37f96f9d4de2 393 }