簡介
平台匯流排是一個架構,可讓驅動程式存取平台專屬的硬體資源 (MMIO、IRQ、BTI、SMC)。
在實際應用中,「平台匯流排」一詞可指兩種事物:
- 驅動程式 //src/devices/bus/drivers/platform/。
- 架構本身。
在本文件中,「平台匯流排驅動程式」是指特定驅動程式庫,「平台匯流排」則是指一般架構。
平台匯流排初始化
系統啟動時,驅動程式管理器會明確啟動平台匯流排驅動程式。平台匯流排驅動程式為一般驅動程式,不瞭解其執行的硬體。啟動時,驅動程式庫會建立子節點,供主機板驅動程式繫結。主機板驅動程式瞭解裝置/主機板上的硬體。
請務必將正確的板驅動程式庫繫結至節點。方法是設定平台匯流排驅動程式子節點的繫結屬性,只允許特定主機板驅動程式庫繫結至該節點。平台匯流排驅動程式會檢查開機載入器提供的 ZBI 資料中的 ZBI_TYPE_PLATFORM_ID 記錄,藉此設定這些屬性。這些繫結屬性包括供應商 ID (fuchsia.BIND_PLATFORM_DEV_VID) 和產品 ID (fuchsia.BIND_PLATFORM_DEV_PID)。
平台匯流排驅動程式會向主機板驅動程式庫程式公開 fuchsia.hardware.platform.bus/PlatformBus 和 fuchsia.hardware.platform.bus/Firmware FIDL 通訊協定。主機板驅動程式庫會使用 PlatformBus 和硬體知識建立平台裝置,其他驅動程式則可透過這種方式存取硬體資源。
現代主機板驅動程式會使用 devicetree (//sdk/lib/驅動程式庫/devicetree/) 探索硬體,而非在驅動程式庫中硬式編碼該知識。devicetree 板驅動程式庫會使用 FirmwareType::DEVICE_TREE 呼叫 Firmware.GetFirmware,這會傳回包含 ZBI 中 devicetree blob (ZBI_TYPE_DEVICETREE) 的 VMO。主機板驅動程式庫會從這個 VMO 讀取及剖析 devicetree 節點,並將產生的平台裝置發布至 PlatformBus。
平台裝置
平台裝置是節點,可為繫結至這些節點的驅動程式,提供平台專屬硬體資源的存取權。這類資源包括 MMIO 區域、中斷、BTI 和 SMC。
主機板驅動程式庫會將 NodeAdd 或 AddCompositeNodeSpec 要求傳送至平台匯流排,以便建立子節點,做為平台裝置。要求包含節點名稱 (例如 "gpio")、用於填入節點繫結屬性的 ID (fuchsia.BIND_PLATFORM_DEV_VID、fuchsia.BIND_PLATFORM_DEV_PID、fuchsia.BIND_PLATFORM_DEV_DID 和 fuchsia.BIND_PLATFORM_DEV_INSTANCE_ID,以及任何自訂屬性,例如 fuchsia.COMPATIBLE),以及節點所需的資源 (例如 MMIO 範圍、IRQ、BTI 和 SMC 範圍):
- 獨立平台裝置:如果驅動程式庫只需要平台匯流排資源,主機板驅動程式庫會呼叫
NodeAdd,且驅動程式庫會直接繫結至產生的平台裝置節點。 - 複合平台裝置:大多數硬體裝置都需要平台匯流排資源,以及其他驅動程式的功能 (例如 GPIO、I2C 或時鐘)。對於這些裝置,驅動程式庫會繫結至複合節點,其中平台裝置節點是其中一個父項 (通常命名為
"pdev"),其他能力供應商則是其餘父項。板卡驅動程式可以透過AddCompositeNodeSpec建立平台裝置節點,並在一個步驟中註冊其複合節點規格 (或呼叫NodeAdd,並直接向fuchsia.driver.framework/CompositeNodeManager註冊複合規格,就像 devicetree 板卡驅動程式一樣)。
平台裝置通訊協定
每個平台裝置節點都會向繫結至該節點的驅動程式庫提供 fuchsia.hardware.platform.device/Device 通訊協定。可讓您存取分配給平台裝置的硬體資源 (由主機板驅動程式庫程式指定):
- MMIO 範圍:透過
GetMmioById/GetMmioByName,依索引或名稱存取。 - 中斷:透過
GetInterruptById/GetInterruptByName依索引或名稱存取。 - BTI (匯流排交易啟動器):透過
GetBtiById/GetBtiByName依索引或名稱存取。 - SMC (安全監控呼叫):透過
GetSmcById/GetSmcByName依索引或名稱存取。
平台裝置驅動程式可透過索引或名稱要求資源,而非硬式編碼實體位址或 IRQ 編號,因此可在不同的 SoC 變體中重複使用。