版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、淺談Lin ux內(nèi)核開發(fā)之PCI設備驅(qū)動Page 1 of 7Gen erated by Foxit PDF Creator ? Foxit Software For evaluati on only.http:/www.ibm.eom/developerworks/c n/linu x/l-cn-pci/i ndex.html2010-1-4淺談Lin ux內(nèi)核開發(fā)之PCI設備驅(qū)動Page 5 of 7Gen erated by Foxit PDF Creator ? Foxit Software For evaluati on only.淺談Linux內(nèi)核開發(fā)之PCI設備驅(qū)動級別:初級趙
2、昊翔(haoxiang), 軟件工程師,Cisco Systems2009年6月11日本文介紹了 PCI的基本概念,并從Linux內(nèi)核的角度出發(fā),介紹了 PCI設備的初始化以及配置。PCI介紹隨著計算機應用的不斷更新和發(fā)展(比如百兆網(wǎng)卡、視屏流等),計算機內(nèi)數(shù)據(jù)傳輸?shù)膸捯笤絹碓礁撸?傳統(tǒng)內(nèi)部總線帶寬已經(jīng)遠遠不能滿足這些應用的需要,因此人們推出了PCI總線標準PCI是Peripheral Compo nent In terco nn ect的縮寫,它因為高性能、低成本以及良好的擴展性而在計算機系統(tǒng)中被廣泛使用。上至服務器,下至嵌入式設備都能找到它的身影。圖1顯示了一個標準PCI總線的組織結(jié)構(gòu)
3、圖。圖1.標準PCI總線的組織結(jié)構(gòu)圖從圖中我們可以看出 PCI總線架構(gòu)主要被分成三部分:1. PCI設備。符合PCI總線標準的設備就被稱為 PCI設備,PCI總線架構(gòu)中可以包含多個 PCI設備。圖 中的Audio、LAN都是一個PCI設備。PCI設備同時也分為主設備和目標設備兩種,主設備是一次訪問 操作的發(fā)起者,而目標設備則是被訪問者。2. PCI總線。PCI總線在系統(tǒng)中可以有多條,類似于樹狀結(jié)構(gòu)進行擴展,每條PCI總線都可以連接多個PCI設備/橋。上圖中有兩條 PCI總線。3. PCI橋。當一條PCI總線的承載量不夠時,可以用新的PCI總線進行擴展,而 PCI橋則是連接PCI總線之間的紐帶。
4、圖中的 PCI橋有兩個,一個橋用來連接處理器、內(nèi)存以及PCI總線,而另外一條則用來連接另一條PCI總線。PCI總線操作PCI總線操作表示主設備向目標設備所發(fā)起的操作請求,最多有16種類型。主要類型有:IO方式讀/寫,Memory方式讀/寫, Configuration 方式讀/寫等。PCI配制空間對于軟件開發(fā)者來說,該如何對PCI設備進行編程呢? PCI總線標準中定義了一套配置空間寄存器用于讀取或者設置PCI設備的信息。每個 PCI設備/橋都有自己的配置空間寄存器。配置空間共有256字節(jié),設備類型不同,其配置空間的布局也不盡相同。設備類型的區(qū)分可以通過配置空間內(nèi) 的Header Type寄存器
5、(OEh)進行,該寄存器值為 00h表示當前設備是一個 PCI設備,01h表示當前設備 是一個PCI橋。配置空間的前64字節(jié)是配置空間起始段,它對于每種類型的設備都是相同的。顯示了PCI設備的配置空間起始段。圖2. PCI設備的配置空間起始段r 31lfi1501Dexict IDYwidor IDOOhStatusCommand04hClai? Cod;Rfv sion IDOS!13:S7三幵定:甘Tim?:OChAddress Register 1lOhBa?* Addr 已耳壯衛(wèi)即已214hAddress 栗fgwer 3l$h3as? Addrtss Renier 4ICh3asf
6、Address?2Ch24hCsidtu? CIS PointyJ$hSubsvtrem IDSubsyieir*ndoi ID2ChExpansion R0: Base Addrtss匚 apabitj pQin:er34h畑 口I2込.GritIntirrupr PinInrerrupT Line3Ch圖3顯示了 PCI橋的配置空間起始段圖3. PCI橋的配置空間起始段r 3i16150IDA'endor IDOOh04hSiacuCommail JCodeReiisioa IDro$hBISTHeader TypeL arene v Timer口血:皺SizeroctiBat?
7、Addr?tt R亡工即烈 1LOhr uhLatency TimerSuborduiare 虹 XtunberSecQndaryF Bui NumberP-unary Bi肝 Xumlwrl£h iChI O Lun:10 Bas-f20112-lh2ShPE良:邊他栄 >Ie;uon-?refccajt;e 匚詢0疔 3a=e匕出換討新b叢315? Upper 32 3i:sLimi: Vppr 32 別的r:chI O Limit Upper 16 BibIO E於亡 Upper 1(5 Bits30h34hRe 汎 wdCapabiliiie? PokierHxpano
8、n ROM Base Addres?3$hBridce ControlInternipt PinInter nipt Lin?pCh配置空間寄存器有些是只讀的,有些是可寫的,下面介紹幾個在編程時會用到的寄存器Device ID 和 Ven dor ID 寄存器這兩個寄存器分別存放了設備信息和廠商信息(值在 0x0000和OxFFFF之間,但不能取OxFFFF ),因此軟 件開發(fā)者可以通過讀取這兩個寄存器的值,并與0xFFFF比較,從而判斷當前設備是否有效。Comma nd 和 Status 寄存器Comma nd寄存器存放了設備的配置信息,比如是否允許 Memory/IO方式的總線操作、是否為
9、主設備等。 Status寄存器存放了設備的狀態(tài)信息,比如中斷狀態(tài)、錯誤狀態(tài)等。Header Type 寄存器這個寄存器前面曾經(jīng)提過,它定義了設備類型,比如 PCI設備、PCI橋等。Base Address 寄存器這個寄存器有三個作用。1該寄存器存放了 Memory/IO訪問空間的起始地址。2該寄存器存放了 Memory/IO訪問空間的大小,這個數(shù)據(jù)可以通過下面的方式讀出:a. 往寄存器里寫 OxFFFFFFFF ;b. 讀出寄存器的值,并取反;c. 將上一步的值加上1后就是該空間的大小。3. 該寄存器定義了這段地址空間的訪問類型(Memory方式還是IO方式)。PCI設備最多有6個Base A
10、ddress 寄存器,而 PCI橋最多有2個Base Address 寄存器。Subord in ate Bus Number,Sec ondary Bus Number 禾口 Primary Bus Number 寄存器這三個寄存器只在 PCI橋配置空間中存在,因為 PCI橋會連接兩條PCI總線,上行的總線被稱為 Primary Bus,下行的總線被稱為 Secondary Bus , Primary Bus Number 和 Secondary Bus Number 寄存器分別存儲 了上行和下行總線的編號,而Subordi nate Bus Number 寄存器則是存儲了當前橋所能直接或者
11、間接訪問到的總線的最大編號。PPC對于PCI的支持通常PPC會提供一個(或更多的) PCI控制器來連接PCI總線,通過PCI控制器,CPU可以發(fā)起 Con figuration讀寫操作來訪問所連接的所有PCI設備/橋的配置空間。每個 PCI設備/橋都會用(總線號,設備號,功能號)這一組合來進行編號,因此在PCI控制器中輸入設備對應的(總線號,設備號,功能號)就能尋址到具體的PCI設備/橋。以PPC8548為例,它提供了兩個寄存器來實現(xiàn)Configuration操作,分別是CFG_ADDR和CFG_DATA寄存器,如果想對某個設備發(fā)起讀/寫操作,則首先將該設備的(總線號,設備號,功能號)寫入 C
12、FG_ADDR中,這代表尋址一個具體的PCI設備,同時在CFG_ADDR中寫入需要操作的配置空間寄存器的編號,最后從CFG_DATA中讀取/寫入相應的數(shù)據(jù)即可。Linux內(nèi)核對PCI的支持Linux內(nèi)核(2.6版本)在初始化之初就對所有PCI設備進行了掃描并且配制,具體操作分為下面幾個步驟。編譯時的PCI配制如果想要Linux內(nèi)核支持PCI,首先需要對其配制文件進行相應的修改,在config文件中需要配置下面的宏參數(shù)。1. Linux提供了 PCI配制全局控制宏參數(shù) CONFIG_PCI,它控制著PCI控制器和設備是否能夠被配制的流程,因此該宏值需要被設置成“ Y一2. 對于某些處理器來說,比
13、如PPC85XX、PPC83XX等,它們提供了兩個或者更多的PCI控制器,因此在 config 文件中專門提供了諸如 CONFIG_MPC85xx_PCI2 、CONFIG_MPC83xx_PCI2 等宏參數(shù),它 們控制著第二個(或更多的)PCI控制器的配置流程,因此如果需要使用第二個(或更多的)PCI控制器時,需要將相應的宏值設置成“ Y'在編譯內(nèi)核之前,如果在 config文件中提供了以上宏參數(shù)的設置,則編譯出來的內(nèi)核映像提供了對于PCI支持的功能。PCI相關(guān)數(shù)據(jù)結(jié)構(gòu)Linux提供了三類數(shù)據(jù)結(jié)構(gòu)用以描述PCI控制器、PCI設備以及PCI總線。PCI控制器PCI控制器用pci_con
14、troller結(jié)構(gòu)來描述,它有以下幾個主要的屬性:? index :該屬性標志PCI控制器的編號。? next :該屬性指向下一個 PCI控制器,通過next屬性,PCI控制器可以形成一個單向鏈表。? first_busno :該屬性標志了連接在該控制器上第一條總線的編號。? last_busno :該屬性標志了連接在該控制器上最后一條總線的編號。? ops :該屬性標志了當前 PCI控制器所對應的PCI配制空間讀寫操作函數(shù)。? io_space :該屬性標志了當前 PCI控制器所支持的10地址空間。? mem_space :該屬性標志了當前 PCI控制器所支持的Memory地址區(qū)間。? cf
15、g_addr :該屬性標志了當前 PCI控制器發(fā)起Configuration訪問方式時所需要寫入的地址空間。? cfg_data :該屬性標志了當前 PCI控制器發(fā)起Configuration訪問方式時所需要讀寫的數(shù)據(jù)空間。? bus :該屬性標志了當前 PCI控制器所連接的PCI總線,它對應的數(shù)據(jù)結(jié)構(gòu)是pci_bus。PCI總線PCI總線用pci_bus結(jié)構(gòu)來描述,它有以下幾個主要的屬性:? pare nt :可通過該屬性索引到上層PCI總線。? self :該屬性標志了連接的上行PCI橋(對應的數(shù)據(jù)結(jié)構(gòu)是pci_dev )。? children :該屬性標志了總線連接的所有PCI子總線鏈表
16、。? devices :該屬性標志了總線連接的所有PCI設備鏈表。? ops :該屬性標志了總線上所有PCI設備的配制空間讀寫操作函數(shù)。? number :該屬性標志了當前 PCI總線的編號。? primary :該屬性標志了 PCI上行總線編號。? secondary :該屬性標志了 PCI下行總線編號。? subordinate :該屬性標志了能夠訪問到的最大總線編號。? resource :該屬性標志了 Memory/IO 地址空間。PCI設備PCI設備用pci_dev結(jié)構(gòu)來描述,它有以下幾個主要的屬性:? global_list : Linux定義了一個全局列表來索引所有的PCI設備,
17、該屬性標志了這個全局列表的首指針。? bus :該屬性標志了當前設備所在的PCI總線(對應的數(shù)據(jù)結(jié)構(gòu)是pci_bus )。? devfn :該屬性標志了設備編號和功能編號。? ven dor :該屬性標志了供應商編號。? device :該屬性標志了設備編號。? driver :該屬性標志了設備對應的驅(qū)動代碼(對應的數(shù)據(jù)結(jié)構(gòu)是pci_driver )。? irq :該屬性標志了中斷號。? resource :該屬性標志了 Memory/IO 地址區(qū)間。內(nèi)核里的PCI數(shù)據(jù)結(jié)構(gòu)圖當Linux內(nèi)核在做PCI初始化工作時,它會根據(jù)圖4建立一個由pci_controller、pci_bus和pci_de
18、v三者組成的一個組織結(jié)構(gòu)圖。根據(jù)這個結(jié)構(gòu),軟件開發(fā)者可以很方便的通過_PCI控制器索引到9每個 PCT設備或者PCI總線。http:/www.ibm.eom/developerworks/c n/linu x/l-cn-pci/i ndex.html2010-1-4淺談Lin ux內(nèi)核開發(fā)之PCI設備驅(qū)動Page 6 of 7Gen erated by Foxit PDF Creator ? Foxit Software For evaluati on only.http:/www.ibm.eom/developerworks/c n/linu x/l-cn-pci/i ndex.html20
19、10-1-4淺談Lin ux內(nèi)核開發(fā)之PCI設備驅(qū)動Page 9 of 7Gen erated by Foxit PDF Creator ? Foxit Software For evaluati on only.圖4.組織結(jié)構(gòu)圖p ci_c ontrollff卩 c uparent cyiiliire 口self dwices bus-unesinext>busbu弓sib'ingsiblingp&.devpci_d 的pcLdevPCI控制器初始化parttit c:iLd:en next self decs bus=Opci_de-vpci_de-| nextnex
20、tsiblingsibling當一個支持PCI的內(nèi)核映像開始運行時,它會在系統(tǒng)初始化時對PPC85XX 為例)。PCI進行配置。函數(shù)調(diào)用鏈如下所示(以圖5.函數(shù)調(diào)用鏈內(nèi)核從start_kernel()函數(shù)處開始進行系統(tǒng)初始化,一直執(zhí)行到mpc85xx_setup_hose()函數(shù)處便是配制 PCI控制器以及連接在該控制器上所有設備的過程。一 一所有這些函數(shù)的定義處都加上了 _init的符號類型,由 _init修飾的函數(shù)表明在鏈接最終的內(nèi)核映像時,這些 函數(shù)將被放在一個特殊的初始化代碼段中(.init.text,可以在鏈接文件 vmlinux.lds.S中找到相關(guān)的段描述), 這個初始化代碼段會
21、隨著內(nèi)核初始化完成而被釋放。在這一步驟中,內(nèi)核會對它所支持的所有PCI控制器進行初始化工作,每個PCI控制器都對應一個pci_controller屬性的變量,初始化工作會在這些變量中設置Memory/IO訪問空間的起始地址以及結(jié)束地址、設置當前PCI控制器所連接的第一條和最后一條PCI總線編號等等。PCI自動掃描系統(tǒng)如何知道當前連接了多少PCI設備?有多少根PCI總線?每個PCI設備的訪問空間如何配置?等等。這些都得靠PCI自動掃描來完成。PCI自動掃描主要做下面的工作:1. 掃描PCI總線,識別PCI總線上的所有設備。2. 對于連接在PCI總線上的所有PCI橋進行總線編號。3. 對于連接在P
22、CI總線上的所有PCI設備和PCI橋進行Memory/IO 訪問空間的配置。這部分代碼在 pciauto_bus_scan() 函數(shù)中(位于 arch/ppc/syslib/pci_auto.c 中)。識別PCI總線上的設備PCI總線掃描的原理是從總線 0掃描到總線255,對于每條總線,系統(tǒng)都會掃描所有(總線號,設備號,功 能號),通過 Con figuration方式讀出每個設備的 Device ID和Vendor ID寄存器,如果這兩個寄存器的值是 個有效值(非OxFFFF ),則說明當前設備是個有效的PCI設備/橋。進而再讀取該設備的 Header Type寄存器,如果該寄存器為1,則表
23、示當前設備是 PCI橋,否則是PCI設備。對所有PCI總線進行編號PCI橋如何知道它所連接的 PCI總線情況呢?這就需要對PCI橋進行總線編號。前面介紹過PCI橋提供了Primary Bus Number 、Sec on dary Bus Number 和 Subordi nate Bus Number 三個寄存器用于標志該橋所連接 的PCI總線,下面通過一個示例來說明內(nèi)核對于PCI總線是如何進行編號的。圖6.示例1. 系統(tǒng)運行初始,Bus A為0,通過上面的PCI總線掃描得到連接在 Bus A上的PCI橋(即圖中的Bridge 1 )。2. 下面開始設置Bridge 1的Bus寄存器。將Pr
24、imary Bus Number 寄存器設置成Bus A的編號,即0。將Secondary Bus Number 寄存器設置成 Bus B的編號,它的值等于(Bus A + 1 ),也就是1。由于 暫時無法知道該橋所能訪問的所有下行總線數(shù)目,Subordinate Bus Number 寄存器暫時設置成 OxFF。3. 當掃描完所有Bus A上所有(設備號,功能號)后,開始掃描Bus B,Bus B的編號在掃描完Bus A后已經(jīng)得到,為1。Bus B的掃描方法同步驟(1),先掃描出Bus B上的PCI橋(即圖中的Bridge 2),然后配置 Primary Bus Number 寄存器為 1,
25、 Secondary Bus Number 寄存器為 2,而 Subordinate Bus Number 寄存器依然為 OxFF。4. Bus B掃描完后得到Bus C的編號,為2。下面開始掃描 Bus C,因為Bus C上沒有PCI橋,于是在 掃描完其它(設備號,功能號)后, Bus C的掃描結(jié)束。5. 由于Bridge 2所能訪問到的最大 Bus編號是2,因此重新設置 Bridge 2的Subordinate Bus Number 寄存器為2。6. 由于Bridge 1所能訪問到的最大 Bus編號也是2,因此重新設置 Bridge 1的Subordinate Bus Number 寄存器
26、為2。7. 總線編號結(jié)束。配置訪問空間當系統(tǒng)需要訪問 PCI設備時,它需要產(chǎn)生 Configuration、Memory或者IO的讀寫操作,對于 Memory/IO 的 訪問方式來說,它們需要定義一個地址范圍,落在這個地址范圍的操作會被認為是相應的Memory/IO的讀寫操作。通常PCI設備提供了最多6組Base Address寄存器,在PCI總線掃描時,每當掃描出一個可用的PCI設備后,會對該設備的 Base Address寄存器進行Memory/IO訪問空間的配置。而對于PCI橋來說,它只提供了 2組Base Address寄存器,當PCI總線掃描出一個 PCI橋后,也會對該橋 的Base
27、 Address寄存器進行Memory/IO訪問空間的配置。需要注意的是,在構(gòu)建系統(tǒng)之初,需要明確當前系統(tǒng)的地址范圍,戈y分出特定的物理地址作為PCI Memory或者PCI IO空間,在給PCI設備/橋進行訪問空間配置時,就是取事先約定的地址空間中的某段地址進行配 置,所有設備/橋的訪問地址不能沖突。定義系統(tǒng)的Memory/IO 訪問空間是在 mpc85xx_setup_hose() 函數(shù)中提供的(位于 arch/ppc/syslib/ppc85xx_setup.c 中)。PCI設備和總線初始化這一操作在pcibiosnit()函數(shù)中進行(位于 arch/ppc/kernel/pci.c 中)。它會在前面操作結(jié)束后,對PCI總線和PCI設備分別分配pci_bus和pci_dev類型的節(jié)點,并建立如所示的組織結(jié)構(gòu)關(guān)系。Lin ux的PCI設備初始化Linux會將PCI的相關(guān)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房產(chǎn)地產(chǎn)行業(yè)前臺客服要點
- 婚紗店保安工作總結(jié)
- 導師工作總結(jié)(匯集8篇)
- 2023年內(nèi)科護理工作總結(jié)范文
- 2024年度知識產(chǎn)權(quán)法律風險評估與管理合同3篇
- 場景設計師工作總結(jié)
- 2024年度校園食堂早餐配送服務合同3篇
- 機械課程設計網(wǎng)
- 少先隊活動總結(jié)(7篇)
- 2024農(nóng)場現(xiàn)代農(nóng)業(yè)示范區(qū)物業(yè)管理與智慧農(nóng)業(yè)技術(shù)合作合同3篇
- 2024-2030年中國除顫儀行業(yè)市場分析報告
- 歷史-安徽省皖江名校聯(lián)盟2025屆高三12月聯(lián)考試題和答案
- 2024年高一上學期期末數(shù)學考點《壓軸題》含答案解析
- 成都中醫(yī)藥大學博士申請
- 公司業(yè)績匯報及規(guī)劃
- 統(tǒng)編版(2024版)七年級上冊歷史期末復習課件
- 【MOOC】工程制圖-北京科技大學 中國大學慕課MOOC答案
- 招標代理崗位職責規(guī)章制度
- 2024年電大勞動與社會保障法期末考試題庫及答案
- MOOC 傳熱學-西安交通大學 中國大學慕課答案
- 2024年四川省自然資源投資集團有限責任公司招聘筆試參考題庫附帶答案詳解
評論
0/150
提交評論