From: Holger Schurig <[EMAIL PROTECTED]> Generic calibration support for usbtouchscreen.
Signed-off-by: Holger Schurig <[EMAIL PROTECTED]> --- With build-in calibration support, the "swap_xy" kernel parameter vanishes and usbtouchscreen instead gains a new kernel-parameter which holds 7 integers. This is used to calibrate the resulting output of the driver. Let x_o and y_o be the original x,y coordinate, as reported from the device. Then x_r,y_r (the x,y coordinate reported to the input event subsystem) are: x_r = ( a*x_o + b*y_o + c ) / s y_r = ( c*x_o + d*y_o + e ) / s The default values for (a,b,c,d,e,s) are (1,0,0,0,1,0,1). To simulate swap_xy, one would set them to (0,1,0,1,0,0,1). Once can also use swap_x or swap_y alone, or define other, linear transpositions. The algorithm used is the same as in Qt/Embedded 3.x for the QWSCalibratedMouseHandler. This interface allows re-calibration at runtime, without restarting the X-Server or any other event consumer. Please review this patch and schedule it for inclusion once 2.6.19 comes out. --- linux.orig/drivers/usb/input/Kconfig +++ linux/drivers/usb/input/Kconfig @@ -219,6 +219,32 @@ To compile this driver as a module, choose M here: the module will be called usbtouchscreen. +config USB_TOUCHSCREEN_CALIBRATE + default n + bool "Calibration support" + depends on USB_TOUCHSCREEN + ---help--- + With build-in calibration support, the "swap_xy" kernel parameter + vanishes and usbtouchscreen instead gains a new kernel-parameter + which hold 7 integers. You can also access this with cat/echo + via /sys/module/usbtouchscreen/parameters/calibration + + This is used to calibrate the resulting output of the driver. Let + x_o and y_o be the original x,y coordinate, as reported from the + device. Then x_r,y_r (the x,y coordinate reported to the input event + subsystem) are: + + x_r = ( a*x_o + b*y_o + c ) / s + y_r = ( c*x_o + d*y_o + e ) / s + + The default values for (a,b,c,d,e,s) are (1,0,0,0,1,0,1). To + simulate swap_xy, one would set them to (0,1,0,1,0,0,1). + + This interface allows re-calibration at runtime, without + restarting the X-Server or any other event consumer. + + If unsure, say N. + config USB_TOUCHSCREEN_DMC_TSC10 default y bool "DMC TSC-10 device support" if EMBEDDED --- linux.orig/drivers/usb/input/usbtouchscreen.c +++ linux/drivers/usb/input/usbtouchscreen.c @@ -49,9 +49,16 @@ #define DRIVER_AUTHOR "Daniel Ritz <[EMAIL PROTECTED]>" #define DRIVER_DESC "USB Touchscreen Driver" +#ifdef CONFIG_USB_TOUCHSCREEN_CALIBRATE +static int cal[7] = {1, 0, 0, 0, 1, 0, 1 }; +module_param_array_named(calibration, cal, int, NULL, 0644); +MODULE_PARM_DESC(calibrate, "calibration data"); + +#else static int swap_xy; module_param(swap_xy, bool, 0644); MODULE_PARM_DESC(swap_xy, "If set X and Y axes are swapped."); +#endif /* device specifc data/functions */ struct usbtouch_usb; @@ -499,6 +506,12 @@ input_report_key(usbtouch->input, BTN_TOUCH, touch); +#ifdef CONFIG_USB_TOUCHSCREEN_CALIBRATE + if (cal[6]==0) + cal[6] = 1; + input_report_abs(usbtouch->input, ABS_X, (cal[0]*x + cal[1]*y + cal[2])/cal[6] ); + input_report_abs(usbtouch->input, ABS_Y, (cal[3]*x + cal[4]*y + cal[5])/cal[6] ); +#else if (swap_xy) { input_report_abs(usbtouch->input, ABS_X, y); input_report_abs(usbtouch->input, ABS_Y, x); @@ -506,6 +519,7 @@ input_report_abs(usbtouch->input, ABS_X, x); input_report_abs(usbtouch->input, ABS_Y, y); } +#endif if (type->max_press) input_report_abs(usbtouch->input, ABS_PRESSURE, press); input_sync(usbtouch->input); -- M&N Solutions GmbH Holger Schurig Dieselstr. 18 61191 Rosbach 06003/9141-15 - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/