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...