1 | /* |
---|
2 | * Header file for RTEMS GRSLINK SLINK master driver |
---|
3 | * |
---|
4 | * COPYRIGHT (c) 2009. |
---|
5 | * Cobham Gaisler AB. |
---|
6 | * |
---|
7 | * The license and distribution terms for this file may be |
---|
8 | * found in the file LICENSE in this distribution or at |
---|
9 | * http://www.rtems.org/license/LICENSE. |
---|
10 | */ |
---|
11 | |
---|
12 | #ifndef __GRSLINK_H__ |
---|
13 | #define __GRSLINK_H__ |
---|
14 | |
---|
15 | #ifdef __cplusplus |
---|
16 | extern "C" { |
---|
17 | #endif |
---|
18 | |
---|
19 | /**** Configuration ****/ |
---|
20 | /* Collect statistics ? */ |
---|
21 | #define SLINK_COLLECT_STATISTICS |
---|
22 | |
---|
23 | /* Frequency of SLINK SCLK */ |
---|
24 | #define SLINK_FREQ_HZ 6000000 |
---|
25 | /* Number of queues used in driver */ |
---|
26 | #define SLINK_NUMQUEUES 4 |
---|
27 | |
---|
28 | /* The four values below are only used in the demo software */ |
---|
29 | #define SLINK_CORE_REGBASE 0x80000600 |
---|
30 | #define SLINK_CORE_IRQ 6 |
---|
31 | #define IRQ_CNTRL_REG 0x80000200 |
---|
32 | #define IRQ_CNTRL_MASK_OFFSET 0x40 |
---|
33 | |
---|
34 | /* |
---|
35 | * Structure returned by SLINK_statistics if SLINK_COLLECT_STATISTCS has |
---|
36 | * been defined |
---|
37 | */ |
---|
38 | typedef struct { |
---|
39 | unsigned int parerr; /* Number of parity errors */ |
---|
40 | unsigned int recov; /* Number of receive overflows */ |
---|
41 | unsigned int reads; /* Number of completed READs */ |
---|
42 | unsigned int writes; /* Number of performed WRITES */ |
---|
43 | unsigned int sequences; /* Number of started SEQUENCEs */ |
---|
44 | unsigned int seqcomp; /* Number of completed SEQUENCEs */ |
---|
45 | unsigned int interrupts; /* Number of INTERRUPT transfers */ |
---|
46 | unsigned int lostwords; /* Number of lost words due to full queue */ |
---|
47 | } SLINK_stats; |
---|
48 | |
---|
49 | /**** SLINK status codes ****/ |
---|
50 | #define SLINK_ABORTED 0 |
---|
51 | #define SLINK_QFULL 1 |
---|
52 | #define SLINK_ACTIVE 2 |
---|
53 | #define SLINK_AMBAERR 3 |
---|
54 | #define SLINK_COMPLETED 4 |
---|
55 | #define SLINK_PARERR 5 |
---|
56 | #define SLINK_ROV 6 /* Only used internally in driver */ |
---|
57 | |
---|
58 | /**** SLINK master register fields *****/ |
---|
59 | /* Control register */ |
---|
60 | #define SLINK_C_SLEN_POS 16 |
---|
61 | #define SLINK_C_SRO (1 << 8) |
---|
62 | #define SLINK_C_SCN_POS 4 |
---|
63 | #define SLINK_C_PAR (1 << 3) |
---|
64 | #define SLINK_C_AS (1 << 2) |
---|
65 | #define SLINK_C_SE (1 << 1) |
---|
66 | #define SLINK_C_SLE (1 << 0) |
---|
67 | |
---|
68 | /* Status register fields */ |
---|
69 | #define SLINK_S_SI_POS 16 |
---|
70 | #define SLINK_S_PERR (1 << 7) |
---|
71 | #define SLINK_S_AERR (1 << 6) |
---|
72 | #define SLINK_S_ROV (1 << 5) |
---|
73 | #define SLINK_S_RNE (1 << 4) |
---|
74 | #define SLINK_S_TNF (1 << 3) |
---|
75 | #define SLINK_S_SC (1 << 2) |
---|
76 | #define SLINK_S_SA (1 << 1) |
---|
77 | #define SLINK_S_SRX (1 << 0) |
---|
78 | |
---|
79 | /* Mask register fields */ |
---|
80 | #define SLINK_M_PERRE (1 << 7) |
---|
81 | #define SLINK_M_AERRE (1 << 6) |
---|
82 | #define SLINK_M_ROVE (1 << 5) |
---|
83 | #define SLINK_M_RNEE (1 << 4) |
---|
84 | #define SLINK_M_TNFE (1 << 3) |
---|
85 | #define SLINK_M_SCE (1 << 2) |
---|
86 | #define SLINK_M_SAE (1 << 1) |
---|
87 | #define SLINK_M_SRXE (1 << 0) |
---|
88 | |
---|
89 | /**** Macros ****/ |
---|
90 | /* Get channel field from received SLINK word */ |
---|
91 | #define SLINK_WRD_CHAN(x) ((x >> 16) & 0xF) |
---|
92 | /* Get IO card # from received SLINK word */ |
---|
93 | #define SLINK_WRD_CARDNUM(x) ((x >> 21) & 0x3) |
---|
94 | /* Get data part from SLINK word */ |
---|
95 | #define SLINK_WRD_PAYLOAD(x) (x & 0xFFFF) |
---|
96 | |
---|
97 | /* Checks status value to see if transmit queue has free slot */ |
---|
98 | #define SLINK_STS_TRANSFREE(x) (x & SLINK_S_TNF) |
---|
99 | /* Get Sequence Index value */ |
---|
100 | #define SLINK_STS_SI(x) ((x >> 16) & 0xFF) |
---|
101 | |
---|
102 | /**** Function declarations, driver interface ****/ |
---|
103 | /* Initializes the SLINK core */ |
---|
104 | int SLINK_init(unsigned int nullwrd, int parity, int qsize, |
---|
105 | void (*interrupt_trans_handler)(int), |
---|
106 | void (*sequence_callback)(int)); |
---|
107 | |
---|
108 | /* Enables the core */ |
---|
109 | void SLINK_start(void); |
---|
110 | |
---|
111 | /* Disables the core */ |
---|
112 | void SLINK_stop(void); |
---|
113 | |
---|
114 | /* Reads one word */ |
---|
115 | int SLINK_read(int data, int channel, int *reply); |
---|
116 | |
---|
117 | /* Writes one word */ |
---|
118 | int SLINK_write(int data, int channel); |
---|
119 | |
---|
120 | /* Peforms a SEQUENCE */ |
---|
121 | int SLINK_seqstart(int *a, int *b, int n, int channel, int reconly); |
---|
122 | |
---|
123 | /* Aborts a SEQUENCE */ |
---|
124 | void SLINK_seqabort(void); |
---|
125 | |
---|
126 | /* Status of current or last SEQUENCE */ |
---|
127 | int SLINK_seqstatus(void); |
---|
128 | |
---|
129 | /* Number of words transferred in last SEQUENCE */ |
---|
130 | int SLINK_seqwrds(void); |
---|
131 | |
---|
132 | /* Returns value of core's status register */ |
---|
133 | int SLINK_hwstatus(void); |
---|
134 | |
---|
135 | /* Returns number of elements in queue associated with IO card */ |
---|
136 | int SLINK_queuestatus(int iocard); |
---|
137 | |
---|
138 | /* Take first element from queue for IO card # 'iocard' */ |
---|
139 | int SLINK_dequeue(int iocard, int *elem); |
---|
140 | |
---|
141 | /* Returns structure containing core driver statistics */ |
---|
142 | SLINK_stats *SLINK_statistics(void); |
---|
143 | |
---|
144 | #ifdef __cplusplus |
---|
145 | } |
---|
146 | #endif |
---|
147 | |
---|
148 | #endif /* __GRSLINK_H__ */ |
---|