「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
ご存知のとおり、USBはパソコンとその周辺機器との接続で最も普及しているインターフェイスです。
最近では、マウス、キーボード、光学ドライブ、プリンタといったパソコン周辺機器の他に、携帯電話や家電といった組み込み機器とも接続できる標準的なインターフェイスになっています。
以前、USBを題材としたテーマでご紹介させていただきました([ソフテックだより第21号] RS-232CからUSBへの移行)ように、特殊な用途のデバイス機器を接続する場合には、専用のプロトコルを決めてUSBドライバを開発するか、USBデバイス用の汎用ドライバを利用する必要があります。
今回のソフテックだよりでは、 WindowsアプリケーションでUSBデバイスを簡単に制御する方法の一例として、WinUSBを用いたWindowsアプリケーション開発方法についてご紹介させていただきます。
WinUSBは、WDF(Windows Driver Foundation)で提供されるUSBデバイス用の汎用ドライバになります。
以下のような、ユーザモードで動作する『 WinUSB API(WinUSB.dll)』とカーネルモードで動作する『 デバイスファンクションドライバ(WinUSB.sys)』で構成されます。アプリケーション(ユーザモードソフトウェア)は、WinUSB APIを介してUSBデバイスにアクセスすることが可能です。
図1. WinUSBの構造
WinUSBには、個別に開発する必要があるUSBドライバに必要な標準機能がほとんどサポートされています。WinUSBを利用することで、以下のような利点があります。
WinUSBは、デバイスファンクションドライバとしてWinUSB.sysをインストールして、WinUSB API(WinUSB.dll)を用いてUSBデバイスへのアクセスを実現します。
以下、項目に分けてWinUSB利用方法について後続の章で詳細な説明をいたします。
(1)WinUSBドライバパッケージの作成
- →
- デバイスファンクションドライバとしてWinUSB.sysをインストールするため、専用のドライバインストーラを用意します。
(2)WinUSB APIを使ってユーザモードアプリケーションを作成
- →
- WinUSB API(WinUSB.dll)を利用してUSBデバイスアクセスを行うアプリケーションを作成します。
尚、WinUSBを利用するには、マイクロソフト社から無償ダウンロードできるWDK(Windows Driver Kit)パッケージに含まれる再頒布可能ファイルが必要になります。
デバイスファンクションドライバとしてWinUSB.sysをインストールするために、専用のドライバインストーラが必要になります。
ドライバパッケージの作成方法について、簡単にまとめました。
ご紹介させていただく例では、USBデバイスを接続する前にドライバをインストールできる利点のある"DPInst"ツールを利用いたします。
分類 | ファイル | 備考 |
---|---|---|
ドライバインストール | DPInst.exe ※ | |
ドライバ環境一式 (INF, SYS, CoInstaller) |
WdfCoInstaller*.dll, WinUSBCoInstaller*.dll ※ |
|
****.inf | インストール対象のUSBデバイスを識別する情報を設定したINFファイルを自前で準備します。 |
表1. ドライバパッケージに必要なもの
ドライバインストールの際には、インストール対象のOS/CPU種類後にドライバ環境が異なりますので、適切な環境をインストールする必要があります。
VBS(VB Script)を用いて、インストール対象のOS/CPUをチェックして、適切な環境がインストールされるようなドライバインストールパッケージの構成例をご紹介します。
図2. WinUSBドラバパッケージ構成例
WinUSBは、個別に開発するクラス別のドライバと異なり、インストール対象のデバイスを識別する情報(クラスID)がありませんのでINFファイルを作成する必要があります。
以下に、INFファイル作成例を示します。ご紹介しているインストールパッケージの構成例の想定で、インストール対象のプラットフォーム(OS/CPU種類)に応じて適切なドライバ環境がインストールされるようなINFファイル設定となっております。
VBS(VB Script)を利用して、インストール対象のOS/CPUをチェックして、適切な環境がインストールされるコード例を以下に示します。
WinUSB API(WinUSB.dll)を利用してUSBデバイスアクセスを行うWindowsアプリケーションを作成します。
開発言語Visual Studio C++で利用する場合のポイントをご説明します。
分類 | ファイル | 備考 |
---|---|---|
DLL インクルード ファイル |
winusb.h, winusbio.h |
場所: %WDKインストール先%\inc\<umdf_ver> |
usb.h, usb100.h, usb200.h |
場所: %WDKインストール先%\inc\api | |
DLL リンクファイル | WinUsb.lib, Setupapi.lib |
場所: %WDKインストール先%\lib\<os_ver>\<arch> |
表2. WinUSB APIの利用に必要なファイル
Win32 APIを使ってシリアル通信処理を実装するのと同じ感覚で、WinUSB APIを利用できます。WinUSB APIの詳細な利用方法については、マイクロソフト社「How to Use WinUSB toCommunicate with a USB Device.docx」の資料をご一読いただくのが良いと思います。
WinUSBには、以下のような制約もありますのでシステムへの導入時には注意が必要です。
事前に良くご検討のうえで、WinUSBの利用を決めるのが良いと思います。
サポートOS | 利用可否 |
---|---|
Windows 7 | ○ |
Windows Server 2008 | ○ |
Windows Vista | ○ |
Windows Server 2003 | × |
Windows XP | ○ |
Windows 2000 | × |
表3. WinUSB APIの利用に必要なファイル
USB標準機能 | 利用可否 |
---|---|
コントロール転送 | ○ |
バルク転送 | ○ |
アイソクロナス転送 | × |
インタラプト転送 | ○ |
選択サスペンド | ○ |
リモートウェイクアップ | ○ |
複合デバイス対応 | ○ |
共有I/O | × |
表4. WinUSBサポート機能一覧
弊社でも実際のシステム開発でWinUSBを利用したことがございますが、WinUSBドライバパッケージを作成するだけで個別のUSBドライバを開発する必要がないのはQCD面で大きなメリットとなりました。
また、ユーザモードアプリケーション部のUSBデバイスとの通信機能実装においては、Win32 APIを使ったシリアル通信処理と同じ感覚でWinUSB APIを利用できます。シリアル通信処理の開発経験があれば、ほとんど抵抗なくUSBデバイスとの通信機能は実装できる点も魅力の一つだと思います。
関連した技術には汎用的に利用できる『Windows 7 インボックス・ドライバ』などもございますので、今回取り上げさせていただいたWinUSBと比較するのも良いかもしれません。
今回のソフテックだよりで取り上げさせていただいた内容が、USBデバイスとやり取りを行う要件をもったWindowsアプリケーション開発時にご検討材料のひとつになれば幸いです。
(M.S.)
関連ページへのリンク
関連するソフテックだより