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) をつないでみました。

 

 USBView_Example

 

左側のペインには、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 には、もちろん様々なドライバのサンプル プログラムがたくさん含まれています。

今後、このブログでも、その他のサンプル プログラムについて紹介されることがあるかと思いますので、是非 引き続きご覧になって、サンプル プログラム共々、ご活用いただければ幸いでございます。

 

それでは、また。