I'm using ecore_fb successfully to provide touchscreen events to my
application. However, my touchscreen driver does not support
kernel-level calibration.
Attached is a patch that detects if the TS_SET_CAL/TS_GET_CAL ioctls
fail, and instead applies the calibration within ecore_fb_ts_fd_handler.
--
Simon Poole
www.appliancestudio.com
--- ecore-0.9.9.007.orig/src/lib/ecore_fb/ecore_fb.c 2005-03-02
06:53:36.000000000 +0000
+++ ecore-0.9.9.007/src/lib/ecore_fb/ecore_fb.c 2005-05-25 12:44:04.000000000
+0000
@@ -128,6 +128,9 @@
static double _ecore_fb_double_click_time = 0.25;
+static struct _Ecore_Fb_Ts_Calibrate _ecore_fb_ts_cal = {1,1,0,0,0};
+static int _ecore_fb_ts_apply_cal = 0;
+
static const char *_ecore_fb_kbd_syms[128 * 6] =
{
#include "ecore_fb_keytab.h"
@@ -513,7 +516,10 @@
cal.yscale = yscale;
cal.ytrans = ytrans;
cal.xyswap = xyswap;
- ioctl(_ecore_fb_ts_fd, TS_SET_CAL, (void *)&cal);
+ if (ioctl(_ecore_fb_ts_fd, TS_SET_CAL, (void *)&cal)) {
+ _ecore_fb_ts_cal = cal;
+ _ecore_fb_ts_apply_cal = 1;
+ }
}
/**
@@ -532,7 +538,14 @@
Ecore_Fb_Ts_Calibrate cal;
if (_ecore_fb_ts_fd < 0) return;
- ioctl(_ecore_fb_ts_fd, TS_GET_CAL, (void *)&cal);
+ if (!_ecore_fb_ts_apply_cal) {
+ if (ioctl(_ecore_fb_ts_fd, TS_GET_CAL, (void *)&cal)) {
+ _ecore_fb_ts_cal = cal;
+ }
+ }
+ if (_ecore_fb_ts_apply_cal) {
+ cal = _ecore_fb_ts_cal;
+ }
if (xscale) *xscale = cal.xscale;
if (xtrans) *xtrans = cal.xtrans;
if (yscale) *yscale = cal.yscale;
@@ -787,8 +800,13 @@
if (v < num) return 1;
t = ecore_time_get();
_ecore_fb_ts_event_byte_count = 0;
- x = _ecore_fb_ts_event.x;
- y = _ecore_fb_ts_event.y;
+ if (_ecore_fb_ts_apply_cal) {
+ x = ((_ecore_fb_ts_cal.xscale * _ecore_fb_ts_event.x) >> 8) +
_ecore_fb_ts_cal.xtrans;
+ y = ((_ecore_fb_ts_cal.yscale * _ecore_fb_ts_event.y) >> 8) +
_ecore_fb_ts_cal.ytrans;
+ } else {
+ x = _ecore_fb_ts_event.x;
+ y = _ecore_fb_ts_event.y;
+ }
pressure = _ecore_fb_ts_event.pressure;
/* add event to queue */
/* always add a move event */