blob: 10d996a172d9d0599b921f5424ada9ffa84cf43f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
|
/*
* Something to put append a 'U' to a long constant if it's C so that
* it'll be unsigned in both ANSI and traditional.
*/
#if defined(ASSEMBLER)
# define U(num) num
#else
# if defined(__STDC__)
# define U(num) num ## U
# else
# define U(num) num/**/U
# endif
#endif
/*********************** CONFIGURATION *******************************/
#define MAXPORTS 2 /* max count of PORTS/DUART */
/*
* The following define is for the utputc/utgetc Console routines
* which have to work without any configuration.
*/
#define MVME188_DUART U(0xFFF82000) /* M68692 DUART chip */
/*********************** DEFINITIONS *********************************/
#define MISSING 0 /* flag, missing a configured DUART */
#define ON 1 /* flag for modem() */
#define OFF 0 /* flag for modem() */
#define A_PORT 0 /* flag for port a */
#define B_PORT 1 /* flag for port b */
/*********************** MACROS ***********************************/
/*
* spl priority level should always be the same.
*/
#define SPLCLOCK spl6 /* set clock priority level */
#define SPLM681 splhi /* set ut driver priority level */
/* the access to the same command register must be delayed,
because the chip has some hardware problems in this case */
#define DELAY_CR { volatile register i; for ( i=0; i<250; ++i ); }
/*********************** MC68681 DEFINITIONS ************************/
#define PORTOFFSET 0x10 /* offset for port b address space */
/* mode register 1: MR1x operations */
#define RXRTS 0x80 /* enable receiver RTS */
#define PAREN 0x00 /* with parity */
#define PARDIS 0x10 /* no parity */
#define EVENPAR 0x00 /* even parity */
#define ODDPAR 0x04 /* odd parity */
#define CL5 0x00 /* 5 bits per char */
#define CL6 0x01 /* 6 bits per char */
#define CL7 0x02 /* 7 bits per char */
#define CL8 0x03 /* 8 bits per char */
#define PARMODEMASK 0x18 /* parity mode mask */
#define PARTYPEMASK 0x04 /* parity type mask */
#define CLMASK 0x03 /* character length mask */
/* mode register 2: MR2x operations */
#define TXRTS 0x20 /* enable transmitter RTS */
#define TXCTS 0x10 /* enable transmitter CTS */
#define SB2 0x0f /* 2 stop bits */
#define SB1 0x07 /* 1 stop bit */
#define SB1L5 0x00 /* 1 stop bit at 5 bits per character */
#define SBMASK 0x0f /* stop bit mask */
/* clock-select register: CSRx operations */
#define NOBAUD -1 /* 50 and 200 baud are not possible */
/* they are not in Baud register set 2 */
#define BD75 0x00 /* 75 baud */
#define BD110 0x11 /* 110 baud */
#define BD134 0x22 /* 134.5 baud */
#define BD150 0x33 /* 150 baud */
#define BD300 0x44 /* 300 baud */
#define BD600 0x55 /* 600 baud */
#define BD1200 0x66 /* 1200 baud */
#define BD1800 0xaa /* 1800 baud */
#define BD2400 0x88 /* 2400 baud */
#define BD4800 0x99 /* 4800 baud */
#define BD9600 0xbb /* 9600 baud */
#define BD19200 0xcc /* 19200 baud */
#define DEFBAUD BD9600 /* default value if baudrate is not possible */
/* channel command register: CRx operations */
#define MRRESET 0x10 /* reset mr pointer to mr1 */
#define RXRESET 0x20 /* reset receiver */
#define TXRESET 0x30 /* reset transmitter */
#define ERRRESET 0x40 /* reset error status */
#define BRKINTRESET 0x50 /* reset channel's break interrupt */
#define BRKSTART 0x60 /* start break */
#define BRKSTOP 0x70 /* stop break */
#define TXDIS 0x08 /* disable transmitter */
#define TXEN 0x04 /* enable transmitter */
#define RXDIS 0x02 /* disable receiver */
#define RXEN 0x01 /* enable receiver */
/* status register: SRx status */
#define RBRK 0x80 /* received break */
#define FRERR 0x40 /* frame error */
#define PERR 0x20 /* parity error */
#define ROVRN 0x10 /* receiver overrun error */
#define TXEMT 0x08 /* transmitter empty */
#define TXRDY 0x04 /* transmitter ready */
#define FFULL 0x02 /* receiver FIFO full */
#define RXRDY 0x01 /* receiver ready */
/* output port configuration register: OPCR operations */
#define OPSET 0x00 /* set all op lines to op function */
#define OPSETTO 0x04 /* use OP3 for timer output */
/* output port register: OP operations */
#define OPDTRB 0x20 /* DTR line output b on the VME188, 181, 141 */
#define OPDTRA 0x04 /* DTR line output a */
#define OPRTSB 0x02 /* RTS line output b */
#define OPRTSA 0x01 /* RTS line output a */
/* auxiliary control register: ACR operations */
#define BDSET1 0x00 /* baudrate generator set 1 */
#define BDSET2 0x80 /* baudrate generator set 2 */
#define CCLK1 0x60 /* timer clock: external rate. TA */
#define CCLK16 0x30 /* counter clock: x1 clk divided by 16 */
#define SLCTIM 0x7800/* timer count to get 60 Hz time slice (16.6ms ticks) */
#define IPDCDIB 0x08 /* IP3 change == DCD input on port B */
#define IPDCDIA 0x04 /* IP2 change == DCD input on port A */
/* input port change register: IPCR operations */
#define IPCRDCDB 0x80 /* IP3 change == DCD change on port B */
#define IPCRDCDA 0x40 /* IP2 change == DCD change on port A */
/* Defines for mvme335 */
#define IPDCDB 0x20 /* DCD line input b */
#define IPDCDA 0x10 /* DCD line input a */
#define IPDSRB 0x08 /* DSR line input b */
#define IPDSRA 0x04 /* DSR line input a */
#define IPCTSB 0x02 /* CTS line input b */
#define IPCTSA 0x01 /* CTS line input a */
/* interrupt status and mask register: ISR status and IMR mask */
#define IIPCHG 0x80 /* input port change */
#define IBRKB 0x40 /* delta break b */
#define IRXRDYB 0x20 /* receiver ready b */
#define ITXRDYB 0x10 /* transmitter ready b */
#define ITIMER 0x08 /* Enable timer interrupts. */
#define IBRKA 0x04 /* delta break a */
#define IRXRDYA 0x02 /* receiver ready a */
#define ITXRDYA 0x01 /* transmitter ready a */
/* interrupts from port a or b */
#define AINTPORT ( IRXRDYA | ITXRDYA )
#define BINTPORT ( IRXRDYB | ITXRDYB )
/* HW write register index for ut_wr_regs[] */
#define MR1A 0 /* mode register 1 a */
#define CSRA 1 /* clock-select register a*/
#define CRA 2 /* command register a */
#define TBA 3 /* transmitter buffer a */
#define ACR 4 /* auxialiary control register*/
#define IMR 5 /* interrupt mask register */
#define CTUR 6 /* counter/timer upper reg */
#define CTLR 7 /* counter/timer lower reg */
#define MR1B 8 /* mode register 1 b */
#define CSRB 9 /* clock-select register b*/
#define CRB 10 /* command register b */
#define TBB 11 /* transmitter buffer b */
#define IVR 12 /* interrupt vector register */
#define OPCR 13 /* output port config reg */
#define OPRSET 14 /* output port: bit set cmd */
#define OPRRESET 15 /* output port: bit reset cmd */
#define MR2A 16 /* mode register 2 a */
#define MR2B 17 /* mode register 2 b */
#define MAXREG 18 /* max count of registers */
/*
* Structure of MC68681 hardware read registers.
*/
struct dart_rd_reg
{
volatile unsigned int rd_mra; /* mode register a */
volatile unsigned int rd_sra; /* status register a*/
volatile unsigned int dummy5; /* do not access */
volatile unsigned int rd_rba; /* receiver buffer a */
volatile unsigned int rd_ipcr; /* input port change register */
volatile unsigned int rd_isr; /* interrupt status register */
volatile unsigned int rd_cur; /* current MSB of counter */
volatile unsigned int rd_clr; /* current LSB of counter */
volatile unsigned int rd_mrb; /* mode register b */
volatile unsigned int rd_srb; /* status register b*/
volatile unsigned int dummyxb; /* do not access */
volatile unsigned int rd_rbb; /* receiver buffer b */
volatile unsigned int rd_ivr; /* interrupt vector register */
volatile unsigned int rd_ip; /* input port (unlatched) */
volatile unsigned int rd_ctstart; /* start-counter command */
volatile unsigned int rd_ctstop; /* stop-counter command */
};
/*
* Structure of MC68681 hardware write registers.
*/
struct dart_wr_reg
{
volatile unsigned int wr_mra; /* mode register a */
volatile unsigned int wr_csra; /* clock-select register a*/
volatile unsigned int wr_cra; /* command register a */
volatile unsigned int wr_tba; /* transmitter buffer a */
volatile unsigned int wr_acr; /* auxialiary control register*/
volatile unsigned int wr_imr; /* interrupt mask register */
volatile unsigned int wr_ctur; /* counter/timer upper reg */
volatile unsigned int wr_ctlr; /* counter/timer lower reg */
volatile unsigned int wr_mrb; /* mode register b */
volatile unsigned int wr_csrb; /* clock-select register b*/
volatile unsigned int wr_crb; /* command register b */
volatile unsigned int wr_tbb; /* transmitter buffer b */
volatile unsigned int wr_ivr; /* interrupt vector register */
volatile unsigned int wr_opcr; /* output port config reg */
volatile unsigned int wr_oprset; /* output port: bit set cmd */
volatile unsigned int wr_oprreset;/* output port: bit reset cmd */
};
union dartreg {
struct dart_rd_reg read; /* read registers */
struct dart_wr_reg write; /* write registers */
};
/*
* Structure of MC68681 hardware port dependent read registers.
*/
struct dart_prd_reg
{
volatile unsigned int rd_mr; /* mode register */
volatile unsigned int rd_sr; /* status register */
volatile unsigned int dummy5;
volatile unsigned int rd_rb; /* receiver buffer */
volatile unsigned int dummy9;
volatile unsigned int dummy11;
volatile unsigned int dummy13;
volatile unsigned int dummy15;
};
/*
* Structure of MC68681 hardware port dependent write registers.
*/
struct dart_pwr_reg
{
volatile unsigned int wr_mr; /* mode register */
volatile unsigned int wr_csr; /* clock-select register */
volatile unsigned int wr_cr; /* command register */
volatile unsigned int wr_tb; /* transmitter buffer */
volatile unsigned int dummy9;
volatile unsigned int dummy11;
volatile unsigned int dummy13;
volatile unsigned int dummy15;
};
union dart_pt_io {
struct dart_prd_reg read; /* read registers */
struct dart_pwr_reg write; /* write registers */
};
/*
* Structure of saved registers
*/
struct dart_sv_reg
{
volatile unsigned char sv_mr1[MAXPORTS]; /* mode register 1 a */
volatile unsigned char sv_mr2[MAXPORTS]; /* mode register 2 a */
volatile unsigned char sv_csr[MAXPORTS]; /* clock-select register a*/
volatile unsigned char sv_cr[MAXPORTS]; /* command register a */
volatile unsigned char sv_acr; /* auxialiary control register*/
volatile unsigned char sv_imr; /* interrupt mask register */
volatile unsigned char sv_ivr; /* interrupt vector register */
};
/* defines for receiver and DCD scanner */
#define M681CSCAN 2 /* clock ticks for character scan */
#define M681_CHAR 01 /* character arrived flag (ut_work) */
#define M681_ACT 02 /* character in buffer flag (ut_work) */
#define M681_DCD 04 /* DCD wait flag (ut_work) */
/********************* SPECIAL IOCTL COMMAND DEFINITIONS ******************/
/* HWHAND ioctls same as in MVME331 driver */
#define MSETHWHAND (('m'<<8)+20) /* set hardware handshake */
#define MCLEARHWHAND (('m'<<8)+21) /* clear hardware handshake */
#define MGETHWHAND (('m'<<8)+22) /* get hardware handshake mode */
#define M681STATUS (('m'<<8)+40 ) /* get status of duarts */
#define M681GETSTAT (('m'<<8)+42 ) /* get statistics */
#ifdef STATISTICS
struct dart_stat {
int open_cnt; /* count of open calls */
int intr_cnt; /* count of interrupts */
int tx_cnt; /* count of transmitted characters */
int rx_cnt; /* count of received characters */
int brk_cnt; /* count of break events */
int rovrn_cnt; /* count of overruns */
int frerr_cnt; /* count of frame errors */
int perr_cnt; /* count of parity errors */
int rxoff_cnt; /* count of received XOFF chars */
int rxon_cnt; /* count of received XON chars */
int txoff_cnt; /* count of transmitted XOFF chars */
int txon_cnt; /* count of transmitted XON chars */
};
#endif
|