#freeze
[[FrontPage]]

2011/02/08 からのアクセス回数 &counter;

#contents

** はじめに [#w04c3010]
以前libusbを使ってオリジナルのUSB機器のアクセスする記事[[avr/javaからLibusbを使う]]を書きましたが、
[[arm/libhidでARMマイコンパーフェクト学習基板にアクセス]]で紹介したオリジナルUSB HID機器をJavaから
操作する方法をご紹介します。

** LibusbJavaを使う [#h53570b8]
[[avr/javaからLibusbを使う]]のでもご紹介したように、libusbをjavaからアクセスするためのライブラリがLibusbJavaです。

これを使ってARMマイコンパーフェクト学習基板への1バイトの入出力クラス(Generic1ByteHID)を作ってみます。

*** Generic1ByteHIDの作成 [#l41cbc29]
Generic1ByteHIDの機能はきわめて単純です。

- Generic1ByteHIDのコンストラクタ
- 1バイトの出力メソッド putByte
- 1バイトの入力メソッド getByte

です。

Generic1ByteHIDのコンストラクタは、USBデバイスをオープンしてdeviceハンドラにセットするだけです。((usbOpenDeviceは、[[avr/javaからLibusbを使う]]と同じです))
#pre{{
	public Generic1ByteHID(short vid, short pid) throws USBException {
		device = usbOpenDevice(vid, pid);
		if (device == 0) 
			throw new USBException("Device not found");
	}
}}

入出力きわめて単純です。

#pre{{
	/**
	 * USB HIDに1バイト出力する
	 * @param out		出力値
	 * @return	usb_control_msgの戻り値
	 */
	public int putByte(byte out) {
		int		ret;
		outpacket[0] = out;
		ret = LibusbJava.usb_control_msg(device,
				USB_ENDPOINT_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
				HID_REPORT_SET, 
				0x00 + (HID_RT_OUTPUT << 8),
				0x00,
				outpacket, 1, 5000);
		return (ret);
	}
	
	/**
	 * USB HIDから1バイト入力する
	 * @return	usb_control_msgの戻り値
	 */
	public int getByte() {
		int		ret;
		inpackate[0] = 0;
		ret = LibusbJava.usb_control_msg(device,
				USB_ENDPOINT_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
				HID_REPORT_GET, 
				0x00 + (HID_RT_INPUT << 8),
				0x00,
				inpackate, 1, 5000);
		if (ret > 0) 
			return (inpackate[0]);
		else
			return (ret);
	}
}}

*** どうしてこんなに簡単にできたのか [#t123b3db]
これまで、USBのHIDの紹介記事ではとても煩雑な処理をして、HID機器にアクセスしていました。

どうして、こんなに簡単にできたのでしょう。その解は
- 自分で作ったHIDなので、アクセスするレポートID、レポートindexは固定
- libhidを使ってオリジナルHIDのレポートID、レポートindexをあらかじめ調べておく

[[arm/libhidでARMマイコンパーフェクト学習基板にアクセス]]でご紹介した、libhidのtest_libhidプログラムは、指定したデバイスへのレポートパスをリストアップしてくれます。

この結果を使ってHIDの必要な情報にアクセスすることができるようになります。

ARMマイコンパーフェクト学習基板のUSBRomHidでは、
- レポートIDは、0
- レポートindexは、0

となっています。

Generic1ByteHIDでは、この結果を使ってARMマイコンパーフェクト学習基板にアクセスしています。

getByteを例にすると、
#pre{{
		ret = LibusbJava.usb_control_msg(device,
				USB_ENDPOINT_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
				HID_REPORT_GET, 
				0x00 + (HID_RT_INPUT << 8),
				0x00,
				inpackate, 1, 5000);
}}
の
- 4行目:0x00 + (HID_RT_INPUT << 8)の0x00がレポートID
- 5行目:0x00がレポートindex

をセットする場所です。


*** ソース [#j79cf7a8]
Generic1ByteHIDのソースを以下に置きます。

- &ref(Generic1ByteHID.java);

実行には、libusbJavaが必要となります。詳しくは、[[avr/javaからLibusbを使う]]を見てください。

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

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

皆様のご意見、ご希望をお待ちしております。
- 例題を[[arm/JavaからUSB HIDデバイスを制御する]]にアップしました。 -- [[竹本 浩]] &new{2011-09-03 (土) 16:01:13};

#comment_kcaptcha

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc