bl_main.c 18 KB

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