fts_fwu.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. #include <linux/kernel.h>
  2. #include <linux/module.h>
  3. #include <linux/delay.h>
  4. #include <linux/input.h>
  5. #include <linux/firmware.h>
  6. #include <linux/slab.h>
  7. #include <asm/uaccess.h>
  8. #include <linux/hrtimer.h>
  9. #include <linux/interrupt.h>
  10. #include "fts_ts.h"
  11. //#define HOVER_USE 0
  12. #define WRITE_CHUNK_SIZE 64
  13. #define FTS_DEFAULT_UMS_FW "/sdcard/stm.fw"
  14. #define FTS64FILE_SIGNATURE 0xaaaa5555
  15. enum {
  16. BUILT_IN = 0,
  17. UMS,
  18. };
  19. struct fts64_header {
  20. unsigned int signature;
  21. unsigned short fw_ver;
  22. unsigned char fw_id;
  23. unsigned char reserved1;
  24. unsigned char internal_ver[8];
  25. unsigned char released_ver[8];
  26. unsigned int reserved2;
  27. unsigned int checksum;
  28. };
  29. int fts_fw_wait_for_flash_ready(struct fts_ts_info *info)
  30. {
  31. unsigned char regAdd;
  32. unsigned char buf[3];
  33. int retry = 0;
  34. regAdd = FTS_CMD_READ_FLASH_STAT;
  35. while (info->fts_read_reg
  36. (info, &regAdd, 1, (unsigned char *)buf, 1)) {
  37. if ((buf[0] & 0x01) == 0)
  38. break;
  39. if (retry++ > FTS_RETRY_COUNT * 10) {
  40. tsp_debug_err(true, info->dev,
  41. "%s: Time Over\n",
  42. __func__);
  43. return -1;
  44. }
  45. msleep(20);
  46. }
  47. return 0;
  48. }
  49. int fts_fw_burn(struct fts_ts_info *info, unsigned char *fw_data)
  50. {
  51. unsigned char regAdd[WRITE_CHUNK_SIZE + 3];
  52. int section;
  53. // Check busy Flash
  54. if (fts_fw_wait_for_flash_ready(info)<0)
  55. return -1;
  56. // FTS_CMD_UNLOCK_FLASH
  57. tsp_debug_info(true, info->dev, "%s: Unlock Flash\n", __func__);
  58. regAdd[0] = FTS_CMD_UNLOCK_FLASH;
  59. regAdd[1] = 0x74;
  60. regAdd[2] = 0x45;
  61. info->fts_write_reg(info, &regAdd[0], 3);
  62. msleep(500);
  63. // Copy to PRAM
  64. tsp_debug_info(true, info->dev, "%s: Copy to PRAM\n", __func__);
  65. regAdd[0] = FTS_CMD_WRITE_PRAM;
  66. for (section = 0; section < (64 * 1024 / WRITE_CHUNK_SIZE); section++) {
  67. #if defined(CONFIG_SEC_S_PROJECT)
  68. regAdd[0] = FTS_CMD_WRITE_PRAM + (((section * WRITE_CHUNK_SIZE) >> 16) & 0x0f);
  69. #endif
  70. regAdd[1] = ((section * WRITE_CHUNK_SIZE) >> 8) & 0xff;
  71. regAdd[2] = (section * WRITE_CHUNK_SIZE) & 0xff;
  72. memcpy(&regAdd[3],
  73. &fw_data[section * WRITE_CHUNK_SIZE +
  74. sizeof(struct fts64_header)],
  75. WRITE_CHUNK_SIZE);
  76. info->fts_write_reg(info, &regAdd[0], WRITE_CHUNK_SIZE + 3);
  77. }
  78. msleep(100);
  79. // Erase Program Flash
  80. tsp_debug_info(true, info->dev, "%s: Erase Program Flash\n", __func__);
  81. info->fts_command(info, FTS_CMD_ERASE_PROG_FLASH);
  82. msleep(100);
  83. // Check busy Flash
  84. if (fts_fw_wait_for_flash_ready(info)<0)
  85. return -1;
  86. // Burn Program Flash
  87. tsp_debug_info(true, info->dev, "%s: Burn Program Flash\n", __func__);
  88. info->fts_command(info, FTS_CMD_BURN_PROG_FLASH);
  89. msleep(100);
  90. // Check busy Flash
  91. if (fts_fw_wait_for_flash_ready(info)<0)
  92. return -1;
  93. // Reset FTS
  94. tsp_debug_info(true, info->dev, "%s: Reset FTS\n", __func__);
  95. info->fts_systemreset(info);
  96. return 0;
  97. }
  98. int GetSystemStatus(struct fts_ts_info *info, unsigned char *val1, unsigned char *val2)
  99. {
  100. bool rc = -1;
  101. unsigned char regAdd1[4] = { 0xb2, 0x07, 0xfb, 0x04 };
  102. unsigned char regAdd2[4] = { 0xb2, 0x17, 0xfb, 0x04 };
  103. unsigned char data[FTS_EVENT_SIZE];
  104. int retry = 0;
  105. info->fts_write_reg(info, &regAdd1[0], 4);
  106. info->fts_write_reg(info, &regAdd2[0], 4);
  107. memset(data, 0x0, FTS_EVENT_SIZE);
  108. regAdd1[0] = READ_ONE_EVENT;
  109. while (info->fts_read_reg(info, &regAdd1[0], 1, (unsigned char *)data,
  110. FTS_EVENT_SIZE)) {
  111. if ((data[0] == 0x12) && (data[1] == regAdd1[1])
  112. && (data[2] == regAdd1[2])) {
  113. rc = 0;
  114. *val1 = data[3];
  115. tsp_debug_info(true, info->dev,
  116. "%s: System Status 1 : 0x%02x\n",
  117. __func__, data[3]);
  118. }
  119. else if ((data[0] == 0x12) && (data[1] == regAdd2[1])
  120. && (data[2] == regAdd2[2])) {
  121. rc = 0;
  122. *val2 = data[3];
  123. tsp_debug_info(true, info->dev,
  124. "%s: System Status 2 : 0x%02x\n",
  125. __func__, data[3]);
  126. break;
  127. }
  128. if (retry++ > FTS_RETRY_COUNT) {
  129. rc = -1;
  130. tsp_debug_err(true, info->dev,
  131. "Time Over - GetSystemStatus\n");
  132. break;
  133. }
  134. }
  135. return rc;
  136. }
  137. int fts_fw_wait_for_event(struct fts_ts_info *info, unsigned char eid)
  138. {
  139. int rc;
  140. unsigned char regAdd;
  141. unsigned char data[FTS_EVENT_SIZE];
  142. int retry = 0;
  143. memset(data, 0x0, FTS_EVENT_SIZE);
  144. regAdd = READ_ONE_EVENT;
  145. rc = -1;
  146. while (info->fts_read_reg
  147. (info, &regAdd, 1, (unsigned char *)data, FTS_EVENT_SIZE)) {
  148. if ((data[0] == EVENTID_STATUS_EVENT) &&
  149. #if defined(CONFIG_SEC_S_PROJECT)
  150. (data[1] == eid)) {
  151. #else
  152. (data[1] == 0x0B) &&
  153. (data[2] == eid)) {
  154. #endif
  155. rc = 0;
  156. break;
  157. }
  158. if (retry++ > FTS_RETRY_COUNT * 15) {
  159. rc = -1;
  160. tsp_debug_info(true, info->dev, "%s: Time Over\n", __func__);
  161. break;
  162. }
  163. msleep(20);
  164. }
  165. return rc;
  166. }
  167. void fts_fw_init(struct fts_ts_info *info)
  168. {
  169. tsp_debug_info(true, info->dev,"%s, line:%d\n",__func__, __LINE__);
  170. info->fts_command(info, SLEEPOUT);
  171. msleep(50);
  172. info->fts_command(info, CX_TUNNING);
  173. msleep(300);
  174. #if defined(CONFIG_SEC_S_PROJECT)
  175. fts_fw_wait_for_event(info, 0x01);
  176. #else
  177. fts_fw_wait_for_event(info, 0x03);
  178. #endif
  179. #if defined(CONFIG_SEC_T10_PROJECT) // not use 0x96 register is key cx tune
  180. info->fts_command(info, KEY_CX_TUNNING);
  181. msleep(300); // delay check need
  182. /* Hover not used*/
  183. #else // HOVER_USE
  184. info->fts_command(info, SELF_AUTO_TUNE);
  185. msleep(300);
  186. #endif
  187. #if defined(CONFIG_SEC_S_PROJECT)
  188. fts_fw_wait_for_event(info, 0x42);
  189. info->fts_command(info, FTS_CMD_SAVE_CX_TUNING);
  190. msleep(400);
  191. #else
  192. fts_fw_wait_for_event(info, 0x07);
  193. info->fts_command(info, FTS_CMD_SAVE_FWCONFIG);
  194. msleep(200);
  195. info->fts_command(info, FTS_CMD_SAVE_CX_TUNING);
  196. msleep(200);
  197. #endif
  198. // Reset FTS
  199. info->fts_systemreset(info);
  200. info->fts_wait_for_ready(info);
  201. msleep(200);
  202. info->fts_command(info, SLEEPOUT);
  203. msleep(50);
  204. info->fts_command(info, SENSEON);
  205. #ifdef FTS_SUPPORT_TOUCH_KEY
  206. info->fts_command(info, FTS_CMD_KEY_SENSE_ON);
  207. #endif // FTS_SUPPORT_TOUCH_KEY
  208. }
  209. const int fts_fw_updater(struct fts_ts_info *info, unsigned char *fw_data)
  210. {
  211. const struct fts64_header *header;
  212. int retval;
  213. int retry;
  214. unsigned short fw_main_version;
  215. if (!fw_data) {
  216. tsp_debug_err(true, info->dev, "%s: Firmware data is NULL\n",
  217. __func__);
  218. return -ENODEV;
  219. }
  220. header = (struct fts64_header *)fw_data;
  221. fw_main_version = (header->released_ver[0] << 8) +
  222. (header->released_ver[1]);
  223. tsp_debug_info(true, info->dev,
  224. "Starting firmware update : 0x%04X\n",
  225. fw_main_version);
  226. retry = 0;
  227. while (1) {
  228. retval = fts_fw_burn(info, fw_data);
  229. if (retval >= 0) {
  230. info->fts_wait_for_ready(info);
  231. info->fts_get_version_info(info);
  232. #ifdef FTS_SUPPORT_NOISE_PARAM
  233. info->fts_get_noise_param_address(info);
  234. #endif
  235. if (fw_main_version == info->fw_main_version_of_ic) {
  236. tsp_debug_info(true, info->dev,
  237. "%s: Success Firmware update\n",
  238. __func__);
  239. fts_fw_init(info);
  240. retval = 0;
  241. break;
  242. }
  243. }
  244. if (retry++ > 3) {
  245. tsp_debug_err(true, info->dev, "%s: Fail Firmware update\n",
  246. __func__);
  247. retval = -1;
  248. break;
  249. }
  250. }
  251. return retval;
  252. }
  253. EXPORT_SYMBOL(fts_fw_updater);
  254. int fts_fw_update_on_probe(struct fts_ts_info *info)
  255. {
  256. int retval;
  257. const struct firmware *fw_entry = NULL;
  258. unsigned char *fw_data = NULL;
  259. char fw_path[FTS_MAX_FW_PATH];
  260. const struct fts64_header *header;
  261. unsigned char SYS_STAT[2];
  262. snprintf(fw_path, FTS_MAX_FW_PATH, "%s", info->board->firmware_name);
  263. tsp_debug_info(true, info->dev, "%s: Load firmware : %s\n", __func__,
  264. fw_path);
  265. retval = request_firmware(&fw_entry, fw_path, info->dev);
  266. if (retval) {
  267. tsp_debug_err(true, info->dev,
  268. "%s: Firmware image %s not available\n", __func__,
  269. fw_path);
  270. goto done;
  271. }
  272. fw_data = (unsigned char *)fw_entry->data;
  273. header = (struct fts64_header *)fw_data;
  274. info->fw_version_of_bin = (fw_data[5] << 8)+fw_data[4];
  275. info->fw_main_version_of_bin = (header->released_ver[0] << 8) +
  276. (header->released_ver[1]);
  277. info->config_version_of_bin = (fw_data[0xf822] << 8)+fw_data[0xf821];
  278. tsp_debug_info(true, info->dev,
  279. "Bin Firmware Version : 0x%04X "
  280. "Bin Config Version : 0x%04X "
  281. "Bin Main Version : 0x%04X\n",
  282. info->fw_version_of_bin,
  283. info->config_version_of_bin,
  284. info->fw_main_version_of_bin);
  285. if ((info->fw_main_version_of_ic < info->fw_main_version_of_bin)
  286. || ((info->config_version_of_ic < info->config_version_of_bin)))
  287. retval = fts_fw_updater(info, fw_data);
  288. else
  289. retval = -2;
  290. done:
  291. if (fw_entry)
  292. release_firmware(fw_entry);
  293. if (retval < 0) {
  294. if (GetSystemStatus(info, &SYS_STAT[0], &SYS_STAT[1]) >= 0) {
  295. if (SYS_STAT[0] != SYS_STAT[1])
  296. fts_fw_init(info);
  297. }
  298. }
  299. return retval;
  300. }
  301. EXPORT_SYMBOL(fts_fw_update_on_probe);
  302. static int fts_load_fw_from_kernel(struct fts_ts_info *info,
  303. const char *fw_path)
  304. {
  305. int retval;
  306. const struct firmware *fw_entry = NULL;
  307. unsigned char *fw_data = NULL;
  308. if (!fw_path) {
  309. tsp_debug_err(true, info->dev, "%s: Firmware name is not defined\n",
  310. __func__);
  311. return -EINVAL;
  312. }
  313. tsp_debug_info(true, info->dev, "%s: Load firmware : %s\n", __func__,
  314. fw_path);
  315. retval = request_firmware(&fw_entry, fw_path, info->dev);
  316. if (retval) {
  317. tsp_debug_err(true, info->dev,
  318. "%s: Firmware image %s not available\n", __func__,
  319. fw_path);
  320. goto done;
  321. }
  322. // Disable Interrupt
  323. if (info->irq)
  324. disable_irq(info->irq);
  325. else
  326. hrtimer_cancel(&info->timer);
  327. fw_data = (unsigned char *)fw_entry->data;
  328. // Reset FTS
  329. info->fts_systemreset(info);
  330. info->fts_wait_for_ready(info);
  331. retval = fts_fw_updater(info, fw_data);
  332. if (retval)
  333. tsp_debug_err(true, info->dev, "%s: failed update firmware\n",
  334. __func__);
  335. // Enable Interrupt
  336. if (info->irq)
  337. enable_irq(info->irq);
  338. else
  339. hrtimer_start(&info->timer, ktime_set(1, 0), HRTIMER_MODE_REL);
  340. done:
  341. if (fw_entry)
  342. release_firmware(fw_entry);
  343. return retval;
  344. }
  345. static int fts_load_fw_from_ums(struct fts_ts_info *info)
  346. {
  347. struct file *fp;
  348. mm_segment_t old_fs;
  349. unsigned int fw_size, nread;
  350. int error = 0;
  351. old_fs = get_fs();
  352. set_fs(KERNEL_DS);
  353. fp = filp_open(FTS_DEFAULT_UMS_FW, O_RDONLY, S_IRUSR);
  354. if (IS_ERR(fp)) {
  355. tsp_debug_err(true, info->dev, "%s: failed to open %s.\n", __func__,
  356. FTS_DEFAULT_UMS_FW);
  357. error = -ENOENT;
  358. goto open_err;
  359. }
  360. fw_size = fp->f_path.dentry->d_inode->i_size;
  361. if (0 < fw_size) {
  362. unsigned char *fw_data;
  363. const struct fts64_header *header;
  364. fw_data = kzalloc(fw_size, GFP_KERNEL);
  365. nread = vfs_read(fp, (char __user *)fw_data,
  366. fw_size, &fp->f_pos);
  367. tsp_debug_info(true, info->dev,
  368. "%s: start, file path %s, size %u Bytes\n",
  369. __func__, FTS_DEFAULT_UMS_FW, fw_size);
  370. if (nread != fw_size) {
  371. tsp_debug_err(true, info->dev,
  372. "%s: failed to read firmware file, nread %u Bytes\n",
  373. __func__, nread);
  374. error = -EIO;
  375. } else {
  376. header = (struct fts64_header *)fw_data;
  377. if (header->signature == FTS64FILE_SIGNATURE) {
  378. /* UMS case */
  379. // Disable Interrupt
  380. if (info->irq)
  381. disable_irq(info->irq);
  382. else
  383. hrtimer_cancel(&info->timer);
  384. // Reset FTS
  385. info->fts_systemreset(info);
  386. info->fts_wait_for_ready(info);
  387. tsp_debug_info(true, info->dev,
  388. "[UMS] Firmware Version : 0x%04X "
  389. "[UMS] Main Version : 0x%04X\n",
  390. (fw_data[5] << 8)+fw_data[4],
  391. (header->released_ver[0] << 8) +
  392. (header->released_ver[1]));
  393. error = fts_fw_updater(info, fw_data);
  394. // Enable Interrupt
  395. if (info->irq)
  396. enable_irq(info->irq);
  397. else
  398. hrtimer_start(&info->timer,
  399. ktime_set(1, 0),
  400. HRTIMER_MODE_REL);
  401. } else {
  402. error = -1;
  403. tsp_debug_err(true, info->dev,
  404. "%s: File type is not match with FTS64 file. [%8x]\n",
  405. __func__, header->signature);
  406. }
  407. }
  408. if (error < 0)
  409. tsp_debug_err(true, info->dev, "%s: failed update firmware\n",
  410. __func__);
  411. kfree(fw_data);
  412. }
  413. filp_close(fp, NULL);
  414. open_err:
  415. set_fs(old_fs);
  416. return error;
  417. }
  418. int fts_fw_update_on_hidden_menu(struct fts_ts_info *info, int update_type)
  419. {
  420. int retval = 0;
  421. /* Factory cmd for firmware update
  422. * argument represent what is source of firmware like below.
  423. *
  424. * 0 : [BUILT_IN] Getting firmware which is for user.
  425. * 1 : [UMS] Getting firmware from sd card.
  426. */
  427. switch (update_type) {
  428. case BUILT_IN:
  429. #ifdef CONFIG_SEC_FACTORY
  430. #if defined(CONFIG_SEC_S_PROJECT)
  431. retval = fts_load_fw_from_kernel(info, "tsp_stm/stm_s.fw");
  432. #elif !defined(CONFIG_SEC_LOCALE_KOR_FRESCO)
  433. if (info->panel_revision == 0)
  434. retval = fts_load_fw_from_kernel(info, "tsp_stm/stm.fw");
  435. else
  436. retval = fts_load_fw_from_kernel(info, "tsp_stm/stm_de.fw");
  437. #else
  438. retval = fts_load_fw_from_kernel(info, "tsp_stm/stm_sync.fw");
  439. #endif
  440. #else
  441. retval = fts_load_fw_from_kernel(info, info->board->firmware_name);
  442. #endif
  443. break;
  444. case UMS:
  445. retval = fts_load_fw_from_ums(info);
  446. break;
  447. default:
  448. tsp_debug_err(true, info->dev, "%s: Not support command[%d]\n",
  449. __func__, update_type);
  450. break;
  451. }
  452. return retval;
  453. }
  454. EXPORT_SYMBOL(fts_fw_update_on_hidden_menu);