lvhaow
驱动小牛
驱动小牛
  • 注册日期2001-10-31
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望35点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1377回复:4

从模式DMA的设备地址空间怎么确定?

楼主#
更多 发布于:2002-11-29 01:42

9052工作于从模式DMA,用于输出数据,经查阅资料,基本了解了DMA的程序的流程,但资料以及driverstudio上的范例都是基于主控模式的,主控模式的DMA操作由设备发起,因此在创建传输对象时,只需要告诉设备的DMA控制寄存器目标存储器的地址和尺寸即可,不需要考虑设备本身的地址空间使用情况。

我希望做的是从模式DMA操作,而且是输出操作(MEM TO DEVICE)。我的设备上有好几个地址空间,而我希望的DMA操作是把数据输出到其的一个地址空间里,问题是该怎么告诉系统DMA控制器,卡上的地址空间的地址、偏移量和尺寸呢?

传输对象中只有一个MEM地址参数和数据方向参数,没办法定义卡的地址!
卡上的地址空间对象,也没有提供任何可以做系统地址转换的成员函数!
lvhaow
jst7792
论坛版主
论坛版主
  • 注册日期2001-12-10
  • 最后登录2006-11-16
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-29 09:05
如果你知道dma控制器的寄存器结构,实际上问题很简单,你只需要提供板卡的物理地址范围,这些地址完全可以通过配置寄存器获得.如果dma控制器的寄存器结构没有,只有抽象的最终接口函数,你就需要取得板卡的逻辑地址,9052SDK可以取得这些信,PlxPciBaseAddressGet就可以,另外也可以直接通过驱动获得,方法很多.
兄弟们,给点分吧
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-11-29 09:44
用户被禁言,该主题自动屏蔽!
lvhaow
驱动小牛
驱动小牛
  • 注册日期2001-10-31
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望35点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-11-30 15:21
jst7792兄:
DIVERSTUDIO的驱动向导里,一旦设置总线类型为PCI,则下面的步骤里在指定资源时,DMA就不能设为从模式,相反,只有ISA或PNPISA类型的总线,才允许有从模式,这仅仅是因为DRIVERSTUDIO不能支持PCI总线的从DMA设计,还是因为PCI本身就不支持从模式的DMA呢?系统DMA控制器在哪里?HOST-PCI(北桥)还是PCI-ISA(南桥)?如果是南桥,不支持PCI就在所难免了!

好吧,先不谈支持与否。

DMA适配器对象中,包括有所谓\"映射寄存器\"用来作总线地址空间到CPU物理地址空间的地址映射,对于拥有主控能力的设备,这些寄存器是在设备的DMA控制器中硬件存在的,而对于没有主控能力的设备,这些寄存器则存在于CPU中(假如CPU中存在的话)或用软件模拟出来。

所谓\"映射寄存器\"用来作总线地址空间到CPU物理地址空间的地址映射,是否就是指DMA操作的源和目标地址的映射呢?
如果是,则拥有主控能力的设备,其硬件设备的地址空间地址,在设备内部就可以进行设置,因而只需要驱动程序提供做DMA操作的内存缓冲区地址即可。

而从模式的DMA操作,则必须由驱动程序(或其它方法)获得这个设备的地址空间地址,并通过代码设置\"映射寄存器\"的相应值,不知道我的理解对否?

如果我的理解正确,那么则应该找出适配器对象中的映射寄存器地址,并且要搞清楚其结构,然后置位,才能进行正确的DMA。--------DRIVERSTUDIO并不支持对映射寄存器的直接访问!!
lvhaow
jst7792
论坛版主
论坛版主
  • 注册日期2001-12-10
  • 最后登录2006-11-16
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-30 23:29
driverstudio我一般不用,对于很多和硬件非常相关的部分,我不喜欢用他们提供的框架.很多问题知道了具体的硬件结构就很容易解释.
现在的DMA控制器为解决逻辑地址和物理地址的映射问题,通常采用两种方法,一种是查找表的方法,将逻辑地址页(甚至可能不是计算机使用的逻辑地址,而是非常简单的0起始的一段逻辑空间)和物理地址页的对应关系制成一张表,DMA控制器会从连续的逻辑地址查找相应的物理地址进行传输,这种方式的缺陷就是传输的空间大,对应的表就大,典型的采用这种结构的DMA控制器就是SAA7146的还有一些显卡.这样所谓的映射寄存器就很容易理解了,就相当于查找表.表的具体访问办法和硬件设计有关,driverstudio很显然没有办法知道具体的结构.
另一种是Scatter/Gather DMA,采用的是一种链表结构的描述表,这种方法的优越性非常明显,当然也带来了硬件设计的复杂性增加,9054就使用这种结构.这时所谓的映射寄存器就不存在.
我这里使用过具有DMA控制器的PCI桥实现和另一块PCI板卡的数据传输,但没有使用系统DMA,如果DMA控制器在南桥,理论上说的确没有办法访问PCI板卡,但你看一下系统设备管理器,DMA控制器并不包含在南桥,这样显然是有可能访问PCI总线的,不过我没有用过,你可以尝试一下.
兄弟们,给点分吧
游客

返回顶部