/* wncanDevIO.h - WIND NET CAN Device I/O Interface header file. */ /* Copyright 2002-2003 Wind River Systems, Inc. */ #include "copyright_wrs.h" /* modification history -------------------- 01e,20sep04,lsg Gave enum to setFuncSwitch an identifier 01d,17jul04,lsg Modified _wncan_ctlrconfig to access multiple ctrlSetConfig functions for FlexCAN 01c,08apr04,lsg Added FlexCAN related info to WNCAN_CTLRCONFIG 01b,21apr04,bjn Added WNCAN_REG, WNCAN_REG_SET and WNCAN_REG_GET 01a,19Dec02,emcw created */ /* DESCRIPTION This file contains the type and function definitions of the Device I/O Interface feature of WIND NET CAN. NOTE RESTRICTIONS INCLUDE FILES CAN/wnCAN.h */ #ifndef __INCwncanDevIOh #define __INCwncanDevIOh #ifdef __cplusplus extern "C" { #endif /* ==== Include files ==== */ #include #include #include #include #include #include #include /* ==== Constants ==== */ #define WNCAN_LG_BUF_SIZE 200 #define WNCAN_MAX_DATA_LEN 8 /* max #bytes in CAN message data */ #define WNCAN_DEFAULT_RINGBUF_SIZE 4 /* default #CAN msgs in internal buffers */ /* ==== WNCAN DevIO interface ioctl() commands ==== */ /* Base command code */ #define DEVIO_CANCMD_BASE 100 /* Device commands */ #define WNCAN_HALT (DEVIO_CANCMD_BASE + 1) #define WNCAN_SLEEP (DEVIO_CANCMD_BASE + 2) #define WNCAN_WAKE (DEVIO_CANCMD_BASE + 3) #define WNCAN_TX_ABORT (DEVIO_CANCMD_BASE + 4) #define WNCAN_RXCHAN_GET (DEVIO_CANCMD_BASE + 5) #define WNCAN_TXCHAN_GET (DEVIO_CANCMD_BASE + 6) #define WNCAN_RTRREQCHAN_GET (DEVIO_CANCMD_BASE + 7) #define WNCAN_RTRRESPCHAN_GET (DEVIO_CANCMD_BASE + 8) #define WNCAN_BUSINFO_GET (DEVIO_CANCMD_BASE + 9) #define WNCAN_CONFIG_SET (DEVIO_CANCMD_BASE + 10) #define WNCAN_CONFIG_GET (DEVIO_CANCMD_BASE + 11) /* Channel commands */ #define WNCAN_CHNCONFIG_SET (DEVIO_CANCMD_BASE + 12) #define WNCAN_CHNCONFIG_GET (DEVIO_CANCMD_BASE + 13) #define WNCAN_CHN_ENABLE (DEVIO_CANCMD_BASE + 14) #define WNCAN_CHN_TX (DEVIO_CANCMD_BASE + 15) #define WNCAN_CHNMSGLOST_GET (DEVIO_CANCMD_BASE + 16) #define WNCAN_CHNMSGLOST_CLEAR (DEVIO_CANCMD_BASE + 17) /* Controller-specific commands */ #define WNCAN_CTLRCONFIG_SET (DEVIO_CANCMD_BASE + 18) #define WNCAN_CTLRCONFIG_GET (DEVIO_CANCMD_BASE + 19) /* Additinal Device commands */ #define WNCAN_REG_SET (DEVIO_CANCMD_BASE + 20) #define WNCAN_REG_GET (DEVIO_CANCMD_BASE + 21) /* ==== CAN configuration access options ==== */ /* CAN device options Used in flags field of WNCAN_CONFIG struct */ #define WNCAN_CFG_NONE 0 /* selects no elements */ #define WNCAN_CFG_INFO 0x1 /* selects information elements only */ #define WNCAN_CFG_GBLFILTER 0x2 /* selects global filter only */ #define WNCAN_CFG_BITTIMING 0x4 /* selects bit timing only */ #define WNCAN_CFG_ALL 0x7 /* selects all elements */ /* CAN channel options Used in flags field of WNCAN_CHNCONFIG struct */ #define WNCAN_CHNCFG_NONE 0x000 /* selects no elements */ #define WNCAN_CHNCFG_CHANNEL 0x100 /* selects channel information only */ #define WNCAN_CHNCFG_LCLFILTER 0x200 /* selects local filter only */ #define WNCAN_CHNCFG_RTR 0x400 /* selects RTR bit only */ #define WNCAN_CHNCFG_MODE 0x800 /* selects channel mode only */ #define WNCAN_CHNCFG_ALL 0xF00 /* selects all elements */ /* ==== Structures used for setting/getting CAN configuration ==== */ /* CAN bus information */ typedef struct _wncan_businfo { WNCAN_BusStatus busStatus; /* bus status */ WNCAN_BusError busError; /* bus error */ } WNCAN_BUSINFO; /* CAN device configuration options */ typedef struct _wncan_config { UINT flags; /* access options */ /* read-only items */ struct { WNCAN_VersionInfo version; /* WNC version */ WNCAN_ControllerType ctrlType; /* CAN controller type */ XtalFreq xtalfreq; /* crystal frequency */ UCHAR numChannels; /* total # of channels */ UINT baudRate; /* computed baudrate bits/sec */ UINT samplePoint; /* percentage of bit time at which the bit is sampled.*/ } info; /* read/write items */ struct { ULONG mask; /* filter mask */ BOOL extended; /* extended flag */ } filter; struct { UCHAR tseg1; /* time quanta for segment 1 */ UCHAR tseg2; /* time quanta for segment 2 */ UCHAR brp; /* baud rate prescaler */ UCHAR sjw; /* syncro jump width */ BOOL oversample; /* normal or over-sampling option */ } bittiming; } WNCAN_CONFIG; /* CAN device register get/set configuration */ typedef struct _wncan_reg { UINT offset; /* Register offset from base to access */ UCHAR * pData; /* Pointer to data buffer for read/write */ UINT length; /* Length of data in bytes to read/write */ } WNCAN_REG; /* CAN channel configuration options */ typedef struct _wncan_chnconfig { UINT flags; /* access options */ /* local filter mask */ struct { ULONG mask; /* filter mask */ BOOL extended; /* extended flag */ } filter; struct { ULONG id; /* CAN ID */ BOOL extId; /* is ID extended or not? */ UCHAR len; /* length */ UCHAR data[WNCAN_MAX_DATA_LEN]; /* message data */ } channel; BOOL rtr; /* RTR bit setting */ WNCAN_ChannelMode mode; /* channel mode */ } WNCAN_CHNCONFIG; /* CAN controller-specific configuration options */ typedef struct _wncan_ctlrconfig { WNCAN_ControllerType ctlrType; union { struct { UCHAR propseg; /* propagation segment */ } toucanData; struct { struct intLevelInfo_t{ UCHAR intSrcNum; /*flexcan interrupt source number, always an input for WNCAN_CTLRCONFIG_SET and WNCAN_CTLRCONFIG_GET */ UCHAR intLevel; /*flexcan interrupt level, for WNCAN_CTLRCONFIG_SET: input, for WNCAN_CTLRCONFIG_GET: output */ UCHAR intPrioLevel;/* priority within interrupt level, for WNCAN_CTLRCONFIG_SET: input, for WNCAN_CTLRCONFIG_GET: output */ } intLevelInfo; UCHAR propseg; enum setFuncSwitch_t{ WNCAN_FLEXCAN_DEVIO_SET_INTLEVEL=0, WNCAN_FLEXCAN_DEVIO_SET_PROPSEG }setFuncSwitch; } flexcanData; /* Other controller-specific structs can be defined here */ ULONG dummy; /* placeholder for future defs */ } ctlrData; } WNCAN_CTLRCONFIG; /* CAN message */ typedef struct _wncan_chnmsg { ULONG id; /* CAN ID */ BOOL extId; /* is ID extended or not? */ BOOL rtr; /* remote frame transmit request */ UCHAR len; /* message length */ UCHAR data[WNCAN_MAX_DATA_LEN]; /* message data */ } WNCAN_CHNMSG; /* ==== Internal Device I/O Structures (maybe move to private header file?) ==== */ typedef enum { FD_WNCAN_NONE, FD_WNCAN_DEVICE, FD_WNCAN_CHANNEL } WNCAN_FD_TYPE; typedef STATUS (*CTRLRCONFIGFNTYPE)(void*, void*); typedef struct /* DevIO driver information */ { DEV_HDR devHdr; /* standard I/O System device header */ WNCAN_BoardType boardType; /* CAN board type */ int boardIdx; /* CAN board index */ int ctlrIdx; /* CAN controller index */ int numOpenChans; /* number of open CAN channels */ BOOL isDeviceOpen; /* whether CAN device has been init'ed; set after CAN_Init() called */ SEM_ID mutex; /* mutex semaphore for memory access */ WNCAN_DEVICE *wncDevice; /* WNCAN device data structure */ CTRLRCONFIGFNTYPE ctrlSetConfig; /* controller-specific functions */ CTRLRCONFIGFNTYPE ctrlGetConfig; } WNCAN_DEVIO_DRVINFO; typedef struct _devio_fdinfo /* DevIO file descriptor table info */ { WNCAN_DEVIO_DRVINFO* wnDevIODrv; /* pointer to WNCAN_DEVIO_DRVINFO struct */ WNCAN_FD_TYPE devType; /* indicates which type of data stored here, device or channel */ SEL_WAKEUP_LIST selWakeupList; /* wakeup select list */ union { /* CAN device info */ struct { struct _devio_fdinfo **chnInfo; /* allocated channel infos */ } device; /* CAN channel info */ struct { BOOL enabled; /* channel up and running flag */ int flag; /* channel access flag */ ULONG channel; /* channel identifier */ WNCAN_IntType intType; /* interrupt status type, WNCAN_INT_TX or WNCAN_INT_RX */ RING_ID inputBuf; /* input data buffer */ RING_ID outputBuf; /* output data buffer */ } channel; } fdtype; } WNCAN_DEVIO_FDINFO; /* ==== Function Prototypes ==== */ #if defined(__STDC__) extern STATUS wncDevIODevCreate(char*,int,int,int,WNCAN_DEVIO_DRVINFO**); extern int wncDevIOCreate(WNCAN_DEVIO_DRVINFO*, char*, int); extern int wncDevIODelete(WNCAN_DEVIO_DRVINFO*, char*); extern int wncDevIOOpen(WNCAN_DEVIO_DRVINFO*, char*, int, int); extern STATUS wncDevIOClose(WNCAN_DEVIO_FDINFO*); extern int wncDevIOReadBuf(WNCAN_DEVIO_FDINFO*, char*, size_t); extern int wncDevIOWriteBuf(WNCAN_DEVIO_FDINFO*, char*, size_t); STATUS wncDevIOIoctl(WNCAN_DEVIO_FDINFO*, int, int); #else extern STATUS wncDevIODevCreate(); extern int wncDevIOCreate(); extern int wncDevIODelete(); extern int wncDevIOOpen(); extern STATUS wncDevIOClose(); extern int wncDevIOReadBuf(); extern int wncDevIOWriteBuf(); STATUS wncDevIOIoctl(); #endif #ifdef __cplusplus } #endif #endif /* __INCwncanDevIOh */