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 | ||