-->

Linux驱动程序DMA传输到PCIe卡与PC机作为主(Linux driver DMA trans

2019-08-31 13:28发布

我在DMA日常工作将数据从PC传送到FPGA中的PCIe卡上。 我读DMA-API.txt和LDD3通道。 15的详细资料。 然而,我无法弄清楚如何做从PC DMA传输IOMEM的PCIe卡上的一致块。 在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); 

题:

我有什么为了让电脑执行DMA传输,而不是办卡?

感谢您的帮助!


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

  1. 在我的理解的PC必须有一个DMA控制器。 我如何进入这个DMA控制器开始转移到PCIe卡映射IO区上的内存?
  2. 我们的规范要求,该PC的DMA控制器启动传输。 但是,我只能找到例子,其中设备会做DMA工作(DMA_mapping.txt,LDD3 ch.15)。 是否有一个原因,为什么没有人使用PC的DMA控制器(它仍然有DMA通道,虽然)? 它会更好,请求我们的项目规格改变?

谢谢你的耐心。

Answer 1:

查找DMA_mapping.txt。 那里面有长款,告诉你如何设置方向(“DMA方向”,行408)。

编辑

好吧,既然你编辑你的问题......你的规格是错误的。 你可以设置系统DMA控制器,但它是没有意义的,因为它的速度太慢,因为我在评论中说。 阅读此线程 。

你必须改变你的FPGA,支持总线主控。 我做这行吃饭 - 如果你想分包联系我脱线。



Answer 2:

你所谈论的是不是一个真正的DMA。 DMA是当你的设备访问内存和CPU本身并不参与(与PC机的内存控制器,它通常是嵌入到PC的CPU,这些天的除外)。 并非所有设备都可以做到这一点,如果你正在使用FPGA,那么你一定需要某种形式的DMA控制器的设计(即快报DMA核心或类似)。 在你的情况,你只需要写入映射的内存区域(即你获得即,一个ioremap_nocache使用) iowrite电话(即iowrite32 ),其次是写内存屏障wmb() 什么I / O栏和地址你必须写完全取决于你的设备上。

希望能帮助到你。 祝好运!



文章来源: Linux driver DMA transfer to a PCIe card with PC as master