#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