繁体   English   中英

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

[英]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才能执行此操作。

我已经发现了什么:

  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); 

题:

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

谢谢你的帮助!


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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM