2024年6月9日发(作者:)

访问PCI设备配置空间的两类方法

一、根据PCI Local Bus协议进行访问

1.访问入口寄存器

PCI Local Bus协议规定了访问PCI设备配置空间的2个I/O端口寄存

器:CONFIG_ADDRESS(地址0CF8h)和CONFIG_DATA(地址0CFCh).它们均为双字寄存器,其中

CONFIG_ADDRESS为地址寄存器,用以定位PCI设备并指明待访问的配置空间寄存器地址编号;

CONFIG_DATA为数据寄存器,用以储存上述PCI设备指定的配置空间寄存器的内容.

CONFIG_ADDRESS寄存器的内部结构如下:

B31(Enable Bit):访问PCI设备配置空间使能位,1访问允许,0访问禁止;

B23:B16(BusNum):PCI设备所在的系统 PCI总线编号,范围为0~255;

B15:B11(DevNum):PCI设备的设备号,范围为0~31;

B10:B8(FunNum):PCI设备的功能号,范围为0~7(若设备支持多功能);

B7:B2(RegNum):待访问的配置空间寄存器的地址编号,要求是4的倍数;

B1B0两位只读,读出值始终为0,其余位保留.

2.访问操作过程

首先向地址端口CONFIG_ADDRESS写入如上图格式的配置双字,注意使能位必须置1,然

后直接读取数据端口CONFIG_DATA的双字数据,即为对应配置空间寄存器中的数据.

3.程序实现示例

以下是用汇编语言编写的访问程序:

;函数功能:向Config_Address端口写入配置双字,再从Data_Address端口读取双字数据

;输入参数:EAX=配置双字

;输出参数:EAX=读取双字

Access_Config_Space proc near

push dx

mov dx,0CF8h

out dx,eax

mov dx,0CFCh

in eax,dx

pop dx

ret

Access_Config_Space endp

二、调用PCI BIOS接口函数进行访问

1.调用Read Configuration DWord 函数进行访问

Read Configuration DWord 函数

功能:读某一指定设备配置空间的指定寄存器中的双字内容

中断号:INT 1Ah

入口参数: AH=0B1h,AL=READ_CONFIG_DWORD (0Ah)

BH=指定设备的Bus Number(0~255)

BL=指定设备的Device Number(高5位)和Function Number(低3位)

DI=指定设备配置空间的寄存器地址编号 (0~252,必须为4的倍数)

出口参数: ECX=读取的双字数据

AH=返回代码:SUCCESSFUL—00h

BAD_REGISTER_NUMBER—87h

CF=函数完成状态:1出错,0成功

2.程序实现示例

以下读取BusNum=DevNum=FunNum=0的PCI设备的VendorID和DeviceID(寄存器地址

编号为00h):

mov bx,0000h

mov di,00h

mov ax,0B10Ah

int 1Ah ;ECX高字=DeviceID,ECX低字=VendorID

附录

一般PCI设备配置空间结构