Lines Matching +full:touch +full:- +full:max +full:- +full:y

1 // SPDX-License-Identifier: GPL-2.0-or-later
21 #include "hid-ids.h"
27 static int middle_button_start = -350;
39 return -EINVAL; in param_set_scroll_speed()
52 MODULE_PARM_DESC(report_undeciphered, "Report undeciphered multi-touch state field using a MSC_RAW …
66 * 0x03 seem to indicate the aspect ratio of the touch, bits 0x70 seem
67 * to be some kind of bit mask -- 0x20 may be a near-field reading,
76 /* Number of high-resolution events for each low-resolution detent. */
82 /* Touch surface information. Dimension is in hundredths of a mm, min and max
85 #define MOUSE_MIN_X -1100
87 #define MOUSE_RES_X ((MOUSE_MAX_X - MOUSE_MIN_X) / (MOUSE_DIMENSION_X / 100))
89 #define MOUSE_MIN_Y -1589
91 #define MOUSE_RES_Y ((MOUSE_MAX_Y - MOUSE_MIN_Y) / (MOUSE_DIMENSION_Y / 100))
94 #define TRACKPAD_MIN_X -2909
97 ((TRACKPAD_MAX_X - TRACKPAD_MIN_X) / (TRACKPAD_DIMENSION_X / 100))
99 #define TRACKPAD_MIN_Y -2456
102 ((TRACKPAD_MAX_Y - TRACKPAD_MIN_Y) / (TRACKPAD_DIMENSION_Y / 100))
105 #define TRACKPAD2_MIN_X -3678
108 ((TRACKPAD2_MAX_X - TRACKPAD2_MIN_X) / (TRACKPAD2_DIMENSION_X / 100))
110 #define TRACKPAD2_MIN_Y -2478
113 ((TRACKPAD2_MAX_Y - TRACKPAD2_MIN_Y) / (TRACKPAD2_DIMENSION_Y / 100))
116 * struct magicmouse_sc - Tracks Magic Mouse-specific data.
119 * @ntouches: Number of touches in most recent touch report.
122 * @touches: Most recent data for a touch, indexed by tracking ID.
123 * @tracking_ids: Mapping of current touch input data to @touches.
138 short y; member
156 int touch = -1; in magicmouse_firm_touch() local
159 /* If there is only one "firm" touch, set touch to its in magicmouse_firm_touch()
162 for (ii = 0; ii < msc->ntouches; ii++) { in magicmouse_firm_touch()
163 int idx = msc->tracking_ids[ii]; in magicmouse_firm_touch()
164 if (msc->touches[idx].size < 8) { in magicmouse_firm_touch()
165 /* Ignore this touch. */ in magicmouse_firm_touch()
166 } else if (touch >= 0) { in magicmouse_firm_touch()
167 touch = -1; in magicmouse_firm_touch()
170 touch = idx; in magicmouse_firm_touch()
174 return touch; in magicmouse_firm_touch()
179 int last_state = test_bit(BTN_LEFT, msc->input->key) << 0 | in magicmouse_emit_buttons()
180 test_bit(BTN_RIGHT, msc->input->key) << 1 | in magicmouse_emit_buttons()
181 test_bit(BTN_MIDDLE, msc->input->key) << 2; in magicmouse_emit_buttons()
188 * touch, use that to override the mouse's guess. in magicmouse_emit_buttons()
195 int x = msc->touches[id].x; in magicmouse_emit_buttons()
204 input_report_key(msc->input, BTN_MIDDLE, state & 4); in magicmouse_emit_buttons()
207 input_report_key(msc->input, BTN_LEFT, state & 1); in magicmouse_emit_buttons()
208 input_report_key(msc->input, BTN_RIGHT, state & 2); in magicmouse_emit_buttons()
211 msc->scroll_accel = SCROLL_ACCEL_DEFAULT; in magicmouse_emit_buttons()
216 struct input_dev *input = msc->input; in magicmouse_emit_touch()
217 int id, x, y, size, orientation, touch_major, touch_minor, state, down; in magicmouse_emit_touch() local
220 if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE || in magicmouse_emit_touch()
221 input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2 || in magicmouse_emit_touch()
222 input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC) { in magicmouse_emit_touch()
225 y = -((tdata[2] << 24 | tdata[1] << 16) >> 20); in magicmouse_emit_touch()
227 orientation = (tdata[6] >> 2) - 32; in magicmouse_emit_touch()
232 } else if (input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || in magicmouse_emit_touch()
233 input->id.product == in magicmouse_emit_touch()
237 y = -((tdata[3] << 30 | tdata[2] << 22 | tdata[1] << 14) >> 19); in magicmouse_emit_touch()
239 orientation = (tdata[8] >> 5) - 4; in magicmouse_emit_touch()
248 y = -((tdata[3] << 30 | tdata[2] << 22 | tdata[1] << 14) >> 19); in magicmouse_emit_touch()
250 orientation = (tdata[7] >> 2) - 32; in magicmouse_emit_touch()
258 msc->tracking_ids[raw_id] = id; in magicmouse_emit_touch()
259 msc->touches[id].x = x; in magicmouse_emit_touch()
260 msc->touches[id].y = y; in magicmouse_emit_touch()
261 msc->touches[id].size = size; in magicmouse_emit_touch()
264 * vertical touch motions. in magicmouse_emit_touch()
267 input->id.product != USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 && in magicmouse_emit_touch()
268 input->id.product != USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) { in magicmouse_emit_touch()
270 int step_x = msc->touches[id].scroll_x - x; in magicmouse_emit_touch()
271 int step_y = msc->touches[id].scroll_y - y; in magicmouse_emit_touch()
274 ((64 - (int)scroll_speed) * msc->scroll_accel) / in magicmouse_emit_touch()
277 int step_x_hr = msc->touches[id].scroll_x_hr - x; in magicmouse_emit_touch()
278 int step_y_hr = msc->touches[id].scroll_y_hr - y; in magicmouse_emit_touch()
283 msc->touches[id].scroll_x = x; in magicmouse_emit_touch()
284 msc->touches[id].scroll_y = y; in magicmouse_emit_touch()
285 msc->touches[id].scroll_x_hr = x; in magicmouse_emit_touch()
286 msc->touches[id].scroll_y_hr = y; in magicmouse_emit_touch()
287 msc->touches[id].scroll_x_active = false; in magicmouse_emit_touch()
288 msc->touches[id].scroll_y_active = false; in magicmouse_emit_touch()
292 msc->scroll_jiffies + HZ / 2)) in magicmouse_emit_touch()
293 msc->scroll_accel = max_t(int, in magicmouse_emit_touch()
294 msc->scroll_accel - 1, 1); in magicmouse_emit_touch()
296 msc->scroll_accel = SCROLL_ACCEL_DEFAULT; in magicmouse_emit_touch()
300 step_x /= (64 - (int)scroll_speed) * msc->scroll_accel; in magicmouse_emit_touch()
302 msc->touches[id].scroll_x -= step_x * in magicmouse_emit_touch()
303 (64 - scroll_speed) * msc->scroll_accel; in magicmouse_emit_touch()
304 msc->scroll_jiffies = now; in magicmouse_emit_touch()
305 input_report_rel(input, REL_HWHEEL, -step_x); in magicmouse_emit_touch()
308 step_y /= (64 - (int)scroll_speed) * msc->scroll_accel; in magicmouse_emit_touch()
310 msc->touches[id].scroll_y -= step_y * in magicmouse_emit_touch()
311 (64 - scroll_speed) * msc->scroll_accel; in magicmouse_emit_touch()
312 msc->scroll_jiffies = now; in magicmouse_emit_touch()
316 if (!msc->touches[id].scroll_x_active && in magicmouse_emit_touch()
318 msc->touches[id].scroll_x_active = true; in magicmouse_emit_touch()
319 msc->touches[id].scroll_x_hr = x; in magicmouse_emit_touch()
325 msc->touches[id].scroll_x_active) { in magicmouse_emit_touch()
326 msc->touches[id].scroll_x_hr -= step_x_hr * in magicmouse_emit_touch()
330 -step_x_hr * SCROLL_HR_MULT); in magicmouse_emit_touch()
333 if (!msc->touches[id].scroll_y_active && in magicmouse_emit_touch()
335 msc->touches[id].scroll_y_active = true; in magicmouse_emit_touch()
336 msc->touches[id].scroll_y_hr = y; in magicmouse_emit_touch()
342 msc->touches[id].scroll_y_active) { in magicmouse_emit_touch()
343 msc->touches[id].scroll_y_hr -= step_y_hr * in magicmouse_emit_touch()
354 msc->ntouches++; in magicmouse_emit_touch()
359 /* Generate the input events for this touch. */ in magicmouse_emit_touch()
363 input_report_abs(input, ABS_MT_ORIENTATION, -orientation); in magicmouse_emit_touch()
365 input_report_abs(input, ABS_MT_POSITION_Y, y); in magicmouse_emit_touch()
367 if (input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || in magicmouse_emit_touch()
368 input->id.product == in magicmouse_emit_touch()
373 if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE || in magicmouse_emit_touch()
374 input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2 || in magicmouse_emit_touch()
375 input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC) in magicmouse_emit_touch()
377 else if (input->id.product != in magicmouse_emit_touch()
379 input->id.product != in magicmouse_emit_touch()
390 struct input_dev *input = msc->input; in magicmouse_raw_event()
391 int x = 0, y = 0, ii, clicks = 0, npoints; in magicmouse_raw_event() local
396 /* Expect four bytes of prefix, and N*9 bytes of touch data. */ in magicmouse_raw_event()
397 if (size < 4 || ((size - 4) % 9) != 0) in magicmouse_raw_event()
399 npoints = (size - 4) / 9; in magicmouse_raw_event()
405 msc->ntouches = 0; in magicmouse_raw_event()
418 /* Expect twelve bytes of prefix and N*9 bytes of touch data. */ in magicmouse_raw_event()
419 if (size < 12 || ((size - 12) % 9) != 0) in magicmouse_raw_event()
421 npoints = (size - 12) / 9; in magicmouse_raw_event()
427 msc->ntouches = 0; in magicmouse_raw_event()
434 /* Expect six bytes of prefix, and N*8 bytes of touch data. */ in magicmouse_raw_event()
435 if (size < 6 || ((size - 6) % 8) != 0) in magicmouse_raw_event()
437 npoints = (size - 6) / 8; in magicmouse_raw_event()
443 msc->ntouches = 0; in magicmouse_raw_event()
447 /* When emulating three-button mode, it is important in magicmouse_raw_event()
448 * to have the current touch information before in magicmouse_raw_event()
452 y = (int)(((data[3] & 0x30) << 26) | (data[2] << 22)) >> 22; in magicmouse_raw_event()
463 if (size != 8 && (size < 14 || (size - 14) % 8 != 0)) in magicmouse_raw_event()
465 npoints = (size - 14) / 8; in magicmouse_raw_event()
471 msc->ntouches = 0; in magicmouse_raw_event()
475 /* When emulating three-button mode, it is important in magicmouse_raw_event()
476 * to have the current touch information before in magicmouse_raw_event()
480 y = (int)((data[5] << 24) | (data[4] << 16)) >> 16; in magicmouse_raw_event()
490 /* Sometimes the trackpad sends two touch reports in one in magicmouse_raw_event()
495 size - 2 - data[1]); in magicmouse_raw_event()
501 if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE || in magicmouse_raw_event()
502 input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2 || in magicmouse_raw_event()
503 input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC) { in magicmouse_raw_event()
506 input_report_rel(input, REL_Y, y); in magicmouse_raw_event()
507 } else if (input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || in magicmouse_raw_event()
508 input->id.product == in magicmouse_raw_event()
525 if ((msc->input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2 || in magicmouse_event()
526 msc->input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC) && in magicmouse_event()
527 field->report->id == MOUSE2_REPORT_ID) { in magicmouse_event()
544 __set_bit(EV_KEY, input->evbit); in magicmouse_setup_input()
546 if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE || in magicmouse_setup_input()
547 input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2 || in magicmouse_setup_input()
548 input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC) { in magicmouse_setup_input()
549 __set_bit(BTN_LEFT, input->keybit); in magicmouse_setup_input()
550 __set_bit(BTN_RIGHT, input->keybit); in magicmouse_setup_input()
552 __set_bit(BTN_MIDDLE, input->keybit); in magicmouse_setup_input()
554 __set_bit(EV_REL, input->evbit); in magicmouse_setup_input()
555 __set_bit(REL_X, input->relbit); in magicmouse_setup_input()
556 __set_bit(REL_Y, input->relbit); in magicmouse_setup_input()
558 __set_bit(REL_WHEEL, input->relbit); in magicmouse_setup_input()
559 __set_bit(REL_HWHEEL, input->relbit); in magicmouse_setup_input()
560 __set_bit(REL_WHEEL_HI_RES, input->relbit); in magicmouse_setup_input()
561 __set_bit(REL_HWHEEL_HI_RES, input->relbit); in magicmouse_setup_input()
563 } else if (input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || in magicmouse_setup_input()
564 input->id.product == in magicmouse_setup_input()
574 if (hdev->vendor == BT_VENDOR_ID_APPLE) { in magicmouse_setup_input()
575 if (input->id.version == TRACKPAD2_2021_BT_VERSION) in magicmouse_setup_input()
576 input->name = "Apple Inc. Magic Trackpad 2021"; in magicmouse_setup_input()
577 else if (input->id.version == TRACKPAD_2024_BT_VERSION) { in magicmouse_setup_input()
578 input->name = "Apple Inc. Magic Trackpad USB-C"; in magicmouse_setup_input()
580 input->name = "Apple Inc. Magic Trackpad"; in magicmouse_setup_input()
583 input->name = hdev->name; in magicmouse_setup_input()
586 __clear_bit(EV_MSC, input->evbit); in magicmouse_setup_input()
587 __clear_bit(BTN_0, input->keybit); in magicmouse_setup_input()
588 __clear_bit(BTN_RIGHT, input->keybit); in magicmouse_setup_input()
589 __clear_bit(BTN_MIDDLE, input->keybit); in magicmouse_setup_input()
590 __set_bit(BTN_MOUSE, input->keybit); in magicmouse_setup_input()
591 __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); in magicmouse_setup_input()
592 __set_bit(BTN_TOOL_FINGER, input->keybit); in magicmouse_setup_input()
597 /* input->keybit is initialized with incorrect button info in magicmouse_setup_input()
602 __clear_bit(BTN_RIGHT, input->keybit); in magicmouse_setup_input()
603 __clear_bit(BTN_MIDDLE, input->keybit); in magicmouse_setup_input()
604 __set_bit(BTN_MOUSE, input->keybit); in magicmouse_setup_input()
605 __set_bit(BTN_TOOL_FINGER, input->keybit); in magicmouse_setup_input()
606 __set_bit(BTN_TOOL_DOUBLETAP, input->keybit); in magicmouse_setup_input()
607 __set_bit(BTN_TOOL_TRIPLETAP, input->keybit); in magicmouse_setup_input()
608 __set_bit(BTN_TOOL_QUADTAP, input->keybit); in magicmouse_setup_input()
609 __set_bit(BTN_TOOL_QUINTTAP, input->keybit); in magicmouse_setup_input()
610 __set_bit(BTN_TOUCH, input->keybit); in magicmouse_setup_input()
611 __set_bit(INPUT_PROP_POINTER, input->propbit); in magicmouse_setup_input()
612 __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); in magicmouse_setup_input()
616 __set_bit(EV_ABS, input->evbit); in magicmouse_setup_input()
626 /* Note: Touch Y position from the device is inverted relative in magicmouse_setup_input()
630 * inverse of the reported Y. in magicmouse_setup_input()
632 if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE || in magicmouse_setup_input()
633 input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2 || in magicmouse_setup_input()
634 input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC) { in magicmouse_setup_input()
635 input_set_abs_params(input, ABS_MT_ORIENTATION, -31, 32, 1, 0); in magicmouse_setup_input()
645 } else if (input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || in magicmouse_setup_input()
646 input->id.product == in magicmouse_setup_input()
650 input_set_abs_params(input, ABS_MT_ORIENTATION, -3, 4, 0, 0); in magicmouse_setup_input()
665 input_set_abs_params(input, ABS_MT_ORIENTATION, -31, 32, 1, 0); in magicmouse_setup_input()
686 input->id.product != USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 && in magicmouse_setup_input()
687 input->id.product != USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) { in magicmouse_setup_input()
688 __set_bit(EV_MSC, input->evbit); in magicmouse_setup_input()
689 __set_bit(MSC_RAW, input->mscbit); in magicmouse_setup_input()
693 * hid-input may mark device as using autorepeat, but neither in magicmouse_setup_input()
696 __clear_bit(EV_REP, input->evbit); in magicmouse_setup_input()
703 struct hid_usage *usage, unsigned long **bit, int *max) in magicmouse_input_mapping() argument
707 if (!msc->input) in magicmouse_input_mapping()
708 msc->input = hi->input; in magicmouse_input_mapping()
711 if ((hi->input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD || in magicmouse_input_mapping()
712 hi->input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || in magicmouse_input_mapping()
713 hi->input->id.product == in magicmouse_input_mapping()
715 field->flags & HID_MAIN_ITEM_RELATIVE) in magicmouse_input_mapping()
716 return -1; in magicmouse_input_mapping()
728 ret = magicmouse_setup_input(msc->input, hdev); in magicmouse_input_configured()
731 /* clean msc->input to notify probe() of the failure */ in magicmouse_input_configured()
732 msc->input = NULL; in magicmouse_input_configured()
750 switch (hdev->product) { in magicmouse_enable_multitouch()
753 switch (hdev->vendor) { in magicmouse_enable_multitouch()
775 return -ENOMEM; in magicmouse_enable_multitouch()
789 ret = magicmouse_enable_multitouch(msc->hdev); in magicmouse_enable_mt_work()
791 hid_err(msc->hdev, "unable to request touch data (%d)\n", ret); in magicmouse_enable_mt_work()
816 if (!hdev->battery || in magicmouse_fetch_battery()
817 (!is_usb_magicmouse2(hdev->vendor, hdev->product) && in magicmouse_fetch_battery()
818 !is_usb_magictrackpad2(hdev->vendor, hdev->product))) in magicmouse_fetch_battery()
819 return -1; in magicmouse_fetch_battery()
821 report_enum = &hdev->report_enum[hdev->battery_report_type]; in magicmouse_fetch_battery()
822 report = report_enum->report_id_hash[hdev->battery_report_id]; in magicmouse_fetch_battery()
824 if (!report || report->maxfield < 1) in magicmouse_fetch_battery()
825 return -1; in magicmouse_fetch_battery()
827 if (hdev->battery_capacity == hdev->battery_max) in magicmouse_fetch_battery()
828 return -1; in magicmouse_fetch_battery()
833 return -1; in magicmouse_fetch_battery()
840 struct hid_device *hdev = msc->hdev; in magicmouse_battery_timer_tick()
843 mod_timer(&msc->battery_timer, in magicmouse_battery_timer_tick()
855 msc = devm_kzalloc(&hdev->dev, sizeof(*msc), GFP_KERNEL); in magicmouse_probe()
858 return -ENOMEM; in magicmouse_probe()
861 msc->scroll_accel = SCROLL_ACCEL_DEFAULT; in magicmouse_probe()
862 msc->hdev = hdev; in magicmouse_probe()
863 INIT_DEFERRABLE_WORK(&msc->work, magicmouse_enable_mt_work); in magicmouse_probe()
865 msc->quirks = id->driver_data; in magicmouse_probe()
880 if (is_usb_magicmouse2(id->vendor, id->product) || in magicmouse_probe()
881 is_usb_magictrackpad2(id->vendor, id->product)) { in magicmouse_probe()
882 timer_setup(&msc->battery_timer, magicmouse_battery_timer_tick, 0); in magicmouse_probe()
883 mod_timer(&msc->battery_timer, in magicmouse_probe()
888 if (is_usb_magicmouse2(id->vendor, id->product) || in magicmouse_probe()
889 (is_usb_magictrackpad2(id->vendor, id->product) && in magicmouse_probe()
890 hdev->type != HID_TYPE_USBMOUSE)) in magicmouse_probe()
893 if (!msc->input) { in magicmouse_probe()
895 ret = -ENOMEM; in magicmouse_probe()
899 switch (id->product) { in magicmouse_probe()
909 switch (id->vendor) { in magicmouse_probe()
927 hid_err(hdev, "unable to register touch report\n"); in magicmouse_probe()
928 ret = -ENOMEM; in magicmouse_probe()
931 report->size = 6; in magicmouse_probe()
937 * This results in -EIO from the _raw low-level transport callback, in magicmouse_probe()
939 * Thus the super-ugly hacky success check below. in magicmouse_probe()
942 if (ret != -EIO && ret < 0) { in magicmouse_probe()
943 hid_err(hdev, "unable to request touch data (%d)\n", ret); in magicmouse_probe()
946 if (ret == -EIO && (id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2 || in magicmouse_probe()
947 id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC)) { in magicmouse_probe()
948 schedule_delayed_work(&msc->work, msecs_to_jiffies(500)); in magicmouse_probe()
953 if (is_usb_magicmouse2(id->vendor, id->product) || in magicmouse_probe()
954 is_usb_magictrackpad2(id->vendor, id->product)) in magicmouse_probe()
955 timer_delete_sync(&msc->battery_timer); in magicmouse_probe()
966 cancel_delayed_work_sync(&msc->work); in magicmouse_remove()
967 if (is_usb_magicmouse2(hdev->vendor, hdev->product) || in magicmouse_remove()
968 is_usb_magictrackpad2(hdev->vendor, hdev->product)) in magicmouse_remove()
969 timer_delete_sync(&msc->battery_timer); in magicmouse_remove()
986 if ((is_usb_magicmouse2(hdev->vendor, hdev->product) || in magicmouse_report_fixup()
987 is_usb_magictrackpad2(hdev->vendor, hdev->product)) && in magicmouse_report_fixup()
991 *rsize = *rsize - 1; in magicmouse_report_fixup()