[英]Linux driver DMA transfer to a PCIe card with PC as master
我正在研究一个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传输而不是卡,我该怎么办?
谢谢你的帮助!
首先感谢您的回复。 也许我应该更准确地提出我的问题:
谢谢你的耐心。
查找DMA_mapping.txt。 那里有一个很长的部分告诉你如何设置方向('DMA方向',第408行)。
编辑
好的,既然您编辑了问题......您的规范是错误的。 您可以设置系统DMA控制器,但它没有意义,因为它太慢了,正如我在评论中所说的那样。 阅读这个主题 。
您必须更改FPGA以支持总线主控。 我这样做是为了生活 - 如果你想分包,请联系我。
你所说的并不是真正的DMA。 DMA是指您的设备访问内存并且不涉及CPU本身(PC的内存控制器除外,它通常嵌入到PC的CPU中)。 并非所有设备都可以做到这一点,如果您使用的是FPGA,那么您的设计中肯定需要某种DMA控制器(即Expresso DMA Core或类似设备)。 在你的情况,你只需要写入映射的内存区域(即你获得即,一个ioremap_nocache
使用) iowrite
电话(即iowrite32
),其次是写内存屏障wmb()
您必须写入的I / O栏和地址完全取决于您的设备。
希望能帮助到你。 祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.