当前位置: 代码迷 >> 驱动开发 >> Pcie Dma传输数据,不建立DMA事务直接读取寄存器行吗?解决办法
  详细解决方案

Pcie Dma传输数据,不建立DMA事务直接读取寄存器行吗?解决办法

热度:1077   发布时间:2016-04-28 11:24:16.0
Pcie Dma传输数据,不建立DMA事务直接读取寄存器行吗?
本人才接触驱动,对于驱动基本是白痴一个。最近需要做一个Pcie驱动,需要用DMA方式来传输数据。


看了好多例子,发现在DMA传输时需要在驱动中建立DMA事务。
例如:首先 WdfDmaTransactionInitialize,然后 WdfDmaTransactionExecute,在EvtProgramDma函数中对寄存器进行读写,主要是把内存的物理地址写给寄存器的操作,然后等待中断,完成事务,释放。


我所疑惑的是,为什么要建立这个DMA事务呢?直接通过MmGetPhysicalAddress这个函数可以得到内存的物理地址,把它直接写给寄存器不行吗?为什么要EvtProgramDma 里面写呢?非要建立DMA事务吗? 既然在pcie设备加载的时候,我们已经取得的硬件基地址,直接读写不行吗?在FPGA里面能实现吗?


希望大侠帮忙解释一下, 谢谢啦

------解决方案--------------------
对设备来说,直接知道物理地址就可以进行DMA传输了。

但是,对Windows系统来说,DMA传输会复杂一些。很多时候,系统内核要进行物理地址和虚拟地址映射的。
------解决方案--------------------
探讨

为什么样建立DMA事务呢?和系统DMA控制器有关系吗?

------解决方案--------------------
探讨

为什么样建立DMA事务呢?和系统DMA控制器有关系吗?

------解决方案--------------------
Pcie设备用DMA方式来传输数据,可以分为DMA主设备与DMA从设备,这两种模式的工作方式不同。
这与你的硬件有关系,请先搞清楚硬件有没有DMA控制器。
------解决方案--------------------
XLINX 上的PCI-E IPCORE为物理硬核,且为ENDPOINT核,如果使用DMA与内存进行通信进行写数据,只能工作于MASTER状态。
------解决方案--------------------
如果是大规模数据传输 例如音频 都是要用DMA 的 可以降低CPU的负担 要不然你的系统能跑几个程序啊
------解决方案--------------------
许多设备都可以临时控制总线。这些设备可以执行涉及主内存和其他设备的数据传送。由于设备执行这些操作的过程中无需借助于 CPU,因此该类型的数据传送称为直接内存访问 (direct memory access, DMA)。可以执行的 DMA 传送类型如下:

两个设备之间

设备和内存之间

内存和内存之间

直接内存访问 (Direct Memory Access, DMA)

在基于框架的驱动程序中处理 DMA 操作
  相关解决方案