211 lines
5.7 KiB
C
211 lines
5.7 KiB
C
|
/********************************************************************************
|
|||
|
Copyright (C), Sinowealth Electronic. Ltd.
|
|||
|
Author: Sino
|
|||
|
Version: V0.0
|
|||
|
Date: 2020/04/26
|
|||
|
History:
|
|||
|
V2.0 2020/04/26 Preliminary
|
|||
|
********************************************************************************/
|
|||
|
#include "MCURegister.h"
|
|||
|
#include "C51_TYPE.H"
|
|||
|
#include "Flash.h"
|
|||
|
#include <intrins.h>
|
|||
|
#include <ABSACC.H>
|
|||
|
|
|||
|
U8 ucMcuFlashWrValid;
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: McuFlashEraseSector
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: McuFlashAddr<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>McuType<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CODE<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EEPROM
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Sector
|
|||
|
*************************************************************************************************/
|
|||
|
void McuFlashEraseSector(U32 xdata McuFlashAddr, U8 xdata McuType)
|
|||
|
{
|
|||
|
FLASHCON = McuType;
|
|||
|
XPAGE = McuFlashAddr>>8;
|
|||
|
|
|||
|
IB_CON1 = 0xE6;
|
|||
|
if(!EA) //<2F><>ֹ<EFBFBD><D6B9>д
|
|||
|
{
|
|||
|
IB_CON2 = 0x05;
|
|||
|
if(FLASHCON == McuType) //<2F><>ֹ<EFBFBD><D6B9>д
|
|||
|
{
|
|||
|
IB_CON3 = 0x0A;
|
|||
|
if(ucMcuFlashWrValid == 0x55) //<2F><>ֹ<EFBFBD><D6B9>д
|
|||
|
{
|
|||
|
IB_CON4 = 0x09;
|
|||
|
if(XPAGE == (McuFlashAddr>>8)) //<2F><>ֹ<EFBFBD><D6B9>д
|
|||
|
{
|
|||
|
IB_CON5 = 0x06;
|
|||
|
_nop_();
|
|||
|
_nop_();
|
|||
|
_nop_();
|
|||
|
_nop_();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
FLASHCON = MCU_TYPE_CODE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: McuFlashBlankCheck
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: McuFlashAddr<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: 0<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ0<EFBFBD><EFBFBD>Eraseʧ<EFBFBD>ܣ<EFBFBD>1<EFBFBD><EFBFBD>ȫ0<EFBFBD><EFBFBD>Erase<EFBFBD>ɹ<EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>Erase<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>Sector<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ȫΪ0
|
|||
|
*************************************************************************************************/
|
|||
|
BOOL McuFlashBlankCheck(U32 xdata McuFlashAddr, U8 xdata McuType)
|
|||
|
{
|
|||
|
BOOL Result = 1;
|
|||
|
U16 i;
|
|||
|
|
|||
|
FLASHCON = McuType;
|
|||
|
for(i=0; i<MCU_CODE_SECTOR_SIZE; i++)
|
|||
|
{
|
|||
|
if(CBYTE[McuFlashAddr+i] != 0x00)
|
|||
|
{
|
|||
|
Result = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
FLASHCON = MCU_TYPE_CODE;
|
|||
|
|
|||
|
return Result;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: McuFlashWrOneByte
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: McuFlashAddr<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>WrData<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: д1<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|||
|
*************************************************************************************************/
|
|||
|
void McuFlashWrOneByte(U32 xdata McuFlashAddr, U8 xdata WrData, U8 xdata McuType)
|
|||
|
{
|
|||
|
FLASHCON = McuType;
|
|||
|
XPAGE = McuFlashAddr>>8;
|
|||
|
IB_OFFSET = McuFlashAddr % 256;
|
|||
|
|
|||
|
IB_DATA = WrData;
|
|||
|
IB_CON1 = 0x6E;
|
|||
|
if(!EA) //<2F><>ֹ<EFBFBD><D6B9>д
|
|||
|
{
|
|||
|
IB_CON2 = 0x05;
|
|||
|
if(FLASHCON == McuType) //<2F><>ֹ<EFBFBD><D6B9>д
|
|||
|
{
|
|||
|
IB_CON3 = 0x0A;
|
|||
|
if(ucMcuFlashWrValid == 0x55) //<2F><>ֹ<EFBFBD><D6B9>д
|
|||
|
{
|
|||
|
IB_CON4 = 0x09;
|
|||
|
if(XPAGE == (McuFlashAddr>>8)) //<2F><>ֹ<EFBFBD><D6B9>д
|
|||
|
{
|
|||
|
IB_CON5 = 0x06;
|
|||
|
_nop_();
|
|||
|
_nop_();
|
|||
|
_nop_();
|
|||
|
_nop_();
|
|||
|
_nop_();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
FLASHCON = MCU_TYPE_CODE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: McuFlashRdOneByte
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: McuFlashAddr<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡCODE<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ǰCode<EFBFBD>ֽ<EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|||
|
*************************************************************************************************/
|
|||
|
U8 McuFlashRdOneByte(U32 xdata McuFlashAddr, U8 xdata McuType)
|
|||
|
{
|
|||
|
U8 GetData = 0;
|
|||
|
|
|||
|
FLASHCON = McuType;
|
|||
|
GetData = CBYTE[McuFlashAddr];
|
|||
|
FLASHCON = MCU_TYPE_CODE;
|
|||
|
return GetData;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: BootProgram
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: Boot<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Erase->Program->Verify
|
|||
|
ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>Sector<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*************************************************************************************************/
|
|||
|
U8 BootProgram(void)
|
|||
|
{
|
|||
|
U8 i, McuCode, McuFlashType;
|
|||
|
U16 j;
|
|||
|
U32 McuFlashAddr;
|
|||
|
|
|||
|
for(i=0; i<IAP_BK_CODE_SIZE/MCU_CODE_SECTOR_SIZE; i++) //<2F><><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SectorΪ<72><CEAA>λ
|
|||
|
{
|
|||
|
BootMcuWdtClear();
|
|||
|
if(i < IAP_CODE_SIZE/MCU_CODE_SECTOR_SIZE) //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>CODE<44><45>29K
|
|||
|
{
|
|||
|
McuFlashType = MCU_TYPE_CODE; //IAP<41><50><EFBFBD><EFBFBD>CODE<44><45>
|
|||
|
McuFlashAddr = IAP_CODE_START_ADDR + (U16)i*MCU_CODE_SECTOR_SIZE; //<2F>ӵ<EFBFBD>5K<35><4B>ʼ
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
McuFlashType = MCU_TYPE_E2P; //IAP<41><50><EFBFBD><EFBFBD>EEPROM<4F><4D>
|
|||
|
McuFlashAddr = (U16)i*MCU_CODE_SECTOR_SIZE - IAP_CODE_SIZE;
|
|||
|
}
|
|||
|
ucMcuFlashWrValid = 0x55;
|
|||
|
McuFlashEraseSector(McuFlashAddr, McuFlashType); //<2F><><EFBFBD>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA>λ
|
|||
|
if(McuFlashBlankCheck(McuFlashAddr, McuFlashType)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
for(j=0; j<MCU_CODE_SECTOR_SIZE; j++) //<2F><><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD>APP<50><50>Ӧ<EFBFBD><D3A6>ַ
|
|||
|
{
|
|||
|
McuCode = McuFlashRdOneByte(IAP_BK_CODE_START_ADDR+j+(U16)i*MCU_CODE_SECTOR_SIZE, MCU_TYPE_CODE); //yangweilei <20>˴<EFBFBD><CBB4>̻<EFBFBD>Ϊ<EFBFBD><CEAA>flashȡ<68><C8A1><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>APP<50><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡCODE(1<>ֽ<EFBFBD>)
|
|||
|
McuFlashWrOneByte(McuFlashAddr+j, McuCode, McuFlashType); //<2F><>CODEд<45><D0B4>APPִ<50><D6B4><EFBFBD><EFBFBD>
|
|||
|
if(McuCode != McuFlashRdOneByte(McuFlashAddr+j, McuFlashType)) //У<><D0A3>д<EFBFBD><D0B4><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
|||
|
{
|
|||
|
return (BOOT_PGR_WR_ERR);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return (BOOT_PGR_ERASE_ERR);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return (BOOT_PGR_OK);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: BootUpgradeCode
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: Boot<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Erase->Program->Verify
|
|||
|
*************************************************************************************************/
|
|||
|
BOOL BootUpgradeCode(void)
|
|||
|
{
|
|||
|
BOOL Result = 1;
|
|||
|
|
|||
|
if(BootProgram() == BOOT_PGR_OK)
|
|||
|
{
|
|||
|
McuFlashEraseSector(BOOT_FLG_START_ADDR, MCU_TYPE_CODE); //д<><D0B4><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־λ
|
|||
|
Result = McuFlashBlankCheck(BOOT_FLG_START_ADDR, MCU_TYPE_CODE); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Result = 0;
|
|||
|
}
|
|||
|
|
|||
|
return Result;
|
|||
|
}
|
|||
|
|