/****************************************************************************** * * Freescale Semiconductor Inc. * (c) Copyright 2008-2016 Freescale Semiconductor, Inc. * Copyright 2016-2017 NXP * ALL RIGHTS RESERVED. * ******************************************************************************/ /**************************************************************************//** * @addtogroup SCI_group * @{ ******************************************************************************/ /**************************************************************************//** * * @file bsp/SCI/lin_lld_sci.h * * @author FPT Software * * @brief SCI for LIN network * ******************************************************************************/ /****************************************************************************** * * History: * * 20101027 v1.0 First version * 20111005 v1.1 Updated hardware support, multi timers * *****************************************************************************/ #ifndef __LIN_LLD_SCI #define __LIN_LLD_SCI /* MODULE LIN_LLD_SCI. */ #include "lin_reg.h" #include "lin_cfg.h" #include "lin.h" #ifndef SCI_VERSION #error "SCI_VERSION is not defined in lin_hw_cfg.h" #endif /*** MARCOS ***/ #if ((SCI_VERSION == SCI_V5) || (SCI_VERSION == SCI_V6)) #define LIN_LLD_SCI_MCU_RESET { COPCTL = 0x01; ARMCOP = 0x00;} /**< MCU reset */ #endif /* End (SCI_VERSION == SCI_V5) */ /* Define _MC9S12ZVMB_H for all MCU of MC9S12ZVMB Family */ #if (defined(_MC9S12ZVMB48_H) || defined(_MC9S12ZVMBA48_H) || defined(_MC9S12ZVMB64_H) || defined(_MC9S12ZVMBA64_H)) #define _MC9S12ZVMB_H #endif /* End (defined(_MC9S12ZVMB48_H) || defined(_MC9S12ZVMBA48_H) || defined(_MC9S12ZVMB64_H) || defined(_MC9S12ZVMBA64_H))*/ /* Define _MC9S12ZVMA_H for all MCU of MC9S12ZVMB Family*/ #if (defined(_MC9S12ZVMA32_H) || defined(_MC9S12ZVMAL32_H) || defined(_MC9S12ZVMA16_H) || defined(_MC9S12ZVMAL16_H)) #define _MC9S12ZVMA_H #endif /* End defined(_MC9S12ZVMA32_H) || defined(_MC9S12ZVMAL32_H) || defined(_MC9S12ZVMA16_H) || defined(_MC9S12ZVMAL16_H) */ /* Lin status bit mask */ #define LIN_STA_SUCC_TRANSFER 1 /**< LIN status bit mask: success transfer */ #define LIN_STA_ERROR_RESP 2 /**< LIN status bit mask: error in response */ #define LIN_STA_BUS_ACTIVITY 4 /**< LIN status bit mask: bus activity */ #define LIN_STA_FRAME_ERR 8 /**< LIN status bit mask: frame error */ #define LIN_STA_CHECKSUM_ERR 16 /**< LIN status bit mask: checksum error */ #define LIN_STA_READBACK_ERR 32 /**< LIN status bit mask: readback error */ #define LIN_STA_PARITY_ERR 64 /**< LIN status bit mask: parity error */ #define LIN_STA_RESET 128 /**< LIN status bit mask: reset */ #if (LIN_MODE == _SLAVE_MODE_) /* Low-level API prototype */ /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_init(l_ifc_handle iii) * @brief SCI v5 init * * @param iii [IN] lin interface handle * * @SDD_ID LIN_SDD_168 * @endif * * @return #void * * @local_var * -# #l_u16 temp * * * @details Init SCI for LIN network * * * @see #lin_goto_idle_state *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_init(l_ifc_handle iii); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_deinit() * @brief SCI deinit * * @SDD_ID LIN_SDD_169 * @endif * * @return #void * * @details * Deinit SCI for LIN network *//*END*----------------------------------------------------------------------*/ #if (AUTOBAUD == 1) void lin_lld_sci_init_autobaud(l_u16 baudrate); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_deinit() * @brief SCI deinit * * @SDD_ID LIN_SDD_169 * @endif * * @return #void * * @details * Deinit SCI for LIN network *//*END*----------------------------------------------------------------------*/ #endif void lin_lld_sci_deinit(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_tx_wake_up() * @brief This function requests to send wake up signal via SCI channel * * * @SDD_ID LIN_SDD_170 * @endif * * @return #void * * * @details * This function requests to send wake up signal via SCI channel * Send 4Tbit to 64 Tbit *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_tx_wake_up(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_int_enable() * @brief This function enables SCI Interrupt * * @SDD_ID LIN_SDD_171 * @endif * * @return #void * * @details * This function enables SCI Interrupt *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_int_enable(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_int_disable() * @brief This function disables SCI Interrupt * * @SDD_ID LIN_SDD_172 * @endif * * @return #void * * @details * This function disables SCI Interrupt *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_int_disable(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_ignore_response() * @brief Set low level ignore flag lin_lld_ignore_flag * * @SDD_ID LIN_SDD_173 * @endif * * @return #void * * @details * Set low level ignore flag lin_lld_ignore_flag *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_ignore_response(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_set_low_power_mode() * @brief Request to enter low power mode in SCI Driver * * @SDD_ID LIN_SDD_174 * @endif * * @return #void * * @details * Request to enter low power mode in SCI Driver *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_set_low_power_mode(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_rx_response(l_u8 msg_length) * * @param msg_length IN length of response data expect to wait * * @brief This function requests to receive response data of LIN frame via SCI channel * * @SDD_ID LIN_SDD_175 * @endif * * @return #void * * @details * This function requests to receive response data of LIN frame via SCI channel *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_rx_response(l_u8 msg_length); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_tx_response() * * @brief This function requests to send first data and set lin_lld_state to SEND_DATA * * @SDD_ID LIN_SDD_179 * @endif * * @return #void * * * @details * This function requests to send first data and set lin_lld_state to SEND_DATA *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_tx_response(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_sci_get_status() * * @brief Get LIN status ( return lin_status ) * * @SDD_ID LIN_SDD_180 * @endif * * @return #l_u8 * * @details * Get LIN status ( return lin_status ) *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_sci_get_status(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_sci_get_state() * * @brief This function is to get state of Low level layer * * @SDD_ID LIN_SDD_181 * @endif * * @return #l_u8 * * @details * This function is to get state of Low level layer *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_sci_get_state(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_timeout() * * @brief This function is called in period Tbit in order to check timeout for IDLE and MAXFRAME * * @SDD_ID LIN_SDD_ * @endif * * @return #void * * @details * This function is called in period Tbit in order to check timeout for IDLE and MAXFRAME *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_timeout(void); #if ((SCI_VERSION != SCI_V5) && (SCI_VERSION != SCI_V6)) /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_err_isr ( ) * @brief SCI Interrupt service routine that handles SCI Error * * @return #void * * @SDD_ID LIN_SDD_187 * @endif * * @local_var * -# #l_u8 sci_flag_sr1 * -# #l_u8 tmp_byte * * @static_global_var * -# #pSCI * -# #l_status * -# #state * -# #l_ifc_handle * -# #current_id * -# #ifc * * @details * SCI Interrupt service routine that handles SCI Error * * @see #lin_goto_idle_state *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_err_isr(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_rx_isr ( ) * @brief SCI Interrupt service routine that handles RX LIN Communication * * @return #void * * @SDD_ID LIN_SDD_188 * @endif * * @local_var * -# #l_u8 sci_flag_sr1 * -# #l_u8 sci_flag_sr2 * -# #l_u8 tmp_byte * * @static_global_var * -# #pSCI * -# #l_status * -# #frame_timeout_cnt * -# #lin_max_frame_res_timeout_val * -# #current_id * -# #ifc * -# #l_ifc_handle * -# #response_buffer * * @details * SCI Interrupt service routine that handles RX LIN Communication * * @see #lin_checksum *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_rx_isr(void); #else /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_isr() * * @brief SCI Interrupt service routine that handles LIN Communication * * @SDD_ID LIN_SDD_189 * @endif * * @return #void * * @local_var * -# #l_u8 sci_flag_sr1 * -# #l_u8 tmp_byte * * @details * SCI Interrupt service routine that handles LIN Communication *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_isr(void); #endif /* End (SCI_VERSION != SCI_V5) */ /*** INTERNAL FUNCTIONS ***/ /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_goto_idle_state() * * @brief Enter IDLE state * * @SDD_ID LIN_SDD_182 * @endif * * @return #void * * @details * Enter IDLE state *//*END*----------------------------------------------------------------------*/ void lin_goto_idle_state(void); #endif /* End (LIN_MODE == _SLAVE_MODE_) */ #if LIN_MODE == _MASTER_MODE_ /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_init(sci_channel_name channel, l_ifc_handle iii) * * @param channel IN sci channel name * @param iii IN LIN interface name * * @brief SCI Init * * @SDD_ID LIN_SDD_97 * @endif * * @return #void * * @local_var * -# #l_u16 *tmp * -# #lin_node *lnode_p * -# #lin_configuration *lconf_p * * @static_global_var * -# #lin_ifc_configuration * * @see lin_goto_idle_state * * @details * This function is inited SCI for LIN network *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_init(sci_channel_name channel, l_ifc_handle iii); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_deinit(sci_channel_name channel) * * @param channel IN sci channel name * * @brief SCI deinit * * @SDD_ID LIN_SDD_98 * @endif * * @return #void * * * @static_global_var * -# #lin_node * -# #lnode_p * * @see lin_lld_sci_int_disable * @see lin_node_descrs * * @details * This function is deinited SCI *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_deinit(sci_channel_name channel); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_tx_header(sci_channel_name channel, l_u8 pid_id) * * @param channel IN sci channel name * @param pid_id IN PID to be send * * @brief This function requests to send header of LIN frame via SCI channel * * @SDD_ID LIN_SDD_99 * @endif * * @return #void * * @local_var * -# #lin_node *lnode_p * * * @see lin_process_parity * @see lin_node_descrs * * @details * This function requests to send header of LIN frame via SCI channel *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_tx_header(sci_channel_name channel, l_u8 pid_id); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_tx_wake_up(sci_channel_name channel) * * @param channel IN sci channel name * * @brief This function requests to send wake up signal via SCI channel. * * @SDD_ID LIN_SDD_100 * @endif * * @return #void * * @local_var * -# #lin_node *lnode_p * * @static_global_var * -# #lin_node_descrs * * @see lin_goto_idle_state * * @details * This function requests to send wake up signal via SCI channel. * Send 4Tbit to 64 Tbit *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_tx_wake_up(sci_channel_name channel); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_int_enable(sci_channel_name channel) * * @param channel IN sci channel name * * @brief This function enables SCI Interrupt * * @SDD_ID LIN_SDD_101 * @endif * * @return #void * * @local_var * -# #lin_node *lnode_p * * @static_global_var * -# #lin_node_descrs * * * @details * This function enables SCI Interrupt *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_int_enable(sci_channel_name channel); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_int_disable(sci_channel_name channel) * * @param channel IN sci channel name * * @brief This function disables SCI Interrupt * * @SDD_ID LIN_SDD_102 * @endif * * @return #void * * @local_var * -# #lin_node *lnode_p * * @static_global_var * -# #lin_node_descrs * * * @details * This function disables SCI Interrupt *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_int_disable(sci_channel_name channel); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_ignore_response(sci_channel_name channel) * * @param channel IN sci channel name * * @brief Set low level ignore flag lin_lld_ignore_flag * * @SDD_ID LIN_SDD_103 * @endif * * @return #void * * @see lin_goto_idle_state * * @details * Set low level ignore flag lin_lld_ignore_flag *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_ignore_response(sci_channel_name channel); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_set_low_power_mode(sci_channel_name channel) * * @param channel IN sci channel name * * @brief Request to enter low power mode in SCI Driver * * @SDD_ID LIN_SDD_104 * @endif * * @return #void * * @local_var * -# #lin_node *lnode_p * * @static_global_var * -# #lin_node_descrs * * @details * Request to enter low power mode in SCI Driver *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_set_low_power_mode(sci_channel_name channel); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_rx_response(sci_channel_name channel, l_u8 msg_length) * * @param channel IN sci channel name * @param msg_length IN length of response data expect to wait * * @brief This function requests to receive response data of LIN frame via SCI channel * * @SDD_ID LIN_SDD_105 * @endif * * @return #void * * @local_var * -# #lin_node *lnode_p * * @static_global_var * -# #lin_node_descrs * * @details * This function requests to receive response data of LIN frame via SCI channel *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_rx_response(sci_channel_name channel,l_u8 msg_length); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_tx_response(sci_channel_name channel) * * @param channel IN sci channel name * * @brief This function requests to send first data and set lin_lld_state to SEND_DATA * * @SDD_ID LIN_SDD_109 * @endif * * @return #void * * @local_var * -# #lin_node *lnode_p * * @static_global_var * -# #lin_node_descrs * * @details * This function requests to send first data and set lin_lld_state to SEND_DATA *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_tx_response(sci_channel_name channel); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_sci_get_status(sci_channel_name channel) * * @param channel IN sci channel name * * @brief Get LIN status ( return lin_status ) * * @SDD_ID LIN_SDD_110 * @endif * * @return #l_u8 * * @local_var * -# #lin_node *lnode_p * * @static_global_var * -# #lin_node_descrs * * @details * Get LIN status ( return lin_status ) *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_sci_get_status(sci_channel_name channel); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_sci_get_state(sci_channel_name channel) * * @param channel IN sci channel name * * @brief Get LIN state ( return state ) * * @SDD_ID LIN_SDD_ * @endif * * @return #l_u8 * * @local_var * -# #lin_node *lnode_p * * @static_global_var * -# #lin_node_descrs * * @details * Get LIN state ( return state ) *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_sci_get_state(sci_channel_name channel); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_timeout(sci_channel_name channel) * * @param channel IN sci channel name * * @brief This function is called in period Tbit in order to check timeout for IDLE and MAXFRAME * * @SDD_ID LIN_SDD_111 * @endif * * @return #void * * @local_var * -# #register lin_node *lnode_p * * @static_global_var * -# #lin_node_descrs * * @details * This function is called in period Tbit in order to check timeout for IDLE and MAXFRAME *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_timeout(sci_channel_name channel); #if ((SCI_VERSION != SCI_V5) && (SCI_VERSION != SCI_V6)) /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_err_isr ( sci_channel_name channel) * @brief SCI Interrupt service routine that handles SCI Error * * @param channel [IN] sci channel name * * @return #void * * @SDD_ID LIN_SDD_115 * @endif * * @local_var * -# #lin_node *lnode_p * -# #l_u8 sci_flag_sr1 * -# #l_u8 tmp_byte * * @static_global_var * -# #lin_node_descrs * * @details * SCI Interrupt service routine that handles SCI Error * * @see #lin_goto_idle_state *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_err_isr(sci_channel_name channel); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_rx_isr ( sci_channel_name channel) * @brief SCI Interrupt service routine that handles RX LIN Communication * * @param channel [IN] sci channel name * * @return #void * * @SDD_ID LIN_SDD_116 * @endif * * @local_var * -# #register lin_node *lnode_p * -# #l_u8 sci_flag_sr1 * -# #l_u8 sci_flag_sr2 * -# #l_u8 tmp_byte * * @static_global_var * -# #lin_node_descrs * -# #lin_max_frame_res_timeout_val * * @details * SCI Interrupt service routine that handles RX LIN Communication * * @see #lin_goto_idle_state * @see #lin_process_parity *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_rx_isr(sci_channel_name channel); #else /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_sci_isr(sci_channel_name channel) * * @param channel IN sci channel name * * @brief SCI Interrupt service routine that handles LIN Communication * * @SDD_ID LIN_SDD_117 * @endif * * @return #void * * @local_var * -# #l_u8 sci_flag_sr1 * -# #l_u8 tmp_byte * -# #register lin_node *lnode_p * * @static_global_var * -# #lin_node_descrs * * @see #lin_goto_idle_state * @see #lin_checksum * @see #lin_process_parity * * @details * SCI Interrupt service routine that handles LIN Communication *//*END*----------------------------------------------------------------------*/ void lin_lld_sci_isr(sci_channel_name channel); #endif /* End (SCI_VERSION != SCI_V5) */ /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_goto_idle_state(sci_channel_name channel) * * @param channel IN sci channel name * * @brief Enter IDLE state * * @SDD_ID LIN_SDD_112 * @endif * * @return #void * * @local_var * -# #register lin_node *lnode_p * * @static_global_var * -# #lin_node_descrs * * @details * Enter IDLE state *//*END*----------------------------------------------------------------------*/ void lin_goto_idle_state(sci_channel_name channel); #endif /* End (LIN_MODE == _MASTER_MODE_) */ #endif /* ifndef _LIN_LLD_SCI */ /** * @} */