访问配置空间可以采用两种方式:一是通过BIOS调用进行访问;二是在Intel CPU平台上可以通过I/O口进行访问。I/O访问方式比较简单。在开发PCI数据采集卡时,我采用了PLX公司提供的PLXMON软件对设备卡进行了调试,该软件可以访问设备卡的配置空间。另外,我又采用C语言编写了一段程序直接对配置空间进行了访问,效果不错,核心程序代码如下(需要注意的一点是,我当时在windows98平台上测试的,所以直接通过_inpd等函数访问IO端口,windows98之后IO端口对于应用程序进行了屏蔽~~只能在内核才能对IO端口进行访问):<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
#include <stdio.h>
#include <conio.h>
void main()
{
__u32 data,address;
address=0x80000000 + 9 * 8 * 0x100; //插槽号为9
_outpd(0x0cf8, address);
data=_inpd(0x0cfc);
printf(“%x”, data);
address=0x80000004 + 9 * 8 * 0x100; //访问第二个寄存器
_outpd(0x0cf8, address);
data=_inpd(0x0cfc);
printf(“%x”, data);
}
0XCF8~0XCFB称为配置地址空间,0XCFC~0XCFF称为配置数据空间,这是两个双字空间,配置地址空间的格式如下:
最高位是配置访问使能位,要访问配置空间,使能位必须为1。位30到24为保留位,只读且为0,总线号用在一个系统中从256条总线中选择一条,对应系统引导时PCI期间列表中的BUS NO项,在PC机中,每个PCI插槽的设备号是固定的,而且互不相同。功能号用来选择多功能设备中的某一个功能,最多由8种功能供选择,单功能设备此项为0。寄存器号为配置空间寄存器的索引号。最低两位必须为0。
文章评论(0条评论)
登录后参与讨论