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