2016年2月8日月曜日

libusb-1.0でUSBデバイスのEPをR/Wするサンプルプログラム

libusbをLinuxで使っています.libusbにはヴァージョン0と1があり、0と1ではAPIがちょこまかと異なります.今までは成り行きでlibusb-0を使ってきたのですが、libusb-1.0に乗り換える必要が生じました.

バージョン0はネットに解説がいろいろとあるのですが、libusb-1.0はというとあまり解説が多くは無いみたいです.

EPにデータを送る、EPからデータを採取する、という簡単なソースを以下に記しますので参考にどうぞどうぞ.

環境:
Linux
libusb1.0.20
USBデバイス   EP1 OUT 64byte     EP2 IN 1024byte   VID/PID=0x04B4/0x8613

動作:
1)USBデバイスを、そのvendorIDおよびproductIDで名指ししてopenする.VID/PIDでopenするやり方は、いちいちサーチしなくて済むので楽でいいわ
2)EP1に数バイトを出力する
3)EP2から2048バイトを入力する
4)closeする

コンパイル:
環境依存があろうかと思いますが、わたしの環境ではこれでコンパイルしとります.
gcc xxx.c -I/usr/local/include/libusb-1.0 -lusb-1.0 -o xxx

ソースコード:
ろくにエラー処理してないベタ書きコードです.
libusb固有のところは赤字の部分に尽きます.
 ① インクルードファイル
 ② VID,PIDでUSBデバイスをopenする (ここではez-usbを使用)
 ③ libusbのブラックボックス的構造体は最低限これは必要
 ④ 初期化
 ⑤ VID/PIDで決めうちopenする
 ⑥ これよくわかんないおまじない
 ⑦ config(1)→interface(0)→AltSetting(0)を選択.ただしlibusb_set_configuration()は不要というか削除しといた方がベターかもしれない.なぜなら、USB packetを見るとopenした時点でconfig=1に自動的に設定しているようなのだ.そこで再度libusb_set_configuration()するとerrorになることがありおりはべり.errorにならないこともあるのだが.
 ⑧ EP1に出力する    (第2引数が0x81だと入力、0x01だと出力になる)
 ⑨ EP2から入力する  (第2引数が0x82だと入力、0x02だと出力になる)
 ⑩ closeのおまじない

APIの解説はこちらをどうぞ.
http://libusb.sourceforge.net/api-1.0/api.html


----
以下はベタベタなソースコード

#include <stdio.h>
#include <string.h>
#include <libusb.h>  ①

#define REQBYTE 2048
unsigned char dat[REQBYTE];
#define MAXTRANS 1024
unsigned char buf[MAXTRANS];
#define VID 0x04B4  ②
#define PID 0x8613

int main(int argc, char *argv[])
{
  int size, transferred, ttlbyte, datptr, ret, i;
  libusb_device_handle *h_dev;   ③

  libusb_init( NULL );  ④
  h_dev = libusb_open_device_with_vid_pid( NULL, VID, PID ); ⑤
  libusb_set_auto_detach_kernel_driver( h_dev , 1 ); ⑥
  libusb_set_configuration( h_dev , 1 ); ⑦
  libusb_claim_interface( h_dev , 0 );  ⑦
  libusb_set_interface_alt_setting( h_dev , 0 , 0 );  ⑦

  // bulk send to EP1
  strcpy(buf,"abcdef"); // send data
  size = strlen(buf);
  ret = libusb_bulk_transfer( h_dev, 0x01, buf, size, &transferred, 1000);  ⑧
  if (ret==0 )
    printf("<<<EP1 BULK OUT %dBYTE try --> %dBYTE success>>>\n", size, transferred);
  else
    {
      printf("<<<EP1 BULK OUT Error  (%d)>>>\n",ret);
      goto CLOSE;
    }


 //bulk recieve from EP2
  ttlbyte = 0;
  datptr = 0;
  while(1) // read loop
    {
      ret = libusb_bulk_transfer( h_dev, 0x82, buf, MAXTRANS, &transferred, 1000);  ⑨
      if ( ret!=0 )
        {
          printf("<<<BULK Read EP2 Error  (%d)>>>\n",ret);
          goto CLOSE;
        }
      ttlbyte = ttlbyte + transferred;
      printf("<<<EP2 BULK IN %dBYTE TTL%dBYTE REQ%dBYTE>>>\n",transferred,(int)ttlbyte,(int)R\
EQBYTE);
      for(i=0;i<transferred;i++) dat[datptr++] = buf[i];
      if( ttlbyte >= REQBYTE ) break;
    }
  datptr=0;
  while(datptr<REQBYTE)
    {
      printf("%04x: ",datptr);
      for(i=0;i<16;i++) printf("%02x ",dat[datptr++]);
      printf("\n");
    }

 CLOSE:
  libusb_release_interface(h_dev,0);  ⑩
  libusb_close(h_dev);
  libusb_exit(NULL);

  return 0;
}

2 件のコメント:

  1. ソニーOB:佐藤2016年2月9日 14:29

    GPIFでの年金積立てについての会合では株の直接買いは行わないということで決着したようだが最終的には政治判断だそうだ。
    今日の株価を見て御乱心しなければ良いが。
    総務大臣も放送局には強い態度のようで。
    さて平坂さんはどのように分析なさります?

    返信削除
    返信
    1. 管理通貨制度というのは人類が発明したものの中でかなり優秀な発明品だと思う.

      しかし管理通貨制度下でどのように振舞うべきかを一貫して判っている国は、USとUKとそして中国ぐらい.中国はやりすぎでもうじき人民元暴落→国内は高インフレになる運命だけど、歴史的に人民の犠牲なんかに目もくれぬ国だから中国的にはそれで無問題なのだろう.
      ドイツも日本も管理通貨制度下での振舞い方を判っているとは言い難い.そのドイツに率いられたEUは巻き添え的に不幸になっている.

      日本は1980年代から今日に至るまでの30年間で、日銀が管理通貨制度下での振舞い方を判っていた時期のdutyは15%ぐらいかな.バブルの叩き潰し方を間違えた平成の鬼平だとか、デフレを温存した白川なんて人もいました.大迷惑だ.

      さてGPIFについてフツーの人は、株のような博打で年金が損益するのは不安だ、という論になるのだろう.すなわち、
        株価変動→GPIF損益→年金変動
      という図式.
      わたしは違う、こうだ.
        世界情勢変化→中央銀行→株価変動→GPIF損益→年金変動
      世界情勢によって株価が上下するのは仕方あるまい.しかし世界情勢が日経平均に与える影響をブロックできるのが管理通貨制度下での中央銀行のはず.

      しかしわたしは85%の期間がアホだった日銀をもはや信用できない.なので、世界情勢リスクと日銀リスクの合計に晒されている日経平均はボラリティが大きすぎて、公的年金の投資対象としては相応しくないと思う.白川元日銀総裁のようなデフレ大魔王が登場しうる現制度下で長期的に公的年金を株に投じるのは止めとけと思う.

      GPIFが日本株に投資するのなら、その前に日銀法を改正してからにしたらどうだというのがひら結論.日銀の政策目標を政府が指示できるように法改正して少しは日本株投資の安全性を高めてからGPIFが株投資をしたらどうよと.

      それでもやるならショートポジションでこまめに利食いするくらいにしといたらどうだと思うが、資金量が大きすぎてそういう運用が難しいのかもしれぬがよく知らない.

      削除