2006-07-14 05:01:36 +04:00
/*
2007-05-08 00:16:29 +04:00
* drivers / input / tablet / wacom_wac . c
2006-07-14 05:01:36 +04:00
*
2009-12-15 11:35:24 +03:00
* USB Wacom tablet support - Wacom specific code
2006-07-14 05:01:36 +04:00
*
*/
/*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*/
2010-03-20 08:18:15 +03:00
2006-07-14 05:01:36 +04:00
# include "wacom_wac.h"
2010-03-20 08:18:15 +03:00
# include "wacom.h"
2006-07-14 05:01:36 +04:00
2010-03-20 08:18:15 +03:00
static int wacom_penpartner_irq ( struct wacom_wac * wacom )
2006-07-14 05:01:36 +04:00
{
unsigned char * data = wacom - > data ;
2010-03-20 08:18:15 +03:00
struct input_dev * input = wacom - > input ;
2006-07-14 05:01:36 +04:00
switch ( data [ 0 ] ) {
2010-03-20 08:18:15 +03:00
case 1 :
if ( data [ 5 ] & 0x80 ) {
wacom - > tool [ 0 ] = ( data [ 5 ] & 0x20 ) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN ;
wacom - > id [ 0 ] = ( data [ 5 ] & 0x20 ) ? ERASER_DEVICE_ID : STYLUS_DEVICE_ID ;
2010-03-20 08:18:15 +03:00
input_report_key ( input , wacom - > tool [ 0 ] , 1 ) ;
input_report_abs ( input , ABS_MISC , wacom - > id [ 0 ] ) ; /* report tool id */
2010-03-20 08:33:38 +03:00
input_report_abs ( input , ABS_X , get_unaligned_le16 ( & data [ 1 ] ) ) ;
input_report_abs ( input , ABS_Y , get_unaligned_le16 ( & data [ 3 ] ) ) ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_PRESSURE , ( signed char ) data [ 6 ] + 127 ) ;
input_report_key ( input , BTN_TOUCH , ( ( signed char ) data [ 6 ] > - 127 ) ) ;
input_report_key ( input , BTN_STYLUS , ( data [ 5 ] & 0x40 ) ) ;
2010-03-20 08:18:15 +03:00
} else {
2010-03-20 08:18:15 +03:00
input_report_key ( input , wacom - > tool [ 0 ] , 0 ) ;
input_report_abs ( input , ABS_MISC , 0 ) ; /* report tool id */
input_report_abs ( input , ABS_PRESSURE , - 1 ) ;
input_report_key ( input , BTN_TOUCH , 0 ) ;
2010-03-20 08:18:15 +03:00
}
break ;
2010-03-20 08:18:15 +03:00
2010-03-20 08:18:15 +03:00
case 2 :
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_TOOL_PEN , 1 ) ;
input_report_abs ( input , ABS_MISC , STYLUS_DEVICE_ID ) ; /* report tool id */
2010-03-20 08:33:38 +03:00
input_report_abs ( input , ABS_X , get_unaligned_le16 ( & data [ 1 ] ) ) ;
input_report_abs ( input , ABS_Y , get_unaligned_le16 ( & data [ 3 ] ) ) ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_PRESSURE , ( signed char ) data [ 6 ] + 127 ) ;
input_report_key ( input , BTN_TOUCH , ( ( signed char ) data [ 6 ] > - 80 ) & & ! ( data [ 5 ] & 0x20 ) ) ;
input_report_key ( input , BTN_STYLUS , ( data [ 5 ] & 0x40 ) ) ;
2010-03-20 08:18:15 +03:00
break ;
2010-03-20 08:18:15 +03:00
2010-03-20 08:18:15 +03:00
default :
printk ( KERN_INFO " wacom_penpartner_irq: received unknown report #%d \n " , data [ 0 ] ) ;
return 0 ;
2006-07-14 05:01:36 +04:00
}
2010-03-20 08:18:15 +03:00
2006-07-14 05:01:36 +04:00
return 1 ;
}
2010-03-20 08:18:15 +03:00
static int wacom_pl_irq ( struct wacom_wac * wacom )
2006-07-14 05:01:36 +04:00
{
2010-02-18 09:38:31 +03:00
struct wacom_features * features = & wacom - > features ;
2006-07-14 05:01:36 +04:00
unsigned char * data = wacom - > data ;
2010-03-20 08:18:15 +03:00
struct input_dev * input = wacom - > input ;
2008-05-05 19:36:41 +04:00
int prox , pressure ;
2006-07-14 05:01:36 +04:00
2009-12-15 11:35:25 +03:00
if ( data [ 0 ] ! = WACOM_REPORT_PENABLED ) {
2006-07-14 05:01:36 +04:00
dbg ( " wacom_pl_irq: received unknown report #%d " , data [ 0 ] ) ;
return 0 ;
}
prox = data [ 1 ] & 0x40 ;
if ( prox ) {
2009-12-15 11:35:24 +03:00
wacom - > id [ 0 ] = ERASER_DEVICE_ID ;
2006-07-14 05:01:36 +04:00
pressure = ( signed char ) ( ( data [ 7 ] < < 1 ) | ( ( data [ 4 ] > > 2 ) & 1 ) ) ;
2010-02-18 09:38:31 +03:00
if ( features - > pressure_max > 255 )
2006-07-14 05:01:36 +04:00
pressure = ( pressure < < 1 ) | ( ( data [ 4 ] > > 6 ) & 1 ) ;
2010-02-18 09:38:31 +03:00
pressure + = ( features - > pressure_max + 1 ) / 2 ;
2006-07-14 05:01:36 +04:00
/*
* if going from out of proximity into proximity select between the eraser
* and the pen based on the state of the stylus2 button , choose eraser if
* pressed else choose pen . if not a proximity change from out to in , send
* an out of proximity for previous tool then a in for new tool .
*/
if ( ! wacom - > tool [ 0 ] ) {
/* Eraser bit set for DTF */
if ( data [ 1 ] & 0x10 )
wacom - > tool [ 1 ] = BTN_TOOL_RUBBER ;
else
/* Going into proximity select tool */
wacom - > tool [ 1 ] = ( data [ 4 ] & 0x20 ) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN ;
} else {
/* was entered with stylus2 pressed */
if ( wacom - > tool [ 1 ] = = BTN_TOOL_RUBBER & & ! ( data [ 4 ] & 0x20 ) ) {
/* report out proximity for previous tool */
2010-03-20 08:18:15 +03:00
input_report_key ( input , wacom - > tool [ 1 ] , 0 ) ;
input_sync ( input ) ;
2006-07-14 05:01:36 +04:00
wacom - > tool [ 1 ] = BTN_TOOL_PEN ;
return 0 ;
}
}
if ( wacom - > tool [ 1 ] ! = BTN_TOOL_RUBBER ) {
/* Unknown tool selected default to pen tool */
wacom - > tool [ 1 ] = BTN_TOOL_PEN ;
2008-05-05 19:36:41 +04:00
wacom - > id [ 0 ] = STYLUS_DEVICE_ID ;
2006-07-14 05:01:36 +04:00
}
2010-03-20 08:18:15 +03:00
input_report_key ( input , wacom - > tool [ 1 ] , prox ) ; /* report in proximity for tool */
input_report_abs ( input , ABS_MISC , wacom - > id [ 0 ] ) ; /* report tool id */
input_report_abs ( input , ABS_X , data [ 3 ] | ( data [ 2 ] < < 7 ) | ( ( data [ 1 ] & 0x03 ) < < 14 ) ) ;
input_report_abs ( input , ABS_Y , data [ 6 ] | ( data [ 5 ] < < 7 ) | ( ( data [ 4 ] & 0x03 ) < < 14 ) ) ;
input_report_abs ( input , ABS_PRESSURE , pressure ) ;
input_report_key ( input , BTN_TOUCH , data [ 4 ] & 0x08 ) ;
input_report_key ( input , BTN_STYLUS , data [ 4 ] & 0x10 ) ;
2006-07-14 05:01:36 +04:00
/* Only allow the stylus2 button to be reported for the pen tool. */
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_STYLUS2 , ( wacom - > tool [ 1 ] = = BTN_TOOL_PEN ) & & ( data [ 4 ] & 0x20 ) ) ;
2006-07-14 05:01:36 +04:00
} else {
/* report proximity-out of a (valid) tool */
if ( wacom - > tool [ 1 ] ! = BTN_TOOL_RUBBER ) {
/* Unknown tool selected default to pen tool */
wacom - > tool [ 1 ] = BTN_TOOL_PEN ;
}
2010-03-20 08:18:15 +03:00
input_report_key ( input , wacom - > tool [ 1 ] , prox ) ;
2006-07-14 05:01:36 +04:00
}
wacom - > tool [ 0 ] = prox ; /* Save proximity state */
return 1 ;
}
2010-03-20 08:18:15 +03:00
static int wacom_ptu_irq ( struct wacom_wac * wacom )
2006-07-14 05:01:36 +04:00
{
unsigned char * data = wacom - > data ;
2010-03-20 08:18:15 +03:00
struct input_dev * input = wacom - > input ;
2006-07-14 05:01:36 +04:00
2009-12-15 11:35:25 +03:00
if ( data [ 0 ] ! = WACOM_REPORT_PENABLED ) {
2006-07-14 05:01:36 +04:00
printk ( KERN_INFO " wacom_ptu_irq: received unknown report #%d \n " , data [ 0 ] ) ;
return 0 ;
}
if ( data [ 1 ] & 0x04 ) {
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_TOOL_RUBBER , data [ 1 ] & 0x20 ) ;
input_report_key ( input , BTN_TOUCH , data [ 1 ] & 0x08 ) ;
2008-05-05 19:36:41 +04:00
wacom - > id [ 0 ] = ERASER_DEVICE_ID ;
2006-07-14 05:01:36 +04:00
} else {
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_TOOL_PEN , data [ 1 ] & 0x20 ) ;
input_report_key ( input , BTN_TOUCH , data [ 1 ] & 0x01 ) ;
2008-05-05 19:36:41 +04:00
wacom - > id [ 0 ] = STYLUS_DEVICE_ID ;
2006-07-14 05:01:36 +04:00
}
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_MISC , wacom - > id [ 0 ] ) ; /* report tool id */
2010-03-20 08:33:38 +03:00
input_report_abs ( input , ABS_X , le16_to_cpup ( ( __le16 * ) & data [ 2 ] ) ) ;
input_report_abs ( input , ABS_Y , le16_to_cpup ( ( __le16 * ) & data [ 4 ] ) ) ;
input_report_abs ( input , ABS_PRESSURE , le16_to_cpup ( ( __le16 * ) & data [ 6 ] ) ) ;
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_STYLUS , data [ 1 ] & 0x02 ) ;
input_report_key ( input , BTN_STYLUS2 , data [ 1 ] & 0x10 ) ;
2006-07-14 05:01:36 +04:00
return 1 ;
}
2010-03-20 08:18:15 +03:00
static int wacom_graphire_irq ( struct wacom_wac * wacom )
2006-07-14 05:01:36 +04:00
{
2010-02-18 09:38:31 +03:00
struct wacom_features * features = & wacom - > features ;
2006-07-14 05:01:36 +04:00
unsigned char * data = wacom - > data ;
2010-03-20 08:18:15 +03:00
struct input_dev * input = wacom - > input ;
2010-03-20 08:33:38 +03:00
int prox ;
2010-03-05 08:50:59 +03:00
int rw = 0 ;
int retval = 0 ;
2006-07-14 05:01:36 +04:00
2009-12-15 11:35:25 +03:00
if ( data [ 0 ] ! = WACOM_REPORT_PENABLED ) {
2006-07-14 05:01:36 +04:00
dbg ( " wacom_graphire_irq: received unknown report #%d " , data [ 0 ] ) ;
2010-03-05 08:50:59 +03:00
goto exit ;
2006-07-14 05:01:36 +04:00
}
2010-03-05 08:50:59 +03:00
prox = data [ 1 ] & 0x80 ;
if ( prox | | wacom - > id [ 0 ] ) {
if ( prox ) {
switch ( ( data [ 1 ] > > 5 ) & 3 ) {
2006-07-14 05:01:36 +04:00
case 0 : /* Pen */
wacom - > tool [ 0 ] = BTN_TOOL_PEN ;
2008-05-05 19:36:41 +04:00
wacom - > id [ 0 ] = STYLUS_DEVICE_ID ;
2006-07-14 05:01:36 +04:00
break ;
case 1 : /* Rubber */
wacom - > tool [ 0 ] = BTN_TOOL_RUBBER ;
2008-05-05 19:36:41 +04:00
wacom - > id [ 0 ] = ERASER_DEVICE_ID ;
2006-07-14 05:01:36 +04:00
break ;
case 2 : /* Mouse with wheel */
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_MIDDLE , data [ 1 ] & 0x04 ) ;
2006-07-14 05:01:36 +04:00
/* fall through */
case 3 : /* Mouse without wheel */
wacom - > tool [ 0 ] = BTN_TOOL_MOUSE ;
2008-05-05 19:36:41 +04:00
wacom - > id [ 0 ] = CURSOR_DEVICE_ID ;
2006-07-14 05:01:36 +04:00
break ;
2010-03-05 08:50:59 +03:00
}
2006-07-14 05:01:36 +04:00
}
2010-03-20 08:33:38 +03:00
input_report_abs ( input , ABS_X , le16_to_cpup ( ( __le16 * ) & data [ 2 ] ) ) ;
input_report_abs ( input , ABS_Y , le16_to_cpup ( ( __le16 * ) & data [ 4 ] ) ) ;
2006-07-14 05:01:36 +04:00
if ( wacom - > tool [ 0 ] ! = BTN_TOOL_MOUSE ) {
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_PRESSURE , data [ 6 ] | ( ( data [ 7 ] & 0x01 ) < < 8 ) ) ;
input_report_key ( input , BTN_TOUCH , data [ 1 ] & 0x01 ) ;
input_report_key ( input , BTN_STYLUS , data [ 1 ] & 0x02 ) ;
input_report_key ( input , BTN_STYLUS2 , data [ 1 ] & 0x04 ) ;
2010-04-14 10:08:58 +04:00
} else {
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_LEFT , data [ 1 ] & 0x01 ) ;
input_report_key ( input , BTN_RIGHT , data [ 1 ] & 0x02 ) ;
2010-03-05 08:50:59 +03:00
if ( features - > type = = WACOM_G4 | |
features - > type = = WACOM_MO ) {
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_DISTANCE , data [ 6 ] & 0x3f ) ;
2010-03-05 08:50:59 +03:00
rw = ( signed ) ( data [ 7 ] & 0x04 ) - ( data [ 7 ] & 0x03 ) ;
} else {
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_DISTANCE , data [ 7 ] & 0x3f ) ;
2010-03-05 08:50:59 +03:00
rw = - ( signed ) data [ 6 ] ;
}
2010-03-20 08:18:15 +03:00
input_report_rel ( input , REL_WHEEL , rw ) ;
2010-04-14 10:08:58 +04:00
}
2010-03-05 08:50:59 +03:00
if ( ! prox )
wacom - > id [ 0 ] = 0 ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_MISC , wacom - > id [ 0 ] ) ; /* report tool id */
input_report_key ( input , wacom - > tool [ 0 ] , prox ) ;
input_sync ( input ) ; /* sync last event */
2007-02-23 23:22:48 +03:00
}
2006-07-14 05:01:36 +04:00
/* send pad data */
2010-02-18 09:38:31 +03:00
switch ( features - > type ) {
2010-03-20 08:18:15 +03:00
case WACOM_G4 :
2010-03-05 08:50:59 +03:00
prox = data [ 7 ] & 0xf8 ;
if ( prox | | wacom - > id [ 1 ] ) {
2008-05-05 19:36:41 +04:00
wacom - > id [ 1 ] = PAD_DEVICE_ID ;
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_0 , ( data [ 7 ] & 0x40 ) ) ;
input_report_key ( input , BTN_4 , ( data [ 7 ] & 0x80 ) ) ;
2006-07-14 05:01:36 +04:00
rw = ( ( data [ 7 ] & 0x18 ) > > 3 ) - ( ( data [ 7 ] & 0x20 ) > > 3 ) ;
2010-03-20 08:18:15 +03:00
input_report_rel ( input , REL_WHEEL , rw ) ;
input_report_key ( input , BTN_TOOL_FINGER , 0xf0 ) ;
2010-03-05 08:50:59 +03:00
if ( ! prox )
wacom - > id [ 1 ] = 0 ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_MISC , wacom - > id [ 1 ] ) ;
input_event ( input , EV_MSC , MSC_SERIAL , 0xf0 ) ;
2010-04-06 10:07:41 +04:00
retval = 1 ;
2006-07-14 05:01:36 +04:00
}
2007-06-15 07:32:48 +04:00
break ;
2010-03-20 08:18:15 +03:00
case WACOM_MO :
2010-03-05 08:50:59 +03:00
prox = ( data [ 7 ] & 0xf8 ) | | data [ 8 ] ;
if ( prox | | wacom - > id [ 1 ] ) {
2008-05-05 19:36:41 +04:00
wacom - > id [ 1 ] = PAD_DEVICE_ID ;
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_0 , ( data [ 7 ] & 0x08 ) ) ;
input_report_key ( input , BTN_1 , ( data [ 7 ] & 0x20 ) ) ;
input_report_key ( input , BTN_4 , ( data [ 7 ] & 0x10 ) ) ;
input_report_key ( input , BTN_5 , ( data [ 7 ] & 0x40 ) ) ;
input_report_abs ( input , ABS_WHEEL , ( data [ 8 ] & 0x7f ) ) ;
input_report_key ( input , BTN_TOOL_FINGER , 0xf0 ) ;
2010-03-05 08:50:59 +03:00
if ( ! prox )
wacom - > id [ 1 ] = 0 ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_MISC , wacom - > id [ 1 ] ) ;
input_event ( input , EV_MSC , MSC_SERIAL , 0xf0 ) ;
2007-06-15 07:32:48 +04:00
}
2010-03-05 08:50:59 +03:00
retval = 1 ;
2007-06-15 07:32:48 +04:00
break ;
2006-07-14 05:01:36 +04:00
}
2010-03-05 08:50:59 +03:00
exit :
return retval ;
2006-07-14 05:01:36 +04:00
}
2010-03-20 08:18:15 +03:00
static int wacom_intuos_inout ( struct wacom_wac * wacom )
2006-07-14 05:01:36 +04:00
{
2010-02-18 09:38:31 +03:00
struct wacom_features * features = & wacom - > features ;
2006-07-14 05:01:36 +04:00
unsigned char * data = wacom - > data ;
2010-03-20 08:18:15 +03:00
struct input_dev * input = wacom - > input ;
2009-05-09 05:30:33 +04:00
int idx = 0 ;
2006-07-14 05:01:36 +04:00
/* tool number */
2010-02-18 09:38:31 +03:00
if ( features - > type = = INTUOS )
2009-05-09 05:30:33 +04:00
idx = data [ 1 ] & 0x01 ;
2006-07-14 05:01:36 +04:00
/* Enter report */
if ( ( data [ 1 ] & 0xfc ) = = 0xc0 ) {
/* serial number of the tool */
wacom - > serial [ idx ] = ( ( data [ 3 ] & 0x0f ) < < 28 ) +
( data [ 4 ] < < 20 ) + ( data [ 5 ] < < 12 ) +
( data [ 6 ] < < 4 ) + ( data [ 7 ] > > 4 ) ;
wacom - > id [ idx ] = ( data [ 2 ] < < 4 ) | ( data [ 3 ] > > 4 ) ;
2010-03-20 08:18:15 +03:00
2006-07-14 05:01:36 +04:00
switch ( wacom - > id [ idx ] ) {
2010-03-20 08:18:15 +03:00
case 0x812 : /* Inking pen */
case 0x801 : /* Intuos3 Inking pen */
case 0x20802 : /* Intuos4 Classic Pen */
case 0x012 :
wacom - > tool [ idx ] = BTN_TOOL_PENCIL ;
break ;
case 0x822 : /* Pen */
case 0x842 :
case 0x852 :
case 0x823 : /* Intuos3 Grip Pen */
case 0x813 : /* Intuos3 Classic Pen */
case 0x885 : /* Intuos3 Marker Pen */
case 0x802 : /* Intuos4 Grip Pen Eraser */
case 0x804 : /* Intuos4 Marker Pen */
case 0x40802 : /* Intuos4 Classic Pen */
case 0x022 :
wacom - > tool [ idx ] = BTN_TOOL_PEN ;
break ;
case 0x832 : /* Stroke pen */
case 0x032 :
wacom - > tool [ idx ] = BTN_TOOL_BRUSH ;
break ;
case 0x007 : /* Mouse 4D and 2D */
case 0x09c :
case 0x094 :
case 0x017 : /* Intuos3 2D Mouse */
case 0x806 : /* Intuos4 Mouse */
wacom - > tool [ idx ] = BTN_TOOL_MOUSE ;
break ;
case 0x096 : /* Lens cursor */
case 0x097 : /* Intuos3 Lens cursor */
case 0x006 : /* Intuos4 Lens cursor */
wacom - > tool [ idx ] = BTN_TOOL_LENS ;
break ;
case 0x82a : /* Eraser */
case 0x85a :
case 0x91a :
case 0xd1a :
case 0x0fa :
case 0x82b : /* Intuos3 Grip Pen Eraser */
case 0x81b : /* Intuos3 Classic Pen Eraser */
case 0x91b : /* Intuos3 Airbrush Eraser */
case 0x80c : /* Intuos4 Marker Pen Eraser */
case 0x80a : /* Intuos4 Grip Pen Eraser */
case 0x4080a : /* Intuos4 Classic Pen Eraser */
case 0x90a : /* Intuos4 Airbrush Eraser */
wacom - > tool [ idx ] = BTN_TOOL_RUBBER ;
break ;
case 0xd12 :
case 0x912 :
case 0x112 :
case 0x913 : /* Intuos3 Airbrush */
case 0x902 : /* Intuos4 Airbrush */
wacom - > tool [ idx ] = BTN_TOOL_AIRBRUSH ;
break ;
default : /* Unknown tool */
wacom - > tool [ idx ] = BTN_TOOL_PEN ;
break ;
2006-07-14 05:01:36 +04:00
}
return 1 ;
}
/* Exit report */
if ( ( data [ 1 ] & 0xfe ) = = 0x80 ) {
2009-05-09 05:30:33 +04:00
/*
* Reset all states otherwise we lose the initial states
* when in - prox next time
*/
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_X , 0 ) ;
input_report_abs ( input , ABS_Y , 0 ) ;
input_report_abs ( input , ABS_DISTANCE , 0 ) ;
input_report_abs ( input , ABS_TILT_X , 0 ) ;
input_report_abs ( input , ABS_TILT_Y , 0 ) ;
2007-02-23 23:22:48 +03:00
if ( wacom - > tool [ idx ] > = BTN_TOOL_MOUSE ) {
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_LEFT , 0 ) ;
input_report_key ( input , BTN_MIDDLE , 0 ) ;
input_report_key ( input , BTN_RIGHT , 0 ) ;
input_report_key ( input , BTN_SIDE , 0 ) ;
input_report_key ( input , BTN_EXTRA , 0 ) ;
input_report_abs ( input , ABS_THROTTLE , 0 ) ;
input_report_abs ( input , ABS_RZ , 0 ) ;
2007-06-15 07:32:48 +04:00
} else {
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_PRESSURE , 0 ) ;
input_report_key ( input , BTN_STYLUS , 0 ) ;
input_report_key ( input , BTN_STYLUS2 , 0 ) ;
input_report_key ( input , BTN_TOUCH , 0 ) ;
input_report_abs ( input , ABS_WHEEL , 0 ) ;
2010-02-18 09:38:31 +03:00
if ( features - > type > = INTUOS3S )
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_Z , 0 ) ;
2006-09-27 00:34:47 +04:00
}
2010-03-20 08:18:15 +03:00
input_report_key ( input , wacom - > tool [ idx ] , 0 ) ;
input_report_abs ( input , ABS_MISC , 0 ) ; /* reset tool id */
input_event ( input , EV_MSC , MSC_SERIAL , wacom - > serial [ idx ] ) ;
2009-05-09 05:30:33 +04:00
wacom - > id [ idx ] = 0 ;
2007-02-23 23:22:48 +03:00
return 2 ;
2006-07-14 05:01:36 +04:00
}
return 0 ;
}
2010-03-20 08:18:15 +03:00
static void wacom_intuos_general ( struct wacom_wac * wacom )
2006-07-14 05:01:36 +04:00
{
2010-02-18 09:38:31 +03:00
struct wacom_features * features = & wacom - > features ;
2006-07-14 05:01:36 +04:00
unsigned char * data = wacom - > data ;
2010-03-20 08:18:15 +03:00
struct input_dev * input = wacom - > input ;
2006-07-14 05:01:36 +04:00
unsigned int t ;
/* general pen packet */
if ( ( data [ 1 ] & 0xb8 ) = = 0xa0 ) {
t = ( data [ 6 ] < < 2 ) | ( ( data [ 7 ] > > 6 ) & 3 ) ;
2010-02-18 09:38:31 +03:00
if ( features - > type > = INTUOS4S & & features - > type < = INTUOS4L )
2009-05-09 05:30:33 +04:00
t = ( t < < 1 ) | ( data [ 1 ] & 1 ) ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_PRESSURE , t ) ;
input_report_abs ( input , ABS_TILT_X ,
2006-07-14 05:01:36 +04:00
( ( data [ 7 ] < < 1 ) & 0x7e ) | ( data [ 8 ] > > 7 ) ) ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_TILT_Y , data [ 8 ] & 0x7f ) ;
input_report_key ( input , BTN_STYLUS , data [ 1 ] & 2 ) ;
input_report_key ( input , BTN_STYLUS2 , data [ 1 ] & 4 ) ;
input_report_key ( input , BTN_TOUCH , t > 10 ) ;
2006-07-14 05:01:36 +04:00
}
/* airbrush second packet */
if ( ( data [ 1 ] & 0xbc ) = = 0xb4 ) {
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_WHEEL ,
2006-07-14 05:01:36 +04:00
( data [ 6 ] < < 2 ) | ( ( data [ 7 ] > > 6 ) & 3 ) ) ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_TILT_X ,
2006-07-14 05:01:36 +04:00
( ( data [ 7 ] < < 1 ) & 0x7e ) | ( data [ 8 ] > > 7 ) ) ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_TILT_Y , data [ 8 ] & 0x7f ) ;
2006-07-14 05:01:36 +04:00
}
}
2010-03-20 08:18:15 +03:00
static int wacom_intuos_irq ( struct wacom_wac * wacom )
2006-07-14 05:01:36 +04:00
{
2010-02-18 09:38:31 +03:00
struct wacom_features * features = & wacom - > features ;
2006-07-14 05:01:36 +04:00
unsigned char * data = wacom - > data ;
2010-03-20 08:18:15 +03:00
struct input_dev * input = wacom - > input ;
2006-07-14 05:01:36 +04:00
unsigned int t ;
2009-05-09 05:30:33 +04:00
int idx = 0 , result ;
2006-07-14 05:01:36 +04:00
2009-12-15 11:35:25 +03:00
if ( data [ 0 ] ! = WACOM_REPORT_PENABLED & & data [ 0 ] ! = WACOM_REPORT_INTUOSREAD
& & data [ 0 ] ! = WACOM_REPORT_INTUOSWRITE & & data [ 0 ] ! = WACOM_REPORT_INTUOSPAD ) {
2006-07-14 05:01:36 +04:00
dbg ( " wacom_intuos_irq: received unknown report #%d " , data [ 0 ] ) ;
return 0 ;
}
/* tool number */
2010-02-18 09:38:31 +03:00
if ( features - > type = = INTUOS )
2009-05-09 05:30:33 +04:00
idx = data [ 1 ] & 0x01 ;
2006-07-14 05:01:36 +04:00
/* pad packets. Works as a second tool and is always in prox */
2009-12-15 11:35:25 +03:00
if ( data [ 0 ] = = WACOM_REPORT_INTUOSPAD ) {
2006-07-14 05:01:36 +04:00
/* initiate the pad as a device */
if ( wacom - > tool [ 1 ] ! = BTN_TOOL_FINGER )
wacom - > tool [ 1 ] = BTN_TOOL_FINGER ;
2010-02-18 09:38:31 +03:00
if ( features - > type > = INTUOS4S & & features - > type < = INTUOS4L ) {
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_0 , ( data [ 2 ] & 0x01 ) ) ;
input_report_key ( input , BTN_1 , ( data [ 3 ] & 0x01 ) ) ;
input_report_key ( input , BTN_2 , ( data [ 3 ] & 0x02 ) ) ;
input_report_key ( input , BTN_3 , ( data [ 3 ] & 0x04 ) ) ;
input_report_key ( input , BTN_4 , ( data [ 3 ] & 0x08 ) ) ;
input_report_key ( input , BTN_5 , ( data [ 3 ] & 0x10 ) ) ;
input_report_key ( input , BTN_6 , ( data [ 3 ] & 0x20 ) ) ;
2009-05-09 05:30:33 +04:00
if ( data [ 1 ] & 0x80 ) {
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_WHEEL , ( data [ 1 ] & 0x7f ) ) ;
2009-06-03 03:59:58 +04:00
} else {
/* Out of proximity, clear wheel value. */
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_WHEEL , 0 ) ;
2009-05-09 05:30:33 +04:00
}
2010-02-18 09:38:31 +03:00
if ( features - > type ! = INTUOS4S ) {
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_7 , ( data [ 3 ] & 0x40 ) ) ;
input_report_key ( input , BTN_8 , ( data [ 3 ] & 0x80 ) ) ;
2009-05-09 05:30:33 +04:00
}
if ( data [ 1 ] | ( data [ 2 ] & 0x01 ) | data [ 3 ] ) {
2010-03-20 08:18:15 +03:00
input_report_key ( input , wacom - > tool [ 1 ] , 1 ) ;
input_report_abs ( input , ABS_MISC , PAD_DEVICE_ID ) ;
2009-05-09 05:30:33 +04:00
} else {
2010-03-20 08:18:15 +03:00
input_report_key ( input , wacom - > tool [ 1 ] , 0 ) ;
input_report_abs ( input , ABS_MISC , 0 ) ;
2009-05-09 05:30:33 +04:00
}
} else {
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_0 , ( data [ 5 ] & 0x01 ) ) ;
input_report_key ( input , BTN_1 , ( data [ 5 ] & 0x02 ) ) ;
input_report_key ( input , BTN_2 , ( data [ 5 ] & 0x04 ) ) ;
input_report_key ( input , BTN_3 , ( data [ 5 ] & 0x08 ) ) ;
input_report_key ( input , BTN_4 , ( data [ 6 ] & 0x01 ) ) ;
input_report_key ( input , BTN_5 , ( data [ 6 ] & 0x02 ) ) ;
input_report_key ( input , BTN_6 , ( data [ 6 ] & 0x04 ) ) ;
input_report_key ( input , BTN_7 , ( data [ 6 ] & 0x08 ) ) ;
input_report_key ( input , BTN_8 , ( data [ 5 ] & 0x10 ) ) ;
input_report_key ( input , BTN_9 , ( data [ 6 ] & 0x10 ) ) ;
input_report_abs ( input , ABS_RX , ( ( data [ 1 ] & 0x1f ) < < 8 ) | data [ 2 ] ) ;
input_report_abs ( input , ABS_RY , ( ( data [ 3 ] & 0x1f ) < < 8 ) | data [ 4 ] ) ;
2009-05-09 05:30:33 +04:00
if ( ( data [ 5 ] & 0x1f ) | ( data [ 6 ] & 0x1f ) | ( data [ 1 ] & 0x1f ) |
data [ 2 ] | ( data [ 3 ] & 0x1f ) | data [ 4 ] ) {
2010-03-20 08:18:15 +03:00
input_report_key ( input , wacom - > tool [ 1 ] , 1 ) ;
input_report_abs ( input , ABS_MISC , PAD_DEVICE_ID ) ;
2009-05-09 05:30:33 +04:00
} else {
2010-03-20 08:18:15 +03:00
input_report_key ( input , wacom - > tool [ 1 ] , 0 ) ;
input_report_abs ( input , ABS_MISC , 0 ) ;
2009-05-09 05:30:33 +04:00
}
}
2010-03-20 08:18:15 +03:00
input_event ( input , EV_MSC , MSC_SERIAL , 0xffffffff ) ;
2006-07-14 05:01:36 +04:00
return 1 ;
}
/* process in/out prox events */
2010-03-20 08:18:15 +03:00
result = wacom_intuos_inout ( wacom ) ;
2006-07-14 05:01:36 +04:00
if ( result )
2010-03-20 08:18:15 +03:00
return result - 1 ;
2006-07-14 05:01:36 +04:00
2009-05-09 05:30:33 +04:00
/* don't proceed if we don't know the ID */
if ( ! wacom - > id [ idx ] )
return 0 ;
/* Only large Intuos support Lense Cursor */
2010-02-18 09:38:31 +03:00
if ( wacom - > tool [ idx ] = = BTN_TOOL_LENS & &
( features - > type = = INTUOS3 | |
features - > type = = INTUOS3S | |
features - > type = = INTUOS4 | |
features - > type = = INTUOS4S ) ) {
2007-02-23 23:22:48 +03:00
return 0 ;
2010-02-18 09:38:31 +03:00
}
2007-02-23 23:22:48 +03:00
2006-07-14 05:01:36 +04:00
/* Cintiq doesn't send data when RDY bit isn't set */
2010-02-18 09:38:31 +03:00
if ( features - > type = = CINTIQ & & ! ( data [ 1 ] & 0x40 ) )
2006-07-14 05:01:36 +04:00
return 0 ;
2010-02-18 09:38:31 +03:00
if ( features - > type > = INTUOS3S ) {
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_X , ( data [ 2 ] < < 9 ) | ( data [ 3 ] < < 1 ) | ( ( data [ 9 ] > > 1 ) & 1 ) ) ;
input_report_abs ( input , ABS_Y , ( data [ 4 ] < < 9 ) | ( data [ 5 ] < < 1 ) | ( data [ 9 ] & 1 ) ) ;
input_report_abs ( input , ABS_DISTANCE , ( ( data [ 9 ] > > 2 ) & 0x3f ) ) ;
2006-07-14 05:01:36 +04:00
} else {
2010-03-20 08:33:38 +03:00
input_report_abs ( input , ABS_X , be16_to_cpup ( ( __be16 * ) & data [ 2 ] ) ) ;
input_report_abs ( input , ABS_Y , be16_to_cpup ( ( __be16 * ) & data [ 4 ] ) ) ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_DISTANCE , ( ( data [ 9 ] > > 3 ) & 0x1f ) ) ;
2006-07-14 05:01:36 +04:00
}
/* process general packets */
2010-03-20 08:18:15 +03:00
wacom_intuos_general ( wacom ) ;
2006-07-14 05:01:36 +04:00
2009-05-09 05:30:33 +04:00
/* 4D mouse, 2D mouse, marker pen rotation, tilt mouse, or Lens cursor packets */
if ( ( data [ 1 ] & 0xbc ) = = 0xa8 | | ( data [ 1 ] & 0xbe ) = = 0xb0 | | ( data [ 1 ] & 0xbc ) = = 0xac ) {
2006-07-14 05:01:36 +04:00
if ( data [ 1 ] & 0x02 ) {
/* Rotation packet */
2010-02-18 09:38:31 +03:00
if ( features - > type > = INTUOS3S ) {
2008-03-13 23:46:46 +03:00
/* I3 marker pen rotation */
2006-07-14 05:01:36 +04:00
t = ( data [ 6 ] < < 3 ) | ( ( data [ 7 ] > > 5 ) & 7 ) ;
t = ( data [ 7 ] & 0x20 ) ? ( ( t > 900 ) ? ( ( t - 1 ) / 2 - 1350 ) :
( ( t - 1 ) / 2 + 450 ) ) : ( 450 - t / 2 ) ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_Z , t ) ;
2006-07-14 05:01:36 +04:00
} else {
/* 4D mouse rotation packet */
t = ( data [ 6 ] < < 3 ) | ( ( data [ 7 ] > > 5 ) & 7 ) ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_RZ , ( data [ 7 ] & 0x20 ) ?
2006-07-14 05:01:36 +04:00
( ( t - 1 ) / 2 ) : - t / 2 ) ;
}
2010-02-18 09:38:31 +03:00
} else if ( ! ( data [ 1 ] & 0x10 ) & & features - > type < INTUOS3S ) {
2006-07-14 05:01:36 +04:00
/* 4D mouse packet */
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_LEFT , data [ 8 ] & 0x01 ) ;
input_report_key ( input , BTN_MIDDLE , data [ 8 ] & 0x02 ) ;
input_report_key ( input , BTN_RIGHT , data [ 8 ] & 0x04 ) ;
2006-07-14 05:01:36 +04:00
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_SIDE , data [ 8 ] & 0x20 ) ;
input_report_key ( input , BTN_EXTRA , data [ 8 ] & 0x10 ) ;
2006-07-14 05:01:36 +04:00
t = ( data [ 6 ] < < 2 ) | ( ( data [ 7 ] > > 6 ) & 3 ) ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_THROTTLE , ( data [ 8 ] & 0x08 ) ? - t : t ) ;
2006-07-14 05:01:36 +04:00
} else if ( wacom - > tool [ idx ] = = BTN_TOOL_MOUSE ) {
2009-05-09 05:30:33 +04:00
/* I4 mouse */
2010-02-18 09:38:31 +03:00
if ( features - > type > = INTUOS4S & & features - > type < = INTUOS4L ) {
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_LEFT , data [ 6 ] & 0x01 ) ;
input_report_key ( input , BTN_MIDDLE , data [ 6 ] & 0x02 ) ;
input_report_key ( input , BTN_RIGHT , data [ 6 ] & 0x04 ) ;
input_report_rel ( input , REL_WHEEL , ( ( data [ 7 ] & 0x80 ) > > 7 )
2009-05-09 05:30:33 +04:00
- ( ( data [ 7 ] & 0x40 ) > > 6 ) ) ;
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_SIDE , data [ 6 ] & 0x08 ) ;
input_report_key ( input , BTN_EXTRA , data [ 6 ] & 0x10 ) ;
2009-05-09 05:30:33 +04:00
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_TILT_X ,
2009-05-09 05:30:33 +04:00
( ( data [ 7 ] < < 1 ) & 0x7e ) | ( data [ 8 ] > > 7 ) ) ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_TILT_Y , data [ 8 ] & 0x7f ) ;
2009-05-09 05:30:33 +04:00
} else {
/* 2D mouse packet */
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_LEFT , data [ 8 ] & 0x04 ) ;
input_report_key ( input , BTN_MIDDLE , data [ 8 ] & 0x08 ) ;
input_report_key ( input , BTN_RIGHT , data [ 8 ] & 0x10 ) ;
input_report_rel ( input , REL_WHEEL , ( data [ 8 ] & 0x01 )
2006-07-14 05:01:36 +04:00
- ( ( data [ 8 ] & 0x02 ) > > 1 ) ) ;
2009-05-09 05:30:33 +04:00
/* I3 2D mouse side buttons */
2010-02-18 09:38:31 +03:00
if ( features - > type > = INTUOS3S & & features - > type < = INTUOS3L ) {
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_SIDE , data [ 8 ] & 0x40 ) ;
input_report_key ( input , BTN_EXTRA , data [ 8 ] & 0x20 ) ;
2009-05-09 05:30:33 +04:00
}
2006-07-14 05:01:36 +04:00
}
2010-02-18 09:38:31 +03:00
} else if ( ( features - > type < INTUOS3S | | features - > type = = INTUOS3L | |
features - > type = = INTUOS4L ) & &
2009-05-09 05:30:33 +04:00
wacom - > tool [ idx ] = = BTN_TOOL_LENS ) {
2006-07-14 05:01:36 +04:00
/* Lens cursor packets */
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_LEFT , data [ 8 ] & 0x01 ) ;
input_report_key ( input , BTN_MIDDLE , data [ 8 ] & 0x02 ) ;
input_report_key ( input , BTN_RIGHT , data [ 8 ] & 0x04 ) ;
input_report_key ( input , BTN_SIDE , data [ 8 ] & 0x10 ) ;
input_report_key ( input , BTN_EXTRA , data [ 8 ] & 0x08 ) ;
2006-07-14 05:01:36 +04:00
}
}
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_MISC , wacom - > id [ idx ] ) ; /* report tool id */
input_report_key ( input , wacom - > tool [ idx ] , 1 ) ;
input_event ( input , EV_MSC , MSC_SERIAL , wacom - > serial [ idx ] ) ;
2006-07-14 05:01:36 +04:00
return 1 ;
}
2009-12-15 11:35:24 +03:00
2010-03-20 08:18:15 +03:00
static void wacom_tpc_finger_in ( struct wacom_wac * wacom , char * data , int idx )
2009-12-15 11:35:24 +03:00
{
2010-03-20 08:18:15 +03:00
struct input_dev * input = wacom - > input ;
2010-04-06 10:07:41 +04:00
int finger = idx + 1 ;
int x = le16_to_cpup ( ( __le16 * ) & data [ finger * 2 ] ) & 0x7fff ;
int y = le16_to_cpup ( ( __le16 * ) & data [ 4 + finger * 2 ] ) & 0x7fff ;
/*
* Work around input core suppressing " duplicate " events since
* we are abusing ABS_X / ABS_Y to transmit multi - finger data .
* This should go away once we switch to true multitouch
* protocol .
*/
if ( wacom - > last_finger ! = finger ) {
if ( x = = input - > abs [ ABS_X ] )
x + + ;
if ( y = = input - > abs [ ABS_Y ] )
y + + ;
}
2010-03-20 08:18:15 +03:00
2010-04-06 10:07:41 +04:00
input_report_abs ( input , ABS_X , x ) ;
input_report_abs ( input , ABS_Y , y ) ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_MISC , wacom - > id [ 0 ] ) ;
2010-04-06 10:07:41 +04:00
input_report_key ( input , wacom - > tool [ finger ] , 1 ) ;
if ( ! idx )
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_TOUCH , 1 ) ;
2010-04-06 10:07:41 +04:00
input_event ( input , EV_MSC , MSC_SERIAL , finger ) ;
input_sync ( wacom - > input ) ;
wacom - > last_finger = finger ;
2009-12-15 11:35:24 +03:00
}
2010-03-20 08:18:15 +03:00
static void wacom_tpc_touch_out ( struct wacom_wac * wacom , int idx )
2009-12-15 11:35:24 +03:00
{
2010-03-20 08:18:15 +03:00
struct input_dev * input = wacom - > input ;
2010-04-06 10:07:41 +04:00
int finger = idx + 1 ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_X , 0 ) ;
input_report_abs ( input , ABS_Y , 0 ) ;
input_report_abs ( input , ABS_MISC , 0 ) ;
2010-04-06 10:07:41 +04:00
input_report_key ( input , wacom - > tool [ finger ] , 0 ) ;
if ( ! idx )
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_TOUCH , 0 ) ;
2010-04-06 10:07:41 +04:00
input_event ( input , EV_MSC , MSC_SERIAL , finger ) ;
input_sync ( input ) ;
2009-12-15 11:35:24 +03:00
}
2010-03-20 08:18:15 +03:00
static void wacom_tpc_touch_in ( struct wacom_wac * wacom , size_t len )
2009-12-15 11:35:24 +03:00
{
char * data = wacom - > data ;
2010-03-20 08:18:15 +03:00
struct input_dev * input = wacom - > input ;
2009-12-15 11:35:24 +03:00
2010-04-06 10:07:41 +04:00
wacom - > tool [ 1 ] = BTN_TOOL_DOUBLETAP ;
2009-12-15 11:35:24 +03:00
wacom - > id [ 0 ] = TOUCH_DEVICE_ID ;
2010-04-06 10:07:41 +04:00
wacom - > tool [ 2 ] = BTN_TOOL_TRIPLETAP ;
2009-12-15 11:35:24 +03:00
2010-03-20 08:18:15 +03:00
if ( len ! = WACOM_PKGLEN_TPC1FG ) {
2010-03-20 08:18:15 +03:00
2009-12-15 11:35:24 +03:00
switch ( data [ 0 ] ) {
2010-03-20 08:18:15 +03:00
case WACOM_REPORT_TPC1FG :
2010-03-20 08:33:38 +03:00
input_report_abs ( input , ABS_X , le16_to_cpup ( ( __le16 * ) & data [ 2 ] ) ) ;
input_report_abs ( input , ABS_Y , le16_to_cpup ( ( __le16 * ) & data [ 4 ] ) ) ;
input_report_abs ( input , ABS_PRESSURE , le16_to_cpup ( ( __le16 * ) & data [ 6 ] ) ) ;
input_report_key ( input , BTN_TOUCH , le16_to_cpup ( ( __le16 * ) & data [ 6 ] ) ) ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_MISC , wacom - > id [ 0 ] ) ;
2010-04-06 10:07:41 +04:00
input_report_key ( input , wacom - > tool [ 1 ] , 1 ) ;
input_sync ( input ) ;
2010-03-20 08:18:15 +03:00
break ;
2009-12-15 11:35:24 +03:00
2010-03-20 08:18:15 +03:00
case WACOM_REPORT_TPC2FG :
2010-04-06 10:07:41 +04:00
if ( data [ 1 ] & 0x01 )
2010-03-20 08:18:15 +03:00
wacom_tpc_finger_in ( wacom , data , 0 ) ;
2010-04-06 10:07:41 +04:00
else if ( wacom - > id [ 1 ] & 0x01 )
2010-03-20 08:18:15 +03:00
wacom_tpc_touch_out ( wacom , 0 ) ;
2010-03-20 08:18:15 +03:00
2010-04-06 10:07:41 +04:00
if ( data [ 1 ] & 0x02 )
2010-03-20 08:18:15 +03:00
wacom_tpc_finger_in ( wacom , data , 1 ) ;
2010-04-06 10:07:41 +04:00
else if ( wacom - > id [ 1 ] & 0x02 )
2010-03-20 08:18:15 +03:00
wacom_tpc_touch_out ( wacom , 1 ) ;
2010-03-20 08:18:15 +03:00
break ;
2009-12-15 11:35:24 +03:00
}
} else {
2010-03-20 08:33:38 +03:00
input_report_abs ( input , ABS_X , get_unaligned_le16 ( & data [ 1 ] ) ) ;
input_report_abs ( input , ABS_Y , get_unaligned_le16 ( & data [ 3 ] ) ) ;
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_TOUCH , 1 ) ;
2010-04-06 10:07:41 +04:00
input_report_abs ( input , ABS_MISC , wacom - > id [ 1 ] ) ;
input_report_key ( input , wacom - > tool [ 1 ] , 1 ) ;
input_sync ( input ) ;
2009-12-15 11:35:24 +03:00
}
}
2010-03-20 08:18:15 +03:00
static int wacom_tpc_irq ( struct wacom_wac * wacom , size_t len )
2008-11-24 19:44:27 +03:00
{
2010-02-18 09:38:31 +03:00
struct wacom_features * features = & wacom - > features ;
2008-11-24 19:44:27 +03:00
char * data = wacom - > data ;
2010-03-20 08:18:15 +03:00
struct input_dev * input = wacom - > input ;
2010-04-06 10:07:41 +04:00
int prox = 0 , pressure ;
int retval = 0 ;
2008-11-24 19:44:27 +03:00
dbg ( " wacom_tpc_irq: received report #%d " , data [ 0 ] ) ;
2010-03-20 08:18:15 +03:00
if ( len = = WACOM_PKGLEN_TPC1FG | | /* single touch */
2009-12-15 11:35:25 +03:00
data [ 0 ] = = WACOM_REPORT_TPC1FG | | /* single touch */
data [ 0 ] = = WACOM_REPORT_TPC2FG ) { /* 2FG touch */
2010-04-06 10:07:41 +04:00
if ( wacom - > shared - > stylus_in_proximity ) {
if ( wacom - > id [ 1 ] & 0x01 )
wacom_tpc_touch_out ( wacom , 0 ) ;
if ( wacom - > id [ 1 ] & 0x02 )
wacom_tpc_touch_out ( wacom , 1 ) ;
wacom - > id [ 1 ] = 0 ;
return 0 ;
}
2010-03-20 08:18:15 +03:00
if ( len = = WACOM_PKGLEN_TPC1FG ) { /* with touch */
2009-12-15 11:35:24 +03:00
prox = data [ 0 ] & 0x01 ;
2008-11-24 19:44:27 +03:00
} else { /* with capacity */
2009-12-15 11:35:25 +03:00
if ( data [ 0 ] = = WACOM_REPORT_TPC1FG )
2009-12-15 11:35:24 +03:00
/* single touch */
prox = data [ 1 ] & 0x01 ;
else
/* 2FG touch data */
prox = data [ 1 ] & 0x03 ;
2008-11-24 19:44:27 +03:00
}
2010-04-06 10:07:41 +04:00
if ( prox ) {
if ( ! wacom - > id [ 1 ] )
wacom - > last_finger = 1 ;
wacom_tpc_touch_in ( wacom , len ) ;
} else {
if ( data [ 0 ] = = WACOM_REPORT_TPC2FG ) {
/* 2FGT out-prox */
if ( wacom - > id [ 1 ] & 0x01 )
2010-03-20 08:18:15 +03:00
wacom_tpc_touch_out ( wacom , 0 ) ;
2010-04-06 10:07:41 +04:00
if ( wacom - > id [ 1 ] & 0x02 )
wacom_tpc_touch_out ( wacom , 1 ) ;
} else
/* one finger touch */
wacom_tpc_touch_out ( wacom , 0 ) ;
wacom - > id [ 0 ] = 0 ;
2008-11-24 19:44:27 +03:00
}
2010-04-06 10:07:41 +04:00
/* keep prox bit to send proper out-prox event */
wacom - > id [ 1 ] = prox ;
2009-12-15 11:35:25 +03:00
} else if ( data [ 0 ] = = WACOM_REPORT_PENABLED ) { /* Penabled */
2008-11-24 19:44:27 +03:00
prox = data [ 1 ] & 0x20 ;
2010-04-06 10:07:41 +04:00
if ( ! wacom - > shared - > stylus_in_proximity ) { /* first in prox */
2010-03-05 08:50:59 +03:00
/* Going into proximity select tool */
wacom - > tool [ 0 ] = ( data [ 1 ] & 0x0c ) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN ;
if ( wacom - > tool [ 0 ] = = BTN_TOOL_PEN )
wacom - > id [ 0 ] = STYLUS_DEVICE_ID ;
else
wacom - > id [ 0 ] = ERASER_DEVICE_ID ;
2010-03-20 08:18:15 +03:00
wacom - > shared - > stylus_in_proximity = true ;
2010-03-05 08:50:59 +03:00
}
2010-03-20 08:18:15 +03:00
input_report_key ( input , BTN_STYLUS , data [ 1 ] & 0x02 ) ;
input_report_key ( input , BTN_STYLUS2 , data [ 1 ] & 0x10 ) ;
2010-03-20 08:33:38 +03:00
input_report_abs ( input , ABS_X , le16_to_cpup ( ( __le16 * ) & data [ 2 ] ) ) ;
input_report_abs ( input , ABS_Y , le16_to_cpup ( ( __le16 * ) & data [ 4 ] ) ) ;
2010-03-05 08:50:59 +03:00
pressure = ( ( data [ 7 ] & 0x01 ) < < 8 ) | data [ 6 ] ;
if ( pressure < 0 )
pressure = features - > pressure_max + pressure + 1 ;
2010-03-20 08:18:15 +03:00
input_report_abs ( input , ABS_PRESSURE , pressure ) ;
input_report_key ( input , BTN_TOUCH , data [ 1 ] & 0x05 ) ;
2010-03-05 08:50:59 +03:00
if ( ! prox ) { /* out-prox */
2009-12-15 11:35:24 +03:00
wacom - > id [ 0 ] = 0 ;
2010-03-20 08:18:15 +03:00
wacom - > shared - > stylus_in_proximity = false ;
2008-11-24 19:44:27 +03:00
}
2010-03-20 08:18:15 +03:00
input_report_key ( input , wacom - > tool [ 0 ] , prox ) ;
input_report_abs ( input , ABS_MISC , wacom - > id [ 0 ] ) ;
2010-04-06 10:07:41 +04:00
retval = 1 ;
2008-11-24 19:44:27 +03:00
}
2010-04-06 10:07:41 +04:00
return retval ;
2008-11-24 19:44:27 +03:00
}
2010-03-20 08:18:15 +03:00
void wacom_wac_irq ( struct wacom_wac * wacom_wac , size_t len )
2006-07-14 05:01:36 +04:00
{
2010-03-20 08:18:15 +03:00
bool sync ;
2010-02-18 09:38:31 +03:00
switch ( wacom_wac - > features . type ) {
2010-03-20 08:18:15 +03:00
case PENPARTNER :
2010-03-20 08:18:15 +03:00
sync = wacom_penpartner_irq ( wacom_wac ) ;
break ;
2010-03-20 08:18:15 +03:00
case PL :
2010-03-20 08:18:15 +03:00
sync = wacom_pl_irq ( wacom_wac ) ;
break ;
2010-03-20 08:18:15 +03:00
case WACOM_G4 :
case GRAPHIRE :
case WACOM_MO :
2010-03-20 08:18:15 +03:00
sync = wacom_graphire_irq ( wacom_wac ) ;
break ;
2010-03-20 08:18:15 +03:00
case PTU :
2010-03-20 08:18:15 +03:00
sync = wacom_ptu_irq ( wacom_wac ) ;
break ;
2010-03-20 08:18:15 +03:00
case INTUOS :
case INTUOS3S :
case INTUOS3 :
case INTUOS3L :
case INTUOS4S :
case INTUOS4 :
case INTUOS4L :
case CINTIQ :
case WACOM_BEE :
2010-03-20 08:18:15 +03:00
sync = wacom_intuos_irq ( wacom_wac ) ;
break ;
2010-03-20 08:18:15 +03:00
case TABLETPC :
case TABLETPC2FG :
2010-03-20 08:18:15 +03:00
sync = wacom_tpc_irq ( wacom_wac , len ) ;
break ;
2010-03-20 08:18:15 +03:00
default :
2010-03-20 08:18:15 +03:00
sync = false ;
break ;
2006-07-14 05:01:36 +04:00
}
2010-03-20 08:18:15 +03:00
if ( sync )
input_sync ( wacom_wac - > input ) ;
2006-07-14 05:01:36 +04:00
}
2010-03-20 08:18:15 +03:00
static void wacom_setup_intuos ( struct wacom_wac * wacom_wac )
{
struct input_dev * input_dev = wacom_wac - > input ;
input_set_capability ( input_dev , EV_MSC , MSC_SERIAL ) ;
input_set_capability ( input_dev , EV_REL , REL_WHEEL ) ;
__set_bit ( BTN_LEFT , input_dev - > keybit ) ;
__set_bit ( BTN_RIGHT , input_dev - > keybit ) ;
__set_bit ( BTN_MIDDLE , input_dev - > keybit ) ;
__set_bit ( BTN_SIDE , input_dev - > keybit ) ;
__set_bit ( BTN_EXTRA , input_dev - > keybit ) ;
__set_bit ( BTN_TOOL_RUBBER , input_dev - > keybit ) ;
__set_bit ( BTN_TOOL_PEN , input_dev - > keybit ) ;
__set_bit ( BTN_TOOL_MOUSE , input_dev - > keybit ) ;
__set_bit ( BTN_TOOL_BRUSH , input_dev - > keybit ) ;
__set_bit ( BTN_TOOL_PENCIL , input_dev - > keybit ) ;
__set_bit ( BTN_TOOL_AIRBRUSH , input_dev - > keybit ) ;
__set_bit ( BTN_TOOL_LENS , input_dev - > keybit ) ;
__set_bit ( BTN_STYLUS , input_dev - > keybit ) ;
__set_bit ( BTN_STYLUS2 , input_dev - > keybit ) ;
input_set_abs_params ( input_dev , ABS_DISTANCE ,
0 , wacom_wac - > features . distance_max , 0 , 0 ) ;
input_set_abs_params ( input_dev , ABS_WHEEL , 0 , 1023 , 0 , 0 ) ;
input_set_abs_params ( input_dev , ABS_TILT_X , 0 , 127 , 0 , 0 ) ;
input_set_abs_params ( input_dev , ABS_TILT_Y , 0 , 127 , 0 , 0 ) ;
input_set_abs_params ( input_dev , ABS_RZ , - 900 , 899 , 0 , 0 ) ;
input_set_abs_params ( input_dev , ABS_THROTTLE , - 1023 , 1023 , 0 , 0 ) ;
}
void wacom_setup_input_capabilities ( struct input_dev * input_dev ,
struct wacom_wac * wacom_wac )
2006-07-14 05:01:36 +04:00
{
2010-03-20 08:18:15 +03:00
struct wacom_features * features = & wacom_wac - > features ;
int i ;
input_dev - > evbit [ 0 ] | = BIT_MASK ( EV_KEY ) | BIT_MASK ( EV_ABS ) ;
__set_bit ( BTN_TOUCH , input_dev - > keybit ) ;
input_set_abs_params ( input_dev , ABS_X , 0 , features - > x_max , 4 , 0 ) ;
input_set_abs_params ( input_dev , ABS_Y , 0 , features - > y_max , 4 , 0 ) ;
input_set_abs_params ( input_dev , ABS_PRESSURE , 0 , features - > pressure_max , 0 , 0 ) ;
__set_bit ( ABS_MISC , input_dev - > absbit ) ;
2010-02-18 09:38:31 +03:00
switch ( wacom_wac - > features . type ) {
2010-03-20 08:18:15 +03:00
case WACOM_MO :
2010-03-20 08:18:15 +03:00
__set_bit ( BTN_1 , input_dev - > keybit ) ;
__set_bit ( BTN_5 , input_dev - > keybit ) ;
input_set_abs_params ( input_dev , ABS_WHEEL , 0 , 71 , 0 , 0 ) ;
/* fall through */
2010-03-20 08:18:15 +03:00
case WACOM_G4 :
2010-03-20 08:18:15 +03:00
input_set_capability ( input_dev , EV_MSC , MSC_SERIAL ) ;
__set_bit ( BTN_TOOL_FINGER , input_dev - > keybit ) ;
__set_bit ( BTN_0 , input_dev - > keybit ) ;
__set_bit ( BTN_4 , input_dev - > keybit ) ;
2010-03-20 08:18:15 +03:00
/* fall through */
case GRAPHIRE :
2010-03-20 08:18:15 +03:00
input_set_capability ( input_dev , EV_REL , REL_WHEEL ) ;
__set_bit ( BTN_LEFT , input_dev - > keybit ) ;
__set_bit ( BTN_RIGHT , input_dev - > keybit ) ;
__set_bit ( BTN_MIDDLE , input_dev - > keybit ) ;
__set_bit ( BTN_TOOL_RUBBER , input_dev - > keybit ) ;
__set_bit ( BTN_TOOL_PEN , input_dev - > keybit ) ;
__set_bit ( BTN_TOOL_MOUSE , input_dev - > keybit ) ;
__set_bit ( BTN_STYLUS , input_dev - > keybit ) ;
__set_bit ( BTN_STYLUS2 , input_dev - > keybit ) ;
2010-03-20 08:18:15 +03:00
break ;
case WACOM_BEE :
2010-03-20 08:18:15 +03:00
__set_bit ( BTN_8 , input_dev - > keybit ) ;
__set_bit ( BTN_9 , input_dev - > keybit ) ;
/* fall through */
2010-03-20 08:18:15 +03:00
case INTUOS3 :
case INTUOS3L :
case CINTIQ :
2010-03-20 08:18:15 +03:00
__set_bit ( BTN_4 , input_dev - > keybit ) ;
__set_bit ( BTN_5 , input_dev - > keybit ) ;
__set_bit ( BTN_6 , input_dev - > keybit ) ;
__set_bit ( BTN_7 , input_dev - > keybit ) ;
input_set_abs_params ( input_dev , ABS_RY , 0 , 4096 , 0 , 0 ) ;
2010-03-20 08:18:15 +03:00
/* fall through */
case INTUOS3S :
2010-03-20 08:18:15 +03:00
__set_bit ( BTN_0 , input_dev - > keybit ) ;
__set_bit ( BTN_1 , input_dev - > keybit ) ;
__set_bit ( BTN_2 , input_dev - > keybit ) ;
__set_bit ( BTN_3 , input_dev - > keybit ) ;
__set_bit ( BTN_TOOL_FINGER , input_dev - > keybit ) ;
input_set_abs_params ( input_dev , ABS_RX , 0 , 4096 , 0 , 0 ) ;
input_set_abs_params ( input_dev , ABS_Z , - 900 , 899 , 0 , 0 ) ;
2010-03-20 08:18:15 +03:00
/* fall through */
case INTUOS :
2010-03-20 08:18:15 +03:00
wacom_setup_intuos ( wacom_wac ) ;
2010-03-20 08:18:15 +03:00
break ;
case INTUOS4 :
case INTUOS4L :
2010-03-20 08:18:15 +03:00
__set_bit ( BTN_7 , input_dev - > keybit ) ;
__set_bit ( BTN_8 , input_dev - > keybit ) ;
2010-03-20 08:18:15 +03:00
/* fall through */
case INTUOS4S :
2010-03-20 08:18:15 +03:00
for ( i = 0 ; i < 7 ; i + + )
__set_bit ( BTN_0 + i , input_dev - > keybit ) ;
__set_bit ( BTN_TOOL_FINGER , input_dev - > keybit ) ;
input_set_abs_params ( input_dev , ABS_Z , - 900 , 899 , 0 , 0 ) ;
wacom_setup_intuos ( wacom_wac ) ;
2010-03-20 08:18:15 +03:00
break ;
case TABLETPC2FG :
2010-03-20 08:18:15 +03:00
if ( features - > device_type = = BTN_TOOL_TRIPLETAP ) {
__set_bit ( BTN_TOOL_TRIPLETAP , input_dev - > keybit ) ;
input_set_capability ( input_dev , EV_MSC , MSC_SERIAL ) ;
}
2010-03-20 08:18:15 +03:00
/* fall through */
case TABLETPC :
2010-03-20 08:18:15 +03:00
if ( features - > device_type = = BTN_TOOL_DOUBLETAP | |
features - > device_type = = BTN_TOOL_TRIPLETAP ) {
input_set_abs_params ( input_dev , ABS_RX , 0 , features - > x_phy , 0 , 0 ) ;
input_set_abs_params ( input_dev , ABS_RY , 0 , features - > y_phy , 0 , 0 ) ;
__set_bit ( BTN_TOOL_DOUBLETAP , input_dev - > keybit ) ;
}
if ( features - > device_type ! = BTN_TOOL_PEN )
2010-03-20 08:18:15 +03:00
break ; /* no need to process stylus stuff */
2010-03-20 08:18:15 +03:00
2010-03-20 08:18:15 +03:00
/* fall through */
case PL :
case PTU :
2010-03-20 08:18:15 +03:00
__set_bit ( BTN_TOOL_PEN , input_dev - > keybit ) ;
__set_bit ( BTN_STYLUS , input_dev - > keybit ) ;
__set_bit ( BTN_STYLUS2 , input_dev - > keybit ) ;
2010-03-20 08:18:15 +03:00
/* fall through */
case PENPARTNER :
2010-03-20 08:18:15 +03:00
__set_bit ( BTN_TOOL_RUBBER , input_dev - > keybit ) ;
2010-03-20 08:18:15 +03:00
break ;
2006-07-14 05:01:36 +04:00
}
}
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x00 =
2010-02-11 10:06:23 +03:00
{ " Wacom Penpartner " , WACOM_PKGLEN_PENPRTN , 5040 , 3780 , 255 , 0 , PENPARTNER } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x10 =
2010-02-11 10:06:23 +03:00
{ " Wacom Graphire " , WACOM_PKGLEN_GRAPHIRE , 10206 , 7422 , 511 , 63 , GRAPHIRE } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x11 =
2010-02-11 10:06:23 +03:00
{ " Wacom Graphire2 4x5 " , WACOM_PKGLEN_GRAPHIRE , 10206 , 7422 , 511 , 63 , GRAPHIRE } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x12 =
2010-02-11 10:06:23 +03:00
{ " Wacom Graphire2 5x7 " , WACOM_PKGLEN_GRAPHIRE , 13918 , 10206 , 511 , 63 , GRAPHIRE } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x13 =
2010-02-11 10:06:23 +03:00
{ " Wacom Graphire3 " , WACOM_PKGLEN_GRAPHIRE , 10208 , 7424 , 511 , 63 , GRAPHIRE } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x14 =
2010-02-11 10:06:23 +03:00
{ " Wacom Graphire3 6x8 " , WACOM_PKGLEN_GRAPHIRE , 16704 , 12064 , 511 , 63 , GRAPHIRE } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x15 =
2010-02-11 10:06:23 +03:00
{ " Wacom Graphire4 4x5 " , WACOM_PKGLEN_GRAPHIRE , 10208 , 7424 , 511 , 63 , WACOM_G4 } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x16 =
2010-02-11 10:06:23 +03:00
{ " Wacom Graphire4 6x8 " , WACOM_PKGLEN_GRAPHIRE , 16704 , 12064 , 511 , 63 , WACOM_G4 } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x17 =
2010-02-11 10:06:23 +03:00
{ " Wacom BambooFun 4x5 " , WACOM_PKGLEN_BBFUN , 14760 , 9225 , 511 , 63 , WACOM_MO } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x18 =
2010-02-11 10:06:23 +03:00
{ " Wacom BambooFun 6x8 " , WACOM_PKGLEN_BBFUN , 21648 , 13530 , 511 , 63 , WACOM_MO } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x19 =
2010-02-11 10:06:23 +03:00
{ " Wacom Bamboo1 Medium " , WACOM_PKGLEN_GRAPHIRE , 16704 , 12064 , 511 , 63 , GRAPHIRE } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x60 =
2010-02-11 10:06:23 +03:00
{ " Wacom Volito " , WACOM_PKGLEN_GRAPHIRE , 5104 , 3712 , 511 , 63 , GRAPHIRE } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x61 =
2010-02-11 10:06:23 +03:00
{ " Wacom PenStation2 " , WACOM_PKGLEN_GRAPHIRE , 3250 , 2320 , 255 , 63 , GRAPHIRE } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x62 =
2010-02-11 10:06:23 +03:00
{ " Wacom Volito2 4x5 " , WACOM_PKGLEN_GRAPHIRE , 5104 , 3712 , 511 , 63 , GRAPHIRE } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x63 =
2010-02-11 10:06:23 +03:00
{ " Wacom Volito2 2x3 " , WACOM_PKGLEN_GRAPHIRE , 3248 , 2320 , 511 , 63 , GRAPHIRE } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x64 =
2010-02-11 10:06:23 +03:00
{ " Wacom PenPartner2 " , WACOM_PKGLEN_GRAPHIRE , 3250 , 2320 , 511 , 63 , GRAPHIRE } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x65 =
2010-02-11 10:06:23 +03:00
{ " Wacom Bamboo " , WACOM_PKGLEN_BBFUN , 14760 , 9225 , 511 , 63 , WACOM_MO } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x69 =
2010-02-11 10:06:23 +03:00
{ " Wacom Bamboo1 " , WACOM_PKGLEN_GRAPHIRE , 5104 , 3712 , 511 , 63 , GRAPHIRE } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x20 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos 4x5 " , WACOM_PKGLEN_INTUOS , 12700 , 10600 , 1023 , 31 , INTUOS } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x21 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos 6x8 " , WACOM_PKGLEN_INTUOS , 20320 , 16240 , 1023 , 31 , INTUOS } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x22 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos 9x12 " , WACOM_PKGLEN_INTUOS , 30480 , 24060 , 1023 , 31 , INTUOS } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x23 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos 12x12 " , WACOM_PKGLEN_INTUOS , 30480 , 31680 , 1023 , 31 , INTUOS } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x24 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos 12x18 " , WACOM_PKGLEN_INTUOS , 45720 , 31680 , 1023 , 31 , INTUOS } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x30 =
2010-02-11 10:06:23 +03:00
{ " Wacom PL400 " , WACOM_PKGLEN_GRAPHIRE , 5408 , 4056 , 255 , 0 , PL } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x31 =
2010-02-11 10:06:23 +03:00
{ " Wacom PL500 " , WACOM_PKGLEN_GRAPHIRE , 6144 , 4608 , 255 , 0 , PL } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x32 =
2010-02-11 10:06:23 +03:00
{ " Wacom PL600 " , WACOM_PKGLEN_GRAPHIRE , 6126 , 4604 , 255 , 0 , PL } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x33 =
2010-02-11 10:06:23 +03:00
{ " Wacom PL600SX " , WACOM_PKGLEN_GRAPHIRE , 6260 , 5016 , 255 , 0 , PL } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x34 =
2010-02-11 10:06:23 +03:00
{ " Wacom PL550 " , WACOM_PKGLEN_GRAPHIRE , 6144 , 4608 , 511 , 0 , PL } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x35 =
2010-02-11 10:06:23 +03:00
{ " Wacom PL800 " , WACOM_PKGLEN_GRAPHIRE , 7220 , 5780 , 511 , 0 , PL } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x37 =
2010-02-11 10:06:23 +03:00
{ " Wacom PL700 " , WACOM_PKGLEN_GRAPHIRE , 6758 , 5406 , 511 , 0 , PL } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x38 =
2010-02-11 10:06:23 +03:00
{ " Wacom PL510 " , WACOM_PKGLEN_GRAPHIRE , 6282 , 4762 , 511 , 0 , PL } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x39 =
2010-02-11 10:06:23 +03:00
{ " Wacom DTU710 " , WACOM_PKGLEN_GRAPHIRE , 34080 , 27660 , 511 , 0 , PL } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xC4 =
2010-02-11 10:06:23 +03:00
{ " Wacom DTF521 " , WACOM_PKGLEN_GRAPHIRE , 6282 , 4762 , 511 , 0 , PL } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xC0 =
2010-02-11 10:06:23 +03:00
{ " Wacom DTF720 " , WACOM_PKGLEN_GRAPHIRE , 6858 , 5506 , 511 , 0 , PL } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xC2 =
2010-02-11 10:06:23 +03:00
{ " Wacom DTF720a " , WACOM_PKGLEN_GRAPHIRE , 6858 , 5506 , 511 , 0 , PL } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x03 =
2010-02-11 10:06:23 +03:00
{ " Wacom Cintiq Partner " , WACOM_PKGLEN_GRAPHIRE , 20480 , 15360 , 511 , 0 , PTU } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x41 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos2 4x5 " , WACOM_PKGLEN_INTUOS , 12700 , 10600 , 1023 , 31 , INTUOS } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x42 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos2 6x8 " , WACOM_PKGLEN_INTUOS , 20320 , 16240 , 1023 , 31 , INTUOS } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x43 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos2 9x12 " , WACOM_PKGLEN_INTUOS , 30480 , 24060 , 1023 , 31 , INTUOS } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x44 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos2 12x12 " , WACOM_PKGLEN_INTUOS , 30480 , 31680 , 1023 , 31 , INTUOS } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x45 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos2 12x18 " , WACOM_PKGLEN_INTUOS , 45720 , 31680 , 1023 , 31 , INTUOS } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xB0 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos3 4x5 " , WACOM_PKGLEN_INTUOS , 25400 , 20320 , 1023 , 63 , INTUOS3S } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xB1 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos3 6x8 " , WACOM_PKGLEN_INTUOS , 40640 , 30480 , 1023 , 63 , INTUOS3 } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xB2 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos3 9x12 " , WACOM_PKGLEN_INTUOS , 60960 , 45720 , 1023 , 63 , INTUOS3 } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xB3 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos3 12x12 " , WACOM_PKGLEN_INTUOS , 60960 , 60960 , 1023 , 63 , INTUOS3L } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xB4 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos3 12x19 " , WACOM_PKGLEN_INTUOS , 97536 , 60960 , 1023 , 63 , INTUOS3L } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xB5 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos3 6x11 " , WACOM_PKGLEN_INTUOS , 54204 , 31750 , 1023 , 63 , INTUOS3 } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xB7 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos3 4x6 " , WACOM_PKGLEN_INTUOS , 31496 , 19685 , 1023 , 63 , INTUOS3S } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xB8 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos4 4x6 " , WACOM_PKGLEN_INTUOS , 31496 , 19685 , 2047 , 63 , INTUOS4S } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xB9 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos4 6x9 " , WACOM_PKGLEN_INTUOS , 44704 , 27940 , 2047 , 63 , INTUOS4 } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xBA =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos4 8x13 " , WACOM_PKGLEN_INTUOS , 65024 , 40640 , 2047 , 63 , INTUOS4L } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xBB =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos4 12x19 " , WACOM_PKGLEN_INTUOS , 97536 , 60960 , 2047 , 63 , INTUOS4L } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x3F =
2010-02-11 10:06:23 +03:00
{ " Wacom Cintiq 21UX " , WACOM_PKGLEN_INTUOS , 87200 , 65600 , 1023 , 63 , CINTIQ } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xC5 =
2010-02-11 10:06:23 +03:00
{ " Wacom Cintiq 20WSX " , WACOM_PKGLEN_INTUOS , 86680 , 54180 , 1023 , 63 , WACOM_BEE } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xC6 =
2010-02-11 10:06:23 +03:00
{ " Wacom Cintiq 12WX " , WACOM_PKGLEN_INTUOS , 53020 , 33440 , 1023 , 63 , WACOM_BEE } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xC7 =
2010-02-11 10:06:23 +03:00
{ " Wacom DTU1931 " , WACOM_PKGLEN_GRAPHIRE , 37832 , 30305 , 511 , 0 , PL } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x90 =
2010-02-11 10:06:23 +03:00
{ " Wacom ISDv4 90 " , WACOM_PKGLEN_GRAPHIRE , 26202 , 16325 , 255 , 0 , TABLETPC } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x93 =
2010-02-11 10:06:23 +03:00
{ " Wacom ISDv4 93 " , WACOM_PKGLEN_GRAPHIRE , 26202 , 16325 , 255 , 0 , TABLETPC } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x9A =
2010-02-11 10:06:23 +03:00
{ " Wacom ISDv4 9A " , WACOM_PKGLEN_GRAPHIRE , 26202 , 16325 , 255 , 0 , TABLETPC } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x9F =
2010-03-02 10:50:24 +03:00
{ " Wacom ISDv4 9F " , WACOM_PKGLEN_GRAPHIRE , 26202 , 16325 , 255 , 0 , TABLETPC } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xE2 =
2010-02-11 10:06:23 +03:00
{ " Wacom ISDv4 E2 " , WACOM_PKGLEN_TPC2FG , 26202 , 16325 , 255 , 0 , TABLETPC2FG } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0xE3 =
2010-02-11 10:06:23 +03:00
{ " Wacom ISDv4 E3 " , WACOM_PKGLEN_TPC2FG , 26202 , 16325 , 255 , 0 , TABLETPC2FG } ;
2010-02-18 12:51:47 +03:00
static const struct wacom_features wacom_features_0x47 =
2010-02-11 10:06:23 +03:00
{ " Wacom Intuos2 6x8 " , WACOM_PKGLEN_INTUOS , 20320 , 16240 , 1023 , 31 , INTUOS } ;
# define USB_DEVICE_WACOM(prod) \
USB_DEVICE ( USB_VENDOR_ID_WACOM , prod ) , \
. driver_info = ( kernel_ulong_t ) & wacom_features_ # # prod
const struct usb_device_id wacom_ids [ ] = {
{ USB_DEVICE_WACOM ( 0x00 ) } ,
{ USB_DEVICE_WACOM ( 0x10 ) } ,
{ USB_DEVICE_WACOM ( 0x11 ) } ,
{ USB_DEVICE_WACOM ( 0x12 ) } ,
{ USB_DEVICE_WACOM ( 0x13 ) } ,
{ USB_DEVICE_WACOM ( 0x14 ) } ,
{ USB_DEVICE_WACOM ( 0x15 ) } ,
{ USB_DEVICE_WACOM ( 0x16 ) } ,
{ USB_DEVICE_WACOM ( 0x17 ) } ,
{ USB_DEVICE_WACOM ( 0x18 ) } ,
{ USB_DEVICE_WACOM ( 0x19 ) } ,
{ USB_DEVICE_WACOM ( 0x60 ) } ,
{ USB_DEVICE_WACOM ( 0x61 ) } ,
{ USB_DEVICE_WACOM ( 0x62 ) } ,
{ USB_DEVICE_WACOM ( 0x63 ) } ,
{ USB_DEVICE_WACOM ( 0x64 ) } ,
{ USB_DEVICE_WACOM ( 0x65 ) } ,
{ USB_DEVICE_WACOM ( 0x69 ) } ,
{ USB_DEVICE_WACOM ( 0x20 ) } ,
{ USB_DEVICE_WACOM ( 0x21 ) } ,
{ USB_DEVICE_WACOM ( 0x22 ) } ,
{ USB_DEVICE_WACOM ( 0x23 ) } ,
{ USB_DEVICE_WACOM ( 0x24 ) } ,
{ USB_DEVICE_WACOM ( 0x30 ) } ,
{ USB_DEVICE_WACOM ( 0x31 ) } ,
{ USB_DEVICE_WACOM ( 0x32 ) } ,
{ USB_DEVICE_WACOM ( 0x33 ) } ,
{ USB_DEVICE_WACOM ( 0x34 ) } ,
{ USB_DEVICE_WACOM ( 0x35 ) } ,
{ USB_DEVICE_WACOM ( 0x37 ) } ,
{ USB_DEVICE_WACOM ( 0x38 ) } ,
{ USB_DEVICE_WACOM ( 0x39 ) } ,
{ USB_DEVICE_WACOM ( 0xC4 ) } ,
{ USB_DEVICE_WACOM ( 0xC0 ) } ,
{ USB_DEVICE_WACOM ( 0xC2 ) } ,
{ USB_DEVICE_WACOM ( 0x03 ) } ,
{ USB_DEVICE_WACOM ( 0x41 ) } ,
{ USB_DEVICE_WACOM ( 0x42 ) } ,
{ USB_DEVICE_WACOM ( 0x43 ) } ,
{ USB_DEVICE_WACOM ( 0x44 ) } ,
{ USB_DEVICE_WACOM ( 0x45 ) } ,
{ USB_DEVICE_WACOM ( 0xB0 ) } ,
{ USB_DEVICE_WACOM ( 0xB1 ) } ,
{ USB_DEVICE_WACOM ( 0xB2 ) } ,
{ USB_DEVICE_WACOM ( 0xB3 ) } ,
{ USB_DEVICE_WACOM ( 0xB4 ) } ,
{ USB_DEVICE_WACOM ( 0xB5 ) } ,
{ USB_DEVICE_WACOM ( 0xB7 ) } ,
{ USB_DEVICE_WACOM ( 0xB8 ) } ,
{ USB_DEVICE_WACOM ( 0xB9 ) } ,
{ USB_DEVICE_WACOM ( 0xBA ) } ,
{ USB_DEVICE_WACOM ( 0xBB ) } ,
{ USB_DEVICE_WACOM ( 0x3F ) } ,
{ USB_DEVICE_WACOM ( 0xC5 ) } ,
{ USB_DEVICE_WACOM ( 0xC6 ) } ,
{ USB_DEVICE_WACOM ( 0xC7 ) } ,
{ USB_DEVICE_WACOM ( 0x90 ) } ,
{ USB_DEVICE_WACOM ( 0x93 ) } ,
{ USB_DEVICE_WACOM ( 0x9A ) } ,
{ USB_DEVICE_WACOM ( 0x9F ) } ,
{ USB_DEVICE_WACOM ( 0xE2 ) } ,
{ USB_DEVICE_WACOM ( 0xE3 ) } ,
{ USB_DEVICE_WACOM ( 0x47 ) } ,
2006-07-14 05:01:36 +04:00
{ }
} ;
MODULE_DEVICE_TABLE ( usb , wacom_ids ) ;