USB Type-C® Connector System Software Interface (UCSI) ドライバー

Microsoft では、ACPI トランスポート用の USB Type-C® Connector System Software Interface (UCSI) 仕様に準拠したドライバーを提供しています。 設計に ACPI トランスポートがある組み込みのコントローラーが含まれている場合は、システムの BIOS/EC に UCSI を実装し、インボックス UCSI ドライバー (UcmUcsiCx.sys および UcmUcsiAcpiClient.sys) を読み込みます。

UCSI 準拠のハードウェアが ACPI 以外のトランスポートを使用している場合は、UCSI クライアント ドライバーを作成する必要があります。

埋め込みコントローラーを備えたシステム用 USB Type-C コンポーネントをサポートするためのドライバー

以下は、コントローラーが組み込まれたシステムの例です。

Diagram of USB Type-C software components.

前の例では、USB ロールの切り替えはシステムのファームウェアで処理され、USB ロール スイッチ ドライバー スタックは読み込まれません。 別のシステムでは、デュアル ロールがサポートされていないため、ドライバー スタックが読み込まれない可能性があります。

上の図において、

  • USB デバイス側ドライバー

    USB デバイス側ドライバーは、機能、デバイス、周辺機器に対応します。 USB 関数コントローラーのクラス拡張機能は、MTP (メディア転送プロトコル)、および BC 1.2 充電器を使用した充電に対応しています。 Microsoft では、Synopsys USB 3.0 および ChipIdea USB 2.0 コントローラー用のインボックス クライアント ドライバーが提供されています。 USB 関数コントローラー クライアント ドライバーのプログラミング インターフェイスを使用して、関数コントローラー用のカスタム クライアント ドライバーを作成できます。 詳細については、USB 関数コントローラー用 Windows ドライバーの開発に関する記事を参照してください。

    SoC ベンダーは、充電器検出用の USB 関数の下位フィルター ドライバーを提供している場合があります。 インボックスの Synopsys USB 3.0 または ChipIdea USB 2.0 クライアント ドライバーを使用している場合、独自のフィルター ドライバーを実装できます。

  • USB ホスト側ドライバー

    USB ホスト側ドライバーは、EHCI または XHCI 準拠の USB ホスト コントローラーで動作する一連のドライバーです。 ドライバーは、ロール スイッチ ドライバーがホストのロールを列挙した場合に読み込まれます。 ホスト コントローラーが仕様に準拠していない場合、USB ホスト コントローラー拡張機能 (UCX) プログラミング インターフェイスを使用してカスタム ドライバーを記述できます。 詳細については、USB ホスト コントローラー用 Windows ドライバーの開発に関する記事を参照してください。

    すべての USB デバイス クラスが Windows 10 Mobile でサポートされているわけではありません 。

  • USB コネクタ マネージャー

    Microsoft では、USB Type-C コネクタ システム ソフトウェア インターフェイス仕様で定義されている機能を実装する Windows (UcmUcsiCx.sys) を備えた UCSI インボックス ドライバーを提供しています。 この仕様では、UCSI の機能、およびハードウェア コンポーネント デザイナー、システム ビルダー、およびデバイス ドライバーの開発者向けにレジスタとデータ構造について説明します。

    このドライバーは、埋め込みコントローラーを備えたシステムを対象としています。 このドライバーは、Microsoft が提供する USB コネクタ マネージャーのクラス拡張機能ドライバー (Ucmcx.sys) のクライアントです。 ドライバーでは、ファームウェアへの要求を開始してデータまたは電源ロールを変更し、ユーザーにトラブルシューティング メッセージを提供するために必要な情報を取得するなどのタスクが処理されます。

Windows で必要な UCSI コマンド

すべての UCSI 実装で必須になっているコマンドについては、UCSI の仕様を参照してください。

Required とマークされているコマンドの他に、Windows では次のコマンドが必須です。

  • GET_ALTERNATE_MODES
  • GET_CAM_SUPPORTED
  • GET_PDOS
  • SET_NOTIFICATION_ENABLE: システムまたはコントローラーは、SET_NOTIFICATION_ENABLE 内で以下の通知をサポートする必要があります。
    • Supported Provider Capabilities Change (サポートされているプロバイダー機能の変更)
    • Negotiated Power Level Change (ネゴシエートされる電源レベルの変更)
  • GET_CONNECTOR_STATUS: システムまたはコントローラーは、GET_CONNECTOR_STATUS 内で以下のコネクタ ステータスの変更をサポートする必要があります。
    • Supported Provider Capabilities Change (サポートされているプロバイダー機能の変更)
    • Negotiated Power Level Change (ネゴシエートされる電源レベルの変更)

BIOS で UCSI を実装するために必要なタスクの詳細については、「Intel BIOS Implementation of UCSI」を参照してください。

UCSI 2.0 以降の UCM-UCSI ACPI デバイス

Windows 11 バージョン 22H2 9 月の更新プログラム以降、Windows UCM-UCSI ACPI デバイス ドライバーは UCSI 仕様バージョン 2.0 および 2.1 をサポートしています。 UCSI 仕様 2.0 では、「UCSI 仕様表 3-1 のデータ構造」で定義されているデータ構造のメモリ マッピングに大幅な変更が加えられています。 下位互換性を維持するため、Windows では、仕様バージョン 2.0 以上の UCSI PPM が、ACPI ファームウェアの UCM-UCSI ACPI デバイスの下で以下の _DSM 関数を実装する必要があり、報告された UCSI 仕様バージョンに UCSI OPM が従う必要があることを示すため 0 以外の値を返す必要があります。

  • Arg0: UUID = 6F8398C2-7CA4-11E4-AD36-631042B5008F
  • Arg1: リビジョンID = 0
  • Arg2: 関数インデックス = 5
  • Arg3: 空のパッケージ (未使用)

戻り値:

要素 オブジェクトの種類 説明
UsePpmReportedUcsiVersion 整数 (32 ビット) 0x00000000 (既定値): UCSI 仕様表 3-1 データ構造で定義されている VERSION 構造の値が 2.0 以上の場合でも、UCSI OPM は UCSI 仕様 1.2 に従います。 それ以外の場合、UCSI OPM は VERSION 構造の値に基づき UCSI 仕様に従います。

Note

UCM-UCSI ACPI デバイスの場合、これは既存の _DSM メソッドの新しい関数です。 この _DSM メソッドの他の関数は、「UCSI の Intel BIOS 実装」ドキュメントに従って実装されている必要があります。 サポートされているすべての関数のビットマスクを返す関数 0 も、それに応じて更新する必要があります。

UCSI のフローの例

このセクションで示す例では、USB Type-C ハードウェアまたはファームウェア、UCSI ドライバー、およびオペレーティング システム間の相互作用について説明します。

DRP ロールの検出

  1. USB Type-C ハードウェアまたはファームウェアでデバイス アタッチ イベントが検出され、最初に Windows 10 システムの DRP システムが UFP ロールになります。
    1. ファームウェアで、コネクタが変更されたことを示す通知が送信されます。
    2. UCSI ドライバーにより、GET_CONNECTOR_STATUS 要求が送信されます。
    3. ファームウェアによって、Connect Status = 1 および Connector Partner Type = DFP という応答が返されます。 ​
  2. USB 関数スタック内のドライバーは、列挙に応答します。
  3. USB コネクタ マネージャーのクラス拡張機能で、USB 関数スタックが読み込まれたことによりシステムの状態が正しくないことが認識されます。 これは、Set USB Operation Role 要求および Set Power Direction Role 要求をファームウェアに送信するように UCSI ドライバーに指示します。
  4. USB Type-C ハードウェアまたはファームウェアで、DFP を使用してロールスワップ操作が開始されます。

充電器の不一致エラー条件の検出

  1. USB Type-C ハードウェアまたはファームウェアで充電器が接続されていることが検出され、既定の電源コントラクトのネゴシエーションが開始されます。 さらに、充電器がシステムに十分な電力を供給していないことも確認します。

  2. USB Type-C ハードウェアまたはファームウェアにより、低速充電されている部分が設定されます。

    1. ファームウェアで、コネクタが変更されたことを示す通知が送信されます。
    2. UCSI ドライバーにより、GET_CONNECTOR_STATUS 要求が送信されます。
    3. ファームウェアによって、Connect Status = 1、Connector Partner Type = DFP、および Battery Charging Status = Slow/Trickle という応答が返されます。
  3. 充電器の不一致のトラブルシューティング メッセージを表示するため、USB コネクタ マネージャーのクラス拡張機能によって UI に通知が送信されます。

UCSI のテスト方法

UCSI 実装は、さまざまな方法でテストできます。 UCSI BIOS/EC 実装で個々のコマンドをテストするには、MUTT Software Pack で提供されている UCSIControl.exe を使用します。 完全な UCSI の実装をテストするには、Windows Hardware Lab Kit (HLK) に含まれている UCSI テストと、Type-C の手動での相互運用機能の手順に関する記事に記載されている手順を使用します。

UCSIControl.exe

UCSIControl.exe を使用して、UCSI BIOS/EC 実装で個々のコマンドをテストできます。 このツールを使用すると、UCSI ドライバーを使用して、UCSI コマンドをファームウェアに送信できます。 ドライバーが読み込まれて実行されていること、およびドライバーのテスト インターフェイスが有効になっていることが必要です。 既定では、このインターフェイスは、小売システム上の承認されていないユーザーがアクセスできないよう、有効になっていません。

  1. UCSI USB コネクタ マネージャーという名前のデバイス マネージャー (devmgmt.msc) でデバイス ノードを見つけます。 ノードは [ユニバーサル シリアル バス コントローラー] カテゴリにあります。

  2. デバイスを長押し (または右クリック) し、[プロパティ] を選択して、[詳細] タブを開きます。

  3. ドロップダウンから [デバイス インスタンス パス] を選択し、プロパティの値を書き留めます。

  4. レジストリ エディター (regedit.exe) を開きます。

  5. このキーの配下にあるデバイス インスタンス パスに移動します。

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\<device-instance-path>\Device Parameters

  6. TestInterfaceEnabled という名前の DWORD 値を作成し、値を 0x1 に設定します。

  7. デバイス マネージャーのデバイス ノードで [無効] オプションを選択してから [有効] 選択し、デバイスを再起動します。 または、PC を再起動することもできます。

ヘルプを表示するには、UcsiControl.exe /? を実行します。

一般的なコマンドを次に示します。

UCSI コマンド UcsiControl.exe コマンド
PPM Reset UcsiControl.exe Send 0 1
Connector Reset ソフト リセット: UcsiControl.exe Send 0 10003

ハード リセット: UcsiControl.exe Send 0 810003
Set Notification Enable すべての通知: UcsiControl.exe Send 0 ffff0005

コマンド完了のみ: UcsiControl.exe Send 0 00010005

通知なし: UcsiControl.exe Send 0 00000005
Get Capability UcsiControl.exe Send 0 6
Get Connector Capability UcsiControl.exe Send 0 10007
Set UOM DFP: UcsiControl.exe Send 0 810008

UFP: UcsiControl.exe Send 0 1010008

DRP: UcsiControl.exe Send 0 2010008
Set UOR DFP: UcsiControl.exe Send 0 810009

UFP: UcsiControl.exe Send 0 1010009

承諾: UcsiControl.exe Send 0 2010009
Set PDR プロバイダー: UcsiControl.exe Send 0 81000B

コンシューマー: UcsiControl.exe Send 0 101000B

承諾: UcsiControl.exe Send 0 201000B
Get PDOs ローカル ソース: UcsiControl.exe Send 7 00010010

ローカル シンク: UcsiControl.exe Send 3 00010010

リモート ソース: UcsiControl.exe Send 7 00810010

リモート シンク: UcsiControl.exe Send 3 00810010
Get Connector Status UcsiControl.exe Send 0 010012
Get Error Status UcsiControl.exe Send 0 13