2011年5月16日月曜日

LinuxでUSB制御(検討編)

Linuxボードがあります。
シリアルポートや、USBポートがあるから制御に使うのが筋ってもの。

しかしどうやって使うの?ドライバーは?という疑問が多々あるので、
今回は導入前の検討編。

1.インストール
 libusbをインストールする。(Debian系列ではusbutils)

2.USB機器を接続して、「lsusb」ベンダIDを調べる。
 Bus 001 Device 001: ID 0123:4567

  ベンダID : 0123
  プロダクトID : 4567

3.サンプルソース(送受信周りがまだ未完成)
#include 

static struct usb_bus *m_bus;
static struct usb_device *m_dev;
static usb_dev_handle *m_dh;



static int USBopen()
{
 usb_init();
 usb_find_busses();
 usb_find_devices();

 /* search target device */
 for (m_bus = usb_get_busses(); m_bus; m_bus = m_bus->next) {
  for (m_dev = m_bus->devices; m_dev; m_dev = m_dev->next) {
   if ((VENDOR_ID == m_dev->descriptor.idVendor) && (PRODUCT_ID == m_dev->descriptor.idProduct)) {
    return (NULL != (m_dh = usb_open(m_dev)))? 1 : -2;
   }
  }
 }
 return -1;
}



//送受信
//アクセスするUSBデバイスの「bmRequestType」や「bRequest」、「wValue」、「wIndex」、「wLength」などとエンドポイントなどを調べておく必要がある。
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());}


//read
#define USBclose() usb_close(dh);
#define USBread(readbuf, bytes, timeout) usb_bulk_read(dh, end_point, readbuf, bytes, timeout)


void test(){
 USBOpen();
 USBread(readbuf, bytes, timeout);
 USBClose();
}
4.コンパイル
 cc -o test test.c -I/usr/include/ -L/usr/lib/ -lusb


参考URL
http://penguin.tantin.jp/hard/libusb%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.html
http://bake-san.com/usb004.htm
http://blog.livedoor.jp/eru_at/archives/1262118.html

0 件のコメント:

Androider