/*! * brief Initializes the SPDIF Rx eDMA handle. * * This function initializes the SPDIF slave DMA handle, which can be used for other SPDIF master transactional APIs. * Usually, for a specified SPDIF instance, call this API once to get the initialized handle. * * param base SPDIF base pointer. * param handle SPDIF eDMA handle pointer. * param base SPDIF peripheral base address. * param callback Pointer to user callback function. * param userData User parameter passed to the callback function. * param dmaLeftHandle eDMA handle pointer for left channel, this handle shall be static allocated by users. * param dmaRightHandle eDMA handle pointer for right channel, this handle shall be static allocated by users. */ void SPDIF_TransferRxCreateHandleEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle, spdif_edma_callback_t callback, void *userData, edma_handle_t *dmaLeftHandle, edma_handle_t *dmaRightHandle) { assert(handle && dmaLeftHandle && dmaRightHandle); uint32_t instance = SPDIF_GetInstance(base); /* Zero the handle */ memset(handle, 0, sizeof(*handle)); /* Set spdif base to handle */ handle->dmaLeftHandle = dmaLeftHandle; handle->dmaRightHandle = dmaRightHandle; handle->callback = callback; handle->userData = userData; handle->count = s_spdif_rx_watermark[(base->SCR & SPDIF_SCR_RXFIFOFULL_SEL_MASK) >> SPDIF_SCR_RXFIFOFULL_SEL_SHIFT]; /* Set SPDIF state to idle */ handle->state = kSPDIF_Idle; s_edmaPrivateHandle[instance][1].base = base; s_edmaPrivateHandle[instance][1].handle = handle; /* Need to use scatter gather */ EDMA_InstallTCDMemory(dmaLeftHandle, STCD_ADDR(handle->leftTcd), SPDIF_XFER_QUEUE_SIZE); EDMA_InstallTCDMemory(dmaRightHandle, STCD_ADDR(handle->rightTcd), SPDIF_XFER_QUEUE_SIZE); /* Install callback for Tx dma channel */ EDMA_SetCallback(dmaRightHandle, SPDIF_RxEDMACallback, &s_edmaPrivateHandle[instance][1]); }
void FLEXIO_I2S_TransferRxCreateHandleEDMA(FLEXIO_I2S_Type *base, flexio_i2s_edma_handle_t *handle, flexio_i2s_edma_callback_t callback, void *userData, edma_handle_t *dmaHandle) { assert(handle && dmaHandle); /* Zero the handle. */ memset(handle, 0, sizeof(*handle)); /* Set flexio_i2s base to handle */ handle->dmaHandle = dmaHandle; handle->callback = callback; handle->userData = userData; /* Set FLEXIO I2S state to idle */ handle->state = kFLEXIO_I2S_Idle; s_edmaPrivateHandle[1].base = base; s_edmaPrivateHandle[1].handle = handle; /* Need to use scatter gather */ EDMA_InstallTCDMemory(dmaHandle, STCD_ADDR(handle->tcd), FLEXIO_I2S_XFER_QUEUE_SIZE); /* Install callback for Tx dma channel */ EDMA_SetCallback(dmaHandle, FLEXIO_I2S_RxEDMACallback, &s_edmaPrivateHandle[1]); }
void SAI_TransferRxCreateHandleEDMA( I2S_Type *base, sai_edma_handle_t *handle, sai_edma_callback_t callback, void *userData, edma_handle_t *dmaHandle) { assert(handle && dmaHandle); uint32_t instance = SAI_GetInstance(base); /* Zero the handle */ memset(handle, 0, sizeof(*handle)); /* Set sai base to handle */ handle->dmaHandle = dmaHandle; handle->callback = callback; handle->userData = userData; /* Set SAI state to idle */ handle->state = kSAI_Idle; s_edmaPrivateHandle[instance][1].base = base; s_edmaPrivateHandle[instance][1].handle = handle; /* Need to use scatter gather */ EDMA_InstallTCDMemory(dmaHandle, STCD_ADDR(handle->tcd), SAI_XFER_QUEUE_SIZE); /* Install callback for Tx dma channel */ EDMA_SetCallback(dmaHandle, SAI_RxEDMACallback, &s_edmaPrivateHandle[instance][1]); }
/*! * @brief Main function */ int main(void) { uint32_t srcAddr[BUFFER_LENGTH] = {0x01U, 0x02U, 0x03U, 0x04U, 0x05U, 0x06U, 0x07U, 0x08U}; uint32_t destAddr[BUFFER_LENGTH] = {0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U}; uint32_t i = 0; edma_transfer_config_t transferConfig; edma_tcd_t *tcdMemoryPoolPtr; edma_config_t userConfig; BOARD_InitPins(); BOARD_BootClockRUN(); BOARD_InitDebugConsole(); /* Print source buffer */ PRINTF("EDMA memory to memory transfer example begin.\r\n\r\n"); PRINTF("Destination Buffer:\r\n"); for (i = 0; i < BUFFER_LENGTH; i++) { PRINTF("%d\t", destAddr[i]); } /* Configure DMAMUX */ DMAMUX_Init(DMAMUX0); DMAMUX_SetSource(DMAMUX0, 0, 63); DMAMUX_EnableChannel(DMAMUX0, 0); /* Configure EDMA one shot transfer */ /* * userConfig.enableRoundRobinArbitration = false; * userConfig.enableHaltOnError = true; * userConfig.enableContinuousLinkMode = false; * userConfig.enableDebugMode = false; */ EDMA_GetDefaultConfig(&userConfig); EDMA_Init(DMA0, &userConfig); EDMA_CreateHandle(&g_EDMA_Handle, DMA0, 0); EDMA_SetCallback(&g_EDMA_Handle, EDMA_Callback, NULL); EDMA_ResetChannel(g_EDMA_Handle.base, g_EDMA_Handle.channel); /* Allocate TCD memory poll */ tcdMemoryPoolPtr = (edma_tcd_t *)malloc(sizeof(edma_tcd_t) * (TCD_QUEUE_SIZE + 1)); if (tcdMemoryPoolPtr != NULL) { tcdMemoryPoolPtr = (edma_tcd_t *)((uint32_t)(tcdMemoryPoolPtr + 1) & (~0x1FU)); EDMA_InstallTCDMemory(&g_EDMA_Handle, tcdMemoryPoolPtr, TCD_QUEUE_SIZE); /* Configure and submit transfer structure 1 */ EDMA_PrepareTransfer(&transferConfig, srcAddr, sizeof(srcAddr[0]), destAddr, sizeof(destAddr[0]), sizeof(srcAddr[0]), sizeof(srcAddr[0]) * HALF_BUFFER_LENGTH, kEDMA_MemoryToMemory); EDMA_SubmitTransfer(&g_EDMA_Handle, &transferConfig); /* Configure and submit transfer structure 2 */ EDMA_PrepareTransfer(&transferConfig, &srcAddr[4], sizeof(srcAddr[0]), &destAddr[4], sizeof(destAddr[0]), sizeof(srcAddr[0]), sizeof(srcAddr[0]) * HALF_BUFFER_LENGTH, kEDMA_MemoryToMemory); EDMA_SubmitTransfer(&g_EDMA_Handle, &transferConfig); } EDMA_StartTransfer(&g_EDMA_Handle); /* Wait for EDMA transfer finish */ while (g_Transfer_Done != true) { } /* Print destination buffer */ PRINTF("\r\n\r\nEDMA memory to memory transfer example finish.\r\n\r\n"); PRINTF("Destination Buffer:\r\n"); for (i = 0; i < BUFFER_LENGTH; i++) { PRINTF("%d\t", destAddr[i]); } while (1) { } }