aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hid')
-rw-r--r--drivers/hid/Kconfig18
-rw-r--r--drivers/hid/hid-core.c18
-rw-r--r--drivers/hid/hid-input.c29
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
7config HID 7config 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
17endmenu 25endmenu
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
50static unsigned int hid_mousepoll_interval;
51module_param_named(mousepoll, hid_mousepoll_interval, uint, 0644);
52MODULE_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