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_REQ_GET_REPORT 0x01
188#define USB_REQ_SET_REPORT 0x09
189
190
191
192#define AIPTEK_POINTER_ONLY_MOUSE_MODE 0
193#define AIPTEK_POINTER_ONLY_STYLUS_MODE 1
194#define AIPTEK_POINTER_EITHER_MODE 2
195
196#define AIPTEK_POINTER_ALLOW_MOUSE_MODE(a) \
197 (a == AIPTEK_POINTER_ONLY_MOUSE_MODE || \
198 a == AIPTEK_POINTER_EITHER_MODE)
199#define AIPTEK_POINTER_ALLOW_STYLUS_MODE(a) \
200 (a == AIPTEK_POINTER_ONLY_STYLUS_MODE || \
201 a == AIPTEK_POINTER_EITHER_MODE)
202
203
204
205#define AIPTEK_COORDINATE_RELATIVE_MODE 0
206#define AIPTEK_COORDINATE_ABSOLUTE_MODE 1
207
208
209
210#define AIPTEK_TILT_MIN (-128)
211#define AIPTEK_TILT_MAX 127
212#define AIPTEK_TILT_DISABLE (-10101)
213
214
215
216#define AIPTEK_WHEEL_MIN 0
217#define AIPTEK_WHEEL_MAX 1024
218#define AIPTEK_WHEEL_DISABLE (-10101)
219
220
221
222
223
224
225
226#define AIPTEK_TOOL_BUTTON_PEN_MODE BTN_TOOL_PEN
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 __FUNCTION__, urb->status);
452 return;
453
454 default:
455 dbg("%s - nonzero urb status received: %d",
456 __FUNCTION__, 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 = le16_to_cpu(get_unaligned((__le16 *) (data + 1)));
531 y = le16_to_cpu(get_unaligned((__le16 *) (data + 3)));
532 z = le16_to_cpu(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 = le16_to_cpu(get_unaligned((__le16 *) (data + 1)));
616 y = le16_to_cpu(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 = le16_to_cpu(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 = le16_to_cpu(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 __FUNCTION__, 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 {}
836};
837
838MODULE_DEVICE_TABLE(usb, aiptek_ids);
839
840
841
842
843static int aiptek_open(struct input_dev *inputdev)
844{
845 struct aiptek *aiptek = input_get_drvdata(inputdev);
846
847 aiptek->urb->dev = aiptek->usbdev;
848 if (usb_submit_urb(aiptek->urb, GFP_KERNEL) != 0)
849 return -EIO;
850
851 return 0;
852}
853
854
855
856
857static void aiptek_close(struct input_dev *inputdev)
858{
859 struct aiptek *aiptek = input_get_drvdata(inputdev);
860
861 usb_kill_urb(aiptek->urb);
862}
863
864
865
866
867
868static int
869aiptek_set_report(struct aiptek *aiptek,
870 unsigned char report_type,
871 unsigned char report_id, void *buffer, int size)
872{
873 return usb_control_msg(aiptek->usbdev,
874 usb_sndctrlpipe(aiptek->usbdev, 0),
875 USB_REQ_SET_REPORT,
876 USB_TYPE_CLASS | USB_RECIP_INTERFACE |
877 USB_DIR_OUT, (report_type << 8) + report_id,
878 aiptek->ifnum, buffer, size, 5000);
879}
880
881static int
882aiptek_get_report(struct aiptek *aiptek,
883 unsigned char report_type,
884 unsigned char report_id, void *buffer, int size)
885{
886 return usb_control_msg(aiptek->usbdev,
887 usb_rcvctrlpipe(aiptek->usbdev, 0),
888 USB_REQ_GET_REPORT,
889 USB_TYPE_CLASS | USB_RECIP_INTERFACE |
890 USB_DIR_IN, (report_type << 8) + report_id,
891 aiptek->ifnum, buffer, size, 5000);
892}
893
894
895
896
897static int
898aiptek_command(struct aiptek *aiptek, unsigned char command, unsigned char data)
899{
900 const int sizeof_buf = 3 * sizeof(u8);
901 int ret;
902 u8 *buf;
903
904 buf = kmalloc(sizeof_buf, GFP_KERNEL);
905 if (!buf)
906 return -ENOMEM;
907
908 buf[0] = 2;
909 buf[1] = command;
910 buf[2] = data;
911
912 if ((ret =
913 aiptek_set_report(aiptek, 3, 2, buf, sizeof_buf)) != sizeof_buf) {
914 dbg("aiptek_program: failed, tried to send: 0x%02x 0x%02x",
915 command, data);
916 }
917 kfree(buf);
918 return ret < 0 ? ret : 0;
919}
920
921
922
923
924
925
926static int
927aiptek_query(struct aiptek *aiptek, unsigned char command, unsigned char data)
928{
929 const int sizeof_buf = 3 * sizeof(u8);
930 int ret;
931 u8 *buf;
932
933 buf = kmalloc(sizeof_buf, GFP_KERNEL);
934 if (!buf)
935 return -ENOMEM;
936
937 buf[0] = 2;
938 buf[1] = command;
939 buf[2] = data;
940
941 if (aiptek_command(aiptek, command, data) != 0) {
942 kfree(buf);
943 return -EIO;
944 }
945 msleep(aiptek->curSetting.programmableDelay);
946
947 if ((ret =
948 aiptek_get_report(aiptek, 3, 2, buf, sizeof_buf)) != sizeof_buf) {
949 dbg("aiptek_query failed: returned 0x%02x 0x%02x 0x%02x",
950 buf[0], buf[1], buf[2]);
951 ret = -EIO;
952 } else {
953 ret = le16_to_cpu(get_unaligned((__le16 *) (buf + 1)));
954 }
955 kfree(buf);
956 return ret;
957}
958
959
960
961
962
963static int aiptek_program_tablet(struct aiptek *aiptek)
964{
965 int ret;
966
967 if ((ret = aiptek_command(aiptek, 0x18, 0x04)) < 0)
968 return ret;
969
970
971 if ((ret = aiptek_query(aiptek, 0x02, 0x00)) < 0)
972 return ret;
973 aiptek->features.modelCode = ret & 0xff;
974
975
976 if ((ret = aiptek_query(aiptek, 0x03, 0x00)) < 0)
977 return ret;
978 aiptek->features.odmCode = ret;
979
980
981 if ((ret = aiptek_query(aiptek, 0x04, 0x00)) < 0)
982 return ret;
983 aiptek->features.firmwareCode = ret;
984
985
986 if ((ret = aiptek_query(aiptek, 0x01, 0x00)) < 0)
987 return ret;
988 aiptek->inputdev->absmin[ABS_X] = 0;
989 aiptek->inputdev->absmax[ABS_X] = ret - 1;
990
991
992 if ((ret = aiptek_query(aiptek, 0x01, 0x01)) < 0)
993 return ret;
994 aiptek->inputdev->absmin[ABS_Y] = 0;
995 aiptek->inputdev->absmax[ABS_Y] = ret - 1;
996
997
998 if ((ret = aiptek_query(aiptek, 0x08, 0x00)) < 0)
999 return ret;
1000 aiptek->inputdev->absmin[ABS_PRESSURE] = 0;
1001 aiptek->inputdev->absmax[ABS_PRESSURE] = ret - 1;
1002
1003
1004
1005
1006 if (aiptek->curSetting.coordinateMode ==
1007 AIPTEK_COORDINATE_ABSOLUTE_MODE) {
1008
1009 if ((ret = aiptek_command(aiptek, 0x10, 0x01)) < 0) {
1010 return ret;
1011 }
1012 } else {
1013
1014 if ((ret = aiptek_command(aiptek, 0x10, 0x00)) < 0) {
1015 return ret;
1016 }
1017 }
1018
1019
1020 if ((ret = aiptek_command(aiptek, 0x11, 0x02)) < 0)
1021 return ret;
1022#if 0
1023
1024 if ((ret = aiptek_command(aiptek, 0x17, 0x00)) < 0)
1025 return ret;
1026#endif
1027
1028
1029 if ((ret = aiptek_command(aiptek, 0x12, 0xff)) < 0)
1030 return ret;
1031
1032
1033
1034 aiptek->diagnostic = AIPTEK_DIAGNOSTIC_NA;
1035 aiptek->eventCount = 0;
1036
1037 return 0;
1038}
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050static ssize_t show_tabletSize(struct device *dev, struct device_attribute *attr, char *buf)
1051{
1052 struct aiptek *aiptek = dev_get_drvdata(dev);
1053
1054 return snprintf(buf, PAGE_SIZE, "%dx%d\n",
1055 aiptek->inputdev->absmax[ABS_X] + 1,
1056 aiptek->inputdev->absmax[ABS_Y] + 1);
1057}
1058
1059
1060
1061
1062
1063
1064
1065static DEVICE_ATTR(size, S_IRUGO, show_tabletSize, NULL);
1066
1067
1068
1069
1070
1071static struct aiptek_map pointer_mode_map[] = {
1072 { "stylus", AIPTEK_POINTER_ONLY_STYLUS_MODE },
1073 { "mouse", AIPTEK_POINTER_ONLY_MOUSE_MODE },
1074 { "either", AIPTEK_POINTER_EITHER_MODE },
1075 { NULL, AIPTEK_INVALID_VALUE }
1076};
1077
1078static ssize_t show_tabletPointerMode(struct device *dev, struct device_attribute *attr, char *buf)
1079{
1080 struct aiptek *aiptek = dev_get_drvdata(dev);
1081
1082 return snprintf(buf, PAGE_SIZE, "%s\n",
1083 map_val_to_str(pointer_mode_map,
1084 aiptek->curSetting.pointerMode));
1085}
1086
1087static ssize_t
1088store_tabletPointerMode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1089{
1090 struct aiptek *aiptek = dev_get_drvdata(dev);
1091 int new_mode = map_str_to_val(pointer_mode_map, buf, count);
1092
1093 if (new_mode == AIPTEK_INVALID_VALUE)
1094 return -EINVAL;
1095
1096 aiptek->newSetting.pointerMode = new_mode;
1097 return count;
1098}
1099
1100static DEVICE_ATTR(pointer_mode,
1101 S_IRUGO | S_IWUGO,
1102 show_tabletPointerMode, store_tabletPointerMode);
1103
1104
1105
1106
1107
1108
1109static struct aiptek_map coordinate_mode_map[] = {
1110 { "absolute", AIPTEK_COORDINATE_ABSOLUTE_MODE },
1111 { "relative", AIPTEK_COORDINATE_RELATIVE_MODE },
1112 { NULL, AIPTEK_INVALID_VALUE }
1113};
1114
1115static ssize_t show_tabletCoordinateMode(struct device *dev, struct device_attribute *attr, char *buf)
1116{
1117 struct aiptek *aiptek = dev_get_drvdata(dev);
1118
1119 return snprintf(buf, PAGE_SIZE, "%s\n",
1120 map_val_to_str(coordinate_mode_map,
1121 aiptek->curSetting.coordinateMode));
1122}
1123
1124static ssize_t
1125store_tabletCoordinateMode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1126{
1127 struct aiptek *aiptek = dev_get_drvdata(dev);
1128 int new_mode = map_str_to_val(coordinate_mode_map, buf, count);
1129
1130 if (new_mode == AIPTEK_INVALID_VALUE)
1131 return -EINVAL;
1132
1133 aiptek->newSetting.coordinateMode = new_mode;
1134 return count;
1135}
1136
1137static DEVICE_ATTR(coordinate_mode,
1138 S_IRUGO | S_IWUGO,
1139 show_tabletCoordinateMode, store_tabletCoordinateMode);
1140
1141
1142
1143
1144
1145
1146static struct aiptek_map tool_mode_map[] = {
1147 { "mouse", AIPTEK_TOOL_BUTTON_MOUSE_MODE },
1148 { "eraser", AIPTEK_TOOL_BUTTON_ERASER_MODE },
1149 { "pencil", AIPTEK_TOOL_BUTTON_PENCIL_MODE },
1150 { "pen", AIPTEK_TOOL_BUTTON_PEN_MODE },
1151 { "brush", AIPTEK_TOOL_BUTTON_BRUSH_MODE },
1152 { "airbrush", AIPTEK_TOOL_BUTTON_AIRBRUSH_MODE },
1153 { "lens", AIPTEK_TOOL_BUTTON_LENS_MODE },
1154 { NULL, AIPTEK_INVALID_VALUE }
1155};
1156
1157static ssize_t show_tabletToolMode(struct device *dev, struct device_attribute *attr, char *buf)
1158{
1159 struct aiptek *aiptek = dev_get_drvdata(dev);
1160
1161 return snprintf(buf, PAGE_SIZE, "%s\n",
1162 map_val_to_str(tool_mode_map,
1163 aiptek->curSetting.toolMode));
1164}
1165
1166static ssize_t
1167store_tabletToolMode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1168{
1169 struct aiptek *aiptek = dev_get_drvdata(dev);
1170 int new_mode = map_str_to_val(tool_mode_map, buf, count);
1171
1172 if (new_mode == AIPTEK_INVALID_VALUE)
1173 return -EINVAL;
1174
1175 aiptek->newSetting.toolMode = new_mode;
1176 return count;
1177}
1178
1179static DEVICE_ATTR(tool_mode,
1180 S_IRUGO | S_IWUGO,
1181 show_tabletToolMode, store_tabletToolMode);
1182
1183
1184
1185
1186
1187static ssize_t show_tabletXtilt(struct device *dev, struct device_attribute *attr, char *buf)
1188{
1189 struct aiptek *aiptek = dev_get_drvdata(dev);
1190
1191 if (aiptek->curSetting.xTilt == AIPTEK_TILT_DISABLE) {
1192 return snprintf(buf, PAGE_SIZE, "disable\n");
1193 } else {
1194 return snprintf(buf, PAGE_SIZE, "%d\n",
1195 aiptek->curSetting.xTilt);
1196 }
1197}
1198
1199static ssize_t
1200store_tabletXtilt(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1201{
1202 struct aiptek *aiptek = dev_get_drvdata(dev);
1203 int x;
1204
1205 if (strcmp(buf, "disable") == 0) {
1206 aiptek->newSetting.xTilt = AIPTEK_TILT_DISABLE;
1207 } else {
1208 x = (int)simple_strtol(buf, NULL, 10);
1209 if (x >= AIPTEK_TILT_MIN && x <= AIPTEK_TILT_MAX) {
1210 aiptek->newSetting.xTilt = x;
1211 }
1212 }
1213 return count;
1214}
1215
1216static DEVICE_ATTR(xtilt,
1217 S_IRUGO | S_IWUGO, show_tabletXtilt, store_tabletXtilt);
1218
1219
1220
1221
1222
1223static ssize_t show_tabletYtilt(struct device *dev, struct device_attribute *attr, char *buf)
1224{
1225 struct aiptek *aiptek = dev_get_drvdata(dev);
1226
1227 if (aiptek->curSetting.yTilt == AIPTEK_TILT_DISABLE) {
1228 return snprintf(buf, PAGE_SIZE, "disable\n");
1229 } else {
1230 return snprintf(buf, PAGE_SIZE, "%d\n",
1231 aiptek->curSetting.yTilt);
1232 }
1233}
1234
1235static ssize_t
1236store_tabletYtilt(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1237{
1238 struct aiptek *aiptek = dev_get_drvdata(dev);
1239 int y;
1240
1241 if (strcmp(buf, "disable") == 0) {
1242 aiptek->newSetting.yTilt = AIPTEK_TILT_DISABLE;
1243 } else {
1244 y = (int)simple_strtol(buf, NULL, 10);
1245 if (y >= AIPTEK_TILT_MIN && y <= AIPTEK_TILT_MAX) {
1246 aiptek->newSetting.yTilt = y;
1247 }
1248 }
1249 return count;
1250}
1251
1252static DEVICE_ATTR(ytilt,
1253 S_IRUGO | S_IWUGO, show_tabletYtilt, store_tabletYtilt);
1254
1255
1256
1257
1258
1259static ssize_t show_tabletJitterDelay(struct device *dev, struct device_attribute *attr, char *buf)
1260{
1261 struct aiptek *aiptek = dev_get_drvdata(dev);
1262
1263 return snprintf(buf, PAGE_SIZE, "%d\n", aiptek->curSetting.jitterDelay);
1264}
1265
1266static ssize_t
1267store_tabletJitterDelay(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1268{
1269 struct aiptek *aiptek = dev_get_drvdata(dev);
1270
1271 aiptek->newSetting.jitterDelay = (int)simple_strtol(buf, NULL, 10);
1272 return count;
1273}
1274
1275static DEVICE_ATTR(jitter,
1276 S_IRUGO | S_IWUGO,
1277 show_tabletJitterDelay, store_tabletJitterDelay);
1278
1279
1280
1281
1282
1283static ssize_t show_tabletProgrammableDelay(struct device *dev, struct device_attribute *attr, char *buf)
1284{
1285 struct aiptek *aiptek = dev_get_drvdata(dev);
1286
1287 return snprintf(buf, PAGE_SIZE, "%d\n",
1288 aiptek->curSetting.programmableDelay);
1289}
1290
1291static ssize_t
1292store_tabletProgrammableDelay(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1293{
1294 struct aiptek *aiptek = dev_get_drvdata(dev);
1295
1296 aiptek->newSetting.programmableDelay = (int)simple_strtol(buf, NULL, 10);
1297 return count;
1298}
1299
1300static DEVICE_ATTR(delay,
1301 S_IRUGO | S_IWUGO,
1302 show_tabletProgrammableDelay, store_tabletProgrammableDelay);
1303
1304
1305
1306
1307
1308static 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 snprintf(buf, PAGE_SIZE, "%ld\n", aiptek->eventCount);
1313}
1314
1315static DEVICE_ATTR(event_count, S_IRUGO, show_tabletEventsReceived, NULL);
1316
1317
1318
1319
1320
1321static 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 snprintf(buf, PAGE_SIZE, retMsg);
1352}
1353
1354static DEVICE_ATTR(diagnostic, S_IRUGO, show_tabletDiagnosticMessage, NULL);
1355
1356
1357
1358
1359
1360
1361static 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
1367static 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 snprintf(buf, PAGE_SIZE, "%s\n",
1372 map_val_to_str(stylus_button_map,
1373 aiptek->curSetting.stylusButtonUpper));
1374}
1375
1376static ssize_t
1377store_tabletStylusUpper(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1378{
1379 struct aiptek *aiptek = dev_get_drvdata(dev);
1380 int new_button = map_str_to_val(stylus_button_map, buf, count);
1381
1382 if (new_button == AIPTEK_INVALID_VALUE)
1383 return -EINVAL;
1384
1385 aiptek->newSetting.stylusButtonUpper = new_button;
1386 return count;
1387}
1388
1389static DEVICE_ATTR(stylus_upper,
1390 S_IRUGO | S_IWUGO,
1391 show_tabletStylusUpper, store_tabletStylusUpper);
1392
1393
1394
1395
1396
1397
1398static ssize_t show_tabletStylusLower(struct device *dev, struct device_attribute *attr, char *buf)
1399{
1400 struct aiptek *aiptek = dev_get_drvdata(dev);
1401
1402 return snprintf(buf, PAGE_SIZE, "%s\n",
1403 map_val_to_str(stylus_button_map,
1404 aiptek->curSetting.stylusButtonLower));
1405}
1406
1407static ssize_t
1408store_tabletStylusLower(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1409{
1410 struct aiptek *aiptek = dev_get_drvdata(dev);
1411 int new_button = map_str_to_val(stylus_button_map, buf, count);
1412
1413 if (new_button == AIPTEK_INVALID_VALUE)
1414 return -EINVAL;
1415
1416 aiptek->newSetting.stylusButtonLower = new_button;
1417 return count;
1418}
1419
1420static DEVICE_ATTR(stylus_lower,
1421 S_IRUGO | S_IWUGO,
1422 show_tabletStylusLower, store_tabletStylusLower);
1423
1424
1425
1426
1427
1428
1429static struct aiptek_map mouse_button_map[] = {
1430 { "left", AIPTEK_MOUSE_LEFT_BUTTON },
1431 { "middle", AIPTEK_MOUSE_MIDDLE_BUTTON },
1432 { "right", AIPTEK_MOUSE_RIGHT_BUTTON },
1433 { NULL, AIPTEK_INVALID_VALUE }
1434};
1435
1436static ssize_t show_tabletMouseLeft(struct device *dev, struct device_attribute *attr, char *buf)
1437{
1438 struct aiptek *aiptek = dev_get_drvdata(dev);
1439
1440 return snprintf(buf, PAGE_SIZE, "%s\n",
1441 map_val_to_str(mouse_button_map,
1442 aiptek->curSetting.mouseButtonLeft));
1443}
1444
1445static ssize_t
1446store_tabletMouseLeft(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1447{
1448 struct aiptek *aiptek = dev_get_drvdata(dev);
1449 int new_button = map_str_to_val(mouse_button_map, buf, count);
1450
1451 if (new_button == AIPTEK_INVALID_VALUE)
1452 return -EINVAL;
1453
1454 aiptek->newSetting.mouseButtonLeft = new_button;
1455 return count;
1456}
1457
1458static DEVICE_ATTR(mouse_left,
1459 S_IRUGO | S_IWUGO,
1460 show_tabletMouseLeft, store_tabletMouseLeft);
1461
1462
1463
1464
1465
1466static ssize_t show_tabletMouseMiddle(struct device *dev, struct device_attribute *attr, char *buf)
1467{
1468 struct aiptek *aiptek = dev_get_drvdata(dev);
1469
1470 return snprintf(buf, PAGE_SIZE, "%s\n",
1471 map_val_to_str(mouse_button_map,
1472 aiptek->curSetting.mouseButtonMiddle));
1473}
1474
1475static ssize_t
1476store_tabletMouseMiddle(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1477{
1478 struct aiptek *aiptek = dev_get_drvdata(dev);
1479 int new_button = map_str_to_val(mouse_button_map, buf, count);
1480
1481 if (new_button == AIPTEK_INVALID_VALUE)
1482 return -EINVAL;
1483
1484 aiptek->newSetting.mouseButtonMiddle = new_button;
1485 return count;
1486}
1487
1488static DEVICE_ATTR(mouse_middle,
1489 S_IRUGO | S_IWUGO,
1490 show_tabletMouseMiddle, store_tabletMouseMiddle);
1491
1492
1493
1494
1495
1496static ssize_t show_tabletMouseRight(struct device *dev, struct device_attribute *attr, char *buf)
1497{
1498 struct aiptek *aiptek = dev_get_drvdata(dev);
1499
1500 return snprintf(buf, PAGE_SIZE, "%s\n",
1501 map_val_to_str(mouse_button_map,
1502 aiptek->curSetting.mouseButtonRight));
1503}
1504
1505static ssize_t
1506store_tabletMouseRight(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1507{
1508 struct aiptek *aiptek = dev_get_drvdata(dev);
1509 int new_button = map_str_to_val(mouse_button_map, buf, count);
1510
1511 if (new_button == AIPTEK_INVALID_VALUE)
1512 return -EINVAL;
1513
1514 aiptek->newSetting.mouseButtonRight = new_button;
1515 return count;
1516}
1517
1518static DEVICE_ATTR(mouse_right,
1519 S_IRUGO | S_IWUGO,
1520 show_tabletMouseRight, store_tabletMouseRight);
1521
1522
1523
1524
1525
1526static ssize_t show_tabletWheel(struct device *dev, struct device_attribute *attr, char *buf)
1527{
1528 struct aiptek *aiptek = dev_get_drvdata(dev);
1529
1530 if (aiptek->curSetting.wheel == AIPTEK_WHEEL_DISABLE) {
1531 return snprintf(buf, PAGE_SIZE, "disable\n");
1532 } else {
1533 return snprintf(buf, PAGE_SIZE, "%d\n",
1534 aiptek->curSetting.wheel);
1535 }
1536}
1537
1538static ssize_t
1539store_tabletWheel(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1540{
1541 struct aiptek *aiptek = dev_get_drvdata(dev);
1542
1543 aiptek->newSetting.wheel = (int)simple_strtol(buf, NULL, 10);
1544 return count;
1545}
1546
1547static DEVICE_ATTR(wheel,
1548 S_IRUGO | S_IWUGO, show_tabletWheel, store_tabletWheel);
1549
1550
1551
1552
1553
1554static ssize_t show_tabletExecute(struct device *dev, struct device_attribute *attr, char *buf)
1555{
1556
1557
1558
1559 return snprintf(buf, PAGE_SIZE,
1560 "Write anything to this file to program your tablet.\n");
1561}
1562
1563static ssize_t
1564store_tabletExecute(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1565{
1566 struct aiptek *aiptek = dev_get_drvdata(dev);
1567
1568
1569
1570
1571 memcpy(&aiptek->curSetting, &aiptek->newSetting,
1572 sizeof(struct aiptek_settings));
1573
1574 if (aiptek_program_tablet(aiptek) < 0)
1575 return -EIO;
1576
1577 return count;
1578}
1579
1580static DEVICE_ATTR(execute,
1581 S_IRUGO | S_IWUGO, show_tabletExecute, store_tabletExecute);
1582
1583
1584
1585
1586
1587static ssize_t show_tabletODMCode(struct device *dev, struct device_attribute *attr, char *buf)
1588{
1589 struct aiptek *aiptek = dev_get_drvdata(dev);
1590
1591 return snprintf(buf, PAGE_SIZE, "0x%04x\n", aiptek->features.odmCode);
1592}
1593
1594static DEVICE_ATTR(odm_code, S_IRUGO, show_tabletODMCode, NULL);
1595
1596
1597
1598
1599
1600static ssize_t show_tabletModelCode(struct device *dev, struct device_attribute *attr, char *buf)
1601{
1602 struct aiptek *aiptek = dev_get_drvdata(dev);
1603
1604 return snprintf(buf, PAGE_SIZE, "0x%04x\n", aiptek->features.modelCode);
1605}
1606
1607static DEVICE_ATTR(model_code, S_IRUGO, show_tabletModelCode, NULL);
1608
1609
1610
1611
1612
1613static ssize_t show_firmwareCode(struct device *dev, struct device_attribute *attr, char *buf)
1614{
1615 struct aiptek *aiptek = dev_get_drvdata(dev);
1616
1617 return snprintf(buf, PAGE_SIZE, "%04x\n",
1618 aiptek->features.firmwareCode);
1619}
1620
1621static DEVICE_ATTR(firmware_code, S_IRUGO, show_firmwareCode, NULL);
1622
1623static struct attribute *aiptek_attributes[] = {
1624 &dev_attr_size.attr,
1625 &dev_attr_pointer_mode.attr,
1626 &dev_attr_coordinate_mode.attr,
1627 &dev_attr_tool_mode.attr,
1628 &dev_attr_xtilt.attr,
1629 &dev_attr_ytilt.attr,
1630 &dev_attr_jitter.attr,
1631 &dev_attr_delay.attr,
1632 &dev_attr_event_count.attr,
1633 &dev_attr_diagnostic.attr,
1634 &dev_attr_odm_code.attr,
1635 &dev_attr_model_code.attr,
1636 &dev_attr_firmware_code.attr,
1637 &dev_attr_stylus_lower.attr,
1638 &dev_attr_stylus_upper.attr,
1639 &dev_attr_mouse_left.attr,
1640 &dev_attr_mouse_middle.attr,
1641 &dev_attr_mouse_right.attr,
1642 &dev_attr_wheel.attr,
1643 &dev_attr_execute.attr,
1644 NULL
1645};
1646
1647static struct attribute_group aiptek_attribute_group = {
1648 .attrs = aiptek_attributes,
1649};
1650
1651
1652
1653
1654
1655static int
1656aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
1657{
1658 struct usb_device *usbdev = interface_to_usbdev(intf);
1659 struct usb_endpoint_descriptor *endpoint;
1660 struct aiptek *aiptek;
1661 struct input_dev *inputdev;
1662 int i;
1663 int speeds[] = { 0,
1664 AIPTEK_PROGRAMMABLE_DELAY_50,
1665 AIPTEK_PROGRAMMABLE_DELAY_400,
1666 AIPTEK_PROGRAMMABLE_DELAY_25,
1667 AIPTEK_PROGRAMMABLE_DELAY_100,
1668 AIPTEK_PROGRAMMABLE_DELAY_200,
1669 AIPTEK_PROGRAMMABLE_DELAY_300
1670 };
1671 int err = -ENOMEM;
1672
1673
1674
1675
1676
1677
1678
1679 speeds[0] = programmableDelay;
1680
1681 aiptek = kzalloc(sizeof(struct aiptek), GFP_KERNEL);
1682 inputdev = input_allocate_device();
1683 if (!aiptek || !inputdev) {
1684 warn("aiptek: cannot allocate memory or input device");
1685 goto fail1;
1686 }
1687
1688 aiptek->data = usb_buffer_alloc(usbdev, AIPTEK_PACKET_LENGTH,
1689 GFP_ATOMIC, &aiptek->data_dma);
1690 if (!aiptek->data) {
1691 warn("aiptek: cannot allocate usb buffer");
1692 goto fail1;
1693 }
1694
1695 aiptek->urb = usb_alloc_urb(0, GFP_KERNEL);
1696 if (!aiptek->urb) {
1697 warn("aiptek: cannot allocate urb");
1698 goto fail2;
1699 }
1700
1701 aiptek->inputdev = inputdev;
1702 aiptek->usbdev = usbdev;
1703 aiptek->ifnum = intf->altsetting[0].desc.bInterfaceNumber;
1704 aiptek->inDelay = 0;
1705 aiptek->endDelay = 0;
1706 aiptek->previousJitterable = 0;
1707 aiptek->lastMacro = -1;
1708
1709
1710
1711
1712
1713
1714
1715 aiptek->curSetting.pointerMode = AIPTEK_POINTER_EITHER_MODE;
1716 aiptek->curSetting.coordinateMode = AIPTEK_COORDINATE_ABSOLUTE_MODE;
1717 aiptek->curSetting.toolMode = AIPTEK_TOOL_BUTTON_PEN_MODE;
1718 aiptek->curSetting.xTilt = AIPTEK_TILT_DISABLE;
1719 aiptek->curSetting.yTilt = AIPTEK_TILT_DISABLE;
1720 aiptek->curSetting.mouseButtonLeft = AIPTEK_MOUSE_LEFT_BUTTON;
1721 aiptek->curSetting.mouseButtonMiddle = AIPTEK_MOUSE_MIDDLE_BUTTON;
1722 aiptek->curSetting.mouseButtonRight = AIPTEK_MOUSE_RIGHT_BUTTON;
1723 aiptek->curSetting.stylusButtonUpper = AIPTEK_STYLUS_UPPER_BUTTON;
1724 aiptek->curSetting.stylusButtonLower = AIPTEK_STYLUS_LOWER_BUTTON;
1725 aiptek->curSetting.jitterDelay = jitterDelay;
1726 aiptek->curSetting.programmableDelay = programmableDelay;
1727
1728
1729
1730 aiptek->newSetting = aiptek->curSetting;
1731
1732
1733
1734
1735
1736
1737
1738
1739 usb_make_path(usbdev, aiptek->features.usbPath,
1740 sizeof(aiptek->features.usbPath));
1741 strlcat(aiptek->features.usbPath, "/input0",
1742 sizeof(aiptek->features.usbPath));
1743
1744
1745
1746
1747 inputdev->name = "Aiptek";
1748 inputdev->phys = aiptek->features.usbPath;
1749 usb_to_input_id(usbdev, &inputdev->id);
1750 inputdev->dev.parent = &intf->dev;
1751
1752 input_set_drvdata(inputdev, aiptek);
1753
1754 inputdev->open = aiptek_open;
1755 inputdev->close = aiptek_close;
1756
1757
1758
1759
1760 for (i = 0; i < ARRAY_SIZE(eventTypes); ++i)
1761 __set_bit(eventTypes[i], inputdev->evbit);
1762
1763 for (i = 0; i < ARRAY_SIZE(absEvents); ++i)
1764 __set_bit(absEvents[i], inputdev->absbit);
1765
1766 for (i = 0; i < ARRAY_SIZE(relEvents); ++i)
1767 __set_bit(relEvents[i], inputdev->relbit);
1768
1769 __set_bit(MSC_SERIAL, inputdev->mscbit);
1770
1771
1772 for (i = 0; i < ARRAY_SIZE(buttonEvents); ++i)
1773 __set_bit(buttonEvents[i], inputdev->keybit);
1774
1775 for (i = 0; i < ARRAY_SIZE(macroKeyEvents); ++i)
1776 __set_bit(macroKeyEvents[i], inputdev->keybit);
1777
1778
1779
1780
1781
1782
1783
1784 input_set_abs_params(inputdev, ABS_X, 0, 2999, 0, 0);
1785 input_set_abs_params(inputdev, ABS_Y, 0, 2249, 0, 0);
1786 input_set_abs_params(inputdev, ABS_PRESSURE, 0, 511, 0, 0);
1787 input_set_abs_params(inputdev, ABS_TILT_X, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0);
1788 input_set_abs_params(inputdev, ABS_TILT_Y, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0);
1789 input_set_abs_params(inputdev, ABS_WHEEL, AIPTEK_WHEEL_MIN, AIPTEK_WHEEL_MAX - 1, 0, 0);
1790
1791 endpoint = &intf->altsetting[0].endpoint[0].desc;
1792
1793
1794
1795
1796 usb_fill_int_urb(aiptek->urb,
1797 aiptek->usbdev,
1798 usb_rcvintpipe(aiptek->usbdev,
1799 endpoint->bEndpointAddress),
1800 aiptek->data, 8, aiptek_irq, aiptek,
1801 endpoint->bInterval);
1802
1803 aiptek->urb->transfer_dma = aiptek->data_dma;
1804 aiptek->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817 for (i = 0; i < ARRAY_SIZE(speeds); ++i) {
1818 aiptek->curSetting.programmableDelay = speeds[i];
1819 (void)aiptek_program_tablet(aiptek);
1820 if (aiptek->inputdev->absmax[ABS_X] > 0) {
1821 info("input: Aiptek using %d ms programming speed\n",
1822 aiptek->curSetting.programmableDelay);
1823 break;
1824 }
1825 }
1826
1827
1828
1829 if (i == ARRAY_SIZE(speeds)) {
1830 info("input: Aiptek tried all speeds, no sane response");
1831 goto fail2;
1832 }
1833
1834
1835
1836 usb_set_intfdata(intf, aiptek);
1837
1838
1839
1840 err = sysfs_create_group(&intf->dev.kobj, &aiptek_attribute_group);
1841 if (err) {
1842 warn("aiptek: cannot create sysfs group err: %d", err);
1843 goto fail3;
1844 }
1845
1846
1847
1848 err = input_register_device(aiptek->inputdev);
1849 if (err) {
1850 warn("aiptek: input_register_device returned err: %d", err);
1851 goto fail4;
1852 }
1853 return 0;
1854
1855 fail4: sysfs_remove_group(&intf->dev.kobj, &aiptek_attribute_group);
1856 fail3: usb_free_urb(aiptek->urb);
1857 fail2: usb_buffer_free(usbdev, AIPTEK_PACKET_LENGTH, aiptek->data,
1858 aiptek->data_dma);
1859 fail1: usb_set_intfdata(intf, NULL);
1860 input_free_device(inputdev);
1861 kfree(aiptek);
1862 return err;
1863}
1864
1865
1866
1867
1868static void aiptek_disconnect(struct usb_interface *intf)
1869{
1870 struct aiptek *aiptek = usb_get_intfdata(intf);
1871
1872
1873
1874 usb_set_intfdata(intf, NULL);
1875 if (aiptek != NULL) {
1876
1877
1878 usb_kill_urb(aiptek->urb);
1879 input_unregister_device(aiptek->inputdev);
1880 sysfs_remove_group(&intf->dev.kobj, &aiptek_attribute_group);
1881 usb_free_urb(aiptek->urb);
1882 usb_buffer_free(interface_to_usbdev(intf),
1883 AIPTEK_PACKET_LENGTH,
1884 aiptek->data, aiptek->data_dma);
1885 kfree(aiptek);
1886 }
1887}
1888
1889static struct usb_driver aiptek_driver = {
1890 .name = "aiptek",
1891 .probe = aiptek_probe,
1892 .disconnect = aiptek_disconnect,
1893 .id_table = aiptek_ids,
1894};
1895
1896static int __init aiptek_init(void)
1897{
1898 int result = usb_register(&aiptek_driver);
1899 if (result == 0) {
1900 info(DRIVER_VERSION ": " DRIVER_AUTHOR);
1901 info(DRIVER_DESC);
1902 }
1903 return result;
1904}
1905
1906static void __exit aiptek_exit(void)
1907{
1908 usb_deregister(&aiptek_driver);
1909}
1910
1911MODULE_AUTHOR(DRIVER_AUTHOR);
1912MODULE_DESCRIPTION(DRIVER_DESC);
1913MODULE_LICENSE("GPL");
1914
1915module_param(programmableDelay, int, 0);
1916MODULE_PARM_DESC(programmableDelay, "delay used during tablet programming");
1917module_param(jitterDelay, int, 0);
1918MODULE_PARM_DESC(jitterDelay, "stylus/mouse settlement delay");
1919
1920module_init(aiptek_init);
1921module_exit(aiptek_exit);
1922