mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-11-16 12:34:45 +00:00
Reimplemented the baud-rate algorithm from scratch to cope with GRCAN, GRCANFD and OC_CAN devices. Update #4306.
166 lines
4.3 KiB
C
166 lines
4.3 KiB
C
/**
|
|
* @file
|
|
* @ingroup can
|
|
* @brief Driver API for GRLIB wrapper to OpenCores CAN
|
|
*/
|
|
|
|
/*
|
|
* COPYRIGHT (c) 2007.
|
|
* Cobham Gaisler AB.
|
|
*
|
|
* The license and distribution terms for this file may be
|
|
* found in the file LICENSE in this distribution or at
|
|
* http://www.rtems.org/license/LICENSE.
|
|
*/
|
|
|
|
#ifndef __OCCAN_DRIVER_H__
|
|
#define __OCCAN_DRIVER_H__
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* CAN MESSAGE */
|
|
typedef struct {
|
|
char extended; /* 1= Extended Frame (29-bit id), 0= STD Frame (11-bit id) */
|
|
char rtr; /* RTR - Remote Transmission Request */
|
|
char sshot; /* single shot */
|
|
unsigned char len;
|
|
unsigned char data[8];
|
|
unsigned int id;
|
|
} CANMsg;
|
|
|
|
typedef struct {
|
|
/* tx/rx stats */
|
|
unsigned int rx_msgs;
|
|
unsigned int tx_msgs;
|
|
|
|
/* Error Interrupt counters */
|
|
unsigned int err_warn;
|
|
unsigned int err_dovr;
|
|
unsigned int err_errp;
|
|
unsigned int err_arb;
|
|
unsigned int err_bus;
|
|
|
|
/**** BUS ERRORS (err_arb) ****/
|
|
|
|
/* ALC 4-0 */
|
|
unsigned int err_arb_bitnum[32]; /* At what bit arbitration is lost */
|
|
|
|
/******************************/
|
|
|
|
/**** BUS ERRORS (err_bus) ****/
|
|
|
|
/* ECC 7-6 */
|
|
unsigned int err_bus_bit; /* Bit error */
|
|
unsigned int err_bus_form; /* Form Error */
|
|
unsigned int err_bus_stuff; /* Stuff Error */
|
|
unsigned int err_bus_other; /* Other Error */
|
|
|
|
/* ECC 5 */
|
|
unsigned int err_bus_rx; /* Errors during Reception */
|
|
unsigned int err_bus_tx; /* Errors during Transmission */
|
|
|
|
/* ECC 4:0 */
|
|
unsigned int err_bus_segs[32]; /* Segment (Where in frame error occured)
|
|
* See OCCAN_SEG_* defines for indexes
|
|
*/
|
|
|
|
/******************************/
|
|
|
|
|
|
/* total number of interrupts */
|
|
unsigned int ints;
|
|
|
|
/* software monitoring hw errors */
|
|
unsigned int tx_buf_error;
|
|
|
|
/* Software fifo overrun */
|
|
unsigned int rx_sw_dovr;
|
|
|
|
} occan_stats;
|
|
|
|
/* indexes into occan_stats.err_bus_segs[index] */
|
|
#define OCCAN_SEG_ID28 0x02 /* ID field bit 28:21 */
|
|
#define OCCAN_SEG_ID20 0x06 /* ID field bit 20:18 */
|
|
#define OCCAN_SEG_ID17 0x07 /* ID field bit 17:13 */
|
|
#define OCCAN_SEG_ID12 0x0f /* ID field bit 12:5 */
|
|
#define OCCAN_SEG_ID4 0x0e /* ID field bit 4:0 */
|
|
|
|
#define OCCAN_SEG_START 0x03 /* Start of Frame */
|
|
#define OCCAN_SEG_SRTR 0x04 /* Bit SRTR */
|
|
#define OCCAN_SEG_IDE 0x05 /* Bit IDE */
|
|
#define OCCAN_SEG_RTR 0x0c /* Bit RTR */
|
|
#define OCCAN_SEG_RSV0 0x09 /* Reserved bit 0 */
|
|
#define OCCAN_SEG_RSV1 0x0d /* Reserved bit 1 */
|
|
|
|
#define OCCAN_SEG_DLEN 0x0b /* Data Length code */
|
|
#define OCCAN_SEG_DFIELD 0x0a /* Data Field */
|
|
|
|
#define OCCAN_SEG_CRC_SEQ 0x08 /* CRC Sequence */
|
|
#define OCCAN_SEG_CRC_DELIM 0x18 /* CRC Delimiter */
|
|
|
|
#define OCCAN_SEG_ACK_SLOT 0x19 /* Acknowledge slot */
|
|
#define OCCAN_SEG_ACK_DELIM 0x1b /* Acknowledge delimiter */
|
|
#define OCCAN_SEG_EOF 0x1a /* End Of Frame */
|
|
#define OCCAN_SEG_INTERMISSION 0x12 /* Intermission */
|
|
#define OCCAN_SEG_ACT_ERR 0x11 /* Active error flag */
|
|
#define OCCAN_SEG_PASS_ERR 0x16 /* Passive error flag */
|
|
#define OCCAN_SEG_DOMINANT 0x13 /* Tolerate dominant bits */
|
|
#define OCCAN_SEG_EDELIM 0x17 /* Error delimiter */
|
|
#define OCCAN_SEG_OVERLOAD 0x1c /* overload flag */
|
|
|
|
|
|
#define CANMSG_OPT_RTR 0x40 /* RTR Frame */
|
|
#define CANMSG_OPT_EXTENDED 0x80 /* Exteneded frame */
|
|
#define CANMSG_OPT_SSHOT 0x01 /* Single Shot, no retry */
|
|
|
|
#define OCCAN_IOC_START 1
|
|
#define OCCAN_IOC_STOP 2
|
|
|
|
#define OCCAN_IOC_GET_CONF 3
|
|
#define OCCAN_IOC_GET_STATS 4
|
|
#define OCCAN_IOC_GET_STATUS 5
|
|
|
|
#define OCCAN_IOC_SET_SPEED 6
|
|
#define OCCAN_IOC_SPEED_AUTO 7
|
|
#define OCCAN_IOC_SET_LINK 8
|
|
#define OCCAN_IOC_SET_FILTER 9
|
|
#define OCCAN_IOC_SET_BLK_MODE 10
|
|
#define OCCAN_IOC_SET_BUFLEN 11
|
|
#define OCCAN_IOC_SET_BTRS 12
|
|
|
|
|
|
struct occan_afilter {
|
|
unsigned char code[4];
|
|
unsigned char mask[4];
|
|
int single_mode;
|
|
};
|
|
|
|
#define OCCAN_STATUS_RESET 0x01
|
|
#define OCCAN_STATUS_OVERRUN 0x02
|
|
#define OCCAN_STATUS_WARN 0x04
|
|
#define OCCAN_STATUS_ERR_PASSIVE 0x08
|
|
#define OCCAN_STATUS_ERR_BUSOFF 0x10
|
|
#define OCCAN_STATUS_QUEUE_ERROR 0x80
|
|
|
|
#define OCCAN_BLK_MODE_RX 0x1
|
|
#define OCCAN_BLK_MODE_TX 0x2
|
|
|
|
void occan_register_drv (void);
|
|
|
|
|
|
#define OCCAN_SPEED_500K 500000
|
|
#define OCCAN_SPEED_250K 250000
|
|
#define OCCAN_SPEED_125K 125000
|
|
#define OCCAN_SPEED_75K 75000
|
|
#define OCCAN_SPEED_50K 50000
|
|
#define OCCAN_SPEED_25K 25000
|
|
#define OCCAN_SPEED_10K 10000
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|