Write a USB Type-C Policy Manager client driver (USB Type-C ポリシー マネージャー クライアント ドライバーの作成)

マイクロソフト提供の USB Type-C ポリシー マネージャーは、USB Type-C コネクタのアクティビティを監視します。 Windows バージョン 1809 では、ポリシー マネージャー (このトピックでは PM クライアント ドライバーと呼ばれます) にクライアント ドライバーを記述するために使用できるプログラミング インターフェイスのセットが導入されています。 クライアント ドライバーは、USB Type-C コネクタのポリシー決定に参加できます。 このセットでは、カーネル モード エクスポート ドライバーまたはユーザー モード ドライバーの作成を選択できます。

ポリシー マネージャーは、USB コネクタ マネージャー (UCM)、USB ホスト コントローラー、USB 機能、および PM クライアント ドライバーから情報を取得して調整します。 UI 通知が必要な場合、ポリシー マネージャーはシステム シェルに要求を送信します。

Architechtural block diagram for USB Policy Manager.

ドライバーについて詳しくは、「アーキテクチャ: Windows システムの USB Type-C 設計」をご覧ください。

重要な API

PM API は、Usbpmapi.h ヘッダーで宣言されています。

1: クライアントの登録

  1. クライアント ドライバーは、ドライバーのコールバック関数を登録する UsbPm_Register を呼び出します。
  2. クライアント ドライバーは、ポリシー マネージャーからのイベントを待機します。

    UsbPm_Register 呼び出しが成功しても、クライアント ドライバーがアクセスを要求したことは保証されません。 ポリシー マネージャーの準備ができたら、ドライバーの EVT_USBPM_EVENT_CALLBACKは、付与された実際のアクセスを示すイベント データとして PolicyManagerArrival で呼び出されます。

  3. UsbPm_Register 呼び出しは登録ハンドルを返します。

    クライアント ドライバーは、UsbPm_Register が戻る前でも EVT_USBPM_EVENT_CALLBACK を受け取る可能性があります。

2: ハブの到着

  1. UCMCX デバイスが到着すると、ポリシー マネージャーが通知を受け取り、各ハブ上のすべてのコネクタのプロパティと状態と共にすべてのハブ ハンドルを追跡します。
  2. クライアント ドライバーの EVT_USBPM_EVENT_CALLBACK は、イベント データとして HubArrivalRemoval を使用して呼び出されます。 呼び出しには、ハブ ハンドルも含まれています。
  3. クライアント ドライバーの EVT_USBPM_EVENT_CALLBACK の実装では、ドライバーは UsbPm_RetrieveHubProperties を呼び出してハブ上のコネクタの数を取得し、UsbPm_RetrieveConnectorProperties および UsbPm_RetrieveConnectorState を呼び出して各コネクタに関する詳細情報を取得します。

3: コネクタ状態の変更

  1. コネクタ状態の変更 (Type-C のアタッチ/デタッチ、PD コントラクト ネゴシエートなど) があると、ポリシー マネージャーはコネクタ単位の状態情報を更新します。
  2. クライアント ドライバーの EVT_USBPM_EVENT_CALLBACK は、イベント データとして ConnectorStateChange を使用して呼び出されます。 呼び出しには、コネクタ ハンドルも含まれています。
  3. クライアント ドライバーの完了ルーチンも呼び出され、それに応じてアクションが実行されます。
  4. クライアント ドライバーの EVT_USBPM_EVENT_CALLBACK の実装で、ドライバーはUsbPm_RetrieveConnectorProperties を呼び出します。 ドライバーは、指定されたコネクタ ハンドルを使用することにより、最新のコネクタ状態を取得して、検査します。ローカル コピーの更新を決定することもあります。

4: クライアント ドライバーによって開始された変更

  1. 変更を要求するため、クライアント ドライバーは UsbPm_AssignConnectorPowerLevel を呼び出します。

    クライアント ドライバーは、UsbPm_Register を使用して登録された EVT_USBPM_EVENT_CALLBACK コールバック内でこの関数を呼び出す場合があります。

  2. ポリシー マネージャーは、USB コネクタ マネージャー (UCM) に要求を転送します。 UcmCx のクライアント ドライバーは、適切なアクションを実行して要求された状態を変更します。

  3. クライアント ドライバーの EVT_USBPM_EVENT_CALLBACK は、イベント データとして ConnectorStateChange を使用して呼び出されます。 呼び出しには、コネクタ ハンドルも含まれています。

  4. クライアント ドライバーの完了ルーチンも呼び出され、それに応じてアクションが実行されます。

  5. コールバック内で、クライアント ドライバーは、指定されたコネクタ ハンドルを使用して UsbPm_RetrieveConnectorStateを呼び出して、最新のコネクタ状態を取得し、それを検査します。ローカル コピーの更新を決定することもあります。

5: ハブの削除

  1. UCM は、(UcmCx デバイス上の個々のコネクタではなく) UcmCx デバイスが削除されると、ポリシー マネージャーに通知します。 ポリシー マネージャーは、ハブ コレクションからハブを削除します。
  2. クライアント ドライバーの EVT_USBPM_EVENT_CALLBACK 実装は、イベント データとして HubRemoval を使用して呼び出されます。 呼び出しには、ハブ ハンドルも含まれています。
  3. クライアント ドライバーの EVT_USBPM_EVENT_CALLBACK の実装では、クライアント ドライバーは、削除対象のハブとコネクタのクリーンアップ タスクを実行します。 ドライバーは、UsbPm_RetrieveHubPropertiesUsbPm_RetrieveConnectorProperties を呼び出して、ハブとコネクタのプロパティを取得できます。

6: クライアントの登録解除

  1. クライアント ドライバーは、ドライバーに通知が不要になったときに UsbPm_Deregister を呼び出します。
  2. ポリシー マネージャーは、クライアント ハンドルの登録を登録解除済みとしてマークし、EVT_USBPM_EVENT_CALLBACK コールバックを呼び出しません。

参照