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.

[参考译文] Linux/PROCESSOR-SDK-AM437X:如何将 EDMA 用于定制器件?

Guru**** 2538950 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/606153/linux-processor-sdk-am437x-how-to-use-edma-for-custom-device

器件型号:PROCESSOR-SDK-AM437X

工具/软件:Linux

大家好、

我们通过 GPMC 总线集成了 FPGA 模块、并在使用 EDMA 将数据从 FPGA 复制到存储器时遇到了一些问题。

我们的器件应使用哪个 DMA 通道?

   请参阅 TRM 10.3.2、某些事件与特定模块绑定、因此我无法使用这些通道、我只能使用通道4等"保留"通道、对吧?

2.我已经使用 DMA 引擎 API 来使用 EDMA、如下所示:

bool fpga_dma_filter_fn (struct dma_chan *通道、void * param)

   int cha_id =*(unsigned int *) param;
   if (chan_id =chan->chan_id)
       返回 true;
 返回 false;

void dma_init()

  dma_cap_mask_t mask;

  DMA_CAP_ZERO (掩码);

  DMA_CAP_SET (DMA_SLAVE、MASK);

  unsigned int id = 4;

  gFpgaDmaChan = dma_request_channel (mask、fpga_dma_filter_fn、&id);

int fpga_dma_read (dma_addr_t dst、unsigned int len)

   struct dma_slave_config config;
   struct dma_async_tx_descriptor *desc;
   无符号长整型标志= DMA_CTRL_ACK | DMA_PRE_INTERRUPT;

   config.Direction = dma_dev_TO_MEM;
   config.dst_addr = dst;
   CONFIG.src_addr = FPGA_PHY_BASE + 6; --> 源地址
    CONFIG.src_addr_width = dma_slave_BUSWIDTH_2_bytes;
   config.dst_addr_width = dma_slave_BUSWIDTH_2_bytes;
   CONFIG.DST_maxburst = 16;
   CONFIG.src_maxburst = 16;
   dmaenginer_slave_config (gFpgaDmaChan、&config);

   DESC = dmaengineer_prep_slave_single (
       gFpgaDmaChan、dst、len、dma_dev_TO_MEM、flags);

   DESC->callback = FPGA_DMA_callback;
   dmaenginer_submit (desc);
   dma_async_issend_pending (gFpgaDmaChan);
   返回1;

void FPGA_TEST()

       dma_addr_t dest;
       char * ptr = dma_alloc_相干(NULL、1024、目标、GFP_DMA);
       memset (ptr、0x11、1024);
       FPGA_DMA_READ (dest、1024);
       mdelay (1000);
       对于(int i=0;i<33;i++){
           printk ("0x%x"、ptR[i]);
       }

当我调用 FPGA_TEST 时、我发现 DMA 仅复制第一 个 CONFIG.src_maxburst * CONFIG.src_addr_width = 16 * 2 = 32字节、PTR[32]和更高版本的元素保持默认值(0x11)。

如何调试此问题? 我是否正确使用了 DMA API?

谢谢!!!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有人可以帮助我解决这个问题吗? 谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    [引用 user="user4552302"]

    我们的器件应使用哪个 DMA 通道?

       请参阅 TRM 10.3.2、某些事件与特定模块绑定、因此我无法使用这些通道、我只能使用通道4等"保留"通道、对吧?

    [/报价]

    是否要将数据直接从外部 FPGA 芯片传输到 DDR3存储器? 如果是、则应使用 xdma_event_intrx 引脚和相应的 DMA_INTR_Pinx EDMA 事件。


    如果您首先将数据从 FPGA 传输到 GPMC、然后使用 EDMA 将数据从 GPMC 传输到 DDR3、则应使用 EDMA 事件52 (GPMC)。

    有关 EDMA API 用法的更多详细信息、请参阅以下指针:

    此致、
    帕维尔