Linux下的PCI驅動程式設計

2021-07-09 12:26:10 字數 1830 閱讀 7519

pci裝置上有三種位址空間:pci的i/o空間、pci的儲存空間和pci的配置空間。cpu可以訪問pci裝置上的所有位址空間,其中i/o空間和儲存空間提供給裝置驅動程式使用,而配置空間則由linux核心中的pci初始化**使用。核心在啟動時負責對所有pci裝置進行初始化,配置好所有的pci裝置,包括中斷號以及i/o基址,並在檔案/proc/pci中列出所有找到的pci裝置,以及這些裝置的引數和屬性。

linux驅動程式通常使用結構(struct)來表示一種裝置,而結構體中的變數則代表某一具體裝置,該變數存放了與該裝置相關的所有資訊。好的驅動程式都應該能驅動多個同種裝置,每個裝置之間用次裝置號進行區分,如果採用結構資料來代表所有能由該驅動程式驅動的裝置,那麼就可以簡單地使用陣列下標來表示次裝置號。

在pci驅動程式中,下面幾個關鍵資料結構起著非常核心的作用:

1)pci_driver:

1)      這個資料結構在檔案include/linux/pci.h裡,這是linux核心版本2.4之後為新型的pci裝置驅動程式所新增的,其中最主要的是用於識別裝置的id_table結構,以及用於檢測裝置的函式probe()和解除安裝裝置的函式remove() :

struct pci_driver ;

其中name 是驅動程式名稱;id_table指向乙個與驅動程式相關的裝置id表的指標。大多數驅動程式應當用module_device_table(pci,…)將該裝置id表匯出。在呼叫prob( )時設成null 以讓系統檢測到所有的pci裝置。

**中是這樣定義的:module_device_table(pci, sil_pci_tbl);

probe 指向裝置檢測函式probe( ) 的指標。該函式將在pci裝置id與裝置id表匹配且還沒有被其它驅動程式處理時(一般在對已存在的裝置執行pci_register_driver或以後又有新裝置插入時)被呼叫。呼叫時傳入乙個指向struct pci_driver結構的指標和與裝置匹配的裝置id表做引數。若成功(驅動程式檢測到pci裝置)則返回0,否則返回乙個負的錯誤**。這個函式總是在上下文之間呼叫的,因此可以進入睡眠狀態的

remove指向乙個裝置解除安裝函式remove( )的指標。該函式在pci裝置被解除安裝時(如在登出裝置驅動程式或者手動拔出該裝置)被呼叫。同probe一樣,該函式也是可以睡眠的。

2)pci_dev:

1)      這個資料結構也在檔案include/linux/pci.h裡,它詳細描述了乙個pci裝置幾乎所有的

硬體資訊,包括廠商id、裝置id、各種資源等:

struct pci_dev ;

同載入和解除安裝模組相關的函式或資料結構都要在前面加上__init、__exit等

標誌符,以使同普通函式區分開來。static int __init sil_init(void)

驅動程式通過pci_module_init向核心註冊自己(我們有時會看到pci_register_driver函式,其實他們是同乙個,在核心**中會看到,只是個簡單的#define):

pci_module_init(&sil_pci_driver);

呼叫函式後,如果pci_device_id陣列中標識的裝置存在於系統中,並且該裝置恰好還沒有驅動程式,則該驅動程式會被安裝。

註冊驅動程式成功後,sil_init_one會被呼叫,在這個函式中,我們能通過插入一些列印輸出語句看到pci的設定位址空間和i/o位址區域的一些情況。

pci_enable_device和pci_disable_device

在乙個pci裝置可以被使用之前,必須呼叫pci_enable_device進行啟用,該函式會呼叫底層**啟用pci裝置上的i/o和記憶體,使之可用。而pci_disable_device所做的事情剛好相反,告訴系統該pci裝置不再使用,

同時,禁用相關的一些資源。

linux下的 pci 驅動程式設計模型

一 概述 我這裡pci 裝置是powerpc2020 和fpga 通過pci 匯流排進行相連通訊。二 驅動模型 include include include include include include include define send buf size 8192 define recv ...

實時Linux下的PCI驅動開發(下)

進入驅動的hpi相關部分後,就要好好研究pci2040的datasheet了。說實話,乙個驅動程式的大部分內容,就是把datasheet裡的內容翻譯成 所以每乙個驅動工程師都應該深入的閱讀硬體文件。首先看pci2040的配置空間,如下所示 有兩個最重要的基位址,乙個是hpi csr記憶體基位址,可以...

Linux的PCI驅動分析

1.關鍵資料結構 pci裝置上有三種位址空間 pci的i o空間 pci的儲存空間和pci的配置空間。cpu可以訪問pci裝置上的所有位址空間,其中i o空間和儲存空間提供給裝置驅動程式使用,而配置空間則由linux核心中的pci初始化 使用。核心在啟動時負責對所有pci裝置進行初始化,配置好所有的...