lurel
驱动牛犊
驱动牛犊
  • 注册日期2011-12-04
  • 最后登录2011-12-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2475回复:3

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

楼主#
更多 发布于:2011-12-05 10:28
 本人才接触驱动,对于驱动基本是白痴一个。最近需要做一个PCIE驱动,需要用DMA方式来传输数据。


看了好多例子,发现在DMA传输时需要在驱动中建立DMA事务。
例如:首先 WdfDmaTransactionInitialize,然后 WdfDmaTransactionExecute,EvtProgramDma函数中对寄存器进行读写,主要是把内存的物理地址写给寄存器的操作,然后等待中断,完成事务,释放。[list=1]
我所疑惑的是,为什么要建立这个DMA事务呢?直接通过MmGetPhysicalAddress这个函数可以得到内存的物理地址,把它直接写给寄存器不行吗?为什么要EvtProgramDma 里面写呢?非要建立DMA事务吗? 既然在pcie设备加载的时候,我们已经取得的硬件基地址,直接读写不行吗?


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

springmydriver
驱动牛犊
驱动牛犊
  • 注册日期2012-04-24
  • 最后登录2012-05-09
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望41点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2012-05-06 11:20
要建立DMA事务,DMA 和普通通信模式不一样,DMA通信前必须向DMA从设备(也就是你的PCIE板卡的DMA控制器)中写入DMA读写基地址和读写数据长度以及中断允许,这样之后DMA传输就不用向普通通信时发送一次地址传一次数据而是连续向你的PC机传送数据了;而普通的通信模式你可以不必提前写入基址,用的时候再穿过去就行但是要发送一次地址传一次数据。不知道解答了你的疑惑没。
cecily
驱动牛犊
驱动牛犊
  • 注册日期2004-08-04
  • 最后登录2013-05-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望86点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2013-05-16 01:12
直接给DMA读写基地址寄存器和读写数据长度寄存器写值,然后直接操作寄存器启动DMA,行不行?
我不是你的天使,我不懂你的天堂
principal
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2014-02-12
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望62点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2013-06-11 10:51
直接写寄存器,启动dma也是可以,前提是你有物理地址连续的buffer。建立dma事务,主要是方便scatter &gather。
游客

返回顶部