295 lines
6.7 KiB
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>© 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******/
|