From: Holger Schurig <hs4233@mail.mn-solutions.de>
To: daniel.ritz@gmx.ch
Cc: linux-kernel@vger.kernel.org, linux-usb-devel@lists.sourceforge.net
Subject: [PATCH] usb: generic calibration support
Date: Thu, 16 Nov 2006 11:25:38 +0100 [thread overview]
Message-ID: <200611161125.38901.hs4233@mail.mn-solutions.de> (raw)
From: Holger Schurig <hs4233@mail.mn-solutions.de>
Generic calibration support for usbtouchscreen.
Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
---
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 <daniel.ritz@gmx.ch>"
#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
next reply other threads:[~2006-11-16 10:25 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-11-16 10:25 Holger Schurig [this message]
2006-11-16 23:24 ` Daniel Ritz
2006-11-17 8:12 ` Holger Schurig
2006-11-17 14:16 ` Dmitry Torokhov
2006-11-17 14:53 ` Holger Schurig
2006-11-17 15:22 ` Richard Purdie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200611161125.38901.hs4233@mail.mn-solutions.de \
--to=hs4233@mail.mn-solutions.de \
--cc=daniel.ritz@gmx.ch \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®