#include <linux/io.h>\r
#include <linux/platform_device.h>\r
#include <mach/gpio.h>\r
-//#include <plat/gpio-cfg.h>\r
-//#include <plat/gpio-bank-l.h>\r
-//#include <plat/gpio-bank-f.h>\r
+\r
#include <linux/irq.h>\r
#include <linux/syscalls.h>\r
#include <linux/reboot.h>\r
#include <linux/proc_fs.h>\r
#include "rk29_i2c_goodix.h"\r
-//#include <linux/goodix_queue.h>\r
\r
#include <linux/vmalloc.h>\r
#include <linux/fs.h>\r
\r
#define PEN_DOWN 1\r
#define PEN_RELEASE 0\r
-#define MAX_SUPPORT_POINT 2\r
-//#define fjp_debug 0\r
+#define PEN_DOWN_UP 2 //fjp\r
+\r
+static struct rk_touch_info *info_buf;\r
+\r
+static int dbg_thresd = 0;\r
+#define DBG(x...) do { if(unlikely(dbg_thresd)) printk(KERN_INFO x); } while (0)\r
+\r
\r
-//#define fjp_debug\r
/******************************************************* \r
Description:\r
Read data from the i2c slave device;\r
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r
};\r
- /* uint8_t config_info[] = {\r
- 0x65,0x02,0x04,0x00,0x03,0x00,0x0a,0x22,0x1E,0xE7,0x32,0x05,0x08,0x10,0x4C,\r
- 0x40,0x41,0x20,0x00,0x00,0x8B,0x8B,0x3C,0x64,0x0E,0x0D,0x0C,0x0B,\r
- 0x0A,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x1D,0x1C,\r
- 0x1B,0x1A,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0F,\r
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
- 0x2B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
- 0x00,0x00,0x00,0x00\r
- }; */ \r
+ \r
#else\r
- /*uint8_t config_info[] = {\r
- 0x65,0x02,0x05,0x00,0x03,0x20,0x05,0x20,0x1E,0xE7,0x32,0x05,0x08,0x10,0x4C,\r
- 0x40,0x41,0x20,0x00,0x00,0x89,0x89,0x5A,0x96,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,\r
- 0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x1D,0x1C,0x1B,0x1A,0x19,0x18,\r
- 0x17,0x15,0x15,0x14,0x13,0x12,0x11,0x10,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,\r
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0x00\r
};*/\r
uint8_t config_info[] = {\r
0x65,0x02,0x05,0x00,0x03,0x20,0x0A,0x22,0x1E,0xE7,0x32,0x05,0x08,0x10,0x4C,\r
{\r
dev_info(&ts->client->dev, "Read resolution & max_touch_num failed, use default value!\n");\r
ts->max_touch_num = MAX_FINGER_NUM;\r
- ts->int_trigger_type = INT_TRIGGER;\r
+ //ts->int_trigger_type = INT_TRIGGER;\r
return 0;\r
}\r
ts->abs_x_max = (rd_cfg_buf[1]<<8) + rd_cfg_buf[2];\r
ts->abs_y_max = (rd_cfg_buf[3]<<8) + rd_cfg_buf[4];\r
ts->max_touch_num = rd_cfg_buf[5];\r
- ts->int_trigger_type = rd_cfg_buf[6]&0x03;\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
printk(KERN_INFO "Read invalid resolution & max_touch_num, use default value!\n");\r
}\r
\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
+ \r
rd_cfg_buf[0] = 0x6e;\r
rd_cfg_buf[1] = 0x00;\r
goodix_i2c_read_bytes(ts->client, rd_cfg_buf, 2);\r
dev_info(&ts->client->dev, "Need int wake up from green mode!\n");\r
}\r
\r
- //msleep(10);\r
- printk("max_point:%d\n",ts->max_touch_num);\r
return 0;\r
\r
}\r
\r
+//fjp add ===============================\r
+static bool goodix_get_status(char *p1,int*p2)\r
+{\r
+ bool status = PEN_DOWN;\r
+ if((*p2==PEN_DOWN) && (*p1==PEN_RELEASE))\r
+ {\r
+ *p2 = PEN_DOWN_UP; //¸Õ¸Õµ¯Æð\r
+ status = PEN_RELEASE; \r
+ }\r
+ else if((*p2==PEN_RELEASE) && (*p1==PEN_RELEASE))\r
+ {\r
+ *p2 = PEN_RELEASE;\r
+ status = PEN_RELEASE; \r
+ }\r
+ else\r
+ {\r
+ *p2 = PEN_DOWN;\r
+ }\r
+ return status;\r
+}\r
+\r
+//===================================\r
/*******************************************************\r
Description:\r
Read goodix touchscreen version function.\r
return 1; \r
}\r
\r
-static last_touch_num = -1;\r
+static int 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
unsigned int position = 0; \r
uint8_t track_id[MAX_FINGER_NUM] = {0};\r
u8 index;\r
- \r
+ u8 temp =0;\r
point_data[0] = READ_COOR_ADDR; //read coor address\r
\r
\r
if(ret != 2) \r
{\r
printk("goodix read error\n");\r
- ts->bad_data = 1;\r
} \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 ==== max_touch_num:%d\n", finger_current,ts->max_touch_num);//add by fjp 2010-9-28\r
- #endif\r
+ \r
+ DBG("finger_current:%d ==== max_touch_num:%d\n", finger_current,ts->max_touch_num);//add by fjp 2010-9-28\r
+ \r
\r
if(finger_current)\r
{ \r
{\r
if(finger_bit & 0x01)\r
{\r
- track_id[point_count] = count;\r
+ track_id[count] = PEN_DOWN;\r
point_count++;\r
}\r
finger_bit >>= 1;\r
if(touch_num < last_touch_num) //some flinger release\r
{\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
+ /*for(index = touch_num; index < last_touch_num; index++)\r
+ info_buf[index].status = 0;*/\r
*point_num = last_touch_num;\r
+ touch_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
+ if(goodix_get_status(&track_id[index],&info_buf[index].status))\r
+ {\r
+ position = 4 - READ_COOR_ADDR + 5*(temp++);\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
+ info_buf[index].press = (unsigned int) (point_data[position+4]); \r
+ }\r
}\r
\r
}\r
return:\r
Executive outcomes.0---succeed.\r
*******************************************************/\r
-static int rk_ts_work_func(struct work_struct *pwork)\r
+static void rk_ts_work_func(struct work_struct *pwork)\r
{ \r
int i =0;\r
- struct rk_touch_info *info_buf;\r
+ //struct rk_touch_info *info_buf;\r
char point_num;\r
- \r
- if(pwork==NULL)\r
- {\r
- printk(KERN_INFO "%s>>>>>>>>err:null pwork\n",__func__);\r
- return -1;\r
- }\r
- \r
- struct rk_ts_data *ts = container_of(pwork, struct rk_ts_data, ts_work);\r
+ struct rk_ts_data *ts = container_of(to_delayed_work(pwork), struct rk_ts_data, ts_work);\r
if(!ts)\r
{\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
+// 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
+// goto exit;\r
+ //}\r
\r
if(ts->get_touch_info)\r
{\r
}\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
+ DBG("info_buf[i].status =====%d\n",info_buf[i].status);\r
+ if(info_buf[i].status==PEN_DOWN_UP)\r
{\r
+ info_buf[i].status=PEN_RELEASE;\r
+ DBG("the key %d is up------\n",i);\r
input_mt_slot(ts->input_dev, i);\r
input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);\r
+ continue;\r
+ }\r
+ if(info_buf[i].status==PEN_DOWN)\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].press);\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
+ 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
}\r
\r
+ \r
+ \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
+ DBG("touch down .............\n");//add by fjp 2010-9-28\r
+ queue_delayed_work(ts->ts_wq, &ts->ts_work,msecs_to_jiffies(20));\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
+ \r
+ DBG("touch up>>x:%d>>y:%d\n",info_buf[0].x,info_buf[0].y);//add by fjp 2010-9-28\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
+ \r
input_mt_slot(ts->input_dev, 0);\r
- input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);\r
+ input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);*/\r
+\r
+ DBG("point_num+++++++++++ = %d\n", point_num);//add by fjp 2010-9-28\r
+ for(i=0; i< point_num; i++)\r
+ {\r
+ // printk("info_buf[i].status +++++++%d\n",info_buf[i].status);\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
+ //input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0);\r
+ info_buf[i].status= PEN_RELEASE;\r
+ \r
+\r
+ DBG("release+++++++++++ = %d\n", i);//add by fjp 2010-9-28\r
+\r
+ }\r
+ }\r
input_sync(ts->input_dev);\r
ts->pendown =PEN_RELEASE;\r
+ last_touch_num = 0;\r
\r
- \r
+ enable_irq(ts->irq); \r
}\r
\r
- enable_irq(ts->irq);\r
-exit:\r
- kfree(info_buf);\r
- return 0;\r
+ \r
+//exit:\r
+ //kfree(info_buf);\r
+ \r
}\r
\r
\r
{\r
\r
struct rk_ts_data *ts = (struct rk_ts_data*)dev_id;\r
-#ifdef fjp_debug\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
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
+ printk(KERN_INFO"touch goodix Send suspend cmd successed \n");\r
break;\r
}\r
retry++;\r
}\r
else if(on == 1) //resume\r
{\r
- printk(KERN_INFO"Int resume\n");\r
- gpio_set_value(RK29_PIN6_PC3,GPIO_LOW); \r
+ printk(KERN_INFO"touch goodix int resume\n");\r
+ gpio_set_value(ts->rst_pin,GPIO_LOW); \r
msleep(20);\r
- gpio_set_value(RK29_PIN6_PC3,GPIO_HIGH);\r
+ gpio_set_value(ts->rst_pin,GPIO_HIGH);\r
ret = 0;\r
} \r
return ret;\r
__set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit);\r
__set_bit(EV_ABS, ts->input_dev->evbit);\r
\r
- input_mt_init_slots(ts->input_dev, MAX_SUPPORT_POINT);\r
+ input_mt_init_slots(ts->input_dev, ts->max_touch_num);\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
+ sprintf(ts->phys, "input/rkts");\r
ts->input_dev->name = rk_ts_name;\r
ts->input_dev->phys = ts->phys;\r
ts->input_dev->id.bustype = BUS_I2C;\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 0 ;\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
+ printk("goodix panel init fail\n");\r
return -1;\r
}\r
else\r
{\r
dev_err(&client->dev, "Must have I2C_FUNC_I2C.\n");\r
ret = -ENODEV;\r
- goto err_check_functionality_failed;\r
+ goto exit;\r
}\r
\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
+ goto exit;\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->rst_pin = pdata->rest_pin;\r
ts->pendown =PEN_RELEASE;\r
ts->client = client;\r
ts->ts_init = goodix_ts_init; \r
if(ret < 0)\r
{\r
printk(KERN_ALERT "rk ts init fail\n");\r
- //return -1;\r
+ goto exit;\r
}\r
}\r
\r
ts->early_suspend.resume = rk_ts_late_resume;\r
register_early_suspend(&ts->early_suspend);\r
#endif\r
-\r
- \r
-\r
\r
ts->irq=gpio_to_irq(ts->irq_pin) ; //If not defined in client\r
if (ts->irq)\r
if (ret < 0) \r
{\r
printk(KERN_ALERT "Failed to request for touch irq\n");\r
- goto err_gpio_request_failed;\r
+ goto err_input_register_device_failed;\r
}\r
else\r
{\r
ret = request_irq(ts->irq, rk_ts_irq_handler ,IRQ_TYPE_LEVEL_LOW,client->name, ts);\r
if (ret != 0) {\r
printk(KERN_ALERT "Cannot allocate ts INT!ERRNO:%d\n", ret);\r
- gpio_free(INT_PORT);\r
- goto err_gpio_request_failed;\r
+ gpio_free(ts->irq_pin);\r
+ goto err_input_register_device_failed;\r
}\r
- else \r
- { \r
- enable_irq(ts->irq);\r
- \r
- } \r
}\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
+\r
+ info_buf= kzalloc(ts->max_touch_num*sizeof(struct rk_touch_info), GFP_KERNEL);\r
+ if(!info_buf)\r
{\r
- ts->use_irq = 0;\r
- free_irq(client->irq,ts);\r
- #ifdef INT_PORT \r
- gpio_direction_input(INT_PORT);\r
- gpio_free(INT_PORT);\r
- #endif \r
+ printk(KERN_ALERT "alloc for rk_touch_info fail\n");\r
+ goto err_input_register_device_failed;\r
}\r
- else \r
- hrtimer_cancel(&ts->timer);\r
+ printk("Goodix TS probe successfully!\n");\r
+ return 0;\r
\r
-err_gpio_request_failed: \r
+ \r
err_input_register_device_failed:\r
input_free_device(ts->input_dev);\r
-\r
-err_input_dev_alloc_failed:\r
- i2c_set_clientdata(client, NULL);\r
-err_i2c_failed: \r
+ i2c_set_clientdata(client, NULL); \r
kfree(ts);\r
-err_alloc_data_failed:\r
-err_check_functionality_failed:\r
-err_create_proc_entry:\r
+exit:\r
return ret;\r
}\r
\r
#ifdef CONFIG_TOUCHSCREEN_GOODIX_IAP\r
remove_proc_entry("goodix-update", NULL);\r
#endif\r
- //goodix_debug_sysfs_deinit();\r
- if (ts && ts->use_irq) \r
- {\r
- #ifdef INT_PORT\r
- gpio_direction_input(INT_PORT);\r
- gpio_free(INT_PORT);\r
- #endif \r
- free_irq(client->irq, ts);\r
- } \r
- else if(ts)\r
- hrtimer_cancel(&ts->timer);\r
\r
+ gpio_free(ts->irq_pin);\r
+ free_irq(ts->irq, ts);\r
dev_notice(&client->dev,"The driver is removing...\n");\r
i2c_set_clientdata(client, NULL);\r
input_unregister_device(ts->input_dev);\r
{\r
printk(KERN_INFO"Disable TS int!\n");\r
g_enter_isp = 1;\r
- if(ts->use_irq)\r
- disable_irq(TS_INT);\r
+ disable_irq(ts->irq);\r
}\r
else if(cmd[1] == CMD_ENABLE_TP)\r
{\r
printk(KERN_INFO"Enable TS int!\n");\r
g_enter_isp = 0;\r
- if(ts->use_irq)\r
- enable_irq(TS_INT);\r
+ enable_irq(ts->irq);\r
}\r
else if(cmd[1] == CMD_READ_VER)\r
{\r
struct rk_ts_data *ts;\r
int len = 0;\r
char *version_info = NULL;\r
- unsigned char read_data[1201] = {80, };\r
+ static unsigned char read_data[1201] = {80, };\r
\r
ts = i2c_get_clientdata(i2c_connect_client);\r
if(ts==NULL)\r
},\r
};\r
\r
+\r
+static struct class *ts_debug_class = NULL;\r
+static ssize_t dbg_mode_show(struct class *cls,struct class_attribute *attr, char *_buf)\r
+{\r
+ printk("%s>>>>>>>>\n",__func__);\r
+ return 0;\r
+}\r
+\r
+static ssize_t dbg_mode_store(struct class *cls,struct class_attribute *attr, const char *buf, size_t _count)\r
+{\r
+ dbg_thresd = simple_strtol(buf,NULL,10);\r
+ if(dbg_thresd)\r
+ {\r
+ printk(KERN_INFO "ts debug open\n");\r
+ }\r
+ else\r
+ {\r
+ printk(KERN_INFO "ts debug close");\r
+ }\r
+ \r
+ return _count;\r
+}\r
+static CLASS_ATTR(debug, 0666, dbg_mode_show, dbg_mode_store);\r
+\r
+static int dbg_sys_init(void)\r
+{\r
+ int ret ;\r
+ ts_debug_class = class_create(THIS_MODULE, "ts_debug");\r
+ ret = class_create_file(ts_debug_class, &class_attr_debug);\r
+ if (ret)\r
+ {\r
+ printk("Fail to creat class hkrkfb.\n");\r
+ }\r
+ return 0;\r
+}\r
+\r
+\r
/******************************************************* \r
Description:\r
Driver Install function.\r
{\r
int ret ;\r
ret=i2c_add_driver(&rk_ts_driver);\r
+ dbg_sys_init(); //for debug\r
return ret; \r
}\r
\r