rk30:update goodix driver from rk29
[firefly-linux-kernel-4.4.55.git] / drivers / input / touchscreen / rk29_i2c_goodix.c
1 /* drivers/input/touchscreen/goodix_touch.c\r
2  *\r
3  * Copyright (C) 2010 - 2011 Goodix, Inc.\r
4  * \r
5  * This program is free software; you can redistribute it and/or modify\r
6  * it under the terms of the GNU General Public License as published by\r
7  * the Free Software Foundation; either version 2 of the License, or\r
8  * (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful, but WITHOUT\r
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\r
13  * more details.\r
14  *\r
15  */\r
16 #include <linux/kernel.h>\r
17 #include <linux/module.h>\r
18 #include <linux/time.h>\r
19 #include <linux/delay.h>\r
20 #include <linux/device.h>\r
21 #include <linux/earlysuspend.h>\r
22 #include <linux/hrtimer.h>\r
23 #include <linux/i2c.h>\r
24 #include <linux/input.h>\r
25 #include <linux/input/mt.h>\r
26 \r
27 #include <linux/interrupt.h>\r
28 #include <linux/io.h>\r
29 #include <linux/platform_device.h>\r
30 #include <mach/gpio.h>\r
31 \r
32 #include <linux/irq.h>\r
33 #include <linux/syscalls.h>\r
34 #include <linux/reboot.h>\r
35 #include <linux/proc_fs.h>\r
36 #include "rk29_i2c_goodix.h"\r
37 \r
38 #include <linux/vmalloc.h>\r
39 #include <linux/fs.h>\r
40 #include <linux/string.h>\r
41 #include <linux/completion.h>\r
42 #include <asm/uaccess.h>\r
43 #include <mach/board.h>\r
44 \r
45 #define PEN_DOWN 1\r
46 #define PEN_RELEASE 0\r
47 #define PEN_DOWN_UP 2 //fjp\r
48 \r
49 static struct rk_touch_info *info_buf;\r
50 \r
51 static int dbg_thresd = 0;\r
52 #define DBG(x...) do { if(unlikely(dbg_thresd)) printk(KERN_INFO x); } while (0)\r
53 \r
54 \r
55 /*******************************************************        \r
56 Description:\r
57         Read data from the i2c slave device;\r
58         This operation consisted of 2 i2c_msgs,the first msg used\r
59         to write the operate address,the second msg used to read data.\r
60 \r
61 Parameter:\r
62         client: i2c device.\r
63         buf[0]:operate address.\r
64         buf[1]~buf[len]:read data buffer.\r
65         len:operate length.\r
66         \r
67 return:\r
68         numbers of i2c_msgs to transfer\r
69 *********************************************************/\r
70 static int goodix_i2c_read_bytes(struct i2c_client *client, uint8_t *buf, int len)\r
71 {\r
72         struct i2c_msg msgs[2];\r
73         int ret=-1;\r
74         int retries = 0;\r
75 \r
76         msgs[0].flags = client->flags;\r
77         msgs[0].addr=client->addr;\r
78         msgs[0].len=1;\r
79         msgs[0].buf=&buf[0];\r
80         msgs[0].udelay = client->udelay;\r
81         msgs[0].scl_rate=200 * 1000;\r
82 \r
83         msgs[1].flags = client->flags | I2C_M_RD;\r
84         msgs[1].addr=client->addr;\r
85         msgs[1].len=len-1;\r
86         msgs[1].buf=&buf[1];\r
87         msgs[1].udelay = client->udelay;\r
88         msgs[1].scl_rate=200 * 1000;\r
89 \r
90         //disable_irq(client->irq);\r
91         while(retries<5)\r
92         {\r
93                 ret=i2c_transfer(client->adapter,msgs, 2);\r
94                 if(ret == 2)break;\r
95                 retries++;\r
96         }\r
97         //enable_irq(client->irq);\r
98         return ret;\r
99 }\r
100 \r
101 /*******************************************************        \r
102 Description:\r
103         write data to the i2c slave device.\r
104 \r
105 Parameter:\r
106         client: i2c device.\r
107         buf[0]:operate address.\r
108         buf[1]~buf[len]:write data buffer.\r
109         len:operate length.\r
110         \r
111 return:\r
112         numbers of i2c_msgs to transfer.\r
113 *********************************************************/\r
114 static int goodix_i2c_write_bytes(struct i2c_client *client,uint8_t *data,int len)\r
115 {\r
116         struct i2c_msg msg;\r
117         int ret=-1;\r
118         int retries = 0;\r
119 \r
120         msg.flags=!I2C_M_RD;\r
121         msg.addr=client->addr;\r
122         msg.len=len;\r
123         msg.buf=data;           \r
124         msg.udelay = client->udelay;\r
125         msg.scl_rate=200 * 1000;\r
126         \r
127         //disable_irq(client->irq);\r
128         while(retries<5)\r
129         {\r
130                 ret=i2c_transfer(client->adapter,&msg, 1);\r
131                 if(ret == 1)break;\r
132                 retries++;\r
133         }\r
134         //enable_irq(client->irq);\r
135         return ret;\r
136 }\r
137 \r
138 /*******************************************************\r
139 Description:\r
140         Goodix touchscreen initialize function.\r
141 \r
142 Parameter:\r
143         ts:     i2c client private struct.\r
144         \r
145 return:\r
146         Executive outcomes.0---succeed.\r
147 *******************************************************/\r
148 static int goodix_init_panel(struct rk_ts_data *ts)\r
149 {\r
150         int ret=-1;\r
151         uint8_t rd_cfg_buf[7] = {0x66,};\r
152 \r
153 #if (TS_MAX_X == 1024)&&(TS_MAX_Y == 768)                       //for malata 10.1\r
154         uint8_t config_info[] = {\r
155                 0x65,0x02,0x04,0x00,0x03,0x00,0x0A,0x22,0x1E,0xE7,0x32,0x05,0x08,0x10,0x4C,\r
156                 0x41,0x41,0x20,0x09,0x00,0xA0,0xA0,0x3C,0x64,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,\r
157                 0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x1D,0x1C,0x1B,0x1A,0x19,0x18,\r
158                 0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,\r
159                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
160                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r
161         };\r
162              \r
163 #elif (TS_MAX_X == 1280)&&(TS_MAX_Y == 800)     \r
164         uint8_t config_info[] = {\r
165                 0x65,0x02,0x05,0x00,0x03,0x20,0x0A,0x22,0x1E,0xE7,0x32,0x05,0x08,0x10,0x4C,\r
166                 0x41,0x41,0x20,0x07,0x00,0xA0,0xA0,0x46,0x64,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,\r
167                 0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x1D,0x1C,0x1B,0x1A,0x19,0x18,\r
168                 0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,\r
169                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
170                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r
171         };\r
172 #else\r
173         uint8_t config_info[] = {\r
174                 0x65,0x02,0x05,0x00,0x03,0x20,0x0A,0x22,0x1E,0xE7,0x32,0x05,0x08,0x10,0x4C,\r
175                 0x42,0x42,0x20,0x00,0x00,0x89,0x89,0x3C,0x64,0x0E,0x0D,0x0C,0x0B,\r
176                 0x0A,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x1D,0x1C,\r
177                 0x1B,0x1A,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0F,\r
178                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
179                 0x2B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
180                 0x00,0x00,0x00,0x00\r
181         };\r
182 #endif\r
183         ret=goodix_i2c_write_bytes(ts->client,config_info, (sizeof(config_info)/sizeof(config_info[0])));\r
184         if (ret < 0) {\r
185                 printk("goodix write cfg info err");\r
186                 return ret;\r
187         }\r
188         ret=goodix_i2c_read_bytes(ts->client, rd_cfg_buf, 7);\r
189         if(ret != 2)\r
190         {\r
191                 dev_info(&ts->client->dev, "Read resolution & max_touch_num failed, use default value!\n");\r
192                 ts->max_touch_num = MAX_FINGER_NUM;\r
193                 //ts->int_trigger_type = INT_TRIGGER;\r
194                 return 0;\r
195         }\r
196         ts->abs_x_max = (rd_cfg_buf[1]<<8) + rd_cfg_buf[2];\r
197         ts->abs_y_max = (rd_cfg_buf[3]<<8) + rd_cfg_buf[4];\r
198         ts->max_touch_num = rd_cfg_buf[5];\r
199         //ts->int_trigger_type = rd_cfg_buf[6]&0x03;\r
200         if((!ts->abs_x_max)||(!ts->abs_y_max)||(!ts->max_touch_num))\r
201         {\r
202                 printk(KERN_INFO "Read invalid resolution & max_touch_num, use default value!\n");\r
203                 ts->max_touch_num = MAX_FINGER_NUM;\r
204         }\r
205 \r
206         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
207         \r
208         rd_cfg_buf[0] = 0x6e;\r
209         rd_cfg_buf[1] = 0x00;\r
210         goodix_i2c_read_bytes(ts->client, rd_cfg_buf, 2);\r
211         if((rd_cfg_buf[1]&0x0f)==0x0f)\r
212         {\r
213                 dev_info(&ts->client->dev, "Need int wake up from green mode!\n");\r
214         }\r
215 \r
216         return 0;\r
217 \r
218 }\r
219 \r
220 //fjp add ===============================\r
221 static bool goodix_get_status(char *p1,int*p2)\r
222 {\r
223         bool status = PEN_DOWN;\r
224         if((*p2==PEN_DOWN) && (*p1==PEN_RELEASE))\r
225                 {\r
226                         *p2 = PEN_DOWN_UP; //¸Õ¸Õµ¯Æð\r
227                          status = PEN_RELEASE; \r
228                 }\r
229         else if((*p2==PEN_RELEASE) && (*p1==PEN_RELEASE))\r
230                 {\r
231                    *p2 = PEN_RELEASE;\r
232                         status = PEN_RELEASE; \r
233                 }\r
234         else\r
235                 {\r
236                         *p2 = PEN_DOWN;\r
237                 }\r
238         return status;\r
239 }\r
240 \r
241 //===================================\r
242 /*******************************************************\r
243 Description:\r
244         Read goodix touchscreen version function.\r
245 \r
246 Parameter:\r
247         ts:     i2c client private struct.\r
248         \r
249 return:\r
250         Executive outcomes.0---succeed.\r
251 *******************************************************/\r
252 static int  goodix_read_version(struct rk_ts_data *ts, char **version)\r
253 {\r
254         int ret = -1, count = 0;\r
255         char *version_data;\r
256         char *p;\r
257 \r
258         *version = (char *)vmalloc(18);\r
259         version_data = *version;\r
260         if(!version_data)\r
261                 return -ENOMEM;\r
262         p = version_data;\r
263         memset(version_data, 0, sizeof(version_data));\r
264         version_data[0]=240;    \r
265         ret=goodix_i2c_read_bytes(ts->client,version_data, 17);\r
266         if (ret < 0) \r
267                 return ret;\r
268         version_data[17]='\0';\r
269         \r
270         if(*p == '\0')\r
271                 return 0;       \r
272         do                                      \r
273         {\r
274                 if((*p > 122) || (*p < 48 && *p != 32) || (*p >57 && *p  < 65) \r
275                         ||(*p > 90 && *p < 97 && *p  != '_'))           //check illeqal character\r
276                         count++;\r
277         }while(*++p != '\0' );\r
278         if(count > 2)\r
279                 return 0;\r
280         else \r
281                 return 1;       \r
282 }\r
283 \r
284 static int last_touch_num = -1;\r
285 static void goodix_get_touch_info(struct rk_ts_data *ts,char *point_num,struct rk_touch_info* info_buf)\r
286 {\r
287         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
288         uint8_t  check_sum = 0;\r
289         int ret ;\r
290         uint16_t  finger_current = 0;\r
291         uint16_t  finger_bit = 0;\r
292         unsigned int  count = 0, point_count = 0;\r
293         unsigned char touch_num = 0;\r
294         uint8_t chksum_err = 0;\r
295         unsigned int position = 0;      \r
296         uint8_t track_id[MAX_FINGER_NUM] = {0};\r
297         u8 index;\r
298         u8 temp =0;\r
299         point_data[0] = READ_COOR_ADDR;         //read coor address\r
300 \r
301         \r
302         ret=goodix_i2c_read_bytes(ts->client, point_data, sizeof(point_data)/sizeof(point_data[0]));\r
303         if(ret != 2)    \r
304         {\r
305             printk("goodix read error\n");\r
306         }       \r
307         finger_current =  (point_data[3 - READ_COOR_ADDR]<<8) + point_data[2 - READ_COOR_ADDR];\r
308         \r
309         DBG("finger_current:%d ==== max_touch_num:%d\n", finger_current,ts->max_touch_num);//add by fjp 2010-9-28\r
310         \r
311 \r
312         if(finger_current)\r
313         {       \r
314                 point_count = 0;\r
315                 finger_bit = finger_current;\r
316                 for(count = 0; (finger_bit != 0) && (count < ts->max_touch_num); count++)//cal how many point touch currntly\r
317                 {\r
318                         if(finger_bit & 0x01)\r
319                         {\r
320                                 track_id[count] = PEN_DOWN;\r
321                                 point_count++;\r
322                         }\r
323                         finger_bit >>= 1;\r
324                 }\r
325                 touch_num = point_count;\r
326 \r
327                 check_sum = point_data[2 - READ_COOR_ADDR] + point_data[3 - READ_COOR_ADDR];                    //cal coor checksum\r
328                 count = 4 - READ_COOR_ADDR;\r
329                 for(point_count *= 5; point_count > 0; point_count--)\r
330                         check_sum += point_data[count++];\r
331                 check_sum += point_data[count];\r
332                 if(check_sum  != 0)                     //checksum verify error\r
333                 {\r
334                         printk("coor checksum error!\n");\r
335                 }\r
336                 else\r
337                 {\r
338                         chksum_err = 0;\r
339                 }\r
340         }\r
341 \r
342         //printk("current point num:%d\n",touch_num);\r
343         *point_num = touch_num;\r
344         if(touch_num < last_touch_num)  //some flinger release\r
345         {\r
346                 //printk("%d flinger release\n",last_touch_num-touch_num);\r
347                 /*for(index = touch_num; index < last_touch_num; index++)\r
348                         info_buf[index].status = 0;*/\r
349                 *point_num = last_touch_num;\r
350                  touch_num = last_touch_num;\r
351         }\r
352         last_touch_num = touch_num;\r
353         for(index = 0; index < touch_num; index++)\r
354         {\r
355              if(goodix_get_status(&track_id[index],&info_buf[index].status))\r
356                 {\r
357                 position = 4 - READ_COOR_ADDR + 5*(temp++);\r
358                 info_buf[index].x = (unsigned int) (point_data[position]<<8) + (unsigned int)( point_data[position+1]);\r
359                 info_buf[index].y  = (unsigned int)(point_data[position+2]<<8) + (unsigned int) (point_data[position+3]);\r
360                 info_buf[index].press = (unsigned int) (point_data[position+4]);        \r
361                 }\r
362         }\r
363         \r
364 }\r
365 \r
366 \r
367 /*******************************************************\r
368 Description:\r
369         Goodix touchscreen work function.\r
370 \r
371 Parameter:\r
372         ts:     i2c client private struct.\r
373         \r
374 return:\r
375         Executive outcomes.0---succeed.\r
376 *******************************************************/\r
377 static void  rk_ts_work_func(struct work_struct *pwork)\r
378 {       \r
379         int i =0;\r
380         //struct rk_touch_info *info_buf;\r
381         char point_num;\r
382         struct rk_ts_data *ts = container_of(to_delayed_work(pwork), struct rk_ts_data, ts_work);\r
383         if(!ts)\r
384         {\r
385                 printk("container of rk_ts_data fail\n");\r
386         }\r
387         \r
388 //      info_buf= kzalloc(ts->max_touch_num*sizeof(struct rk_touch_info), GFP_KERNEL);\r
389 //      if(!info_buf)\r
390         //{\r
391 //              printk(KERN_ALERT "alloc for rk_touch_info fail\n");\r
392 //              goto exit;\r
393         //}\r
394 \r
395         if(ts->get_touch_info)\r
396         {\r
397                  ts->get_touch_info(ts,&point_num,info_buf);\r
398         }\r
399         for(i=0; i< point_num; i++)\r
400         {\r
401            DBG("info_buf[i].status =====%d\n",info_buf[i].status);\r
402               if(info_buf[i].status==PEN_DOWN_UP)\r
403                 {\r
404                        info_buf[i].status=PEN_RELEASE;\r
405                            DBG("the key %d is up------\n",i);\r
406                         input_mt_slot(ts->input_dev, i);\r
407                         input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);\r
408                         continue;\r
409                 }\r
410                 if(info_buf[i].status==PEN_DOWN)\r
411                 {\r
412                         input_mt_slot(ts->input_dev, i);\r
413                         input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true);\r
414                         input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, info_buf[i].press);\r
415                         input_report_abs(ts->input_dev, ABS_MT_POSITION_X, info_buf[i].x);\r
416                         input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, info_buf[i].y);\r
417                         DBG("touch point %d %d >>x:%d>>y:%d\n",i,info_buf[i].status,info_buf[i].x,info_buf[i].y);//add by fjp 2010-9-28 \r
418                 }\r
419                 \r
420        \r
421           \r
422                 \r
423                 \r
424         }\r
425         input_sync(ts->input_dev);\r
426         \r
427     if(gpio_get_value(ts->irq_pin) == GPIO_LOW)\r
428     {\r
429        \r
430         DBG("touch down .............\n");//add by fjp 2010-9-28\r
431         queue_delayed_work(ts->ts_wq, &ts->ts_work,msecs_to_jiffies(20));\r
432         //      goto exit;\r
433                 \r
434     }\r
435     else\r
436     {\r
437                 \r
438         DBG("touch up>>x:%d>>y:%d\n",info_buf[0].x,info_buf[0].y);//add by fjp 2010-9-28\r
439                 /*input_mt_slot(ts->input_dev, 0);\r
440                 input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true);\r
441                 input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0);\r
442                 \r
443                 input_mt_slot(ts->input_dev, 0);\r
444                 input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);*/\r
445 \r
446                 DBG("point_num+++++++++++ = %d\n", point_num);//add by fjp 2010-9-28\r
447                 for(i=0; i< point_num; i++)\r
448                 {\r
449         //        printk("info_buf[i].status +++++++%d\n",info_buf[i].status);\r
450                          if(info_buf[i].status)\r
451                         {\r
452                       input_mt_slot(ts->input_dev, i);//°´ÐòºÅÉϱ¨\r
453                         input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);               \r
454                         //input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0);\r
455                         info_buf[i].status= PEN_RELEASE;\r
456                         \r
457 \r
458                         DBG("release+++++++++++ = %d\n", i);//add by fjp 2010-9-28\r
459 \r
460                         }\r
461                 }\r
462                 input_sync(ts->input_dev);\r
463                 ts->pendown =PEN_RELEASE;\r
464                 last_touch_num = 0;\r
465                 \r
466         enable_irq(ts->irq);            \r
467       }\r
468          \r
469       \r
470 //exit:\r
471           //kfree(info_buf);\r
472           \r
473   }\r
474         \r
475         \r
476         \r
477 \r
478 /*******************************************************\r
479 Description:\r
480         Timer interrupt service routine.\r
481 \r
482 Parameter:\r
483         timer:  timer struct pointer.\r
484         \r
485 return:\r
486         Timer work mode. HRTIMER_NORESTART---not restart mode\r
487 *******************************************************/\r
488 static enum hrtimer_restart goodix_ts_timer_func(struct hrtimer *timer)\r
489 {\r
490         struct rk_ts_data *ts = container_of(timer, struct rk_ts_data, timer);\r
491         queue_delayed_work(goodix_wq,&ts->ts_work,0);\r
492         hrtimer_start(&ts->timer, ktime_set(0, (POLL_TIME+6)*1000000), HRTIMER_MODE_REL);\r
493         return HRTIMER_NORESTART;\r
494 }\r
495 \r
496 /*******************************************************\r
497 Description:\r
498         External interrupt service routine.\r
499 \r
500 Parameter:\r
501         irq:    interrupt number.\r
502         dev_id: private data pointer.\r
503         \r
504 return:\r
505         irq execute status.\r
506 *******************************************************/\r
507 static irqreturn_t rk_ts_irq_handler(int irq, void *dev_id)\r
508 {\r
509 \r
510         struct rk_ts_data *ts = (struct rk_ts_data*)dev_id;\r
511         disable_irq_nosync(ts->irq);\r
512         queue_delayed_work(ts->ts_wq, &ts->ts_work,0);\r
513         \r
514         return IRQ_HANDLED;\r
515 }\r
516 \r
517 static int rk_ts_suspend(struct i2c_client *client, pm_message_t mesg)\r
518 {\r
519         int ret;\r
520         struct rk_ts_data *ts = i2c_get_clientdata(client);\r
521 \r
522        \r
523         \r
524         disable_irq(ts->irq);\r
525         \r
526 #if 1\r
527         if (ts->power) {\r
528                 ret = ts->power(ts, 0);\r
529                 if (ret < 0)\r
530                         printk(KERN_ERR "goodix_ts_resume power off failed\n");\r
531         }\r
532 #endif\r
533         return 0;\r
534 }\r
535 \r
536 static int rk_ts_resume(struct i2c_client *client)\r
537 {\r
538         int ret;\r
539         struct rk_ts_data *ts = i2c_get_clientdata(client);\r
540         \r
541 #if 1\r
542         if (ts->power) {\r
543                 ret = ts->power(ts, 1);\r
544                 if (ret < 0)\r
545                         printk(KERN_ERR "goodix_ts_resume power on failed\n");\r
546         }\r
547 #endif\r
548         \r
549         enable_irq(client->irq);\r
550 \r
551         return 0;\r
552 }\r
553 \r
554 \r
555 \r
556 #ifdef CONFIG_HAS_EARLYSUSPEND\r
557 static void rk_ts_early_suspend(struct early_suspend *h)\r
558 {\r
559         struct rk_ts_data *ts;\r
560         ts = container_of(h, struct rk_ts_data, early_suspend);\r
561         rk_ts_suspend(ts->client, PMSG_SUSPEND);\r
562 }\r
563 \r
564 static void rk_ts_late_resume(struct early_suspend *h)\r
565 {\r
566         struct rk_ts_data *ts;\r
567         ts = container_of(h, struct rk_ts_data, early_suspend);\r
568         rk_ts_resume(ts->client);\r
569 }\r
570 #endif\r
571 \r
572 /*******************************************************\r
573 Description:\r
574         Goodix touchscreen power manage function.\r
575 \r
576 Parameter:\r
577         on:     power status.0---suspend;1---resume.\r
578         \r
579 return:\r
580         Executive outcomes.-1---i2c transfer error;0---succeed.\r
581 *******************************************************/\r
582 static int goodix_ts_power(struct rk_ts_data * ts, int on)\r
583 {\r
584         int ret = -1;\r
585         unsigned char i2c_control_buf[2] = {80,  1};            //suspend cmd\r
586         int retry = 0;\r
587         if(on != 0 && on !=1)\r
588         {\r
589                 printk(KERN_DEBUG "%s: Cant't support this command.", rk_ts_name);\r
590                 return -EINVAL;\r
591         }\r
592         \r
593         \r
594         if(on == 0)             //suspend\r
595         { \r
596         while(retry<5)\r
597                 {\r
598                         ret = goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
599                         if(ret == 1)\r
600                         {\r
601                                 printk(KERN_INFO"touch goodix Send suspend cmd successed \n");\r
602                                 break;\r
603                         }\r
604                        retry++;\r
605                         msleep(10);\r
606                 }\r
607                 if(ret > 0)\r
608                   ret = 0;\r
609         }\r
610         else if(on == 1)                //resume\r
611         {\r
612                 printk(KERN_INFO"touch goodix int resume\n");\r
613                 gpio_set_value(ts->rst_pin,GPIO_LOW);   \r
614                 msleep(20);\r
615             gpio_set_value(ts->rst_pin,GPIO_HIGH);\r
616                 ret = 0;\r
617         }        \r
618         return ret;\r
619 }\r
620 \r
621 \r
622 static int goodix_input_params_init(struct rk_ts_data *ts)\r
623 {\r
624         int ret ;\r
625         ts->input_dev = input_allocate_device();\r
626         if (ts->input_dev == NULL) {\r
627                 ret = -ENOMEM;\r
628                 printk(KERN_ALERT "Failed to allocate input device\n");\r
629                 return ret;\r
630         }\r
631 \r
632 \r
633         __set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit);\r
634         __set_bit(EV_ABS, ts->input_dev->evbit);\r
635 \r
636         input_mt_init_slots(ts->input_dev, ts->max_touch_num);\r
637         input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);\r
638         input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max, 0, 0);\r
639         input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, ts->abs_y_max, 0, 0);\r
640         sprintf(ts->phys, "input/rkts");\r
641         ts->input_dev->name = rk_ts_name;\r
642         ts->input_dev->phys = ts->phys;\r
643         ts->input_dev->id.bustype = BUS_I2C;\r
644         ts->input_dev->id.vendor = 0xDEAD;\r
645         ts->input_dev->id.product = 0xBEEF;\r
646         ts->input_dev->id.version = 10427;      //screen firmware version\r
647         \r
648         ret = input_register_device(ts->input_dev);\r
649         if (ret) {\r
650                 printk(KERN_ALERT "Probe: Unable to register %s input device\n", ts->input_dev->name);\r
651                 return -1;\r
652         }\r
653 \r
654         return 0 ;\r
655         \r
656 }\r
657         \r
658 static int goodix_ts_init(struct rk_ts_data *ts)\r
659 {\r
660         char retry;\r
661         char ret ;\r
662         char test_data = 1;\r
663         char *version_info = NULL;\r
664         for(retry=0;retry < 30; retry++)    //test goodix\r
665         {\r
666                 ret =goodix_i2c_write_bytes(ts->client, &test_data, 1);\r
667                 if (ret > 0)\r
668                         break;\r
669         }\r
670         if(ret <= 0)\r
671         {\r
672                 printk(KERN_INFO "I2C communication ERROR!Goodix touchscreen driver become invalid\n");\r
673                 return -1;\r
674         }       \r
675         \r
676         \r
677         ret=goodix_init_panel(ts);\r
678         if(ret != 0) {\r
679                 printk("goodix panel init fail\n");\r
680                 return -1;\r
681         }\r
682         else\r
683         {\r
684                 printk(KERN_INFO "%s>>>>>>>max_point %d\n",__func__,ts->max_touch_num);\r
685         }\r
686         ret = goodix_read_version(ts, &version_info);\r
687         if(ret <= 0)\r
688         {\r
689                 printk(KERN_INFO"Read version data failed!\n");\r
690         }\r
691         else\r
692         {\r
693                 printk(KERN_INFO"Goodix TouchScreen Version:%s>>>max_point:%d\n", (version_info+1),ts->max_touch_num);\r
694         }\r
695         vfree(version_info);\r
696         #ifdef CONFIG_TOUCHSCREEN_GOODIX_IAP\r
697         goodix_proc_entry = create_proc_entry("goodix-update", 0666, NULL);\r
698         if(goodix_proc_entry == NULL)\r
699         {\r
700                 printk("Couldn't create proc entry!\n");\r
701                 ret = -ENOMEM;\r
702                 return ret ;\r
703         }\r
704         else\r
705         {\r
706                 printk("Create proc entry success!\n");\r
707                 goodix_proc_entry->write_proc = goodix_update_write;\r
708                 goodix_proc_entry->read_proc = goodix_update_read;\r
709                 //goodix_proc_entry->owner = THIS_MODULE;\r
710         }\r
711 #endif\r
712 \r
713         return 0;\r
714 }\r
715 /*******************************************************\r
716 Description:\r
717         Goodix touchscreen probe function.\r
718 \r
719 Parameter:\r
720         client: i2c device struct.\r
721         id:device id.\r
722         \r
723 return:\r
724         Executive outcomes. 0---succeed.\r
725 *******************************************************/\r
726 static int rk_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)\r
727 {\r
728         int ret = 0;\r
729         struct rk_ts_data *ts;\r
730         struct goodix_platform_data *pdata ;\r
731         \r
732         printk(KERN_INFO "Install touch driver.\n");\r
733         if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) \r
734         {\r
735                 dev_err(&client->dev, "Must have I2C_FUNC_I2C.\n");\r
736                 ret = -ENODEV;\r
737                 goto exit;\r
738         }\r
739 \r
740         ts = kzalloc(sizeof(struct rk_ts_data), GFP_KERNEL);\r
741         if (ts == NULL) {\r
742                 printk(KERN_ALERT "alloc for struct rk_ts_data fail\n");\r
743                 ret = -ENOMEM;\r
744                 goto exit;\r
745         }\r
746 \r
747         pdata = client->dev.platform_data;\r
748         ts->irq_pin = pdata->irq_pin;\r
749         ts->rst_pin = pdata->rest_pin;\r
750         ts->pendown =PEN_RELEASE;\r
751         ts->client = client;\r
752         ts->ts_init = goodix_ts_init;   \r
753         ts->power = goodix_ts_power;\r
754         ts->get_touch_info = goodix_get_touch_info;\r
755         ts->input_parms_init = goodix_input_params_init;\r
756         i2c_set_clientdata(client, ts);\r
757         \r
758 \r
759         if (pdata->init_platform_hw)\r
760         {\r
761                 pdata->init_platform_hw();\r
762         }\r
763 \r
764         if(ts->ts_init)\r
765         {\r
766                 ret = ts->ts_init(ts);\r
767                 if(ret < 0)\r
768                 {\r
769                         printk(KERN_ALERT "rk ts init fail\n");\r
770                         goto exit;\r
771                 }\r
772         }\r
773 \r
774         if(ts->input_parms_init)\r
775         {\r
776                 ts->input_parms_init(ts);\r
777         }\r
778 \r
779         i2c_connect_client = client;\r
780         #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,32)\r
781                 ts->ts_wq= create_rt_workqueue("rk_ts_wq");             //create a work queue and worker thread\r
782         #else\r
783                 ts->ts_wq= create_workqueue("rk_ts_wq"); \r
784         #endif\r
785         if (!ts->ts_wq){\r
786                 printk(KERN_ALERT "creat touch screen workqueue failed\n");\r
787             return -ENOMEM;\r
788         }\r
789         \r
790         INIT_DELAYED_WORK(&ts->ts_work, rk_ts_work_func);\r
791 #ifdef CONFIG_HAS_EARLYSUSPEND\r
792         ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;\r
793         ts->early_suspend.suspend = rk_ts_early_suspend;\r
794         ts->early_suspend.resume = rk_ts_late_resume;\r
795         register_early_suspend(&ts->early_suspend);\r
796 #endif\r
797         \r
798         ts->irq=gpio_to_irq(ts->irq_pin)        ;               //If not defined in client\r
799         if (ts->irq)\r
800         {\r
801                 ret = gpio_request(pdata->irq_pin, "TS_IRQ_PIN");       //Request IO\r
802                 if (ret < 0) \r
803                 {\r
804                         printk(KERN_ALERT "Failed to request for touch irq\n");\r
805                         goto err_input_register_device_failed;\r
806                 }\r
807                 else\r
808                 {\r
809                         gpio_direction_input(pdata->irq_pin);\r
810                 }\r
811 \r
812                 ret  = request_irq(ts->irq, rk_ts_irq_handler ,IRQ_TYPE_LEVEL_LOW,client->name, ts);\r
813                 if (ret != 0) {\r
814                         printk(KERN_ALERT "Cannot allocate ts INT!ERRNO:%d\n", ret);\r
815                         gpio_free(ts->irq_pin);\r
816                         goto err_input_register_device_failed;\r
817                 }\r
818         }\r
819 \r
820         info_buf= kzalloc(ts->max_touch_num*sizeof(struct rk_touch_info), GFP_KERNEL);\r
821         if(!info_buf)\r
822         {\r
823                 printk(KERN_ALERT "alloc for rk_touch_info fail\n");\r
824                 goto err_input_register_device_failed;\r
825         }\r
826         printk("Goodix TS probe successfully!\n");\r
827         return 0;\r
828 \r
829         \r
830 err_input_register_device_failed:\r
831         input_free_device(ts->input_dev);\r
832         i2c_set_clientdata(client, NULL);       \r
833         kfree(ts);\r
834 exit:\r
835         return ret;\r
836 }\r
837 \r
838 \r
839 /*******************************************************\r
840 Description:\r
841         Goodix touchscreen driver release function.\r
842 \r
843 Parameter:\r
844         client: i2c device struct.\r
845         \r
846 return:\r
847         Executive outcomes. 0---succeed.\r
848 *******************************************************/\r
849 static int rk_ts_remove(struct i2c_client *client)\r
850 {\r
851         struct rk_ts_data *ts = i2c_get_clientdata(client);\r
852 #ifdef CONFIG_HAS_EARLYSUSPEND\r
853         unregister_early_suspend(&ts->early_suspend);\r
854 #endif\r
855 #ifdef CONFIG_TOUCHSCREEN_GOODIX_IAP\r
856         remove_proc_entry("goodix-update", NULL);\r
857 #endif\r
858         \r
859         gpio_free(ts->irq_pin);\r
860         free_irq(ts->irq, ts);\r
861         dev_notice(&client->dev,"The driver is removing...\n");\r
862         i2c_set_clientdata(client, NULL);\r
863         input_unregister_device(ts->input_dev);\r
864         kfree(ts);\r
865         return 0;\r
866 }\r
867 \r
868 \r
869 \r
870 //******************************Begin of firmware update surpport*******************************\r
871 #ifdef CONFIG_TOUCHSCREEN_GOODIX_IAP\r
872 /**\r
873 @brief CRC cal proc,include : Reflect,init_crc32_table,GenerateCRC32\r
874 @param global var oldcrc32\r
875 @return states\r
876 */\r
877 static unsigned int Reflect(unsigned long int ref, char ch)\r
878 {\r
879         unsigned int value=0;\r
880         int i;\r
881         for(i = 1; i < (ch + 1); i++)\r
882         {\r
883                 if(ref & 1)\r
884                         value |= 1 << (ch - i);\r
885                 ref >>= 1;\r
886         }\r
887         return value;\r
888 }\r
889 /*---------------------------------------------------------------------------------------------------------*/\r
890 /*  CRC Check Program INIT                                                                                                                         */\r
891 /*---------------------------------------------------------------------------------------------------------*/\r
892 static void init_crc32_table(void)\r
893 {\r
894         unsigned int temp;\r
895         unsigned int t1,t2;\r
896         unsigned int flag;\r
897         int i,j;\r
898         for(i = 0; i <= 0xFF; i++)\r
899         {\r
900                 temp=Reflect(i, 8);\r
901                 crc32_table[i]= temp<< 24;\r
902                 for (j = 0; j < 8; j++)\r
903                 {\r
904 \r
905                         flag=crc32_table[i]&0x80000000;\r
906                         t1=(crc32_table[i] << 1);\r
907                         if(flag==0)\r
908                                 t2=0;\r
909                         else\r
910                                 t2=ulPolynomial;\r
911                         crc32_table[i] =t1^t2 ;\r
912 \r
913                 }\r
914                 crc32_table[i] = Reflect(crc32_table[i], 32);\r
915         }\r
916 }\r
917 /*---------------------------------------------------------------------------------------------------------*/\r
918 /*  CRC main Program                                                                                                                               */\r
919 /*---------------------------------------------------------------------------------------------------------*/\r
920 static void GenerateCRC32(unsigned char * buf, unsigned int len)\r
921 {\r
922         unsigned int i;\r
923         unsigned int t;\r
924 \r
925         for (i = 0; i != len; ++i)\r
926         {\r
927                 t = (oldcrc32 ^ buf[i]) & 0xFF;\r
928                 oldcrc32 = ((oldcrc32 >> 8) & 0xFFFFFF) ^ crc32_table[t];\r
929         }\r
930 }\r
931 \r
932 static struct file * update_file_open(char * path, mm_segment_t * old_fs_p)\r
933 {\r
934         struct file * filp = NULL;\r
935         int errno = -1;\r
936                 \r
937         filp = filp_open(path, O_RDONLY, 0644);\r
938         \r
939         if(!filp || IS_ERR(filp))\r
940         {\r
941                 if(!filp)\r
942                         errno = -ENOENT;\r
943                 else \r
944                         errno = PTR_ERR(filp);                                  \r
945                 printk(KERN_ERR "The update file for Guitar open error.\n");\r
946                 return NULL;\r
947         }\r
948         *old_fs_p = get_fs();\r
949         set_fs(get_ds());\r
950 \r
951         filp->f_op->llseek(filp,0,0);\r
952         return filp ;\r
953 }\r
954 \r
955 static void update_file_close(struct file * filp, mm_segment_t old_fs)\r
956 {\r
957         set_fs(old_fs);\r
958         if(filp)\r
959                 filp_close(filp, NULL);\r
960 }\r
961 static int update_get_flen(char * path)\r
962 {\r
963         struct file * file_ck = NULL;\r
964         mm_segment_t old_fs;\r
965         int length ;\r
966         \r
967         file_ck = update_file_open(path, &old_fs);\r
968         if(file_ck == NULL)\r
969                 return 0;\r
970 \r
971         length = file_ck->f_op->llseek(file_ck, 0, SEEK_END);\r
972         //printk("File length: %d\n", length);\r
973         if(length < 0)\r
974                 length = 0;\r
975         update_file_close(file_ck, old_fs);\r
976         return length;  \r
977 }\r
978 static int update_file_check(char * path)\r
979 {\r
980         unsigned char buffer[64] = { 0 } ;\r
981         struct file * file_ck = NULL;\r
982         mm_segment_t old_fs;\r
983         int count, ret, length ;\r
984         \r
985         file_ck = update_file_open(path, &old_fs);\r
986         \r
987         if(path != NULL)\r
988                 printk("File Path:%s\n", path);\r
989         \r
990         if(file_ck == NULL)\r
991                 return -ERROR_NO_FILE;\r
992 \r
993         length = file_ck->f_op->llseek(file_ck, 0, SEEK_END);\r
994 #ifdef GUITAR_MESSAGE\r
995         printk(KERN_INFO "gt801 update: File length: %d\n",length);\r
996 #endif  \r
997         if(length <= 0 || (length%4) != 0)\r
998         {\r
999                 update_file_close(file_ck, old_fs);\r
1000                 return -ERROR_FILE_TYPE;\r
1001         }\r
1002         \r
1003         //set file point to the begining of the file\r
1004         file_ck->f_op->llseek(file_ck, 0, SEEK_SET);    \r
1005         oldcrc32 = 0xFFFFFFFF;\r
1006         init_crc32_table();\r
1007         while(length > 0)\r
1008         {\r
1009                 ret = file_ck->f_op->read(file_ck, buffer, sizeof(buffer), &file_ck->f_pos);\r
1010                 if(ret > 0)\r
1011                 {\r
1012                         for(count = 0; count < ret;  count++)   \r
1013                                 GenerateCRC32(&buffer[count],1);                        \r
1014                 }\r
1015                 else \r
1016                 {\r
1017                         update_file_close(file_ck, old_fs);\r
1018                         return -ERROR_FILE_READ;\r
1019                 }\r
1020                 length -= ret;\r
1021         }\r
1022         oldcrc32 = ~oldcrc32;\r
1023 #ifdef GUITAR_MESSAGE   \r
1024         printk("CRC_Check: %u\n", oldcrc32);\r
1025 #endif  \r
1026         update_file_close(file_ck, old_fs);\r
1027         return 1;       \r
1028 }\r
1029 \r
1030 unsigned char wait_slave_ready(struct rk_ts_data *ts, unsigned short *timeout)\r
1031 {\r
1032         unsigned char i2c_state_buf[2] = {ADDR_STA, UNKNOWN_ERROR};\r
1033         int ret;\r
1034         while(*timeout < MAX_TIMEOUT)\r
1035         {\r
1036                 ret = goodix_i2c_read_bytes(ts->client, i2c_state_buf, 2);\r
1037                 if(ret <= 0)\r
1038                         return ERROR_I2C_TRANSFER;\r
1039                 if(i2c_state_buf[1] & SLAVE_READY)\r
1040                 {\r
1041                         return i2c_state_buf[1];\r
1042                         //return 1;\r
1043                 }\r
1044                 msleep(10);\r
1045                 *timeout += 5;\r
1046         }\r
1047         return 0;\r
1048 }\r
1049 \r
1050 static int goodix_update_write(struct file *filp, const char __user *buff, unsigned long len, void *data)\r
1051 {\r
1052         unsigned char cmd[220];\r
1053         int ret = -1;\r
1054 \r
1055         static unsigned char update_path[100];\r
1056         static unsigned short time_count = 0;\r
1057         static unsigned int file_len = 0;\r
1058         \r
1059         unsigned char i2c_control_buf[2] = {ADDR_CMD, 0};\r
1060         unsigned char i2c_states_buf[2] = {ADDR_STA, 0};\r
1061         unsigned char i2c_data_buf[PACK_SIZE+1+8] = {ADDR_DAT,};\r
1062         //unsigned char i2c_rd_buf[1+4+PACK_SIZE+4];\r
1063         unsigned char i2c_rd_buf[160];\r
1064         unsigned char retries = 0;\r
1065         unsigned int rd_len;\r
1066         unsigned char i = 0;\r
1067         static unsigned char update_need_config = 0;\r
1068 \r
1069         unsigned char checksum_error_times = 0;\r
1070 #ifdef UPDATE_NEW_PROTOCOL\r
1071         unsigned int frame_checksum = 0;\r
1072         unsigned int frame_number = 0;\r
1073 #else\r
1074         unsigned char send_crc = 0;\r
1075 #endif\r
1076 \r
1077         struct file * file_data = NULL;\r
1078         mm_segment_t old_fs;\r
1079         struct rk_ts_data *ts;\r
1080         \r
1081         ts = i2c_get_clientdata(i2c_connect_client);\r
1082         if(ts==NULL)\r
1083                 return 0;\r
1084         \r
1085         if(copy_from_user(&cmd, buff, len))\r
1086         {\r
1087                 return -EFAULT;\r
1088         }\r
1089         switch(cmd[0])\r
1090         {\r
1091                 case STEP_SET_PATH:\r
1092                         printk(KERN_INFO"Write cmd is:%d,cmd arg is:%s,write len is:%ld\n",cmd[0], &cmd[1], len);\r
1093                         memset(update_path, 0, 100);\r
1094                         strncpy(update_path, cmd+1, 100);\r
1095                         if(update_path[0] == 0)\r
1096                                 return 0;\r
1097                         else\r
1098                                 return 1;\r
1099                 case STEP_CHECK_FILE:\r
1100                         printk(KERN_INFO"Begin to firmware update ......\n");\r
1101                         ret = update_file_check(update_path);\r
1102                         if(ret <= 0)\r
1103                         {\r
1104                                 printk(KERN_INFO"fialed to check update file!\n");\r
1105                                 return ret;\r
1106                         }\r
1107                         msleep(500);\r
1108                         printk(KERN_INFO"Update check file success!\n");\r
1109                         return 1;\r
1110                 case STEP_WRITE_SYN:\r
1111                         printk(KERN_INFO"STEP1:Write synchronization signal!\n");\r
1112                         i2c_control_buf[1] = UPDATE_START;\r
1113                         ret = goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
1114                         if(ret <= 0)\r
1115                         {\r
1116                                 ret = ERROR_I2C_TRANSFER;\r
1117                                 return ret;\r
1118                         }\r
1119                         //the time include time(APROM -> LDROM) and time(LDROM init)\r
1120                         msleep(1000);\r
1121                         return 1;\r
1122                 case STEP_WAIT_SYN:\r
1123                         printk(KERN_INFO"STEP2:Wait synchronization signal!\n");\r
1124                         while(retries < MAX_I2C_RETRIES)\r
1125                         {\r
1126                                 i2c_states_buf[1] = UNKNOWN_ERROR;\r
1127                                 ret = goodix_i2c_read_bytes(ts->client, i2c_states_buf, 2);\r
1128                                 printk(KERN_INFO"The read byte is:%d\n", i2c_states_buf[1]);\r
1129                                 if(i2c_states_buf[1] & UPDATE_START)\r
1130                                 {\r
1131                                         if(i2c_states_buf[1] & NEW_UPDATE_START)\r
1132                                         {\r
1133                                         #ifdef UPDATE_NEW_PROTOCOL\r
1134                                                 update_need_config = 1;\r
1135                                                 return 2;\r
1136                                         #else\r
1137                                                 return 1;\r
1138                                         #endif\r
1139                                         }\r
1140                                         break;\r
1141                                 }\r
1142                                 msleep(5);\r
1143                                 retries++;\r
1144                                 time_count += 10;\r
1145                         }\r
1146                         if((retries >= MAX_I2C_RETRIES) && (!(i2c_states_buf[1] & UPDATE_START)))\r
1147                         {\r
1148                                 if(ret <= 0)\r
1149                                         return 0;\r
1150                                 else\r
1151                                         return -1;\r
1152                         }\r
1153                         return 1;\r
1154                 case STEP_WRITE_LENGTH:\r
1155                         printk(KERN_INFO"STEP3:Write total update file length!\n");\r
1156                         file_len = update_get_flen(update_path);\r
1157                         if(file_len <= 0)\r
1158                         {\r
1159                                 printk(KERN_INFO"get update file length failed!\n");\r
1160                                 return -1;\r
1161                         }\r
1162                         file_len += 4;\r
1163                         i2c_data_buf[1] = (file_len>>24) & 0xff;\r
1164                         i2c_data_buf[2] = (file_len>>16) & 0xff;\r
1165                         i2c_data_buf[3] = (file_len>>8) & 0xff;\r
1166                         i2c_data_buf[4] = file_len & 0xff;\r
1167                         file_len -= 4;\r
1168                         ret = goodix_i2c_write_bytes(ts->client, i2c_data_buf, 5);\r
1169                         if(ret <= 0)\r
1170                         {\r
1171                                 ret = ERROR_I2C_TRANSFER;\r
1172                                 return 0;\r
1173                         }\r
1174                         return 1;\r
1175                 case STEP_WAIT_READY:\r
1176                         printk(KERN_INFO"STEP4:Wait slave ready!\n");\r
1177                         ret = wait_slave_ready(ts, &time_count);\r
1178                         if(ret == ERROR_I2C_TRANSFER)\r
1179                                 return 0;\r
1180                         if(!ret)\r
1181                         {\r
1182                                 return -1;\r
1183                         }\r
1184                         printk(KERN_INFO"Slave ready!\n");\r
1185                         return 1;\r
1186                 case STEP_WRITE_DATA:\r
1187 #ifdef UPDATE_NEW_PROTOCOL\r
1188                         printk(KERN_INFO"STEP5:Begin to send file data use NEW protocol!\n");\r
1189                         file_data = update_file_open(update_path, &old_fs);\r
1190                         if(file_data == NULL)\r
1191                         {\r
1192                                 return -1;\r
1193                         }\r
1194                         frame_number = 0;\r
1195                         while(file_len >= 0)\r
1196                         {\r
1197                                 i2c_data_buf[0] = ADDR_DAT;\r
1198                                 rd_len = (file_len >= PACK_SIZE) ? PACK_SIZE : file_len;\r
1199                                 frame_checksum = 0;\r
1200                                 if(file_len)\r
1201                                 {\r
1202                                         ret = file_data->f_op->read(file_data, i2c_data_buf+1+4, rd_len, &file_data->f_pos);\r
1203                                         if(ret <= 0)\r
1204                                         {\r
1205                                                 printk("[GOODiX_ISP_NEW]:Read File Data Failed!\n");\r
1206                                                 return -1;\r
1207                                         }\r
1208                                         i2c_data_buf[1] = (frame_number>>24)&0xff;\r
1209                                         i2c_data_buf[2] = (frame_number>>16)&0xff;\r
1210                                         i2c_data_buf[3] = (frame_number>>8)&0xff;\r
1211                                         i2c_data_buf[4] = frame_number&0xff;\r
1212                                         frame_number++;\r
1213                                         frame_checksum = 0;\r
1214                                         for(i=0; i<rd_len; i++)\r
1215                                         {\r
1216                                                 frame_checksum += i2c_data_buf[5+i];\r
1217                                         }\r
1218                                         frame_checksum = 0 - frame_checksum;\r
1219                                         i2c_data_buf[5+rd_len+0] = frame_checksum&0xff;\r
1220                                         i2c_data_buf[5+rd_len+1] = (frame_checksum>>8)&0xff;\r
1221                                         i2c_data_buf[5+rd_len+2] = (frame_checksum>>16)&0xff;\r
1222                                         i2c_data_buf[5+rd_len+3] = (frame_checksum>>24)&0xff;\r
1223                                 }\r
1224 rewrite:\r
1225                                 printk(KERN_INFO"[GOODiX_ISP_NEW]:%d\n", file_len);                             \r
1226                                 ret = goodix_i2c_write_bytes(ts->client, i2c_data_buf, 1+4+rd_len+4);\r
1227                                         //if(ret <= 0)\r
1228                                 if(ret != 1)\r
1229                                 {\r
1230                                         printk("[GOODiX_ISP_NEW]:Write File Data Failed!Return:%d\n", ret);\r
1231                                         return 0;\r
1232                                 }\r
1233 \r
1234                                 memset(i2c_rd_buf, 0x00, 1+4+rd_len+4);\r
1235                                 ret = goodix_i2c_read_bytes(ts->client, i2c_rd_buf, 1+4+rd_len+4);\r
1236                                 if(ret != 2)\r
1237                                 {\r
1238                                         printk("[GOODiX_ISP_NEW]:Read File Data Failed!Return:%d\n", ret);\r
1239                                         return 0;\r
1240                                 }\r
1241                                 for(i=1; i<(1+4+rd_len+4); i++)                                         //check communication\r
1242                                 {\r
1243                                         if(i2c_rd_buf[i] != i2c_data_buf[i])\r
1244                                         {\r
1245                                                 i = 0;\r
1246                                                 break;\r
1247                                         }\r
1248                                 }\r
1249                                 if(!i)\r
1250                                 {\r
1251                                         i2c_control_buf[0] = ADDR_CMD;\r
1252                                         i2c_control_buf[1] = 0x03;\r
1253                                         goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);         //communication error\r
1254                                         printk("[GOODiX_ISP_NEW]:File Data Frame readback check Error!\n");\r
1255                                 }\r
1256                                 else\r
1257                                 {\r
1258                                         i2c_control_buf[1] = 0x04;                                                                                                      //let LDROM write flash\r
1259                                         goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
1260                                 }\r
1261                                 \r
1262                                 //Wait for slave ready signal.and read the checksum\r
1263                                 ret = wait_slave_ready(ts, &time_count);\r
1264                                 if((ret & CHECKSUM_ERROR)||(!i))\r
1265                                 {\r
1266                                         if(i)\r
1267                                         {\r
1268                                                 printk("[GOODiX_ISP_NEW]:File Data Frame checksum Error!\n");\r
1269                                         }\r
1270                                         checksum_error_times++;\r
1271                                         msleep(20);\r
1272                                         if(checksum_error_times > 20)                           //max retry times.\r
1273                                                 return 0;\r
1274                                         goto rewrite;\r
1275                                 }\r
1276                                 checksum_error_times = 0;\r
1277                                 if(ret & (FRAME_ERROR))\r
1278                                 {\r
1279                                         printk("[GOODiX_ISP_NEW]:File Data Frame Miss!\n");\r
1280                                         return 0;\r
1281                                 }\r
1282                                 if(ret == ERROR_I2C_TRANSFER)\r
1283                                         return 0;\r
1284                                 if(!ret)\r
1285                                 {\r
1286                                         return -1;\r
1287                                 }\r
1288                                 if(file_len < PACK_SIZE)\r
1289                                 {\r
1290                                         update_file_close(file_data, old_fs);\r
1291                                         break;\r
1292                                 }\r
1293                                 file_len -= rd_len;\r
1294                         }//end of while((file_len >= 0))\r
1295                         return 1;\r
1296 #else\r
1297                         printk(KERN_INFO"STEP5:Begin to send file data use OLD protocol!\n");\r
1298                         file_data = update_file_open(update_path, &old_fs);\r
1299                         if(file_data == NULL)   //file_data has been opened at the last time\r
1300                         {\r
1301                                 return -1;\r
1302                         }\r
1303                         while((file_len >= 0) && (!send_crc))\r
1304                         {\r
1305                                 printk(KERN_INFO"[GOODiX_ISP_OLD]:%d\n", file_len);\r
1306                                 i2c_data_buf[0] = ADDR_DAT;\r
1307                                 rd_len = (file_len >= PACK_SIZE) ? PACK_SIZE : file_len;\r
1308                                 if(file_len)\r
1309                                 {\r
1310                                         ret = file_data->f_op->read(file_data, i2c_data_buf+1, rd_len, &file_data->f_pos);\r
1311                                         if(ret <= 0)\r
1312                                         {\r
1313                                                 return -1;\r
1314                                         }\r
1315                                 }\r
1316                                 if(file_len < PACK_SIZE)\r
1317                                 {\r
1318                                         send_crc = 1;\r
1319                                         update_file_close(file_data, old_fs);\r
1320                                         i2c_data_buf[file_len+1] = oldcrc32&0xff;\r
1321                                         i2c_data_buf[file_len+2] = (oldcrc32>>8)&0xff;\r
1322                                         i2c_data_buf[file_len+3] = (oldcrc32>>16)&0xff;\r
1323                                         i2c_data_buf[file_len+4] = (oldcrc32>>24)&0xff;\r
1324                                         ret = goodix_i2c_write_bytes(ts->client, i2c_data_buf, (file_len+1+4));\r
1325                                         //if(ret <= 0)\r
1326                                         if(ret != 1)\r
1327                                         {\r
1328                                                 printk("[GOODiX_ISP_OLD]:Write File Data Failed!Return:%d\n", ret);\r
1329                                                 return 0;\r
1330                                         }\r
1331                                         break;\r
1332                                 }\r
1333                                 else\r
1334                                 {\r
1335                                         ret = goodix_i2c_write_bytes(ts->client, i2c_data_buf, PACK_SIZE+1);\r
1336                                         //if(ret <= 0)\r
1337                                         if(ret != 1)\r
1338                                         {\r
1339                                                 printk("[GOODiX_ISP_OLD]:Write File Data Failed!Return:%d\n", ret);\r
1340                                                 return 0;\r
1341                                         }\r
1342                                 }\r
1343                                 file_len -= rd_len;\r
1344                         \r
1345                                 //Wait for slave ready signal.\r
1346                                 ret = wait_slave_ready(ts, &time_count);\r
1347                                 if(ret == ERROR_I2C_TRANSFER)\r
1348                                         return 0;\r
1349                                 if(!ret)\r
1350                                 {\r
1351                                         return -1;\r
1352                                 }\r
1353                                 //Slave is ready.\r
1354                         }//end of while((file_len >= 0) && (!send_crc))\r
1355                         return 1;\r
1356 #endif\r
1357                 case STEP_READ_STATUS:\r
1358                         printk(KERN_INFO"STEP6:Read update status!\n");\r
1359                         while(time_count < MAX_TIMEOUT)\r
1360                         {\r
1361                                 ret = goodix_i2c_read_bytes(ts->client, i2c_states_buf, 2);\r
1362                                 if(ret <= 0)\r
1363                                 {\r
1364                                         return 0;\r
1365                                 }\r
1366                                 if(i2c_states_buf[1] & SLAVE_READY)\r
1367                                 {\r
1368                                         if(!(i2c_states_buf[1] &0xf0))\r
1369                                         {\r
1370                                                 printk(KERN_INFO"The firmware updating succeed!update state:0x%x\n",i2c_states_buf[1]);\r
1371                                                 return 1;\r
1372                                         }\r
1373                                         else\r
1374                                         {\r
1375                                                 printk(KERN_INFO"The firmware updating failed!update state:0x%x\n",i2c_states_buf[1]);\r
1376                                                 return 0;\r
1377 \r
1378                                         }\r
1379                                 }\r
1380                                 msleep(1);\r
1381                                 time_count += 5;\r
1382                         }\r
1383                         return -1;\r
1384                 case FUN_CLR_VAL:                                                               //clear the static val\r
1385                         time_count = 0;\r
1386                         file_len = 0;\r
1387                         update_need_config = 0;\r
1388                         return 1;\r
1389                 case FUN_CMD:                                                   //functional command\r
1390                         if(cmd[1] == CMD_DISABLE_TP)\r
1391                         {\r
1392                                 printk(KERN_INFO"Disable TS int!\n");\r
1393                                 g_enter_isp = 1;\r
1394                                 disable_irq(ts->irq);\r
1395                         }\r
1396                         else if(cmd[1] == CMD_ENABLE_TP)\r
1397                         {\r
1398                                 printk(KERN_INFO"Enable TS int!\n");\r
1399                                 g_enter_isp = 0;\r
1400                                 enable_irq(ts->irq);\r
1401                         }\r
1402                         else if(cmd[1] == CMD_READ_VER)\r
1403                         {\r
1404                                 printk(KERN_INFO"Read version!\n");\r
1405                                 ts->read_mode = MODE_RD_VER;\r
1406                         }\r
1407                         else if(cmd[1] == CMD_READ_RAW)\r
1408                         {\r
1409                                 printk(KERN_INFO"Read raw data!\n");\r
1410                                 ts->read_mode = MODE_RD_RAW;\r
1411                                 i2c_control_buf[1] = 201;\r
1412                                 ret = goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);                   //read raw data cmd\r
1413                                 if(ret <= 0)\r
1414                                 {\r
1415                                         printk(KERN_INFO"Write read raw data cmd failed!\n");\r
1416                                         return 0;\r
1417                                 }\r
1418                                 msleep(200);\r
1419                         }\r
1420                         else if(cmd[1] == CMD_READ_DIF)\r
1421                         {\r
1422                                 printk(KERN_INFO"Read diff data!\n");\r
1423                                 ts->read_mode = MODE_RD_DIF;\r
1424                                 i2c_control_buf[1] = 202;\r
1425                                 ret = goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);                   //read diff data cmd\r
1426                                 if(ret <= 0)\r
1427                                 {\r
1428                                         printk(KERN_INFO"Write read raw data cmd failed!\n");\r
1429                                         return 0;\r
1430                                 }\r
1431                                 msleep(200);\r
1432                         }\r
1433                         else if(cmd[1] == CMD_READ_CFG)\r
1434                         {\r
1435                                 printk(KERN_INFO"Read config info!\n");\r
1436                                 ts->read_mode = MODE_RD_CFG;\r
1437                                 rd_cfg_addr = cmd[2];\r
1438                                 rd_cfg_len = cmd[3];\r
1439                         }\r
1440                         else if(cmd[1] == CMD_SYS_REBOOT)\r
1441                         {\r
1442                                 printk(KERN_INFO"System reboot!\n");\r
1443                                 sys_sync();\r
1444                                 msleep(200);\r
1445                                 kernel_restart(NULL);\r
1446                         }\r
1447                         return 1;\r
1448                 case FUN_WRITE_CONFIG:\r
1449                         \r
1450                         printk(KERN_INFO"Begin write config info!Config length:%d\n",cmd[1]);\r
1451                         for(i=3; i<cmd[1];i++)\r
1452                         {\r
1453                                 //if((i-3)%5 == 0)printk("\n");\r
1454                                 printk("(%d):0x%x ", i-3, cmd[i]);\r
1455                         }\r
1456                         printk("\n");\r
1457 \r
1458                         if((cmd[2]>83)&&(cmd[2]<240)&&cmd[1])\r
1459                         {\r
1460                                 checksum_error_times = 0;\r
1461 reconfig:\r
1462                                 ret = goodix_i2c_write_bytes(ts->client, cmd+2, cmd[1]); \r
1463                                 if(ret != 1)\r
1464                                 {\r
1465                                         printk("Write Config failed!return:%d\n",ret);\r
1466                                         return -1;\r
1467                                 }\r
1468                                 if(!update_need_config)return 1;\r
1469                                 \r
1470                                 i2c_rd_buf[0] = cmd[2];\r
1471                                 ret = goodix_i2c_read_bytes(ts->client, i2c_rd_buf, cmd[1]);\r
1472                                 if(ret != 2)\r
1473                                 {\r
1474                                         printk("Read Config failed!return:%d\n",ret);\r
1475                                         return -1;\r
1476                                 }\r
1477                                 for(i=0; i<cmd[1]; i++)\r
1478                                 {\r
1479                                         if(i2c_rd_buf[i] != cmd[i+2])\r
1480                                         {\r
1481                                                 printk("Config readback check failed!\n");\r
1482                                                 i = 0;\r
1483                                                 break;\r
1484                                         }\r
1485                                 }\r
1486                                 if(!i)\r
1487                                 {\r
1488                                         i2c_control_buf[0] = ADDR_CMD;\r
1489                                         i2c_control_buf[1] = 0x03;\r
1490                                         goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);         //communication error\r
1491                                         checksum_error_times++;\r
1492                                         msleep(20);\r
1493                                         if(checksum_error_times > 20)                           //max retry times.\r
1494                                                 return 0;\r
1495                                         goto reconfig;\r
1496                                 }\r
1497                                 else\r
1498                                 {\r
1499                                         i2c_control_buf[0] = ADDR_CMD;\r
1500                                         i2c_control_buf[1] = 0x04;                                      //let LDROM write flash\r
1501                                         goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
1502                                         return 1;\r
1503                                 }\r
1504                                 \r
1505                         }\r
1506                         else\r
1507                         {\r
1508                                 printk(KERN_INFO"Invalid config addr!\n");\r
1509                                 return -1;\r
1510                         }\r
1511                 default:\r
1512                         return -ENOSYS;\r
1513         }\r
1514         return 0;\r
1515 }\r
1516 \r
1517 static int goodix_update_read( char *page, char **start, off_t off, int count, int *eof, void *data )\r
1518 {\r
1519         int ret = -1;\r
1520         struct rk_ts_data *ts;\r
1521         int len = 0;\r
1522         char *version_info = NULL;\r
1523         static unsigned char read_data[1201] = {80, };\r
1524 \r
1525         ts = i2c_get_clientdata(i2c_connect_client);\r
1526         if(ts==NULL)\r
1527                 return 0;\r
1528 \r
1529         if(ts->read_mode == MODE_RD_VER)                //read version data\r
1530         {\r
1531                 ret = goodix_read_version(ts, &version_info);\r
1532                 if(ret <= 0)\r
1533                 {\r
1534                         printk(KERN_INFO"Read version data failed!\n");\r
1535                         vfree(version_info);\r
1536                         return 0;\r
1537                 }\r
1538 \r
1539                 for(len=0;len<100;len++)\r
1540                 {\r
1541                         if(*(version_info + len) == '\0')\r
1542                                 break;\r
1543                 }\r
1544                 printk(KERN_INFO"GOODiX Touchscreen Version is:%s\n", (version_info+1));\r
1545                 strncpy(page, version_info+1, len + 1);\r
1546                 vfree(version_info);\r
1547                 *eof = 1;\r
1548                 return len+1;\r
1549         }\r
1550         else if((ts->read_mode == MODE_RD_RAW)||(ts->read_mode == MODE_RD_DIF))         //read raw data or diff\r
1551         {\r
1552                 //printk(KERN_INFO"Read raw data\n");\r
1553                 ret = goodix_i2c_read_bytes(ts->client, read_data, 1201);\r
1554                 if(ret <= 0)\r
1555                 {\r
1556                         if(ts->read_mode == 2)\r
1557                                 printk(KERN_INFO"Read raw data failed!\n");\r
1558                         if(ts->read_mode == 3)\r
1559                                 printk(KERN_INFO"Read diff data failed!\n");\r
1560                         return 0;\r
1561                 }\r
1562                 memcpy(page, read_data+1, 1200);\r
1563                 *eof = 1;\r
1564                 *start = NULL;\r
1565                 return 1200;\r
1566         }\r
1567         else if(ts->read_mode == MODE_RD_CFG)\r
1568         {\r
1569                 if((rd_cfg_addr>83)&&(rd_cfg_addr<240))\r
1570                 {\r
1571                         read_data[0] = rd_cfg_addr;\r
1572                         printk("read config addr is:%d\n", rd_cfg_addr);\r
1573                 }\r
1574                 else\r
1575                 {\r
1576                         read_data[0] = 101;\r
1577                         printk("invalid read config addr,use default!\n");\r
1578                 }\r
1579                 if((rd_cfg_len<0)||(rd_cfg_len>156))\r
1580                 {\r
1581                         printk("invalid read config length,use default!\n");\r
1582                         rd_cfg_len = 239 - read_data[0];\r
1583                 }\r
1584                 printk("read config length is:%d\n", rd_cfg_len);\r
1585                 ret = goodix_i2c_read_bytes(ts->client, read_data, rd_cfg_len);\r
1586                 if(ret <= 0)\r
1587                 {\r
1588                         printk(KERN_INFO"Read config info failed!\n");\r
1589                         return 0;\r
1590                 }\r
1591                 memcpy(page, read_data+1, rd_cfg_len);\r
1592                 return rd_cfg_len;\r
1593         }\r
1594         return len;\r
1595 }\r
1596               \r
1597 #endif\r
1598 //******************************End of firmware update surpport*******************************\r
1599 static const struct i2c_device_id goodix_ts_id[] = {\r
1600         { "Goodix-TS", 0 },\r
1601         { }\r
1602 };\r
1603 \r
1604 static struct i2c_driver rk_ts_driver = {\r
1605         .probe          = rk_ts_probe,\r
1606         .remove         = rk_ts_remove,\r
1607 #ifndef CONFIG_HAS_EARLYSUSPEND\r
1608         .suspend        = rk_ts_suspend,\r
1609         .resume         = rk_ts_resume,\r
1610 #endif\r
1611         .id_table       = goodix_ts_id,\r
1612         .driver = {\r
1613                 .name   = "Goodix-TS",\r
1614                 .owner = THIS_MODULE,\r
1615         },\r
1616 };\r
1617 \r
1618 \r
1619 static struct class *ts_debug_class = NULL;\r
1620 static ssize_t dbg_mode_show(struct class *cls,struct class_attribute *attr, char *_buf)\r
1621 {\r
1622        printk("%s>>>>>>>>\n",__func__);\r
1623        return 0;\r
1624 }\r
1625 \r
1626 static ssize_t dbg_mode_store(struct class *cls,struct class_attribute *attr, const char *buf, size_t _count)\r
1627 {\r
1628         dbg_thresd = simple_strtol(buf,NULL,10);\r
1629         if(dbg_thresd)\r
1630         {\r
1631                 printk(KERN_INFO "ts debug open\n");\r
1632         }\r
1633         else\r
1634         {\r
1635                 printk(KERN_INFO "ts debug close");\r
1636         }\r
1637       \r
1638     return _count;\r
1639 }\r
1640 static CLASS_ATTR(debug, 0666, dbg_mode_show, dbg_mode_store);\r
1641 \r
1642 static int dbg_sys_init(void)\r
1643 {\r
1644         int ret ;\r
1645         ts_debug_class = class_create(THIS_MODULE, "ts_debug");\r
1646         ret =  class_create_file(ts_debug_class, &class_attr_debug);\r
1647     if (ret)\r
1648     {\r
1649        printk("Fail to creat class hkrkfb.\n");\r
1650     }\r
1651    return 0;\r
1652 }\r
1653 \r
1654 \r
1655 /*******************************************************        \r
1656 Description:\r
1657         Driver Install function.\r
1658 return:\r
1659         Executive Outcomes. 0---succeed.\r
1660 ********************************************************/\r
1661 static int __devinit rk_ts_init(void)\r
1662 {\r
1663         int ret ;\r
1664         ret=i2c_add_driver(&rk_ts_driver);\r
1665         dbg_sys_init();  //for debug\r
1666         return ret; \r
1667 }\r
1668 \r
1669 /*******************************************************        \r
1670 Description:\r
1671         Driver uninstall function.\r
1672 return:\r
1673         Executive Outcomes. 0---succeed.\r
1674 ********************************************************/\r
1675 static void __exit rk_ts_exit(void)\r
1676 {\r
1677         printk(KERN_ALERT "Touchscreen driver of guitar exited.\n");\r
1678         i2c_del_driver(&rk_ts_driver);\r
1679 }\r
1680 \r
1681 module_init(rk_ts_init);\r
1682 module_exit(rk_ts_exit);\r
1683 \r
1684 MODULE_DESCRIPTION("Goodix Touchscreen Driver");\r
1685 MODULE_LICENSE("GPL");\r