This source file includes following definitions.
- map_str_to_val
- map_val_to_str
- aiptek_irq
- aiptek_open
- aiptek_close
- aiptek_set_report
- aiptek_get_report
- aiptek_command
- aiptek_query
- aiptek_program_tablet
- show_tabletSize
- show_tabletPointerMode
- store_tabletPointerMode
- show_tabletCoordinateMode
- store_tabletCoordinateMode
- show_tabletToolMode
- store_tabletToolMode
- show_tabletXtilt
- store_tabletXtilt
- show_tabletYtilt
- store_tabletYtilt
- show_tabletJitterDelay
- store_tabletJitterDelay
- show_tabletProgrammableDelay
- store_tabletProgrammableDelay
- show_tabletEventsReceived
- show_tabletDiagnosticMessage
- show_tabletStylusUpper
- store_tabletStylusUpper
- show_tabletStylusLower
- store_tabletStylusLower
- show_tabletMouseLeft
- store_tabletMouseLeft
- show_tabletMouseMiddle
- store_tabletMouseMiddle
- show_tabletMouseRight
- store_tabletMouseRight
- show_tabletWheel
- store_tabletWheel
- show_tabletExecute
- store_tabletExecute
- show_tabletODMCode
- show_tabletModelCode
- show_firmwareCode
- aiptek_probe
- aiptek_disconnect
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 #include <linux/jiffies.h>
61 #include <linux/kernel.h>
62 #include <linux/slab.h>
63 #include <linux/module.h>
64 #include <linux/usb/input.h>
65 #include <linux/uaccess.h>
66 #include <asm/unaligned.h>
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165 #define USB_VENDOR_ID_AIPTEK 0x08ca
166 #define USB_VENDOR_ID_KYE 0x0458
167 #define USB_REQ_GET_REPORT 0x01
168 #define USB_REQ_SET_REPORT 0x09
169
170
171
172 #define AIPTEK_POINTER_ONLY_MOUSE_MODE 0
173 #define AIPTEK_POINTER_ONLY_STYLUS_MODE 1
174 #define AIPTEK_POINTER_EITHER_MODE 2
175
176 #define AIPTEK_POINTER_ALLOW_MOUSE_MODE(a) \
177 (a == AIPTEK_POINTER_ONLY_MOUSE_MODE || \
178 a == AIPTEK_POINTER_EITHER_MODE)
179 #define AIPTEK_POINTER_ALLOW_STYLUS_MODE(a) \
180 (a == AIPTEK_POINTER_ONLY_STYLUS_MODE || \
181 a == AIPTEK_POINTER_EITHER_MODE)
182
183
184
185 #define AIPTEK_COORDINATE_RELATIVE_MODE 0
186 #define AIPTEK_COORDINATE_ABSOLUTE_MODE 1
187
188
189
190 #define AIPTEK_TILT_MIN (-128)
191 #define AIPTEK_TILT_MAX 127
192 #define AIPTEK_TILT_DISABLE (-10101)
193
194
195
196 #define AIPTEK_WHEEL_MIN 0
197 #define AIPTEK_WHEEL_MAX 1024
198 #define AIPTEK_WHEEL_DISABLE (-10101)
199
200
201
202
203
204
205
206 #define AIPTEK_TOOL_BUTTON_PEN_MODE BTN_TOOL_PEN
207 #define AIPTEK_TOOL_BUTTON_PENCIL_MODE BTN_TOOL_PENCIL
208 #define AIPTEK_TOOL_BUTTON_BRUSH_MODE BTN_TOOL_BRUSH
209 #define AIPTEK_TOOL_BUTTON_AIRBRUSH_MODE BTN_TOOL_AIRBRUSH
210 #define AIPTEK_TOOL_BUTTON_ERASER_MODE BTN_TOOL_RUBBER
211 #define AIPTEK_TOOL_BUTTON_MOUSE_MODE BTN_TOOL_MOUSE
212 #define AIPTEK_TOOL_BUTTON_LENS_MODE BTN_TOOL_LENS
213
214
215
216 #define AIPTEK_DIAGNOSTIC_NA 0
217 #define AIPTEK_DIAGNOSTIC_SENDING_RELATIVE_IN_ABSOLUTE 1
218 #define AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE 2
219 #define AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED 3
220
221
222
223
224 #define AIPTEK_JITTER_DELAY_DEFAULT 50
225
226
227
228
229
230 #define AIPTEK_PROGRAMMABLE_DELAY_25 25
231 #define AIPTEK_PROGRAMMABLE_DELAY_50 50
232 #define AIPTEK_PROGRAMMABLE_DELAY_100 100
233 #define AIPTEK_PROGRAMMABLE_DELAY_200 200
234 #define AIPTEK_PROGRAMMABLE_DELAY_300 300
235 #define AIPTEK_PROGRAMMABLE_DELAY_400 400
236 #define AIPTEK_PROGRAMMABLE_DELAY_DEFAULT AIPTEK_PROGRAMMABLE_DELAY_400
237
238
239
240 #define AIPTEK_MOUSE_LEFT_BUTTON 0x04
241 #define AIPTEK_MOUSE_RIGHT_BUTTON 0x08
242 #define AIPTEK_MOUSE_MIDDLE_BUTTON 0x10
243
244
245
246 #define AIPTEK_STYLUS_LOWER_BUTTON 0x08
247 #define AIPTEK_STYLUS_UPPER_BUTTON 0x10
248
249
250
251 #define AIPTEK_PACKET_LENGTH 8
252
253
254
255
256
257
258 #define AIPTEK_REPORT_TOOL_UNKNOWN 0x10
259 #define AIPTEK_REPORT_TOOL_STYLUS 0x20
260 #define AIPTEK_REPORT_TOOL_MOUSE 0x40
261
262 static int programmableDelay = AIPTEK_PROGRAMMABLE_DELAY_DEFAULT;
263 static int jitterDelay = AIPTEK_JITTER_DELAY_DEFAULT;
264
265 struct aiptek_features {
266 int odmCode;
267 int modelCode;
268 int firmwareCode;
269 char usbPath[64 + 1];
270 };
271
272 struct aiptek_settings {
273 int pointerMode;
274 int coordinateMode;
275 int toolMode;
276 int xTilt;
277 int yTilt;
278 int wheel;
279 int stylusButtonUpper;
280 int stylusButtonLower;
281 int mouseButtonLeft;
282 int mouseButtonMiddle;
283 int mouseButtonRight;
284 int programmableDelay;
285 int jitterDelay;
286 };
287
288 struct aiptek {
289 struct input_dev *inputdev;
290 struct usb_interface *intf;
291 struct urb *urb;
292 dma_addr_t data_dma;
293 struct aiptek_features features;
294 struct aiptek_settings curSetting;
295 struct aiptek_settings newSetting;
296 unsigned int ifnum;
297 int diagnostic;
298 unsigned long eventCount;
299 int inDelay;
300 unsigned long endDelay;
301 int previousJitterable;
302
303 int lastMacro;
304 int previousToolMode;
305 unsigned char *data;
306 };
307
308 static const int eventTypes[] = {
309 EV_KEY, EV_ABS, EV_REL, EV_MSC,
310 };
311
312 static const int absEvents[] = {
313 ABS_X, ABS_Y, ABS_PRESSURE, ABS_TILT_X, ABS_TILT_Y,
314 ABS_WHEEL, ABS_MISC,
315 };
316
317 static const int relEvents[] = {
318 REL_X, REL_Y, REL_WHEEL,
319 };
320
321 static const int buttonEvents[] = {
322 BTN_LEFT, BTN_RIGHT, BTN_MIDDLE,
323 BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH,
324 BTN_TOOL_BRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOUCH,
325 BTN_STYLUS, BTN_STYLUS2,
326 };
327
328
329
330
331
332
333 static const int macroKeyEvents[] = {
334 KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5,
335 KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11,
336 KEY_F12, KEY_F13, KEY_F14, KEY_F15, KEY_F16, KEY_F17,
337 KEY_F18, KEY_F19, KEY_F20, KEY_F21, KEY_F22, KEY_F23,
338 KEY_F24, KEY_STOP, KEY_AGAIN, KEY_PROPS, KEY_UNDO,
339 KEY_FRONT, KEY_COPY, KEY_OPEN, KEY_PASTE, 0
340 };
341
342
343
344
345
346 #define AIPTEK_INVALID_VALUE -1
347
348 struct aiptek_map {
349 const char *string;
350 int value;
351 };
352
353 static int map_str_to_val(const struct aiptek_map *map, const char *str, size_t count)
354 {
355 const struct aiptek_map *p;
356
357 if (str[count - 1] == '\n')
358 count--;
359
360 for (p = map; p->string; p++)
361 if (!strncmp(str, p->string, count))
362 return p->value;
363
364 return AIPTEK_INVALID_VALUE;
365 }
366
367 static const char *map_val_to_str(const struct aiptek_map *map, int val)
368 {
369 const struct aiptek_map *p;
370
371 for (p = map; p->value != AIPTEK_INVALID_VALUE; p++)
372 if (val == p->value)
373 return p->string;
374
375 return "unknown";
376 }
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412 static void aiptek_irq(struct urb *urb)
413 {
414 struct aiptek *aiptek = urb->context;
415 unsigned char *data = aiptek->data;
416 struct input_dev *inputdev = aiptek->inputdev;
417 struct usb_interface *intf = aiptek->intf;
418 int jitterable = 0;
419 int retval, macro, x, y, z, left, right, middle, p, dv, tip, bs, pck;
420
421 switch (urb->status) {
422 case 0:
423
424 break;
425
426 case -ECONNRESET:
427 case -ENOENT:
428 case -ESHUTDOWN:
429
430 dev_dbg(&intf->dev, "%s - urb shutting down with status: %d\n",
431 __func__, urb->status);
432 return;
433
434 default:
435 dev_dbg(&intf->dev, "%s - nonzero urb status received: %d\n",
436 __func__, urb->status);
437 goto exit;
438 }
439
440
441
442 if (aiptek->inDelay == 1 && time_after(aiptek->endDelay, jiffies)) {
443 goto exit;
444 }
445
446 aiptek->inDelay = 0;
447 aiptek->eventCount++;
448
449
450
451
452
453 if (data[0] == 1) {
454 if (aiptek->curSetting.coordinateMode ==
455 AIPTEK_COORDINATE_ABSOLUTE_MODE) {
456 aiptek->diagnostic =
457 AIPTEK_DIAGNOSTIC_SENDING_RELATIVE_IN_ABSOLUTE;
458 } else {
459 x = (signed char) data[2];
460 y = (signed char) data[3];
461
462
463
464
465
466
467
468
469 jitterable = data[1] & 0x07;
470
471 left = (data[1] & aiptek->curSetting.mouseButtonLeft >> 2) != 0 ? 1 : 0;
472 right = (data[1] & aiptek->curSetting.mouseButtonRight >> 2) != 0 ? 1 : 0;
473 middle = (data[1] & aiptek->curSetting.mouseButtonMiddle >> 2) != 0 ? 1 : 0;
474
475 input_report_key(inputdev, BTN_LEFT, left);
476 input_report_key(inputdev, BTN_MIDDLE, middle);
477 input_report_key(inputdev, BTN_RIGHT, right);
478
479 input_report_abs(inputdev, ABS_MISC,
480 1 | AIPTEK_REPORT_TOOL_UNKNOWN);
481 input_report_rel(inputdev, REL_X, x);
482 input_report_rel(inputdev, REL_Y, y);
483
484
485
486
487 if (aiptek->curSetting.wheel != AIPTEK_WHEEL_DISABLE) {
488 input_report_rel(inputdev, REL_WHEEL,
489 aiptek->curSetting.wheel);
490 aiptek->curSetting.wheel = AIPTEK_WHEEL_DISABLE;
491 }
492 if (aiptek->lastMacro != -1) {
493 input_report_key(inputdev,
494 macroKeyEvents[aiptek->lastMacro], 0);
495 aiptek->lastMacro = -1;
496 }
497 input_sync(inputdev);
498 }
499 }
500
501
502
503 else if (data[0] == 2) {
504 if (aiptek->curSetting.coordinateMode == AIPTEK_COORDINATE_RELATIVE_MODE) {
505 aiptek->diagnostic = AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE;
506 } else if (!AIPTEK_POINTER_ALLOW_STYLUS_MODE
507 (aiptek->curSetting.pointerMode)) {
508 aiptek->diagnostic = AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED;
509 } else {
510 x = get_unaligned_le16(data + 1);
511 y = get_unaligned_le16(data + 3);
512 z = get_unaligned_le16(data + 6);
513
514 dv = (data[5] & 0x01) != 0 ? 1 : 0;
515 p = (data[5] & 0x02) != 0 ? 1 : 0;
516 tip = (data[5] & 0x04) != 0 ? 1 : 0;
517
518
519
520 jitterable = data[5] & 0x18;
521
522 bs = (data[5] & aiptek->curSetting.stylusButtonLower) != 0 ? 1 : 0;
523 pck = (data[5] & aiptek->curSetting.stylusButtonUpper) != 0 ? 1 : 0;
524
525
526
527
528
529 if (dv != 0) {
530
531
532
533 if (aiptek->previousToolMode !=
534 aiptek->curSetting.toolMode) {
535 input_report_key(inputdev,
536 aiptek->previousToolMode, 0);
537 input_report_key(inputdev,
538 aiptek->curSetting.toolMode,
539 1);
540 aiptek->previousToolMode =
541 aiptek->curSetting.toolMode;
542 }
543
544 if (p != 0) {
545 input_report_abs(inputdev, ABS_X, x);
546 input_report_abs(inputdev, ABS_Y, y);
547 input_report_abs(inputdev, ABS_PRESSURE, z);
548
549 input_report_key(inputdev, BTN_TOUCH, tip);
550 input_report_key(inputdev, BTN_STYLUS, bs);
551 input_report_key(inputdev, BTN_STYLUS2, pck);
552
553 if (aiptek->curSetting.xTilt !=
554 AIPTEK_TILT_DISABLE) {
555 input_report_abs(inputdev,
556 ABS_TILT_X,
557 aiptek->curSetting.xTilt);
558 }
559 if (aiptek->curSetting.yTilt != AIPTEK_TILT_DISABLE) {
560 input_report_abs(inputdev,
561 ABS_TILT_Y,
562 aiptek->curSetting.yTilt);
563 }
564
565
566
567
568 if (aiptek->curSetting.wheel !=
569 AIPTEK_WHEEL_DISABLE) {
570 input_report_abs(inputdev,
571 ABS_WHEEL,
572 aiptek->curSetting.wheel);
573 aiptek->curSetting.wheel = AIPTEK_WHEEL_DISABLE;
574 }
575 }
576 input_report_abs(inputdev, ABS_MISC, p | AIPTEK_REPORT_TOOL_STYLUS);
577 if (aiptek->lastMacro != -1) {
578 input_report_key(inputdev,
579 macroKeyEvents[aiptek->lastMacro], 0);
580 aiptek->lastMacro = -1;
581 }
582 input_sync(inputdev);
583 }
584 }
585 }
586
587
588 else if (data[0] == 3) {
589 if (aiptek->curSetting.coordinateMode == AIPTEK_COORDINATE_RELATIVE_MODE) {
590 aiptek->diagnostic = AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE;
591 } else if (!AIPTEK_POINTER_ALLOW_MOUSE_MODE
592 (aiptek->curSetting.pointerMode)) {
593 aiptek->diagnostic = AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED;
594 } else {
595 x = get_unaligned_le16(data + 1);
596 y = get_unaligned_le16(data + 3);
597
598 jitterable = data[5] & 0x1c;
599
600 dv = (data[5] & 0x01) != 0 ? 1 : 0;
601 p = (data[5] & 0x02) != 0 ? 1 : 0;
602 left = (data[5] & aiptek->curSetting.mouseButtonLeft) != 0 ? 1 : 0;
603 right = (data[5] & aiptek->curSetting.mouseButtonRight) != 0 ? 1 : 0;
604 middle = (data[5] & aiptek->curSetting.mouseButtonMiddle) != 0 ? 1 : 0;
605
606 if (dv != 0) {
607
608
609
610 if (aiptek->previousToolMode !=
611 aiptek->curSetting.toolMode) {
612 input_report_key(inputdev,
613 aiptek->previousToolMode, 0);
614 input_report_key(inputdev,
615 aiptek->curSetting.toolMode,
616 1);
617 aiptek->previousToolMode =
618 aiptek->curSetting.toolMode;
619 }
620
621 if (p != 0) {
622 input_report_abs(inputdev, ABS_X, x);
623 input_report_abs(inputdev, ABS_Y, y);
624
625 input_report_key(inputdev, BTN_LEFT, left);
626 input_report_key(inputdev, BTN_MIDDLE, middle);
627 input_report_key(inputdev, BTN_RIGHT, right);
628
629
630
631
632 if (aiptek->curSetting.wheel != AIPTEK_WHEEL_DISABLE) {
633 input_report_abs(inputdev,
634 ABS_WHEEL,
635 aiptek->curSetting.wheel);
636 aiptek->curSetting.wheel = AIPTEK_WHEEL_DISABLE;
637 }
638 }
639 input_report_abs(inputdev, ABS_MISC, p | AIPTEK_REPORT_TOOL_MOUSE);
640 if (aiptek->lastMacro != -1) {
641 input_report_key(inputdev,
642 macroKeyEvents[aiptek->lastMacro], 0);
643 aiptek->lastMacro = -1;
644 }
645 input_sync(inputdev);
646 }
647 }
648 }
649
650
651 else if (data[0] == 4) {
652 jitterable = data[1] & 0x18;
653
654 dv = (data[1] & 0x01) != 0 ? 1 : 0;
655 p = (data[1] & 0x02) != 0 ? 1 : 0;
656 tip = (data[1] & 0x04) != 0 ? 1 : 0;
657 bs = (data[1] & aiptek->curSetting.stylusButtonLower) != 0 ? 1 : 0;
658 pck = (data[1] & aiptek->curSetting.stylusButtonUpper) != 0 ? 1 : 0;
659
660 macro = dv && p && tip && !(data[3] & 1) ? (data[3] >> 1) : -1;
661 z = get_unaligned_le16(data + 4);
662
663 if (dv) {
664
665
666
667 if (aiptek->previousToolMode !=
668 aiptek->curSetting.toolMode) {
669 input_report_key(inputdev,
670 aiptek->previousToolMode, 0);
671 input_report_key(inputdev,
672 aiptek->curSetting.toolMode,
673 1);
674 aiptek->previousToolMode =
675 aiptek->curSetting.toolMode;
676 }
677 }
678
679 if (aiptek->lastMacro != -1 && aiptek->lastMacro != macro) {
680 input_report_key(inputdev, macroKeyEvents[aiptek->lastMacro], 0);
681 aiptek->lastMacro = -1;
682 }
683
684 if (macro != -1 && macro != aiptek->lastMacro) {
685 input_report_key(inputdev, macroKeyEvents[macro], 1);
686 aiptek->lastMacro = macro;
687 }
688 input_report_abs(inputdev, ABS_MISC,
689 p | AIPTEK_REPORT_TOOL_STYLUS);
690 input_sync(inputdev);
691 }
692
693
694 else if (data[0] == 5) {
695 jitterable = data[1] & 0x1c;
696
697 dv = (data[1] & 0x01) != 0 ? 1 : 0;
698 p = (data[1] & 0x02) != 0 ? 1 : 0;
699 left = (data[1]& aiptek->curSetting.mouseButtonLeft) != 0 ? 1 : 0;
700 right = (data[1] & aiptek->curSetting.mouseButtonRight) != 0 ? 1 : 0;
701 middle = (data[1] & aiptek->curSetting.mouseButtonMiddle) != 0 ? 1 : 0;
702 macro = dv && p && left && !(data[3] & 1) ? (data[3] >> 1) : 0;
703
704 if (dv) {
705
706
707
708 if (aiptek->previousToolMode !=
709 aiptek->curSetting.toolMode) {
710 input_report_key(inputdev,
711 aiptek->previousToolMode, 0);
712 input_report_key(inputdev,
713 aiptek->curSetting.toolMode, 1);
714 aiptek->previousToolMode = aiptek->curSetting.toolMode;
715 }
716 }
717
718 if (aiptek->lastMacro != -1 && aiptek->lastMacro != macro) {
719 input_report_key(inputdev, macroKeyEvents[aiptek->lastMacro], 0);
720 aiptek->lastMacro = -1;
721 }
722
723 if (macro != -1 && macro != aiptek->lastMacro) {
724 input_report_key(inputdev, macroKeyEvents[macro], 1);
725 aiptek->lastMacro = macro;
726 }
727
728 input_report_abs(inputdev, ABS_MISC,
729 p | AIPTEK_REPORT_TOOL_MOUSE);
730 input_sync(inputdev);
731 }
732
733
734
735
736
737
738 else if (data[0] == 6) {
739 macro = get_unaligned_le16(data + 1);
740 if (macro > 0) {
741 input_report_key(inputdev, macroKeyEvents[macro - 1],
742 0);
743 }
744 if (macro < 25) {
745 input_report_key(inputdev, macroKeyEvents[macro + 1],
746 0);
747 }
748
749
750
751
752 if (aiptek->previousToolMode !=
753 aiptek->curSetting.toolMode) {
754 input_report_key(inputdev,
755 aiptek->previousToolMode, 0);
756 input_report_key(inputdev,
757 aiptek->curSetting.toolMode,
758 1);
759 aiptek->previousToolMode =
760 aiptek->curSetting.toolMode;
761 }
762
763 input_report_key(inputdev, macroKeyEvents[macro], 1);
764 input_report_abs(inputdev, ABS_MISC,
765 1 | AIPTEK_REPORT_TOOL_UNKNOWN);
766 input_sync(inputdev);
767 } else {
768 dev_dbg(&intf->dev, "Unknown report %d\n", data[0]);
769 }
770
771
772
773
774
775
776
777
778
779
780
781
782
783 if (aiptek->previousJitterable != jitterable &&
784 aiptek->curSetting.jitterDelay != 0 && aiptek->inDelay != 1) {
785 aiptek->endDelay = jiffies +
786 ((aiptek->curSetting.jitterDelay * HZ) / 1000);
787 aiptek->inDelay = 1;
788 }
789 aiptek->previousJitterable = jitterable;
790
791 exit:
792 retval = usb_submit_urb(urb, GFP_ATOMIC);
793 if (retval != 0) {
794 dev_err(&intf->dev,
795 "%s - usb_submit_urb failed with result %d\n",
796 __func__, retval);
797 }
798 }
799
800
801
802
803
804
805
806
807
808 static const struct usb_device_id aiptek_ids[] = {
809 {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x01)},
810 {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x10)},
811 {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x20)},
812 {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x21)},
813 {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x22)},
814 {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x23)},
815 {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x24)},
816 {USB_DEVICE(USB_VENDOR_ID_KYE, 0x5003)},
817 {}
818 };
819
820 MODULE_DEVICE_TABLE(usb, aiptek_ids);
821
822
823
824
825 static int aiptek_open(struct input_dev *inputdev)
826 {
827 struct aiptek *aiptek = input_get_drvdata(inputdev);
828
829 aiptek->urb->dev = interface_to_usbdev(aiptek->intf);
830 if (usb_submit_urb(aiptek->urb, GFP_KERNEL) != 0)
831 return -EIO;
832
833 return 0;
834 }
835
836
837
838
839 static void aiptek_close(struct input_dev *inputdev)
840 {
841 struct aiptek *aiptek = input_get_drvdata(inputdev);
842
843 usb_kill_urb(aiptek->urb);
844 }
845
846
847
848
849
850 static int
851 aiptek_set_report(struct aiptek *aiptek,
852 unsigned char report_type,
853 unsigned char report_id, void *buffer, int size)
854 {
855 struct usb_device *udev = interface_to_usbdev(aiptek->intf);
856
857 return usb_control_msg(udev,
858 usb_sndctrlpipe(udev, 0),
859 USB_REQ_SET_REPORT,
860 USB_TYPE_CLASS | USB_RECIP_INTERFACE |
861 USB_DIR_OUT, (report_type << 8) + report_id,
862 aiptek->ifnum, buffer, size, 5000);
863 }
864
865 static int
866 aiptek_get_report(struct aiptek *aiptek,
867 unsigned char report_type,
868 unsigned char report_id, void *buffer, int size)
869 {
870 struct usb_device *udev = interface_to_usbdev(aiptek->intf);
871
872 return usb_control_msg(udev,
873 usb_rcvctrlpipe(udev, 0),
874 USB_REQ_GET_REPORT,
875 USB_TYPE_CLASS | USB_RECIP_INTERFACE |
876 USB_DIR_IN, (report_type << 8) + report_id,
877 aiptek->ifnum, buffer, size, 5000);
878 }
879
880
881
882
883 static int
884 aiptek_command(struct aiptek *aiptek, unsigned char command, unsigned char data)
885 {
886 const int sizeof_buf = 3 * sizeof(u8);
887 int ret;
888 u8 *buf;
889
890 buf = kmalloc(sizeof_buf, GFP_KERNEL);
891 if (!buf)
892 return -ENOMEM;
893
894 buf[0] = 2;
895 buf[1] = command;
896 buf[2] = data;
897
898 if ((ret =
899 aiptek_set_report(aiptek, 3, 2, buf, sizeof_buf)) != sizeof_buf) {
900 dev_dbg(&aiptek->intf->dev,
901 "aiptek_program: failed, tried to send: 0x%02x 0x%02x\n",
902 command, data);
903 }
904 kfree(buf);
905 return ret < 0 ? ret : 0;
906 }
907
908
909
910
911
912
913 static int
914 aiptek_query(struct aiptek *aiptek, unsigned char command, unsigned char data)
915 {
916 const int sizeof_buf = 3 * sizeof(u8);
917 int ret;
918 u8 *buf;
919
920 buf = kmalloc(sizeof_buf, GFP_KERNEL);
921 if (!buf)
922 return -ENOMEM;
923
924 buf[0] = 2;
925 buf[1] = command;
926 buf[2] = data;
927
928 if (aiptek_command(aiptek, command, data) != 0) {
929 kfree(buf);
930 return -EIO;
931 }
932 msleep(aiptek->curSetting.programmableDelay);
933
934 if ((ret =
935 aiptek_get_report(aiptek, 3, 2, buf, sizeof_buf)) != sizeof_buf) {
936 dev_dbg(&aiptek->intf->dev,
937 "aiptek_query failed: returned 0x%02x 0x%02x 0x%02x\n",
938 buf[0], buf[1], buf[2]);
939 ret = -EIO;
940 } else {
941 ret = get_unaligned_le16(buf + 1);
942 }
943 kfree(buf);
944 return ret;
945 }
946
947
948
949
950
951 static int aiptek_program_tablet(struct aiptek *aiptek)
952 {
953 int ret;
954
955 if ((ret = aiptek_command(aiptek, 0x18, 0x04)) < 0)
956 return ret;
957
958
959 if ((ret = aiptek_query(aiptek, 0x02, 0x00)) < 0)
960 return ret;
961 aiptek->features.modelCode = ret & 0xff;
962
963
964 if ((ret = aiptek_query(aiptek, 0x03, 0x00)) < 0)
965 return ret;
966 aiptek->features.odmCode = ret;
967
968
969 if ((ret = aiptek_query(aiptek, 0x04, 0x00)) < 0)
970 return ret;
971 aiptek->features.firmwareCode = ret;
972
973
974 if ((ret = aiptek_query(aiptek, 0x01, 0x00)) < 0)
975 return ret;
976 input_set_abs_params(aiptek->inputdev, ABS_X, 0, ret - 1, 0, 0);
977
978
979 if ((ret = aiptek_query(aiptek, 0x01, 0x01)) < 0)
980 return ret;
981 input_set_abs_params(aiptek->inputdev, ABS_Y, 0, ret - 1, 0, 0);
982
983
984 if ((ret = aiptek_query(aiptek, 0x08, 0x00)) < 0)
985 return ret;
986 input_set_abs_params(aiptek->inputdev, ABS_PRESSURE, 0, ret - 1, 0, 0);
987
988
989
990
991 if (aiptek->curSetting.coordinateMode ==
992 AIPTEK_COORDINATE_ABSOLUTE_MODE) {
993
994 if ((ret = aiptek_command(aiptek, 0x10, 0x01)) < 0) {
995 return ret;
996 }
997 } else {
998
999 if ((ret = aiptek_command(aiptek, 0x10, 0x00)) < 0) {
1000 return ret;
1001 }
1002 }
1003
1004
1005 if ((ret = aiptek_command(aiptek, 0x11, 0x02)) < 0)
1006 return ret;
1007 #if 0
1008
1009 if ((ret = aiptek_command(aiptek, 0x17, 0x00)) < 0)
1010 return ret;
1011 #endif
1012
1013
1014 if ((ret = aiptek_command(aiptek, 0x12, 0xff)) < 0)
1015 return ret;
1016
1017
1018
1019 aiptek->diagnostic = AIPTEK_DIAGNOSTIC_NA;
1020 aiptek->eventCount = 0;
1021
1022 return 0;
1023 }
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035 static ssize_t show_tabletSize(struct device *dev, struct device_attribute *attr, char *buf)
1036 {
1037 struct aiptek *aiptek = dev_get_drvdata(dev);
1038
1039 return snprintf(buf, PAGE_SIZE, "%dx%d\n",
1040 input_abs_get_max(aiptek->inputdev, ABS_X) + 1,
1041 input_abs_get_max(aiptek->inputdev, ABS_Y) + 1);
1042 }
1043
1044
1045
1046
1047
1048
1049
1050 static DEVICE_ATTR(size, S_IRUGO, show_tabletSize, NULL);
1051
1052
1053
1054
1055
1056 static struct aiptek_map pointer_mode_map[] = {
1057 { "stylus", AIPTEK_POINTER_ONLY_STYLUS_MODE },
1058 { "mouse", AIPTEK_POINTER_ONLY_MOUSE_MODE },
1059 { "either", AIPTEK_POINTER_EITHER_MODE },
1060 { NULL, AIPTEK_INVALID_VALUE }
1061 };
1062
1063 static ssize_t show_tabletPointerMode(struct device *dev, struct device_attribute *attr, char *buf)
1064 {
1065 struct aiptek *aiptek = dev_get_drvdata(dev);
1066
1067 return snprintf(buf, PAGE_SIZE, "%s\n",
1068 map_val_to_str(pointer_mode_map,
1069 aiptek->curSetting.pointerMode));
1070 }
1071
1072 static ssize_t
1073 store_tabletPointerMode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1074 {
1075 struct aiptek *aiptek = dev_get_drvdata(dev);
1076 int new_mode = map_str_to_val(pointer_mode_map, buf, count);
1077
1078 if (new_mode == AIPTEK_INVALID_VALUE)
1079 return -EINVAL;
1080
1081 aiptek->newSetting.pointerMode = new_mode;
1082 return count;
1083 }
1084
1085 static DEVICE_ATTR(pointer_mode,
1086 S_IRUGO | S_IWUSR,
1087 show_tabletPointerMode, store_tabletPointerMode);
1088
1089
1090
1091
1092
1093
1094 static struct aiptek_map coordinate_mode_map[] = {
1095 { "absolute", AIPTEK_COORDINATE_ABSOLUTE_MODE },
1096 { "relative", AIPTEK_COORDINATE_RELATIVE_MODE },
1097 { NULL, AIPTEK_INVALID_VALUE }
1098 };
1099
1100 static ssize_t show_tabletCoordinateMode(struct device *dev, struct device_attribute *attr, char *buf)
1101 {
1102 struct aiptek *aiptek = dev_get_drvdata(dev);
1103
1104 return snprintf(buf, PAGE_SIZE, "%s\n",
1105 map_val_to_str(coordinate_mode_map,
1106 aiptek->curSetting.coordinateMode));
1107 }
1108
1109 static ssize_t
1110 store_tabletCoordinateMode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1111 {
1112 struct aiptek *aiptek = dev_get_drvdata(dev);
1113 int new_mode = map_str_to_val(coordinate_mode_map, buf, count);
1114
1115 if (new_mode == AIPTEK_INVALID_VALUE)
1116 return -EINVAL;
1117
1118 aiptek->newSetting.coordinateMode = new_mode;
1119 return count;
1120 }
1121
1122 static DEVICE_ATTR(coordinate_mode,
1123 S_IRUGO | S_IWUSR,
1124 show_tabletCoordinateMode, store_tabletCoordinateMode);
1125
1126
1127
1128
1129
1130
1131 static struct aiptek_map tool_mode_map[] = {
1132 { "mouse", AIPTEK_TOOL_BUTTON_MOUSE_MODE },
1133 { "eraser", AIPTEK_TOOL_BUTTON_ERASER_MODE },
1134 { "pencil", AIPTEK_TOOL_BUTTON_PENCIL_MODE },
1135 { "pen", AIPTEK_TOOL_BUTTON_PEN_MODE },
1136 { "brush", AIPTEK_TOOL_BUTTON_BRUSH_MODE },
1137 { "airbrush", AIPTEK_TOOL_BUTTON_AIRBRUSH_MODE },
1138 { "lens", AIPTEK_TOOL_BUTTON_LENS_MODE },
1139 { NULL, AIPTEK_INVALID_VALUE }
1140 };
1141
1142 static ssize_t show_tabletToolMode(struct device *dev, struct device_attribute *attr, char *buf)
1143 {
1144 struct aiptek *aiptek = dev_get_drvdata(dev);
1145
1146 return snprintf(buf, PAGE_SIZE, "%s\n",
1147 map_val_to_str(tool_mode_map,
1148 aiptek->curSetting.toolMode));
1149 }
1150
1151 static ssize_t
1152 store_tabletToolMode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1153 {
1154 struct aiptek *aiptek = dev_get_drvdata(dev);
1155 int new_mode = map_str_to_val(tool_mode_map, buf, count);
1156
1157 if (new_mode == AIPTEK_INVALID_VALUE)
1158 return -EINVAL;
1159
1160 aiptek->newSetting.toolMode = new_mode;
1161 return count;
1162 }
1163
1164 static DEVICE_ATTR(tool_mode,
1165 S_IRUGO | S_IWUSR,
1166 show_tabletToolMode, store_tabletToolMode);
1167
1168
1169
1170
1171
1172 static ssize_t show_tabletXtilt(struct device *dev, struct device_attribute *attr, char *buf)
1173 {
1174 struct aiptek *aiptek = dev_get_drvdata(dev);
1175
1176 if (aiptek->curSetting.xTilt == AIPTEK_TILT_DISABLE) {
1177 return snprintf(buf, PAGE_SIZE, "disable\n");
1178 } else {
1179 return snprintf(buf, PAGE_SIZE, "%d\n",
1180 aiptek->curSetting.xTilt);
1181 }
1182 }
1183
1184 static ssize_t
1185 store_tabletXtilt(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1186 {
1187 struct aiptek *aiptek = dev_get_drvdata(dev);
1188 int x;
1189
1190 if (kstrtoint(buf, 10, &x)) {
1191 size_t len = buf[count - 1] == '\n' ? count - 1 : count;
1192
1193 if (strncmp(buf, "disable", len))
1194 return -EINVAL;
1195
1196 aiptek->newSetting.xTilt = AIPTEK_TILT_DISABLE;
1197 } else {
1198 if (x < AIPTEK_TILT_MIN || x > AIPTEK_TILT_MAX)
1199 return -EINVAL;
1200
1201 aiptek->newSetting.xTilt = x;
1202 }
1203
1204 return count;
1205 }
1206
1207 static DEVICE_ATTR(xtilt,
1208 S_IRUGO | S_IWUSR, show_tabletXtilt, store_tabletXtilt);
1209
1210
1211
1212
1213
1214 static ssize_t show_tabletYtilt(struct device *dev, struct device_attribute *attr, char *buf)
1215 {
1216 struct aiptek *aiptek = dev_get_drvdata(dev);
1217
1218 if (aiptek->curSetting.yTilt == AIPTEK_TILT_DISABLE) {
1219 return snprintf(buf, PAGE_SIZE, "disable\n");
1220 } else {
1221 return snprintf(buf, PAGE_SIZE, "%d\n",
1222 aiptek->curSetting.yTilt);
1223 }
1224 }
1225
1226 static ssize_t
1227 store_tabletYtilt(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1228 {
1229 struct aiptek *aiptek = dev_get_drvdata(dev);
1230 int y;
1231
1232 if (kstrtoint(buf, 10, &y)) {
1233 size_t len = buf[count - 1] == '\n' ? count - 1 : count;
1234
1235 if (strncmp(buf, "disable", len))
1236 return -EINVAL;
1237
1238 aiptek->newSetting.yTilt = AIPTEK_TILT_DISABLE;
1239 } else {
1240 if (y < AIPTEK_TILT_MIN || y > AIPTEK_TILT_MAX)
1241 return -EINVAL;
1242
1243 aiptek->newSetting.yTilt = y;
1244 }
1245
1246 return count;
1247 }
1248
1249 static DEVICE_ATTR(ytilt,
1250 S_IRUGO | S_IWUSR, show_tabletYtilt, store_tabletYtilt);
1251
1252
1253
1254
1255
1256 static ssize_t show_tabletJitterDelay(struct device *dev, struct device_attribute *attr, char *buf)
1257 {
1258 struct aiptek *aiptek = dev_get_drvdata(dev);
1259
1260 return snprintf(buf, PAGE_SIZE, "%d\n", aiptek->curSetting.jitterDelay);
1261 }
1262
1263 static ssize_t
1264 store_tabletJitterDelay(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1265 {
1266 struct aiptek *aiptek = dev_get_drvdata(dev);
1267 int err, j;
1268
1269 err = kstrtoint(buf, 10, &j);
1270 if (err)
1271 return err;
1272
1273 aiptek->newSetting.jitterDelay = j;
1274 return count;
1275 }
1276
1277 static DEVICE_ATTR(jitter,
1278 S_IRUGO | S_IWUSR,
1279 show_tabletJitterDelay, store_tabletJitterDelay);
1280
1281
1282
1283
1284
1285 static ssize_t show_tabletProgrammableDelay(struct device *dev, struct device_attribute *attr, char *buf)
1286 {
1287 struct aiptek *aiptek = dev_get_drvdata(dev);
1288
1289 return snprintf(buf, PAGE_SIZE, "%d\n",
1290 aiptek->curSetting.programmableDelay);
1291 }
1292
1293 static ssize_t
1294 store_tabletProgrammableDelay(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1295 {
1296 struct aiptek *aiptek = dev_get_drvdata(dev);
1297 int err, d;
1298
1299 err = kstrtoint(buf, 10, &d);
1300 if (err)
1301 return err;
1302
1303 aiptek->newSetting.programmableDelay = d;
1304 return count;
1305 }
1306
1307 static DEVICE_ATTR(delay,
1308 S_IRUGO | S_IWUSR,
1309 show_tabletProgrammableDelay, store_tabletProgrammableDelay);
1310
1311
1312
1313
1314
1315 static ssize_t show_tabletEventsReceived(struct device *dev, struct device_attribute *attr, char *buf)
1316 {
1317 struct aiptek *aiptek = dev_get_drvdata(dev);
1318
1319 return snprintf(buf, PAGE_SIZE, "%ld\n", aiptek->eventCount);
1320 }
1321
1322 static DEVICE_ATTR(event_count, S_IRUGO, show_tabletEventsReceived, NULL);
1323
1324
1325
1326
1327
1328 static ssize_t show_tabletDiagnosticMessage(struct device *dev, struct device_attribute *attr, char *buf)
1329 {
1330 struct aiptek *aiptek = dev_get_drvdata(dev);
1331 char *retMsg;
1332
1333 switch (aiptek->diagnostic) {
1334 case AIPTEK_DIAGNOSTIC_NA:
1335 retMsg = "no errors\n";
1336 break;
1337
1338 case AIPTEK_DIAGNOSTIC_SENDING_RELATIVE_IN_ABSOLUTE:
1339 retMsg = "Error: receiving relative reports\n";
1340 break;
1341
1342 case AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE:
1343 retMsg = "Error: receiving absolute reports\n";
1344 break;
1345
1346 case AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED:
1347 if (aiptek->curSetting.pointerMode ==
1348 AIPTEK_POINTER_ONLY_MOUSE_MODE) {
1349 retMsg = "Error: receiving stylus reports\n";
1350 } else {
1351 retMsg = "Error: receiving mouse reports\n";
1352 }
1353 break;
1354
1355 default:
1356 return 0;
1357 }
1358 return snprintf(buf, PAGE_SIZE, retMsg);
1359 }
1360
1361 static DEVICE_ATTR(diagnostic, S_IRUGO, show_tabletDiagnosticMessage, NULL);
1362
1363
1364
1365
1366
1367
1368 static struct aiptek_map stylus_button_map[] = {
1369 { "upper", AIPTEK_STYLUS_UPPER_BUTTON },
1370 { "lower", AIPTEK_STYLUS_LOWER_BUTTON },
1371 { NULL, AIPTEK_INVALID_VALUE }
1372 };
1373
1374 static ssize_t show_tabletStylusUpper(struct device *dev, struct device_attribute *attr, char *buf)
1375 {
1376 struct aiptek *aiptek = dev_get_drvdata(dev);
1377
1378 return snprintf(buf, PAGE_SIZE, "%s\n",
1379 map_val_to_str(stylus_button_map,
1380 aiptek->curSetting.stylusButtonUpper));
1381 }
1382
1383 static ssize_t
1384 store_tabletStylusUpper(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1385 {
1386 struct aiptek *aiptek = dev_get_drvdata(dev);
1387 int new_button = map_str_to_val(stylus_button_map, buf, count);
1388
1389 if (new_button == AIPTEK_INVALID_VALUE)
1390 return -EINVAL;
1391
1392 aiptek->newSetting.stylusButtonUpper = new_button;
1393 return count;
1394 }
1395
1396 static DEVICE_ATTR(stylus_upper,
1397 S_IRUGO | S_IWUSR,
1398 show_tabletStylusUpper, store_tabletStylusUpper);
1399
1400
1401
1402
1403
1404
1405 static ssize_t show_tabletStylusLower(struct device *dev, struct device_attribute *attr, char *buf)
1406 {
1407 struct aiptek *aiptek = dev_get_drvdata(dev);
1408
1409 return snprintf(buf, PAGE_SIZE, "%s\n",
1410 map_val_to_str(stylus_button_map,
1411 aiptek->curSetting.stylusButtonLower));
1412 }
1413
1414 static ssize_t
1415 store_tabletStylusLower(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1416 {
1417 struct aiptek *aiptek = dev_get_drvdata(dev);
1418 int new_button = map_str_to_val(stylus_button_map, buf, count);
1419
1420 if (new_button == AIPTEK_INVALID_VALUE)
1421 return -EINVAL;
1422
1423 aiptek->newSetting.stylusButtonLower = new_button;
1424 return count;
1425 }
1426
1427 static DEVICE_ATTR(stylus_lower,
1428 S_IRUGO | S_IWUSR,
1429 show_tabletStylusLower, store_tabletStylusLower);
1430
1431
1432
1433
1434
1435
1436 static struct aiptek_map mouse_button_map[] = {
1437 { "left", AIPTEK_MOUSE_LEFT_BUTTON },
1438 { "middle", AIPTEK_MOUSE_MIDDLE_BUTTON },
1439 { "right", AIPTEK_MOUSE_RIGHT_BUTTON },
1440 { NULL, AIPTEK_INVALID_VALUE }
1441 };
1442
1443 static ssize_t show_tabletMouseLeft(struct device *dev, struct device_attribute *attr, char *buf)
1444 {
1445 struct aiptek *aiptek = dev_get_drvdata(dev);
1446
1447 return snprintf(buf, PAGE_SIZE, "%s\n",
1448 map_val_to_str(mouse_button_map,
1449 aiptek->curSetting.mouseButtonLeft));
1450 }
1451
1452 static ssize_t
1453 store_tabletMouseLeft(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1454 {
1455 struct aiptek *aiptek = dev_get_drvdata(dev);
1456 int new_button = map_str_to_val(mouse_button_map, buf, count);
1457
1458 if (new_button == AIPTEK_INVALID_VALUE)
1459 return -EINVAL;
1460
1461 aiptek->newSetting.mouseButtonLeft = new_button;
1462 return count;
1463 }
1464
1465 static DEVICE_ATTR(mouse_left,
1466 S_IRUGO | S_IWUSR,
1467 show_tabletMouseLeft, store_tabletMouseLeft);
1468
1469
1470
1471
1472
1473 static ssize_t show_tabletMouseMiddle(struct device *dev, struct device_attribute *attr, char *buf)
1474 {
1475 struct aiptek *aiptek = dev_get_drvdata(dev);
1476
1477 return snprintf(buf, PAGE_SIZE, "%s\n",
1478 map_val_to_str(mouse_button_map,
1479 aiptek->curSetting.mouseButtonMiddle));
1480 }
1481
1482 static ssize_t
1483 store_tabletMouseMiddle(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1484 {
1485 struct aiptek *aiptek = dev_get_drvdata(dev);
1486 int new_button = map_str_to_val(mouse_button_map, buf, count);
1487
1488 if (new_button == AIPTEK_INVALID_VALUE)
1489 return -EINVAL;
1490
1491 aiptek->newSetting.mouseButtonMiddle = new_button;
1492 return count;
1493 }
1494
1495 static DEVICE_ATTR(mouse_middle,
1496 S_IRUGO | S_IWUSR,
1497 show_tabletMouseMiddle, store_tabletMouseMiddle);
1498
1499
1500
1501
1502
1503 static ssize_t show_tabletMouseRight(struct device *dev, struct device_attribute *attr, char *buf)
1504 {
1505 struct aiptek *aiptek = dev_get_drvdata(dev);
1506
1507 return snprintf(buf, PAGE_SIZE, "%s\n",
1508 map_val_to_str(mouse_button_map,
1509 aiptek->curSetting.mouseButtonRight));
1510 }
1511
1512 static ssize_t
1513 store_tabletMouseRight(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1514 {
1515 struct aiptek *aiptek = dev_get_drvdata(dev);
1516 int new_button = map_str_to_val(mouse_button_map, buf, count);
1517
1518 if (new_button == AIPTEK_INVALID_VALUE)
1519 return -EINVAL;
1520
1521 aiptek->newSetting.mouseButtonRight = new_button;
1522 return count;
1523 }
1524
1525 static DEVICE_ATTR(mouse_right,
1526 S_IRUGO | S_IWUSR,
1527 show_tabletMouseRight, store_tabletMouseRight);
1528
1529
1530
1531
1532
1533 static ssize_t show_tabletWheel(struct device *dev, struct device_attribute *attr, char *buf)
1534 {
1535 struct aiptek *aiptek = dev_get_drvdata(dev);
1536
1537 if (aiptek->curSetting.wheel == AIPTEK_WHEEL_DISABLE) {
1538 return snprintf(buf, PAGE_SIZE, "disable\n");
1539 } else {
1540 return snprintf(buf, PAGE_SIZE, "%d\n",
1541 aiptek->curSetting.wheel);
1542 }
1543 }
1544
1545 static ssize_t
1546 store_tabletWheel(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1547 {
1548 struct aiptek *aiptek = dev_get_drvdata(dev);
1549 int err, w;
1550
1551 err = kstrtoint(buf, 10, &w);
1552 if (err)
1553 return err;
1554
1555 aiptek->newSetting.wheel = w;
1556 return count;
1557 }
1558
1559 static DEVICE_ATTR(wheel,
1560 S_IRUGO | S_IWUSR, show_tabletWheel, store_tabletWheel);
1561
1562
1563
1564
1565
1566 static ssize_t show_tabletExecute(struct device *dev, struct device_attribute *attr, char *buf)
1567 {
1568
1569
1570
1571 return snprintf(buf, PAGE_SIZE,
1572 "Write anything to this file to program your tablet.\n");
1573 }
1574
1575 static ssize_t
1576 store_tabletExecute(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1577 {
1578 struct aiptek *aiptek = dev_get_drvdata(dev);
1579
1580
1581
1582
1583 memcpy(&aiptek->curSetting, &aiptek->newSetting,
1584 sizeof(struct aiptek_settings));
1585
1586 if (aiptek_program_tablet(aiptek) < 0)
1587 return -EIO;
1588
1589 return count;
1590 }
1591
1592 static DEVICE_ATTR(execute,
1593 S_IRUGO | S_IWUSR, show_tabletExecute, store_tabletExecute);
1594
1595
1596
1597
1598
1599 static ssize_t show_tabletODMCode(struct device *dev, struct device_attribute *attr, char *buf)
1600 {
1601 struct aiptek *aiptek = dev_get_drvdata(dev);
1602
1603 return snprintf(buf, PAGE_SIZE, "0x%04x\n", aiptek->features.odmCode);
1604 }
1605
1606 static DEVICE_ATTR(odm_code, S_IRUGO, show_tabletODMCode, NULL);
1607
1608
1609
1610
1611
1612 static ssize_t show_tabletModelCode(struct device *dev, struct device_attribute *attr, char *buf)
1613 {
1614 struct aiptek *aiptek = dev_get_drvdata(dev);
1615
1616 return snprintf(buf, PAGE_SIZE, "0x%04x\n", aiptek->features.modelCode);
1617 }
1618
1619 static DEVICE_ATTR(model_code, S_IRUGO, show_tabletModelCode, NULL);
1620
1621
1622
1623
1624
1625 static ssize_t show_firmwareCode(struct device *dev, struct device_attribute *attr, char *buf)
1626 {
1627 struct aiptek *aiptek = dev_get_drvdata(dev);
1628
1629 return snprintf(buf, PAGE_SIZE, "%04x\n",
1630 aiptek->features.firmwareCode);
1631 }
1632
1633 static DEVICE_ATTR(firmware_code, S_IRUGO, show_firmwareCode, NULL);
1634
1635 static struct attribute *aiptek_attributes[] = {
1636 &dev_attr_size.attr,
1637 &dev_attr_pointer_mode.attr,
1638 &dev_attr_coordinate_mode.attr,
1639 &dev_attr_tool_mode.attr,
1640 &dev_attr_xtilt.attr,
1641 &dev_attr_ytilt.attr,
1642 &dev_attr_jitter.attr,
1643 &dev_attr_delay.attr,
1644 &dev_attr_event_count.attr,
1645 &dev_attr_diagnostic.attr,
1646 &dev_attr_odm_code.attr,
1647 &dev_attr_model_code.attr,
1648 &dev_attr_firmware_code.attr,
1649 &dev_attr_stylus_lower.attr,
1650 &dev_attr_stylus_upper.attr,
1651 &dev_attr_mouse_left.attr,
1652 &dev_attr_mouse_middle.attr,
1653 &dev_attr_mouse_right.attr,
1654 &dev_attr_wheel.attr,
1655 &dev_attr_execute.attr,
1656 NULL
1657 };
1658
1659 static const struct attribute_group aiptek_attribute_group = {
1660 .attrs = aiptek_attributes,
1661 };
1662
1663
1664
1665
1666
1667 static int
1668 aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
1669 {
1670 struct usb_device *usbdev = interface_to_usbdev(intf);
1671 struct usb_endpoint_descriptor *endpoint;
1672 struct aiptek *aiptek;
1673 struct input_dev *inputdev;
1674 int i;
1675 int speeds[] = { 0,
1676 AIPTEK_PROGRAMMABLE_DELAY_50,
1677 AIPTEK_PROGRAMMABLE_DELAY_400,
1678 AIPTEK_PROGRAMMABLE_DELAY_25,
1679 AIPTEK_PROGRAMMABLE_DELAY_100,
1680 AIPTEK_PROGRAMMABLE_DELAY_200,
1681 AIPTEK_PROGRAMMABLE_DELAY_300
1682 };
1683 int err = -ENOMEM;
1684
1685
1686
1687
1688
1689
1690
1691 speeds[0] = programmableDelay;
1692
1693 aiptek = kzalloc(sizeof(struct aiptek), GFP_KERNEL);
1694 inputdev = input_allocate_device();
1695 if (!aiptek || !inputdev) {
1696 dev_warn(&intf->dev,
1697 "cannot allocate memory or input device\n");
1698 goto fail1;
1699 }
1700
1701 aiptek->data = usb_alloc_coherent(usbdev, AIPTEK_PACKET_LENGTH,
1702 GFP_KERNEL, &aiptek->data_dma);
1703 if (!aiptek->data) {
1704 dev_warn(&intf->dev, "cannot allocate usb buffer\n");
1705 goto fail1;
1706 }
1707
1708 aiptek->urb = usb_alloc_urb(0, GFP_KERNEL);
1709 if (!aiptek->urb) {
1710 dev_warn(&intf->dev, "cannot allocate urb\n");
1711 goto fail2;
1712 }
1713
1714 aiptek->inputdev = inputdev;
1715 aiptek->intf = intf;
1716 aiptek->ifnum = intf->altsetting[0].desc.bInterfaceNumber;
1717 aiptek->inDelay = 0;
1718 aiptek->endDelay = 0;
1719 aiptek->previousJitterable = 0;
1720 aiptek->lastMacro = -1;
1721
1722
1723
1724
1725
1726
1727
1728 aiptek->curSetting.pointerMode = AIPTEK_POINTER_EITHER_MODE;
1729 aiptek->curSetting.coordinateMode = AIPTEK_COORDINATE_ABSOLUTE_MODE;
1730 aiptek->curSetting.toolMode = AIPTEK_TOOL_BUTTON_PEN_MODE;
1731 aiptek->curSetting.xTilt = AIPTEK_TILT_DISABLE;
1732 aiptek->curSetting.yTilt = AIPTEK_TILT_DISABLE;
1733 aiptek->curSetting.mouseButtonLeft = AIPTEK_MOUSE_LEFT_BUTTON;
1734 aiptek->curSetting.mouseButtonMiddle = AIPTEK_MOUSE_MIDDLE_BUTTON;
1735 aiptek->curSetting.mouseButtonRight = AIPTEK_MOUSE_RIGHT_BUTTON;
1736 aiptek->curSetting.stylusButtonUpper = AIPTEK_STYLUS_UPPER_BUTTON;
1737 aiptek->curSetting.stylusButtonLower = AIPTEK_STYLUS_LOWER_BUTTON;
1738 aiptek->curSetting.jitterDelay = jitterDelay;
1739 aiptek->curSetting.programmableDelay = programmableDelay;
1740
1741
1742
1743 aiptek->newSetting = aiptek->curSetting;
1744
1745
1746
1747
1748
1749
1750
1751
1752 usb_make_path(usbdev, aiptek->features.usbPath,
1753 sizeof(aiptek->features.usbPath));
1754 strlcat(aiptek->features.usbPath, "/input0",
1755 sizeof(aiptek->features.usbPath));
1756
1757
1758
1759
1760 inputdev->name = "Aiptek";
1761 inputdev->phys = aiptek->features.usbPath;
1762 usb_to_input_id(usbdev, &inputdev->id);
1763 inputdev->dev.parent = &intf->dev;
1764
1765 input_set_drvdata(inputdev, aiptek);
1766
1767 inputdev->open = aiptek_open;
1768 inputdev->close = aiptek_close;
1769
1770
1771
1772
1773 for (i = 0; i < ARRAY_SIZE(eventTypes); ++i)
1774 __set_bit(eventTypes[i], inputdev->evbit);
1775
1776 for (i = 0; i < ARRAY_SIZE(absEvents); ++i)
1777 __set_bit(absEvents[i], inputdev->absbit);
1778
1779 for (i = 0; i < ARRAY_SIZE(relEvents); ++i)
1780 __set_bit(relEvents[i], inputdev->relbit);
1781
1782 __set_bit(MSC_SERIAL, inputdev->mscbit);
1783
1784
1785 for (i = 0; i < ARRAY_SIZE(buttonEvents); ++i)
1786 __set_bit(buttonEvents[i], inputdev->keybit);
1787
1788 for (i = 0; i < ARRAY_SIZE(macroKeyEvents); ++i)
1789 __set_bit(macroKeyEvents[i], inputdev->keybit);
1790
1791
1792
1793
1794
1795
1796
1797 input_set_abs_params(inputdev, ABS_X, 0, 2999, 0, 0);
1798 input_set_abs_params(inputdev, ABS_Y, 0, 2249, 0, 0);
1799 input_set_abs_params(inputdev, ABS_PRESSURE, 0, 511, 0, 0);
1800 input_set_abs_params(inputdev, ABS_TILT_X, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0);
1801 input_set_abs_params(inputdev, ABS_TILT_Y, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0);
1802 input_set_abs_params(inputdev, ABS_WHEEL, AIPTEK_WHEEL_MIN, AIPTEK_WHEEL_MAX - 1, 0, 0);
1803
1804
1805 if (intf->cur_altsetting->desc.bNumEndpoints < 1) {
1806 dev_err(&intf->dev,
1807 "interface has %d endpoints, but must have minimum 1\n",
1808 intf->cur_altsetting->desc.bNumEndpoints);
1809 err = -EINVAL;
1810 goto fail3;
1811 }
1812 endpoint = &intf->cur_altsetting->endpoint[0].desc;
1813
1814
1815
1816
1817 usb_fill_int_urb(aiptek->urb,
1818 usbdev,
1819 usb_rcvintpipe(usbdev,
1820 endpoint->bEndpointAddress),
1821 aiptek->data, 8, aiptek_irq, aiptek,
1822 endpoint->bInterval);
1823
1824 aiptek->urb->transfer_dma = aiptek->data_dma;
1825 aiptek->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838 for (i = 0; i < ARRAY_SIZE(speeds); ++i) {
1839 aiptek->curSetting.programmableDelay = speeds[i];
1840 (void)aiptek_program_tablet(aiptek);
1841 if (input_abs_get_max(aiptek->inputdev, ABS_X) > 0) {
1842 dev_info(&intf->dev,
1843 "Aiptek using %d ms programming speed\n",
1844 aiptek->curSetting.programmableDelay);
1845 break;
1846 }
1847 }
1848
1849
1850
1851 if (i == ARRAY_SIZE(speeds)) {
1852 dev_info(&intf->dev,
1853 "Aiptek tried all speeds, no sane response\n");
1854 err = -EINVAL;
1855 goto fail3;
1856 }
1857
1858
1859
1860 usb_set_intfdata(intf, aiptek);
1861
1862
1863
1864 err = sysfs_create_group(&intf->dev.kobj, &aiptek_attribute_group);
1865 if (err) {
1866 dev_warn(&intf->dev, "cannot create sysfs group err: %d\n",
1867 err);
1868 goto fail3;
1869 }
1870
1871
1872
1873 err = input_register_device(aiptek->inputdev);
1874 if (err) {
1875 dev_warn(&intf->dev,
1876 "input_register_device returned err: %d\n", err);
1877 goto fail4;
1878 }
1879 return 0;
1880
1881 fail4: sysfs_remove_group(&intf->dev.kobj, &aiptek_attribute_group);
1882 fail3: usb_free_urb(aiptek->urb);
1883 fail2: usb_free_coherent(usbdev, AIPTEK_PACKET_LENGTH, aiptek->data,
1884 aiptek->data_dma);
1885 fail1: usb_set_intfdata(intf, NULL);
1886 input_free_device(inputdev);
1887 kfree(aiptek);
1888 return err;
1889 }
1890
1891
1892
1893
1894 static void aiptek_disconnect(struct usb_interface *intf)
1895 {
1896 struct aiptek *aiptek = usb_get_intfdata(intf);
1897
1898
1899
1900 usb_set_intfdata(intf, NULL);
1901 if (aiptek != NULL) {
1902
1903
1904 usb_kill_urb(aiptek->urb);
1905 input_unregister_device(aiptek->inputdev);
1906 sysfs_remove_group(&intf->dev.kobj, &aiptek_attribute_group);
1907 usb_free_urb(aiptek->urb);
1908 usb_free_coherent(interface_to_usbdev(intf),
1909 AIPTEK_PACKET_LENGTH,
1910 aiptek->data, aiptek->data_dma);
1911 kfree(aiptek);
1912 }
1913 }
1914
1915 static struct usb_driver aiptek_driver = {
1916 .name = "aiptek",
1917 .probe = aiptek_probe,
1918 .disconnect = aiptek_disconnect,
1919 .id_table = aiptek_ids,
1920 };
1921
1922 module_usb_driver(aiptek_driver);
1923
1924 MODULE_AUTHOR("Bryan W. Headley/Chris Atenasio/Cedric Brun/Rene van Paassen");
1925 MODULE_DESCRIPTION("Aiptek HyperPen USB Tablet Driver");
1926 MODULE_LICENSE("GPL");
1927
1928 module_param(programmableDelay, int, 0);
1929 MODULE_PARM_DESC(programmableDelay, "delay used during tablet programming");
1930 module_param(jitterDelay, int, 0);
1931 MODULE_PARM_DESC(jitterDelay, "stylus/mouse settlement delay");