feat: KT mBMS 펌웨어 3종(HW1/2/3) 및 통합 빌드 환경 초기 커밋 (V4.0.0.1)
This commit is contained in:
294
mBMS_APP_V3117/APP/boot_update.c
Normal file
294
mBMS_APP_V3117/APP/boot_update.c
Normal file
@@ -0,0 +1,294 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @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******/
|
||||
Reference in New Issue
Block a user