1 #include <linux/init.h>
2 #include <linux/module.h>
3 #include <linux/delay.h>
5 #include <linux/input.h>
6 #include <linux/slab.h>
7 #include <linux/gpio.h>
8 #include <linux/sched.h>
9 #include <linux/kthread.h>
10 #include <linux/bitops.h>
11 #include <linux/kernel.h>
12 #include <linux/delay.h>
13 #include <linux/byteorder/generic.h>
14 #ifdef CONFIG_HAS_EARLYSUSPEND
15 #include <linux/earlysuspend.h>
17 #include <linux/interrupt.h>
18 #include <linux/time.h>
19 #include <linux/rtpm_prio.h>
20 #include <mach/eint.h>
21 #include <linux/proc_fs.h>
22 #include <asm/uaccess.h>
23 #include <cust_eint.h>
24 #include <linux/jiffies.h>
27 #include "gn_mms144.h"
28 #include "gn_mms144_bin_isc.h"
30 #define TP_DEV_NAME "mms144"
31 #define I2C_RETRY_CNT 5 //Fixed value
32 #define DOWNLOAD_RETRY_CNT 5 //Fixed value
33 #define MELFAS_DOWNLOAD 1 //Fixed value
35 #define PRESS_KEY 1 //Fixed value
36 #define RELEASE_KEY 0 //Fixed value
38 #define TS_READ_LEN_ADDR 0x0F //Fixed value
39 #define TS_READ_START_ADDR 0x10 //Fixed value
40 #define TS_READ_REGS_LEN 66 //Fixed value
41 #define TS_WRITE_REGS_LEN 16 //Fixed value
43 #define TS_MAX_TOUCH 10 //Model Dependent
44 #define TS_READ_HW_VER_ADDR 0xF1 //Model Dependent
45 #define TS_READ_SW_VER_ADDR 0xF5 //Model Dependent
47 #define MELFAS_HW_REVISON 0x01 //Model Dependent
48 #define MELFAS_FW_VERSION 0x02 //Model Dependent
50 #define MELFAS_MAX_TRANSACTION_LENGTH 66
51 #define MELFAS_MAX_I2C_TRANSFER_SIZE 7
52 #define MELFAS_I2C_DEVICE_ADDRESS_LEN 1
53 //#define I2C_MASTER_CLOCK 400
54 #define MELFAS_I2C_MASTER_CLOCK 100
55 #define MELFAS_I2C_ADDRESS 0x48
57 #define REPORT_MT_DOWN(touch_number, x, y, width, strength) \
59 input_report_abs(tpd->dev, ABS_PRESSURE, strength); \
60 input_report_key(tpd->dev, BTN_TOUCH, 1); \
61 input_report_abs(tpd->dev, ABS_MT_TRACKING_ID, touch_number);\
62 input_report_abs(tpd->dev, ABS_MT_POSITION_X, x); \
63 input_report_abs(tpd->dev, ABS_MT_POSITION_Y, y); \
64 input_report_abs(tpd->dev, ABS_MT_TOUCH_MAJOR, width); \
65 input_report_abs(tpd->dev, ABS_MT_WIDTH_MAJOR, strength); \
66 input_mt_sync(tpd->dev); \
69 #define REPORT_MT_UP() \
71 input_report_key(tpd->dev, BTN_TOUCH, 0); \
72 input_mt_sync(tpd->dev); \
76 static int melfas_tpd_flag
= 0;
78 static struct muti_touch_info g_Mtouch_info
[TS_MAX_TOUCH
];
79 //static int tsp_keycodes[4] = {KEY_MENU, KEY_HOME, KEY_SEARCH, KEY_BACK};
81 #ifdef TPD_HAVE_BUTTON
82 #define TPD_KEY_COUNT 4
83 #define TPD_KEYS { KEY_HOME,KEY_MENU,KEY_BACK, KEY_SEARCH}
84 #define TPD_KEYS_DIM {{60,850,120,100},{180,850,120,100},{300,850,120,100},{420,850,120,100}}
85 static int tpd_keys_local
[TPD_KEY_COUNT
] = TPD_KEYS
;
86 static int tpd_keys_dim_local
[TPD_KEY_COUNT
][4] = TPD_KEYS_DIM
;
90 static DECLARE_WAIT_QUEUE_HEAD(melfas_waiter
);
92 static struct i2c_client
*melfas_i2c_client
= NULL
;
94 static const struct i2c_device_id melfas_tpd_id
[] = {{TP_DEV_NAME
,0},{}};
95 static struct i2c_board_info __initdata melfas_i2c_tpd
={ I2C_BOARD_INFO(TP_DEV_NAME
, MELFAS_I2C_ADDRESS
)};
97 static int melfas_tpd_i2c_probe(struct i2c_client
*client
, const struct i2c_device_id
*id
);
98 static int melfas_tpd_i2c_remove(struct i2c_client
*client
);
99 static int melfas_tpd_i2c_detect(struct i2c_client
*client
, struct i2c_board_info
*info
);
100 extern int isc_fw_download(struct i2c_client
*client
, const u8
*data
, size_t len
);
101 static int melfas_i2c_read(struct i2c_client
*client
, u16 addr
, u16 len
, u8
*rxbuf
);
103 static void melfas_ts_release_all_finger(void);
106 extern struct tpd_device
*tpd
;
110 static struct i2c_driver melfas_tpd_i2c_driver
=
112 .probe
= melfas_tpd_i2c_probe
,
113 .remove
= __devexit_p(melfas_tpd_i2c_remove
),
114 .detect
= melfas_tpd_i2c_detect
,
115 .driver
.name
= "mtk-tpd",
116 .id_table
= melfas_tpd_id
,
117 #ifndef CONFIG_HAS_EARLYSUSPEND
118 .suspend
= melfas_ts_suspend
,
119 .resume
= melfas_ts_resume
,
124 #define VAR_CHAR_NUM_MAX 20
126 #if defined (GN_MTK_BSP)
127 static ssize_t
show_update_pro(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
129 #if defined(TPD_UPDATE_FW)
131 TPD_DMESG(" show_update_fw_pro\n");
133 melfas_update_show_reg(ver
);
134 snprintf(buf
, VAR_CHAR_NUM_MAX
, "%s", ver
);
139 static ssize_t
store_update_pro(struct kobject
*kobj
, struct kobj_attribute
*attr
, const char *buf
, size_t count
)
141 //char strbuf[10]="OK\n";
143 TPD_DMESG(" store_update_fw_pro\n");
144 TPD_DMESG(" store_update_fw_pro--%s----\n",buf
);
145 if(!strcmp(buf
, "update"))
147 #if defined(TPD_UPDATE_FW)
148 melfas_tpd_update_fw();
151 // snprintf(buf, VAR_CHAR_NUM_MAX, "%s", strbuf);
156 static struct kobj_attribute update_firmware_attribute
= {
157 .attr
= {.name
= "update", .mode
= 0664},
158 .show
= show_update_pro
,
159 .store
= store_update_pro
,
161 static int tpd_create_attr(void)
164 struct kobject
*kobject_ts
;
165 kobject_ts
= kobject_create_and_add("touch_screen", NULL
);
168 printk("create kobjetct error!\n");
172 ret
= sysfs_create_file(kobject_ts
, &update_firmware_attribute
.attr
);
174 kobject_put(kobject_ts
);
175 printk("create file error\n");
186 static void esd_rest_tp(void)
188 printk("==========tp have inter esd =============\n");
189 mt_set_gpio_mode(GPIO_CTP_EN_PIN
, GPIO_CTP_EN_PIN_M_GPIO
);
190 mt_set_gpio_dir(GPIO_CTP_EN_PIN
, GPIO_DIR_OUT
);
191 mt_set_gpio_out(GPIO_CTP_EN_PIN
, GPIO_OUT_ZERO
);
193 mt_set_gpio_mode(GPIO_CTP_EN_PIN
, GPIO_CTP_EN_PIN_M_GPIO
);
194 mt_set_gpio_dir(GPIO_CTP_EN_PIN
, GPIO_DIR_OUT
);
195 mt_set_gpio_out(GPIO_CTP_EN_PIN
, GPIO_OUT_ONE
);
199 static int melfas_touch_event_handler(void *unused
)
201 uint8_t buf
[TS_READ_REGS_LEN
] = { 0 };
202 int i
, read_num
, fingerID
, Touch_Type
= 0, touchState
= 0;//, keyID = 0;
203 //uint8_t buf_esd[2]={0};
205 struct sched_param param
= { .sched_priority
= RTPM_PRIO_TPD
};
208 sched_setscheduler(current
, SCHED_RR
, ¶m
);
212 set_current_state(TASK_INTERRUPTIBLE
);
214 wait_event_interruptible(melfas_waiter
, melfas_tpd_flag
!= 0);
217 set_current_state(TASK_RUNNING
);
219 melfas_i2c_read(melfas_i2c_client
, TS_READ_LEN_ADDR
, 1, buf
);
223 melfas_i2c_read(melfas_i2c_client
, TS_READ_START_ADDR
, read_num
, buf
);
224 //printk("esd 0x10 register = %2X\n",buf[0]);
231 for (i
= 0; i
< read_num
; i
= i
+ 6)
233 Touch_Type
= (buf
[i
] >> 5) & 0x03;
235 /* touch type is panel */
236 if (Touch_Type
== TOUCH_SCREEN
)
238 fingerID
= (buf
[i
] & 0x0F) - 1;
239 touchState
= (buf
[i
] & 0x80);
241 g_Mtouch_info
[fingerID
].posX
= (uint16_t)(buf
[i
+ 1] & 0x0F) << 8 | buf
[i
+ 2];
242 g_Mtouch_info
[fingerID
].posY
= (uint16_t)(buf
[i
+ 1] & 0xF0) << 4 | buf
[i
+ 3];
243 g_Mtouch_info
[fingerID
].area
= buf
[i
+ 4];
246 g_Mtouch_info
[fingerID
].pressure
= buf
[i
+ 5];
248 g_Mtouch_info
[fingerID
].pressure
= 0;
251 for (i
= 0; i
< TS_MAX_TOUCH
; i
++)
253 if (g_Mtouch_info
[i
].pressure
== -1)
257 if(g_Mtouch_info
[i
].pressure
== 0)
264 REPORT_MT_DOWN(i
, g_Mtouch_info
[i
].posX
, g_Mtouch_info
[i
].posY
, g_Mtouch_info
[i
].area
, g_Mtouch_info
[i
].pressure
);
266 TPD_DEBUG("[TSP] %s: Touch ID: %d, State : %d, x: %d, y: %d, z: %d w: %d\n", __FUNCTION__
,
267 i
, (g_Mtouch_info
[i
].pressure
> 0), g_Mtouch_info
[i
].posX
, g_Mtouch_info
[i
].posY
, g_Mtouch_info
[i
].pressure
, g_Mtouch_info
[i
].area
);
270 if (g_Mtouch_info
[i
].pressure
== 0)
271 g_Mtouch_info
[i
].pressure
= -1;
274 if ( tpd
!= NULL
&& tpd
->dev
!= NULL
)
275 input_sync(tpd
->dev
);
283 } while ( !kthread_should_stop() );
288 static void melfas_i2c_tpd_eint_interrupt_handler(void)
292 wake_up_interruptible(&melfas_waiter
);
295 int melfas_i2c_write_bytes( struct i2c_client
*client
, u16 addr
, int len
, u8
*txbuf
)
297 u8 buffer
[MELFAS_MAX_TRANSACTION_LENGTH
]={0};
304 .addr
= ((client
->addr
&I2C_MASK_FLAG
)|(I2C_ENEXT_FLAG
)),
307 .timing
= MELFAS_I2C_MASTER_CLOCK
,
314 TPD_DEBUG("i2c_write_bytes to device %02X address %04X len %d\n", client
->addr
, addr
, len
);
320 buffer
[0] = (u8
)addr
+offset
;
322 if ( left
> MELFAS_MAX_I2C_TRANSFER_SIZE
)
324 memcpy( &buffer
[MELFAS_I2C_DEVICE_ADDRESS_LEN
], &txbuf
[offset
], MELFAS_MAX_I2C_TRANSFER_SIZE
);
325 msg
.len
= MELFAS_MAX_TRANSACTION_LENGTH
;
326 left
-= MELFAS_MAX_I2C_TRANSFER_SIZE
;
327 offset
+= MELFAS_MAX_I2C_TRANSFER_SIZE
;
331 memcpy( &buffer
[MELFAS_I2C_DEVICE_ADDRESS_LEN
], &txbuf
[offset
], left
);
332 msg
.len
= left
+ MELFAS_I2C_DEVICE_ADDRESS_LEN
;
336 TPD_DEBUG("byte left %d offset %d\n", left
, offset
);
338 while ( i2c_transfer( client
->adapter
, &msg
, 1 ) != 1 )
342 if ( retry
== I2C_RETRY_CNT
)
344 TPD_DEBUG("I2C write 0x%X%X length=%d failed\n", buffer
[0], buffer
[1], len
);
345 TPD_DMESG("I2C write 0x%X%X length=%d failed\n", buffer
[0], buffer
[1], len
);
349 TPD_DEBUG("I2C write retry %d addr 0x%X%X\n", retry
, buffer
[0], buffer
[1]);
357 static int melfas_i2c_read(struct i2c_client
*client
, u16 addr
, u16 len
, u8
*rxbuf
)
359 u8 buffer
[MELFAS_I2C_DEVICE_ADDRESS_LEN
]={0};
364 struct i2c_msg msg
[2] =
367 .addr
= ((client
->addr
&I2C_MASK_FLAG
)|(I2C_ENEXT_FLAG
)),
370 .len
= MELFAS_I2C_DEVICE_ADDRESS_LEN
,
371 .timing
= MELFAS_I2C_MASTER_CLOCK
374 .addr
= ((client
->addr
&I2C_MASK_FLAG
)|(I2C_ENEXT_FLAG
)),
376 .timing
= MELFAS_I2C_MASTER_CLOCK
383 TPD_DEBUG("i2c_read_bytes to device %02X address %04X len %d\n", client
->addr
, addr
, len
);
387 buffer
[0] = (u8
)addr
+offset
;
389 msg
[1].buf
= &rxbuf
[offset
];
391 if ( left
> MELFAS_MAX_TRANSACTION_LENGTH
)
393 msg
[1].len
= MELFAS_MAX_TRANSACTION_LENGTH
;
394 left
-= MELFAS_MAX_TRANSACTION_LENGTH
;
395 offset
+= MELFAS_MAX_TRANSACTION_LENGTH
;
405 while ( i2c_transfer( client
->adapter
, &msg
[0], 2 ) != 2 )
409 if ( retry
== I2C_RETRY_CNT
)
411 TPD_DEBUG("I2C read 0x%X length=%d failed\n", addr
+ offset
, len
);
412 TPD_DMESG("I2C read 0x%X length=%d failed\n", addr
+ offset
, len
);
421 static int melfas_check_firmware(struct i2c_client
*client
, u8
*val
)
427 ret
= melfas_i2c_read(client
, TS_READ_HW_VER_ADDR
, 1, &val
[0]);
428 ret
= melfas_i2c_read(client
, TS_READ_SW_VER_ADDR
, 1, &val
[1]);
432 TPD_DMESG("[melfas_tpd]: HW Revision[0x%02x] SW Version[0x%02x] \n", val
[0], val
[1]);
437 TPD_DMESG("[melfas_tpd] %s,%d: i2c read fail[%d] \n", __FUNCTION__
, __LINE__
, ret
);
443 static int melfas_firmware_update(struct i2c_client
*client
)
446 uint8_t fw_ver
[2] = {0, };
448 ret
= melfas_check_firmware(client
, fw_ver
);
450 TPD_DMESG("[melfas_tpd] check_firmware fail! [%d]", ret
);
453 #if 0//MELFAS_DOWNLOAD
454 if (fw_ver
[1] < MELFAS_FW_VERSION
)
458 TPD_DMESG("[melfas_tpd] %s: \n", __func__
);
459 ret
= isc_fw_download(client
, MELFAS_binary
, MELFAS_binary_nLength
);
462 //ret = isp_fw_download(MELFAS_MMS100_Initial_binary, MELFAS_MMS100_Initial_nLength);
465 TPD_DMESG("[melfas_tpd] error updating firmware to version 0x%02x \n", MELFAS_FW_VERSION
);
470 ret
= isc_fw_download(client
, MELFAS_binary
, MELFAS_binary_nLength
);
479 static int melfas_tpd_i2c_probe(struct i2c_client
*client
, const struct i2c_device_id
*id
)
482 struct task_struct
*thread
= NULL
;
484 TPD_DMESG("[melfas_tpd] %s\n", __func__
);
487 mt_set_gpio_mode(GPIO_CTP_EN_PIN
, GPIO_CTP_EN_PIN_M_GPIO
);
488 mt_set_gpio_dir(GPIO_CTP_EN_PIN
, GPIO_DIR_OUT
);
489 mt_set_gpio_out(GPIO_CTP_EN_PIN
, GPIO_OUT_ONE
);
493 melfas_i2c_client
= client
;
495 melfas_firmware_update(client
);
497 #if defined (GN_MTK_BSP)
498 err
= tpd_create_attr();
501 TPD_DMESG(" tpd create attribute err = %d\n", err
);
505 thread
= kthread_run(melfas_touch_event_handler
, 0, TPD_DEVICE
);
509 err
= PTR_ERR(thread
);
510 TPD_DMESG(TPD_DEVICE
"[melfas_tpd] failed to create kernel thread: %d\n", err
);
514 mt_set_gpio_mode(GPIO_CTP_EINT_PIN
, GPIO_CTP_EINT_PIN_M_EINT
);
515 mt_set_gpio_dir(GPIO_CTP_EINT_PIN
, GPIO_DIR_IN
);
516 mt_set_gpio_pull_enable(GPIO_CTP_EINT_PIN
, GPIO_PULL_ENABLE
);
517 mt_set_gpio_pull_select(GPIO_CTP_EINT_PIN
, GPIO_PULL_UP
);
521 //mt65xx_eint_set_sens(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_SENSITIVE);
522 //mt65xx_eint_set_hw_debounce(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_DEBOUNCE_CN);
523 mt_eint_registration(CUST_EINT_TOUCH_PANEL_NUM
, CUST_EINT_TOUCH_PANEL_TYPE
, tpd_eint_interrupt_handler
, 1);
524 mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM
);
530 static int melfas_tpd_i2c_remove(struct i2c_client
*client
)
534 static int melfas_tpd_i2c_detect(struct i2c_client
*client
, struct i2c_board_info
*info
)
536 TPD_DMESG("[melfas_tpd] %s\n", __func__
);
537 strcpy(info
->type
, "mtk-tpd");
540 static int melfas_tpd_local_init(void)
543 TPD_DMESG("[melfas_tpd] end %s, %d\n", __FUNCTION__
, __LINE__
);
544 if(i2c_add_driver(&melfas_tpd_i2c_driver
)!=0)
546 TPD_DMESG("[melfas_tpd] unable to add i2c driver.\n");
549 if(tpd_load_status
== 0)
551 TPD_DMESG("[melfas_tpd] add error touch panel driver.\n");
552 i2c_del_driver(&melfas_tpd_i2c_driver
);
555 #ifdef TPD_HAVE_BUTTON
556 tpd_button_setting(TPD_KEY_COUNT
, tpd_keys_local
, tpd_keys_dim_local
);
567 static void melfas_ts_release_all_finger(void)
570 TPD_DMESG("[melfas_tpd] %s\n", __func__
);
571 for (i
= 0; i
< TS_MAX_TOUCH
; i
++)
573 input_mt_slot(tpd
->dev
, i
);
574 input_mt_report_slot_state(tpd
->dev
, MT_TOOL_FINGER
, false);
576 input_sync(tpd
->dev
);
579 static void melfas_ts_release_all_finger(void)
582 TPD_DMESG("[melfas_tpd] %s\n", __func__
);
584 for(i
=0; i
<TS_MAX_TOUCH
; i
++)
586 if(-1 == g_Mtouch_info
[i
].pressure
)
589 if(g_Mtouch_info
[i
].pressure
== 0)
590 input_mt_sync(tpd
->dev
);
592 if(0 == g_Mtouch_info
[i
].pressure
)
593 g_Mtouch_info
[i
].pressure
= -1;
595 input_sync(tpd
->dev
);
600 #ifdef CONFIG_HAS_EARLYSUSPEND
601 static void melfas_tpd_early_suspend(struct early_suspend
*h
)
603 TPD_DMESG("[melfas_tpd] %s\n", __func__
);
605 melfas_ts_release_all_finger();
608 mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM
);
610 mt_set_gpio_mode(GPIO_CTP_EN_PIN
, GPIO_CTP_EN_PIN_M_GPIO
);
611 mt_set_gpio_dir(GPIO_CTP_EN_PIN
, GPIO_DIR_OUT
);
612 mt_set_gpio_out(GPIO_CTP_EN_PIN
, GPIO_OUT_ZERO
);
615 static void melfas_tpd_late_resume(struct early_suspend
*h
)
618 //struct melfas_ts_data *ts = i2c_get_clientdata(client);
620 TPD_DMESG("[melfas_tpd] %s\n", __func__
);
623 mt_set_gpio_mode(GPIO_CTP_EN_PIN
, GPIO_CTP_EN_PIN_M_GPIO
);
624 mt_set_gpio_dir(GPIO_CTP_EN_PIN
, GPIO_DIR_OUT
);
625 mt_set_gpio_out(GPIO_CTP_EN_PIN
, GPIO_OUT_ONE
);
628 mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM
);
632 static struct tpd_driver_t melfas_tpd_device_driver
=
634 .tpd_device_name
= "melfas_mms144",
635 .tpd_local_init
= melfas_tpd_local_init
,
636 #ifdef CONFIG_HAS_EARLYSUSPEND
637 .suspend
= melfas_tpd_early_suspend
,
638 .resume
= melfas_tpd_late_resume
,
640 #ifdef TPD_HAVE_BUTTON
641 .tpd_have_button
= 1,
643 .tpd_have_button
= 0,
649 /* called when loaded into kernel */
650 static int __init
melfas_tpd_driver_init(void)
652 TPD_DMESG("[melfas_tpd] %s\n", __func__
);
653 i2c_register_board_info(0, &melfas_i2c_tpd
, 1);
654 if ( tpd_driver_add(&melfas_tpd_device_driver
) < 0)
655 TPD_DMESG("[melfas_tpd] add generic driver failed\n");
660 /* should never be called */
661 static void __exit
melfas_tpd_driver_exit(void)
663 TPD_DMESG("[melfas_tpd] %s\n", __func__
);
664 tpd_driver_remove(&melfas_tpd_device_driver
);
668 module_init(melfas_tpd_driver_init
);
669 module_exit(melfas_tpd_driver_exit
);