PCIe驅動開發介面函式

2021-07-02 17:58:17 字數 3009 閱讀 4485

realtek8168網絡卡時pci介面的網絡卡,其驅動程式就是乙個pci裝置的驅動程式例項,我們一起看看其流程。

1.  首先,初始化模組呼叫static inline int pci_register_driver(struct pci_driver *driver)函式來註冊裝置驅動,這個函式的引數是struct pci_driver *driver,對應於r8168,就是

static struct pci_driver rtl8168_pci_driver = ;

這個結構體把這個裝置驅動所支援的裝置(rtl8168_pci_tbl),探測函式(rtl8168_init_one)等都定義好,後面我們將需要用到rtl8168_pci_tbl,rtl8168_init_one兩部分內容來匹配,是否系統中的裝置,看是否有裝置可以跟這個驅動匹配

2.  pci_register_driver 函式呼叫__pci_register_driver來完成任務,而__pci_register_driver則重新封裝了要註冊的驅動為pci匯流排的,即

int __pci_register_driver(struct pci_driver *drv, struct module *owner)

接下來就是呼叫裝置驅動模型的函式,把我們要註冊的驅動掛載到pci匯流排的裝置佇列上,並掃瞄pci匯流排的裝置佇列,檢視是否有裝置可以匹配這個驅動,這跟usb裝置驅動的掛載是一致的,只是這裡掛載的是pci匯流排,usb掛載的是usb匯流排,大致的流程是

driver_register()---àbus_add_driver()----àdriver_attach()--à__driver_attach()--àdriver_probe_device()---àdev->bus->probe(),即最後還是呼叫了2.中的pci_bus_type結構體中的probe成員函式,即static int pci_device_probe(struct device * dev)

3.  static int pci_device_probe(struct device * dev)函式的引數dev就是遍歷了pci匯流排上的裝置鍊錶,一一進行匹配來完成的,因為我們呼叫__driver_attach()的方式是bus_for_each_dev(drv->bus, null, drv, __driver_attach);

4.  static int pci_device_probe(struct device * dev)通過兩個巨集轉換to_pci_driver,to_pci_dev,獲得需要匹配的裝置和驅動,呼叫static int __pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)函式進行匹配

5.  __pci_device_probe函式首先通過裝置驅動中的rtl8168_pci_tbl表,跟從裝置獲得vendorid,productid進行比較,看是否一致,如果一致,就返回這個表的位址;如果沒有一致的,就表明,這個裝置跟這個驅動不匹配,就不需要繼續進行下面的操作了,直接退出

6.  如果第5步發現了一致的裝置表,就表明有裝置id一致,需要進一步探測,接下來就要呼叫我們裝置驅動程式中的探測函式,進行更具體的探測了,即pci_call_probe(drv, pci_dev, id)---à drv->probe(dev, id),到這裡,就開始呼叫我們的裝置驅動中的探測函式了。

7.  static int __devinit rtl8168_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)函式是r8168的探測函式,其呼叫rtl8168_init_board(pdev, &dev, &ioaddr)來完成跟pci裝置驅動相關的探測。

8.  static int __devinit rtl8168_init_board(struct pci_dev *pdev, struct net_device **dev_out, void __iomem **ioaddr_out)函式呼叫pci_enable_device函式來使能pci裝置,只有使能成功的pci裝置,才能正常使用。

9.  呼叫pci_set_mwi函式判斷裝置是否支援memory-write-invalidate 功能

10.              呼叫pci_find_capability函式來判斷裝置是否有電源管理功能.

11.              呼叫pci_resource_flags函式來判斷pci是記憶體對映模式,還是io模式

12.              呼叫pci_resource_len函式來判斷記憶體空間是否小於裝置所需要的記憶體空間,如果小於,明顯出錯

13.              呼叫pci_request_regions函式通知核心,當前pci將使用這些記憶體位址,其他裝置不能再使用了

14.              呼叫pci_set_master(pdev)函式,設定裝置具有獲得匯流排的能力,即呼叫這個函式,使裝置具備申請使用pci匯流排的能力。

15.              呼叫ioremap函式把剛剛申請的物理記憶體,對映成虛擬記憶體,因為程序使用的都是虛擬記憶體位址,而不是物理記憶體位址。

16.              把ioremap對映的虛擬記憶體返回給呼叫函式。

17.              到此,跟pci相關的初始化都完成了,裝置即可正常工作了

linux裝置驅動之PCIE驅動開發

pcie pci express 是intel提出的新一代的匯流排介面,目前普及的pcie 3.0的傳輸速率為8gt s,下一代pcie 4.0將翻番為16gt s,因為傳輸速率快廣泛應用於資料中心 雲計算 人工智慧 機器學習 視覺計算 顯示卡 儲存和網路等領域。pcie插槽是可以向下相容的,比如p...

pcie 驅動解除安裝 藍屏

pcie 驅動程式解除安裝時偶爾出現藍屏現象,根據列印資訊初步定位是釋放資源時出錯。使用windbg單步除錯時,藍屏的概率要高很多。如下 void pcireturnresources ppci device ext pdevext 仔細分析 後結論如下 問題原因 io memory 資源釋放之後,...

PCIe裝置驅動demo

pcie pci express 是intel提出的新一代的匯流排介面,目前普及的pcie 3.0的傳輸速率為8gt s,下一代pcie 4.0將翻番為16gt s,因為傳輸速率快廣泛應用於資料中心 雲計算 人工智慧 機器學習 視覺計算 顯示卡 儲存和網路等領域。pcie插槽是可以向下相容的,比如p...