PICをUSBデバイスとして認識させる
ために、サンプルのソースに入ってるディスクリプタの部分を変更せねばいかんのですが、なんとも意味が分からん。どうしたもんかなぁ〜〜〜〜。
まず、HIDのゲームパッドとしてwindowsに認識させたいんで、それにはレポートディスクリプタのUSAGEを変更すればよいのでしょうが、USAGEがなんかいっぱいあって、エンドポイントもいっぱいあって、
そもそもディスクリプタを記述している構造体の並び方にも疑問があって、スーパー意味わからん。
しかも16bit幅の記述の仕方ね。ん〜なんじゃ。
USB.orgのページにあるリファレンスみてもわかんね〜。
どうすっぺなぁ。
もう少しみてみよふ。
(4時間くらい経過)
と、四苦八苦してたら、wakatta!
// Report descriptor prepared by USB DESCRIPTOR TOOL
// http://www.usb.org/developers/hidpage/#Descriptor_Tool
/* 15item, 29byte */
const char ReportDescriptor1[25] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x09, 0x04, // USAGE (Joystick)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x08, // USAGE_MAXIMUM (Button 8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0 // END_COLLECTION
};
このレポートディスクリプタの場合。。。
まず、上から2行はGlobal Deskripterで、データの状態を表すラベルを書き換えるもの。カテゴリーをかえるとでもいうような感じ。で、例えばUSAGE PAGE(Generic Desktop)の場合、0x05, 0x01,は何を表すかといいますと、USB.orgから拝借したPDFの46ページをみると完璧にわかるのですが、
はじめの0x05がitem tagになっていて,この後に続くitemがUSAGE PAGEであるということを教えています。
で、次の0x01が実際のUSAGE PAGEの値。これはHID USAGE TABLE
をみると確認できます(実際みてみると、14ページでやはり"01 Generic Desktop Controls "との表記がある)。
とこんな感じで文字の羅列はこの二つのPDFをみながら解読できます。
で、問題なのはこの構造体の順番。
これは、普通に上から読んできゃいんだけど、注意しないといけないのは、Global,Main,Local itemの違いを把握してなきゃいけないってこと。
イメージ的にはMainが階層的には一番上で、main→global→localの順に細かく指定できる感じ。でもglobalがmainの前にきてもよくて、上の例でもLogical Minimum(global)の方がInput(main)の前にきてる。
で、特徴としては
globalはglobal自身でしか書き換えられなくて、書き換えられるまではずっとその値を保持してる。
mainは主にlocalの内容をホスト側に知らせる役。main itemはcollectionとendcollectionの中でのみ有効で、その中にさらにcollectionとendcollectionをネストできる。
localは実際の細かい設定を記述するとこ。次のcollectionにはその値は保持されない。
(詳しくは一個目のPDFの38~52あたりにmainとglobalとlocalの違いをまとめてある箇所がちらほらあるからそれをみるとわかる)
これらを頭に入れて上から順に読んでいくと意味がわかってくるはず!!
ということでした〜〜。
ちなみにreport descripterをエディットするソフトがあるからそっちでやるとはや〜い。
<※何か間違いとか指摘とか微妙な表現とかありましたらレスくださると助かります!>
コメントを投稿