うまくいかんシリーズだ。
あるUSBデバイスをlibusb-1.0で動かそうとした。
プラットフォームは、Windows8。
cygwinのインストーラでlibusb-1.0を選択してインストール。
ドライバはzadigを使用して、WinUSBを使う(libusb-win32などを選んでしまいがちだが、libusb-1.0はWinUSBベースで動いているはず)。
で、ここまではよかったのだ。
あとは、libusbでデバイスを検索して、オープンして、アクセスするだけ。
だけなんだけど、libusb_open()でエラーになった。
戻り値は-12で、LIBUSB_ERROR_NOT_SUPPORTED。
しかし、libusbのデバッグ出力を有効にして動かすと、USB機器の一覧(Enumeration)をしているときに、既にエラーとなっていることがわかった。
win32でDeviceIoControl(IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX)を投げているのだが、それで取得した状態がNoDeviceConnectedとなっているのだ。
NoDeviceConnectedなデバイスをlibusb_open()すると、LIBUSB_ERROR_NOT_SUPPORTEDになるというしくみ。
それだけだと、なんかlibusbの使い方がおかしいのかな、と思うところだが、そう言いきれないところが残っている。
まず、同じプログラムをWindows7 sp3 64bitのcygwin(32bit)で動かしたのだが、それでは問題がない。
どちらかといえば、Win7で動くことを確認したからWin8でやろうとした、というところだ。
ではWin8でlibusbがうまく動かないかというと、そうではない。
PaSoRiをつないで動かしたのだが、そこではエラーが出るわけでもなく、ちゃんと動いた。
動くのを確認し、PaSoRiをつないだまま対象のデバイスをUSB接続し、その状態でPaSoRiを制御しようとすると、同じエラーが出つつもちゃんと動いた。
つまり、出ているエラーというのはUSBデバイスを列挙する段階で出ているだけで、制御対象にしようとしたデバイスから出ていたわけではないということになる。
ということは、単にDeviceIoControl(IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX)が特定のデバイスで失敗するだけではないか、と思った。
その確認をするのは、ちょっと私では荷が重い。
なので、ひとまずMicrosoftが出しているUSB機器を見るツール、usbview.exeを使ってみた。
・・・うん、これは特定デバイスであっても情報がちゃんと表示されている。
うーむうーむ・・・。
昔の私も、同じようなことを調べていたみたいだ。
hiro99ma blog: libusb_open()でLIBUSB_ERROR_NOT_SUPPORTEDが返ってくるが、わからん
当時は、WinUSBドライバじゃなくてlibusb-win32ドライバを使っていたのでだめだったようだ。
hiro99ma blog: libusb-1.0はzadigを使うべし
しかし、今回は状況が違う。
動くデバイスと動かないデバイスがあるし、PCに因るのかOSに因るのかはわからないが動いているPCと動いていないPCがある。
エラーが起きているタイミングは、libusb_init()後にlibusb_get_device_list()している間だ。
つまり・・・まだどのUSBデバイスを使いたいとか決める前。
サンプルだってそれ以上のことをしていないし、サンプルをlibusb_set_debug(NULL,3)して動かすとエラーが出ている。
libusb/listdevs.c at master · libusb/libusb
というわけで、この問題はlibusbよりもWinUSBの方を先に見ていった方が早いように思った。
http://nemuisan.blog.bai.ne.jp/?eid=211185
返信削除ねむいさんのサイトの情報によるとWin8系ではUSB複合デバイスが
libusb-1.0で上手く動作出来てなかったようです。
現在は多少手が入りなんとなく動くようになってますがMLを見てると
StringDescriptorに情報を持たせてあるデバイスではOSに関係なく上手く
動作しない別の問題が分かって目下対策中のようです。
J-Linkの最新ファームがこれに相当してファームのバージョンを戻して
使ってます。
情報ありがとうございます!
削除確かに、ここで見ているのはUSB複合デバイスです(だと思います。。詳しくないので弱気)。
昨日もWin8で動かせず、力尽きてしまいました。
同じVID/PIDなのに、ものによって動くのと動かないのとがあって、何を疑ってよいかわからなくなってました。
デバイスが手元にないので、今度はgitで落としてきたものをビルドしてやってみます。