Here there is a patch to invert the X and Y axes, as my controller swaps it: Signed-off-by: Matteo Croce <matteo@xxxxxxxxxxx> --- a/drivers/input/touchscreen/usbtouchscreen.c 2008-09-18 18:50:44.294868149 +0200 +++ b/drivers/input/touchscreen/usbtouchscreen.c 2008-09-18 18:50:44.226867816 +0200 @@ -56,8 +56,16 @@ #define DRIVER_DESC "USB Touchscreen Driver" static int swap_xy; +static int invert_x; +static int invert_y; + module_param(swap_xy, bool, 0644); +module_param(invert_x, bool, 0644); +module_param(invert_y, bool, 0644); + MODULE_PARM_DESC(swap_xy, "If set X and Y axes are swapped."); +MODULE_PARM_DESC(invert_x, "If set X axe is inverted."); +MODULE_PARM_DESC(invert_y, "If set Y axe is inverted."); /* device specifc data/functions */ struct usbtouch_usb; @@ -683,6 +691,7 @@ unsigned char *pkt, int len) { struct usbtouch_device_info *type = usbtouch->type; + int x, y; if (!type->read_data(usbtouch, pkt)) return; @@ -690,12 +699,22 @@ 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; + if(invert_x) + x = type->max_yc - (x - type->min_yc); + if(invert_y) + y = type->max_xc - (y - type->min_xc); } 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); -- 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