1153 lines
29 KiB
C
Raw Normal View History

2024-12-23 11:04:44 +08:00
/******************************************************************************
*
* Freescale Semiconductor Inc.
* (c) Copyright 2008-2015 Freescale Semiconductor, Inc.
* ALL RIGHTS RESERVED.
*
******************************************************************************/
/**************************************************************************//**
* @addtogroup lowlevel_group
* @{
******************************************************************************/
/**************************************************************************//**
*
* @file lin.c
*
* @author FPT Software
*
* @brief LIN low level functions
*
******************************************************************************/
/******************************************************************************
*
* History:
*
* 20090408 v1.0 First version
*
*****************************************************************************/
#include "lin.h"
#if (_LIN_SCI_ == 1)
#include "lin_lld_sci.h"
#include "lin_lld_timesrv.h"
#endif /* End (_LIN_SCI_ == 1) */
#if (_LIN_XGATE_ == 1)
#include "lin_lld_xgate.h"
#include "lin_lld_timesrv.h"
#endif /* End (_LIN_XGATE_ == 1) */
#if (_LIN_SLIC_ == 1)
#include "lin_lld_slic.h"
#include "MC9S08EL32.h"
/* Check Multi frame transmission */
#if (_TL_FRAME_SUPPORT_ == _TL_MULTI_FRAME_)
#include "lin_lld_timesrv.h"
#endif /* End (_TL_FRAME_SUPPORT_ == _TL_MULTI_FRAME_) */
#endif /* End (_LIN_SLIC_ == 1) */
#if (_LIN_GPIO_ == 1)
#include "lin_lld_gpio.h"
#endif /* End (_LIN_GPIO_ == 1) */
#if (_LIN_UART_ == 1)
#include "lin_lld_uart.h"
#include "lin_lld_timesrv.h"
#endif /* End (_LIN_SCI_ == 1) */
/* Globle variable */
#if (LIN_MODE == _SLAVE_MODE_)
#if (_TL_FRAME_SUPPORT_ == _TL_SINGLE_FRAME__)
#if (_LIN_GPIO_ == 0) && !defined(_MC9S08SC4_H)
lin_message_timeout_type tl_check_timeout_type = LD_NO_CHECK_TIMEOUT; /**< timeout type */
l_u16 tl_check_timeout = N_MAX_TIMEOUT_CNT; /**< timeout counter*/
lin_service_status tl_service_status = LD_SERVICE_IDLE; /**< Status of the last configuration service */
#endif
#endif
#endif
#if (LIN_MODE == _MASTER_MODE_)
l_u8 etf_collision_flag[LIN_NUM_OF_IFCS] = {0};
/* Extern globle variable */
#if (_TL_FRAME_SUPPORT_ == _TL_SINGLE_FRAME__)
lin_message_timeout_type tl_check_timeout_type_array[LIN_NUM_OF_IFCS] = {LD_NO_CHECK_TIMEOUT};
l_u16 tl_check_timeout_array[LIN_NUM_OF_IFCS] = {N_MAX_TIMEOUT_CNT};
#endif
l_u8 lin_lld_init
(
/* [IN] interface identifier */
l_ifc_handle iii
)
{
lin_hardware_name lin_hw; /* Indicator of LIN HW */
l_u8 ret = 0;
/* Check for valid interface */
if (iii > LIN_NUM_OF_IFCS)
{
ret = LIN_LLD_INVALID_IFC;
}
else
{
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
/* Call lin_lld_xxx_init */
if (lin_hw <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_init(lin_hw, iii);
#else
lin_lld_xgate_init(lin_hw, iii);
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
lin_lld_gpio_init();
#endif /* End (_LIN_GPIO_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis only */
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
lin_lld_uart_init(lin_hw, iii);
#endif /* End (_LIN_UART_ == 1) */
ret = LIN_LLD_OK;
}
return ret;
}
l_u8 lin_lld_deinit
(
/* [IN] interface identifier */
l_ifc_handle iii
)
{
lin_hardware_name lin_hw; /* Indicator of LIN HW */
l_u8 ret = 0;
/* Check for valid interface */
if (iii > LIN_NUM_OF_IFCS)
{
ret = LIN_LLD_INVALID_IFC;
}
else
{
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
/* Call lin_lld_xxx_deinit */
if (lin_hw <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_deinit(lin_hw);
#else
lin_lld_xgate_deinit(lin_hw);
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
lin_lld_gpio_deinit();
#endif /* End (_LIN_GPIO_ == 1 */
#if (_LIN_UART_ == 1) /* For Kinetis only */
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
lin_lld_uart_deinit(lin_hw);
#endif /* End (_LIN_UART_ == 1) */
ret = LIN_LLD_OK;
}
return ret;
}
l_u8 lin_lld_get_state
(
/* [IN] interface identifier */
l_ifc_handle iii
)
{
lin_hardware_name lin_hw; /* Indicator of LIN HW */
l_u8 ret = 0;
/* Check for valid interface */
if (iii > LIN_NUM_OF_IFCS)
{
ret = LIN_LLD_INVALID_IFC;
}
else
{
#if ((_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1))
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
/* Call lin_lld_xxx_get_status */
if (lin_hw <= SCI5)
{
#if (_LIN_SCI_ == 1)
ret = lin_lld_sci_get_state(lin_hw);
#else
ret = lin_lld_xgate_get_state(lin_hw);
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End ((_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)) */
#if (_LIN_UART_ == 1) /* For Kinetis platform */
lin_hw = lin_virtual_ifc[iii];
ret = lin_lld_uart_get_state(lin_hw);
#endif /* End (_LIN_UART_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
ret = lin_lld_gpio_get_status();
#endif /* End (_LIN_GPIO_ == 1) */
}
return ret;
}
void lin_lld_tx_header
(
/* [IN] interface identifier */
l_ifc_handle iii,
/* [IN] ID of the header to be sent */
l_u8 pid
)
{
lin_hardware_name lin_hw; /* Indicator of LIN HW */
/* Check for valid interface */
if (iii <= LIN_NUM_OF_IFCS)
{
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
/* Call lin_lld_xxx_tx_header */
if (lin_hw <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_tx_header(lin_hw, pid);
#else
lin_lld_xgate_tx_header(lin_hw, pid);
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* defined(_LIN_SCI_) || defined(_LIN_XGATE_) */
#if (_LIN_UART_ == 1) /* For Kinetis only */
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
lin_lld_uart_tx_header(lin_hw, pid);
#endif /* End (_LIN_UART_ == 1) */
}
return;
}
void lin_lld_tx_wake_up
(
/* [IN] interface identifier */
l_ifc_handle iii
)
{
lin_hardware_name lin_hw;
/* Check for valid interface */
if (iii <= LIN_NUM_OF_IFCS)
{
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
/* Call lin_lld_xxx_tx_wake_up */
if (lin_hw <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_tx_wake_up(lin_hw);
#else
lin_lld_xgate_tx_wake_up(lin_hw);
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
lin_lld_gpio_tx_wake_up();
#endif /* End (_LIN_GPIO_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis only */
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
lin_lld_uart_tx_wake_up(lin_hw);
#endif /* End (_LIN_UART_ == 1) */
}
return;
}
void lin_lld_int_enable
(
/* [IN] interface identifier */
l_ifc_handle iii
)
{
lin_hardware_name lin_hw;
/* Check for valid interface */
if (iii <= LIN_NUM_OF_IFCS)
{
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
/* Call lin_lld_xxx_int_enable */
if (lin_hw <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_int_enable(lin_hw);
#else
lin_lld_xgate_int_enable(lin_hw);
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
lin_lld_gpio_int_enable();
#endif /* (_LIN_GPIO_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis only */
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
lin_lld_uart_int_enable(lin_hw);
#endif /* End (_LIN_UART_ == 1) */
}
return;
}
l_u8 lin_lld_int_disable
(
/* [IN] interface identifier */
l_ifc_handle iii
)
{
lin_hardware_name lin_hw;
l_u8 ret = 0;
/* Check for valid interface */
if (iii > LIN_NUM_OF_IFCS)
{
ret = LIN_LLD_INVALID_IFC;
}
else
{
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
/* Call lin_lld_xxx_int_disable */
if (lin_hw <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_int_disable(lin_hw);
#else
lin_lld_xgate_int_disable(lin_hw);
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
lin_lld_gpio_int_disable();
#endif /* (_LIN_GPIO_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis only */
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
lin_lld_uart_int_disable(lin_hw);
#endif /* End (_LIN_UART_ == 1) */
ret = LIN_LLD_OK;
}
return ret;
}
void lin_lld_ignore_response
(
/* [IN] interface identifier */
l_ifc_handle iii
)
{
lin_hardware_name lin_hw; /* Indicator of LIN HW */
/* Check for valid interface */
if (iii <= LIN_NUM_OF_IFCS)
{
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
/* Call lin_lld_xxx_ignore_response */
if (lin_hw <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_ignore_response(lin_hw);
#else
lin_lld_xgate_ignore_response(lin_hw);
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
lin_lld_gpio_ignore_response();
#endif /* End (_LIN_GPIO_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis only */
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
lin_lld_uart_ignore_response(lin_hw);
#endif /* End (_LIN_UART_ == 1) */
}
return;
}
void lin_lld_set_low_power_mode
(
/* [IN] interface identifier */
l_ifc_handle iii
)
{
lin_hardware_name lin_hw; /* Indicator of LIN HW */
/* Check for valid interface */
if (iii <= LIN_NUM_OF_IFCS)
{
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
/* Call lin_lld_xxx_ignore_response */
if (lin_hw <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_set_low_power_mode(lin_hw);
#else
lin_lld_xgate_set_low_power_mode(lin_hw);
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
lin_lld_gpio_set_low_power_mode();
#endif /* End (_LIN_GPIO_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis only */
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
lin_lld_uart_set_low_power_mode(lin_hw);
#endif /* End (_LIN_UART_ == 1) */
}
return;
}
l_u8 lin_lld_set_response
(
/* [IN] interface identifier */
l_ifc_handle iii,
/* [IN] response length */
l_u8 response_length
)
{
lin_hardware_name lin_hw; /* Indicator of LIN HW */
l_u8 ret = 0;
/* Check for valid interface */
if (iii > LIN_NUM_OF_IFCS)
{
ret = LIN_LLD_INVALID_IFC;
}
else
{
/* Check for valid response length */
if (response_length > 8)
{
ret = LIN_LLD_INVALID_PARA;
}
else
{
/* Put response length into buffer */
*(lin_ifc_configuration[iii].response_buffer) = response_length;
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
/* Call lin_lld_xxx_set_response */
if (lin_hw <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_tx_response(lin_hw);
#else
lin_lld_xgate_tx_response(lin_hw);
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
/* Add code here */
lin_lld_gpio_tx_response();
#endif /* End (_LIN_GPIO_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis only */
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
lin_lld_uart_tx_response(lin_hw);
#endif /* End (_LIN_UART_ == 1) */
ret = LIN_LLD_OK;
}
}
return ret;
}
l_u8 lin_lld_rx_response
(
/* [IN] interface identifier */
l_ifc_handle iii,
/* [IN] response length */
l_u8 response_length
)
{
lin_hardware_name lin_hw; /* Indicator of LIN HW */
l_u8 ret = 0;
/* Check for valid interface */
if (iii > LIN_NUM_OF_IFCS)
{
ret = LIN_LLD_INVALID_IFC;
}
else
{
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
/* Call lin_lld_xxx_rx_response */
if (lin_hw <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_rx_response(lin_hw, response_length);
#else
lin_lld_xgate_rx_response(lin_hw, response_length);
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
/* Add code here */
lin_lld_gpio_rx_response(response_length);
#endif /* End (_LIN_GPIO_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis only */
/* Find LIN HW interface which is mounted to interface */
lin_hw = lin_virtual_ifc[iii];
lin_lld_uart_rx_response(lin_hw, response_length);
#endif /* End (_LIN_UART_ == 1) */
ret = LIN_LLD_OK;
}
return ret;
}
void lin_lld_set_etf_collision_flag(
/* [IN] interface identifier */
l_ifc_handle iii)
{
/* Set flag in case of occurring collision in event trigger frame */
etf_collision_flag[iii] = 1;
}
void lin_lld_clear_etf_collision_flag(
/* [IN] interface identifier */
l_ifc_handle iii)
{
/* Clear flag in case of occurring collision in event trigger frame */
etf_collision_flag[iii] = 0;
}
#endif /* end of LIN_MODE == _MASTER_MODE_ */
#if LIN_MODE == _SLAVE_MODE_
/* Extern globle variable */
l_u8 lin_lld_init
(
)
{
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1)
/* Call lin_lld_xxx_init */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
if (lin_virtual_ifc <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_init((l_ifc_handle)0);
#else
lin_lld_xgate_init((l_ifc_handle)0);
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_SLIC_ == 1)
if (lin_virtual_ifc == SLIC)
{
lin_lld_slic_init();
}
#endif /* End (_LIN_SLIC_ == 1) */
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis platform */
lin_lld_uart_init((l_ifc_handle)0);
#endif /* End (_LIN_UART_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
lin_lld_gpio_init();
#endif /* End (_LIN_GPIO_ == 1) */
return LIN_LLD_OK;
}
l_u8 lin_lld_deinit
(
)
{
/* Check for valid interface */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1)
/* Call lin_lld_xxx_deinit */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
if (lin_virtual_ifc <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_deinit();
#else
lin_lld_xgate_deinit();
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_SLIC_ == 1)
if (lin_virtual_ifc == SLIC)
{
lin_lld_slic_deinit();
}
#endif /* End (_LIN_SLIC_ == 1) */
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis platform */
lin_lld_uart_deinit();
#endif /* End (_LIN_UART_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
lin_lld_gpio_deinit();
#endif /* End (_LIN_GPIO_ == 1) */
return LIN_LLD_OK;
}
l_u8 lin_lld_get_status
(
)
{
l_u8 ret = 0;
/* Check for valid interface */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1)
/* Call lin_lld_xxx_get_status */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
if (lin_virtual_ifc <= SCI5)
{
#if (_LIN_SCI_ == 1)
ret = lin_lld_sci_get_status();
#else
ret = lin_lld_xgate_get_status();
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_SLIC_ == 1)
if (lin_virtual_ifc == SLIC)
{
/* Add code here */
}
#endif /* End (_LIN_SLIC_ == 1) */
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis platform */
lin_lld_uart_get_status();
#endif /* End (_LIN_UART_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
/* Add code here */
#endif /* End (_LIN_GPIO_ == 1) */
return ret;
}
l_u8 lin_lld_get_state()
{
l_u8 ret = 0;
/* Check for valid interface */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1)
/* Call lin_lld_xxx_get_status */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
if (lin_virtual_ifc <= SCI5)
{
#if (_LIN_SCI_ == 1)
ret = lin_lld_sci_get_state();
#else
ret = lin_lld_xgate_get_state();
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_SLIC_ == 1)
if (lin_virtual_ifc == SLIC)
{
ret = lin_lld_slic_get_state();
}
#endif /* End (_LIN_SLIC_ == 1) */
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis platform */
ret = lin_lld_uart_get_state();
#endif /* End (_LIN_UART_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
ret = lin_lld_gpio_get_status();
#endif /* End (_LIN_GPIO_ == 1) */
return ret;
}
void lin_lld_tx_wake_up ()
{
/* Check for valid interface */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1)
/* Call lin_lld_xxx_tx_wake_up */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
if (lin_virtual_ifc <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_tx_wake_up();
#else
lin_lld_xgate_tx_wake_up();
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_SLIC_ == 1)
if (lin_virtual_ifc == SLIC)
{
lin_lld_slic_tx_wake_up();
}
#endif /* End (_LIN_SLIC_ == 1) */
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis platform */
lin_lld_uart_tx_wake_up();
#endif /* End (_LIN_UART_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
lin_lld_gpio_tx_wake_up();
#endif /* End (_LIN_GPIO_ == 1) */
return;
}
void lin_lld_int_enable ()
{
/* Check for valid interface */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1)
/* Call lin_lld_xxx_int_enable */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
if (lin_virtual_ifc <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_int_enable();
#else
lin_lld_xgate_int_enable();
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_SLIC_ == 1)
if (lin_virtual_ifc == SLIC)
{
lin_lld_slic_int_enable();
}
#endif /* End (_LIN_SLIC_ == 1) */
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis platform */
lin_lld_uart_int_enable();
#endif /* End (_LIN_UART_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
lin_lld_gpio_int_enable();
#endif /* End #if (_LIN_GPIO_ == 1) */
return;
}
l_u8 lin_lld_int_disable ()
{
/* Check for valid interface */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1)
/* Call lin_lld_xxx_int_disable */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
if (lin_virtual_ifc <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_int_disable();
#else
lin_lld_xgate_int_disable();
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_SLIC_ == 1)
if (lin_virtual_ifc == SLIC)
{
lin_lld_slic_int_disable();
}
#endif /* End (_LIN_SLIC_ == 1) */
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis platform */
lin_lld_uart_int_disable();
#endif /* End (_LIN_UART_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
lin_lld_gpio_int_disable();
#endif /* End (_LIN_GPIO_ == 1) */
return LIN_LLD_OK;
}
void lin_lld_ignore_response
(
)
{
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1)
/* Call lin_lld_xxx_ignore_response */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
if (lin_virtual_ifc <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_ignore_response();
#else
lin_lld_xgate_ignore_response();
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_SLIC_ == 1)
if (lin_virtual_ifc == SLIC)
{
lin_lld_slic_ignore_response();
}
#endif /* End (_LIN_SLIC_ == 1) */
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis platform */
lin_lld_uart_ignore_response();
#endif /* End (_LIN_UART_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
lin_lld_gpio_ignore_response();
#endif /* End (_LIN_GPIO_ == 1) */
return;
}
void lin_lld_set_low_power_mode ()
{
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1)
/* Call lin_lld_xxx_ignore_response */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
if (lin_virtual_ifc <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_set_low_power_mode();
#else
lin_lld_xgate_set_low_power_mode();
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_SLIC_ == 1)
if (lin_virtual_ifc == SLIC)
{
lin_lld_slic_set_low_power_mode();
}
#endif /* End (_LIN_SLIC_ == 1) */
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
lin_lld_gpio_set_low_power_mode();
#endif /* End (_LIN_GPIO_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis only */
lin_lld_uart_set_low_power_mode();
#endif /* End (_LIN_UART_ == 1) */
return;
}
l_u8 lin_lld_set_response
(
/* [IN] response length */
l_u8 response_length
)
{
l_u8 ret = 0;
/* Check for valid response length */
if (response_length > 8)
{
ret = LIN_LLD_INVALID_PARA;
}
else
{
/* Put response length into buffer */
lin_lld_response_buffer[0] = response_length;
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1)
/* Call lin_lld_xxx_set_response */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
if (lin_virtual_ifc <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_tx_response();
#else
lin_lld_xgate_tx_response();
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_SLIC_ == 1)
if (lin_virtual_ifc == SLIC)
{
/* Add code here */
lin_lld_slic_tx_response(&lin_lld_response_buffer[0]);
}
#endif /* End (_LIN_SLIC_ == 1) */
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis platform */
lin_lld_uart_tx_response();
#endif /* End (_LIN_UART_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
/* Add code here */
lin_lld_gpio_tx_response();
#endif /* End (_LIN_GPIO_ == 1) */
ret = LIN_LLD_OK;
}
return ret;
}
l_u8 lin_lld_rx_response
(
/* [IN] response length */
l_u8 response_length
)
{
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1)
/* Call lin_lld_xxx_rx_response */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
if (lin_virtual_ifc <= SCI5)
{
#if (_LIN_SCI_ == 1)
lin_lld_sci_rx_response(response_length);
#else
lin_lld_xgate_rx_response(response_length);
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_SLIC_ == 1)
if (lin_virtual_ifc == SLIC)
{
/* Add code here */
lin_lld_slic_rx_response(response_length);
}
#endif /* End (_LIN_SLIC_ == 1) */
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1) */
#if (_LIN_UART_ == 1) /* For Kinetis platform */
lin_lld_uart_rx_response(response_length);
#endif /* End (_LIN_UART_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
/* Add code here */
lin_lld_gpio_rx_response(response_length);
#endif /* End (_LIN_GPIO_ == 1) */
return LIN_LLD_OK;
}
#endif /* End of LIN_MODE == _SLAVE_MODE_ */
/*** Common function used to all low-level driver ***/
l_u8 lin_process_parity
(
/* [IN] PID need to be send */
l_u8 pid,
/* [IN] Check or Make parity */
l_u8 type
)
{
l_u8 parity;
l_u8 ret;
parity = (((BIT(pid, 0)^BIT(pid, 1)^BIT(pid, 2)^BIT(pid, 4)) << 6)|
((~(BIT(pid, 1)^BIT(pid, 3)^BIT(pid, 4)^BIT(pid, 5))) << 7));
if (CHECK_PARITY == type)
{
if ((pid&0xC0) != parity)
{
ret = 0xFF;
}
else
{
ret = (l_u8)(pid&0x3F);
}
}
else
{
ret = (l_u8)(pid|parity);
}
return (ret);
}
l_u8 lin_checksum
(
/* [IN] pointer to buffer */
l_u8 *buffer,
/* [IN] pid */
l_u8 raw_pid
)
{
l_u8 length;
l_u16 check_sum;
/* 1. PID correspond to Master request and Slave response, their checksum cal is classic
the non-diagnostic frame is calculated in Enhanced */
if ((0x3C != raw_pid) && (0x7D != raw_pid))
{
check_sum = raw_pid;
}
else
{
check_sum = 0;
}
for (length = *buffer; 0 < length; length--)
{
buffer++;
check_sum += *(buffer);
/* 2. to deal with the carry */
if (check_sum > 0xFF)
{
check_sum -= 0xFF;
}
}
/* 3. to reverse */
return (l_u8)(~check_sum);
}
void lin_lld_timer_init
(
void
)
{
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
#if (_MCU_ == _S12X_)
/* if use PIT for time service */
lin_lld_timer_S12X_init();
#endif /* End (_MCU_ == _S12X_) */
#if (_MCU_ == _S12_)
lin_lld_timer_S12_init();
#endif /* End (_MCU_ == _S12_) */
#if (_MCU_ == _S08_)
lin_lld_timer_S08_init();
#endif /* End (_MCU_ == _S08_) */
#endif /* (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_SLIC_ == 1)
/* Init timer for SLIC interface, which using for check transport layer timeout */
/* Use for multi frames transmission only. */
#if (_TL_FRAME_SUPPORT_ == _TL_MULTI_FRAME_)
lin_lld_timer_S08_init();
#endif /* End (_TL_FRAME_SUPPORT_ == _TL_MULTI_FRAME_) */
#endif /* End (_LIN_SLIC_ == 1) */
#if (_LIN_UART_ == 1)
#if (_MCU_ == _K_)
lin_lld_timer_K_init();
#endif /* End (_MCU_ == _S12_) */
#endif /* End (_LIN_UART_ == 1) */
}
#if (LIN_MODE == _SLAVE_MODE_)
void lin_lld_mcu_reset()
{
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1)
/* Call lin_lld_xxx_rx_response */
#if (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1)
if (lin_virtual_ifc <= SCI5)
{
#if (_LIN_SCI_ == 1)
#else
#endif /* End (_LIN_SCI_ == 1) */
}
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) */
#if (_LIN_SLIC_ == 1)
if (lin_virtual_ifc == SLIC)
{
/* Add code here */
}
#endif /* End (_LIN_SLIC_ == 1) */
#endif /* End (_LIN_SCI_ == 1) || (_LIN_XGATE_ == 1) || (_LIN_SLIC_ == 1) */
#if (_LIN_GPIO_ == 1) /* For S09QD4 only */
/* Add code here */
#endif /* End (_LIN_GPIO_ == 1) */
}
#endif /* End (LIN_MODE == _SLAVE_MODE_) */
/**
* @}
*/