/** ****************************************************************************** * @file boot_update.c * @author MCD Application Team * @version V1.0.0 * @date 10-October-2011 * @brief This file provides all the memory related operation functions. ****************************************************************************** * @attention * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * *

© COPYRIGHT 2015 MSO

****************************************************************************** */ /** @addtogroup mBMS * @{ */ #ifdef BOOT_UPDATE /* Includes ------------------------------------------------------------------*/ #include "includes.h" #include "flash_if.h" #include "ff.h" #include "ff_shell.h" #include "malloc.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define BOOT_START_ADDRESS ADDR_FLASH_SECTOR_0 #define BOOT_END_ADDRESS ADDR_FLASH_SECTOR_3 #define BOOT_FILE_PATH "0:/BOOT.BIN" #define BOOT_MAX_SIZE 128 * 1024 /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ u32 FlashWriteAddress; u32 BootSize = 0; /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /** * @brief Unlocks Flash for write access * @param None * @retval None */ u32 BootSectorErase(u32 bsize) { CPU_SR_ALLOC(); u32 result = false; CPU_CRITICAL_ENTER(); /* init flash */ FLASH_If_Init(); /* erase user flash area */ result = FLASH_If_SectorErase(BOOT_START_ADDRESS, BOOT_END_ADDRESS); if (result == 0) { FlashWriteAddress = BOOT_START_ADDRESS; BootSize = bsize; } else { BootSize = 0; } CPU_CRITICAL_EXIT(); return result; } u32 BootSectorWriteData(u8 *ptr, uint32_t len) { u32 count, i = 0; u32 result = 0; /* write received bytes into flash */ count = len / 4; /* check if remaining bytes < 4 */ i = len % 4; if (i > 0) count++; result = FLASH_If_WriteA(&FlashWriteAddress, (uint32_t*)ptr, count); return result; } void BootSectorCompare(void) { FRESULT rc; FIL bFile; /* File objects */ u32 fsize, i, j, pDiv, pMod, wlen; u8 *bBuff; bBuff = mymalloc(1024); printf("COMPARE BOOT IMAGE... "); if (bBuff != NULL) { if (ReqUseFatfs()) { rc = f_open(&bFile, (const TCHAR *)BOOT_FILE_PATH, FA_READ); if (rc == FR_NO_FILE) { printf("FILE NOT FOUND (BOOT.BIN) \r\n"); } else if (rc == FR_OK) { fsize = bFile.obj.objsize; if (fsize <= BOOT_MAX_SIZE) { f_lseek(&bFile, 0); // From start pDiv = fsize / 1024; pMod = fsize % 1024; for (i = 0; i < pDiv; i++) { IWDG_ReloadCounter(); rc = f_read(&bFile, bBuff, 1024, &wlen); if (rc != FR_OK) { printf("File Read Error \r\n"); myfree(bBuff); f_close(&bFile); leaveFatfs(); return; } for (j = 0; j < wlen; j++) { if (bBuff[j] != *(u8 *)(BOOT_START_ADDRESS + (i * 1024) + j)) { printf("Diff : 0x%08X \r\n", BOOT_START_ADDRESS + (i * 1024) + j); myfree(bBuff); f_close(&bFile); leaveFatfs(); return; } } } if (pMod > 0) { while ((pMod % 4) > 0) pMod++; rc = f_read(&bFile, bBuff, pMod, &wlen); if (rc != FR_OK) { printf("File Read Error \r\n"); myfree(bBuff); f_close(&bFile); leaveFatfs(); return; } for (j = 0; j < wlen; j++) { if (bBuff[j] != *(u8 *)(BOOT_START_ADDRESS + (i * 1024) + j)) { printf("Diff : 0x%08X \r\n", BOOT_START_ADDRESS + (i * 1024) + j); myfree(bBuff); f_close(&bFile); leaveFatfs(); return; } } } } f_close(&bFile); } leaveFatfs(); } myfree(bBuff); printf("SUCCESS \r\n"); } else { printf("FW Update mem error \r\n"); } } void BootUpdateProcess(void) { FRESULT rc; FIL bFile; /* File objects */ u32 fsize, i, pDiv, pMod, wlen; u8 *bBuff; bBuff = mymalloc(1024); if (bBuff != NULL) { if (ReqUseFatfs()) { rc = f_open(&bFile, (const TCHAR *)BOOT_FILE_PATH, FA_READ); if (rc == FR_NO_FILE) { printf("FILE NOT FOUND (BOOT.BIN) \r\n"); } else if (rc == FR_OK) { fsize = bFile.obj.objsize; printf("BOOT FILE: %s \r\n", BOOT_FILE_PATH); printf("BOOT SIZE: %d \r\n", fsize); if (fsize <= BOOT_MAX_SIZE) { printf("BOOT SECTOR ERASE... "); if (BootSectorErase(fsize) == 0) { printf("SUCCESS \r\n"); f_lseek(&bFile, 0); // From start pDiv = fsize / 1024; pMod = fsize % 1024; printf("IMAGE WRITE \r\n"); for (i = 0; i < pDiv; i++) { IWDG_ReloadCounter(); rc = f_read(&bFile, bBuff, 1024, &wlen); if (rc != FR_OK) { printf("File Read Error \r\n"); myfree(bBuff); f_close(&bFile); leaveFatfs(); return; } if (BootSectorWriteData(bBuff, 1024) != 0) { printf("Flash Write Error \r\n"); myfree(bBuff); f_close(&bFile); leaveFatfs(); return; } printf("F"); } printf("FINISH \r\n"); if (pMod > 0) { while ((pMod % 4) > 0) pMod++; rc = f_read(&bFile, bBuff, pMod, &wlen); if (rc != FR_OK) { printf("File Read Error \r\n"); myfree(bBuff); f_close(&bFile); leaveFatfs(); return; } printf("pMod: %d, wlen: %d \r\n", pMod, wlen); if (BootSectorWriteData(bBuff, 1024) != 0) { printf("Flash Write Error \r\n"); myfree(bBuff); f_close(&bFile); leaveFatfs(); return; } } } } f_close(&bFile); } leaveFatfs(); } myfree(bBuff); BootSectorCompare(); f_unlink(BOOT_FILE_PATH); } else { printf("FW Update mem error \r\n"); } } #endif // #ifdef CONSOLE_DEBUG /*******************(C)COPYRIGHT 2015 MSO ********************END OF FILE******/