ADM/GW/RTD/src/Lpuart_Lin_Ip_Hw_Access.c
2024-08-08 10:00:15 +09:00

356 lines
16 KiB
C

/*==================================================================================================
* Project : RTD AUTOSAR 4.4
* Platform : CORTEXM
* Peripheral : LPUART
* Dependencies : none
*
* Autosar Version : 4.4.0
* Autosar Revision : ASR_REL_4_4_REV_0000
* Autosar Conf.Variant :
* SW Version : 0.9.0
* Build Version : S32K3_RTD_0_9_0__ASR_REL_4_4_REV_0000_20210326
*
* (c) Copyright 2020 - 2021 NXP Semiconductors
* All Rights Reserved.
*
* NXP Confidential. This software is owned or controlled by NXP and may only be
* used strictly in accordance with the applicable license terms. By expressly
* accepting such terms or by downloading, installing, activating and/or otherwise
* using the software, you are agreeing that you have read, and that you agree to
* comply with and are bound by, such license terms. If you do not agree to be
* bound by the applicable license terms, then you may not retain, install,
* activate or otherwise use the software.
==================================================================================================*/
/**
* @file Lpuart_Lin_Ip_Hw_Access.c
*
* @addtogroup LPUART_LIN_IP
* @{
*/
#ifdef __cplusplus
extern "C"{
#endif
/*==================================================================================================
* INCLUDE FILES
* 1) system and project includes
* 2) needed interfaces from external units
* 3) internal and external interfaces from this unit
==================================================================================================*/
#include "Lpuart_Lin_Ip_Hw_Access.h"
/*==================================================================================================
* SOURCE FILE VERSION INFORMATION
==================================================================================================*/
#define LPUART_LIN_IP_HW_ACCESS_VENDOR_ID_C 43
#define LPUART_LIN_IP_HW_ACCESS_AR_RELEASE_MAJOR_VERSION_C 4
#define LPUART_LIN_IP_HW_ACCESS_AR_RELEASE_MINOR_VERSION_C 4
#define LPUART_LIN_IP_HW_ACCESS_AR_RELEASE_REVISION_VERSION_C 0
#define LPUART_LIN_IP_HW_ACCESS_SW_MAJOR_VERSION_C 0
#define LPUART_LIN_IP_HW_ACCESS_SW_MINOR_VERSION_C 9
#define LPUART_LIN_IP_HW_ACCESS_SW_PATCH_VERSION_C 0
/*==================================================================================================
* FILE VERSION CHECKS
==================================================================================================*/
#if (LPUART_LIN_IP_HW_ACCESS_VENDOR_ID_C != LPUART_LIN_IP_HW_ACCESS_VENDOR_ID)
#error "Lpuart_Lin_Ip_Hw_Access.c and Lpuart_Lin_Ip_Hw_Access.h have different vendor ids"
#endif
/* Check if current file and Lpuart_Lin_Ip_Hw_Access header file are of the same Autosar version */
#if ((LPUART_LIN_IP_HW_ACCESS_AR_RELEASE_MAJOR_VERSION_C != LPUART_LIN_IP_HW_ACCESS_AR_RELEASE_MAJOR_VERSION) || \
(LPUART_LIN_IP_HW_ACCESS_AR_RELEASE_MINOR_VERSION_C != LPUART_LIN_IP_HW_ACCESS_AR_RELEASE_MINOR_VERSION) || \
(LPUART_LIN_IP_HW_ACCESS_AR_RELEASE_REVISION_VERSION_C != LPUART_LIN_IP_HW_ACCESS_AR_RELEASE_REVISION_VERSION) )
#error "Software Version Numbers of Lpuart_Lin_Ip_Hw_Access.c and Lpuart_Lin_Ip_Hw_Access.h are different"
#endif
/* Check if current file and Lpuart_Lin_Ip_Hw_Access header file are of the same Software version */
#if ((LPUART_LIN_IP_HW_ACCESS_SW_MAJOR_VERSION_C != LPUART_LIN_IP_HW_ACCESS_SW_MAJOR_VERSION) || \
(LPUART_LIN_IP_HW_ACCESS_SW_MINOR_VERSION_C != LPUART_LIN_IP_HW_ACCESS_SW_MINOR_VERSION) || \
(LPUART_LIN_IP_HW_ACCESS_SW_PATCH_VERSION_C != LPUART_LIN_IP_HW_ACCESS_SW_PATCH_VERSION) )
#error "Software Version Numbers of Lpuart_Lin_Ip_Hw_Access.c and Lpuart_Lin_Ip_Hw_Access.h are different"
#endif
/*==================================================================================================
* LOCAL TYPEDEFS (STRUCTURES, UNIONS, ENUMS)
==================================================================================================*/
/*==================================================================================================
* LOCAL MACROS
==================================================================================================*/
/*==================================================================================================
* LOCAL CONSTANTS
==================================================================================================*/
/*==================================================================================================
* LOCAL VARIABLES
==================================================================================================*/
/*==================================================================================================
* GLOBAL CONSTANTS
==================================================================================================*/
/*==================================================================================================
* GLOBAL VARIABLES
==================================================================================================*/
/*==================================================================================================
* LOCAL FUNCTION PROTOTYPES
==================================================================================================*/
/*==================================================================================================
* LOCAL FUNCTIONS
==================================================================================================*/
/*==================================================================================================
* GLOBAL FUNCTIONS
==================================================================================================*/
#define LIN_START_SEC_CODE
#include "Lin_MemMap.h"
/*FUNCTION**********************************************************************
*
* Function Name : Lpuart_Lin_Ip_HwInit
* Description : Initializes the LPUART controller to known state, using
* register reset values defined in the reference manual.
*END**************************************************************************/
void Lpuart_Lin_Ip_HwInit(LPUART_Type * base)
{
/* Set the default oversampling ratio (16) and baud-rate divider (4) */
base->BAUD = ((uint32)((LPUART_LIN_IP_DEFAULT_OSR << LPUART_BAUD_OSR_SHIFT) | \
(LPUART_LIN_IP_DEFAULT_SBR << LPUART_BAUD_SBR_SHIFT)));
/* Clear the error/interrupt flags */
base->STAT = LPUART_LIN_IP_STAT_REG_FLAGS_MASK;
/* Reset all features/interrupts by default */
base->CTRL = 0x00000000;
/* Reset match addresses */
base->MATCH = 0x00000000;
}
/*FUNCTION**********************************************************************
*
* Function Name : Lpuart_Lin_Ip_HwSetBitCountPerChar
* Description : Configures the number of bits per char in LPUART controller.
* In some LPUART instances, the user should disable the transmitter/receiver
* before calling this function.
* Generally, this may be applied to all LPUARTs to ensure safe operation.
*END**************************************************************************/
void Lpuart_Lin_Ip_HwSetBitCountPerChar(LPUART_Type * base, Lpuart_Lin_Ip_BitCountPerCharType bitCountPerChar, boolean parity)
{
uint32 tmpBitCountPerChar = (uint32)bitCountPerChar;
if (parity)
{
tmpBitCountPerChar += 1U;
}
if (tmpBitCountPerChar == (uint32)LPUART_LIN_IP_10_BITS_PER_CHAR)
{
base->BAUD = (base->BAUD & ~LPUART_BAUD_M10_MASK) | ((uint32)1U << LPUART_BAUD_M10_SHIFT);
}
else
{
/* config 8-bit (M=0) or 9-bits (M=1) */
base->CTRL = (base->CTRL & ~LPUART_CTRL_M_MASK) | (tmpBitCountPerChar << LPUART_CTRL_M_SHIFT);
/* clear M10 to make sure not 10-bit mode */
base->BAUD &= ~LPUART_BAUD_M10_MASK;
}
}
/*FUNCTION**********************************************************************
*
* Function Name : Lpuart_Lin_Ip_HwSetParityMode
* Description : Configures parity mode in the LPUART controller.
* In some LPUART instances, the user should disable the transmitter/receiver
* before calling this function.
* Generally, this may be applied to all LPUARTs to ensure safe operation.
*END**************************************************************************/
void Lpuart_Lin_Ip_HwSetParityMode(LPUART_Type * base, Lpuart_Lin_Ip_ParityModeType parityModeType)
{
base->CTRL = (base->CTRL & ~LPUART_CTRL_PE_MASK) | (((uint32)parityModeType >> 1U) << LPUART_CTRL_PE_SHIFT);
base->CTRL = (base->CTRL & ~LPUART_CTRL_PT_MASK) | (((uint32)parityModeType & 1U) << LPUART_CTRL_PT_SHIFT);
}
/*FUNCTION**********************************************************************
*
* Function Name : Lpuart_Lin_Ip_HwSetIntMode
* Description : Configures the LPUART module interrupts to enable/disable
* various interrupt sources.
*END**************************************************************************/
void Lpuart_Lin_Ip_HwSetIntMode(LPUART_Type * base, Lpuart_Lin_Ip_InterruptType intSrc, boolean enable)
{
uint32 reg = (uint32)(intSrc) >> LPUART_LIN_IP_SHIFT;
uint32 intRegOffset = (uint16)(intSrc);
SchM_Enter_Lin_LIN_EXCLUSIVE_AREA_03();
{
switch (reg)
{
case LPUART_LIN_IP_BAUD_REG_ID:
base->BAUD = (base->BAUD & ~(1UL << intRegOffset)) | ((enable ? 1U : 0U) << intRegOffset);
break;
case LPUART_LIN_IP_CTRL_REG_ID:
base->CTRL = (base->CTRL & ~(1UL << intRegOffset)) | ((enable ? 1U : 0U) << intRegOffset);
break;
default :
/* Invalid parameter: return */
break;
}
}
SchM_Exit_Lin_LIN_EXCLUSIVE_AREA_03();
}
/*FUNCTION**********************************************************************
*
* Function Name : Lpuart_Lin_Ip_HwGetIntMode
* Description : Returns whether LPUART module interrupt is enabled/disabled.
*END**************************************************************************/
boolean Lpuart_Lin_Ip_HwGetIntMode(const LPUART_Type * base, Lpuart_Lin_Ip_InterruptType intSrc)
{
uint32 reg = (uint32)(intSrc) >> LPUART_LIN_IP_SHIFT;
boolean retVal = FALSE;
switch ( reg )
{
case LPUART_LIN_IP_BAUD_REG_ID:
retVal = (((base->BAUD >> (uint16)(intSrc)) & 1U) > 0U);
break;
case LPUART_LIN_IP_CTRL_REG_ID:
retVal = (((base->CTRL >> (uint16)(intSrc)) & 1U) > 0U);
break;
default :
/* Invalid parameter: return */
break;
}
return retVal;
}
/*FUNCTION**********************************************************************
*
* Function Name : Lpuart_Lin_Ip_HwGetStatusFlag
* Description : LPUART get status flag by passing flag enum.
*END**************************************************************************/
boolean Lpuart_Lin_Ip_HwGetStatusFlag(const LPUART_Type * base, Lpuart_Lin_Ip_StatusFlagType statusFlag)
{
uint32 reg = (uint32)(statusFlag) >> LPUART_LIN_IP_SHIFT;
boolean retVal = FALSE;
switch ( reg )
{
case LPUART_LIN_IP_STAT_REG_ID:
retVal = (((base->STAT >> (uint16)(statusFlag)) & 1U) > 0U);
break;
case LPUART_LIN_IP_DATA_REG_ID:
retVal = (((base->DATA >> (uint16)(statusFlag)) & 1U) > 0U);
break;
default:
/* Invalid parameter: return */
break;
}
return retVal;
}
/*FUNCTION**********************************************************************
*
* Function Name : Lpuart_Lin_Ip_HwClearStatusFlag
* Description : LPUART clears an individual status flag
* (see Lpuart_Lin_Ip_StatusFlagType for list of status bits).
*END**************************************************************************/
Lpuart_Lin_Ip_StatusType Lpuart_Lin_Ip_HwClearStatusFlag(LPUART_Type * base,
Lpuart_Lin_Ip_StatusFlagType statusFlag)
{
Lpuart_Lin_Ip_StatusType returnCode = LPUART_LIN_IP_STATUS_SUCCESS;
switch(statusFlag)
{
/* These flags are cleared automatically by other lpuart operations
* and cannot be manually cleared, return error code */
case LPUART_LIN_IP_TX_DATA_REG_EMPTY:
case LPUART_LIN_IP_TX_COMPLETE:
case LPUART_LIN_IP_RX_DATA_REG_FULL:
case LPUART_LIN_IP_RX_ACTIVE:
#if LPUART_LIN_IP_HAS_EXTENDED_DATA_REGISTER_FLAGS
case LPUART_LIN_IP_NOISE_IN_CURRENT_WORD:
case LPUART_LIN_IP_PARITY_ERR_IN_CURRENT_WORD:
#endif
returnCode = LPUART_LIN_IP_STATUS_ERROR;
break;
case LPUART_LIN_IP_IDLE_LINE_DETECT:
base->STAT = (base->STAT & (~LPUART_LIN_IP_STAT_REG_FLAGS_MASK)) | LPUART_STAT_IDLE_MASK;
break;
case LPUART_LIN_IP_RX_OVERRUN:
base->STAT = (base->STAT & (~LPUART_LIN_IP_STAT_REG_FLAGS_MASK)) | LPUART_STAT_OR_MASK;
break;
case LPUART_LIN_IP_NOISE_DETECT:
base->STAT = (base->STAT & (~LPUART_LIN_IP_STAT_REG_FLAGS_MASK)) | LPUART_STAT_NF_MASK;
break;
case LPUART_LIN_IP_FRAME_ERR:
base->STAT = (base->STAT & (~LPUART_LIN_IP_STAT_REG_FLAGS_MASK)) | LPUART_STAT_FE_MASK;
break;
case LPUART_LIN_IP_PARITY_ERR:
base->STAT = (base->STAT & (~LPUART_LIN_IP_STAT_REG_FLAGS_MASK)) | LPUART_STAT_PF_MASK;
break;
case LPUART_LIN_IP_BREAK_DETECT:
base->STAT = (base->STAT & (~LPUART_LIN_IP_STAT_REG_FLAGS_MASK)) | LPUART_STAT_LBKDIF_MASK;
break;
case LPUART_LIN_IP_RX_ACTIVE_EDGE_DETECT:
base->STAT = (base->STAT & (~LPUART_LIN_IP_STAT_REG_FLAGS_MASK)) | LPUART_STAT_RXEDGIF_MASK;
break;
case LPUART_LIN_IP_ALL_INT_FLAGS:
base->STAT = (base->STAT & (~LPUART_LIN_IP_STAT_REG_FLAGS_MASK)) | LPUART_LIN_IP_STAT_ALL_INT_FLAGS_MASK_U32;
break;
default:
returnCode = LPUART_LIN_IP_STATUS_ERROR;
break;
}
return (returnCode);
}
/*FUNCTION**********************************************************************
*
* Function Name : Lpuart_Lin_Ip_StartTimeout
* Description : Checks for timeout condition
*
*END**************************************************************************/
void Lpuart_Lin_Ip_StartTimeout(uint32 *startTimeOut, uint32 *timeoutTicksOut, uint32 timeoutUs, OsIf_CounterType osifCounter)
{
*startTimeOut = OsIf_GetCounter(osifCounter);
*timeoutTicksOut = OsIf_MicrosToTicks(timeoutUs, osifCounter);
}
/*FUNCTION**********************************************************************
*
* Function Name : Lpuart_Lin_Ip_TimeoutExpired
* Description : Checks for timeout expiration condition
*
*END**************************************************************************/
boolean Lpuart_Lin_Ip_TimeoutExpired(uint32 startTime, uint32 timeoutTicks, OsIf_CounterType osifCounter)
{
uint32 tempTime = startTime;
uint32 elapsedTime = OsIf_GetElapsed(&tempTime, osifCounter);
return ((elapsedTime >= timeoutTicks)? TRUE : FALSE);
}
#define LIN_STOP_SEC_CODE
#include "Lin_MemMap.h"
#ifdef __cplusplus
}
#endif
/** @} */