uftdireg.h revision 1.4 1 1.4 ichiro /* $NetBSD: uftdireg.h,v 1.4 2001/12/17 14:31:02 ichiro 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.4 ichiro #define FTDI_SIO_SET_BREAK (0x1 << 14)
124 1.1 augustss
125 1.1 augustss
126 1.1 augustss /*
127 1.1 augustss * BmRequestType: 0100 0000B
128 1.1 augustss * bRequest: FTDI_SIO_MODEM_CTRL
129 1.1 augustss * wValue: ControlValue (see below)
130 1.1 augustss * wIndex: Port
131 1.1 augustss * wLength: 0
132 1.1 augustss * Data: None
133 1.1 augustss *
134 1.1 augustss * NOTE: If the device is in RTS/CTS flow control, the RTS set by this
135 1.1 augustss * command will be IGNORED without an error being returned
136 1.1 augustss * Also - you can not set DTR and RTS with one control message
137 1.1 augustss *
138 1.1 augustss * ControlValue
139 1.1 augustss * B0 DTR state
140 1.1 augustss * 0 = reset
141 1.1 augustss * 1 = set
142 1.1 augustss * B1 RTS state
143 1.1 augustss * 0 = reset
144 1.1 augustss * 1 = set
145 1.1 augustss * B2..7 Reserved
146 1.1 augustss * B8 DTR state enable
147 1.1 augustss * 0 = ignore
148 1.1 augustss * 1 = use DTR state
149 1.1 augustss * B9 RTS state enable
150 1.1 augustss * 0 = ignore
151 1.1 augustss * 1 = use RTS state
152 1.1 augustss * B10..15 Reserved
153 1.1 augustss */
154 1.1 augustss /* FTDI_SIO_MODEM_CTRL */
155 1.1 augustss #define FTDI_SIO_SET_DTR_MASK 0x1
156 1.1 augustss #define FTDI_SIO_SET_DTR_HIGH (1 | ( FTDI_SIO_SET_DTR_MASK << 8))
157 1.1 augustss #define FTDI_SIO_SET_DTR_LOW (0 | ( FTDI_SIO_SET_DTR_MASK << 8))
158 1.1 augustss #define FTDI_SIO_SET_RTS_MASK 0x2
159 1.1 augustss #define FTDI_SIO_SET_RTS_HIGH (2 | ( FTDI_SIO_SET_RTS_MASK << 8))
160 1.1 augustss #define FTDI_SIO_SET_RTS_LOW (0 | ( FTDI_SIO_SET_RTS_MASK << 8))
161 1.1 augustss
162 1.1 augustss
163 1.1 augustss /*
164 1.1 augustss * BmRequestType: 0100 0000b
165 1.1 augustss * bRequest: FTDI_SIO_SET_FLOW_CTRL
166 1.1 augustss * wValue: Xoff/Xon
167 1.1 augustss * wIndex: Protocol/Port - hIndex is protocl / lIndex is port
168 1.1 augustss * wLength: 0
169 1.1 augustss * Data: None
170 1.1 augustss *
171 1.1 augustss * hIndex protocol is:
172 1.1 augustss * B0 Output handshaking using RTS/CTS
173 1.1 augustss * 0 = disabled
174 1.1 augustss * 1 = enabled
175 1.1 augustss * B1 Output handshaking using DTR/DSR
176 1.1 augustss * 0 = disabled
177 1.1 augustss * 1 = enabled
178 1.1 augustss * B2 Xon/Xoff handshaking
179 1.1 augustss * 0 = disabled
180 1.1 augustss * 1 = enabled
181 1.1 augustss *
182 1.1 augustss * A value of zero in the hIndex field disables handshaking
183 1.1 augustss *
184 1.1 augustss * If Xon/Xoff handshaking is specified, the hValue field should contain the
185 1.1 augustss * XOFF character and the lValue field contains the XON character.
186 1.1 augustss */
187 1.1 augustss /* FTDI_SIO_SET_FLOW_CTRL */
188 1.1 augustss #define FTDI_SIO_DISABLE_FLOW_CTRL 0x0
189 1.1 augustss #define FTDI_SIO_RTS_CTS_HS 0x1
190 1.1 augustss #define FTDI_SIO_DTR_DSR_HS 0x2
191 1.1 augustss #define FTDI_SIO_XON_XOFF_HS 0x4
192 1.1 augustss
193 1.1 augustss
194 1.1 augustss /*
195 1.1 augustss * BmRequestType: 0100 0000b
196 1.1 augustss * bRequest: FTDI_SIO_SET_EVENT_CHAR
197 1.1 augustss * wValue: Event Char
198 1.1 augustss * wIndex: Port
199 1.1 augustss * wLength: 0
200 1.1 augustss * Data: None
201 1.1 augustss *
202 1.1 augustss * wValue:
203 1.1 augustss * B0..7 Event Character
204 1.1 augustss * B8 Event Character Processing
205 1.1 augustss * 0 = disabled
206 1.1 augustss * 1 = enabled
207 1.1 augustss * B9..15 Reserved
208 1.1 augustss *
209 1.1 augustss * FTDI_SIO_SET_EVENT_CHAR
210 1.1 augustss *
211 1.1 augustss * Set the special event character for the specified communications port.
212 1.1 augustss * If the device sees this character it will immediately return the
213 1.1 augustss * data read so far - rather than wait 40ms or until 62 bytes are read
214 1.1 augustss * which is what normally happens.
215 1.1 augustss */
216 1.1 augustss
217 1.1 augustss
218 1.1 augustss
219 1.1 augustss /*
220 1.1 augustss * BmRequestType: 0100 0000b
221 1.1 augustss * bRequest: FTDI_SIO_SET_ERROR_CHAR
222 1.1 augustss * wValue: Error Char
223 1.1 augustss * wIndex: Port
224 1.1 augustss * wLength: 0
225 1.1 augustss * Data: None
226 1.1 augustss *
227 1.1 augustss * Error Char
228 1.1 augustss * B0..7 Error Character
229 1.1 augustss * B8 Error Character Processing
230 1.1 augustss * 0 = disabled
231 1.1 augustss * 1 = enabled
232 1.1 augustss * B9..15 Reserved
233 1.1 augustss *
234 1.1 augustss *
235 1.1 augustss * FTDI_SIO_SET_ERROR_CHAR
236 1.1 augustss * Set the parity error replacement character for the specified communications
237 1.1 augustss * port.
238 1.1 augustss */
239 1.1 augustss
240 1.1 augustss
241 1.1 augustss /*
242 1.1 augustss * BmRequestType: 1100 0000b
243 1.1 augustss * bRequest: FTDI_SIO_GET_MODEM_STATUS
244 1.1 augustss * wValue: zero
245 1.1 augustss * wIndex: Port
246 1.1 augustss * wLength: 1
247 1.1 augustss * Data: Status
248 1.1 augustss *
249 1.1 augustss * One byte of data is returned
250 1.1 augustss * B0..3 0
251 1.1 augustss * B4 CTS
252 1.1 augustss * 0 = inactive
253 1.1 augustss * 1 = active
254 1.1 augustss * B5 DSR
255 1.1 augustss * 0 = inactive
256 1.1 augustss * 1 = active
257 1.1 augustss * B6 Ring Indicator (RI)
258 1.1 augustss * 0 = inactive
259 1.1 augustss * 1 = active
260 1.1 augustss * B7 Receive Line Signal Detect (RLSD)
261 1.1 augustss * 0 = inactive
262 1.1 augustss * 1 = active
263 1.1 augustss *
264 1.1 augustss * FTDI_SIO_GET_MODEM_STATUS
265 1.3 wiz * Retrieve the current value of the modem status register.
266 1.1 augustss */
267 1.1 augustss #define FTDI_SIO_CTS_MASK 0x10
268 1.1 augustss #define FTDI_SIO_DSR_MASK 0x20
269 1.1 augustss #define FTDI_SIO_RI_MASK 0x40
270 1.1 augustss #define FTDI_SIO_RLSD_MASK 0x80
271 1.1 augustss
272 1.1 augustss
273 1.1 augustss
274 1.1 augustss /*
275 1.1 augustss *
276 1.1 augustss * DATA FORMAT
277 1.1 augustss *
278 1.1 augustss * IN Endpoint
279 1.1 augustss *
280 1.1 augustss * The device reserves the first two bytes of data on this endpoint to contain
281 1.1 augustss * the current values of the modem and line status registers. In the absence of
282 1.1 augustss * data, the device generates a message consisting of these two status bytes
283 1.1 augustss * every 40 ms.
284 1.1 augustss *
285 1.1 augustss * Byte 0: Modem Status
286 1.1 augustss * NOTE: 4 upper bits have same layout as the MSR register in a 16550
287 1.1 augustss *
288 1.1 augustss * Offset Description
289 1.1 augustss * B0..3 Port
290 1.1 augustss * B4 Clear to Send (CTS)
291 1.1 augustss * B5 Data Set Ready (DSR)
292 1.1 augustss * B6 Ring Indicator (RI)
293 1.1 augustss * B7 Receive Line Signal Detect (RLSD)
294 1.1 augustss *
295 1.1 augustss * Byte 1: Line Status
296 1.1 augustss * NOTE: same layout as the LSR register in a 16550
297 1.1 augustss *
298 1.1 augustss * Offset Description
299 1.1 augustss * B0 Data Ready (DR)
300 1.1 augustss * B1 Overrun Error (OE)
301 1.1 augustss * B2 Parity Error (PE)
302 1.1 augustss * B3 Framing Error (FE)
303 1.1 augustss * B4 Break Interrupt (BI)
304 1.1 augustss * B5 Transmitter Holding Register (THRE)
305 1.1 augustss * B6 Transmitter Empty (TEMT)
306 1.1 augustss * B7 Error in RCVR FIFO
307 1.1 augustss *
308 1.1 augustss *
309 1.1 augustss * OUT Endpoint
310 1.1 augustss *
311 1.1 augustss * This device reserves the first bytes of data on this endpoint contain the
312 1.1 augustss * length and port identifier of the message. For the FTDI USB Serial converter
313 1.1 augustss * the port identifier is always 1.
314 1.1 augustss *
315 1.1 augustss * Byte 0: Port & length
316 1.1 augustss *
317 1.1 augustss * Offset Description
318 1.1 augustss * B0..1 Port
319 1.1 augustss * B2..7 Length of message - (not including Byte 0)
320 1.1 augustss *
321 1.1 augustss */
322 1.1 augustss #define FTDI_PORT_MASK 0x0f
323 1.1 augustss #define FTDI_MSR_MASK 0xf0
324 1.1 augustss #define FTDI_GET_MSR(p) (((p)[0]) & FTDI_MSR_MASK)
325 1.1 augustss #define FTDI_GET_LSR(p) ((p)[1])
326 1.1 augustss #define FTDI_LSR_MASK (~0x60) /* interesting bits */
327 1.1 augustss #define FTDI_OUT_TAG(len, port) (((len) << 2) | (port))
328