bl_main.c 18 KB

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