阅读:1377回复:4
从模式DMA的设备地址空间怎么确定?9052工作于从模式DMA,用于输出数据,经查阅资料,基本了解了DMA的程序的流程,但资料以及driverstudio上的范例都是基于主控模式的,主控模式的DMA操作由设备发起,因此在创建传输对象时,只需要告诉设备的DMA控制寄存器目标存储器的地址和尺寸即可,不需要考虑设备本身的地址空间使用情况。 我希望做的是从模式DMA操作,而且是输出操作(MEM TO DEVICE)。我的设备上有好几个地址空间,而我希望的DMA操作是把数据输出到其的一个地址空间里,问题是该怎么告诉系统DMA控制器,卡上的地址空间的地址、偏移量和尺寸呢? 传输对象中只有一个MEM地址参数和数据方向参数,没办法定义卡的地址! 卡上的地址空间对象,也没有提供任何可以做系统地址转换的成员函数! |
|
|
沙发#
发布于:2002-11-29 09:05
如果你知道dma控制器的寄存器结构,实际上问题很简单,你只需要提供板卡的物理地址范围,这些地址完全可以通过配置寄存器获得.如果dma控制器的寄存器结构没有,只有抽象的最终接口函数,你就需要取得板卡的逻辑地址,9052SDK可以取得这些信,PlxPciBaseAddressGet就可以,另外也可以直接通过驱动获得,方法很多.
|
|
|
板凳#
发布于:2002-11-29 09:44
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于: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并不支持对映射寄存器的直接访问!! |
|
|
地下室#
发布于:2002-11-30 23:29
driverstudio我一般不用,对于很多和硬件非常相关的部分,我不喜欢用他们提供的框架.很多问题知道了具体的硬件结构就很容易解释.
现在的DMA控制器为解决逻辑地址和物理地址的映射问题,通常采用两种方法,一种是查找表的方法,将逻辑地址页(甚至可能不是计算机使用的逻辑地址,而是非常简单的0起始的一段逻辑空间)和物理地址页的对应关系制成一张表,DMA控制器会从连续的逻辑地址查找相应的物理地址进行传输,这种方式的缺陷就是传输的空间大,对应的表就大,典型的采用这种结构的DMA控制器就是SAA7146的还有一些显卡.这样所谓的映射寄存器就很容易理解了,就相当于查找表.表的具体访问办法和硬件设计有关,driverstudio很显然没有办法知道具体的结构. 另一种是Scatter/Gather DMA,采用的是一种链表结构的描述表,这种方法的优越性非常明显,当然也带来了硬件设计的复杂性增加,9054就使用这种结构.这时所谓的映射寄存器就不存在. 我这里使用过具有DMA控制器的PCI桥实现和另一块PCI板卡的数据传输,但没有使用系统DMA,如果DMA控制器在南桥,理论上说的确没有办法访问PCI板卡,但你看一下系统设备管理器,DMA控制器并不包含在南桥,这样显然是有可能访问PCI总线的,不过我没有用过,你可以尝试一下. |
|
|