linux pci 協議一

 

噹噹熱賣商品推薦php

 

先打下廣告,上面是一本好書了O(∩_∩)O~linux

前言

由於遇到一個pci總線的問題,因此去學習瞭解linux pci驅動,中間總結了一些pci總線原理和linux驅動的知識,在此總結出來備查。學習

 

PCI總線原理簡介

組成結構

PCI總線是一種局部總線,與系統總線有所區別,主要是爲了鏈接外設。它在一個處理器系統中的位置以下圖url

PCI總線相關的模塊包括,HOST主橋、PCI總線、PCI橋和PCI設備,全部的PCI設備組成一棵樹,後面會看到linux內核在內存中也維護了一棵相似的樹。固然這個圖只是一種特例,有的系統中存儲器控制器的位置是集成在cpu中的,有些簡單的系統可能沒有PCI橋,只有PCI設備和和主橋。spa

1. HOST主橋xml

HOST主橋是一個很特別的橋片,其主要功能是隔離處理器系統的存儲器域與處理器系統的PCI總線域,管理PCI總線域,並完成處理器與PCI設備間的數據交換。處理器與PCI設備間的數據交換主要由「處理器訪問PCI設備的地址空間」和「PCI設備使用DMA機制訪問主存儲器」這兩部分組成。HOST主橋是聯繫處理器與PCI設備的橋樑。在一個處理器系統中,每個HOST主橋都管理了一顆PCI總線樹,在同一棵PCI總線樹上的全部PCI設備屬於同一個PCI總線域。blog

2. PCI總線事務

PCI總線由HOST主橋或者PCI橋管理,用來鏈接各種設備,與HOST主橋直接鏈接的PCI總線一般被命名爲PCI總線0內存

3. PCI設備ci

PCI總線中有三類設備,PCI主設備、PCI從設備和橋設備。其中PCI從設備只能被動地接收來自HOST主橋,或者其餘PCI設備的讀寫請求;而PCI主設備能夠經過總線仲裁得到PCI總線的使用權,主動地向其餘PCI設備或者主存儲器發起存儲器讀寫請求。而橋設備的主要做用是管理下游的PCI總線,並轉發上下游總線之間的總線事務。

PCI橋能夠鏈接兩條PCI總線,上游PCI總線和下游PCI總線,這兩個PCI總線屬於同一個PCI總線域,使用PCI橋擴展的全部PCI總線都同屬於一個PCI總線域。

讀寫總線事務

PCI總線使用單端並行數據線,採用地址譯碼方式進行數據傳遞,而採用ID譯碼方式進行配置信息的傳遞。其中地址譯碼方式使用地址信號,而ID譯碼方式使用PCI設備的ID號,包括BusNumberDeviceNumberFunctionNumberRegisterNumber

咱們主要關心與軟件關係比較密切的存儲器讀寫總線事務,和配置讀寫總線事務。

配置讀寫

前面講到PCI總線域地址空間與存儲區域地址空間不一樣,須要Host主橋進行地址轉換,配置讀寫總線事務固然涉及到了這個轉換過程。咱們對配置讀寫總線事務的硬件處理不關心,而不一樣host主橋的實現方式不一樣,配置過程也就不一樣。內核提供了現成的配置方法,咱們着重關注能夠配置什麼。

PCI總線規定了三種類型的PCI配置空間,分別是PCI Agent設備使用的配置空間,PCI橋使用的配置空間和Cardbus橋片使用的配置空間。值得注意的是,在PCI設備配置空間中出現的地址都是PCI總線地址,屬於PCI總線域地址空間。

各個配置寄存器詳細說明見參考資料[1]

數據讀寫(假定配置空間已經被系統軟件初始化)

PCI總線支持如下幾類存儲器讀寫總線事務。

(1) HOST處理器對PCI設備的BAR空間進行數據讀寫,BAR空間可使用存儲器或者I/O譯碼方式。HOST處理器使用PCI總線的存儲器讀寫總線事務和I/O讀寫總線事務訪問PCI設備的BARbase address也就是數據基地址)空間。

(2) PCI設備之間的數據傳遞。在PCI總線上的兩個設備能夠直接通訊,如一個PCI

設備能夠訪問另一個設備的BAR空間。不過這種數據傳遞在PC處理器系統中,

較少使用。

(3) PCI設備對主存儲器進行讀寫,即DMA讀寫操做。DMA讀寫操做在全部處理器系統中都較爲經常使用,也是PCI總線數據傳送的重點所在。在多數狀況下,DMA讀寫操做結束後將伴隨着中斷的產生。PCI設備可使用INTA#INTB#INTC#INTD#信號提交中斷請求,也可使用MSI機制提交中斷請求。(pci設備經過dma向主存中傳數據時,收到中斷請求時內存中數據未必當即可用,須要先讀)

讀寫的具體過程這裏再也不具體描述。感興趣的讀者參考資料[1]

相關文章
相關標籤/搜索