320 lines
8.6 KiB
C
320 lines
8.6 KiB
C
|
/** ##########################################################################
|
|||
|
** 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();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|