USB デバイス用 Windows アプリケーション開発の概要

まとめ

  • 適切なプログラミング モデルを選択するためのガイドライン
  • UWP アプリとデスクトップ アプリの開発者エクスペリエンス

重要な API

このトピックでは、USB デバイスとの通信に UWP アプリまたは Windows デスクトップ アプリのどちらを作成する必要があるかどうかを判断するためのガイドラインを示します。

Windows では、カスタム USB デバイスと通信するアプリの作成に使用できる API セットを提供しています。 この API は、デバイスの検索、データ転送など、一般的な USB 関連タスクを実行します。

このコンテキストにおける "カスタム デバイス" とは、Microsoft がインボックス クラスのドライバーを提供していないデバイスを意味します。 代わりに、デバイス ドライバーとして WinUSB (Winusb.sys) をインストールできます。

プログラミング モデルの選択

Winusb.sys をインストールする場合、プログラミング モデルのオプションは次のとおりです。

最適なプログラミング モデルを選択する方法は、さまざまな要因によって左右されます。

  • アプリで内部 USB デバイスと通信するかどうか。

    API は、主に周辺機器にアクセスするように設計されています。 この API は、PC の内部 USB デバイスにアクセスすることもできます。 ただし、UWP アプリから PC の内部 USB デバイスへのアクセスは、その PC の OEM によってデバイス メタデータで明示的に宣言されている特権アプリに限定されます。

  • アプリで USB 等時性エンドポイントと通信するかどうか。

    アプリと、デバイスの等時性エンドポイントとの間でデータのやりとりを行う場合は、Windows デスクトップ アプリを作成する必要があります。 Windows 8.1 では、デスクトップ アプリと等時性エンドポイントとの間でデータの送受信を行うことができる、新しい WinUSB 関数が API セットに追加されました。

  • アプリが "コントロール パネル" タイプのアプリであるかどうか。

    UWP アプリはユーザー単位のアプリであり、各アプリのスコープ外で変更を行うことはできません。 これらの種類のアプリの場合、Windows デスクトップ アプリを作成する必要があります。

  • USB デバイス クラスが、UWP アプリでサポートされているクラスであるかどうか。

    デバイスがいずれかのデバイス クラスに属している場合は、UWP アプリを作成します。

    • name:cdcControl, classId:02 * *
    • name:physical, classId:05 * *
    • name:personalHealthcare, classId:0f 00 00
    • name:activeSync, classId:ef 01 01
    • name:palmSync, classId:ef 01 02
    • name:deviceFirmwareUpdate, classId:fe 01 01
    • name:irda, classId:fe 02 00
    • name:measurement, classId:fe 03 *
    • name:vendorSpecific, classId:ff * *

    デバイスが DeviceFirmwareUpdate クラスに属している場合、アプリは特権アプリである必要があります。

デバイスが、上記のどのデバイス クラスにも属していない場合は、Windows デスクトップ アプリを作成します。

ドライバーの要件

ドライバーの要件 UWP アプリ Windows デスクトップ アプリ
関数ドライバー Microsoft が提供する Winusb.sys (カーネル モード ドライバー)。 Microsoft が提供する Winusb.sys (カーネル モード ドライバー)。
フィルター ドライバー フィルター ドライバーが存在する場合、アクセスは特権アプリに限定されます。 アプリは、OEM によってデバイス メタデータ内で特権アプリとして宣言されます。 フィルター ドライバーは、Winusb.sys へのアクセスをブロックしない限り、カーネル モードのデバイス スタックに存在することができます。

コード サンプル

サンプル UWP アプリ Windows デスクトップ アプリ
これらのサンプルを試してみる

開発ツール

開発ツール UWP アプリ Windows デスクトップ アプリ
開発者環境

Microsoft Visual Studio 2013

Windows 8.1 用 Microsoft Windows ソフトウェア開発キット (SDK)

Visual Studio (Ultimate または Professional) および Windows Driver Kit (WDK) 8 に含まれている WinUSB アプリケーション テンプレートを使用する

等時性転送の場合は Visual Studio 2013 with Windows Driver Kit (WDK) 8.1
プログラミング言語 C#、VB.NET、C++、JavaScript C/C++

機能の実装

主要シナリオ UWP アプリ Windows デスクトップ アプリ
デバイスの検出 Windows.Devices.Enumeration 名前空間を使用して UsbDevice を取得します。 SetupAPI 関数および WinUsb_Initialize を使用して、WINUSB_INTERFACE_HANDLE を取得します。
USB コントロール転送

UsbSetupPacket

UsbControlRequestType

UsbDevice.SendControlInTransferAsync

UsbDevice.SendControlOutTransferAsync

WINUSB_SETUP_PACKET

WinUsb_ControlTransfer

USB 記述子の取得

UsbDevice.DeviceDescriptor

UsbConfiguration.Descriptors

UsbInterface.Descriptors

UsbEndpointDescriptor

WinUsb_GetDescriptor
USB 一括転送の送信

UsbBulkInPipe

UsbBulkOutPipe

WinUsb_ReadPipe

WinUsb_WritePipe

USB 割り込み転送の送信

UsbInterruptInPipe

UsbInterruptOutPipe

WinUsb_ReadPipe

WinUsb_WritePipe

USB 等時性転送の送信 サポートされていません。

WinUsb_ReadIsochPipe

WinUsb_ReadIsochPipeAsap

WinUsb_WriteIsochPipe

WinUsb_WriteIsochPipeAsap

デバイスを閉じる UsbDevice.Close WinUsb_Free

ドキュメント

ドキュメント UWP アプリ Windows デスクトップ アプリ
プログラミング ガイド USB デバイスとの対話、開始から終了まで WinUSB 関数を使用して USB デバイスにアクセスする方法
API リファレンス Windows.Devices.Usb WinUSB 関数

ユニバーサル シリアル バス (USB)