Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

985 linhas
26 KiB

  1. //#include <proc/p32mx440f256h.h>
  2. #include "BootloaderInterface.h"
  3. #include "BootloaderProtocol.h"
  4. #include "ProtocolDefs.h"
  5. #include "BoardCfg.h"
  6. #include "timer.h"
  7. #include "WiFiCtrl.h"
  8. #include "SPI_Flash.h"
  9. #include "FlashMapping.h"
  10. #include "NetworkProtocol.h"
  11. #include "Syslog.h"
  12. #include "checksum.h"
  13. #include "FlashMapping.h"
  14. #define BOOTLOADER_FLASH_ERASE_POLL_TIMEOUT 25//100 //ms
  15. #define BOOTLOADER_FLASH_ERASE_MAX_POLL_COUNT 40//10 //One sector should not take more than 1s to erase...
  16. #define BOOTLOADER_FLASH_WRITE_POLL_TIMEOUT 25//100 //ms
  17. #define BOOTLOADER_FLASH_WRITE_MAX_POLL_COUNT 40//10 //One sector should not take more than 1s to erase...
  18. unsigned char BootloaderBuffer[300];
  19. int BootloaderInterfaceState;
  20. int DataChunkWritten;
  21. int CurDataChunkIndex;
  22. int FirmwareUploaded;
  23. int CurDataChunkSize;
  24. int BooloaderFlashEraseState;
  25. int BootloaderFlashErased;
  26. unsigned int BootloaderCurFlashEraseAddress;
  27. int BooloaderFlashErasePollCount;
  28. int BootloaderFlashWriteState;
  29. unsigned int BootloaderCurFlashWriteAddress;
  30. int BootloaderFlashWritePollCount;
  31. int BootloaderFirmwareChunkWriteCount;
  32. char* BootloaderFlashWriteDataPtr;
  33. int BootloaderInterfaceInit()
  34. {
  35. BootloaderProtocolInit();
  36. BootloaderResetStateMachine();
  37. BootloaderCheckFlashBootloaderData();
  38. update_crc_32(0,0); //Force to populate the CRC32 table...
  39. return 1;
  40. }
  41. void BootloaderInterfaceTick()
  42. {
  43. BootloaderInterfaceStateMachine(BOOTLOADER_TICK_EVENT,0);
  44. }
  45. void BootloaderExecuteCmd(char Cmd,bool CRCValid)
  46. {
  47. unsigned char *DataBufPtr = BootloaderProtocolGetDataBufferPtr();
  48. if(CRCValid == 0)
  49. {
  50. printf("Bootloader received a frame with invalid CRC\n");
  51. BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_INVALID_CRC_CMD);
  52. return;
  53. }
  54. switch(Cmd)
  55. {
  56. case BOOTLOADER_HEARTBEAT_REQUEST:
  57. {
  58. printf("Bootloader Heartbeat Request\n");
  59. *DataBufPtr = 1;
  60. BootloaderProtocolSendFrame(BOOTLOADER_HEARTBEAT_RESPONSE,1);
  61. break;
  62. }
  63. case BOOTLOADER_ERASE_BOOTLOADER_FLASH_REQUEST:
  64. {
  65. printf("BOOTLOADER_ERASE_BOOTLOADER_FLASH_REQUEST\n");
  66. BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_ERASE_FLASH_CMD);
  67. break;
  68. }
  69. case BOOTLOADER_INIT_UPLOAD_REQUEST:
  70. {
  71. printf("BOOTLOADER_INIT_UPLOAD_REQUEST\n");
  72. BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_INIT_UPLOAD_CMD);
  73. break;
  74. }
  75. case BOOTLOADER_GET_STATE_REQUEST:
  76. {
  77. printf("BOOTLOADER_GET_STATE_REQUEST\n");
  78. BootloaderProtocolSendBootloaderState((char)BootloaderInterfaceState);
  79. break;
  80. }
  81. case BOOTLOADER_SEND_DATA_CHUNK_REQUEST:
  82. {
  83. // printf("BOOTLOADER_SEND_DATA_CHUNK_REQUEST\n");
  84. BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_NEW_DATA_CHUNK_CMD);
  85. break;
  86. }
  87. case BOOTLOADER_UPLOAD_FINISHED_REQUEST:
  88. {
  89. printf("BOOTLOADER_UPLOAD_FINISHED_REQUEST\n");
  90. BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_UPLOAD_FINISHED_CMD);
  91. break;
  92. }
  93. case BOOTLOADER_EXECUTE_UPGRAGE_REQUEST:
  94. {
  95. printf("BOOTLOADER_EXECUTE_UPGRAGE_REQUEST\n");
  96. BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_EXECUTE_UPGRAGE_CMD);
  97. break;
  98. }
  99. case BOOTLOADER_ABORT_OPERATION_REQUEST:
  100. {
  101. printf("BOOTLOADER_ABORT_OPERATION_REQUEST\n");
  102. BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_ABORT_CMD);
  103. }
  104. case BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_REQUEST:
  105. {
  106. printf("BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_REQUEST\n");
  107. BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_CHECK_FLASH_CMD);
  108. break;
  109. }
  110. case BOOTLOADER_GET_STORED_FIRMWARE_INFO_REQUEST:
  111. {
  112. printf("BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_REQUEST\n");
  113. BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_GET_FIRMWARE_DATA_CMD);
  114. break;
  115. }
  116. default:
  117. {
  118. break;
  119. }
  120. }
  121. }
  122. void BootloaderCRCError(char Cmd, int RxCRC, int ExpectedCRC)
  123. {
  124. printf("BootloaderProtocol detected a CRC error. Cmd: %d, RxCRC:0x%x, Expected:[0x%x]\n",Cmd,RxCRC,ExpectedCRC);
  125. BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_INVALID_CRC_CMD);
  126. }
  127. void BootloaderInterfaceStateMachine(int Event, int Param)
  128. {
  129. switch(BootloaderInterfaceState)
  130. {
  131. case BOOTLOADER_STANDBY_STATE:
  132. {
  133. switch(Event)
  134. {
  135. case BOOTLOADER_TICK_EVENT:
  136. {
  137. break;
  138. }
  139. case BOOTLOADER_NEW_CMD_EVENT:
  140. {
  141. if(Param == BOOTLOADER_SM_ACTIVATE_CMD)
  142. {
  143. BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE;
  144. printf("Bootloader Interface going into active state\n");
  145. }
  146. break;
  147. }
  148. case BOOTLOADER_TIMEOUT_EVENT:
  149. {
  150. break;
  151. }
  152. }
  153. break;
  154. }
  155. case BOOTLOADER_ACTIVE_STATE:
  156. {
  157. switch(Event)
  158. {
  159. case BOOTLOADER_TICK_EVENT:
  160. {
  161. break;
  162. }
  163. case BOOTLOADER_NEW_CMD_EVENT:
  164. {
  165. switch(Param)
  166. {
  167. case BOOTLOADER_SM_ERASE_FLASH_CMD:
  168. {
  169. ResetBootloaderFlashEraseStateMachine(); //Setup the state machine
  170. BootloaderProtocolSendACK(BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESPONSE);
  171. BootloaderInterfaceState = BOOTLOADER_ERASE_FLASH_STATE;
  172. printf("Bootloader Interface going into Erase Flash state\n");
  173. break;
  174. }
  175. case BOOTLOADER_SM_INIT_UPLOAD_CMD:
  176. {
  177. if(BootloaderFlashErased == 0)
  178. {
  179. BootloaderProtocolSendInitUploadResponse(BOOTLOADEDR_INIT_TRANSFER_ERROR_FLASH_NOT_ERASED);
  180. }
  181. else
  182. {
  183. BootloaderProtocolSendInitUploadResponse(BOOTLOADEDR_INIT_TRANSFER_OK);
  184. //TODO: Shall we prepare something before??
  185. BootloaderProtocolSendACK(BOOTLOADER_READY_FOR_DATA_RESPONSE);
  186. BootloaderInterfaceState = BOOTLOADER_RECEIVING_FIRMWARE_STATE;
  187. printf("Bootloader Interface going into Firmware RX state\n");
  188. }
  189. break;
  190. }
  191. case BOOTLOADER_SM_ABORT_CMD:
  192. {
  193. //TODO invalidate data in Flash
  194. printf("Aborting upload, going into STANDBY mode\n");
  195. BootloaderResetStateMachine();
  196. break;
  197. }
  198. case BOOTLOADER_SM_EXECUTE_UPGRAGE_CMD:
  199. {
  200. if(BootloaderCheckFlashBootloaderData() == RET_OK)
  201. {
  202. BootloaderProtocolSendACK(BOOTLOADER_EXECUTE_UPGRADE_RESPONSE);
  203. printf("Bootloader will now upgrade and reboot!!\n");
  204. char Flags[2];
  205. Flags[BOOTLOADER_FLAGS_ACTION_FLAG_INDEX] = BOOTLOADER_ACTION_FLASH_FIRMWARE_VALUE;
  206. Flags[BOOTLOADER_FLAGS_ACTION_VALIDATOR_INDEX] = BOOTLOADER_FLASH_FIRMWARE_VALIDATOR;
  207. SPIFlashWriteBuffer(Flags,2,FLASH_BTLDR_FLAGS_ADDRESS);
  208. Sleep(100);
  209. TurnOFFWiFi();
  210. Sleep(100);
  211. SoftReset();
  212. }
  213. else
  214. {
  215. BootloaderProtocolSendNACK(BOOTLOADER_EXECUTE_UPGRADE_RESPONSE);
  216. printf("Bootloader upgrade request denied: Firmware not uploaded\n");
  217. }
  218. break;
  219. }
  220. case BOOTLOADER_SM_CHECK_FLASH_CMD:
  221. {
  222. if(BootloaderCheckFlashBootloaderData() == RET_OK)
  223. {
  224. BootloaderProtocolSendFlashCheckResult(FLASH_CHECK_SUCCESS);
  225. }
  226. else
  227. {
  228. BootloaderProtocolSendFlashCheckResult(FLASH_CHECK_FAILED);
  229. }
  230. break;
  231. }
  232. case BOOTLOADER_SM_GET_FIRMWARE_DATA_CMD:
  233. {
  234. char Response[21];
  235. memset(Response,0xFF,sizeof(Response));
  236. if(BootloaderCheckFlashBootloaderData() != RET_OK)
  237. {
  238. Response[0] = 0;
  239. }
  240. else
  241. {
  242. Response[0] = 1;
  243. BootloaderIntToBytes(&Response[1],mStoredBootloaderInfo.Firmwareflags);
  244. BootloaderIntToBytes(&Response[5],mStoredBootloaderInfo.NbRecords);
  245. BootloaderIntToBytes(&Response[9],mStoredBootloaderInfo.FirmwareSize);
  246. BootloaderIntToBytes(&Response[13],mStoredBootloaderInfo.Versioncode);
  247. BootloaderIntToBytes(&Response[17],mStoredBootloaderInfo.DataCRC32);
  248. }
  249. BootloaderProtocolSendStoredFirmwareInfoResponse(Response,sizeof(Response));
  250. break;
  251. }
  252. default:
  253. {
  254. //SEND NACK
  255. BootloaderProtocolSendNACK(Param);
  256. break;
  257. }
  258. }
  259. break;
  260. }
  261. case BOOTLOADER_TIMEOUT_EVENT:
  262. {
  263. break;
  264. }
  265. }
  266. break;
  267. }
  268. case BOOTLOADER_ERASE_FLASH_STATE:
  269. {
  270. switch(Event)
  271. {
  272. case BOOTLOADER_TICK_EVENT:
  273. {
  274. int res = BootloaderFlashEraseStateMachine(BOOTLOADER_FLASH_ERASE_SM_TICK_EVENT);
  275. switch(res)
  276. {
  277. case BOOTLOADER_FLASH_ERASE_RUNNING_RES:
  278. {
  279. break;
  280. }
  281. case BOOTLOADER_FLASH_ERASE_FINISHED_RES:
  282. {
  283. printf("Flash erase finished. Bootloader Interface going into Active state\n");
  284. BootloaderProtocolSendACK(BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESULT_RESPONSE); //TODO: send result instead
  285. BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE;
  286. BootloaderFlashErased = 1;
  287. break;
  288. }
  289. case BOOTLOADER_FLASH_ERASE_ERROR_RES:
  290. {
  291. printf("Flash erase error. Bootloader Interface going into Active state\n");
  292. BootloaderProtocolSendNACK(BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESULT_RESPONSE); //TODO: send result instead
  293. BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE;
  294. break;
  295. }
  296. case BOOTLOADER_FLASH_ERASE_ABORT_RES:
  297. {
  298. printf("Flash erase abort. Bootloader Interface going into Active state\n");
  299. BootloaderProtocolSendNACK(BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESULT_RESPONSE); //TODO: send result instead
  300. BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE;
  301. break;
  302. }
  303. }
  304. break;
  305. }
  306. case BOOTLOADER_NEW_CMD_EVENT:
  307. {
  308. switch(Param)
  309. {
  310. case BOOTLOADER_SM_ABORT_CMD:
  311. {
  312. //TODO: stop erasing and reset SM.
  313. //TODO invalidate data in Flash
  314. BootloaderFlashEraseStateMachine(BOOTLOADER_FLASH_ERASE_SM_ABORT_EVENT);
  315. printf("Aborting Flash erase, going into STANDBY mode\n");
  316. BootloaderResetStateMachine();
  317. break;
  318. }
  319. default:
  320. {
  321. //SEND NACK
  322. BootloaderProtocolSendNACK(Param);
  323. break;
  324. }
  325. }
  326. break;
  327. }
  328. case BOOTLOADER_TIMEOUT_EVENT:
  329. {
  330. break;
  331. }
  332. }
  333. break;
  334. }
  335. case BOOTLOADER_RECEIVING_FIRMWARE_STATE:
  336. {
  337. switch(Event)
  338. {
  339. case BOOTLOADER_TICK_EVENT:
  340. {
  341. int res = BootloaderFlashWriteStateMachine(BOOTLOADER_FLASH_WRITE_SM_TICK_EVENT);
  342. switch(res)
  343. {
  344. case BOOTLOADER_FLASH_WRITING_RES:
  345. {
  346. break;
  347. }
  348. case BOOTLOADER_FLASH_WRITE_FINISHED_RES:
  349. {
  350. BootloaderProtocolSendDataChunkResult(BOOTLOADER_CHUNK_TRANSFER_SUCCESS,CurDataChunkIndex);
  351. printf("Bootloader Chunk %d successfuly written to flash\n",CurDataChunkIndex);
  352. CurDataChunkIndex++;
  353. break;
  354. }
  355. case BOOTLOADER_FLASH_WRITE_ERROR_RES:
  356. {
  357. BootloaderProtocolSendDataChunkResult(BOOTLOADER_CHUNK_TRANSFER_ERROR_FLASH_ERROR,CurDataChunkIndex);
  358. BootloaderResetStateMachine();
  359. printf("Bootloader Flash write error. Aborting and going into STANDBY state\n");
  360. break;
  361. }
  362. case BOOTLOADER_FLASH_WRITE_ABORT_RES:
  363. {
  364. break;
  365. }
  366. }
  367. break;
  368. }
  369. case BOOTLOADER_NEW_CMD_EVENT:
  370. {
  371. switch(Param)
  372. {
  373. case BOOTLOADER_SM_NEW_DATA_CHUNK_CMD:
  374. {
  375. //TODO:Check data validity
  376. //TODO: Write data to flash
  377. //Extract index from buffer
  378. unsigned int DataChunkIndex = 0;
  379. unsigned int DataChunkSize = 0;
  380. DataChunkSize = 0;
  381. // DataChunkIndex = BootloaderBuffer[0];
  382. // DataChunkIndex <<= 8;
  383. // DataChunkIndex += BootloaderBuffer[1];
  384. // DataChunkIndex <<= 8;
  385. // DataChunkIndex += BootloaderBuffer[2];
  386. // DataChunkIndex <<= 8;
  387. // DataChunkIndex += BootloaderBuffer[3];
  388. DataChunkIndex = BootloaderBytesToInt(&BootloaderBuffer[0]);
  389. // DataChunkSize = BootloaderBuffer[4];
  390. // DataChunkSize <<= 8;
  391. // DataChunkSize += BootloaderBuffer[5];
  392. // DataChunkSize <<= 8;
  393. // DataChunkSize += BootloaderBuffer[6];
  394. // DataChunkSize <<= 8;
  395. // DataChunkSize += BootloaderBuffer[7];
  396. DataChunkSize = BootloaderBytesToInt(&BootloaderBuffer[4]);
  397. BootloaderFlashWriteDataPtr = &BootloaderBuffer[8];
  398. //Check CRC
  399. if(CurDataChunkIndex != DataChunkIndex)
  400. {
  401. //Error... abort.
  402. BootloaderProtocolSendDataChunkResult(BOOTLOADER_CHUNK_TRANSFER_ERROR_INVALID_CHUNK_INDEX,CurDataChunkIndex);
  403. printf("Bootloader Interface ABORTING UPLOAD. Received invalid chunk index. Rx: [%d] - Expected: [%d]\n", DataChunkIndex,CurDataChunkIndex);
  404. ResetBootloaderFlashWriteStateMachine();
  405. }
  406. else
  407. {
  408. CurDataChunkSize = DataChunkSize;
  409. BootloaderFlashWriteStateMachine(BOOTLOADER_FLASH_WRITE_SM_NEW_BUFFER_EVENT);
  410. printf("Bootloader Interface. Rx new data chunk. Writing to flash. Index: %d\n", DataChunkIndex);
  411. }
  412. break;
  413. }
  414. case BOOTLOADER_SM_INVALID_CRC_CMD:
  415. {
  416. //BootloaderProtocol determined the CRC of the chunk was invalid.
  417. BootloaderProtocolSendDataChunkResult(BOOTLOADER_CHUNK_TRANSFER_ERROR_RESEND,CurDataChunkIndex);
  418. printf("Bootloader Interface invalid chunk CRC. Requesting resend chunk index [%d]\n", CurDataChunkIndex);
  419. break;
  420. }
  421. case BOOTLOADER_SM_UPLOAD_FINISHED_CMD:
  422. {
  423. printf("Bootloader Interface firmware upload finished. Check flash integrity.\n");
  424. if(BootloaderCheckFlashBootloaderData() == RET_OK)
  425. {
  426. BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE;
  427. //BootloaderProtocolSendACK(BOOTLOADER_UPLOAD_FINISHED_RESPONSE);
  428. BootloaderProtocolSendFirmwareUploadResult(BOOTLOADER_UPLOAD_SUCCESS);
  429. FirmwareUploaded = 1;
  430. }
  431. else
  432. {
  433. printf("Firmware integrity check failed. Going back to STANDBY state.\n");
  434. // BootloaderProtocolSendNACK(BOOTLOADER_UPLOAD_FINISHED_RESPONSE);
  435. BootloaderProtocolSendFirmwareUploadResult(BOOTLOADER_UPLOAD_FAILED_FLASH_VERIFICATION_ERROR);
  436. BootloaderResetStateMachine();
  437. FirmwareUploaded = 0;
  438. }
  439. break;
  440. }
  441. case BOOTLOADER_SM_ABORT_CMD:
  442. {
  443. //TODO invalidate data in Flash
  444. printf("Bootloader aborting firmware download. Going back to STANDBY state\n");
  445. BootloaderFlashWriteStateMachine(BOOTLOADER_FLASH_WRITE_SM_ABORT_EVENT);
  446. BootloaderResetStateMachine();
  447. break;
  448. }
  449. default:
  450. {
  451. //WHAT TO DO???
  452. break;
  453. }
  454. }
  455. break;
  456. }
  457. case BOOTLOADER_TIMEOUT_EVENT:
  458. {
  459. break;
  460. }
  461. }
  462. break;
  463. }
  464. case BOOTLOADER_SENDING_FIRMWARE_COPY_STATE:
  465. {
  466. switch(Event)
  467. {
  468. case BOOTLOADER_TICK_EVENT:
  469. {
  470. break;
  471. }
  472. case BOOTLOADER_NEW_CMD_EVENT:
  473. {
  474. switch(Param)
  475. {
  476. case BOOTLOADER_SM_ABORT_CMD:
  477. {
  478. //TODO invalidate data in Flash
  479. printf("Aborting upload, going into STANDBY mode\n");
  480. BootloaderResetStateMachine();
  481. break;
  482. }
  483. default:
  484. {
  485. //SEND NACK
  486. BootloaderProtocolSendNACK(Param);
  487. break;
  488. }
  489. }
  490. break;
  491. }
  492. case BOOTLOADER_TIMEOUT_EVENT:
  493. {
  494. break;
  495. }
  496. }
  497. break;
  498. }
  499. case BOOTLOADER_PRINTING_FIRMWARE_STATE:
  500. {
  501. switch(Event)
  502. {
  503. case BOOTLOADER_TICK_EVENT:
  504. {
  505. break;
  506. }
  507. case BOOTLOADER_NEW_CMD_EVENT:
  508. {
  509. switch(Param)
  510. {
  511. case BOOTLOADER_SM_ABORT_CMD:
  512. {
  513. //TODO invalidate data in Flash
  514. printf("Aborting upload, going into STANDBY mode\n");
  515. BootloaderResetStateMachine();
  516. break;
  517. }
  518. default:
  519. {
  520. //SEND NACK
  521. BootloaderProtocolSendNACK(Param);
  522. break;
  523. }
  524. }
  525. break;
  526. }
  527. case BOOTLOADER_TIMEOUT_EVENT:
  528. {
  529. break;
  530. }
  531. }
  532. break;
  533. }
  534. }
  535. }
  536. void BootloaderResetStateMachine()
  537. {
  538. BootloaderInterfaceState = BOOTLOADER_STANDBY_STATE;
  539. DataChunkWritten = 0;
  540. CurDataChunkIndex = 0;
  541. FirmwareUploaded = 0;
  542. CurDataChunkIndex = 0;
  543. FirmwareUploaded = 0;
  544. CurDataChunkSize = 0;
  545. ResetBootloaderFlashEraseStateMachine();
  546. ResetBootloaderFlashWriteStateMachine();
  547. CloseBootloaderServer();
  548. }
  549. void BootloaderActivateBootloader()
  550. {
  551. OpenBootloaderServer();
  552. BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_ACTIVATE_CMD);
  553. }
  554. void BootloaderDeactivateBootloader()
  555. {
  556. BootloaderResetStateMachine();
  557. // CloseBootloaderServer();
  558. // BootloaderIterfaceStateMachine(BOOTLOADER_SM_ABORT_CMD,0);
  559. }
  560. int BootloaderFlashEraseStateMachine(int event)
  561. {
  562. if(event == BOOTLOADER_FLASH_ERASE_SM_ABORT_EVENT)
  563. {
  564. ResetBootloaderFlashEraseStateMachine();
  565. return BOOTLOADER_FLASH_ERASE_ABORT_RES;
  566. }
  567. switch(BooloaderFlashEraseState)
  568. {
  569. case BOOTLOADER_FLASH_ERASE_SECTOR_STATE:
  570. {
  571. if(SPIFlashErase64KSector(BootloaderCurFlashEraseAddress,0) == RET_ERROR)
  572. {
  573. printf("Bootloader Interface Erasing sector %0x%x\n", BootloaderCurFlashEraseAddress);
  574. BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_ERROR_STATE;
  575. return BOOTLOADER_FLASH_ERASE_ERROR_RES;
  576. }
  577. BooloaderFlashErasePollCount = 0;
  578. TimerStart(BOOTLOADER_FLASH_POLL_TIMER,BOOTLOADER_FLASH_ERASE_POLL_TIMEOUT);
  579. BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_WAIT_FOR_SECTOR_DONE;
  580. break;
  581. }
  582. case BOOTLOADER_FLASH_ERASE_WAIT_FOR_SECTOR_DONE:
  583. {
  584. if(IsTimerExpired(BOOTLOADER_FLASH_POLL_TIMER) == 1)
  585. {
  586. if(SPIFlashCheckBusy() == 0) //sector erased
  587. {
  588. if(BootloaderCurFlashEraseAddress == FLASH_BTLDR_FIRMWARE_LAST_64K_SECTOR_ADD)
  589. {
  590. //Whole bootloader partition is erased.
  591. printf("Bootloader Interface: Last sector 0x%x erased after %d polls\n",BootloaderCurFlashEraseAddress,BooloaderFlashErasePollCount);
  592. BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_FINISHED_STATE;
  593. return BOOTLOADER_FLASH_ERASE_FINISHED_RES;
  594. break;
  595. }
  596. else
  597. {
  598. printf("Bootloader Interface sector 0x%x erased after %d polls\n",BootloaderCurFlashEraseAddress,BooloaderFlashErasePollCount);
  599. BootloaderCurFlashEraseAddress += SPI_FLASH_64K_SECTOR_SIZE;
  600. BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_SECTOR_STATE;
  601. }
  602. }
  603. else
  604. {
  605. if(BooloaderFlashErasePollCount >= BOOTLOADER_FLASH_ERASE_MAX_POLL_COUNT)
  606. {
  607. printf("Bootloader Interface Flash erase error. Max poll count reached : %d!!!\n",BooloaderFlashErasePollCount);
  608. BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_ERROR_STATE;
  609. return BOOTLOADER_FLASH_ERASE_ERROR_RES;
  610. }
  611. else
  612. {
  613. TimerStart(BOOTLOADER_FLASH_POLL_TIMER,BOOTLOADER_FLASH_ERASE_POLL_TIMEOUT);
  614. BooloaderFlashErasePollCount++;
  615. }
  616. }
  617. }
  618. break;
  619. }
  620. case BOOTLOADER_FLASH_ERASE_CHECKBACK_STATE:
  621. {
  622. break;
  623. }
  624. case BOOTLOADER_FLASH_ERASE_FINISHED_STATE:
  625. {
  626. return BOOTLOADER_FLASH_ERASE_FINISHED_RES;
  627. break;
  628. }
  629. case BOOTLOADER_FLASH_ERASE_ERROR_STATE:
  630. {
  631. return BOOTLOADER_FLASH_ERASE_ERROR_RES;
  632. break;
  633. }
  634. }
  635. return BOOTLOADER_FLASH_ERASE_RUNNING_RES;
  636. }
  637. int ResetBootloaderFlashEraseStateMachine()
  638. {
  639. BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_SECTOR_STATE;
  640. BootloaderCurFlashEraseAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS;
  641. BooloaderFlashErasePollCount = 0;
  642. BootloaderFlashErased = 0;
  643. }
  644. int BootloaderFlashWriteStateMachine(int event)
  645. {
  646. switch(BootloaderFlashWriteState)
  647. {
  648. case BOOTLOADER_FLASH_WRITE_STANDBY_STATE:
  649. {
  650. if(event == BOOTLOADER_FLASH_WRITE_SM_TICK_EVENT)
  651. {
  652. //TODO: timeout
  653. // return BOOTLOADER_FLASH_WRITE_ERROR_RES;
  654. }
  655. else if(event == BOOTLOADER_FLASH_WRITE_SM_NEW_BUFFER_EVENT)
  656. {
  657. // printf("Starting writing data to Flash\nFlash Address : Data\n");
  658. BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_BUFFER_STATE;
  659. BootloaderFirmwareChunkWriteCount = 0;
  660. return BOOTLOADER_FLASH_WRITING_RES;
  661. }
  662. break;
  663. }
  664. case BOOTLOADER_FLASH_WRITE_BUFFER_STATE:
  665. {
  666. if(BootloaderFlashWriteDataPtr == 0)
  667. {
  668. ResetBootloaderFlashWriteStateMachine();
  669. return BOOTLOADER_FLASH_WRITE_ERROR_RES;
  670. }
  671. while(BootloaderFirmwareChunkWriteCount < CurDataChunkSize)
  672. {
  673. //printf("%d : 0x%x\n",(BootloaderCurFlashWriteAddress-FLASH_BTLDR_FIRMWARE_START_ADDRESS),(unsigned int)*BootloaderFlashWriteDataPtr);
  674. if(SPIFlashWriteByte(BootloaderCurFlashWriteAddress++,*BootloaderFlashWriteDataPtr++,1) == RET_ERROR)
  675. {
  676. printf("Bootloader flash error. Aborting and going back to STANDBY\n");
  677. BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_ERROR_STATE;
  678. return BOOTLOADER_FLASH_WRITE_ERROR_RES;
  679. }
  680. int cnt = 0;
  681. while(1)
  682. {
  683. if(SPIFlashCheckBusy() == 0)
  684. {
  685. break;
  686. }
  687. if(cnt++ > 200)
  688. {
  689. printf("Bootloader flash write timeout error. Aborting and going back to STANDBY\n");
  690. BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_ERROR_STATE;
  691. return BOOTLOADER_FLASH_WRITE_ERROR_RES;
  692. }
  693. }
  694. BootloaderFirmwareChunkWriteCount++;
  695. }
  696. BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_WAIT_FOR_BYTE_DONE;
  697. return BOOTLOADER_FLASH_WRITING_RES;
  698. // BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_STANDBY_STATE;
  699. // return BOOTLOADER_FLASH_WRITE_FINISHED_RES;
  700. break;
  701. }
  702. case BOOTLOADER_FLASH_WRITE_WAIT_FOR_BYTE_DONE:
  703. {
  704. if(event == BOOTLOADER_FLASH_WRITE_SM_TICK_EVENT)
  705. {
  706. BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_STANDBY_STATE;
  707. return BOOTLOADER_FLASH_WRITE_FINISHED_RES;
  708. // if(SyslogIsBufferEmpty() == RET_OK)
  709. // {
  710. // BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_STANDBY_STATE;
  711. // return BOOTLOADER_FLASH_WRITE_FINISHED_RES;
  712. // }
  713. // else
  714. // {
  715. // return BOOTLOADER_FLASH_WRITING_RES;
  716. // }
  717. }
  718. break;
  719. }
  720. case BOOTLOADER_FLASH_WRITE_CHECKBACK_STATE:
  721. {
  722. break;
  723. }
  724. case BOOTLOADER_FLASH_WRITE_FINISHED_STATE:
  725. {
  726. return BOOTLOADER_FLASH_WRITE_FINISHED_RES;
  727. break;
  728. }
  729. case BOOTLOADER_FLASH_WRITE_ERROR_STATE:
  730. {
  731. return BOOTLOADER_FLASH_WRITE_ERROR_RES;
  732. break;
  733. }
  734. }
  735. }
  736. int BootloaderPrintFlashData()
  737. {
  738. }
  739. int BootloaderCheckFlashBootloaderData()
  740. {
  741. unsigned char FlashData[700];
  742. unsigned int FlashAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS;
  743. unsigned int FileHeaderCode, FirmwareFlags, NbRecords, FirmwareSize, VersionCode, CRC32;
  744. unsigned int ComputedCRC32 = CRC_START_32;
  745. //SPIFlashReadBuffer(FlashData,700,FlashAddress);
  746. printf("Checking Flash bootloader data integrity... \n");
  747. SPIFlashReadBuffer(FlashData,FLASH_BTLDR_HEADER_SIZE,FlashAddress);
  748. FileHeaderCode = BootloaderBytesToInt(FlashData);
  749. FirmwareFlags = BootloaderBytesToInt(&FlashData[4]);
  750. NbRecords = BootloaderBytesToInt(&FlashData[8]);
  751. FirmwareSize = BootloaderBytesToInt(&FlashData[12]);
  752. VersionCode = BootloaderBytesToInt(&FlashData[16]);
  753. CRC32 = BootloaderBytesToInt(&FlashData[20]);
  754. mStoredBootloaderInfo.Firmwareflags = FirmwareFlags;
  755. mStoredBootloaderInfo.NbRecords = NbRecords;
  756. mStoredBootloaderInfo.FirmwareSize = FirmwareSize;
  757. mStoredBootloaderInfo.Versioncode = VersionCode;
  758. mStoredBootloaderInfo.DataCRC32 = CRC32;
  759. //printf("File Header: Code:[0x%x] - Flags:[0x%x] - Nb Records:[%d] - Firmware Size:[%d] - Version:[0x%x] - CRC32:[0x%x]\n",FileHeaderCode,FirmwareFlags,NbRecords,FirmwareSize,VersionCode,CRC32);
  760. if(FileHeaderCode != BOOTLOADER_FILE_HEADER_CODE)
  761. {
  762. // printf("Invalid file header code, aborting\n");
  763. return RET_ERROR;
  764. }
  765. if(NbRecords == 0)
  766. {
  767. // printf("No records in file (NbRecords = 0), aborting\n");
  768. return RET_ERROR;
  769. }
  770. FlashAddress += FLASH_BTLDR_HEADER_SIZE; //point to the start of bootloader data
  771. int CurRecord = 0;
  772. bool Done = false;
  773. int RecHeader, RecSize, RecStartAddress;
  774. //Check the header of each sector.
  775. while(Done == false)
  776. {
  777. SPIFlashReadBuffer(FlashData,12,FlashAddress);
  778. RecHeader = BootloaderBytesToInt(FlashData);
  779. RecSize = BootloaderBytesToInt(&FlashData[4]);
  780. RecStartAddress = BootloaderBytesToInt(&FlashData[8]);
  781. FlashAddress += 12;
  782. if(RecHeader != BOOTLOADER_RECORD_HEADER_CODE)
  783. {
  784. // printf("Error in record #%d. Invalid header code : [0x%x]\n",CurRecord,RecHeader);
  785. return RET_ERROR;
  786. }
  787. if(RecSize == 0)
  788. {
  789. // printf("Error in record #%d. Invalid record size (RecordSize = 0) \n");
  790. return RET_ERROR;
  791. }
  792. // printf("Record #%d OK! Header:[0x%x] - Size:[%d] - Start Address:[0x%x]\n",CurRecord,RecHeader,RecSize,RecStartAddress);
  793. // while(SyslogIsBufferEmpty() == RET_ERROR)
  794. // {
  795. // SyslogTick();
  796. // TickWiFi();
  797. // }
  798. CurRecord++;
  799. if(CurRecord == NbRecords)
  800. {
  801. // Done = true;
  802. // printf("All records checked OK! Computing CRC...\n");
  803. Done = true;
  804. break;
  805. //return RET_OK;
  806. }
  807. else
  808. {
  809. FlashAddress += RecSize;
  810. }
  811. }
  812. //Now, compute whole data CRC
  813. FlashAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS + FLASH_BTLDR_HEADER_SIZE;
  814. char Byte;
  815. int i;
  816. for(i = 0; i < FirmwareSize; i++)
  817. {
  818. SPIFlashReadBuffer(&Byte,1,FlashAddress++);
  819. ComputedCRC32 = update_crc_32(ComputedCRC32,Byte);
  820. }
  821. ComputedCRC32 ^= 0xffffffffL;
  822. if(ComputedCRC32 == CRC32)
  823. {
  824. // printf("CRC32 matches. Computed:[0x%x] - Expected:[0x%x]\n",ComputedCRC32,CRC32);
  825. // printf("Flash check success. Firmware is valid\n");
  826. return RET_OK;
  827. }
  828. else
  829. {
  830. // printf("CRC32 mismatch. Computed:[0x%x] - Expected:[0x%x]\n",ComputedCRC32,CRC32);
  831. // printf("Flash check failed.\n");
  832. return RET_ERROR;
  833. }
  834. return RET_OK;
  835. }
  836. int ResetBootloaderFlashWriteStateMachine()
  837. {
  838. BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_STANDBY_STATE;
  839. BootloaderCurFlashWriteAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS;
  840. BootloaderFlashWritePollCount = 0;
  841. BootloaderFirmwareChunkWriteCount = 0;
  842. BootloaderFlashWriteDataPtr = 0;
  843. BootloaderFirmwareChunkWriteCount = 0;
  844. return RET_OK;
  845. }
  846. int BootloaderBytesToInt(unsigned char *Bytes)
  847. {
  848. if(Bytes == 0)
  849. {
  850. return 0;
  851. }
  852. int Output = Bytes[0];
  853. Output <<= 8;
  854. Output += Bytes[1];
  855. Output <<= 8;
  856. Output += Bytes[2];
  857. Output <<= 8;
  858. Output += Bytes[3];
  859. return Output;
  860. }
  861. int BootloaderIntToBytes(unsigned char *Buf, unsigned int Input)
  862. {
  863. if(Buf == 0)
  864. {
  865. return 0;
  866. }
  867. Buf[3] = (unsigned char)(Input & 0xFF);
  868. Input >>= 8;
  869. Buf[2] = (unsigned char)(Input & 0xFF);
  870. Input >>= 8;
  871. Buf[1] = (unsigned char)(Input & 0xFF);
  872. Input >>= 8;
  873. Buf[0] = (unsigned char)(Input & 0xFF);
  874. Input >>= 8;
  875. return 1;
  876. }