320 lines
8.6 KiB
C
Raw Permalink Normal View History

2025-04-26 16:03:23 +08:00
/** ##########################################################################
** 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();
}
}