我正在研究一个DMA例程,将数据从PC传输到PCIe卡上的FPGA。我读了DMA-API.txt和LDD3 ch。 15详情。但是,我无法弄清楚如何从PC到PCIe卡上的一致iomem块进行DMA传输。 LDD3中用于PCI的父样本映射缓冲区,然后告诉卡进行DMA传输,但我需要PC执行此操作。
我已经找到了:
请求总线主控
pci_set_master(pdev);
设置DMA掩码
if (dma_set_mask(&(pdev->dev), DMA_BIT_MASK(32))) {
dev_err(&pdev->dev,"No suitable DMA available.\n");
goto cleanup;
}
请求DMA通道
if (request_dma(dmachannel, DRIVER_NAME)) {
dev_err(&pdev->dev,"Could not reserve DMA channel %d.\n", dmachannel);
goto cleanup;
}
映射缓冲区以进行DMA传输
dma_handle = pci_map_single(pci_dev, buffer, count, DMA_TO_DEVICE);
问题:
为了让 PC 执行DMA传输而不是卡,我该怎么办?
感谢您的帮助!
首先感谢您的回复。也许我应该更准确地提出我的问题:
感谢您的耐心等待。
答案 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栏和地址完全取决于您的设备。
希望它有所帮助。祝你好运!