共用方式為


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

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

簡介

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

這裡的重點是,雙重角色功能允許行動裝置,例如手機、平板電腦或平板計算機,將本身指定為裝置或主機。

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

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

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

  • 透過USB連線到行動周邊裝置,相較於藍牙等無線通訊協定,可提供較大的數據頻寬。
  • 只要有所需的硬體支援存在) ,即可選擇透過 USB 連線到其他 USB 裝置並與其通訊 (電池充電。
  • 啟用最有可能擁有行動裝置的客戶,例如所有工作的智慧型手機。 這項功能可在有線停駐案例中改善生產力,其中行動裝置停駐並裝載周邊裝置。

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

USB 主機類別驅動程式 Windows 10 Mobile Windows 10 傳統型版本
USB HUB (USBHUB) Yes 是,自 Windows 2000) 以來 (
HID - 鍵盤/滑鼠 (HidClass、KBDCLass、一個) Yes 是,自 Windows 2000) 以來 (
USB 大量記憶體 (大量 & UASP) Yes 是,自 Windows 2000) 以來 (
一般 USB 主機驅動程式 (WinUSB) Yes 是,自 Windows Vista) 以來 (
USB AUDIO in/ out (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 (IPoverUSB) 的IP No 是 (新增 Windows 10)

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

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

下表顯示 Windows 行動 SKU 上可用的 式類別驅動程式。

注意

傳統型版本的 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 驅動程式會根據平台的硬體事件,管理埠的目前角色,以及載入和卸除適當的軟體堆疊。

在具有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 驅動程式永遠不會同時載入上圖中顯示的函式和主機堆疊。 URS 驅動程式 會載入函 式堆疊 主機堆疊,視USB控制器的角色而定。

硬體需求

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

  • USB 控制器

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

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

    Chipidea High-Speed USB OTG 控制器。 收件匣 INF:UrsChipidea.inf。

  • 標識子針腳中斷

    非USB Type-C系統的標識符針腳中斷 () ,可以透過下列兩種方式之一來實作:

    兩個邊緣觸發的中斷:一個會在連接線上的標識符針腳關閉時引發,另一個會在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 也可以在驅動程式套件中包含篩選驅動程式。

另請參閱

雙重角色控制器驅動程序參考