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
{\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
x,\r
y\r
);\r
+ \r
dx = x - pScreenXBuffer[i];\r
dy = y - pScreenYBuffer[i];\r
err = dx * dx + dy * dy;\r
\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
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)
{
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");