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
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1983, 1991, by Sun Microsystems, Inc.
*/
#ifndef _SYS_SER_ZSCC_H
#define _SYS_SER_ZSCC_H
#pragma ident "%Z%%M% %I% %E% SMI"
/*
* Zilog 8530 SCC Serial Communications Controller
*
* This is a dual uart chip with on-chip baud rate generators.
* It is about as brain-damaged as the typical modern uart chip,
* but it does have a lot of features as well as the usual lot of
* brain damage around addressing, write-onlyness, etc.
*/
#ifdef __cplusplus
extern "C" {
#endif
/*
* SCC registers:
*
* There are 16 write registers and 9 read registers in each channel.
* As usual, the two channels are ALMOST orthogonal, not exactly. Most regs
* can only be written to, or read, but not both. To access one, you must
* first write to register 0 with the number of the register you
* are interested in, then read/write the actual value, and hope that
* nobody interrupts you in between.
*/
/* bits in RR0 */
#define ZSRR0_RX_READY 0x01 /* received character available */
#define ZSRR0_TIMER 0x02 /* if R15_TIMER, timer reached 0 */
#define ZSRR0_TX_READY 0x04 /* transmit buffer empty */
#define ZSRR0_CD 0x08 /* CD input (latched if R15_CD) */
#define ZSRR0_SYNC 0x10 /* SYNC input (latched if R15_SYNC) */
#define ZSRR0_CTS 0x20 /* CTS input (latched if R15_CTS) */
#define ZSRR0_TXUNDER 0x40 /* (SYNC) Xmitter underran */
#define ZSRR0_BREAK 0x80 /* received break detected */
/* bits in RR1 */
#define ZSRR1_ALL_SENT 0x01 /* all chars fully transmitted */
#define ZSRR1_PE 0x10 /* parity error (latched, must reset) */
#define ZSRR1_DO 0x20 /* data overrun (latched, must reset) */
#define ZSRR1_FE 0x40 /* framing/CRC error (not latched) */
#define ZSRR1_RXEOF 0x80 /* end of recv sdlc frame */
/*
* bits in R/WR2 -- interrupt vector number.
*
* NOTE that RR2 in channel A is unmodified, while in channel B it is
* modified by the current status of the UARTs. (This is independent
* of the setting of WR9_VIS.) If no interrupts are pending, the modified
* status is Channel B Special Receive. It can be written from
* either channel.
*/
#define ZSR2_TX_EMPTY_B 0x0
#define ZSR2_XSINT_B 0x2
#define ZSR2_RX_AVAIL_B 0x4
#define ZSR2_SRINT_B_OR_NONE 0x6
#define ZSR2_TX_EMPTY_A 0x8
#define ZSR2_XSINT_A 0xA
#define ZSR2_RX_AVAIL_A 0xC
#define ZSR2_SRINT_A 0xE
#define ZSR2_STATUS_ALL 0xE
/*
* bits in RR3 -- Interrupt Pending flags for both channels (this reg can
* only be read in Channel A, tho. Thanks guys.)
*/
#define ZSRR3_IP_B_STAT 0x01 /* Ext/status int pending, chan B */
#define ZSRR3_IP_B_TX 0x02 /* Transmit int pending, chan B */
#define ZSRR3_IP_B_RX 0x04 /* Receive int pending, chan B */
#define ZSRR3_IP_A_STAT 0x08 /* Ditto for channel A */
#define ZSRR3_IP_A_TX 0x10
#define ZSRR3_IP_A_RX 0x20
/* bits in RR8 -- this is the same as reading the Data port */
/* bits in RR10 -- DPLL and SDLC Loop Mode status -- not entered */
/* bits in R/WR12 -- lower byte of time constant for baud rate generator */
/* bits in R/WR13 -- upper byte of time constant for baud rate generator */
/* bits in R/WR15 -- interrupt enables for status conditions */
#define ZSR15_TIMER 0x02 /* ie if baud rate generator = 0 */
#define ZSR15_CD 0x08 /* ie transition on CD (car. det.) */
#define ZSR15_SYNC 0x10 /* ie transition on SYNC (gen purp) */
#define ZSR15_CTS 0x20 /* ie transition on CTS (clr to send) */
#define ZSR15_TX_UNDER 0x40 /* (SYNC) ie transmit underrun */
#define ZSR15_BREAK 0x80 /* ie on start, and end, of break */
/* Write register 0 -- common commands and Register Pointers */
#define ZSWR0_REG 0x0F /* mask: next reg to read/write */
#define ZSWR0_RESET_STATUS 0x10 /* reset status bit latches */
#define ZSWR0_SEND_ABORT 0x18 /* SDLC: send abort */
#define ZSWR0_FIRST_RX 0x20 /* in WR1_RX_FIRST_IE, enab next int */
#define ZSWR0_RESET_TXINT 0x28 /* reset transmitter interrupt */
#define ZSWR0_RESET_ERRORS 0x30 /* reset read character errors */
#define ZSWR0_CLR_INTR 0x38 /* Reset Interrupt In Service */
#define ZSWR0_RESET_RXCRC 0x40 /* Reset Rx CRC generator */
#define ZSWR0_RESET_TXCRC 0x80 /* Reset Tx CRC generator */
#define ZSWR0_RESET_EOM 0xC0 /* Reset Tx underrun / EOM */
/* bits in WR1 */
#define ZSWR1_SIE 0x01 /* status change master int enable */
/* Also see R15 for individual enabs */
#define ZSWR1_TIE 0x02 /* transmitter interrupt enable */
#define ZSWR1_PARITY_SPECIAL 0x04 /* parity err causes special rx int */
#define ZSWR1_RIE_FIRST_SPECIAL 0x08 /* r.i.e. on 1st char of msg */
#define ZSWR1_RIE 0x10 /* receiver interrupt enable */
#define ZSWR1_RIE_SPECIAL_ONLY 0x18 /* rie on special only */
#define ZSWR1_REQ_IS_RX 0x20 /* REQ pin is for receiver */
#define ZSWR1_REQ_NOT_WAIT 0x40 /* REQ/WAIT pin is REQ */
#define ZSWR1_REQ_ENABLE 0x80 /* enable REQ/WAIT */
/* There are other Receive interrupt options defined, see data sheet. */
/* bits in WR2 are defined above as R/WR2. */
/* bits in WR3 */
#define ZSWR3_RX_ENABLE 0x01 /* receiver enable */
#define ZSWR3_RXCRC_ENABLE 0x08 /* receiver CRC enable */
#define ZSWR3_HUNT 0x10 /* enter hunt mode */
#define ZSWR3_AUTO_CD_CTS 0x20 /* auto-enable CD&CTS rcv&xmit ctl */
#define ZSWR3_RX_5 0x00 /* receive 5-bit characters */
#define ZSWR3_RX_6 0x80 /* receive 6 bit characters */
#define ZSWR3_RX_7 0x40 /* receive 7 bit characters */
#define ZSWR3_RX_8 0xC0 /* receive 8 bit characters */
/* bits in WR4 */
#define ZSWR4_PARITY_ENABLE 0x01 /* Gen/check parity bit */
#define ZSWR4_PARITY_EVEN 0x02 /* Gen/check even parity */
#define ZSWR4_1_STOP 0x04 /* 1 stop bit */
#define ZSWR4_1_5_STOP 0x08 /* 1.5 stop bits */
#define ZSWR4_2_STOP 0x0C /* 2 stop bits */
#define ZSWR4_BISYNC 0x10 /* Bisync mode */
#define ZSWR4_SDLC 0x20 /* SDLC mode */
#define ZSWR4_X1_CLK 0x00 /* clock is 1x */
#define ZSWR4_X16_CLK 0x40 /* clock is 16x */
#define ZSWR4_X32_CLK 0x80 /* clock is 32x */
#define ZSWR4_X64_CLK 0xC0 /* clock is 64x */
/* bits in WR5 */
#define ZSWR5_TXCRC_ENABLE 0x01 /* transmitter CRC enable */
#define ZSWR5_RTS 0x02 /* RTS output */
#define ZSWR5_CRC16 0x04 /* Use CRC-16 for checksum */
#define ZSWR5_TX_ENABLE 0x08 /* transmitter enable */
#define ZSWR5_BREAK 0x10 /* send break continuously */
#define ZSWR5_TX_5 0x00 /* transmit 5 bit chars or less */
#define ZSWR5_TX_6 0x40 /* transmit 6 bit characters */
#define ZSWR5_TX_7 0x20 /* transmit 7 bit characters */
#define ZSWR5_TX_8 0x60 /* transmit 8 bit characters */
#define ZSWR5_DTR 0x80 /* DTR output */
/* bits in WR6 -- Sync characters or SDLC address field. */
/* bits in WR7 -- Sync character or SDLC flag */
/* bits in WR8 -- transmit buffer. Same as writing to data port. */
/*
* bits in WR9 -- Master interrupt control and reset. Accessible thru
* either channel, there's only one of them.
*/
#define ZSWR9_VECTOR_INCL_STAT 0x01 /* Include status bits in int vector */
#define ZSWR9_NO_VECTOR 0x02 /* Do not respond to int ack cycles */
#define ZSWR9_DIS_LOWER_CHAIN 0x04 /* Disable ints lower in daisy chain */
#define ZSWR9_MASTER_IE 0x08 /* Master interrupt enable */
#define ZSWR9_STAT_HIGH 0x10 /* Modify ivec bits 6-4, not 1-3 */
#define ZSWR9_RESET_CHAN_B 0x40 /* Reset just channel B */
#define ZSWR9_RESET_CHAN_A 0x80 /* Reset just channel A */
#define ZSWR9_RESET_WORLD 0xC0 /* Force hardware reset */
/* bits in WR10 -- SDLC, NRZI, FM control bits */
#define ZSWR10_UNDERRUN_ABORT 0x04 /* send abort on TX underrun */
#define ZSWR10_NRZI 0x20 /* NRZI mode (SDLC) */
#define ZSWR10_PRESET_ONES 0x80 /* preset CRC to ones (SDLC) */
/* bits in WR11 -- clock mode control */
#define ZSWR11_TRXC_XTAL 0x00 /* TRxC output = xtal osc */
#define ZSWR11_TRXC_XMIT 0x01 /* TRxC output = xmitter clk */
#define ZSWR11_TRXC_BAUD 0x02 /* TRxC output = baud rate gen */
#define ZSWR11_TRXC_DPLL 0x03 /* TRxC output = Phase Locked Loop */
#define ZSWR11_TRXC_OUT_ENA 0x04 /* TRxC output enable (unless input) */
#define ZSWR11_TXCLK_RTXC 0x00 /* Tx clock is RTxC pin */
#define ZSWR11_TXCLK_TRXC 0x08 /* Tx clock is TRxC pin */
#define ZSWR11_TXCLK_BAUD 0x10 /* Tx clock is baud rate gen output */
#define ZSWR11_TXCLK_DPLL 0x18 /* Tx clock is Phase Locked Loop o/p */
#define ZSWR11_RXCLK_RTXC 0x00 /* Rx clock is RTxC pin */
#define ZSWR11_RXCLK_TRXC 0x20 /* Rx clock is TRxC pin */
#define ZSWR11_RXCLK_BAUD 0x40 /* Rx clock is baud rate gen output */
#define ZSWR11_RXCLK_DPLL 0x60 /* Rx clock is Phase Locked Loop o/p */
#define ZSWR11_RTXC_XTAL 0x80 /* RTxC uses crystal, not TTL signal */
/* bits in WR12 -- described above as R/WR12 */
/* bits in WR13 -- described above as R/WR13 */
/* bits in WR14 -- misc control bits, and DPLL control */
#define ZSWR14_BAUD_ENA 0x01 /* enables baud rate counter */
#define ZSWR14_BAUD_FROM_PCLK 0x02 /* Baud rate gen src = PCLK not RTxC */
#define ZSWR14_DTR_IS_REQUEST 0x04 /* Changes DTR line to DMA Request */
#define ZSWR14_AUTO_ECHO 0x08 /* Echoes RXD to TXD */
#define ZSWR14_LOCAL_LOOPBACK 0x10 /* Echoes TX to RX in chip */
#define ZSWR14_DPLL_NOP 0x00 /* These 8 commands are mut. exclu. */
#define ZSWR14_DPLL_SEARCH 0x20 /* Enter search mode in DPLL */
#define ZSWR14_DPLL_RESET 0x40 /* Reset missing clock in DPLL */
#define ZSWR14_DPLL_DISABLE 0x60 /* Disable DPLL */
#define ZSWR14_DPLL_SRC_BAUD 0x80 /* Source for DPLL is baud rate gen */
#define ZSWR14_DPLL_SRC_RTXC 0xA0 /* Source for DPLL is RTxC pin */
#define ZSWR14_DPLL_FM 0xC0 /* DPLL should run in FM mode */
#define ZSWR14_DPLL_NRZI 0xE0 /* DPLL should run in NRZI mode */
/* bits in WR15 -- described above as R/WR15 */
/*
* UART register addressing
*
* It would be nice if they used 4 address pins to address 15 registers,
* but they only used 1. So you have to write to the control port then
* read or write it; the 2nd cycle is done to whatever register number
* you wrote in the first cycle.
*
* The data register can also be accessed as Read/Write register 8.
*/
#ifdef _KERNEL
struct zscc_device {
volatile unsigned char zscc_control;
volatile unsigned char :8; /* Filler */
volatile unsigned char zscc_data;
volatile unsigned char :8; /* Filler */
};
#define ZSOFF 4
#endif /* _KERNEL */
#ifdef __cplusplus
}
#endif
#endif /* !_SYS_SER_ZSCC_H */
|