// ========================================================================== // // Function Name: ConfigDMA // // Description: Configure DMA channel // // ========================================================================= static Result_t ConfigDMA ( UInt32 channel, UInt8 *start, UInt32 numBlocks, UInt32 blockSize, OSDAL_DMA_CLIENT dstClient, OSDAL_DMA_DWIDTH dataWidth, OSDAL_DMA_CALLBACK dmaCB) { OSDAL_Dma_Data dmaData; OSDAL_Dma_Buffer_List *cirBufList; OSDAL_Dma_Chan_Info chanInfo; UInt32 i=0; UInt8 *currPos=NULL; UInt8 *dstAddr=NULL; // Configure DMA channel //chanInfo.chanNumber = channel; //chanInfo.prot = 0; //chanInfo.srcID = OSDAL_DMA_CLIENT_MEMORY; //chanInfo.dstID = dstClient; chanInfo.type = OSDAL_DMA_FCTRL_MEM_TO_PERI;//_CTRL_PERI; // need to double check. chanInfo.srcBstSize = OSDAL_DMA_BURST_SIZE_64; // audio fifo spec chanInfo.dstBstSize = OSDAL_DMA_BURST_SIZE_64; chanInfo.srcDataWidth = dataWidth; chanInfo.dstDataWidth = dataWidth; chanInfo.incMode = OSDAL_DMA_INC_MODE_SRC; // mode_src chanInfo.xferCompleteCb = dmaCB; chanInfo.freeChan = FALSE; chanInfo.bCircular = TRUE; if(OSDAL_DMA_Config_Channel(channel, &chanInfo) != OSDAL_ERR_OK) { Log_DebugPrintf(LOGID_SOC_AUDIO, "ConfigDMA:: Error, Configure channel failed.\n"); return RESULT_ERROR; } switch (dstClient) { case OSDAL_DMA_CLIENT_AUDIO_OUT_FIFO: dstAddr = (UInt8 *) chal_audioaopath_getAFIFO_addr( NULL ); break; case OSDAL_DMA_CLIENT_POLYRING_OUT_FIFO: dstAddr = (UInt8 *) chal_audiopopath_getPFIFO_addr( NULL ); break; default: Log_DebugPrintf(LOGID_SOC_AUDIO, "ConfigDMA:: Error, Wrong destination client, dstClient = 0x%x.\n", dstClient); break; } cirBufList = (OSDAL_Dma_Buffer_List *)OSDAL_ALLOCHEAPMEM(numBlocks * sizeof(OSDAL_Dma_Buffer_List)); currPos = start; for (i = 0; i < numBlocks; i++) { cirBufList[i].buffers[0].srcAddr = (UInt32)currPos; cirBufList[i].buffers[0].destAddr = (UInt32)dstAddr; cirBufList[i].buffers[0].length = blockSize; cirBufList[i].buffers[0].bRepeat = 0; cirBufList[i].buffers[0].interrupt = 1; currPos += blockSize; } dmaData.numBuffer = numBlocks; dmaData.pBufList = (OSDAL_Dma_Buffer_List *)cirBufList; if(OSDAL_DMA_Bind_Data(channel, &dmaData) != OSDAL_ERR_OK) { Log_DebugPrintf(LOGID_SOC_AUDIO, "ConfigDMA:: Error, Add buffer failed.\n"); return RESULT_ERROR; } OSDAL_FREEHEAPMEM (cirBufList); return RESULT_OK; }
// ========================================================================== // // Function Name: ConfigDMA // // Description: Configure DMA channel // // ========================================================================= static Result_t ConfigDMA( UInt32 channel, UInt8 *start, UInt32 numBlocks, UInt32 blockSize, OSDAL_DMA_CLIENT srcClient, OSDAL_DMA_DWIDTH dataWidth, OSDAL_DMA_CALLBACK dmaCB) { OSDAL_Dma_Data dmaData; OSDAL_Dma_Buffer_List *cirBufList; OSDAL_Dma_Chan_Info chanInfo; UInt32 i=0; UInt8 *currPos = 0; UInt8 *srcAddr = 0; Log_DebugPrintf(LOGID_AUDIO, "ConfigDMA:: channel: 0x%x, numBlocks = 0x%x, blockSize = 0x%x\n", channel, numBlocks, blockSize); // Configure DMA channel //chanInfo.chanNumber = channel; //chanInfo.prot = 0; //chanInfo.srcID = srcClient; //chanInfo.dstID = DMA_CLIENT_MEMORY; chanInfo.type = OSDAL_DMA_FCTRL_PERI_TO_MEM; /* [email protected] 2012.07.03 begin */ //DMA issue:obtain semaphore timeout //CSP#523614 chanInfo.srcBstSize = OSDAL_DMA_BURST_SIZE_16; // audio fifo spec chanInfo.dstBstSize = OSDAL_DMA_BURST_SIZE_16; /* [email protected] 2012.07.03 end */ chanInfo.srcDataWidth = dataWidth; chanInfo.dstDataWidth = dataWidth; chanInfo.srcMaster = 0; chanInfo.dstMaster = 0; chanInfo.incMode = OSDAL_DMA_INC_MODE_DST; // mode_dst chanInfo.xferCompleteCb = dmaCB; chanInfo.freeChan = FALSE; chanInfo.bCircular = TRUE; if(OSDAL_DMA_Config_Channel(channel, &chanInfo) != OSDAL_ERR_OK) { Log_DebugPrintf(LOGID_AUDIO, "ConfigDMA:: Error, Configure channel failed.\n"); return RESULT_ERROR; } switch (srcClient) { case OSDAL_DMA_CLIENT_AUDIO_IN_FIFO: srcAddr = (UInt8 *) chal_audioaipath_getAFIFO_addr( NULL ); break; case OSDAL_DMA_CLIENT_AUDIO_WB_MIXERTAP: srcAddr = (UInt8 *) chal_audiomixertap_getAFIFO_addr( NULL ); break; default: Log_DebugPrintf(LOGID_AUDIO, "ConfigDMA:: Error, Wrong source client, srcClient = 0x%x.\n", srcClient); break; } cirBufList = (OSDAL_Dma_Buffer_List *)OSDAL_ALLOCHEAPMEM(numBlocks * sizeof(OSDAL_Dma_Buffer_List)); currPos = start; for (i = 0; i < numBlocks; i++) { cirBufList[i].buffers[0].srcAddr = (UInt32)srcAddr; cirBufList[i].buffers[0].destAddr = (UInt32)currPos; cirBufList[i].buffers[0].length = blockSize; cirBufList[i].buffers[0].bRepeat = 0; cirBufList[i].buffers[0].interrupt = 1; currPos += blockSize; } dmaData.numBuffer = numBlocks; dmaData.pBufList = (OSDAL_Dma_Buffer_List *)cirBufList; if(OSDAL_DMA_Bind_Data(channel, &dmaData) != OSDAL_ERR_OK) { Log_DebugPrintf(LOGID_AUDIO, "ConfigDMA:: Error, Add buffer failed.\n"); return RESULT_ERROR; } OSDAL_FREEHEAPMEM (cirBufList); return RESULT_OK; }