1150 lines
43 KiB
C
1150 lines
43 KiB
C
|
|
/*
|
|||
|
|
* 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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|