ppavel@26: /* canmsg.h - common kernel-space and user-space CAN message structure
ppavel@26:  * Linux CAN-bus device driver.
ppavel@26:  * Written by Pavel Pisa - OCERA team member
ppavel@26:  * email:pisa@cmp.felk.cvut.cz
ppavel@26:  * This software is released under the GPL-License.
ppavel@26:  * Version lincan-0.3  17 Jun 2004
ppavel@26:  */
ppavel@26: 
ppavel@26: #ifndef _CANMSG_T_H
ppavel@26: #define _CANMSG_T_H
ppavel@26: 
ppavel@26: #ifdef __KERNEL__
ppavel@26: 
ppavel@26: #include <linux/time.h>
ppavel@26: #include <linux/types.h>
ppavel@26: 
ppavel@26: #else /* __KERNEL__ */
ppavel@26: 
ppavel@26: #include <sys/time.h>
ppavel@26: #include <sys/types.h>
ppavel@26: 
ppavel@26: #endif /* __KERNEL__ */
ppavel@26: 
ppavel@26: #ifdef __cplusplus
ppavel@26: extern "C" {
ppavel@26: #endif
ppavel@26: 
ppavel@26: /*
ppavel@26:  * CAN_MSG_VERSION_2 enables new canmsg_t layout compatible with
ppavel@26:  * can4linux project from http://www.port.de/
ppavel@26:  *
ppavel@26:  */
ppavel@26: #define CAN_MSG_VERSION_2
ppavel@26: 
ppavel@26: /* Number of data bytes in one CAN message */
ppavel@26: #define CAN_MSG_LENGTH 8
ppavel@26: 
ppavel@26: #ifdef CAN_MSG_VERSION_2
ppavel@26: 
ppavel@26: typedef struct timeval canmsg_tstamp_t ;
ppavel@26: 
ppavel@26: typedef unsigned long canmsg_id_t;
ppavel@26: 
ppavel@26: /**
ppavel@26:  * struct canmsg_t - structure representing CAN message
ppavel@26:  * @flags:  message flags
ppavel@26:  *      %MSG_RTR .. message is Remote Transmission Request,
ppavel@26:  *	%MSG_EXT .. message with extended ID,
ppavel@26:  *      %MSG_OVR .. indication of queue overflow condition,
ppavel@26:  *	%MSG_LOCAL .. message originates from this node.
ppavel@26:  * @cob:    communication object number (not used)
ppavel@26:  * @id:     ID of CAN message
ppavel@26:  * @timestamp: not used
ppavel@26:  * @length: length of used data
ppavel@26:  * @data:   data bytes buffer
ppavel@26:  *
ppavel@26:  * Header: canmsg.h
ppavel@26:  */
ppavel@26: struct canmsg_t {
ppavel@26: 	int             flags;
ppavel@26: 	int             cob;
ppavel@26: 	canmsg_id_t     id;
ppavel@26: 	canmsg_tstamp_t timestamp;
ppavel@26: 	unsigned short  length;
ppavel@26: 	unsigned char   data[CAN_MSG_LENGTH];
ppavel@26: };
ppavel@26: 
ppavel@26: #else /*CAN_MSG_VERSION_2*/
ppavel@26: #ifndef PACKED
ppavel@26: #define PACKED __attribute__((packed))
ppavel@26: #endif
ppavel@26: /* Old, deprecated version of canmsg_t structure */
ppavel@26: struct canmsg_t {
ppavel@26: 	short		flags;
ppavel@26: 	int		cob;
ppavel@26: 	canmsg_id_t	id;
ppavel@26: 	unsigned long	timestamp;
ppavel@26: 	unsigned int	length;
ppavel@26: 	unsigned char	data[CAN_MSG_LENGTH];
ppavel@26: } PACKED;
ppavel@26: #endif /*CAN_MSG_VERSION_2*/
ppavel@26: 
ppavel@26: typedef struct canmsg_t canmsg_t;
ppavel@26: 
ppavel@26: /**
ppavel@26:  * struct canfilt_t - structure for acceptance filter setup
ppavel@26:  * @flags:  message flags
ppavel@26:  *      %MSG_RTR .. message is Remote Transmission Request,
ppavel@26:  *	%MSG_EXT .. message with extended ID,
ppavel@26:  *      %MSG_OVR .. indication of queue overflow condition,
ppavel@26:  *	%MSG_LOCAL .. message originates from this node.
ppavel@26:  *	there are corresponding mask bits
ppavel@26:  *	%MSG_RTR_MASK, %MSG_EXT_MASK, %MSG_LOCAL_MASK.
ppavel@26:  *	%MSG_PROCESSLOCAL enables local messages processing in the
ppavel@26:  *	combination with global setting
ppavel@26:  * @queid:  CAN queue identification in the case of the multiple
ppavel@26:  *	    queues per one user (open instance)
ppavel@26:  * @cob:    communication object number (not used)
ppavel@26:  * @id:     selected required value of cared ID id bits
ppavel@26:  * @mask:   select bits significand for the comparation;
ppavel@26:  *          1 .. take care about corresponding ID bit, 0 .. don't care
ppavel@26:  *
ppavel@26:  * Header: canmsg.h
ppavel@26:  */
ppavel@26: struct canfilt_t {
ppavel@26: 	int		flags;
ppavel@26: 	int		queid;
ppavel@26: 	int		cob;
ppavel@26: 	canmsg_id_t	id;
ppavel@26: 	canmsg_id_t	mask;
ppavel@26: };
ppavel@26: 
ppavel@26: typedef struct canfilt_t canfilt_t;
ppavel@26: 
ppavel@26: /* Definitions to use for canmsg_t and canfilt_t flags */
ppavel@26: #define MSG_RTR   (1<<0)
ppavel@26: #define MSG_OVR   (1<<1)
ppavel@26: #define MSG_EXT   (1<<2)
ppavel@26: #define MSG_LOCAL (1<<3)
ppavel@26: /* If you change above lines, check canque_filtid2internal function */
ppavel@26: 
ppavel@26: /* Additional definitions used for canfilt_t only */
ppavel@26: #define MSG_FILT_MASK_SHIFT   8
ppavel@26: #define MSG_RTR_MASK   (MSG_RTR<<MSG_FILT_MASK_SHIFT)
ppavel@26: #define MSG_EXT_MASK   (MSG_EXT<<MSG_FILT_MASK_SHIFT)
ppavel@26: #define MSG_LOCAL_MASK (MSG_LOCAL<<MSG_FILT_MASK_SHIFT)
ppavel@26: #define MSG_PROCESSLOCAL (MSG_OVR<<MSG_FILT_MASK_SHIFT)
ppavel@26: 
ppavel@26: /* Can message ID mask */
ppavel@26: #define MSG_ID_MASK ((1l<<29)-1)
ppavel@26: 
ppavel@26: #ifdef __cplusplus
ppavel@26: } /* extern "C"*/
ppavel@26: #endif
ppavel@26: 
ppavel@26: #endif /*_CANMSG_T_H*/