ZDBMS/code_bootloader/Flash.c

211 lines
5.7 KiB
C
Raw Normal View History

2025-02-06 07:35:32 +00:00
/********************************************************************************
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;
}