我正在开发一个 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 传输而不是卡?
感谢您的帮助!
首先感谢您的回复。也许我应该更准确地提出我的问题:
- 根据我的理解,PC 必须有 DMA 控制器。如何访问此 DMA 控制器以开始传输到 PCIe 卡中的内存映射 IO 区域?
- 我们的规范要求 PC 的 DMA 控制器启动传输。但是,我只能找到设备执行 DMA 作业的示例(DMA_mapping.txt、LDD3 ch.15)。是否有一个原因,为什么没有人使用 PC 的 DMA 控制器(尽管它仍然有 DMA 通道)?请求对我们的项目进行规格变更会更好吗?
谢谢你的耐心。
查找 DMA_mapping.txt。其中有很长的一部分告诉您如何设置方向(“DMA 方向”,第 408 行)。
EDIT
好吧,既然你编辑了你的问题......你的规范是错误的。你could设置系统 DMA 控制器,但这毫无意义,因为它太慢了,正如我在评论中所说的那样。读这个线程 http://www.pcisig.com/reflector/msg01281.html.
您必须更改 FPGA 以支持总线主控。我以此为生 - 如果您想分包,请在线外联系我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)