tech-kern archive

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

Re: uep(4)



- ``/'' typo corrected,
- no more _div(),
- use of #define directives to handle calibration values,
- debug mode only prints current (x,y) values.

--- /usr/src/sys/dev/usb/uep.c.orig     2008-11-09 12:09:41.000000000 +0000
+++ /usr/src/sys/dev/usb/uep.c  2008-12-04 20:20:47.000000000 +0000
@@ -59,6 +59,16 @@
 #include <dev/wscons/tpcalibvar.h>
 
 #define UIDSTR "eGalax USB SN000000"
+/* calibration - integer values */
+#define X_RATIO   293 
+#define X_OFFSET  -28
+#define Y_RATIO   -348
+#define Y_OFFSET  537
+/* a X_RATIO of ``312''  means : reduce by a factor 3.12 x axis amplitude */
+/* a Y_RATIO of ``-157'' means : reduce by a factor 1.57 y axis amplitude,
+   and revert y motion */
+#undef  UEP_DEBUG
+/* #define UEP_DEBUG 0 */
 
 struct uep_softc {
        USBBASEDEVICE sc_dev;
@@ -368,6 +378,9 @@
 
        usbd_get_xfer_status(xfer, NULL, NULL, &len, NULL);
 
+       /* calibration */
+       int num,denom,quot,rem ;
+
        if (status == USBD_CANCELLED)
                return;
 
@@ -416,6 +429,36 @@
 
                x = (p[3] << 7) | p[4];
                y = (p[1] << 7) | p[2];
+                
+               /* calibration */
+               
+               /* x axis */
+               num   = 100 * x ;
+               denom = X_RATIO ;
+               
+               quot  = num / denom ;
+               rem   = num % denom ;
+               
+               if (num >= 0 && rem < 0)
+                       quot++;
+               
+               x = (int) (quot) + X_OFFSET ;
+               
+               /* y axis */
+               num   = 100 * y ;
+               denom = Y_RATIO ;
+               
+               quot  = num / denom ;
+               rem   = num % denom ;
+               
+               if (num >= 0 && rem < 0)
+                       quot++;
+               
+               y = (int) (quot) + Y_OFFSET ;
+
+#ifdef UEP_DEBUG
+               printf("uep.c : (x,y) : [%d,%d].\n",x,y);
+#endif
 
                tpcalib_trans(&sc->sc_tpcalib, x, y, &x, &y);
 
-- 
n

On Wed, Dec 03, 2008 at 09:37:12PM +0100, Nicolas Jouanne wrote:
> Hello,
> 
> After hesitating a lot, I decided to post a patch a patch for uep(4), in
>  case it can help someone else.
> 
> My goal was to calibrate a 7" eGalax touchscreen mounted in a eeepc.
> 
> --- sys/dev/usb/uep.c.orig    2008-11-09 12:09:41.000000000 +0000
> +++ sys/dev/usb/uep.c 2008-11-16 14:19:39.000000000 +0000
> @@ -59,6 +59,7 @@
>  #include <dev/wscons/tpcalibvar.h>
>  
>  #define UIDSTR       "eGalax USB SN000000"
> +#undef UEP_DEBUG
>  
>  struct uep_softc {
>       USBBASEDEVICE sc_dev;
> @@ -358,6 +359,22 @@
>       return EPASSTHROUGH;
>  }
>  
> +int
> + _div(long int num, long int denom);
> +
> +int
> + _div(long int num, long int denom)
> +{
> +        /* /usr/src/lib/libc/stdlib/div.c */
> +     long int quot  = num / denom ;
> +        long int rem   = num / denom ;
> +     if (num >= 0 && rem < 0) {
> +             quot++;
> +             rem -= denom;
> +     }
> +        return (int) quot;
> +}
> +
>  void
>  uep_intr(usbd_xfer_handle xfer, usbd_private_handle addr, usbd_status status)
>  {
> @@ -416,6 +433,21 @@
>  
>               x = (p[3] << 7) | p[4];
>               y = (p[1] << 7) | p[2];
> +                
> +             /* calibration */
> +
> +#ifdef UEP_DEBUG
> +             /* pre-calibration coords */
> +             int x_before = x ;
> +             int y_before = y ;
> +#endif
> +
> +             x = _div(100*x,293) - 28 ;
> +             y = _div(100*(1805-y),349) + 20 ;
> +
> +#ifdef UEP_DEBUG
> +             printf("uep.c : (x,y) : 
> [%d->%d,%d->%d].\n",x_before,x,y_before,y);
> +#endif
>  
>               tpcalib_trans(&sc->sc_tpcalib, x, y, &x, &y);
>  
> -- 
> n

-- 
n



Home | Main Index | Thread Index | Old Index