|
@@ -2237,54 +2237,16 @@ void wacom_setup_device_quirks(struct wacom *wacom)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-static void wacom_abs_set_axis(struct input_dev *input_dev,
|
|
|
|
- struct wacom_wac *wacom_wac)
|
|
|
|
-{
|
|
|
|
- struct wacom_features *features = &wacom_wac->features;
|
|
|
|
-
|
|
|
|
- if (features->device_type & WACOM_DEVICETYPE_PEN) {
|
|
|
|
- input_set_abs_params(input_dev, ABS_X, features->x_min,
|
|
|
|
- features->x_max, features->x_fuzz, 0);
|
|
|
|
- input_set_abs_params(input_dev, ABS_Y, features->y_min,
|
|
|
|
- features->y_max, features->y_fuzz, 0);
|
|
|
|
- input_set_abs_params(input_dev, ABS_PRESSURE, 0,
|
|
|
|
- features->pressure_max, features->pressure_fuzz, 0);
|
|
|
|
-
|
|
|
|
- /* penabled devices have fixed resolution for each model */
|
|
|
|
- input_abs_set_res(input_dev, ABS_X, features->x_resolution);
|
|
|
|
- input_abs_set_res(input_dev, ABS_Y, features->y_resolution);
|
|
|
|
- } else if (features->device_type & WACOM_DEVICETYPE_TOUCH) {
|
|
|
|
- if (features->touch_max == 1) {
|
|
|
|
- input_set_abs_params(input_dev, ABS_X, 0,
|
|
|
|
- features->x_max, features->x_fuzz, 0);
|
|
|
|
- input_set_abs_params(input_dev, ABS_Y, 0,
|
|
|
|
- features->y_max, features->y_fuzz, 0);
|
|
|
|
- input_abs_set_res(input_dev, ABS_X,
|
|
|
|
- features->x_resolution);
|
|
|
|
- input_abs_set_res(input_dev, ABS_Y,
|
|
|
|
- features->y_resolution);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (features->touch_max > 1) {
|
|
|
|
- input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0,
|
|
|
|
- features->x_max, features->x_fuzz, 0);
|
|
|
|
- input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0,
|
|
|
|
- features->y_max, features->y_fuzz, 0);
|
|
|
|
- input_abs_set_res(input_dev, ABS_MT_POSITION_X,
|
|
|
|
- features->x_resolution);
|
|
|
|
- input_abs_set_res(input_dev, ABS_MT_POSITION_Y,
|
|
|
|
- features->y_resolution);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-int wacom_setup_pentouch_input_capabilities(struct input_dev *input_dev,
|
|
|
|
|
|
+int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
|
|
struct wacom_wac *wacom_wac)
|
|
struct wacom_wac *wacom_wac)
|
|
{
|
|
{
|
|
struct wacom_features *features = &wacom_wac->features;
|
|
struct wacom_features *features = &wacom_wac->features;
|
|
|
|
|
|
input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
|
|
input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
|
|
|
|
|
|
|
|
+ if (!(features->device_type & WACOM_DEVICETYPE_PEN))
|
|
|
|
+ return -ENODEV;
|
|
|
|
+
|
|
if (features->type == HID_GENERIC)
|
|
if (features->type == HID_GENERIC)
|
|
/* setup has already been done */
|
|
/* setup has already been done */
|
|
return 0;
|
|
return 0;
|
|
@@ -2292,7 +2254,17 @@ int wacom_setup_pentouch_input_capabilities(struct input_dev *input_dev,
|
|
__set_bit(BTN_TOUCH, input_dev->keybit);
|
|
__set_bit(BTN_TOUCH, input_dev->keybit);
|
|
__set_bit(ABS_MISC, input_dev->absbit);
|
|
__set_bit(ABS_MISC, input_dev->absbit);
|
|
|
|
|
|
- wacom_abs_set_axis(input_dev, wacom_wac);
|
|
|
|
|
|
+ input_set_abs_params(input_dev, ABS_X, features->x_min,
|
|
|
|
+ features->x_max, features->x_fuzz, 0);
|
|
|
|
+ input_set_abs_params(input_dev, ABS_Y, features->y_min,
|
|
|
|
+ features->y_max, features->y_fuzz, 0);
|
|
|
|
+ input_set_abs_params(input_dev, ABS_PRESSURE, 0,
|
|
|
|
+ features->pressure_max, features->pressure_fuzz, 0);
|
|
|
|
+
|
|
|
|
+ /* penabled devices have fixed resolution for each model */
|
|
|
|
+ input_abs_set_res(input_dev, ABS_X, features->x_resolution);
|
|
|
|
+ input_abs_set_res(input_dev, ABS_Y, features->y_resolution);
|
|
|
|
+
|
|
|
|
|
|
switch (features->type) {
|
|
switch (features->type) {
|
|
case GRAPHIRE_BT:
|
|
case GRAPHIRE_BT:
|
|
@@ -2361,53 +2333,25 @@ int wacom_setup_pentouch_input_capabilities(struct input_dev *input_dev,
|
|
case INTUOSPS:
|
|
case INTUOSPS:
|
|
__set_bit(INPUT_PROP_POINTER, input_dev->propbit);
|
|
__set_bit(INPUT_PROP_POINTER, input_dev->propbit);
|
|
|
|
|
|
- if (features->device_type & WACOM_DEVICETYPE_PEN) {
|
|
|
|
- input_set_abs_params(input_dev, ABS_DISTANCE, 0,
|
|
|
|
- features->distance_max,
|
|
|
|
- 0, 0);
|
|
|
|
-
|
|
|
|
- input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
|
|
|
|
- input_abs_set_res(input_dev, ABS_Z, 287);
|
|
|
|
|
|
+ input_set_abs_params(input_dev, ABS_DISTANCE, 0,
|
|
|
|
+ features->distance_max,
|
|
|
|
+ 0, 0);
|
|
|
|
|
|
- wacom_setup_intuos(wacom_wac);
|
|
|
|
- } else if (features->device_type & WACOM_DEVICETYPE_TOUCH) {
|
|
|
|
- __clear_bit(ABS_MISC, input_dev->absbit);
|
|
|
|
|
|
+ input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
|
|
|
|
+ input_abs_set_res(input_dev, ABS_Z, 287);
|
|
|
|
|
|
- input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
|
|
|
|
- 0, features->x_max, 0, 0);
|
|
|
|
- input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR,
|
|
|
|
- 0, features->y_max, 0, 0);
|
|
|
|
- input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
|
|
|
|
- }
|
|
|
|
|
|
+ wacom_setup_intuos(wacom_wac);
|
|
break;
|
|
break;
|
|
|
|
|
|
case WACOM_24HDT:
|
|
case WACOM_24HDT:
|
|
- if (features->device_type & WACOM_DEVICETYPE_TOUCH) {
|
|
|
|
- input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, features->x_max, 0, 0);
|
|
|
|
- input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, features->x_max, 0, 0);
|
|
|
|
- input_set_abs_params(input_dev, ABS_MT_WIDTH_MINOR, 0, features->y_max, 0, 0);
|
|
|
|
- input_set_abs_params(input_dev, ABS_MT_ORIENTATION, 0, 1, 0, 0);
|
|
|
|
- }
|
|
|
|
- /* fall through */
|
|
|
|
-
|
|
|
|
case WACOM_27QHDT:
|
|
case WACOM_27QHDT:
|
|
case MTSCREEN:
|
|
case MTSCREEN:
|
|
case MTTPC:
|
|
case MTTPC:
|
|
case MTTPC_B:
|
|
case MTTPC_B:
|
|
case TABLETPC2FG:
|
|
case TABLETPC2FG:
|
|
- if (features->device_type & WACOM_DEVICETYPE_TOUCH && features->touch_max > 1)
|
|
|
|
- input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_DIRECT);
|
|
|
|
- /* fall through */
|
|
|
|
-
|
|
|
|
case TABLETPC:
|
|
case TABLETPC:
|
|
case TABLETPCE:
|
|
case TABLETPCE:
|
|
__clear_bit(ABS_MISC, input_dev->absbit);
|
|
__clear_bit(ABS_MISC, input_dev->absbit);
|
|
-
|
|
|
|
- __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
|
|
|
|
-
|
|
|
|
- if (!(features->device_type & WACOM_DEVICETYPE_PEN))
|
|
|
|
- break; /* no need to process stylus stuff */
|
|
|
|
-
|
|
|
|
/* fall through */
|
|
/* fall through */
|
|
|
|
|
|
case DTUS:
|
|
case DTUS:
|
|
@@ -2435,48 +2379,114 @@ int wacom_setup_pentouch_input_capabilities(struct input_dev *input_dev,
|
|
break;
|
|
break;
|
|
|
|
|
|
case INTUOSHT:
|
|
case INTUOSHT:
|
|
- if (features->device_type & WACOM_DEVICETYPE_TOUCH) {
|
|
|
|
- input_dev->evbit[0] |= BIT_MASK(EV_SW);
|
|
|
|
- __set_bit(SW_MUTE_DEVICE, input_dev->swbit);
|
|
|
|
- }
|
|
|
|
- /* fall through */
|
|
|
|
-
|
|
|
|
case BAMBOO_PT:
|
|
case BAMBOO_PT:
|
|
__clear_bit(ABS_MISC, input_dev->absbit);
|
|
__clear_bit(ABS_MISC, input_dev->absbit);
|
|
|
|
|
|
- if (features->device_type & WACOM_DEVICETYPE_TOUCH) {
|
|
|
|
- if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
|
|
|
|
- input_set_abs_params(input_dev,
|
|
|
|
- ABS_MT_TOUCH_MAJOR,
|
|
|
|
- 0, features->x_max, 0, 0);
|
|
|
|
- input_set_abs_params(input_dev,
|
|
|
|
- ABS_MT_TOUCH_MINOR,
|
|
|
|
- 0, features->y_max, 0, 0);
|
|
|
|
- }
|
|
|
|
- input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
|
|
|
|
- }
|
|
|
|
- if (features->device_type & WACOM_DEVICETYPE_PAD) {
|
|
|
|
- /* buttons/keys only interface */
|
|
|
|
- __clear_bit(ABS_X, input_dev->absbit);
|
|
|
|
- __clear_bit(ABS_Y, input_dev->absbit);
|
|
|
|
- __clear_bit(BTN_TOUCH, input_dev->keybit);
|
|
|
|
|
|
+ __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
|
|
|
|
+ __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
|
|
|
|
+ __set_bit(BTN_TOOL_PEN, 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,
|
|
|
|
+ features->distance_max,
|
|
|
|
+ 0, 0);
|
|
|
|
+ break;
|
|
|
|
+ case BAMBOO_PAD:
|
|
|
|
+ __clear_bit(ABS_MISC, input_dev->absbit);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
|
|
- /* PAD is setup by wacom_setup_pad_input_capabilities later */
|
|
|
|
- return 1;
|
|
|
|
- }
|
|
|
|
- if (features->device_type & WACOM_DEVICETYPE_PEN) {
|
|
|
|
- __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
|
|
|
|
- __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
|
|
|
|
- __set_bit(BTN_TOOL_PEN, 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,
|
|
|
|
- features->distance_max,
|
|
|
|
- 0, 0);
|
|
|
|
|
|
+int wacom_setup_touch_input_capabilities(struct input_dev *input_dev,
|
|
|
|
+ struct wacom_wac *wacom_wac)
|
|
|
|
+{
|
|
|
|
+ struct wacom_features *features = &wacom_wac->features;
|
|
|
|
+
|
|
|
|
+ input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
|
|
|
|
+
|
|
|
|
+ if (!(features->device_type & WACOM_DEVICETYPE_TOUCH))
|
|
|
|
+ return -ENODEV;
|
|
|
|
+
|
|
|
|
+ if (features->type == HID_GENERIC)
|
|
|
|
+ /* setup has already been done */
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ __set_bit(BTN_TOUCH, input_dev->keybit);
|
|
|
|
+
|
|
|
|
+ if (features->touch_max == 1) {
|
|
|
|
+ input_set_abs_params(input_dev, ABS_X, 0,
|
|
|
|
+ features->x_max, features->x_fuzz, 0);
|
|
|
|
+ input_set_abs_params(input_dev, ABS_Y, 0,
|
|
|
|
+ features->y_max, features->y_fuzz, 0);
|
|
|
|
+ input_abs_set_res(input_dev, ABS_X,
|
|
|
|
+ features->x_resolution);
|
|
|
|
+ input_abs_set_res(input_dev, ABS_Y,
|
|
|
|
+ features->y_resolution);
|
|
|
|
+ }
|
|
|
|
+ else if (features->touch_max > 1) {
|
|
|
|
+ input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0,
|
|
|
|
+ features->x_max, features->x_fuzz, 0);
|
|
|
|
+ input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0,
|
|
|
|
+ features->y_max, features->y_fuzz, 0);
|
|
|
|
+ input_abs_set_res(input_dev, ABS_MT_POSITION_X,
|
|
|
|
+ features->x_resolution);
|
|
|
|
+ input_abs_set_res(input_dev, ABS_MT_POSITION_Y,
|
|
|
|
+ features->y_resolution);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ switch (features->type) {
|
|
|
|
+ case INTUOS5:
|
|
|
|
+ case INTUOS5L:
|
|
|
|
+ case INTUOSPM:
|
|
|
|
+ case INTUOSPL:
|
|
|
|
+ case INTUOS5S:
|
|
|
|
+ case INTUOSPS:
|
|
|
|
+ __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
|
|
|
|
+
|
|
|
|
+ input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, features->x_max, 0, 0);
|
|
|
|
+ input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR, 0, features->y_max, 0, 0);
|
|
|
|
+ input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case WACOM_24HDT:
|
|
|
|
+ input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, features->x_max, 0, 0);
|
|
|
|
+ input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, features->x_max, 0, 0);
|
|
|
|
+ input_set_abs_params(input_dev, ABS_MT_WIDTH_MINOR, 0, features->y_max, 0, 0);
|
|
|
|
+ input_set_abs_params(input_dev, ABS_MT_ORIENTATION, 0, 1, 0, 0);
|
|
|
|
+ /* fall through */
|
|
|
|
+
|
|
|
|
+ case WACOM_27QHDT:
|
|
|
|
+ case MTSCREEN:
|
|
|
|
+ case MTTPC:
|
|
|
|
+ case MTTPC_B:
|
|
|
|
+ case TABLETPC2FG:
|
|
|
|
+ input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_DIRECT);
|
|
|
|
+ /*fall through */
|
|
|
|
+
|
|
|
|
+ case TABLETPC:
|
|
|
|
+ case TABLETPCE:
|
|
|
|
+ __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case INTUOSHT:
|
|
|
|
+ input_dev->evbit[0] |= BIT_MASK(EV_SW);
|
|
|
|
+ __set_bit(SW_MUTE_DEVICE, input_dev->swbit);
|
|
|
|
+ /* fall through */
|
|
|
|
+
|
|
|
|
+ case BAMBOO_PT:
|
|
|
|
+ if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
|
|
|
|
+ input_set_abs_params(input_dev,
|
|
|
|
+ ABS_MT_TOUCH_MAJOR,
|
|
|
|
+ 0, features->x_max, 0, 0);
|
|
|
|
+ input_set_abs_params(input_dev,
|
|
|
|
+ ABS_MT_TOUCH_MINOR,
|
|
|
|
+ 0, features->y_max, 0, 0);
|
|
}
|
|
}
|
|
|
|
+ input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case BAMBOO_PAD:
|
|
case BAMBOO_PAD:
|
|
- __clear_bit(ABS_MISC, input_dev->absbit);
|
|
|
|
input_mt_init_slots(input_dev, features->touch_max,
|
|
input_mt_init_slots(input_dev, features->touch_max,
|
|
INPUT_MT_POINTER);
|
|
INPUT_MT_POINTER);
|
|
__set_bit(BTN_LEFT, input_dev->keybit);
|
|
__set_bit(BTN_LEFT, input_dev->keybit);
|