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 |
|