0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060 #include <linux/jiffies.h>
0061 #include <linux/kernel.h>
0062 #include <linux/slab.h>
0063 #include <linux/module.h>
0064 #include <linux/usb/input.h>
0065 #include <linux/uaccess.h>
0066 #include <asm/unaligned.h>
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165 #define USB_VENDOR_ID_AIPTEK 0x08ca
0166 #define USB_VENDOR_ID_KYE 0x0458
0167 #define USB_REQ_GET_REPORT 0x01
0168 #define USB_REQ_SET_REPORT 0x09
0169
0170
0171
0172 #define AIPTEK_POINTER_ONLY_MOUSE_MODE 0
0173 #define AIPTEK_POINTER_ONLY_STYLUS_MODE 1
0174 #define AIPTEK_POINTER_EITHER_MODE 2
0175
0176 #define AIPTEK_POINTER_ALLOW_MOUSE_MODE(a) \
0177 (a == AIPTEK_POINTER_ONLY_MOUSE_MODE || \
0178 a == AIPTEK_POINTER_EITHER_MODE)
0179 #define AIPTEK_POINTER_ALLOW_STYLUS_MODE(a) \
0180 (a == AIPTEK_POINTER_ONLY_STYLUS_MODE || \
0181 a == AIPTEK_POINTER_EITHER_MODE)
0182
0183
0184
0185 #define AIPTEK_COORDINATE_RELATIVE_MODE 0
0186 #define AIPTEK_COORDINATE_ABSOLUTE_MODE 1
0187
0188
0189
0190 #define AIPTEK_TILT_MIN (-128)
0191 #define AIPTEK_TILT_MAX 127
0192 #define AIPTEK_TILT_DISABLE (-10101)
0193
0194
0195
0196 #define AIPTEK_WHEEL_MIN 0
0197 #define AIPTEK_WHEEL_MAX 1024
0198 #define AIPTEK_WHEEL_DISABLE (-10101)
0199
0200
0201
0202
0203
0204
0205
0206 #define AIPTEK_TOOL_BUTTON_PEN_MODE BTN_TOOL_PEN
0207 #define AIPTEK_TOOL_BUTTON_PENCIL_MODE BTN_TOOL_PENCIL
0208 #define AIPTEK_TOOL_BUTTON_BRUSH_MODE BTN_TOOL_BRUSH
0209 #define AIPTEK_TOOL_BUTTON_AIRBRUSH_MODE BTN_TOOL_AIRBRUSH
0210 #define AIPTEK_TOOL_BUTTON_ERASER_MODE BTN_TOOL_RUBBER
0211 #define AIPTEK_TOOL_BUTTON_MOUSE_MODE BTN_TOOL_MOUSE
0212 #define AIPTEK_TOOL_BUTTON_LENS_MODE BTN_TOOL_LENS
0213
0214
0215
0216 #define AIPTEK_DIAGNOSTIC_NA 0
0217 #define AIPTEK_DIAGNOSTIC_SENDING_RELATIVE_IN_ABSOLUTE 1
0218 #define AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE 2
0219 #define AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED 3
0220
0221
0222
0223
0224 #define AIPTEK_JITTER_DELAY_DEFAULT 50
0225
0226
0227
0228
0229
0230 #define AIPTEK_PROGRAMMABLE_DELAY_25 25
0231 #define AIPTEK_PROGRAMMABLE_DELAY_50 50
0232 #define AIPTEK_PROGRAMMABLE_DELAY_100 100
0233 #define AIPTEK_PROGRAMMABLE_DELAY_200 200
0234 #define AIPTEK_PROGRAMMABLE_DELAY_300 300
0235 #define AIPTEK_PROGRAMMABLE_DELAY_400 400
0236 #define AIPTEK_PROGRAMMABLE_DELAY_DEFAULT AIPTEK_PROGRAMMABLE_DELAY_400
0237
0238
0239
0240 #define AIPTEK_MOUSE_LEFT_BUTTON 0x04
0241 #define AIPTEK_MOUSE_RIGHT_BUTTON 0x08
0242 #define AIPTEK_MOUSE_MIDDLE_BUTTON 0x10
0243
0244
0245
0246 #define AIPTEK_STYLUS_LOWER_BUTTON 0x08
0247 #define AIPTEK_STYLUS_UPPER_BUTTON 0x10
0248
0249
0250
0251 #define AIPTEK_PACKET_LENGTH 8
0252
0253
0254
0255
0256
0257
0258 #define AIPTEK_REPORT_TOOL_UNKNOWN 0x10
0259 #define AIPTEK_REPORT_TOOL_STYLUS 0x20
0260 #define AIPTEK_REPORT_TOOL_MOUSE 0x40
0261
0262 static int programmableDelay = AIPTEK_PROGRAMMABLE_DELAY_DEFAULT;
0263 static int jitterDelay = AIPTEK_JITTER_DELAY_DEFAULT;
0264
0265 struct aiptek_features {
0266 int odmCode;
0267 int modelCode;
0268 int firmwareCode;
0269 char usbPath[64 + 1];
0270 };
0271
0272 struct aiptek_settings {
0273 int pointerMode;
0274 int coordinateMode;
0275 int toolMode;
0276 int xTilt;
0277 int yTilt;
0278 int wheel;
0279 int stylusButtonUpper;
0280 int stylusButtonLower;
0281 int mouseButtonLeft;
0282 int mouseButtonMiddle;
0283 int mouseButtonRight;
0284 int programmableDelay;
0285 int jitterDelay;
0286 };
0287
0288 struct aiptek {
0289 struct input_dev *inputdev;
0290 struct usb_interface *intf;
0291 struct urb *urb;
0292 dma_addr_t data_dma;
0293 struct aiptek_features features;
0294 struct aiptek_settings curSetting;
0295 struct aiptek_settings newSetting;
0296 unsigned int ifnum;
0297 int diagnostic;
0298 unsigned long eventCount;
0299 int inDelay;
0300 unsigned long endDelay;
0301 int previousJitterable;
0302
0303 int lastMacro;
0304 int previousToolMode;
0305 unsigned char *data;
0306 };
0307
0308 static const int eventTypes[] = {
0309 EV_KEY, EV_ABS, EV_REL, EV_MSC,
0310 };
0311
0312 static const int absEvents[] = {
0313 ABS_X, ABS_Y, ABS_PRESSURE, ABS_TILT_X, ABS_TILT_Y,
0314 ABS_WHEEL, ABS_MISC,
0315 };
0316
0317 static const int relEvents[] = {
0318 REL_X, REL_Y, REL_WHEEL,
0319 };
0320
0321 static const int buttonEvents[] = {
0322 BTN_LEFT, BTN_RIGHT, BTN_MIDDLE,
0323 BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH,
0324 BTN_TOOL_BRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOUCH,
0325 BTN_STYLUS, BTN_STYLUS2,
0326 };
0327
0328
0329
0330
0331
0332
0333 static const int macroKeyEvents[] = {
0334 KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5,
0335 KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11,
0336 KEY_F12, KEY_F13, KEY_F14, KEY_F15, KEY_F16, KEY_F17,
0337 KEY_F18, KEY_F19, KEY_F20, KEY_F21, KEY_F22, KEY_F23,
0338 KEY_F24, KEY_STOP, KEY_AGAIN, KEY_PROPS, KEY_UNDO,
0339 KEY_FRONT, KEY_COPY, KEY_OPEN, KEY_PASTE, 0
0340 };
0341
0342
0343
0344
0345
0346 #define AIPTEK_INVALID_VALUE -1
0347
0348 struct aiptek_map {
0349 const char *string;
0350 int value;
0351 };
0352
0353 static int map_str_to_val(const struct aiptek_map *map, const char *str, size_t count)
0354 {
0355 const struct aiptek_map *p;
0356
0357 if (str[count - 1] == '\n')
0358 count--;
0359
0360 for (p = map; p->string; p++)
0361 if (!strncmp(str, p->string, count))
0362 return p->value;
0363
0364 return AIPTEK_INVALID_VALUE;
0365 }
0366
0367 static const char *map_val_to_str(const struct aiptek_map *map, int val)
0368 {
0369 const struct aiptek_map *p;
0370
0371 for (p = map; p->value != AIPTEK_INVALID_VALUE; p++)
0372 if (val == p->value)
0373 return p->string;
0374
0375 return "unknown";
0376 }
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412 static void aiptek_irq(struct urb *urb)
0413 {
0414 struct aiptek *aiptek = urb->context;
0415 unsigned char *data = aiptek->data;
0416 struct input_dev *inputdev = aiptek->inputdev;
0417 struct usb_interface *intf = aiptek->intf;
0418 int jitterable = 0;
0419 int retval, macro, x, y, z, left, right, middle, p, dv, tip, bs, pck;
0420
0421 switch (urb->status) {
0422 case 0:
0423
0424 break;
0425
0426 case -ECONNRESET:
0427 case -ENOENT:
0428 case -ESHUTDOWN:
0429
0430 dev_dbg(&intf->dev, "%s - urb shutting down with status: %d\n",
0431 __func__, urb->status);
0432 return;
0433
0434 default:
0435 dev_dbg(&intf->dev, "%s - nonzero urb status received: %d\n",
0436 __func__, urb->status);
0437 goto exit;
0438 }
0439
0440
0441
0442 if (aiptek->inDelay == 1 && time_after(aiptek->endDelay, jiffies)) {
0443 goto exit;
0444 }
0445
0446 aiptek->inDelay = 0;
0447 aiptek->eventCount++;
0448
0449
0450
0451
0452
0453 if (data[0] == 1) {
0454 if (aiptek->curSetting.coordinateMode ==
0455 AIPTEK_COORDINATE_ABSOLUTE_MODE) {
0456 aiptek->diagnostic =
0457 AIPTEK_DIAGNOSTIC_SENDING_RELATIVE_IN_ABSOLUTE;
0458 } else {
0459 x = (signed char) data[2];
0460 y = (signed char) data[3];
0461
0462
0463
0464
0465
0466
0467
0468
0469 jitterable = data[1] & 0x07;
0470
0471 left = (data[1] & aiptek->curSetting.mouseButtonLeft >> 2) != 0 ? 1 : 0;
0472 right = (data[1] & aiptek->curSetting.mouseButtonRight >> 2) != 0 ? 1 : 0;
0473 middle = (data[1] & aiptek->curSetting.mouseButtonMiddle >> 2) != 0 ? 1 : 0;
0474
0475 input_report_key(inputdev, BTN_LEFT, left);
0476 input_report_key(inputdev, BTN_MIDDLE, middle);
0477 input_report_key(inputdev, BTN_RIGHT, right);
0478
0479 input_report_abs(inputdev, ABS_MISC,
0480 1 | AIPTEK_REPORT_TOOL_UNKNOWN);
0481 input_report_rel(inputdev, REL_X, x);
0482 input_report_rel(inputdev, REL_Y, y);
0483
0484
0485
0486
0487 if (aiptek->curSetting.wheel != AIPTEK_WHEEL_DISABLE) {
0488 input_report_rel(inputdev, REL_WHEEL,
0489 aiptek->curSetting.wheel);
0490 aiptek->curSetting.wheel = AIPTEK_WHEEL_DISABLE;
0491 }
0492 if (aiptek->lastMacro != -1) {
0493 input_report_key(inputdev,
0494 macroKeyEvents[aiptek->lastMacro], 0);
0495 aiptek->lastMacro = -1;
0496 }
0497 input_sync(inputdev);
0498 }
0499 }
0500
0501
0502
0503 else if (data[0] == 2) {
0504 if (aiptek->curSetting.coordinateMode == AIPTEK_COORDINATE_RELATIVE_MODE) {
0505 aiptek->diagnostic = AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE;
0506 } else if (!AIPTEK_POINTER_ALLOW_STYLUS_MODE
0507 (aiptek->curSetting.pointerMode)) {
0508 aiptek->diagnostic = AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED;
0509 } else {
0510 x = get_unaligned_le16(data + 1);
0511 y = get_unaligned_le16(data + 3);
0512 z = get_unaligned_le16(data + 6);
0513
0514 dv = (data[5] & 0x01) != 0 ? 1 : 0;
0515 p = (data[5] & 0x02) != 0 ? 1 : 0;
0516 tip = (data[5] & 0x04) != 0 ? 1 : 0;
0517
0518
0519
0520 jitterable = data[5] & 0x18;
0521
0522 bs = (data[5] & aiptek->curSetting.stylusButtonLower) != 0 ? 1 : 0;
0523 pck = (data[5] & aiptek->curSetting.stylusButtonUpper) != 0 ? 1 : 0;
0524
0525
0526
0527
0528
0529 if (dv != 0) {
0530
0531
0532
0533 if (aiptek->previousToolMode !=
0534 aiptek->curSetting.toolMode) {
0535 input_report_key(inputdev,
0536 aiptek->previousToolMode, 0);
0537 input_report_key(inputdev,
0538 aiptek->curSetting.toolMode,
0539 1);
0540 aiptek->previousToolMode =
0541 aiptek->curSetting.toolMode;
0542 }
0543
0544 if (p != 0) {
0545 input_report_abs(inputdev, ABS_X, x);
0546 input_report_abs(inputdev, ABS_Y, y);
0547 input_report_abs(inputdev, ABS_PRESSURE, z);
0548
0549 input_report_key(inputdev, BTN_TOUCH, tip);
0550 input_report_key(inputdev, BTN_STYLUS, bs);
0551 input_report_key(inputdev, BTN_STYLUS2, pck);
0552
0553 if (aiptek->curSetting.xTilt !=
0554 AIPTEK_TILT_DISABLE) {
0555 input_report_abs(inputdev,
0556 ABS_TILT_X,
0557 aiptek->curSetting.xTilt);
0558 }
0559 if (aiptek->curSetting.yTilt != AIPTEK_TILT_DISABLE) {
0560 input_report_abs(inputdev,
0561 ABS_TILT_Y,
0562 aiptek->curSetting.yTilt);
0563 }
0564
0565
0566
0567
0568 if (aiptek->curSetting.wheel !=
0569 AIPTEK_WHEEL_DISABLE) {
0570 input_report_abs(inputdev,
0571 ABS_WHEEL,
0572 aiptek->curSetting.wheel);
0573 aiptek->curSetting.wheel = AIPTEK_WHEEL_DISABLE;
0574 }
0575 }
0576 input_report_abs(inputdev, ABS_MISC, p | AIPTEK_REPORT_TOOL_STYLUS);
0577 if (aiptek->lastMacro != -1) {
0578 input_report_key(inputdev,
0579 macroKeyEvents[aiptek->lastMacro], 0);
0580 aiptek->lastMacro = -1;
0581 }
0582 input_sync(inputdev);
0583 }
0584 }
0585 }
0586
0587
0588 else if (data[0] == 3) {
0589 if (aiptek->curSetting.coordinateMode == AIPTEK_COORDINATE_RELATIVE_MODE) {
0590 aiptek->diagnostic = AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE;
0591 } else if (!AIPTEK_POINTER_ALLOW_MOUSE_MODE
0592 (aiptek->curSetting.pointerMode)) {
0593 aiptek->diagnostic = AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED;
0594 } else {
0595 x = get_unaligned_le16(data + 1);
0596 y = get_unaligned_le16(data + 3);
0597
0598 jitterable = data[5] & 0x1c;
0599
0600 dv = (data[5] & 0x01) != 0 ? 1 : 0;
0601 p = (data[5] & 0x02) != 0 ? 1 : 0;
0602 left = (data[5] & aiptek->curSetting.mouseButtonLeft) != 0 ? 1 : 0;
0603 right = (data[5] & aiptek->curSetting.mouseButtonRight) != 0 ? 1 : 0;
0604 middle = (data[5] & aiptek->curSetting.mouseButtonMiddle) != 0 ? 1 : 0;
0605
0606 if (dv != 0) {
0607
0608
0609
0610 if (aiptek->previousToolMode !=
0611 aiptek->curSetting.toolMode) {
0612 input_report_key(inputdev,
0613 aiptek->previousToolMode, 0);
0614 input_report_key(inputdev,
0615 aiptek->curSetting.toolMode,
0616 1);
0617 aiptek->previousToolMode =
0618 aiptek->curSetting.toolMode;
0619 }
0620
0621 if (p != 0) {
0622 input_report_abs(inputdev, ABS_X, x);
0623 input_report_abs(inputdev, ABS_Y, y);
0624
0625 input_report_key(inputdev, BTN_LEFT, left);
0626 input_report_key(inputdev, BTN_MIDDLE, middle);
0627 input_report_key(inputdev, BTN_RIGHT, right);
0628
0629
0630
0631
0632 if (aiptek->curSetting.wheel != AIPTEK_WHEEL_DISABLE) {
0633 input_report_abs(inputdev,
0634 ABS_WHEEL,
0635 aiptek->curSetting.wheel);
0636 aiptek->curSetting.wheel = AIPTEK_WHEEL_DISABLE;
0637 }
0638 }
0639 input_report_abs(inputdev, ABS_MISC, p | AIPTEK_REPORT_TOOL_MOUSE);
0640 if (aiptek->lastMacro != -1) {
0641 input_report_key(inputdev,
0642 macroKeyEvents[aiptek->lastMacro], 0);
0643 aiptek->lastMacro = -1;
0644 }
0645 input_sync(inputdev);
0646 }
0647 }
0648 }
0649
0650
0651 else if (data[0] == 4) {
0652 jitterable = data[1] & 0x18;
0653
0654 dv = (data[1] & 0x01) != 0 ? 1 : 0;
0655 p = (data[1] & 0x02) != 0 ? 1 : 0;
0656 tip = (data[1] & 0x04) != 0 ? 1 : 0;
0657 bs = (data[1] & aiptek->curSetting.stylusButtonLower) != 0 ? 1 : 0;
0658 pck = (data[1] & aiptek->curSetting.stylusButtonUpper) != 0 ? 1 : 0;
0659
0660 macro = dv && p && tip && !(data[3] & 1) ? (data[3] >> 1) : -1;
0661 z = get_unaligned_le16(data + 4);
0662
0663 if (dv) {
0664
0665
0666
0667 if (aiptek->previousToolMode !=
0668 aiptek->curSetting.toolMode) {
0669 input_report_key(inputdev,
0670 aiptek->previousToolMode, 0);
0671 input_report_key(inputdev,
0672 aiptek->curSetting.toolMode,
0673 1);
0674 aiptek->previousToolMode =
0675 aiptek->curSetting.toolMode;
0676 }
0677 }
0678
0679 if (aiptek->lastMacro != -1 && aiptek->lastMacro != macro) {
0680 input_report_key(inputdev, macroKeyEvents[aiptek->lastMacro], 0);
0681 aiptek->lastMacro = -1;
0682 }
0683
0684 if (macro != -1 && macro != aiptek->lastMacro) {
0685 input_report_key(inputdev, macroKeyEvents[macro], 1);
0686 aiptek->lastMacro = macro;
0687 }
0688 input_report_abs(inputdev, ABS_MISC,
0689 p | AIPTEK_REPORT_TOOL_STYLUS);
0690 input_sync(inputdev);
0691 }
0692
0693
0694 else if (data[0] == 5) {
0695 jitterable = data[1] & 0x1c;
0696
0697 dv = (data[1] & 0x01) != 0 ? 1 : 0;
0698 p = (data[1] & 0x02) != 0 ? 1 : 0;
0699 left = (data[1]& aiptek->curSetting.mouseButtonLeft) != 0 ? 1 : 0;
0700 right = (data[1] & aiptek->curSetting.mouseButtonRight) != 0 ? 1 : 0;
0701 middle = (data[1] & aiptek->curSetting.mouseButtonMiddle) != 0 ? 1 : 0;
0702 macro = dv && p && left && !(data[3] & 1) ? (data[3] >> 1) : 0;
0703
0704 if (dv) {
0705
0706
0707
0708 if (aiptek->previousToolMode !=
0709 aiptek->curSetting.toolMode) {
0710 input_report_key(inputdev,
0711 aiptek->previousToolMode, 0);
0712 input_report_key(inputdev,
0713 aiptek->curSetting.toolMode, 1);
0714 aiptek->previousToolMode = aiptek->curSetting.toolMode;
0715 }
0716 }
0717
0718 if (aiptek->lastMacro != -1 && aiptek->lastMacro != macro) {
0719 input_report_key(inputdev, macroKeyEvents[aiptek->lastMacro], 0);
0720 aiptek->lastMacro = -1;
0721 }
0722
0723 if (macro != -1 && macro != aiptek->lastMacro) {
0724 input_report_key(inputdev, macroKeyEvents[macro], 1);
0725 aiptek->lastMacro = macro;
0726 }
0727
0728 input_report_abs(inputdev, ABS_MISC,
0729 p | AIPTEK_REPORT_TOOL_MOUSE);
0730 input_sync(inputdev);
0731 }
0732
0733
0734
0735
0736
0737
0738 else if (data[0] == 6) {
0739 macro = get_unaligned_le16(data + 1);
0740 if (macro > 0) {
0741 input_report_key(inputdev, macroKeyEvents[macro - 1],
0742 0);
0743 }
0744 if (macro < 25) {
0745 input_report_key(inputdev, macroKeyEvents[macro + 1],
0746 0);
0747 }
0748
0749
0750
0751
0752 if (aiptek->previousToolMode !=
0753 aiptek->curSetting.toolMode) {
0754 input_report_key(inputdev,
0755 aiptek->previousToolMode, 0);
0756 input_report_key(inputdev,
0757 aiptek->curSetting.toolMode,
0758 1);
0759 aiptek->previousToolMode =
0760 aiptek->curSetting.toolMode;
0761 }
0762
0763 input_report_key(inputdev, macroKeyEvents[macro], 1);
0764 input_report_abs(inputdev, ABS_MISC,
0765 1 | AIPTEK_REPORT_TOOL_UNKNOWN);
0766 input_sync(inputdev);
0767 } else {
0768 dev_dbg(&intf->dev, "Unknown report %d\n", data[0]);
0769 }
0770
0771
0772
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783 if (aiptek->previousJitterable != jitterable &&
0784 aiptek->curSetting.jitterDelay != 0 && aiptek->inDelay != 1) {
0785 aiptek->endDelay = jiffies +
0786 ((aiptek->curSetting.jitterDelay * HZ) / 1000);
0787 aiptek->inDelay = 1;
0788 }
0789 aiptek->previousJitterable = jitterable;
0790
0791 exit:
0792 retval = usb_submit_urb(urb, GFP_ATOMIC);
0793 if (retval != 0) {
0794 dev_err(&intf->dev,
0795 "%s - usb_submit_urb failed with result %d\n",
0796 __func__, retval);
0797 }
0798 }
0799
0800
0801
0802
0803
0804
0805
0806
0807
0808 static const struct usb_device_id aiptek_ids[] = {
0809 {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x01)},
0810 {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x10)},
0811 {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x20)},
0812 {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x21)},
0813 {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x22)},
0814 {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x23)},
0815 {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x24)},
0816 {USB_DEVICE(USB_VENDOR_ID_KYE, 0x5003)},
0817 {}
0818 };
0819
0820 MODULE_DEVICE_TABLE(usb, aiptek_ids);
0821
0822
0823
0824
0825 static int aiptek_open(struct input_dev *inputdev)
0826 {
0827 struct aiptek *aiptek = input_get_drvdata(inputdev);
0828
0829 aiptek->urb->dev = interface_to_usbdev(aiptek->intf);
0830 if (usb_submit_urb(aiptek->urb, GFP_KERNEL) != 0)
0831 return -EIO;
0832
0833 return 0;
0834 }
0835
0836
0837
0838
0839 static void aiptek_close(struct input_dev *inputdev)
0840 {
0841 struct aiptek *aiptek = input_get_drvdata(inputdev);
0842
0843 usb_kill_urb(aiptek->urb);
0844 }
0845
0846
0847
0848
0849
0850 static int
0851 aiptek_set_report(struct aiptek *aiptek,
0852 unsigned char report_type,
0853 unsigned char report_id, void *buffer, int size)
0854 {
0855 struct usb_device *udev = interface_to_usbdev(aiptek->intf);
0856
0857 return usb_control_msg(udev,
0858 usb_sndctrlpipe(udev, 0),
0859 USB_REQ_SET_REPORT,
0860 USB_TYPE_CLASS | USB_RECIP_INTERFACE |
0861 USB_DIR_OUT, (report_type << 8) + report_id,
0862 aiptek->ifnum, buffer, size, 5000);
0863 }
0864
0865 static int
0866 aiptek_get_report(struct aiptek *aiptek,
0867 unsigned char report_type,
0868 unsigned char report_id, void *buffer, int size)
0869 {
0870 struct usb_device *udev = interface_to_usbdev(aiptek->intf);
0871
0872 return usb_control_msg(udev,
0873 usb_rcvctrlpipe(udev, 0),
0874 USB_REQ_GET_REPORT,
0875 USB_TYPE_CLASS | USB_RECIP_INTERFACE |
0876 USB_DIR_IN, (report_type << 8) + report_id,
0877 aiptek->ifnum, buffer, size, 5000);
0878 }
0879
0880
0881
0882
0883 static int
0884 aiptek_command(struct aiptek *aiptek, unsigned char command, unsigned char data)
0885 {
0886 const int sizeof_buf = 3 * sizeof(u8);
0887 int ret;
0888 u8 *buf;
0889
0890 buf = kmalloc(sizeof_buf, GFP_KERNEL);
0891 if (!buf)
0892 return -ENOMEM;
0893
0894 buf[0] = 2;
0895 buf[1] = command;
0896 buf[2] = data;
0897
0898 if ((ret =
0899 aiptek_set_report(aiptek, 3, 2, buf, sizeof_buf)) != sizeof_buf) {
0900 dev_dbg(&aiptek->intf->dev,
0901 "aiptek_program: failed, tried to send: 0x%02x 0x%02x\n",
0902 command, data);
0903 }
0904 kfree(buf);
0905 return ret < 0 ? ret : 0;
0906 }
0907
0908
0909
0910
0911
0912
0913 static int
0914 aiptek_query(struct aiptek *aiptek, unsigned char command, unsigned char data)
0915 {
0916 const int sizeof_buf = 3 * sizeof(u8);
0917 int ret;
0918 u8 *buf;
0919
0920 buf = kmalloc(sizeof_buf, GFP_KERNEL);
0921 if (!buf)
0922 return -ENOMEM;
0923
0924 buf[0] = 2;
0925 buf[1] = command;
0926 buf[2] = data;
0927
0928 if (aiptek_command(aiptek, command, data) != 0) {
0929 kfree(buf);
0930 return -EIO;
0931 }
0932 msleep(aiptek->curSetting.programmableDelay);
0933
0934 if (aiptek_get_report(aiptek, 3, 2, buf, sizeof_buf) != sizeof_buf) {
0935 dev_dbg(&aiptek->intf->dev,
0936 "aiptek_query failed: returned 0x%02x 0x%02x 0x%02x\n",
0937 buf[0], buf[1], buf[2]);
0938 ret = -EIO;
0939 } else {
0940 ret = get_unaligned_le16(buf + 1);
0941 }
0942 kfree(buf);
0943 return ret;
0944 }
0945
0946
0947
0948
0949
0950 static int aiptek_program_tablet(struct aiptek *aiptek)
0951 {
0952 int ret;
0953
0954 if ((ret = aiptek_command(aiptek, 0x18, 0x04)) < 0)
0955 return ret;
0956
0957
0958 if ((ret = aiptek_query(aiptek, 0x02, 0x00)) < 0)
0959 return ret;
0960 aiptek->features.modelCode = ret & 0xff;
0961
0962
0963 if ((ret = aiptek_query(aiptek, 0x03, 0x00)) < 0)
0964 return ret;
0965 aiptek->features.odmCode = ret;
0966
0967
0968 if ((ret = aiptek_query(aiptek, 0x04, 0x00)) < 0)
0969 return ret;
0970 aiptek->features.firmwareCode = ret;
0971
0972
0973 if ((ret = aiptek_query(aiptek, 0x01, 0x00)) < 0)
0974 return ret;
0975 input_set_abs_params(aiptek->inputdev, ABS_X, 0, ret - 1, 0, 0);
0976
0977
0978 if ((ret = aiptek_query(aiptek, 0x01, 0x01)) < 0)
0979 return ret;
0980 input_set_abs_params(aiptek->inputdev, ABS_Y, 0, ret - 1, 0, 0);
0981
0982
0983 if ((ret = aiptek_query(aiptek, 0x08, 0x00)) < 0)
0984 return ret;
0985 input_set_abs_params(aiptek->inputdev, ABS_PRESSURE, 0, ret - 1, 0, 0);
0986
0987
0988
0989
0990 if (aiptek->curSetting.coordinateMode ==
0991 AIPTEK_COORDINATE_ABSOLUTE_MODE) {
0992
0993 if ((ret = aiptek_command(aiptek, 0x10, 0x01)) < 0) {
0994 return ret;
0995 }
0996 } else {
0997
0998 if ((ret = aiptek_command(aiptek, 0x10, 0x00)) < 0) {
0999 return ret;
1000 }
1001 }
1002
1003
1004 if ((ret = aiptek_command(aiptek, 0x11, 0x02)) < 0)
1005 return ret;
1006 #if 0
1007
1008 if ((ret = aiptek_command(aiptek, 0x17, 0x00)) < 0)
1009 return ret;
1010 #endif
1011
1012
1013 if ((ret = aiptek_command(aiptek, 0x12, 0xff)) < 0)
1014 return ret;
1015
1016
1017
1018 aiptek->diagnostic = AIPTEK_DIAGNOSTIC_NA;
1019 aiptek->eventCount = 0;
1020
1021 return 0;
1022 }
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034 static ssize_t show_tabletSize(struct device *dev, struct device_attribute *attr, char *buf)
1035 {
1036 struct aiptek *aiptek = dev_get_drvdata(dev);
1037
1038 return sysfs_emit(buf, "%dx%d\n",
1039 input_abs_get_max(aiptek->inputdev, ABS_X) + 1,
1040 input_abs_get_max(aiptek->inputdev, ABS_Y) + 1);
1041 }
1042
1043
1044
1045
1046
1047
1048
1049 static DEVICE_ATTR(size, S_IRUGO, show_tabletSize, NULL);
1050
1051
1052
1053
1054
1055 static struct aiptek_map pointer_mode_map[] = {
1056 { "stylus", AIPTEK_POINTER_ONLY_STYLUS_MODE },
1057 { "mouse", AIPTEK_POINTER_ONLY_MOUSE_MODE },
1058 { "either", AIPTEK_POINTER_EITHER_MODE },
1059 { NULL, AIPTEK_INVALID_VALUE }
1060 };
1061
1062 static ssize_t show_tabletPointerMode(struct device *dev, struct device_attribute *attr, char *buf)
1063 {
1064 struct aiptek *aiptek = dev_get_drvdata(dev);
1065
1066 return sysfs_emit(buf, "%s\n", map_val_to_str(pointer_mode_map,
1067 aiptek->curSetting.pointerMode));
1068 }
1069
1070 static ssize_t
1071 store_tabletPointerMode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1072 {
1073 struct aiptek *aiptek = dev_get_drvdata(dev);
1074 int new_mode = map_str_to_val(pointer_mode_map, buf, count);
1075
1076 if (new_mode == AIPTEK_INVALID_VALUE)
1077 return -EINVAL;
1078
1079 aiptek->newSetting.pointerMode = new_mode;
1080 return count;
1081 }
1082
1083 static DEVICE_ATTR(pointer_mode,
1084 S_IRUGO | S_IWUSR,
1085 show_tabletPointerMode, store_tabletPointerMode);
1086
1087
1088
1089
1090
1091
1092 static struct aiptek_map coordinate_mode_map[] = {
1093 { "absolute", AIPTEK_COORDINATE_ABSOLUTE_MODE },
1094 { "relative", AIPTEK_COORDINATE_RELATIVE_MODE },
1095 { NULL, AIPTEK_INVALID_VALUE }
1096 };
1097
1098 static ssize_t show_tabletCoordinateMode(struct device *dev, struct device_attribute *attr, char *buf)
1099 {
1100 struct aiptek *aiptek = dev_get_drvdata(dev);
1101
1102 return sysfs_emit(buf, "%s\n", map_val_to_str(coordinate_mode_map,
1103 aiptek->curSetting.coordinateMode));
1104 }
1105
1106 static ssize_t
1107 store_tabletCoordinateMode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1108 {
1109 struct aiptek *aiptek = dev_get_drvdata(dev);
1110 int new_mode = map_str_to_val(coordinate_mode_map, buf, count);
1111
1112 if (new_mode == AIPTEK_INVALID_VALUE)
1113 return -EINVAL;
1114
1115 aiptek->newSetting.coordinateMode = new_mode;
1116 return count;
1117 }
1118
1119 static DEVICE_ATTR(coordinate_mode,
1120 S_IRUGO | S_IWUSR,
1121 show_tabletCoordinateMode, store_tabletCoordinateMode);
1122
1123
1124
1125
1126
1127
1128 static struct aiptek_map tool_mode_map[] = {
1129 { "mouse", AIPTEK_TOOL_BUTTON_MOUSE_MODE },
1130 { "eraser", AIPTEK_TOOL_BUTTON_ERASER_MODE },
1131 { "pencil", AIPTEK_TOOL_BUTTON_PENCIL_MODE },
1132 { "pen", AIPTEK_TOOL_BUTTON_PEN_MODE },
1133 { "brush", AIPTEK_TOOL_BUTTON_BRUSH_MODE },
1134 { "airbrush", AIPTEK_TOOL_BUTTON_AIRBRUSH_MODE },
1135 { "lens", AIPTEK_TOOL_BUTTON_LENS_MODE },
1136 { NULL, AIPTEK_INVALID_VALUE }
1137 };
1138
1139 static ssize_t show_tabletToolMode(struct device *dev, struct device_attribute *attr, char *buf)
1140 {
1141 struct aiptek *aiptek = dev_get_drvdata(dev);
1142
1143 return sysfs_emit(buf, "%s\n", map_val_to_str(tool_mode_map,
1144 aiptek->curSetting.toolMode));
1145 }
1146
1147 static ssize_t
1148 store_tabletToolMode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1149 {
1150 struct aiptek *aiptek = dev_get_drvdata(dev);
1151 int new_mode = map_str_to_val(tool_mode_map, buf, count);
1152
1153 if (new_mode == AIPTEK_INVALID_VALUE)
1154 return -EINVAL;
1155
1156 aiptek->newSetting.toolMode = new_mode;
1157 return count;
1158 }
1159
1160 static DEVICE_ATTR(tool_mode,
1161 S_IRUGO | S_IWUSR,
1162 show_tabletToolMode, store_tabletToolMode);
1163
1164
1165
1166
1167
1168 static ssize_t show_tabletXtilt(struct device *dev, struct device_attribute *attr, char *buf)
1169 {
1170 struct aiptek *aiptek = dev_get_drvdata(dev);
1171
1172 if (aiptek->curSetting.xTilt == AIPTEK_TILT_DISABLE) {
1173 return sysfs_emit(buf, "disable\n");
1174 } else {
1175 return sysfs_emit(buf, "%d\n", aiptek->curSetting.xTilt);
1176 }
1177 }
1178
1179 static ssize_t
1180 store_tabletXtilt(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1181 {
1182 struct aiptek *aiptek = dev_get_drvdata(dev);
1183 int x;
1184
1185 if (kstrtoint(buf, 10, &x)) {
1186 size_t len = buf[count - 1] == '\n' ? count - 1 : count;
1187
1188 if (strncmp(buf, "disable", len))
1189 return -EINVAL;
1190
1191 aiptek->newSetting.xTilt = AIPTEK_TILT_DISABLE;
1192 } else {
1193 if (x < AIPTEK_TILT_MIN || x > AIPTEK_TILT_MAX)
1194 return -EINVAL;
1195
1196 aiptek->newSetting.xTilt = x;
1197 }
1198
1199 return count;
1200 }
1201
1202 static DEVICE_ATTR(xtilt,
1203 S_IRUGO | S_IWUSR, show_tabletXtilt, store_tabletXtilt);
1204
1205
1206
1207
1208
1209 static ssize_t show_tabletYtilt(struct device *dev, struct device_attribute *attr, char *buf)
1210 {
1211 struct aiptek *aiptek = dev_get_drvdata(dev);
1212
1213 if (aiptek->curSetting.yTilt == AIPTEK_TILT_DISABLE) {
1214 return sysfs_emit(buf, "disable\n");
1215 } else {
1216 return sysfs_emit(buf, "%d\n", aiptek->curSetting.yTilt);
1217 }
1218 }
1219
1220 static ssize_t
1221 store_tabletYtilt(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1222 {
1223 struct aiptek *aiptek = dev_get_drvdata(dev);
1224 int y;
1225
1226 if (kstrtoint(buf, 10, &y)) {
1227 size_t len = buf[count - 1] == '\n' ? count - 1 : count;
1228
1229 if (strncmp(buf, "disable", len))
1230 return -EINVAL;
1231
1232 aiptek->newSetting.yTilt = AIPTEK_TILT_DISABLE;
1233 } else {
1234 if (y < AIPTEK_TILT_MIN || y > AIPTEK_TILT_MAX)
1235 return -EINVAL;
1236
1237 aiptek->newSetting.yTilt = y;
1238 }
1239
1240 return count;
1241 }
1242
1243 static DEVICE_ATTR(ytilt,
1244 S_IRUGO | S_IWUSR, show_tabletYtilt, store_tabletYtilt);
1245
1246
1247
1248
1249
1250 static ssize_t show_tabletJitterDelay(struct device *dev, struct device_attribute *attr, char *buf)
1251 {
1252 struct aiptek *aiptek = dev_get_drvdata(dev);
1253
1254 return sysfs_emit(buf, "%d\n", aiptek->curSetting.jitterDelay);
1255 }
1256
1257 static ssize_t
1258 store_tabletJitterDelay(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1259 {
1260 struct aiptek *aiptek = dev_get_drvdata(dev);
1261 int err, j;
1262
1263 err = kstrtoint(buf, 10, &j);
1264 if (err)
1265 return err;
1266
1267 aiptek->newSetting.jitterDelay = j;
1268 return count;
1269 }
1270
1271 static DEVICE_ATTR(jitter,
1272 S_IRUGO | S_IWUSR,
1273 show_tabletJitterDelay, store_tabletJitterDelay);
1274
1275
1276
1277
1278
1279 static ssize_t show_tabletProgrammableDelay(struct device *dev, struct device_attribute *attr, char *buf)
1280 {
1281 struct aiptek *aiptek = dev_get_drvdata(dev);
1282
1283 return sysfs_emit(buf, "%d\n", aiptek->curSetting.programmableDelay);
1284 }
1285
1286 static ssize_t
1287 store_tabletProgrammableDelay(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1288 {
1289 struct aiptek *aiptek = dev_get_drvdata(dev);
1290 int err, d;
1291
1292 err = kstrtoint(buf, 10, &d);
1293 if (err)
1294 return err;
1295
1296 aiptek->newSetting.programmableDelay = d;
1297 return count;
1298 }
1299
1300 static DEVICE_ATTR(delay,
1301 S_IRUGO | S_IWUSR,
1302 show_tabletProgrammableDelay, store_tabletProgrammableDelay);
1303
1304
1305
1306
1307
1308 static ssize_t show_tabletEventsReceived(struct device *dev, struct device_attribute *attr, char *buf)
1309 {
1310 struct aiptek *aiptek = dev_get_drvdata(dev);
1311
1312 return sysfs_emit(buf, "%ld\n", aiptek->eventCount);
1313 }
1314
1315 static DEVICE_ATTR(event_count, S_IRUGO, show_tabletEventsReceived, NULL);
1316
1317
1318
1319
1320
1321 static ssize_t show_tabletDiagnosticMessage(struct device *dev, struct device_attribute *attr, char *buf)
1322 {
1323 struct aiptek *aiptek = dev_get_drvdata(dev);
1324 char *retMsg;
1325
1326 switch (aiptek->diagnostic) {
1327 case AIPTEK_DIAGNOSTIC_NA:
1328 retMsg = "no errors\n";
1329 break;
1330
1331 case AIPTEK_DIAGNOSTIC_SENDING_RELATIVE_IN_ABSOLUTE:
1332 retMsg = "Error: receiving relative reports\n";
1333 break;
1334
1335 case AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE:
1336 retMsg = "Error: receiving absolute reports\n";
1337 break;
1338
1339 case AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED:
1340 if (aiptek->curSetting.pointerMode ==
1341 AIPTEK_POINTER_ONLY_MOUSE_MODE) {
1342 retMsg = "Error: receiving stylus reports\n";
1343 } else {
1344 retMsg = "Error: receiving mouse reports\n";
1345 }
1346 break;
1347
1348 default:
1349 return 0;
1350 }
1351 return sysfs_emit(buf, retMsg);
1352 }
1353
1354 static DEVICE_ATTR(diagnostic, S_IRUGO, show_tabletDiagnosticMessage, NULL);
1355
1356
1357
1358
1359
1360
1361 static struct aiptek_map stylus_button_map[] = {
1362 { "upper", AIPTEK_STYLUS_UPPER_BUTTON },
1363 { "lower", AIPTEK_STYLUS_LOWER_BUTTON },
1364 { NULL, AIPTEK_INVALID_VALUE }
1365 };
1366
1367 static ssize_t show_tabletStylusUpper(struct device *dev, struct device_attribute *attr, char *buf)
1368 {
1369 struct aiptek *aiptek = dev_get_drvdata(dev);
1370
1371 return sysfs_emit(buf, "%s\n", map_val_to_str(stylus_button_map,
1372 aiptek->curSetting.stylusButtonUpper));
1373 }
1374
1375 static ssize_t
1376 store_tabletStylusUpper(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1377 {
1378 struct aiptek *aiptek = dev_get_drvdata(dev);
1379 int new_button = map_str_to_val(stylus_button_map, buf, count);
1380
1381 if (new_button == AIPTEK_INVALID_VALUE)
1382 return -EINVAL;
1383
1384 aiptek->newSetting.stylusButtonUpper = new_button;
1385 return count;
1386 }
1387
1388 static DEVICE_ATTR(stylus_upper,
1389 S_IRUGO | S_IWUSR,
1390 show_tabletStylusUpper, store_tabletStylusUpper);
1391
1392
1393
1394
1395
1396
1397 static ssize_t show_tabletStylusLower(struct device *dev, struct device_attribute *attr, char *buf)
1398 {
1399 struct aiptek *aiptek = dev_get_drvdata(dev);
1400
1401 return sysfs_emit(buf, "%s\n", map_val_to_str(stylus_button_map,
1402 aiptek->curSetting.stylusButtonLower));
1403 }
1404
1405 static ssize_t
1406 store_tabletStylusLower(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1407 {
1408 struct aiptek *aiptek = dev_get_drvdata(dev);
1409 int new_button = map_str_to_val(stylus_button_map, buf, count);
1410
1411 if (new_button == AIPTEK_INVALID_VALUE)
1412 return -EINVAL;
1413
1414 aiptek->newSetting.stylusButtonLower = new_button;
1415 return count;
1416 }
1417
1418 static DEVICE_ATTR(stylus_lower,
1419 S_IRUGO | S_IWUSR,
1420 show_tabletStylusLower, store_tabletStylusLower);
1421
1422
1423
1424
1425
1426
1427 static struct aiptek_map mouse_button_map[] = {
1428 { "left", AIPTEK_MOUSE_LEFT_BUTTON },
1429 { "middle", AIPTEK_MOUSE_MIDDLE_BUTTON },
1430 { "right", AIPTEK_MOUSE_RIGHT_BUTTON },
1431 { NULL, AIPTEK_INVALID_VALUE }
1432 };
1433
1434 static ssize_t show_tabletMouseLeft(struct device *dev, struct device_attribute *attr, char *buf)
1435 {
1436 struct aiptek *aiptek = dev_get_drvdata(dev);
1437
1438 return sysfs_emit(buf, "%s\n", map_val_to_str(mouse_button_map,
1439 aiptek->curSetting.mouseButtonLeft));
1440 }
1441
1442 static ssize_t
1443 store_tabletMouseLeft(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1444 {
1445 struct aiptek *aiptek = dev_get_drvdata(dev);
1446 int new_button = map_str_to_val(mouse_button_map, buf, count);
1447
1448 if (new_button == AIPTEK_INVALID_VALUE)
1449 return -EINVAL;
1450
1451 aiptek->newSetting.mouseButtonLeft = new_button;
1452 return count;
1453 }
1454
1455 static DEVICE_ATTR(mouse_left,
1456 S_IRUGO | S_IWUSR,
1457 show_tabletMouseLeft, store_tabletMouseLeft);
1458
1459
1460
1461
1462
1463 static ssize_t show_tabletMouseMiddle(struct device *dev, struct device_attribute *attr, char *buf)
1464 {
1465 struct aiptek *aiptek = dev_get_drvdata(dev);
1466
1467 return sysfs_emit(buf, "%s\n", map_val_to_str(mouse_button_map,
1468 aiptek->curSetting.mouseButtonMiddle));
1469 }
1470
1471 static ssize_t
1472 store_tabletMouseMiddle(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1473 {
1474 struct aiptek *aiptek = dev_get_drvdata(dev);
1475 int new_button = map_str_to_val(mouse_button_map, buf, count);
1476
1477 if (new_button == AIPTEK_INVALID_VALUE)
1478 return -EINVAL;
1479
1480 aiptek->newSetting.mouseButtonMiddle = new_button;
1481 return count;
1482 }
1483
1484 static DEVICE_ATTR(mouse_middle,
1485 S_IRUGO | S_IWUSR,
1486 show_tabletMouseMiddle, store_tabletMouseMiddle);
1487
1488
1489
1490
1491
1492 static ssize_t show_tabletMouseRight(struct device *dev, struct device_attribute *attr, char *buf)
1493 {
1494 struct aiptek *aiptek = dev_get_drvdata(dev);
1495
1496 return sysfs_emit(buf, "%s\n", map_val_to_str(mouse_button_map,
1497 aiptek->curSetting.mouseButtonRight));
1498 }
1499
1500 static ssize_t
1501 store_tabletMouseRight(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1502 {
1503 struct aiptek *aiptek = dev_get_drvdata(dev);
1504 int new_button = map_str_to_val(mouse_button_map, buf, count);
1505
1506 if (new_button == AIPTEK_INVALID_VALUE)
1507 return -EINVAL;
1508
1509 aiptek->newSetting.mouseButtonRight = new_button;
1510 return count;
1511 }
1512
1513 static DEVICE_ATTR(mouse_right,
1514 S_IRUGO | S_IWUSR,
1515 show_tabletMouseRight, store_tabletMouseRight);
1516
1517
1518
1519
1520
1521 static ssize_t show_tabletWheel(struct device *dev, struct device_attribute *attr, char *buf)
1522 {
1523 struct aiptek *aiptek = dev_get_drvdata(dev);
1524
1525 if (aiptek->curSetting.wheel == AIPTEK_WHEEL_DISABLE) {
1526 return sysfs_emit(buf, "disable\n");
1527 } else {
1528 return sysfs_emit(buf, "%d\n", aiptek->curSetting.wheel);
1529 }
1530 }
1531
1532 static ssize_t
1533 store_tabletWheel(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1534 {
1535 struct aiptek *aiptek = dev_get_drvdata(dev);
1536 int err, w;
1537
1538 err = kstrtoint(buf, 10, &w);
1539 if (err)
1540 return err;
1541
1542 aiptek->newSetting.wheel = w;
1543 return count;
1544 }
1545
1546 static DEVICE_ATTR(wheel,
1547 S_IRUGO | S_IWUSR, show_tabletWheel, store_tabletWheel);
1548
1549
1550
1551
1552
1553 static ssize_t show_tabletExecute(struct device *dev, struct device_attribute *attr, char *buf)
1554 {
1555
1556
1557
1558 return sysfs_emit(buf, "Write anything to this file to program your tablet.\n");
1559 }
1560
1561 static ssize_t
1562 store_tabletExecute(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1563 {
1564 struct aiptek *aiptek = dev_get_drvdata(dev);
1565
1566
1567
1568
1569 memcpy(&aiptek->curSetting, &aiptek->newSetting,
1570 sizeof(struct aiptek_settings));
1571
1572 if (aiptek_program_tablet(aiptek) < 0)
1573 return -EIO;
1574
1575 return count;
1576 }
1577
1578 static DEVICE_ATTR(execute,
1579 S_IRUGO | S_IWUSR, show_tabletExecute, store_tabletExecute);
1580
1581
1582
1583
1584
1585 static ssize_t show_tabletODMCode(struct device *dev, struct device_attribute *attr, char *buf)
1586 {
1587 struct aiptek *aiptek = dev_get_drvdata(dev);
1588
1589 return sysfs_emit(buf, "0x%04x\n", aiptek->features.odmCode);
1590 }
1591
1592 static DEVICE_ATTR(odm_code, S_IRUGO, show_tabletODMCode, NULL);
1593
1594
1595
1596
1597
1598 static ssize_t show_tabletModelCode(struct device *dev, struct device_attribute *attr, char *buf)
1599 {
1600 struct aiptek *aiptek = dev_get_drvdata(dev);
1601
1602 return sysfs_emit(buf, "0x%04x\n", aiptek->features.modelCode);
1603 }
1604
1605 static DEVICE_ATTR(model_code, S_IRUGO, show_tabletModelCode, NULL);
1606
1607
1608
1609
1610
1611 static ssize_t show_firmwareCode(struct device *dev, struct device_attribute *attr, char *buf)
1612 {
1613 struct aiptek *aiptek = dev_get_drvdata(dev);
1614
1615 return sysfs_emit(buf, "%04x\n", aiptek->features.firmwareCode);
1616 }
1617
1618 static DEVICE_ATTR(firmware_code, S_IRUGO, show_firmwareCode, NULL);
1619
1620 static struct attribute *aiptek_attributes[] = {
1621 &dev_attr_size.attr,
1622 &dev_attr_pointer_mode.attr,
1623 &dev_attr_coordinate_mode.attr,
1624 &dev_attr_tool_mode.attr,
1625 &dev_attr_xtilt.attr,
1626 &dev_attr_ytilt.attr,
1627 &dev_attr_jitter.attr,
1628 &dev_attr_delay.attr,
1629 &dev_attr_event_count.attr,
1630 &dev_attr_diagnostic.attr,
1631 &dev_attr_odm_code.attr,
1632 &dev_attr_model_code.attr,
1633 &dev_attr_firmware_code.attr,
1634 &dev_attr_stylus_lower.attr,
1635 &dev_attr_stylus_upper.attr,
1636 &dev_attr_mouse_left.attr,
1637 &dev_attr_mouse_middle.attr,
1638 &dev_attr_mouse_right.attr,
1639 &dev_attr_wheel.attr,
1640 &dev_attr_execute.attr,
1641 NULL
1642 };
1643
1644 static const struct attribute_group aiptek_attribute_group = {
1645 .attrs = aiptek_attributes,
1646 };
1647
1648
1649
1650
1651
1652 static int
1653 aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
1654 {
1655 struct usb_device *usbdev = interface_to_usbdev(intf);
1656 struct usb_endpoint_descriptor *endpoint;
1657 struct aiptek *aiptek;
1658 struct input_dev *inputdev;
1659 int i;
1660 int speeds[] = { 0,
1661 AIPTEK_PROGRAMMABLE_DELAY_50,
1662 AIPTEK_PROGRAMMABLE_DELAY_400,
1663 AIPTEK_PROGRAMMABLE_DELAY_25,
1664 AIPTEK_PROGRAMMABLE_DELAY_100,
1665 AIPTEK_PROGRAMMABLE_DELAY_200,
1666 AIPTEK_PROGRAMMABLE_DELAY_300
1667 };
1668 int err = -ENOMEM;
1669
1670
1671
1672
1673
1674
1675
1676 speeds[0] = programmableDelay;
1677
1678 aiptek = kzalloc(sizeof(struct aiptek), GFP_KERNEL);
1679 inputdev = input_allocate_device();
1680 if (!aiptek || !inputdev) {
1681 dev_warn(&intf->dev,
1682 "cannot allocate memory or input device\n");
1683 goto fail1;
1684 }
1685
1686 aiptek->data = usb_alloc_coherent(usbdev, AIPTEK_PACKET_LENGTH,
1687 GFP_KERNEL, &aiptek->data_dma);
1688 if (!aiptek->data) {
1689 dev_warn(&intf->dev, "cannot allocate usb buffer\n");
1690 goto fail1;
1691 }
1692
1693 aiptek->urb = usb_alloc_urb(0, GFP_KERNEL);
1694 if (!aiptek->urb) {
1695 dev_warn(&intf->dev, "cannot allocate urb\n");
1696 goto fail2;
1697 }
1698
1699 aiptek->inputdev = inputdev;
1700 aiptek->intf = intf;
1701 aiptek->ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
1702 aiptek->inDelay = 0;
1703 aiptek->endDelay = 0;
1704 aiptek->previousJitterable = 0;
1705 aiptek->lastMacro = -1;
1706
1707
1708
1709
1710
1711
1712
1713 aiptek->curSetting.pointerMode = AIPTEK_POINTER_EITHER_MODE;
1714 aiptek->curSetting.coordinateMode = AIPTEK_COORDINATE_ABSOLUTE_MODE;
1715 aiptek->curSetting.toolMode = AIPTEK_TOOL_BUTTON_PEN_MODE;
1716 aiptek->curSetting.xTilt = AIPTEK_TILT_DISABLE;
1717 aiptek->curSetting.yTilt = AIPTEK_TILT_DISABLE;
1718 aiptek->curSetting.mouseButtonLeft = AIPTEK_MOUSE_LEFT_BUTTON;
1719 aiptek->curSetting.mouseButtonMiddle = AIPTEK_MOUSE_MIDDLE_BUTTON;
1720 aiptek->curSetting.mouseButtonRight = AIPTEK_MOUSE_RIGHT_BUTTON;
1721 aiptek->curSetting.stylusButtonUpper = AIPTEK_STYLUS_UPPER_BUTTON;
1722 aiptek->curSetting.stylusButtonLower = AIPTEK_STYLUS_LOWER_BUTTON;
1723 aiptek->curSetting.jitterDelay = jitterDelay;
1724 aiptek->curSetting.programmableDelay = programmableDelay;
1725
1726
1727
1728 aiptek->newSetting = aiptek->curSetting;
1729
1730
1731
1732
1733
1734
1735
1736
1737 usb_make_path(usbdev, aiptek->features.usbPath,
1738 sizeof(aiptek->features.usbPath));
1739 strlcat(aiptek->features.usbPath, "/input0",
1740 sizeof(aiptek->features.usbPath));
1741
1742
1743
1744
1745 inputdev->name = "Aiptek";
1746 inputdev->phys = aiptek->features.usbPath;
1747 usb_to_input_id(usbdev, &inputdev->id);
1748 inputdev->dev.parent = &intf->dev;
1749
1750 input_set_drvdata(inputdev, aiptek);
1751
1752 inputdev->open = aiptek_open;
1753 inputdev->close = aiptek_close;
1754
1755
1756
1757
1758 for (i = 0; i < ARRAY_SIZE(eventTypes); ++i)
1759 __set_bit(eventTypes[i], inputdev->evbit);
1760
1761 for (i = 0; i < ARRAY_SIZE(absEvents); ++i)
1762 __set_bit(absEvents[i], inputdev->absbit);
1763
1764 for (i = 0; i < ARRAY_SIZE(relEvents); ++i)
1765 __set_bit(relEvents[i], inputdev->relbit);
1766
1767 __set_bit(MSC_SERIAL, inputdev->mscbit);
1768
1769
1770 for (i = 0; i < ARRAY_SIZE(buttonEvents); ++i)
1771 __set_bit(buttonEvents[i], inputdev->keybit);
1772
1773 for (i = 0; i < ARRAY_SIZE(macroKeyEvents); ++i)
1774 __set_bit(macroKeyEvents[i], inputdev->keybit);
1775
1776
1777
1778
1779
1780
1781
1782 input_set_abs_params(inputdev, ABS_X, 0, 2999, 0, 0);
1783 input_set_abs_params(inputdev, ABS_Y, 0, 2249, 0, 0);
1784 input_set_abs_params(inputdev, ABS_PRESSURE, 0, 511, 0, 0);
1785 input_set_abs_params(inputdev, ABS_TILT_X, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0);
1786 input_set_abs_params(inputdev, ABS_TILT_Y, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0);
1787 input_set_abs_params(inputdev, ABS_WHEEL, AIPTEK_WHEEL_MIN, AIPTEK_WHEEL_MAX - 1, 0, 0);
1788
1789 err = usb_find_common_endpoints(intf->cur_altsetting,
1790 NULL, NULL, &endpoint, NULL);
1791 if (err) {
1792 dev_err(&intf->dev,
1793 "interface has no int in endpoints, but must have minimum 1\n");
1794 goto fail3;
1795 }
1796
1797
1798
1799
1800 usb_fill_int_urb(aiptek->urb,
1801 usbdev,
1802 usb_rcvintpipe(usbdev,
1803 endpoint->bEndpointAddress),
1804 aiptek->data, 8, aiptek_irq, aiptek,
1805 endpoint->bInterval);
1806
1807 aiptek->urb->transfer_dma = aiptek->data_dma;
1808 aiptek->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821 for (i = 0; i < ARRAY_SIZE(speeds); ++i) {
1822 aiptek->curSetting.programmableDelay = speeds[i];
1823 (void)aiptek_program_tablet(aiptek);
1824 if (input_abs_get_max(aiptek->inputdev, ABS_X) > 0) {
1825 dev_info(&intf->dev,
1826 "Aiptek using %d ms programming speed\n",
1827 aiptek->curSetting.programmableDelay);
1828 break;
1829 }
1830 }
1831
1832
1833
1834 if (i == ARRAY_SIZE(speeds)) {
1835 dev_info(&intf->dev,
1836 "Aiptek tried all speeds, no sane response\n");
1837 err = -EINVAL;
1838 goto fail3;
1839 }
1840
1841
1842
1843 usb_set_intfdata(intf, aiptek);
1844
1845
1846
1847 err = sysfs_create_group(&intf->dev.kobj, &aiptek_attribute_group);
1848 if (err) {
1849 dev_warn(&intf->dev, "cannot create sysfs group err: %d\n",
1850 err);
1851 goto fail3;
1852 }
1853
1854
1855
1856 err = input_register_device(aiptek->inputdev);
1857 if (err) {
1858 dev_warn(&intf->dev,
1859 "input_register_device returned err: %d\n", err);
1860 goto fail4;
1861 }
1862 return 0;
1863
1864 fail4: sysfs_remove_group(&intf->dev.kobj, &aiptek_attribute_group);
1865 fail3: usb_free_urb(aiptek->urb);
1866 fail2: usb_free_coherent(usbdev, AIPTEK_PACKET_LENGTH, aiptek->data,
1867 aiptek->data_dma);
1868 fail1: usb_set_intfdata(intf, NULL);
1869 input_free_device(inputdev);
1870 kfree(aiptek);
1871 return err;
1872 }
1873
1874
1875
1876
1877 static void aiptek_disconnect(struct usb_interface *intf)
1878 {
1879 struct aiptek *aiptek = usb_get_intfdata(intf);
1880
1881
1882
1883 usb_set_intfdata(intf, NULL);
1884 if (aiptek != NULL) {
1885
1886
1887 usb_kill_urb(aiptek->urb);
1888 input_unregister_device(aiptek->inputdev);
1889 sysfs_remove_group(&intf->dev.kobj, &aiptek_attribute_group);
1890 usb_free_urb(aiptek->urb);
1891 usb_free_coherent(interface_to_usbdev(intf),
1892 AIPTEK_PACKET_LENGTH,
1893 aiptek->data, aiptek->data_dma);
1894 kfree(aiptek);
1895 }
1896 }
1897
1898 static struct usb_driver aiptek_driver = {
1899 .name = "aiptek",
1900 .probe = aiptek_probe,
1901 .disconnect = aiptek_disconnect,
1902 .id_table = aiptek_ids,
1903 };
1904
1905 module_usb_driver(aiptek_driver);
1906
1907 MODULE_AUTHOR("Bryan W. Headley/Chris Atenasio/Cedric Brun/Rene van Paassen");
1908 MODULE_DESCRIPTION("Aiptek HyperPen USB Tablet Driver");
1909 MODULE_LICENSE("GPL");
1910
1911 module_param(programmableDelay, int, 0);
1912 MODULE_PARM_DESC(programmableDelay, "delay used during tablet programming");
1913 module_param(jitterDelay, int, 0);
1914 MODULE_PARM_DESC(jitterDelay, "stylus/mouse settlement delay");