首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux驱动程序DMA传输到以PC为主控的PCIe卡

Linux驱动程序DMA传输到以PC为主控的PCIe卡
EN

Stack Overflow用户
提问于 2013-04-19 11:45:41
回答 2查看 10.1K关注 0票数 8

我正在用DMA例程将数据从PC传送到PCIe卡上。我读了DMA-API.txt和LDD3 ch。15详细情况。然而,我想不出如何从PC到PCIe卡上的一致块进行DMA传输。LDD3中PCI的dad示例映射一个缓冲区,然后告诉卡执行DMA传输,但我需要PC来完成这个任务。

我已经发现:

  1. 请求总线主机 pci_set_master(pdev);
  2. 设置DMA掩码 如果(dma_set_mask(&(pdev->dev),DMA_BIT_MASK(32){ dev_err(&pdev->dev,“没有合适的DMA可用.\n”);去清理;}
  3. 请求DMA通道 如果(request_dma(dmachannel,DRIVER_NAME)) { dev_err(&pdev->dev )“无法保留DMA信道%d.\n",dmachannel);去清理;}
  4. 映射DMA传输的缓冲区 dma_handle = pci_map_single(pci_dev,缓冲器,计数,DMA_TO_DEVICE);

问题:

我要做什么才能让PC执行DMA传输而不是卡?

谢谢你的帮助!

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

  1. 据我理解,PC必须有DMA控制器。如何访问这个DMA控制器以启动到PCIe卡中的内存映射IO区域的传输?
  2. 我们的规范要求PC的DMA控制器启动传输。但是,我只能找到设备执行DMA工作的示例(DMA_mapping.txt,LDD3 ch.15)。为什么没有人使用PC的DMA控制器(它仍然有DMA通道)?请求对我们的项目进行规范更改会更好吗?

谢谢你的耐心。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-19 21:25:18

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

编辑

好吧既然你编辑了你的问题。你的规格不对。您可以设置系统DMA控制器,但这是没有意义的,因为它太慢了,正如我在评论中所说的。读这条线

您必须改变您的FPGA,以支持总线掌握。我这样做是为了谋生-如果你想转包的话,就跟我断线联系。

票数 5
EN

Stack Overflow用户

发布于 2013-04-19 12:48:44

你所说的并不是真正的DMA。DMA是指设备访问内存而CPU本身不涉及的时候(除了PC的内存控制器,它现在通常嵌入到PC的CPU中)。并不是所有的设备都能做到这一点,如果您正在使用FPGA,那么在您的设计中肯定需要某种DMA控制器(即Expresso DMA核或类似的)。在您的示例中,您只需使用ioremap_nocache调用(即iowrite32)向映射的内存区域(即您通过iowrite32获得的内存区域)写入,然后编写内存屏障wmb()。你要写什么I/O栏和地址完全取决于你的设备。

希望能帮上忙。祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16103872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档