static int cavan_input_device_probe(struct cavan_event_device *event_dev, void *data) { int ret; int fd = event_dev->fd; uint8_t key_bitmask[KEY_BITMASK_SIZE]; uint8_t abs_bitmask[ABS_BITMASK_SIZE]; uint8_t rel_bitmask[REL_BITMASK_SIZE]; struct cavan_input_device *dev, *head, *tail; ret = cavan_event_get_abs_bitmask(fd, abs_bitmask); if (ret < 0) { pr_error_info("cavan_event_get_abs_bitmask"); return ret; } ret = cavan_event_get_key_bitmask(fd, key_bitmask); if (ret < 0) { pr_error_info("cavan_event_get_key_bitmask"); return ret; } ret = cavan_event_get_rel_bitmask(fd, rel_bitmask); if (ret < 0) { pr_error_info("cavan_event_get_rel_bitmask"); return ret; } head = tail = NULL; while (1) { dev = cavan_input_device_create(key_bitmask, abs_bitmask, rel_bitmask); if (dev == NULL) { break; } dev->event_dev = event_dev; if (dev->probe && dev->probe(dev, data) < 0) { free(dev); continue; } if (head) { tail->next = dev; tail = dev; } else { head = tail = dev; } } if (head == NULL) { pr_red_info("can't recognize device"); return -EINVAL; } tail->next = NULL; event_dev->private_data = head; return 0; }
bool cavan_touch_device_matcher(struct cavan_event_matcher *matcher, void *data) { int ret; uint8_t abs_bitmask[ABS_BITMASK_SIZE]; uint8_t key_bitmask[KEY_BITMASK_SIZE]; ret = cavan_event_get_abs_bitmask(matcher->fd, abs_bitmask); if (ret < 0) { pr_error_info("cavan_event_get_abs_bitmask"); return false; } if (cavan_multi_touch_device_match(abs_bitmask)) { pr_green_info("Deivce %s mutil touch screen", matcher->devname); return true; } ret = cavan_event_get_key_bitmask(matcher->fd, key_bitmask); if (ret < 0) { pr_error_info("cavan_event_get_key_bitmask"); return false; } return cavan_single_touch_device_match(abs_bitmask, key_bitmask); }
bool cavan_keypad_device_matcher(struct cavan_event_matcher *matcher, void *data) { int ret; uint8_t key_bitmask[KEY_BITMASK_SIZE]; ret = cavan_event_get_key_bitmask(matcher->fd, key_bitmask); if (ret < 0) { pr_error_info("cavan_event_get_key_bitmask"); return ret; } return cavan_keypad_device_match(key_bitmask); }
bool cavan_single_touch_device_matcher(struct cavan_event_matcher *matcher, void *data) { int ret; uint8_t abs_bitmask[ABS_BITMASK_SIZE]; uint8_t key_bitmask[KEY_BITMASK_SIZE]; ret = cavan_event_get_abs_bitmask(matcher->fd, abs_bitmask); if (ret < 0) { pr_error_info("cavan_event_get_abs_bitmask"); return false; } ret = cavan_event_get_key_bitmask(matcher->fd, key_bitmask); if (ret < 0) { pr_error_info("cavan_event_get_key_bitmask"); return false; } return cavan_single_touch_device_match(abs_bitmask, key_bitmask); }