bl_main.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  1. /*
  2. * Copyright (c) 2022 OpenLuat & AirM2M
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a copy of
  5. * this software and associated documentation files (the "Software"), to deal in
  6. * the Software without restriction, including without limitation the rights to
  7. * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  8. * the Software, and to permit persons to whom the Software is furnished to do so,
  9. * subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in all
  12. * copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  16. * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  17. * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  18. * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  19. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  20. */
  21. #include "user.h"
  22. #include "LzmaLib.h"
  23. extern const uint32_t __isr_start_address;
  24. extern const uint32_t __os_heap_start;
  25. extern const uint32_t __ram_end;
  26. uint32_t SystemCoreClock;
  27. #define FW_UPGRADE_START_TIME 300
  28. #define FW_UPGRADE_ALL_TIME 2000
  29. #define FW_UPGRADE_DATA_TIME 50
  30. #define FW_OTA_FLASH_BUF_LEN 4096
  31. enum
  32. {
  33. FW_UPGRADE_STATE_IDLE,
  34. FW_UPGRADE_STATE_START,
  35. FW_UPGRADE_STATE_RUN,
  36. FW_UPGRADE_STATE_WAIT_END,
  37. };
  38. typedef struct
  39. {
  40. Buffer_Struct FWDataBuffer;
  41. uint32_t FWStartAddress;
  42. uint32_t FWTotalLen;
  43. uint32_t FWCRC32;
  44. uint32_t NextLzmaAddress;
  45. // uint32_t XferLen;
  46. uint8_t *NextLzmaData;
  47. uint32_t NextLzmaDataLen;
  48. uint8_t NextLzmaHeader[LZMA_PROPS_SIZE + 8];
  49. uint32_t NextLzmaHeaderSize;
  50. uint32_t CurSPIFlashStart;
  51. uint32_t NextSPIFlashStart;
  52. uint8_t *CurSPIFlashData;
  53. uint8_t *NextSPIFlashData;
  54. uint8_t State;
  55. uint8_t ForceOut;
  56. uint8_t SPIFlashReadDone;
  57. }BL_CtrlStuct;
  58. #define BL_DBG DBG_INFO
  59. //#define BL_DBG(X, Y...)
  60. typedef void (*pFunction)(void);
  61. static uint32_t CRC32_Table[256];
  62. static BL_CtrlStuct prvBL;
  63. static SPIFlash_CtrlStruct prvSPIFlash;
  64. void Jump_AppRun(uint32_t Address)
  65. {
  66. /* Jump to user application */
  67. pFunction Jump_To_Application;
  68. uint32_t JumpAddress;
  69. __disable_irq();
  70. DBG_INFO("jump to 0x%x !", Address);
  71. JumpAddress = *(__IO uint32_t*) (Address + 4);
  72. Jump_To_Application = (pFunction) JumpAddress;
  73. /* Initialize user application's Stack Pointer */
  74. __set_MSP(*(__IO uint32_t*) Address);
  75. /* Jump to application */
  76. Jump_To_Application();
  77. }
  78. uint8_t BL_CheckFlashPage(uint32_t Page, uint32_t Address)
  79. {
  80. uint32_t EndAddress = Page * __FLASH_SECTOR_SIZE__ ;
  81. if (Address >= EndAddress)
  82. {
  83. return 1;
  84. }
  85. else
  86. {
  87. return 0;
  88. }
  89. }
  90. uint32_t BL_GetFlashPage(uint32_t Address)
  91. {
  92. return Address/__FLASH_SECTOR_SIZE__;
  93. }
  94. void BL_UnlockFlash(void)
  95. {
  96. }
  97. void BL_LockFlash(void)
  98. {
  99. }
  100. void BL_EraseSector(uint32_t address)
  101. {
  102. Flash_EraseSector(address, 0);
  103. // BL_DBG("%x", address);
  104. // FLASH_EraseSector(address);
  105. // CACHE_CleanAll(CACHE);
  106. }
  107. static void BL_OTAErase(uint32_t Address, uint32_t Len)
  108. {
  109. Flash_Erase(Address, Len);
  110. }
  111. static void BL_OTAWrite(uint32_t Address, uint8_t *Data, uint32_t Len)
  112. {
  113. Flash_Program(Address, Data, Len);
  114. }
  115. void FileSystem_Init(void)
  116. {
  117. }
  118. int32_t BL_StartNewDownload(uint32_t Address, uint32_t TotalLen, uint32_t CRC32)
  119. {
  120. if (prvBL.State != FW_UPGRADE_STATE_IDLE)
  121. {
  122. return -1;
  123. }
  124. prvBL.FWStartAddress = Address;
  125. prvBL.FWTotalLen = TotalLen;
  126. prvBL.FWCRC32 = CRC32;
  127. prvBL.State = FW_UPGRADE_STATE_START;
  128. prvBL.NextLzmaAddress = 0;
  129. // prvBL.XferLen = 0;
  130. return 0;
  131. }
  132. int BL_DownloadAddData(uint32_t PacketSn, uint8_t *Data, uint32_t Len, uint32_t *NextPacketSn)
  133. {
  134. uint32_t RestLen = prvBL.FWDataBuffer.MaxLen - prvBL.FWDataBuffer.Pos;
  135. if (prvBL.NextLzmaAddress != PacketSn)
  136. {
  137. *NextPacketSn = prvBL.NextLzmaAddress;
  138. return -1;
  139. }
  140. else
  141. {
  142. // prvBL.XferLen += Len;
  143. prvBL.NextLzmaAddress += Len;
  144. *NextPacketSn = prvBL.NextLzmaAddress;
  145. Buffer_StaticWrite(&prvBL.FWDataBuffer, Data, Len);
  146. if (prvBL.NextLzmaData)
  147. {
  148. return 60000;
  149. }
  150. else
  151. {
  152. return 1;
  153. }
  154. }
  155. }
  156. uint8_t BL_DownloadEnd(void)
  157. {
  158. if (prvBL.State != FW_UPGRADE_STATE_RUN)
  159. {
  160. return ERROR_OPERATION_FAILED;
  161. }
  162. prvBL.State = FW_UPGRADE_STATE_WAIT_END;
  163. return ERROR_NONE;
  164. }
  165. uint8_t BL_RunAPP(void)
  166. {
  167. prvBL.ForceOut = 1;
  168. }
  169. uint8_t BL_RunLzmaBlock(uint8_t *Head, uint8_t HeadLen)
  170. {
  171. if (!prvBL.FWDataBuffer.Pos) return ERROR_NONE;
  172. if (!prvBL.NextLzmaData)
  173. {
  174. memcpy(prvBL.NextLzmaHeader, Head, HeadLen);
  175. prvBL.NextLzmaHeaderSize = HeadLen;
  176. prvBL.NextLzmaData = prvBL.FWDataBuffer.Data;
  177. prvBL.NextLzmaDataLen = prvBL.FWDataBuffer.Pos;
  178. OS_InitBuffer(&prvBL.FWDataBuffer, SPI_FLASH_BLOCK_SIZE);
  179. prvBL.NextLzmaAddress = 0;
  180. return ERROR_NONE;
  181. }
  182. else
  183. {
  184. return ERROR_BUFFER_FULL;
  185. }
  186. }
  187. void Local_Upgrade(void)
  188. {
  189. uint8_t *FullData = malloc(SPI_FLASH_BLOCK_SIZE);
  190. uint32_t FinishLen = 0;
  191. uint32_t ProgramLen, CRC32, i;
  192. uint64_t AllToTick = GetSysTick() + FW_UPGRADE_START_TIME * CORE_TICK_1MS;
  193. uint64_t DataToTick = GetSysTick() + FW_UPGRADE_DATA_TIME * CORE_TICK_1MS;
  194. uint8_t ConnectCnt = 0;
  195. uint8_t ConnectOK = 0;
  196. uint8_t *CurLzmaData = NULL;
  197. uint32_t CurLzmaDataLen;
  198. uint8_t CurLzmaHead[LZMA_PROPS_SIZE + 8];
  199. uint8_t CurLzmaHeadLen;
  200. DBG_Response(DBG_DEVICE_FW_UPGRADE_READY, ERROR_NONE, &ConnectCnt, 1);
  201. while(!prvBL.ForceOut)
  202. {
  203. WDT_Feed();
  204. switch(prvBL.State)
  205. {
  206. case FW_UPGRADE_STATE_IDLE:
  207. if (DataToTick <= GetSysTick())
  208. {
  209. ConnectCnt++;
  210. DataToTick = GetSysTick() + FW_UPGRADE_DATA_TIME * CORE_TICK_1MS;
  211. DBG_Response(DBG_DEVICE_FW_UPGRADE_READY, ERROR_NONE, &ConnectCnt, 1);
  212. }
  213. break;
  214. case FW_UPGRADE_STATE_START:
  215. AllToTick = GetSysTick() + FW_UPGRADE_ALL_TIME * CORE_TICK_1MS;
  216. prvBL.State = FW_UPGRADE_STATE_RUN;
  217. uint8_t *CurLzmaData = NULL;
  218. prvBL.NextLzmaData = NULL;
  219. // prvBL.XferLen = 0;
  220. FinishLen = 0;
  221. ConnectOK = 1;
  222. break;
  223. case FW_UPGRADE_STATE_RUN:
  224. case FW_UPGRADE_STATE_WAIT_END:
  225. if (prvBL.NextLzmaData)
  226. {
  227. WDT_Feed();
  228. CurLzmaData = prvBL.NextLzmaData;
  229. CurLzmaDataLen = prvBL.NextLzmaDataLen;
  230. memcpy(CurLzmaHead, prvBL.NextLzmaHeader, prvBL.NextLzmaHeaderSize);
  231. CurLzmaHeadLen = prvBL.NextLzmaHeaderSize;
  232. prvBL.NextLzmaData = NULL;
  233. ProgramLen = __FLASH_BLOCK_SIZE__;
  234. LzmaUncompress(FullData, &ProgramLen, CurLzmaData, &CurLzmaDataLen, CurLzmaHead, CurLzmaHeadLen);
  235. Flash_Erase(prvBL.FWStartAddress + FinishLen, __FLASH_BLOCK_SIZE__);
  236. Flash_Program(prvBL.FWStartAddress + FinishLen, FullData, ProgramLen);
  237. free(CurLzmaData);
  238. CurLzmaData = NULL;
  239. FinishLen += ProgramLen;
  240. DataToTick = GetSysTick() + FW_UPGRADE_DATA_TIME * CORE_TICK_1MS;
  241. AllToTick = GetSysTick() + FW_UPGRADE_ALL_TIME * CORE_TICK_1MS;
  242. }
  243. if (FinishLen >= prvBL.FWTotalLen)
  244. {
  245. CACHE_CleanAll(CACHE);
  246. CRC32 = CRC32_Cal(CRC32_Table, prvBL.FWStartAddress, prvBL.FWTotalLen, CRC32_START);
  247. if (CRC32 != prvBL.FWCRC32)
  248. {
  249. DBG_Response(DBG_DEVICE_FW_UPGRADE_RESULT, ERROR_PROTOCL, &CRC32, 4);
  250. }
  251. else
  252. {
  253. DBG_Response(DBG_DEVICE_FW_UPGRADE_RESULT, ERROR_NONE, &CRC32, 4);
  254. }
  255. AllToTick = GetSysTick() + FW_UPGRADE_START_TIME * CORE_TICK_1MS;
  256. prvBL.State = FW_UPGRADE_STATE_IDLE;
  257. DataToTick = GetSysTick() + FW_UPGRADE_DATA_TIME * CORE_TICK_1MS;
  258. }
  259. break;
  260. default:
  261. break;
  262. }
  263. if (AllToTick <= GetSysTick())
  264. {
  265. prvBL.ForceOut = 1;
  266. DBG_Response(DBG_DEVICE_FW_UPGRADE_RESULT, ERROR_TIMEOUT, &ConnectCnt, 1);
  267. }
  268. }
  269. if (ConnectOK)
  270. {
  271. BL_EraseSector(__FLASH_OTA_INFO_ADDR__);
  272. }
  273. free(FullData);
  274. }
  275. static int32_t BL_OTAReadDataInFlash(void *pData, void *pParam)
  276. {
  277. Buffer_Struct *pBuffer = (Buffer_Struct *)pParam;
  278. memcpy(pBuffer->Data, pData, pBuffer->Pos);
  279. return 0;
  280. }
  281. static int32_t BL_OTAReadDataInSpiFlash(void *pData, void *pParam)
  282. {
  283. uint32_t StartAddress = (uint32_t)pData;
  284. Buffer_Struct *pBuffer = (Buffer_Struct *)pParam;
  285. // DBG_INFO("%x,%x,%x,%x,%x", StartAddress, prvBL.CurSPIFlashStart, prvBL.NextSPIFlashStart, prvBL.CurSPIFlashData, prvBL.NextSPIFlashData);
  286. if (prvBL.CurSPIFlashData)
  287. {
  288. if (StartAddress >= prvBL.NextSPIFlashStart)
  289. {
  290. if (!prvBL.SPIFlashReadDone)
  291. {
  292. while(!SPIFlash_WaitOpDone(&prvSPIFlash))
  293. {
  294. ;
  295. }
  296. prvBL.SPIFlashReadDone = 1;
  297. }
  298. free(prvBL.CurSPIFlashData);
  299. prvBL.CurSPIFlashStart = prvBL.NextSPIFlashStart;
  300. prvBL.CurSPIFlashData = prvBL.NextSPIFlashData;
  301. prvBL.NextSPIFlashData = malloc(FW_OTA_FLASH_BUF_LEN);
  302. prvBL.NextSPIFlashStart += FW_OTA_FLASH_BUF_LEN;
  303. SPIFlash_Read(&prvSPIFlash, prvBL.NextSPIFlashStart, prvBL.NextSPIFlashData, FW_OTA_FLASH_BUF_LEN, 1);
  304. prvBL.SPIFlashReadDone = 0;
  305. }
  306. }
  307. else
  308. {
  309. prvBL.CurSPIFlashData = malloc(FW_OTA_FLASH_BUF_LEN);
  310. prvBL.NextSPIFlashData = malloc(FW_OTA_FLASH_BUF_LEN);
  311. SPIFlash_Read(&prvSPIFlash, prvBL.CurSPIFlashStart, prvBL.CurSPIFlashData, FW_OTA_FLASH_BUF_LEN, 1);
  312. while(!SPIFlash_WaitOpDone(&prvSPIFlash))
  313. {
  314. ;
  315. }
  316. SPIFlash_Read(&prvSPIFlash, prvBL.NextSPIFlashStart, prvBL.NextSPIFlashData, FW_OTA_FLASH_BUF_LEN, 1);
  317. prvBL.SPIFlashReadDone = 0;
  318. }
  319. memcpy(pBuffer->Data, prvBL.CurSPIFlashData, pBuffer->Pos);
  320. return 0;
  321. }
  322. static int32_t BL_OTAReadDataInFS(void *pData, void *pParam)
  323. {
  324. Buffer_Struct *pBuffer = (Buffer_Struct *)pParam;
  325. }
  326. static void BL_SpiInit(uint8_t SpiID, uint8_t *Pin)
  327. {
  328. switch(SpiID)
  329. {
  330. case HSPI_ID0:
  331. GPIO_Iomux(GPIOC_12,3);
  332. GPIO_Iomux(GPIOC_13,3);
  333. GPIO_Iomux(GPIOC_15,3);
  334. SYSCTRL->CG_CTRL1 |= SYSCTRL_APBPeriph_HSPI;
  335. break;
  336. case SPI_ID0:
  337. switch(Pin[0])
  338. {
  339. case GPIOB_14:
  340. GPIO_Iomux(GPIOB_14,0);
  341. break;
  342. case GPIOC_14:
  343. GPIO_Iomux(GPIOC_14,2);
  344. break;
  345. }
  346. switch(Pin[1])
  347. {
  348. case GPIOB_15:
  349. GPIO_Iomux(GPIOB_15,0);
  350. break;
  351. case GPIOC_15:
  352. GPIO_Iomux(GPIOC_15,2);
  353. break;
  354. }
  355. switch(Pin[2])
  356. {
  357. case GPIOB_12:
  358. GPIO_Iomux(GPIOB_12,0);
  359. break;
  360. case GPIOC_12:
  361. GPIO_Iomux(GPIOC_12,2);
  362. break;
  363. }
  364. SYSCTRL->CG_CTRL1 |= SYSCTRL_APBPeriph_SPI0;
  365. break;
  366. case SPI_ID1:
  367. GPIO_Iomux(GPIOA_06,3);
  368. GPIO_Iomux(GPIOA_08,3);
  369. GPIO_Iomux(GPIOA_09,3);
  370. SYSCTRL->CG_CTRL1 |= SYSCTRL_APBPeriph_SPI1;
  371. break;
  372. case SPI_ID2:
  373. GPIO_Iomux(GPIOB_02,0);
  374. GPIO_Iomux(GPIOB_04,0);
  375. GPIO_Iomux(GPIOB_05,0);
  376. SYSCTRL->CG_CTRL1 |= SYSCTRL_APBPeriph_SPI2;
  377. break;
  378. }
  379. }
  380. void Remote_Upgrade(void)
  381. {
  382. CoreUpgrade_HeadStruct Head;
  383. Buffer_Struct ReadBuffer;
  384. CBFuncEx_t pReadFunc;
  385. PV_Union uPV, uPin;
  386. uint32_t Check;
  387. uint32_t DoneLen;
  388. int32_t Result;
  389. uint8_t Reboot = 0;
  390. OS_InitBuffer(&ReadBuffer, FW_OTA_FLASH_BUF_LEN);
  391. memcpy(&Head, __FLASH_OTA_INFO_ADDR__, sizeof(CoreUpgrade_HeadStruct));
  392. Check = CRC32_Cal(CRC32_Table, &Head.Param1, sizeof(Head) - 8, 0xffffffff);
  393. if (Head.MaigcNum != __APP_START_MAGIC__)
  394. {
  395. DBG_INFO("no ota info");
  396. return;
  397. }
  398. if (Check != Head.CRC32)
  399. {
  400. DBG_INFO("ota info error");
  401. return;
  402. }
  403. uPV.u32 = Head.Param1;
  404. switch(uPV.u8[1])
  405. {
  406. case CORE_OTA_IN_FLASH:
  407. Check = CRC32_Cal(CRC32_Table, Head.DataStartAddress, Head.DataLen, 0xffffffff);
  408. if (Check != Head.DataCRC32)
  409. {
  410. DBG_INFO("ota file CRC32: %x,%x", Check, Head.DataCRC32);
  411. goto OTA_END;
  412. }
  413. pReadFunc = BL_OTAReadDataInFlash;
  414. break;
  415. case CORE_OTA_OUT_SPI_FLASH:
  416. memset(&prvSPIFlash, 0, sizeof(prvSPIFlash));
  417. prvSPIFlash.SpiID = uPV.u8[2];
  418. uPin.u32 = Head.Param2;
  419. BL_SpiInit(prvSPIFlash.SpiID, uPin.u8);
  420. prvSPIFlash.CSPin = uPin.u8[3];
  421. GPIO_Config(prvSPIFlash.CSPin, 0, 1);
  422. SPI_MasterInit(prvSPIFlash.SpiID, 8, SPI_MODE_0, 24000000, NULL, NULL);
  423. prvSPIFlash.IsBlockMode = 1;
  424. prvSPIFlash.IsSpiDMAMode = 1;
  425. SPI_DMATxInit(prvSPIFlash.SpiID, FLASH_SPI_TX_DMA_STREAM, 0);
  426. SPI_DMARxInit(prvSPIFlash.SpiID, FLASH_SPI_RX_DMA_STREAM, 0);
  427. SPIFlash_Init(&prvSPIFlash, NULL);
  428. prvBL.CurSPIFlashStart = Head.DataStartAddress;
  429. prvBL.NextSPIFlashStart = Head.DataStartAddress + FW_OTA_FLASH_BUF_LEN;
  430. prvBL.CurSPIFlashData = NULL;
  431. prvBL.NextSPIFlashData = NULL;
  432. pReadFunc = BL_OTAReadDataInSpiFlash;
  433. DoneLen = 0;
  434. Check = 0xffffffff;
  435. while(DoneLen < Head.DataLen)
  436. {
  437. if ((Head.DataLen - DoneLen) < SPI_FLASH_BLOCK_SIZE)
  438. {
  439. SPIFlash_Read(&prvSPIFlash, Head.DataStartAddress + DoneLen, prvBL.FWDataBuffer.Data, (Head.DataLen - DoneLen), 0);
  440. Check = CRC32_Cal(CRC32_Table, prvBL.FWDataBuffer.Data, (Head.DataLen - DoneLen), Check);
  441. DoneLen = Head.DataLen;
  442. }
  443. else
  444. {
  445. SPIFlash_Read(&prvSPIFlash, Head.DataStartAddress + DoneLen, prvBL.FWDataBuffer.Data, SPI_FLASH_BLOCK_SIZE, 0);
  446. Check = CRC32_Cal(CRC32_Table, prvBL.FWDataBuffer.Data, SPI_FLASH_BLOCK_SIZE, Check);
  447. DoneLen += SPI_FLASH_BLOCK_SIZE;
  448. }
  449. }
  450. if (Check != Head.DataCRC32)
  451. {
  452. DBG_INFO("ota file CRC32: %x,%x", Check, Head.DataCRC32);
  453. goto OTA_END;
  454. }
  455. break;
  456. default:
  457. DBG_INFO("core ota storage mode %u not support", uPV.u8[1]);
  458. return;
  459. break;
  460. }
  461. switch(uPV.u8[0])
  462. {
  463. case CORE_OTA_MODE_FULL:
  464. goto OTA_FULL;
  465. break;
  466. default:
  467. DBG_INFO("core ota mode %u not support", uPV.u8[0]);
  468. return;
  469. break;
  470. }
  471. goto OTA_END;
  472. OTA_FULL:
  473. DoneLen = 0;
  474. while(DoneLen < Head.DataLen)
  475. {
  476. ReadBuffer.Pos = ((Head.DataLen - DoneLen) > ReadBuffer.MaxLen)?ReadBuffer.MaxLen:(Head.DataLen - DoneLen);
  477. Result = pReadFunc(Head.DataStartAddress + DoneLen, &ReadBuffer);
  478. if (Result < 0)
  479. {
  480. Reboot = 1;
  481. DBG_INFO("core ota read data fail");
  482. goto OTA_END;
  483. }
  484. if (memcmp(__FLASH_APP_START_ADDR__ + DoneLen, ReadBuffer.Data, ReadBuffer.Pos))
  485. {
  486. DBG_INFO("ota %x", __FLASH_APP_START_ADDR__ + DoneLen);
  487. BL_OTAErase(__FLASH_APP_START_ADDR__ + DoneLen, ReadBuffer.Pos);
  488. BL_OTAWrite(__FLASH_APP_START_ADDR__ + DoneLen, ReadBuffer.Data, ReadBuffer.Pos);
  489. CACHE_CleanAll(CACHE);
  490. WDT_Feed();
  491. }
  492. DoneLen += ReadBuffer.Pos;
  493. }
  494. Check = CRC32_Cal(CRC32_Table, __FLASH_APP_START_ADDR__, Head.DataLen, 0xffffffff);
  495. if (Head.DataCRC32 != Check)
  496. {
  497. Reboot = 1;
  498. DBG_INFO("core ota final check crc32 fail %x %x", Check, Head.DataCRC32);
  499. goto OTA_END;
  500. }
  501. goto OTA_END;
  502. OTA_DIFF:
  503. goto OTA_END;
  504. OTA_END:
  505. if (Reboot)
  506. {
  507. NVIC_SystemReset();
  508. while(1){;}
  509. }
  510. else
  511. {
  512. BL_EraseSector(__FLASH_OTA_INFO_ADDR__);
  513. }
  514. }
  515. void SystemInit(void)
  516. {
  517. SYSCTRL->LDO25_CR = (1 << 5);
  518. SCB->VTOR = (uint32_t)(&__isr_start_address);
  519. #ifdef __USE_XTL__
  520. SYSCTRL->FREQ_SEL = 0x20000000 | SYSCTRL_FREQ_SEL_HCLK_DIV_1_2 | (1 << 13) | SYSCTRL_FREQ_SEL_CLOCK_SOURCE_EXT | SYSCTRL_FREQ_SEL_XTAL_192Mhz;
  521. #else
  522. SYSCTRL->FREQ_SEL = 0x20000000 | SYSCTRL_FREQ_SEL_HCLK_DIV_1_2 | (1 << 13) | SYSCTRL_FREQ_SEL_CLOCK_SOURCE_INC | SYSCTRL_FREQ_SEL_XTAL_192Mhz;
  523. #endif
  524. WDT_SetTimeout(__WDT_TO_MS__);
  525. WDT_ModeConfig(WDT_Mode_Interrupt);
  526. WDT_Enable();
  527. // QSPI->DEVICE_PARA = (QSPI->DEVICE_PARA & 0xFFFF) | (68 << 16);
  528. #if (__FPU_PRESENT) && (__FPU_USED == 1)
  529. SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11*2));
  530. #endif
  531. SYSCTRL->CG_CTRL1 = SYSCTRL_APBPeriph_UART0|SYSCTRL_APBPeriph_GPIO|SYSCTRL_APBPeriph_TIMM0;
  532. SYSCTRL->CG_CTRL2 = SYSCTRL_AHBPeriph_DMA|SYSCTRL_AHBPeriph_USB;
  533. SYSCTRL->LOCK_R &= ~SYSCTRL_USB_RESET;
  534. SYSCTRL->SOFT_RST2 |= SYSCTRL_USB_RESET;
  535. QSPI->DEVICE_PARA = (QSPI->DEVICE_PARA & 0x0000fff0) | (16 << 16) |(0x0a);
  536. // QSPI_Init(NULL);
  537. // QSPI_SetLatency(0);
  538. }
  539. void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */
  540. {
  541. SystemCoreClock = HSE_VALUE * (((SYSCTRL->FREQ_SEL & SYSCTRL_FREQ_SEL_XTAL_Mask) >> SYSCTRL_FREQ_SEL_XTAL_Pos) + 1);
  542. }
  543. int main(void)
  544. {
  545. uint32_t AppInfo[4];
  546. uint32_t prvHeapLen;
  547. prvHeapLen = (uint32_t)(&__ram_end) - (uint32_t)(&__os_heap_start);
  548. bpool((uint32_t)(&__os_heap_start), prvHeapLen);
  549. CRC32_CreateTable(CRC32_Table, CRC32_GEN);
  550. __NVIC_SetPriorityGrouping(7 - __NVIC_PRIO_BITS);//对于freeRTOS必须这样配置
  551. SystemCoreClockUpdate();
  552. CoreTick_Init();
  553. cm_backtrace_init(NULL, NULL, NULL);
  554. Uart_GlobalInit();
  555. DMA_GlobalInit();
  556. DBG_Init(0);
  557. FileSystem_Init();
  558. OS_InitBuffer(&prvBL.FWDataBuffer, SPI_FLASH_BLOCK_SIZE);
  559. LOCAL_UPGRADE_START:
  560. Local_Upgrade();
  561. Uart_BaseInit(DBG_UART_ID, DBG_UART_BR, 0, UART_DATA_BIT8, UART_PARITY_NONE, UART_STOP_BIT1, NULL);
  562. #ifndef __RAMRUN__
  563. Remote_Upgrade();
  564. // __disable_irq();
  565. BL_LockFlash();
  566. memcpy(AppInfo, __FLASH_APP_START_ADDR__, sizeof(AppInfo));
  567. if (__APP_START_MAGIC__ == AppInfo[0])
  568. {
  569. #ifdef __DEBUG__
  570. DBG_INFO("bootloader build debug %s %s %x!", __DATE__, __TIME__, QSPI->DEVICE_PARA);
  571. #else
  572. DBG_INFO("bootloader build release %s %s!", __DATE__, __TIME__, QSPI->DEVICE_PARA);
  573. #endif
  574. Jump_AppRun(__FLASH_APP_START_ADDR__ + AppInfo[1]);
  575. }
  576. else
  577. {
  578. goto LOCAL_UPGRADE_START;
  579. }
  580. // i = i / j; //只是测试一下backtrace功能
  581. #endif
  582. NVIC_SystemReset();
  583. }