fts_sec.c 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852
  1. #ifdef SEC_TSP_FACTORY_TEST
  2. #define TSP_FACTEST_RESULT_PASS 2
  3. #define TSP_FACTEST_RESULT_FAIL 1
  4. #define TSP_FACTEST_RESULT_NONE 0
  5. #define BUFFER_MAX (256 * 1024) - 16
  6. #define READ_CHUNK_SIZE 128 // (2 * 1024) - 16
  7. enum {
  8. TYPE_RAW_DATA = 0,
  9. TYPE_FILTERED_DATA = 2,
  10. TYPE_STRENGTH_DATA = 4,
  11. TYPE_BASELINE_DATA = 6
  12. };
  13. enum {
  14. BUILT_IN = 0,
  15. UMS,
  16. };
  17. enum CMD_STATUS {
  18. CMD_STATUS_WAITING = 0,
  19. CMD_STATUS_RUNNING,
  20. CMD_STATUS_OK,
  21. CMD_STATUS_FAIL,
  22. CMD_STATUS_NOT_APPLICABLE,
  23. };
  24. static void fw_update(void *device_data);
  25. static void get_fw_ver_bin(void *device_data);
  26. static void get_fw_ver_ic(void *device_data);
  27. static void get_config_ver(void *device_data);
  28. static void get_threshold(void *device_data);
  29. static void module_off_master(void *device_data);
  30. static void module_on_master(void *device_data);
  31. static void get_chip_vendor(void *device_data);
  32. static void get_chip_name(void *device_data);
  33. static void get_x_num(void *device_data);
  34. static void get_y_num(void *device_data);
  35. static void run_reference_read(void *device_data);
  36. static void get_reference(void *device_data);
  37. static void run_rawcap_read(void *device_data);
  38. static void get_rawcap(void *device_data);
  39. static void run_delta_read(void *device_data);
  40. static void get_delta(void *device_data);
  41. static void run_abscap_read(void *device_data);
  42. static void run_absdelta_read(void *device_data);
  43. static void run_trx_short_test(void *device_data);
  44. static void get_cx_data(void *device_data);
  45. static void run_cx_data_read(void *device_data);
  46. static void set_tsp_test_result(void *device_data);
  47. static void get_tsp_test_result(void *device_data);
  48. static void hover_enable(void *device_data);
  49. /* static void hover_no_sleep_enable(void *device_data); */
  50. static void glove_mode(void *device_data);
  51. static void get_glove_sensitivity(void *device_data);
  52. static void clear_cover_mode(void *device_data);
  53. static void fast_glove_mode(void *device_data);
  54. static void report_rate(void *device_data);
  55. #if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP)
  56. static void interrupt_control(void *device_data);
  57. #endif
  58. #if defined(TOUCH_BOOSTER_DVFS)
  59. static void boost_level(void *device_data);
  60. #endif
  61. static void not_support_cmd(void *device_data);
  62. static ssize_t store_cmd(struct device *dev, struct device_attribute *devattr,
  63. const char *buf, size_t count);
  64. static ssize_t show_cmd_status(struct device *dev,
  65. struct device_attribute *devattr, char *buf);
  66. static ssize_t show_cmd_result(struct device *dev,
  67. struct device_attribute *devattr, char *buf);
  68. static ssize_t cmd_list_show(struct device *dev,
  69. struct device_attribute *attr, char *buf);
  70. #define FT_CMD(name, func) .cmd_name = name, .cmd_func = func
  71. struct ft_cmd {
  72. struct list_head list;
  73. const char *cmd_name;
  74. void (*cmd_func) (void *device_data);
  75. };
  76. struct ft_cmd ft_cmds[] = {
  77. {FT_CMD("fw_update", fw_update),},
  78. {FT_CMD("get_fw_ver_bin", get_fw_ver_bin),},
  79. {FT_CMD("get_fw_ver_ic", get_fw_ver_ic),},
  80. {FT_CMD("get_config_ver", get_config_ver),},
  81. {FT_CMD("get_threshold", get_threshold),},
  82. {FT_CMD("module_off_master", module_off_master),},
  83. {FT_CMD("module_on_master", module_on_master),},
  84. {FT_CMD("module_off_slave", not_support_cmd),},
  85. {FT_CMD("module_on_slave", not_support_cmd),},
  86. {FT_CMD("get_chip_vendor", get_chip_vendor),},
  87. {FT_CMD("get_chip_name", get_chip_name),},
  88. {FT_CMD("get_x_num", get_x_num),},
  89. {FT_CMD("get_y_num", get_y_num),},
  90. {FT_CMD("run_reference_read", run_reference_read),},
  91. {FT_CMD("get_reference", get_reference),},
  92. {FT_CMD("run_rawcap_read", run_rawcap_read),},
  93. {FT_CMD("get_rawcap", get_rawcap),},
  94. {FT_CMD("run_delta_read", run_delta_read),},
  95. {FT_CMD("get_delta", get_delta),},
  96. {FT_CMD("run_abscap_read" , run_abscap_read),},
  97. {FT_CMD("run_absdelta_read", run_absdelta_read),},
  98. {FT_CMD("run_trx_short_test", run_trx_short_test),},
  99. {FT_CMD("get_cx_data", get_cx_data),},
  100. {FT_CMD("run_cx_data_read", run_cx_data_read),},
  101. {FT_CMD("set_tsp_test_result", set_tsp_test_result),},
  102. {FT_CMD("get_tsp_test_result", get_tsp_test_result),},
  103. {FT_CMD("hover_enable", hover_enable),},
  104. {FT_CMD("hover_no_sleep_enable", not_support_cmd),},
  105. {FT_CMD("glove_mode", glove_mode),},
  106. {FT_CMD("get_glove_sensitivity", get_glove_sensitivity),},
  107. {FT_CMD("clear_cover_mode", clear_cover_mode),},
  108. {FT_CMD("fast_glove_mode", fast_glove_mode),},
  109. {FT_CMD("report_rate", report_rate),},
  110. #if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP)
  111. {FT_CMD("interrupt_control", interrupt_control),},
  112. #endif
  113. #if defined(TOUCH_BOOSTER_DVFS)
  114. {FT_CMD("boost_level", boost_level),},
  115. #endif
  116. {FT_CMD("not_support_cmd", not_support_cmd),},
  117. };
  118. static DEVICE_ATTR(cmd, S_IWUSR | S_IWGRP, NULL, store_cmd);
  119. static DEVICE_ATTR(cmd_status, S_IRUGO, show_cmd_status, NULL);
  120. static DEVICE_ATTR(cmd_result, S_IRUGO, show_cmd_result, NULL);
  121. static DEVICE_ATTR(cmd_list, S_IRUGO, cmd_list_show, NULL);
  122. static struct attribute *sec_touch_facotry_attributes[] = {
  123. &dev_attr_cmd.attr,
  124. &dev_attr_cmd_status.attr,
  125. &dev_attr_cmd_result.attr,
  126. &dev_attr_cmd_list.attr,
  127. NULL,
  128. };
  129. static struct attribute_group sec_touch_factory_attr_group = {
  130. .attrs = sec_touch_facotry_attributes,
  131. };
  132. static int fts_check_index(void *device_data)
  133. {
  134. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  135. char buff[CMD_STR_LEN] = { 0 };
  136. int node;
  137. if (info->cmd_param[0] < 0
  138. || info->cmd_param[0] >= info->SenseChannelLength
  139. || info->cmd_param[1] < 0
  140. || info->cmd_param[1] >= info->ForceChannelLength) {
  141. snprintf(buff, sizeof(buff), "%s", "NG");
  142. strncat(info->cmd_result, buff, strnlen(buff, sizeof(buff)));
  143. info->cmd_state = 3;
  144. tsp_debug_info(true, &info->client->dev, "%s: parameter error: %u,%u\n",
  145. __func__, info->cmd_param[0], info->cmd_param[1]);
  146. node = -1;
  147. return node;
  148. }
  149. node =
  150. info->cmd_param[1] * info->SenseChannelLength + info->cmd_param[0];
  151. tsp_debug_info(true, &info->client->dev, "%s: node = %d\n", __func__, node);
  152. return node;
  153. }
  154. static ssize_t store_cmd(struct device *dev, struct device_attribute *devattr,
  155. const char *buf, size_t count)
  156. {
  157. struct fts_ts_info *info = dev_get_drvdata(dev);
  158. char *cur, *start, *end;
  159. char buff[CMD_STR_LEN] = { 0 };
  160. int len, i;
  161. struct ft_cmd *ft_cmd_ptr = NULL;
  162. char delim = ',';
  163. bool cmd_found = false;
  164. int param_cnt = 0;
  165. if (!info) {
  166. printk(KERN_ERR "%s: No platform data found\n",
  167. __func__);
  168. return -EINVAL;
  169. }
  170. if (!info->input_dev) {
  171. printk(KERN_ERR "%s: No input_dev data found\n",
  172. __func__);
  173. return -EINVAL;
  174. }
  175. if (strlen(buf) >= CMD_STR_LEN) {
  176. tsp_debug_err(true, &info->client->dev, "%s: cmd length is over(%s,%d)!!\n", __func__, buf, (int)strlen(buf));
  177. return -EINVAL;
  178. }
  179. if (info->cmd_is_running == true) {
  180. tsp_debug_err(true, &info->client->dev, "ft_cmd: other cmd is running.\n");
  181. goto err_out;
  182. }
  183. /* check lock */
  184. mutex_lock(&info->cmd_lock);
  185. info->cmd_is_running = true;
  186. mutex_unlock(&info->cmd_lock);
  187. info->cmd_state = 1;
  188. for (i = 0; i < ARRAY_SIZE(info->cmd_param); i++)
  189. info->cmd_param[i] = 0;
  190. len = (int)count;
  191. if (*(buf + len - 1) == '\n')
  192. len--;
  193. memset(info->cmd, 0x00, ARRAY_SIZE(info->cmd));
  194. memcpy(info->cmd, buf, len);
  195. cur = strchr(buf, (int)delim);
  196. if (cur)
  197. memcpy(buff, buf, cur - buf);
  198. else
  199. memcpy(buff, buf, len);
  200. tsp_debug_info(true, &info->client->dev, "COMMAND : %s\n", buff);
  201. /* find command */
  202. list_for_each_entry(ft_cmd_ptr, &info->cmd_list_head, list) {
  203. if (!strncmp(buff, ft_cmd_ptr->cmd_name, CMD_STR_LEN)) {
  204. cmd_found = true;
  205. break;
  206. }
  207. }
  208. /* set not_support_cmd */
  209. if (!cmd_found) {
  210. list_for_each_entry(ft_cmd_ptr, &info->cmd_list_head, list) {
  211. if (!strncmp
  212. ("not_support_cmd", ft_cmd_ptr->cmd_name,
  213. CMD_STR_LEN))
  214. break;
  215. }
  216. }
  217. /* parsing parameters */
  218. if (cur && cmd_found) {
  219. cur++;
  220. start = cur;
  221. memset(buff, 0x00, ARRAY_SIZE(buff));
  222. do {
  223. if (*cur == delim || cur - buf == len) {
  224. end = cur;
  225. memcpy(buff, start, end - start);
  226. *(buff + strnlen(buff, ARRAY_SIZE(buff))) =
  227. '\0';
  228. if (kstrtoint
  229. (buff, 10,
  230. info->cmd_param + param_cnt) < 0)
  231. goto err_out;
  232. start = cur + 1;
  233. memset(buff, 0x00, ARRAY_SIZE(buff));
  234. param_cnt++;
  235. }
  236. cur++;
  237. } while ((cur - buf <= len) && (param_cnt < CMD_PARAM_NUM));
  238. }
  239. tsp_debug_info(true, &info->client->dev, "cmd = %s\n", ft_cmd_ptr->cmd_name);
  240. for (i = 0; i < param_cnt; i++)
  241. tsp_debug_info(true, &info->client->dev, "cmd param %d= %d\n", i,
  242. info->cmd_param[i]);
  243. ft_cmd_ptr->cmd_func(info);
  244. err_out:
  245. return count;
  246. }
  247. static ssize_t show_cmd_status(struct device *dev,
  248. struct device_attribute *devattr, char *buf)
  249. {
  250. struct fts_ts_info *info = dev_get_drvdata(dev);
  251. char buff[16] = { 0 };
  252. if (!info) {
  253. printk(KERN_ERR "%s: No platform data found\n",
  254. __func__);
  255. return -EINVAL;
  256. }
  257. if (!info->input_dev) {
  258. printk(KERN_ERR "%s: No input_dev data found\n",
  259. __func__);
  260. return -EINVAL;
  261. }
  262. tsp_debug_info(true, &info->client->dev, "tsp cmd: status:%d\n", info->cmd_state);
  263. if (info->cmd_state == CMD_STATUS_WAITING)
  264. snprintf(buff, sizeof(buff), "WAITING");
  265. else if (info->cmd_state == CMD_STATUS_RUNNING)
  266. snprintf(buff, sizeof(buff), "RUNNING");
  267. else if (info->cmd_state == CMD_STATUS_OK)
  268. snprintf(buff, sizeof(buff), "OK");
  269. else if (info->cmd_state == CMD_STATUS_FAIL)
  270. snprintf(buff, sizeof(buff), "FAIL");
  271. else if (info->cmd_state == CMD_STATUS_NOT_APPLICABLE)
  272. snprintf(buff, sizeof(buff), "NOT_APPLICABLE");
  273. return snprintf(buf, TSP_BUF_SIZE, "%s\n", buff);
  274. }
  275. static ssize_t show_cmd_result(struct device *dev,
  276. struct device_attribute *devattr, char *buf)
  277. {
  278. struct fts_ts_info *info = dev_get_drvdata(dev);
  279. if (!info) {
  280. printk(KERN_ERR "%s: No platform data found\n",
  281. __func__);
  282. return -EINVAL;
  283. }
  284. if (!info->input_dev) {
  285. printk(KERN_ERR "%s: No input_dev data found\n",
  286. __func__);
  287. return -EINVAL;
  288. }
  289. tsp_debug_info(true, &info->client->dev, "tsp cmd: result: %s\n",
  290. info->cmd_result);
  291. mutex_lock(&info->cmd_lock);
  292. info->cmd_is_running = false;
  293. mutex_unlock(&info->cmd_lock);
  294. info->cmd_state = 0;
  295. return snprintf(buf, TSP_BUF_SIZE, "%s\n", info->cmd_result);
  296. }
  297. static ssize_t cmd_list_show(struct device *dev,
  298. struct device_attribute *attr, char *buf)
  299. {
  300. struct fts_ts_info *info = dev_get_drvdata(dev);
  301. int ii = 0;
  302. char buffer[info->cmd_buffer_size + 30];
  303. char buffer_name[CMD_STR_LEN];
  304. snprintf(buffer, 30, "++factory command list++\n");
  305. while (strncmp(ft_cmds[ii].cmd_name, "not_support_cmd", 16) != 0) {
  306. snprintf(buffer_name, CMD_STR_LEN, "%s\n", ft_cmds[ii].cmd_name);
  307. strncat(buffer, buffer_name, (int)strlen(buffer_name));
  308. ii++;
  309. }
  310. dev_info(&info->client->dev,
  311. "%s: length : %u / %d\n", __func__,
  312. strlen(buffer), info->cmd_buffer_size);
  313. return snprintf(buf, TSP_BUF_SIZE, "%s\n", buffer);
  314. }
  315. static void set_default_result(struct fts_ts_info *info)
  316. {
  317. char delim = ':';
  318. memset(info->cmd_result, 0x00, info->cmd_buffer_size);
  319. memcpy(info->cmd_result, info->cmd, strnlen(info->cmd, CMD_STR_LEN));
  320. strncat(info->cmd_result, &delim, 1);
  321. }
  322. static void set_cmd_result(struct fts_ts_info *info, char *buff, int len)
  323. {
  324. strncat(info->cmd_result, buff, len);
  325. }
  326. static void not_support_cmd(void *device_data)
  327. {
  328. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  329. char buff[16] = { 0 };
  330. set_default_result(info);
  331. snprintf(buff, sizeof(buff), "%s", "NA");
  332. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  333. info->cmd_state = 4;
  334. tsp_debug_info(true, &info->client->dev, "%s: \"%s(%d)\"\n", __func__, buff,
  335. strnlen(buff, sizeof(buff)));
  336. }
  337. static void fw_update(void *device_data)
  338. {
  339. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  340. //struct i2c_client *client = info->client;
  341. char buff[64] = { 0 };
  342. int retval = 0;
  343. set_default_result(info);
  344. if (info->touch_stopped) {
  345. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  346. __func__);
  347. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  348. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  349. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  350. return;
  351. }
  352. retval = fts_fw_update_on_hidden_menu(info, info->cmd_param[0]);
  353. if (retval < 0) {
  354. sprintf(buff, "%s", "NA");
  355. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  356. info->cmd_state = CMD_STATUS_FAIL;
  357. tsp_debug_info(true, &info->client->dev, "%s: failed [%d]\n", __func__, retval);
  358. } else {
  359. sprintf(buff, "%s", "OK");
  360. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  361. info->cmd_state = CMD_STATUS_OK;
  362. tsp_debug_info(true, &info->client->dev, "%s: success [%d]\n", __func__, retval);
  363. }
  364. return;
  365. }
  366. static int getChannelInfo(struct fts_ts_info *info)
  367. {
  368. int rc;
  369. unsigned char cmd[4] =
  370. { 0xB2, 0x00, 0x14, 0x02 };
  371. unsigned char data[FTS_EVENT_SIZE];
  372. int retry = 0;
  373. memset(data, 0x0, FTS_EVENT_SIZE);
  374. rc = -1;
  375. fts_write_reg(info, &cmd[0], 4);
  376. cmd[0]=READ_ONE_EVENT;
  377. while (fts_read_reg
  378. (info, &cmd[0], 1, (unsigned char *)data, FTS_EVENT_SIZE)) {
  379. if (data[0] == EVENTID_RESULT_READ_REGISTER) {
  380. if ((data[1]==cmd[1]) && (data[2]==cmd[2]))
  381. {
  382. info->SenseChannelLength =data[3];
  383. info->ForceChannelLength =data[4];
  384. rc = 0;
  385. break;
  386. }
  387. }
  388. if (retry++ > 30) {
  389. rc = -1;
  390. tsp_debug_info(true, &info->client->dev, "Time over - wait for channel info\n");
  391. break;
  392. }
  393. mdelay(5);
  394. }
  395. return rc;
  396. }
  397. static void procedure_cmd_event(struct fts_ts_info *info, unsigned char *data)
  398. {
  399. char buff[16] = { 0 };
  400. if ((data[1] == 0x00) && (data[2] == 0x62))
  401. {
  402. snprintf(buff, sizeof(buff), "%d",
  403. *(unsigned short *)&data[3]);
  404. tsp_debug_info(true, &info->client->dev, "%s: %s(%d)\n", "get_threshold", buff,
  405. strnlen(buff, sizeof(buff)));
  406. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  407. info->cmd_state = CMD_STATUS_OK;
  408. }
  409. else if ((data[1] == 0x01) && (data[2] == 0xC6))
  410. {
  411. snprintf(buff, sizeof(buff), "%d",
  412. *(unsigned short *)&data[3]);
  413. tsp_debug_info(true, &info->client->dev, "%s: %s(%d)\n", "get_glove_sensitivity", buff,
  414. strnlen(buff, sizeof(buff)));
  415. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  416. info->cmd_state = CMD_STATUS_OK;
  417. }
  418. else if ((data[1] == 0x07) && (data[2] == 0xE7))
  419. {
  420. if (data[3] <= TSP_FACTEST_RESULT_PASS) {
  421. sprintf(buff, "%s",
  422. data[3] == TSP_FACTEST_RESULT_PASS ? "PASS" :
  423. data[3] == TSP_FACTEST_RESULT_FAIL ? "FAIL" : "NONE");
  424. tsp_debug_info(true, &info->client->dev, "%s: success [%s][%d]", "get_tsp_test_result",
  425. data[3] == TSP_FACTEST_RESULT_PASS ? "PASS" :
  426. data[3] == TSP_FACTEST_RESULT_FAIL ? "FAIL" :
  427. "NONE", data[3]);
  428. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  429. info->cmd_state = CMD_STATUS_OK;
  430. }
  431. else
  432. {
  433. snprintf(buff, sizeof(buff), "%s", "NG");
  434. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  435. info->cmd_state = CMD_STATUS_FAIL;
  436. tsp_debug_info(true, &info->client->dev, "%s: %s(%d)\n",
  437. "get_tsp_test_result",
  438. buff,
  439. strnlen(buff, sizeof(buff)));
  440. }
  441. }
  442. }
  443. void fts_print_frame(struct fts_ts_info *info, short *min, short *max)
  444. {
  445. int i = 0;
  446. int j = 0;
  447. unsigned char *pStr = NULL;
  448. unsigned char pTmp[16] = { 0 };
  449. pStr = kzalloc(6 * (info->SenseChannelLength + 1), GFP_KERNEL);
  450. if (pStr == NULL) {
  451. tsp_debug_info(true, &info->client->dev, "FTS pStr kzalloc failed\n");
  452. return;
  453. }
  454. memset(pStr, 0x0, 6 * (info->SenseChannelLength + 1));
  455. snprintf(pTmp, sizeof(pTmp), " ");
  456. strncat(pStr, pTmp, 6 * info->SenseChannelLength);
  457. for (i = 0; i < info->SenseChannelLength; i++) {
  458. snprintf(pTmp, sizeof(pTmp), "Rx%02d ", i);
  459. strncat(pStr, pTmp, 6 * info->SenseChannelLength);
  460. }
  461. tsp_debug_info(true, &info->client->dev, "FTS %s\n", pStr);
  462. memset(pStr, 0x0, 6 * (info->SenseChannelLength + 1));
  463. snprintf(pTmp, sizeof(pTmp), " +");
  464. strncat(pStr, pTmp, 6 * info->SenseChannelLength);
  465. for (i = 0; i < info->SenseChannelLength; i++) {
  466. snprintf(pTmp, sizeof(pTmp), "------");
  467. strncat(pStr, pTmp, 6 * info->SenseChannelLength);
  468. }
  469. tsp_debug_info(true, &info->client->dev, "FTS %s\n", pStr);
  470. for (i = 0; i < info->ForceChannelLength; i++) {
  471. memset(pStr, 0x0, 6 * (info->SenseChannelLength + 1));
  472. snprintf(pTmp, sizeof(pTmp), "Tx%02d | ", i);
  473. strncat(pStr, pTmp, 6 * info->SenseChannelLength);
  474. for (j = 0; j < info->SenseChannelLength; j++) {
  475. snprintf(pTmp, sizeof(pTmp), "%5d ", info->pFrame[(i * info->SenseChannelLength) + j]);
  476. if (i > 0) {
  477. if (info->pFrame[(i * info->SenseChannelLength) + j] < *min)
  478. *min = info->pFrame[(i * info->SenseChannelLength) + j];
  479. if (info->pFrame[(i * info->SenseChannelLength) + j] > *max)
  480. *max = info->pFrame[(i * info->SenseChannelLength) + j];
  481. }
  482. strncat(pStr, pTmp, 6 * info->SenseChannelLength);
  483. }
  484. tsp_debug_info(true, &info->client->dev, "FTS %s\n", pStr);
  485. }
  486. kfree(pStr);
  487. }
  488. int fts_read_frame(struct fts_ts_info *info, unsigned char type, short *min,
  489. short *max)
  490. {
  491. unsigned char pFrameAddress[8] =
  492. { 0xD0, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00 };
  493. unsigned int FrameAddress = 0;
  494. unsigned int writeAddr = 0;
  495. unsigned int start_addr = 0;
  496. unsigned int end_addr = 0;
  497. unsigned int totalbytes = 0;
  498. unsigned int remained = 0;
  499. unsigned int readbytes = 0xFF;
  500. unsigned int dataposition = 0;
  501. unsigned char *pRead = NULL;
  502. int rc = 0;
  503. int ret = 0;
  504. int i = 0;
  505. pRead = kzalloc(BUFFER_MAX, GFP_KERNEL);
  506. if (pRead == NULL) {
  507. tsp_debug_info(true, &info->client->dev, "FTS pRead kzalloc failed\n");
  508. rc = 1;
  509. goto ErrorExit;
  510. }
  511. pFrameAddress[2] = type;
  512. totalbytes = info->SenseChannelLength * info->ForceChannelLength * 2;
  513. ret = fts_read_reg(info, &pFrameAddress[0], 3, pRead, pFrameAddress[3]);
  514. if (ret >= 0) {
  515. FrameAddress = pRead[0] + (pRead[1] << 8);
  516. start_addr = FrameAddress+info->SenseChannelLength*2;
  517. end_addr = start_addr + totalbytes;
  518. } else {
  519. tsp_debug_info(true, &info->client->dev, "FTS read failed rc = %d \n", ret);
  520. rc = 2;
  521. goto ErrorExit;
  522. }
  523. #ifdef DEBUG_MSG
  524. tsp_debug_info(true, &info->client->dev, "FTS FrameAddress = %X \n", FrameAddress);
  525. tsp_debug_info(true, &info->client->dev, "FTS start_addr = %X, end_addr = %X \n", start_addr, end_addr);
  526. #endif
  527. remained = totalbytes;
  528. for (writeAddr = start_addr; writeAddr < end_addr;
  529. writeAddr += READ_CHUNK_SIZE) {
  530. pFrameAddress[1] = (writeAddr >> 8) & 0xFF;
  531. pFrameAddress[2] = writeAddr & 0xFF;
  532. if (remained >= READ_CHUNK_SIZE)
  533. readbytes = READ_CHUNK_SIZE;
  534. else
  535. readbytes = remained;
  536. memset(pRead, 0x0, readbytes);
  537. #ifdef DEBUG_MSG
  538. tsp_debug_info(true, &info->client->dev, "FTS %02X%02X%02X readbytes=%d\n",
  539. pFrameAddress[0], pFrameAddress[1],
  540. pFrameAddress[2], readbytes);
  541. #endif
  542. fts_read_reg(info, &pFrameAddress[0], 3, pRead, readbytes);
  543. remained -= readbytes;
  544. for (i = 0; i < readbytes; i += 2) {
  545. info->pFrame[dataposition++] =
  546. pRead[i] + (pRead[i + 1] << 8);
  547. }
  548. }
  549. kfree(pRead);
  550. #ifdef DEBUG_MSG
  551. tsp_debug_info(true, &info->client->dev,
  552. "FTS writeAddr = %X, start_addr = %X, end_addr = %X \n",
  553. writeAddr, start_addr, end_addr);
  554. #endif
  555. switch (type) {
  556. case TYPE_RAW_DATA:
  557. tsp_debug_info(true, &info->client->dev, "FTS [Raw Data : 0x%X%X] \n", pFrameAddress[0],
  558. FrameAddress);
  559. break;
  560. case TYPE_FILTERED_DATA:
  561. tsp_debug_info(true, &info->client->dev, "FTS [Filtered Data : 0x%X%X] \n",
  562. pFrameAddress[0], FrameAddress);
  563. break;
  564. case TYPE_STRENGTH_DATA:
  565. tsp_debug_info(true, &info->client->dev, "FTS [Strength Data : 0x%X%X] \n",
  566. pFrameAddress[0], FrameAddress);
  567. break;
  568. case TYPE_BASELINE_DATA:
  569. tsp_debug_info(true, &info->client->dev, "FTS [Baseline Data : 0x%X%X] \n",
  570. pFrameAddress[0], FrameAddress);
  571. break;
  572. }
  573. fts_print_frame(info, min, max);
  574. ErrorExit:
  575. return rc;
  576. }
  577. static int fts_panel_ito_test(struct fts_ts_info *info)
  578. {
  579. unsigned char cmd = READ_ONE_EVENT;
  580. unsigned char data[FTS_EVENT_SIZE];
  581. unsigned char regAdd[4] = {0xB0, 0x03, 0x60, 0xFB};
  582. int retry = 0;
  583. int result = -1;
  584. fts_systemreset(info);
  585. fts_wait_for_ready(info);
  586. fts_command(info, SLEEPOUT);
  587. fts_delay(20);
  588. fts_interrupt_set(info, INT_DISABLE);
  589. fts_write_reg(info, &regAdd[0], 4);
  590. fts_command(info, FLUSHBUFFER);
  591. fts_command(info, 0xA7);
  592. fts_delay(200);
  593. memset(data, 0x0, FTS_EVENT_SIZE);
  594. while (fts_read_reg
  595. (info, &cmd, 1, (unsigned char *)data, FTS_EVENT_SIZE)) {
  596. if ((data[0] == 0x0F) && (data[1] == 0x05)) {
  597. switch (data[2]) {
  598. case 0x00 :
  599. result = 0;
  600. break;
  601. case 0x01 :
  602. tsp_debug_info(true, &info->client->dev, "[FTS] ITO Test result : Force channel [%d] open.\n",
  603. data[3]);
  604. break;
  605. case 0x02 :
  606. tsp_debug_info(true, &info->client->dev, "[FTS] ITO Test result : Sense channel [%d] open.\n",
  607. data[3]);
  608. break;
  609. case 0x03 :
  610. tsp_debug_info(true, &info->client->dev, "[FTS] ITO Test result : Force channel [%d] short to GND.\n",
  611. data[3]);
  612. break;
  613. case 0x04 :
  614. tsp_debug_info(true, &info->client->dev, "[FTS] ITO Test result : Sense channel [%d] short to GND.\n",
  615. data[3]);
  616. break;
  617. case 0x07 :
  618. tsp_debug_info(true, &info->client->dev, "[FTS] ITO Test result : Force channel [%d] short to force.\n",
  619. data[3]);
  620. break;
  621. case 0x0E :
  622. tsp_debug_info(true, &info->client->dev, "[FTS] ITO Test result : Sennse channel [%d] short to sense.\n",
  623. data[3]);
  624. break;
  625. default:
  626. break;
  627. }
  628. break;
  629. }
  630. if (retry++ > 30) {
  631. tsp_debug_info(true, &info->client->dev, "Time over - wait for result of ITO test\n");
  632. break;
  633. }
  634. fts_delay(10);
  635. }
  636. fts_systemreset(info);
  637. // wait for ready event
  638. fts_wait_for_ready(info);
  639. #ifdef FTS_SUPPORT_NOISE_PARAM
  640. fts_set_noise_param(info);
  641. #endif // FTS_SUPPORT_NOISE_PARAM
  642. fts_command(info, SLEEPOUT);
  643. fts_command(info, SENSEON);
  644. if (info->hover_enabled)
  645. fts_command(info, FTS_CMD_HOVER_ON);
  646. if (info->flip_enable) {
  647. fts_enable_feature(info, FTS_FEATURE_COVER_GLASS, true);
  648. } else {
  649. if (info->mshover_enabled)
  650. fts_command(info, FTS_CMD_MSHOVER_ON);
  651. }
  652. #ifdef FTS_SUPPORT_TA_MODE
  653. if (info->TA_Pluged)
  654. fts_command(info, FTS_CMD_CHARGER_PLUGGED);
  655. #endif
  656. info->touch_count = 0;
  657. fts_command(info, FLUSHBUFFER);
  658. fts_interrupt_set(info, INT_ENABLE);
  659. return result;
  660. }
  661. static void get_fw_ver_bin(void *device_data)
  662. {
  663. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  664. char buff[16] = { 0 };
  665. set_default_result(info);
  666. sprintf(buff, "ST%02X%04X",
  667. info->panel_revision,
  668. info->fw_main_version_of_bin);
  669. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  670. info->cmd_state = CMD_STATUS_OK;
  671. tsp_debug_info(true, &info->client->dev, "%s: %s(%d)\n", __func__, buff,
  672. strnlen(buff, sizeof(buff)));
  673. }
  674. static void get_fw_ver_ic(void *device_data)
  675. {
  676. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  677. char buff[16] = { 0 };
  678. set_default_result(info);
  679. sprintf(buff, "ST%02X%04X",
  680. info->panel_revision,
  681. info->fw_main_version_of_ic);
  682. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  683. info->cmd_state = CMD_STATUS_OK;
  684. tsp_debug_info(true, &info->client->dev, "%s: %s(%d)\n", __func__, buff,
  685. strnlen(buff, sizeof(buff)));
  686. }
  687. static void get_config_ver(void *device_data)
  688. {
  689. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  690. char buff[20] = { 0 };
  691. snprintf(buff, sizeof(buff), "%s_ST_%04X",
  692. info->board->project_name ?: STM_DEVICE_NAME,
  693. info->config_version_of_ic);
  694. set_default_result(info);
  695. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  696. info->cmd_state = CMD_STATUS_OK;
  697. tsp_debug_info(true, &info->client->dev, "%s: %s(%d)\n", __func__, buff,
  698. strnlen(buff, sizeof(buff)));
  699. }
  700. static void get_threshold(void *device_data)
  701. {
  702. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  703. unsigned char cmd[4] =
  704. { 0xB2, 0x00, 0x62, 0x02 };
  705. int timeout=0;
  706. set_default_result(info);
  707. if (info->touch_stopped) {
  708. char buff[CMD_STR_LEN] = { 0 };
  709. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  710. __func__);
  711. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  712. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  713. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  714. return;
  715. }
  716. fts_write_reg(info, &cmd[0], 4);
  717. info->cmd_state = CMD_STATUS_RUNNING;
  718. while (info->cmd_state == CMD_STATUS_RUNNING) {
  719. if (timeout++>30) {
  720. info->cmd_state = CMD_STATUS_FAIL;
  721. break;
  722. }
  723. msleep(10);
  724. }
  725. }
  726. static void module_off_master(void *device_data)
  727. {
  728. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  729. char buff[3] = { 0 };
  730. int ret = 0;
  731. mutex_lock(&info->lock);
  732. if (info->enabled) {
  733. disable_irq(info->irq);
  734. info->enabled = false;
  735. }
  736. mutex_unlock(&info->lock);
  737. if (info->board->power)
  738. info->board->power(0);
  739. else
  740. ret = 1;
  741. if (ret == 0)
  742. snprintf(buff, sizeof(buff), "%s", "OK");
  743. else
  744. snprintf(buff, sizeof(buff), "%s", "NG");
  745. set_default_result(info);
  746. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  747. if (strncmp(buff, "OK", 2) == 0)
  748. info->cmd_state = CMD_STATUS_OK;
  749. else
  750. info->cmd_state = CMD_STATUS_FAIL;
  751. tsp_debug_info(true, &info->client->dev, "%s: %s\n", __func__, buff);
  752. }
  753. static void module_on_master(void *device_data)
  754. {
  755. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  756. char buff[3] = { 0 };
  757. int ret = 0;
  758. mutex_lock(&info->lock);
  759. if (!info->enabled) {
  760. enable_irq(info->irq);
  761. info->enabled = true;
  762. }
  763. mutex_unlock(&info->lock);
  764. if (info->board->power)
  765. info->board->power(1);
  766. else
  767. ret = 1;
  768. if (ret == 0)
  769. snprintf(buff, sizeof(buff), "%s", "OK");
  770. else
  771. snprintf(buff, sizeof(buff), "%s", "NG");
  772. set_default_result(info);
  773. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  774. if (strncmp(buff, "OK", 2) == 0)
  775. info->cmd_state = CMD_STATUS_OK;
  776. else
  777. info->cmd_state = CMD_STATUS_FAIL;
  778. tsp_debug_info(true, &info->client->dev, "%s: %s\n", __func__, buff);
  779. }
  780. static void get_chip_vendor(void *device_data)
  781. {
  782. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  783. char buff[16] = { 0 };
  784. strncpy(buff, "STM", sizeof(buff));
  785. set_default_result(info);
  786. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  787. info->cmd_state = CMD_STATUS_OK;
  788. tsp_debug_info(true, &info->client->dev, "%s: %s(%d)\n", __func__, buff,
  789. strnlen(buff, sizeof(buff)));
  790. }
  791. static void get_chip_name(void *device_data)
  792. {
  793. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  794. char buff[16] = { 0 };
  795. strncpy(buff, "FTS3A048", sizeof(buff));
  796. set_default_result(info);
  797. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  798. info->cmd_state = CMD_STATUS_OK;
  799. tsp_debug_info(true, &info->client->dev, "%s: %s(%d)\n", __func__, buff,
  800. strnlen(buff, sizeof(buff)));
  801. }
  802. static void get_x_num(void *device_data)
  803. {
  804. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  805. char buff[16] = { 0 };
  806. set_default_result(info);
  807. snprintf(buff, sizeof(buff), "%d", info->SenseChannelLength);
  808. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  809. info->cmd_state = 2;
  810. tsp_debug_info(true, &info->client->dev, "%s: %s(%d)\n", __func__, buff,
  811. strnlen(buff, sizeof(buff)));
  812. }
  813. static void get_y_num(void *device_data)
  814. {
  815. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  816. char buff[16] = { 0 };
  817. set_default_result(info);
  818. snprintf(buff, sizeof(buff), "%d", info->ForceChannelLength);
  819. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  820. info->cmd_state = CMD_STATUS_OK;
  821. tsp_debug_info(true, &info->client->dev, "%s: %s(%d)\n", __func__, buff,
  822. strnlen(buff, sizeof(buff)));
  823. }
  824. static void run_reference_read(void *device_data)
  825. {
  826. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  827. char buff[CMD_STR_LEN] = { 0 };
  828. short min = 0x7FFF;
  829. short max = 0x8000;
  830. set_default_result(info);
  831. if (info->touch_stopped) {
  832. char buff[CMD_STR_LEN] = { 0 };
  833. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  834. __func__);
  835. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  836. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  837. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  838. return;
  839. }
  840. fts_read_frame(info, TYPE_BASELINE_DATA, &min, &max);
  841. snprintf(buff, sizeof(buff), "%d,%d", min, max);
  842. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  843. info->cmd_state = CMD_STATUS_OK;
  844. tsp_debug_info(true, &info->client->dev, "%s: %s\n", __func__, buff);
  845. }
  846. static void get_reference(void *device_data)
  847. {
  848. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  849. char buff[CMD_STR_LEN] = { 0 };
  850. short val = 0;
  851. int node = 0;
  852. set_default_result(info);
  853. if (info->touch_stopped) {
  854. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  855. __func__);
  856. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  857. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  858. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  859. return;
  860. }
  861. node = fts_check_index(info);
  862. if (node < 0)
  863. return;
  864. val = info->pFrame[node];
  865. snprintf(buff, sizeof(buff), "%d", val);
  866. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  867. info->cmd_state = CMD_STATUS_OK;
  868. tsp_debug_info(true, &info->client->dev, "%s: %s(%d)\n", __func__, buff,
  869. strnlen(buff, sizeof(buff)));
  870. }
  871. static void run_rawcap_read(void *device_data)
  872. {
  873. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  874. char buff[CMD_STR_LEN] = { 0 };
  875. short min = 0x7FFF;
  876. short max = 0x8000;
  877. unsigned char data[FTS_EVENT_SIZE];
  878. unsigned char regAdd;
  879. int fail_retry = 0;
  880. set_default_result(info);
  881. if (info->touch_stopped) {
  882. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  883. __func__);
  884. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  885. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  886. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  887. return;
  888. }
  889. fts_interrupt_set(info, INT_DISABLE);
  890. fts_command(info, CX_TUNNING);
  891. fts_delay(300);
  892. regAdd = READ_ONE_EVENT;
  893. while (fts_read_reg(info, &regAdd, 1, (unsigned char *)data, FTS_EVENT_SIZE)) {
  894. if ((data[0] == EVENTID_STATUS_EVENT) &&
  895. (data[1] == STATUS_EVENT_MUTUAL_AUTOTUNE_DONE)) {
  896. break;
  897. }
  898. if (fail_retry++ > FTS_RETRY_COUNT * 15) {
  899. tsp_debug_info(true, info->dev, "%s: Raw data read Time Over\n", __func__);
  900. break;
  901. }
  902. fts_delay(10);
  903. }
  904. fts_interrupt_set(info, INT_ENABLE);
  905. fts_delay(500);
  906. fts_read_frame(info, TYPE_FILTERED_DATA, &min, &max);
  907. snprintf(buff, sizeof(buff), "%d,%d", min, max);
  908. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  909. info->cmd_state = CMD_STATUS_OK;
  910. tsp_debug_info(true, &info->client->dev, "%s: %s\n", __func__, buff);
  911. }
  912. static void get_rawcap(void *device_data)
  913. {
  914. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  915. char buff[CMD_STR_LEN] = { 0 };
  916. short val = 0;
  917. int node = 0;
  918. set_default_result(info);
  919. if (info->touch_stopped) {
  920. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  921. __func__);
  922. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  923. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  924. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  925. return;
  926. }
  927. node = fts_check_index(info);
  928. if (node < 0)
  929. return;
  930. val = info->pFrame[node];
  931. snprintf(buff, sizeof(buff), "%d", val);
  932. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  933. info->cmd_state = CMD_STATUS_OK;
  934. tsp_debug_info(true, &info->client->dev, "%s: %s(%d)\n", __func__, buff,
  935. strnlen(buff, sizeof(buff)));
  936. }
  937. static void run_delta_read(void *device_data)
  938. {
  939. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  940. char buff[CMD_STR_LEN] = { 0 };
  941. short min = 0x7FFF;
  942. short max = 0x8000;
  943. set_default_result(info);
  944. if (info->touch_stopped) {
  945. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  946. __func__);
  947. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  948. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  949. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  950. return;
  951. }
  952. fts_read_frame(info, TYPE_STRENGTH_DATA, &min, &max);
  953. snprintf(buff, sizeof(buff), "%d,%d", min, max);
  954. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  955. info->cmd_state = CMD_STATUS_OK;
  956. tsp_debug_info(true, &info->client->dev, "%s: %s\n", __func__, buff);
  957. }
  958. static void get_delta(void *device_data)
  959. {
  960. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  961. char buff[CMD_STR_LEN] = { 0 };
  962. short val = 0;
  963. int node = 0;
  964. set_default_result(info);
  965. if (info->touch_stopped) {
  966. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  967. __func__);
  968. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  969. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  970. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  971. return;
  972. }
  973. node = fts_check_index(info);
  974. if (node < 0)
  975. return;
  976. val = info->pFrame[node];
  977. snprintf(buff, sizeof(buff), "%d", val);
  978. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  979. info->cmd_state = CMD_STATUS_OK;
  980. tsp_debug_info(true, &info->client->dev, "%s: %s(%d)\n", __func__, buff,
  981. strnlen(buff, sizeof(buff)));
  982. }
  983. void fts_read_self_frame(struct fts_ts_info *info, unsigned short oAddr)
  984. {
  985. char buff[66] = {0, };
  986. short *data = 0;
  987. char temp[9] = {0, };
  988. char temp2[512] = {0, };
  989. int i;
  990. int rc;
  991. int retry=1;
  992. unsigned char regAdd[6] = {0xD0, 0x00, 0x00, 0xD0, 0x00, 0x00};
  993. if (info->touch_stopped) {
  994. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  995. __func__);
  996. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  997. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  998. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  999. return;
  1000. }
  1001. if (!info->hover_enabled) {
  1002. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Hover is disabled\n",
  1003. __func__);
  1004. snprintf(buff, sizeof(buff), "%s", "TSP Hover disabled");
  1005. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1006. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  1007. return;
  1008. }
  1009. while (!info->hover_ready) {
  1010. if (retry++ > 500) { // max 5sec
  1011. tsp_debug_info(true, &info->client->dev, "%s: [FTS] Timeout - Abs Raw Data Ready Event\n",
  1012. __func__);
  1013. break;
  1014. }
  1015. fts_delay(10);
  1016. }
  1017. regAdd[1] = (oAddr >> 8) & 0xff;
  1018. regAdd[2] = oAddr & 0xff;
  1019. rc = info->fts_read_reg(info, &regAdd[0], 3, (unsigned char *)&buff[0], 5);
  1020. if (!rc) {
  1021. info->cmd_state = CMD_STATUS_FAIL;
  1022. return;
  1023. }
  1024. tsp_debug_info(true, &info->client->dev, "%s: Force Address : %02x%02x\n",
  1025. __func__, buff[1], buff[0]);
  1026. tsp_debug_info(true, &info->client->dev, "%s: Sense Address : %02x%02x\n",
  1027. __func__, buff[3], buff[2]);
  1028. regAdd[1] = buff[3];
  1029. regAdd[2] = buff[2];
  1030. regAdd[4] = buff[1];
  1031. regAdd[5] = buff[0];
  1032. rc = info->fts_read_reg(info, &regAdd[0], 3,
  1033. (unsigned char *)&buff[0],
  1034. info->SenseChannelLength * 2 + 1);
  1035. if (!rc) {
  1036. info->cmd_state = CMD_STATUS_FAIL;
  1037. return;
  1038. }
  1039. data = (short *)&buff[0];
  1040. memset(temp, 0x00, ARRAY_SIZE(temp));
  1041. memset(temp2, 0x00, ARRAY_SIZE(temp2));
  1042. for (i = 0; i < info->SenseChannelLength; i++) {
  1043. tsp_debug_info(true, &info->client->dev,
  1044. "%s: Rx [%d] = %d\n", __func__,
  1045. i,
  1046. *data);
  1047. sprintf(temp, "%d,", *data);
  1048. strncat(temp2, temp, 9);
  1049. data++;
  1050. }
  1051. rc = info->fts_read_reg(info, &regAdd[3], 3,
  1052. (unsigned char *)&buff[0],
  1053. info->ForceChannelLength * 2 + 1);
  1054. if (!rc) {
  1055. info->cmd_state = CMD_STATUS_FAIL;
  1056. return;
  1057. }
  1058. data = (short *)&buff[0];
  1059. for (i = 0; i < info->ForceChannelLength; i++) {
  1060. tsp_debug_info(true, &info->client->dev,
  1061. "%s: Tx [%d] = %d\n", __func__, i, *data);
  1062. sprintf(temp, "%d,", *data);
  1063. strncat(temp2, temp, 9);
  1064. data++;
  1065. }
  1066. set_cmd_result(info, temp2, strnlen(temp2, sizeof(temp2)));
  1067. info->cmd_state = CMD_STATUS_OK;
  1068. }
  1069. static void run_abscap_read(void *device_data)
  1070. {
  1071. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  1072. set_default_result(info);
  1073. fts_read_self_frame(info, 0x000E);
  1074. }
  1075. static void run_absdelta_read(void *device_data)
  1076. {
  1077. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  1078. set_default_result(info);
  1079. fts_read_self_frame(info, 0x0012);
  1080. }
  1081. static void run_trx_short_test(void *device_data)
  1082. {
  1083. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  1084. char buff[CMD_STR_LEN] = { 0 };
  1085. int ret = 0;
  1086. set_default_result(info);
  1087. if (info->touch_stopped) {
  1088. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  1089. __func__);
  1090. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  1091. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1092. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  1093. return;
  1094. }
  1095. disable_irq(info->irq);
  1096. ret = fts_panel_ito_test(info);
  1097. if (ret == 0)
  1098. snprintf(buff, sizeof(buff), "%s", "OK");
  1099. else
  1100. snprintf(buff, sizeof(buff), "%s", "FAIL");
  1101. enable_irq(info->irq);
  1102. info->cmd_state = CMD_STATUS_OK;
  1103. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1104. tsp_debug_info(true, &info->client->dev, "%s: %s\n", __func__, buff);
  1105. }
  1106. #define FTS_MAX_TX_LENGTH 44
  1107. #define FTS_MAX_RX_LENGTH 64
  1108. #define FTS_CX2_READ_LENGTH 4
  1109. #define FTS_CX2_ADDR_OFFSET 3
  1110. #define FTS_CX2_TX_START 0
  1111. #define FTS_CX2_BASE_ADDR 0x1000
  1112. static void get_cx_data(void *device_data)
  1113. {
  1114. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  1115. char buff[CMD_STR_LEN] = { 0 };
  1116. short val = 0;
  1117. int node = 0;
  1118. set_default_result(info);
  1119. if (info->touch_stopped) {
  1120. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  1121. __func__);
  1122. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  1123. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1124. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  1125. return;
  1126. }
  1127. node = fts_check_index(info);
  1128. if (node < 0)
  1129. return;
  1130. val = info->cx_data[node];
  1131. snprintf(buff, sizeof(buff), "%d", val);
  1132. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1133. info->cmd_state = CMD_STATUS_OK;
  1134. tsp_debug_info(true, &info->client->dev, "%s: %s(%d)\n", __func__, buff,
  1135. strnlen(buff, sizeof(buff)));
  1136. }
  1137. static void run_cx_data_read(void *device_data)
  1138. {
  1139. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  1140. char buff[CMD_STR_LEN] = { 0 };
  1141. unsigned char ReadData[info->ForceChannelLength][info->SenseChannelLength + FTS_CX2_READ_LENGTH];
  1142. unsigned char regAdd[8];
  1143. unsigned char buf[8];
  1144. unsigned char r_addr = READ_ONE_EVENT;
  1145. unsigned int addr, rx_num, tx_num;
  1146. int i, j, cx_rx_length, max_tx_length, max_rx_length, address_offset = 0, start_tx_offset = 0, retry = 0;
  1147. set_default_result(info);
  1148. if (info->touch_stopped) {
  1149. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  1150. __func__);
  1151. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  1152. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1153. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  1154. return;
  1155. }
  1156. fts_command(info, SENSEOFF);
  1157. disable_irq(info->irq);
  1158. tx_num = info->ForceChannelLength;
  1159. rx_num = info->SenseChannelLength;
  1160. max_tx_length = FTS_MAX_TX_LENGTH -4;
  1161. max_rx_length = FTS_MAX_RX_LENGTH -4;
  1162. start_tx_offset = FTS_CX2_TX_START * max_rx_length / FTS_CX2_READ_LENGTH * FTS_CX2_ADDR_OFFSET;
  1163. address_offset = max_rx_length /FTS_CX2_READ_LENGTH;
  1164. for(j = 0; j < tx_num; j++) {
  1165. addr = FTS_CX2_BASE_ADDR + (j * address_offset * FTS_CX2_ADDR_OFFSET) + start_tx_offset;
  1166. if(rx_num % FTS_CX2_READ_LENGTH != 0)
  1167. cx_rx_length = rx_num / FTS_CX2_READ_LENGTH + 1;
  1168. else
  1169. cx_rx_length = rx_num / FTS_CX2_READ_LENGTH;
  1170. for(i = 0; i < cx_rx_length; i++) {
  1171. regAdd[0] = 0xB2;
  1172. regAdd[1] = (addr >> 8) & 0xff;
  1173. regAdd[2] = (addr & 0xff);
  1174. regAdd[3] = 0x04;
  1175. fts_write_reg(info, &regAdd[0], 4);
  1176. retry = FTS_RETRY_COUNT * 3;
  1177. do {
  1178. if (retry < 0) {
  1179. tsp_debug_err(true, &info->client->dev,
  1180. "%s: failed to compare buf, break!\n", __func__);
  1181. break;
  1182. }
  1183. fts_read_reg(info, &r_addr, 1, &buf[0], FTS_EVENT_SIZE);
  1184. retry--;
  1185. } while(buf[1] != regAdd[1] || buf[2] != regAdd[2]);
  1186. ReadData[j][i * 4] = buf[3] & 0x3F;
  1187. ReadData[j][i * 4 + 1] = (buf[3] & 0xC0) >> 6 | (buf[4] & 0x0F) << 2;
  1188. ReadData[j][i * 4 + 2] = ((buf[4] & 0xF0)>> 4) | ((buf[5] & 0x03) << 4);
  1189. ReadData[j][i * 4 + 3] = buf[5] >> 2;
  1190. addr = addr + 3;
  1191. tsp_debug_info(true, &info->client->dev, "%s: [Tx:%d][Rx:%d] :[%d][%d][%d][%d]\n", __func__,
  1192. i, j, ReadData[j][i*4], ReadData[j][i*4+1], ReadData[j][i*4+2], ReadData[j][i*4+3]);
  1193. }
  1194. }
  1195. if (info->cx_data) {
  1196. for (j = 0; j < tx_num; j++) {
  1197. for(i = 0; i < rx_num; i++)
  1198. info->cx_data[(j * rx_num) + i] = ReadData[j][i];
  1199. }
  1200. }
  1201. snprintf(buff, sizeof(buff), "%s", "OK");
  1202. enable_irq(info->irq);
  1203. fts_command(info, SENSEON);
  1204. info->cmd_state = CMD_STATUS_OK;
  1205. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1206. tsp_debug_info(true, &info->client->dev, "%s: %s\n", __func__, buff);
  1207. }
  1208. static void set_tsp_test_result(void *device_data)
  1209. {
  1210. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  1211. char buff[CMD_STR_LEN] = { 0 };
  1212. unsigned char regAdd[4] = {0xB0, 0x07, 0xE7, 0x00};
  1213. set_default_result(info);
  1214. if (info->cmd_param[0] < TSP_FACTEST_RESULT_NONE
  1215. || info->cmd_param[0] > TSP_FACTEST_RESULT_PASS) {
  1216. snprintf(buff, sizeof(buff), "%s", "NG");
  1217. info->cmd_state = CMD_STATUS_FAIL;
  1218. return;
  1219. }
  1220. if (info->touch_stopped) {
  1221. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  1222. __func__);
  1223. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  1224. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1225. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  1226. return;
  1227. }
  1228. regAdd[3] = info->cmd_param[0];
  1229. fts_write_reg(info, &regAdd[0], 4);
  1230. fts_delay(100);
  1231. fts_command(info, FTS_CMD_SAVE_FWCONFIG);
  1232. snprintf(buff, sizeof(buff), "%s", "OK");
  1233. info->cmd_state = CMD_STATUS_OK;
  1234. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1235. tsp_debug_info(true, &info->client->dev, "%s: %s\n", __func__, buff);
  1236. }
  1237. static void get_tsp_test_result(void *device_data)
  1238. {
  1239. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  1240. unsigned char cmd[4] = {0xB2, 0x07, 0xE7, 0x01};
  1241. int timeout = 0;
  1242. set_default_result(info);
  1243. if (info->touch_stopped) {
  1244. char buff[CMD_STR_LEN] = { 0 };
  1245. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  1246. __func__);
  1247. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  1248. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1249. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  1250. return;
  1251. }
  1252. fts_command(info, FLUSHBUFFER);
  1253. fts_write_reg(info, &cmd[0], 4);
  1254. info->cmd_state = CMD_STATUS_RUNNING;
  1255. while (info->cmd_state == CMD_STATUS_RUNNING) {
  1256. if (timeout++>30) {
  1257. info->cmd_state = CMD_STATUS_FAIL;
  1258. break;
  1259. }
  1260. fts_delay(10);
  1261. }
  1262. }
  1263. static void hover_enable(void *device_data)
  1264. {
  1265. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  1266. char buff[CMD_STR_LEN] = { 0 };
  1267. set_default_result(info);
  1268. if (info->touch_stopped || !(info->reinit_done)) {
  1269. tsp_debug_info(true, &info->client->dev,
  1270. "%s: [ERROR] Touch is stopped : %d, reinit_done : %d\n",
  1271. __func__, info->touch_stopped, info->reinit_done);
  1272. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  1273. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1274. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  1275. if(info->cmd_param[0]==1){
  1276. retry_hover_enable_after_wakeup = 1;
  1277. tsp_debug_info(true, &info->client->dev, "%s: retry_hover_on_after_wakeup \n", __func__);
  1278. }
  1279. goto out;
  1280. }
  1281. if (info->cmd_param[0] < 0 || info->cmd_param[0] > 1) {
  1282. snprintf(buff, sizeof(buff), "%s", "NG");
  1283. info->cmd_state = CMD_STATUS_FAIL;
  1284. } else {
  1285. int enables;
  1286. enables = info->cmd_param[0];
  1287. if (enables == info->hover_enabled) {
  1288. tsp_debug_dbg(true, &info->client->dev,
  1289. "%s: Skip duplicate command. Hover is already %s.\n",
  1290. __func__, info->hover_enabled ? "enabled" : "disabled");
  1291. } else {
  1292. if (enables) {
  1293. unsigned char regAdd[4] = {0xB0, 0x01, 0x29, 0x41};
  1294. unsigned char Dly_regAdd[4] = {0xB0, 0x01, 0x72, 0x04};
  1295. fts_write_reg(info, &Dly_regAdd[0], 4);
  1296. fts_write_reg(info, &regAdd[0], 4);
  1297. fts_command(info, FTS_CMD_HOVER_ON);
  1298. info->hover_enabled = true;
  1299. info->hover_ready = false;
  1300. } else {
  1301. unsigned char Dly_regAdd[4] = {0xB0, 0x01, 0x72, 0x08};
  1302. fts_write_reg(info, &Dly_regAdd[0], 4);
  1303. fts_command(info, FTS_CMD_HOVER_OFF);
  1304. info->hover_enabled = false;
  1305. info->hover_ready = false;
  1306. }
  1307. }
  1308. snprintf(buff, sizeof(buff), "%s", "OK");
  1309. info->cmd_state = CMD_STATUS_OK;
  1310. }
  1311. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1312. info->cmd_state = CMD_STATUS_WAITING;
  1313. out:
  1314. mutex_lock(&info->cmd_lock);
  1315. info->cmd_is_running = false;
  1316. mutex_unlock(&info->cmd_lock);
  1317. tsp_debug_info(true, &info->client->dev, "%s: %s\n", __func__, buff);
  1318. }
  1319. /* static void hover_no_sleep_enable(void *device_data)
  1320. {
  1321. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  1322. unsigned char regAdd[4] = {0xB0, 0x01, 0x18, 0x00};
  1323. char buff[CMD_STR_LEN] = { 0 };
  1324. set_default_result(info);
  1325. if (info->touch_stopped) {
  1326. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  1327. __func__);
  1328. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  1329. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1330. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  1331. return;
  1332. }
  1333. if (info->cmd_param[0] < 0 || info->cmd_param[0] > 1) {
  1334. snprintf(buff, sizeof(buff), "%s", "NG");
  1335. info->cmd_state = CMD_STATUS_FAIL;
  1336. } else {
  1337. if (info->cmd_param[0]) {
  1338. regAdd[3]=0x0F;
  1339. } else {
  1340. regAdd[3]=0x08;
  1341. }
  1342. fts_write_reg(info, &regAdd[0], 4);
  1343. snprintf(buff, sizeof(buff), "%s", "OK");
  1344. info->cmd_state = CMD_STATUS_OK;
  1345. }
  1346. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1347. tsp_debug_info(true, &info->client->dev, "%s: %s\n", __func__, buff);
  1348. } */
  1349. static void glove_mode(void *device_data)
  1350. {
  1351. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  1352. char buff[CMD_STR_LEN] = { 0 };
  1353. set_default_result(info);
  1354. if (info->cmd_param[0] < 0 || info->cmd_param[0] > 1) {
  1355. snprintf(buff, sizeof(buff), "%s", "NG");
  1356. info->cmd_state = CMD_STATUS_FAIL;
  1357. } else {
  1358. info->mshover_enabled = info->cmd_param[0];
  1359. if (!info->touch_stopped && info->reinit_done) {
  1360. if (info->mshover_enabled)
  1361. fts_command(info, FTS_CMD_MSHOVER_ON);
  1362. else
  1363. fts_command(info, FTS_CMD_MSHOVER_OFF);
  1364. }
  1365. snprintf(buff, sizeof(buff), "%s", "OK");
  1366. info->cmd_state = CMD_STATUS_OK;
  1367. }
  1368. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1369. info->cmd_state = CMD_STATUS_WAITING;
  1370. mutex_lock(&info->cmd_lock);
  1371. info->cmd_is_running = false;
  1372. mutex_unlock(&info->cmd_lock);
  1373. tsp_debug_info(true, &info->client->dev, "%s: %s\n", __func__, buff);
  1374. }
  1375. static void get_glove_sensitivity(void *device_data)
  1376. {
  1377. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  1378. unsigned char cmd[4] =
  1379. { 0xB2, 0x01, 0xC6, 0x02 };
  1380. int timeout=0;
  1381. set_default_result(info);
  1382. if (info->touch_stopped) {
  1383. char buff[CMD_STR_LEN] = { 0 };
  1384. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  1385. __func__);
  1386. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  1387. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1388. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  1389. return;
  1390. }
  1391. fts_write_reg(info, &cmd[0], 4);
  1392. info->cmd_state = CMD_STATUS_RUNNING;
  1393. while (info->cmd_state == CMD_STATUS_RUNNING) {
  1394. if (timeout++>30) {
  1395. info->cmd_state = CMD_STATUS_FAIL;
  1396. break;
  1397. }
  1398. msleep(10);
  1399. }
  1400. }
  1401. static void clear_cover_mode(void *device_data)
  1402. {
  1403. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  1404. char buff[CMD_STR_LEN] = { 0 };
  1405. set_default_result(info);
  1406. if (info->cmd_param[0] < 0 || info->cmd_param[0] > 3) {
  1407. snprintf(buff, sizeof(buff), "%s", "NG");
  1408. info->cmd_state = CMD_STATUS_FAIL;
  1409. } else {
  1410. if (info->cmd_param[0] > 1)
  1411. info->flip_enable = true;
  1412. else
  1413. info->flip_enable = false;
  1414. if (!info->touch_stopped && info->reinit_done) {
  1415. if (info->flip_enable) {
  1416. if (info->mshover_enabled)
  1417. fts_command(info, FTS_CMD_MSHOVER_OFF);
  1418. fts_enable_feature(info, FTS_FEATURE_COVER_GLASS, true);
  1419. } else {
  1420. fts_enable_feature(info, FTS_FEATURE_COVER_GLASS, false);
  1421. if (info->fast_mshover_enabled)
  1422. fts_command(info, FTS_CMD_SET_FAST_GLOVE_MODE);
  1423. else if (info->mshover_enabled)
  1424. fts_command(info, FTS_CMD_MSHOVER_ON);
  1425. }
  1426. }
  1427. snprintf(buff, sizeof(buff), "%s", "OK");
  1428. info->cmd_state = CMD_STATUS_OK;
  1429. }
  1430. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1431. info->cmd_state = CMD_STATUS_WAITING;
  1432. mutex_lock(&info->cmd_lock);
  1433. info->cmd_is_running = false;
  1434. mutex_unlock(&info->cmd_lock);
  1435. tsp_debug_info(true, &info->client->dev, "%s: %s\n", __func__, buff);
  1436. };
  1437. static void fast_glove_mode(void *device_data)
  1438. {
  1439. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  1440. char buff[CMD_STR_LEN] = { 0 };
  1441. set_default_result(info);
  1442. if (info->cmd_param[0] < 0 || info->cmd_param[0] > 1) {
  1443. snprintf(buff, sizeof(buff), "%s", "NG");
  1444. info->cmd_state = CMD_STATUS_FAIL;
  1445. } else {
  1446. info->fast_mshover_enabled = info->cmd_param[0];
  1447. if (!info->touch_stopped && info->reinit_done) {
  1448. if (info->fast_mshover_enabled)
  1449. fts_command(info, FTS_CMD_SET_FAST_GLOVE_MODE);
  1450. else
  1451. fts_command(info, FTS_CMD_SET_NOR_GLOVE_MODE);
  1452. }
  1453. snprintf(buff, sizeof(buff), "%s", "OK");
  1454. info->cmd_state = CMD_STATUS_OK;
  1455. }
  1456. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1457. info->cmd_state = CMD_STATUS_WAITING;
  1458. mutex_lock(&info->cmd_lock);
  1459. info->cmd_is_running = false;
  1460. mutex_unlock(&info->cmd_lock);
  1461. tsp_debug_info(true, &info->client->dev, "%s: %s\n", __func__, buff);
  1462. };
  1463. static void report_rate(void *device_data)
  1464. {
  1465. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  1466. char buff[CMD_STR_LEN] = { 0 };
  1467. set_default_result(info);
  1468. if (info->touch_stopped) {
  1469. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  1470. __func__);
  1471. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  1472. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1473. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  1474. goto out;
  1475. }
  1476. if (info->cmd_param[0] < 0 || info->cmd_param[0] > 2) {
  1477. snprintf(buff, sizeof(buff), "%s", "NG");
  1478. info->cmd_state = CMD_STATUS_FAIL;
  1479. } else {
  1480. if (info->cmd_param[0] == REPORT_RATE_90HZ)
  1481. fts_change_scan_rate(info, FTS_CMD_FAST_SCAN);
  1482. else if (info->cmd_param[0] == REPORT_RATE_60HZ)
  1483. fts_change_scan_rate(info, FTS_CMD_SLOW_SCAN);
  1484. else if (info->cmd_param[0] == REPORT_RATE_30HZ)
  1485. fts_change_scan_rate(info, FTS_CMD_USLOW_SCAN);
  1486. snprintf(buff, sizeof(buff), "%s", "OK");
  1487. info->cmd_state = CMD_STATUS_OK;
  1488. }
  1489. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1490. info->cmd_state = CMD_STATUS_WAITING;
  1491. out:
  1492. mutex_lock(&info->cmd_lock);
  1493. info->cmd_is_running = false;
  1494. mutex_unlock(&info->cmd_lock);
  1495. tsp_debug_info(true, &info->client->dev, "%s: %s\n", __func__, buff);
  1496. }
  1497. #if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP)
  1498. static void interrupt_control(void *device_data)
  1499. {
  1500. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  1501. char buff[CMD_STR_LEN] = { 0 };
  1502. set_default_result(info);
  1503. if (info->touch_stopped) {
  1504. tsp_debug_info(true, &info->client->dev, "%s: [ERROR] Touch is stopped\n",
  1505. __func__);
  1506. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  1507. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1508. info->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  1509. goto out;
  1510. }
  1511. if (info->cmd_param[0] < 0 || info->cmd_param[0] > 1) {
  1512. snprintf(buff, sizeof(buff), "%s", "NG");
  1513. info->cmd_state = CMD_STATUS_FAIL;
  1514. } else {
  1515. int enables;
  1516. enables = info->cmd_param[0];
  1517. if (enables)
  1518. fts_irq_enable(info, true);
  1519. else
  1520. fts_irq_enable(info, false);
  1521. snprintf(buff, sizeof(buff), "%s", "OK");
  1522. info->cmd_state = CMD_STATUS_OK;
  1523. }
  1524. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1525. info->cmd_state = CMD_STATUS_WAITING;
  1526. out:
  1527. mutex_lock(&info->cmd_lock);
  1528. info->cmd_is_running = false;
  1529. mutex_unlock(&info->cmd_lock);
  1530. tsp_debug_info(true, &info->client->dev, "%s: %s\n", __func__, buff);
  1531. }
  1532. #endif
  1533. #ifdef TOUCH_BOOSTER_DVFS
  1534. static void boost_level(void *device_data)
  1535. {
  1536. struct fts_ts_info *info = (struct fts_ts_info *)device_data;
  1537. struct i2c_client *client = info->client;
  1538. char buff[CMD_STR_LEN] = { 0 };
  1539. int retval = 0;
  1540. set_default_result(info);
  1541. /* Level 5 is replaced to Level 3 */
  1542. if(info->cmd_param[0] == DVFS_STAGE_PENTA){
  1543. info->cmd_param[0] = DVFS_STAGE_TRIPLE;
  1544. }
  1545. info->dvfs_boost_mode = info->cmd_param[0];
  1546. dev_info(&client->dev,
  1547. "%s: dvfs_boost_mode = %d\n",
  1548. __func__, info->dvfs_boost_mode);
  1549. snprintf(buff, sizeof(buff), "OK");
  1550. info->cmd_state = CMD_STATUS_OK;
  1551. if (info->dvfs_boost_mode == DVFS_STAGE_NONE) {
  1552. retval = set_freq_limit(DVFS_TOUCH_ID, -1);
  1553. if (retval < 0) {
  1554. dev_err(&info->client->dev,
  1555. "%s: booster stop failed(%d).\n",
  1556. __func__, retval);
  1557. snprintf(buff, sizeof(buff), "NG");
  1558. info->cmd_state = CMD_STATUS_FAIL;
  1559. info->dvfs_lock_status = false;
  1560. }
  1561. }
  1562. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1563. info->cmd_state = CMD_STATUS_WAITING;
  1564. mutex_lock(&info->cmd_lock);
  1565. info->cmd_is_running = false;
  1566. mutex_unlock(&info->cmd_lock);
  1567. return;
  1568. }
  1569. #endif
  1570. #endif