阅读:2475回复:3
Pcie Dma传输数据,不建立DMA事务直接读取寄存器行吗?
本人才接触驱动,对于驱动基本是白痴一个。最近需要做一个PCIE驱动,需要用DMA方式来传输数据。
看了好多例子,发现在DMA传输时需要在驱动中建立DMA事务。 例如:首先 WdfDmaTransactionInitialize,然后 WdfDmaTransactionExecute,在EvtProgramDma函数中对寄存器进行读写,主要是把内存的物理地址写给寄存器的操作,然后等待中断,完成事务,释放。[list=1] 我所疑惑的是,为什么要建立这个DMA事务呢?直接通过MmGetPhysicalAddress这个函数可以得到内存的物理地址,把它直接写给寄存器不行吗?为什么要EvtProgramDma 里面写呢?非要建立DMA事务吗? 既然在pcie设备加载的时候,我们已经取得的硬件基地址,直接读写不行吗? 希望大侠帮忙解释一下, 谢谢啦 |
|
沙发#
发布于:2012-05-06 11:20
要建立DMA事务,DMA 和普通通信模式不一样,DMA通信前必须向DMA从设备(也就是你的PCIE板卡的DMA控制器)中写入DMA读写基地址和读写数据长度以及中断允许,这样之后DMA传输就不用向普通通信时发送一次地址传一次数据而是连续向你的PC机传送数据了;而普通的通信模式你可以不必提前写入基址,用的时候再穿过去就行但是要发送一次地址传一次数据。不知道解答了你的疑惑没。
|
|
板凳#
发布于:2013-05-16 01:12
直接给DMA读写基地址寄存器和读写数据长度寄存器写值,然后直接操作寄存器启动DMA,行不行?
|
|
|
地板#
发布于:2013-06-11 10:51
直接写寄存器,启动dma也是可以,前提是你有物理地址连续的buffer。建立dma事务,主要是方便scatter &gather。
|
|