USB プロジェクト - コンパイル済みプログラムなら何とか [USB]
MC9S08JMxxシリーズ用のサンプル・アプリケーションを利用する計画は、 コンパイラがうまく使えないために挫折してしまいました。 でも、同梱されていたコンパイル済みプログラムだったら、何とかつかえるはずです。 そこで、PIDとVIDをこのアプリケーションに合わせたターゲットを作成して、 何とか連動させようと考えました。
ターゲットの改造
ターゲットは、HIDインターフェースを搭載した PID=XXX; VID=XXXX (伏字)のデバイスです。 HIDの上には、"Generic HID"インターフェースを構築します。 使用した"ReportDescriptor"は、これです。
char ReportDescriptor[46] = { 0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1) 0x09, 0x01, // USAGE (Vendor Usage 1) 0xa1, 0x01, // COLLECTION (Application) 0x05, 0x08, // USAGE_PAGE (LEDs) 0x09, 0x4b, // USAGE (Generic Indicator) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x04, // REPORT_COUNT (4) 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x04, // REPORT_COUNT (4) 0x91, 0x03, // OUTPUT (Cnst,Var,Abs) 0x05, 0x09, // USAGE_PAGE (Button) 0x19, 0x01, // USAGE_MINIMUM (Button 1) 0x29, 0x03, // USAGE_MAXIMUM (Button 4) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x04, // REPORT_COUNT (4) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x04, // REPORT_COUNT (4) 0x81, 0x03, // INPUT (Cnst,Var,Abs) 0xc0 // END_COLLECTION };
オリジナルから、ボタンの数を増やしました。 たぶん、このくらいは大丈夫だろう。
接続、点火
無限ループにボタンの状態とLEDの状態をやり取りするプログラムを書いたら、 度胸一発、接続、点火。 デバイスをつないだら、単なるHID準拠デバイスとして認識されました。
アプリケーションを起動する
フォルダ"C:\CMXUSB_LITE\usb-peripheral\pc-side\hid-led-demo\Debug"にある "hid-led-demo.exe"を実行します。 そして、開いたウィンドウのLEDボタンを押すと、見事にLEDが点灯しました。 また、ターゲットのボタンを押すとチェック・ボックスが反応しました。 めでたしめでたし。
やっぱり、アプリケーションを作ろう
実験できるのは、ここまで。 あとは、アプリケーション・プログラムを作るしかなさそうです。 でも、HIDが使えるのだったら、楽できそうだな。
プロジェクト・アーカイブは、以下のリンクを"HID05.zip"という名前で保存すると再現できます。
HID05.zip (20446 Bytes)
参考文献
USBハード&ソフト開発のすべて―USBコントローラの使い方からWindows/Linuxドライバの作成まで (TECHI―Bus Interface)
- 作者: インターフェース編集部
- 出版社/メーカー: CQ出版
- 発売日: 2006/07
- メディア: 単行本
USBターゲット機器開発のすべて―各種USBコントローラの使い方と基本ソフトウェアの作成法 (TECHI―Bus Interface)
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2005/08
- メディア: 単行本
>オリジナルから、ボタンの数を増やしました。 たぶん、このくらいは大丈夫だろう。
レポートデスクリプタの作成、検証は HID Descriptor Tool を使うと良いでしょう
このツールは、USB.org の HID Information ページ ( http://www.usb.org/developers/hidpage/ )で配布されています。
HID Descriptor Tool
http://www.usb.org/developers/hidpage/dt2_4.zip
ややユーザーインターフェースが面倒ですが、一応使えます。
なお、このツールで作成したデータをセーブするのは、アプリ本体のあるディレクトリにしておくと問題が出ません。さもないと、ロードするときにワーキングディレクトリが移動して、「dt.iniが見つからない」エラーが出ます。マイナーなバグですね。
このツールには、いくつかのレポートデスクリプタの(公式)サンプルが付属しているので、参考になります。
ところで、Vendor-specific HID (Vendor Defined Page)を使うのなら、実はそんなに細かくレポートのフィールドを規定する必要はありません。ザックリと各レポートのバイト数のみ規定して、内容はアプリで直接パースする方が普通です。そうすると、レポートデスクリプタが簡単になります。そういう趣旨の発言をここで例をあげて投稿しました。
"UsageMin/UsageMax" on KEIL forum
http://www.keil.com/forum/docs/thread11793.asp
レポートディスクリプタで細かくフィールドを規定しておけば、Windows では HidP_ APIでレポートをパースでき、汎用性を持たせることができます。が、個人のプロジェクトや仕様をオープンにしない商用アプリでそこまでやる必要があるかというとちょっと疑問ですね。
"Handling HID Reports" on MSDN
http://msdn2.microsoft.com/en-us/library/ms789898.aspx
Tsuneo
by Tsuneo (2008-03-13 23:16)
コメントありがとうございます。
HID Descriptor Tool は、usb.orgで見つけて、実際に使用しています。そうでなきゃ、あんな面倒なデスクリプタ何て書けません。機械に出来ることは機械にやらせなくては。出来上がったデータファイルは、他のサンプル同様、アプリケーションと同じ場所に放り込んであります。ヘッダファイルも同じところに出させて、ソースコードにコピペしています。
レポートデスクリプタで、細かくフィールドを分けることの意義というのを私も疑問に思っておりました。デバイスでもアプリケーションでもバイト列として扱うコードしか出てこないので、バイト数さえ合っていれば、実は何でも良いのではないかと考えていました。
私がこのあと試そうとしていたのは、PC側でUsageコードを指定してフィールドを抜き出す「抽象度の高いプログラム」でして、HidP_GetUsageValue 関数がそれらしいと目星はつけておりました。
「そこまでやる必要があるか」と問われたら、個人でやる分には必要はないでしょう。でも、やってみたい課題のひとつです。
by noritan (2008-03-13 23:30)