硬體週邊裝置會透過公車連接至 CPU,例如 PCI 匯流排。
在開機期間,BIOS (或同等平台啟動軟體) 找出所有連接至 PCI 匯流排的周邊裝置。 每個週邊裝置都會獲派資源 (尤其是中斷向量、 和位址範圍)。
這樣會造成系統實際指派給每個週邊裝置的資源 每次重新啟動都會有所差異。 作業系統軟體啟動時,會列舉 例如公車和啟動驅動程式。 驅動程式接著會呼叫 PCI 函式,以取得 以便對應暫存器並繫結至中斷狀態。
基礎地址登記
基準地址註冊 (BAR) 是每個 PCI 裝置。 BIOS 會在此儲存裝置相關資訊,例如所指派的中斷向量 和控制暫存器位址 其他與裝置相關的資訊也會儲存在這裡。
呼叫 Pci::MapMmio() ,以便將 BAR 暫存器對應到驅動程式代管程序的位址空間:
#include <lib/device-protocol/pci.h>
zx_status_t Pci::MapMmio(uint32_t bar_id, uint32_t cache_policy,
std::optional<fdf::MmioBuffer>* mmio);
ddk::Pci
類別是用於與 PCI 匯流排通訊的介面驅動程式。
第一個參數 bar_id
是 BAR 註冊編號,從 0
開始。
第二個參數 cache_policy
會決定存取權的快取政策。
採用下列值:
cache_policy 值 |
意義 |
---|---|
ZX_CACHE_POLICY_CACHED |
使用硬體快取 |
ZX_CACHE_POLICY_UNCACHED |
停用快取功能 |
ZX_CACHE_POLICY_UNCACHED_DEVICE |
停用快取,並將資料視為裝置記憶體 |
ZX_CACHE_POLICY_WRITE_COMBINING |
合併、寫入合併 |
請注意,ZX_CACHE_POLICY_UNCACHED_DEVICE
取決於架構
而且有時可能在某些架構中等於 ZX_CACHE_POLICY_UNCACHED
。
最後一個引數是所建立緩衝區的輸出參數,
讀取及寫入記憶體
Pci::MapMmio()
函式會傳回有效的結果,您可以透過 MmioBuffer
介面存取 BAR,例如:
#include <lib/device-protocol/pci.h>
#include <lib/mmio/mmio-buffer.h>
std::optional<fdf::MmioBuffer> mmio;
zx_status_t status = pci.MapMmio(0, ZX_CACHE_POLICY_UNCACHED_DEVICE, &mmio);
if (status == ZX_OK) {
mmio.Write32(0x1234, REGISTER_X); // configure register X for deep sleep mode
}