Files
LFP_48V_mBMS_FW/mBMS_APP_V3117/APP/boot_update.c

295 lines
6.7 KiB
C

/**
******************************************************************************
* @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.
*
* <h2><center>&copy; COPYRIGHT 2015 MSO</center></h2>
******************************************************************************
*/
/** @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******/