共用方式為


USB 雙重角色驅動程式堆疊架構

Windows 現在支援 USB 雙重角色控制器,從 Windows 10 傳統型版本開始(家用版、專業版、企業版和教育版)和 Windows 10 行動裝置版。

簡介

USB 雙重角色功能可讓系統成為 USB 裝置或 USB 主機。 如需 USB 雙重角色的詳細規格,請參閱 Go 資訊頁面上的 USB-IF USB。

雙重角色功能可讓行動裝置,例如手機或平板電腦,將自己指定為裝置或主機。

當行動裝置處於功能模式時,它會連接到電腦或其他裝置,做為鏈接行動裝置的主機。

當行動裝置處於主機模式時,用戶可以連結其裝置,例如滑鼠或鍵盤。 在此情況下,行動裝置會裝載連結的裝置。

藉由在 Windows 10 中提供 USB 雙重角色的支持,我們提供下列優點:

  • 透過USB連線到行動周邊裝置,相較於藍牙等無線通訊協定,可提供較大的數據頻寬。
  • 連線到其他 USB 裝置並與其他 USB 裝置通訊時,透過 USB 充電的電池選項(只要有必要的硬體支援)。
  • 讓最有可能擁有行動裝置的客戶,例如所有工作的智能手機。 此功能允許在有線停駐案例中提升生產力,其中行動裝置會停駐,因而裝載周邊裝置。

下表顯示桌面版和 Windows 行動裝置版上可用的主機類別驅動程式清單。

USB 主機類別驅動程式 Windows 10 Mobile Windows 10 傳統型版本
USB 中樞 (USBHUB) Yes 是 (自 Windows 2000 起)
HID - 鍵盤/老鼠(HidClass、KBDCLass、MouClass、KBDHid、MouHid) Yes 是 (自 Windows 2000 起)
USB 大量儲存空間(大量和 UASP) Yes 是 (自 Windows 2000 起)
一般 USB 主機驅動程式 (WinUSB) Yes 是(因為 Windows Vista)
USB 音訊進出 (USBAUDIO) Yes 是 (自 Windows XP 以來)
序列裝置 (USBSER) Yes 是 (自 Windows 10 起)
藍牙 (BTHUSB) Yes 是 (自 Windows XP 以來)
列印 (usbprint) No 是 (自 Windows XP 以來)
掃描 (USBSCAN) No 是 (自 Windows 2000 起)
WebCam (USBVIDEO) No 是(因為 Windows Vista)
媒體傳輸通訊協定 (MTP 啟動器) No 是(因為 Windows Vista)
遠端 NDIS (RNDIS) No 是 (自 Windows XP 以來)
透過 USB 的 IP (IPoverUSB) No 是 (Windows 10 的新功能)

數據表中的類別驅動程式是根據裝置類別遙測選取的,並根據針對 Windows 10 選取的主要案例。 我們計劃包含有限的收件匣、第三方主機驅動程式,以支援 Windows 10 行動裝置版 上的主要裝置。 而針對傳統型版本的 Windows 10,這些驅動程式可在 OEM 網站或透過 Windows Update (WU) 取得。

針對 Windows 10 行動裝置版,Windows Update 上不提供未包含收件匣的第三方驅動程式。 USB 主機堆疊 + HID 的磁碟使用量會保持小。 這就是為什麼並非所有類別驅動程式,以及少數第三方驅動程式都包含 Windows 10 行動裝置版 的收件匣。 想要讓第三方驅動程式可供使用的 OEM 可以使用面板支援套件 (BSP) 將其新增至其行動裝置的 OS 映射。

下表顯示 Windows 行動裝置版本上可用的函式類別驅動程式。

注意

Windows 10 傳統型版本無法使用函式驅動程式。

USB 函式類別驅動程式 Windows 10 Mobile Windows 10 傳統型版本 備註
媒體傳輸通訊協定 (MTP) 回應程式 No 桌面上的 MTP 回應程式沒有案例。 傳統型系統之間的 P2P 案例是透過 WinUSB 的 Easy-MigCable 來啟用。
視訊顯示 (vidstream) No
一般 USB 函式驅動程式 (GenericUSBFn) No IPoverUSB 和其他桌面閃爍案例需要此驅動程式。

我們會監視裝置附件數據,讓我們知道是否需要在裝置類別熱門清單更新時提供更多類別驅動程序支援。

驅動程序實作

Microsoft USB 角色交換器 (URS) 驅動程式可讓系統實作者利用其平臺的雙重角色 USB 功能。

URS 驅動程式旨在為使用單一 USB 控制器的平臺提供雙角色功能,而該控制器可以在主機和周邊角色中透過單一埠運作。 周邊角色也稱為函式角色。 URS 驅動程式會管理埠的目前角色。 URS 驅動程式會根據平台的硬體事件,載入和卸除適當的軟體堆疊。

在具有USB micro-AB 連接器的系統上,驅動程式會使用硬體中斷,指出連接器上的標識碼針腳狀態。 此針腳可用來偵測控制器是否需要在連線中擔任主機角色或函式角色。 如需詳細資訊,請參閱 USB On-The-Go規格。 在具有USB Type-C 連接器的系統上,OEM 實作者預期會使用 USB Type-C 連接器驅動程式程式設計介面來提供連接器用戶端驅動程式。 用戶端驅動程式會與Microsoft提供的 USB 連接器管理員類別延伸模組 (UcmCx) 進行通訊,以管理 USB Type-C 連接器的所有層面,例如 CC 偵測、PD 傳訊等。 針對角色切換,用戶端驅動程式會將USB Type-C連接器的狀態與URS驅動程序通訊。

下圖顯示使用 URS 驅動程式之雙角色控制器的 USB 軟體驅動程式堆疊。

usb 角色交換器驅動程式堆疊架構。

URS 驅動程式永遠不會同時載入上圖中顯示的函式和主機堆疊。 根據 USB 控制器的角色,URS 驅動程式會載入函式堆疊或主機堆疊。

硬體需求

如果您要開發利用 URS 驅動程式的平臺,若要提供雙重角色 USB 功能,則必須符合下列硬體需求:

  • USB 控制器

    這些驅動程式是由Microsoft提供為內建驅動程式。

    Synopsys DesignWare Core USB 3.0 控制器。 收件匣 INF:UrsSynopsys.inf。

    Chipidea 高速 USB OTG 控制器。 收件匣 INF:UrsChipidea.inf。

  • 標識子針腳中斷

    • 非 USB Type-C 系統的一或多個標識符針腳中斷會以下列兩種方式之一實作:

      1. 兩個邊緣觸發的中斷:一個會在連接線上的標識符針腳停駐時引發,另一個會在ID針腳浮動時引發。
      2. 當ID針腳為地面時,處於作用中層級的單一主動-兩個中斷。
  • USB 控制器列舉

    USB 雙角色控制器必須列舉 ACPI。

  • 軟體支援

    URS 驅動程式需要一個軟體介面,允許透過連接器控制 VBus。 此介面為SoC專用。 如需詳細資訊,請連絡您的SoC廠商。

Windows 不支持這些 USB OTG 功能:

  • 配件充電器配接器偵測 (ACA) 。
  • 工作階段要求通訊協定 (SRP)。
  • 主機交涉通訊協定(HNP)。
  • 附加偵測通訊協定 (ADP)。

ACPI 系統設定

若要使用 URS 驅動程式,您必須為系統建立 ACPI 定義檔案。 此外,您必須考慮一些驅動程式相關的考慮。

以下是USB雙角色控制器的ACPI定義範例。

//
// You may name the device whatever you want; we don't depend on it being called 'URS0'.
//
Device(URS0)
{
    //
    // Replace with your own hardware ID. Microsoft will add it to the inbox INF,
    // or you may choose to author a custom INF that uses Needs & Includes directives
    // to include sections from the inbox INF.
    //
    Name(_HID, "ABCD1234")

    Name(_CRS, ResourceTemplate() {
        //
        // The register space for the controller must be defined here.
        //
        Memory32Fixed(ReadWrite, 0xf1000000, 0xfffff)


        //
        // The ID pin interrupts, if you are using two edge-triggered interrupts.
        //
        GpioInt(Edge, ActiveHigh, Exclusive, PullUp, 0, "\\_SB.GPI0", 0, ResourceConsumer, , ){0x1001}
        GpioInt(Edge, ActiveHigh, Exclusive, PullUp, 0, "\\_SB.GPI0", 0, ResourceConsumer, , ){0x1002}

        //
        // Following is an example of a single active-both interrupt.
        //
        // GpioInt(Edge, ActiveBoth, Exclusive, PullUp, 0, "\\_SB.GPI0", 0, ResourceConsumer, , ){0x12}
        //

        //
        // For a Type-C platform, you do not need to specify any interrupts here.
        //
    })

    //
    // This child device represents the USB host controller. This device node is in effect
    // when the controller is in host mode.
    // You may name the device whatever you want; we don't depend on it being called 'USB0'.
    //
    Device(USB0)
    {
        //
        // The host controller device node needs to have an address of '0'
        //
        Name(_ADR, 0)
        Name(_CRS, ResourceTemplate() {

            //
            // The controller interrupt.
            //
            Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive, , , ){0x10}
        })
    }

    //
    // This child device represents the USB function controller. This device node is in effect
    // when the controller is in device/function/peripheral mode.
    // You may name the device whatever you want; we don't depend on it being called 'UFN0'.
    //
    Device(UFN0)
    {
        //
        // The function controller device node needs to have an address of '1'
        //
        Name(_ADR, 1)
        Name(_CRS, ResourceTemplate() {

            //
            // The controller interrupt (this could be the same as the one defined in
            // the host controller).
            //
            Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive, , , ){0x11}
        })
    }
}

以下是 ACPI 檔案主要區段的一些說明:

  • URS0 是 USB 雙角色控制器的 ACPI 定義。 URS 驅動程式會在此 ACPI 裝置上載入。

  • USB0 和 UFN0 是 URS0 範圍內的子裝置。 USB0 和 UFN0 分別代表 URS 驅動程式所列舉的兩個子堆疊,以及主機和函式堆疊。 _ADR是 ACPI 將這些裝置定義與 URS 驅動程式所建立的裝置物件相符的方法。

  • 如果控制器針對這兩個角色使用相同的中斷,則可以在兩個子裝置中描述相同的控制器中斷。 即使在這種情況中,中斷仍可描述為「獨佔」。

  • 您可以視需要新增此 ACPI 定義檔。 例如,您可以在 ACPI 定義檔中的任何裝置上設定任何其他必要方法或屬性。 這類新增功能不會干擾 URS 驅動程式的作業。 任何堆疊中所需的任何其他資源,也可以在適當裝置的_CRS中描述。

URS 驅動程式會將硬體標識碼指派給主機和函式堆疊。 這些硬體標識子衍生自 URS 裝置的硬體識別碼。 例如,如果您有硬體標識碼為 ACPI\ABCD1234 的 URS 裝置,則 URS 驅動程式會建立主機和函式堆疊的硬體識別碼,如下所示:

  • 主機堆棧:URS\ABCD1234&HOST

  • 函式堆疊:URS\ABCD1234&FUNCTION

INF 驅動程式安裝套件

第三方驅動程式套件可以視需要相依於此配置。

如果您是 IHV 或 OEM,且您正在考慮提供您自己的驅動程式套件,以下是一些需要考慮的事項:

  • URS 驅動程式套件

    每個平臺上雙角色控制器的硬體標識符會新增至適用於URS的收件匣INF。 不過,如果基於某些原因無法新增標識碼,IHV/OEM 可以提供驅動程式套件與需要/包含收件匣 INF 並符合其硬體識別碼的 INF。

    IHV/OEM 需要有篩選器驅動程式才能出現在驅動程式堆疊中時,需要此驅動程式套件。

  • 主機驅動程式套件

    需要/包含收件匣 usbxhci.inf 且符合主機裝置硬體標識碼的 IHV/OEM 提供的驅動程式套件。 硬體標識元比對會以上一節中所述的配置為基礎。

    IHV/OEM 需要有篩選器驅動程式才能出現在驅動程式堆疊中時,需要此驅動程式套件。

    進行中的工作正在進行中,讓 URS 驅動程式指派主機裝置的 XHCI 相容識別碼。

  • 函式驅動程式套件

    需要/包含收件匣 Ufxsynopsys.inf 且符合周邊裝置硬體標識碼的 IHV/OEM 提供的驅動程式套件。 硬體標識元比對會以上一節中所述的配置為基礎。

    IHV/OEM 也可以在驅動程式套件中包含篩選驅動程式。

另請參閱