Linux PCI設備驅動的實現思路與思想


概述

1、PCI設備一般都具有雙重身份,一方面作為PCI設備注冊到Linux內核,另一方面,作為字符設備或者塊設備,或者網絡設備注冊到Linux內核,所以,在看PCI設備時一定要注意到這點。

2、

一、PCI接口規范

1、PCI接口的配置空間

PCI總線規范定義的配置空間總長度為256個字節,配置信息按一定的順序和大小依次存放。前64個字節的配置空間稱為配置頭,對於所有的設備都一樣,配置頭的主要功能是用來識別設備、定義主機訪問PCI卡的方式(I/O訪問或者存儲器訪問,還有中斷信息)。其余的192個字節稱為本地配置空間,主要定義卡上局部總線的特性、本地空間基地址及范圍等。

配置空間中最重要的有:

Vendor  ID:廠商ID。知名的設備廠商的ID。FFFFh是一個非法廠商ID,可它來判斷PCI設備是否存在。
Device  ID:設備ID。某廠商生產的設備的ID。操作系統就是憑着 Vendor ID和Device ID 找到對應驅動程序的。
Class Code:類代碼。共三字節,分別是 類代碼、子類代碼、編程接口。類代碼不僅用於區分設備類型,還是編程接口的規范,這就是為什么會有通用驅動程序。
IRQ   Line:IRQ編號。PC機以前是靠兩片8259芯片來管理16個硬件中斷。現在為了支持對稱多處理器,有了APIC(高級可編程中斷控制器),它支持管理24個中斷。
IRQ    Pin:中斷引腳。PCI有4個中斷引腳,該寄存器表明該設備連接的是哪個引腳。

 

2、PCI的中斷實現

  PCI的中斷有兩種實現方式,一種是INTx管腳拉電平的方式,一種是通過MSI-X內部消息的方式。

 

3、PCI和PCIE的區別

  PCIE相當於把交換機引入到PCI設備中,PCI設備是點到點,PCIE引入lan的概念,可以實現高速,雙向通道。

 

4、PCI尋址

  每個PCI設備由一個總線號、一個設備號及一個功能號來標識。

 

5、查看當前系統上的pci設備

  # lspci 顯示設備上的pci設備

  

 

  #顯示設備上pci設備的pci號

  

   #

6、PCI設備在Linux中的描述

  所有的pci設備,在Linux中都用pci_dev結構體進行描述,由於一個PCI接口卡上可能包含多個功能模塊,每個功能被當作一個獨立的邏輯設備,因此,

每一個PCI 功能,即PCI 邏輯設備都唯一地對應一個pci_dev設備描述符。

 

7、PCI設備驅動描述,使用struct pci_driver進行描述。

 

二、PCI設備驅動初始化

1、初始化PCI設備結構體 intel 82599 萬兆網卡

  文件:ixgbe_main.c (linux-4.6\drivers\net\ethernet\intel\ixgbe) 

    

    pci 設備的編碼如下:

    

 

2、注冊PCI設備到內核 pci_register_driver

  文件:ixgbe_main.c (linux-4.6\drivers\net\ethernet\intel\ixgbe) 

    

 

3、激活PCI設備 pci_enable_device_mem()

  一般情況下,在pci設備的probe函數中,在驅動程序可以訪問pci設備的任何設備資源之前,驅動程序必須調用pci_enable_device_mem()函數。

  文件:ixgbe_main.c (linux-4.6\drivers\net\ethernet\intel\ixgbe) 

    

4、PCI設備申請存儲資源 pci_request_selected_regions

  文件:同上

    

 

5、申請成總線主DMA模式 pci_set_master,文件同上

6、一般情況下,都是在設備驅動的Probe函數中,完成PCI設備驅動的初始化,以及作為字符設備,塊設備,或者網絡設備的注冊與初始化功能。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM