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-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html