PageRenderTime 60ms CodeModel.GetById 16ms RepoModel.GetById 5ms app.codeStats 0ms

/drivers/input/touchscreen/ntrig.c

https://bitbucket.org/p2pjack/ucxl
C | 2452 lines | 2155 code | 265 blank | 32 comment | 402 complexity | bb4f4b3ed9eab66239ad07a4ba4eb3ae MD5 | raw file
Possible License(s): AGPL-1.0, GPL-2.0, LGPL-2.0
  1. /* drivers/input/touchscreen/ntrig.c - NTRIG G3.5 Touch driver
  2. *
  3. * Copyright (C) 2010-2011 HTC Corporation.
  4. *
  5. * This software is licensed under the terms of the GNU General Public
  6. * License version 2, as published by the Free Software Foundation, and
  7. * may be copied, distributed, and modified under those terms.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. */
  15. #include <linux/version.h>
  16. #include <linux/kernel.h>
  17. #include <linux/module.h>
  18. #include <linux/init.h>
  19. #include <linux/delay.h>
  20. #include <linux/proc_fs.h>
  21. #include <linux/platform_device.h>
  22. #include <linux/input.h>
  23. #include <linux/interrupt.h>
  24. #include <linux/gpio.h>
  25. #include <linux/earlysuspend.h>
  26. #include <mach/vreg.h>
  27. #include <asm/mach-types.h>
  28. #include <linux/ntrig.h>
  29. #include <linux/ntrig_fw.h>
  30. #include <linux/spi/spi.h>
  31. #include <linux/stat.h>
  32. #include <linux/earlysuspend.h>
  33. #include <asm/uaccess.h>
  34. #include <linux/miscdevice.h>
  35. #include <linux/workqueue.h>
  36. #include <linux/hrtimer.h>
  37. #include <linux/mutex.h>
  38. #include <linux/wait.h>
  39. #include <linux/sched.h>
  40. #if 0
  41. #define SPIBUF(buf) do { \
  42. int q; \
  43. for (q = 0; q < 8; q++) \
  44. pr_info("[ts]%.2x %.2x %.2x %.2x\\%.2x %.2x %.2x %.2x\\%.2x %.2x %.2x %.2x\\%.2x %.2x %.2x %.2x\\%.2x",\
  45. buf[0+17*q], buf[1+17*q], buf[2+17*q], buf[3+17*q], buf[4+17*q], buf[5+17*q], buf[6+17*q], \
  46. buf[7+17*q], buf[8+17*q], buf[9+17*q], buf[10+17*q], buf[11+17*q], buf[12+17*q], buf[13+17*q], \
  47. buf[14+17*q], buf[15+17*q], buf[16+17*q]); } while (0)
  48. #endif
  49. #define SPIBUF(buf) {}
  50. #define ESDSEQ 3000
  51. #define POWERONSEQ 320
  52. #define ESDEXECUTE 25000
  53. #define USBDISABLE_DELAY 20000
  54. #define ABS_MT_TRACKING_ID_MAX 10
  55. static bool aLive, fUsboff, fPalmRej;
  56. static bool fTSLogFlag = false;
  57. static short CalState;
  58. char spiAnalyRx[NTRIG_PACKET_SIZE], spiRxbuf[NTRIG_PACKET_SIZE];
  59. static const char NTRIGNAME[] = "Ntrig";
  60. static short anpidx;
  61. static int TSLog, count_isr_from_resume, cResetESD, gFingerMap[ABS_MT_TRACKING_ID_MAX];
  62. static int event_google_enable = 1;
  63. u32 g_lastcht = 0, g_missRep = 0;
  64. static uint32_t ntg_fwver;
  65. static DEFINE_MUTEX(ntg_spi_transfer_lock);
  66. #ifdef COUNTER_DEBUG
  67. unsigned char byte_muti_tp[MTM_REPORT_SIZE+1+4] = {0};
  68. #else
  69. unsigned char byte_muti_tp[MTM_REPORT_SIZE+1] = {0};
  70. #endif
  71. struct ntg_tsData {
  72. struct input_dev *input_dev;
  73. struct input_dev *input_devP;
  74. struct spi_device *spiDev;
  75. struct workqueue_struct *ntg_wq;
  76. struct work_struct ntg_work;
  77. struct ntg_touch_event *touchEvnt;
  78. uint16_t abs_x_min;
  79. uint16_t abs_x_max;
  80. uint16_t abs_y_min;
  81. uint16_t abs_y_max;
  82. uint16_t fwtwozero;
  83. uint8_t orientate;
  84. uint8_t abs_pressure_min;
  85. uint8_t abs_pressure_max;
  86. uint8_t abs_width_min;
  87. uint8_t abs_width_max;
  88. int spi_enable;
  89. int irq_gpio;
  90. int (*power)(int on);
  91. bool esdFlag;
  92. wait_queue_head_t get_data_wq;
  93. wait_queue_head_t send_data_wq;
  94. int get_data;
  95. int send_lib;
  96. atomic_t data_ok_agent;
  97. atomic_t info_send_agent;
  98. atomic_t start_agent;
  99. struct early_suspend early_suspend;
  100. struct workqueue_struct *ntg_wq_esd;
  101. struct delayed_work ntg_work_esd;
  102. struct workqueue_struct *ntg_wq_usb_disable;
  103. struct delayed_work ntg_work_usb_disable;
  104. struct workqueue_struct *ntg_wq_resume;
  105. struct delayed_work ntg_work_resume;
  106. };
  107. static struct ntg_tsData *private_ts;
  108. struct ntg_AnalyData {
  109. unsigned short fn;
  110. unsigned short han;
  111. unsigned short van;
  112. unsigned short fnId;
  113. unsigned short phyfrq;
  114. unsigned char *map;
  115. struct ntg_AnaPen pen;
  116. };
  117. static struct ntg_AnalyData *mapData;
  118. static int ntg_spi_transfer(struct ntg_tsData *, char *);
  119. #ifdef CONFIG_HAS_EARLYSUSPEND
  120. static void ntrig_ts_early_suspend(struct early_suspend *h);
  121. static void ntrig_ts_late_resume(struct early_suspend *h);
  122. #endif
  123. extern int board_mfg_mode(void);
  124. static char data_agent[DEBUG_ANGENT_ALL_REPORT_SIZE];
  125. struct ntg_debug_agent_uart g_data_uart;
  126. static DECLARE_WAIT_QUEUE_HEAD(data_ready_agent_wq);
  127. static DECLARE_WAIT_QUEUE_HEAD(data_send_agent_wq);
  128. static ssize_t spiDuplex_Lock(struct spi_device *dev, char *txbuf,
  129. char *rxbuf, size_t len)
  130. {
  131. struct spi_msg msg;
  132. int err = 0;
  133. if (!dev)
  134. return 0;
  135. msg.data = (u8 *)txbuf;
  136. if (TSLog & Dbg_L9) {
  137. pr_info("[ts]Txbuf\n");
  138. SPIBUF(txbuf);
  139. }
  140. err = spi_read_write_lock(dev, &msg, rxbuf, len, 2);
  141. if (err < 0)
  142. printk(KERN_ERR "%s: failed (error %d)\n", __func__, err);
  143. return err;
  144. }
  145. static int ntg_checksumCal(unsigned char *PacketData, u16 PackLen)
  146. {
  147. int sum = 0, i;
  148. for (i = 0; i < PackLen; i++)
  149. sum += PacketData[i];
  150. sum = 0 - sum;
  151. return sum;
  152. }
  153. static void ntg_usb_powoff(struct ntg_tsData *ntg)
  154. {
  155. short i;
  156. char spiUsbTx[NTRIG_PACKET_SIZE];
  157. for (i = 0; i < 4 && fUsboff == false; i++) {
  158. pr_info("[tp]usb_powoff (%d)\n", i+1);
  159. memset(spiUsbTx, 0xAA, NTRIG_PACKET_SIZE);
  160. memcpy(spiUsbTx, ntgFW_usbDis, sizeof(ntgFW_usbDis));
  161. ntg_spi_transfer(ntg, spiUsbTx);
  162. msleep(150);
  163. }
  164. }
  165. static void ntg_palmRejOff(struct ntg_tsData *ntg)
  166. {
  167. short i;
  168. char spiPalmTx[NTRIG_PACKET_SIZE];
  169. memset(spiPalmTx, 0xAA, NTRIG_PACKET_SIZE);
  170. if ((uint16_t)ntg_fwver >= ntg->fwtwozero) {
  171. memcpy(spiPalmTx, ntgFW_palmrejoff2, sizeof(ntgFW_palmrejoff2));
  172. } else {
  173. memcpy(spiPalmTx, ntgFW_palmrejoff, sizeof(ntgFW_palmrejoff));
  174. }
  175. for (i = 0; i < 4 && fPalmRej == false; i++) {
  176. pr_info("[tp]palm_rejoff (%d)\n", i+1);
  177. ntg_spi_transfer(ntg, spiPalmTx);
  178. msleep(150);
  179. }
  180. }
  181. static void ntg_usb_disable_mechanism(struct work_struct *work)
  182. {
  183. struct ntg_tsData *ntg;
  184. ntg = container_of(work, struct ntg_tsData, ntg_work_usb_disable.work);
  185. pr_info("[tp]%s: enter\n", __func__);
  186. ntg_usb_powoff(ntg);
  187. ntg_palmRejOff(ntg);
  188. }
  189. static void ntg_alive_mechanism(struct work_struct *work)
  190. {
  191. short i;
  192. struct ntg_tsData *ntg;
  193. char spiTxEbuf[NTRIG_PACKET_SIZE];
  194. ntg = container_of(work, struct ntg_tsData, ntg_work_esd.work);
  195. memset(spiTxEbuf, 0xAA, NTRIG_PACKET_SIZE);
  196. for (i = 0; i < 3; i++) {
  197. memcpy(spiTxEbuf, &ntgFW_getfw, sizeof(ntgFW_getfw));
  198. ntg_spi_transfer(ntg, spiTxEbuf);
  199. msleep(50*(i+1));
  200. if (TSLog & (Dbg_L9 | Dbg_L2))
  201. pr_err("[E-ts(%d)] AlIVE=%d\n", i, aLive);
  202. if (aLive) {
  203. cResetESD = 0;
  204. if (!fTSLogFlag)
  205. TSLog = 0;
  206. break;
  207. }
  208. }
  209. if (!aLive) {
  210. cResetESD++;
  211. if ((!fTSLogFlag) && (cResetESD == 3))
  212. TSLog = 0;
  213. if ((cResetESD == 13) && (!fTSLogFlag))
  214. TSLog = 0;
  215. fUsboff = false;
  216. fPalmRej = false;
  217. pr_err("[ts]ESD reset\n");
  218. disable_irq(ntg->spiDev->irq);
  219. ntg->power(0);
  220. msleep(15);
  221. ntg->power(1);
  222. msleep(350);
  223. gpio_set_value(ntg->spi_enable, 1);
  224. enable_irq(ntg->spiDev->irq);
  225. ntg_usb_powoff(ntg);
  226. ntg_palmRejOff(ntg);
  227. }
  228. aLive = false;
  229. queue_delayed_work(ntg->ntg_wq_esd, &ntg->ntg_work_esd, msecs_to_jiffies(ESDSEQ));
  230. }
  231. static bool analy_init(void)
  232. {
  233. struct ntg_tsData *ts;
  234. char spiTxbuf[NTRIG_PACKET_SIZE], spiRxbuf[NTRIG_PACKET_SIZE];
  235. ts = private_ts;
  236. pr_info("[ts]%s\n", __func__);
  237. if (mapData == NULL || (mapData->fn == 0))
  238. mapData = kzalloc(sizeof(struct ntg_AnalyData), GFP_KERNEL);
  239. else
  240. pr_info("[ts]Already allocate mapData!!\n");
  241. memset(spiTxbuf, 0xAA, NTRIG_PACKET_SIZE);
  242. memset(spiRxbuf, 0x00, NTRIG_PACKET_SIZE);
  243. ntgFW_map[9] = 0x17;
  244. ntgFW_map[17] = 0x0F;
  245. ntgFW_map[21] = ANA_SEN_CONF;
  246. ntgFW_map[sizeof(ntgFW_map)-3] = ntg_checksumCal(&ntgFW_map[14], 14);
  247. memcpy(spiTxbuf, ntgFW_map, sizeof(ntgFW_map)-2);
  248. spiDuplex_Lock(ts->spiDev, spiTxbuf, spiRxbuf, NTRIG_PACKET_SIZE);
  249. msleep(500);
  250. if (mapData->map == NULL)
  251. mapData->map = kzalloc(mapData->han*mapData->van*sizeof(unsigned char *), GFP_KERNEL);
  252. pr_info("[ts_anaConf]Fn=%d, HAN=%d, VAN=%d\n", mapData->fn, mapData->han, mapData->van);
  253. return true;
  254. }
  255. static bool analy_opfreq(void)
  256. {
  257. int err;
  258. struct ntg_tsData *ts;
  259. char spiTxbuf[NTRIG_PACKET_SIZE], spiRxbuf[NTRIG_PACKET_SIZE];
  260. ts = private_ts;
  261. memset(spiTxbuf, 0xAA, NTRIG_PACKET_SIZE);
  262. memset(spiRxbuf, 0x00, NTRIG_PACKET_SIZE);
  263. if (mapData == NULL)
  264. mapData = kzalloc(sizeof(struct ntg_AnalyData), GFP_KERNEL);
  265. else if (mapData != NULL)
  266. pr_info("[ts_ana]Already allocat mapData!!\n");
  267. pr_info("[ts]%s\n", __func__);
  268. ntgFW_setting[21] = CMD_OPERATE_FREQ;
  269. ntgFW_setting[sizeof(ntgFW_setting)-1] = ntg_checksumCal(&ntgFW_setting[14], 14);
  270. memcpy(spiTxbuf, ntgFW_setting, sizeof(ntgFW_setting));
  271. mapData->fnId = 0;
  272. mapData->phyfrq = 0;
  273. err = spiDuplex_Lock(ts->spiDev , spiTxbuf, spiRxbuf,
  274. sizeof(char)*NTRIG_PACKET_SIZE);
  275. msleep(500);
  276. pr_info("[ts_ana]FreqID=%d, Freq=%d\n", mapData->fnId, mapData->phyfrq*10);
  277. return true;
  278. }
  279. static bool analy_base(short map)
  280. {
  281. short i;
  282. struct ntg_tsData *ts;
  283. char spiTxbuf[NTRIG_PACKET_SIZE], spiRxbuf[NTRIG_PACKET_SIZE];
  284. ts = private_ts;
  285. if (mapData == NULL) {
  286. pr_info("[ts_ana]Execute cat anaConf First!!\n");
  287. return false;
  288. }
  289. anpidx = 0;
  290. memset(spiTxbuf, 0xAA, NTRIG_PACKET_SIZE);
  291. memset(spiRxbuf, 0x00, NTRIG_PACKET_SIZE);
  292. ntgFW_map[9] = 0x1F;
  293. ntgFW_map[17] = 0x11;
  294. ntgFW_map[21] = ANA_GET_BASEMAP;
  295. switch (map) {
  296. case 1:
  297. ntgFW_map[28] = 1;
  298. memset((char *)mapData->map, mapData->han * mapData->van, 0);
  299. break;
  300. case 2:
  301. ntgFW_map[28] = 2;
  302. memset((char *)mapData->map, mapData->han * mapData->van, 0);
  303. break;
  304. case 3:
  305. ntgFW_map[28] = 3;
  306. memset((char *)mapData->map, mapData->han * mapData->van, 0);
  307. break;
  308. case 4:
  309. ntgFW_map[28] = 4;
  310. memset((char *)mapData->map, mapData->han * mapData->van, 0);
  311. break;
  312. }
  313. for (i = 1; i <= mapData->han; i++) {
  314. ntgFW_map[29] = i;
  315. ntgFW_map[sizeof(ntgFW_map)-1] = ntg_checksumCal(&ntgFW_map[14], 16);
  316. memcpy(spiTxbuf, ntgFW_map , sizeof(ntgFW_map));
  317. spiDuplex_Lock(ts->spiDev, spiTxbuf, spiRxbuf, NTRIG_PACKET_SIZE);
  318. msleep(30);
  319. }
  320. if (anpidx != mapData->han) {
  321. pr_info("[ts_ana]Base map(%d) Reply channel Error!!\n", map);
  322. return false;
  323. } else
  324. pr_info("[ts_ana]Base map(%d) OK\n", map);
  325. return true;
  326. }
  327. static bool analy_active(void)
  328. {
  329. short i;
  330. struct ntg_tsData *ts;
  331. char spiTxbuf[NTRIG_PACKET_SIZE], spiRxbuf[NTRIG_PACKET_SIZE];
  332. ts = private_ts;
  333. memset(spiTxbuf, 0xAA, NTRIG_PACKET_SIZE);
  334. memset(spiRxbuf, 0x00, NTRIG_PACKET_SIZE);
  335. if (mapData == NULL) {
  336. pr_info("[ts_ana]Execute cat anaConf First!!\n");
  337. return false;
  338. }
  339. pr_info("[ts]%s\n", __func__);
  340. anpidx = 0;
  341. ntgFW_map[9] = 0x1E;
  342. ntgFW_map[17] = 0x10;
  343. ntgFW_map[21] = ANA_GET_ACTMAP;
  344. memset((char *)mapData->map, mapData->han * mapData->van, 0);
  345. for (i = 1; i <= mapData->han; i++) {
  346. ntgFW_map[28] = i;
  347. ntgFW_map[sizeof(ntgFW_map)-2] = ntg_checksumCal(&ntgFW_map[14], 15);
  348. memcpy(spiTxbuf, ntgFW_map , sizeof(ntgFW_map)-1);
  349. spiDuplex_Lock(ts->spiDev, spiTxbuf, spiRxbuf, NTRIG_PACKET_SIZE);
  350. msleep(30);
  351. }
  352. if (anpidx != mapData->han) {
  353. pr_info("[ts_ana]Reply channel Error!!\n");
  354. return false;
  355. } else
  356. pr_info("[ts_ana]Actmap OK\n");
  357. return true;
  358. }
  359. static bool analy_finger(void)
  360. {
  361. short i;
  362. struct ntg_tsData *ts;
  363. char spiTxbuf[NTRIG_PACKET_SIZE], spiRxbuf[NTRIG_PACKET_SIZE];
  364. ts = private_ts;
  365. memset(spiTxbuf, 0xAA, NTRIG_PACKET_SIZE);
  366. memset(spiRxbuf, 0x00, NTRIG_PACKET_SIZE);
  367. if (mapData == NULL) {
  368. pr_info("[ts_ana]Execute cat anaConf First!!\n");
  369. return false;
  370. }
  371. pr_info("[ts]%s\n", __func__);
  372. anpidx = 0;
  373. ntgFW_map[9] = 0x1E;
  374. ntgFW_map[17] = 0x10;
  375. ntgFW_map[21] = ANA_GET_FINMAP;
  376. memset((char *)mapData->map, mapData->han * mapData->van, 0);
  377. for (i = 1; i <= mapData->han; i++) {
  378. ntgFW_map[28] = i;
  379. ntgFW_map[sizeof(ntgFW_map)-2] = ntg_checksumCal(&ntgFW_map[14], 15);
  380. memcpy(spiTxbuf, ntgFW_map , sizeof(ntgFW_map)-1);
  381. spiDuplex_Lock(ts->spiDev, spiTxbuf, spiRxbuf, NTRIG_PACKET_SIZE);
  382. msleep(30);
  383. }
  384. if (anpidx != mapData->han) {
  385. pr_info("[ts_ana]Reply channel Error!!\n");
  386. return false;
  387. } else
  388. pr_info("[ts_ana]Finger Map OK\n");
  389. return true;
  390. }
  391. static bool analy_pen(void)
  392. {
  393. struct ntg_tsData *ts;
  394. char spiTxbuf[NTRIG_PACKET_SIZE], spiRxbuf[NTRIG_PACKET_SIZE];
  395. ts = private_ts;
  396. memset(spiTxbuf, 0xAA, NTRIG_PACKET_SIZE);
  397. memset(spiRxbuf, 0x00, NTRIG_PACKET_SIZE);
  398. if (mapData == NULL) {
  399. pr_info("[ts_ana]Execute cat anaConf First!!\n");
  400. return false;
  401. }
  402. pr_info("[ts]%s\n", __func__);
  403. ntgFW_map[9] = 0x1D;
  404. ntgFW_map[17] = 0x0F;
  405. ntgFW_map[21] = ANA_GET_PEN;
  406. ntgFW_map[sizeof(ntgFW_map)-3] = ntg_checksumCal(&ntgFW_map[14], 14);
  407. memcpy(spiTxbuf, ntgFW_map, sizeof(ntgFW_map)-2);
  408. spiDuplex_Lock(ts->spiDev, spiTxbuf, spiRxbuf, NTRIG_PACKET_SIZE);
  409. memset(&mapData->pen, 0, sizeof(struct ntg_AnaPen));
  410. msleep(500);
  411. pr_info("[ts_ana]PenState:%d,Th:%d,Mag:%d,Pressure:%d,X:%d,Y:%d,Btn:%d\n",
  412. mapData->pen.pState, mapData->pen.pTh, mapData->pen.mag,
  413. mapData->pen.pPress, mapData->pen.posX, mapData->pen.posY,
  414. mapData->pen.pBtn);
  415. return true;
  416. }
  417. static long ntrig_analy_ioctl(struct file *file, unsigned int cmd,
  418. unsigned long arg)
  419. {
  420. char buf[100];
  421. int err = 0;
  422. long ret = 0;
  423. unsigned long size = 0;
  424. void __user *argp = (void __user *)arg;
  425. if (_IOC_TYPE(cmd) != ANALY_IOC_MAGIC)
  426. return -ENOTTY;
  427. if (_IOC_NR(cmd) > ANALY_MAXNR)
  428. return -ENOTTY;
  429. if (_IOC_DIR(cmd) & _IOC_READ)
  430. err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
  431. else if (_IOC_DIR(cmd) & _IOC_WRITE)
  432. err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
  433. if (err)
  434. return -EFAULT;
  435. memset(buf, 0, 100);
  436. switch (cmd) {
  437. case ANALY_INIT:
  438. if (analy_init()) {
  439. sprintf(buf, "Fn=%d, HAN=%d, VAN=%d\n",
  440. mapData->fn, mapData->han, mapData->van);
  441. size = copy_to_user(argp, &buf, sizeof(buf));
  442. }
  443. break;
  444. case ANALY_BASE1:
  445. if (analy_base(1))
  446. size = copy_to_user(argp, mapData->map, mapData->han*mapData->van);
  447. break;
  448. case ANALY_BASE2:
  449. if (analy_base(2))
  450. size = copy_to_user(argp, mapData->map, mapData->han*mapData->van);
  451. break;
  452. case ANALY_BASE3:
  453. if (analy_base(3))
  454. size = copy_to_user(argp, mapData->map, mapData->han*mapData->van);
  455. break;
  456. case ANALY_BASE4:
  457. if (analy_base(4))
  458. size = copy_to_user(argp, mapData->map, mapData->han*mapData->van);
  459. break;
  460. case ANALY_OPFREQ:
  461. if (analy_opfreq()) {
  462. sprintf(buf, "FreqID=%d, Freq=%d\n", mapData->fnId, mapData->phyfrq*10);
  463. size = copy_to_user(argp, &buf, sizeof(buf));
  464. }
  465. break;
  466. case ANALY_ACTIVE:
  467. if (analy_active())
  468. size = copy_to_user(argp, mapData->map, mapData->han*mapData->van);
  469. break;
  470. case ANALY_FINGER:
  471. if (analy_finger())
  472. size = copy_to_user(argp, mapData->map, mapData->han*mapData->van);
  473. break;
  474. case ANALY_PEN:
  475. if (analy_pen()) {
  476. sprintf(buf + ret, "PenState:%d,Th:%d,Mag:%d,Pressure:%d,X:%d,Y:%d,Btn:%d\n",
  477. mapData->pen.pState, mapData->pen.pTh, mapData->pen.mag,
  478. mapData->pen.pPress, mapData->pen.posX, mapData->pen.posY,
  479. mapData->pen.pBtn);
  480. size = copy_to_user(argp, &buf, sizeof(buf));
  481. }
  482. break;
  483. }
  484. if (size)
  485. pr_info("[ts]analysis ioctl copy_to_user Error (%ld)", size);
  486. return 0;
  487. }
  488. static int ntrig_analy_open(struct inode *inode, struct file *file)
  489. {
  490. return nonseekable_open(inode, file);
  491. }
  492. static int ntrig_analy_release(struct inode *inode, struct file *file)
  493. {
  494. return 0;
  495. }
  496. static struct file_operations ntrig_analy_fops = {
  497. .owner = THIS_MODULE,
  498. .open = ntrig_analy_open,
  499. .release = ntrig_analy_release,
  500. .unlocked_ioctl = ntrig_analy_ioctl,
  501. };
  502. static struct miscdevice ntrig_map_device = {
  503. .minor = MISC_DYNAMIC_MINOR,
  504. .name = "ntrig_analysis",
  505. .fops = &ntrig_analy_fops,
  506. };
  507. static ssize_t stop_esdwq(struct device *dev, struct device_attribute *attr, char *buf)
  508. {
  509. ssize_t ret;
  510. struct ntg_tsData *ts;
  511. ts = private_ts;
  512. if (!cancel_delayed_work_sync(&ts->ntg_work_esd)) {
  513. cancel_delayed_work(&ts->ntg_work_esd);
  514. }
  515. sprintf(buf, "Destory ESD delayworkqueue\n");
  516. ret = strlen(buf) + 1;
  517. return ret;
  518. }
  519. DEVICE_ATTR(stopesd, 0444, stop_esdwq, NULL);
  520. static void ntg_powSeq_machanism(struct work_struct *work)
  521. {
  522. struct ntg_tsData *ts;
  523. ts = container_of(work, struct ntg_tsData, ntg_work_resume.work);
  524. pr_info("[tp]%s\n", __func__);
  525. gpio_set_value(ts->spi_enable, 1);
  526. enable_irq(ts->spiDev->irq);
  527. ntg_usb_powoff(ts);
  528. ntg_palmRejOff(ts);
  529. }
  530. static ssize_t touch_vendor_show(struct device *dev, struct device_attribute *attr, char *buf)
  531. {
  532. ssize_t ret = 0;
  533. short err = 0;
  534. struct ntg_tsData *ts;
  535. char spiTxbuf[NTRIG_PACKET_SIZE], spiRxbuf[NTRIG_PACKET_SIZE];
  536. if (ntg_fwver) {
  537. sprintf(buf, "%s_%#x\n", NTRIGNAME, ntg_fwver);
  538. ntg_fwver = 0x00;
  539. ret = strlen(buf) + 1;
  540. } else {
  541. ts = private_ts;
  542. pr_info("[ts]%s\n", __func__);
  543. memset(spiTxbuf, 0xAA, NTRIG_PACKET_SIZE);
  544. memset(spiRxbuf, 0x00, NTRIG_PACKET_SIZE);
  545. memcpy(spiTxbuf, ntgFW_getfw, sizeof(ntgFW_getfw));
  546. err = spiDuplex_Lock(ts->spiDev, spiTxbuf, spiRxbuf,
  547. sizeof(char)*NTRIG_PACKET_SIZE);
  548. msleep(1500);
  549. sprintf(buf, "%s_%#x\n", NTRIGNAME, ntg_fwver);
  550. ret = strlen(buf) + 1;
  551. }
  552. return ret;
  553. }
  554. DEVICE_ATTR(vendor, 0444, touch_vendor_show, NULL);
  555. static ssize_t ts_setting(struct device *dev, struct device_attribute *attr, char *buf)
  556. {
  557. int ret, err;
  558. struct ntg_tsData *ts;
  559. char spiTxbuf[NTRIG_PACKET_SIZE], spiRxbuf[NTRIG_PACKET_SIZE];
  560. ts = private_ts;
  561. memset(spiTxbuf, 0xAA, NTRIG_PACKET_SIZE);
  562. memset(spiRxbuf, 0x00, NTRIG_PACKET_SIZE);
  563. ntgFW_setting[21] = 0x08;
  564. ntgFW_setting[sizeof(ntgFW_setting)-1] = ntg_checksumCal(&ntgFW_setting[14], 14);
  565. memcpy(spiTxbuf, ntgFW_setting, sizeof(ntgFW_setting));
  566. err = spiDuplex_Lock(ts->spiDev , spiTxbuf, spiRxbuf,
  567. sizeof(char)*NTRIG_PACKET_SIZE);
  568. sprintf(buf, "0x00:DPSM OFF\n0x01:single\n0x02:multi\
  569. \n\r0x03:Palm Rejection On\n0x04:Palm Rejection Off\
  570. \n\r0x05:3D Active\n0x06:3D inactive\n0x20:Pen only\
  571. \n\r0x30:NO pen, No touch\n");
  572. ret = strlen(buf) + 1;
  573. return ret;
  574. }
  575. static ssize_t ts_switch(struct device *dev, struct device_attribute *attr,
  576. const char *buf, size_t count)
  577. {
  578. int ret = 0, mode;
  579. struct ntg_tsData *ts;
  580. char spiTxbuf[NTRIG_PACKET_SIZE], spiRxbuf[NTRIG_PACKET_SIZE];
  581. ts = private_ts;
  582. mode = simple_strtoul(buf, NULL, 10);
  583. memset(spiTxbuf, 0xAA, NTRIG_PACKET_SIZE);
  584. memset(spiRxbuf, 0x00, NTRIG_PACKET_SIZE);
  585. switch (mode) {
  586. case 0x00:/*DPSM off*/
  587. ntgFW_mode[28] = 0x02;
  588. ntgFW_mode[29] = 0x00;
  589. break;
  590. case 0x01:/*single*/
  591. ntgFW_mode[28] = 0x01;
  592. ntgFW_mode[29] = 0x0A;
  593. break;
  594. case 0x02:/*multi*/
  595. ntgFW_mode[28] = 0x02;
  596. ntgFW_mode[29] = 0x0A;
  597. break;
  598. case 0x03:/*Plam Rejection On*/
  599. ntgFW_mode[28] = 0x02;
  600. ntgFW_mode[29] = 0x0A;
  601. ntgFW_mode[31] = 0x01;
  602. break;
  603. case 0x04:/*Plam Rejection Off*/
  604. ntgFW_mode[28] = 0x02;
  605. ntgFW_mode[29] = 0x0A;
  606. ntgFW_mode[31] = 0x00;
  607. break;
  608. case 0x05:/*3D Active*/
  609. ntgFW_mode[28] = 0x02;
  610. ntgFW_mode[29] = 0x0A;
  611. ntgFW_mode[32] = 0x01;
  612. break;
  613. case 0x06:/*3D inactive*/
  614. ntgFW_mode[28] = 0x02;
  615. ntgFW_mode[29] = 0x0A;
  616. ntgFW_mode[32] = 0x00;
  617. break;
  618. case 0x30:/*No pen ,NO touch*/
  619. ntgFW_mode[28] = 0x30;
  620. ntgFW_mode[29] = 0x0A;
  621. break;
  622. case 0x20:/*Pen only*/
  623. ntgFW_mode[28] = 0x20;
  624. ntgFW_mode[29] = 0x0A;
  625. break;
  626. }
  627. if ((uint16_t)ntg_fwver >= ts->fwtwozero) {
  628. ntgFW_mode[sizeof(ntgFW_mode)-1] = ntg_checksumCal(&ntgFW_mode[14], 21);
  629. memcpy(spiTxbuf, ntgFW_mode, sizeof(ntgFW_mode));
  630. } else {
  631. ntgFW_mode[9] = 0x1A;
  632. ntgFW_mode[17] = 0x14;
  633. ntgFW_mode[sizeof(ntgFW_mode)-3] = ntg_checksumCal(&ntgFW_mode[14], 19);
  634. memcpy(spiTxbuf, ntgFW_mode, (sizeof(ntgFW_mode)-2));
  635. }
  636. ret = spiDuplex_Lock(ts->spiDev , spiTxbuf, spiRxbuf,
  637. sizeof(char)*NTRIG_PACKET_SIZE);
  638. ret = strlen(buf);
  639. return count;
  640. }
  641. DEVICE_ATTR(mode, 0644, ts_setting, ts_switch);
  642. static ssize_t ts_algget(struct device *dev, struct device_attribute *attr, char *buf)
  643. {
  644. int ret, err;
  645. struct ntg_tsData *ts;
  646. char spiTxbuf[NTRIG_PACKET_SIZE], spiRxbuf[NTRIG_PACKET_SIZE];
  647. ts = private_ts;
  648. memset(spiTxbuf, 0xAA, NTRIG_PACKET_SIZE);
  649. memset(spiRxbuf, 0x00, NTRIG_PACKET_SIZE);
  650. ntgFW_setting[21] = 0x0F;
  651. ntgFW_setting[sizeof(ntgFW_setting)-1] = ntg_checksumCal(&ntgFW_setting[14], 14);
  652. memcpy(spiTxbuf, ntgFW_setting, sizeof(ntgFW_setting));
  653. err = spiDuplex_Lock(ts->spiDev , spiTxbuf, spiRxbuf,
  654. sizeof(char)*NTRIG_PACKET_SIZE);
  655. sprintf(buf, "[ts]Algo Control get\
  656. \n\r0x00:OTFC Disalbe\n\r0x01:OTFC Enable\
  657. \r0x10:FH auto\n\r0x11:FH mode 1\n\
  658. \r0x12:FH mode 2\n\r0x13:FH mode 3\n\
  659. \r0x14:FH mode 4\n");
  660. ret = strlen(buf);
  661. return ret;
  662. }
  663. static ssize_t ts_otfc(struct device *dev, struct device_attribute *attr,
  664. const char *buf, size_t count)
  665. {
  666. int ret = 0, mode;
  667. struct ntg_tsData *ts;
  668. char spiTxbuf[NTRIG_PACKET_SIZE], spiRxbuf[NTRIG_PACKET_SIZE];
  669. ts = private_ts;
  670. /* mode = simple_strtoul(buf, NULL, 10);*/
  671. mode = strict_strtoul(buf, 10, NULL);
  672. memset(spiTxbuf, 0xAA, NTRIG_PACKET_SIZE);
  673. memset(spiRxbuf, 0x00, NTRIG_PACKET_SIZE);
  674. switch (mode) {
  675. case 0x01:/*OTFC Enable*/
  676. ntgFW_otfcmode[28] = 0x01;
  677. ntgFW_otfcmode[29] = 0x00;
  678. break;
  679. case 0x00:/*OTFC Disable*/
  680. ntgFW_otfcmode[28] = 0x00;
  681. ntgFW_otfcmode[29] = 0x00;
  682. break;
  683. case 0x10:/*FH auto*/
  684. ntgFW_otfcmode[28] = 0x01;
  685. ntgFW_otfcmode[29] = 0x00;
  686. break;
  687. case 0x11:/*FH 1*/
  688. ntgFW_otfcmode[28] = 0x01;
  689. ntgFW_otfcmode[29] = 0x01;
  690. break;
  691. case 0x12:/*FH 2*/
  692. ntgFW_otfcmode[28] = 0x01;
  693. ntgFW_otfcmode[29] = 0x02;
  694. break;
  695. case 0x13:/*FH 3*/
  696. ntgFW_otfcmode[28] = 0x01;
  697. ntgFW_otfcmode[29] = 0x03;
  698. break;
  699. case 0x14:/*FH 4*/
  700. ntgFW_otfcmode[28] = 0x01;
  701. ntgFW_otfcmode[29] = 0x04;
  702. break;
  703. }
  704. ntgFW_otfcmode[sizeof(ntgFW_otfcmode)-1] = ntg_checksumCal(&ntgFW_otfcmode[14], 24);
  705. memcpy(spiTxbuf, ntgFW_otfcmode, sizeof(ntgFW_otfcmode));
  706. ret = spiDuplex_Lock(ts->spiDev , spiTxbuf, spiRxbuf,
  707. sizeof(char)*NTRIG_PACKET_SIZE);
  708. ret = strlen(buf);
  709. return count;
  710. }
  711. DEVICE_ATTR(OTFC, 0644, ts_algget, ts_otfc);
  712. static ssize_t ts_logen(struct device *dev, struct device_attribute *attr,
  713. const char *buf, size_t count)
  714. {
  715. int buglevel;
  716. buglevel = simple_strtoul(buf, NULL, 10);
  717. // if (buglevel) {
  718. // TSLog = buglevel;
  719. // fTSLogFlag = true;
  720. // } else {
  721. TSLog = 0x00;
  722. fTSLogFlag = false;
  723. // }
  724. pr_info("[ts]log enable = %.2x\n", TSLog);
  725. return count;
  726. }
  727. static ssize_t show_ts_logen(struct device *dev, struct device_attribute *attr, char *buf)
  728. {
  729. int ret = 0;
  730. ret = sprintf(buf, "log enable = %d\n0x00:Flag for ESD log\n0x01:Rx after state machine\
  731. \n\r0x02:Rx Befor state machine\n0x04:For deamon partial log\
  732. \n\r0x08:For DA & x-y cooridate\n0x10:For all deamon log\n0x20:For ESD pulling log\
  733. \n\r0x40:For Deamon Raw data\n0x80:For Pen state\n0x100:For Tx buf\n", TSLog);
  734. ret += 1;
  735. return ret;
  736. }
  737. DEVICE_ATTR(debug_level, 0644, show_ts_logen, ts_logen);
  738. static ssize_t set_event_google(struct device *dev, struct device_attribute *attr,
  739. const char *buf, size_t count)
  740. {
  741. int buglevel;
  742. buglevel = simple_strtoul(buf, NULL, 10);
  743. event_google_enable = buglevel;
  744. pr_info("[ts]event google enable = %d\n", event_google_enable);
  745. return count;
  746. }
  747. static ssize_t show_event_google(struct device *dev, struct device_attribute *attr, char *buf)
  748. {
  749. return sprintf(buf, "event google enable = %d\n", event_google_enable);
  750. }
  751. DEVICE_ATTR(event_google, 0664, show_event_google, set_event_google);
  752. static ssize_t ntg_SetCal(struct device *dev, struct device_attribute *attr, char *buf)
  753. {
  754. int ret, err;
  755. struct ntg_tsData *ts_data;
  756. char spiTxbuf[NTRIG_PACKET_SIZE], spiRxbuf[NTRIG_PACKET_SIZE];
  757. ts_data = private_ts;
  758. if (ts_data->esdFlag)
  759. cancel_delayed_work(&ts_data->ntg_work_esd);
  760. CalState = NTG_CALSTART;
  761. memset(spiTxbuf, 0xAA, NTRIG_PACKET_SIZE);
  762. memcpy(spiTxbuf, &ntgFW_setCal, sizeof(ntgFW_setCal));
  763. memset(spiRxbuf, 0, sizeof(char)*NTRIG_PACKET_SIZE);
  764. pr_info("[ts-SetCal]SetCal test send\n");
  765. err = spiDuplex_Lock(ts_data->spiDev , spiTxbuf, spiRxbuf,
  766. sizeof(char)*NTRIG_PACKET_SIZE);
  767. memset(spiTxbuf, 0xAA, NTRIG_PACKET_SIZE);
  768. mdelay(1500);
  769. while (!CalState) {
  770. memcpy(spiTxbuf, &ntgFW_getCal, sizeof(ntgFW_getCal));
  771. memset(spiRxbuf, 0, sizeof(char)*NTRIG_PACKET_SIZE);
  772. pr_info("[ts-GetCal]Calibrating!!\n");
  773. err = spiDuplex_Lock(ts_data->spiDev, spiTxbuf, spiRxbuf,
  774. NTRIG_PACKET_SIZE);
  775. mdelay(2500);
  776. }
  777. if (CalState == NTG_CALPASS)
  778. ret = sprintf(buf, "Calibration PASS!!\n");
  779. else if (CalState == NTG_CALDEFEAT)
  780. ret = sprintf(buf, "Calibration FAILURE!!\n");
  781. ret = strlen(buf)+1;
  782. if (ts_data->esdFlag)
  783. queue_delayed_work(ts_data->ntg_wq_esd, &ts_data->ntg_work_esd, msecs_to_jiffies(ESDSEQ));
  784. return ret;
  785. }
  786. DEVICE_ATTR(ts_SetCal, 0444, ntg_SetCal, NULL);
  787. static ssize_t ts_gpio(struct device *dev, struct device_attribute *attr, char *buf)
  788. {
  789. int ret = 0;
  790. struct ntg_tsData *ts;
  791. ts = private_ts;
  792. ret = gpio_get_value(ts->irq_gpio);
  793. printk(KERN_DEBUG "GPIO_TP_INT_N=%d\n", ret);
  794. sprintf(buf, "GPIO_TP_INT_N=%d\n", ret);
  795. ret = strlen(buf) + 1;
  796. return ret;
  797. }
  798. DEVICE_ATTR(gpio, 0444, ts_gpio, NULL);
  799. static ssize_t ts_touch(struct device *dev, struct device_attribute *attr,
  800. const char *buf, size_t count)
  801. {
  802. int ret = 0, mode;
  803. struct ntg_tsData *ts;
  804. char spiTxbuf[NTRIG_PACKET_SIZE], spiRxbuf[NTRIG_PACKET_SIZE];
  805. ts = private_ts;
  806. mode = simple_strtoul(buf, NULL, 10);
  807. memset(spiTxbuf, 0xAA, NTRIG_PACKET_SIZE);
  808. memset(spiRxbuf, 0x00, NTRIG_PACKET_SIZE);
  809. switch (mode) {
  810. case 0x01:/*Touch Enable*/
  811. ntgFW_ctltouch[16] = 0x0F;
  812. break;
  813. case 0x00:/*Touch Disable*/
  814. ntgFW_ctltouch[16] = 0x14;
  815. break;
  816. }
  817. memcpy(spiTxbuf, ntgFW_ctltouch, sizeof(ntgFW_ctltouch));
  818. ret = spiDuplex_Lock(ts->spiDev , spiTxbuf, spiRxbuf,
  819. sizeof(char)*NTRIG_PACKET_SIZE);
  820. ret = strlen(buf);
  821. return count;
  822. }
  823. DEVICE_ATTR(touch, 0644, NULL, ts_touch);
  824. static ssize_t opfreq(struct device *dev, struct device_attribute *attr, char *buf)
  825. {
  826. int ret = 0;
  827. if (analy_opfreq())
  828. ret = sprintf(buf, "FreqID=%d, Freq=%d\n", mapData->fnId, mapData->phyfrq*10);
  829. else
  830. ret = sprintf(buf, "Fetch Frequency Data FAILURE\n");
  831. return ret;
  832. }
  833. DEVICE_ATTR(opfreq, 0444, opfreq, NULL);
  834. static struct kobject *android_touch_kobj;
  835. static int ntrig_touch_sysfs_init(void)
  836. {
  837. int ret;
  838. android_touch_kobj = kobject_create_and_add("android_touch", NULL);
  839. if (android_touch_kobj == NULL) {
  840. pr_err("[tp_ntg_err]subsystem_register_failed\n");
  841. ret = -ENOMEM;
  842. return ret;
  843. }
  844. ret = sysfs_create_file(android_touch_kobj, &dev_attr_ts_SetCal.attr);
  845. if (ret) {
  846. pr_err("[tp_ntg_err]sysfs_create_file failed\n");
  847. return ret;
  848. }
  849. ret = sysfs_create_file(android_touch_kobj, &dev_attr_gpio.attr);
  850. if (ret) {
  851. pr_err("[tp_ntg_err]sysfs_create_file failed\n");
  852. return ret;
  853. }
  854. ret = sysfs_create_file(android_touch_kobj, &dev_attr_debug_level.attr);
  855. if (ret) {
  856. pr_err("[tp_ntg_err]sysfs_create_file failed\n");
  857. return ret;
  858. }
  859. ret = sysfs_create_file(android_touch_kobj, &dev_attr_mode.attr);
  860. if (ret) {
  861. pr_err("[tp_ntg_err]sysfs_create_file failed\n");
  862. return ret;
  863. }
  864. ret = sysfs_create_file(android_touch_kobj, &dev_attr_event_google.attr);
  865. if (ret) {
  866. pr_err("[tp_ntg_err]sysfs_create_file failed\n");
  867. return ret;
  868. }
  869. ret = sysfs_create_file(android_touch_kobj, &dev_attr_vendor.attr);
  870. if (ret) {
  871. pr_err("[tp_ntg_err]sysfs_create_file failed\n");
  872. return ret;
  873. }
  874. ret = sysfs_create_file(android_touch_kobj, &dev_attr_stopesd.attr);
  875. if (ret) {
  876. pr_err("[tp_ntg_err]sysfs_create_file failed\n");
  877. return ret;
  878. }
  879. ret = sysfs_create_file(android_touch_kobj, &dev_attr_OTFC.attr);
  880. if (ret) {
  881. pr_err("[tp_ntg_err]sysfs_create_file failed\n");
  882. return ret;
  883. }
  884. ret = sysfs_create_file(android_touch_kobj, &dev_attr_touch.attr);
  885. if (ret) {
  886. pr_err("[tp_ntg_err]sysfs_create_file failed\n");
  887. return ret;
  888. }
  889. ret = sysfs_create_file(android_touch_kobj, &dev_attr_opfreq.attr);
  890. if (ret) {
  891. pr_err("[tp_ntg_err]sysfs_create_file failed\n");
  892. return ret;
  893. }
  894. return 0;
  895. }
  896. static void ntrig_touch_sysfs_remove(void)
  897. {
  898. sysfs_remove_file(android_touch_kobj, &dev_attr_ts_SetCal.attr);
  899. sysfs_remove_file(android_touch_kobj, &dev_attr_debug_level.attr);
  900. sysfs_remove_file(android_touch_kobj, &dev_attr_gpio.attr);
  901. sysfs_remove_file(android_touch_kobj, &dev_attr_mode.attr);
  902. sysfs_remove_file(android_touch_kobj, &dev_attr_event_google.attr);
  903. sysfs_remove_file(android_touch_kobj, &dev_attr_vendor.attr);
  904. sysfs_remove_file(android_touch_kobj, &dev_attr_stopesd.attr);
  905. sysfs_remove_file(android_touch_kobj, &dev_attr_OTFC.attr);
  906. sysfs_remove_file(android_touch_kobj, &dev_attr_touch.attr);
  907. sysfs_remove_file(android_touch_kobj, &dev_attr_opfreq.attr);
  908. kobject_del(android_touch_kobj);
  909. }
  910. static u32 CalcCheck_agentsum(unsigned char *PacketData, u16 PackLen)
  911. {
  912. int i;
  913. u32 sum = 0;
  914. for (i = 0 ; i < PackLen; i++)
  915. sum += PacketData[i];
  916. return sum;
  917. }
  918. static int ntrig_debug_agent_reset(struct ntg_tsData *ntg)
  919. {
  920. memset(&g_data_uart, 0x00, sizeof(struct ntg_debug_agent_uart));
  921. return 0;
  922. }
  923. static void ntrig_debug_agent_fragment(struct ntg_tsData *ntg)
  924. {
  925. char preamble[] = {0xA5, 0x5A, 0xE7, 0x7E};
  926. u32 c_sum, i;
  927. memset(&data_agent[0], 0xff, 4);
  928. memcpy(&data_agent[4], &preamble[0], 4);
  929. data_agent[8] = g_data_uart.header.type;
  930. data_agent[9] = (g_data_uart.header.length & 0xff);
  931. data_agent[10] = (g_data_uart.header.length & 0xff00) >> 8;
  932. data_agent[11] = g_data_uart.header.flag;
  933. data_agent[12] = g_data_uart.header.channel;
  934. data_agent[13] = g_data_uart.header.function;
  935. memcpy(&data_agent[14], &g_data_uart.data, g_data_uart.header.length - 6);
  936. c_sum = CalcCheck_agentsum((unsigned char *)&data_agent[8], g_data_uart.header.length);
  937. data_agent[g_data_uart.header.length + 8] = (c_sum & 0xff);
  938. data_agent[g_data_uart.header.length + 9] = (c_sum & 0xff00) >> 8;
  939. data_agent[g_data_uart.header.length + 10] = (c_sum & 0xff0000) >> 16;
  940. data_agent[g_data_uart.header.length + 11] = (c_sum & 0xff000000) >> 24;
  941. if (TSLog & Dbg_L4) {
  942. pr_info("ntrig agent [from agent] c_sum = 0x%.4x, length 0x%.2x\n",
  943. c_sum, g_data_uart.header.length);
  944. pr_info("ntrig agent [from agent] 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x\n",
  945. data_agent[0], data_agent[1], data_agent[2], data_agent[3],
  946. data_agent[4], data_agent[5], data_agent[6], data_agent[7]);
  947. pr_info("ntrig agent [from agent] 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x\n",
  948. data_agent[8], data_agent[9], data_agent[10], data_agent[11],
  949. data_agent[12], data_agent[13]);
  950. for (i = 0; i < (g_data_uart.header.length - 6 + 4)/8; i++) {
  951. pr_info("ntrig agent %d[from agent] %.2x %.2x %.2x %.2x\\%.2x %.2x %.2x %.2x\n",
  952. i+1, data_agent[14+0+i*8], data_agent[14+1+i*8],
  953. data_agent[14+2+i*8], data_agent[14+3+i*8], data_agent[14+4+i*8], data_agent[14+5+i*8],
  954. data_agent[14+6+i*8], data_agent[14+7+i*8]);
  955. }
  956. for (i = 0; i < ((g_data_uart.header.length - 6 + 4)%8); i++) {
  957. pr_info("ntrig agent [from agent]the last %d byte => 0x%.2x,\n",
  958. 14+1+i+8 + (((g_data_uart.header.length - 6 + 4)/8) - 1)*8,
  959. data_agent[14+i+8+(((g_data_uart.header.length - 6 + 4)/8) - 1)*8]);
  960. }
  961. }
  962. atomic_set(&ntg->data_ok_agent, 1);
  963. wake_up_interruptible(&data_ready_agent_wq);
  964. if (TSLog & Dbg_L4)
  965. pr_info("ntrig [ts]%s: wait_event data_send_agent_wq\n", __func__);
  966. wait_event_interruptible(data_send_agent_wq, atomic_read(&ntg->info_send_agent));
  967. atomic_set(&ntg->info_send_agent, 0);
  968. if (TSLog & Dbg_L4)
  969. pr_info("ntrig [ts]%s: wait_event ok\n", __func__);
  970. memset(&data_agent, 0x00, DEBUG_ANGENT_ALL_REPORT_SIZE);
  971. ntrig_debug_agent_reset(ntg);
  972. /*atomic_set(&ntg->start_agent, 0);*/
  973. }
  974. static int ntrig_debug_agent_copy(struct ntg_tsData *ntg, char *buf, int index)
  975. {
  976. int i;
  977. g_data_uart.header = ntg->touchEvnt->header;
  978. memcpy(&g_data_uart.data[index],
  979. &buf[10],
  980. ntg->touchEvnt->header.length - 6);
  981. if (TSLog & Dbg_L4) {
  982. pr_info("ntrig agent [spi]type 0x%x, length 0x%x, flag 0x%x, channel 0x%x, function 0x%x\n",
  983. g_data_uart.header.type, g_data_uart.header.length,
  984. g_data_uart.header.flag, g_data_uart.header.channel,
  985. g_data_uart.header.function);
  986. for (i = 0; i < ((ntg->touchEvnt->header.length - 6)/8); i++) {
  987. pr_info("ntrig agent [spi] %.2x %.2x %.2x %.2x\\%.2x %.2x %.2x %.2x\n",
  988. g_data_uart.data[index+0+i*8], g_data_uart.data[index+1+i*8],
  989. g_data_uart.data[index+2+i*8], g_data_uart.data[index+3+i*8],
  990. g_data_uart.data[index+4+i*8], g_data_uart.data[index+5+i*8],
  991. g_data_uart.data[index+6+i*8], g_data_uart.data[index+7+i*8]);
  992. }
  993. for (i = 0; i < ((ntg->touchEvnt->header.length - 6)%8); i++) {
  994. pr_info("ntrig agent [spi]the last %d byte => 0x%.2x,\n",
  995. 1 + i + 8 + (((ntg->touchEvnt->header.length - 6)/8) - 1)*8,
  996. g_data_uart.data[index + 1 + i + 7 + (((ntg->touchEvnt->header.length - 6)/8) - 1)*8]);
  997. }
  998. }
  999. return 0;
  1000. }
  1001. static int ntrig_debug_agent_parser(struct ntg_tsData *ntg, char *buf)
  1002. {
  1003. static int pre_flag, data_uart_length;
  1004. struct ntg_touch_header temp_header;
  1005. if (atomic_read(&ntg->start_agent) == 0) {
  1006. return 0;
  1007. }
  1008. temp_header = ntg->touchEvnt->header;
  1009. if (temp_header.flag > 0xf || temp_header.flag < 0x0) {
  1010. pr_info("ntrig [ts]%s: err flag 0x%x\n", __func__, temp_header.flag);
  1011. ntrig_debug_agent_reset(ntg);
  1012. pre_flag = 0;
  1013. data_uart_length = 0;
  1014. return -1;
  1015. }
  1016. if (temp_header.channel == 0x30) {
  1017. if (temp_header.flag == 0 && pre_flag == 0) {/*only one packet*/
  1018. ntrig_debug_agent_copy(ntg, buf, 0);
  1019. ntrig_debug_agent_fragment(ntg);
  1020. pre_flag = 0;
  1021. data_uart_length = 0;
  1022. } else {
  1023. if (pre_flag == 0 || (temp_header.flag >= 0 &&/*check flag*/
  1024. (pre_flag == (temp_header.flag+1)) &&
  1025. (temp_header.function ==/*check function*/
  1026. g_data_uart.header.function))) {
  1027. ntrig_debug_agent_copy(ntg, buf, data_uart_length);
  1028. data_uart_length = data_uart_length + (temp_header.length - 6);
  1029. pre_flag = temp_header.flag;
  1030. if (temp_header.flag == 0) {
  1031. g_data_uart.header.length = data_uart_length + 6; /*add type ~func*/
  1032. ntrig_debug_agent_fragment(ntg);
  1033. pre_flag = 0;
  1034. data_uart_length = 0;
  1035. }
  1036. } else {
  1037. pr_info("ntrig [ts]%s: err flag 0x%x, pre_flag 0x%x, function 0x%x, pre function 0x%x\n",
  1038. __func__, temp_header.flag, pre_flag, temp_header.function ,
  1039. g_data_uart.header.function);
  1040. ntrig_debug_agent_reset(ntg);
  1041. pre_flag = 0;
  1042. data_uart_length = 0;
  1043. return -2;
  1044. }
  1045. }
  1046. }
  1047. return 0;
  1048. }
  1049. static int ntg_parser_agent_usbcmd(struct ntg_tsData *ntg, char* usbRxbuf)
  1050. {
  1051. short DataLen, nIdx_pre = 0;
  1052. static int status, index_next;
  1053. static char tempusbTx[NTRIG_PACKET_SIZE];
  1054. int ret = 0, loop_i = 0;
  1055. char usbAnalyTx[NTRIG_PACKET_SIZE], tempRxbuf[NTRIG_PACKET_SIZE];
  1056. if (status == CHK5A) {
  1057. for (loop_i = 0; loop_i < NTRIG_PACKET_SIZE; loop_i++) {
  1058. if (usbRxbuf[loop_i] == 0xA5) {
  1059. nIdx_pre = loop_i;
  1060. if (TSLog & Dbg_L4)
  1061. pr_info("[ts]CHK5A-for-loop, loop_i = %d\n", loop_i);
  1062. break;
  1063. }
  1064. if (loop_i == NTRIG_PACKET_SIZE - 1) {
  1065. if (TSLog & Dbg_L4)
  1066. pr_info("[ts]CHK5A-for-loop,no pre, loop_i = %d\n", loop_i);
  1067. return 0;
  1068. }
  1069. }
  1070. }
  1071. memcpy((char *)&DataLen, (usbRxbuf + nIdx_pre + 4 + 1), 2);
  1072. memcpy(tempusbTx, (usbRxbuf + nIdx_pre), DataLen+4);
  1073. memset(usbAnalyTx, 0xFF, sizeof(char)*NTRIG_PACKET_SIZE);
  1074. memcpy(&usbAnalyTx[4], tempusbTx, DataLen+4);
  1075. if (TSLog & Dbg_L4) {
  1076. pr_info("[ntrig agent form usb]%s, data length 0x%x\n", __func__, DataLen);
  1077. SPIBUF(usbAnalyTx);
  1078. }
  1079. memset(tempRxbuf, 0x00, sizeof(char)*NTRIG_PACKET_SIZE);
  1080. atomic_set(&ntg->start_agent, 1);
  1081. ntg_spi_transfer(ntg, usbAnalyTx);
  1082. memset(tempusbTx, 0x00, sizeof(char)*NTRIG_PACKET_SIZE);
  1083. status = CHK5A;
  1084. index_next = 0;
  1085. return ret;
  1086. }
  1087. static ssize_t ntrig_agent_read(struct file *file,
  1088. char __user *buf, size_t count, loff_t *pos)
  1089. {
  1090. unsigned long size;
  1091. struct ntg_tsData *ntg;
  1092. size_t length_report;
  1093. static size_t remain_report_len;
  1094. int start_report;
  1095. ntg = private_ts;
  1096. if (remain_report_len == 0) {
  1097. wait_event_interruptible(data_ready_agent_wq, atomic_read(&ntg->data_ok_agent));
  1098. if ((g_data_uart.header.length + 8 + 4) > DEBUG_ANGENT_REPORT_SIZE) {
  1099. length_report = DEBUG_ANGENT_REPORT_SIZE;
  1100. remain_report_len = (g_data_uart.header.length + 8 + 4) - DEBUG_ANGENT_REPORT_SIZE;
  1101. } else {
  1102. length_report = (g_data_uart.header.length + 8 + 4);
  1103. remain_report_len = 0;
  1104. }
  1105. start_report = 0;
  1106. } else {
  1107. length_report = remain_report_len;
  1108. start_report = DEBUG_ANGENT_REPORT_SIZE;
  1109. remain_report_len = 0;
  1110. }
  1111. if (TSLog & Dbg_L4)
  1112. pr_info(" %s start,report length %#x, all length %#x\n",
  1113. __func__, length_report, (g_data_uart.header.length + 8 + 4));
  1114. size = copy_to_user(buf, &data_agent[start_report], length_report);
  1115. if (size) {
  1116. pr_info(" %s copy_to_user err\n", __func__);
  1117. }
  1118. atomic_set(&ntg->data_ok_agent, 0);
  1119. if (remain_report_len == 0) {
  1120. atomic_set(&ntg->info_send_agent, 1);
  1121. wake_up_interruptible(&data_send_agent_wq);
  1122. }
  1123. if (TSLog & Dbg_L4)
  1124. pr_info(" %s end\n", __func__);
  1125. return length_report;
  1126. }
  1127. static ssize_t ntrig_agent_write(struct file *file,
  1128. const char __user *buf, size_t count, loff_t *pos)
  1129. {
  1130. char data_form_usb[NTRIG_PACKET_SIZE];
  1131. int i;
  1132. unsigned long size;
  1133. struct ntg_tsData *ts_data;
  1134. ts_data = private_ts;
  1135. if (count > NTRIG_PACKET_SIZE) {
  1136. printk(KERN_ERR "%s: Err :command length %d > %d or < 5\n",
  1137. __func__, count, NTRIG_PACKET_SIZE);
  1138. return count;
  1139. }
  1140. memset(data_form_usb, 0xFF, sizeof(char)*NTRIG_PACKET_SIZE);
  1141. if (TSLog & Dbg_L4)
  1142. printk(KERN_INFO "%s: send agent command length, count %d\n", __func__, count);
  1143. size = copy_from_user(data_form_usb, buf, count);
  1144. if (TSLog & Dbg_L4)
  1145. for (i = 0; i < NTRIG_PACKET_SIZE/8; i++) {
  1146. pr_info("ntrig agent %d[cmd from usb] %.2x %.2x %.2x %.2x\\%.2x %.2x %.2x %.2x\n",
  1147. i+1, data_form_usb[0+i*8], data_form_usb[1+i*8], data_form_usb[2+i*8],
  1148. data_form_usb[3+i*8], data_form_usb[4+i*8], data_form_usb[5+i*8],
  1149. data_form_usb[6+i*8], data_form_usb[7+i*8]);
  1150. }
  1151. ntg_parser_agent_usbcmd(ts_data, data_form_usb);
  1152. return count;
  1153. }
  1154. static int ntrig_agent_open(struct inode *inode, struct file *file)
  1155. {
  1156. return nonseekable_open(inode, file);
  1157. }
  1158. static int ntrig_agent_release(struct inode *inode, struct file *file)
  1159. {
  1160. return 0;
  1161. }
  1162. static const struct file_operations ntrig_agent_fops = {
  1163. .read = ntrig_agent_read,
  1164. .write = ntrig_agent_write,
  1165. .open = ntrig_agent_open,
  1166. .release = ntrig_agent_release,
  1167. };
  1168. static struct miscdevice ntrigi_miscdev = {
  1169. .name = "ttyntrig-debug",
  1170. .fops = &ntrig_agent_fops,
  1171. .minor = MISC_DYNAMIC_MINOR,
  1172. };
  1173. static void ntg_orientate(short orien, unsigned short *posX, unsigned short *posY)
  1174. {
  1175. u16 switchTmp = 0;
  1176. struct ntg_tsData *ts_data;
  1177. ts_data = private_ts;
  1178. if (orien & 0x01) {
  1179. switchTmp = *posX;
  1180. *posX = *posY;
  1181. *posY = switchTmp;
  1182. }
  1183. if (orien & 0x02) {
  1184. (*posX) = ts_data->abs_x_max - (*posX);
  1185. }
  1186. if (orien & 0x04) {
  1187. (*posY) = ts_data->abs_y_max - (*posY);
  1188. }
  1189. }
  1190. static void compatible_tp_report(struct input_dev *idev, void *event, int index, bool finger, bool ontip)
  1191. {
  1192. if (!ontip) {
  1193. input_report_abs(idev, ABS_MT_TOUCH_MAJOR, 0x00);
  1194. input_report_abs(idev, ABS_MT_PRESSURE, 0x00);
  1195. } else {
  1196. if (finger) {
  1197. NtrTrackedFinger *touch = (NtrTrackedFinger *)event;
  1198. input_report_abs(idev, ABS_MT_TRACKING_ID, index);
  1199. input_report_abs(idev, ABS_MT_PRESSURE, 0xFF);
  1200. input_report_abs(idev, ABS_MT_TOUCH_MAJOR, 0x28);
  1201. input_report_abs(idev, ABS_MT_WIDTH_MAJOR,
  1202. (touch->posDx + touch->posDy)/140);
  1203. input_report_abs(idev, ABS_MT_POSITION_X, touch->posX);
  1204. input_report_abs(idev, ABS_MT_POSITION_Y, touch->posY);
  1205. } else {
  1206. struct ntg_touch_Stouch *touch = (struct ntg_touch_Stouch *)event;
  1207. input_report_abs(idev, ABS_MT_TRACKING_ID, index);
  1208. input_report_abs(idev, ABS_MT_TOUCH_MAJOR, touch->bit);
  1209. input_report_abs(idev, ABS_MT_PRESSURE, touch->bit);
  1210. input_report_abs(idev, ABS_MT_WIDTH_MAJOR, touch->posDx);
  1211. input_report_abs(idev, ABS_MT_POSITION_X, touch->posX);
  1212. input_report_abs(idev, ABS_MT_POSITION_Y, touch->posY);
  1213. }
  1214. }
  1215. input_mt_sync(idev);
  1216. }
  1217. static int ntrig_open(struct inode *inode, struct file *file)
  1218. {
  1219. return nonseekable_open(inode, file);
  1220. }
  1221. static int ntrig_release(struct inode *inode, struct file *file)
  1222. {
  1223. return 0;
  1224. }
  1225. int get_finger_index(int id)
  1226. {
  1227. static int first = 1;
  1228. int i;
  1229. if (first) {
  1230. first = 0;
  1231. for (i = 0; i < ABS_MT_TRACKING_ID_MAX; i++)
  1232. gFingerMap[i] = -1;
  1233. }
  1234. /* search for existing finger */
  1235. for (i = 0; i < ABS_MT_TRACKING_ID_MAX; i++) {
  1236. if (gFingerMap[i] == id)
  1237. return i;
  1238. }
  1239. /* search for place for new finger */
  1240. for (i = 0; i < ABS_MT_TRACKING_ID_MAX; i++) {
  1241. if (gFingerMap[i] < 0) {
  1242. /* found */
  1243. gFingerMap[i] = id;
  1244. return i;
  1245. }
  1246. }
  1247. /* new finger, and all places are in use (should not happen) */
  1248. return -1;
  1249. }
  1250. void ntrig_send_multi_touch_to_android(struct input_dev *input,
  1251. NtrTrackedFingersReport *multi_touch, short orien)
  1252. {
  1253. int i = 0, index;
  1254. int fingers_num = multi_touch->FingerCount;
  1255. NtrTrackedFinger *fingers = multi_touch->Fingers;
  1256. if (!input)
  1257. return;
  1258. for (i = 0; i < fingers_num; i++) {
  1259. index = get_finger_index(fingers[i].TrackID);
  1260. if (index < 0)
  1261. continue;
  1262. if (fingers[i].IsRemoved) {
  1263. {
  1264. input_report_abs(input, ABS_MT_TOUCH_MAJOR, 0x00);
  1265. input_report_abs(input, ABS_MT_PRESSURE, 0x00);
  1266. }
  1267. } else {
  1268. if (TSLog & Dbg_L5) {
  1269. pr_info("NTRIG #finger%d,[Id:%d][X:Y][%#x,%#x][dX:dY][%d,%d][Palm:%d][Removed:%d]htc:dzdw=%#x, posi=%x\n",
  1270. i+1, fingers[i].TrackID, fingers[i].posX, (int)fingers[i].posY,
  1271. (int)fingers[i].posDx, fingers[i].posDy,
  1272. (int)fingers[i].IsPalm, (int)fingers[i].IsRemoved,
  1273. (0x28 << 16) | ((fingers[i].posDx + fingers[i].posDy)/60),
  1274. (fingers[i].posX << 16 | fingers[i].posY));
  1275. }
  1276. ntg_orientate(orien, &fingers[i].posX, &fingers[i].posY);
  1277. if (TSLog & Dbg_L4) {
  1278. pr_info("[ts] Finger=%d, X=%d, Y=%d\n", i+1, fingers[i].posX, fingers[i].posY);
  1279. }
  1280. compatible_tp_report(input, (void *)&fingers[i], index, true, true);
  1281. }
  1282. }
  1283. input_sync(input);
  1284. if (((1 == fingers_num) && (fingers[0].IsRemoved)) || (0 == fingers_num)) {
  1285. input_report_abs(input, ABS_MT_PRESSURE, 0x00);
  1286. input_report_abs(input, ABS_MT_TOUCH_MAJOR, 0x00);
  1287. input_sync(input);
  1288. if (TSLog & Dbg_L4)
  1289. pr_info("[ts]Finger Leave\n");
  1290. }
  1291. for (i = 0; i < fingers_num; i++) {
  1292. if (0 != fingers[i].IsRemoved) {
  1293. index = get_finger_index(fingers[i].TrackID);
  1294. if (index >= 0)
  1295. gFingerMap[index] = -1;
  1296. }
  1297. }
  1298. }
  1299. static long ntrig_ioctl(struct file *file, unsigned int cmd,
  1300. unsigned long arg)
  1301. {
  1302. void __user *argp = (void __user *)arg;
  1303. long ret = 0;
  1304. NtrTrackedFingersReport outReport;
  1305. struct ntg_tsData *ntg;
  1306. ntg = private_ts;
  1307. switch (cmd) {
  1308. case NTRIG_IOCTL_READ_DATA:
  1309. ret = wait_event_interruptible(ntg->get_data_wq, ntg->get_data);
  1310. if (ret) {
  1311. pr_err("[ts] get_data = %x\n", ntg->get_data);
  1312. return -EFAULT;
  1313. }
  1314. ntg->get_data = 0;
  1315. if (copy_to_user(argp, &byte_muti_tp, sizeof(byte_muti_tp))) {
  1316. ntg->send_lib = 1;
  1317. wake_up(&ntg->send_data_wq);
  1318. pr_err("%s: copy_to_user error\n", __func__);
  1319. return -EFAULT;
  1320. }
  1321. if (count_isr_from_resume == 2) {/*fisrt report FW ver then mt report after resume*/
  1322. count_isr_from_resume++;
  1323. pr_info("[ntrig MT] IOCTL_READ_DATA, after resume send data to lib: repID = 0x%x, Contact count(1 byte) = 0x%x",
  1324. byte_muti_tp[0], byte_muti_tp[MTM_REPORT_SIZE-1]);
  1325. }
  1326. if (TSLog & Dbg_L3)
  1327. pr_info("[ntrig MT] NTRIG_IOCTL_READ_DATA: repID = 0x%x, Contact count(1 byte) = 0x%x",
  1328. byte_muti_tp[0], byte_muti_tp[MTM_REPORT_SIZE-1]);
  1329. memset(byte_muti_tp, 0x00, MTM_REPORT_SIZE+1);
  1330. ntg->send_lib = 1;
  1331. wake_up(&ntg->send_data_wq);
  1332. break;
  1333. case NTRIG_IOCTL_SEND_DATA:
  1334. if (copy_from_user(&outReport, argp, sizeof(outReport))) {
  1335. pr_err("%s: copy_from_user error\n", __func__);
  1336. return -EFAULT;
  1337. }
  1338. if (TSLog & Dbg_L3)
  1339. pr_info("[NTRIG] FingerCount = %d\n", outReport.FingerCount);
  1340. ntrig_send_multi_touch_to_android(ntg->input_dev, &outReport, ntg->orientate);
  1341. break;
  1342. default:
  1343. break;
  1344. }
  1345. return 0;
  1346. }
  1347. static struct file_operations ntrig_fops = {
  1348. .owner = THIS_MODULE,
  1349. .open = ntrig_open,
  1350. .release = ntrig_release,
  1351. .unlocked_ioctl = ntrig_ioctl,
  1352. };
  1353. static struct miscdevice ntrig_device = {
  1354. .minor = MISC_DYNAMIC_MINOR,
  1355. .name = "ntrig_touch",
  1356. .fops = &ntrig_fops,
  1357. };
  1358. static void touchEventReport(struct ntg_tsData *ntg)
  1359. {
  1360. if (ntg->touchEvnt->header.type == 0x01
  1361. && ntg->touchEvnt->header.channel == 0x02) {
  1362. compatible_tp_report(ntg->input_dev, &ntg->touchEvnt->stouch, 0x00,
  1363. true, (ntg->touchEvnt->stouch.bit & 0x02));
  1364. input_sync(ntg->input_dev);
  1365. } else if (ntg->touchEvnt->header.type == 0x01
  1366. && ntg->touchEvnt->header.channel == 0x03) {
  1367. if (TSLog & Dbg_L8)
  1368. pr_info("[ts_Pen] %d, %d, bit = %d\n", ntg->touchEvnt->ptouch.posX,
  1369. ntg->touchEvnt->ptouch.posY, ntg->touchEvnt->ptouch.bit);
  1370. compatible_tp_report(ntg->input_devP, (struct ntg_touch_Stouch *)&ntg->touchEvnt->ptouch, 0x00, false,
  1371. (ntg->touchEvnt->ptouch.bit & 0x02) || (ntg->touchEvnt->ptouch.bit & 0x4) ||
  1372. (ntg->touchEvnt->ptouch.bit & 0x08) || (ntg->touchEvnt->ptouch.bit & 0x1));
  1373. input_sync(ntg->input_devP);
  1374. }
  1375. memset(ntg->touchEvnt, 0x00, sizeof(struct ntg_touch_event));
  1376. }
  1377. static bool ntg_CheckSum(char *buf, struct ntg_tsData *ntg)
  1378. {
  1379. short i;
  1380. u16 sum = 0, oriSum, length = 0;
  1381. if (atomic_read(&ntg->start_agent))
  1382. return true;
  1383. memcpy((void *)&length, (void *)&buf[1], 2);
  1384. for (i = 0; i < length; i++)
  1385. sum += buf[i];
  1386. memcpy((void *)&oriSum, (void *)&buf[length+4], 2);
  1387. if (sum == oriSum) {
  1388. return true;
  1389. } else {
  1390. pr_info("[ts]c_sum = %.2x, o_Sum = %.2x", sum, oriSum);
  1391. SPIBUF(buf);
  1392. return false;
  1393. }
  1394. }
  1395. static int ntrig_frame_parser(struct ntg_tsData *ntg, char *buf)
  1396. {
  1397. bool fCheckSum = true;
  1398. short anIdx = 0, nIndex = 0, region = 0;
  1399. int i, contact_count, DTime = 0;
  1400. struct ntg_touch_Mtouch *mtouch;
  1401. #ifdef COUNTER_DEBUG
  1402. u32 cnt = 0, cnt_mt = 0;
  1403. #endif
  1404. i = 0;
  1405. if (buf[i] == 0xA5 && buf[i+1] == 0x5A &&
  1406. buf[i+2] == 0xE7 && buf[i+3] == 0x7E) {
  1407. nIndex = i+4;
  1408. if (TSLog & Dbg_L1) {
  1409. pr_info("[ts-Rx]%s\n", __func__);
  1410. SPIBUF(buf);
  1411. }
  1412. memcpy((void *)&ntg->touchEvnt->header, &buf[nIndex], sizeof(struct ntg_touch_header));
  1413. #ifdef COUNTER_DEBUG
  1414. if (ntg->touchEvnt->header.channel == 0x01) {
  1415. memcpy(&cnt, &buf[104], 4);
  1416. if (cnt != 0x00) {
  1417. if ((g_lastcht+1) != cnt) {
  1418. if (cnt != 0xFFFFFFFF)
  1419. g_lastcht = cnt;
  1420. g_missRep++;
  1421. pr_info("ts cnt = %d] counter not match, miss cnt = 0x%.4x\n", cnt, g_missRep);
  1422. SPIBUF(buf);
  1423. }
  1424. if (cnt % 100 == 0) {
  1425. pr_info("[ts cnt = %d ] missRep = %.4x\n", cnt, g_missRep);
  1426. }
  1427. }
  1428. g_lastcht = cnt;
  1429. } else {
  1430. memcpy(&cnt, &buf[104], 4);
  1431. pr_info("[ts cnt = %d] counter , channel = 0x%.4x, type = 0x%.4x\n", cnt, ntg->touchEvnt->header.channel,
  1432. ntg->touchEvnt->header.type);
  1433. }
  1434. #endif
  1435. if (ntg->touchEvnt->header.channel == 0x30) {
  1436. ntrig_debug_agent_parser(ntg, buf);
  1437. } else if (ntg->touchEvnt->header.type == 0x02 || ntg->touchEvnt->header.type == 0x01) {
  1438. switch (ntg->touchEvnt->header.channel) {
  1439. case 0x01:
  1440. #ifdef COUNTER_DEBUG
  1441. memcpy(byte_muti_tp, &buf[nIndex+6], MTM_REPORT_SIZE+4);
  1442. memcpy(&cnt_mt, &byte_muti_tp[MTM_REPORT_SIZE], 4);
  1443. byte_muti_tp[MTM_REPORT_SIZE+4] = TSLog;
  1444. pr_info("[ts_MT] cnt_mt %d for multi tp\n", cnt_mt);
  1445. if (cnt_mt != cnt)
  1446. pr_info("[ts_MT] miss cnt_mt %d for multi tp, cnt %d\n", cnt_mt, cnt);
  1447. #else
  1448. memcpy(byte_muti_tp, &buf[nIndex+6], MTM_REPORT_SIZE);
  1449. byte_muti_tp[MTM_REPORT_SIZE] = TSLog;/*for daemon to enable log*/
  1450. #endif
  1451. fCheckSum = ntg_CheckSum(&buf[nIndex], ntg);
  1452. if (fCheckSum) {
  1453. contact_count = byte_muti_tp[MTM_REPORT_SIZE - 1];
  1454. for (i = 0; i < contact_count; i++) {
  1455. mtouch = (struct ntg_touch_Mtouch *)&(byte_muti_tp[3+sizeof(struct ntg_touch_Mtouch)*i]);
  1456. if (mtouch->bit & 0x10) {
  1457. mtouch->posX = 0;
  1458. mtouch->posY = 0;
  1459. mtouch->posDx = 250;
  1460. mtouch->posDy = 150;
  1461. mtouch->vdefine = 0x0D000B00;
  1462. pr_info("[ts_inPalmRegion] bit = %d, i= %d\n", mtouch->bit, i+1);
  1463. }
  1464. }
  1465. if (TSLog & Dbg_L5) {
  1466. pr_info("[ts_MT]repID = %#x, Report Count= %#x, %#x\n",
  1467. byte_muti_tp[0], byte_muti_tp[1], byte_muti_tp[2]);
  1468. for (i = 0; i < 6; i++) {
  1469. pr_info("[ts_MT]State= %#x,Fgr-idx= %#x,%#x;x= %#x,%#x;y=%#x,%#x;dx=%#x,%#x;dy=%#x,%#x,VDef= %#x,%#x,%#x,%#x\n",
  1470. byte_muti_tp[3+(i*15)], byte_muti_tp[4+(i*15)], byte_muti_tp[5+(i*15)], byte_muti_tp[6+(i*15)],
  1471. byte_muti_tp[7+(i*15)], byte_muti_tp[8+(i*15)], byte_muti_tp[9+(i*15)], byte_muti_tp[10+(i*15)],
  1472. byte_muti_tp[11+(i*15)], byte_muti_tp[12+(i*15)], byte_muti_tp[13+(i*15)], byte_muti_tp[14+(i*15)],
  1473. byte_muti_tp[15+(i*15)], byte_muti_tp[16+(i*15)], byte_muti_tp[17+(i*15)]);
  1474. }
  1475. pr_info("[ts_MT] contact cnt = %d\n", byte_muti_tp[93]);
  1476. i = 0;
  1477. }
  1478. if (TSLog & Dbg_L7) {
  1479. pr_info("[ts_DM]%#x,%#x,%#x\n", byte_muti_tp[0], byte_muti_tp[1], byte_muti_tp[2]);
  1480. for (i = 0; i < 3; i++) {
  1481. pr_info("[ts_DM]%#x,%#x,%#x,%#x,%#x,%#x,%#x,%#x,%#x,%#x,%#x,%#x,%#x,%#x,%#x\n",
  1482. byte_muti_tp[3+(i*15)], byte_muti_tp[4+(i*15)], byte_muti_tp[5+(i*15)], byte_muti_tp[6+(i*15)],
  1483. byte_muti_tp[7+(i*15)], byte_muti_tp[8+(i*15)], byte_muti_tp[9+(i*15)], byte_muti_tp[10+(i*15)],
  1484. byte_muti_tp[11+(i*15)], byte_muti_tp[12+(i*15)], byte_muti_tp[13+(i*15)], byte_muti_tp[14+(i*15)],
  1485. byte_muti_tp[15+(i*15)], byte_muti_tp[16+(i*15)], byte_muti_tp[17+(i*15)]);
  1486. }
  1487. pr_info("[ts_DM]%#x\n", byte_muti_tp[93]);
  1488. i = 0;
  1489. }
  1490. if (count_isr_from_resume == 2)/*fisrt report FW ver then mt report after resume*/
  1491. pr_info("[ts_MT] after resume mt report from FW:Contact count(1 byte) = %d\n", contact_count);
  1492. if (TSLog & Dbg_L3)
  1493. pr_info("[ts_MT] :Contact count(1 byte) = %d\n", contact_count);
  1494. ntg->get_data = 1;
  1495. wake_up(&ntg->get_data_wq);
  1496. wait_event_interruptible_timeout(ntg->send_data_wq, ntg->send_lib, msecs_to_jiffies(5000));
  1497. ntg->send_lib = 0;
  1498. } else
  1499. pr_err("[ts]Mulit-Touch Check sum Error\n");
  1500. break;
  1501. case 0x02:
  1502. memcpy((void *)&ntg->touchEvnt->stouch, &buf[nIndex+6], sizeof(struct ntg_touch_Stouch));
  1503. ntg_orientate(ntg->orientate, &ntg->touchEvnt->stouch.posX, &ntg->touchEvnt->stouch.posY);
  1504. break;
  1505. case 0x03:
  1506. fCheckSum = ntg_CheckSum(&buf[nIndex], ntg);
  1507. if (fCheckSum) {
  1508. memcpy((void *)&ntg->touchEvnt->ptouch, &buf[nIndex+6], sizeof(struct ntg_touch_Ptouch));
  1509. ntg_orientate(ntg->orientate, &ntg->touchEvnt->ptouch.posX, &ntg->touchEvnt->ptouch.posY);
  1510. } else
  1511. pr_err("[ts]Pen Check sum Error\n");
  1512. break;
  1513. case 0x10:
  1514. ntg->touchEvnt->version.repId = buf[nIndex+6];
  1515. switch (ntg->touchEvnt->version.repId) {
  1516. case 0x14:
  1517. pr_info("[ts] touch Disable\n");
  1518. break;
  1519. case 0x0F:
  1520. pr_info("[ts] touch Enable\n");
  1521. break;
  1522. case 0x0C:
  1523. ntg->touchEvnt->version.reserved_0 = buf[nIndex + 7];
  1524. memcpy(&ntg->touchEvnt->version.value, &buf[nIndex + 8], 4);
  1525. memcpy(&ntg_fwver, &ntg->touchEvnt->version.value, 4);
  1526. aLive = true;
  1527. if (TSLog & Dbg_L6)
  1528. pr_info("[ts]ESD=repID:%x,value:%04x\n", ntg->touchEvnt->version.repId, ntg->touchEvnt->version.value);
  1529. break;
  1530. case 0x0B:
  1531. memcpy(&ntg->touchEvnt->version.value, &buf[nIndex + 7], 3);
  1532. printk(KERN_INFO "[ts_parser](Start-Cal)repID:%x,value:%03x\n",
  1533. ntg->touchEvnt->version.repId, (ntg->touchEvnt->version.value & NTG_MASK));
  1534. break;
  1535. case 0x11:
  1536. memcpy(&ntg->touchEvnt->version.value, &buf[nIndex + 7], 3);
  1537. printk(KERN_INFO "[ts_parser](GetCal-ing)repID:%x,value:%#x\n",
  1538. ntg->touchEvnt->version.repId, (ntg->touchEvnt->version.value & NTG_MASK));
  1539. if ((ntg->touchEvnt->version.value & NTG_MASK) == NTG_CAL_FAIL) {
  1540. pr_err("[ts] Calibration FAILURE!!\n");
  1541. CalState = NTG_CALDEFEAT;
  1542. } else if ((ntg->touchEvnt->version.value & NTG_MASK) == NTG_CAL_STATE) {
  1543. pr_info("[ts] Calibration PASS!!\n");
  1544. CalState = NTG_CALPASS;
  1545. }
  1546. break;
  1547. }
  1548. break;
  1549. case 0x20:
  1550. switch (ntg->touchEvnt->header.function) {
  1551. case 0x61:
  1552. if ((buf[nIndex+6] == 0x7E && buf[nIndex+11] == 0x81) ||
  1553. (buf[nIndex+6] == 0x7E && buf[nIndex+11] == 0xC1)) {
  1554. memcpy((void *)&ntg->touchEvnt->DfuStCmd.dfuHeader, &buf[nIndex+6], sizeof(ntg_CmdDfuStart));
  1555. if (ntg->touchEvnt->DfuStCmd.dfuHeader.msgGroup == CMDGroup) {
  1556. switch (ntg->touchEvnt->DfuStCmd.dfuHeader.msgCode) {
  1557. case BOOTLOADER_VERSION:
  1558. pr_info("[ts_BootLoader_Ver]RetCode=%.4lx; BL=%.2x%.2x%.2x%.2x\\%.2x%.2x%.2x%.2x\\%.2x\n", ntg->touchEvnt->DfuStCmd.dfuHeader.returnCode,
  1559. buf[nIndex+26], buf[nIndex+27], buf[nIndex+28], buf[nIndex+29],
  1560. buf[nIndex+30], buf[nIndex+31], buf[nIndex+32], buf[nIndex+33],
  1561. buf[nIndex+34]);
  1562. break;
  1563. case CMD_MSG_CODE_TURNOFF_USB:
  1564. ntg->touchEvnt->DfuStCmd.dfuHeader.returnCode == 0 ?
  1565. pr_info("[ts_USB_OFF]OK!\n") : pr_info("[ts_USB]Still on\n");
  1566. ntg->touchEvnt->DfuStCmd.dfuHeader.returnCode == 0 ?
  1567. (fUsboff = true) : (fUsboff = false);
  1568. break;
  1569. case CMD_CONFIG_FETCH_SETTING:
  1570. if (ntg->touchEvnt->DfuStCmd.dfuHeader.returnCode == 0) {
  1571. memcpy((char *)&DTime, &buf[nIndex+21], 2);
  1572. buf[nIndex+20] == 0x01 ? pr_info("[ts] Single Touch : DPSM time = %d\n", DTime) :
  1573. pr_info("[ts] Multi Touch : DPSM time = %d\n", DTime);
  1574. buf[nIndex+23] == 0x01 ? pr_info("[ts] Palm Rej Sens. ON\n") :
  1575. pr_info("[ts] Palm Rej Sens. OFF\n");
  1576. buf[nIndex+24] == 0x01 ? pr_info("[ts] 3D mode ON\n") :
  1577. pr_info("[ts] 3D mode OFF\n");
  1578. if ((uint16_t)ntg_fwver >= ntg->fwtwozero) {
  1579. memcpy((char *)&region, &buf[nIndex+25], 2);
  1580. pr_info("[ts] Palm Region =%d\n", region);
  1581. }
  1582. } else
  1583. pr_info("[ts] Fetch setting ERROR!!\n");
  1584. break;
  1585. case CMD_CONFIG_SETTING:
  1586. ntg->touchEvnt->DfuStCmd.dfuHeader.returnCode == 0 ?
  1587. pr_info("[tp_Setting]OK!\n") : pr_info("[tp_Setting]Failure!\n");
  1588. ntg->touchEvnt->DfuStCmd.dfuHeader.returnCode == 0 ?
  1589. (fPalmRej = true) : (fPalmRej = false);
  1590. break;
  1591. case CMD_CONFIG_ALGO_FETCH:
  1592. if (ntg->touchEvnt->DfuStCmd.dfuHeader.returnCode == 0) {
  1593. switch (buf[nIndex+20]) {
  1594. case OTFCDisable:
  1595. pr_info("[ts]OTFC = Disable\n");
  1596. break;
  1597. case OTFCEnable:
  1598. pr_info("[ts]OTFC = Enable\n");
  1599. break;
  1600. case OTFCRevert:
  1601. pr_info("[ts]OTFC = Revert\n");
  1602. break;
  1603. };
  1604. if ((uint16_t)ntg_fwver >= ntg->fwtwozero) {
  1605. switch (buf[nIndex+21]) {
  1606. case FHauto:
  1607. pr_info("[ts]FHmode = AUTO\n");
  1608. break;
  1609. case FHmanu:
  1610. pr_info("[ts]FHmode = MANU\n");
  1611. break;
  1612. }
  1613. }
  1614. } else {
  1615. pr_info("[ts] return code = %#lx\n", ntg->touchEvnt->DfuStCmd.dfuHeader.returnCode);
  1616. }
  1617. break;
  1618. case CMD_CONFIG_ALGO_SETTING:
  1619. ntg->touchEvnt->DfuStCmd.dfuHeader.returnCode == 0 ?
  1620. pr_info("[ts_OTFC_set]OK!\n") : pr_info("[ts_OTFC_set]Failure!\n");
  1621. break;
  1622. case CMD_OPERATE_FREQ:
  1623. ntg->touchEvnt->DfuStCmd.dfuHeader.returnCode == 0 ?
  1624. pr_info("[ts_Freq]OK!\n") : pr_info("[ts_Freq]Failure!\n");
  1625. mapData->fnId = buf[nIndex+6+sizeof(ntg_CmdDfuHeader)+2];
  1626. memcpy((char *)&mapData->phyfrq, &buf[nIndex+6+sizeof(ntg_CmdDfuHeader)+3], 2);
  1627. break;
  1628. }
  1629. } else if (ntg->touchEvnt->DfuStCmd.dfuHeader.msgGroup == AnaGroup) {
  1630. if (ntg->touchEvnt->DfuStCmd.dfuHeader.returnCode == 0) {
  1631. switch (ntg->touchEvnt->DfuStCmd.dfuHeader.msgCode) {
  1632. case ANA_GET_SN:
  1633. break;
  1634. case ANA_SEN_CONF:
  1635. mapData->fn = (ntg->touchEvnt->DfuStCmd.startAddress & 0xFF);
  1636. mapData->han = ((ntg->touchEvnt->DfuStCmd.startAddress & 0xFF00) >> 8);
  1637. mapData->van = ((ntg->touchEvnt->DfuStCmd.startAddress & 0xFF0000) >> 16);
  1638. pr_info("[ts_anaConf]Fn=%d, HAN=%d, VAN=%d\n",
  1639. mapData->fn, mapData->han, mapData->van);
  1640. break;
  1641. case ANA_GET_BASEMAP:
  1642. mapData->fnId = buf[nIndex+6+sizeof(ntg_CmdDfuHeader)+2];
  1643. memcpy((char *)&mapData->phyfrq, &buf[nIndex+6+sizeof(ntg_CmdDfuHeader)+3], 2);
  1644. anIdx = buf[nIndex+6+sizeof(ntg_CmdDfuHeader)+5];
  1645. memcpy((char *)(mapData->map+(anIdx-1)*mapData->van),
  1646. &buf[nIndex+6+sizeof(ntg_CmdDfuHeader)+6], mapData->van);
  1647. anpidx++ ;
  1648. pr_info("[ts_BaseMap(%d)]%02d\n", mapData->fnId, anIdx);
  1649. break;
  1650. case ANA_GET_ACTMAP:
  1651. anIdx = buf[nIndex+6+sizeof(ntg_CmdDfuHeader)+2];
  1652. memcpy((char *)(mapData->map+(anIdx-1)*mapData->van),
  1653. &buf[nIndex+6+sizeof(ntg_CmdDfuHeader)+3], mapData->van);
  1654. anpidx++;
  1655. pr_info("[ts_ActiveMap]%02d\n", anIdx);
  1656. break;
  1657. case ANA_GET_FINMAP:
  1658. anIdx = buf[nIndex+6+sizeof(ntg_CmdDfuHeader)+2];
  1659. memcpy((char *)(mapData->map+(anIdx-1)*mapData->van),
  1660. &buf[nIndex+6+sizeof(ntg_CmdDfuHeader)+3], mapData->van);
  1661. anpidx++;
  1662. pr_info("[ts_FingerMap]%02d\n", anIdx);
  1663. break;
  1664. case ANA_GET_PEN:
  1665. memcpy((char *)&mapData->pen, &buf[nIndex+6+sizeof(ntg_CmdDfuHeader)+2],
  1666. sizeof(struct ntg_AnaPen));
  1667. pr_info("[ts_anaPen]\n");
  1668. break;
  1669. }
  1670. } else {
  1671. pr_info("[ts_ana] unexpected failure!!return code=%#4lx\n",
  1672. ntg->touchEvnt->DfuStCmd.dfuHeader.returnCode);
  1673. }
  1674. }
  1675. } else {
  1676. printk(KERN_INFO "[ts_Dfu] protocol error,%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x\n",
  1677. buf[nIndex+6], buf[nIndex+7], buf[nIndex+8], buf[nIndex+9],
  1678. buf[nIndex+10], buf[nIndex+11], buf[nIndex+12], buf[nIndex+13]);
  1679. }
  1680. break;
  1681. }
  1682. break;
  1683. }
  1684. }
  1685. } else {
  1686. return -1;
  1687. }
  1688. memset(buf, 0x00, NTRIG_PACKET_SIZE);
  1689. if (ntg->touchEvnt->header.channel == 0x02 || ntg->touchEvnt->header.channel == 0x03) {
  1690. if (fCheckSum)
  1691. touchEventReport(ntg);
  1692. }
  1693. else if (ntg->touchEvnt->version.repId != 0x0C)
  1694. memset(ntg->touchEvnt, 0x00, sizeof(struct ntg_touch_event));
  1695. return 0;
  1696. }
  1697. static int ntg_spi_transfer(struct ntg_tsData *ntg, char *spiTxbuf)
  1698. {
  1699. short DataLen = 0;
  1700. int ret = 0, status, loop_i = 0, subStatus, nIdx = 0;
  1701. int lastCnt = 0, aIdx = 0;
  1702. mutex_lock(&ntg_spi_transfer_lock);
  1703. memset(spiRxbuf, 0x0, sizeof(char)*NTRIG_PACKET_SIZE);
  1704. status = CHK5A, subStatus = st_START;
  1705. while (status != FINISH) {
  1706. nIdx = 0;
  1707. spiDuplex_Lock(ntg->spiDev, spiTxbuf, spiRxbuf, NTRIG_PACKET_SIZE);
  1708. if (TSLog & Dbg_L2) {
  1709. pr_info("[ts-Rx]%s\n", __func__);
  1710. SPIBUF(spiRxbuf);
  1711. }
  1712. memset(spiTxbuf, 0xAA, sizeof(char)*NTRIG_PACKET_SIZE);
  1713. check5A:
  1714. if (status == CHK5A) {
  1715. for (loop_i = nIdx; loop_i < NTRIG_PACKET_SIZE; loop_i++) {
  1716. if (spiRxbuf[loop_i] == 0xA5) {
  1717. status = CHKPMB;
  1718. subStatus = st_START;
  1719. nIdx = loop_i;
  1720. break;
  1721. }
  1722. }
  1723. if (loop_i == NTRIG_PACKET_SIZE) {
  1724. nIdx = loop_i;
  1725. status = FINISH;
  1726. }
  1727. }
  1728. if (status == CHKPMB) {
  1729. if (subStatus == st_START) {
  1730. if (loop_i > (NTRIG_PACKET_SIZE - 4)) {
  1731. lastCnt = (NTRIG_PACKET_SIZE - nIdx);
  1732. memcpy(spiAnalyRx, (spiRxbuf + nIdx), lastCnt);
  1733. aIdx += lastCnt;
  1734. subStatus = st_CONTI;
  1735. } else {
  1736. memcpy(spiAnalyRx, (spiRxbuf + nIdx), 4);
  1737. nIdx += 4;
  1738. aIdx += 4;
  1739. subStatus = st_FINISH;
  1740. }
  1741. } else if (subStatus == st_CONTI) {
  1742. nIdx = (4-lastCnt);
  1743. memcpy((spiAnalyRx + aIdx), spiRxbuf, nIdx);
  1744. aIdx += nIdx;
  1745. subStatus = st_FINISH;
  1746. }
  1747. if (subStatus == st_FINISH) {
  1748. if (spiAnalyRx[0] == 0xA5 && spiAnalyRx[1] == 0x5A &&
  1749. spiAnalyRx[2] == 0xE7 && spiAnalyRx[3] == 0x7E) {
  1750. status = CHKLEN;
  1751. subStatus = st_START;
  1752. } else {
  1753. status = CHK5A;
  1754. goto check5A;
  1755. }
  1756. }
  1757. }
  1758. if (status == CHKLEN) {
  1759. if (subStatus == st_START) {
  1760. if (nIdx >= (NTRIG_PACKET_SIZE - 3)) {
  1761. lastCnt = (NTRIG_PACKET_SIZE - nIdx);
  1762. memcpy((spiAnalyRx + aIdx), (spiRxbuf + nIdx), lastCnt);
  1763. aIdx += lastCnt;
  1764. subStatus = st_CONTI;
  1765. } else {
  1766. memcpy((spiAnalyRx + aIdx), (spiRxbuf + nIdx), 3);
  1767. nIdx += 3;
  1768. aIdx += 3;
  1769. subStatus = st_FINISH;
  1770. }
  1771. } else if (subStatus == st_CONTI) {
  1772. nIdx = (3 - lastCnt);
  1773. memcpy((spiAnalyRx + aIdx), spiRxbuf, nIdx);
  1774. aIdx += nIdx;
  1775. subStatus = st_FINISH;
  1776. }
  1777. if (subStatus == st_FINISH) {
  1778. memcpy((char *)&DataLen, (spiAnalyRx + 5), 2);
  1779. DataLen -= 3;
  1780. if (atomic_read(&ntg->start_agent) == 0)
  1781. DataLen += CK_CNT;
  1782. status = CHKDATA;
  1783. subStatus = st_START;
  1784. }
  1785. }
  1786. if (status == CHKDATA) {
  1787. if (subStatus == st_START) {
  1788. if (DataLen > (NTRIG_PACKET_SIZE - nIdx)) {
  1789. lastCnt = (NTRIG_PACKET_SIZE - nIdx);
  1790. memcpy((spiAnalyRx + aIdx), (spiRxbuf + nIdx), lastCnt);
  1791. DataLen = DataLen - lastCnt;
  1792. aIdx += lastCnt;
  1793. subStatus = st_CONTI;
  1794. } else {
  1795. memcpy((spiAnalyRx + aIdx), (spiRxbuf + nIdx), DataLen);
  1796. nIdx += DataLen;
  1797. aIdx += DataLen;
  1798. subStatus = st_FINISH;
  1799. }
  1800. } else if (subStatus == st_CONTI) {
  1801. if (DataLen > NTRIG_PACKET_SIZE) {
  1802. memcpy((spiAnalyRx + aIdx), spiRxbuf , NTRIG_PACKET_SIZE);
  1803. DataLen = DataLen - NTRIG_PACKET_SIZE;
  1804. aIdx += NTRIG_PACKET_SIZE;
  1805. subStatus = st_CONTI;
  1806. } else {
  1807. memcpy((spiAnalyRx + aIdx), (spiRxbuf + nIdx), DataLen);
  1808. nIdx += DataLen;
  1809. aIdx += DataLen;
  1810. subStatus = st_FINISH;
  1811. }
  1812. }
  1813. if (subStatus == st_FINISH) {
  1814. status = FINISH;
  1815. subStatus = st_START;
  1816. }
  1817. }
  1818. if (status == FINISH) {
  1819. ret = ntrig_frame_parser(ntg, spiAnalyRx);
  1820. aIdx = 0;
  1821. if ((NTRIG_PACKET_SIZE-nIdx-1) > 0) {
  1822. status = CHK5A;
  1823. goto check5A;
  1824. }
  1825. }
  1826. }
  1827. mutex_unlock(&ntg_spi_transfer_lock);
  1828. return ret;
  1829. }
  1830. static void ntrig_ts_work(struct work_struct *work)
  1831. {
  1832. int ret = 0;
  1833. struct ntg_tsData *ntg_ts;
  1834. char spiTxbuf[NTRIG_PACKET_SIZE];
  1835. if (TSLog & Dbg_L6)
  1836. pr_info("[ts]%s", __func__);
  1837. ntg_ts = container_of(work, struct ntg_tsData, ntg_work);
  1838. memset(spiTxbuf, 0xAA, sizeof(char)*NTRIG_PACKET_SIZE);
  1839. ret = ntg_spi_transfer(ntg_ts, spiTxbuf);
  1840. enable_irq(ntg_ts->spiDev->irq);
  1841. }
  1842. static irqreturn_t ntrig_ts_irq_handler(int irq, void *dev_id)
  1843. {
  1844. struct ntg_tsData *ts;
  1845. ts = dev_id;
  1846. if (count_isr_from_resume < 2) {
  1847. count_isr_from_resume++;
  1848. }
  1849. disable_irq_nosync(ts->spiDev->irq);
  1850. queue_work(ts->ntg_wq, &ts->ntg_work);
  1851. return IRQ_HANDLED;
  1852. }
  1853. static int ntrig_ts_probe(struct spi_device *dev)
  1854. {
  1855. int ret, err, intFlag, i;
  1856. struct ntg_tsData *ntg_ts;
  1857. struct ntrig_spi_platform_data *pdata;
  1858. char spiTxbuf[NTRIG_PACKET_SIZE], spiRxbuf[NTRIG_PACKET_SIZE];
  1859. if (board_mfg_mode() == 5) {
  1860. pr_info("[tp] Recover mode charging!!Touch driver wouldn't probe\n");
  1861. return 0;
  1862. }
  1863. pdata = dev->dev.platform_data;
  1864. ret = 0;
  1865. gpio_set_value(pdata->spi_enable, 0);
  1866. udelay(20);
  1867. gpio_set_value(pdata->spi_enable, 1);
  1868. msleep(10);
  1869. for (i = 0; i < 12; i++) {
  1870. intFlag = gpio_get_value(pdata->irq_gpio);
  1871. if (intFlag) {
  1872. printk(KERN_DEBUG "[tp]touch(%d) irq HIGH\n", i);
  1873. memset(spiTxbuf, 0xAA, NTRIG_PACKET_SIZE);
  1874. memset(spiRxbuf, 0x00, NTRIG_PACKET_SIZE);
  1875. spiDuplex_Lock(dev, spiTxbuf, spiRxbuf, NTRIG_PACKET_SIZE);
  1876. msleep(50);
  1877. if (spiRxbuf[8] == 0x02) {
  1878. memcpy((char *)&ntg_fwver, (char *)&spiRxbuf[16], 4);
  1879. pr_info("[tp_FwVersion]ver = %#x", ntg_fwver);
  1880. intFlag = 0;
  1881. break;
  1882. }
  1883. } else
  1884. break;
  1885. }
  1886. if (intFlag) {
  1887. pr_err("[tp_ntg_err][ts_interrupts] Always High!!\n");
  1888. return 0;
  1889. }
  1890. ntg_ts = kzalloc(sizeof(struct ntg_tsData), GFP_KERNEL);
  1891. if (ntg_ts == NULL) {
  1892. pr_err("[tp_ntg_err]allocate ntg_tsdata failed \n");
  1893. ret = -ENODEV;
  1894. goto err_alloc_data_failed;
  1895. }
  1896. if (pdata)
  1897. ntg_ts->power = pdata->power;
  1898. ntg_ts->ntg_wq = create_singlethread_workqueue("ntrig_wq");
  1899. if (!ntg_ts->ntg_wq) {
  1900. pr_err("[tp_ntg_err]allocate ntg_tsdata failed \n");
  1901. ret = -ENOMEM;
  1902. goto err_create_wq_failed;
  1903. }
  1904. INIT_WORK(&ntg_ts->ntg_work, ntrig_ts_work);
  1905. ntg_ts->spiDev = dev;
  1906. if (!ntg_ts->spiDev)
  1907. pr_err("[tp_ntg_err]dev pointer give failure!\n");
  1908. dev_set_drvdata(&dev->dev, ntg_ts);
  1909. ntg_ts->touchEvnt = kzalloc(sizeof(struct ntg_touch_event), GFP_KERNEL);
  1910. if (ntg_ts->touchEvnt == NULL) {
  1911. pr_err("[tp_ntg_err]allocate ntg_tsdata failed \n");
  1912. ret = -ENODEV;
  1913. goto err_create_wq_failed;
  1914. }
  1915. ntg_ts->abs_x_max = pdata->abs_x_max;
  1916. ntg_ts->abs_x_min = pdata->abs_x_min;
  1917. ntg_ts->abs_y_max = pdata->abs_y_max;
  1918. ntg_ts->abs_y_min = pdata->abs_y_min;
  1919. ntg_ts->orientate = pdata->orientate;
  1920. ntg_ts->abs_pressure_max = pdata->abs_pressure_max;
  1921. ntg_ts->abs_pressure_min = pdata->abs_pressure_min;
  1922. ntg_ts->abs_width_max = pdata->abs_width_max;
  1923. ntg_ts->abs_width_min = pdata->abs_width_min;
  1924. ntg_ts->spi_enable = pdata->spi_enable;
  1925. ntg_ts->esdFlag = pdata->esdFlag;
  1926. ntg_ts->irq_gpio = pdata->irq_gpio;
  1927. ntg_ts->fwtwozero = pdata->fwtwozero;
  1928. ntg_ts->input_dev = input_allocate_device();
  1929. if (ntg_ts->input_dev == NULL) {
  1930. ret = -ENOMEM;
  1931. dev_err(&ntg_ts->spiDev->dev,
  1932. "Failed to allocate input device\n");
  1933. pr_err("[tp_ntg_err]input_allocate_device failed [Finger]\n");
  1934. goto err_input_dev_alloc_failed;
  1935. }
  1936. ntg_ts->input_dev->name = "Ntrig-touchscreen";
  1937. ntg_ts->input_devP = input_allocate_device();
  1938. if (ntg_ts->input_devP == NULL) {
  1939. ret = -ENOMEM;
  1940. dev_err(&ntg_ts->spiDev->dev,
  1941. "Failed to allocate input device\n");
  1942. pr_err("[tp_ntg_err]input_allocate_device failed [Pen]\n");
  1943. goto err_input_dev_alloc_failed;
  1944. }
  1945. ntg_ts->input_devP->name = "Ntrig-Pen-touchscreen";
  1946. set_bit(EV_SYN, ntg_ts->input_dev->evbit);
  1947. set_bit(EV_KEY, ntg_ts->input_dev->evbit);
  1948. // set_bit(BTN_TOUCH, ntg_ts->input_dev->keybit);
  1949. // set_bit(BTN_2, ntg_ts->input_dev->keybit);
  1950. set_bit(EV_ABS, ntg_ts->input_dev->evbit);
  1951. set_bit(KEY_BACK, ntg_ts->input_dev->keybit);
  1952. input_set_abs_params(ntg_ts->input_dev, ABS_MT_POSITION_X,
  1953. ntg_ts->abs_x_min, ntg_ts->abs_x_max, 0, 0);
  1954. input_set_abs_params(ntg_ts->input_dev, ABS_MT_POSITION_Y,
  1955. ntg_ts->abs_y_min, ntg_ts->abs_y_max, 0, 0);
  1956. input_set_abs_params(ntg_ts->input_dev, ABS_MT_PRESSURE,
  1957. ntg_ts->abs_pressure_min, ntg_ts->abs_pressure_max, 0, 0);
  1958. input_set_abs_params(ntg_ts->input_dev, ABS_MT_TOUCH_MAJOR,
  1959. ntg_ts->abs_pressure_min, ntg_ts->abs_pressure_max, 0, 0);
  1960. input_set_abs_params(ntg_ts->input_dev, ABS_MT_WIDTH_MAJOR,
  1961. ntg_ts->abs_width_min, ntg_ts->abs_width_max, 0, 0);
  1962. // input_set_abs_params(ntg_ts->input_dev, ABS_MT_TRACKING_ID, 0,
  1963. // ABS_MT_TRACKING_ID_MAX, 0, 0);
  1964. set_bit(EV_SYN, ntg_ts->input_devP->evbit);
  1965. set_bit(EV_KEY, ntg_ts->input_devP->evbit);
  1966. // set_bit(BTN_TOUCH, ntg_ts->input_devP->keybit);
  1967. set_bit(BTN_2, ntg_ts->input_devP->keybit);
  1968. set_bit(EV_ABS, ntg_ts->input_devP->evbit);
  1969. set_bit(KEY_BACK, ntg_ts->input_devP->keybit);
  1970. input_set_abs_params(ntg_ts->input_devP, ABS_MT_POSITION_X,
  1971. ntg_ts->abs_x_min, ntg_ts->abs_x_max, 0, 0);
  1972. input_set_abs_params(ntg_ts->input_devP, ABS_MT_POSITION_Y,
  1973. ntg_ts->abs_y_min, ntg_ts->abs_y_max, 0, 0);
  1974. input_set_abs_params(ntg_ts->input_devP, ABS_MT_TOUCH_MAJOR,
  1975. ntg_ts->abs_pressure_min, ntg_ts->abs_pressure_max, 0, 0);
  1976. input_set_abs_params(ntg_ts->input_devP, ABS_MT_PRESSURE,
  1977. ntg_ts->abs_pressure_min, ntg_ts->abs_pressure_max, 0, 0);
  1978. input_set_abs_params(ntg_ts->input_devP, ABS_MT_WIDTH_MAJOR,
  1979. ntg_ts->abs_width_min, ntg_ts->abs_width_max, 0, 0);
  1980. /*#ifndef CONFIG_TOUCHSCREEN_COMPATIBLE_REPORT*/
  1981. input_set_abs_params(ntg_ts->input_dev, ABS_MT_AMPLITUDE,
  1982. 0, ((255 << 16) | 30), 0, 0);
  1983. input_set_abs_params(ntg_ts->input_dev, ABS_MT_POSITION,
  1984. 0, ((1 << 31) | (ntg_ts->abs_x_max << 16) | ntg_ts->abs_y_max), 0, 0);
  1985. input_set_abs_params(ntg_ts->input_devP, ABS_MT_AMPLITUDE,
  1986. 0, ((255 << 16) | 32), 0, 0);
  1987. input_set_abs_params(ntg_ts->input_devP, ABS_MT_POSITION,
  1988. 0, ((ntg_ts->abs_x_max << 16) | ntg_ts->abs_y_max), 0, 0);
  1989. /*#endif*/
  1990. ret = input_register_device(ntg_ts->input_dev);
  1991. if (ret) {
  1992. dev_err(&ntg_ts->spiDev->dev,
  1993. "ntrig_ts_probe: Unable to register [Finger] %s input device\n",
  1994. ntg_ts->input_dev->name);
  1995. pr_err("[tp_ntg_err]input_register_device [Finger] failed\n");
  1996. goto err_input_register_device_failed;
  1997. }
  1998. ret = input_register_device(ntg_ts->input_devP);
  1999. if (ret) {
  2000. dev_err(&ntg_ts->spiDev->dev,
  2001. "ntrig_ts_probe: Unable to register [Pen] %s input device\n",
  2002. ntg_ts->input_devP->name);
  2003. pr_err("[tp_ntg_err]input_register_device [Pen] failed\n");
  2004. goto err_input_register_device_failed;
  2005. }
  2006. init_waitqueue_head(&ntg_ts->get_data_wq);
  2007. init_waitqueue_head(&ntg_ts->send_data_wq);
  2008. #ifdef CONFIG_HAS_EARLYSUSPEND
  2009. ntg_ts->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 3;
  2010. ntg_ts->early_suspend.suspend = ntrig_ts_early_suspend;
  2011. ntg_ts->early_suspend.resume = ntrig_ts_late_resume;
  2012. register_early_suspend(&ntg_ts->early_suspend);
  2013. #endif
  2014. ntrig_touch_sysfs_init();
  2015. init_waitqueue_head(&data_ready_agent_wq);
  2016. init_waitqueue_head(&data_send_agent_wq);
  2017. atomic_set(&ntg_ts->data_ok_agent, 0);
  2018. atomic_set(&ntg_ts->info_send_agent, 0);
  2019. atomic_set(&ntg_ts->start_agent, 0);
  2020. if (misc_register(&ntrigi_miscdev) < 0) {
  2021. pr_err("[tp_ntg_err]Can't register ntrigi_miscdev device with minor.");
  2022. ret = -EIO;
  2023. goto err_input_register_device_failed;
  2024. }
  2025. err = misc_register(&ntrig_device);
  2026. if (err) {
  2027. pr_err("[tp_ntg_err]ntrig_device: device register failed\n");
  2028. ret = -EIO;
  2029. goto err_input_register_device_failed;
  2030. }
  2031. err = misc_register(&ntrig_map_device);
  2032. if (err) {
  2033. pr_err("[tp_ntg_err]ntrig_map_device: device register failed\n");
  2034. ret = -EIO;
  2035. goto err_input_register_device_failed;
  2036. }
  2037. if (ntg_ts->esdFlag) {
  2038. ntg_ts->ntg_wq_esd = create_singlethread_workqueue("ntrig_esd");
  2039. if (!ntg_ts->ntg_wq_esd) {
  2040. pr_err("[tp_ntg_err]allocate ntg_tsdata failed \n");
  2041. ret = -ENOMEM;
  2042. goto err_create_wq_failed;
  2043. }
  2044. INIT_DELAYED_WORK(&ntg_ts->ntg_work_esd, ntg_alive_mechanism);
  2045. queue_delayed_work(ntg_ts->ntg_wq_esd, &ntg_ts->ntg_work_esd, msecs_to_jiffies(ESDEXECUTE));
  2046. }
  2047. ntg_ts->ntg_wq_usb_disable = create_singlethread_workqueue("ntrig_usb_disable");
  2048. if (!ntg_ts->ntg_wq_usb_disable) {
  2049. pr_err("[tp_ntg_err]allocate ntg_tsdata failed \n");
  2050. ret = -ENOMEM;
  2051. goto err_create_wq_failed;
  2052. }
  2053. INIT_DELAYED_WORK(&ntg_ts->ntg_work_usb_disable, ntg_usb_disable_mechanism);
  2054. queue_delayed_work(ntg_ts->ntg_wq_usb_disable, &ntg_ts->ntg_work_usb_disable, msecs_to_jiffies(USBDISABLE_DELAY));
  2055. ntg_ts->ntg_wq_resume = create_singlethread_workqueue("ntrig_resume");
  2056. if (!ntg_ts->ntg_wq_resume) {
  2057. pr_err("[tp_ntg_err]allocate ntg_tsdata failed \n");
  2058. ret = -ENOMEM;
  2059. goto err_create_wq_failed;
  2060. }
  2061. INIT_DELAYED_WORK(&ntg_ts->ntg_work_resume, ntg_powSeq_machanism);
  2062. private_ts = ntg_ts;
  2063. ret = request_irq(dev->irq, ntrig_ts_irq_handler, IRQF_TRIGGER_HIGH,
  2064. "ntrig_irq", ntg_ts);
  2065. if (ret < 0) {
  2066. dev_err(&ntg_ts->spiDev->dev, "request_irq_failed");
  2067. pr_info("[tp_ntg_err]request_irq failed, %d\n", ret);
  2068. }
  2069. return 0;
  2070. err_input_register_device_failed:
  2071. input_free_device(ntg_ts->input_dev);
  2072. err_input_dev_alloc_failed:
  2073. destroy_workqueue(ntg_ts->ntg_wq);
  2074. destroy_workqueue(ntg_ts->ntg_wq_esd);
  2075. err_create_wq_failed:
  2076. kfree(ntg_ts);
  2077. err_alloc_data_failed:
  2078. return ret;
  2079. }
  2080. static int __exit ntrig_ts_remove(struct spi_device *dev)
  2081. {
  2082. struct ntg_tsData *ts;
  2083. ts = private_ts;
  2084. destroy_workqueue(ts->ntg_wq);
  2085. input_unregister_device(ts->input_dev);
  2086. kfree(ts);
  2087. if (mapData != NULL) {
  2088. if (mapData->map != NULL)
  2089. kfree(mapData->map);
  2090. kfree(mapData);
  2091. }
  2092. ntrig_touch_sysfs_remove();
  2093. return 0;
  2094. }
  2095. static int ntrig_ts_suspend(struct spi_device *dev, pm_message_t mesg)
  2096. {
  2097. int ret = 0;
  2098. struct ntg_tsData *ts;
  2099. ts = private_ts;
  2100. disable_irq(ts->spiDev->irq);
  2101. ret = cancel_work_sync(&ts->ntg_work);
  2102. if (ret)
  2103. enable_irq(ts->spiDev->irq);
  2104. ts->power(0);
  2105. count_isr_from_resume = 0;
  2106. atomic_set(&ts->start_agent, 0);
  2107. fUsboff = false;
  2108. fPalmRej = false;
  2109. if (ts->esdFlag) {
  2110. ret = cancel_delayed_work_sync(&ts->ntg_work_esd);
  2111. if (!ret)
  2112. cancel_delayed_work(&ts->ntg_work_esd);
  2113. }
  2114. return ret;
  2115. }
  2116. static int ntrig_ts_resume(struct spi_device *dev)
  2117. {
  2118. struct ntg_tsData *ts ;
  2119. int ret = 0;
  2120. ts = private_ts;
  2121. ts->power(1);
  2122. queue_delayed_work(ts->ntg_wq_resume, &ts->ntg_work_resume, msecs_to_jiffies(POWERONSEQ));
  2123. if (ts->esdFlag)
  2124. queue_delayed_work(ts->ntg_wq_esd, &ts->ntg_work_esd, msecs_to_jiffies(ESDSEQ));
  2125. return ret;
  2126. }
  2127. #ifdef CONFIG_HAS_EARLYSUSPEND
  2128. static void ntrig_ts_early_suspend(struct early_suspend *h)
  2129. {
  2130. int ret;
  2131. struct ntg_tsData *ts;
  2132. ts = container_of(h, struct ntg_tsData, early_suspend);
  2133. ret = cancel_delayed_work_sync(&ts->ntg_work_resume);
  2134. if (ret)
  2135. enable_irq(ts->spiDev->irq);
  2136. if (event_google_enable == 1) {
  2137. input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0x00);
  2138. input_sync(ts->input_dev);
  2139. } else {
  2140. input_report_abs(ts->input_dev, ABS_MT_AMPLITUDE, 0x00);
  2141. input_report_abs(ts->input_dev, ABS_MT_POSITION, 1<<31);
  2142. }
  2143. ntrig_ts_suspend(ts->spiDev, PMSG_SUSPEND);
  2144. }
  2145. static void ntrig_ts_late_resume(struct early_suspend *h)
  2146. {
  2147. struct ntg_tsData *ts;
  2148. ts = container_of(h, struct ntg_tsData, early_suspend);
  2149. ntrig_ts_resume(ts->spiDev);
  2150. }
  2151. #endif
  2152. static const struct spi_device_id ntrig_ts_spi_id[] = {
  2153. {NTRIG_NAME, 0},
  2154. {}
  2155. };
  2156. static struct spi_driver ntrig_ts_driver = {
  2157. .id_table = ntrig_ts_spi_id,
  2158. .probe = ntrig_ts_probe,
  2159. #ifndef CONFIG_HAS_EARLYSUSPEND
  2160. .suspend = ntrig_ts_suspend,
  2161. .resume = ntrig_ts_resume,
  2162. #endif
  2163. .remove = __exit_p(ntrig_ts_remove),
  2164. .driver = {
  2165. .name = NTRIG_NAME,
  2166. .owner = THIS_MODULE,
  2167. },
  2168. };
  2169. static int __init ntrig_ts_init(void)
  2170. {
  2171. int ret = 0;
  2172. pr_info("[tp] %s(HW:%d)\n", __func__, system_rev);
  2173. ret = spi_register_driver(&ntrig_ts_driver);
  2174. if (ret < 0)
  2175. pr_err("[tp] Ntrig touch driver Register FAILUE(%d)\n", ret);
  2176. else
  2177. pr_info("[tp] Ntrig touch driver Rigister OK!\n");
  2178. return ret;
  2179. }
  2180. static void __exit ntrig_ts_exit(void)
  2181. {
  2182. spi_unregister_driver(&ntrig_ts_driver);
  2183. }
  2184. module_init(ntrig_ts_init);
  2185. module_exit(ntrig_ts_exit);
  2186. MODULE_DESCRIPTION("N-trig SPI TOUCHSCREEN");
  2187. MODULE_LICENSE("GPL");