ZDBMS/code_bootloader/IapIsp.c

789 lines
21 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 "IapIsp.h"
BOOL bIapIspFlg; //0<><30><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ǰִ<C7B0><D6B4>IAP<41><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ǰִ<C7B0><D6B4>ISP<53><50><EFBFBD><EFBFBD>
BOOL bHandsheakOkFlg;
BOOL bUartSndOverFlg;
U16 uiUartRcvChkSum;
U8 ucUartErrCode;
U8 ucUartBufPT;
U32 ulIapDataPtr;
U32 ulIapChksum;
U32 ulIapRecDataLen;
U8 ucIapIndexBk;
U8 ucIapRestCommand;
U8 xdata ucUartBuf[150];
U8 xdata ucIapBuf[MCU_CODE_SECTOR_SIZE];
extern void UARTInit(void);
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: UartSendAck
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>Slave<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ󣬿<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
void UartSendAck(void)
{
U8 i, DataBak;
U16 CheckSum = 0;
ucUartBuf[LENGTH] = 0x00;
ucUartBuf[COMMAND] = 0x0B;
DataBak = ucUartBuf[SOURCE]; //<2F><><EFBFBD><EFBFBD>ԴID<49><44>Ŀ<EFBFBD><C4BF>ID
ucUartBuf[SOURCE] = ucUartBuf[TARGET];
ucUartBuf[TARGET] = DataBak;
for(i=2; i<(ucUartBuf[LENGTH]+7); i++)
{
CheckSum += ucUartBuf[i];
}
ucUartBuf[7+ucUartBuf[LENGTH]] = (U8)CheckSum;
ucUartBuf[8+ucUartBuf[LENGTH]] = (U8)(CheckSum>>8);
bUartSndOverFlg = 0;
UartTxEn(ucUartBuf[ucUartBufPT]);
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IapHandShake
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IAP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ISP<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bIapIspFlg: 0--IAP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1--ISP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
void IapHandShake(void)
{
ucUartBuf[INDEXES] = 0;
if(ucUartBuf[DATA]=='I' && ucUartBuf[DATA+1]=='A' && ucUartBuf[DATA+2]=='P')
{
bIapIspFlg = IAP_MODE;
bHandsheakOkFlg = 1;
}
else if(ucUartBuf[DATA]=='I' && ucUartBuf[DATA+1]=='S' && ucUartBuf[DATA+2]=='P')
{
bIapIspFlg = ISP_MODE;
bHandsheakOkFlg = 1;
}
else
{
ucUartBuf[INDEXES] = IAPERROR_HANDSHAKE; //<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
bHandsheakOkFlg = 0;
}
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IapBeginAck
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: IAP<EFBFBD><EFBFBD>ISP<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CODE<EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>30K
*************************************************************************************************/
void IapBeginAck(void)
{
U8 i, SectorNum, McuFlashType;
U32 McuFlashAddr;
ulIapDataPtr = 0;
ulIapChksum = 0;
ulIapRecDataLen = 0;
ulIapRecDataLen = ((U32)ucUartBuf[DATA+3]<<24) //<2F><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
| ((U32)ucUartBuf[DATA+2]<<16)
| ((U32)ucUartBuf[DATA+1]<<8)
| (U32)ucUartBuf[DATA];
if(!bHandsheakOkFlg)
{
ucUartBuf[INDEXES] = IAPERROR_HANDSHAKE; //<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
}
if((ulIapRecDataLen > IAP_BK_CODE_SIZE) && (bIapIspFlg == IAP_MODE))
{
ucUartBuf[INDEXES] = IAPERROR_SIZE; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>Ȳ<EFBFBD><C8B2><EFBFBD><EFBFBD><EFBFBD>IAP<41><50>ISP<53><50><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>
}
else if((ulIapRecDataLen > ISP_CODE_SIZE) && (bIapIspFlg == ISP_MODE))
{
ucUartBuf[INDEXES] = IAPERROR_SIZE; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>Ȳ<EFBFBD><C8B2><EFBFBD><EFBFBD><EFBFBD>IAP<41><50>ISP<53><50><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>
}
else
{
ucUartBuf[INDEXES] = 0; //<2F><>Ԥ<EFBFBD><D4A4><EFBFBD>ظ<EFBFBD><D8B8>ɹ<EFBFBD>
ucIapIndexBk = 0;
//1. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ISP<53><50><EFBFBD><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>BOOT<4F><54><EFBFBD>ı<EFBFBD>־<EFBFBD><D6BE>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD>BOOT_FLG_ISP_ADD<44><44>дISP_FLG<4C><47>־0xA5
ucMcuFlashWrValid = 0x55; //<2F><><EFBFBD><EFBFBD>MCU Code<64><65><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>д
McuFlashEraseSector(BOOT_FLG_START_ADDR, MCU_TYPE_CODE);
if(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>
{
if(bIapIspFlg == ISP_MODE)
{
McuFlashWrOneByte(BOOT_FLG_ISP_ADDR, ISP_FLG, MCU_TYPE_CODE);
if(McuFlashRdOneByte(BOOT_FLG_ISP_ADDR, MCU_TYPE_CODE) != ISP_FLG)
{
ucUartBuf[INDEXES] = IAPERROR_WR; //Writeʧ<65><CAA7>
}
}
}
else
{
ucUartBuf[INDEXES] = IAPERROR_ERASE; //Eraseʧ<65><CAA7>
}
ucMcuFlashWrValid = 0;
//2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IAP<41><50><EFBFBD><EFBFBD>ISP<53><50><EFBFBD><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Sector<6F><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ISP<53><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>EEPROM<4F><4D>
if(ucUartBuf[INDEXES] == 0) //<2F><><EFBFBD><EFBFBD>ucUartBuf[INDEXES]
{
SectorNum = ulIapRecDataLen/MCU_CODE_SECTOR_SIZE;
for(i=0; i<SectorNum; i++) //<2F>Ȳ<EFBFBD><C8B2><EFBFBD>CODE<44><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Sector
{
McuFlashType = MCU_TYPE_CODE; //<2F><>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD>flash
if(bIapIspFlg == ISP_MODE)
{
McuFlashAddr = ISP_CODE_START_ADDR; //ISP<53><50>ʼ<EFBFBD><CABC>ַ
}
else
{
McuFlashAddr = IAP_BK_CODE_START_ADDR; //IAP<41><50>ʼ<EFBFBD><CABC>ַ
}
McuFlashAddr += (U16)i*512; //ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>ʼ<EFBFBD><CABC>ַ
if(bIapIspFlg == ISP_MODE) //ISPģʽ<C4A3><CABD>ֱ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>EEPROM
{
if(i>=(SectorNum-APP_PARA_SIZE/MCU_CODE_SECTOR_SIZE)) //EEPROM<4F><4D>sector<6F><72><EFBFBD><EFBFBD>
{
McuFlashType = MCU_TYPE_E2P;
McuFlashAddr = (U16)(i+APP_PARA_SIZE/MCU_CODE_SECTOR_SIZE-SectorNum)*512;
}
}
ucMcuFlashWrValid = 0x55; //<2F><><EFBFBD><EFBFBD>MCU Code<64><65><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>д
McuFlashEraseSector(McuFlashAddr, McuFlashType);
if(!McuFlashBlankCheck(McuFlashAddr, McuFlashType)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
{
ucUartBuf[INDEXES] = IAPERROR_ERASE; //Eraseʧ<65><CAA7>
}
ucMcuFlashWrValid = 0;
}
}
else
{
ucUartBuf[INDEXES] = IAPERROR_INDEX;
}
}
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IapWrSector
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: д<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>Sector<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
BOOL IapWrSector(void)
{
BOOL Result = 1;
U16 i;
U32 McuFlashAddr;
U8 McuFlashType;
for(i=0; i<MCU_CODE_SECTOR_SIZE; i++) //<2F><><EFBFBD><EFBFBD>д1<D0B4><31>sector
{
McuFlashType = MCU_TYPE_CODE;
if(bIapIspFlg == ISP_MODE) //ISP
{
McuFlashAddr = ISP_CODE_START_ADDR + ulIapDataPtr;
if(McuFlashAddr >= (ulIapRecDataLen+BOOT_CODE_SIZE-APP_PARA_SIZE))
{
McuFlashAddr = McuFlashAddr - (ulIapRecDataLen+BOOT_CODE_SIZE-APP_PARA_SIZE);
McuFlashType = MCU_TYPE_E2P; //ISP<53><50><EFBFBD><EFBFBD>EEPROM<4F><4D>
}
}
else
{
McuFlashAddr = IAP_BK_CODE_START_ADDR + ulIapDataPtr;
}
McuFlashWrOneByte(McuFlashAddr, ucIapBuf[i], McuFlashType);
if(ucIapBuf[i] != McuFlashRdOneByte(McuFlashAddr, McuFlashType))
{
Result = 0;
break;
}
ulIapDataPtr++;
}
return Result;
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IapReceiveData
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ͬʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>MCU CODE<EFBFBD><EFBFBD>
*************************************************************************************************/
void IapReceiveData(void)
{
U16 i;
U8 j;
U32 McuFlashAddr;
U8 McuFlashType;
bHandsheakOkFlg = 0;
if( ((ucUartBuf[INDEXES]<ucIapIndexBk) || (ucUartBuf[INDEXES]>(ucIapIndexBk+4))) && (ucUartBuf[INDEXES] != 0) ) //yangweilei
{
ucUartBuf[INDEXES] = IAPERROR_INDEX; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>Ƿ񳬳<C7B7><F1B3ACB3><EFBFBD>Χ
}
else
{
ucIapIndexBk = ucUartBuf[INDEXES];
ucUartBuf[INDEXES] = 0;
if(ucUartBuf[LENGTH] == 0)
{
ulIapDataPtr += 512; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵij<DDB5><C4B3><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ǰ128<32><38><EFBFBD>ֽ<EFBFBD>Ϊ0<CEAA><30>ָ<EFBFBD><D6B8><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD>д(<28><><EFBFBD><EFBFBD>150mS/1K)
}
else
{
j = ucIapIndexBk % 4; //Ŀǰ<C4BF>ݶ<EFBFBD>sector<6F><72><EFBFBD><EFBFBD>Ϊ512bytes<65><73>ÿ<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>128bytes<65><73><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>Ϊ4
for(i=0; i<ucUartBuf[LENGTH]; i++)
{
ucIapBuf[i+(U16)j*ucUartBuf[LENGTH]] = ucUartBuf[DATA+i];
}
if(j == 3) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>sector<6F><72><EFBFBD>Ž<EFBFBD><C5BD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
ucMcuFlashWrValid = 0x55; //<2F><><EFBFBD><EFBFBD>MCU Code<64><65><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>д
if(!IapWrSector()) //<2F><>һ<EFBFBD><D2BB>дsector<6F><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>дһ<D0B4><D2BB>
{
if(ulIapDataPtr >= MCU_CODE_SECTOR_SIZE)
{
ulIapDataPtr -= MCU_CODE_SECTOR_SIZE; //ָ<><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>Sector<6F><72>ʼ
}
else
{
ulIapDataPtr = 0;
}
McuFlashType = MCU_TYPE_CODE; //Ĭ<><C4AC><EFBFBD><EFBFBD>CODE<44><45>
if(bIapIspFlg == ISP_MODE) //ISP
{
McuFlashAddr = ISP_CODE_START_ADDR + ulIapDataPtr;
if(McuFlashAddr >= (ulIapRecDataLen+BOOT_CODE_SIZE-APP_PARA_SIZE))
{
McuFlashAddr = McuFlashAddr - (ulIapRecDataLen+BOOT_CODE_SIZE-APP_PARA_SIZE);
McuFlashType = MCU_TYPE_E2P; //ISP<53><50><EFBFBD><EFBFBD>EEPROM<4F><4D>
}
}
else
{
McuFlashAddr = IAP_BK_CODE_START_ADDR + ulIapDataPtr;
}
ucMcuFlashWrValid = 0x55;
McuFlashEraseSector(McuFlashAddr, McuFlashType);
if(McuFlashBlankCheck(McuFlashAddr, McuFlashType)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
{
if(!IapWrSector()) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򷵻ظ<F2B7B5BB><D8B8><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>
{
ucUartBuf[INDEXES] = IAPERROR_WR; //д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
goto UpdateChksum;
}
}
else
{
ucUartBuf[INDEXES] = IAPERROR_ERASE; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
else //512Bytesд<73><D0B4><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD>checksumֵ
{
UpdateChksum:
for(j=0; j<MCU_CODE_SECTOR_SIZE/4; j++) //<2F><><EFBFBD><EFBFBD>checksum<75><6D>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>32bit<69><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>STM32
{
ulIapChksum += (((U32)ucIapBuf[j*4+3]<<24)
| ((U32)ucIapBuf[j*4+2]<<16)
| ((U32)ucIapBuf[j*4+1]<<8)
| ((U32)ucIapBuf[j*4+0]));
}
}
ucMcuFlashWrValid = 0;
}
}
}
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IapRDataVerify
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>֤CheckSum<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>ȷ
*************************************************************************************************/
void IapRDataVerify(void)
{
U32 CheckSum = 0;
CheckSum = ((U32)ucUartBuf[DATA+3]<<24) //<2F><>ȡ<EFBFBD><C8A1>λ<EFBFBD><CEBB><EFBFBD>·<EFBFBD><C2B7><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>
| ((U32)ucUartBuf[DATA+2]<<16)
| ((U32)ucUartBuf[DATA+1]<<8)
| ((U32)ucUartBuf[DATA+0]);
if(ulIapChksum != CheckSum) //<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>ʧ<EFBFBD><CAA7>
{
ucUartBuf[INDEXES] = IAPERROR_CRC;
}
else
{
ucUartBuf[INDEXES] = 0; //<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD>ɹ<EFBFBD>
}
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IapCmdReset
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>IAP<EFBFBD><EFBFBD>ISP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Program<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD>λָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>0x0000<EFBFBD><EFBFBD>ַ
ISP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BOOT<EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ISP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IAP<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>һ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>д0x5A<EFBFBD><EFBFBD>APP<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
void IapCmdReset(void)
{
ucUartBuf[INDEXES] = 0;
ucIapRestCommand = IAP_CMD_RESET;
ucMcuFlashWrValid = 0x55; //<2F><><EFBFBD><EFBFBD>MCU Code<64><65><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>д
McuFlashEraseSector(BOOT_FLG_START_ADDR, MCU_TYPE_CODE);
if(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>
{
if(bIapIspFlg == IAP_MODE) //IAP<41><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>BOOT<4F><54><EFBFBD>ı<EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>д0x5A
{
McuFlashWrOneByte(BOOT_FLG_IAP_ADDR, IAP_FLG, MCU_TYPE_CODE);
if(McuFlashRdOneByte(BOOT_FLG_IAP_ADDR, MCU_TYPE_CODE) != IAP_FLG)
{
ucUartBuf[INDEXES] = IAPERROR_WR; //Writeʧ<65><CAA7>
ucIapRestCommand = 0;
}
}
}
else
{
ucUartBuf[INDEXES] = IAPERROR_ERASE; //<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
ucIapRestCommand = 0;
}
ucMcuFlashWrValid = 0;
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: UartCmdProcess
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>IAP<EFBFBD><EFBFBD>ISP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
void UartCmdProcess(void)
{
ucUartBufPT = 0;
if(uiUartRcvChkSum != ((ucUartBuf[ucUartBuf[LENGTH]+8]<<8) + ucUartBuf[ucUartBuf[LENGTH]+7]))
{
ucUartErrCode |= IAPERROR_CHECKSUM;
}
if(ucUartErrCode != 0) //<2F><><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4A6>
{
ucUartBuf[INDEXES] = ucUartErrCode;
}
else
{
if(ucUartBuf[COMMAND] == IAP_CMD_HANDSHAKE) //IAP<41><50>ISP<53><50><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD><E9A3AC>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
IapHandShake();
}
else if(ucUartBuf[COMMAND] == IAP_CMD_BEGIN) //<2F><>ʼIAP<41><50>ISP<53><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CODE<44><45>/EEP<45><50>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
IapBeginAck();
}
else if(ucUartBuf[COMMAND] == IAP_CMD_TRANS) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>д<EFBFBD>У<EBA1A2><D0A3>
{
IapReceiveData();
}
else if(ucUartBuf[COMMAND] == IAP_CMD_VERIFY) //
{
IapRDataVerify();
}
else if(ucUartBuf[COMMAND] == IAP_CMD_RESET)
{
IapCmdReset();
}
}
UartSendAck();
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: BootIapIsp
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: IAP<EFBFBD><EFBFBD>ISP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
void BootIapIsp(void)
{
ulIapDataPtr = 0;
ulIapChksum = 0;
ucIapRestCommand = 0;
UARTInit();
while(1)
{
#if ((UART_DEFINE >= 1)&&(UART_DEFINE<= 30))
{
if(RI)
{
//BootMcuWdtClear(); //<2F>ڸó<DAB8><C3B3><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>յ<EFBFBD>UARTͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ͨѶ<CDA8><EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>
ucUartBuf[ucUartBufPT] = SBUF;
ucUartBufPT++;
if(ucUartBufPT >= 140) //<2F><>ָ<EFBFBD><EFBFBD><EFBFBD><E1B3AC>140
{
ucUartBufPT = 0;
}
if(ucUartBufPT == 1)
{
if(ucUartBuf[HEARD1] != 0x5A) //<2F><><EFBFBD><EFBFBD>֡ͷ<D6A1>Ƿ<EFBFBD>Wie0x5AA5
{
ucUartBufPT = 0;
}
}
else if(ucUartBufPT == 2)
{
if(ucUartBuf[HEARD2] != 0xA5)
{
ucUartBufPT = 0;
}
else
{
uiUartRcvChkSum = 0; //֡ͷ<D6A1>ж<EFBFBD><D0B6><EFBFBD>ȷ
ucUartErrCode = 0;
}
}
else
{
if(ucUartBufPT < (ucUartBuf[LENGTH]+9))
{
if(ucUartBufPT <= (ucUartBuf[LENGTH]+7))
{
uiUartRcvChkSum += ucUartBuf[ucUartBufPT-1];
}
if(ucUartBufPT == (TARGET+1)) //<2F><><EFBFBD><EFBFBD>ID
{
if(ucUartBuf[TARGET] != IAP_BMSID)
{
ucUartBufPT = 0;
}
}
else if(ucUartBufPT == (COMMAND+1)) //<2F><><EFBFBD><EFBFBD>COMMAND
{
if((ucUartBuf[COMMAND] != IAP_CMD_HANDSHAKE)
&& (ucUartBuf[COMMAND] != IAP_CMD_BEGIN)
&& (ucUartBuf[COMMAND] != IAP_CMD_TRANS)
&& (ucUartBuf[COMMAND] != IAP_CMD_VERIFY)
&& (ucUartBuf[COMMAND] != IAP_CMD_RESET))
{
ucUartErrCode |= IAPERROR_CMD;
}
}
}
else
{
BootMcuWdtClear();
UartCmdProcess();
}
}
RI = 0;
}
if(TI)
{
BootMcuWdtClear(); //<2F>ڸó<DAB8><C3B3><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>յ<EFBFBD>UARTͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ͨѶ<CDA8><EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>
if(ucUartBufPT >= (ucUartBuf[LENGTH]+8))
{
UartRxEn(); //Allow UART receive data
ucUartBufPT = 0;
ucUartBuf[0] = 0;
ucUartBuf[1] = 0;
ucUartBuf[2] = 0;
bUartSndOverFlg = 1;
}
else
{
ucUartBufPT++;
UartTxEn(ucUartBuf[ucUartBufPT]);
}
TI = 0;
}
if(ucIapRestCommand == IAP_CMD_RESET)
{
BootMcuWdtClear();
if(bUartSndOverFlg) //Reset֡<74>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
{
bUartSndOverFlg = 0;
ucIapRestCommand = 0;
((void(code*)(void))0x0000)();
}
}
}
#elif ((UART_DEFINE >= 31)&&(UART_DEFINE<= 60))
{
INSCON = 0x40;
if(RI1)
{
//BootMcuWdtClear(); //<2F>ڸó<DAB8><C3B3><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>յ<EFBFBD>UARTͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ͨѶ<CDA8><EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>
ucUartBuf[ucUartBufPT] = SBUF1;
INSCON = 0x00;
ucUartBufPT++;
if(ucUartBufPT >= 140) //<2F><>ָ<EFBFBD><EFBFBD><EFBFBD><E1B3AC>140
{
ucUartBufPT = 0;
}
if(ucUartBufPT == 1)
{
if(ucUartBuf[HEARD1] != 0x5A) //<2F><><EFBFBD><EFBFBD>֡ͷ<D6A1>Ƿ<EFBFBD>Wie0x5AA5
{
ucUartBufPT = 0;
}
}
else if(ucUartBufPT == 2)
{
if(ucUartBuf[HEARD2] != 0xA5)
{
ucUartBufPT = 0;
}
else
{
uiUartRcvChkSum = 0; //֡ͷ<D6A1>ж<EFBFBD><D0B6><EFBFBD>ȷ
ucUartErrCode = 0;
}
}
else
{
if(ucUartBufPT < (ucUartBuf[LENGTH]+9))
{
if(ucUartBufPT <= (ucUartBuf[LENGTH]+7))
{
uiUartRcvChkSum += ucUartBuf[ucUartBufPT-1];
}
if(ucUartBufPT == (TARGET+1)) //<2F><><EFBFBD><EFBFBD>ID
{
if(ucUartBuf[TARGET] != IAP_BMSID)
{
ucUartBufPT = 0;
}
}
else if(ucUartBufPT == (COMMAND+1)) //<2F><><EFBFBD><EFBFBD>COMMAND
{
if((ucUartBuf[COMMAND] != IAP_CMD_HANDSHAKE)
&& (ucUartBuf[COMMAND] != IAP_CMD_BEGIN)
&& (ucUartBuf[COMMAND] != IAP_CMD_TRANS)
&& (ucUartBuf[COMMAND] != IAP_CMD_VERIFY)
&& (ucUartBuf[COMMAND] != IAP_CMD_RESET))
{
ucUartErrCode |= IAPERROR_CMD;
}
}
}
else
{
BootMcuWdtClear();
UartCmdProcess();
}
}
INSCON = 0x40;
RI1 = 0;
INSCON = 0x00;
}
INSCON = 0x40;
if(TI1)
{
INSCON = 0x00;
BootMcuWdtClear(); //<2F>ڸó<DAB8><C3B3><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>յ<EFBFBD>UARTͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ͨѶ<CDA8><EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>
if(ucUartBufPT >= (ucUartBuf[LENGTH]+8))
{
UartRxEn(); //Allow UART receive data
ucUartBufPT = 0;
ucUartBuf[0] = 0;
ucUartBuf[1] = 0;
ucUartBuf[2] = 0;
bUartSndOverFlg = 1;
}
else
{
ucUartBufPT++;
UartTxEn(ucUartBuf[ucUartBufPT]);
}
INSCON = 0x40;
TI1 = 0;
INSCON = 0x00;
}
if(ucIapRestCommand == IAP_CMD_RESET)
{
BootMcuWdtClear();
if(bUartSndOverFlg) //Reset֡<74>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
{
bUartSndOverFlg = 0;
ucIapRestCommand = 0;
((void(code*)(void))0x0000)();
}
}
}
#elif ( UART_DEFINE == 61)
{
INSCON = 0x40;
if(RI2)
{
//BootMcuWdtClear(); //<2F>ڸó<DAB8><C3B3><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>յ<EFBFBD>UARTͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ͨѶ<CDA8><EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>
ucUartBuf[ucUartBufPT] = SBUF2;
INSCON = 0x00;
ucUartBufPT++;
if(ucUartBufPT >= 140) //<2F><>ָ<EFBFBD><EFBFBD><EFBFBD><E1B3AC>140
{
ucUartBufPT = 0;
}
if(ucUartBufPT == 1)
{
if(ucUartBuf[HEARD1] != 0x5A) //<2F><><EFBFBD><EFBFBD>֡ͷ<D6A1>Ƿ<EFBFBD>Wie0x5AA5
{
ucUartBufPT = 0;
}
}
else if(ucUartBufPT == 2)
{
if(ucUartBuf[HEARD2] != 0xA5)
{
ucUartBufPT = 0;
}
else
{
uiUartRcvChkSum = 0; //֡ͷ<D6A1>ж<EFBFBD><D0B6><EFBFBD>ȷ
ucUartErrCode = 0;
}
}
else
{
if(ucUartBufPT < (ucUartBuf[LENGTH]+9))
{
if(ucUartBufPT <= (ucUartBuf[LENGTH]+7))
{
uiUartRcvChkSum += ucUartBuf[ucUartBufPT-1];
}
if(ucUartBufPT == (TARGET+1)) //<2F><><EFBFBD><EFBFBD>ID
{
if(ucUartBuf[TARGET] != IAP_BMSID)
{
ucUartBufPT = 0;
}
}
else if(ucUartBufPT == (COMMAND+1)) //<2F><><EFBFBD><EFBFBD>COMMAND
{
if((ucUartBuf[COMMAND] != IAP_CMD_HANDSHAKE)
&& (ucUartBuf[COMMAND] != IAP_CMD_BEGIN)
&& (ucUartBuf[COMMAND] != IAP_CMD_TRANS)
&& (ucUartBuf[COMMAND] != IAP_CMD_VERIFY)
&& (ucUartBuf[COMMAND] != IAP_CMD_RESET))
{
ucUartErrCode |= IAPERROR_CMD;
}
}
}
else
{
BootMcuWdtClear();
UartCmdProcess();
}
}
INSCON = 0x40;
RI2 = 0;
INSCON = 0x00;
}
INSCON = 0x40;
if(TI2)
{
INSCON = 0x00;
BootMcuWdtClear(); //<2F>ڸó<DAB8><C3B3><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>յ<EFBFBD>UARTͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ͨѶ<CDA8><EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>
if(ucUartBufPT >= (ucUartBuf[LENGTH]+8))
{
UartRxEn(); //Allow UART receive data
ucUartBufPT = 0;
ucUartBuf[0] = 0;
ucUartBuf[1] = 0;
ucUartBuf[2] = 0;
bUartSndOverFlg = 1;
}
else
{
ucUartBufPT++;
UartTxEn(ucUartBuf[ucUartBufPT]);
}
INSCON = 0x40;
TI2 = 0;
INSCON = 0x00;
}
if(ucIapRestCommand == IAP_CMD_RESET)
{
BootMcuWdtClear();
if(bUartSndOverFlg) //Reset֡<74>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
{
bUartSndOverFlg = 0;
ucIapRestCommand = 0;
((void(code*)(void))0x0000)();
}
}
}
#endif
}
}