Annotation of sys/dev/usb/uftdireg.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: uftdireg.h,v 1.11 2006/06/16 06:28:25 deraadt Exp $ */
! 2: /* $NetBSD: uftdireg.h,v 1.6 2002/07/11 21:14:28 augustss Exp $ */
! 3:
! 4: /*
! 5: * Definitions for the FTDI USB Single Port Serial Converter -
! 6: * known as FTDI_SIO (Serial Input/Output application of the chipset)
! 7: *
! 8: * The device is based on the FTDI FT8U100AX chip. It has a DB25 on one side,
! 9: * USB on the other.
! 10: *
! 11: * Thanks to FTDI (http://www.ftdi.co.uk) for so kindly providing details
! 12: * of the protocol required to talk to the device and ongoing assistance
! 13: * during development.
! 14: *
! 15: * Bill Ryder - bryder@sgi.com of Silicon Graphics, Inc. is the original
! 16: * author of this file.
! 17: */
! 18: /* Modified by Lennart Augustsson */
! 19:
! 20: /* Vendor Request Interface */
! 21: #define FTDI_SIO_RESET 0 /* Reset the port */
! 22: #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */
! 23: #define FTDI_SIO_SET_FLOW_CTRL 2 /* Set flow control register */
! 24: #define FTDI_SIO_SET_BAUD_RATE 3 /* Set baud rate */
! 25: #define FTDI_SIO_SET_DATA 4 /* Set the data characteristics of the port */
! 26: #define FTDI_SIO_GET_STATUS 5 /* Retrieve current value of status reg */
! 27: #define FTDI_SIO_SET_EVENT_CHAR 6 /* Set the event character */
! 28: #define FTDI_SIO_SET_ERROR_CHAR 7 /* Set the error character */
! 29:
! 30: /* Port Identifier Table */
! 31: #define FTDI_PIT_DEFAULT 0 /* SIOA */
! 32: #define FTDI_PIT_SIOA 1 /* SIOA */
! 33: #define FTDI_PIT_SIOB 2 /* SIOB */
! 34: #define FTDI_PIT_PARALLEL 3 /* Parallel */
! 35:
! 36: enum uftdi_type {
! 37: UFTDI_TYPE_SIO,
! 38: UFTDI_TYPE_8U232AM
! 39: };
! 40:
! 41: /*
! 42: * BmRequestType: 0100 0000B
! 43: * bRequest: FTDI_SIO_RESET
! 44: * wValue: Control Value
! 45: * 0 = Reset SIO
! 46: * 1 = Purge RX buffer
! 47: * 2 = Purge TX buffer
! 48: * wIndex: Port
! 49: * wLength: 0
! 50: * Data: None
! 51: *
! 52: * The Reset SIO command has this effect:
! 53: *
! 54: * Sets flow control set to 'none'
! 55: * Event char = 0x0d
! 56: * Event trigger = disabled
! 57: * Purge RX buffer
! 58: * Purge TX buffer
! 59: * Clear DTR
! 60: * Clear RTS
! 61: * baud and data format not reset
! 62: *
! 63: * The Purge RX and TX buffer commands affect nothing except the buffers
! 64: *
! 65: */
! 66: /* FTDI_SIO_RESET */
! 67: #define FTDI_SIO_RESET_SIO 0
! 68: #define FTDI_SIO_RESET_PURGE_RX 1
! 69: #define FTDI_SIO_RESET_PURGE_TX 2
! 70:
! 71:
! 72: /*
! 73: * BmRequestType: 0100 0000B
! 74: * bRequest: FTDI_SIO_SET_BAUDRATE
! 75: * wValue: BaudRate value - see below
! 76: * wIndex: Port
! 77: * wLength: 0
! 78: * Data: None
! 79: */
! 80: /* FTDI_SIO_SET_BAUDRATE */
! 81: enum {
! 82: ftdi_sio_b300 = 0,
! 83: ftdi_sio_b600 = 1,
! 84: ftdi_sio_b1200 = 2,
! 85: ftdi_sio_b2400 = 3,
! 86: ftdi_sio_b4800 = 4,
! 87: ftdi_sio_b9600 = 5,
! 88: ftdi_sio_b19200 = 6,
! 89: ftdi_sio_b38400 = 7,
! 90: ftdi_sio_b57600 = 8,
! 91: ftdi_sio_b115200 = 9
! 92: };
! 93:
! 94: #define FTDI_8U232AM_FREQ 3000000
! 95:
! 96: /* Bounds for normal divisors as 4-bit fixed precision ints. */
! 97: #define FTDI_8U232AM_MIN_DIV 0x20
! 98: #define FTDI_8U232AM_MAX_DIV 0x3fff8
! 99:
! 100: /*
! 101: * BmRequestType: 0100 0000B
! 102: * bRequest: FTDI_SIO_SET_DATA
! 103: * wValue: Data characteristics (see below)
! 104: * wIndex: Port
! 105: * wLength: 0
! 106: * Data: No
! 107: *
! 108: * Data characteristics
! 109: *
! 110: * B0..7 Number of data bits
! 111: * B8..10 Parity
! 112: * 0 = None
! 113: * 1 = Odd
! 114: * 2 = Even
! 115: * 3 = Mark
! 116: * 4 = Space
! 117: * B11..13 Stop Bits
! 118: * 0 = 1
! 119: * 1 = 1.5
! 120: * 2 = 2
! 121: * B14..15 Reserved
! 122: *
! 123: */
! 124: /* FTDI_SIO_SET_DATA */
! 125: #define FTDI_SIO_SET_DATA_BITS(n) (n)
! 126: #define FTDI_SIO_SET_DATA_PARITY_NONE (0x0 << 8)
! 127: #define FTDI_SIO_SET_DATA_PARITY_ODD (0x1 << 8)
! 128: #define FTDI_SIO_SET_DATA_PARITY_EVEN (0x2 << 8)
! 129: #define FTDI_SIO_SET_DATA_PARITY_MARK (0x3 << 8)
! 130: #define FTDI_SIO_SET_DATA_PARITY_SPACE (0x4 << 8)
! 131: #define FTDI_SIO_SET_DATA_STOP_BITS_1 (0x0 << 11)
! 132: #define FTDI_SIO_SET_DATA_STOP_BITS_15 (0x1 << 11)
! 133: #define FTDI_SIO_SET_DATA_STOP_BITS_2 (0x2 << 11)
! 134: #define FTDI_SIO_SET_BREAK (0x1 << 14)
! 135:
! 136:
! 137: /*
! 138: * BmRequestType: 0100 0000B
! 139: * bRequest: FTDI_SIO_MODEM_CTRL
! 140: * wValue: ControlValue (see below)
! 141: * wIndex: Port
! 142: * wLength: 0
! 143: * Data: None
! 144: *
! 145: * NOTE: If the device is in RTS/CTS flow control, the RTS set by this
! 146: * command will be IGNORED without an error being returned
! 147: * Also - you can not set DTR and RTS with one control message
! 148: *
! 149: * ControlValue
! 150: * B0 DTR state
! 151: * 0 = reset
! 152: * 1 = set
! 153: * B1 RTS state
! 154: * 0 = reset
! 155: * 1 = set
! 156: * B2..7 Reserved
! 157: * B8 DTR state enable
! 158: * 0 = ignore
! 159: * 1 = use DTR state
! 160: * B9 RTS state enable
! 161: * 0 = ignore
! 162: * 1 = use RTS state
! 163: * B10..15 Reserved
! 164: */
! 165: /* FTDI_SIO_MODEM_CTRL */
! 166: #define FTDI_SIO_SET_DTR_MASK 0x1
! 167: #define FTDI_SIO_SET_DTR_HIGH (1 | ( FTDI_SIO_SET_DTR_MASK << 8))
! 168: #define FTDI_SIO_SET_DTR_LOW (0 | ( FTDI_SIO_SET_DTR_MASK << 8))
! 169: #define FTDI_SIO_SET_RTS_MASK 0x2
! 170: #define FTDI_SIO_SET_RTS_HIGH (2 | ( FTDI_SIO_SET_RTS_MASK << 8))
! 171: #define FTDI_SIO_SET_RTS_LOW (0 | ( FTDI_SIO_SET_RTS_MASK << 8))
! 172:
! 173:
! 174: /*
! 175: * BmRequestType: 0100 0000b
! 176: * bRequest: FTDI_SIO_SET_FLOW_CTRL
! 177: * wValue: Xoff/Xon
! 178: * wIndex: Protocol/Port - hIndex is protocol / lIndex is port
! 179: * wLength: 0
! 180: * Data: None
! 181: *
! 182: * hIndex protocol is:
! 183: * B0 Output handshaking using RTS/CTS
! 184: * 0 = disabled
! 185: * 1 = enabled
! 186: * B1 Output handshaking using DTR/DSR
! 187: * 0 = disabled
! 188: * 1 = enabled
! 189: * B2 Xon/Xoff handshaking
! 190: * 0 = disabled
! 191: * 1 = enabled
! 192: *
! 193: * A value of zero in the hIndex field disables handshaking
! 194: *
! 195: * If Xon/Xoff handshaking is specified, the hValue field should contain the
! 196: * XOFF character and the lValue field contains the XON character.
! 197: */
! 198: /* FTDI_SIO_SET_FLOW_CTRL */
! 199: #define FTDI_SIO_DISABLE_FLOW_CTRL 0x0
! 200: #define FTDI_SIO_RTS_CTS_HS 0x1
! 201: #define FTDI_SIO_DTR_DSR_HS 0x2
! 202: #define FTDI_SIO_XON_XOFF_HS 0x4
! 203:
! 204:
! 205: /*
! 206: * BmRequestType: 0100 0000b
! 207: * bRequest: FTDI_SIO_SET_EVENT_CHAR
! 208: * wValue: Event Char
! 209: * wIndex: Port
! 210: * wLength: 0
! 211: * Data: None
! 212: *
! 213: * wValue:
! 214: * B0..7 Event Character
! 215: * B8 Event Character Processing
! 216: * 0 = disabled
! 217: * 1 = enabled
! 218: * B9..15 Reserved
! 219: *
! 220: * FTDI_SIO_SET_EVENT_CHAR
! 221: *
! 222: * Set the special event character for the specified communications port.
! 223: * If the device sees this character it will immediately return the
! 224: * data read so far - rather than wait 40ms or until 62 bytes are read
! 225: * which is what normally happens.
! 226: */
! 227:
! 228:
! 229:
! 230: /*
! 231: * BmRequestType: 0100 0000b
! 232: * bRequest: FTDI_SIO_SET_ERROR_CHAR
! 233: * wValue: Error Char
! 234: * wIndex: Port
! 235: * wLength: 0
! 236: * Data: None
! 237: *
! 238: * Error Char
! 239: * B0..7 Error Character
! 240: * B8 Error Character Processing
! 241: * 0 = disabled
! 242: * 1 = enabled
! 243: * B9..15 Reserved
! 244: *
! 245: *
! 246: * FTDI_SIO_SET_ERROR_CHAR
! 247: * Set the parity error replacement character for the specified communications
! 248: * port.
! 249: */
! 250:
! 251:
! 252: /*
! 253: * BmRequestType: 1100 0000b
! 254: * bRequest: FTDI_SIO_GET_MODEM_STATUS
! 255: * wValue: zero
! 256: * wIndex: Port
! 257: * wLength: 1
! 258: * Data: Status
! 259: *
! 260: * One byte of data is returned
! 261: * B0..3 0
! 262: * B4 CTS
! 263: * 0 = inactive
! 264: * 1 = active
! 265: * B5 DSR
! 266: * 0 = inactive
! 267: * 1 = active
! 268: * B6 Ring Indicator (RI)
! 269: * 0 = inactive
! 270: * 1 = active
! 271: * B7 Receive Line Signal Detect (RLSD)
! 272: * 0 = inactive
! 273: * 1 = active
! 274: *
! 275: * FTDI_SIO_GET_MODEM_STATUS
! 276: * Retrieve the current value of the modem status register.
! 277: */
! 278: #define FTDI_SIO_CTS_MASK 0x10
! 279: #define FTDI_SIO_DSR_MASK 0x20
! 280: #define FTDI_SIO_RI_MASK 0x40
! 281: #define FTDI_SIO_RLSD_MASK 0x80
! 282:
! 283:
! 284:
! 285: /*
! 286: *
! 287: * DATA FORMAT
! 288: *
! 289: * IN Endpoint
! 290: *
! 291: * The device reserves the first two bytes of data on this endpoint to contain
! 292: * the current values of the modem and line status registers. In the absence of
! 293: * data, the device generates a message consisting of these two status bytes
! 294: * every 40 ms.
! 295: *
! 296: * Byte 0: Modem Status
! 297: * NOTE: 4 upper bits have same layout as the MSR register in a 16550
! 298: *
! 299: * Offset Description
! 300: * B0..3 Port
! 301: * B4 Clear to Send (CTS)
! 302: * B5 Data Set Ready (DSR)
! 303: * B6 Ring Indicator (RI)
! 304: * B7 Receive Line Signal Detect (RLSD)
! 305: *
! 306: * Byte 1: Line Status
! 307: * NOTE: same layout as the LSR register in a 16550
! 308: *
! 309: * Offset Description
! 310: * B0 Data Ready (DR)
! 311: * B1 Overrun Error (OE)
! 312: * B2 Parity Error (PE)
! 313: * B3 Framing Error (FE)
! 314: * B4 Break Interrupt (BI)
! 315: * B5 Transmitter Holding Register (THRE)
! 316: * B6 Transmitter Empty (TEMT)
! 317: * B7 Error in RCVR FIFO
! 318: *
! 319: *
! 320: * OUT Endpoint
! 321: *
! 322: * This device reserves the first bytes of data on this endpoint contain the
! 323: * length and port identifier of the message. For the FTDI USB Serial converter
! 324: * the port identifier is always 1.
! 325: *
! 326: * Byte 0: Port & length
! 327: *
! 328: * Offset Description
! 329: * B0..1 Port
! 330: * B2..7 Length of message - (not including Byte 0)
! 331: *
! 332: */
! 333: #define FTDI_PORT_MASK 0x0f
! 334: #define FTDI_MSR_MASK 0xf0
! 335: #define FTDI_GET_MSR(p) (((p)[0]) & FTDI_MSR_MASK)
! 336: #define FTDI_GET_LSR(p) ((p)[1])
! 337: #define FTDI_LSR_MASK (~0x60) /* interesting bits */
! 338: #define FTDI_OUT_TAG(len, port) (((len) << 2) | (port))
CVSweb