gt1x_extents.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970
  1. /* drivers/input/touchscreen/gt1x_extents.c
  2. *
  3. * 2010 - 2014 Goodix Technology.
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be a reference
  11. * to you, when you are integrating the GOODiX's CTP IC into your system,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * Version: 1.0
  17. * Revision Record:
  18. * V1.0: first release. 2014/09/28.
  19. *
  20. */
  21. #include <linux/interrupt.h>
  22. #include <linux/i2c.h>
  23. #include <linux/sched.h>
  24. #include <linux/kthread.h>
  25. #include <linux/wait.h>
  26. #include <linux/time.h>
  27. #include <linux/delay.h>
  28. #include <linux/device.h>
  29. #include <linux/miscdevice.h>
  30. #include <linux/input.h>
  31. #ifdef CONFIG_COMPAT
  32. #include <linux/compat.h>
  33. #endif
  34. #include <linux/uaccess.h>
  35. #include <linux/proc_fs.h> /*proc */
  36. #include <linux/ratelimit.h>
  37. #include <asm/ioctl.h>
  38. #include "include/gt1x_tpd_common.h"
  39. #ifdef CONFIG_GTP_GESTURE_WAKEUP
  40. #define GESTURE_NODE "goodix_gesture"
  41. #define GESTURE_MAX_POINT_COUNT 64
  42. #pragma pack(1)
  43. struct {
  44. u8 ic_msg[6]; /*from the first byte */
  45. u8 gestures[4];
  46. u8 data[3 + GESTURE_MAX_POINT_COUNT * 4 + 80]; /*80 bytes for extra data */
  47. } st_gesture_data;
  48. #pragma pack()
  49. #define SETBIT(longlong, bit) (longlong[bit/8] |= (1 << bit%8))
  50. #define CLEARBIT(longlong, bit) (longlong[bit/8] &= (~(1 << bit%8)))
  51. #define QUERYBIT(longlong, bit) (!!(longlong[bit/8] & (1 << bit%8)))
  52. int gesture_enabled = 0;
  53. DOZE_T gesture_doze_status = DOZE_DISABLED;
  54. static u8 gestures_flag[32];
  55. static st_gesture_data gesture_data;
  56. static struct mutex gesture_data_mutex;
  57. static ssize_t gt1x_gesture_data_read(struct file *file, char __user *page, size_t size, loff_t *ppos)
  58. {
  59. s32 ret = -1;
  60. GTP_DEBUG("visit gt1x_gesture_data_read. ppos:%d", (int)*ppos);
  61. if (*ppos)
  62. return 0;
  63. if (size == 4) {
  64. ret = copy_to_user(((u8 __user *) page), "GT1X", 4);
  65. return 4;
  66. }
  67. ret = simple_read_from_buffer(page, size, ppos, &gesture_data, sizeof(gesture_data));
  68. GTP_DEBUG("Got the gesture data.");
  69. return ret;
  70. }
  71. static ssize_t gt1x_gesture_data_write(struct file *filp, const char __user *buff, size_t len, loff_t *off)
  72. {
  73. s32 ret = 0;
  74. GTP_DEBUG_FUNC();
  75. ret = copy_from_user(&gesture_enabled, buff, 1);
  76. if (ret) {
  77. GTP_ERROR("copy_from_user failed.");
  78. return -EPERM;
  79. }
  80. GTP_DEBUG("gesture enabled:%x, ret:%d", gesture_enabled, ret);
  81. return len;
  82. }
  83. static u8 is_all_dead(u8 *longlong, s32 size)
  84. {
  85. int i = 0;
  86. u8 sum = 0;
  87. for (i = 0; i < size; i++)
  88. sum |= longlong[i];
  89. return !sum;
  90. }
  91. int gesture_enter_doze(void)
  92. {
  93. int retry = 0;
  94. GTP_DEBUG_FUNC();
  95. GTP_DEBUG("entering doze mode...");
  96. while (retry++ < 5) {
  97. if (!gt1x_send_cmd(0x08, 0)) {
  98. gesture_doze_status = DOZE_ENABLED;
  99. GTP_DEBUG("GTP has been working in doze mode!");
  100. return 0;
  101. }
  102. msleep(20);
  103. }
  104. GTP_ERROR("GTP send doze cmd failed.");
  105. return -1;
  106. }
  107. s32 gesture_event_handler(struct input_dev *dev)
  108. {
  109. u8 doze_buf[4] = { 0 };
  110. s32 ret = -1;
  111. int len, extra_len;
  112. if (DOZE_ENABLED == gesture_doze_status) {
  113. ret = gt1x_i2c_read(GTP_REG_WAKEUP_GESTURE, doze_buf, 4);
  114. GTP_DEBUG("0x%x = 0x%02X,0x%02X,0x%02X,0x%02X", GTP_REG_WAKEUP_GESTURE, doze_buf[0], doze_buf[1],
  115. doze_buf[2], doze_buf[3]);
  116. if (ret == 0 && doze_buf[0] != 0) {
  117. if (!QUERYBIT(gestures_flag, doze_buf[0])) {
  118. GTP_INFO("Sorry, this gesture has been disabled.");
  119. doze_buf[0] = 0x00;
  120. gt1x_i2c_write(GTP_REG_WAKEUP_GESTURE, doze_buf, 1);
  121. return 0;
  122. }
  123. mutex_lock(&gesture_data_mutex);
  124. len = doze_buf[1];
  125. if (len > GESTURE_MAX_POINT_COUNT) {
  126. GTP_ERROR("Gesture contain too many points!(%d)", len);
  127. len = GESTURE_MAX_POINT_COUNT;
  128. }
  129. if (len > 0) {
  130. ret = gt1x_i2c_read(GTP_REG_WAKEUP_GESTURE_DETAIL, &gesture_data.data[4], len * 4);
  131. if (ret < 0) {
  132. GTP_DEBUG("Read gesture data failed.");
  133. mutex_unlock(&gesture_data_mutex);
  134. return 0;
  135. }
  136. }
  137. extra_len = doze_buf[3];
  138. if (extra_len > 80) {
  139. GTP_ERROR("Gesture contain too many extra data!(%d)", extra_len);
  140. extra_len = 80;
  141. }
  142. if (extra_len > 0) {
  143. ret =
  144. gt1x_i2c_read(GTP_REG_WAKEUP_GESTURE + 4, &gesture_data.data[4 + len * 4],
  145. extra_len);
  146. if (ret < 0) {
  147. GTP_DEBUG("Read extra gesture data failed.");
  148. mutex_unlock(&gesture_data_mutex);
  149. return 0;
  150. }
  151. }
  152. gesture_data.data[0] = doze_buf[0]; /*gesture type*/
  153. gesture_data.data[1] = len; /*gesture points number*/
  154. gesture_data.data[2] = doze_buf[2];
  155. gesture_data.data[3] = extra_len;
  156. mutex_unlock(&gesture_data_mutex);
  157. GTP_DEBUG("Gesture: 0x%02X, points: %d", doze_buf[0], doze_buf[1]);
  158. doze_buf[0] = 0;
  159. gt1x_i2c_write(GTP_REG_WAKEUP_GESTURE, doze_buf, 1);
  160. input_report_key(dev, KEY_GESTURE, 1);
  161. input_sync(dev);
  162. input_report_key(dev, KEY_GESTURE, 0);
  163. input_sync(dev);
  164. return 1;
  165. }
  166. return 0;
  167. }
  168. return -1;
  169. }
  170. void gesture_clear_wakeup_data(void)
  171. {
  172. mutex_lock(&gesture_data_mutex);
  173. memset(gesture_data.data, 0, 4);
  174. mutex_unlock(&gesture_data_mutex);
  175. }
  176. #endif /*CONFIG_GTP_GESTURE_WAKEUP*/
  177. /*HotKnot module*/
  178. #ifdef CONFIG_GTP_HOTKNOT
  179. #define HOTKNOT_NODE "hotknot"
  180. u8 hotknot_enabled = 0;
  181. u8 hotknot_transfer_mode = 0;
  182. static int hotknot_open(struct inode *node, struct file *flip)
  183. {
  184. GTP_DEBUG("Hotknot is enable.");
  185. hotknot_enabled = 1;
  186. return 0;
  187. }
  188. static int hotknot_release(struct inode *node, struct file *filp)
  189. {
  190. GTP_DEBUG("Hotknot is disable.");
  191. hotknot_enabled = 0;
  192. return 0;
  193. }
  194. static s32 hotknot_enter_transfer_mode(void)
  195. {
  196. int ret = 0;
  197. u8 buffer[5] = { 0 };
  198. hotknot_transfer_mode = 1;
  199. #ifdef CONFIG_GTP_ESD_PROTECT
  200. gt1x_esd_switch(SWITCH_OFF);
  201. #endif
  202. gt1x_irq_disable();
  203. gt1x_send_cmd(GTP_CMD_HN_TRANSFER, 0);
  204. msleep(100);
  205. gt1x_irq_enable();
  206. ret = gt1x_i2c_read(0x8140, buffer, sizeof(buffer));
  207. if (ret) {
  208. hotknot_transfer_mode = 0;
  209. return ret;
  210. }
  211. buffer[4] = 0;
  212. GTP_DEBUG("enter transfer mode: %s ", buffer);
  213. if (strcmp(buffer, "GHot")) {
  214. hotknot_transfer_mode = 0;
  215. return ERROR_HN_VER;
  216. }
  217. return 0;
  218. }
  219. static s32 hotknot_load_hotknot_subsystem(void)
  220. {
  221. return hotknot_enter_transfer_mode();
  222. }
  223. static s32 hotknot_load_authentication_subsystem(void)
  224. {
  225. s32 ret = 0;
  226. u8 buffer[5] = { 0 };
  227. ret = gt1x_hold_ss51_dsp_no_reset();
  228. if (ret < 0) {
  229. GTP_ERROR("Hold ss51 fail!");
  230. return ERROR;
  231. }
  232. if (gt1x_chip_type == CHIP_TYPE_GT1X) {
  233. GTP_INFO("hotknot load jump code.");
  234. ret = gt1x_load_patch(gt1x_patch_jump_fw, 4096, 0, 1024 * 8);
  235. if (ret < 0) {
  236. GTP_ERROR("Load jump code fail!");
  237. return ret;
  238. }
  239. GTP_INFO("hotknot load auth code.");
  240. ret = gt1x_load_patch(hotknot_auth_fw, 4096, 4096, 1024 * 8);
  241. if (ret < 0) {
  242. GTP_ERROR("Load auth system fail!");
  243. return ret;
  244. }
  245. } else {
  246. GTP_INFO("hotknot load auth code.");
  247. ret = gt1x_load_patch(hotknot_auth_fw, 4096, 0, 1024 * 6);
  248. if (ret < 0) {
  249. GTP_ERROR("load auth system fail!");
  250. return ret;
  251. }
  252. }
  253. ret = gt1x_startup_patch();
  254. if (ret < 0) {
  255. GTP_ERROR("Startup auth system fail!");
  256. return ret;
  257. }
  258. ret = gt1x_i2c_read(GTP_REG_VERSION, buffer, 4);
  259. if (ret < 0) {
  260. GTP_ERROR("i2c read error!");
  261. return ERROR_IIC;
  262. }
  263. buffer[4] = 0;
  264. GTP_INFO("Current System version: %s", buffer);
  265. return 0;
  266. }
  267. static s32 hotknot_recovery_main_system(void)
  268. {
  269. gt1x_irq_disable();
  270. gt1x_reset_guitar();
  271. gt1x_irq_enable();
  272. #ifdef CONFIG_GTP_ESD_PROTECT
  273. gt1x_esd_switch(SWITCH_ON);
  274. #endif
  275. hotknot_transfer_mode = 0;
  276. return 0;
  277. }
  278. #ifdef CONFIG_HOTKNOT_BLOCK_RW
  279. DECLARE_WAIT_QUEUE_HEAD(bp_waiter);
  280. static u8 got_hotknot_state;
  281. static u8 got_hotknot_extra_state;
  282. static u8 wait_hotknot_state;
  283. static u8 force_wake_flag;
  284. static u8 block_enable;
  285. s32 hotknot_paired_flag = 0;
  286. static s32 hotknot_block_rw(u8 rqst_hotknot_state, s32 wait_hotknot_timeout)
  287. {
  288. s32 ret = 0;
  289. wait_hotknot_state |= rqst_hotknot_state;
  290. GTP_DEBUG("Goodix tool received wait polling state:0x%x,timeout:%d, all wait state:0x%x", rqst_hotknot_state,
  291. wait_hotknot_timeout, wait_hotknot_state);
  292. got_hotknot_state &= (~rqst_hotknot_state);
  293. set_current_state(TASK_INTERRUPTIBLE);
  294. if (wait_hotknot_timeout <= 0) {
  295. wait_event_interruptible(bp_waiter, force_wake_flag
  296. || rqst_hotknot_state == (got_hotknot_state & rqst_hotknot_state));
  297. } else {
  298. wait_event_interruptible_timeout(bp_waiter, force_wake_flag
  299. || rqst_hotknot_state == (got_hotknot_state & rqst_hotknot_state),
  300. wait_hotknot_timeout);
  301. }
  302. wait_hotknot_state &= (~rqst_hotknot_state);
  303. if (rqst_hotknot_state != (got_hotknot_state & rqst_hotknot_state)) {
  304. GTP_ERROR("Wait 0x%x block polling waiter failed.", rqst_hotknot_state);
  305. ret = -1;
  306. }
  307. force_wake_flag = 0;
  308. return ret;
  309. }
  310. static void hotknot_wakeup_block(void)
  311. {
  312. GTP_DEBUG("Manual wakeup all block polling waiter!");
  313. got_hotknot_state = 0;
  314. wait_hotknot_state = 0;
  315. force_wake_flag = 1;
  316. hotknot_paired_flag = 0;
  317. wake_up_interruptible(&bp_waiter);
  318. }
  319. s32 hotknot_event_handler(u8 *data)
  320. {
  321. u8 hn_pxy_state = 0;
  322. u8 hn_pxy_state_bak = 0;
  323. static u8 hn_paired_cnt;
  324. u8 hn_state_buf[10] = { 0 };
  325. u8 finger = data[0];
  326. u8 id = 0;
  327. if (block_enable && !hotknot_paired_flag && (finger & 0x0F)) {
  328. id = data[1];
  329. hn_pxy_state = data[2] & 0x80;
  330. hn_pxy_state_bak = data[3] & 0x80;
  331. if ((32 == id) && (0x80 == hn_pxy_state) && (0x80 == hn_pxy_state_bak)) {
  332. #ifdef HN_DBLCFM_PAIRED
  333. if (hn_paired_cnt++ < 2)
  334. return 0;
  335. #endif
  336. GTP_DEBUG("HotKnot paired!");
  337. if (wait_hotknot_state & HN_DEVICE_PAIRED) {
  338. GTP_DEBUG("INT wakeup HN_DEVICE_PAIRED block polling waiter");
  339. got_hotknot_state |= HN_DEVICE_PAIRED;
  340. wake_up_interruptible(&bp_waiter);
  341. }
  342. block_enable = 0;
  343. hotknot_paired_flag = 1;
  344. return 0;
  345. }
  346. got_hotknot_state &= (~HN_DEVICE_PAIRED);
  347. hn_paired_cnt = 0;
  348. }
  349. if (hotknot_paired_flag) {
  350. s32 ret = -1;
  351. ret = gt1x_i2c_read(GTP_REG_HN_STATE, hn_state_buf, 6);
  352. if (ret < 0) {
  353. GTP_ERROR("I2C transfer error. errno:%d\n ", ret);
  354. return 0;
  355. }
  356. got_hotknot_state = 0;
  357. GTP_DEBUG("wait_hotknot_state:%x", wait_hotknot_state);
  358. GTP_DEBUG("[0x8800~0x8803]=0x%x,0x%x,0x%x,0x%x", hn_state_buf[0], hn_state_buf[1], hn_state_buf[2],
  359. hn_state_buf[3]);
  360. if (wait_hotknot_state & HN_MASTER_SEND) {
  361. if ((0x03 == hn_state_buf[0]) || (0x04 == hn_state_buf[0])
  362. || (0x07 == hn_state_buf[0])) {
  363. GTP_DEBUG("Wakeup HN_MASTER_SEND block polling waiter");
  364. got_hotknot_state |= HN_MASTER_SEND;
  365. got_hotknot_extra_state = hn_state_buf[0];
  366. wake_up_interruptible(&bp_waiter);
  367. }
  368. } else if (wait_hotknot_state & HN_SLAVE_RECEIVED) {
  369. if ((0x03 == hn_state_buf[1]) || (0x04 == hn_state_buf[1])
  370. || (0x07 == hn_state_buf[1])) {
  371. GTP_DEBUG("Wakeup HN_SLAVE_RECEIVED block polling waiter:0x%x", hn_state_buf[1]);
  372. got_hotknot_state |= HN_SLAVE_RECEIVED;
  373. got_hotknot_extra_state = hn_state_buf[1];
  374. wake_up_interruptible(&bp_waiter);
  375. }
  376. } else if (wait_hotknot_state & HN_MASTER_DEPARTED) {
  377. if (0x07 == hn_state_buf[0]) {
  378. GTP_DEBUG("Wakeup HN_MASTER_DEPARTED block polling waiter");
  379. got_hotknot_state |= HN_MASTER_DEPARTED;
  380. wake_up_interruptible(&bp_waiter);
  381. }
  382. } else if (wait_hotknot_state & HN_SLAVE_DEPARTED) {
  383. if (0x07 == hn_state_buf[1]) {
  384. GTP_DEBUG("Wakeup HN_SLAVE_DEPARTED block polling waiter");
  385. got_hotknot_state |= HN_SLAVE_DEPARTED;
  386. wake_up_interruptible(&bp_waiter);
  387. }
  388. }
  389. return 0;
  390. }
  391. return -1;
  392. }
  393. #endif /*CONFIG_HOTKNOT_BLOCK_RW*/
  394. #endif /*CONFIG_GTP_HOTKNOT*/
  395. #define GOODIX_MAGIC_NUMBER 'G'
  396. #define NEGLECT_SIZE_MASK (~(_IOC_SIZEMASK << _IOC_SIZESHIFT))
  397. #define GESTURE_ENABLE_TOTALLY _IO(GOODIX_MAGIC_NUMBER, 1) /* 1*/
  398. #define GESTURE_DISABLE_TOTALLY _IO(GOODIX_MAGIC_NUMBER, 2)
  399. #define GESTURE_ENABLE_PARTLY _IO(GOODIX_MAGIC_NUMBER, 3)
  400. #define GESTURE_DISABLE_PARTLY _IO(GOODIX_MAGIC_NUMBER, 4)
  401. /*#define SET_ENABLED_GESTURE (_IOW(GOODIX_MAGIC_NUMBER, 5, u8) & NEGLECT_SIZE_MASK)*/
  402. #define GESTURE_DATA_OBTAIN (_IOR(GOODIX_MAGIC_NUMBER, 6, u8) & NEGLECT_SIZE_MASK)
  403. #define GESTURE_DATA_ERASE _IO(GOODIX_MAGIC_NUMBER, 7)
  404. /*#define HOTKNOT_LOAD_SUBSYSTEM (_IOW(GOODIX_MAGIC_NUMBER, 6, u8) & NEGLECT_SIZE_MASK)*/
  405. #define HOTKNOT_LOAD_HOTKNOT _IO(GOODIX_MAGIC_NUMBER, 20)
  406. #define HOTKNOT_LOAD_AUTHENTICATION _IO(GOODIX_MAGIC_NUMBER, 21)
  407. #define HOTKNOT_RECOVERY_MAIN _IO(GOODIX_MAGIC_NUMBER, 22)
  408. /*#define HOTKNOT_BLOCK_RW (_IOW(GOODIX_MAGIC_NUMBER, 6, u8) & NEGLECT_SIZE_MASK)*/
  409. #define HOTKNOT_DEVICES_PAIRED _IO(GOODIX_MAGIC_NUMBER, 23)
  410. #define HOTKNOT_MASTER_SEND _IO(GOODIX_MAGIC_NUMBER, 24)
  411. #define HOTKNOT_SLAVE_RECEIVE _IO(GOODIX_MAGIC_NUMBER, 25)
  412. /*#define HOTKNOT_DEVICES_COMMUNICATION*/
  413. #define HOTKNOT_MASTER_DEPARTED _IO(GOODIX_MAGIC_NUMBER, 26)
  414. #define HOTKNOT_SLAVE_DEPARTED _IO(GOODIX_MAGIC_NUMBER, 27)
  415. #define HOTKNOT_WAKEUP_BLOCK _IO(GOODIX_MAGIC_NUMBER, 29)
  416. #define IO_IIC_READ (_IOR(GOODIX_MAGIC_NUMBER, 100, u8) & NEGLECT_SIZE_MASK)
  417. #define IO_IIC_WRITE (_IOW(GOODIX_MAGIC_NUMBER, 101, u8) & NEGLECT_SIZE_MASK)
  418. #define IO_RESET_GUITAR _IO(GOODIX_MAGIC_NUMBER, 102)
  419. #define IO_DISABLE_IRQ _IO(GOODIX_MAGIC_NUMBER, 103)
  420. #define IO_ENABLE_IRQ _IO(GOODIX_MAGIC_NUMBER, 104)
  421. #define IO_GET_VERSION (_IOR(GOODIX_MAGIC_NUMBER, 110, u8) & NEGLECT_SIZE_MASK)
  422. #define IO_PRINT (_IOW(GOODIX_MAGIC_NUMBER, 111, u8) & NEGLECT_SIZE_MASK)
  423. #define IO_VERSION "V1.0-20140709"
  424. #ifdef CONFIG_COMPAT
  425. #define COMPAT_GESTURE_ENABLE_TOTALLY _IO(GOODIX_MAGIC_NUMBER, 1) /*1*/
  426. #define COMPAT_GESTURE_DISABLE_TOTALLY _IO(GOODIX_MAGIC_NUMBER, 2)
  427. #define COMPAT_GESTURE_ENABLE_PARTLY _IO(GOODIX_MAGIC_NUMBER, 3)
  428. #define COMPAT_GESTURE_DISABLE_PARTLY _IO(GOODIX_MAGIC_NUMBER, 4)
  429. /*#define SET_ENABLED_GESTURE (_IOW(GOODIX_MAGIC_NUMBER, 5, u8) & NEGLECT_SIZE_MASK)*/
  430. #define COMPAT_GESTURE_DATA_OBTAIN (_IOR(GOODIX_MAGIC_NUMBER, 6, u8) & NEGLECT_SIZE_MASK)
  431. #define COMPAT_GESTURE_DATA_ERASE _IO(GOODIX_MAGIC_NUMBER, 7)
  432. /*#define HOTKNOT_LOAD_SUBSYSTEM (_IOW(GOODIX_MAGIC_NUMBER, 6, u8) & NEGLECT_SIZE_MASK)*/
  433. #define COMPAT_HOTKNOT_LOAD_HOTKNOT _IO(GOODIX_MAGIC_NUMBER, 20)
  434. #define COMPAT_HOTKNOT_LOAD_AUTHENTICATION _IO(GOODIX_MAGIC_NUMBER, 21)
  435. #define COMPAT_HOTKNOT_RECOVERY_MAIN _IO(GOODIX_MAGIC_NUMBER, 22)
  436. /*#define HOTKNOT_BLOCK_RW (_IOW(GOODIX_MAGIC_NUMBER, 6, u8) & NEGLECT_SIZE_MASK)*/
  437. #define COMPAT_HOTKNOT_DEVICES_PAIRED _IO(GOODIX_MAGIC_NUMBER, 23)
  438. #define COMPAT_HOTKNOT_MASTER_SEND _IO(GOODIX_MAGIC_NUMBER, 24)
  439. #define COMPAT_HOTKNOT_SLAVE_RECEIVE _IO(GOODIX_MAGIC_NUMBER, 25)
  440. /*#define HOTKNOT_DEVICES_COMMUNICATION*/
  441. #define COMPAT_HOTKNOT_MASTER_DEPARTED _IO(GOODIX_MAGIC_NUMBER, 26)
  442. #define COMPAT_HOTKNOT_SLAVE_DEPARTED _IO(GOODIX_MAGIC_NUMBER, 27)
  443. #define COMPAT_HOTKNOT_WAKEUP_BLOCK _IO(GOODIX_MAGIC_NUMBER, 29)
  444. #define COMPAT_IO_IIC_READ (_IOR(GOODIX_MAGIC_NUMBER, 100, u8) & NEGLECT_SIZE_MASK)
  445. #define COMPAT_IO_IIC_WRITE (_IOW(GOODIX_MAGIC_NUMBER, 101, u8) & NEGLECT_SIZE_MASK)
  446. #define COMPAT_IO_RESET_GUITAR _IO(GOODIX_MAGIC_NUMBER, 102)
  447. #define COMPAT_IO_DISABLE_IRQ _IO(GOODIX_MAGIC_NUMBER, 103)
  448. #define COMPAT_IO_ENABLE_IRQ _IO(GOODIX_MAGIC_NUMBER, 104)
  449. #define COMPAT_IO_GET_VERSION (_IOR(GOODIX_MAGIC_NUMBER, 110, u8) & NEGLECT_SIZE_MASK)
  450. #define COMPAT_IO_PRINT (_IOW(GOODIX_MAGIC_NUMBER, 111, u8) & NEGLECT_SIZE_MASK)
  451. #endif
  452. #define CMD_HEAD_LENGTH 20
  453. static s32 io_iic_read(u8 *data, void __user *arg)
  454. {
  455. s32 err = ERROR;
  456. s32 data_length = 0;
  457. u16 addr = 0;
  458. err = copy_from_user(data, arg, CMD_HEAD_LENGTH);
  459. if (err) {
  460. GTP_DEBUG("Can't access the memory.");
  461. return ERROR_MEM;
  462. }
  463. addr = data[0] << 8 | data[1];
  464. data_length = data[2] << 8 | data[3];
  465. err = gt1x_i2c_read(addr, &data[CMD_HEAD_LENGTH], data_length);
  466. if (!err) {
  467. err = copy_to_user(&((u8 __user *) arg)[CMD_HEAD_LENGTH], &data[CMD_HEAD_LENGTH], data_length);
  468. if (err) {
  469. GTP_ERROR("ERROR when copy to user.[addr: %04x], [read length:%d]", addr, data_length);
  470. return ERROR_MEM;
  471. }
  472. err = CMD_HEAD_LENGTH + data_length;
  473. }
  474. GTP_DEBUG("IIC_READ.addr:0x%4x, length:%d, ret:%d", addr, data_length, err);
  475. GTP_DEBUG_ARRAY((&data[CMD_HEAD_LENGTH]), data_length);
  476. return err;
  477. }
  478. static s32 io_iic_write(u8 *data)
  479. {
  480. s32 err = ERROR;
  481. s32 data_length = 0;
  482. u16 addr = 0;
  483. addr = data[0] << 8 | data[1];
  484. data_length = data[2] << 8 | data[3];
  485. err = gt1x_i2c_write(addr, &data[CMD_HEAD_LENGTH], data_length);
  486. if (!err)
  487. err = CMD_HEAD_LENGTH + data_length;
  488. GTP_DEBUG("IIC_WRITE.addr:0x%4x, length:%d, ret:%d", addr, data_length, err);
  489. GTP_DEBUG_ARRAY((&data[CMD_HEAD_LENGTH]), data_length);
  490. return err;
  491. }
  492. /*@return, 0:operate successfully
  493. / > 0: the length of memory size ioctl has accessed,
  494. / error otherwise.*/
  495. static long gt1x_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  496. {
  497. u32 value = 0;
  498. s32 ret = 0; /*the initial value must be 0*/
  499. u8 *data = NULL;
  500. static struct ratelimit_state ratelimit = {
  501. .lock = __RAW_SPIN_LOCK_UNLOCKED(ratelimit.lock),
  502. .interval = HZ/2,
  503. .burst = 1,
  504. .begin = 1,
  505. };
  506. GTP_DEBUG("IOCTL CMD:%x", cmd);
  507. /*GTP_DEBUG("command:%d, length:%d, rw:%s", _IOC_NR(cmd), _IOC_SIZE(cmd),
  508. (_IOC_DIR(cmd) & _IOC_READ) ? "read" : (_IOC_DIR(cmd) & _IOC_WRITE) ? "write" : "-");*/
  509. if (_IOC_DIR(cmd)) {
  510. s32 err = -1;
  511. s32 data_length = _IOC_SIZE(cmd);
  512. data = kzalloc(data_length, GFP_KERNEL);
  513. memset(data, 0, data_length);
  514. if (_IOC_DIR(cmd) & _IOC_WRITE) {
  515. err = copy_from_user(data, (void __user *)arg, data_length);
  516. if (err) {
  517. GTP_DEBUG("Can't access the memory.");
  518. kfree(data);
  519. return -1;
  520. }
  521. }
  522. } else {
  523. value = (u32) arg;
  524. }
  525. switch (cmd & NEGLECT_SIZE_MASK) {
  526. case IO_GET_VERSION:
  527. if ((u8 __user *) arg) {
  528. ret = copy_to_user(((u8 __user *) arg), IO_VERSION, sizeof(IO_VERSION));
  529. if (!ret)
  530. ret = sizeof(IO_VERSION);
  531. GTP_INFO("%s", IO_VERSION);
  532. }
  533. break;
  534. case IO_IIC_READ:
  535. if (1 == gt1x_is_tpd_halt()) {
  536. if (__ratelimit(&ratelimit))
  537. GTP_ERROR("touch is suspended.");
  538. break;
  539. }
  540. ret = io_iic_read(data, (void __user *)arg);
  541. break;
  542. case IO_IIC_WRITE:
  543. if (1 == gt1x_is_tpd_halt()) {
  544. if (__ratelimit(&ratelimit))
  545. GTP_ERROR("touch is suspended.");
  546. break;
  547. }
  548. ret = io_iic_write(data);
  549. break;
  550. case IO_RESET_GUITAR:
  551. gt1x_reset_guitar();
  552. break;
  553. case IO_DISABLE_IRQ:
  554. gt1x_irq_disable();
  555. #ifdef CONFIG_GTP_ESD_PROTECT
  556. gt1x_esd_switch(SWITCH_OFF);
  557. #endif
  558. break;
  559. case IO_ENABLE_IRQ:
  560. gt1x_irq_enable();
  561. #ifdef CONFIG_GTP_ESD_PROTECT
  562. gt1x_esd_switch(SWITCH_ON);
  563. #endif
  564. break;
  565. /*print a string to syc log messages between application and kernel.*/
  566. case IO_PRINT:
  567. if (data)
  568. GTP_INFO("%s", (char *)data);
  569. break;
  570. #ifdef CONFIG_GTP_GESTURE_WAKEUP
  571. case GESTURE_ENABLE_TOTALLY:
  572. GTP_DEBUG("ENABLE_GESTURE_TOTALLY");
  573. gesture_enabled = (is_all_dead(gestures_flag, sizeof(gestures_flag)) ? 0 : 1);
  574. break;
  575. case GESTURE_DISABLE_TOTALLY:
  576. GTP_DEBUG("DISABLE_GESTURE_TOTALLY");
  577. gesture_enabled = 0;
  578. break;
  579. case GESTURE_ENABLE_PARTLY:
  580. SETBIT(gestures_flag, (u8) value);
  581. gesture_enabled = 1;
  582. GTP_DEBUG("ENABLE_GESTURE_PARTLY, gesture = 0x%02X, gesture_enabled = %d", value, gesture_enabled);
  583. break;
  584. case GESTURE_DISABLE_PARTLY:
  585. ret = QUERYBIT(gestures_flag, (u8) value);
  586. if (!ret)
  587. break;
  588. CLEARBIT(gestures_flag, (u8) value);
  589. if (is_all_dead(gestures_flag, sizeof(gestures_flag)))
  590. gesture_enabled = 0;
  591. GTP_DEBUG("DISABLE_GESTURE_PARTLY, gesture = 0x%02X, gesture_enabled = %d", value, gesture_enabled);
  592. break;
  593. case GESTURE_DATA_OBTAIN:
  594. GTP_DEBUG("OBTAIN_GESTURE_DATA");
  595. mutex_lock(&gesture_data_mutex);
  596. if (gesture_data.data[1] > GESTURE_MAX_POINT_COUNT)
  597. gesture_data.data[1] = GESTURE_MAX_POINT_COUNT;
  598. if (gesture_data.data[3] > 80)
  599. gesture_data.data[3] = 80;
  600. ret =
  601. copy_to_user(((u8 __user *) arg), &gesture_data.data,
  602. 4 + gesture_data.data[1] * 4 + gesture_data.data[3]);
  603. mutex_unlock(&gesture_data_mutex);
  604. if (ret) {
  605. GTP_ERROR("ERROR when copy gesture data to user.");
  606. ret = ERROR_MEM;
  607. } else {
  608. ret = 4 + gesture_data.data[1] * 4 + gesture_data.data[3];
  609. }
  610. break;
  611. case GESTURE_DATA_ERASE:
  612. GTP_DEBUG("ERASE_GESTURE_DATA");
  613. gesture_clear_wakeup_data();
  614. break;
  615. #endif /*CONFIG_GTP_GESTURE_WAKEUP*/
  616. #ifdef CONFIG_GTP_HOTKNOT
  617. case HOTKNOT_LOAD_HOTKNOT:
  618. ret = hotknot_load_hotknot_subsystem();
  619. break;
  620. case HOTKNOT_LOAD_AUTHENTICATION:
  621. if (1 == gt1x_is_tpd_halt()) {
  622. GTP_ERROR("touch is suspended.");
  623. break;
  624. }
  625. #ifdef CONFIG_GTP_ESD_PROTECT
  626. gt1x_esd_switch(SWITCH_ON);
  627. #endif
  628. ret = hotknot_load_authentication_subsystem();
  629. break;
  630. case HOTKNOT_RECOVERY_MAIN:
  631. if (1 == gt1x_is_tpd_halt()) {
  632. GTP_ERROR("touch is suspended.");
  633. break;
  634. }
  635. ret = hotknot_recovery_main_system();
  636. break;
  637. #ifdef CONFIG_HOTKNOT_BLOCK_RW
  638. case HOTKNOT_DEVICES_PAIRED:
  639. hotknot_paired_flag = 0;
  640. force_wake_flag = 0;
  641. block_enable = 1;
  642. ret = hotknot_block_rw(HN_DEVICE_PAIRED, (s32) value);
  643. break;
  644. case HOTKNOT_MASTER_SEND:
  645. ret = hotknot_block_rw(HN_MASTER_SEND, (s32) value);
  646. if (!ret)
  647. ret = got_hotknot_extra_state;
  648. break;
  649. case HOTKNOT_SLAVE_RECEIVE:
  650. ret = hotknot_block_rw(HN_SLAVE_RECEIVED, (s32) value);
  651. if (!ret)
  652. ret = got_hotknot_extra_state;
  653. break;
  654. case HOTKNOT_MASTER_DEPARTED:
  655. ret = hotknot_block_rw(HN_MASTER_DEPARTED, (s32) value);
  656. break;
  657. case HOTKNOT_SLAVE_DEPARTED:
  658. ret = hotknot_block_rw(HN_SLAVE_DEPARTED, (s32) value);
  659. break;
  660. case HOTKNOT_WAKEUP_BLOCK:
  661. hotknot_wakeup_block();
  662. break;
  663. #endif /*CONFIG_HOTKNOT_BLOCK_RW*/
  664. #endif /*CONFIG_GTP_HOTKNOT*/
  665. default:
  666. GTP_INFO("Unknown cmd.");
  667. ret = -1;
  668. break;
  669. }
  670. if (data != NULL)
  671. kfree(data);
  672. return ret;
  673. }
  674. #ifdef CONFIG_GTP_HOTKNOT
  675. #ifdef CONFIG_COMPAT
  676. static long gt1x_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  677. {
  678. long ret;
  679. void __user *arg32 = NULL;
  680. GTP_DEBUG("gt1x_compat_ioctl cmd = %x, arg: 0x%lx\n", cmd, arg);
  681. arg32 = compat_ptr(arg);
  682. if (!file->f_op || !file->f_op->unlocked_ioctl)
  683. return -ENOTTY;
  684. /*GTP_DEBUG("gt1x_compat_ioctl arg: 0x%lx, arg32: 0x%p\n",arg, arg32);*/
  685. switch (cmd & NEGLECT_SIZE_MASK) {
  686. case COMPAT_IO_GET_VERSION:
  687. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_IO_GET_VERSION\n");*/
  688. if (arg32 == NULL) {
  689. GTP_ERROR("invalid argument.");
  690. return -EINVAL;
  691. }
  692. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  693. break;
  694. case COMPAT_IO_IIC_READ:
  695. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_IO_IIC_READ\n");*/
  696. if (arg32 == NULL) {
  697. GTP_ERROR("invalid argument.");
  698. return -EINVAL;
  699. }
  700. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  701. break;
  702. case COMPAT_IO_IIC_WRITE:
  703. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_IO_IIC_WRITE\n");*/
  704. if (arg32 == NULL) {
  705. GTP_ERROR("invalid argument.");
  706. return -EINVAL;
  707. }
  708. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  709. break;
  710. case COMPAT_IO_RESET_GUITAR:
  711. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_IO_RESET_GUITAR\n");*/
  712. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  713. break;
  714. case COMPAT_IO_DISABLE_IRQ:
  715. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_IO_DISABLE_IRQ\n");*/
  716. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  717. break;
  718. case COMPAT_IO_ENABLE_IRQ:
  719. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_IO_ENABLE_IRQ\n");*/
  720. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  721. break;
  722. case COMPAT_IO_PRINT:
  723. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_IO_PRINT\n");*/
  724. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  725. break;
  726. case COMPAT_GESTURE_ENABLE_TOTALLY:
  727. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_GESTURE_ENABLE_TOTALLY\n");*/
  728. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  729. break;
  730. case COMPAT_GESTURE_DISABLE_TOTALLY:
  731. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_GESTURE_DISABLE_TOTALLY\n");*/
  732. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  733. break;
  734. case COMPAT_GESTURE_ENABLE_PARTLY:
  735. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_GESTURE_ENABLE_PARTLY\n");*/
  736. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  737. break;
  738. case COMPAT_GESTURE_DISABLE_PARTLY:
  739. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_GESTURE_DISABLE_PARTLY\n");*/
  740. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  741. break;
  742. case COMPAT_GESTURE_DATA_OBTAIN:
  743. if (arg32 == NULL) {
  744. GTP_ERROR("invalid argument.");
  745. return -EINVAL;
  746. }
  747. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_GESTURE_DATA_OBTAIN\n");*/
  748. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  749. break;
  750. case COMPAT_GESTURE_DATA_ERASE:
  751. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_GESTURE_DATA_ERASE\n");*/
  752. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  753. break;
  754. case COMPAT_HOTKNOT_LOAD_HOTKNOT:
  755. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_HOTKNOT_LOAD_HOTKNOT\n");*/
  756. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  757. break;
  758. case COMPAT_HOTKNOT_LOAD_AUTHENTICATION:
  759. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_HOTKNOT_LOAD_AUTHENTICATION\n");*/
  760. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  761. break;
  762. case COMPAT_HOTKNOT_RECOVERY_MAIN:
  763. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_HOTKNOT_RECOVERY_MAIN\n");*/
  764. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  765. break;
  766. case COMPAT_HOTKNOT_DEVICES_PAIRED:
  767. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_HOTKNOT_DEVICES_PAIRED\n");*/
  768. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  769. break;
  770. case COMPAT_HOTKNOT_MASTER_SEND:
  771. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_HOTKNOT_MASTER_SEND\n");*/
  772. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  773. break;
  774. case COMPAT_HOTKNOT_SLAVE_RECEIVE:
  775. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_HOTKNOT_SLAVE_RECEIVE\n");*/
  776. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  777. break;
  778. case COMPAT_HOTKNOT_MASTER_DEPARTED:
  779. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_HOTKNOT_MASTER_DEPARTED\n");*/
  780. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  781. break;
  782. case COMPAT_HOTKNOT_SLAVE_DEPARTED:
  783. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_HOTKNOT_SLAVE_DEPARTED\n");*/
  784. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  785. break;
  786. case COMPAT_HOTKNOT_WAKEUP_BLOCK:
  787. /*GTP_DEBUG("gt1x_compat_ioctl COMPAT_HOTKNOT_WAKEUP_BLOCK\n");*/
  788. ret = file->f_op->unlocked_ioctl(file, cmd, (unsigned long)arg32);
  789. break;
  790. default:
  791. GTP_INFO("Unknown cmd.");
  792. ret = -1;
  793. break;
  794. }
  795. return ret;
  796. }
  797. #endif
  798. #endif
  799. static const struct file_operations gt1x_fops = {
  800. .owner = THIS_MODULE,
  801. #ifdef CONFIG_GTP_GESTURE_WAKEUP
  802. .read = gt1x_gesture_data_read,
  803. .write = gt1x_gesture_data_write,
  804. #endif
  805. .unlocked_ioctl = gt1x_ioctl,
  806. };
  807. #ifdef CONFIG_GTP_HOTKNOT
  808. static const struct file_operations hotknot_fops = {
  809. .unlocked_ioctl = gt1x_ioctl,
  810. .open = hotknot_open,
  811. .release = hotknot_release,
  812. #ifdef CONFIG_COMPAT
  813. .compat_ioctl = gt1x_compat_ioctl,
  814. #endif
  815. };
  816. static struct miscdevice hotknot_misc_device = {
  817. .minor = MISC_DYNAMIC_MINOR,
  818. .name = HOTKNOT_NODE,
  819. .fops = &hotknot_fops,
  820. };
  821. #endif
  822. s32 gt1x_init_node(void)
  823. {
  824. #ifdef CONFIG_GTP_GESTURE_WAKEUP
  825. struct proc_dir_entry *proc_entry = NULL;
  826. mutex_init(&gesture_data_mutex);
  827. memset(gestures_flag, 0, sizeof(gestures_flag));
  828. memset((u8 *) &gesture_data, 0, sizeof(st_gesture_data));
  829. proc_entry = proc_create(GESTURE_NODE, 0666, NULL, &gt1x_fops);
  830. if (proc_entry == NULL) {
  831. GTP_ERROR("Couldn't create proc entry[GESTURE_NODE]!");
  832. return -1;
  833. }
  834. GTP_INFO("Create proc entry[GESTURE_NODE] success!");
  835. #endif
  836. #ifdef CONFIG_GTP_HOTKNOT
  837. if (misc_register(&hotknot_misc_device)) {
  838. GTP_ERROR("Couldn't create [HOTKNOT_NODE] device!");
  839. return -1;
  840. }
  841. GTP_INFO("Create [HOTKNOT_NODE] device success!");
  842. #endif
  843. return 0;
  844. }
  845. void gt1x_deinit_node(void)
  846. {
  847. #ifdef CONFIG_GTP_GESTURE_WAKEUP
  848. remove_proc_entry(GESTURE_NODE, NULL);
  849. #endif
  850. #ifdef CONFIG_GTP_HOTKNOT
  851. misc_deregister(&hotknot_misc_device);
  852. #endif
  853. }