#define PEN_DOWN 1\r
#define PEN_RELEASE 0\r
#define MAX_SUPPORT_POINT 2\r
-#define fjp_debug 1\r
+//#define fjp_debug 0\r
\r
//#define fjp_debug\r
/******************************************************* \r
return:\r
numbers of i2c_msgs to transfer\r
*********************************************************/\r
-static int i2c_read_bytes(struct i2c_client *client, uint8_t *buf, int len)\r
+static int goodix_i2c_read_bytes(struct i2c_client *client, uint8_t *buf, int len)\r
{\r
struct i2c_msg msgs[2];\r
int ret=-1;\r
msgs[1].udelay = client->udelay;\r
msgs[1].scl_rate=200 * 1000;\r
\r
- disable_irq(client->irq);\r
+ //disable_irq(client->irq);\r
while(retries<5)\r
{\r
ret=i2c_transfer(client->adapter,msgs, 2);\r
if(ret == 2)break;\r
retries++;\r
}\r
- enable_irq(client->irq);\r
+ //enable_irq(client->irq);\r
return ret;\r
}\r
\r
return:\r
numbers of i2c_msgs to transfer.\r
*********************************************************/\r
-static int i2c_write_bytes(struct i2c_client *client,uint8_t *data,int len)\r
+static int goodix_i2c_write_bytes(struct i2c_client *client,uint8_t *data,int len)\r
{\r
struct i2c_msg msg;\r
int ret=-1;\r
msg.udelay = client->udelay;\r
msg.scl_rate=200 * 1000;\r
\r
- disable_irq(client->irq);\r
+ //disable_irq(client->irq);\r
while(retries<5)\r
{\r
ret=i2c_transfer(client->adapter,&msg, 1);\r
if(ret == 1)break;\r
retries++;\r
}\r
- enable_irq(client->irq);\r
+ //enable_irq(client->irq);\r
return ret;\r
}\r
\r
return:\r
Executive outcomes.0---succeed.\r
*******************************************************/\r
-static int goodix_init_panel(struct goodix_ts_data *ts)\r
+static int goodix_init_panel(struct rk_ts_data *ts)\r
{\r
int ret=-1;\r
uint8_t rd_cfg_buf[7] = {0x66,};\r
0x00,0x00,0x00,0x00\r
};\r
#endif\r
- ret=i2c_write_bytes(ts->client,config_info, (sizeof(config_info)/sizeof(config_info[0])));\r
+ ret=goodix_i2c_write_bytes(ts->client,config_info, (sizeof(config_info)/sizeof(config_info[0])));\r
if (ret < 0) {\r
printk("goodix write cfg info err");\r
return ret;\r
}\r
- ret=i2c_read_bytes(ts->client, rd_cfg_buf, 7);\r
+ ret=goodix_i2c_read_bytes(ts->client, rd_cfg_buf, 7);\r
if(ret != 2)\r
{\r
dev_info(&ts->client->dev, "Read resolution & max_touch_num failed, use default value!\n");\r
- ts->abs_x_max = TOUCH_MAX_HEIGHT;\r
- ts->abs_y_max = TOUCH_MAX_WIDTH;\r
ts->max_touch_num = MAX_FINGER_NUM;\r
ts->int_trigger_type = INT_TRIGGER;\r
return 0;\r
ts->int_trigger_type = rd_cfg_buf[6]&0x03;\r
if((!ts->abs_x_max)||(!ts->abs_y_max)||(!ts->max_touch_num))\r
{\r
- dev_info(&ts->client->dev, "Read invalid resolution & max_touch_num, use default value!\n");\r
- ts->abs_x_max = TOUCH_MAX_HEIGHT;\r
- ts->abs_y_max = TOUCH_MAX_WIDTH;\r
+ printk(KERN_INFO "Read invalid resolution & max_touch_num, use default value!\n");\r
ts->max_touch_num = MAX_FINGER_NUM;\r
}\r
\r
- dev_info(&ts->client->dev,"X_MAX = %d,Y_MAX = %d,MAX_TOUCH_NUM = %d\n",ts->abs_x_max,ts->abs_y_max,ts->max_touch_num);\r
- dev_info(&ts->client->dev,"int_trigger type is %d\n",rd_cfg_buf[6]);\r
+ printk(KERN_INFO "X_MAX = %d,Y_MAX = %d,MAX_TOUCH_NUM = %d\n",ts->abs_x_max,ts->abs_y_max,ts->max_touch_num);\r
+ printk(KERN_INFO "int_trigger type is %d\n",rd_cfg_buf[6]);\r
//test\r
rd_cfg_buf[0] = 0x6e;\r
rd_cfg_buf[1] = 0x00;\r
- i2c_read_bytes(ts->client, rd_cfg_buf, 2);\r
+ goodix_i2c_read_bytes(ts->client, rd_cfg_buf, 2);\r
if((rd_cfg_buf[1]&0x0f)==0x0f)\r
{\r
dev_info(&ts->client->dev, "Need int wake up from green mode!\n");\r
}\r
\r
- msleep(10);\r
+ //msleep(10);\r
+ printk("max_point:%d\n",ts->max_touch_num);\r
return 0;\r
\r
}\r
return:\r
Executive outcomes.0---succeed.\r
*******************************************************/\r
-static int goodix_read_version(struct goodix_ts_data *ts, char **version)\r
+static int goodix_read_version(struct rk_ts_data *ts, char **version)\r
{\r
int ret = -1, count = 0;\r
char *version_data;\r
char *p;\r
- \r
+\r
*version = (char *)vmalloc(18);\r
version_data = *version;\r
if(!version_data)\r
p = version_data;\r
memset(version_data, 0, sizeof(version_data));\r
version_data[0]=240; \r
- ret=i2c_read_bytes(ts->client,version_data, 17);\r
+ ret=goodix_i2c_read_bytes(ts->client,version_data, 17);\r
if (ret < 0) \r
return ret;\r
version_data[17]='\0';\r
else \r
return 1; \r
}\r
-unsigned int last_x = 0;\r
-unsigned int last_y = 0;\r
-\r
-\r
-/*******************************************************\r
-Description:\r
- Goodix touchscreen work function.\r
\r
-Parameter:\r
- ts: i2c client private struct.\r
- \r
-return:\r
- Executive outcomes.0---succeed.\r
-*******************************************************/\r
-static void goodix_ts_work_func(struct work_struct *pwork)\r
-{ \r
- int ret=-1;\r
- int tmp = 0;\r
+static last_touch_num = -1;\r
+static void goodix_get_touch_info(struct rk_ts_data *ts,char *point_num,struct rk_touch_info* info_buf)\r
+{\r
uint8_t point_data[(1-READ_COOR_ADDR)+1+2+5*MAX_FINGER_NUM+1]={ 0 }; //read address(1byte)+key index(1byte)+point mask(2bytes)+5bytes*MAX_FINGER_NUM+coor checksum(1byte)\r
uint8_t check_sum = 0;\r
+ int ret ;\r
uint16_t finger_current = 0;\r
uint16_t finger_bit = 0;\r
unsigned int count = 0, point_count = 0;\r
- unsigned int position = 0; \r
- uint8_t track_id[MAX_FINGER_NUM] = {0};\r
- unsigned int input_x = 0;\r
- unsigned int input_y = 0;\r
- unsigned int input_w = 0;\r
- unsigned int index = 0;\r
unsigned char touch_num = 0;\r
uint8_t chksum_err = 0;\r
+ unsigned int position = 0; \r
+ uint8_t track_id[MAX_FINGER_NUM] = {0};\r
+ u8 index;\r
\r
+ point_data[0] = READ_COOR_ADDR; //read coor address\r
\r
-\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
-#if defined(INT_PORT)\r
-COORDINATE_POLL:\r
- if(gpio_get_value(INT_PORT) != GPIO_LOW)\r
- {\r
- #ifdef fjp_debug\r
- printk("NO_ACTION--NO_ACTION--NO_ACTION\n"); //add by fjp 2010-9-28\r
- #endif\r
- goto NO_ACTION;\r
- } \r
-#endif \r
-\r
-\r
- if( tmp > 9) {\r
- printk("XFER_ERROR--XFER_ERROR--XFER_ERROR\n");\r
- dev_info(&(ts->client->dev), "I2C transfer error,touchscreen stop working.\n");\r
- goto XFER_ERROR ;\r
- }\r
\r
- if(ts->bad_data) \r
- msleep(20);\r
-read_one_more_time: \r
- \r
- //printk("prepare for I2C transfer!\n");\r
- point_data[0] = READ_COOR_ADDR; //read coor address\r
- ret=i2c_read_bytes(ts->client, point_data, sizeof(point_data)/sizeof(point_data[0]));\r
+ ret=goodix_i2c_read_bytes(ts->client, point_data, sizeof(point_data)/sizeof(point_data[0]));\r
if(ret != 2) \r
{\r
- printk("I2C transfer error--I2C transfer error--I2C transfer error\n");\r
- dev_err(&(ts->client->dev),"I2C transfer error. Number:%d\n ", ret);\r
+ printk("goodix read error\n");\r
ts->bad_data = 1;\r
- tmp ++;\r
- ts->retry++;\r
- #if defined(INT_PORT)\r
- if(ts->int_trigger_type> 2)\r
- goto COORDINATE_POLL;\r
- else\r
- goto XFER_ERROR;\r
- #endif\r
} \r
- /* \r
- for( i=0;i<sizeof(point_data)/sizeof(point_data[0]);i++)\r
- {\r
- printk("point_data[%d] ===%d\n", i,point_data[i]);\r
- }*/\r
- ts->bad_data = 0; \r
finger_current = (point_data[3 - READ_COOR_ADDR]<<8) + point_data[2 - READ_COOR_ADDR];\r
#ifdef fjp_debug\r
- printk("finger_current ====%d\n", finger_current);//add by fjp 2010-9-28\r
- #endif\r
- //===add by fjp===============\r
- /* if(0x200&finger_current)\r
- current_num =0xa;\r
- else if(0x100&finger_current)\r
- current_num =0x9;\r
- else if (0x80&finger_current)\r
- current_num =0x8;\r
- else if (0x40&finger_current)\r
- current_num =0x7;\r
- else if (0x20&finger_current)\r
- current_num =0x6;\r
- else if (0x10&finger_current)\r
- current_num =0x5;\r
- else if (0x8&finger_current)\r
- current_num =0x4;\r
- else if (0x4&finger_current)\r
- current_num =0x3;\r
- else if (0x2&finger_current)\r
- current_num =0x2;\r
- else if (0x1&finger_current)\r
- current_num =0x1;\r
- #ifdef fjp_debug\r
- printk("current_num ====%d\n", current_num);\r
+ printk("finger_current:%d ==== max_touch_num:%d\n", finger_current,ts->max_touch_num);//add by fjp 2010-9-28\r
#endif\r
- point_data[0] = READ_COOR_ADDR;\r
- ret=i2c_read_bytes(ts->client, point_data, ((1-READ_COOR_ADDR)+1+2+5*current_num+1));\r
- if(ret != 2) \r
- {\r
- #ifdef fjp_debug\r
- printk("I2C transfer error--I2C transfer error--I2C transfer error\n");\r
- #endif \r
- dev_err(&(ts->client->dev),"I2C transfer error. Number:%d\n ", ret);\r
- ts->bad_data = 1;\r
- tmp ++;\r
- ts->retry++;\r
- goto XFER_ERROR;\r
- \r
- } \r
- ts->bad_data = 0; */\r
- //==================================\r
+\r
if(finger_current)\r
{ \r
- point_count = 0, finger_bit = finger_current;\r
+ point_count = 0;\r
+ finger_bit = finger_current;\r
for(count = 0; (finger_bit != 0) && (count < ts->max_touch_num); count++)//cal how many point touch currntly\r
{\r
if(finger_bit & 0x01)\r
check_sum += point_data[count];\r
if(check_sum != 0) //checksum verify error\r
{\r
- #if 0 \r
- dev_info(&ts->client->dev, "Check_sum:%d, Data:%d\n", check_sum, point_data[count]); \r
- printk(KERN_INFO "Finger Bit:%d\n",finger_current);\r
- for( ; count > 0; count--)\r
- printk(KERN_INFO "count=%d:%d ",count, point_data[count]);\r
- printk(KERN_INFO "\n");\r
- #endif\r
- #ifdef fjp_debug\r
printk("coor checksum error!\n");\r
- #endif\r
- if(!chksum_err)\r
- {\r
- chksum_err = 1;\r
- goto read_one_more_time;\r
- }\r
- #if defined(INT_PORT)\r
- if(ts->int_trigger_type> 2)\r
- goto COORDINATE_POLL;\r
- else \r
- goto XFER_ERROR;\r
- #endif\r
}\r
else\r
{\r
}\r
}\r
\r
- if(touch_num)\r
+ //printk("current point num:%d\n",touch_num);\r
+ *point_num = touch_num;\r
+ if(touch_num < last_touch_num) //some flinger release\r
{\r
- for(index=0; index<touch_num; index++)\r
- {\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
- #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
- \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
- input_sync(ts->input_dev);\r
+ //printk("%d flinger release\n",last_touch_num-touch_num);\r
+ for(index = touch_num; index < last_touch_num; index++)\r
+ info_buf[index].status = 0;\r
+ *point_num = last_touch_num;\r
+ }\r
+ last_touch_num = touch_num;\r
+ for(index = 0; index < touch_num; index++)\r
+ {\r
+ position = 4 - READ_COOR_ADDR + 5*index;\r
+ info_buf[index].x = (unsigned int) (point_data[position]<<8) + (unsigned int)( point_data[position+1]);\r
+ info_buf[index].y = (unsigned int)(point_data[position+2]<<8) + (unsigned int) (point_data[position+3]);\r
+ info_buf[index].status = !gpio_get_value(ts->irq_pin);\r
}\r
\r
+}\r
\r
- #ifdef HAVE_TOUCH_KEY\r
- //printk(KERN_INFO"HAVE KEY DOWN!0x%x\n",point_data[1]);\r
- for(count = 0; count < MAX_KEY_NUM; count++)\r
+\r
+/*******************************************************\r
+Description:\r
+ Goodix touchscreen work function.\r
+\r
+Parameter:\r
+ ts: i2c client private struct.\r
+ \r
+return:\r
+ Executive outcomes.0---succeed.\r
+*******************************************************/\r
+static int rk_ts_work_func(struct work_struct *pwork)\r
+{ \r
+ int i =0;\r
+ struct rk_touch_info *info_buf;\r
+ char point_num;\r
+ \r
+ if(pwork==NULL)\r
{\r
- input_report_key(ts->input_dev, touch_key_array[count], !!(point_data[1]&(0x01<<count))); \r
- } \r
- #endif\r
+ printk(KERN_INFO "%s>>>>>>>>err:null pwork\n",__func__);\r
+ return -1;\r
+ }\r
\r
-\r
-#if defined(INT_PORT)\r
- if(ts->int_trigger_type> 2)\r
+ struct rk_ts_data *ts = container_of(pwork, struct rk_ts_data, ts_work);\r
+ if(!ts)\r
{\r
- msleep(POLL_TIME);\r
- goto COORDINATE_POLL;\r
+ printk("container of rk_ts_data fail\n");\r
+ return -1;\r
+ }\r
+ \r
+ info_buf= kzalloc(ts->max_touch_num*sizeof(struct rk_touch_info), GFP_KERNEL);\r
+ if(!info_buf)\r
+ {\r
+ printk(KERN_ALERT "alloc for rk_touch_info fail\n");\r
+ return -1;\r
}\r
-#endif\r
- goto END_WORK_FUNC;\r
-\r
-NO_ACTION: \r
\r
-#ifdef HAVE_TOUCH_KEY\r
- //printk(KERN_INFO"HAVE KEY DOWN!0x%x\n",point_data[1]);\r
- for(count = 0; count < MAX_KEY_NUM; count++)\r
+ if(ts->get_touch_info)\r
{\r
- input_report_key(ts->input_dev, touch_key_array[count], !!(point_data[1]&(0x01<<count))); \r
+ ts->get_touch_info(ts,&point_num,info_buf);\r
}\r
- input_sync(ts->input_dev); \r
-#endif\r
-END_WORK_FUNC:\r
-XFER_ERROR:\r
- //=========add by fjp send last up touchkey==============\r
- if(gpio_get_value(INT_PORT) == GPIO_LOW)\r
- {\r
- #ifdef fjp_debug\r
- printk("touch down .............\n");//add by fjp 2010-9-28\r
- #endif\r
- queue_delayed_work(goodix_wq, &ts->work,msecs_to_jiffies(30));\r
- }\r
- else\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
- #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
+ for(i=0; i< point_num; i++)\r
+ {\r
+ input_mt_slot(ts->input_dev, i);\r
+ input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true);\r
+ input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, info_buf[i].status);\r
+ input_report_abs(ts->input_dev, ABS_MT_POSITION_X, info_buf[i].x);\r
+ input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, info_buf[i].y); \r
+ #ifdef fjp_debug\r
+ printk("touch point %d %s >>x:%d>>y:%d\n",i,info_buf[i].status? "down":"up",info_buf[i].x,info_buf[i].y);//add by fjp 2010-9-28\r
+ #endif \r
+ if(!info_buf[i].status)\r
+ {\r
+ input_mt_slot(ts->input_dev, i);\r
+ input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);\r
+ }\r
+ \r
+ }\r
+ input_sync(ts->input_dev);\r
+ \r
+ if(gpio_get_value(ts->irq_pin) == GPIO_LOW)\r
+ {\r
+ #ifdef fjp_debug\r
+ printk("touch down .............\n");//add by fjp 2010-9-28\r
+ #endif\r
+ queue_delayed_work(ts->ts_wq, &ts->ts_work,msecs_to_jiffies(30));\r
+ goto exit;\r
+ \r
+ }\r
+ else\r
+ {\r
+ #ifdef fjp_debug\r
+ printk("touch up>>x:%d>>y:%d\n",info_buf[0].x,info_buf[0].y);//add by fjp 2010-9-28\r
+ #endif \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_POSITION_X, info_buf[0].x);\r
+ //input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, info_buf[0].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
+ \r
+ \r
}\r
+ \r
+ enable_irq(ts->irq);\r
+exit:\r
+ kfree(info_buf);\r
+ return 0;\r
+ }\r
+ \r
\r
- //============================================\r
\r
-}\r
\r
/*******************************************************\r
Description:\r
*******************************************************/\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_delayed_work(goodix_wq,&ts->work,0);\r
+ struct rk_ts_data *ts = container_of(timer, struct rk_ts_data, timer);\r
+ queue_delayed_work(goodix_wq,&ts->ts_work,0);\r
hrtimer_start(&ts->timer, ktime_set(0, (POLL_TIME+6)*1000000), HRTIMER_MODE_REL);\r
return HRTIMER_NORESTART;\r
}\r
return:\r
irq execute status.\r
*******************************************************/\r
-static irqreturn_t goodix_ts_irq_handler(int irq, void *dev_id)\r
+static irqreturn_t rk_ts_irq_handler(int irq, void *dev_id)\r
{\r
\r
- struct goodix_ts_data *ts = dev_id;\r
+ struct rk_ts_data *ts = (struct rk_ts_data*)dev_id;\r
#ifdef fjp_debug\r
- printk("entry goodix_ts_irq_handler\n");//add by fjp 2010-9-28\r
- #endif\r
- disable_irq_nosync(ts->client->irq);\r
- queue_delayed_work(goodix_wq, &ts->work,0);\r
+ printk("entry goodix_ts_irq_handler irq:%d\n",ts->irq);//add by fjp 2010-9-28\r
+#endif\r
+ disable_irq_nosync(ts->irq);\r
+ queue_delayed_work(ts->ts_wq, &ts->ts_work,0);\r
\r
return IRQ_HANDLED;\r
}\r
\r
+static int rk_ts_suspend(struct i2c_client *client, pm_message_t mesg)\r
+{\r
+ int ret;\r
+ struct rk_ts_data *ts = i2c_get_clientdata(client);\r
+\r
+ \r
+ if (ts->use_irq)\r
+ disable_irq(client->irq);\r
+ else\r
+ hrtimer_cancel(&ts->timer);\r
+#if 1\r
+ if (ts->power) {\r
+ ret = ts->power(ts, 0);\r
+ if (ret < 0)\r
+ printk(KERN_ERR "goodix_ts_resume power off failed\n");\r
+ }\r
+#endif\r
+ return 0;\r
+}\r
+\r
+static int rk_ts_resume(struct i2c_client *client)\r
+{\r
+ int ret;\r
+ struct rk_ts_data *ts = i2c_get_clientdata(client);\r
+ \r
+#if 1\r
+ if (ts->power) {\r
+ ret = ts->power(ts, 1);\r
+ if (ret < 0)\r
+ printk(KERN_ERR "goodix_ts_resume power on failed\n");\r
+ }\r
+#endif\r
+ if (ts->use_irq)\r
+ enable_irq(client->irq);\r
+ else\r
+ hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL);\r
+ //gpio_set_value(RK29_PIN6_PC3,GPIO_HIGH);\r
+\r
+ return 0;\r
+}\r
+\r
+\r
+\r
+#ifdef CONFIG_HAS_EARLYSUSPEND\r
+static void rk_ts_early_suspend(struct early_suspend *h)\r
+{\r
+ struct rk_ts_data *ts;\r
+ ts = container_of(h, struct rk_ts_data, early_suspend);\r
+ rk_ts_suspend(ts->client, PMSG_SUSPEND);\r
+}\r
+\r
+static void rk_ts_late_resume(struct early_suspend *h)\r
+{\r
+ struct rk_ts_data *ts;\r
+ ts = container_of(h, struct rk_ts_data, early_suspend);\r
+ rk_ts_resume(ts->client);\r
+}\r
+#endif\r
+\r
/*******************************************************\r
Description:\r
Goodix touchscreen power manage function.\r
return:\r
Executive outcomes.-1---i2c transfer error;0---succeed.\r
*******************************************************/\r
-static int goodix_ts_power(struct goodix_ts_data * ts, int on)\r
+static int goodix_ts_power(struct rk_ts_data * ts, int on)\r
{\r
int ret = -1;\r
unsigned char i2c_control_buf[2] = {80, 1}; //suspend cmd\r
int retry = 0;\r
if(on != 0 && on !=1)\r
{\r
- printk(KERN_DEBUG "%s: Cant't support this command.", goodix_ts_name);\r
+ printk(KERN_DEBUG "%s: Cant't support this command.", rk_ts_name);\r
return -EINVAL;\r
}\r
\r
\r
if(on == 0) //suspend\r
{ \r
- while(retry<5)\r
+ while(retry<5)\r
{\r
- ret = i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
+ ret = goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
if(ret == 1)\r
{\r
printk(KERN_INFO"Send suspend cmd\n");\r
return ret;\r
}\r
\r
-#if 0\r
-/*******************************************************\r
-Description:\r
- Goodix debug sysfs cat version function.\r
\r
-Parameter:\r
- standard sysfs show param.\r
- \r
-return:\r
- Executive outcomes. 0---failed.\r
-*******************************************************/\r
-static ssize_t goodix_debug_version_show(struct device *dev,\r
- struct device_attribute *attr, char *buf)\r
+static int goodix_input_params_init(struct rk_ts_data *ts)\r
{\r
- int ret = 0;\r
- char *version_info = NULL;\r
- struct goodix_ts_data *ts;\r
- \r
- ts = i2c_get_clientdata(i2c_connect_client);\r
- if(ts==NULL)\r
- return 0;\r
- \r
- ret = goodix_read_version(ts, &version_info);\r
- if(ret <= 0)\r
- {\r
- printk(KERN_INFO"Read version data failed!\n");\r
- vfree(version_info);\r
- return 0;\r
+ int ret ;\r
+ ts->input_dev = input_allocate_device();\r
+ if (ts->input_dev == NULL) {\r
+ ret = -ENOMEM;\r
+ printk(KERN_ALERT "Failed to allocate input device\n");\r
+ return ret;\r
}\r
\r
- printk(KERN_INFO"Goodix TouchScreen Version:%s\n", (version_info+1));\r
- sprintf(buf,"Goodix TouchScreen Version:%s\n",(version_info+1));\r
- vfree(version_info);\r
- ret = strlen(buf);\r
- return ret;\r
-}\r
\r
-/*******************************************************\r
-Description:\r
- Goodix debug sysfs cat resolution function.\r
+ __set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit);\r
+ __set_bit(EV_ABS, ts->input_dev->evbit);\r
\r
-Parameter:\r
- standard sysfs show param.\r
+ input_mt_init_slots(ts->input_dev, MAX_SUPPORT_POINT);\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
+ sprintf(ts->phys, "input/ts");\r
+ ts->input_dev->name = rk_ts_name;\r
+ ts->input_dev->phys = ts->phys;\r
+ ts->input_dev->id.bustype = BUS_I2C;\r
+ ts->input_dev->id.vendor = 0xDEAD;\r
+ ts->input_dev->id.product = 0xBEEF;\r
+ ts->input_dev->id.version = 10427; //screen firmware version\r
\r
-return:\r
- Executive outcomes. 0---failed.\r
-*******************************************************/\r
-static ssize_t goodix_debug_resolution_show(struct device *dev,\r
- struct device_attribute *attr, char *buf)\r
-{\r
- struct goodix_ts_data *ts;\r
- ts = i2c_get_clientdata(i2c_connect_client);\r
- dev_info(&ts->client->dev,"ABS_X_MAX = %d,ABS_Y_MAX = %d\n",ts->abs_x_max,ts->abs_y_max);\r
- sprintf(buf,"ABS_X_MAX = %d,ABS_Y_MAX = %d\n",ts->abs_x_max,ts->abs_y_max);\r
+ ret = input_register_device(ts->input_dev);\r
+ if (ret) {\r
+ printk(KERN_ALERT "Probe: Unable to register %s input device\n", ts->input_dev->name);\r
+ return -1;\r
+ }\r
+ ts->bad_data = 0;\r
\r
- return strlen(buf);\r
+ return 0 ;\r
+ \r
}\r
-/*******************************************************\r
-Description:\r
- Goodix debug sysfs cat version function.\r
-\r
-Parameter:\r
- standard sysfs show param.\r
\r
-return:\r
- Executive outcomes. 0---failed.\r
-*******************************************************/\r
-static ssize_t goodix_debug_diffdata_show(struct device *dev,\r
- struct device_attribute *attr, char *buf)\r
+static int goodix_ts_init(struct rk_ts_data *ts)\r
{\r
- //char diff_data[300];\r
- unsigned char diff_data[2241] = {00,};\r
- int ret = -1;\r
- char diff_data_cmd[2] = {80, 202};\r
- int i;\r
- int short_tmp;\r
- struct goodix_ts_data *ts;\r
-\r
- disable_irq(TS_INT);\r
- \r
- ts = i2c_get_clientdata(i2c_connect_client);\r
- //memset(diff_data, 0, sizeof(diff_data));\r
- ret = i2c_write_bytes(ts->client, diff_data_cmd, 2);\r
- if(ret != 1)\r
+ char retry;\r
+ char ret ;\r
+ char test_data = 1;\r
+ char *version_info = NULL;\r
+ for(retry=0;retry < 30; retry++) //test goodix\r
{\r
- dev_info(&ts->client->dev, "Write diff data cmd failed!\n");\r
- enable_irq(TS_INT);\r
- return 0;\r
+ ret =goodix_i2c_write_bytes(ts->client, &test_data, 1);\r
+ if (ret > 0)\r
+ break;\r
}\r
-\r
- while(gpio_get_value(INT_PORT));\r
- ret = i2c_read_bytes(ts->client, diff_data, sizeof(diff_data));\r
- if(ret != 2)\r
+ if(ret <= 0)\r
{\r
- dev_info(&ts->client->dev, "Read diff data failed!\n");\r
- enable_irq(TS_INT);\r
- return 0;\r
+ printk(KERN_INFO "I2C communication ERROR!Goodix touchscreen driver become invalid\n");\r
+ return -1;\r
+ } \r
+ \r
+ \r
+ ret=goodix_init_panel(ts);\r
+ if(ret != 0) {\r
+ printk("goodix panel init fail\n");\r
+ ts->bad_data=1;\r
+ return -1;\r
}\r
- for(i=1; i<sizeof(diff_data); i+=2)\r
+ else\r
{\r
- short_tmp = diff_data[i] + (diff_data[i+1]<<8);\r
- if(short_tmp&0x8000)\r
- short_tmp -= 65535;\r
- if(short_tmp == 512)continue;\r
- sprintf(buf+strlen(buf)," %d",short_tmp);\r
- //printk(" %d\n", short_tmp);\r
+ printk(KERN_INFO "%s>>>>>>>max_point %d\n",__func__,ts->max_touch_num);\r
}\r
- \r
- diff_data_cmd[1] = 0;\r
- ret = i2c_write_bytes(ts->client, diff_data_cmd, 2);\r
- if(ret != 1)\r
+ ret = goodix_read_version(ts, &version_info);\r
+ if(ret <= 0)\r
{\r
- dev_info(&ts->client->dev, "Write diff data cmd failed!\n");\r
- enable_irq(TS_INT);\r
- return 0;\r
+ printk(KERN_INFO"Read version data failed!\n");\r
}\r
- enable_irq(TS_INT);\r
- /*for (i=0; i<1024; i++)\r
- {\r
- sprintf(buf+strlen(buf)," %d",i);\r
- }*/\r
- \r
- return strlen(buf);\r
-}\r
-\r
-\r
-/*******************************************************\r
-Description:\r
- Goodix debug sysfs echo calibration function.\r
-\r
-Parameter:\r
- standard sysfs store param.\r
- \r
-return:\r
- Executive outcomes..\r
-*******************************************************/\r
-static ssize_t goodix_debug_calibration_store(struct device *dev,\r
- struct device_attribute *attr, const char *buf, ssize_t count)\r
-{\r
- int ret = -1;\r
- char cal_cmd_buf[] = {110,1};\r
- struct goodix_ts_data *ts;\r
-\r
- ts = i2c_get_clientdata(i2c_connect_client);\r
- dev_info(&ts->client->dev,"Begin calibration......\n");\r
- if((*buf == 10)||(*buf == 49))\r
+ else\r
{\r
- ret = i2c_write_bytes(ts->client,cal_cmd_buf,2);\r
- if(ret!=1)\r
- {\r
- dev_info(&ts->client->dev,"Calibration failed!\n");\r
- return count;\r
- }\r
- else\r
- {\r
- dev_info(&ts->client->dev,"Calibration succeed!\n");\r
- }\r
+ printk(KERN_INFO"Goodix TouchScreen Version:%s>>>max_point:%d\n", (version_info+1),ts->max_touch_num);\r
}\r
- return count;\r
-}\r
-\r
-static DEVICE_ATTR(version, S_IRUGO, goodix_debug_version_show, NULL);\r
-static DEVICE_ATTR(resolution, S_IRUGO, goodix_debug_resolution_show, NULL);\r
-static DEVICE_ATTR(diffdata, S_IRUGO, goodix_debug_diffdata_show, NULL);\r
-static DEVICE_ATTR(calibration, S_IWUSR , NULL, goodix_debug_calibration_store); \r
-\r
-\r
-/*******************************************************\r
-Description:\r
- Goodix debug sysfs init function.\r
-\r
-Parameter:\r
- none.\r
- \r
-return:\r
- Executive outcomes. 0---succeed.\r
-*******************************************************/\r
-static int goodix_debug_sysfs_init(void)\r
-{\r
- int ret ;\r
- struct goodix_ts_data *ts;\r
- ts = i2c_get_clientdata(i2c_connect_client);\r
-\r
- goodix_debug_kobj = kobject_create_and_add("goodix_debug", NULL) ;\r
- if (goodix_debug_kobj == NULL) {\r
- printk(KERN_ERR "%s: subsystem_register failed\n", __func__);\r
+ vfree(version_info);\r
+ #ifdef CONFIG_TOUCHSCREEN_GOODIX_IAP\r
+ goodix_proc_entry = create_proc_entry("goodix-update", 0666, NULL);\r
+ if(goodix_proc_entry == NULL)\r
+ {\r
+ printk("Couldn't create proc entry!\n");\r
ret = -ENOMEM;\r
- return ret;\r
- }\r
- ret = sysfs_create_file(goodix_debug_kobj, &dev_attr_version.attr);\r
- if (ret) {\r
- printk(KERN_ERR "%s: sysfs_create_version_file failed\n", __func__);\r
- return ret;\r
- }\r
- ret = sysfs_create_file(goodix_debug_kobj, &dev_attr_calibration.attr);\r
- if (ret) {\r
- printk(KERN_ERR "%s: sysfs_create_calibration_file failed\n", __func__);\r
- return ret;\r
+ return ret ;\r
}\r
- ret = sysfs_create_file(goodix_debug_kobj, &dev_attr_diffdata.attr);\r
- if (ret) \r
+ else\r
{\r
- printk(KERN_ERR "%s: sysfs_create_diffdata_file failed\n", __func__);\r
- return ret;\r
- }\r
- ret = sysfs_create_file(goodix_debug_kobj, &dev_attr_resolution.attr);\r
- if (ret) {\r
- printk(KERN_ERR "%s: sysfs_create_resolution_file failed\n", __func__);\r
- return ret;\r
+ printk("Create proc entry success!\n");\r
+ goodix_proc_entry->write_proc = goodix_update_write;\r
+ goodix_proc_entry->read_proc = goodix_update_read;\r
+ //goodix_proc_entry->owner = THIS_MODULE;\r
}\r
- dev_info(&ts->client->dev,"Goodix debug sysfs create success!\n");\r
- return 0 ;\r
-}\r
+#endif\r
\r
-static void goodix_debug_sysfs_deinit(void)\r
-{\r
- sysfs_remove_file(goodix_debug_kobj, &dev_attr_version.attr);\r
- sysfs_remove_file(goodix_debug_kobj, &dev_attr_resolution.attr);\r
- sysfs_remove_file(goodix_debug_kobj, &dev_attr_diffdata.attr);\r
- sysfs_remove_file(goodix_debug_kobj, &dev_attr_calibration.attr);\r
- kobject_del(goodix_debug_kobj);\r
+ return 0;\r
}\r
-#endif\r
/*******************************************************\r
Description:\r
Goodix touchscreen probe function.\r
return:\r
Executive outcomes. 0---succeed.\r
*******************************************************/\r
-static int goodix_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)\r
+static int rk_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)\r
{\r
int ret = 0;\r
- int retry=0;\r
- struct goodix_ts_data *ts;\r
- char *version_info = NULL;\r
- char test_data = 1;\r
+ struct rk_ts_data *ts;\r
+ struct goodix_platform_data *pdata ;\r
\r
- struct goodix_platform_data *pdata = pdata = client->dev.platform_data;\r
- dev_dbg(&client->dev,"Install touch driver.\n");\r
-\r
-\r
+ printk(KERN_INFO "Install touch driver.\n");\r
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) \r
{\r
dev_err(&client->dev, "Must have I2C_FUNC_I2C.\n");\r
goto err_check_functionality_failed;\r
}\r
\r
- ts = kzalloc(sizeof(*ts), GFP_KERNEL);\r
+ ts = kzalloc(sizeof(struct rk_ts_data), GFP_KERNEL);\r
if (ts == NULL) {\r
+ printk(KERN_ALERT "alloc for struct rk_ts_data fail\n");\r
ret = -ENOMEM;\r
goto err_alloc_data_failed;\r
}\r
\r
+ pdata = client->dev.platform_data;\r
+ ts->abs_x_max = TS_MAX_X;\r
+ ts->abs_y_max = TS_MAX_Y;\r
+ ts->irq_pin = pdata->irq_pin;\r
+ ts->pendown =PEN_RELEASE;\r
+ ts->client = client;\r
+ ts->ts_init = goodix_ts_init; \r
+ ts->power = goodix_ts_power;\r
+ ts->get_touch_info = goodix_get_touch_info;\r
+ ts->input_parms_init = goodix_input_params_init;\r
+ i2c_set_clientdata(client, ts);\r
+ \r
+\r
if (pdata->init_platform_hw)\r
{\r
pdata->init_platform_hw();\r
}\r
\r
- i2c_connect_client = client;\r
- for(retry=0;retry < 30; retry++)\r
+ if(ts->ts_init)\r
{\r
- ret =i2c_write_bytes(client, &test_data, 1);\r
- if (ret > 0)\r
- break;\r
- printk("GOODiX i2c test failed!\n");\r
+ ret = ts->ts_init(ts);\r
+ if(ret < 0)\r
+ {\r
+ printk(KERN_ALERT "rk ts init fail\n");\r
+ //return -1;\r
+ }\r
}\r
\r
- if(ret <= 0)\r
+ if(ts->input_parms_init)\r
{\r
- dev_err(&client->dev, "I2C communication ERROR!Goodix touchscreen driver become invalid\n");\r
- goto err_i2c_failed;\r
- } \r
- \r
- INIT_DELAYED_WORK(&ts->work, goodix_ts_work_func);\r
- ts->client = client;\r
- i2c_set_clientdata(client, ts);\r
- pdata = client->dev.platform_data;\r
- \r
- ts->input_dev = input_allocate_device();\r
- if (ts->input_dev == NULL) {\r
- ret = -ENOMEM;\r
- dev_dbg(&client->dev,"Failed to allocate input device\n");\r
- goto err_input_dev_alloc_failed;\r
- }\r
-#if 1 \r
- for(retry=0; retry<3; retry++)\r
- {\r
- ret=goodix_init_panel(ts);\r
- msleep(2);\r
- if(ret != 0)\r
- continue;\r
- else\r
- break;\r
- }\r
- if(ret != 0) {\r
- ts->bad_data=1;\r
- goto err_init_godix_ts;\r
+ ts->input_parms_init(ts);\r
}\r
\r
-#endif\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
- {\r
- input_set_capability(ts->input_dev,EV_KEY,touch_key_array[retry]); \r
+ i2c_connect_client = client;\r
+ #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,32)\r
+ ts->ts_wq= create_rt_workqueue("rk_ts_wq"); //create a work queue and worker thread\r
+ #else\r
+ ts->ts_wq= create_workqueue("rk_ts_wq"); \r
+ #endif\r
+ if (!ts->ts_wq){\r
+ printk(KERN_ALERT "creat touch screen workqueue failed\n");\r
+ return -ENOMEM;\r
}\r
-#endif\r
+ \r
+ INIT_DELAYED_WORK(&ts->ts_work, rk_ts_work_func);\r
+#ifdef CONFIG_HAS_EARLYSUSPEND\r
+ ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;\r
+ ts->early_suspend.suspend = rk_ts_early_suspend;\r
+ ts->early_suspend.resume = rk_ts_late_resume;\r
+ register_early_suspend(&ts->early_suspend);\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
+ \r
\r
-#ifdef GOODIX_MULTI_TOUCH\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_PRESSURE, 0, 255, 0, 0);\r
-#endif \r
-\r
- sprintf(ts->phys, "input/ts");\r
- ts->input_dev->name = goodix_ts_name;\r
- ts->input_dev->phys = ts->phys;\r
- ts->input_dev->id.bustype = BUS_I2C;\r
- ts->input_dev->id.vendor = 0xDEAD;\r
- ts->input_dev->id.product = 0xBEEF;\r
- ts->input_dev->id.version = 10427; //screen firmware version\r
- \r
- ret = input_register_device(ts->input_dev);\r
- if (ret) {\r
- dev_err(&client->dev,"Probe: Unable to register %s input device\n", ts->input_dev->name);\r
- goto err_input_register_device_failed;\r
- }\r
- ts->bad_data = 0;\r
\r
-#ifdef INT_PORT \r
- client->irq=TS_INT; //If not defined in client\r
- if (client->irq)\r
+ ts->irq=gpio_to_irq(ts->irq_pin) ; //If not defined in client\r
+ if (ts->irq)\r
{\r
- ret = gpio_request(INT_PORT, "TS_INT"); //Request IO\r
+ ret = gpio_request(pdata->irq_pin, "TS_IRQ_PIN"); //Request IO\r
if (ret < 0) \r
{\r
- dev_err(&client->dev, "Failed to request GPIO:%d, ERRNO:%d\n",(int)INT_PORT,ret);\r
+ printk(KERN_ALERT "Failed to request for touch irq\n");\r
goto err_gpio_request_failed;\r
}\r
- // s3c_gpio_setpull(INT_PORT, S3C_GPIO_PULL_UP); //ret > 0 ?\r
- // s3c_gpio_cfgpin(INT_PORT, INT_CFG); //Set IO port function \r
- // printk("irq is %d\n",irq_table[ts->int_trigger_type]);//add by fjp 2010-9-28\r
- ret = request_irq(client->irq, goodix_ts_irq_handler , /* irq_table[ts->int_trigger_type]*/IRQ_TYPE_LEVEL_LOW,\r
- client->name, ts);\r
+ else\r
+ {\r
+ gpio_direction_input(pdata->irq_pin);\r
+ }\r
+\r
+ ret = request_irq(ts->irq, rk_ts_irq_handler ,IRQ_TYPE_LEVEL_LOW,client->name, ts);\r
if (ret != 0) {\r
- dev_err(&client->dev,"Cannot allocate ts INT!ERRNO:%d\n", ret);\r
- gpio_direction_input(INT_PORT);\r
+ printk(KERN_ALERT "Cannot allocate ts INT!ERRNO:%d\n", ret);\r
gpio_free(INT_PORT);\r
goto err_gpio_request_failed;\r
}\r
else \r
{ \r
- disable_irq(client->irq);\r
- ts->use_irq = 1;\r
- dev_dbg(&client->dev,"Reques EIRQ %d succesd on GPIO:%d\n",TS_INT,INT_PORT);\r
+ enable_irq(ts->irq);\r
+ \r
} \r
}\r
-#endif \r
- if (!ts->use_irq) \r
- {\r
- hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);\r
- ts->timer.function = goodix_ts_timer_func;\r
- hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL);\r
- }\r
-\r
-#if defined(INT_PORT)\r
- if(ts->use_irq) \r
- ts->power = goodix_ts_power;\r
-#endif\r
-\r
-#if 1\r
- ret = goodix_read_version(ts, &version_info);\r
- if(ret <= 0)\r
- {\r
- printk(KERN_INFO"Read version data failed!\n");\r
- }\r
- else\r
- {\r
- printk(KERN_INFO"Goodix TouchScreen Version:%s\n", (version_info+1));\r
- }\r
- vfree(version_info);\r
-#endif\r
- \r
-#ifdef CONFIG_HAS_EARLYSUSPEND\r
- ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;\r
- ts->early_suspend.suspend = goodix_ts_early_suspend;\r
- ts->early_suspend.resume = goodix_ts_late_resume;\r
- register_early_suspend(&ts->early_suspend);\r
-#endif\r
-#ifdef CONFIG_TOUCHSCREEN_GOODIX_IAP\r
- goodix_proc_entry = create_proc_entry("goodix-update", 0666, NULL);\r
- if(goodix_proc_entry == NULL)\r
- {\r
- dev_info(&client->dev, "Couldn't create proc entry!\n");\r
- ret = -ENOMEM;\r
- goto err_create_proc_entry;\r
- }\r
- else\r
- {\r
- dev_info(&client->dev, "Create proc entry success!\n");\r
- printk("Create proc entry success!\n");\r
- goodix_proc_entry->write_proc = goodix_update_write;\r
- goodix_proc_entry->read_proc = goodix_update_read;\r
- //goodix_proc_entry->owner = THIS_MODULE;\r
- }\r
-#endif\r
- ts->pendown =PEN_RELEASE;\r
-#if 0\r
- goodix_debug_sysfs_init();\r
- dev_info(&client->dev,"Start %s in %s mode\n", \r
- ts->input_dev->name, ts->use_irq ? "interrupt" : "polling");\r
- dev_info(&client->dev, "Driver Modify Date:2011-06-13\n");\r
-#endif\r
- \r
- if(ts->use_irq)\r
- enable_irq(client->irq);\r
- printk("Goodix TS probe successfully!\n");\r
+ printk("Goodix TS probe successfully! max_x:%d>>max_y:%d>>max_support_point:%d\n",\r
+ ts->abs_x_max,ts->abs_y_max,ts->max_touch_num);\r
return 0;\r
err_init_godix_ts:\r
if(ts->use_irq)\r
return:\r
Executive outcomes. 0---succeed.\r
*******************************************************/\r
-static int goodix_ts_remove(struct i2c_client *client)\r
+static int rk_ts_remove(struct i2c_client *client)\r
{\r
- struct goodix_ts_data *ts = i2c_get_clientdata(client);\r
+ struct rk_ts_data *ts = i2c_get_clientdata(client);\r
#ifdef CONFIG_HAS_EARLYSUSPEND\r
unregister_early_suspend(&ts->early_suspend);\r
#endif\r
return 0;\r
}\r
\r
-static int goodix_ts_suspend(struct i2c_client *client, pm_message_t mesg)\r
-{\r
- int ret;\r
- struct goodix_ts_data *ts = i2c_get_clientdata(client);\r
\r
- \r
- if (ts->use_irq)\r
- disable_irq(client->irq);\r
- else\r
- hrtimer_cancel(&ts->timer);\r
-#if 1\r
- if (ts->power) {\r
- ret = ts->power(ts, 0);\r
- if (ret < 0)\r
- printk(KERN_ERR "goodix_ts_resume power off failed\n");\r
- }\r
-#endif\r
- return 0;\r
-}\r
-\r
-static int goodix_ts_resume(struct i2c_client *client)\r
-{\r
- int ret;\r
- struct goodix_ts_data *ts = i2c_get_clientdata(client);\r
- \r
-#if 1\r
- if (ts->power) {\r
- ret = ts->power(ts, 1);\r
- if (ret < 0)\r
- printk(KERN_ERR "goodix_ts_resume power on failed\n");\r
- }\r
-#endif\r
- if (ts->use_irq)\r
- enable_irq(client->irq);\r
- else\r
- hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL);\r
- //gpio_set_value(RK29_PIN6_PC3,GPIO_HIGH);\r
-\r
- return 0;\r
-}\r
-\r
-#ifdef CONFIG_HAS_EARLYSUSPEND\r
-static void goodix_ts_early_suspend(struct early_suspend *h)\r
-{\r
- struct goodix_ts_data *ts;\r
- ts = container_of(h, struct goodix_ts_data, early_suspend);\r
- goodix_ts_suspend(ts->client, PMSG_SUSPEND);\r
-}\r
-\r
-static void goodix_ts_late_resume(struct early_suspend *h)\r
-{\r
- struct goodix_ts_data *ts;\r
- ts = container_of(h, struct goodix_ts_data, early_suspend);\r
- goodix_ts_resume(ts->client);\r
-}\r
-#endif\r
\r
//******************************Begin of firmware update surpport*******************************\r
#ifdef CONFIG_TOUCHSCREEN_GOODIX_IAP\r
return 1; \r
}\r
\r
-unsigned char wait_slave_ready(struct goodix_ts_data *ts, unsigned short *timeout)\r
+unsigned char wait_slave_ready(struct rk_ts_data *ts, unsigned short *timeout)\r
{\r
unsigned char i2c_state_buf[2] = {ADDR_STA, UNKNOWN_ERROR};\r
int ret;\r
while(*timeout < MAX_TIMEOUT)\r
{\r
- ret = i2c_read_bytes(ts->client, i2c_state_buf, 2);\r
+ ret = goodix_i2c_read_bytes(ts->client, i2c_state_buf, 2);\r
if(ret <= 0)\r
return ERROR_I2C_TRANSFER;\r
if(i2c_state_buf[1] & SLAVE_READY)\r
\r
struct file * file_data = NULL;\r
mm_segment_t old_fs;\r
- struct goodix_ts_data *ts;\r
+ struct rk_ts_data *ts;\r
\r
ts = i2c_get_clientdata(i2c_connect_client);\r
if(ts==NULL)\r
case STEP_WRITE_SYN:\r
printk(KERN_INFO"STEP1:Write synchronization signal!\n");\r
i2c_control_buf[1] = UPDATE_START;\r
- ret = i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
+ ret = goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
if(ret <= 0)\r
{\r
ret = ERROR_I2C_TRANSFER;\r
while(retries < MAX_I2C_RETRIES)\r
{\r
i2c_states_buf[1] = UNKNOWN_ERROR;\r
- ret = i2c_read_bytes(ts->client, i2c_states_buf, 2);\r
+ ret = goodix_i2c_read_bytes(ts->client, i2c_states_buf, 2);\r
printk(KERN_INFO"The read byte is:%d\n", i2c_states_buf[1]);\r
if(i2c_states_buf[1] & UPDATE_START)\r
{\r
i2c_data_buf[3] = (file_len>>8) & 0xff;\r
i2c_data_buf[4] = file_len & 0xff;\r
file_len -= 4;\r
- ret = i2c_write_bytes(ts->client, i2c_data_buf, 5);\r
+ ret = goodix_i2c_write_bytes(ts->client, i2c_data_buf, 5);\r
if(ret <= 0)\r
{\r
ret = ERROR_I2C_TRANSFER;\r
}\r
rewrite:\r
printk(KERN_INFO"[GOODiX_ISP_NEW]:%d\n", file_len); \r
- ret = i2c_write_bytes(ts->client, i2c_data_buf, 1+4+rd_len+4);\r
+ ret = goodix_i2c_write_bytes(ts->client, i2c_data_buf, 1+4+rd_len+4);\r
//if(ret <= 0)\r
if(ret != 1)\r
{\r
}\r
\r
memset(i2c_rd_buf, 0x00, 1+4+rd_len+4);\r
- ret = i2c_read_bytes(ts->client, i2c_rd_buf, 1+4+rd_len+4);\r
+ ret = goodix_i2c_read_bytes(ts->client, i2c_rd_buf, 1+4+rd_len+4);\r
if(ret != 2)\r
{\r
printk("[GOODiX_ISP_NEW]:Read File Data Failed!Return:%d\n", ret);\r
{\r
i2c_control_buf[0] = ADDR_CMD;\r
i2c_control_buf[1] = 0x03;\r
- i2c_write_bytes(ts->client, i2c_control_buf, 2); //communication error\r
+ goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2); //communication error\r
printk("[GOODiX_ISP_NEW]:File Data Frame readback check Error!\n");\r
}\r
else\r
{\r
i2c_control_buf[1] = 0x04; //let LDROM write flash\r
- i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
+ goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
}\r
\r
//Wait for slave ready signal.and read the checksum\r
i2c_data_buf[file_len+2] = (oldcrc32>>8)&0xff;\r
i2c_data_buf[file_len+3] = (oldcrc32>>16)&0xff;\r
i2c_data_buf[file_len+4] = (oldcrc32>>24)&0xff;\r
- ret = i2c_write_bytes(ts->client, i2c_data_buf, (file_len+1+4));\r
+ ret = goodix_i2c_write_bytes(ts->client, i2c_data_buf, (file_len+1+4));\r
//if(ret <= 0)\r
if(ret != 1)\r
{\r
}\r
else\r
{\r
- ret = i2c_write_bytes(ts->client, i2c_data_buf, PACK_SIZE+1);\r
+ ret = goodix_i2c_write_bytes(ts->client, i2c_data_buf, PACK_SIZE+1);\r
//if(ret <= 0)\r
if(ret != 1)\r
{\r
printk(KERN_INFO"STEP6:Read update status!\n");\r
while(time_count < MAX_TIMEOUT)\r
{\r
- ret = i2c_read_bytes(ts->client, i2c_states_buf, 2);\r
+ ret = goodix_i2c_read_bytes(ts->client, i2c_states_buf, 2);\r
if(ret <= 0)\r
{\r
return 0;\r
printk(KERN_INFO"Read raw data!\n");\r
ts->read_mode = MODE_RD_RAW;\r
i2c_control_buf[1] = 201;\r
- ret = i2c_write_bytes(ts->client, i2c_control_buf, 2); //read raw data cmd\r
+ ret = goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2); //read raw data cmd\r
if(ret <= 0)\r
{\r
printk(KERN_INFO"Write read raw data cmd failed!\n");\r
printk(KERN_INFO"Read diff data!\n");\r
ts->read_mode = MODE_RD_DIF;\r
i2c_control_buf[1] = 202;\r
- ret = i2c_write_bytes(ts->client, i2c_control_buf, 2); //read diff data cmd\r
+ ret = goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2); //read diff data cmd\r
if(ret <= 0)\r
{\r
printk(KERN_INFO"Write read raw data cmd failed!\n");\r
{\r
checksum_error_times = 0;\r
reconfig:\r
- ret = i2c_write_bytes(ts->client, cmd+2, cmd[1]); \r
+ ret = goodix_i2c_write_bytes(ts->client, cmd+2, cmd[1]); \r
if(ret != 1)\r
{\r
printk("Write Config failed!return:%d\n",ret);\r
if(!update_need_config)return 1;\r
\r
i2c_rd_buf[0] = cmd[2];\r
- ret = i2c_read_bytes(ts->client, i2c_rd_buf, cmd[1]);\r
+ ret = goodix_i2c_read_bytes(ts->client, i2c_rd_buf, cmd[1]);\r
if(ret != 2)\r
{\r
printk("Read Config failed!return:%d\n",ret);\r
{\r
i2c_control_buf[0] = ADDR_CMD;\r
i2c_control_buf[1] = 0x03;\r
- i2c_write_bytes(ts->client, i2c_control_buf, 2); //communication error\r
+ goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2); //communication error\r
checksum_error_times++;\r
msleep(20);\r
if(checksum_error_times > 20) //max retry times.\r
{\r
i2c_control_buf[0] = ADDR_CMD;\r
i2c_control_buf[1] = 0x04; //let LDROM write flash\r
- i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
+ goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
return 1;\r
}\r
\r
static int goodix_update_read( char *page, char **start, off_t off, int count, int *eof, void *data )\r
{\r
int ret = -1;\r
- struct goodix_ts_data *ts;\r
+ struct rk_ts_data *ts;\r
int len = 0;\r
char *version_info = NULL;\r
unsigned char read_data[1201] = {80, };\r
else if((ts->read_mode == MODE_RD_RAW)||(ts->read_mode == MODE_RD_DIF)) //read raw data or diff\r
{\r
//printk(KERN_INFO"Read raw data\n");\r
- ret = i2c_read_bytes(ts->client, read_data, 1201);\r
+ ret = goodix_i2c_read_bytes(ts->client, read_data, 1201);\r
if(ret <= 0)\r
{\r
if(ts->read_mode == 2)\r
rd_cfg_len = 239 - read_data[0];\r
}\r
printk("read config length is:%d\n", rd_cfg_len);\r
- ret = i2c_read_bytes(ts->client, read_data, rd_cfg_len);\r
+ ret = goodix_i2c_read_bytes(ts->client, read_data, rd_cfg_len);\r
if(ret <= 0)\r
{\r
printk(KERN_INFO"Read config info failed!\n");\r
{ }\r
};\r
\r
-static struct i2c_driver goodix_ts_driver = {\r
- .probe = goodix_ts_probe,\r
- .remove = goodix_ts_remove,\r
+static struct i2c_driver rk_ts_driver = {\r
+ .probe = rk_ts_probe,\r
+ .remove = rk_ts_remove,\r
#ifndef CONFIG_HAS_EARLYSUSPEND\r
- .suspend = goodix_ts_suspend,\r
- .resume = goodix_ts_resume,\r
+ .suspend = rk_ts_suspend,\r
+ .resume = rk_ts_resume,\r
#endif\r
.id_table = goodix_ts_id,\r
.driver = {\r
return:\r
Executive Outcomes. 0---succeed.\r
********************************************************/\r
-static int __devinit goodix_ts_init(void)\r
+static int __devinit rk_ts_init(void)\r
{\r
- int ret;\r
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)\r
- goodix_wq = create_rt_workqueue("goodix_wq"); //create a work queue and worker thread\r
-#else\r
- goodix_wq = create_workqueue("goodix_touch_wq"); \r
-#endif\r
- if (!goodix_wq) {\r
- printk(KERN_ALERT "creat workqueue faiked\n");\r
- return -ENOMEM;\r
- \r
- }\r
- ret=i2c_add_driver(&goodix_ts_driver);\r
+ int ret ;\r
+ ret=i2c_add_driver(&rk_ts_driver);\r
return ret; \r
}\r
\r
return:\r
Executive Outcomes. 0---succeed.\r
********************************************************/\r
-static void __exit goodix_ts_exit(void)\r
+static void __exit rk_ts_exit(void)\r
{\r
printk(KERN_ALERT "Touchscreen driver of guitar exited.\n");\r
- i2c_del_driver(&goodix_ts_driver);\r
- if (goodix_wq)\r
- destroy_workqueue(goodix_wq); //release our work queue\r
+ i2c_del_driver(&rk_ts_driver);\r
}\r
\r
-module_init(goodix_ts_init);\r
-module_exit(goodix_ts_exit);\r
+module_init(rk_ts_init);\r
+module_exit(rk_ts_exit);\r
\r
MODULE_DESCRIPTION("Goodix Touchscreen Driver");\r
MODULE_LICENSE("GPL");\r