/****************************************************************************** * Freescale Semiconductor Inc. * (c) Copyright 2008-2015 Freescale Semiconductor, Inc. * ALL RIGHTS RESERVED. *****************************************************************************/ /**************************************************************************//** * @addtogroup lowlevel_group * @{ ******************************************************************************/ /**************************************************************************//** * * @file lin.h * * @author FPT Software * * @brief LIN low level functions * * ******************************************************************************/ /****************************************************************************** * * History: * * 20090408 v1.0 First version * 20111005 v1.1 Added some defines and extern functions * 20140611 v1.2 Added UART support * *****************************************************************************/ #ifndef _LIN_H #define _LIN_H #include "lin_cfg.h" #include "lin_hw_cfg.h" #if (_LIN_SCI_ == 1)|(_LIN_UART_ == 1) #include "lin_reg.h" /* Disable warning: SP debug info */ #if (_MCU_ == _S12X_) #pragma MESSAGE DISABLE C12056 /* Disable warning message with ID C12056 */ #endif /* End (_MCU_ == _S12X_) */ #endif /* End (_LIN_SCI_ == 1)|(_LIN_UART_ == 1) */ #pragma MESSAGE DISABLE C5703 /* Disable warning message with ID C5703 */ #ifndef _DIAG_CLASS_SUPPORT_ #error "_DIAG_CLASS_SUPPORT_ is not defined in lin_cfg.h" #endif #ifndef _TL_FRAME_SUPPORT_ #error "_TL_FRAME_SUPPORT_ is not defined in lin_cfg.h" #endif #if (_LIN_GPIO_ == 0) && !defined(_MC9S08SC4_H) /* Calculate N_As & N_Cr max timeout */ #define N_MAX_TIMEOUT_CNT ((l_u16)(1000*(1000/TIME_BASE_PERIOD))) #endif /* End (_LIN_GPIO_ == 0) && !defined(_MC9S08SC4_H) */ /* Define data structure used for LIN Stack */ /**************************************************************************//** * * @var typedef unsigned char l_u8 * lin unsigned char data type * @var typedef signed char l_s8 * lin signed char data type * @var typedef volatile unsigned char l_vu8 * lin volatile unsigned char data type * @var typedef volatile signed char l_vs8 * lin volatile signed char data type * * @var typedef unsigned int l_u16 * lin unsigned int data type * @var typedef signed int l_s16 * lin signed int data type * @var typedef volatile unsigned int l_vu16 * lin volatile unsigned int data type * @var typedef volatile signed int l_vs16 * lin volatile signed int data type * * @var typedef unsigned long l_u32 * lin unsigned long data type * @var typedef signed long l_s32 * lin signed long data type * @var typedef volatile unsigned long l_vu32 * lin volatile unsigned long data type * @var typedef volatile signed long l_vs32 * lin volatile signed long data type * * @var typedef unsigned char l_bool * lin bool data type (true or false) ******************************************************************************/ typedef signed char l_s8; typedef unsigned char l_u8; typedef volatile signed char l_vs8; typedef volatile unsigned char l_vu8; typedef signed short int l_s16; typedef unsigned short int l_u16; typedef volatile signed short int l_vs16; typedef volatile unsigned short int l_vu16; typedef signed long l_s32; typedef unsigned long l_u32; typedef volatile signed long l_vs32; typedef volatile unsigned long l_vu32; typedef unsigned char l_bool; #define MAKE_PARITY 0 /**< make parity bits */ #define CHECK_PARITY 1 /**< check parity bits */ /* Define diagnostic services id */ #define SERVICE_ASSIGN_NAD 0xB0 /**< assign NAD service */ #define SERVICE_ASSIGN_FRAME_ID 0xB1 /**< assign frame id service */ #define SERVICE_READ_BY_IDENTIFY 0xB2 /**< read by identify service */ #define SERVICE_CONDITIONAL_CHANGE_NAD 0xB3 /**< conditional change NAD service */ #define SERVICE_DATA_DUMP 0xB4 /**< data dump service */ #define SERVICE_ASSIGN_NAD_VIA_SNPD 0xB5 /**< assign NAD via SN service */ #define SERVICE_SAVE_CONFIGURATION 0xB6 /**< save configuration service */ #define SERVICE_ASSIGN_FRAME_ID_RANGE 0xB7 /**< assign frame id range service */ #define SERVICE_READ_DATA_BY_IDENTIFY 0x22 /**< service read data by identifier */ #define SERVICE_WRITE_DATA_BY_IDENTIFY 0x2E /**< service write data by identifier */ #define SERVICE_SESSION_CONTROL 0x10 /**< service session control */ #define SERVICE_IO_CONTROL_BY_IDENTIFY 0x2F /**< service I/O control */ #define SERVICE_FAULT_MEMORY_READ 0x19 /**< service fault memory read */ #define SERIVCE_FAULT_MEMORY_CLEAR 0x14 /**< service fault memory clear */ /* Define PCI's services */ #define PCI_ASSIGN_NAD 0x06 /**< PCI value assign NAD */ #define PCI_READ_BY_IDENTIFY 0x06 /**< PCI value read by identify */ #define PCI_CONDITIONAL_CHANGE_NAD 0x06 /**< PCI value conditional change NAD */ #define PCI_DATA_DUMP 0x06 /**< PCI value data dump */ #define PCI_SAVE_CONFIGURATION 0x01 /**< PCI value save configuration */ #define PCI_ASSIGN_FRAME_ID_RANGE 0x06 /**< PCI value assign frame id range */ /* Define PCI response's services */ #define PCI_RES_ASSIGN_NAD 0x01 /**< PCI response value assign NAD */ #define PCI_RES_READ_BY_IDENTIFY 0x06 /**< PCI response value read by identify */ #define PCI_RES_READ_BY_IDENTIFY1 0x05 /**< PCI response value read by identify1 */ #define PCI_RES_CONDITIONAL_CHANGE_NAD 0x01 /**< PCI response value conditional change NAD */ #define PCI_RES_DATA_DUMP 0x06 /**< PCI response value data dump */ #define PCI_RES_SAVE_CONFIGURATION 0x01 /**< PCI response value save configuration */ #define PCI_RES_ASSIGN_FRAME_ID_RANGE 0x01 /**< PCI response value assign frame id range */ /* Identifire user defined */ #define LIN_READ_USR_DEF_MIN 32U /**< Min user defined */ #define LIN_READ_USR_DEF_MAX 63U /**< Max user defined */ /* Identification */ #define LD_ID_NO_RESPONSE 0x52 /**< Positive response */ #define LD_NEGATIVE_RESPONSE 0x53 /**< Negative response */ #define LD_POSITIVE_RESPONSE 0x54 /**< Positive response */ /** * @var typedef l_u8 lin_tl_pdu_data[8] * PDU data */ typedef l_u8 lin_tl_pdu_data[8]; /**********************************************************************/ /*************** LOW LEVEL DRIVER *******************/ /**********************************************************************/ /** * @enum lin_checksum_type * Checksum type */ typedef enum { NORMAL_CHECKSUM, /**< NORMAL_CHECKSUM */ ENHANCED_CHECKSUM /**< ENHANCED_CHECKSUM */ } lin_checksum_type; /** * @enum lin_lld_event_id * Event id */ typedef enum { LIN_LLD_PID_OK, /**< LIN_LLD_PID_OK */ LIN_LLD_TX_COMPLETED, /**< LIN_LLD_TX_COMPLETED */ LIN_LLD_RX_COMPLETED, /**< LIN_LLD_RX_COMPLETED */ LIN_LLD_PID_ERR, /**< LIN_LLD_PID_ERR */ LIN_LLD_FRAME_ERR , /**< LIN_LLD_FRAME_ERR */ LIN_LLD_CHECKSUM_ERR, /**< LIN_LLD_CHECKSUM_ERR */ LIN_LLD_READBACK_ERR, /**< LIN_LLD_READBACK_ERR */ LIN_LLD_NODATA_TIMEOUT, /**< Nodata timeout */ LIN_LLD_BUS_ACTIVITY_TIMEOUT /**< LIN_LLD_BUS_ACTIVITY_TIMEOUT */ } lin_lld_event_id; /** * @enum lin_lld_mode * Low level driver mode */ typedef enum { LIN_LLD_OK, /**< OK */ LIN_LLD_INVALID_MODE, /**< Invalid mode */ LIN_LLD_INVALID_ID, /**< invalid ID */ LIN_LLD_NO_ID, /**< No ID */ LIN_LLD_INVALID_TIMEBASE, /**< Invalid timebase */ LIN_LLD_INVALID_PARA, /**< Invalid parity */ LIN_LLD_INVALID_IFC /**< Invalid interface */ } lin_lld_mode; #if ((_LIN_SCI_ == 1)|(_LIN_UART_ == 1)) #define IDLE 0x00 /**< IDLE state */ #define SEND_BREAK 0x01 /**< Send break field state */ #define SEND_PID 0x02 /**< send PID state */ #define RECV_SYN 0x03 /**< receive synchronize state */ #define RECV_PID 0x04 /**< receive PID state */ #define IGNORE_DATA 0x05 /**< ignore data state */ #define RECV_DATA 0x06 /**< receive data state */ #define SEND_DATA 0x07 /**< send data state */ #define SEND_DATA_COMPLETED 0x08 /**< send data completed state */ #define PROC_CALLBACK 0x09 /**< proceduce callback state */ #define SLEEP_MODE 0x0A /**< sleep mode state */ #define UNINIT 0xFF /**< uninitialize state */ /** * @var typedef l_u16 sci_channel_name * * @details * SCI channel */ typedef l_u16 sci_channel_name; /** * @var typedef l_u16 uart_channel_name * * @details * UART channel */ #if (_LIN_UART_ == 1) typedef l_u16 uart_channel_name; #endif /* (_LIN_UART_ == 1) */ /** * @union lin_status * status of lin driver */ typedef union { l_u8 byte; /**< a data byte refer to 8 data bits follow */ struct { /* LIN 2.1 */ l_u8 successful_transfer:1; /**< Transfer flag LIN 2.1*/ l_u8 error_in_response:1; /**< Error response LIN 2.1*/ l_u8 bus_activity; /**< Bus activity timeout LIN 2.1*/ /* J2602 */ l_u8 framing_error:1; /**< frame error flag J2602*/ l_u8 checksum_error:1; /**< checksum error flag */ l_u8 readback_error:1; /**< readback error in J2602 to be called Data Error */ l_u8 parity_error:1; /**< frame error flag */ l_u8 reset:1; /**< reset flag (not implemented) */ } bit; } lin_status; #if (LIN_MODE == _MASTER_MODE_) /* lin_node struct */ /** * @struct lin_node * contain informations of a lin node */ typedef struct { #if (_LIN_SCI_ == 1) tSCI* pSCI; /**< pointer to the SCI peripheral */ #endif/* (_LIN_SCI_ = 1) */ #if (_LIN_UART_ == 1) tUART* pUART; /**< pointer to the UART peripheral */ #endif /* (_LIN_UART_ = 1) */ l_bool func; /**< LIN Function : Master=0 or Slave=1 */ l_u8 ifc; /**< LIN core interface number */ l_u8 state; /**< LIN-SCI operational state */ lin_status l_status; /**< LIN status */ l_u8 cnt_byte; /**< Byte counter used when either transmit and receive data */ l_u8 *ptr; /**< pointer to Data out/in */ l_u8 current_id; /**< Current ID */ l_u8 *response_buffer; /**< Frame data pointer */ l_u8 pid; /**< PID to send out */ l_u16 tbit; /**< Tbit */ l_u16 frame_timeout_cnt; /**< Frame timeout counter */ l_u16 res_frame_timeout_cnt; /**< ResponseFrame timeout counter */ l_u16 idle_timeout_cnt; /**< Idle timeout counter */ } lin_node; #endif /* End (LIN_MODE == _MASTER_MODE_) */ #endif /* End (_LIN_SCI_ == 1) */ /**********************************************************************/ /*************** Protocol *******************/ /**********************************************************************/ /** * @enum lin_protocol_handle * List of protocols */ typedef enum { LIN_PROTOCOL_21, /**< LIN protocol version 2.1 */ LIN_PROTOCOL_20, /**< LIN protocol version 2.0 */ LIN_PROTOCOL_J2602 /**< J2602 protocol */ } lin_protocol_handle; /** * @typedef lin_word_status_str * status of lin bus * @union wstatus * word status */ typedef union wstatus { l_u16 word; /**< this is a word, refer to 16 data bits follow*/ /** * @struct bit * */ struct { l_u16 error_in_res:1; /**< Error in response */ l_u16 successful_transfer:1; /**< Successful transfer */ l_u16 overrun:1; /**< Overrun */ l_u16 gotosleep:1; /**< Goto sleep */ l_u16 bus_activity:1; /**< Bus activity */ l_u16 etf_collision:1; /**< Event trigger collision */ l_u16 save_conf:1; /**< Save configuration */ l_u16 dummy:1; /**< Dummy */ l_u16 last_pid:8; /**< Last PID */ } bit; /**< these bits contain data of status */ } lin_word_status_str; /**********************************************************************/ /*************** Interfaces *******************/ /**********************************************************************/ #if (LIN_MODE == _MASTER_MODE_) /** * @enum lin_function * function of lin node (master or slave) */ typedef enum { _MASTER_, /**< master node */ _SLAVE_ /**< slave node */ } lin_function; extern l_ifc_handle lin_diag_interface; #endif /* End (LIN_MODE == _MASTER_MODE_) */ /**********************************************************************/ /*************** Signals *******************/ /**********************************************************************/ /** * @enum lin_signal_type * list of signal types */ typedef enum { LIN_SIG_SCALAR, /**< scalar signal */ LIN_SIG_ARRAY /**< array signal */ } lin_signal_type; /** * @enum lin_diagnostic_signal * List of diagnostic signals */ typedef enum { MasterReqB0, /**< diagnostic master request bit 0 */ MasterReqB1, /**< diagnostic master request bit 1 */ MasterReqB2, /**< diagnostic master request bit 2 */ MasterReqB3, /**< diagnostic master request bit 3 */ MasterReqB4, /**< diagnostic master request bit 4 */ MasterReqB5, /**< diagnostic master request bit 5 */ MasterReqB6, /**< diagnostic master request bit 6 */ MasterReqB7, /**< diagnostic master request bit 7 */ SlaveRespB0, /**< diagnostic slave response bit 0 */ SlaveRespB1, /**< diagnostic slave response bit 1 */ SlaveRespB2, /**< diagnostic slave response bit 2 */ SlaveRespB3, /**< diagnostic slave response bit 3 */ SlaveRespB4, /**< diagnostic slave response bit 4 */ SlaveRespB5, /**< diagnostic slave response bit 5 */ SlaveRespB6, /**< diagnostic slave response bit 6 */ SlaveRespB7 /**< diagnostic slave response bit 7 */ } lin_diagnostic_signal; /**********************************************************************/ /*************** General *******************/ /**********************************************************************/ /* Node atrribute */ /** * @struct lin_product_id * product id structure */ typedef struct { l_u16 supplier_id; /**< Supplier ID */ l_u16 function_id; /**< Function ID */ l_u8 variant; /**< Variant value */ } lin_product_id; /** * @struct lin_node_attribute * attributies of lin node */ typedef struct { lin_protocol_handle lin_protocol; /**< LIN protocol used in node */ l_u8 configured_NAD; /**< NAD value used in configuration command */ l_u8 initial_NAD; /**< Intial NAD */ lin_product_id product_id; /**< Product ID */ l_signal_handle response_error; /**< Signal used to update response error */ l_u8 num_frame_have_esignal; /*!< Number of frame contain error signal */ l_u16* response_error_byte_offset_ptr; /*!< Byte offset of response error signal */ l_u8* response_error_bit_offset_ptr; /*!< Bit offset of response error signal */ l_u8 num_of_fault_state_signal; /**< Num of Fault state signal */ const l_signal_handle *fault_state_signal; /**< List of fault state signal */ l_u16 P2_min; /**< P2 min */ l_u16 ST_min; /**< ST min */ l_u16 N_As_timeout; /**< N_As_timeout */ l_u16 N_Cr_timeout; /**< N_Cr_timeout */ } lin_node_attribute; /**********************************************************************/ /*************** Frame *******************/ /**********************************************************************/ /** * @enum lin_frame_type * types of frame */ typedef enum { LIN_FRM_UNCD = 0x00, /**< Unconditional frame */ LIN_FRM_EVNT = 0x01, /**< Event triggered frame.*/ LIN_FRM_SPRDC = 0x10, /**< Sporadic frame.*/ LIN_FRM_DIAG = 0x11 /**< Diagnostic frame.*/ } lin_frame_type; /** * @enum lin_frame_response * lin frame response */ typedef enum { LIN_RES_NOTHING = 0x00, /**< This frame does not require to response.*/ LIN_RES_PUB = 0x01, /**< Publisher response.*/ LIN_RES_SUB = 0x10 /**< Subscriber response.*/ } lin_frame_response; /** * @struct lin_frame_struct * Informations of frame */ typedef struct { lin_frame_type frm_type; /**< Frame information (unconditional or event triggered..) */ l_u8 frm_len; /**< Length of the frame */ lin_frame_response frm_response; /**< action response when received PID */ l_u16 frm_offset; /**< Frame byte offset in frame buffer */ l_u16 flag_offset; /**< Flag byte offset in flag buffer */ l_u8 flag_size; /**< Flag size in flag buffer */ l_u8 *frame_data; /**< List of Signal to which the frame is associated and its offset */ } lin_frame_struct; /** * @struct lin_associate_frame_struct * Informations of associated frame */ typedef struct { l_u8 num_asct_uncn_pid; /**< Number of associated unconditional frame ID*/ const l_u8* act_uncn_frm; /**< Associated unconditional frame ID. */ #if LIN_MODE == _MASTER_MODE_ l_u8 coll_resolver_id; /**< Collision resolver index in the schedule table, used in event trigger frame case MASTER*/ #endif /* End LIN_MODE == _MASTER_MODE_ */ } lin_associate_frame_struct; /**********************************************************************/ /*************** Schedule table *******************/ /**********************************************************************/ /* Structures of Diagnostic queue */ /** * @typedef l_u8 lin_tl_queue[8] * lin transport layer queue */ typedef l_u8 lin_tl_queue[8]; #if (LIN_MODE == _MASTER_MODE_) /** * @enum lin_sch_tbl_type * Type of schedule table */ typedef enum { LIN_SCH_TBL_NULL, /**< Run nothing */ LIN_SCH_TBL_NORM, /**< Normal schedule table*/ LIN_SCH_TBL_DIAG, /**< Diagnostic schedule table */ LIN_SCH_TBL_GOTO, /**< Goto sleep schedule table */ LIN_SCH_TBL_COLL /**< Collision schedule table */ } lin_sch_tbl_type; /** * @struct lin_schedule_data * lin schedule structure */ typedef struct { l_frame_handle frm_id; /**< Frame ID, in case of unconditional or event triggered frame. For sporadic frame the value will be 0 (zero). */ l_u8 delay_integer; /**< Actual slot time in INTEGER for one frame.*/ lin_tl_queue tl_queue_data; /**< Data used in case of diagnostic or configuration frame*/ } lin_schedule_data; /** * @struct lin_schedule_struct * Informations of schedule */ typedef struct { l_u8 num_slots; /**< Number of frame slots in the schedule table.*/ lin_sch_tbl_type sch_tbl_type; /**< Schedule table type (configuration and normal)*/ const lin_schedule_data *ptr_sch_data; /**< Address of the schedule table.*/ } lin_schedule_struct; #endif /* End (LIN_MODE == _MASTER_MODE_) */ /**********************************************************************/ /*************** Transport Layer /Diagnostic ****************/ /**********************************************************************/ /* Diagnostic mode */ /** * @enum l_diagnostic_mode * Diagnostic mode */ #if (XGATE_SUPPORT == 1) #pragma align on #endif /* End (XGATE_SUPPORT == 1) */ typedef enum { DIAG_NONE, /**< diagnostic none */ DIAG_INTER_LEAVE_MODE, /**< diagnostic interleave mode */ DIAG_ONLY_MODE /**< diagnostic only mode */ } l_diagnostic_mode; #if (XGATE_SUPPORT == 1) #pragma align off #endif /* End (XGATE_SUPPORT == 1) */ /** * @enum lin_service_status * Status of the last configuration call for LIN 2.1 */ #if (XGATE_SUPPORT == 1) #pragma align on #endif /* End (XGATE_SUPPORT == 1) */ typedef enum { LD_SERVICE_BUSY, /**< Service is ongoing */ LD_REQUEST_FINISHED, /**< The configuration request has been completed */ LD_SERVICE_IDLE, /**< The configuration request/response combination has been completed*/ LD_SERVICE_ERROR /**< The configuration request or response experienced an error */ } lin_service_status; #if (XGATE_SUPPORT == 1) #pragma align off #endif /* End (XGATE_SUPPORT == 1) */ /** * @enum lin_last_cfg_result * Status of the last configuration call completed for J2602 */ typedef enum { LD_SUCCESS, /**< The service was successfully carried out */ LD_NEGATIVE, /**< The service failed, more information can be found by parsing error_code */ LD_NO_RESPONSE, /**< No response was received on the request */ LD_OVERWRITTEN /**< The slave response frame has been overwritten by another operation */ } lin_last_cfg_result; /* TL support */ /*------------------------ Transport layer multi frames -----------------------*/ #if (_TL_FRAME_SUPPORT_ == _TL_MULTI_FRAME_) /* TL Descriptor used in the TL/Diagnostic */ #define SF 0x00 /**< single frame */ #define FF 0x01 /**< first frame */ #define CF 0x02 /**< consecutive frame */ /** * @enum ld_queue_status * status of queue */ typedef enum { LD_NO_DATA, /**< Queue is empty, has no data */ LD_DATA_AVAILABLE, /**< data in queue is available */ LD_RECEIVE_ERROR, /**< receive data is error */ LD_QUEUE_FULL, /**< the queue is full */ LD_QUEUE_AVAILABLE, /**< queue is available for insert data */ LD_QUEUE_EMPTY, /**< queue is empty */ LD_TRANSMIT_ERROR /**< error while transmitting */ } ld_queue_status; /** * @enum lin_message_status * status of lin message */ typedef enum { LD_NO_MSG, /**< no message */ LD_IN_PROGRESS, /**< in progress */ LD_COMPLETED, /**< completed */ LD_FAILED, /**< failed */ LD_N_AS_TIMEOUT, /**< N_As timeout */ LD_N_CR_TIMEOUT, /**< N_Cr timeout */ LD_WRONG_SN /**< wrong sequence number */ } lin_message_status; /** * enum lin_diagnostic_state * lin diagnostic state */ typedef enum { LD_DIAG_IDLE, /**< Diagnostic IDLE */ LD_DIAG_TX_ACTIVE, /**< Diagnostic transmit active */ LD_DIAG_TX_PHY, /**< Diagnostic transmit physical */ LD_DIAG_INTERLEAVED_TX, /**< Diagnostic transmit in interleave mode */ LD_DIAG_RX_PHY, /**< Diagnostic receive in physical */ LD_DIAG_INTERLEAVED_RX, /**< Diagnostic receive in interleave mode */ LD_DIAG_RX_FUNCTIONAL /**< Diagnostic receive functional request */ } lin_diagnostic_state; /** * @enum lin_message_timeout_type * types of message timeout */ typedef enum { LD_NO_CHECK_TIMEOUT, /**< No check timeout */ LD_CHECK_N_AS_TIMEOUT, /**< check N_As timeout */ LD_CHECK_N_CR_TIMEOUT /**< check N_Cr timeout */ } lin_message_timeout_type; /** * @struct lin_transport_layer_queue * transport layer queue */ typedef struct { l_u16 queue_header; /**< the first element of queue */ l_u16 queue_tail; /**< the last element of queue */ ld_queue_status queue_status; /**< status of queue */ l_u16 queue_current_size; /**< current size */ const l_u16 queue_max_size; /**< maximume size */ lin_tl_pdu_data *tl_pdu; /**< PDU data */ } lin_transport_layer_queue; #else /* single frame support */ typedef enum { LD_NO_CHECK_TIMEOUT, /**< No check timeout */ LD_CHECK_N_AS_TIMEOUT /**< check N_As timeout */ } lin_message_timeout_type; #endif /* End (_TL_FRAME_SUPPORT_ == _TL_MULTI_FRAME_) */ #if (LIN_MODE == _MASTER_MODE_) /* Multi frame support */ #if (_TL_FRAME_SUPPORT_ == _TL_MULTI_FRAME_) #define INTERLEAVE_MAX_TIMEOUT 15 /** * @struct lin_tl_descriptor * transport layer description */ #if (XGATE_SUPPORT == 1) #pragma align on #endif /* End (XGATE_SUPPORT == 1) */ typedef struct { /* Declaration for both Master and Slave interface */ lin_transport_layer_queue *tl_tx_queue; /**< pointer to transmit queue on TL */ lin_transport_layer_queue *tl_rx_queue; /**< pointer to receive queue on TL */ /* Declaration only for Master interface */ /* message information in transmit queue */ lin_message_status tl_rx_msg_status; /**< cooked rx status */ l_u16 tl_rx_msg_index; /**< index of message in queue */ l_u16 tl_rx_msg_size; /**< Size of message in queue */ lin_message_status tl_receive_msg_status; /**< receive message status */ /* message information in receive queue */ lin_message_status tl_tx_msg_status; /**< cooked tx status */ l_u16 tl_tx_msg_index; /**< index of message in queue */ l_u16 tl_tx_msg_size; /**< Size of message in queue */ lin_last_cfg_result tl_last_cfg_result; /**< Status of the last configuration service in LIN 2.0, J2602 */ l_u8 tl_last_RSID; /**< RSID of the last node configuration service */ l_u8 tl_ld_error_code; /**< Error code in case of positive response */ l_u8 tl_no_of_pdu; /**< number of received pdu */ l_u8 tl_frame_counter; /**< frame counter in received message */ lin_message_timeout_type tl_check_timeout_type; /**< timeout type */ l_u16 tl_check_timeout; /**< timeout counter*/ l_u8 *tl_ident_data; /**< To store address of RAM area contain response */ l_u8 tl_interleave_timeout_counter; /**< interleaved timeout counter */ const l_u8 number_support_sid; l_u8 *tl_service_supported; /*!< diagnostic service supported */ l_u8 *tl_service_flags; /**< diagnostic service flags */ /* Declaration only for Slave interface */ l_u8 tl_slaveresp_cnt; /**< Slave Response data counter */ } lin_tl_descriptor; /** * @struct lin_tl_descriptor1 * transport layer description J2602 */ typedef struct { const lin_tl_pdu_data *tl_tx_single_pdu; /**< pointer to transmit PDU data of Single Frame on TL */ const lin_tl_pdu_data *tl_rx_single_pdu; /**< pointer to receive PDU data of Single Frame on TL */ lin_tl_pdu_data *tl_current_tx_pdu_ptr; /**< current PDU pointer*/ lin_tl_pdu_data *tl_current_rx_pdu_ptr; /**< current PDU pointer*/ /* Declaration only for Master interface */ l_u8 tl_cnt_to_send; /**< Send counter, if=0 no data, #0 number of PDU need to be sent */ lin_service_status tl_service_status; /**< Status of the last configuration service */ lin_last_cfg_result tl_last_cfg_result; /**< Status of the last configuration service in LIN 2.0, J2602 */ l_u8 tl_last_RSID; /**< RSID of the last node configuration service */ l_u8 tl_ld_error_code; /**< Error code in case of positive response */ l_u8 *tl_ident_data; /**< To store address of RAM area contain response */ /* End of declaration for only Master interface */ const l_u8 number_support_sid; l_u8 *tl_service_supported; /*!< diagnostic service supported */ l_u8 *tl_service_flags; /*!< diagnostic service flags */ /* Declaration only for Slave interface */ l_u8 tl_slaveresp_cnt; /**< Slave Response data counter */ /* End of declaration only for Slave interface */ } lin_tl_descriptor1; /** @enum diag_interleaved_state * state of diagnostic interleaved mode */ typedef enum { DIAG_NOT_START, /**< not into slave response schedule with interleaved mode */ DIAG_NO_RESPONSE, /**< master send 0x3D but slave does not response */ DIAG_RESPONSE /**< response receive */ } diag_interleaved_state; #else /* Single frame support */ /** * @struct lin_tl_descriptor1 * transport layer description J2602 */ typedef struct { const lin_tl_pdu_data *tl_tx_single_pdu; /**< pointer to transmit PDU data of Single Frame on TL */ const lin_tl_pdu_data *tl_rx_single_pdu; /**< pointer to receive PDU data of Single Frame on TL */ lin_tl_pdu_data *tl_current_tx_pdu_ptr; /**< current PDU pointer*/ lin_tl_pdu_data *tl_current_rx_pdu_ptr; /**< current PDU pointer*/ /* Declaration only for Master interface */ l_u8 tl_cnt_to_send; /**< Send counter, if=0 no data, #0 number of PDU need to be sent */ lin_service_status tl_service_status; /**< Status of the last configuration service */ lin_last_cfg_result tl_last_cfg_result; /**< Status of the last configuration service in LIN 2.0, J2602 */ l_u8 tl_last_RSID; /**< RSID of the last node configuration service */ l_u8 tl_ld_error_code; /**< Error code in case of positive response */ l_u8 *tl_ident_data; /**< To store address of RAM area contain response */ /* End of declaration for only Master interface */ const l_u8 number_support_sid; l_u8 *tl_service_supported; /*!< diagnostic service supported */ l_u8 *tl_service_flags; /*!< diagnostic service flags */ /* Declaration only for Slave interface */ l_u8 tl_slaveresp_cnt; /**< Slave Response data counter */ /* End of declaration only for Slave interface */ } lin_tl_descriptor; extern lin_message_timeout_type tl_check_timeout_type_array[LIN_NUM_OF_IFCS]; extern l_u16 tl_check_timeout_array[LIN_NUM_OF_IFCS]; #if (XGATE_SUPPORT == 1) #pragma align off #endif /* End (XGATE_SUPPORT == 1) */ #endif /*End (_TL_FRAME_SUPPORT_ == _TL_MULTI_FRAME_)*/ /* End of TL support */ /**********************************************************************/ /*************** Configuration *******************/ /**********************************************************************/ /** * @struct lin_configuration * configuration structure */ typedef struct { lin_protocol_handle lin_protocol_version; /**< Protocol version */ lin_protocol_handle lin_language_version; /**< Language version */ const l_u16 baud_rate; /**< Cluster baudrate */ lin_function function; /**< Function (_MASTER_ or _SLAVE_) */ lin_node_attribute *node_attribute; /**< Node attribute */ /* LIN data pointer */ l_u8 *response_buffer; /**< Response buffer */ l_u8 *successful_transfer; /**< Transfer flag */ l_u8 *error_in_response; /**< Error response */ l_u8 *goto_sleep_flg; /**< Goto sleep flag */ l_u8 *current_pid; /**< Current pid */ lin_word_status_str *word_status; /**< Word status */ /* Protocol */ l_u8 timebase; /**< Timebase only used for master */ l_u8 *diag_signal_tbl; /**< Diagnostic signal list */ l_u8 num_of_frames; /**< Number of frame except diagnostic frames */ l_u8 frame_start; /**< Start index of frame list */ const lin_frame_struct *frame_tbl; /**< Frame list except diagnostic frames */ l_u8 *frame_flg; /**< Frame flag */ l_u8 num_of_schedules; /**< Number of schedule table */ l_u8 schedule_start; /**< Start index of schedule table list */ const lin_schedule_struct *schedule_tbl; /**< Shedule table list */ l_u8 *schedule_start_entry; /**< Start entry of each schedule table */ l_u8 *next_transmit_tick; /**< Used to count the next transmit tick */ l_u8 *active_schedule_id; /**< Active schedule table id */ l_u8 *previous_schedule_id; /**< Previous schedule table id */ l_u8 *diagnostic_frame_to_send; /**< Number of diagnostic frame to send */ /* Multi frame support */ #if (_TL_FRAME_SUPPORT_ == _TL_MULTI_FRAME_) l_diagnostic_mode *diagnostic_mode; /**< Diagnostic mode */ #else /* Single frame support */ l_diagnostic_mode diagnostic_mode; /**< Diagnostic mode */ #endif /* End (_TL_FRAME_SUPPORT_ == _TL_MULTI_FRAME_) */ l_u8 *configuration_RAM; /**< Configuration in RAM */ const l_u16 *configuration_ROM; /**< Configuration in ROM */ /* TL support*/ lin_tl_descriptor *tl_desc; /**< TL Configuration */ #if (_TL_FRAME_SUPPORT_ == _TL_MULTI_FRAME_) lin_diagnostic_state *tl_diag_state; /**< diagnostic state */ lin_service_status *tl_service_status; /**< Status of the last configuration service */ diag_interleaved_state *tl_diag_interleave_state; /**< state of diagnostic interleaved mode */ #endif /* End (_TL_FRAME_SUPPORT_ == _TL_MULTI_FRAME_) */ } lin_configuration; /* End of data definition */ #endif /* End (LIN_MODE == _MASTER_MODE_) */ /***** Macros *****/ #define BIT(A,B) (((A)>>(B))&0x01) /**< return bit has position \a B in byte \a A, A is the variable while */ /* Global functions */ /** * @def CALLBACK_HANDLER(iii, event_id, pid) * call lin_pid_response_callback_handler function in MASTER mode */ #if (LIN_MODE == _MASTER_MODE_) #define CALLBACK_HANDLER(iii, event_id, pid) lin_pid_response_callback_handler((iii), (event_id), (pid)) #else #define CALLBACK_HANDLER(iii, event_id, pid) lin_pid_response_callback_handler((event_id), (pid)) #endif /* End (LIN_MODE == _MASTER_MODE_) */ #if LIN_MODE == _MASTER_MODE_ /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_init (l_ifc_handle iii) * @brief This function will initialize the specified interface (if available) * with the predefine configuration * * @param iii [IN] lin interface handle * * @return #l_u8 *
0 if successful, else return error code * * @SDD_ID LIN_SDD_216 * @endif * * @local_var * -# #lin_hardware_name lin_hw * -# #l_u8 ret *
return this variable at the end of function * * @static_global_var * -# #lin_virtual_ifc * * @details * This function will initialize the specified interface (if available) * with the predefine configuration * * @see #lin_lld_sci_init * @see #lin_lld_xgate_init * @see #lin_lld_slic_init * @see #lin_lld_gpio_init *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_init(l_ifc_handle iii); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_deinit (l_ifc_handle iii) * @brief This function disconnect the node from the cluster and * free all hardware used * * @param iii [IN] lin interface handle * * @return #l_u8 *
0 if successful, else return error code * * @SDD_ID LIN_SDD_217 * @endif * * @local_var * -# #lin_hardware_name lin_hw * -# #l_u8 ret *
return this variable at the end of function * * @static_global_var * -# #lin_virtual_ifc * * @details * This function disconnect the node from the cluster and * free all hardware used * * @see #lin_lld_sci_deinit * @see #lin_lld_xgate_deinit * @see #lin_lld_slic_deinit * @see #lin_lld_gpio_deinit *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_deinit(l_ifc_handle iii); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_get_state ( l_ifc_handle iii ) * * @brief * This function gets current state of an interface *@param iii [IN] lin interface handle * * @return #l_u8 * * @SDD_ID N/A * @endif * * @local_var * -# #l_u8 ret * * @static_global_var * -# #lin_virtual_ifc * * @details * This function gets current state of an interface * * @see #lin_lld_sci_get_state * @see #lin_lld_xgate_get_state * @see #lin_lld_slic_get_state * @see #lin_lld_gpio_get_status *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_get_state(l_ifc_handle iii); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_tx_header (l_ifc_handle iii, l_u8 pid) * @brief Master transmit header * * @param iii [IN] lin interface handle * @param pid [IN] ID of the header to be sent * * @return #void * * @SDD_ID LIN_SDD_219 * @endif * * @local_var * -# #lin_hardware_name lin_hw Indicator of LIN HW * * @static_global_var * -# #lin_virtual_ifc * * @details * Issues the LIN header with specified ID. The function cause the LIN frame transmission, * applicable for the master only * * @see #lin_lld_sci_tx_header * @see #lin_lld_xgate_tx_header *//*END*----------------------------------------------------------------------*/ void lin_lld_tx_header(l_ifc_handle iii, l_u8 pid); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_tx_wake_up (l_ifc_handle iii) * @brief This function send wakeup signal * * @param iii [IN] lin interface handle * * @return #void * * @SDD_ID LIN_SDD_220 * @endif * * @local_var * -# #lin_hardware_name lin_hw Indicator of LIN HW * * @static_global_var * -# #lin_virtual_ifc * * @details * This function send wakeup signal * * @see #lin_lld_sci_tx_wake_up * @see #lin_lld_xgate_tx_wake_up * @see #lin_lld_slic_tx_wake_up * @see #lin_lld_gpio_tx_wake_up *//*END*----------------------------------------------------------------------*/ void lin_lld_tx_wake_up(l_ifc_handle iii); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_int_enable (l_ifc_handle iii) * * @brief Enable the interrupt related the interface * * @param iii [IN] lin interface handle * * @return #void * * @SDD_ID LIN_SDD_221 * @endif * * @local_var * -# #lin_hardware_name lin_hw Indicator of LIN HW * * @static_global_var * -# #lin_virtual_ifc * * @details * This function send wakeup signal * * @see #lin_lld_sci_int_enable * @see #lin_lld_xgate_int_enable * @see #lin_lld_slic_int_enable * @see #lin_lld_gpio_int_enable *//*END*----------------------------------------------------------------------*/ void lin_lld_int_enable(l_ifc_handle iii); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_int_disable (l_ifc_handle iii) * * @brief * Disable the interrupt related the interface * * @param iii [IN] lin interface handle * * @return #l_u8 * * @SDD_ID LIN_SDD_222 * @endif * * @local_var * -# #lin_hardware_name lin_hw Indicator of LIN HW * -# #l_u8 ret * * @static_global_var * -# #lin_virtual_ifc * * @details * Disable the interrupt related the interface * * @see #lin_lld_sci_int_disable * @see #lin_lld_xgate_int_disable * @see #lin_lld_slic_int_disable * @see #lin_lld_gpio_int_disable *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_int_disable(l_ifc_handle iii); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_ignore_response (l_ifc_handle iii) * * @brief * Let the low level driver ignore the next respond * * @param iii [IN] lin interface handle * * @return #void * * @SDD_ID LIN_SDD_223 * @endif * * @local_var * -# #lin_hardware_name lin_hw Indicator of LIN HW * * @static_global_var * -# #lin_virtual_ifc * * @details * Let the low level driver ignore the next respond * (i.e. because the PID is not relevant) * * @see #lin_lld_sci_ignore_response * @see #lin_lld_xgate_ignore_response * @see #lin_lld_slic_ignore_response * @see #lin_lld_gpio_ignore_response *//*END*----------------------------------------------------------------------*/ void lin_lld_ignore_response(l_ifc_handle iii); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_set_low_power_mode (l_ifc_handle iii) * * @brief * Let the low level driver go to low power mode * * @param iii [IN] lin interface handle * * @return #void * * @SDD_ID LIN_SDD_224 * @endif * * @local_var * -# #lin_hardware_name lin_hw Indicator of LIN HW * * @static_global_var * -# #lin_virtual_ifc * * @details * Let the low level driver go to low power mode * (In sleep mode for example) * * @see #lin_lld_sci_set_low_power_mode * @see #lin_lld_xgate_set_low_power_mode * @see #lin_lld_slic_set_low_power_mode * @see #lin_lld_gpio_set_low_power_mode *//*END*----------------------------------------------------------------------*/ void lin_lld_set_low_power_mode(l_ifc_handle iii); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_set_response (l_ifc_handle iii, l_u8 response_length) * * @brief * Switch the low level driver to transmit response state * * @param iii [IN] lin interface handle * @param response_length [IN] length of response * * @return #l_u8 * * @SDD_ID LIN_SDD_225 * @endif * * @local_var * -# #lin_hardware_name lin_hw Indicator of LIN HW * -# #l_u8 ret * * @static_global_var * -# #lin_virtual_ifc * -# #lin_ifc_configuration * * @details * Switch the low level driver to transmit response state * (RX Request for response) * * @see #lin_lld_sci_tx_response * @see #lin_lld_xgate_tx_response * @see #lin_lld_slic_tx_response * @see #lin_lld_gpio_tx_response *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_set_response(l_ifc_handle iii, l_u8 response_length); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_rx_response (l_ifc_handle iii, l_u8 response_length) * * @brief * Switch the low level driver to receiving respond state * * @param iii [IN] lin interface handle * @param response_length [IN] length of response * * @return #l_u8 * * @SDD_ID LIN_SDD_226 * @endif * * @local_var * -# #lin_hardware_name lin_hw Indicator of LIN HW * -# #l_u8 ret * * @static_global_var * -# #lin_virtual_ifc * * @details * Switch the low level driver to receiving respond state * * @see #lin_lld_sci_rx_response * @see #lin_lld_xgate_rx_response * @see #lin_lld_slic_rx_response * @see #lin_lld_gpio_rx_response *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_rx_response(l_ifc_handle iii, l_u8 response_length); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_set_etf_collision_flag (l_ifc_handle iii) * * @brief * Set flag for collision in event trigger frame * * @param * @param * * @return #void * * * @SDD_ID LIN_SDD_ * @endif * * @local_var * * @details * Set flag for collision in event trigger frame* *//*END*----------------------------------------------------------------------*/ void lin_lld_set_etf_collision_flag( /* [IN] interface identifier */ l_ifc_handle iii); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_clear_etf_collision_flag (l_ifc_handle iii) * * @brief * Clear flag for collision in event trigger frame * * @param * @param * * @return #void * * * @SDD_ID LIN_SDD_ * @endif * * @local_var * * @details * Clear flag for collision in event trigger frame* *//*END*----------------------------------------------------------------------*/ void lin_lld_clear_etf_collision_flag( /* [IN] interface identifier */ l_ifc_handle iii); #endif /* End (LIN_MODE == _MASTER_MODE_) */ #if (LIN_MODE == _SLAVE_MODE_) /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_init ( void ) * * @brief * Initialize the specified interface * * @return #l_u8 * * @SDD_ID LIN_SDD_227 * @endif * * @static_global_var * -# #lin_virtual_ifc * * @details * This function will initialize the specified interface (if available) * with the predefine configuration * * @see #lin_lld_sci_init * @see #lin_lld_xgate_init * @see #lin_lld_slic_init * @see #lin_lld_gpio_init *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_init(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_deinit ( void ) * * @brief * disconnect the node from the cluster * * @return #l_u8 * * @SDD_ID LIN_SDD_228 * @endif * * @static_global_var * -# #lin_virtual_ifc * * @details * This function disconnect the node from the cluster and * free all hardware used * * @see #lin_lld_sci_deinit * @see #lin_lld_xgate_deinit * @see #lin_lld_slic_deinit * @see #lin_lld_gpio_deinit *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_deinit(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_get_status ( void ) * * @brief * This function gets current status of an interface * * @return #l_u8 * * @SDD_ID LIN_SDD_229 * @endif * * @local_var * -# #l_u8 ret * * @static_global_var * -# #lin_virtual_ifc * * @details * This function gets current status of an interface * * @see #lin_lld_sci_get_status * @see #lin_lld_xgate_get_status *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_get_status(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_get_state ( void ) * * @brief * This function gets current state of an interface * * @return #l_u8 * * @SDD_ID N/A * @endif * * @local_var * -# #l_u8 ret * * @static_global_var * -# #lin_virtual_ifc * * @details * This function gets current state of an interface * * @see #lin_lld_sci_get_state * @see #lin_lld_xgate_get_state * @see #lin_lld_slic_get_state * @see #lin_lld_gpio_get_status *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_get_state(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_tx_wake_up ( void ) * * @brief * This function send wakeup signal * * @return #void * * @SDD_ID LIN_SDD_230 * @endif * * @static_global_var * -# #lin_virtual_ifc * * @details * This function send wakeup signal * * @see #lin_lld_sci_tx_wake_up * @see #lin_lld_xgate_tx_wake_up * @see #lin_lld_slic_tx_wake_up * @see #lin_lld_gpio_tx_wake_up *//*END*----------------------------------------------------------------------*/ void lin_lld_tx_wake_up(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_int_enable ( void ) * * @brief * Enable the interrupt related the interface * * @return #void * * @SDD_ID LIN_SDD_231 * @endif * * @static_global_var * -# #lin_virtual_ifc * * @details * Enable the interrupt related the interface * * @see #lin_lld_sci_int_enable * @see #lin_lld_xgate_int_enable * @see #lin_lld_slic_int_enable * @see #lin_lld_gpio_int_enable *//*END*----------------------------------------------------------------------*/ void lin_lld_int_enable(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_int_disable ( void ) * * @brief * Disable the interrupt related the interface * * @return #l_u8 * * @SDD_ID LIN_SDD_232 * @endif * * @static_global_var * -# #lin_virtual_ifc * * @details * Disable the interrupt related the interface * * @see #lin_lld_sci_int_disable * @see #lin_lld_xgate_int_disable * @see #lin_lld_slic_int_disable * @see #lin_lld_gpio_int_disable *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_int_disable(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_ignore_response ( void ) * * @brief * Let the low level driver ignore the next respond * * @return #void * * @SDD_ID LIN_SDD_233 * @endif * * @static_global_var * -# #lin_virtual_ifc * * @details * Let the low level driver ignore the next respond * (i.e. because the PID is not relevant) * * @see #lin_lld_sci_ignore_response * @see #lin_lld_xgate_ignore_response * @see #lin_lld_slic_ignore_response * @see #lin_lld_gpio_ignore_response *//*END*----------------------------------------------------------------------*/ void lin_lld_ignore_response(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_set_low_power_mode ( void ) * * @brief * Let the low level driver go to low power mode * * @return #void * * @SDD_ID LIN_SDD_234 * @endif * * @static_global_var * -# #lin_virtual_ifc * * @details * Let the low level driver go to low power mode * (In sleep mode for example) * * @see #lin_lld_uart_set_low_power_mode * @see #lin_lld_sci_set_low_power_mode * @see #lin_lld_xgate_set_low_power_mode * @see #lin_lld_slic_set_low_power_mode * @see #lin_lld_gpio_set_low_power_mode *//*END*----------------------------------------------------------------------*/ void lin_lld_set_low_power_mode(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_set_response (l_u8 response_length) * * @brief * Switch the low level driver to transmit response state * * @param response_length [IN] length of response * * @return #l_u8 * * @SDD_ID LIN_SDD_235 * @endif * * @local_var * -# #l_u8 ret * * @static_global_var * -# #lin_virtual_ifc * -# #lin_lld_response_buffer * * @details * Switch the low level driver to transmit response state * (RX Request for response) * * @see #lin_lld_sci_tx_response * @see #lin_lld_xgate_tx_response * @see #lin_lld_slic_tx_response * @see #lin_lld_gpio_tx_response *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_set_response(l_u8 response_length); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_lld_rx_response (l_u8 response_length) * * @brief * Switch the low level driver to receiving respond state * * @param response_length [IN] length of response * * @return #l_u8 * * @SDD_ID LIN_SDD_236 * @endif * * @static_global_var * -# #lin_virtual_ifc * * @details * Switch the low level driver to receiving respond state * * @see #lin_lld_sci_rx_response * @see #lin_lld_xgate_rx_response * @see #lin_lld_slic_rx_response * @see #lin_lld_gpio_rx_response *//*END*----------------------------------------------------------------------*/ l_u8 lin_lld_rx_response(l_u8 response_length); /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_mcu_reset ( void ) * * @brief * Reset device * * @return #void * * @SDD_ID LIN_SDD_237 * @endif * * @static_global_var * -# #lin_virtual_ifc * * @details * Reset device *//*END*----------------------------------------------------------------------*/ void lin_lld_mcu_reset(void); #endif /* End (LIN_MODE == _SLAVE_MODE_) */ /*FUNCTION*--------------------------------------------------------------*//** * @fn void lin_lld_timer_init ( void ) * * @brief * Initialize the timer * * @return #void * * @SDD_ID LIN_SDD_215 * @endif * * @details * Initialize the timer * * @see #lin_lld_timer_S12X_init * @see #lin_lld_timer_S12_init * @see #lin_lld_timer_S08_init *//*END*----------------------------------------------------------------------*/ void lin_lld_timer_init(void); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_checksum (l_u8 *buffer, l_u8 raw_pid) * * @brief * Calculate checksum byte * * @param *buffer [IN] pointer to buffer * @param raw_pid [IN] product identifier * * @return #l_u8 *
checksum byte * * @SDD_ID LIN_SDD_214 * @endif * * @local_var * -# #l_u8 length * -# #l_u16 check_sum * * @details * Calculate checksum byte *//*END*----------------------------------------------------------------------*/ l_u8 lin_checksum(l_u8 *buffer, l_u8 raw_pid); /*FUNCTION*--------------------------------------------------------------*//** * @fn l_u8 lin_process_parity (l_u8 pid, l_u8 type) * * @brief * Check parity and generate PID * * @param pid [IN] product identifier * @param type [IN] check parity or make parity * * @return #l_u8 *
#pid if checkparity ok, otherwise return 0xFF * * @SDD_ID LIN_SDD_213 * @endif * * @local_var * -# #_lu8 parity * -# #l_u8 ret * * @details * Check parity and generate PID * XGATE Module not use this routine *//*END*----------------------------------------------------------------------*/ l_u8 lin_process_parity(l_u8 pid, l_u8 type); /*****************************************************************/ /**** extern variables ****/ /*****************************************************************/ /***** Common variables *****/ extern const lin_frame_struct lin_frame_tbl[LIN_NUM_OF_FRMS]; extern l_bool lin_frame_flag_tbl[LIN_NUM_OF_FRMS]; extern l_u8 lin_pFrameBuf[LIN_FRAME_BUF_SIZE]; extern l_u8 lin_flag_handle_tbl[LIN_FLAG_BUF_SIZE]; extern volatile l_u8 buffer_backup_data[8]; extern volatile l_u8 lin_frame_updating_flag_tbl[LIN_NUM_OF_FRMS]; /***** Slave mode variables *****/ #if LIN_MODE == _SLAVE_MODE_ #if (_LIN_GPIO_ == 0) && !defined(_MC9S08SC4_H) && !defined(MCU_SKEAZN84) /* diagnostic flag */ extern const l_u8 lin_diag_services_supported[_DIAG_NUMBER_OF_SERVICES_]; extern l_u8 lin_diag_services_flag[_DIAG_NUMBER_OF_SERVICES_]; #endif extern const lin_frame_struct lin_frame_tbl[LIN_NUM_OF_FRMS]; extern l_u8 lin_configuration_RAM[LIN_SIZE_OF_CFG]; extern l_u8 lin_successful_transfer; extern l_u8 lin_error_in_response; extern l_u8 lin_goto_sleep_flg; extern l_u8 lin_save_configuration_flg; extern l_u8 lin_diag_signal_tbl[16]; extern const l_signal_handle response_error; extern l_u8 tl_slaveresp_cnt; extern lin_word_status_str lin_word_status; /** * @var l_u8 frame_index * @details * index of frame in frames table */ extern l_u8 frame_index; extern const l_u16 lin_configuration_ROM[LIN_SIZE_OF_CFG]; /* Configuration stores in ROM */ extern const lin_product_id product_id; extern l_u8 tl_slaveresp_cnt; /**< Slave Response data counter */ /* if single frame */ #if (_TL_FRAME_SUPPORT_ == _TL_SINGLE_FRAME_) extern lin_tl_pdu_data tx_single_pdu_data; extern lin_tl_pdu_data rx_single_pdu_data ; extern lin_tl_pdu_data *tl_current_tx_pdu_ptr; /* current PDU pointer*/ extern lin_tl_pdu_data *tl_current_rx_pdu_ptr; /* current PDU pointer*/ extern lin_message_timeout_type tl_check_timeout_type; /**< timeout type */ extern l_u16 tl_check_timeout; /**< timeout counter*/ extern lin_service_status tl_service_status; /**< Status of the last configuration service */ #else /* Multi frame support */ /*transport layer support */ extern lin_transport_layer_queue lin_tl_tx_queue; /**< transport layer transmit queue */ extern lin_transport_layer_queue lin_tl_rx_queue; /**< transport layer receive queue */ extern lin_message_status tl_rx_msg_status; /**< transport layer rx message status */ extern l_u16 tl_rx_msg_index; /**< rx message index */ extern l_u16 tl_rx_msg_size; /**< rx message size */ extern lin_message_status tl_receive_msg_status; /**< receive message status */ extern lin_message_status tl_tx_msg_status; /**< cooked tx status */ extern l_u16 tl_tx_msg_index; /**< index of message in queue */ extern l_u16 tl_tx_msg_size; /**< Size of message in queue */ extern lin_last_cfg_result tl_last_cfg_result; /**< Status of the last configuration service in LIN 2.0, J2602 */ extern l_u8 tl_last_RSID; /**< RSID of the last node configuration service */ extern l_u8 tl_ld_error_code; /**< Error code in case of positive response */ extern l_u8 tl_no_of_pdu; /**< number of received pdu */ extern l_u8 tl_frame_counter; /**< frame counter in received message */ extern lin_message_timeout_type tl_check_timeout_type; /**< timeout type */ extern l_u16 tl_check_timeout; /**< timeout counter*/ extern l_u8 *tl_ident_data; /**< To store address of RAM area contain response */ /* Declaration only for Slave interface */ extern lin_diagnostic_state tl_diag_state; /**< diagnostic state */ extern lin_service_status tl_service_status; /**< Status of the last configuration service */ #endif /*End (_TL_FRAME_SUPPORT_ == _TL_SINGLE_FRAME_)*/ extern l_u8 lin_current_pid; extern l_u8 lin_configured_NAD; extern const l_u8 lin_initial_NAD; extern const l_u8 num_frame_have_esignal;/*number of frame contain error signal*/ extern const l_u16 lin_response_error_byte_offset[];/*_< response_error>*/ extern const l_u8 lin_response_error_bit_offset[];/*_< response_error>*/ /* if XGATE Support */ #if XGATE_SUPPORT == 1 #pragma DATA_SEG SHARED_DATA /* Define a specific segment to store the data */ extern const lin_hardware_name lin_virtual_ifc; extern l_u8 lin_lld_response_buffer[10]; #pragma DATA_SEG DEFAULT /* Return to default data segment */ #endif /* End (XGATE_SUPPORT == 1) */ /* If XGATE not support */ #if XGATE_SUPPORT == 0 extern const lin_hardware_name lin_virtual_ifc; extern l_u8 lin_lld_response_buffer[10]; #endif /* End (XGATE_SUPPORT == 0) */ #endif /* End (LIN_MODE == _SLAVE_MODE_) */ /***** Master mode variables *****/ #if LIN_MODE == _MASTER_MODE_ extern l_u8 lin_save_configuration_flg[LIN_NUM_OF_IFCS]; /* if XGATE Support */ #if XGATE_SUPPORT == 1 #pragma DATA_SEG SHARED_DATA /* Define a specific segment to store the data */ extern const lin_hardware_name lin_virtual_ifc[LIN_NUM_OF_IFCS]; extern l_u8 lin_lld_response_buffer[LIN_NUM_OF_IFCS][10]; #pragma DATA_SEG DEFAULT /* Return to default data segment */ #endif /* End (XGATE_SUPPORT == 1) */ /* If XGATE not support */ #if XGATE_SUPPORT == 0 extern const lin_hardware_name lin_virtual_ifc[LIN_NUM_OF_IFCS]; #endif /* End (XGATE_SUPPORT == 1) */ extern const lin_configuration lin_ifc_configuration[LIN_NUM_OF_IFCS]; #endif /* End (LIN_MODE == _MASTER_MODE_) */ /*****************************************************************/ /**** extern api functions ****/ /*****************************************************************/ /********************************/ /******* common core apis *******/ /*********************************/ extern l_bool l_sys_init (void); /*********************************/ /***** APIs for Master Mode ******/ /*********************************/ #if LIN_MODE == _MASTER_MODE_ extern void l_sch_set (l_ifc_handle iii, l_schedule_handle schedule_iii, l_u8 entry); extern l_u8 l_sch_tick (l_ifc_handle iii); extern void l_ifc_goto_sleep (l_ifc_handle iii); #endif /* End (LIN_MODE == _MASTER_MODE_) */ /*********************************/ /***** APIs for Slave Mode *******/ /*********************************/ extern l_bool l_ifc_init (l_ifc_handle iii); extern void l_ifc_wake_up (l_ifc_handle iii); extern void l_ifc_rx (l_ifc_handle iii); extern void l_ifc_tx (l_ifc_handle iii); extern l_u16 l_ifc_read_status (l_ifc_handle iii); extern void l_ifc_aux (l_ifc_handle iii); extern l_u16 l_sys_irq_disable (l_ifc_handle iii); extern void l_sys_irq_restore (l_ifc_handle iii); #if LIN_MODE == _SLAVE_MODE_ #if (_TL_FRAME_SUPPORT_ == _TL_MULTI_FRAME_) /* INITIALIZATION */ extern void ld_init(void); /* RAW APIs */ extern void ld_put_raw(const l_u8* const data); extern void ld_get_raw(l_u8* const data); extern l_u8 ld_raw_tx_status(void); extern l_u8 ld_raw_rx_status(void); /* COOKED APIs */ extern void ld_send_message(l_u16 length, const l_u8* const data); extern void ld_receive_message(l_u16* const length, l_u8* const data); extern l_u8 ld_tx_status(void); extern l_u8 ld_rx_status(void); extern l_u8 diag_get_flag(l_u8 flag_order); extern void diag_clear_flag(l_u8 flag_order); #endif /* End (_TL_FRAME_SUPPORT_ == _TL_MULTI_FRAME_) */ #if LIN_PROTOCOL == PROTOCOL_J2602 extern l_bool ld_assign_NAD_j2602(l_u8 dnn); extern l_bool ld_reconfig_msg_ID(l_u8 dnn); #endif /* End LIN_PROTOCOL == PROTOCOL_J2602 */ #endif /* End LIN_MODE == _SLAVE_MODE_) */ /* J2602 core apis */ extern l_bool l_ifc_connect (l_ifc_handle iii); extern l_bool l_ifc_disconnect (l_ifc_handle iii); /****************************************/ /******** Transport layer APIs **********/ /****************************************/ /*********************************/ /***** APIs for Master Mode ******/ /*********************************/ #if LIN_MODE == _MASTER_MODE_ /* Multi frame support */ #if (_TL_FRAME_SUPPORT_ == _TL_MULTI_FRAME_) extern void ld_init(l_ifc_handle iii); extern void ld_put_raw(l_ifc_handle iii,const l_u8* const data); extern void ld_get_raw(l_ifc_handle iii,l_u8* const data); extern l_u8 ld_raw_tx_status(l_ifc_handle iii); extern l_u8 ld_raw_rx_status(l_ifc_handle iii); extern void ld_send_message(l_ifc_handle iii, l_u16 length, l_u8 NAD, const l_u8* const data); extern void ld_receive_message(l_ifc_handle iii, l_u16* const length, l_u8* const NAD, l_u8* const data); extern l_u8 ld_tx_status(l_ifc_handle iii); extern l_u8 ld_rx_status(l_ifc_handle iii); extern l_u8 diag_get_flag(l_ifc_handle iii,l_u8 flag_order); extern void diag_clear_flag(l_ifc_handle iii,l_u8 flag_order); #endif /* End (_TL_FRAME_SUPPORT_ == _TL_MULTI_FRAME_) */ extern void ld_assign_NAD(l_ifc_handle iii, l_u8 initial_NAD, l_u16 supplier_id, l_u16 function_id, l_u8 new_NAD); extern void ld_conditional_change_NAD (l_ifc_handle iii, l_u8 NAD, l_u8 id, l_u8 byte, l_u8 mask, l_u8 invert, l_u8 new_NAD); extern void ld_read_by_id (l_ifc_handle iii, l_u8 NAD, l_u16 supplier_id, l_u16 function_id, l_u8 id, l_u8* const data); /***** J2602 *****/ #if LIN_PROTOCOL == PROTOCOL_J2602 extern l_bool ld_is_ready (l_ifc_handle iii); extern l_u8 ld_check_response (l_ifc_handle iii, l_u8* const RSID, l_u8* const error_code); extern void ld_assign_frame_id_range (l_ifc_handle iii, l_u8 initial_NAD, l_u16 supplier_id, l_u16 message_id, l_u8 PID); extern l_bool ld_assign_NAD_j2602(l_ifc_handle iii, l_u8 dnn); extern l_bool ld_reconfig_msg_ID(l_ifc_handle iii, l_u8 dnn); #endif /* End (LIN_PROTOCOL == PROTOCOL_J2602) */ /***** LIN21 *****/ #if LIN_PROTOCOL == PROTOCOL_21 extern l_u8 ld_is_ready (l_ifc_handle iii); extern void ld_check_response (l_ifc_handle iii, l_u8* const RSID, l_u8* const error_code); extern void ld_assign_frame_id_range (l_ifc_handle iii,l_u8 NAD, l_u8 start_index, const l_u8* const PIDs); #endif /* End (LIN_PROTOCOL == PROTOCOL_21) */ l_u8 ld_read_by_id_callout(l_ifc_handle iii, l_u8 id, l_u8 *data); #endif /* End (LIN_MODE == _MASTER_MODE_) */ #endif /* _LIN_H */ /** @} */