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();
|
||
|
||
}
|
||
|
||
|
||
|
||
}
|