1#ifndef __HID_H
2#define __HID_H
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36#define USB_INTERFACE_CLASS_HID 3
37
38
39
40
41
42#define USB_INTERFACE_SUBCLASS_BOOT 1
43#define USB_INTERFACE_PROTOCOL_KEYBOARD 1
44#define USB_INTERFACE_PROTOCOL_MOUSE 2
45
46
47
48
49
50#define HID_REQ_GET_REPORT 0x01
51#define HID_REQ_GET_IDLE 0x02
52#define HID_REQ_GET_PROTOCOL 0x03
53#define HID_REQ_SET_REPORT 0x09
54#define HID_REQ_SET_IDLE 0x0A
55#define HID_REQ_SET_PROTOCOL 0x0B
56
57
58
59
60
61#define HID_DT_HID (USB_TYPE_CLASS | 0x01)
62#define HID_DT_REPORT (USB_TYPE_CLASS | 0x02)
63#define HID_DT_PHYSICAL (USB_TYPE_CLASS | 0x03)
64
65#define HID_MAX_DESCRIPTOR_SIZE 4096
66
67#ifdef __KERNEL__
68
69#include <linux/types.h>
70#include <linux/slab.h>
71#include <linux/list.h>
72#include <linux/timer.h>
73#include <linux/workqueue.h>
74#include <linux/input.h>
75
76
77
78
79
80
81
82struct hid_item {
83 unsigned format;
84 __u8 size;
85 __u8 type;
86 __u8 tag;
87 union {
88 __u8 u8;
89 __s8 s8;
90 __u16 u16;
91 __s16 s16;
92 __u32 u32;
93 __s32 s32;
94 __u8 *longdata;
95 } data;
96};
97
98
99
100
101
102#define HID_ITEM_FORMAT_SHORT 0
103#define HID_ITEM_FORMAT_LONG 1
104
105
106
107
108
109#define HID_ITEM_TAG_LONG 15
110
111
112
113
114
115#define HID_ITEM_TYPE_MAIN 0
116#define HID_ITEM_TYPE_GLOBAL 1
117#define HID_ITEM_TYPE_LOCAL 2
118#define HID_ITEM_TYPE_RESERVED 3
119
120
121
122
123
124#define HID_MAIN_ITEM_TAG_INPUT 8
125#define HID_MAIN_ITEM_TAG_OUTPUT 9
126#define HID_MAIN_ITEM_TAG_FEATURE 11
127#define HID_MAIN_ITEM_TAG_BEGIN_COLLECTION 10
128#define HID_MAIN_ITEM_TAG_END_COLLECTION 12
129
130
131
132
133
134#define HID_MAIN_ITEM_CONSTANT 0x001
135#define HID_MAIN_ITEM_VARIABLE 0x002
136#define HID_MAIN_ITEM_RELATIVE 0x004
137#define HID_MAIN_ITEM_WRAP 0x008
138#define HID_MAIN_ITEM_NONLINEAR 0x010
139#define HID_MAIN_ITEM_NO_PREFERRED 0x020
140#define HID_MAIN_ITEM_NULL_STATE 0x040
141#define HID_MAIN_ITEM_VOLATILE 0x080
142#define HID_MAIN_ITEM_BUFFERED_BYTE 0x100
143
144
145
146
147
148#define HID_COLLECTION_PHYSICAL 0
149#define HID_COLLECTION_APPLICATION 1
150#define HID_COLLECTION_LOGICAL 2
151
152
153
154
155
156#define HID_GLOBAL_ITEM_TAG_USAGE_PAGE 0
157#define HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM 1
158#define HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM 2
159#define HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM 3
160#define HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM 4
161#define HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT 5
162#define HID_GLOBAL_ITEM_TAG_UNIT 6
163#define HID_GLOBAL_ITEM_TAG_REPORT_SIZE 7
164#define HID_GLOBAL_ITEM_TAG_REPORT_ID 8
165#define HID_GLOBAL_ITEM_TAG_REPORT_COUNT 9
166#define HID_GLOBAL_ITEM_TAG_PUSH 10
167#define HID_GLOBAL_ITEM_TAG_POP 11
168
169
170
171
172
173#define HID_LOCAL_ITEM_TAG_USAGE 0
174#define HID_LOCAL_ITEM_TAG_USAGE_MINIMUM 1
175#define HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM 2
176#define HID_LOCAL_ITEM_TAG_DESIGNATOR_INDEX 3
177#define HID_LOCAL_ITEM_TAG_DESIGNATOR_MINIMUM 4
178#define HID_LOCAL_ITEM_TAG_DESIGNATOR_MAXIMUM 5
179#define HID_LOCAL_ITEM_TAG_STRING_INDEX 7
180#define HID_LOCAL_ITEM_TAG_STRING_MINIMUM 8
181#define HID_LOCAL_ITEM_TAG_STRING_MAXIMUM 9
182#define HID_LOCAL_ITEM_TAG_DELIMITER 10
183
184
185
186
187
188#define HID_USAGE_PAGE 0xffff0000
189
190#define HID_UP_UNDEFINED 0x00000000
191#define HID_UP_GENDESK 0x00010000
192#define HID_UP_SIMULATION 0x00020000
193#define HID_UP_KEYBOARD 0x00070000
194#define HID_UP_LED 0x00080000
195#define HID_UP_BUTTON 0x00090000
196#define HID_UP_ORDINAL 0x000a0000
197#define HID_UP_CONSUMER 0x000c0000
198#define HID_UP_DIGITIZER 0x000d0000
199#define HID_UP_PID 0x000f0000
200#define HID_UP_HPVENDOR 0xff7f0000
201#define HID_UP_MSVENDOR 0xff000000
202#define HID_UP_CUSTOM 0x00ff0000
203#define HID_UP_LOGIVENDOR 0xffbc0000
204
205#define HID_USAGE 0x0000ffff
206
207#define HID_GD_POINTER 0x00010001
208#define HID_GD_MOUSE 0x00010002
209#define HID_GD_JOYSTICK 0x00010004
210#define HID_GD_GAMEPAD 0x00010005
211#define HID_GD_KEYBOARD 0x00010006
212#define HID_GD_KEYPAD 0x00010007
213#define HID_GD_MULTIAXIS 0x00010008
214#define HID_GD_X 0x00010030
215#define HID_GD_Y 0x00010031
216#define HID_GD_Z 0x00010032
217#define HID_GD_RX 0x00010033
218#define HID_GD_RY 0x00010034
219#define HID_GD_RZ 0x00010035
220#define HID_GD_SLIDER 0x00010036
221#define HID_GD_DIAL 0x00010037
222#define HID_GD_WHEEL 0x00010038
223#define HID_GD_HATSWITCH 0x00010039
224#define HID_GD_BUFFER 0x0001003a
225#define HID_GD_BYTECOUNT 0x0001003b
226#define HID_GD_MOTION 0x0001003c
227#define HID_GD_START 0x0001003d
228#define HID_GD_SELECT 0x0001003e
229#define HID_GD_VX 0x00010040
230#define HID_GD_VY 0x00010041
231#define HID_GD_VZ 0x00010042
232#define HID_GD_VBRX 0x00010043
233#define HID_GD_VBRY 0x00010044
234#define HID_GD_VBRZ 0x00010045
235#define HID_GD_VNO 0x00010046
236#define HID_GD_FEATURE 0x00010047
237#define HID_GD_UP 0x00010090
238#define HID_GD_DOWN 0x00010091
239#define HID_GD_RIGHT 0x00010092
240#define HID_GD_LEFT 0x00010093
241
242
243
244
245
246#define HID_INPUT_REPORT 0
247#define HID_OUTPUT_REPORT 1
248#define HID_FEATURE_REPORT 2
249
250
251
252
253
254
255
256
257#define MAX_USBHID_BOOT_QUIRKS 4
258
259#define HID_QUIRK_INVERT 0x00000001
260#define HID_QUIRK_NOTOUCH 0x00000002
261#define HID_QUIRK_IGNORE 0x00000004
262#define HID_QUIRK_NOGET 0x00000008
263#define HID_QUIRK_HIDDEV 0x00000010
264#define HID_QUIRK_BADPAD 0x00000020
265#define HID_QUIRK_MULTI_INPUT 0x00000040
266#define HID_QUIRK_2WHEEL_MOUSE_HACK_7 0x00000080
267#define HID_QUIRK_2WHEEL_MOUSE_HACK_5 0x00000100
268#define HID_QUIRK_2WHEEL_MOUSE_HACK_ON 0x00000200
269#define HID_QUIRK_MIGHTYMOUSE 0x00000400
270#define HID_QUIRK_POWERBOOK_HAS_FN 0x00000800
271#define HID_QUIRK_POWERBOOK_FN_ON 0x00001000
272#define HID_QUIRK_INVERT_HWHEEL 0x00002000
273#define HID_QUIRK_POWERBOOK_ISO_KEYBOARD 0x00004000
274#define HID_QUIRK_BAD_RELATIVE_KEYS 0x00008000
275#define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000
276#define HID_QUIRK_IGNORE_MOUSE 0x00020000
277#define HID_QUIRK_SONY_PS3_CONTROLLER 0x00040000
278#define HID_QUIRK_DUPLICATE_USAGES 0x00080000
279#define HID_QUIRK_RESET_LEDS 0x00100000
280#define HID_QUIRK_HIDINPUT 0x00200000
281#define HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL 0x00400000
282#define HID_QUIRK_LOGITECH_EXPANDED_KEYMAP 0x00800000
283#define HID_QUIRK_IGNORE_HIDINPUT 0x01000000
284
285
286
287
288
289#define HID_QUIRK_RDESC_CYMOTION 0x00000001
290#define HID_QUIRK_RDESC_LOGITECH 0x00000002
291#define HID_QUIRK_RDESC_SWAPPED_MIN_MAX 0x00000004
292#define HID_QUIRK_RDESC_PETALYNX 0x00000008
293#define HID_QUIRK_RDESC_MACBOOK_JIS 0x00000010
294
295
296
297
298
299
300
301struct hid_global {
302 unsigned usage_page;
303 __s32 logical_minimum;
304 __s32 logical_maximum;
305 __s32 physical_minimum;
306 __s32 physical_maximum;
307 __s32 unit_exponent;
308 unsigned unit;
309 unsigned report_id;
310 unsigned report_size;
311 unsigned report_count;
312};
313
314
315
316
317
318#define HID_MAX_USAGES 8192
319#define HID_DEFAULT_NUM_COLLECTIONS 16
320
321struct hid_local {
322 unsigned usage[HID_MAX_USAGES];
323 unsigned collection_index[HID_MAX_USAGES];
324 unsigned usage_index;
325 unsigned usage_minimum;
326 unsigned delimiter_depth;
327 unsigned delimiter_branch;
328};
329
330
331
332
333
334
335struct hid_collection {
336 unsigned type;
337 unsigned usage;
338 unsigned level;
339};
340
341struct hid_usage {
342 unsigned hid;
343 unsigned collection_index;
344
345 __u16 code;
346 __u8 type;
347 __s8 hat_min;
348 __s8 hat_max;
349 __s8 hat_dir;
350};
351
352struct hid_input;
353
354struct hid_field {
355 unsigned physical;
356 unsigned logical;
357 unsigned application;
358 struct hid_usage *usage;
359 unsigned maxusage;
360 unsigned flags;
361 unsigned report_offset;
362 unsigned report_size;
363 unsigned report_count;
364 unsigned report_type;
365 __s32 *value;
366 __s32 logical_minimum;
367 __s32 logical_maximum;
368 __s32 physical_minimum;
369 __s32 physical_maximum;
370 __s32 unit_exponent;
371 unsigned unit;
372 struct hid_report *report;
373 unsigned index;
374
375 struct hid_input *hidinput;
376 __u16 dpad;
377};
378
379#define HID_MAX_FIELDS 64
380
381struct hid_report {
382 struct list_head list;
383 unsigned id;
384 unsigned type;
385 struct hid_field *field[HID_MAX_FIELDS];
386 unsigned maxfield;
387 unsigned size;
388 struct hid_device *device;
389};
390
391struct hid_report_enum {
392 unsigned numbered;
393 struct list_head report_list;
394 struct hid_report *report_id_hash[256];
395};
396
397#define HID_REPORT_TYPES 3
398
399#define HID_MIN_BUFFER_SIZE 64
400#define HID_MAX_BUFFER_SIZE 4096
401#define HID_CONTROL_FIFO_SIZE 256
402#define HID_OUTPUT_FIFO_SIZE 64
403
404struct hid_control_fifo {
405 unsigned char dir;
406 struct hid_report *report;
407};
408
409#define HID_CLAIMED_INPUT 1
410#define HID_CLAIMED_HIDDEV 2
411#define HID_CLAIMED_HIDRAW 4
412
413#define HID_CTRL_RUNNING 1
414#define HID_OUT_RUNNING 2
415#define HID_IN_RUNNING 3
416#define HID_RESET_PENDING 4
417#define HID_SUSPENDED 5
418#define HID_CLEAR_HALT 6
419
420struct hid_input {
421 struct list_head list;
422 struct hid_report *report;
423 struct input_dev *input;
424};
425
426struct hid_device {
427 __u8 *rdesc;
428 unsigned rsize;
429 struct hid_collection *collection;
430 unsigned collection_size;
431 unsigned maxcollection;
432 unsigned maxapplication;
433 unsigned short bus;
434 unsigned short vendor;
435 unsigned short product;
436 unsigned version;
437 unsigned country;
438 struct hid_report_enum report_enum[HID_REPORT_TYPES];
439
440 struct device *dev;
441
442 unsigned claimed;
443 unsigned quirks;
444
445 struct list_head inputs;
446 void *hiddev;
447 void *hidraw;
448 int minor;
449
450 wait_queue_head_t wait;
451
452 int open;
453 char name[128];
454 char phys[64];
455 char uniq[64];
456
457 void *driver_data;
458
459
460 int (*hidinput_input_event) (struct input_dev *, unsigned int, unsigned int, int);
461 int (*hid_open) (struct hid_device *);
462 void (*hid_close) (struct hid_device *);
463
464
465 void (*hiddev_hid_event) (struct hid_device *, struct hid_field *field,
466 struct hid_usage *, __s32);
467 void (*hiddev_report_event) (struct hid_device *, struct hid_report *);
468
469
470 int (*hid_output_raw_report) (struct hid_device *, __u8 *, size_t);
471#ifdef CONFIG_USB_HIDINPUT_POWERBOOK
472 unsigned long pb_pressed_fn[BITS_TO_LONGS(KEY_CNT)];
473 unsigned long pb_pressed_numlock[BITS_TO_LONGS(KEY_CNT)];
474#endif
475};
476
477#define HID_GLOBAL_STACK_SIZE 4
478#define HID_COLLECTION_STACK_SIZE 4
479
480struct hid_parser {
481 struct hid_global global;
482 struct hid_global global_stack[HID_GLOBAL_STACK_SIZE];
483 unsigned global_stack_ptr;
484 struct hid_local local;
485 unsigned collection_stack[HID_COLLECTION_STACK_SIZE];
486 unsigned collection_stack_ptr;
487 struct hid_device *device;
488};
489
490struct hid_class_descriptor {
491 __u8 bDescriptorType;
492 __u16 wDescriptorLength;
493} __attribute__ ((packed));
494
495struct hid_descriptor {
496 __u8 bLength;
497 __u8 bDescriptorType;
498 __u16 bcdHID;
499 __u8 bCountryCode;
500 __u8 bNumDescriptors;
501
502 struct hid_class_descriptor desc[1];
503} __attribute__ ((packed));
504
505
506
507#define IS_INPUT_APPLICATION(a) (((a >= 0x00010000) && (a <= 0x00010008)) || (a == 0x00010080) || (a == 0x000c0001))
508
509
510
511#ifdef CONFIG_HID_DEBUG
512extern int hid_debug;
513#endif
514
515extern void hidinput_hid_event(struct hid_device *, struct hid_field *, struct hid_usage *, __s32);
516extern void hidinput_report_event(struct hid_device *hid, struct hid_report *report);
517extern int hidinput_connect(struct hid_device *);
518extern void hidinput_disconnect(struct hid_device *);
519
520int hid_set_field(struct hid_field *, unsigned, __s32);
521int hid_input_report(struct hid_device *, int type, u8 *, int, int);
522int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field);
523void hid_input_field(struct hid_device *hid, struct hid_field *field, __u8 *data, int interrupt);
524void hid_output_report(struct hid_report *report, __u8 *data);
525void hid_free_device(struct hid_device *device);
526struct hid_device *hid_parse_report(__u8 *start, unsigned size);
527
528
529u32 usbhid_lookup_quirk(const u16 idVendor, const u16 idProduct);
530int usbhid_modify_dquirk(const u16 idVendor, const u16 idProduct, const u32 quirks);
531int usbhid_quirks_init(char **quirks_param);
532void usbhid_quirks_exit(void);
533void usbhid_fixup_report_descriptor(const u16, const u16, char *, unsigned, char **);
534
535#ifdef CONFIG_HID_FF
536int hid_ff_init(struct hid_device *hid);
537
538int hid_lgff_init(struct hid_device *hid);
539int hid_plff_init(struct hid_device *hid);
540int hid_tmff_init(struct hid_device *hid);
541int hid_zpff_init(struct hid_device *hid);
542#ifdef CONFIG_HID_PID
543int hid_pidff_init(struct hid_device *hid);
544#else
545static inline int hid_pidff_init(struct hid_device *hid) { return -ENODEV; }
546#endif
547
548#else
549static inline int hid_ff_init(struct hid_device *hid) { return -1; }
550#endif
551
552#ifdef CONFIG_HID_DEBUG
553#define dbg_hid(format, arg...) if (hid_debug) \
554 printk(KERN_DEBUG "%s: " format ,\
555 __FILE__ , ## arg)
556#define dbg_hid_line(format, arg...) if (hid_debug) \
557 printk(format, ## arg)
558#else
559#define dbg_hid(format, arg...) do {} while (0)
560#define dbg_hid_line dbg_hid
561#endif
562
563#define err_hid(format, arg...) printk(KERN_ERR "%s: " format "\n" , \
564 __FILE__ , ## arg)
565#endif
566#endif
567
568