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