K74B/87400/usr/library/linStackTask.h

533 lines
17 KiB
C
Raw Normal View History

2024-01-25 14:22:18 +08:00
/**
* @copyright 2015 Indie Semiconductor.
*
* This file is proprietary to Indie Semiconductor.
* All rights reserved. Reproduction or distribution, in whole
* or in part, is forbidden except by express written permission
* of Indie Semiconductor.
*
* @file lin_stack.h
*/
#ifndef LIN_STACK_H__
#define LIN_STACK_H__
#include <stdint.h>
#include <taskManager.h>
#include <lin_device.h>
/**
* @brief The definitions and enumerations used in the API function in LIN stack.
*/
typedef uint8_t l_bool;
typedef uint8_t l_ioctl_op;
typedef uint8_t l_irqmask;
typedef uint8_t l_u8;
typedef uint16_t l_u16;
typedef uint32_t l_u32;
typedef uint8_t l_signal_handle;
typedef uint8_t l_flag_handle;
typedef uint8_t l_ifc_handle;
typedef uint8_t l_schedule_handle;
typedef enum{
LIN_PCI_SF = 0U,
LIN_PCI_FF,
LIN_PCI_CF
}PCI_Types_t;
typedef enum{
PDU_TYPE_SINGLE_PDU = 0U,
PDU_TYPE_MULTI_PDU,
}PDU_Types_t;
typedef enum{
TX_IDLE = 0U,
TX_SENDING,
TX_FINISHED,
TX_FAILED
}TxStatus_t;
typedef enum{
LIN_PROTOCOL_LIN2_2A = 0U,
LIN_PROTOCOL_SAE_J2602,
}LinProtocolType_t;
typedef enum{
J2602_ERROR_NO_DETECTED_FAULT = 0,
J2602_ERROR_RESET,
J2602_ERROR_RESERVED0,
J2602_ERROR_RESERVED1,
J2602_ERROR_DATA_ERROR,
J2602_ERROR_CHECKSUM_ERROR,
J2602_ERROR_BYTE_FIELD_FRAMING_ERROR,
J2602_ERROR_ID_PARITY_ERROR,
}J2602ErrCode_t;
#define SF_MAX_DATA_LENGTH (5U)
#define LIN_NAD_FUNCTION (0x7EU)
#define LIN_NAD_WILDCARD (0x7FU)
#define LIN_SUPPLIER_ID_WILDCARD (0x7FFFU)
#define LIN_FUNCTION_ID_WILDCARD (0xFFFFU)
#define LIN_SERIALNO_WILDCARD (0x01234567U)
/**
* @brief The enumerations of frame identifiers.
*/
#define LIN_FRAME_ID_J2602_DNN_BROADCAST_START (0x38U)
#define LIN_FRAME_ID_J2602_DNN_BROADCAST_END (0x3BU)
#define LIN_FRAME_ID_J2602_DNN_BROADCAST_38 (0x38U)
#define LIN_FRAME_ID_J2602_DNN_BROADCAST_39 (0x39U)
#define LIN_FRAME_ID_J2602_DNN_BROADCAST_3A (0x3AU)
#define LIN_FRAME_ID_J2602_DNN_BROADCAST_3B (0x3BU)
#define LIN_FRAME_ID_DIAG_MASTER_REQ (0x3CU)
#define LIN_FRAME_ID_DIAG_SLAVER_RSP (0x3DU)
#define LIN_FRAME_ID_DIAG_MASTER_REQ_3E (0x3EU)
#define LIN_FRAME_ID_FUNCTIONAL (0x7EU)
#define LIN_FRAME_ID_UNASSIGN (0x00U)
#define LIN_FRAME_ID_DONOTCARE (0xFFU)
/**
* @brief The enumerations of service IDs.
*/
#define LIN_SID_ASSIGN_NAD (0xB0U)
#define LIN_SID_ASSIGN_FRAME_ID (0xB1U)
#define LIN_SID_READ_BY_ID (0xB2U)
#define LIN_SID_CONDITIONAL_CHANGE_NAD (0xB3U)
#define LIN_SID_DATA_DUMP (0xB4U)
#define LIN_SID_RESERVED (0xB5U)
#define LIN_SID_SAVE_CONFIGURATION (0xB6U)
#define LIN_SID_ASSIGN_FRAME_ID_RANGE (0xB7U)
#define LIN_SID_SNPD LIN_SID_RESERVED
#define LIN_SID_J2602_HARDWARE_RST LIN_SID_RESERVED
typedef union{
struct{
uint8_t appInfo0 :1;
uint8_t appInfo1 :1;
uint8_t appInfo2 :1;
uint8_t appInfo3 :1;
uint8_t appInfo4 :1;
uint8_t err :3;
};
uint8_t payload;
}J2602StatusByte_t;
typedef union{
struct{
uint8_t nad;
union{
uint8_t pci;
struct{
uint8_t pci_extInfo :4;
uint8_t pci_type :4;
};
};
union{
uint8_t sid;
uint8_t length;
uint8_t rsid;
struct{
uint8_t length_ff;
uint8_t sid_rsid_ff;
};
uint8_t payload[6];
};
};
uint8_t data[8];
uint64_t data64;
}NodeStruct_t;
typedef struct{
PDU_Types_t type; /* pdu type single or multi pdu */
uint8_t sid; /* sid */
uint16_t packLength; /* the complete valid data buffer length except the length of sid */
uint8_t *payload; /* data in received buffer */
}DiagSubscribeInfo_t;
typedef struct{
PDU_Types_t type; /* pdu type single or multi pdu */
uint8_t sid; /* sid */
uint16_t packLength; /* the complete valid data buffer length except the length of SID */
uint8_t *payload; /* data buffer to be sent except SID*/
}DiagPublishInfo_t;
typedef struct{
uint16_t buffLength; /* the complete valid data buffer length except the length of SID */
uint8_t *buff; /* data buffer to be sent except SID*/
}DiagMultiPduInfo_t;
typedef enum{
SLEEP_REQ_TYPE_NONE = 0U, /* none of sleep request */
SLEEP_REQ_TYPE_MASTER_REQ, /* sleep request with filled with 0xFF in buff[1-7] */
SLEEP_REQ_TYPE_MASTER_REQ_INFORMAL, /* sleep request without filled with 0xFF in buff[1-7] */
SLEEP_REQ_TYPE_BUS_IDLE_TIMEROUT,
}SleepRequestType_t;
typedef enum{
BUS_WAKEUP_REQ_RESULT_MASTER_ACTIVE = 0, /* wakeup bus successfully, master send frame ID after wake up */
BUS_WAKEUP_REQ_RESULT_REQ_TIMEOUT, /* wakeup bus failed after 3 tries */
}BusWakeUpRequestResult_t;
typedef void (*ls_UnconditionalReqCallback_t)(LIN_Device_Frame_t const *frame);
typedef void (*ls_UnconditionalRspCallback_t)(LIN_Device_Frame_t *const frame);
typedef void (*ls_PublisherTxFinishedCallback_t)(uint8_t fid, uint8_t j2602CfgRsp);
typedef void (*ls_DiagReqCallback_t)(const DiagSubscribeInfo_t * const frameInfo);
typedef void (*ls_DiagFunctionalNADCallback_t)(const NodeStruct_t * const frame);
typedef void (*ls_DiagSleepReqCallback_t)(SleepRequestType_t type);
typedef void (*ls_BusWakeUpRequestCallback_t)(BusWakeUpRequestResult_t result);
typedef void (*ls_DiagReqLogCallback_t)(const LIN_Device_Frame_t * const frame);
typedef void (*ls_FrameIdLogCallback_t)(uint8_t frameId);
typedef void (*ls_SAEJ2602CfgReqCallback_t)(uint8_t fid,uint8_t const *payload, uint8_t length);
typedef void (*ls_SAEJ2602DNNBroadcastReqCallback_t)(uint8_t fid,uint8_t const *payload, uint8_t length);
typedef struct{
ls_UnconditionalReqCallback_t unconditionalSubscribedCallback; /* received data from master */
ls_UnconditionalRspCallback_t unconditionalPublishedCallback; /* send data to master */
ls_PublisherTxFinishedCallback_t publisherTxFinishedCallback; /* send data to master finished */
ls_DiagReqCallback_t diagnosticSubscribedCallback; /* Diagnostic and MultiPDU received data from master */
ls_DiagFunctionalNADCallback_t diagFunctionalNADCallback; /* special functional NAD (0x7E) handler*/
ls_DiagSleepReqCallback_t diagnosticSleepRequestCallback; /* Diagnostic sleep request from master */
ls_BusWakeUpRequestCallback_t busWakeUpRequestCallback; /* got the bus state after slave sending wake up signal.*/
ls_SAEJ2602CfgReqCallback_t SAEJ2602CfgReqCallback; /* refers to SAEJ2602-1 5.7.2.3 Configuration Messages */
ls_SAEJ2602DNNBroadcastReqCallback_t SAEJ2602DNNBroadcastReqCallback; /* DNN Based Broadcast Messages */
}ls_LinsFramesCallback_t;
typedef struct{
l_u8 device; /* 1: means realplum(IND83205) , 2: rugby(IND83204) 3: realplumPro(IND82209),4: rugbyPro(IND83211),5: realplumLite(IND83212)*/
l_u8 protocol; /* 0:with LIN stack V2.2A ,1: with LIN stack SAE_J2602, 2: with LIN stack V2.2A_SAE_J2602 */
l_u16 version; /* 0x0101 means V1.01 */
}lin_stack_version_t;
/**
* @brief A structure to represent LIN status information.
*/
typedef union {
struct{
l_u8 error_in_resp :1;
l_u8 success_in_transfer :1;
l_u8 overrun :1;
l_u8 goto_sleep :1;
l_u8 bus_activity :1;
l_u8 event_trig_frame_collision :1;
l_u8 save_config :1;
l_u8 parity_error :1; /* FID parity error bit */
l_u8 pid;
};
l_u16 payload;
}lin_status_t;
typedef enum{
LD_SET_OK = 0,
LD_LENGTH_NOT_CORRECT,
LD_DATA_ERROR
}ld_set_status_t;
typedef enum{
LD_READ_OK = 0,
LD_LENGTH_TOO_SHORT,
}ld_read_status_t;
/*
* Lin stack main task which was called by task manager, please don't use for other purpose!!!:
* @param [in] none
* @return none
*/
void LinStack_TaskHandler(void);
/*
* Get current Lin stack version:
* @param [in] none
* @return lin_stack_version: majorVer: main version; subVer: branch version
*/
lin_stack_version_t ls_get_lin_version(void);
/*
* Lin stack initialization:
* @param [in] none
* @return 0
*/
l_bool l_sys_init(void);
/*
* Set Lin transport layer timeout parameters:
* @param [in] n_as: N_As, refer to LIN spec 2.2A
* @param [in] n_cr: N_Cr, refer to LIN spec 2.2A
* @return 0
*/
l_u8 ls_set_tp_timeout(uint16_t n_as, uint16_t n_cr);
/*
* Set Lin lin tx bit monitor:
* @param [in] enable: TRUE: enable bit monitor; FALSE: disable bit monitor
* @return 0
*/
l_u8 ls_set_tx_bit_monitor(l_u8 enable);
/*
* Disable LIN auto sleep when LIN timeout:
* @param [in] TRUE: disable auto sleep; FALSE: enable auto sleep
* @return 0
*/
l_u8 ls_disable_lin_auto_sleep(l_u8 disable);
/*
* Set Lin phy 1st rx glitch signal filter timing :
* @param [in] risingTime: level 0 -> level1 delay time; range 0-127 unit: 62.5us
* @param [in] fallingTime:level 0 -> level 1 delay time, range 0-127 unit: 62.5us
* @return 0, successfully , others: failed
*/
l_u8 ls_set_lins_rx_glitch_filter_1st(l_u8 risingTime,l_u8 fallingTime);
/*
* Set Lin phy 2nd rx glitch signal filter timing :
* @param [in] risingTime: level 0 -> level1 delay time; range 0-127 unit: 62.5us
* @param [in] fallingTime:level 0 -> level 1 delay time, range 0-127 unit: 62.5us
* @return 0, successfully , others: failed
*/
l_u8 ls_set_lins_rx_glitch_filter_2nd(l_u8 risingTime,l_u8 fallingTime);
/*
* Set Lin phy 3rd rx glitch signal filter timing :
* @param [in] risingTime: level 0 -> level1 delay time; range 0-127 unit: 62.5us
* @param [in] fallingTime:level 0 -> level 1 delay time, range 0-127 unit: 62.5us
* @return 0, successfully , others: failed
*/
l_u8 ls_set_lins_rx_glitch_filter_3rd(l_u8 risingTime,l_u8 fallingTime);
/*
* Reqister supported unconditional frame table
* @param [in] protocol: LIN protocol type 0: LIN_PROTOCOL_LIN2_2A, 1: LIN_PROTOCOL_SAE_J2602.
* @param [in] frameTable: frame table location
* @param [in] tableSize: frame table size
* @param [in] diagPDUSubscriberBuffLength: diagnostic multi pdu max supported data length, this value should be within 7-4095
* @param [in] pFunCallback: callback fucntions for diagnostic frame and unconditional frames.
* @return none
*/
void ls_register_services(LinProtocolType_t protocol,LIN_Device_Frame_t *frameTable, l_u8 tableSize, DiagMultiPduInfo_t multiPduInfo,const ls_LinsFramesCallback_t *pFunCallback);
/*
* Diagnostic frame response function which is used to send back data to LIN master.
* @param [in] rsp: refer to description of structure DiagPublishInfo_t definition.
* @return none
*/
void ls_handle_diagnostic_response(DiagPublishInfo_t *rsp);
/*
* SAEJ2602 CFG 0x3C or 0x3E frame response function which is used to send back data to LIN master.
* @param [in] rsp: refer to SAEJ2602-1 5.7.2.4 Response Message to Options 2 and 3 in 5.7.2.3.
* @param [in] statusByte:J2602-1 Status Byte(defined in 5.8.6)
* @param [in] payload: databuff 0-6 the paylad length should be 7 by default.
* @return none
*/
void ls_handle_SAEJ2602Cfg_response(l_u8 statusByte, l_u8 *payload);
/*
*!!!!!!!!!!!!!!!!!!!Note that obsolete not recommended for future use!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* frame response send status.
* @return TxStatus_t.
*/
TxStatus_t ls_tx_status(void);
/*
* Set device initial NAD to LIN stack for assigning NAD command.
* @param [in] nad: initial NAD of device.
* @return none
*/
void ls_set_initialNad(l_u8 nad);
/*
* Set device NAD to LIN stack.
* @param [in] nad: current NAD of device.
* @return none
*/
void ls_set_nad(l_u8 nad);
/*
* Red NAD of LIN stack.
* @param [in] none.
* @return current NAD of LIN stack.
*/
l_u8 ls_read_nad(void);
/*
* Red NAD of current diagnostic frame sent from LIN master, there are only probably 2 values: current NAD or 0x7FU(NAD wildcard).
* @param [in] none.
* @return NAD of current diagnostic frame.
*/
l_u8 ls_read_nad_from_master(void);
/*
* any invalid diag frame would be handled ignore the frame is or is not for current node when set to 1U.
* @param [in] value 0U: ignore the diag frame error when it is not for current node, 1U: any invalid diag frame would be handled ignore the frame is or is not for current node when set to 1U.
* @return TRUE.
*/
l_u8 ls_diag_error_in_all_diag_frames(uint8_t value);
/*
* Save current LIN Stack parameters such as NAD, PIDs etc. refer to pdsTask for more information.
* @param [in] none.
* @return 0.
*/
l_u8 ls_save_configuration(void);
/*
* clear save_configuration flag.
* @param [in] none.
* @return 0.
*/
l_u8 ls_clr_save_configuration_flag(void);
/*
* !!!!!!!!!!!!!!!!!!!Note that obsolete not recommended for future use!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* replace with function ls_ifc_read_status() and ls_ifc_read_status()
* Read current error flag and system information, refer to struture lin_status_t for more information.
* @param [in] none.
* @return:
l_u8 error_in_resp :1;
l_u8 success_in_transfer :1;
l_u8 overrun :1;
l_u8 goto_sleep :1;
l_u8 bus_activity :1;
l_u8 event_trig_frame_collision :1;
l_u8 save_config :1;
l_u8 parity_error :1;
l_u8 pid;
*/
l_u16 ls_read_sys_status(void);
/*
* !!!!!!!!!!!!!!!!!!!Note that obsolete not recommended for future use!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* replace with function ls_ifc_read_status() and ls_ifc_read_status()
* Read current error flag and system information, simulate with ls_read_sys_status
* @return:
l_u8 error_in_resp :1;
l_u8 success_in_transfer :1;
l_u8 overrun :1;
l_u8 goto_sleep :1;
l_u8 bus_activity :1;
l_u8 event_trig_frame_collision :1;
l_u8 save_config :1;
l_u8 parity_error :1;
l_u8 pid;
*/
lin_status_t ls_read_sys_status_ext(void);
/*
* Read current error flag and system information, simulate with ls_read_sys_status not don't clear the status
* @return:
l_u8 error_in_resp :1;
l_u8 success_in_transfer :1;
l_u8 overrun :1;
l_u8 goto_sleep :1;
l_u8 bus_activity :1;
l_u8 event_trig_frame_collision :1;
l_u8 save_config :1;
l_u8 parity_error :1;
l_u8 pid;
*/
lin_status_t ls_ifc_read_status(void);
/*
* reset lin error status.
* @param [in] errCode.
* @return: 0U;
*/
l_u8 ls_ifc_clear_error_status(void);
/*
* !!!!!!!!!!!!!!!!!!!Note that obsolete not recommended for future use!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* replace with function : ls_read_error_code_log() and ls_clr_error_code_log()
* Read current lin stack communication error reasons, this is only for internal use.
* @param [in] none.
* @return: ((1U << ERROR_BITERR_POS) | (1U << ERROR_CHK_POS) | (1U << ERROR_BITMON_POS) | (1U << ERROR_FRAMEERR_POS)) refer to LINS->ERROR register
*/
l_u8 ls_read_error_code(void);
/*
* Read current lin stack communication error reasons, this is only for internal use and don't clear the error log
* @param [in] none.
* @return: ((1U << ERROR_BITERR_POS) | (1U << ERROR_CHK_POS) | (1 << ERROR_PARITY_POS) | (1U << ERROR_BITMON_POS) | (1U << ERROR_FRAMEERR_POS))refer to LINS->ERROR register
*/
l_u8 ls_read_error_code_log(void);
/*
* clear the erroe code log.
* @param [in] none.
* @return: 0;
*/
l_u8 ls_clr_error_code_log(void);
/*
* Read SAEJ2602 communication error state.
* @param [in] none.
* @return: J2602ErrCode_t
*/
J2602ErrCode_t ls_read_J2602_error_code(void);
/*
* reset SAEJ2602 communication error state when response successfully.
* @param [in] errCode.
* @return: none
*/
void ls_reset_J2602_error_code(J2602ErrCode_t errCode);
/*
* Notice lin stack it's a hardware reset operation.
* @param [in] 0: hardware reset is false, 1: hardware reset is true.
* @return: none
*/
void ls_set_J2602_hardware_reset(uint8_t hardwareReset);
/*
* read go_to_sleep flag
* @param [in] none.
* @return: state: 1: got go_to_sleep command, 0: not got go_to_sleep command
*/
l_u8 ls_read_go_to_sleep_flag(void);
/*
* Clear go_to_sleep flag
* @param [in] none.
* @return: 0U
*/
l_u8 ls_clr_go_to_sleep_flag(void);
/*
* Clear overrun flag
* @param [in] none.
* @return: 0U
*/
l_u8 ls_clr_overrun_flag(void);
/*
* Read current LIN BUS Status.
* @param [in] none.
* @return: 1: active, 0: IDLE;, refer to "bus_activity" in function:ls_ifc_read_status();
*/
l_u32 ls_linbus_activity(void);
/*
* Slave trigger to send wake up signal on LIN bus for 3 times if there is no LIN frame on the LIN bus after wake up signal.
* @param [in] none.
* @return: none;
*/
void ls_send_wake_up_bus_signal(void);
#endif /* __LIN_STACK_H__ */