Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 95478 | Differences between
and this patch

Collapse All | Expand All

(-)drivers/usb/input/hid-core.c (+2 lines)
Lines 1317-1322 Link Here
1317
#define USB_DEVICE_ID_WACOM_PL		0x0030
1317
#define USB_DEVICE_ID_WACOM_PL		0x0030
1318
#define USB_DEVICE_ID_WACOM_INTUOS2	0x0040
1318
#define USB_DEVICE_ID_WACOM_INTUOS2	0x0040
1319
#define USB_DEVICE_ID_WACOM_VOLITO	0x0060
1319
#define USB_DEVICE_ID_WACOM_VOLITO	0x0060
1320
#define USB_DEVICE_ID_WACOM_VOLITO2 0x0062
1320
#define USB_DEVICE_ID_WACOM_PTU		0x0003
1321
#define USB_DEVICE_ID_WACOM_PTU		0x0003
1321
#define USB_DEVICE_ID_WACOM_INTUOS3	0x00B0
1322
#define USB_DEVICE_ID_WACOM_INTUOS3	0x00B0
1322
#define USB_DEVICE_ID_WACOM_CINTIQ	0x003F
1323
#define USB_DEVICE_ID_WACOM_CINTIQ	0x003F
Lines 1528-1533 Link Here
1528
	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 5, HID_QUIRK_IGNORE },
1529
	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 5, HID_QUIRK_IGNORE },
1529
	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 7, HID_QUIRK_IGNORE },
1530
	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 7, HID_QUIRK_IGNORE },
1530
	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO, HID_QUIRK_IGNORE },
1531
	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO, HID_QUIRK_IGNORE },
1532
	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO2, HID_QUIRK_IGNORE },
1531
	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PTU, HID_QUIRK_IGNORE },
1533
	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PTU, HID_QUIRK_IGNORE },
1532
	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3, HID_QUIRK_IGNORE },
1534
	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3, HID_QUIRK_IGNORE },
1533
	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 1, HID_QUIRK_IGNORE },
1535
	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 1, HID_QUIRK_IGNORE },
(-)drivers/usb/input/wacom.c (-82 / +129 lines)
Lines 51-59 Link Here
51
 *		   - Cleanups here and there
51
 *		   - Cleanups here and there
52
 *    v1.30.1 (pi) - Added Graphire3 support
52
 *    v1.30.1 (pi) - Added Graphire3 support
53
 *	v1.40 (pc) - Add support for several new devices, fix eraser reporting, ...
53
 *	v1.40 (pc) - Add support for several new devices, fix eraser reporting, ...
54
 *	v1.43 (pc) - Added support for Cintiq 21UX
54
 *
55
		   - Fixed a Graphire bug
55
 *   WARNING: THIS IS NOT PART OF THE OFFICIAL KERNEL TREE
56
		   - Merged wacom_intuos3_irq into wacom_intuos_irq
56
 *   THIS IS FOR TESTING PURPOSES
57
 *
58
 *    v1.40-2.6.11.3-pc-0.1 - initial release based on 2.6.11
59
 *			    - fixed a Graphire bug
60
 *			    - added Intuos3
61
 *			    - added Cintiq 21UX
62
 *    v1.40-2.6.11.3-pc-0.2 - fixed an I3 bug
63
 *    v1.40-2.6.11.3-pc-0.3 - fixed a Cintiq 21UX bug
64
 *
57
 */
65
 */
58
66
59
/*
67
/*
Lines 69-82 Link Here
69
#include <linux/module.h>
77
#include <linux/module.h>
70
#include <linux/init.h>
78
#include <linux/init.h>
71
#include <linux/usb.h>
79
#include <linux/usb.h>
72
#include <linux/usb_input.h>
73
#include <asm/unaligned.h>
80
#include <asm/unaligned.h>
74
#include <asm/byteorder.h>
81
#include <asm/byteorder.h>
75
82
76
/*
83
/*
77
 * Version Information
84
 * Version Information
78
 */
85
 */
79
#define DRIVER_VERSION "v1.43"
86
#define DRIVER_VERSION "v1.40 - 2.6.11.3-pc-0.3"
80
#define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>"
87
#define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>"
81
#define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver"
88
#define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver"
82
#define DRIVER_LICENSE "GPL"
89
#define DRIVER_LICENSE "GPL"
Lines 116-121 Link Here
116
	struct urb *irq;
123
	struct urb *irq;
117
	struct wacom_features *features;
124
	struct wacom_features *features;
118
	int tool[2];
125
	int tool[2];
126
	int open;
119
	__u32 serial[2];
127
	__u32 serial[2];
120
	char phys[32];
128
	char phys[32];
121
};
129
};
Lines 128-134 Link Here
128
		usb_sndctrlpipe(interface_to_usbdev(intf), 0),
136
		usb_sndctrlpipe(interface_to_usbdev(intf), 0),
129
                USB_REQ_SET_REPORT, USB_TYPE_CLASS | USB_RECIP_INTERFACE,
137
                USB_REQ_SET_REPORT, USB_TYPE_CLASS | USB_RECIP_INTERFACE,
130
                (type << 8) + id, intf->altsetting[0].desc.bInterfaceNumber,
138
                (type << 8) + id, intf->altsetting[0].desc.bInterfaceNumber,
131
		buf, size, 1000);
139
		buf, size, HZ);
132
}
140
}
133
141
134
static void wacom_pl_irq(struct urb *urb, struct pt_regs *regs)
142
static void wacom_pl_irq(struct urb *urb, struct pt_regs *regs)
Lines 162-168 Link Here
162
	prox = data[1] & 0x40;
170
	prox = data[1] & 0x40;
163
171
164
	input_regs(dev, regs);
172
	input_regs(dev, regs);
165
173
	
166
	if (prox) {
174
	if (prox) {
167
175
168
		pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1));
176
		pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1));
Lines 179-185 Link Here
179
		if (!wacom->tool[0]) {
187
		if (!wacom->tool[0]) {
180
			/* Going into proximity select tool */
188
			/* Going into proximity select tool */
181
			wacom->tool[1] = (data[4] & 0x20)? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
189
			wacom->tool[1] = (data[4] & 0x20)? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
182
		} else {
190
		}
191
		else {
183
			/* was entered with stylus2 pressed */
192
			/* was entered with stylus2 pressed */
184
			if (wacom->tool[1] == BTN_TOOL_RUBBER && !(data[4] & 0x20) ) {
193
			if (wacom->tool[1] == BTN_TOOL_RUBBER && !(data[4] & 0x20) ) {
185
				/* report out proximity for previous tool */
194
				/* report out proximity for previous tool */
Lines 202-208 Link Here
202
		input_report_key(dev, BTN_STYLUS, data[4] & 0x10);
211
		input_report_key(dev, BTN_STYLUS, data[4] & 0x10);
203
		/* Only allow the stylus2 button to be reported for the pen tool. */
212
		/* Only allow the stylus2 button to be reported for the pen tool. */
204
		input_report_key(dev, BTN_STYLUS2, (wacom->tool[1] == BTN_TOOL_PEN) && (data[4] & 0x20));
213
		input_report_key(dev, BTN_STYLUS2, (wacom->tool[1] == BTN_TOOL_PEN) && (data[4] & 0x20));
205
	} else {
214
	}
215
	else {
206
		/* report proximity-out of a (valid) tool */
216
		/* report proximity-out of a (valid) tool */
207
		if (wacom->tool[1] != BTN_TOOL_RUBBER) {
217
		if (wacom->tool[1] != BTN_TOOL_RUBBER) {
208
			/* Unknown tool selected default to pen tool */
218
			/* Unknown tool selected default to pen tool */
Lines 214-220 Link Here
214
	wacom->tool[0] = prox; /* Save proximity state */
224
	wacom->tool[0] = prox; /* Save proximity state */
215
	input_sync(dev);
225
	input_sync(dev);
216
226
217
 exit:
227
exit:
218
	retval = usb_submit_urb (urb, GFP_ATOMIC);
228
	retval = usb_submit_urb (urb, GFP_ATOMIC);
219
	if (retval)
229
	if (retval)
220
		err ("%s - usb_submit_urb failed with result %d",
230
		err ("%s - usb_submit_urb failed with result %d",
Lines 243-258 Link Here
243
		goto exit;
253
		goto exit;
244
	}
254
	}
245
255
246
	if (data[0] != 2) {
256
	if (data[0] != 2)
257
	{
247
		printk(KERN_INFO "wacom_ptu_irq: received unknown report #%d\n", data[0]);
258
		printk(KERN_INFO "wacom_ptu_irq: received unknown report #%d\n", data[0]);
248
		goto exit;
259
		goto exit;
249
	}
260
	}
250
261
251
	input_regs(dev, regs);
262
	input_regs(dev, regs);
252
	if (data[1] & 0x04) {
263
	if (data[1] & 0x04)
264
	{
253
		input_report_key(dev, BTN_TOOL_RUBBER, data[1] & 0x20);
265
		input_report_key(dev, BTN_TOOL_RUBBER, data[1] & 0x20);
254
		input_report_key(dev, BTN_TOUCH, data[1] & 0x08);
266
		input_report_key(dev, BTN_TOUCH, data[1] & 0x08);
255
	} else {
267
	}
268
	else
269
	{
256
		input_report_key(dev, BTN_TOOL_PEN, data[1] & 0x20);
270
		input_report_key(dev, BTN_TOOL_PEN, data[1] & 0x20);
257
		input_report_key(dev, BTN_TOUCH, data[1] & 0x01);
271
		input_report_key(dev, BTN_TOUCH, data[1] & 0x01);
258
	}
272
	}
Lines 264-270 Link Here
264
278
265
	input_sync(dev);
279
	input_sync(dev);
266
280
267
 exit:
281
exit:
268
	retval = usb_submit_urb (urb, GFP_ATOMIC);
282
	retval = usb_submit_urb (urb, GFP_ATOMIC);
269
	if (retval)
283
	if (retval)
270
		err ("%s - usb_submit_urb failed with result %d",
284
		err ("%s - usb_submit_urb failed with result %d",
Lines 307-313 Link Here
307
	input_report_key(dev, BTN_STYLUS, (data[5] & 0x40));
321
	input_report_key(dev, BTN_STYLUS, (data[5] & 0x40));
308
	input_sync(dev);
322
	input_sync(dev);
309
323
310
 exit:
324
exit:
311
	retval = usb_submit_urb (urb, GFP_ATOMIC);
325
	retval = usb_submit_urb (urb, GFP_ATOMIC);
312
	if (retval)
326
	if (retval)
313
		err ("%s - usb_submit_urb failed with result %d",
327
		err ("%s - usb_submit_urb failed with result %d",
Lines 344-351 Link Here
344
358
345
	input_regs(dev, regs);
359
	input_regs(dev, regs);
346
360
347
	if (data[1] & 0x10) { /* in prox */
361
	if ( data[1] & 0x10 ) /* in prox */
348
362
	{
349
		switch ((data[1] >> 5) & 3) {
363
		switch ((data[1] >> 5) & 3) {
350
364
351
			case 0:	/* Pen */
365
			case 0:	/* Pen */
Lines 361-367 Link Here
361
				input_report_rel(dev, REL_WHEEL, (signed char) data[6]);
375
				input_report_rel(dev, REL_WHEEL, (signed char) data[6]);
362
				/* fall through */
376
				/* fall through */
363
377
364
			case 3: /* Mouse without wheel */
378
                	case 3: /* Mouse without wheel */
365
				wacom->tool[0] = BTN_TOOL_MOUSE;
379
				wacom->tool[0] = BTN_TOOL_MOUSE;
366
				input_report_key(dev, BTN_LEFT, data[1] & 0x01);
380
				input_report_key(dev, BTN_LEFT, data[1] & 0x01);
367
				input_report_key(dev, BTN_RIGHT, data[1] & 0x02);
381
				input_report_key(dev, BTN_RIGHT, data[1] & 0x02);
Lines 375-380 Link Here
375
		y = le16_to_cpu(*(__le16 *) &data[4]);
389
		y = le16_to_cpu(*(__le16 *) &data[4]);
376
		input_report_abs(dev, ABS_X, x);
390
		input_report_abs(dev, ABS_X, x);
377
		input_report_abs(dev, ABS_Y, y);
391
		input_report_abs(dev, ABS_Y, y);
392
378
		if (wacom->tool[0] != BTN_TOOL_MOUSE) {
393
		if (wacom->tool[0] != BTN_TOOL_MOUSE) {
379
			input_report_abs(dev, ABS_PRESSURE, le16_to_cpu(*(__le16 *) &data[6]));
394
			input_report_abs(dev, ABS_PRESSURE, le16_to_cpu(*(__le16 *) &data[6]));
380
			input_report_key(dev, BTN_TOUCH, data[1] & 0x01);
395
			input_report_key(dev, BTN_TOUCH, data[1] & 0x01);
Lines 382-392 Link Here
382
			input_report_key(dev, BTN_STYLUS2, data[1] & 0x04);
397
			input_report_key(dev, BTN_STYLUS2, data[1] & 0x04);
383
		}
398
		}
384
	}
399
	}
385
386
	input_report_key(dev, wacom->tool[0], data[1] & 0x10);
400
	input_report_key(dev, wacom->tool[0], data[1] & 0x10);
387
	input_sync(dev);
401
	input_sync(dev);
388
402
389
 exit:
403
exit:
390
	retval = usb_submit_urb (urb, GFP_ATOMIC);
404
	retval = usb_submit_urb (urb, GFP_ATOMIC);
391
	if (retval)
405
	if (retval)
392
		err ("%s - usb_submit_urb failed with result %d",
406
		err ("%s - usb_submit_urb failed with result %d",
Lines 398-432 Link Here
398
	struct wacom *wacom = urb->context;
412
	struct wacom *wacom = urb->context;
399
	unsigned char *data = wacom->data;
413
	unsigned char *data = wacom->data;
400
	struct input_dev *dev = &wacom->dev;
414
	struct input_dev *dev = &wacom->dev;
401
	int idx;
415
	int idx, type;
402
416
403
	/* tool number */
417
	/* tool number */
404
	idx = data[1] & 0x01;
418
	idx = data[1] & 0x01;
405
419
406
	/* Enter report */
420
	/* Enter report */
407
	if ((data[1] & 0xfc) == 0xc0) {
421
	if ((data[1] & 0xfc) == 0xc0) 
422
	{	
408
		/* serial number of the tool */
423
		/* serial number of the tool */
409
		wacom->serial[idx] = ((data[3] & 0x0f) << 28) +
424
		wacom->serial[idx] = ((data[3] & 0x0f) << 28) +	
410
			(data[4] << 20) + (data[5] << 12) +
425
			(data[4] << 20) + (data[5] << 12) +
411
			(data[6] << 4) + (data[7] >> 4);
426
			(data[6] << 4) + (data[7] >> 4);
412
427
413
		switch ((data[2] << 4) | (data[3] >> 4)) {
428
		type = (data[2] << 4) | (data[3] >> 4);
429
		switch (type) {
414
			case 0x812: /* Inking pen */
430
			case 0x812: /* Inking pen */
415
			case 0x801: /* Intuos3 Inking pen */
431
			case 0x801: /* Intuos3 Inking pen */
416
			case 0x012:
432
			case 0x012: 
417
				wacom->tool[idx] = BTN_TOOL_PENCIL;
433
				wacom->tool[idx] = BTN_TOOL_PENCIL;
418
				break;
434
				break;	
419
			case 0x822: /* Pen */
435
			case 0x822: /* Pen */
420
			case 0x842:
436
			case 0x842:
421
			case 0x852:
437
			case 0x852:
422
			case 0x823: /* Intuos3 Grip Pen */
438
			case 0x823: /* Intuos3 Grip Pen */
423
			case 0x813: /* Intuos3 Classic Pen */
439
			case 0x813: /* Intuos3 Classic Pen */
424
			case 0x885: /* Intuos3 Marker Pen */
440
			case 0x885: /* Intuos3 Marker Pen */
425
			case 0x022:
441
			case 0x022: 
426
				wacom->tool[idx] = BTN_TOOL_PEN;
442
				wacom->tool[idx] = BTN_TOOL_PEN;
427
				break;
443
				break;
428
			case 0x832: /* Stroke pen */
444
			case 0x832: /* Stroke pen */
429
			case 0x032:
445
			case 0x032: 
430
				wacom->tool[idx] = BTN_TOOL_BRUSH;
446
				wacom->tool[idx] = BTN_TOOL_BRUSH;
431
				break;
447
				break;
432
			case 0x007: /* Mouse 4D and 2D */
448
			case 0x007: /* Mouse 4D and 2D */
Lines 443-464 Link Here
443
			case 0x85a:
459
			case 0x85a:
444
		        case 0x91a:
460
		        case 0x91a:
445
			case 0xd1a:
461
			case 0xd1a:
446
			case 0x0fa:
462
			case 0x0fa: 
447
			case 0x82b: /* Intuos3 Grip Pen Eraser */
463
			case 0x82b: /* Intuos3 Grip Pen Eraser */
448
			case 0x81b: /* Intuos3 Classic Pen Eraser */
464
			case 0x81b: /* Intuos3 Classic Pen Eraser */
449
			case 0x91b: /* Intuos3 Airbrush Eraser */
465
			case 0x91b: /* Intuos3 Airbrush Eraser */
450
				wacom->tool[idx] = BTN_TOOL_RUBBER;
466
				wacom->tool[idx] = BTN_TOOL_RUBBER;
451
				break;
467
				break;
452
			case 0xd12:
468
			case 0xd12: /* Airbrush */
453
			case 0x912:
469
			case 0x912:
454
			case 0x112:
470
			case 0x112: 
455
			case 0x913: /* Intuos3 Airbrush */
471
			case 0x913: /* Intuos3 Airbrush */
456
				wacom->tool[idx] = BTN_TOOL_AIRBRUSH;
472
				wacom->tool[idx] = BTN_TOOL_AIRBRUSH;
457
				break;
473
				break;
458
			default: /* Unknown tool */
474
			default: /* Unknown tool */
459
				wacom->tool[idx] = BTN_TOOL_PEN;
475
				wacom->tool[idx] = BTN_TOOL_PEN;
460
		}
476
		}
461
		input_report_key(dev, wacom->tool[idx], 1);
477
		input_report_key(dev, wacom->tool[idx], type);
462
		input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
478
		input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
463
		input_sync(dev);
479
		input_sync(dev);
464
		return 1;
480
		return 1;
Lines 483-489 Link Here
483
	unsigned int t;
499
	unsigned int t;
484
500
485
	/* general pen packet */
501
	/* general pen packet */
486
	if ((data[1] & 0xb8) == 0xa0) {
502
	if ((data[1] & 0xb8) == 0xa0)
503
	{
487
		t = (data[6] << 2) | ((data[7] >> 6) & 3);
504
		t = (data[6] << 2) | ((data[7] >> 6) & 3);
488
		input_report_abs(dev, ABS_PRESSURE, t);
505
		input_report_abs(dev, ABS_PRESSURE, t);
489
		input_report_abs(dev, ABS_TILT_X,
506
		input_report_abs(dev, ABS_TILT_X,
Lines 495-501 Link Here
495
	}
512
	}
496
513
497
	/* airbrush second packet */
514
	/* airbrush second packet */
498
	if ((data[1] & 0xbc) == 0xb4) {
515
	if ((data[1] & 0xbc) == 0xb4)
516
	{
499
		input_report_abs(dev, ABS_WHEEL,
517
		input_report_abs(dev, ABS_WHEEL,
500
				(data[6] << 2) | ((data[7] >> 6) & 3));
518
				(data[6] << 2) | ((data[7] >> 6) & 3));
501
		input_report_abs(dev, ABS_TILT_X,
519
		input_report_abs(dev, ABS_TILT_X,
Lines 540-548 Link Here
540
	idx = data[1] & 0x01;
558
	idx = data[1] & 0x01;
541
559
542
	/* pad packets. Works as a second tool and is always in prox */
560
	/* pad packets. Works as a second tool and is always in prox */
543
	if (data[0] == 12) {
561
	if (data[0] == 12)
562
	{
544
		/* initiate the pad as a device */
563
		/* initiate the pad as a device */
545
		if (wacom->tool[1] != BTN_TOOL_FINGER) {
564
		if (wacom->tool[1] != BTN_TOOL_FINGER)
565
		{
546
			wacom->tool[1] = BTN_TOOL_FINGER;
566
			wacom->tool[1] = BTN_TOOL_FINGER;
547
			input_report_key(dev, wacom->tool[1], 1);
567
			input_report_key(dev, wacom->tool[1], 1);
548
		}
568
		}
Lines 562-579 Link Here
562
	}
582
	}
563
583
564
	/* process in/out prox events */
584
	/* process in/out prox events */
565
	if (wacom_intuos_inout(urb))
585
	if (wacom_intuos_inout(urb)) goto exit;
566
		goto exit;
567
586
568
	/* Cintiq doesn't send data when RDY bit isn't set */
587
	/* Cintiq doesn't send data when RDY bit isn't set */
569
	if ((wacom->features->type == CINTIQ) && !(data[1] & 0x40))
588
	if ((wacom->features->type == CINTIQ) && !(data[1] & 0x40)) goto exit;
570
		goto exit;
571
589
572
	if (wacom->features->type >= INTUOS3) {
590
	if(wacom->features->type >= INTUOS3)
591
	{
573
		input_report_abs(dev, ABS_X, (data[2] << 9) | (data[3] << 1) | ((data[9] >> 1) & 1));
592
		input_report_abs(dev, ABS_X, (data[2] << 9) | (data[3] << 1) | ((data[9] >> 1) & 1));
574
		input_report_abs(dev, ABS_Y, (data[4] << 9) | (data[5] << 1) | (data[9] & 1));
593
		input_report_abs(dev, ABS_Y, (data[4] << 9) | (data[5] << 1) | (data[9] & 1));
575
		input_report_abs(dev, ABS_DISTANCE, ((data[9] >> 2) & 0x3f));
594
		input_report_abs(dev, ABS_DISTANCE, ((data[9] >> 2) & 0x3f));
576
	} else {
595
	}
596
	else
597
	{
577
		input_report_abs(dev, ABS_X, be16_to_cpu(*(__be16 *) &data[2]));
598
		input_report_abs(dev, ABS_X, be16_to_cpu(*(__be16 *) &data[2]));
578
		input_report_abs(dev, ABS_Y, be16_to_cpu(*(__be16 *) &data[4]));
599
		input_report_abs(dev, ABS_Y, be16_to_cpu(*(__be16 *) &data[4]));
579
		input_report_abs(dev, ABS_DISTANCE, ((data[9] >> 3) & 0x1f));
600
		input_report_abs(dev, ABS_DISTANCE, ((data[9] >> 3) & 0x1f));
Lines 584-609 Link Here
584
605
585
	/* 4D mouse, 2D mouse, marker pen rotation, or Lens cursor packets */
606
	/* 4D mouse, 2D mouse, marker pen rotation, or Lens cursor packets */
586
	if ((data[1] & 0xbc) == 0xa8 || (data[1] & 0xbe) == 0xb0) {
607
	if ((data[1] & 0xbc) == 0xa8 || (data[1] & 0xbe) == 0xb0) {
587
608
		/* Rotation packet */
588
		if (data[1] & 0x02) {
609
		if (data[1] & 0x02) 
589
			/* Rotation packet */
610
		{
590
			if (wacom->features->type >= INTUOS3) {
611
			if(wacom->features->type >= INTUOS3)
591
				/* I3 marker pen rotation reported as wheel
612
			{
592
				 * due to valuator limitation
613
				/* I3 marker pen rotation reported as wheel 
614
				 * due to valuator limitation 
593
				 */
615
				 */
594
				t = (data[6] << 3) | ((data[7] >> 5) & 7);
616
				t = (data[6] << 3) | ((data[7] >> 5) & 7);
595
				t = (data[7] & 0x20) ? ((t > 900) ? ((t-1) / 2 - 1350) :
617
				t = (data[7] & 0x20) ? ((t > 900) ? ((t-1) / 2 - 1350) :
596
					((t-1) / 2 + 450)) : (450 - t / 2) ;
618
					((t-1) / 2 + 450)) : (450 - t / 2) ;
597
				input_report_abs(dev, ABS_WHEEL, t);
619
				input_report_abs(dev, ABS_WHEEL, t);
598
			} else {
620
			}
621
			else
622
			{
599
				/* 4D mouse rotation packet */
623
				/* 4D mouse rotation packet */
600
				t = (data[6] << 3) | ((data[7] >> 5) & 7);
624
				t = (data[6] << 3) | ((data[7] >> 5) & 7);
601
				input_report_abs(dev, ABS_RZ, (data[7] & 0x20) ?
625
				input_report_abs(dev, ABS_RZ, (data[7] & 0x20) ?
602
					((t - 1) / 2) : -t / 2);
626
					((t - 1) / 2) : -t / 2);
603
			}
627
			}
604
628
		} 
605
		} else if (!(data[1] & 0x10) && wacom->features->type < INTUOS3) {
629
		/* 4D mouse packets */
606
			/* 4D mouse packet */
630
		else if ( !(data[1] & 0x10) && wacom->features->type < INTUOS3)
631
		{
607
			input_report_key(dev, BTN_LEFT,   data[8] & 0x01);
632
			input_report_key(dev, BTN_LEFT,   data[8] & 0x01);
608
			input_report_key(dev, BTN_MIDDLE, data[8] & 0x02);
633
			input_report_key(dev, BTN_MIDDLE, data[8] & 0x02);
609
			input_report_key(dev, BTN_RIGHT,  data[8] & 0x04);
634
			input_report_key(dev, BTN_RIGHT,  data[8] & 0x04);
Lines 612-634 Link Here
612
			input_report_key(dev, BTN_EXTRA,  data[8] & 0x10);
637
			input_report_key(dev, BTN_EXTRA,  data[8] & 0x10);
613
			t = (data[6] << 2) | ((data[7] >> 6) & 3);
638
			t = (data[6] << 2) | ((data[7] >> 6) & 3);
614
			input_report_abs(dev, ABS_THROTTLE, (data[8] & 0x08) ? -t : t);
639
			input_report_abs(dev, ABS_THROTTLE, (data[8] & 0x08) ? -t : t);
615
640
		} 
616
		} else if (wacom->tool[idx] == BTN_TOOL_MOUSE) {
641
		/* 2D mouse packets */	
617
			/* 2D mouse packet */
642
		else if (wacom->tool[idx] == BTN_TOOL_MOUSE) 
643
		{
618
			input_report_key(dev, BTN_LEFT,   data[8] & 0x04);
644
			input_report_key(dev, BTN_LEFT,   data[8] & 0x04);
619
			input_report_key(dev, BTN_MIDDLE, data[8] & 0x08);
645
			input_report_key(dev, BTN_MIDDLE, data[8] & 0x08);
620
			input_report_key(dev, BTN_RIGHT,  data[8] & 0x10);
646
			input_report_key(dev, BTN_RIGHT,  data[8] & 0x10);
621
			input_report_rel(dev, REL_WHEEL, ((data[8] & 0x02) >> 1)
647
			input_report_rel(dev, REL_WHEEL, ((data[8] & 0x02) >> 1)
622
						 - (data[8] & 0x01));
648
					    	 - (data[8] & 0x01));
623
649
624
			/* I3 2D mouse side buttons */
650
			/* I3 2D mouse side buttons */	
625
			if (wacom->features->type == INTUOS3) {
651
			if (wacom->features->type == INTUOS3)
652
			{
626
				input_report_key(dev, BTN_SIDE,   data[8] & 0x40);
653
				input_report_key(dev, BTN_SIDE,   data[8] & 0x40);
627
				input_report_key(dev, BTN_EXTRA,  data[8] & 0x20);
654
				input_report_key(dev, BTN_EXTRA,  data[8] & 0x20);
628
			}
655
			}
629
656
		}
630
		} else if (wacom->features->type < INTUOS3) {
657
		/* Lens cursor packets */
631
			/* Lens cursor packets */
658
		else if (wacom->features->type < INTUOS3)
659
		{
632
			input_report_key(dev, BTN_LEFT,   data[8] & 0x01);
660
			input_report_key(dev, BTN_LEFT,   data[8] & 0x01);
633
			input_report_key(dev, BTN_MIDDLE, data[8] & 0x02);
661
			input_report_key(dev, BTN_MIDDLE, data[8] & 0x02);
634
			input_report_key(dev, BTN_RIGHT,  data[8] & 0x04);
662
			input_report_key(dev, BTN_RIGHT,  data[8] & 0x04);
Lines 636-642 Link Here
636
			input_report_key(dev, BTN_EXTRA,  data[8] & 0x08);
664
			input_report_key(dev, BTN_EXTRA,  data[8] & 0x08);
637
		}
665
		}
638
	}
666
	}
639
667
	
640
	input_report_key(dev, wacom->tool[idx], 1);
668
	input_report_key(dev, wacom->tool[idx], 1);
641
	input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
669
	input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
642
	input_sync(dev);
670
	input_sync(dev);
Lines 645-684 Link Here
645
	retval = usb_submit_urb (urb, GFP_ATOMIC);
673
	retval = usb_submit_urb (urb, GFP_ATOMIC);
646
	if (retval)
674
	if (retval)
647
		err ("%s - usb_submit_urb failed with result %d",
675
		err ("%s - usb_submit_urb failed with result %d",
648
		    __FUNCTION__, retval);
676
		     __FUNCTION__, retval);
649
}
677
}
650
678
651
static struct wacom_features wacom_features[] = {
679
static struct wacom_features wacom_features[] = {
652
	{ "Wacom Penpartner",    7,   5040,  3780,  255, 32, PENPARTNER, wacom_penpartner_irq },
680
	{ "Wacom Penpartner",    7,   5040,  3780,  255, 32, PENPARTNER, wacom_penpartner_irq },
653
        { "Wacom Graphire",      8,  10206,  7422,  511, 32, GRAPHIRE,   wacom_graphire_irq },
681
        { "Wacom Graphire",      8,  10206,  7422,  511, 32, GRAPHIRE,   wacom_graphire_irq },
654
	{ "Wacom Graphire2 4x5", 8,  10206,  7422,  511, 32, GRAPHIRE,   wacom_graphire_irq },
682
	{ "Wacom Graphire2 4x5", 8,  10206,  7422,  511, 32, GRAPHIRE,   wacom_graphire_irq },
655
	{ "Wacom Graphire2 5x7", 8,  13918, 10206,  511, 32, GRAPHIRE,   wacom_graphire_irq },
683
 	{ "Wacom Graphire2 5x7", 8,  13918, 10206,  511, 32, GRAPHIRE,   wacom_graphire_irq },
656
	{ "Wacom Graphire3",     8,  10208,  7424,  511, 32, GRAPHIRE,   wacom_graphire_irq },
684
	{ "Wacom Graphire3",     8,  10208,  7424,  511, 32, GRAPHIRE,   wacom_graphire_irq },
657
	{ "Wacom Graphire3 6x8", 8,  16704, 12064,  511, 32, GRAPHIRE,   wacom_graphire_irq },
685
	{ "Wacom Graphire3 6x8", 8,  16704, 12064,  511, 32, GRAPHIRE,   wacom_graphire_irq },
658
	{ "Wacom Intuos 4x5",   10,  12700, 10600, 1023, 15, INTUOS,     wacom_intuos_irq },
686
  	{ "Wacom Intuos 4x5",   10,  12700, 10600, 1023, 15, INTUOS,     wacom_intuos_irq },
659
	{ "Wacom Intuos 6x8",   10,  20320, 16240, 1023, 15, INTUOS,     wacom_intuos_irq },
687
 	{ "Wacom Intuos 6x8",   10,  20320, 16240, 1023, 15, INTUOS,     wacom_intuos_irq },
660
	{ "Wacom Intuos 9x12",  10,  30480, 24060, 1023, 15, INTUOS,     wacom_intuos_irq },
688
 	{ "Wacom Intuos 9x12",  10,  30480, 24060, 1023, 15, INTUOS,     wacom_intuos_irq },
661
	{ "Wacom Intuos 12x12", 10,  30480, 31680, 1023, 15, INTUOS,     wacom_intuos_irq },
689
 	{ "Wacom Intuos 12x12", 10,  30480, 31680, 1023, 15, INTUOS,     wacom_intuos_irq },
662
	{ "Wacom Intuos 12x18", 10,  45720, 31680, 1023, 15, INTUOS,     wacom_intuos_irq },
690
 	{ "Wacom Intuos 12x18", 10,  45720, 31680, 1023, 15, INTUOS,     wacom_intuos_irq },
663
	{ "Wacom PL400",         8,   5408,  4056,  255, 32, PL,         wacom_pl_irq },
691
 	{ "Wacom PL400",         8,   5408,  4056,  255, 32, PL,         wacom_pl_irq },
664
	{ "Wacom PL500",         8,   6144,  4608,  255, 32, PL,         wacom_pl_irq },
692
 	{ "Wacom PL500",         8,   6144,  4608,  255, 32, PL,         wacom_pl_irq },
665
	{ "Wacom PL600",         8,   6126,  4604,  255, 32, PL,         wacom_pl_irq },
693
 	{ "Wacom PL600",         8,   6126,  4604,  255, 32, PL,         wacom_pl_irq },
666
	{ "Wacom PL600SX",       8,   6260,  5016,  255, 32, PL,         wacom_pl_irq },
694
 	{ "Wacom PL600SX",       8,   6260,  5016,  255, 32, PL,         wacom_pl_irq },
667
	{ "Wacom PL550",         8,   6144,  4608,  511, 32, PL,         wacom_pl_irq },
695
 	{ "Wacom PL550",         8,   6144,  4608,  511, 32, PL,         wacom_pl_irq },
668
	{ "Wacom PL800",         8,   7220,  5780,  511, 32, PL,         wacom_pl_irq },
696
 	{ "Wacom PL800",         8,   7220,  5780,  511, 32, PL,         wacom_pl_irq },
697
	{ "Wacom PL700",         8,   6758,  5406,  511, 32, PL,	 wacom_pl_irq },
698
	{ "Wacom PL510",         8,   6282,  4762,  511, 32, PL,	 wacom_pl_irq },
669
	{ "Wacom Intuos2 4x5",   10, 12700, 10600, 1023, 15, INTUOS,     wacom_intuos_irq },
699
	{ "Wacom Intuos2 4x5",   10, 12700, 10600, 1023, 15, INTUOS,     wacom_intuos_irq },
670
	{ "Wacom Intuos2 6x8",   10, 20320, 16240, 1023, 15, INTUOS,     wacom_intuos_irq },
700
	{ "Wacom Intuos2 6x8",   10, 20320, 16240, 1023, 15, INTUOS,     wacom_intuos_irq },
671
	{ "Wacom Intuos2 9x12",  10, 30480, 24060, 1023, 15, INTUOS,     wacom_intuos_irq },
701
	{ "Wacom Intuos2 9x12",  10, 30480, 24060, 1023, 15, INTUOS,     wacom_intuos_irq },
672
	{ "Wacom Intuos2 12x12", 10, 30480, 31680, 1023, 15, INTUOS,     wacom_intuos_irq },
702
	{ "Wacom Intuos2 12x12", 10, 30480, 31680, 1023, 15, INTUOS,     wacom_intuos_irq },
673
	{ "Wacom Intuos2 12x18", 10, 45720, 31680, 1023, 15, INTUOS,     wacom_intuos_irq },
703
	{ "Wacom Intuos2 12x18", 10, 45720, 31680, 1023, 15, INTUOS,     wacom_intuos_irq },
674
	{ "Wacom Volito",        8,   5104,  3712,  511, 32, GRAPHIRE,   wacom_graphire_irq },
704
	{ "Wacom Volito",        8,   5104,  3712,  511, 32, GRAPHIRE,   wacom_graphire_irq },
705
	{ "Wacom PenPartner2",   8,   3250,  2320,  255, 32, GRAPHIRE,   wacom_graphire_irq },
706
	{ "Wacom Volito2 4x5",   8,   5104,  3712,  511, 32, GRAPHIRE,   wacom_graphire_irq },
707
	{ "Wacom Volito2 2x3",   8,   3248,  2320,  511, 32, GRAPHIRE,   wacom_graphire_irq },
675
	{ "Wacom Cintiq Partner",8,  20480, 15360,  511, 32, PL,         wacom_ptu_irq },
708
	{ "Wacom Cintiq Partner",8,  20480, 15360,  511, 32, PL,         wacom_ptu_irq },
676
	{ "Wacom Intuos3 4x5",   10, 25400, 20320, 1023, 15, INTUOS3,    wacom_intuos_irq },
709
	{ "Wacom Intuos3 4x5",   10, 25400, 20320, 1023, 15, INTUOS3,    wacom_intuos_irq },
677
	{ "Wacom Intuos3 6x8",   10, 40640, 30480, 1023, 15, INTUOS3,    wacom_intuos_irq },
710
	{ "Wacom Intuos3 6x8",   10, 40640, 30480, 1023, 15, INTUOS3,    wacom_intuos_irq },
678
	{ "Wacom Intuos3 9x12",  10, 60960, 45720, 1023, 15, INTUOS3,    wacom_intuos_irq },
711
	{ "Wacom Intuos3 9x12",  10, 60960, 45720, 1023, 15, INTUOS3,    wacom_intuos_irq },
679
	{ "Wacom Cintiq 21UX",   10, 87200, 65600, 1023, 15, CINTIQ,     wacom_intuos_irq },
712
	{ "Wacom Cintiq 21UX",   10, 87200, 65600, 1023, 15, CINTIQ,     wacom_intuos_irq },
680
	{ "Wacom Intuos2 6x8",   10, 20320, 16240, 1023, 15, INTUOS,     wacom_intuos_irq },
713
	{ "Wacom Intuos2 6x8",   10, 20320, 16240, 1023, 15, INTUOS,     wacom_intuos_irq },
681
	{ }
714
 	{ }
682
};
715
};
683
716
684
static struct usb_device_id wacom_ids[] = {
717
static struct usb_device_id wacom_ids[] = {
Lines 699-710 Link Here
699
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x33) },
732
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x33) },
700
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x34) },
733
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x34) },
701
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x35) },
734
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x35) },
735
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x37) },
736
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x38) },
702
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x41) },
737
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x41) },
703
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x42) },
738
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x42) },
704
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x43) },
739
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x43) },
705
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x44) },
740
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x44) },
706
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x45) },
741
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x45) },
707
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) },
742
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) },
743
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x61) },
744
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x62) },
745
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x63) },
708
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x03) },
746
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x03) },
709
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB0) },
747
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB0) },
710
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB1) },
748
	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB1) },
Lines 720-728 Link Here
720
{
758
{
721
	struct wacom *wacom = dev->private;
759
	struct wacom *wacom = dev->private;
722
760
761
	if (wacom->open++)
762
		return 0;
763
723
	wacom->irq->dev = wacom->usbdev;
764
	wacom->irq->dev = wacom->usbdev;
724
	if (usb_submit_urb(wacom->irq, GFP_KERNEL))
765
	if (usb_submit_urb(wacom->irq, GFP_KERNEL)) {
766
		wacom->open--;
725
		return -EIO;
767
		return -EIO;
768
	}
726
769
727
	return 0;
770
	return 0;
728
}
771
}
Lines 731-737 Link Here
731
{
774
{
732
	struct wacom *wacom = dev->private;
775
	struct wacom *wacom = dev->private;
733
776
734
	usb_kill_urb(wacom->irq);
777
	if (!--wacom->open)
778
		usb_kill_urb(wacom->irq);
735
}
779
}
736
780
737
static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id)
781
static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id)
Lines 771-777 Link Here
771
			wacom->dev.relbit[0] |= BIT(REL_WHEEL);
815
			wacom->dev.relbit[0] |= BIT(REL_WHEEL);
772
			wacom->dev.absbit[0] |= BIT(ABS_DISTANCE);
816
			wacom->dev.absbit[0] |= BIT(ABS_DISTANCE);
773
			wacom->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
817
			wacom->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
774
			wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_STYLUS2);
818
 			wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_STYLUS2);
775
			break;
819
			break;
776
820
777
		case INTUOS3:
821
		case INTUOS3:
Lines 786-798 Link Here
786
			wacom->dev.mscbit[0] |= BIT(MSC_SERIAL);
830
			wacom->dev.mscbit[0] |= BIT(MSC_SERIAL);
787
			wacom->dev.relbit[0] |= BIT(REL_WHEEL);
831
			wacom->dev.relbit[0] |= BIT(REL_WHEEL);
788
			wacom->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE) | BIT(BTN_SIDE) | BIT(BTN_EXTRA);
832
			wacom->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE) | BIT(BTN_SIDE) | BIT(BTN_EXTRA);
789
			wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE)	| BIT(BTN_TOOL_BRUSH)
833
 			wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_TOOL_BRUSH)
790
							  | BIT(BTN_TOOL_PENCIL) | BIT(BTN_TOOL_AIRBRUSH) | BIT(BTN_TOOL_LENS) | BIT(BTN_STYLUS2);
834
							  | BIT(BTN_TOOL_PENCIL) | BIT(BTN_TOOL_AIRBRUSH) | BIT(BTN_TOOL_LENS) | BIT(BTN_STYLUS2);
791
			wacom->dev.absbit[0] |= BIT(ABS_DISTANCE) | BIT(ABS_WHEEL) | BIT(ABS_TILT_X) | BIT(ABS_TILT_Y) | BIT(ABS_RZ) | BIT(ABS_THROTTLE);
835
			wacom->dev.absbit[0] |= BIT(ABS_DISTANCE) | BIT(ABS_WHEEL) | BIT(ABS_TILT_X) | BIT(ABS_TILT_Y) | BIT(ABS_RZ) | BIT(ABS_THROTTLE);
792
			break;
836
			break;
793
837
794
		case PL:
838
		case PL:
795
			wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_STYLUS2) | BIT(BTN_TOOL_RUBBER);
839
 			wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_STYLUS2) | BIT(BTN_TOOL_RUBBER);
796
			break;
840
			break;
797
	}
841
	}
798
842
Lines 823-829 Link Here
823
867
824
	wacom->dev.name = wacom->features->name;
868
	wacom->dev.name = wacom->features->name;
825
	wacom->dev.phys = wacom->phys;
869
	wacom->dev.phys = wacom->phys;
826
	usb_to_input_id(dev, &wacom->dev.id);
870
	wacom->dev.id.bustype = BUS_USB;
871
	wacom->dev.id.vendor = le16_to_cpu(dev->descriptor.idVendor);
872
	wacom->dev.id.product = le16_to_cpu(dev->descriptor.idProduct);
873
	wacom->dev.id.version = le16_to_cpu(dev->descriptor.bcdDevice);
827
	wacom->dev.dev = &intf->dev;
874
	wacom->dev.dev = &intf->dev;
828
	wacom->usbdev = dev;
875
	wacom->usbdev = dev;
829
876

Return to bug 95478