usbtouchscreen: adds support for inverting X or Y axis (or both) 23/40023/1 sandbox/pcoval/tizen_common
authorPhilippe Coval <philippe.coval@open.eurogiciel.org>
Fri, 22 May 2015 16:05:22 +0000 (18:05 +0200)
committerPhilippe Coval <philippe.coval@open.eurogiciel.org>
Wed, 27 May 2015 08:45:24 +0000 (10:45 +0200)
Invert Y is needed (together with swap XY) for some touchscreens :

- LeadingTouch screens (at least for some of them)
- cartft 8in4 (USB ID=0eef:0001)

Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
Signed-off-by: Philippe Coval <philippe.coval@open.eurogiciel.org>
Change-Id: I3b551be8734d5d5f272c8ee8579d2233d6c11ca4

drivers/input/touchscreen/usbtouchscreen.c

index a0966331a89bb1269f358f13bc90be40161dad2c..28db033b93778287619eb1f409fdac1c069fefb0 100644 (file)
 static bool swap_xy;
 module_param(swap_xy, bool, 0644);
 MODULE_PARM_DESC(swap_xy, "If set X and Y axes are swapped.");
+static int invert_x;
+module_param(invert_x, bool, 0644);
+MODULE_PARM_DESC(invert_x, "Invert X axis.");
+static int invert_y;
+module_param(invert_y, bool, 0644);
+MODULE_PARM_DESC(invert_y, "Invert Y axis.");
 
 static bool hwcalib_xy;
 module_param(hwcalib_xy, bool, 0644);
@@ -1292,6 +1298,7 @@ static void usbtouch_process_pkt(struct usbtouch_usb *usbtouch,
                                  unsigned char *pkt, int len)
 {
        struct usbtouch_device_info *type = usbtouch->type;
+       int x, y;
 
        if (!type->read_data(usbtouch, pkt))
                        return;
@@ -1299,12 +1306,20 @@ static void usbtouch_process_pkt(struct usbtouch_usb *usbtouch,
        input_report_key(usbtouch->input, BTN_TOUCH, usbtouch->touch);
 
        if (swap_xy) {
-               input_report_abs(usbtouch->input, ABS_X, usbtouch->y);
-               input_report_abs(usbtouch->input, ABS_Y, usbtouch->x);
+               x = usbtouch->y;
+               y = usbtouch->x;
        } else {
-               input_report_abs(usbtouch->input, ABS_X, usbtouch->x);
-               input_report_abs(usbtouch->input, ABS_Y, usbtouch->y);
+               x = usbtouch->x;
+               y = usbtouch->y;
        }
+       if (invert_x)
+               x = type->max_xc - x + type->min_xc;
+       if (invert_y)
+               y = type->max_yc - y + type->min_yc;
+
+       input_report_abs(usbtouch->input, ABS_X, x);
+       input_report_abs(usbtouch->input, ABS_Y, y);
+
        if (type->max_press)
                input_report_abs(usbtouch->input, ABS_PRESSURE, usbtouch->press);
        input_sync(usbtouch->input);