fts_gui.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * FTS Capacitive touch screen controller (FingerTipS)
  4. *
  5. * Copyright (C) 2016-2019, STMicroelectronics Limited.
  6. * Authors: AMG(Analog Mems Group) <[email protected]>
  7. *
  8. *
  9. * This program is free software; you can redistribute it and/or modify it
  10. * under the terms of the GNU General Public License version 2 as published by
  11. * the Free Software Foundation.
  12. *
  13. * This program is distributed in the hope that it will be useful, but WITHOUT
  14. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  15. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  16. * more details.
  17. *
  18. * You should have received a copy of the GNU General Public License along with
  19. * this program. If not, see <http://www.gnu.org/licenses/>.
  20. */
  21. #include <linux/device.h>
  22. #include <linux/init.h>
  23. #include <linux/kernel.h>
  24. #include <linux/module.h>
  25. #include <linux/slab.h>
  26. #include <linux/input.h>
  27. #include <linux/input/mt.h>
  28. #include <linux/interrupt.h>
  29. #include <linux/hrtimer.h>
  30. #include <linux/delay.h>
  31. #include <linux/firmware.h>
  32. #include <linux/i2c.h>
  33. #include <linux/i2c-dev.h>
  34. #include <linux/completion.h>
  35. //#include <linux/wakelock.h>
  36. #include <linux/pm_wakeup.h>
  37. #include <linux/gpio.h>
  38. #include <linux/of_gpio.h>
  39. #include <linux/regulator/consumer.h>
  40. #include "fts.h"
  41. #include "fts_lib/ftsIO.h"
  42. #ifdef SCRIPTLESS
  43. static unsigned int fts_data[CMD_RESULT_STR_LEN] = {0};
  44. static unsigned char fts_pAddress_i2c[CMD_RESULT_STR_LEN] = {0};
  45. static int byte_count_read;
  46. static char Out_buff[TSP_BUF_SIZE];
  47. /*I2C CMd functions: functions to interface with GUI without script */
  48. ssize_t fts_i2c_wr_show(struct device *dev,
  49. struct device_attribute *attr, char *buf)
  50. {
  51. struct i2c_client *client = to_i2c_client(dev);
  52. struct fts_ts_info *info = i2c_get_clientdata(client);
  53. int i;
  54. char buff[16];
  55. memset(Out_buff, 0x00, sizeof(Out_buff));
  56. if (byte_count_read == 0) {
  57. snprintf(Out_buff, sizeof(Out_buff), "{FAILED}\n");
  58. return snprintf(buf, TSP_BUF_SIZE, "%s\n", Out_buff);
  59. }
  60. #ifdef SCRIPTLESS_DEBUG
  61. pr_err("%s:DATA READ {\n", __func__);
  62. for (i = 0; i < byte_count_read; i++) {
  63. pr_err(" %02X\n", (unsigned int)info->cmd_wr_result[i]);
  64. if (i < (byte_count_read - 1))
  65. pr_err("\n");
  66. }
  67. pr_err("}\n");
  68. #endif
  69. snprintf(buff, sizeof(buff), "{");
  70. strlcat(Out_buff, buff, sizeof(Out_buff));
  71. for (i = 0; i < (byte_count_read + 2); i++) {
  72. char temp_byte_count_read;
  73. if (i == 0) {
  74. temp_byte_count_read = (byte_count_read >> 8) & 0xFF;
  75. snprintf(buff, sizeof(buff), "%02X",
  76. temp_byte_count_read);
  77. } else if (i == 1) {
  78. temp_byte_count_read = (byte_count_read) & 0xFF;
  79. snprintf(buff, sizeof(buff), "%02X",
  80. temp_byte_count_read);
  81. } else {
  82. snprintf(buff, sizeof(buff), "%02X",
  83. info->cmd_wr_result[i-2]);
  84. }
  85. //snprintf(buff, sizeof(buff), "%02X", info->cmd_wr_result[i]);
  86. strlcat(Out_buff, buff, sizeof(Out_buff));
  87. if (i < (byte_count_read + 1)) {
  88. snprintf(buff, sizeof(buff), " ");
  89. strlcat(Out_buff, buff, sizeof(Out_buff));
  90. }
  91. }
  92. snprintf(buff, sizeof(buff), "}");
  93. strlcat(Out_buff, buff, sizeof(Out_buff));
  94. return snprintf(buf, TSP_BUF_SIZE, "%s\n", Out_buff);
  95. }
  96. ssize_t fts_i2c_wr_store(struct device *dev, struct device_attribute *attr,
  97. const char *buf, size_t count)
  98. {
  99. int ret;
  100. struct i2c_client *client = to_i2c_client(dev);
  101. struct fts_ts_info *info = i2c_get_clientdata(client);
  102. unsigned char pAddress[9];
  103. unsigned int byte_count = 0;
  104. int i;
  105. unsigned int data[9];
  106. memset(data, 0x00, sizeof(data));
  107. memset(pAddress, 0x00, sizeof(pAddress));
  108. memset(info->cmd_wr_result, 0x00, CMD_RESULT_STR_LEN);
  109. ret = sscanf(buf, "%x %x %x %x %x %x %x %x %x ",
  110. (data + 8), (data), (data + 1), (data + 2), (data + 3),
  111. (data + 4), (data + 5), (data + 6), (data + 7));
  112. byte_count = data[8];
  113. /**
  114. * if(sizeof(buf) != byte_count )
  115. * {
  116. * printk("%s : Byte count is wrong\n",__func__);
  117. * return count;
  118. * }
  119. */
  120. if (byte_count > sizeof(pAddress))
  121. return -EINVAL;
  122. #ifdef SCRIPTLESS_DEBUG
  123. pr_err("%s: Input Data 1:\n", __func__);
  124. for (i = 0 ; i < byte_count; i++) {
  125. pr_err(" %02X\n", data[i]);
  126. pAddress[i] = (unsigned char)data[i];
  127. }
  128. pr_err("\n");
  129. #else
  130. for (i = 0 ; i < byte_count; i++)
  131. pAddress[i] = (unsigned char)data[i];
  132. #endif
  133. byte_count_read = (((unsigned int)data[byte_count - 2]) << 8)
  134. | data[byte_count - 1];
  135. ret = fts_writeCmd(pAddress, 3);
  136. msleep(20);
  137. ret = fts_readCmd(&pAddress[3], (byte_count - 5),
  138. info->cmd_wr_result, byte_count_read);
  139. #ifdef SCRIPTLESS_DEBUG
  140. pr_err("%s:DATA READ {\n", __func__);
  141. for (i = 0; i < (2 + byte_count_read); i++) {
  142. char temp_byte_count_read;
  143. if (i == 0) {
  144. temp_byte_count_read = (byte_count_read >> 8) & 0xFF;
  145. pr_err("%02X\n", (unsigned int)temp_byte_count_read);
  146. } else if (i == 1) {
  147. temp_byte_count_read = (byte_count_read) & 0xFF;
  148. pr_err("%02X\n", (unsigned int)temp_byte_count_read);
  149. } else {
  150. pr_err("%02X\n",
  151. (unsigned int)info->cmd_read_result[i - 2]);
  152. }
  153. if (i < (byte_count_read + 1))
  154. pr_err("\n");
  155. }
  156. pr_err("}\n");
  157. #endif
  158. if (ret)
  159. dev_err(dev, "Unable to read register\n");
  160. return count;
  161. }
  162. ssize_t fts_i2c_read_show(struct device *dev,
  163. struct device_attribute *attr, char *buf)
  164. {
  165. struct i2c_client *client = to_i2c_client(dev);
  166. struct fts_ts_info *info = i2c_get_clientdata(client);
  167. int i;
  168. char buff[16];
  169. memset(Out_buff, 0x00, sizeof(Out_buff));
  170. if (byte_count_read == 0) {
  171. snprintf(Out_buff, sizeof(Out_buff), "{FAILED}");
  172. return snprintf(buf, TSP_BUF_SIZE, "%s\n", Out_buff);
  173. }
  174. #ifdef SCRIPTLESS_DEBUG
  175. pr_err("%s:DATA READ {\n", __func__);
  176. for (i = 0; i < byte_count_read; i++) {
  177. pr_err("%02X\n", (unsigned int)info->cmd_read_result[i]);
  178. if (i < (byte_count_read - 1))
  179. pr_err("\n");
  180. }
  181. pr_err("}\n");
  182. #endif
  183. snprintf(buff, sizeof(buff), "{");
  184. strlcat(Out_buff, buff, sizeof(Out_buff));
  185. for (i = 0; i < (byte_count_read + 2); i++) {
  186. char temp_byte_count_read;
  187. if (i == 0) {
  188. temp_byte_count_read = (byte_count_read >> 8) & 0xFF;
  189. snprintf(buff, sizeof(buff), "%02X",
  190. temp_byte_count_read);
  191. } else if (i == 1) {
  192. temp_byte_count_read = (byte_count_read) & 0xFF;
  193. snprintf(buff, sizeof(buff), "%02X",
  194. temp_byte_count_read);
  195. } else {
  196. snprintf(buff, sizeof(buff), "%02X",
  197. info->cmd_read_result[i - 2]);
  198. }
  199. strlcat(Out_buff, buff, sizeof(Out_buff));
  200. if (i < (byte_count_read + 1)) {
  201. snprintf(buff, sizeof(buff), " ");
  202. strlcat(Out_buff, buff, sizeof(Out_buff));
  203. }
  204. }
  205. snprintf(buff, sizeof(buff), "}");
  206. strlcat(Out_buff, buff, sizeof(Out_buff));
  207. return snprintf(buf, TSP_BUF_SIZE, "%s\n", Out_buff);
  208. }
  209. ssize_t fts_i2c_read_store(struct device *dev, struct device_attribute *attr,
  210. const char *buf, size_t count)
  211. {
  212. int ret;
  213. struct i2c_client *client = to_i2c_client(dev);
  214. struct fts_ts_info *info = i2c_get_clientdata(client);
  215. unsigned char pAddress[9];
  216. unsigned int byte_count = 0;
  217. int i;
  218. unsigned int data[9];
  219. byte_count_read = 0;
  220. memset(data, 0x00, sizeof(data));
  221. memset(pAddress, 0x00, sizeof(pAddress));
  222. memset(info->cmd_read_result, 0x00, CMD_RESULT_STR_LEN);
  223. ret = sscanf(buf, "%x %x %x %x %x %x %x %x %x ",
  224. (data + 8), (data), (data + 1), (data + 2), (data + 3),
  225. (data + 4), (data + 5), (data + 6), (data + 7));
  226. byte_count = data[8];
  227. if (byte_count > 8) {
  228. #ifdef SCRIPTLESS_DEBUG
  229. pr_err("%s:Byte count is more than 8\n", __func__);
  230. #endif
  231. return count;
  232. }
  233. /*if(sizeof(buf) != byte_count )*/
  234. /*{*/
  235. /* printk("%s : Byte count is wrong\n",__func__);*/
  236. /* return count;*/
  237. /*}*/
  238. #ifdef SCRIPTLESS_DEBUG
  239. pr_err("%s: Input Data 1:\n", __func__);
  240. for (i = 0 ; i < byte_count; i++) {
  241. pr_err("%02X\n", data[i]);
  242. pAddress[i] = (unsigned char)data[i];
  243. }
  244. pr_err("\n");
  245. #else
  246. for (i = 0 ; i < byte_count; i++)
  247. pAddress[i] = (unsigned char)data[i];
  248. #endif
  249. byte_count_read = (((unsigned int)data[byte_count - 2]) << 8)
  250. | data[byte_count - 1];
  251. ret = fts_readCmd(pAddress, (byte_count - 2), info->cmd_read_result,
  252. byte_count_read);
  253. #ifdef SCRIPTLESS_DEBUG
  254. pr_err("%s:DATA READ\n{\n", __func__);
  255. for (i = 0; i < (byte_count_read + 2); i++) {
  256. char temp_byte_count_read;
  257. if (i == 0) {
  258. temp_byte_count_read = (byte_count_read >> 8) & 0xFF;
  259. pr_err("%02X\n", (unsigned int)temp_byte_count_read);
  260. } else if (i == 1) {
  261. temp_byte_count_read = (byte_count_read) & 0xFF;
  262. pr_err("%02X\n", (unsigned int)temp_byte_count_read);
  263. } else {
  264. pr_err("%02X\n",
  265. (unsigned int)info->cmd_read_result[i - 2]);
  266. }
  267. if (i < (byte_count_read + 1))
  268. pr_err("\n");
  269. }
  270. pr_err("}\n");
  271. #endif
  272. if (ret)
  273. dev_err(dev, "Unable to read register\n");
  274. return count;
  275. }
  276. ssize_t fts_i2c_write_show(struct device *dev,
  277. struct device_attribute *attr, char *buf)
  278. {
  279. struct i2c_client *client = to_i2c_client(dev);
  280. struct fts_ts_info *info = i2c_get_clientdata(client);
  281. return snprintf(buf, TSP_BUF_SIZE, "%s", info->cmd_write_result);
  282. }
  283. ssize_t fts_i2c_write_store(struct device *dev, struct device_attribute *attr,
  284. const char *buf, size_t count)
  285. {
  286. int ret;
  287. struct i2c_client *client = to_i2c_client(dev);
  288. struct fts_ts_info *info = i2c_get_clientdata(client);
  289. unsigned int byte_count = 0;
  290. int i;
  291. unsigned int *data = &fts_data[0];
  292. memset(fts_data, 0x00, sizeof(fts_data));
  293. memset(fts_pAddress_i2c, 0x00, sizeof(fts_pAddress_i2c));
  294. memset(info->cmd_write_result, 0x00, sizeof(info->cmd_write_result));
  295. ret = sscanf(buf, "%x %x", data, (data + 1));
  296. if (ret != 2)
  297. return -EINVAL;
  298. byte_count = data[0] << 8 | data[1];
  299. if (byte_count <= sizeof(fts_pAddress_i2c)) {
  300. for (i = 0; i < (byte_count); i++) {
  301. ret = sscanf(&buf[3 * (i + 2)], "%x ", (data + i));
  302. if (ret != 1)
  303. return -EINVAL;
  304. }
  305. } else {
  306. #ifdef SCRIPTLESS_DEBUG
  307. pr_err("%s:message size is > allowed limit of 512 bytes\n",
  308. __func__);
  309. #endif
  310. snprintf(info->cmd_write_result, sizeof(info->cmd_write_result),
  311. "{Write NOT OK}\n");
  312. return -EINVAL;
  313. }
  314. #ifdef SCRIPTLESS_DEBUG
  315. pr_err("\n");
  316. pr_err("%s:Byte_count = %02d|Count = %02d |size of buf:%02d\n",
  317. __func__, byte_count, (int)count, (int)sizeof(buf));
  318. pr_err("%s: Input Data 1:\n", __func__);
  319. for (i = 0 ; i < byte_count; i++) {
  320. pr_err(" %02X\n", data[i]);
  321. fts_pAddress_i2c[i] = (unsigned char)data[i];
  322. }
  323. pr_err("\n");
  324. #else
  325. for (i = 0 ; i < byte_count; i++)
  326. fts_pAddress_i2c[i] = (unsigned char)data[i];
  327. #endif
  328. if ((fts_pAddress_i2c[0] == 0xb3) && (fts_pAddress_i2c[3] == 0xb1)) {
  329. ret = fts_writeCmd(fts_pAddress_i2c, 3);
  330. msleep(20);
  331. ret = fts_writeCmd(&fts_pAddress_i2c[3], byte_count-3);
  332. } else
  333. ret = fts_writeCmd(fts_pAddress_i2c, byte_count);
  334. #ifdef SCRIPTLESS_DEBUG
  335. pr_err("%s:DATA :\n", __func__);
  336. for (i = 0; i < byte_count; i++)
  337. pr_err(" %02X\n", (unsigned int)fts_pAddress_i2c[i]);
  338. pr_err(" byte_count: %02X\n", byte_count);
  339. #endif
  340. if (ret < 0) {
  341. dev_err(dev, "{Write NOT OK}\n");
  342. snprintf(info->cmd_write_result, sizeof(info->cmd_write_result),
  343. "{Write NOT OK}\n");
  344. } else {
  345. snprintf(info->cmd_write_result, sizeof(info->cmd_write_result),
  346. "{Write OK}\n");
  347. #ifdef SCRIPTLESS_DEBUG
  348. pr_err("%s : {Write OK}\n", __func__);
  349. #endif
  350. }
  351. return count;
  352. }
  353. static DEVICE_ATTR_RW(fts_i2c_read);
  354. static DEVICE_ATTR_RW(fts_i2c_wr);
  355. static DEVICE_ATTR_RW(fts_i2c_write);
  356. static struct attribute *i2c_cmd_attributes[] = {
  357. &dev_attr_fts_i2c_read.attr,
  358. &dev_attr_fts_i2c_wr.attr,
  359. &dev_attr_fts_i2c_write.attr,
  360. NULL,
  361. };
  362. struct attribute_group i2c_cmd_attr_group = {
  363. .attrs = i2c_cmd_attributes,
  364. };
  365. #endif