TI论坛
直播中

陈衡毅

7年用户 200经验值
私信 关注

dm365 dvsdk4里面edma例子的问题

本帖最后由 一只耳朵怪 于 2018-6-22 11:13 编辑

我程序里面需要用到edma,但在看dm365 dvsdk4里面的edma例子时有个地方不明白,请专家指点:
例子是psp里面linuxutil里面的edma例子,edma_test.c里面函数
  1. int edma3_memtomemcpytest_dma(int acnt, int bcnt, int ccnt, int sync_mode,
  2.          int event_queue)
  3. [
  4. int result = 0;
  5. unsigned int dma_ch = 0;
  6. int i;
  7. int count = 0;
  8. unsigned int Istestpassed = 0u;
  9. unsigned int numenabled = 0;
  10. unsigned int BRCnt = 0;
  11. int srcbidx = 0;
  12. int de***idx = 0;
  13. int srccidx = 0;
  14. int descidx = 0;
  15. struct edmacc_param param_set;
  16. /* Initalize source and destination buffers */
  17. for (count = 0u; count < (acnt * bcnt * ccnt); count++) [
  18.   dmabufsrc1[count] = 'A' + (count % 26);
  19.   dmabufdest1[count] = 0;
  20. ]
  21. /* Set B count reload as B count. */
  22. BRCnt = bcnt;
  23. /* Setting up the SRC/DES Index */
  24. srcbidx = acnt;
  25. de***idx = acnt;
  26. /* A Sync Transfer Mode */
  27. srccidx = acnt;
  28. descidx = acnt;
  29. dma_ch = edma_alloc_channel(EDMA_CHANNEL_ANY, callback1, NULL,
  30.    event_queue);

  31. printk("edma3_memtomemcpytest_dma::dma_ch is %dn", dma_ch);
  32. if (dma_ch < 0) [
  33.   DMA_PRINTK
  34.       ("nedma3_memtomemcpytest_dma::edma_alloc_channel failed for dma_ch, error:%dn",
  35.        dma_ch);
  36.   return dma_ch;
  37. ]
  38. edma_set_src(dma_ch, (unsigned long)(dmaphyssrc1), INCR, W8BIT);
  39. edma_set_dest(dma_ch, (unsigned long)(dmaphysdest1), INCR, W8BIT);
  40. edma_set_src_index(dma_ch, srcbidx, srccidx);
  41. edma_set_dest_index(dma_ch, de***idx, descidx);
  42. /*上面输入参数acnt=512,bcnt=8,ccnt=8,我的问题是
  43. 不明白为什么这里srccidx等于acnt,我查edma_set_src_index的函数解释是
  44. edma_set_src_index - configure DMA source address indexing  
  45. @slot: parameter RAM slot being configured  
  46. @src_bidx: byte offset between source arrays in a frame  
  47. @src_cidx: byte offset between source frames in a block  
  48. src_cidx即块中frame间的字节偏移,我觉得应该是acnt*bcnt才对,怎么会是acnt呢?
  49. 是不是因为下面红字处的edma_start在for循环中要运行bcnt * ccnt次,所以这里每次就传512字节,所以src_cidx和src_cidx都设置成了acnt*/

  50. /* A Sync Transfer Mode */
  51. edma_set_transfer_params(dma_ch, acnt, bcnt, ccnt, BRCnt, ASYNC);
  52. /* Enable the Interrupts on Channel 1 */
  53. edma_read_slot(dma_ch, ¶m_set);
  54. param_set.opt |= (1 << ITCINTEN_SHIFT);
  55. param_set.opt |= (1 << TCINTEN_SHIFT);
  56. param_set.opt |= EDMA_TCC(EDMA_CHAN_SLOT(dma_ch));
  57. edma_write_slot(dma_ch, ¶m_set);
  58. numenabled = bcnt * ccnt;
  59. for (i = 0; i < numenabled; i++) [
  60.   irqraised1 = 0;
  61.   /* Now enable the transfer as many times as calculated above. */
  62.   result = edma_start(dma_ch);
  63.   if (result != 0) [
  64.    DMA_PRINTK
  65.        ("edma3_memtomemcpytest_dma: edma_start failed n");
  66.    break;
  67.   ]
  68.   /* Wait for the Completion ISR. */
  69.   while (irqraised1 == 0u) ;
  70.   /* Check the status of the completed transfer */
  71.   if (irqraised1 < 0) [
  72.    /* Some error occured, break from the FOR loop. */
  73.    DMA_PRINTK("edma3_memtomemcpytest_dma: "
  74.        "Event Miss Occured!!!n");
  75.    break;
  76.   ]
  77. ]
  78. if (0 == result) [
  79.   for (i = 0; i < (acnt * bcnt * ccnt); i++) [
  80.    if (dmabufsrc1 != dmabufdest1) [
  81.     DMA_PRINTK
  82.         ("n edma3_memtomemcpytest_dma: Data write-read matching failed at = %un",
  83.          i);
  84.     Istestpassed = 0u;
  85.     result = -1;
  86.     break;
  87.    ]
  88.   ]
  89.   if (i == (acnt * bcnt * ccnt)) [
  90.    Istestpassed = 1u;
  91.   ]
  92.   edma_stop(dma_ch);
  93.   edma_clean_channel(dma_ch);
  94.   edma_free_slot(dma_ch);
  95.   edma_free_channel(dma_ch);
  96. ]
  97. if (Istestpassed == 1u) [
  98.   DMA_PRINTK
  99.       ("nedma3_memtomemcpytest_dma: EDMA Data Transfer Successfull n");
  100. ] else [
  101.   DMA_PRINTK
  102.       ("nedma3_memtomemcpytest_dma: EDMA Data Transfer Failed n");
  103. ]
  104. return result;
  105. ]

谢谢专家!期待您的指导!

回帖(1)

殷晓婷

2018-6-22 03:19:30
参见 DM365 data sheet, Chapter "EDMA" section "Functional Description", "Types of EDMA3 transfers",  "A synchronized transfer", 由图可见在A-synchronous transfer中,为了实现frame 的连续传输需要使 cidx = bidx.
举报

更多回帖

发帖
×
20
完善资料,
赚取积分