2025-04-26 16:03:23 +08:00

320 lines
8.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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