aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/input/hid-core.c1039
-rw-r--r--drivers/usb/input/hid-debug.h757
-rw-r--r--drivers/usb/input/hid-ff.c2
-rw-r--r--drivers/usb/input/hid-input.c844
-rw-r--r--drivers/usb/input/hid-lgff.c2
-rw-r--r--drivers/usb/input/hid-pidff.c4
-rw-r--r--drivers/usb/input/hid-tmff.c2
-rw-r--r--drivers/usb/input/hid-zpff.c2
-rw-r--r--drivers/usb/input/hid.h540
-rw-r--r--drivers/usb/input/hiddev.c3
10 files changed, 106 insertions, 3089 deletions
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c
index 0811c39bd14f..06e169b6a17e 100644
--- a/drivers/usb/input/hid-core.c
+++ b/drivers/usb/input/hid-core.c
@@ -4,6 +4,7 @@
4 * Copyright (c) 1999 Andreas Gal 4 * Copyright (c) 1999 Andreas Gal
5 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz> 5 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
6 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc 6 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
7 * Copyright (c) 2006 Jiri Kosina
7 */ 8 */
8 9
9/* 10/*
@@ -32,7 +33,7 @@
32 33
33#include <linux/usb.h> 34#include <linux/usb.h>
34 35
35#include "hid.h" 36#include <linux/hid.h>
36#include <linux/hiddev.h> 37#include <linux/hiddev.h>
37 38
38/* 39/*
@@ -55,887 +56,6 @@ module_param_named(mousepoll, hid_mousepoll_interval, uint, 0644);
55MODULE_PARM_DESC(mousepoll, "Polling interval of mice"); 56MODULE_PARM_DESC(mousepoll, "Polling interval of mice");
56 57
57/* 58/*
58 * Register a new report for a device.
59 */
60
61static struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id)
62{
63 struct hid_report_enum *report_enum = device->report_enum + type;
64 struct hid_report *report;
65
66 if (report_enum->report_id_hash[id])
67 return report_enum->report_id_hash[id];
68
69 if (!(report = kzalloc(sizeof(struct hid_report), GFP_KERNEL)))
70 return NULL;
71
72 if (id != 0)
73 report_enum->numbered = 1;
74
75 report->id = id;
76 report->type = type;
77 report->size = 0;
78 report->device = device;
79 report_enum->report_id_hash[id] = report;
80
81 list_add_tail(&report->list, &report_enum->report_list);
82
83 return report;
84}
85
86/*
87 * Register a new field for this report.
88 */
89
90static struct hid_field *hid_register_field(struct hid_report *report, unsigned usages, unsigned values)
91{
92 struct hid_field *field;
93
94 if (report->maxfield == HID_MAX_FIELDS) {
95 dbg("too many fields in report");
96 return NULL;
97 }
98
99 if (!(field = kzalloc(sizeof(struct hid_field) + usages * sizeof(struct hid_usage)
100 + values * sizeof(unsigned), GFP_KERNEL))) return NULL;
101
102 field->index = report->maxfield++;
103 report->field[field->index] = field;
104 field->usage = (struct hid_usage *)(field + 1);
105 field->value = (unsigned *)(field->usage + usages);
106 field->report = report;
107
108 return field;
109}
110
111/*
112 * Open a collection. The type/usage is pushed on the stack.
113 */
114
115static int open_collection(struct hid_parser *parser, unsigned type)
116{
117 struct hid_collection *collection;
118 unsigned usage;
119
120 usage = parser->local.usage[0];
121
122 if (parser->collection_stack_ptr == HID_COLLECTION_STACK_SIZE) {
123 dbg("collection stack overflow");
124 return -1;
125 }
126
127 if (parser->device->maxcollection == parser->device->collection_size) {
128 collection = kmalloc(sizeof(struct hid_collection) *
129 parser->device->collection_size * 2, GFP_KERNEL);
130 if (collection == NULL) {
131 dbg("failed to reallocate collection array");
132 return -1;
133 }
134 memcpy(collection, parser->device->collection,
135 sizeof(struct hid_collection) *
136 parser->device->collection_size);
137 memset(collection + parser->device->collection_size, 0,
138 sizeof(struct hid_collection) *
139 parser->device->collection_size);
140 kfree(parser->device->collection);
141 parser->device->collection = collection;
142 parser->device->collection_size *= 2;
143 }
144
145 parser->collection_stack[parser->collection_stack_ptr++] =
146 parser->device->maxcollection;
147
148 collection = parser->device->collection +
149 parser->device->maxcollection++;
150 collection->type = type;
151 collection->usage = usage;
152 collection->level = parser->collection_stack_ptr - 1;
153
154 if (type == HID_COLLECTION_APPLICATION)
155 parser->device->maxapplication++;
156
157 return 0;
158}
159
160/*
161 * Close a collection.
162 */
163
164static int close_collection(struct hid_parser *parser)
165{
166 if (!parser->collection_stack_ptr) {
167 dbg("collection stack underflow");
168 return -1;
169 }
170 parser->collection_stack_ptr--;
171 return 0;
172}
173
174/*
175 * Climb up the stack, search for the specified collection type
176 * and return the usage.
177 */
178
179static unsigned hid_lookup_collection(struct hid_parser *parser, unsigned type)
180{
181 int n;
182 for (n = parser->collection_stack_ptr - 1; n >= 0; n--)
183 if (parser->device->collection[parser->collection_stack[n]].type == type)
184 return parser->device->collection[parser->collection_stack[n]].usage;
185 return 0; /* we know nothing about this usage type */
186}
187
188/*
189 * Add a usage to the temporary parser table.
190 */
191
192static int hid_add_usage(struct hid_parser *parser, unsigned usage)
193{
194 if (parser->local.usage_index >= HID_MAX_USAGES) {
195 dbg("usage index exceeded");
196 return -1;
197 }
198 parser->local.usage[parser->local.usage_index] = usage;
199 parser->local.collection_index[parser->local.usage_index] =
200 parser->collection_stack_ptr ?
201 parser->collection_stack[parser->collection_stack_ptr - 1] : 0;
202 parser->local.usage_index++;
203 return 0;
204}
205
206/*
207 * Register a new field for this report.
208 */
209
210static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsigned flags)
211{
212 struct hid_report *report;
213 struct hid_field *field;
214 int usages;
215 unsigned offset;
216 int i;
217
218 if (!(report = hid_register_report(parser->device, report_type, parser->global.report_id))) {
219 dbg("hid_register_report failed");
220 return -1;
221 }
222
223 if (parser->global.logical_maximum < parser->global.logical_minimum) {
224 dbg("logical range invalid %d %d", parser->global.logical_minimum, parser->global.logical_maximum);
225 return -1;
226 }
227
228 offset = report->size;
229 report->size += parser->global.report_size * parser->global.report_count;
230
231 if (!parser->local.usage_index) /* Ignore padding fields */
232 return 0;
233
234 usages = max_t(int, parser->local.usage_index, parser->global.report_count);
235
236 if ((field = hid_register_field(report, usages, parser->global.report_count)) == NULL)
237 return 0;
238
239 field->physical = hid_lookup_collection(parser, HID_COLLECTION_PHYSICAL);
240 field->logical = hid_lookup_collection(parser, HID_COLLECTION_LOGICAL);
241 field->application = hid_lookup_collection(parser, HID_COLLECTION_APPLICATION);
242
243 for (i = 0; i < usages; i++) {
244 int j = i;
245 /* Duplicate the last usage we parsed if we have excess values */
246 if (i >= parser->local.usage_index)
247 j = parser->local.usage_index - 1;
248 field->usage[i].hid = parser->local.usage[j];
249 field->usage[i].collection_index =
250 parser->local.collection_index[j];
251 }
252
253 field->maxusage = usages;
254 field->flags = flags;
255 field->report_offset = offset;
256 field->report_type = report_type;
257 field->report_size = parser->global.report_size;
258 field->report_count = parser->global.report_count;
259 field->logical_minimum = parser->global.logical_minimum;
260 field->logical_maximum = parser->global.logical_maximum;
261 field->physical_minimum = parser->global.physical_minimum;
262 field->physical_maximum = parser->global.physical_maximum;
263 field->unit_exponent = parser->global.unit_exponent;
264 field->unit = parser->global.unit;
265
266 return 0;
267}
268
269/*
270 * Read data value from item.
271 */
272
273static u32 item_udata(struct hid_item *item)
274{
275 switch (item->size) {
276 case 1: return item->data.u8;
277 case 2: return item->data.u16;
278 case 4: return item->data.u32;
279 }
280 return 0;
281}
282
283static s32 item_sdata(struct hid_item *item)
284{
285 switch (item->size) {
286 case 1: return item->data.s8;
287 case 2: return item->data.s16;
288 case 4: return item->data.s32;
289 }
290 return 0;
291}
292
293/*
294 * Process a global item.
295 */
296
297static int hid_parser_global(struct hid_parser *parser, struct hid_item *item)
298{
299 switch (item->tag) {
300
301 case HID_GLOBAL_ITEM_TAG_PUSH:
302
303 if (parser->global_stack_ptr == HID_GLOBAL_STACK_SIZE) {
304 dbg("global enviroment stack overflow");
305 return -1;
306 }
307
308 memcpy(parser->global_stack + parser->global_stack_ptr++,
309 &parser->global, sizeof(struct hid_global));
310 return 0;
311
312 case HID_GLOBAL_ITEM_TAG_POP:
313
314 if (!parser->global_stack_ptr) {
315 dbg("global enviroment stack underflow");
316 return -1;
317 }
318
319 memcpy(&parser->global, parser->global_stack + --parser->global_stack_ptr,
320 sizeof(struct hid_global));
321 return 0;
322
323 case HID_GLOBAL_ITEM_TAG_USAGE_PAGE:
324 parser->global.usage_page = item_udata(item);
325 return 0;
326
327 case HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM:
328 parser->global.logical_minimum = item_sdata(item);
329 return 0;
330
331 case HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM:
332 if (parser->global.logical_minimum < 0)
333 parser->global.logical_maximum = item_sdata(item);
334 else
335 parser->global.logical_maximum = item_udata(item);
336 return 0;
337
338 case HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM:
339 parser->global.physical_minimum = item_sdata(item);
340 return 0;
341
342 case HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM:
343 if (parser->global.physical_minimum < 0)
344 parser->global.physical_maximum = item_sdata(item);
345 else
346 parser->global.physical_maximum = item_udata(item);
347 return 0;
348
349 case HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT:
350 parser->global.unit_exponent = item_sdata(item);
351 return 0;
352
353 case HID_GLOBAL_ITEM_TAG_UNIT:
354 parser->global.unit = item_udata(item);
355 return 0;
356
357 case HID_GLOBAL_ITEM_TAG_REPORT_SIZE:
358 if ((parser->global.report_size = item_udata(item)) > 32) {
359 dbg("invalid report_size %d", parser->global.report_size);
360 return -1;
361 }
362 return 0;
363
364 case HID_GLOBAL_ITEM_TAG_REPORT_COUNT:
365 if ((parser->global.report_count = item_udata(item)) > HID_MAX_USAGES) {
366 dbg("invalid report_count %d", parser->global.report_count);
367 return -1;
368 }
369 return 0;
370
371 case HID_GLOBAL_ITEM_TAG_REPORT_ID:
372 if ((parser->global.report_id = item_udata(item)) == 0) {
373 dbg("report_id 0 is invalid");
374 return -1;
375 }
376 return 0;
377
378 default:
379 dbg("unknown global tag 0x%x", item->tag);
380 return -1;
381 }
382}
383
384/*
385 * Process a local item.
386 */
387
388static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
389{
390 __u32 data;
391 unsigned n;
392
393 if (item->size == 0) {
394 dbg("item data expected for local item");
395 return -1;
396 }
397
398 data = item_udata(item);
399
400 switch (item->tag) {
401
402 case HID_LOCAL_ITEM_TAG_DELIMITER:
403
404 if (data) {
405 /*
406 * We treat items before the first delimiter
407 * as global to all usage sets (branch 0).
408 * In the moment we process only these global
409 * items and the first delimiter set.
410 */
411 if (parser->local.delimiter_depth != 0) {
412 dbg("nested delimiters");
413 return -1;
414 }
415 parser->local.delimiter_depth++;
416 parser->local.delimiter_branch++;
417 } else {
418 if (parser->local.delimiter_depth < 1) {
419 dbg("bogus close delimiter");
420 return -1;
421 }
422 parser->local.delimiter_depth--;
423 }
424 return 1;
425
426 case HID_LOCAL_ITEM_TAG_USAGE:
427
428 if (parser->local.delimiter_branch > 1) {
429 dbg("alternative usage ignored");
430 return 0;
431 }
432
433 if (item->size <= 2)
434 data = (parser->global.usage_page << 16) + data;
435
436 return hid_add_usage(parser, data);
437
438 case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:
439
440 if (parser->local.delimiter_branch > 1) {
441 dbg("alternative usage ignored");
442 return 0;
443 }
444
445 if (item->size <= 2)
446 data = (parser->global.usage_page << 16) + data;
447
448 parser->local.usage_minimum = data;
449 return 0;
450
451 case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM:
452
453 if (parser->local.delimiter_branch > 1) {
454 dbg("alternative usage ignored");
455 return 0;
456 }
457
458 if (item->size <= 2)
459 data = (parser->global.usage_page << 16) + data;
460
461 for (n = parser->local.usage_minimum; n <= data; n++)
462 if (hid_add_usage(parser, n)) {
463 dbg("hid_add_usage failed\n");
464 return -1;
465 }
466 return 0;
467
468 default:
469
470 dbg("unknown local item tag 0x%x", item->tag);
471 return 0;
472 }
473 return 0;
474}
475
476/*
477 * Process a main item.
478 */
479
480static int hid_parser_main(struct hid_parser *parser, struct hid_item *item)
481{
482 __u32 data;
483 int ret;
484
485 data = item_udata(item);
486
487 switch (item->tag) {
488 case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION:
489 ret = open_collection(parser, data & 0xff);
490 break;
491 case HID_MAIN_ITEM_TAG_END_COLLECTION:
492 ret = close_collection(parser);
493 break;
494 case HID_MAIN_ITEM_TAG_INPUT:
495 ret = hid_add_field(parser, HID_INPUT_REPORT, data);
496 break;
497 case HID_MAIN_ITEM_TAG_OUTPUT:
498 ret = hid_add_field(parser, HID_OUTPUT_REPORT, data);
499 break;
500 case HID_MAIN_ITEM_TAG_FEATURE:
501 ret = hid_add_field(parser, HID_FEATURE_REPORT, data);
502 break;
503 default:
504 dbg("unknown main item tag 0x%x", item->tag);
505 ret = 0;
506 }
507
508 memset(&parser->local, 0, sizeof(parser->local)); /* Reset the local parser environment */
509
510 return ret;
511}
512
513/*
514 * Process a reserved item.
515 */
516
517static int hid_parser_reserved(struct hid_parser *parser, struct hid_item *item)
518{
519 dbg("reserved item type, tag 0x%x", item->tag);
520 return 0;
521}
522
523/*
524 * Free a report and all registered fields. The field->usage and
525 * field->value table's are allocated behind the field, so we need
526 * only to free(field) itself.
527 */
528
529static void hid_free_report(struct hid_report *report)
530{
531 unsigned n;
532
533 for (n = 0; n < report->maxfield; n++)
534 kfree(report->field[n]);
535 kfree(report);
536}
537
538/*
539 * Free a device structure, all reports, and all fields.
540 */
541
542static void hid_free_device(struct hid_device *device)
543{
544 unsigned i,j;
545
546 for (i = 0; i < HID_REPORT_TYPES; i++) {
547 struct hid_report_enum *report_enum = device->report_enum + i;
548
549 for (j = 0; j < 256; j++) {
550 struct hid_report *report = report_enum->report_id_hash[j];
551 if (report)
552 hid_free_report(report);
553 }
554 }
555
556 kfree(device->rdesc);
557 kfree(device);
558}
559
560/*
561 * Fetch a report description item from the data stream. We support long
562 * items, though they are not used yet.
563 */
564
565static u8 *fetch_item(__u8 *start, __u8 *end, struct hid_item *item)
566{
567 u8 b;
568
569 if ((end - start) <= 0)
570 return NULL;
571
572 b = *start++;
573
574 item->type = (b >> 2) & 3;
575 item->tag = (b >> 4) & 15;
576
577 if (item->tag == HID_ITEM_TAG_LONG) {
578
579 item->format = HID_ITEM_FORMAT_LONG;
580
581 if ((end - start) < 2)
582 return NULL;
583
584 item->size = *start++;
585 item->tag = *start++;
586
587 if ((end - start) < item->size)
588 return NULL;
589
590 item->data.longdata = start;
591 start += item->size;
592 return start;
593 }
594
595 item->format = HID_ITEM_FORMAT_SHORT;
596 item->size = b & 3;
597
598 switch (item->size) {
599
600 case 0:
601 return start;
602
603 case 1:
604 if ((end - start) < 1)
605 return NULL;
606 item->data.u8 = *start++;
607 return start;
608
609 case 2:
610 if ((end - start) < 2)
611 return NULL;
612 item->data.u16 = le16_to_cpu(get_unaligned((__le16*)start));
613 start = (__u8 *)((__le16 *)start + 1);
614 return start;
615
616 case 3:
617 item->size++;
618 if ((end - start) < 4)
619 return NULL;
620 item->data.u32 = le32_to_cpu(get_unaligned((__le32*)start));
621 start = (__u8 *)((__le32 *)start + 1);
622 return start;
623 }
624
625 return NULL;
626}
627
628/*
629 * Parse a report description into a hid_device structure. Reports are
630 * enumerated, fields are attached to these reports.
631 */
632
633static struct hid_device *hid_parse_report(__u8 *start, unsigned size)
634{
635 struct hid_device *device;
636 struct hid_parser *parser;
637 struct hid_item item;
638 __u8 *end;
639 unsigned i;
640 static int (*dispatch_type[])(struct hid_parser *parser,
641 struct hid_item *item) = {
642 hid_parser_main,
643 hid_parser_global,
644 hid_parser_local,
645 hid_parser_reserved
646 };
647
648 if (!(device = kzalloc(sizeof(struct hid_device), GFP_KERNEL)))
649 return NULL;
650
651 if (!(device->collection = kzalloc(sizeof(struct hid_collection) *
652 HID_DEFAULT_NUM_COLLECTIONS, GFP_KERNEL))) {
653 kfree(device);
654 return NULL;
655 }
656 device->collection_size = HID_DEFAULT_NUM_COLLECTIONS;
657
658 for (i = 0; i < HID_REPORT_TYPES; i++)
659 INIT_LIST_HEAD(&device->report_enum[i].report_list);
660
661 if (!(device->rdesc = (__u8 *)kmalloc(size, GFP_KERNEL))) {
662 kfree(device->collection);
663 kfree(device);
664 return NULL;
665 }
666 memcpy(device->rdesc, start, size);
667 device->rsize = size;
668
669 if (!(parser = kzalloc(sizeof(struct hid_parser), GFP_KERNEL))) {
670 kfree(device->rdesc);
671 kfree(device->collection);
672 kfree(device);
673 return NULL;
674 }
675 parser->device = device;
676
677 end = start + size;
678 while ((start = fetch_item(start, end, &item)) != NULL) {
679
680 if (item.format != HID_ITEM_FORMAT_SHORT) {
681 dbg("unexpected long global item");
682 kfree(device->collection);
683 hid_free_device(device);
684 kfree(parser);
685 return NULL;
686 }
687
688 if (dispatch_type[item.type](parser, &item)) {
689 dbg("item %u %u %u %u parsing failed\n",
690 item.format, (unsigned)item.size, (unsigned)item.type, (unsigned)item.tag);
691 kfree(device->collection);
692 hid_free_device(device);
693 kfree(parser);
694 return NULL;
695 }
696
697 if (start == end) {
698 if (parser->collection_stack_ptr) {
699 dbg("unbalanced collection at end of report description");
700 kfree(device->collection);
701 hid_free_device(device);
702 kfree(parser);
703 return NULL;
704 }
705 if (parser->local.delimiter_depth) {
706 dbg("unbalanced delimiter at end of report description");
707 kfree(device->collection);
708 hid_free_device(device);
709 kfree(parser);
710 return NULL;
711 }
712 kfree(parser);
713 return device;
714 }
715 }
716
717 dbg("item fetching failed at offset %d\n", (int)(end - start));
718 kfree(device->collection);
719 hid_free_device(device);
720 kfree(parser);
721 return NULL;
722}
723
724/*
725 * Convert a signed n-bit integer to signed 32-bit integer. Common
726 * cases are done through the compiler, the screwed things has to be
727 * done by hand.
728 */
729
730static s32 snto32(__u32 value, unsigned n)
731{
732 switch (n) {
733 case 8: return ((__s8)value);
734 case 16: return ((__s16)value);
735 case 32: return ((__s32)value);
736 }
737 return value & (1 << (n - 1)) ? value | (-1 << n) : value;
738}
739
740/*
741 * Convert a signed 32-bit integer to a signed n-bit integer.
742 */
743
744static u32 s32ton(__s32 value, unsigned n)
745{
746 s32 a = value >> (n - 1);
747 if (a && a != -1)
748 return value < 0 ? 1 << (n - 1) : (1 << (n - 1)) - 1;
749 return value & ((1 << n) - 1);
750}
751
752/*
753 * Extract/implement a data field from/to a little endian report (bit array).
754 *
755 * Code sort-of follows HID spec:
756 * http://www.usb.org/developers/devclass_docs/HID1_11.pdf
757 *
758 * While the USB HID spec allows unlimited length bit fields in "report
759 * descriptors", most devices never use more than 16 bits.
760 * One model of UPS is claimed to report "LINEV" as a 32-bit field.
761 * Search linux-kernel and linux-usb-devel archives for "hid-core extract".
762 */
763
764static __inline__ __u32 extract(__u8 *report, unsigned offset, unsigned n)
765{
766 u64 x;
767
768 WARN_ON(n > 32);
769
770 report += offset >> 3; /* adjust byte index */
771 offset &= 7; /* now only need bit offset into one byte */
772 x = get_unaligned((u64 *) report);
773 x = le64_to_cpu(x);
774 x = (x >> offset) & ((1ULL << n) - 1); /* extract bit field */
775 return (u32) x;
776}
777
778/*
779 * "implement" : set bits in a little endian bit stream.
780 * Same concepts as "extract" (see comments above).
781 * The data mangled in the bit stream remains in little endian
782 * order the whole time. It make more sense to talk about
783 * endianness of register values by considering a register
784 * a "cached" copy of the little endiad bit stream.
785 */
786static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u32 value)
787{
788 u64 x;
789 u64 m = (1ULL << n) - 1;
790
791 WARN_ON(n > 32);
792
793 WARN_ON(value > m);
794 value &= m;
795
796 report += offset >> 3;
797 offset &= 7;
798
799 x = get_unaligned((u64 *)report);
800 x &= cpu_to_le64(~(m << offset));
801 x |= cpu_to_le64(((u64) value) << offset);
802 put_unaligned(x, (u64 *) report);
803}
804
805/*
806 * Search an array for a value.
807 */
808
809static __inline__ int search(__s32 *array, __s32 value, unsigned n)
810{
811 while (n--) {
812 if (*array++ == value)
813 return 0;
814 }
815 return -1;
816}
817
818static void hid_process_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value, int interrupt)
819{
820 hid_dump_input(usage, value);
821 if (hid->claimed & HID_CLAIMED_INPUT)
822 hidinput_hid_event(hid, field, usage, value);
823 if (hid->claimed & HID_CLAIMED_HIDDEV && interrupt)
824 hiddev_hid_event(hid, field, usage, value);
825}
826
827/*
828 * Analyse a received field, and fetch the data from it. The field
829 * content is stored for next report processing (we do differential
830 * reporting to the layer).
831 */
832
833static void hid_input_field(struct hid_device *hid, struct hid_field *field, __u8 *data, int interrupt)
834{
835 unsigned n;
836 unsigned count = field->report_count;
837 unsigned offset = field->report_offset;
838 unsigned size = field->report_size;
839 __s32 min = field->logical_minimum;
840 __s32 max = field->logical_maximum;
841 __s32 *value;
842
843 if (!(value = kmalloc(sizeof(__s32) * count, GFP_ATOMIC)))
844 return;
845
846 for (n = 0; n < count; n++) {
847
848 value[n] = min < 0 ? snto32(extract(data, offset + n * size, size), size) :
849 extract(data, offset + n * size, size);
850
851 if (!(field->flags & HID_MAIN_ITEM_VARIABLE) /* Ignore report if ErrorRollOver */
852 && value[n] >= min && value[n] <= max
853 && field->usage[value[n] - min].hid == HID_UP_KEYBOARD + 1)
854 goto exit;
855 }
856
857 for (n = 0; n < count; n++) {
858
859 if (HID_MAIN_ITEM_VARIABLE & field->flags) {
860 hid_process_event(hid, field, &field->usage[n], value[n], interrupt);
861 continue;
862 }
863
864 if (field->value[n] >= min && field->value[n] <= max
865 && field->usage[field->value[n] - min].hid
866 && search(value, field->value[n], count))
867 hid_process_event(hid, field, &field->usage[field->value[n] - min], 0, interrupt);
868
869 if (value[n] >= min && value[n] <= max
870 && field->usage[value[n] - min].hid
871 && search(field->value, value[n], count))
872 hid_process_event(hid, field, &field->usage[value[n] - min], 1, interrupt);
873 }
874
875 memcpy(field->value, value, count * sizeof(__s32));
876exit:
877 kfree(value);
878}
879
880static int hid_input_report(int type, struct urb *urb, int interrupt)
881{
882 struct hid_device *hid = urb->context;
883 struct hid_report_enum *report_enum = hid->report_enum + type;
884 u8 *data = urb->transfer_buffer;
885 int len = urb->actual_length;
886 struct hid_report *report;
887 int n, size;
888
889 if (!len) {
890 dbg("empty report");
891 return -1;
892 }
893
894#ifdef DEBUG_DATA
895 printk(KERN_DEBUG __FILE__ ": report (size %u) (%snumbered)\n", len, report_enum->numbered ? "" : "un");
896#endif
897
898 n = 0; /* Normally report number is 0 */
899 if (report_enum->numbered) { /* Device uses numbered reports, data[0] is report number */
900 n = *data++;
901 len--;
902 }
903
904#ifdef DEBUG_DATA
905 {
906 int i;
907 printk(KERN_DEBUG __FILE__ ": report %d (size %u) = ", n, len);
908 for (i = 0; i < len; i++)
909 printk(" %02x", data[i]);
910 printk("\n");
911 }
912#endif
913
914 if (!(report = report_enum->report_id_hash[n])) {
915 dbg("undefined report_id %d received", n);
916 return -1;
917 }
918
919 size = ((report->size - 1) >> 3) + 1;
920
921 if (len < size) {
922 dbg("report %d is too short, (%d < %d)", report->id, len, size);
923 memset(data + len, 0, size - len);
924 }
925
926 if (hid->claimed & HID_CLAIMED_HIDDEV)
927 hiddev_report_event(hid, report);
928
929 for (n = 0; n < report->maxfield; n++)
930 hid_input_field(hid, report->field[n], data, interrupt);
931
932 if (hid->claimed & HID_CLAIMED_INPUT)
933 hidinput_report_event(hid, report);
934
935 return 0;
936}
937
938/*
939 * Input submission and I/O error handler. 59 * Input submission and I/O error handler.
940 */ 60 */
941 61
@@ -1044,6 +164,65 @@ done:
1044 spin_unlock_irqrestore(&hid->inlock, flags); 164 spin_unlock_irqrestore(&hid->inlock, flags);
1045} 165}
1046 166
167
168static int hid_input_report(int type, struct urb *urb, int interrupt)
169{
170 struct hid_device *hid = urb->context;
171 struct hid_report_enum *report_enum = hid->report_enum + type;
172 u8 *data = urb->transfer_buffer;
173 int len = urb->actual_length;
174 struct hid_report *report;
175 int n, size;
176
177 if (!len) {
178 dbg("empty report");
179 return -1;
180 }
181
182#ifdef DEBUG_DATA
183 printk(KERN_DEBUG __FILE__ ": report (size %u) (%snumbered)\n", len, report_enum->numbered ? "" : "un");
184#endif
185
186 n = 0; /* Normally report number is 0 */
187 if (report_enum->numbered) { /* Device uses numbered reports, data[0] is report number */
188 n = *data++;
189 len--;
190 }
191
192#ifdef DEBUG_DATA
193 {
194 int i;
195 printk(KERN_DEBUG __FILE__ ": report %d (size %u) = ", n, len);
196 for (i = 0; i < len; i++)
197 printk(" %02x", data[i]);
198 printk("\n");
199 }
200#endif
201
202 if (!(report = report_enum->report_id_hash[n])) {
203 dbg("undefined report_id %d received", n);
204 return -1;
205 }
206
207 size = ((report->size - 1) >> 3) + 1;
208
209 if (len < size) {
210 dbg("report %d is too short, (%d < %d)", report->id, len, size);
211 memset(data + len, 0, size - len);
212 }
213
214 if (hid->claimed & HID_CLAIMED_HIDDEV)
215 hiddev_report_event(hid, report);
216
217 for (n = 0; n < report->maxfield; n++)
218 hid_input_field(hid, report->field[n], data, interrupt);
219
220 if (hid->claimed & HID_CLAIMED_INPUT)
221 hidinput_report_event(hid, report);
222
223 return 0;
224}
225
1047/* 226/*
1048 * Input interrupt completion handler. 227 * Input interrupt completion handler.
1049 */ 228 */
@@ -1093,67 +272,6 @@ static void hid_irq_in(struct urb *urb)
1093} 272}
1094 273
1095/* 274/*
1096 * Output the field into the report.
1097 */
1098
1099static void hid_output_field(struct hid_field *field, __u8 *data)
1100{
1101 unsigned count = field->report_count;
1102 unsigned offset = field->report_offset;
1103 unsigned size = field->report_size;
1104 unsigned n;
1105
1106 for (n = 0; n < count; n++) {
1107 if (field->logical_minimum < 0) /* signed values */
1108 implement(data, offset + n * size, size, s32ton(field->value[n], size));
1109 else /* unsigned values */
1110 implement(data, offset + n * size, size, field->value[n]);
1111 }
1112}
1113
1114/*
1115 * Create a report.
1116 */
1117
1118static void hid_output_report(struct hid_report *report, __u8 *data)
1119{
1120 unsigned n;
1121
1122 if (report->id > 0)
1123 *data++ = report->id;
1124
1125 for (n = 0; n < report->maxfield; n++)
1126 hid_output_field(report->field[n], data);
1127}
1128
1129/*
1130 * Set a field value. The report this field belongs to has to be
1131 * created and transferred to the device, to set this value in the
1132 * device.
1133 */
1134
1135int hid_set_field(struct hid_field *field, unsigned offset, __s32 value)
1136{
1137 unsigned size = field->report_size;
1138
1139 hid_dump_input(field->usage + offset, value);
1140
1141 if (offset >= field->report_count) {
1142 dbg("offset (%d) exceeds report_count (%d)", offset, field->report_count);
1143 hid_dump_field(field, 8);
1144 return -1;
1145 }
1146 if (field->logical_minimum < 0) {
1147 if (value != snto32(s32ton(value, size), size)) {
1148 dbg("value %d is out of range", value);
1149 return -1;
1150 }
1151 }
1152 field->value[offset] = value;
1153 return 0;
1154}
1155
1156/*
1157 * Find a report field with a specified HID usage. 275 * Find a report field with a specified HID usage.
1158 */ 276 */
1159#if 0 277#if 0
@@ -1379,6 +497,29 @@ void hid_submit_report(struct hid_device *hid, struct hid_report *report, unsign
1379 spin_unlock_irqrestore(&hid->ctrllock, flags); 497 spin_unlock_irqrestore(&hid->ctrllock, flags);
1380} 498}
1381 499
500static int hidinput_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
501{
502 struct hid_device *hid = dev->private;
503 struct hid_field *field;
504 int offset;
505
506 if (type == EV_FF)
507 return input_ff_event(dev, type, code, value);
508
509 if (type != EV_LED)
510 return -1;
511
512 if ((offset = hidinput_find_field(hid, type, code, &field)) == -1) {
513 warn("event field not found");
514 return -1;
515 }
516
517 hid_set_field(field, offset, value);
518 hid_submit_report(hid, field->report, USB_DIR_OUT);
519
520 return 0;
521}
522
1382int hid_wait_io(struct hid_device *hid) 523int hid_wait_io(struct hid_device *hid)
1383{ 524{
1384 if (!wait_event_timeout(hid->wait, (!test_bit(HID_CTRL_RUNNING, &hid->iofl) && 525 if (!wait_event_timeout(hid->wait, (!test_bit(HID_CTRL_RUNNING, &hid->iofl) &&
@@ -1428,6 +569,18 @@ void hid_close(struct hid_device *hid)
1428 usb_kill_urb(hid->urbin); 569 usb_kill_urb(hid->urbin);
1429} 570}
1430 571
572static int hidinput_open(struct input_dev *dev)
573{
574 struct hid_device *hid = dev->private;
575 return hid_open(hid);
576}
577
578static void hidinput_close(struct input_dev *dev)
579{
580 struct hid_device *hid = dev->private;
581 hid_close(hid);
582}
583
1431#define USB_VENDOR_ID_PANJIT 0x134c 584#define USB_VENDOR_ID_PANJIT 0x134c
1432 585
1433#define USB_VENDOR_ID_TURBOX 0x062a 586#define USB_VENDOR_ID_TURBOX 0x062a
diff --git a/drivers/usb/input/hid-debug.h b/drivers/usb/input/hid-debug.h
deleted file mode 100644
index f04d6d75c098..000000000000
--- a/drivers/usb/input/hid-debug.h
+++ /dev/null
@@ -1,757 +0,0 @@
1/*
2 * $Id: hid-debug.h,v 1.8 2001/09/25 09:37:57 vojtech Exp $
3 *
4 * (c) 1999 Andreas Gal <gal@cs.uni-magdeburg.de>
5 * (c) 2000-2001 Vojtech Pavlik <vojtech@ucw.cz>
6 *
7 * Some debug stuff for the HID parser.
8 */
9
10/*
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 *
25 * Should you need to contact me, the author, you can do so either by
26 * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
27 * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
28 */
29
30#include <linux/input.h>
31
32struct hid_usage_entry {
33 unsigned page;
34 unsigned usage;
35 char *description;
36};
37
38static const struct hid_usage_entry hid_usage_table[] = {
39 { 0, 0, "Undefined" },
40 { 1, 0, "GenericDesktop" },
41 {0, 0x01, "Pointer"},
42 {0, 0x02, "Mouse"},
43 {0, 0x04, "Joystick"},
44 {0, 0x05, "GamePad"},
45 {0, 0x06, "Keyboard"},
46 {0, 0x07, "Keypad"},
47 {0, 0x08, "MultiAxis"},
48 {0, 0x30, "X"},
49 {0, 0x31, "Y"},
50 {0, 0x32, "Z"},
51 {0, 0x33, "Rx"},
52 {0, 0x34, "Ry"},
53 {0, 0x35, "Rz"},
54 {0, 0x36, "Slider"},
55 {0, 0x37, "Dial"},
56 {0, 0x38, "Wheel"},
57 {0, 0x39, "HatSwitch"},
58 {0, 0x3a, "CountedBuffer"},
59 {0, 0x3b, "ByteCount"},
60 {0, 0x3c, "MotionWakeup"},
61 {0, 0x3d, "Start"},
62 {0, 0x3e, "Select"},
63 {0, 0x40, "Vx"},
64 {0, 0x41, "Vy"},
65 {0, 0x42, "Vz"},
66 {0, 0x43, "Vbrx"},
67 {0, 0x44, "Vbry"},
68 {0, 0x45, "Vbrz"},
69 {0, 0x46, "Vno"},
70 {0, 0x80, "SystemControl"},
71 {0, 0x81, "SystemPowerDown"},
72 {0, 0x82, "SystemSleep"},
73 {0, 0x83, "SystemWakeUp"},
74 {0, 0x84, "SystemContextMenu"},
75 {0, 0x85, "SystemMainMenu"},
76 {0, 0x86, "SystemAppMenu"},
77 {0, 0x87, "SystemMenuHelp"},
78 {0, 0x88, "SystemMenuExit"},
79 {0, 0x89, "SystemMenuSelect"},
80 {0, 0x8a, "SystemMenuRight"},
81 {0, 0x8b, "SystemMenuLeft"},
82 {0, 0x8c, "SystemMenuUp"},
83 {0, 0x8d, "SystemMenuDown"},
84 {0, 0x90, "D-PadUp"},
85 {0, 0x91, "D-PadDown"},
86 {0, 0x92, "D-PadRight"},
87 {0, 0x93, "D-PadLeft"},
88 { 2, 0, "Simulation" },
89 {0, 0xb0, "Aileron"},
90 {0, 0xb1, "AileronTrim"},
91 {0, 0xb2, "Anti-Torque"},
92 {0, 0xb3, "Autopilot"},
93 {0, 0xb4, "Chaff"},
94 {0, 0xb5, "Collective"},
95 {0, 0xb6, "DiveBrake"},
96 {0, 0xb7, "ElectronicCountermeasures"},
97 {0, 0xb8, "Elevator"},
98 {0, 0xb9, "ElevatorTrim"},
99 {0, 0xba, "Rudder"},
100 {0, 0xbb, "Throttle"},
101 {0, 0xbc, "FlightCommunications"},
102 {0, 0xbd, "FlareRelease"},
103 {0, 0xbe, "LandingGear"},
104 {0, 0xbf, "ToeBrake"},
105 { 7, 0, "Keyboard" },
106 { 8, 0, "LED" },
107 {0, 0x01, "NumLock"},
108 {0, 0x02, "CapsLock"},
109 {0, 0x03, "ScrollLock"},
110 {0, 0x04, "Compose"},
111 {0, 0x05, "Kana"},
112 {0, 0x4b, "GenericIndicator"},
113 { 9, 0, "Button" },
114 { 10, 0, "Ordinal" },
115 { 12, 0, "Consumer" },
116 {0, 0x238, "HorizontalWheel"},
117 { 13, 0, "Digitizers" },
118 {0, 0x01, "Digitizer"},
119 {0, 0x02, "Pen"},
120 {0, 0x03, "LightPen"},
121 {0, 0x04, "TouchScreen"},
122 {0, 0x05, "TouchPad"},
123 {0, 0x20, "Stylus"},
124 {0, 0x21, "Puck"},
125 {0, 0x22, "Finger"},
126 {0, 0x30, "TipPressure"},
127 {0, 0x31, "BarrelPressure"},
128 {0, 0x32, "InRange"},
129 {0, 0x33, "Touch"},
130 {0, 0x34, "UnTouch"},
131 {0, 0x35, "Tap"},
132 {0, 0x39, "TabletFunctionKey"},
133 {0, 0x3a, "ProgramChangeKey"},
134 {0, 0x3c, "Invert"},
135 {0, 0x42, "TipSwitch"},
136 {0, 0x43, "SecondaryTipSwitch"},
137 {0, 0x44, "BarrelSwitch"},
138 {0, 0x45, "Eraser"},
139 {0, 0x46, "TabletPick"},
140 { 15, 0, "PhysicalInterfaceDevice" },
141 {0, 0x00, "Undefined"},
142 {0, 0x01, "Physical_Interface_Device"},
143 {0, 0x20, "Normal"},
144 {0, 0x21, "Set_Effect_Report"},
145 {0, 0x22, "Effect_Block_Index"},
146 {0, 0x23, "Parameter_Block_Offset"},
147 {0, 0x24, "ROM_Flag"},
148 {0, 0x25, "Effect_Type"},
149 {0, 0x26, "ET_Constant_Force"},
150 {0, 0x27, "ET_Ramp"},
151 {0, 0x28, "ET_Custom_Force_Data"},
152 {0, 0x30, "ET_Square"},
153 {0, 0x31, "ET_Sine"},
154 {0, 0x32, "ET_Triangle"},
155 {0, 0x33, "ET_Sawtooth_Up"},
156 {0, 0x34, "ET_Sawtooth_Down"},
157 {0, 0x40, "ET_Spring"},
158 {0, 0x41, "ET_Damper"},
159 {0, 0x42, "ET_Inertia"},
160 {0, 0x43, "ET_Friction"},
161 {0, 0x50, "Duration"},
162 {0, 0x51, "Sample_Period"},
163 {0, 0x52, "Gain"},
164 {0, 0x53, "Trigger_Button"},
165 {0, 0x54, "Trigger_Repeat_Interval"},
166 {0, 0x55, "Axes_Enable"},
167 {0, 0x56, "Direction_Enable"},
168 {0, 0x57, "Direction"},
169 {0, 0x58, "Type_Specific_Block_Offset"},
170 {0, 0x59, "Block_Type"},
171 {0, 0x5A, "Set_Envelope_Report"},
172 {0, 0x5B, "Attack_Level"},
173 {0, 0x5C, "Attack_Time"},
174 {0, 0x5D, "Fade_Level"},
175 {0, 0x5E, "Fade_Time"},
176 {0, 0x5F, "Set_Condition_Report"},
177 {0, 0x60, "CP_Offset"},
178 {0, 0x61, "Positive_Coefficient"},
179 {0, 0x62, "Negative_Coefficient"},
180 {0, 0x63, "Positive_Saturation"},
181 {0, 0x64, "Negative_Saturation"},
182 {0, 0x65, "Dead_Band"},
183 {0, 0x66, "Download_Force_Sample"},
184 {0, 0x67, "Isoch_Custom_Force_Enable"},
185 {0, 0x68, "Custom_Force_Data_Report"},
186 {0, 0x69, "Custom_Force_Data"},
187 {0, 0x6A, "Custom_Force_Vendor_Defined_Data"},
188 {0, 0x6B, "Set_Custom_Force_Report"},
189 {0, 0x6C, "Custom_Force_Data_Offset"},
190 {0, 0x6D, "Sample_Count"},
191 {0, 0x6E, "Set_Periodic_Report"},
192 {0, 0x6F, "Offset"},
193 {0, 0x70, "Magnitude"},
194 {0, 0x71, "Phase"},
195 {0, 0x72, "Period"},
196 {0, 0x73, "Set_Constant_Force_Report"},
197 {0, 0x74, "Set_Ramp_Force_Report"},
198 {0, 0x75, "Ramp_Start"},
199 {0, 0x76, "Ramp_End"},
200 {0, 0x77, "Effect_Operation_Report"},
201 {0, 0x78, "Effect_Operation"},
202 {0, 0x79, "Op_Effect_Start"},
203 {0, 0x7A, "Op_Effect_Start_Solo"},
204 {0, 0x7B, "Op_Effect_Stop"},
205 {0, 0x7C, "Loop_Count"},
206 {0, 0x7D, "Device_Gain_Report"},
207 {0, 0x7E, "Device_Gain"},
208 {0, 0x7F, "PID_Pool_Report"},
209 {0, 0x80, "RAM_Pool_Size"},
210 {0, 0x81, "ROM_Pool_Size"},
211 {0, 0x82, "ROM_Effect_Block_Count"},
212 {0, 0x83, "Simultaneous_Effects_Max"},
213 {0, 0x84, "Pool_Alignment"},
214 {0, 0x85, "PID_Pool_Move_Report"},
215 {0, 0x86, "Move_Source"},
216 {0, 0x87, "Move_Destination"},
217 {0, 0x88, "Move_Length"},
218 {0, 0x89, "PID_Block_Load_Report"},
219 {0, 0x8B, "Block_Load_Status"},
220 {0, 0x8C, "Block_Load_Success"},
221 {0, 0x8D, "Block_Load_Full"},
222 {0, 0x8E, "Block_Load_Error"},
223 {0, 0x8F, "Block_Handle"},
224 {0, 0x90, "PID_Block_Free_Report"},
225 {0, 0x91, "Type_Specific_Block_Handle"},
226 {0, 0x92, "PID_State_Report"},
227 {0, 0x94, "Effect_Playing"},
228 {0, 0x95, "PID_Device_Control_Report"},
229 {0, 0x96, "PID_Device_Control"},
230 {0, 0x97, "DC_Enable_Actuators"},
231 {0, 0x98, "DC_Disable_Actuators"},
232 {0, 0x99, "DC_Stop_All_Effects"},
233 {0, 0x9A, "DC_Device_Reset"},
234 {0, 0x9B, "DC_Device_Pause"},
235 {0, 0x9C, "DC_Device_Continue"},
236 {0, 0x9F, "Device_Paused"},
237 {0, 0xA0, "Actuators_Enabled"},
238 {0, 0xA4, "Safety_Switch"},
239 {0, 0xA5, "Actuator_Override_Switch"},
240 {0, 0xA6, "Actuator_Power"},
241 {0, 0xA7, "Start_Delay"},
242 {0, 0xA8, "Parameter_Block_Size"},
243 {0, 0xA9, "Device_Managed_Pool"},
244 {0, 0xAA, "Shared_Parameter_Blocks"},
245 {0, 0xAB, "Create_New_Effect_Report"},
246 {0, 0xAC, "RAM_Pool_Available"},
247 { 0x84, 0, "Power Device" },
248 { 0x84, 0x02, "PresentStatus" },
249 { 0x84, 0x03, "ChangeStatus" },
250 { 0x84, 0x04, "UPS" },
251 { 0x84, 0x05, "PowerSupply" },
252 { 0x84, 0x10, "BatterySystem" },
253 { 0x84, 0x11, "BatterySystemID" },
254 { 0x84, 0x12, "Battery" },
255 { 0x84, 0x13, "BatteryID" },
256 { 0x84, 0x14, "Charger" },
257 { 0x84, 0x15, "ChargerID" },
258 { 0x84, 0x16, "PowerConverter" },
259 { 0x84, 0x17, "PowerConverterID" },
260 { 0x84, 0x18, "OutletSystem" },
261 { 0x84, 0x19, "OutletSystemID" },
262 { 0x84, 0x1a, "Input" },
263 { 0x84, 0x1b, "InputID" },
264 { 0x84, 0x1c, "Output" },
265 { 0x84, 0x1d, "OutputID" },
266 { 0x84, 0x1e, "Flow" },
267 { 0x84, 0x1f, "FlowID" },
268 { 0x84, 0x20, "Outlet" },
269 { 0x84, 0x21, "OutletID" },
270 { 0x84, 0x22, "Gang" },
271 { 0x84, 0x24, "PowerSummary" },
272 { 0x84, 0x25, "PowerSummaryID" },
273 { 0x84, 0x30, "Voltage" },
274 { 0x84, 0x31, "Current" },
275 { 0x84, 0x32, "Frequency" },
276 { 0x84, 0x33, "ApparentPower" },
277 { 0x84, 0x35, "PercentLoad" },
278 { 0x84, 0x40, "ConfigVoltage" },
279 { 0x84, 0x41, "ConfigCurrent" },
280 { 0x84, 0x43, "ConfigApparentPower" },
281 { 0x84, 0x53, "LowVoltageTransfer" },
282 { 0x84, 0x54, "HighVoltageTransfer" },
283 { 0x84, 0x56, "DelayBeforeStartup" },
284 { 0x84, 0x57, "DelayBeforeShutdown" },
285 { 0x84, 0x58, "Test" },
286 { 0x84, 0x5a, "AudibleAlarmControl" },
287 { 0x84, 0x60, "Present" },
288 { 0x84, 0x61, "Good" },
289 { 0x84, 0x62, "InternalFailure" },
290 { 0x84, 0x65, "Overload" },
291 { 0x84, 0x66, "OverCharged" },
292 { 0x84, 0x67, "OverTemperature" },
293 { 0x84, 0x68, "ShutdownRequested" },
294 { 0x84, 0x69, "ShutdownImminent" },
295 { 0x84, 0x6b, "SwitchOn/Off" },
296 { 0x84, 0x6c, "Switchable" },
297 { 0x84, 0x6d, "Used" },
298 { 0x84, 0x6e, "Boost" },
299 { 0x84, 0x73, "CommunicationLost" },
300 { 0x84, 0xfd, "iManufacturer" },
301 { 0x84, 0xfe, "iProduct" },
302 { 0x84, 0xff, "iSerialNumber" },
303 { 0x85, 0, "Battery System" },
304 { 0x85, 0x01, "SMBBatteryMode" },
305 { 0x85, 0x02, "SMBBatteryStatus" },
306 { 0x85, 0x03, "SMBAlarmWarning" },
307 { 0x85, 0x04, "SMBChargerMode" },
308 { 0x85, 0x05, "SMBChargerStatus" },
309 { 0x85, 0x06, "SMBChargerSpecInfo" },
310 { 0x85, 0x07, "SMBSelectorState" },
311 { 0x85, 0x08, "SMBSelectorPresets" },
312 { 0x85, 0x09, "SMBSelectorInfo" },
313 { 0x85, 0x29, "RemainingCapacityLimit" },
314 { 0x85, 0x2c, "CapacityMode" },
315 { 0x85, 0x42, "BelowRemainingCapacityLimit" },
316 { 0x85, 0x44, "Charging" },
317 { 0x85, 0x45, "Discharging" },
318 { 0x85, 0x4b, "NeedReplacement" },
319 { 0x85, 0x66, "RemainingCapacity" },
320 { 0x85, 0x68, "RunTimeToEmpty" },
321 { 0x85, 0x6a, "AverageTimeToFull" },
322 { 0x85, 0x83, "DesignCapacity" },
323 { 0x85, 0x85, "ManufacturerDate" },
324 { 0x85, 0x89, "iDeviceChemistry" },
325 { 0x85, 0x8b, "Rechargable" },
326 { 0x85, 0x8f, "iOEMInformation" },
327 { 0x85, 0x8d, "CapacityGranularity1" },
328 { 0x85, 0xd0, "ACPresent" },
329 /* pages 0xff00 to 0xffff are vendor-specific */
330 { 0xffff, 0, "Vendor-specific-FF" },
331 { 0, 0, NULL }
332};
333
334static void resolv_usage_page(unsigned page) {
335 const struct hid_usage_entry *p;
336
337 for (p = hid_usage_table; p->description; p++)
338 if (p->page == page) {
339 printk("%s", p->description);
340 return;
341 }
342 printk("%04x", page);
343}
344
345static void resolv_usage(unsigned usage) {
346 const struct hid_usage_entry *p;
347
348 resolv_usage_page(usage >> 16);
349 printk(".");
350 for (p = hid_usage_table; p->description; p++)
351 if (p->page == (usage >> 16)) {
352 for(++p; p->description && p->usage != 0; p++)
353 if (p->usage == (usage & 0xffff)) {
354 printk("%s", p->description);
355 return;
356 }
357 break;
358 }
359 printk("%04x", usage & 0xffff);
360}
361
362__inline__ static void tab(int n) {
363 while (n--) printk(" ");
364}
365
366static void hid_dump_field(struct hid_field *field, int n) {
367 int j;
368
369 if (field->physical) {
370 tab(n);
371 printk("Physical(");
372 resolv_usage(field->physical); printk(")\n");
373 }
374 if (field->logical) {
375 tab(n);
376 printk("Logical(");
377 resolv_usage(field->logical); printk(")\n");
378 }
379 tab(n); printk("Usage(%d)\n", field->maxusage);
380 for (j = 0; j < field->maxusage; j++) {
381 tab(n+2);resolv_usage(field->usage[j].hid); printk("\n");
382 }
383 if (field->logical_minimum != field->logical_maximum) {
384 tab(n); printk("Logical Minimum(%d)\n", field->logical_minimum);
385 tab(n); printk("Logical Maximum(%d)\n", field->logical_maximum);
386 }
387 if (field->physical_minimum != field->physical_maximum) {
388 tab(n); printk("Physical Minimum(%d)\n", field->physical_minimum);
389 tab(n); printk("Physical Maximum(%d)\n", field->physical_maximum);
390 }
391 if (field->unit_exponent) {
392 tab(n); printk("Unit Exponent(%d)\n", field->unit_exponent);
393 }
394 if (field->unit) {
395 char *systems[5] = { "None", "SI Linear", "SI Rotation", "English Linear", "English Rotation" };
396 char *units[5][8] = {
397 { "None", "None", "None", "None", "None", "None", "None", "None" },
398 { "None", "Centimeter", "Gram", "Seconds", "Kelvin", "Ampere", "Candela", "None" },
399 { "None", "Radians", "Gram", "Seconds", "Kelvin", "Ampere", "Candela", "None" },
400 { "None", "Inch", "Slug", "Seconds", "Fahrenheit", "Ampere", "Candela", "None" },
401 { "None", "Degrees", "Slug", "Seconds", "Fahrenheit", "Ampere", "Candela", "None" }
402 };
403
404 int i;
405 int sys;
406 __u32 data = field->unit;
407
408 /* First nibble tells us which system we're in. */
409 sys = data & 0xf;
410 data >>= 4;
411
412 if(sys > 4) {
413 tab(n); printk("Unit(Invalid)\n");
414 }
415 else {
416 int earlier_unit = 0;
417
418 tab(n); printk("Unit(%s : ", systems[sys]);
419
420 for (i=1 ; i<sizeof(__u32)*2 ; i++) {
421 char nibble = data & 0xf;
422 data >>= 4;
423 if (nibble != 0) {
424 if(earlier_unit++ > 0)
425 printk("*");
426 printk("%s", units[sys][i]);
427 if(nibble != 1) {
428 /* This is a _signed_ nibble(!) */
429
430 int val = nibble & 0x7;
431 if(nibble & 0x08)
432 val = -((0x7 & ~val) +1);
433 printk("^%d", val);
434 }
435 }
436 }
437 printk(")\n");
438 }
439 }
440 tab(n); printk("Report Size(%u)\n", field->report_size);
441 tab(n); printk("Report Count(%u)\n", field->report_count);
442 tab(n); printk("Report Offset(%u)\n", field->report_offset);
443
444 tab(n); printk("Flags( ");
445 j = field->flags;
446 printk("%s", HID_MAIN_ITEM_CONSTANT & j ? "Constant " : "");
447 printk("%s", HID_MAIN_ITEM_VARIABLE & j ? "Variable " : "Array ");
448 printk("%s", HID_MAIN_ITEM_RELATIVE & j ? "Relative " : "Absolute ");
449 printk("%s", HID_MAIN_ITEM_WRAP & j ? "Wrap " : "");
450 printk("%s", HID_MAIN_ITEM_NONLINEAR & j ? "NonLinear " : "");
451 printk("%s", HID_MAIN_ITEM_NO_PREFERRED & j ? "NoPrefferedState " : "");
452 printk("%s", HID_MAIN_ITEM_NULL_STATE & j ? "NullState " : "");
453 printk("%s", HID_MAIN_ITEM_VOLATILE & j ? "Volatile " : "");
454 printk("%s", HID_MAIN_ITEM_BUFFERED_BYTE & j ? "BufferedByte " : "");
455 printk(")\n");
456}
457
458static void __attribute__((unused)) hid_dump_device(struct hid_device *device) {
459 struct hid_report_enum *report_enum;
460 struct hid_report *report;
461 struct list_head *list;
462 unsigned i,k;
463 static char *table[] = {"INPUT", "OUTPUT", "FEATURE"};
464
465 for (i = 0; i < HID_REPORT_TYPES; i++) {
466 report_enum = device->report_enum + i;
467 list = report_enum->report_list.next;
468 while (list != &report_enum->report_list) {
469 report = (struct hid_report *) list;
470 tab(2);
471 printk("%s", table[i]);
472 if (report->id)
473 printk("(%d)", report->id);
474 printk("[%s]", table[report->type]);
475 printk("\n");
476 for (k = 0; k < report->maxfield; k++) {
477 tab(4);
478 printk("Field(%d)\n", k);
479 hid_dump_field(report->field[k], 6);
480 }
481 list = list->next;
482 }
483 }
484}
485
486static void __attribute__((unused)) hid_dump_input(struct hid_usage *usage, __s32 value) {
487 printk("hid-debug: input ");
488 resolv_usage(usage->hid);
489 printk(" = %d\n", value);
490}
491
492
493static char *events[EV_MAX + 1] = {
494 [EV_SYN] = "Sync", [EV_KEY] = "Key",
495 [EV_REL] = "Relative", [EV_ABS] = "Absolute",
496 [EV_MSC] = "Misc", [EV_LED] = "LED",
497 [EV_SND] = "Sound", [EV_REP] = "Repeat",
498 [EV_FF] = "ForceFeedback", [EV_PWR] = "Power",
499 [EV_FF_STATUS] = "ForceFeedbackStatus",
500};
501
502static char *syncs[2] = {
503 [SYN_REPORT] = "Report", [SYN_CONFIG] = "Config",
504};
505static char *keys[KEY_MAX + 1] = {
506 [KEY_RESERVED] = "Reserved", [KEY_ESC] = "Esc",
507 [KEY_1] = "1", [KEY_2] = "2",
508 [KEY_3] = "3", [KEY_4] = "4",
509 [KEY_5] = "5", [KEY_6] = "6",
510 [KEY_7] = "7", [KEY_8] = "8",
511 [KEY_9] = "9", [KEY_0] = "0",
512 [KEY_MINUS] = "Minus", [KEY_EQUAL] = "Equal",
513 [KEY_BACKSPACE] = "Backspace", [KEY_TAB] = "Tab",
514 [KEY_Q] = "Q", [KEY_W] = "W",
515 [KEY_E] = "E", [KEY_R] = "R",
516 [KEY_T] = "T", [KEY_Y] = "Y",
517 [KEY_U] = "U", [KEY_I] = "I",
518 [KEY_O] = "O", [KEY_P] = "P",
519 [KEY_LEFTBRACE] = "LeftBrace", [KEY_RIGHTBRACE] = "RightBrace",
520 [KEY_ENTER] = "Enter", [KEY_LEFTCTRL] = "LeftControl",
521 [KEY_A] = "A", [KEY_S] = "S",
522 [KEY_D] = "D", [KEY_F] = "F",
523 [KEY_G] = "G", [KEY_H] = "H",
524 [KEY_J] = "J", [KEY_K] = "K",
525 [KEY_L] = "L", [KEY_SEMICOLON] = "Semicolon",
526 [KEY_APOSTROPHE] = "Apostrophe", [KEY_GRAVE] = "Grave",
527 [KEY_LEFTSHIFT] = "LeftShift", [KEY_BACKSLASH] = "BackSlash",
528 [KEY_Z] = "Z", [KEY_X] = "X",
529 [KEY_C] = "C", [KEY_V] = "V",
530 [KEY_B] = "B", [KEY_N] = "N",
531 [KEY_M] = "M", [KEY_COMMA] = "Comma",
532 [KEY_DOT] = "Dot", [KEY_SLASH] = "Slash",
533 [KEY_RIGHTSHIFT] = "RightShift", [KEY_KPASTERISK] = "KPAsterisk",
534 [KEY_LEFTALT] = "LeftAlt", [KEY_SPACE] = "Space",
535 [KEY_CAPSLOCK] = "CapsLock", [KEY_F1] = "F1",
536 [KEY_F2] = "F2", [KEY_F3] = "F3",
537 [KEY_F4] = "F4", [KEY_F5] = "F5",
538 [KEY_F6] = "F6", [KEY_F7] = "F7",
539 [KEY_F8] = "F8", [KEY_F9] = "F9",
540 [KEY_F10] = "F10", [KEY_NUMLOCK] = "NumLock",
541 [KEY_SCROLLLOCK] = "ScrollLock", [KEY_KP7] = "KP7",
542 [KEY_KP8] = "KP8", [KEY_KP9] = "KP9",
543 [KEY_KPMINUS] = "KPMinus", [KEY_KP4] = "KP4",
544 [KEY_KP5] = "KP5", [KEY_KP6] = "KP6",
545 [KEY_KPPLUS] = "KPPlus", [KEY_KP1] = "KP1",
546 [KEY_KP2] = "KP2", [KEY_KP3] = "KP3",
547 [KEY_KP0] = "KP0", [KEY_KPDOT] = "KPDot",
548 [KEY_ZENKAKUHANKAKU] = "Zenkaku/Hankaku", [KEY_102ND] = "102nd",
549 [KEY_F11] = "F11", [KEY_F12] = "F12",
550 [KEY_RO] = "RO", [KEY_KATAKANA] = "Katakana",
551 [KEY_HIRAGANA] = "HIRAGANA", [KEY_HENKAN] = "Henkan",
552 [KEY_KATAKANAHIRAGANA] = "Katakana/Hiragana", [KEY_MUHENKAN] = "Muhenkan",
553 [KEY_KPJPCOMMA] = "KPJpComma", [KEY_KPENTER] = "KPEnter",
554 [KEY_RIGHTCTRL] = "RightCtrl", [KEY_KPSLASH] = "KPSlash",
555 [KEY_SYSRQ] = "SysRq", [KEY_RIGHTALT] = "RightAlt",
556 [KEY_LINEFEED] = "LineFeed", [KEY_HOME] = "Home",
557 [KEY_UP] = "Up", [KEY_PAGEUP] = "PageUp",
558 [KEY_LEFT] = "Left", [KEY_RIGHT] = "Right",
559 [KEY_END] = "End", [KEY_DOWN] = "Down",
560 [KEY_PAGEDOWN] = "PageDown", [KEY_INSERT] = "Insert",
561 [KEY_DELETE] = "Delete", [KEY_MACRO] = "Macro",
562 [KEY_MUTE] = "Mute", [KEY_VOLUMEDOWN] = "VolumeDown",
563 [KEY_VOLUMEUP] = "VolumeUp", [KEY_POWER] = "Power",
564 [KEY_KPEQUAL] = "KPEqual", [KEY_KPPLUSMINUS] = "KPPlusMinus",
565 [KEY_PAUSE] = "Pause", [KEY_KPCOMMA] = "KPComma",
566 [KEY_HANGUEL] = "Hangeul", [KEY_HANJA] = "Hanja",
567 [KEY_YEN] = "Yen", [KEY_LEFTMETA] = "LeftMeta",
568 [KEY_RIGHTMETA] = "RightMeta", [KEY_COMPOSE] = "Compose",
569 [KEY_STOP] = "Stop", [KEY_AGAIN] = "Again",
570 [KEY_PROPS] = "Props", [KEY_UNDO] = "Undo",
571 [KEY_FRONT] = "Front", [KEY_COPY] = "Copy",
572 [KEY_OPEN] = "Open", [KEY_PASTE] = "Paste",
573 [KEY_FIND] = "Find", [KEY_CUT] = "Cut",
574 [KEY_HELP] = "Help", [KEY_MENU] = "Menu",
575 [KEY_CALC] = "Calc", [KEY_SETUP] = "Setup",
576 [KEY_SLEEP] = "Sleep", [KEY_WAKEUP] = "WakeUp",
577 [KEY_FILE] = "File", [KEY_SENDFILE] = "SendFile",
578 [KEY_DELETEFILE] = "DeleteFile", [KEY_XFER] = "X-fer",
579 [KEY_PROG1] = "Prog1", [KEY_PROG2] = "Prog2",
580 [KEY_WWW] = "WWW", [KEY_MSDOS] = "MSDOS",
581 [KEY_COFFEE] = "Coffee", [KEY_DIRECTION] = "Direction",
582 [KEY_CYCLEWINDOWS] = "CycleWindows", [KEY_MAIL] = "Mail",
583 [KEY_BOOKMARKS] = "Bookmarks", [KEY_COMPUTER] = "Computer",
584 [KEY_BACK] = "Back", [KEY_FORWARD] = "Forward",
585 [KEY_CLOSECD] = "CloseCD", [KEY_EJECTCD] = "EjectCD",
586 [KEY_EJECTCLOSECD] = "EjectCloseCD", [KEY_NEXTSONG] = "NextSong",
587 [KEY_PLAYPAUSE] = "PlayPause", [KEY_PREVIOUSSONG] = "PreviousSong",
588 [KEY_STOPCD] = "StopCD", [KEY_RECORD] = "Record",
589 [KEY_REWIND] = "Rewind", [KEY_PHONE] = "Phone",
590 [KEY_ISO] = "ISOKey", [KEY_CONFIG] = "Config",
591 [KEY_HOMEPAGE] = "HomePage", [KEY_REFRESH] = "Refresh",
592 [KEY_EXIT] = "Exit", [KEY_MOVE] = "Move",
593 [KEY_EDIT] = "Edit", [KEY_SCROLLUP] = "ScrollUp",
594 [KEY_SCROLLDOWN] = "ScrollDown", [KEY_KPLEFTPAREN] = "KPLeftParenthesis",
595 [KEY_KPRIGHTPAREN] = "KPRightParenthesis", [KEY_NEW] = "New",
596 [KEY_REDO] = "Redo", [KEY_F13] = "F13",
597 [KEY_F14] = "F14", [KEY_F15] = "F15",
598 [KEY_F16] = "F16", [KEY_F17] = "F17",
599 [KEY_F18] = "F18", [KEY_F19] = "F19",
600 [KEY_F20] = "F20", [KEY_F21] = "F21",
601 [KEY_F22] = "F22", [KEY_F23] = "F23",
602 [KEY_F24] = "F24", [KEY_PLAYCD] = "PlayCD",
603 [KEY_PAUSECD] = "PauseCD", [KEY_PROG3] = "Prog3",
604 [KEY_PROG4] = "Prog4", [KEY_SUSPEND] = "Suspend",
605 [KEY_CLOSE] = "Close", [KEY_PLAY] = "Play",
606 [KEY_FASTFORWARD] = "FastForward", [KEY_BASSBOOST] = "BassBoost",
607 [KEY_PRINT] = "Print", [KEY_HP] = "HP",
608 [KEY_CAMERA] = "Camera", [KEY_SOUND] = "Sound",
609 [KEY_QUESTION] = "Question", [KEY_EMAIL] = "Email",
610 [KEY_CHAT] = "Chat", [KEY_SEARCH] = "Search",
611 [KEY_CONNECT] = "Connect", [KEY_FINANCE] = "Finance",
612 [KEY_SPORT] = "Sport", [KEY_SHOP] = "Shop",
613 [KEY_ALTERASE] = "AlternateErase", [KEY_CANCEL] = "Cancel",
614 [KEY_BRIGHTNESSDOWN] = "BrightnessDown", [KEY_BRIGHTNESSUP] = "BrightnessUp",
615 [KEY_MEDIA] = "Media", [KEY_UNKNOWN] = "Unknown",
616 [BTN_0] = "Btn0", [BTN_1] = "Btn1",
617 [BTN_2] = "Btn2", [BTN_3] = "Btn3",
618 [BTN_4] = "Btn4", [BTN_5] = "Btn5",
619 [BTN_6] = "Btn6", [BTN_7] = "Btn7",
620 [BTN_8] = "Btn8", [BTN_9] = "Btn9",
621 [BTN_LEFT] = "LeftBtn", [BTN_RIGHT] = "RightBtn",
622 [BTN_MIDDLE] = "MiddleBtn", [BTN_SIDE] = "SideBtn",
623 [BTN_EXTRA] = "ExtraBtn", [BTN_FORWARD] = "ForwardBtn",
624 [BTN_BACK] = "BackBtn", [BTN_TASK] = "TaskBtn",
625 [BTN_TRIGGER] = "Trigger", [BTN_THUMB] = "ThumbBtn",
626 [BTN_THUMB2] = "ThumbBtn2", [BTN_TOP] = "TopBtn",
627 [BTN_TOP2] = "TopBtn2", [BTN_PINKIE] = "PinkieBtn",
628 [BTN_BASE] = "BaseBtn", [BTN_BASE2] = "BaseBtn2",
629 [BTN_BASE3] = "BaseBtn3", [BTN_BASE4] = "BaseBtn4",
630 [BTN_BASE5] = "BaseBtn5", [BTN_BASE6] = "BaseBtn6",
631 [BTN_DEAD] = "BtnDead", [BTN_A] = "BtnA",
632 [BTN_B] = "BtnB", [BTN_C] = "BtnC",
633 [BTN_X] = "BtnX", [BTN_Y] = "BtnY",
634 [BTN_Z] = "BtnZ", [BTN_TL] = "BtnTL",
635 [BTN_TR] = "BtnTR", [BTN_TL2] = "BtnTL2",
636 [BTN_TR2] = "BtnTR2", [BTN_SELECT] = "BtnSelect",
637 [BTN_START] = "BtnStart", [BTN_MODE] = "BtnMode",
638 [BTN_THUMBL] = "BtnThumbL", [BTN_THUMBR] = "BtnThumbR",
639 [BTN_TOOL_PEN] = "ToolPen", [BTN_TOOL_RUBBER] = "ToolRubber",
640 [BTN_TOOL_BRUSH] = "ToolBrush", [BTN_TOOL_PENCIL] = "ToolPencil",
641 [BTN_TOOL_AIRBRUSH] = "ToolAirbrush", [BTN_TOOL_FINGER] = "ToolFinger",
642 [BTN_TOOL_MOUSE] = "ToolMouse", [BTN_TOOL_LENS] = "ToolLens",
643 [BTN_TOUCH] = "Touch", [BTN_STYLUS] = "Stylus",
644 [BTN_STYLUS2] = "Stylus2", [BTN_TOOL_DOUBLETAP] = "ToolDoubleTap",
645 [BTN_TOOL_TRIPLETAP] = "ToolTripleTap", [BTN_GEAR_DOWN] = "WheelBtn",
646 [BTN_GEAR_UP] = "Gear up", [KEY_OK] = "Ok",
647 [KEY_SELECT] = "Select", [KEY_GOTO] = "Goto",
648 [KEY_CLEAR] = "Clear", [KEY_POWER2] = "Power2",
649 [KEY_OPTION] = "Option", [KEY_INFO] = "Info",
650 [KEY_TIME] = "Time", [KEY_VENDOR] = "Vendor",
651 [KEY_ARCHIVE] = "Archive", [KEY_PROGRAM] = "Program",
652 [KEY_CHANNEL] = "Channel", [KEY_FAVORITES] = "Favorites",
653 [KEY_EPG] = "EPG", [KEY_PVR] = "PVR",
654 [KEY_MHP] = "MHP", [KEY_LANGUAGE] = "Language",
655 [KEY_TITLE] = "Title", [KEY_SUBTITLE] = "Subtitle",
656 [KEY_ANGLE] = "Angle", [KEY_ZOOM] = "Zoom",
657 [KEY_MODE] = "Mode", [KEY_KEYBOARD] = "Keyboard",
658 [KEY_SCREEN] = "Screen", [KEY_PC] = "PC",
659 [KEY_TV] = "TV", [KEY_TV2] = "TV2",
660 [KEY_VCR] = "VCR", [KEY_VCR2] = "VCR2",
661 [KEY_SAT] = "Sat", [KEY_SAT2] = "Sat2",
662 [KEY_CD] = "CD", [KEY_TAPE] = "Tape",
663 [KEY_RADIO] = "Radio", [KEY_TUNER] = "Tuner",
664 [KEY_PLAYER] = "Player", [KEY_TEXT] = "Text",
665 [KEY_DVD] = "DVD", [KEY_AUX] = "Aux",
666 [KEY_MP3] = "MP3", [KEY_AUDIO] = "Audio",
667 [KEY_VIDEO] = "Video", [KEY_DIRECTORY] = "Directory",
668 [KEY_LIST] = "List", [KEY_MEMO] = "Memo",
669 [KEY_CALENDAR] = "Calendar", [KEY_RED] = "Red",
670 [KEY_GREEN] = "Green", [KEY_YELLOW] = "Yellow",
671 [KEY_BLUE] = "Blue", [KEY_CHANNELUP] = "ChannelUp",
672 [KEY_CHANNELDOWN] = "ChannelDown", [KEY_FIRST] = "First",
673 [KEY_LAST] = "Last", [KEY_AB] = "AB",
674 [KEY_NEXT] = "Next", [KEY_RESTART] = "Restart",
675 [KEY_SLOW] = "Slow", [KEY_SHUFFLE] = "Shuffle",
676 [KEY_BREAK] = "Break", [KEY_PREVIOUS] = "Previous",
677 [KEY_DIGITS] = "Digits", [KEY_TEEN] = "TEEN",
678 [KEY_TWEN] = "TWEN", [KEY_DEL_EOL] = "DeleteEOL",
679 [KEY_DEL_EOS] = "DeleteEOS", [KEY_INS_LINE] = "InsertLine",
680 [KEY_DEL_LINE] = "DeleteLine",
681 [KEY_SEND] = "Send", [KEY_REPLY] = "Reply",
682 [KEY_FORWARDMAIL] = "ForwardMail", [KEY_SAVE] = "Save",
683 [KEY_DOCUMENTS] = "Documents",
684 [KEY_FN] = "Fn", [KEY_FN_ESC] = "Fn+ESC",
685 [KEY_FN_1] = "Fn+1", [KEY_FN_2] = "Fn+2",
686 [KEY_FN_B] = "Fn+B", [KEY_FN_D] = "Fn+D",
687 [KEY_FN_E] = "Fn+E", [KEY_FN_F] = "Fn+F",
688 [KEY_FN_S] = "Fn+S",
689 [KEY_FN_F1] = "Fn+F1", [KEY_FN_F2] = "Fn+F2",
690 [KEY_FN_F3] = "Fn+F3", [KEY_FN_F4] = "Fn+F4",
691 [KEY_FN_F5] = "Fn+F5", [KEY_FN_F6] = "Fn+F6",
692 [KEY_FN_F7] = "Fn+F7", [KEY_FN_F8] = "Fn+F8",
693 [KEY_FN_F9] = "Fn+F9", [KEY_FN_F10] = "Fn+F10",
694 [KEY_FN_F11] = "Fn+F11", [KEY_FN_F12] = "Fn+F12",
695 [KEY_KBDILLUMTOGGLE] = "KbdIlluminationToggle",
696 [KEY_KBDILLUMDOWN] = "KbdIlluminationDown",
697 [KEY_KBDILLUMUP] = "KbdIlluminationUp",
698 [KEY_SWITCHVIDEOMODE] = "SwitchVideoMode",
699};
700
701static char *relatives[REL_MAX + 1] = {
702 [REL_X] = "X", [REL_Y] = "Y",
703 [REL_Z] = "Z", [REL_HWHEEL] = "HWheel",
704 [REL_DIAL] = "Dial", [REL_WHEEL] = "Wheel",
705 [REL_MISC] = "Misc",
706};
707
708static char *absolutes[ABS_MAX + 1] = {
709 [ABS_X] = "X", [ABS_Y] = "Y",
710 [ABS_Z] = "Z", [ABS_RX] = "Rx",
711 [ABS_RY] = "Ry", [ABS_RZ] = "Rz",
712 [ABS_THROTTLE] = "Throttle", [ABS_RUDDER] = "Rudder",
713 [ABS_WHEEL] = "Wheel", [ABS_GAS] = "Gas",
714 [ABS_BRAKE] = "Brake", [ABS_HAT0X] = "Hat0X",
715 [ABS_HAT0Y] = "Hat0Y", [ABS_HAT1X] = "Hat1X",
716 [ABS_HAT1Y] = "Hat1Y", [ABS_HAT2X] = "Hat2X",
717 [ABS_HAT2Y] = "Hat2Y", [ABS_HAT3X] = "Hat3X",
718 [ABS_HAT3Y] = "Hat 3Y", [ABS_PRESSURE] = "Pressure",
719 [ABS_DISTANCE] = "Distance", [ABS_TILT_X] = "XTilt",
720 [ABS_TILT_Y] = "YTilt", [ABS_TOOL_WIDTH] = "Tool Width",
721 [ABS_VOLUME] = "Volume", [ABS_MISC] = "Misc",
722};
723
724static char *misc[MSC_MAX + 1] = {
725 [MSC_SERIAL] = "Serial", [MSC_PULSELED] = "Pulseled",
726 [MSC_GESTURE] = "Gesture", [MSC_RAW] = "RawData"
727};
728
729static char *leds[LED_MAX + 1] = {
730 [LED_NUML] = "NumLock", [LED_CAPSL] = "CapsLock",
731 [LED_SCROLLL] = "ScrollLock", [LED_COMPOSE] = "Compose",
732 [LED_KANA] = "Kana", [LED_SLEEP] = "Sleep",
733 [LED_SUSPEND] = "Suspend", [LED_MUTE] = "Mute",
734 [LED_MISC] = "Misc",
735};
736
737static char *repeats[REP_MAX + 1] = {
738 [REP_DELAY] = "Delay", [REP_PERIOD] = "Period"
739};
740
741static char *sounds[SND_MAX + 1] = {
742 [SND_CLICK] = "Click", [SND_BELL] = "Bell",
743 [SND_TONE] = "Tone"
744};
745
746static char **names[EV_MAX + 1] = {
747 [EV_SYN] = syncs, [EV_KEY] = keys,
748 [EV_REL] = relatives, [EV_ABS] = absolutes,
749 [EV_MSC] = misc, [EV_LED] = leds,
750 [EV_SND] = sounds, [EV_REP] = repeats,
751};
752
753static void __attribute__((unused)) resolv_event(__u8 type, __u16 code) {
754
755 printk("%s.%s", events[type] ? events[type] : "?",
756 names[type] ? (names[type][code] ? names[type][code] : "?") : "?");
757}
diff --git a/drivers/usb/input/hid-ff.c b/drivers/usb/input/hid-ff.c
index a8fc46c721c5..4187f4ee9a9c 100644
--- a/drivers/usb/input/hid-ff.c
+++ b/drivers/usb/input/hid-ff.c
@@ -32,7 +32,7 @@
32#undef DEBUG 32#undef DEBUG
33#include <linux/usb.h> 33#include <linux/usb.h>
34 34
35#include "hid.h" 35#include <linux/hid.h>
36 36
37/* 37/*
38 * This table contains pointers to initializers. To add support for new 38 * This table contains pointers to initializers. To add support for new
diff --git a/drivers/usb/input/hid-input.c b/drivers/usb/input/hid-input.c
index 3a7e5fbff025..8756eb3263de 100644
--- a/drivers/usb/input/hid-input.c
+++ b/drivers/usb/input/hid-input.c
@@ -4,6 +4,7 @@
4 * Copyright (c) 2000-2001 Vojtech Pavlik 4 * Copyright (c) 2000-2001 Vojtech Pavlik
5 * 5 *
6 * USB HID to Linux Input mapping 6 * USB HID to Linux Input mapping
7 *
7 */ 8 */
8 9
9/* 10/*
@@ -26,847 +27,4 @@
26 * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic 27 * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
27 */ 28 */
28 29
29#include <linux/module.h>
30#include <linux/slab.h>
31#include <linux/kernel.h>
32#include <linux/usb/input.h>
33
34#undef DEBUG
35
36#include "hid.h"
37
38#define unk KEY_UNKNOWN
39
40static const unsigned char hid_keyboard[256] = {
41 0, 0, 0, 0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,
42 50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44, 2, 3,
43 4, 5, 6, 7, 8, 9, 10, 11, 28, 1, 14, 15, 57, 12, 13, 26,
44 27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64,
45 65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106,
46 105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71,
47 72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190,
48 191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113,
49 115,114,unk,unk,unk,121,unk, 89, 93,124, 92, 94, 95,unk,unk,unk,
50 122,123, 90, 91, 85,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
51 unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
52 unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
53 unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
54 unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
55 29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,
56 150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk
57};
58
59static const struct {
60 __s32 x;
61 __s32 y;
62} hid_hat_to_axis[] = {{ 0, 0}, { 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1,-1}};
63
64#define map_abs(c) do { usage->code = c; usage->type = EV_ABS; bit = input->absbit; max = ABS_MAX; } while (0)
65#define map_rel(c) do { usage->code = c; usage->type = EV_REL; bit = input->relbit; max = REL_MAX; } while (0)
66#define map_key(c) do { usage->code = c; usage->type = EV_KEY; bit = input->keybit; max = KEY_MAX; } while (0)
67#define map_led(c) do { usage->code = c; usage->type = EV_LED; bit = input->ledbit; max = LED_MAX; } while (0)
68
69#define map_abs_clear(c) do { map_abs(c); clear_bit(c, bit); } while (0)
70#define map_key_clear(c) do { map_key(c); clear_bit(c, bit); } while (0)
71
72#ifdef CONFIG_USB_HIDINPUT_POWERBOOK
73
74struct hidinput_key_translation {
75 u16 from;
76 u16 to;
77 u8 flags;
78};
79
80#define POWERBOOK_FLAG_FKEY 0x01
81
82static struct hidinput_key_translation powerbook_fn_keys[] = {
83 { KEY_BACKSPACE, KEY_DELETE },
84 { KEY_F1, KEY_BRIGHTNESSDOWN, POWERBOOK_FLAG_FKEY },
85 { KEY_F2, KEY_BRIGHTNESSUP, POWERBOOK_FLAG_FKEY },
86 { KEY_F3, KEY_MUTE, POWERBOOK_FLAG_FKEY },
87 { KEY_F4, KEY_VOLUMEDOWN, POWERBOOK_FLAG_FKEY },
88 { KEY_F5, KEY_VOLUMEUP, POWERBOOK_FLAG_FKEY },
89 { KEY_F6, KEY_NUMLOCK, POWERBOOK_FLAG_FKEY },
90 { KEY_F7, KEY_SWITCHVIDEOMODE, POWERBOOK_FLAG_FKEY },
91 { KEY_F8, KEY_KBDILLUMTOGGLE, POWERBOOK_FLAG_FKEY },
92 { KEY_F9, KEY_KBDILLUMDOWN, POWERBOOK_FLAG_FKEY },
93 { KEY_F10, KEY_KBDILLUMUP, POWERBOOK_FLAG_FKEY },
94 { KEY_UP, KEY_PAGEUP },
95 { KEY_DOWN, KEY_PAGEDOWN },
96 { KEY_LEFT, KEY_HOME },
97 { KEY_RIGHT, KEY_END },
98 { }
99};
100
101static struct hidinput_key_translation powerbook_numlock_keys[] = {
102 { KEY_J, KEY_KP1 },
103 { KEY_K, KEY_KP2 },
104 { KEY_L, KEY_KP3 },
105 { KEY_U, KEY_KP4 },
106 { KEY_I, KEY_KP5 },
107 { KEY_O, KEY_KP6 },
108 { KEY_7, KEY_KP7 },
109 { KEY_8, KEY_KP8 },
110 { KEY_9, KEY_KP9 },
111 { KEY_M, KEY_KP0 },
112 { KEY_DOT, KEY_KPDOT },
113 { KEY_SLASH, KEY_KPPLUS },
114 { KEY_SEMICOLON, KEY_KPMINUS },
115 { KEY_P, KEY_KPASTERISK },
116 { KEY_MINUS, KEY_KPEQUAL },
117 { KEY_0, KEY_KPSLASH },
118 { KEY_F6, KEY_NUMLOCK },
119 { KEY_KPENTER, KEY_KPENTER },
120 { KEY_BACKSPACE, KEY_BACKSPACE },
121 { }
122};
123
124static struct hidinput_key_translation powerbook_iso_keyboard[] = {
125 { KEY_GRAVE, KEY_102ND },
126 { KEY_102ND, KEY_GRAVE },
127 { }
128};
129
130static int usbhid_pb_fnmode = 1;
131module_param_named(pb_fnmode, usbhid_pb_fnmode, int, 0644);
132MODULE_PARM_DESC(pb_fnmode,
133 "Mode of fn key on PowerBooks (0 = disabled, 1 = fkeyslast, 2 = fkeysfirst)");
134
135static struct hidinput_key_translation *find_translation(struct hidinput_key_translation *table, u16 from)
136{
137 struct hidinput_key_translation *trans;
138
139 /* Look for the translation */
140 for (trans = table; trans->from; trans++)
141 if (trans->from == from)
142 return trans;
143
144 return NULL;
145}
146
147static int hidinput_pb_event(struct hid_device *hid, struct input_dev *input,
148 struct hid_usage *usage, __s32 value)
149{
150 struct hidinput_key_translation *trans;
151
152 if (usage->code == KEY_FN) {
153 if (value) hid->quirks |= HID_QUIRK_POWERBOOK_FN_ON;
154 else hid->quirks &= ~HID_QUIRK_POWERBOOK_FN_ON;
155
156 input_event(input, usage->type, usage->code, value);
157
158 return 1;
159 }
160
161 if (usbhid_pb_fnmode) {
162 int do_translate;
163
164 trans = find_translation(powerbook_fn_keys, usage->code);
165 if (trans) {
166 if (test_bit(usage->code, hid->pb_pressed_fn))
167 do_translate = 1;
168 else if (trans->flags & POWERBOOK_FLAG_FKEY)
169 do_translate =
170 (usbhid_pb_fnmode == 2 && (hid->quirks & HID_QUIRK_POWERBOOK_FN_ON)) ||
171 (usbhid_pb_fnmode == 1 && !(hid->quirks & HID_QUIRK_POWERBOOK_FN_ON));
172 else
173 do_translate = (hid->quirks & HID_QUIRK_POWERBOOK_FN_ON);
174
175 if (do_translate) {
176 if (value)
177 set_bit(usage->code, hid->pb_pressed_fn);
178 else
179 clear_bit(usage->code, hid->pb_pressed_fn);
180
181 input_event(input, usage->type, trans->to, value);
182
183 return 1;
184 }
185 }
186
187 if (test_bit(usage->code, hid->pb_pressed_numlock) ||
188 test_bit(LED_NUML, input->led)) {
189 trans = find_translation(powerbook_numlock_keys, usage->code);
190
191 if (trans) {
192 if (value)
193 set_bit(usage->code, hid->pb_pressed_numlock);
194 else
195 clear_bit(usage->code, hid->pb_pressed_numlock);
196
197 input_event(input, usage->type, trans->to, value);
198 }
199
200 return 1;
201 }
202 }
203
204 if (hid->quirks & HID_QUIRK_POWERBOOK_ISO_KEYBOARD) {
205 trans = find_translation(powerbook_iso_keyboard, usage->code);
206 if (trans) {
207 input_event(input, usage->type, trans->to, value);
208 return 1;
209 }
210 }
211
212 return 0;
213}
214
215static void hidinput_pb_setup(struct input_dev *input)
216{
217 struct hidinput_key_translation *trans;
218
219 set_bit(KEY_NUMLOCK, input->keybit);
220
221 /* Enable all needed keys */
222 for (trans = powerbook_fn_keys; trans->from; trans++)
223 set_bit(trans->to, input->keybit);
224
225 for (trans = powerbook_numlock_keys; trans->from; trans++)
226 set_bit(trans->to, input->keybit);
227
228 for (trans = powerbook_iso_keyboard; trans->from; trans++)
229 set_bit(trans->to, input->keybit);
230}
231#else
232static inline int hidinput_pb_event(struct hid_device *hid, struct input_dev *input,
233 struct hid_usage *usage, __s32 value)
234{
235 return 0;
236}
237
238static inline void hidinput_pb_setup(struct input_dev *input)
239{
240}
241#endif
242
243static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_field *field,
244 struct hid_usage *usage)
245{
246 struct input_dev *input = hidinput->input;
247 struct hid_device *device = input->private;
248 int max = 0, code;
249 unsigned long *bit = NULL;
250
251 field->hidinput = hidinput;
252
253#ifdef DEBUG
254 printk(KERN_DEBUG "Mapping: ");
255 resolv_usage(usage->hid);
256 printk(" ---> ");
257#endif
258
259 if (field->flags & HID_MAIN_ITEM_CONSTANT)
260 goto ignore;
261
262 switch (usage->hid & HID_USAGE_PAGE) {
263
264 case HID_UP_UNDEFINED:
265 goto ignore;
266
267 case HID_UP_KEYBOARD:
268
269 set_bit(EV_REP, input->evbit);
270
271 if ((usage->hid & HID_USAGE) < 256) {
272 if (!hid_keyboard[usage->hid & HID_USAGE]) goto ignore;
273 map_key_clear(hid_keyboard[usage->hid & HID_USAGE]);
274 } else
275 map_key(KEY_UNKNOWN);
276
277 break;
278
279 case HID_UP_BUTTON:
280
281 code = ((usage->hid - 1) & 0xf);
282
283 switch (field->application) {
284 case HID_GD_MOUSE:
285 case HID_GD_POINTER: code += 0x110; break;
286 case HID_GD_JOYSTICK: code += 0x120; break;
287 case HID_GD_GAMEPAD: code += 0x130; break;
288 default:
289 switch (field->physical) {
290 case HID_GD_MOUSE:
291 case HID_GD_POINTER: code += 0x110; break;
292 case HID_GD_JOYSTICK: code += 0x120; break;
293 case HID_GD_GAMEPAD: code += 0x130; break;
294 default: code += 0x100;
295 }
296 }
297
298 map_key(code);
299 break;
300
301
302 case HID_UP_SIMULATION:
303
304 switch (usage->hid & 0xffff) {
305 case 0xba: map_abs(ABS_RUDDER); break;
306 case 0xbb: map_abs(ABS_THROTTLE); break;
307 case 0xc4: map_abs(ABS_GAS); break;
308 case 0xc5: map_abs(ABS_BRAKE); break;
309 case 0xc8: map_abs(ABS_WHEEL); break;
310 default: goto ignore;
311 }
312 break;
313
314 case HID_UP_GENDESK:
315
316 if ((usage->hid & 0xf0) == 0x80) { /* SystemControl */
317 switch (usage->hid & 0xf) {
318 case 0x1: map_key_clear(KEY_POWER); break;
319 case 0x2: map_key_clear(KEY_SLEEP); break;
320 case 0x3: map_key_clear(KEY_WAKEUP); break;
321 default: goto unknown;
322 }
323 break;
324 }
325
326 if ((usage->hid & 0xf0) == 0x90) { /* D-pad */
327 switch (usage->hid) {
328 case HID_GD_UP: usage->hat_dir = 1; break;
329 case HID_GD_DOWN: usage->hat_dir = 5; break;
330 case HID_GD_RIGHT: usage->hat_dir = 3; break;
331 case HID_GD_LEFT: usage->hat_dir = 7; break;
332 default: goto unknown;
333 }
334 if (field->dpad) {
335 map_abs(field->dpad);
336 goto ignore;
337 }
338 map_abs(ABS_HAT0X);
339 break;
340 }
341
342 switch (usage->hid) {
343
344 /* These usage IDs map directly to the usage codes. */
345 case HID_GD_X: case HID_GD_Y: case HID_GD_Z:
346 case HID_GD_RX: case HID_GD_RY: case HID_GD_RZ:
347 case HID_GD_SLIDER: case HID_GD_DIAL: case HID_GD_WHEEL:
348 if (field->flags & HID_MAIN_ITEM_RELATIVE)
349 map_rel(usage->hid & 0xf);
350 else
351 map_abs(usage->hid & 0xf);
352 break;
353
354 case HID_GD_HATSWITCH:
355 usage->hat_min = field->logical_minimum;
356 usage->hat_max = field->logical_maximum;
357 map_abs(ABS_HAT0X);
358 break;
359
360 case HID_GD_START: map_key_clear(BTN_START); break;
361 case HID_GD_SELECT: map_key_clear(BTN_SELECT); break;
362
363 default: goto unknown;
364 }
365
366 break;
367
368 case HID_UP_LED:
369 if (((usage->hid - 1) & 0xffff) >= LED_MAX)
370 goto ignore;
371 map_led((usage->hid - 1) & 0xffff);
372 break;
373
374 case HID_UP_DIGITIZER:
375
376 switch (usage->hid & 0xff) {
377
378 case 0x30: /* TipPressure */
379 if (!test_bit(BTN_TOUCH, input->keybit)) {
380 device->quirks |= HID_QUIRK_NOTOUCH;
381 set_bit(EV_KEY, input->evbit);
382 set_bit(BTN_TOUCH, input->keybit);
383 }
384
385 map_abs_clear(ABS_PRESSURE);
386 break;
387
388 case 0x32: /* InRange */
389 switch (field->physical & 0xff) {
390 case 0x21: map_key(BTN_TOOL_MOUSE); break;
391 case 0x22: map_key(BTN_TOOL_FINGER); break;
392 default: map_key(BTN_TOOL_PEN); break;
393 }
394 break;
395
396 case 0x3c: /* Invert */
397 map_key_clear(BTN_TOOL_RUBBER);
398 break;
399
400 case 0x33: /* Touch */
401 case 0x42: /* TipSwitch */
402 case 0x43: /* TipSwitch2 */
403 device->quirks &= ~HID_QUIRK_NOTOUCH;
404 map_key_clear(BTN_TOUCH);
405 break;
406
407 case 0x44: /* BarrelSwitch */
408 map_key_clear(BTN_STYLUS);
409 break;
410
411 default: goto unknown;
412 }
413 break;
414
415 case HID_UP_CONSUMER: /* USB HUT v1.1, pages 56-62 */
416
417 switch (usage->hid & HID_USAGE) {
418 case 0x000: goto ignore;
419 case 0x034: map_key_clear(KEY_SLEEP); break;
420 case 0x036: map_key_clear(BTN_MISC); break;
421 case 0x045: map_key_clear(KEY_RADIO); break;
422 case 0x08a: map_key_clear(KEY_WWW); break;
423 case 0x08d: map_key_clear(KEY_PROGRAM); break;
424 case 0x095: map_key_clear(KEY_HELP); break;
425 case 0x09c: map_key_clear(KEY_CHANNELUP); break;
426 case 0x09d: map_key_clear(KEY_CHANNELDOWN); break;
427 case 0x0b0: map_key_clear(KEY_PLAY); break;
428 case 0x0b1: map_key_clear(KEY_PAUSE); break;
429 case 0x0b2: map_key_clear(KEY_RECORD); break;
430 case 0x0b3: map_key_clear(KEY_FASTFORWARD); break;
431 case 0x0b4: map_key_clear(KEY_REWIND); break;
432 case 0x0b5: map_key_clear(KEY_NEXTSONG); break;
433 case 0x0b6: map_key_clear(KEY_PREVIOUSSONG); break;
434 case 0x0b7: map_key_clear(KEY_STOPCD); break;
435 case 0x0b8: map_key_clear(KEY_EJECTCD); break;
436 case 0x0cd: map_key_clear(KEY_PLAYPAUSE); break;
437 case 0x0e0: map_abs_clear(ABS_VOLUME); break;
438 case 0x0e2: map_key_clear(KEY_MUTE); break;
439 case 0x0e5: map_key_clear(KEY_BASSBOOST); break;
440 case 0x0e9: map_key_clear(KEY_VOLUMEUP); break;
441 case 0x0ea: map_key_clear(KEY_VOLUMEDOWN); break;
442 case 0x183: map_key_clear(KEY_CONFIG); break;
443 case 0x18a: map_key_clear(KEY_MAIL); break;
444 case 0x192: map_key_clear(KEY_CALC); break;
445 case 0x194: map_key_clear(KEY_FILE); break;
446 case 0x1a7: map_key_clear(KEY_DOCUMENTS); break;
447 case 0x201: map_key_clear(KEY_NEW); break;
448 case 0x207: map_key_clear(KEY_SAVE); break;
449 case 0x208: map_key_clear(KEY_PRINT); break;
450 case 0x209: map_key_clear(KEY_PROPS); break;
451 case 0x21a: map_key_clear(KEY_UNDO); break;
452 case 0x21b: map_key_clear(KEY_COPY); break;
453 case 0x21c: map_key_clear(KEY_CUT); break;
454 case 0x21d: map_key_clear(KEY_PASTE); break;
455 case 0x221: map_key_clear(KEY_FIND); break;
456 case 0x223: map_key_clear(KEY_HOMEPAGE); break;
457 case 0x224: map_key_clear(KEY_BACK); break;
458 case 0x225: map_key_clear(KEY_FORWARD); break;
459 case 0x226: map_key_clear(KEY_STOP); break;
460 case 0x227: map_key_clear(KEY_REFRESH); break;
461 case 0x22a: map_key_clear(KEY_BOOKMARKS); break;
462 case 0x233: map_key_clear(KEY_SCROLLUP); break;
463 case 0x234: map_key_clear(KEY_SCROLLDOWN); break;
464 case 0x238: map_rel(REL_HWHEEL); break;
465 case 0x279: map_key_clear(KEY_REDO); break;
466 case 0x289: map_key_clear(KEY_REPLY); break;
467 case 0x28b: map_key_clear(KEY_FORWARDMAIL); break;
468 case 0x28c: map_key_clear(KEY_SEND); break;
469
470 /* Reported on a Cherry Cymotion keyboard */
471 case 0x301: map_key_clear(KEY_PROG1); break;
472 case 0x302: map_key_clear(KEY_PROG2); break;
473 case 0x303: map_key_clear(KEY_PROG3); break;
474
475 default: goto ignore;
476 }
477 break;
478
479 case HID_UP_HPVENDOR: /* Reported on a Dutch layout HP5308 */
480
481 set_bit(EV_REP, input->evbit);
482 switch (usage->hid & HID_USAGE) {
483 case 0x021: map_key_clear(KEY_PRINT); break;
484 case 0x070: map_key_clear(KEY_HP); break;
485 case 0x071: map_key_clear(KEY_CAMERA); break;
486 case 0x072: map_key_clear(KEY_SOUND); break;
487 case 0x073: map_key_clear(KEY_QUESTION); break;
488 case 0x080: map_key_clear(KEY_EMAIL); break;
489 case 0x081: map_key_clear(KEY_CHAT); break;
490 case 0x082: map_key_clear(KEY_SEARCH); break;
491 case 0x083: map_key_clear(KEY_CONNECT); break;
492 case 0x084: map_key_clear(KEY_FINANCE); break;
493 case 0x085: map_key_clear(KEY_SPORT); break;
494 case 0x086: map_key_clear(KEY_SHOP); break;
495 default: goto ignore;
496 }
497 break;
498
499 case HID_UP_MSVENDOR:
500 goto ignore;
501
502 case HID_UP_CUSTOM: /* Reported on Logitech and Powerbook USB keyboards */
503
504 set_bit(EV_REP, input->evbit);
505 switch(usage->hid & HID_USAGE) {
506 case 0x003:
507 /* The fn key on Apple PowerBooks */
508 map_key_clear(KEY_FN);
509 hidinput_pb_setup(input);
510 break;
511
512 default: goto ignore;
513 }
514 break;
515
516 case HID_UP_LOGIVENDOR: /* Reported on Logitech Ultra X Media Remote */
517
518 set_bit(EV_REP, input->evbit);
519 switch(usage->hid & HID_USAGE) {
520 case 0x004: map_key_clear(KEY_AGAIN); break;
521 case 0x00d: map_key_clear(KEY_HOME); break;
522 case 0x024: map_key_clear(KEY_SHUFFLE); break;
523 case 0x025: map_key_clear(KEY_TV); break;
524 case 0x026: map_key_clear(KEY_MENU); break;
525 case 0x031: map_key_clear(KEY_AUDIO); break;
526 case 0x032: map_key_clear(KEY_TEXT); break;
527 case 0x033: map_key_clear(KEY_LAST); break;
528 case 0x047: map_key_clear(KEY_MP3); break;
529 case 0x048: map_key_clear(KEY_DVD); break;
530 case 0x049: map_key_clear(KEY_MEDIA); break;
531 case 0x04a: map_key_clear(KEY_VIDEO); break;
532 case 0x04b: map_key_clear(KEY_ANGLE); break;
533 case 0x04c: map_key_clear(KEY_LANGUAGE); break;
534 case 0x04d: map_key_clear(KEY_SUBTITLE); break;
535 case 0x051: map_key_clear(KEY_RED); break;
536 case 0x052: map_key_clear(KEY_CLOSE); break;
537 default: goto ignore;
538 }
539 break;
540
541 case HID_UP_PID:
542
543 switch(usage->hid & HID_USAGE) {
544 case 0xa4: map_key_clear(BTN_DEAD); break;
545 default: goto ignore;
546 }
547 break;
548
549 default:
550 unknown:
551 if (field->report_size == 1) {
552 if (field->report->type == HID_OUTPUT_REPORT) {
553 map_led(LED_MISC);
554 break;
555 }
556 map_key(BTN_MISC);
557 break;
558 }
559 if (field->flags & HID_MAIN_ITEM_RELATIVE) {
560 map_rel(REL_MISC);
561 break;
562 }
563 map_abs(ABS_MISC);
564 break;
565 }
566
567 if (device->quirks & HID_QUIRK_MIGHTYMOUSE) {
568 if (usage->hid == HID_GD_Z)
569 map_rel(REL_HWHEEL);
570 else if (usage->code == BTN_1)
571 map_key(BTN_2);
572 else if (usage->code == BTN_2)
573 map_key(BTN_1);
574 }
575
576 if ((device->quirks & (HID_QUIRK_2WHEEL_MOUSE_HACK_7 | HID_QUIRK_2WHEEL_MOUSE_HACK_5)) &&
577 (usage->type == EV_REL) && (usage->code == REL_WHEEL))
578 set_bit(REL_HWHEEL, bit);
579
580 if (((device->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_5) && (usage->hid == 0x00090005))
581 || ((device->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_7) && (usage->hid == 0x00090007)))
582 goto ignore;
583
584 if ((device->quirks & HID_QUIRK_BAD_RELATIVE_KEYS) &&
585 usage->type == EV_KEY && (field->flags & HID_MAIN_ITEM_RELATIVE))
586 field->flags &= ~HID_MAIN_ITEM_RELATIVE;
587
588 set_bit(usage->type, input->evbit);
589
590 while (usage->code <= max && test_and_set_bit(usage->code, bit))
591 usage->code = find_next_zero_bit(bit, max + 1, usage->code);
592
593 if (usage->code > max)
594 goto ignore;
595
596
597 if (usage->type == EV_ABS) {
598
599 int a = field->logical_minimum;
600 int b = field->logical_maximum;
601
602 if ((device->quirks & HID_QUIRK_BADPAD) && (usage->code == ABS_X || usage->code == ABS_Y)) {
603 a = field->logical_minimum = 0;
604 b = field->logical_maximum = 255;
605 }
606
607 if (field->application == HID_GD_GAMEPAD || field->application == HID_GD_JOYSTICK)
608 input_set_abs_params(input, usage->code, a, b, (b - a) >> 8, (b - a) >> 4);
609 else input_set_abs_params(input, usage->code, a, b, 0, 0);
610
611 }
612
613 if (usage->type == EV_ABS &&
614 (usage->hat_min < usage->hat_max || usage->hat_dir)) {
615 int i;
616 for (i = usage->code; i < usage->code + 2 && i <= max; i++) {
617 input_set_abs_params(input, i, -1, 1, 0, 0);
618 set_bit(i, input->absbit);
619 }
620 if (usage->hat_dir && !field->dpad)
621 field->dpad = usage->code;
622 }
623
624#ifdef DEBUG
625 resolv_event(usage->type, usage->code);
626 printk("\n");
627#endif
628 return;
629
630ignore:
631#ifdef DEBUG
632 printk("IGNORED\n");
633#endif
634 return;
635}
636
637void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value)
638{
639 struct input_dev *input;
640 int *quirks = &hid->quirks;
641
642 if (!field->hidinput)
643 return;
644
645 input = field->hidinput->input;
646
647 if (!usage->type)
648 return;
649
650 if (((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_5) && (usage->hid == 0x00090005))
651 || ((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_7) && (usage->hid == 0x00090007))) {
652 if (value) hid->quirks |= HID_QUIRK_2WHEEL_MOUSE_HACK_ON;
653 else hid->quirks &= ~HID_QUIRK_2WHEEL_MOUSE_HACK_ON;
654 return;
655 }
656
657 if ((hid->quirks & HID_QUIRK_INVERT_HWHEEL) && (usage->code == REL_HWHEEL)) {
658 input_event(input, usage->type, usage->code, -value);
659 return;
660 }
661
662 if ((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_ON) && (usage->code == REL_WHEEL)) {
663 input_event(input, usage->type, REL_HWHEEL, value);
664 return;
665 }
666
667 if ((hid->quirks & HID_QUIRK_POWERBOOK_HAS_FN) && hidinput_pb_event(hid, input, usage, value))
668 return;
669
670 if (usage->hat_min < usage->hat_max || usage->hat_dir) {
671 int hat_dir = usage->hat_dir;
672 if (!hat_dir)
673 hat_dir = (value - usage->hat_min) * 8 / (usage->hat_max - usage->hat_min + 1) + 1;
674 if (hat_dir < 0 || hat_dir > 8) hat_dir = 0;
675 input_event(input, usage->type, usage->code , hid_hat_to_axis[hat_dir].x);
676 input_event(input, usage->type, usage->code + 1, hid_hat_to_axis[hat_dir].y);
677 return;
678 }
679
680 if (usage->hid == (HID_UP_DIGITIZER | 0x003c)) { /* Invert */
681 *quirks = value ? (*quirks | HID_QUIRK_INVERT) : (*quirks & ~HID_QUIRK_INVERT);
682 return;
683 }
684
685 if (usage->hid == (HID_UP_DIGITIZER | 0x0032)) { /* InRange */
686 if (value) {
687 input_event(input, usage->type, (*quirks & HID_QUIRK_INVERT) ? BTN_TOOL_RUBBER : usage->code, 1);
688 return;
689 }
690 input_event(input, usage->type, usage->code, 0);
691 input_event(input, usage->type, BTN_TOOL_RUBBER, 0);
692 return;
693 }
694
695 if (usage->hid == (HID_UP_DIGITIZER | 0x0030) && (*quirks & HID_QUIRK_NOTOUCH)) { /* Pressure */
696 int a = field->logical_minimum;
697 int b = field->logical_maximum;
698 input_event(input, EV_KEY, BTN_TOUCH, value > a + ((b - a) >> 3));
699 }
700
701 if (usage->hid == (HID_UP_PID | 0x83UL)) { /* Simultaneous Effects Max */
702 dbg("Maximum Effects - %d",value);
703 return;
704 }
705
706 if (usage->hid == (HID_UP_PID | 0x7fUL)) {
707 dbg("PID Pool Report\n");
708 return;
709 }
710
711 if ((usage->type == EV_KEY) && (usage->code == 0)) /* Key 0 is "unassigned", not KEY_UNKNOWN */
712 return;
713
714 input_event(input, usage->type, usage->code, value);
715
716 if ((field->flags & HID_MAIN_ITEM_RELATIVE) && (usage->type == EV_KEY))
717 input_event(input, usage->type, usage->code, 0);
718}
719
720void hidinput_report_event(struct hid_device *hid, struct hid_report *report)
721{
722 struct hid_input *hidinput;
723
724 list_for_each_entry(hidinput, &hid->inputs, list)
725 input_sync(hidinput->input);
726}
727
728static int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field)
729{
730 struct hid_report *report;
731 int i, j;
732
733 list_for_each_entry(report, &hid->report_enum[HID_OUTPUT_REPORT].report_list, list) {
734 for (i = 0; i < report->maxfield; i++) {
735 *field = report->field[i];
736 for (j = 0; j < (*field)->maxusage; j++)
737 if ((*field)->usage[j].type == type && (*field)->usage[j].code == code)
738 return j;
739 }
740 }
741 return -1;
742}
743
744static int hidinput_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
745{
746 struct hid_device *hid = dev->private;
747 struct hid_field *field;
748 int offset;
749
750 if (type == EV_FF)
751 return input_ff_event(dev, type, code, value);
752
753 if (type != EV_LED)
754 return -1;
755
756 if ((offset = hidinput_find_field(hid, type, code, &field)) == -1) {
757 warn("event field not found");
758 return -1;
759 }
760
761 hid_set_field(field, offset, value);
762 hid_submit_report(hid, field->report, USB_DIR_OUT);
763
764 return 0;
765}
766
767static int hidinput_open(struct input_dev *dev)
768{
769 struct hid_device *hid = dev->private;
770 return hid_open(hid);
771}
772
773static void hidinput_close(struct input_dev *dev)
774{
775 struct hid_device *hid = dev->private;
776 hid_close(hid);
777}
778
779/*
780 * Register the input device; print a message.
781 * Configure the input layer interface
782 * Read all reports and initialize the absolute field values.
783 */
784
785int hidinput_connect(struct hid_device *hid)
786{
787 struct usb_device *dev = hid->dev;
788 struct hid_report *report;
789 struct hid_input *hidinput = NULL;
790 struct input_dev *input_dev;
791 int i, j, k;
792
793 INIT_LIST_HEAD(&hid->inputs);
794
795 for (i = 0; i < hid->maxcollection; i++)
796 if (hid->collection[i].type == HID_COLLECTION_APPLICATION ||
797 hid->collection[i].type == HID_COLLECTION_PHYSICAL)
798 if (IS_INPUT_APPLICATION(hid->collection[i].usage))
799 break;
800
801 if (i == hid->maxcollection)
802 return -1;
803
804 for (k = HID_INPUT_REPORT; k <= HID_OUTPUT_REPORT; k++)
805 list_for_each_entry(report, &hid->report_enum[k].report_list, list) {
806
807 if (!report->maxfield)
808 continue;
809
810 if (!hidinput) {
811 hidinput = kzalloc(sizeof(*hidinput), GFP_KERNEL);
812 input_dev = input_allocate_device();
813 if (!hidinput || !input_dev) {
814 kfree(hidinput);
815 input_free_device(input_dev);
816 err("Out of memory during hid input probe");
817 return -1;
818 }
819
820 input_dev->private = hid;
821 input_dev->event = hidinput_input_event;
822 input_dev->open = hidinput_open;
823 input_dev->close = hidinput_close;
824
825 input_dev->name = hid->name;
826 input_dev->phys = hid->phys;
827 input_dev->uniq = hid->uniq;
828 usb_to_input_id(dev, &input_dev->id);
829 input_dev->cdev.dev = &hid->intf->dev;
830
831 hidinput->input = input_dev;
832 list_add_tail(&hidinput->list, &hid->inputs);
833 }
834
835 for (i = 0; i < report->maxfield; i++)
836 for (j = 0; j < report->field[i]->maxusage; j++)
837 hidinput_configure_usage(hidinput, report->field[i],
838 report->field[i]->usage + j);
839
840 if (hid->quirks & HID_QUIRK_MULTI_INPUT) {
841 /* This will leave hidinput NULL, so that it
842 * allocates another one if we have more inputs on
843 * the same interface. Some devices (e.g. Happ's
844 * UGCI) cram a lot of unrelated inputs into the
845 * same interface. */
846 hidinput->report = report;
847 input_register_device(hidinput->input);
848 hidinput = NULL;
849 }
850 }
851
852 /* This only gets called when we are a single-input (most of the
853 * time). IOW, not a HID_QUIRK_MULTI_INPUT. The hid_ff_init() is
854 * only useful in this case, and not for multi-input quirks. */
855 if (hidinput) {
856 hid_ff_init(hid);
857 input_register_device(hidinput->input);
858 }
859
860 return 0;
861}
862
863void hidinput_disconnect(struct hid_device *hid)
864{
865 struct hid_input *hidinput, *next;
866 30
867 list_for_each_entry_safe(hidinput, next, &hid->inputs, list) {
868 list_del(&hidinput->list);
869 input_unregister_device(hidinput->input);
870 kfree(hidinput);
871 }
872}
diff --git a/drivers/usb/input/hid-lgff.c b/drivers/usb/input/hid-lgff.c
index 93da222b6da8..e977ba3d17e0 100644
--- a/drivers/usb/input/hid-lgff.c
+++ b/drivers/usb/input/hid-lgff.c
@@ -29,7 +29,7 @@
29 29
30#include <linux/input.h> 30#include <linux/input.h>
31#include <linux/usb.h> 31#include <linux/usb.h>
32#include "hid.h" 32#include <linux/hid.h>
33 33
34struct device_type { 34struct device_type {
35 u16 idVendor; 35 u16 idVendor;
diff --git a/drivers/usb/input/hid-pidff.c b/drivers/usb/input/hid-pidff.c
index 5420c13eb8eb..b4caea3864e3 100644
--- a/drivers/usb/input/hid-pidff.c
+++ b/drivers/usb/input/hid-pidff.c
@@ -28,7 +28,9 @@
28#include <linux/input.h> 28#include <linux/input.h>
29#include <linux/usb.h> 29#include <linux/usb.h>
30 30
31#include "hid.h" 31#include <linux/hid.h>
32
33#include "usbhid.h"
32 34
33#define PID_EFFECTS_MAX 64 35#define PID_EFFECTS_MAX 64
34 36
diff --git a/drivers/usb/input/hid-tmff.c b/drivers/usb/input/hid-tmff.c
index 2d5be4c318ac..1cd1418ad6ac 100644
--- a/drivers/usb/input/hid-tmff.c
+++ b/drivers/usb/input/hid-tmff.c
@@ -32,7 +32,7 @@
32#undef DEBUG 32#undef DEBUG
33#include <linux/usb.h> 33#include <linux/usb.h>
34 34
35#include "hid.h" 35#include <linux/hid.h>
36 36
37/* Usages for thrustmaster devices I know about */ 37/* Usages for thrustmaster devices I know about */
38#define THRUSTMASTER_USAGE_RUMBLE_LR (HID_UP_GENDESK | 0xbb) 38#define THRUSTMASTER_USAGE_RUMBLE_LR (HID_UP_GENDESK | 0xbb)
diff --git a/drivers/usb/input/hid-zpff.c b/drivers/usb/input/hid-zpff.c
index d2ce3214572c..af1bfae39dce 100644
--- a/drivers/usb/input/hid-zpff.c
+++ b/drivers/usb/input/hid-zpff.c
@@ -27,7 +27,7 @@
27 27
28#include <linux/input.h> 28#include <linux/input.h>
29#include <linux/usb.h> 29#include <linux/usb.h>
30#include "hid.h" 30#include <linux/hid.h>
31 31
32struct zpff_device { 32struct zpff_device {
33 struct hid_report *report; 33 struct hid_report *report;
diff --git a/drivers/usb/input/hid.h b/drivers/usb/input/hid.h
deleted file mode 100644
index 76ad68d9edfd..000000000000
--- a/drivers/usb/input/hid.h
+++ /dev/null
@@ -1,540 +0,0 @@
1#ifndef __HID_H
2#define __HID_H
3
4/*
5 * $Id: hid.h,v 1.24 2001/12/27 10:37:41 vojtech Exp $
6 *
7 * Copyright (c) 1999 Andreas Gal
8 * Copyright (c) 2000-2001 Vojtech Pavlik
9 */
10
11/*
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 *
26 * Should you need to contact me, the author, you can do so either by
27 * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
28 * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
29 */
30
31#include <linux/types.h>
32#include <linux/slab.h>
33#include <linux/list.h>
34#include <linux/timer.h>
35#include <linux/workqueue.h>
36
37/*
38 * USB HID (Human Interface Device) interface class code
39 */
40
41#define USB_INTERFACE_CLASS_HID 3
42
43/*
44 * USB HID interface subclass and protocol codes
45 */
46
47#define USB_INTERFACE_SUBCLASS_BOOT 1
48#define USB_INTERFACE_PROTOCOL_KEYBOARD 1
49#define USB_INTERFACE_PROTOCOL_MOUSE 2
50
51/*
52 * HID class requests
53 */
54
55#define HID_REQ_GET_REPORT 0x01
56#define HID_REQ_GET_IDLE 0x02
57#define HID_REQ_GET_PROTOCOL 0x03
58#define HID_REQ_SET_REPORT 0x09
59#define HID_REQ_SET_IDLE 0x0A
60#define HID_REQ_SET_PROTOCOL 0x0B
61
62/*
63 * HID class descriptor types
64 */
65
66#define HID_DT_HID (USB_TYPE_CLASS | 0x01)
67#define HID_DT_REPORT (USB_TYPE_CLASS | 0x02)
68#define HID_DT_PHYSICAL (USB_TYPE_CLASS | 0x03)
69
70/*
71 * We parse each description item into this structure. Short items data
72 * values are expanded to 32-bit signed int, long items contain a pointer
73 * into the data area.
74 */
75
76struct hid_item {
77 unsigned format;
78 __u8 size;
79 __u8 type;
80 __u8 tag;
81 union {
82 __u8 u8;
83 __s8 s8;
84 __u16 u16;
85 __s16 s16;
86 __u32 u32;
87 __s32 s32;
88 __u8 *longdata;
89 } data;
90};
91
92/*
93 * HID report item format
94 */
95
96#define HID_ITEM_FORMAT_SHORT 0
97#define HID_ITEM_FORMAT_LONG 1
98
99/*
100 * Special tag indicating long items
101 */
102
103#define HID_ITEM_TAG_LONG 15
104
105/*
106 * HID report descriptor item type (prefix bit 2,3)
107 */
108
109#define HID_ITEM_TYPE_MAIN 0
110#define HID_ITEM_TYPE_GLOBAL 1
111#define HID_ITEM_TYPE_LOCAL 2
112#define HID_ITEM_TYPE_RESERVED 3
113
114/*
115 * HID report descriptor main item tags
116 */
117
118#define HID_MAIN_ITEM_TAG_INPUT 8
119#define HID_MAIN_ITEM_TAG_OUTPUT 9
120#define HID_MAIN_ITEM_TAG_FEATURE 11
121#define HID_MAIN_ITEM_TAG_BEGIN_COLLECTION 10
122#define HID_MAIN_ITEM_TAG_END_COLLECTION 12
123
124/*
125 * HID report descriptor main item contents
126 */
127
128#define HID_MAIN_ITEM_CONSTANT 0x001
129#define HID_MAIN_ITEM_VARIABLE 0x002
130#define HID_MAIN_ITEM_RELATIVE 0x004
131#define HID_MAIN_ITEM_WRAP 0x008
132#define HID_MAIN_ITEM_NONLINEAR 0x010
133#define HID_MAIN_ITEM_NO_PREFERRED 0x020
134#define HID_MAIN_ITEM_NULL_STATE 0x040
135#define HID_MAIN_ITEM_VOLATILE 0x080
136#define HID_MAIN_ITEM_BUFFERED_BYTE 0x100
137
138/*
139 * HID report descriptor collection item types
140 */
141
142#define HID_COLLECTION_PHYSICAL 0
143#define HID_COLLECTION_APPLICATION 1
144#define HID_COLLECTION_LOGICAL 2
145
146/*
147 * HID report descriptor global item tags
148 */
149
150#define HID_GLOBAL_ITEM_TAG_USAGE_PAGE 0
151#define HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM 1
152#define HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM 2
153#define HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM 3
154#define HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM 4
155#define HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT 5
156#define HID_GLOBAL_ITEM_TAG_UNIT 6
157#define HID_GLOBAL_ITEM_TAG_REPORT_SIZE 7
158#define HID_GLOBAL_ITEM_TAG_REPORT_ID 8
159#define HID_GLOBAL_ITEM_TAG_REPORT_COUNT 9
160#define HID_GLOBAL_ITEM_TAG_PUSH 10
161#define HID_GLOBAL_ITEM_TAG_POP 11
162
163/*
164 * HID report descriptor local item tags
165 */
166
167#define HID_LOCAL_ITEM_TAG_USAGE 0
168#define HID_LOCAL_ITEM_TAG_USAGE_MINIMUM 1
169#define HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM 2
170#define HID_LOCAL_ITEM_TAG_DESIGNATOR_INDEX 3
171#define HID_LOCAL_ITEM_TAG_DESIGNATOR_MINIMUM 4
172#define HID_LOCAL_ITEM_TAG_DESIGNATOR_MAXIMUM 5
173#define HID_LOCAL_ITEM_TAG_STRING_INDEX 7
174#define HID_LOCAL_ITEM_TAG_STRING_MINIMUM 8
175#define HID_LOCAL_ITEM_TAG_STRING_MAXIMUM 9
176#define HID_LOCAL_ITEM_TAG_DELIMITER 10
177
178/*
179 * HID usage tables
180 */
181
182#define HID_USAGE_PAGE 0xffff0000
183
184#define HID_UP_UNDEFINED 0x00000000
185#define HID_UP_GENDESK 0x00010000
186#define HID_UP_SIMULATION 0x00020000
187#define HID_UP_KEYBOARD 0x00070000
188#define HID_UP_LED 0x00080000
189#define HID_UP_BUTTON 0x00090000
190#define HID_UP_ORDINAL 0x000a0000
191#define HID_UP_CONSUMER 0x000c0000
192#define HID_UP_DIGITIZER 0x000d0000
193#define HID_UP_PID 0x000f0000
194#define HID_UP_HPVENDOR 0xff7f0000
195#define HID_UP_MSVENDOR 0xff000000
196#define HID_UP_CUSTOM 0x00ff0000
197#define HID_UP_LOGIVENDOR 0xffbc0000
198
199#define HID_USAGE 0x0000ffff
200
201#define HID_GD_POINTER 0x00010001
202#define HID_GD_MOUSE 0x00010002
203#define HID_GD_JOYSTICK 0x00010004
204#define HID_GD_GAMEPAD 0x00010005
205#define HID_GD_KEYBOARD 0x00010006
206#define HID_GD_KEYPAD 0x00010007
207#define HID_GD_MULTIAXIS 0x00010008
208#define HID_GD_X 0x00010030
209#define HID_GD_Y 0x00010031
210#define HID_GD_Z 0x00010032
211#define HID_GD_RX 0x00010033
212#define HID_GD_RY 0x00010034
213#define HID_GD_RZ 0x00010035
214#define HID_GD_SLIDER 0x00010036
215#define HID_GD_DIAL 0x00010037
216#define HID_GD_WHEEL 0x00010038
217#define HID_GD_HATSWITCH 0x00010039
218#define HID_GD_BUFFER 0x0001003a
219#define HID_GD_BYTECOUNT 0x0001003b
220#define HID_GD_MOTION 0x0001003c
221#define HID_GD_START 0x0001003d
222#define HID_GD_SELECT 0x0001003e
223#define HID_GD_VX 0x00010040
224#define HID_GD_VY 0x00010041
225#define HID_GD_VZ 0x00010042
226#define HID_GD_VBRX 0x00010043
227#define HID_GD_VBRY 0x00010044
228#define HID_GD_VBRZ 0x00010045
229#define HID_GD_VNO 0x00010046
230#define HID_GD_FEATURE 0x00010047
231#define HID_GD_UP 0x00010090
232#define HID_GD_DOWN 0x00010091
233#define HID_GD_RIGHT 0x00010092
234#define HID_GD_LEFT 0x00010093
235
236/*
237 * HID report types --- Ouch! HID spec says 1 2 3!
238 */
239
240#define HID_INPUT_REPORT 0
241#define HID_OUTPUT_REPORT 1
242#define HID_FEATURE_REPORT 2
243
244/*
245 * HID device quirks.
246 */
247
248#define HID_QUIRK_INVERT 0x00000001
249#define HID_QUIRK_NOTOUCH 0x00000002
250#define HID_QUIRK_IGNORE 0x00000004
251#define HID_QUIRK_NOGET 0x00000008
252#define HID_QUIRK_HIDDEV 0x00000010
253#define HID_QUIRK_BADPAD 0x00000020
254#define HID_QUIRK_MULTI_INPUT 0x00000040
255#define HID_QUIRK_2WHEEL_MOUSE_HACK_7 0x00000080
256#define HID_QUIRK_2WHEEL_MOUSE_HACK_5 0x00000100
257#define HID_QUIRK_2WHEEL_MOUSE_HACK_ON 0x00000200
258#define HID_QUIRK_MIGHTYMOUSE 0x00000400
259#define HID_QUIRK_CYMOTION 0x00000800
260#define HID_QUIRK_POWERBOOK_HAS_FN 0x00001000
261#define HID_QUIRK_POWERBOOK_FN_ON 0x00002000
262#define HID_QUIRK_INVERT_HWHEEL 0x00004000
263#define HID_QUIRK_POWERBOOK_ISO_KEYBOARD 0x00008000
264#define HID_QUIRK_BAD_RELATIVE_KEYS 0x00010000
265
266/*
267 * This is the global environment of the parser. This information is
268 * persistent for main-items. The global environment can be saved and
269 * restored with PUSH/POP statements.
270 */
271
272struct hid_global {
273 unsigned usage_page;
274 __s32 logical_minimum;
275 __s32 logical_maximum;
276 __s32 physical_minimum;
277 __s32 physical_maximum;
278 __s32 unit_exponent;
279 unsigned unit;
280 unsigned report_id;
281 unsigned report_size;
282 unsigned report_count;
283};
284
285/*
286 * This is the local environment. It is persistent up the next main-item.
287 */
288
289#define HID_MAX_DESCRIPTOR_SIZE 4096
290#define HID_MAX_USAGES 1024
291#define HID_DEFAULT_NUM_COLLECTIONS 16
292
293struct hid_local {
294 unsigned usage[HID_MAX_USAGES]; /* usage array */
295 unsigned collection_index[HID_MAX_USAGES]; /* collection index array */
296 unsigned usage_index;
297 unsigned usage_minimum;
298 unsigned delimiter_depth;
299 unsigned delimiter_branch;
300};
301
302/*
303 * This is the collection stack. We climb up the stack to determine
304 * application and function of each field.
305 */
306
307struct hid_collection {
308 unsigned type;
309 unsigned usage;
310 unsigned level;
311};
312
313struct hid_usage {
314 unsigned hid; /* hid usage code */
315 unsigned collection_index; /* index into collection array */
316 /* hidinput data */
317 __u16 code; /* input driver code */
318 __u8 type; /* input driver type */
319 __s8 hat_min; /* hat switch fun */
320 __s8 hat_max; /* ditto */
321 __s8 hat_dir; /* ditto */
322};
323
324struct hid_input;
325
326struct hid_field {
327 unsigned physical; /* physical usage for this field */
328 unsigned logical; /* logical usage for this field */
329 unsigned application; /* application usage for this field */
330 struct hid_usage *usage; /* usage table for this function */
331 unsigned maxusage; /* maximum usage index */
332 unsigned flags; /* main-item flags (i.e. volatile,array,constant) */
333 unsigned report_offset; /* bit offset in the report */
334 unsigned report_size; /* size of this field in the report */
335 unsigned report_count; /* number of this field in the report */
336 unsigned report_type; /* (input,output,feature) */
337 __s32 *value; /* last known value(s) */
338 __s32 logical_minimum;
339 __s32 logical_maximum;
340 __s32 physical_minimum;
341 __s32 physical_maximum;
342 __s32 unit_exponent;
343 unsigned unit;
344 struct hid_report *report; /* associated report */
345 unsigned index; /* index into report->field[] */
346 /* hidinput data */
347 struct hid_input *hidinput; /* associated input structure */
348 __u16 dpad; /* dpad input code */
349};
350
351#define HID_MAX_FIELDS 64
352
353struct hid_report {
354 struct list_head list;
355 unsigned id; /* id of this report */
356 unsigned type; /* report type */
357 struct hid_field *field[HID_MAX_FIELDS]; /* fields of the report */
358 unsigned maxfield; /* maximum valid field index */
359 unsigned size; /* size of the report (bits) */
360 struct hid_device *device; /* associated device */
361};
362
363struct hid_report_enum {
364 unsigned numbered;
365 struct list_head report_list;
366 struct hid_report *report_id_hash[256];
367};
368
369#define HID_REPORT_TYPES 3
370
371#define HID_MIN_BUFFER_SIZE 64 /* make sure there is at least a packet size of space */
372#define HID_MAX_BUFFER_SIZE 4096 /* 4kb */
373#define HID_CONTROL_FIFO_SIZE 256 /* to init devices with >100 reports */
374#define HID_OUTPUT_FIFO_SIZE 64
375
376struct hid_control_fifo {
377 unsigned char dir;
378 struct hid_report *report;
379};
380
381#define HID_CLAIMED_INPUT 1
382#define HID_CLAIMED_HIDDEV 2
383
384#define HID_CTRL_RUNNING 1
385#define HID_OUT_RUNNING 2
386#define HID_IN_RUNNING 3
387#define HID_RESET_PENDING 4
388#define HID_SUSPENDED 5
389#define HID_CLEAR_HALT 6
390
391struct hid_input {
392 struct list_head list;
393 struct hid_report *report;
394 struct input_dev *input;
395};
396
397struct hid_device { /* device report descriptor */
398 __u8 *rdesc;
399 unsigned rsize;
400 struct hid_collection *collection; /* List of HID collections */
401 unsigned collection_size; /* Number of allocated hid_collections */
402 unsigned maxcollection; /* Number of parsed collections */
403 unsigned maxapplication; /* Number of applications */
404 unsigned version; /* HID version */
405 unsigned country; /* HID country */
406 struct hid_report_enum report_enum[HID_REPORT_TYPES];
407
408 struct usb_device *dev; /* USB device */
409 struct usb_interface *intf; /* USB interface */
410 int ifnum; /* USB interface number */
411
412 unsigned long iofl; /* I/O flags (CTRL_RUNNING, OUT_RUNNING) */
413 struct timer_list io_retry; /* Retry timer */
414 unsigned long stop_retry; /* Time to give up, in jiffies */
415 unsigned int retry_delay; /* Delay length in ms */
416 struct work_struct reset_work; /* Task context for resets */
417
418 unsigned int bufsize; /* URB buffer size */
419
420 struct urb *urbin; /* Input URB */
421 char *inbuf; /* Input buffer */
422 dma_addr_t inbuf_dma; /* Input buffer dma */
423 spinlock_t inlock; /* Input fifo spinlock */
424
425 struct urb *urbctrl; /* Control URB */
426 struct usb_ctrlrequest *cr; /* Control request struct */
427 dma_addr_t cr_dma; /* Control request struct dma */
428 struct hid_control_fifo ctrl[HID_CONTROL_FIFO_SIZE]; /* Control fifo */
429 unsigned char ctrlhead, ctrltail; /* Control fifo head & tail */
430 char *ctrlbuf; /* Control buffer */
431 dma_addr_t ctrlbuf_dma; /* Control buffer dma */
432 spinlock_t ctrllock; /* Control fifo spinlock */
433
434 struct urb *urbout; /* Output URB */
435 struct hid_report *out[HID_CONTROL_FIFO_SIZE]; /* Output pipe fifo */
436 unsigned char outhead, outtail; /* Output pipe fifo head & tail */
437 char *outbuf; /* Output buffer */
438 dma_addr_t outbuf_dma; /* Output buffer dma */
439 spinlock_t outlock; /* Output fifo spinlock */
440
441 unsigned claimed; /* Claimed by hidinput, hiddev? */
442 unsigned quirks; /* Various quirks the device can pull on us */
443
444 struct list_head inputs; /* The list of inputs */
445 void *hiddev; /* The hiddev structure */
446 int minor; /* Hiddev minor number */
447
448 wait_queue_head_t wait; /* For sleeping */
449
450 int open; /* is the device open by anyone? */
451 char name[128]; /* Device name */
452 char phys[64]; /* Device physical location */
453 char uniq[64]; /* Device unique identifier (serial #) */
454
455#ifdef CONFIG_USB_HIDINPUT_POWERBOOK
456 unsigned long pb_pressed_fn[NBITS(KEY_MAX)];
457 unsigned long pb_pressed_numlock[NBITS(KEY_MAX)];
458#endif
459};
460
461#define HID_GLOBAL_STACK_SIZE 4
462#define HID_COLLECTION_STACK_SIZE 4
463
464struct hid_parser {
465 struct hid_global global;
466 struct hid_global global_stack[HID_GLOBAL_STACK_SIZE];
467 unsigned global_stack_ptr;
468 struct hid_local local;
469 unsigned collection_stack[HID_COLLECTION_STACK_SIZE];
470 unsigned collection_stack_ptr;
471 struct hid_device *device;
472};
473
474struct hid_class_descriptor {
475 __u8 bDescriptorType;
476 __u16 wDescriptorLength;
477} __attribute__ ((packed));
478
479struct hid_descriptor {
480 __u8 bLength;
481 __u8 bDescriptorType;
482 __u16 bcdHID;
483 __u8 bCountryCode;
484 __u8 bNumDescriptors;
485
486 struct hid_class_descriptor desc[1];
487} __attribute__ ((packed));
488
489#ifdef DEBUG
490#include "hid-debug.h"
491#else
492#define hid_dump_input(a,b) do { } while (0)
493#define hid_dump_device(c) do { } while (0)
494#define hid_dump_field(a,b) do { } while (0)
495#define resolv_usage(a) do { } while (0)
496#define resolv_event(a,b) do { } while (0)
497#endif
498
499#endif
500
501#ifdef CONFIG_USB_HIDINPUT
502/* Applications from HID Usage Tables 4/8/99 Version 1.1 */
503/* We ignore a few input applications that are not widely used */
504#define IS_INPUT_APPLICATION(a) (((a >= 0x00010000) && (a <= 0x00010008)) || (a == 0x00010080) || (a == 0x000c0001))
505extern void hidinput_hid_event(struct hid_device *, struct hid_field *, struct hid_usage *, __s32);
506extern void hidinput_report_event(struct hid_device *hid, struct hid_report *report);
507extern int hidinput_connect(struct hid_device *);
508extern void hidinput_disconnect(struct hid_device *);
509#else
510#define IS_INPUT_APPLICATION(a) (0)
511static inline void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value) { }
512static inline void hidinput_report_event(struct hid_device *hid, struct hid_report *report) { }
513static inline int hidinput_connect(struct hid_device *hid) { return -ENODEV; }
514static inline void hidinput_disconnect(struct hid_device *hid) { }
515#endif
516
517int hid_open(struct hid_device *);
518void hid_close(struct hid_device *);
519int hid_set_field(struct hid_field *, unsigned, __s32);
520void hid_submit_report(struct hid_device *, struct hid_report *, unsigned char dir);
521void hid_init_reports(struct hid_device *hid);
522int hid_wait_io(struct hid_device* hid);
523
524
525#ifdef CONFIG_HID_FF
526int hid_ff_init(struct hid_device *hid);
527
528int hid_lgff_init(struct hid_device *hid);
529int hid_tmff_init(struct hid_device *hid);
530int hid_zpff_init(struct hid_device *hid);
531#ifdef CONFIG_HID_PID
532int hid_pidff_init(struct hid_device *hid);
533#else
534static inline int hid_pidff_init(struct hid_device *hid) { return -ENODEV; }
535#endif
536
537#else
538static inline int hid_ff_init(struct hid_device *hid) { return -1; }
539#endif
540
diff --git a/drivers/usb/input/hiddev.c b/drivers/usb/input/hiddev.c
index 7dc14d0cacc1..cbd3b60d93bb 100644
--- a/drivers/usb/input/hiddev.c
+++ b/drivers/usb/input/hiddev.c
@@ -32,8 +32,9 @@
32#include <linux/smp_lock.h> 32#include <linux/smp_lock.h>
33#include <linux/input.h> 33#include <linux/input.h>
34#include <linux/usb.h> 34#include <linux/usb.h>
35#include "hid.h" 35#include <linux/hid.h>
36#include <linux/hiddev.h> 36#include <linux/hiddev.h>
37#include "usbhid.h"
37 38
38#ifdef CONFIG_USB_DYNAMIC_MINORS 39#ifdef CONFIG_USB_DYNAMIC_MINORS
39#define HIDDEV_MINOR_BASE 0 40#define HIDDEV_MINOR_BASE 0