PCI總線(xiàn)與接口技術(shù)
1、PCI總線(xiàn)的發(fā)展歷史
本文引用地址:http://dyxdggzs.com/article/201612/328784.htm1990年,起源于Intel架構開(kāi)發(fā)實(shí)驗室,全稱(chēng)是Peripheral Component Interconnect,首先在服務(wù)器中使用,代替了原來(lái)的MCA以及EISA,EISA直到2000年才宣告退出歷史舞臺。直到1994年,才開(kāi)始在PC上廣泛使用,代替了原來(lái)的VESA。在1995年的中期,蘋(píng)果電腦也開(kāi)始使用PCI總線(xiàn)電氣規范。后來(lái)PCI也增加了許多新的功能,比如66MHz,3.3V標準,以及133MHz的PCI-X。2004年,出現了PCI-Express,原來(lái)的PCI總線(xiàn)電氣規范被稱(chēng)為了傳統PCI(Conventional PCI)。
2、PCI總線(xiàn)地址空間
獨立的內存以及IO接口,由軟件分配。而另外一個(gè)地址空間-PCI配置空間(PCI Configuration Space),使用獨立的地址,允許軟件決定每一個(gè)連入的設備需要多少內存以及IO地址空間。通過(guò)設備配置空間寄存器的設置,每一個(gè)設備至多可以申請6個(gè)內存以及IO地址空間。PCI配置空間還包括了連入設備的相關(guān)信息,根據這些信息,操作系統可以方便地使用相應的驅動(dòng)來(lái)使用這些設備。為了使PCI總線(xiàn)公平地使用PCI總線(xiàn),提供了一種等待計時(shí)的功能,計時(shí)器在設備獲得了總線(xiàn)使用權時(shí)以PCI時(shí)鐘信號的速率開(kāi)始計時(shí),直到減為零,設備釋放總線(xiàn)占有權。
3、關(guān)于PCI的中斷
四個(gè)中斷,屬于電平觸發(fā)方式(邊沿觸發(fā)方式的中斷容易丟失)。單功能設備只是使用INTA#,多功能設備使用多個(gè)中斷。四個(gè)中斷通過(guò)PCI橋(兩個(gè)PCI總線(xiàn)之間)映射到系統中斷上,所以軟件無(wú)從得知是那個(gè)PCI中斷。后來(lái)的PCI加入了消息信號中斷的機制,PCI-Express使用的也是消息信號中斷機制,而沒(méi)有物理中斷線(xiàn)。
4、PCI電氣規范
PCI卡的尺寸,長(cháng)度為174.63mm,高度為36.068~106.68mm。一下是一幅PCI個(gè)引腳定義的圖。
5、PCI設備的初始化
機器上電的時(shí)候,配置軟件必須掃描PCI總線(xiàn),確定有哪些PCI設備,然后加載相應的驅動(dòng)程序。所有PCI設備都必須實(shí)現PCI協(xié)議規定必須的配置寄存器。而對PCI配置訪(fǎng)問(wèn)實(shí)際上就是訪(fǎng)問(wèn)設備的配置寄存器。
6、PCI配置空間
配置空間各項數據說(shuō)明:
廠(chǎng)商識別碼(Vendor ID):標識設備的制造者,有PCI SIG來(lái)分配。0FFFH表示未配置任何設備。
設備識別碼(Device ID):標識特定的設備,具體代碼由廠(chǎng)商分配。
版本ID,Revision ID:指定一個(gè)設備特有的版本號。
Class Code(分類(lèi)代碼):用于設備分類(lèi)。0BH處為基本分類(lèi)代碼;0A處為子分類(lèi)代碼;09H處為標識一個(gè)專(zhuān)用的寄存器級編程接口,便于設備的軟件可以與設備交互數據。
命令寄存器(Command):為發(fā)出和響應PCI總線(xiàn)命令提供了對設備粗略的控制。
狀態(tài)寄存器(Status):用于記錄PCI總線(xiàn)有關(guān)操作的狀態(tài)信息,系統對該寄存器的讀操作無(wú)特殊要求。
基地址寄存器(Base Address Registers):供地址映射使用,使PCI的IO映射以及內存映射與具體設備無(wú)關(guān)。
擴展ROM的基地址寄存器(Expansion ROM Base Address):用來(lái)處理那些配置了局部EPROM或者Flash ROM的基地址和大小。Cache大小寄存器:用來(lái)指定系統中Cache行的長(cháng)度,每個(gè)參加Cache協(xié)議的設備都要使用該寄存器。
延時(shí)計時(shí)器:該寄存器以PCI總線(xiàn)時(shí)鐘為單位指定PCI總線(xiàn)主設備的延遲計時(shí)器。
內含自測寄存器:可選的寄存器,用作內含自測試的控制與狀態(tài)寄存器。
中斷引腳寄存器(Interrupt Pin):用來(lái)表示設備使用了哪個(gè)PCI中斷引腳。
中斷線(xiàn)寄存器(Interrupt Line):用來(lái)表示設備中的中斷引腳與系統可編程控制器8259的哪個(gè)中斷輸入線(xiàn)相連接。
MAX_GNT表示設備需要多長(cháng)的突發(fā)傳輸時(shí)間。MAX_LAT表示對PCI總線(xiàn)進(jìn)行訪(fǎng)問(wèn)的頻繁程度。
Card CIS Pointer:由在卡總線(xiàn)和PCI之間共享芯片的設備實(shí)現。
子系統廠(chǎng)商標識和子系統標識(Subsystem Vendor ID):用于惟一地標識設備所駐留的插入卡和子系統。即插即用操作系統可以定位正確的驅動(dòng)程序,裝載到存儲器。
7、PCI擴展ROM
通過(guò)執行擴展ROM存放的代碼來(lái)完成與設備相關(guān)的初始化,同時(shí)也可能完成系統引導功能。該機制允許擴展ROM中含有幾個(gè)不同的映像,以適應不同的機器和處理器結構。
凡是支持擴展ROM的設備,必須支持按任意字節組合方式對ROM進(jìn)行訪(fǎng)問(wèn),特別強調的是要支持雙字(DWORD)訪(fǎng)問(wèn)。擴展ROM中的信息安排要與現有的適合于ISA和EISA以及MC適配器的Intel X86擴展ROM中的頭標區兼容。頭標區中所給信息經(jīng)過(guò)了擴充,從而使適配器的功能進(jìn)一步優(yōu)化使用,從而可以使擴展ROM中的代碼在運行期間所使用的存儲空間最小。
PCI擴展ROM中代碼從不在原地執行,而是將代碼從ROM中拷貝到RAM中執行。這樣可以在初始化和運行時(shí)動(dòng)態(tài)地確定代碼長(cháng)度,并且能夠改善代碼的執行速度。
PCI對于不同的系統和處理器配置都應該包含其編碼映像。每個(gè)映像由ROM首區(映像開(kāi)始處)+數據配置區(映像的第64KB范圍內)組成。
ROM首區內容
偏移 | 長(cháng)度 | 值 | 說(shuō)明 |
00H~01H | 2 | 55AAH | ROM標簽字節 |
02H~17H | 22 | XX | 保留 |
18H~19H | 2 | XX | 到PCI數據結構指針 |
數據配置區
偏移量 | 長(cháng)度 | 說(shuō)明 | 偏移量 | 長(cháng)度 | 說(shuō)明 |
00H~03H | 4 | 標簽,字符串"PCID" | 0DH~0FH | 3 | 分類(lèi)代碼 |
04H~05H | 2 | 供應商識別碼 | 10H~11H | 2 | 映像長(cháng)度 |
06H~07H | 2 | 設備識別碼 | 12H~13H | 2 | 代碼數據的修改級別 |
08H~09H | 2 | 對重要產(chǎn)品數據的指針 | 14H~14H | 1 | 代碼類(lèi)型 |
0AH~0BH | 2 | PCI數據結構長(cháng)度 | 15H~15H | 1 | 指示標志 |
0CH~0CH | 1 | PCI數據結構修改 | 16H~17H | 2 | 保留 |
8、關(guān)于PCI設備的初始化
系統POST首先檢查PCI設備在配置空間是否使用了擴展ROM基地址寄存器(即是否有擴展ROM),若使用了,POST將ROM映射到地址空間中一個(gè)未用的部分。
9、PCI BIOS
其主要作用有以下兩點(diǎn):
- 為應用軟件或者PCI總線(xiàn)設備或者板卡提供服務(wù)調用。
- 初始化每個(gè)系統PCI設備。PCI BIOS輪流查詢(xún)每個(gè)PCI插槽,查找存在的PCI設備,讀取存在設備配置空間的頭標區,以決定設備的廠(chǎng)商號,類(lèi)型和存儲需求等內容。并且將分配的I/O或存儲空間地址回寫(xiě)到每個(gè)設備配置空間的基地址寄存器中。
- PCI BIOS調用的入口以及返回值說(shuō)明,對80x86機器,調用功能號為1AH,入口參數在A(yíng)X中,返回值在A(yíng)H中。下面列舉的是比較常用的,更多說(shuō)明請參考PCI BIOS規則說(shuō)明書(shū)。
功能說(shuō)明 | 入口參數(AX) | 返回值說(shuō)明 | 出口參數(AH) |
PCI BIOS存在查詢(xún) | B101H | 成功調用 | 00H |
查找PCI 設備 | B102H | 不支持的功能 | 81H |
查找PCI 設備的類(lèi)代碼 | B103H | 錯誤的廠(chǎng)商號 | 83H |
產(chǎn)生特殊周期 | B106H | 未找到設備 | 86H |
讀配置寄存器-單字節操作 | B108H | 錯誤的寄存器號 | 87H |
讀配置寄存器-單字操作 | B109H | 設置失敗 | 88H |
讀配置寄存器-雙字操作 | B10AH | 緩沖區太小 | 89H |
寫(xiě)配置寄存器-單字操作 | B10BH | ||
寫(xiě)配置寄存器-單字節操作 | B10CH | ||
寫(xiě)配置寄存器-雙字節操作 | B10DH | ||
取得中斷線(xiàn)路選項 | B10EH | ||
設置PCI中斷 | B10FH |
- 下面是一個(gè)關(guān)于通過(guò)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"則說(shuō)明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;保存總線(xiàn)號
- MOVDN_FN,BL;保存設備號
- CALLKENTER;回車(chē)換行
- MOVDX,OFFSETMES0
- MOVAH,09H
- INT21H
- CALLKENTER;回車(chē)換行
- MOVDX,OFFSETMES3;輸出供應廠(chǎng)商ID
- MOVAH,09H
- INT21H
- CALLKENTER
- MOVDX,OFFSETMES4;輸出設備的ID
- MOVAH,09H
- INT21H
- CALLKENTER
- MOVAX,0B109H;讀命令寄存器,單字操作
- MOVBH,BN
- MOVBL,DN_FN
- MOVDI,PCICMD
- INT1AH
- JCERROR
- MOVDX,OFFSETMES5;顯示PCI命令寄存器內容
- MOVAH,09H
- INT21H
- MOVAX,02H
- CALLSHOW
- CALLKENTER
- MOVAX,0B109H;讀PCI狀態(tài)寄存器內容,單字操作
- MOVBH,BN
- MOVBL,DN_FN
- MOVDI,PCISTS
- INT1AH
- JCERROR
- MOVDX,OFFSETMES6;顯示狀態(tài)寄存器內容
- 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設備的總線(xiàn)號
- MOVBL,DN_FN;設備以及功能號,入口參數
- MOVDI,BADR0
- INT1AH
- JCERROR
- MOVDX,OFFSETMES13;基址寄存器0
- MOVAH,09H
- INT21H
- MOVAX,04H
- CALLSHOW
- CALLKENTER
- MOVAX,0B10AH;讀配置寄存器,雙字操作
- MOVBH,BN;PCI設備的總線(xiàn)號
- MOVBL,DN_FN;設備及功能號,入口參數
- MOVDI,BADR1
- INT1AH
- JCERROR
- PUSHECX
- MOVDX,OFFSETMES14;基址寄存器1
- MOVAH,09H
- INT21H
- MOVAX,04H
- POPECX
- CALLSHOW
- CALLKENTER
- MOVAX,0B10AH;讀配置寄存器,雙字操作
- MOVBH,BN;PCI設備的總線(xiàn)號
- MOVBL,DN_FN;設備及功能號,入口參數
- MOVDI,BADR2
- INT1AH
- JCERROR
- MOVDX,OFFSETMES15;基地址寄存器2
- MOVAH,09H
- INT21H
- MOVAX,04H
- CALLSHOW
- CALLKENTER
- MOVAX,0B10AH;讀配置寄存器,雙字操作
- MOVBH,BN;PCI設備的總線(xiàn)號
- MOVBL,DN_FN;設備及功能號,入口參數
- MOVDI,BADR3
- INT1AH
- JCERROR
- MOVDX,OFFSETMES16;基地址寄存器3
- MOVAH,09H
- INT21H
- MOVAX,04H
- CALLSHOW
- CALLKENTER
- MOVAX,0B10AH;讀配置寄存器,雙字操作
- MOVBH,BN;PCI設備的總線(xiàn)號
- 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;顯示十六進(jìn)制數對應的ACSII碼
- MOVDL,BH
- INT21H
- MOVDL,BL
- INT21H
- DECDI
- LOOPC1
- POPBX
- POPDI
- POPDX
- RET
- SHOWENDP
- CODEENDS
- ENDSTART
評論