]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Input: wacom - unify outbound support for Cintiq and Intuos series
authorPing Cheng <pinglinux@gmail.com>
Sat, 12 Apr 2014 20:44:00 +0000 (13:44 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Sat, 19 Apr 2014 21:01:26 +0000 (14:01 -0700)
Signed-off-by: Ping Cheng <pingc@wacom.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/tablet/wacom_wac.c
drivers/input/tablet/wacom_wac.h

index 05f371df6c400a882621c13509f6a13a40eed077..a4d8f1d9e74fff4f9f75ac03b05b07a753f457e4 100644 (file)
@@ -488,6 +488,8 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
                input_report_key(input, BTN_TOUCH, 0);
                input_report_abs(input, ABS_PRESSURE, 0);
                input_report_abs(input, ABS_DISTANCE, wacom->features.distance_max);
+               if (features->quirks & WACOM_QUIRK_MULTI_INPUT)
+                       wacom->shared->stylus_in_proximity = true;
        }
 
        /* Exit report */
@@ -562,6 +564,55 @@ static void wacom_intuos_general(struct wacom_wac *wacom)
        }
 }
 
+static bool wacom_intuos_outbound(struct wacom_wac *wacom)
+{
+       struct wacom_features *features = &wacom->features;
+       unsigned char *data = wacom->data;
+       struct input_dev *input = wacom->input;
+       unsigned int bound = 200;
+       bool outbound = false;
+
+       /* Intuos and old Cintiqs use ready bit for outbound tracking */
+       if (!(data[1] & 0x40))
+               outbound = true;
+
+       /* New Cintiqs have 200 counts of outbound */
+       if (features->type >= WACOM_21UX2 && features->type <= WACOM_13HD) {
+               if (wacom->x_mapped < bound) {
+                       wacom->x_mapped = 0;
+                       outbound = true;
+               } else {
+                       wacom->x_mapped -= bound;
+                       if (wacom->x_mapped > features->x_max) {
+                               wacom->x_mapped = features->x_max;
+                               outbound = true;
+                       }
+               }
+
+               if (wacom->y_mapped < bound) {
+                       wacom->y_mapped = 0;
+                       outbound = true;
+               } else {
+                       wacom->y_mapped -= bound;
+                       if (wacom->y_mapped > features->y_max) {
+                               wacom->y_mapped = features->y_max;
+                               outbound = true;
+                       }
+               }
+       }
+
+       /* Intuos supports outbound tracking */
+       if (outbound && (features->type >= INTUOS3S && features->type <= INTUOSPL)) {
+               input_report_abs(input, ABS_X, wacom->x_mapped);
+               input_report_abs(input, ABS_Y, wacom->y_mapped);
+               input_report_abs(input, ABS_MISC, wacom->id[0]);
+               input_report_key(input, wacom->tool[0], 1);
+               input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[0]);
+       }
+
+       return outbound;
+}
+
 static int wacom_intuos_irq(struct wacom_wac *wacom)
 {
        struct wacom_features *features = &wacom->features;
@@ -802,17 +853,22 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
                return 0;
        }
 
-       /* Cintiq doesn't send data when RDY bit isn't set */
-       if (features->type == CINTIQ && !(data[1] & 0x40))
-                 return 0;
+       if (features->type >= INTUOS3S) {
+               wacom->x_mapped = (data[2] << 9) | (data[3] << 1) | ((data[9] >> 1) & 1);
+               wacom->y_mapped = (data[4] << 9) | (data[5] << 1) | (data[9] & 1);
+       } else {
+               wacom->x_mapped = be16_to_cpup((__be16 *)&data[2]);
+               wacom->y_mapped = be16_to_cpup((__be16 *)&data[4]);
+       }
+
+       if (wacom_intuos_outbound(wacom))
+               return 0;
 
+       input_report_abs(input, ABS_X, wacom->x_mapped);
+       input_report_abs(input, ABS_Y, wacom->y_mapped);
        if (features->type >= INTUOS3S) {
-               input_report_abs(input, ABS_X, (data[2] << 9) | (data[3] << 1) | ((data[9] >> 1) & 1));
-               input_report_abs(input, ABS_Y, (data[4] << 9) | (data[5] << 1) | (data[9] & 1));
                input_report_abs(input, ABS_DISTANCE, ((data[9] >> 2) & 0x3f));
        } else {
-               input_report_abs(input, ABS_X, be16_to_cpup((__be16 *)&data[2]));
-               input_report_abs(input, ABS_Y, be16_to_cpup((__be16 *)&data[4]));
                input_report_abs(input, ABS_DISTANCE, ((data[9] >> 3) & 0x1f));
        }
 
@@ -2132,10 +2188,10 @@ static const struct wacom_features wacom_features_0x317 =
          63, INTUOSPL, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
          .touch_max = 16 };
 static const struct wacom_features wacom_features_0xF4 =
-       { "Wacom Cintiq 24HD",       WACOM_PKGLEN_INTUOS,   104480, 65600, 2047,
+       { "Wacom Cintiq 24HD",       WACOM_PKGLEN_INTUOS,   104080, 65200, 2047,
          63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
 static const struct wacom_features wacom_features_0xF8 =
-       { "Wacom Cintiq 24HD touch", WACOM_PKGLEN_INTUOS,   104480, 65600, 2047, /* Pen */
+       { "Wacom Cintiq 24HD touch", WACOM_PKGLEN_INTUOS,   104080, 65200, 2047, /* Pen */
          63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf6 };
 static const struct wacom_features wacom_features_0xF6 =
@@ -2151,7 +2207,7 @@ static const struct wacom_features wacom_features_0xC6 =
        { "Wacom Cintiq 12WX",    WACOM_PKGLEN_INTUOS,    53020, 33440, 1023,
          63, WACOM_BEE, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
 static const struct wacom_features wacom_features_0x304 =
-       { "Wacom Cintiq 13HD",    WACOM_PKGLEN_INTUOS,    59552, 33848, 1023,
+       { "Wacom Cintiq 13HD",    WACOM_PKGLEN_INTUOS,    59152, 33448, 1023,
          63, WACOM_13HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
 static const struct wacom_features wacom_features_0xC7 =
        { "Wacom DTU1931",        WACOM_PKGLEN_GRAPHIRE,  37832, 30305,  511,
@@ -2166,23 +2222,23 @@ static const struct wacom_features wacom_features_0xFB =
        { "Wacom DTU1031",        WACOM_PKGLEN_DTUS,      22096, 13960,  511,
          0, DTUS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
 static const struct wacom_features wacom_features_0x57 =
-       { "Wacom DTK2241",        WACOM_PKGLEN_INTUOS,    95840, 54260, 2047,
+       { "Wacom DTK2241",        WACOM_PKGLEN_INTUOS,    95440, 53860, 2047,
          63, DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES};
 static const struct wacom_features wacom_features_0x59 = /* Pen */
-       { "Wacom DTH2242",        WACOM_PKGLEN_INTUOS,    95840, 54260, 2047,
+       { "Wacom DTH2242",        WACOM_PKGLEN_INTUOS,    95440, 53860, 2047,
          63, DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5D };
 static const struct wacom_features wacom_features_0x5D = /* Touch */
        { "Wacom DTH2242",       .type = WACOM_24HDT,
          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x59, .touch_max = 10 };
 static const struct wacom_features wacom_features_0xCC =
-       { "Wacom Cintiq 21UX2",   WACOM_PKGLEN_INTUOS,    87200, 65600, 2047,
+       { "Wacom Cintiq 21UX2",   WACOM_PKGLEN_INTUOS,    86400, 64800, 2047,
          63, WACOM_21UX2, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
 static const struct wacom_features wacom_features_0xFA =
-       { "Wacom Cintiq 22HD",    WACOM_PKGLEN_INTUOS,    95840, 54260, 2047,
+       { "Wacom Cintiq 22HD",    WACOM_PKGLEN_INTUOS,    95440, 53860, 2047,
          63, WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
 static const struct wacom_features wacom_features_0x5B =
-       { "Wacom Cintiq 22HDT", WACOM_PKGLEN_INTUOS,      95840, 54260, 2047,
+       { "Wacom Cintiq 22HDT", WACOM_PKGLEN_INTUOS,      95440, 53860, 2047,
          63, WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5e };
 static const struct wacom_features wacom_features_0x5E =
@@ -2325,7 +2381,7 @@ static const struct wacom_features wacom_features_0x6004 =
        { "ISD-V4",               WACOM_PKGLEN_GRAPHIRE,  12800,  8000,  255,
          0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
 static const struct wacom_features wacom_features_0x0307 =
-       { "Wacom ISDv5 307", WACOM_PKGLEN_INTUOS,  59552,  33848, 2047,
+       { "Wacom ISDv5 307", WACOM_PKGLEN_INTUOS,  59152,  33448, 2047,
          63, CINTIQ_HYBRID, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x309 };
 static const struct wacom_features wacom_features_0x0309 =
index f69c0ebe7fa90d66a65b065ea838550e538b742d..9f947c31ec2caabe7be5cb3106f9dd6af6726074 100644 (file)
@@ -93,9 +93,9 @@ enum {
        DTK,
        WACOM_24HD,
        CINTIQ_HYBRID,
+       WACOM_13HD,
        CINTIQ,
        WACOM_BEE,
-       WACOM_13HD,
        WACOM_MO,
        WIRELESS,
        BAMBOO_PT,
@@ -148,6 +148,8 @@ struct wacom_wac {
        int tool[2];
        int id[2];
        __u32 serial[2];
+       unsigned int x_mapped;
+       unsigned int y_mapped;
        struct wacom_features features;
        struct wacom_shared *shared;
        struct input_dev *input;