Re: [PATCH v3] usbtouchscreen: add option for inverting X or Y axis

From: Dmitry Torokhov
Date: Mon Jul 27 2015 - 18:28:32 EST


On Tue, Jul 28, 2015 at 12:16:01AM +0200, Philippe Coval wrote:
> Invert Y is needed (together with swap XY) for some touchscreens,
> at least for some of them :
>
> - CarTft 8in4 (type=eGalax, USB=0eef:0001)
> - LeadingTouch
>
> Since there is not guarantee that
> those above devices will all behave the same,
> it's safer to configure them userland using udev rules.
>
> This way is safer than hardcoding options per "recognized" model,
> and possible regressions will be avoided in a first place.

Does the following still work?

Thanks.

--
Dmitry

Input: usbtouchscreen - add option for inverting X or Y axis

From: Philippe Coval <rzr@xxxxxxx>

Invert Y is needed (together with swap XY) for some touchscreens,
at least for some of them:

- CarTft 8in4 (type=eGalax, USB=0eef:0001)
- LeadingTouch

Since there is not guarantee that those above devices will all behave the
same, it's safer to configure them from userland using udev rules.

This way is safer than hard-coding options per "recognized" model,
and possible regressions will be avoided in a first place.

Credits-to: Ondrej Zary <linux@xxxxxxxxxxxxxxxxxxxx>
Link: https://lkml.org/lkml/2015/6/7/191
Bug-Link: https://bugs.tizen.org/jira/browse/TC-2522
Signed-off-by: Philippe Coval <philippe.coval@xxxxxxxxxxxxxxxxxxx>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx>
---
drivers/input/touchscreen/usbtouchscreen.c | 25 ++++++++++++++++++-------
1 file changed, 18 insertions(+), 7 deletions(-)

diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c
index 2c41107..d283077 100644
--- a/drivers/input/touchscreen/usbtouchscreen.c
+++ b/drivers/input/touchscreen/usbtouchscreen.c
@@ -64,6 +64,14 @@ static bool swap_xy;
module_param(swap_xy, bool, 0644);
MODULE_PARM_DESC(swap_xy, "If set X and Y axes are swapped.");

+static bool invert_x;
+module_param(invert_x, bool, 0644);
+MODULE_PARM_DESC(invert_x, "Invert X axis.");
+
+static bool 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);
MODULE_PARM_DESC(hwcalib_xy, "If set hw-calibrated X/Y are used if available");
@@ -1312,13 +1320,16 @@ 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);
- } else {
- input_report_abs(usbtouch->input, ABS_X, usbtouch->x);
- input_report_abs(usbtouch->input, ABS_Y, usbtouch->y);
- }
+ if (swap_xy)
+ swap(usbtouch->y, usbtouch->x);
+ if (invert_x)
+ usbtouch->x = type->max_xc - usbtouch->x + type->min_xc;
+ if (invert_y)
+ usbtouch->y = type->max_yc - usbtouch->y + type->min_yc;
+
+ input_report_abs(usbtouch->input, ABS_X, usbtouch->x);
+ input_report_abs(usbtouch->input, ABS_Y, usbtouch->y);
+
if (type->max_press)
input_report_abs(usbtouch->input, ABS_PRESSURE, usbtouch->press);
input_sync(usbtouch->input);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/