USBデバイスのハード部分が出来上がったので次はソフト部分.どうやら libusb-win32 というフリーのライブラリがあるようなので利用してみる.とりあえず inf ファイル作っとかないとデバイスが使えないので libusb-win32-device-bin-0.1.10.1.tar.gz とかの中にある inf-wizard.exe で生成.プログラム自体は AVR USB のサンプルコードを参考に作成.無事エコーテスト成功.あとはしつこくポーリングするか受信待ちが出来るなら待ちをしてやればおわる.
libusb を使ったプログラムの流れ(簡易版)は以下のとおり.何より先に usb_init(); して libusb を初期化.んで,usb_find_busses(); usb_find_devices(); でデバイスを探して,
for(bus=usb_get_busses(); bus; bus=bus->next){ for(dev=bus->devices; dev; dev=dev->next){
のネストループで全デバイスを走査する.走査時に,dev->descriptor.idVendor, dev->descriptor.idProduct をチェックして,ベンダIDとプロダクトIDがマッチしたら handle = usb_open(dev); で開けてみて,
usb_control_msg(handle, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + dev->descriptor.iVendor, 0x0409, buffer, sizeof(buffer), 1000); usb_control_msg(handle, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + dev->descriptor.iProduct, 0x0409, buffer, sizeof(buffer), 1000);
でベンダやプロダクト名を確認する(同一IDに複数のデバイスがあってプロダクト名で識別しないとならないので面倒.usb_get_string でいい気もする).
外れたら usb_close(dev); しとく.
デバイスが見つかったら usb_control_msg でデータのやり取りを.
他の endpoint 開いたほうがいいけど… そんな余裕は無い.
- Newer: ことはじめ