阅读:2852回复:17
在一个sys中,如何识别多块pci卡,并对它们操作!50分
我想在一个sys中,如何识别多块pci卡,并对它们操作?(最好是在driverworks下)我用driverworks生成了一个pci卡的pci驱动程序的例子和test程序,可以识别一块pci卡,并操作,但是,我仔细研究代码,发现很难识别多块卡,不知是否在AddDevice()中或其它部分增加代码?100分
|
|
最新喜欢:theseu... |
沙发#
发布于:2003-03-25 16:17
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2003-03-25 22:03
多块相同的卡?
可以利用GUID,或硬编码。 |
|
地板#
发布于:2003-03-25 22:37
相同的卡有多块,则可以在驱动里面根据不同的pdo调用多个AddDevice
|
|
|
地下室#
发布于:2003-03-30 20:19
不知道有什么方法可以获得插槽啊,我想这样是不是可以区分一下
|
|
|
5楼#
发布于:2003-03-31 19:04
附议Tom.cat ,
|
|
6楼#
发布于:2003-03-31 22:56
AddDevice的时候,系统的PCI总线驱动程序已经完成对多卡的识别,对每个卡设置相应的标志,参数pdo就是系统已经找到的硬件设备对象,所以你应该在AddDevice里面增加代码。
|
|
|
7楼#
发布于:2003-06-25 11:46
对于一机多卡的驱动开发,有很多问题,一直没有完整的回答
不知道那位大侠能够完整的描述一下,从一卡的驱动到多卡相同 板卡驱动的流程,开发细节!想来必定名垂千古,为万人引用! 谢谢先! |
|
|
8楼#
发布于:2003-06-25 12:08
一机多卡其实就是要将获得的硬件信息分别保存下来:
在AddDevice时每次收到一个设备都会自动为该设备分配一个功能对象,在创建该功能对象时,取不同的设备名字,同时将硬件信息保存到相应的功能设备扩展中,最后将一个全局变量的指针数组分别指向每个扩展中,最后就可以分别获得硬件信息,对多卡进行操作了 |
|
|
9楼#
发布于:2003-06-25 13:45
一、硬编码
在AddDevice,创建linkname的时候,每次加个1 //类似于 static i=0; strlinkname = LINKNAME + i; //LINKNAME比如是\"MY_CARD\",简化为+,应该用UNICODE string的函数 IoCreateSymbolicLink(&strlinkname, &your_devcie_name); 至于app怎么得到linkname,随便了。 二、GUID //define 一个GUID先,比如是guid,一类卡一个 在AddDevice IoRegisterDeviceInterface(pdo, &guid, NULL, &pDevExt->LinkName) //很明显,放到DEVICEEXTENSION是比较合适的 每个pDevExt->LinkNmae都不会相同的。 至于app怎么得到linkname,随便了。 不需要考虑硬件信息。 |
|
10楼#
发布于:2003-06-27 10:18
对多卡的操作实际上就是对不同的硬件寄存器进行操作啊
|
|
|
11楼#
发布于:2003-06-28 00:44
我的卡就是多卡,我觉得没有什么!注意以下几点:
1.尽量不要使用公用变量! 2.对于2000来讲,最好使用分配symbollink路径。 3.app使用楼上的兄弟的程序。 4.区分几块卡要使用物理槽位号!这个是固定的! 其他的与单卡一样! 注:一定要注意同步控制! |
|
12楼#
发布于:2003-07-17 02:53
this my code for pls9054 driver and test program:
//driver code static LONG lDevNo=-1; //device instance no /////////////////////////////////////////////////////////////////////////////// NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo) { PAGED_CODE(); KdPrint((DRIVERNAME \" - Entering AddDevice: DriverObject %8.8lX, pdo %8.8lX\\n\", DriverObject, pdo)); NTSTATUS status; // Create a functional device object to represent the hardware we\'re managing. PDEVICE_OBJECT fdo; #define xsize sizeof(DEVICE_EXTENSION) UNICODE_STRING devname; WCHAR namebuf[32]; long lThisDeviceNumber = InterlockedIncrement(&lDevNo); _snwprintf(namebuf, arraysize(namebuf), L\"\\\\DosDevices\\\\PLX9054%d\",lThisDeviceNumber); RtlInitUnicodeString(&devname, namebuf); status = IoCreateDevice(DriverObject, xsize, &devname, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &fdo); if (!NT_SUCCESS(status)) { // can\'t create device object KdPrint((DRIVERNAME \" - %d AddDevice(): IoCreateDevice failed - %X\\n\", lThisDeviceNumber,status)); return status; } // can\'t create device object else { KdPrint((DRIVERNAME \" - %d AddDevice(): CreateDevice %d Ok\\n\", lThisDeviceNumber, lThisDeviceNumber)); } ... } /////////////////////////////////////////////////////// //application //connect to first device m_hDevice=CreateFile(\"\\\\\\\\.\\\\PLX90540\", ...); //connect to second device m_hDevice=CreateFile(\"\\\\\\\\.\\\\PLX90541\", ...); .... |
|
13楼#
发布于:2003-07-27 09:20
NTSTATUS PciwdmDriver::AddDevice(PDEVICE_OBJECT PDO)
{ PciwdmDevice* pD = new (NonPagedPool) PciwdmDevice(PDO, m_instance); if (pD != NULL) { NTSTATUS status = pD->ConstructorStatus(); if ( !NT_SUCCESS(status) ) delete pD; else m_instance++; return status; } else return STATUS_INSUFFICIENT_RESOURCES; } 这是DS2。7里的例子,很简单,但好象不完整,好象没有创建linkname |
|
14楼#
发布于:2003-07-27 09:21
instance声明为静态的成员变量
|
|
15楼#
发布于:2003-07-28 09:29
利用PCI BIOS调用,把每个bus#/device#查一遍,根据vendor id / device id判断是否是你的卡,并把这些bus#/device#记下来,并对卡进行编号。
|
|
|
16楼#
发布于:2003-07-28 10:52
这个问题真的很烦人,请高手多多发言,我代表菜鸟们谢了先。
|
|
|
17楼#
发布于:2010-03-03 17:07
同问!这个问题比较困扰!
|
|