[PATCH] usb: generic calibration support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux