/** ########################################################################## ** Filename : ** Project : ** Module : ** Processor : ** Version : 1.0 ** Compiler : ** Date/Time : ** Abstract : ** Contents : ** Note : * ** ** (c) Copyright dmdz Co.,Ltd ** -------------------------------------------------------------------------- ** R E V I S I O N H I S T O R Y ** -------------------------------------------------------------------------- ** Date Ver Author Description ** -20230602- --V1.0-- --mingyea--- --修改-- ** #########################################################################*/ /*--------------------------------------------------------------------------- - I N C L U D E F I L E S ----------------------------------------------------------------------------*/ //#include "includes.h" #include "error.h" #include "boot_app.h" #include "can.h" #include "nvm.h" //#include "lin_commontl_api.h" //#include "lin_slave_diag.h" #include "common_cfg.h" #include "bl_can_if_funcfg.h" #include "bl_adpt_uds_platform.h" /*--------------------------------------------------------------------------- - D E F I N E S / M A C R O S ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- - T Y P E D E F I N I T I O N S ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- - S T A T I C V A R I A B L E S ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- * G L O B A L V A R I A B L E S ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- - C O N S T A N T S ----------------------------------------------------------------------------*/ #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 #ifdef __ICCARM__ MEMORY_MAP_FLAG_NO_OPTIME const u8 AppValid[16] @APP_VALID_FLAG_ADDR = {0xaa,0xaa,0x04,0xe5,0xaa,0xaa,0x04,0xe5,0xaa,0xaa,0x04,0xe5,0xaa,0xaa,0x04,0xe5}; #else MEMORY_MAP_FLAG_NO_OPTIME volatile const MEMORY_MAP_ROM_APP_VALID u8 AppValid[16] = {0xaa,0xaa,0x04,0xe5,0xaa,0xaa,0x04,0xe5,0xaa,0xaa,0x04,0xe5,0xaa,0xaa,0x04,0xe5}; #endif #endif /*--------------------------------------------------------------------------- - F U N C T I O N P R O T O T Y P E ----------------------------------------------------------------------------*/ //跳轉相關 u32 jump_adress; typedef void (*pFunction)(void) ; pFunction jump_to_app; 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); /* 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(void) { /*set reprogram flag*/ Boot_SetFlag(FLAG_REPROGRAM_ID); /*reset ECU*/ ResetMCUHandle(); } 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; u8 l_buf[4] ={FLAG_REPROGRAM_u8_DATA0,FLAG_REPROGRAM_u8_DATA1,FLAG_REPROGRAM_u8_DATA2,FLAG_REPROGRAM_u8_DATA3}; switch (flagId) { case FLAG_REPROGRAM_ID: addr = AppValid[0]; // AppValid1 //addr = AppValid_in[0]; // AppValid_in addr = FLAG_REPROGRAM_ADDR; //data = FLAG_REPROGRAM_DATA; break; default : break; } if (addr != 0xFFFFFFFFUL) { #if 0 (void)FlagWriteHandle(addr,(u32)4,&l_buf); #else (void)ram_write_bytes(addr,(u8*)&l_buf[0],FLAG_REPROGRAM_LEN); #endif } } /*--------------------------------------------------------------------------- |Prototype : boot_app_init |Called by : |Preconditions : |Input parameters : |Output parameters : |Return value : |Description : 初始化 ----------------------------------------------------------------------------*/ void boot_app_init(void) { #if 0 u8 i; /*PRQA S 3205*/ u8 l_buf[8]; u32 l_temp; u32 tempP2Star; 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 } /*--------------------------------------------------------------------------- |Prototype : boot_app_task |Called by : |Preconditions : |Input parameters : |Output parameters : |Return value : |Description : ----------------------------------------------------------------------------*/ void boot_app_task(void) { } #if 0 #ifdef __ICCARM__ static void __set_MSP(uint32_t topOfMainStack) { __asm("msr msp, r0"); } static __inline void __set_PSP(uint32_t topOfProcStack) { __asm("msr psp, r0"); } /** \brief Set Control Register \details Writes the given value to the Control Register. \param [in] control Control Register value to set */ static __inline void __set_CONTROL(uint32_t control) { __asm volatile ("MSR control, %0" : : "r" (control) : "memory"); } #endif #ifdef __GNUC__ static void __set_MSP(uint32_t topOfMainStack) { __asm volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp"); } static void __set_PSP(uint32_t topOfMainStack) { __asm volatile ("MSR psp, %0\n" : : "r" (topOfMainStack) : "sp"); } /** \brief Set Control Register \details Writes the given value to the Control Register. \param [in] control Control Register value to set */ static void __set_CONTROL(uint32_t control) { __asm volatile ("MSR control, %0" : : "r" (control) : "memory"); } #endif #endif /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : |Output parameters : |Return value : |Description : ----------------------------------------------------------------------------*/ void boot_app_jump_to_app(void) { /*一上電就跳轉到應用程序區*/ /*檢查棧頂地址是否合法*/ if( ((* (__IO u32*)APP_ADRRESS_VECTOR) & 0x2ffe0000u) == 0x20000000u) { /*用戶代碼區第二個字為程序開始地址(復位地址) 即Reset_handler */ jump_adress = * (__IO u32*)(APP_ADRRESS_VECTOR+4u); /*所謂的PC 是0x8000004 ,SP 是 0x8000000*/ jump_to_app = (pFunction)jump_adress; /*考虙這語句是否可以去掉---後來測試發現不影響--是獨立的*/ // SCB->VTOR = 0x08000000u; /* Vector Table Relocation in Internal FLASH. */ //和RTOS相關的,這兩句,研究了好多天,價格不菲 __set_PSP(*(__IO u32 *)APP_ADRRESS_VECTOR); __set_CONTROL(0); /*初始化APP堆棧指針---用戶代碼區的第一個字用於存放棧頂地址*/ __set_MSP((* (__IO u32*)APP_ADRRESS_VECTOR)); /*__set_MSP 是設置椎棧指針*/ #if 0 bsp_int_disable_all_int(); #if OS_TYPE == OS_TYPES_NULL bsp_int_disable_primask(); bsp_int_disable_faultmask(); #endif #endif jump_to_app(); } }