red_memory
驱动牛犊
驱动牛犊
  • 注册日期2003-05-10
  • 最后登录2003-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1685回复:15

wdm pci 内存问题

楼主#
更多 发布于:2003-05-10 13:35
我曾经做过WDM下的内存映射,但只是一块内存,如果硬件分配了两块以上的内存资源,我如何分别拿到它们?
  谢谢各位先!!
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-10 14:22
创建两个基地址
早起早睡 精神百倍
red_memory
驱动牛犊
驱动牛犊
  • 注册日期2003-05-10
  • 最后登录2003-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-10 15:47
我已经设了两块基地址,我的意思是如何在驱动程序里分别拿到它们。我从前做的是分配了一块地址,现在用到两块内存,有点晕。:)
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-10 16:03
我已经设了两块基地址,我的意思是如何在驱动程序里分别拿到它们。我从前做的是分配了一块地址,现在用到两块内存,有点晕。:)


系统不是自动分配资源吗??保存下来不就完了
 :)
早起早睡 精神百倍
red_memory
驱动牛犊
驱动牛犊
  • 注册日期2003-05-10
  • 最后登录2003-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-10 16:28
您的意思是不是分两次拿地址,分别存储,如下:
switch (resource->Type)
  {
  case CmResourceTypeMemory:
  membase1 = resource->u.Memory.Start;
   pdx->nbytes1 = resource->u.Memory.Length;
    break;
case CmResourceTypeMemory:
  membase2 = resource->u.Memory.Start;
   pdx->nbytes2 = resource->u.Memory.Length;
    break;

  ...
  }
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-11 17:27
您的意思是不是分两次拿地址,分别存储,如下:
switch (resource->Type)
  {
  case CmResourceTypeMemory:
  membase1 = resource->u.Memory.Start;
   pdx->nbytes1 = resource->u.Memory.Length;
    break;
case CmResourceTypeMemory:
  membase2 = resource->u.Memory.Start;
   pdx->nbytes2 = resource->u.Memory.Length;
    break;

  ...
  }
 


不是不是,用同一个case就可以了,你在case里处理一下
早起早睡 精神百倍
red_memory
驱动牛犊
驱动牛犊
  • 注册日期2003-05-10
  • 最后登录2003-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-05-11 17:38
哦?那么您能说清楚一点吗?我不是很明白,一个资源描述表是怎么获得两处内存信息的?在CASE里如何处理呢?
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2003-05-11 23:23
用户被禁言,该主题自动屏蔽!
red_memory
驱动牛犊
驱动牛犊
  • 注册日期2003-05-10
  • 最后登录2003-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-05-12 08:59
还是不明白,请问楼上的昌“靠大小”是什么意思?是不是比较两块内存的大小?但在比较前如何分别拿到它们?谢谢!!
AthlonXP
驱动小牛
驱动小牛
  • 注册日期2003-05-11
  • 最后登录2010-01-20
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-05-12 09:50
还是不明白,请问楼上的昌“靠大小”是什么意思?是不是比较两块内存的大小?但在比较前如何分别拿到它们?谢谢!!


Tom老大说的靠大小指的是你用来区分这两个内存的方法
如果说的详细点,可以这样区分:

switch (resource->Type)
{
case CmResourceTypeMemory:

if(membase1) {
   membase2 = resource->u.Memory.Start;
   pdx->nbytes2 = resource->u.Memory.Length;
}
else {
   membase1 = resource->u.Memory.Start;
   pdx->nbytes2 = resource->u.Memory.Length;
}

break;


...
}

当然,你AddDevice时将两个基地址赋值NULL,最后资源释放后也要将其赋值NULL

[编辑 -  5/14/03 by  AthlonXP]

[编辑 -  5/14/03 by  AthlonXP]
AthlonXP是个好人,他一生没有欺压过同侪,没有背叛过朋友。从小到大,他都是个好孩子,没有出过什么差错,没有让家人师长担过心。虽然用一句时髦的话,他不善于"推销"自己,但是做学问扎扎实实,不会投机取巧;做工作也是一步一个脚印,不会敷衍塞责。他虽然是个大烟枪,偶尔也喝喝酒,但是没有什么见不得人的恶习。他花钱虽然不特别大方,可是也不吝啬。许多不如他的人,或幸或不幸,一般的也都成了家。可是为什么MM不喜欢他呢??
nk_sun
驱动牛犊
驱动牛犊
  • 注册日期2002-07-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-05-12 09:57
是这样的,一般情况下,你所映射的这两个空间总是有些不同的,靠比较大小来区分哪个指针对应哪片映射空间。

switch (resource->Type)
{
case CmResourceTypeMemory:
if(resource->u.Memory.Length==size1)
{
     membase1 = resource->u.Memory.Start;
     pdx->nbytes1 = resource->u.Memory.Length;
}
else if((resource->u.Memory.Length==size2)
{    
     membase2 = resource->u.Memory.Start;
     pdx->nbytes2 = resource->u.Memory.Length;
}
else
    error;
}
break;

red_memory
驱动牛犊
驱动牛犊
  • 注册日期2003-05-10
  • 最后登录2003-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-05-13 08:10
哦,明白了,回头试一下。给分先。
red_memory
驱动牛犊
驱动牛犊
  • 注册日期2003-05-10
  • 最后登录2003-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-05-13 08:19
这次没经验,下次多给些,各位谅!!
lansing
驱动牛犊
驱动牛犊
  • 注册日期2003-04-23
  • 最后登录2005-09-01
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-05-14 09:49
我的PCI卡有四块内存,我不太明白CmResourceTypeMemory中的U是个共同体吧?用membase1 = resource->u.Memory.Start;
membase2 = resource->u.Memory.Start的话两个基地址不是地址一样了吗?请问CmResourceTypeMemory中不同的内存信息是如何存放的?
给分!
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-05-14 20:43
先在PCI配置寄存器读取所有的存储器基地址,然后将case 中获得的基地址与之比较,各自每次获得的是那一块空间。
有了驱动,人才有了力量。
lansing
驱动牛犊
驱动牛犊
  • 注册日期2003-04-23
  • 最后登录2005-09-01
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-05-15 09:13
多谢楼上的朋友帮助,有些明白了。
我是用DS开发的,在OnStartDevice中可以获取所有的基地址,在Write和Read中用直接读写方式,但传给这两个函数的参数只是KIRP I,我不知道如何从I中获取并区分卡上的内存地址?
请到我发的帖子(问WDM―PCI``````)中来,给分!!
游客

返回顶部