focaltech_ex_fun.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946
  1. /*
  2. *
  3. * FocalTech TouchScreen driver.
  4. *
  5. * Copyright (c) 2010-2015, Focaltech Ltd. All rights reserved.
  6. *
  7. * This software is licensed under the terms of the GNU General Public
  8. * License version 2, as published by the Free Software Foundation, and
  9. * may be copied, distributed, and modified under those terms.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. */
  17. /*******************************************************************************
  18. *
  19. * File Name: Focaltech_ex_fun.c
  20. *
  21. * Author: Xu YongFeng
  22. *
  23. * Created: 2015-01-29
  24. *
  25. * Modify by mshl on 2015-03-20
  26. *
  27. * Abstract:
  28. *
  29. * Reference:
  30. *
  31. *******************************************************************************/
  32. /*******************************************************************************
  33. * 1.Included header files
  34. *******************************************************************************/
  35. #include "focaltech_core.h"
  36. /*******************************************************************************
  37. * Private constant and macro definitions using #define
  38. *******************************************************************************/
  39. /*create apk debug channel*/
  40. #define PROC_UPGRADE 0
  41. #define PROC_READ_REGISTER 1
  42. #define PROC_WRITE_REGISTER 2
  43. #define PROC_AUTOCLB 4
  44. #define PROC_UPGRADE_INFO 5
  45. #define PROC_WRITE_DATA 6
  46. #define PROC_READ_DATA 7
  47. #define PROC_SET_TEST_FLAG 8
  48. #define FTS_DEBUG_DIR_NAME "fts_debug"
  49. #define PROC_NAME "ftxxxx-debug"
  50. #define WRITE_BUF_SIZE 1016
  51. #define READ_BUF_SIZE 1016
  52. /*******************************************************************************
  53. * Private enumerations, structures and unions using typedef
  54. *******************************************************************************/
  55. /*******************************************************************************
  56. * Static variables
  57. *******************************************************************************/
  58. static unsigned char proc_operate_mode = PROC_UPGRADE;
  59. static struct proc_dir_entry *fts_proc_entry;
  60. /*******************************************************************************
  61. * Global variable or extern global variabls/functions
  62. *******************************************************************************/
  63. //#if FT_ESD_PROTECT
  64. extern int apk_debug_flag;
  65. //#endif
  66. /*******************************************************************************
  67. * Static function prototypes
  68. *******************************************************************************/
  69. #if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 10, 0))
  70. /*interface of write proc*/
  71. /************************************************************************
  72. * Name: fts_debug_write
  73. * Brief:interface of write proc
  74. * Input: file point, data buf, data len, no use
  75. * Output: no
  76. * Return: data len
  77. ***********************************************************************/
  78. static ssize_t fts_debug_write(struct file *filp, const char __user *buff, size_t count, loff_t *ppos)
  79. {
  80. unsigned char writebuf[WRITE_BUF_SIZE];
  81. int buflen = count;
  82. int writelen = 0;
  83. int ret = 0;
  84. #if FT_ESD_PROTECT
  85. //printk("\n zax proc w 0 \n");
  86. esd_switch(0);apk_debug_flag = 1;
  87. //printk("\n zax v= %d \n",apk_debug_flag);
  88. #endif
  89. if (copy_from_user(&writebuf, buff, buflen)) {
  90. dev_err(&fts_i2c_client->dev, "%s:copy from user error\n", __func__);
  91. #if FT_ESD_PROTECT
  92. esd_switch(1);apk_debug_flag = 0;
  93. #endif
  94. return -EFAULT;
  95. }
  96. proc_operate_mode = writebuf[0];
  97. switch (proc_operate_mode) {
  98. case PROC_UPGRADE:
  99. {
  100. char upgrade_file_path[128];
  101. memset(upgrade_file_path, 0, sizeof(upgrade_file_path));
  102. sprintf(upgrade_file_path, "%s", writebuf + 1);
  103. upgrade_file_path[buflen-1] = '\0';
  104. TPD_DEBUG("%s\n", upgrade_file_path);
  105. //#if FT_ESD_PROTECT
  106. // esd_switch(0);apk_debug_flag = 1;
  107. //#endif
  108. disable_irq(fts_i2c_client->irq);
  109. ret = fts_ctpm_fw_upgrade_with_app_file(fts_i2c_client, upgrade_file_path);
  110. enable_irq(fts_i2c_client->irq);
  111. if (ret < 0) {
  112. #if FT_ESD_PROTECT
  113. esd_switch(1);apk_debug_flag = 0;
  114. #endif
  115. dev_err(&fts_i2c_client->dev, "%s:upgrade failed.\n", __func__);
  116. return ret;
  117. }
  118. //#if FT_ESD_PROTECT
  119. // esd_switch(1);apk_debug_flag = 0;
  120. //#endif
  121. }
  122. break;
  123. //case PROC_SET_TEST_FLAG:
  124. // break;
  125. case PROC_SET_TEST_FLAG:
  126. #if FT_ESD_PROTECT
  127. apk_debug_flag=writebuf[1];
  128. if(1==apk_debug_flag)
  129. esd_switch(0);
  130. else if(0==apk_debug_flag)
  131. esd_switch(1);
  132. printk("\n zax flag=%d \n",apk_debug_flag);
  133. #endif
  134. break;
  135. case PROC_READ_REGISTER:
  136. writelen = 1;
  137. ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen);
  138. if (ret < 0) {
  139. #if FT_ESD_PROTECT
  140. esd_switch(1);apk_debug_flag = 0;
  141. #endif
  142. dev_err(&fts_i2c_client->dev, "%s:write iic error\n", __func__);
  143. return ret;
  144. }
  145. break;
  146. case PROC_WRITE_REGISTER:
  147. writelen = 2;
  148. ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen);
  149. if (ret < 0) {
  150. #if FT_ESD_PROTECT
  151. esd_switch(1);apk_debug_flag = 0;
  152. #endif
  153. dev_err(&fts_i2c_client->dev, "%s:write iic error\n", __func__);
  154. return ret;
  155. }
  156. break;
  157. case PROC_AUTOCLB:
  158. TPD_DEBUG("%s: autoclb\n", __func__);
  159. fts_ctpm_auto_clb(fts_i2c_client);
  160. break;
  161. case PROC_READ_DATA:
  162. case PROC_WRITE_DATA:
  163. writelen = count - 1;
  164. if(writelen>0)
  165. {
  166. ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen);
  167. if (ret < 0) {
  168. #if FT_ESD_PROTECT
  169. esd_switch(1);apk_debug_flag = 0;
  170. #endif
  171. dev_err(&fts_i2c_client->dev, "%s:write iic error\n", __func__);
  172. return ret;
  173. }
  174. }
  175. break;
  176. default:
  177. break;
  178. }
  179. #if FT_ESD_PROTECT
  180. //printk("\n zax proc w 1 \n");
  181. esd_switch(1);apk_debug_flag = 0;
  182. //printk("\n zax v= %d \n",apk_debug_flag);
  183. #endif
  184. return count;
  185. }
  186. /* interface of read proc */
  187. /************************************************************************
  188. * Name: fts_debug_read
  189. * Brief:interface of read proc
  190. * Input: point to the data, no use, no use, read len, no use, no use
  191. * Output: page point to data
  192. * Return: read char number
  193. ***********************************************************************/
  194. static ssize_t fts_debug_read(struct file *filp, char __user *buff, size_t count, loff_t *ppos)
  195. {
  196. int ret = 0;
  197. int num_read_chars = 0;
  198. int readlen = 0;
  199. u8 regvalue = 0x00, regaddr = 0x00;
  200. unsigned char buf[READ_BUF_SIZE];
  201. #if FT_ESD_PROTECT
  202. //printk("\n zax proc r 0 \n");
  203. esd_switch(0);apk_debug_flag = 1;
  204. //printk("\n zax v= %d \n",apk_debug_flag);
  205. #endif
  206. switch (proc_operate_mode) {
  207. case PROC_UPGRADE:
  208. // after calling fts_debug_write to upgrade
  209. regaddr = 0xA6;
  210. ret = fts_read_reg(fts_i2c_client, regaddr, &regvalue);
  211. if (ret < 0)
  212. num_read_chars = sprintf(buf, "%s", "get fw version failed.\n");
  213. else
  214. num_read_chars = sprintf(buf, "current fw version:0x%02x\n", regvalue);
  215. break;
  216. case PROC_READ_REGISTER:
  217. readlen = 1;
  218. ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen);
  219. if (ret < 0) {
  220. #if FT_ESD_PROTECT
  221. esd_switch(1);apk_debug_flag = 0;
  222. #endif
  223. dev_err(&fts_i2c_client->dev, "%s:read iic error\n", __func__);
  224. return ret;
  225. }
  226. num_read_chars = 1;
  227. break;
  228. case PROC_READ_DATA:
  229. readlen = count;
  230. ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen);
  231. if (ret < 0) {
  232. #if FT_ESD_PROTECT
  233. esd_switch(1);apk_debug_flag = 0;
  234. #endif
  235. dev_err(&fts_i2c_client->dev, "%s:read iic error\n", __func__);
  236. return ret;
  237. }
  238. num_read_chars = readlen;
  239. break;
  240. case PROC_WRITE_DATA:
  241. break;
  242. default:
  243. break;
  244. }
  245. if (copy_to_user(buff, buf, num_read_chars)) {
  246. dev_err(&fts_i2c_client->dev, "%s:copy to user error\n", __func__);
  247. #if FT_ESD_PROTECT
  248. esd_switch(1);apk_debug_flag = 0;
  249. #endif
  250. return -EFAULT;
  251. }
  252. #if FT_ESD_PROTECT
  253. //printk("\n zax proc r 1 \n");
  254. esd_switch(1);apk_debug_flag = 0;
  255. //printk("\n zax v= %d \n",apk_debug_flag);
  256. #endif
  257. //memcpy(buff, buf, num_read_chars);
  258. return num_read_chars;
  259. }
  260. static const struct file_operations fts_proc_fops = {
  261. .owner = THIS_MODULE,
  262. .read = fts_debug_read,
  263. .write = fts_debug_write,
  264. };
  265. #else
  266. /* interface of write proc */
  267. /************************************************************************
  268. * Name: fts_debug_write
  269. * Brief:interface of write proc
  270. * Input: file point, data buf, data len, no use
  271. * Output: no
  272. * Return: data len
  273. ***********************************************************************/
  274. static int fts_debug_write(struct file *filp,
  275. const char __user *buff, unsigned long len, void *data)
  276. {
  277. //struct i2c_client *client = (struct i2c_client *)fts_proc_entry->data;
  278. unsigned char writebuf[WRITE_BUF_SIZE];
  279. int buflen = len;
  280. int writelen = 0;
  281. int ret = 0;
  282. #if FT_ESD_PROTECT
  283. //printk("\n zax proc w 0 \n");
  284. esd_switch(0);apk_debug_flag = 1;
  285. //printk("\n zax v= %d \n",apk_debug_flag);
  286. #endif
  287. if (copy_from_user(&writebuf, buff, buflen)) {
  288. dev_err(&fts_i2c_client->dev, "%s:copy from user error\n", __func__);
  289. #if FT_ESD_PROTECT
  290. esd_switch(1);apk_debug_flag = 0;
  291. #endif
  292. return -EFAULT;
  293. }
  294. proc_operate_mode = writebuf[0];
  295. switch (proc_operate_mode) {
  296. case PROC_UPGRADE:
  297. {
  298. char upgrade_file_path[128];
  299. memset(upgrade_file_path, 0, sizeof(upgrade_file_path));
  300. sprintf(upgrade_file_path, "%s", writebuf + 1);
  301. upgrade_file_path[buflen-1] = '\0';
  302. TPD_DEBUG("%s\n", upgrade_file_path);
  303. //#if FT_ESD_PROTECT
  304. // esd_switch(0);apk_debug_flag = 1;
  305. //#endif
  306. disable_irq(fts_i2c_client->irq);
  307. ret = fts_ctpm_fw_upgrade_with_app_file(fts_i2c_client, upgrade_file_path);
  308. enable_irq(fts_i2c_client->irq);
  309. if (ret < 0) {
  310. dev_err(&fts_i2c_client->dev, "%s:upgrade failed.\n", __func__);
  311. #if FT_ESD_PROTECT
  312. esd_switch(1);apk_debug_flag = 0;
  313. #endif
  314. return ret;
  315. }
  316. //#if FT_ESD_PROTECT
  317. // esd_switch(1);apk_debug_flag = 0;
  318. //#endif
  319. }
  320. break;
  321. //case PROC_SET_TEST_FLAG:
  322. // break;
  323. case PROC_SET_TEST_FLAG:
  324. #if FT_ESD_PROTECT
  325. apk_debug_flag=writebuf[1];
  326. if(1==apk_debug_flag)
  327. esd_switch(0);
  328. else if(0==apk_debug_flag)
  329. esd_switch(1);
  330. printk("\n zax flag=%d \n",apk_debug_flag);
  331. #endif
  332. break;
  333. case PROC_READ_REGISTER:
  334. writelen = 1;
  335. ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen);
  336. if (ret < 0) {
  337. #if FT_ESD_PROTECT
  338. esd_switch(1);apk_debug_flag = 0;
  339. #endif
  340. dev_err(&fts_i2c_client->dev, "%s:write iic error\n", __func__);
  341. return ret;
  342. }
  343. break;
  344. case PROC_WRITE_REGISTER:
  345. writelen = 2;
  346. ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen);
  347. if (ret < 0) {
  348. #if FT_ESD_PROTECT
  349. esd_switch(1);apk_debug_flag = 0;
  350. #endif
  351. dev_err(&fts_i2c_client->dev, "%s:write iic error\n", __func__);
  352. return ret;
  353. }
  354. break;
  355. case PROC_AUTOCLB:
  356. TPD_DEBUG("%s: autoclb\n", __func__);
  357. fts_ctpm_auto_clb(fts_i2c_client);
  358. break;
  359. case PROC_READ_DATA:
  360. case PROC_WRITE_DATA:
  361. writelen = len - 1;
  362. if(writelen>0)
  363. {
  364. ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen);
  365. if (ret < 0) {
  366. #if FT_ESD_PROTECT
  367. esd_switch(1);apk_debug_flag = 0;
  368. #endif
  369. dev_err(&fts_i2c_client->dev, "%s:write iic error\n", __func__);
  370. return ret;
  371. }
  372. }
  373. break;
  374. default:
  375. break;
  376. }
  377. #if FT_ESD_PROTECT
  378. //printk("\n zax proc w 1 \n");
  379. esd_switch(1);apk_debug_flag = 0;
  380. //printk("\n zax v= %d \n",apk_debug_flag);
  381. #endif
  382. return len;
  383. }
  384. /* interface of read proc */
  385. /************************************************************************
  386. * Name: fts_debug_read
  387. * Brief:interface of read proc
  388. * Input: point to the data, no use, no use, read len, no use, no use
  389. * Output: page point to data
  390. * Return: read char number
  391. ***********************************************************************/
  392. static int fts_debug_read( char *page, char **start,
  393. off_t off, int count, int *eof, void *data )
  394. {
  395. //struct i2c_client *client = (struct i2c_client *)fts_proc_entry->data;
  396. int ret = 0;
  397. unsigned char buf[READ_BUF_SIZE];
  398. int num_read_chars = 0;
  399. int readlen = 0;
  400. u8 regvalue = 0x00, regaddr = 0x00;
  401. #if FT_ESD_PROTECT
  402. //printk("\n zax proc r 0 \n");
  403. esd_switch(0);apk_debug_flag = 1;
  404. //printk("\n zax v= %d \n",apk_debug_flag);
  405. #endif
  406. switch (proc_operate_mode) {
  407. case PROC_UPGRADE:
  408. // after calling fts_debug_write to upgrade
  409. regaddr = 0xA6;
  410. ret = fts_read_reg(fts_i2c_client, regaddr, &regvalue);
  411. if (ret < 0)
  412. num_read_chars = sprintf(buf, "%s", "get fw version failed.\n");
  413. else
  414. num_read_chars = sprintf(buf, "current fw version:0x%02x\n", regvalue);
  415. break;
  416. case PROC_READ_REGISTER:
  417. readlen = 1;
  418. ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen);
  419. if (ret < 0) {
  420. #if FT_ESD_PROTECT
  421. esd_switch(1);apk_debug_flag = 0;
  422. #endif
  423. dev_err(&fts_i2c_client->dev, "%s:read iic error\n", __func__);
  424. return ret;
  425. }
  426. num_read_chars = 1;
  427. break;
  428. case PROC_READ_DATA:
  429. readlen = count;
  430. ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen);
  431. if (ret < 0) {
  432. #if FT_ESD_PROTECT
  433. esd_switch(1);apk_debug_flag = 0;
  434. #endif
  435. dev_err(&fts_i2c_client->dev, "%s:read iic error\n", __func__);
  436. return ret;
  437. }
  438. num_read_chars = readlen;
  439. break;
  440. case PROC_WRITE_DATA:
  441. break;
  442. default:
  443. break;
  444. }
  445. memcpy(page, buf, num_read_chars);
  446. #if FT_ESD_PROTECT
  447. //printk("\n zax proc r 1 \n");
  448. esd_switch(1);apk_debug_flag = 0;
  449. //printk("\n zax v= %d \n",apk_debug_flag);
  450. #endif
  451. return num_read_chars;
  452. }
  453. #endif
  454. /************************************************************************
  455. * Name: fts_create_apk_debug_channel
  456. * Brief: create apk debug channel
  457. * Input: i2c info
  458. * Output: no
  459. * Return: success =0
  460. ***********************************************************************/
  461. int fts_create_apk_debug_channel(struct i2c_client * client)
  462. {
  463. #if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 10, 0))
  464. fts_proc_entry = proc_create(PROC_NAME, 0777, NULL, &fts_proc_fops);
  465. #else
  466. fts_proc_entry = create_proc_entry(PROC_NAME, 0777, NULL);
  467. #endif
  468. if (NULL == fts_proc_entry)
  469. {
  470. dev_err(&client->dev, "Couldn't create proc entry!\n");
  471. return -ENOMEM;
  472. }
  473. else
  474. {
  475. dev_info(&client->dev, "Create proc entry success!\n");
  476. #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
  477. //fts_proc_entry->data = client;
  478. fts_proc_entry->write_proc = fts_debug_write;
  479. fts_proc_entry->read_proc = fts_debug_read;
  480. #endif
  481. }
  482. return 0;
  483. }
  484. /************************************************************************
  485. * Name: fts_release_apk_debug_channel
  486. * Brief: release apk debug channel
  487. * Input: no
  488. * Output: no
  489. * Return: no
  490. ***********************************************************************/
  491. void fts_release_apk_debug_channel(void)
  492. {
  493. if (fts_proc_entry)
  494. #if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 10, 0))
  495. proc_remove(fts_proc_entry);
  496. #else
  497. remove_proc_entry(PROC_NAME, NULL);
  498. #endif
  499. }
  500. /************************************************************************
  501. * Name: fts_tpfwver_show
  502. * Brief: show tp fw vwersion
  503. * Input: device, device attribute, char buf
  504. * Output: no
  505. * Return: char number
  506. ***********************************************************************/
  507. static ssize_t fts_tpfwver_show(struct device *dev, struct device_attribute *attr, char *buf)
  508. {
  509. ssize_t num_read_chars = 0;
  510. u8 fwver = 0;
  511. //struct i2c_client *client = container_of(dev, struct i2c_client, dev); jacob use globle fts_wq_data data
  512. mutex_lock(&fts_input_dev->mutex);
  513. if (fts_read_reg(fts_i2c_client, FTS_REG_FW_VER, &fwver) < 0)
  514. return -1;
  515. if (fwver == 255)
  516. num_read_chars = snprintf(buf, PAGE_SIZE,"get tp fw version fail!\n");
  517. else
  518. {
  519. num_read_chars = snprintf(buf, PAGE_SIZE, "%02X\n", fwver);
  520. }
  521. mutex_unlock(&fts_input_dev->mutex);
  522. return num_read_chars;
  523. }
  524. /************************************************************************
  525. * Name: fts_tpfwver_store
  526. * Brief: no
  527. * Input: device, device attribute, char buf, char count
  528. * Output: no
  529. * Return: EPERM
  530. ***********************************************************************/
  531. static ssize_t fts_tpfwver_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
  532. {
  533. /* place holder for future use */
  534. return -EPERM;
  535. }
  536. int isNumCh(const char ch){
  537. int result = 0;
  538. //获取16进制的高字节位数据
  539. if(ch >= '0' && ch <= '9'){
  540. result = 1;//(int)(ch - '0');
  541. }
  542. else if(ch >= 'a' && ch <= 'f'){
  543. result = 1;//(int)(ch - 'a') + 10;
  544. }
  545. else if(ch >= 'A' && ch <= 'F'){
  546. result = 1;//(int)(ch - 'A') + 10;
  547. }
  548. else{
  549. result = 0;
  550. }
  551. return result;
  552. }
  553. int hexCharToValue(const char ch){
  554. int result = 0;
  555. //获取16进制的高字节位数据
  556. if(ch >= '0' && ch <= '9'){
  557. result = (int)(ch - '0');
  558. }
  559. else if(ch >= 'a' && ch <= 'f'){
  560. result = (int)(ch - 'a') + 10;
  561. }
  562. else if(ch >= 'A' && ch <= 'F'){
  563. result = (int)(ch - 'A') + 10;
  564. }
  565. else{
  566. result = -1;
  567. }
  568. return result;
  569. }
  570. int hexToStr(char *hex, int iHexLen, char *ch, int *iChLen)
  571. {
  572. int high=0;
  573. int low=0;
  574. int tmp = 0;
  575. int i = 0;
  576. int iCharLen = 0;
  577. if(hex == NULL || ch == NULL){
  578. return -1;
  579. }
  580. printk("iHexLen: %d in function:%s\n\n", iHexLen, __func__);
  581. if(iHexLen %2 == 1){
  582. return -2;
  583. }
  584. for(i=0; i<iHexLen; i+=2)
  585. {
  586. high = hexCharToValue(hex[i]);
  587. if(high < 0){
  588. ch[iCharLen] = '\0';
  589. return -3;
  590. }
  591. low = hexCharToValue(hex[i+1]);
  592. if(low < 0){
  593. ch[iCharLen] = '\0';
  594. return -3;
  595. }
  596. tmp = (high << 4) + low;
  597. ch[iCharLen++] = (char)tmp;
  598. }
  599. ch[iCharLen] = '\0';
  600. *iChLen = iCharLen;
  601. printk("iCharLen: %d, iChLen: %d in function:%s\n\n", iCharLen, *iChLen, __func__);
  602. return 0;
  603. }
  604. void strToBytes(char * bufStr, int iLen, char* uBytes, int *iBytesLen)
  605. {
  606. int i=0;
  607. int iNumChLen=0;
  608. *iBytesLen=0;
  609. for(i=0; i<iLen; i++)
  610. {
  611. if(isNumCh(bufStr[i]))//filter illegal chars
  612. {
  613. bufStr[iNumChLen++] = bufStr[i];
  614. }
  615. }
  616. bufStr[iNumChLen] = '\0';
  617. hexToStr(bufStr, iNumChLen, uBytes, iBytesLen);
  618. }
  619. /************************************************************************
  620. * Name: fts_tprwreg_show
  621. * Brief: no
  622. * Input: device, device attribute, char buf
  623. * Output: no
  624. * Return: EPERM
  625. ***********************************************************************/
  626. static ssize_t fts_tprwreg_show(struct device *dev, struct device_attribute *attr, char *buf)
  627. {
  628. /* place holder for future use */
  629. return -EPERM;
  630. }
  631. /************************************************************************
  632. * Name: fts_tprwreg_store
  633. * Brief: read/write register
  634. * Input: device, device attribute, char buf, char count
  635. * Output: print register value
  636. * Return: char count
  637. ***********************************************************************/
  638. static ssize_t fts_tprwreg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
  639. {
  640. struct i2c_client *client = container_of(dev, struct i2c_client, dev);
  641. ssize_t num_read_chars = 0;
  642. int retval;
  643. /*u32 wmreg=0;*/
  644. long unsigned int wmreg=0;
  645. u8 regaddr=0xff,regvalue=0xff;
  646. u8 valbuf[5]={0};
  647. memset(valbuf, 0, sizeof(valbuf));
  648. mutex_lock(&fts_input_dev->mutex);
  649. num_read_chars = count - 1;
  650. if (num_read_chars != 2)
  651. {
  652. if (num_read_chars != 4)
  653. {
  654. dev_err(dev, "please input 2 or 4 character\n");
  655. goto error_return;
  656. }
  657. }
  658. memcpy(valbuf, buf, num_read_chars);
  659. //retval = strict_strtoul(valbuf, 16, &wmreg);
  660. strToBytes((char*)buf, num_read_chars, valbuf, &retval);
  661. if(1==retval)
  662. {
  663. regaddr = valbuf[0];
  664. retval = 0;
  665. }
  666. else if(2==retval)
  667. {
  668. regaddr = valbuf[0];
  669. regvalue = valbuf[1];
  670. retval = 0;
  671. }
  672. else retval =-1;
  673. if (0 != retval)
  674. {
  675. dev_err(dev, "%s() - ERROR: Could not convert the given input to a number. The given input was: \"%s\"\n", __FUNCTION__, buf);
  676. goto error_return;
  677. }
  678. if (2 == num_read_chars)
  679. {
  680. /*read register*/
  681. regaddr = wmreg;
  682. printk("[focal](0x%02x)\n", regaddr);
  683. if (fts_read_reg(client, regaddr, &regvalue) < 0)
  684. printk("[Focal] %s : Could not read the register(0x%02x)\n", __func__, regaddr);
  685. else
  686. printk("[Focal] %s : the register(0x%02x) is 0x%02x\n", __func__, regaddr, regvalue);
  687. }
  688. else
  689. {
  690. regaddr = wmreg>>8;
  691. regvalue = wmreg;
  692. if (fts_write_reg(client, regaddr, regvalue)<0)
  693. dev_err(dev, "[Focal] %s : Could not write the register(0x%02x)\n", __func__, regaddr);
  694. else
  695. dev_dbg(dev, "[Focal] %s : Write 0x%02x into register(0x%02x) successful\n", __func__, regvalue, regaddr);
  696. }
  697. error_return:
  698. mutex_unlock(&fts_input_dev->mutex);
  699. return count;
  700. }
  701. /************************************************************************
  702. * Name: fts_fwupdate_show
  703. * Brief: no
  704. * Input: device, device attribute, char buf
  705. * Output: no
  706. * Return: EPERM
  707. ***********************************************************************/
  708. static ssize_t fts_fwupdate_show(struct device *dev, struct device_attribute *attr, char *buf)
  709. {
  710. /* place holder for future use */
  711. return -EPERM;
  712. }
  713. /************************************************************************
  714. * Name: fts_fwupdate_store
  715. * Brief: upgrade from *.i
  716. * Input: device, device attribute, char buf, char count
  717. * Output: no
  718. * Return: char count
  719. ***********************************************************************/
  720. static ssize_t fts_fwupdate_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
  721. {
  722. //struct fts_ts_data *data = NULL;
  723. u8 uc_host_fm_ver;
  724. int i_ret;
  725. struct i2c_client *client = container_of(dev, struct i2c_client, dev);
  726. //data = (struct fts_ts_data *) i2c_get_clientdata(client);
  727. #if FT_ESD_PROTECT
  728. esd_switch(0);apk_debug_flag = 1;
  729. #endif
  730. mutex_lock(&fts_input_dev->mutex);
  731. disable_irq(client->irq);
  732. i_ret = fts_ctpm_fw_upgrade_with_i_file(client);
  733. if (i_ret == 0)
  734. {
  735. msleep(300);
  736. uc_host_fm_ver = fts_ctpm_get_i_file_ver();
  737. dev_dbg(dev, "%s [FTS] upgrade to new version 0x%x\n", __func__, uc_host_fm_ver);
  738. }
  739. else
  740. {
  741. dev_err(dev, "%s ERROR:[FTS] upgrade failed ret=%d.\n", __func__, i_ret);
  742. }
  743. //fts_ctpm_auto_upgrade(client);
  744. enable_irq(client->irq);
  745. mutex_unlock(&fts_input_dev->mutex);
  746. #if FT_ESD_PROTECT
  747. esd_switch(1);apk_debug_flag = 0;
  748. #endif
  749. return count;
  750. }
  751. /************************************************************************
  752. * Name: fts_fwupgradeapp_show
  753. * Brief: no
  754. * Input: device, device attribute, char buf
  755. * Output: no
  756. * Return: EPERM
  757. ***********************************************************************/
  758. static ssize_t fts_fwupgradeapp_show(struct device *dev, struct device_attribute *attr, char *buf)
  759. {
  760. /* place holder for future use */
  761. return -EPERM;
  762. }
  763. /************************************************************************
  764. * Name: fts_fwupgradeapp_store
  765. * Brief: upgrade from app.bin
  766. * Input: device, device attribute, char buf, char count
  767. * Output: no
  768. * Return: char count
  769. ***********************************************************************/
  770. static ssize_t fts_fwupgradeapp_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
  771. {
  772. char fwname[128];
  773. struct i2c_client *client = container_of(dev, struct i2c_client, dev);
  774. memset(fwname, 0, sizeof(fwname));
  775. sprintf(fwname, "%s", buf);
  776. fwname[count-1] = '\0';
  777. #if FT_ESD_PROTECT
  778. esd_switch(0);apk_debug_flag = 1;
  779. #endif
  780. mutex_lock(&fts_input_dev->mutex);
  781. disable_irq(client->irq);
  782. fts_ctpm_fw_upgrade_with_app_file(client, fwname);
  783. enable_irq(client->irq);
  784. mutex_unlock(&fts_input_dev->mutex);
  785. #if FT_ESD_PROTECT
  786. esd_switch(1);apk_debug_flag = 0;
  787. #endif
  788. return count;
  789. }
  790. /************************************************************************
  791. * Name: fts_ftsgetprojectcode_show
  792. * Brief: no
  793. * Input: device, device attribute, char buf
  794. * Output: no
  795. * Return: EPERM
  796. ***********************************************************************/
  797. static ssize_t fts_getprojectcode_show(struct device *dev, struct device_attribute *attr, char *buf)
  798. {
  799. return -EPERM;
  800. }
  801. /************************************************************************
  802. * Name: fts_ftsgetprojectcode_store
  803. * Brief: no
  804. * Input: device, device attribute, char buf, char count
  805. * Output: no
  806. * Return: EPERM
  807. ***********************************************************************/
  808. static ssize_t fts_getprojectcode_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
  809. {
  810. /* place holder for future use */
  811. return -EPERM;
  812. }
  813. /****************************************/
  814. /* sysfs */
  815. /* get the fw version
  816. * example:cat ftstpfwver
  817. */
  818. static DEVICE_ATTR(ftstpfwver, S_IRUGO|S_IWUSR, fts_tpfwver_show, fts_tpfwver_store);
  819. /* upgrade from *.i
  820. * example: echo 1 > ftsfwupdate
  821. */
  822. static DEVICE_ATTR(ftsfwupdate, S_IRUGO|S_IWUSR, fts_fwupdate_show, fts_fwupdate_store);
  823. /* read and write register
  824. * read example: echo 88 > ftstprwreg ---read register 0x88
  825. * write example:echo 8807 > ftstprwreg ---write 0x07 into register 0x88
  826. *
  827. * note:the number of input must be 2 or 4.if it not enough,please fill in the 0.
  828. */
  829. static DEVICE_ATTR(ftstprwreg, S_IRUGO|S_IWUSR, fts_tprwreg_show, fts_tprwreg_store);
  830. /* upgrade from app.bin
  831. * example:echo "*_app.bin" > ftsfwupgradeapp
  832. */
  833. static DEVICE_ATTR(ftsfwupgradeapp, S_IRUGO|S_IWUSR, fts_fwupgradeapp_show, fts_fwupgradeapp_store);
  834. static DEVICE_ATTR(ftsgetprojectcode, S_IRUGO|S_IWUSR, fts_getprojectcode_show, fts_getprojectcode_store);
  835. /* add your attr in here*/
  836. static struct attribute *fts_attributes[] = {
  837. &dev_attr_ftstpfwver.attr,
  838. &dev_attr_ftsfwupdate.attr,
  839. &dev_attr_ftstprwreg.attr,
  840. &dev_attr_ftsfwupgradeapp.attr,
  841. &dev_attr_ftsgetprojectcode.attr,
  842. NULL
  843. };
  844. static struct attribute_group fts_attribute_group = {
  845. .attrs = fts_attributes
  846. };
  847. /************************************************************************
  848. * Name: fts_create_sysfs
  849. * Brief: create sysfs for debug
  850. * Input: i2c info
  851. * Output: no
  852. * Return: success =0
  853. ***********************************************************************/
  854. int fts_create_sysfs(struct i2c_client * client)
  855. {
  856. int err;
  857. err = sysfs_create_group(&client->dev.kobj, &fts_attribute_group);
  858. if (0 != err)
  859. {
  860. dev_err(&client->dev, "%s() - ERROR: sysfs_create_group() failed.\n", __func__);
  861. sysfs_remove_group(&client->dev.kobj, &fts_attribute_group);
  862. return -EIO;
  863. }
  864. else
  865. {
  866. pr_info("fts:%s() - sysfs_create_group() succeeded.\n",__func__);
  867. }
  868. //HidI2c_To_StdI2c(client);
  869. return err;
  870. }
  871. /************************************************************************
  872. * Name: fts_remove_sysfs
  873. * Brief: remove sys
  874. * Input: i2c info
  875. * Output: no
  876. * Return: no
  877. ***********************************************************************/
  878. int fts_remove_sysfs(struct i2c_client * client)
  879. {
  880. sysfs_remove_group(&client->dev.kobj, &fts_attribute_group);
  881. return 0;
  882. }