381 lines
8.9 KiB
C
381 lines
8.9 KiB
C
|
/**
|
|||
|
******************************************************************************
|
|||
|
* @file
|
|||
|
* @author
|
|||
|
* @version
|
|||
|
* @date
|
|||
|
* @brief
|
|||
|
* @function List:
|
|||
|
******************************************************************************
|
|||
|
* @attention
|
|||
|
*
|
|||
|
*
|
|||
|
* <h2><center>© COPYRIGHT 2021 </center></h2>
|
|||
|
******************************************************************************
|
|||
|
* @History:
|
|||
|
* @Author:
|
|||
|
* @Data:
|
|||
|
* @Version:
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
//#include "includes.h"
|
|||
|
//#include "error.h"
|
|||
|
#include "boot_app.h"
|
|||
|
#ifdef LIN_ENABLE
|
|||
|
#include "lin_app.h"
|
|||
|
#endif
|
|||
|
#include "nvm.h"
|
|||
|
//#include "lin_commontl_api.h"
|
|||
|
//#include "lin_slave_diag.h"
|
|||
|
#include "common_cfg.h"
|
|||
|
#include "can_cfg.h"
|
|||
|
#include "ComStack_Types.h"
|
|||
|
#include "Dcm_Cfg.h"
|
|||
|
#include "CanIf_Cfg.h"
|
|||
|
|
|||
|
|
|||
|
#if 0 //最后的 app valid flag,应该在boot区成功时,要写入,記得debug時,要開啟
|
|||
|
#pragma CONST_SEG MEMORY_MAP_ROM_APP_FLAG_END
|
|||
|
const u8 AppValid[16] = {0xaa,0xaa,0x04,0xe5,0xaa,0xaa,0x04,0xe5,0xaa,0xaa,0x04,0xe5,0xaa,0xaa,0x04,0xe5}; //APP_VALID_FLAG_ADDR
|
|||
|
#pragma CONST_SEG DEFAULT
|
|||
|
#else
|
|||
|
MEMORY_MAP_FLAG_NO_OPTIME const u8 AppValid[16] = {0xaa,0xaa,0x04,0xe5,0xaa,0xaa,0x04,0xe5,0xaa,0xaa,0x04,0xe5,0xaa,0xaa,0x04,0xe5};
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
//片区开头的标志
|
|||
|
MEMORY_MAP_FLAG_NO_OPTIME volatile const MEMORY_MAP_ROM_APP_VALID u8 AppValid1[16] = {0xaa,0xaa,0x04,0xe5,0xaa,0xaa,0x04,0xe5,0xaa,0xaa,0x04,0xe5,0xaa,0xaa,0x04,0xe5}; // APP_VALID_FLAG1_ADDR
|
|||
|
|
|||
|
MEMORY_MAP_FLAG_NO_OPTIME volatile const MEMORY_MAP_ROM_APP_RES u8 AppValid_in[4] = {0x12,0x34,0x56,0x78}; //注意,為了校驗地址,範圍,必須開啟,該標志。 // APP_VALID_FLAG_IN_ADDR
|
|||
|
|
|||
|
|
|||
|
u8 boot_app_check_flag_default(void);
|
|||
|
void boot_app_response_default_success(void);
|
|||
|
|
|||
|
//static void Boot_SendEcuResetRespones(void);
|
|||
|
|
|||
|
//static u8 Boot_IsValidFlag(u8 flagId);
|
|||
|
static void Boot_SetFlag(u8 flagId);
|
|||
|
|
|||
|
//static u8 Boot_MemCpy(u8 * des, const u8 *src, u32 size);
|
|||
|
|
|||
|
#ifndef RAM_OPTIMIZE_EN
|
|||
|
__IO static u32 g_read_valid;
|
|||
|
#endif
|
|||
|
|
|||
|
/* BEGIN_FUNCTION_HDR
|
|||
|
************************************************************************************************
|
|||
|
* Function Name : Boot_ReprogramCallBack
|
|||
|
*
|
|||
|
* Description : Set the reprogramming flag and reset the ECU.
|
|||
|
*
|
|||
|
* Inputs : none
|
|||
|
*
|
|||
|
* Outputs : none
|
|||
|
*
|
|||
|
* Limitations : Only for Bootloader
|
|||
|
*
|
|||
|
************************************************************************************************
|
|||
|
END_FUNCTION_HDR */
|
|||
|
void Boot_ReprogramCallBack(u8 flag_res)
|
|||
|
{
|
|||
|
/*set reprogram flag*/
|
|||
|
Boot_SetFlag(flag_res); //FLAG_REPROGRAM_ID
|
|||
|
/*reset ECU*/
|
|||
|
ResetMCUHandle();
|
|||
|
}
|
|||
|
//专门给lin用的
|
|||
|
void Boot_Reprogram_only_writeram(void)
|
|||
|
{
|
|||
|
/*set reprogram flag*/
|
|||
|
Boot_SetFlag(FLAG_REPROGRAM_ID);
|
|||
|
/*reset ECU*/
|
|||
|
//ResetMCUHandle();
|
|||
|
}
|
|||
|
/* BEGIN_FUNCTION_HDR
|
|||
|
************************************************************************************************
|
|||
|
* Function Name : Boot_ResetMCUCallBack
|
|||
|
*
|
|||
|
* Description : Reset the ECU.
|
|||
|
*
|
|||
|
* Inputs : none
|
|||
|
*
|
|||
|
* Outputs : none
|
|||
|
*
|
|||
|
* Limitations : Only for Bootloader
|
|||
|
*
|
|||
|
************************************************************************************************
|
|||
|
END_FUNCTION_HDR */
|
|||
|
void Boot_ResetMCUCallBack(void)
|
|||
|
{
|
|||
|
/*set reprogram flag*/
|
|||
|
Boot_SetFlag(FLAG_RESET_ID);
|
|||
|
/*reset ECU*/
|
|||
|
ResetMCUHandle();
|
|||
|
}
|
|||
|
|
|||
|
/* BEGIN_FUNCTION_HDR
|
|||
|
************************************************************************************************
|
|||
|
* Function Name : Boot_SetFlag
|
|||
|
*
|
|||
|
* Description : Set the reprogramming flag.
|
|||
|
*
|
|||
|
* Inputs : none
|
|||
|
*
|
|||
|
* Outputs : none
|
|||
|
*
|
|||
|
* Limitations : Only for Bootloader
|
|||
|
*
|
|||
|
************************************************************************************************
|
|||
|
END_FUNCTION_HDR */
|
|||
|
static void Boot_SetFlag(u8 flagId)
|
|||
|
{
|
|||
|
u32 addr = 0xFFFFFFFFUL;
|
|||
|
//u32 data = 0xFFFFFFFFUL;
|
|||
|
const u8 l_data[FLAG_REPROGRAM_LEN] ={FLAG_REPROGRAM_u8_DATA0,FLAG_REPROGRAM_u8_DATA1,FLAG_REPROGRAM_u8_DATA2,FLAG_REPROGRAM_u8_DATA3};
|
|||
|
const u8 l_data1[FLAG_REPROGRAM_LEN] ={FLAG_REPROGRAM_u8_DATA0+1u,FLAG_REPROGRAM_u8_DATA1+1u,FLAG_REPROGRAM_u8_DATA2+1u,FLAG_REPROGRAM_u8_DATA3+1u};
|
|||
|
u8 l_buf[FLAG_REPROGRAM_LEN];
|
|||
|
switch (flagId)
|
|||
|
{
|
|||
|
case FLAG_REPROGRAM_ID:
|
|||
|
addr = FLAG_REPROGRAM_ADDR;
|
|||
|
//data = FLAG_REPROGRAM_DATA;
|
|||
|
l_buf[0]=l_data[0];
|
|||
|
l_buf[1]=l_data[1];
|
|||
|
l_buf[2]=l_data[2];
|
|||
|
l_buf[3]=l_data[3];
|
|||
|
break;
|
|||
|
case FLAG_RESET_ID:
|
|||
|
addr = FLAG_REPROGRAM_ADDR;
|
|||
|
l_buf[0]=0;
|
|||
|
l_buf[1]=0;
|
|||
|
l_buf[2]=0;
|
|||
|
l_buf[3]=0;
|
|||
|
break;
|
|||
|
case FLAG_REPROGRAM_NORES_ID: //用于 1001跳到 1002 不用应答
|
|||
|
addr = FLAG_REPROGRAM_ADDR;
|
|||
|
l_buf[0]=l_data1[0];
|
|||
|
l_buf[1]=l_data1[1];
|
|||
|
l_buf[2]=l_data1[2];
|
|||
|
l_buf[3]=l_data1[3];
|
|||
|
break;
|
|||
|
default :
|
|||
|
/*code*/
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if (addr != 0xFFFFFFFFUL)
|
|||
|
{
|
|||
|
#if 0
|
|||
|
(void)FlagWriteHandle(addr,4,(uc8*)&l_buf);
|
|||
|
#else
|
|||
|
(void)ram_write_bytes(addr,(u8*)&l_buf[0],FLAG_REPROGRAM_LEN);
|
|||
|
#endif
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#if 0
|
|||
|
static u8 Boot_MemCpy(u8 * des, const u8 *src, u32 size) /*PRQA S 3219*/
|
|||
|
{
|
|||
|
u32 i;
|
|||
|
|
|||
|
for (i = 0; i < size; i++)
|
|||
|
{
|
|||
|
des[i] = src[i];
|
|||
|
}
|
|||
|
|
|||
|
return 0;
|
|||
|
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 初始化
|
|||
|
* @param input:
|
|||
|
* @param output:
|
|||
|
* @return none:
|
|||
|
* @calls
|
|||
|
* @calls by
|
|||
|
* @others
|
|||
|
*/
|
|||
|
void boot_app_init(void)
|
|||
|
{
|
|||
|
#ifdef LIN_ENABLE
|
|||
|
u8 i; /*PRQA S 3205*/
|
|||
|
u8 l_buf[8];
|
|||
|
u32 tempP2Star;
|
|||
|
#endif
|
|||
|
u32 l_temp;
|
|||
|
|
|||
|
#if 0
|
|||
|
boot_app_clear_flag();
|
|||
|
(void)in_flash_read_words(&g_boot_flag_info,in_flash_get_boot_log_s_addr() ,IN_FLASH_LOG_LEN_BOOT_WORKS);
|
|||
|
if(g_boot_flag_info == BOOT_APP_FLAG_IS_BOOT_SUCCESS)
|
|||
|
{
|
|||
|
boot_app_jump_to_app();
|
|||
|
}
|
|||
|
#endif
|
|||
|
#ifndef RAM_OPTIMIZE_EN
|
|||
|
g_read_valid = AppValid[0] ;
|
|||
|
#else
|
|||
|
l_temp = AppValid[0] ;
|
|||
|
#endif
|
|||
|
ram_read_bytes(FLAG_JUMP_TO_BOOT_RESPONSE_ADDR,(u8*)&l_temp,FLAG_JUMP_TO_BOOT_RESPONSE_LEN);
|
|||
|
#ifdef LIN_ENABLE
|
|||
|
switch(l_temp)
|
|||
|
{
|
|||
|
case FLAG_JUMP_TO_APP_RESPONSE_11_01: /*PRQA S 0597*/
|
|||
|
//l_buf[0] = LIN_SALVE_DIAG_NAD;
|
|||
|
l_buf[0] = 0x02;
|
|||
|
l_buf[1] = 0x51;
|
|||
|
l_buf[2] = 0x01;
|
|||
|
//l_buf[4] = 0xff;
|
|||
|
//l_buf[5] = 0xff;
|
|||
|
//l_buf[6] = 0xff;
|
|||
|
//l_buf[7] = 0xff;
|
|||
|
//ld_put_raw(&l_buf[0]);
|
|||
|
ld_send_message((u16)l_buf[0],&l_buf[1]); //TEMP_CLOSE
|
|||
|
break;
|
|||
|
case FLAG_JUMP_TO_APP_RESPONSE_11_03: /*PRQA S 0597*/
|
|||
|
//l_buf[0] = LIN_SALVE_DIAG_NAD;
|
|||
|
l_buf[0] = 0x02;
|
|||
|
l_buf[1] = 0x51;
|
|||
|
l_buf[2] = 0x03;
|
|||
|
//l_buf[4] = 0xff;
|
|||
|
//l_buf[5] = 0xff;
|
|||
|
//l_buf[6] = 0xff;
|
|||
|
//l_buf[7] = 0xff;
|
|||
|
//ld_put_raw(&l_buf[0]);
|
|||
|
ld_send_message((u16)l_buf[0],&l_buf[1]); //TEMP_CLOSE
|
|||
|
break;
|
|||
|
case FLAG_JUMP_TO_APP_RESPONSE_10_02: /*PRQA S 0597*/
|
|||
|
#if 0
|
|||
|
l_buf[0] = LIN_SALVE_DIAG_NAD;
|
|||
|
for(i=0;i<7;i++)
|
|||
|
{
|
|||
|
l_buf[i+1] = gs_ReprogrammingResponse[i];
|
|||
|
}
|
|||
|
ld_put_raw(LI0,&l_buf[0]);
|
|||
|
#endif
|
|||
|
break;
|
|||
|
case FLAG_JUMP_TO_APP_RESPONSE_10_01: /*PRQA S 0597*/
|
|||
|
//l_buf[0] = LIN_SALVE_DIAG_NAD;
|
|||
|
l_buf[0] = 0x06;
|
|||
|
l_buf[1] = 0x50;
|
|||
|
l_buf[2] = 0x01;
|
|||
|
l_buf[3] = (u8)(50>>8);
|
|||
|
l_buf[4] = (u8)(50);
|
|||
|
tempP2Star=5000/10;
|
|||
|
l_buf[5] = (u8)(tempP2Star>>8); /*PRQA S 2984*/
|
|||
|
l_buf[6] = (u8)(tempP2Star);
|
|||
|
//ld_put_raw(&l_buf[0]);
|
|||
|
ld_send_message((u16)l_buf[0],&l_buf[1]); //TEMP_CLOSE
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
#endif
|
|||
|
if(boot_app_check_flag_default()==TRUE)
|
|||
|
{
|
|||
|
//要发送信号,表示成功进入默认会话
|
|||
|
boot_app_response_default_success();
|
|||
|
//boot_app_check_flag_clear_default();
|
|||
|
}
|
|||
|
//flash_drv_ram_read();
|
|||
|
l_temp = FLAG_JUMP_TO_BOOT_RESPONSE_INIT;
|
|||
|
ram_write_bytes(FLAG_JUMP_TO_BOOT_RESPONSE_ADDR,(u8*)&l_temp,FLAG_JUMP_TO_BOOT_RESPONSE_LEN);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* @brief
|
|||
|
* @param input:
|
|||
|
* @param output:
|
|||
|
* @return none:
|
|||
|
* @calls
|
|||
|
* @calls by
|
|||
|
* @others
|
|||
|
*/
|
|||
|
void boot_app_task(void)
|
|||
|
{
|
|||
|
#ifndef RAM_OPTIMIZE_EN
|
|||
|
g_read_valid += 1u;
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 初始化
|
|||
|
* @param input:
|
|||
|
* @param output:
|
|||
|
* @return none:
|
|||
|
* @calls
|
|||
|
* @calls by
|
|||
|
* @others
|
|||
|
*/
|
|||
|
void boot_app_jump_to_app(void)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
u8 boot_app_check_flag_default(void)
|
|||
|
{
|
|||
|
u8 i=0; /*PRQA S 2981*/
|
|||
|
u8 l_buf[FLAG_JUMP_TO_BOOT_RESPONSE_LEN];
|
|||
|
const u8 l_buf_init[FLAG_JUMP_TO_BOOT_RESPONSE_LEN]={FLAG_REPROGRAM_u8_DATA0,FLAG_REPROGRAM_u8_DATA1,FLAG_REPROGRAM_u8_DATA2,FLAG_REPROGRAM_u8_DATA3};
|
|||
|
u8 l_result=TRUE;
|
|||
|
|
|||
|
(void)ram_read_bytes(FLAG_JUMP_TO_BOOT_RESPONSE_ADDR,(u8*)&l_buf[0],FLAG_JUMP_TO_BOOT_RESPONSE_LEN);
|
|||
|
|
|||
|
for(i=0u;i<FLAG_JUMP_TO_BOOT_RESPONSE_LEN;i++)
|
|||
|
{
|
|||
|
if(l_buf[i]!=l_buf_init[i])
|
|||
|
{
|
|||
|
l_result=FALSE;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return l_result;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void boot_app_response_default_success(void)
|
|||
|
{
|
|||
|
PduInfoType l_tx_pdu;
|
|||
|
u8 l_buf[8] ;//={0x06,0x50,0x01,0x00,0x32,0x01,0xf4,0xaa};
|
|||
|
u16 l_temp;
|
|||
|
|
|||
|
l_buf[0] = 0x06;
|
|||
|
l_buf[1] = 0x50;
|
|||
|
l_buf[2] = 0x01;
|
|||
|
l_buf[3] = (uint8)(gDcmDspSessionRow[0].DcmDspSessionP2ServerMax>>8);
|
|||
|
l_buf[4]=(uint8)(gDcmDspSessionRow[0].DcmDspSessionP2ServerMax);
|
|||
|
l_temp=(u16)(gDcmDspSessionRow[0].DcmDspSessionP2StarServerMax/10u);
|
|||
|
l_buf[5]=(uint8)(l_temp>>8);
|
|||
|
l_buf[6]=(uint8)(l_temp);
|
|||
|
l_buf[7]=0xaa;
|
|||
|
l_tx_pdu.SduLength =8;
|
|||
|
l_tx_pdu.SduDataPtr =l_buf;
|
|||
|
(void)CanIf_Transmit(ADPT_UDS_TX_HANDLE,&l_tx_pdu); //注意,1是pduid fot diag
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#if 0
|
|||
|
void boot_app_check_flag_clear_default(void)
|
|||
|
{
|
|||
|
const u8 l_buf[FLAG_JUMP_TO_BOOT_RESPONSE_LEN]={0};
|
|||
|
|
|||
|
(void)ram_write_bytes(FLAG_JUMP_TO_BOOT_RESPONSE_ADDR,(u8*)&l_buf[0],FLAG_JUMP_TO_BOOT_RESPONSE_LEN);
|
|||
|
|
|||
|
}
|
|||
|
#endif
|