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