PCIe學習筆記(一)——硬件設備識別掃盲篇(史無前例的好文章)

吹個牛先:計劃寫三篇文章,本文主要描述PCIe設備識別過程,接下來會完成兩篇,(二)中斷,(三)數據傳輸
博觀而約取,厚積而薄發
寫在開始的話,不知道看了多少資料才總結出一點知識,能輸入已經很不容易,何況想要輸出,有十能輸出一二就算不錯了。所以這個過程中真的很難堅持下來,何況沒有實際項目作爲載體,真的不知道實際運用中這些知識夠不夠用,這只是基於我之前的經驗,認爲一個全新的硬件模塊中需要掌握的部分。
1 首先要了解這個硬件的用途,物理接口,pin定義。
2 要知道需要做什麼樣的配置才能使得設備達到我們的預期。
3 設備工作中最重要的就是三個模塊,正確識別,註冊中斷以及終端處理函數,數據傳輸。
完成以上三步一個硬件模塊的bringup就完成了。本文忽略了大部分細節,只爲了用最短的篇幅描述好PCIe。
MSI、MSI-X中斷和TLP這裏不詳細展開去說,必要的時候會帶出來。
PCIE整體印象
首先用一張圖來直觀的呈現出要了解PCIe,我們需要知道的一些基本概念。
由於PCI/PCIe常見設備分爲Bridge和Agent兩種,這兩種設備的區分是寫在配置空間的header字段中的,所以配置空間也有兩種類型:
其中Agent的配置空間類型稱爲Type 00h,Bridge的配置空間,它的類型被稱爲Type 01h。
PCI/PCIe的配置地址空間Configuration Space是一個與Memory空間和IO空間並列的獨立的空間。

以上是在理論層面上全面的瞭解了PCIe,具體我們在使用的過程中,需要通過軟件的方式來實現,從而能夠正確的被上層應用使用。
pci驅動在linux中的描述如下:
Once the driver knows about a PCI device and takes ownership, the
driver generally needs to perform the following initialization:

Enable the device
Request MMIO/IOP resources
Set the DMA mask size (for both coherent and streaming DMA)
Allocate and initialize shared control data (pci_allocate_coherent())
Access device configuration space (if needed)
Register IRQ handler (request_irq())
Initialize non-PCI (i.e. LAN/SCSI/etc parts of the chip)
Enable DMA/processing engines

When done using the device, and perhaps the module needs to be unloaded,
the driver needs to take the follow steps:

Disable the device from generating IRQs
Release the IRQ (free_irq())
Stop all DMA activity
Release DMA buffers (both streaming and coherent)
Unregister from other subsystems (e.g. scsi or netdev)
Release MMIO/IOP resources
Disable the device

PCIe的BAR地址是如何分配的呢?

在PCIE配置空間裏,0x10開始後面有6個32位的BAR寄存器,BAR寄存器中存儲的數據是表示PCIE設備在PCIE地址空間中的基地址,注意這裏不是表示PCIE設備內存在CPU內存中的映射地址,至於這兩者之間如何轉換,就是前面提到的TLP的工作。
枚舉的過程描述可以參考:
http://blog.chinaaet.com/justlxy/p/5100053320
https://blog.csdn.net/buyi_shizi/article/details/51068609枚舉
總結如下:
1 向BAR空間寫1。
2 讀取BAR值,確定地址空間大小和類型。
3 像高比特寫入地址空間地址(系統分配的)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章