PCI总线与接口技术
改善代码的执行速度。
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调用的入口以及返回值说明,对80x86机器,调用功能号为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;否则
PCI总线接口技 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
