HwA_Flagchip_FC7240_V2/Inc/HwA_crm.h

378 lines
10 KiB
C

/**
* @file HwA_crm.h
* @author Flagchip
* @brief CRM register API
* @version 2.5.0
* @date 2025-08-22
*
* SDK Version: 2.6.0
*
* @copyright Copyright (c) 2020-2025 Flagchip Semiconductors Co., Ltd.
*
*/
/* ********************************************************************************
* Revision History:
*
* Version Date Initials CR# Descriptions
* --------- ---------- ------------ ---------- ---------------
* 2.5.0 2025-8-22 Flagchip112 N/A Release version for FC7300FDDT1C
******************************************************************************** */
#ifndef _HWA_CRM_H_
#define _HWA_CRM_H_
#include "device_header.h"
#include "module_driver_flexcan.h"
#if CRM_INSTANCE_COUNT > 0U
/* ################################################################################## */
/* ####################################### Macro #################################### */
/**
* @brief CAN router interrupt type
*/
typedef enum
{
CRM_CANR_INT_MAP_MULTI, /* Multiple mapping interrupt */
CRM_CANR_INT_MAP_NONE, /* No mapping interrupt */
CRM_CANR_INT_MAP_DONE, /* Mapping done interrupt */
CRM_CANR_INT_BUSY, /* Busy interrupt */
CRM_CANR_INT_MAP_SELF /* Self mapping interrupt */
} CRM_IntType;
/**
* @brief Structure for CRM interrupt mask configuration
*
* Bitfield configuration matches CRM_CANR_IEN register layout:
* - MAP_MULTI_IE: Multiple mapping error flag interrupt enable (bit31)
* - MAP_NONE_IE: No mapping error flag interrupt enable (bit30)
* - MAP_DONE_IE: Mapping completion flag interrupt enable (bit24)
* - BUSY_IE: Busy state flag interrupt enable (bit8)
* - MAP_SELF_IE: Self-mapping flag interrupt enable (bit0)
*/
typedef struct
{
bool bMapMultiIE;
bool bMapNoneIE;
bool bMapDoneIE;
bool bBusyIE;
bool bMapSelfIE;
} CRM_IntMaskType;
/********* Local inline function ************/
/* ---------------------------- Channel Registers ----------------------------- */
/**
* @brief Set MATCH_ID0 register for specified channel
* @param ch Channel number (CRM_CH0-CRM_CH3)
* @param u32val Value to set
*/
LOCAL_INLINE void CRM_HWA_Set_CH_MATCH_ID0(CRM_ChannelIndex eChannel, FLEXCAN_IdType eIdType, uint32_t u32val)
{
uint32_t u32valtemp = 0;
if(FLEXCAN_ID_STD == eIdType)
{
u32valtemp = u32val << 18;
}else
{
u32valtemp = u32val;
}
switch (eChannel)
{
case CRM_CH0: CRM->CH0_MATCH_ID0 = u32valtemp; break;
case CRM_CH1: CRM->CH1_MATCH_ID0 = u32valtemp; break;
case CRM_CH2: CRM->CH2_MATCH_ID0 = u32valtemp; break;
case CRM_CH3: CRM->CH3_MATCH_ID0 = u32valtemp; break;
default: break;
}
}
/**
* @brief Set MATCH_ID1 register for specified channel
* @param ch Channel number (CRM_CH0-CRM_CH3)
* @param u32val Value to set
*/
LOCAL_INLINE void CRM_HWA_Set_CH_MATCH_ID1(CRM_ChannelIndex eChannel, FLEXCAN_IdType eIdType, uint32_t u32val)
{
uint32_t u32valtemp = 0;
if(FLEXCAN_ID_STD == eIdType)
{
u32valtemp = u32val << 18;
}else
{
u32valtemp = u32val;
}
switch (eChannel)
{
case CRM_CH0: CRM->CH0_MATCH_ID1 = u32valtemp; break;
case CRM_CH1: CRM->CH1_MATCH_ID1 = u32valtemp; break;
case CRM_CH2: CRM->CH2_MATCH_ID1 = u32valtemp; break;
case CRM_CH3: CRM->CH3_MATCH_ID1 = u32valtemp; break;
default: break;
}
}
/**
* @brief Set ROUTER_ID0 register for specified channel
* @param ch Channel number (CRM_CH0-CRM_CH3)
* @param u32val Value to set
*/
LOCAL_INLINE void CRM_HWA_Set_CH_ROUTER_ID0(CRM_ChannelIndex ch, FLEXCAN_IdType eIdType, uint32_t u32val)
{
uint32_t u32valtemp = 0;
if(FLEXCAN_ID_STD == eIdType)
{
u32valtemp = u32val << 18;
}else
{
u32valtemp = u32val;
}
switch (ch)
{
case CRM_CH0: CRM->CH0_ROUTER_ID0 = u32valtemp; break;
case CRM_CH1: CRM->CH1_ROUTER_ID0 = u32valtemp; break;
case CRM_CH2: CRM->CH2_ROUTER_ID0 = u32valtemp; break;
case CRM_CH3: CRM->CH3_ROUTER_ID0 = u32valtemp; break;
default: break;
}
}
/**
* @brief Set ROUTER_CS0 register for specified channel
* @param ch Channel number (CRM_CH0-CRM_CH3)
* @param u32val Value to set
*/
LOCAL_INLINE void CRM_HWA_Set_CH_ROUTER_CS0(CRM_ChannelIndex ch, uint32_t u32val)
{
switch (ch)
{
case CRM_CH0: CRM->CH0_ROUTER_CS0 = u32val; break;
case CRM_CH1: CRM->CH1_ROUTER_CS0 = u32val; break;
case CRM_CH2: CRM->CH2_ROUTER_CS0 = u32val; break;
case CRM_CH3: CRM->CH3_ROUTER_CS0 = u32val; break;
default: break;
}
}
/**
* @brief Set ROUTER_ID1 register for specified channel
* @param ch Channel number (CRM_CH0-CRM_CH3)
* @param u32val Value to set
*/
LOCAL_INLINE void CRM_HWA_Set_CH_ROUTER_ID1(CRM_ChannelIndex ch, FLEXCAN_IdType eIdType, uint32_t u32val)
{
uint32_t u32valtemp = 0;
if(FLEXCAN_ID_STD == eIdType)
{
u32valtemp = u32val << 18;
}else
{
u32valtemp = u32val;
}
switch (ch)
{
case CRM_CH0: CRM->CH0_ROUTER_ID1 = u32valtemp; break;
case CRM_CH1: CRM->CH1_ROUTER_ID1 = u32valtemp; break;
case CRM_CH2: CRM->CH2_ROUTER_ID1 = u32valtemp; break;
case CRM_CH3: CRM->CH3_ROUTER_ID1 = u32valtemp; break;
default: break;
}
}
/**
* @brief Set ROUTER_CS1 register for specified channel
* @param ch Channel number (CRM_CH0-CRM_CH3)
* @param u32val Value to set
*/
LOCAL_INLINE void CRM_HWA_Set_CH_ROUTER_CS1(CRM_ChannelIndex ch, uint32_t u32val)
{
switch (ch)
{
case CRM_CH0: CRM->CH0_ROUTER_CS1 = u32val; break;
case CRM_CH1: CRM->CH1_ROUTER_CS1 = u32val; break;
case CRM_CH2: CRM->CH2_ROUTER_CS1 = u32val; break;
case CRM_CH3: CRM->CH3_ROUTER_CS1 = u32val; break;
default: break;
}
}
/**
* @brief Set MATCH_MASK register for specified channel
* @param ch Channel number (CRM_CH0-CRM_CH3)
* @param u32val Value to set
*/
LOCAL_INLINE void CRM_HWA_Set_CH_MATCH_MASK(CRM_ChannelIndex ch, FLEXCAN_IdType eIdType, uint32_t u32val)
{
uint32_t u32valtemp = 0;
if(FLEXCAN_ID_STD == eIdType)
{
u32valtemp = u32val << 18;
}else
{
u32valtemp = u32val;
}
switch (ch)
{
case CRM_CH0: CRM->CH0_MATCH_MASK = u32valtemp; break;
case CRM_CH1: CRM->CH1_MATCH_MASK = u32valtemp; break;
case CRM_CH2: CRM->CH2_MATCH_MASK = u32valtemp; break;
case CRM_CH3: CRM->CH3_MATCH_MASK = u32valtemp; break;
default: break;
}
}
/**
* @brief Get MAP_CS register value for specified channel (read-only)
* @param ch Channel number (CRM_CH0-CRM_CH3)
* @return Register value
*/
LOCAL_INLINE uint32_t CRM_HWA_Get_CH_MAP_CS(CRM_ChannelIndex ch)
{
switch (ch)
{
case CRM_CH0: return CRM->CH0_MAP_CS;
case CRM_CH1: return CRM->CH1_MAP_CS;
case CRM_CH2: return CRM->CH2_MAP_CS;
case CRM_CH3: return CRM->CH3_MAP_CS;
default: return 0;
}
}
/**
* @brief Get MAP_ID register value for specified channel (read-only)
* @param ch Channel number (CRM_CH0-CRM_CH3)
* @return Register value
*/
LOCAL_INLINE uint32_t CRM_HWA_Get_CH_MAP_ID(CRM_ChannelIndex ch)
{
switch (ch)
{
case CRM_CH0: return CRM->CH0_MAP_ID;
case CRM_CH1: return CRM->CH1_MAP_ID;
case CRM_CH2: return CRM->CH2_MAP_ID;
case CRM_CH3: return CRM->CH3_MAP_ID;
default: return 0;
}
}
/* -------------------------- CAN Router Registers ---------------------------- */
/**
* @brief Enable specific CAN router interrupt
* @param eIntType Interrupt type to enable
* @param chMask Channel mask (only for channel-specific interrupts)
*/
LOCAL_INLINE void CRM_HWA_EnableCanrInt(CRM_ChannelIndex ch, CRM_IntMaskType chMask)
{
uint32_t u32RegVal = CRM->CANR_IEN;
u32RegVal |= CRM_CANR_STATUS_MAP_MULTI_FLAG(chMask.bMapMultiIE);
u32RegVal |= CRM_CANR_STATUS_MAP_NONE_FLAG(chMask.bMapNoneIE);
u32RegVal |= CRM_CANR_STATUS_MAP_DONE_FLAG((chMask.bMapDoneIE) << ch);
u32RegVal |= CRM_CANR_STATUS_BUSY_FLAG((chMask.bBusyIE) << ch);
u32RegVal |= CRM_CANR_STATUS_MAP_SELF_FLAG((chMask.bMapSelfIE) << ch);
CRM->CANR_IEN = u32RegVal;
}
/**
* @brief Disable specific CAN router interrupt
* @param eIntType Interrupt type to disable
* @param chMask Channel mask (only for channel-specific interrupts)
*/
LOCAL_INLINE void CRM_HWA_DisableCanrInt(CRM_ChannelIndex ch)
{
uint32_t u32RegVal = 0;
u32RegVal |= CRM_CANR_STATUS_MAP_MULTI_FLAG(1U);
u32RegVal |= CRM_CANR_STATUS_MAP_NONE_FLAG(1U);
u32RegVal |= CRM_CANR_STATUS_MAP_DONE_FLAG(1U << ch);
u32RegVal |= CRM_CANR_STATUS_BUSY_FLAG(1U << ch);
u32RegVal |= CRM_CANR_STATUS_MAP_SELF_FLAG(1U << ch);
CRM->CANR_IEN &= ~u32RegVal;
}
/**
* @brief Get CANR_STATUS register value
* @return Register value
*/
LOCAL_INLINE uint32_t CRM_HWA_Get_CANR_STATUS(void)
{
return CRM->CANR_STATUS;
}
/**
* @brief Clear specific status flag in CANR_STATUS
* @param eIntType Status flag type to clear
* @param chMask Channel mask (only for channel-specific flags)
*/
LOCAL_INLINE void CRM_HWA_ClearCanrStatus(CRM_IntType eIntType, uint8_t chMask)
{
uint32_t u32RegVal = CRM->CANR_STATUS;
switch (eIntType)
{
case CRM_CANR_INT_MAP_MULTI:
u32RegVal &= ~CRM_CANR_STATUS_MAP_MULTI_FLAG_MASK;
break;
case CRM_CANR_INT_MAP_NONE:
u32RegVal &= ~CRM_CANR_STATUS_MAP_NONE_FLAG_MASK;
break;
case CRM_CANR_INT_MAP_DONE:
u32RegVal &= ~(chMask << CRM_CANR_STATUS_MAP_DONE_FLAG_SHIFT);
break;
case CRM_CANR_INT_BUSY:
u32RegVal &= ~(chMask << CRM_CANR_STATUS_BUSY_FLAG_SHIFT);
break;
case CRM_CANR_INT_MAP_SELF:
u32RegVal &= ~(chMask << CRM_CANR_STATUS_MAP_SELF_FLAG_SHIFT);
break;
default:
break;
}
CRM->CANR_STATUS = u32RegVal;
}
/**
* @brief Set CANR_CTRL register value
* @param u32val Value to set
*/
LOCAL_INLINE void CRM_HWA_Set_CANR_CTRL(uint32_t u32val)
{
CRM->CANR_CTRL = u32val & CRM_CANR_CTRL_MASK;
}
/**
* @brief Get CANR_CTRL register value
* @return Register value
*/
LOCAL_INLINE uint32_t CRM_HWA_Get_CANR_CTRL(void)
{
return CRM->CANR_CTRL;
}
/**
* @brief Enable specific channel in CAN router
* @param ch Channel to enable
*/
LOCAL_INLINE void CRM_HWA_EnableChannel(CRM_ChannelIndex ch)
{
CRM->CANR_CTRL |= (1 << ch);
}
/**
* @brief Disable specific channel in CAN router
* @param ch Channel to disable
*/
LOCAL_INLINE void CRM_HWA_DisableChannel(CRM_ChannelIndex ch)
{
CRM->CANR_CTRL &= ~(1 << ch);
}
/** @}*/
#endif /* CRM_INSTANCE_COUNT > 0U */
#endif /* HWA_INCLUDE_HWA_crm_H_ */