2008/10/14 からのアクセス回数 11600
avr/USB接続でlibusbを使って自作のUSBデバイスにアクセスすることができるようになりました。 次は、javaからこのUSBデバイスを操作してみます。
まず、libusbのjavaラッパーが必要です。 世の中には、自分がやりたいと思うことをすでにやっている人がいますから、自分で最初から作る前に
libusb java
でグーグル検索すると
を見つけることができました。
Windowsの人は、
私はMacOSXなので、SVNからソースをダウンロードしてコンパイルすることにしました。
Eclipseを使って、
SVNから
をチェックアウトします。
次に、LibusbJavaを使ってMacOSX用のダイナミックライブラリを作成します。
LibusbJavaプロジェクトの build.xmlの22行に以下の1行を追加してください。
<property name="version.mac" value="${version.major}.${version.minor}.${version.micro}" />
次にbuild.xmlを選択し、右クリックでRun As->Ant build...を選択します。 ターゲットして、Macを選択するとLibusbJava.jnilibが作成されます。
同様に、ch.ntb.usbプロジェクトでbuild.xmlを使ってjarファイルを作成します。
Eclipseで新規プロジェクトで、
テストプログラムUSBTiny45.javaを作成します。
static long usbOpenDevice(short idvendor, short idproduct) throws USBException { Usb_Device dev = null; Usb_Bus bus = USB.getBus(); long usbHandle = 0L; while (bus != null) { dev = bus.getDevices(); while (dev != null) { usbHandle = LibusbJava.usb_open(dev); if (usbHandle != 0) { Usb_Device_Descriptor devDesc = dev.getDescriptor(); String retp = LibusbJava.usb_get_string_simple(usbHandle, (int)devDesc.getIProduct()); String retm = LibusbJava.usb_get_string_simple(usbHandle, (int)devDesc.getIManufacturer()); if (retp != null && retm != null) { if (devDesc.getIdVendor() == idvendor && devDesc.getIdProduct() == idproduct) { return usbHandle; } } } dev = dev.getNext(); } bus = bus.getNext(); } LibusbJava.usb_close(usbHandle); return 0L; }
static private void testUsbOpenDevice() throws Exception { byte[] buffer = new byte[2312]; int i=3, j=4, k=5, l=6, m=7, n=8, o=9; int ret; long devHandle = usbOpenDevice(vendorId, productId); if (devHandle == 0) { System.err.println("usbOpenDevice failed\n"); return; } ret = LibusbJava.usb_control_msg(devHandle, USB.REQ_TYPE_TYPE_VENDOR|USB.REQ_TYPE_RECIP_DEVICE |USB_ENDPOINT_IN, i, j+256*k, l+256*m, buffer, n+256*o, 5000); System.out.format("ret=%d \n", ret); for (int p=0; p < ret; p++) { System.out.format("buffer[%d]=%d \n", p, buffer[p]); } LibusbJava.usb_close(devHandle); }とします。
これでよしとmain関数を実行したのですが、うまく動きません。
ことが分かりました。
USBデバイスが認識されているかは、ch.ntb.usb-0.5.7.jarのUsbViewのmainメソッドを実行すると分かります。
めでたく、実行結果がCと同じく
ret=7 buffer[0]=9 buffer[1]=3 buffer[2]=4 buffer[3]=5 buffer[4]=6 buffer[5]=7 buffer[6]=8
になりました。
Device.java#initDeviceの114行目の
updateMaxPacketSize(device);
をdevDesc.getAltinterface()が-1の時には、コールしないように修正すれば、
テストプログラムは、以下のように簡単になります。
static private void testDeviceAndUSB() throws Exception { byte[] buffer = new byte[2312]; int i=3, j=4, k=5, l=6, m=7, n=8, o=9; int ret; Device device = USB.getDevice(vendorId, productId); if (device == null) { System.err.println("usbOpenDevice failed\n"); return; } device.open(1, 0, -1); ret = device.controlMsg( USB.REQ_TYPE_TYPE_VENDOR|USB.REQ_TYPE_RECIP_DEVICE |USB_ENDPOINT_IN, i, j+256*k, l+256*m, buffer, n+256*o, 5000, false); System.out.format("ret=%d \n", ret); for (int p=0; p < ret; p++) { System.out.format("buffer[%d]=%d \n", p, buffer[p]); } device.close(); }
作成したUSBTiny45.javaは以下からダウンロードできます。
この記事は、
皆様のご意見、ご希望をお待ちしております。