1153 lines
29 KiB
C
1153 lines
29 KiB
C
|
/******************************************************************************
|
||
|
*
|
||
|
* 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_) */
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|