//***************************************************************************** // //! Configures the uDMA channel //! //! \param uiChannel is the DMA channel to be selected //! \param pfpAppCb is the application callback to be invoked on transfer //! //! This function //! 1. Configures the uDMA channel //! //! \return None. // //***************************************************************************** void cc_UDMAChannelSelect(unsigned int uiChannel) { if((uiChannel & 0xFF) > MAX_NUM_CH) { return; } MAP_uDMAChannelAssign(uiChannel); MAP_uDMAChannelAttributeDisable(uiChannel,UDMA_ATTR_ALTSELECT); }
//***************************************************************************** // //! Configures the uDMA channel //! //! \param uiChannel is the DMA channel to be selected //! \param pfpAppCb is the application callback to be invoked on transfer //! //! This function //! 1. Configures the uDMA channel //! //! \return None. // //***************************************************************************** void UDMAChannelSelect(unsigned int uiChannel, tAppCallbackHndl pfpAppCb) { if((uiChannel & 0xFF) > MAX_NUM_CH) { return; } MAP_uDMAChannelAssign(uiChannel); MAP_uDMAChannelAttributeDisable(uiChannel,UDMA_ATTR_ALTSELECT); gfpAppCallbackHndl[(uiChannel & 0xFF)] = pfpAppCb; }
//***************************************************************************** //! //! Initialize Scatter Gather DMA Transfer //! //! \param None //! //! \return None //! //***************************************************************************** void InitSGTransfer() { int i; char * pvSrcBuf,*pvDstBuf; // // Source Buffer // pvSrcBuf=malloc(BUFF_SIZE); if(pvSrcBuf == NULL) { UART_PRINT("Failed to allocate Src buffer\n\r"); return ; } for(i=0;i<BUFF_SIZE;i++) *(pvSrcBuf+i)=i; MAP_uDMAChannelAssign(UDMA_CH0_SW); MAP_uDMAChannelAttributeDisable(UDMA_CH0_SW,UDMA_ATTR_ALTSELECT); iDone=0; pvDstBuf=malloc(BUFF_SIZE); if(pvDstBuf == NULL) { UART_PRINT("Failed to allocate Dst buffer\n\r"); return ; } // // Call to Set Up Scatter Gather Mode Transfer // SetupSGMemTransfer(UDMA_CH0_SW,pvSrcBuf,pvSrcBuf+BUFF_SIZE/2, pvDstBuf,BUFF_SIZE/2); MAP_uDMAChannelRequest(UDMA_CH0_SW); // // Checking for the Completion // while(!iDone); // // Checking Correctness of SG Transfer // if(memcmp(pvSrcBuf,pvDstBuf,BUFF_SIZE)==0) UART_PRINT("SG Mode Memory to Memory Transfer Completed \n\r\n\r"); else UART_PRINT("SG Mode Memory to Memory Transfer Failed! \n\r\n\r"); free(pvDstBuf); }
/* * ======== SPICC3200DMA_configDMA ======== * This functions configures the transmit and receive DMA channels for a given * SPI_Handle and SPI_Transaction * * @pre Function assumes that the handle and transaction is not NULL */ static void SPICC3200DMA_configDMA(SPI_Handle handle, SPI_Transaction *transaction) { uintptr_t key; SPIDataType dummy; void *buf; uint32_t channelControlOptions; SPICC3200DMA_Object *object = handle->object; SPICC3200DMA_HWAttrs const *hwAttrs = handle->hwAttrs; /* Clear out the FIFO */ while (MAP_SPIDataGetNonBlocking(hwAttrs->baseAddr, &dummy)) {} /* Configure DMA for RX */ MAP_uDMAChannelAssign(hwAttrs->rxChannelIndex); MAP_uDMAChannelAttributeDisable(hwAttrs->rxChannelIndex, UDMA_ATTR_ALTSELECT); if (transaction->rxBuf) { channelControlOptions = dmaRxConfig[object->frameSize]; buf = transaction->rxBuf; } else { channelControlOptions = dmaNullConfig[object->frameSize]; buf = hwAttrs->scratchBufPtr; } MAP_uDMAChannelControlSet(hwAttrs->rxChannelIndex | UDMA_PRI_SELECT, channelControlOptions); MAP_uDMAChannelTransferSet(hwAttrs->rxChannelIndex | UDMA_PRI_SELECT, UDMA_MODE_BASIC, (void *)(hwAttrs->baseAddr + MCSPI_O_RX0), buf, transaction->count); /* Configure DMA for TX */ MAP_uDMAChannelAssign(hwAttrs->txChannelIndex); MAP_uDMAChannelAttributeDisable(hwAttrs->txChannelIndex, UDMA_ATTR_ALTSELECT); if (transaction->txBuf) { channelControlOptions = dmaTxConfig[object->frameSize]; buf = transaction->txBuf; } else { channelControlOptions = dmaNullConfig[object->frameSize]; *hwAttrs->scratchBufPtr = hwAttrs->defaultTxBufValue; buf = hwAttrs->scratchBufPtr; } MAP_uDMAChannelControlSet(hwAttrs->txChannelIndex | UDMA_PRI_SELECT, channelControlOptions); MAP_uDMAChannelTransferSet(hwAttrs->txChannelIndex | UDMA_PRI_SELECT, UDMA_MODE_BASIC, buf, (void *)(hwAttrs->baseAddr + MCSPI_O_TX0), transaction->count); DebugP_log1("SPI:(%p) DMA transfer enabled", hwAttrs->baseAddr); DebugP_log4("SPI: DMA transaction: %p, rxBuf: %p; txBuf: %p; Count: %d", (uintptr_t)transaction, (uintptr_t)transaction->rxBuf, (uintptr_t)transaction->txBuf, (uintptr_t)transaction->count); key = HwiP_disable(); MAP_uDMAChannelEnable(hwAttrs->rxChannelIndex); MAP_uDMAChannelEnable(hwAttrs->txChannelIndex); HwiP_restore(key); MAP_SPIWordCountSet(hwAttrs->baseAddr, transaction->count); }