版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、PCI設備驅動知識點分類:linux編程2010123116:55132人閱讀評論(0)收藏舉報申明:此文章并非本人所寫,只是加以修改和備注原帖請看::hi.linux_kernelblogcategypci%C9%E8%B1%B8%C7%FD%B6%AF那位大大可是個大牛人,上面有不少好東東!一、PCI簡介PCI是一種外設總線規(guī)范。我們先來看一下什么是總線:總線是一種傳輸信號的路徑或信道。典型情況是,總線是連接于一個或多個導體的電氣連
2、線,總線上連接的所有設備可在同一時間收到所有的傳輸內容??偩€由電氣接口和編程接口組成。本文討論Linux下的設備驅動,所以,重點關注編程接口。PCI是PeripheralComponentInterconnect(外圍設備互聯)的簡稱,是普遍使用在桌面及更大型的計算機上的外設總線。PCI架構被設計為ISA標準的替代品,他有三個主要目標:獲得在計算機和外設之間傳輸數據時更好的性能;盡可能的平臺無關;簡化往系統(tǒng)中添加和刪除外設的工作。二、P
3、CI尋址從目前開始,我想盡可能通過一些實際的例子來說明問題,而減少理論方面的問題的描述,因為,相關的理論的東西,能在其他地方找到。我們先來看一個例子,我的計算機裝有1G的RAM,1G以后的物理內存地址空間都是外部設備IO在系統(tǒng)內存地址空間上的映射。prociomem描述了系統(tǒng)中所有的設備IO在內存地址空間上的映射。我們來看地址從1G開始的第一個設備在prociomem中是怎么描述的:40000000400003ff:0000:00:1f
4、.1這是個PCI設備,40000000400003ff是他所映射的內存地址空間,占據了內存地址空間的1024bytes的位置,而0000:00:1f.1則是個PCI外設的地址以冒號和逗號分隔為4個部分:第一個16位表示域;第二個8位表示一個總線編號,2^8256,故每個域最多能有256個總線;第三個5位表示一個設備號,每個總線最多能掛載32個設備;最后是3位,表示功能號,每個設備最多能有8種功能,也就是最多能夠對應8個邏輯設備,每種功能
5、都唯一的對應一個pci_dev結構體。注:因為PCI規(guī)范允許單個系統(tǒng)擁有高達256個總線,但對于大型系統(tǒng)而言,這是不夠的,所以,引入了域的概念。由此,我們能得出上述的PCI設備的地址是0號域0號總線上的31號設備上的1號功能。那上述的這個PCI設備到底是什么呢?下面是我的計算機上的lspci命令的輸出:00:00.0Hostbridge:IntelCpation82845845(Brookdale)ChipsetHostBridge(r
6、ev04)00:01.0PCIbridge:IntelCpation82845845(Brookdale)ChipsetAGPBridge(rev04)00:1d.0USBController:IntelCpation82801CACAMUSB(Hub#1)(rev02)00:1d.1USBController:IntelCpation82801CACAMUSB(Hub#2)(rev02)00:1e.0PCIbridge:IntelCp
7、ation82801MobilePCIBridge(rev42)00:1f.0ISAbridge:IntelCpation82801CAMISABridge(LPC)(rev02)00:1f.1IDEinterface:IntelCpation82801CAMIDEU100(rev02)prociopt中得到驗證。為了能看到實際的運行效果,我們選擇8139too網卡作為示例從該網卡的linux驅動程式中裁剪相關代碼。一個PCI設備的驅動
8、程式必須要向內核中的PCI核心描述自己。同時,他也必須告訴PCI核心自己能夠驅動哪些設備。下面,就介紹兩個相關的重要數據結構。用于定義該驅動程序支持的不同類型的PCI設備列表structpci_device_id__u32vend__u32device指定設備的PCI廠商和設備ID,如驅動程序可以處理任何廠商或設備ID,可使用值PCI_ANY_ID__u32subvend__u32subdevice指定設備的PCI子系統(tǒng)廠商和設備ID,
9、如驅動程序可處理任何子系統(tǒng)廠商或設備ID,可使用PCI_ANY_ID__u32class__u32class_mask可使驅動程序指定一種PCI類(class)設備,如果可以處理任何類型,則使用PCI_ANY_IDkernel_ulong_tdriver_data如果需要,則用來保存PCI驅動程序用于區(qū)分不同設備的信息用于向PCI核心描述PCI驅動程序structpci_driverstructlist_headnodename在內核的
10、所有PCI驅動程序的名字必須唯一,通常設置為和驅動程序模塊名相同的名字structmoduleownerconststructpci_device_idid_table驅動所能操縱的設備id列表。int(probe)(structpci_devdevconststructpci_device_idid)指向PCI驅動程序中的探測函數,用于插入新設備void(remove)(structpci_devdev)移除設備int(suspend
11、)(structpci_devdevpm_message_tstate)指向掛起函數,掛起狀態(tài)以state傳遞,該函數可選int(resume)(structpci_devdev)指向恢復函數,總是在被掛起之后調用,該函數也可選int(enable_wake)(structpci_devdevpci_power_tstateintenable)使能喚事件void(shutdown)(structpci_devdev)structdevi
12、ce_driverdriverstructpci_dynidsdynidspci_device_id唯一標識一個PCI設備。他的幾個成員依次分別表示:廠商號、設備號、子廠商號、子設備號、類別、類別掩碼(類可分為基類、子類)、私有數據。每一個PCI設備的驅動程式都有一個pci_device_id的數組,用于告訴PCI核心自己能夠驅動哪些設備。8139too的驅動程式定義他的pci_device_id數組如下:staticstructpci
13、_device_idrtl8139_pci_tbl[]該數組被初始化為8139系列的一組網卡,當PCI核心得到這個數組后,會拿數組中的每一項跟從PCI設置空間中讀取到的數據進行比對,從而為該驅動程式找到正確的設備。而pci_driver代表一個pci驅動程序。成員id_talbe即是指向pci_device_id數組的指針。name是驅動程序的名字,probe完成探測工作,即拿pci_device_id數組和內核中的數據進行比對。rem
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- pci設備pci設備pci設備
- PXI-PCI總線設備驅動程序設計及應用.pdf
- PCI總線接口板及其WDM驅動程序開發(fā).pdf
- 基于PCI總線的嵌入式設備驅動程序設計與研究.pdf
- 基于PCI總線的主設備功能仿真與驗證.pdf
- PCI總線主設備控制器的FPGA實現.pdf
- 基于PCI總線的驅動程序設計及實現.pdf
- Linux下基于PCI總線的網絡設備驅動程序的研究與開發(fā).pdf
- ddk開發(fā)pci設備驅動程序文獻綜述
- 基于PCI總線的ISA-PCI轉接卡的開發(fā).pdf
- PCI設備驅動程序設計與應用.pdf
- 基于PCI總線的嵌入式Linux設備驅動程序的研究與實現.pdf
- pcxt總線isa總線mca總線eisa總線vesa總線pci總線-piazza
- 基于PCI總線PCM解碼設計.pdf
- 基于FPGA的PCI總線實現.pdf
- 用于CT式安檢設備的PCI總線傳輸平臺設計.pdf
- 基于PCI總線的微機接口技術實驗設備研制.pdf
- PCI總線接口芯片的設計.pdf
- 基于EDKII的PCI總線驅動管理技術的設計與開發(fā).pdf
- 基于PCI總線的視頻檢測卡驅動程序設計.pdf
評論
0/150
提交評論