USB デュアル ロール ドライバー スタック アーキテクチャ

USB デュアル ロール コントローラーは、Windows 10 デスクトップ エディション (Home、Pro、Enterprise、Education) および Windows 10 Mobile 以降、Windows でサポートされるようになりました。

はじめに

USB デュアル ロール機能を使用すると、システムを USB デバイスまたは USB ホストにすることができます。 USB デュアル ロールの詳細な仕様は、USB-IF の USB on the Go ページで確認できます。

デュアル ロール機能により、電話やタブレットなどのモバイル デバイスでモバイル デバイス自体をデバイスまたはホストとして指定できます。

モバイル デバイスが機能モードの場合、接続されているモバイル デバイスのホストとして機能する PC またはその他のデバイスに接続されます。

モバイル デバイスがホスト モードの場合、ユーザーはデバイス (マウスやキーボードなど) を接続できます。 この場合、モバイル デバイスは接続されたデバイスをホストします。

Windows 10 で USB デュアル ロールのサポートを提供することにより、次の利点が得られます。

  • USB 経由でモバイル周辺機器に接続すると、Bluetooth などのワイヤレス プロトコルと比較してより大きなデータ帯域幅が提供されます。
  • 他の USB デバイスに接続および通信しながら、USB 経由でバッテリーを充電するオプション (必要なハードウェア サポートが存在する場合)。
  • スマートフォンなどのモバイル デバイスを所有している可能性が高い顧客がすべての仕事に使用できるようにします。 この機能により、モバイル デバイスがドッキングされて周辺デバイスをホストする有線ドッキング シナリオの生産性が向上します。

次の表に、Windows のデスクトップ エディションとモバイル エディションで使用できるホスト クラス ドライバーの一覧を示します。

USB ホスト クラス ドライバー Windows 10 Mobile Windows 10 デスクトップ エディション
USB ハブ (USBHUB) はい はい (Windows 2000 以降)
HID - キーボード/マウス (HidClass、KBDCLass、MouClass、KBDHid、MouHid) はい はい (Windows 2000 以降)
USB 大容量ストレージ (バルク & UASP) はい はい (Windows 2000 以降)
汎用 USB ホスト ドライバー (WinUSB) はい はい (Windows Vista 以降)
USB オーディオイン/アウト (USBAUDIO) はい はい (Windows XP 以降)
シリアル デバイス (USBSER) はい はい (Windows 10 以降)
Bluetooth (BTHUSB) はい はい (Windows XP 以降)
印刷 (usbprint) いいえ はい (Windows XP 以降)
スキャン (USBSCAN) いいえ はい (Windows 2000 以降)
WebCam (USBVIDEO) いいえ はい (Windows Vista 以降)
メディア転送プロトコル (MTP イニシエーター) いいえ はい (Windows Vista 以降)
リモート NDIS (RNDIS) いいえ はい (Windows XP 以降)
IP over USB (IPoverUSB) いいえ はい (Windows 10 の新機能)

表内のクラス ドライバーは、デバイス クラス テレメトリと、Windows 10 用に選択された主要なシナリオに基づいて選択されました。 Windows 10 Mobile 上の主要なデバイスをサポートするために、限られた数のインボックス、サード パーティ製ホスト ドライバーを含める予定です。 また、デスクトップ エディションの Windows 10 の場合、これらのドライバーは OEM の Web サイトまたは Windows Update (WU) 経由で入手できます。

Windows 10 Mobile の場合、インボックスに含まれていないサード パーティ製ドライバーは、Window Update では使用できません。 USB ホスト スタック + HID のディスク フットプリントは小さく抑えられています。 これが、Windows 10 Mobile のインボックスにすべてのクラス ドライバーが含まれているわけではなく、ごくわずかなサード パーティ製ドライバーが含まれている理由です。 サード パーティ製ドライバーを利用可能にしたい OEM は、ボード サポート パッケージ (BSP) を使用して、モバイル デバイスの OS イメージにドライバーを追加できます。

次の表は、Windows のモバイル エディションで使用できる機能クラス ドライバーを示しています。

Note

Windows 10 デスクトップ エディションでは、関数ドライバーを使用できません。

USB 機能クラス ドライバー Windows 10 Mobile Windows 10 デスクトップ エディション メモ
メディア転送プロトコル (MTP レスポンダー) はい いいえ デスクトップ上の MTP レスポンダーのシナリオはありません。 デスクトップ システム間の P2P シナリオは、WinUSB 経由の Easy-MigCable 経由で有効になりました。
ビデオ表示出力 (ビデオストリーム) はい いいえ
汎用 USB 関数ドライバー (GenericUSBFn) はい いいえ IPoverUSB およびその他のデスクトップ フラッシュ シナリオでは、このドライバーが必要です。

デバイス クラスの人気リストは更新されるため、その他のクラス ドライバー サポートを提供する必要があるかどうかを通知するために、デバイスの接続データを監視します。

ドライバーの実装

Microsoft USB ロール スイッチ (URS) ドライバーを使用すると、システム実装者はプラットフォームのデュアル ロール USB 機能を活用できます。

URS ドライバーは、単一のポート上でホストとペリフェラルの両方の役割で動作できる単一の USB コントローラーを使用するプラットフォームにデュアルロール機能を提供することを目的としています。 周辺機器ロールは、関数ロールとも呼ばれます。 URS ドライバーは、ポートの現在の役割を管理します。 URS ドライバーは、プラットフォームからのハードウェア イベントに基づいて、適切なソフトウェア スタックを読み込んでアンロードします。

USB マイクロ AB コネクタを備えたシステムでは、ドライバーはコネクタの ID ピンの状態を示すハードウェア割り込みを利用します。 このピンは、コントローラーが接続においてホストの役割を担う必要があるのか、それとも機能の役割を引き受ける必要があるのかを検出するために使用されます。 詳細については、USB On-The-Go の仕様に関する記事を参照してください。 USB Type-C コネクタを備えたシステムでは、OEM 実装者は USB Type-C コネクタ ドライバ プログラミング インターフェイスを使用してコネクタ クライアント ドライバーを提供することが期待されます。 クライアント ドライバーは、マイクロソフトが提供する USB コネクタ マネージャー クラス拡張機能 (UcmCx) と通信して、CC 検出、PD メッセージングなど、USB Type-C コネクタのあらゆる側面を管理します。 ロールを切り替えるために、クライアント ドライバーは USB Type-C コネクタの状態を URS ドライバーに伝えます。

次の図は、URS ドライバーを使用するデュアルロール コントローラーの USB ソフトウェア ドライバー スタックを示しています。

USB ロールスイッチ ドライバー スタック アーキテクチャ。

URS ドライバーは、上の図に示されている機能スタックとホスト スタックを同時に読み込むことは決してありません。 URS ドライバーは、USB コントローラーの役割に応じて、機能スタックまたはホスト スタックを読み込みます。

ハードウェア要件

URS ドライバーを利用するプラットフォームを開発している場合、デュアルロール USB 機能を提供するには、次のハードウェア要件を満たす必要があります。

  • USB コントローラー

    これらのドライバーは、マイクロソフトによってインボックス ドライバーとして提供されます。

    Synopsys DesignWare Core USB 3.0 コントローラー。 受信トレイ INF: UrsSynopsys.inf。

    Chipidea High-Speed USB OTG コントローラー。 受信トレイ INF: UrsChipidea.inf。

  • ID ピン割り込み

    • 次の 2 つの方法のいずれかで、非 USB Type-C システムの ID ピン割り込みを 1 つ以上実装します。

      1. 2 つのエッジによってトリガーされる割り込み:1 つはコネクタの ID ピンが接地されたときに発生し、もう 1 つは ID ピンが浮動しているときに発生します。
      2. ID ピンが接地されている場合にアクティブ レベルにある 1 つのアクティブ/両方割り込み。
  • USB コントローラーの列挙

    USB デュアルロール コントローラーは ACPI 列挙する必要があります。

  • ソフトウェア サポート

    URS ドライバーは、コネクタ経由で VBus を制御できるソフトウェア インターフェイスを想定しています。 このインターフェイスは SoC 固有です。 詳細については、SoC ベンダーにお問い合わせください。

Windows では、次の USB OTG 機能はサポートされていません。

  • アクセサリ 充電器アダプター検出 (ACA)。
  • セッション要求プロトコル (SRP)。
  • ホスト ネゴシエーション プロトコル (HNP)。
  • Attach Detection Protocol (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 ドライバーによって列挙される 2 つの子スタック、およびそれぞれホスト スタックと機能スタックを表します。 _ADR は、ACPI がこれらのデバイス定義を URS ドライバーが作成するデバイス オブジェクトと照合する手段です。

  • コントローラーが両方のロールに同じ割り込みを使用する場合、両方の子デバイスで同じコントローラー割り込みを記述できます。 その場合でも、割り込みは「排他的」と表現できます。

  • 必要に応じて、この ACPI 定義ファイルに追加できます。 たとえば、ACPI 定義ファイル内の任意のデバイスに必要なその他のメソッドまたはプロパティを設定できます。 このような追加は、URS ドライバーの操作に干渉しません。 他のスタックで必要な追加リソースを、適切なデバイスの _CRS に記述することもできます。

URS ドライバーは、ホストと関数スタックにハードウェア ID を割り当てます。 これらのハードウェア ID は、URS デバイスのハードウェア ID から派生します。 たとえば、ハードウェア ID が ACPI\ABCD1234 である URS デバイスがある場合、URS ドライバーは次のようにホストおよび関数スタックのハードウェア ID を作成します。

  • ホスト スタック: URS\ABCD1234&HOST

  • 関数スタック: URS\ABCD1234&FUNCTION

INF ドライバーのインストール パッケージ

サードパーティのドライバー パッケージは、必要に応じてこのスキームに依存することができます。

IHV または OEM で、独自のドライバー パッケージの提供を検討している場合は、次の点を考慮する必要があります。

  • URS ドライバー パッケージ

    デュアルロール コントローラーのハードウェア ID が URS のインボックス INF に追加されます。 ただし、何らかの理由で ID を追加できない場合、IHV/OEM は、インボックス INF を必要とするかインボックス INF を含む、かつハードウェア ID と一致する INF を持つドライバー パッケージを提供する場合があります。

    このドライバー パッケージは、IHV/OEM がドライバー スタックにフィルター ドライバーが存在することを要求する場合に必要です。

  • ホスト ドライバー パッケージ

    受信トレイ usbxhci.inf が必要で、ホスト デバイスのハードウェア ID と一致する IHV/OEM 提供のドライバー パッケージが必要です。 ハードウェア ID の一致は、前のセクションで説明したスキームに基づきます。

    このドライバー パッケージは、IHV/OEM がドライバー スタックにフィルター ドライバーが存在することを要求する場合に必要です。

    URS ドライバーがホスト デバイスに XHCI 互換 ID を割り当てるようにする作業が進行中です。

  • 関数ドライバー パッケージ

    受信トレイ Ufxsynopsys.inf が必要で、周辺デバイスのハードウェア ID と一致する IHV/OEM 提供のドライバー パッケージが必要です。 ハードウェア ID の一致は、前のセクションで説明したスキームに基づきます。

    IHV/OEM は、ドライバー パッケージにフィルター ドライバーを含めることもできます。

関連項目