893 lines
35 KiB
C
893 lines
35 KiB
C
/**********************************************************************************************************************
|
|
* COPYRIGHT
|
|
* -------------------------------------------------------------------------------------------------------------------
|
|
* \verbatim
|
|
* Copyright (c) 2025 by Vector Informatik GmbH. All rights reserved.
|
|
*
|
|
* This software is copyright protected and proprietary to Vector Informatik GmbH.
|
|
* Vector Informatik GmbH grants to you only those rights as set out in the license conditions.
|
|
* All other rights remain with Vector Informatik GmbH.
|
|
* \endverbatim
|
|
* -------------------------------------------------------------------------------------------------------------------
|
|
* FILE DESCRIPTION
|
|
* -----------------------------------------------------------------------------------------------------------------*/
|
|
/** \file File: BrsMain_Appl.c
|
|
* Project: Vector Basic Runtime System
|
|
* Module: BrsMain
|
|
*
|
|
* \brief Description: Additional, Application-specific, implementation
|
|
*
|
|
* \attention Please note:
|
|
* The demo and example programs only show special aspects of the software. With regard to the fact
|
|
* that these programs are meant for demonstration purposes only, Vector Informatik liability shall be
|
|
* expressly excluded in cases of ordinary negligence, to the extent admissible by law or statute.
|
|
*********************************************************************************************************************/
|
|
|
|
/**********************************************************************************************************************
|
|
* REVISION HISTORY
|
|
* -------------------------------------------------------------------------------------------------------------------
|
|
* Refer to BrsMain.h.
|
|
*********************************************************************************************************************/
|
|
|
|
/**********************************************************************************************************************
|
|
* EXAMPLE CODE ONLY
|
|
* -------------------------------------------------------------------------------------------------------------------
|
|
* This Example Code is only intended for illustrating an example of a possible BSW integration and BSW configuration.
|
|
* The Example Code has not passed any quality control measures and may be incomplete. The Example Code is neither
|
|
* intended nor qualified for use in series production. The Example Code as well as any of its modifications and/or
|
|
* implementations must be tested with diligent care and must comply with all quality requirements which are necessary
|
|
* according to the state of the art before their use.
|
|
*********************************************************************************************************************/
|
|
|
|
#define _BRSMAIN_APPL_C_
|
|
|
|
/**********************************************************************************************************************
|
|
* INCLUDES
|
|
*********************************************************************************************************************/
|
|
#include "BrsMain_Appl.h"
|
|
|
|
#if defined (BRS_ENABLE_SCHM_STUB_GENERATION)
|
|
/* needed for SuspendAllInterrupts() and ResumeAllInterrupts() of SchM stub wrapper APIs
|
|
* BrsMain_Appl_SuspendAllInterrupts() and BrsMain_Appl_ResumeAllInterrupts() */
|
|
#include "Os.h"
|
|
#endif
|
|
|
|
#if defined (BRS_ENABLE_HYPERVISOR_SUPPORT) && defined (BRS_ENABLE_OS_MULTICORESUPPORT)
|
|
/* Needed for BrsMain_CoreConfig[] and BrsMain_CoreConfig_Size */
|
|
#include "vBrs_Lcfg.h"
|
|
#endif
|
|
|
|
#if !defined (BRSMAINAPPL_DISABLE_CAN_EXCLUSIVEAREA_HANDLING)
|
|
# if defined (BRS_ENABLE_CAN_SUPPORT) && defined (BRS_ENABLE_CAN_CLASSIC_SUPPORT)
|
|
/* with vCan drivers, only Can_30_Core.h needs to be included (see BrsMain_Appl.h) */
|
|
#include BRS_DRVCAN_HEADER_FILENAME
|
|
# if defined (BRS_DRVCAN1_HEADER_FILENAME)
|
|
#include BRS_DRVCAN1_HEADER_FILENAME
|
|
# endif
|
|
# endif
|
|
#endif
|
|
|
|
/**********************************************************************************************************************
|
|
* VERSION CHECK
|
|
*********************************************************************************************************************/
|
|
#if (BRSMAIN_MAJOR_VERSION != 2u) || (BRSMAIN_MINOR_VERSION != 27u)
|
|
#error "Header and source file are inconsistent!"
|
|
#endif
|
|
#if (BRSMAIN_PATCH_VERSION != 0u)
|
|
#error "Different versions of patch in Header and Source used!"
|
|
#endif
|
|
|
|
/**********************************************************************************************************************
|
|
* CONFIGURATION CHECK
|
|
*********************************************************************************************************************/
|
|
/* COMPILER CHECK */
|
|
/* Check if the DaVinci configured compiler fits to the used buildenvironment */
|
|
#if defined (VVIRTUALTARGET)
|
|
/* For vVirtualTarget, the compier should always be configured to Ansi.
|
|
This is related to BRS_COMPILER_DFDD3B47_BB56_4B45_BEC9_BE0B2C58DC11.
|
|
But, as no MakeSupport is used for vVirtualTarget, we do not need to check this here. */
|
|
#else
|
|
# if defined (BRS_COMPILER_UNDEFINED)
|
|
#error "No compiler is configured in DaVinci!"
|
|
#error "As several parts of vBaseEnv are compiler dependent, proper usage without a compiler selection is not possible."
|
|
# endif
|
|
# if defined (BRS_COMP_ARM5) && !defined (BRS_COMPILER_ACA8C365_6D1E_49FA_97F8_792D81C79C74)
|
|
#error "Buildenvironment for Arm5 compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
# if defined (BRS_COMP_ARM6) && !defined (BRS_COMPILER_89D464F1_ECCF_4306_A854_BF45FB1D7441)
|
|
#error "Buildenvironment for Arm6 compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
# if defined (BRS_COMP_ARMTFE) && !defined (BRS_COMPILER_B052FFB3_EA77_4E0B_ACB8_A77A4A0F24E8)
|
|
#error "Buildenvironment for ArmTfE compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
# if defined (BRS_COMP_CCAC) && !defined (BRS_COMPILER_2526EC26_414A_4091_91D0_0442AF47D241)
|
|
#error "Buildenvironment for Ccac compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
# if defined (BRS_COMP_DIABDATA) && !defined (BRS_COMPILER_44266E21_0E8C_4DDA_B800_91CE20104931)
|
|
#error "Buildenvironment for DiabData compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
# if defined (BRS_COMP_GCCHIGHTEC) && !defined (BRS_COMPILER_E7BC1F6B_0DF4_4345_BE50_A9AE95AF99A7)
|
|
#error "Buildenvironment for GccHighTec compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
# if defined (BRS_COMP_GCCNXP) && !defined (BRS_COMPILER_E832C52E_6625_4C6A_96D2_0BD6FFD35ECE)
|
|
#error "Buildenvironment for GccNxp compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
# if defined (BRS_COMP_GHS) && !defined (BRS_COMPILER_BBC47DF5_C78B_4E8E_8F86_0EF503FD3198)
|
|
#error "Buildenvironment for GreenHills compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
# if defined (BRS_COMP_GNU) && !defined (BRS_COMPILER_1350F673_6EFC_4394_917C_52F584E83ACE)
|
|
#error "Buildenvironment for GccGnu compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
# if defined (BRS_COMP_IAR) && !defined (BRS_COMPILER_FA51A718_3ADB_438D_98F3_245101681392)
|
|
#error "Buildenvironment for Iar compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
# if defined (BRS_COMP_LLVMDIAB) && !defined (BRS_COMPILER_E0E70C27_10E6_4169_9D2C_B9CAA4649C65)
|
|
#error "Buildenvironment for LlvmDiabData compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
# if defined (BRS_COMP_LLVMHIGHTEC) && !defined (BRS_COMPILER_BEBEB212_6307_4BD8_A274_A517B187644E)
|
|
#error "Buildenvironment for LlvmHighTec compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
# if defined (BRS_COMP_LLVMTEXASINSTRUMENTS) && !defined (BRS_COMPILER_051C3D73_B474_4677_9754_FBA372BF80EC)
|
|
#error "Buildenvironment for LlvmTexasInstruments compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
# if defined (BRS_COMP_MICROCHIP) && !defined (BRS_COMPILER_82CA3A19_9A7A_49D6_9EFE_39486D0F6510)
|
|
#error "Buildenvironment for MicroChip compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
# if defined (BRS_COMP_RENESAS) && !defined (BRS_COMPILER_5BCBEFDE_F5D2_49AA_B4DD_04AC02CE5A9A)
|
|
#error "Buildenvironment for Renesas compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
# if defined (BRS_COMP_TASKING) && !defined (BRS_COMPILER_8DB6C5C5_6807_4601_B7B7_68A4A5B277F6)
|
|
#error "Buildenvironment for Tasking compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
# if defined (BRS_COMP_TI) && !defined (BRS_COMPILER_B961F280_648C_45FF_A994_700EDE3B9F78)
|
|
#error "Buildenvironment for TexasInstruments compiler is used, but DaVinci is configured for a different compiler!"
|
|
# endif
|
|
#endif /* VVIRTUALTARGET */
|
|
|
|
/* If the template version for BrsHw is not at least 01.03.13, Hypervisor Multicore configuration is not supported. */
|
|
#if defined (BRS_ENABLE_HYPERVISOR_SUPPORT) && defined (BRS_ENABLE_OS_MULTICORESUPPORT)
|
|
/* BRSHW_SOURCECODE_TEMPLATE_VERSION_COMBINED was introduced in Brs_Template 1.04.00 - no check needed */
|
|
# if !defined (BRSHW_SOURCECODE_TEMPLATE_VERSION_COMBINED)
|
|
# if (BRSHW_SOURCECODE_TEMPLATE_VERSION < 0x0103) || ((BRSHW_SOURCECODE_TEMPLATE_VERSION == 0x0103) && \
|
|
(BRSHW_SOURCECODE_TEMPLATE_BUGFIX_VERSION < 0x13))
|
|
#error "Hypervisor Multicore is only supported with Brs_Template[01.03.13] onwards."
|
|
# endif
|
|
# endif
|
|
#endif
|
|
|
|
/**********************************************************************************************************************
|
|
* DEFINITION + MACROS
|
|
*********************************************************************************************************************/
|
|
|
|
/**********************************************************************************************************************
|
|
* GLOBAL VARIABLES
|
|
*********************************************************************************************************************/
|
|
#if !defined (BRSMAINAPPL_DISABLE_CAN_EXCLUSIVEAREA_HANDLING)
|
|
# if defined (BRS_ENABLE_CAN_SUPPORT) && (!defined (BRS_ENABLE_FBL_SUPPORT))
|
|
# if defined (BRS_ENABLE_CAN_CLASSIC_SUPPORT)
|
|
#define CAN_START_SEC_VAR_NOINIT_8BIT
|
|
/*
|
|
* to support CAN driver name infix, vBRS generator provides a wrapper
|
|
* for usage of the driver specific MemMap.h define in vBrsCfg.h
|
|
*/
|
|
#include "vBrsCfg.h"
|
|
static uint8 BrsAsrApplCanInterruptLockCtr;
|
|
#define CAN_STOP_SEC_VAR_NOINIT_8BIT
|
|
/*
|
|
* to support CAN driver name infix, vBRS generator provides a wrapper
|
|
* for usage of the driver specific MemMap.h define in vBrsCfg.h
|
|
*/
|
|
#include "vBrsCfg.h"
|
|
# endif /* BRS_ENABLE_CAN_CLASSIC_SUPPORT */
|
|
# endif /* BRS_ENABLE_CAN_SUPPORT && !BRS_ENABLE_FBL_SUPPORT */
|
|
#endif /* !BRSMAINAPPL_DISABLE_CAN_EXCLUSIVEAREA_HANDLING */
|
|
|
|
/**********************************************************************************************************************
|
|
* GLOBAL CONST VARIABLES
|
|
*********************************************************************************************************************/
|
|
#if defined (BRS_FBL_INSTANCE_FBL)
|
|
/**********************************************************************************************************************
|
|
* FBL Instance Presence Pattern
|
|
* This presence pattern is only required when downloading the FBL with debugger. When using an updater (or an EOL
|
|
* programmer), this presence pattern is not required as part of the .hex file and should be removed.
|
|
*********************************************************************************************************************/
|
|
#define BRS_START_SEC_FBL_PP_CONST
|
|
#include "Brs_MemMap.h"
|
|
const uint8 FblPresencePatternArray[4] = {0x73u, 0x6Au, 0x29u, 0x3Eu};
|
|
#define BRS_STOP_SEC_FBL_PP_CONST
|
|
#include "Brs_MemMap.h"
|
|
#endif /* BRS_FBL_INSTANCE_FBL */
|
|
|
|
/**********************************************************************************************************************
|
|
* LOCAL VARIABLES
|
|
*********************************************************************************************************************/
|
|
|
|
/**********************************************************************************************************************
|
|
* LOCAL CONST VARIABLES
|
|
*********************************************************************************************************************/
|
|
|
|
/**********************************************************************************************************************
|
|
* PROTOTYPES OF GLOBAL FUNCTIONS
|
|
*********************************************************************************************************************/
|
|
|
|
/**********************************************************************************************************************
|
|
* PROTOTYPES OF LOCAL FUNCTIONS
|
|
*********************************************************************************************************************/
|
|
|
|
/**********************************************************************************************************************
|
|
* FUNCTION DEFINITIONS
|
|
*********************************************************************************************************************/
|
|
/*****************************************************************************/
|
|
/* @brief Main initialization routine.
|
|
* Contains configuration specific initialization of BrsHw parts
|
|
* and BrsMain specific mechanisms.
|
|
* @pre -
|
|
* @param[in] -
|
|
* @param[out] -
|
|
* @return -
|
|
* @context Function is called from main
|
|
*****************************************************************************/
|
|
void BrsMain_Appl_Init(void)
|
|
{
|
|
#if !defined (BRSMAINAPPL_DISABLE_CAN_EXCLUSIVEAREA_HANDLING)
|
|
# if defined (BRS_ENABLE_CAN_SUPPORT) && (!defined (BRS_ENABLE_FBL_SUPPORT))
|
|
# if defined (BRS_ENABLE_CAN_CLASSIC_SUPPORT)
|
|
/* UserDefined ExclusiveArea handling for CAN channels, according to AN-ISC-8-1149_ErrorHook_E_OS_DISABLED_INT.pdf */
|
|
BrsAsrApplCanInterruptLockCtr = 0u;
|
|
# endif
|
|
# endif
|
|
#endif
|
|
}
|
|
|
|
#if defined (BRS_ENABLE_SCHM_STUB_GENERATION)
|
|
# if defined (BRS_ENABLE_FBL_SUPPORT)
|
|
#define BRS_START_SEC_RAM_CODE
|
|
#include "Brs_MemMap.h"
|
|
# endif
|
|
/*****************************************************************************/
|
|
/* @brief Suspend all interrupts via OS call
|
|
* @pre -
|
|
* @param[in] -
|
|
* @param[out] -
|
|
* @return -
|
|
* @context Function is used for SchM_Enter_* defines in vBrs generated
|
|
* SchM stub module specific header files. This allows the user to
|
|
* add project specific code. As default, SuspendAllInterrupts() is
|
|
* defined empty within BrsMain provided Os.h stub for delieveries
|
|
* w/o OS (no interrupt locking needed in polling environments)
|
|
*****************************************************************************/
|
|
void BrsMain_Appl_SuspendAllInterrupts(void)
|
|
{
|
|
SuspendAllInterrupts();
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* @brief Resume all interrupts via OS call
|
|
* @pre -
|
|
* @param[in] -
|
|
* @param[out] -
|
|
* @return -
|
|
* @context Function is used for SchM_Exit_* defines in vBrs generated
|
|
* SchM stub module specific header files. This allows the user to
|
|
* add project specific code. As default, ResumeAllInterrupts() is
|
|
* defined empty within BrsMain provided Os.h stub for delieveries
|
|
* w/o OS (no interrupt locking needed in polling environments)
|
|
*****************************************************************************/
|
|
void BrsMain_Appl_ResumeAllInterrupts(void)
|
|
{
|
|
ResumeAllInterrupts();
|
|
}
|
|
# if defined (BRS_ENABLE_FBL_SUPPORT)
|
|
#define BRS_STOP_SEC_RAM_CODE
|
|
#include "Brs_MemMap.h"
|
|
# endif
|
|
#endif /* BRS_ENABLE_SCHM_STUB_GENERATION */
|
|
|
|
#if defined (BRS_ENABLE_HYPERVISOR_SUPPORT)
|
|
/*****************************************************************************/
|
|
/* @brief Callout to let the additional configured cores started by the
|
|
* boot core, if necessary. This is just an initial template and
|
|
* may need project specific adaptions. It's called by every core.
|
|
* @pre -
|
|
* @param[in] coreID is the physical core ID of the actual running core
|
|
* @param[out] -
|
|
* @return -
|
|
* @context Function is called from main, previously to vHyp_Init()
|
|
*****************************************************************************/
|
|
void BrsMain_Appl_HypervisorStartCoreApi(uint32 coreID)
|
|
{
|
|
#if defined (BRS_ENABLE_OS_MULTICORESUPPORT) && (!defined (BRSHW_CORES_AUTOSTART))
|
|
/*
|
|
* If additional cores need to be started by the boot core, this needs to be done previously to the call of
|
|
* vHyp_Init(), to prevent issues, if boot core is not the same as vHyp init core (VHYP_CORE_INIT).
|
|
* As vHyp_RegisterCore() will wait until the additional core reaches a sync barrier, all configured cores should be
|
|
* started as early as possible.
|
|
*/
|
|
/* Check, if the actual running core is the boot core */
|
|
if (coreID == BRSHW_INIT_CORE_ID)
|
|
{
|
|
for (uint32 i = 0u; i < BrsMain_CoreConfig_Size; i++)
|
|
{
|
|
if (BrsMain_CoreConfig[i].PhysicalCoreId != BRSHW_INIT_CORE_ID)
|
|
{
|
|
BrsHw_StartCore(BrsMain_CoreConfig[i].PhysicalCoreId);
|
|
}
|
|
}
|
|
}
|
|
#endif /* BRS_ENABLE_OS_MULTICORESUPPORT && !BRSHW_CORES_AUTOSTART */
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* @brief Callout to implement user code previous to the call of
|
|
* vHyp_Start(). This is just an initial template and may need
|
|
* project specific adaptions. It's called by every core.
|
|
* @pre -
|
|
* @param[in] coreID is the physical core ID of the actual running core
|
|
* @param[out] -
|
|
* @return -
|
|
* @context Function is called from main, previously to vHyp_Start()
|
|
*****************************************************************************/
|
|
void BrsMain_Appl_HypervisorApi(uint32 coreID)
|
|
{
|
|
#if defined (BRS_ENABLE_OS_MULTICORESUPPORT)
|
|
/* Check, if the actual running core is the vHyp init core */
|
|
if ((vHyp_CoreIdType)coreID == VHYP_CORE_INIT)
|
|
{
|
|
vHyp_CoreIdType core;
|
|
for (core = 0; core < VHYP_CORE_COUNT; core++)
|
|
{
|
|
if (core != VHYP_CORE_INIT)
|
|
{
|
|
vHyp_RegisterCore(core);
|
|
}
|
|
}
|
|
}
|
|
#endif /* BRS_ENABLE_OS_MULTICORESUPPORT */
|
|
}
|
|
#endif /* BRS_ENABLE_HYPERVISOR_SUPPORT */
|
|
|
|
#if !defined (BRSMAINAPPL_DISABLE_CAN_EXCLUSIVEAREA_HANDLING)
|
|
# if defined (BRS_ENABLE_CAN_SUPPORT)
|
|
# if defined (BRS_ENABLE_CAN_CLASSIC_SUPPORT)
|
|
/**********************************************************************************************************************
|
|
* A classic (non-Gen3) DrvCan is part of the configuration. "Oldschool" implementation is needed
|
|
*********************************************************************************************************************/
|
|
|
|
/**********************************************************************************************************************
|
|
* UserDefined ExclusiveArea handling for CAN channels, according to AN-ISC-8-1149_ErrorHook_E_OS_DISABLED_INT.pdf
|
|
*********************************************************************************************************************/
|
|
/*
|
|
* Macro is generated in vBrsCfg.h, to support drivers with infix.
|
|
* Sample w/o infix: void SchM_Enter_Can_CAN_EXCLUSIVE_AREA_0(void)
|
|
* Can_DisableControllerInterrupts(0u);
|
|
* Sample w/ infix: void SchM_Enter_Can_30_Mcan_CAN_30_MCAN_EXCLUSIVE_AREA_0(void)
|
|
* Can_30_Mcan_DisableControllerInterrupts(0u);
|
|
*/
|
|
|
|
#define CAN_START_SEC_CODE
|
|
/*
|
|
* to support CAN driver name infix, vBRS generator provides a wrapper
|
|
* for usage of the driver specific MemMap.h define in vBrsCfg.h
|
|
*/
|
|
#include "vBrsCfg.h"
|
|
BRS_DRVCAN_EXCLUSIVE_AREA_INFIX(Enter, EXCLUSIVE_AREA_0)
|
|
{
|
|
#if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
if (++BrsAsrApplCanInterruptLockCtr == 1u)
|
|
{
|
|
BRS_DRVCAN_ControllerInterrupts_INFIX(Disable)(0u);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
BRS_DRVCAN_EXCLUSIVE_AREA_INFIX(Exit, EXCLUSIVE_AREA_0)
|
|
{
|
|
#if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
if (--BrsAsrApplCanInterruptLockCtr == 0u)
|
|
{
|
|
BRS_DRVCAN_ControllerInterrupts_INFIX(Enable)(0u);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
BRS_DRVCAN_EXCLUSIVE_AREA_INFIX(Enter, EXCLUSIVE_AREA_6)
|
|
{
|
|
#if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
if (++BrsAsrApplCanInterruptLockCtr == 1u)
|
|
{
|
|
BRS_DRVCAN_ControllerInterrupts_INFIX(Disable)(0u);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
BRS_DRVCAN_EXCLUSIVE_AREA_INFIX(Exit, EXCLUSIVE_AREA_6)
|
|
{
|
|
#if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
if (--BrsAsrApplCanInterruptLockCtr == 0u)
|
|
{
|
|
BRS_DRVCAN_ControllerInterrupts_INFIX(Enable)(0u);
|
|
}
|
|
#endif
|
|
}
|
|
#define CAN_STOP_SEC_CODE
|
|
/*
|
|
* to support CAN driver name infix, vBRS generator provides a wrapper
|
|
* for usage of the driver specific MemMap.h define in vBrsCfg.h
|
|
*/
|
|
#include "vBrsCfg.h"
|
|
|
|
# if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
#define CANIF_START_SEC_CODE
|
|
#include "MemMap.h"
|
|
void SchM_Enter_CanIf_CANIF_EXCLUSIVE_AREA_0(void)
|
|
{
|
|
if (++BrsAsrApplCanInterruptLockCtr == 1u)
|
|
{
|
|
BRS_DRVCAN_ControllerInterrupts_INFIX(Disable)(0u);
|
|
}
|
|
}
|
|
|
|
void SchM_Exit_CanIf_CANIF_EXCLUSIVE_AREA_0(void)
|
|
{
|
|
if (--BrsAsrApplCanInterruptLockCtr == 0u)
|
|
{
|
|
BRS_DRVCAN_ControllerInterrupts_INFIX(Enable)(0u);
|
|
}
|
|
}
|
|
#define CANIF_STOP_SEC_CODE
|
|
#include "MemMap.h"
|
|
|
|
#define CANSM_START_SEC_CODE
|
|
#include "MemMap.h"
|
|
void SchM_Enter_CanSM_CANSM_EXCLUSIVE_AREA_4(void)
|
|
{
|
|
if (++BrsAsrApplCanInterruptLockCtr == 1u)
|
|
{
|
|
BRS_DRVCAN_ControllerInterrupts_INFIX(Disable)(0u);
|
|
}
|
|
}
|
|
|
|
void SchM_Exit_CanSM_CANSM_EXCLUSIVE_AREA_4(void)
|
|
{
|
|
if (--BrsAsrApplCanInterruptLockCtr == 0u)
|
|
{
|
|
BRS_DRVCAN_ControllerInterrupts_INFIX(Enable)(0u);
|
|
}
|
|
}
|
|
|
|
void SchM_Enter_CanSM_CANSM_EXCLUSIVE_AREA_1(void)
|
|
{
|
|
/* Protects against task interruptions -> no locking needed, because all main functions are on same task */
|
|
}
|
|
|
|
void SchM_Exit_CanSM_CANSM_EXCLUSIVE_AREA_1(void)
|
|
{
|
|
/* Protects against task interruptions -> no locking needed, because all main functions are on same task */
|
|
}
|
|
#define CANSM_STOP_SEC_CODE
|
|
#include "MemMap.h"
|
|
|
|
#define COMM_START_SEC_CODE
|
|
#include "MemMap.h"
|
|
void SchM_Enter_ComM_COMM_EXCLUSIVE_AREA_1(void)
|
|
{
|
|
/* Protects against task interruptions -> no locking needed, because all main functions are on same task */
|
|
}
|
|
|
|
void SchM_Exit_ComM_COMM_EXCLUSIVE_AREA_1(void)
|
|
{
|
|
/* Protects against task interruptions -> no locking needed, because all main functions are on same task */
|
|
}
|
|
#define COMM_STOP_SEC_CODE
|
|
#include "MemMap.h"
|
|
# endif /* !BRS_ENABLE_FBL_SUPPORT */
|
|
# endif /* BRS_ENABLE_CAN_CLASSIC_SUPPORT */
|
|
|
|
# if defined (BRS_ENABLE_CAN_CORE_SUPPORT)
|
|
/**********************************************************************************************************************
|
|
* A new (Gen3) DrvCan is part of the configuration. New implementation is needed
|
|
*********************************************************************************************************************/
|
|
# if (Can_30_Core_IsHardwareCancelByApplOfGeneralFeature(0u) && Can_30_Core_IsHardwareLoopCheckOfGeneralFeature(0u))
|
|
/* If these do not exist, maybe Can_30_Core/Can/CanGeneral/CanConstantDataToDefine is deactivated. If so, please
|
|
choose the suitable implementation manually */
|
|
|
|
# if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
/* Within a FBL project, depending APIs are already available within Fbl_cw.c */
|
|
/**********************************************************************************************************************
|
|
* Hardware Loop Check / Timeout Monitoring for CAN Driver, according to TechnicalReference_Can_30_Core.pdf,
|
|
* chapter 2.8.2
|
|
*********************************************************************************************************************/
|
|
#define CAN_30_CORE_START_SEC_VAR_NOCACHE_INIT_32
|
|
# if defined (BRSMAIN_CAN_30_CORE_SPECIFIC_MEMMAP)
|
|
#include "Can_30_Core_MemMap.h"
|
|
# else
|
|
#include "MemMap.h"
|
|
# endif
|
|
static uint32 BrsAsrApplCanTimerCount;
|
|
#define CAN_30_CORE_STOP_SEC_VAR_NOCACHE_INIT_32
|
|
# if defined (BRSMAIN_CAN_30_CORE_SPECIFIC_MEMMAP)
|
|
#include "Can_30_Core_MemMap.h"
|
|
# else
|
|
#include "MemMap.h"
|
|
# endif
|
|
|
|
#define CAN_30_CORE_START_SEC_CODE
|
|
# if defined (BRSMAIN_CAN_30_CORE_SPECIFIC_MEMMAP)
|
|
#include "Can_30_Core_MemMap.h"
|
|
# else
|
|
#include "MemMap.h"
|
|
# endif
|
|
void Appl_30_CoreCanTimerStart(uint8 Controller, uint8 source)
|
|
{
|
|
BrsAsrApplCanTimerCount = 0u;
|
|
}
|
|
|
|
void Appl_30_CoreCanTimerEnd(uint8 Controller, uint8 source)
|
|
{
|
|
/* nothing to be done here; BrsAsrApplCanTimerCount will be set to 0 by next call of Appl_30_CoreCanTimerStart() */
|
|
}
|
|
|
|
Can_ReturnType Appl_30_CoreCanTimerLoop(uint8 Controller, uint8 source)
|
|
{
|
|
BrsAsrApplCanTimerCount++;
|
|
|
|
if (BrsAsrApplCanTimerCount > 10000u)
|
|
{
|
|
/* timeout detected! Something seems to block the DrvCan */
|
|
return CAN_NOT_OK;
|
|
} else
|
|
return CAN_OK;
|
|
}
|
|
#define CAN_30_CORE_STOP_SEC_CODE
|
|
# if defined (BRSMAIN_CAN_30_CORE_SPECIFIC_MEMMAP)
|
|
#include "Can_30_Core_MemMap.h"
|
|
# else
|
|
#include "MemMap.h"
|
|
# endif
|
|
# endif /* !BRS_ENABLE_FBL_SUPPORT */
|
|
|
|
# else
|
|
#error "Can_30_Core/Can/CanGeneral/CanHardwareCancelByAppl and/or Can_30_Core/Can/CanGeneral/CanHardwareLoopCheck are deactivated! If you really want to use customer specific exclusive area handling, implement them controller and project specific. The following APIs are only a generic sample and need to be adapted."
|
|
|
|
/***********************************************************************************************************************
|
|
* UserDefined ExclusiveArea handling for CAN Driver Core, according to TechnicalReference_Can_30_Core.pdf, Note within
|
|
* chapter 3.2
|
|
**********************************************************************************************************************/
|
|
/*
|
|
* BE AWARE, THIS IS ONLY A SAMPLE IMPLEMENTATION!
|
|
* To get a suitable implementation for your project, take account to the technical reference of Can_30_Core
|
|
* and implement them according to your specific project settings.
|
|
* The suitable implementation is highly configuration specific, e.g. amount of channels, postbuild, ...
|
|
*/
|
|
|
|
#define CAN_30_CORE_START_SEC_CODE
|
|
# if defined (BRSMAIN_CAN_30_CORE_SPECIFIC_MEMMAP)
|
|
#include "Can_30_Core_MemMap.h"
|
|
# else
|
|
#include "MemMap.h"
|
|
# endif
|
|
void SchM_Enter_Can_30_Core_CAN_30_CORE_EXCLUSIVE_AREA_6(void)
|
|
{
|
|
#if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
/*
|
|
* sample for singlechannel configuration:
|
|
* Can_30_Core_DisableControllerInterrupts(0u);
|
|
*/
|
|
|
|
/*
|
|
* sample for multichannel configuration (be aware, this will have an effect on the runtime!):
|
|
* uint8 ch;
|
|
* for (ch = 0; ch < Can_30_Core_GetSizeOfControllerConfig(); ch++) {
|
|
* Can_30_Core_DisableControllerInterrupts(ch);
|
|
*/
|
|
#endif
|
|
}
|
|
|
|
void SchM_Exit_Can_30_Core_CAN_30_CORE_EXCLUSIVE_AREA_6(void)
|
|
{
|
|
#if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
/*
|
|
* sample for singlechannel configuration:
|
|
* Can_30_Core_EnableControllerInterrupts(0u);
|
|
*/
|
|
|
|
/*
|
|
* sample for multichannel configuration (be aware, this will have an effect on the runtime!):
|
|
* uint8 ch;
|
|
* for (ch = 0; ch < Can_30_Core_GetSizeOfControllerConfig(); ch++) {
|
|
* Can_30_Core_EnableControllerInterrupts(ch);
|
|
*/
|
|
#endif
|
|
}
|
|
#define CAN_30_CORE_STOP_SEC_CODE
|
|
# if defined (BRSMAIN_CAN_30_CORE_SPECIFIC_MEMMAP)
|
|
#include "Can_30_Core_MemMap.h"
|
|
# else
|
|
#include "MemMap.h"
|
|
# endif
|
|
|
|
# if !defined (BRS_ENABLE_CAN_CLASSIC_SUPPORT)
|
|
/*
|
|
* If vCan and classic CAN is mixed within one config, the "old" DrvCan is expected to be the 1st one. So, the
|
|
* exclusive areas are already implemented earlier in this file
|
|
*/
|
|
/**********************************************************************************************************************
|
|
* UserDefined ExclusiveArea handling for vCAN Driver, according to TechnicalReference_vCan_30_Mcan.pdf, Note within
|
|
* chapter 3.2
|
|
*********************************************************************************************************************/
|
|
/*
|
|
* BE AWARE, THIS IS ONLY A SAMPLE IMPLEMENTATION!
|
|
* To get a suitable implementation for your project, take account to the technical reference of your specific DrvCan
|
|
* and implement them according to your specific project settings.
|
|
* The suitable implementation is highly configuration specific, e.g. amount of channels, postbuild, ...
|
|
*/
|
|
|
|
#define CAN_START_SEC_CODE
|
|
/*
|
|
* to support CAN driver name infix, vBRS generator provides a wrapper
|
|
* for usage of the driver specific MemMap.h define in vBrsCfg.h
|
|
*/
|
|
#include "vBrsCfg.h"
|
|
BRS_DRVCAN_EXCLUSIVE_AREA_INFIX(Enter, EXCLUSIVE_AREA_0)
|
|
{
|
|
#if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
/*
|
|
* sample for singlechannel configuration:
|
|
* Can_30_Core_DisableControllerInterrupts(0u);
|
|
*/
|
|
|
|
/*
|
|
* sample for multichannel configuration (be aware, this will have an effect on the runtime!):
|
|
* uint8 ch;
|
|
* for (ch = 0; ch < Can_30_Core_GetSizeOfControllerConfig(); ch++) {
|
|
* Can_30_Core_DisableControllerInterrupts(ch);
|
|
*/
|
|
#endif
|
|
}
|
|
|
|
BRS_DRVCAN_EXCLUSIVE_AREA_INFIX(Exit, EXCLUSIVE_AREA_0)
|
|
{
|
|
#if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
/*
|
|
* sample for singlechannel configuration:
|
|
* Can_30_Core_RestoreControllerInterrupts(0u);
|
|
*/
|
|
|
|
/*
|
|
* sample for multichannel configuration (be aware, this will have an effect on the runtime!):
|
|
* uint8 ch;
|
|
* for (ch = 0; ch < Can_30_Core_GetSizeOfControllerConfig(); ch++) {
|
|
* Can_30_Core_RestoreControllerInterrupts(ch);
|
|
*/
|
|
#endif
|
|
}
|
|
|
|
BRS_DRVCAN_EXCLUSIVE_AREA_INFIX(Enter, EXCLUSIVE_AREA_1)
|
|
{
|
|
#if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
/*
|
|
* sample for singlechannel configuration:
|
|
* Can_30_Core_DisableControllerInterrupts(0u);
|
|
*/
|
|
|
|
/*
|
|
* sample for multichannel configuration (be aware, this will have an effect on the runtime!):
|
|
* uint8 ch;
|
|
* for (ch = 0; ch < Can_30_Core_GetSizeOfControllerConfig(); ch++) {
|
|
* Can_30_Core_DisableControllerInterrupts(ch);
|
|
*/
|
|
#endif
|
|
}
|
|
|
|
BRS_DRVCAN_EXCLUSIVE_AREA_INFIX(Exit, EXCLUSIVE_AREA_1)
|
|
{
|
|
#if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
/*
|
|
* sample for singlechannel configuration:
|
|
* Can_30_Core_RestoreControllerInterrupts(0u);
|
|
*/
|
|
|
|
/*
|
|
* sample for multichannel configuration (be aware, this will have an effect on the runtime!):
|
|
* uint8 ch;
|
|
* for (ch = 0; ch < Can_30_Core_GetSizeOfControllerConfig(); ch++) {
|
|
* Can_30_Core_RestoreControllerInterrupts(ch);
|
|
*/
|
|
#endif
|
|
}
|
|
#define CAN_STOP_SEC_CODE
|
|
/*
|
|
* to support CAN driver name infix, vBRS generator provides a wrapper
|
|
* for usage of the driver specific MemMap.h define in vBrsCfg.h
|
|
*/
|
|
#include "vBrsCfg.h"
|
|
# endif /* !BRS_ENABLE_CAN_CLASSIC_SUPPORT */
|
|
|
|
# if defined (BRS_DRVCAN1_HEADER_FILENAME)
|
|
/* 2nd DrvCan instance detected */
|
|
#define CAN1_START_SEC_CODE
|
|
/*
|
|
* to support CAN driver name infix, vBRS generator provides a wrapper
|
|
* for usage of the driver specific MemMap.h define in vBrsCfg.h
|
|
*/
|
|
#include "vBrsCfg.h"
|
|
BRS_DRVCAN1_EXCLUSIVE_AREA_INFIX(Enter, EXCLUSIVE_AREA_0)
|
|
{
|
|
#if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
/*
|
|
* sample for singlechannel configuration:
|
|
* Can_30_Core_DisableControllerInterrupts(0u);
|
|
*/
|
|
|
|
/*
|
|
* sample for multichannel configuration (be aware, this will have an effect on the runtime!):
|
|
* uint8 ch;
|
|
* for (ch = 0; ch < Can_30_Core_GetSizeOfControllerConfig(); ch++) {
|
|
* Can_30_Core_DisableControllerInterrupts(ch);
|
|
*/
|
|
#endif
|
|
}
|
|
|
|
BRS_DRVCAN1_EXCLUSIVE_AREA_INFIX(Exit, EXCLUSIVE_AREA_0)
|
|
{
|
|
#if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
/*
|
|
* sample for singlechannel configuration:
|
|
* Can_30_Core_RestoreControllerInterrupts(0u);
|
|
*/
|
|
|
|
/*
|
|
* sample for multichannel configuration (be aware, this will have an effect on the runtime!):
|
|
* uint8 ch;
|
|
* for (ch = 0; ch < Can_30_Core_GetSizeOfControllerConfig(); ch++) {
|
|
* Can_30_Core_RestoreControllerInterrupts(ch);
|
|
*/
|
|
#endif
|
|
}
|
|
|
|
BRS_DRVCAN1_EXCLUSIVE_AREA_INFIX(Enter, EXCLUSIVE_AREA_1)
|
|
{
|
|
#if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
/*
|
|
* sample for singlechannel configuration:
|
|
* Can_30_Core_DisableControllerInterrupts(0u);
|
|
*/
|
|
|
|
/*
|
|
* sample for multichannel configuration (be aware, this will have an effect on the runtime!):
|
|
* uint8 ch;
|
|
* for (ch = 0; ch < Can_30_Core_GetSizeOfControllerConfig(); ch++) {
|
|
* Can_30_Core_DisableControllerInterrupts(ch);
|
|
*/
|
|
#endif
|
|
}
|
|
|
|
BRS_DRVCAN1_EXCLUSIVE_AREA_INFIX(Exit, EXCLUSIVE_AREA_1)
|
|
{
|
|
#if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
/*
|
|
* sample for singlechannel configuration:
|
|
* Can_30_Core_RestoreControllerInterrupts(0u);
|
|
*/
|
|
|
|
/*
|
|
* sample for multichannel configuration (be aware, this will have an effect on the runtime!):
|
|
* uint8 ch;
|
|
* for (ch = 0; ch < Can_30_Core_GetSizeOfControllerConfig(); ch++) {
|
|
* Can_30_Core_RestoreControllerInterrupts(ch);
|
|
*/
|
|
#endif
|
|
}
|
|
#define CAN1_STOP_SEC_CODE
|
|
/*
|
|
* to support CAN driver name infix, vBRS generator provides a wrapper
|
|
* for usage of the driver specific MemMap.h define in vBrsCfg.h
|
|
*/
|
|
#include "vBrsCfg.h"
|
|
# endif /* BRS_DRVCAN1_HEADER_FILENAME */
|
|
|
|
# if !defined (BRS_ENABLE_FBL_SUPPORT)
|
|
# if !defined (BRS_ENABLE_CAN_CLASSIC_SUPPORT)
|
|
/*
|
|
* If vCan and classic CAN is mixed within one config, these exclusive areas are already implemented earlier
|
|
* in this file
|
|
*/
|
|
#define CANIF_START_SEC_CODE
|
|
#include "MemMap.h"
|
|
void SchM_Enter_CanIf_CANIF_EXCLUSIVE_AREA_0(void)
|
|
{
|
|
/*
|
|
* sample for singlechannel configuration:
|
|
* Can_30_Core_DisableControllerInterrupts(0u);
|
|
*/
|
|
|
|
/*
|
|
* sample for multichannel configuration (be aware, this will have an effect on the runtime!):
|
|
* uint8 ch;
|
|
* for (ch = 0; ch < Can_30_Core_GetSizeOfControllerConfig(); ch++) {
|
|
* Can_30_Core_DisableControllerInterrupts(ch);
|
|
*/
|
|
}
|
|
|
|
void SchM_Exit_CanIf_CANIF_EXCLUSIVE_AREA_0(void)
|
|
{
|
|
/*
|
|
* sample for singlechannel configuration:
|
|
* Can_30_Core_RestoreControllerInterrupts(0u);
|
|
*/
|
|
|
|
/*
|
|
* sample for multichannel configuration (be aware, this will have an effect on the runtime!):
|
|
* uint8 ch;
|
|
* for (ch = 0; ch < Can_30_Core_GetSizeOfControllerConfig(); ch++) {
|
|
* Can_30_Core_RestoreControllerInterrupts(ch);
|
|
*/
|
|
}
|
|
#define CANIF_STOP_SEC_CODE
|
|
#include "MemMap.h"
|
|
|
|
#define CANSM_START_SEC_CODE
|
|
#include "MemMap.h"
|
|
void SchM_Enter_CanSM_CANSM_EXCLUSIVE_AREA_4(void)
|
|
{
|
|
/*
|
|
* sample for singlechannel configuration:
|
|
* Can_30_Core_DisableControllerInterrupts(0u);
|
|
*/
|
|
|
|
/*
|
|
* sample for multichannel configuration (be aware, this will have an effect on the runtime!):
|
|
* uint8 ch;
|
|
* for (ch = 0; ch < Can_30_Core_GetSizeOfControllerConfig(); ch++) {
|
|
* Can_30_Core_DisableControllerInterrupts(ch);
|
|
*/
|
|
}
|
|
|
|
void SchM_Exit_CanSM_CANSM_EXCLUSIVE_AREA_4(void)
|
|
{
|
|
/*
|
|
* sample for singlechannel configuration:
|
|
* Can_30_Core_RestoreControllerInterrupts(0u);
|
|
*/
|
|
|
|
/*
|
|
* sample for multichannel configuration (be aware, this will have an effect on the runtime!):
|
|
* uint8 ch;
|
|
* for (ch = 0; ch < Can_30_Core_GetSizeOfControllerConfig(); ch++) {
|
|
* Can_30_Core_RestoreControllerInterrupts(ch);
|
|
*/
|
|
}
|
|
|
|
void SchM_Enter_CanSM_CANSM_EXCLUSIVE_AREA_1(void)
|
|
{
|
|
/* Protects against task interruptions -> no locking needed, because all main functions are on same task */
|
|
}
|
|
|
|
void SchM_Exit_CanSM_CANSM_EXCLUSIVE_AREA_1(void)
|
|
{
|
|
/* Protects against task interruptions -> no locking needed, because all main functions are on same task */
|
|
}
|
|
#define CANSM_STOP_SEC_CODE
|
|
#include "MemMap.h"
|
|
|
|
#define COMM_START_SEC_CODE
|
|
#include "MemMap.h"
|
|
void SchM_Enter_ComM_COMM_EXCLUSIVE_AREA_1(void)
|
|
{
|
|
/* Protects against task interruptions -> no locking needed, because all main functions are on same task */
|
|
}
|
|
|
|
void SchM_Exit_ComM_COMM_EXCLUSIVE_AREA_1(void)
|
|
{
|
|
/* Protects against task interruptions -> no locking needed, because all main functions are on same task */
|
|
}
|
|
#define COMM_STOP_SEC_CODE
|
|
#include "MemMap.h"
|
|
# endif /* !BRS_ENABLE_CAN_CLASSIC_SUPPORT */
|
|
# endif /* !BRS_ENABLE_FBL_SUPPORT */
|
|
# endif /* Can_30_Core_IsHardwareCancelByApplOfGeneralFeature(0u) &&
|
|
Can_30_Core_IsHardwareLoopCheckOfGeneralFeature(0u) */
|
|
# endif /* BRS_ENABLE_CAN_CORE_SUPPORT */
|
|
# endif /* BRS_ENABLE_CAN_SUPPORT */
|
|
#endif /* !BRSMAINAPPL_DISABLE_CAN_EXCLUSIVEAREA_HANDLING */
|