这个功能是使用edma3对McASP的数据搬运,edma channel9作为数据传输通道(ACNT=8 BCNT=2 CCNT=1 ABSYNC),任意SLOT作为channel9 edma事件完成后 reload PaRAM并且link to channel9 PaRAM.当前测试结果是只能进行一次edma数据搬运,能够读取16bytes并且正确,但无法进行link transfer 的循环读取,请问问题出在哪里? 我的代码如下:
1. 分配dma空间
mcaspadc_dev->putIbuff = dma_alloc_coherent (NULL, MAX_DMA_TRANSFER_IN_BYTES, &(mcaspadc_dev->r_dma_Iping), GFP_DMA);
mcaspadc_dev->getIbuff= dma_alloc_coherent (NULL, MAX_DMA_TRANSFER_IN_BYTES, &(mcaspadc_dev->r_dma_Ipong), GFP_DMA);
2. 分配 channle和slot 并对其PaRAM进行配置
edma_mcasp_chn1 = edma_alloc_channel(EDMA3_CHA_MCASP0_RX,mcasp_callback_rxedma,NULL,EVENTQ_0);
..........
PONG_CH = edma_alloc_slot(0,EDMA_SLOT_ANY);//EDMA_SLOT_ANY
/* Create the default PaRAM Set */
paramSet.srcAddr = (unsigned int) (AM335X_MCASP0_Data); //0x46000000
paramSet.destAddr = (unsigned int) mcaspadc_dev->r_dma_Iping;
paramSet.aCnt = 8;
paramSet.bCnt = 2;
paramSet.cCnt = 1;
paramSet.srcBIdx = 0;
paramSet.destBIdx = 8;
paramSet.srcCIdx = 0;
paramSet.destCIdx = 16;
paramSet.linkAddr = 0x4000+(PONG_CH * SIZE_PARAMSET);
paramSet.bCntReload = 1;// only for ASYNC
paramSet.opt |= EDMA_TCC(EDMA_CHAN_SLOT(edma_mcasp_chn1));
paramSet.opt |= (1u << TCINTEN_SHIFT);
paramSet.opt |= (1u << ITCINTEN_SHIFT);
paramSet.opt |= (1u << EDMA3CC_OPT_SYNCDIM_SHIFT); //ABSYNC
EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, edma_mcasp_chn1, ¶mSet);
//slot configuration
paraSet其它参数值与channel9一致,区别仅在于linkAddr
paramSet.linkAddr = 0x4000+(edma_mcasp_chn1 * SIZE_PARAMSET);
EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, PONG_CH, ¶mSet);
3. edma channel的回调函数mcasp_callback_rxedma 此函数只进行数据搬运。