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