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


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


 


それでは、また。

Skip to main content