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