USB プロジェクト - マウスのReportDescriptorを見てみよう [USB]
キーボード・デバイスのフリができたので、次はマウス・デバイスに挑戦します。 ハードウェアを作る前に、マウス向けReportDescriptorについて調べます。
HID Descriptor Toolにおまかせ
USB.orgで見つけた"HID Descriptor Tool"のサンプル・デスクリプタを見ながら、 考えます。
0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x02, // USAGE (Mouse) 0xa1, 0x01, // COLLECTION (Application)
最初は、このデバイスの種類(マウス)を宣言します。 ここから、マウス・デバイスとしてのデータ構造が始まります。
0x09, 0x01, // USAGE (Pointer) 0xa1, 0x00, // COLLECTION (Physical)
PhysicalタイプのPointer COLLECTIONが宣言されます。 Physicalが何を意味するのか、今のところ不明です。
0x05, 0x09, // USAGE_PAGE (Button) 0x19, 0x01, // USAGE_MINIMUM (Button 1) 0x29, 0x03, // USAGE_MAXIMUM (Button 3) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x95, 0x03, // REPORT_COUNT (3) 0x75, 0x01, // REPORT_SIZE (1) 0x81, 0x02, // INPUT (Data,Var,Abs)
マウス・デバイスからPCに送られる1バイト目の下3ビットの構造です。 三つのビットがそれぞれボタン1から3に相当しています。
0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x05, // REPORT_SIZE (5) 0x81, 0x03, // INPUT (Cnst,Var,Abs)
1バイト目の残りの5ビットには、定数データ"0"が入ります。
0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x30, // USAGE (X) 0x09, 0x31, // USAGE (Y) 0x15, 0x81, // LOGICAL_MINIMUM (-127) 0x25, 0x7f, // LOGICAL_MAXIMUM (127) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x02, // REPORT_COUNT (2) 0x81, 0x06, // INPUT (Data,Var,Rel)
2バイト目と3バイト目には、(X,Y)座標データが入ります。 それぞれ符号付8ビットの表現になっていて、 しかも相対値の値になるとされています。
0xc0, // END_COLLECTION 0xc0 // END_COLLECTION
最後にPointerとMouseの二つのCOLLECTIONを閉じておしまいです。
なんだか、キーボード・デバイスに比べて簡単に見えます。 扱うデータも3バイトの片方向通信です。 HIDのサンプル・プログラムを使うと、あっという間にできるかも。
【速報】
マウス・デバイスの実験に成功しました。
X方向だけですが、スイッチで移動が出来るマウスができました。
同じIDを持ったまま、キーボード・デバイスをマウス・デバイスに換装するときには、デバイスドライバの更新をしなくてはならないようです。
今夜は、これでおしまい。
by noritan (2008-02-08 23:12)