阅读:1984回复:4
PCI的地址定义
我们公司有一个PCI卡,driver是别人很久以前写的,硬件是我们最近改造的。我们设定的I/O地址是0x278。现在发现了一些问题:
在某些PCI槽里面,可以正确的读取数据,但在别的槽里面就不行。经过研究,发现出错的时候地址已经变成了0x3bc,而在driver里面得到的地址仍然是0x278。 请问,这样的问题是什么原因?怎么搞定? 谢谢各位PCI的高手! |
|
|
沙发#
发布于:2002-06-18 13:42
老兄,PCI对其插卡的地址、中断等资源的分配是动态的而不是象ISA卡那样是具体的固定的,这也是PCI卡的优势之一,它可以保证不会与系统其他设备地址冲突。
以你的情况看,似乎是一个扩展的并口卡。一般当系统的0x278(LPT2:)不被占用时,会被分配此地址,而如果该地址已经被系统的其它PnP设备占用,则该地址保留,只能分配其它地址,而0x3bc就是一个最有可能的选择。因为,PC6的发展史上,曾使用该地址。 老的Driver或许是对ISA卡写的?至少是其驱动使用了固定地址,这对于PCI卡是不可取的。一般PCI卡的地址、中断的动态分配决定了我们只能提供向系统查询该卡被分配的资源来得到其地址等,这样写出来的驱动才可能满足任意更换插槽、机器的变化。 |
|
板凳#
发布于:2002-06-18 15:18
谢谢!
我也是这么想的,但不知道怎么改造那个driver。现在的地址是通过: PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; ... extension->OriginalController.LowPart = PartialDescriptor->u.Port.Start.LowPart; 这样来的。我看了Oney的书,可以用 extension->fMappedPort = (PartialDescriptor->Flags & CM_RESOURCE_PORT_IO) == 0; if(extension->fMappedPort) { extension->nPortBase = (PUCHAR)MmMapIoSpace(portbase, extension->nPorts, MmNonCached); if(!extension->nPortBase) return STATUS_NO_MEMORY; } else extension->nPortBase = (PUCHAR)portbase.QuadPart; 得到映射后的地址,不知道是不是你说的真实的地址?最要命的是,每次(PartialDescriptor->Flags & CM_RESOURCE_PORT_IO) == 0都等于FALSE,不知道是不是硬件有问题? |
|
|
地板#
发布于:2002-06-18 15:33
是否硬件有问题可以通过Windriver写一个测试程序来测试。
我不懂得您的源程序。但是,可以通过Windriver来写一个新的Driver,不知道是否可以满足你的要求?可以试一试,估计问题不大! |
|
地下室#
发布于:2002-06-19 00:42
不错的想法,等我有空试试看。
多谢! |
|
|