阅读:2992回复:14
各位老大,如何在一个驱动里创建多个设 备?(这个问题可能有人提过,但我搜索了几天也没找到,望各位老大帮帮忙,谢谢!)
具体的说,我有一块同步串口板,用的芯片是PEB20534,该片具有PCI接口,内部有4个串口通道,我想为它写一个98下的WDM驱动,希望驱动加载后,能为每个通道创建一个独立的设备,我用DS生成了一个驱动框架,在AddDevice里照DS生成的代码,创建了4个设备(每次m_Unit值加一),编译后加载驱动,在应用程序中能够打开4个设备,但只有与第一个设备才能正常交互,其他设备在调用DeviceIoControl时被挂起,不能正常返回。不知各位有没有遇到这样的问题,我该怎么做呢?都十来天了,真是急死了!!!
|
|
沙发#
发布于:2003-06-10 11:28
好像和我的问题类似也。分成两个 driver 来做,一个 bus driver,一个 function driver。bus driver 牧举出4个PDO。。。
意下如何? :( :( |
|
|
板凳#
发布于:2003-06-10 11:51
设置KSPINLOCK来同步访问设备
|
|
|
地板#
发布于:2003-06-10 13:09
没有做 ***->Flags &= ~DO_DEVICE_INITIALIZING;
|
|
地下室#
发布于:2003-06-10 13:09
jason.gao 我也想用你说的法子,可我没写过这样的驱动,有这样的例子可参考么?
|
|
5楼#
发布于:2003-06-10 13:11
KMK,你说的***->Flags &= ~DO_DEVICE_INITIALIZING;
是什么意思 |
|
6楼#
发布于:2003-06-10 13:23
fido->Flags |= fido->Flags & (DO_DIRECT_IO | DO_BUFFERED_IO | DO_POWER_PAGABLE);
fido->Flags &= ~DO_DEVICE_INITIALIZING; 如上 在创建设备後要色放开,不然打不开啊 ! http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&th=c8c5a1a84ac997f0&rnum=7 [编辑 - 6/10/03 by KMK] |
|
7楼#
发布于:2003-06-10 14:31
现在是能打开,但在调用DeviceIoControl时被挂起。另外,我用的是DriverStudio写的驱动,这些问题应该在KDevice类中封装处理过了吧?
|
|
8楼#
发布于:2003-06-10 14:52
一个Driver多个DeviceObject没有问题,你可能没有处理好,
在kbdcalss中有考虑多个DeviceObject的,你可参阅一下 |
|
|
9楼#
发布于:2003-06-10 15:54
AllenZh说得应该是对的,而且,是不是可以说所有的class driver中都有多个DeviceObject(它自身的FDO,以及代表下层port driver的FDO?)
Bus Driver 的问题我正在考虑做(可参考我的帖子),例子有一些,比如 Mass Storage (枚举出磁盘),serenum (DDK里面的,挂接在串口上的,枚举出PnP的串口设备)。我的感觉写起来还是比较麻烦的,因为里面既有FDO,又有PDO。 我现在被这些FDO和PDO弄得有点晕了 :( 如果你要用这个方法,我们就可以共同研究了 :D |
|
|
10楼#
发布于:2003-06-11 09:07
谢谢各位帮忙,分数太少,意思一下。
我再研究一下,有结果我会公布出来与大家分享。 很希望与jason.gao共同研究总线驱动问题,可惜目前进度太紧,恐怕时间不允许,过了这段时间我会继续总线驱动的,到时会向你请教。这中间如果有问题不妨来信,大家一起探讨一下。 再次谢谢各位大侠拔刀相助!!! |
|
11楼#
发布于:2003-06-11 11:05
老兄,我有个疑问,我曾经看过一些文章说有些设备在98下是不能用wdm的必须用vxd,比如串口,上面的朋友,你们能确定用这样的wdm程序可以用在98下吗?
|
|
12楼#
发布于:2003-07-15 10:59
我没有做过这样的驱动,不过根据一些理论知识,我认为这样的设计有几个问题:
1)通常书上讲的用于多个设备的驱动程序,是针对系统中实际存在多个相同的物理设备的情况。这时,每个物理设备都会产生一个物理设备对象(PDO),用同一个驱动程序在每个物理设备对象上产生一个功能设备对象。而这里讲到的情况是只有一个物理设备,也就是只有一个物理设备对象会被创建。因此,如果在驱动程序的INIT例程里通过多次调用IoCreateDevice来生成多个功能设备对象,那么这N个功能设备对象如何添加到设备栈上?只能一个一个地重叠起来。这样,除了最下面的那个功能设备对象外,其余的功能设备对象都会面临一些问题,比如:收到了IRP后如何正确处理?如果IRP要向下传递的话,那么最上面的那个FDO会把IRP传给第二个FDO,这是会不会有问题? |
|
13楼#
发布于:2003-07-16 18:06
我想你是写的PNP驱动吧.
对于PNP驱动要有一个总线驱动程序来枚举每个物理设备. 你那块卡里有四个串口通道,Windows不会知道有四个串口, 因而不会自动枚举到这四个物理设备,再调用AddDevice(). 这些都是你自己要完成的. |
|
14楼#
发布于:2010-08-06 16:46
Re:各位老大,如何在一个驱动里创建多个设 备?(这个问题可能有人提过,但我搜索了几天也没找到,望各 ..
楼主,你说的现象和我一摸一样,对你来说都过了七八年了,把这个你现在认为是毛毛雨的答案给说一下吧,我为这个问题也困扰好几天了,也是初步用DRIVER STUDIO的!! 我的QQ: 286025184 希望知道方法的朋友们能给解答下,谢谢了!!! |
|