简略地讨论PCI装备空间,PCI ROM,以及PCI BIOS的调用。
1、PCI总线的开展前史
1990年,起源于Intel架构开发实验室,全称是Peripheral Component Interconnect,首要在服务器中运用,替代了本来的MCA以及EISA,EISA直到2000年才宣告退出前史舞台。直到1994年,才开端在PC上广泛运用,替代了本来的VESA。在1995年的中期,苹果电脑也开端运用PCI总线电气标准。后来PCI也增加了许多新的功用,比方66MHz,3.3V标准,以及133MHz的PCI-X。2004年,呈现了PCI-Express,本来的PCI总线电气标准被称为了传统PCI(Conventional PCI)。
2、PCI总线地址空间
独立的内存以及IO接口,由软件分配。而别的一个地址空间-PCI装备空间(PCI Configuration Space),运用独立的地址,答应软件决议每一个连入的设备需求多少内存以及IO地址空间。经过设备装备空间寄存器的设置,每一个设备至多可以请求6个内存以及IO地址空间。PCI装备空间还包括了连入设备的相关信息,依据这些信息,操作体系可以方便地运用相应的驱动来运用这些设备。为了使PCI总线公平地运用PCI总线,供给了一种等候计时的功用,计时器在设备获得了总线运用权时以PCI时钟信号的速率开端计时,直到减为零,设备开释总线占有权。
3、关于PCI的中止
四个中止,归于电平触发方法(边缘触发方法的中止简单丢掉)。单功用设备仅仅运用INTA#,多功用设备运用多个中止。四个中止经过PCI桥(两个PCI总线之间)映射到体系中止上,所以软件无从得知是那个PCI中止。后来的PCI加入了音讯信号中止的机制,PCI-Express运用的也是音讯信号中止机制,而没有物理中止线。
4、PCI电气标准
PCI卡的尺度,长度为174.63mm,高度为36.068~106.68mm。一下是一幅PCI个引脚界说的图。
5、PCI设备的初始化
机器上电的时分,装备软件有必要扫描PCI总线,确认有哪些PCI设备,然后加载相应的驱动程序。一切PCI设备都有必要完结PCI协议规矩有必要的装备寄存器。而对PCI装备拜访实际上便是拜访设备的装备寄存器。
6、PCI装备空间
装备空间各项数据阐明:
厂商识别码(Vendor ID):标识设备的制造者,有PCI SIG来分配。0FFFH表明未装备任何设备。
设备识别码(Device ID):标识特定的设备,详细代码由厂商分配。
版别ID,Revision ID:指定一个设备特有的版别号。
Class Code(分类代码):用于设备分类。0BH处为根本分类代码;0A处为子分类代码;09H处为标识一个专用的寄存器级编程接口,便于设备的软件可以与设备交互数据。
指令寄存器(Command):为发出和呼应PCI总线指令供给了对设备大略的操控。
状况寄存器(Status):用于记载PCI总线有关操作的状况信息,体系对该寄存器的读操作无特别要求。
基地址寄存器(Base Address Registers):供地址映射运用,使PCI的IO映射以及内存映射与详细设备无关。
扩展ROM的基地址寄存器(Expansion ROM Base Address):用来处理那些装备了部分EPROM或许Flash ROM的基地址和巨细。Cache巨细寄存器:用来指定体系中Cache行的长度,每个参与Cache协议的设备都要运用该寄存器。
延时计时器:该寄存器以PCI总线时钟为单位指定PCI总线主设备的推迟计时器。
内含自测寄存器:可选的寄存器,用作内含自测试的操控与状况寄存器。
中止引脚寄存器(Interrupt Pin):用来表明设备运用了哪个PCI中止引脚。
中止线寄存器(Interrupt Line):用来表明设备中的中止引脚与体系可编程操控器8259的哪个中止输入线相连接。
MAX_GNT表明设备需求多长的突发传输时刻。MAX_LAT表明对PCI总线进行拜访的频频程度。
Card CIS Pointer:由在卡总线和PCI之间同享芯片的设备完结。
子体系厂商标识和子体系标识(Subsystem Vendor ID):用于专一地标识设备所驻留的刺进卡和子体系。即插即用操作体系可以定位正确的驱动程序,装载到存储器。
7、PCI扩展ROM
经过履行扩展ROM寄存的代码来完结与设备相关的初始化,一起也或许完结体系引导功用。该机制答应扩展ROM中含有几个不同的映像,以习惯不同的机器和处理器结构。
但凡支撑扩展ROM的设备,有必要支撑按恣意字节组合方法对ROM进行拜访,特别强调的是要支撑双字(DWORD)拜访。扩展ROM中的信息组织要与现有的适合于ISA和EISA以及MC适配器的Intel X86扩展ROM中的头标区兼容。头标区中所给信息经过了扩大,然后使适配器的功用进一步优化运用,然后可以使扩展ROM中的代码在运行期间所运用的存储空间最小。
PCI扩展ROM中代码从不在原地履行,而是将代码从ROM中拷贝到RAM中履行。这样可以在初始化和运行时动态地确认代码长度,而且可以改进代码的履行速度。
PCI关于不同的体系和处理器装备都应该包括其编码映像。每个映像由ROM首区(映像开端处)+数据装备区(映像的第64KB范围内)组成。
ROM首区内容
偏移 |
长度 |
值 |
阐明 |
00H~01H |
2 |
55AAH |
ROM标签字节 |
02H~17H |
22 |
XX |
保存 |
18H~19H |
2 |
XX |
到PCI数据结构指针 |
数据装备区
偏移量 |
长度 |
阐明 |
偏移量 |
长度 |
阐明 |
00H~03H |
4 |
标签,字符串”PCID” |
0DH~0FH |
3 |
分类代码 |
04H~05H |
2 |
供货商识别码 |
10H~11H |
2 |
映像长度 |
06H~07H |
2 |
设备识别码 |
12H~13H |
2 |
代码数据的修正等级 |
08H~09H |
2 |
对重要产品数据的指针 |
14H~14H |
1 |
代码类型 |
0AH~0BH |
2 |
PCI数据结构长度 |
15H~15H |
1 |
指示标志 |
0CH~0CH |
1 |
PCI数据结构修正 |
16H~17H |
2 |
保存 |
8、关于PCI设备的初始化
体系POST首要查看PCI设备在装备空间是否运用了扩展ROM基地址寄存器(即是否有扩展ROM),若运用了,POST将ROM映射到地址空间中一个未用的部分。
9、PCI BIOS
其主要效果有以下两点:
- 为应用软件或许PCI总线设备或许板卡供给服务调用。
- 初始化每个体系PCI设备。PCI BIOS轮番查询每个PCI插槽,查找存在的PCI设备,读取存在设备装备空间的头标区,以决议设备的厂商号,类型和存储需求等内容。而且将分配的I/O或存储空间地址回写到每个设备装备空间的基地址寄存器中。
- PCI BIOS调用的进口以及回来值阐明,对80×86机器,调用功用号为1AH,进口参数在AX中,回来值在AH中。下面罗列的是比较常用的,更多阐明请参阅PCI BIOS规矩阐明书。
功用阐明 |
进口参数(AX) |
回来值阐明 |
出口参数(AH) |
PCI BIOS存在查询 |
B101H |
成功调用 |
00H |
查找PCI 设备 |
B102H |
不支撑的功用 |
81H |
查找PCI 设备的类代码 |
B103H |
过错的厂商号 |
83H |
发生特别周期 |
B106H |
未找到设备 |
86H |
读装备寄存器-单字节操作 |
B108H |
过错的寄存器号 |
87H |
读装备寄存器-单字操作 |
B109H |
设置失利 |
88H |
读装备寄存器-双字操作 |
B10AH |
缓冲区太小 |
89H |
写装备寄存器-单字操作 |
B10BH |
||
写装备寄存器-单字节操作 |
B10CH |
||
写装备寄存器-双字节操作 |
B10DH |
||
获得中止线路选项 |
B10EH |
||
设置PCI中止 |
B10FH |
- 下面是一个关于经过PCI BIOS调用读PCI装备寄存器的比如:
-
- .386
- ;FUNCTIONCODE
- PCI_FUNCTION_ID=0B1H
- PCI_BIOS_PRESENT=01H
- FIND_PCI_DEVICE=02H
- FIND_PCI_CLASS_CODE=03H
- GENERATE_SPECIAL_CYCLE=06H
- READ_CONFIG_BYTE=08H
- READ_CONFIG_WORD=09H
- READ_CONFIG_DWORD=0AH
- WRITE_CONFIG_BYTE=0BH
- WRITE_CONFIG_WORD=0CH
- WRITE_CONFIG_DWORD=0DH
- GET_IRQ_ROUTING_OPTIONS=0EH
- SET_PCI_IRQ=0FH
- ;RETURNCODE
- SUCCESSFUL=00H
- FUNC_NOT_SUPPORTED=81H
- BAD_VENDOR_ID=83H
- DEVICE_NOT_FOUND=86H
- BAD_REGISTER_NUMBER=87H
- SET_FAILED=88H
- BUFFER_TOO_SMALL=89H
- VID=0H
- DID=2H
- PCICMD=4H
- PCISTS=6H
- RID=8H
- CLCD=9H
- CALN=0CH
- LAT=0DH
- HDR=0EH
- BIST=0FH
- BADR0=10H
- BADR1=14H
- BADR2=18H
- BADR3=1CH
- BADR4=20H
- BADR5=24H
- EXPOM=30H
- INTLN=3CH
- INTPIN=3DH
- MINGNT=3EH
- MAXLAT=3FH
- SSTACKSEGMENTSTACKPARAUSE16
- DW64DUP(?)
- SSTACKENDS
- DATASEGMENTPARAUSE16
- MESDBPCICARDNOTFOUND!$
- MES0DB***********************PCICONFIGINFO*****************************,13,10,$
- MES1DBPCIBIOSNOTFOUND!,10,13,$
- MES2DBPCICONFIGREADERROR!$
- MES3DBVendorIdentification:10E8$
- MES4DBDeviceIdentification:5933$
- MES5DBPCICommandRegister:$
- MES6DBPCIStatusRegister:$
- MES7DBRevisionIdentificationRegister:$
- MES8DBClassCodeRegister:$
- MES9DBCacheLineSizeRegister:$
- MES10DBMasterLatencyTimer:$
- MES11DBHeaderType:$
- MES12DBBuilt-inSelf-test:$
- MES13DBBaseAddressRegister0:$
- MES14DBBaseAddressRegister1:$
- MES15DBBaseAddressRegister2:$
- MES16DBBaseAddressRegister3:$
- MES17DBBaseAddressRegister4:$
- MES18DBBaseAddressRegister5:$
- MES19DBExpansionRomBaseAddress:$
- MES20DBInterruptLine:$
- MES21DBInterruptPin:$
- MES22DBMinimumGrant:$
- MES23DBMaximumLatency:$
- BNDB?
- DN_FNDB?
- R_VALUEDD?
- V_VIDDW?
- V_DIDDW?
- V_PCICMDDW?
- V_PCISTSDW?
- V_RIDDB?
- V_CLCDDD?
- V_CALNDB?
- V_LATDB?
- V_HDRDB?
- V_BISTDB?
- V_BADR0DD?
- V_BADR1DD?
- V_BADR2DD?
- V_BADR3DD?
- V_BADR4DD?
- V_BADR5DD?
- V_EXPOMDD?
- V_INTLNDB?
- V_INTPINDB?
- V_MINGNTDB?
- V_MAXLATDB?
- DATAENDS
- CODESEGMENTPARAUSE16
- ASSUMECS:CODE,DS:DATA,SS:SSTACK
- START:MOVAX,DATA
- MOVDS,AX
- MOVAX,0B101H;查找PCIBIOS
- INT1AH
- JNCJUDGE1;假如CF被置位,则PCIBIOS不存在
- MOVDX,OFFSETMES1;显现不存在信息
- MOVAH,09H
- INT21H
- JMPEXIT
- JUDGE1:CMPAH,00H
- JZJUDGE2;假如不等,则PCIBIOS不存在
- MOVDX,OFFSETMES1;显现不存在信息
- MOVAH,09H
- INT21H
- JMPEXIT
- JUDGE2:CMPEDX,ICP;假如EDX中放的是”PCI”则阐明PCIBIOS存在
- JZFIND
- MOVDX,OFFSETMES1;不然过错的设备
- MOVAH,09H
- INT21H
- JMPEXIT
- FIND:MOVAX,0B102H;找到了PCIBIOS,再查找指定PCI设备
- MOVCX,5933H;板卡的设备的ID
- MOVDX,10E8H;板卡的供货商ID
- MOVSI,0;索引
- INT1AH
- JNCREAD
- MOVDX,OFFSETMES
- MOVAH,09H
- INT21H
- JMPEXIT
- READ:MOVBN,BH;保存总线号
- MOVDN_FN,BL;保存设备号
- CALLKENTER;回车换行
- MOVDX,OFFSETMES0
- MOVAH,09H
- INT21H
- CALLKENTER;回车换行
- MOVDX,OFFSETMES3;输出供给厂商ID
- MOVAH,09H
- INT21H
- CALLKENTER
- MOVDX,OFFSETMES4;输出设备的ID
- MOVAH,09H
- INT21H
- CALLKENTER
- MOVAX,0B109H;读指令寄存器,单字操作
- MOVBH,BN
- MOVBL,DN_FN
- MOVDI,PC%&&&&&%MD
- INT1AH
- JCERROR
- MOVDX,OFFSETMES5;显现PCI指令寄存器内容
- MOVAH,09H
- INT21H
- MOVAX,02H
- CALLSHOW
- CALLKENTER
- MOVAX,0B109H;读PCI状况寄存器内容,单字操作
- MOVBH,BN
- MOVBL,DN_FN
- MOVDI,PCISTS
- INT1AH
- JCERROR
- MOVDX,OFFSETMES6;显现状况寄存器内容
- MOVAH,09H
- INT21H
- MOVAX,02H
- CALLSHOW
- CALLKENTER
- MOVAX,0B108H;版别号,单字节操作
- MOVBH,BN
- MOVBL,DN_FN
- MOVDI,RID
- INT1AH
- JCERROR
- MOVDX,OFFSETMES7;显现版别号
- MOVAH,09H
- INT21H
- MOVAX,01H
- CALLSHOW
- CALLKENTER
- MOVAX,0B108H;读中止引脚信号,单字节操作
- MOVBH,BN
- MOVBL,DN_FN
- MOVDI,INTLN
- INT1AH
- JCERROR
- MOVDX,OFFSETMES20;显现中止引脚
- MOVAH,09H
- INT21H
- MOVAX,01H
- CALLSHOW
- CALLKENTER
- MOVAX,0B10AH;读装备寄存器,双字操作
- MOVBH,BN;PCI设备的总线号
- MOVBL,DN_FN;设备以及功用号,进口参数
- MOVDI,BADR0
- INT1AH
- JCERROR
- MOVDX,OFFSETMES13;基址寄存器0
- MOVAH,09H
- INT21H
- MOVAX,04H
- CALLSHOW
- CALLKENTER
- MOVAX,0B10AH;读装备寄存器,双字操作
- MOVBH,BN;PCI设备的总线号
- MOVBL,DN_FN;设备及功用号,进口参数
- MOVDI,BADR1
- INT1AH
- JCERROR
- PUSHECX
- MOVDX,OFFSETMES14;基址寄存器1
- MOVAH,09H
- INT21H
- MOVAX,04H
- POPECX
- CALLSHOW
- CALLKENTER
- MOVAX,0B10AH;读装备寄存器,双字操作
- MOVBH,BN;PCI设备的总线号
- MOVBL,DN_FN;设备及功用号,进口参数
- MOVDI,BADR2
- INT1AH
- JCERROR
- MOVDX,OFFSETMES15;基地址寄存器2
- MOVAH,09H
- INT21H
- MOVAX,04H
- CALLSHOW
- CALLKENTER
- MOVAX,0B10AH;读装备寄存器,双字操作
- MOVBH,BN;PCI设备的总线号
- MOVBL,DN_FN;设备及功用号,进口参数
- MOVDI,BADR3
- INT1AH
- JCERROR
- MOVDX,OFFSETMES16;基地址寄存器3
- MOVAH,09H
- INT21H
- MOVAX,04H
- CALLSHOW
- CALLKENTER
- MOVAX,0B10AH;读装备寄存器,双字操作
- MOVBH,BN;PCI设备的总线号
- MOVBL,DN_FN;设备及功用号,进口参数
- MOVDI,BADR4
- INT1AH
- JCERROR
- MOVDX,OFFSETMES17;基地址寄存器4
- MOVAH,09H
- INT21H
- MOVAX,04H
- CALLSHOW
- JMPEXIT
- ERROR:CALLKENTER
- MOVDX,OFFSETMES2;显现读过错信息
- MOVAH,09H
- INT21H
- EXIT:MOVAH,4CH;回来DOS
- INT21H
- KENTERPROC
- MOVDL,0AH
- MOVAH,02H
- INT21H
- MOVDL,0DH
- MOVAH,02H
- INT21H
- RET
- KENTERENDP
- SHOWPROCNEAR;显现子程序
- PUSHDX
- PUSHDI
- PUSHBX
- MOVDI,OFFSETR_VALUE
- MOV[DI],ECX;保存获取的数据
- ADDDI,AX
- DECDI
- MOVCX,AX
- C1:MOVAL,[DI]
- PUSHAX
- SHRAL,4
- ANDAL,0FH;取高4位
- CMPAL,0AH;是否是A以上的数
- JBC2
- ADDAL,07H
- C2:ADDAL,30H
- MOVBH,AL
- POPAX
- ANDAL,0FH;取低4位
- CMPAL,0AH
- JBC3
- ADDAL,07H
- C3:ADDAL,30H
- MOVBL,AL
- MOVAH,2;显现十六进制数对应的ACSII码
- MOVDL,BH
- INT21H
- MOVDL,BL
- INT21H
- DECDI
- LOOPC1
- POPBX
- POPDI
- POPDX
- RET
- SHOWENDP
- CODEENDS
- ENDSTART