lllggg
驱动小牛
驱动小牛
  • 注册日期2002-05-04
  • 最后登录2007-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2352回复: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
stroll
驱动小牛
驱动小牛
  • 注册日期2001-10-26
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分161分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-14 09:32
老古董了,但是挺实际的。
今日不方便,不然我贴一个dos的。
lllggg
驱动小牛
驱动小牛
  • 注册日期2002-05-04
  • 最后登录2007-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-14 09:43
虽然是古董,但要真正明白是怎么回事,可得费点劲呢。
(DEEP + BROAD + SIMPLE) & delicate
stroll
驱动小牛
驱动小牛
  • 注册日期2001-10-26
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分161分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-08-15 10:09
说实话,我还真的不明白其中的奥妙。
lllggg
驱动小牛
驱动小牛
  • 注册日期2002-05-04
  • 最后登录2007-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-21 16:12
这是我亲手编写的,厉害吧?
(DEEP + BROAD + SIMPLE) & delicate
kxgchina
驱动小牛
驱动小牛
  • 注册日期2002-04-01
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-08-21 22:00
pfpf至极
谢谢lllggg版主,让我多少明白了一些。
不过我还不明白分配空间的问题,一开始怎么确定有多少空间需要分配啊?你在这是假设4个空间的!
stroll
驱动小牛
驱动小牛
  • 注册日期2001-10-26
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分161分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-08-22 09:03
那你要对所访问的硬件了解呀。
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-08-22 09:05
用户被禁言,该主题自动屏蔽!
liurendong
驱动牛犊
驱动牛犊
  • 注册日期2002-03-15
  • 最后登录2002-08-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-08-22 14:55
还是有点用处!
liurendong
kxgchina
驱动小牛
驱动小牛
  • 注册日期2002-04-01
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-08-23 14:11
to stroll:
谢谢你的回答,不好意思,我还想问一个问题:分配资源是在已经确定了由哪个驱动程序来分配之后进行的,而编写这个驱动的肯定知道这个设备所需要的资源了,我的理解对吗?
henryblue
驱动小牛
驱动小牛
  • 注册日期2002-09-29
  • 最后登录2003-05-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-09-29 11:26
最简单的方法,在设备管理器中查到物理地址段,然后就用它了
flying
驱动小牛
驱动小牛
  • 注册日期2002-08-01
  • 最后登录2016-06-19
  • 粉丝0
  • 关注0
  • 积分197分
  • 威望70点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2002-10-01 10:00
这个程序不能在WIN2000下正常运行啊!
有解决方法吗?
qingqing
驱动牛犊
驱动牛犊
  • 注册日期2002-04-17
  • 最后登录2002-11-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-10-06 10:07
Windriver中好象有一个PCI的例子,而且有源代码,可以对PCI的各种寄存进行操作,最重要的是,它可以在大部分windows系列中运行。
游客

返回顶部