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

时间:2013-04-19 11:45:42

标签: linux-kernel linux-device-driver fpga 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);
    
  2. 设置DMA掩码

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

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

    dma_handle = pci_map_single(pci_dev, buffer, count, DMA_TO_DEVICE);
    
  5. 问题:

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

    感谢您的帮助!


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

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

2 个答案:

答案 0 :(得分:4)

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

修改

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

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

答案 1 :(得分:1)

你所说的并不是真正的DMA。 DMA是指您的设备访问内存并且不涉及CPU本身(PC的内存控制器除外,它通常嵌入到PC的CPU中)。并非所有设备都能做到这一点,如果您使用的是FPGA,那么您的设计中肯定需要某种DMA控制器(即Expresso DMA Core或类似物)。在您的情况下,您只需使用ioremap_nocache调用(即iowrite)写入映射的内存区域(即使用iowrite32获得的内容区域),然后写入内存屏障{{1 }}。您必须写入的I / O栏和地址完全取决于您的设备。

希望它有所帮助。祝你好运!