阅读:1769回复:10
NT,WDM和DriverWorks分别如何确定PCI设备的几块大小相同memory资源?
我现在遇到一个棘手的问题(也是比较初级的问题),我的一个PCI板块上(使用PLx 9030)有三块相同大小的memory(分别使用PCIBAR2,PCIBAR3,PCIBAR4在PCI总线上区分开)要供访问。
我看了Walty Oney的书Progamming WDM,他好像说必须自己设法将相同类型的资源区别开(可怜他老人家举的一个例子对我不适用,我这儿恰恰是大小相同的memory),可是我除了知道它们的PCIBAR不同外,其余一无所知。我不知道PCIBAR在这三种开发方式中都是如何提示给开发者的。 我眼下是用Driverworks做开发,我一点都不知道这个工具给我创建的几块内存是如何一一对应我的PCI设备上的物理内存的! 请明白人告知。急急急! 如果嫌文字罗嗦,可以给我打电话:68748088分机8473 |
|
最新喜欢:mapofl |
沙发#
发布于:2001-09-14 12:22
使用DS提供的KMemory类分别映射成三个内存区不就得了。
|
|
|
板凳#
发布于:2001-09-14 18:07
老哥,我问的正是这个三个KMemoryRange是如何对应我的PCI卡的三个不同区域的,不然我怎么知道我在访问哪一块?张冠李戴不是很很悲惨吗?
|
|
地板#
发布于:2001-09-14 19:46
你在初始化KMemoryRange变量时,你不就知道哪个对应哪个了吗?
|
|
|
地下室#
发布于:2001-09-17 11:52
我恰恰就是不知道哪个对应哪个?我不知道Driverworks是如何处理这个问题的,这正是我的问题所在!请告诉我!
如下是Driverworks为我初始化的代码: status = m_MemoryRange0.Initialize( pResListTranslated, pResListRaw, PciConfig.BaseAddressIndexToOrdinal(0) ); if (!NT_SUCCESS(status)) { Invalidate(); return status; } status = m_MemoryRange1.Initialize( pResListTranslated, pResListRaw, PciConfig.BaseAddressIndexToOrdinal(0) ); if (!NT_SUCCESS(status)) { Invalidate(); return status; } status = m_MemoryRange2.Initialize( pResListTranslated, pResListRaw, PciConfig.BaseAddressIndexToOrdinal(0) ); if (!NT_SUCCESS(status)) { Invalidate(); return status; } status = m_MemoryRange3.Initialize( pResListTranslated, pResListRaw, PciConfig.BaseAddressIndexToOrdinal(0) ); if (!NT_SUCCESS(status)) { Invalidate(); return status; } 我从这段代码及其调用的成员函数解释中找不到线索。 |
|
5楼#
发布于:2001-09-17 20:06
将PciConfig.BaseAddressIndexToOrdinal(0) 改成PciConfig.BaseAddressIndexToOrdinal(2)
PciConfig.BaseAddressIndexToOrdinal(3) PciConfig.BaseAddressIndexToOrdinal(4) 分别对应m_MemoryRange0,m_MemoryRange1,m_MemoryRange3。不就行了。 |
|
|
6楼#
发布于:2001-09-18 15:45
谢谢你的答复,我似乎明白了。我想从你那儿确认一下:是不是
PciConfig.BaseAddressIndexToOrdinal(0), PciConfig.BaseAddressIndexToOrdinal(1) PciConfig.BaseAddressIndexToOrdinal(2) PciConfig.BaseAddressIndexToOrdinal(3) PciConfig.BaseAddressIndexToOrdinal(4) PciConfig.BaseAddressIndexToOrdinal(5) 分别对应着PCI规范中的 PCIBAR0, PCIBAR1, PCIBAR2, PCIBAR3, PCIBAR4, PCIBAR5 ? 我一直不明白的就是BaseAddressIndexToOrdinal(0)具体指的是什么? 另外,WDM是在初始化一块PCI内存空间时,基地址号是如何显示给编程者的? |
|
7楼#
发布于:2001-09-18 20:09
[QUOTE]原本由 gazelle 发表
[B] 谢谢你的答复,我似乎明白了。我想从你那儿确认一下:是不是 PciConfig.BaseAddressIndexToOrdinal(0), PciConfig.BaseAddressIndexToOrdinal(1) PciConfig.BaseAddressIndexToOrdinal(2) PciConfig.BaseAddressIndexToOrdinal(3) PciConfig.BaseAddressIndexToOrdinal(4) PciConfig.BaseAddressIndexToOrdinal(5) 分别对应着PCI规范中的 PCIBAR0, PCIBAR1, PCIBAR2, PCIBAR3, PCIBAR4, PCIBAR5 ? 我一直不明白的就是BaseAddressIndexToOrdinal(0)具体指的是什么? 另外,WDM是在初始化一块PCI内存空间时,基地址号是如何显示给编程者的? [/B][/QUOTE] YES |
|
|
8楼#
发布于:2001-10-15 10:56
PciConfig.BaseAddressIndexToOrdinal(0),
PciConfig.BaseAddressIndexToOrdinal(1) PciConfig.BaseAddressIndexToOrdinal(2) PciConfig.BaseAddressIndexToOrdinal(3) PciConfig.BaseAddressIndexToOrdinal(4) PciConfig.BaseAddressIndexToOrdinal(5) 分别对应着PCI规范中的 PCIBAR0, PCIBAR1, PCIBAR2, PCIBAR3, PCIBAR4, PCIBAR5 实际情况好象并非如此,而是与分配的资源连续一一对应, 例如:你只使用BAR0,分配的资源则为PCIBAR0和PCIBAR2, 但是你访问PCIBAR2则应该使用PciConfig.BaseAddressIndexToOrdinal(1) 即内存中分配的第二块区域。 也许是我没理解其根本原因,但在使用时的确如此,希望高手们多指教。 |
|
9楼#
发布于:2001-10-15 10:58
不好意思,我这只是针对用PCI905X做的卡。
|
|
10楼#
发布于:2003-06-17 20:22
hswqs说的对。
仔细看看BaseAddressIndexToOrdinal()的实现源代码就可以知道,Index和Ordinal之间有个映射关系,而不是0对0,1对1。。。。 |
|