/** ****************************************************************************** * @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