add Auto set TS calibration Function
authorsrt <srt@rock-chips.com>
Tue, 14 Sep 2010 02:17:18 +0000 (10:17 +0800)
committersrt <srt@rock-chips.com>
Tue, 14 Sep 2010 02:17:18 +0000 (10:17 +0800)
drivers/input/touchscreen/Kconfig
drivers/input/touchscreen/Makefile
drivers/input/touchscreen/calibration_ts.c
drivers/input/touchscreen/calibration_ts.h
drivers/input/touchscreen/xpt2046_cbn_ts.c

index 7e3975d838459a7f861596e1ca4dd5b6fd612254..ca38b951ac85e42d4333333e555c328dfc9a2ffb 100644 (file)
@@ -597,4 +597,16 @@ config TOUCHSCREEN_PCAP
 
          To compile this driver as a module, choose M here: the
          module will be called pcap_ts.
+         
+choice 
+  prompt "Touch panel resolution"
+  default TP_800x480
+
+  config TP_800x480
+  bool "800x480"
+
+  config TP_1024x600
+  bool "1024x600"
+
+endchoice
 endif
index e865ae66fc465ea6ca3a2d2b521d16d6ce160a4a..d2c95118dde5ac3fdb172ef97e980a27a7d92718 100644 (file)
@@ -44,7 +44,7 @@ obj-$(CONFIG_TOUCHSCREEN_WM97XX_ZYLONITE)     += zylonite-wm97xx.o
 obj-$(CONFIG_TOUCHSCREEN_W90X900)      += w90p910_ts.o
 obj-$(CONFIG_TOUCHSCREEN_PCAP)         += pcap_ts.o
 obj-$(CONFIG_TOUCHSCREEN_XPT2046_SPI)          += xpt2046_ts.o
-obj-$(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)              += xpt2046_cbn_ts.o calibration_ts.o largenum_ts.o
+obj-$(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)              += xpt2046_cbn_ts.o calibration_ts.o largenum_ts.o calib_iface_ts.o
 obj-$(CONFIG_TOUCHSCREEN_XPT2046_320X480_SPI)          += xpt2046_ts_320X480.o
 #obj-$(CONFIG_TOUCHSCREEN_XPT2046_320X480_CBN_SPI)             += xpt2046_cbn_ts.o calibration_ts.o largenum_ts.o
 obj-$(CONFIG_TOUCHSCREEN_IT7250) += ctp_it7250.o
index b39c5e6b02dd0d44c4b82526ecd77d629b99f8b5..4da9f9d6a1c3470f3ba064f13ff336cd76be6af3 100644 (file)
@@ -38,8 +38,24 @@ typedef struct {
 CALIBRATION_PARAMETER, *PCALIBRATION_PARAMETER;\r
 \r
 static unsigned char            v_Calibrated = 0;\r
-static CALIBRATION_PARAMETER    v_CalcParam;\r
-\r
+static CALIBRATION_PARAMETER    v_CalcParam ={\r
+       .a1             =18670 ,\r
+       .b1             =98,\r
+       .c1             = -2230109,\r
+       .a2     = 291,\r
+       .b2             = 12758,\r
+       .c2             = -5118934,\r
+       .delta  = 91931,\r
+};\r
+static CALIBRATION_PARAMETER v_CalcParam_bak = {\r
+       .a1=17704 ,\r
+       .b1=-20,\r
+       .c1= -1460283,\r
+       .a2   = 382,\r
+       .b2  = 12685,\r
+       .c2  = -5595261,\r
+       .delta   = 88403,\r
+};\r
 unsigned char\r
 ErrorAnalysis(\r
     int   cCalibrationPoints,     //@PARM The number of calibration points\r
@@ -320,26 +336,30 @@ TouchPanelCalibrateAPoint(
 {\r
     int   x, y;\r
 \r
-    if ( !v_Calibrated )\r
+    if ( v_Calibrated )\r
     {\r
-        *pCalX = 200; //UncalX;\r
-        *pCalY = 160; //UncalY;\r
-        return;\r
-    }\r
+\r
      //\r
      // Note the *4 in the expression below.  This is a workaround\r
      // on behalf of gwe.  It provides a form of\r
      // sub-pixel accuracy desirable for inking\r
      //\r
-    x = (v_CalcParam.a1 * UncalX + v_CalcParam.b1 * UncalY +\r
-         v_CalcParam.c1) * 4 / v_CalcParam.delta;\r
-    y = (v_CalcParam.a2 * UncalX + v_CalcParam.b2 * UncalY +\r
-         v_CalcParam.c2) * 4 / v_CalcParam.delta;\r
+       x = (v_CalcParam.a1 * UncalX + v_CalcParam.b1 * UncalY +\r
+               v_CalcParam.c1) * 4 / v_CalcParam.delta;\r
+       y = (v_CalcParam.a2 * UncalX + v_CalcParam.b2 * UncalY +\r
+               v_CalcParam.c2) * 4 / v_CalcParam.delta;\r
+     }\r
+     else{\r
+               x = (v_CalcParam_bak.a1 * UncalX + v_CalcParam_bak.b1 * UncalY +\r
+                       v_CalcParam_bak.c1) * 4 / v_CalcParam_bak.delta;\r
+               y = (v_CalcParam_bak.a2 * UncalX + v_CalcParam_bak.b2 * UncalY +\r
+                       v_CalcParam_bak.c2) * 4 / v_CalcParam_bak.delta;\r
+     }\r
     if ( x < 0 ){\r
         x = 0;\r
     }\r
 \r
-    if y < 0 ){\r
+    if  (y < 0 ){\r
         y = 0;\r
     }\r
 \r
@@ -409,6 +429,7 @@ ErrorAnalysis(
                 x,\r
                 y\r
                 );\r
+        \r
         dx = x - pScreenXBuffer[i];\r
         dy = y - pScreenYBuffer[i];\r
         err = dx * dx + dy * dy;\r
@@ -422,17 +443,150 @@ ErrorAnalysis(
 \r
     if (maxErr < (errThreshold * errThreshold))\r
     {\r
+                printk(" v_CalcParam.a1=%d \n"  \r
+                       "v_CalcParam.b1=%d\n"   \r
+                       "v_CalcParam.c1= %d\n"   \r
+                        " v_CalcParam.a2   = %d\n" \r
+                       " v_CalcParam.b2  = %d\n"       \r
+                       " v_CalcParam.c2  = %d\n"\r
+                       "v_CalcParam.delta   = %d\n",    \r
+                        v_CalcParam.a1 , \\r
+                       v_CalcParam.b1 ,        \\r
+                       v_CalcParam.c1 ,        \\r
+                       v_CalcParam.a2 ,        \\r
+                       v_CalcParam.b2, \\r
+                       v_CalcParam.c2 ,        \\r
+                       v_CalcParam.delta);\r
         return 1;\r
     }\r
     else\r
     {\r
-        memset(&v_CalcParam, 0, sizeof(v_CalcParam));\r
-        v_Calibrated = 0;\r
-        \r
+       memset(&v_CalcParam, 0, sizeof(v_CalcParam));\r
+       v_Calibrated = 0;\r
+       v_CalcParam.a1 =  v_CalcParam_bak.a1;\r
+       v_CalcParam.b1 = v_CalcParam_bak.b1 ;\r
+       v_CalcParam.c1=  v_CalcParam_bak.c1;\r
+       v_CalcParam.a2 = v_CalcParam_bak.a2;\r
+       v_CalcParam.b2  = v_CalcParam_bak.b2;\r
+       v_CalcParam.c2 =  v_CalcParam_bak.c2;\r
+       v_CalcParam.delta=  v_CalcParam_bak.delta;\r
         return 0;\r
     }\r
 }\r
 \r
+#define FILTER_BUF_LEN 8\r
+typedef struct \r
+{\r
+       unsigned short x;\r
+       unsigned short y;\r
+}P;\r
+static P sTouchFilterBuff[FILTER_BUF_LEN];\r
+static int sBuffIndex = 0;\r
+static P sReportFilter = {0,0};\r
+void ClearBuff(void)\r
+{\r
+       memset(sTouchFilterBuff,0,FILTER_BUF_LEN*sizeof(P));\r
+       sReportFilter.x = 0;\r
+       sReportFilter.y = 0;\r
+       sBuffIndex = 0;\r
+}\r
+void addToBuff(int* x,int* y)\r
+{      \r
+       int index;\r
+       index=sBuffIndex++%FILTER_BUF_LEN;\r
+       sTouchFilterBuff[index].x = *x;\r
+       sTouchFilterBuff[index].y = *y;\r
+}\r
+#define TS_ERR_TDOWN -1\r
+#define TS_ERR_LOWBUF -2\r
+//#define TS_MINX      138\r
+//#define TS_MINY      375\r
+//#define TS_MAXX      3935\r
+//#define TS_MAXY      3920\r
+//#define TS_xISVALID(x) (x>=TS_MINX&&x<=TS_MAXX)\r
+#define TS_isINVALID(X,Y) (X==4095||Y==4095||X==0||Y==0)\r
+#define ABS(x) ((x)>0?(x):-(x))\r
+static P spoint;\r
+int TouchFilter(unsigned short* x,unsigned short* y,bool isdown)\r
+{\r
+#if 1\r
+       int ret = 0;\r
+       if(isdown==0&&sBuffIndex==0)\r
+               {\r
+               spoint.x = *x;\r
+               spoint.y = *y;\r
+               ClearBuff();\r
+               ret=TS_ERR_TDOWN;\r
+               }\r
+       if(!TS_isINVALID(x,y))\r
+               addToBuff(x,y);\r
+       if(sBuffIndex<FILTER_BUF_LEN)\r
+               ret=TS_ERR_LOWBUF;\r
+       if(ret==0)\r
+               {\r
+               P *p = sTouchFilterBuff;\r
+               P *p1 = p+1;\r
+               int index =0;\r
+               while(1)\r
+                       {\r
+                       if(ABS(p->x-p1->x)<60||ABS(p->y-p1->y)<60)\r
+                               {\r
+                               *x=spoint.x;\r
+                               *y=spoint.y;\r
+                               //printk("p(%d,%d)      p1(%d,%d)\n",p->x,p->y,p1->x,p1->y);\r
+                               //ret=-3;\r
+                               break;\r
+                               }\r
+                       p++;\r
+                       p1++;\r
+                       if(++index>=FILTER_BUF_LEN-1)break;\r
+                       }\r
+               spoint.x=*x;\r
+               spoint.y=*y;\r
+               }\r
+       \r
+#else  \r
+       int ret = 0;\r
+       if(isdown==0&&sBuffIndex==0)\r
+               {\r
+               ClearBuff();\r
+               ret=TS_ERR_TDOWN;\r
+               }\r
+       if(!TS_isINVALID(x,y))\r
+               addToBuff(x,y);\r
+       if(sBuffIndex<FILTER_BUF_LEN)\r
+               ret=TS_ERR_LOWBUF;\r
+       if(ret==0)\r
+               {\r
+               P adp;\r
+               int index =0;\r
+               while(1)\r
+                       {\r
+                       adp.x+=sTouchFilterBuff[index].x;\r
+                       adp.y+=sTouchFilterBuff[index].y;\r
+                       if(++index>=FILTER_BUF_LEN)break;\r
+                       }\r
+               *x = adp.x/FILTER_BUF_LEN;\r
+               *y = adp.y/FILTER_BUF_LEN;\r
+               }\r
+#endif\r
+       return ret;\r
+       \r
+}\r
+\r
+#define SLAP_X 2\r
+#define SLAP_Y 0\r
+void TouchReportFilter(unsigned short* x,unsigned short* y)\r
+{\r
+       if((sReportFilter.x==0&&sReportFilter.y==0)||\r
+               (ABS(sReportFilter.x - *x)>SLAP_X&&ABS(sReportFilter.y - *y)>SLAP_Y))\r
+               {\r
+               sReportFilter.x = *x;\r
+               sReportFilter.y = *y;\r
+               }\r
+       *x = sReportFilter.x;\r
+       *y = sReportFilter.y;\r
+}\r
 #if 0\r
 int main(void)\r
 {\r
index 8c3b6e94866268359dd1844b05fd74e4e9bb06a4..f11059c22c39adbce1d53de77cbd5e778570f8a1 100644 (file)
 #ifndef __DRIVERS_TOUCHSCREEN_CALIBRATION_TS_H\r
 #define __DRIVERS_TOUCHSCREEN_CALIBRATION_TS_H\r
 \r
+struct adc_point\r
+{\r
+    int x;\r
+    int y;\r
+};\r
+\r
 #define TWO_DIMENSIONAL_CALIBRATION 1\r
 \r
 #define ADC_PRECISION       12          // Precision of ADC output (in bits)\r
index 8a6b9b8575e6dd1eac759620547f76cc35ab7997..8e34fadbb5109f6525418ce7e072fadb26b129b7 100644 (file)
@@ -201,110 +201,14 @@ typedef struct
     s16 y;
 }POINT;
 
-#if (0)
-static struct xpt2046_platform_data xpt2046_info = {
-       .model                  = 2046,
-       .keep_vref_on   = 1,
-       .swap_xy                = 0,
-       .x_min                  = 0,
-       .x_max                  = 800,
-       .y_min                  = 0,
-       .y_max                  = 480,
-       .debounce_max           = 7,
-       .debounce_rep           = DEBOUNCE_REPTIME,
-       .debounce_tol           = 20,
-       .gpio_pendown           = RK2818_PIN_PE3,
-       .penirq_recheck_delay_usecs = 1,
 
-};
-#endif /* (0) */
 static void xpt2046_enable(struct xpt2046 *ts);
 static void xpt2046_disable(struct xpt2046 *ts);
 
-static POINT gADPoint;
-int screen_x[] = { 50,  750,   50,  750,  400};
-int screen_y[] = { 40,   40,  440,  440,  240};
-int uncali_x[] = {329, 3750,  331, 3757, 2046};
-int uncali_y[] = {593,  532, 3675, 3655, 2121};
-
-// This code is touch check
-static ssize_t xpt2046_mode_show(struct device_driver *drv,char *buf)
-{
-    int count;
-    
-       count = sprintf(buf,"xpt2046_mode_show:%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
-                       uncali_x[0], uncali_y[0],
-                       uncali_x[1], uncali_y[1],
-                       uncali_x[2], uncali_y[2],
-                       uncali_x[3], uncali_y[3],
-                       uncali_x[4], uncali_y[4]);
-
-       printk("buf: %s", buf);
-       
-       return count;
-}
-
-static ssize_t xpt2046_mode_store(struct device_driver * drv, const char * buf, size_t count)
-{
-    int i, j = 0;
-    char temp[5];
-
-    printk("xpt2046_mode_store: %s\n", buf);
-    
-    for (i = 0; i < 5; i++)
-    {
-        strncpy(temp, buf + 5 * (j++), 4);
-        uncali_x[i] = simple_strtol(temp, NULL, 10);
-        strncpy(temp, buf + 5 * (j++), 4);
-        uncali_y[i] = simple_strtol(temp, NULL, 10);
-        printk("SN=%d uncali_x=%d uncali_y=%d\n", 
-                i, uncali_x[i], uncali_y[i]);
-    }
-
-       return count; 
-}
-
-//This code is Touch adc simple value
-static ssize_t xpt2046_adc_show(struct device_driver *drv,char *buf)
-{
-    printk("xpt2046_adc_show: x=%d y=%d\n", gADPoint.x, gADPoint.y);
-    
-       return sprintf(buf, "%d,%d\n", gADPoint.x, gADPoint.y);
-}
+volatile struct adc_point gADPoint;
 
-static ssize_t xpt2046_cali_status(struct device_driver *drv, char *buf)
-{
-    int ret;
-    
-    ret = TouchPanelSetCalibration(4, screen_x, screen_y, uncali_x, uncali_y);
-    if (ret == 1)
-        ret = sprintf(buf, "successful\n");
-    else
-        ret = sprintf(buf, "fail\n");
-    
-    printk("xpt2046_cali_status: buf=<%s", buf);
-    
-       return ret;
-}
 
-//static DEVICE_ATTR(adc, 0666, xpt2046_adc_show, NULL);
-//static DEVICE_ATTR(calistatus, 0666, xpt2046_cali_status, NULL);
-//static DEVICE_ATTR(mode, 0666, xpt2046_mode_show, xpt2046_mode_store);
-static DRIVER_ATTR(touchadc, 0666, xpt2046_adc_show, NULL);
-static DRIVER_ATTR(calistatus, 0666, xpt2046_cali_status, NULL);
-static DRIVER_ATTR(touchcheck, 0666, xpt2046_mode_show, xpt2046_mode_store);
-#if (0)
-static struct attribute *xpt2046_attributes[] = {
-       &dev_attr_touchadc.attr,
-       &dev_attr_calistatus.attr,
-       &dev_attr_touchcheck.attr,
-       NULL,
-};
 
-static struct attribute_group xpt2046_attr_group = {
-       .attrs = xpt2046_attributes,
-};
-#endif /* (0) */
 
 static int device_suspended(struct device *dev)
 {
@@ -1028,31 +932,29 @@ static struct spi_driver xpt2046_driver = {
 
 static int __init xpt2046_init(void)
 {
-       //return spi_register_driver(&xpt2046_driver);
+       xpt2046printk("Touch panel drive XPT2046 driver init...\n");
+       
+       gADPoint.x = 0;
+       gADPoint.y = 0;
+       
        int ret = spi_register_driver(&xpt2046_driver);
-
-    if (ret == 0)
+    if (ret)
     {
-           gADPoint.x = 0;
-           gADPoint.y = 0;
-           ret = driver_create_file(&xpt2046_driver.driver, &driver_attr_touchcheck);
-           ret += driver_create_file(&xpt2046_driver.driver, &driver_attr_touchadc);
-           ret += driver_create_file(&xpt2046_driver.driver, &driver_attr_calistatus);
+               printk("Register XPT2046 driver failed.\n");
+           return ret;
        }
-       
-       return ret;
+
+       return 0;
+
 }
-module_init(xpt2046_init);
+
 
 static void __exit xpt2046_exit(void)
 {
-       //spi_unregister_driver(&xpt2046_driver);
-       driver_remove_file(&xpt2046_driver.driver, &driver_attr_touchcheck);
-    driver_remove_file(&xpt2046_driver.driver, &driver_attr_touchadc);
-    driver_remove_file(&xpt2046_driver.driver, &driver_attr_calistatus);
-    
+       xpt2046printk("Touch panel drive XPT2046 driver exit...\n");
        spi_unregister_driver(&xpt2046_driver);
 }
+module_init(xpt2046_init);
 module_exit(xpt2046_exit);
 
 MODULE_DESCRIPTION("rk2818 spi xpt2046 TouchScreen Driver");