/**
******************************************************************************
* @file
* @author
* @version
* @date
* @brief
* @function List:
******************************************************************************
* @attention
*
*
*
© COPYRIGHT 2021
******************************************************************************
* @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>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