gazelle
驱动牛犊
驱动牛犊
  • 注册日期2001-08-16
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1769回复:10

NT,WDM和DriverWorks分别如何确定PCI设备的几块大小相同memory资源?

楼主#
更多 发布于:2001-09-13 14:37
   我现在遇到一个棘手的问题(也是比较初级的问题),我的一个PCI板块上(使用PLx 9030)有三块相同大小的memory(分别使用PCIBAR2,PCIBAR3,PCIBAR4在PCI总线上区分开)要供访问。
   我看了Walty Oney的书Progamming WDM,他好像说必须自己设法将相同类型的资源区别开(可怜他老人家举的一个例子对我不适用,我这儿恰恰是大小相同的memory),可是我除了知道它们的PCIBAR不同外,其余一无所知。我不知道PCIBAR在这三种开发方式中都是如何提示给开发者的。
    我眼下是用Driverworks做开发,我一点都不知道这个工具给我创建的几块内存是如何一一对应我的PCI设备上的物理内存的!
   请明白人告知。急急急!
   如果嫌文字罗嗦,可以给我打电话:68748088分机8473

最新喜欢:

mapoflmapofl
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-09-14 12:22
使用DS提供的KMemory类分别映射成三个内存区不就得了。

穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
gazelle
驱动牛犊
驱动牛犊
  • 注册日期2001-08-16
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-09-14 18:07
老哥,我问的正是这个三个KMemoryRange是如何对应我的PCI卡的三个不同区域的,不然我怎么知道我在访问哪一块?张冠李戴不是很很悲惨吗?
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-09-14 19:46
你在初始化KMemoryRange变量时,你不就知道哪个对应哪个了吗?

穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
gazelle
驱动牛犊
驱动牛犊
  • 注册日期2001-08-16
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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;
}

  我从这段代码及其调用的成员函数解释中找不到线索。
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-09-17 20:06
将PciConfig.BaseAddressIndexToOrdinal(0) 改成PciConfig.BaseAddressIndexToOrdinal(2)
PciConfig.BaseAddressIndexToOrdinal(3)
PciConfig.BaseAddressIndexToOrdinal(4)
分别对应m_MemoryRange0,m_MemoryRange1,m_MemoryRange3。不就行了。


穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
gazelle
驱动牛犊
驱动牛犊
  • 注册日期2001-08-16
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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内存空间时,基地址号是如何显示给编程者的?
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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

穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
hswqs
驱动小牛
驱动小牛
  • 注册日期2001-03-27
  • 最后登录2012-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
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)
即内存中分配的第二块区域。

也许是我没理解其根本原因,但在使用时的确如此,希望高手们多指教。
hswqs
驱动小牛
驱动小牛
  • 注册日期2001-03-27
  • 最后登录2012-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2001-10-15 10:58
不好意思,我这只是针对用PCI905X做的卡。
yunyanrong
驱动小牛
驱动小牛
  • 注册日期2003-04-18
  • 最后登录2013-03-02
  • 粉丝0
  • 关注0
  • 积分1040分
  • 威望457点
  • 贡献值1点
  • 好评度90点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-06-17 20:22
hswqs说的对。

仔细看看BaseAddressIndexToOrdinal()的实现源代码就可以知道,Index和Ordinal之间有个映射关系,而不是0对0,1对1。。。。
游客

返回顶部