USB 関数スタックのアーキテクチャについて説明します。
USB デバイスでは、USB 関数スタックは、ACPI が USB デバイス物理デバイス オブジェクト (PDO) を作成するときに、プラグ アンド プレイ マネージャーによって列挙されるドライバーのグループを参照します。
1 つの構成デバイスでは、USB デバイスで 1 つ以上のインターフェイスを定義できます。 たとえば、デバイスとの間でファイルを転送するためのメディア転送プロトコル (MTP) などです。 複合 USB デバイスは、1 つの構成で複数のインターフェイスをサポートできます。 USB 関数スタックは、各インターフェイスの PDO を作成し、PnP マネージャーは、そのインターフェイスの関数デバイス オブジェクト (FDO) を作成するクラス ドライバーを読み込みます。
USB 関数スタックは、次の図で概念化されています。
アプリケーションとサービス
- すべてのユーザー モード要求は、Microsoft が提供するカーネル モード クラス ドライバー GenericUSBFn.sysに送信されます。 genericusbfnioctl.h で定義されている I/O 制御コード (IOCTL) を送信することで、GenericUSBFn.sys と通信するユーザー モード サービスを作成できます。 これらの IOCTL の詳細については、「ユーザー モード サービスからの GenericUSBFn.sys との通信」を参照してください。
USB ファンクション クラス ドライバー
USB 関数クラス ドライバーは、USB デバイス上の特定のインターフェイス (またはインターフェイスのグループ) の機能を実装します。 MTP と IpOverUsb は、システム提供のクラス ドライバーの例です。 クラス ドライバーは、カーネル モード ドライバーとして純粋に実装することも、システム提供のクラス ドライバーとペアリングされたユーザー モード サービス GenericUSBFn.sysすることもできます。
関数クラス ドライバーは、USB 関数クラス ドライバーを使用して UFX プログラミング インターフェイスに要求をコントローラーに送信します。
USB 関数クラス拡張 (UFX)
USB 関数クラス拡張機能 (UFX) は、 Kernel-Mode Driver Framework (KMDF) に対するシステム提供の拡張機能です。 USB は標準バスであり、いくつかの必要な機能と機能を備えています。 UFX は、すべての USB 関数コントローラーに共通の USB 関数ロジックを実装し、USB 関数クラス ドライバーからの要求を処理またはディスパッチする役割を担います。 特に、UFX は、デバイスを列挙し、標準の制御転送を処理するプロセスを処理します。 これらの操作の一部を実行するには、UFX がバスの機能を認識している必要があります。 これらの機能は、クラス拡張インターフェイスが確立されると UFX に報告されます。
UFX は、上位レイヤー (USB 関数クラス ドライバーおよびユーザー モード サービス) がコントローラーに要求を送信するために使用できる標準 IOCTL を公開します。 さらに、UFX は、ホストから受信した標準要求について上位層に通知します。
USB 関数クライアント ドライバー
UFX は、異なるコントローラー間で一貫して動作する抽象インターフェイスを提供します。 ただし、コントローラーにはさまざまな機能があり、エンドポイントの数、エンドポイントの種類、低電力、リモート ウェイクアップなどの制限があります。 たとえば、特定のコントローラーでは DMA がサポートされていますが、サポートされていないコントローラーもあります。 一部のコントローラーはハードウェアにストリームを実装しますが、他のコントローラーはドライバーがストリームを処理することを想定しています。 このような理由から、UFX では一般的な機能のみが処理されます。 転送、電源管理、ストリームのサポート、およびコントローラーごとに異なるその他の機能は、クライアント ドライバーによって処理されます。
USB 関数クライアント ドライバーは、コントローラー固有の操作を実装する役割を担います。 これには、エンドポイント データ転送の実装、USB デバイスの状態の変更 (リセット、中断、再開)、アタッチ/デタッチ検出、ポート/充電器の検出が含まれます。 また、クライアント ドライバーは、電源管理と PnP イベントの処理も担当します。
関数クライアント ドライバーは、USB 関数クラス ドライバーを使用して UFX プログラミング インターフェイスKernel-Mode Driver Framework (KMDF) ドライバーとして記述されます。
Microsoft は、ChipIdea および Synopsys コントローラー用のインボックス関数クライアント ドライバー (UfxChipidea.sys、Ufxsynopsys.sys) を提供しています。
USB 下位フィルター ドライバー
USB 下位フィルター ドライバーは、関数コントローラーがインボックス Synopsys ドライバーと ChipIdea ドライバーを使用している場合、充電器の検出をサポートします。 フィルター ドライバーは、USB ポート検出から始まる USB 充電を管理します。 サポートする充電器の種類ごとに GUID と、その充電器のプロパティの一覧を発行する必要があります。 特定の充電器が構成可能な場合、下位 USB フィルター ドライバーは、サポートされている PropertyID の一覧と、それに送信できる対応する値の種類を定義して、充電器を構成します。 また、ドライバーはバッテリースタックに対して、充電を開始できるタイミングと、デバイスが引き出すことのできる電流の最大量を通知します。 Synopsys ドライバーと ChipIdea ドライバー以外のクライアント ドライバーの場合は、充電ロジックをクライアント ドライバーに実装できます。
関数クラス ドライバーは、 独自の充電器をサポートするためのプログラミング インターフェイスを使用して UFX に要求を送信します。