<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > PCI總線與接口技術(shù)

          PCI總線與接口技術(shù)

          作者: 時間:2016-12-12 來源:網(wǎng)絡(luò) 收藏
          簡單地探討PCI配置空間,PCI ROM,以及PCI BIOS的調(diào)用。

          1、PCI總線的發(fā)展歷史

          本文引用地址:http://www.ex-cimer.com/article/201612/328784.htm

          1990年,起源于Intel架構(gòu)開發(fā)實驗室,全稱是Peripheral Component Interconnect,首先在服務(wù)器中使用,代替了原來的MCA以及EISA,EISA直到2000年才宣告退出歷史舞臺。直到1994年,才開始在PC上廣泛使用,代替了原來的VESA。在1995年的中期,蘋果電腦也開始使用PCI總線電氣規(guī)范。后來PCI也增加了許多新的功能,比如66MHz,3.3V標(biāo)準(zhǔn),以及133MHz的PCI-X。2004年,出現(xiàn)了PCI-Express,原來的PCI總線電氣規(guī)范被稱為了傳統(tǒng)PCI(Conventional PCI)。

          2、PCI總線地址空間

          獨立的內(nèi)存以及IO接口,由軟件分配。而另外一個地址空間-PCI配置空間(PCI Configuration Space),使用獨立的地址,允許軟件決定每一個連入的設(shè)備需要多少內(nèi)存以及IO地址空間。通過設(shè)備配置空間寄存器的設(shè)置,每一個設(shè)備至多可以申請6個內(nèi)存以及IO地址空間。PCI配置空間還包括了連入設(shè)備的相關(guān)信息,根據(jù)這些信息,操作系統(tǒng)可以方便地使用相應(yīng)的驅(qū)動來使用這些設(shè)備。為了使PCI總線公平地使用PCI總線,提供了一種等待計時的功能,計時器在設(shè)備獲得了總線使用權(quán)時以PCI時鐘信號的速率開始計時,直到減為零,設(shè)備釋放總線占有權(quán)。

          3、關(guān)于PCI的中斷

          四個中斷,屬于電平觸發(fā)方式(邊沿觸發(fā)方式的中斷容易丟失)。單功能設(shè)備只是使用INTA#,多功能設(shè)備使用多個中斷。四個中斷通過PCI橋(兩個PCI總線之間)映射到系統(tǒng)中斷上,所以軟件無從得知是那個PCI中斷。后來的PCI加入了消息信號中斷的機(jī)制,PCI-Express使用的也是消息信號中斷機(jī)制,而沒有物理中斷線。

          4、PCI電氣規(guī)范

          PCI卡的尺寸,長度為174.63mm,高度為36.068~106.68mm。一下是一幅PCI個引腳定義的圖。

          5、PCI設(shè)備的初始化

          機(jī)器上電的時候,配置軟件必須掃描PCI總線,確定有哪些PCI設(shè)備,然后加載相應(yīng)的驅(qū)動程序。所有PCI設(shè)備都必須實現(xiàn)PCI協(xié)議規(guī)定必須的配置寄存器。而對PCI配置訪問實際上就是訪問設(shè)備的配置寄存器。

          6、PCI配置空間

          配置空間各項數(shù)據(jù)說明:

          廠商識別碼(Vendor ID):標(biāo)識設(shè)備的制造者,有PCI SIG來分配。0FFFH表示未配置任何設(shè)備。

          設(shè)備識別碼(Device ID):標(biāo)識特定的設(shè)備,具體代碼由廠商分配。

          版本ID,Revision ID:指定一個設(shè)備特有的版本號。

          Class Code(分類代碼):用于設(shè)備分類。0BH處為基本分類代碼;0A處為子分類代碼;09H處為標(biāo)識一個專用的寄存器級編程接口,便于設(shè)備的軟件可以與設(shè)備交互數(shù)據(jù)。

          命令寄存器(Command):為發(fā)出和響應(yīng)PCI總線命令提供了對設(shè)備粗略的控制。

          狀態(tài)寄存器(Status):用于記錄PCI總線有關(guān)操作的狀態(tài)信息,系統(tǒng)對該寄存器的讀操作無特殊要求。

          基地址寄存器(Base Address Registers):供地址映射使用,使PCI的IO映射以及內(nèi)存映射與具體設(shè)備無關(guān)。

          擴(kuò)展ROM的基地址寄存器(Expansion ROM Base Address):用來處理那些配置了局部EPROM或者Flash ROM的基地址和大小。Cache大小寄存器:用來指定系統(tǒng)中Cache行的長度,每個參加Cache協(xié)議的設(shè)備都要使用該寄存器。

          延時計時器:該寄存器以PCI總線時鐘為單位指定PCI總線主設(shè)備的延遲計時器。

          內(nèi)含自測寄存器:可選的寄存器,用作內(nèi)含自測試的控制與狀態(tài)寄存器。

          中斷引腳寄存器(Interrupt Pin):用來表示設(shè)備使用了哪個PCI中斷引腳。

          中斷線寄存器(Interrupt Line):用來表示設(shè)備中的中斷引腳與系統(tǒng)可編程控制器8259的哪個中斷輸入線相連接。

          MAX_GNT表示設(shè)備需要多長的突發(fā)傳輸時間。MAX_LAT表示對PCI總線進(jìn)行訪問的頻繁程度。

          Card CIS Pointer:由在卡總線和PCI之間共享芯片的設(shè)備實現(xiàn)。

          子系統(tǒng)廠商標(biāo)識和子系統(tǒng)標(biāo)識(Subsystem Vendor ID):用于惟一地標(biāo)識設(shè)備所駐留的插入卡和子系統(tǒng)。即插即用操作系統(tǒng)可以定位正確的驅(qū)動程序,裝載到存儲器。

          7、PCI擴(kuò)展ROM

          通過執(zhí)行擴(kuò)展ROM存放的代碼來完成與設(shè)備相關(guān)的初始化,同時也可能完成系統(tǒng)引導(dǎo)功能。該機(jī)制允許擴(kuò)展ROM中含有幾個不同的映像,以適應(yīng)不同的機(jī)器和處理器結(jié)構(gòu)。

          凡是支持?jǐn)U展ROM的設(shè)備,必須支持按任意字節(jié)組合方式對ROM進(jìn)行訪問,特別強(qiáng)調(diào)的是要支持雙字(DWORD)訪問。擴(kuò)展ROM中的信息安排要與現(xiàn)有的適合于ISA和EISA以及MC適配器的Intel X86擴(kuò)展ROM中的頭標(biāo)區(qū)兼容。頭標(biāo)區(qū)中所給信息經(jīng)過了擴(kuò)充,從而使適配器的功能進(jìn)一步優(yōu)化使用,從而可以使擴(kuò)展ROM中的代碼在運行期間所使用的存儲空間最小。

          PCI擴(kuò)展ROM中代碼從不在原地執(zhí)行,而是將代碼從ROM中拷貝到RAM中執(zhí)行。這樣可以在初始化和運行時動態(tài)地確定代碼長度,并且能夠改善代碼的執(zhí)行速度。

          PCI對于不同的系統(tǒng)和處理器配置都應(yīng)該包含其編碼映像。每個映像由ROM首區(qū)(映像開始處)+數(shù)據(jù)配置區(qū)(映像的第64KB范圍內(nèi))組成。

          ROM首區(qū)內(nèi)容

          偏移

          長度

          說明

          00H~01H

          2

          55AAH

          ROM標(biāo)簽字節(jié)

          02H~17H

          22

          XX

          保留

          18H~19H

          2

          XX

          到PCI數(shù)據(jù)結(jié)構(gòu)指針

          數(shù)據(jù)配置區(qū)

          偏移量

          長度

          說明

          偏移量

          長度

          說明

          00H~03H

          4

          標(biāo)簽,字符串"PCID"

          0DH~0FH

          3

          分類代碼

          04H~05H

          2

          供應(yīng)商識別碼

          10H~11H

          2

          映像長度

          06H~07H

          2

          設(shè)備識別碼

          12H~13H

          2

          代碼數(shù)據(jù)的修改級別

          08H~09H

          2

          對重要產(chǎn)品數(shù)據(jù)的指針

          14H~14H

          1

          代碼類型

          0AH~0BH

          2

          PCI數(shù)據(jù)結(jié)構(gòu)長度

          15H~15H

          1

          指示標(biāo)志

          0CH~0CH

          1

          PCI數(shù)據(jù)結(jié)構(gòu)修改

          16H~17H

          2

          保留

          8、關(guān)于PCI設(shè)備的初始化

          系統(tǒng)POST首先檢查PCI設(shè)備在配置空間是否使用了擴(kuò)展ROM基地址寄存器(即是否有擴(kuò)展ROM),若使用了,POST將ROM映射到地址空間中一個未用的部分。

          9、PCI BIOS

          其主要作用有以下兩點:

          • 為應(yīng)用軟件或者PCI總線設(shè)備或者板卡提供服務(wù)調(diào)用。
          • 初始化每個系統(tǒng)PCI設(shè)備。PCI BIOS輪流查詢每個PCI插槽,查找存在的PCI設(shè)備,讀取存在設(shè)備配置空間的頭標(biāo)區(qū),以決定設(shè)備的廠商號,類型和存儲需求等內(nèi)容。并且將分配的I/O或存儲空間地址回寫到每個設(shè)備配置空間的基地址寄存器中。
          • PCI BIOS調(diào)用的入口以及返回值說明,對80x86機(jī)器,調(diào)用功能號為1AH,入口參數(shù)在AX中,返回值在AH中。下面列舉的是比較常用的,更多說明請參考PCI BIOS規(guī)則說明書。

          功能說明

          入口參數(shù)(AX)

          返回值說明

          出口參數(shù)(AH)

          PCI BIOS存在查詢

          B101H

          成功調(diào)用

          00H

          查找PCI 設(shè)備

          B102H

          不支持的功能

          81H

          查找PCI 設(shè)備的類代碼

          B103H

          錯誤的廠商號

          83H

          產(chǎn)生特殊周期

          B106H

          未找到設(shè)備

          86H

          讀配置寄存器-單字節(jié)操作

          B108H

          錯誤的寄存器號

          87H

          讀配置寄存器-單字操作

          B109H

          設(shè)置失敗

          88H

          讀配置寄存器-雙字操作

          B10AH

          緩沖區(qū)太小

          89H

          寫配置寄存器-單字操作

          B10BH

          寫配置寄存器-單字節(jié)操作

          B10CH

          寫配置寄存器-雙字節(jié)操作

          B10DH

          取得中斷線路選項

          B10EH

          設(shè)置PCI中斷

          B10FH

          • 下面是一個關(guān)于通過PCI BIOS調(diào)用讀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;否則錯誤的設(shè)備
            119. MOVAH,09H
            120. INT21H
            121. JMPEXIT
            122. FIND:MOVAX,0B102H;找到了PCIBIOS,再查找指定PCI設(shè)備
            123. MOVCX,5933H;板卡的設(shè)備的ID
            124. MOVDX,10E8H;板卡的供應(yīng)商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;保存設(shè)備號
            134. CALLKENTER;回車換行
            135. MOVDX,OFFSETMES0
            136. MOVAH,09H
            137. INT21H
            138. CALLKENTER;回車換行
            139. MOVDX,OFFSETMES3;輸出供應(yīng)廠商ID
            140. MOVAH,09H
            141. INT21H
            142. CALLKENTER
            143. MOVDX,OFFSETMES4;輸出設(shè)備的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命令寄存器內(nèi)容
            154. MOVAH,09H
            155. INT21H
            156. MOVAX,02H
            157. CALLSHOW
            158. CALLKENTER
            159. MOVAX,0B109H;讀PCI狀態(tài)寄存器內(nèi)容,單字操作
            160. MOVBH,BN
            161. MOVBL,DN_FN
            162. MOVDI,PCISTS
            163. INT1AH
            164. JCERROR
            165. MOVDX,OFFSETMES6;顯示狀態(tài)寄存器內(nèi)容
            166. MOVAH,09H
            167. INT21H
            168. MOVAX,02H
            169. CALLSHOW
            170. CALLKENTER
            171. MOVAX,0B108H;版本號,單字節(jié)操作
            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;讀中斷引腳信號,單字節(jié)操作
            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設(shè)備的總線號
            197. MOVBL,DN_FN;設(shè)備以及功能號,入口參數(shù)
            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設(shè)備的總線號
            209. MOVBL,DN_FN;設(shè)備及功能號,入口參數(shù)
            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設(shè)備的總線號
            223. MOVBL,DN_FN;設(shè)備及功能號,入口參數(shù)
            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設(shè)備的總線號
            235. MOVBL,DN_FN;設(shè)備及功能號,入口參數(shù)
            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設(shè)備的總線號
            247. MOVBL,DN_FN;設(shè)備及功能號,入口參數(shù)
            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;保存獲取的數(shù)據(jù)
            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以上的數(shù)
            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;顯示十六進(jìn)制數(shù)對應(yīng)的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



          關(guān)鍵詞: PCI總線接口技

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();