Lines Matching refs:evdev
104 ffc_slot(struct evdev_dev *evdev, slotset_t slots) in ffc_slot() argument
106 return (ffs(~slots & ((2U << MAXIMAL_MT_SLOT(evdev)) - 1)) - 1); in ffc_slot()
110 evdev_mt_init(struct evdev_dev *evdev) in evdev_mt_init() argument
117 type_a = !bit_test(evdev->ev_abs_flags, ABS_MT_SLOT); in evdev_mt_init()
120 evdev_support_abs(evdev, in evdev_mt_init()
122 evdev_support_abs(evdev, in evdev_mt_init()
126 slots = MAXIMAL_MT_SLOT(evdev) + 1; in evdev_mt_init()
128 if (bit_test(evdev->ev_flags, EVDEV_FLAG_MT_TRACK)) { in evdev_mt_init()
134 evdev->ev_mt = mt; in evdev_mt_init()
137 if (bit_test(evdev->ev_flags, EVDEV_FLAG_MT_TRACK)) { in evdev_mt_init()
146 if (!bit_test(evdev->ev_flags, EVDEV_FLAG_MT_KEEPID)) in evdev_mt_init()
147 evdev_support_abs(evdev, in evdev_mt_init()
149 if (bit_test(evdev->ev_flags, EVDEV_FLAG_MT_STCOMPAT)) in evdev_mt_init()
150 evdev_mt_support_st_compat(evdev); in evdev_mt_init()
154 evdev_mt_free(struct evdev_dev *evdev) in evdev_mt_free() argument
156 kfree(evdev->ev_mt, M_EVDEV); in evdev_mt_free()
160 evdev_mt_sync_frame(struct evdev_dev *evdev) in evdev_mt_sync_frame() argument
162 if (bit_test(evdev->ev_flags, EVDEV_FLAG_MT_TRACK)) in evdev_mt_sync_frame()
163 evdev_mt_replay_events(evdev); in evdev_mt_sync_frame()
164 if (bit_test(evdev->ev_flags, EVDEV_FLAG_MT_AUTOREL)) in evdev_mt_sync_frame()
165 evdev_mt_send_autorel(evdev); in evdev_mt_sync_frame()
166 if (evdev->ev_report_opened && in evdev_mt_sync_frame()
167 bit_test(evdev->ev_flags, EVDEV_FLAG_MT_STCOMPAT)) in evdev_mt_sync_frame()
168 evdev_mt_send_st_compat(evdev); in evdev_mt_sync_frame()
169 evdev->ev_mt->frame = 0; in evdev_mt_sync_frame()
173 evdev_mt_send_slot(struct evdev_dev *evdev, int slot, in evdev_mt_send_slot() argument
177 bool type_a = !bit_test(evdev->ev_abs_flags, ABS_MT_SLOT); in evdev_mt_send_slot()
179 EVDEV_LOCK_ASSERT(evdev); in evdev_mt_send_slot()
180 KKASSERT(type_a || (slot >= 0 && slot <= MAXIMAL_MT_SLOT(evdev))); in evdev_mt_send_slot()
184 evdev_send_event(evdev, EV_ABS, ABS_MT_SLOT, slot); in evdev_mt_send_slot()
186 evdev_send_event(evdev, EV_ABS, ABS_MT_TRACKING_ID, -1); in evdev_mt_send_slot()
190 bit_foreach_at(evdev->ev_abs_flags, ABS_MT_FIRST, ABS_MT_LAST + 1, i) in evdev_mt_send_slot()
191 evdev_send_event(evdev, EV_ABS, i, in evdev_mt_send_slot()
194 evdev_send_event(evdev, EV_SYN, SYN_MT_REPORT, 1); in evdev_mt_send_slot()
198 evdev_mt_push_slot(struct evdev_dev *evdev, int slot, in evdev_mt_push_slot() argument
201 struct evdev_mt *mt = evdev->ev_mt; in evdev_mt_push_slot()
202 bool type_a = !bit_test(evdev->ev_abs_flags, ABS_MT_SLOT); in evdev_mt_push_slot()
206 if (!type_a && (slot < 0 || slot > MAXIMAL_MT_SLOT(evdev))) in evdev_mt_push_slot()
209 EVDEV_ENTER(evdev); in evdev_mt_push_slot()
210 if (bit_test(evdev->ev_flags, EVDEV_FLAG_MT_TRACK) && mt->type_a) { in evdev_mt_push_slot()
212 evdev_mt_record_event(evdev, EV_SYN, SYN_MT_REPORT, 1); in evdev_mt_push_slot()
213 } else if (bit_test(evdev->ev_flags, EVDEV_FLAG_MT_TRACK)) { in evdev_mt_push_slot()
214 evdev_mt_record_event(evdev, EV_ABS, ABS_MT_SLOT, slot); in evdev_mt_push_slot()
218 evdev_mt_record_event(evdev, EV_ABS, in evdev_mt_push_slot()
221 evdev_mt_send_slot(evdev, slot, state); in evdev_mt_push_slot()
222 EVDEV_EXIT(evdev); in evdev_mt_push_slot()
320 evdev_mt_match_frame(struct evdev_dev *evdev, union evdev_mt_slot *pt, in evdev_mt_match_frame() argument
323 struct evdev_mt *mt = evdev->ev_mt; in evdev_mt_match_frame()
327 EVDEV_LOCK_ASSERT(evdev); in evdev_mt_match_frame()
329 KKASSERT(size >= 0 && size <= MAXIMAL_MT_SLOT(evdev) + 1); in evdev_mt_match_frame()
375 evdev_mt_send_frame(struct evdev_dev *evdev, union evdev_mt_slot *pt, int size) in evdev_mt_send_frame() argument
377 struct evdev_mt *mt = evdev->ev_mt; in evdev_mt_send_frame()
380 EVDEV_LOCK_ASSERT(evdev); in evdev_mt_send_frame()
381 KKASSERT(size >= 0 && size <= MAXIMAL_MT_SLOT(evdev) + 1); in evdev_mt_send_frame()
389 slot->id = ffc_slot(evdev, mt->touches | mt->frame); in evdev_mt_send_frame()
391 evdev_mt_send_slot(evdev, slot->id, slot); in evdev_mt_send_frame()
396 evdev_mt_push_frame(struct evdev_dev *evdev, union evdev_mt_slot *pt, int size) in evdev_mt_push_frame() argument
398 if (size < 0 || size > MAXIMAL_MT_SLOT(evdev) + 1) in evdev_mt_push_frame()
401 EVDEV_ENTER(evdev); in evdev_mt_push_frame()
402 evdev_mt_send_frame(evdev, pt, size); in evdev_mt_push_frame()
403 EVDEV_EXIT(evdev); in evdev_mt_push_frame()
409 evdev_mt_record_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, in evdev_mt_record_event() argument
412 struct evdev_mt *mt = evdev->ev_mt; in evdev_mt_record_event()
414 EVDEV_LOCK_ASSERT(evdev); in evdev_mt_record_event()
441 KASSERT(mt->match_slot <= MAXIMAL_MT_SLOT(evdev), in evdev_mt_record_event()
456 evdev_mt_replay_events(struct evdev_dev *evdev) in evdev_mt_replay_events() argument
458 struct evdev_mt *mt = evdev->ev_mt; in evdev_mt_replay_events()
461 EVDEV_LOCK_ASSERT(evdev); in evdev_mt_replay_events()
468 evdev_mt_match_frame(evdev, mt->match_slots, size); in evdev_mt_replay_events()
469 evdev_mt_send_frame(evdev, mt->match_slots, size); in evdev_mt_replay_events()
475 evdev_mt_get_match_slots(struct evdev_dev *evdev) in evdev_mt_get_match_slots() argument
477 return (evdev->ev_mt->match_slots); in evdev_mt_get_match_slots()
481 evdev_mt_get_last_slot(struct evdev_dev *evdev) in evdev_mt_get_last_slot() argument
484 return (evdev->ev_mt->last_reported_slot); in evdev_mt_get_last_slot()
488 evdev_mt_set_last_slot(struct evdev_dev *evdev, int32_t slot) in evdev_mt_set_last_slot() argument
490 struct evdev_mt *mt = evdev->ev_mt; in evdev_mt_set_last_slot()
492 KKASSERT(slot >= 0 && slot <= MAXIMAL_MT_SLOT(evdev)); in evdev_mt_set_last_slot()
499 evdev_mt_get_value(struct evdev_dev *evdev, int32_t slot, int16_t code) in evdev_mt_get_value() argument
501 struct evdev_mt *mt = evdev->ev_mt; in evdev_mt_get_value()
503 KKASSERT(slot >= 0 && slot <= MAXIMAL_MT_SLOT(evdev)); in evdev_mt_get_value()
509 evdev_mt_set_value(struct evdev_dev *evdev, int32_t slot, int16_t code, in evdev_mt_set_value() argument
512 struct evdev_mt *mt = evdev->ev_mt; in evdev_mt_set_value()
514 KKASSERT(slot >= 0 && slot <= MAXIMAL_MT_SLOT(evdev)); in evdev_mt_set_value()
526 evdev_mt_id_to_slot(struct evdev_dev *evdev, int32_t tracking_id) in evdev_mt_id_to_slot() argument
528 struct evdev_mt *mt = evdev->ev_mt; in evdev_mt_id_to_slot()
537 if (bit_test(evdev->ev_flags, EVDEV_FLAG_MT_TRACK)) in evdev_mt_id_to_slot()
538 return (ffc_slot(evdev, mt->match_frame)); in evdev_mt_id_to_slot()
547 return (ffc_slot(evdev, mt->touches | mt->frame)); in evdev_mt_id_to_slot()
551 evdev_mt_reassign_id(struct evdev_dev *evdev, int slot, int32_t id) in evdev_mt_reassign_id() argument
553 struct evdev_mt *mt = evdev->ev_mt; in evdev_mt_reassign_id()
556 if (id == -1 || bit_test(evdev->ev_flags, EVDEV_FLAG_MT_KEEPID)) { in evdev_mt_reassign_id()
561 nid = evdev_mt_get_value(evdev, slot, ABS_MT_TRACKING_ID); in evdev_mt_reassign_id()
572 if (evdev_mt_get_value(evdev, slot, ABS_MT_TRACKING_ID) == nid) in evdev_mt_reassign_id()
589 evdev_mt_support_st_compat(struct evdev_dev *evdev) in evdev_mt_support_st_compat() argument
594 if (evdev->ev_absinfo == NULL) in evdev_mt_support_st_compat()
597 evdev_support_event(evdev, EV_KEY); in evdev_mt_support_st_compat()
598 evdev_support_key(evdev, BTN_TOUCH); in evdev_mt_support_st_compat()
601 if (!bit_test(evdev->ev_prop_flags, INPUT_PROP_DIRECT)) in evdev_mt_support_st_compat()
602 evdev_support_nfingers(evdev, MAXIMAL_MT_SLOT(evdev) + 1); in evdev_mt_support_st_compat()
606 if (!bit_test(evdev->ev_abs_flags, evdev_mtstmap[i].mt) || in evdev_mt_support_st_compat()
607 bit_test(evdev->ev_abs_flags, evdev_mtstmap[i].st)) in evdev_mt_support_st_compat()
609 ai = evdev->ev_absinfo + evdev_mtstmap[i].mt; in evdev_mt_support_st_compat()
610 evdev->ev_mt->mtst_events |= 1U << i; in evdev_mt_support_st_compat()
612 evdev_support_abs(evdev, evdev_mtstmap[i].st, in evdev_mt_support_st_compat()
620 evdev_support_abs(evdev, evdev_mtstmap[i].st, in evdev_mt_support_st_compat()
630 evdev_mt_send_st_compat(struct evdev_dev *evdev) in evdev_mt_send_st_compat() argument
632 struct evdev_mt *mt = evdev->ev_mt; in evdev_mt_send_st_compat()
635 EVDEV_LOCK_ASSERT(evdev); in evdev_mt_send_st_compat()
638 evdev_send_event(evdev, EV_KEY, BTN_TOUCH, nfingers > 0); in evdev_mt_send_st_compat()
644 evdev_send_event(evdev, EV_ABS, evdev_mtstmap[i].st, in evdev_mt_send_st_compat()
645 evdev_mt_normalize(evdev_mt_get_value(evdev, in evdev_mt_send_st_compat()
647 evdev->ev_absinfo[evdev_mtstmap[i].mt].minimum, in evdev_mt_send_st_compat()
648 evdev->ev_absinfo[evdev_mtstmap[i].mt].maximum, in evdev_mt_send_st_compat()
652 if (!bit_test(evdev->ev_prop_flags, INPUT_PROP_DIRECT)) in evdev_mt_send_st_compat()
653 evdev_send_nfingers(evdev, nfingers); in evdev_mt_send_st_compat()
656 evdev_send_event(evdev, EV_ABS, ABS_PRESSURE, 0); in evdev_mt_send_st_compat()
660 evdev_mt_send_autorel(struct evdev_dev *evdev) in evdev_mt_send_autorel() argument
662 struct evdev_mt *mt = evdev->ev_mt; in evdev_mt_send_autorel()
665 EVDEV_LOCK_ASSERT(evdev); in evdev_mt_send_autorel()
669 evdev_mt_send_slot(evdev, slot, NULL); in evdev_mt_send_autorel()
673 evdev_mt_push_autorel(struct evdev_dev *evdev) in evdev_mt_push_autorel() argument
675 EVDEV_ENTER(evdev); in evdev_mt_push_autorel()
676 evdev_mt_send_autorel(evdev); in evdev_mt_push_autorel()
677 EVDEV_EXIT(evdev); in evdev_mt_push_autorel()