Linux平台PCIe驅動編寫

2021-09-13 02:39:12 字數 1259 閱讀 7512

以前文章分析了pcie整個系統知識,包括如何掃瞄pcie樹,這篇文章講解一下當拿到乙個pcie裝置時如何編寫驅動程式。編寫驅動程式在應用程式中編寫,同樣可以在核心層編寫驅動。

從應用層編寫驅動主要是使用pcilib庫和/dev/mem介面,下面開始分析**。根據pcie裝置的廠家id和裝置id初始化裝置,並且返回訪問裝置指標描述符,pci_dev指標指向我們需要訪問的裝置。

圖 1清理pcie裝置函式:pci_cleanup(myaccess);

讀寫配置空間函式如下:

圖 2到目前為止程式能夠順利訪問pcie 4k配置空間,寫配置空間時必須在root使用者下,接下來實現訪問bar空間,bar空間訪問分為兩部分,得到大小和對映。獲取bar空間大小先給bar0暫存器全寫1,檢視位的變化情況得到大小。

獲取bar空間大小函式:

圖 3對映bar空間,程式中獲取到的位址已經是cpu儲存域的位址 ,而不是pcie域位址。/dev/mem介面是實體地址的全部映象,mmap可以通過該介面將指定的物理位址對映到虛擬位址空間上,這樣程序就可以訪問實際存在的實體地址空間。對映函式如下,phy_addr引數待對映的實體地址,size是待對映的實體地址大小。

圖 4程式退出時應該釋放對映的記憶體和關閉/dev/mem裝置節點。

munmap(vir_addr,size);

close(pcieviraddr_fd);

驅動程式中編寫pcie驅動程式,所有的思路與應用程式一致,只是用到的函式介面和型別不一樣。但是我建議將pcie驅動寫入到核心中。

圖 5 得到裝置指標

圖 6 對映bar空間

如果僅僅是除錯為了方便,那麼可以使用系統的lspci指令訪問配置空間。

linux下pcie裝置驅動

pcie裝置驅動與platform裝置驅動的對比學習 1 驅動模組結構 1 pcie裝置註冊 module pci driver x driver 展開之後對應於 module init x driver pci register drive x driver module exit x drive...

linux裝置驅動之PCIE驅動開發

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

linux平台驅動

linux簡單字元驅動很簡單 只需要在初始化時對實體地址進行對映,再註冊乙個 fileopenration 操作集,然後就和寫裸機程式一樣實現操作集就可以了。問題一 為什麼要進行實體地址到虛擬位址的對映?因為引入了mmu 記憶體管理,只允許使用者操作虛擬位址。問題二 為什麼要引入mmu 而不讓使用者...