Windows の USB デバイス側ドライバー

USB 関数スタックのアーキテクチャについて説明します。

USB デバイスでは、USB 関数スタックは、ACPI が USB デバイスの物理デバイス オブジェクト (PDO) を作成するときに、プラグ アンド プレイ マネージャーによって列挙されるドライバーのグループを指します。

1 つの構成デバイスでは、USB デバイスで 1 つ以上のインターフェイスを定義できます。 たとえば、デバイスとの間でファイルを転送するためのメディア転送プロトコル (MTP) などです。 複合 USB デバイスは、1 つの構成で複数のインターフェイスをサポートできます。 USB 関数スタックは各インターフェイスの PDO を作成し、PnP マネージャーはそのインターフェイスの関数デバイス オブジェクト (FDO) を作成するクラス ドライバーを読み込みます。

USB 関数スタックは、次の図で概念化されています。

usb function stack.

アプリケーションとサービス

USB 関数クラス ドライバー

USB 関数クラス ドライバーは、USB デバイス上の特定のインターフェイス (またはインターフェイスのグループ) の機能を実装します。 MTP と IpOverUsb は、システム提供のクラス ドライバーの例です。 クラス ドライバーは、純粋にカーネル モード ドライバーとして実装することも、システム提供のクラス ドライバー GenericUSBFn.sys と組み合わせたユーザー モード サービスにすることもできます。

関数クラス ドライバーは、USB 関数クラス ドライバーを使用して UFX プログラミング インターフェイスに要求をそのコントローラーに送信します。

USB 関数クラス拡張機能 (UFX)

USB 関数クラス拡張機能 (UFX) は、カーネル モード ドライバー フレームワーク (KMDF) に対するシステム提供の拡張機能です。 USB は標準バスであり、いくつかの必要な機能と機能を備えています。 UFX は、すべての USB 関数コントローラーに共通の USB 関数ロジックの実装と、USB 関数クラス ドライバーからの要求の処理および/またはディスパッチを担当します。 特に、UFX はデバイスを列挙し、標準の制御転送を処理するプロセスを処理します。 これらの操作の一部を実行するには、UFX はバスの機能について知る必要があります。 これらの機能は、クラス拡張インターフェイスが確立されるときに UFX に報告されます。

UFX は、上位層 (USB 関数クラス ドライバーおよびユーザー モード サービス) がコントローラーに要求を送信するために使用できる標準 IOCTL を公開します。 さらに、UFX はホストから受信した標準要求について上位層に通知します。

USB 関数クライアント ドライバー

UFX は、異なるコントローラー間で一貫して動作する抽象化されたインターフェイスを提供します。 ただし、コントローラーの機能は異なり、エンドポイントの数、エンドポイントの種類、低電力、リモート ウェイクアップなどの制限があります。 たとえば、特定のコントローラーでは DMA がサポートされていますが、サポートされていないコントローラーもあります。 一部のコントローラーはハードウェアにストリームを実装しますが、他のコントローラーはドライバーがストリームを処理することを期待します。 このような理由から、UFX では一般的な機能のみが処理されます。 転送、電源管理、ストリーム サポート、およびコントローラーごとに異なるその他の機能は、クライアント ドライバーによって処理されます。

USB 関数クライアント ドライバーは、コントローラー固有の操作を実装する役割を担います。 これには、エンドポイント データ転送、USB デバイスの状態変更 (リセット、サスペンド、再開)、接続/切断検出、ポート/充電器検出の実装が含まれます。 また、クライアント ドライバーは、電源管理と PnP イベントの処理も担当します。

関数クライアント ドライバーは、USB 関数クラス ドライバーを使用して UFX プログラミング インターフェイスカーネル モード ドライバー フレームワーク (KMDF) ドライバーとして記述されます。

マイクロソフトは、ChipIdea および Synopsys コントローラー用のインボックス機能クライアント ドライバー (UfxChipidea.sys、Ufxsynopsys.sys) を提供しています。

USB 下位フィルター ドライバー

機能コントローラーがインボックスの Synopsys および ChipIdea ドライバーを使用する場合、USB 下位フィルター ドライバーは充電器の検出をサポートします。 フィルター ドライバーは、USB ポート検出から始まる USB 充電を管理します。 サポートする各充電器タイプの GUID と、その充電器のプロパティの一覧を公開する必要があります。 特定の充電器が構成可能な場合、下位の USB フィルター ドライバーは、充電器を構成するために送信できる、サポートされている PropertyID とそれに対応する値の種類のリストを定義します。 また、ドライバーは、充電を開始できる時期と、デバイスが消費できる最大電流量をバッテリー スタックに通知します。 Synopsys および ChipIdea ドライバー以外のクライアント ドライバーの場合、充電ロジックをクライアント ドライバーに実装できます。

関数クラス ドライバーは、独自の充電器をサポートするためのプログラミング インターフェイスを使用して UFX に要求を送信します。