Files
RCU_C1P_Launcher/MCU_Driver/bootload_fun.c

1150 lines
43 KiB
C
Raw Normal View History

/*
* launcher_fun.c
* Code Flash<EFBFBD>ܿռ<EFBFBD> 0x00000000 ~ 0x00070000 448KB
* Launcher<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0x00000000 ~ 0x00003FFF 16KB
* APP<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0x00004000 ~ 0x0006FFFF 432KB
* Data Flash<EFBFBD>ܿռ<EFBFBD> 0x00070000 ~ 0x00077FFF 32KB
*
* Created on: Jul 28, 2025
* Author: cc
*/
#include "includes.h"
#include <string.h>
G_SYS_FEATURE_T g_app_feature;
G_SYS_FEATURE_T g_mcu_app_feature;
UPDATE_RECORD_T g_update_recode; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
uint8_t g_jump_flag = 0; //<2F><>ת<EFBFBD><D7AA>־λ
uint32_t g_Boot_Tick = 0; //Bootʱ<74><CAB1><EFBFBD><EFBFBD> <20><>λ<EFBFBD><CEBB>ms
uint32_t g_Boot_Time= 0; //Bootʱ<74><CAB1> <20><>λ<EFBFBD><CEBB>ms
/*******************************************************************************
* Function Name : Boot_Time_Refresh
* Description : Bootʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
void Boot_Time_Refresh(void)
{
g_Boot_Tick = SysTick_1ms;
}
/*******************************************************************************
* Function Name : Boot_Timeout_Task
* Description : Boot<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
void Boot_Timeout_Task(void)
{
if(SysTick_1ms - g_Boot_Tick >= g_Boot_Time)
{
while(1); //ִ<>п<EFBFBD><D0BF>Ź<EFBFBD><C5B9><EFBFBD>λ
}
}
/*********************************************************************
* @fn Jump_APP
* @brief <EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>APP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param addr - APP<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ
* @return none
*/
void Jump_APP(uint32_t addr)
{
// __asm volatile("jr %0": :"r"(addr));
__asm("li a6, 0x0E000");
__asm("jr a6");
while(1);
}
/*******************************************************************************
* Function Name : SPI_FLASH_APP_Data_Erase
* Description : <EFBFBD>ⲿFlash APP<EFBFBD>ռ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* APP<EFBFBD>ռ<EFBFBD><EFBFBD><EFBFBD>С Size: 0x00070000 <EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD>0x00000000 ~ 0x0006FFFF
*******************************************************************************/
void SPI_FLASH_APP_Data_Erase(void)
{
for(uint8_t i = 0;i < 7;i++)
{
Flash_Erase_Block(i);
}
}
/*******************************************************************************
* Function Name : SPI_FLASH_Logic_File_Erase
* Description : <EFBFBD>ⲿFlash <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>ռ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* APP<EFBFBD>ռ<EFBFBD><EFBFBD><EFBFBD>С Size: 0x00090000 <EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD>0x00070000 ~ 0x000FFFFF
*******************************************************************************/
void SPI_FLASH_Logic_File_Erase(void)
{
for(uint8_t i = 7;i < 16;i++)
{
Flash_Erase_Block(i);
}
}
/*******************************************************************************
* Function Name : CRC16_Check
* Description : CRC16У<EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
uint16_t CRC16_Check(uint8_t * aStr, uint16_t len)
{
uint16_t xda , xdapoly ;
uint16_t i, j, xdabit ;
xda = 0xFFFF ;
xdapoly = 0xA001 ; // (X**16 + X**15 + X**2 + 1)
for (i = 0; i < len; i++)
{
xda ^= aStr[i] ;
for (j = 0; j < 8; j++)
{
xdabit = (unsigned char)(xda & 0x01) ;
xda >>= 1 ;
if ( xdabit ) xda ^= xdapoly ;
}
}
return xda;
}
/*******************************************************************************
* Function Name : Boot_Comm_FillReplyPack
* Description : BootͨѶЭ<EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
void Boot_Comm_FillReplyPack(UART_t *g_rev)
{
uint16_t data_len = g_rev->ackLen + BCOMM_FMT_PARAM;
g_rev->ackBuffer[BCOMM_FMT_TXAddr] = g_mcu_dev.dev_addr;
g_rev->ackBuffer[BCOMM_FMT_SN] = g_rev->sn;
g_rev->ackBuffer[BCOMM_FMT_TYPE] = g_mcu_dev.dev_type;
g_rev->ackBuffer[BCOMM_FMT_RXAddr] = g_rev->pc_addr;
g_rev->ackBuffer[BCOMM_FMT_CMD] = g_rev->cmd;
g_rev->ackBuffer[BCOMM_FMT_LEN_L] = data_len & 0xFF;
g_rev->ackBuffer[BCOMM_FMT_LEN_H] = (data_len >> 8) & 0xFF;
g_rev->ackBuffer[BCOMM_FMT_CKS] = 0;
g_rev->ackBuffer[BCOMM_FMT_CKS] = Data_CheckSum(g_rev->ackBuffer, data_len);
#if DBG_LOG_EN
Dbg_Print_Buff(DBG_BIT_SYS_STATUS,"ACKBuff ",g_rev->ackBuffer,data_len);
#endif
g_rev->send_data_cf(g_rev->ackBuffer,data_len);
// memset(g_rev->ackBuffer,0,USART_BUFFER_SIZE);
// g_rev->ackLen = 0x00;
}
uint8_t Launcher_Uart_Upgrade_Process(UART_t *g_rev)
{
uint8_t deal_flag = 0,group_flag = 0,reply_flag = 0;
uint16_t crcNumIndex = 0,crcResultFlag = 0;
uint32_t temp_val = 0,temp_val_2 = 0;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
__disable_irq();
memcpy(g_rev->deal_buff,g_rev->RecvBuffer,g_rev->RecvLen);
g_rev->deal_len = g_rev->RecvLen;
g_rev->RecvLen = 0;
memset(g_rev->RecvBuffer,0,USART_BUFFER_SIZE);
g_rev->Receiving = 0x00; //<2F><><EFBFBD>ս<EFBFBD><D5BD><EFBFBD>
g_rev->CommBusy &= ~(UART_COMMBUSY_RECV_Flag); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ձ<EFBFBD>־λ
__enable_irq();
DBG_SYS_Printf("Len %d \r\n",g_rev->deal_len);
Dbg_Print_Buff(DBG_BIT_SYS_STATUS,"UARTx_Buff:",g_rev->deal_buff,g_rev->deal_len);
temp_val = g_rev->deal_buff[BCOMM_FMT_LEN_H];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_LEN_L];
if(temp_val != g_rev->deal_len)
{
DBG_SYS_Printf("Len Fail \r\n");
return 0x01;
}
if(Data_CheckSum(g_rev->deal_buff,g_rev->deal_len) != 0) {
DBG_SYS_Printf("Boot_Comm_CheckSum Fail:%x ",Data_CheckSum(g_rev->deal_buff,g_rev->deal_len));
return 0x02;
}
if( (g_rev->deal_buff[BCOMM_FMT_SN] & 0x80) == 0x80){
//Ⱥ<><C8BA><EFBFBD><EFBFBD>־λ
group_flag = 0x01;
if( (g_rev->deal_buff[BCOMM_FMT_SN] & 0x0F) != g_rev->sn){
deal_flag = 0x01;
DBG_SYS_Printf("Group Data SN Disaffinity,Processing Data");
}else {
deal_flag = 0x00;
DBG_SYS_Printf("Group Data SN The Same,No Processing Data");
}
}else {
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־λ
group_flag = 0x00;
if( (g_rev->deal_buff[BCOMM_FMT_SN] & 0x0F) != g_rev->sn){
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD>̫<EFBFBD><CCAB>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
DBG_SYS_Printf("Single Data SN Disaffinity,Processing Data");
deal_flag = 0x01;
reply_flag = 0x01;
}else if( (g_rev->deal_buff[BCOMM_FMT_SN] & 0x40) == 0x40 ){
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ط<EFBFBD><D8B7><EFBFBD>־λ<D6BE><CEBB>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
deal_flag = 0x00;
reply_flag = 0x01;
DBG_SYS_Printf("Single Data SN The Same,No Processing Data");
}
}
/*<2A>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>Ҳ<EFBFBD><D2B2>ǹ㲥<C7B9><E3B2A5><EFBFBD><EFBFBD>*/
if( (g_rev->deal_buff[BCOMM_FMT_TYPE] != g_mcu_dev.dev_type) && (g_rev->deal_buff[BCOMM_FMT_TYPE] != 0xFF) ){
DBG_SYS_Printf("Boot_Comm_RecvType %d - %d ",g_mcu_dev.dev_type,g_rev->deal_buff[BCOMM_FMT_TYPE]);
return 0x03;
}
/*<2A>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><E3B2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B2A5>ַ*/
if( (g_rev->deal_buff[BCOMM_FMT_RXAddr] != g_mcu_dev.dev_addr) && (g_rev->deal_buff[BCOMM_FMT_RXAddr] != 0xFF) ){
DBG_SYS_Printf("Boot_Comm_RecvAddr %d - %d ",g_mcu_dev.dev_addr,g_rev->deal_buff[BCOMM_FMT_RXAddr]);
return 0x04;
}
Boot_Time_Refresh();
g_rev->pc_addr = g_rev->deal_buff[BCOMM_FMT_TXAddr];
g_rev->sn = g_rev->deal_buff[BCOMM_FMT_SN] & 0x0F;
g_rev->cmd = g_rev->deal_buff[BCOMM_FMT_CMD];
switch(g_rev->cmd)
{
case BCOMM_CMD_Handshake:
if( ( deal_flag == 0x01 ) && ( g_rev->deal_len >= ( BCOMM_FMT_PARAM + 4 ) ) ) {
/*<2A><><EFBFBD><EFBFBD>Boot <20><>ʱʱ<CAB1><CAB1> <20><>λ<EFBFBD><CEBB>S*/
temp_val = g_rev->deal_buff[BCOMM_FMT_PARAM + 1];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM];
if(temp_val != g_Boot_Time)
{
g_Boot_Time = temp_val;
if(g_Boot_Time < 10) g_Boot_Time = 10;
g_Boot_Time = g_Boot_Time * 1000;
}
/*<2A>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>Ч<EFBFBD><D0A7>*/
temp_val = g_rev->deal_buff[BCOMM_FMT_PARAM + 3];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM + 2];
g_rev->ackValidity = temp_val;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><>Ҫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>
if(reply_flag != 0x01) break; //<2F><><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD>
g_rev->ackBuffer[BCOMM_FMT_PARAM] = Project_Area; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>Bootload<61><64><EFBFBD><EFBFBD> 0x01<30><31>Boot;0x02<30><32>APP
g_rev->ackBuffer[BCOMM_FMT_PARAM + 1] = g_mcu_dev.dev_boot_ver; //Boot <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B1BE>
g_rev->ackBuffer[BCOMM_FMT_PARAM + 2] = g_mcu_dev.dev_app_ver; //APP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B1BE>
//MCU UID
g_rev->ackBuffer[BCOMM_FMT_PARAM + 3] = 0x06; //CH564 <20><>MAC<41><43>ַ<EFBFBD><D6B7>ΪΨһID <20><><EFBFBD><EFBFBD>6Byte
GetMACAddress(&g_rev->ackBuffer[BCOMM_FMT_PARAM + 4]);
//<2F><><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD> - 32Byte
g_rev->ackBuffer[BCOMM_FMT_PARAM + 10] = g_mcu_dev.dev_name_len;
g_rev->ackLen = 11;
for(uint8_t i=0;i<g_mcu_dev.dev_name_len;i++){
g_rev->ackBuffer[BCOMM_FMT_PARAM + i + 11] = g_mcu_dev.dev_name[i];
g_rev->ackLen++;
}
break;
case BCOMM_CMD_Jump: //<2F><>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
if(deal_flag != 0x01) break; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD>
if(g_rev->deal_buff[BCOMM_FMT_PARAM] == 0x02){
/*<2A><>ת<EFBFBD><D7AA>APP<50><50><EFBFBD><EFBFBD>*/
g_Boot_Time = 200; //<2F><>Boot<6F><74>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ת
g_Boot_Tick = SysTick_1ms;
g_rev->ackBuffer[BCOMM_FMT_PARAM] = BCOMM_CMD_ReplySUCC;
}else {
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
DBG_SYS_Printf("ERR:Jump_boot");
g_rev->ackBuffer[BCOMM_FMT_PARAM] = BCOMM_CMD_ReplyFAIL;
}
g_rev->ackLen = 1;
break;
case BCOMM_CMD_SetInfo: //<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
if(deal_flag != 0x01) break; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD>
if(g_rev->deal_len < (BCOMM_FMT_PARAM + 4) ) {
DBG_SYS_Printf("BCOMM_CMD_SetInfo Para Error ");
break;
}
DBG_SYS_Printf("BCOMM_CMD_SetInfo Proecessing ");
/*<2A><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD>ʲ<EFBFBD><CAB2><EFBFBD>*/
temp_val = g_rev->deal_buff[BCOMM_FMT_PARAM + 1];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM];
temp_val *= 100;
/*<2A><><EFBFBD><EFBFBD>Boot <20><>ʱʱ<CAB1><CAB1>*/
g_Boot_Time = g_rev->deal_buff[BCOMM_FMT_PARAM + 3];
g_Boot_Time <<= 8;
g_Boot_Time |= g_rev->deal_buff[BCOMM_FMT_PARAM + 2];
if(g_Boot_Time < 10) g_Boot_Time = 10;
g_Boot_Time = g_Boot_Time * 1000;
DBG_SYS_Printf("BaudSet: %d",temp_val);
DBG_SYS_Printf("bootTimeout: %d",g_Boot_Time);
g_rev->ChangeBaudFlag = 0x01;
g_rev->CommBaud = temp_val;
g_rev->ackBuffer[BCOMM_FMT_PARAM] = BCOMM_CMD_ReplySUCC;
g_rev->ackLen = 1;
break;
case BCOMM_CMD_WriteFlash: //дFlash
if(deal_flag != 0x01) break; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD>
if( g_rev->deal_len < (BCOMM_FMT_PARAM + 6) ) {
DBG_SYS_Printf("BCOMM_CMD_WriteFlash Para Error ");
break;
}
DBG_SYS_Printf("BCOMM_CMD_WriteFlash Proecessing ");
/*д<><D0B4>Flash<73><68>ַ */
temp_val = g_rev->deal_buff[BCOMM_FMT_PARAM + 3];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM + 2];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM + 1];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM];
/*д<><D0B4>Flash<73><68><EFBFBD><EFBFBD> */
temp_val_2 = g_rev->deal_buff[BCOMM_FMT_PARAM + 5];
temp_val_2 <<= 8;
temp_val_2 |= g_rev->deal_buff[BCOMM_FMT_PARAM + 4];
DBG_SYS_Printf("WAddr: 0x%x Len:%d",temp_val,temp_val_2);
if (temp_val_2 == ( g_rev->deal_len - BCOMM_FMT_PARAM - 6 )){
/*Flash <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4>*/
//g_rev->ackBuffer[BCOMM_FMT_PARAM] = MCU_APP_Flash_Write(&g_rev->deal_buff[BCOMM_FMT_PARAM + 6],temp_val_2,temp_val);
Flash_Write_NoCheck(&g_rev->deal_buff[BCOMM_FMT_PARAM + 6],temp_val_2,temp_val);
Flash_Read(g_read_buff, temp_val_2,temp_val);
Dbg_Print_Buff(DBG_BIT_SYS_STATUS,"App CRC BUFF:",g_read_buff,temp_val_2);
g_rev->ackBuffer[BCOMM_FMT_PARAM] = BCOMM_CMD_ReplySUCC;
}else {
/*д<><D0B4>Flash <20><><EFBFBD>ڵ<EFBFBD>ַ<EFBFBD><D6B7>Χ<EFBFBD><CEA7> */
g_rev->ackBuffer[BCOMM_FMT_PARAM] = BCOMM_CMD_ReplyFAIL;
}
g_rev->ackLen = 1;
break;
case BCOMM_CMD_ReadFlash: //<2F><>ȡFlash
if(deal_flag != 0x01) break; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD>
if( g_rev->deal_len < (BCOMM_FMT_PARAM + 6) ) {
DBG_SYS_Printf("BCOMM_CMD_ReadFlash Para Error ");
break;
}
DBG_SYS_Printf("BCOMM_CMD_ReadFlash Proecessing ");
/*<2A><>ȡFlash<73><68>ַ */
temp_val = g_rev->deal_buff[BCOMM_FMT_PARAM + 3];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM + 2];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM + 1];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM];
/*<2A><>ȡFlash<73><68><EFBFBD><EFBFBD> */
temp_val_2 = g_rev->deal_buff[BCOMM_FMT_PARAM + 5];
temp_val_2 <<= 8;
temp_val_2 |= g_rev->deal_buff[BCOMM_FMT_PARAM + 4];
if(temp_val_2 > BCOMM_ParaSize) temp_val_2 = BCOMM_ParaSize; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB3A4><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD>ACK BUFF<46><46>С
g_rev->ackBuffer[BCOMM_FMT_PARAM] = MCU_APP_Flash_Read(&g_rev->ackBuffer[BCOMM_FMT_PARAM + 1],temp_val_2,temp_val);
if(g_rev->ackBuffer[BCOMM_FMT_PARAM] == BCOMM_CMD_ReplySUCC)
{
g_rev->ackLen = temp_val_2 + 1;
}else {
g_rev->ackLen = 1;
}
break;
case BCOMM_CMD_EraseFlash: //<2F><><EFBFBD><EFBFBD>Flash
if(deal_flag != 0x01) break; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD>
if( g_rev->deal_len < (BCOMM_FMT_PARAM + 1) ) {
DBG_SYS_Printf("BCOMM_CMD_ReadFlash Para Error ");
break;
}
DBG_SYS_Printf("BCOMM_CMD_EraseFlash Proecessing ");
if(g_rev->deal_buff[BCOMM_FMT_PARAM] == 0x01){
/*<2A><><EFBFBD><EFBFBD>APP Flash ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
if( g_rev->deal_len < (BCOMM_FMT_PARAM + 7) ) {
DBG_SYS_Printf("BCOMM_CMD_EraseFlash Para Error ");
break;
}
/*<2A><><EFBFBD><EFBFBD>Flash<73><68>ַ */
temp_val = g_rev->deal_buff[BCOMM_FMT_PARAM + 4];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM + 3];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM + 2];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM + 1];
/*<2A><><EFBFBD><EFBFBD>Flash <20><><EFBFBD><EFBFBD>*/
temp_val_2 = g_rev->deal_buff[BCOMM_FMT_PARAM + 6];
temp_val_2 <<= 8;
temp_val_2 |= g_rev->deal_buff[BCOMM_FMT_PARAM + 5];
if( (MCU_APP_Flash_Start_Addr <= temp_val) && ( (temp_val + temp_val_2) < MCU_APP_Flash_End_Addr ) ){
DBG_SYS_Printf("EraseFlash Addr:%x Len:%d ",temp_val,temp_val_2);
temp_val = temp_val - (temp_val % MCU_APP_Flash_PageSize);
for(uint32_t i = temp_val;i<(temp_val + temp_val_2) ;i+=MCU_APP_Flash_PageSize){
DBG_SYS_Printf("PageErase Addr:%x ",i);
//FLASH_ROMA_ERASE(i,MCU_APP_Flash_PageSize);
//Flash_Erase_Sector(i);
}
g_rev->ackBuffer[BCOMM_FMT_PARAM] = BCOMM_CMD_ReplySUCC;
g_rev->ackLen = 1;
}else {
/*д<><D0B4>Flash <20><><EFBFBD>ڵ<EFBFBD>ַ<EFBFBD><D6B7>Χ<EFBFBD><CEA7> */
g_rev->ackBuffer[BCOMM_FMT_PARAM] = BCOMM_CMD_ReplyFAIL;
g_rev->ackLen = 1;
}
}else if(g_rev->deal_buff[BCOMM_FMT_PARAM] == 0x02){
/*<2A><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>APP Flash ͬʱҲ<CAB1><D2B2>APP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
SPI_FLASH_APP_Data_Erase();
g_rev->ackBuffer[BCOMM_FMT_PARAM] = BCOMM_CMD_ReplySUCC;
g_rev->ackLen = 1;
}else {
g_rev->ackBuffer[BCOMM_FMT_PARAM] = BCOMM_CMD_ReplyFAIL;
g_rev->ackLen = 1;
}
break;
case BCOMM_CMD_WriteEEPROM: //дEEPROM
if(deal_flag != 0x01) break; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD>
if( g_rev->deal_len < (BCOMM_FMT_PARAM + 6) ) {
DBG_SYS_Printf("BCOMM_CMD_WriteEEPROM Para Error ");
break;
}
DBG_SYS_Printf("BCOMM_CMD_WriteEEPROM Proecessing ");
/*д<><D0B4>Flash<73><68>ַ */
temp_val = g_rev->deal_buff[BCOMM_FMT_PARAM + 3];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM + 2];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM + 1];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM];
/*д<><D0B4>Flash<73><68><EFBFBD><EFBFBD> */
temp_val_2 = g_rev->deal_buff[BCOMM_FMT_PARAM + 5];
temp_val_2 <<= 8;
temp_val_2 |= g_rev->deal_buff[BCOMM_FMT_PARAM + 4];
DBG_SYS_Printf("WAddr: 0x%x Len:%d",temp_val,temp_val_2);
if (temp_val_2 == ( g_rev->deal_len - BCOMM_FMT_PARAM - 6 )){
/*Flash <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4>*/
g_rev->ackBuffer[BCOMM_FMT_PARAM] = MCU_EEPROM_Write(&g_rev->deal_buff[BCOMM_FMT_PARAM + 6],temp_val_2,temp_val);
}else {
/*д<><D0B4>Flash <20><><EFBFBD>ڵ<EFBFBD>ַ<EFBFBD><D6B7>Χ<EFBFBD><CEA7> */
g_rev->ackBuffer[BCOMM_FMT_PARAM] = BCOMM_CMD_ReplyFAIL;
}
g_rev->ackLen = 1;
break;
case BCOMM_CMD_ReadEEPROM: //дEEPROM
if(deal_flag != 0x01) break; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD>
if( g_rev->deal_len < (BCOMM_FMT_PARAM + 6) ) {
DBG_SYS_Printf("BCOMM_CMD_ReadFlash Para Error ");
break;
}
DBG_SYS_Printf("BCOMM_CMD_ReadFlash Proecessing ");
/*<2A><>ȡFlash<73><68>ַ */
temp_val = g_rev->deal_buff[BCOMM_FMT_PARAM + 3];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM + 2];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM + 1];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM];
/*<2A><>ȡFlash<73><68><EFBFBD><EFBFBD> */
temp_val_2 = g_rev->deal_buff[BCOMM_FMT_PARAM + 5];
temp_val_2 <<= 8;
temp_val_2 |= g_rev->deal_buff[BCOMM_FMT_PARAM + 4];
if(temp_val_2 > BCOMM_ParaSize) temp_val_2 = BCOMM_ParaSize; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB3A4><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD>ACK BUFF<46><46>С
g_rev->ackBuffer[BCOMM_FMT_PARAM] = MCU_APP_Flash_Read(&g_rev->ackBuffer[BCOMM_FMT_PARAM + 1],temp_val_2,temp_val);
if(g_rev->ackBuffer[BCOMM_FMT_PARAM] == BCOMM_CMD_ReplySUCC)
{
g_rev->ackLen = temp_val_2 + 1;
}else {
g_rev->ackLen = 1;
}
break;
case BCOMM_CMD_EraseEEPROM: //<2F><><EFBFBD><EFBFBD>EEPROM
if(deal_flag != 0x01) break; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD>
if( g_rev->deal_len < (BCOMM_FMT_PARAM + 1) ) {
DBG_SYS_Printf("BCOMM_CMD_EraseEEPROM Para Error ");
break;
}
DBG_SYS_Printf("BCOMM_CMD_EraseEEPROM Proecessing ");
if(g_rev->deal_buff[BCOMM_FMT_PARAM] == 0x01){
/*<2A><><EFBFBD><EFBFBD>APP Flash ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
if( g_rev->deal_len < (BCOMM_FMT_PARAM + 7) ) {
DBG_SYS_Printf("BCOMM_CMD_EraseEEPROM Para Error ");
break;
}
/*<2A><><EFBFBD><EFBFBD>Flash<73><68>ַ */
temp_val = g_rev->deal_buff[BCOMM_FMT_PARAM + 4];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM + 3];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM + 2];
temp_val <<= 8;
temp_val |= g_rev->deal_buff[BCOMM_FMT_PARAM + 1];
/*<2A><><EFBFBD><EFBFBD>Flash <20><><EFBFBD><EFBFBD>*/
temp_val_2 = g_rev->deal_buff[BCOMM_FMT_PARAM + 6];
temp_val_2 <<= 8;
temp_val_2 |= g_rev->deal_buff[BCOMM_FMT_PARAM + 5];
if( (MCU_APP_Flash_Start_Addr <= temp_val) && ( (temp_val + temp_val_2) < MCU_APP_Flash_End_Addr ) ){
DBG_SYS_Printf("EraseFlash Addr:%x Len:%d ",temp_val,temp_val_2);
temp_val = temp_val - (temp_val % MCU_APP_Flash_PageSize);
for(uint32_t i = temp_val;i<(temp_val + temp_val_2) ;i+=MCU_APP_Flash_PageSize){
DBG_SYS_Printf("PageErase Addr:%x ",i);
FLASH_ROMA_ERASE(i,MCU_APP_Flash_PageSize);
}
g_rev->ackBuffer[BCOMM_FMT_PARAM] = BCOMM_CMD_ReplySUCC;
g_rev->ackLen = 1;
}else {
/*д<><D0B4>Flash <20><><EFBFBD>ڵ<EFBFBD>ַ<EFBFBD><D6B7>Χ<EFBFBD><CEA7> */
g_rev->ackBuffer[BCOMM_FMT_PARAM] = BCOMM_CMD_ReplyFAIL;
g_rev->ackLen = 1;
}
}else if(g_rev->deal_buff[BCOMM_FMT_PARAM] == 0x02){
/*<2A><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>EEPROM*/
MCU_EEPROM_ALLErase();
g_rev->ackBuffer[BCOMM_FMT_PARAM] = BCOMM_CMD_ReplySUCC;
g_rev->ackLen = 1;
}else {
g_rev->ackBuffer[BCOMM_FMT_PARAM] = BCOMM_CMD_ReplyFAIL;
g_rev->ackLen = 1;
}
break;
case BCOMM_CMD_CheckData: //У<><D0A3>
if(deal_flag != 0x01) break; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD>
if( g_rev->deal_len < (BCOMM_FMT_PARAM + 10) ) {
DBG_SYS_Printf("BCOMM_CMD_CheckData Para Error ");
break;
}
DBG_SYS_Printf("BCOMM_CMD_CheckData Proecessing ");
memset(&g_app_feature,0,sizeof(G_SYS_FEATURE_T));
/* У<><D0A3>CRC <20><>ʼ<EFBFBD><CABC>ַ*/
g_app_feature.app_start_addr = g_rev->deal_buff[BCOMM_FMT_PARAM + 3];
g_app_feature.app_start_addr <<= 8;
g_app_feature.app_start_addr |= g_rev->deal_buff[BCOMM_FMT_PARAM + 2];
g_app_feature.app_start_addr <<= 8;
g_app_feature.app_start_addr |= g_rev->deal_buff[BCOMM_FMT_PARAM + 1];
g_app_feature.app_start_addr <<= 8;
g_app_feature.app_start_addr |= g_rev->deal_buff[BCOMM_FMT_PARAM];
/* У<><D0A3>CRC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ*/
g_app_feature.app_end_addr = g_rev->deal_buff[BCOMM_FMT_PARAM + 7];
g_app_feature.app_end_addr <<= 8;
g_app_feature.app_end_addr |= g_rev->deal_buff[BCOMM_FMT_PARAM + 6];
g_app_feature.app_end_addr <<= 8;
g_app_feature.app_end_addr |= g_rev->deal_buff[BCOMM_FMT_PARAM + 5];
g_app_feature.app_end_addr <<= 8;
g_app_feature.app_end_addr |= g_rev->deal_buff[BCOMM_FMT_PARAM + 4];
/* У<><D0A3>CRC <20><>С*/
g_app_feature.app_crc_size = g_rev->deal_buff[BCOMM_FMT_PARAM + 9];
g_app_feature.app_crc_size <<= 8;
g_app_feature.app_crc_size |= g_rev->deal_buff[BCOMM_FMT_PARAM + 8];
DBG_SYS_Printf("App Start_addr :%x ",g_app_feature.app_start_addr);
DBG_SYS_Printf("App End_addr :%x ",g_app_feature.app_end_addr);
DBG_SYS_Printf("App CRC Block_Size :%d ",g_app_feature.app_crc_size);
if( (g_app_feature.app_start_addr >= MCU_APP_Flash_Start_Addr)
&& (g_app_feature.app_end_addr < MCU_APP_Flash_End_Addr)
&& (g_app_feature.app_end_addr > g_app_feature.app_start_addr)
&& (g_app_feature.app_crc_size == MCU_APP_Flash_PageSize) )
{
temp_val = g_app_feature.app_end_addr - g_app_feature.app_start_addr;
DBG_SYS_Printf("App Len :%d ",temp_val);
if( (temp_val % g_app_feature.app_crc_size ) != 0x00 ){
g_app_feature.app_crc_len = ((temp_val / g_app_feature.app_crc_size) + 1) * 2;
}else {
g_app_feature.app_crc_len = (temp_val / g_app_feature.app_crc_size) * 2;
}
DBG_SYS_Printf("App CRC BLock:%d ",g_app_feature.app_crc_len);
/*<2A>ȶ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD> <20>Բ<EFBFBD><D4B2><EFBFBD> */
if( (BCOMM_FMT_PARAM + 10 + g_app_feature.app_crc_len ) == g_rev->deal_len ){
uint32_t crc_data_len = 0;
crcNumIndex = 0;
memcpy(g_app_feature.app_crc,&g_rev->deal_buff[BCOMM_FMT_PARAM + 10],(g_rev->deal_len - 10 - BCOMM_FMT_PARAM) );
for(uint32_t crc_addr = g_app_feature.app_start_addr; crc_addr < g_app_feature.app_end_addr;crc_addr += g_app_feature.app_crc_size)
{
if( g_app_feature.app_end_addr - crc_addr >= g_app_feature.app_crc_size) {
crc_data_len = g_app_feature.app_crc_size;
}else {
crc_data_len = g_app_feature.app_end_addr - crc_addr;
}
memset(g_read_buff,0,sizeof(g_read_buff));
if(crc_data_len > 2048)
{
Flash_Read(g_read_buff,2048,crc_addr);
Flash_Read(&g_read_buff[2048],(crc_data_len - 2048),crc_addr+2048);
}else {
Flash_Read(g_read_buff,crc_data_len,crc_addr);
}
temp_val = CRC16_Check(g_read_buff,crc_data_len);
temp_val_2 = g_app_feature.app_crc[crcNumIndex + 1];
temp_val_2 <<= 8;
temp_val_2 |= g_app_feature.app_crc[crcNumIndex];
//DBG_SYS_Printf("App CRC ADDR:%x %x-%x",crc_addr,temp_val,temp_val_2);
//Dbg_Print_Buff(DBG_BIT_SYS_STATUS,"App CRC BUFF:",g_read_buff,crc_data_len);
if(temp_val != temp_val_2){
/*У<><D0A3>ʧ<EFBFBD><CAA7> - */
g_rev->ackBuffer[BCOMM_FMT_PARAM ] = BCOMM_CMD_ReplyFAIL;
g_rev->ackBuffer[BCOMM_FMT_PARAM + 5 + crcResultFlag*4] = ((crc_addr >> 24) & 0xFF);
g_rev->ackBuffer[BCOMM_FMT_PARAM + 4 + crcResultFlag*4] = ((crc_addr >> 16) & 0xFF);
g_rev->ackBuffer[BCOMM_FMT_PARAM + 3 + crcResultFlag*4] = ((crc_addr >> 8) & 0xFF);
g_rev->ackBuffer[BCOMM_FMT_PARAM + 2 + crcResultFlag*4] = (crc_addr & 0xFF);
DBG_SYS_Printf("App CRC Fail ADDR:%X %X-%X",crc_addr,temp_val,temp_val_2);
crcResultFlag++;
if(crcResultFlag >= 20) break;
}
crcNumIndex += 2;
}
if(crcResultFlag == 0x00){
/*У<><D0A3><EFBFBD>ɹ<EFBFBD> - д<><D0B4>APP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
g_app_feature.app_flag = App_Procedure_Ready;
g_app_feature.crc_check = 0x00;
Write_APP_Feature_Info(0x02,&g_app_feature);
g_rev->ackBuffer[BCOMM_FMT_PARAM] = BCOMM_CMD_ReplySUCC;
}
g_rev->ackBuffer[BCOMM_FMT_PARAM + 1] = crcResultFlag;
g_rev->ackLen = 2 + crcResultFlag*4;
}else {
/*<2A><><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
DBG_SYS_Printf("App CRC BLock ERROR:%d %d",temp_val,g_rev->deal_len);
g_rev->ackBuffer[BCOMM_FMT_PARAM] = 0x02;
g_rev->ackLen = 1;
}
}else{
DBG_SYS_Printf("App CRC Para ERROR");
g_rev->ackBuffer[BCOMM_FMT_PARAM] = 0x01;
g_rev->ackLen = 1;
}
break;
}
/*<2A>ظ<EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>*/
if( (group_flag == 0x00) && (reply_flag == 0x01) )
{
Boot_Comm_FillReplyPack(g_rev);
}
return 0;
}
/*******************************************************************************
* Function Name : Read_APP_Feature
* Description : <EFBFBD><EFBFBD>ȡAPP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Return :
0<EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
1<EFBFBD><EFBFBD>Flash<EFBFBD><EFBFBD>APP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2<EFBFBD><EFBFBD>MCU APP<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
uint8_t Read_APP_Feature(void)
{
uint8_t rev = 0;
uint8_t crcResultFlag = TRUE;
uint16_t crcNumIndex = 0;
uint16_t crcVal = 0;
uint8_t crcValH = 0, crcValL = 0;
uint32_t crc_data_len = 0;
memset(&g_app_feature,0,sizeof(G_SYS_FEATURE_T));
memset(&g_mcu_app_feature,0,sizeof(G_SYS_FEATURE_T));
/*<2A><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD>ȡ<EFBFBD>ⲿFlash<73><68>APP<50><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ͬʱ<CDAC><CAB1>֤APP<50>ĺϷ<C4BA><CFB7><EFBFBD>*/
rev = Read_APP_Feature_Info(0x02,&g_app_feature);
if(rev == 0x00)
{
DBG_SYS_Printf("SPIFlash APP Feature Check Succ");
APP_Feature_Info_Printf(&g_app_feature);
/*<2A>ж<EFBFBD>APP <20><>־λ<D6BE>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>*/
if(g_app_feature.app_flag == App_Procedure_Ready)
{
/*<2A>ж<EFBFBD>APP <20><>ʼ<EFBFBD><CABC>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>Լ<EFBFBD>CRCУ<43><D0A3><EFBFBD><EFBFBD>С<EFBFBD>Ƿ<EFBFBD><C7B7>ڷ<EFBFBD>Χ<EFBFBD><CEA7>*/
if( ( g_app_feature.app_start_addr < MCU_APP_Flash_Start_Addr ) \
|| ( g_app_feature.app_end_addr > MCU_APP_Flash_End_Addr ) \
|| ( g_app_feature.app_crc_size != MCU_APP_Flash_PageSize ) )
{
DBG_SYS_Printf("SPIFlash Flash APP ADDRESS ERROR!");
LOG_Launcher_APP_Check_Record(0x03);
return 1;
}
/*<2A>ⲿflash У<><D0A3>APP<50><50><EFBFBD><EFBFBD>*/
crcNumIndex = 0;
memset(g_read_buff,0,sizeof(g_read_buff));
for(uint32_t i = g_app_feature.app_start_addr; i < g_app_feature.app_end_addr; i += g_app_feature.app_crc_size)
{
if( g_app_feature.app_end_addr - i >= g_app_feature.app_crc_size) {
crc_data_len = g_app_feature.app_crc_size;
}else {
crc_data_len = g_app_feature.app_end_addr - i;
}
memset(g_read_buff,0,sizeof(g_read_buff));
if(crc_data_len > 2048)
{
Flash_Read(g_read_buff,2048,i);
Flash_Read(&g_read_buff[2048],(crc_data_len - 2048),i+2048);
}else {
Flash_Read(g_read_buff,crc_data_len,i);
}
crcVal = CRC16_Check(g_read_buff, crc_data_len);
crcValH = crcVal >> 8;
crcValL = crcVal & 0xFF;
if((g_app_feature.app_crc[crcNumIndex + 1] != crcValH) || (g_app_feature.app_crc[ crcNumIndex] != crcValL))
{
DBG_SYS_Printf("block:%d , app_crc:%x%x , crcVal:%X\r\n",crcNumIndex,g_app_feature.app_crc[crcNumIndex],g_app_feature.app_crc[1 + crcNumIndex],crcVal);
Dbg_Print_Buff(DBG_BIT_SYS_STATUS,"Read Flash:",g_read_buff,MCU_APP_Flash_PageSize);
crcResultFlag = FALSE;
break;
}
crcNumIndex+=2;
}
if(crcResultFlag == FALSE)
{
DBG_SYS_Printf("SPI FLash APP ERROR! - <20><><EFBFBD><EFBFBD>APP<50><50><EFBFBD><EFBFBD>\r\n");
//<2F><><EFBFBD><EFBFBD>Flash APP<50><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Flash_Erase_Pageaddr(SPIFLASH_APP_FEATURE_Addr);
LOG_Launcher_APP_Check_Record(0x04);
return 1; //У<><D0A3>ʧ<EFBFBD><CAA7>
}
}else{
LOG_Launcher_APP_Check_Record(0x05);
return 1; //ûAPP<50><50><EFBFBD><EFBFBD>
}
}else {
DBG_SYS_Printf("SPIFlash APP Feature Check Fail \r\n");
LOG_Launcher_APP_Check_Record(0x06);
return 1;
}
/*<2A>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD>ȡMCU Flash<73><68>APP<50><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ͬʱ<CDAC><CAB1>֤APP<50>ĺϷ<C4BA><CFB7><EFBFBD>*/
rev = Read_APP_Feature_Info(0x01,&g_mcu_app_feature);
if(rev == 0x00)
{
DBG_SYS_Printf("MCU Flash APP Feature Check Succ");
APP_Feature_Info_Printf(&g_mcu_app_feature);
/*<2A>ж<EFBFBD>APP <20><>־λ<D6BE>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>*/
if(g_mcu_app_feature.app_flag == App_Procedure_Ready)
{
/*<2A>ж<EFBFBD>APP <20><>ʼ<EFBFBD><CABC>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>Լ<EFBFBD>CRCУ<43><D0A3><EFBFBD><EFBFBD>С<EFBFBD>Ƿ<EFBFBD><C7B7>ڷ<EFBFBD>Χ<EFBFBD><CEA7>*/
if( ( g_mcu_app_feature.app_start_addr < MCU_APP_Flash_Start_Addr ) \
|| ( g_mcu_app_feature.app_end_addr > MCU_APP_Flash_End_Addr ) \
|| ( g_mcu_app_feature.app_crc_size != MCU_APP_Flash_PageSize ) )
{
DBG_SYS_Printf("MCU Flash APP ADDRESS ERROR!");
LOG_Launcher_APP_Check_Record(0x03);
return 1;
}
/*<2A>ⲿflash У<><D0A3>APP<50><50><EFBFBD><EFBFBD>*/
crcNumIndex = 0;
memset(g_read_buff,0,sizeof(g_read_buff));
for(uint32_t i = g_mcu_app_feature.app_start_addr; i < g_mcu_app_feature.app_end_addr; i += g_mcu_app_feature.app_crc_size)
{
if( g_app_feature.app_end_addr - i >= g_app_feature.app_crc_size) {
crc_data_len = g_app_feature.app_crc_size;
}else {
crc_data_len = g_app_feature.app_end_addr - i;
}
memset(g_read_buff,0,sizeof(g_read_buff));
MCU_APP_Flash_Read(g_read_buff ,crc_data_len,i);
crcVal = CRC16_Check(g_read_buff, crc_data_len);
crcValH = crcVal >> 8;
crcValL = crcVal & 0xFF;
if((g_mcu_app_feature.app_crc[crcNumIndex + 1] != crcValH) || (g_mcu_app_feature.app_crc[crcNumIndex] != crcValL))
{
DBG_SYS_Printf("block:%d , app_crc:%x%x , crcVal:%X\r\n",crcNumIndex,g_mcu_app_feature.app_crc[crcNumIndex],g_mcu_app_feature.app_crc[1 + crcNumIndex],crcVal);
Dbg_Print_Buff(DBG_BIT_SYS_STATUS,"Read Flash:",g_read_buff,MCU_APP_Flash_PageSize);
crcResultFlag = FALSE;
break;
}
crcNumIndex+=2;
}
if(crcResultFlag == FALSE)
{
DBG_SYS_Printf("APP ERROR! \r\n");
LOG_Launcher_APP_Check_Record(0x07);
return 2; //У<><D0A3>ʧ<EFBFBD><CAA7>
}
}else{
LOG_Launcher_APP_Check_Record(0x08);
return 2;
}
}else {
DBG_SYS_Printf("MCU Feature ERROR! \r\n");
LOG_Launcher_APP_Check_Record(0x09);
return 2;
}
/*<2A>ж<EFBFBD>MCU Flash<73>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ⲿSPI Flash<73>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>һ<EFBFBD><D2BB>*/
if(g_app_feature.app_crc_len != g_mcu_app_feature.app_crc_len) {
DBG_SYS_Printf("app_crc_len different!\r\n");
LOG_Launcher_APP_Check_Record(0x02);
return 2;
}
if(g_app_feature.app_start_addr != g_mcu_app_feature.app_start_addr) {
DBG_SYS_Printf("app_start_addr different!\r\n");
LOG_Launcher_APP_Check_Record(0x02);
return 2;
}
if(g_app_feature.app_end_addr != g_mcu_app_feature.app_end_addr) {
DBG_SYS_Printf("app_end_addr different!\r\n");
LOG_Launcher_APP_Check_Record(0x02);
return 2;
}
for(uint16_t j = 0;j<g_app_feature.app_crc_len;j++)
{
if(g_mcu_app_feature.app_crc[j] != g_app_feature.app_crc[j])
{
LOG_Launcher_APP_Check_Record(0x02);
return 2;
}
}
/*û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ׼<><D7BC> <20><>תAPP*/
LOG_Launcher_APP_Check_Record(0x00);
return 0x00;
}
/*******************************************************************************
* Function Name : MCU_APP_Write
* Description : MCU Flash APP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>
* Input :
*******************************************************************************/
uint8_t MCU_APP_Write(void)
{
uint8_t rev = 0;
uint8_t crcValH = 0, crcValL = 0;
uint16_t crcVal = 0,crcNumIndex = 0;
uint32_t crc_data_len = 0;
DBG_SYS_Printf("MCU Flash <20><><EFBFBD><EFBFBD>APP<50><50><EFBFBD><EFBFBD>");
rev = MCU_APP_Flash_ALLErase(); //<2F>Ȳ<EFBFBD><C8B2><EFBFBD> ȫ<><C8AB>APP<50><50><EFBFBD><EFBFBD>
if(rev != 0) {
DBG_SYS_Printf("MCU Flash <20><><EFBFBD><EFBFBD>APP<50><50><EFBFBD><EFBFBD> ʧ<><CAA7>");
return 0x01;
}
if( ( g_app_feature.app_start_addr < MCU_APP_Flash_Start_Addr ) || ( g_app_feature.app_start_addr > MCU_APP_Data_End_Addr ) ){
DBG_SYS_Printf("MCU Flash app_start_addr:0x%x Error",g_app_feature.app_start_addr);
return 0x01;
}
if( ( g_app_feature.app_end_addr > MCU_APP_Data_End_Addr ) || ( g_app_feature.app_start_addr > g_app_feature.app_end_addr ) ){
DBG_SYS_Printf("MCU Flash app_end_addr:0x%x - 0x%x Error",g_app_feature.app_start_addr,g_app_feature.app_end_addr);
return 0x01;
}
if( g_app_feature.app_crc_size != MCU_APP_Flash_PageSize ){
DBG_SYS_Printf("MCU Flash app_crc_size:%x Error",g_app_feature.app_crc_size);
return 0x01;
}
/*1<><31>д<EFBFBD><D0B4>APP Flash<73><68><EFBFBD><EFBFBD> - <20><><EFBFBD>տ<EFBFBD><D5BF><EFBFBD>Сд<D0A1><D0B4>APP Flash<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
for(uint32_t i = g_app_feature.app_start_addr;i < g_app_feature.app_end_addr;i += MCU_APP_Flash_PageSize )
{
if( g_app_feature.app_end_addr - i >= g_app_feature.app_crc_size) {
crc_data_len = g_app_feature.app_crc_size;
}else {
crc_data_len = g_app_feature.app_end_addr - i;
}
memset(g_read_buff,0,sizeof(g_read_buff));
if(crc_data_len > 2048)
{
Flash_Read(g_read_buff,2048,i);
Flash_Read(&g_read_buff[2048],(crc_data_len - 2048),i+2048);
}else {
Flash_Read(g_read_buff,crc_data_len,i);
}
DBG_SYS_Printf("MCU Write APP Addr:%x",i);
rev = MCU_APP_Flash_Write(g_read_buff,crc_data_len,i);
if(rev != 0x00){
DBG_SYS_Printf("MCU Flash Write:%x Error",i);
return 0x01;
}
}
/*2<><32>д<EFBFBD><D0B4>APP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
g_mcu_app_feature.app_flag = g_app_feature.app_flag;
g_mcu_app_feature.app_start_addr = g_app_feature.app_start_addr;
g_mcu_app_feature.app_end_addr = g_app_feature.app_end_addr;
g_mcu_app_feature.app_crc_size = g_app_feature.app_crc_size;
g_mcu_app_feature.app_crc_len = g_app_feature.app_crc_len;
g_mcu_app_feature.crc_check = g_app_feature.crc_check;
memcpy(g_mcu_app_feature.app_crc,g_app_feature.app_crc,APP_Feature_CRC_Size);
rev = Write_APP_Feature_Info(0x01,&g_mcu_app_feature);
if(rev != 0x00){
DBG_SYS_Printf("MCU Write APP Feature_Info Error");
return 0x01;
}
/*3<><33><EFBFBD><EFBFBD>ȡAPP<50><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>Ҷ<EFBFBD>APP Flash<73><68><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>CRCУ<43><D0A3>*/
rev = Read_APP_Feature_Info(0x01,&g_mcu_app_feature);
if(rev != 0x00){
DBG_SYS_Printf("MCU Read APP Feature_Info Error");
return 0x01;
}
for(uint32_t i = g_mcu_app_feature.app_start_addr; i < g_mcu_app_feature.app_end_addr; i += MCU_APP_Flash_PageSize)
{
if( g_app_feature.app_end_addr - i >= g_app_feature.app_crc_size) {
crc_data_len = g_app_feature.app_crc_size;
}else {
crc_data_len = g_app_feature.app_end_addr - i;
}
memset(g_read_buff,0,sizeof(g_read_buff));
rev = MCU_APP_Flash_Read(g_read_buff,crc_data_len,i);
Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "MCU Flash:", g_read_buff, crc_data_len);
crcVal = CRC16_Check(g_read_buff, crc_data_len);
crcValH = crcVal >> 8;
crcValL = crcVal & 0xFF;
DBG_SYS_Printf("MCU Write APP Addr:%x - CRC:%x",i,crcVal);
if( ( g_mcu_app_feature.app_crc[crcNumIndex + 1] != crcValH ) || ( g_mcu_app_feature.app_crc[crcNumIndex] != crcValL ) )
{
DBG_SYS_Printf("Addr:%x app_crc:%x%x crcVal:%x ",i,g_mcu_app_feature.app_crc[crcNumIndex],g_mcu_app_feature.app_crc[1 + crcNumIndex],crcVal);
Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "MCU Flash:", g_read_buff, crc_data_len);
if(crc_data_len > 2048)
{
Flash_Read(g_read_buff,2048,i);
Flash_Read(&g_read_buff[2048],(crc_data_len - 2048),i+2048);
}else {
Flash_Read(g_read_buff,crc_data_len,i);
}
Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "SPI Flash:", g_flash_buff, MCU_APP_Flash_PageSize);
for(uint32_t t_addr = 0;t_addr < crc_data_len;t_addr++ )
{
if(g_read_buff[t_addr] != g_flash_buff[t_addr])
{
DBG_SYS_Printf("Different Addr:%x %x - %x",i+t_addr,g_read_buff[t_addr],g_flash_buff[t_addr]);
}
}
return 0x01;
}
crcNumIndex += 2;
}
/*4<><34>У<EFBFBD><D0A3><EFBFBD>ɹ<EFBFBD>*/
DBG_SYS_Printf("MCU APP Update Succ!!");
LOG_Launcher_Read_App_Record(0x00);
return 0x00;
}
/*******************************************************************************
* Function Name : SPIFLASH_Read_Update_Recode
* Description : MCU Flash APP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>
* Input :
*******************************************************************************/
uint8_t SPIFLASH_Read_Update_Recode(UPDATE_RECORD_T *info)
{
uint16_t read_len = 0;
memset(g_flash_buff,0,sizeof(g_flash_buff));
Flash_Read(g_flash_buff, APP_FEATURE_SIZE, SPIFLASH_UPDATE_RECORD_Addr);
if(g_flash_buff[EEPROM_Offset_SaveFlag] == EEPROM_SVAE_FLAG)
{
read_len = g_flash_buff[EEPROM_Offset_Datalen + 1];
read_len <<= 8;
read_len |= g_flash_buff[EEPROM_Offset_Datalen];
DBG_SYS_Printf("%s read_len : %d ",__func__,read_len);
if(read_len == UPDATE_RECORD_INFO_Size)
{
if(EEPROM_CheckSum(&g_flash_buff[EEPROM_Offset_Data],read_len) == g_flash_buff[EEPROM_Offset_Check]){
memcpy((uint8_t *)info,&g_flash_buff[EEPROM_Offset_Data],read_len);
DBG_SYS_Printf("spiflash_fw_count:%d",g_mcu_dev.dev_addr);
DBG_SYS_Printf("spiflash_fw_succ:%d",g_mcu_dev.dev_type);
DBG_SYS_Printf("spiflash_fw_fail:%d",g_mcu_dev.dev_boot_ver);
DBG_SYS_Printf("EE DevAppVer:%d",g_mcu_dev.dev_app_ver);
DBG_SYS_Printf("EE DevNameLen:%d",g_mcu_dev.dev_name_len);
DBG_SYS_Printf("EE DevName:%s",g_mcu_dev.dev_name);
return 0x00; //<2F><>ȡ<EFBFBD>ɹ<EFBFBD>
}else {
DBG_SYS_Printf("%s Check Error !",__func__);
}
}else {
DBG_SYS_Printf("%s Len Error !",__func__);
}
}else{
DBG_SYS_Printf("%s Flag Error !",__func__);
}
return 0x01; //<2F><>ȡʧ<C8A1><CAA7>
}
uint8_t SPIFLASH_Write_Update_Recode(UPDATE_RECORD_T *info)
{
uint16_t save_len = UPDATE_RECORD_INFO_Size;
memset(g_flash_buff,0,sizeof(g_flash_buff));
g_flash_buff[EEPROM_Offset_SaveFlag] = EEPROM_SVAE_FLAG;
g_flash_buff[EEPROM_Offset_Datalen] = save_len & 0xFF;
g_flash_buff[EEPROM_Offset_Datalen] = (save_len >> 8) & 0xFF;
memcpy(&g_flash_buff[EEPROM_Offset_Data],(uint8_t *)info,save_len);
g_flash_buff[3] = EEPROM_CheckSum(&g_flash_buff[4],save_len);
save_len+=4;
Flash_Write(g_flash_buff, APP_FEATURE_SIZE, SPIFLASH_UPDATE_RECORD_Addr);
return 0x00;
}