|
広告
「libusb --目次-- 準備
プログラミング(はじめの方)USBの機器にあまり依存しない部分 インクルードlibusb用のヘッダーをincludeする #include <usb.h> という行を入れる 変数の定義USB用に使う変数を宣言 struct usb_bus *bus; struct usb_device *dev; usb_dev_handle *dh; 初期化あまり考えずに以下の行を書き込む usb_init(); usb_find_busses(); usb_find_devices(); デバイスを見つけるデバイスがつながっているか見つける。「VENDOR_ID」と「PRODUCT_ID」にベンダーIDとプロダクトIDを入れておく。 for (bus = usb_get_busses(); bus; bus = bus->next) {
for (dev = bus->devices; dev; dev = dev->next) {
if (dev->descriptor.idVendor == VENDOR_ID &&
dev->descriptor.idProduct == PRODUCT_ID) {
goto device_found;
}
}
}
/* デバイスが見つからなかった場合 */
fprintf(stderr, "Device not found.\n");
exit(1);
/* デバイスが見つかった場合 */
device_found:
printf("Device Found!!\n"); /* 確認用*/
デバイスを開く単純には /*USB Open*/ dh = usb_open(dev); エラートラップを付ける if( (dh=usb_open(dev))==NULL ){
printf("usb_open Error.(%s)\n",usb_strerror());
exit(1);
}
最後に「usb_close」で閉じることを忘れない usb_close(dh); デバイスを閉めておかないと次回プログラムを起動したときにちゃんと動かない。 コンフィグレーションやインターフェースの要求if(usb_set_configuration(dh,dev->config->bConfigurationValue)<0){
if(usb_detach_kernel_driver_np(dh,dev->config->interface->altsetting->bInterfaceNumber)<0 ){
printf("usb_set_configuration Error.\n");
printf("usb_detach_kernel_driver_np Error.(%s)\n",usb_strerror());
}
}
if(usb_claim_interface(dh,dev->config->interface->altsetting->bInterfaceNumber)<0 ){
if(usb_detach_kernel_driver_np(dh,dev->config->interface->altsetting->bInterfaceNumber)<0 ){
printf("usb_claim_interface Error.\n");
printf("usb_detach_kernel_driver_np Error.(%s)\n",usb_strerror());
}
}
if(usb_claim_interface(dh,dev->config->interface->altsetting->bInterfaceNumber)<0 ){
printf("usb_claim_interface Error.(%s)\n",usb_strerror());
}
USBの仕様に合わせて書いていく部分アクセスするUSBデバイスの「bmRequestType」や「bRequest」、「wValue」、「wIndex」、「wLength」などとエンドポイントなどを調べておく必要がある。 メッセージ、コマンドを送るそれぞれの変数(bmRequestType, bRequest, wValue, wIndex,timeout)を宣言しておく必要がある。これらは上述の値を使う。 unsigned char msg[8];
int result=usb_control_msg(dh, bmRequestType, bRequest, wValue, wIndex, msg, sizeof(msg), timeout);
if(result<0){printf ("Control message error. (%s)\n", usb_strerror());}
resultの結果は本来「sizeof(msg)」と同じはず。 バルクデータを読む「bytes」バイトだけバルクモードで読み込む。読み込んだデータは「readbuf(配列)」に格納される。 result=usb_bulk_read(dh, end_point, readbuf, bytes, timeout);
if(result<0){printf ("bulk read error. (%s)\n", usb_strerror());}
resultの結果が負の場合エラーだけれど、本来resultの値は「bytes」と同じはずなのでエラートラップを下のように厳しくしてもいい。 result=usb_bulk_read(dh, end_point, readbuf, bytes, timeout);
if(result < bytes){printf ("bulk read error. (%s)\n", usb_strerror());}
デバイスを閉じる最後に「usb_close」で閉じることを忘れない usb_close(dh); サンプル簡単なサンプル。デバイスを見つけて開いて閉じるだけ。 その他、EZ-USB FX2用のサンプルを「EZ-USB FX2」に置いておく。 コンパイルコンパイルするときは「-lusb」というオプションをつける。 gcc -lusb -o hoge hoge.c 上のサンプルなら gcc -lusb -o test_libusb0 test_libusb0.c 広告 |