USB 系統總覽

Zircon 提供功能完整的 USB 子系統,可開發 USB 主機和周邊裝置。支援低速、全速、高速和超高速裝置,以及各種標準自動交涉機制。

在主機角色中,Zircon 的 USB 子系統會採用分層方法,在裝置連接或從匯流排移除時,協助管理裝置的生命週期。在裝置角色中,子系統會封送進出類別專屬驅動程式庫 (或驅動程式階層) 的 USB 封包。

目標硬體平台可能包含多個 USB 控制器。因此,Zircon 可能會充當各實體匯流排上的主機或裝置。不過,每個角色都專屬於特定匯流排拓撲。除非另有註明,否則本文件會假設只有單一匯流排。

USB 子系統元件摘要如下:

  • 類別專屬硬體驅動程式
  • USB 集線器驅動程式庫 (類別專屬驅動程式庫的特殊情況)
  • 匯流排驅動程式庫
  • 主機或裝置控制器介面驅動程式庫

主辦人角色

以 USB 主機模式運作時,Zircon 會擔任授權匯流排仲裁者。所連 USB 裝置的樹狀結構是以根 USB 集線器為根。無論是否有任何實際的集線器硬體,都必須存在這個根集線器。對於包含主機功能控制器,但沒有實際中樞裝置硬體的系統,必須在軟體中模擬這個根中樞。

為方便匯流排仲裁,Zircon 會運作下列驅動程式:

  • USB 根集線器驅動程式庫
  • 匯流排驅動程式庫
  • 主機控制器介面 (HCI) 驅動程式庫

這些驅動程式會共同運作,回應匯流排附加作業,並管理附加裝置的生命週期。

裝置角色

以 USB 裝置運作時,Zircon 會在匯流排和類別專屬驅動程式庫 (或驅動程式階層) 之間傳輸 USB 封包資料。在這個角色中,匯流排驅動程式會促進 DCI 驅動程式庫與類別專屬驅動程式上層之間的通訊。

類別專屬驅動程式庫

類別專屬驅動程式會實作必要邏輯,以完成特定 USB 功能 (例如 HID 類別裝置),同時與從實際匯流排讀取及寫入實體封包所需的硬體詳細資料保持無關。

一般來說,USB 裝置驅動程式會使用 FIDL 通訊協定 fuchsia.hardware.usb.endpoint.Endpoint 與端點互動,並將傳輸要求結構化為 fuchsia.hardware.usb.request.Request 物件。您可以使用 usb::EndpointClientusb::FidlRequest 等 C++ 輔助類別,簡化使用程序。驅動程式會使用 RegisterVmos (或 EndpointClient::AddRequests) 預先註冊 VMO 資料緩衝區,而非為每個轉移作業分配要求。較高層級的裝置驅動程式會使用 QueueRequests 將要求發布至端點佇列。由於傳輸作業是由硬體提供服務,USB 堆疊會透過非同步 OnCompletion 事件通知上層,該事件會攜帶已完成的要求和傳輸狀態向量。

中樞驅動程式庫

集線器驅動程式庫的用途是根據 USB 2.0 規格的 CH11 管理集線器裝置。簡而言之,USB 集線器經過裝置列舉後,會使用兩個介面來達成功能:

  1. 用於通訊埠狀態變更事件的 IN 型中斷端點
  2. 用於查詢連接埠狀態的 IN 類型控制轉移

Zircon USB 堆疊 (集線器驅動程式是其中一部分) 會發出要求,等待連接埠狀態變更中斷事件。USB 集線器會使用 N 位元點陣圖回報連接埠狀態變更事件,其中位元 1 對應至連接埠#1,位元 2 對應至連接埠#2,依此類推。請注意,位元 0 保留給中樞狀態變更事件,目前不支援。因此,4 埠集線器會使用 IN 類型中斷端點,為每個埠寫入 5 位元值。

中樞裝置偵測到其中一個連接埠發生變化時,會發出中斷傳輸,並對連接埠編號進行編碼。這項中斷轉移作業會解除集線器驅動程式庫的封鎖,該驅動程式會讀取通訊埠狀態變更點陣圖,並判斷哪些通訊埠有相關活動。

如果發生通訊埠狀態變更事件,USB 堆疊會使用集線器裝置的控制介面查詢個別通訊埠狀態,並根據規格繼續執行作業。舉例來說,如果通訊埠狀態因連線事件而變更,系統會為通訊埠供電、重設通訊埠,並繼續列舉。

如要進一步瞭解集線器生命週期的具體資訊,請參閱 USB 2.0 規格的第 11 章。

匯流排驅動程式庫

匯流排驅動程式的用途是向匯流排宣告裝置的存在 (或移除),並向其餘 USB 堆疊註冊中樞裝置的存在。在大多數情況下,匯流排驅動程式只是負責促進 USB 堆疊不同部分之間的通訊。

HCI 驅動程式庫 (僅限主機)

以主機模式運作時,主機控制器介面 (HCI) 驅動程式庫位於 USB 堆疊的底層。這個實體負責將未完成的 FIDL 端點要求 (fuchsia.hardware.usb.request.Request) 轉換為可處理要求的必要硬體指令。

HCI 驅動程式庫與 DCI 驅動程式庫的不同之處在於,前者包含可簡化裝置列舉作業的功能。如果一般列舉分為兩個階段:

  • 列舉匯流排 (直到 set_address 指令)。
  • 裝置列舉 (所有可定址的裝置)。

HCI 驅動程式庫會執行前半部分,而 USB 堆疊會接管並執行裝置列舉的其餘部分。

DCI 驅動程式庫 (僅限裝置)

以裝置模式運作時,裝置控制器介面(DCI) 驅動程式庫位於 USB 堆疊的底層。這個實體負責將未完成的 FIDL 端點要求 (fuchsia.hardware.usb.request.Request) 轉換為可處理要求的必要硬體指令。

DCI 驅動程式庫與 HCI 驅動程式不同,因為 DCI 驅動程式會將傳入的 OUT 類型傳輸要求提供給裝置,並在匯流排上設定傳出的 IN 類型傳輸要求。在這兩種情況下,單一轉移作業可能會導致多個封包雙向傳輸。

另請參閱