PCI總線配置與應用_第1頁
PCI總線配置與應用_第2頁
PCI總線配置與應用_第3頁
PCI總線配置與應用_第4頁
PCI總線配置與應用_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、 這篇文章是進行VxWorks下PCI驅(qū)動開發(fā)的基礎,故將其放在首位。(當然更首位的是您有一定的Vxworks使用和開發(fā)經(jīng)驗)主要介紹PCI總線配置空間,如何查看和讀取PCI配置相關信息,最后有VxWorks下相關的示例代碼。       關鍵字: PCI總線 vxworks PCI配置空間 內(nèi)存映射 PlxPCI9056       我把個人認為比較重要的地方:用粗體和藍色進行了標識。       如果您

2、對文章有異議,請?zhí)岢鰧氋F意見,您的名字和意見,將出現(xiàn)在下面!專用術語解釋:PCI:Peripheral Component Interconnect的縮寫,一種由英特爾(Intel)公司1991年推出的用于定義局部總線的標準。POST: Power On Self Test的縮寫,即上電自檢,接通微機的電源后,系統(tǒng)將執(zhí)行一個自我檢查的例行程序,是BIOS功能的一部分。1 引言      在眾多的實時操作系統(tǒng)(RTOS)中,美國WindRiver公司的嵌入式多任務VxWorks實時操作系統(tǒng)是目前世界上用戶數(shù)量最大的實時操作系統(tǒng)已成功應用于航空航天

3、、武器控制、艦船、通信、科學研究等領域,如在美國的火星探測器、愛國者導彈上均使用了VxWorks實時操作系統(tǒng)。當前在我國該操作系統(tǒng)也占有較大的市場分額。VxWorks操作系統(tǒng)專門對PCI設備提供支持,包括PCI總線驅(qū)動和一套PCI支持函數(shù)。配置總線上的設備還與硬件的體系結(jié)構和BSP支持程度相關。本文結(jié)合PCI原理。談談實際使用中的經(jīng)驗與體會。(上面的是中國的客套話)2 PCI總線架構21典型架構      在典型的PCI總線系統(tǒng)架構中處理器、高速緩存和內(nèi)存子系統(tǒng)通過PCI橋連接至JJPCI總線。橋提供一種高速通道使得處理器可以直接訪問PCI設備

4、。還提供高帶寬的通道允許PCI直接訪問主存。橋也包含了可選擇的功能,比如總線仲裁和熱插拔。22總線號、設備號、功能號       PCI總線可以通過橋芯片級連按與CPU總線所隔的橋數(shù)目和同一層總線的掃描順序,從0開始依次編號,擴展最多N256,0256就是總線號;在指定的局部總線上按硬件掃描順序從O開始依次編號,擴展最多到32。032就是設備號;在一個多功能PCI設備上,最多可以實現(xiàn)8種功能,按設備上配置存儲區(qū)的順序從0開始依次編號,稱其為功能號,一般的設備只有一個功能。這三個號組合起來就可確定唯一的一個PCI設備。以及該設備上的某項

5、功能。通過這三個參數(shù)就可操作PCI設備。3 PCI配置空間       根據(jù)PCI規(guī)范。每個PCI設備都要有一個PCI配置空間,容量最大為256字節(jié),稱為配置寄存器。配置寄存器是PCI設備的硬件與其初始化軟件信息交接的地方,軟件可以通過它對設備進行識別和監(jiān)控。31 配置空間組織結(jié)構   256字節(jié)的空間分為頭標區(qū)和設備關聯(lián)區(qū)兩部分,如圖1所示:      PCI設備的頭標區(qū)中寄存器布局和格式大致相同,其布局如圖2所示。頭標區(qū)又分為兩部分,頭16個字節(jié)定義都相同,余下

6、的48個字節(jié)根據(jù)設備的功能類別不同而布局不同。位于0Eh的頭標識類型字段規(guī)定了后48個字節(jié)所用布局。目前的規(guī)范只規(guī)定了00h和01hN個頭標識類型:01h用于PCItoPCI橋。00h用于其余PCI設備。32配置空間的功能      類型O配置空間頭標區(qū)里的寄存器實現(xiàn)了很多功能,這里介紹常用的幾類。(1)設備識別      在頭標區(qū)內(nèi)有五個寄存器是與一個PCI設備的識別有關的。配置軟件通過訪問這些寄存器很容易確定在該PCI總線上有什么PCI設備。這五個寄存器都是只讀的。  &

7、#160;   廠商標識:標識設備的制造廠商,由PCt規(guī)范的權威組織SIG統(tǒng)一分配,以保證唯一性。如Intel公司的標識碼為。8086h”“FFFFh”是無效標識。     設備標識:標識某一設備,由制造廠商分配。     修訂版本標識:標識設備具體的修訂版本,由廠商選擇。     頭標類型:表明頭標區(qū)中10h到3Fh字節(jié)空間的布局類型和該設備是否是多功能設備。位7用來標識一個多功能設備,為1則該設備是多功能設備,為oN是單一功能設備。位6到0規(guī)定頭標區(qū)中

8、10h到3Fh字節(jié)的布局類型,如上所述,目前只有兩類:00h和01h。    分類代碼:該寄存器有三個字節(jié)段:高字節(jié)(0Bh)是基本分類碼,租略地對功能分類:中字節(jié)(0Ah)是子分類碼。標識具體功能;低字節(jié)(09h)標識所用寄存器一級的編程接1:3。(2)設備控制       位于配置空間04h偏移地址處的命令寄存器是控制設備產(chǎn)生和響應PCI周期的,是可讀寫寄存器。其各位定義和作用如下(這里僅描述軟件常用的位):     I/O空間使能位:控制l,O空間訪問的響應,

9、為1時,允許設備響應IO空間的訪問。為0時禁止。     存儲空間使能位:控制本設備對存儲器空間訪問的響應。為1時允許為0時禁止。(3)基地址      頭標區(qū)中有6個雙字的基地址寄存器,在加電時,6個寄存器向POST軟件反映該設備需要多少存儲器空間和IO空間。POST軟件就此了解到PCI總線上有哪些存儲設備和IO設備。再根據(jù)它們的容量需求將其映射定位到適當?shù)拇鎯ζ鞯刂泛虸O地址。并把起始地址寫入基地址寄存器,再啟動系統(tǒng)。     基地址寄存器<?xml:na

10、mespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />      位0只讀。用來表示此寄存器申請的是存儲器空間還是I0空間。為1則該基址寄存器用于I0空間映射。此時位1是保留位,位231用來把從寄存器映射到系統(tǒng)IO空間,POST再把系統(tǒng)分配的系統(tǒng)IO空間基地址寫回寄存器的231位。      如果位0為0則要映射到存儲器空間。位13是只讀的其中12是類型編碼,表示映射要求,表1列

11、出了類型編碼:64位寄存器占據(jù)兩個字其后面的基地址寄存器的偏移地址要向后推一個雙字,但總?cè)萘坎蛔?,保?個雙字大小。       地址映射       映射過程分為兩個步驟:       (a)確定空間類別和容量要求:讀取各設備基址寄存器,獲取需要的空間和容量。類別可通過最低位0位判斷。容量判斷是把寄存器中的基地址字段的若干低位從硬件上連接到地,從PCI總線向寄存器全寫一1。再讀回其值。由于接了地,讀回的值中,從bi

12、t4(存儲器類型)和bit2(IO類型)到最高位返回的O的個數(shù)反映了所需空間。       (b)分配基地址:POST軟件分配起始地址,并向各寄存器高位字段寫入分配空間的基地址,把寄存器對應的存儲器和lo映射到系統(tǒng)物理地址空間去。3.3 如何得到PCI配置信息?     1.如果你是初次做PCI的驅(qū)動,建議你安裝WinDriver,使用這個工具可以方便的查看你的PCI板卡的信息,比如:VENDOR_ID, DEVICE_ID, BAR基地址,中斷號等等,可以直觀上感受一下PCI配置。 

13、    2.也可以使用Vxworks下相關的PCI函數(shù),比如:     STATUS pciDeviceShow(intbusNo/* bus number */)     STATUS pciHeaderShow(intbusNo,intdeviceNo,intfuncNo)33 VxWorks對PCI設備的支持        VxWorks操作系統(tǒng)對PCI設備提供了專門的支持庫,用戶可以利用該

14、庫實現(xiàn)對PCI設備的控制:通過庫里的配置函數(shù),可以動態(tài)尋找指定PCI設備,并可以讀取和修改該設備的配置空間內(nèi)容。在配置空間的映射過程中這些函數(shù)非常有用,下面列舉幾個常用的函數(shù),并簡單描述其功能以供參考:pciFindDevice: 查找指定設備,并獲得其總線號,設備號,功能號pciConfigInLong:以雙字為單位讀入指定PCI設備配置空間的配置。sysMmuMapAdd:對指定內(nèi)存大小進行映射。PcIIntConnect:掛接中斷服務程序PciIntDIsconnect: 清除中斷服務程序的掛接PCI支持庫中的函數(shù)較多且功能強大,詳細內(nèi)容可以參照開發(fā)工具Tornado所提供的幫助手冊。3

15、4 VxWorks中PCI設備的地址映射        VxWorks操作系統(tǒng)在加電過程中會對設備執(zhí)行地址映射操作,以便程序正確訪問設備。在使用全面的MMU管理組件時。這個過程是系統(tǒng)自動完成的,但如果系統(tǒng)只包含了基本的MMU功能。用戶就必須手動修改BSP來配置。先簡單了解一下內(nèi)存映射表。在sysLibC中有一張表sysPhysMemDesc描述了系統(tǒng)物理內(nèi)存的分配,如下所示:PHYS_MEMDESC sysPhysMemDesc】=地址和長度參數(shù)必須按頁對齊(4kB4MB的倍數(shù))。f低端內(nèi)存。(void。)LOCAL_MEM

16、LOCALADRS,(void。)LOCALMEMLOCALDRS,0xa0000VMSTATE_MASK FOR_ALL,VMSTATE_FOR_MEMOS,顯示內(nèi)存等。(void。)Oxa0000(void。)Oxa0000,Ox60000。VMSTATEMASK FOR_ALL,VMSTATEFORMEMlO,f為操作系統(tǒng)保留的高端內(nèi)存(void+)Oxl 00000,(void+)Oxl 00000,Ox080000。VMSTATE_MASK_FORALL,VMSTATEFORMEMOS,。r為應用程序保留的高端內(nèi)存。(void)Oxl 800000,(void)Oxl 80000,L

17、OCAL MEMSIZEOxl80000,在sysMemTop()中會改變。,VM-sTATE_MASK_FOR_ALL,VMSTATE_FORMEMOS,用于動態(tài)映射的條目+DUMMYMMUENTRYDUMMYJMUENTRY,:      上面描述了系統(tǒng)物理內(nèi)存在邏輯內(nèi)存中所分配的空間,系統(tǒng)引導時會根據(jù)這里的描述管理內(nèi)存空間。手動配置PCI設備的方法就是根據(jù)PCI基地址寄存器的值在源碼中修改上表。但是通常不推薦這樣做,不然將不能適應硬件環(huán)境的變化而局限了BSP的使用。通常使用的方法是半自動配置方法。所謂半自動方法是相對于包含完整MMU的Vx

18、Works所采用的自動化方法。自動化配置方法將自動發(fā)現(xiàn)PCI設備并自動為其分配所需空間。但是僅包含了基本MMU的VxWorks并不會自動完成上表配置,還需要其他輔助步驟幫助系統(tǒng)映射內(nèi)存,包括為所有設備分配不沖突的內(nèi)存,以及編程使系統(tǒng)找到指定的PCI設備并分配空間。4 PCI設備配置應用實例4. 1自動配置方法       首先根據(jù)設備類型f如顯示設備、網(wǎng)絡設備)查詢總線,以此獲取此類設備的PCI總線號、設備號、功能號、廠商號和設備標識,此處假設系統(tǒng)中沒有同類的設備。然后。根據(jù)總線號、設備號、功能號獲取該設備的PCI配置空間信息,并寫入

19、MMU用于系統(tǒng)物理內(nèi)存分配。42顯示設備的配置        顯示設備的配置,首先要包括VxWo rks系統(tǒng)組件。basic MMU”基本內(nèi)存控制單元。然后再將PCI顯示設備的內(nèi)存空間配置到MMU里面,否則該內(nèi)存空間的訪問會出現(xiàn)異常。如果該內(nèi)存空間是預先知道的,可以在syslibc的sysPhysMemDesc表中靜態(tài)配置:否則需要通過動態(tài)查詢得到,然后再調(diào)用MMU配置函數(shù)加入MMU表。其簡要過程如下:       (1) 在PCI總線上查找顯示設備,并獲取其總線號

20、、設備號和功能號;       (2) 根據(jù)這三個號來讀取該設備的內(nèi)存基地址和需要的內(nèi)存大小(注意:內(nèi)存大小是從開始位到最高位所返回的零的個數(shù),需要用戶自己計算。內(nèi)存地址要去掉低位非地址含義的位。);       (3) 在sysLibc的sysHwlnit()函數(shù)中調(diào)用配置函數(shù)sysMmuMapAdd,該函數(shù)將基地址和內(nèi)存大小配置入MMU表,整個配置工作就完成了。5. 實戰(zhàn)代碼 /*Copyright (C), 2010-08-09 - 2010-08-1X,&#

21、160;File name    : PlxPCI9056.c, PCI9056驅(qū)動程序Author       : qcj_21    Version      : V1.0       Date         : 2010-08-05Description :&#

22、160;    此文件為PlxPCI9056的驅(qū)動程序,主要作用是讀取PCI9056的配置信息,將PCI上的8路AD信息映射到內(nèi)存中由于8路AD的整個內(nèi)存空間需求大于1000Byte, 通過Windows下的WinDriver程序查看PCI的基地址,確定BAR2為8路AD的映射空間。特別注意:將PCI9056映射到內(nèi)存空間以后,對該空間的讀寫操作,要用操作內(nèi)存的方式,比如:          *(volatile unsigned char*)(ulPortAddr+ucRe

23、gister) ;Others:        /其它內(nèi)容的說明History:       /修改歷史記錄列表,每條修改記錄應包括修改日期、修改者及修改內(nèi)容簡述     1. Author: Date: Modification:           2. .*/#include <vxWorks.h>#inclu

24、de <drv/pci/pciConfigLib.h>#include <drv/pci/pciLocalBus.h>#include <errnoLib.h>#include <intLib.h>#include <iv.h>#include <sysLib.h>#include <vmLib.h>#include "config.h"#include "PlxPCI9056.h"  #define    VENDOR_

25、ID 0x10B5       /*廠商標識,標識設備的制造廠商*/#define    DEVICE_ID 0x9056       /*設備標識,由制造廠商分配*/LOCAL UINT32 g_nMemBaseAddress = 0;    /*PCI BAR2內(nèi)存映射空間*/LOCAL UINT32 g_nMemSpaceLen    = 0;   

26、/*PIC 內(nèi)存映射空間*/LOCAL UINT32 g_nIOBaseAddress = 0;    /*PCI IO空間*/LOCAL UINT32 g_nCAN_IRQNum     = 0;    /*PCI CAN卡的中斷號*/*/* Function : PlxPCI9056的初始化/*            1. 根據(jù)VENDORID, DEVICEID, Index查找自

27、己的PCI設備/*            2. 讀取PCI配置信息/*            3. 對內(nèi)存空間進行映射/* Input    : 無/* RetValue : 成功返回OK,失敗返回ERROR/* Author   : qcj_21 at 2010-8-5 14:02:19/*/STATUS PCI_CAN_In

28、it(void)int    nIndex            = 0; int    nPciBusNO         = 0;   /*總線號,    0 255*/int    nDeviceNO    

29、60;    = 0;   /*設備號,     0 32*/int    nFuncNO           = 0;   /*設備功能號, 0 8*/UINT32 nMemBaseAddress   = 0;   /*內(nèi)存映射的基地址*/UINT32 nIOBaseAddress   

30、 = 0;   /*IO基地址*/UINT32 nMemSpaceLen      = 0;   /*內(nèi)存映射空間的容量即長度*/UINT32 nIOSpaceLen       = 0;   /*IO空間容量*/UINT32 nIRQNum           = 0;   /*中斷號*/UINT32 nC

31、ommand          = 0;STATUS nStatus           = 0;UINT32 nTemp   = 0;UINT32 nOffset = 0;/*查找指定設備,并獲得其總線號,設備號,功能號*/if( OK != pciFindDevice(VENDOR_ID, DEVICE_ID, nIndex, &nPciBusNO, &nDevice

32、NO, &nFuncNO) )printf("pciFindDevice() functon not find the device !");return ERROR;elseprintf("Find the PCI device !, nIndex = %d, nPciBusNO = %d, nDeviceNO = %d, nFuncNO = %d n", nIndex, nPciBusNO, nDeviceNO, nFuncNO);pciConfigInLong(nPciBusNO, nDeviceNO, nFuncNO, PCI_CFG_C

33、OMMAND, &nCommand);pciConfigOutLong(nPciBusNO, nDeviceNO, nFuncNO, PCI_CFG_COMMAND, nCommand | CSR_MEM_EN | CSR_BM_EN );   nStatus = pciConfigInLong(nPciBusNO, nDeviceNO, nFuncNO, PCI_CFG_BASE_ADDRESS_2, &nMemBaseAddress); /*得到內(nèi)存映射基地址*/if(OK != nStatus) printf("Cannot fin

34、d memory base address register n");nStatus = pciConfigInLong(nPciBusNO, nDeviceNO, nFuncNO, PCI_CFG_BASE_ADDRESS_1, &nIOBaseAddress); /*得到IO映射基地址*/if(OK != nStatus) printf("Cannot find IO base address register n");nStatus = pciConfigInByte(nPciBusNO, nDeviceNO, nFuncNO, PCI_CFG_DE

35、V_INT_LINE,   &nIRQNum);        /*得到中斷號*/if(OK != nStatus) printf("Cannot find Interupt Register. n");g_nCAN_IRQNum = nIRQNum;printf("nMemBaseAddress=%x, nIOBaseAddress=%x, nIRQNum=%d n", nMemBaseAddress, nIOBaseAddress, nIRQN

36、um);if(0 = (nMemBaseAddress&PCI_BAR_SPACE_MEM)    /bit0 = 0, 表示內(nèi)存映射/*首先需要判斷所需內(nèi)存的大小,根據(jù)PCI的規(guī)范,將內(nèi)容全1,寫回就可以得到大小*/pciConfigOutLong(nPciBusNO, nDeviceNO, nFuncNO, PCI_CFG_BASE_ADDRESS_2, 0xFFFFFFFF); pciConfigInLong (nPciBusNO, nDeviceNO, nFuncNO, PCI_CFG_BASE_ADDRESS_2, &nMemSpaceLen); nMemSpaceLen = nMemSpaceLen;    /* 取反 */*nMemSpaceLen += 1;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論