広告

libusb」は簡単にUSB機器にアクセスできるように作られたC言語用ライブラリ。
カーネルの変更や専用のドライバを必要としないので開発は楽。
Windows版も存在する

--目次--

準備

  • libusb」がインストールされていなかったらインストールする。
    • さまざまなディストリビューションにパッケージが用意されているので、インストールは簡単。
  • アクセスするUSB機器のベンダーIDとプロダクトIDを調べる。機器の説明書や仕様書に載っている。
    • 分からなかったらつなげてみて「lsusb」コマンドを実行。(Debianではusbutilsパッケージに含まれる)
      Bus 001 Device 001: ID 0123:4567
      というように表示され、IDの後に続く最初の4桁(この場合0123)がベンダーID、後の4桁がプロダクトID(この場合4567)になる。
  • rootでないとデバイスにアクセスできない場合があるので注意。
    • 筆者はしばらくこれにはまった (^^;

プログラミング(はじめの方)

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)を宣言しておく必要がある。これらは上述の値を使う。
USB機器から帰ってくる応答は「msg(配列)」に格納される。ここでは返答は8バイトを想定している。

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(配列)」に格納される。
「end_point」は機器で指定されたもの。

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

広告

リロード   差分   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS