1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 #ifndef _SYS_USB_USBSER_KEYSPAN_USA49MSG_H
30 #define	_SYS_USB_USBSER_KEYSPAN_USA49MSG_H
31 
32 typedef struct keyspan_usa49_port_ctrl_msg keyspan_usa49_port_ctrl_msg_t;
33 typedef struct keyspan_usa49_port_status_msg keyspan_usa49_port_status_msg_t;
34 
35 /*
36  * usa49msg.h
37  *
38  * Copyright (C) 1998-2000 InnoSys Incorporated.  All Rights Reserved
39  *
40  * Keyspan USB Async Message Formats for the USA49W
41  *
42  *
43  * Buffer formats for RX/TX data messages are not defined by
44  * a structure, but are described here:
45  *
46  * USB OUT (host -> USAxx, transmit) messages contain a
47  * REQUEST_ACK indicator (set to 0xff to request an ACK at the
48  * completion of transmit; 0x00 otherwise), followed by data:
49  *
50  *	RQSTACK DAT DAT DAT ...
51  *
52  * with a total data length of 63.
53  *
54  * USB IN (USAxx -> host, receive) messages begin with a status
55  * byte in which the 0x80 bit is either:
56  *
57  * (a)	0x80 bit clear
58  *		indicates that the bytes following it are all data
59  *		bytes:
60  *
61  *			STAT DATA DATA DATA DATA DATA ...
62  *
63  *		for a total of up to 63 DATA bytes,
64  *
65  * or:
66  *
67  *	(b)	0x80 bit set
68  *		indiates that the bytes following alternate data and
69  *		status bytes:
70  *
71  *			STAT DATA STAT DATA STAT DATA STAT DATA ...
72  *
73  *		for a total of up to 32 DATA bytes.
74  *
75  * The valid bits in the STAT bytes are:
76  *
77  *	OVERRUN	0x02
78  *	PARITY	0x04
79  *	FRAMING	0x08
80  *	BREAK	0x10
81  *
82  * Notes:
83  *
84  * (1) The OVERRUN bit can appear in either (a) or (b) format
85  *	messages, but the but the PARITY/FRAMING/BREAK bits
86  *	only appear in (b) format messages.
87  * (2) For the host to determine the exact point at which the
88  *	overrun occurred (to identify the point in the data
89  *	stream at which the data was lost), it needs to count
90  *	128 characters, starting at the first character of the
91  *	message in which OVERRUN was reported; the lost character(s)
92  *	would have been received between the 128th and 129th
93  *	characters.
94  * (3)	An RX data message in which the first byte has 0x80 clear
95  *	serves as a "break off" indicator.
96  * (4)	a control message specifying disablePort will be answered
97  *	with a status message, but no further status will be sent
98  *	until a control messages with enablePort is sent
99  *
100  */
101 
102 /*
103  * Host->device messages sent on the global control endpoint:
104  *
105  * portNumber	message
106  * ----------	--------------------
107  * 0,1,2,3	portControlMessage
108  * 0x80		globalControlMessage
109  */
110 
111 struct keyspan_usa49_port_ctrl_msg {
112 	/*
113 	 * 0.	0/1/2/3 	port control message follows
114 	 * 0x80 set	non-port control message follows
115 	 */
116 	uint8_t portNumber;
117 
118 	/*
119 	 * there are three types of "commands" sent in the control message:
120 	 *
121 	 * 1. configuration changes which must be requested by setting
122 	 * the corresponding "set" flag (and should only be requested
123 	 * when necessary, to reduce overhead on the USA26):
124 	 */
125 	uint8_t setClocking;	/* host requests baud rate be set */
126 	uint8_t baudLo;		/* host does baud divisor calculation */
127 
128 	/* baudHi is only used for first port (gives lower rates) */
129 	uint8_t baudHi;
130 	uint8_t prescaler;	/* specified as N/8; values 8-ff are valid */
131 	/* must be set any time internal baud rate is set; */
132 	uint8_t txClocking;	/* 0=internal, 1=external/DSR */
133 	uint8_t rxClocking;	/* 0=internal, 1=external/DSR */
134 
135 	uint8_t setLcr;		/* host requests lcr be set */
136 	uint8_t lcr;		/* use PARITY, STOPBITS, DATABITS below */
137 
138 	uint8_t setFlowControl;	/* host requests flow control be set */
139 	uint8_t ctsFlowControl;	/* 1=use CTS flow control, 0=don't */
140 	uint8_t xonFlowControl;	/* 1=use XON/XOFF flow control, 0=don't */
141 	uint8_t xonChar;	/* specified in current character format */
142 	uint8_t xoffChar;	/* specified in current character format */
143 
144 	uint8_t setRts;		/* host requests RTS output be set */
145 	uint8_t rts;		/* 1=active, 0=inactive */
146 
147 	uint8_t setDtr;		/* host requests DTR output be set */
148 	uint8_t dtr;		/* 1=on, 0=off */
149 
150 	/*
151 	 * 3. configuration data which is simply used as is (no overhead,
152 	 * but must be specified correctly in every host message).
153 	 */
154 
155 	/* forward when this number of chars available */
156 	uint8_t forwardingLength;
157 	uint8_t dsrFlowControl;	/* 1=use DSR flow control, 0=don't */
158 
159 	/* 0=not allowed, 1=normal, 2-255 deliver ACK faster */
160 	uint8_t txAckThreshold;
161 	uint8_t loopbackMode;	/* 0=no loopback, 1=loopback enabled */
162 
163 	/*
164 	 * 4.	commands which are flags only; these are processed in order
165 	 * (so that, e.g., if both _txOn and _txOff flags are set, the
166 	 * port ends in a TX_OFF state); any non-zero value is respected
167 	 */
168 
169 	/* enable transmitting (and continue if there's data) */
170 	uint8_t _txOn;
171 	uint8_t _txOff;		/* stop transmitting */
172 	uint8_t txFlush;	/* toss outbound data */
173 	uint8_t txBreak;	/* turn on break (cleared by _txOn) */
174 	uint8_t rxOn;		/* turn on receiver */
175 	uint8_t rxOff;		/* turn off receiver */
176 	uint8_t rxFlush;	/* toss inbound data */
177 
178 	/* forward all inbound data, NOW (as if fwdLen==1) */
179 	uint8_t rxForward;
180 
181 	/* return current status (even if it hasn't changed) */
182 	uint8_t returnStatus;
183 	uint8_t resetDataToggle;	/* reset data toggle state to DATA0 */
184 
185 	/* start servicing port (move data, check status) */
186 	uint8_t enablePort;
187 
188 	/* stop servicing port (does implicit tx/rx flush/off) */
189 	uint8_t disablePort;
190 
191 };
192 
193 /* defines for bits in lcr */
194 #define	USA_DATABITS_5		0x00
195 #define	USA_DATABITS_6		0x01
196 #define	USA_DATABITS_7		0x02
197 #define	USA_DATABITS_8		0x03
198 #define	STOPBITS_5678_1		0x00	/* 1 stop bit for all byte sizes */
199 #define	STOPBITS_5_1p5		0x04	/* 1.5 stop bits for 5-bit byte */
200 #define	STOPBITS_678_2		0x04	/* 2 stop bits for 6/7/8-bit byte */
201 #define	USA_PARITY_NONE		0x00
202 #define	USA_PARITY_ODD		0x08
203 #define	USA_PARITY_EVEN		0x18
204 #define	PARITY_1			0x28
205 #define	PARITY_0			0x38
206 
207 /*
208  * during normal operation, status messages are returned
209  * to the host whenever the board detects changes.  In some
210  * circumstances (e.g. Windows), status messages from the
211  * device cause problems; to shut them off, the host issues
212  * a control message with the disableStatusMessages flags
213  * set (to any non-zero value).  The device will respond to
214  * this message, and then suppress further status messages;
215  * it will resume sending status messages any time the host
216  * sends any control message (either global or port-specific).
217  */
218 
219 struct keyspan_usa49_globalControlMessage {
220 	uint8_t portNumber;	/* 0x80 */
221 
222 	/* 1/2=number of status responses requested */
223 	uint8_t sendGlobalStatus;
224 	uint8_t resetStatusToggle;	/* 1=reset global status toggle */
225 	uint8_t resetStatusCount;	/* a cycling value */
226 	uint8_t remoteWakeupEnable;	/* 0x10=P1, 0x20=P2, 0x40=P3, 0x80=P4 */
227 	uint8_t disableStatusMessages;	/* 1=send no status until host talks */
228 };
229 
230 /*
231  * Device->host messages send on the global status endpoint
232  *
233  * portNumber			message
234  * ----------			--------------------
235  * 0x00,0x01,0x02,0x03		portStatusMessage
236  * 0x80				globalStatusMessage
237  * 0x81				globalDebugMessage
238  */
239 
240 struct keyspan_usa49_port_status_msg {	/* one for each port */
241 	uint8_t portNumber;	/* 0,1,2,3 */
242 	uint8_t cts;		/* reports CTS pin */
243 	uint8_t dcd;		/* reports DCD pin */
244 	uint8_t dsr;		/* reports DSR pin */
245 	uint8_t ri;		/* reports RI pin */
246 	uint8_t _txOff;		/* transmit has been disabled (by host) */
247 
248 	/* transmit is in XOFF state (either host or RX XOFF) */
249 	uint8_t _txXoff;
250 	uint8_t rxEnabled;	/* as configured by rxOn/rxOff 1=on, 0=off */
251 
252 	/* 1=a control message has been processed */
253 	uint8_t controlResponse;
254 	uint8_t txAck;		/* ACK (data TX complete) */
255 	uint8_t rs232valid;	/* RS-232 signal valid */
256 };
257 
258 /* bits in RX data message when STAT byte is included */
259 #define	RXERROR_OVERRUN	0x02
260 #define	RXERROR_PARITY	0x04
261 #define	RXERROR_FRAMING	0x08
262 #define	RXERROR_BREAK	0x10
263 
264 struct keyspan_usa49_globalStatusMessage {
265 	uint8_t portNumber;	/* 0x80=globalStatusMessage */
266 	uint8_t sendGlobalStatus;	/* from request, decremented */
267 	uint8_t resetStatusCount;	/* as in request */
268 };
269 
270 struct keyspan_usa49_globalDebugMessage {
271 	uint8_t portNumber;	/* 0x81=globalDebugMessage */
272 	uint8_t n;		/* typically a count/status byte */
273 	uint8_t b;		/* typically a data byte */
274 };
275 
276 /* ie: the maximum length of an EZUSB endpoint buffer */
277 #define	MAX_DATA_LEN			64
278 
279 /* update status approx. 60 times a second (16.6666 ms) */
280 #define	STATUS_UPDATE_INTERVAL	16
281 
282 /* status rationing tuning value (each port gets checked each n ms) */
283 #define	STATUS_RATION	10
284 
285 #endif /* _SYS_USB_USBSER_KEYSPAN_USA49MSG_H */
286