/drivers/amlogic/input/touch_screen/ssd2533.c

http://github.com/madmaze/Meson-3-Kernel · C · 1101 lines · 911 code · 127 blank · 63 comment · 99 complexity · fa717828f388c2e5d0e2a7aadec67064 MD5 · raw file

  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/input.h>
  4. #include <linux/interrupt.h>
  5. #include <linux/irq.h>
  6. #include <linux/timer.h>
  7. #include <linux/delay.h>
  8. #include <linux/hrtimer.h>
  9. #include <linux/i2c.h>
  10. #include <asm/io.h>
  11. #include <mach/gpio.h>
  12. #ifdef CONFIG_HAS_EARLYSUSPEND
  13. #include <linux/earlysuspend.h>
  14. #endif /* CONFIG_HAS_EARLYSUSPEND */
  15. #include <linux/slab.h>
  16. #include <mach/hardware.h>
  17. #define CONFIG_TOUCHSCREEN_SSL_DEBUG
  18. #undef CONFIG_TOUCHSCREEN_SSL_DEBUG
  19. #define Dynamic_threshold
  20. #define DEVICE_ID_REG 2
  21. #define VERSION_ID_REG 3
  22. #define AUTO_INIT_RST_REG 68
  23. #define EVENT_STATUS 121
  24. #define EVENT_MSK_REG 122
  25. #define IRQ_MSK_REG 123
  26. #define FINGER01_REG 124
  27. #define EVENT_STACK 128
  28. #define EVENT_FIFO_SCLR 135
  29. #define TIMESTAMP_REG 136
  30. #define SELFCAP_STATUS_REG 185
  31. #define ON_TOUCH_INT INT_GPIO_0 //GPIO :set the interrupt
  32. #define GPIO_INT ((GPIOA_bank_bit0_27(16)<<16) | GPIOA_bit_bit0_27(16))
  33. #define GPIO_POWER_EN ((GPIOC_bank_bit0_15(9)<<16) | GPIOC_bit_bit0_15(9))
  34. #define GPIO_RST ((GPIOC_bank_bit0_15(3)<<16) | GPIOC_bit_bit0_15(3))
  35. struct ChipSetting {
  36. char No;
  37. char Reg;
  38. char Data1;
  39. char Data2;
  40. };
  41. #include "ssd253x-ts_TP.h"
  42. void deviceReset(struct i2c_client *client);
  43. void deviceResume(struct i2c_client *client);
  44. void deviceSuspend(struct i2c_client *client);
  45. void SSD253xdeviceInit1(struct i2c_client *client);
  46. void SSD253xdeviceInit(struct i2c_client *client);
  47. static int ssd253x_ts_open(struct input_dev *dev);
  48. static void ssd253x_ts_close(struct input_dev *dev);
  49. static int ssd253x_ts_suspend(struct i2c_client *client, pm_message_t mesg);
  50. static int ssd253x_ts_resume(struct i2c_client *client);
  51. #ifdef CONFIG_HAS_EARLYSUSPEND
  52. static void ssd253x_ts_early_suspend(struct early_suspend *h);
  53. static void ssd253x_ts_late_resume(struct early_suspend *h);
  54. #endif /* CONFIG_HAS_EARLYSUSPEND */
  55. static enum hrtimer_restart ssd253x_ts_timer(struct hrtimer *timer);
  56. static irqreturn_t ssd253x_ts_isr(int irq, void *dev_id);
  57. static struct workqueue_struct *ssd253x_wq;
  58. struct ssl_ts_priv {
  59. struct i2c_client *client;
  60. struct input_dev *input;
  61. struct hrtimer timer;
  62. struct work_struct ssl_work;
  63. #ifdef CONFIG_HAS_EARLYSUSPEND
  64. struct early_suspend early_suspend;
  65. #endif
  66. int irq;
  67. int use_irq;
  68. int FingerNo;
  69. int FingerX[FINGERNO];
  70. int FingerY[FINGERNO];
  71. int FingerP[FINGERNO];
  72. int Resolution;
  73. int EventStatus;
  74. int FingerDetect;
  75. int sFingerX[FINGERNO];
  76. int sFingerY[FINGERNO];
  77. int pFingerX[FINGERNO];
  78. int pFingerY[FINGERNO];
  79. };
  80. int Threshold_flag = 0;
  81. int ssd253x_record,ssd253x_current,ssd253x_timer_flag; //add by hjc
  82. int ReadRegister(struct i2c_client *client,uint8_t reg,int ByteNo)
  83. {
  84. unsigned char buf[4];
  85. struct i2c_msg msg[2];
  86. int ret;
  87. memset(buf, 0xFF, sizeof(buf));
  88. msg[0].addr = client->addr;
  89. msg[0].flags = 0;
  90. msg[0].len = 1;
  91. msg[0].buf = &reg;
  92. msg[1].addr = client->addr;
  93. msg[1].flags = I2C_M_RD;
  94. msg[1].len = ByteNo;
  95. msg[1].buf = buf;
  96. ret = i2c_transfer(client->adapter, msg, 2);
  97. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  98. if(ret<0) printk(" ReadRegister: i2c_transfer Error !\n");
  99. else printk(" ReadRegister: i2c_transfer OK !\n");
  100. #endif
  101. if(ByteNo==1) return (int)((unsigned int)buf[0]<<0);
  102. if(ByteNo==2) return (int)((unsigned int)buf[1]<<0)|((unsigned int)buf[0]<<8);
  103. if(ByteNo==3) return (int)((unsigned int)buf[2]<<0)|((unsigned int)buf[1]<<8)|((unsigned int)buf[0]<<16);
  104. if(ByteNo==4) return (int)((unsigned int)buf[3]<<0)|((unsigned int)buf[2]<<8)|((unsigned int)buf[1]<<16)|(buf[0]<<24);
  105. return 0;
  106. }
  107. void WriteRegister(struct i2c_client *client,uint8_t Reg,unsigned char Data1,unsigned char Data2,int ByteNo)
  108. {
  109. struct i2c_msg msg;
  110. unsigned char buf[4];
  111. int ret;
  112. buf[0]=Reg;
  113. buf[1]=Data1;
  114. buf[2]=Data2;
  115. buf[3]=0;
  116. msg.addr = client->addr;
  117. msg.flags = 0;
  118. msg.len = ByteNo+1;
  119. msg.buf = (char *)buf;
  120. ret = i2c_transfer(client->adapter, &msg, 1);
  121. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  122. if(ret<0) printk(" WriteRegister: i2c_master_send Error !\n");
  123. else printk(" WriteRegister: i2c_master_send OK !\n");
  124. #endif
  125. }
  126. void SSD253xdeviceInit1(struct i2c_client *client)
  127. {
  128. #ifdef SSD2533FIXEDCODE
  129. int i;
  130. mdelay(600); //SSD2533 ESD2 EEPROM VERSION
  131. for(i=0;i<sizeof(ssd253xcfgTable1)/sizeof(ssd253xcfgTable1[0]);i++)
  132. {
  133. WriteRegister ( client,ssd253xcfgTable1[i].Reg,
  134. ssd253xcfgTable1[i].Data1,ssd253xcfgTable1[i].Data2,
  135. ssd253xcfgTable1[i].No);
  136. }
  137. #endif
  138. }
  139. void SSD253xdeviceInit(struct i2c_client *client)
  140. {
  141. int i;
  142. for(i=0;i<sizeof(ssd253xcfgTable)/sizeof(ssd253xcfgTable[0]);i++)
  143. {
  144. WriteRegister( client,ssd253xcfgTable[i].Reg,
  145. ssd253xcfgTable[i].Data1,ssd253xcfgTable[i].Data2,
  146. ssd253xcfgTable[i].No);
  147. }
  148. mdelay(150);
  149. }
  150. void deviceReset(struct i2c_client *client)
  151. {
  152. int i;
  153. for(i=0;i<sizeof(Reset)/sizeof(Reset[0]);i++)
  154. {
  155. WriteRegister( client,Reset[i].Reg,
  156. Reset[i].Data1,Reset[i].Data2,
  157. Reset[i].No);
  158. }
  159. mdelay(200);
  160. SSD253xdeviceInit1(client);
  161. }
  162. void deviceResume(struct i2c_client *client)
  163. {
  164. #if 1
  165. #if 0
  166. //RST pin pull down
  167. gpio_direction_output(SHUTDOWN_PORT, 0);
  168. mdelay(5);
  169. gpio_direction_output(SHUTDOWN_PORT, 1);
  170. mdelay(2);
  171. #else
  172. //RST pin pull down
  173. gpio_direction_output(GPIO_RST, 0);
  174. mdelay(5);
  175. gpio_direction_output(GPIO_RST, 1);
  176. mdelay(2);
  177. #endif
  178. deviceReset(client);
  179. SSD253xdeviceInit(client);
  180. #else
  181. int i;
  182. //int timeout=10;
  183. int status;
  184. for(i=0;i<sizeof(Resume)/sizeof(Resume[0]);i++)
  185. {
  186. WriteRegister( client,Resume[i].Reg,
  187. Resume[i].Data1,Resume[i].Data2,
  188. Resume[i].No);
  189. mdelay(200);
  190. }
  191. /*
  192. do {
  193. status=ReadRegister(client,0x26,1);
  194. printk(" deviceResume: status : %d !\n",status);
  195. if(status==Resume[2].Data1) break;
  196. mdelay(1);
  197. }while(timeout--); // Check the status
  198. */
  199. #endif
  200. }
  201. void deviceSuspend(struct i2c_client *client)
  202. {
  203. #if 1
  204. #if 0
  205. //RST pin pull down
  206. gpio_direction_output(SHUTDOWN_PORT, 0);
  207. mdelay(5);
  208. gpio_direction_output(SHUTDOWN_PORT, 1);
  209. mdelay(2);
  210. #else
  211. //RST pin pull down
  212. gpio_direction_output(GPIO_RST, 0);
  213. mdelay(5);
  214. gpio_direction_output(GPIO_RST, 1);
  215. mdelay(2);
  216. #endif
  217. #else
  218. int i;
  219. //int timeout=10;
  220. int status;
  221. /*
  222. WriteRegister( client,Suspend[0].Reg,
  223. Suspend[0].Data1,Suspend[0].Data2,
  224. Suspend[0].No);
  225. do {
  226. status=ReadRegister(client,0x26,1);
  227. if(status==Suspend[0].Data1) break;
  228. mdelay(1);
  229. }while(timeout--);
  230. */
  231. for(i=0;i<sizeof(Suspend)/sizeof(Suspend[0]);i++)
  232. {
  233. WriteRegister( client,Suspend[i].Reg,
  234. Suspend[i].Data1,Suspend[i].Data2,
  235. Suspend[i].No);
  236. mdelay(200);
  237. }
  238. #endif
  239. }
  240. #define Mode RunningAverageMode
  241. #define Dist RunningAverageDist
  242. void RunningAverage(unsigned short *xpos,unsigned short *ypos,int No,struct ssl_ts_priv *ssl_priv)
  243. {
  244. int FilterMode[4][2]={{0,8},{5,3},{6,2},{7,1}};
  245. int dx,dy;
  246. int X,Y;
  247. X=*xpos;
  248. Y=*ypos;
  249. if((ssl_priv->pFingerX[No]!=0x0FFF)&&(X!=0x0FFF))
  250. {
  251. dx=abs(ssl_priv->pFingerX[No]-X);
  252. dy=abs(ssl_priv->pFingerY[No]-Y);
  253. if(dx+dy<Dist*64)
  254. {
  255. ssl_priv->pFingerX[No]=(FilterMode[Mode][0]*ssl_priv->pFingerX[No]+FilterMode[Mode][1]*X)/8;
  256. ssl_priv->pFingerY[No]=(FilterMode[Mode][0]*ssl_priv->pFingerY[No]+FilterMode[Mode][1]*Y)/8;
  257. }
  258. else
  259. {
  260. ssl_priv->pFingerX[No]=X;
  261. ssl_priv->pFingerY[No]=Y;
  262. }
  263. }
  264. else
  265. {
  266. ssl_priv->pFingerX[No]=X;
  267. ssl_priv->pFingerY[No]=Y;
  268. }
  269. *xpos=ssl_priv->pFingerX[No];
  270. *ypos=ssl_priv->pFingerY[No];
  271. }
  272. void FingerCheckSwap(int *FingerX,int *FingerY,int *FingerP,int FingerNo,int *sFingerX,int *sFingerY)
  273. {
  274. int i,j;
  275. int index1,index2;
  276. int Vx,Vy;
  277. int Ux,Uy;
  278. int R1x,R1y;
  279. int R2x,R2y;
  280. for(i=0;i<FingerNo;i++)
  281. {
  282. index1=i;
  283. if( FingerX[index1]!=0xFFF)
  284. if(sFingerX[index1]!=0xFFF)
  285. {
  286. for(j=i+1;j<FingerNo+3;j++)
  287. {
  288. index2=j%FingerNo;
  289. if( FingerX[index2]!=0xFFF)
  290. if(sFingerX[index2]!=0xFFF)
  291. {
  292. Ux=sFingerX[index1]-sFingerX[index2];
  293. Uy=sFingerY[index1]-sFingerY[index2];
  294. Vx= FingerX[index1]- FingerX[index2];
  295. Vy= FingerY[index1]- FingerY[index2];
  296. R1x=Ux-Vx;
  297. R1y=Uy-Vy;
  298. R2x=Ux+Vx;
  299. R2y=Uy+Vy;
  300. R1x=R1x*R1x;
  301. R1y=R1y*R1y;
  302. R2x=R2x*R2x;
  303. R2y=R2y*R2y;
  304. if(R1x+R1y>R2x+R2y)
  305. {
  306. Ux=FingerX[index1];
  307. Uy=FingerY[index1];
  308. Vx=FingerP[index1];
  309. FingerX[index1]=FingerX[index2];
  310. FingerY[index1]=FingerY[index2];
  311. FingerP[index1]=FingerP[index2];
  312. FingerX[index2]=Ux;
  313. FingerY[index2]=Uy;
  314. FingerP[index2]=Vx;
  315. }
  316. break;
  317. }
  318. }
  319. }
  320. }
  321. for(i=0;i<FingerNo;i++)
  322. {
  323. sFingerX[i]=FingerX[i];
  324. sFingerY[i]=FingerY[i];
  325. }
  326. }
  327. #ifdef SSD253x_CUT_EDGE
  328. static int ssd253x_ts_cut_edge(unsigned short pos,unsigned short x_y)
  329. {
  330. u8 cut_value = 10; //cut_value < 32
  331. if(pos == 0xfff)
  332. {
  333. return pos;
  334. }
  335. if(x_y) //xpos
  336. {
  337. if(pos < 16)
  338. pos = cut_value + pos*(48 - cut_value) / 16;
  339. else if(pos > (XPOS_MAX - 16) )
  340. pos = XPOS_MAX + 16 + (pos - (XPOS_MAX -16))*(48 - cut_value) / 16;
  341. else
  342. pos = pos + 32;
  343. pos = SSDS53X_SCREEN_MAX_X * pos / (DRIVENO * 64);
  344. return pos;
  345. }
  346. else //ypos
  347. {
  348. if(pos < 16)
  349. pos = cut_value + pos*(48 - cut_value) / 16;
  350. else if(pos > (YPOS_MAX - 16) )
  351. pos = YPOS_MAX + 16 + (pos - (YPOS_MAX -16))*(48 - cut_value) / 16;
  352. else
  353. pos = pos + 32;
  354. pos = SSDS53X_SCREEN_MAX_Y* pos / (SENSENO * 64);
  355. return pos;
  356. }
  357. }
  358. #endif
  359. static void ssd253x_ts_work(struct work_struct *work)
  360. {
  361. int i;
  362. unsigned short xpos=0, ypos=0, width=0;
  363. unsigned short tmp_point=0;
  364. int FingerInfo;
  365. int EventStatus;
  366. int FingerX[FINGERNO];
  367. int FingerY[FINGERNO];
  368. int FingerP[FINGERNO];
  369. int clrFlag=0;
  370. int timer_status;
  371. #ifdef SSD253x_TOUCH_KEY
  372. u8 btn_status;
  373. static bool key[4] = { 0, 0, 0, 0 };
  374. #endif
  375. struct ssl_ts_priv *ssl_priv = container_of(work,struct ssl_ts_priv,ssl_work);
  376. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  377. printk("+-----------------------------------------+\n");
  378. printk("| ssd253x_ts_work! |\n");
  379. printk("+-----------------------------------------+\n");
  380. #endif
  381. #ifdef Dynamic_threshold
  382. if(Threshold_flag == 0)
  383. {
  384. Threshold_flag = 1;
  385. WriteRegister(ssl_priv->client,0x34,0x00,THRESHOLD,2); //¶¯Ì¬ãÐÖµÉèΪԭÀ´Öµ-0x10
  386. }
  387. #endif
  388. if(!ssd253x_timer_flag)
  389. {
  390. timer_status = ReadRegister(ssl_priv->client,TIMESTAMP_REG,2);
  391. if(!ssd253x_record)
  392. {
  393. ssd253x_record = timer_status/1000;
  394. }
  395. ssd253x_current = timer_status/1000;
  396. if((ssd253x_current - ssd253x_record) > 10)
  397. {
  398. WriteRegister(ssl_priv->client,AUTO_INIT_RST_REG,0x00,0x00,1);
  399. ssd253x_record = 0;
  400. ssd253x_timer_flag = 1;
  401. }
  402. }
  403. #ifdef SSD253x_TOUCH_KEY
  404. btn_status = ReadRegister(ssl_priv->client,SELFCAP_STATUS_REG, 1);
  405. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  406. //if(KeyInfo<0) printk(" ssd253x_ts_work: i2c_transfer Error !\n");
  407. #endif
  408. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  409. //printk("ssd253x_ts_work read 0xB9,KeyInfo is %x\n",KeyInfo);
  410. #endif
  411. if(btn_status & 0x0f){
  412. switch(btn_status & 0x0f){
  413. case 1:
  414. key[0] = 1;
  415. input_event(ssl_priv->input,EV_KEY, key_code[0], 1);
  416. break;
  417. case 2:
  418. key[1] = 1;
  419. input_event(ssl_priv->input,EV_KEY, key_code[1], 1);
  420. break;
  421. case 4:
  422. key[2] = 1;
  423. input_event(ssl_priv->input,EV_KEY, key_code[2], 1);
  424. break;
  425. case 8:
  426. key[3] = 1;
  427. input_event(ssl_priv->input,EV_KEY, key_code[3], 1);
  428. break;
  429. default:
  430. break;
  431. }
  432. hrtimer_start(&ssl_priv->timer, ktime_set(0, MicroTimeTInterupt), HRTIMER_MODE_REL);
  433. goto work_touch;
  434. }
  435. for(i = 0; i < 4; i++)
  436. {
  437. if(key[i])
  438. {
  439. key[i] = 0;
  440. input_event(ssl_priv->input, EV_KEY, key_code[i], 0);
  441. }
  442. }
  443. work_touch:
  444. #endif
  445. EventStatus = ReadRegister(ssl_priv->client,EVENT_STATUS,2)>>4;
  446. #ifdef Dynamic_threshold
  447. if (EventStatus == 0)
  448. {
  449. Threshold_flag = 0;
  450. WriteRegister(ssl_priv->client,0x34,0x00,(THRESHOLD+0x10),2);
  451. }
  452. #endif
  453. ssl_priv->FingerDetect=0;
  454. for(i=0;i<ssl_priv->FingerNo;i++)
  455. {
  456. if((EventStatus>>i)&0x1)
  457. {
  458. FingerInfo=ReadRegister(ssl_priv->client,FINGER01_REG+i,4);
  459. xpos = ((FingerInfo>>4)&0xF00)|((FingerInfo>>24)&0xFF);
  460. ypos = ((FingerInfo>>0)&0xF00)|((FingerInfo>>16)&0xFF);
  461. //width= ((FingerInfo>>4)&0x00F);
  462. if(xpos!=0xFFF)
  463. {
  464. ssl_priv->FingerDetect++;
  465. #ifdef SSD253x_CUT_EDGE
  466. xpos = ssd253x_ts_cut_edge(xpos, 1);
  467. ypos = ssd253x_ts_cut_edge(ypos, 0);
  468. #endif
  469. }
  470. else
  471. {
  472. // This part is to avoid asyn problem when the finger leaves
  473. //printk(" ssd253x_ts_work: Correct %x\n",EventStatus);
  474. EventStatus=EventStatus&~(1<<i);
  475. clrFlag=1;
  476. }
  477. }
  478. else
  479. {
  480. xpos=ypos=0xFFF;
  481. //width=0;
  482. clrFlag=1;
  483. }
  484. FingerX[i]=xpos;
  485. FingerY[i]=ypos;
  486. //FingerP[i]=width;
  487. }
  488. if(ssl_priv->use_irq==1) enable_irq(ssl_priv->irq);
  489. if(ssl_priv->use_irq==2)
  490. {
  491. #if 0
  492. if(ssl_priv->FingerDetect==0) enable_irq(ssl_priv->irq);
  493. else hrtimer_start(&ssl_priv->timer, ktime_set(0, MicroTimeTInterupt), HRTIMER_MODE_REL);
  494. #else
  495. //enable_irq(ssl_priv->irq);
  496. if(ssl_priv->FingerDetect != 0)
  497. hrtimer_start(&ssl_priv->timer, ktime_set(0, MicroTimeTInterupt), HRTIMER_MODE_REL);
  498. #endif
  499. }
  500. if(clrFlag) WriteRegister(ssl_priv->client,EVENT_FIFO_SCLR,0x01,0x00,1);
  501. if(ssl_priv->input->id.product==0x2533)
  502. if(ssl_priv->input->id.version==0x0101)
  503. FingerCheckSwap(FingerX,FingerY,FingerP,ssl_priv->FingerNo,ssl_priv->sFingerX,ssl_priv->sFingerY);
  504. for(i=0;i<ssl_priv->FingerNo;i++)
  505. {
  506. xpos=FingerX[i];
  507. ypos=FingerY[i];
  508. width=FingerP[i];
  509. //if(ssl_priv->input->id.product==0x2533)
  510. //{
  511. // if(ssl_priv->input->id.version==0x0101) RunningAverage(&xpos,&ypos,i,ssl_priv);
  512. // if(ssl_priv->input->id.version==0x0102) RunningAverage(&xpos,&ypos,i,ssl_priv);
  513. //}
  514. if(xpos!=0xFFF)
  515. {
  516. #ifdef SSD253x_SIMULATED_KEY
  517. if(xpos > 800 && xpos>SKeys[0].left_x)
  518. {
  519. if(ypos >= SKeys[0].left_y && ypos <= SKeys[0].right_y)
  520. {
  521. input_event(ssl_priv->input,EV_KEY, key_code[0], 1);
  522. input_mt_sync(ssl_priv->input);
  523. goto end;
  524. }
  525. else if(ypos >= SKeys[1].left_y && ypos <= SKeys[1].right_y)
  526. {
  527. input_event(ssl_priv->input,EV_KEY, key_code[1], 1);
  528. input_mt_sync(ssl_priv->input);
  529. goto end;
  530. }
  531. else if(ypos >= SKeys[2].left_y && ypos <= SKeys[2].right_y)
  532. {
  533. input_event(ssl_priv->input,EV_KEY, key_code[2], 1);
  534. input_mt_sync(ssl_priv->input);
  535. goto end;
  536. }
  537. else if(ypos >= SKeys[3].left_y && ypos <= SKeys[3].right_y)
  538. {
  539. input_event(ssl_priv->input,EV_KEY, key_code[3], 1);
  540. input_mt_sync(ssl_priv->input);
  541. goto end;
  542. }
  543. else
  544. {
  545. goto report_key_release;
  546. }
  547. }
  548. #endif
  549. input_report_key(ssl_priv->input, BTN_TOUCH, 1);
  550. input_report_abs(ssl_priv->input, ABS_MT_TRACKING_ID, i);
  551. input_report_abs(ssl_priv->input, ABS_MT_TOUCH_MAJOR, 1);
  552. input_report_abs(ssl_priv->input, ABS_MT_POSITION_X, xpos);
  553. input_report_abs(ssl_priv->input, ABS_MT_POSITION_Y, ypos);
  554. input_report_abs(ssl_priv->input, ABS_MT_WIDTH_MAJOR, 1);
  555. input_mt_sync(ssl_priv->input);
  556. //#ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  557. #if 1
  558. if(i==0) printk(" ssd253x_ts_work: X = 0x%x , Y = 0x%x, W = 0x%x\n",xpos,ypos,width);
  559. #endif
  560. }
  561. else if(ssl_priv->FingerX[i]!=0xFFF)
  562. {
  563. input_report_key(ssl_priv->input, BTN_TOUCH, 0);
  564. input_report_abs(ssl_priv->input, ABS_MT_TRACKING_ID, i);
  565. input_report_abs(ssl_priv->input, ABS_MT_TOUCH_MAJOR, 0);
  566. input_report_abs(ssl_priv->input, ABS_MT_POSITION_X, ssl_priv->FingerX[i]);
  567. input_report_abs(ssl_priv->input, ABS_MT_POSITION_Y, ssl_priv->FingerY[i]);
  568. input_report_abs(ssl_priv->input, ABS_MT_WIDTH_MAJOR, 0);
  569. input_mt_sync(ssl_priv->input);
  570. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  571. //#if 1
  572. if(i==0) printk(" release ssd253x_ts_work: X = 0x%x , Y = 0x%x, W = 0x%x\n",xpos,ypos,width);
  573. #endif
  574. }
  575. ssl_priv->FingerX[i]=FingerX[i];
  576. ssl_priv->FingerY[i]=FingerY[i];
  577. ssl_priv->FingerP[i]=width;
  578. }
  579. #ifdef SSD253x_SIMULATED_KEY
  580. report_key_release:
  581. for(i = 0 ;i<sizeof(key_code)/sizeof(key_code[0]);i++)
  582. {
  583. input_event(ssl_priv->input,EV_KEY,key_code[i],0);
  584. }
  585. end:
  586. #endif
  587. ssl_priv->EventStatus=EventStatus;
  588. input_sync(ssl_priv->input);
  589. }
  590. static int ssd253x_ts_probe(struct i2c_client *client,const struct i2c_device_id *idp)
  591. {
  592. struct ssl_ts_priv *ssl_priv;
  593. struct input_dev *ssl_input;
  594. int error;
  595. int i;
  596. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  597. printk("+-----------------------------------------+\n");
  598. printk("| ssd253x_ts_probe! |\n");
  599. printk("+-----------------------------------------+\n");
  600. #endif
  601. #define Android_MT_TSC_RST ((GPIOA_bank_bit0_27(1)<<16) |GPIOA_bit_bit0_27(1))
  602. #define Android_MT_TSC_INT ((GPIOA_bank_bit0_27(16)<<16) |GPIOA_bit_bit0_27(16))
  603. gpio_request(Android_MT_TSC_RST, "TS_RESET");
  604. gpio_direction_output(Android_MT_TSC_RST,0);
  605. msleep(1);
  606. gpio_set_value(Android_MT_TSC_RST,1);
  607. gpio_direction_input(Android_MT_TSC_INT );
  608. gpio_enable_edge_int(gpio_to_idx(Android_MT_TSC_INT), 1, ON_TOUCH_INT - INT_GPIO_0);
  609. if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
  610. {
  611. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  612. printk(" ssd253x_ts_probe: need I2C_FUNC_I2C\n");
  613. #endif
  614. return -ENODEV;
  615. }
  616. else
  617. {
  618. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  619. printk(" ssd253x_ts_probe: i2c Check OK!\n");
  620. printk(" ssd253x_ts_probe: i2c_client name : %s\n",client->name);
  621. #endif
  622. }
  623. ssl_priv = kzalloc(sizeof(*ssl_priv), GFP_KERNEL);
  624. if (!ssl_priv)
  625. {
  626. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  627. printk(" ssd253x_ts_probe: kzalloc Error!\n");
  628. #endif
  629. error=-ENODEV;
  630. goto err0;
  631. }
  632. else
  633. {
  634. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  635. printk(" ssd253x_ts_probe: kzalloc OK!\n");
  636. #endif
  637. }
  638. dev_set_drvdata(&client->dev, ssl_priv);
  639. ssl_input = input_allocate_device();
  640. if (!ssl_input)
  641. {
  642. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  643. printk(" ssd253x_ts_probe: input_allocate_device Error\n");
  644. #endif
  645. error=-ENODEV;
  646. goto err1;
  647. }
  648. else
  649. {
  650. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  651. printk(" ssd253x_ts_probe: input_allocate_device OK\n");
  652. #endif
  653. }
  654. ssl_input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) | BIT_MASK(EV_SYN) ;
  655. ssl_input->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH) | BIT_MASK(BTN_2);
  656. //ssl_input->name = client->name;
  657. ssl_input->name = "ssd2533";
  658. ssl_input->id.bustype = BUS_I2C;
  659. ssl_input->id.vendor = 0xABCD;//0x2878; // Modify for Vendor ID
  660. ssl_input->dev.parent = &client->dev;
  661. //ssl_input->open = ssd253x_ts_open;
  662. //ssl_input->close = ssd253x_ts_close;
  663. input_set_drvdata(ssl_input, ssl_priv);
  664. ssl_priv->client = client;
  665. ssl_priv->input = ssl_input;
  666. ssl_priv->use_irq = ENABLE_INT;
  667. ssl_priv->irq = ON_TOUCH_INT;
  668. ssl_priv->FingerNo=FINGERNO;
  669. ssl_priv->Resolution=64;
  670. for(i=0;i<ssl_priv->FingerNo;i++)
  671. {
  672. //ssl_priv->FingerP[i]=0;
  673. // For Finger Check Swap
  674. ssl_priv->sFingerX[i]=0xFFF;
  675. ssl_priv->sFingerY[i]=0xFFF;
  676. // For Adaptive Running Average
  677. ssl_priv->pFingerX[i]=0xFFF;
  678. ssl_priv->pFingerY[i]=0xFFF;
  679. }
  680. deviceReset(client);
  681. printk("SSL Touchscreen I2C Address: 0x%02X\n",client->addr);
  682. ssl_input->id.product = ReadRegister(client, DEVICE_ID_REG,2);
  683. ssl_input->id.version = ReadRegister(client,VERSION_ID_REG,2);
  684. ssl_input->id.product = 0xBEEE;//ReadRegister(client, DEVICE_ID_REG,2);
  685. ssl_input->id.version = ReadRegister(client,VERSION_ID_REG,2);
  686. printk("SSL Touchscreen Device ID : 0x%04X\n",ssl_input->id.product);
  687. printk("SSL Touchscreen Version ID : 0x%04X\n",ssl_input->id.version);
  688. SSD253xdeviceInit(client);
  689. WriteRegister(client,EVENT_FIFO_SCLR,0x01,0x00,1); // clear Event FiFo
  690. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  691. printk(" ssd253X_ts_probe: %04XdeviceInit OK!\n",ssl_input->id.product);
  692. #endif
  693. //if(ssl_priv->input->id.product==0x2531) ssl_priv->Resolution=32;
  694. //else if(ssl_priv->input->id.product==0x2533) ssl_priv->Resolution=64;
  695. //else
  696. //{
  697. // #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  698. // printk(" ssd253x_ts_probe: ssl_input->id.product Error\n");
  699. // #endif
  700. // error=-ENODEV;
  701. // goto err1;
  702. //}
  703. input_set_abs_params(ssl_input, ABS_MT_TRACKING_ID, 0,10, 0, 0);
  704. input_set_abs_params(ssl_input, ABS_MT_TOUCH_MAJOR, 0, 1, 0, 0);
  705. input_set_abs_params(ssl_input, ABS_MT_WIDTH_MAJOR, 0, 8, 0, 0);
  706. input_set_abs_params(ssl_input, ABS_MT_POSITION_X, 0,SSDS53X_SCREEN_MAX_X + 1, 0, 0);
  707. input_set_abs_params(ssl_input, ABS_MT_POSITION_Y, 0,SSDS53X_SCREEN_MAX_Y + 1, 0, 0);
  708. //#ifdef (SSD253x_TOUCH_KEY || SSD253x_SIMULATED_KEY)
  709. #ifdef SSD253x_TOUCH_KEY
  710. set_bit(KEY_MENU, ssl_input->keybit);
  711. set_bit(KEY_HOME, ssl_input->keybit);
  712. set_bit(KEY_BACK, ssl_input->keybit);
  713. set_bit(KEY_SEARCH, ssl_input->keybit);
  714. #endif
  715. INIT_WORK(&ssl_priv->ssl_work, ssd253x_ts_work);
  716. error = input_register_device(ssl_input);
  717. if(error)
  718. {
  719. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  720. printk(" ssd253x_ts_probe: input_register_device input Error!\n");
  721. #endif
  722. error=-ENODEV;
  723. goto err1;
  724. }
  725. else
  726. {
  727. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  728. printk(" ssd253x_ts_probe: input_register_device input OK!\n");
  729. #endif
  730. }
  731. if((ssl_priv->use_irq==1)||(ssl_priv->use_irq==2))
  732. {
  733. // Options for different interrupt system
  734. // error = request_irq(ssl_priv->irq, ssd253x_ts_isr, IRQF_DISABLED|IRQF_TRIGGER_FALLING, client->name,ssl_priv);
  735. // error = request_irq(ssl_priv->irq, ssd253x_ts_isr, IRQF_TRIGGER_FALLING, client->name,ssl_priv);
  736. // error = request_irq(ssl_priv->irq, ssd253x_ts_isr, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, client->name,ssl_priv);
  737. error = request_irq(ssl_priv->irq, ssd253x_ts_isr, IRQF_TRIGGER_FALLING , client->name,ssl_priv);
  738. if(error)
  739. {
  740. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  741. printk(" ssd253x_ts_probe: request_irq Error!\n");
  742. #endif
  743. error=-ENODEV;
  744. goto err2;
  745. }
  746. else
  747. {
  748. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  749. printk(" ssd253x_ts_probe: request_irq OK!\n");
  750. #endif
  751. }
  752. }
  753. if((ssl_priv->use_irq==0)||(ssl_priv->use_irq==2))
  754. {
  755. hrtimer_init(&ssl_priv->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
  756. ssl_priv->timer.function = ssd253x_ts_timer;
  757. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  758. printk(" ssd253x_ts_probe: timer_init OK!\n");
  759. #endif
  760. }
  761. #ifdef CONFIG_HAS_EARLYSUSPEND
  762. ssl_priv->early_suspend.suspend = ssd253x_ts_early_suspend;
  763. ssl_priv->early_suspend.resume = ssd253x_ts_late_resume;
  764. ssl_priv->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN+1;
  765. register_early_suspend(&ssl_priv->early_suspend);
  766. #endif
  767. return 0;
  768. err2: input_unregister_device(ssl_input);
  769. err1: input_free_device(ssl_input);
  770. kfree(ssl_priv);
  771. err0: dev_set_drvdata(&client->dev, NULL);
  772. return error;
  773. }
  774. static int ssd253x_ts_open(struct input_dev *dev)
  775. {
  776. struct ssl_ts_priv *ssl_priv = input_get_drvdata(dev);
  777. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  778. printk("+-----------------------------------------+\n");
  779. printk("| ssd253x_ts_open! |\n");
  780. printk("+-----------------------------------------+\n");
  781. #endif
  782. deviceResume(ssl_priv->client);
  783. if(ssl_priv->use_irq) enable_irq(ssl_priv->irq);
  784. else hrtimer_start(&ssl_priv->timer, ktime_set(1, 0), HRTIMER_MODE_REL);
  785. return 0;
  786. }
  787. static void ssd253x_ts_close(struct input_dev *dev)
  788. {
  789. struct ssl_ts_priv *ssl_priv = input_get_drvdata(dev);
  790. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  791. printk("+-----------------------------------------+\n");
  792. printk("| ssd253x_ts_close! |\n");
  793. printk("+-----------------------------------------+\n");
  794. #endif
  795. deviceSuspend(ssl_priv->client);
  796. ssd253x_timer_flag = 0;
  797. if((ssl_priv->use_irq==0)||(ssl_priv->use_irq==2)) hrtimer_cancel(&ssl_priv->timer);
  798. if((ssl_priv->use_irq==1)||(ssl_priv->use_irq==2)) disable_irq(ssl_priv->irq);
  799. }
  800. static int ssd253x_ts_resume(struct i2c_client *client)
  801. {
  802. struct ssl_ts_priv *ssl_priv = dev_get_drvdata(&client->dev);
  803. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  804. printk("+-----------------------------------------+\n");
  805. printk("| ssd253x_ts_resume! |\n");
  806. printk("+-----------------------------------------+\n");
  807. #endif
  808. deviceResume(client);
  809. ssd253x_timer_flag = 0;
  810. if(ssl_priv->use_irq) enable_irq(ssl_priv->irq);
  811. else hrtimer_start(&ssl_priv->timer, ktime_set(1, 0), HRTIMER_MODE_REL);
  812. return 0;
  813. }
  814. static int ssd253x_ts_suspend(struct i2c_client *client, pm_message_t mesg)
  815. {
  816. struct ssl_ts_priv *ssl_priv = dev_get_drvdata(&client->dev);
  817. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  818. printk("+-----------------------------------------+\n");
  819. printk("| ssd253x_ts_suspend! |\n");
  820. printk("+-----------------------------------------+\n");
  821. #endif
  822. deviceSuspend(client);
  823. if((ssl_priv->use_irq==0)||(ssl_priv->use_irq==2)) hrtimer_cancel(&ssl_priv->timer);
  824. if((ssl_priv->use_irq==1)||(ssl_priv->use_irq==2)) disable_irq(ssl_priv->irq);
  825. return 0;
  826. }
  827. #ifdef CONFIG_HAS_EARLYSUSPEND
  828. static void ssd253x_ts_late_resume(struct early_suspend *h)
  829. {
  830. struct ssl_ts_priv *ssl_priv = container_of(h, struct ssl_ts_priv, early_suspend);
  831. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  832. printk("+-----------------------------------------+\n");
  833. printk("| ssd253x_ts_late_resume! |\n");
  834. printk("+-----------------------------------------+\n");
  835. #endif
  836. ssd253x_ts_resume(ssl_priv->client);
  837. }
  838. static void ssd253x_ts_early_suspend(struct early_suspend *h)
  839. {
  840. struct ssl_ts_priv *ssl_priv = container_of(h, struct ssl_ts_priv, early_suspend);
  841. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  842. printk("+-----------------------------------------+\n");
  843. printk("| ssd253x_ts_early_suspend! |\n");
  844. printk("+-----------------------------------------+\n");
  845. #endif
  846. ssd253x_ts_suspend(ssl_priv->client, PMSG_SUSPEND);
  847. }
  848. #endif
  849. static int ssd253x_ts_remove(struct i2c_client *client)
  850. {
  851. struct ssl_ts_priv *ssl_priv = dev_get_drvdata(&client->dev);
  852. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  853. printk("+-----------------------------------------+\n");
  854. printk("| ssd253x_ts_remove ! |\n");
  855. printk("+-----------------------------------------+\n");
  856. #endif
  857. if((ssl_priv->use_irq==0)||(ssl_priv->use_irq==2)) hrtimer_cancel(&ssl_priv->timer);
  858. if((ssl_priv->use_irq==1)||(ssl_priv->use_irq==2)) free_irq(ssl_priv->irq, ssl_priv);// free_irq()°´Æ½Ì¨Êµ¼ÊÇé¿öʹÓûòdisable
  859. input_unregister_device(ssl_priv->input);
  860. input_free_device(ssl_priv->input);
  861. kfree(ssl_priv);
  862. dev_set_drvdata(&client->dev, NULL);
  863. return 0;
  864. }
  865. static irqreturn_t ssd253x_ts_isr(int irq, void *dev_id)
  866. {
  867. struct ssl_ts_priv *ssl_priv = dev_id;
  868. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  869. printk("+-----------------------------------------+\n");
  870. printk("| ssd253x_ts_isr! |\n");
  871. printk("+-----------------------------------------+\n");
  872. #endif
  873. disable_irq_nosync(ssl_priv->irq);
  874. queue_work(ssd253x_wq, &ssl_priv->ssl_work);
  875. if(ssl_priv->use_irq==2) enable_irq(ssl_priv->irq);
  876. return IRQ_HANDLED;
  877. }
  878. static enum hrtimer_restart ssd253x_ts_timer(struct hrtimer *timer)
  879. {
  880. struct ssl_ts_priv *ssl_priv = container_of(timer, struct ssl_ts_priv, timer);
  881. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  882. printk("+-----------------------------------------+\n");
  883. printk("| ssd253x_ts_timer! |\n");
  884. printk("+-----------------------------------------+\n");
  885. #endif
  886. queue_work(ssd253x_wq, &ssl_priv->ssl_work);
  887. if(ssl_priv->use_irq==0) hrtimer_start(&ssl_priv->timer, ktime_set(0, MicroTimeTInterupt), HRTIMER_MODE_REL);
  888. return HRTIMER_NORESTART;
  889. }
  890. static const struct i2c_device_id ssd253x_ts_id[] = {
  891. //{ "ssd253x-ts", 0 },
  892. { "ssd2533", 0 },
  893. { }
  894. };
  895. MODULE_DEVICE_TABLE(i2c, ssd253x_ts_id);
  896. static struct i2c_driver ssd253x_ts_driver = {
  897. .driver = {
  898. //.name = "ssd253x-ts",
  899. .name = "ssd2533",
  900. },
  901. .probe = ssd253x_ts_probe,
  902. .remove = ssd253x_ts_remove,
  903. #ifndef CONFIG_HAS_EARLYSUSPEND
  904. .suspend = ssd253x_ts_suspend,
  905. .resume = ssd253x_ts_resume,
  906. #endif
  907. .id_table = ssd253x_ts_id,
  908. };
  909. static int ssd_init(void)
  910. {
  911. printk("%s \n", __func__);
  912. #if 1
  913. gpio_direction_output(GPIO_INT, 0);
  914. mdelay(5);
  915. //gpio_d23
  916. gpio_direction_output(GPIO_POWER_EN, 0);
  917. mdelay(1);
  918. gpio_direction_output(GPIO_POWER_EN, 1);
  919. mdelay(10);
  920. gpio_direction_output(GPIO_RST, 1);
  921. mdelay(10);
  922. gpio_direction_output(GPIO_RST, 0);
  923. mdelay(10);
  924. gpio_direction_output(GPIO_RST, 1);
  925. mdelay(40);
  926. #endif
  927. }
  928. static char banner[] __initdata = KERN_INFO "SSL Touchscreen driver, (c) 2011 Solomon Systech Ltd.\n";
  929. static int __init ssd253x_ts_init(void)
  930. {
  931. int ret;
  932. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  933. printk("+-----------------------------------------+\n");
  934. printk("| SSL_ts_init! |\n");
  935. printk("+-----------------------------------------+\n");
  936. #endif
  937. ssd_init();
  938. printk(banner);
  939. ssd253x_wq = create_singlethread_workqueue("ssd253x_wq");
  940. if (!ssd253x_wq)
  941. {
  942. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  943. printk(" ssd253x_ts_init: create_singlethread_workqueue Error!\n");
  944. #endif
  945. return -ENOMEM;
  946. }
  947. else
  948. {
  949. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  950. printk(" ssd253x_ts_init: create_singlethread_workqueue OK!\n");
  951. #endif
  952. }
  953. ret=i2c_add_driver(&ssd253x_ts_driver);
  954. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  955. if(ret) printk(" ssd253x_ts_init: i2c_add_driver Error! \n");
  956. else printk(" ssd253x_ts_init: i2c_add_driver OK! \n");
  957. #endif
  958. return ret;
  959. }
  960. static void __exit ssd253x_ts_exit(void)
  961. {
  962. #ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG
  963. printk("+-----------------------------------------+\n");
  964. printk("| ssd253x_ts_exit! |\n");
  965. printk("+-----------------------------------------+\n");
  966. #endif
  967. i2c_del_driver(&ssd253x_ts_driver);
  968. if (ssd253x_wq) destroy_workqueue(ssd253x_wq);
  969. }
  970. module_init(ssd253x_ts_init);
  971. module_exit(ssd253x_ts_exit);
  972. MODULE_AUTHOR("Solomon Systech Ltd - Design Technology, Icarus Choi");
  973. MODULE_LICENSE("GPL v2");
  974. MODULE_DESCRIPTION("ssd253x Touchscreen Driver 1.3");