阅读:1685回复:15
wdm pci 内存问题
我曾经做过WDM下的内存映射,但只是一块内存,如果硬件分配了两块以上的内存资源,我如何分别拿到它们?
谢谢各位先!! |
|
沙发#
发布于:2003-05-10 14:22
创建两个基地址
|
|
|
板凳#
发布于:2003-05-10 15:47
我已经设了两块基地址,我的意思是如何在驱动程序里分别拿到它们。我从前做的是分配了一块地址,现在用到两块内存,有点晕。:)
|
|
地板#
发布于:2003-05-10 16:03
我已经设了两块基地址,我的意思是如何在驱动程序里分别拿到它们。我从前做的是分配了一块地址,现在用到两块内存,有点晕。:) 系统不是自动分配资源吗??保存下来不就完了 :) |
|
|
地下室#
发布于: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; ... } |
|
5楼#
发布于:2003-05-11 17:27
您的意思是不是分两次拿地址,分别存储,如下: 不是不是,用同一个case就可以了,你在case里处理一下 |
|
|
6楼#
发布于:2003-05-11 17:38
哦?那么您能说清楚一点吗?我不是很明白,一个资源描述表是怎么获得两处内存信息的?在CASE里如何处理呢?
|
|
7楼#
发布于:2003-05-11 23:23
用户被禁言,该主题自动屏蔽! |
|
8楼#
发布于:2003-05-12 08:59
还是不明白,请问楼上的昌“靠大小”是什么意思?是不是比较两块内存的大小?但在比较前如何分别拿到它们?谢谢!!
|
|
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] |
|
|
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; |
|
11楼#
发布于:2003-05-13 08:10
哦,明白了,回头试一下。给分先。
|
|
12楼#
发布于:2003-05-13 08:19
这次没经验,下次多给些,各位谅!!
|
|
13楼#
发布于:2003-05-14 09:49
我的PCI卡有四块内存,我不太明白CmResourceTypeMemory中的U是个共同体吧?用membase1 = resource->u.Memory.Start;
membase2 = resource->u.Memory.Start的话两个基地址不是地址一样了吗?请问CmResourceTypeMemory中不同的内存信息是如何存放的? 给分! |
|
14楼#
发布于:2003-05-14 20:43
先在PCI配置寄存器读取所有的存储器基地址,然后将case 中获得的基地址与之比较,各自每次获得的是那一块空间。
|
|
|
15楼#
发布于:2003-05-15 09:13
多谢楼上的朋友帮助,有些明白了。
我是用DS开发的,在OnStartDevice中可以获取所有的基地址,在Write和Read中用直接读写方式,但传给这两个函数的参数只是KIRP I,我不知道如何从I中获取并区分卡上的内存地址? 请到我发的帖子(问WDM―PCI``````)中来,给分!! |
|