2008/10/14 からのアクセス回数 11808
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は以下からダウンロードできます。
この記事は、
皆様のご意見、ご希望をお待ちしております。