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

lurel 2011-12-05 10:28:03
本人才接触驱动,对于驱动基本是白痴一个。最近需要做一个Pcie驱动,需要用DMA方式来传输数据。


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


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


希望大侠帮忙解释一下, 谢谢啦
...全文
942 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
AnswerLJ 2011-12-27
  • 打赏
  • 举报
回复
利用PCIE的DMA在软件层次不需要知道非常多的PCIE细节,它也仅仅是利用了PCIE的读写通道以及PCIE传输过程中的一些保证链路可靠性的附加协议。DMA还是DMA。我跟你恰恰相反,我没有玩过单片机之类的东西,对于中断也只是概念上的,所以对于PCIE DMA的逻辑实现过程不清晰。DMA的过程应该都是根据自身的需求来自行定义的,其中涉及到一些寄存器的定义吧。只有这些窗口寄存器 是上位机给的,而真正的DMA过程中,肯定是 FPGA设备 获得 PCIE MASTERING之后,作为DMA的MASTER向上位机提供数据或者要求数据。这些窗口寄存器的功能定义是由系统功能需求 来定义的,这是简单的制定协议的过程。我现在的项目中这部分东西是缺失的,导致难度很大,对于一个没有经验的人来说,很容易产生BUG。。
AnswerLJ 2011-12-27
  • 打赏
  • 举报
回复
我跟你恰恰相反,我没怎么接触软件,所以对于PCIE DMA的整个逻辑流程 不清晰,有关DMA的PCIE设备 大多是经过PCIE MASTERING以后依靠需求来进行DMA传送,但是其中的很多初始化的寄存器都应该是自行定义的,而我现在的项目中这部分东西根本就没有。。不知道该如何着手
AnswerLJ 2011-12-27
  • 打赏
  • 举报
回复
我跟你恰恰相反,我没怎么接触软件,所以对于PCIE DMA的整个逻辑流程 不清晰,有关DMA的PCIE设备 大多是经过PCIE MASTERING以后依靠需求来进行DMA传送,但是其中的很多初始化的寄存器都应该是自行定义的,而我现在的项目中这部分东西根本就没有。。不知道该如何着手
lurel 2011-12-27
  • 打赏
  • 举报
回复
这几天CSDN账号一直被禁用,在单位一直无法重置密码,今天终于上来了,看来需要恶补一下PCIE知识啊,“AnswerLJ”网友说的好像是对的,我没怎么接触过硬件,还不太明白啊。
kingmax54212008 2011-12-24
  • 打赏
  • 举报
回复
许多设备都可以临时控制总线。这些设备可以执行涉及主内存和其他设备的数据传送。由于设备执行这些操作的过程中无需借助于 CPU,因此该类型的数据传送称为直接内存访问 (direct memory access, DMA)。可以执行的 DMA 传送类型如下:

两个设备之间

设备和内存之间

内存和内存之间

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

在基于框架的驱动程序中处理 DMA 操作
qq138243366 2011-12-23
  • 打赏
  • 举报
回复
如果是大规模数据传输 例如音频 都是要用DMA 的 可以降低CPU的负担 要不然你的系统能跑几个程序啊
sunriver2000 2011-12-23
  • 打赏
  • 举报
回复
这是不是和开发版有DMA控制器有关系?DMA传输到底是谁发起的呢?
1.有关系。2.由硬件ipcore发起,ipcore里有dma控制器
AnswerLJ 2011-12-22
  • 打赏
  • 举报
回复
如果你使用的是xlinx DEMO PCI-E DMA的话,里面是包含了DMA软核程序的。
AnswerLJ 2011-12-22
  • 打赏
  • 举报
回复
XLINX 上的PCI-E IPCORE为物理硬核,且为ENDPOINT核,如果使用DMA与内存进行通信进行写数据,只能工作于MASTER状态。
AnswerLJ 2011-12-22
  • 打赏
  • 举报
回复
没有建立DMA的通信速率会很低,这并不影响正常工作。但是速率会非常低。大规模的数据不用DMA方式传送是非常麻烦的。
eraser2011 2011-12-21
  • 打赏
  • 举报
回复
数据准备好后
由发送方程序发起DMA传输
接收方接到DMA中断后
处理相关数据。
lurel 2011-12-20
  • 打赏
  • 举报
回复
我测试了一下,用xilinx的spartan6 fpga的开发板,直接将物理地址直接付给寄存器,fpga填充了数据,并没有建立DMA事务,能供正常工作。

我还测试在驱动层了建立DMA事务,结果也能正常工作。

这是不是和开发版有DMA控制器有关系?DMA传输到底是谁发起的呢?
sunriver2000 2011-12-15
  • 打赏
  • 举报
回复
Pcie设备用DMA方式来传输数据,可以分为DMA主设备与DMA从设备,这两种模式的工作方式不同。
这与你的硬件有关系,请先搞清楚硬件有没有DMA控制器。
woshi_ziyu 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lurel 的回复:]

为什么样建立DMA事务呢?和系统DMA控制器有关系吗?
[/Quote]
许多设备都可以临时控制总线。这些设备可以执行涉及主内存和其他设备的数据传送。由于设备执行这些操作的过程中无需借助于 CPU,因此该类型的数据传送称为直接内存访问 (direct memory access, DMA)。可以执行的 DMA 传送类型如下:

两个设备之间

设备和内存之间

内存和内存之间

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

在基于框架的驱动程序中处理 DMA 操作
eraser2011 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lurel 的回复:]

为什么样建立DMA事务呢?和系统DMA控制器有关系吗?
[/Quote]
你的驱动要想操作PCIe总线
都要调用总线驱动和系统服务
创建Adapter,就是向系统申请总线DMA的使用权和资源
包括地址映射
不可能让你直接操作硬件地址!
曹大夯 2011-12-06
  • 打赏
  • 举报
回复
对设备来说,直接知道物理地址就可以进行DMA传输了。

但是,对Windows系统来说,DMA传输会复杂一些。很多时候,系统内核要进行物理地址和虚拟地址映射的。
lurel 2011-12-06
  • 打赏
  • 举报
回复
论坛这么冷清,没人出来帮忙解释一下吗?
lurel 2011-12-06
  • 打赏
  • 举报
回复
为什么样建立DMA事务呢?和系统DMA控制器有关系吗?

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧