ADM/GW/RTD/include/Lpuart_Lin_Ip.h
2024-08-08 10:00:15 +09:00

461 lines
21 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.
==================================================================================================*/
#ifndef LPUART_LIN_IP_H
#define LPUART_LIN_IP_H
/**
* @file
* @defgroup lpuart_lin_ip Lpuart Lin IPL
* @addtogroup lpuart_lin_ip Lpuart Lin IPL
* @{
*/
#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"
#include "Lpuart_Lin_Ip_Cfg.h"
#include "Lin_Ip_Common.h"
#include "Lpuart_Lin_Ip_Types.h"
/*==================================================================================================
* SOURCE FILE VERSION INFORMATION
==================================================================================================*/
#define LPUART_LIN_IP_VENDOR_ID 43
#define LPUART_LIN_IP_AR_RELEASE_MAJOR_VERSION 4
#define LPUART_LIN_IP_AR_RELEASE_MINOR_VERSION 4
#define LPUART_LIN_IP_AR_RELEASE_REVISION_VERSION 0
#define LPUART_LIN_IP_SW_MAJOR_VERSION 0
#define LPUART_LIN_IP_SW_MINOR_VERSION 9
#define LPUART_LIN_IP_SW_PATCH_VERSION 0
/*==================================================================================================
* FILE VERSION CHECKS
==================================================================================================*/
/* Checks against Lpuart_Lin_Ip_Hw_Access.h */
#if (LPUART_LIN_IP_VENDOR_ID != LPUART_LIN_IP_HW_ACCESS_VENDOR_ID)
#error "Lpuart_Lin_Ip.h 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_AR_RELEASE_MAJOR_VERSION != LPUART_LIN_IP_HW_ACCESS_AR_RELEASE_MAJOR_VERSION) || \
(LPUART_LIN_IP_AR_RELEASE_MINOR_VERSION != LPUART_LIN_IP_HW_ACCESS_AR_RELEASE_MINOR_VERSION) || \
(LPUART_LIN_IP_AR_RELEASE_REVISION_VERSION != LPUART_LIN_IP_HW_ACCESS_AR_RELEASE_REVISION_VERSION))
#error "AUTOSAR Version Numbers of Lpuart_Lin_Ip.h 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_SW_MAJOR_VERSION != LPUART_LIN_IP_HW_ACCESS_SW_MAJOR_VERSION) || \
(LPUART_LIN_IP_SW_MINOR_VERSION != LPUART_LIN_IP_HW_ACCESS_SW_MINOR_VERSION) || \
(LPUART_LIN_IP_SW_PATCH_VERSION != LPUART_LIN_IP_HW_ACCESS_SW_PATCH_VERSION) \
)
#error "Software Version Numbers of Lpuart_Lin_Ip.h and Lpuart_Lin_Ip_Hw_Access.h are different"
#endif
/* Checks against Lpuart_Lin_Ip_Cfg.h */
#if (LPUART_LIN_IP_VENDOR_ID != LPUART_LIN_IP_CFG_VENDOR_ID)
#error "Lpuart_Lin_Ip.h and Lpuart_Lin_Ip_Cfg.h have different vendor ids"
#endif
/* Check if current file and Lpuart_Lin_Ip_Cfg header file are of the same Autosar version */
#if ((LPUART_LIN_IP_AR_RELEASE_MAJOR_VERSION != LPUART_LIN_IP_CFG_AR_RELEASE_MAJOR_VERSION) || \
(LPUART_LIN_IP_AR_RELEASE_MINOR_VERSION != LPUART_LIN_IP_CFG_AR_RELEASE_MINOR_VERSION) || \
(LPUART_LIN_IP_AR_RELEASE_REVISION_VERSION != LPUART_LIN_IP_CFG_AR_RELEASE_REVISION_VERSION))
#error "AUTOSAR Version Numbers of Lpuart_Lin_Ip.h and Lpuart_Lin_Ip_Cfg.h are different"
#endif
/* Check if current file and Lpuart_Lin_Ip_Cfg header file are of the same Software version */
#if ((LPUART_LIN_IP_SW_MAJOR_VERSION != LPUART_LIN_IP_CFG_SW_MAJOR_VERSION) || \
(LPUART_LIN_IP_SW_MINOR_VERSION != LPUART_LIN_IP_CFG_SW_MINOR_VERSION) || \
(LPUART_LIN_IP_SW_PATCH_VERSION != LPUART_LIN_IP_CFG_SW_PATCH_VERSION) \
)
#error "Software Version Numbers of Lpuart_Lin_Ip.h and Lpuart_Lin_Ip_Cfg.h are different"
#endif
/* Checks against Lin_Ip_Common.h */
#if (LPUART_LIN_IP_VENDOR_ID != LIN_IP_COMMON_VENDOR_ID)
#error "Lpuart_Lin_Ip.h and Lin_Ip_Common.h have different vendor ids"
#endif
/* Check if current file and Lin_Ip_Common header file are of the same Autosar version */
#if ((LPUART_LIN_IP_AR_RELEASE_MAJOR_VERSION != LIN_IP_COMMON_AR_RELEASE_MAJOR_VERSION) || \
(LPUART_LIN_IP_AR_RELEASE_MINOR_VERSION != LIN_IP_COMMON_AR_RELEASE_MINOR_VERSION) || \
(LPUART_LIN_IP_AR_RELEASE_REVISION_VERSION != LIN_IP_COMMON_AR_RELEASE_REVISION_VERSION))
#error "AUTOSAR Version Numbers of Lpuart_Lin_Ip.h and Lin_Ip_Common.h are different"
#endif
/* Check if current file and Lin_Ip_Common header file are of the same Software version */
#if ((LPUART_LIN_IP_SW_MAJOR_VERSION != LIN_IP_COMMON_SW_MAJOR_VERSION) || \
(LPUART_LIN_IP_SW_MINOR_VERSION != LIN_IP_COMMON_SW_MINOR_VERSION) || \
(LPUART_LIN_IP_SW_PATCH_VERSION != LIN_IP_COMMON_SW_PATCH_VERSION) \
)
#error "Software Version Numbers of Lpuart_Lin_Ip.h and Lin_Ip_Common.h are different"
#endif
/* Checks against Lpuart_Lin_Ip_Types.h */
#if (LPUART_LIN_IP_VENDOR_ID != LPUART_LIN_IP_TYPES_VENDOR_ID)
#error "Lpuart_Lin_Ip.h and Lpuart_Lin_Ip_Types.h have different vendor ids"
#endif
/* Check if current file and Lpuart_Lin_Ip_Types header file are of the same Autosar version */
#if ((LPUART_LIN_IP_AR_RELEASE_MAJOR_VERSION != LPUART_LIN_IP_TYPES_AR_RELEASE_MAJOR_VERSION) || \
(LPUART_LIN_IP_AR_RELEASE_MINOR_VERSION != LPUART_LIN_IP_TYPES_AR_RELEASE_MINOR_VERSION) || \
(LPUART_LIN_IP_AR_RELEASE_REVISION_VERSION != LPUART_LIN_IP_TYPES_AR_RELEASE_REVISION_VERSION))
#error "AUTOSAR Version Numbers of Lpuart_Lin_Ip.h and Lpuart_Lin_Ip_Types.h are different"
#endif
/* Check if current file and Lpuart_Lin_Ip_Types header file are of the same Software version */
#if ((LPUART_LIN_IP_SW_MAJOR_VERSION != LPUART_LIN_IP_TYPES_SW_MAJOR_VERSION) || \
(LPUART_LIN_IP_SW_MINOR_VERSION != LPUART_LIN_IP_TYPES_SW_MINOR_VERSION) || \
(LPUART_LIN_IP_SW_PATCH_VERSION != LPUART_LIN_IP_TYPES_SW_PATCH_VERSION) \
)
#error "Software Version Numbers of Lpuart_Lin_Ip.h and Lpuart_Lin_Ip_Types.h are different"
#endif
/*==================================================================================================
* CONSTANTS
==================================================================================================*/
#define LIN_START_SEC_CONFIG_DATA_UNSPECIFIED
#include "Lin_MemMap.h"
/* Calling the external Configuration symbols defined by Lpuart_Lin_Ip_Cfg.h */
LPUART_LIN_IP_CONFIG_EXT
#define LIN_STOP_SEC_CONFIG_DATA_UNSPECIFIED
#include "Lin_MemMap.h"
/*==================================================================================================
* DEFINES AND MACROS
==================================================================================================*/
/*==================================================================================================
* ENUMS
==================================================================================================*/
/*==================================================================================================
* STRUCTURES AND OTHER TYPEDEFS
==================================================================================================*/
/*==================================================================================================
* GLOBAL VARIABLE DECLARATIONS
==================================================================================================*/
/*==================================================================================================
* FUNCTION PROTOTYPES
==================================================================================================*/
#define LIN_START_SEC_CODE
#include "Lin_MemMap.h"
/**
* @brief Initializes an LIN_LPUART instance for LIN Network.
*
* @details The caller provides memory for the driver state structures during initialization.
* The user must select the LIN_LPUART clock source in the application to initialize the LIN_LPUART.
* This function initializes a LPUART instance for operation.
* This function will initialize the run-time state structure to keep track of
* the on-going transfers, initialize the module to user defined settings and
* default settings, set break field length to be 13 bit times minimum, enable
* the break detect interrupt, Rx complete interrupt, frame error detect interrupt,
* and enable the LPUART module transmitter and receiver
*
* @param u32Instance LIN_LPUART instance number
* @param linUserConfig user configuration structure of type #lin_user_config_t
*
* @return void
*
*
*/
void Lpuart_Lin_Ip_Init(const uint32 u32Instance, const Lpuart_Lin_Ip_UserConfigType * pUserConfig);
/**
* @brief Shuts down the LIN_LPUART by disabling interrupts and transmitter/receiver.
*
* @param u32Instance LIN_LPUART instance number
*
* @return void
*
*
*/
void Lpuart_Lin_Ip_Deinit(const uint32 u32Instance);
/**
* @brief Sends frame data out through the LIN_LPUART module using non-blocking method.
*
* @details This enables an a-sync method for transmitting data.
* Non-blocking means that the function returns immediately.
* The application has to get the transmit status to know when the transmit is complete.
* This function will calculate the checksum byte and send it with the frame data.
* If txSize is equal to 0 or greater than 8 or node's current state is in SLEEP mode
* then the function will return LPUART_LIN_IP_STATUS_ERROR. If isBusBusy is currently true then the
* function will return LPUART_LIN_IP_STATUS_BUSY.
*
* @param[in] u32Instance LIN_LPUART instance number
* @param[in] pTxBuff source buffer containing 8-bit data chars to send
* @param[in] u8TxSize the number of bytes to send
*
* @return operation status:
* @retval LPUART_LIN_IP_STATUS_SUCCESS : The transmission is successful.
* @retval LPUART_LIN_IP_STATUS_BUSY : Operation failed due to isBusBusy is currently true.
* @retval LPUART_LIN_IP_STATUS_ERROR : Operation failed due to txSize is equal to 0 or greater than 8
* or node's current state is in SLEEP mode
*
*
*/
Lpuart_Lin_Ip_StatusType Lpuart_Lin_Ip_AsyncSendFrameData(const uint32 u32Instance, const uint8 * pTxBuff, const uint8 u8TxSize);
/**
* @brief Sends frame data out through the LIN_LPUART module using blocking method.
*
* @details This enables a sync method for transmitting data. The frame data will be
* transmitted to the last byte and at the end is checksum byte. If any error occurred,
* the transmission would be suspended and returned LPUART_LIN_IP_STATUS_ERROR.
* Blocking means that the function does not return until the transmission is completed.
* The application can get status of the transmission by return value.
*
*
* @param[in] u32Instance LIN_LPUART instance number
* @param[out] pTxBuff source buffer containing 8-bit data chars to send
* @param[in] u8TxSize the number of bytes to send
*
* @return operation status:
* @retval LPUART_LIN_IP_STATUS_SUCCESS : The transmission is successful.
* @retval LPUART_LIN_IP_STATUS_TIMEOUT : The transmission has timeout.
* @retval LPUART_LIN_IP_STATUS_ERROR : Operation failed due to txSize is equal to 0 or greater than 8
* or node's current state is in SLEEP mode or an error occurred in transmission
*
*
*/
Lpuart_Lin_Ip_StatusType Lpuart_Lin_Ip_SyncSendFrameData(const uint32 u32Instance, const uint8 * pTxBuff, const uint8 u8TxSize);
/**
* @brief Get status of an on-going non-blocking transmission
*
* @details While sending frame data using non-blocking method, users can
* use this function to get status of that transmission.
* This function return LPUART_LIN_IP_STATUS_BUSY while sending, or LPUART_LIN_IP_STATUS_TIMEOUT
* if timeout has occurred, or return LPUART_LIN_IP_STATUS_SUCCESS when the transmission is complete.
* The pBytesRemaining shows number of bytes that still needed to transmit including the CheckSum byte.
*
* @param u32Instance LIN_LPUART instance number
* @param pBytesRemaining Number of bytes still needed to transmit
* @return operation status:
* @retval LPUART_LIN_IP_STATUS_SUCCESS : The transmission is successful.
* @retval LPUART_LIN_IP_STATUS_BUSY : The transmission is sending
* @retval LPUART_LIN_IP_STATUS_TIMEOUT : Operation failed due to timeout has occurred.
*
*
*/
Lpuart_Lin_Ip_StatusType Lpuart_Lin_Ip_GetTransmitStatus(const uint32 u32Instance, uint8 * const pBytesRemaining);
/**
* @brief Receives frame data through the LIN_LPUART module using non-blocking method.
*
* @details This function returns immediately after initiating the receive function.
* The application has to get the receive status to see when the receive is complete.
* The interrupt handler Lpuart_Lin_Ip_IRQHandler will check the checksum byte.
* If the checksum is correct, it will receive the frame data.
* This function also check if rxSize is in range from 1 to 8.
* If not, it will return LPUART_LIN_IP_STATUS_ERROR. This function also returns LPUART_LIN_IP_STATUS_ERROR if
* node's current state is in SLEEP mode. This function checks if the isBusBusy is
* false, if not it will return LPUART_LIN_IP_STATUS_BUSY.
*
* @param[in] u32Instance LIN_LPUART u32Instance number
* @param[out] pRxBuff buffer containing 8-bit received data
* @param[in] u8RxSize the number of bytes to receive
* @return operation status:
* @retval LPUART_LIN_IP_STATUS_SUCCESS : The receives frame data is successful.
* @retval LPUART_LIN_IP_STATUS_BUSY : Bus busy flag is true.
* @retval LPUART_LIN_IP_STATUS_ERROR : Operation failed due is equal to 0 or greater than 8 or
* node's current state is in SLEEP mode
*
*
*/
Lpuart_Lin_Ip_StatusType Lpuart_Lin_Ip_AsyncReceiveFrameData(const uint32 u32Instance, uint8 * pRxBuff, const uint8 u8RxSize);
/**
* @brief Sends frame data out through the LIN_LPUART module using blocking method.
*
* @details This enables a sync method for receiving data. The frame data will be
* received to its the last byte and at the end is checksum byte. If any error occurred,
* the reception would be suspended and returned LPUART_LIN_IP_STATUS_ERROR.
* Blocking means that the function does not return until the reception is completed.
* The application can get status of the reception by return value.
*
*
* @param[in] u32Instance LIN_LPUART instance number
* @param[out] pRxBuff source buffer containing 8-bit data chars to receive
* @param[in] u8RxSize the number of bytes to receive
*
* @return operation status:
* @retval LPUART_LIN_IP_STATUS_SUCCESS : The receives frame data is successful.
* @retval LPUART_LIN_IP_STATUS_TIMEOUT : The transmission has timeout.
* @retval LPUART_LIN_IP_STATUS_BUSY : Bus busy flag is true.
* @retval LPUART_LIN_IP_STATUS_ERROR : Operation failed due to rxSize is equal to 0 or greater than 8
* or node's current state is in SLEEP mode or an error occurred in transmission
*
*
*/
Lpuart_Lin_Ip_StatusType Lpuart_Lin_Ip_SyncReceiveFrameData(const uint32 u32Instance, uint8 * pRxBuff, const uint8 u8RxSize);
/**
* @brief Aborts an on-going non-blocking transmission/reception.
*
* @details While performing a non-blocking transferring data, users can call this function
* to terminate immediately the transferring.
*
* @param u32Instance LIN_LPUART instance number
* @return void
*
*
*/
void Lpuart_Lin_Ip_AbortTransferData(const uint32 u32Instance);
/**
* @brief Get status of an on-going non-blocking reception
* @details While receiving frame data using non-blocking method, users can
* use this function to get status of that receiving.
* This function return the current event ID, LPUART_LIN_IP_STATUS_BUSY while receiving
* and return LPUART_LIN_IP_STATUS_SUCCESS, or timeout (LPUART_LIN_IP_STATUS_TIMEOUT) when the reception is complete.
* The pBytesRemaining shows number of bytes that still needed to receive including the CheckSum byte.
*
* @param u32Instance LIN_LPUART instance number
* @param pBytesRemaining Number of bytes still needed to receive
*
* @return operation status:
* @retval LPUART_LIN_IP_STATUS_SUCCESS : The reception is complete.
* @retval LPUART_LIN_IP_STATUS_TIMEOUT : The reception isn't complete.
* @retval LPUART_LIN_IP_STATUS_BUSY : The reception is on going
*
*
*/
Lpuart_Lin_Ip_StatusType Lpuart_Lin_Ip_GetReceiveStatus(const uint32 u32Instance, uint8 * const pBytesRemaining);
/**
* @brief This function puts current node to sleep mode
* @details This function changes current node state to LIN_NODE_STATE_SLEEP_MODE
*
* @param u32Instance LIN_LPUART instance number
* @return function always return LPUART_LIN_IP_STATUS_SUCCESS
*
*
*/
void Lpuart_Lin_Ip_GoToSleepMode(const uint32 u32Instance);
/**
* @brief Puts current LIN node to Idle state
* This function changes current node state to LIN_NODE_STATE_IDLE
*
* @param u32Instance LIN_LPUART instance number
* @return function always return LPUART_LIN_IP_STATUS_SUCCESS
*
*
*/
void Lpuart_Lin_Ip_GotoIdleState(const uint32 u32Instance);
/**
* @brief Sends a wakeup signal through the LIN_LPUART interface
*
* @param u32Instance LIN_LPUART instance number
* @return operation status:
* @retval LPUART_LIN_IP_STATUS_SUCCESS : Bus busy flag is false.
* @retval LPUART_LIN_IP_STATUS_BUSY : Bus busy flag is true.
*
*
*/
Lpuart_Lin_Ip_StatusType Lpuart_Lin_Ip_SendWakeupSignal(const uint32 u32Instance);
/**
* @brief Get the current LIN node state
*
* @param u32Instance LIN_LPUART instance number
* @return current LIN node state
*
*
*/
Lpuart_Lin_Ip_NodeStateType Lpuart_Lin_Ip_GetCurrentNodeState(const uint32 u32Instance);
/**
* @brief Callback function for Timer Interrupt Handler
* Users shall initialize a timer (for example FTM) in Output compare mode
* with period of 500 micro seconds. In timer IRQ handler, call this function.
*
* @param u32Instance LIN_LPUART instance number
* @return void
*
*
*/
void Lpuart_Lin_Ip_TimeoutService(const uint32 u32Instance);
/**
* @brief Set Value for Timeout Counter that is used in Lpuart_Lin_Ip_TimeoutService
*
* @param u32Instance LPUART instance number
* @param u32TimeoutValue Timeout Value to be set
* @return void
*/
void Lpuart_Lin_Ip_SetTimeoutCounter(const uint32 u32Instance, const uint32 u32TimeoutValue);
/**
* @brief Sends frame header out through the LIN_LPUART module using a non-blocking method.
* @details This function sends LIN Break field, sync field then the ID with
* correct parity. This function checks if the interface is Master, if not, it will
* return LPUART_LIN_IP_STATUS_ERROR.This function checks if id is in range from 0 to 0x3F, if not
* it will return LPUART_LIN_IP_STATUS_ERROR.
*
* @param u32Instance LIN_LPUART instance number.
* @param u8Id Frame Identifier.
* @return operation status:
* @retval LPUART_LIN_IP_STATUS_SUCCESS : The transmission is successful.
* @retval LPUART_LIN_IP_STATUS_BUSY : Bus busy flag is true.
* @retval LPUART_LIN_IP_STATUS_ERROR : The interface isn't Master or id isn't in range from 0 to 0x3F
* or node's current state is in SLEEP mode.
*
*
*/
Lpuart_Lin_Ip_StatusType Lpuart_Lin_Ip_MasterSendHeader(const uint32 u32Instance, const uint8 u8Id);
/**
* @brief LIN_LPUART interrupt handler for RX_TX and Error interrupts.
*
* @param u32Instance LIN_LPUART instance number
* @return void
*
*
*/
void Lpuart_Lin_Ip_IRQHandler(const uint32 u32Instance);
#define LIN_STOP_SEC_CODE
#include "Lin_MemMap.h"
#ifdef __cplusplus
}
#endif
/** @} */
#endif /* LPUART_LIN_IP_H */