阅读:2352回复:12
不编驱动访问PCI总线设备配置空间方法
要用访问PCI总线设备的配置空间,必须先查找该设备。查找的基本根据是各PCI设备的配置空间里都存有其特定的设备号(Device ID)及销售商号(Vendor ID),它们占用配置空间的00h地址;而查找的目的是获得该设备的总线号和设备号。查找的基本过程如下:用I/O命令写配置空间的地址寄存器(CF8h),使其最高位为“1”,总线号及设备号为“0”,功能号及寄存器号为“0”,即往I/O端口CF8h写80000000h;然后用I/O命令读取配置空间的数据寄存器(CFCh),如果该寄存器值与该PCI设备的Device ID及Vendor ID不相符,则依次递增设备号/总线号,重复上述操作,直到找到该设备为止。如果查完所有的设备号/总线号(1~5)仍不能找到该设备,则应当考虑硬件上的问题。对于多功能设备,只要设置配置寄存器相应的功能号值,其余步骤与单功能设备一样。
作为例子,查找设备号为9054h,销售商为10b5的单功能PCI设备,用VC++6.0编写的程序如下: char bus; char device; unsigned int ioa0, iod; int scan( ) { bus = 0; device =0; for (char i = 0; i<5; i++) { for (char j = 0; j<32; j++) { bus = i; device = j ; ioa0 = 0x80000000 + bus * 0x10000 + (device * 8 ) * 0x100; _outpd(0xcf8, io0); iod = _inpd(0xcfc); if (iod0 = = 0x905410b5) return 0; } } return |
|
|
沙发#
发布于:2002-08-14 09:32
老古董了,但是挺实际的。
今日不方便,不然我贴一个dos的。 |
|
板凳#
发布于:2002-08-14 09:43
虽然是古董,但要真正明白是怎么回事,可得费点劲呢。
|
|
|
地板#
发布于:2002-08-15 10:09
说实话,我还真的不明白其中的奥妙。
|
|
地下室#
发布于:2002-08-21 16:12
这是我亲手编写的,厉害吧?
|
|
|
5楼#
发布于:2002-08-21 22:00
pfpf至极
谢谢lllggg版主,让我多少明白了一些。 不过我还不明白分配空间的问题,一开始怎么确定有多少空间需要分配啊?你在这是假设4个空间的! |
|
6楼#
发布于:2002-08-22 09:03
那你要对所访问的硬件了解呀。
|
|
7楼#
发布于:2002-08-22 09:05
用户被禁言,该主题自动屏蔽! |
|
8楼#
发布于:2002-08-22 14:55
还是有点用处!
|
|
|
9楼#
发布于:2002-08-23 14:11
to stroll:
谢谢你的回答,不好意思,我还想问一个问题:分配资源是在已经确定了由哪个驱动程序来分配之后进行的,而编写这个驱动的肯定知道这个设备所需要的资源了,我的理解对吗? |
|
10楼#
发布于:2002-09-29 11:26
最简单的方法,在设备管理器中查到物理地址段,然后就用它了
|
|
11楼#
发布于:2002-10-01 10:00
这个程序不能在WIN2000下正常运行啊!
有解决方法吗? |
|
12楼#
发布于:2002-10-06 10:07
Windriver中好象有一个PCI的例子,而且有源代码,可以对PCI的各种寄存进行操作,最重要的是,它可以在大部分windows系列中运行。
|
|