2006-07-13 18:01:36 -07:00
/*
2007-05-07 16:16:29 -04:00
* drivers / input / tablet / wacom_wac . c
2006-07-13 18:01:36 -07:00
*
2009-12-15 00:35:24 -08:00
* USB Wacom tablet support - Wacom specific code
2006-07-13 18:01:36 -07: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-19 22:18:15 -07:00
2006-07-13 18:01:36 -07:00
# include "wacom_wac.h"
2010-03-19 22:18:15 -07:00
# include "wacom.h"
2006-07-13 18:01:36 -07:00
static int wacom_penpartner_irq ( struct wacom_wac * wacom , void * wcombo )
{
unsigned char * data = wacom - > data ;
switch ( data [ 0 ] ) {
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 ;
wacom_report_key ( wcombo , wacom - > tool [ 0 ] , 1 ) ;
wacom_report_abs ( wcombo , ABS_MISC , wacom - > id [ 0 ] ) ; /* report tool id */
wacom_report_abs ( wcombo , ABS_X , wacom_le16_to_cpu ( & data [ 1 ] ) ) ;
wacom_report_abs ( wcombo , ABS_Y , wacom_le16_to_cpu ( & data [ 3 ] ) ) ;
wacom_report_abs ( wcombo , ABS_PRESSURE , ( signed char ) data [ 6 ] + 127 ) ;
wacom_report_key ( wcombo , BTN_TOUCH , ( ( signed char ) data [ 6 ] > - 127 ) ) ;
wacom_report_key ( wcombo , BTN_STYLUS , ( data [ 5 ] & 0x40 ) ) ;
} else {
wacom_report_key ( wcombo , wacom - > tool [ 0 ] , 0 ) ;
wacom_report_abs ( wcombo , ABS_MISC , 0 ) ; /* report tool id */
wacom_report_abs ( wcombo , ABS_PRESSURE , - 1 ) ;
wacom_report_key ( wcombo , BTN_TOUCH , 0 ) ;
}
break ;
case 2 :
wacom_report_key ( wcombo , BTN_TOOL_PEN , 1 ) ;
wacom_report_abs ( wcombo , ABS_MISC , STYLUS_DEVICE_ID ) ; /* report tool id */
wacom_report_abs ( wcombo , ABS_X , wacom_le16_to_cpu ( & data [ 1 ] ) ) ;
wacom_report_abs ( wcombo , ABS_Y , wacom_le16_to_cpu ( & data [ 3 ] ) ) ;
wacom_report_abs ( wcombo , ABS_PRESSURE , ( signed char ) data [ 6 ] + 127 ) ;
wacom_report_key ( wcombo , BTN_TOUCH , ( ( signed char ) data [ 6 ] > - 80 ) & & ! ( data [ 5 ] & 0x20 ) ) ;
wacom_report_key ( wcombo , BTN_STYLUS , ( data [ 5 ] & 0x40 ) ) ;
break ;
default :
printk ( KERN_INFO " wacom_penpartner_irq: received unknown report #%d \n " , data [ 0 ] ) ;
return 0 ;
}
return 1 ;
}
static int wacom_pl_irq ( struct wacom_wac * wacom , void * wcombo )
{
2010-02-17 22:38:31 -08:00
struct wacom_features * features = & wacom - > features ;
2006-07-13 18:01:36 -07:00
unsigned char * data = wacom - > data ;
2008-05-05 11:36:41 -04:00
int prox , pressure ;
2006-07-13 18:01:36 -07:00
2009-12-15 00:35:25 -08:00
if ( data [ 0 ] ! = WACOM_REPORT_PENABLED ) {
2006-07-13 18:01:36 -07:00
dbg ( " wacom_pl_irq: received unknown report #%d " , data [ 0 ] ) ;
return 0 ;
}
prox = data [ 1 ] & 0x40 ;
if ( prox ) {
2009-12-15 00:35:24 -08:00
wacom - > id [ 0 ] = ERASER_DEVICE_ID ;
2006-07-13 18:01:36 -07:00
pressure = ( signed char ) ( ( data [ 7 ] < < 1 ) | ( ( data [ 4 ] > > 2 ) & 1 ) ) ;
2010-02-17 22:38:31 -08:00
if ( features - > pressure_max > 255 )
2006-07-13 18:01:36 -07:00
pressure = ( pressure < < 1 ) | ( ( data [ 4 ] > > 6 ) & 1 ) ;
2010-02-17 22:38:31 -08:00
pressure + = ( features - > pressure_max + 1 ) / 2 ;
2006-07-13 18:01:36 -07: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 */
wacom_report_key ( wcombo , wacom - > tool [ 1 ] , 0 ) ;
wacom_input_sync ( wcombo ) ;
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 11:36:41 -04:00
wacom - > id [ 0 ] = STYLUS_DEVICE_ID ;
2006-07-13 18:01:36 -07:00
}
wacom_report_key ( wcombo , wacom - > tool [ 1 ] , prox ) ; /* report in proximity for tool */
2008-05-05 11:36:41 -04:00
wacom_report_abs ( wcombo , ABS_MISC , wacom - > id [ 0 ] ) ; /* report tool id */
2006-07-13 18:01:36 -07:00
wacom_report_abs ( wcombo , ABS_X , data [ 3 ] | ( data [ 2 ] < < 7 ) | ( ( data [ 1 ] & 0x03 ) < < 14 ) ) ;
wacom_report_abs ( wcombo , ABS_Y , data [ 6 ] | ( data [ 5 ] < < 7 ) | ( ( data [ 4 ] & 0x03 ) < < 14 ) ) ;
wacom_report_abs ( wcombo , ABS_PRESSURE , pressure ) ;
wacom_report_key ( wcombo , BTN_TOUCH , data [ 4 ] & 0x08 ) ;
wacom_report_key ( wcombo , BTN_STYLUS , data [ 4 ] & 0x10 ) ;
/* Only allow the stylus2 button to be reported for the pen tool. */
wacom_report_key ( wcombo , BTN_STYLUS2 , ( wacom - > tool [ 1 ] = = BTN_TOOL_PEN ) & & ( data [ 4 ] & 0x20 ) ) ;
} 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 ;
}
wacom_report_key ( wcombo , wacom - > tool [ 1 ] , prox ) ;
}
wacom - > tool [ 0 ] = prox ; /* Save proximity state */
return 1 ;
}
static int wacom_ptu_irq ( struct wacom_wac * wacom , void * wcombo )
{
unsigned char * data = wacom - > data ;
2009-12-15 00:35:25 -08:00
if ( data [ 0 ] ! = WACOM_REPORT_PENABLED ) {
2006-07-13 18:01:36 -07:00
printk ( KERN_INFO " wacom_ptu_irq: received unknown report #%d \n " , data [ 0 ] ) ;
return 0 ;
}
if ( data [ 1 ] & 0x04 ) {
wacom_report_key ( wcombo , BTN_TOOL_RUBBER , data [ 1 ] & 0x20 ) ;
wacom_report_key ( wcombo , BTN_TOUCH , data [ 1 ] & 0x08 ) ;
2008-05-05 11:36:41 -04:00
wacom - > id [ 0 ] = ERASER_DEVICE_ID ;
2006-07-13 18:01:36 -07:00
} else {
wacom_report_key ( wcombo , BTN_TOOL_PEN , data [ 1 ] & 0x20 ) ;
wacom_report_key ( wcombo , BTN_TOUCH , data [ 1 ] & 0x01 ) ;
2008-05-05 11:36:41 -04:00
wacom - > id [ 0 ] = STYLUS_DEVICE_ID ;
2006-07-13 18:01:36 -07:00
}
2008-05-05 11:36:41 -04:00
wacom_report_abs ( wcombo , ABS_MISC , wacom - > id [ 0 ] ) ; /* report tool id */
2006-07-13 18:01:36 -07:00
wacom_report_abs ( wcombo , ABS_X , wacom_le16_to_cpu ( & data [ 2 ] ) ) ;
wacom_report_abs ( wcombo , ABS_Y , wacom_le16_to_cpu ( & data [ 4 ] ) ) ;
wacom_report_abs ( wcombo , ABS_PRESSURE , wacom_le16_to_cpu ( & data [ 6 ] ) ) ;
wacom_report_key ( wcombo , BTN_STYLUS , data [ 1 ] & 0x02 ) ;
wacom_report_key ( wcombo , BTN_STYLUS2 , data [ 1 ] & 0x10 ) ;
return 1 ;
}
static int wacom_graphire_irq ( struct wacom_wac * wacom , void * wcombo )
{
2010-02-17 22:38:31 -08:00
struct wacom_features * features = & wacom - > features ;
2006-07-13 18:01:36 -07:00
unsigned char * data = wacom - > data ;
2010-03-04 21:50:59 -08:00
int x , y , prox ;
int rw = 0 ;
int retval = 0 ;
2006-07-13 18:01:36 -07:00
2009-12-15 00:35:25 -08:00
if ( data [ 0 ] ! = WACOM_REPORT_PENABLED ) {
2006-07-13 18:01:36 -07:00
dbg ( " wacom_graphire_irq: received unknown report #%d " , data [ 0 ] ) ;
2010-03-04 21:50:59 -08:00
goto exit ;
2006-07-13 18:01:36 -07:00
}
2010-03-04 21:50:59 -08:00
prox = data [ 1 ] & 0x80 ;
if ( prox | | wacom - > id [ 0 ] ) {
if ( prox ) {
switch ( ( data [ 1 ] > > 5 ) & 3 ) {
2006-07-13 18:01:36 -07:00
case 0 : /* Pen */
wacom - > tool [ 0 ] = BTN_TOOL_PEN ;
2008-05-05 11:36:41 -04:00
wacom - > id [ 0 ] = STYLUS_DEVICE_ID ;
2006-07-13 18:01:36 -07:00
break ;
case 1 : /* Rubber */
wacom - > tool [ 0 ] = BTN_TOOL_RUBBER ;
2008-05-05 11:36:41 -04:00
wacom - > id [ 0 ] = ERASER_DEVICE_ID ;
2006-07-13 18:01:36 -07:00
break ;
case 2 : /* Mouse with wheel */
wacom_report_key ( wcombo , BTN_MIDDLE , data [ 1 ] & 0x04 ) ;
/* fall through */
case 3 : /* Mouse without wheel */
wacom - > tool [ 0 ] = BTN_TOOL_MOUSE ;
2008-05-05 11:36:41 -04:00
wacom - > id [ 0 ] = CURSOR_DEVICE_ID ;
2006-07-13 18:01:36 -07:00
break ;
2010-03-04 21:50:59 -08:00
}
2006-07-13 18:01:36 -07:00
}
x = wacom_le16_to_cpu ( & data [ 2 ] ) ;
y = wacom_le16_to_cpu ( & data [ 4 ] ) ;
wacom_report_abs ( wcombo , ABS_X , x ) ;
wacom_report_abs ( wcombo , ABS_Y , y ) ;
if ( wacom - > tool [ 0 ] ! = BTN_TOOL_MOUSE ) {
wacom_report_abs ( wcombo , ABS_PRESSURE , data [ 6 ] | ( ( data [ 7 ] & 0x01 ) < < 8 ) ) ;
wacom_report_key ( wcombo , BTN_TOUCH , data [ 1 ] & 0x01 ) ;
wacom_report_key ( wcombo , BTN_STYLUS , data [ 1 ] & 0x02 ) ;
wacom_report_key ( wcombo , BTN_STYLUS2 , data [ 1 ] & 0x04 ) ;
2010-04-13 23:08:58 -07:00
} else {
2010-03-04 21:50:59 -08:00
wacom_report_key ( wcombo , BTN_LEFT , data [ 1 ] & 0x01 ) ;
wacom_report_key ( wcombo , BTN_RIGHT , data [ 1 ] & 0x02 ) ;
if ( features - > type = = WACOM_G4 | |
features - > type = = WACOM_MO ) {
wacom_report_abs ( wcombo , ABS_DISTANCE , data [ 6 ] & 0x3f ) ;
rw = ( signed ) ( data [ 7 ] & 0x04 ) - ( data [ 7 ] & 0x03 ) ;
} else {
wacom_report_abs ( wcombo , ABS_DISTANCE , data [ 7 ] & 0x3f ) ;
rw = - ( signed ) data [ 6 ] ;
}
wacom_report_rel ( wcombo , REL_WHEEL , rw ) ;
2010-04-13 23:08:58 -07:00
}
2010-03-04 21:50:59 -08:00
if ( ! prox )
wacom - > id [ 0 ] = 0 ;
wacom_report_abs ( wcombo , ABS_MISC , wacom - > id [ 0 ] ) ; /* report tool id */
wacom_report_key ( wcombo , wacom - > tool [ 0 ] , prox ) ;
wacom_input_sync ( wcombo ) ; /* sync last event */
2007-02-23 12:22:48 -08:00
}
2006-07-13 18:01:36 -07:00
/* send pad data */
2010-02-17 22:38:31 -08:00
switch ( features - > type ) {
2007-06-14 23:32:48 -04:00
case WACOM_G4 :
2010-03-04 21:50:59 -08:00
prox = data [ 7 ] & 0xf8 ;
if ( prox | | wacom - > id [ 1 ] ) {
2008-05-05 11:36:41 -04:00
wacom - > id [ 1 ] = PAD_DEVICE_ID ;
2006-07-13 18:01:36 -07:00
wacom_report_key ( wcombo , BTN_0 , ( data [ 7 ] & 0x40 ) ) ;
wacom_report_key ( wcombo , BTN_4 , ( data [ 7 ] & 0x80 ) ) ;
rw = ( ( data [ 7 ] & 0x18 ) > > 3 ) - ( ( data [ 7 ] & 0x20 ) > > 3 ) ;
wacom_report_rel ( wcombo , REL_WHEEL , rw ) ;
wacom_report_key ( wcombo , BTN_TOOL_FINGER , 0xf0 ) ;
2008-05-05 11:36:41 -04:00
wacom_report_abs ( wcombo , ABS_MISC , wacom - > id [ 1 ] ) ;
2010-03-04 21:50:59 -08:00
if ( ! prox )
wacom - > id [ 1 ] = 0 ;
wacom_report_abs ( wcombo , ABS_MISC , wacom - > id [ 1 ] ) ;
2006-07-13 18:01:36 -07:00
wacom_input_event ( wcombo , EV_MSC , MSC_SERIAL , 0xf0 ) ;
}
2010-03-04 21:50:59 -08:00
retval = 1 ;
2007-06-14 23:32:48 -04:00
break ;
case WACOM_MO :
2010-03-04 21:50:59 -08:00
prox = ( data [ 7 ] & 0xf8 ) | | data [ 8 ] ;
if ( prox | | wacom - > id [ 1 ] ) {
2008-05-05 11:36:41 -04:00
wacom - > id [ 1 ] = PAD_DEVICE_ID ;
2007-06-14 23:32:48 -04:00
wacom_report_key ( wcombo , BTN_0 , ( data [ 7 ] & 0x08 ) ) ;
wacom_report_key ( wcombo , BTN_1 , ( data [ 7 ] & 0x20 ) ) ;
wacom_report_key ( wcombo , BTN_4 , ( data [ 7 ] & 0x10 ) ) ;
wacom_report_key ( wcombo , BTN_5 , ( data [ 7 ] & 0x40 ) ) ;
wacom_report_abs ( wcombo , ABS_WHEEL , ( data [ 8 ] & 0x7f ) ) ;
wacom_report_key ( wcombo , BTN_TOOL_FINGER , 0xf0 ) ;
2010-03-04 21:50:59 -08:00
if ( ! prox )
wacom - > id [ 1 ] = 0 ;
2008-05-05 11:36:41 -04:00
wacom_report_abs ( wcombo , ABS_MISC , wacom - > id [ 1 ] ) ;
2007-06-14 23:32:48 -04:00
wacom_input_event ( wcombo , EV_MSC , MSC_SERIAL , 0xf0 ) ;
}
2010-03-04 21:50:59 -08:00
retval = 1 ;
2007-06-14 23:32:48 -04:00
break ;
2006-07-13 18:01:36 -07:00
}
2010-03-04 21:50:59 -08:00
exit :
return retval ;
2006-07-13 18:01:36 -07:00
}
static int wacom_intuos_inout ( struct wacom_wac * wacom , void * wcombo )
{
2010-02-17 22:38:31 -08:00
struct wacom_features * features = & wacom - > features ;
2006-07-13 18:01:36 -07:00
unsigned char * data = wacom - > data ;
2009-05-08 18:30:33 -07:00
int idx = 0 ;
2006-07-13 18:01:36 -07:00
/* tool number */
2010-02-17 22:38:31 -08:00
if ( features - > type = = INTUOS )
2009-05-08 18:30:33 -07:00
idx = data [ 1 ] & 0x01 ;
2006-07-13 18:01:36 -07: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 ) ;
switch ( wacom - > id [ idx ] ) {
case 0x812 : /* Inking pen */
case 0x801 : /* Intuos3 Inking pen */
2009-05-08 18:30:33 -07:00
case 0x20802 : /* Intuos4 Classic Pen */
2006-07-13 18:01:36 -07:00
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 */
2009-05-08 18:30:33 -07:00
case 0x802 : /* Intuos4 Grip Pen Eraser */
case 0x804 : /* Intuos4 Marker Pen */
case 0x40802 : /* Intuos4 Classic Pen */
2006-07-13 18:01:36 -07:00
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 */
2009-05-08 18:30:33 -07:00
case 0x806 : /* Intuos4 Mouse */
2006-07-13 18:01:36 -07:00
wacom - > tool [ idx ] = BTN_TOOL_MOUSE ;
break ;
case 0x096 : /* Lens cursor */
case 0x097 : /* Intuos3 Lens cursor */
2009-05-08 18:30:33 -07:00
case 0x006 : /* Intuos4 Lens cursor */
2006-07-13 18:01:36 -07:00
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 */
2009-05-08 18:30:33 -07:00
case 0x80c : /* Intuos4 Marker Pen Eraser */
case 0x80a : /* Intuos4 Grip Pen Eraser */
case 0x4080a : /* Intuos4 Classic Pen Eraser */
case 0x90a : /* Intuos4 Airbrush Eraser */
2006-07-13 18:01:36 -07:00
wacom - > tool [ idx ] = BTN_TOOL_RUBBER ;
break ;
case 0xd12 :
case 0x912 :
case 0x112 :
case 0x913 : /* Intuos3 Airbrush */
2009-05-08 18:30:33 -07:00
case 0x902 : /* Intuos4 Airbrush */
2006-07-13 18:01:36 -07:00
wacom - > tool [ idx ] = BTN_TOOL_AIRBRUSH ;
break ;
default : /* Unknown tool */
wacom - > tool [ idx ] = BTN_TOOL_PEN ;
}
return 1 ;
}
/* Exit report */
if ( ( data [ 1 ] & 0xfe ) = = 0x80 ) {
2009-05-08 18:30:33 -07:00
/*
* Reset all states otherwise we lose the initial states
* when in - prox next time
*/
2007-02-23 12:22:48 -08:00
wacom_report_abs ( wcombo , ABS_X , 0 ) ;
wacom_report_abs ( wcombo , ABS_Y , 0 ) ;
wacom_report_abs ( wcombo , ABS_DISTANCE , 0 ) ;
2009-05-08 18:30:33 -07:00
wacom_report_abs ( wcombo , ABS_TILT_X , 0 ) ;
wacom_report_abs ( wcombo , ABS_TILT_Y , 0 ) ;
2007-02-23 12:22:48 -08:00
if ( wacom - > tool [ idx ] > = BTN_TOOL_MOUSE ) {
wacom_report_key ( wcombo , BTN_LEFT , 0 ) ;
wacom_report_key ( wcombo , BTN_MIDDLE , 0 ) ;
wacom_report_key ( wcombo , BTN_RIGHT , 0 ) ;
wacom_report_key ( wcombo , BTN_SIDE , 0 ) ;
wacom_report_key ( wcombo , BTN_EXTRA , 0 ) ;
wacom_report_abs ( wcombo , ABS_THROTTLE , 0 ) ;
wacom_report_abs ( wcombo , ABS_RZ , 0 ) ;
2007-06-14 23:32:48 -04:00
} else {
2007-02-23 12:22:48 -08:00
wacom_report_abs ( wcombo , ABS_PRESSURE , 0 ) ;
wacom_report_key ( wcombo , BTN_STYLUS , 0 ) ;
wacom_report_key ( wcombo , BTN_STYLUS2 , 0 ) ;
wacom_report_key ( wcombo , BTN_TOUCH , 0 ) ;
wacom_report_abs ( wcombo , ABS_WHEEL , 0 ) ;
2010-02-17 22:38:31 -08:00
if ( features - > type > = INTUOS3S )
2009-06-28 22:50:58 -07:00
wacom_report_abs ( wcombo , ABS_Z , 0 ) ;
2006-09-26 13:34:47 -07:00
}
2007-02-23 12:22:48 -08:00
wacom_report_key ( wcombo , wacom - > tool [ idx ] , 0 ) ;
wacom_report_abs ( wcombo , ABS_MISC , 0 ) ; /* reset tool id */
wacom_input_event ( wcombo , EV_MSC , MSC_SERIAL , wacom - > serial [ idx ] ) ;
2009-05-08 18:30:33 -07:00
wacom - > id [ idx ] = 0 ;
2007-02-23 12:22:48 -08:00
return 2 ;
2006-07-13 18:01:36 -07:00
}
return 0 ;
}
static void wacom_intuos_general ( struct wacom_wac * wacom , void * wcombo )
{
2010-02-17 22:38:31 -08:00
struct wacom_features * features = & wacom - > features ;
2006-07-13 18:01:36 -07:00
unsigned char * data = wacom - > data ;
unsigned int t ;
/* general pen packet */
if ( ( data [ 1 ] & 0xb8 ) = = 0xa0 ) {
t = ( data [ 6 ] < < 2 ) | ( ( data [ 7 ] > > 6 ) & 3 ) ;
2010-02-17 22:38:31 -08:00
if ( features - > type > = INTUOS4S & & features - > type < = INTUOS4L )
2009-05-08 18:30:33 -07:00
t = ( t < < 1 ) | ( data [ 1 ] & 1 ) ;
2006-07-13 18:01:36 -07:00
wacom_report_abs ( wcombo , ABS_PRESSURE , t ) ;
wacom_report_abs ( wcombo , ABS_TILT_X ,
( ( data [ 7 ] < < 1 ) & 0x7e ) | ( data [ 8 ] > > 7 ) ) ;
wacom_report_abs ( wcombo , ABS_TILT_Y , data [ 8 ] & 0x7f ) ;
wacom_report_key ( wcombo , BTN_STYLUS , data [ 1 ] & 2 ) ;
wacom_report_key ( wcombo , BTN_STYLUS2 , data [ 1 ] & 4 ) ;
wacom_report_key ( wcombo , BTN_TOUCH , t > 10 ) ;
}
/* airbrush second packet */
if ( ( data [ 1 ] & 0xbc ) = = 0xb4 ) {
wacom_report_abs ( wcombo , ABS_WHEEL ,
( data [ 6 ] < < 2 ) | ( ( data [ 7 ] > > 6 ) & 3 ) ) ;
wacom_report_abs ( wcombo , ABS_TILT_X ,
( ( data [ 7 ] < < 1 ) & 0x7e ) | ( data [ 8 ] > > 7 ) ) ;
wacom_report_abs ( wcombo , ABS_TILT_Y , data [ 8 ] & 0x7f ) ;
}
return ;
}
static int wacom_intuos_irq ( struct wacom_wac * wacom , void * wcombo )
{
2010-02-17 22:38:31 -08:00
struct wacom_features * features = & wacom - > features ;
2006-07-13 18:01:36 -07:00
unsigned char * data = wacom - > data ;
unsigned int t ;
2009-05-08 18:30:33 -07:00
int idx = 0 , result ;
2006-07-13 18:01:36 -07:00
2009-12-15 00:35:25 -08:00
if ( data [ 0 ] ! = WACOM_REPORT_PENABLED & & data [ 0 ] ! = WACOM_REPORT_INTUOSREAD
& & data [ 0 ] ! = WACOM_REPORT_INTUOSWRITE & & data [ 0 ] ! = WACOM_REPORT_INTUOSPAD ) {
2006-07-13 18:01:36 -07:00
dbg ( " wacom_intuos_irq: received unknown report #%d " , data [ 0 ] ) ;
return 0 ;
}
/* tool number */
2010-02-17 22:38:31 -08:00
if ( features - > type = = INTUOS )
2009-05-08 18:30:33 -07:00
idx = data [ 1 ] & 0x01 ;
2006-07-13 18:01:36 -07:00
/* pad packets. Works as a second tool and is always in prox */
2009-12-15 00:35:25 -08:00
if ( data [ 0 ] = = WACOM_REPORT_INTUOSPAD ) {
2006-07-13 18:01:36 -07:00
/* initiate the pad as a device */
if ( wacom - > tool [ 1 ] ! = BTN_TOOL_FINGER )
wacom - > tool [ 1 ] = BTN_TOOL_FINGER ;
2010-02-17 22:38:31 -08:00
if ( features - > type > = INTUOS4S & & features - > type < = INTUOS4L ) {
2009-05-08 18:30:33 -07:00
wacom_report_key ( wcombo , BTN_0 , ( data [ 2 ] & 0x01 ) ) ;
wacom_report_key ( wcombo , BTN_1 , ( data [ 3 ] & 0x01 ) ) ;
wacom_report_key ( wcombo , BTN_2 , ( data [ 3 ] & 0x02 ) ) ;
wacom_report_key ( wcombo , BTN_3 , ( data [ 3 ] & 0x04 ) ) ;
wacom_report_key ( wcombo , BTN_4 , ( data [ 3 ] & 0x08 ) ) ;
wacom_report_key ( wcombo , BTN_5 , ( data [ 3 ] & 0x10 ) ) ;
wacom_report_key ( wcombo , BTN_6 , ( data [ 3 ] & 0x20 ) ) ;
if ( data [ 1 ] & 0x80 ) {
wacom_report_abs ( wcombo , ABS_WHEEL , ( data [ 1 ] & 0x7f ) ) ;
2009-06-02 16:59:58 -07:00
} else {
/* Out of proximity, clear wheel value. */
wacom_report_abs ( wcombo , ABS_WHEEL , 0 ) ;
2009-05-08 18:30:33 -07:00
}
2010-02-17 22:38:31 -08:00
if ( features - > type ! = INTUOS4S ) {
2009-05-08 18:30:33 -07:00
wacom_report_key ( wcombo , BTN_7 , ( data [ 3 ] & 0x40 ) ) ;
wacom_report_key ( wcombo , BTN_8 , ( data [ 3 ] & 0x80 ) ) ;
}
if ( data [ 1 ] | ( data [ 2 ] & 0x01 ) | data [ 3 ] ) {
wacom_report_key ( wcombo , wacom - > tool [ 1 ] , 1 ) ;
wacom_report_abs ( wcombo , ABS_MISC , PAD_DEVICE_ID ) ;
} else {
wacom_report_key ( wcombo , wacom - > tool [ 1 ] , 0 ) ;
wacom_report_abs ( wcombo , ABS_MISC , 0 ) ;
}
} else {
wacom_report_key ( wcombo , BTN_0 , ( data [ 5 ] & 0x01 ) ) ;
wacom_report_key ( wcombo , BTN_1 , ( data [ 5 ] & 0x02 ) ) ;
wacom_report_key ( wcombo , BTN_2 , ( data [ 5 ] & 0x04 ) ) ;
wacom_report_key ( wcombo , BTN_3 , ( data [ 5 ] & 0x08 ) ) ;
wacom_report_key ( wcombo , BTN_4 , ( data [ 6 ] & 0x01 ) ) ;
wacom_report_key ( wcombo , BTN_5 , ( data [ 6 ] & 0x02 ) ) ;
wacom_report_key ( wcombo , BTN_6 , ( data [ 6 ] & 0x04 ) ) ;
wacom_report_key ( wcombo , BTN_7 , ( data [ 6 ] & 0x08 ) ) ;
wacom_report_key ( wcombo , BTN_8 , ( data [ 5 ] & 0x10 ) ) ;
wacom_report_key ( wcombo , BTN_9 , ( data [ 6 ] & 0x10 ) ) ;
wacom_report_abs ( wcombo , ABS_RX , ( ( data [ 1 ] & 0x1f ) < < 8 ) | data [ 2 ] ) ;
wacom_report_abs ( wcombo , ABS_RY , ( ( data [ 3 ] & 0x1f ) < < 8 ) | data [ 4 ] ) ;
if ( ( data [ 5 ] & 0x1f ) | ( data [ 6 ] & 0x1f ) | ( data [ 1 ] & 0x1f ) |
data [ 2 ] | ( data [ 3 ] & 0x1f ) | data [ 4 ] ) {
wacom_report_key ( wcombo , wacom - > tool [ 1 ] , 1 ) ;
wacom_report_abs ( wcombo , ABS_MISC , PAD_DEVICE_ID ) ;
} else {
wacom_report_key ( wcombo , wacom - > tool [ 1 ] , 0 ) ;
wacom_report_abs ( wcombo , ABS_MISC , 0 ) ;
}
}
2006-07-13 18:01:36 -07:00
wacom_input_event ( wcombo , EV_MSC , MSC_SERIAL , 0xffffffff ) ;
return 1 ;
}
/* process in/out prox events */
result = wacom_intuos_inout ( wacom , wcombo ) ;
if ( result )
return result - 1 ;
2009-05-08 18:30:33 -07: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-17 22:38:31 -08:00
if ( wacom - > tool [ idx ] = = BTN_TOOL_LENS & &
( features - > type = = INTUOS3 | |
features - > type = = INTUOS3S | |
features - > type = = INTUOS4 | |
features - > type = = INTUOS4S ) ) {
2007-02-23 12:22:48 -08:00
return 0 ;
2010-02-17 22:38:31 -08:00
}
2007-02-23 12:22:48 -08:00
2006-07-13 18:01:36 -07:00
/* Cintiq doesn't send data when RDY bit isn't set */
2010-02-17 22:38:31 -08:00
if ( features - > type = = CINTIQ & & ! ( data [ 1 ] & 0x40 ) )
2006-07-13 18:01:36 -07:00
return 0 ;
2010-02-17 22:38:31 -08:00
if ( features - > type > = INTUOS3S ) {
2006-07-13 18:01:36 -07:00
wacom_report_abs ( wcombo , ABS_X , ( data [ 2 ] < < 9 ) | ( data [ 3 ] < < 1 ) | ( ( data [ 9 ] > > 1 ) & 1 ) ) ;
wacom_report_abs ( wcombo , ABS_Y , ( data [ 4 ] < < 9 ) | ( data [ 5 ] < < 1 ) | ( data [ 9 ] & 1 ) ) ;
wacom_report_abs ( wcombo , ABS_DISTANCE , ( ( data [ 9 ] > > 2 ) & 0x3f ) ) ;
} else {
wacom_report_abs ( wcombo , ABS_X , wacom_be16_to_cpu ( & data [ 2 ] ) ) ;
wacom_report_abs ( wcombo , ABS_Y , wacom_be16_to_cpu ( & data [ 4 ] ) ) ;
wacom_report_abs ( wcombo , ABS_DISTANCE , ( ( data [ 9 ] > > 3 ) & 0x1f ) ) ;
}
/* process general packets */
wacom_intuos_general ( wacom , wcombo ) ;
2009-05-08 18:30:33 -07: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-13 18:01:36 -07:00
if ( data [ 1 ] & 0x02 ) {
/* Rotation packet */
2010-02-17 22:38:31 -08:00
if ( features - > type > = INTUOS3S ) {
2008-03-13 16:46:46 -04:00
/* I3 marker pen rotation */
2006-07-13 18:01:36 -07: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 ) ;
2008-03-13 16:46:46 -04:00
wacom_report_abs ( wcombo , ABS_Z , t ) ;
2006-07-13 18:01:36 -07:00
} else {
/* 4D mouse rotation packet */
t = ( data [ 6 ] < < 3 ) | ( ( data [ 7 ] > > 5 ) & 7 ) ;
wacom_report_abs ( wcombo , ABS_RZ , ( data [ 7 ] & 0x20 ) ?
( ( t - 1 ) / 2 ) : - t / 2 ) ;
}
2010-02-17 22:38:31 -08:00
} else if ( ! ( data [ 1 ] & 0x10 ) & & features - > type < INTUOS3S ) {
2006-07-13 18:01:36 -07:00
/* 4D mouse packet */
wacom_report_key ( wcombo , BTN_LEFT , data [ 8 ] & 0x01 ) ;
wacom_report_key ( wcombo , BTN_MIDDLE , data [ 8 ] & 0x02 ) ;
wacom_report_key ( wcombo , BTN_RIGHT , data [ 8 ] & 0x04 ) ;
wacom_report_key ( wcombo , BTN_SIDE , data [ 8 ] & 0x20 ) ;
wacom_report_key ( wcombo , BTN_EXTRA , data [ 8 ] & 0x10 ) ;
t = ( data [ 6 ] < < 2 ) | ( ( data [ 7 ] > > 6 ) & 3 ) ;
wacom_report_abs ( wcombo , ABS_THROTTLE , ( data [ 8 ] & 0x08 ) ? - t : t ) ;
} else if ( wacom - > tool [ idx ] = = BTN_TOOL_MOUSE ) {
2009-05-08 18:30:33 -07:00
/* I4 mouse */
2010-02-17 22:38:31 -08:00
if ( features - > type > = INTUOS4S & & features - > type < = INTUOS4L ) {
2009-05-08 18:30:33 -07:00
wacom_report_key ( wcombo , BTN_LEFT , data [ 6 ] & 0x01 ) ;
wacom_report_key ( wcombo , BTN_MIDDLE , data [ 6 ] & 0x02 ) ;
wacom_report_key ( wcombo , BTN_RIGHT , data [ 6 ] & 0x04 ) ;
wacom_report_rel ( wcombo , REL_WHEEL , ( ( data [ 7 ] & 0x80 ) > > 7 )
- ( ( data [ 7 ] & 0x40 ) > > 6 ) ) ;
wacom_report_key ( wcombo , BTN_SIDE , data [ 6 ] & 0x08 ) ;
wacom_report_key ( wcombo , BTN_EXTRA , data [ 6 ] & 0x10 ) ;
wacom_report_abs ( wcombo , ABS_TILT_X ,
( ( data [ 7 ] < < 1 ) & 0x7e ) | ( data [ 8 ] > > 7 ) ) ;
wacom_report_abs ( wcombo , ABS_TILT_Y , data [ 8 ] & 0x7f ) ;
} else {
/* 2D mouse packet */
wacom_report_key ( wcombo , BTN_LEFT , data [ 8 ] & 0x04 ) ;
wacom_report_key ( wcombo , BTN_MIDDLE , data [ 8 ] & 0x08 ) ;
wacom_report_key ( wcombo , BTN_RIGHT , data [ 8 ] & 0x10 ) ;
wacom_report_rel ( wcombo , REL_WHEEL , ( data [ 8 ] & 0x01 )
2006-07-13 18:01:36 -07:00
- ( ( data [ 8 ] & 0x02 ) > > 1 ) ) ;
2009-05-08 18:30:33 -07:00
/* I3 2D mouse side buttons */
2010-02-17 22:38:31 -08:00
if ( features - > type > = INTUOS3S & & features - > type < = INTUOS3L ) {
2009-05-08 18:30:33 -07:00
wacom_report_key ( wcombo , BTN_SIDE , data [ 8 ] & 0x40 ) ;
wacom_report_key ( wcombo , BTN_EXTRA , data [ 8 ] & 0x20 ) ;
}
2006-07-13 18:01:36 -07:00
}
2010-02-17 22:38:31 -08:00
} else if ( ( features - > type < INTUOS3S | | features - > type = = INTUOS3L | |
features - > type = = INTUOS4L ) & &
2009-05-08 18:30:33 -07:00
wacom - > tool [ idx ] = = BTN_TOOL_LENS ) {
2006-07-13 18:01:36 -07:00
/* Lens cursor packets */
wacom_report_key ( wcombo , BTN_LEFT , data [ 8 ] & 0x01 ) ;
wacom_report_key ( wcombo , BTN_MIDDLE , data [ 8 ] & 0x02 ) ;
wacom_report_key ( wcombo , BTN_RIGHT , data [ 8 ] & 0x04 ) ;
wacom_report_key ( wcombo , BTN_SIDE , data [ 8 ] & 0x10 ) ;
wacom_report_key ( wcombo , BTN_EXTRA , data [ 8 ] & 0x08 ) ;
}
}
wacom_report_abs ( wcombo , ABS_MISC , wacom - > id [ idx ] ) ; /* report tool id */
wacom_report_key ( wcombo , wacom - > tool [ idx ] , 1 ) ;
wacom_input_event ( wcombo , EV_MSC , MSC_SERIAL , wacom - > serial [ idx ] ) ;
return 1 ;
}
2009-12-15 00:35:24 -08:00
static void wacom_tpc_finger_in ( struct wacom_wac * wacom , void * wcombo , char * data , int idx )
{
wacom_report_abs ( wcombo , ABS_X ,
2010-03-04 21:50:59 -08:00
data [ 2 + idx * 2 ] | ( ( data [ 3 + idx * 2 ] & 0x7f ) < < 8 ) ) ;
2009-12-15 00:35:24 -08:00
wacom_report_abs ( wcombo , ABS_Y ,
2010-03-04 21:50:59 -08:00
data [ 6 + idx * 2 ] | ( ( data [ 7 + idx * 2 ] & 0x7f ) < < 8 ) ) ;
2009-12-15 00:35:24 -08:00
wacom_report_abs ( wcombo , ABS_MISC , wacom - > id [ 0 ] ) ;
wacom_report_key ( wcombo , wacom - > tool [ idx ] , 1 ) ;
if ( idx )
wacom_input_event ( wcombo , EV_MSC , MSC_SERIAL , 0xf0 ) ;
else
wacom_report_key ( wcombo , BTN_TOUCH , 1 ) ;
}
static void wacom_tpc_touch_out ( struct wacom_wac * wacom , void * wcombo , int idx )
{
wacom_report_abs ( wcombo , ABS_X , 0 ) ;
wacom_report_abs ( wcombo , ABS_Y , 0 ) ;
wacom_report_abs ( wcombo , ABS_MISC , 0 ) ;
wacom_report_key ( wcombo , wacom - > tool [ idx ] , 0 ) ;
if ( idx )
wacom_input_event ( wcombo , EV_MSC , MSC_SERIAL , 0xf0 ) ;
else
wacom_report_key ( wcombo , BTN_TOUCH , 0 ) ;
return ;
}
static void wacom_tpc_touch_in ( struct wacom_wac * wacom , void * wcombo )
{
char * data = wacom - > data ;
struct urb * urb = ( ( struct wacom_combo * ) wcombo ) - > urb ;
static int firstFinger = 0 ;
static int secondFinger = 0 ;
wacom - > tool [ 0 ] = BTN_TOOL_DOUBLETAP ;
wacom - > id [ 0 ] = TOUCH_DEVICE_ID ;
wacom - > tool [ 1 ] = BTN_TOOL_TRIPLETAP ;
if ( urb - > actual_length ! = WACOM_PKGLEN_TPC1FG ) {
switch ( data [ 0 ] ) {
2009-12-15 00:35:25 -08:00
case WACOM_REPORT_TPC1FG :
2009-12-15 00:35:24 -08:00
wacom_report_abs ( wcombo , ABS_X , wacom_le16_to_cpu ( & data [ 2 ] ) ) ;
wacom_report_abs ( wcombo , ABS_Y , wacom_le16_to_cpu ( & data [ 4 ] ) ) ;
wacom_report_abs ( wcombo , ABS_PRESSURE , wacom_le16_to_cpu ( & data [ 6 ] ) ) ;
wacom_report_key ( wcombo , BTN_TOUCH , wacom_le16_to_cpu ( & data [ 6 ] ) ) ;
wacom_report_abs ( wcombo , ABS_MISC , wacom - > id [ 0 ] ) ;
wacom_report_key ( wcombo , wacom - > tool [ 0 ] , 1 ) ;
break ;
2009-12-15 00:35:25 -08:00
case WACOM_REPORT_TPC2FG :
2009-12-15 00:35:24 -08:00
/* keep this byte to send proper out-prox event */
wacom - > id [ 1 ] = data [ 1 ] & 0x03 ;
if ( data [ 1 ] & 0x01 ) {
wacom_tpc_finger_in ( wacom , wcombo , data , 0 ) ;
firstFinger = 1 ;
} else if ( firstFinger ) {
wacom_tpc_touch_out ( wacom , wcombo , 0 ) ;
}
if ( data [ 1 ] & 0x02 ) {
/* sync first finger data */
if ( firstFinger )
wacom_input_sync ( wcombo ) ;
wacom_tpc_finger_in ( wacom , wcombo , data , 1 ) ;
secondFinger = 1 ;
} else if ( secondFinger ) {
/* sync first finger data */
if ( firstFinger )
wacom_input_sync ( wcombo ) ;
wacom_tpc_touch_out ( wacom , wcombo , 1 ) ;
secondFinger = 0 ;
}
if ( ! ( data [ 1 ] & 0x01 ) )
firstFinger = 0 ;
break ;
}
} else {
wacom_report_abs ( wcombo , ABS_X , wacom_le16_to_cpu ( & data [ 1 ] ) ) ;
wacom_report_abs ( wcombo , ABS_Y , wacom_le16_to_cpu ( & data [ 3 ] ) ) ;
wacom_report_key ( wcombo , BTN_TOUCH , 1 ) ;
wacom_report_abs ( wcombo , ABS_MISC , wacom - > id [ 0 ] ) ;
wacom_report_key ( wcombo , wacom - > tool [ 0 ] , 1 ) ;
}
return ;
}
2008-12-20 05:19:43 -05:00
static int wacom_tpc_irq ( struct wacom_wac * wacom , void * wcombo )
2008-11-24 11:44:27 -05:00
{
2010-02-17 22:38:31 -08:00
struct wacom_features * features = & wacom - > features ;
2008-11-24 11:44:27 -05:00
char * data = wacom - > data ;
2009-12-15 00:35:24 -08:00
int prox = 0 , pressure , idx = - 1 ;
2008-11-24 11:44:27 -05:00
struct urb * urb = ( ( struct wacom_combo * ) wcombo ) - > urb ;
dbg ( " wacom_tpc_irq: received report #%d " , data [ 0 ] ) ;
2009-12-15 00:35:25 -08:00
if ( urb - > actual_length = = WACOM_PKGLEN_TPC1FG | | /* single touch */
data [ 0 ] = = WACOM_REPORT_TPC1FG | | /* single touch */
data [ 0 ] = = WACOM_REPORT_TPC2FG ) { /* 2FG touch */
2009-12-15 00:35:24 -08:00
if ( urb - > actual_length = = WACOM_PKGLEN_TPC1FG ) { /* with touch */
2009-12-15 00:35:24 -08:00
prox = data [ 0 ] & 0x01 ;
2008-11-24 11:44:27 -05:00
} else { /* with capacity */
2009-12-15 00:35:25 -08:00
if ( data [ 0 ] = = WACOM_REPORT_TPC1FG )
2009-12-15 00:35:24 -08:00
/* single touch */
prox = data [ 1 ] & 0x01 ;
else
/* 2FG touch data */
prox = data [ 1 ] & 0x03 ;
2008-11-24 11:44:27 -05:00
}
2010-03-19 22:18:15 -07:00
if ( ! wacom - > shared - > stylus_in_proximity ) {
2008-11-24 11:44:27 -05:00
if ( prox ) {
2010-03-19 22:18:15 -07:00
wacom_tpc_touch_in ( wacom , wcombo ) ;
2008-11-24 11:44:27 -05:00
} else {
2009-12-15 00:35:25 -08:00
if ( data [ 0 ] = = WACOM_REPORT_TPC2FG ) {
2010-03-19 22:18:15 -07:00
/* 2FGT out-prox */
2009-12-15 00:35:24 -08:00
idx = ( wacom - > id [ 1 ] & 0x01 ) - 1 ;
if ( idx = = 0 ) {
wacom_tpc_touch_out ( wacom , wcombo , idx ) ;
/* sync first finger event */
if ( wacom - > id [ 1 ] & 0x02 )
wacom_input_sync ( wcombo ) ;
}
idx = ( wacom - > id [ 1 ] & 0x02 ) - 1 ;
if ( idx = = 1 )
wacom_tpc_touch_out ( wacom , wcombo , idx ) ;
2010-03-19 22:18:15 -07:00
} else {
/* one finger touch */
2009-12-15 00:35:24 -08:00
wacom_tpc_touch_out ( wacom , wcombo , 0 ) ;
2010-03-19 22:18:15 -07:00
}
wacom - > id [ 0 ] = 0 ;
2008-11-24 11:44:27 -05:00
}
2010-03-19 22:18:15 -07:00
} else if ( wacom - > id [ 0 ] ) { /* force touch out-prox */
2009-12-15 00:35:24 -08:00
wacom_tpc_touch_out ( wacom , wcombo , 0 ) ;
2008-11-24 11:44:27 -05:00
}
2010-03-19 22:18:15 -07:00
return 1 ;
2009-12-15 00:35:25 -08:00
} else if ( data [ 0 ] = = WACOM_REPORT_PENABLED ) { /* Penabled */
2008-11-24 11:44:27 -05:00
prox = data [ 1 ] & 0x20 ;
2010-03-04 21:50:59 -08:00
if ( ! wacom - > id [ 0 ] ) { /* first in prox */
/* 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-19 22:18:15 -07:00
wacom - > shared - > stylus_in_proximity = true ;
2010-03-04 21:50:59 -08:00
}
wacom_report_key ( wcombo , BTN_STYLUS , data [ 1 ] & 0x02 ) ;
wacom_report_key ( wcombo , BTN_STYLUS2 , data [ 1 ] & 0x10 ) ;
wacom_report_abs ( wcombo , ABS_X , wacom_le16_to_cpu ( & data [ 2 ] ) ) ;
wacom_report_abs ( wcombo , ABS_Y , wacom_le16_to_cpu ( & data [ 4 ] ) ) ;
pressure = ( ( data [ 7 ] & 0x01 ) < < 8 ) | data [ 6 ] ;
if ( pressure < 0 )
pressure = features - > pressure_max + pressure + 1 ;
wacom_report_abs ( wcombo , ABS_PRESSURE , pressure ) ;
wacom_report_key ( wcombo , BTN_TOUCH , data [ 1 ] & 0x05 ) ;
if ( ! prox ) { /* out-prox */
2009-12-15 00:35:24 -08:00
wacom - > id [ 0 ] = 0 ;
2010-03-19 22:18:15 -07:00
wacom - > shared - > stylus_in_proximity = false ;
2008-11-24 11:44:27 -05:00
}
2009-12-15 00:35:24 -08:00
wacom_report_key ( wcombo , wacom - > tool [ 0 ] , prox ) ;
2008-11-24 11:44:27 -05:00
wacom_report_abs ( wcombo , ABS_MISC , wacom - > id [ 0 ] ) ;
return 1 ;
}
return 0 ;
}
2006-07-13 18:01:36 -07:00
int wacom_wac_irq ( struct wacom_wac * wacom_wac , void * wcombo )
{
2010-02-17 22:38:31 -08:00
switch ( wacom_wac - > features . type ) {
2006-07-13 18:01:36 -07:00
case PENPARTNER :
2008-11-24 11:44:27 -05:00
return wacom_penpartner_irq ( wacom_wac , wcombo ) ;
2006-07-13 18:01:36 -07:00
case PL :
2008-11-24 11:44:27 -05:00
return wacom_pl_irq ( wacom_wac , wcombo ) ;
2006-07-13 18:01:36 -07:00
case WACOM_G4 :
case GRAPHIRE :
2007-06-14 23:32:48 -04:00
case WACOM_MO :
2008-11-24 11:44:27 -05:00
return wacom_graphire_irq ( wacom_wac , wcombo ) ;
2006-07-13 18:01:36 -07:00
case PTU :
2008-11-24 11:44:27 -05:00
return wacom_ptu_irq ( wacom_wac , wcombo ) ;
2006-07-13 18:01:36 -07:00
case INTUOS :
2006-09-26 13:34:47 -07:00
case INTUOS3S :
2006-07-13 18:01:36 -07:00
case INTUOS3 :
case INTUOS3L :
2009-05-08 18:30:33 -07:00
case INTUOS4S :
case INTUOS4 :
case INTUOS4L :
2006-07-13 18:01:36 -07:00
case CINTIQ :
2008-03-13 16:46:46 -04:00
case WACOM_BEE :
2008-11-24 11:44:27 -05:00
return wacom_intuos_irq ( wacom_wac , wcombo ) ;
case TABLETPC :
2009-12-15 00:35:24 -08:00
case TABLETPC2FG :
2008-11-24 11:44:27 -05:00
return wacom_tpc_irq ( wacom_wac , wcombo ) ;
2006-07-13 18:01:36 -07:00
default :
return 0 ;
}
return 0 ;
}
void wacom_init_input_dev ( struct input_dev * input_dev , struct wacom_wac * wacom_wac )
{
2010-02-17 22:38:31 -08:00
switch ( wacom_wac - > features . type ) {
2007-06-14 23:32:48 -04:00
case WACOM_MO :
input_dev_mo ( input_dev , wacom_wac ) ;
2006-07-13 18:01:36 -07:00
case WACOM_G4 :
input_dev_g4 ( input_dev , wacom_wac ) ;
/* fall through */
case GRAPHIRE :
input_dev_g ( input_dev , wacom_wac ) ;
break ;
2008-03-13 16:46:46 -04:00
case WACOM_BEE :
input_dev_bee ( input_dev , wacom_wac ) ;
2006-07-13 18:01:36 -07:00
case INTUOS3 :
case INTUOS3L :
case CINTIQ :
input_dev_i3 ( input_dev , wacom_wac ) ;
/* fall through */
2006-09-26 13:34:47 -07:00
case INTUOS3S :
input_dev_i3s ( input_dev , wacom_wac ) ;
2008-11-24 11:44:27 -05:00
/* fall through */
2006-07-13 18:01:36 -07:00
case INTUOS :
input_dev_i ( input_dev , wacom_wac ) ;
break ;
2009-05-08 18:30:33 -07:00
case INTUOS4 :
case INTUOS4L :
input_dev_i4 ( input_dev , wacom_wac ) ;
/* fall through */
case INTUOS4S :
input_dev_i4s ( input_dev , wacom_wac ) ;
input_dev_i ( input_dev , wacom_wac ) ;
break ;
2009-12-15 00:35:24 -08:00
case TABLETPC2FG :
input_dev_tpc2fg ( input_dev , wacom_wac ) ;
/* fall through */
case TABLETPC :
input_dev_tpc ( input_dev , wacom_wac ) ;
2010-02-17 22:38:31 -08:00
if ( wacom_wac - > features . device_type ! = BTN_TOOL_PEN )
2009-12-15 00:35:24 -08:00
break ; /* no need to process stylus stuff */
/* fall through */
2006-07-13 18:01:36 -07:00
case PL :
case PTU :
input_dev_pl ( input_dev , wacom_wac ) ;
2008-11-24 11:44:27 -05:00
/* fall through */
2006-07-13 18:01:36 -07:00
case PENPARTNER :
input_dev_pt ( input_dev , wacom_wac ) ;
break ;
}
return ;
}
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x00 =
2010-02-10 23:06:23 -08:00
{ " Wacom Penpartner " , WACOM_PKGLEN_PENPRTN , 5040 , 3780 , 255 , 0 , PENPARTNER } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x10 =
2010-02-10 23:06:23 -08:00
{ " Wacom Graphire " , WACOM_PKGLEN_GRAPHIRE , 10206 , 7422 , 511 , 63 , GRAPHIRE } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x11 =
2010-02-10 23:06:23 -08:00
{ " Wacom Graphire2 4x5 " , WACOM_PKGLEN_GRAPHIRE , 10206 , 7422 , 511 , 63 , GRAPHIRE } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x12 =
2010-02-10 23:06:23 -08:00
{ " Wacom Graphire2 5x7 " , WACOM_PKGLEN_GRAPHIRE , 13918 , 10206 , 511 , 63 , GRAPHIRE } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x13 =
2010-02-10 23:06:23 -08:00
{ " Wacom Graphire3 " , WACOM_PKGLEN_GRAPHIRE , 10208 , 7424 , 511 , 63 , GRAPHIRE } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x14 =
2010-02-10 23:06:23 -08:00
{ " Wacom Graphire3 6x8 " , WACOM_PKGLEN_GRAPHIRE , 16704 , 12064 , 511 , 63 , GRAPHIRE } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x15 =
2010-02-10 23:06:23 -08:00
{ " Wacom Graphire4 4x5 " , WACOM_PKGLEN_GRAPHIRE , 10208 , 7424 , 511 , 63 , WACOM_G4 } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x16 =
2010-02-10 23:06:23 -08:00
{ " Wacom Graphire4 6x8 " , WACOM_PKGLEN_GRAPHIRE , 16704 , 12064 , 511 , 63 , WACOM_G4 } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x17 =
2010-02-10 23:06:23 -08:00
{ " Wacom BambooFun 4x5 " , WACOM_PKGLEN_BBFUN , 14760 , 9225 , 511 , 63 , WACOM_MO } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x18 =
2010-02-10 23:06:23 -08:00
{ " Wacom BambooFun 6x8 " , WACOM_PKGLEN_BBFUN , 21648 , 13530 , 511 , 63 , WACOM_MO } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x19 =
2010-02-10 23:06:23 -08:00
{ " Wacom Bamboo1 Medium " , WACOM_PKGLEN_GRAPHIRE , 16704 , 12064 , 511 , 63 , GRAPHIRE } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x60 =
2010-02-10 23:06:23 -08:00
{ " Wacom Volito " , WACOM_PKGLEN_GRAPHIRE , 5104 , 3712 , 511 , 63 , GRAPHIRE } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x61 =
2010-02-10 23:06:23 -08:00
{ " Wacom PenStation2 " , WACOM_PKGLEN_GRAPHIRE , 3250 , 2320 , 255 , 63 , GRAPHIRE } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x62 =
2010-02-10 23:06:23 -08:00
{ " Wacom Volito2 4x5 " , WACOM_PKGLEN_GRAPHIRE , 5104 , 3712 , 511 , 63 , GRAPHIRE } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x63 =
2010-02-10 23:06:23 -08:00
{ " Wacom Volito2 2x3 " , WACOM_PKGLEN_GRAPHIRE , 3248 , 2320 , 511 , 63 , GRAPHIRE } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x64 =
2010-02-10 23:06:23 -08:00
{ " Wacom PenPartner2 " , WACOM_PKGLEN_GRAPHIRE , 3250 , 2320 , 511 , 63 , GRAPHIRE } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x65 =
2010-02-10 23:06:23 -08:00
{ " Wacom Bamboo " , WACOM_PKGLEN_BBFUN , 14760 , 9225 , 511 , 63 , WACOM_MO } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x69 =
2010-02-10 23:06:23 -08:00
{ " Wacom Bamboo1 " , WACOM_PKGLEN_GRAPHIRE , 5104 , 3712 , 511 , 63 , GRAPHIRE } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x20 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos 4x5 " , WACOM_PKGLEN_INTUOS , 12700 , 10600 , 1023 , 31 , INTUOS } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x21 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos 6x8 " , WACOM_PKGLEN_INTUOS , 20320 , 16240 , 1023 , 31 , INTUOS } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x22 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos 9x12 " , WACOM_PKGLEN_INTUOS , 30480 , 24060 , 1023 , 31 , INTUOS } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x23 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos 12x12 " , WACOM_PKGLEN_INTUOS , 30480 , 31680 , 1023 , 31 , INTUOS } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x24 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos 12x18 " , WACOM_PKGLEN_INTUOS , 45720 , 31680 , 1023 , 31 , INTUOS } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x30 =
2010-02-10 23:06:23 -08:00
{ " Wacom PL400 " , WACOM_PKGLEN_GRAPHIRE , 5408 , 4056 , 255 , 0 , PL } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x31 =
2010-02-10 23:06:23 -08:00
{ " Wacom PL500 " , WACOM_PKGLEN_GRAPHIRE , 6144 , 4608 , 255 , 0 , PL } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x32 =
2010-02-10 23:06:23 -08:00
{ " Wacom PL600 " , WACOM_PKGLEN_GRAPHIRE , 6126 , 4604 , 255 , 0 , PL } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x33 =
2010-02-10 23:06:23 -08:00
{ " Wacom PL600SX " , WACOM_PKGLEN_GRAPHIRE , 6260 , 5016 , 255 , 0 , PL } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x34 =
2010-02-10 23:06:23 -08:00
{ " Wacom PL550 " , WACOM_PKGLEN_GRAPHIRE , 6144 , 4608 , 511 , 0 , PL } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x35 =
2010-02-10 23:06:23 -08:00
{ " Wacom PL800 " , WACOM_PKGLEN_GRAPHIRE , 7220 , 5780 , 511 , 0 , PL } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x37 =
2010-02-10 23:06:23 -08:00
{ " Wacom PL700 " , WACOM_PKGLEN_GRAPHIRE , 6758 , 5406 , 511 , 0 , PL } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x38 =
2010-02-10 23:06:23 -08:00
{ " Wacom PL510 " , WACOM_PKGLEN_GRAPHIRE , 6282 , 4762 , 511 , 0 , PL } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x39 =
2010-02-10 23:06:23 -08:00
{ " Wacom DTU710 " , WACOM_PKGLEN_GRAPHIRE , 34080 , 27660 , 511 , 0 , PL } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xC4 =
2010-02-10 23:06:23 -08:00
{ " Wacom DTF521 " , WACOM_PKGLEN_GRAPHIRE , 6282 , 4762 , 511 , 0 , PL } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xC0 =
2010-02-10 23:06:23 -08:00
{ " Wacom DTF720 " , WACOM_PKGLEN_GRAPHIRE , 6858 , 5506 , 511 , 0 , PL } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xC2 =
2010-02-10 23:06:23 -08:00
{ " Wacom DTF720a " , WACOM_PKGLEN_GRAPHIRE , 6858 , 5506 , 511 , 0 , PL } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x03 =
2010-02-10 23:06:23 -08:00
{ " Wacom Cintiq Partner " , WACOM_PKGLEN_GRAPHIRE , 20480 , 15360 , 511 , 0 , PTU } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x41 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos2 4x5 " , WACOM_PKGLEN_INTUOS , 12700 , 10600 , 1023 , 31 , INTUOS } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x42 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos2 6x8 " , WACOM_PKGLEN_INTUOS , 20320 , 16240 , 1023 , 31 , INTUOS } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x43 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos2 9x12 " , WACOM_PKGLEN_INTUOS , 30480 , 24060 , 1023 , 31 , INTUOS } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x44 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos2 12x12 " , WACOM_PKGLEN_INTUOS , 30480 , 31680 , 1023 , 31 , INTUOS } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x45 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos2 12x18 " , WACOM_PKGLEN_INTUOS , 45720 , 31680 , 1023 , 31 , INTUOS } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xB0 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos3 4x5 " , WACOM_PKGLEN_INTUOS , 25400 , 20320 , 1023 , 63 , INTUOS3S } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xB1 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos3 6x8 " , WACOM_PKGLEN_INTUOS , 40640 , 30480 , 1023 , 63 , INTUOS3 } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xB2 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos3 9x12 " , WACOM_PKGLEN_INTUOS , 60960 , 45720 , 1023 , 63 , INTUOS3 } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xB3 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos3 12x12 " , WACOM_PKGLEN_INTUOS , 60960 , 60960 , 1023 , 63 , INTUOS3L } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xB4 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos3 12x19 " , WACOM_PKGLEN_INTUOS , 97536 , 60960 , 1023 , 63 , INTUOS3L } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xB5 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos3 6x11 " , WACOM_PKGLEN_INTUOS , 54204 , 31750 , 1023 , 63 , INTUOS3 } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xB7 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos3 4x6 " , WACOM_PKGLEN_INTUOS , 31496 , 19685 , 1023 , 63 , INTUOS3S } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xB8 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos4 4x6 " , WACOM_PKGLEN_INTUOS , 31496 , 19685 , 2047 , 63 , INTUOS4S } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xB9 =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos4 6x9 " , WACOM_PKGLEN_INTUOS , 44704 , 27940 , 2047 , 63 , INTUOS4 } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xBA =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos4 8x13 " , WACOM_PKGLEN_INTUOS , 65024 , 40640 , 2047 , 63 , INTUOS4L } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xBB =
2010-02-10 23:06:23 -08:00
{ " Wacom Intuos4 12x19 " , WACOM_PKGLEN_INTUOS , 97536 , 60960 , 2047 , 63 , INTUOS4L } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x3F =
2010-02-10 23:06:23 -08:00
{ " Wacom Cintiq 21UX " , WACOM_PKGLEN_INTUOS , 87200 , 65600 , 1023 , 63 , CINTIQ } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xC5 =
2010-02-10 23:06:23 -08:00
{ " Wacom Cintiq 20WSX " , WACOM_PKGLEN_INTUOS , 86680 , 54180 , 1023 , 63 , WACOM_BEE } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xC6 =
2010-02-10 23:06:23 -08:00
{ " Wacom Cintiq 12WX " , WACOM_PKGLEN_INTUOS , 53020 , 33440 , 1023 , 63 , WACOM_BEE } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xC7 =
2010-02-10 23:06:23 -08:00
{ " Wacom DTU1931 " , WACOM_PKGLEN_GRAPHIRE , 37832 , 30305 , 511 , 0 , PL } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x90 =
2010-02-10 23:06:23 -08:00
{ " Wacom ISDv4 90 " , WACOM_PKGLEN_GRAPHIRE , 26202 , 16325 , 255 , 0 , TABLETPC } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x93 =
2010-02-10 23:06:23 -08:00
{ " Wacom ISDv4 93 " , WACOM_PKGLEN_GRAPHIRE , 26202 , 16325 , 255 , 0 , TABLETPC } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x9A =
2010-02-10 23:06:23 -08:00
{ " Wacom ISDv4 9A " , WACOM_PKGLEN_GRAPHIRE , 26202 , 16325 , 255 , 0 , TABLETPC } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x9F =
2010-03-01 23:50:24 -08:00
{ " Wacom ISDv4 9F " , WACOM_PKGLEN_GRAPHIRE , 26202 , 16325 , 255 , 0 , TABLETPC } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xE2 =
2010-02-10 23:06:23 -08:00
{ " Wacom ISDv4 E2 " , WACOM_PKGLEN_TPC2FG , 26202 , 16325 , 255 , 0 , TABLETPC2FG } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0xE3 =
2010-02-10 23:06:23 -08:00
{ " Wacom ISDv4 E3 " , WACOM_PKGLEN_TPC2FG , 26202 , 16325 , 255 , 0 , TABLETPC2FG } ;
2010-02-18 01:51:47 -08:00
static const struct wacom_features wacom_features_0x47 =
2010-02-10 23:06:23 -08: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-13 18:01:36 -07:00
{ }
} ;
MODULE_DEVICE_TABLE ( usb , wacom_ids ) ;