PageRenderTime 65ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 1ms

/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

Large files files are truncated, but you can click here to view the full file

  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->ge

Large files files are truncated, but you can click here to view the full file