Commit 3ffb62cb9ac2430c2504c6ff9727d0f2476ef0bd
Committed by
Dmitry Torokhov
1 parent
3dde22a98e
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
Input: xpad - handle all variations of Mad Catz Beat Pad
The device should be handled by xpad driver instead of generic HID driver. Signed-off-by: Yuri Khan <yurivkhan@gmail.com> Acked-by: Jiri Kosina <jkosina@suse.cz> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Showing 3 changed files with 5 additions and 0 deletions Inline Diff
drivers/hid/hid-core.c
1 | /* | 1 | /* |
2 | * HID support for Linux | 2 | * HID support for Linux |
3 | * | 3 | * |
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-2012 Jiri Kosina | 7 | * Copyright (c) 2006-2012 Jiri Kosina |
8 | */ | 8 | */ |
9 | 9 | ||
10 | /* | 10 | /* |
11 | * This program is free software; you can redistribute it and/or modify it | 11 | * This program is free software; you can redistribute it and/or modify it |
12 | * under the terms of the GNU General Public License as published by the Free | 12 | * under the terms of the GNU General Public License as published by the Free |
13 | * Software Foundation; either version 2 of the License, or (at your option) | 13 | * Software Foundation; either version 2 of the License, or (at your option) |
14 | * any later version. | 14 | * any later version. |
15 | */ | 15 | */ |
16 | 16 | ||
17 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | 17 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
18 | 18 | ||
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/slab.h> | 20 | #include <linux/slab.h> |
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/kernel.h> | 22 | #include <linux/kernel.h> |
23 | #include <linux/list.h> | 23 | #include <linux/list.h> |
24 | #include <linux/mm.h> | 24 | #include <linux/mm.h> |
25 | #include <linux/spinlock.h> | 25 | #include <linux/spinlock.h> |
26 | #include <asm/unaligned.h> | 26 | #include <asm/unaligned.h> |
27 | #include <asm/byteorder.h> | 27 | #include <asm/byteorder.h> |
28 | #include <linux/input.h> | 28 | #include <linux/input.h> |
29 | #include <linux/wait.h> | 29 | #include <linux/wait.h> |
30 | #include <linux/vmalloc.h> | 30 | #include <linux/vmalloc.h> |
31 | #include <linux/sched.h> | 31 | #include <linux/sched.h> |
32 | #include <linux/semaphore.h> | 32 | #include <linux/semaphore.h> |
33 | 33 | ||
34 | #include <linux/hid.h> | 34 | #include <linux/hid.h> |
35 | #include <linux/hiddev.h> | 35 | #include <linux/hiddev.h> |
36 | #include <linux/hid-debug.h> | 36 | #include <linux/hid-debug.h> |
37 | #include <linux/hidraw.h> | 37 | #include <linux/hidraw.h> |
38 | 38 | ||
39 | #include "hid-ids.h" | 39 | #include "hid-ids.h" |
40 | 40 | ||
41 | /* | 41 | /* |
42 | * Version Information | 42 | * Version Information |
43 | */ | 43 | */ |
44 | 44 | ||
45 | #define DRIVER_DESC "HID core driver" | 45 | #define DRIVER_DESC "HID core driver" |
46 | #define DRIVER_LICENSE "GPL" | 46 | #define DRIVER_LICENSE "GPL" |
47 | 47 | ||
48 | int hid_debug = 0; | 48 | int hid_debug = 0; |
49 | module_param_named(debug, hid_debug, int, 0600); | 49 | module_param_named(debug, hid_debug, int, 0600); |
50 | MODULE_PARM_DESC(debug, "toggle HID debugging messages"); | 50 | MODULE_PARM_DESC(debug, "toggle HID debugging messages"); |
51 | EXPORT_SYMBOL_GPL(hid_debug); | 51 | EXPORT_SYMBOL_GPL(hid_debug); |
52 | 52 | ||
53 | static int hid_ignore_special_drivers = 0; | 53 | static int hid_ignore_special_drivers = 0; |
54 | module_param_named(ignore_special_drivers, hid_ignore_special_drivers, int, 0600); | 54 | module_param_named(ignore_special_drivers, hid_ignore_special_drivers, int, 0600); |
55 | MODULE_PARM_DESC(debug, "Ignore any special drivers and handle all devices by generic driver"); | 55 | MODULE_PARM_DESC(debug, "Ignore any special drivers and handle all devices by generic driver"); |
56 | 56 | ||
57 | /* | 57 | /* |
58 | * Register a new report for a device. | 58 | * Register a new report for a device. |
59 | */ | 59 | */ |
60 | 60 | ||
61 | struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id) | 61 | struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id) |
62 | { | 62 | { |
63 | struct hid_report_enum *report_enum = device->report_enum + type; | 63 | struct hid_report_enum *report_enum = device->report_enum + type; |
64 | struct hid_report *report; | 64 | struct hid_report *report; |
65 | 65 | ||
66 | if (report_enum->report_id_hash[id]) | 66 | if (report_enum->report_id_hash[id]) |
67 | return report_enum->report_id_hash[id]; | 67 | return report_enum->report_id_hash[id]; |
68 | 68 | ||
69 | report = kzalloc(sizeof(struct hid_report), GFP_KERNEL); | 69 | report = kzalloc(sizeof(struct hid_report), GFP_KERNEL); |
70 | if (!report) | 70 | if (!report) |
71 | return NULL; | 71 | return NULL; |
72 | 72 | ||
73 | if (id != 0) | 73 | if (id != 0) |
74 | report_enum->numbered = 1; | 74 | report_enum->numbered = 1; |
75 | 75 | ||
76 | report->id = id; | 76 | report->id = id; |
77 | report->type = type; | 77 | report->type = type; |
78 | report->size = 0; | 78 | report->size = 0; |
79 | report->device = device; | 79 | report->device = device; |
80 | report_enum->report_id_hash[id] = report; | 80 | report_enum->report_id_hash[id] = report; |
81 | 81 | ||
82 | list_add_tail(&report->list, &report_enum->report_list); | 82 | list_add_tail(&report->list, &report_enum->report_list); |
83 | 83 | ||
84 | return report; | 84 | return report; |
85 | } | 85 | } |
86 | EXPORT_SYMBOL_GPL(hid_register_report); | 86 | EXPORT_SYMBOL_GPL(hid_register_report); |
87 | 87 | ||
88 | /* | 88 | /* |
89 | * Register a new field for this report. | 89 | * Register a new field for this report. |
90 | */ | 90 | */ |
91 | 91 | ||
92 | static struct hid_field *hid_register_field(struct hid_report *report, unsigned usages, unsigned values) | 92 | static struct hid_field *hid_register_field(struct hid_report *report, unsigned usages, unsigned values) |
93 | { | 93 | { |
94 | struct hid_field *field; | 94 | struct hid_field *field; |
95 | 95 | ||
96 | if (report->maxfield == HID_MAX_FIELDS) { | 96 | if (report->maxfield == HID_MAX_FIELDS) { |
97 | hid_err(report->device, "too many fields in report\n"); | 97 | hid_err(report->device, "too many fields in report\n"); |
98 | return NULL; | 98 | return NULL; |
99 | } | 99 | } |
100 | 100 | ||
101 | field = kzalloc((sizeof(struct hid_field) + | 101 | field = kzalloc((sizeof(struct hid_field) + |
102 | usages * sizeof(struct hid_usage) + | 102 | usages * sizeof(struct hid_usage) + |
103 | values * sizeof(unsigned)), GFP_KERNEL); | 103 | values * sizeof(unsigned)), GFP_KERNEL); |
104 | if (!field) | 104 | if (!field) |
105 | return NULL; | 105 | return NULL; |
106 | 106 | ||
107 | field->index = report->maxfield++; | 107 | field->index = report->maxfield++; |
108 | report->field[field->index] = field; | 108 | report->field[field->index] = field; |
109 | field->usage = (struct hid_usage *)(field + 1); | 109 | field->usage = (struct hid_usage *)(field + 1); |
110 | field->value = (s32 *)(field->usage + usages); | 110 | field->value = (s32 *)(field->usage + usages); |
111 | field->report = report; | 111 | field->report = report; |
112 | 112 | ||
113 | return field; | 113 | return field; |
114 | } | 114 | } |
115 | 115 | ||
116 | /* | 116 | /* |
117 | * Open a collection. The type/usage is pushed on the stack. | 117 | * Open a collection. The type/usage is pushed on the stack. |
118 | */ | 118 | */ |
119 | 119 | ||
120 | static int open_collection(struct hid_parser *parser, unsigned type) | 120 | static int open_collection(struct hid_parser *parser, unsigned type) |
121 | { | 121 | { |
122 | struct hid_collection *collection; | 122 | struct hid_collection *collection; |
123 | unsigned usage; | 123 | unsigned usage; |
124 | 124 | ||
125 | usage = parser->local.usage[0]; | 125 | usage = parser->local.usage[0]; |
126 | 126 | ||
127 | if (parser->collection_stack_ptr == HID_COLLECTION_STACK_SIZE) { | 127 | if (parser->collection_stack_ptr == HID_COLLECTION_STACK_SIZE) { |
128 | hid_err(parser->device, "collection stack overflow\n"); | 128 | hid_err(parser->device, "collection stack overflow\n"); |
129 | return -1; | 129 | return -1; |
130 | } | 130 | } |
131 | 131 | ||
132 | if (parser->device->maxcollection == parser->device->collection_size) { | 132 | if (parser->device->maxcollection == parser->device->collection_size) { |
133 | collection = kmalloc(sizeof(struct hid_collection) * | 133 | collection = kmalloc(sizeof(struct hid_collection) * |
134 | parser->device->collection_size * 2, GFP_KERNEL); | 134 | parser->device->collection_size * 2, GFP_KERNEL); |
135 | if (collection == NULL) { | 135 | if (collection == NULL) { |
136 | hid_err(parser->device, "failed to reallocate collection array\n"); | 136 | hid_err(parser->device, "failed to reallocate collection array\n"); |
137 | return -1; | 137 | return -1; |
138 | } | 138 | } |
139 | memcpy(collection, parser->device->collection, | 139 | memcpy(collection, parser->device->collection, |
140 | sizeof(struct hid_collection) * | 140 | sizeof(struct hid_collection) * |
141 | parser->device->collection_size); | 141 | parser->device->collection_size); |
142 | memset(collection + parser->device->collection_size, 0, | 142 | memset(collection + parser->device->collection_size, 0, |
143 | sizeof(struct hid_collection) * | 143 | sizeof(struct hid_collection) * |
144 | parser->device->collection_size); | 144 | parser->device->collection_size); |
145 | kfree(parser->device->collection); | 145 | kfree(parser->device->collection); |
146 | parser->device->collection = collection; | 146 | parser->device->collection = collection; |
147 | parser->device->collection_size *= 2; | 147 | parser->device->collection_size *= 2; |
148 | } | 148 | } |
149 | 149 | ||
150 | parser->collection_stack[parser->collection_stack_ptr++] = | 150 | parser->collection_stack[parser->collection_stack_ptr++] = |
151 | parser->device->maxcollection; | 151 | parser->device->maxcollection; |
152 | 152 | ||
153 | collection = parser->device->collection + | 153 | collection = parser->device->collection + |
154 | parser->device->maxcollection++; | 154 | parser->device->maxcollection++; |
155 | collection->type = type; | 155 | collection->type = type; |
156 | collection->usage = usage; | 156 | collection->usage = usage; |
157 | collection->level = parser->collection_stack_ptr - 1; | 157 | collection->level = parser->collection_stack_ptr - 1; |
158 | 158 | ||
159 | if (type == HID_COLLECTION_APPLICATION) | 159 | if (type == HID_COLLECTION_APPLICATION) |
160 | parser->device->maxapplication++; | 160 | parser->device->maxapplication++; |
161 | 161 | ||
162 | return 0; | 162 | return 0; |
163 | } | 163 | } |
164 | 164 | ||
165 | /* | 165 | /* |
166 | * Close a collection. | 166 | * Close a collection. |
167 | */ | 167 | */ |
168 | 168 | ||
169 | static int close_collection(struct hid_parser *parser) | 169 | static int close_collection(struct hid_parser *parser) |
170 | { | 170 | { |
171 | if (!parser->collection_stack_ptr) { | 171 | if (!parser->collection_stack_ptr) { |
172 | hid_err(parser->device, "collection stack underflow\n"); | 172 | hid_err(parser->device, "collection stack underflow\n"); |
173 | return -1; | 173 | return -1; |
174 | } | 174 | } |
175 | parser->collection_stack_ptr--; | 175 | parser->collection_stack_ptr--; |
176 | return 0; | 176 | return 0; |
177 | } | 177 | } |
178 | 178 | ||
179 | /* | 179 | /* |
180 | * Climb up the stack, search for the specified collection type | 180 | * Climb up the stack, search for the specified collection type |
181 | * and return the usage. | 181 | * and return the usage. |
182 | */ | 182 | */ |
183 | 183 | ||
184 | static unsigned hid_lookup_collection(struct hid_parser *parser, unsigned type) | 184 | static unsigned hid_lookup_collection(struct hid_parser *parser, unsigned type) |
185 | { | 185 | { |
186 | struct hid_collection *collection = parser->device->collection; | 186 | struct hid_collection *collection = parser->device->collection; |
187 | int n; | 187 | int n; |
188 | 188 | ||
189 | for (n = parser->collection_stack_ptr - 1; n >= 0; n--) { | 189 | for (n = parser->collection_stack_ptr - 1; n >= 0; n--) { |
190 | unsigned index = parser->collection_stack[n]; | 190 | unsigned index = parser->collection_stack[n]; |
191 | if (collection[index].type == type) | 191 | if (collection[index].type == type) |
192 | return collection[index].usage; | 192 | return collection[index].usage; |
193 | } | 193 | } |
194 | return 0; /* we know nothing about this usage type */ | 194 | return 0; /* we know nothing about this usage type */ |
195 | } | 195 | } |
196 | 196 | ||
197 | /* | 197 | /* |
198 | * Add a usage to the temporary parser table. | 198 | * Add a usage to the temporary parser table. |
199 | */ | 199 | */ |
200 | 200 | ||
201 | static int hid_add_usage(struct hid_parser *parser, unsigned usage) | 201 | static int hid_add_usage(struct hid_parser *parser, unsigned usage) |
202 | { | 202 | { |
203 | if (parser->local.usage_index >= HID_MAX_USAGES) { | 203 | if (parser->local.usage_index >= HID_MAX_USAGES) { |
204 | hid_err(parser->device, "usage index exceeded\n"); | 204 | hid_err(parser->device, "usage index exceeded\n"); |
205 | return -1; | 205 | return -1; |
206 | } | 206 | } |
207 | parser->local.usage[parser->local.usage_index] = usage; | 207 | parser->local.usage[parser->local.usage_index] = usage; |
208 | parser->local.collection_index[parser->local.usage_index] = | 208 | parser->local.collection_index[parser->local.usage_index] = |
209 | parser->collection_stack_ptr ? | 209 | parser->collection_stack_ptr ? |
210 | parser->collection_stack[parser->collection_stack_ptr - 1] : 0; | 210 | parser->collection_stack[parser->collection_stack_ptr - 1] : 0; |
211 | parser->local.usage_index++; | 211 | parser->local.usage_index++; |
212 | return 0; | 212 | return 0; |
213 | } | 213 | } |
214 | 214 | ||
215 | /* | 215 | /* |
216 | * Register a new field for this report. | 216 | * Register a new field for this report. |
217 | */ | 217 | */ |
218 | 218 | ||
219 | static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsigned flags) | 219 | static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsigned flags) |
220 | { | 220 | { |
221 | struct hid_report *report; | 221 | struct hid_report *report; |
222 | struct hid_field *field; | 222 | struct hid_field *field; |
223 | int usages; | 223 | int usages; |
224 | unsigned offset; | 224 | unsigned offset; |
225 | int i; | 225 | int i; |
226 | 226 | ||
227 | report = hid_register_report(parser->device, report_type, parser->global.report_id); | 227 | report = hid_register_report(parser->device, report_type, parser->global.report_id); |
228 | if (!report) { | 228 | if (!report) { |
229 | hid_err(parser->device, "hid_register_report failed\n"); | 229 | hid_err(parser->device, "hid_register_report failed\n"); |
230 | return -1; | 230 | return -1; |
231 | } | 231 | } |
232 | 232 | ||
233 | if (parser->global.logical_maximum < parser->global.logical_minimum) { | 233 | if (parser->global.logical_maximum < parser->global.logical_minimum) { |
234 | hid_err(parser->device, "logical range invalid %d %d\n", | 234 | hid_err(parser->device, "logical range invalid %d %d\n", |
235 | parser->global.logical_minimum, parser->global.logical_maximum); | 235 | parser->global.logical_minimum, parser->global.logical_maximum); |
236 | return -1; | 236 | return -1; |
237 | } | 237 | } |
238 | 238 | ||
239 | offset = report->size; | 239 | offset = report->size; |
240 | report->size += parser->global.report_size * parser->global.report_count; | 240 | report->size += parser->global.report_size * parser->global.report_count; |
241 | 241 | ||
242 | if (!parser->local.usage_index) /* Ignore padding fields */ | 242 | if (!parser->local.usage_index) /* Ignore padding fields */ |
243 | return 0; | 243 | return 0; |
244 | 244 | ||
245 | usages = max_t(int, parser->local.usage_index, parser->global.report_count); | 245 | usages = max_t(int, parser->local.usage_index, parser->global.report_count); |
246 | 246 | ||
247 | field = hid_register_field(report, usages, parser->global.report_count); | 247 | field = hid_register_field(report, usages, parser->global.report_count); |
248 | if (!field) | 248 | if (!field) |
249 | return 0; | 249 | return 0; |
250 | 250 | ||
251 | field->physical = hid_lookup_collection(parser, HID_COLLECTION_PHYSICAL); | 251 | field->physical = hid_lookup_collection(parser, HID_COLLECTION_PHYSICAL); |
252 | field->logical = hid_lookup_collection(parser, HID_COLLECTION_LOGICAL); | 252 | field->logical = hid_lookup_collection(parser, HID_COLLECTION_LOGICAL); |
253 | field->application = hid_lookup_collection(parser, HID_COLLECTION_APPLICATION); | 253 | field->application = hid_lookup_collection(parser, HID_COLLECTION_APPLICATION); |
254 | 254 | ||
255 | for (i = 0; i < usages; i++) { | 255 | for (i = 0; i < usages; i++) { |
256 | int j = i; | 256 | int j = i; |
257 | /* Duplicate the last usage we parsed if we have excess values */ | 257 | /* Duplicate the last usage we parsed if we have excess values */ |
258 | if (i >= parser->local.usage_index) | 258 | if (i >= parser->local.usage_index) |
259 | j = parser->local.usage_index - 1; | 259 | j = parser->local.usage_index - 1; |
260 | field->usage[i].hid = parser->local.usage[j]; | 260 | field->usage[i].hid = parser->local.usage[j]; |
261 | field->usage[i].collection_index = | 261 | field->usage[i].collection_index = |
262 | parser->local.collection_index[j]; | 262 | parser->local.collection_index[j]; |
263 | } | 263 | } |
264 | 264 | ||
265 | field->maxusage = usages; | 265 | field->maxusage = usages; |
266 | field->flags = flags; | 266 | field->flags = flags; |
267 | field->report_offset = offset; | 267 | field->report_offset = offset; |
268 | field->report_type = report_type; | 268 | field->report_type = report_type; |
269 | field->report_size = parser->global.report_size; | 269 | field->report_size = parser->global.report_size; |
270 | field->report_count = parser->global.report_count; | 270 | field->report_count = parser->global.report_count; |
271 | field->logical_minimum = parser->global.logical_minimum; | 271 | field->logical_minimum = parser->global.logical_minimum; |
272 | field->logical_maximum = parser->global.logical_maximum; | 272 | field->logical_maximum = parser->global.logical_maximum; |
273 | field->physical_minimum = parser->global.physical_minimum; | 273 | field->physical_minimum = parser->global.physical_minimum; |
274 | field->physical_maximum = parser->global.physical_maximum; | 274 | field->physical_maximum = parser->global.physical_maximum; |
275 | field->unit_exponent = parser->global.unit_exponent; | 275 | field->unit_exponent = parser->global.unit_exponent; |
276 | field->unit = parser->global.unit; | 276 | field->unit = parser->global.unit; |
277 | 277 | ||
278 | return 0; | 278 | return 0; |
279 | } | 279 | } |
280 | 280 | ||
281 | /* | 281 | /* |
282 | * Read data value from item. | 282 | * Read data value from item. |
283 | */ | 283 | */ |
284 | 284 | ||
285 | static u32 item_udata(struct hid_item *item) | 285 | static u32 item_udata(struct hid_item *item) |
286 | { | 286 | { |
287 | switch (item->size) { | 287 | switch (item->size) { |
288 | case 1: return item->data.u8; | 288 | case 1: return item->data.u8; |
289 | case 2: return item->data.u16; | 289 | case 2: return item->data.u16; |
290 | case 4: return item->data.u32; | 290 | case 4: return item->data.u32; |
291 | } | 291 | } |
292 | return 0; | 292 | return 0; |
293 | } | 293 | } |
294 | 294 | ||
295 | static s32 item_sdata(struct hid_item *item) | 295 | static s32 item_sdata(struct hid_item *item) |
296 | { | 296 | { |
297 | switch (item->size) { | 297 | switch (item->size) { |
298 | case 1: return item->data.s8; | 298 | case 1: return item->data.s8; |
299 | case 2: return item->data.s16; | 299 | case 2: return item->data.s16; |
300 | case 4: return item->data.s32; | 300 | case 4: return item->data.s32; |
301 | } | 301 | } |
302 | return 0; | 302 | return 0; |
303 | } | 303 | } |
304 | 304 | ||
305 | /* | 305 | /* |
306 | * Process a global item. | 306 | * Process a global item. |
307 | */ | 307 | */ |
308 | 308 | ||
309 | static int hid_parser_global(struct hid_parser *parser, struct hid_item *item) | 309 | static int hid_parser_global(struct hid_parser *parser, struct hid_item *item) |
310 | { | 310 | { |
311 | switch (item->tag) { | 311 | switch (item->tag) { |
312 | case HID_GLOBAL_ITEM_TAG_PUSH: | 312 | case HID_GLOBAL_ITEM_TAG_PUSH: |
313 | 313 | ||
314 | if (parser->global_stack_ptr == HID_GLOBAL_STACK_SIZE) { | 314 | if (parser->global_stack_ptr == HID_GLOBAL_STACK_SIZE) { |
315 | hid_err(parser->device, "global environment stack overflow\n"); | 315 | hid_err(parser->device, "global environment stack overflow\n"); |
316 | return -1; | 316 | return -1; |
317 | } | 317 | } |
318 | 318 | ||
319 | memcpy(parser->global_stack + parser->global_stack_ptr++, | 319 | memcpy(parser->global_stack + parser->global_stack_ptr++, |
320 | &parser->global, sizeof(struct hid_global)); | 320 | &parser->global, sizeof(struct hid_global)); |
321 | return 0; | 321 | return 0; |
322 | 322 | ||
323 | case HID_GLOBAL_ITEM_TAG_POP: | 323 | case HID_GLOBAL_ITEM_TAG_POP: |
324 | 324 | ||
325 | if (!parser->global_stack_ptr) { | 325 | if (!parser->global_stack_ptr) { |
326 | hid_err(parser->device, "global environment stack underflow\n"); | 326 | hid_err(parser->device, "global environment stack underflow\n"); |
327 | return -1; | 327 | return -1; |
328 | } | 328 | } |
329 | 329 | ||
330 | memcpy(&parser->global, parser->global_stack + | 330 | memcpy(&parser->global, parser->global_stack + |
331 | --parser->global_stack_ptr, sizeof(struct hid_global)); | 331 | --parser->global_stack_ptr, sizeof(struct hid_global)); |
332 | return 0; | 332 | return 0; |
333 | 333 | ||
334 | case HID_GLOBAL_ITEM_TAG_USAGE_PAGE: | 334 | case HID_GLOBAL_ITEM_TAG_USAGE_PAGE: |
335 | parser->global.usage_page = item_udata(item); | 335 | parser->global.usage_page = item_udata(item); |
336 | return 0; | 336 | return 0; |
337 | 337 | ||
338 | case HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM: | 338 | case HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM: |
339 | parser->global.logical_minimum = item_sdata(item); | 339 | parser->global.logical_minimum = item_sdata(item); |
340 | return 0; | 340 | return 0; |
341 | 341 | ||
342 | case HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM: | 342 | case HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM: |
343 | if (parser->global.logical_minimum < 0) | 343 | if (parser->global.logical_minimum < 0) |
344 | parser->global.logical_maximum = item_sdata(item); | 344 | parser->global.logical_maximum = item_sdata(item); |
345 | else | 345 | else |
346 | parser->global.logical_maximum = item_udata(item); | 346 | parser->global.logical_maximum = item_udata(item); |
347 | return 0; | 347 | return 0; |
348 | 348 | ||
349 | case HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM: | 349 | case HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM: |
350 | parser->global.physical_minimum = item_sdata(item); | 350 | parser->global.physical_minimum = item_sdata(item); |
351 | return 0; | 351 | return 0; |
352 | 352 | ||
353 | case HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM: | 353 | case HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM: |
354 | if (parser->global.physical_minimum < 0) | 354 | if (parser->global.physical_minimum < 0) |
355 | parser->global.physical_maximum = item_sdata(item); | 355 | parser->global.physical_maximum = item_sdata(item); |
356 | else | 356 | else |
357 | parser->global.physical_maximum = item_udata(item); | 357 | parser->global.physical_maximum = item_udata(item); |
358 | return 0; | 358 | return 0; |
359 | 359 | ||
360 | case HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT: | 360 | case HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT: |
361 | parser->global.unit_exponent = item_sdata(item); | 361 | parser->global.unit_exponent = item_sdata(item); |
362 | return 0; | 362 | return 0; |
363 | 363 | ||
364 | case HID_GLOBAL_ITEM_TAG_UNIT: | 364 | case HID_GLOBAL_ITEM_TAG_UNIT: |
365 | parser->global.unit = item_udata(item); | 365 | parser->global.unit = item_udata(item); |
366 | return 0; | 366 | return 0; |
367 | 367 | ||
368 | case HID_GLOBAL_ITEM_TAG_REPORT_SIZE: | 368 | case HID_GLOBAL_ITEM_TAG_REPORT_SIZE: |
369 | parser->global.report_size = item_udata(item); | 369 | parser->global.report_size = item_udata(item); |
370 | if (parser->global.report_size > 96) { | 370 | if (parser->global.report_size > 96) { |
371 | hid_err(parser->device, "invalid report_size %d\n", | 371 | hid_err(parser->device, "invalid report_size %d\n", |
372 | parser->global.report_size); | 372 | parser->global.report_size); |
373 | return -1; | 373 | return -1; |
374 | } | 374 | } |
375 | return 0; | 375 | return 0; |
376 | 376 | ||
377 | case HID_GLOBAL_ITEM_TAG_REPORT_COUNT: | 377 | case HID_GLOBAL_ITEM_TAG_REPORT_COUNT: |
378 | parser->global.report_count = item_udata(item); | 378 | parser->global.report_count = item_udata(item); |
379 | if (parser->global.report_count > HID_MAX_USAGES) { | 379 | if (parser->global.report_count > HID_MAX_USAGES) { |
380 | hid_err(parser->device, "invalid report_count %d\n", | 380 | hid_err(parser->device, "invalid report_count %d\n", |
381 | parser->global.report_count); | 381 | parser->global.report_count); |
382 | return -1; | 382 | return -1; |
383 | } | 383 | } |
384 | return 0; | 384 | return 0; |
385 | 385 | ||
386 | case HID_GLOBAL_ITEM_TAG_REPORT_ID: | 386 | case HID_GLOBAL_ITEM_TAG_REPORT_ID: |
387 | parser->global.report_id = item_udata(item); | 387 | parser->global.report_id = item_udata(item); |
388 | if (parser->global.report_id == 0) { | 388 | if (parser->global.report_id == 0) { |
389 | hid_err(parser->device, "report_id 0 is invalid\n"); | 389 | hid_err(parser->device, "report_id 0 is invalid\n"); |
390 | return -1; | 390 | return -1; |
391 | } | 391 | } |
392 | return 0; | 392 | return 0; |
393 | 393 | ||
394 | default: | 394 | default: |
395 | hid_err(parser->device, "unknown global tag 0x%x\n", item->tag); | 395 | hid_err(parser->device, "unknown global tag 0x%x\n", item->tag); |
396 | return -1; | 396 | return -1; |
397 | } | 397 | } |
398 | } | 398 | } |
399 | 399 | ||
400 | /* | 400 | /* |
401 | * Process a local item. | 401 | * Process a local item. |
402 | */ | 402 | */ |
403 | 403 | ||
404 | static int hid_parser_local(struct hid_parser *parser, struct hid_item *item) | 404 | static int hid_parser_local(struct hid_parser *parser, struct hid_item *item) |
405 | { | 405 | { |
406 | __u32 data; | 406 | __u32 data; |
407 | unsigned n; | 407 | unsigned n; |
408 | 408 | ||
409 | data = item_udata(item); | 409 | data = item_udata(item); |
410 | 410 | ||
411 | switch (item->tag) { | 411 | switch (item->tag) { |
412 | case HID_LOCAL_ITEM_TAG_DELIMITER: | 412 | case HID_LOCAL_ITEM_TAG_DELIMITER: |
413 | 413 | ||
414 | if (data) { | 414 | if (data) { |
415 | /* | 415 | /* |
416 | * We treat items before the first delimiter | 416 | * We treat items before the first delimiter |
417 | * as global to all usage sets (branch 0). | 417 | * as global to all usage sets (branch 0). |
418 | * In the moment we process only these global | 418 | * In the moment we process only these global |
419 | * items and the first delimiter set. | 419 | * items and the first delimiter set. |
420 | */ | 420 | */ |
421 | if (parser->local.delimiter_depth != 0) { | 421 | if (parser->local.delimiter_depth != 0) { |
422 | hid_err(parser->device, "nested delimiters\n"); | 422 | hid_err(parser->device, "nested delimiters\n"); |
423 | return -1; | 423 | return -1; |
424 | } | 424 | } |
425 | parser->local.delimiter_depth++; | 425 | parser->local.delimiter_depth++; |
426 | parser->local.delimiter_branch++; | 426 | parser->local.delimiter_branch++; |
427 | } else { | 427 | } else { |
428 | if (parser->local.delimiter_depth < 1) { | 428 | if (parser->local.delimiter_depth < 1) { |
429 | hid_err(parser->device, "bogus close delimiter\n"); | 429 | hid_err(parser->device, "bogus close delimiter\n"); |
430 | return -1; | 430 | return -1; |
431 | } | 431 | } |
432 | parser->local.delimiter_depth--; | 432 | parser->local.delimiter_depth--; |
433 | } | 433 | } |
434 | return 1; | 434 | return 1; |
435 | 435 | ||
436 | case HID_LOCAL_ITEM_TAG_USAGE: | 436 | case HID_LOCAL_ITEM_TAG_USAGE: |
437 | 437 | ||
438 | if (parser->local.delimiter_branch > 1) { | 438 | if (parser->local.delimiter_branch > 1) { |
439 | dbg_hid("alternative usage ignored\n"); | 439 | dbg_hid("alternative usage ignored\n"); |
440 | return 0; | 440 | return 0; |
441 | } | 441 | } |
442 | 442 | ||
443 | if (item->size <= 2) | 443 | if (item->size <= 2) |
444 | data = (parser->global.usage_page << 16) + data; | 444 | data = (parser->global.usage_page << 16) + data; |
445 | 445 | ||
446 | return hid_add_usage(parser, data); | 446 | return hid_add_usage(parser, data); |
447 | 447 | ||
448 | case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM: | 448 | case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM: |
449 | 449 | ||
450 | if (parser->local.delimiter_branch > 1) { | 450 | if (parser->local.delimiter_branch > 1) { |
451 | dbg_hid("alternative usage ignored\n"); | 451 | dbg_hid("alternative usage ignored\n"); |
452 | return 0; | 452 | return 0; |
453 | } | 453 | } |
454 | 454 | ||
455 | if (item->size <= 2) | 455 | if (item->size <= 2) |
456 | data = (parser->global.usage_page << 16) + data; | 456 | data = (parser->global.usage_page << 16) + data; |
457 | 457 | ||
458 | parser->local.usage_minimum = data; | 458 | parser->local.usage_minimum = data; |
459 | return 0; | 459 | return 0; |
460 | 460 | ||
461 | case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM: | 461 | case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM: |
462 | 462 | ||
463 | if (parser->local.delimiter_branch > 1) { | 463 | if (parser->local.delimiter_branch > 1) { |
464 | dbg_hid("alternative usage ignored\n"); | 464 | dbg_hid("alternative usage ignored\n"); |
465 | return 0; | 465 | return 0; |
466 | } | 466 | } |
467 | 467 | ||
468 | if (item->size <= 2) | 468 | if (item->size <= 2) |
469 | data = (parser->global.usage_page << 16) + data; | 469 | data = (parser->global.usage_page << 16) + data; |
470 | 470 | ||
471 | for (n = parser->local.usage_minimum; n <= data; n++) | 471 | for (n = parser->local.usage_minimum; n <= data; n++) |
472 | if (hid_add_usage(parser, n)) { | 472 | if (hid_add_usage(parser, n)) { |
473 | dbg_hid("hid_add_usage failed\n"); | 473 | dbg_hid("hid_add_usage failed\n"); |
474 | return -1; | 474 | return -1; |
475 | } | 475 | } |
476 | return 0; | 476 | return 0; |
477 | 477 | ||
478 | default: | 478 | default: |
479 | 479 | ||
480 | dbg_hid("unknown local item tag 0x%x\n", item->tag); | 480 | dbg_hid("unknown local item tag 0x%x\n", item->tag); |
481 | return 0; | 481 | return 0; |
482 | } | 482 | } |
483 | return 0; | 483 | return 0; |
484 | } | 484 | } |
485 | 485 | ||
486 | /* | 486 | /* |
487 | * Process a main item. | 487 | * Process a main item. |
488 | */ | 488 | */ |
489 | 489 | ||
490 | static int hid_parser_main(struct hid_parser *parser, struct hid_item *item) | 490 | static int hid_parser_main(struct hid_parser *parser, struct hid_item *item) |
491 | { | 491 | { |
492 | __u32 data; | 492 | __u32 data; |
493 | int ret; | 493 | int ret; |
494 | 494 | ||
495 | data = item_udata(item); | 495 | data = item_udata(item); |
496 | 496 | ||
497 | switch (item->tag) { | 497 | switch (item->tag) { |
498 | case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION: | 498 | case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION: |
499 | ret = open_collection(parser, data & 0xff); | 499 | ret = open_collection(parser, data & 0xff); |
500 | break; | 500 | break; |
501 | case HID_MAIN_ITEM_TAG_END_COLLECTION: | 501 | case HID_MAIN_ITEM_TAG_END_COLLECTION: |
502 | ret = close_collection(parser); | 502 | ret = close_collection(parser); |
503 | break; | 503 | break; |
504 | case HID_MAIN_ITEM_TAG_INPUT: | 504 | case HID_MAIN_ITEM_TAG_INPUT: |
505 | ret = hid_add_field(parser, HID_INPUT_REPORT, data); | 505 | ret = hid_add_field(parser, HID_INPUT_REPORT, data); |
506 | break; | 506 | break; |
507 | case HID_MAIN_ITEM_TAG_OUTPUT: | 507 | case HID_MAIN_ITEM_TAG_OUTPUT: |
508 | ret = hid_add_field(parser, HID_OUTPUT_REPORT, data); | 508 | ret = hid_add_field(parser, HID_OUTPUT_REPORT, data); |
509 | break; | 509 | break; |
510 | case HID_MAIN_ITEM_TAG_FEATURE: | 510 | case HID_MAIN_ITEM_TAG_FEATURE: |
511 | ret = hid_add_field(parser, HID_FEATURE_REPORT, data); | 511 | ret = hid_add_field(parser, HID_FEATURE_REPORT, data); |
512 | break; | 512 | break; |
513 | default: | 513 | default: |
514 | hid_err(parser->device, "unknown main item tag 0x%x\n", item->tag); | 514 | hid_err(parser->device, "unknown main item tag 0x%x\n", item->tag); |
515 | ret = 0; | 515 | ret = 0; |
516 | } | 516 | } |
517 | 517 | ||
518 | memset(&parser->local, 0, sizeof(parser->local)); /* Reset the local parser environment */ | 518 | memset(&parser->local, 0, sizeof(parser->local)); /* Reset the local parser environment */ |
519 | 519 | ||
520 | return ret; | 520 | return ret; |
521 | } | 521 | } |
522 | 522 | ||
523 | /* | 523 | /* |
524 | * Process a reserved item. | 524 | * Process a reserved item. |
525 | */ | 525 | */ |
526 | 526 | ||
527 | static int hid_parser_reserved(struct hid_parser *parser, struct hid_item *item) | 527 | static int hid_parser_reserved(struct hid_parser *parser, struct hid_item *item) |
528 | { | 528 | { |
529 | dbg_hid("reserved item type, tag 0x%x\n", item->tag); | 529 | dbg_hid("reserved item type, tag 0x%x\n", item->tag); |
530 | return 0; | 530 | return 0; |
531 | } | 531 | } |
532 | 532 | ||
533 | /* | 533 | /* |
534 | * Free a report and all registered fields. The field->usage and | 534 | * Free a report and all registered fields. The field->usage and |
535 | * field->value table's are allocated behind the field, so we need | 535 | * field->value table's are allocated behind the field, so we need |
536 | * only to free(field) itself. | 536 | * only to free(field) itself. |
537 | */ | 537 | */ |
538 | 538 | ||
539 | static void hid_free_report(struct hid_report *report) | 539 | static void hid_free_report(struct hid_report *report) |
540 | { | 540 | { |
541 | unsigned n; | 541 | unsigned n; |
542 | 542 | ||
543 | for (n = 0; n < report->maxfield; n++) | 543 | for (n = 0; n < report->maxfield; n++) |
544 | kfree(report->field[n]); | 544 | kfree(report->field[n]); |
545 | kfree(report); | 545 | kfree(report); |
546 | } | 546 | } |
547 | 547 | ||
548 | /* | 548 | /* |
549 | * Free a device structure, all reports, and all fields. | 549 | * Free a device structure, all reports, and all fields. |
550 | */ | 550 | */ |
551 | 551 | ||
552 | static void hid_device_release(struct device *dev) | 552 | static void hid_device_release(struct device *dev) |
553 | { | 553 | { |
554 | struct hid_device *device = container_of(dev, struct hid_device, dev); | 554 | struct hid_device *device = container_of(dev, struct hid_device, dev); |
555 | unsigned i, j; | 555 | unsigned i, j; |
556 | 556 | ||
557 | for (i = 0; i < HID_REPORT_TYPES; i++) { | 557 | for (i = 0; i < HID_REPORT_TYPES; i++) { |
558 | struct hid_report_enum *report_enum = device->report_enum + i; | 558 | struct hid_report_enum *report_enum = device->report_enum + i; |
559 | 559 | ||
560 | for (j = 0; j < 256; j++) { | 560 | for (j = 0; j < 256; j++) { |
561 | struct hid_report *report = report_enum->report_id_hash[j]; | 561 | struct hid_report *report = report_enum->report_id_hash[j]; |
562 | if (report) | 562 | if (report) |
563 | hid_free_report(report); | 563 | hid_free_report(report); |
564 | } | 564 | } |
565 | } | 565 | } |
566 | 566 | ||
567 | kfree(device->rdesc); | 567 | kfree(device->rdesc); |
568 | kfree(device->collection); | 568 | kfree(device->collection); |
569 | kfree(device); | 569 | kfree(device); |
570 | } | 570 | } |
571 | 571 | ||
572 | /* | 572 | /* |
573 | * Fetch a report description item from the data stream. We support long | 573 | * Fetch a report description item from the data stream. We support long |
574 | * items, though they are not used yet. | 574 | * items, though they are not used yet. |
575 | */ | 575 | */ |
576 | 576 | ||
577 | static u8 *fetch_item(__u8 *start, __u8 *end, struct hid_item *item) | 577 | static u8 *fetch_item(__u8 *start, __u8 *end, struct hid_item *item) |
578 | { | 578 | { |
579 | u8 b; | 579 | u8 b; |
580 | 580 | ||
581 | if ((end - start) <= 0) | 581 | if ((end - start) <= 0) |
582 | return NULL; | 582 | return NULL; |
583 | 583 | ||
584 | b = *start++; | 584 | b = *start++; |
585 | 585 | ||
586 | item->type = (b >> 2) & 3; | 586 | item->type = (b >> 2) & 3; |
587 | item->tag = (b >> 4) & 15; | 587 | item->tag = (b >> 4) & 15; |
588 | 588 | ||
589 | if (item->tag == HID_ITEM_TAG_LONG) { | 589 | if (item->tag == HID_ITEM_TAG_LONG) { |
590 | 590 | ||
591 | item->format = HID_ITEM_FORMAT_LONG; | 591 | item->format = HID_ITEM_FORMAT_LONG; |
592 | 592 | ||
593 | if ((end - start) < 2) | 593 | if ((end - start) < 2) |
594 | return NULL; | 594 | return NULL; |
595 | 595 | ||
596 | item->size = *start++; | 596 | item->size = *start++; |
597 | item->tag = *start++; | 597 | item->tag = *start++; |
598 | 598 | ||
599 | if ((end - start) < item->size) | 599 | if ((end - start) < item->size) |
600 | return NULL; | 600 | return NULL; |
601 | 601 | ||
602 | item->data.longdata = start; | 602 | item->data.longdata = start; |
603 | start += item->size; | 603 | start += item->size; |
604 | return start; | 604 | return start; |
605 | } | 605 | } |
606 | 606 | ||
607 | item->format = HID_ITEM_FORMAT_SHORT; | 607 | item->format = HID_ITEM_FORMAT_SHORT; |
608 | item->size = b & 3; | 608 | item->size = b & 3; |
609 | 609 | ||
610 | switch (item->size) { | 610 | switch (item->size) { |
611 | case 0: | 611 | case 0: |
612 | return start; | 612 | return start; |
613 | 613 | ||
614 | case 1: | 614 | case 1: |
615 | if ((end - start) < 1) | 615 | if ((end - start) < 1) |
616 | return NULL; | 616 | return NULL; |
617 | item->data.u8 = *start++; | 617 | item->data.u8 = *start++; |
618 | return start; | 618 | return start; |
619 | 619 | ||
620 | case 2: | 620 | case 2: |
621 | if ((end - start) < 2) | 621 | if ((end - start) < 2) |
622 | return NULL; | 622 | return NULL; |
623 | item->data.u16 = get_unaligned_le16(start); | 623 | item->data.u16 = get_unaligned_le16(start); |
624 | start = (__u8 *)((__le16 *)start + 1); | 624 | start = (__u8 *)((__le16 *)start + 1); |
625 | return start; | 625 | return start; |
626 | 626 | ||
627 | case 3: | 627 | case 3: |
628 | item->size++; | 628 | item->size++; |
629 | if ((end - start) < 4) | 629 | if ((end - start) < 4) |
630 | return NULL; | 630 | return NULL; |
631 | item->data.u32 = get_unaligned_le32(start); | 631 | item->data.u32 = get_unaligned_le32(start); |
632 | start = (__u8 *)((__le32 *)start + 1); | 632 | start = (__u8 *)((__le32 *)start + 1); |
633 | return start; | 633 | return start; |
634 | } | 634 | } |
635 | 635 | ||
636 | return NULL; | 636 | return NULL; |
637 | } | 637 | } |
638 | 638 | ||
639 | /** | 639 | /** |
640 | * hid_parse_report - parse device report | 640 | * hid_parse_report - parse device report |
641 | * | 641 | * |
642 | * @device: hid device | 642 | * @device: hid device |
643 | * @start: report start | 643 | * @start: report start |
644 | * @size: report size | 644 | * @size: report size |
645 | * | 645 | * |
646 | * Parse a report description into a hid_device structure. Reports are | 646 | * Parse a report description into a hid_device structure. Reports are |
647 | * enumerated, fields are attached to these reports. | 647 | * enumerated, fields are attached to these reports. |
648 | * 0 returned on success, otherwise nonzero error value. | 648 | * 0 returned on success, otherwise nonzero error value. |
649 | */ | 649 | */ |
650 | int hid_parse_report(struct hid_device *device, __u8 *start, | 650 | int hid_parse_report(struct hid_device *device, __u8 *start, |
651 | unsigned size) | 651 | unsigned size) |
652 | { | 652 | { |
653 | struct hid_parser *parser; | 653 | struct hid_parser *parser; |
654 | struct hid_item item; | 654 | struct hid_item item; |
655 | __u8 *end; | 655 | __u8 *end; |
656 | int ret; | 656 | int ret; |
657 | static int (*dispatch_type[])(struct hid_parser *parser, | 657 | static int (*dispatch_type[])(struct hid_parser *parser, |
658 | struct hid_item *item) = { | 658 | struct hid_item *item) = { |
659 | hid_parser_main, | 659 | hid_parser_main, |
660 | hid_parser_global, | 660 | hid_parser_global, |
661 | hid_parser_local, | 661 | hid_parser_local, |
662 | hid_parser_reserved | 662 | hid_parser_reserved |
663 | }; | 663 | }; |
664 | 664 | ||
665 | if (device->driver->report_fixup) | 665 | if (device->driver->report_fixup) |
666 | start = device->driver->report_fixup(device, start, &size); | 666 | start = device->driver->report_fixup(device, start, &size); |
667 | 667 | ||
668 | device->rdesc = kmemdup(start, size, GFP_KERNEL); | 668 | device->rdesc = kmemdup(start, size, GFP_KERNEL); |
669 | if (device->rdesc == NULL) | 669 | if (device->rdesc == NULL) |
670 | return -ENOMEM; | 670 | return -ENOMEM; |
671 | device->rsize = size; | 671 | device->rsize = size; |
672 | 672 | ||
673 | parser = vzalloc(sizeof(struct hid_parser)); | 673 | parser = vzalloc(sizeof(struct hid_parser)); |
674 | if (!parser) { | 674 | if (!parser) { |
675 | ret = -ENOMEM; | 675 | ret = -ENOMEM; |
676 | goto err; | 676 | goto err; |
677 | } | 677 | } |
678 | 678 | ||
679 | parser->device = device; | 679 | parser->device = device; |
680 | 680 | ||
681 | end = start + size; | 681 | end = start + size; |
682 | ret = -EINVAL; | 682 | ret = -EINVAL; |
683 | while ((start = fetch_item(start, end, &item)) != NULL) { | 683 | while ((start = fetch_item(start, end, &item)) != NULL) { |
684 | 684 | ||
685 | if (item.format != HID_ITEM_FORMAT_SHORT) { | 685 | if (item.format != HID_ITEM_FORMAT_SHORT) { |
686 | hid_err(device, "unexpected long global item\n"); | 686 | hid_err(device, "unexpected long global item\n"); |
687 | goto err; | 687 | goto err; |
688 | } | 688 | } |
689 | 689 | ||
690 | if (dispatch_type[item.type](parser, &item)) { | 690 | if (dispatch_type[item.type](parser, &item)) { |
691 | hid_err(device, "item %u %u %u %u parsing failed\n", | 691 | hid_err(device, "item %u %u %u %u parsing failed\n", |
692 | item.format, (unsigned)item.size, | 692 | item.format, (unsigned)item.size, |
693 | (unsigned)item.type, (unsigned)item.tag); | 693 | (unsigned)item.type, (unsigned)item.tag); |
694 | goto err; | 694 | goto err; |
695 | } | 695 | } |
696 | 696 | ||
697 | if (start == end) { | 697 | if (start == end) { |
698 | if (parser->collection_stack_ptr) { | 698 | if (parser->collection_stack_ptr) { |
699 | hid_err(device, "unbalanced collection at end of report description\n"); | 699 | hid_err(device, "unbalanced collection at end of report description\n"); |
700 | goto err; | 700 | goto err; |
701 | } | 701 | } |
702 | if (parser->local.delimiter_depth) { | 702 | if (parser->local.delimiter_depth) { |
703 | hid_err(device, "unbalanced delimiter at end of report description\n"); | 703 | hid_err(device, "unbalanced delimiter at end of report description\n"); |
704 | goto err; | 704 | goto err; |
705 | } | 705 | } |
706 | vfree(parser); | 706 | vfree(parser); |
707 | return 0; | 707 | return 0; |
708 | } | 708 | } |
709 | } | 709 | } |
710 | 710 | ||
711 | hid_err(device, "item fetching failed at offset %d\n", (int)(end - start)); | 711 | hid_err(device, "item fetching failed at offset %d\n", (int)(end - start)); |
712 | err: | 712 | err: |
713 | vfree(parser); | 713 | vfree(parser); |
714 | return ret; | 714 | return ret; |
715 | } | 715 | } |
716 | EXPORT_SYMBOL_GPL(hid_parse_report); | 716 | EXPORT_SYMBOL_GPL(hid_parse_report); |
717 | 717 | ||
718 | /* | 718 | /* |
719 | * Convert a signed n-bit integer to signed 32-bit integer. Common | 719 | * Convert a signed n-bit integer to signed 32-bit integer. Common |
720 | * cases are done through the compiler, the screwed things has to be | 720 | * cases are done through the compiler, the screwed things has to be |
721 | * done by hand. | 721 | * done by hand. |
722 | */ | 722 | */ |
723 | 723 | ||
724 | static s32 snto32(__u32 value, unsigned n) | 724 | static s32 snto32(__u32 value, unsigned n) |
725 | { | 725 | { |
726 | switch (n) { | 726 | switch (n) { |
727 | case 8: return ((__s8)value); | 727 | case 8: return ((__s8)value); |
728 | case 16: return ((__s16)value); | 728 | case 16: return ((__s16)value); |
729 | case 32: return ((__s32)value); | 729 | case 32: return ((__s32)value); |
730 | } | 730 | } |
731 | return value & (1 << (n - 1)) ? value | (-1 << n) : value; | 731 | return value & (1 << (n - 1)) ? value | (-1 << n) : value; |
732 | } | 732 | } |
733 | 733 | ||
734 | /* | 734 | /* |
735 | * Convert a signed 32-bit integer to a signed n-bit integer. | 735 | * Convert a signed 32-bit integer to a signed n-bit integer. |
736 | */ | 736 | */ |
737 | 737 | ||
738 | static u32 s32ton(__s32 value, unsigned n) | 738 | static u32 s32ton(__s32 value, unsigned n) |
739 | { | 739 | { |
740 | s32 a = value >> (n - 1); | 740 | s32 a = value >> (n - 1); |
741 | if (a && a != -1) | 741 | if (a && a != -1) |
742 | return value < 0 ? 1 << (n - 1) : (1 << (n - 1)) - 1; | 742 | return value < 0 ? 1 << (n - 1) : (1 << (n - 1)) - 1; |
743 | return value & ((1 << n) - 1); | 743 | return value & ((1 << n) - 1); |
744 | } | 744 | } |
745 | 745 | ||
746 | /* | 746 | /* |
747 | * Extract/implement a data field from/to a little endian report (bit array). | 747 | * Extract/implement a data field from/to a little endian report (bit array). |
748 | * | 748 | * |
749 | * Code sort-of follows HID spec: | 749 | * Code sort-of follows HID spec: |
750 | * http://www.usb.org/developers/devclass_docs/HID1_11.pdf | 750 | * http://www.usb.org/developers/devclass_docs/HID1_11.pdf |
751 | * | 751 | * |
752 | * While the USB HID spec allows unlimited length bit fields in "report | 752 | * While the USB HID spec allows unlimited length bit fields in "report |
753 | * descriptors", most devices never use more than 16 bits. | 753 | * descriptors", most devices never use more than 16 bits. |
754 | * One model of UPS is claimed to report "LINEV" as a 32-bit field. | 754 | * One model of UPS is claimed to report "LINEV" as a 32-bit field. |
755 | * Search linux-kernel and linux-usb-devel archives for "hid-core extract". | 755 | * Search linux-kernel and linux-usb-devel archives for "hid-core extract". |
756 | */ | 756 | */ |
757 | 757 | ||
758 | static __u32 extract(const struct hid_device *hid, __u8 *report, | 758 | static __u32 extract(const struct hid_device *hid, __u8 *report, |
759 | unsigned offset, unsigned n) | 759 | unsigned offset, unsigned n) |
760 | { | 760 | { |
761 | u64 x; | 761 | u64 x; |
762 | 762 | ||
763 | if (n > 32) | 763 | if (n > 32) |
764 | hid_warn(hid, "extract() called with n (%d) > 32! (%s)\n", | 764 | hid_warn(hid, "extract() called with n (%d) > 32! (%s)\n", |
765 | n, current->comm); | 765 | n, current->comm); |
766 | 766 | ||
767 | report += offset >> 3; /* adjust byte index */ | 767 | report += offset >> 3; /* adjust byte index */ |
768 | offset &= 7; /* now only need bit offset into one byte */ | 768 | offset &= 7; /* now only need bit offset into one byte */ |
769 | x = get_unaligned_le64(report); | 769 | x = get_unaligned_le64(report); |
770 | x = (x >> offset) & ((1ULL << n) - 1); /* extract bit field */ | 770 | x = (x >> offset) & ((1ULL << n) - 1); /* extract bit field */ |
771 | return (u32) x; | 771 | return (u32) x; |
772 | } | 772 | } |
773 | 773 | ||
774 | /* | 774 | /* |
775 | * "implement" : set bits in a little endian bit stream. | 775 | * "implement" : set bits in a little endian bit stream. |
776 | * Same concepts as "extract" (see comments above). | 776 | * Same concepts as "extract" (see comments above). |
777 | * The data mangled in the bit stream remains in little endian | 777 | * The data mangled in the bit stream remains in little endian |
778 | * order the whole time. It make more sense to talk about | 778 | * order the whole time. It make more sense to talk about |
779 | * endianness of register values by considering a register | 779 | * endianness of register values by considering a register |
780 | * a "cached" copy of the little endiad bit stream. | 780 | * a "cached" copy of the little endiad bit stream. |
781 | */ | 781 | */ |
782 | static void implement(const struct hid_device *hid, __u8 *report, | 782 | static void implement(const struct hid_device *hid, __u8 *report, |
783 | unsigned offset, unsigned n, __u32 value) | 783 | unsigned offset, unsigned n, __u32 value) |
784 | { | 784 | { |
785 | u64 x; | 785 | u64 x; |
786 | u64 m = (1ULL << n) - 1; | 786 | u64 m = (1ULL << n) - 1; |
787 | 787 | ||
788 | if (n > 32) | 788 | if (n > 32) |
789 | hid_warn(hid, "%s() called with n (%d) > 32! (%s)\n", | 789 | hid_warn(hid, "%s() called with n (%d) > 32! (%s)\n", |
790 | __func__, n, current->comm); | 790 | __func__, n, current->comm); |
791 | 791 | ||
792 | if (value > m) | 792 | if (value > m) |
793 | hid_warn(hid, "%s() called with too large value %d! (%s)\n", | 793 | hid_warn(hid, "%s() called with too large value %d! (%s)\n", |
794 | __func__, value, current->comm); | 794 | __func__, value, current->comm); |
795 | WARN_ON(value > m); | 795 | WARN_ON(value > m); |
796 | value &= m; | 796 | value &= m; |
797 | 797 | ||
798 | report += offset >> 3; | 798 | report += offset >> 3; |
799 | offset &= 7; | 799 | offset &= 7; |
800 | 800 | ||
801 | x = get_unaligned_le64(report); | 801 | x = get_unaligned_le64(report); |
802 | x &= ~(m << offset); | 802 | x &= ~(m << offset); |
803 | x |= ((u64)value) << offset; | 803 | x |= ((u64)value) << offset; |
804 | put_unaligned_le64(x, report); | 804 | put_unaligned_le64(x, report); |
805 | } | 805 | } |
806 | 806 | ||
807 | /* | 807 | /* |
808 | * Search an array for a value. | 808 | * Search an array for a value. |
809 | */ | 809 | */ |
810 | 810 | ||
811 | static int search(__s32 *array, __s32 value, unsigned n) | 811 | static int search(__s32 *array, __s32 value, unsigned n) |
812 | { | 812 | { |
813 | while (n--) { | 813 | while (n--) { |
814 | if (*array++ == value) | 814 | if (*array++ == value) |
815 | return 0; | 815 | return 0; |
816 | } | 816 | } |
817 | return -1; | 817 | return -1; |
818 | } | 818 | } |
819 | 819 | ||
820 | /** | 820 | /** |
821 | * hid_match_report - check if driver's raw_event should be called | 821 | * hid_match_report - check if driver's raw_event should be called |
822 | * | 822 | * |
823 | * @hid: hid device | 823 | * @hid: hid device |
824 | * @report_type: type to match against | 824 | * @report_type: type to match against |
825 | * | 825 | * |
826 | * compare hid->driver->report_table->report_type to report->type | 826 | * compare hid->driver->report_table->report_type to report->type |
827 | */ | 827 | */ |
828 | static int hid_match_report(struct hid_device *hid, struct hid_report *report) | 828 | static int hid_match_report(struct hid_device *hid, struct hid_report *report) |
829 | { | 829 | { |
830 | const struct hid_report_id *id = hid->driver->report_table; | 830 | const struct hid_report_id *id = hid->driver->report_table; |
831 | 831 | ||
832 | if (!id) /* NULL means all */ | 832 | if (!id) /* NULL means all */ |
833 | return 1; | 833 | return 1; |
834 | 834 | ||
835 | for (; id->report_type != HID_TERMINATOR; id++) | 835 | for (; id->report_type != HID_TERMINATOR; id++) |
836 | if (id->report_type == HID_ANY_ID || | 836 | if (id->report_type == HID_ANY_ID || |
837 | id->report_type == report->type) | 837 | id->report_type == report->type) |
838 | return 1; | 838 | return 1; |
839 | return 0; | 839 | return 0; |
840 | } | 840 | } |
841 | 841 | ||
842 | /** | 842 | /** |
843 | * hid_match_usage - check if driver's event should be called | 843 | * hid_match_usage - check if driver's event should be called |
844 | * | 844 | * |
845 | * @hid: hid device | 845 | * @hid: hid device |
846 | * @usage: usage to match against | 846 | * @usage: usage to match against |
847 | * | 847 | * |
848 | * compare hid->driver->usage_table->usage_{type,code} to | 848 | * compare hid->driver->usage_table->usage_{type,code} to |
849 | * usage->usage_{type,code} | 849 | * usage->usage_{type,code} |
850 | */ | 850 | */ |
851 | static int hid_match_usage(struct hid_device *hid, struct hid_usage *usage) | 851 | static int hid_match_usage(struct hid_device *hid, struct hid_usage *usage) |
852 | { | 852 | { |
853 | const struct hid_usage_id *id = hid->driver->usage_table; | 853 | const struct hid_usage_id *id = hid->driver->usage_table; |
854 | 854 | ||
855 | if (!id) /* NULL means all */ | 855 | if (!id) /* NULL means all */ |
856 | return 1; | 856 | return 1; |
857 | 857 | ||
858 | for (; id->usage_type != HID_ANY_ID - 1; id++) | 858 | for (; id->usage_type != HID_ANY_ID - 1; id++) |
859 | if ((id->usage_hid == HID_ANY_ID || | 859 | if ((id->usage_hid == HID_ANY_ID || |
860 | id->usage_hid == usage->hid) && | 860 | id->usage_hid == usage->hid) && |
861 | (id->usage_type == HID_ANY_ID || | 861 | (id->usage_type == HID_ANY_ID || |
862 | id->usage_type == usage->type) && | 862 | id->usage_type == usage->type) && |
863 | (id->usage_code == HID_ANY_ID || | 863 | (id->usage_code == HID_ANY_ID || |
864 | id->usage_code == usage->code)) | 864 | id->usage_code == usage->code)) |
865 | return 1; | 865 | return 1; |
866 | return 0; | 866 | return 0; |
867 | } | 867 | } |
868 | 868 | ||
869 | static void hid_process_event(struct hid_device *hid, struct hid_field *field, | 869 | static void hid_process_event(struct hid_device *hid, struct hid_field *field, |
870 | struct hid_usage *usage, __s32 value, int interrupt) | 870 | struct hid_usage *usage, __s32 value, int interrupt) |
871 | { | 871 | { |
872 | struct hid_driver *hdrv = hid->driver; | 872 | struct hid_driver *hdrv = hid->driver; |
873 | int ret; | 873 | int ret; |
874 | 874 | ||
875 | hid_dump_input(hid, usage, value); | 875 | hid_dump_input(hid, usage, value); |
876 | 876 | ||
877 | if (hdrv && hdrv->event && hid_match_usage(hid, usage)) { | 877 | if (hdrv && hdrv->event && hid_match_usage(hid, usage)) { |
878 | ret = hdrv->event(hid, field, usage, value); | 878 | ret = hdrv->event(hid, field, usage, value); |
879 | if (ret != 0) { | 879 | if (ret != 0) { |
880 | if (ret < 0) | 880 | if (ret < 0) |
881 | hid_err(hid, "%s's event failed with %d\n", | 881 | hid_err(hid, "%s's event failed with %d\n", |
882 | hdrv->name, ret); | 882 | hdrv->name, ret); |
883 | return; | 883 | return; |
884 | } | 884 | } |
885 | } | 885 | } |
886 | 886 | ||
887 | if (hid->claimed & HID_CLAIMED_INPUT) | 887 | if (hid->claimed & HID_CLAIMED_INPUT) |
888 | hidinput_hid_event(hid, field, usage, value); | 888 | hidinput_hid_event(hid, field, usage, value); |
889 | if (hid->claimed & HID_CLAIMED_HIDDEV && interrupt && hid->hiddev_hid_event) | 889 | if (hid->claimed & HID_CLAIMED_HIDDEV && interrupt && hid->hiddev_hid_event) |
890 | hid->hiddev_hid_event(hid, field, usage, value); | 890 | hid->hiddev_hid_event(hid, field, usage, value); |
891 | } | 891 | } |
892 | 892 | ||
893 | /* | 893 | /* |
894 | * Analyse a received field, and fetch the data from it. The field | 894 | * Analyse a received field, and fetch the data from it. The field |
895 | * content is stored for next report processing (we do differential | 895 | * content is stored for next report processing (we do differential |
896 | * reporting to the layer). | 896 | * reporting to the layer). |
897 | */ | 897 | */ |
898 | 898 | ||
899 | static void hid_input_field(struct hid_device *hid, struct hid_field *field, | 899 | static void hid_input_field(struct hid_device *hid, struct hid_field *field, |
900 | __u8 *data, int interrupt) | 900 | __u8 *data, int interrupt) |
901 | { | 901 | { |
902 | unsigned n; | 902 | unsigned n; |
903 | unsigned count = field->report_count; | 903 | unsigned count = field->report_count; |
904 | unsigned offset = field->report_offset; | 904 | unsigned offset = field->report_offset; |
905 | unsigned size = field->report_size; | 905 | unsigned size = field->report_size; |
906 | __s32 min = field->logical_minimum; | 906 | __s32 min = field->logical_minimum; |
907 | __s32 max = field->logical_maximum; | 907 | __s32 max = field->logical_maximum; |
908 | __s32 *value; | 908 | __s32 *value; |
909 | 909 | ||
910 | value = kmalloc(sizeof(__s32) * count, GFP_ATOMIC); | 910 | value = kmalloc(sizeof(__s32) * count, GFP_ATOMIC); |
911 | if (!value) | 911 | if (!value) |
912 | return; | 912 | return; |
913 | 913 | ||
914 | for (n = 0; n < count; n++) { | 914 | for (n = 0; n < count; n++) { |
915 | 915 | ||
916 | value[n] = min < 0 ? | 916 | value[n] = min < 0 ? |
917 | snto32(extract(hid, data, offset + n * size, size), | 917 | snto32(extract(hid, data, offset + n * size, size), |
918 | size) : | 918 | size) : |
919 | extract(hid, data, offset + n * size, size); | 919 | extract(hid, data, offset + n * size, size); |
920 | 920 | ||
921 | /* Ignore report if ErrorRollOver */ | 921 | /* Ignore report if ErrorRollOver */ |
922 | if (!(field->flags & HID_MAIN_ITEM_VARIABLE) && | 922 | if (!(field->flags & HID_MAIN_ITEM_VARIABLE) && |
923 | value[n] >= min && value[n] <= max && | 923 | value[n] >= min && value[n] <= max && |
924 | field->usage[value[n] - min].hid == HID_UP_KEYBOARD + 1) | 924 | field->usage[value[n] - min].hid == HID_UP_KEYBOARD + 1) |
925 | goto exit; | 925 | goto exit; |
926 | } | 926 | } |
927 | 927 | ||
928 | for (n = 0; n < count; n++) { | 928 | for (n = 0; n < count; n++) { |
929 | 929 | ||
930 | if (HID_MAIN_ITEM_VARIABLE & field->flags) { | 930 | if (HID_MAIN_ITEM_VARIABLE & field->flags) { |
931 | hid_process_event(hid, field, &field->usage[n], value[n], interrupt); | 931 | hid_process_event(hid, field, &field->usage[n], value[n], interrupt); |
932 | continue; | 932 | continue; |
933 | } | 933 | } |
934 | 934 | ||
935 | if (field->value[n] >= min && field->value[n] <= max | 935 | if (field->value[n] >= min && field->value[n] <= max |
936 | && field->usage[field->value[n] - min].hid | 936 | && field->usage[field->value[n] - min].hid |
937 | && search(value, field->value[n], count)) | 937 | && search(value, field->value[n], count)) |
938 | hid_process_event(hid, field, &field->usage[field->value[n] - min], 0, interrupt); | 938 | hid_process_event(hid, field, &field->usage[field->value[n] - min], 0, interrupt); |
939 | 939 | ||
940 | if (value[n] >= min && value[n] <= max | 940 | if (value[n] >= min && value[n] <= max |
941 | && field->usage[value[n] - min].hid | 941 | && field->usage[value[n] - min].hid |
942 | && search(field->value, value[n], count)) | 942 | && search(field->value, value[n], count)) |
943 | hid_process_event(hid, field, &field->usage[value[n] - min], 1, interrupt); | 943 | hid_process_event(hid, field, &field->usage[value[n] - min], 1, interrupt); |
944 | } | 944 | } |
945 | 945 | ||
946 | memcpy(field->value, value, count * sizeof(__s32)); | 946 | memcpy(field->value, value, count * sizeof(__s32)); |
947 | exit: | 947 | exit: |
948 | kfree(value); | 948 | kfree(value); |
949 | } | 949 | } |
950 | 950 | ||
951 | /* | 951 | /* |
952 | * Output the field into the report. | 952 | * Output the field into the report. |
953 | */ | 953 | */ |
954 | 954 | ||
955 | static void hid_output_field(const struct hid_device *hid, | 955 | static void hid_output_field(const struct hid_device *hid, |
956 | struct hid_field *field, __u8 *data) | 956 | struct hid_field *field, __u8 *data) |
957 | { | 957 | { |
958 | unsigned count = field->report_count; | 958 | unsigned count = field->report_count; |
959 | unsigned offset = field->report_offset; | 959 | unsigned offset = field->report_offset; |
960 | unsigned size = field->report_size; | 960 | unsigned size = field->report_size; |
961 | unsigned n; | 961 | unsigned n; |
962 | 962 | ||
963 | for (n = 0; n < count; n++) { | 963 | for (n = 0; n < count; n++) { |
964 | if (field->logical_minimum < 0) /* signed values */ | 964 | if (field->logical_minimum < 0) /* signed values */ |
965 | implement(hid, data, offset + n * size, size, | 965 | implement(hid, data, offset + n * size, size, |
966 | s32ton(field->value[n], size)); | 966 | s32ton(field->value[n], size)); |
967 | else /* unsigned values */ | 967 | else /* unsigned values */ |
968 | implement(hid, data, offset + n * size, size, | 968 | implement(hid, data, offset + n * size, size, |
969 | field->value[n]); | 969 | field->value[n]); |
970 | } | 970 | } |
971 | } | 971 | } |
972 | 972 | ||
973 | /* | 973 | /* |
974 | * Create a report. | 974 | * Create a report. |
975 | */ | 975 | */ |
976 | 976 | ||
977 | void hid_output_report(struct hid_report *report, __u8 *data) | 977 | void hid_output_report(struct hid_report *report, __u8 *data) |
978 | { | 978 | { |
979 | unsigned n; | 979 | unsigned n; |
980 | 980 | ||
981 | if (report->id > 0) | 981 | if (report->id > 0) |
982 | *data++ = report->id; | 982 | *data++ = report->id; |
983 | 983 | ||
984 | memset(data, 0, ((report->size - 1) >> 3) + 1); | 984 | memset(data, 0, ((report->size - 1) >> 3) + 1); |
985 | for (n = 0; n < report->maxfield; n++) | 985 | for (n = 0; n < report->maxfield; n++) |
986 | hid_output_field(report->device, report->field[n], data); | 986 | hid_output_field(report->device, report->field[n], data); |
987 | } | 987 | } |
988 | EXPORT_SYMBOL_GPL(hid_output_report); | 988 | EXPORT_SYMBOL_GPL(hid_output_report); |
989 | 989 | ||
990 | /* | 990 | /* |
991 | * Set a field value. The report this field belongs to has to be | 991 | * Set a field value. The report this field belongs to has to be |
992 | * created and transferred to the device, to set this value in the | 992 | * created and transferred to the device, to set this value in the |
993 | * device. | 993 | * device. |
994 | */ | 994 | */ |
995 | 995 | ||
996 | int hid_set_field(struct hid_field *field, unsigned offset, __s32 value) | 996 | int hid_set_field(struct hid_field *field, unsigned offset, __s32 value) |
997 | { | 997 | { |
998 | unsigned size = field->report_size; | 998 | unsigned size = field->report_size; |
999 | 999 | ||
1000 | hid_dump_input(field->report->device, field->usage + offset, value); | 1000 | hid_dump_input(field->report->device, field->usage + offset, value); |
1001 | 1001 | ||
1002 | if (offset >= field->report_count) { | 1002 | if (offset >= field->report_count) { |
1003 | hid_err(field->report->device, "offset (%d) exceeds report_count (%d)\n", | 1003 | hid_err(field->report->device, "offset (%d) exceeds report_count (%d)\n", |
1004 | offset, field->report_count); | 1004 | offset, field->report_count); |
1005 | return -1; | 1005 | return -1; |
1006 | } | 1006 | } |
1007 | if (field->logical_minimum < 0) { | 1007 | if (field->logical_minimum < 0) { |
1008 | if (value != snto32(s32ton(value, size), size)) { | 1008 | if (value != snto32(s32ton(value, size), size)) { |
1009 | hid_err(field->report->device, "value %d is out of range\n", value); | 1009 | hid_err(field->report->device, "value %d is out of range\n", value); |
1010 | return -1; | 1010 | return -1; |
1011 | } | 1011 | } |
1012 | } | 1012 | } |
1013 | field->value[offset] = value; | 1013 | field->value[offset] = value; |
1014 | return 0; | 1014 | return 0; |
1015 | } | 1015 | } |
1016 | EXPORT_SYMBOL_GPL(hid_set_field); | 1016 | EXPORT_SYMBOL_GPL(hid_set_field); |
1017 | 1017 | ||
1018 | static struct hid_report *hid_get_report(struct hid_report_enum *report_enum, | 1018 | static struct hid_report *hid_get_report(struct hid_report_enum *report_enum, |
1019 | const u8 *data) | 1019 | const u8 *data) |
1020 | { | 1020 | { |
1021 | struct hid_report *report; | 1021 | struct hid_report *report; |
1022 | unsigned int n = 0; /* Normally report number is 0 */ | 1022 | unsigned int n = 0; /* Normally report number is 0 */ |
1023 | 1023 | ||
1024 | /* Device uses numbered reports, data[0] is report number */ | 1024 | /* Device uses numbered reports, data[0] is report number */ |
1025 | if (report_enum->numbered) | 1025 | if (report_enum->numbered) |
1026 | n = *data; | 1026 | n = *data; |
1027 | 1027 | ||
1028 | report = report_enum->report_id_hash[n]; | 1028 | report = report_enum->report_id_hash[n]; |
1029 | if (report == NULL) | 1029 | if (report == NULL) |
1030 | dbg_hid("undefined report_id %u received\n", n); | 1030 | dbg_hid("undefined report_id %u received\n", n); |
1031 | 1031 | ||
1032 | return report; | 1032 | return report; |
1033 | } | 1033 | } |
1034 | 1034 | ||
1035 | void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, | 1035 | void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, |
1036 | int interrupt) | 1036 | int interrupt) |
1037 | { | 1037 | { |
1038 | struct hid_report_enum *report_enum = hid->report_enum + type; | 1038 | struct hid_report_enum *report_enum = hid->report_enum + type; |
1039 | struct hid_report *report; | 1039 | struct hid_report *report; |
1040 | unsigned int a; | 1040 | unsigned int a; |
1041 | int rsize, csize = size; | 1041 | int rsize, csize = size; |
1042 | u8 *cdata = data; | 1042 | u8 *cdata = data; |
1043 | 1043 | ||
1044 | report = hid_get_report(report_enum, data); | 1044 | report = hid_get_report(report_enum, data); |
1045 | if (!report) | 1045 | if (!report) |
1046 | return; | 1046 | return; |
1047 | 1047 | ||
1048 | if (report_enum->numbered) { | 1048 | if (report_enum->numbered) { |
1049 | cdata++; | 1049 | cdata++; |
1050 | csize--; | 1050 | csize--; |
1051 | } | 1051 | } |
1052 | 1052 | ||
1053 | rsize = ((report->size - 1) >> 3) + 1; | 1053 | rsize = ((report->size - 1) >> 3) + 1; |
1054 | 1054 | ||
1055 | if (rsize > HID_MAX_BUFFER_SIZE) | 1055 | if (rsize > HID_MAX_BUFFER_SIZE) |
1056 | rsize = HID_MAX_BUFFER_SIZE; | 1056 | rsize = HID_MAX_BUFFER_SIZE; |
1057 | 1057 | ||
1058 | if (csize < rsize) { | 1058 | if (csize < rsize) { |
1059 | dbg_hid("report %d is too short, (%d < %d)\n", report->id, | 1059 | dbg_hid("report %d is too short, (%d < %d)\n", report->id, |
1060 | csize, rsize); | 1060 | csize, rsize); |
1061 | memset(cdata + csize, 0, rsize - csize); | 1061 | memset(cdata + csize, 0, rsize - csize); |
1062 | } | 1062 | } |
1063 | 1063 | ||
1064 | if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event) | 1064 | if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event) |
1065 | hid->hiddev_report_event(hid, report); | 1065 | hid->hiddev_report_event(hid, report); |
1066 | if (hid->claimed & HID_CLAIMED_HIDRAW) | 1066 | if (hid->claimed & HID_CLAIMED_HIDRAW) |
1067 | hidraw_report_event(hid, data, size); | 1067 | hidraw_report_event(hid, data, size); |
1068 | 1068 | ||
1069 | for (a = 0; a < report->maxfield; a++) | 1069 | for (a = 0; a < report->maxfield; a++) |
1070 | hid_input_field(hid, report->field[a], cdata, interrupt); | 1070 | hid_input_field(hid, report->field[a], cdata, interrupt); |
1071 | 1071 | ||
1072 | if (hid->claimed & HID_CLAIMED_INPUT) | 1072 | if (hid->claimed & HID_CLAIMED_INPUT) |
1073 | hidinput_report_event(hid, report); | 1073 | hidinput_report_event(hid, report); |
1074 | } | 1074 | } |
1075 | EXPORT_SYMBOL_GPL(hid_report_raw_event); | 1075 | EXPORT_SYMBOL_GPL(hid_report_raw_event); |
1076 | 1076 | ||
1077 | /** | 1077 | /** |
1078 | * hid_input_report - report data from lower layer (usb, bt...) | 1078 | * hid_input_report - report data from lower layer (usb, bt...) |
1079 | * | 1079 | * |
1080 | * @hid: hid device | 1080 | * @hid: hid device |
1081 | * @type: HID report type (HID_*_REPORT) | 1081 | * @type: HID report type (HID_*_REPORT) |
1082 | * @data: report contents | 1082 | * @data: report contents |
1083 | * @size: size of data parameter | 1083 | * @size: size of data parameter |
1084 | * @interrupt: distinguish between interrupt and control transfers | 1084 | * @interrupt: distinguish between interrupt and control transfers |
1085 | * | 1085 | * |
1086 | * This is data entry for lower layers. | 1086 | * This is data entry for lower layers. |
1087 | */ | 1087 | */ |
1088 | int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int interrupt) | 1088 | int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int interrupt) |
1089 | { | 1089 | { |
1090 | struct hid_report_enum *report_enum; | 1090 | struct hid_report_enum *report_enum; |
1091 | struct hid_driver *hdrv; | 1091 | struct hid_driver *hdrv; |
1092 | struct hid_report *report; | 1092 | struct hid_report *report; |
1093 | char *buf; | 1093 | char *buf; |
1094 | unsigned int i; | 1094 | unsigned int i; |
1095 | int ret = 0; | 1095 | int ret = 0; |
1096 | 1096 | ||
1097 | if (!hid) | 1097 | if (!hid) |
1098 | return -ENODEV; | 1098 | return -ENODEV; |
1099 | 1099 | ||
1100 | if (down_trylock(&hid->driver_lock)) | 1100 | if (down_trylock(&hid->driver_lock)) |
1101 | return -EBUSY; | 1101 | return -EBUSY; |
1102 | 1102 | ||
1103 | if (!hid->driver) { | 1103 | if (!hid->driver) { |
1104 | ret = -ENODEV; | 1104 | ret = -ENODEV; |
1105 | goto unlock; | 1105 | goto unlock; |
1106 | } | 1106 | } |
1107 | report_enum = hid->report_enum + type; | 1107 | report_enum = hid->report_enum + type; |
1108 | hdrv = hid->driver; | 1108 | hdrv = hid->driver; |
1109 | 1109 | ||
1110 | if (!size) { | 1110 | if (!size) { |
1111 | dbg_hid("empty report\n"); | 1111 | dbg_hid("empty report\n"); |
1112 | ret = -1; | 1112 | ret = -1; |
1113 | goto unlock; | 1113 | goto unlock; |
1114 | } | 1114 | } |
1115 | 1115 | ||
1116 | buf = kmalloc(sizeof(char) * HID_DEBUG_BUFSIZE, GFP_ATOMIC); | 1116 | buf = kmalloc(sizeof(char) * HID_DEBUG_BUFSIZE, GFP_ATOMIC); |
1117 | 1117 | ||
1118 | if (!buf) | 1118 | if (!buf) |
1119 | goto nomem; | 1119 | goto nomem; |
1120 | 1120 | ||
1121 | /* dump the report */ | 1121 | /* dump the report */ |
1122 | snprintf(buf, HID_DEBUG_BUFSIZE - 1, | 1122 | snprintf(buf, HID_DEBUG_BUFSIZE - 1, |
1123 | "\nreport (size %u) (%snumbered) = ", size, report_enum->numbered ? "" : "un"); | 1123 | "\nreport (size %u) (%snumbered) = ", size, report_enum->numbered ? "" : "un"); |
1124 | hid_debug_event(hid, buf); | 1124 | hid_debug_event(hid, buf); |
1125 | 1125 | ||
1126 | for (i = 0; i < size; i++) { | 1126 | for (i = 0; i < size; i++) { |
1127 | snprintf(buf, HID_DEBUG_BUFSIZE - 1, | 1127 | snprintf(buf, HID_DEBUG_BUFSIZE - 1, |
1128 | " %02x", data[i]); | 1128 | " %02x", data[i]); |
1129 | hid_debug_event(hid, buf); | 1129 | hid_debug_event(hid, buf); |
1130 | } | 1130 | } |
1131 | hid_debug_event(hid, "\n"); | 1131 | hid_debug_event(hid, "\n"); |
1132 | kfree(buf); | 1132 | kfree(buf); |
1133 | 1133 | ||
1134 | nomem: | 1134 | nomem: |
1135 | report = hid_get_report(report_enum, data); | 1135 | report = hid_get_report(report_enum, data); |
1136 | 1136 | ||
1137 | if (!report) { | 1137 | if (!report) { |
1138 | ret = -1; | 1138 | ret = -1; |
1139 | goto unlock; | 1139 | goto unlock; |
1140 | } | 1140 | } |
1141 | 1141 | ||
1142 | if (hdrv && hdrv->raw_event && hid_match_report(hid, report)) { | 1142 | if (hdrv && hdrv->raw_event && hid_match_report(hid, report)) { |
1143 | ret = hdrv->raw_event(hid, report, data, size); | 1143 | ret = hdrv->raw_event(hid, report, data, size); |
1144 | if (ret != 0) { | 1144 | if (ret != 0) { |
1145 | ret = ret < 0 ? ret : 0; | 1145 | ret = ret < 0 ? ret : 0; |
1146 | goto unlock; | 1146 | goto unlock; |
1147 | } | 1147 | } |
1148 | } | 1148 | } |
1149 | 1149 | ||
1150 | hid_report_raw_event(hid, type, data, size, interrupt); | 1150 | hid_report_raw_event(hid, type, data, size, interrupt); |
1151 | 1151 | ||
1152 | unlock: | 1152 | unlock: |
1153 | up(&hid->driver_lock); | 1153 | up(&hid->driver_lock); |
1154 | return ret; | 1154 | return ret; |
1155 | } | 1155 | } |
1156 | EXPORT_SYMBOL_GPL(hid_input_report); | 1156 | EXPORT_SYMBOL_GPL(hid_input_report); |
1157 | 1157 | ||
1158 | static bool hid_match_one_id(struct hid_device *hdev, | 1158 | static bool hid_match_one_id(struct hid_device *hdev, |
1159 | const struct hid_device_id *id) | 1159 | const struct hid_device_id *id) |
1160 | { | 1160 | { |
1161 | return id->bus == hdev->bus && | 1161 | return id->bus == hdev->bus && |
1162 | (id->vendor == HID_ANY_ID || id->vendor == hdev->vendor) && | 1162 | (id->vendor == HID_ANY_ID || id->vendor == hdev->vendor) && |
1163 | (id->product == HID_ANY_ID || id->product == hdev->product); | 1163 | (id->product == HID_ANY_ID || id->product == hdev->product); |
1164 | } | 1164 | } |
1165 | 1165 | ||
1166 | const struct hid_device_id *hid_match_id(struct hid_device *hdev, | 1166 | const struct hid_device_id *hid_match_id(struct hid_device *hdev, |
1167 | const struct hid_device_id *id) | 1167 | const struct hid_device_id *id) |
1168 | { | 1168 | { |
1169 | for (; id->bus; id++) | 1169 | for (; id->bus; id++) |
1170 | if (hid_match_one_id(hdev, id)) | 1170 | if (hid_match_one_id(hdev, id)) |
1171 | return id; | 1171 | return id; |
1172 | 1172 | ||
1173 | return NULL; | 1173 | return NULL; |
1174 | } | 1174 | } |
1175 | 1175 | ||
1176 | static const struct hid_device_id hid_hiddev_list[] = { | 1176 | static const struct hid_device_id hid_hiddev_list[] = { |
1177 | { HID_USB_DEVICE(USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS) }, | 1177 | { HID_USB_DEVICE(USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS) }, |
1178 | { HID_USB_DEVICE(USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS1) }, | 1178 | { HID_USB_DEVICE(USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS1) }, |
1179 | { } | 1179 | { } |
1180 | }; | 1180 | }; |
1181 | 1181 | ||
1182 | static bool hid_hiddev(struct hid_device *hdev) | 1182 | static bool hid_hiddev(struct hid_device *hdev) |
1183 | { | 1183 | { |
1184 | return !!hid_match_id(hdev, hid_hiddev_list); | 1184 | return !!hid_match_id(hdev, hid_hiddev_list); |
1185 | } | 1185 | } |
1186 | 1186 | ||
1187 | 1187 | ||
1188 | static ssize_t | 1188 | static ssize_t |
1189 | read_report_descriptor(struct file *filp, struct kobject *kobj, | 1189 | read_report_descriptor(struct file *filp, struct kobject *kobj, |
1190 | struct bin_attribute *attr, | 1190 | struct bin_attribute *attr, |
1191 | char *buf, loff_t off, size_t count) | 1191 | char *buf, loff_t off, size_t count) |
1192 | { | 1192 | { |
1193 | struct device *dev = container_of(kobj, struct device, kobj); | 1193 | struct device *dev = container_of(kobj, struct device, kobj); |
1194 | struct hid_device *hdev = container_of(dev, struct hid_device, dev); | 1194 | struct hid_device *hdev = container_of(dev, struct hid_device, dev); |
1195 | 1195 | ||
1196 | if (off >= hdev->rsize) | 1196 | if (off >= hdev->rsize) |
1197 | return 0; | 1197 | return 0; |
1198 | 1198 | ||
1199 | if (off + count > hdev->rsize) | 1199 | if (off + count > hdev->rsize) |
1200 | count = hdev->rsize - off; | 1200 | count = hdev->rsize - off; |
1201 | 1201 | ||
1202 | memcpy(buf, hdev->rdesc + off, count); | 1202 | memcpy(buf, hdev->rdesc + off, count); |
1203 | 1203 | ||
1204 | return count; | 1204 | return count; |
1205 | } | 1205 | } |
1206 | 1206 | ||
1207 | static struct bin_attribute dev_bin_attr_report_desc = { | 1207 | static struct bin_attribute dev_bin_attr_report_desc = { |
1208 | .attr = { .name = "report_descriptor", .mode = 0444 }, | 1208 | .attr = { .name = "report_descriptor", .mode = 0444 }, |
1209 | .read = read_report_descriptor, | 1209 | .read = read_report_descriptor, |
1210 | .size = HID_MAX_DESCRIPTOR_SIZE, | 1210 | .size = HID_MAX_DESCRIPTOR_SIZE, |
1211 | }; | 1211 | }; |
1212 | 1212 | ||
1213 | int hid_connect(struct hid_device *hdev, unsigned int connect_mask) | 1213 | int hid_connect(struct hid_device *hdev, unsigned int connect_mask) |
1214 | { | 1214 | { |
1215 | static const char *types[] = { "Device", "Pointer", "Mouse", "Device", | 1215 | static const char *types[] = { "Device", "Pointer", "Mouse", "Device", |
1216 | "Joystick", "Gamepad", "Keyboard", "Keypad", | 1216 | "Joystick", "Gamepad", "Keyboard", "Keypad", |
1217 | "Multi-Axis Controller" | 1217 | "Multi-Axis Controller" |
1218 | }; | 1218 | }; |
1219 | const char *type, *bus; | 1219 | const char *type, *bus; |
1220 | char buf[64]; | 1220 | char buf[64]; |
1221 | unsigned int i; | 1221 | unsigned int i; |
1222 | int len; | 1222 | int len; |
1223 | int ret; | 1223 | int ret; |
1224 | 1224 | ||
1225 | if (hdev->quirks & HID_QUIRK_HIDDEV_FORCE) | 1225 | if (hdev->quirks & HID_QUIRK_HIDDEV_FORCE) |
1226 | connect_mask |= (HID_CONNECT_HIDDEV_FORCE | HID_CONNECT_HIDDEV); | 1226 | connect_mask |= (HID_CONNECT_HIDDEV_FORCE | HID_CONNECT_HIDDEV); |
1227 | if (hdev->quirks & HID_QUIRK_HIDINPUT_FORCE) | 1227 | if (hdev->quirks & HID_QUIRK_HIDINPUT_FORCE) |
1228 | connect_mask |= HID_CONNECT_HIDINPUT_FORCE; | 1228 | connect_mask |= HID_CONNECT_HIDINPUT_FORCE; |
1229 | if (hdev->bus != BUS_USB) | 1229 | if (hdev->bus != BUS_USB) |
1230 | connect_mask &= ~HID_CONNECT_HIDDEV; | 1230 | connect_mask &= ~HID_CONNECT_HIDDEV; |
1231 | if (hid_hiddev(hdev)) | 1231 | if (hid_hiddev(hdev)) |
1232 | connect_mask |= HID_CONNECT_HIDDEV_FORCE; | 1232 | connect_mask |= HID_CONNECT_HIDDEV_FORCE; |
1233 | 1233 | ||
1234 | if ((connect_mask & HID_CONNECT_HIDINPUT) && !hidinput_connect(hdev, | 1234 | if ((connect_mask & HID_CONNECT_HIDINPUT) && !hidinput_connect(hdev, |
1235 | connect_mask & HID_CONNECT_HIDINPUT_FORCE)) | 1235 | connect_mask & HID_CONNECT_HIDINPUT_FORCE)) |
1236 | hdev->claimed |= HID_CLAIMED_INPUT; | 1236 | hdev->claimed |= HID_CLAIMED_INPUT; |
1237 | if (hdev->quirks & HID_QUIRK_MULTITOUCH) { | 1237 | if (hdev->quirks & HID_QUIRK_MULTITOUCH) { |
1238 | /* this device should be handled by hid-multitouch, skip it */ | 1238 | /* this device should be handled by hid-multitouch, skip it */ |
1239 | return -ENODEV; | 1239 | return -ENODEV; |
1240 | } | 1240 | } |
1241 | 1241 | ||
1242 | if ((connect_mask & HID_CONNECT_HIDDEV) && hdev->hiddev_connect && | 1242 | if ((connect_mask & HID_CONNECT_HIDDEV) && hdev->hiddev_connect && |
1243 | !hdev->hiddev_connect(hdev, | 1243 | !hdev->hiddev_connect(hdev, |
1244 | connect_mask & HID_CONNECT_HIDDEV_FORCE)) | 1244 | connect_mask & HID_CONNECT_HIDDEV_FORCE)) |
1245 | hdev->claimed |= HID_CLAIMED_HIDDEV; | 1245 | hdev->claimed |= HID_CLAIMED_HIDDEV; |
1246 | if ((connect_mask & HID_CONNECT_HIDRAW) && !hidraw_connect(hdev)) | 1246 | if ((connect_mask & HID_CONNECT_HIDRAW) && !hidraw_connect(hdev)) |
1247 | hdev->claimed |= HID_CLAIMED_HIDRAW; | 1247 | hdev->claimed |= HID_CLAIMED_HIDRAW; |
1248 | 1248 | ||
1249 | if (!hdev->claimed) { | 1249 | if (!hdev->claimed) { |
1250 | hid_err(hdev, "claimed by neither input, hiddev nor hidraw\n"); | 1250 | hid_err(hdev, "claimed by neither input, hiddev nor hidraw\n"); |
1251 | return -ENODEV; | 1251 | return -ENODEV; |
1252 | } | 1252 | } |
1253 | 1253 | ||
1254 | if ((hdev->claimed & HID_CLAIMED_INPUT) && | 1254 | if ((hdev->claimed & HID_CLAIMED_INPUT) && |
1255 | (connect_mask & HID_CONNECT_FF) && hdev->ff_init) | 1255 | (connect_mask & HID_CONNECT_FF) && hdev->ff_init) |
1256 | hdev->ff_init(hdev); | 1256 | hdev->ff_init(hdev); |
1257 | 1257 | ||
1258 | len = 0; | 1258 | len = 0; |
1259 | if (hdev->claimed & HID_CLAIMED_INPUT) | 1259 | if (hdev->claimed & HID_CLAIMED_INPUT) |
1260 | len += sprintf(buf + len, "input"); | 1260 | len += sprintf(buf + len, "input"); |
1261 | if (hdev->claimed & HID_CLAIMED_HIDDEV) | 1261 | if (hdev->claimed & HID_CLAIMED_HIDDEV) |
1262 | len += sprintf(buf + len, "%shiddev%d", len ? "," : "", | 1262 | len += sprintf(buf + len, "%shiddev%d", len ? "," : "", |
1263 | hdev->minor); | 1263 | hdev->minor); |
1264 | if (hdev->claimed & HID_CLAIMED_HIDRAW) | 1264 | if (hdev->claimed & HID_CLAIMED_HIDRAW) |
1265 | len += sprintf(buf + len, "%shidraw%d", len ? "," : "", | 1265 | len += sprintf(buf + len, "%shidraw%d", len ? "," : "", |
1266 | ((struct hidraw *)hdev->hidraw)->minor); | 1266 | ((struct hidraw *)hdev->hidraw)->minor); |
1267 | 1267 | ||
1268 | type = "Device"; | 1268 | type = "Device"; |
1269 | for (i = 0; i < hdev->maxcollection; i++) { | 1269 | for (i = 0; i < hdev->maxcollection; i++) { |
1270 | struct hid_collection *col = &hdev->collection[i]; | 1270 | struct hid_collection *col = &hdev->collection[i]; |
1271 | if (col->type == HID_COLLECTION_APPLICATION && | 1271 | if (col->type == HID_COLLECTION_APPLICATION && |
1272 | (col->usage & HID_USAGE_PAGE) == HID_UP_GENDESK && | 1272 | (col->usage & HID_USAGE_PAGE) == HID_UP_GENDESK && |
1273 | (col->usage & 0xffff) < ARRAY_SIZE(types)) { | 1273 | (col->usage & 0xffff) < ARRAY_SIZE(types)) { |
1274 | type = types[col->usage & 0xffff]; | 1274 | type = types[col->usage & 0xffff]; |
1275 | break; | 1275 | break; |
1276 | } | 1276 | } |
1277 | } | 1277 | } |
1278 | 1278 | ||
1279 | switch (hdev->bus) { | 1279 | switch (hdev->bus) { |
1280 | case BUS_USB: | 1280 | case BUS_USB: |
1281 | bus = "USB"; | 1281 | bus = "USB"; |
1282 | break; | 1282 | break; |
1283 | case BUS_BLUETOOTH: | 1283 | case BUS_BLUETOOTH: |
1284 | bus = "BLUETOOTH"; | 1284 | bus = "BLUETOOTH"; |
1285 | break; | 1285 | break; |
1286 | default: | 1286 | default: |
1287 | bus = "<UNKNOWN>"; | 1287 | bus = "<UNKNOWN>"; |
1288 | } | 1288 | } |
1289 | 1289 | ||
1290 | ret = device_create_bin_file(&hdev->dev, &dev_bin_attr_report_desc); | 1290 | ret = device_create_bin_file(&hdev->dev, &dev_bin_attr_report_desc); |
1291 | if (ret) | 1291 | if (ret) |
1292 | hid_warn(hdev, | 1292 | hid_warn(hdev, |
1293 | "can't create sysfs report descriptor attribute err: %d\n", ret); | 1293 | "can't create sysfs report descriptor attribute err: %d\n", ret); |
1294 | 1294 | ||
1295 | hid_info(hdev, "%s: %s HID v%x.%02x %s [%s] on %s\n", | 1295 | hid_info(hdev, "%s: %s HID v%x.%02x %s [%s] on %s\n", |
1296 | buf, bus, hdev->version >> 8, hdev->version & 0xff, | 1296 | buf, bus, hdev->version >> 8, hdev->version & 0xff, |
1297 | type, hdev->name, hdev->phys); | 1297 | type, hdev->name, hdev->phys); |
1298 | 1298 | ||
1299 | return 0; | 1299 | return 0; |
1300 | } | 1300 | } |
1301 | EXPORT_SYMBOL_GPL(hid_connect); | 1301 | EXPORT_SYMBOL_GPL(hid_connect); |
1302 | 1302 | ||
1303 | void hid_disconnect(struct hid_device *hdev) | 1303 | void hid_disconnect(struct hid_device *hdev) |
1304 | { | 1304 | { |
1305 | device_remove_bin_file(&hdev->dev, &dev_bin_attr_report_desc); | 1305 | device_remove_bin_file(&hdev->dev, &dev_bin_attr_report_desc); |
1306 | if (hdev->claimed & HID_CLAIMED_INPUT) | 1306 | if (hdev->claimed & HID_CLAIMED_INPUT) |
1307 | hidinput_disconnect(hdev); | 1307 | hidinput_disconnect(hdev); |
1308 | if (hdev->claimed & HID_CLAIMED_HIDDEV) | 1308 | if (hdev->claimed & HID_CLAIMED_HIDDEV) |
1309 | hdev->hiddev_disconnect(hdev); | 1309 | hdev->hiddev_disconnect(hdev); |
1310 | if (hdev->claimed & HID_CLAIMED_HIDRAW) | 1310 | if (hdev->claimed & HID_CLAIMED_HIDRAW) |
1311 | hidraw_disconnect(hdev); | 1311 | hidraw_disconnect(hdev); |
1312 | } | 1312 | } |
1313 | EXPORT_SYMBOL_GPL(hid_disconnect); | 1313 | EXPORT_SYMBOL_GPL(hid_disconnect); |
1314 | 1314 | ||
1315 | /* a list of devices for which there is a specialized driver on HID bus */ | 1315 | /* a list of devices for which there is a specialized driver on HID bus */ |
1316 | static const struct hid_device_id hid_have_special_driver[] = { | 1316 | static const struct hid_device_id hid_have_special_driver[] = { |
1317 | { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M1968) }, | 1317 | { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M1968) }, |
1318 | { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M2256) }, | 1318 | { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M2256) }, |
1319 | { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) }, | 1319 | { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) }, |
1320 | { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) }, | 1320 | { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) }, |
1321 | { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649) }, | 1321 | { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649) }, |
1322 | { HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) }, | 1322 | { HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) }, |
1323 | { HID_USB_DEVICE(USB_VENDOR_ID_ACTIONSTAR, USB_DEVICE_ID_ACTIONSTAR_1011) }, | 1323 | { HID_USB_DEVICE(USB_VENDOR_ID_ACTIONSTAR, USB_DEVICE_ID_ACTIONSTAR_1011) }, |
1324 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) }, | 1324 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) }, |
1325 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) }, | 1325 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) }, |
1326 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) }, | 1326 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) }, |
1327 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICMOUSE) }, | 1327 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICMOUSE) }, |
1328 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICTRACKPAD) }, | 1328 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICTRACKPAD) }, |
1329 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) }, | 1329 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) }, |
1330 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO) }, | 1330 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO) }, |
1331 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI) }, | 1331 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI) }, |
1332 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO) }, | 1332 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO) }, |
1333 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS) }, | 1333 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS) }, |
1334 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI) }, | 1334 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI) }, |
1335 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO) }, | 1335 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO) }, |
1336 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS) }, | 1336 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS) }, |
1337 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI) }, | 1337 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI) }, |
1338 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO) }, | 1338 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO) }, |
1339 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS) }, | 1339 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS) }, |
1340 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_ANSI) }, | 1340 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_ANSI) }, |
1341 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_ISO) }, | 1341 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_ISO) }, |
1342 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_JIS) }, | 1342 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_JIS) }, |
1343 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ANSI) }, | 1343 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ANSI) }, |
1344 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ISO) }, | 1344 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ISO) }, |
1345 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_JIS) }, | 1345 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_JIS) }, |
1346 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI) }, | 1346 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI) }, |
1347 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO) }, | 1347 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO) }, |
1348 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS) }, | 1348 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS) }, |
1349 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI) }, | 1349 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI) }, |
1350 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO) }, | 1350 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO) }, |
1351 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS) }, | 1351 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS) }, |
1352 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI) }, | 1352 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI) }, |
1353 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO) }, | 1353 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO) }, |
1354 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS) }, | 1354 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS) }, |
1355 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) }, | 1355 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) }, |
1356 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) }, | 1356 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) }, |
1357 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) }, | 1357 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) }, |
1358 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) }, | 1358 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) }, |
1359 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) }, | 1359 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) }, |
1360 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) }, | 1360 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) }, |
1361 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI) }, | 1361 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI) }, |
1362 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO) }, | 1362 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO) }, |
1363 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS) }, | 1363 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS) }, |
1364 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI) }, | 1364 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI) }, |
1365 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO) }, | 1365 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO) }, |
1366 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) }, | 1366 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) }, |
1367 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI) }, | 1367 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI) }, |
1368 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ISO) }, | 1368 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ISO) }, |
1369 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_JIS) }, | 1369 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_JIS) }, |
1370 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI) }, | 1370 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI) }, |
1371 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO) }, | 1371 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO) }, |
1372 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS) }, | 1372 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS) }, |
1373 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ANSI) }, | 1373 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ANSI) }, |
1374 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO) }, | 1374 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO) }, |
1375 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_JIS) }, | 1375 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_JIS) }, |
1376 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI) }, | 1376 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI) }, |
1377 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ISO) }, | 1377 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ISO) }, |
1378 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_JIS) }, | 1378 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_JIS) }, |
1379 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI) }, | 1379 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI) }, |
1380 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO) }, | 1380 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO) }, |
1381 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS) }, | 1381 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS) }, |
1382 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI) }, | 1382 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI) }, |
1383 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO) }, | 1383 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO) }, |
1384 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS) }, | 1384 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS) }, |
1385 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) }, | 1385 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) }, |
1386 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) }, | 1386 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) }, |
1387 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) }, | 1387 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) }, |
1388 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO) }, | 1388 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO) }, |
1389 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, | 1389 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, |
1390 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, | 1390 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, |
1391 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_T91MT) }, | 1391 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_T91MT) }, |
1392 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUSTEK_MULTITOUCH_YFO) }, | 1392 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUSTEK_MULTITOUCH_YFO) }, |
1393 | { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, | 1393 | { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, |
1394 | { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE) }, | 1394 | { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE) }, |
1395 | { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE_2) }, | 1395 | { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE_2) }, |
1396 | { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_PIXCIR_MULTI_TOUCH) }, | 1396 | { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_PIXCIR_MULTI_TOUCH) }, |
1397 | { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH) }, | 1397 | { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH) }, |
1398 | { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_10_1) }, | 1398 | { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_10_1) }, |
1399 | { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) }, | 1399 | { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) }, |
1400 | { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6) }, | 1400 | { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6) }, |
1401 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, | 1401 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, |
1402 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) }, | 1402 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) }, |
1403 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, | 1403 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, |
1404 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS) }, | 1404 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS) }, |
1405 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS2) }, | 1405 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS2) }, |
1406 | { HID_USB_DEVICE(USB_VENDOR_ID_CHUNGHWAT, USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH) }, | 1406 | { HID_USB_DEVICE(USB_VENDOR_ID_CHUNGHWAT, USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH) }, |
1407 | { HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) }, | 1407 | { HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) }, |
1408 | { HID_USB_DEVICE(USB_VENDOR_ID_CVTOUCH, USB_DEVICE_ID_CVTOUCH_SCREEN) }, | 1408 | { HID_USB_DEVICE(USB_VENDOR_ID_CVTOUCH, USB_DEVICE_ID_CVTOUCH_SCREEN) }, |
1409 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) }, | 1409 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) }, |
1410 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) }, | 1410 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) }, |
1411 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_3) }, | 1411 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_3) }, |
1412 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE) }, | 1412 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE) }, |
1413 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_TRUETOUCH) }, | 1413 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_TRUETOUCH) }, |
1414 | { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) }, | 1414 | { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) }, |
1415 | { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0011) }, | 1415 | { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0011) }, |
1416 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480D) }, | 1416 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480D) }, |
1417 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480E) }, | 1417 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480E) }, |
1418 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_720C) }, | 1418 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_720C) }, |
1419 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224) }, | 1419 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224) }, |
1420 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_725E) }, | 1420 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_725E) }, |
1421 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_726B) }, | 1421 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_726B) }, |
1422 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72A1) }, | 1422 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72A1) }, |
1423 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7302) }, | 1423 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7302) }, |
1424 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001) }, | 1424 | { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001) }, |
1425 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) }, | 1425 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) }, |
1426 | { HID_USB_DEVICE(USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2515) }, | 1426 | { HID_USB_DEVICE(USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2515) }, |
1427 | { HID_USB_DEVICE(USB_VENDOR_ID_EMS, USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II) }, | 1427 | { HID_USB_DEVICE(USB_VENDOR_ID_EMS, USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II) }, |
1428 | { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) }, | 1428 | { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) }, |
1429 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_FRUCTEL, USB_DEVICE_ID_GAMETEL_MT_MODE) }, | 1429 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_FRUCTEL, USB_DEVICE_ID_GAMETEL_MT_MODE) }, |
1430 | { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) }, | 1430 | { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) }, |
1431 | { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) }, | 1431 | { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) }, |
1432 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS) }, | 1432 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS) }, |
1433 | { HID_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH, USB_DEVICE_ID_GOODTOUCH_000f) }, | 1433 | { HID_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH, USB_DEVICE_ID_GOODTOUCH_000f) }, |
1434 | { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003) }, | 1434 | { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003) }, |
1435 | { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0012) }, | 1435 | { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0012) }, |
1436 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) }, | 1436 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) }, |
1437 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) }, | 1437 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) }, |
1438 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_3) }, | 1438 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_3) }, |
1439 | { HID_USB_DEVICE(USB_VENDOR_ID_HANVON, USB_DEVICE_ID_HANVON_MULTITOUCH) }, | 1439 | { HID_USB_DEVICE(USB_VENDOR_ID_HANVON, USB_DEVICE_ID_HANVON_MULTITOUCH) }, |
1440 | { HID_USB_DEVICE(USB_VENDOR_ID_HANVON_ALT, USB_DEVICE_ID_HANVON_ALT_MULTITOUCH) }, | 1440 | { HID_USB_DEVICE(USB_VENDOR_ID_HANVON_ALT, USB_DEVICE_ID_HANVON_ALT_MULTITOUCH) }, |
1441 | { HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6650) }, | 1441 | { HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6650) }, |
1442 | { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK, USB_DEVICE_ID_HOLTEK_ON_LINE_GRIP) }, | 1442 | { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK, USB_DEVICE_ID_HOLTEK_ON_LINE_GRIP) }, |
1443 | { HID_USB_DEVICE(USB_VENDOR_ID_ILITEK, USB_DEVICE_ID_ILITEK_MULTITOUCH) }, | 1443 | { HID_USB_DEVICE(USB_VENDOR_ID_ILITEK, USB_DEVICE_ID_ILITEK_MULTITOUCH) }, |
1444 | { HID_USB_DEVICE(USB_VENDOR_ID_IRTOUCHSYSTEMS, USB_DEVICE_ID_IRTOUCH_INFRARED_USB) }, | 1444 | { HID_USB_DEVICE(USB_VENDOR_ID_IRTOUCHSYSTEMS, USB_DEVICE_ID_IRTOUCH_INFRARED_USB) }, |
1445 | { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) }, | 1445 | { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) }, |
1446 | { HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) }, | 1446 | { HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) }, |
1447 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) }, | 1447 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) }, |
1448 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) }, | 1448 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) }, |
1449 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) }, | 1449 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) }, |
1450 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) }, | 1450 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) }, |
1451 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, | 1451 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, |
1452 | { HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) }, | 1452 | { HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) }, |
1453 | { HID_USB_DEVICE(USB_VENDOR_ID_LG, USB_DEVICE_ID_LG_MULTITOUCH) }, | 1453 | { HID_USB_DEVICE(USB_VENDOR_ID_LG, USB_DEVICE_ID_LG_MULTITOUCH) }, |
1454 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) }, | 1454 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) }, |
1455 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER) }, | 1455 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER) }, |
1456 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2) }, | 1456 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2) }, |
1457 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RECEIVER) }, | 1457 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RECEIVER) }, |
1458 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_DESKTOP) }, | 1458 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_DESKTOP) }, |
1459 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE) }, | 1459 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE) }, |
1460 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_MINI) }, | 1460 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_MINI) }, |
1461 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD) }, | 1461 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD) }, |
1462 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500) }, | 1462 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500) }, |
1463 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D) }, | 1463 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D) }, |
1464 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL) }, | 1464 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL) }, |
1465 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD_CORD) }, | 1465 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD_CORD) }, |
1466 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD) }, | 1466 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD) }, |
1467 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2) }, | 1467 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2) }, |
1468 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_F3D) }, | 1468 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_F3D) }, |
1469 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_FFG ) }, | 1469 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_FFG ) }, |
1470 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FORCE3D_PRO) }, | 1470 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FORCE3D_PRO) }, |
1471 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940) }, | 1471 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940) }, |
1472 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL) }, | 1472 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL) }, |
1473 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2) }, | 1473 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2) }, |
1474 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_DFP_WHEEL) }, | 1474 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_DFP_WHEEL) }, |
1475 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_DFGT_WHEEL) }, | 1475 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_DFGT_WHEEL) }, |
1476 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL) }, | 1476 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL) }, |
1477 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G27_WHEEL) }, | 1477 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G27_WHEEL) }, |
1478 | #if IS_ENABLED(CONFIG_HID_LOGITECH_DJ) | 1478 | #if IS_ENABLED(CONFIG_HID_LOGITECH_DJ) |
1479 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER) }, | 1479 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER) }, |
1480 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2) }, | 1480 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2) }, |
1481 | #endif | 1481 | #endif |
1482 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WII_WHEEL) }, | 1482 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WII_WHEEL) }, |
1483 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2) }, | 1483 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2) }, |
1484 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACETRAVELLER) }, | 1484 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACETRAVELLER) }, |
1485 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR) }, | 1485 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR) }, |
1486 | { HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, USB_DEVICE_ID_CRYSTALTOUCH) }, | 1486 | { HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, USB_DEVICE_ID_CRYSTALTOUCH) }, |
1487 | { HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, USB_DEVICE_ID_CRYSTALTOUCH_DUAL) }, | 1487 | { HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, USB_DEVICE_ID_CRYSTALTOUCH_DUAL) }, |
1488 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD) }, | 1488 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD) }, |
1489 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD_BOOTLOADER) }, | 1489 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD_BOOTLOADER) }, |
1490 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_MOUSE_4500) }, | 1490 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_MOUSE_4500) }, |
1491 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) }, | 1491 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) }, |
1492 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K) }, | 1492 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K) }, |
1493 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_LK6K) }, | 1493 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_LK6K) }, |
1494 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_USB) }, | 1494 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_USB) }, |
1495 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K) }, | 1495 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K) }, |
1496 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0) }, | 1496 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0) }, |
1497 | { HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) }, | 1497 | { HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) }, |
1498 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN) }, | 1498 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN) }, |
1499 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_1) }, | 1499 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_1) }, |
1500 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_2) }, | 1500 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_2) }, |
1501 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_3) }, | 1501 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_3) }, |
1502 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_4) }, | 1502 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_4) }, |
1503 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_5) }, | 1503 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_5) }, |
1504 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_6) }, | 1504 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_6) }, |
1505 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_7) }, | 1505 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_7) }, |
1506 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_8) }, | 1506 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_8) }, |
1507 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_9) }, | 1507 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_9) }, |
1508 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_10) }, | 1508 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_10) }, |
1509 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_11) }, | 1509 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_11) }, |
1510 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_12) }, | 1510 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_12) }, |
1511 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_13) }, | 1511 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_13) }, |
1512 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_14) }, | 1512 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_14) }, |
1513 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_15) }, | 1513 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_15) }, |
1514 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_16) }, | 1514 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_16) }, |
1515 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_17) }, | 1515 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_17) }, |
1516 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18) }, | 1516 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18) }, |
1517 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_PKB1700) }, | 1517 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_PKB1700) }, |
1518 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) }, | 1518 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) }, |
1519 | { HID_USB_DEVICE(USB_VENDOR_ID_PANASONIC, USB_DEVICE_ID_PANABOARD_UBT780) }, | 1519 | { HID_USB_DEVICE(USB_VENDOR_ID_PANASONIC, USB_DEVICE_ID_PANABOARD_UBT780) }, |
1520 | { HID_USB_DEVICE(USB_VENDOR_ID_PANASONIC, USB_DEVICE_ID_PANABOARD_UBT880) }, | 1520 | { HID_USB_DEVICE(USB_VENDOR_ID_PANASONIC, USB_DEVICE_ID_PANABOARD_UBT880) }, |
1521 | { HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT, USB_DEVICE_ID_PENMOUNT_PCI) }, | 1521 | { HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT, USB_DEVICE_ID_PENMOUNT_PCI) }, |
1522 | { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) }, | 1522 | { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) }, |
1523 | { HID_USB_DEVICE(USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN) }, | 1523 | { HID_USB_DEVICE(USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN) }, |
1524 | { HID_USB_DEVICE(USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1) }, | 1524 | { HID_USB_DEVICE(USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1) }, |
1525 | { HID_USB_DEVICE(USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2) }, | 1525 | { HID_USB_DEVICE(USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2) }, |
1526 | { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_KEYBOARD) }, | 1526 | { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_KEYBOARD) }, |
1527 | { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) }, | 1527 | { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) }, |
1528 | { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN) }, | 1528 | { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN) }, |
1529 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONE) }, | 1529 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONE) }, |
1530 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ARVO) }, | 1530 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ARVO) }, |
1531 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ISKU) }, | 1531 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ISKU) }, |
1532 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPLUS) }, | 1532 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPLUS) }, |
1533 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KOVAPLUS) }, | 1533 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KOVAPLUS) }, |
1534 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_PYRA_WIRED) }, | 1534 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_PYRA_WIRED) }, |
1535 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_PYRA_WIRELESS) }, | 1535 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_PYRA_WIRELESS) }, |
1536 | { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_PS1000) }, | 1536 | { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_PS1000) }, |
1537 | { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) }, | 1537 | { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) }, |
1538 | { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) }, | 1538 | { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) }, |
1539 | { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, | 1539 | { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, |
1540 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, | 1540 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, |
1541 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) }, | 1541 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) }, |
1542 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, | 1542 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, |
1543 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) }, | 1543 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) }, |
1544 | { HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, USB_DEVICE_ID_MTP) }, | 1544 | { HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, USB_DEVICE_ID_MTP) }, |
1545 | { HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM, USB_DEVICE_ID_MTP_STM) }, | 1545 | { HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM, USB_DEVICE_ID_MTP_STM) }, |
1546 | { HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_SITRONIX, USB_DEVICE_ID_MTP_SITRONIX) }, | 1546 | { HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_SITRONIX, USB_DEVICE_ID_MTP_SITRONIX) }, |
1547 | { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) }, | 1547 | { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) }, |
1548 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) }, | 1548 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) }, |
1549 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) }, | 1549 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) }, |
1550 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb323) }, | 1550 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb323) }, |
1551 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb324) }, | 1551 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb324) }, |
1552 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651) }, | 1552 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651) }, |
1553 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb653) }, | 1553 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb653) }, |
1554 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) }, | 1554 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) }, |
1555 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb65a) }, | 1555 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb65a) }, |
1556 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_BT) }, | 1556 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_BT) }, |
1557 | { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE) }, | 1557 | { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE) }, |
1558 | { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) }, | 1558 | { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) }, |
1559 | { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED2, USB_DEVICE_ID_TOPSEED2_RF_COMBO) }, | 1559 | { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED2, USB_DEVICE_ID_TOPSEED2_RF_COMBO) }, |
1560 | { HID_USB_DEVICE(USB_VENDOR_ID_TOUCH_INTL, USB_DEVICE_ID_TOUCH_INTL_MULTI_TOUCH) }, | 1560 | { HID_USB_DEVICE(USB_VENDOR_ID_TOUCH_INTL, USB_DEVICE_ID_TOUCH_INTL_MULTI_TOUCH) }, |
1561 | { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) }, | 1561 | { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) }, |
1562 | { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART) }, | 1562 | { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART) }, |
1563 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_PF1209) }, | 1563 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_PF1209) }, |
1564 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U) }, | 1564 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U) }, |
1565 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U) }, | 1565 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U) }, |
1566 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U) }, | 1566 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U) }, |
1567 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP1062) }, | 1567 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP1062) }, |
1568 | { HID_USB_DEVICE(USB_VENDOR_ID_UNITEC, USB_DEVICE_ID_UNITEC_USB_TOUCH_0709) }, | 1568 | { HID_USB_DEVICE(USB_VENDOR_ID_UNITEC, USB_DEVICE_ID_UNITEC_USB_TOUCH_0709) }, |
1569 | { HID_USB_DEVICE(USB_VENDOR_ID_UNITEC, USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) }, | 1569 | { HID_USB_DEVICE(USB_VENDOR_ID_UNITEC, USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) }, |
1570 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) }, | 1570 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) }, |
1571 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SUPER_JOY_BOX_3) }, | 1571 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SUPER_JOY_BOX_3) }, |
1572 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD) }, | 1572 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD) }, |
1573 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_3_PRO) }, | 1573 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_3_PRO) }, |
1574 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_DUAL_BOX_PRO) }, | 1574 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_DUAL_BOX_PRO) }, |
1575 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_5_PRO) }, | 1575 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_5_PRO) }, |
1576 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) }, | 1576 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) }, |
1577 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) }, | 1577 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) }, |
1578 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH) }, | 1578 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH) }, |
1579 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH) }, | 1579 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH) }, |
1580 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_Q_PAD) }, | 1580 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_Q_PAD) }, |
1581 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_PID_0038) }, | 1581 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_PID_0038) }, |
1582 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH) }, | 1582 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH) }, |
1583 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH) }, | 1583 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH) }, |
1584 | { HID_USB_DEVICE(USB_VENDOR_ID_XAT, USB_DEVICE_ID_XAT_CSR) }, | 1584 | { HID_USB_DEVICE(USB_VENDOR_ID_XAT, USB_DEVICE_ID_XAT_CSR) }, |
1585 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_SPX) }, | 1585 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_SPX) }, |
1586 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_MPX) }, | 1586 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_MPX) }, |
1587 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_CSR) }, | 1587 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_CSR) }, |
1588 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_SPX1) }, | 1588 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_SPX1) }, |
1589 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_MPX1) }, | 1589 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_MPX1) }, |
1590 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_CSR1) }, | 1590 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_CSR1) }, |
1591 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_SPX2) }, | 1591 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_SPX2) }, |
1592 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_MPX2) }, | 1592 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_MPX2) }, |
1593 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_CSR2) }, | 1593 | { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_CSR2) }, |
1594 | { HID_USB_DEVICE(USB_VENDOR_ID_X_TENSIONS, USB_DEVICE_ID_SPEEDLINK_VAD_CEZANNE) }, | 1594 | { HID_USB_DEVICE(USB_VENDOR_ID_X_TENSIONS, USB_DEVICE_ID_SPEEDLINK_VAD_CEZANNE) }, |
1595 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) }, | 1595 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) }, |
1596 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) }, | 1596 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) }, |
1597 | { HID_USB_DEVICE(USB_VENDOR_ID_ZYDACRON, USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL) }, | 1597 | { HID_USB_DEVICE(USB_VENDOR_ID_ZYDACRON, USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL) }, |
1598 | 1598 | ||
1599 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) }, | 1599 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) }, |
1600 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE) }, | 1600 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE) }, |
1601 | { } | 1601 | { } |
1602 | }; | 1602 | }; |
1603 | 1603 | ||
1604 | struct hid_dynid { | 1604 | struct hid_dynid { |
1605 | struct list_head list; | 1605 | struct list_head list; |
1606 | struct hid_device_id id; | 1606 | struct hid_device_id id; |
1607 | }; | 1607 | }; |
1608 | 1608 | ||
1609 | /** | 1609 | /** |
1610 | * store_new_id - add a new HID device ID to this driver and re-probe devices | 1610 | * store_new_id - add a new HID device ID to this driver and re-probe devices |
1611 | * @driver: target device driver | 1611 | * @driver: target device driver |
1612 | * @buf: buffer for scanning device ID data | 1612 | * @buf: buffer for scanning device ID data |
1613 | * @count: input size | 1613 | * @count: input size |
1614 | * | 1614 | * |
1615 | * Adds a new dynamic hid device ID to this driver, | 1615 | * Adds a new dynamic hid device ID to this driver, |
1616 | * and causes the driver to probe for all devices again. | 1616 | * and causes the driver to probe for all devices again. |
1617 | */ | 1617 | */ |
1618 | static ssize_t store_new_id(struct device_driver *drv, const char *buf, | 1618 | static ssize_t store_new_id(struct device_driver *drv, const char *buf, |
1619 | size_t count) | 1619 | size_t count) |
1620 | { | 1620 | { |
1621 | struct hid_driver *hdrv = container_of(drv, struct hid_driver, driver); | 1621 | struct hid_driver *hdrv = container_of(drv, struct hid_driver, driver); |
1622 | struct hid_dynid *dynid; | 1622 | struct hid_dynid *dynid; |
1623 | __u32 bus, vendor, product; | 1623 | __u32 bus, vendor, product; |
1624 | unsigned long driver_data = 0; | 1624 | unsigned long driver_data = 0; |
1625 | int ret; | 1625 | int ret; |
1626 | 1626 | ||
1627 | ret = sscanf(buf, "%x %x %x %lx", | 1627 | ret = sscanf(buf, "%x %x %x %lx", |
1628 | &bus, &vendor, &product, &driver_data); | 1628 | &bus, &vendor, &product, &driver_data); |
1629 | if (ret < 3) | 1629 | if (ret < 3) |
1630 | return -EINVAL; | 1630 | return -EINVAL; |
1631 | 1631 | ||
1632 | dynid = kzalloc(sizeof(*dynid), GFP_KERNEL); | 1632 | dynid = kzalloc(sizeof(*dynid), GFP_KERNEL); |
1633 | if (!dynid) | 1633 | if (!dynid) |
1634 | return -ENOMEM; | 1634 | return -ENOMEM; |
1635 | 1635 | ||
1636 | dynid->id.bus = bus; | 1636 | dynid->id.bus = bus; |
1637 | dynid->id.vendor = vendor; | 1637 | dynid->id.vendor = vendor; |
1638 | dynid->id.product = product; | 1638 | dynid->id.product = product; |
1639 | dynid->id.driver_data = driver_data; | 1639 | dynid->id.driver_data = driver_data; |
1640 | 1640 | ||
1641 | spin_lock(&hdrv->dyn_lock); | 1641 | spin_lock(&hdrv->dyn_lock); |
1642 | list_add_tail(&dynid->list, &hdrv->dyn_list); | 1642 | list_add_tail(&dynid->list, &hdrv->dyn_list); |
1643 | spin_unlock(&hdrv->dyn_lock); | 1643 | spin_unlock(&hdrv->dyn_lock); |
1644 | 1644 | ||
1645 | ret = driver_attach(&hdrv->driver); | 1645 | ret = driver_attach(&hdrv->driver); |
1646 | 1646 | ||
1647 | return ret ? : count; | 1647 | return ret ? : count; |
1648 | } | 1648 | } |
1649 | static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id); | 1649 | static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id); |
1650 | 1650 | ||
1651 | static void hid_free_dynids(struct hid_driver *hdrv) | 1651 | static void hid_free_dynids(struct hid_driver *hdrv) |
1652 | { | 1652 | { |
1653 | struct hid_dynid *dynid, *n; | 1653 | struct hid_dynid *dynid, *n; |
1654 | 1654 | ||
1655 | spin_lock(&hdrv->dyn_lock); | 1655 | spin_lock(&hdrv->dyn_lock); |
1656 | list_for_each_entry_safe(dynid, n, &hdrv->dyn_list, list) { | 1656 | list_for_each_entry_safe(dynid, n, &hdrv->dyn_list, list) { |
1657 | list_del(&dynid->list); | 1657 | list_del(&dynid->list); |
1658 | kfree(dynid); | 1658 | kfree(dynid); |
1659 | } | 1659 | } |
1660 | spin_unlock(&hdrv->dyn_lock); | 1660 | spin_unlock(&hdrv->dyn_lock); |
1661 | } | 1661 | } |
1662 | 1662 | ||
1663 | static const struct hid_device_id *hid_match_device(struct hid_device *hdev, | 1663 | static const struct hid_device_id *hid_match_device(struct hid_device *hdev, |
1664 | struct hid_driver *hdrv) | 1664 | struct hid_driver *hdrv) |
1665 | { | 1665 | { |
1666 | struct hid_dynid *dynid; | 1666 | struct hid_dynid *dynid; |
1667 | 1667 | ||
1668 | spin_lock(&hdrv->dyn_lock); | 1668 | spin_lock(&hdrv->dyn_lock); |
1669 | list_for_each_entry(dynid, &hdrv->dyn_list, list) { | 1669 | list_for_each_entry(dynid, &hdrv->dyn_list, list) { |
1670 | if (hid_match_one_id(hdev, &dynid->id)) { | 1670 | if (hid_match_one_id(hdev, &dynid->id)) { |
1671 | spin_unlock(&hdrv->dyn_lock); | 1671 | spin_unlock(&hdrv->dyn_lock); |
1672 | return &dynid->id; | 1672 | return &dynid->id; |
1673 | } | 1673 | } |
1674 | } | 1674 | } |
1675 | spin_unlock(&hdrv->dyn_lock); | 1675 | spin_unlock(&hdrv->dyn_lock); |
1676 | 1676 | ||
1677 | return hid_match_id(hdev, hdrv->id_table); | 1677 | return hid_match_id(hdev, hdrv->id_table); |
1678 | } | 1678 | } |
1679 | 1679 | ||
1680 | static int hid_bus_match(struct device *dev, struct device_driver *drv) | 1680 | static int hid_bus_match(struct device *dev, struct device_driver *drv) |
1681 | { | 1681 | { |
1682 | struct hid_driver *hdrv = container_of(drv, struct hid_driver, driver); | 1682 | struct hid_driver *hdrv = container_of(drv, struct hid_driver, driver); |
1683 | struct hid_device *hdev = container_of(dev, struct hid_device, dev); | 1683 | struct hid_device *hdev = container_of(dev, struct hid_device, dev); |
1684 | 1684 | ||
1685 | if ((hdev->quirks & HID_QUIRK_MULTITOUCH) && | 1685 | if ((hdev->quirks & HID_QUIRK_MULTITOUCH) && |
1686 | !strncmp(hdrv->name, "hid-multitouch", 14)) | 1686 | !strncmp(hdrv->name, "hid-multitouch", 14)) |
1687 | return 1; | 1687 | return 1; |
1688 | 1688 | ||
1689 | if (!hid_match_device(hdev, hdrv)) | 1689 | if (!hid_match_device(hdev, hdrv)) |
1690 | return 0; | 1690 | return 0; |
1691 | 1691 | ||
1692 | /* generic wants all that don't have specialized driver */ | 1692 | /* generic wants all that don't have specialized driver */ |
1693 | if (!strncmp(hdrv->name, "generic-", 8) && !hid_ignore_special_drivers) | 1693 | if (!strncmp(hdrv->name, "generic-", 8) && !hid_ignore_special_drivers) |
1694 | return !hid_match_id(hdev, hid_have_special_driver); | 1694 | return !hid_match_id(hdev, hid_have_special_driver); |
1695 | 1695 | ||
1696 | return 1; | 1696 | return 1; |
1697 | } | 1697 | } |
1698 | 1698 | ||
1699 | static int hid_device_probe(struct device *dev) | 1699 | static int hid_device_probe(struct device *dev) |
1700 | { | 1700 | { |
1701 | struct hid_driver *hdrv = container_of(dev->driver, | 1701 | struct hid_driver *hdrv = container_of(dev->driver, |
1702 | struct hid_driver, driver); | 1702 | struct hid_driver, driver); |
1703 | struct hid_device *hdev = container_of(dev, struct hid_device, dev); | 1703 | struct hid_device *hdev = container_of(dev, struct hid_device, dev); |
1704 | const struct hid_device_id *id; | 1704 | const struct hid_device_id *id; |
1705 | int ret = 0; | 1705 | int ret = 0; |
1706 | 1706 | ||
1707 | if (down_interruptible(&hdev->driver_lock)) | 1707 | if (down_interruptible(&hdev->driver_lock)) |
1708 | return -EINTR; | 1708 | return -EINTR; |
1709 | 1709 | ||
1710 | if (!hdev->driver) { | 1710 | if (!hdev->driver) { |
1711 | id = hid_match_device(hdev, hdrv); | 1711 | id = hid_match_device(hdev, hdrv); |
1712 | if (id == NULL) { | 1712 | if (id == NULL) { |
1713 | if (!((hdev->quirks & HID_QUIRK_MULTITOUCH) && | 1713 | if (!((hdev->quirks & HID_QUIRK_MULTITOUCH) && |
1714 | !strncmp(hdrv->name, "hid-multitouch", 14))) { | 1714 | !strncmp(hdrv->name, "hid-multitouch", 14))) { |
1715 | ret = -ENODEV; | 1715 | ret = -ENODEV; |
1716 | goto unlock; | 1716 | goto unlock; |
1717 | } | 1717 | } |
1718 | } | 1718 | } |
1719 | 1719 | ||
1720 | hdev->driver = hdrv; | 1720 | hdev->driver = hdrv; |
1721 | if (hdrv->probe) { | 1721 | if (hdrv->probe) { |
1722 | ret = hdrv->probe(hdev, id); | 1722 | ret = hdrv->probe(hdev, id); |
1723 | } else { /* default probe */ | 1723 | } else { /* default probe */ |
1724 | ret = hid_parse(hdev); | 1724 | ret = hid_parse(hdev); |
1725 | if (!ret) | 1725 | if (!ret) |
1726 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); | 1726 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); |
1727 | } | 1727 | } |
1728 | if (ret) | 1728 | if (ret) |
1729 | hdev->driver = NULL; | 1729 | hdev->driver = NULL; |
1730 | } | 1730 | } |
1731 | unlock: | 1731 | unlock: |
1732 | up(&hdev->driver_lock); | 1732 | up(&hdev->driver_lock); |
1733 | return ret; | 1733 | return ret; |
1734 | } | 1734 | } |
1735 | 1735 | ||
1736 | static int hid_device_remove(struct device *dev) | 1736 | static int hid_device_remove(struct device *dev) |
1737 | { | 1737 | { |
1738 | struct hid_device *hdev = container_of(dev, struct hid_device, dev); | 1738 | struct hid_device *hdev = container_of(dev, struct hid_device, dev); |
1739 | struct hid_driver *hdrv; | 1739 | struct hid_driver *hdrv; |
1740 | 1740 | ||
1741 | if (down_interruptible(&hdev->driver_lock)) | 1741 | if (down_interruptible(&hdev->driver_lock)) |
1742 | return -EINTR; | 1742 | return -EINTR; |
1743 | 1743 | ||
1744 | hdrv = hdev->driver; | 1744 | hdrv = hdev->driver; |
1745 | if (hdrv) { | 1745 | if (hdrv) { |
1746 | if (hdrv->remove) | 1746 | if (hdrv->remove) |
1747 | hdrv->remove(hdev); | 1747 | hdrv->remove(hdev); |
1748 | else /* default remove */ | 1748 | else /* default remove */ |
1749 | hid_hw_stop(hdev); | 1749 | hid_hw_stop(hdev); |
1750 | hdev->driver = NULL; | 1750 | hdev->driver = NULL; |
1751 | } | 1751 | } |
1752 | 1752 | ||
1753 | up(&hdev->driver_lock); | 1753 | up(&hdev->driver_lock); |
1754 | return 0; | 1754 | return 0; |
1755 | } | 1755 | } |
1756 | 1756 | ||
1757 | static int hid_uevent(struct device *dev, struct kobj_uevent_env *env) | 1757 | static int hid_uevent(struct device *dev, struct kobj_uevent_env *env) |
1758 | { | 1758 | { |
1759 | struct hid_device *hdev = container_of(dev, struct hid_device, dev); | 1759 | struct hid_device *hdev = container_of(dev, struct hid_device, dev); |
1760 | 1760 | ||
1761 | if (add_uevent_var(env, "HID_ID=%04X:%08X:%08X", | 1761 | if (add_uevent_var(env, "HID_ID=%04X:%08X:%08X", |
1762 | hdev->bus, hdev->vendor, hdev->product)) | 1762 | hdev->bus, hdev->vendor, hdev->product)) |
1763 | return -ENOMEM; | 1763 | return -ENOMEM; |
1764 | 1764 | ||
1765 | if (add_uevent_var(env, "HID_NAME=%s", hdev->name)) | 1765 | if (add_uevent_var(env, "HID_NAME=%s", hdev->name)) |
1766 | return -ENOMEM; | 1766 | return -ENOMEM; |
1767 | 1767 | ||
1768 | if (add_uevent_var(env, "HID_PHYS=%s", hdev->phys)) | 1768 | if (add_uevent_var(env, "HID_PHYS=%s", hdev->phys)) |
1769 | return -ENOMEM; | 1769 | return -ENOMEM; |
1770 | 1770 | ||
1771 | if (add_uevent_var(env, "HID_UNIQ=%s", hdev->uniq)) | 1771 | if (add_uevent_var(env, "HID_UNIQ=%s", hdev->uniq)) |
1772 | return -ENOMEM; | 1772 | return -ENOMEM; |
1773 | 1773 | ||
1774 | if (add_uevent_var(env, "MODALIAS=hid:b%04Xv%08Xp%08X", | 1774 | if (add_uevent_var(env, "MODALIAS=hid:b%04Xv%08Xp%08X", |
1775 | hdev->bus, hdev->vendor, hdev->product)) | 1775 | hdev->bus, hdev->vendor, hdev->product)) |
1776 | return -ENOMEM; | 1776 | return -ENOMEM; |
1777 | 1777 | ||
1778 | return 0; | 1778 | return 0; |
1779 | } | 1779 | } |
1780 | 1780 | ||
1781 | static struct bus_type hid_bus_type = { | 1781 | static struct bus_type hid_bus_type = { |
1782 | .name = "hid", | 1782 | .name = "hid", |
1783 | .match = hid_bus_match, | 1783 | .match = hid_bus_match, |
1784 | .probe = hid_device_probe, | 1784 | .probe = hid_device_probe, |
1785 | .remove = hid_device_remove, | 1785 | .remove = hid_device_remove, |
1786 | .uevent = hid_uevent, | 1786 | .uevent = hid_uevent, |
1787 | }; | 1787 | }; |
1788 | 1788 | ||
1789 | /* a list of devices that shouldn't be handled by HID core at all */ | 1789 | /* a list of devices that shouldn't be handled by HID core at all */ |
1790 | static const struct hid_device_id hid_ignore_list[] = { | 1790 | static const struct hid_device_id hid_ignore_list[] = { |
1791 | { HID_USB_DEVICE(USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR) }, | 1791 | { HID_USB_DEVICE(USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR) }, |
1792 | { HID_USB_DEVICE(USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302) }, | 1792 | { HID_USB_DEVICE(USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302) }, |
1793 | { HID_USB_DEVICE(USB_VENDOR_ID_ADS_TECH, USB_DEVICE_ID_ADS_TECH_RADIO_SI470X) }, | 1793 | { HID_USB_DEVICE(USB_VENDOR_ID_ADS_TECH, USB_DEVICE_ID_ADS_TECH_RADIO_SI470X) }, |
1794 | { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_01) }, | 1794 | { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_01) }, |
1795 | { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_10) }, | 1795 | { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_10) }, |
1796 | { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_20) }, | 1796 | { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_20) }, |
1797 | { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_21) }, | 1797 | { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_21) }, |
1798 | { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_22) }, | 1798 | { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_22) }, |
1799 | { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_23) }, | 1799 | { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_23) }, |
1800 | { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24) }, | 1800 | { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24) }, |
1801 | { HID_USB_DEVICE(USB_VENDOR_ID_AIRCABLE, USB_DEVICE_ID_AIRCABLE1) }, | 1801 | { HID_USB_DEVICE(USB_VENDOR_ID_AIRCABLE, USB_DEVICE_ID_AIRCABLE1) }, |
1802 | { HID_USB_DEVICE(USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232) }, | 1802 | { HID_USB_DEVICE(USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232) }, |
1803 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_LCM)}, | 1803 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_LCM)}, |
1804 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_LCM2)}, | 1804 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_LCM2)}, |
1805 | { HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) }, | 1805 | { HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) }, |
1806 | { HID_USB_DEVICE(USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD) }, | 1806 | { HID_USB_DEVICE(USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD) }, |
1807 | { HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) }, | 1807 | { HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) }, |
1808 | { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI470X) }, | 1808 | { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI470X) }, |
1809 | { HID_USB_DEVICE(USB_VENDOR_ID_CMEDIA, USB_DEVICE_ID_CM109) }, | 1809 | { HID_USB_DEVICE(USB_VENDOR_ID_CMEDIA, USB_DEVICE_ID_CM109) }, |
1810 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM) }, | 1810 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM) }, |
1811 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_ULTRAMOUSE) }, | 1811 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_ULTRAMOUSE) }, |
1812 | { HID_USB_DEVICE(USB_VENDOR_ID_DEALEXTREAME, USB_DEVICE_ID_DEALEXTREAME_RADIO_SI4701) }, | 1812 | { HID_USB_DEVICE(USB_VENDOR_ID_DEALEXTREAME, USB_DEVICE_ID_DEALEXTREAME_RADIO_SI4701) }, |
1813 | { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE) }, | 1813 | { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE) }, |
1814 | { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20) }, | 1814 | { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20) }, |
1815 | { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x0004) }, | 1815 | { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x0004) }, |
1816 | { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x000a) }, | 1816 | { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x000a) }, |
1817 | { HID_USB_DEVICE(USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5) }, | 1817 | { HID_USB_DEVICE(USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5) }, |
1818 | { HID_USB_DEVICE(USB_VENDOR_ID_ETT, USB_DEVICE_ID_TC5UH) }, | 1818 | { HID_USB_DEVICE(USB_VENDOR_ID_ETT, USB_DEVICE_ID_TC5UH) }, |
1819 | { HID_USB_DEVICE(USB_VENDOR_ID_ETT, USB_DEVICE_ID_TC4UM) }, | 1819 | { HID_USB_DEVICE(USB_VENDOR_ID_ETT, USB_DEVICE_ID_TC4UM) }, |
1820 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0001) }, | 1820 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0001) }, |
1821 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0002) }, | 1821 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0002) }, |
1822 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0004) }, | 1822 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0004) }, |
1823 | { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_4_PHIDGETSERVO_30) }, | 1823 | { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_4_PHIDGETSERVO_30) }, |
1824 | { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_1_PHIDGETSERVO_30) }, | 1824 | { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_1_PHIDGETSERVO_30) }, |
1825 | { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_0_4_IF_KIT) }, | 1825 | { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_0_4_IF_KIT) }, |
1826 | { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_16_16_IF_KIT) }, | 1826 | { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_16_16_IF_KIT) }, |
1827 | { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_8_8_8_IF_KIT) }, | 1827 | { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_8_8_8_IF_KIT) }, |
1828 | { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_7_IF_KIT) }, | 1828 | { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_7_IF_KIT) }, |
1829 | { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_8_IF_KIT) }, | 1829 | { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_8_IF_KIT) }, |
1830 | { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_PHIDGET_MOTORCONTROL) }, | 1830 | { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_PHIDGET_MOTORCONTROL) }, |
1831 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_SUPER_Q2) }, | 1831 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_SUPER_Q2) }, |
1832 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_GOGOPEN) }, | 1832 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_GOGOPEN) }, |
1833 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_PENPOWER) }, | 1833 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_PENPOWER) }, |
1834 | { HID_USB_DEVICE(USB_VENDOR_ID_GRETAGMACBETH, USB_DEVICE_ID_GRETAGMACBETH_HUEY) }, | 1834 | { HID_USB_DEVICE(USB_VENDOR_ID_GRETAGMACBETH, USB_DEVICE_ID_GRETAGMACBETH_HUEY) }, |
1835 | { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE) }, | 1835 | { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE) }, |
1836 | { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB) }, | 1836 | { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB) }, |
1837 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_90) }, | 1837 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_90) }, |
1838 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_100) }, | 1838 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_100) }, |
1839 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_101) }, | 1839 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_101) }, |
1840 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_103) }, | 1840 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_103) }, |
1841 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_104) }, | 1841 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_104) }, |
1842 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_105) }, | 1842 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_105) }, |
1843 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_106) }, | 1843 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_106) }, |
1844 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_107) }, | 1844 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_107) }, |
1845 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_108) }, | 1845 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_108) }, |
1846 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_200) }, | 1846 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_200) }, |
1847 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_201) }, | 1847 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_201) }, |
1848 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_202) }, | 1848 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_202) }, |
1849 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_203) }, | 1849 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_203) }, |
1850 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_204) }, | 1850 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_204) }, |
1851 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_205) }, | 1851 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_205) }, |
1852 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_206) }, | 1852 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_206) }, |
1853 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_207) }, | 1853 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_207) }, |
1854 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_300) }, | 1854 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_300) }, |
1855 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_301) }, | 1855 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_301) }, |
1856 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_302) }, | 1856 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_302) }, |
1857 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_303) }, | 1857 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_303) }, |
1858 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_304) }, | 1858 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_304) }, |
1859 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_305) }, | 1859 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_305) }, |
1860 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_306) }, | 1860 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_306) }, |
1861 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_307) }, | 1861 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_307) }, |
1862 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_308) }, | 1862 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_308) }, |
1863 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_309) }, | 1863 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_309) }, |
1864 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_400) }, | 1864 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_400) }, |
1865 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_401) }, | 1865 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_401) }, |
1866 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_402) }, | 1866 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_402) }, |
1867 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_403) }, | 1867 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_403) }, |
1868 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_404) }, | 1868 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_404) }, |
1869 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_405) }, | 1869 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_405) }, |
1870 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_500) }, | 1870 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_500) }, |
1871 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_501) }, | 1871 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_501) }, |
1872 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_502) }, | 1872 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_502) }, |
1873 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_503) }, | 1873 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_503) }, |
1874 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_504) }, | 1874 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_504) }, |
1875 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1000) }, | 1875 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1000) }, |
1876 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1001) }, | 1876 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1001) }, |
1877 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1002) }, | 1877 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1002) }, |
1878 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1003) }, | 1878 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1003) }, |
1879 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1004) }, | 1879 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1004) }, |
1880 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1005) }, | 1880 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1005) }, |
1881 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1006) }, | 1881 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1006) }, |
1882 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1007) }, | 1882 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1007) }, |
1883 | { HID_USB_DEVICE(USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA) }, | 1883 | { HID_USB_DEVICE(USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA) }, |
1884 | { HID_USB_DEVICE(USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO) }, | 1884 | { HID_USB_DEVICE(USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO) }, |
1885 | { HID_USB_DEVICE(USB_VENDOR_ID_KWORLD, USB_DEVICE_ID_KWORLD_RADIO_FM700) }, | 1885 | { HID_USB_DEVICE(USB_VENDOR_ID_KWORLD, USB_DEVICE_ID_KWORLD_RADIO_FM700) }, |
1886 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_GPEN_560) }, | 1886 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_GPEN_560) }, |
1887 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_KYE, 0x0058) }, | 1887 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_KYE, 0x0058) }, |
1888 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY) }, | 1888 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY) }, |
1889 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY2) }, | 1889 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY2) }, |
1890 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY) }, | 1890 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY) }, |
1891 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY2) }, | 1891 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY2) }, |
1892 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY) }, | 1892 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY) }, |
1893 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY2) }, | 1893 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY2) }, |
1894 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYVOLTAGE) }, | 1894 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYVOLTAGE) }, |
1895 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYCURRENT) }, | 1895 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYCURRENT) }, |
1896 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTIME) }, | 1896 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTIME) }, |
1897 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE) }, | 1897 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE) }, |
1898 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYPH) }, | 1898 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYPH) }, |
1899 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) }, | 1899 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) }, |
1900 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) }, | 1900 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) }, |
1901 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) }, | 1901 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) }, |
1902 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIC) }, | 1902 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIC) }, |
1903 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIB) }, | 1903 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIB) }, |
1904 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY) }, | 1904 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY) }, |
1905 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY2) }, | 1905 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY2) }, |
1906 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_VIDEOCOM) }, | 1906 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_VIDEOCOM) }, |
1907 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOTOR) }, | 1907 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOTOR) }, |
1908 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_COM3LAB) }, | 1908 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_COM3LAB) }, |
1909 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_TELEPORT) }, | 1909 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_TELEPORT) }, |
1910 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_NETWORKANALYSER) }, | 1910 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_NETWORKANALYSER) }, |
1911 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERCONTROL) }, | 1911 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERCONTROL) }, |
1912 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETEST) }, | 1912 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETEST) }, |
1913 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOSTANALYSER) }, | 1913 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOSTANALYSER) }, |
1914 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOSTANALYSER2) }, | 1914 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOSTANALYSER2) }, |
1915 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_ABSESP) }, | 1915 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_ABSESP) }, |
1916 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_AUTODATABUS) }, | 1916 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_AUTODATABUS) }, |
1917 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MCT) }, | 1917 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MCT) }, |
1918 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HYBRID) }, | 1918 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HYBRID) }, |
1919 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HEATCONTROL) }, | 1919 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HEATCONTROL) }, |
1920 | { HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_BEATPAD) }, | ||
1920 | { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS) }, | 1921 | { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS) }, |
1921 | { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS) }, | 1922 | { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS) }, |
1922 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1) }, | 1923 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1) }, |
1923 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT2) }, | 1924 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT2) }, |
1924 | { HID_USB_DEVICE(USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR, USB_DEVICE_ID_N_S_HARMONY) }, | 1925 | { HID_USB_DEVICE(USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR, USB_DEVICE_ID_N_S_HARMONY) }, |
1925 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100) }, | 1926 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100) }, |
1926 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 20) }, | 1927 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 20) }, |
1927 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 30) }, | 1928 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 30) }, |
1928 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 100) }, | 1929 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 100) }, |
1929 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 108) }, | 1930 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 108) }, |
1930 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 118) }, | 1931 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 118) }, |
1931 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 200) }, | 1932 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 200) }, |
1932 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 300) }, | 1933 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 300) }, |
1933 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 400) }, | 1934 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 400) }, |
1934 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 500) }, | 1935 | { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 500) }, |
1935 | { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0001) }, | 1936 | { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0001) }, |
1936 | { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0002) }, | 1937 | { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0002) }, |
1937 | { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0003) }, | 1938 | { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0003) }, |
1938 | { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0004) }, | 1939 | { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0004) }, |
1939 | { HID_USB_DEVICE(USB_VENDOR_ID_PHILIPS, USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE) }, | 1940 | { HID_USB_DEVICE(USB_VENDOR_ID_PHILIPS, USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE) }, |
1940 | { HID_USB_DEVICE(USB_VENDOR_ID_POWERCOM, USB_DEVICE_ID_POWERCOM_UPS) }, | 1941 | { HID_USB_DEVICE(USB_VENDOR_ID_POWERCOM, USB_DEVICE_ID_POWERCOM_UPS) }, |
1941 | #if defined(CONFIG_MOUSE_SYNAPTICS_USB) || defined(CONFIG_MOUSE_SYNAPTICS_USB_MODULE) | 1942 | #if defined(CONFIG_MOUSE_SYNAPTICS_USB) || defined(CONFIG_MOUSE_SYNAPTICS_USB_MODULE) |
1942 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_TP) }, | 1943 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_TP) }, |
1943 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_INT_TP) }, | 1944 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_INT_TP) }, |
1944 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_CPAD) }, | 1945 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_CPAD) }, |
1945 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_STICK) }, | 1946 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_STICK) }, |
1946 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_WP) }, | 1947 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_WP) }, |
1947 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_COMP_TP) }, | 1948 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_COMP_TP) }, |
1948 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_WTP) }, | 1949 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_WTP) }, |
1949 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_DPAD) }, | 1950 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_DPAD) }, |
1950 | #endif | 1951 | #endif |
1951 | { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO) }, | 1952 | { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO) }, |
1952 | { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) }, | 1953 | { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) }, |
1953 | { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) }, | 1954 | { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) }, |
1954 | { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS) }, | 1955 | { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS) }, |
1955 | { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LCSPEC) }, | 1956 | { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LCSPEC) }, |
1956 | { HID_USB_DEVICE(USB_VENDOR_ID_WACOM, HID_ANY_ID) }, | 1957 | { HID_USB_DEVICE(USB_VENDOR_ID_WACOM, HID_ANY_ID) }, |
1957 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20) }, | 1958 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20) }, |
1958 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20) }, | 1959 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20) }, |
1959 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_8_8_4_IF_KIT) }, | 1960 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_8_8_4_IF_KIT) }, |
1960 | { HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) }, | 1961 | { HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) }, |
1961 | { } | 1962 | { } |
1962 | }; | 1963 | }; |
1963 | 1964 | ||
1964 | /** | 1965 | /** |
1965 | * hid_mouse_ignore_list - mouse devices which should not be handled by the hid layer | 1966 | * hid_mouse_ignore_list - mouse devices which should not be handled by the hid layer |
1966 | * | 1967 | * |
1967 | * There are composite devices for which we want to ignore only a certain | 1968 | * There are composite devices for which we want to ignore only a certain |
1968 | * interface. This is a list of devices for which only the mouse interface will | 1969 | * interface. This is a list of devices for which only the mouse interface will |
1969 | * be ignored. This allows a dedicated driver to take care of the interface. | 1970 | * be ignored. This allows a dedicated driver to take care of the interface. |
1970 | */ | 1971 | */ |
1971 | static const struct hid_device_id hid_mouse_ignore_list[] = { | 1972 | static const struct hid_device_id hid_mouse_ignore_list[] = { |
1972 | /* appletouch driver */ | 1973 | /* appletouch driver */ |
1973 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) }, | 1974 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) }, |
1974 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO) }, | 1975 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO) }, |
1975 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI) }, | 1976 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI) }, |
1976 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO) }, | 1977 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO) }, |
1977 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS) }, | 1978 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS) }, |
1978 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI) }, | 1979 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI) }, |
1979 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO) }, | 1980 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO) }, |
1980 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS) }, | 1981 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS) }, |
1981 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI) }, | 1982 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI) }, |
1982 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO) }, | 1983 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO) }, |
1983 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS) }, | 1984 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS) }, |
1984 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI) }, | 1985 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI) }, |
1985 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO) }, | 1986 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO) }, |
1986 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS) }, | 1987 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS) }, |
1987 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI) }, | 1988 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI) }, |
1988 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO) }, | 1989 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO) }, |
1989 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS) }, | 1990 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS) }, |
1990 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) }, | 1991 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) }, |
1991 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) }, | 1992 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) }, |
1992 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) }, | 1993 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) }, |
1993 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) }, | 1994 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) }, |
1994 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) }, | 1995 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) }, |
1995 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) }, | 1996 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) }, |
1996 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI) }, | 1997 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI) }, |
1997 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO) }, | 1998 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO) }, |
1998 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS) }, | 1999 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS) }, |
1999 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI) }, | 2000 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI) }, |
2000 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO) }, | 2001 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO) }, |
2001 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) }, | 2002 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) }, |
2002 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI) }, | 2003 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI) }, |
2003 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ISO) }, | 2004 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ISO) }, |
2004 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_JIS) }, | 2005 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_JIS) }, |
2005 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI) }, | 2006 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI) }, |
2006 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO) }, | 2007 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO) }, |
2007 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS) }, | 2008 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS) }, |
2008 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI) }, | 2009 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI) }, |
2009 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ISO) }, | 2010 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ISO) }, |
2010 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_JIS) }, | 2011 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_JIS) }, |
2011 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI) }, | 2012 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI) }, |
2012 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO) }, | 2013 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO) }, |
2013 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS) }, | 2014 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS) }, |
2014 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI) }, | 2015 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI) }, |
2015 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO) }, | 2016 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO) }, |
2016 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS) }, | 2017 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS) }, |
2017 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, | 2018 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, |
2018 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, | 2019 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, |
2019 | { } | 2020 | { } |
2020 | }; | 2021 | }; |
2021 | 2022 | ||
2022 | static bool hid_ignore(struct hid_device *hdev) | 2023 | static bool hid_ignore(struct hid_device *hdev) |
2023 | { | 2024 | { |
2024 | switch (hdev->vendor) { | 2025 | switch (hdev->vendor) { |
2025 | case USB_VENDOR_ID_CODEMERCS: | 2026 | case USB_VENDOR_ID_CODEMERCS: |
2026 | /* ignore all Code Mercenaries IOWarrior devices */ | 2027 | /* ignore all Code Mercenaries IOWarrior devices */ |
2027 | if (hdev->product >= USB_DEVICE_ID_CODEMERCS_IOW_FIRST && | 2028 | if (hdev->product >= USB_DEVICE_ID_CODEMERCS_IOW_FIRST && |
2028 | hdev->product <= USB_DEVICE_ID_CODEMERCS_IOW_LAST) | 2029 | hdev->product <= USB_DEVICE_ID_CODEMERCS_IOW_LAST) |
2029 | return true; | 2030 | return true; |
2030 | break; | 2031 | break; |
2031 | case USB_VENDOR_ID_LOGITECH: | 2032 | case USB_VENDOR_ID_LOGITECH: |
2032 | if (hdev->product >= USB_DEVICE_ID_LOGITECH_HARMONY_FIRST && | 2033 | if (hdev->product >= USB_DEVICE_ID_LOGITECH_HARMONY_FIRST && |
2033 | hdev->product <= USB_DEVICE_ID_LOGITECH_HARMONY_LAST) | 2034 | hdev->product <= USB_DEVICE_ID_LOGITECH_HARMONY_LAST) |
2034 | return true; | 2035 | return true; |
2035 | /* | 2036 | /* |
2036 | * The Keene FM transmitter USB device has the same USB ID as | 2037 | * The Keene FM transmitter USB device has the same USB ID as |
2037 | * the Logitech AudioHub Speaker, but it should ignore the hid. | 2038 | * the Logitech AudioHub Speaker, but it should ignore the hid. |
2038 | * Check if the name is that of the Keene device. | 2039 | * Check if the name is that of the Keene device. |
2039 | * For reference: the name of the AudioHub is | 2040 | * For reference: the name of the AudioHub is |
2040 | * "HOLTEK AudioHub Speaker". | 2041 | * "HOLTEK AudioHub Speaker". |
2041 | */ | 2042 | */ |
2042 | if (hdev->product == USB_DEVICE_ID_LOGITECH_AUDIOHUB && | 2043 | if (hdev->product == USB_DEVICE_ID_LOGITECH_AUDIOHUB && |
2043 | !strcmp(hdev->name, "HOLTEK B-LINK USB Audio ")) | 2044 | !strcmp(hdev->name, "HOLTEK B-LINK USB Audio ")) |
2044 | return true; | 2045 | return true; |
2045 | break; | 2046 | break; |
2046 | case USB_VENDOR_ID_SOUNDGRAPH: | 2047 | case USB_VENDOR_ID_SOUNDGRAPH: |
2047 | if (hdev->product >= USB_DEVICE_ID_SOUNDGRAPH_IMON_FIRST && | 2048 | if (hdev->product >= USB_DEVICE_ID_SOUNDGRAPH_IMON_FIRST && |
2048 | hdev->product <= USB_DEVICE_ID_SOUNDGRAPH_IMON_LAST) | 2049 | hdev->product <= USB_DEVICE_ID_SOUNDGRAPH_IMON_LAST) |
2049 | return true; | 2050 | return true; |
2050 | break; | 2051 | break; |
2051 | case USB_VENDOR_ID_HANWANG: | 2052 | case USB_VENDOR_ID_HANWANG: |
2052 | if (hdev->product >= USB_DEVICE_ID_HANWANG_TABLET_FIRST && | 2053 | if (hdev->product >= USB_DEVICE_ID_HANWANG_TABLET_FIRST && |
2053 | hdev->product <= USB_DEVICE_ID_HANWANG_TABLET_LAST) | 2054 | hdev->product <= USB_DEVICE_ID_HANWANG_TABLET_LAST) |
2054 | return true; | 2055 | return true; |
2055 | break; | 2056 | break; |
2056 | case USB_VENDOR_ID_JESS: | 2057 | case USB_VENDOR_ID_JESS: |
2057 | if (hdev->product == USB_DEVICE_ID_JESS_YUREX && | 2058 | if (hdev->product == USB_DEVICE_ID_JESS_YUREX && |
2058 | hdev->type == HID_TYPE_USBNONE) | 2059 | hdev->type == HID_TYPE_USBNONE) |
2059 | return true; | 2060 | return true; |
2060 | break; | 2061 | break; |
2061 | } | 2062 | } |
2062 | 2063 | ||
2063 | if (hdev->type == HID_TYPE_USBMOUSE && | 2064 | if (hdev->type == HID_TYPE_USBMOUSE && |
2064 | hid_match_id(hdev, hid_mouse_ignore_list)) | 2065 | hid_match_id(hdev, hid_mouse_ignore_list)) |
2065 | return true; | 2066 | return true; |
2066 | 2067 | ||
2067 | return !!hid_match_id(hdev, hid_ignore_list); | 2068 | return !!hid_match_id(hdev, hid_ignore_list); |
2068 | } | 2069 | } |
2069 | 2070 | ||
2070 | int hid_add_device(struct hid_device *hdev) | 2071 | int hid_add_device(struct hid_device *hdev) |
2071 | { | 2072 | { |
2072 | static atomic_t id = ATOMIC_INIT(0); | 2073 | static atomic_t id = ATOMIC_INIT(0); |
2073 | int ret; | 2074 | int ret; |
2074 | 2075 | ||
2075 | if (WARN_ON(hdev->status & HID_STAT_ADDED)) | 2076 | if (WARN_ON(hdev->status & HID_STAT_ADDED)) |
2076 | return -EBUSY; | 2077 | return -EBUSY; |
2077 | 2078 | ||
2078 | /* we need to kill them here, otherwise they will stay allocated to | 2079 | /* we need to kill them here, otherwise they will stay allocated to |
2079 | * wait for coming driver */ | 2080 | * wait for coming driver */ |
2080 | if (!(hdev->quirks & HID_QUIRK_NO_IGNORE) | 2081 | if (!(hdev->quirks & HID_QUIRK_NO_IGNORE) |
2081 | && (hid_ignore(hdev) || (hdev->quirks & HID_QUIRK_IGNORE))) | 2082 | && (hid_ignore(hdev) || (hdev->quirks & HID_QUIRK_IGNORE))) |
2082 | return -ENODEV; | 2083 | return -ENODEV; |
2083 | 2084 | ||
2084 | /* XXX hack, any other cleaner solution after the driver core | 2085 | /* XXX hack, any other cleaner solution after the driver core |
2085 | * is converted to allow more than 20 bytes as the device name? */ | 2086 | * is converted to allow more than 20 bytes as the device name? */ |
2086 | dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus, | 2087 | dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus, |
2087 | hdev->vendor, hdev->product, atomic_inc_return(&id)); | 2088 | hdev->vendor, hdev->product, atomic_inc_return(&id)); |
2088 | 2089 | ||
2089 | hid_debug_register(hdev, dev_name(&hdev->dev)); | 2090 | hid_debug_register(hdev, dev_name(&hdev->dev)); |
2090 | ret = device_add(&hdev->dev); | 2091 | ret = device_add(&hdev->dev); |
2091 | if (!ret) | 2092 | if (!ret) |
2092 | hdev->status |= HID_STAT_ADDED; | 2093 | hdev->status |= HID_STAT_ADDED; |
2093 | else | 2094 | else |
2094 | hid_debug_unregister(hdev); | 2095 | hid_debug_unregister(hdev); |
2095 | 2096 | ||
2096 | return ret; | 2097 | return ret; |
2097 | } | 2098 | } |
2098 | EXPORT_SYMBOL_GPL(hid_add_device); | 2099 | EXPORT_SYMBOL_GPL(hid_add_device); |
2099 | 2100 | ||
2100 | /** | 2101 | /** |
2101 | * hid_allocate_device - allocate new hid device descriptor | 2102 | * hid_allocate_device - allocate new hid device descriptor |
2102 | * | 2103 | * |
2103 | * Allocate and initialize hid device, so that hid_destroy_device might be | 2104 | * Allocate and initialize hid device, so that hid_destroy_device might be |
2104 | * used to free it. | 2105 | * used to free it. |
2105 | * | 2106 | * |
2106 | * New hid_device pointer is returned on success, otherwise ERR_PTR encoded | 2107 | * New hid_device pointer is returned on success, otherwise ERR_PTR encoded |
2107 | * error value. | 2108 | * error value. |
2108 | */ | 2109 | */ |
2109 | struct hid_device *hid_allocate_device(void) | 2110 | struct hid_device *hid_allocate_device(void) |
2110 | { | 2111 | { |
2111 | struct hid_device *hdev; | 2112 | struct hid_device *hdev; |
2112 | unsigned int i; | 2113 | unsigned int i; |
2113 | int ret = -ENOMEM; | 2114 | int ret = -ENOMEM; |
2114 | 2115 | ||
2115 | hdev = kzalloc(sizeof(*hdev), GFP_KERNEL); | 2116 | hdev = kzalloc(sizeof(*hdev), GFP_KERNEL); |
2116 | if (hdev == NULL) | 2117 | if (hdev == NULL) |
2117 | return ERR_PTR(ret); | 2118 | return ERR_PTR(ret); |
2118 | 2119 | ||
2119 | device_initialize(&hdev->dev); | 2120 | device_initialize(&hdev->dev); |
2120 | hdev->dev.release = hid_device_release; | 2121 | hdev->dev.release = hid_device_release; |
2121 | hdev->dev.bus = &hid_bus_type; | 2122 | hdev->dev.bus = &hid_bus_type; |
2122 | 2123 | ||
2123 | hdev->collection = kcalloc(HID_DEFAULT_NUM_COLLECTIONS, | 2124 | hdev->collection = kcalloc(HID_DEFAULT_NUM_COLLECTIONS, |
2124 | sizeof(struct hid_collection), GFP_KERNEL); | 2125 | sizeof(struct hid_collection), GFP_KERNEL); |
2125 | if (hdev->collection == NULL) | 2126 | if (hdev->collection == NULL) |
2126 | goto err; | 2127 | goto err; |
2127 | hdev->collection_size = HID_DEFAULT_NUM_COLLECTIONS; | 2128 | hdev->collection_size = HID_DEFAULT_NUM_COLLECTIONS; |
2128 | 2129 | ||
2129 | for (i = 0; i < HID_REPORT_TYPES; i++) | 2130 | for (i = 0; i < HID_REPORT_TYPES; i++) |
2130 | INIT_LIST_HEAD(&hdev->report_enum[i].report_list); | 2131 | INIT_LIST_HEAD(&hdev->report_enum[i].report_list); |
2131 | 2132 | ||
2132 | init_waitqueue_head(&hdev->debug_wait); | 2133 | init_waitqueue_head(&hdev->debug_wait); |
2133 | INIT_LIST_HEAD(&hdev->debug_list); | 2134 | INIT_LIST_HEAD(&hdev->debug_list); |
2134 | sema_init(&hdev->driver_lock, 1); | 2135 | sema_init(&hdev->driver_lock, 1); |
2135 | 2136 | ||
2136 | return hdev; | 2137 | return hdev; |
2137 | err: | 2138 | err: |
2138 | put_device(&hdev->dev); | 2139 | put_device(&hdev->dev); |
2139 | return ERR_PTR(ret); | 2140 | return ERR_PTR(ret); |
2140 | } | 2141 | } |
2141 | EXPORT_SYMBOL_GPL(hid_allocate_device); | 2142 | EXPORT_SYMBOL_GPL(hid_allocate_device); |
2142 | 2143 | ||
2143 | static void hid_remove_device(struct hid_device *hdev) | 2144 | static void hid_remove_device(struct hid_device *hdev) |
2144 | { | 2145 | { |
2145 | if (hdev->status & HID_STAT_ADDED) { | 2146 | if (hdev->status & HID_STAT_ADDED) { |
2146 | device_del(&hdev->dev); | 2147 | device_del(&hdev->dev); |
2147 | hid_debug_unregister(hdev); | 2148 | hid_debug_unregister(hdev); |
2148 | hdev->status &= ~HID_STAT_ADDED; | 2149 | hdev->status &= ~HID_STAT_ADDED; |
2149 | } | 2150 | } |
2150 | } | 2151 | } |
2151 | 2152 | ||
2152 | /** | 2153 | /** |
2153 | * hid_destroy_device - free previously allocated device | 2154 | * hid_destroy_device - free previously allocated device |
2154 | * | 2155 | * |
2155 | * @hdev: hid device | 2156 | * @hdev: hid device |
2156 | * | 2157 | * |
2157 | * If you allocate hid_device through hid_allocate_device, you should ever | 2158 | * If you allocate hid_device through hid_allocate_device, you should ever |
2158 | * free by this function. | 2159 | * free by this function. |
2159 | */ | 2160 | */ |
2160 | void hid_destroy_device(struct hid_device *hdev) | 2161 | void hid_destroy_device(struct hid_device *hdev) |
2161 | { | 2162 | { |
2162 | hid_remove_device(hdev); | 2163 | hid_remove_device(hdev); |
2163 | put_device(&hdev->dev); | 2164 | put_device(&hdev->dev); |
2164 | } | 2165 | } |
2165 | EXPORT_SYMBOL_GPL(hid_destroy_device); | 2166 | EXPORT_SYMBOL_GPL(hid_destroy_device); |
2166 | 2167 | ||
2167 | int __hid_register_driver(struct hid_driver *hdrv, struct module *owner, | 2168 | int __hid_register_driver(struct hid_driver *hdrv, struct module *owner, |
2168 | const char *mod_name) | 2169 | const char *mod_name) |
2169 | { | 2170 | { |
2170 | int ret; | 2171 | int ret; |
2171 | 2172 | ||
2172 | hdrv->driver.name = hdrv->name; | 2173 | hdrv->driver.name = hdrv->name; |
2173 | hdrv->driver.bus = &hid_bus_type; | 2174 | hdrv->driver.bus = &hid_bus_type; |
2174 | hdrv->driver.owner = owner; | 2175 | hdrv->driver.owner = owner; |
2175 | hdrv->driver.mod_name = mod_name; | 2176 | hdrv->driver.mod_name = mod_name; |
2176 | 2177 | ||
2177 | INIT_LIST_HEAD(&hdrv->dyn_list); | 2178 | INIT_LIST_HEAD(&hdrv->dyn_list); |
2178 | spin_lock_init(&hdrv->dyn_lock); | 2179 | spin_lock_init(&hdrv->dyn_lock); |
2179 | 2180 | ||
2180 | ret = driver_register(&hdrv->driver); | 2181 | ret = driver_register(&hdrv->driver); |
2181 | if (ret) | 2182 | if (ret) |
2182 | return ret; | 2183 | return ret; |
2183 | 2184 | ||
2184 | ret = driver_create_file(&hdrv->driver, &driver_attr_new_id); | 2185 | ret = driver_create_file(&hdrv->driver, &driver_attr_new_id); |
2185 | if (ret) | 2186 | if (ret) |
2186 | driver_unregister(&hdrv->driver); | 2187 | driver_unregister(&hdrv->driver); |
2187 | 2188 | ||
2188 | return ret; | 2189 | return ret; |
2189 | } | 2190 | } |
2190 | EXPORT_SYMBOL_GPL(__hid_register_driver); | 2191 | EXPORT_SYMBOL_GPL(__hid_register_driver); |
2191 | 2192 | ||
2192 | void hid_unregister_driver(struct hid_driver *hdrv) | 2193 | void hid_unregister_driver(struct hid_driver *hdrv) |
2193 | { | 2194 | { |
2194 | driver_remove_file(&hdrv->driver, &driver_attr_new_id); | 2195 | driver_remove_file(&hdrv->driver, &driver_attr_new_id); |
2195 | driver_unregister(&hdrv->driver); | 2196 | driver_unregister(&hdrv->driver); |
2196 | hid_free_dynids(hdrv); | 2197 | hid_free_dynids(hdrv); |
2197 | } | 2198 | } |
2198 | EXPORT_SYMBOL_GPL(hid_unregister_driver); | 2199 | EXPORT_SYMBOL_GPL(hid_unregister_driver); |
2199 | 2200 | ||
2200 | int hid_check_keys_pressed(struct hid_device *hid) | 2201 | int hid_check_keys_pressed(struct hid_device *hid) |
2201 | { | 2202 | { |
2202 | struct hid_input *hidinput; | 2203 | struct hid_input *hidinput; |
2203 | int i; | 2204 | int i; |
2204 | 2205 | ||
2205 | if (!(hid->claimed & HID_CLAIMED_INPUT)) | 2206 | if (!(hid->claimed & HID_CLAIMED_INPUT)) |
2206 | return 0; | 2207 | return 0; |
2207 | 2208 | ||
2208 | list_for_each_entry(hidinput, &hid->inputs, list) { | 2209 | list_for_each_entry(hidinput, &hid->inputs, list) { |
2209 | for (i = 0; i < BITS_TO_LONGS(KEY_MAX); i++) | 2210 | for (i = 0; i < BITS_TO_LONGS(KEY_MAX); i++) |
2210 | if (hidinput->input->key[i]) | 2211 | if (hidinput->input->key[i]) |
2211 | return 1; | 2212 | return 1; |
2212 | } | 2213 | } |
2213 | 2214 | ||
2214 | return 0; | 2215 | return 0; |
2215 | } | 2216 | } |
2216 | 2217 | ||
2217 | EXPORT_SYMBOL_GPL(hid_check_keys_pressed); | 2218 | EXPORT_SYMBOL_GPL(hid_check_keys_pressed); |
2218 | 2219 | ||
2219 | static int __init hid_init(void) | 2220 | static int __init hid_init(void) |
2220 | { | 2221 | { |
2221 | int ret; | 2222 | int ret; |
2222 | 2223 | ||
2223 | if (hid_debug) | 2224 | if (hid_debug) |
2224 | pr_warn("hid_debug is now used solely for parser and driver debugging.\n" | 2225 | pr_warn("hid_debug is now used solely for parser and driver debugging.\n" |
2225 | "debugfs is now used for inspecting the device (report descriptor, reports)\n"); | 2226 | "debugfs is now used for inspecting the device (report descriptor, reports)\n"); |
2226 | 2227 | ||
2227 | ret = bus_register(&hid_bus_type); | 2228 | ret = bus_register(&hid_bus_type); |
2228 | if (ret) { | 2229 | if (ret) { |
2229 | pr_err("can't register hid bus\n"); | 2230 | pr_err("can't register hid bus\n"); |
2230 | goto err; | 2231 | goto err; |
2231 | } | 2232 | } |
2232 | 2233 | ||
2233 | ret = hidraw_init(); | 2234 | ret = hidraw_init(); |
2234 | if (ret) | 2235 | if (ret) |
2235 | goto err_bus; | 2236 | goto err_bus; |
2236 | 2237 | ||
2237 | hid_debug_init(); | 2238 | hid_debug_init(); |
2238 | 2239 | ||
2239 | return 0; | 2240 | return 0; |
2240 | err_bus: | 2241 | err_bus: |
2241 | bus_unregister(&hid_bus_type); | 2242 | bus_unregister(&hid_bus_type); |
2242 | err: | 2243 | err: |
2243 | return ret; | 2244 | return ret; |
2244 | } | 2245 | } |
2245 | 2246 | ||
2246 | static void __exit hid_exit(void) | 2247 | static void __exit hid_exit(void) |
2247 | { | 2248 | { |
2248 | hid_debug_exit(); | 2249 | hid_debug_exit(); |
2249 | hidraw_exit(); | 2250 | hidraw_exit(); |
2250 | bus_unregister(&hid_bus_type); | 2251 | bus_unregister(&hid_bus_type); |
2251 | } | 2252 | } |
2252 | 2253 | ||
2253 | module_init(hid_init); | 2254 | module_init(hid_init); |
2254 | module_exit(hid_exit); | 2255 | module_exit(hid_exit); |
2255 | 2256 | ||
2256 | MODULE_AUTHOR("Andreas Gal"); | 2257 | MODULE_AUTHOR("Andreas Gal"); |
2257 | MODULE_AUTHOR("Vojtech Pavlik"); | 2258 | MODULE_AUTHOR("Vojtech Pavlik"); |
2258 | MODULE_AUTHOR("Jiri Kosina"); | 2259 | MODULE_AUTHOR("Jiri Kosina"); |
2259 | MODULE_LICENSE(DRIVER_LICENSE); | 2260 | MODULE_LICENSE(DRIVER_LICENSE); |
2260 | 2261 | ||
2261 | 2262 |
drivers/hid/hid-ids.h
1 | /* | 1 | /* |
2 | * USB HID quirks support for Linux | 2 | * USB HID quirks support for Linux |
3 | * | 3 | * |
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-2007 Jiri Kosina | 7 | * Copyright (c) 2006-2007 Jiri Kosina |
8 | * Copyright (c) 2007 Paul Walmsley | 8 | * Copyright (c) 2007 Paul Walmsley |
9 | */ | 9 | */ |
10 | 10 | ||
11 | /* | 11 | /* |
12 | * This program is free software; you can redistribute it and/or modify it | 12 | * This program is free software; you can redistribute it and/or modify it |
13 | * under the terms of the GNU General Public License as published by the Free | 13 | * under the terms of the GNU General Public License as published by the Free |
14 | * Software Foundation; either version 2 of the License, or (at your option) | 14 | * Software Foundation; either version 2 of the License, or (at your option) |
15 | * any later version. | 15 | * any later version. |
16 | */ | 16 | */ |
17 | 17 | ||
18 | #ifndef HID_IDS_H_FILE | 18 | #ifndef HID_IDS_H_FILE |
19 | #define HID_IDS_H_FILE | 19 | #define HID_IDS_H_FILE |
20 | 20 | ||
21 | #define USB_VENDOR_ID_3M 0x0596 | 21 | #define USB_VENDOR_ID_3M 0x0596 |
22 | #define USB_DEVICE_ID_3M1968 0x0500 | 22 | #define USB_DEVICE_ID_3M1968 0x0500 |
23 | #define USB_DEVICE_ID_3M2256 0x0502 | 23 | #define USB_DEVICE_ID_3M2256 0x0502 |
24 | #define USB_DEVICE_ID_3M3266 0x0506 | 24 | #define USB_DEVICE_ID_3M3266 0x0506 |
25 | 25 | ||
26 | #define USB_VENDOR_ID_A4TECH 0x09da | 26 | #define USB_VENDOR_ID_A4TECH 0x09da |
27 | #define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006 | 27 | #define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006 |
28 | #define USB_DEVICE_ID_A4TECH_X5_005D 0x000a | 28 | #define USB_DEVICE_ID_A4TECH_X5_005D 0x000a |
29 | #define USB_DEVICE_ID_A4TECH_RP_649 0x001a | 29 | #define USB_DEVICE_ID_A4TECH_RP_649 0x001a |
30 | 30 | ||
31 | #define USB_VENDOR_ID_AASHIMA 0x06d6 | 31 | #define USB_VENDOR_ID_AASHIMA 0x06d6 |
32 | #define USB_DEVICE_ID_AASHIMA_GAMEPAD 0x0025 | 32 | #define USB_DEVICE_ID_AASHIMA_GAMEPAD 0x0025 |
33 | #define USB_DEVICE_ID_AASHIMA_PREDATOR 0x0026 | 33 | #define USB_DEVICE_ID_AASHIMA_PREDATOR 0x0026 |
34 | 34 | ||
35 | #define USB_VENDOR_ID_ACECAD 0x0460 | 35 | #define USB_VENDOR_ID_ACECAD 0x0460 |
36 | #define USB_DEVICE_ID_ACECAD_FLAIR 0x0004 | 36 | #define USB_DEVICE_ID_ACECAD_FLAIR 0x0004 |
37 | #define USB_DEVICE_ID_ACECAD_302 0x0008 | 37 | #define USB_DEVICE_ID_ACECAD_302 0x0008 |
38 | 38 | ||
39 | #define USB_VENDOR_ID_ACRUX 0x1a34 | 39 | #define USB_VENDOR_ID_ACRUX 0x1a34 |
40 | 40 | ||
41 | #define USB_VENDOR_ID_ACTIONSTAR 0x2101 | 41 | #define USB_VENDOR_ID_ACTIONSTAR 0x2101 |
42 | #define USB_DEVICE_ID_ACTIONSTAR_1011 0x1011 | 42 | #define USB_DEVICE_ID_ACTIONSTAR_1011 0x1011 |
43 | 43 | ||
44 | #define USB_VENDOR_ID_ADS_TECH 0x06e1 | 44 | #define USB_VENDOR_ID_ADS_TECH 0x06e1 |
45 | #define USB_DEVICE_ID_ADS_TECH_RADIO_SI470X 0xa155 | 45 | #define USB_DEVICE_ID_ADS_TECH_RADIO_SI470X 0xa155 |
46 | 46 | ||
47 | #define USB_VENDOR_ID_AFATECH 0x15a4 | 47 | #define USB_VENDOR_ID_AFATECH 0x15a4 |
48 | #define USB_DEVICE_ID_AFATECH_AF9016 0x9016 | 48 | #define USB_DEVICE_ID_AFATECH_AF9016 0x9016 |
49 | 49 | ||
50 | #define USB_VENDOR_ID_AIPTEK 0x08ca | 50 | #define USB_VENDOR_ID_AIPTEK 0x08ca |
51 | #define USB_DEVICE_ID_AIPTEK_01 0x0001 | 51 | #define USB_DEVICE_ID_AIPTEK_01 0x0001 |
52 | #define USB_DEVICE_ID_AIPTEK_10 0x0010 | 52 | #define USB_DEVICE_ID_AIPTEK_10 0x0010 |
53 | #define USB_DEVICE_ID_AIPTEK_20 0x0020 | 53 | #define USB_DEVICE_ID_AIPTEK_20 0x0020 |
54 | #define USB_DEVICE_ID_AIPTEK_21 0x0021 | 54 | #define USB_DEVICE_ID_AIPTEK_21 0x0021 |
55 | #define USB_DEVICE_ID_AIPTEK_22 0x0022 | 55 | #define USB_DEVICE_ID_AIPTEK_22 0x0022 |
56 | #define USB_DEVICE_ID_AIPTEK_23 0x0023 | 56 | #define USB_DEVICE_ID_AIPTEK_23 0x0023 |
57 | #define USB_DEVICE_ID_AIPTEK_24 0x0024 | 57 | #define USB_DEVICE_ID_AIPTEK_24 0x0024 |
58 | 58 | ||
59 | #define USB_VENDOR_ID_AIRCABLE 0x16CA | 59 | #define USB_VENDOR_ID_AIRCABLE 0x16CA |
60 | #define USB_DEVICE_ID_AIRCABLE1 0x1502 | 60 | #define USB_DEVICE_ID_AIRCABLE1 0x1502 |
61 | 61 | ||
62 | #define USB_VENDOR_ID_AIREN 0x1a2c | 62 | #define USB_VENDOR_ID_AIREN 0x1a2c |
63 | #define USB_DEVICE_ID_AIREN_SLIMPLUS 0x0002 | 63 | #define USB_DEVICE_ID_AIREN_SLIMPLUS 0x0002 |
64 | 64 | ||
65 | #define USB_VENDOR_ID_ALCOR 0x058f | 65 | #define USB_VENDOR_ID_ALCOR 0x058f |
66 | #define USB_DEVICE_ID_ALCOR_USBRS232 0x9720 | 66 | #define USB_DEVICE_ID_ALCOR_USBRS232 0x9720 |
67 | 67 | ||
68 | #define USB_VENDOR_ID_ALPS 0x0433 | 68 | #define USB_VENDOR_ID_ALPS 0x0433 |
69 | #define USB_DEVICE_ID_IBM_GAMEPAD 0x1101 | 69 | #define USB_DEVICE_ID_IBM_GAMEPAD 0x1101 |
70 | 70 | ||
71 | #define USB_VENDOR_ID_APPLE 0x05ac | 71 | #define USB_VENDOR_ID_APPLE 0x05ac |
72 | #define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304 | 72 | #define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304 |
73 | #define USB_DEVICE_ID_APPLE_MAGICMOUSE 0x030d | 73 | #define USB_DEVICE_ID_APPLE_MAGICMOUSE 0x030d |
74 | #define USB_DEVICE_ID_APPLE_MAGICTRACKPAD 0x030e | 74 | #define USB_DEVICE_ID_APPLE_MAGICTRACKPAD 0x030e |
75 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI 0x020e | 75 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI 0x020e |
76 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_ISO 0x020f | 76 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_ISO 0x020f |
77 | #define USB_DEVICE_ID_APPLE_GEYSER_ANSI 0x0214 | 77 | #define USB_DEVICE_ID_APPLE_GEYSER_ANSI 0x0214 |
78 | #define USB_DEVICE_ID_APPLE_GEYSER_ISO 0x0215 | 78 | #define USB_DEVICE_ID_APPLE_GEYSER_ISO 0x0215 |
79 | #define USB_DEVICE_ID_APPLE_GEYSER_JIS 0x0216 | 79 | #define USB_DEVICE_ID_APPLE_GEYSER_JIS 0x0216 |
80 | #define USB_DEVICE_ID_APPLE_GEYSER3_ANSI 0x0217 | 80 | #define USB_DEVICE_ID_APPLE_GEYSER3_ANSI 0x0217 |
81 | #define USB_DEVICE_ID_APPLE_GEYSER3_ISO 0x0218 | 81 | #define USB_DEVICE_ID_APPLE_GEYSER3_ISO 0x0218 |
82 | #define USB_DEVICE_ID_APPLE_GEYSER3_JIS 0x0219 | 82 | #define USB_DEVICE_ID_APPLE_GEYSER3_JIS 0x0219 |
83 | #define USB_DEVICE_ID_APPLE_GEYSER4_ANSI 0x021a | 83 | #define USB_DEVICE_ID_APPLE_GEYSER4_ANSI 0x021a |
84 | #define USB_DEVICE_ID_APPLE_GEYSER4_ISO 0x021b | 84 | #define USB_DEVICE_ID_APPLE_GEYSER4_ISO 0x021b |
85 | #define USB_DEVICE_ID_APPLE_GEYSER4_JIS 0x021c | 85 | #define USB_DEVICE_ID_APPLE_GEYSER4_JIS 0x021c |
86 | #define USB_DEVICE_ID_APPLE_ALU_MINI_ANSI 0x021d | 86 | #define USB_DEVICE_ID_APPLE_ALU_MINI_ANSI 0x021d |
87 | #define USB_DEVICE_ID_APPLE_ALU_MINI_ISO 0x021e | 87 | #define USB_DEVICE_ID_APPLE_ALU_MINI_ISO 0x021e |
88 | #define USB_DEVICE_ID_APPLE_ALU_MINI_JIS 0x021f | 88 | #define USB_DEVICE_ID_APPLE_ALU_MINI_JIS 0x021f |
89 | #define USB_DEVICE_ID_APPLE_ALU_ANSI 0x0220 | 89 | #define USB_DEVICE_ID_APPLE_ALU_ANSI 0x0220 |
90 | #define USB_DEVICE_ID_APPLE_ALU_ISO 0x0221 | 90 | #define USB_DEVICE_ID_APPLE_ALU_ISO 0x0221 |
91 | #define USB_DEVICE_ID_APPLE_ALU_JIS 0x0222 | 91 | #define USB_DEVICE_ID_APPLE_ALU_JIS 0x0222 |
92 | #define USB_DEVICE_ID_APPLE_WELLSPRING_ANSI 0x0223 | 92 | #define USB_DEVICE_ID_APPLE_WELLSPRING_ANSI 0x0223 |
93 | #define USB_DEVICE_ID_APPLE_WELLSPRING_ISO 0x0224 | 93 | #define USB_DEVICE_ID_APPLE_WELLSPRING_ISO 0x0224 |
94 | #define USB_DEVICE_ID_APPLE_WELLSPRING_JIS 0x0225 | 94 | #define USB_DEVICE_ID_APPLE_WELLSPRING_JIS 0x0225 |
95 | #define USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI 0x0229 | 95 | #define USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI 0x0229 |
96 | #define USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO 0x022a | 96 | #define USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO 0x022a |
97 | #define USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS 0x022b | 97 | #define USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS 0x022b |
98 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI 0x022c | 98 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI 0x022c |
99 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO 0x022d | 99 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO 0x022d |
100 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS 0x022e | 100 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS 0x022e |
101 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI 0x0230 | 101 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI 0x0230 |
102 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO 0x0231 | 102 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO 0x0231 |
103 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232 | 103 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232 |
104 | #define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236 | 104 | #define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236 |
105 | #define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237 | 105 | #define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237 |
106 | #define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238 | 106 | #define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238 |
107 | #define USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI 0x023f | 107 | #define USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI 0x023f |
108 | #define USB_DEVICE_ID_APPLE_WELLSPRING4_ISO 0x0240 | 108 | #define USB_DEVICE_ID_APPLE_WELLSPRING4_ISO 0x0240 |
109 | #define USB_DEVICE_ID_APPLE_WELLSPRING4_JIS 0x0241 | 109 | #define USB_DEVICE_ID_APPLE_WELLSPRING4_JIS 0x0241 |
110 | #define USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI 0x0242 | 110 | #define USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI 0x0242 |
111 | #define USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO 0x0243 | 111 | #define USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO 0x0243 |
112 | #define USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS 0x0244 | 112 | #define USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS 0x0244 |
113 | #define USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI 0x0245 | 113 | #define USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI 0x0245 |
114 | #define USB_DEVICE_ID_APPLE_WELLSPRING5_ISO 0x0246 | 114 | #define USB_DEVICE_ID_APPLE_WELLSPRING5_ISO 0x0246 |
115 | #define USB_DEVICE_ID_APPLE_WELLSPRING5_JIS 0x0247 | 115 | #define USB_DEVICE_ID_APPLE_WELLSPRING5_JIS 0x0247 |
116 | #define USB_DEVICE_ID_APPLE_ALU_REVB_ANSI 0x024f | 116 | #define USB_DEVICE_ID_APPLE_ALU_REVB_ANSI 0x024f |
117 | #define USB_DEVICE_ID_APPLE_ALU_REVB_ISO 0x0250 | 117 | #define USB_DEVICE_ID_APPLE_ALU_REVB_ISO 0x0250 |
118 | #define USB_DEVICE_ID_APPLE_ALU_REVB_JIS 0x0251 | 118 | #define USB_DEVICE_ID_APPLE_ALU_REVB_JIS 0x0251 |
119 | #define USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI 0x0252 | 119 | #define USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI 0x0252 |
120 | #define USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO 0x0253 | 120 | #define USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO 0x0253 |
121 | #define USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS 0x0254 | 121 | #define USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS 0x0254 |
122 | #define USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI 0x0249 | 122 | #define USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI 0x0249 |
123 | #define USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO 0x024a | 123 | #define USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO 0x024a |
124 | #define USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS 0x024b | 124 | #define USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS 0x024b |
125 | #define USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI 0x024c | 125 | #define USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI 0x024c |
126 | #define USB_DEVICE_ID_APPLE_WELLSPRING6_ISO 0x024d | 126 | #define USB_DEVICE_ID_APPLE_WELLSPRING6_ISO 0x024d |
127 | #define USB_DEVICE_ID_APPLE_WELLSPRING6_JIS 0x024e | 127 | #define USB_DEVICE_ID_APPLE_WELLSPRING6_JIS 0x024e |
128 | #define USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI 0x0262 | 128 | #define USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI 0x0262 |
129 | #define USB_DEVICE_ID_APPLE_WELLSPRING7_ISO 0x0263 | 129 | #define USB_DEVICE_ID_APPLE_WELLSPRING7_ISO 0x0263 |
130 | #define USB_DEVICE_ID_APPLE_WELLSPRING7_JIS 0x0264 | 130 | #define USB_DEVICE_ID_APPLE_WELLSPRING7_JIS 0x0264 |
131 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI 0x0239 | 131 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI 0x0239 |
132 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a | 132 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a |
133 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b | 133 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b |
134 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI 0x0255 | 134 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI 0x0255 |
135 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO 0x0256 | 135 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO 0x0256 |
136 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a | 136 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a |
137 | #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b | 137 | #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b |
138 | #define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241 | 138 | #define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241 |
139 | #define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242 | 139 | #define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242 |
140 | 140 | ||
141 | #define USB_VENDOR_ID_ASUS 0x0486 | 141 | #define USB_VENDOR_ID_ASUS 0x0486 |
142 | #define USB_DEVICE_ID_ASUS_T91MT 0x0185 | 142 | #define USB_DEVICE_ID_ASUS_T91MT 0x0185 |
143 | #define USB_DEVICE_ID_ASUSTEK_MULTITOUCH_YFO 0x0186 | 143 | #define USB_DEVICE_ID_ASUSTEK_MULTITOUCH_YFO 0x0186 |
144 | 144 | ||
145 | #define USB_VENDOR_ID_ASUSTEK 0x0b05 | 145 | #define USB_VENDOR_ID_ASUSTEK 0x0b05 |
146 | #define USB_DEVICE_ID_ASUSTEK_LCM 0x1726 | 146 | #define USB_DEVICE_ID_ASUSTEK_LCM 0x1726 |
147 | #define USB_DEVICE_ID_ASUSTEK_LCM2 0x175b | 147 | #define USB_DEVICE_ID_ASUSTEK_LCM2 0x175b |
148 | 148 | ||
149 | #define USB_VENDOR_ID_ATEN 0x0557 | 149 | #define USB_VENDOR_ID_ATEN 0x0557 |
150 | #define USB_DEVICE_ID_ATEN_UC100KM 0x2004 | 150 | #define USB_DEVICE_ID_ATEN_UC100KM 0x2004 |
151 | #define USB_DEVICE_ID_ATEN_CS124U 0x2202 | 151 | #define USB_DEVICE_ID_ATEN_CS124U 0x2202 |
152 | #define USB_DEVICE_ID_ATEN_2PORTKVM 0x2204 | 152 | #define USB_DEVICE_ID_ATEN_2PORTKVM 0x2204 |
153 | #define USB_DEVICE_ID_ATEN_4PORTKVM 0x2205 | 153 | #define USB_DEVICE_ID_ATEN_4PORTKVM 0x2205 |
154 | #define USB_DEVICE_ID_ATEN_4PORTKVMC 0x2208 | 154 | #define USB_DEVICE_ID_ATEN_4PORTKVMC 0x2208 |
155 | 155 | ||
156 | #define USB_VENDOR_ID_ATMEL 0x03eb | 156 | #define USB_VENDOR_ID_ATMEL 0x03eb |
157 | #define USB_DEVICE_ID_ATMEL_MULTITOUCH 0x211c | 157 | #define USB_DEVICE_ID_ATMEL_MULTITOUCH 0x211c |
158 | #define USB_DEVICE_ID_ATMEL_MXT_DIGITIZER 0x2118 | 158 | #define USB_DEVICE_ID_ATMEL_MXT_DIGITIZER 0x2118 |
159 | 159 | ||
160 | #define USB_VENDOR_ID_AVERMEDIA 0x07ca | 160 | #define USB_VENDOR_ID_AVERMEDIA 0x07ca |
161 | #define USB_DEVICE_ID_AVER_FM_MR800 0xb800 | 161 | #define USB_DEVICE_ID_AVER_FM_MR800 0xb800 |
162 | 162 | ||
163 | #define USB_VENDOR_ID_BELKIN 0x050d | 163 | #define USB_VENDOR_ID_BELKIN 0x050d |
164 | #define USB_DEVICE_ID_FLIP_KVM 0x3201 | 164 | #define USB_DEVICE_ID_FLIP_KVM 0x3201 |
165 | 165 | ||
166 | #define USB_VENDOR_ID_BERKSHIRE 0x0c98 | 166 | #define USB_VENDOR_ID_BERKSHIRE 0x0c98 |
167 | #define USB_DEVICE_ID_BERKSHIRE_PCWD 0x1140 | 167 | #define USB_DEVICE_ID_BERKSHIRE_PCWD 0x1140 |
168 | 168 | ||
169 | #define USB_VENDOR_ID_BTC 0x046e | 169 | #define USB_VENDOR_ID_BTC 0x046e |
170 | #define USB_DEVICE_ID_BTC_EMPREX_REMOTE 0x5578 | 170 | #define USB_DEVICE_ID_BTC_EMPREX_REMOTE 0x5578 |
171 | #define USB_DEVICE_ID_BTC_EMPREX_REMOTE_2 0x5577 | 171 | #define USB_DEVICE_ID_BTC_EMPREX_REMOTE_2 0x5577 |
172 | 172 | ||
173 | #define USB_VENDOR_ID_CANDO 0x2087 | 173 | #define USB_VENDOR_ID_CANDO 0x2087 |
174 | #define USB_DEVICE_ID_CANDO_PIXCIR_MULTI_TOUCH 0x0703 | 174 | #define USB_DEVICE_ID_CANDO_PIXCIR_MULTI_TOUCH 0x0703 |
175 | #define USB_DEVICE_ID_CANDO_MULTI_TOUCH 0x0a01 | 175 | #define USB_DEVICE_ID_CANDO_MULTI_TOUCH 0x0a01 |
176 | #define USB_DEVICE_ID_CANDO_MULTI_TOUCH_10_1 0x0a02 | 176 | #define USB_DEVICE_ID_CANDO_MULTI_TOUCH_10_1 0x0a02 |
177 | #define USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6 0x0b03 | 177 | #define USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6 0x0b03 |
178 | #define USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6 0x0f01 | 178 | #define USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6 0x0f01 |
179 | 179 | ||
180 | #define USB_VENDOR_ID_CH 0x068e | 180 | #define USB_VENDOR_ID_CH 0x068e |
181 | #define USB_DEVICE_ID_CH_PRO_THROTTLE 0x00f1 | 181 | #define USB_DEVICE_ID_CH_PRO_THROTTLE 0x00f1 |
182 | #define USB_DEVICE_ID_CH_PRO_PEDALS 0x00f2 | 182 | #define USB_DEVICE_ID_CH_PRO_PEDALS 0x00f2 |
183 | #define USB_DEVICE_ID_CH_FIGHTERSTICK 0x00f3 | 183 | #define USB_DEVICE_ID_CH_FIGHTERSTICK 0x00f3 |
184 | #define USB_DEVICE_ID_CH_COMBATSTICK 0x00f4 | 184 | #define USB_DEVICE_ID_CH_COMBATSTICK 0x00f4 |
185 | #define USB_DEVICE_ID_CH_FLIGHT_SIM_ECLIPSE_YOKE 0x0051 | 185 | #define USB_DEVICE_ID_CH_FLIGHT_SIM_ECLIPSE_YOKE 0x0051 |
186 | #define USB_DEVICE_ID_CH_FLIGHT_SIM_YOKE 0x00ff | 186 | #define USB_DEVICE_ID_CH_FLIGHT_SIM_YOKE 0x00ff |
187 | #define USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK 0x00d3 | 187 | #define USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK 0x00d3 |
188 | #define USB_DEVICE_ID_CH_AXIS_295 0x001c | 188 | #define USB_DEVICE_ID_CH_AXIS_295 0x001c |
189 | 189 | ||
190 | #define USB_VENDOR_ID_CHERRY 0x046a | 190 | #define USB_VENDOR_ID_CHERRY 0x046a |
191 | #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 | 191 | #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 |
192 | #define USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR 0x0027 | 192 | #define USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR 0x0027 |
193 | 193 | ||
194 | #define USB_VENDOR_ID_CHIC 0x05fe | 194 | #define USB_VENDOR_ID_CHIC 0x05fe |
195 | #define USB_DEVICE_ID_CHIC_GAMEPAD 0x0014 | 195 | #define USB_DEVICE_ID_CHIC_GAMEPAD 0x0014 |
196 | 196 | ||
197 | #define USB_VENDOR_ID_CHICONY 0x04f2 | 197 | #define USB_VENDOR_ID_CHICONY 0x04f2 |
198 | #define USB_DEVICE_ID_CHICONY_TACTICAL_PAD 0x0418 | 198 | #define USB_DEVICE_ID_CHICONY_TACTICAL_PAD 0x0418 |
199 | #define USB_DEVICE_ID_CHICONY_MULTI_TOUCH 0xb19d | 199 | #define USB_DEVICE_ID_CHICONY_MULTI_TOUCH 0xb19d |
200 | #define USB_DEVICE_ID_CHICONY_WIRELESS 0x0618 | 200 | #define USB_DEVICE_ID_CHICONY_WIRELESS 0x0618 |
201 | #define USB_DEVICE_ID_CHICONY_WIRELESS2 0x1123 | 201 | #define USB_DEVICE_ID_CHICONY_WIRELESS2 0x1123 |
202 | 202 | ||
203 | #define USB_VENDOR_ID_CHUNGHWAT 0x2247 | 203 | #define USB_VENDOR_ID_CHUNGHWAT 0x2247 |
204 | #define USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH 0x0001 | 204 | #define USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH 0x0001 |
205 | 205 | ||
206 | #define USB_VENDOR_ID_CIDC 0x1677 | 206 | #define USB_VENDOR_ID_CIDC 0x1677 |
207 | 207 | ||
208 | #define USB_VENDOR_ID_CMEDIA 0x0d8c | 208 | #define USB_VENDOR_ID_CMEDIA 0x0d8c |
209 | #define USB_DEVICE_ID_CM109 0x000e | 209 | #define USB_DEVICE_ID_CM109 0x000e |
210 | 210 | ||
211 | #define USB_VENDOR_ID_CODEMERCS 0x07c0 | 211 | #define USB_VENDOR_ID_CODEMERCS 0x07c0 |
212 | #define USB_DEVICE_ID_CODEMERCS_IOW_FIRST 0x1500 | 212 | #define USB_DEVICE_ID_CODEMERCS_IOW_FIRST 0x1500 |
213 | #define USB_DEVICE_ID_CODEMERCS_IOW_LAST 0x15ff | 213 | #define USB_DEVICE_ID_CODEMERCS_IOW_LAST 0x15ff |
214 | 214 | ||
215 | #define USB_VENDOR_ID_CREATIVELABS 0x041e | 215 | #define USB_VENDOR_ID_CREATIVELABS 0x041e |
216 | #define USB_DEVICE_ID_PRODIKEYS_PCMIDI 0x2801 | 216 | #define USB_DEVICE_ID_PRODIKEYS_PCMIDI 0x2801 |
217 | 217 | ||
218 | #define USB_VENDOR_ID_CVTOUCH 0x1ff7 | 218 | #define USB_VENDOR_ID_CVTOUCH 0x1ff7 |
219 | #define USB_DEVICE_ID_CVTOUCH_SCREEN 0x0013 | 219 | #define USB_DEVICE_ID_CVTOUCH_SCREEN 0x0013 |
220 | 220 | ||
221 | #define USB_VENDOR_ID_CYGNAL 0x10c4 | 221 | #define USB_VENDOR_ID_CYGNAL 0x10c4 |
222 | #define USB_DEVICE_ID_CYGNAL_RADIO_SI470X 0x818a | 222 | #define USB_DEVICE_ID_CYGNAL_RADIO_SI470X 0x818a |
223 | 223 | ||
224 | #define USB_VENDOR_ID_CYPRESS 0x04b4 | 224 | #define USB_VENDOR_ID_CYPRESS 0x04b4 |
225 | #define USB_DEVICE_ID_CYPRESS_MOUSE 0x0001 | 225 | #define USB_DEVICE_ID_CYPRESS_MOUSE 0x0001 |
226 | #define USB_DEVICE_ID_CYPRESS_HIDCOM 0x5500 | 226 | #define USB_DEVICE_ID_CYPRESS_HIDCOM 0x5500 |
227 | #define USB_DEVICE_ID_CYPRESS_ULTRAMOUSE 0x7417 | 227 | #define USB_DEVICE_ID_CYPRESS_ULTRAMOUSE 0x7417 |
228 | #define USB_DEVICE_ID_CYPRESS_BARCODE_1 0xde61 | 228 | #define USB_DEVICE_ID_CYPRESS_BARCODE_1 0xde61 |
229 | #define USB_DEVICE_ID_CYPRESS_BARCODE_2 0xde64 | 229 | #define USB_DEVICE_ID_CYPRESS_BARCODE_2 0xde64 |
230 | #define USB_DEVICE_ID_CYPRESS_BARCODE_3 0xbca1 | 230 | #define USB_DEVICE_ID_CYPRESS_BARCODE_3 0xbca1 |
231 | #define USB_DEVICE_ID_CYPRESS_TRUETOUCH 0xc001 | 231 | #define USB_DEVICE_ID_CYPRESS_TRUETOUCH 0xc001 |
232 | 232 | ||
233 | #define USB_VENDOR_ID_DEALEXTREAME 0x10c5 | 233 | #define USB_VENDOR_ID_DEALEXTREAME 0x10c5 |
234 | #define USB_DEVICE_ID_DEALEXTREAME_RADIO_SI4701 0x819a | 234 | #define USB_DEVICE_ID_DEALEXTREAME_RADIO_SI4701 0x819a |
235 | 235 | ||
236 | #define USB_VENDOR_ID_DELORME 0x1163 | 236 | #define USB_VENDOR_ID_DELORME 0x1163 |
237 | #define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100 | 237 | #define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100 |
238 | #define USB_DEVICE_ID_DELORME_EM_LT20 0x0200 | 238 | #define USB_DEVICE_ID_DELORME_EM_LT20 0x0200 |
239 | 239 | ||
240 | #define USB_VENDOR_ID_DMI 0x0c0b | 240 | #define USB_VENDOR_ID_DMI 0x0c0b |
241 | #define USB_DEVICE_ID_DMI_ENC 0x5fab | 241 | #define USB_DEVICE_ID_DMI_ENC 0x5fab |
242 | 242 | ||
243 | #define USB_VENDOR_ID_DRAGONRISE 0x0079 | 243 | #define USB_VENDOR_ID_DRAGONRISE 0x0079 |
244 | 244 | ||
245 | #define USB_VENDOR_ID_DWAV 0x0eef | 245 | #define USB_VENDOR_ID_DWAV 0x0eef |
246 | #define USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER 0x0001 | 246 | #define USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER 0x0001 |
247 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480D 0x480d | 247 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480D 0x480d |
248 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480E 0x480e | 248 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480E 0x480e |
249 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7207 0x7207 | 249 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7207 0x7207 |
250 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_720C 0x720c | 250 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_720C 0x720c |
251 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224 0x7224 | 251 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224 0x7224 |
252 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_722A 0x722A | 252 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_722A 0x722A |
253 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_725E 0x725e | 253 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_725E 0x725e |
254 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7262 0x7262 | 254 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7262 0x7262 |
255 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_726B 0x726b | 255 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_726B 0x726b |
256 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72AA 0x72aa | 256 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72AA 0x72aa |
257 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72A1 0x72a1 | 257 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72A1 0x72a1 |
258 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72FA 0x72fa | 258 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72FA 0x72fa |
259 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7302 0x7302 | 259 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7302 0x7302 |
260 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7349 0x7349 | 260 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7349 0x7349 |
261 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001 0xa001 | 261 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001 0xa001 |
262 | 262 | ||
263 | #define USB_VENDOR_ID_ELECOM 0x056e | 263 | #define USB_VENDOR_ID_ELECOM 0x056e |
264 | #define USB_DEVICE_ID_ELECOM_BM084 0x0061 | 264 | #define USB_DEVICE_ID_ELECOM_BM084 0x0061 |
265 | 265 | ||
266 | #define USB_VENDOR_ID_DREAM_CHEEKY 0x1d34 | 266 | #define USB_VENDOR_ID_DREAM_CHEEKY 0x1d34 |
267 | 267 | ||
268 | #define USB_VENDOR_ID_ELO 0x04E7 | 268 | #define USB_VENDOR_ID_ELO 0x04E7 |
269 | #define USB_DEVICE_ID_ELO_TS2515 0x0022 | 269 | #define USB_DEVICE_ID_ELO_TS2515 0x0022 |
270 | #define USB_DEVICE_ID_ELO_TS2700 0x0020 | 270 | #define USB_DEVICE_ID_ELO_TS2700 0x0020 |
271 | 271 | ||
272 | #define USB_VENDOR_ID_EMS 0x2006 | 272 | #define USB_VENDOR_ID_EMS 0x2006 |
273 | #define USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II 0x0118 | 273 | #define USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II 0x0118 |
274 | 274 | ||
275 | #define USB_VENDOR_ID_ESSENTIAL_REALITY 0x0d7f | 275 | #define USB_VENDOR_ID_ESSENTIAL_REALITY 0x0d7f |
276 | #define USB_DEVICE_ID_ESSENTIAL_REALITY_P5 0x0100 | 276 | #define USB_DEVICE_ID_ESSENTIAL_REALITY_P5 0x0100 |
277 | 277 | ||
278 | #define USB_VENDOR_ID_ETT 0x0664 | 278 | #define USB_VENDOR_ID_ETT 0x0664 |
279 | #define USB_DEVICE_ID_TC5UH 0x0309 | 279 | #define USB_DEVICE_ID_TC5UH 0x0309 |
280 | #define USB_DEVICE_ID_TC4UM 0x0306 | 280 | #define USB_DEVICE_ID_TC4UM 0x0306 |
281 | 281 | ||
282 | #define USB_VENDOR_ID_ETURBOTOUCH 0x22b9 | 282 | #define USB_VENDOR_ID_ETURBOTOUCH 0x22b9 |
283 | #define USB_DEVICE_ID_ETURBOTOUCH 0x0006 | 283 | #define USB_DEVICE_ID_ETURBOTOUCH 0x0006 |
284 | 284 | ||
285 | #define USB_VENDOR_ID_EZKEY 0x0518 | 285 | #define USB_VENDOR_ID_EZKEY 0x0518 |
286 | #define USB_DEVICE_ID_BTC_8193 0x0002 | 286 | #define USB_DEVICE_ID_BTC_8193 0x0002 |
287 | 287 | ||
288 | #define USB_VENDOR_ID_FRUCTEL 0x25B6 | 288 | #define USB_VENDOR_ID_FRUCTEL 0x25B6 |
289 | #define USB_DEVICE_ID_GAMETEL_MT_MODE 0x0002 | 289 | #define USB_DEVICE_ID_GAMETEL_MT_MODE 0x0002 |
290 | 290 | ||
291 | #define USB_VENDOR_ID_GAMERON 0x0810 | 291 | #define USB_VENDOR_ID_GAMERON 0x0810 |
292 | #define USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR 0x0001 | 292 | #define USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR 0x0001 |
293 | #define USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR 0x0002 | 293 | #define USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR 0x0002 |
294 | 294 | ||
295 | #define USB_VENDOR_ID_GENERAL_TOUCH 0x0dfc | 295 | #define USB_VENDOR_ID_GENERAL_TOUCH 0x0dfc |
296 | #define USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS 0x0003 | 296 | #define USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS 0x0003 |
297 | 297 | ||
298 | #define USB_VENDOR_ID_GLAB 0x06c2 | 298 | #define USB_VENDOR_ID_GLAB 0x06c2 |
299 | #define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038 | 299 | #define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038 |
300 | #define USB_DEVICE_ID_1_PHIDGETSERVO_30 0x0039 | 300 | #define USB_DEVICE_ID_1_PHIDGETSERVO_30 0x0039 |
301 | #define USB_DEVICE_ID_0_0_4_IF_KIT 0x0040 | 301 | #define USB_DEVICE_ID_0_0_4_IF_KIT 0x0040 |
302 | #define USB_DEVICE_ID_0_16_16_IF_KIT 0x0044 | 302 | #define USB_DEVICE_ID_0_16_16_IF_KIT 0x0044 |
303 | #define USB_DEVICE_ID_8_8_8_IF_KIT 0x0045 | 303 | #define USB_DEVICE_ID_8_8_8_IF_KIT 0x0045 |
304 | #define USB_DEVICE_ID_0_8_7_IF_KIT 0x0051 | 304 | #define USB_DEVICE_ID_0_8_7_IF_KIT 0x0051 |
305 | #define USB_DEVICE_ID_0_8_8_IF_KIT 0x0053 | 305 | #define USB_DEVICE_ID_0_8_8_IF_KIT 0x0053 |
306 | #define USB_DEVICE_ID_PHIDGET_MOTORCONTROL 0x0058 | 306 | #define USB_DEVICE_ID_PHIDGET_MOTORCONTROL 0x0058 |
307 | 307 | ||
308 | #define USB_VENDOR_ID_GOODTOUCH 0x1aad | 308 | #define USB_VENDOR_ID_GOODTOUCH 0x1aad |
309 | #define USB_DEVICE_ID_GOODTOUCH_000f 0x000f | 309 | #define USB_DEVICE_ID_GOODTOUCH_000f 0x000f |
310 | 310 | ||
311 | #define USB_VENDOR_ID_GOTOP 0x08f2 | 311 | #define USB_VENDOR_ID_GOTOP 0x08f2 |
312 | #define USB_DEVICE_ID_SUPER_Q2 0x007f | 312 | #define USB_DEVICE_ID_SUPER_Q2 0x007f |
313 | #define USB_DEVICE_ID_GOGOPEN 0x00ce | 313 | #define USB_DEVICE_ID_GOGOPEN 0x00ce |
314 | #define USB_DEVICE_ID_PENPOWER 0x00f4 | 314 | #define USB_DEVICE_ID_PENPOWER 0x00f4 |
315 | 315 | ||
316 | #define USB_VENDOR_ID_GREENASIA 0x0e8f | 316 | #define USB_VENDOR_ID_GREENASIA 0x0e8f |
317 | #define USB_DEVICE_ID_GREENASIA_DUAL_USB_JOYPAD 0x3013 | 317 | #define USB_DEVICE_ID_GREENASIA_DUAL_USB_JOYPAD 0x3013 |
318 | 318 | ||
319 | #define USB_VENDOR_ID_GRETAGMACBETH 0x0971 | 319 | #define USB_VENDOR_ID_GRETAGMACBETH 0x0971 |
320 | #define USB_DEVICE_ID_GRETAGMACBETH_HUEY 0x2005 | 320 | #define USB_DEVICE_ID_GRETAGMACBETH_HUEY 0x2005 |
321 | 321 | ||
322 | #define USB_VENDOR_ID_GRIFFIN 0x077d | 322 | #define USB_VENDOR_ID_GRIFFIN 0x077d |
323 | #define USB_DEVICE_ID_POWERMATE 0x0410 | 323 | #define USB_DEVICE_ID_POWERMATE 0x0410 |
324 | #define USB_DEVICE_ID_SOUNDKNOB 0x04AA | 324 | #define USB_DEVICE_ID_SOUNDKNOB 0x04AA |
325 | 325 | ||
326 | #define USB_VENDOR_ID_GTCO 0x078c | 326 | #define USB_VENDOR_ID_GTCO 0x078c |
327 | #define USB_DEVICE_ID_GTCO_90 0x0090 | 327 | #define USB_DEVICE_ID_GTCO_90 0x0090 |
328 | #define USB_DEVICE_ID_GTCO_100 0x0100 | 328 | #define USB_DEVICE_ID_GTCO_100 0x0100 |
329 | #define USB_DEVICE_ID_GTCO_101 0x0101 | 329 | #define USB_DEVICE_ID_GTCO_101 0x0101 |
330 | #define USB_DEVICE_ID_GTCO_103 0x0103 | 330 | #define USB_DEVICE_ID_GTCO_103 0x0103 |
331 | #define USB_DEVICE_ID_GTCO_104 0x0104 | 331 | #define USB_DEVICE_ID_GTCO_104 0x0104 |
332 | #define USB_DEVICE_ID_GTCO_105 0x0105 | 332 | #define USB_DEVICE_ID_GTCO_105 0x0105 |
333 | #define USB_DEVICE_ID_GTCO_106 0x0106 | 333 | #define USB_DEVICE_ID_GTCO_106 0x0106 |
334 | #define USB_DEVICE_ID_GTCO_107 0x0107 | 334 | #define USB_DEVICE_ID_GTCO_107 0x0107 |
335 | #define USB_DEVICE_ID_GTCO_108 0x0108 | 335 | #define USB_DEVICE_ID_GTCO_108 0x0108 |
336 | #define USB_DEVICE_ID_GTCO_200 0x0200 | 336 | #define USB_DEVICE_ID_GTCO_200 0x0200 |
337 | #define USB_DEVICE_ID_GTCO_201 0x0201 | 337 | #define USB_DEVICE_ID_GTCO_201 0x0201 |
338 | #define USB_DEVICE_ID_GTCO_202 0x0202 | 338 | #define USB_DEVICE_ID_GTCO_202 0x0202 |
339 | #define USB_DEVICE_ID_GTCO_203 0x0203 | 339 | #define USB_DEVICE_ID_GTCO_203 0x0203 |
340 | #define USB_DEVICE_ID_GTCO_204 0x0204 | 340 | #define USB_DEVICE_ID_GTCO_204 0x0204 |
341 | #define USB_DEVICE_ID_GTCO_205 0x0205 | 341 | #define USB_DEVICE_ID_GTCO_205 0x0205 |
342 | #define USB_DEVICE_ID_GTCO_206 0x0206 | 342 | #define USB_DEVICE_ID_GTCO_206 0x0206 |
343 | #define USB_DEVICE_ID_GTCO_207 0x0207 | 343 | #define USB_DEVICE_ID_GTCO_207 0x0207 |
344 | #define USB_DEVICE_ID_GTCO_300 0x0300 | 344 | #define USB_DEVICE_ID_GTCO_300 0x0300 |
345 | #define USB_DEVICE_ID_GTCO_301 0x0301 | 345 | #define USB_DEVICE_ID_GTCO_301 0x0301 |
346 | #define USB_DEVICE_ID_GTCO_302 0x0302 | 346 | #define USB_DEVICE_ID_GTCO_302 0x0302 |
347 | #define USB_DEVICE_ID_GTCO_303 0x0303 | 347 | #define USB_DEVICE_ID_GTCO_303 0x0303 |
348 | #define USB_DEVICE_ID_GTCO_304 0x0304 | 348 | #define USB_DEVICE_ID_GTCO_304 0x0304 |
349 | #define USB_DEVICE_ID_GTCO_305 0x0305 | 349 | #define USB_DEVICE_ID_GTCO_305 0x0305 |
350 | #define USB_DEVICE_ID_GTCO_306 0x0306 | 350 | #define USB_DEVICE_ID_GTCO_306 0x0306 |
351 | #define USB_DEVICE_ID_GTCO_307 0x0307 | 351 | #define USB_DEVICE_ID_GTCO_307 0x0307 |
352 | #define USB_DEVICE_ID_GTCO_308 0x0308 | 352 | #define USB_DEVICE_ID_GTCO_308 0x0308 |
353 | #define USB_DEVICE_ID_GTCO_309 0x0309 | 353 | #define USB_DEVICE_ID_GTCO_309 0x0309 |
354 | #define USB_DEVICE_ID_GTCO_400 0x0400 | 354 | #define USB_DEVICE_ID_GTCO_400 0x0400 |
355 | #define USB_DEVICE_ID_GTCO_401 0x0401 | 355 | #define USB_DEVICE_ID_GTCO_401 0x0401 |
356 | #define USB_DEVICE_ID_GTCO_402 0x0402 | 356 | #define USB_DEVICE_ID_GTCO_402 0x0402 |
357 | #define USB_DEVICE_ID_GTCO_403 0x0403 | 357 | #define USB_DEVICE_ID_GTCO_403 0x0403 |
358 | #define USB_DEVICE_ID_GTCO_404 0x0404 | 358 | #define USB_DEVICE_ID_GTCO_404 0x0404 |
359 | #define USB_DEVICE_ID_GTCO_405 0x0405 | 359 | #define USB_DEVICE_ID_GTCO_405 0x0405 |
360 | #define USB_DEVICE_ID_GTCO_500 0x0500 | 360 | #define USB_DEVICE_ID_GTCO_500 0x0500 |
361 | #define USB_DEVICE_ID_GTCO_501 0x0501 | 361 | #define USB_DEVICE_ID_GTCO_501 0x0501 |
362 | #define USB_DEVICE_ID_GTCO_502 0x0502 | 362 | #define USB_DEVICE_ID_GTCO_502 0x0502 |
363 | #define USB_DEVICE_ID_GTCO_503 0x0503 | 363 | #define USB_DEVICE_ID_GTCO_503 0x0503 |
364 | #define USB_DEVICE_ID_GTCO_504 0x0504 | 364 | #define USB_DEVICE_ID_GTCO_504 0x0504 |
365 | #define USB_DEVICE_ID_GTCO_1000 0x1000 | 365 | #define USB_DEVICE_ID_GTCO_1000 0x1000 |
366 | #define USB_DEVICE_ID_GTCO_1001 0x1001 | 366 | #define USB_DEVICE_ID_GTCO_1001 0x1001 |
367 | #define USB_DEVICE_ID_GTCO_1002 0x1002 | 367 | #define USB_DEVICE_ID_GTCO_1002 0x1002 |
368 | #define USB_DEVICE_ID_GTCO_1003 0x1003 | 368 | #define USB_DEVICE_ID_GTCO_1003 0x1003 |
369 | #define USB_DEVICE_ID_GTCO_1004 0x1004 | 369 | #define USB_DEVICE_ID_GTCO_1004 0x1004 |
370 | #define USB_DEVICE_ID_GTCO_1005 0x1005 | 370 | #define USB_DEVICE_ID_GTCO_1005 0x1005 |
371 | #define USB_DEVICE_ID_GTCO_1006 0x1006 | 371 | #define USB_DEVICE_ID_GTCO_1006 0x1006 |
372 | #define USB_DEVICE_ID_GTCO_1007 0x1007 | 372 | #define USB_DEVICE_ID_GTCO_1007 0x1007 |
373 | 373 | ||
374 | #define USB_VENDOR_ID_GYRATION 0x0c16 | 374 | #define USB_VENDOR_ID_GYRATION 0x0c16 |
375 | #define USB_DEVICE_ID_GYRATION_REMOTE 0x0002 | 375 | #define USB_DEVICE_ID_GYRATION_REMOTE 0x0002 |
376 | #define USB_DEVICE_ID_GYRATION_REMOTE_2 0x0003 | 376 | #define USB_DEVICE_ID_GYRATION_REMOTE_2 0x0003 |
377 | #define USB_DEVICE_ID_GYRATION_REMOTE_3 0x0008 | 377 | #define USB_DEVICE_ID_GYRATION_REMOTE_3 0x0008 |
378 | 378 | ||
379 | #define USB_VENDOR_ID_HANWANG 0x0b57 | 379 | #define USB_VENDOR_ID_HANWANG 0x0b57 |
380 | #define USB_DEVICE_ID_HANWANG_TABLET_FIRST 0x5000 | 380 | #define USB_DEVICE_ID_HANWANG_TABLET_FIRST 0x5000 |
381 | #define USB_DEVICE_ID_HANWANG_TABLET_LAST 0x8fff | 381 | #define USB_DEVICE_ID_HANWANG_TABLET_LAST 0x8fff |
382 | 382 | ||
383 | #define USB_VENDOR_ID_HANVON 0x20b3 | 383 | #define USB_VENDOR_ID_HANVON 0x20b3 |
384 | #define USB_DEVICE_ID_HANVON_MULTITOUCH 0x0a18 | 384 | #define USB_DEVICE_ID_HANVON_MULTITOUCH 0x0a18 |
385 | 385 | ||
386 | #define USB_VENDOR_ID_HANVON_ALT 0x22ed | 386 | #define USB_VENDOR_ID_HANVON_ALT 0x22ed |
387 | #define USB_DEVICE_ID_HANVON_ALT_MULTITOUCH 0x1010 | 387 | #define USB_DEVICE_ID_HANVON_ALT_MULTITOUCH 0x1010 |
388 | 388 | ||
389 | #define USB_VENDOR_ID_HAPP 0x078b | 389 | #define USB_VENDOR_ID_HAPP 0x078b |
390 | #define USB_DEVICE_ID_UGCI_DRIVING 0x0010 | 390 | #define USB_DEVICE_ID_UGCI_DRIVING 0x0010 |
391 | #define USB_DEVICE_ID_UGCI_FLYING 0x0020 | 391 | #define USB_DEVICE_ID_UGCI_FLYING 0x0020 |
392 | #define USB_DEVICE_ID_UGCI_FIGHTING 0x0030 | 392 | #define USB_DEVICE_ID_UGCI_FIGHTING 0x0030 |
393 | 393 | ||
394 | #define USB_VENDOR_ID_IDEACOM 0x1cb6 | 394 | #define USB_VENDOR_ID_IDEACOM 0x1cb6 |
395 | #define USB_DEVICE_ID_IDEACOM_IDC6650 0x6650 | 395 | #define USB_DEVICE_ID_IDEACOM_IDC6650 0x6650 |
396 | #define USB_DEVICE_ID_IDEACOM_IDC6651 0x6651 | 396 | #define USB_DEVICE_ID_IDEACOM_IDC6651 0x6651 |
397 | 397 | ||
398 | #define USB_VENDOR_ID_ILITEK 0x222a | 398 | #define USB_VENDOR_ID_ILITEK 0x222a |
399 | #define USB_DEVICE_ID_ILITEK_MULTITOUCH 0x0001 | 399 | #define USB_DEVICE_ID_ILITEK_MULTITOUCH 0x0001 |
400 | 400 | ||
401 | #define USB_VENDOR_ID_HOLTEK 0x1241 | 401 | #define USB_VENDOR_ID_HOLTEK 0x1241 |
402 | #define USB_DEVICE_ID_HOLTEK_ON_LINE_GRIP 0x5015 | 402 | #define USB_DEVICE_ID_HOLTEK_ON_LINE_GRIP 0x5015 |
403 | 403 | ||
404 | #define USB_VENDOR_ID_IMATION 0x0718 | 404 | #define USB_VENDOR_ID_IMATION 0x0718 |
405 | #define USB_DEVICE_ID_DISC_STAKKA 0xd000 | 405 | #define USB_DEVICE_ID_DISC_STAKKA 0xd000 |
406 | 406 | ||
407 | #define USB_VENDOR_ID_IRTOUCHSYSTEMS 0x6615 | 407 | #define USB_VENDOR_ID_IRTOUCHSYSTEMS 0x6615 |
408 | #define USB_DEVICE_ID_IRTOUCH_INFRARED_USB 0x0070 | 408 | #define USB_DEVICE_ID_IRTOUCH_INFRARED_USB 0x0070 |
409 | 409 | ||
410 | #define USB_VENDOR_ID_JESS 0x0c45 | 410 | #define USB_VENDOR_ID_JESS 0x0c45 |
411 | #define USB_DEVICE_ID_JESS_YUREX 0x1010 | 411 | #define USB_DEVICE_ID_JESS_YUREX 0x1010 |
412 | 412 | ||
413 | #define USB_VENDOR_ID_KBGEAR 0x084e | 413 | #define USB_VENDOR_ID_KBGEAR 0x084e |
414 | #define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001 | 414 | #define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001 |
415 | 415 | ||
416 | #define USB_VENDOR_ID_KENSINGTON 0x047d | 416 | #define USB_VENDOR_ID_KENSINGTON 0x047d |
417 | #define USB_DEVICE_ID_KS_SLIMBLADE 0x2041 | 417 | #define USB_DEVICE_ID_KS_SLIMBLADE 0x2041 |
418 | 418 | ||
419 | #define USB_VENDOR_ID_KWORLD 0x1b80 | 419 | #define USB_VENDOR_ID_KWORLD 0x1b80 |
420 | #define USB_DEVICE_ID_KWORLD_RADIO_FM700 0xd700 | 420 | #define USB_DEVICE_ID_KWORLD_RADIO_FM700 0xd700 |
421 | 421 | ||
422 | #define USB_VENDOR_ID_KEYTOUCH 0x0926 | 422 | #define USB_VENDOR_ID_KEYTOUCH 0x0926 |
423 | #define USB_DEVICE_ID_KEYTOUCH_IEC 0x3333 | 423 | #define USB_DEVICE_ID_KEYTOUCH_IEC 0x3333 |
424 | 424 | ||
425 | #define USB_VENDOR_ID_KYE 0x0458 | 425 | #define USB_VENDOR_ID_KYE 0x0458 |
426 | #define USB_DEVICE_ID_KYE_ERGO_525V 0x0087 | 426 | #define USB_DEVICE_ID_KYE_ERGO_525V 0x0087 |
427 | #define USB_DEVICE_ID_KYE_GPEN_560 0x5003 | 427 | #define USB_DEVICE_ID_KYE_GPEN_560 0x5003 |
428 | #define USB_DEVICE_ID_KYE_EASYPEN_I405X 0x5010 | 428 | #define USB_DEVICE_ID_KYE_EASYPEN_I405X 0x5010 |
429 | #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011 | 429 | #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011 |
430 | #define USB_DEVICE_ID_KYE_EASYPEN_M610X 0x5013 | 430 | #define USB_DEVICE_ID_KYE_EASYPEN_M610X 0x5013 |
431 | 431 | ||
432 | #define USB_VENDOR_ID_LABTEC 0x1020 | 432 | #define USB_VENDOR_ID_LABTEC 0x1020 |
433 | #define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD 0x0006 | 433 | #define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD 0x0006 |
434 | 434 | ||
435 | #define USB_VENDOR_ID_LCPOWER 0x1241 | 435 | #define USB_VENDOR_ID_LCPOWER 0x1241 |
436 | #define USB_DEVICE_ID_LCPOWER_LC1000 0xf767 | 436 | #define USB_DEVICE_ID_LCPOWER_LC1000 0xf767 |
437 | 437 | ||
438 | #define USB_VENDOR_ID_LD 0x0f11 | 438 | #define USB_VENDOR_ID_LD 0x0f11 |
439 | #define USB_DEVICE_ID_LD_CASSY 0x1000 | 439 | #define USB_DEVICE_ID_LD_CASSY 0x1000 |
440 | #define USB_DEVICE_ID_LD_CASSY2 0x1001 | 440 | #define USB_DEVICE_ID_LD_CASSY2 0x1001 |
441 | #define USB_DEVICE_ID_LD_POCKETCASSY 0x1010 | 441 | #define USB_DEVICE_ID_LD_POCKETCASSY 0x1010 |
442 | #define USB_DEVICE_ID_LD_POCKETCASSY2 0x1011 | 442 | #define USB_DEVICE_ID_LD_POCKETCASSY2 0x1011 |
443 | #define USB_DEVICE_ID_LD_MOBILECASSY 0x1020 | 443 | #define USB_DEVICE_ID_LD_MOBILECASSY 0x1020 |
444 | #define USB_DEVICE_ID_LD_MOBILECASSY2 0x1021 | 444 | #define USB_DEVICE_ID_LD_MOBILECASSY2 0x1021 |
445 | #define USB_DEVICE_ID_LD_MICROCASSYVOLTAGE 0x1031 | 445 | #define USB_DEVICE_ID_LD_MICROCASSYVOLTAGE 0x1031 |
446 | #define USB_DEVICE_ID_LD_MICROCASSYCURRENT 0x1032 | 446 | #define USB_DEVICE_ID_LD_MICROCASSYCURRENT 0x1032 |
447 | #define USB_DEVICE_ID_LD_MICROCASSYTIME 0x1033 | 447 | #define USB_DEVICE_ID_LD_MICROCASSYTIME 0x1033 |
448 | #define USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE 0x1035 | 448 | #define USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE 0x1035 |
449 | #define USB_DEVICE_ID_LD_MICROCASSYPH 0x1038 | 449 | #define USB_DEVICE_ID_LD_MICROCASSYPH 0x1038 |
450 | #define USB_DEVICE_ID_LD_JWM 0x1080 | 450 | #define USB_DEVICE_ID_LD_JWM 0x1080 |
451 | #define USB_DEVICE_ID_LD_DMMP 0x1081 | 451 | #define USB_DEVICE_ID_LD_DMMP 0x1081 |
452 | #define USB_DEVICE_ID_LD_UMIP 0x1090 | 452 | #define USB_DEVICE_ID_LD_UMIP 0x1090 |
453 | #define USB_DEVICE_ID_LD_UMIC 0x10A0 | 453 | #define USB_DEVICE_ID_LD_UMIC 0x10A0 |
454 | #define USB_DEVICE_ID_LD_UMIB 0x10B0 | 454 | #define USB_DEVICE_ID_LD_UMIB 0x10B0 |
455 | #define USB_DEVICE_ID_LD_XRAY 0x1100 | 455 | #define USB_DEVICE_ID_LD_XRAY 0x1100 |
456 | #define USB_DEVICE_ID_LD_XRAY2 0x1101 | 456 | #define USB_DEVICE_ID_LD_XRAY2 0x1101 |
457 | #define USB_DEVICE_ID_LD_XRAYCT 0x1110 | 457 | #define USB_DEVICE_ID_LD_XRAYCT 0x1110 |
458 | #define USB_DEVICE_ID_LD_VIDEOCOM 0x1200 | 458 | #define USB_DEVICE_ID_LD_VIDEOCOM 0x1200 |
459 | #define USB_DEVICE_ID_LD_MOTOR 0x1210 | 459 | #define USB_DEVICE_ID_LD_MOTOR 0x1210 |
460 | #define USB_DEVICE_ID_LD_COM3LAB 0x2000 | 460 | #define USB_DEVICE_ID_LD_COM3LAB 0x2000 |
461 | #define USB_DEVICE_ID_LD_TELEPORT 0x2010 | 461 | #define USB_DEVICE_ID_LD_TELEPORT 0x2010 |
462 | #define USB_DEVICE_ID_LD_NETWORKANALYSER 0x2020 | 462 | #define USB_DEVICE_ID_LD_NETWORKANALYSER 0x2020 |
463 | #define USB_DEVICE_ID_LD_POWERCONTROL 0x2030 | 463 | #define USB_DEVICE_ID_LD_POWERCONTROL 0x2030 |
464 | #define USB_DEVICE_ID_LD_MACHINETEST 0x2040 | 464 | #define USB_DEVICE_ID_LD_MACHINETEST 0x2040 |
465 | #define USB_DEVICE_ID_LD_MOSTANALYSER 0x2050 | 465 | #define USB_DEVICE_ID_LD_MOSTANALYSER 0x2050 |
466 | #define USB_DEVICE_ID_LD_MOSTANALYSER2 0x2051 | 466 | #define USB_DEVICE_ID_LD_MOSTANALYSER2 0x2051 |
467 | #define USB_DEVICE_ID_LD_ABSESP 0x2060 | 467 | #define USB_DEVICE_ID_LD_ABSESP 0x2060 |
468 | #define USB_DEVICE_ID_LD_AUTODATABUS 0x2070 | 468 | #define USB_DEVICE_ID_LD_AUTODATABUS 0x2070 |
469 | #define USB_DEVICE_ID_LD_MCT 0x2080 | 469 | #define USB_DEVICE_ID_LD_MCT 0x2080 |
470 | #define USB_DEVICE_ID_LD_HYBRID 0x2090 | 470 | #define USB_DEVICE_ID_LD_HYBRID 0x2090 |
471 | #define USB_DEVICE_ID_LD_HEATCONTROL 0x20A0 | 471 | #define USB_DEVICE_ID_LD_HEATCONTROL 0x20A0 |
472 | 472 | ||
473 | #define USB_VENDOR_ID_LG 0x1fd2 | 473 | #define USB_VENDOR_ID_LG 0x1fd2 |
474 | #define USB_DEVICE_ID_LG_MULTITOUCH 0x0064 | 474 | #define USB_DEVICE_ID_LG_MULTITOUCH 0x0064 |
475 | 475 | ||
476 | #define USB_VENDOR_ID_LOGITECH 0x046d | 476 | #define USB_VENDOR_ID_LOGITECH 0x046d |
477 | #define USB_DEVICE_ID_LOGITECH_AUDIOHUB 0x0a0e | 477 | #define USB_DEVICE_ID_LOGITECH_AUDIOHUB 0x0a0e |
478 | #define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101 | 478 | #define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101 |
479 | #define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST 0xc110 | 479 | #define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST 0xc110 |
480 | #define USB_DEVICE_ID_LOGITECH_HARMONY_LAST 0xc14f | 480 | #define USB_DEVICE_ID_LOGITECH_HARMONY_LAST 0xc14f |
481 | #define USB_DEVICE_ID_LOGITECH_RUMBLEPAD_CORD 0xc20a | 481 | #define USB_DEVICE_ID_LOGITECH_RUMBLEPAD_CORD 0xc20a |
482 | #define USB_DEVICE_ID_LOGITECH_RUMBLEPAD 0xc211 | 482 | #define USB_DEVICE_ID_LOGITECH_RUMBLEPAD 0xc211 |
483 | #define USB_DEVICE_ID_LOGITECH_EXTREME_3D 0xc215 | 483 | #define USB_DEVICE_ID_LOGITECH_EXTREME_3D 0xc215 |
484 | #define USB_DEVICE_ID_LOGITECH_RUMBLEPAD2 0xc218 | 484 | #define USB_DEVICE_ID_LOGITECH_RUMBLEPAD2 0xc218 |
485 | #define USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2 0xc219 | 485 | #define USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2 0xc219 |
486 | #define USB_DEVICE_ID_LOGITECH_WINGMAN_F3D 0xc283 | 486 | #define USB_DEVICE_ID_LOGITECH_WINGMAN_F3D 0xc283 |
487 | #define USB_DEVICE_ID_LOGITECH_FORCE3D_PRO 0xc286 | 487 | #define USB_DEVICE_ID_LOGITECH_FORCE3D_PRO 0xc286 |
488 | #define USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940 0xc287 | 488 | #define USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940 0xc287 |
489 | #define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294 | 489 | #define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294 |
490 | #define USB_DEVICE_ID_LOGITECH_WINGMAN_FFG 0xc293 | 490 | #define USB_DEVICE_ID_LOGITECH_WINGMAN_FFG 0xc293 |
491 | #define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL 0xc295 | 491 | #define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL 0xc295 |
492 | #define USB_DEVICE_ID_LOGITECH_DFP_WHEEL 0xc298 | 492 | #define USB_DEVICE_ID_LOGITECH_DFP_WHEEL 0xc298 |
493 | #define USB_DEVICE_ID_LOGITECH_G25_WHEEL 0xc299 | 493 | #define USB_DEVICE_ID_LOGITECH_G25_WHEEL 0xc299 |
494 | #define USB_DEVICE_ID_LOGITECH_DFGT_WHEEL 0xc29a | 494 | #define USB_DEVICE_ID_LOGITECH_DFGT_WHEEL 0xc29a |
495 | #define USB_DEVICE_ID_LOGITECH_G27_WHEEL 0xc29b | 495 | #define USB_DEVICE_ID_LOGITECH_G27_WHEEL 0xc29b |
496 | #define USB_DEVICE_ID_LOGITECH_WII_WHEEL 0xc29c | 496 | #define USB_DEVICE_ID_LOGITECH_WII_WHEEL 0xc29c |
497 | #define USB_DEVICE_ID_LOGITECH_ELITE_KBD 0xc30a | 497 | #define USB_DEVICE_ID_LOGITECH_ELITE_KBD 0xc30a |
498 | #define USB_DEVICE_ID_S510_RECEIVER 0xc50c | 498 | #define USB_DEVICE_ID_S510_RECEIVER 0xc50c |
499 | #define USB_DEVICE_ID_S510_RECEIVER_2 0xc517 | 499 | #define USB_DEVICE_ID_S510_RECEIVER_2 0xc517 |
500 | #define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500 0xc512 | 500 | #define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500 0xc512 |
501 | #define USB_DEVICE_ID_MX3000_RECEIVER 0xc513 | 501 | #define USB_DEVICE_ID_MX3000_RECEIVER 0xc513 |
502 | #define USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER 0xc52b | 502 | #define USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER 0xc52b |
503 | #define USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2 0xc532 | 503 | #define USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2 0xc532 |
504 | #define USB_DEVICE_ID_SPACETRAVELLER 0xc623 | 504 | #define USB_DEVICE_ID_SPACETRAVELLER 0xc623 |
505 | #define USB_DEVICE_ID_SPACENAVIGATOR 0xc626 | 505 | #define USB_DEVICE_ID_SPACENAVIGATOR 0xc626 |
506 | #define USB_DEVICE_ID_DINOVO_DESKTOP 0xc704 | 506 | #define USB_DEVICE_ID_DINOVO_DESKTOP 0xc704 |
507 | #define USB_DEVICE_ID_DINOVO_EDGE 0xc714 | 507 | #define USB_DEVICE_ID_DINOVO_EDGE 0xc714 |
508 | #define USB_DEVICE_ID_DINOVO_MINI 0xc71f | 508 | #define USB_DEVICE_ID_DINOVO_MINI 0xc71f |
509 | #define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2 0xca03 | 509 | #define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2 0xca03 |
510 | 510 | ||
511 | #define USB_VENDOR_ID_LUMIO 0x202e | 511 | #define USB_VENDOR_ID_LUMIO 0x202e |
512 | #define USB_DEVICE_ID_CRYSTALTOUCH 0x0006 | 512 | #define USB_DEVICE_ID_CRYSTALTOUCH 0x0006 |
513 | #define USB_DEVICE_ID_CRYSTALTOUCH_DUAL 0x0007 | 513 | #define USB_DEVICE_ID_CRYSTALTOUCH_DUAL 0x0007 |
514 | 514 | ||
515 | #define USB_VENDOR_ID_MADCATZ 0x0738 | ||
516 | #define USB_DEVICE_ID_MADCATZ_BEATPAD 0x4540 | ||
517 | |||
515 | #define USB_VENDOR_ID_MCC 0x09db | 518 | #define USB_VENDOR_ID_MCC 0x09db |
516 | #define USB_DEVICE_ID_MCC_PMD1024LS 0x0076 | 519 | #define USB_DEVICE_ID_MCC_PMD1024LS 0x0076 |
517 | #define USB_DEVICE_ID_MCC_PMD1208LS 0x007a | 520 | #define USB_DEVICE_ID_MCC_PMD1208LS 0x007a |
518 | 521 | ||
519 | #define USB_VENDOR_ID_MGE 0x0463 | 522 | #define USB_VENDOR_ID_MGE 0x0463 |
520 | #define USB_DEVICE_ID_MGE_UPS 0xffff | 523 | #define USB_DEVICE_ID_MGE_UPS 0xffff |
521 | #define USB_DEVICE_ID_MGE_UPS1 0x0001 | 524 | #define USB_DEVICE_ID_MGE_UPS1 0x0001 |
522 | 525 | ||
523 | #define USB_VENDOR_ID_MICROCHIP 0x04d8 | 526 | #define USB_VENDOR_ID_MICROCHIP 0x04d8 |
524 | #define USB_DEVICE_ID_PICKIT1 0x0032 | 527 | #define USB_DEVICE_ID_PICKIT1 0x0032 |
525 | #define USB_DEVICE_ID_PICKIT2 0x0033 | 528 | #define USB_DEVICE_ID_PICKIT2 0x0033 |
526 | #define USB_DEVICE_ID_PICOLCD 0xc002 | 529 | #define USB_DEVICE_ID_PICOLCD 0xc002 |
527 | #define USB_DEVICE_ID_PICOLCD_BOOTLOADER 0xf002 | 530 | #define USB_DEVICE_ID_PICOLCD_BOOTLOADER 0xf002 |
528 | 531 | ||
529 | #define USB_VENDOR_ID_MICROSOFT 0x045e | 532 | #define USB_VENDOR_ID_MICROSOFT 0x045e |
530 | #define USB_DEVICE_ID_SIDEWINDER_GV 0x003b | 533 | #define USB_DEVICE_ID_SIDEWINDER_GV 0x003b |
531 | #define USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0 0x009d | 534 | #define USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0 0x009d |
532 | #define USB_DEVICE_ID_MS_NE4K 0x00db | 535 | #define USB_DEVICE_ID_MS_NE4K 0x00db |
533 | #define USB_DEVICE_ID_MS_LK6K 0x00f9 | 536 | #define USB_DEVICE_ID_MS_LK6K 0x00f9 |
534 | #define USB_DEVICE_ID_MS_PRESENTER_8K_BT 0x0701 | 537 | #define USB_DEVICE_ID_MS_PRESENTER_8K_BT 0x0701 |
535 | #define USB_DEVICE_ID_MS_PRESENTER_8K_USB 0x0713 | 538 | #define USB_DEVICE_ID_MS_PRESENTER_8K_USB 0x0713 |
536 | #define USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K 0x0730 | 539 | #define USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K 0x0730 |
537 | #define USB_DEVICE_ID_MS_COMFORT_MOUSE_4500 0x076c | 540 | #define USB_DEVICE_ID_MS_COMFORT_MOUSE_4500 0x076c |
538 | 541 | ||
539 | #define USB_VENDOR_ID_MOJO 0x8282 | 542 | #define USB_VENDOR_ID_MOJO 0x8282 |
540 | #define USB_DEVICE_ID_RETRO_ADAPTER 0x3201 | 543 | #define USB_DEVICE_ID_RETRO_ADAPTER 0x3201 |
541 | 544 | ||
542 | #define USB_VENDOR_ID_MONTEREY 0x0566 | 545 | #define USB_VENDOR_ID_MONTEREY 0x0566 |
543 | #define USB_DEVICE_ID_GENIUS_KB29E 0x3004 | 546 | #define USB_DEVICE_ID_GENIUS_KB29E 0x3004 |
544 | 547 | ||
545 | #define USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR 0x0400 | 548 | #define USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR 0x0400 |
546 | #define USB_DEVICE_ID_N_S_HARMONY 0xc359 | 549 | #define USB_DEVICE_ID_N_S_HARMONY 0xc359 |
547 | 550 | ||
548 | #define USB_VENDOR_ID_NATSU 0x08b7 | 551 | #define USB_VENDOR_ID_NATSU 0x08b7 |
549 | #define USB_DEVICE_ID_NATSU_GAMEPAD 0x0001 | 552 | #define USB_DEVICE_ID_NATSU_GAMEPAD 0x0001 |
550 | 553 | ||
551 | #define USB_VENDOR_ID_NCR 0x0404 | 554 | #define USB_VENDOR_ID_NCR 0x0404 |
552 | #define USB_DEVICE_ID_NCR_FIRST 0x0300 | 555 | #define USB_DEVICE_ID_NCR_FIRST 0x0300 |
553 | #define USB_DEVICE_ID_NCR_LAST 0x03ff | 556 | #define USB_DEVICE_ID_NCR_LAST 0x03ff |
554 | 557 | ||
555 | #define USB_VENDOR_ID_NEC 0x073e | 558 | #define USB_VENDOR_ID_NEC 0x073e |
556 | #define USB_DEVICE_ID_NEC_USB_GAME_PAD 0x0301 | 559 | #define USB_DEVICE_ID_NEC_USB_GAME_PAD 0x0301 |
557 | 560 | ||
558 | #define USB_VENDOR_ID_NEXTWINDOW 0x1926 | 561 | #define USB_VENDOR_ID_NEXTWINDOW 0x1926 |
559 | #define USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN 0x0003 | 562 | #define USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN 0x0003 |
560 | 563 | ||
561 | #define USB_VENDOR_ID_NINTENDO 0x057e | 564 | #define USB_VENDOR_ID_NINTENDO 0x057e |
562 | #define USB_DEVICE_ID_NINTENDO_WIIMOTE 0x0306 | 565 | #define USB_DEVICE_ID_NINTENDO_WIIMOTE 0x0306 |
563 | 566 | ||
564 | #define USB_VENDOR_ID_NTRIG 0x1b96 | 567 | #define USB_VENDOR_ID_NTRIG 0x1b96 |
565 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN 0x0001 | 568 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN 0x0001 |
566 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_1 0x0003 | 569 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_1 0x0003 |
567 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_2 0x0004 | 570 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_2 0x0004 |
568 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_3 0x0005 | 571 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_3 0x0005 |
569 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_4 0x0006 | 572 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_4 0x0006 |
570 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_5 0x0007 | 573 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_5 0x0007 |
571 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_6 0x0008 | 574 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_6 0x0008 |
572 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_7 0x0009 | 575 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_7 0x0009 |
573 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_8 0x000A | 576 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_8 0x000A |
574 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_9 0x000B | 577 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_9 0x000B |
575 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_10 0x000C | 578 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_10 0x000C |
576 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_11 0x000D | 579 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_11 0x000D |
577 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_12 0x000E | 580 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_12 0x000E |
578 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_13 0x000F | 581 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_13 0x000F |
579 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_14 0x0010 | 582 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_14 0x0010 |
580 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_15 0x0011 | 583 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_15 0x0011 |
581 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_16 0x0012 | 584 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_16 0x0012 |
582 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_17 0x0013 | 585 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_17 0x0013 |
583 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18 0x0014 | 586 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18 0x0014 |
584 | 587 | ||
585 | #define USB_VENDOR_ID_ONTRAK 0x0a07 | 588 | #define USB_VENDOR_ID_ONTRAK 0x0a07 |
586 | #define USB_DEVICE_ID_ONTRAK_ADU100 0x0064 | 589 | #define USB_DEVICE_ID_ONTRAK_ADU100 0x0064 |
587 | 590 | ||
588 | #define USB_VENDOR_ID_ORTEK 0x05a4 | 591 | #define USB_VENDOR_ID_ORTEK 0x05a4 |
589 | #define USB_DEVICE_ID_ORTEK_PKB1700 0x1700 | 592 | #define USB_DEVICE_ID_ORTEK_PKB1700 0x1700 |
590 | #define USB_DEVICE_ID_ORTEK_WKB2000 0x2000 | 593 | #define USB_DEVICE_ID_ORTEK_WKB2000 0x2000 |
591 | 594 | ||
592 | #define USB_VENDOR_ID_PANASONIC 0x04da | 595 | #define USB_VENDOR_ID_PANASONIC 0x04da |
593 | #define USB_DEVICE_ID_PANABOARD_UBT780 0x1044 | 596 | #define USB_DEVICE_ID_PANABOARD_UBT780 0x1044 |
594 | #define USB_DEVICE_ID_PANABOARD_UBT880 0x104d | 597 | #define USB_DEVICE_ID_PANABOARD_UBT880 0x104d |
595 | 598 | ||
596 | #define USB_VENDOR_ID_PANJIT 0x134c | 599 | #define USB_VENDOR_ID_PANJIT 0x134c |
597 | 600 | ||
598 | #define USB_VENDOR_ID_PANTHERLORD 0x0810 | 601 | #define USB_VENDOR_ID_PANTHERLORD 0x0810 |
599 | #define USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK 0x0001 | 602 | #define USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK 0x0001 |
600 | 603 | ||
601 | #define USB_VENDOR_ID_PENMOUNT 0x14e1 | 604 | #define USB_VENDOR_ID_PENMOUNT 0x14e1 |
602 | #define USB_DEVICE_ID_PENMOUNT_PCI 0x3500 | 605 | #define USB_DEVICE_ID_PENMOUNT_PCI 0x3500 |
603 | 606 | ||
604 | #define USB_VENDOR_ID_PETALYNX 0x18b1 | 607 | #define USB_VENDOR_ID_PETALYNX 0x18b1 |
605 | #define USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE 0x0037 | 608 | #define USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE 0x0037 |
606 | 609 | ||
607 | #define USB_VENDOR_ID_PHILIPS 0x0471 | 610 | #define USB_VENDOR_ID_PHILIPS 0x0471 |
608 | #define USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE 0x0617 | 611 | #define USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE 0x0617 |
609 | 612 | ||
610 | #define USB_VENDOR_ID_PI_ENGINEERING 0x05f3 | 613 | #define USB_VENDOR_ID_PI_ENGINEERING 0x05f3 |
611 | #define USB_DEVICE_ID_PI_ENGINEERING_VEC_USB_FOOTPEDAL 0xff | 614 | #define USB_DEVICE_ID_PI_ENGINEERING_VEC_USB_FOOTPEDAL 0xff |
612 | 615 | ||
613 | #define USB_VENDOR_ID_PIXART 0x093a | 616 | #define USB_VENDOR_ID_PIXART 0x093a |
614 | #define USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN 0x8001 | 617 | #define USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN 0x8001 |
615 | #define USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1 0x8002 | 618 | #define USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1 0x8002 |
616 | #define USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2 0x8003 | 619 | #define USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2 0x8003 |
617 | 620 | ||
618 | #define USB_VENDOR_ID_PLAYDOTCOM 0x0b43 | 621 | #define USB_VENDOR_ID_PLAYDOTCOM 0x0b43 |
619 | #define USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII 0x0003 | 622 | #define USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII 0x0003 |
620 | 623 | ||
621 | #define USB_VENDOR_ID_POWERCOM 0x0d9f | 624 | #define USB_VENDOR_ID_POWERCOM 0x0d9f |
622 | #define USB_DEVICE_ID_POWERCOM_UPS 0x0002 | 625 | #define USB_DEVICE_ID_POWERCOM_UPS 0x0002 |
623 | 626 | ||
624 | #define USB_VENDOR_ID_PRODIGE 0x05af | 627 | #define USB_VENDOR_ID_PRODIGE 0x05af |
625 | #define USB_DEVICE_ID_PRODIGE_CORDLESS 0x3062 | 628 | #define USB_DEVICE_ID_PRODIGE_CORDLESS 0x3062 |
626 | 629 | ||
627 | #define USB_VENDOR_ID_QUANTA 0x0408 | 630 | #define USB_VENDOR_ID_QUANTA 0x0408 |
628 | #define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH 0x3000 | 631 | #define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH 0x3000 |
629 | #define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3001 0x3001 | 632 | #define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3001 0x3001 |
630 | #define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3008 0x3008 | 633 | #define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3008 0x3008 |
631 | #define USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN 0x3001 | 634 | #define USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN 0x3001 |
632 | 635 | ||
633 | #define USB_VENDOR_ID_ROCCAT 0x1e7d | 636 | #define USB_VENDOR_ID_ROCCAT 0x1e7d |
634 | #define USB_DEVICE_ID_ROCCAT_ARVO 0x30d4 | 637 | #define USB_DEVICE_ID_ROCCAT_ARVO 0x30d4 |
635 | #define USB_DEVICE_ID_ROCCAT_ISKU 0x319c | 638 | #define USB_DEVICE_ID_ROCCAT_ISKU 0x319c |
636 | #define USB_DEVICE_ID_ROCCAT_KONE 0x2ced | 639 | #define USB_DEVICE_ID_ROCCAT_KONE 0x2ced |
637 | #define USB_DEVICE_ID_ROCCAT_KONEPLUS 0x2d51 | 640 | #define USB_DEVICE_ID_ROCCAT_KONEPLUS 0x2d51 |
638 | #define USB_DEVICE_ID_ROCCAT_KOVAPLUS 0x2d50 | 641 | #define USB_DEVICE_ID_ROCCAT_KOVAPLUS 0x2d50 |
639 | #define USB_DEVICE_ID_ROCCAT_PYRA_WIRED 0x2c24 | 642 | #define USB_DEVICE_ID_ROCCAT_PYRA_WIRED 0x2c24 |
640 | #define USB_DEVICE_ID_ROCCAT_PYRA_WIRELESS 0x2cf6 | 643 | #define USB_DEVICE_ID_ROCCAT_PYRA_WIRELESS 0x2cf6 |
641 | 644 | ||
642 | #define USB_VENDOR_ID_SAITEK 0x06a3 | 645 | #define USB_VENDOR_ID_SAITEK 0x06a3 |
643 | #define USB_DEVICE_ID_SAITEK_RUMBLEPAD 0xff17 | 646 | #define USB_DEVICE_ID_SAITEK_RUMBLEPAD 0xff17 |
644 | #define USB_DEVICE_ID_SAITEK_PS1000 0x0621 | 647 | #define USB_DEVICE_ID_SAITEK_PS1000 0x0621 |
645 | 648 | ||
646 | #define USB_VENDOR_ID_SAMSUNG 0x0419 | 649 | #define USB_VENDOR_ID_SAMSUNG 0x0419 |
647 | #define USB_DEVICE_ID_SAMSUNG_IR_REMOTE 0x0001 | 650 | #define USB_DEVICE_ID_SAMSUNG_IR_REMOTE 0x0001 |
648 | #define USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE 0x0600 | 651 | #define USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE 0x0600 |
649 | 652 | ||
650 | #define USB_VENDOR_ID_SIGMA_MICRO 0x1c4f | 653 | #define USB_VENDOR_ID_SIGMA_MICRO 0x1c4f |
651 | #define USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD 0x0002 | 654 | #define USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD 0x0002 |
652 | 655 | ||
653 | #define USB_VENDOR_ID_SKYCABLE 0x1223 | 656 | #define USB_VENDOR_ID_SKYCABLE 0x1223 |
654 | #define USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER 0x3F07 | 657 | #define USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER 0x3F07 |
655 | 658 | ||
656 | #define USB_VENDOR_ID_SONY 0x054c | 659 | #define USB_VENDOR_ID_SONY 0x054c |
657 | #define USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE 0x024b | 660 | #define USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE 0x024b |
658 | #define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268 | 661 | #define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268 |
659 | #define USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER 0x042f | 662 | #define USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER 0x042f |
660 | 663 | ||
661 | #define USB_VENDOR_ID_SOUNDGRAPH 0x15c2 | 664 | #define USB_VENDOR_ID_SOUNDGRAPH 0x15c2 |
662 | #define USB_DEVICE_ID_SOUNDGRAPH_IMON_FIRST 0x0034 | 665 | #define USB_DEVICE_ID_SOUNDGRAPH_IMON_FIRST 0x0034 |
663 | #define USB_DEVICE_ID_SOUNDGRAPH_IMON_LAST 0x0046 | 666 | #define USB_DEVICE_ID_SOUNDGRAPH_IMON_LAST 0x0046 |
664 | 667 | ||
665 | #define USB_VENDOR_ID_STANTUM 0x1f87 | 668 | #define USB_VENDOR_ID_STANTUM 0x1f87 |
666 | #define USB_DEVICE_ID_MTP 0x0002 | 669 | #define USB_DEVICE_ID_MTP 0x0002 |
667 | 670 | ||
668 | #define USB_VENDOR_ID_STANTUM_STM 0x0483 | 671 | #define USB_VENDOR_ID_STANTUM_STM 0x0483 |
669 | #define USB_DEVICE_ID_MTP_STM 0x3261 | 672 | #define USB_DEVICE_ID_MTP_STM 0x3261 |
670 | 673 | ||
671 | #define USB_VENDOR_ID_STANTUM_SITRONIX 0x1403 | 674 | #define USB_VENDOR_ID_STANTUM_SITRONIX 0x1403 |
672 | #define USB_DEVICE_ID_MTP_SITRONIX 0x5001 | 675 | #define USB_DEVICE_ID_MTP_SITRONIX 0x5001 |
673 | 676 | ||
674 | #define USB_VENDOR_ID_SUN 0x0430 | 677 | #define USB_VENDOR_ID_SUN 0x0430 |
675 | #define USB_DEVICE_ID_RARITAN_KVM_DONGLE 0xcdab | 678 | #define USB_DEVICE_ID_RARITAN_KVM_DONGLE 0xcdab |
676 | 679 | ||
677 | #define USB_VENDOR_ID_SUNPLUS 0x04fc | 680 | #define USB_VENDOR_ID_SUNPLUS 0x04fc |
678 | #define USB_DEVICE_ID_SUNPLUS_WDESKTOP 0x05d8 | 681 | #define USB_DEVICE_ID_SUNPLUS_WDESKTOP 0x05d8 |
679 | 682 | ||
680 | #define USB_VENDOR_ID_SYMBOL 0x05e0 | 683 | #define USB_VENDOR_ID_SYMBOL 0x05e0 |
681 | #define USB_DEVICE_ID_SYMBOL_SCANNER_1 0x0800 | 684 | #define USB_DEVICE_ID_SYMBOL_SCANNER_1 0x0800 |
682 | #define USB_DEVICE_ID_SYMBOL_SCANNER_2 0x1300 | 685 | #define USB_DEVICE_ID_SYMBOL_SCANNER_2 0x1300 |
683 | 686 | ||
684 | #define USB_VENDOR_ID_SYNAPTICS 0x06cb | 687 | #define USB_VENDOR_ID_SYNAPTICS 0x06cb |
685 | #define USB_DEVICE_ID_SYNAPTICS_TP 0x0001 | 688 | #define USB_DEVICE_ID_SYNAPTICS_TP 0x0001 |
686 | #define USB_DEVICE_ID_SYNAPTICS_INT_TP 0x0002 | 689 | #define USB_DEVICE_ID_SYNAPTICS_INT_TP 0x0002 |
687 | #define USB_DEVICE_ID_SYNAPTICS_CPAD 0x0003 | 690 | #define USB_DEVICE_ID_SYNAPTICS_CPAD 0x0003 |
688 | #define USB_DEVICE_ID_SYNAPTICS_TS 0x0006 | 691 | #define USB_DEVICE_ID_SYNAPTICS_TS 0x0006 |
689 | #define USB_DEVICE_ID_SYNAPTICS_STICK 0x0007 | 692 | #define USB_DEVICE_ID_SYNAPTICS_STICK 0x0007 |
690 | #define USB_DEVICE_ID_SYNAPTICS_WP 0x0008 | 693 | #define USB_DEVICE_ID_SYNAPTICS_WP 0x0008 |
691 | #define USB_DEVICE_ID_SYNAPTICS_COMP_TP 0x0009 | 694 | #define USB_DEVICE_ID_SYNAPTICS_COMP_TP 0x0009 |
692 | #define USB_DEVICE_ID_SYNAPTICS_WTP 0x0010 | 695 | #define USB_DEVICE_ID_SYNAPTICS_WTP 0x0010 |
693 | #define USB_DEVICE_ID_SYNAPTICS_DPAD 0x0013 | 696 | #define USB_DEVICE_ID_SYNAPTICS_DPAD 0x0013 |
694 | 697 | ||
695 | #define USB_VENDOR_ID_THRUSTMASTER 0x044f | 698 | #define USB_VENDOR_ID_THRUSTMASTER 0x044f |
696 | 699 | ||
697 | #define USB_VENDOR_ID_TIVO 0x150a | 700 | #define USB_VENDOR_ID_TIVO 0x150a |
698 | #define USB_DEVICE_ID_TIVO_SLIDE_BT 0x1200 | 701 | #define USB_DEVICE_ID_TIVO_SLIDE_BT 0x1200 |
699 | #define USB_DEVICE_ID_TIVO_SLIDE 0x1201 | 702 | #define USB_DEVICE_ID_TIVO_SLIDE 0x1201 |
700 | 703 | ||
701 | #define USB_VENDOR_ID_TOPSEED 0x0766 | 704 | #define USB_VENDOR_ID_TOPSEED 0x0766 |
702 | #define USB_DEVICE_ID_TOPSEED_CYBERLINK 0x0204 | 705 | #define USB_DEVICE_ID_TOPSEED_CYBERLINK 0x0204 |
703 | 706 | ||
704 | #define USB_VENDOR_ID_TOPSEED2 0x1784 | 707 | #define USB_VENDOR_ID_TOPSEED2 0x1784 |
705 | #define USB_DEVICE_ID_TOPSEED2_RF_COMBO 0x0004 | 708 | #define USB_DEVICE_ID_TOPSEED2_RF_COMBO 0x0004 |
706 | #define USB_DEVICE_ID_TOPSEED2_PERIPAD_701 0x0016 | 709 | #define USB_DEVICE_ID_TOPSEED2_PERIPAD_701 0x0016 |
707 | 710 | ||
708 | #define USB_VENDOR_ID_TOPMAX 0x0663 | 711 | #define USB_VENDOR_ID_TOPMAX 0x0663 |
709 | #define USB_DEVICE_ID_TOPMAX_COBRAPAD 0x0103 | 712 | #define USB_DEVICE_ID_TOPMAX_COBRAPAD 0x0103 |
710 | 713 | ||
711 | #define USB_VENDOR_ID_TOUCH_INTL 0x1e5e | 714 | #define USB_VENDOR_ID_TOUCH_INTL 0x1e5e |
712 | #define USB_DEVICE_ID_TOUCH_INTL_MULTI_TOUCH 0x0313 | 715 | #define USB_DEVICE_ID_TOUCH_INTL_MULTI_TOUCH 0x0313 |
713 | 716 | ||
714 | #define USB_VENDOR_ID_TOUCHPACK 0x1bfd | 717 | #define USB_VENDOR_ID_TOUCHPACK 0x1bfd |
715 | #define USB_DEVICE_ID_TOUCHPACK_RTS 0x1688 | 718 | #define USB_DEVICE_ID_TOUCHPACK_RTS 0x1688 |
716 | 719 | ||
717 | #define USB_VENDOR_ID_TURBOX 0x062a | 720 | #define USB_VENDOR_ID_TURBOX 0x062a |
718 | #define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201 | 721 | #define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201 |
719 | #define USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART 0x7100 | 722 | #define USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART 0x7100 |
720 | 723 | ||
721 | #define USB_VENDOR_ID_TWINHAN 0x6253 | 724 | #define USB_VENDOR_ID_TWINHAN 0x6253 |
722 | #define USB_DEVICE_ID_TWINHAN_IR_REMOTE 0x0100 | 725 | #define USB_DEVICE_ID_TWINHAN_IR_REMOTE 0x0100 |
723 | 726 | ||
724 | #define USB_VENDOR_ID_UCLOGIC 0x5543 | 727 | #define USB_VENDOR_ID_UCLOGIC 0x5543 |
725 | #define USB_DEVICE_ID_UCLOGIC_TABLET_PF1209 0x0042 | 728 | #define USB_DEVICE_ID_UCLOGIC_TABLET_PF1209 0x0042 |
726 | #define USB_DEVICE_ID_UCLOGIC_TABLET_KNA5 0x6001 | 729 | #define USB_DEVICE_ID_UCLOGIC_TABLET_KNA5 0x6001 |
727 | #define USB_DEVICE_ID_UCLOGIC_TABLET_TWA60 0x0064 | 730 | #define USB_DEVICE_ID_UCLOGIC_TABLET_TWA60 0x0064 |
728 | #define USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U 0x0003 | 731 | #define USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U 0x0003 |
729 | #define USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U 0x0004 | 732 | #define USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U 0x0004 |
730 | #define USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U 0x0005 | 733 | #define USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U 0x0005 |
731 | #define USB_DEVICE_ID_UCLOGIC_TABLET_WP1062 0x0064 | 734 | #define USB_DEVICE_ID_UCLOGIC_TABLET_WP1062 0x0064 |
732 | 735 | ||
733 | #define USB_VENDOR_ID_UNITEC 0x227d | 736 | #define USB_VENDOR_ID_UNITEC 0x227d |
734 | #define USB_DEVICE_ID_UNITEC_USB_TOUCH_0709 0x0709 | 737 | #define USB_DEVICE_ID_UNITEC_USB_TOUCH_0709 0x0709 |
735 | #define USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19 0x0a19 | 738 | #define USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19 0x0a19 |
736 | 739 | ||
737 | #define USB_VENDOR_ID_VERNIER 0x08f7 | 740 | #define USB_VENDOR_ID_VERNIER 0x08f7 |
738 | #define USB_DEVICE_ID_VERNIER_LABPRO 0x0001 | 741 | #define USB_DEVICE_ID_VERNIER_LABPRO 0x0001 |
739 | #define USB_DEVICE_ID_VERNIER_GOTEMP 0x0002 | 742 | #define USB_DEVICE_ID_VERNIER_GOTEMP 0x0002 |
740 | #define USB_DEVICE_ID_VERNIER_SKIP 0x0003 | 743 | #define USB_DEVICE_ID_VERNIER_SKIP 0x0003 |
741 | #define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004 | 744 | #define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004 |
742 | #define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006 | 745 | #define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006 |
743 | 746 | ||
744 | #define USB_VENDOR_ID_WACOM 0x056a | 747 | #define USB_VENDOR_ID_WACOM 0x056a |
745 | #define USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH 0x81 | 748 | #define USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH 0x81 |
746 | #define USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH 0x00BD | 749 | #define USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH 0x00BD |
747 | 750 | ||
748 | #define USB_VENDOR_ID_WALTOP 0x172f | 751 | #define USB_VENDOR_ID_WALTOP 0x172f |
749 | #define USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH 0x0032 | 752 | #define USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH 0x0032 |
750 | #define USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH 0x0034 | 753 | #define USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH 0x0034 |
751 | #define USB_DEVICE_ID_WALTOP_Q_PAD 0x0037 | 754 | #define USB_DEVICE_ID_WALTOP_Q_PAD 0x0037 |
752 | #define USB_DEVICE_ID_WALTOP_PID_0038 0x0038 | 755 | #define USB_DEVICE_ID_WALTOP_PID_0038 0x0038 |
753 | #define USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH 0x0501 | 756 | #define USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH 0x0501 |
754 | #define USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH 0x0500 | 757 | #define USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH 0x0500 |
755 | 758 | ||
756 | #define USB_VENDOR_ID_WISEGROUP 0x0925 | 759 | #define USB_VENDOR_ID_WISEGROUP 0x0925 |
757 | #define USB_DEVICE_ID_SMARTJOY_PLUS 0x0005 | 760 | #define USB_DEVICE_ID_SMARTJOY_PLUS 0x0005 |
758 | #define USB_DEVICE_ID_1_PHIDGETSERVO_20 0x8101 | 761 | #define USB_DEVICE_ID_1_PHIDGETSERVO_20 0x8101 |
759 | #define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104 | 762 | #define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104 |
760 | #define USB_DEVICE_ID_8_8_4_IF_KIT 0x8201 | 763 | #define USB_DEVICE_ID_8_8_4_IF_KIT 0x8201 |
761 | #define USB_DEVICE_ID_SUPER_JOY_BOX_3 0x8888 | 764 | #define USB_DEVICE_ID_SUPER_JOY_BOX_3 0x8888 |
762 | #define USB_DEVICE_ID_QUAD_USB_JOYPAD 0x8800 | 765 | #define USB_DEVICE_ID_QUAD_USB_JOYPAD 0x8800 |
763 | #define USB_DEVICE_ID_DUAL_USB_JOYPAD 0x8866 | 766 | #define USB_DEVICE_ID_DUAL_USB_JOYPAD 0x8866 |
764 | 767 | ||
765 | #define USB_VENDOR_ID_WISEGROUP_LTD 0x6666 | 768 | #define USB_VENDOR_ID_WISEGROUP_LTD 0x6666 |
766 | #define USB_VENDOR_ID_WISEGROUP_LTD2 0x6677 | 769 | #define USB_VENDOR_ID_WISEGROUP_LTD2 0x6677 |
767 | #define USB_DEVICE_ID_SMARTJOY_DUAL_PLUS 0x8802 | 770 | #define USB_DEVICE_ID_SMARTJOY_DUAL_PLUS 0x8802 |
768 | #define USB_DEVICE_ID_SUPER_JOY_BOX_3_PRO 0x8801 | 771 | #define USB_DEVICE_ID_SUPER_JOY_BOX_3_PRO 0x8801 |
769 | #define USB_DEVICE_ID_SUPER_DUAL_BOX_PRO 0x8802 | 772 | #define USB_DEVICE_ID_SUPER_DUAL_BOX_PRO 0x8802 |
770 | #define USB_DEVICE_ID_SUPER_JOY_BOX_5_PRO 0x8804 | 773 | #define USB_DEVICE_ID_SUPER_JOY_BOX_5_PRO 0x8804 |
771 | 774 | ||
772 | #define USB_VENDOR_ID_X_TENSIONS 0x1ae7 | 775 | #define USB_VENDOR_ID_X_TENSIONS 0x1ae7 |
773 | #define USB_DEVICE_ID_SPEEDLINK_VAD_CEZANNE 0x9001 | 776 | #define USB_DEVICE_ID_SPEEDLINK_VAD_CEZANNE 0x9001 |
774 | 777 | ||
775 | #define USB_VENDOR_ID_XAT 0x2505 | 778 | #define USB_VENDOR_ID_XAT 0x2505 |
776 | #define USB_DEVICE_ID_XAT_CSR 0x0220 | 779 | #define USB_DEVICE_ID_XAT_CSR 0x0220 |
777 | 780 | ||
778 | #define USB_VENDOR_ID_XIROKU 0x1477 | 781 | #define USB_VENDOR_ID_XIROKU 0x1477 |
779 | #define USB_DEVICE_ID_XIROKU_SPX 0x1006 | 782 | #define USB_DEVICE_ID_XIROKU_SPX 0x1006 |
780 | #define USB_DEVICE_ID_XIROKU_MPX 0x1007 | 783 | #define USB_DEVICE_ID_XIROKU_MPX 0x1007 |
781 | #define USB_DEVICE_ID_XIROKU_CSR 0x100e | 784 | #define USB_DEVICE_ID_XIROKU_CSR 0x100e |
782 | #define USB_DEVICE_ID_XIROKU_SPX1 0x1021 | 785 | #define USB_DEVICE_ID_XIROKU_SPX1 0x1021 |
783 | #define USB_DEVICE_ID_XIROKU_CSR1 0x1022 | 786 | #define USB_DEVICE_ID_XIROKU_CSR1 0x1022 |
784 | #define USB_DEVICE_ID_XIROKU_MPX1 0x1023 | 787 | #define USB_DEVICE_ID_XIROKU_MPX1 0x1023 |
785 | #define USB_DEVICE_ID_XIROKU_SPX2 0x1024 | 788 | #define USB_DEVICE_ID_XIROKU_SPX2 0x1024 |
786 | #define USB_DEVICE_ID_XIROKU_CSR2 0x1025 | 789 | #define USB_DEVICE_ID_XIROKU_CSR2 0x1025 |
787 | #define USB_DEVICE_ID_XIROKU_MPX2 0x1026 | 790 | #define USB_DEVICE_ID_XIROKU_MPX2 0x1026 |
788 | 791 | ||
789 | #define USB_VENDOR_ID_YEALINK 0x6993 | 792 | #define USB_VENDOR_ID_YEALINK 0x6993 |
790 | #define USB_DEVICE_ID_YEALINK_P1K_P4K_B2K 0xb001 | 793 | #define USB_DEVICE_ID_YEALINK_P1K_P4K_B2K 0xb001 |
791 | 794 | ||
792 | #define USB_VENDOR_ID_ZEROPLUS 0x0c12 | 795 | #define USB_VENDOR_ID_ZEROPLUS 0x0c12 |
793 | 796 | ||
794 | #define USB_VENDOR_ID_ZYDACRON 0x13EC | 797 | #define USB_VENDOR_ID_ZYDACRON 0x13EC |
795 | #define USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL 0x0006 | 798 | #define USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL 0x0006 |
796 | 799 | ||
797 | #define USB_VENDOR_ID_PRIMAX 0x0461 | 800 | #define USB_VENDOR_ID_PRIMAX 0x0461 |
798 | #define USB_DEVICE_ID_PRIMAX_KEYBOARD 0x4e05 | 801 | #define USB_DEVICE_ID_PRIMAX_KEYBOARD 0x4e05 |
799 | 802 | ||
800 | #endif | 803 | #endif |
801 | 804 |
drivers/input/joystick/xpad.c
1 | /* | 1 | /* |
2 | * X-Box gamepad driver | 2 | * X-Box gamepad driver |
3 | * | 3 | * |
4 | * Copyright (c) 2002 Marko Friedemann <mfr@bmx-chemnitz.de> | 4 | * Copyright (c) 2002 Marko Friedemann <mfr@bmx-chemnitz.de> |
5 | * 2004 Oliver Schwartz <Oliver.Schwartz@gmx.de>, | 5 | * 2004 Oliver Schwartz <Oliver.Schwartz@gmx.de>, |
6 | * Steven Toth <steve@toth.demon.co.uk>, | 6 | * Steven Toth <steve@toth.demon.co.uk>, |
7 | * Franz Lehner <franz@caos.at>, | 7 | * Franz Lehner <franz@caos.at>, |
8 | * Ivan Hawkes <blackhawk@ivanhawkes.com> | 8 | * Ivan Hawkes <blackhawk@ivanhawkes.com> |
9 | * 2005 Dominic Cerquetti <binary1230@yahoo.com> | 9 | * 2005 Dominic Cerquetti <binary1230@yahoo.com> |
10 | * 2006 Adam Buchbinder <adam.buchbinder@gmail.com> | 10 | * 2006 Adam Buchbinder <adam.buchbinder@gmail.com> |
11 | * 2007 Jan Kratochvil <honza@jikos.cz> | 11 | * 2007 Jan Kratochvil <honza@jikos.cz> |
12 | * 2010 Christoph Fritz <chf.fritz@googlemail.com> | 12 | * 2010 Christoph Fritz <chf.fritz@googlemail.com> |
13 | * | 13 | * |
14 | * This program is free software; you can redistribute it and/or | 14 | * This program is free software; you can redistribute it and/or |
15 | * modify it under the terms of the GNU General Public License as | 15 | * modify it under the terms of the GNU General Public License as |
16 | * published by the Free Software Foundation; either version 2 of | 16 | * published by the Free Software Foundation; either version 2 of |
17 | * the License, or (at your option) any later version. | 17 | * the License, or (at your option) any later version. |
18 | * | 18 | * |
19 | * This program is distributed in the hope that it will be useful, | 19 | * This program is distributed in the hope that it will be useful, |
20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
22 | * GNU General Public License for more details. | 22 | * GNU General Public License for more details. |
23 | * | 23 | * |
24 | * You should have received a copy of the GNU General Public License | 24 | * You should have received a copy of the GNU General Public License |
25 | * along with this program; if not, write to the Free Software | 25 | * along with this program; if not, write to the Free Software |
26 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 26 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
27 | * | 27 | * |
28 | * | 28 | * |
29 | * This driver is based on: | 29 | * This driver is based on: |
30 | * - information from http://euc.jp/periphs/xbox-controller.ja.html | 30 | * - information from http://euc.jp/periphs/xbox-controller.ja.html |
31 | * - the iForce driver drivers/char/joystick/iforce.c | 31 | * - the iForce driver drivers/char/joystick/iforce.c |
32 | * - the skeleton-driver drivers/usb/usb-skeleton.c | 32 | * - the skeleton-driver drivers/usb/usb-skeleton.c |
33 | * - Xbox 360 information http://www.free60.org/wiki/Gamepad | 33 | * - Xbox 360 information http://www.free60.org/wiki/Gamepad |
34 | * | 34 | * |
35 | * Thanks to: | 35 | * Thanks to: |
36 | * - ITO Takayuki for providing essential xpad information on his website | 36 | * - ITO Takayuki for providing essential xpad information on his website |
37 | * - Vojtech Pavlik - iforce driver / input subsystem | 37 | * - Vojtech Pavlik - iforce driver / input subsystem |
38 | * - Greg Kroah-Hartman - usb-skeleton driver | 38 | * - Greg Kroah-Hartman - usb-skeleton driver |
39 | * - XBOX Linux project - extra USB id's | 39 | * - XBOX Linux project - extra USB id's |
40 | * | 40 | * |
41 | * TODO: | 41 | * TODO: |
42 | * - fine tune axes (especially trigger axes) | 42 | * - fine tune axes (especially trigger axes) |
43 | * - fix "analog" buttons (reported as digital now) | 43 | * - fix "analog" buttons (reported as digital now) |
44 | * - get rumble working | 44 | * - get rumble working |
45 | * - need USB IDs for other dance pads | 45 | * - need USB IDs for other dance pads |
46 | * | 46 | * |
47 | * History: | 47 | * History: |
48 | * | 48 | * |
49 | * 2002-06-27 - 0.0.1 : first version, just said "XBOX HID controller" | 49 | * 2002-06-27 - 0.0.1 : first version, just said "XBOX HID controller" |
50 | * | 50 | * |
51 | * 2002-07-02 - 0.0.2 : basic working version | 51 | * 2002-07-02 - 0.0.2 : basic working version |
52 | * - all axes and 9 of the 10 buttons work (german InterAct device) | 52 | * - all axes and 9 of the 10 buttons work (german InterAct device) |
53 | * - the black button does not work | 53 | * - the black button does not work |
54 | * | 54 | * |
55 | * 2002-07-14 - 0.0.3 : rework by Vojtech Pavlik | 55 | * 2002-07-14 - 0.0.3 : rework by Vojtech Pavlik |
56 | * - indentation fixes | 56 | * - indentation fixes |
57 | * - usb + input init sequence fixes | 57 | * - usb + input init sequence fixes |
58 | * | 58 | * |
59 | * 2002-07-16 - 0.0.4 : minor changes, merge with Vojtech's v0.0.3 | 59 | * 2002-07-16 - 0.0.4 : minor changes, merge with Vojtech's v0.0.3 |
60 | * - verified the lack of HID and report descriptors | 60 | * - verified the lack of HID and report descriptors |
61 | * - verified that ALL buttons WORK | 61 | * - verified that ALL buttons WORK |
62 | * - fixed d-pad to axes mapping | 62 | * - fixed d-pad to axes mapping |
63 | * | 63 | * |
64 | * 2002-07-17 - 0.0.5 : simplified d-pad handling | 64 | * 2002-07-17 - 0.0.5 : simplified d-pad handling |
65 | * | 65 | * |
66 | * 2004-10-02 - 0.0.6 : DDR pad support | 66 | * 2004-10-02 - 0.0.6 : DDR pad support |
67 | * - borrowed from the XBOX linux kernel | 67 | * - borrowed from the XBOX linux kernel |
68 | * - USB id's for commonly used dance pads are present | 68 | * - USB id's for commonly used dance pads are present |
69 | * - dance pads will map D-PAD to buttons, not axes | 69 | * - dance pads will map D-PAD to buttons, not axes |
70 | * - pass the module paramater 'dpad_to_buttons' to force | 70 | * - pass the module paramater 'dpad_to_buttons' to force |
71 | * the D-PAD to map to buttons if your pad is not detected | 71 | * the D-PAD to map to buttons if your pad is not detected |
72 | * | 72 | * |
73 | * Later changes can be tracked in SCM. | 73 | * Later changes can be tracked in SCM. |
74 | */ | 74 | */ |
75 | 75 | ||
76 | #include <linux/kernel.h> | 76 | #include <linux/kernel.h> |
77 | #include <linux/init.h> | 77 | #include <linux/init.h> |
78 | #include <linux/slab.h> | 78 | #include <linux/slab.h> |
79 | #include <linux/stat.h> | 79 | #include <linux/stat.h> |
80 | #include <linux/module.h> | 80 | #include <linux/module.h> |
81 | #include <linux/usb/input.h> | 81 | #include <linux/usb/input.h> |
82 | 82 | ||
83 | #define DRIVER_AUTHOR "Marko Friedemann <mfr@bmx-chemnitz.de>" | 83 | #define DRIVER_AUTHOR "Marko Friedemann <mfr@bmx-chemnitz.de>" |
84 | #define DRIVER_DESC "X-Box pad driver" | 84 | #define DRIVER_DESC "X-Box pad driver" |
85 | 85 | ||
86 | #define XPAD_PKT_LEN 32 | 86 | #define XPAD_PKT_LEN 32 |
87 | 87 | ||
88 | /* xbox d-pads should map to buttons, as is required for DDR pads | 88 | /* xbox d-pads should map to buttons, as is required for DDR pads |
89 | but we map them to axes when possible to simplify things */ | 89 | but we map them to axes when possible to simplify things */ |
90 | #define MAP_DPAD_TO_BUTTONS (1 << 0) | 90 | #define MAP_DPAD_TO_BUTTONS (1 << 0) |
91 | #define MAP_TRIGGERS_TO_BUTTONS (1 << 1) | 91 | #define MAP_TRIGGERS_TO_BUTTONS (1 << 1) |
92 | #define MAP_STICKS_TO_NULL (1 << 2) | 92 | #define MAP_STICKS_TO_NULL (1 << 2) |
93 | #define DANCEPAD_MAP_CONFIG (MAP_DPAD_TO_BUTTONS | \ | 93 | #define DANCEPAD_MAP_CONFIG (MAP_DPAD_TO_BUTTONS | \ |
94 | MAP_TRIGGERS_TO_BUTTONS | MAP_STICKS_TO_NULL) | 94 | MAP_TRIGGERS_TO_BUTTONS | MAP_STICKS_TO_NULL) |
95 | 95 | ||
96 | #define XTYPE_XBOX 0 | 96 | #define XTYPE_XBOX 0 |
97 | #define XTYPE_XBOX360 1 | 97 | #define XTYPE_XBOX360 1 |
98 | #define XTYPE_XBOX360W 2 | 98 | #define XTYPE_XBOX360W 2 |
99 | #define XTYPE_UNKNOWN 3 | 99 | #define XTYPE_UNKNOWN 3 |
100 | 100 | ||
101 | static bool dpad_to_buttons; | 101 | static bool dpad_to_buttons; |
102 | module_param(dpad_to_buttons, bool, S_IRUGO); | 102 | module_param(dpad_to_buttons, bool, S_IRUGO); |
103 | MODULE_PARM_DESC(dpad_to_buttons, "Map D-PAD to buttons rather than axes for unknown pads"); | 103 | MODULE_PARM_DESC(dpad_to_buttons, "Map D-PAD to buttons rather than axes for unknown pads"); |
104 | 104 | ||
105 | static bool triggers_to_buttons; | 105 | static bool triggers_to_buttons; |
106 | module_param(triggers_to_buttons, bool, S_IRUGO); | 106 | module_param(triggers_to_buttons, bool, S_IRUGO); |
107 | MODULE_PARM_DESC(triggers_to_buttons, "Map triggers to buttons rather than axes for unknown pads"); | 107 | MODULE_PARM_DESC(triggers_to_buttons, "Map triggers to buttons rather than axes for unknown pads"); |
108 | 108 | ||
109 | static bool sticks_to_null; | 109 | static bool sticks_to_null; |
110 | module_param(sticks_to_null, bool, S_IRUGO); | 110 | module_param(sticks_to_null, bool, S_IRUGO); |
111 | MODULE_PARM_DESC(sticks_to_null, "Do not map sticks at all for unknown pads"); | 111 | MODULE_PARM_DESC(sticks_to_null, "Do not map sticks at all for unknown pads"); |
112 | 112 | ||
113 | static const struct xpad_device { | 113 | static const struct xpad_device { |
114 | u16 idVendor; | 114 | u16 idVendor; |
115 | u16 idProduct; | 115 | u16 idProduct; |
116 | char *name; | 116 | char *name; |
117 | u8 mapping; | 117 | u8 mapping; |
118 | u8 xtype; | 118 | u8 xtype; |
119 | } xpad_device[] = { | 119 | } xpad_device[] = { |
120 | { 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", 0, XTYPE_XBOX }, | 120 | { 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", 0, XTYPE_XBOX }, |
121 | { 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX }, | 121 | { 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX }, |
122 | { 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", 0, XTYPE_XBOX }, | 122 | { 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", 0, XTYPE_XBOX }, |
123 | { 0x045e, 0x0287, "Microsoft Xbox Controller S", 0, XTYPE_XBOX }, | 123 | { 0x045e, 0x0287, "Microsoft Xbox Controller S", 0, XTYPE_XBOX }, |
124 | { 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W }, | 124 | { 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W }, |
125 | { 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX }, | 125 | { 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX }, |
126 | { 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", 0, XTYPE_XBOX }, | 126 | { 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", 0, XTYPE_XBOX }, |
127 | { 0x046d, 0xc242, "Logitech Chillstream Controller", 0, XTYPE_XBOX360 }, | 127 | { 0x046d, 0xc242, "Logitech Chillstream Controller", 0, XTYPE_XBOX360 }, |
128 | { 0x046d, 0xca84, "Logitech Xbox Cordless Controller", 0, XTYPE_XBOX }, | 128 | { 0x046d, 0xca84, "Logitech Xbox Cordless Controller", 0, XTYPE_XBOX }, |
129 | { 0x046d, 0xca88, "Logitech Compact Controller for Xbox", 0, XTYPE_XBOX }, | 129 | { 0x046d, 0xca88, "Logitech Compact Controller for Xbox", 0, XTYPE_XBOX }, |
130 | { 0x05fd, 0x1007, "Mad Catz Controller (unverified)", 0, XTYPE_XBOX }, | 130 | { 0x05fd, 0x1007, "Mad Catz Controller (unverified)", 0, XTYPE_XBOX }, |
131 | { 0x05fd, 0x107a, "InterAct 'PowerPad Pro' X-Box pad (Germany)", 0, XTYPE_XBOX }, | 131 | { 0x05fd, 0x107a, "InterAct 'PowerPad Pro' X-Box pad (Germany)", 0, XTYPE_XBOX }, |
132 | { 0x0738, 0x4516, "Mad Catz Control Pad", 0, XTYPE_XBOX }, | 132 | { 0x0738, 0x4516, "Mad Catz Control Pad", 0, XTYPE_XBOX }, |
133 | { 0x0738, 0x4522, "Mad Catz LumiCON", 0, XTYPE_XBOX }, | 133 | { 0x0738, 0x4522, "Mad Catz LumiCON", 0, XTYPE_XBOX }, |
134 | { 0x0738, 0x4526, "Mad Catz Control Pad Pro", 0, XTYPE_XBOX }, | 134 | { 0x0738, 0x4526, "Mad Catz Control Pad Pro", 0, XTYPE_XBOX }, |
135 | { 0x0738, 0x4536, "Mad Catz MicroCON", 0, XTYPE_XBOX }, | 135 | { 0x0738, 0x4536, "Mad Catz MicroCON", 0, XTYPE_XBOX }, |
136 | { 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, | 136 | { 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, |
137 | { 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", 0, XTYPE_XBOX }, | 137 | { 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", 0, XTYPE_XBOX }, |
138 | { 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, | 138 | { 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, |
139 | { 0x0738, 0x4738, "Mad Catz Wired Xbox 360 Controller (SFIV)", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, | 139 | { 0x0738, 0x4738, "Mad Catz Wired Xbox 360 Controller (SFIV)", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, |
140 | { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, | 140 | { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, |
141 | { 0x0c12, 0x8802, "Zeroplus Xbox Controller", 0, XTYPE_XBOX }, | 141 | { 0x0c12, 0x8802, "Zeroplus Xbox Controller", 0, XTYPE_XBOX }, |
142 | { 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX }, | 142 | { 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX }, |
143 | { 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX }, | 143 | { 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX }, |
144 | { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX }, | 144 | { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX }, |
145 | { 0x0e4c, 0x1097, "Radica Gamester Controller", 0, XTYPE_XBOX }, | 145 | { 0x0e4c, 0x1097, "Radica Gamester Controller", 0, XTYPE_XBOX }, |
146 | { 0x0e4c, 0x2390, "Radica Games Jtech Controller", 0, XTYPE_XBOX }, | 146 | { 0x0e4c, 0x2390, "Radica Games Jtech Controller", 0, XTYPE_XBOX }, |
147 | { 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX }, | 147 | { 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX }, |
148 | { 0x0e6f, 0x0005, "Eclipse wireless Controller", 0, XTYPE_XBOX }, | 148 | { 0x0e6f, 0x0005, "Eclipse wireless Controller", 0, XTYPE_XBOX }, |
149 | { 0x0e6f, 0x0006, "Edge wireless Controller", 0, XTYPE_XBOX }, | 149 | { 0x0e6f, 0x0006, "Edge wireless Controller", 0, XTYPE_XBOX }, |
150 | { 0x0e6f, 0x0006, "Pelican 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, | 150 | { 0x0e6f, 0x0006, "Pelican 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, |
151 | { 0x0e6f, 0x0201, "Pelican PL-3601 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, | 151 | { 0x0e6f, 0x0201, "Pelican PL-3601 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, |
152 | { 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", 0, XTYPE_XBOX }, | 152 | { 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", 0, XTYPE_XBOX }, |
153 | { 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX }, | 153 | { 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX }, |
154 | { 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX }, | 154 | { 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX }, |
155 | { 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", 0, XTYPE_XBOX }, | 155 | { 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", 0, XTYPE_XBOX }, |
156 | { 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, | 156 | { 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, |
157 | { 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, | 157 | { 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, |
158 | { 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, | 158 | { 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, |
159 | { 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", 0, XTYPE_XBOX360 }, | 159 | { 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", 0, XTYPE_XBOX360 }, |
160 | { 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, | 160 | { 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, |
161 | { 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, XTYPE_XBOX360 }, | 161 | { 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, XTYPE_XBOX360 }, |
162 | { 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 }, | 162 | { 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 }, |
163 | { 0x1bad, 0x0002, "Harmonix Rock Band Guitar", 0, XTYPE_XBOX360 }, | 163 | { 0x1bad, 0x0002, "Harmonix Rock Band Guitar", 0, XTYPE_XBOX360 }, |
164 | { 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, | 164 | { 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, |
165 | { 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, | 165 | { 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, |
166 | { 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, | 166 | { 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, |
167 | { 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX }, | 167 | { 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX }, |
168 | { 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN } | 168 | { 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN } |
169 | }; | 169 | }; |
170 | 170 | ||
171 | /* buttons shared with xbox and xbox360 */ | 171 | /* buttons shared with xbox and xbox360 */ |
172 | static const signed short xpad_common_btn[] = { | 172 | static const signed short xpad_common_btn[] = { |
173 | BTN_A, BTN_B, BTN_X, BTN_Y, /* "analog" buttons */ | 173 | BTN_A, BTN_B, BTN_X, BTN_Y, /* "analog" buttons */ |
174 | BTN_START, BTN_SELECT, BTN_THUMBL, BTN_THUMBR, /* start/back/sticks */ | 174 | BTN_START, BTN_SELECT, BTN_THUMBL, BTN_THUMBR, /* start/back/sticks */ |
175 | -1 /* terminating entry */ | 175 | -1 /* terminating entry */ |
176 | }; | 176 | }; |
177 | 177 | ||
178 | /* original xbox controllers only */ | 178 | /* original xbox controllers only */ |
179 | static const signed short xpad_btn[] = { | 179 | static const signed short xpad_btn[] = { |
180 | BTN_C, BTN_Z, /* "analog" buttons */ | 180 | BTN_C, BTN_Z, /* "analog" buttons */ |
181 | -1 /* terminating entry */ | 181 | -1 /* terminating entry */ |
182 | }; | 182 | }; |
183 | 183 | ||
184 | /* used when dpad is mapped to buttons */ | 184 | /* used when dpad is mapped to buttons */ |
185 | static const signed short xpad_btn_pad[] = { | 185 | static const signed short xpad_btn_pad[] = { |
186 | BTN_TRIGGER_HAPPY1, BTN_TRIGGER_HAPPY2, /* d-pad left, right */ | 186 | BTN_TRIGGER_HAPPY1, BTN_TRIGGER_HAPPY2, /* d-pad left, right */ |
187 | BTN_TRIGGER_HAPPY3, BTN_TRIGGER_HAPPY4, /* d-pad up, down */ | 187 | BTN_TRIGGER_HAPPY3, BTN_TRIGGER_HAPPY4, /* d-pad up, down */ |
188 | -1 /* terminating entry */ | 188 | -1 /* terminating entry */ |
189 | }; | 189 | }; |
190 | 190 | ||
191 | /* used when triggers are mapped to buttons */ | 191 | /* used when triggers are mapped to buttons */ |
192 | static const signed short xpad_btn_triggers[] = { | 192 | static const signed short xpad_btn_triggers[] = { |
193 | BTN_TL2, BTN_TR2, /* triggers left/right */ | 193 | BTN_TL2, BTN_TR2, /* triggers left/right */ |
194 | -1 | 194 | -1 |
195 | }; | 195 | }; |
196 | 196 | ||
197 | 197 | ||
198 | static const signed short xpad360_btn[] = { /* buttons for x360 controller */ | 198 | static const signed short xpad360_btn[] = { /* buttons for x360 controller */ |
199 | BTN_TL, BTN_TR, /* Button LB/RB */ | 199 | BTN_TL, BTN_TR, /* Button LB/RB */ |
200 | BTN_MODE, /* The big X button */ | 200 | BTN_MODE, /* The big X button */ |
201 | -1 | 201 | -1 |
202 | }; | 202 | }; |
203 | 203 | ||
204 | static const signed short xpad_abs[] = { | 204 | static const signed short xpad_abs[] = { |
205 | ABS_X, ABS_Y, /* left stick */ | 205 | ABS_X, ABS_Y, /* left stick */ |
206 | ABS_RX, ABS_RY, /* right stick */ | 206 | ABS_RX, ABS_RY, /* right stick */ |
207 | -1 /* terminating entry */ | 207 | -1 /* terminating entry */ |
208 | }; | 208 | }; |
209 | 209 | ||
210 | /* used when dpad is mapped to axes */ | 210 | /* used when dpad is mapped to axes */ |
211 | static const signed short xpad_abs_pad[] = { | 211 | static const signed short xpad_abs_pad[] = { |
212 | ABS_HAT0X, ABS_HAT0Y, /* d-pad axes */ | 212 | ABS_HAT0X, ABS_HAT0Y, /* d-pad axes */ |
213 | -1 /* terminating entry */ | 213 | -1 /* terminating entry */ |
214 | }; | 214 | }; |
215 | 215 | ||
216 | /* used when triggers are mapped to axes */ | 216 | /* used when triggers are mapped to axes */ |
217 | static const signed short xpad_abs_triggers[] = { | 217 | static const signed short xpad_abs_triggers[] = { |
218 | ABS_Z, ABS_RZ, /* triggers left/right */ | 218 | ABS_Z, ABS_RZ, /* triggers left/right */ |
219 | -1 | 219 | -1 |
220 | }; | 220 | }; |
221 | 221 | ||
222 | /* Xbox 360 has a vendor-specific class, so we cannot match it with only | 222 | /* Xbox 360 has a vendor-specific class, so we cannot match it with only |
223 | * USB_INTERFACE_INFO (also specifically refused by USB subsystem), so we | 223 | * USB_INTERFACE_INFO (also specifically refused by USB subsystem), so we |
224 | * match against vendor id as well. Wired Xbox 360 devices have protocol 1, | 224 | * match against vendor id as well. Wired Xbox 360 devices have protocol 1, |
225 | * wireless controllers have protocol 129. */ | 225 | * wireless controllers have protocol 129. */ |
226 | #define XPAD_XBOX360_VENDOR_PROTOCOL(vend,pr) \ | 226 | #define XPAD_XBOX360_VENDOR_PROTOCOL(vend,pr) \ |
227 | .match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, \ | 227 | .match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, \ |
228 | .idVendor = (vend), \ | 228 | .idVendor = (vend), \ |
229 | .bInterfaceClass = USB_CLASS_VENDOR_SPEC, \ | 229 | .bInterfaceClass = USB_CLASS_VENDOR_SPEC, \ |
230 | .bInterfaceSubClass = 93, \ | 230 | .bInterfaceSubClass = 93, \ |
231 | .bInterfaceProtocol = (pr) | 231 | .bInterfaceProtocol = (pr) |
232 | #define XPAD_XBOX360_VENDOR(vend) \ | 232 | #define XPAD_XBOX360_VENDOR(vend) \ |
233 | { XPAD_XBOX360_VENDOR_PROTOCOL(vend,1) }, \ | 233 | { XPAD_XBOX360_VENDOR_PROTOCOL(vend,1) }, \ |
234 | { XPAD_XBOX360_VENDOR_PROTOCOL(vend,129) } | 234 | { XPAD_XBOX360_VENDOR_PROTOCOL(vend,129) } |
235 | 235 | ||
236 | static struct usb_device_id xpad_table [] = { | 236 | static struct usb_device_id xpad_table [] = { |
237 | { USB_INTERFACE_INFO('X', 'B', 0) }, /* X-Box USB-IF not approved class */ | 237 | { USB_INTERFACE_INFO('X', 'B', 0) }, /* X-Box USB-IF not approved class */ |
238 | XPAD_XBOX360_VENDOR(0x045e), /* Microsoft X-Box 360 controllers */ | 238 | XPAD_XBOX360_VENDOR(0x045e), /* Microsoft X-Box 360 controllers */ |
239 | XPAD_XBOX360_VENDOR(0x046d), /* Logitech X-Box 360 style controllers */ | 239 | XPAD_XBOX360_VENDOR(0x046d), /* Logitech X-Box 360 style controllers */ |
240 | XPAD_XBOX360_VENDOR(0x0738), /* Mad Catz X-Box 360 controllers */ | 240 | XPAD_XBOX360_VENDOR(0x0738), /* Mad Catz X-Box 360 controllers */ |
241 | { USB_DEVICE(0x0738, 0x4540) }, /* Mad Catz Beat Pad */ | ||
241 | XPAD_XBOX360_VENDOR(0x0e6f), /* 0x0e6f X-Box 360 controllers */ | 242 | XPAD_XBOX360_VENDOR(0x0e6f), /* 0x0e6f X-Box 360 controllers */ |
242 | XPAD_XBOX360_VENDOR(0x12ab), /* X-Box 360 dance pads */ | 243 | XPAD_XBOX360_VENDOR(0x12ab), /* X-Box 360 dance pads */ |
243 | XPAD_XBOX360_VENDOR(0x1430), /* RedOctane X-Box 360 controllers */ | 244 | XPAD_XBOX360_VENDOR(0x1430), /* RedOctane X-Box 360 controllers */ |
244 | XPAD_XBOX360_VENDOR(0x146b), /* BigBen Interactive Controllers */ | 245 | XPAD_XBOX360_VENDOR(0x146b), /* BigBen Interactive Controllers */ |
245 | XPAD_XBOX360_VENDOR(0x1bad), /* Harminix Rock Band Guitar and Drums */ | 246 | XPAD_XBOX360_VENDOR(0x1bad), /* Harminix Rock Band Guitar and Drums */ |
246 | XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */ | 247 | XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */ |
247 | { } | 248 | { } |
248 | }; | 249 | }; |
249 | 250 | ||
250 | MODULE_DEVICE_TABLE (usb, xpad_table); | 251 | MODULE_DEVICE_TABLE (usb, xpad_table); |
251 | 252 | ||
252 | struct usb_xpad { | 253 | struct usb_xpad { |
253 | struct input_dev *dev; /* input device interface */ | 254 | struct input_dev *dev; /* input device interface */ |
254 | struct usb_device *udev; /* usb device */ | 255 | struct usb_device *udev; /* usb device */ |
255 | 256 | ||
256 | int pad_present; | 257 | int pad_present; |
257 | 258 | ||
258 | struct urb *irq_in; /* urb for interrupt in report */ | 259 | struct urb *irq_in; /* urb for interrupt in report */ |
259 | unsigned char *idata; /* input data */ | 260 | unsigned char *idata; /* input data */ |
260 | dma_addr_t idata_dma; | 261 | dma_addr_t idata_dma; |
261 | 262 | ||
262 | struct urb *bulk_out; | 263 | struct urb *bulk_out; |
263 | unsigned char *bdata; | 264 | unsigned char *bdata; |
264 | 265 | ||
265 | #if defined(CONFIG_JOYSTICK_XPAD_FF) || defined(CONFIG_JOYSTICK_XPAD_LEDS) | 266 | #if defined(CONFIG_JOYSTICK_XPAD_FF) || defined(CONFIG_JOYSTICK_XPAD_LEDS) |
266 | struct urb *irq_out; /* urb for interrupt out report */ | 267 | struct urb *irq_out; /* urb for interrupt out report */ |
267 | unsigned char *odata; /* output data */ | 268 | unsigned char *odata; /* output data */ |
268 | dma_addr_t odata_dma; | 269 | dma_addr_t odata_dma; |
269 | struct mutex odata_mutex; | 270 | struct mutex odata_mutex; |
270 | #endif | 271 | #endif |
271 | 272 | ||
272 | #if defined(CONFIG_JOYSTICK_XPAD_LEDS) | 273 | #if defined(CONFIG_JOYSTICK_XPAD_LEDS) |
273 | struct xpad_led *led; | 274 | struct xpad_led *led; |
274 | #endif | 275 | #endif |
275 | 276 | ||
276 | char phys[64]; /* physical device path */ | 277 | char phys[64]; /* physical device path */ |
277 | 278 | ||
278 | int mapping; /* map d-pad to buttons or to axes */ | 279 | int mapping; /* map d-pad to buttons or to axes */ |
279 | int xtype; /* type of xbox device */ | 280 | int xtype; /* type of xbox device */ |
280 | }; | 281 | }; |
281 | 282 | ||
282 | /* | 283 | /* |
283 | * xpad_process_packet | 284 | * xpad_process_packet |
284 | * | 285 | * |
285 | * Completes a request by converting the data into events for the | 286 | * Completes a request by converting the data into events for the |
286 | * input subsystem. | 287 | * input subsystem. |
287 | * | 288 | * |
288 | * The used report descriptor was taken from ITO Takayukis website: | 289 | * The used report descriptor was taken from ITO Takayukis website: |
289 | * http://euc.jp/periphs/xbox-controller.ja.html | 290 | * http://euc.jp/periphs/xbox-controller.ja.html |
290 | */ | 291 | */ |
291 | 292 | ||
292 | static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data) | 293 | static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data) |
293 | { | 294 | { |
294 | struct input_dev *dev = xpad->dev; | 295 | struct input_dev *dev = xpad->dev; |
295 | 296 | ||
296 | if (!(xpad->mapping & MAP_STICKS_TO_NULL)) { | 297 | if (!(xpad->mapping & MAP_STICKS_TO_NULL)) { |
297 | /* left stick */ | 298 | /* left stick */ |
298 | input_report_abs(dev, ABS_X, | 299 | input_report_abs(dev, ABS_X, |
299 | (__s16) le16_to_cpup((__le16 *)(data + 12))); | 300 | (__s16) le16_to_cpup((__le16 *)(data + 12))); |
300 | input_report_abs(dev, ABS_Y, | 301 | input_report_abs(dev, ABS_Y, |
301 | ~(__s16) le16_to_cpup((__le16 *)(data + 14))); | 302 | ~(__s16) le16_to_cpup((__le16 *)(data + 14))); |
302 | 303 | ||
303 | /* right stick */ | 304 | /* right stick */ |
304 | input_report_abs(dev, ABS_RX, | 305 | input_report_abs(dev, ABS_RX, |
305 | (__s16) le16_to_cpup((__le16 *)(data + 16))); | 306 | (__s16) le16_to_cpup((__le16 *)(data + 16))); |
306 | input_report_abs(dev, ABS_RY, | 307 | input_report_abs(dev, ABS_RY, |
307 | ~(__s16) le16_to_cpup((__le16 *)(data + 18))); | 308 | ~(__s16) le16_to_cpup((__le16 *)(data + 18))); |
308 | } | 309 | } |
309 | 310 | ||
310 | /* triggers left/right */ | 311 | /* triggers left/right */ |
311 | if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) { | 312 | if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) { |
312 | input_report_key(dev, BTN_TL2, data[10]); | 313 | input_report_key(dev, BTN_TL2, data[10]); |
313 | input_report_key(dev, BTN_TR2, data[11]); | 314 | input_report_key(dev, BTN_TR2, data[11]); |
314 | } else { | 315 | } else { |
315 | input_report_abs(dev, ABS_Z, data[10]); | 316 | input_report_abs(dev, ABS_Z, data[10]); |
316 | input_report_abs(dev, ABS_RZ, data[11]); | 317 | input_report_abs(dev, ABS_RZ, data[11]); |
317 | } | 318 | } |
318 | 319 | ||
319 | /* digital pad */ | 320 | /* digital pad */ |
320 | if (xpad->mapping & MAP_DPAD_TO_BUTTONS) { | 321 | if (xpad->mapping & MAP_DPAD_TO_BUTTONS) { |
321 | /* dpad as buttons (left, right, up, down) */ | 322 | /* dpad as buttons (left, right, up, down) */ |
322 | input_report_key(dev, BTN_TRIGGER_HAPPY1, data[2] & 0x04); | 323 | input_report_key(dev, BTN_TRIGGER_HAPPY1, data[2] & 0x04); |
323 | input_report_key(dev, BTN_TRIGGER_HAPPY2, data[2] & 0x08); | 324 | input_report_key(dev, BTN_TRIGGER_HAPPY2, data[2] & 0x08); |
324 | input_report_key(dev, BTN_TRIGGER_HAPPY3, data[2] & 0x01); | 325 | input_report_key(dev, BTN_TRIGGER_HAPPY3, data[2] & 0x01); |
325 | input_report_key(dev, BTN_TRIGGER_HAPPY4, data[2] & 0x02); | 326 | input_report_key(dev, BTN_TRIGGER_HAPPY4, data[2] & 0x02); |
326 | } else { | 327 | } else { |
327 | input_report_abs(dev, ABS_HAT0X, | 328 | input_report_abs(dev, ABS_HAT0X, |
328 | !!(data[2] & 0x08) - !!(data[2] & 0x04)); | 329 | !!(data[2] & 0x08) - !!(data[2] & 0x04)); |
329 | input_report_abs(dev, ABS_HAT0Y, | 330 | input_report_abs(dev, ABS_HAT0Y, |
330 | !!(data[2] & 0x02) - !!(data[2] & 0x01)); | 331 | !!(data[2] & 0x02) - !!(data[2] & 0x01)); |
331 | } | 332 | } |
332 | 333 | ||
333 | /* start/back buttons and stick press left/right */ | 334 | /* start/back buttons and stick press left/right */ |
334 | input_report_key(dev, BTN_START, data[2] & 0x10); | 335 | input_report_key(dev, BTN_START, data[2] & 0x10); |
335 | input_report_key(dev, BTN_SELECT, data[2] & 0x20); | 336 | input_report_key(dev, BTN_SELECT, data[2] & 0x20); |
336 | input_report_key(dev, BTN_THUMBL, data[2] & 0x40); | 337 | input_report_key(dev, BTN_THUMBL, data[2] & 0x40); |
337 | input_report_key(dev, BTN_THUMBR, data[2] & 0x80); | 338 | input_report_key(dev, BTN_THUMBR, data[2] & 0x80); |
338 | 339 | ||
339 | /* "analog" buttons A, B, X, Y */ | 340 | /* "analog" buttons A, B, X, Y */ |
340 | input_report_key(dev, BTN_A, data[4]); | 341 | input_report_key(dev, BTN_A, data[4]); |
341 | input_report_key(dev, BTN_B, data[5]); | 342 | input_report_key(dev, BTN_B, data[5]); |
342 | input_report_key(dev, BTN_X, data[6]); | 343 | input_report_key(dev, BTN_X, data[6]); |
343 | input_report_key(dev, BTN_Y, data[7]); | 344 | input_report_key(dev, BTN_Y, data[7]); |
344 | 345 | ||
345 | /* "analog" buttons black, white */ | 346 | /* "analog" buttons black, white */ |
346 | input_report_key(dev, BTN_C, data[8]); | 347 | input_report_key(dev, BTN_C, data[8]); |
347 | input_report_key(dev, BTN_Z, data[9]); | 348 | input_report_key(dev, BTN_Z, data[9]); |
348 | 349 | ||
349 | input_sync(dev); | 350 | input_sync(dev); |
350 | } | 351 | } |
351 | 352 | ||
352 | /* | 353 | /* |
353 | * xpad360_process_packet | 354 | * xpad360_process_packet |
354 | * | 355 | * |
355 | * Completes a request by converting the data into events for the | 356 | * Completes a request by converting the data into events for the |
356 | * input subsystem. It is version for xbox 360 controller | 357 | * input subsystem. It is version for xbox 360 controller |
357 | * | 358 | * |
358 | * The used report descriptor was taken from: | 359 | * The used report descriptor was taken from: |
359 | * http://www.free60.org/wiki/Gamepad | 360 | * http://www.free60.org/wiki/Gamepad |
360 | */ | 361 | */ |
361 | 362 | ||
362 | static void xpad360_process_packet(struct usb_xpad *xpad, | 363 | static void xpad360_process_packet(struct usb_xpad *xpad, |
363 | u16 cmd, unsigned char *data) | 364 | u16 cmd, unsigned char *data) |
364 | { | 365 | { |
365 | struct input_dev *dev = xpad->dev; | 366 | struct input_dev *dev = xpad->dev; |
366 | 367 | ||
367 | /* digital pad */ | 368 | /* digital pad */ |
368 | if (xpad->mapping & MAP_DPAD_TO_BUTTONS) { | 369 | if (xpad->mapping & MAP_DPAD_TO_BUTTONS) { |
369 | /* dpad as buttons (left, right, up, down) */ | 370 | /* dpad as buttons (left, right, up, down) */ |
370 | input_report_key(dev, BTN_TRIGGER_HAPPY1, data[2] & 0x04); | 371 | input_report_key(dev, BTN_TRIGGER_HAPPY1, data[2] & 0x04); |
371 | input_report_key(dev, BTN_TRIGGER_HAPPY2, data[2] & 0x08); | 372 | input_report_key(dev, BTN_TRIGGER_HAPPY2, data[2] & 0x08); |
372 | input_report_key(dev, BTN_TRIGGER_HAPPY3, data[2] & 0x01); | 373 | input_report_key(dev, BTN_TRIGGER_HAPPY3, data[2] & 0x01); |
373 | input_report_key(dev, BTN_TRIGGER_HAPPY4, data[2] & 0x02); | 374 | input_report_key(dev, BTN_TRIGGER_HAPPY4, data[2] & 0x02); |
374 | } else { | 375 | } else { |
375 | input_report_abs(dev, ABS_HAT0X, | 376 | input_report_abs(dev, ABS_HAT0X, |
376 | !!(data[2] & 0x08) - !!(data[2] & 0x04)); | 377 | !!(data[2] & 0x08) - !!(data[2] & 0x04)); |
377 | input_report_abs(dev, ABS_HAT0Y, | 378 | input_report_abs(dev, ABS_HAT0Y, |
378 | !!(data[2] & 0x02) - !!(data[2] & 0x01)); | 379 | !!(data[2] & 0x02) - !!(data[2] & 0x01)); |
379 | } | 380 | } |
380 | 381 | ||
381 | /* start/back buttons */ | 382 | /* start/back buttons */ |
382 | input_report_key(dev, BTN_START, data[2] & 0x10); | 383 | input_report_key(dev, BTN_START, data[2] & 0x10); |
383 | input_report_key(dev, BTN_SELECT, data[2] & 0x20); | 384 | input_report_key(dev, BTN_SELECT, data[2] & 0x20); |
384 | 385 | ||
385 | /* stick press left/right */ | 386 | /* stick press left/right */ |
386 | input_report_key(dev, BTN_THUMBL, data[2] & 0x40); | 387 | input_report_key(dev, BTN_THUMBL, data[2] & 0x40); |
387 | input_report_key(dev, BTN_THUMBR, data[2] & 0x80); | 388 | input_report_key(dev, BTN_THUMBR, data[2] & 0x80); |
388 | 389 | ||
389 | /* buttons A,B,X,Y,TL,TR and MODE */ | 390 | /* buttons A,B,X,Y,TL,TR and MODE */ |
390 | input_report_key(dev, BTN_A, data[3] & 0x10); | 391 | input_report_key(dev, BTN_A, data[3] & 0x10); |
391 | input_report_key(dev, BTN_B, data[3] & 0x20); | 392 | input_report_key(dev, BTN_B, data[3] & 0x20); |
392 | input_report_key(dev, BTN_X, data[3] & 0x40); | 393 | input_report_key(dev, BTN_X, data[3] & 0x40); |
393 | input_report_key(dev, BTN_Y, data[3] & 0x80); | 394 | input_report_key(dev, BTN_Y, data[3] & 0x80); |
394 | input_report_key(dev, BTN_TL, data[3] & 0x01); | 395 | input_report_key(dev, BTN_TL, data[3] & 0x01); |
395 | input_report_key(dev, BTN_TR, data[3] & 0x02); | 396 | input_report_key(dev, BTN_TR, data[3] & 0x02); |
396 | input_report_key(dev, BTN_MODE, data[3] & 0x04); | 397 | input_report_key(dev, BTN_MODE, data[3] & 0x04); |
397 | 398 | ||
398 | if (!(xpad->mapping & MAP_STICKS_TO_NULL)) { | 399 | if (!(xpad->mapping & MAP_STICKS_TO_NULL)) { |
399 | /* left stick */ | 400 | /* left stick */ |
400 | input_report_abs(dev, ABS_X, | 401 | input_report_abs(dev, ABS_X, |
401 | (__s16) le16_to_cpup((__le16 *)(data + 6))); | 402 | (__s16) le16_to_cpup((__le16 *)(data + 6))); |
402 | input_report_abs(dev, ABS_Y, | 403 | input_report_abs(dev, ABS_Y, |
403 | ~(__s16) le16_to_cpup((__le16 *)(data + 8))); | 404 | ~(__s16) le16_to_cpup((__le16 *)(data + 8))); |
404 | 405 | ||
405 | /* right stick */ | 406 | /* right stick */ |
406 | input_report_abs(dev, ABS_RX, | 407 | input_report_abs(dev, ABS_RX, |
407 | (__s16) le16_to_cpup((__le16 *)(data + 10))); | 408 | (__s16) le16_to_cpup((__le16 *)(data + 10))); |
408 | input_report_abs(dev, ABS_RY, | 409 | input_report_abs(dev, ABS_RY, |
409 | ~(__s16) le16_to_cpup((__le16 *)(data + 12))); | 410 | ~(__s16) le16_to_cpup((__le16 *)(data + 12))); |
410 | } | 411 | } |
411 | 412 | ||
412 | /* triggers left/right */ | 413 | /* triggers left/right */ |
413 | if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) { | 414 | if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) { |
414 | input_report_key(dev, BTN_TL2, data[4]); | 415 | input_report_key(dev, BTN_TL2, data[4]); |
415 | input_report_key(dev, BTN_TR2, data[5]); | 416 | input_report_key(dev, BTN_TR2, data[5]); |
416 | } else { | 417 | } else { |
417 | input_report_abs(dev, ABS_Z, data[4]); | 418 | input_report_abs(dev, ABS_Z, data[4]); |
418 | input_report_abs(dev, ABS_RZ, data[5]); | 419 | input_report_abs(dev, ABS_RZ, data[5]); |
419 | } | 420 | } |
420 | 421 | ||
421 | input_sync(dev); | 422 | input_sync(dev); |
422 | } | 423 | } |
423 | 424 | ||
424 | /* | 425 | /* |
425 | * xpad360w_process_packet | 426 | * xpad360w_process_packet |
426 | * | 427 | * |
427 | * Completes a request by converting the data into events for the | 428 | * Completes a request by converting the data into events for the |
428 | * input subsystem. It is version for xbox 360 wireless controller. | 429 | * input subsystem. It is version for xbox 360 wireless controller. |
429 | * | 430 | * |
430 | * Byte.Bit | 431 | * Byte.Bit |
431 | * 00.1 - Status change: The controller or headset has connected/disconnected | 432 | * 00.1 - Status change: The controller or headset has connected/disconnected |
432 | * Bits 01.7 and 01.6 are valid | 433 | * Bits 01.7 and 01.6 are valid |
433 | * 01.7 - Controller present | 434 | * 01.7 - Controller present |
434 | * 01.6 - Headset present | 435 | * 01.6 - Headset present |
435 | * 01.1 - Pad state (Bytes 4+) valid | 436 | * 01.1 - Pad state (Bytes 4+) valid |
436 | * | 437 | * |
437 | */ | 438 | */ |
438 | 439 | ||
439 | static void xpad360w_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data) | 440 | static void xpad360w_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data) |
440 | { | 441 | { |
441 | /* Presence change */ | 442 | /* Presence change */ |
442 | if (data[0] & 0x08) { | 443 | if (data[0] & 0x08) { |
443 | if (data[1] & 0x80) { | 444 | if (data[1] & 0x80) { |
444 | xpad->pad_present = 1; | 445 | xpad->pad_present = 1; |
445 | usb_submit_urb(xpad->bulk_out, GFP_ATOMIC); | 446 | usb_submit_urb(xpad->bulk_out, GFP_ATOMIC); |
446 | } else | 447 | } else |
447 | xpad->pad_present = 0; | 448 | xpad->pad_present = 0; |
448 | } | 449 | } |
449 | 450 | ||
450 | /* Valid pad data */ | 451 | /* Valid pad data */ |
451 | if (!(data[1] & 0x1)) | 452 | if (!(data[1] & 0x1)) |
452 | return; | 453 | return; |
453 | 454 | ||
454 | xpad360_process_packet(xpad, cmd, &data[4]); | 455 | xpad360_process_packet(xpad, cmd, &data[4]); |
455 | } | 456 | } |
456 | 457 | ||
457 | static void xpad_irq_in(struct urb *urb) | 458 | static void xpad_irq_in(struct urb *urb) |
458 | { | 459 | { |
459 | struct usb_xpad *xpad = urb->context; | 460 | struct usb_xpad *xpad = urb->context; |
460 | int retval, status; | 461 | int retval, status; |
461 | 462 | ||
462 | status = urb->status; | 463 | status = urb->status; |
463 | 464 | ||
464 | switch (status) { | 465 | switch (status) { |
465 | case 0: | 466 | case 0: |
466 | /* success */ | 467 | /* success */ |
467 | break; | 468 | break; |
468 | case -ECONNRESET: | 469 | case -ECONNRESET: |
469 | case -ENOENT: | 470 | case -ENOENT: |
470 | case -ESHUTDOWN: | 471 | case -ESHUTDOWN: |
471 | /* this urb is terminated, clean up */ | 472 | /* this urb is terminated, clean up */ |
472 | dbg("%s - urb shutting down with status: %d", | 473 | dbg("%s - urb shutting down with status: %d", |
473 | __func__, status); | 474 | __func__, status); |
474 | return; | 475 | return; |
475 | default: | 476 | default: |
476 | dbg("%s - nonzero urb status received: %d", | 477 | dbg("%s - nonzero urb status received: %d", |
477 | __func__, status); | 478 | __func__, status); |
478 | goto exit; | 479 | goto exit; |
479 | } | 480 | } |
480 | 481 | ||
481 | switch (xpad->xtype) { | 482 | switch (xpad->xtype) { |
482 | case XTYPE_XBOX360: | 483 | case XTYPE_XBOX360: |
483 | xpad360_process_packet(xpad, 0, xpad->idata); | 484 | xpad360_process_packet(xpad, 0, xpad->idata); |
484 | break; | 485 | break; |
485 | case XTYPE_XBOX360W: | 486 | case XTYPE_XBOX360W: |
486 | xpad360w_process_packet(xpad, 0, xpad->idata); | 487 | xpad360w_process_packet(xpad, 0, xpad->idata); |
487 | break; | 488 | break; |
488 | default: | 489 | default: |
489 | xpad_process_packet(xpad, 0, xpad->idata); | 490 | xpad_process_packet(xpad, 0, xpad->idata); |
490 | } | 491 | } |
491 | 492 | ||
492 | exit: | 493 | exit: |
493 | retval = usb_submit_urb(urb, GFP_ATOMIC); | 494 | retval = usb_submit_urb(urb, GFP_ATOMIC); |
494 | if (retval) | 495 | if (retval) |
495 | err ("%s - usb_submit_urb failed with result %d", | 496 | err ("%s - usb_submit_urb failed with result %d", |
496 | __func__, retval); | 497 | __func__, retval); |
497 | } | 498 | } |
498 | 499 | ||
499 | static void xpad_bulk_out(struct urb *urb) | 500 | static void xpad_bulk_out(struct urb *urb) |
500 | { | 501 | { |
501 | switch (urb->status) { | 502 | switch (urb->status) { |
502 | case 0: | 503 | case 0: |
503 | /* success */ | 504 | /* success */ |
504 | break; | 505 | break; |
505 | case -ECONNRESET: | 506 | case -ECONNRESET: |
506 | case -ENOENT: | 507 | case -ENOENT: |
507 | case -ESHUTDOWN: | 508 | case -ESHUTDOWN: |
508 | /* this urb is terminated, clean up */ | 509 | /* this urb is terminated, clean up */ |
509 | dbg("%s - urb shutting down with status: %d", __func__, urb->status); | 510 | dbg("%s - urb shutting down with status: %d", __func__, urb->status); |
510 | break; | 511 | break; |
511 | default: | 512 | default: |
512 | dbg("%s - nonzero urb status received: %d", __func__, urb->status); | 513 | dbg("%s - nonzero urb status received: %d", __func__, urb->status); |
513 | } | 514 | } |
514 | } | 515 | } |
515 | 516 | ||
516 | #if defined(CONFIG_JOYSTICK_XPAD_FF) || defined(CONFIG_JOYSTICK_XPAD_LEDS) | 517 | #if defined(CONFIG_JOYSTICK_XPAD_FF) || defined(CONFIG_JOYSTICK_XPAD_LEDS) |
517 | static void xpad_irq_out(struct urb *urb) | 518 | static void xpad_irq_out(struct urb *urb) |
518 | { | 519 | { |
519 | int retval, status; | 520 | int retval, status; |
520 | 521 | ||
521 | status = urb->status; | 522 | status = urb->status; |
522 | 523 | ||
523 | switch (status) { | 524 | switch (status) { |
524 | case 0: | 525 | case 0: |
525 | /* success */ | 526 | /* success */ |
526 | return; | 527 | return; |
527 | 528 | ||
528 | case -ECONNRESET: | 529 | case -ECONNRESET: |
529 | case -ENOENT: | 530 | case -ENOENT: |
530 | case -ESHUTDOWN: | 531 | case -ESHUTDOWN: |
531 | /* this urb is terminated, clean up */ | 532 | /* this urb is terminated, clean up */ |
532 | dbg("%s - urb shutting down with status: %d", __func__, status); | 533 | dbg("%s - urb shutting down with status: %d", __func__, status); |
533 | return; | 534 | return; |
534 | 535 | ||
535 | default: | 536 | default: |
536 | dbg("%s - nonzero urb status received: %d", __func__, status); | 537 | dbg("%s - nonzero urb status received: %d", __func__, status); |
537 | goto exit; | 538 | goto exit; |
538 | } | 539 | } |
539 | 540 | ||
540 | exit: | 541 | exit: |
541 | retval = usb_submit_urb(urb, GFP_ATOMIC); | 542 | retval = usb_submit_urb(urb, GFP_ATOMIC); |
542 | if (retval) | 543 | if (retval) |
543 | err("%s - usb_submit_urb failed with result %d", | 544 | err("%s - usb_submit_urb failed with result %d", |
544 | __func__, retval); | 545 | __func__, retval); |
545 | } | 546 | } |
546 | 547 | ||
547 | static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) | 548 | static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) |
548 | { | 549 | { |
549 | struct usb_endpoint_descriptor *ep_irq_out; | 550 | struct usb_endpoint_descriptor *ep_irq_out; |
550 | int error; | 551 | int error; |
551 | 552 | ||
552 | if (xpad->xtype == XTYPE_UNKNOWN) | 553 | if (xpad->xtype == XTYPE_UNKNOWN) |
553 | return 0; | 554 | return 0; |
554 | 555 | ||
555 | xpad->odata = usb_alloc_coherent(xpad->udev, XPAD_PKT_LEN, | 556 | xpad->odata = usb_alloc_coherent(xpad->udev, XPAD_PKT_LEN, |
556 | GFP_KERNEL, &xpad->odata_dma); | 557 | GFP_KERNEL, &xpad->odata_dma); |
557 | if (!xpad->odata) { | 558 | if (!xpad->odata) { |
558 | error = -ENOMEM; | 559 | error = -ENOMEM; |
559 | goto fail1; | 560 | goto fail1; |
560 | } | 561 | } |
561 | 562 | ||
562 | mutex_init(&xpad->odata_mutex); | 563 | mutex_init(&xpad->odata_mutex); |
563 | 564 | ||
564 | xpad->irq_out = usb_alloc_urb(0, GFP_KERNEL); | 565 | xpad->irq_out = usb_alloc_urb(0, GFP_KERNEL); |
565 | if (!xpad->irq_out) { | 566 | if (!xpad->irq_out) { |
566 | error = -ENOMEM; | 567 | error = -ENOMEM; |
567 | goto fail2; | 568 | goto fail2; |
568 | } | 569 | } |
569 | 570 | ||
570 | ep_irq_out = &intf->cur_altsetting->endpoint[1].desc; | 571 | ep_irq_out = &intf->cur_altsetting->endpoint[1].desc; |
571 | usb_fill_int_urb(xpad->irq_out, xpad->udev, | 572 | usb_fill_int_urb(xpad->irq_out, xpad->udev, |
572 | usb_sndintpipe(xpad->udev, ep_irq_out->bEndpointAddress), | 573 | usb_sndintpipe(xpad->udev, ep_irq_out->bEndpointAddress), |
573 | xpad->odata, XPAD_PKT_LEN, | 574 | xpad->odata, XPAD_PKT_LEN, |
574 | xpad_irq_out, xpad, ep_irq_out->bInterval); | 575 | xpad_irq_out, xpad, ep_irq_out->bInterval); |
575 | xpad->irq_out->transfer_dma = xpad->odata_dma; | 576 | xpad->irq_out->transfer_dma = xpad->odata_dma; |
576 | xpad->irq_out->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | 577 | xpad->irq_out->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
577 | 578 | ||
578 | return 0; | 579 | return 0; |
579 | 580 | ||
580 | fail2: usb_free_coherent(xpad->udev, XPAD_PKT_LEN, xpad->odata, xpad->odata_dma); | 581 | fail2: usb_free_coherent(xpad->udev, XPAD_PKT_LEN, xpad->odata, xpad->odata_dma); |
581 | fail1: return error; | 582 | fail1: return error; |
582 | } | 583 | } |
583 | 584 | ||
584 | static void xpad_stop_output(struct usb_xpad *xpad) | 585 | static void xpad_stop_output(struct usb_xpad *xpad) |
585 | { | 586 | { |
586 | if (xpad->xtype != XTYPE_UNKNOWN) | 587 | if (xpad->xtype != XTYPE_UNKNOWN) |
587 | usb_kill_urb(xpad->irq_out); | 588 | usb_kill_urb(xpad->irq_out); |
588 | } | 589 | } |
589 | 590 | ||
590 | static void xpad_deinit_output(struct usb_xpad *xpad) | 591 | static void xpad_deinit_output(struct usb_xpad *xpad) |
591 | { | 592 | { |
592 | if (xpad->xtype != XTYPE_UNKNOWN) { | 593 | if (xpad->xtype != XTYPE_UNKNOWN) { |
593 | usb_free_urb(xpad->irq_out); | 594 | usb_free_urb(xpad->irq_out); |
594 | usb_free_coherent(xpad->udev, XPAD_PKT_LEN, | 595 | usb_free_coherent(xpad->udev, XPAD_PKT_LEN, |
595 | xpad->odata, xpad->odata_dma); | 596 | xpad->odata, xpad->odata_dma); |
596 | } | 597 | } |
597 | } | 598 | } |
598 | #else | 599 | #else |
599 | static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) { return 0; } | 600 | static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) { return 0; } |
600 | static void xpad_deinit_output(struct usb_xpad *xpad) {} | 601 | static void xpad_deinit_output(struct usb_xpad *xpad) {} |
601 | static void xpad_stop_output(struct usb_xpad *xpad) {} | 602 | static void xpad_stop_output(struct usb_xpad *xpad) {} |
602 | #endif | 603 | #endif |
603 | 604 | ||
604 | #ifdef CONFIG_JOYSTICK_XPAD_FF | 605 | #ifdef CONFIG_JOYSTICK_XPAD_FF |
605 | static int xpad_play_effect(struct input_dev *dev, void *data, struct ff_effect *effect) | 606 | static int xpad_play_effect(struct input_dev *dev, void *data, struct ff_effect *effect) |
606 | { | 607 | { |
607 | struct usb_xpad *xpad = input_get_drvdata(dev); | 608 | struct usb_xpad *xpad = input_get_drvdata(dev); |
608 | 609 | ||
609 | if (effect->type == FF_RUMBLE) { | 610 | if (effect->type == FF_RUMBLE) { |
610 | __u16 strong = effect->u.rumble.strong_magnitude; | 611 | __u16 strong = effect->u.rumble.strong_magnitude; |
611 | __u16 weak = effect->u.rumble.weak_magnitude; | 612 | __u16 weak = effect->u.rumble.weak_magnitude; |
612 | 613 | ||
613 | switch (xpad->xtype) { | 614 | switch (xpad->xtype) { |
614 | 615 | ||
615 | case XTYPE_XBOX: | 616 | case XTYPE_XBOX: |
616 | xpad->odata[0] = 0x00; | 617 | xpad->odata[0] = 0x00; |
617 | xpad->odata[1] = 0x06; | 618 | xpad->odata[1] = 0x06; |
618 | xpad->odata[2] = 0x00; | 619 | xpad->odata[2] = 0x00; |
619 | xpad->odata[3] = strong / 256; /* left actuator */ | 620 | xpad->odata[3] = strong / 256; /* left actuator */ |
620 | xpad->odata[4] = 0x00; | 621 | xpad->odata[4] = 0x00; |
621 | xpad->odata[5] = weak / 256; /* right actuator */ | 622 | xpad->odata[5] = weak / 256; /* right actuator */ |
622 | xpad->irq_out->transfer_buffer_length = 6; | 623 | xpad->irq_out->transfer_buffer_length = 6; |
623 | 624 | ||
624 | return usb_submit_urb(xpad->irq_out, GFP_ATOMIC); | 625 | return usb_submit_urb(xpad->irq_out, GFP_ATOMIC); |
625 | 626 | ||
626 | case XTYPE_XBOX360: | 627 | case XTYPE_XBOX360: |
627 | xpad->odata[0] = 0x00; | 628 | xpad->odata[0] = 0x00; |
628 | xpad->odata[1] = 0x08; | 629 | xpad->odata[1] = 0x08; |
629 | xpad->odata[2] = 0x00; | 630 | xpad->odata[2] = 0x00; |
630 | xpad->odata[3] = strong / 256; /* left actuator? */ | 631 | xpad->odata[3] = strong / 256; /* left actuator? */ |
631 | xpad->odata[4] = weak / 256; /* right actuator? */ | 632 | xpad->odata[4] = weak / 256; /* right actuator? */ |
632 | xpad->odata[5] = 0x00; | 633 | xpad->odata[5] = 0x00; |
633 | xpad->odata[6] = 0x00; | 634 | xpad->odata[6] = 0x00; |
634 | xpad->odata[7] = 0x00; | 635 | xpad->odata[7] = 0x00; |
635 | xpad->irq_out->transfer_buffer_length = 8; | 636 | xpad->irq_out->transfer_buffer_length = 8; |
636 | 637 | ||
637 | return usb_submit_urb(xpad->irq_out, GFP_ATOMIC); | 638 | return usb_submit_urb(xpad->irq_out, GFP_ATOMIC); |
638 | 639 | ||
639 | case XTYPE_XBOX360W: | 640 | case XTYPE_XBOX360W: |
640 | xpad->odata[0] = 0x00; | 641 | xpad->odata[0] = 0x00; |
641 | xpad->odata[1] = 0x01; | 642 | xpad->odata[1] = 0x01; |
642 | xpad->odata[2] = 0x0F; | 643 | xpad->odata[2] = 0x0F; |
643 | xpad->odata[3] = 0xC0; | 644 | xpad->odata[3] = 0xC0; |
644 | xpad->odata[4] = 0x00; | 645 | xpad->odata[4] = 0x00; |
645 | xpad->odata[5] = strong / 256; | 646 | xpad->odata[5] = strong / 256; |
646 | xpad->odata[6] = weak / 256; | 647 | xpad->odata[6] = weak / 256; |
647 | xpad->odata[7] = 0x00; | 648 | xpad->odata[7] = 0x00; |
648 | xpad->odata[8] = 0x00; | 649 | xpad->odata[8] = 0x00; |
649 | xpad->odata[9] = 0x00; | 650 | xpad->odata[9] = 0x00; |
650 | xpad->odata[10] = 0x00; | 651 | xpad->odata[10] = 0x00; |
651 | xpad->odata[11] = 0x00; | 652 | xpad->odata[11] = 0x00; |
652 | xpad->irq_out->transfer_buffer_length = 12; | 653 | xpad->irq_out->transfer_buffer_length = 12; |
653 | 654 | ||
654 | return usb_submit_urb(xpad->irq_out, GFP_ATOMIC); | 655 | return usb_submit_urb(xpad->irq_out, GFP_ATOMIC); |
655 | 656 | ||
656 | default: | 657 | default: |
657 | dbg("%s - rumble command sent to unsupported xpad type: %d", | 658 | dbg("%s - rumble command sent to unsupported xpad type: %d", |
658 | __func__, xpad->xtype); | 659 | __func__, xpad->xtype); |
659 | return -1; | 660 | return -1; |
660 | } | 661 | } |
661 | } | 662 | } |
662 | 663 | ||
663 | return 0; | 664 | return 0; |
664 | } | 665 | } |
665 | 666 | ||
666 | static int xpad_init_ff(struct usb_xpad *xpad) | 667 | static int xpad_init_ff(struct usb_xpad *xpad) |
667 | { | 668 | { |
668 | if (xpad->xtype == XTYPE_UNKNOWN) | 669 | if (xpad->xtype == XTYPE_UNKNOWN) |
669 | return 0; | 670 | return 0; |
670 | 671 | ||
671 | input_set_capability(xpad->dev, EV_FF, FF_RUMBLE); | 672 | input_set_capability(xpad->dev, EV_FF, FF_RUMBLE); |
672 | 673 | ||
673 | return input_ff_create_memless(xpad->dev, NULL, xpad_play_effect); | 674 | return input_ff_create_memless(xpad->dev, NULL, xpad_play_effect); |
674 | } | 675 | } |
675 | 676 | ||
676 | #else | 677 | #else |
677 | static int xpad_init_ff(struct usb_xpad *xpad) { return 0; } | 678 | static int xpad_init_ff(struct usb_xpad *xpad) { return 0; } |
678 | #endif | 679 | #endif |
679 | 680 | ||
680 | #if defined(CONFIG_JOYSTICK_XPAD_LEDS) | 681 | #if defined(CONFIG_JOYSTICK_XPAD_LEDS) |
681 | #include <linux/leds.h> | 682 | #include <linux/leds.h> |
682 | 683 | ||
683 | struct xpad_led { | 684 | struct xpad_led { |
684 | char name[16]; | 685 | char name[16]; |
685 | struct led_classdev led_cdev; | 686 | struct led_classdev led_cdev; |
686 | struct usb_xpad *xpad; | 687 | struct usb_xpad *xpad; |
687 | }; | 688 | }; |
688 | 689 | ||
689 | static void xpad_send_led_command(struct usb_xpad *xpad, int command) | 690 | static void xpad_send_led_command(struct usb_xpad *xpad, int command) |
690 | { | 691 | { |
691 | if (command >= 0 && command < 14) { | 692 | if (command >= 0 && command < 14) { |
692 | mutex_lock(&xpad->odata_mutex); | 693 | mutex_lock(&xpad->odata_mutex); |
693 | xpad->odata[0] = 0x01; | 694 | xpad->odata[0] = 0x01; |
694 | xpad->odata[1] = 0x03; | 695 | xpad->odata[1] = 0x03; |
695 | xpad->odata[2] = command; | 696 | xpad->odata[2] = command; |
696 | xpad->irq_out->transfer_buffer_length = 3; | 697 | xpad->irq_out->transfer_buffer_length = 3; |
697 | usb_submit_urb(xpad->irq_out, GFP_KERNEL); | 698 | usb_submit_urb(xpad->irq_out, GFP_KERNEL); |
698 | mutex_unlock(&xpad->odata_mutex); | 699 | mutex_unlock(&xpad->odata_mutex); |
699 | } | 700 | } |
700 | } | 701 | } |
701 | 702 | ||
702 | static void xpad_led_set(struct led_classdev *led_cdev, | 703 | static void xpad_led_set(struct led_classdev *led_cdev, |
703 | enum led_brightness value) | 704 | enum led_brightness value) |
704 | { | 705 | { |
705 | struct xpad_led *xpad_led = container_of(led_cdev, | 706 | struct xpad_led *xpad_led = container_of(led_cdev, |
706 | struct xpad_led, led_cdev); | 707 | struct xpad_led, led_cdev); |
707 | 708 | ||
708 | xpad_send_led_command(xpad_led->xpad, value); | 709 | xpad_send_led_command(xpad_led->xpad, value); |
709 | } | 710 | } |
710 | 711 | ||
711 | static int xpad_led_probe(struct usb_xpad *xpad) | 712 | static int xpad_led_probe(struct usb_xpad *xpad) |
712 | { | 713 | { |
713 | static atomic_t led_seq = ATOMIC_INIT(0); | 714 | static atomic_t led_seq = ATOMIC_INIT(0); |
714 | long led_no; | 715 | long led_no; |
715 | struct xpad_led *led; | 716 | struct xpad_led *led; |
716 | struct led_classdev *led_cdev; | 717 | struct led_classdev *led_cdev; |
717 | int error; | 718 | int error; |
718 | 719 | ||
719 | if (xpad->xtype != XTYPE_XBOX360) | 720 | if (xpad->xtype != XTYPE_XBOX360) |
720 | return 0; | 721 | return 0; |
721 | 722 | ||
722 | xpad->led = led = kzalloc(sizeof(struct xpad_led), GFP_KERNEL); | 723 | xpad->led = led = kzalloc(sizeof(struct xpad_led), GFP_KERNEL); |
723 | if (!led) | 724 | if (!led) |
724 | return -ENOMEM; | 725 | return -ENOMEM; |
725 | 726 | ||
726 | led_no = (long)atomic_inc_return(&led_seq) - 1; | 727 | led_no = (long)atomic_inc_return(&led_seq) - 1; |
727 | 728 | ||
728 | snprintf(led->name, sizeof(led->name), "xpad%ld", led_no); | 729 | snprintf(led->name, sizeof(led->name), "xpad%ld", led_no); |
729 | led->xpad = xpad; | 730 | led->xpad = xpad; |
730 | 731 | ||
731 | led_cdev = &led->led_cdev; | 732 | led_cdev = &led->led_cdev; |
732 | led_cdev->name = led->name; | 733 | led_cdev->name = led->name; |
733 | led_cdev->brightness_set = xpad_led_set; | 734 | led_cdev->brightness_set = xpad_led_set; |
734 | 735 | ||
735 | error = led_classdev_register(&xpad->udev->dev, led_cdev); | 736 | error = led_classdev_register(&xpad->udev->dev, led_cdev); |
736 | if (error) { | 737 | if (error) { |
737 | kfree(led); | 738 | kfree(led); |
738 | xpad->led = NULL; | 739 | xpad->led = NULL; |
739 | return error; | 740 | return error; |
740 | } | 741 | } |
741 | 742 | ||
742 | /* | 743 | /* |
743 | * Light up the segment corresponding to controller number | 744 | * Light up the segment corresponding to controller number |
744 | */ | 745 | */ |
745 | xpad_send_led_command(xpad, (led_no % 4) + 2); | 746 | xpad_send_led_command(xpad, (led_no % 4) + 2); |
746 | 747 | ||
747 | return 0; | 748 | return 0; |
748 | } | 749 | } |
749 | 750 | ||
750 | static void xpad_led_disconnect(struct usb_xpad *xpad) | 751 | static void xpad_led_disconnect(struct usb_xpad *xpad) |
751 | { | 752 | { |
752 | struct xpad_led *xpad_led = xpad->led; | 753 | struct xpad_led *xpad_led = xpad->led; |
753 | 754 | ||
754 | if (xpad_led) { | 755 | if (xpad_led) { |
755 | led_classdev_unregister(&xpad_led->led_cdev); | 756 | led_classdev_unregister(&xpad_led->led_cdev); |
756 | kfree(xpad_led); | 757 | kfree(xpad_led); |
757 | } | 758 | } |
758 | } | 759 | } |
759 | #else | 760 | #else |
760 | static int xpad_led_probe(struct usb_xpad *xpad) { return 0; } | 761 | static int xpad_led_probe(struct usb_xpad *xpad) { return 0; } |
761 | static void xpad_led_disconnect(struct usb_xpad *xpad) { } | 762 | static void xpad_led_disconnect(struct usb_xpad *xpad) { } |
762 | #endif | 763 | #endif |
763 | 764 | ||
764 | 765 | ||
765 | static int xpad_open(struct input_dev *dev) | 766 | static int xpad_open(struct input_dev *dev) |
766 | { | 767 | { |
767 | struct usb_xpad *xpad = input_get_drvdata(dev); | 768 | struct usb_xpad *xpad = input_get_drvdata(dev); |
768 | 769 | ||
769 | /* URB was submitted in probe */ | 770 | /* URB was submitted in probe */ |
770 | if(xpad->xtype == XTYPE_XBOX360W) | 771 | if(xpad->xtype == XTYPE_XBOX360W) |
771 | return 0; | 772 | return 0; |
772 | 773 | ||
773 | xpad->irq_in->dev = xpad->udev; | 774 | xpad->irq_in->dev = xpad->udev; |
774 | if (usb_submit_urb(xpad->irq_in, GFP_KERNEL)) | 775 | if (usb_submit_urb(xpad->irq_in, GFP_KERNEL)) |
775 | return -EIO; | 776 | return -EIO; |
776 | 777 | ||
777 | return 0; | 778 | return 0; |
778 | } | 779 | } |
779 | 780 | ||
780 | static void xpad_close(struct input_dev *dev) | 781 | static void xpad_close(struct input_dev *dev) |
781 | { | 782 | { |
782 | struct usb_xpad *xpad = input_get_drvdata(dev); | 783 | struct usb_xpad *xpad = input_get_drvdata(dev); |
783 | 784 | ||
784 | if (xpad->xtype != XTYPE_XBOX360W) | 785 | if (xpad->xtype != XTYPE_XBOX360W) |
785 | usb_kill_urb(xpad->irq_in); | 786 | usb_kill_urb(xpad->irq_in); |
786 | 787 | ||
787 | xpad_stop_output(xpad); | 788 | xpad_stop_output(xpad); |
788 | } | 789 | } |
789 | 790 | ||
790 | static void xpad_set_up_abs(struct input_dev *input_dev, signed short abs) | 791 | static void xpad_set_up_abs(struct input_dev *input_dev, signed short abs) |
791 | { | 792 | { |
792 | set_bit(abs, input_dev->absbit); | 793 | set_bit(abs, input_dev->absbit); |
793 | 794 | ||
794 | switch (abs) { | 795 | switch (abs) { |
795 | case ABS_X: | 796 | case ABS_X: |
796 | case ABS_Y: | 797 | case ABS_Y: |
797 | case ABS_RX: | 798 | case ABS_RX: |
798 | case ABS_RY: /* the two sticks */ | 799 | case ABS_RY: /* the two sticks */ |
799 | input_set_abs_params(input_dev, abs, -32768, 32767, 16, 128); | 800 | input_set_abs_params(input_dev, abs, -32768, 32767, 16, 128); |
800 | break; | 801 | break; |
801 | case ABS_Z: | 802 | case ABS_Z: |
802 | case ABS_RZ: /* the triggers (if mapped to axes) */ | 803 | case ABS_RZ: /* the triggers (if mapped to axes) */ |
803 | input_set_abs_params(input_dev, abs, 0, 255, 0, 0); | 804 | input_set_abs_params(input_dev, abs, 0, 255, 0, 0); |
804 | break; | 805 | break; |
805 | case ABS_HAT0X: | 806 | case ABS_HAT0X: |
806 | case ABS_HAT0Y: /* the d-pad (only if dpad is mapped to axes */ | 807 | case ABS_HAT0Y: /* the d-pad (only if dpad is mapped to axes */ |
807 | input_set_abs_params(input_dev, abs, -1, 1, 0, 0); | 808 | input_set_abs_params(input_dev, abs, -1, 1, 0, 0); |
808 | break; | 809 | break; |
809 | } | 810 | } |
810 | } | 811 | } |
811 | 812 | ||
812 | static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id) | 813 | static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id) |
813 | { | 814 | { |
814 | struct usb_device *udev = interface_to_usbdev(intf); | 815 | struct usb_device *udev = interface_to_usbdev(intf); |
815 | struct usb_xpad *xpad; | 816 | struct usb_xpad *xpad; |
816 | struct input_dev *input_dev; | 817 | struct input_dev *input_dev; |
817 | struct usb_endpoint_descriptor *ep_irq_in; | 818 | struct usb_endpoint_descriptor *ep_irq_in; |
818 | int i, error; | 819 | int i, error; |
819 | 820 | ||
820 | for (i = 0; xpad_device[i].idVendor; i++) { | 821 | for (i = 0; xpad_device[i].idVendor; i++) { |
821 | if ((le16_to_cpu(udev->descriptor.idVendor) == xpad_device[i].idVendor) && | 822 | if ((le16_to_cpu(udev->descriptor.idVendor) == xpad_device[i].idVendor) && |
822 | (le16_to_cpu(udev->descriptor.idProduct) == xpad_device[i].idProduct)) | 823 | (le16_to_cpu(udev->descriptor.idProduct) == xpad_device[i].idProduct)) |
823 | break; | 824 | break; |
824 | } | 825 | } |
825 | 826 | ||
826 | xpad = kzalloc(sizeof(struct usb_xpad), GFP_KERNEL); | 827 | xpad = kzalloc(sizeof(struct usb_xpad), GFP_KERNEL); |
827 | input_dev = input_allocate_device(); | 828 | input_dev = input_allocate_device(); |
828 | if (!xpad || !input_dev) { | 829 | if (!xpad || !input_dev) { |
829 | error = -ENOMEM; | 830 | error = -ENOMEM; |
830 | goto fail1; | 831 | goto fail1; |
831 | } | 832 | } |
832 | 833 | ||
833 | xpad->idata = usb_alloc_coherent(udev, XPAD_PKT_LEN, | 834 | xpad->idata = usb_alloc_coherent(udev, XPAD_PKT_LEN, |
834 | GFP_KERNEL, &xpad->idata_dma); | 835 | GFP_KERNEL, &xpad->idata_dma); |
835 | if (!xpad->idata) { | 836 | if (!xpad->idata) { |
836 | error = -ENOMEM; | 837 | error = -ENOMEM; |
837 | goto fail1; | 838 | goto fail1; |
838 | } | 839 | } |
839 | 840 | ||
840 | xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL); | 841 | xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL); |
841 | if (!xpad->irq_in) { | 842 | if (!xpad->irq_in) { |
842 | error = -ENOMEM; | 843 | error = -ENOMEM; |
843 | goto fail2; | 844 | goto fail2; |
844 | } | 845 | } |
845 | 846 | ||
846 | xpad->udev = udev; | 847 | xpad->udev = udev; |
847 | xpad->mapping = xpad_device[i].mapping; | 848 | xpad->mapping = xpad_device[i].mapping; |
848 | xpad->xtype = xpad_device[i].xtype; | 849 | xpad->xtype = xpad_device[i].xtype; |
849 | 850 | ||
850 | if (xpad->xtype == XTYPE_UNKNOWN) { | 851 | if (xpad->xtype == XTYPE_UNKNOWN) { |
851 | if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) { | 852 | if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) { |
852 | if (intf->cur_altsetting->desc.bInterfaceProtocol == 129) | 853 | if (intf->cur_altsetting->desc.bInterfaceProtocol == 129) |
853 | xpad->xtype = XTYPE_XBOX360W; | 854 | xpad->xtype = XTYPE_XBOX360W; |
854 | else | 855 | else |
855 | xpad->xtype = XTYPE_XBOX360; | 856 | xpad->xtype = XTYPE_XBOX360; |
856 | } else | 857 | } else |
857 | xpad->xtype = XTYPE_XBOX; | 858 | xpad->xtype = XTYPE_XBOX; |
858 | 859 | ||
859 | if (dpad_to_buttons) | 860 | if (dpad_to_buttons) |
860 | xpad->mapping |= MAP_DPAD_TO_BUTTONS; | 861 | xpad->mapping |= MAP_DPAD_TO_BUTTONS; |
861 | if (triggers_to_buttons) | 862 | if (triggers_to_buttons) |
862 | xpad->mapping |= MAP_TRIGGERS_TO_BUTTONS; | 863 | xpad->mapping |= MAP_TRIGGERS_TO_BUTTONS; |
863 | if (sticks_to_null) | 864 | if (sticks_to_null) |
864 | xpad->mapping |= MAP_STICKS_TO_NULL; | 865 | xpad->mapping |= MAP_STICKS_TO_NULL; |
865 | } | 866 | } |
866 | 867 | ||
867 | xpad->dev = input_dev; | 868 | xpad->dev = input_dev; |
868 | usb_make_path(udev, xpad->phys, sizeof(xpad->phys)); | 869 | usb_make_path(udev, xpad->phys, sizeof(xpad->phys)); |
869 | strlcat(xpad->phys, "/input0", sizeof(xpad->phys)); | 870 | strlcat(xpad->phys, "/input0", sizeof(xpad->phys)); |
870 | 871 | ||
871 | input_dev->name = xpad_device[i].name; | 872 | input_dev->name = xpad_device[i].name; |
872 | input_dev->phys = xpad->phys; | 873 | input_dev->phys = xpad->phys; |
873 | usb_to_input_id(udev, &input_dev->id); | 874 | usb_to_input_id(udev, &input_dev->id); |
874 | input_dev->dev.parent = &intf->dev; | 875 | input_dev->dev.parent = &intf->dev; |
875 | 876 | ||
876 | input_set_drvdata(input_dev, xpad); | 877 | input_set_drvdata(input_dev, xpad); |
877 | 878 | ||
878 | input_dev->open = xpad_open; | 879 | input_dev->open = xpad_open; |
879 | input_dev->close = xpad_close; | 880 | input_dev->close = xpad_close; |
880 | 881 | ||
881 | input_dev->evbit[0] = BIT_MASK(EV_KEY); | 882 | input_dev->evbit[0] = BIT_MASK(EV_KEY); |
882 | 883 | ||
883 | if (!(xpad->mapping & MAP_STICKS_TO_NULL)) { | 884 | if (!(xpad->mapping & MAP_STICKS_TO_NULL)) { |
884 | input_dev->evbit[0] |= BIT_MASK(EV_ABS); | 885 | input_dev->evbit[0] |= BIT_MASK(EV_ABS); |
885 | /* set up axes */ | 886 | /* set up axes */ |
886 | for (i = 0; xpad_abs[i] >= 0; i++) | 887 | for (i = 0; xpad_abs[i] >= 0; i++) |
887 | xpad_set_up_abs(input_dev, xpad_abs[i]); | 888 | xpad_set_up_abs(input_dev, xpad_abs[i]); |
888 | } | 889 | } |
889 | 890 | ||
890 | /* set up standard buttons */ | 891 | /* set up standard buttons */ |
891 | for (i = 0; xpad_common_btn[i] >= 0; i++) | 892 | for (i = 0; xpad_common_btn[i] >= 0; i++) |
892 | __set_bit(xpad_common_btn[i], input_dev->keybit); | 893 | __set_bit(xpad_common_btn[i], input_dev->keybit); |
893 | 894 | ||
894 | /* set up model-specific ones */ | 895 | /* set up model-specific ones */ |
895 | if (xpad->xtype == XTYPE_XBOX360 || xpad->xtype == XTYPE_XBOX360W) { | 896 | if (xpad->xtype == XTYPE_XBOX360 || xpad->xtype == XTYPE_XBOX360W) { |
896 | for (i = 0; xpad360_btn[i] >= 0; i++) | 897 | for (i = 0; xpad360_btn[i] >= 0; i++) |
897 | __set_bit(xpad360_btn[i], input_dev->keybit); | 898 | __set_bit(xpad360_btn[i], input_dev->keybit); |
898 | } else { | 899 | } else { |
899 | for (i = 0; xpad_btn[i] >= 0; i++) | 900 | for (i = 0; xpad_btn[i] >= 0; i++) |
900 | __set_bit(xpad_btn[i], input_dev->keybit); | 901 | __set_bit(xpad_btn[i], input_dev->keybit); |
901 | } | 902 | } |
902 | 903 | ||
903 | if (xpad->mapping & MAP_DPAD_TO_BUTTONS) { | 904 | if (xpad->mapping & MAP_DPAD_TO_BUTTONS) { |
904 | for (i = 0; xpad_btn_pad[i] >= 0; i++) | 905 | for (i = 0; xpad_btn_pad[i] >= 0; i++) |
905 | __set_bit(xpad_btn_pad[i], input_dev->keybit); | 906 | __set_bit(xpad_btn_pad[i], input_dev->keybit); |
906 | } else { | 907 | } else { |
907 | for (i = 0; xpad_abs_pad[i] >= 0; i++) | 908 | for (i = 0; xpad_abs_pad[i] >= 0; i++) |
908 | xpad_set_up_abs(input_dev, xpad_abs_pad[i]); | 909 | xpad_set_up_abs(input_dev, xpad_abs_pad[i]); |
909 | } | 910 | } |
910 | 911 | ||
911 | if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) { | 912 | if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) { |
912 | for (i = 0; xpad_btn_triggers[i] >= 0; i++) | 913 | for (i = 0; xpad_btn_triggers[i] >= 0; i++) |
913 | __set_bit(xpad_btn_triggers[i], input_dev->keybit); | 914 | __set_bit(xpad_btn_triggers[i], input_dev->keybit); |
914 | } else { | 915 | } else { |
915 | for (i = 0; xpad_abs_triggers[i] >= 0; i++) | 916 | for (i = 0; xpad_abs_triggers[i] >= 0; i++) |
916 | xpad_set_up_abs(input_dev, xpad_abs_triggers[i]); | 917 | xpad_set_up_abs(input_dev, xpad_abs_triggers[i]); |
917 | } | 918 | } |
918 | 919 | ||
919 | error = xpad_init_output(intf, xpad); | 920 | error = xpad_init_output(intf, xpad); |
920 | if (error) | 921 | if (error) |
921 | goto fail3; | 922 | goto fail3; |
922 | 923 | ||
923 | error = xpad_init_ff(xpad); | 924 | error = xpad_init_ff(xpad); |
924 | if (error) | 925 | if (error) |
925 | goto fail4; | 926 | goto fail4; |
926 | 927 | ||
927 | error = xpad_led_probe(xpad); | 928 | error = xpad_led_probe(xpad); |
928 | if (error) | 929 | if (error) |
929 | goto fail5; | 930 | goto fail5; |
930 | 931 | ||
931 | ep_irq_in = &intf->cur_altsetting->endpoint[0].desc; | 932 | ep_irq_in = &intf->cur_altsetting->endpoint[0].desc; |
932 | usb_fill_int_urb(xpad->irq_in, udev, | 933 | usb_fill_int_urb(xpad->irq_in, udev, |
933 | usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress), | 934 | usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress), |
934 | xpad->idata, XPAD_PKT_LEN, xpad_irq_in, | 935 | xpad->idata, XPAD_PKT_LEN, xpad_irq_in, |
935 | xpad, ep_irq_in->bInterval); | 936 | xpad, ep_irq_in->bInterval); |
936 | xpad->irq_in->transfer_dma = xpad->idata_dma; | 937 | xpad->irq_in->transfer_dma = xpad->idata_dma; |
937 | xpad->irq_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | 938 | xpad->irq_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
938 | 939 | ||
939 | error = input_register_device(xpad->dev); | 940 | error = input_register_device(xpad->dev); |
940 | if (error) | 941 | if (error) |
941 | goto fail6; | 942 | goto fail6; |
942 | 943 | ||
943 | usb_set_intfdata(intf, xpad); | 944 | usb_set_intfdata(intf, xpad); |
944 | 945 | ||
945 | if (xpad->xtype == XTYPE_XBOX360W) { | 946 | if (xpad->xtype == XTYPE_XBOX360W) { |
946 | /* | 947 | /* |
947 | * Setup the message to set the LEDs on the | 948 | * Setup the message to set the LEDs on the |
948 | * controller when it shows up | 949 | * controller when it shows up |
949 | */ | 950 | */ |
950 | xpad->bulk_out = usb_alloc_urb(0, GFP_KERNEL); | 951 | xpad->bulk_out = usb_alloc_urb(0, GFP_KERNEL); |
951 | if (!xpad->bulk_out) { | 952 | if (!xpad->bulk_out) { |
952 | error = -ENOMEM; | 953 | error = -ENOMEM; |
953 | goto fail7; | 954 | goto fail7; |
954 | } | 955 | } |
955 | 956 | ||
956 | xpad->bdata = kzalloc(XPAD_PKT_LEN, GFP_KERNEL); | 957 | xpad->bdata = kzalloc(XPAD_PKT_LEN, GFP_KERNEL); |
957 | if (!xpad->bdata) { | 958 | if (!xpad->bdata) { |
958 | error = -ENOMEM; | 959 | error = -ENOMEM; |
959 | goto fail8; | 960 | goto fail8; |
960 | } | 961 | } |
961 | 962 | ||
962 | xpad->bdata[2] = 0x08; | 963 | xpad->bdata[2] = 0x08; |
963 | switch (intf->cur_altsetting->desc.bInterfaceNumber) { | 964 | switch (intf->cur_altsetting->desc.bInterfaceNumber) { |
964 | case 0: | 965 | case 0: |
965 | xpad->bdata[3] = 0x42; | 966 | xpad->bdata[3] = 0x42; |
966 | break; | 967 | break; |
967 | case 2: | 968 | case 2: |
968 | xpad->bdata[3] = 0x43; | 969 | xpad->bdata[3] = 0x43; |
969 | break; | 970 | break; |
970 | case 4: | 971 | case 4: |
971 | xpad->bdata[3] = 0x44; | 972 | xpad->bdata[3] = 0x44; |
972 | break; | 973 | break; |
973 | case 6: | 974 | case 6: |
974 | xpad->bdata[3] = 0x45; | 975 | xpad->bdata[3] = 0x45; |
975 | } | 976 | } |
976 | 977 | ||
977 | ep_irq_in = &intf->cur_altsetting->endpoint[1].desc; | 978 | ep_irq_in = &intf->cur_altsetting->endpoint[1].desc; |
978 | usb_fill_bulk_urb(xpad->bulk_out, udev, | 979 | usb_fill_bulk_urb(xpad->bulk_out, udev, |
979 | usb_sndbulkpipe(udev, ep_irq_in->bEndpointAddress), | 980 | usb_sndbulkpipe(udev, ep_irq_in->bEndpointAddress), |
980 | xpad->bdata, XPAD_PKT_LEN, xpad_bulk_out, xpad); | 981 | xpad->bdata, XPAD_PKT_LEN, xpad_bulk_out, xpad); |
981 | 982 | ||
982 | /* | 983 | /* |
983 | * Submit the int URB immediately rather than waiting for open | 984 | * Submit the int URB immediately rather than waiting for open |
984 | * because we get status messages from the device whether | 985 | * because we get status messages from the device whether |
985 | * or not any controllers are attached. In fact, it's | 986 | * or not any controllers are attached. In fact, it's |
986 | * exactly the message that a controller has arrived that | 987 | * exactly the message that a controller has arrived that |
987 | * we're waiting for. | 988 | * we're waiting for. |
988 | */ | 989 | */ |
989 | xpad->irq_in->dev = xpad->udev; | 990 | xpad->irq_in->dev = xpad->udev; |
990 | error = usb_submit_urb(xpad->irq_in, GFP_KERNEL); | 991 | error = usb_submit_urb(xpad->irq_in, GFP_KERNEL); |
991 | if (error) | 992 | if (error) |
992 | goto fail9; | 993 | goto fail9; |
993 | } | 994 | } |
994 | 995 | ||
995 | return 0; | 996 | return 0; |
996 | 997 | ||
997 | fail9: kfree(xpad->bdata); | 998 | fail9: kfree(xpad->bdata); |
998 | fail8: usb_free_urb(xpad->bulk_out); | 999 | fail8: usb_free_urb(xpad->bulk_out); |
999 | fail7: input_unregister_device(input_dev); | 1000 | fail7: input_unregister_device(input_dev); |
1000 | input_dev = NULL; | 1001 | input_dev = NULL; |
1001 | fail6: xpad_led_disconnect(xpad); | 1002 | fail6: xpad_led_disconnect(xpad); |
1002 | fail5: if (input_dev) | 1003 | fail5: if (input_dev) |
1003 | input_ff_destroy(input_dev); | 1004 | input_ff_destroy(input_dev); |
1004 | fail4: xpad_deinit_output(xpad); | 1005 | fail4: xpad_deinit_output(xpad); |
1005 | fail3: usb_free_urb(xpad->irq_in); | 1006 | fail3: usb_free_urb(xpad->irq_in); |
1006 | fail2: usb_free_coherent(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma); | 1007 | fail2: usb_free_coherent(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma); |
1007 | fail1: input_free_device(input_dev); | 1008 | fail1: input_free_device(input_dev); |
1008 | kfree(xpad); | 1009 | kfree(xpad); |
1009 | return error; | 1010 | return error; |
1010 | 1011 | ||
1011 | } | 1012 | } |
1012 | 1013 | ||
1013 | static void xpad_disconnect(struct usb_interface *intf) | 1014 | static void xpad_disconnect(struct usb_interface *intf) |
1014 | { | 1015 | { |
1015 | struct usb_xpad *xpad = usb_get_intfdata (intf); | 1016 | struct usb_xpad *xpad = usb_get_intfdata (intf); |
1016 | 1017 | ||
1017 | xpad_led_disconnect(xpad); | 1018 | xpad_led_disconnect(xpad); |
1018 | input_unregister_device(xpad->dev); | 1019 | input_unregister_device(xpad->dev); |
1019 | xpad_deinit_output(xpad); | 1020 | xpad_deinit_output(xpad); |
1020 | 1021 | ||
1021 | if (xpad->xtype == XTYPE_XBOX360W) { | 1022 | if (xpad->xtype == XTYPE_XBOX360W) { |
1022 | usb_kill_urb(xpad->bulk_out); | 1023 | usb_kill_urb(xpad->bulk_out); |
1023 | usb_free_urb(xpad->bulk_out); | 1024 | usb_free_urb(xpad->bulk_out); |
1024 | usb_kill_urb(xpad->irq_in); | 1025 | usb_kill_urb(xpad->irq_in); |
1025 | } | 1026 | } |
1026 | 1027 | ||
1027 | usb_free_urb(xpad->irq_in); | 1028 | usb_free_urb(xpad->irq_in); |
1028 | usb_free_coherent(xpad->udev, XPAD_PKT_LEN, | 1029 | usb_free_coherent(xpad->udev, XPAD_PKT_LEN, |
1029 | xpad->idata, xpad->idata_dma); | 1030 | xpad->idata, xpad->idata_dma); |
1030 | 1031 | ||
1031 | kfree(xpad->bdata); | 1032 | kfree(xpad->bdata); |
1032 | kfree(xpad); | 1033 | kfree(xpad); |
1033 | 1034 | ||
1034 | usb_set_intfdata(intf, NULL); | 1035 | usb_set_intfdata(intf, NULL); |
1035 | } | 1036 | } |
1036 | 1037 | ||
1037 | static struct usb_driver xpad_driver = { | 1038 | static struct usb_driver xpad_driver = { |
1038 | .name = "xpad", | 1039 | .name = "xpad", |
1039 | .probe = xpad_probe, | 1040 | .probe = xpad_probe, |
1040 | .disconnect = xpad_disconnect, | 1041 | .disconnect = xpad_disconnect, |
1041 | .id_table = xpad_table, | 1042 | .id_table = xpad_table, |
1042 | }; | 1043 | }; |
1043 | 1044 | ||
1044 | module_usb_driver(xpad_driver); | 1045 | module_usb_driver(xpad_driver); |
1045 | 1046 | ||
1046 | MODULE_AUTHOR(DRIVER_AUTHOR); | 1047 | MODULE_AUTHOR(DRIVER_AUTHOR); |
1047 | MODULE_DESCRIPTION(DRIVER_DESC); | 1048 | MODULE_DESCRIPTION(DRIVER_DESC); |
1048 | MODULE_LICENSE("GPL"); | 1049 | MODULE_LICENSE("GPL"); |
1049 | 1050 |