This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM3352 的EDMA link transfer不能循环传输数据,问题出在哪里?



 

这个功能是使用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, &paramSet);     

 

 

  //slot configuration  

  paraSet其它参数值与channel9一致,区别仅在于linkAddr

   paramSet.linkAddr = 0x4000+(edma_mcasp_chn1 * SIZE_PARAMSET);   

 EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, PONG_CH, &paramSet);         

 

 

 3. edma channel的回调函数mcasp_callback_rxedma    此函数只进行数据搬运。