lllggg
驱动小牛
驱动小牛
  • 注册日期2002-05-04
  • 最后登录2007-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2274回复:12

不编驱动访问PCI总线设备配置空间方法

楼主#
更多 发布于:2002-08-14 09:17
要用访问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
(DEEP + BROAD + SIMPLE) & delicate
lllggg
驱动小牛
驱动小牛
  • 注册日期2002-05-04
  • 最后登录2007-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-14 09:43
虽然是古董,但要真正明白是怎么回事,可得费点劲呢。
(DEEP + BROAD + SIMPLE) & delicate
lllggg
驱动小牛
驱动小牛
  • 注册日期2002-05-04
  • 最后登录2007-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-21 16:12
这是我亲手编写的,厉害吧?
(DEEP + BROAD + SIMPLE) & delicate
游客

返回顶部