Linux/drivers/usb/serial/ftdi_sio.c
Linux/drivers/usb/serial/ftdi_sio.h /*
2 * Driver definitions for the FTDI USB Single Port Serial Converter -
3 * known as FTDI_SIO (Serial Input/Output application of the chipset)
4 *
5 * For USB vendor/product IDs (VID/PID), please see ftdi_sio_ids.h
6 *
7 *
8 * The example I have is known as the USC-1000 which is available from
9 * http://www.dse.co.nz - cat no XH4214 It looks similar to this:
10 * http://www.dansdata.com/usbser.htm but I can't be sure There are other
11 * USC-1000s which don't look like my device though so beware!
12 *
13 * The device is based on the FTDI FT8U100AX chip. It has a DB25 on one side,
14 * USB on the other.
15 *
16 * Thanx to FTDI (http://www.ftdichip.com) for so kindly providing details
17 * of the protocol required to talk to the device and ongoing assistence
18 * during development.
19 *
20 * Bill Ryder - bryder@sgi.com formerly of Silicon Graphics, Inc.- wrote the
21 * FTDI_SIO implementation.
22 *
23 */ /* Commands */
#define FTDI_SIO_RESET 0 /* Reset the port */
#define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */
#define FTDI_SIO_SET_FLOW_CTRL 2 /* Set flow control register */
#define FTDI_SIO_SET_BAUD_RATE 3 /* Set baud rate */
#define FTDI_SIO_SET_DATA 4 /* Set the data characteristics of
the port */
#define FTDI_SIO_GET_MODEM_STATUS 5 /* Retrieve current value of modem
status register */
#define FTDI_SIO_SET_EVENT_CHAR 6 /* Set the event character */
#define FTDI_SIO_SET_ERROR_CHAR 7 /* Set the error character */
#define FTDI_SIO_SET_LATENCY_TIMER 9 /* Set the latency timer */
#define FTDI_SIO_GET_LATENCY_TIMER 10 /* Get the latency timer */ /* Interface indices for FT2232, FT2232H and FT4232H devices */
#define INTERFACE_A 1
#define INTERFACE_B 2
#define INTERFACE_C 3
#define INTERFACE_D 4 /*
47 * BmRequestType: 1100 0000b
48 * bRequest: FTDI_E2_READ
49 * wValue: 0
50 * wIndex: Address of word to read
51 * wLength: 2
52 * Data: Will return a word of data from E2Address
53 *
54 */ /* Port Identifier Table */
#define PIT_DEFAULT 0 /* SIOA */
#define PIT_SIOA 1 /* SIOA */
/* The device this driver is tested with one has only one port */
#define PIT_SIOB 2 /* SIOB */
#define PIT_PARALLEL 3 /* Parallel */ /* FTDI_SIO_RESET */
#define FTDI_SIO_RESET_REQUEST FTDI_SIO_RESET
#define FTDI_SIO_RESET_REQUEST_TYPE 0x40
#define FTDI_SIO_RESET_SIO 0
#define FTDI_SIO_RESET_PURGE_RX 1
#define FTDI_SIO_RESET_PURGE_TX 2 /*
71 * BmRequestType: 0100 0000B
72 * bRequest: FTDI_SIO_RESET
73 * wValue: Control Value
74 * 0 = Reset SIO
75 * 1 = Purge RX buffer
76 * 2 = Purge TX buffer
77 * wIndex: Port
78 * wLength: 0
79 * Data: None
80 *
81 * The Reset SIO command has this effect:
82 *
83 * Sets flow control set to 'none'
84 * Event char = $0D
85 * Event trigger = disabled
86 * Purge RX buffer
87 * Purge TX buffer
88 * Clear DTR
89 * Clear RTS
90 * baud and data format not reset
91 *
92 * The Purge RX and TX buffer commands affect nothing except the buffers
93 *
94 */ /* FTDI_SIO_SET_BAUDRATE */
#define FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE 0x40
#define FTDI_SIO_SET_BAUDRATE_REQUEST 3 /*
101 * BmRequestType: 0100 0000B
102 * bRequest: FTDI_SIO_SET_BAUDRATE
103 * wValue: BaudDivisor value - see below
104 * wIndex: Port
105 * wLength: 0
106 * Data: None
107 * The BaudDivisor values are calculated as follows:
108 * - BaseClock is either 12000000 or 48000000 depending on the device.
109 * FIXME: I wish I knew how to detect old chips to select proper base clock!
110 * - BaudDivisor is a fixed point number encoded in a funny way.
111 * (--WRONG WAY OF THINKING--)
112 * BaudDivisor is a fixed point number encoded with following bit weighs:
113 * (-2)(-1)(13..0). It is a radical with a denominator of 4, so values
114 * end with 0.0 (00...), 0.25 (10...), 0.5 (01...), and 0.75 (11...).
115 * (--THE REALITY--)
116 * The both-bits-set has quite different meaning from 0.75 - the chip
117 * designers have decided it to mean 0.125 instead of 0.75.
118 * This info looked up in FTDI application note "FT8U232 DEVICES \ Data Rates
119 * and Flow Control Consideration for USB to RS232".
120 * - BaudDivisor = (BaseClock / 16) / BaudRate, where the (=) operation should
121 * automagically re-encode the resulting value to take fractions into
122 * consideration.
123 * As all values are integers, some bit twiddling is in order:
124 * BaudDivisor = (BaseClock / 16 / BaudRate) |
125 * (((BaseClock / 2 / BaudRate) & 4) ? 0x4000 // 0.5
126 * : ((BaseClock / 2 / BaudRate) & 2) ? 0x8000 // 0.25
127 * : ((BaseClock / 2 / BaudRate) & 1) ? 0xc000 // 0.125
128 * : 0)
129 *
130 * For the FT232BM, a 17th divisor bit was introduced to encode the multiples
131 * of 0.125 missing from the FT8U232AM. Bits 16 to 14 are coded as follows
132 * (the first four codes are the same as for the FT8U232AM, where bit 16 is
133 * always 0):
134 * 000 - add .000 to divisor
135 * 001 - add .500 to divisor
136 * 010 - add .250 to divisor
137 * 011 - add .125 to divisor
138 * 100 - add .375 to divisor
139 * 101 - add .625 to divisor
140 * 110 - add .750 to divisor
141 * 111 - add .875 to divisor
142 * Bits 15 to 0 of the 17-bit divisor are placed in the urb value. Bit 16 is
143 * placed in bit 0 of the urb index.
144 *
145 * Note that there are a couple of special cases to support the highest baud
146 * rates. If the calculated divisor value is 1, this needs to be replaced with
147 * 0. Additionally for the FT232BM, if the calculated divisor value is 0x4001
148 * (1.5), this needs to be replaced with 0x0001 (1) (but this divisor value is
149 * not supported by the FT8U232AM).
150 */ enum ftdi_chip_type {
SIO = ,
FT8U232AM = ,
FT232BM = ,
FT2232C = ,
FT232RL = ,
FT2232H = ,
FT4232H = ,
FT232H = ,
FTX = ,
}; enum ftdi_sio_baudrate {
ftdi_sio_b300 = ,
ftdi_sio_b600 = ,
ftdi_sio_b1200 = ,
ftdi_sio_b2400 = ,
ftdi_sio_b4800 = ,
ftdi_sio_b9600 = ,
ftdi_sio_b19200 = ,
ftdi_sio_b38400 = ,
ftdi_sio_b57600 = ,
ftdi_sio_b115200 =
}; /*
178 * The ftdi_8U232AM_xxMHz_byyy constants have been removed. The encoded divisor
179 * values are calculated internally.
180 */
#define FTDI_SIO_SET_DATA_REQUEST FTDI_SIO_SET_DATA
#define FTDI_SIO_SET_DATA_REQUEST_TYPE 0x40
#define FTDI_SIO_SET_DATA_PARITY_NONE (0x0 << 8)
#define FTDI_SIO_SET_DATA_PARITY_ODD (0x1 << 8)
#define FTDI_SIO_SET_DATA_PARITY_EVEN (0x2 << 8)
#define FTDI_SIO_SET_DATA_PARITY_MARK (0x3 << 8)
#define FTDI_SIO_SET_DATA_PARITY_SPACE (0x4 << 8)
#define FTDI_SIO_SET_DATA_STOP_BITS_1 (0x0 << 11)
#define FTDI_SIO_SET_DATA_STOP_BITS_15 (0x1 << 11)
#define FTDI_SIO_SET_DATA_STOP_BITS_2 (0x2 << 11)
#define FTDI_SIO_SET_BREAK (0x1 << 14)
/* FTDI_SIO_SET_DATA */ /*
195 * BmRequestType: 0100 0000B
196 * bRequest: FTDI_SIO_SET_DATA
197 * wValue: Data characteristics (see below)
198 * wIndex: Port
199 * wLength: 0
200 * Data: No
201 *
202 * Data characteristics
203 *
204 * B0..7 Number of data bits
205 * B8..10 Parity
206 * 0 = None
207 * 1 = Odd
208 * 2 = Even
209 * 3 = Mark
210 * 4 = Space
211 * B11..13 Stop Bits
212 * 0 = 1
213 * 1 = 1.5
214 * 2 = 2
215 * B14
216 * 1 = TX ON (break)
217 * 0 = TX OFF (normal state)
218 * B15 Reserved
219 *
220 */ /* FTDI_SIO_MODEM_CTRL */
#define FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE 0x40
#define FTDI_SIO_SET_MODEM_CTRL_REQUEST FTDI_SIO_MODEM_CTRL /*
229 * BmRequestType: 0100 0000B
230 * bRequest: FTDI_SIO_MODEM_CTRL
231 * wValue: ControlValue (see below)
232 * wIndex: Port
233 * wLength: 0
234 * Data: None
235 *
236 * NOTE: If the device is in RTS/CTS flow control, the RTS set by this
237 * command will be IGNORED without an error being returned
238 * Also - you can not set DTR and RTS with one control message
239 */ #define FTDI_SIO_SET_DTR_MASK 0x1
#define FTDI_SIO_SET_DTR_HIGH (1 | (FTDI_SIO_SET_DTR_MASK << 8))
#define FTDI_SIO_SET_DTR_LOW (0 | (FTDI_SIO_SET_DTR_MASK << 8))
#define FTDI_SIO_SET_RTS_MASK 0x2
#define FTDI_SIO_SET_RTS_HIGH (2 | (FTDI_SIO_SET_RTS_MASK << 8))
#define FTDI_SIO_SET_RTS_LOW (0 | (FTDI_SIO_SET_RTS_MASK << 8)) /*
249 * ControlValue
250 * B0 DTR state
251 * 0 = reset
252 * 1 = set
253 * B1 RTS state
254 * 0 = reset
255 * 1 = set
256 * B2..7 Reserved
257 * B8 DTR state enable
258 * 0 = ignore
259 * 1 = use DTR state
260 * B9 RTS state enable
261 * 0 = ignore
262 * 1 = use RTS state
263 * B10..15 Reserved
264 */ /* FTDI_SIO_SET_FLOW_CTRL */
#define FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE 0x40
#define FTDI_SIO_SET_FLOW_CTRL_REQUEST FTDI_SIO_SET_FLOW_CTRL
#define FTDI_SIO_DISABLE_FLOW_CTRL 0x0
#define FTDI_SIO_RTS_CTS_HS (0x1 << 8)
#define FTDI_SIO_DTR_DSR_HS (0x2 << 8)
#define FTDI_SIO_XON_XOFF_HS (0x4 << 8)
/*
274 * BmRequestType: 0100 0000b
275 * bRequest: FTDI_SIO_SET_FLOW_CTRL
276 * wValue: Xoff/Xon
277 * wIndex: Protocol/Port - hIndex is protocol / lIndex is port
278 * wLength: 0
279 * Data: None
280 *
281 * hIndex protocol is:
282 * B0 Output handshaking using RTS/CTS
283 * 0 = disabled
284 * 1 = enabled
285 * B1 Output handshaking using DTR/DSR
286 * 0 = disabled
287 * 1 = enabled
288 * B2 Xon/Xoff handshaking
289 * 0 = disabled
290 * 1 = enabled
291 *
292 * A value of zero in the hIndex field disables handshaking
293 *
294 * If Xon/Xoff handshaking is specified, the hValue field should contain the
295 * XOFF character and the lValue field contains the XON character.
296 */ /*
299 * FTDI_SIO_GET_LATENCY_TIMER
300 *
301 * Set the timeout interval. The FTDI collects data from the slave
302 * device, transmitting it to the host when either A) 62 bytes are
303 * received, or B) the timeout interval has elapsed and the buffer
304 * contains at least 1 byte. Setting this value to a small number
305 * can dramatically improve performance for applications which send
306 * small packets, since the default value is 16ms.
307 */
#define FTDI_SIO_GET_LATENCY_TIMER_REQUEST FTDI_SIO_GET_LATENCY_TIMER
#define FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE 0xC0 /*
312 * BmRequestType: 1100 0000b
313 * bRequest: FTDI_SIO_GET_LATENCY_TIMER
314 * wValue: 0
315 * wIndex: Port
316 * wLength: 0
317 * Data: latency (on return)
318 */ /*
321 * FTDI_SIO_SET_LATENCY_TIMER
322 *
323 * Set the timeout interval. The FTDI collects data from the slave
324 * device, transmitting it to the host when either A) 62 bytes are
325 * received, or B) the timeout interval has elapsed and the buffer
326 * contains at least 1 byte. Setting this value to a small number
327 * can dramatically improve performance for applications which send
328 * small packets, since the default value is 16ms.
329 */
#define FTDI_SIO_SET_LATENCY_TIMER_REQUEST FTDI_SIO_SET_LATENCY_TIMER
#define FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE 0x40 /*
334 * BmRequestType: 0100 0000b
335 * bRequest: FTDI_SIO_SET_LATENCY_TIMER
336 * wValue: Latency (milliseconds)
337 * wIndex: Port
338 * wLength: 0
339 * Data: None
340 *
341 * wValue:
342 * B0..7 Latency timer
343 * B8..15 0
344 *
345 */ /*
348 * FTDI_SIO_SET_EVENT_CHAR
349 *
350 * Set the special event character for the specified communications port.
351 * If the device sees this character it will immediately return the
352 * data read so far - rather than wait 40ms or until 62 bytes are read
353 * which is what normally happens.
354 */ #define FTDI_SIO_SET_EVENT_CHAR_REQUEST FTDI_SIO_SET_EVENT_CHAR
#define FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE 0x40 /*
362 * BmRequestType: 0100 0000b
363 * bRequest: FTDI_SIO_SET_EVENT_CHAR
364 * wValue: EventChar
365 * wIndex: Port
366 * wLength: 0
367 * Data: None
368 *
369 * wValue:
370 * B0..7 Event Character
371 * B8 Event Character Processing
372 * 0 = disabled
373 * 1 = enabled
374 * B9..15 Reserved
375 *
376 */ /* FTDI_SIO_SET_ERROR_CHAR */ /*
381 * Set the parity error replacement character for the specified communications
382 * port
383 */ /*
386 * BmRequestType: 0100 0000b
387 * bRequest: FTDI_SIO_SET_EVENT_CHAR
388 * wValue: Error Char
389 * wIndex: Port
390 * wLength: 0
391 * Data: None
392 *
393 *Error Char
394 * B0..7 Error Character
395 * B8 Error Character Processing
396 * 0 = disabled
397 * 1 = enabled
398 * B9..15 Reserved
399 *
400 */ /* FTDI_SIO_GET_MODEM_STATUS */
/* Retrieve the current value of the modem status register */ #define FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE 0xc0
#define FTDI_SIO_GET_MODEM_STATUS_REQUEST FTDI_SIO_GET_MODEM_STATUS
#define FTDI_SIO_CTS_MASK 0x10
#define FTDI_SIO_DSR_MASK 0x20
#define FTDI_SIO_RI_MASK 0x40
#define FTDI_SIO_RLSD_MASK 0x80
/*
412 * BmRequestType: 1100 0000b
413 * bRequest: FTDI_SIO_GET_MODEM_STATUS
414 * wValue: zero
415 * wIndex: Port
416 * wLength: 1
417 * Data: Status
418 *
419 * One byte of data is returned
420 * B0..3 0
421 * B4 CTS
422 * 0 = inactive
423 * 1 = active
424 * B5 DSR
425 * 0 = inactive
426 * 1 = active
427 * B6 Ring Indicator (RI)
428 * 0 = inactive
429 * 1 = active
430 * B7 Receive Line Signal Detect (RLSD)
431 * 0 = inactive
432 * 1 = active
433 */ /* Descriptors returned by the device
438 *
439 * Device Descriptor
440 *
441 * Offset Field Size Value Description
442 * 0 bLength 1 0x12 Size of descriptor in bytes
443 * 1 bDescriptorType 1 0x01 DEVICE Descriptor Type
444 * 2 bcdUSB 2 0x0110 USB Spec Release Number
445 * 4 bDeviceClass 1 0x00 Class Code
446 * 5 bDeviceSubClass 1 0x00 SubClass Code
447 * 6 bDeviceProtocol 1 0x00 Protocol Code
448 * 7 bMaxPacketSize0 1 0x08 Maximum packet size for endpoint 0
449 * 8 idVendor 2 0x0403 Vendor ID
450 * 10 idProduct 2 0x8372 Product ID (FTDI_SIO_PID)
451 * 12 bcdDevice 2 0x0001 Device release number
452 * 14 iManufacturer 1 0x01 Index of man. string desc
453 * 15 iProduct 1 0x02 Index of prod string desc
454 * 16 iSerialNumber 1 0x02 Index of serial nmr string desc
455 * 17 bNumConfigurations 1 0x01 Number of possible configurations
456 *
457 * Configuration Descriptor
458 *
459 * Offset Field Size Value
460 * 0 bLength 1 0x09 Size of descriptor in bytes
461 * 1 bDescriptorType 1 0x02 CONFIGURATION Descriptor Type
462 * 2 wTotalLength 2 0x0020 Total length of data
463 * 4 bNumInterfaces 1 0x01 Number of interfaces supported
464 * 5 bConfigurationValue 1 0x01 Argument for SetCOnfiguration() req
465 * 6 iConfiguration 1 0x02 Index of config string descriptor
466 * 7 bmAttributes 1 0x20 Config characteristics Remote Wakeup
467 * 8 MaxPower 1 0x1E Max power consumption
468 *
469 * Interface Descriptor
470 *
471 * Offset Field Size Value
472 * 0 bLength 1 0x09 Size of descriptor in bytes
473 * 1 bDescriptorType 1 0x04 INTERFACE Descriptor Type
474 * 2 bInterfaceNumber 1 0x00 Number of interface
475 * 3 bAlternateSetting 1 0x00 Value used to select alternate
476 * 4 bNumEndpoints 1 0x02 Number of endpoints
477 * 5 bInterfaceClass 1 0xFF Class Code
478 * 6 bInterfaceSubClass 1 0xFF Subclass Code
479 * 7 bInterfaceProtocol 1 0xFF Protocol Code
480 * 8 iInterface 1 0x02 Index of interface string description
481 *
482 * IN Endpoint Descriptor
483 *
484 * Offset Field Size Value
485 * 0 bLength 1 0x07 Size of descriptor in bytes
486 * 1 bDescriptorType 1 0x05 ENDPOINT descriptor type
487 * 2 bEndpointAddress 1 0x82 Address of endpoint
488 * 3 bmAttributes 1 0x02 Endpoint attributes - Bulk
489 * 4 bNumEndpoints 2 0x0040 maximum packet size
490 * 5 bInterval 1 0x00 Interval for polling endpoint
491 *
492 * OUT Endpoint Descriptor
493 *
494 * Offset Field Size Value
495 * 0 bLength 1 0x07 Size of descriptor in bytes
496 * 1 bDescriptorType 1 0x05 ENDPOINT descriptor type
497 * 2 bEndpointAddress 1 0x02 Address of endpoint
498 * 3 bmAttributes 1 0x02 Endpoint attributes - Bulk
499 * 4 bNumEndpoints 2 0x0040 maximum packet size
500 * 5 bInterval 1 0x00 Interval for polling endpoint
501 *
502 * DATA FORMAT
503 *
504 * IN Endpoint
505 *
506 * The device reserves the first two bytes of data on this endpoint to contain
507 * the current values of the modem and line status registers. In the absence of
508 * data, the device generates a message consisting of these two status bytes
509 * every 40 ms
510 *
511 * Byte 0: Modem Status
512 *
513 * Offset Description
514 * B0 Reserved - must be 1
515 * B1 Reserved - must be 0
516 * B2 Reserved - must be 0
517 * B3 Reserved - must be 0
518 * B4 Clear to Send (CTS)
519 * B5 Data Set Ready (DSR)
520 * B6 Ring Indicator (RI)
521 * B7 Receive Line Signal Detect (RLSD)
522 *
523 * Byte 1: Line Status
524 *
525 * Offset Description
526 * B0 Data Ready (DR)
527 * B1 Overrun Error (OE)
528 * B2 Parity Error (PE)
529 * B3 Framing Error (FE)
530 * B4 Break Interrupt (BI)
531 * B5 Transmitter Holding Register (THRE)
532 * B6 Transmitter Empty (TEMT)
533 * B7 Error in RCVR FIFO
534 *
535 */
#define FTDI_RS0_CTS (1 << 4)
#define FTDI_RS0_DSR (1 << 5)
#define FTDI_RS0_RI (1 << 6)
#define FTDI_RS0_RLSD (1 << 7) #define FTDI_RS_DR 1
#define FTDI_RS_OE (1<<1)
#define FTDI_RS_PE (1<<2)
#define FTDI_RS_FE (1<<3)
#define FTDI_RS_BI (1<<4)
#define FTDI_RS_THRE (1<<5)
#define FTDI_RS_TEMT (1<<6)
#define FTDI_RS_FIFO (1<<7) /*
551 * OUT Endpoint
552 *
553 * This device reserves the first bytes of data on this endpoint contain the
554 * length and port identifier of the message. For the FTDI USB Serial converter
555 * the port identifier is always 1.
556 *
557 * Byte 0: Line Status
558 *
559 * Offset Description
560 * B0 Reserved - must be 1
561 * B1 Reserved - must be 0
562 * B2..7 Length of message - (not including Byte 0)
563 *
564 */
Linux/drivers/usb/serial/ftdi_sio_ids.h /*
2 * vendor/product IDs (VID/PID) of devices using FTDI USB serial converters.
3 * Please keep numerically sorted within individual areas, thanks!
4 *
5 * Philipp Gühring - pg@futureware.at - added the Device ID of the USB relais
6 * from Rudolf Gugler
7 *
8 */ /**********************************/
/***** devices using FTDI VID *****/
/**********************************/ #define FTDI_VID 0x0403 /* Vendor Id */ /*** "original" FTDI device PIDs ***/ #define FTDI_8U232AM_PID 0x6001 /* Similar device to SIO above */
#define FTDI_8U232AM_ALT_PID 0x6006 /* FTDI's alternate PID for above */
#define FTDI_8U2232C_PID 0x6010 /* Dual channel device */
#define FTDI_4232H_PID 0x6011 /* Quad channel hi-speed device */
#define FTDI_232H_PID 0x6014 /* Single channel hi-speed device */
#define FTDI_FTX_PID 0x6015 /* FT-X series (FT201X, FT230X, FT231X, etc) */
#define FTDI_SIO_PID 0x8372 /* Product Id SIO application of 8U100AX */
#define FTDI_232RL_PID 0xFBFA /* Product ID for FT232RL */ /*** third-party PIDs (using FTDI_VID) ***/ #define FTDI_LUMEL_PD12_PID 0x6002 /*
36 * Marvell OpenRD Base, Client
37 * http://www.open-rd.org
38 * OpenRD Base, Client use VID 0x0403
39 */
#define MARVELL_OPENRD_PID 0x9e90 /* www.candapter.com Ewert Energy Systems CANdapter device */
#define FTDI_CANDAPTER_PID 0x9F80 /* Product Id */ #define FTDI_BM_ATOM_NANO_PID 0xa559 /* Basic Micro ATOM Nano USB2Serial */ /*
48 * Texas Instruments XDS100v2 JTAG / BeagleBone A3
49 * http://processors.wiki.ti.com/index.php/XDS100
50 * http://beagleboard.org/bone
51 */
#define TI_XDS100V2_PID 0xa6d0 #define FTDI_NXTCAM_PID 0xABB8 /* NXTCam for Mindstorms NXT */
#define FTDI_EV3CON_PID 0xABB9 /* Mindstorms EV3 Console Adapter */ /* US Interface Navigator (http://www.usinterface.com/) */
#define FTDI_USINT_CAT_PID 0xb810 /* Navigator CAT and 2nd PTT lines */
#define FTDI_USINT_WKEY_PID 0xb811 /* Navigator WKEY and FSK lines */
#define FTDI_USINT_RS232_PID 0xb812 /* Navigator RS232 and CONFIG lines */ /* OOCDlink by Joern Kaipf <joernk@web.de>
63 * (http://www.joernonline.de/) */
#define FTDI_OOCDLINK_PID 0xbaf8 /* Amontec JTAGkey */ /* Luminary Micro Stellaris Boards, VID = FTDI_VID */
/* FTDI 2332C Dual channel device, side A=245 FIFO (JTAG), Side B=RS232 UART */
#define LMI_LM3S_DEVEL_BOARD_PID 0xbcd8
#define LMI_LM3S_EVAL_BOARD_PID 0xbcd9
#define LMI_LM3S_ICDI_BOARD_PID 0xbcda #define FTDI_TURTELIZER_PID 0xBDC8 /* JTAG/RS-232 adapter by egnite GmbH */ /* OpenDCC (www.opendcc.de) product id */
#define FTDI_OPENDCC_PID 0xBFD8
#define FTDI_OPENDCC_SNIFFER_PID 0xBFD9
#define FTDI_OPENDCC_THROTTLE_PID 0xBFDA
#define FTDI_OPENDCC_GATEWAY_PID 0xBFDB
#define FTDI_OPENDCC_GBM_PID 0xBFDC
#define FTDI_OPENDCC_GBM_BOOST_PID 0xBFDD /* NZR SEM 16+ USB (http://www.nzr.de) */
#define FTDI_NZR_SEM_USB_PID 0xC1E0 /* NZR SEM-LOG16+ */ /*
86 * RR-CirKits LocoBuffer USB (http://www.rr-cirkits.com)
87 */
#define FTDI_RRCIRKITS_LOCOBUFFER_PID 0xc7d0 /* LocoBuffer USB */ /* DMX4ALL DMX Interfaces */
#define FTDI_DMX4ALL 0xC850 /*
94 * ASK.fr devices
95 */
#define FTDI_ASK_RDR400_PID 0xC991 /* ASK RDR 400 series card reader */ /* www.starting-point-systems.com µChameleon device */
#define FTDI_MICRO_CHAMELEON_PID 0xCAA0 /* Product Id */ /*
102 * Tactrix OpenPort (ECU) devices.
103 * OpenPort 1.3M submitted by Donour Sizemore.
104 * OpenPort 1.3S and 1.3U submitted by Ian Abbott.
105 */
#define FTDI_TACTRIX_OPENPORT_13M_PID 0xCC48 /* OpenPort 1.3 Mitsubishi */
#define FTDI_TACTRIX_OPENPORT_13S_PID 0xCC49 /* OpenPort 1.3 Subaru */
#define FTDI_TACTRIX_OPENPORT_13U_PID 0xCC4A /* OpenPort 1.3 Universal */ #define FTDI_DISTORTEC_JTAG_LOCK_PICK_PID 0xCFF8 /* SCS HF Radio Modems PID's (http://www.scs-ptc.com) */
/* the VID is the standard ftdi vid (FTDI_VID) */
#define FTDI_SCS_DEVICE_0_PID 0xD010 /* SCS PTC-IIusb */
#define FTDI_SCS_DEVICE_1_PID 0xD011 /* SCS Tracker / DSP TNC */
#define FTDI_SCS_DEVICE_2_PID 0xD012
#define FTDI_SCS_DEVICE_3_PID 0xD013
#define FTDI_SCS_DEVICE_4_PID 0xD014
#define FTDI_SCS_DEVICE_5_PID 0xD015
#define FTDI_SCS_DEVICE_6_PID 0xD016
#define FTDI_SCS_DEVICE_7_PID 0xD017 /* iPlus device */
#define FTDI_IPLUS_PID 0xD070 /* Product Id */
#define FTDI_IPLUS2_PID 0xD071 /* Product Id */ /*
128 * Gamma Scout (http://gamma-scout.com/). Submitted by rsc@runtux.com.
129 */
#define FTDI_GAMMA_SCOUT_PID 0xD678 /* Gamma Scout online */ /* Propox devices */
#define FTDI_PROPOX_JTAGCABLEII_PID 0xD738
#define FTDI_PROPOX_ISPCABLEIII_PID 0xD739 /* Lenz LI-USB Computer Interface. */
#define FTDI_LENZ_LIUSB_PID 0xD780 /* Vardaan Enterprises Serial Interface VEUSB422R3 */
#define FTDI_VARDAAN_PID 0xF070 /*
143 * Xsens Technologies BV products (http://www.xsens.com).
144 */
#define XSENS_VID 0x2639
#define XSENS_CONVERTER_PID 0xD00D /* Xsens USB-serial converter */
#define XSENS_MTW_PID 0x0200 /* Xsens MTw */
#define XSENS_CONVERTER_0_PID 0xD388 /* Xsens USB converter */
#define XSENS_CONVERTER_1_PID 0xD389 /* Xsens Wireless Receiver */
#define XSENS_CONVERTER_2_PID 0xD38A
#define XSENS_CONVERTER_3_PID 0xD38B /* Xsens USB-serial converter */
#define XSENS_CONVERTER_4_PID 0xD38C /* Xsens Wireless Receiver */
#define XSENS_CONVERTER_5_PID 0xD38D /* Xsens Awinda Station */
#define XSENS_CONVERTER_6_PID 0xD38E
#define XSENS_CONVERTER_7_PID 0xD38F /**
158 * Zolix (www.zolix.com.cb) product ids
159 */
#define FTDI_OMNI1509 0xD491 /* Omni1509 embedded USB-serial */ /*
163 * NDI (www.ndigital.com) product ids
164 */
#define FTDI_NDI_HUC_PID 0xDA70 /* NDI Host USB Converter */
#define FTDI_NDI_SPECTRA_SCU_PID 0xDA71 /* NDI Spectra SCU */
#define FTDI_NDI_FUTURE_2_PID 0xDA72 /* NDI future device #2 */
#define FTDI_NDI_FUTURE_3_PID 0xDA73 /* NDI future device #3 */
#define FTDI_NDI_AURORA_SCU_PID 0xDA74 /* NDI Aurora SCU */ /*
172 * ChamSys Limited (www.chamsys.co.uk) USB wing/interface product IDs
173 */
#define FTDI_CHAMSYS_24_MASTER_WING_PID 0xDAF8
#define FTDI_CHAMSYS_PC_WING_PID 0xDAF9
#define FTDI_CHAMSYS_USB_DMX_PID 0xDAFA
#define FTDI_CHAMSYS_MIDI_TIMECODE_PID 0xDAFB
#define FTDI_CHAMSYS_MINI_WING_PID 0xDAFC
#define FTDI_CHAMSYS_MAXI_WING_PID 0xDAFD
#define FTDI_CHAMSYS_MEDIA_WING_PID 0xDAFE
#define FTDI_CHAMSYS_WING_PID 0xDAFF /*
184 * Westrex International devices submitted by Cory Lee
185 */
#define FTDI_WESTREX_MODEL_777_PID 0xDC00 /* Model 777 */
#define FTDI_WESTREX_MODEL_8900F_PID 0xDC01 /* Model 8900F */ /*
190 * ACG Identification Technologies GmbH products (http://www.acg.de/).
191 * Submitted by anton -at- goto10 -dot- org.
192 */
#define FTDI_ACG_HFDUAL_PID 0xDD20 /* HF Dual ISO Reader (RFID) */ /*
196 * Definitions for Artemis astronomical USB based cameras
197 * Check it at http://www.artemisccd.co.uk/
198 */
#define FTDI_ARTEMIS_PID 0xDF28 /* All Artemis Cameras */ /*
202 * Definitions for ATIK Instruments astronomical USB based cameras
203 * Check it at http://www.atik-instruments.com/
204 */
#define FTDI_ATIK_ATK16_PID 0xDF30 /* ATIK ATK-16 Grayscale Camera */
#define FTDI_ATIK_ATK16C_PID 0xDF32 /* ATIK ATK-16C Colour Camera */
#define FTDI_ATIK_ATK16HR_PID 0xDF31 /* ATIK ATK-16HR Grayscale Camera */
#define FTDI_ATIK_ATK16HRC_PID 0xDF33 /* ATIK ATK-16HRC Colour Camera */
#define FTDI_ATIK_ATK16IC_PID 0xDF35 /* ATIK ATK-16IC Grayscale Camera */ /*
212 * Yost Engineering, Inc. products (www.yostengineering.com).
213 * PID 0xE050 submitted by Aaron Prose.
214 */
#define FTDI_YEI_SERVOCENTER31_PID 0xE050 /* YEI ServoCenter3.1 USB */ /*
218 * ELV USB devices submitted by Christian Abt of ELV (www.elv.de).
219 * Almost all of these devices use FTDI's vendor ID (0x0403).
220 * Further IDs taken from ELV Windows .inf file.
221 *
222 * The previously included PID for the UO 100 module was incorrect.
223 * In fact, that PID was for ELV's UR 100 USB-RS232 converter (0xFB58).
224 *
225 * Armin Laeuger originally sent the PID for the UM 100 module.
226 */
#define FTDI_ELV_VID 0x1B1F /* ELV AG */
#define FTDI_ELV_WS300_PID 0xC006 /* eQ3 WS 300 PC II */
#define FTDI_ELV_USR_PID 0xE000 /* ELV Universal-Sound-Recorder */
#define FTDI_ELV_MSM1_PID 0xE001 /* ELV Mini-Sound-Modul */
#define FTDI_ELV_KL100_PID 0xE002 /* ELV Kfz-Leistungsmesser KL 100 */
#define FTDI_ELV_WS550_PID 0xE004 /* WS 550 */
#define FTDI_ELV_EC3000_PID 0xE006 /* ENERGY CONTROL 3000 USB */
#define FTDI_ELV_WS888_PID 0xE008 /* WS 888 */
#define FTDI_ELV_TWS550_PID 0xE009 /* Technoline WS 550 */
#define FTDI_ELV_FEM_PID 0xE00A /* Funk Energie Monitor */
#define FTDI_ELV_FHZ1300PC_PID 0xE0E8 /* FHZ 1300 PC */
#define FTDI_ELV_WS500_PID 0xE0E9 /* PC-Wetterstation (WS 500) */
#define FTDI_ELV_HS485_PID 0xE0EA /* USB to RS-485 adapter */
#define FTDI_ELV_UMS100_PID 0xE0EB /* ELV USB Master-Slave Schaltsteckdose UMS 100 */
#define FTDI_ELV_TFD128_PID 0xE0EC /* ELV Temperatur-Feuchte-Datenlogger TFD 128 */
#define FTDI_ELV_FM3RX_PID 0xE0ED /* ELV Messwertuebertragung FM3 RX */
#define FTDI_ELV_WS777_PID 0xE0EE /* Conrad WS 777 */
#define FTDI_ELV_EM1010PC_PID 0xE0EF /* Energy monitor EM 1010 PC */
#define FTDI_ELV_CSI8_PID 0xE0F0 /* Computer-Schalt-Interface (CSI 8) */
#define FTDI_ELV_EM1000DL_PID 0xE0F1 /* PC-Datenlogger fuer Energiemonitor (EM 1000 DL) */
#define FTDI_ELV_PCK100_PID 0xE0F2 /* PC-Kabeltester (PCK 100) */
#define FTDI_ELV_RFP500_PID 0xE0F3 /* HF-Leistungsmesser (RFP 500) */
#define FTDI_ELV_FS20SIG_PID 0xE0F4 /* Signalgeber (FS 20 SIG) */
#define FTDI_ELV_UTP8_PID 0xE0F5 /* ELV UTP 8 */
#define FTDI_ELV_WS300PC_PID 0xE0F6 /* PC-Wetterstation (WS 300 PC) */
#define FTDI_ELV_WS444PC_PID 0xE0F7 /* Conrad WS 444 PC */
#define FTDI_PHI_FISCO_PID 0xE40B /* PHI Fisco USB to Serial cable */
#define FTDI_ELV_UAD8_PID 0xF068 /* USB-AD-Wandler (UAD 8) */
#define FTDI_ELV_UDA7_PID 0xF069 /* USB-DA-Wandler (UDA 7) */
#define FTDI_ELV_USI2_PID 0xF06A /* USB-Schrittmotoren-Interface (USI 2) */
#define FTDI_ELV_T1100_PID 0xF06B /* Thermometer (T 1100) */
#define FTDI_ELV_PCD200_PID 0xF06C /* PC-Datenlogger (PCD 200) */
#define FTDI_ELV_ULA200_PID 0xF06D /* USB-LCD-Ansteuerung (ULA 200) */
#define FTDI_ELV_ALC8500_PID 0xF06E /* ALC 8500 Expert */
#define FTDI_ELV_FHZ1000PC_PID 0xF06F /* FHZ 1000 PC */
#define FTDI_ELV_UR100_PID 0xFB58 /* USB-RS232-Umsetzer (UR 100) */
#define FTDI_ELV_UM100_PID 0xFB5A /* USB-Modul UM 100 */
#define FTDI_ELV_UO100_PID 0xFB5B /* USB-Modul UO 100 */
/* Additional ELV PIDs that default to using the FTDI D2XX drivers on
266 * MS Windows, rather than the FTDI Virtual Com Port drivers.
267 * Maybe these will be easier to use with the libftdi/libusb user-space
268 * drivers, or possibly the Comedi drivers in some cases. */
#define FTDI_ELV_CLI7000_PID 0xFB59 /* Computer-Light-Interface (CLI 7000) */
#define FTDI_ELV_PPS7330_PID 0xFB5C /* Processor-Power-Supply (PPS 7330) */
#define FTDI_ELV_TFM100_PID 0xFB5D /* Temperatur-Feuchte-Messgeraet (TFM 100) */
#define FTDI_ELV_UDF77_PID 0xFB5E /* USB DCF Funkuhr (UDF 77) */
#define FTDI_ELV_UIO88_PID 0xFB5F /* USB-I/O Interface (UIO 88) */ /*
276 * EVER Eco Pro UPS (http://www.ever.com.pl/)
277 */ #define EVER_ECO_PRO_CDS 0xe520 /* RS-232 converter */ /*
282 * Active Robots product ids.
283 */
#define FTDI_ACTIVE_ROBOTS_PID 0xE548 /* USB comms board */ /* Pyramid Computer GmbH */
#define FTDI_PYRAMID_PID 0xE6C8 /* Pyramid Appliance Display */ /* www.elsterelectricity.com Elster Unicom III Optical Probe */
#define FTDI_ELSTER_UNICOM_PID 0xE700 /* Product Id */ /*
293 * Gude Analog- und Digitalsysteme GmbH
294 */
#define FTDI_GUDEADS_E808_PID 0xE808
#define FTDI_GUDEADS_E809_PID 0xE809
#define FTDI_GUDEADS_E80A_PID 0xE80A
#define FTDI_GUDEADS_E80B_PID 0xE80B
#define FTDI_GUDEADS_E80C_PID 0xE80C
#define FTDI_GUDEADS_E80D_PID 0xE80D
#define FTDI_GUDEADS_E80E_PID 0xE80E
#define FTDI_GUDEADS_E80F_PID 0xE80F
#define FTDI_GUDEADS_E888_PID 0xE888 /* Expert ISDN Control USB */
#define FTDI_GUDEADS_E889_PID 0xE889 /* USB RS-232 OptoBridge */
#define FTDI_GUDEADS_E88A_PID 0xE88A
#define FTDI_GUDEADS_E88B_PID 0xE88B
#define FTDI_GUDEADS_E88C_PID 0xE88C
#define FTDI_GUDEADS_E88D_PID 0xE88D
#define FTDI_GUDEADS_E88E_PID 0xE88E
#define FTDI_GUDEADS_E88F_PID 0xE88F /*
313 * Eclo (http://www.eclo.pt/) product IDs.
314 * PID 0xEA90 submitted by Martin Grill.
315 */
#define FTDI_ECLO_COM_1WIRE_PID 0xEA90 /* COM to 1-Wire USB adaptor */ /* TNC-X USB-to-packet-radio adapter, versions prior to 3.0 (DLP module) */
#define FTDI_TNC_X_PID 0xEBE0 /*
322 * Teratronik product ids.
323 * Submitted by O. Wölfelschneider.
324 */
#define FTDI_TERATRONIK_VCP_PID 0xEC88 /* Teratronik device (preferring VCP driver on windows) */
#define FTDI_TERATRONIK_D2XX_PID 0xEC89 /* Teratronik device (preferring D2XX driver on windows) */ /* Rig Expert Ukraine devices */
#define FTDI_REU_TINY_PID 0xED22 /* RigExpert Tiny */ /*
332 * Hameg HO820 and HO870 interface (using VID 0x0403)
333 */
#define HAMEG_HO820_PID 0xed74
#define HAMEG_HO730_PID 0xed73
#define HAMEG_HO720_PID 0xed72
#define HAMEG_HO870_PID 0xed71 /*
340 * MaxStream devices www.maxstream.net
341 */
#define FTDI_MAXSTREAM_PID 0xEE18 /* Xbee PKG-U Module */ /*
345 * microHAM product IDs (http://www.microham.com).
346 * Submitted by Justin Burket (KL1RL) <zorton@jtan.com>
347 * and Mike Studer (K6EEP) <k6eep@hamsoftware.org>.
348 * Ian Abbott <abbotti@mev.co.uk> added a few more from the driver INF file.
349 */
#define FTDI_MHAM_KW_PID 0xEEE8 /* USB-KW interface */
#define FTDI_MHAM_YS_PID 0xEEE9 /* USB-YS interface */
#define FTDI_MHAM_Y6_PID 0xEEEA /* USB-Y6 interface */
#define FTDI_MHAM_Y8_PID 0xEEEB /* USB-Y8 interface */
#define FTDI_MHAM_IC_PID 0xEEEC /* USB-IC interface */
#define FTDI_MHAM_DB9_PID 0xEEED /* USB-DB9 interface */
#define FTDI_MHAM_RS232_PID 0xEEEE /* USB-RS232 interface */
#define FTDI_MHAM_Y9_PID 0xEEEF /* USB-Y9 interface */ /* Domintell products http://www.domintell.com */
#define FTDI_DOMINTELL_DGQG_PID 0xEF50 /* Master */
#define FTDI_DOMINTELL_DUSB_PID 0xEF51 /* DUSB01 module */ /*
364 * The following are the values for the Perle Systems
365 * UltraPort USB serial converters
366 */
#define FTDI_PERLE_ULTRAPORT_PID 0xF0C0 /* Perle UltraPort Product Id */ /* Sprog II (Andrew Crosland's SprogII DCC interface) */
#define FTDI_SPROG_II 0xF0C8 /*
373 * Two of the Tagsys RFID Readers
374 */
#define FTDI_TAGSYS_LP101_PID 0xF0E9 /* Tagsys L-P101 RFID*/
#define FTDI_TAGSYS_P200X_PID 0xF0EE /* Tagsys Medio P200x RFID*/ /* an infrared receiver for user access control with IR tags */
#define FTDI_PIEGROUP_PID 0xF208 /* Product Id */ /* ACT Solutions HomePro ZWave interface
382 (http://www.act-solutions.com/HomePro-Product-Matrix.html) */
#define FTDI_ACTZWAVE_PID 0xF2D0 /*
386 * 4N-GALAXY.DE PIDs for CAN-USB, USB-RS232, USB-RS422, USB-RS485,
387 * USB-TTY aktiv, USB-TTY passiv. Some PIDs are used by several devices
388 * and I'm not entirely sure which are used by which.
389 */
#define FTDI_4N_GALAXY_DE_1_PID 0xF3C0
#define FTDI_4N_GALAXY_DE_2_PID 0xF3C1
#define FTDI_4N_GALAXY_DE_3_PID 0xF3C2 /*
395 * Linx Technologies product ids
396 */
#define LINX_SDMUSBQSS_PID 0xF448 /* Linx SDM-USB-QS-S */
#define LINX_MASTERDEVEL2_PID 0xF449 /* Linx Master Development 2.0 */
#define LINX_FUTURE_0_PID 0xF44A /* Linx future device */
#define LINX_FUTURE_1_PID 0xF44B /* Linx future device */
#define LINX_FUTURE_2_PID 0xF44C /* Linx future device */ /*
404 * Oceanic product ids
405 */
#define FTDI_OCEANIC_PID 0xF460 /* Oceanic dive instrument */ /*
409 * SUUNTO product ids
410 */
#define FTDI_SUUNTO_SPORTS_PID 0xF680 /* Suunto Sports instrument */ /* USB-UIRT - An infrared receiver and transmitter using the 8U232AM chip */
/* http://www.usbuirt.com/ */
#define FTDI_USB_UIRT_PID 0xF850 /* Product Id */ /* CCS Inc. ICDU/ICDU40 product ID -
418 * the FT232BM is used in an in-circuit-debugger unit for PIC16's/PIC18's */
#define FTDI_CCSICDU20_0_PID 0xF9D0
#define FTDI_CCSICDU40_1_PID 0xF9D1
#define FTDI_CCSMACHX_2_PID 0xF9D2
#define FTDI_CCSLOAD_N_GO_3_PID 0xF9D3
#define FTDI_CCSICDU64_4_PID 0xF9D4
#define FTDI_CCSPRIME8_5_PID 0xF9D5 /*
427 * The following are the values for the Matrix Orbital LCD displays,
428 * which are the FT232BM ( similar to the 8U232AM )
429 */
#define FTDI_MTXORB_0_PID 0xFA00 /* Matrix Orbital Product Id */
#define FTDI_MTXORB_1_PID 0xFA01 /* Matrix Orbital Product Id */
#define FTDI_MTXORB_2_PID 0xFA02 /* Matrix Orbital Product Id */
#define FTDI_MTXORB_3_PID 0xFA03 /* Matrix Orbital Product Id */
#define FTDI_MTXORB_4_PID 0xFA04 /* Matrix Orbital Product Id */
#define FTDI_MTXORB_5_PID 0xFA05 /* Matrix Orbital Product Id */
#define FTDI_MTXORB_6_PID 0xFA06 /* Matrix Orbital Product Id */ /*
439 * Home Electronics (www.home-electro.com) USB gadgets
440 */
#define FTDI_HE_TIRA1_PID 0xFA78 /* Tira-1 IR transceiver */ /* Inside Accesso contactless reader (http://www.insidecontactless.com/) */
#define INSIDE_ACCESSO 0xFAD0 /*
447 * ThorLabs USB motor drivers
448 */
#define FTDI_THORLABS_PID 0xfaf0 /* ThorLabs USB motor drivers */ /*
452 * Protego product ids
453 */
#define PROTEGO_SPECIAL_1 0xFC70 /* special/unknown device */
#define PROTEGO_R2X0 0xFC71 /* R200-USB TRNG unit (R210, R220, and R230) */
#define PROTEGO_SPECIAL_3 0xFC72 /* special/unknown device */
#define PROTEGO_SPECIAL_4 0xFC73 /* special/unknown device */ /*
460 * Sony Ericsson product ids
461 */
#define FTDI_DSS20_PID 0xFC82 /* DSS-20 Sync Station for Sony Ericsson P800 */
#define FTDI_URBAN_0_PID 0xFC8A /* Sony Ericsson Urban, uart #0 */
#define FTDI_URBAN_1_PID 0xFC8B /* Sony Ericsson Urban, uart #1 */ /* www.irtrans.de device */
#define FTDI_IRTRANS_PID 0xFC60 /* Product Id */ /*
470 * RM Michaelides CANview USB (http://www.rmcan.com) (FTDI_VID)
471 * CAN fieldbus interface adapter, added by port GmbH www.port.de)
472 * Ian Abbott changed the macro names for consistency.
473 */
#define FTDI_RM_CANVIEW_PID 0xfd60 /* Product Id */
/* www.thoughttechnology.com/ TT-USB provide with procomp use ftdi_sio */
#define FTDI_TTUSB_PID 0xFF20 /* Product Id */ #define FTDI_USBX_707_PID 0xF857 /* ADSTech IR Blaster USBX-707 (FTDI_VID) */ #define FTDI_RELAIS_PID 0xFA10 /* Relais device from Rudolf Gugler */ /*
483 * PCDJ use ftdi based dj-controllers. The following PID is
484 * for their DAC-2 device http://www.pcdjhardware.com/DAC2.asp
485 * (the VID is the standard ftdi vid (FTDI_VID), PID sent by Wouter Paesen)
486 */
#define FTDI_PCDJ_DAC2_PID 0xFA88 #define FTDI_R2000KU_TRUE_RNG 0xFB80 /* R2000KU TRUE RNG (FTDI_VID) */ /*
492 * DIEBOLD BCS SE923 (FTDI_VID)
493 */
#define DIEBOLD_BCS_SE923_PID 0xfb99 /* www.crystalfontz.com devices
497 * - thanx for providing free devices for evaluation !
498 * they use the ftdi chipset for the USB interface
499 * and the vendor id is the same
500 */
#define FTDI_XF_632_PID 0xFC08 /* 632: 16x2 Character Display */
#define FTDI_XF_634_PID 0xFC09 /* 634: 20x4 Character Display */
#define FTDI_XF_547_PID 0xFC0A /* 547: Two line Display */
#define FTDI_XF_633_PID 0xFC0B /* 633: 16x2 Character Display with Keys */
#define FTDI_XF_631_PID 0xFC0C /* 631: 20x2 Character Display */
#define FTDI_XF_635_PID 0xFC0D /* 635: 20x4 Character Display */
#define FTDI_XF_640_PID 0xFC0E /* 640: Two line Display */
#define FTDI_XF_642_PID 0xFC0F /* 642: Two line Display */ /*
511 * Video Networks Limited / Homechoice in the UK use an ftdi-based device
512 * for their 1Mb broadband internet service. The following PID is exhibited
513 * by the usb device supplied (the VID is the standard ftdi vid (FTDI_VID)
514 */
#define FTDI_VNHCPCUSB_D_PID 0xfe38 /* Product Id */ /* AlphaMicro Components AMC-232USB01 device (FTDI_VID) */
#define FTDI_AMC232_PID 0xFF00 /* Product Id */ /*
521 * IBS elektronik product ids (FTDI_VID)
522 * Submitted by Thomas Schleusener
523 */
#define FTDI_IBS_US485_PID 0xff38 /* IBS US485 (USB<-->RS422/485 interface) */
#define FTDI_IBS_PICPRO_PID 0xff39 /* IBS PIC-Programmer */
#define FTDI_IBS_PCMCIA_PID 0xff3a /* IBS Card reader for PCMCIA SRAM-cards */
#define FTDI_IBS_PK1_PID 0xff3b /* IBS PK1 - Particel counter */
#define FTDI_IBS_RS232MON_PID 0xff3c /* IBS RS232 - Monitor */
#define FTDI_IBS_APP70_PID 0xff3d /* APP 70 (dust monitoring system) */
#define FTDI_IBS_PEDO_PID 0xff3e /* IBS PEDO-Modem (RF modem 868.35 MHz) */
#define FTDI_IBS_PROD_PID 0xff3f /* future device */
/* www.canusb.com Lawicel CANUSB device (FTDI_VID) */
#define FTDI_CANUSB_PID 0xFFA8 /* Product Id */ /*
536 * TavIR AVR product ids (FTDI_VID)
537 */
#define FTDI_TAVIR_STK500_PID 0xFA33 /* STK500 AVR programmer */ /*
541 * TIAO product ids (FTDI_VID)
542 * http://www.tiaowiki.com/w/Main_Page
543 */
#define FTDI_TIAO_UMPA_PID 0x8a98 /* TIAO/DIYGADGET USB Multi-Protocol Adapter */ /*
547 * NovaTech product ids (FTDI_VID)
548 */
#define FTDI_NT_ORIONLXM_PID 0x7c90 /* OrionLXm Substation Automation Platform */ /********************************/
/** third-party VID/PID combos **/
/********************************/ /*
559 * Atmel STK541
560 */
#define ATMEL_VID 0x03eb /* Vendor ID */
#define STK541_PID 0x2109 /* Zigbee Controller */ /*
565 * Blackfin gnICE JTAG
566 * http://docs.blackfin.uclinux.org/doku.php?id=hw:jtag:gnice
567 */
#define ADI_VID 0x0456
#define ADI_GNICE_PID 0xF000
#define ADI_GNICEPLUS_PID 0xF001 /*
573 * Microchip Technology, Inc.
574 *
575 * MICROCHIP_VID (0x04D8) and MICROCHIP_USB_BOARD_PID (0x000A) are
576 * used by single function CDC ACM class based firmware demo
577 * applications. The VID/PID has also been used in firmware
578 * emulating FTDI serial chips by:
579 * Hornby Elite - Digital Command Control Console
580 * http://www.hornby.com/hornby-dcc/controllers/
581 */
#define MICROCHIP_VID 0x04D8
#define MICROCHIP_USB_BOARD_PID 0x000A /* CDC RS-232 Emulation Demo */ /*
586 * RATOC REX-USB60F
587 */
#define RATOC_VENDOR_ID 0x0584
#define RATOC_PRODUCT_ID_USB60F 0xb020 /*
592 * Infineon Technologies
593 */
#define INFINEON_VID 0x058b
#define INFINEON_TRIBOARD_PID 0x0028 /* DAS JTAG TriBoard TC1798 V1.0 */ /*
598 * Acton Research Corp.
599 */
#define ACTON_VID 0x0647 /* Vendor ID */
#define ACTON_SPECTRAPRO_PID 0x0100 /*
604 * Contec products (http://www.contec.com)
605 * Submitted by Daniel Sangorrin
606 */
#define CONTEC_VID 0x06CE /* Vendor ID */
#define CONTEC_COM1USBH_PID 0x8311 /* COM-1(USB)H */ /*
611 * Mitsubishi Electric Corp. (http://www.meau.com)
612 * Submitted by Konstantin Holoborodko
613 */
#define MITSUBISHI_VID 0x06D3
#define MITSUBISHI_FXUSB_PID 0x0284 /* USB/RS422 converters: FX-USB-AW/-BD */ /*
618 * Definitions for B&B Electronics products.
619 */
#define BANDB_VID 0x0856 /* B&B Electronics Vendor ID */
#define BANDB_USOTL4_PID 0xAC01 /* USOTL4 Isolated RS-485 Converter */
#define BANDB_USTL4_PID 0xAC02 /* USTL4 RS-485 Converter */
#define BANDB_USO9ML2_PID 0xAC03 /* USO9ML2 Isolated RS-232 Converter */
#define BANDB_USOPTL4_PID 0xAC11
#define BANDB_USPTL4_PID 0xAC12
#define BANDB_USO9ML2DR_2_PID 0xAC16
#define BANDB_USO9ML2DR_PID 0xAC17
#define BANDB_USOPTL4DR2_PID 0xAC18 /* USOPTL4R-2 2-port Isolated RS-232 Converter */
#define BANDB_USOPTL4DR_PID 0xAC19
#define BANDB_485USB9F_2W_PID 0xAC25
#define BANDB_485USB9F_4W_PID 0xAC26
#define BANDB_232USB9M_PID 0xAC27
#define BANDB_485USBTB_2W_PID 0xAC33
#define BANDB_485USBTB_4W_PID 0xAC34
#define BANDB_TTL5USB9M_PID 0xAC49
#define BANDB_TTL3USB9M_PID 0xAC50
#define BANDB_ZZ_PROG1_USB_PID 0xBA02 /*
640 * Intrepid Control Systems (http://www.intrepidcs.com/) ValueCAN and NeoVI
641 */
#define INTREPID_VID 0x093C
#define INTREPID_VALUECAN_PID 0x0601
#define INTREPID_NEOVI_PID 0x0701 /*
647 * Definitions for ID TECH (www.idt-net.com) devices
648 */
#define IDTECH_VID 0x0ACD /* ID TECH Vendor ID */
#define IDTECH_IDT1221U_PID 0x0300 /* IDT1221U USB to RS-232 adapter */ /*
653 * Definitions for Omnidirectional Control Technology, Inc. devices
654 */
#define OCT_VID 0x0B39 /* OCT vendor ID */
/* Note: OCT US101 is also rebadged as Dick Smith Electronics (NZ) XH6381 */
/* Also rebadged as Dick Smith Electronics (Aus) XH6451 */
/* Also rebadged as SIIG Inc. model US2308 hardware version 1 */
#define OCT_DK201_PID 0x0103 /* OCT DK201 USB docking station */
#define OCT_US101_PID 0x0421 /* OCT US101 USB to RS-232 */ /*
663 * Definitions for Icom Inc. devices
664 */
#define ICOM_VID 0x0C26 /* Icom vendor ID */
/* Note: ID-1 is a communications tranceiver for HAM-radio operators */
#define ICOM_ID_1_PID 0x0004 /* ID-1 USB to RS-232 */
/* Note: OPC is an Optional cable to connect an Icom Tranceiver */
#define ICOM_OPC_U_UC_PID 0x0018 /* OPC-478UC, OPC-1122U cloning cable */
/* Note: ID-RP* devices are Icom Repeater Devices for HAM-radio */
#define ICOM_ID_RP2C1_PID 0x0009 /* ID-RP2C Asset 1 to RS-232 */
#define ICOM_ID_RP2C2_PID 0x000A /* ID-RP2C Asset 2 to RS-232 */
#define ICOM_ID_RP2D_PID 0x000B /* ID-RP2D configuration port*/
#define ICOM_ID_RP2VT_PID 0x000C /* ID-RP2V Transmit config port */
#define ICOM_ID_RP2VR_PID 0x000D /* ID-RP2V Receive config port */
#define ICOM_ID_RP4KVT_PID 0x0010 /* ID-RP4000V Transmit config port */
#define ICOM_ID_RP4KVR_PID 0x0011 /* ID-RP4000V Receive config port */
#define ICOM_ID_RP2KVT_PID 0x0012 /* ID-RP2000V Transmit config port */
#define ICOM_ID_RP2KVR_PID 0x0013 /* ID-RP2000V Receive config port */ /*
682 * GN Otometrics (http://www.otometrics.com)
683 * Submitted by Ville Sundberg.
684 */
#define GN_OTOMETRICS_VID 0x0c33 /* Vendor ID */
#define AURICAL_USB_PID 0x0010 /* Aurical USB Audiometer */ /*
689 * The following are the values for the Sealevel SeaLINK+ adapters.
690 * (Original list sent by Tuan Hoang. Ian Abbott renamed the macros and
691 * removed some PIDs that don't seem to match any existing products.)
692 */
#define SEALEVEL_VID 0x0c52 /* Sealevel Vendor ID */
#define SEALEVEL_2101_PID 0x2101 /* SeaLINK+232 (2101/2105) */
#define SEALEVEL_2102_PID 0x2102 /* SeaLINK+485 (2102) */
#define SEALEVEL_2103_PID 0x2103 /* SeaLINK+232I (2103) */
#define SEALEVEL_2104_PID 0x2104 /* SeaLINK+485I (2104) */
#define SEALEVEL_2106_PID 0x9020 /* SeaLINK+422 (2106) */
#define SEALEVEL_2201_1_PID 0x2211 /* SeaPORT+2/232 (2201) Port 1 */
#define SEALEVEL_2201_2_PID 0x2221 /* SeaPORT+2/232 (2201) Port 2 */
#define SEALEVEL_2202_1_PID 0x2212 /* SeaPORT+2/485 (2202) Port 1 */
#define SEALEVEL_2202_2_PID 0x2222 /* SeaPORT+2/485 (2202) Port 2 */
#define SEALEVEL_2203_1_PID 0x2213 /* SeaPORT+2 (2203) Port 1 */
#define SEALEVEL_2203_2_PID 0x2223 /* SeaPORT+2 (2203) Port 2 */
#define SEALEVEL_2401_1_PID 0x2411 /* SeaPORT+4/232 (2401) Port 1 */
#define SEALEVEL_2401_2_PID 0x2421 /* SeaPORT+4/232 (2401) Port 2 */
#define SEALEVEL_2401_3_PID 0x2431 /* SeaPORT+4/232 (2401) Port 3 */
#define SEALEVEL_2401_4_PID 0x2441 /* SeaPORT+4/232 (2401) Port 4 */
#define SEALEVEL_2402_1_PID 0x2412 /* SeaPORT+4/485 (2402) Port 1 */
#define SEALEVEL_2402_2_PID 0x2422 /* SeaPORT+4/485 (2402) Port 2 */
#define SEALEVEL_2402_3_PID 0x2432 /* SeaPORT+4/485 (2402) Port 3 */
#define SEALEVEL_2402_4_PID 0x2442 /* SeaPORT+4/485 (2402) Port 4 */
#define SEALEVEL_2403_1_PID 0x2413 /* SeaPORT+4 (2403) Port 1 */
#define SEALEVEL_2403_2_PID 0x2423 /* SeaPORT+4 (2403) Port 2 */
#define SEALEVEL_2403_3_PID 0x2433 /* SeaPORT+4 (2403) Port 3 */
#define SEALEVEL_2403_4_PID 0x2443 /* SeaPORT+4 (2403) Port 4 */
#define SEALEVEL_2801_1_PID 0X2811 /* SeaLINK+8/232 (2801) Port 1 */
#define SEALEVEL_2801_2_PID 0X2821 /* SeaLINK+8/232 (2801) Port 2 */
#define SEALEVEL_2801_3_PID 0X2831 /* SeaLINK+8/232 (2801) Port 3 */
#define SEALEVEL_2801_4_PID 0X2841 /* SeaLINK+8/232 (2801) Port 4 */
#define SEALEVEL_2801_5_PID 0X2851 /* SeaLINK+8/232 (2801) Port 5 */
#define SEALEVEL_2801_6_PID 0X2861 /* SeaLINK+8/232 (2801) Port 6 */
#define SEALEVEL_2801_7_PID 0X2871 /* SeaLINK+8/232 (2801) Port 7 */
#define SEALEVEL_2801_8_PID 0X2881 /* SeaLINK+8/232 (2801) Port 8 */
#define SEALEVEL_2802_1_PID 0X2812 /* SeaLINK+8/485 (2802) Port 1 */
#define SEALEVEL_2802_2_PID 0X2822 /* SeaLINK+8/485 (2802) Port 2 */
#define SEALEVEL_2802_3_PID 0X2832 /* SeaLINK+8/485 (2802) Port 3 */
#define SEALEVEL_2802_4_PID 0X2842 /* SeaLINK+8/485 (2802) Port 4 */
#define SEALEVEL_2802_5_PID 0X2852 /* SeaLINK+8/485 (2802) Port 5 */
#define SEALEVEL_2802_6_PID 0X2862 /* SeaLINK+8/485 (2802) Port 6 */
#define SEALEVEL_2802_7_PID 0X2872 /* SeaLINK+8/485 (2802) Port 7 */
#define SEALEVEL_2802_8_PID 0X2882 /* SeaLINK+8/485 (2802) Port 8 */
#define SEALEVEL_2803_1_PID 0X2813 /* SeaLINK+8 (2803) Port 1 */
#define SEALEVEL_2803_2_PID 0X2823 /* SeaLINK+8 (2803) Port 2 */
#define SEALEVEL_2803_3_PID 0X2833 /* SeaLINK+8 (2803) Port 3 */
#define SEALEVEL_2803_4_PID 0X2843 /* SeaLINK+8 (2803) Port 4 */
#define SEALEVEL_2803_5_PID 0X2853 /* SeaLINK+8 (2803) Port 5 */
#define SEALEVEL_2803_6_PID 0X2863 /* SeaLINK+8 (2803) Port 6 */
#define SEALEVEL_2803_7_PID 0X2873 /* SeaLINK+8 (2803) Port 7 */
#define SEALEVEL_2803_8_PID 0X2883 /* SeaLINK+8 (2803) Port 8 */
#define SEALEVEL_2803R_1_PID 0Xa02a /* SeaLINK+8 (2803-ROHS) Port 1+2 */
#define SEALEVEL_2803R_2_PID 0Xa02b /* SeaLINK+8 (2803-ROHS) Port 3+4 */
#define SEALEVEL_2803R_3_PID 0Xa02c /* SeaLINK+8 (2803-ROHS) Port 5+6 */
#define SEALEVEL_2803R_4_PID 0Xa02d /* SeaLINK+8 (2803-ROHS) Port 7+8 */ /*
747 * JETI SPECTROMETER SPECBOS 1201
748 * http://www.jeti.com/cms/index.php/instruments/other-instruments/specbos-2101
749 */
#define JETI_VID 0x0c6c
#define JETI_SPC1201_PID 0x04b2 /*
754 * FTDI USB UART chips used in construction projects from the
755 * Elektor Electronics magazine (http://www.elektor.com/)
756 */
#define ELEKTOR_VID 0x0C7D
#define ELEKTOR_FT323R_PID 0x0005 /* RFID-Reader, issue 09-2006 */ /*
761 * Posiflex inc retail equipment (http://www.posiflex.com.tw)
762 */
#define POSIFLEX_VID 0x0d3a /* Vendor ID */
#define POSIFLEX_PP7000_PID 0x0300 /* PP-7000II thermal printer */ /*
767 * The following are the values for two KOBIL chipcard terminals.
768 */
#define KOBIL_VID 0x0d46 /* KOBIL Vendor ID */
#define KOBIL_CONV_B1_PID 0x2020 /* KOBIL Konverter for B1 */
#define KOBIL_CONV_KAAN_PID 0x2021 /* KOBIL_Konverter for KAAN */ #define FTDI_NF_RIC_VID 0x0DCD /* Vendor Id */
#define FTDI_NF_RIC_PID 0x0001 /* Product Id */ /*
777 * Falcom Wireless Communications GmbH
778 */
#define FALCOM_VID 0x0F94 /* Vendor Id */
#define FALCOM_TWIST_PID 0x0001 /* Falcom Twist USB GPRS modem */
#define FALCOM_SAMBA_PID 0x0005 /* Falcom Samba USB GPRS modem */ /* Larsen and Brusgaard AltiTrack/USBtrack */
#define LARSENBRUSGAARD_VID 0x0FD8
#define LB_ALTITRACK_PID 0x0001 /*
788 * TTi (Thurlby Thandar Instruments)
789 */
#define TTI_VID 0x103E /* Vendor Id */
#define TTI_QL355P_PID 0x03E8 /* TTi QL355P power supply */ /*
794 * Newport Cooperation (www.newport.com)
795 */
#define NEWPORT_VID 0x104D
#define NEWPORT_AGILIS_PID 0x3000
#define NEWPORT_CONEX_CC_PID 0x3002
#define NEWPORT_CONEX_AGP_PID 0x3006 /* Interbiometrics USB I/O Board */
/* Developed for Interbiometrics by Rudolf Gugler */
#define INTERBIOMETRICS_VID 0x1209
#define INTERBIOMETRICS_IOBOARD_PID 0x1002
#define INTERBIOMETRICS_MINI_IOBOARD_PID 0x1006 /*
808 * Testo products (http://www.testo.com/)
809 * Submitted by Colin Leroy
810 */
#define TESTO_VID 0x128D
#define TESTO_1_PID 0x0001
#define TESTO_3_PID 0x0003 /*
816 * Mobility Electronics products.
817 */
#define MOBILITY_VID 0x1342
#define MOBILITY_USB_SERIAL_PID 0x0202 /* EasiDock USB 200 serial */ /*
822 * FIC / OpenMoko, Inc. http://wiki.openmoko.org/wiki/Neo1973_Debug_Board_v3
823 * Submitted by Harald Welte <laforge@openmoko.org>
824 */
#define FIC_VID 0x1457
#define FIC_NEO1973_DEBUG_PID 0x5118 /* Olimex */
#define OLIMEX_VID 0x15BA
#define OLIMEX_ARM_USB_OCD_PID 0x0003
#define OLIMEX_ARM_USB_OCD_H_PID 0x002b /*
834 * Telldus Technologies
835 */
#define TELLDUS_VID 0x1781 /* Vendor ID */
#define TELLDUS_TELLSTICK_PID 0x0C30 /* RF control dongle 433 MHz using FT232RL */ /*
840 * NOVITUS printers
841 */
#define NOVITUS_VID 0x1a28
#define NOVITUS_BONO_E_PID 0x6010 /*
846 * RT Systems programming cables for various ham radios
847 */
#define RTSYSTEMS_VID 0x2100 /* Vendor ID */
#define RTSYSTEMS_USB_S03_PID 0x9001 /* RTS-03 USB to Serial Adapter */
#define RTSYSTEMS_USB_59_PID 0x9e50 /* USB-59 USB to 8 pin plug */
#define RTSYSTEMS_USB_57A_PID 0x9e51 /* USB-57A USB to 4pin 3.5mm plug */
#define RTSYSTEMS_USB_57B_PID 0x9e52 /* USB-57B USB to extended 4pin 3.5mm plug */
#define RTSYSTEMS_USB_29A_PID 0x9e53 /* USB-29A USB to 3.5mm stereo plug */
#define RTSYSTEMS_USB_29B_PID 0x9e54 /* USB-29B USB to 6 pin mini din */
#define RTSYSTEMS_USB_29F_PID 0x9e55 /* USB-29F USB to 6 pin modular plug */
#define RTSYSTEMS_USB_62B_PID 0x9e56 /* USB-62B USB to 8 pin mini din plug*/
#define RTSYSTEMS_USB_S01_PID 0x9e57 /* USB-RTS01 USB to 3.5 mm stereo plug*/
#define RTSYSTEMS_USB_63_PID 0x9e58 /* USB-63 USB to 9 pin female*/
#define RTSYSTEMS_USB_29C_PID 0x9e59 /* USB-29C USB to 4 pin modular plug*/
#define RTSYSTEMS_USB_81B_PID 0x9e5A /* USB-81 USB to 8 pin mini din plug*/
#define RTSYSTEMS_USB_82B_PID 0x9e5B /* USB-82 USB to 2.5 mm stereo plug*/
#define RTSYSTEMS_USB_K5D_PID 0x9e5C /* USB-K5D USB to 8 pin modular plug*/
#define RTSYSTEMS_USB_K4Y_PID 0x9e5D /* USB-K4Y USB to 2.5/3.5 mm plugs*/
#define RTSYSTEMS_USB_K5G_PID 0x9e5E /* USB-K5G USB to 8 pin modular plug*/
#define RTSYSTEMS_USB_S05_PID 0x9e5F /* USB-RTS05 USB to 2.5 mm stereo plug*/
#define RTSYSTEMS_USB_60_PID 0x9e60 /* USB-60 USB to 6 pin din*/
#define RTSYSTEMS_USB_61_PID 0x9e61 /* USB-61 USB to 6 pin mini din*/
#define RTSYSTEMS_USB_62_PID 0x9e62 /* USB-62 USB to 8 pin mini din*/
#define RTSYSTEMS_USB_63B_PID 0x9e63 /* USB-63 USB to 9 pin female*/
#define RTSYSTEMS_USB_64_PID 0x9e64 /* USB-64 USB to 9 pin male*/
#define RTSYSTEMS_USB_65_PID 0x9e65 /* USB-65 USB to 9 pin female null modem*/
#define RTSYSTEMS_USB_92_PID 0x9e66 /* USB-92 USB to 12 pin plug*/
#define RTSYSTEMS_USB_92D_PID 0x9e67 /* USB-92D USB to 12 pin plug data*/
#define RTSYSTEMS_USB_W5R_PID 0x9e68 /* USB-W5R USB to 8 pin modular plug*/
#define RTSYSTEMS_USB_A5R_PID 0x9e69 /* USB-A5R USB to 8 pin modular plug*/
#define RTSYSTEMS_USB_PW1_PID 0x9e6A /* USB-PW1 USB to 8 pin modular plug*/ /*
879 * Physik Instrumente
880 * http://www.physikinstrumente.com/en/products/
881 */
/* These two devices use the VID of FTDI */
#define PI_C865_PID 0xe0a0 /* PI C-865 Piezomotor Controller */
#define PI_C857_PID 0xe0a1 /* PI Encoder Trigger Box */ #define PI_VID 0x1a72 /* Vendor ID */
#define PI_C866_PID 0x1000 /* PI C-866 Piezomotor Controller */
#define PI_C663_PID 0x1001 /* PI C-663 Mercury-Step */
#define PI_C725_PID 0x1002 /* PI C-725 Piezomotor Controller */
#define PI_E517_PID 0x1005 /* PI E-517 Digital Piezo Controller Operation Module */
#define PI_C863_PID 0x1007 /* PI C-863 */
#define PI_E861_PID 0x1008 /* PI E-861 Piezomotor Controller */
#define PI_C867_PID 0x1009 /* PI C-867 Piezomotor Controller */
#define PI_E609_PID 0x100D /* PI E-609 Digital Piezo Controller */
#define PI_E709_PID 0x100E /* PI E-709 Digital Piezo Controller */
#define PI_100F_PID 0x100F /* PI Digital Piezo Controller */
#define PI_1011_PID 0x1011 /* PI Digital Piezo Controller */
#define PI_1012_PID 0x1012 /* PI Motion Controller */
#define PI_1013_PID 0x1013 /* PI Motion Controller */
#define PI_1014_PID 0x1014 /* PI Device */
#define PI_1015_PID 0x1015 /* PI Device */
#define PI_1016_PID 0x1016 /* PI Digital Servo Module */ /*
905 * Kondo Kagaku Co.Ltd.
906 * http://www.kondo-robot.com/EN
907 */
#define KONDO_VID 0x165c
#define KONDO_USB_SERIAL_PID 0x0002 /*
912 * Bayer Ascensia Contour blood glucose meter USB-converter cable.
913 * http://winglucofacts.com/cables/
914 */
#define BAYER_VID 0x1A79
#define BAYER_CONTOUR_CABLE_PID 0x6001 /*
919 * The following are the values for the Matrix Orbital FTDI Range
920 * Anything in this range will use an FT232RL.
921 */
#define MTXORB_VID 0x1B3D
#define MTXORB_FTDI_RANGE_0100_PID 0x0100
#define MTXORB_FTDI_RANGE_0101_PID 0x0101
#define MTXORB_FTDI_RANGE_0102_PID 0x0102
#define MTXORB_FTDI_RANGE_0103_PID 0x0103
#define MTXORB_FTDI_RANGE_0104_PID 0x0104
#define MTXORB_FTDI_RANGE_0105_PID 0x0105
#define MTXORB_FTDI_RANGE_0106_PID 0x0106
#define MTXORB_FTDI_RANGE_0107_PID 0x0107
#define MTXORB_FTDI_RANGE_0108_PID 0x0108
#define MTXORB_FTDI_RANGE_0109_PID 0x0109
#define MTXORB_FTDI_RANGE_010A_PID 0x010A
#define MTXORB_FTDI_RANGE_010B_PID 0x010B
#define MTXORB_FTDI_RANGE_010C_PID 0x010C
#define MTXORB_FTDI_RANGE_010D_PID 0x010D
#define MTXORB_FTDI_RANGE_010E_PID 0x010E
#define MTXORB_FTDI_RANGE_010F_PID 0x010F
#define MTXORB_FTDI_RANGE_0110_PID 0x0110
#define MTXORB_FTDI_RANGE_0111_PID 0x0111
#define MTXORB_FTDI_RANGE_0112_PID 0x0112
#define MTXORB_FTDI_RANGE_0113_PID 0x0113
#define MTXORB_FTDI_RANGE_0114_PID 0x0114
#define MTXORB_FTDI_RANGE_0115_PID 0x0115
#define MTXORB_FTDI_RANGE_0116_PID 0x0116
#define MTXORB_FTDI_RANGE_0117_PID 0x0117
#define MTXORB_FTDI_RANGE_0118_PID 0x0118
#define MTXORB_FTDI_RANGE_0119_PID 0x0119
#define MTXORB_FTDI_RANGE_011A_PID 0x011A
#define MTXORB_FTDI_RANGE_011B_PID 0x011B
#define MTXORB_FTDI_RANGE_011C_PID 0x011C
#define MTXORB_FTDI_RANGE_011D_PID 0x011D
#define MTXORB_FTDI_RANGE_011E_PID 0x011E
#define MTXORB_FTDI_RANGE_011F_PID 0x011F
#define MTXORB_FTDI_RANGE_0120_PID 0x0120
#define MTXORB_FTDI_RANGE_0121_PID 0x0121
#define MTXORB_FTDI_RANGE_0122_PID 0x0122
#define MTXORB_FTDI_RANGE_0123_PID 0x0123
#define MTXORB_FTDI_RANGE_0124_PID 0x0124
#define MTXORB_FTDI_RANGE_0125_PID 0x0125
#define MTXORB_FTDI_RANGE_0126_PID 0x0126
#define MTXORB_FTDI_RANGE_0127_PID 0x0127
#define MTXORB_FTDI_RANGE_0128_PID 0x0128
#define MTXORB_FTDI_RANGE_0129_PID 0x0129
#define MTXORB_FTDI_RANGE_012A_PID 0x012A
#define MTXORB_FTDI_RANGE_012B_PID 0x012B
#define MTXORB_FTDI_RANGE_012C_PID 0x012C
#define MTXORB_FTDI_RANGE_012D_PID 0x012D
#define MTXORB_FTDI_RANGE_012E_PID 0x012E
#define MTXORB_FTDI_RANGE_012F_PID 0x012F
#define MTXORB_FTDI_RANGE_0130_PID 0x0130
#define MTXORB_FTDI_RANGE_0131_PID 0x0131
#define MTXORB_FTDI_RANGE_0132_PID 0x0132
#define MTXORB_FTDI_RANGE_0133_PID 0x0133
#define MTXORB_FTDI_RANGE_0134_PID 0x0134
#define MTXORB_FTDI_RANGE_0135_PID 0x0135
#define MTXORB_FTDI_RANGE_0136_PID 0x0136
#define MTXORB_FTDI_RANGE_0137_PID 0x0137
#define MTXORB_FTDI_RANGE_0138_PID 0x0138
#define MTXORB_FTDI_RANGE_0139_PID 0x0139
#define MTXORB_FTDI_RANGE_013A_PID 0x013A
#define MTXORB_FTDI_RANGE_013B_PID 0x013B
#define MTXORB_FTDI_RANGE_013C_PID 0x013C
#define MTXORB_FTDI_RANGE_013D_PID 0x013D
#define MTXORB_FTDI_RANGE_013E_PID 0x013E
#define MTXORB_FTDI_RANGE_013F_PID 0x013F
#define MTXORB_FTDI_RANGE_0140_PID 0x0140
#define MTXORB_FTDI_RANGE_0141_PID 0x0141
#define MTXORB_FTDI_RANGE_0142_PID 0x0142
#define MTXORB_FTDI_RANGE_0143_PID 0x0143
#define MTXORB_FTDI_RANGE_0144_PID 0x0144
#define MTXORB_FTDI_RANGE_0145_PID 0x0145
#define MTXORB_FTDI_RANGE_0146_PID 0x0146
#define MTXORB_FTDI_RANGE_0147_PID 0x0147
#define MTXORB_FTDI_RANGE_0148_PID 0x0148
#define MTXORB_FTDI_RANGE_0149_PID 0x0149
#define MTXORB_FTDI_RANGE_014A_PID 0x014A
#define MTXORB_FTDI_RANGE_014B_PID 0x014B
#define MTXORB_FTDI_RANGE_014C_PID 0x014C
#define MTXORB_FTDI_RANGE_014D_PID 0x014D
#define MTXORB_FTDI_RANGE_014E_PID 0x014E
#define MTXORB_FTDI_RANGE_014F_PID 0x014F
#define MTXORB_FTDI_RANGE_0150_PID 0x0150
#define MTXORB_FTDI_RANGE_0151_PID 0x0151
#define MTXORB_FTDI_RANGE_0152_PID 0x0152
#define MTXORB_FTDI_RANGE_0153_PID 0x0153
#define MTXORB_FTDI_RANGE_0154_PID 0x0154
#define MTXORB_FTDI_RANGE_0155_PID 0x0155
#define MTXORB_FTDI_RANGE_0156_PID 0x0156
#define MTXORB_FTDI_RANGE_0157_PID 0x0157
#define MTXORB_FTDI_RANGE_0158_PID 0x0158
#define MTXORB_FTDI_RANGE_0159_PID 0x0159
#define MTXORB_FTDI_RANGE_015A_PID 0x015A
#define MTXORB_FTDI_RANGE_015B_PID 0x015B
#define MTXORB_FTDI_RANGE_015C_PID 0x015C
#define MTXORB_FTDI_RANGE_015D_PID 0x015D
#define MTXORB_FTDI_RANGE_015E_PID 0x015E
#define MTXORB_FTDI_RANGE_015F_PID 0x015F
#define MTXORB_FTDI_RANGE_0160_PID 0x0160
#define MTXORB_FTDI_RANGE_0161_PID 0x0161
#define MTXORB_FTDI_RANGE_0162_PID 0x0162
#define MTXORB_FTDI_RANGE_0163_PID 0x0163
#define MTXORB_FTDI_RANGE_0164_PID 0x0164
#define MTXORB_FTDI_RANGE_0165_PID 0x0165
#define MTXORB_FTDI_RANGE_0166_PID 0x0166
#define MTXORB_FTDI_RANGE_0167_PID 0x0167
#define MTXORB_FTDI_RANGE_0168_PID 0x0168
#define MTXORB_FTDI_RANGE_0169_PID 0x0169
#define MTXORB_FTDI_RANGE_016A_PID 0x016A
#define MTXORB_FTDI_RANGE_016B_PID 0x016B
#define MTXORB_FTDI_RANGE_016C_PID 0x016C
#define MTXORB_FTDI_RANGE_016D_PID 0x016D
#define MTXORB_FTDI_RANGE_016E_PID 0x016E
#define MTXORB_FTDI_RANGE_016F_PID 0x016F
#define MTXORB_FTDI_RANGE_0170_PID 0x0170
#define MTXORB_FTDI_RANGE_0171_PID 0x0171
#define MTXORB_FTDI_RANGE_0172_PID 0x0172
#define MTXORB_FTDI_RANGE_0173_PID 0x0173
#define MTXORB_FTDI_RANGE_0174_PID 0x0174
#define MTXORB_FTDI_RANGE_0175_PID 0x0175
#define MTXORB_FTDI_RANGE_0176_PID 0x0176
#define MTXORB_FTDI_RANGE_0177_PID 0x0177
#define MTXORB_FTDI_RANGE_0178_PID 0x0178
#define MTXORB_FTDI_RANGE_0179_PID 0x0179
#define MTXORB_FTDI_RANGE_017A_PID 0x017A
#define MTXORB_FTDI_RANGE_017B_PID 0x017B
#define MTXORB_FTDI_RANGE_017C_PID 0x017C
#define MTXORB_FTDI_RANGE_017D_PID 0x017D
#define MTXORB_FTDI_RANGE_017E_PID 0x017E
#define MTXORB_FTDI_RANGE_017F_PID 0x017F
#define MTXORB_FTDI_RANGE_0180_PID 0x0180
#define MTXORB_FTDI_RANGE_0181_PID 0x0181
#define MTXORB_FTDI_RANGE_0182_PID 0x0182
#define MTXORB_FTDI_RANGE_0183_PID 0x0183
#define MTXORB_FTDI_RANGE_0184_PID 0x0184
#define MTXORB_FTDI_RANGE_0185_PID 0x0185
#define MTXORB_FTDI_RANGE_0186_PID 0x0186
#define MTXORB_FTDI_RANGE_0187_PID 0x0187
#define MTXORB_FTDI_RANGE_0188_PID 0x0188
#define MTXORB_FTDI_RANGE_0189_PID 0x0189
#define MTXORB_FTDI_RANGE_018A_PID 0x018A
#define MTXORB_FTDI_RANGE_018B_PID 0x018B
#define MTXORB_FTDI_RANGE_018C_PID 0x018C
#define MTXORB_FTDI_RANGE_018D_PID 0x018D
#define MTXORB_FTDI_RANGE_018E_PID 0x018E
#define MTXORB_FTDI_RANGE_018F_PID 0x018F
#define MTXORB_FTDI_RANGE_0190_PID 0x0190
#define MTXORB_FTDI_RANGE_0191_PID 0x0191
#define MTXORB_FTDI_RANGE_0192_PID 0x0192
#define MTXORB_FTDI_RANGE_0193_PID 0x0193
#define MTXORB_FTDI_RANGE_0194_PID 0x0194
#define MTXORB_FTDI_RANGE_0195_PID 0x0195
#define MTXORB_FTDI_RANGE_0196_PID 0x0196
#define MTXORB_FTDI_RANGE_0197_PID 0x0197
#define MTXORB_FTDI_RANGE_0198_PID 0x0198
#define MTXORB_FTDI_RANGE_0199_PID 0x0199
#define MTXORB_FTDI_RANGE_019A_PID 0x019A
#define MTXORB_FTDI_RANGE_019B_PID 0x019B
#define MTXORB_FTDI_RANGE_019C_PID 0x019C
#define MTXORB_FTDI_RANGE_019D_PID 0x019D
#define MTXORB_FTDI_RANGE_019E_PID 0x019E
#define MTXORB_FTDI_RANGE_019F_PID 0x019F
#define MTXORB_FTDI_RANGE_01A0_PID 0x01A0
#define MTXORB_FTDI_RANGE_01A1_PID 0x01A1
#define MTXORB_FTDI_RANGE_01A2_PID 0x01A2
#define MTXORB_FTDI_RANGE_01A3_PID 0x01A3
#define MTXORB_FTDI_RANGE_01A4_PID 0x01A4
#define MTXORB_FTDI_RANGE_01A5_PID 0x01A5
#define MTXORB_FTDI_RANGE_01A6_PID 0x01A6
#define MTXORB_FTDI_RANGE_01A7_PID 0x01A7
#define MTXORB_FTDI_RANGE_01A8_PID 0x01A8
#define MTXORB_FTDI_RANGE_01A9_PID 0x01A9
#define MTXORB_FTDI_RANGE_01AA_PID 0x01AA
#define MTXORB_FTDI_RANGE_01AB_PID 0x01AB
#define MTXORB_FTDI_RANGE_01AC_PID 0x01AC
#define MTXORB_FTDI_RANGE_01AD_PID 0x01AD
#define MTXORB_FTDI_RANGE_01AE_PID 0x01AE
#define MTXORB_FTDI_RANGE_01AF_PID 0x01AF
#define MTXORB_FTDI_RANGE_01B0_PID 0x01B0
#define MTXORB_FTDI_RANGE_01B1_PID 0x01B1
#define MTXORB_FTDI_RANGE_01B2_PID 0x01B2
#define MTXORB_FTDI_RANGE_01B3_PID 0x01B3
#define MTXORB_FTDI_RANGE_01B4_PID 0x01B4
#define MTXORB_FTDI_RANGE_01B5_PID 0x01B5
#define MTXORB_FTDI_RANGE_01B6_PID 0x01B6
#define MTXORB_FTDI_RANGE_01B7_PID 0x01B7
#define MTXORB_FTDI_RANGE_01B8_PID 0x01B8
#define MTXORB_FTDI_RANGE_01B9_PID 0x01B9
#define MTXORB_FTDI_RANGE_01BA_PID 0x01BA
#define MTXORB_FTDI_RANGE_01BB_PID 0x01BB
#define MTXORB_FTDI_RANGE_01BC_PID 0x01BC
#define MTXORB_FTDI_RANGE_01BD_PID 0x01BD
#define MTXORB_FTDI_RANGE_01BE_PID 0x01BE
#define MTXORB_FTDI_RANGE_01BF_PID 0x01BF
#define MTXORB_FTDI_RANGE_01C0_PID 0x01C0
#define MTXORB_FTDI_RANGE_01C1_PID 0x01C1
#define MTXORB_FTDI_RANGE_01C2_PID 0x01C2
#define MTXORB_FTDI_RANGE_01C3_PID 0x01C3
#define MTXORB_FTDI_RANGE_01C4_PID 0x01C4
#define MTXORB_FTDI_RANGE_01C5_PID 0x01C5
#define MTXORB_FTDI_RANGE_01C6_PID 0x01C6
#define MTXORB_FTDI_RANGE_01C7_PID 0x01C7
#define MTXORB_FTDI_RANGE_01C8_PID 0x01C8
#define MTXORB_FTDI_RANGE_01C9_PID 0x01C9
#define MTXORB_FTDI_RANGE_01CA_PID 0x01CA
#define MTXORB_FTDI_RANGE_01CB_PID 0x01CB
#define MTXORB_FTDI_RANGE_01CC_PID 0x01CC
#define MTXORB_FTDI_RANGE_01CD_PID 0x01CD
#define MTXORB_FTDI_RANGE_01CE_PID 0x01CE
#define MTXORB_FTDI_RANGE_01CF_PID 0x01CF
#define MTXORB_FTDI_RANGE_01D0_PID 0x01D0
#define MTXORB_FTDI_RANGE_01D1_PID 0x01D1
#define MTXORB_FTDI_RANGE_01D2_PID 0x01D2
#define MTXORB_FTDI_RANGE_01D3_PID 0x01D3
#define MTXORB_FTDI_RANGE_01D4_PID 0x01D4
#define MTXORB_FTDI_RANGE_01D5_PID 0x01D5
#define MTXORB_FTDI_RANGE_01D6_PID 0x01D6
#define MTXORB_FTDI_RANGE_01D7_PID 0x01D7
#define MTXORB_FTDI_RANGE_01D8_PID 0x01D8
#define MTXORB_FTDI_RANGE_01D9_PID 0x01D9
#define MTXORB_FTDI_RANGE_01DA_PID 0x01DA
#define MTXORB_FTDI_RANGE_01DB_PID 0x01DB
#define MTXORB_FTDI_RANGE_01DC_PID 0x01DC
#define MTXORB_FTDI_RANGE_01DD_PID 0x01DD
#define MTXORB_FTDI_RANGE_01DE_PID 0x01DE
#define MTXORB_FTDI_RANGE_01DF_PID 0x01DF
#define MTXORB_FTDI_RANGE_01E0_PID 0x01E0
#define MTXORB_FTDI_RANGE_01E1_PID 0x01E1
#define MTXORB_FTDI_RANGE_01E2_PID 0x01E2
#define MTXORB_FTDI_RANGE_01E3_PID 0x01E3
#define MTXORB_FTDI_RANGE_01E4_PID 0x01E4
#define MTXORB_FTDI_RANGE_01E5_PID 0x01E5
#define MTXORB_FTDI_RANGE_01E6_PID 0x01E6
#define MTXORB_FTDI_RANGE_01E7_PID 0x01E7
#define MTXORB_FTDI_RANGE_01E8_PID 0x01E8
#define MTXORB_FTDI_RANGE_01E9_PID 0x01E9
#define MTXORB_FTDI_RANGE_01EA_PID 0x01EA
#define MTXORB_FTDI_RANGE_01EB_PID 0x01EB
#define MTXORB_FTDI_RANGE_01EC_PID 0x01EC
#define MTXORB_FTDI_RANGE_01ED_PID 0x01ED
#define MTXORB_FTDI_RANGE_01EE_PID 0x01EE
#define MTXORB_FTDI_RANGE_01EF_PID 0x01EF
#define MTXORB_FTDI_RANGE_01F0_PID 0x01F0
#define MTXORB_FTDI_RANGE_01F1_PID 0x01F1
#define MTXORB_FTDI_RANGE_01F2_PID 0x01F2
#define MTXORB_FTDI_RANGE_01F3_PID 0x01F3
#define MTXORB_FTDI_RANGE_01F4_PID 0x01F4
#define MTXORB_FTDI_RANGE_01F5_PID 0x01F5
#define MTXORB_FTDI_RANGE_01F6_PID 0x01F6
#define MTXORB_FTDI_RANGE_01F7_PID 0x01F7
#define MTXORB_FTDI_RANGE_01F8_PID 0x01F8
#define MTXORB_FTDI_RANGE_01F9_PID 0x01F9
#define MTXORB_FTDI_RANGE_01FA_PID 0x01FA
#define MTXORB_FTDI_RANGE_01FB_PID 0x01FB
#define MTXORB_FTDI_RANGE_01FC_PID 0x01FC
#define MTXORB_FTDI_RANGE_01FD_PID 0x01FD
#define MTXORB_FTDI_RANGE_01FE_PID 0x01FE
#define MTXORB_FTDI_RANGE_01FF_PID 0x01FF /*
1183 * The Mobility Lab (TML)
1184 * Submitted by Pierre Castella
1185 */
#define TML_VID 0x1B91 /* Vendor ID */
#define TML_USB_SERIAL_PID 0x0064 /* USB - Serial Converter */ /* Alti-2 products http://www.alti-2.com */
#define ALTI2_VID 0x1BC9
#define ALTI2_N3_PID 0x6001 /* Neptune 3 */ /*
1194 * Ionics PlugComputer
1195 */
#define IONICS_VID 0x1c0c
#define IONICS_PLUGCOMPUTER_PID 0x0102 /*
1200 * Dresden Elektronik Sensor Terminal Board
1201 */
#define DE_VID 0x1cf1 /* Vendor ID */
#define STB_PID 0x0001 /* Sensor Terminal Board */
#define WHT_PID 0x0004 /* Wireless Handheld Terminal */ /*
1207 * STMicroelectonics
1208 */
#define ST_VID 0x0483
#define ST_STMCLT_2232_PID 0x3746
#define ST_STMCLT_4232_PID 0x3747 /*
1214 * Papouch products (http://www.papouch.com/)
1215 * Submitted by Folkert van Heusden
1216 */ #define PAPOUCH_VID 0x5050 /* Vendor ID */
#define PAPOUCH_SB485_PID 0x0100 /* Papouch SB485 USB-485/422 Converter */
#define PAPOUCH_AP485_PID 0x0101 /* AP485 USB-RS485 Converter */
#define PAPOUCH_SB422_PID 0x0102 /* Papouch SB422 USB-RS422 Converter */
#define PAPOUCH_SB485_2_PID 0x0103 /* Papouch SB485 USB-485/422 Converter */
#define PAPOUCH_AP485_2_PID 0x0104 /* AP485 USB-RS485 Converter */
#define PAPOUCH_SB422_2_PID 0x0105 /* Papouch SB422 USB-RS422 Converter */
#define PAPOUCH_SB485S_PID 0x0106 /* Papouch SB485S USB-485/422 Converter */
#define PAPOUCH_SB485C_PID 0x0107 /* Papouch SB485C USB-485/422 Converter */
#define PAPOUCH_LEC_PID 0x0300 /* LEC USB Converter */
#define PAPOUCH_SB232_PID 0x0301 /* Papouch SB232 USB-RS232 Converter */
#define PAPOUCH_TMU_PID 0x0400 /* TMU USB Thermometer */
#define PAPOUCH_IRAMP_PID 0x0500 /* Papouch IRAmp Duplex */
#define PAPOUCH_DRAK5_PID 0x0700 /* Papouch DRAK5 */
#define PAPOUCH_QUIDO8x8_PID 0x0800 /* Papouch Quido 8/8 Module */
#define PAPOUCH_QUIDO4x4_PID 0x0900 /* Papouch Quido 4/4 Module */
#define PAPOUCH_QUIDO2x2_PID 0x0a00 /* Papouch Quido 2/2 Module */
#define PAPOUCH_QUIDO10x1_PID 0x0b00 /* Papouch Quido 10/1 Module */
#define PAPOUCH_QUIDO30x3_PID 0x0c00 /* Papouch Quido 30/3 Module */
#define PAPOUCH_QUIDO60x3_PID 0x0d00 /* Papouch Quido 60(100)/3 Module */
#define PAPOUCH_QUIDO2x16_PID 0x0e00 /* Papouch Quido 2/16 Module */
#define PAPOUCH_QUIDO3x32_PID 0x0f00 /* Papouch Quido 3/32 Module */
#define PAPOUCH_DRAK6_PID 0x1000 /* Papouch DRAK6 */
#define PAPOUCH_UPSUSB_PID 0x8000 /* Papouch UPS-USB adapter */
#define PAPOUCH_MU_PID 0x8001 /* MU controller */
#define PAPOUCH_SIMUKEY_PID 0x8002 /* Papouch SimuKey */
#define PAPOUCH_AD4USB_PID 0x8003 /* AD4USB Measurement Module */
#define PAPOUCH_GMUX_PID 0x8004 /* Papouch GOLIATH MUX */
#define PAPOUCH_GMSR_PID 0x8005 /* Papouch GOLIATH MSR */ /*
1249 * Marvell SheevaPlug
1250 */
#define MARVELL_VID 0x9e88
#define MARVELL_SHEEVAPLUG_PID 0x9e8f /*
1255 * Evolution Robotics products (http://www.evolution.com/).
1256 * Submitted by Shawn M. Lavelle.
1257 */
#define EVOLUTION_VID 0xDEEE /* Vendor ID */
#define EVOLUTION_ER1_PID 0x0300 /* ER1 Control Module */
#define EVO_8U232AM_PID 0x02FF /* Evolution robotics RCM2 (FT232AM)*/
#define EVO_HYBRID_PID 0x0302 /* Evolution robotics RCM4 PID (FT232BM)*/
#define EVO_RCM4_PID 0x0303 /* Evolution robotics RCM4 PID */ /*
1265 * MJS Gadgets HD Radio / XM Radio / Sirius Radio interfaces (using VID 0x0403)
1266 */
#define MJSG_GENERIC_PID 0x9378
#define MJSG_SR_RADIO_PID 0x9379
#define MJSG_XM_RADIO_PID 0x937A
#define MJSG_HD_RADIO_PID 0x937C /*
1273 * D.O.Tec products (http://www.directout.eu)
1274 */
#define FTDI_DOTEC_PID 0x9868 /*
1278 * Xverve Signalyzer tools (http://www.signalyzer.com/)
1279 */
#define XVERVE_SIGNALYZER_ST_PID 0xBCA0
#define XVERVE_SIGNALYZER_SLITE_PID 0xBCA1
#define XVERVE_SIGNALYZER_SH2_PID 0xBCA2
#define XVERVE_SIGNALYZER_SH4_PID 0xBCA4 /*
1286 * Segway Robotic Mobility Platform USB interface (using VID 0x0403)
1287 * Submitted by John G. Rogers
1288 */
#define SEGWAY_RMP200_PID 0xe729 /*
1293 * Accesio USB Data Acquisition products (http://www.accesio.com/)
1294 */
#define ACCESIO_COM4SM_PID 0xD578 /* www.sciencescope.co.uk educational dataloggers */
#define FTDI_SCIENCESCOPE_LOGBOOKML_PID 0xFF18
#define FTDI_SCIENCESCOPE_LS_LOGBOOK_PID 0xFF1C
#define FTDI_SCIENCESCOPE_HS_LOGBOOK_PID 0xFF1D /*
1303 * Milkymist One JTAG/Serial
1304 */
#define QIHARDWARE_VID 0x20B7
#define MILKYMISTONE_JTAGSERIAL_PID 0x0713 /*
1309 * CTI GmbH RS485 Converter http://www.cti-lean.com/
1310 */
/* USB-485-Mini*/
#define FTDI_CTI_MINI_PID 0xF608
/* USB-Nano-485*/
#define FTDI_CTI_NANO_PID 0xF60B /*
1317 * ZeitControl cardsystems GmbH rfid-readers http://zeitconrol.de
1318 */
/* TagTracer MIFARE*/
#define FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID 0xF7C0 /*
1323 * Rainforest Automation
1324 */
/* ZigBee controller */
#define FTDI_RF_R106 0x8A28 /*
1329 * Product: HCP HIT GPRS modem
1330 * Manufacturer: HCP d.o.o.
1331 * ATI command output: Cinterion MC55i
1332 */
#define FTDI_CINTERION_MC55I_PID 0xA951 /*
1336 * Product: Comet Caller ID decoder
1337 * Manufacturer: Crucible Technologies
1338 */
#define FTDI_CT_COMET_PID 0x8e08 /*
1342 * Product: Z3X Box
1343 * Manufacturer: Smart GSM Team
1344 */
#define FTDI_Z3X_PID 0x0011 /*
1348 * Product: Cressi PC Interface
1349 * Manufacturer: Cressi
1350 */
#define FTDI_CRESSI_PID 0x87d0 /*
1354 * Brainboxes devices
1355 */
#define BRAINBOXES_VID 0x05d1
#define BRAINBOXES_VX_001_PID 0x1001 /* VX-001 ExpressCard 1 Port RS232 */
#define BRAINBOXES_VX_012_PID 0x1002 /* VX-012 ExpressCard 2 Port RS232 */
#define BRAINBOXES_VX_023_PID 0x1003 /* VX-023 ExpressCard 1 Port RS422/485 */
#define BRAINBOXES_VX_034_PID 0x1004 /* VX-034 ExpressCard 2 Port RS422/485 */
#define BRAINBOXES_US_101_PID 0x1011 /* US-101 1xRS232 */
#define BRAINBOXES_US_324_PID 0x1013 /* US-324 1xRS422/485 1Mbaud */
#define BRAINBOXES_US_606_1_PID 0x2001 /* US-606 6 Port RS232 Serial Port 1 and 2 */
#define BRAINBOXES_US_606_2_PID 0x2002 /* US-606 6 Port RS232 Serial Port 3 and 4 */
#define BRAINBOXES_US_606_3_PID 0x2003 /* US-606 6 Port RS232 Serial Port 4 and 6 */
#define BRAINBOXES_US_701_1_PID 0x2011 /* US-701 4xRS232 1Mbaud Port 1 and 2 */
#define BRAINBOXES_US_701_2_PID 0x2012 /* US-701 4xRS422 1Mbaud Port 3 and 4 */
#define BRAINBOXES_US_279_1_PID 0x2021 /* US-279 8xRS422 1Mbaud Port 1 and 2 */
#define BRAINBOXES_US_279_2_PID 0x2022 /* US-279 8xRS422 1Mbaud Port 3 and 4 */
#define BRAINBOXES_US_279_3_PID 0x2023 /* US-279 8xRS422 1Mbaud Port 5 and 6 */
#define BRAINBOXES_US_279_4_PID 0x2024 /* US-279 8xRS422 1Mbaud Port 7 and 8 */
#define BRAINBOXES_US_346_1_PID 0x3011 /* US-346 4xRS422/485 1Mbaud Port 1 and 2 */
#define BRAINBOXES_US_346_2_PID 0x3012 /* US-346 4xRS422/485 1Mbaud Port 3 and 4 */
#define BRAINBOXES_US_257_PID 0x5001 /* US-257 2xRS232 1Mbaud */
#define BRAINBOXES_US_313_PID 0x6001 /* US-313 2xRS422/485 1Mbaud */
#define BRAINBOXES_US_357_PID 0x7001 /* US_357 1xRS232/422/485 */
#define BRAINBOXES_US_842_1_PID 0x8001 /* US-842 8xRS422/485 1Mbaud Port 1 and 2 */
#define BRAINBOXES_US_842_2_PID 0x8002 /* US-842 8xRS422/485 1Mbaud Port 3 and 4 */
#define BRAINBOXES_US_842_3_PID 0x8003 /* US-842 8xRS422/485 1Mbaud Port 5 and 6 */
#define BRAINBOXES_US_842_4_PID 0x8004 /* US-842 8xRS422/485 1Mbaud Port 7 and 8 */
#define BRAINBOXES_US_160_1_PID 0x9001 /* US-160 16xRS232 1Mbaud Port 1 and 2 */
#define BRAINBOXES_US_160_2_PID 0x9002 /* US-160 16xRS232 1Mbaud Port 3 and 4 */
#define BRAINBOXES_US_160_3_PID 0x9003 /* US-160 16xRS232 1Mbaud Port 5 and 6 */
#define BRAINBOXES_US_160_4_PID 0x9004 /* US-160 16xRS232 1Mbaud Port 7 and 8 */
#define BRAINBOXES_US_160_5_PID 0x9005 /* US-160 16xRS232 1Mbaud Port 9 and 10 */
#define BRAINBOXES_US_160_6_PID 0x9006 /* US-160 16xRS232 1Mbaud Port 11 and 12 */
#define BRAINBOXES_US_160_7_PID 0x9007 /* US-160 16xRS232 1Mbaud Port 13 and 14 */
#define BRAINBOXES_US_160_8_PID 0x9008 /* US-160 16xRS232 1Mbaud Port 15 and 16 */ /*
1391 * ekey biometric systems GmbH (http://ekey.net/)
1392 */
#define FTDI_EKEY_CONV_USB_PID 0xCB08 /* Converter USB */ /*
1396 * GE Healthcare devices
1397 */
#define GE_HEALTHCARE_VID 0x1901
#define GE_HEALTHCARE_NEMO_TRACKER_PID 0x0015
/*
2 * USB FTDI SIO driver
3 *
4 * Copyright (C) 2009 - 2013
5 * Johan Hovold (jhovold@gmail.com)
6 * Copyright (C) 1999 - 2001
7 * Greg Kroah-Hartman (greg@kroah.com)
8 * Bill Ryder (bryder@sgi.com)
9 * Copyright (C) 2002
10 * Kuba Ober (kuba@mareimbrium.org)
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * See Documentation/usb/usb-serial.txt for more information on using this
18 * driver
19 *
20 * See http://ftdi-usb-sio.sourceforge.net for up to date testing info
21 * and extra documentation
22 *
23 * Change entries from 2004 and earlier can be found in versions of this
24 * file in kernel versions prior to the 2.6.24 release.
25 *
26 */ /* Bill Ryder - bryder@sgi.com - wrote the FTDI_SIO implementation */
/* Thanx to FTDI for so kindly providing details of the protocol required */
/* to talk to the device */
/* Thanx to gkh and the rest of the usb dev group for all code I have
32 assimilated :-) */ #include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/tty.h>
#include <linux/tty_driver.h>
#include <linux/tty_flip.h>
#include <linux/module.h>
#include <linux/spinlock.h>
#include <linux/mutex.h>
#include <linux/uaccess.h>
#include <linux/usb.h>
#include <linux/serial.h>
#include <linux/usb/serial.h>
#include "ftdi_sio.h"
#include "ftdi_sio_ids.h" #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Bill Ryder <bryder@sgi.com>, Kuba Ober <kuba@mareimbrium.org>, Andreas Mohr, Johan Hovold <jhovold@gmail.com>"
#define DRIVER_DESC "USB FTDI Serial Converters Driver" struct ftdi_private {
enum ftdi_chip_type chip_type;
/* type of device, either SIO or FT8U232AM */
int baud_base; /* baud base clock for divisor setting */
int custom_divisor; /* custom_divisor kludge, this is for
59 baud_base (different from what goes to the
60 chip!) */
__u16 last_set_data_urb_value ;
/* the last data state set - needed for doing
63 * a break
64 */
int flags; /* some ASYNC_xxxx flags are supported */
unsigned long last_dtr_rts; /* saved modem control outputs */
char prev_status; /* Used for TIOCMIWAIT */
char transmit_empty; /* If transmitter is empty or not */
__u16 interface; /* FT2232C, FT2232H or FT4232H port interface
70 (0 for FT232/245) */ speed_t force_baud; /* if non-zero, force the baud rate to
73 this value */
int force_rtscts; /* if non-zero, force RTS-CTS to always
75 be enabled */ unsigned int latency; /* latency setting in use */
unsigned short max_packet_size;
struct mutex cfg_lock; /* Avoid mess by parallel calls of config ioctl() and change_speed() */
}; /* struct ftdi_sio_quirk is used by devices requiring special attention. */
struct ftdi_sio_quirk {
int (*probe)(struct usb_serial *);
/* Special settings for probed ports. */
void (*port_probe)(struct ftdi_private *);
}; static int ftdi_jtag_probe(struct usb_serial *serial);
static int ftdi_NDI_device_setup(struct usb_serial *serial);
static int ftdi_stmclite_probe(struct usb_serial *serial);
static int ftdi_8u2232c_probe(struct usb_serial *serial);
static void ftdi_USB_UIRT_setup(struct ftdi_private *priv);
static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv); static struct ftdi_sio_quirk ftdi_jtag_quirk = {
.probe = ftdi_jtag_probe,
}; static struct ftdi_sio_quirk ftdi_NDI_device_quirk = {
.probe = ftdi_NDI_device_setup,
}; static struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = {
.port_probe = ftdi_USB_UIRT_setup,
}; static struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = {
.port_probe = ftdi_HE_TIRA1_setup,
}; static struct ftdi_sio_quirk ftdi_stmclite_quirk = {
.probe = ftdi_stmclite_probe,
}; static struct ftdi_sio_quirk ftdi_8u2232c_quirk = {
.probe = ftdi_8u2232c_probe,
}; /*
121 * The 8U232AM has the same API as the sio except for:
122 * - it can support MUCH higher baudrates; up to:
123 * o 921600 for RS232 and 2000000 for RS422/485 at 48MHz
124 * o 230400 at 12MHz
125 * so .. 8U232AM's baudrate setting codes are different
126 * - it has a two byte status code.
127 * - it returns characters every 16ms (the FTDI does it every 40ms)
128 *
129 * the bcdDevice value is used to differentiate FT232BM and FT245BM from
130 * the earlier FT8U232AM and FT8U232BM. For now, include all known VID/PID
131 * combinations in both tables.
132 * FIXME: perhaps bcdDevice can also identify 12MHz FT8U232AM devices,
133 * but I don't know if those ever went into mass production. [Ian Abbott]
134 */ /*
139 * Device ID not listed? Test it using
140 * /sys/bus/usb-serial/drivers/ftdi_sio/new_id and send a patch or report.
141 */
static const struct usb_device_id id_table_combined[] = {
{ USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_BM_ATOM_NANO_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_EV3CON_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_3_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_4_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_5_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_6_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_7_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_USINT_CAT_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_USINT_WKEY_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_USINT_RS232_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_IPLUS2_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_DMX4ALL) },
{ USB_DEVICE(FTDI_VID, FTDI_SIO_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_232RL_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) ,
.driver_info = (kernel_ulong_t)&ftdi_8u2232c_quirk },
{ USB_DEVICE(FTDI_VID, FTDI_4232H_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_232H_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_FTX_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_SNIFFER_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_BOOST_PID) },
{ USB_DEVICE(NEWPORT_VID, NEWPORT_AGILIS_PID) },
{ USB_DEVICE(NEWPORT_VID, NEWPORT_CONEX_CC_PID) },
{ USB_DEVICE(NEWPORT_VID, NEWPORT_CONEX_AGP_PID) },
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
{ USB_DEVICE(FTDI_VID, FTDI_TAGSYS_LP101_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_TAGSYS_P200X_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_LENZ_LIUSB_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_XF_547_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_XF_633_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_XF_631_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_XF_635_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_XF_640_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_XF_642_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_DSS20_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_URBAN_0_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_URBAN_1_PID) },
{ USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_0_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_1_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_2_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_3_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_4_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) },
{ USB_DEVICE(FTDI_VID, FTDI_VARDAAN_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0103_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0104_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0105_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0106_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0107_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0108_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0109_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010A_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010B_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010C_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010D_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010E_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010F_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0110_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0111_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0112_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0113_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0114_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0115_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0116_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0117_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0118_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0119_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011A_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011B_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011C_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011D_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011E_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011F_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0120_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0121_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0122_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0123_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0124_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0125_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0126_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0127_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0128_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0129_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012A_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012B_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012C_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012D_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012E_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012F_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0130_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0131_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0132_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0133_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0134_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0135_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0136_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0137_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0138_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0139_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013A_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013B_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013C_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013D_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013E_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013F_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0140_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0141_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0142_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0143_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0144_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0145_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0146_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0147_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0148_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0149_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014A_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014B_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014C_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014D_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014E_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014F_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0150_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0151_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0152_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0153_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0154_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0155_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0156_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0157_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0158_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0159_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015A_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015B_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015C_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015D_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015E_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015F_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0160_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0161_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0162_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0163_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0164_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0165_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0166_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0167_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0168_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0169_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016A_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016B_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016C_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016D_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016E_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016F_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0170_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0171_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0172_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0173_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0174_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0175_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0176_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0177_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0178_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0179_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017A_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017B_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017C_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017D_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017E_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017F_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0180_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0181_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0182_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0183_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0184_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0185_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0186_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0187_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0188_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0189_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018A_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018B_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018C_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018D_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018E_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018F_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0190_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0191_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0192_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0193_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0194_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0195_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0196_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0197_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0198_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0199_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019A_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019B_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019C_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019D_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019E_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019F_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A0_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A1_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A2_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A3_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A4_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A5_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A6_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A7_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A8_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A9_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AA_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AB_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AC_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AD_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AE_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AF_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B0_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B1_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B2_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B3_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B4_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B5_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B6_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B7_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B8_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B9_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BA_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BB_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BC_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BD_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BE_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BF_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C0_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C1_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C2_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C3_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C4_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C5_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C6_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C7_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C8_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C9_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CA_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CB_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CC_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CD_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CE_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CF_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D0_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D1_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D2_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D3_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D4_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D5_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D6_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D7_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D8_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D9_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DA_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DB_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DC_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DD_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DE_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DF_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E0_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E1_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E2_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E3_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E4_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E5_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E6_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E7_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E8_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E9_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EA_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EB_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EC_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01ED_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EE_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EF_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F0_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F1_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F2_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F3_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F4_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F5_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F6_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F7_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F8_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F9_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FA_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FB_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FC_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FD_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FE_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FF_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_USBX_707_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2104_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2106_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_1_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_2_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_1_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_2_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_1_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_2_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_1_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_2_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_3_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_4_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_1_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_2_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_3_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_4_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_1_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_2_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_3_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_4_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_1_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_2_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_3_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_4_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_5_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_6_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_7_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_8_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_1_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_2_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_3_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_4_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_5_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_6_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_7_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_8_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_1_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_2_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_3_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_4_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_5_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_6_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_7_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_1_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_2_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_3_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_4_PID) },
{ USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) },
{ USB_DEVICE(OCT_VID, OCT_US101_PID) },
{ USB_DEVICE(OCT_VID, OCT_DK201_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_HE_TIRA1_PID),
.driver_info = (kernel_ulong_t)&ftdi_HE_TIRA1_quirk },
{ USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID),
.driver_info = (kernel_ulong_t)&ftdi_USB_UIRT_quirk },
{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_1) },
{ USB_DEVICE(FTDI_VID, PROTEGO_R2X0) },
{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) },
{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_4) },
{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E808_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E809_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80A_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80B_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80C_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80D_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80E_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80F_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E888_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E889_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88A_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88B_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88C_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88D_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88E_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88F_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_UR100_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_ALC8500_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_PYRAMID_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1000PC_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_IBS_US485_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_IBS_PICPRO_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_IBS_PCMCIA_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_IBS_PK1_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_IBS_RS232MON_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_IBS_APP70_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_TAVIR_STK500_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_TIAO_UMPA_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLXM_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
/*
574 * ELV devices:
575 */
{ USB_DEVICE(FTDI_ELV_VID, FTDI_ELV_WS300_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_USR_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_MSM1_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_KL100_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS550_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_EC3000_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS888_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_TWS550_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_FEM_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_CLI7000_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_PPS7330_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_TFM100_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_UDF77_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_UIO88_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_UAD8_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_UDA7_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_USI2_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_T1100_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_PCD200_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_ULA200_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_CSI8_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_EM1000DL_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_PCK100_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_RFP500_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_FS20SIG_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_UTP8_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS444PC_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_EM1010PC_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_HS485_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_UMS100_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_TFD128_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_FM3RX_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS777_PID) },
{ USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) },
{ USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) },
{ USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) },
{ USB_DEVICE(FTDI_VID, LINX_FUTURE_1_PID) },
{ USB_DEVICE(FTDI_VID, LINX_FUTURE_2_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CCSMACHX_2_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CCSLOAD_N_GO_3_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU64_4_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CCSPRIME8_5_PID) },
{ USB_DEVICE(FTDI_VID, INSIDE_ACCESSO) },
{ USB_DEVICE(INTREPID_VID, INTREPID_VALUECAN_PID) },
{ USB_DEVICE(INTREPID_VID, INTREPID_NEOVI_PID) },
{ USB_DEVICE(FALCOM_VID, FALCOM_TWIST_PID) },
{ USB_DEVICE(FALCOM_VID, FALCOM_SAMBA_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SUUNTO_SPORTS_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_OCEANIC_PID) },
{ USB_DEVICE(TTI_VID, TTI_QL355P_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) },
{ USB_DEVICE(ACTON_VID, ACTON_SPECTRAPRO_PID) },
{ USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) },
{ USB_DEVICE(MITSUBISHI_VID, MITSUBISHI_FXUSB_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_USO9ML2_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_USOPTL4_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_USPTL4_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_USO9ML2DR_2_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_USO9ML2DR_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_USOPTL4DR2_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_USOPTL4DR_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_485USB9F_2W_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_485USB9F_4W_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_232USB9M_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_485USBTB_2W_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_485USBTB_4W_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_TTL5USB9M_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_TTL3USB9M_PID) },
{ USB_DEVICE(BANDB_VID, BANDB_ZZ_PROG1_USB_PID) },
{ USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) },
{ USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_3_PID) },
{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_0_PID) },
{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_1_PID) },
{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_2_PID) },
{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_3_PID) },
{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_4_PID) },
{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) },
{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) },
{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) },
{ USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) },
{ USB_DEVICE(XSENS_VID, XSENS_MTW_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_OMNI1509) },
{ USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MHAM_KW_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MHAM_YS_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MHAM_Y6_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MHAM_Y8_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MHAM_IC_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MHAM_DB9_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MHAM_RS232_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MHAM_Y9_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_VCP_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_D2XX_PID) },
{ USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) },
{ USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) },
{ USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HR_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HRC_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16IC_PID) },
{ USB_DEVICE(KOBIL_VID, KOBIL_CONV_B1_PID) },
{ USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) },
{ USB_DEVICE(POSIFLEX_VID, POSIFLEX_PP7000_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_TTUSB_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ECLO_COM_1WIRE_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_777_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_8900F_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_NZR_SEM_USB_PID) },
{ USB_DEVICE(ICOM_VID, ICOM_ID_1_PID) },
{ USB_DEVICE(ICOM_VID, ICOM_OPC_U_UC_PID) },
{ USB_DEVICE(ICOM_VID, ICOM_ID_RP2C1_PID) },
{ USB_DEVICE(ICOM_VID, ICOM_ID_RP2C2_PID) },
{ USB_DEVICE(ICOM_VID, ICOM_ID_RP2D_PID) },
{ USB_DEVICE(ICOM_VID, ICOM_ID_RP2VT_PID) },
{ USB_DEVICE(ICOM_VID, ICOM_ID_RP2VR_PID) },
{ USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVT_PID) },
{ USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVR_PID) },
{ USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVT_PID) },
{ USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVR_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) },
{ USB_DEVICE(TESTO_VID, TESTO_1_PID) },
{ USB_DEVICE(TESTO_VID, TESTO_3_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_GAMMA_SCOUT_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13M_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) },
{ USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_NDI_HUC_PID),
.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
{ USB_DEVICE(FTDI_VID, FTDI_NDI_SPECTRA_SCU_PID),
.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
{ USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_2_PID),
.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
{ USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_3_PID),
.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
{ USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID),
.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
{ USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
{ USB_DEVICE(NOVITUS_VID, NOVITUS_BONO_E_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S03_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_59_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57A_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57B_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29A_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29B_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29F_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62B_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S01_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29C_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_81B_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_82B_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5D_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K4Y_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5G_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S05_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_60_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_61_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63B_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_64_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_65_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92D_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_W5R_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_A5R_PID) },
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_PW1_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) },
{ USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_PROPOX_ISPCABLEIII_PID) },
{ USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(FIC_VID, FIC_NEO1973_DEBUG_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(FTDI_VID, LMI_LM3S_DEVEL_BOARD_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(FTDI_VID, LMI_LM3S_EVAL_BOARD_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(FTDI_VID, LMI_LM3S_ICDI_BOARD_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(FTDI_VID, FTDI_TURTELIZER_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
{ USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) }, /* Papouch devices based on FTDI chip */
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_2_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_2_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_2_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485S_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485C_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_LEC_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB232_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_IRAMP_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK5_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO8x8_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x2_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO10x1_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO30x3_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO60x3_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x16_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO3x32_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK6_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_UPSUSB_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_MU_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_SIMUKEY_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_AD4USB_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMUX_PID) },
{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMSR_PID) }, { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) },
{ USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) },
{ USB_DEVICE(FTDI_VID, DIEBOLD_BCS_SE923_PID) },
{ USB_DEVICE(ATMEL_VID, STK541_PID) },
{ USB_DEVICE(DE_VID, STB_PID) },
{ USB_DEVICE(DE_VID, WHT_PID) },
{ USB_DEVICE(ADI_VID, ADI_GNICE_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE_AND_INTERFACE_INFO(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID,
USB_CLASS_VENDOR_SPEC,
USB_SUBCLASS_VENDOR_SPEC, 0x00) },
{ USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
{ USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) },
{ USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) },
{ USB_DEVICE(FTDI_VID, PI_C865_PID) },
{ USB_DEVICE(FTDI_VID, PI_C857_PID) },
{ USB_DEVICE(PI_VID, PI_C866_PID) },
{ USB_DEVICE(PI_VID, PI_C663_PID) },
{ USB_DEVICE(PI_VID, PI_C725_PID) },
{ USB_DEVICE(PI_VID, PI_E517_PID) },
{ USB_DEVICE(PI_VID, PI_C863_PID) },
{ USB_DEVICE(PI_VID, PI_E861_PID) },
{ USB_DEVICE(PI_VID, PI_C867_PID) },
{ USB_DEVICE(PI_VID, PI_E609_PID) },
{ USB_DEVICE(PI_VID, PI_E709_PID) },
{ USB_DEVICE(PI_VID, PI_100F_PID) },
{ USB_DEVICE(PI_VID, PI_1011_PID) },
{ USB_DEVICE(PI_VID, PI_1012_PID) },
{ USB_DEVICE(PI_VID, PI_1013_PID) },
{ USB_DEVICE(PI_VID, PI_1014_PID) },
{ USB_DEVICE(PI_VID, PI_1015_PID) },
{ USB_DEVICE(PI_VID, PI_1016_PID) },
{ USB_DEVICE(KONDO_VID, KONDO_USB_SERIAL_PID) },
{ USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
{ USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(FTDI_VID, TI_XDS100V2_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) },
{ USB_DEVICE(FTDI_VID, HAMEG_HO720_PID) },
{ USB_DEVICE(FTDI_VID, HAMEG_HO730_PID) },
{ USB_DEVICE(FTDI_VID, HAMEG_HO870_PID) },
{ USB_DEVICE(FTDI_VID, MJSG_GENERIC_PID) },
{ USB_DEVICE(FTDI_VID, MJSG_SR_RADIO_PID) },
{ USB_DEVICE(FTDI_VID, MJSG_HD_RADIO_PID) },
{ USB_DEVICE(FTDI_VID, MJSG_XM_RADIO_PID) },
{ USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_ST_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SLITE_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH2_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH4_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(FTDI_VID, SEGWAY_RMP200_PID) },
{ USB_DEVICE(FTDI_VID, ACCESIO_COM4SM_PID) },
{ USB_DEVICE(IONICS_VID, IONICS_PLUGCOMPUTER_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_24_MASTER_WING_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_PC_WING_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_USB_DMX_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MIDI_TIMECODE_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MINI_WING_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MAXI_WING_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MEDIA_WING_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_WING_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LOGBOOKML_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LS_LOGBOOK_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_HS_LOGBOOK_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CINTERION_MC55I_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) },
{ USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(ST_VID, ST_STMCLT_2232_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(ST_VID, ST_STMCLT_4232_PID),
.driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk },
{ USB_DEVICE(FTDI_VID, FTDI_RF_R106) },
{ USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID),
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
{ USB_DEVICE(FTDI_VID, FTDI_LUMEL_PD12_PID) },
/* Crucible Devices */
{ USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) },
/* Cressi Devices */
{ USB_DEVICE(FTDI_VID, FTDI_CRESSI_PID) },
/* Brainboxes Devices */
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_001_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_012_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_023_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_034_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_101_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_1_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_2_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_3_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_4_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_5_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_6_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_7_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_8_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_257_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_1_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_2_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_3_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_4_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_313_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_324_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_346_1_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_346_2_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_357_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_1_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_2_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_3_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_701_1_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_701_2_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_1_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_2_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_3_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_4_PID) },
/* ekey Devices */
{ USB_DEVICE(FTDI_VID, FTDI_EKEY_CONV_USB_PID) },
/* Infineon Devices */
{ USB_DEVICE_INTERFACE_NUMBER(INFINEON_VID, INFINEON_TRIBOARD_PID, ) },
/* GE Healthcare devices */
{ USB_DEVICE(GE_HEALTHCARE_VID, GE_HEALTHCARE_NEMO_TRACKER_PID) },
{ } /* Terminating entry */
}; MODULE_DEVICE_TABLE(usb, id_table_combined); static const char *ftdi_chip_name[] = {
[SIO] = "SIO", /* the serial part of FT8U100AX */
[FT8U232AM] = "FT8U232AM",
[FT232BM] = "FT232BM",
[FT2232C] = "FT2232C",
[FT232RL] = "FT232RL",
[FT2232H] = "FT2232H",
[FT4232H] = "FT4232H",
[FT232H] = "FT232H",
[FTX] = "FT-X"
}; /* Used for TIOCMIWAIT */
#define FTDI_STATUS_B0_MASK (FTDI_RS0_CTS | FTDI_RS0_DSR | FTDI_RS0_RI | FTDI_RS0_RLSD)
#define FTDI_STATUS_B1_MASK (FTDI_RS_BI)
/* End TIOCMIWAIT */ /* function prototypes for a FTDI serial converter */
static int ftdi_sio_probe(struct usb_serial *serial,
const struct usb_device_id *id);
static int ftdi_sio_port_probe(struct usb_serial_port *port);
static int ftdi_sio_port_remove(struct usb_serial_port *port);
static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port);
static void ftdi_dtr_rts(struct usb_serial_port *port, int on);
static void ftdi_process_read_urb(struct urb *urb);
static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
void *dest, size_t size);
static void ftdi_set_termios(struct tty_struct *tty,
struct usb_serial_port *port, struct ktermios *old);
static int ftdi_tiocmget(struct tty_struct *tty);
static int ftdi_tiocmset(struct tty_struct *tty,
unsigned int set, unsigned int clear);
static int ftdi_ioctl(struct tty_struct *tty,
unsigned int cmd, unsigned long arg);
static void ftdi_break_ctl(struct tty_struct *tty, int break_state);
static bool ftdi_tx_empty(struct usb_serial_port *port);
static int ftdi_get_modem_status(struct usb_serial_port *port,
unsigned char status[]); static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base);
static unsigned short int ftdi_232am_baud_to_divisor(int baud);
static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base);
static __u32 ftdi_232bm_baud_to_divisor(int baud);
static __u32 ftdi_2232h_baud_base_to_divisor(int baud, int base);
static __u32 ftdi_2232h_baud_to_divisor(int baud); static struct usb_serial_driver ftdi_sio_device = {
.driver = {
.owner = THIS_MODULE,
.name = "ftdi_sio",
},
.description = "FTDI USB Serial Device",
.id_table = id_table_combined,
.num_ports = ,
.bulk_in_size = ,
.bulk_out_size = ,
.probe = ftdi_sio_probe,
.port_probe = ftdi_sio_port_probe,
.port_remove = ftdi_sio_port_remove,
.open = ftdi_open,
.dtr_rts = ftdi_dtr_rts,
.throttle = usb_serial_generic_throttle,
.unthrottle = usb_serial_generic_unthrottle,
.process_read_urb = ftdi_process_read_urb,
.prepare_write_buffer = ftdi_prepare_write_buffer,
.tiocmget = ftdi_tiocmget,
.tiocmset = ftdi_tiocmset,
.tiocmiwait = usb_serial_generic_tiocmiwait,
.get_icount = usb_serial_generic_get_icount,
.ioctl = ftdi_ioctl,
.set_termios = ftdi_set_termios,
.break_ctl = ftdi_break_ctl,
.tx_empty = ftdi_tx_empty,
}; static struct usb_serial_driver * const serial_drivers[] = {
&ftdi_sio_device, NULL
}; #define WDR_TIMEOUT 5000 /* default urb timeout */
#define WDR_SHORT_TIMEOUT 1000 /* shorter urb timeout */ /*
1035 * ***************************************************************************
1036 * Utility functions
1037 * ***************************************************************************
1038 */ static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base)
{
unsigned short int divisor;
/* divisor shifted 3 bits to the left */
int divisor3 = base / / baud;
if ((divisor3 & 0x7) == )
divisor3++; /* round x.7/8 up to x+1 */
divisor = divisor3 >> ;
divisor3 &= 0x7;
if (divisor3 == )
divisor |= 0xc000;
else if (divisor3 >= )
divisor |= 0x4000;
else if (divisor3 != )
divisor |= 0x8000;
else if (divisor == )
divisor = ; /* special case for maximum baud rate */
return divisor;
} static unsigned short int ftdi_232am_baud_to_divisor(int baud)
{
return ftdi_232am_baud_base_to_divisor(baud, );
} static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base)
{
static const unsigned char divfrac[] = { , , , , , , , };
__u32 divisor;
/* divisor shifted 3 bits to the left */
int divisor3 = base / / baud;
divisor = divisor3 >> ;
divisor |= (__u32)divfrac[divisor3 & 0x7] << ;
/* Deal with special cases for highest baud rates. */
if (divisor == )
divisor = ;
else if (divisor == 0x4001)
divisor = ;
return divisor;
} static __u32 ftdi_232bm_baud_to_divisor(int baud)
{
return ftdi_232bm_baud_base_to_divisor(baud, );
} static __u32 ftdi_2232h_baud_base_to_divisor(int baud, int base)
{
static const unsigned char divfrac[] = { , , , , , , , };
__u32 divisor;
int divisor3; /* hi-speed baud rate is 10-bit sampling instead of 16-bit */
divisor3 = base * / (baud * ); divisor = divisor3 >> ;
divisor |= (__u32)divfrac[divisor3 & 0x7] << ;
/* Deal with special cases for highest baud rates. */
if (divisor == )
divisor = ;
else if (divisor == 0x4001)
divisor = ;
/*
1103 * Set this bit to turn off a divide by 2.5 on baud rate generator
1104 * This enables baud rates up to 12Mbaud but cannot reach below 1200
1105 * baud with this bit set
1106 */
divisor |= 0x00020000;
return divisor;
} static __u32 ftdi_2232h_baud_to_divisor(int baud)
{
return ftdi_2232h_baud_base_to_divisor(baud, );
} #define set_mctrl(port, set) update_mctrl((port), (set), 0)
#define clear_mctrl(port, clear) update_mctrl((port), 0, (clear)) static int update_mctrl(struct usb_serial_port *port, unsigned int set,
unsigned int clear)
{
struct ftdi_private *priv = usb_get_serial_port_data(port);
struct device *dev = &port->dev;
unsigned urb_value;
int rv; if (((set | clear) & (TIOCM_DTR | TIOCM_RTS)) == ) {
dev_dbg(dev, "%s - DTR|RTS not being set|cleared\n", __func__);
return ; /* no change */
} clear &= ~set; /* 'set' takes precedence over 'clear' */
urb_value = ;
if (clear & TIOCM_DTR)
urb_value |= FTDI_SIO_SET_DTR_LOW;
if (clear & TIOCM_RTS)
urb_value |= FTDI_SIO_SET_RTS_LOW;
if (set & TIOCM_DTR)
urb_value |= FTDI_SIO_SET_DTR_HIGH;
if (set & TIOCM_RTS)
urb_value |= FTDI_SIO_SET_RTS_HIGH;
rv = usb_control_msg(port->serial->dev,
usb_sndctrlpipe(port->serial->dev, ),
FTDI_SIO_SET_MODEM_CTRL_REQUEST,
FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE,
urb_value, priv->interface,
NULL, , WDR_TIMEOUT);
if (rv < ) {
dev_dbg(dev, "%s Error from MODEM_CTRL urb: DTR %s, RTS %s\n",
__func__,
(set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged",
(set & TIOCM_RTS) ? "HIGH" : (clear & TIOCM_RTS) ? "LOW" : "unchanged");
rv = usb_translate_errors(rv);
} else {
dev_dbg(dev, "%s - DTR %s, RTS %s\n", __func__,
(set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged",
(set & TIOCM_RTS) ? "HIGH" : (clear & TIOCM_RTS) ? "LOW" : "unchanged");
/* FIXME: locking on last_dtr_rts */
priv->last_dtr_rts = (priv->last_dtr_rts & ~clear) | set;
}
return rv;
} static __u32 get_ftdi_divisor(struct tty_struct *tty,
struct usb_serial_port *port)
{
struct ftdi_private *priv = usb_get_serial_port_data(port);
struct device *dev = &port->dev;
__u32 div_value = ;
int div_okay = ;
int baud; /*
1175 * The logic involved in setting the baudrate can be cleanly split into
1176 * 3 steps.
1177 * 1. Standard baud rates are set in tty->termios->c_cflag
1178 * 2. If these are not enough, you can set any speed using alt_speed as
1179 * follows:
1180 * - set tty->termios->c_cflag speed to B38400
1181 * - set your real speed in tty->alt_speed; it gets ignored when
1182 * alt_speed==0, (or)
1183 * - call TIOCSSERIAL ioctl with (struct serial_struct) set as
1184 * follows:
1185 * flags & ASYNC_SPD_MASK == ASYNC_SPD_[HI, VHI, SHI, WARP],
1186 * this just sets alt_speed to (HI: 57600, VHI: 115200,
1187 * SHI: 230400, WARP: 460800)
1188 * ** Steps 1, 2 are done courtesy of tty_get_baud_rate
1189 * 3. You can also set baud rate by setting custom divisor as follows
1190 * - set tty->termios->c_cflag speed to B38400
1191 * - call TIOCSSERIAL ioctl with (struct serial_struct) set as
1192 * follows:
1193 * o flags & ASYNC_SPD_MASK == ASYNC_SPD_CUST
1194 * o custom_divisor set to baud_base / your_new_baudrate
1195 * ** Step 3 is done courtesy of code borrowed from serial.c
1196 * I should really spend some time and separate + move this common
1197 * code to serial.c, it is replicated in nearly every serial driver
1198 * you see.
1199 */ /* 1. Get the baud rate from the tty settings, this observes
1202 alt_speed hack */ baud = tty_get_baud_rate(tty);
dev_dbg(dev, "%s - tty_get_baud_rate reports speed %d\n", __func__, baud); /* 2. Observe async-compatible custom_divisor hack, update baudrate
1208 if needed */ if (baud == &&
((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
(priv->custom_divisor)) {
baud = priv->baud_base / priv->custom_divisor;
dev_dbg(dev, "%s - custom divisor %d sets baud rate to %d\n",
__func__, priv->custom_divisor, baud);
} /* 3. Convert baudrate to device-specific divisor */ if (!baud)
baud = ;
switch (priv->chip_type) {
case SIO: /* SIO chip */
switch (baud) {
case : div_value = ftdi_sio_b300; break;
case : div_value = ftdi_sio_b600; break;
case : div_value = ftdi_sio_b1200; break;
case : div_value = ftdi_sio_b2400; break;
case : div_value = ftdi_sio_b4800; break;
case : div_value = ftdi_sio_b9600; break;
case : div_value = ftdi_sio_b19200; break;
case : div_value = ftdi_sio_b38400; break;
case : div_value = ftdi_sio_b57600; break;
case : div_value = ftdi_sio_b115200; break;
} /* baud */
if (div_value == ) {
dev_dbg(dev, "%s - Baudrate (%d) requested is not supported\n",
__func__, baud);
div_value = ftdi_sio_b9600;
baud = ;
div_okay = ;
}
break;
case FT8U232AM: /* 8U232AM chip */
if (baud <= ) {
div_value = ftdi_232am_baud_to_divisor(baud);
} else {
dev_dbg(dev, "%s - Baud rate too high!\n", __func__);
baud = ;
div_value = ftdi_232am_baud_to_divisor();
div_okay = ;
}
break;
case FT232BM: /* FT232BM chip */
case FT2232C: /* FT2232C chip */
case FT232RL: /* FT232RL chip */
case FTX: /* FT-X series */
if (baud <= ) {
__u16 product_id = le16_to_cpu(
port->serial->dev->descriptor.idProduct);
if (((FTDI_NDI_HUC_PID == product_id) ||
(FTDI_NDI_SPECTRA_SCU_PID == product_id) ||
(FTDI_NDI_FUTURE_2_PID == product_id) ||
(FTDI_NDI_FUTURE_3_PID == product_id) ||
(FTDI_NDI_AURORA_SCU_PID == product_id)) &&
(baud == )) {
baud = ;
}
div_value = ftdi_232bm_baud_to_divisor(baud);
} else {
dev_dbg(dev, "%s - Baud rate too high!\n", __func__);
div_value = ftdi_232bm_baud_to_divisor();
div_okay = ;
baud = ;
}
break;
case FT2232H: /* FT2232H chip */
case FT4232H: /* FT4232H chip */
case FT232H: /* FT232H chip */
if ((baud <= ) && (baud >= )) {
div_value = ftdi_2232h_baud_to_divisor(baud);
} else if (baud < ) {
div_value = ftdi_232bm_baud_to_divisor(baud);
} else {
dev_dbg(dev, "%s - Baud rate too high!\n", __func__);
div_value = ftdi_232bm_baud_to_divisor();
div_okay = ;
baud = ;
}
break;
} /* priv->chip_type */ if (div_okay) {
dev_dbg(dev, "%s - Baud rate set to %d (divisor 0x%lX) on chip %s\n",
__func__, baud, (unsigned long)div_value,
ftdi_chip_name[priv->chip_type]);
} tty_encode_baud_rate(tty, baud, baud);
return div_value;
} static int change_speed(struct tty_struct *tty, struct usb_serial_port *port)
{
struct ftdi_private *priv = usb_get_serial_port_data(port);
__u16 urb_value;
__u16 urb_index;
__u32 urb_index_value;
int rv; urb_index_value = get_ftdi_divisor(tty, port);
urb_value = (__u16)urb_index_value;
urb_index = (__u16)(urb_index_value >> );
if ((priv->chip_type == FT2232C) || (priv->chip_type == FT2232H) ||
(priv->chip_type == FT4232H) || (priv->chip_type == FT232H)) {
/* Probably the BM type needs the MSB of the encoded fractional
1317 * divider also moved like for the chips above. Any infos? */
urb_index = (__u16)((urb_index << ) | priv->interface);
} rv = usb_control_msg(port->serial->dev,
usb_sndctrlpipe(port->serial->dev, ),
FTDI_SIO_SET_BAUDRATE_REQUEST,
FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE,
urb_value, urb_index,
NULL, , WDR_SHORT_TIMEOUT);
return rv;
} static int write_latency_timer(struct usb_serial_port *port)
{
struct ftdi_private *priv = usb_get_serial_port_data(port);
struct usb_device *udev = port->serial->dev;
int rv;
int l = priv->latency; if (priv->flags & ASYNC_LOW_LATENCY)
l = ; dev_dbg(&port->dev, "%s: setting latency timer = %i\n", __func__, l); rv = usb_control_msg(udev,
usb_sndctrlpipe(udev, ),
FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
l, priv->interface,
NULL, , WDR_TIMEOUT);
if (rv < )
dev_err(&port->dev, "Unable to write latency timer: %i\n", rv);
return rv;
} static int read_latency_timer(struct usb_serial_port *port)
{
struct ftdi_private *priv = usb_get_serial_port_data(port);
struct usb_device *udev = port->serial->dev;
unsigned char *buf;
int rv; buf = kmalloc(, GFP_KERNEL);
if (!buf)
return -ENOMEM; rv = usb_control_msg(udev,
usb_rcvctrlpipe(udev, ),
FTDI_SIO_GET_LATENCY_TIMER_REQUEST,
FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE,
, priv->interface,
buf, , WDR_TIMEOUT);
if (rv < )
dev_err(&port->dev, "Unable to read latency timer: %i\n", rv);
else
priv->latency = buf[]; kfree(buf); return rv;
} static int get_serial_info(struct usb_serial_port *port,
struct serial_struct __user *retinfo)
{
struct ftdi_private *priv = usb_get_serial_port_data(port);
struct serial_struct tmp; if (!retinfo)
return -EFAULT;
memset(&tmp, , sizeof(tmp));
tmp.flags = priv->flags;
tmp.baud_base = priv->baud_base;
tmp.custom_divisor = priv->custom_divisor;
if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
return -EFAULT;
return ;
} static int set_serial_info(struct tty_struct *tty,
struct usb_serial_port *port, struct serial_struct __user *newinfo)
{
struct ftdi_private *priv = usb_get_serial_port_data(port);
struct serial_struct new_serial;
struct ftdi_private old_priv; if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
return -EFAULT; mutex_lock(&priv->cfg_lock);
old_priv = *priv; /* Do error checking and permission checking */ if (!capable(CAP_SYS_ADMIN)) {
if (((new_serial.flags & ~ASYNC_USR_MASK) !=
(priv->flags & ~ASYNC_USR_MASK))) {
mutex_unlock(&priv->cfg_lock);
return -EPERM;
}
priv->flags = ((priv->flags & ~ASYNC_USR_MASK) |
(new_serial.flags & ASYNC_USR_MASK));
priv->custom_divisor = new_serial.custom_divisor;
goto check_and_exit;
} if (new_serial.baud_base != priv->baud_base) {
mutex_unlock(&priv->cfg_lock);
return -EINVAL;
} /* Make the changes - these are privileged changes! */ priv->flags = ((priv->flags & ~ASYNC_FLAGS) |
(new_serial.flags & ASYNC_FLAGS));
priv->custom_divisor = new_serial.custom_divisor; write_latency_timer(port); check_and_exit:
if ((old_priv.flags & ASYNC_SPD_MASK) !=
(priv->flags & ASYNC_SPD_MASK)) {
if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
tty->alt_speed = ;
else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
tty->alt_speed = ;
else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
tty->alt_speed = ;
else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
tty->alt_speed = ;
else
tty->alt_speed = ;
}
if (((old_priv.flags & ASYNC_SPD_MASK) !=
(priv->flags & ASYNC_SPD_MASK)) ||
(((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
(old_priv.custom_divisor != priv->custom_divisor))) {
change_speed(tty, port);
mutex_unlock(&priv->cfg_lock);
}
else
mutex_unlock(&priv->cfg_lock);
return ;
} static int get_lsr_info(struct usb_serial_port *port,
struct serial_struct __user *retinfo)
{
struct ftdi_private *priv = usb_get_serial_port_data(port);
unsigned int result = ; if (!retinfo)
return -EFAULT; if (priv->transmit_empty)
result = TIOCSER_TEMT; if (copy_to_user(retinfo, &result, sizeof(unsigned int)))
return -EFAULT;
return ;
} /* Determine type of FTDI chip based on USB config and descriptor. */
static void ftdi_determine_type(struct usb_serial_port *port)
{
struct ftdi_private *priv = usb_get_serial_port_data(port);
struct usb_serial *serial = port->serial;
struct usb_device *udev = serial->dev;
unsigned version;
unsigned interfaces; /* Assume it is not the original SIO device for now. */
priv->baud_base = / ; version = le16_to_cpu(udev->descriptor.bcdDevice);
interfaces = udev->actconfig->desc.bNumInterfaces;
dev_dbg(&port->dev, "%s: bcdDevice = 0x%x, bNumInterfaces = %u\n", __func__,
version, interfaces);
if (interfaces > ) {
int inter; /* Multiple interfaces.*/
if (version == 0x0800) {
priv->chip_type = FT4232H;
/* Hi-speed - baud clock runs at 120MHz */
priv->baud_base = / ;
} else if (version == 0x0700) {
priv->chip_type = FT2232H;
/* Hi-speed - baud clock runs at 120MHz */
priv->baud_base = / ;
} else
priv->chip_type = FT2232C; /* Determine interface code. */
inter = serial->interface->altsetting->desc.bInterfaceNumber;
if (inter == ) {
priv->interface = INTERFACE_A;
} else if (inter == ) {
priv->interface = INTERFACE_B;
} else if (inter == ) {
priv->interface = INTERFACE_C;
} else if (inter == ) {
priv->interface = INTERFACE_D;
}
/* BM-type devices have a bug where bcdDevice gets set
1524 * to 0x200 when iSerialNumber is 0. */
if (version < 0x500) {
dev_dbg(&port->dev,
"%s: something fishy - bcdDevice too low for multi-interface device\n",
__func__);
}
} else if (version < 0x200) {
/* Old device. Assume it's the original SIO. */
priv->chip_type = SIO;
priv->baud_base = / ;
} else if (version < 0x400) {
/* Assume it's an FT8U232AM (or FT8U245AM) */
/* (It might be a BM because of the iSerialNumber bug,
1537 * but it will still work as an AM device.) */
priv->chip_type = FT8U232AM;
} else if (version < 0x600) {
/* Assume it's an FT232BM (or FT245BM) */
priv->chip_type = FT232BM;
} else if (version < 0x900) {
/* Assume it's an FT232RL */
priv->chip_type = FT232RL;
} else if (version < 0x1000) {
/* Assume it's an FT232H */
priv->chip_type = FT232H;
} else {
/* Assume it's an FT-X series device */
priv->chip_type = FTX;
} dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]);
} /*
1558 * Determine the maximum packet size for the device. This depends on the chip
1559 * type and the USB host capabilities. The value should be obtained from the
1560 * device descriptor as the chip will use the appropriate values for the host.
1561 */
static void ftdi_set_max_packet_size(struct usb_serial_port *port)
{
struct ftdi_private *priv = usb_get_serial_port_data(port);
struct usb_interface *interface = port->serial->interface;
struct usb_endpoint_descriptor *ep_desc;
unsigned num_endpoints;
unsigned i; num_endpoints = interface->cur_altsetting->desc.bNumEndpoints;
if (!num_endpoints)
return; /*
1575 * NOTE: Some customers have programmed FT232R/FT245R devices
1576 * with an endpoint size of 0 - not good. In this case, we
1577 * want to override the endpoint descriptor setting and use a
1578 * value of 64 for wMaxPacketSize.
1579 */
for (i = ; i < num_endpoints; i++) {
ep_desc = &interface->cur_altsetting->endpoint[i].desc;
if (!ep_desc->wMaxPacketSize) {
ep_desc->wMaxPacketSize = cpu_to_le16(0x40);
dev_warn(&port->dev, "Overriding wMaxPacketSize on endpoint %d\n",
usb_endpoint_num(ep_desc));
}
} /* Set max packet size based on last descriptor. */
priv->max_packet_size = usb_endpoint_maxp(ep_desc);
} /*
1595 * ***************************************************************************
1596 * Sysfs Attribute
1597 * ***************************************************************************
1598 */ static ssize_t latency_timer_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct usb_serial_port *port = to_usb_serial_port(dev);
struct ftdi_private *priv = usb_get_serial_port_data(port);
if (priv->flags & ASYNC_LOW_LATENCY)
return sprintf(buf, "1\n");
else
return sprintf(buf, "%i\n", priv->latency);
} /* Write a new value of the latency timer, in units of milliseconds. */
static ssize_t latency_timer_store(struct device *dev,
struct device_attribute *attr,
const char *valbuf, size_t count)
{
struct usb_serial_port *port = to_usb_serial_port(dev);
struct ftdi_private *priv = usb_get_serial_port_data(port);
int v = simple_strtoul(valbuf, NULL, );
int rv; priv->latency = v;
rv = write_latency_timer(port);
if (rv < )
return -EIO;
return count;
}
static DEVICE_ATTR_RW(latency_timer); /* Write an event character directly to the FTDI register. The ASCII
1630 value is in the low 8 bits, with the enable bit in the 9th bit. */
static ssize_t store_event_char(struct device *dev,
struct device_attribute *attr, const char *valbuf, size_t count)
{
struct usb_serial_port *port = to_usb_serial_port(dev);
struct ftdi_private *priv = usb_get_serial_port_data(port);
struct usb_device *udev = port->serial->dev;
int v = simple_strtoul(valbuf, NULL, );
int rv; dev_dbg(&port->dev, "%s: setting event char = %i\n", __func__, v); rv = usb_control_msg(udev,
usb_sndctrlpipe(udev, ),
FTDI_SIO_SET_EVENT_CHAR_REQUEST,
FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE,
v, priv->interface,
NULL, , WDR_TIMEOUT);
if (rv < ) {
dev_dbg(&port->dev, "Unable to write event character: %i\n", rv);
return -EIO;
} return count;
}
static DEVICE_ATTR(event_char, S_IWUSR, NULL, store_event_char); static int create_sysfs_attrs(struct usb_serial_port *port)
{
struct ftdi_private *priv = usb_get_serial_port_data(port);
int retval = ; /* XXX I've no idea if the original SIO supports the event_char
1663 * sysfs parameter, so I'm playing it safe. */
if (priv->chip_type != SIO) {
dev_dbg(&port->dev, "sysfs attributes for %s\n", ftdi_chip_name[priv->chip_type]);
retval = device_create_file(&port->dev, &dev_attr_event_char);
if ((!retval) &&
(priv->chip_type == FT232BM ||
priv->chip_type == FT2232C ||
priv->chip_type == FT232RL ||
priv->chip_type == FT2232H ||
priv->chip_type == FT4232H ||
priv->chip_type == FT232H ||
priv->chip_type == FTX)) {
retval = device_create_file(&port->dev,
&dev_attr_latency_timer);
}
}
return retval;
} static void remove_sysfs_attrs(struct usb_serial_port *port)
{
struct ftdi_private *priv = usb_get_serial_port_data(port); /* XXX see create_sysfs_attrs */
if (priv->chip_type != SIO) {
device_remove_file(&port->dev, &dev_attr_event_char);
if (priv->chip_type == FT232BM ||
priv->chip_type == FT2232C ||
priv->chip_type == FT232RL ||
priv->chip_type == FT2232H ||
priv->chip_type == FT4232H ||
priv->chip_type == FT232H ||
priv->chip_type == FTX) {
device_remove_file(&port->dev, &dev_attr_latency_timer);
}
} } /*
1703 * ***************************************************************************
1704 * FTDI driver specific functions
1705 * ***************************************************************************
1706 */ /* Probe function to check for special devices */
static int ftdi_sio_probe(struct usb_serial *serial,
const struct usb_device_id *id)
{
struct ftdi_sio_quirk *quirk =
(struct ftdi_sio_quirk *)id->driver_info; if (quirk && quirk->probe) {
int ret = quirk->probe(serial);
if (ret != )
return ret;
} usb_set_serial_data(serial, (void *)id->driver_info); return ;
} static int ftdi_sio_port_probe(struct usb_serial_port *port)
{
struct ftdi_private *priv;
struct ftdi_sio_quirk *quirk = usb_get_serial_data(port->serial); priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL);
if (!priv)
return -ENOMEM; mutex_init(&priv->cfg_lock); priv->flags = ASYNC_LOW_LATENCY; if (quirk && quirk->port_probe)
quirk->port_probe(priv); usb_set_serial_port_data(port, priv); ftdi_determine_type(port);
ftdi_set_max_packet_size(port);
if (read_latency_timer(port) < )
priv->latency = ;
write_latency_timer(port);
create_sysfs_attrs(port);
return ;
} /* Setup for the USB-UIRT device, which requires hardwired
1755 * baudrate (38400 gets mapped to 312500) */
/* Called from usbserial:serial_probe */
static void ftdi_USB_UIRT_setup(struct ftdi_private *priv)
{
priv->flags |= ASYNC_SPD_CUST;
priv->custom_divisor = ;
priv->force_baud = ;
} /* Setup for the HE-TIRA1 device, which requires hardwired
1765 * baudrate (38400 gets mapped to 100000) and RTS-CTS enabled. */ static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv)
{
priv->flags |= ASYNC_SPD_CUST;
priv->custom_divisor = ;
priv->force_baud = ;
priv->force_rtscts = ;
} /*
1776 * Module parameter to control latency timer for NDI FTDI-based USB devices.
1777 * If this value is not set in /etc/modprobe.d/ its value will be set
1778 * to 1ms.
1779 */
static int ndi_latency_timer = ; /* Setup for the NDI FTDI-based USB devices, which requires hardwired
1783 * baudrate (19200 gets mapped to 1200000).
1784 *
1785 * Called from usbserial:serial_probe.
1786 */
static int ftdi_NDI_device_setup(struct usb_serial *serial)
{
struct usb_device *udev = serial->dev;
int latency = ndi_latency_timer; if (latency == )
latency = ;
if (latency > )
latency = ; dev_dbg(&udev->dev, "%s setting NDI device latency to %d\n", __func__, latency);
dev_info(&udev->dev, "NDI device with a latency value of %d\n", latency); /* FIXME: errors are not returned */
usb_control_msg(udev, usb_sndctrlpipe(udev, ),
FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
latency, , NULL, , WDR_TIMEOUT);
return ;
} /*
1809 * First port on JTAG adaptors such as Olimex arm-usb-ocd or the FIC/OpenMoko
1810 * Neo1973 Debug Board is reserved for JTAG interface and can be accessed from
1811 * userspace using openocd.
1812 */
static int ftdi_jtag_probe(struct usb_serial *serial)
{
struct usb_device *udev = serial->dev;
struct usb_interface *interface = serial->interface; if (interface == udev->actconfig->interface[]) {
dev_info(&udev->dev,
"Ignoring serial port reserved for JTAG\n");
return -ENODEV;
} return ;
} static int ftdi_8u2232c_probe(struct usb_serial *serial)
{
struct usb_device *udev = serial->dev; if ((udev->manufacturer && !strcmp(udev->manufacturer, "CALAO Systems")) ||
(udev->product && !strcmp(udev->product, "BeagleBone/XDS100V2")))
return ftdi_jtag_probe(serial); return ;
} /*
1839 * First two ports on JTAG adaptors using an FT4232 such as STMicroelectronics's
1840 * ST Micro Connect Lite are reserved for JTAG or other non-UART interfaces and
1841 * can be accessed from userspace.
1842 * The next two ports are enabled as UARTs by default, where port 2 is
1843 * a conventional RS-232 UART.
1844 */
static int ftdi_stmclite_probe(struct usb_serial *serial)
{
struct usb_device *udev = serial->dev;
struct usb_interface *interface = serial->interface; if (interface == udev->actconfig->interface[] ||
interface == udev->actconfig->interface[]) {
dev_info(&udev->dev, "Ignoring serial port reserved for JTAG\n");
return -ENODEV;
} return ;
} static int ftdi_sio_port_remove(struct usb_serial_port *port)
{
struct ftdi_private *priv = usb_get_serial_port_data(port); remove_sysfs_attrs(port); kfree(priv); return ;
} static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port)
{
struct usb_device *dev = port->serial->dev;
struct ftdi_private *priv = usb_get_serial_port_data(port); /* No error checking for this (will get errors later anyway) */
/* See ftdi_sio.h for description of what is reset */
usb_control_msg(dev, usb_sndctrlpipe(dev, ),
FTDI_SIO_RESET_REQUEST, FTDI_SIO_RESET_REQUEST_TYPE,
FTDI_SIO_RESET_SIO,
priv->interface, NULL, , WDR_TIMEOUT); /* Termios defaults are set by usb_serial_init. We don't change
1883 port->tty->termios - this would lose speed settings, etc.
1884 This is same behaviour as serial.c/rs_open() - Kuba */ /* ftdi_set_termios will send usb control messages */
if (tty)
ftdi_set_termios(tty, port, NULL); return usb_serial_generic_open(tty, port);
} static void ftdi_dtr_rts(struct usb_serial_port *port, int on)
{
struct ftdi_private *priv = usb_get_serial_port_data(port); /* Disable flow control */
if (!on) {
if (usb_control_msg(port->serial->dev,
usb_sndctrlpipe(port->serial->dev, ),
FTDI_SIO_SET_FLOW_CTRL_REQUEST,
FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
, priv->interface, NULL, ,
WDR_TIMEOUT) < ) {
dev_err(&port->dev, "error from flowcontrol urb\n");
}
}
/* drop RTS and DTR */
if (on)
set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
else
clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
} /* The SIO requires the first byte to have:
1916 * B0 1
1917 * B1 0
1918 * B2..7 length of message excluding byte 0
1919 *
1920 * The new devices do not require this byte
1921 */
static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
void *dest, size_t size)
{
struct ftdi_private *priv;
int count;
unsigned long flags; priv = usb_get_serial_port_data(port); if (priv->chip_type == SIO) {
unsigned char *buffer = dest;
int i, len, c; count = ;
spin_lock_irqsave(&port->lock, flags);
for (i = ; i < size - ; i += priv->max_packet_size) {
len = min_t(int, size - i, priv->max_packet_size) - ;
c = kfifo_out(&port->write_fifo, &buffer[i + ], len);
if (!c)
break;
port->icount.tx += c;
buffer[i] = (c << ) + ;
count += c + ;
}
spin_unlock_irqrestore(&port->lock, flags);
} else {
count = kfifo_out_locked(&port->write_fifo, dest, size,
&port->lock);
port->icount.tx += count;
} return count;
} #define FTDI_RS_ERR_MASK (FTDI_RS_BI | FTDI_RS_PE | FTDI_RS_FE | FTDI_RS_OE) static int ftdi_process_packet(struct usb_serial_port *port,
struct ftdi_private *priv, char *packet, int len)
{
int i;
char status;
char flag;
char *ch; if (len < ) {
dev_dbg(&port->dev, "malformed packet\n");
return ;
} /* Compare new line status to the old one, signal if different/
1972 N.B. packet may be processed more than once, but differences
1973 are only processed once. */
status = packet[] & FTDI_STATUS_B0_MASK;
if (status != priv->prev_status) {
char diff_status = status ^ priv->prev_status; if (diff_status & FTDI_RS0_CTS)
port->icount.cts++;
if (diff_status & FTDI_RS0_DSR)
port->icount.dsr++;
if (diff_status & FTDI_RS0_RI)
port->icount.rng++;
if (diff_status & FTDI_RS0_RLSD) {
struct tty_struct *tty; port->icount.dcd++;
tty = tty_port_tty_get(&port->port);
if (tty)
usb_serial_handle_dcd_change(port, tty,
status & FTDI_RS0_RLSD);
tty_kref_put(tty);
} wake_up_interruptible(&port->port.delta_msr_wait);
priv->prev_status = status;
} flag = TTY_NORMAL;
if (packet[] & FTDI_RS_ERR_MASK) {
/* Break takes precedence over parity, which takes precedence
2002 * over framing errors */
if (packet[] & FTDI_RS_BI) {
flag = TTY_BREAK;
port->icount.brk++;
usb_serial_handle_break(port);
} else if (packet[] & FTDI_RS_PE) {
flag = TTY_PARITY;
port->icount.parity++;
} else if (packet[] & FTDI_RS_FE) {
flag = TTY_FRAME;
port->icount.frame++;
}
/* Overrun is special, not associated with a char */
if (packet[] & FTDI_RS_OE) {
port->icount.overrun++;
tty_insert_flip_char(&port->port, , TTY_OVERRUN);
}
} /* save if the transmitter is empty or not */
if (packet[] & FTDI_RS_TEMT)
priv->transmit_empty = ;
else
priv->transmit_empty = ; len -= ;
if (!len)
return ; /* status only */
port->icount.rx += len;
ch = packet + ; if (port->port.console && port->sysrq) {
for (i = ; i < len; i++, ch++) {
if (!usb_serial_handle_sysrq_char(port, *ch))
tty_insert_flip_char(&port->port, *ch, flag);
}
} else {
tty_insert_flip_string_fixed_flag(&port->port, ch, flag, len);
} return len;
} static void ftdi_process_read_urb(struct urb *urb)
{
struct usb_serial_port *port = urb->context;
struct ftdi_private *priv = usb_get_serial_port_data(port);
char *data = (char *)urb->transfer_buffer;
int i;
int len;
int count = ; for (i = ; i < urb->actual_length; i += priv->max_packet_size) {
len = min_t(int, urb->actual_length - i, priv->max_packet_size);
count += ftdi_process_packet(port, priv, &data[i], len);
} if (count)
tty_flip_buffer_push(&port->port);
} static void ftdi_break_ctl(struct tty_struct *tty, int break_state)
{
struct usb_serial_port *port = tty->driver_data;
struct ftdi_private *priv = usb_get_serial_port_data(port);
__u16 urb_value; /* break_state = -1 to turn on break, and 0 to turn off break */
/* see drivers/char/tty_io.c to see it used */
/* last_set_data_urb_value NEVER has the break bit set in it */ if (break_state)
urb_value = priv->last_set_data_urb_value | FTDI_SIO_SET_BREAK;
else
urb_value = priv->last_set_data_urb_value; if (usb_control_msg(port->serial->dev,
usb_sndctrlpipe(port->serial->dev, ),
FTDI_SIO_SET_DATA_REQUEST,
FTDI_SIO_SET_DATA_REQUEST_TYPE,
urb_value , priv->interface,
NULL, , WDR_TIMEOUT) < ) {
dev_err(&port->dev, "%s FAILED to enable/disable break state (state was %d)\n",
__func__, break_state);
} dev_dbg(&port->dev, "%s break state is %d - urb is %d\n", __func__,
break_state, urb_value); } static bool ftdi_tx_empty(struct usb_serial_port *port)
{
unsigned char buf[];
int ret; ret = ftdi_get_modem_status(port, buf);
if (ret == ) {
if (!(buf[] & FTDI_RS_TEMT))
return false;
} return true;
} /* old_termios contains the original termios settings and tty->termios contains
2108 * the new setting to be used
2109 * WARNING: set_termios calls this with old_termios in kernel space
2110 */
static void ftdi_set_termios(struct tty_struct *tty,
struct usb_serial_port *port, struct ktermios *old_termios)
{
struct usb_device *dev = port->serial->dev;
struct device *ddev = &port->dev;
struct ftdi_private *priv = usb_get_serial_port_data(port);
struct ktermios *termios = &tty->termios;
unsigned int cflag = termios->c_cflag;
__u16 urb_value; /* will hold the new flags */ /* Added for xon/xoff support */
unsigned int iflag = termios->c_iflag;
unsigned char vstop;
unsigned char vstart; /* Force baud rate if this device requires it, unless it is set to
2127 B0. */
if (priv->force_baud && ((termios->c_cflag & CBAUD) != B0)) {
dev_dbg(ddev, "%s: forcing baud rate for this device\n", __func__);
tty_encode_baud_rate(tty, priv->force_baud,
priv->force_baud);
} /* Force RTS-CTS if this device requires it. */
if (priv->force_rtscts) {
dev_dbg(ddev, "%s: forcing rtscts for this device\n", __func__);
termios->c_cflag |= CRTSCTS;
} /*
2141 * All FTDI UART chips are limited to CS7/8. We shouldn't pretend to
2142 * support CS5/6 and revert the CSIZE setting instead.
2143 *
2144 * CS5 however is used to control some smartcard readers which abuse
2145 * this limitation to switch modes. Original FTDI chips fall back to
2146 * eight data bits.
2147 *
2148 * TODO: Implement a quirk to only allow this with mentioned
2149 * readers. One I know of (Argolis Smartreader V1)
2150 * returns "USB smartcard server" as iInterface string.
2151 * The vendor didn't bother with a custom VID/PID of
2152 * course.
2153 */
if (C_CSIZE(tty) == CS6) {
dev_warn(ddev, "requested CSIZE setting not supported\n"); termios->c_cflag &= ~CSIZE;
if (old_termios)
termios->c_cflag |= old_termios->c_cflag & CSIZE;
else
termios->c_cflag |= CS8;
} cflag = termios->c_cflag; if (!old_termios)
goto no_skip; if (old_termios->c_cflag == termios->c_cflag
&& old_termios->c_ispeed == termios->c_ispeed
&& old_termios->c_ospeed == termios->c_ospeed)
goto no_c_cflag_changes; /* NOTE These routines can get interrupted by
2175 ftdi_sio_read_bulk_callback - need to examine what this means -
2176 don't see any problems yet */ if ((old_termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)) ==
(termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)))
goto no_data_parity_stop_changes; no_skip:
/* Set number of data bits, parity, stop bits */ urb_value = ;
urb_value |= (cflag & CSTOPB ? FTDI_SIO_SET_DATA_STOP_BITS_2 :
FTDI_SIO_SET_DATA_STOP_BITS_1);
if (cflag & PARENB) {
if (cflag & CMSPAR)
urb_value |= cflag & PARODD ?
FTDI_SIO_SET_DATA_PARITY_MARK :
FTDI_SIO_SET_DATA_PARITY_SPACE;
else
urb_value |= cflag & PARODD ?
FTDI_SIO_SET_DATA_PARITY_ODD :
FTDI_SIO_SET_DATA_PARITY_EVEN;
} else {
urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE;
}
switch (cflag & CSIZE) {
case CS5:
dev_dbg(ddev, "Setting CS5 quirk\n");
break;
case CS7:
urb_value |= ;
dev_dbg(ddev, "Setting CS7\n");
break;
default:
case CS8:
urb_value |= ;
dev_dbg(ddev, "Setting CS8\n");
break;
} /* This is needed by the break command since it uses the same command
2216 - but is or'ed with this value */
priv->last_set_data_urb_value = urb_value; if (usb_control_msg(dev, usb_sndctrlpipe(dev, ),
FTDI_SIO_SET_DATA_REQUEST,
FTDI_SIO_SET_DATA_REQUEST_TYPE,
urb_value , priv->interface,
NULL, , WDR_SHORT_TIMEOUT) < ) {
dev_err(ddev, "%s FAILED to set databits/stopbits/parity\n",
__func__);
} /* Now do the baudrate */
no_data_parity_stop_changes:
if ((cflag & CBAUD) == B0) {
/* Disable flow control */
if (usb_control_msg(dev, usb_sndctrlpipe(dev, ),
FTDI_SIO_SET_FLOW_CTRL_REQUEST,
FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
, priv->interface,
NULL, , WDR_TIMEOUT) < ) {
dev_err(ddev, "%s error from disable flowcontrol urb\n",
__func__);
}
/* Drop RTS and DTR */
clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
} else {
/* set the baudrate determined before */
mutex_lock(&priv->cfg_lock);
if (change_speed(tty, port))
dev_err(ddev, "%s urb failed to set baudrate\n", __func__);
mutex_unlock(&priv->cfg_lock);
/* Ensure RTS and DTR are raised when baudrate changed from 0 */
if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
} /* Set flow control */
/* Note device also supports DTR/CD (ugh) and Xon/Xoff in hardware */
no_c_cflag_changes:
if (cflag & CRTSCTS) {
dev_dbg(ddev, "%s Setting to CRTSCTS flow control\n", __func__);
if (usb_control_msg(dev,
usb_sndctrlpipe(dev, ),
FTDI_SIO_SET_FLOW_CTRL_REQUEST,
FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
, (FTDI_SIO_RTS_CTS_HS | priv->interface),
NULL, , WDR_TIMEOUT) < ) {
dev_err(ddev, "urb failed to set to rts/cts flow control\n");
}
} else {
/*
2268 * Xon/Xoff code
2269 *
2270 * Check the IXOFF status in the iflag component of the
2271 * termios structure. If IXOFF is not set, the pre-xon/xoff
2272 * code is executed.
2273 */
if (iflag & IXOFF) {
dev_dbg(ddev, "%s request to enable xonxoff iflag=%04x\n",
__func__, iflag);
/* Try to enable the XON/XOFF on the ftdi_sio
2278 * Set the vstart and vstop -- could have been done up
2279 * above where a lot of other dereferencing is done but
2280 * that would be very inefficient as vstart and vstop
2281 * are not always needed.
2282 */
vstart = termios->c_cc[VSTART];
vstop = termios->c_cc[VSTOP];
urb_value = (vstop << ) | (vstart); if (usb_control_msg(dev,
usb_sndctrlpipe(dev, ),
FTDI_SIO_SET_FLOW_CTRL_REQUEST,
FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
urb_value , (FTDI_SIO_XON_XOFF_HS
| priv->interface),
NULL, , WDR_TIMEOUT) < ) {
dev_err(&port->dev, "urb failed to set to "
"xon/xoff flow control\n");
}
} else {
/* else clause to only run if cflag ! CRTSCTS and iflag
2299 * ! XOFF. CHECKME Assuming XON/XOFF handled by tty
2300 * stack - not by device */
dev_dbg(ddev, "%s Turning off hardware flow control\n", __func__);
if (usb_control_msg(dev,
usb_sndctrlpipe(dev, ),
FTDI_SIO_SET_FLOW_CTRL_REQUEST,
FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
, priv->interface,
NULL, , WDR_TIMEOUT) < ) {
dev_err(ddev, "urb failed to clear flow control\n");
}
}
}
} /*
2315 * Get modem-control status.
2316 *
2317 * Returns the number of status bytes retrieved (device dependant), or
2318 * negative error code.
2319 */
static int ftdi_get_modem_status(struct usb_serial_port *port,
unsigned char status[])
{
struct ftdi_private *priv = usb_get_serial_port_data(port);
unsigned char *buf;
int len;
int ret; buf = kmalloc(, GFP_KERNEL);
if (!buf)
return -ENOMEM;
/*
2332 * The 8U232AM returns a two byte value (the SIO a 1 byte value) in
2333 * the same format as the data returned from the in point.
2334 */
switch (priv->chip_type) {
case SIO:
len = ;
break;
case FT8U232AM:
case FT232BM:
case FT2232C:
case FT232RL:
case FT2232H:
case FT4232H:
case FT232H:
case FTX:
len = ;
break;
default:
ret = -EFAULT;
goto out;
} ret = usb_control_msg(port->serial->dev,
usb_rcvctrlpipe(port->serial->dev, ),
FTDI_SIO_GET_MODEM_STATUS_REQUEST,
FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
, priv->interface,
buf, len, WDR_TIMEOUT);
if (ret < ) {
dev_err(&port->dev, "failed to get modem status: %d\n", ret);
ret = usb_translate_errors(ret);
goto out;
} status[] = buf[];
if (ret > )
status[] = buf[];
else
status[] = ; dev_dbg(&port->dev, "%s - 0x%02x%02x\n", __func__, status[],
status[]);
out:
kfree(buf); return ret;
} static int ftdi_tiocmget(struct tty_struct *tty)
{
struct usb_serial_port *port = tty->driver_data;
struct ftdi_private *priv = usb_get_serial_port_data(port);
unsigned char buf[];
int ret; ret = ftdi_get_modem_status(port, buf);
if (ret < )
return ret; ret = (buf[] & FTDI_SIO_DSR_MASK ? TIOCM_DSR : ) |
(buf[] & FTDI_SIO_CTS_MASK ? TIOCM_CTS : ) |
(buf[] & FTDI_SIO_RI_MASK ? TIOCM_RI : ) |
(buf[] & FTDI_SIO_RLSD_MASK ? TIOCM_CD : ) |
priv->last_dtr_rts; return ret;
} static int ftdi_tiocmset(struct tty_struct *tty,
unsigned int set, unsigned int clear)
{
struct usb_serial_port *port = tty->driver_data; return update_mctrl(port, set, clear);
} static int ftdi_ioctl(struct tty_struct *tty,
unsigned int cmd, unsigned long arg)
{
struct usb_serial_port *port = tty->driver_data; /* Based on code from acm.c and others */
switch (cmd) { case TIOCGSERIAL: /* gets serial port data */
return get_serial_info(port,
(struct serial_struct __user *) arg); case TIOCSSERIAL: /* sets serial port data */
return set_serial_info(tty, port,
(struct serial_struct __user *) arg);
case TIOCSERGETLSR:
return get_lsr_info(port, (struct serial_struct __user *)arg);
break;
default:
break;
} return -ENOIOCTLCMD;
} module_usb_serial_driver(serial_drivers, id_table_combined); MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE("GPL"); module_param(ndi_latency_timer, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(ndi_latency_timer, "NDI device latency timer override");
Linux/drivers/usb/serial/ftdi_sio.c的更多相关文章
- install usb serial
Install driver for USB-UART bridge converter on Linux Ubuntu12.04 Ubuntu下USB转串口芯片驱动程序安装,支持cp210x,pl2 ...
- linux下USB串口,minicom
[一].驱动相关说明: 如果直接使用串口线,而没有用到USB转串口设备,就不需要安装驱动. 如果使用了USB转串口,一般情况下也不需要安装驱动了,目前linux系统已经包含了该驱动,可以自动识别,亦可 ...
- LINUX下 USB转串口 【转】
转自:http://blog.163.com/smilexiao_11015461/blog/static/2122052182012102410399459/ 1.将设备u口插入pc2.输入#lsm ...
- 基于Linux的USB 主/从设备之间通讯的三种方式
转载:http://archive.eet-china.com/www.eet-china.com/ART_8800323770_617693_TA_eda530e7.HTM 随着简单易用的USB接口 ...
- gentoo usb serial ch340 16进制读写
首先安装包含 lsusb 命令的 usbutils, emerge -v usbutils. 使用 lsusb后,可以查看到 ch340 的信息: Bus 001 Device 004: ID 1a8 ...
- Linux上USB移植错误解决笔记
在内核目录下先配置支持USB设备,无论你是什么设备,这一步都是必须的,USB驱动和其他的驱动不同,它分为USB设备驱动,另外还有USB-Host主机控制器的驱动,配置如下: Device Driver ...
- Linux内核--usb子系统的分析
drivers/usb/core/usb.c subsys_init(usb_init); module_exit(usb_exit); 我们 看到一个subsys_initcall,它也是一个宏,我 ...
- Linux下USB烧写uImage kernel
Linux下USB烧写uImage kernel 1.启动开发板,进入u-boot:(如果开发板中没有系统,可以通过用SD卡方式启动开发板进入) U-Boot 2011.06 (Mar 19 ...
- Linux下usb设备驱动详解
USB驱动分为两块,一块是USB的bus驱动,这个东西,Linux内核已经做好了,我们可以不管,我们只需要了解它的功能.形象的说,USB的bus驱动相当于铺出一条路来,让所有的信息都可以通过这条USB ...
随机推荐
- BZOJ 1975: [Sdoi2010]魔法猪学院——K短路,A*
传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1975 题意&简要做法 一张有向图,求出最多的互不相同的路径,满足路径长度之和\(\l ...
- Python编程规范精简版
用四个空格缩进,不要用tab键:四个空格是在较小缩进(可以允许更大的嵌套深度)和较大缩进(可读性更好)之间的一个很好的折中.制表符会带来混乱,最好不要使用: 包装行保证每行不超过79个字符:这对那些使 ...
- HDU 3342 Legal or Not(拓扑排序判断成环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342 题目大意:n个点,m条有向边,让你判断是否有环. 解题思路:裸题,用dfs版的拓扑排序直接套用即 ...
- hdu 5001(概率DP)
Walk Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- gm(GraphicsMagick)图片中文水印乱码问题
1.GraphicsMagick图片中文水印乱码问题处理方式 如出现乱码是由于服务器中缺少中文字库所致,为避免系统中存在多个中文字库冲突, 所以没有必要在安装GraphicsMagick时就将字库文件 ...
- PHP 5.4 内置 web 服务器
之前 OSC 翻译了一篇文章:在 Windows 上使用 PHP 5.4 内置的 Web 服务器 下面这篇文章来自外刊IT评论翻译的在 Linux 下使用 PHP 5.4 内置 Web 服务器 PHP ...
- 2017-2018-1 20179202《Linux内核原理与分析》第五周作业
一.系统调用实验: 1.知识准备: (1)系统调用的三层皮:xyz()(API).system_call(所有系统调用的入口) . sys_xyz()(中断服务程序) (2)API是程序员在用户空间下 ...
- 【转】LoadRunner常见问题整理
原文出自:http://blog.csdn.net/loadrunn/article/details/7886918 1.LR 脚本为空的解决方法: 1.去掉ie设置中的第三方支持取消掉 2.在系统属 ...
- 【算法与数据结构实战】线性表操作-实现A并B,结果放入A中
//数据结构与算法基础题1:线性表操作,实现A并B,结果放入A中 #include "stdafx.h" #include <iostream> #include &l ...
- zookeeper分布式算法和部署
算法摘要 安装 配置 监控 创建节点 二阶段提交(Two-Phase Commit) 投票和执行 协调者向参与者发送事务内容,询问是否可以提交,各参与者节点执行事务并向协调者反馈 如果所有参与者反馈y ...