平台匯流排

簡介

「月台公車」一詞是指特定的 Fuchsia 驅動程式庫,其原始碼位於 //fuchsia/src/devices/bus/drivers/platform/. 不過,此詞彙也指管理 Fuchsia 中較低層級驅動程式的架構。 在本文件中,「月台公車驅動程式」是指特定驅動程式庫和月台匯流排。 是指一般架構

整個月台公車包含以下幾種驅動因素:

  • 管理平台匯流排的月台匯流排驅動程式。這是一般驅動程式庫 沒有硬體專屬功能平台匯流排驅動程式會自動啟動 。

  • 看板驅動程式,這是平台匯流排驅動程式載入的第一個驅動程式庫。 包含平台匯流排所需的所有平台相關資訊 以及控制月台匯流排會載入哪些其他司機。 在 arm64 平台上,平台匯流排驅動程式會使用系統啟動載入程式或開機輔助程式中的資訊 繫結至執行平台的正確主機板驅動程式庫。 在 x86 平台上,平台匯流排驅動程式一律會載入 x86 主機板驅動程式庫並建立平台 以根據 ACPI 的資訊追蹤裝置

  • Fuchsia 為較高等級的驅動程式提供平台裝置驅動程式。 這些驅動程式針對特定功能提供最低限度的支援,例如 USB、 eMMC 或 NAND 儲存體等,載入等級較高的驅動程式。

  • 通訊協定實作驅動程式是提供所需通訊協定的驅動程式 開發板。其中一個常見的例子是 GPIO 驅動程式庫, 使用拼接工具的開發板驅動程式庫過去,他們用來代理 開發對平台裝置的通訊協定,但現在我們改用複合裝置。 我們之後可能會逐步在平台匯流排使用通訊協定實作驅動程式 改用不需要封鎖並等待驅動程式載入的新方法。

  • 最後,平台 Proxy 驅動程式與載入的平台匯流排驅動程式的隨附元件 附加至平台裝置驅動程式庫程式主機。這個驅動程式庫支援平台裝置通訊協定的 Proxy 以及其他資源通訊協定,包括平台裝置驅動程式庫、平台匯流排驅動程式,以及 通訊協定實作驅動程式。您需要這麼做,因為平台裝置驅動程式 與平台匯流排驅動程式和通訊協定實作驅動程式不同的驅動程式代管程序程序。

Fuchsia 平台匯流排圖 來源

平台匯流排初始化

驅動程式管理器會在開機時自動啟動月台匯流排驅動程式。 由於月台匯流排驅動程式是一般驅動程式庫,並未包含 執行應用程式時,會先載入處理平台專屬邏輯的 Jamboard 驅動程式庫。 平台匯流排驅動程式會讀取 ZBI_TYPE_PLATFORM_ID,以決定要載入哪個主機板驅動程式 記錄 (擷取自 ZBI 資料的 系統啟動載入程式。然後新增通訊協定 ZX_PROTOCOL_PBUS 的裝置,以及 BIND_PLATFORM_DEV_VIDBIND_PLATFORM_DEV_PID 繫結變數設為 vid,同時 從平台資料記錄中取得正確的主機板驅動程式庫會繫結至這部裝置並繼續操作 平台匯流排初始化程序x86 平台已載入 x86 主機板驅動程式庫 。

主機板驅動程式庫會使用月台匯流排通訊協定,與平台匯流排驅動程式通訊。 自行完成初始化後,主機驅動程式庫會使用 ProtocolDeviceAdd() 呼叫平台匯流排通訊協定,以載入通訊協定實作驅動程式。 通訊協定實作驅動程式庫載入後,必須在平台匯流排中註冊通訊協定 呼叫平台匯流排 RegisterProtocol() API。 ProtocolDeviceAdd() 會遭到封鎖,直到驅動程式庫呼叫 RegisterProtocol(),因此主機板驅動程式庫 必須從本身的執行緒呼叫 RegisterProtocol(),而不是驅動程式管理器回呼,例如 Bind()

新增通訊協定裝置後,主面板驅動程式庫會呼叫 DeviceAdd() 呼叫 加入平台匯流排通訊協定,建立平台裝置 平台裝置驅動程式會在其專屬驅動程式代管程序中載入。 建立平台裝置後,平台匯流排初始化即結束。

複合平台裝置

平台匯流排也支援新增平台裝置,用來做為複合元件 裝置。平台匯流排 CompositeDeviceAdd() 呼叫會新增複合裝置,值為零 是依據提供的 PBusDev 結構描述的平台裝置。 其餘元件的繫結規則由 components 參數提供。 primary_fragment 是用來指定託管複合裝置的驅動程式 應建立於指定 NULL 後,驅動程式代管程序會為 用於合成裝置,而只要有效字串等於其中一個片段名稱,系統就會新增複合資料 傳送到另一個片段的驅動程式代管程序上。正在傳遞「pdev」也都是不允許的 您不希望將複合裝置加入平台匯流排驅動程式的驅動程式代管程序。

複合平台裝置的內部構造與非複合裝置略有不同。 不使用平台 Proxy 驅動程式庫,而是驅動程式管理器元件元件 Proxy 驅動程式 透過 Proxy 處理平台裝置通訊協定例如,在上圖中有一個複合裝置 。 系統會在新的驅動程式代管程序中啟動音訊驅動程式庫,以及驅動程式管理器元件和元件 Proxy 驅動程式 負責代理 PDEV 和 I2C 通訊協定給音訊驅動程式庫。

平台裝置通訊協定

平台裝置通訊協定 (ZX_PROTOCOL_PDEV) 是平台匯流排提供給 平台裝置驅動程式這個通訊協定可讓您存取 MMIO 範圍、中斷事件、 BTI 與 SMC 範圍與平台裝置驅動程式庫有關。而不是要求 MMIO 和中斷 實體位址或 IRQ 編號,則這些資源是由從零開始的索引所要求。 如此一來,我們就能擁有適用於特定 IP 的平台裝置驅動程式 因為只要知道確切的 MMIO 地址和中斷號碼, 。反之,鍵盤驅動程式庫會設定 MMIO 地址和 IRQ 編號, 透過 AddDevice() 傳遞 PbusDev 結構體。

平台裝置通訊協定也適用於通訊協定實作驅動程式。 例如,GPIO 驅動程式庫可能會使用平台裝置通訊協定存取其 MMIO 並中斷服務。 這樣一來,就能在不同的 SOC 變體之間共用通訊協定實作驅動程式。 功能可能相同,但 MMIO 地址和中斷號碼 也不一樣

平台匯流排通訊協定

平台匯流排通訊協定 供桌遊驅動程式和通訊協定實作驅動程式與平台通訊 或是匯流排驅動程式只有月台匯流排的駕駛員主機 (位於 平台裝置驅動程式則無法存取)。這個通訊協定的用途 供 Jamboard 驅動程式庫載入通訊協定實作驅動程式,並啟動平台裝置 驅動程式。通訊協定實作驅動程式也會透過該巨集,向 平台匯流排,以便平台裝置驅動程式 取得相關通訊協定