1
2
3
4
5
6
7
8
9
10
11
12
13#include <linux/device.h>
14#include <linux/hid.h>
15#include <linux/module.h>
16
17#include "hid-ids.h"
18
19
20#define EASYPEN_I405X_RDESC_ORIG_SIZE 476
21
22
23static __u8 easypen_i405x_rdesc_fixed[] = {
24 0x06, 0x00, 0xFF,
25 0x09, 0x01,
26 0xA1, 0x01,
27 0x85, 0x05,
28 0x09, 0x01,
29 0x15, 0x80,
30 0x25, 0x7F,
31 0x75, 0x08,
32 0x95, 0x07,
33 0xB1, 0x02,
34 0xC0,
35 0x05, 0x0D,
36 0x09, 0x02,
37 0xA1, 0x01,
38 0x85, 0x10,
39 0x09, 0x20,
40 0xA0,
41 0x14,
42 0x25, 0x01,
43 0x75, 0x01,
44 0x09, 0x42,
45 0x09, 0x44,
46 0x09, 0x46,
47 0x95, 0x03,
48 0x81, 0x02,
49 0x95, 0x04,
50 0x81, 0x03,
51 0x09, 0x32,
52 0x95, 0x01,
53 0x81, 0x02,
54 0x75, 0x10,
55 0x95, 0x01,
56 0xA4,
57 0x05, 0x01,
58 0x55, 0xFD,
59 0x65, 0x13,
60 0x34,
61 0x09, 0x30,
62 0x46, 0x7C, 0x15,
63 0x26, 0x00, 0x37,
64 0x81, 0x02,
65 0x09, 0x31,
66 0x46, 0xA0, 0x0F,
67 0x26, 0x00, 0x28,
68 0x81, 0x02,
69 0xB4,
70 0x09, 0x30,
71 0x26, 0xFF, 0x03,
72 0x81, 0x02,
73 0xC0,
74 0xC0
75};
76
77
78#define MOUSEPEN_I608X_RDESC_ORIG_SIZE 476
79
80
81static __u8 mousepen_i608x_rdesc_fixed[] = {
82 0x06, 0x00, 0xFF,
83 0x09, 0x01,
84 0xA1, 0x01,
85 0x85, 0x05,
86 0x09, 0x01,
87 0x15, 0x80,
88 0x25, 0x7F,
89 0x75, 0x08,
90 0x95, 0x07,
91 0xB1, 0x02,
92 0xC0,
93 0x05, 0x0D,
94 0x09, 0x02,
95 0xA1, 0x01,
96 0x85, 0x10,
97 0x09, 0x20,
98 0xA0,
99 0x14,
100 0x25, 0x01,
101 0x75, 0x01,
102 0x09, 0x42,
103 0x09, 0x44,
104 0x09, 0x46,
105 0x95, 0x03,
106 0x81, 0x02,
107 0x95, 0x04,
108 0x81, 0x03,
109 0x09, 0x32,
110 0x95, 0x01,
111 0x81, 0x02,
112 0x75, 0x10,
113 0x95, 0x01,
114 0xA4,
115 0x05, 0x01,
116 0x55, 0xFD,
117 0x65, 0x13,
118 0x34,
119 0x09, 0x30,
120 0x46, 0x40, 0x1F,
121 0x26, 0x00, 0x50,
122 0x81, 0x02,
123 0x09, 0x31,
124 0x46, 0x70, 0x17,
125 0x26, 0x00, 0x3C,
126 0x81, 0x02,
127 0xB4,
128 0x09, 0x30,
129 0x26, 0xFF, 0x03,
130 0x81, 0x02,
131 0xC0,
132 0xC0,
133 0x05, 0x01,
134 0x09, 0x02,
135 0xA1, 0x01,
136 0x85, 0x11,
137 0x09, 0x01,
138 0xA0,
139 0x14,
140 0xA4,
141 0x05, 0x09,
142 0x75, 0x01,
143 0x19, 0x01,
144 0x29, 0x03,
145 0x25, 0x01,
146 0x95, 0x03,
147 0x81, 0x02,
148 0x95, 0x05,
149 0x81, 0x01,
150 0xB4,
151 0x95, 0x01,
152 0xA4,
153 0x55, 0xFD,
154 0x65, 0x13,
155 0x34,
156 0x75, 0x10,
157 0x09, 0x30,
158 0x46, 0x40, 0x1F,
159 0x26, 0x00, 0x50,
160 0x81, 0x02,
161 0x09, 0x31,
162 0x46, 0x70, 0x17,
163 0x26, 0x00, 0x3C,
164 0x81, 0x02,
165 0xB4,
166 0x75, 0x08,
167 0x09, 0x38,
168 0x15, 0xFF,
169 0x25, 0x01,
170 0x81, 0x06,
171 0x81, 0x01,
172 0xC0,
173 0xC0
174};
175
176
177#define MOUSEPEN_I608X_V2_RDESC_ORIG_SIZE 482
178
179
180static __u8 mousepen_i608x_v2_rdesc_fixed[] = {
181 0x06, 0x00, 0xFF,
182 0x09, 0x01,
183 0xA1, 0x01,
184 0x85, 0x05,
185 0x09, 0x01,
186 0x15, 0x80,
187 0x25, 0x7F,
188 0x75, 0x08,
189 0x95, 0x07,
190 0xB1, 0x02,
191 0xC0,
192 0x05, 0x0D,
193 0x09, 0x02,
194 0xA1, 0x01,
195 0x85, 0x10,
196 0x09, 0x20,
197 0xA0,
198 0x14,
199 0x25, 0x01,
200 0x75, 0x01,
201 0x09, 0x42,
202 0x09, 0x44,
203 0x09, 0x46,
204 0x95, 0x03,
205 0x81, 0x02,
206 0x95, 0x04,
207 0x81, 0x03,
208 0x09, 0x32,
209 0x95, 0x01,
210 0x81, 0x02,
211 0x75, 0x10,
212 0x95, 0x01,
213 0xA4,
214 0x05, 0x01,
215 0x55, 0xFD,
216 0x65, 0x13,
217 0x34,
218 0x09, 0x30,
219 0x46, 0x40, 0x1F,
220 0x27, 0x00, 0xA0, 0x00, 0x00,
221 0x81, 0x02,
222 0x09, 0x31,
223 0x46, 0x70, 0x17,
224 0x26, 0x00, 0x78,
225 0x81, 0x02,
226 0xB4,
227 0x09, 0x30,
228 0x26, 0xFF, 0x07,
229 0x81, 0x02,
230 0xC0,
231 0xC0,
232 0x05, 0x01,
233 0x09, 0x02,
234 0xA1, 0x01,
235 0x85, 0x11,
236 0x09, 0x01,
237 0xA0,
238 0x14,
239 0xA4,
240 0x05, 0x09,
241 0x75, 0x01,
242 0x19, 0x01,
243 0x29, 0x03,
244 0x25, 0x01,
245 0x95, 0x03,
246 0x81, 0x02,
247 0x95, 0x05,
248 0x81, 0x01,
249 0xB4,
250 0x95, 0x01,
251 0xA4,
252 0x55, 0xFD,
253 0x65, 0x13,
254 0x34,
255 0x75, 0x10,
256 0x09, 0x30,
257 0x46, 0x40, 0x1F,
258 0x27, 0x00, 0xA0, 0x00, 0x00,
259 0x81, 0x02,
260 0x09, 0x31,
261 0x46, 0x70, 0x17,
262 0x26, 0x00, 0x78,
263 0x81, 0x02,
264 0xB4,
265 0x75, 0x08,
266 0x09, 0x38,
267 0x15, 0xFF,
268 0x25, 0x01,
269 0x81, 0x06,
270 0x81, 0x01,
271 0xC0,
272 0xC0
273};
274
275
276#define EASYPEN_M610X_RDESC_ORIG_SIZE 476
277
278
279static __u8 easypen_m610x_rdesc_fixed[] = {
280 0x06, 0x00, 0xFF,
281 0x09, 0x01,
282 0xA1, 0x01,
283 0x85, 0x05,
284 0x09, 0x01,
285 0x15, 0x80,
286 0x25, 0x7F,
287 0x75, 0x08,
288 0x95, 0x07,
289 0xB1, 0x02,
290 0xC0,
291 0x05, 0x0D,
292 0x09, 0x02,
293 0xA1, 0x01,
294 0x85, 0x10,
295 0x09, 0x20,
296 0xA0,
297 0x14,
298 0x25, 0x01,
299 0x75, 0x01,
300 0x09, 0x42,
301 0x09, 0x44,
302 0x09, 0x46,
303 0x95, 0x03,
304 0x81, 0x02,
305 0x95, 0x04,
306 0x81, 0x03,
307 0x09, 0x32,
308 0x95, 0x01,
309 0x81, 0x02,
310 0x75, 0x10,
311 0x95, 0x01,
312 0xA4,
313 0x05, 0x01,
314 0x55, 0xFD,
315 0x65, 0x13,
316 0x34,
317 0x09, 0x30,
318 0x46, 0x10, 0x27,
319 0x27, 0x00, 0xA0, 0x00, 0x00,
320 0x81, 0x02,
321 0x09, 0x31,
322 0x46, 0x6A, 0x18,
323 0x26, 0x00, 0x64,
324 0x81, 0x02,
325 0xB4,
326 0x09, 0x30,
327 0x26, 0xFF, 0x03,
328 0x81, 0x02,
329 0xC0,
330 0xC0,
331 0x05, 0x0C,
332 0x09, 0x01,
333 0xA1, 0x01,
334 0x85, 0x12,
335 0x14,
336 0x25, 0x01,
337 0x75, 0x01,
338 0x95, 0x04,
339 0x0A, 0x1A, 0x02,
340 0x0A, 0x79, 0x02,
341 0x0A, 0x2D, 0x02,
342 0x0A, 0x2E, 0x02,
343 0x81, 0x02,
344 0x95, 0x01,
345 0x75, 0x14,
346 0x81, 0x03,
347 0x75, 0x20,
348 0x81, 0x03,
349 0xC0
350};
351
352
353
354#define PENSKETCH_M912_RDESC_ORIG_SIZE 482
355
356
357static __u8 pensketch_m912_rdesc_fixed[] = {
358 0x05, 0x01,
359 0x08,
360 0xA1, 0x01,
361 0x85, 0x05,
362 0x06, 0x00, 0xFF,
363 0x09, 0x01,
364 0x15, 0x81,
365 0x25, 0x7F,
366 0x75, 0x08,
367 0x95, 0x07,
368 0xB1, 0x02,
369 0xC0,
370 0x05, 0x0D,
371 0x09, 0x02,
372 0xA1, 0x01,
373 0x85, 0x10,
374 0x09, 0x20,
375 0xA0,
376 0x09, 0x42,
377 0x09, 0x44,
378 0x09, 0x46,
379 0x14,
380 0x25, 0x01,
381 0x75, 0x01,
382 0x95, 0x03,
383 0x81, 0x02,
384 0x95, 0x04,
385 0x81, 0x03,
386 0x09, 0x32,
387 0x95, 0x01,
388 0x81, 0x02,
389 0x75, 0x10,
390 0x95, 0x01,
391 0xA4,
392 0x05, 0x01,
393 0x55, 0xFD,
394 0x65, 0x13,
395 0x14,
396 0x34,
397 0x09, 0x30,
398 0x27, 0x00, 0xF0, 0x00, 0x00,
399 0x46, 0xE0, 0x2E,
400 0x81, 0x02,
401 0x09, 0x31,
402 0x27, 0x00, 0xB4, 0x00, 0x00,
403 0x46, 0x28, 0x23,
404 0x81, 0x02,
405 0xB4,
406 0x09, 0x30,
407 0x14,
408 0x26, 0xFF, 0x07,
409 0x81, 0x02,
410 0xC0,
411 0xC0,
412 0x05, 0x0D,
413 0x09, 0x21,
414 0xA1, 0x01,
415 0x85, 0x11,
416 0x09, 0x21,
417 0xA0,
418 0x05, 0x09,
419 0x75, 0x01,
420 0x19, 0x01,
421 0x29, 0x03,
422 0x14,
423 0x25, 0x01,
424 0x95, 0x03,
425 0x81, 0x02,
426 0x95, 0x04,
427 0x81, 0x01,
428 0x95, 0x01,
429 0x0B, 0x32, 0x00, 0x0D, 0x00,
430 0x14,
431 0x25, 0x01,
432 0x81, 0x02,
433 0xA4,
434 0x05, 0x01,
435 0x75, 0x10,
436 0x95, 0x01,
437 0x55, 0xFD,
438 0x65, 0x13,
439 0x14,
440 0x34,
441 0x09, 0x30,
442 0x27, 0x00, 0xF0, 0x00, 0x00,
443 0x46, 0xE0, 0x2E,
444 0x81, 0x02,
445 0x09, 0x31,
446 0x27, 0x00, 0xB4, 0x00, 0x00,
447 0x46, 0x28, 0x23,
448 0x81, 0x02,
449 0x09, 0x38,
450 0x75, 0x08,
451 0x95, 0x01,
452 0x15, 0xFF,
453 0x25, 0x01,
454 0x34,
455 0x44,
456 0x81, 0x06,
457 0xB4,
458 0xC0,
459 0xC0,
460 0x05, 0x0C,
461 0x09, 0x01,
462 0xA1, 0x01,
463 0x85, 0x12,
464 0x14,
465 0x25, 0x01,
466 0x75, 0x01,
467 0x95, 0x08,
468 0x05, 0x0C,
469 0x0A, 0x6A, 0x02,
470 0x0A, 0x1A, 0x02,
471 0x0A, 0x01, 0x02,
472 0x0A, 0x2F, 0x02,
473 0x0A, 0x25, 0x02,
474 0x0A, 0x24, 0x02,
475 0x0A, 0x2D, 0x02,
476 0x0A, 0x2E, 0x02,
477 0x81, 0x02,
478 0x95, 0x30,
479 0x81, 0x03,
480 0xC0
481};
482
483
484#define EASYPEN_M406XE_RDESC_ORIG_SIZE 476
485
486
487static __u8 easypen_m406xe_rdesc_fixed[] = {
488 0x05, 0x01,
489 0x09, 0x01,
490 0xA1, 0x01,
491 0x85, 0x05,
492 0x09, 0x01,
493 0x15, 0x80,
494 0x25, 0x7F,
495 0x75, 0x08,
496 0x95, 0x07,
497 0xB1, 0x02,
498 0xC0,
499 0x05, 0x0D,
500 0x09, 0x02,
501 0xA1, 0x01,
502 0x85, 0x10,
503 0x09, 0x20,
504 0xA0,
505 0x14,
506 0x25, 0x01,
507 0x75, 0x01,
508 0x09, 0x42,
509 0x09, 0x44,
510 0x09, 0x46,
511 0x95, 0x03,
512 0x81, 0x02,
513 0x95, 0x04,
514 0x81, 0x03,
515 0x09, 0x32,
516 0x95, 0x01,
517 0x81, 0x02,
518 0x75, 0x10,
519 0x95, 0x01,
520 0xA4,
521 0x05, 0x01,
522 0x55, 0xFD,
523 0x65, 0x13,
524 0x34,
525 0x09, 0x30,
526 0x46, 0x70, 0x17,
527 0x26, 0x00, 0x3C,
528 0x81, 0x02,
529 0x09, 0x31,
530 0x46, 0xA0, 0x0F,
531 0x26, 0x00, 0x28,
532 0x81, 0x02,
533 0xB4,
534 0x09, 0x30,
535 0x26, 0xFF, 0x03,
536 0x81, 0x02,
537 0xC0,
538 0xC0,
539 0x05, 0x0C,
540 0x09, 0x01,
541 0xA1, 0x01,
542 0x85, 0x12,
543 0x14,
544 0x25, 0x01,
545 0x75, 0x01,
546 0x95, 0x04,
547 0x0A, 0x79, 0x02,
548 0x0A, 0x1A, 0x02,
549 0x0A, 0x2D, 0x02,
550 0x0A, 0x2E, 0x02,
551 0x81, 0x02,
552 0x95, 0x34,
553 0x81, 0x03,
554 0xC0
555};
556
557static __u8 *kye_consumer_control_fixup(struct hid_device *hdev, __u8 *rdesc,
558 unsigned int *rsize, int offset, const char *device_name) {
559
560
561
562
563
564 if (*rsize >= offset + 31 &&
565
566 rdesc[offset] == 0x05 && rdesc[offset + 1] == 0x0c &&
567
568 rdesc[offset + 2] == 0x09 && rdesc[offset + 3] == 0x01 &&
569
570 rdesc[offset + 10] == 0x2a && rdesc[offset + 12] > 0x2f) {
571 hid_info(hdev, "fixing up %s report descriptor\n", device_name);
572 rdesc[offset + 12] = 0x2f;
573 }
574 return rdesc;
575}
576
577static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc,
578 unsigned int *rsize)
579{
580 switch (hdev->product) {
581 case USB_DEVICE_ID_KYE_ERGO_525V:
582
583
584
585
586
587
588
589 if (*rsize >= 75 &&
590 rdesc[61] == 0x05 && rdesc[62] == 0x08 &&
591 rdesc[63] == 0x19 && rdesc[64] == 0x08 &&
592 rdesc[65] == 0x29 && rdesc[66] == 0x0f &&
593 rdesc[71] == 0x75 && rdesc[72] == 0x08 &&
594 rdesc[73] == 0x95 && rdesc[74] == 0x01) {
595 hid_info(hdev,
596 "fixing up Kye/Genius Ergo Mouse "
597 "report descriptor\n");
598 rdesc[62] = 0x09;
599 rdesc[64] = 0x04;
600 rdesc[66] = 0x07;
601 rdesc[72] = 0x01;
602 rdesc[74] = 0x08;
603 }
604 break;
605 case USB_DEVICE_ID_KYE_EASYPEN_I405X:
606 if (*rsize == EASYPEN_I405X_RDESC_ORIG_SIZE) {
607 rdesc = easypen_i405x_rdesc_fixed;
608 *rsize = sizeof(easypen_i405x_rdesc_fixed);
609 }
610 break;
611 case USB_DEVICE_ID_KYE_MOUSEPEN_I608X:
612 if (*rsize == MOUSEPEN_I608X_RDESC_ORIG_SIZE) {
613 rdesc = mousepen_i608x_rdesc_fixed;
614 *rsize = sizeof(mousepen_i608x_rdesc_fixed);
615 }
616 break;
617 case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2:
618 if (*rsize == MOUSEPEN_I608X_V2_RDESC_ORIG_SIZE) {
619 rdesc = mousepen_i608x_v2_rdesc_fixed;
620 *rsize = sizeof(mousepen_i608x_v2_rdesc_fixed);
621 }
622 break;
623 case USB_DEVICE_ID_KYE_EASYPEN_M610X:
624 if (*rsize == EASYPEN_M610X_RDESC_ORIG_SIZE) {
625 rdesc = easypen_m610x_rdesc_fixed;
626 *rsize = sizeof(easypen_m610x_rdesc_fixed);
627 }
628 break;
629 case USB_DEVICE_ID_KYE_EASYPEN_M406XE:
630 if (*rsize == EASYPEN_M406XE_RDESC_ORIG_SIZE) {
631 rdesc = easypen_m406xe_rdesc_fixed;
632 *rsize = sizeof(easypen_m406xe_rdesc_fixed);
633 }
634 break;
635 case USB_DEVICE_ID_KYE_PENSKETCH_M912:
636 if (*rsize == PENSKETCH_M912_RDESC_ORIG_SIZE) {
637 rdesc = pensketch_m912_rdesc_fixed;
638 *rsize = sizeof(pensketch_m912_rdesc_fixed);
639 }
640 break;
641 case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE:
642 rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104,
643 "Genius Gila Gaming Mouse");
644 break;
645 case USB_DEVICE_ID_GENIUS_GX_IMPERATOR:
646 rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 83,
647 "Genius Gx Imperator Keyboard");
648 break;
649 case USB_DEVICE_ID_GENIUS_MANTICORE:
650 rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104,
651 "Genius Manticore Keyboard");
652 break;
653 }
654 return rdesc;
655}
656
657
658
659
660
661
662
663
664
665static int kye_tablet_enable(struct hid_device *hdev)
666{
667 struct list_head *list;
668 struct list_head *head;
669 struct hid_report *report;
670 __s32 *value;
671
672 list = &hdev->report_enum[HID_FEATURE_REPORT].report_list;
673 list_for_each(head, list) {
674 report = list_entry(head, struct hid_report, list);
675 if (report->id == 5)
676 break;
677 }
678
679 if (head == list) {
680 hid_err(hdev, "tablet-enabling feature report not found\n");
681 return -ENODEV;
682 }
683
684 if (report->maxfield < 1 || report->field[0]->report_count < 7) {
685 hid_err(hdev, "invalid tablet-enabling feature report\n");
686 return -ENODEV;
687 }
688
689 value = report->field[0]->value;
690
691 value[0] = 0x12;
692 value[1] = 0x10;
693 value[2] = 0x11;
694 value[3] = 0x12;
695 value[4] = 0x00;
696 value[5] = 0x00;
697 value[6] = 0x00;
698 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
699
700 return 0;
701}
702
703static int kye_probe(struct hid_device *hdev, const struct hid_device_id *id)
704{
705 int ret;
706
707 ret = hid_parse(hdev);
708 if (ret) {
709 hid_err(hdev, "parse failed\n");
710 goto err;
711 }
712
713 ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
714 if (ret) {
715 hid_err(hdev, "hw start failed\n");
716 goto err;
717 }
718
719 switch (id->product) {
720 case USB_DEVICE_ID_KYE_EASYPEN_I405X:
721 case USB_DEVICE_ID_KYE_MOUSEPEN_I608X:
722 case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2:
723 case USB_DEVICE_ID_KYE_EASYPEN_M610X:
724 case USB_DEVICE_ID_KYE_EASYPEN_M406XE:
725 case USB_DEVICE_ID_KYE_PENSKETCH_M912:
726 ret = kye_tablet_enable(hdev);
727 if (ret) {
728 hid_err(hdev, "tablet enabling failed\n");
729 goto enabling_err;
730 }
731 break;
732 case USB_DEVICE_ID_GENIUS_MANTICORE:
733
734
735
736
737 if (hid_hw_open(hdev))
738 hid_hw_close(hdev);
739 break;
740 }
741
742 return 0;
743enabling_err:
744 hid_hw_stop(hdev);
745err:
746 return ret;
747}
748
749static const struct hid_device_id kye_devices[] = {
750 { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) },
751 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
752 USB_DEVICE_ID_KYE_EASYPEN_I405X) },
753 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
754 USB_DEVICE_ID_KYE_MOUSEPEN_I608X) },
755 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
756 USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2) },
757 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
758 USB_DEVICE_ID_KYE_EASYPEN_M610X) },
759 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
760 USB_DEVICE_ID_KYE_EASYPEN_M406XE) },
761 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
762 USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) },
763 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
764 USB_DEVICE_ID_GENIUS_GX_IMPERATOR) },
765 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
766 USB_DEVICE_ID_GENIUS_MANTICORE) },
767 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
768 USB_DEVICE_ID_KYE_PENSKETCH_M912) },
769 { }
770};
771MODULE_DEVICE_TABLE(hid, kye_devices);
772
773static struct hid_driver kye_driver = {
774 .name = "kye",
775 .id_table = kye_devices,
776 .probe = kye_probe,
777 .report_fixup = kye_report_fixup,
778};
779module_hid_driver(kye_driver);
780
781MODULE_LICENSE("GPL");
782