Bluetooth HIDワイヤレスタッチパネル
前に書く
ホスト:Android 5.0+カーネル3.4スレーブ:SensorTile先の効果図
原理解析
HID事件はAndroid画面で次のような過程を経験しました.
HIDは標準的な入力プロトコルであり,異なるオペレーティングシステムに対しても独自のinputサブシステムがある.
Android層の要件
Androidを例にとると、Androidシステムに入力デバイスがタッチスクリーンであると認識させるには、カーネルデバイスが報告される必要があります.
注意:入力デバイスがタッチスクリーンであることを示すもう一つの方法入力デバイスレポートには
カーネル層の要件
Android層の要求で言及された
これにより、HID記述子には、以下の要件が必要であることがわかる.
Bluetooth HIDスレーブ
ここではSTの
見通し
現在、単一のタッチスクリーンが実現されていますが、後で別の文章を書いて、マルチタッチスクリーンを実現する方法を説明して、その時になってから本当のBluetooth HIDタッチスクリーンになります.実現された後、この実現
ホスト:Android 5.0+カーネル3.4スレーブ:SensorTile先の効果図
原理解析
HID事件はAndroid画面で次のような過程を経験しました.
HID => linux kernel input => Android input
HIDは標準的な入力プロトコルであり,異なるオペレーティングシステムに対しても独自のinputサブシステムがある.
Android層の要件
Androidを例にとると、Androidシステムに入力デバイスがタッチスクリーンであると認識させるには、カーネルデバイスが報告される必要があります.
//
ABS_X ABS_Y BTN_TOUCH
//
ABS_MT_POSITION_X ABS_MT_POSITION_Y BTN_TOUCH
/system/usr/idc/
などの構成ファイルを/system/usr/idc/HID.idc
に配置する必要があります.内容は以下のようにタッチスクリーンデバイスタイプとして指定されます.touch.deviceType = touchScreen
注意:入力デバイスがタッチスクリーンであることを示すもう一つの方法入力デバイスレポートには
INPUT_PROP_DIRECT
入力プロパティがありますが、Bluetooth HIDではAndroidでの実装はuhidに基づいて実現されるので、これは難しいので、プロファイルを配置する方法が一般的です.入力デバイスによって報告されたキー値および入力属性は、getevent -i
を使用して表示することができる.理論的根拠は次のとおりです.https://source.android.com/devices/input/touch-devices カーネル層の要件
Android層の要求で言及された
ABS_X ABS_Y BTN_TOUCH
などは、カーネルが報告するキー値を必要とし、カーネルの中では、カーネルキー値がHIDキー値から変換されたため、HIDデバイスに一定の要求に従ってHIDキー値をアップロードする必要がある.// drivers/hid/hid-input.c
case HID_UP_DIGITIZER:
switch (usage->hid & 0xff) {
case 0x00: /* Undefined */
goto ignore;
case HID_DG_TIPPRESSURE: /* TipPressure */
if (!test_bit(BTN_TOUCH, input->keybit)) {
device->quirks |= HID_QUIRK_NOTOUCH;
set_bit(EV_KEY, input->evbit);
set_bit(BTN_TOUCH, input->keybit);
}
map_abs_clear(ABS_PRESSURE);
break;
case HID_DG_INRANGE: /* InRange */
switch (field->physical & 0xff) {
case 0x21: map_key(BTN_TOOL_MOUSE); break;
case 0x22: map_key(BTN_TOOL_FINGER); break;
default: map_key(BTN_TOOL_PEN); break;
}
break;
case HID_DG_INVERT: /* Invert */
map_key_clear(BTN_TOOL_RUBBER);
break;
case HID_DG_TOUCH: /* Touch */
case HID_DG_TIPSWITCH: /* TipSwitch */
case HID_DG_TIPSWITCH2: /* TipSwitch2 */
device->quirks &= ~HID_QUIRK_NOTOUCH;
map_key_clear(BTN_TOUCH);
break;
case HID_DG_BARRELSWITCH: /* BarrelSwitch */
map_key_clear(BTN_STYLUS);
break;
case HID_DG_TABLETPICK: /* TabletPick */
map_key_clear(BTN_STYLUS2);
break;
case HID_DG_CONTACTID: /* ContactID */
device->quirks |= HID_QUIRK_MULTITOUCH;
goto unknown;
default: goto unknown;
}
これにより、HID記述子には、以下の要件が必要であることがわかる.
Usage Page
はDIGITIZER
であり、カーネルコードのHID_UP_DIGITIZER
に対応する.2.HID_DG_TOUCH、HID_DG_TIPSWITCH、HID_DG_TIPSWITCH2
に報告するには、BTN_TOUCH
の3つのうちの1つを含む必要がある.3.HID_DG_INRANGE
が含まれている場合、BTN_TOOL_PEN
がアップロードされ、蛇足を加える可能性があります.(私は実際のテストで確かにこの問題に遭遇しました.BTN_TOOL_PEN
事件を報告し、BTN_TOUCH
を報告しないと、本当の
を実現できません).これらの分析によれば、マイクロソフトのSample Report Descriptor for a Touch Digitizer Device(Windows 7)が言及したHID記述子を簡単に修正し、所望の記述子を得た. 0x05, 0x0d, // USAGE_PAGE (Digitizers)
0x09, 0x04, // USAGE (Touch Screen)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x01, // REPORT_ID (Touch)
0x09, 0x20, // USAGE (Stylus)
0xa1, 0x00, // COLLECTION (Physical)
0x09, 0x42, // USAGE (Tip Switch)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x03, // REPORT_COUNT (3)
0x81, 0x03, // INPUT (Cnst,Ary,Abs)
// 0x09, 0x32, // USAGE (In Range)
// 0x09, 0x47, // USAGE (Confidence)
// 0x95, 0x02, // REPORT_COUNT (1)
// 0x81, 0x02, // INPUT (Data,Var,Abs)
// 0x95, 0x0a, // REPORT_COUNT (10)
// 0x81, 0x03, // INPUT (Cnst,Ary,Abs)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x01, // REPORT_COUNT (1)
0xa4, // PUSH
0x55, 0x0d, // UNIT_EXPONENT (-3)
0x65, 0x00, // UNIT (None)
0x09, 0x30, // USAGE (X)
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x46, 0x00, 0x00, // PHYSICAL_MAXIMUM (0)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x09, 0x31, // USAGE (Y)
0x46, 0x00, 0x00, // PHYSICAL_MAXIMUM (0)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xb4, // POP
// 0x05, 0x0d, // USAGE PAGE (Digitizers)
// 0x09, 0x48, // USAGE (Width)
// 0x09, 0x49, // USAGE (Height)
// 0x95, 0x02, // REPORT_COUNT (2)
// 0x81, 0x02, // INPUT (Data,Var,Abs)
// 0x95, 0x01, // REPORT_COUNT (1)
// 0x81, 0x03, // INPUT (Cnst,Ary,Abs)
0xc0, // END_COLLECTION
0xc0, // END_COLLECTION
uhid
を使用して記述子をテストし、コードをテストすることで、タッチスクリーンの効果を確実に実現することができます.注意:マルチタッチデバイスの場合、ディスクリプタにはHID_DG_CONTACTID
を含める必要があります.ここでは分析を展開しません.Bluetooth HIDスレーブ
ここではSTの
SensorTile
を使用し、提供されたHIDのDemoに基づいて対応する記述子を修正し、whileサイクルで左上から右下にスライドするシミュレーション操作を実現することで、Bluetooth HIDタッチスクリーンを実現することができます.具体的な変更は以下の通りです.https://gitee.com/kangear/STM32CubeExpansion_BLE1_V2.8.0/commit/04e5e0af893c1099d1ce459307223735d3658e6d 見通し
現在、単一のタッチスクリーンが実現されていますが、後で別の文章を書いて、マルチタッチスクリーンを実現する方法を説明して、その時になってから本当のBluetooth HIDタッチスクリーンになります.実現された後、この実現
に基づいて、手遊びのいくつかの制御を体感ゲームなどに変換することができる.