#include <linux/hrtimer.h>\r
#include <linux/i2c.h>\r
#include <linux/input.h>\r
+#include <linux/input/mt.h>\r
+\r
#include <linux/interrupt.h>\r
#include <linux/io.h>\r
#include <linux/platform_device.h>\r
\r
#define PEN_DOWN 1\r
#define PEN_RELEASE 0\r
+#define MAX_SUPPORT_POINT 2\r
+#define fjp_debug 1\r
\r
//#define fjp_debug\r
/******************************************************* \r
else \r
return 1; \r
}\r
+unsigned int last_x = 0;\r
+unsigned int last_y = 0;\r
+\r
\r
/*******************************************************\r
Description:\r
return:\r
Executive outcomes.0---succeed.\r
*******************************************************/\r
-static void goodix_ts_work_func(struct work_struct *work)\r
+static void goodix_ts_work_func(struct work_struct *pwork)\r
{ \r
int ret=-1;\r
int tmp = 0;\r
unsigned int input_x = 0;\r
unsigned int input_y = 0;\r
unsigned int input_w = 0;\r
- unsigned char index = 0;\r
+ unsigned int index = 0;\r
unsigned char touch_num = 0;\r
- uint8_t current_num =0;\r
- uint8_t chksum_err = 0;\r
+ uint8_t chksum_err = 0;\r
+ \r
\r
\r
- unsigned int i;\r
- struct goodix_ts_data *ts = container_of(work, struct goodix_ts_data, work);\r
+ \r
+ struct goodix_ts_data *ts = container_of(pwork, struct goodix_ts_data, work);\r
\r
//printk("enter the goodix_ts_timer_func!\n");\r
// if(g_enter_isp)return;\r
position = 4 - READ_COOR_ADDR + 5*index;\r
input_x = (unsigned int) (point_data[position]<<8) + (unsigned int)( point_data[position+1]);\r
input_y = (unsigned int)(point_data[position+2]<<8) + (unsigned int) (point_data[position+3]);\r
- input_w =(unsigned int) (point_data[position+4]); \r
-\r
- if((input_x > ts->abs_x_max)||(input_y > ts->abs_y_max))continue;\r
- \r
- input_report_abs(ts->input_dev, ABS_MT_POSITION_X, (input_x));\r
+ input_w =(unsigned int) (point_data[position+4]); \r
+ #ifdef fjp_debug\r
+ printk("input_x = %d,input_y = %d,input_w=%d, index = %d,touch number:%d\n", (input_x), input_y, input_w,index,touch_num);//add by fjp 2010-9-28\r
+ #endif\r
+ last_x = input_x;\r
+ last_y = input_y;\r
+ if((input_x > ts->abs_x_max)||(input_y > ts->abs_y_max))\r
+ continue;\r
+\r
+ input_mt_slot(ts->input_dev, 0);\r
+ input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true);\r
+ input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 1);\r
+ //input_report_abs(ts->input_dev, ABS_MT_PRESSURE, 100);\r
+ input_report_abs(ts->input_dev, ABS_MT_POSITION_X, input_x);\r
input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, input_y); \r
- input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, input_w);\r
- input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, input_w);\r
- input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, track_id[index]);\r
- input_mt_sync(ts->input_dev);\r
- #ifdef fjp_debug\r
- printk("input_x = %d,input_y = %d,input_w=%d, index = %d\n", (input_x), input_y, input_w,track_id[index]);//add by fjp 2010-9-28\r
- #endif\r
+ \r
+ //input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, input_w);\r
+ //input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, track_id[index]);\r
+ //input_mt_sync(ts->input_dev);\r
+ \r
\r
}\r
ts->pendown =PEN_DOWN;\r
{\r
if((ts->pendown))\r
{\r
+ #if 0\r
input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0);\r
input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0);\r
input_mt_sync(ts->input_dev);\r
input_sync(ts->input_dev);\r
- ts->pendown =PEN_RELEASE;\r
#ifdef fjp_debug\r
printk("touch finish finsih\n");//add by fjp 2010-9-28\r
#endif \r
+ #else\r
+ input_mt_slot(ts->input_dev, 0);\r
+ input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true);\r
+ input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0);\r
+ //input_report_abs(ts->input_dev, ABS_MT_PRESSURE, 100);\r
+ input_report_abs(ts->input_dev, ABS_MT_POSITION_X, last_x);\r
+ input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, last_y);\r
+ input_mt_slot(ts->input_dev, 0);\r
+ input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);\r
+ input_sync(ts->input_dev);\r
+ ts->pendown =PEN_RELEASE;\r
+ #ifdef fjp_debug\r
+ printk("touch up>>x:%d>>y:%d\n",last_x,last_y);//add by fjp 2010-9-28\r
+ #endif \r
+ #endif\r
}\r
if(ts->use_irq)\r
enable_irq(ts->client->irq);\r
static enum hrtimer_restart goodix_ts_timer_func(struct hrtimer *timer)\r
{\r
struct goodix_ts_data *ts = container_of(timer, struct goodix_ts_data, timer);\r
- queue_work(goodix_wq, &ts->work);\r
+ //queue_work(goodix_wq, &ts->work);\r
+ queue_delayed_work(goodix_wq,&ts->work,0);\r
hrtimer_start(&ts->timer, ktime_set(0, (POLL_TIME+6)*1000000), HRTIMER_MODE_REL);\r
return HRTIMER_NORESTART;\r
}\r
struct goodix_ts_data *ts;\r
char *version_info = NULL;\r
char test_data = 1;\r
- const char irq_table[4] = {IRQ_TYPE_EDGE_RISING,\r
- IRQ_TYPE_LEVEL_LOW,\r
- IRQ_TYPE_EDGE_FALLING,\r
- IRQ_TYPE_LEVEL_HIGH};\r
-\r
+ \r
struct goodix_platform_data *pdata = pdata = client->dev.platform_data;\r
dev_dbg(&client->dev,"Install touch driver.\n");\r
\r
}\r
\r
#endif\r
- ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ;\r
- ts->input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);\r
- ts->input_dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE); // absolute coor (x,y)\r
+ __set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit);\r
+ __set_bit(EV_ABS, ts->input_dev->evbit);\r
+\r
+ //ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ;\r
+ //ts->input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);\r
+ //ts->input_dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE); // absolute coor (x,y)\r
#if 0\r
#ifdef HAVE_TOUCH_KEY\r
for(retry = 0; retry < MAX_KEY_NUM; retry++)\r
#endif\r
#endif\r
\r
- input_set_abs_params(ts->input_dev, ABS_X, 0, ts->abs_x_max, 0, 0);\r
- input_set_abs_params(ts->input_dev, ABS_Y, 0, ts->abs_y_max, 0, 0);\r
- input_set_abs_params(ts->input_dev, ABS_PRESSURE, 0, 255, 0, 0);\r
+ //input_set_abs_params(ts->input_dev, ABS_X, 0, ts->abs_x_max, 0, 0);\r
+ //input_set_abs_params(ts->input_dev, ABS_Y, 0, ts->abs_y_max, 0, 0);\r
+ //input_set_abs_params(ts->input_dev, ABS_PRESSURE, 0, 255, 0, 0);\r
\r
#ifdef GOODIX_MULTI_TOUCH\r
- input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0);\r
+ input_mt_init_slots(ts->input_dev, MAX_SUPPORT_POINT);\r
+ //input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0);\r
input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);\r
input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max, 0, 0);\r
input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, ts->abs_y_max, 0, 0);\r
- input_set_abs_params(ts->input_dev, ABS_MT_TRACKING_ID, 0, ts->max_touch_num, 0, 0);\r
+ //input_set_abs_params(ts->input_dev, ABS_MT_TRACKING_ID, 0, ts->max_touch_num, 0, 0);\r
+ //input_set_abs_params(ts->input_dev, ABS_MT_PRESSURE, 0, 255, 0, 0);\r
#endif \r
\r
sprintf(ts->phys, "input/ts");\r