ssp_firmware.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919
  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 101901
  17. #ifdef CONFIG_SENSORS_SSP_BOUNCE_FIRMWARE
  18. #define SSP_FIRMWARE_REVISION_STM 14010300 /* Latest, 88922*/
  19. #else
  20. #define SSP_FIRMWARE_REVISION_STM 15041500 /* Latest, 88922*/
  21. #endif
  22. #define SSP_FIRMWARE_REVISION_STM_88921 13072401 /* 88921 */
  23. #define SSP_FIRMWARE_REVISION_STM_RVS 13051500
  24. #define SSP_FIRMWARE_REVISION_JSGLTE 14120500
  25. #define BOOT_SPI_HZ 960000
  26. #define NORM_SPI_HZ 4800000
  27. /* Bootload mode cmd */
  28. #ifdef CONFIG_SENSORS_SSP_BOUNCE_FIRMWARE
  29. #define BL_FW_NAME "ssp_stm_bf.fw"
  30. #else
  31. #define BL_FW_NAME "ssp_stm32f.fw"
  32. #endif
  33. #define BL_FW_JSGLTE_NAME "ssp_stm32f_jsglte.fw"
  34. #define BL_UMS_FW_NAME "ssp_stm.bin"
  35. #define BL_CRASHED_FW_NAME "ssp_crashed.fw"
  36. #define BL_UMS_FW_PATH 255
  37. #define APP_SLAVE_ADDR 0x18
  38. #define BOOTLOADER_SLAVE_ADDR 0x26
  39. /* Bootloader mode status */
  40. #define BL_WAITING_BOOTLOAD_CMD 0xc0 /* valid 7 6 bit only */
  41. #define BL_WAITING_FRAME_DATA 0x80 /* valid 7 6 bit only */
  42. #define BL_FRAME_CRC_CHECK 0x02
  43. #define BL_FRAME_CRC_FAIL 0x03
  44. #define BL_FRAME_CRC_PASS 0x04
  45. #define BL_APP_CRC_FAIL 0x40 /* valid 7 8 bit only */
  46. #define BL_BOOT_STATUS_MASK 0x3f
  47. /* Command to unlock bootloader */
  48. #define BL_UNLOCK_CMD_MSB 0xaa
  49. #define BL_UNLOCK_CMD_LSB 0xdc
  50. /* STM */
  51. #define SSP_STM_DEBUG 0
  52. #define STM_SHOULD_BE_IMPLEMENT 0
  53. #define SEND_ADDR_LEN 5
  54. #define BL_SPI_SOF 0x5A
  55. #define BL_ACK 0x79
  56. #define BL_ACK2 0xF9
  57. #define BL_NACK 0x1F
  58. #define BL_IDLE 0xA5
  59. #define STM_MAX_XFER_SIZE 256
  60. #define STM_MAX_BUFFER_SIZE 260
  61. #define STM_APP_ADDR 0x08000000
  62. #define BYTE_DELAY_READ 10
  63. #define BYTE_DELAY_WRITE 8
  64. #define DEF_ACK_ERASE_NUMBER 7000
  65. #define DEF_ACKCMD_NUMBER 30
  66. #define DEF_ACKROOF_NUMBER 20
  67. #define WMEM_COMMAND 0x31 /* Write Memory command */
  68. #define GO_COMMAND 0x21 /* GO command */
  69. #define EXT_ER_COMMAND 0x44 /* Erase Memory command */
  70. #define XOR_RMEM_COMMAND 0xEE /* Read Memory command */
  71. #define XOR_WMEM_COMMAND 0xCE /* Write Memory command */
  72. #define XOR_GO_COMMAND 0xDE /* GO command */
  73. #define XOR_EXT_ER_COMMAND 0xBB /* Erase Memory command */
  74. #define EXT_ER_DATA_LEN 3
  75. #define BLMODE_RETRYCOUNT 3
  76. #define BYTETOBYTE_USED 0
  77. struct stm32fwu_spi_cmd {
  78. u8 cmd;
  79. u8 xor_cmd;
  80. u8 ack_pad; /* Send this when waiting for an ACK */
  81. u8 reserved;
  82. int status; /* ACK or NACK (or error) */
  83. int timeout; /* This is number of retries */
  84. int ack_loops;
  85. };
  86. unsigned int get_module_rev(struct ssp_data *data)
  87. {
  88. #if defined (CONFIG_MACH_VIKALCU)
  89. return SSP_FIRMWARE_REVISION_STM;
  90. #elif defined (CONFIG_MACH_JSGLTE_CHN_CMCC)
  91. return SSP_FIRMWARE_REVISION_JSGLTE;
  92. #else
  93. if (data->ap_rev > 3)
  94. return SSP_FIRMWARE_REVISION_STM;
  95. else
  96. return SSP_FIRMWARE_REVISION_STM_88921;
  97. #endif
  98. }
  99. static int stm32fwu_spi_wait_for_ack(struct spi_device *spi,
  100. struct stm32fwu_spi_cmd *cmd, u8 dummy_bytes)
  101. {
  102. static int check_spi_wait_cnt = 1;
  103. struct spi_message m;
  104. char tx_buf = 0x0;
  105. char rx_buf = 0x0;
  106. struct spi_transfer t = {
  107. .tx_buf = &tx_buf,
  108. .rx_buf = &rx_buf,
  109. .len = 1,
  110. .bits_per_word = 8,
  111. };
  112. int i = 0;
  113. int ret;
  114. #if SSP_STM_DEBUG
  115. pr_info("[SSP] %s: dummy byte = 0x%02hhx\n",
  116. __func__, dummy_bytes);
  117. #endif
  118. while (i < cmd->timeout) {
  119. tx_buf = dummy_bytes;
  120. spi_message_init(&m);
  121. spi_message_add_tail(&t, &m);
  122. ret = spi_sync(spi, &m);
  123. if (ret < 0) {
  124. dev_err(&spi->dev, "%s: spi error %d\n", __func__, ret);
  125. return ret;
  126. } else if ((rx_buf == BL_ACK) || (rx_buf == BL_ACK2)) {
  127. cmd->ack_loops = i;
  128. return BL_ACK;
  129. } else if (rx_buf == BL_NACK) {
  130. return (int)rx_buf;
  131. }
  132. if (check_spi_wait_cnt % 20 == 0)
  133. msleep(1);
  134. else
  135. usleep_range(1000, 1100);
  136. i++;
  137. check_spi_wait_cnt++;
  138. }
  139. #if SSP_STM_DEBUG
  140. dev_err(&spi->dev, "%s: Timeout after %d loops\n", __func__, cmd->timeout);
  141. #endif
  142. return -EIO;
  143. }
  144. static int stm32fwu_spi_send_cmd(struct spi_device *spi,
  145. struct stm32fwu_spi_cmd *cmd)
  146. {
  147. u8 tx_buf[3] = {0,};
  148. u8 rx_buf[3] = {0,};
  149. u8 dummy_byte = 0;
  150. struct spi_message m;
  151. int ret;
  152. #if BYTETOBYTE_USED
  153. int i;
  154. struct spi_transfer t[STM_MAX_BUFFER_SIZE];
  155. memset(t, 0, STM_MAX_BUFFER_SIZE * sizeof(struct spi_transfer));
  156. #else
  157. struct spi_transfer t = {
  158. .tx_buf = tx_buf,
  159. .rx_buf = rx_buf,
  160. .len = 3,
  161. .bits_per_word = 8,
  162. };
  163. #endif
  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. header[0] = (u8)((fw_addr >> 24) & 0xFF);
  269. header[1] = (u8)((fw_addr >> 16) & 0xFF);
  270. header[2] = (u8)((fw_addr >> 8) & 0xFF);
  271. header[3] = (u8)(fw_addr & 0xFF);
  272. header[4] = header[0] ^ header[1] ^ header[2] ^ header[3];
  273. res = stm32fwu_spi_write(spi, &header[i], len);
  274. if (res < len) {
  275. pr_err("[SSP] Error in sending address. Res %d\n", res);
  276. return ((res > 0) ? -EIO : res);
  277. }
  278. res = stm32fwu_spi_wait_for_ack(spi, &dummy_cmd, BL_ACK);
  279. if (res != BL_ACK) {
  280. pr_err("[SSP] send_addr(): rcv_ack returned 0x%x\n",
  281. res);
  282. return res;
  283. }
  284. return 0;
  285. }
  286. #if STM_SHOULD_BE_IMPLEMENT
  287. static int send_byte_count(struct spi_device *spi, int bytes, int get_ack)
  288. {
  289. int res;
  290. uchar bbuff[3];
  291. struct stm32fwu_spi_cmd dummy_cmd;
  292. if (bytes > 256) {
  293. return -EINVAL;
  294. }
  295. bbuff[0] = bytes - 1;
  296. bbuff[1] = ~bbuff[0];
  297. res = stm32fwu_spi_write(spi, bbuff, 2);
  298. if (res < 2) {
  299. return -EPROTO;
  300. }
  301. if (get_ack) {
  302. dummy_cmd.timeout = DEF_ACKROOF_NUMBER;
  303. res = stm32fwu_spi_wait_for_ack(spi, &dummy_cmd, BL_ACK);
  304. if (res != BL_ACK) {
  305. return -EPROTO;
  306. }
  307. }
  308. return 0;
  309. }
  310. static int fw_read_stm(struct spi_device *spi, u32 fw_addr,
  311. int len, const u8 *buffer)
  312. {
  313. int res;
  314. struct stm32fwu_spi_cmd cmd;
  315. struct stm32fwu_spi_cmd dummy_cmd;
  316. int i;
  317. u8 xor = 0;
  318. u8 send_buff[STM_MAX_BUFFER_SIZE] = {0,};
  319. cmd.cmd = WMEM_COMMAND;
  320. cmd.xor_cmd = XOR_RMEM_COMMAND;
  321. cmd.timeout = DEF_ACKCMD_NUMBER;
  322. cmd.ack_pad = (u8)((fw_addr >> 24) & 0xFF);
  323. res = stm32fwu_spi_send_cmd(spi, &cmd);
  324. if (res != BL_ACK) {
  325. pr_err("[SSP] Error %d sending read_mem cmd\n", res);
  326. return res;
  327. }
  328. if (cmd.ack_loops > 0)
  329. res = send_addr(spi, fw_addr, 1);
  330. else
  331. res = send_addr(spi, fw_addr, 0);
  332. if (res != 0) {
  333. pr_err("[SSP] Error %d sending read_mem Address\n", res);
  334. return res;
  335. }
  336. res = send_byte_count(spi, len, 1);
  337. if (res != 0) {
  338. return -EPROTO;
  339. }
  340. res = stm32fwu_spi_read(spi, buffer, len);
  341. if (res < len) {
  342. return -EIO;
  343. }
  344. return len;
  345. }
  346. #endif
  347. static int fw_write_stm(struct spi_device *spi, u32 fw_addr,
  348. int len, const u8 *buffer)
  349. {
  350. int res;
  351. struct stm32fwu_spi_cmd cmd;
  352. struct stm32fwu_spi_cmd dummy_cmd;
  353. int i;
  354. u8 xor = 0;
  355. u8 send_buff[STM_MAX_BUFFER_SIZE] = {0,};
  356. cmd.cmd = WMEM_COMMAND;
  357. cmd.xor_cmd = XOR_WMEM_COMMAND;
  358. cmd.timeout = DEF_ACKCMD_NUMBER;
  359. cmd.ack_pad = (u8)((fw_addr >> 24) & 0xFF);
  360. #if SSP_STM_DEBUG
  361. pr_info("[SSP] sending WMEM_COMMAND\n");
  362. #endif
  363. if (len > STM_MAX_XFER_SIZE) {
  364. pr_err("[SSP] Can't send more than 256 bytes per transaction\n");
  365. return -EINVAL;
  366. }
  367. send_buff[0] = len - 1;
  368. memcpy(&send_buff[1], buffer, len);
  369. for (i = 0; i < (len + 1); i++)
  370. xor ^= send_buff[i];
  371. send_buff[len + 1] = xor;
  372. res = stm32fwu_spi_send_cmd(spi, &cmd);
  373. if (res != BL_ACK) {
  374. pr_err("[SSP] Error %d sending read_mem cmd\n", res);
  375. return res;
  376. }
  377. if (cmd.ack_loops > 0)
  378. res = send_addr(spi, fw_addr, 1);
  379. else
  380. res = send_addr(spi, fw_addr, 0);
  381. if (res != 0) {
  382. pr_err("[SSP] Error %d sending write_mem Address\n", res);
  383. return res;
  384. }
  385. res = stm32fwu_spi_write(spi, send_buff, len + 2);
  386. if (res < len) {
  387. pr_err("[SSP] Error writing to flash. res = %d\n", res);
  388. return ((res > 0) ? -EIO : res);
  389. }
  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. cmd.cmd = EXT_ER_COMMAND;
  495. cmd.xor_cmd = XOR_EXT_ER_COMMAND;
  496. cmd.timeout = DEF_ACKCMD_NUMBER;
  497. cmd.ack_pad = 0xFF;
  498. ret = stm32fwu_spi_send_cmd(spi, &cmd);
  499. if (ret < 0 || ret != BL_ACK) {
  500. pr_err("[SSP] fw_erase failed\n");
  501. return ret;
  502. }
  503. if (cmd.ack_loops == 0)
  504. ret = stm32fwu_spi_write(spi, buff, EXT_ER_DATA_LEN);
  505. else
  506. ret = stm32fwu_spi_write(spi, buff, EXT_ER_DATA_LEN-1);
  507. if (ret < (EXT_ER_DATA_LEN - cmd.ack_loops)) {
  508. return -EPROTO;
  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. dummy_cmd.timeout = DEF_ACKCMD_NUMBER;
  583. gpio_set_value_cansleep(data->rst, 0);
  584. mdelay(4);
  585. gpio_set_value_cansleep(data->rst, 1);
  586. usleep_range(45000, 47000);
  587. for (iCnt = 0; iCnt < 9; iCnt++) {
  588. gpio_set_value_cansleep(data->rst, 0);
  589. mdelay(4);
  590. gpio_set_value_cansleep(data->rst, 1);
  591. usleep_range(15000, 15500);
  592. }
  593. ret = stm32fwu_spi_write(data->spi, &syncb, 1);
  594. #if SSP_STM_DEBUG
  595. pr_info("[SSP] stm32fwu_spi_write(sync byte) returned %d\n", ret);
  596. #endif
  597. ret = stm32fwu_spi_wait_for_ack(data->spi, &dummy_cmd, BL_ACK);
  598. #if SSP_STM_DEBUG
  599. pr_info("[SSP] stm32fwu_spi_wait_for_ack returned %d (0x%x)\n",
  600. ret, ret);
  601. #endif
  602. return ret;
  603. }
  604. void toggle_mcu_reset(struct ssp_data *data)
  605. {
  606. gpio_set_value_cansleep(data->rst, 0);
  607. usleep_range(1000, 1200);
  608. gpio_set_value_cansleep(data->rst, 1);
  609. msleep(50);
  610. }
  611. static int update_mcu_bin(struct ssp_data *data, int iBinType)
  612. {
  613. int retry = BLMODE_RETRYCOUNT;
  614. int iRet = SUCCESS;
  615. struct stm32fwu_spi_cmd cmd;
  616. cmd.cmd = GO_COMMAND;
  617. cmd.xor_cmd = XOR_GO_COMMAND;
  618. cmd.timeout = 1000;
  619. cmd.ack_pad = (u8)((STM_APP_ADDR >> 24) & 0xFF);
  620. do {
  621. iRet = change_to_bootmode(data);
  622. pr_info("[ssp] bootmode %d retry: %d\n", iRet, 3 - retry);
  623. } while (retry-- > 0 && iRet != BL_ACK );
  624. if(iRet != BL_ACK) {
  625. pr_err("[SSP]: %s - change_to_bootmode %d\n",
  626. __func__, iRet);
  627. return iRet;
  628. }
  629. iRet = fw_erase_stm(data->spi);
  630. if (iRet < 0) {
  631. pr_err("[SSP]: %s - fw_erase_stm %d\n",
  632. __func__, iRet);
  633. return iRet;
  634. }
  635. switch (iBinType) {
  636. case KERNEL_BINARY:
  637. /* HW request: I2C line is reversed */
  638. #if defined(CONFIG_MACH_JSGLTE_CHN_CMCC)
  639. iRet = load_kernel_fw_bootmode(data->spi,
  640. BL_FW_JSGLTE_NAME);
  641. #else
  642. iRet = load_kernel_fw_bootmode(data->spi,
  643. BL_FW_NAME);
  644. #endif
  645. break;
  646. case KERNEL_CRASHED_BINARY:
  647. iRet = load_kernel_fw_bootmode(data->spi,
  648. BL_CRASHED_FW_NAME);
  649. break;
  650. case UMS_BINARY:
  651. iRet = load_ums_fw_bootmode(data->spi,
  652. BL_UMS_FW_NAME);
  653. break;
  654. default:
  655. pr_err("[SSP] binary type error!!\n");
  656. }
  657. /* STM : GO USER ADDR */
  658. stm32fwu_spi_send_cmd(data->spi, &cmd);
  659. if (cmd.ack_loops > 0)
  660. send_addr(data->spi, STM_APP_ADDR, 1);
  661. else
  662. send_addr(data->spi, STM_APP_ADDR, 0);
  663. msleep(SSP_SW_RESET_TIME);
  664. return iRet;
  665. }
  666. int forced_to_download_binary(struct ssp_data *data, int iBinType)
  667. {
  668. int iRet = 0;
  669. int retry = 3;
  670. ssp_dbg("[SSP]: %s - mcu binany update!\n", __func__);
  671. ssp_enable(data, false);
  672. data->fw_dl_state = FW_DL_STATE_DOWNLOADING;
  673. pr_info("[SSP] %s, DL state = %d\n", __func__,
  674. data->fw_dl_state);
  675. data->spi->max_speed_hz = BOOT_SPI_HZ;
  676. if (spi_setup(data->spi))
  677. pr_err("failed to setup spi for ssp_boot\n");
  678. do {
  679. pr_info("[SSP] %d try\n", 3 - retry);
  680. iRet = update_mcu_bin(data, iBinType);
  681. } while (retry -- > 0 && iRet < 0);
  682. data->spi->max_speed_hz = NORM_SPI_HZ;
  683. if (spi_setup(data->spi))
  684. pr_err("failed to setup spi for ssp_norm\n");
  685. if (iRet < 0) {
  686. ssp_dbg("[SSP]: %s - update_mcu_bin failed!\n", __func__);
  687. goto out;
  688. }
  689. data->fw_dl_state = FW_DL_STATE_SYNC;
  690. pr_info("[SSP] %s, DL state = %d\n", __func__, data->fw_dl_state);
  691. clean_pending_list(data);
  692. ssp_enable(data, true);
  693. iRet = initialize_mcu(data);
  694. if (iRet < 0) {
  695. iRet = ERROR;
  696. ssp_dbg("[SSP]: %s - initialize_mcu failed!\n", __func__);
  697. goto out;
  698. }
  699. proximity_open_lcd_ldi(data);
  700. proximity_open_calibration(data);
  701. accel_open_calibration(data);
  702. gyro_open_calibration(data);
  703. pressure_open_calibration(data);
  704. if (mag_open_hwoffset(data) < 0)
  705. pr_info("[SSP]: %s - mag_open_hw_offset"
  706. " failed, %d\n", __func__, iRet);
  707. sync_sensor_state(data);
  708. #ifdef CONFIG_SENSORS_SSP_SENSORHUB
  709. ssp_sensorhub_report_notice(data, MSG2SSP_AP_STATUS_RESET);
  710. #endif
  711. data->fw_dl_state = FW_DL_STATE_DONE;
  712. pr_info("[SSP] %s, DL state = %d\n", __func__, data->fw_dl_state);
  713. iRet = SUCCESS;
  714. out:
  715. return iRet;
  716. }
  717. int check_fwbl(struct ssp_data *data)
  718. {
  719. unsigned int fw_revision;
  720. pr_info("[SSP] change_rev = %d\n", data->ssp_changes);
  721. #if defined (CONFIG_MACH_JSGLTE_CHN_CMCC)
  722. fw_revision = SSP_FIRMWARE_REVISION_JSGLTE;
  723. #elif defined (CONFIG_MACH_VIKALCU)
  724. fw_revision = SSP_FIRMWARE_REVISION_STM;
  725. #elif defined (CONFIG_MACH_HLTEVZW) || defined (CONFIG_MACH_HLTESPR) \
  726. || defined (CONFIG_MACH_HLTEUSC)
  727. if (data->ap_rev > 3)
  728. fw_revision = SSP_FIRMWARE_REVISION_STM;
  729. else if (data->ap_rev > 2)
  730. fw_revision = SSP_FIRMWARE_REVISION_STM_88921;
  731. else
  732. fw_revision = SSP_FIRMWARE_REVISION_STM_RVS;
  733. #else
  734. if (data->ap_rev > 3)
  735. fw_revision = SSP_FIRMWARE_REVISION_STM;
  736. else
  737. fw_revision = SSP_FIRMWARE_REVISION_STM_88921;
  738. #endif
  739. data->uCurFirmRev = get_firmware_rev(data);
  740. if ((data->uCurFirmRev == SSP_INVALID_REVISION) \
  741. || (data->uCurFirmRev == SSP_INVALID_REVISION2)) {
  742. #if STM_SHOULD_BE_IMPLEMENT
  743. data->client->addr = BOOTLOADER_SLAVE_ADDR;
  744. iRet = check_bootloader(data->client, BL_WAITING_BOOTLOAD_CMD);
  745. if (iRet >= 0) {
  746. pr_info("[SSP] ssp_load_fw_bootmode\n");
  747. return FW_DL_STATE_NEED_TO_SCHEDULE;
  748. } else {
  749. pr_warn("[SSP] Firm Rev is invalid(%8u). Retry.\n",
  750. data->uCurFirmRev);
  751. data->client->addr = APP_SLAVE_ADDR;
  752. data->uCurFirmRev = get_firmware_rev(data);
  753. if (data->uCurFirmRev == SSP_INVALID_REVISION ||\
  754. data->uCurFirmRev == ERROR) {
  755. pr_err("[SSP] MCU is not working, FW download failed\n");
  756. return FW_DL_STATE_FAIL;
  757. } else if (data->uCurFirmRev != fw_revision) {
  758. pr_info("[SSP] MCU Firm Rev : Old = %8u, New = %8u\n",
  759. data->uCurFirmRev, fw_revision);
  760. return FW_DL_STATE_NEED_TO_SCHEDULE;
  761. }
  762. pr_info("[SSP] MCU Firm Rev : Old = %8u, New = %8u\n",
  763. data->uCurFirmRev, fw_revision);
  764. }
  765. #endif
  766. pr_err("[SSP] SSP_INVALID_REVISION\n");
  767. return FW_DL_STATE_NEED_TO_SCHEDULE;
  768. } else {
  769. if (data->uCurFirmRev != fw_revision) {
  770. pr_info("[SSP] MCU Firm Rev : Old = %8u, New = %8u\n",
  771. data->uCurFirmRev, fw_revision);
  772. return FW_DL_STATE_NEED_TO_SCHEDULE;
  773. }
  774. pr_info("[SSP] MCU Firm Rev : Old = %8u, New = %8u\n",
  775. data->uCurFirmRev, fw_revision);
  776. }
  777. return FW_DL_STATE_NONE;
  778. }