Bluetooth HIDワイヤレスタッチパネル

12273 ワード

前に書く
ホスト: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 PageDIGITIZERであり、カーネルコードの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タッチスクリーンになります.実現された後、この実現 に基づいて、手遊びのいくつかの制御を体感ゲームなどに変換することができる.