Lines Matching +full:assigned +full:- +full:resolution +full:- +full:bits
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (c) 2000-2001 Vojtech Pavlik
4 * Copyright (c) 2006-2010 Jiri Kosina
12 * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
21 #include <linux/hid-debug.h>
23 #include "hid-ids.h"
49 } hid_hat_to_axis[] = {{ 0, 0}, { 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1…
62 * hid-input will convert this list into priorities:
67 * hid-input will then shift the priority by 8 bits to leave some space
71 * defined in the next 8 bits (defined by 0xff - slot).
73 * If drivers want to add fields before those, hid-input will
74 * leave out the first 8 bits of the priority value.
110 return (usage->hid & (HID_USAGE_PAGE | HID_USAGE)) == scancode; in match_scancode()
119 return (usage->type == EV_KEY && usage->code == keycode); in match_keycode()
141 list_for_each_entry(report, &hid->report_enum[k].report_list, list) { in hidinput_find_key()
142 for (i = 0; i < report->maxfield; i++) { in hidinput_find_key()
143 for (j = 0; j < report->field[i]->maxusage; j++) { in hidinput_find_key()
144 usage = report->field[i]->usage + j; in hidinput_find_key()
145 if (usage->type == EV_KEY || usage->type == 0) { in hidinput_find_key()
167 if (ke->flags & INPUT_KEYMAP_BY_INDEX) in hidinput_locate_usage()
168 usage = hidinput_find_key(hid, match_index, ke->index, index); in hidinput_locate_usage()
186 ke->keycode = usage->type == EV_KEY ? in hidinput_getkeycode()
187 usage->code : KEY_RESERVED; in hidinput_getkeycode()
188 ke->index = index; in hidinput_getkeycode()
189 scancode = usage->hid & (HID_USAGE_PAGE | HID_USAGE); in hidinput_getkeycode()
190 ke->len = sizeof(scancode); in hidinput_getkeycode()
191 memcpy(ke->scancode, &scancode, sizeof(scancode)); in hidinput_getkeycode()
195 return -EINVAL; in hidinput_getkeycode()
207 *old_keycode = usage->type == EV_KEY ? in hidinput_setkeycode()
208 usage->code : KEY_RESERVED; in hidinput_setkeycode()
209 usage->type = EV_KEY; in hidinput_setkeycode()
210 usage->code = ke->keycode; in hidinput_setkeycode()
212 clear_bit(*old_keycode, dev->keybit); in hidinput_setkeycode()
213 set_bit(usage->code, dev->keybit); in hidinput_setkeycode()
214 dbg_hid("Assigned keycode %d to HID usage code %x\n", in hidinput_setkeycode()
215 usage->code, usage->hid); in hidinput_setkeycode()
222 set_bit(*old_keycode, dev->keybit); in hidinput_setkeycode()
227 return -EINVAL; in hidinput_setkeycode()
232 * hidinput_calc_abs_res - calculate an absolute axis resolution
233 * @field: the HID report field to calculate resolution for
237 * (logical_maximum - logical_minimum)
238 * resolution = ----------------------------------------------------------
239 * (physical_maximum - physical_minimum) * 10 ^ unit_exponent
248 __s32 unit_exponent = field->unit_exponent; in hidinput_calc_abs_res()
249 __s32 logical_extents = field->logical_maximum - in hidinput_calc_abs_res()
250 field->logical_minimum; in hidinput_calc_abs_res()
251 __s32 physical_extents = field->physical_maximum - in hidinput_calc_abs_res()
252 field->physical_minimum; in hidinput_calc_abs_res()
273 if (field->unit == 0x11) { /* If centimeters */ in hidinput_calc_abs_res()
276 } else if (field->unit == 0x13) { /* If inches */ in hidinput_calc_abs_res()
282 unit_exponent -= 1; in hidinput_calc_abs_res()
294 if (field->unit == 0x14) { /* If degrees */ in hidinput_calc_abs_res()
301 } else if (field->unit != 0x12) { /* If not radians */ in hidinput_calc_abs_res()
308 if (field->unit == HID_UNIT_NEWTON) { in hidinput_calc_abs_res()
314 unit_exponent -= 2; in hidinput_calc_abs_res()
315 } else if (field->unit != HID_UNIT_GRAM) { in hidinput_calc_abs_res()
331 for (; unit_exponent > 0; unit_exponent--) { in hidinput_calc_abs_res()
338 /* Calculate resolution */ in hidinput_calc_abs_res()
402 * Elan I2C-HID touchscreens seem to all report a non present battery,
403 * set HID_BATTERY_QUIRK_IGNORE for all Elan I2C-HID devices.
416 quirks = match->driver_data; in find_battery_quirk()
424 if (dev->battery_min < dev->battery_max && in hidinput_scale_battery_capacity()
425 value >= dev->battery_min && value <= dev->battery_max) in hidinput_scale_battery_capacity()
426 value = ((value - dev->battery_min) * 100) / in hidinput_scale_battery_capacity()
427 (dev->battery_max - dev->battery_min); in hidinput_scale_battery_capacity()
439 return -ENOMEM; in hidinput_query_battery_capacity()
441 ret = hid_hw_raw_request(dev, dev->battery_report_id, buf, 4, in hidinput_query_battery_capacity()
442 dev->battery_report_type, HID_REQ_GET_REPORT); in hidinput_query_battery_capacity()
445 return -ENODATA; in hidinput_query_battery_capacity()
464 val->intval = 1; in hidinput_get_battery_property()
468 if (dev->battery_status != HID_BATTERY_REPORTED && in hidinput_get_battery_property()
469 !dev->battery_avoid_query) { in hidinput_get_battery_property()
474 value = dev->battery_capacity; in hidinput_get_battery_property()
477 val->intval = value; in hidinput_get_battery_property()
481 val->strval = dev->name; in hidinput_get_battery_property()
485 if (dev->battery_status != HID_BATTERY_REPORTED && in hidinput_get_battery_property()
486 !dev->battery_avoid_query) { in hidinput_get_battery_property()
491 dev->battery_capacity = value; in hidinput_get_battery_property()
492 dev->battery_status = HID_BATTERY_QUERIED; in hidinput_get_battery_property()
495 if (dev->battery_status == HID_BATTERY_UNKNOWN) in hidinput_get_battery_property()
496 val->intval = POWER_SUPPLY_STATUS_UNKNOWN; in hidinput_get_battery_property()
498 val->intval = dev->battery_charge_status; in hidinput_get_battery_property()
502 val->intval = POWER_SUPPLY_SCOPE_DEVICE; in hidinput_get_battery_property()
506 ret = -EINVAL; in hidinput_get_battery_property()
522 if (dev->battery) in hidinput_setup_battery()
528 dev->bus, dev->vendor, dev->product, dev->version, quirks); in hidinput_setup_battery()
535 return -ENOMEM; in hidinput_setup_battery()
537 psy_desc->name = kasprintf(GFP_KERNEL, "hid-%s-battery", in hidinput_setup_battery()
538 strlen(dev->uniq) ? in hidinput_setup_battery()
539 dev->uniq : dev_name(&dev->dev)); in hidinput_setup_battery()
540 if (!psy_desc->name) { in hidinput_setup_battery()
541 error = -ENOMEM; in hidinput_setup_battery()
545 psy_desc->type = POWER_SUPPLY_TYPE_BATTERY; in hidinput_setup_battery()
546 psy_desc->properties = hidinput_battery_props; in hidinput_setup_battery()
547 psy_desc->num_properties = ARRAY_SIZE(hidinput_battery_props); in hidinput_setup_battery()
548 psy_desc->use_for_apm = 0; in hidinput_setup_battery()
549 psy_desc->get_property = hidinput_get_battery_property; in hidinput_setup_battery()
551 min = field->logical_minimum; in hidinput_setup_battery()
552 max = field->logical_maximum; in hidinput_setup_battery()
562 dev->battery_min = min; in hidinput_setup_battery()
563 dev->battery_max = max; in hidinput_setup_battery()
564 dev->battery_report_type = report_type; in hidinput_setup_battery()
565 dev->battery_report_id = field->report->id; in hidinput_setup_battery()
566 dev->battery_charge_status = POWER_SUPPLY_STATUS_DISCHARGING; in hidinput_setup_battery()
573 dev->battery_avoid_query = report_type == HID_INPUT_REPORT && in hidinput_setup_battery()
574 field->physical == HID_DG_STYLUS; in hidinput_setup_battery()
577 dev->battery_avoid_query = true; in hidinput_setup_battery()
579 dev->battery = power_supply_register(&dev->dev, psy_desc, &psy_cfg); in hidinput_setup_battery()
580 if (IS_ERR(dev->battery)) { in hidinput_setup_battery()
581 error = PTR_ERR(dev->battery); in hidinput_setup_battery()
586 power_supply_powers(dev->battery, &dev->dev); in hidinput_setup_battery()
590 kfree(psy_desc->name); in hidinput_setup_battery()
593 dev->battery = NULL; in hidinput_setup_battery()
601 if (!dev->battery) in hidinput_cleanup_battery()
604 psy_desc = dev->battery->desc; in hidinput_cleanup_battery()
605 power_supply_unregister(dev->battery); in hidinput_cleanup_battery()
606 kfree(psy_desc->name); in hidinput_cleanup_battery()
608 dev->battery = NULL; in hidinput_cleanup_battery()
616 dev->battery_charge_status = value ? in hidinput_update_battery_charge_status()
630 if (!dev->battery) in hidinput_update_battery()
634 power_supply_changed(dev->battery); in hidinput_update_battery()
641 if (value < dev->battery_min || value > dev->battery_max) in hidinput_update_battery()
646 if (dev->battery_status != HID_BATTERY_REPORTED || in hidinput_update_battery()
647 capacity != dev->battery_capacity || in hidinput_update_battery()
648 ktime_after(ktime_get_coarse(), dev->battery_ratelimit_time)) { in hidinput_update_battery()
649 dev->battery_capacity = capacity; in hidinput_update_battery()
650 dev->battery_status = HID_BATTERY_REPORTED; in hidinput_update_battery()
651 dev->battery_ratelimit_time = in hidinput_update_battery()
653 power_supply_changed(dev->battery); in hidinput_update_battery()
678 collection = &device->collection[field->usage->collection_index]; in hidinput_field_in_collection()
680 return collection->type == type && collection->usage == usage; in hidinput_field_in_collection()
686 struct input_dev *input = hidinput->input; in hidinput_configure_usage()
693 field->hidinput = hidinput; in hidinput_configure_usage()
695 if (field->flags & HID_MAIN_ITEM_CONSTANT) in hidinput_configure_usage()
699 if (field->report_count < 1) in hidinput_configure_usage()
703 if (field->report_type == HID_OUTPUT_REPORT && in hidinput_configure_usage()
704 (usage->hid & HID_USAGE_PAGE) != HID_UP_LED && in hidinput_configure_usage()
705 (usage->hid & HID_USAGE_PAGE) != HID_UP_HAPTIC) { in hidinput_configure_usage()
711 if (usage->hid == hidinput_usages_priorities[i].usage) { in hidinput_configure_usage()
714 field->usages_priorities[usage_index] = in hidinput_configure_usage()
715 (ARRAY_SIZE(hidinput_usages_priorities) - i) << 8; in hidinput_configure_usage()
724 if (usage_priority && usage_priority->global) in hidinput_configure_usage()
725 field->usages_priorities[usage_index] |= in hidinput_configure_usage()
726 usage_priority->slot_overwrite; in hidinput_configure_usage()
728 field->usages_priorities[usage_index] |= in hidinput_configure_usage()
729 (0xff - field->slot_idx) << 16; in hidinput_configure_usage()
731 if (device->driver->input_mapping) { in hidinput_configure_usage()
732 int ret = device->driver->input_mapping(device, hidinput, field, in hidinput_configure_usage()
740 switch (usage->hid & HID_USAGE_PAGE) { in hidinput_configure_usage()
745 set_bit(EV_REP, input->evbit); in hidinput_configure_usage()
747 if ((usage->hid & HID_USAGE) < 256) { in hidinput_configure_usage()
748 if (!hid_keyboard[usage->hid & HID_USAGE]) goto ignore; in hidinput_configure_usage()
749 map_key_clear(hid_keyboard[usage->hid & HID_USAGE]); in hidinput_configure_usage()
756 code = ((usage->hid - 1) & HID_USAGE); in hidinput_configure_usage()
758 switch (field->application) { in hidinput_configure_usage()
765 code += BTN_TRIGGER_HAPPY - 0x10; in hidinput_configure_usage()
771 code += BTN_TRIGGER_HAPPY - 0x10; in hidinput_configure_usage()
780 code += BTN_TRIGGER_HAPPY - 0x1e; in hidinput_configure_usage()
785 switch (field->physical) { in hidinput_configure_usage()
798 switch (usage->hid & 0xffff) { in hidinput_configure_usage()
809 if ((usage->hid & 0xf0) == 0x80) { /* SystemControl */ in hidinput_configure_usage()
810 switch (usage->hid & 0xf) { in hidinput_configure_usage()
831 if ((usage->hid & 0xf0) == 0x90) { /* SystemControl & D-pad */ in hidinput_configure_usage()
832 switch (usage->hid) { in hidinput_configure_usage()
833 case HID_GD_UP: usage->hat_dir = 1; break; in hidinput_configure_usage()
834 case HID_GD_DOWN: usage->hat_dir = 5; break; in hidinput_configure_usage()
835 case HID_GD_RIGHT: usage->hat_dir = 3; break; in hidinput_configure_usage()
836 case HID_GD_LEFT: usage->hat_dir = 7; break; in hidinput_configure_usage()
842 if (usage->hid <= HID_GD_LEFT) { in hidinput_configure_usage()
843 if (field->dpad) { in hidinput_configure_usage()
844 map_abs(field->dpad); in hidinput_configure_usage()
852 if ((usage->hid & 0xf0) == 0xa0) { /* SystemControl */ in hidinput_configure_usage()
853 switch (usage->hid & 0xf) { in hidinput_configure_usage()
861 if ((usage->hid & 0xf0) == 0xb0) { /* SC - Display */ in hidinput_configure_usage()
862 switch (usage->hid & 0xf) { in hidinput_configure_usage()
875 if (field->application == HID_GD_SYSTEM_CONTROL) in hidinput_configure_usage()
878 switch (usage->hid) { in hidinput_configure_usage()
882 if (field->flags & HID_MAIN_ITEM_RELATIVE) in hidinput_configure_usage()
883 map_rel(usage->hid & 0xf); in hidinput_configure_usage()
885 map_abs_clear(usage->hid & 0xf); in hidinput_configure_usage()
889 if (field->flags & HID_MAIN_ITEM_RELATIVE) { in hidinput_configure_usage()
890 set_bit(REL_WHEEL, input->relbit); in hidinput_configure_usage()
893 map_abs(usage->hid & 0xf); in hidinput_configure_usage()
897 if (field->flags & HID_MAIN_ITEM_RELATIVE) in hidinput_configure_usage()
898 map_rel(usage->hid & 0xf); in hidinput_configure_usage()
900 map_abs(usage->hid & 0xf); in hidinput_configure_usage()
904 usage->hat_min = field->logical_minimum; in hidinput_configure_usage()
905 usage->hat_max = field->logical_maximum; in hidinput_configure_usage()
914 if (field->application == HID_GD_WIRELESS_RADIO_CTLS) { in hidinput_configure_usage()
917 field->flags |= HID_MAIN_ITEM_RELATIVE; in hidinput_configure_usage()
928 switch (usage->hid & 0xffff) { /* HID-Value: */ in hidinput_configure_usage()
934 case 0x27: map_led (LED_SLEEP); break; /* "Stand-By" */ in hidinput_configure_usage()
946 if ((field->application & 0xff) == 0x01) /* Digitizer */ in hidinput_configure_usage()
947 __set_bit(INPUT_PROP_POINTER, input->propbit); in hidinput_configure_usage()
948 else if ((field->application & 0xff) == 0x02) /* Pen */ in hidinput_configure_usage()
949 __set_bit(INPUT_PROP_DIRECT, input->propbit); in hidinput_configure_usage()
951 switch (usage->hid & 0xff) { in hidinput_configure_usage()
956 if (!test_bit(BTN_TOUCH, input->keybit)) { in hidinput_configure_usage()
957 device->quirks |= HID_QUIRK_NOTOUCH; in hidinput_configure_usage()
958 set_bit(EV_KEY, input->evbit); in hidinput_configure_usage()
959 set_bit(BTN_TOUCH, input->keybit); in hidinput_configure_usage()
965 switch (field->physical) { in hidinput_configure_usage()
977 if (!field->physical) { in hidinput_configure_usage()
978 switch (field->application) { in hidinput_configure_usage()
995 usage->type = EV_PWR; in hidinput_configure_usage()
999 device->quirks &= ~HID_QUIRK_NOINVERT; in hidinput_configure_usage()
1014 device->quirks &= ~HID_QUIRK_NOTOUCH; in hidinput_configure_usage()
1028 if (!test_bit(BTN_TOOL_RUBBER, input->keybit)) { in hidinput_configure_usage()
1029 device->quirks |= HID_QUIRK_NOINVERT; in hidinput_configure_usage()
1030 set_bit(BTN_TOOL_RUBBER, input->keybit); in hidinput_configure_usage()
1050 switch (usage->hid & HID_USAGE) { in hidinput_configure_usage()
1072 case HID_UP_CONSUMER: /* USB HUT v1.12, pages 75-84 */ in hidinput_configure_usage()
1073 switch (usage->hid & HID_USAGE) { in hidinput_configure_usage()
1236 set_bit(REL_HWHEEL, input->relbit); in hidinput_configure_usage()
1267 switch (usage->hid) { in hidinput_configure_usage()
1270 usage->type = EV_PWR; in hidinput_configure_usage()
1276 switch (usage->hid) { in hidinput_configure_usage()
1279 usage->type = EV_PWR; in hidinput_configure_usage()
1282 usage->type = EV_PWR; in hidinput_configure_usage()
1287 switch (usage->hid & HID_USAGE) { in hidinput_configure_usage()
1298 set_bit(EV_REP, input->evbit); in hidinput_configure_usage()
1299 switch (usage->hid & HID_USAGE) { in hidinput_configure_usage()
1317 set_bit(EV_REP, input->evbit); in hidinput_configure_usage()
1318 switch (usage->hid & HID_USAGE) { in hidinput_configure_usage()
1330 set_bit(EV_REP, input->evbit); in hidinput_configure_usage()
1341 switch (usage->hid & HID_USAGE) { in hidinput_configure_usage()
1349 if (field->report_size == 1) { in hidinput_configure_usage()
1350 if (field->report->type == HID_OUTPUT_REPORT) { in hidinput_configure_usage()
1357 if (field->flags & HID_MAIN_ITEM_RELATIVE) { in hidinput_configure_usage()
1370 if (device->driver->input_mapped && in hidinput_configure_usage()
1371 device->driver->input_mapped(device, hidinput, field, usage, in hidinput_configure_usage()
1380 set_bit(usage->type, input->evbit); in hidinput_configure_usage()
1384 * - HID aims at being generic so we should do our best to export in hidinput_configure_usage()
1386 * - HID describes what events are, so there is no reason for ABS_X in hidinput_configure_usage()
1388 * - HID is using *_MISC+N as a default value, but nothing prevents in hidinput_configure_usage()
1397 while (usage->code <= max && test_and_set_bit(usage->code, bit)) { in hidinput_configure_usage()
1398 if (device->quirks & HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE) { in hidinput_configure_usage()
1399 usage->code = find_next_zero_bit(bit, in hidinput_configure_usage()
1401 usage->code); in hidinput_configure_usage()
1403 device->status |= HID_STAT_DUP_DETECTED; in hidinput_configure_usage()
1408 if (usage->code > max) in hidinput_configure_usage()
1411 if (usage->type == EV_ABS) { in hidinput_configure_usage()
1413 int a = field->logical_minimum; in hidinput_configure_usage()
1414 int b = field->logical_maximum; in hidinput_configure_usage()
1416 if ((device->quirks & HID_QUIRK_BADPAD) && (usage->code == ABS_X || usage->code == ABS_Y)) { in hidinput_configure_usage()
1417 a = field->logical_minimum = 0; in hidinput_configure_usage()
1418 b = field->logical_maximum = 255; in hidinput_configure_usage()
1421 if (field->application == HID_GD_GAMEPAD || field->application == HID_GD_JOYSTICK) in hidinput_configure_usage()
1422 input_set_abs_params(input, usage->code, a, b, (b - a) >> 8, (b - a) >> 4); in hidinput_configure_usage()
1423 else input_set_abs_params(input, usage->code, a, b, 0, 0); in hidinput_configure_usage()
1425 input_abs_set_res(input, usage->code, in hidinput_configure_usage()
1426 hidinput_calc_abs_res(field, usage->code)); in hidinput_configure_usage()
1429 if (usage->code == ABS_MT_POSITION_X && input->hint_events_per_packet == 0) in hidinput_configure_usage()
1433 if (usage->type == EV_ABS && in hidinput_configure_usage()
1434 (usage->hat_min < usage->hat_max || usage->hat_dir)) { in hidinput_configure_usage()
1436 for (i = usage->code; i < usage->code + 2 && i <= max; i++) { in hidinput_configure_usage()
1437 input_set_abs_params(input, i, -1, 1, 0, 0); in hidinput_configure_usage()
1438 set_bit(i, input->absbit); in hidinput_configure_usage()
1440 if (usage->hat_dir && !field->dpad) in hidinput_configure_usage()
1441 field->dpad = usage->code; in hidinput_configure_usage()
1448 if ((usage->type == EV_ABS) && (field->flags & HID_MAIN_ITEM_RELATIVE) && in hidinput_configure_usage()
1449 (usage->code == ABS_VOLUME)) { in hidinput_configure_usage()
1450 set_bit(KEY_VOLUMEUP, input->keybit); in hidinput_configure_usage()
1451 set_bit(KEY_VOLUMEDOWN, input->keybit); in hidinput_configure_usage()
1454 if (usage->type == EV_KEY) { in hidinput_configure_usage()
1455 set_bit(EV_MSC, input->evbit); in hidinput_configure_usage()
1456 set_bit(MSC_SCAN, input->mscbit); in hidinput_configure_usage()
1462 usage->type = 0; in hidinput_configure_usage()
1463 usage->code = 0; in hidinput_configure_usage()
1476 if (usage->code == REL_WHEEL_HI_RES) in hidinput_handle_scroll()
1482 * Windows reports one wheel click as value 120. Where a high-res in hidinput_handle_scroll()
1487 hi_res = value * 120/usage->resolution_multiplier; in hidinput_handle_scroll()
1489 usage->wheel_accumulated += hi_res; in hidinput_handle_scroll()
1490 lo_res = usage->wheel_accumulated/120; in hidinput_handle_scroll()
1492 usage->wheel_accumulated -= lo_res * 120; in hidinput_handle_scroll()
1495 input_event(input, EV_REL, usage->code, hi_res); in hidinput_handle_scroll()
1502 if (!test_bit(tool, input->key)) in hid_report_release_tool()
1513 report->tool = 0; in hid_report_release_tool()
1519 if (report->tool != new_tool) in hid_report_set_tool()
1520 hid_report_release_tool(report, input, report->tool); in hid_report_set_tool()
1523 report->tool = new_tool; in hid_report_set_tool()
1529 struct hid_report *report = field->report; in hidinput_hid_event()
1530 unsigned *quirks = &hid->quirks; in hidinput_hid_event()
1532 if (!usage->type) in hidinput_hid_event()
1535 if (usage->type == EV_PWR) { in hidinput_hid_event()
1536 hidinput_update_battery(hid, usage->hid, value); in hidinput_hid_event()
1540 if (!field->hidinput) in hidinput_hid_event()
1543 input = field->hidinput->input; in hidinput_hid_event()
1545 if (usage->hat_min < usage->hat_max || usage->hat_dir) { in hidinput_hid_event()
1546 int hat_dir = usage->hat_dir; in hidinput_hid_event()
1548 hat_dir = (value - usage->hat_min) * 8 / (usage->hat_max - usage->hat_min + 1) + 1; in hidinput_hid_event()
1550 input_event(input, usage->type, usage->code , hid_hat_to_axis[hat_dir].x); in hidinput_hid_event()
1551 input_event(input, usage->type, usage->code + 1, hid_hat_to_axis[hat_dir].y); in hidinput_hid_event()
1556 * Ignore out-of-range values as per HID specification, in hidinput_hid_event()
1560 * https://msdn.microsoft.com/en-us/library/windows/hardware/dn672278(v=vs.85).asp in hidinput_hid_event()
1566 if ((field->flags & HID_MAIN_ITEM_VARIABLE) && in hidinput_hid_event()
1567 field->logical_minimum < field->logical_maximum) { in hidinput_hid_event()
1568 if (field->flags & HID_MAIN_ITEM_NULL_STATE && in hidinput_hid_event()
1569 (value < field->logical_minimum || in hidinput_hid_event()
1570 value > field->logical_maximum)) { in hidinput_hid_event()
1571 dbg_hid("Ignoring out-of-range value %x\n", value); in hidinput_hid_event()
1575 field->logical_minimum, in hidinput_hid_event()
1576 field->logical_maximum); in hidinput_hid_event()
1579 switch (usage->hid) { in hidinput_hid_event()
1581 report->tool_active |= !!value; in hidinput_hid_event()
1589 else if (report->tool != BTN_TOOL_RUBBER) in hidinput_hid_event()
1593 !test_bit(BTN_TOUCH, input->key)) { in hidinput_hid_event()
1602 /* let hid-input set BTN_TOUCH */ in hidinput_hid_event()
1606 report->tool_active |= !!value; in hidinput_hid_event()
1613 else if (!report->tool_active) in hidinput_hid_event()
1621 report->tool_active |= !!value; in hidinput_hid_event()
1623 if (report->tool_active) { in hidinput_hid_event()
1628 if (!report->tool) in hidinput_hid_event()
1629 report->tool = usage->code; in hidinput_hid_event()
1632 hid_report_set_tool(report, input, report->tool); in hidinput_hid_event()
1634 hid_report_release_tool(report, input, usage->code); in hidinput_hid_event()
1638 report->tool_active = false; in hidinput_hid_event()
1644 report->tool_active |= !!value; in hidinput_hid_event()
1647 if (report->tool == BTN_TOOL_RUBBER) in hidinput_hid_event()
1654 int a = field->logical_minimum; in hidinput_hid_event()
1655 int b = field->logical_maximum; in hidinput_hid_event()
1657 if (value > a + ((b - a) >> 3)) { in hidinput_hid_event()
1659 report->tool_active = true; in hidinput_hid_event()
1665 dbg_hid("Maximum Effects - %d\n",value); in hidinput_hid_event()
1673 switch (usage->type) { in hidinput_hid_event()
1675 if (usage->code == 0) /* Key 0 is "unassigned", not KEY_UNKNOWN */ in hidinput_hid_event()
1680 if (usage->code == REL_WHEEL_HI_RES || in hidinput_hid_event()
1681 usage->code == REL_HWHEEL_HI_RES) { in hidinput_hid_event()
1688 if ((field->flags & HID_MAIN_ITEM_RELATIVE) && in hidinput_hid_event()
1689 usage->code == ABS_VOLUME) { in hidinput_hid_event()
1702 } else if (((*quirks & HID_QUIRK_X_INVERT) && usage->code == ABS_X) || in hidinput_hid_event()
1703 ((*quirks & HID_QUIRK_Y_INVERT) && usage->code == ABS_Y)) in hidinput_hid_event()
1704 value = field->logical_maximum - value; in hidinput_hid_event()
1718 if (!(field->flags & (HID_MAIN_ITEM_RELATIVE | in hidinput_hid_event()
1720 (field->flags & HID_MAIN_ITEM_VARIABLE) && in hidinput_hid_event()
1721 usage->usage_index < field->maxusage && in hidinput_hid_event()
1722 value == field->value[usage->usage_index]) in hidinput_hid_event()
1726 if (usage->type == EV_KEY && in hidinput_hid_event()
1727 (!test_bit(usage->code, input->key)) == value) in hidinput_hid_event()
1728 input_event(input, EV_MSC, MSC_SCAN, usage->hid); in hidinput_hid_event()
1730 input_event(input, usage->type, usage->code, value); in hidinput_hid_event()
1732 if ((field->flags & HID_MAIN_ITEM_RELATIVE) && in hidinput_hid_event()
1733 usage->type == EV_KEY && value) { in hidinput_hid_event()
1735 input_event(input, usage->type, usage->code, 0); in hidinput_hid_event()
1743 if (hid->quirks & HID_QUIRK_NO_INPUT_SYNC) in hidinput_report_event()
1746 list_for_each_entry(hidinput, &hid->inputs, list) in hidinput_report_event()
1747 input_sync(hidinput->input); in hidinput_report_event()
1757 list_for_each_entry(report, &hid->report_enum[HID_OUTPUT_REPORT].report_list, list) { in hidinput_find_field()
1758 for (i = 0; i < report->maxfield; i++) { in hidinput_find_field()
1759 *field = report->field[i]; in hidinput_find_field()
1760 for (j = 0; j < (*field)->maxusage; j++) in hidinput_find_field()
1761 if ((*field)->usage[j].type == type && (*field)->usage[j].code == code) in hidinput_find_field()
1765 return -1; in hidinput_find_field()
1775 &hid->report_enum[HID_OUTPUT_REPORT].report_list, in hidinput_get_led_field()
1777 for (i = 0; i < report->maxfield; i++) { in hidinput_get_led_field()
1778 field = report->field[i]; in hidinput_get_led_field()
1779 for (j = 0; j < field->maxusage; j++) in hidinput_get_led_field()
1780 if (field->usage[j].type == EV_LED) in hidinput_get_led_field()
1796 &hid->report_enum[HID_OUTPUT_REPORT].report_list, in hidinput_count_leds()
1798 for (i = 0; i < report->maxfield; i++) { in hidinput_count_leds()
1799 field = report->field[i]; in hidinput_count_leds()
1800 for (j = 0; j < field->maxusage; j++) in hidinput_count_leds()
1801 if (field->usage[j].type == EV_LED && in hidinput_count_leds()
1802 field->value[j]) in hidinput_count_leds()
1825 * field->report is accessed unlocked regarding HID core. So there might in hidinput_led_worker()
1826 * be another incoming SET-LED request from user-space, which changes in hidinput_led_worker()
1833 * for every SET-LED request so the following worker will send the in hidinput_led_worker()
1837 report = field->report; in hidinput_led_worker()
1840 if (hid->ll_driver->request) in hidinput_led_worker()
1841 return hid->ll_driver->request(hid, report, HID_REQ_SET_REPORT); in hidinput_led_worker()
1843 /* fall back to generic raw-output-report */ in hidinput_led_worker()
1852 if (ret == -ENOSYS) in hidinput_led_worker()
1853 hid_hw_raw_request(hid, report->id, buf, len, HID_OUTPUT_REPORT, in hidinput_led_worker()
1869 return -1; in hidinput_input_event()
1871 if ((offset = hidinput_find_field(hid, type, code, &field)) == -1) { in hidinput_input_event()
1873 return -1; in hidinput_input_event()
1878 schedule_work(&hid->led_work); in hidinput_input_event()
1904 if (report->maxfield == 0) in __hidinput_change_resolution_multipliers()
1907 for (i = 0; i < report->maxfield; i++) { in __hidinput_change_resolution_multipliers()
1909 report->field[i]->logical_maximum : in __hidinput_change_resolution_multipliers()
1910 report->field[i]->logical_minimum; in __hidinput_change_resolution_multipliers()
1912 /* There is no good reason for a Resolution in __hidinput_change_resolution_multipliers()
1916 if (report->field[i]->report_count != 1) in __hidinput_change_resolution_multipliers()
1919 for (j = 0; j < report->field[i]->maxusage; j++) { in __hidinput_change_resolution_multipliers()
1920 usage = &report->field[i]->usage[j]; in __hidinput_change_resolution_multipliers()
1922 if (usage->hid != HID_GD_RESOLUTION_MULTIPLIER) in __hidinput_change_resolution_multipliers()
1927 * report we need to fill in the bits from the in __hidinput_change_resolution_multipliers()
1929 * Resolution Multiplier. in __hidinput_change_resolution_multipliers()
1935 if (!get_report_completed && report->maxfield > 1) { in __hidinput_change_resolution_multipliers()
1936 if (hid->quirks & HID_QUIRK_NO_INIT_REPORTS) in __hidinput_change_resolution_multipliers()
1944 report->field[i]->value[j] = value; in __hidinput_change_resolution_multipliers()
1958 rep_enum = &hid->report_enum[HID_FEATURE_REPORT]; in hidinput_change_resolution_multipliers()
1959 list_for_each_entry(rep, &rep_enum->report_list, list) { in hidinput_change_resolution_multipliers()
1979 struct hid_driver *drv = hid->driver; in report_features()
1985 rep_enum = &hid->report_enum[HID_FEATURE_REPORT]; in report_features()
1986 list_for_each_entry(rep, &rep_enum->report_list, list) in report_features()
1987 for (i = 0; i < rep->maxfield; i++) { in report_features()
1989 if (rep->field[i]->report_count < 1) in report_features()
1992 for (j = 0; j < rep->field[i]->maxusage; j++) { in report_features()
1993 usage = &rep->field[i]->usage[j]; in report_features()
1996 if (usage->hid == HID_DC_BATTERYSTRENGTH) in report_features()
1998 rep->field[i], false); in report_features()
2000 if (drv->feature_mapping) in report_features()
2001 drv->feature_mapping(hid, rep->field[i], usage); in report_features()
2017 if ((hid->quirks & HID_QUIRK_INPUT_PER_APP) && in hidinput_allocate()
2018 hid->maxapplication > 1) { in hidinput_allocate()
2032 * DG_PEN -> "Stylus" in hidinput_allocate()
2033 * DG_STYLUS -> "Pen" in hidinput_allocate()
2066 name_len = strlen(hid->name); in hidinput_allocate()
2069 strcmp(hid->name + name_len - suffix_len, suffix)) { in hidinput_allocate()
2070 hidinput->name = kasprintf(GFP_KERNEL, "%s %s", in hidinput_allocate()
2071 hid->name, suffix); in hidinput_allocate()
2072 if (!hidinput->name) in hidinput_allocate()
2078 input_dev->event = hidinput_input_event; in hidinput_allocate()
2079 input_dev->open = hidinput_open; in hidinput_allocate()
2080 input_dev->close = hidinput_close; in hidinput_allocate()
2081 input_dev->setkeycode = hidinput_setkeycode; in hidinput_allocate()
2082 input_dev->getkeycode = hidinput_getkeycode; in hidinput_allocate()
2084 input_dev->name = hidinput->name ? hidinput->name : hid->name; in hidinput_allocate()
2085 input_dev->phys = hid->phys; in hidinput_allocate()
2086 input_dev->uniq = hid->uniq; in hidinput_allocate()
2087 input_dev->id.bustype = hid->bus; in hidinput_allocate()
2088 input_dev->id.vendor = hid->vendor; in hidinput_allocate()
2089 input_dev->id.product = hid->product; in hidinput_allocate()
2090 input_dev->id.version = hid->version; in hidinput_allocate()
2091 input_dev->dev.parent = &hid->dev; in hidinput_allocate()
2093 hidinput->input = input_dev; in hidinput_allocate()
2094 hidinput->application = application; in hidinput_allocate()
2095 list_add_tail(&hidinput->list, &hid->inputs); in hidinput_allocate()
2097 INIT_LIST_HEAD(&hidinput->reports); in hidinput_allocate()
2114 r |= hidinput->input->evbit[i]; in hidinput_has_been_populated()
2117 r |= hidinput->input->keybit[i]; in hidinput_has_been_populated()
2120 r |= hidinput->input->relbit[i]; in hidinput_has_been_populated()
2123 r |= hidinput->input->absbit[i]; in hidinput_has_been_populated()
2126 r |= hidinput->input->mscbit[i]; in hidinput_has_been_populated()
2129 r |= hidinput->input->ledbit[i]; in hidinput_has_been_populated()
2132 r |= hidinput->input->sndbit[i]; in hidinput_has_been_populated()
2135 r |= hidinput->input->ffbit[i]; in hidinput_has_been_populated()
2138 r |= hidinput->input->swbit[i]; in hidinput_has_been_populated()
2149 list_del(&hidinput->list); in hidinput_cleanup_hidinput()
2150 input_free_device(hidinput->input); in hidinput_cleanup_hidinput()
2151 kfree(hidinput->name); in hidinput_cleanup_hidinput()
2155 hid->quirks & HID_QUIRK_SKIP_OUTPUT_REPORTS) in hidinput_cleanup_hidinput()
2158 list_for_each_entry(report, &hid->report_enum[k].report_list, in hidinput_cleanup_hidinput()
2161 for (i = 0; i < report->maxfield; i++) in hidinput_cleanup_hidinput()
2162 if (report->field[i]->hidinput == hidinput) in hidinput_cleanup_hidinput()
2163 report->field[i]->hidinput = NULL; in hidinput_cleanup_hidinput()
2172 struct hid_device *hid = report->device; in hidinput_match()
2175 list_for_each_entry(hidinput, &hid->inputs, list) { in hidinput_match()
2176 if (hidinput->report && in hidinput_match()
2177 hidinput->report->id == report->id) in hidinput_match()
2186 struct hid_device *hid = report->device; in hidinput_match_application()
2189 list_for_each_entry(hidinput, &hid->inputs, list) { in hidinput_match_application()
2190 if (hidinput->application == report->application) in hidinput_match_application()
2197 if ((report->application == HID_GD_SYSTEM_CONTROL || in hidinput_match_application()
2198 report->application == HID_CP_CONSUMER_CONTROL) && in hidinput_match_application()
2199 hidinput->application == HID_GD_KEYBOARD) { in hidinput_match_application()
2212 int slot_collection_index = -1; in hidinput_configure_usages()
2213 int prev_collection_index = -1; in hidinput_configure_usages()
2221 for (i = 0; i < report->maxfield; i++) { in hidinput_configure_usages()
2222 field = report->field[i]; in hidinput_configure_usages()
2225 if (field->maxusage < 1) in hidinput_configure_usages()
2231 if (prev_collection_index != field->usage->collection_index) { in hidinput_configure_usages()
2232 prev_collection_index = field->usage->collection_index; in hidinput_configure_usages()
2240 if (slot_collection_index == field->usage->collection_index) { in hidinput_configure_usages()
2241 field->slot_idx = slot_idx; in hidinput_configure_usages()
2246 for (j = 0; j < field->maxusage; j++) { in hidinput_configure_usages()
2247 if (field->usage[j].hid == HID_DG_CONTACTID) { in hidinput_configure_usages()
2248 slot_collection_index = field->usage->collection_index; in hidinput_configure_usages()
2256 report->field[k]->slot_idx = slot_idx; in hidinput_configure_usages()
2262 for (i = 0; i < report->maxfield; i++) in hidinput_configure_usages()
2263 for (j = 0; j < report->field[i]->maxusage; j++) in hidinput_configure_usages()
2264 hidinput_configure_usage(hidinput, report->field[i], in hidinput_configure_usages()
2265 report->field[i]->usage + j, in hidinput_configure_usages()
2277 struct hid_driver *drv = hid->driver; in hidinput_connect()
2283 INIT_LIST_HEAD(&hid->inputs); in hidinput_connect()
2284 INIT_WORK(&hid->led_work, hidinput_led_worker); in hidinput_connect()
2286 hid->status &= ~HID_STAT_DUP_DETECTED; in hidinput_connect()
2289 for (i = 0; i < hid->maxcollection; i++) { in hidinput_connect()
2290 struct hid_collection *col = &hid->collection[i]; in hidinput_connect()
2291 if (col->type == HID_COLLECTION_APPLICATION || in hidinput_connect()
2292 col->type == HID_COLLECTION_PHYSICAL) in hidinput_connect()
2293 if (IS_INPUT_APPLICATION(col->usage)) in hidinput_connect()
2297 if (i == hid->maxcollection) in hidinput_connect()
2298 return -1; in hidinput_connect()
2305 hid->quirks & HID_QUIRK_SKIP_OUTPUT_REPORTS) in hidinput_connect()
2308 list_for_each_entry(report, &hid->report_enum[k].report_list, list) { in hidinput_connect()
2310 if (!report->maxfield) in hidinput_connect()
2313 application = report->application; in hidinput_connect()
2319 if (hid->quirks & HID_QUIRK_MULTI_INPUT) in hidinput_connect()
2321 else if (hid->maxapplication > 1 && in hidinput_connect()
2322 (hid->quirks & HID_QUIRK_INPUT_PER_APP)) in hidinput_connect()
2333 if (hid->quirks & HID_QUIRK_MULTI_INPUT) in hidinput_connect()
2334 hidinput->report = report; in hidinput_connect()
2336 list_add_tail(&report->hidinput_list, in hidinput_connect()
2337 &hidinput->reports); in hidinput_connect()
2343 list_for_each_entry_safe(hidinput, next, &hid->inputs, list) { in hidinput_connect()
2344 if (drv->input_configured && in hidinput_connect()
2345 drv->input_configured(hid, hidinput)) in hidinput_connect()
2354 if (input_register_device(hidinput->input)) in hidinput_connect()
2356 hidinput->registered = true; in hidinput_connect()
2359 if (list_empty(&hid->inputs)) { in hidinput_connect()
2364 if (hid->status & HID_STAT_DUP_DETECTED) in hidinput_connect()
2374 return -1; in hidinput_connect()
2384 list_for_each_entry_safe(hidinput, next, &hid->inputs, list) { in hidinput_disconnect()
2385 list_del(&hidinput->list); in hidinput_disconnect()
2386 if (hidinput->registered) in hidinput_disconnect()
2387 input_unregister_device(hidinput->input); in hidinput_disconnect()
2389 input_free_device(hidinput->input); in hidinput_disconnect()
2390 kfree(hidinput->name); in hidinput_disconnect()
2398 cancel_work_sync(&hid->led_work); in hidinput_disconnect()
2403 #include "hid-input-test.c"