void setup_edma_loop(edma_loop_setup_t *loopSetup) { #if 0 #if (defined(__ICCARM__) || defined(__CC_ARM)) loopSetup->dmaChStcd = (edma_software_tcd_t *)mem_align(2 * sizeof(edma_software_tcd_t) * loopSetup->period, 32); #elif defined(__GNUC__) loopSetup->dmaChStcd = (edma_software_tcd_t *)memalign(32, 2 * sizeof(edma_software_tcd_t) * loopSetup->period); #endif #endif loopSetup->dmaChStcd = (edma_software_tcd_t *)(((uint32_t)ptcd + 32)& 0xFFFFFFE0); //printf(" eDMA TCD address is %x, them\r\n", (uint32_t)loopSetup->dmaChStcd); memset(loopSetup->dmaChStcd, 0, sizeof(edma_software_tcd_t)); EDMA_DRV_RequestChannel(loopSetup->dmaChanNum, loopSetup->chSource, loopSetup->dmaCh); EDMA_DRV_ConfigLoopTransfer(loopSetup->dmaCh, loopSetup->dmaChStcd, loopSetup->type, loopSetup->srcAddr, loopSetup->destAddr, loopSetup->size, loopSetup->watermark, loopSetup->length, loopSetup->period); if(loopSetup->dmaCallBack != NULL) { EDMA_DRV_InstallCallback(loopSetup->dmaCh, loopSetup->dmaCallBack, loopSetup->dmaCh); } }
/*FUNCTION********************************************************************** * * Function Name : SND_RxConfigDataFormat * Description : Configure the audio file format in rx soundcard. * The soundcard includes a controller and a codec. The audio format includes * sample rate, bit length and so on. *END**************************************************************************/ snd_status_t SND_RxConfigDataFormat(sound_card_t *card, ctrl_data_format_t *format) { audio_controller_t *ctrl = &card->controller; audio_codec_t *codec = &card->codec; ctrl->ops->Ctrl_RxConfigDataFormat(ctrl->instance, format); codec->ops->Codec_ConfigDataFormat(codec->handler, format->mclk, format->sample_rate, format->bits); /* Configure dma */ #if USEDMA audio_buffer_t *buffer = &card->buffer; uint8_t sample_size = format->bits/8; uint32_t watermark = ctrl->ops->Ctrl_RxGetWatermark(ctrl->instance); if((sample_size == 3) || (format->bits & 0x7)) { sample_size = 4; } uint32_t * desAddr = ctrl->ops->Ctrl_RxGetFifoAddr(ctrl->instance,ctrl->fifo_channel); EDMA_DRV_ConfigLoopTransfer( &ctrl->dma_channel, ctrl->stcd, kEDMAPeripheralToMemory, (uint32_t)desAddr, (uint32_t)buffer->buff, sample_size, sample_size * watermark, AUDIO_BUFFER_SIZE, AUDIO_BUFFER_BLOCK); EDMA_DRV_StartChannel(&ctrl->dma_channel); #endif return kStatus_SND_Success; }
void setup_edma_loop(edma_loop_setup_t *loopSetup) { memset(loopSetup->dmaChStcd, 0, sizeof(edma_software_tcd_t)); EDMA_DRV_RequestChannel(loopSetup->dmaChanNum, loopSetup->chSource, loopSetup->dmaCh); EDMA_DRV_ConfigLoopTransfer(loopSetup->dmaCh, loopSetup->dmaChStcd, loopSetup->type, loopSetup->srcAddr, loopSetup->destAddr, loopSetup->size, loopSetup->watermark, loopSetup->length, loopSetup->period); if(loopSetup->dmaCallBack != NULL) { EDMA_DRV_InstallCallback(loopSetup->dmaCh, loopSetup->dmaCallBack, loopSetup->dmaCh); } }