FrontPage

2008/10/14 からのアクセス回数 11167

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

LibusbJava

まず、libusbのjavaラッパーが必要です。 世の中には、自分がやりたいと思うことをすでにやっている人がいますから、自分で最初から作る前に

libusb java

でグーグル検索すると

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

Windowsの人は、

ソースからのコンパイル

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

チェックアウト

Eclipseを使って、

SVNから

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

MacOSX用のダイナミックライブラリの作成

次に、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-0.5.7.jarの作成

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

テストプロジェクトの作成

Eclipseで新規プロジェクトで、

テストプログラム

テストプログラムUSBTiny45.javaを作成します。

動作確認

これでよしと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 

になりました。

ch.ntb.usbの変更

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は以下からダウンロードできます。

fileUSBTiny45.java

Snow LeopardでLibusbJava.jnilibを作る方法

2代目のMacMiniのOSをSonw Leopardにアップグレードしたら、Tigerで作ったLibusbJava.jnilibが動作しなくなってしまいました。

仕方なく、もう一度antを実行したのですが、ダメです。ここでは、試行錯誤の結果どうにかLibusbJava.jnilibができたので、その方法をメモしておきます。

最新のソースをチェックアウト

どうせなら、最新のソースにアップすることにしました。

チェックアウトは、以下のように行います。

$ svn co https://libusbjava.svn.sourceforge.net/svnroot/libusbjava/trunk/LibusbJava/

libusbもアップグレード

OSの変更でMacPortのlibusbを作り直しました。

LibusbJavaのページには、0.1の古いバージョンを使うとあるので、llibusb-compatもインストールします。 また、libusb-compatには、libusbppが含まれないのでlibusb-legacyもインストールします。

$ sudo port install libusb
$ sudo port install libusb-compat
$ sudo port install libusb-legacy

次に、libusbJavaが/usr/local/lib/libusb.dylib、/usr/local/lib/libusbpp.dylibを参照しているので、 シンボリックリンクを作ります。

$ cd /usr/local/lib
$ sudo /opt/local/lib/libusb-0.1.4.dylib ./libusb.dylib
$ sudo /opt/local/lib/libusb-legacy/libusbpp-legacy.dylib ./libusbpp.dylib

コンパイル

ソースファイルをチェックアウトした場所に戻って、コンパイルをします。

$ ant mac
途中省略
     [exec]  /usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2 -dynamic 
	-dylib -dylib_current_version 0.2.4.0 -arch x86_64 -macosx_version_min 10.6.6 
	-weak_reference_mismatches non-weak -o libusbJava.jnilib 
	-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64 
	-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64 
	-L/usr/lib/i686-apple-darwin10/4.2.1 
	-L/usr/lib/gcc/i686-apple-darwin10/4.2.1 
	-L/usr/lib/gcc/i686-apple-darwin10/4.2.1 
	-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1 
	-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.. 		
	/var/folders/Xo/XoxQsiGT2RWIck+BYuxhKU+++TI/-Tmp-//cc725VBz.o 
	-lstdc++ /usr/local/lib/libusb.dylib /usr/local/lib/libusbpp.dylib -lSystem -lgcc -lSystem
     [exec] ld: malformed version number: 0.2.4.0
     [exec] collect2: ld returned 1 exit status
     [exec] Result: 1

とcollect2の実行でldがmalformed versionエラーを出力します。

原因は、collect2の引数の

-dylib_current_version 0.2.4.0

オプションのバージョンにあるようで、これを除くとエラーはでません。

そこで、build.xmlの90行目の

                        <arg line="-current_version ${version}" />

を削除して、

$ ant mac

を実行すると、無事Snow Leopardで動くLibusbJava.jnilibができます。

Snow Leopard版のLibusbJava.jnilib

念のため、作成したLibusbJava.jnilibを以下に置いておきます。

コメント

この記事は、

選択肢 投票
おもしろかった 3  
そうでもない 0  
わかりずらい 0  

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


(Input image string)

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