×
嵌入式 > 嵌入式开发 > 详情

PCI总线与接口技术

发布时间:2020-09-01 发布时间:
|
简单地探讨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调用的入口以及返回值说明,对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配置寄存器的例子:
    1. .386
    2. ;FUNCTIONCODE
    3. PCI_FUNCTION_ID=0B1H
    4. PCI_BIOS_PRESENT=01H
    5. FIND_PCI_DEVICE=02H
    6. FIND_PCI_CLASS_CODE=03H
    7. GENERATE_SPECIAL_CYCLE=06H
    8. READ_CONFIG_BYTE=08H
    9. READ_CONFIG_WORD=09H
    10. READ_CONFIG_DWORD=0AH
    11. WRITE_CONFIG_BYTE=0BH
    12. WRITE_CONFIG_WORD=0CH
    13. WRITE_CONFIG_DWORD=0DH
    14. GET_IRQ_ROUTING_OPTIONS=0EH
    15. SET_PCI_IRQ=0FH
    16. ;RETURNCODE
    17. SUCCESSFUL=00H
    18. FUNC_NOT_SUPPORTED=81H
    19. BAD_VENDOR_ID=83H
    20. DEVICE_NOT_FOUND=86H
    21. BAD_REGISTER_NUMBER=87H
    22. SET_FAILED=88H
    23. BUFFER_TOO_SMALL=89H
    24. VID=0H
    25. DID=2H
    26. PCICMD=4H
    27. PCISTS=6H
    28. RID=8H
    29. CLCD=9H
    30. CALN=0CH
    31. LAT=0DH
    32. HDR=0EH
    33. BIST=0FH
    34. BADR0=10H
    35. BADR1=14H
    36. BADR2=18H
    37. BADR3=1CH
    38. BADR4=20H
    39. BADR5=24H
    40. EXPOM=30H
    41. INTLN=3CH
    42. INTPIN=3DH
    43. MINGNT=3EH
    44. MAXLAT=3FH
    45. SSTACKSEGMENTSTACKPARAUSE16
    46. DW64DUP(?)
    47. SSTACKENDS
    48. DATASEGMENTPARAUSE16
    49. MESDBPCICARDNOTFOUND!$
    50. MES0DB***********************PCICONFIGINFO*****************************,13,10,$
    51. MES1DBPCIBIOSNOTFOUND!,10,13,$
    52. MES2DBPCICONFIGREADERROR!$
    53. MES3DBVendorIdentification:10E8$
    54. MES4DBDeviceIdentification:5933$
    55. MES5DBPCICommandRegister:$
    56. MES6DBPCIStatusRegister:$
    57. MES7DBRevisionIdentificationRegister:$
    58. MES8DBClassCodeRegister:$
    59. MES9DBCacheLineSizeRegister:$
    60. MES10DBMasterLatencyTimer:$
    61. MES11DBHeaderType:$
    62. MES12DBBuilt-inSelf-test:$
    63. MES13DBBaseAddressRegister0:$
    64. MES14DBBaseAddressRegister1:$
    65. MES15DBBaseAddressRegister2:$
    66. MES16DBBaseAddressRegister3:$
    67. MES17DBBaseAddressRegister4:$
    68. MES18DBBaseAddressRegister5:$
    69. MES19DBExpansionRomBaseAddress:$
    70. MES20DBInterruptLine:$
    71. MES21DBInterruptPin:$
    72. MES22DBMinimumGrant:$
    73. MES23DBMaximumLatency:$
    74. BNDB?
    75. DN_FNDB?
    76. R_VALUEDD?
    77. V_VIDDW?
    78. V_DIDDW?
    79. V_PCICMDDW?
    80. V_PCISTSDW?
    81. V_RIDDB?
    82. V_CLCDDD?
    83. V_CALNDB?
    84. V_LATDB?
    85. V_HDRDB?
    86. V_BISTDB?
    87. V_BADR0DD?
    88. V_BADR1DD?
    89. V_BADR2DD?
    90. V_BADR3DD?
    91. V_BADR4DD?
    92. V_BADR5DD?
    93. V_EXPOMDD?
    94. V_INTLNDB?
    95. V_INTPINDB?
    96. V_MINGNTDB?
    97. V_MAXLATDB?
    98. DATAENDS
    99. CODESEGMENTPARAUSE16
    100. ASSUMECS:CODE,DS:DATA,SS:SSTACK
    101. START:MOVAX,DATA
    102. MOVDS,AX
    103. MOVAX,0B101H;查找PCIBIOS
    104. INT1AH
    105. JNCJUDGE1;如果CF被置位,则PCIBIOS不存在
    106. MOVDX,OFFSETMES1;显示不存在信息
    107. MOVAH,09H
    108. INT21H
    109. JMPEXIT
    110. JUDGE1:CMPAH,00H
    111. JZJUDGE2;如果不等,则PCIBIOS不存在
    112. MOVDX,OFFSETMES1;显示不存在信息
    113. MOVAH,09H
    114. INT21H
    115. JMPEXIT
    116. JUDGE2:CMPEDX,ICP;如果EDX中放的是"PCI"则说明PCIBIOS存在
    117. JZFIND
    118. MOVDX,OFFSETMES1;否则错误的设备
    119. MOVAH,09H
    120. INT21H
    121. JMPEXIT
    122. FIND:MOVAX,0B102H;找到了PCIBIOS,再查找指定PCI设备
    123. MOVCX,5933H;板卡的设备的ID
    124. MOVDX,10E8H;板卡的供应商ID
    125. MOVSI,0;索引
    126. INT1AH
    127. JNCREAD
    128. MOVDX,OFFSETMES
    129. MOVAH,09H
    130. INT21H
    131. JMPEXIT
    132. READ:MOVBN,BH;保存总线号
    133. MOVDN_FN,BL;保存设备号
    134. CALLKENTER;回车换行
    135. MOVDX,OFFSETMES0
    136. MOVAH,09H
    137. INT21H
    138. CALLKENTER;回车换行
    139. MOVDX,OFFSETMES3;输出供应厂商ID
    140. MOVAH,09H
    141. INT21H
    142. CALLKENTER
    143. MOVDX,OFFSETMES4;输出设备的ID
    144. MOVAH,09H
    145. INT21H
    146. CALLKENTER
    147. MOVAX,0B109H;读命令寄存器,单字操作
    148. MOVBH,BN
    149. MOVBL,DN_FN
    150. MOVDI,PCICMD
    151. INT1AH
    152. JCERROR
    153. MOVDX,OFFSETMES5;显示PCI命令寄存器内容
    154. MOVAH,09H
    155. INT21H
    156. MOVAX,02H
    157. CALLSHOW
    158. CALLKENTER
    159. MOVAX,0B109H;读PCI状态寄存器内容,单字操作
    160. MOVBH,BN
    161. MOVBL,DN_FN
    162. MOVDI,PCISTS
    163. INT1AH
    164. JCERROR
    165. MOVDX,OFFSETMES6;显示状态寄存器内容
    166. MOVAH,09H
    167. INT21H
    168. MOVAX,02H
    169. CALLSHOW
    170. CALLKENTER
    171. MOVAX,0B108H;版本号,单字节操作
    172. MOVBH,BN
    173. MOVBL,DN_FN
    174. MOVDI,RID
    175. INT1AH
    176. JCERROR
    177. MOVDX,OFFSETMES7;显示版本号
    178. MOVAH,09H
    179. INT21H
    180. MOVAX,01H
    181. CALLSHOW
    182. CALLKENTER
    183. MOVAX,0B108H;读中断引脚信号,单字节操作
    184. MOVBH,BN
    185. MOVBL,DN_FN
    186. MOVDI,INTLN
    187. INT1AH
    188. JCERROR
    189. MOVDX,OFFSETMES20;显示中断引脚
    190. MOVAH,09H
    191. INT21H
    192. MOVAX,01H
    193. CALLSHOW
    194. CALLKENTER
    195. MOVAX,0B10AH;读配置寄存器,双字操作
    196. MOVBH,BN;PCI设备的总线号
    197. MOVBL,DN_FN;设备以及功能号,入口参数
    198. MOVDI,BADR0
    199. INT1AH
    200. JCERROR
    201. MOVDX,OFFSETMES13;基址寄存器0
    202. MOVAH,09H
    203. INT21H
    204. MOVAX,04H
    205. CALLSHOW
    206. CALLKENTER
    207. MOVAX,0B10AH;读配置寄存器,双字操作
    208. MOVBH,BN;PCI设备的总线号
    209. MOVBL,DN_FN;设备及功能号,入口参数
    210. MOVDI,BADR1
    211. INT1AH
    212. JCERROR
    213. PUSHECX
    214. MOVDX,OFFSETMES14;基址寄存器1
    215. MOVAH,09H
    216. INT21H
    217. MOVAX,04H
    218. POPECX
    219. CALLSHOW
    220. CALLKENTER
    221. MOVAX,0B10AH;读配置寄存器,双字操作
    222. MOVBH,BN;PCI设备的总线号
    223. MOVBL,DN_FN;设备及功能号,入口参数
    224. MOVDI,BADR2
    225. INT1AH
    226. JCERROR
    227. MOVDX,OFFSETMES15;基地址寄存器2
    228. MOVAH,09H
    229. INT21H
    230. MOVAX,04H
    231. CALLSHOW
    232. CALLKENTER
    233. MOVAX,0B10AH;读配置寄存器,双字操作
    234. MOVBH,BN;PCI设备的总线号
    235. MOVBL,DN_FN;设备及功能号,入口参数
    236. MOVDI,BADR3
    237. INT1AH
    238. JCERROR
    239. MOVDX,OFFSETMES16;基地址寄存器3
    240. MOVAH,09H
    241. INT21H
    242. MOVAX,04H
    243. CALLSHOW
    244. CALLKENTER
    245. MOVAX,0B10AH;读配置寄存器,双字操作
    246. MOVBH,BN;PCI设备的总线号
    247. MOVBL,DN_FN;设备及功能号,入口参数
    248. MOVDI,BADR4
    249. INT1AH
    250. JCERROR
    251. MOVDX,OFFSETMES17;基地址寄存器4
    252. MOVAH,09H
    253. INT21H
    254. MOVAX,04H
    255. CALLSHOW
    256. JMPEXIT
    257. ERROR:CALLKENTER
    258. MOVDX,OFFSETMES2;显示读错误信息
    259. MOVAH,09H
    260. INT21H
    261. EXIT:MOVAH,4CH;返回DOS
    262. INT21H
    263. KENTERPROC
    264. MOVDL,0AH
    265. MOVAH,02H
    266. INT21H
    267. MOVDL,0DH
    268. MOVAH,02H
    269. INT21H
    270. RET
    271. KENTERENDP
    272. SHOWPROCNEAR;显示子程序
    273. PUSHDX
    274. PUSHDI
    275. PUSHBX
    276. MOVDI,OFFSETR_VALUE
    277. MOV[DI],ECX;保存获取的数据
    278. ADDDI,AX
    279. DECDI
    280. MOVCX,AX
    281. C1:MOVAL,[DI]
    282. PUSHAX
    283. SHRAL,4
    284. ANDAL,0FH;取高4位
    285. CMPAL,0AH;是否是A以上的数
    286. JBC2
    287. ADDAL,07H
    288. C2:ADDAL,30H
    289. MOVBH,AL
    290. POPAX
    291. ANDAL,0FH;取低4位
    292. CMPAL,0AH
    293. JBC3
    294. ADDAL,07H
    295. C3:ADDAL,30H
    296. MOVBL,AL
    297. MOVAH,2;显示十六进制数对应的ACSII码
    298. MOVDL,BH
    299. INT21H
    300. MOVDL,BL
    301. INT21H
    302. DECDI
    303. LOOPC1
    304. POPBX
    305. POPDI
    306. POPDX
    307. RET
    308. SHOWENDP
    309. CODEENDS
    310. ENDSTART



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
现场总线系统的功能安全评价