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设备配置空间结构
发布评论