USBView ってなに?
初めまして。私、まさかた と申します。どうぞよろしくお願いします。
先日、春の嵐の中、東京マラソン 2009 が開催されました。実は、私も応募はしたのですが、7倍という抽選倍率の高さから、残念ながら、抽選にもれてしまいました。。
なので、他の地域で開催されているマラソンに参加したのですが、やっぱりマラソンはいいですね。
フルマラソンを走るのは初めてではないのですが、回を重ねるごとに少しずつ楽になっていくのと、完走する達成感がなんとも言えません。
あの大人気の東京マラソン、私もいつかは走ってみたいものです。
さて、先日、 K里さんの方から紹介されておりました「USB 2.0 カーネル デバッグ 前編」についての記事の中で、デバッグ ポートへの接続確認をする箇所で、
「ポート番号については、"Debugging Tools for Windows" 以下の usbview.exe にて確認できます。」
と、さりげなく "usbview.exe" が登場しておりましたが、こちらを読んでいただいた方の中には、「usbview.exe ってなに?」という方もいらっしゃったかもしれません。
この usbview.exe は、WDK の中に含まれている、USB デバイスの情報を取得できるサンプル プログラムなのですが、今回は、この USBView について、その使い方などをお話したいと思います。
USBView は、その名の通り、PC に接続された USB デバイスの情報を見ることのできるユーザーモードの GUI アプリケーションです。
これは、PC の USB ポートに接続されている USB デバイスを列挙して、それぞれのデバイスが持つ USB Descriptor の情報を取得、表示してくれます。
そして、USBView のソースコードは、WDK 6001.18002 の場合は、以下のフォルダに含まれています。
WINDDK\6001.18002\src\usb\usbview
これをビルドしてできた usbview.exe を実行しますと、図にあるような GUI アプリケーションが立ち上がります。
今回は、外部ハブの先に、プリンタ、スキャナ、ストレージの 3つ の機能を持つ USB 接続の Multi Function Printer (MFP) をつないでみました。
左側のペインには、PC に繋がっている USB デバイスが、
[My Computer] – [USB Host Controller] – [Root Hub] – [Port] – [Device]
といったツリー構造で表示されます。
そして、右側のペインには、左側で選択した USB デバイスの、以下の USB Descriptor の情報などが表示されます。
- Device Descriptor
- Interface Descriptor
- Configuration Descriptor
- Endpoint Descriptor
MFP は、複数の機能を持つ USB デバイスですので、左側のペインでは、「複合デバイス」として表示されています。
そして、右側のペインの一部を抜粋したのが以下になります。
Device Descriptor: bcdUSB: 0x0200 bDeviceClass: 0x00 bDeviceSubClass: 0x00 bDeviceProtocol: 0x00 bMaxPacketSize0: 0x40 (64) idVendor: ______ idProduct: ______ bcdDevice: 0x0105 iManufacturer: 0x01 iProduct: 0x02 iSerialNumber: 0x03 bNumConfigurations: 0x01 (中略) Configuration Descriptor: wTotalLength: 0x0055 bNumInterfaces: 0x03 bConfigurationValue: 0x01 iConfiguration: 0x00 bmAttributes: 0xC0 (Bus Powered Self Powered ) MaxPower: 0x01 (2 mA) Interface Descriptor: bInterfaceNumber: 0x00 bAlternateSetting: 0x00 bNumEndpoints: 0x03 bInterfaceClass: 0xFF bInterfaceSubClass: 0x00 bInterfaceProtocol: 0xFF iInterface: 0x00 Endpoint Descriptor: bEndpointAddress: 0x07 OUT Transfer Type: Bulk wMaxPacketSize: 0x0200 (512) bInterval: 0x00 Endpoint Descriptor: bEndpointAddress: 0x88 IN Transfer Type: Bulk wMaxPacketSize: 0x0200 (512) bInterval: 0x00 Endpoint Descriptor: bEndpointAddress: 0x89 IN Transfer Type: Interrupt wMaxPacketSize: 0x0040 (64) bInterval: 0x0B Interface Descriptor: bInterfaceNumber: 0x01 bAlternateSetting: 0x00 bNumEndpoints: 0x02 bInterfaceClass: 0x07 bInterfaceSubClass: 0x01 bInterfaceProtocol: 0x02 iInterface: 0x00 Endpoint Descriptor: bEndpointAddress: 0x01 OUT Transfer Type: Bulk wMaxPacketSize: 0x0200 (512) bInterval: 0x00 Endpoint Descriptor: bEndpointAddress: 0x82 IN Transfer Type: Bulk wMaxPacketSize: 0x0200 (512) bInterval: 0x00 Interface Descriptor: bInterfaceNumber: 0x02 bAlternateSetting: 0x00 bNumEndpoints: 0x02 bInterfaceClass: 0x08 bInterfaceSubClass: 0x06 bInterfaceProtocol: 0x50 iInterface: 0x00 Endpoint Descriptor: bEndpointAddress: 0x84 IN Transfer Type: Bulk wMaxPacketSize: 0x0200 (512) bInterval: 0x00 Endpoint Descriptor: bEndpointAddress: 0x05 OUT Transfer Type: Bulk wMaxPacketSize: 0x0200 (512) bInterval: 0x00 |
上記のDevice Descriptor からは、デバイスのベンダー ID、プロダクト ID、シリアル番号、製造者名、サポートする Configuration の数など、デバイスの基本的な情報が分かります。
また、その他の Descriptor の記述から、このデバイスは、3つの Interface を持っていて、それぞれに Bulk 転送または、Interrupt 転送の IN と OUT の Endpoint を持っているといったことが分かります。
ちなみに、上の図では、[Options] メニューから、[Config Descriptor] を選択した場合の表示で、これを選択しないと、USB デバイスの Configuration Descriptor 以降の情報が表示されませんのでご注意ください。
USBView の使い道としては、K里さんの記事でも紹介しておりましたように、デバイスを接続しているポートが、一体 何番ポートとして認識されているのか?ということも、USBView を使えば簡単に分かりますし、そのため、私たちも、単純に Viewer として利用することもままあります。
また、何より、Device Descriptor を始めとした、USB Descriptors にしか記述されていない USB デバイス固有の情報、例えば、ベンダー ID 、デバイス ID などは、デバイス マネージャでは確認できない情報ですので、これらの情報を知りたい場合には、やはり USBView が重宝します。
特に、「USB デバイスを違うポートに挿すと、その度にドライバのインストールを要求されるけど、なぜ?」 といったご質問をいただくことがありますが、このようなことが起きる理由のひとつとして、USB デバイスでシリアル番号がサポートされていない(iSerialNumber が 0x00)場合には、OSでは異なるポートに接続する度に、異なるデバイスとみなされるということがあります。
そういう場合に、USB デバイスのシリアル番号がサポートされているかどうかも、USBView があれば、簡単に確認できます。
このように、usbview を単純にデバイスの情報取得ツールとして、そのまま使うのも十分ありでしょう。
ただ、サンプルプログラムの利用価値は、そのソースコードを見ることによって、目的の処理を行うために、どんな API をどのように使うものなのかの参考情報として使う点にもあると思います。
実際、私たちのサポートで頂戴するお問い合わせの中でも、こうしたサンプルプログラムを参考情報として、ご案内申し上げることもしばしばございます。
こんな便利な USBView ですので、ソースコードも交えて、その中身についても是非ご紹介させていただきたいと思いますが、詳しい説明は、また別の機会にしたいと思います。
「そんな、次の機会まで待てないッ!」というせっかちな方は、是非、ご自身でソースコードをじっくり見ていただきたいと思います。
その際、いきなりサンプルプログラムのソースファイルを開いてみるというのもよろしいかもしれませんが、WDK のサンプルプログラムでは、多くの場合 WDK のヘルプに説明(usbview の場合はこちら)が記載されていたり、ソースツリー内に、html 形式のファイルでサマリーが書かれていたりします。
ですので、WDK のサンプルプログラムの中身について知ろうとする場合には、実際に動かしてみるのと同時に、こういったドキュメントも、覗いてみられることをお奨めいたします。
今回は、ドライバそのものというよりは、その外側からユーザーモードアプリケーションでアクセスするためのサンプル プログラムのご紹介となりましたが、WDK には、もちろん様々なドライバのサンプル プログラムがたくさん含まれています。
今後、このブログでも、その他のサンプル プログラムについて紹介されることがあるかと思いますので、是非 引き続きご覧になって、サンプル プログラム共々、ご活用いただければ幸いでございます。
それでは、また。