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 */

Reply via email to