bl_main.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  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 SPI_FLASH_BLOCK_SIZE
  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. static void BL_OTAErase(uint32_t Address, uint32_t Len)
  101. {
  102. Flash_Erase(Address, Len);
  103. }
  104. void FileSystem_Init(void)
  105. {
  106. }
  107. int32_t BL_StartNewDownload(uint32_t Address, uint32_t TotalLen, uint32_t CRC32)
  108. {
  109. if (prvBL.State != FW_UPGRADE_STATE_IDLE)
  110. {
  111. return -1;
  112. }
  113. prvBL.FWStartAddress = Address;
  114. prvBL.FWTotalLen = TotalLen;
  115. prvBL.FWCRC32 = CRC32;
  116. prvBL.State = FW_UPGRADE_STATE_START;
  117. prvBL.NextLzmaAddress = 0;
  118. // prvBL.XferLen = 0;
  119. return 0;
  120. }
  121. int BL_DownloadAddData(uint32_t PacketSn, uint8_t *Data, uint32_t Len, uint32_t *NextPacketSn)
  122. {
  123. uint32_t RestLen = prvBL.FWDataBuffer.MaxLen - prvBL.FWDataBuffer.Pos;
  124. if (prvBL.NextLzmaAddress != PacketSn)
  125. {
  126. *NextPacketSn = prvBL.NextLzmaAddress;
  127. return -1;
  128. }
  129. else
  130. {
  131. // prvBL.XferLen += Len;
  132. prvBL.NextLzmaAddress += Len;
  133. *NextPacketSn = prvBL.NextLzmaAddress;
  134. Buffer_StaticWrite(&prvBL.FWDataBuffer, Data, Len);
  135. if (prvBL.NextLzmaData)
  136. {
  137. return 60000;
  138. }
  139. else
  140. {
  141. return 1;
  142. }
  143. }
  144. }
  145. uint8_t BL_DownloadEnd(void)
  146. {
  147. if (prvBL.State != FW_UPGRADE_STATE_RUN)
  148. {
  149. return ERROR_OPERATION_FAILED;
  150. }
  151. prvBL.State = FW_UPGRADE_STATE_WAIT_END;
  152. return ERROR_NONE;
  153. }
  154. uint8_t BL_RunAPP(void)
  155. {
  156. prvBL.ForceOut = 1;
  157. }
  158. uint8_t BL_RunLzmaBlock(uint8_t *Head, uint8_t HeadLen)
  159. {
  160. if (!prvBL.FWDataBuffer.Pos) return ERROR_NONE;
  161. if (!prvBL.NextLzmaData)
  162. {
  163. memcpy(prvBL.NextLzmaHeader, Head, HeadLen);
  164. prvBL.NextLzmaHeaderSize = HeadLen;
  165. prvBL.NextLzmaData = prvBL.FWDataBuffer.Data;
  166. prvBL.NextLzmaDataLen = prvBL.FWDataBuffer.Pos;
  167. OS_InitBuffer(&prvBL.FWDataBuffer, __FLASH_BLOCK_SIZE__);
  168. prvBL.NextLzmaAddress = 0;
  169. return ERROR_NONE;
  170. }
  171. else
  172. {
  173. return ERROR_BUFFER_FULL;
  174. }
  175. }
  176. void Local_Upgrade(void)
  177. {
  178. DBuffer_Struct DBuf;
  179. uint32_t FinishLen = 0;
  180. uint32_t ProgramLen, CRC32, i;
  181. uint64_t AllToTick = GetSysTick() + FW_UPGRADE_START_TIME * CORE_TICK_1MS;
  182. uint64_t DataToTick = GetSysTick() + FW_UPGRADE_DATA_TIME * CORE_TICK_1MS;
  183. uint8_t ConnectCnt = 0;
  184. uint8_t ConnectOK = 0;
  185. uint8_t *CurLzmaData = NULL;
  186. uint32_t CurLzmaDataLen;
  187. uint8_t CurLzmaHead[LZMA_PROPS_SIZE + 8];
  188. uint8_t CurLzmaHeadLen;
  189. DBuffer_Init(&DBuf, __FLASH_BLOCK_SIZE__);
  190. DBG_Response(DBG_DEVICE_FW_UPGRADE_READY, ERROR_NONE, &ConnectCnt, 1);
  191. while(!prvBL.ForceOut)
  192. {
  193. WDT_Feed();
  194. switch(prvBL.State)
  195. {
  196. case FW_UPGRADE_STATE_IDLE:
  197. if (DataToTick <= GetSysTick())
  198. {
  199. ConnectCnt++;
  200. DataToTick = GetSysTick() + FW_UPGRADE_DATA_TIME * CORE_TICK_1MS;
  201. DBG_Response(DBG_DEVICE_FW_UPGRADE_READY, ERROR_NONE, &ConnectCnt, 1);
  202. }
  203. break;
  204. case FW_UPGRADE_STATE_START:
  205. BL_OTAErase(__FLASH_OTA_INFO_ADDR__, __FLASH_SECTOR_SIZE__);
  206. AllToTick = GetSysTick() + FW_UPGRADE_ALL_TIME * CORE_TICK_1MS;
  207. prvBL.State = FW_UPGRADE_STATE_RUN;
  208. uint8_t *CurLzmaData = NULL;
  209. prvBL.NextLzmaData = NULL;
  210. // prvBL.XferLen = 0;
  211. FinishLen = 0;
  212. ConnectOK = 1;
  213. break;
  214. case FW_UPGRADE_STATE_RUN:
  215. case FW_UPGRADE_STATE_WAIT_END:
  216. if (DBuffer_GetDataLen(&DBuf, 0))
  217. {
  218. DBuffer_SwapCache(&DBuf);
  219. DBuffer_SetDataLen(&DBuf, 0, 0);
  220. goto PROGRAM_BLOCK;
  221. }
  222. if (prvBL.NextLzmaData)
  223. {
  224. CurLzmaData = prvBL.NextLzmaData;
  225. CurLzmaDataLen = prvBL.NextLzmaDataLen;
  226. memcpy(CurLzmaHead, prvBL.NextLzmaHeader, prvBL.NextLzmaHeaderSize);
  227. CurLzmaHeadLen = prvBL.NextLzmaHeaderSize;
  228. prvBL.NextLzmaData = NULL;
  229. if (!CurLzmaHead[0])
  230. {
  231. memcpy(DBuffer_GetCache(&DBuf, 1), CurLzmaData, CurLzmaDataLen);
  232. DBuffer_SetDataLen(&DBuf, CurLzmaDataLen, 1);
  233. }
  234. else
  235. {
  236. ProgramLen = __FLASH_BLOCK_SIZE__;
  237. LzmaUncompress(DBuffer_GetCache(&DBuf, 1), &ProgramLen, CurLzmaData, &CurLzmaDataLen, CurLzmaHead, CurLzmaHeadLen);
  238. DBuffer_SetDataLen(&DBuf, ProgramLen, 1);
  239. }
  240. free(CurLzmaData);
  241. CurLzmaData = NULL;
  242. goto PROGRAM_BLOCK;
  243. }
  244. goto PROGRAM_CHECK;
  245. PROGRAM_BLOCK:
  246. WDT_Feed();
  247. if (memcmp(prvBL.FWStartAddress + FinishLen, DBuffer_GetCache(&DBuf, 1), DBuffer_GetDataLen(&DBuf, 1)))
  248. {
  249. Flash_EraseStart(prvBL.FWStartAddress + FinishLen, 1);
  250. while(Flash_CheckBusy())
  251. {
  252. if (prvBL.NextLzmaData && !DBuffer_GetDataLen(&DBuf, 0))
  253. {
  254. CurLzmaData = prvBL.NextLzmaData;
  255. CurLzmaDataLen = prvBL.NextLzmaDataLen;
  256. memcpy(CurLzmaHead, prvBL.NextLzmaHeader, prvBL.NextLzmaHeaderSize);
  257. CurLzmaHeadLen = prvBL.NextLzmaHeaderSize;
  258. prvBL.NextLzmaData = NULL;
  259. if (!CurLzmaHead[0])
  260. {
  261. memcpy(DBuffer_GetCache(&DBuf, 0), CurLzmaData, CurLzmaDataLen);
  262. DBuffer_SetDataLen(&DBuf, CurLzmaDataLen, 0);
  263. }
  264. else
  265. {
  266. ProgramLen = __FLASH_BLOCK_SIZE__;
  267. LzmaUncompress(DBuffer_GetCache(&DBuf, 0), &ProgramLen, CurLzmaData, &CurLzmaDataLen, CurLzmaHead, CurLzmaHeadLen);
  268. DBuffer_SetDataLen(&DBuf, ProgramLen, 0);
  269. }
  270. free(CurLzmaData);
  271. CurLzmaData = NULL;
  272. }
  273. }
  274. CACHE_CleanAll(CACHE);
  275. Flash_Program(prvBL.FWStartAddress + FinishLen, DBuffer_GetCache(&DBuf, 1), DBuffer_GetDataLen(&DBuf, 1));
  276. }
  277. FinishLen += DBuffer_GetDataLen(&DBuf, 1);
  278. DataToTick = GetSysTick() + FW_UPGRADE_DATA_TIME * CORE_TICK_1MS;
  279. AllToTick = GetSysTick() + FW_UPGRADE_ALL_TIME * CORE_TICK_1MS;
  280. PROGRAM_CHECK:
  281. if (FinishLen >= prvBL.FWTotalLen)
  282. {
  283. CACHE_CleanAll(CACHE);
  284. CRC32 = CRC32_Cal(CRC32_Table, prvBL.FWStartAddress, prvBL.FWTotalLen, CRC32_START);
  285. if (CRC32 != prvBL.FWCRC32)
  286. {
  287. DBG_Response(DBG_DEVICE_FW_UPGRADE_RESULT, ERROR_PROTOCL, &CRC32, 4);
  288. }
  289. else
  290. {
  291. DBG_Response(DBG_DEVICE_FW_UPGRADE_RESULT, ERROR_NONE, &CRC32, 4);
  292. }
  293. AllToTick = GetSysTick() + FW_UPGRADE_START_TIME * CORE_TICK_1MS;
  294. prvBL.State = FW_UPGRADE_STATE_IDLE;
  295. DataToTick = GetSysTick() + FW_UPGRADE_DATA_TIME * CORE_TICK_1MS;
  296. }
  297. break;
  298. default:
  299. break;
  300. }
  301. if (AllToTick <= GetSysTick())
  302. {
  303. prvBL.ForceOut = 1;
  304. DBG_Response(DBG_DEVICE_FW_UPGRADE_RESULT, ERROR_TIMEOUT, &ConnectCnt, 1);
  305. }
  306. }
  307. if (ConnectOK)
  308. {
  309. BL_OTAErase(__FLASH_OTA_INFO_ADDR__, __FLASH_SECTOR_SIZE__);
  310. }
  311. DBuffer_DeInit(&DBuf);
  312. }
  313. static int32_t BL_OTAReadDataInFlash(void *pData, void *pParam)
  314. {
  315. Buffer_Struct *pBuffer = (Buffer_Struct *)pParam;
  316. memcpy(pBuffer->Data, pData, pBuffer->Pos);
  317. return 0;
  318. }
  319. static int32_t BL_OTAReadDataInSpiFlash(void *pData, void *pParam)
  320. {
  321. uint32_t StartAddress = (uint32_t)pData;
  322. Buffer_Struct *pBuffer = (Buffer_Struct *)pParam;
  323. while(!SPIFlash_WaitOpDone(&prvSPIFlash))
  324. {
  325. ;
  326. }
  327. SPIFlash_Read(&prvSPIFlash, StartAddress, pBuffer->Data, pBuffer->Pos, 1);
  328. while(!SPIFlash_WaitOpDone(&prvSPIFlash))
  329. {
  330. ;
  331. }
  332. return 0;
  333. }
  334. static int32_t BL_OTAReadDataInFS(void *pData, void *pParam)
  335. {
  336. Buffer_Struct *pBuffer = (Buffer_Struct *)pParam;
  337. }
  338. static void BL_SpiInit(uint8_t SpiID, uint8_t *Pin)
  339. {
  340. switch(SpiID)
  341. {
  342. case HSPI_ID0:
  343. GPIO_Iomux(GPIOC_12,3);
  344. GPIO_Iomux(GPIOC_13,3);
  345. GPIO_Iomux(GPIOC_15,3);
  346. SYSCTRL->CG_CTRL1 |= SYSCTRL_APBPeriph_HSPI;
  347. break;
  348. case SPI_ID0:
  349. switch(Pin[0])
  350. {
  351. case GPIOB_14:
  352. GPIO_Iomux(GPIOB_14,0);
  353. break;
  354. case GPIOC_14:
  355. GPIO_Iomux(GPIOC_14,2);
  356. break;
  357. }
  358. switch(Pin[1])
  359. {
  360. case GPIOB_15:
  361. GPIO_Iomux(GPIOB_15,0);
  362. break;
  363. case GPIOC_15:
  364. GPIO_Iomux(GPIOC_15,2);
  365. break;
  366. }
  367. switch(Pin[2])
  368. {
  369. case GPIOB_12:
  370. GPIO_Iomux(GPIOB_12,0);
  371. break;
  372. case GPIOC_12:
  373. GPIO_Iomux(GPIOC_12,2);
  374. break;
  375. }
  376. SYSCTRL->CG_CTRL1 |= SYSCTRL_APBPeriph_SPI0;
  377. break;
  378. case SPI_ID1:
  379. GPIO_Iomux(GPIOA_06,3);
  380. GPIO_Iomux(GPIOA_08,3);
  381. GPIO_Iomux(GPIOA_09,3);
  382. SYSCTRL->CG_CTRL1 |= SYSCTRL_APBPeriph_SPI1;
  383. break;
  384. case SPI_ID2:
  385. GPIO_Iomux(GPIOB_02,0);
  386. GPIO_Iomux(GPIOB_04,0);
  387. GPIO_Iomux(GPIOB_05,0);
  388. SYSCTRL->CG_CTRL1 |= SYSCTRL_APBPeriph_SPI2;
  389. break;
  390. }
  391. }
  392. void Remote_Upgrade(void)
  393. {
  394. CoreUpgrade_SectorStruct Sector;
  395. CoreUpgrade_HeadStruct Head;
  396. Buffer_Struct ReadBuffer;
  397. CBFuncEx_t pReadFunc;
  398. PV_Union uPV, uPin;
  399. uint32_t Check;
  400. uint32_t DoneLen, ReadLen;
  401. volatile uint32_t ProgramPos, FlashPos;
  402. int32_t Result;
  403. uint8_t Reboot = 0;
  404. uint32_t LzmaDataLen;
  405. uint8_t LzmaHead[LZMA_PROPS_SIZE + 8];
  406. uint8_t LzmaHeadLen;
  407. OS_InitBuffer(&ReadBuffer, FW_OTA_FLASH_BUF_LEN);
  408. memcpy(&Head, __FLASH_OTA_INFO_ADDR__, sizeof(CoreUpgrade_HeadStruct));
  409. Check = CRC32_Cal(CRC32_Table, &Head.Param1, sizeof(Head) - 8, 0xffffffff);
  410. if (Head.MaigcNum != __APP_START_MAGIC__)
  411. {
  412. DBG_INFO("no ota info");
  413. return;
  414. }
  415. if (Check != Head.CRC32)
  416. {
  417. DBG_INFO("ota info error");
  418. return;
  419. }
  420. uPV.u32 = Head.Param1;
  421. switch(uPV.u8[1])
  422. {
  423. case CORE_OTA_IN_FLASH:
  424. Check = CRC32_Cal(CRC32_Table, Head.DataStartAddress, Head.DataLen, 0xffffffff);
  425. if (Check != Head.DataCRC32)
  426. {
  427. DBG_INFO("ota file CRC32: %x,%x", Check, Head.DataCRC32);
  428. goto OTA_END;
  429. }
  430. pReadFunc = BL_OTAReadDataInFlash;
  431. break;
  432. case CORE_OTA_OUT_SPI_FLASH:
  433. memset(&prvSPIFlash, 0, sizeof(prvSPIFlash));
  434. prvSPIFlash.SpiID = uPV.u8[2];
  435. uPin.u32 = Head.Param2;
  436. BL_SpiInit(prvSPIFlash.SpiID, uPin.u8);
  437. prvSPIFlash.CSPin = uPin.u8[3];
  438. GPIO_Config(prvSPIFlash.CSPin, 0, 1);
  439. SPI_MasterInit(prvSPIFlash.SpiID, 8, SPI_MODE_0, 24000000, NULL, NULL);
  440. prvSPIFlash.IsBlockMode = 1;
  441. prvSPIFlash.IsSpiDMAMode = 1;
  442. SPI_DMATxInit(prvSPIFlash.SpiID, FLASH_SPI_TX_DMA_STREAM, 0);
  443. SPI_DMARxInit(prvSPIFlash.SpiID, FLASH_SPI_RX_DMA_STREAM, 0);
  444. SPIFlash_Init(&prvSPIFlash, NULL);
  445. pReadFunc = BL_OTAReadDataInSpiFlash;
  446. DoneLen = 0;
  447. Check = 0xffffffff;
  448. while(DoneLen < Head.DataLen)
  449. {
  450. if ((Head.DataLen - DoneLen) < SPI_FLASH_BLOCK_SIZE)
  451. {
  452. SPIFlash_Read(&prvSPIFlash, Head.DataStartAddress + DoneLen, prvBL.FWDataBuffer.Data, (Head.DataLen - DoneLen), 0);
  453. Check = CRC32_Cal(CRC32_Table, prvBL.FWDataBuffer.Data, (Head.DataLen - DoneLen), Check);
  454. DoneLen = Head.DataLen;
  455. }
  456. else
  457. {
  458. SPIFlash_Read(&prvSPIFlash, Head.DataStartAddress + DoneLen, prvBL.FWDataBuffer.Data, SPI_FLASH_BLOCK_SIZE, 0);
  459. Check = CRC32_Cal(CRC32_Table, prvBL.FWDataBuffer.Data, SPI_FLASH_BLOCK_SIZE, Check);
  460. DoneLen += SPI_FLASH_BLOCK_SIZE;
  461. }
  462. }
  463. if (Check != Head.DataCRC32)
  464. {
  465. DBG_INFO("ota file CRC32: %x,%x", Check, Head.DataCRC32);
  466. goto OTA_END;
  467. }
  468. break;
  469. default:
  470. DBG_INFO("core ota storage mode %u not support", uPV.u8[1]);
  471. goto OTA_END;
  472. }
  473. DoneLen = 0;
  474. while(DoneLen < Head.DataLen)
  475. {
  476. ReadBuffer.Pos = sizeof(CoreUpgrade_SectorStruct);
  477. Result = pReadFunc(Head.DataStartAddress + DoneLen, &ReadBuffer);
  478. DoneLen += sizeof(CoreUpgrade_SectorStruct);
  479. memcpy(&Sector, ReadBuffer.Data, sizeof(CoreUpgrade_SectorStruct));
  480. if (Sector.MaigcNum != __APP_START_MAGIC__)
  481. {
  482. DBG_INFO("ota sector info error %x", Sector.MaigcNum);
  483. goto OTA_END;
  484. }
  485. ProgramPos = Sector.StartAddress;
  486. FlashPos = DoneLen + Head.DataStartAddress;
  487. DoneLen += Sector.TotalLen;
  488. // CRC32_CreateTable(CRC32_Table, CRC32_GEN);
  489. if (Sector.DataLen && (Sector.DataLen != Sector.TotalLen))
  490. {
  491. ReadLen = 0;
  492. while(ReadLen < Sector.TotalLen)
  493. {
  494. DBG_INFO("ota %x,%x,%u,%u", ProgramPos, FlashPos, ReadLen, Sector.TotalLen);
  495. Flash_EraseStart(ProgramPos, 1);
  496. ReadBuffer.Pos = 1;
  497. pReadFunc(FlashPos, &ReadBuffer);
  498. FlashPos += ReadBuffer.Pos;
  499. ReadLen += ReadBuffer.Pos;
  500. LzmaHeadLen = ReadBuffer.Data[0];
  501. if (LzmaHeadLen > sizeof(LzmaHead))
  502. {
  503. Reboot = 1;
  504. DBG_INFO("ota zip head error");
  505. goto OTA_END;
  506. }
  507. ReadBuffer.Pos = LzmaHeadLen + 4;
  508. pReadFunc(FlashPos, &ReadBuffer);
  509. FlashPos += ReadBuffer.Pos;
  510. ReadLen += ReadBuffer.Pos;
  511. memcpy(LzmaHead, ReadBuffer.Data, LzmaHeadLen);
  512. memcpy(&LzmaDataLen, ReadBuffer.Data + LzmaHeadLen, 4);
  513. ReadBuffer.Pos = LzmaDataLen;
  514. pReadFunc(FlashPos, &ReadBuffer);
  515. FlashPos += ReadBuffer.Pos;
  516. ReadLen += ReadBuffer.Pos;
  517. prvBL.FWDataBuffer.Pos = __FLASH_BLOCK_SIZE__;
  518. Result = LzmaUncompress(prvBL.FWDataBuffer.Data, &prvBL.FWDataBuffer.Pos, ReadBuffer.Data, &LzmaDataLen, LzmaHead, LzmaHeadLen);
  519. while(Flash_CheckBusy()){;}
  520. Flash_Program(ProgramPos, prvBL.FWDataBuffer.Data, prvBL.FWDataBuffer.Pos);
  521. WDT_Feed();
  522. ProgramPos += __FLASH_BLOCK_SIZE__;
  523. }
  524. CACHE_CleanAll(CACHE);
  525. Check = CRC32_Cal(CRC32_Table, Sector.StartAddress, Sector.DataLen, 0xffffffff);
  526. DBG_INFO("%08x,%08x", Check, Sector.DataCRC32);
  527. if (Sector.DataCRC32 != Check)
  528. {
  529. // Reboot = 1;
  530. DBG_INFO("ota final check crc32 fail %x %x", Check, Sector.DataCRC32);
  531. goto OTA_END;
  532. }
  533. }
  534. else
  535. {
  536. DBG_INFO("fota file must zip file!!!");
  537. goto OTA_END;
  538. }
  539. }
  540. OTA_END:
  541. if (Reboot)
  542. {
  543. NVIC_SystemReset();
  544. while(1){;}
  545. }
  546. else
  547. {
  548. BL_OTAErase(__FLASH_OTA_INFO_ADDR__, __FLASH_SECTOR_SIZE__);
  549. }
  550. }
  551. void SystemInit(void)
  552. {
  553. SYSCTRL->LDO25_CR = (1 << 4);
  554. #ifdef __RUN_IN_RAM__
  555. memcpy(__SRAM_BASE_ADDR__, &__isr_start_address, 1024);
  556. SCB->VTOR = __SRAM_BASE_ADDR__;
  557. #else
  558. SCB->VTOR = (uint32_t)(&__isr_start_address);
  559. #endif
  560. //#ifdef __USE_XTL__
  561. // SYSCTRL->FREQ_SEL = 0x20000000 | SYSCTRL_FREQ_SEL_HCLK_DIV_1_2 | (1 << 13) | SYSCTRL_FREQ_SEL_CLOCK_SOURCE_EXT | SYSCTRL_FREQ_SEL_XTAL_192Mhz;
  562. //#else
  563. // SYSCTRL->FREQ_SEL = 0x20000000 | SYSCTRL_FREQ_SEL_HCLK_DIV_1_2 | (1 << 13) | SYSCTRL_FREQ_SEL_CLOCK_SOURCE_INC | SYSCTRL_FREQ_SEL_XTAL_192Mhz;
  564. //#endif
  565. SYSCTRL->FREQ_SEL = 0x20000000 | SYSCTRL_FREQ_SEL_HCLK_DIV_1_2 | (1 << 13) | SYSCTRL_FREQ_SEL_CLOCK_SOURCE_INC | SYSCTRL_FREQ_SEL_XTAL_192Mhz | SYSCTRL_FREQ_SEL_POWERMODE_CLOSE_CPU_MEM;
  566. WDT_SetTimeout(__WDT_TO_MS__);
  567. WDT_ModeConfig(WDT_Mode_Interrupt);
  568. WDT_Enable();
  569. SYSCTRL->PHER_CTRL &= ~BIT(20); //打开PA8-9-10电源
  570. // QSPI->DEVICE_PARA = (QSPI->DEVICE_PARA & 0xFFFF) | (68 << 16);
  571. #if (__FPU_PRESENT) && (__FPU_USED == 1)
  572. SCB->CPACR |= 0x00F00000;
  573. #endif
  574. SYSCTRL->CG_CTRL1 = SYSCTRL_APBPeriph_UART0|SYSCTRL_APBPeriph_GPIO|SYSCTRL_APBPeriph_TIMM0;
  575. SYSCTRL->CG_CTRL2 = SYSCTRL_AHBPeriph_DMA|SYSCTRL_AHBPeriph_USB;
  576. SYSCTRL->LOCK_R &= ~SYSCTRL_USB_RESET;
  577. SYSCTRL->SOFT_RST2 |= SYSCTRL_USB_RESET;
  578. QSPI->DEVICE_PARA = (QSPI->DEVICE_PARA & 0x0000fff0) | (16 << 16) |(0x0a);
  579. // QSPI_Init(NULL);
  580. // QSPI_SetLatency(0);
  581. }
  582. void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */
  583. {
  584. SystemCoreClock = HSE_VALUE * (((SYSCTRL->FREQ_SEL & SYSCTRL_FREQ_SEL_XTAL_Mask) >> SYSCTRL_FREQ_SEL_XTAL_Pos) + 1);
  585. }
  586. int main(void)
  587. {
  588. uint32_t AppInfo[4];
  589. uint32_t prvHeapLen;
  590. prvHeapLen = (uint32_t)(&__ram_end) - (uint32_t)(&__os_heap_start);
  591. bpool((uint32_t)(&__os_heap_start), prvHeapLen);
  592. CRC32_CreateTable(CRC32_Table, CRC32_GEN);
  593. __NVIC_SetPriorityGrouping(7 - __NVIC_PRIO_BITS);//对于freeRTOS必须这样配置
  594. SystemCoreClockUpdate();
  595. CoreTick_Init();
  596. cm_backtrace_init(NULL, NULL, NULL);
  597. Uart_GlobalInit();
  598. DMA_GlobalInit();
  599. DBG_Init(0);
  600. FileSystem_Init();
  601. OS_InitBuffer(&prvBL.FWDataBuffer, SPI_FLASH_BLOCK_SIZE);
  602. LOCAL_UPGRADE_START:
  603. Local_Upgrade();
  604. Uart_BaseInit(DBG_UART_ID, DBG_UART_BR, 0, UART_DATA_BIT8, UART_PARITY_NONE, UART_STOP_BIT1, NULL);
  605. #ifndef __RAMRUN__
  606. Remote_Upgrade();
  607. // __disable_irq();
  608. BL_LockFlash();
  609. BL_EncryptCheck();
  610. memcpy(AppInfo, __FLASH_APP_START_ADDR__, sizeof(AppInfo));
  611. if (__APP_START_MAGIC__ == AppInfo[0])
  612. {
  613. #ifdef __DEBUG__
  614. DBG_INFO("bootloader build debug %s %s %x!", __DATE__, __TIME__, QSPI->DEVICE_PARA);
  615. #else
  616. DBG_INFO("bootloader build release %s %s!", __DATE__, __TIME__, QSPI->DEVICE_PARA);
  617. #endif
  618. Jump_AppRun(AppInfo[1]);
  619. }
  620. else
  621. {
  622. goto LOCAL_UPGRADE_START;
  623. }
  624. // i = i / j; //只是测试一下backtrace功能
  625. #endif
  626. NVIC_SystemReset();
  627. }