ssp_firmware.c 21 KB

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