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