0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include <linux/device.h>
0014 #include <linux/hid.h>
0015 #include <linux/module.h>
0016
0017 #include "hid-ids.h"
0018
0019
0020 #define EASYPEN_I405X_RDESC_ORIG_SIZE 476
0021
0022
0023 static __u8 easypen_i405x_rdesc_fixed[] = {
0024 0x06, 0x00, 0xFF,
0025 0x09, 0x01,
0026 0xA1, 0x01,
0027 0x85, 0x05,
0028 0x09, 0x01,
0029 0x15, 0x80,
0030 0x25, 0x7F,
0031 0x75, 0x08,
0032 0x95, 0x07,
0033 0xB1, 0x02,
0034 0xC0,
0035 0x05, 0x0D,
0036 0x09, 0x01,
0037 0xA1, 0x01,
0038 0x85, 0x10,
0039 0x09, 0x20,
0040 0xA0,
0041 0x14,
0042 0x25, 0x01,
0043 0x75, 0x01,
0044 0x09, 0x42,
0045 0x09, 0x44,
0046 0x09, 0x46,
0047 0x95, 0x03,
0048 0x81, 0x02,
0049 0x95, 0x04,
0050 0x81, 0x03,
0051 0x09, 0x32,
0052 0x95, 0x01,
0053 0x81, 0x02,
0054 0x75, 0x10,
0055 0x95, 0x01,
0056 0xA4,
0057 0x05, 0x01,
0058 0x55, 0xFD,
0059 0x65, 0x13,
0060 0x34,
0061 0x09, 0x30,
0062 0x46, 0x7C, 0x15,
0063 0x26, 0x00, 0x37,
0064 0x81, 0x02,
0065 0x09, 0x31,
0066 0x46, 0xA0, 0x0F,
0067 0x26, 0x00, 0x28,
0068 0x81, 0x02,
0069 0xB4,
0070 0x09, 0x30,
0071 0x26, 0xFF, 0x03,
0072 0x81, 0x02,
0073 0xC0,
0074 0xC0
0075 };
0076
0077
0078 #define MOUSEPEN_I608X_RDESC_ORIG_SIZE 476
0079
0080
0081 static __u8 mousepen_i608x_rdesc_fixed[] = {
0082 0x06, 0x00, 0xFF,
0083 0x09, 0x01,
0084 0xA1, 0x01,
0085 0x85, 0x05,
0086 0x09, 0x01,
0087 0x15, 0x80,
0088 0x25, 0x7F,
0089 0x75, 0x08,
0090 0x95, 0x07,
0091 0xB1, 0x02,
0092 0xC0,
0093 0x05, 0x0D,
0094 0x09, 0x01,
0095 0xA1, 0x01,
0096 0x85, 0x10,
0097 0x09, 0x20,
0098 0xA0,
0099 0x14,
0100 0x25, 0x01,
0101 0x75, 0x01,
0102 0x09, 0x42,
0103 0x09, 0x44,
0104 0x09, 0x46,
0105 0x95, 0x03,
0106 0x81, 0x02,
0107 0x95, 0x04,
0108 0x81, 0x03,
0109 0x09, 0x32,
0110 0x95, 0x01,
0111 0x81, 0x02,
0112 0x75, 0x10,
0113 0x95, 0x01,
0114 0xA4,
0115 0x05, 0x01,
0116 0x55, 0xFD,
0117 0x65, 0x13,
0118 0x34,
0119 0x09, 0x30,
0120 0x46, 0x40, 0x1F,
0121 0x26, 0x00, 0x50,
0122 0x81, 0x02,
0123 0x09, 0x31,
0124 0x46, 0x70, 0x17,
0125 0x26, 0x00, 0x3C,
0126 0x81, 0x02,
0127 0xB4,
0128 0x09, 0x30,
0129 0x26, 0xFF, 0x03,
0130 0x81, 0x02,
0131 0xC0,
0132 0xC0,
0133 0x05, 0x01,
0134 0x09, 0x02,
0135 0xA1, 0x01,
0136 0x85, 0x11,
0137 0x09, 0x01,
0138 0xA0,
0139 0x14,
0140 0xA4,
0141 0x05, 0x09,
0142 0x75, 0x01,
0143 0x19, 0x01,
0144 0x29, 0x03,
0145 0x25, 0x01,
0146 0x95, 0x03,
0147 0x81, 0x02,
0148 0x95, 0x05,
0149 0x81, 0x01,
0150 0xB4,
0151 0x95, 0x01,
0152 0xA4,
0153 0x55, 0xFD,
0154 0x65, 0x13,
0155 0x34,
0156 0x75, 0x10,
0157 0x09, 0x30,
0158 0x46, 0x40, 0x1F,
0159 0x26, 0x00, 0x50,
0160 0x81, 0x02,
0161 0x09, 0x31,
0162 0x46, 0x70, 0x17,
0163 0x26, 0x00, 0x3C,
0164 0x81, 0x02,
0165 0xB4,
0166 0x75, 0x08,
0167 0x09, 0x38,
0168 0x15, 0xFF,
0169 0x25, 0x01,
0170 0x81, 0x06,
0171 0x81, 0x01,
0172 0xC0,
0173 0xC0
0174 };
0175
0176
0177 #define MOUSEPEN_I608X_V2_RDESC_ORIG_SIZE 482
0178
0179
0180 static __u8 mousepen_i608x_v2_rdesc_fixed[] = {
0181 0x06, 0x00, 0xFF,
0182 0x09, 0x01,
0183 0xA1, 0x01,
0184 0x85, 0x05,
0185 0x09, 0x01,
0186 0x15, 0x80,
0187 0x25, 0x7F,
0188 0x75, 0x08,
0189 0x95, 0x07,
0190 0xB1, 0x02,
0191 0xC0,
0192 0x05, 0x0D,
0193 0x09, 0x01,
0194 0xA1, 0x01,
0195 0x85, 0x10,
0196 0x09, 0x20,
0197 0xA0,
0198 0x14,
0199 0x25, 0x01,
0200 0x75, 0x01,
0201 0x09, 0x42,
0202 0x09, 0x44,
0203 0x09, 0x46,
0204 0x95, 0x03,
0205 0x81, 0x02,
0206 0x95, 0x04,
0207 0x81, 0x03,
0208 0x09, 0x32,
0209 0x95, 0x01,
0210 0x81, 0x02,
0211 0x75, 0x10,
0212 0x95, 0x01,
0213 0xA4,
0214 0x05, 0x01,
0215 0x55, 0xFD,
0216 0x65, 0x13,
0217 0x34,
0218 0x09, 0x30,
0219 0x46, 0x40, 0x1F,
0220 0x27, 0x00, 0xA0, 0x00, 0x00,
0221 0x81, 0x02,
0222 0x09, 0x31,
0223 0x46, 0x70, 0x17,
0224 0x26, 0x00, 0x78,
0225 0x81, 0x02,
0226 0xB4,
0227 0x09, 0x30,
0228 0x26, 0xFF, 0x07,
0229 0x81, 0x02,
0230 0xC0,
0231 0xC0,
0232 0x05, 0x01,
0233 0x09, 0x02,
0234 0xA1, 0x01,
0235 0x85, 0x11,
0236 0x09, 0x01,
0237 0xA0,
0238 0x14,
0239 0xA4,
0240 0x05, 0x09,
0241 0x75, 0x01,
0242 0x19, 0x01,
0243 0x29, 0x03,
0244 0x25, 0x01,
0245 0x95, 0x03,
0246 0x81, 0x02,
0247 0x95, 0x05,
0248 0x81, 0x01,
0249 0xB4,
0250 0x95, 0x01,
0251 0xA4,
0252 0x55, 0xFD,
0253 0x65, 0x13,
0254 0x34,
0255 0x75, 0x10,
0256 0x09, 0x30,
0257 0x46, 0x40, 0x1F,
0258 0x27, 0x00, 0xA0, 0x00, 0x00,
0259 0x81, 0x02,
0260 0x09, 0x31,
0261 0x46, 0x70, 0x17,
0262 0x26, 0x00, 0x78,
0263 0x81, 0x02,
0264 0xB4,
0265 0x75, 0x08,
0266 0x09, 0x38,
0267 0x15, 0xFF,
0268 0x25, 0x01,
0269 0x81, 0x06,
0270 0x81, 0x01,
0271 0xC0,
0272 0xC0
0273 };
0274
0275
0276 #define EASYPEN_M610X_RDESC_ORIG_SIZE 476
0277
0278
0279 static __u8 easypen_m610x_rdesc_fixed[] = {
0280 0x06, 0x00, 0xFF,
0281 0x09, 0x01,
0282 0xA1, 0x01,
0283 0x85, 0x05,
0284 0x09, 0x01,
0285 0x15, 0x80,
0286 0x25, 0x7F,
0287 0x75, 0x08,
0288 0x95, 0x07,
0289 0xB1, 0x02,
0290 0xC0,
0291 0x05, 0x0D,
0292 0x09, 0x01,
0293 0xA1, 0x01,
0294 0x85, 0x10,
0295 0x09, 0x20,
0296 0xA0,
0297 0x14,
0298 0x25, 0x01,
0299 0x75, 0x01,
0300 0x09, 0x42,
0301 0x09, 0x44,
0302 0x09, 0x46,
0303 0x95, 0x03,
0304 0x81, 0x02,
0305 0x95, 0x04,
0306 0x81, 0x03,
0307 0x09, 0x32,
0308 0x95, 0x01,
0309 0x81, 0x02,
0310 0x75, 0x10,
0311 0x95, 0x01,
0312 0xA4,
0313 0x05, 0x01,
0314 0x55, 0xFD,
0315 0x65, 0x13,
0316 0x34,
0317 0x09, 0x30,
0318 0x46, 0x10, 0x27,
0319 0x27, 0x00, 0xA0, 0x00, 0x00,
0320 0x81, 0x02,
0321 0x09, 0x31,
0322 0x46, 0x6A, 0x18,
0323 0x26, 0x00, 0x64,
0324 0x81, 0x02,
0325 0xB4,
0326 0x09, 0x30,
0327 0x26, 0xFF, 0x03,
0328 0x81, 0x02,
0329 0xC0,
0330 0xC0,
0331 0x05, 0x0C,
0332 0x09, 0x01,
0333 0xA1, 0x01,
0334 0x85, 0x12,
0335 0x14,
0336 0x25, 0x01,
0337 0x75, 0x01,
0338 0x95, 0x04,
0339 0x0A, 0x1A, 0x02,
0340 0x0A, 0x79, 0x02,
0341 0x0A, 0x2D, 0x02,
0342 0x0A, 0x2E, 0x02,
0343 0x81, 0x02,
0344 0x95, 0x01,
0345 0x75, 0x14,
0346 0x81, 0x03,
0347 0x75, 0x20,
0348 0x81, 0x03,
0349 0xC0
0350 };
0351
0352
0353
0354 #define PENSKETCH_M912_RDESC_ORIG_SIZE 482
0355
0356
0357 static __u8 pensketch_m912_rdesc_fixed[] = {
0358 0x05, 0x01,
0359 0x08,
0360 0xA1, 0x01,
0361 0x85, 0x05,
0362 0x06, 0x00, 0xFF,
0363 0x09, 0x01,
0364 0x15, 0x81,
0365 0x25, 0x7F,
0366 0x75, 0x08,
0367 0x95, 0x07,
0368 0xB1, 0x02,
0369 0xC0,
0370 0x05, 0x0D,
0371 0x09, 0x01,
0372 0xA1, 0x01,
0373 0x85, 0x10,
0374 0x09, 0x20,
0375 0xA0,
0376 0x09, 0x42,
0377 0x09, 0x44,
0378 0x09, 0x46,
0379 0x14,
0380 0x25, 0x01,
0381 0x75, 0x01,
0382 0x95, 0x03,
0383 0x81, 0x02,
0384 0x95, 0x04,
0385 0x81, 0x03,
0386 0x09, 0x32,
0387 0x95, 0x01,
0388 0x81, 0x02,
0389 0x75, 0x10,
0390 0x95, 0x01,
0391 0xA4,
0392 0x05, 0x01,
0393 0x55, 0xFD,
0394 0x65, 0x13,
0395 0x14,
0396 0x34,
0397 0x09, 0x30,
0398 0x27, 0x00, 0xF0, 0x00, 0x00,
0399 0x46, 0xE0, 0x2E,
0400 0x81, 0x02,
0401 0x09, 0x31,
0402 0x27, 0x00, 0xB4, 0x00, 0x00,
0403 0x46, 0x28, 0x23,
0404 0x81, 0x02,
0405 0xB4,
0406 0x09, 0x30,
0407 0x14,
0408 0x26, 0xFF, 0x07,
0409 0x81, 0x02,
0410 0xC0,
0411 0xC0,
0412 0x05, 0x0D,
0413 0x09, 0x21,
0414 0xA1, 0x01,
0415 0x85, 0x11,
0416 0x09, 0x21,
0417 0xA0,
0418 0x05, 0x09,
0419 0x75, 0x01,
0420 0x19, 0x01,
0421 0x29, 0x03,
0422 0x14,
0423 0x25, 0x01,
0424 0x95, 0x03,
0425 0x81, 0x02,
0426 0x95, 0x04,
0427 0x81, 0x01,
0428 0x95, 0x01,
0429 0x0B, 0x32, 0x00, 0x0D, 0x00,
0430 0x14,
0431 0x25, 0x01,
0432 0x81, 0x02,
0433 0xA4,
0434 0x05, 0x01,
0435 0x75, 0x10,
0436 0x95, 0x01,
0437 0x55, 0xFD,
0438 0x65, 0x13,
0439 0x14,
0440 0x34,
0441 0x09, 0x30,
0442 0x27, 0x00, 0xF0, 0x00, 0x00,
0443 0x46, 0xE0, 0x2E,
0444 0x81, 0x02,
0445 0x09, 0x31,
0446 0x27, 0x00, 0xB4, 0x00, 0x00,
0447 0x46, 0x28, 0x23,
0448 0x81, 0x02,
0449 0x09, 0x38,
0450 0x75, 0x08,
0451 0x95, 0x01,
0452 0x15, 0xFF,
0453 0x25, 0x01,
0454 0x34,
0455 0x44,
0456 0x81, 0x06,
0457 0xB4,
0458 0xC0,
0459 0xC0,
0460 0x05, 0x0C,
0461 0x09, 0x01,
0462 0xA1, 0x01,
0463 0x85, 0x12,
0464 0x14,
0465 0x25, 0x01,
0466 0x75, 0x01,
0467 0x95, 0x08,
0468 0x05, 0x0C,
0469 0x0A, 0x6A, 0x02,
0470 0x0A, 0x1A, 0x02,
0471 0x0A, 0x01, 0x02,
0472 0x0A, 0x2F, 0x02,
0473 0x0A, 0x25, 0x02,
0474 0x0A, 0x24, 0x02,
0475 0x0A, 0x2D, 0x02,
0476 0x0A, 0x2E, 0x02,
0477 0x81, 0x02,
0478 0x95, 0x30,
0479 0x81, 0x03,
0480 0xC0
0481 };
0482
0483
0484 #define EASYPEN_M406XE_RDESC_ORIG_SIZE 476
0485
0486
0487 static __u8 easypen_m406xe_rdesc_fixed[] = {
0488 0x05, 0x01,
0489 0x09, 0x01,
0490 0xA1, 0x01,
0491 0x85, 0x05,
0492 0x09, 0x01,
0493 0x15, 0x80,
0494 0x25, 0x7F,
0495 0x75, 0x08,
0496 0x95, 0x07,
0497 0xB1, 0x02,
0498 0xC0,
0499 0x05, 0x0D,
0500 0x09, 0x01,
0501 0xA1, 0x01,
0502 0x85, 0x10,
0503 0x09, 0x20,
0504 0xA0,
0505 0x14,
0506 0x25, 0x01,
0507 0x75, 0x01,
0508 0x09, 0x42,
0509 0x09, 0x44,
0510 0x09, 0x46,
0511 0x95, 0x03,
0512 0x81, 0x02,
0513 0x95, 0x04,
0514 0x81, 0x03,
0515 0x09, 0x32,
0516 0x95, 0x01,
0517 0x81, 0x02,
0518 0x75, 0x10,
0519 0x95, 0x01,
0520 0xA4,
0521 0x05, 0x01,
0522 0x55, 0xFD,
0523 0x65, 0x13,
0524 0x34,
0525 0x09, 0x30,
0526 0x46, 0x70, 0x17,
0527 0x26, 0x00, 0x3C,
0528 0x81, 0x02,
0529 0x09, 0x31,
0530 0x46, 0xA0, 0x0F,
0531 0x26, 0x00, 0x28,
0532 0x81, 0x02,
0533 0xB4,
0534 0x09, 0x30,
0535 0x26, 0xFF, 0x03,
0536 0x81, 0x02,
0537 0xC0,
0538 0xC0,
0539 0x05, 0x0C,
0540 0x09, 0x01,
0541 0xA1, 0x01,
0542 0x85, 0x12,
0543 0x14,
0544 0x25, 0x01,
0545 0x75, 0x01,
0546 0x95, 0x04,
0547 0x0A, 0x79, 0x02,
0548 0x0A, 0x1A, 0x02,
0549 0x0A, 0x2D, 0x02,
0550 0x0A, 0x2E, 0x02,
0551 0x81, 0x02,
0552 0x95, 0x34,
0553 0x81, 0x03,
0554 0xC0
0555 };
0556
0557 static __u8 *kye_consumer_control_fixup(struct hid_device *hdev, __u8 *rdesc,
0558 unsigned int *rsize, int offset, const char *device_name) {
0559
0560
0561
0562
0563
0564 if (*rsize >= offset + 31 &&
0565
0566 rdesc[offset] == 0x05 && rdesc[offset + 1] == 0x0c &&
0567
0568 rdesc[offset + 2] == 0x09 && rdesc[offset + 3] == 0x01 &&
0569
0570 rdesc[offset + 10] == 0x2a && rdesc[offset + 12] > 0x2f) {
0571 hid_info(hdev, "fixing up %s report descriptor\n", device_name);
0572 rdesc[offset + 12] = 0x2f;
0573 }
0574 return rdesc;
0575 }
0576
0577 static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc,
0578 unsigned int *rsize)
0579 {
0580 switch (hdev->product) {
0581 case USB_DEVICE_ID_KYE_ERGO_525V:
0582
0583
0584
0585
0586
0587
0588
0589 if (*rsize >= 75 &&
0590 rdesc[61] == 0x05 && rdesc[62] == 0x08 &&
0591 rdesc[63] == 0x19 && rdesc[64] == 0x08 &&
0592 rdesc[65] == 0x29 && rdesc[66] == 0x0f &&
0593 rdesc[71] == 0x75 && rdesc[72] == 0x08 &&
0594 rdesc[73] == 0x95 && rdesc[74] == 0x01) {
0595 hid_info(hdev,
0596 "fixing up Kye/Genius Ergo Mouse "
0597 "report descriptor\n");
0598 rdesc[62] = 0x09;
0599 rdesc[64] = 0x04;
0600 rdesc[66] = 0x07;
0601 rdesc[72] = 0x01;
0602 rdesc[74] = 0x08;
0603 }
0604 break;
0605 case USB_DEVICE_ID_KYE_EASYPEN_I405X:
0606 if (*rsize == EASYPEN_I405X_RDESC_ORIG_SIZE) {
0607 rdesc = easypen_i405x_rdesc_fixed;
0608 *rsize = sizeof(easypen_i405x_rdesc_fixed);
0609 }
0610 break;
0611 case USB_DEVICE_ID_KYE_MOUSEPEN_I608X:
0612 if (*rsize == MOUSEPEN_I608X_RDESC_ORIG_SIZE) {
0613 rdesc = mousepen_i608x_rdesc_fixed;
0614 *rsize = sizeof(mousepen_i608x_rdesc_fixed);
0615 }
0616 break;
0617 case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2:
0618 if (*rsize == MOUSEPEN_I608X_V2_RDESC_ORIG_SIZE) {
0619 rdesc = mousepen_i608x_v2_rdesc_fixed;
0620 *rsize = sizeof(mousepen_i608x_v2_rdesc_fixed);
0621 }
0622 break;
0623 case USB_DEVICE_ID_KYE_EASYPEN_M610X:
0624 if (*rsize == EASYPEN_M610X_RDESC_ORIG_SIZE) {
0625 rdesc = easypen_m610x_rdesc_fixed;
0626 *rsize = sizeof(easypen_m610x_rdesc_fixed);
0627 }
0628 break;
0629 case USB_DEVICE_ID_KYE_EASYPEN_M406XE:
0630 if (*rsize == EASYPEN_M406XE_RDESC_ORIG_SIZE) {
0631 rdesc = easypen_m406xe_rdesc_fixed;
0632 *rsize = sizeof(easypen_m406xe_rdesc_fixed);
0633 }
0634 break;
0635 case USB_DEVICE_ID_KYE_PENSKETCH_M912:
0636 if (*rsize == PENSKETCH_M912_RDESC_ORIG_SIZE) {
0637 rdesc = pensketch_m912_rdesc_fixed;
0638 *rsize = sizeof(pensketch_m912_rdesc_fixed);
0639 }
0640 break;
0641 case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE:
0642 rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104,
0643 "Genius Gila Gaming Mouse");
0644 break;
0645 case USB_DEVICE_ID_GENIUS_GX_IMPERATOR:
0646 rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 83,
0647 "Genius Gx Imperator Keyboard");
0648 break;
0649 case USB_DEVICE_ID_GENIUS_MANTICORE:
0650 rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104,
0651 "Genius Manticore Keyboard");
0652 break;
0653 }
0654 return rdesc;
0655 }
0656
0657
0658
0659
0660
0661
0662
0663
0664
0665 static int kye_tablet_enable(struct hid_device *hdev)
0666 {
0667 struct list_head *list;
0668 struct list_head *head;
0669 struct hid_report *report;
0670 __s32 *value;
0671
0672 list = &hdev->report_enum[HID_FEATURE_REPORT].report_list;
0673 list_for_each(head, list) {
0674 report = list_entry(head, struct hid_report, list);
0675 if (report->id == 5)
0676 break;
0677 }
0678
0679 if (head == list) {
0680 hid_err(hdev, "tablet-enabling feature report not found\n");
0681 return -ENODEV;
0682 }
0683
0684 if (report->maxfield < 1 || report->field[0]->report_count < 7) {
0685 hid_err(hdev, "invalid tablet-enabling feature report\n");
0686 return -ENODEV;
0687 }
0688
0689 value = report->field[0]->value;
0690
0691 value[0] = 0x12;
0692 value[1] = 0x10;
0693 value[2] = 0x11;
0694 value[3] = 0x12;
0695 value[4] = 0x00;
0696 value[5] = 0x00;
0697 value[6] = 0x00;
0698 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
0699
0700 return 0;
0701 }
0702
0703 static int kye_probe(struct hid_device *hdev, const struct hid_device_id *id)
0704 {
0705 int ret;
0706
0707 ret = hid_parse(hdev);
0708 if (ret) {
0709 hid_err(hdev, "parse failed\n");
0710 goto err;
0711 }
0712
0713 ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
0714 if (ret) {
0715 hid_err(hdev, "hw start failed\n");
0716 goto err;
0717 }
0718
0719 switch (id->product) {
0720 case USB_DEVICE_ID_KYE_EASYPEN_I405X:
0721 case USB_DEVICE_ID_KYE_MOUSEPEN_I608X:
0722 case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2:
0723 case USB_DEVICE_ID_KYE_EASYPEN_M610X:
0724 case USB_DEVICE_ID_KYE_EASYPEN_M406XE:
0725 case USB_DEVICE_ID_KYE_PENSKETCH_M912:
0726 ret = kye_tablet_enable(hdev);
0727 if (ret) {
0728 hid_err(hdev, "tablet enabling failed\n");
0729 goto enabling_err;
0730 }
0731 break;
0732 case USB_DEVICE_ID_GENIUS_MANTICORE:
0733
0734
0735
0736
0737 if (hid_hw_open(hdev))
0738 hid_hw_close(hdev);
0739 break;
0740 }
0741
0742 return 0;
0743 enabling_err:
0744 hid_hw_stop(hdev);
0745 err:
0746 return ret;
0747 }
0748
0749 static const struct hid_device_id kye_devices[] = {
0750 { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) },
0751 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
0752 USB_DEVICE_ID_KYE_EASYPEN_I405X) },
0753 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
0754 USB_DEVICE_ID_KYE_MOUSEPEN_I608X) },
0755 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
0756 USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2) },
0757 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
0758 USB_DEVICE_ID_KYE_EASYPEN_M610X) },
0759 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
0760 USB_DEVICE_ID_KYE_EASYPEN_M406XE) },
0761 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
0762 USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) },
0763 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
0764 USB_DEVICE_ID_GENIUS_GX_IMPERATOR) },
0765 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
0766 USB_DEVICE_ID_GENIUS_MANTICORE) },
0767 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
0768 USB_DEVICE_ID_KYE_PENSKETCH_M912) },
0769 { }
0770 };
0771 MODULE_DEVICE_TABLE(hid, kye_devices);
0772
0773 static struct hid_driver kye_driver = {
0774 .name = "kye",
0775 .id_table = kye_devices,
0776 .probe = kye_probe,
0777 .report_fixup = kye_report_fixup,
0778 };
0779 module_hid_driver(kye_driver);
0780
0781 MODULE_LICENSE("GPL");