Linux驱动程序DMA传输到PCIe卡,PC作为主设备

koh*_*hpe 7 fpga linux-device-driver linux-kernel dma pci-e

我正在研究一个DMA例程,将数据从PC传输到PCIe卡上的FPGA.我读了DMA-API.txt和LDD3 ch.15详情.但是,我无法弄清楚如何从PC到PCIe卡上的一致iomem块进行DMA传输.LDD3中用于PCI的父样本映射缓冲区,然后告诉卡进行DMA传输,但我需要PC才能执行此操作.

我已经发现了什么:

  1. 请求总线主站

    pci_set_master(pdev);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 设置DMA掩码

    if (dma_set_mask(&(pdev->dev), DMA_BIT_MASK(32))) {
        dev_err(&pdev->dev,"No suitable DMA available.\n");
        goto cleanup;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 请求DMA通道

    if (request_dma(dmachannel, DRIVER_NAME)) {
        dev_err(&pdev->dev,"Could not reserve DMA channel %d.\n", dmachannel);
        goto cleanup;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 映射缓冲区以进行DMA传输

    dma_handle = pci_map_single(pci_dev, buffer, count, DMA_TO_DEVICE);
    
    Run Code Online (Sandbox Code Playgroud)

题:

为了让PC执行DMA传输而不是卡,我该怎么办?

谢谢你的帮助!


首先感谢您的回复.也许我应该更准确地提出我的问题:

  1. 据我所知,PC必须有一个DMA控制器.如何访问此DMA控制器以开始传输到PCIe卡中的内存映射IO区域?
  2. 我们的规范要求PC的DMA控制器启动传输.但是,我只能找到设备执行DMA作业的示例(DMA_mapping.txt,LDD3 ch.15).有没有理由,为什么没有人使用PC的DMA控制器(它仍然有DMA通道)?请求为我们的项目更改规范是否更好?

谢谢你的耐心.

EML*_*EML 5

查找 DMA_mapping.txt。那里有一个很长的部分告诉您如何设置方向(“DMA 方向”,第 408 行)。

编辑

好的,既然你编辑了你的问题......你的规范是错误的。您可以设置系统 DMA 控制器,但这毫无意义,因为它太慢了,正如我在评论中所说的那样。阅读此主题

您必须更改 FPGA 以支持总线主控。我这样做是为了谋生 - 如果您想分包,请与我联系。