11
11
#include "wacom_wac.h"
12
12
#include "wacom.h"
13
13
#include <linux/input/mt.h>
14
+ #include <linux/jiffies.h>
14
15
15
16
#ifndef INPUT_PROP_ACCELEROMETER
16
17
#define INPUT_PROP_ACCELEROMETER 0x06 /* has accelerometer */
@@ -55,6 +56,42 @@ static void wacom_report_numbered_buttons(struct input_dev *input_dev,
55
56
56
57
static int wacom_numbered_button_to_key (int n );
57
58
59
+ static void wacom_force_proxout (struct wacom_wac * wacom_wac )
60
+ {
61
+ struct input_dev * input = wacom_wac -> pen_input ;
62
+
63
+ wacom_wac -> shared -> stylus_in_proximity = 0 ;
64
+
65
+ input_report_key (input , BTN_TOUCH , 0 );
66
+ input_report_key (input , BTN_STYLUS , 0 );
67
+ input_report_key (input , BTN_STYLUS2 , 0 );
68
+ input_report_key (input , BTN_STYLUS3 , 0 );
69
+ input_report_key (input , wacom_wac -> tool [0 ], 0 );
70
+ if (wacom_wac -> serial [0 ]) {
71
+ input_report_abs (input , ABS_MISC , 0 );
72
+ }
73
+ input_report_abs (input , ABS_PRESSURE , 0 );
74
+
75
+ wacom_wac -> tool [0 ] = 0 ;
76
+ wacom_wac -> id [0 ] = 0 ;
77
+ wacom_wac -> serial [0 ] = 0 ;
78
+
79
+ input_sync (input );
80
+ }
81
+
82
+ void wacom_idleprox_timeout (unsigned long data )
83
+ {
84
+ struct wacom * wacom = (struct wacom * )data ;
85
+ struct wacom_wac * wacom_wac = & wacom -> wacom_wac ;
86
+
87
+ if (!wacom_wac -> hid_data .sense_state ) {
88
+ return ;
89
+ }
90
+
91
+ hid_warn (wacom -> hdev , "%s: tool appears to be hung in-prox. forcing it out.\n" , __func__ );
92
+ wacom_force_proxout (wacom_wac );
93
+ }
94
+
58
95
/*
59
96
* Percent of battery capacity for Graphire.
60
97
* 8th value means AC online and show 100% capacity.
@@ -654,9 +691,26 @@ static int wacom_intuos_id_mangle(int tool_id)
654
691
return (tool_id & ~0xFFF ) << 4 | (tool_id & 0xFFF );
655
692
}
656
693
694
+ static bool wacom_is_art_pen (int tool_id )
695
+ {
696
+ bool is_art_pen = false;
697
+
698
+ switch (tool_id ) {
699
+ case 0x885 : /* Intuos3 Marker Pen */
700
+ case 0x804 : /* Intuos4/5 13HD/24HD Marker Pen */
701
+ case 0x10804 : /* Intuos4/5 13HD/24HD Art Pen */
702
+ is_art_pen = true;
703
+ break ;
704
+ }
705
+ return is_art_pen ;
706
+ }
707
+
657
708
static int wacom_intuos_get_tool_type (int tool_id )
658
709
{
659
- int tool_type ;
710
+ int tool_type = BTN_TOOL_PEN ;
711
+
712
+ if (wacom_is_art_pen (tool_id ))
713
+ return tool_type ;
660
714
661
715
switch (tool_id ) {
662
716
case 0x812 : /* Inking pen */
@@ -671,17 +725,17 @@ static int wacom_intuos_get_tool_type(int tool_id)
671
725
case 0x852 :
672
726
case 0x823 : /* Intuos3 Grip Pen */
673
727
case 0x813 : /* Intuos3 Classic Pen */
674
- case 0x885 : /* Intuos3 Marker Pen */
675
728
case 0x802 : /* Intuos4/5 13HD/24HD General Pen */
676
- case 0x804 : /* Intuos4/5 13HD/24HD Marker Pen */
677
729
case 0x8e2 : /* IntuosHT2 pen */
678
730
case 0x022 :
679
- case 0x10804 : /* Intuos4/5 13HD/24HD Art Pen */
731
+ case 0x200 : /* Pro Pen 3 */
732
+ case 0x04200 : /* Pro Pen 3 */
680
733
case 0x10842 : /* MobileStudio Pro Pro Pen slim */
681
734
case 0x14802 : /* Intuos4/5 13HD/24HD Classic Pen */
682
735
case 0x16802 : /* Cintiq 13HD Pro Pen */
683
736
case 0x18802 : /* DTH2242 Pen */
684
737
case 0x10802 : /* Intuos4/5 13HD/24HD General Pen */
738
+ case 0x80842 : /* Intuos Pro and Cintiq Pro 3D Pen */
685
739
tool_type = BTN_TOOL_PEN ;
686
740
break ;
687
741
@@ -734,10 +788,6 @@ static int wacom_intuos_get_tool_type(int tool_id)
734
788
case 0x10902 : /* Intuos4/5 13HD/24HD Airbrush */
735
789
tool_type = BTN_TOOL_AIRBRUSH ;
736
790
break ;
737
-
738
- default : /* Unknown tool */
739
- tool_type = BTN_TOOL_PEN ;
740
- break ;
741
791
}
742
792
return tool_type ;
743
793
}
@@ -1827,7 +1877,9 @@ int wacom_equivalent_usage(int usage)
1827
1877
usage == WACOM_HID_WD_TOUCHSTRIP2 ||
1828
1878
usage == WACOM_HID_WD_TOUCHRING ||
1829
1879
usage == WACOM_HID_WD_TOUCHRINGSTATUS ||
1830
- usage == WACOM_HID_WD_REPORT_VALID ) {
1880
+ usage == WACOM_HID_WD_REPORT_VALID ||
1881
+ usage == WACOM_HID_WD_BARRELSWITCH3 ||
1882
+ usage == WACOM_HID_WD_SEQUENCENUMBER ) {
1831
1883
return usage ;
1832
1884
}
1833
1885
@@ -2024,7 +2076,6 @@ static void wacom_wac_pad_usage_mapping(struct hid_device *hdev,
2024
2076
wacom_wac -> has_mute_touch_switch = true;
2025
2077
usage -> type = EV_SW ;
2026
2078
usage -> code = SW_MUTE_DEVICE ;
2027
- features -> device_type |= WACOM_DEVICETYPE_PAD ;
2028
2079
break ;
2029
2080
case WACOM_HID_WD_TOUCHSTRIP :
2030
2081
wacom_map_usage (input , usage , field , EV_ABS , ABS_RX , 0 );
@@ -2102,6 +2153,30 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field
2102
2153
wacom_wac -> hid_data .inrange_state |= value ;
2103
2154
}
2104
2155
2156
+ /* Process touch switch state first since it is reported through touch interface,
2157
+ * which is indepentent of pad interface. In the case when there are no other pad
2158
+ * events, the pad interface will not even be created.
2159
+ */
2160
+ if ((equivalent_usage == WACOM_HID_WD_MUTE_DEVICE ) ||
2161
+ (equivalent_usage == WACOM_HID_WD_TOUCHONOFF )) {
2162
+ if (wacom_wac -> shared -> touch_input ) {
2163
+ bool * is_touch_on = & wacom_wac -> shared -> is_touch_on ;
2164
+
2165
+ if (equivalent_usage == WACOM_HID_WD_MUTE_DEVICE && value )
2166
+ * is_touch_on = !(* is_touch_on );
2167
+ else if (equivalent_usage == WACOM_HID_WD_TOUCHONOFF )
2168
+ * is_touch_on = value ;
2169
+
2170
+ input_report_switch (wacom_wac -> shared -> touch_input ,
2171
+ SW_MUTE_DEVICE , !(* is_touch_on ));
2172
+ input_sync (wacom_wac -> shared -> touch_input );
2173
+ }
2174
+ return ;
2175
+ }
2176
+
2177
+ if (!input )
2178
+ return ;
2179
+
2105
2180
switch (equivalent_usage ) {
2106
2181
case WACOM_HID_WD_TOUCHRING :
2107
2182
/*
@@ -2137,22 +2212,6 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field
2137
2212
input_event (input , usage -> type , usage -> code , 0 );
2138
2213
break ;
2139
2214
2140
- case WACOM_HID_WD_MUTE_DEVICE :
2141
- case WACOM_HID_WD_TOUCHONOFF :
2142
- if (wacom_wac -> shared -> touch_input ) {
2143
- bool * is_touch_on = & wacom_wac -> shared -> is_touch_on ;
2144
-
2145
- if (equivalent_usage == WACOM_HID_WD_MUTE_DEVICE && value )
2146
- * is_touch_on = !(* is_touch_on );
2147
- else if (equivalent_usage == WACOM_HID_WD_TOUCHONOFF )
2148
- * is_touch_on = value ;
2149
-
2150
- input_report_switch (wacom_wac -> shared -> touch_input ,
2151
- SW_MUTE_DEVICE , !(* is_touch_on ));
2152
- input_sync (wacom_wac -> shared -> touch_input );
2153
- }
2154
- break ;
2155
-
2156
2215
case WACOM_HID_WD_MODE_CHANGE :
2157
2216
if (wacom_wac -> is_direct_mode != value ) {
2158
2217
wacom_wac -> is_direct_mode = value ;
@@ -2212,8 +2271,11 @@ static void wacom_set_barrel_switch3_usage(struct wacom_wac *wacom_wac)
2212
2271
if (!(features -> quirks & WACOM_QUIRK_AESPEN ) &&
2213
2272
wacom_wac -> hid_data .barrelswitch &&
2214
2273
wacom_wac -> hid_data .barrelswitch2 &&
2215
- wacom_wac -> hid_data .serialhi )
2274
+ wacom_wac -> hid_data .serialhi &&
2275
+ !wacom_wac -> hid_data .barrelswitch3 ) {
2216
2276
input_set_capability (input , EV_KEY , BTN_STYLUS3 );
2277
+ features -> quirks |= WACOM_QUIRK_PEN_BUTTON3 ;
2278
+ }
2217
2279
}
2218
2280
2219
2281
static void wacom_wac_pen_usage_mapping (struct hid_device * hdev ,
@@ -2277,6 +2339,9 @@ static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
2277
2339
features -> quirks |= WACOM_QUIRK_TOOLSERIAL ;
2278
2340
wacom_map_usage (input , usage , field , EV_MSC , MSC_SERIAL , 0 );
2279
2341
break ;
2342
+ case HID_DG_SCANTIME :
2343
+ wacom_map_usage (input , usage , field , EV_MSC , MSC_TIMESTAMP , 0 );
2344
+ break ;
2280
2345
case WACOM_HID_WD_SENSE :
2281
2346
features -> quirks |= WACOM_QUIRK_SENSE ;
2282
2347
wacom_map_usage (input , usage , field , EV_KEY , BTN_TOOL_PEN , 0 );
@@ -2290,6 +2355,11 @@ static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
2290
2355
input_set_capability (input , EV_KEY , BTN_TOOL_AIRBRUSH );
2291
2356
wacom_map_usage (input , usage , field , EV_ABS , ABS_WHEEL , 0 );
2292
2357
break ;
2358
+ case WACOM_HID_WD_BARRELSWITCH3 :
2359
+ wacom_wac -> hid_data .barrelswitch3 = true;
2360
+ wacom_map_usage (input , usage , field , EV_KEY , BTN_STYLUS3 , 0 );
2361
+ features -> quirks &= ~WACOM_QUIRK_PEN_BUTTON3 ;
2362
+ break ;
2293
2363
}
2294
2364
}
2295
2365
@@ -2315,6 +2385,7 @@ static void wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field
2315
2385
value = field -> logical_maximum - value ;
2316
2386
break ;
2317
2387
case HID_DG_INRANGE :
2388
+ mod_timer (& wacom -> idleprox_timer , jiffies + msecs_to_jiffies (100 ));
2318
2389
wacom_wac -> hid_data .inrange_state = value ;
2319
2390
if (!(features -> quirks & WACOM_QUIRK_SENSE ))
2320
2391
wacom_wac -> hid_data .sense_state = value ;
@@ -2339,6 +2410,9 @@ static void wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field
2339
2410
}
2340
2411
return ;
2341
2412
case HID_DG_TWIST :
2413
+ /* don't modify the value if the pen doesn't support the feature */
2414
+ if (!wacom_is_art_pen (wacom_wac -> id [0 ])) return ;
2415
+
2342
2416
/*
2343
2417
* Userspace expects pen twist to have its zero point when
2344
2418
* the buttons/finger is on the tablet's left. HID values
@@ -2406,6 +2480,14 @@ static void wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field
2406
2480
case WACOM_HID_WD_REPORT_VALID :
2407
2481
wacom_wac -> is_invalid_bt_frame = !value ;
2408
2482
return ;
2483
+ case WACOM_HID_WD_BARRELSWITCH3 :
2484
+ wacom_wac -> hid_data .barrelswitch3 = value ;
2485
+ return ;
2486
+ case WACOM_HID_WD_SEQUENCENUMBER :
2487
+ if (wacom_wac -> hid_data .sequence_number != value )
2488
+ hid_warn (hdev , "Dropped %hu packets" , (unsigned short )(value - wacom_wac -> hid_data .sequence_number ));
2489
+ wacom_wac -> hid_data .sequence_number = value + 1 ;
2490
+ return ;
2409
2491
}
2410
2492
2411
2493
/* send pen events only when touch is up or forced out
@@ -2458,12 +2540,15 @@ static void wacom_wac_pen_report(struct hid_device *hdev,
2458
2540
2459
2541
if (!delay_pen_events (wacom_wac ) && wacom_wac -> tool [0 ]) {
2460
2542
int id = wacom_wac -> id [0 ];
2461
- int sw_state = wacom_wac -> hid_data .barrelswitch |
2462
- (wacom_wac -> hid_data .barrelswitch2 << 1 );
2463
-
2464
- input_report_key (input , BTN_STYLUS , sw_state == 1 );
2465
- input_report_key (input , BTN_STYLUS2 , sw_state == 2 );
2466
- input_report_key (input , BTN_STYLUS3 , sw_state == 3 );
2543
+ if (wacom_wac -> features .quirks & WACOM_QUIRK_PEN_BUTTON3 &&
2544
+ wacom_wac -> hid_data .barrelswitch & wacom_wac -> hid_data .barrelswitch2 ) {
2545
+ wacom_wac -> hid_data .barrelswitch = 0 ;
2546
+ wacom_wac -> hid_data .barrelswitch2 = 0 ;
2547
+ wacom_wac -> hid_data .barrelswitch3 = 1 ;
2548
+ }
2549
+ input_report_key (input , BTN_STYLUS , wacom_wac -> hid_data .barrelswitch );
2550
+ input_report_key (input , BTN_STYLUS2 , wacom_wac -> hid_data .barrelswitch2 );
2551
+ input_report_key (input , BTN_STYLUS3 , wacom_wac -> hid_data .barrelswitch3 );
2467
2552
2468
2553
/*
2469
2554
* Non-USI EMR tools should have their IDs mangled to
@@ -2545,6 +2630,9 @@ static void wacom_wac_finger_usage_mapping(struct hid_device *hdev,
2545
2630
field -> logical_maximum = 255 ;
2546
2631
}
2547
2632
break ;
2633
+ case HID_DG_SCANTIME :
2634
+ wacom_map_usage (input , usage , field , EV_MSC , MSC_TIMESTAMP , 0 );
2635
+ break ;
2548
2636
}
2549
2637
}
2550
2638
@@ -2811,7 +2899,7 @@ void wacom_wac_event(struct hid_device *hdev, struct hid_field *field,
2811
2899
/* usage tests must precede field tests */
2812
2900
if (WACOM_BATTERY_USAGE (usage ))
2813
2901
wacom_wac_battery_event (hdev , field , usage , value );
2814
- else if (WACOM_PAD_FIELD (field ) && wacom -> wacom_wac . pad_input )
2902
+ else if (WACOM_PAD_FIELD (field ))
2815
2903
wacom_wac_pad_event (hdev , field , usage , value );
2816
2904
else if (WACOM_PEN_FIELD (field ) && wacom -> wacom_wac .pen_input )
2817
2905
wacom_wac_pen_event (hdev , field , usage , value );
@@ -4714,6 +4802,10 @@ static const struct wacom_features wacom_features_0x3c6 =
4714
4802
static const struct wacom_features wacom_features_0x3c8 =
4715
4803
{ "Wacom Intuos BT M" , 21600 , 13500 , 4095 , 63 ,
4716
4804
INTUOSHT3_BT , WACOM_INTUOS_RES , WACOM_INTUOS_RES , 4 };
4805
+ static const struct wacom_features wacom_features_0x3dd =
4806
+ { "Wacom Intuos Pro S" , 31920 , 19950 , 8191 , 63 ,
4807
+ INTUOSP2S_BT , WACOM_INTUOS3_RES , WACOM_INTUOS3_RES , 7 ,
4808
+ .touch_max = 10 };
4717
4809
4718
4810
static const struct wacom_features wacom_features_HID_ANY_ID =
4719
4811
{ "Wacom HID" , .type = HID_GENERIC , .oVid = HID_ANY_ID , .oPid = HID_ANY_ID };
@@ -4889,6 +4981,7 @@ const struct hid_device_id wacom_ids[] = {
4889
4981
{ BT_DEVICE_WACOM (0x393 ) },
4890
4982
{ BT_DEVICE_WACOM (0x3c6 ) },
4891
4983
{ BT_DEVICE_WACOM (0x3c8 ) },
4984
+ { BT_DEVICE_WACOM (0x3dd ) },
4892
4985
{ USB_DEVICE_WACOM (0x4001 ) },
4893
4986
{ USB_DEVICE_WACOM (0x4004 ) },
4894
4987
{ USB_DEVICE_WACOM (0x5000 ) },
0 commit comments