Linux 驱动 PCI 突发传输

标签 linux driver

我有一个关于在 PCIe 上使用突发读写的问题。我有一个 fpga,它通过 PCIe 连接到 cpu。我有一个简单的驱动程序,仅用于测试。驱动程序向 FPGA 写入数据以及从 FPGA 读取数据。 fpga 包括一个 sram 核心,可在其中写入和读取数据。读取和写入工作正常,但如果我从设备读取,则不会出现突发情况。如果我将数据写入 fpga,如果我使用 ioremap_wc() 映射 BAR,则突发工作良好。但是如果我从fpga读取,CPU只会进行单次访问而不会突发。我发现我必须将内存标记为回写,以便能够缓存读取和写入传输的数据,但是如果我使用/proc/mtrr 将地址标记为回写,则读取和写入时不会出现突发。 PCI header 中的 BAR 被标记为可预取。你们中有人知道如何在 pci 总线上实现突发读写吗?我希望任何人都可以帮助我。

最佳答案

在 PICe 总线上实现突发传输的最佳方法是使用 DMA Controller 而不是处理器 I/O。如果您的 FPGA 是 PCIe 总线主控,您可以对其进行编程以传输数据。除此之外,大多数平台都内置有 DMA Controller 。

我希望写入组合能够执行与未缓存相同的读取操作。但即使您使用 ioremap_cache(),您的平台也可能不会突发 PIO 读取。它可能取决于您的处理器、执行读取的指令和系统逻辑。

关于Linux 驱动 PCI 突发传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16595280/

相关文章:

c - 请求 ProcessBasicInformation 时 ZwQueryInformationProcess 出现奇怪的行为

windows - 24 位 USB 采样率支持

c - 等待信号,然后继续执行

c - read_un/lock(&tasklist_lock) 的意义

php - 当 PHP 脚本通过/user/bin/php 运行时,Error_log 不起作用

network-programming - pci_alloc_consistent 和 dma_alloc_coherent 之间的区别

linux - 如何自动化多个服务器的 scp ?

linux - "nothing to commit (working directory clean)"添加文件夹时

linux - 如何从 panic 中定位错误

java - 驱动程序可执行文件不存在 : Selenium Firefox