[[FrontPage]]

2008/10/14 からのアクセス回数 &counter;

#contents

[[avr/USB接続]]でlibusbを使って自作のUSBデバイスにアクセスすることができるようになりました。
次は、javaからこのUSBデバイスを操作してみます。

** LibusbJava [#c29ea8e8]
まず、libusbのjavaラッパーが必要です。
世の中には、自分がやりたいと思うことをすでにやっている人がいますから、自分で最初から作る前に
#pre{{
libusb java
}}
でグーグル検索すると
- [[Java libusb / libusb-win32 wrapper>http://libusbjava.sourceforge.net/wp/]]

を見つけることができました。

Windowsの人は、
- [[installation>http://libusbjava.sourceforge.net/wp/?page_id=8]]
を参考してください。

** ソースからのコンパイル [#we572fde]
私はMacOSXなので、SVNからソースをダウンロードしてコンパイルすることにしました。

*** チェックアウト [#y9a2aebc]
Eclipseを使って、

[[SVN>https://libusbjava.svn.sourceforge.net/svnroot/libusbjava]]から
- trunk/java
- trunk/libusbJava

をチェックアウトします。

*** MacOSX用のダイナミックライブラリの作成 [#ddb204b7]
次に、LibusbJavaを使ってMacOSX用のダイナミックライブラリを作成します。

LibusbJavaプロジェクトの
build.xmlの22行に以下の1行を追加してください。
#pre{{
	<property name="version.mac" value="${version.major}.${version.minor}.${version.micro}" />
}}

次にbuild.xmlを選択し、右クリックでRun As->Ant build...を選択します。
ターゲットして、Macを選択するとLibusbJava.jnilibが作成されます。

*** ch.ntb.usb-0.5.7.jarの作成 [#tb312e58]
同様に、ch.ntb.usbプロジェクトでbuild.xmlを使ってjarファイルを作成します。


** テストプロジェクトの作成 [#m3b6848b]
Eclipseで新規プロジェクトで、

- UsbTiny45プロジェクトを作成します。
-ここにLibusbJava.jnilib、ch.ntb.usb-0.5.7.jarをコピーします。
- ch.ntb.usb-0.5.7.jarをビルドパスに追加します。

*** テストプログラム [#t12c5b66]
テストプログラムUSBTiny45.javaを作成します。

- C版同じように、usbOpenDeviceは以下のようになります。
#pre{{
	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;		
	}
}}

- 実行部分も
#pre{{
	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);		
	}
}}
とします。

** 動作確認 [#zc3d669d]
これでよしとmain関数を実行したのですが、うまく動きません。

- libusbJava版は、ハブに接続したUSBデバイスをうまく認識しない。

ことが分かりました。

USBデバイスが認識されているかは、ch.ntb.usb-0.5.7.jarのUsbViewのmainメソッドを実行すると分かります。


めでたく、実行結果がCと同じく
#pre{{
ret=7 
buffer[0]=9 
buffer[1]=3 
buffer[2]=4 
buffer[3]=5 
buffer[4]=6 
buffer[5]=7 
buffer[6]=8 
}}
になりました。

** ch.ntb.usbの変更 [#a5d7fdf2]
Device.java#initDeviceの114行目の
#pre{{
					updateMaxPacketSize(device);
}}

をdevDesc.getAltinterface()が-1の時には、コールしないように修正すれば、

テストプログラムは、以下のように簡単になります。

#pre{{
	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();
		
	}
}}

** ファイル [#fb2ac0cb]
作成したUSBTiny45.javaは以下からダウンロードできます。

#ref(USBTiny45.java);


** コメント [#oac99957]
この記事は、

#vote(おもしろかった,そうでもない,わかりずらい)
#vote(おもしろかった[1],そうでもない[0],わかりずらい[0])

皆様のご意見、ご希望をお待ちしております。

#comment_kcaptcha


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc