blob: 575a24aee46c39ce6fb137e6429d1b84df2eac9d (
plain) (
tree)
|
|
/*
* Header file for RTEMS GRSLINK SLINK master driver
*
* COPYRIGHT (c) 2009.
* 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 __GRSLINK_H__
#define __GRSLINK_H__
#ifdef __cplusplus
extern "C" {
#endif
/**** Configuration ****/
/* Collect statistics ? */
#define SLINK_COLLECT_STATISTICS
/* Frequency of SLINK SCLK */
#define SLINK_FREQ_HZ 6000000
/* Number of queues used in driver */
#define SLINK_NUMQUEUES 4
/* The four values below are only used in the demo software */
#define SLINK_CORE_REGBASE 0x80000600
#define SLINK_CORE_IRQ 6
#define IRQ_CNTRL_REG 0x80000200
#define IRQ_CNTRL_MASK_OFFSET 0x40
/*
* Structure returned by SLINK_statistics if SLINK_COLLECT_STATISTCS has
* been defined
*/
typedef struct {
unsigned int parerr; /* Number of parity errors */
unsigned int recov; /* Number of receive overflows */
unsigned int reads; /* Number of completed READs */
unsigned int writes; /* Number of performed WRITES */
unsigned int sequences; /* Number of started SEQUENCEs */
unsigned int seqcomp; /* Number of completed SEQUENCEs */
unsigned int interrupts; /* Number of INTERRUPT transfers */
unsigned int lostwords; /* Number of lost words due to full queue */
} SLINK_stats;
/**** SLINK status codes ****/
#define SLINK_ABORTED 0
#define SLINK_QFULL 1
#define SLINK_ACTIVE 2
#define SLINK_AMBAERR 3
#define SLINK_COMPLETED 4
#define SLINK_PARERR 5
#define SLINK_ROV 6 /* Only used internally in driver */
/**** SLINK master register fields *****/
/* Control register */
#define SLINK_C_SLEN_POS 16
#define SLINK_C_SRO (1 << 8)
#define SLINK_C_SCN_POS 4
#define SLINK_C_PAR (1 << 3)
#define SLINK_C_AS (1 << 2)
#define SLINK_C_SE (1 << 1)
#define SLINK_C_SLE (1 << 0)
/* Status register fields */
#define SLINK_S_SI_POS 16
#define SLINK_S_PERR (1 << 7)
#define SLINK_S_AERR (1 << 6)
#define SLINK_S_ROV (1 << 5)
#define SLINK_S_RNE (1 << 4)
#define SLINK_S_TNF (1 << 3)
#define SLINK_S_SC (1 << 2)
#define SLINK_S_SA (1 << 1)
#define SLINK_S_SRX (1 << 0)
/* Mask register fields */
#define SLINK_M_PERRE (1 << 7)
#define SLINK_M_AERRE (1 << 6)
#define SLINK_M_ROVE (1 << 5)
#define SLINK_M_RNEE (1 << 4)
#define SLINK_M_TNFE (1 << 3)
#define SLINK_M_SCE (1 << 2)
#define SLINK_M_SAE (1 << 1)
#define SLINK_M_SRXE (1 << 0)
/**** Macros ****/
/* Get channel field from received SLINK word */
#define SLINK_WRD_CHAN(x) ((x >> 16) & 0xF)
/* Get IO card # from received SLINK word */
#define SLINK_WRD_CARDNUM(x) ((x >> 21) & 0x3)
/* Get data part from SLINK word */
#define SLINK_WRD_PAYLOAD(x) (x & 0xFFFF)
/* Checks status value to see if transmit queue has free slot */
#define SLINK_STS_TRANSFREE(x) (x & SLINK_S_TNF)
/* Get Sequence Index value */
#define SLINK_STS_SI(x) ((x >> 16) & 0xFF)
/**** Function declarations, driver interface ****/
/* Initializes the SLINK core */
int SLINK_init(unsigned int nullwrd, int parity, int qsize,
void (*interrupt_trans_handler)(int),
void (*sequence_callback)(int));
/* Enables the core */
void SLINK_start(void);
/* Disables the core */
void SLINK_stop(void);
/* Reads one word */
int SLINK_read(int data, int channel, int *reply);
/* Writes one word */
int SLINK_write(int data, int channel);
/* Peforms a SEQUENCE */
int SLINK_seqstart(int *a, int *b, int n, int channel, int reconly);
/* Aborts a SEQUENCE */
void SLINK_seqabort(void);
/* Status of current or last SEQUENCE */
int SLINK_seqstatus(void);
/* Number of words transferred in last SEQUENCE */
int SLINK_seqwrds(void);
/* Returns value of core's status register */
int SLINK_hwstatus(void);
/* Returns number of elements in queue associated with IO card */
int SLINK_queuestatus(int iocard);
/* Take first element from queue for IO card # 'iocard' */
int SLINK_dequeue(int iocard, int *elem);
/* Returns structure containing core driver statistics */
SLINK_stats *SLINK_statistics(void);
#ifdef __cplusplus
}
#endif
#endif /* __GRSLINK_H__ */
|