ssp_firmware.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906
  1. /*
  2. * Copyright (C) 2012, Samsung Electronics Co. Ltd. All Rights Reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. */
  15. #include "ssp.h"
  16. #define SSP_FIRMWARE_REVISION_STM 14062600
  17. #define SSP_FIRMWARE_REVISION_TASMAN 14061000
  18. #define SSP_FIRMWARE_REVISION_PATEK 14070700
  19. #define SSP_FIRMWARE_REVISION_MAXIM_PATEK 14081300
  20. #define BOOT_SPI_HZ 4800000
  21. #define NORM_SPI_HZ 4800000
  22. /* Bootload mode cmd */
  23. #define BL_FW_NAME "ssp_stm.fw"
  24. #define BL_FW_NAME_TASMAN "ssp_stm_tasman.fw"
  25. #define BL_FW_NAME_PATEK "ssp_stm_patek.fw"
  26. #define BL_FW_NAME_MAXIM_PATEK "ssp_stm_maxim_patek.fw"
  27. #define BL_UMS_FW_NAME "ssp_stm.bin"
  28. #define BL_CRASHED_FW_NAME "ssp_crashed.fw"
  29. #define BL_UMS_FW_PATH 255
  30. #define APP_SLAVE_ADDR 0x18
  31. #define BOOTLOADER_SLAVE_ADDR 0x26
  32. /* Bootloader mode status */
  33. #define BL_WAITING_BOOTLOAD_CMD 0xc0 /* valid 7 6 bit only */
  34. #define BL_WAITING_FRAME_DATA 0x80 /* valid 7 6 bit only */
  35. #define BL_FRAME_CRC_CHECK 0x02
  36. #define BL_FRAME_CRC_FAIL 0x03
  37. #define BL_FRAME_CRC_PASS 0x04
  38. #define BL_APP_CRC_FAIL 0x40 /* valid 7 8 bit only */
  39. #define BL_BOOT_STATUS_MASK 0x3f
  40. /* Command to unlock bootloader */
  41. #define BL_UNLOCK_CMD_MSB 0xaa
  42. #define BL_UNLOCK_CMD_LSB 0xdc
  43. /* STM */
  44. #define SSP_STM_DEBUG 0
  45. #define STM_SHOULD_BE_IMPLEMENT 0
  46. #define SEND_ADDR_LEN 5
  47. #define BL_SPI_SOF 0x5A
  48. #define BL_ACK 0x79
  49. #define BL_ACK2 0xF9
  50. #define BL_NACK 0x1F
  51. #define BL_IDLE 0xA5
  52. #define BL_DUMMY 0x00
  53. #define STM_MAX_XFER_SIZE 256
  54. #define STM_MAX_BUFFER_SIZE 260
  55. #define STM_APP_ADDR 0x08000000
  56. #define BYTE_DELAY_READ 10
  57. #define BYTE_DELAY_WRITE 8
  58. #define DEF_ACK_ERASE_NUMBER 14000 // Erase time ack wait increase : Flash size adjust
  59. #define DEF_ACKCMD_NUMBER 40
  60. #define DEF_ACKROOF_NUMBER 40
  61. #define WMEM_COMMAND 0x31 /* Write Memory command */
  62. #define GO_COMMAND 0x21 /* GO command */
  63. #define EXT_ER_COMMAND 0x44 /* Erase Memory command */
  64. #define XOR_RMEM_COMMAND 0xEE /* Read Memory command */
  65. #define XOR_WMEM_COMMAND 0xCE /* Write Memory command */
  66. #define XOR_GO_COMMAND 0xDE /* GO command */
  67. #define XOR_EXT_ER_COMMAND 0xBB /* Erase Memory command */
  68. #define EXT_ER_DATA_LEN 3
  69. #define BLMODE_RETRYCOUNT 3
  70. #define BYTETOBYTE_USED 0
  71. struct stm32fwu_spi_cmd {
  72. u8 cmd;
  73. u8 xor_cmd;
  74. u8 ack_pad; /* Send this when waiting for an ACK */
  75. u8 reserved;
  76. int status; /* ACK or NACK (or error) */
  77. int timeout; /* This is number of retries */
  78. int ack_loops; // Not used
  79. };
  80. static int stm32fwu_spi_write(struct spi_device *spi, const u8 *buffer, ssize_t len);
  81. unsigned int get_module_rev(struct ssp_data *data)
  82. {
  83. #if defined(CONFIG_SEC_KSPORTS_PROJECT)
  84. return SSP_FIRMWARE_REVISION_TASMAN;
  85. #elif defined(CONFIG_SEC_PATEK_PROJECT)
  86. if (data->ap_rev >= MAXIM_MAX21103_REV)
  87. return SSP_FIRMWARE_REVISION_MAXIM_PATEK;
  88. else
  89. return SSP_FIRMWARE_REVISION_PATEK;
  90. #else
  91. return SSP_FIRMWARE_REVISION_STM;
  92. #endif
  93. }
  94. static void stm32fwu_spi_send_ack( struct spi_device *spi, u8 SyncData )
  95. {
  96. u8 syncb[2] = {0};
  97. syncb[0] = SyncData;
  98. stm32fwu_spi_write(spi, syncb, 1);
  99. }
  100. static int stm32fwu_spi_wait_for_ack(struct spi_device *spi,
  101. struct stm32fwu_spi_cmd *cmd, u8 dummy_bytes)
  102. {
  103. static int check_spi_wait_cnt = 1;
  104. struct spi_message m;
  105. char tx_buf = 0x0;
  106. char rx_buf = 0x0;
  107. struct spi_transfer t = {
  108. .tx_buf = &tx_buf,
  109. .rx_buf = &rx_buf,
  110. .len = 1,
  111. .bits_per_word = 8,
  112. };
  113. int i = 0;
  114. int ret;
  115. dummy_bytes = BL_DUMMY;
  116. #if SSP_STM_DEBUG
  117. pr_info("[SSP] %s: dummy byte = 0x%02hhx\n",
  118. __func__, dummy_bytes);
  119. #endif
  120. while (i < cmd->timeout) {
  121. tx_buf = dummy_bytes;
  122. spi_message_init(&m);
  123. spi_message_add_tail(&t, &m);
  124. ret = spi_sync(spi, &m);
  125. if (ret < 0) {
  126. dev_err(&spi->dev, "%s: spi error %d\n", __func__, ret);
  127. return ret;
  128. } else if ((rx_buf == BL_ACK) || (rx_buf == BL_NACK)) {
  129. // ACK cmd set
  130. stm32fwu_spi_send_ack(spi, BL_ACK);
  131. return (int)rx_buf;
  132. } else {
  133. // Cross cmd set
  134. tx_buf = rx_buf;
  135. }
  136. if (check_spi_wait_cnt % 20 == 0)
  137. msleep(1);
  138. else
  139. usleep_range(1000, 1100);
  140. i++;
  141. check_spi_wait_cnt++;
  142. }
  143. #if SSP_STM_DEBUG
  144. dev_err(&spi->dev, "%s: Timeout after %d loops\n", __func__, cmd->timeout);
  145. #endif
  146. return -EIO;
  147. }
  148. static int stm32fwu_spi_send_cmd(struct spi_device *spi,
  149. struct stm32fwu_spi_cmd *cmd)
  150. {
  151. u8 tx_buf[3] = {0,};
  152. u8 rx_buf[3] = {0,};
  153. u8 dummy_byte = 0;
  154. struct spi_message m;
  155. int ret;
  156. #if BYTETOBYTE_USED
  157. int i;
  158. struct spi_transfer t[STM_MAX_BUFFER_SIZE];
  159. memset(t, 0, STM_MAX_BUFFER_SIZE * sizeof(struct spi_transfer));
  160. #else
  161. struct spi_transfer t = {
  162. .tx_buf = tx_buf,
  163. .rx_buf = rx_buf,
  164. .len = 3,
  165. .bits_per_word = 8,
  166. };
  167. #endif
  168. pr_debug("[SSP]%s\n", __func__);
  169. spi_message_init(&m);
  170. tx_buf[0] = BL_SPI_SOF;
  171. tx_buf[1] = cmd->cmd;
  172. tx_buf[2] = cmd->xor_cmd;
  173. #if BYTETOBYTE_USED
  174. for (i = 0; i < 3; i++) {
  175. t[i].tx_buf = &tx_buf[i];
  176. t[i].rx_buf = &rx_buf[i];
  177. t[i].len = 1;
  178. t[i].bits_per_word = 8;
  179. t[i].delay_usecs = BYTE_DELAY_WRITE;
  180. spi_message_add_tail(&t[i], &m);
  181. }
  182. #else
  183. spi_message_add_tail(&t, &m);
  184. #endif
  185. ret = spi_sync(spi, &m);
  186. if (ret < 0) {
  187. dev_err(&spi->dev, "%s: spi error %d\n", __func__, ret);
  188. return ret;
  189. }
  190. dummy_byte = cmd->ack_pad;
  191. /* check for ack/nack and loop until found */
  192. ret = stm32fwu_spi_wait_for_ack(spi, cmd, dummy_byte);
  193. cmd->status = ret;
  194. if (ret != BL_ACK) {
  195. pr_err("[SSP] %s: Got NAK or Error %d\n", __func__, ret);
  196. return ret;
  197. }
  198. return ret;
  199. }
  200. #if STM_SHOULD_BE_IMPLEMENT
  201. static int stm32fwu_spi_read(struct spi_device *spi,
  202. u8 *buffer, ssize_t len)
  203. {
  204. int ret;
  205. int i;
  206. u8 tx_buf[STM_MAX_BUFFER_SIZE] = {0,};
  207. struct spi_message m;
  208. struct spi_transfer t[STM_MAX_BUFFER_SIZE];
  209. memset(t, 0, STM_MAX_BUFFER_SIZE * sizeof(struct spi_transfer));
  210. spi_message_init(&m);
  211. for (i = 0; i < len; i++) {
  212. t[i].tx_buf = tx_buf;
  213. t[i].rx_buf = &buffer[i];
  214. t[i].len = 1;
  215. t[i].bits_per_word = 8;
  216. t[i].delay_usecs = BYTE_DELAY_READ;
  217. spi_message_add_tail(&t[i], &m);
  218. }
  219. ret = spi_sync(spi, &m);
  220. if (ret < 0) {
  221. pr_err("[SSP] Error in %d spi_read()\n", ret);
  222. return ret;
  223. }
  224. return len;
  225. }
  226. #endif
  227. static int stm32fwu_spi_write(struct spi_device *spi,
  228. const u8 *buffer, ssize_t len)
  229. {
  230. int ret;
  231. u8 rx_buf[STM_MAX_BUFFER_SIZE] = {0,};
  232. struct spi_message m;
  233. #if BYTETOBYTE_USED
  234. struct spi_transfer t[STM_MAX_BUFFER_SIZE];
  235. memset(t, 0, STM_MAX_BUFFER_SIZE * sizeof(struct spi_transfer));
  236. int i;
  237. #else
  238. struct spi_transfer t = {
  239. .tx_buf = buffer,
  240. .rx_buf = rx_buf,
  241. .len = len,
  242. .bits_per_word = 8,
  243. };
  244. #endif
  245. spi_message_init(&m);
  246. #if BYTETOBYTE_USED
  247. for (i = 0; i < len; i++) {
  248. t[i].tx_buf = &buffer[i];
  249. t[i].rx_buf = &rx_buf[i];
  250. t[i].len = 1;
  251. t[i].bits_per_word = 8;
  252. t[i].delay_usecs = BYTE_DELAY_WRITE;
  253. spi_message_add_tail(&t[i], &m);
  254. }
  255. #else
  256. spi_message_add_tail(&t, &m);
  257. #endif
  258. ret = spi_sync(spi, &m);
  259. if (ret < 0) {
  260. pr_err("[SSP] Error in %d spi_write()\n", ret);
  261. return ret;
  262. }
  263. return len;
  264. }
  265. static int send_addr(struct spi_device *spi, u32 fw_addr, int send_short)
  266. {
  267. int res;
  268. int i = send_short;
  269. int len = SEND_ADDR_LEN - send_short;
  270. u8 header[SEND_ADDR_LEN];
  271. struct stm32fwu_spi_cmd dummy_cmd;
  272. dummy_cmd.timeout = DEF_ACKROOF_NUMBER;
  273. pr_debug("[SSP]%s\n", __func__);
  274. header[0] = (u8)((fw_addr >> 24) & 0xFF);
  275. header[1] = (u8)((fw_addr >> 16) & 0xFF);
  276. header[2] = (u8)((fw_addr >> 8) & 0xFF);
  277. header[3] = (u8)(fw_addr & 0xFF);
  278. header[4] = header[0] ^ header[1] ^ header[2] ^ header[3];
  279. res = stm32fwu_spi_write(spi, &header[i], len);
  280. if (res < len) {
  281. pr_err("[SSP] Error in sending address. Res %d\n", res);
  282. return ((res > 0) ? -EIO : res);
  283. }
  284. res = stm32fwu_spi_wait_for_ack(spi, &dummy_cmd, BL_ACK);
  285. if (res != BL_ACK) {
  286. pr_err("[SSP] send_addr(): rcv_ack returned 0x%x\n",
  287. res);
  288. return res;
  289. }
  290. return 0;
  291. }
  292. #if STM_SHOULD_BE_IMPLEMENT
  293. static int send_byte_count(struct spi_device *spi, int bytes, int get_ack)
  294. {
  295. int res;
  296. uchar bbuff[3];
  297. struct stm32fwu_spi_cmd dummy_cmd;
  298. pr_debug("[SSP]%s\n", __func__);
  299. if (bytes > 256) {
  300. return -EINVAL;
  301. }
  302. bbuff[0] = bytes - 1;
  303. bbuff[1] = ~bbuff[0];
  304. res = stm32fwu_spi_write(spi, bbuff, 2);
  305. if (res < 2) {
  306. return -EPROTO;
  307. }
  308. if (get_ack) {
  309. dummy_cmd.timeout = DEF_ACKROOF_NUMBER;
  310. res = stm32fwu_spi_wait_for_ack(spi, &dummy_cmd, BL_ACK);
  311. if (res != BL_ACK) {
  312. return -EPROTO;
  313. }
  314. }
  315. return 0;
  316. }
  317. static int fw_read_stm(struct spi_device *spi, u32 fw_addr,
  318. int len, const u8 *buffer)
  319. {
  320. int res;
  321. struct stm32fwu_spi_cmd cmd;
  322. struct stm32fwu_spi_cmd dummy_cmd;
  323. int i;
  324. u8 xor = 0;
  325. u8 send_buff[STM_MAX_BUFFER_SIZE] = {0,};
  326. cmd.cmd = WMEM_COMMAND;
  327. cmd.xor_cmd = XOR_RMEM_COMMAND;
  328. cmd.timeout = DEF_ACKCMD_NUMBER;
  329. cmd.ack_pad = (u8)((fw_addr >> 24) & 0xFF);
  330. res = stm32fwu_spi_send_cmd(spi, &cmd);
  331. if (res != BL_ACK) {
  332. pr_err("[SSP] Error %d sending read_mem cmd\n", res);
  333. return res;
  334. }
  335. res = send_addr(spi, fw_addr, 0);
  336. if (res != 0) {
  337. pr_err("[SSP] Error %d sending read_mem Address\n", res);
  338. return res;
  339. }
  340. res = send_byte_count(spi, len, 1);
  341. if (res != 0) {
  342. return -EPROTO;
  343. }
  344. // Add Read Syc
  345. stm32fwu_spi_send_ack(spi, BL_DUMMY);
  346. res = stm32fwu_spi_read(spi, buffer, len);
  347. if (res < len) {
  348. return -EIO;
  349. }
  350. return len;
  351. }
  352. #endif
  353. static int fw_write_stm(struct spi_device *spi, u32 fw_addr,
  354. int len, const u8 *buffer)
  355. {
  356. int res;
  357. struct stm32fwu_spi_cmd cmd;
  358. struct stm32fwu_spi_cmd dummy_cmd;
  359. int i;
  360. u8 xor = 0;
  361. u8 send_buff[STM_MAX_BUFFER_SIZE] = {0,};
  362. cmd.cmd = WMEM_COMMAND;
  363. cmd.xor_cmd = XOR_WMEM_COMMAND;
  364. cmd.timeout = DEF_ACKCMD_NUMBER;
  365. cmd.ack_pad = (u8)((fw_addr >> 24) & 0xFF);
  366. pr_debug("[SSP]%s\n", __func__);
  367. #if SSP_STM_DEBUG
  368. pr_info("[SSP] sending WMEM_COMMAND\n");
  369. #endif
  370. if (len > STM_MAX_XFER_SIZE) {
  371. pr_err("[SSP] Can't send more than 256 bytes per transaction\n");
  372. return -EINVAL;
  373. }
  374. send_buff[0] = len - 1;
  375. memcpy(&send_buff[1], buffer, len);
  376. for (i = 0; i < (len + 1); i++)
  377. xor ^= send_buff[i];
  378. send_buff[len + 1] = xor;
  379. res = stm32fwu_spi_send_cmd(spi, &cmd);
  380. if (res != BL_ACK) {
  381. pr_err("[SSP] Error %d sending read_mem cmd\n", res);
  382. return res;
  383. }
  384. res = send_addr(spi, fw_addr, 0);
  385. if (res != 0) {
  386. pr_err("[SSP] Error %d sending write_mem Address\n", res);
  387. return res;
  388. }
  389. res = stm32fwu_spi_write(spi, send_buff, len + 2);
  390. if (res < len) {
  391. pr_err("[SSP] Error writing to flash. res = %d\n", res);
  392. return ((res > 0) ? -EIO : res);
  393. }
  394. pr_debug("[SSP]%s 2\n", __func__);
  395. dummy_cmd.timeout = DEF_ACKROOF_NUMBER;
  396. usleep_range(100, 150); /* Samsung added */
  397. res = stm32fwu_spi_wait_for_ack(spi, &dummy_cmd, BL_ACK);
  398. if (res == BL_ACK) {
  399. return len;
  400. }
  401. if (res == BL_NACK) {
  402. pr_err("[SSP] Got NAK waiting for WRITE_MEM to complete\n");
  403. return -EPROTO;
  404. }
  405. pr_err("[SSP] timeout waiting for ACK for WRITE_MEM command\n");
  406. return -ETIME;
  407. }
  408. static int load_ums_fw_bootmode(struct spi_device *spi, const char *pFn)
  409. {
  410. const u8 *buff = NULL;
  411. char fw_path[BL_UMS_FW_PATH+1];
  412. unsigned int uFSize = 0, uNRead = 0;
  413. unsigned int uPos = 0;
  414. int iRet = SUCCESS;
  415. int remaining;
  416. int block = STM_MAX_XFER_SIZE;
  417. unsigned int fw_addr = STM_APP_ADDR;
  418. int retry_count = 0;
  419. int err_count = 0;
  420. int count = 0;
  421. struct file *fp = NULL;
  422. mm_segment_t old_fs = get_fs();
  423. pr_info("[SSP] ssp_load_ums_fw start!!!\n");
  424. old_fs = get_fs();
  425. set_fs(get_ds());
  426. snprintf(fw_path, BL_UMS_FW_PATH, "/sdcard/ssp/%s", pFn);
  427. fp = filp_open(fw_path, O_RDONLY, 0);
  428. if (IS_ERR(fp)) {
  429. iRet = ERROR;
  430. pr_err("file %s open error:%d\n", fw_path, (s32)fp);
  431. goto err_open;
  432. }
  433. uFSize = (unsigned int)fp->f_path.dentry->d_inode->i_size;
  434. pr_info("ssp_load_ums firmware size: %u\n", uFSize);
  435. buff = kzalloc((size_t)uFSize, GFP_KERNEL);
  436. if (!buff) {
  437. iRet = ERROR;
  438. pr_err("fail to alloc buffer for fw\n");
  439. goto err_alloc;
  440. }
  441. uNRead = (unsigned int)vfs_read(fp, (char __user *)buff,
  442. (unsigned int)uFSize, &fp->f_pos);
  443. if (uNRead != uFSize) {
  444. iRet = ERROR;
  445. pr_err("fail to read file %s (nread = %u)\n", fw_path, uNRead);
  446. goto err_fw_size;
  447. }
  448. remaining = uFSize;
  449. while (remaining > 0) {
  450. if (block > remaining)
  451. block = remaining;
  452. while (retry_count < 3) {
  453. iRet = fw_write_stm(spi, fw_addr, block, buff + uPos);
  454. if (iRet < block) {
  455. pr_err("[SSP] Error writing to addr 0x%08X\n", fw_addr);
  456. if (iRet < 0) {
  457. pr_err("[SSP] Erro was %d\n", iRet);
  458. } else {
  459. pr_err("[SSP] Incomplete write of %d bytes\n",
  460. iRet);
  461. iRet = -EIO;
  462. }
  463. retry_count++;
  464. err_count++;
  465. } else {
  466. retry_count = 0;
  467. break;
  468. }
  469. }
  470. if (iRet < 0) {
  471. pr_err("[SSP] Writing MEM failed: %d, retry cont: %d\n", iRet, err_count);
  472. goto out;
  473. }
  474. remaining -= block;
  475. uPos += block;
  476. fw_addr += block;
  477. if (count++ == 50) {
  478. pr_info("[SSP] Updated %u bytes / %u bytes\n", uPos,
  479. uFSize);
  480. count = 0;
  481. }
  482. }
  483. pr_info("[SSP] Firm up(UMS) success(%d bytes, retry %d)\n", uPos, err_count);
  484. out:
  485. err_fw_size:
  486. kfree(buff);
  487. err_alloc:
  488. filp_close(fp, NULL);
  489. err_open:
  490. set_fs(old_fs);
  491. return iRet;
  492. }
  493. static int fw_erase_stm(struct spi_device *spi)
  494. {
  495. struct stm32fwu_spi_cmd cmd;
  496. struct stm32fwu_spi_cmd dummy_cmd;
  497. int ret;
  498. char buff[EXT_ER_DATA_LEN] = {0xff, 0xff, 0x00};
  499. pr_debug("[SSP]%s\n", __func__);
  500. cmd.cmd = EXT_ER_COMMAND;
  501. cmd.xor_cmd = XOR_EXT_ER_COMMAND;
  502. cmd.timeout = DEF_ACKCMD_NUMBER;
  503. cmd.ack_pad = BL_DUMMY;
  504. ret = stm32fwu_spi_send_cmd(spi, &cmd);
  505. if (ret != BL_ACK) {
  506. pr_err("[SSP] fw_erase failed - %d\n", ret);
  507. return ret;
  508. }
  509. ret = stm32fwu_spi_write(spi, buff, EXT_ER_DATA_LEN);
  510. if( ret < EXT_ER_DATA_LEN )
  511. {
  512. pr_err("[SSP] fw_erase write failed\n");
  513. return 0;
  514. }
  515. dummy_cmd.timeout = DEF_ACK_ERASE_NUMBER;
  516. ret = stm32fwu_spi_wait_for_ack(spi, &dummy_cmd, BL_ACK);
  517. if (ret == BL_ACK)
  518. return 0;
  519. else if (ret == BL_NACK)
  520. return -EPROTO;
  521. else
  522. return -ETIME;
  523. }
  524. static int load_kernel_fw_bootmode(struct spi_device *spi, const char *pFn)
  525. {
  526. const struct firmware *fw = NULL;
  527. int remaining;
  528. unsigned int uPos = 0;
  529. unsigned int fw_addr = STM_APP_ADDR;
  530. int iRet;
  531. int block = STM_MAX_XFER_SIZE;
  532. int count = 0;
  533. int err_count = 0;
  534. int retry_count = 0;
  535. pr_info("[SSP] ssp_load_fw start!!!\n");
  536. iRet = request_firmware(&fw, pFn, &spi->dev);
  537. if (iRet) {
  538. pr_err("[SSP] Unable to open firmware %s\n", pFn);
  539. return iRet;
  540. }
  541. remaining = fw->size;
  542. while (remaining > 0) {
  543. if (block > remaining)
  544. block = remaining;
  545. while (retry_count < 3) {
  546. iRet = fw_write_stm(spi, fw_addr, block, fw->data + uPos);
  547. if (iRet < block) {
  548. pr_err("[SSP] Error writing to addr 0x%08X\n", fw_addr);
  549. if (iRet < 0) {
  550. pr_err("[SSP] Erro was %d\n", iRet);
  551. } else {
  552. pr_err("[SSP] Incomplete write of %d bytes\n",
  553. iRet);
  554. iRet = -EIO;
  555. }
  556. retry_count++;
  557. err_count++;
  558. } else {
  559. retry_count = 0;
  560. break;
  561. }
  562. }
  563. if (iRet < 0) {
  564. pr_err("[SSP] Writing MEM failed: %d, retry cont: %d\n", iRet, err_count);
  565. goto out_load_kernel;
  566. }
  567. remaining -= block;
  568. uPos += block;
  569. fw_addr += block;
  570. if (count++ == 20) {
  571. pr_info("[SSP] Updated %u bytes / %u bytes\n", uPos,
  572. fw->size);
  573. count = 0;
  574. }
  575. }
  576. pr_info("[SSP] Firmware download is success.(%d bytes, retry %d)\n", uPos, err_count);
  577. out_load_kernel:
  578. release_firmware(fw);
  579. return iRet;
  580. }
  581. static int change_to_bootmode(struct ssp_data *data)
  582. {
  583. int iCnt;
  584. int ret;
  585. char syncb = BL_SPI_SOF;
  586. struct stm32fwu_spi_cmd dummy_cmd;
  587. pr_debug("[SSP]%s\n", __func__);
  588. dummy_cmd.timeout = DEF_ACKCMD_NUMBER;
  589. gpio_set_value_cansleep(data->rst, 0);
  590. mdelay(4);
  591. gpio_set_value_cansleep(data->rst, 1);
  592. usleep_range(45000, 47000);
  593. for (iCnt = 0; iCnt < 9; iCnt++) {
  594. gpio_set_value_cansleep(data->rst, 0);
  595. mdelay(4);
  596. gpio_set_value_cansleep(data->rst, 1);
  597. usleep_range(15000, 15500);
  598. }
  599. data->spi->mode = SPI_MODE_0;
  600. if (spi_setup(data->spi))
  601. pr_err("failed to setup spi mode for boot\n");
  602. usleep_range(1000, 1100);
  603. ret = stm32fwu_spi_write(data->spi, &syncb, 1);
  604. #if SSP_STM_DEBUG
  605. pr_info("[SSP] stm32fwu_spi_write(sync byte) returned %d\n", ret);
  606. #endif
  607. ret = stm32fwu_spi_wait_for_ack(data->spi, &dummy_cmd, BL_DUMMY);
  608. #if SSP_STM_DEBUG
  609. pr_info("[SSP] stm32fwu_spi_wait_for_ack returned %d (0x%x)\n", ret, ret);
  610. #endif
  611. return ret;
  612. }
  613. void toggle_mcu_reset(struct ssp_data *data)
  614. {
  615. gpio_set_value_cansleep(data->rst, 0);
  616. usleep_range(1000, 1200);
  617. gpio_set_value_cansleep(data->rst, 1);
  618. }
  619. static int update_mcu_bin(struct ssp_data *data, int iBinType)
  620. {
  621. int retry = BLMODE_RETRYCOUNT;
  622. int iRet = SUCCESS;
  623. struct stm32fwu_spi_cmd cmd;
  624. cmd.cmd = GO_COMMAND;
  625. cmd.xor_cmd = XOR_GO_COMMAND;
  626. cmd.timeout = 1000;
  627. cmd.ack_pad = (u8)((STM_APP_ADDR >> 24) & 0xFF);
  628. // 1. Start system boot mode
  629. do {
  630. iRet = change_to_bootmode(data);
  631. pr_info("[ssp] bootmode %d retry: %d\n", iRet, 3 - retry);
  632. } while (retry-- > 0 && iRet != BL_ACK );
  633. if(iRet != BL_ACK) {
  634. pr_err("[SSP]: %s - change_to_bootmode %d\n",
  635. __func__, iRet);
  636. return iRet;
  637. }
  638. // 2. Flash erase all
  639. iRet = fw_erase_stm(data->spi);
  640. if (iRet < 0) {
  641. pr_err("[SSP]: %s - fw_erase_stm %d\n",
  642. __func__, iRet);
  643. return iRet;
  644. }
  645. switch (iBinType) {
  646. case KERNEL_BINARY:
  647. /* HW request: I2C line is reversed */
  648. #if defined(CONFIG_SEC_KSPORTS_PROJECT)
  649. iRet = load_kernel_fw_bootmode(data->spi, BL_FW_NAME_TASMAN);
  650. #elif defined(CONFIG_SEC_PATEK_PROJECT)
  651. if (data->ap_rev >= MAXIM_MAX21103_REV)
  652. iRet = load_kernel_fw_bootmode(data->spi, BL_FW_NAME_MAXIM_PATEK);
  653. else
  654. iRet = load_kernel_fw_bootmode(data->spi, BL_FW_NAME_PATEK);
  655. #else
  656. iRet = load_kernel_fw_bootmode(data->spi, BL_FW_NAME);
  657. #endif
  658. break;
  659. case KERNEL_CRASHED_BINARY:
  660. iRet = load_kernel_fw_bootmode(data->spi, BL_CRASHED_FW_NAME);
  661. break;
  662. case UMS_BINARY:
  663. iRet = load_ums_fw_bootmode(data->spi, BL_UMS_FW_NAME);
  664. break;
  665. default:
  666. pr_err("[SSP] binary type error!!\n");
  667. }
  668. /* STM : GO USER ADDR */
  669. stm32fwu_spi_send_cmd(data->spi, &cmd);
  670. send_addr(data->spi, STM_APP_ADDR, 0);
  671. data->spi->mode = SPI_MODE_1;
  672. if (spi_setup(data->spi))
  673. pr_err("failed to setup spi mode for app\n");
  674. usleep_range(1000, 1100);
  675. return iRet;
  676. }
  677. int forced_to_download_binary(struct ssp_data *data, int iBinType)
  678. {
  679. int iRet = 0;
  680. int retry = 3;
  681. ssp_dbg("[SSP]: %s - mcu binany update!\n", __func__);
  682. ssp_enable(data, false);
  683. data->fw_dl_state = FW_DL_STATE_DOWNLOADING;
  684. pr_info("[SSP] %s, DL state = %d\n", __func__,
  685. data->fw_dl_state);
  686. data->spi->max_speed_hz = BOOT_SPI_HZ;
  687. if (spi_setup(data->spi))
  688. pr_err("failed to setup spi for ssp_boot\n");
  689. do {
  690. pr_info("[SSP] %d try\n", 3 - retry);
  691. iRet = update_mcu_bin(data, iBinType);
  692. } while (retry -- > 0 && iRet < 0);
  693. data->spi->max_speed_hz = NORM_SPI_HZ;
  694. if (spi_setup(data->spi))
  695. pr_err("failed to setup spi for ssp_norm\n");
  696. if (iRet < 0) {
  697. ssp_dbg("[SSP]: %s - update_mcu_bin failed!\n", __func__);
  698. goto out;
  699. }
  700. data->fw_dl_state = FW_DL_STATE_SYNC;
  701. pr_info("[SSP] %s, DL state = %d\n", __func__, data->fw_dl_state);
  702. ssp_enable(data, true);
  703. proximity_open_lcd_ldi(data);
  704. proximity_open_calibration(data);
  705. accel_open_calibration(data);
  706. gyro_open_calibration(data);
  707. pressure_open_calibration(data);
  708. data->fw_dl_state = FW_DL_STATE_DONE;
  709. pr_info("[SSP] %s, DL state = %d\n", __func__, data->fw_dl_state);
  710. iRet = SUCCESS;
  711. out:
  712. return iRet;
  713. }
  714. int check_fwbl(struct ssp_data *data)
  715. {
  716. unsigned int fw_revision;
  717. pr_info("[SSP] change_rev = %d\n", data->ssp_changes);
  718. #if defined(CONFIG_SEC_KSPORTS_PROJECT)
  719. fw_revision = SSP_FIRMWARE_REVISION_TASMAN;
  720. #elif defined(CONFIG_SEC_PATEK_PROJECT)
  721. if (data->ap_rev >= MAXIM_MAX21103_REV)
  722. fw_revision = SSP_FIRMWARE_REVISION_MAXIM_PATEK;
  723. else
  724. fw_revision = SSP_FIRMWARE_REVISION_PATEK;
  725. #else
  726. fw_revision = SSP_FIRMWARE_REVISION_STM;
  727. #endif
  728. data->uCurFirmRev = get_firmware_rev(data);
  729. if ((data->uCurFirmRev == SSP_INVALID_REVISION)
  730. || (data->uCurFirmRev == SSP_INVALID_REVISION2)) {
  731. #if STM_SHOULD_BE_IMPLEMENT
  732. data->client->addr = BOOTLOADER_SLAVE_ADDR;
  733. iRet = check_bootloader(data->client, BL_WAITING_BOOTLOAD_CMD);
  734. if (iRet >= 0)
  735. pr_info("[SSP] ssp_load_fw_bootmode\n");
  736. else {
  737. pr_warn("[SSP] Firm Rev is invalid(%8u). Retry.\n",
  738. data->uCurFirmRev);
  739. data->client->addr = APP_SLAVE_ADDR;
  740. data->uCurFirmRev = get_firmware_rev(data);
  741. if (data->uCurFirmRev == SSP_INVALID_REVISION
  742. || data->uCurFirmRev == ERROR) {
  743. pr_err("[SSP] MCU is not working, FW download failed\n");
  744. return FW_DL_STATE_FAIL;
  745. }
  746. }
  747. #endif
  748. data->uCurFirmRev = SSP_INVALID_REVISION;
  749. pr_err("[SSP] SSP_INVALID_REVISION\n");
  750. return FW_DL_STATE_NEED_TO_SCHEDULE;
  751. } else {
  752. if (data->uCurFirmRev != fw_revision) {
  753. pr_info("[SSP] MCU Firm Rev : Old = %8u, New = %8u\n",
  754. data->uCurFirmRev, fw_revision);
  755. return FW_DL_STATE_NEED_TO_SCHEDULE;
  756. }
  757. pr_info("[SSP] MCU Firm Rev : Old = %8u, New = %8u\n",
  758. data->uCurFirmRev, fw_revision);
  759. }
  760. return FW_DL_STATE_NONE;
  761. }