summaryrefslogtreecommitdiff
path: root/usr
diff options
context:
space:
mode:
Diffstat (limited to 'usr')
-rw-r--r--usr/src/dkms_source_tree/wacom.h1
-rw-r--r--usr/src/dkms_source_tree/wacom_sys.c57
-rw-r--r--usr/src/dkms_source_tree/wacom_wac.c108
-rw-r--r--usr/src/dkms_source_tree/wacom_wac.h12
4 files changed, 124 insertions, 54 deletions
diff --git a/usr/src/dkms_source_tree/wacom.h b/usr/src/dkms_source_tree/wacom.h
index 284dfaa..de5adb1 100644
--- a/usr/src/dkms_source_tree/wacom.h
+++ b/usr/src/dkms_source_tree/wacom.h
@@ -118,6 +118,7 @@ struct wacom {
118extern const struct usb_device_id wacom_ids[]; 118extern const struct usb_device_id wacom_ids[];
119 119
120void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len); 120void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len);
121void wacom_setup_device_quirks(struct wacom_features *features);
121void wacom_setup_input_capabilities(struct input_dev *input_dev, 122void wacom_setup_input_capabilities(struct input_dev *input_dev,
122 struct wacom_wac *wacom_wac); 123 struct wacom_wac *wacom_wac);
123#endif 124#endif
diff --git a/usr/src/dkms_source_tree/wacom_sys.c b/usr/src/dkms_source_tree/wacom_sys.c
index 42ba369..fc6fd53 100644
--- a/usr/src/dkms_source_tree/wacom_sys.c
+++ b/usr/src/dkms_source_tree/wacom_sys.c
@@ -195,17 +195,30 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
195 features->pktlen = WACOM_PKGLEN_TPC2FG; 195 features->pktlen = WACOM_PKGLEN_TPC2FG;
196 features->device_type = BTN_TOOL_TRIPLETAP; 196 features->device_type = BTN_TOOL_TRIPLETAP;
197 } 197 }
198 features->x_max = 198 if (features->type == BAMBOO_PT) {
199 get_unaligned_le16(&report[i + 3]); 199 /* need to reset back */
200 features->x_phy = 200 features->pktlen = WACOM_PKGLEN_BBTOUCH;
201 get_unaligned_le16(&report[i + 6]); 201 features->device_type = BTN_TOOL_TRIPLETAP;
202 features->unit = report[i + 9]; 202 features->x_phy =
203 features->unitExpo = report[i + 11]; 203 get_unaligned_le16(&report[i + 5]);
204 i += 12; 204 features->x_max =
205 get_unaligned_le16(&report[i + 8]);
206 i += 15;
207 } else {
208 features->x_max =
209 get_unaligned_le16(&report[i + 3]);
210 features->x_phy =
211 get_unaligned_le16(&report[i + 6]);
212 features->unit = report[i + 9];
213 features->unitExpo = report[i + 11];
214 i += 12;
215 }
205 } else if (pen) { 216 } else if (pen) {
206 /* penabled only accepts exact bytes of data */ 217 /* penabled only accepts exact bytes of data */
207 if (features->type == TABLETPC2FG) 218 if (features->type == TABLETPC2FG)
208 features->pktlen = WACOM_PKGLEN_GRAPHIRE; 219 features->pktlen = WACOM_PKGLEN_GRAPHIRE;
220 if (features->type == BAMBOO_PT)
221 features->pktlen = WACOM_PKGLEN_BBFUN;
209 features->device_type = BTN_TOOL_PEN; 222 features->device_type = BTN_TOOL_PEN;
210 features->x_max = 223 features->x_max =
211 get_unaligned_le16(&report[i + 3]); 224 get_unaligned_le16(&report[i + 3]);
@@ -234,6 +247,15 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
234 features->y_phy = 247 features->y_phy =
235 get_unaligned_le16(&report[i + 6]); 248 get_unaligned_le16(&report[i + 6]);
236 i += 7; 249 i += 7;
250 } else if (features->type == BAMBOO_PT) {
251 /* need to reset back */
252 features->pktlen = WACOM_PKGLEN_BBTOUCH;
253 features->device_type = BTN_TOOL_TRIPLETAP;
254 features->y_phy =
255 get_unaligned_le16(&report[i + 3]);
256 features->y_max =
257 get_unaligned_le16(&report[i + 6]);
258 i += 12;
237 } else { 259 } else {
238 features->y_max = 260 features->y_max =
239 features->x_max; 261 features->x_max;
@@ -245,6 +267,8 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
245 /* penabled only accepts exact bytes of data */ 267 /* penabled only accepts exact bytes of data */
246 if (features->type == TABLETPC2FG) 268 if (features->type == TABLETPC2FG)
247 features->pktlen = WACOM_PKGLEN_GRAPHIRE; 269 features->pktlen = WACOM_PKGLEN_GRAPHIRE;
270 if (features->type == BAMBOO_PT)
271 features->pktlen = WACOM_PKGLEN_BBFUN;
248 features->device_type = BTN_TOOL_PEN; 272 features->device_type = BTN_TOOL_PEN;
249 features->y_max = 273 features->y_max =
250 get_unaligned_le16(&report[i + 3]); 274 get_unaligned_le16(&report[i + 3]);
@@ -333,11 +357,16 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
333 struct usb_host_interface *interface = intf->cur_altsetting; 357 struct usb_host_interface *interface = intf->cur_altsetting;
334 struct hid_descriptor *hid_desc; 358 struct hid_descriptor *hid_desc;
335 359
336 /* default device to penabled */ 360 /* default features */
337 features->device_type = BTN_TOOL_PEN; 361 features->device_type = BTN_TOOL_PEN;
362 features->x_fuzz = 4;
363 features->y_fuzz = 4;
364 features->pressure_fuzz = 0;
365 features->distance_fuzz = 0;
338 366
339 /* only Tablet PCs need to retrieve the info */ 367 /* only Tablet PCs need to retrieve the info */
340 if ((features->type != TABLETPC) && (features->type != TABLETPC2FG)) 368 if ((features->type != TABLETPC) && (features->type != TABLETPC2FG) &&
369 (features->type != BAMBOO_PT))
341 goto out; 370 goto out;
342 371
343 if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) { 372 if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) {
@@ -352,12 +381,6 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
352 if (error) 381 if (error)
353 goto out; 382 goto out;
354 383
355 /* touch device found but size is not defined. use default */
356 if (features->device_type == BTN_TOOL_DOUBLETAP && !features->x_max) {
357 features->x_max = 1023;
358 features->y_max = 1023;
359 }
360
361 out: 384 out:
362 return error; 385 return error;
363} 386}
@@ -493,9 +516,11 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
493 if (error) 516 if (error)
494 goto fail2; 517 goto fail2;
495 518
519 wacom_setup_device_quirks(features);
520
496 strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name)); 521 strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name));
497 522
498 if (features->type == TABLETPC || features->type == TABLETPC2FG) { 523 if (features->quirks & WACOM_QUIRK_MULTI_INPUT) {
499 /* Append the device type to the name */ 524 /* Append the device type to the name */
500 strlcat(wacom_wac->name, 525 strlcat(wacom_wac->name,
501 features->device_type == BTN_TOOL_PEN ? 526 features->device_type == BTN_TOOL_PEN ?
diff --git a/usr/src/dkms_source_tree/wacom_wac.c b/usr/src/dkms_source_tree/wacom_wac.c
index d1c388e..fd2463c 100644
--- a/usr/src/dkms_source_tree/wacom_wac.c
+++ b/usr/src/dkms_source_tree/wacom_wac.c
@@ -855,12 +855,13 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
855 return retval; 855 return retval;
856} 856}
857 857
858static int wacom_bbt_irq(struct wacom_wac *wacom, size_t len) 858static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len)
859{ 859{
860 static int trkid; 860 struct wacom_features *features = &wacom->features;
861 struct input_dev *input = wacom->input; 861 struct input_dev *input = wacom->input;
862 unsigned char *data = wacom->data; 862 unsigned char *data = wacom->data;
863 int i, sp = 0, sx = 0, sy = 0, count = 0; 863 int sp = 0, sx = 0, sy = 0, count = 0;
864 int i;
864 865
865 if (len != WACOM_PKGLEN_BBTOUCH) 866 if (len != WACOM_PKGLEN_BBTOUCH)
866 return 0; 867 return 0;
@@ -871,14 +872,15 @@ static int wacom_bbt_irq(struct wacom_wac *wacom, size_t len)
871 if (p) { 872 if (p) {
872 int x = get_unaligned_be16(&data[9 * i + 3]) & 0x7ff; 873 int x = get_unaligned_be16(&data[9 * i + 3]) & 0x7ff;
873 int y = get_unaligned_be16(&data[9 * i + 5]) & 0x7ff; 874 int y = get_unaligned_be16(&data[9 * i + 5]) & 0x7ff;
874 /* artificial scaling */ 875 if (features->quirks & WACOM_QUIRK_BBTOUCH_LOWRES) {
875 x <<= 4; 876 x <<= 5;
876 y <<= 4; 877 y <<= 5;
878 }
877 input_report_abs(input, ABS_MT_PRESSURE, p); 879 input_report_abs(input, ABS_MT_PRESSURE, p);
878 input_report_abs(input, ABS_MT_POSITION_X, x); 880 input_report_abs(input, ABS_MT_POSITION_X, x);
879 input_report_abs(input, ABS_MT_POSITION_Y, y); 881 input_report_abs(input, ABS_MT_POSITION_Y, y);
880 if (wacom->id[i] < 0) 882 if (wacom->id[i] < 0)
881 wacom->id[i] = trkid++ & MAX_TRACKING_ID; 883 wacom->id[i] = wacom->trk_id++ & MAX_TRACKING_ID;
882 if (!count++) 884 if (!count++)
883 sp = p, sx = x, sy = y; 885 sp = p, sx = x, sy = y;
884 } else { 886 } else {
@@ -896,7 +898,8 @@ static int wacom_bbt_irq(struct wacom_wac *wacom, size_t len)
896 input_report_abs(input, ABS_Y, sy); 898 input_report_abs(input, ABS_Y, sy);
897 899
898 input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0); 900 input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0);
899 input_report_key(input, BTN_MIDDLE, (data[1] & 0x06) != 0); 901 input_report_key(input, BTN_FORWARD, (data[1] & 0x04) != 0);
902 input_report_key(input, BTN_BACK, (data[1] & 0x02) != 0);
900 input_report_key(input, BTN_RIGHT, (data[1] & 0x01) != 0); 903 input_report_key(input, BTN_RIGHT, (data[1] & 0x01) != 0);
901 904
902 input_sync(input); 905 input_sync(input);
@@ -949,8 +952,8 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
949 sync = wacom_tpc_irq(wacom_wac, len); 952 sync = wacom_tpc_irq(wacom_wac, len);
950 break; 953 break;
951 954
952 case BAMBOO_TOUCH: 955 case BAMBOO_PT:
953 sync = wacom_bbt_irq(wacom_wac, len); 956 sync = wacom_bpt_irq(wacom_wac, len);
954 break; 957 break;
955 958
956 default: 959 default:
@@ -994,6 +997,34 @@ static void wacom_setup_intuos(struct wacom_wac *wacom_wac)
994 input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0); 997 input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0);
995} 998}
996 999
1000
1001void wacom_setup_device_quirks(struct wacom_features *features)
1002{
1003
1004 /* touch device found but size is not defined. use default */
1005 if (features->device_type == BTN_TOOL_DOUBLETAP && !features->x_max) {
1006 features->x_max = 1023;
1007 features->y_max = 1023;
1008 }
1009
1010 /* these device have multiple inputs */
1011 if (features->type == TABLETPC || features->type == TABLETPC2FG ||
1012 features->type == BAMBOO_PT)
1013 features->quirks |= WACOM_QUIRK_MULTI_INPUT;
1014
1015 /* quirks for bamboo touch */
1016 if (features->type == BAMBOO_PT &&
1017 features->device_type == BTN_TOOL_TRIPLETAP) {
1018 features->x_max <<= 5;
1019 features->y_max <<= 5;
1020 features->x_fuzz <<= 5;
1021 features->y_fuzz <<= 5;
1022 features->pressure_max = 256;
1023 features->pressure_fuzz = 16;
1024 features->quirks |= WACOM_QUIRK_BBTOUCH_LOWRES;
1025 }
1026}
1027
997void wacom_setup_input_capabilities(struct input_dev *input_dev, 1028void wacom_setup_input_capabilities(struct input_dev *input_dev,
998 struct wacom_wac *wacom_wac) 1029 struct wacom_wac *wacom_wac)
999{ 1030{
@@ -1004,9 +1035,12 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
1004 1035
1005 __set_bit(BTN_TOUCH, input_dev->keybit); 1036 __set_bit(BTN_TOUCH, input_dev->keybit);
1006 1037
1007 input_set_abs_params(input_dev, ABS_X, 0, features->x_max, 4, 0); 1038 input_set_abs_params(input_dev, ABS_X, 0, features->x_max,
1008 input_set_abs_params(input_dev, ABS_Y, 0, features->y_max, 4, 0); 1039 features->x_fuzz, 0);
1009 input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max, 0, 0); 1040 input_set_abs_params(input_dev, ABS_Y, 0, features->y_max,
1041 features->y_fuzz, 0);
1042 input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max,
1043 features->pressure_fuzz, 0);
1010 1044
1011 __set_bit(ABS_MISC, input_dev->absbit); 1045 __set_bit(ABS_MISC, input_dev->absbit);
1012 1046
@@ -1130,24 +1164,31 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
1130 __set_bit(BTN_TOOL_RUBBER, input_dev->keybit); 1164 __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
1131 break; 1165 break;
1132 1166
1133 case BAMBOO_TOUCH: 1167 case BAMBOO_PT:
1134 __clear_bit(ABS_MISC, input_dev->absbit); 1168 __clear_bit(ABS_MISC, input_dev->absbit);
1135 __set_bit(BTN_LEFT, input_dev->keybit);
1136 __set_bit(BTN_MIDDLE, input_dev->keybit);
1137 __set_bit(BTN_RIGHT, input_dev->keybit);
1138 1169
1139 __set_bit(BTN_TOOL_FINGER, input_dev->keybit); 1170 if (features->device_type == BTN_TOOL_TRIPLETAP) {
1140 __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); 1171 __set_bit(BTN_LEFT, input_dev->keybit);
1172 __set_bit(BTN_FORWARD, input_dev->keybit);
1173 __set_bit(BTN_BACK, input_dev->keybit);
1174 __set_bit(BTN_RIGHT, input_dev->keybit);
1141 1175
1142 input_set_abs_params(input_dev, ABS_X, 0, features->x_max, 32, 0); 1176 __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
1143 input_set_abs_params(input_dev, ABS_Y, 0, features->y_max, 32, 0); 1177 __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
1144 input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max, 16, 0);
1145 1178
1146 input_mt_create_slots(input_dev, 2); 1179 input_mt_create_slots(input_dev, 2);
1147 input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, features->x_max, 32, 0); 1180 input_set_abs_params(input_dev, ABS_MT_POSITION_X,
1148 input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, features->y_max, 32, 0); 1181 0, features->x_max,
1149 input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, features->pressure_max, 16, 0); 1182 features->x_fuzz, 0);
1150 input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, MAX_TRACKING_ID, 0, 0); 1183 input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
1184 0, features->y_max,
1185 features->y_fuzz, 0);
1186 input_set_abs_params(input_dev, ABS_MT_PRESSURE,
1187 0, features->pressure_max,
1188 features->pressure_fuzz, 0);
1189 input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0,
1190 MAX_TRACKING_ID, 0, 0);
1191 }
1151 break; 1192 break;
1152 } 1193 }
1153} 1194}
@@ -1286,19 +1327,13 @@ static const struct wacom_features wacom_features_0xE3 =
1286 { "Wacom ISDv4 E3", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, 0, TABLETPC2FG }; 1327 { "Wacom ISDv4 E3", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, 0, TABLETPC2FG };
1287static const struct wacom_features wacom_features_0x47 = 1328static const struct wacom_features wacom_features_0x47 =
1288 { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 31, INTUOS }; 1329 { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 31, INTUOS };
1289static const struct wacom_features wacom_features_0xD0_0 = 1330static struct wacom_features wacom_features_0xD0 =
1290 { "Wacom Bamboo Touch", WACOM_PKGLEN_BBTOUCH, 7680, 5120, 255, 0, BAMBOO_TOUCH }; 1331 { "Wacom Bamboo 2FG", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT };
1291static const struct wacom_features wacom_features_0xD0_2 =
1292 { "Wacom Bamboo Boot", WACOM_PKGLEN_BBFUN, 14760, 9225, 511, 63, WACOM_MO };
1293 1332
1294#define USB_DEVICE_WACOM(prod) \ 1333#define USB_DEVICE_WACOM(prod) \
1295 USB_DEVICE(USB_VENDOR_ID_WACOM, prod), \ 1334 USB_DEVICE(USB_VENDOR_ID_WACOM, prod), \
1296 .driver_info = (kernel_ulong_t)&wacom_features_##prod 1335 .driver_info = (kernel_ulong_t)&wacom_features_##prod
1297 1336
1298#define USB_DEVICE_WACOM_PROTO(prod, pr) \
1299 USB_DEVICE_INTERFACE_PROTOCOL(USB_VENDOR_ID_WACOM, prod, pr), \
1300 .driver_info = (kernel_ulong_t)&wacom_features_##prod##_##pr
1301
1302const struct usb_device_id wacom_ids[] = { 1337const struct usb_device_id wacom_ids[] = {
1303 { USB_DEVICE_WACOM(0x00) }, 1338 { USB_DEVICE_WACOM(0x00) },
1304 { USB_DEVICE_WACOM(0x10) }, 1339 { USB_DEVICE_WACOM(0x10) },
@@ -1358,8 +1393,7 @@ const struct usb_device_id wacom_ids[] = {
1358 { USB_DEVICE_WACOM(0xC6) }, 1393 { USB_DEVICE_WACOM(0xC6) },
1359 { USB_DEVICE_WACOM(0xC7) }, 1394 { USB_DEVICE_WACOM(0xC7) },
1360 { USB_DEVICE_WACOM(0xCE) }, 1395 { USB_DEVICE_WACOM(0xCE) },
1361 { USB_DEVICE_WACOM_PROTO(0xD0, 0) }, 1396 { USB_DEVICE_WACOM(0xD0) },
1362 { USB_DEVICE_WACOM_PROTO(0xD0, 2) },
1363 { USB_DEVICE_WACOM(0xF0) }, 1397 { USB_DEVICE_WACOM(0xF0) },
1364 { USB_DEVICE_WACOM(0xCC) }, 1398 { USB_DEVICE_WACOM(0xCC) },
1365 { USB_DEVICE_WACOM(0x90) }, 1399 { USB_DEVICE_WACOM(0x90) },
diff --git a/usr/src/dkms_source_tree/wacom_wac.h b/usr/src/dkms_source_tree/wacom_wac.h
index 0c5a35d..00ca015 100644
--- a/usr/src/dkms_source_tree/wacom_wac.h
+++ b/usr/src/dkms_source_tree/wacom_wac.h
@@ -38,6 +38,10 @@
38#define WACOM_REPORT_TPC1FG 6 38#define WACOM_REPORT_TPC1FG 6
39#define WACOM_REPORT_TPC2FG 13 39#define WACOM_REPORT_TPC2FG 13
40 40
41/* device quirks */
42#define WACOM_QUIRK_MULTI_INPUT 0x0001
43#define WACOM_QUIRK_BBTOUCH_LOWRES 0x0002
44
41/* largest reported tracking id */ 45/* largest reported tracking id */
42#define MAX_TRACKING_ID 0xfff 46#define MAX_TRACKING_ID 0xfff
43 47
@@ -48,6 +52,7 @@ enum {
48 PTU, 52 PTU,
49 PL, 53 PL,
50 DTU, 54 DTU,
55 BAMBOO_PT,
51 INTUOS, 56 INTUOS,
52 INTUOS3S, 57 INTUOS3S,
53 INTUOS3, 58 INTUOS3,
@@ -61,7 +66,6 @@ enum {
61 WACOM_MO, 66 WACOM_MO,
62 TABLETPC, 67 TABLETPC,
63 TABLETPC2FG, 68 TABLETPC2FG,
64 BAMBOO_TOUCH,
65 MAX_TYPE 69 MAX_TYPE
66}; 70};
67 71
@@ -78,6 +82,11 @@ struct wacom_features {
78 int y_phy; 82 int y_phy;
79 unsigned char unit; 83 unsigned char unit;
80 unsigned char unitExpo; 84 unsigned char unitExpo;
85 int x_fuzz;
86 int y_fuzz;
87 int pressure_fuzz;
88 int distance_fuzz;
89 unsigned quirks;
81}; 90};
82 91
83struct wacom_shared { 92struct wacom_shared {
@@ -91,6 +100,7 @@ struct wacom_wac {
91 int id[3]; 100 int id[3];
92 __u32 serial[2]; 101 __u32 serial[2];
93 int last_finger; 102 int last_finger;
103 int trk_id;
94 struct wacom_features features; 104 struct wacom_features features;
95 struct wacom_shared *shared; 105 struct wacom_shared *shared;
96 struct input_dev *input; 106 struct input_dev *input;