diff options
Diffstat (limited to 'drivers/hid')
| -rw-r--r-- | drivers/hid/Kconfig | 18 | ||||
| -rw-r--r-- | drivers/hid/hid-core.c | 18 | ||||
| -rw-r--r-- | drivers/hid/hid-input.c | 29 |
3 files changed, 41 insertions, 24 deletions
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 96d4a0bb2203..ec796ad087df 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig | |||
| @@ -6,13 +6,21 @@ menu "HID Devices" | |||
| 6 | 6 | ||
| 7 | config HID | 7 | config HID |
| 8 | tristate "Generic HID support" | 8 | tristate "Generic HID support" |
| 9 | depends on INPUT | ||
| 9 | default y | 10 | default y |
| 10 | ---help--- | 11 | ---help--- |
| 11 | Say Y here if you want generic HID support to connect keyboards, | 12 | A human interface device (HID) is a type of computer device that |
| 12 | mice, joysticks, graphic tablets, or any other HID based devices | 13 | interacts directly with and takes input from humans. The term "HID" |
| 13 | to your computer. You also need to select particular types of | 14 | most commonly used to refer to the USB-HID specification, but other |
| 14 | HID devices you want to compile support for, in the particular | 15 | devices (such as, but not strictly limited to, Bluetooth) are |
| 15 | driver menu (USB, Bluetooth) | 16 | designed using HID specification (this involves certain keyboards, |
| 17 | mice, tablets, etc). This option compiles into kernel the generic | ||
| 18 | HID layer code (parser, usages, etc.), which can then be used by | ||
| 19 | transport-specific HID implementation (like USB or Bluetooth). | ||
| 20 | |||
| 21 | For docs and specs, see http://www.usb.org/developers/hidpage/ | ||
| 22 | |||
| 23 | If unsure, say Y | ||
| 16 | 24 | ||
| 17 | endmenu | 25 | endmenu |
| 18 | 26 | ||
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 18c2b3cf6bcc..b8cf50fcd64d 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
| @@ -40,18 +40,10 @@ | |||
| 40 | 40 | ||
| 41 | #define DRIVER_VERSION "v2.6" | 41 | #define DRIVER_VERSION "v2.6" |
| 42 | #define DRIVER_AUTHOR "Andreas Gal, Vojtech Pavlik" | 42 | #define DRIVER_AUTHOR "Andreas Gal, Vojtech Pavlik" |
| 43 | #define DRIVER_DESC "USB HID core driver" | 43 | #define DRIVER_DESC "HID core driver" |
| 44 | #define DRIVER_LICENSE "GPL" | 44 | #define DRIVER_LICENSE "GPL" |
| 45 | 45 | ||
| 46 | /* | 46 | /* |
| 47 | * Module parameters. | ||
| 48 | */ | ||
| 49 | |||
| 50 | static unsigned int hid_mousepoll_interval; | ||
| 51 | module_param_named(mousepoll, hid_mousepoll_interval, uint, 0644); | ||
| 52 | MODULE_PARM_DESC(mousepoll, "Polling interval of mice"); | ||
| 53 | |||
| 54 | /* | ||
| 55 | * Register a new report for a device. | 47 | * Register a new report for a device. |
| 56 | */ | 48 | */ |
| 57 | 49 | ||
| @@ -656,7 +648,7 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size) | |||
| 656 | for (i = 0; i < HID_REPORT_TYPES; i++) | 648 | for (i = 0; i < HID_REPORT_TYPES; i++) |
| 657 | INIT_LIST_HEAD(&device->report_enum[i].report_list); | 649 | INIT_LIST_HEAD(&device->report_enum[i].report_list); |
| 658 | 650 | ||
| 659 | if (!(device->rdesc = (__u8 *)kmalloc(size, GFP_KERNEL))) { | 651 | if (!(device->rdesc = kmalloc(size, GFP_KERNEL))) { |
| 660 | kfree(device->collection); | 652 | kfree(device->collection); |
| 661 | kfree(device); | 653 | kfree(device); |
| 662 | return NULL; | 654 | return NULL; |
| @@ -888,6 +880,10 @@ static void hid_output_field(struct hid_field *field, __u8 *data) | |||
| 888 | unsigned size = field->report_size; | 880 | unsigned size = field->report_size; |
| 889 | unsigned n; | 881 | unsigned n; |
| 890 | 882 | ||
| 883 | /* make sure the unused bits in the last byte are zeros */ | ||
| 884 | if (count > 0 && size > 0) | ||
| 885 | data[(count*size-1)/8] = 0; | ||
| 886 | |||
| 891 | for (n = 0; n < count; n++) { | 887 | for (n = 0; n < count; n++) { |
| 892 | if (field->logical_minimum < 0) /* signed values */ | 888 | if (field->logical_minimum < 0) /* signed values */ |
| 893 | implement(data, offset + n * size, size, s32ton(field->value[n], size)); | 889 | implement(data, offset + n * size, size, s32ton(field->value[n], size)); |
| @@ -955,7 +951,7 @@ int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int i | |||
| 955 | } | 951 | } |
| 956 | 952 | ||
| 957 | #ifdef DEBUG_DATA | 953 | #ifdef DEBUG_DATA |
| 958 | printk(KERN_DEBUG __FILE__ ": report (size %u) (%snumbered)\n", len, report_enum->numbered ? "" : "un"); | 954 | printk(KERN_DEBUG __FILE__ ": report (size %u) (%snumbered)\n", size, report_enum->numbered ? "" : "un"); |
| 959 | #endif | 955 | #endif |
| 960 | 956 | ||
| 961 | n = 0; /* Normally report number is 0 */ | 957 | n = 0; /* Normally report number is 0 */ |
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index 998638020ea0..9cf591a1bda3 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c | |||
| @@ -30,7 +30,6 @@ | |||
| 30 | #include <linux/module.h> | 30 | #include <linux/module.h> |
| 31 | #include <linux/slab.h> | 31 | #include <linux/slab.h> |
| 32 | #include <linux/kernel.h> | 32 | #include <linux/kernel.h> |
| 33 | #include <linux/usb/input.h> | ||
| 34 | 33 | ||
| 35 | #undef DEBUG | 34 | #undef DEBUG |
| 36 | 35 | ||
| @@ -68,6 +67,7 @@ static const struct { | |||
| 68 | #define map_led(c) do { usage->code = c; usage->type = EV_LED; bit = input->ledbit; max = LED_MAX; } while (0) | 67 | #define map_led(c) do { usage->code = c; usage->type = EV_LED; bit = input->ledbit; max = LED_MAX; } while (0) |
| 69 | 68 | ||
| 70 | #define map_abs_clear(c) do { map_abs(c); clear_bit(c, bit); } while (0) | 69 | #define map_abs_clear(c) do { map_abs(c); clear_bit(c, bit); } while (0) |
| 70 | #define map_rel_clear(c) do { map_rel(c); clear_bit(c, bit); } while (0) | ||
| 71 | #define map_key_clear(c) do { map_key(c); clear_bit(c, bit); } while (0) | 71 | #define map_key_clear(c) do { map_key(c); clear_bit(c, bit); } while (0) |
| 72 | 72 | ||
| 73 | #ifdef CONFIG_USB_HIDINPUT_POWERBOOK | 73 | #ifdef CONFIG_USB_HIDINPUT_POWERBOOK |
| @@ -292,7 +292,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel | |||
| 292 | } | 292 | } |
| 293 | } | 293 | } |
| 294 | 294 | ||
| 295 | map_key(code); | 295 | map_key_clear(code); |
| 296 | break; | 296 | break; |
| 297 | 297 | ||
| 298 | 298 | ||
| @@ -343,9 +343,9 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel | |||
| 343 | case HID_GD_RX: case HID_GD_RY: case HID_GD_RZ: | 343 | case HID_GD_RX: case HID_GD_RY: case HID_GD_RZ: |
| 344 | case HID_GD_SLIDER: case HID_GD_DIAL: case HID_GD_WHEEL: | 344 | case HID_GD_SLIDER: case HID_GD_DIAL: case HID_GD_WHEEL: |
| 345 | if (field->flags & HID_MAIN_ITEM_RELATIVE) | 345 | if (field->flags & HID_MAIN_ITEM_RELATIVE) |
| 346 | map_rel(usage->hid & 0xf); | 346 | map_rel_clear(usage->hid & 0xf); |
| 347 | else | 347 | else |
| 348 | map_abs(usage->hid & 0xf); | 348 | map_abs_clear(usage->hid & 0xf); |
| 349 | break; | 349 | break; |
| 350 | 350 | ||
| 351 | case HID_GD_HATSWITCH: | 351 | case HID_GD_HATSWITCH: |
| @@ -363,9 +363,22 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel | |||
| 363 | break; | 363 | break; |
| 364 | 364 | ||
| 365 | case HID_UP_LED: | 365 | case HID_UP_LED: |
| 366 | if (((usage->hid - 1) & 0xffff) >= LED_MAX) | 366 | |
| 367 | goto ignore; | 367 | switch (usage->hid & 0xffff) { /* HID-Value: */ |
| 368 | map_led((usage->hid - 1) & 0xffff); | 368 | case 0x01: map_led (LED_NUML); break; /* "Num Lock" */ |
| 369 | case 0x02: map_led (LED_CAPSL); break; /* "Caps Lock" */ | ||
| 370 | case 0x03: map_led (LED_SCROLLL); break; /* "Scroll Lock" */ | ||
| 371 | case 0x04: map_led (LED_COMPOSE); break; /* "Compose" */ | ||
| 372 | case 0x05: map_led (LED_KANA); break; /* "Kana" */ | ||
| 373 | case 0x27: map_led (LED_SLEEP); break; /* "Stand-By" */ | ||
| 374 | case 0x4c: map_led (LED_SUSPEND); break; /* "System Suspend" */ | ||
| 375 | case 0x09: map_led (LED_MUTE); break; /* "Mute" */ | ||
| 376 | case 0x4b: map_led (LED_MISC); break; /* "Generic Indicator" */ | ||
| 377 | case 0x19: map_led (LED_MAIL); break; /* "Message Waiting" */ | ||
| 378 | case 0x4d: map_led (LED_CHARGING); break; /* "External Power Connected" */ | ||
| 379 | |||
| 380 | default: goto ignore; | ||
| 381 | } | ||
| 369 | break; | 382 | break; |
| 370 | 383 | ||
| 371 | case HID_UP_DIGITIZER: | 384 | case HID_UP_DIGITIZER: |
| @@ -500,7 +513,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel | |||
| 500 | case 0x22f: map_key_clear(KEY_ZOOMRESET); break; | 513 | case 0x22f: map_key_clear(KEY_ZOOMRESET); break; |
| 501 | case 0x233: map_key_clear(KEY_SCROLLUP); break; | 514 | case 0x233: map_key_clear(KEY_SCROLLUP); break; |
| 502 | case 0x234: map_key_clear(KEY_SCROLLDOWN); break; | 515 | case 0x234: map_key_clear(KEY_SCROLLDOWN); break; |
| 503 | case 0x238: map_rel(REL_HWHEEL); break; | 516 | case 0x238: map_rel_clear(REL_HWHEEL); break; |
| 504 | case 0x25f: map_key_clear(KEY_CANCEL); break; | 517 | case 0x25f: map_key_clear(KEY_CANCEL); break; |
| 505 | case 0x279: map_key_clear(KEY_REDO); break; | 518 | case 0x279: map_key_clear(KEY_REDO); break; |
| 506 | 519 | ||
