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/

Reply via email to