码迷,mamicode.com
首页 > Web开发 > 详细

Linux/drivers/usb/serial/ftdi_sio.c

时间:2014-11-04 14:32:29      阅读:1426      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   io   color   ar   os   for   

Linux/drivers/usb/serial/ftdi_sio.h

  1 /*
  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  */
 24 
 25 /* Commands */
 26 #define FTDI_SIO_RESET                  0 /* Reset the port */
 27 #define FTDI_SIO_MODEM_CTRL             1 /* Set the modem control register */
 28 #define FTDI_SIO_SET_FLOW_CTRL          2 /* Set flow control register */
 29 #define FTDI_SIO_SET_BAUD_RATE          3 /* Set baud rate */
 30 #define FTDI_SIO_SET_DATA               4 /* Set the data characteristics of
 31                                              the port */
 32 #define FTDI_SIO_GET_MODEM_STATUS       5 /* Retrieve current value of modem
 33                                              status register */
 34 #define FTDI_SIO_SET_EVENT_CHAR         6 /* Set the event character */
 35 #define FTDI_SIO_SET_ERROR_CHAR         7 /* Set the error character */
 36 #define FTDI_SIO_SET_LATENCY_TIMER      9 /* Set the latency timer */
 37 #define FTDI_SIO_GET_LATENCY_TIMER      10 /* Get the latency timer */
 38 
 39 /* Interface indices for FT2232, FT2232H and FT4232H devices */
 40 #define INTERFACE_A             1
 41 #define INTERFACE_B             2
 42 #define INTERFACE_C             3
 43 #define INTERFACE_D             4
 44 
 45 
 46 /*
 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  */
 55 
 56 /* Port Identifier Table */
 57 #define PIT_DEFAULT             0 /* SIOA */
 58 #define PIT_SIOA                1 /* SIOA */
 59 /* The device this driver is tested with one has only one port */
 60 #define PIT_SIOB                2 /* SIOB */
 61 #define PIT_PARALLEL            3 /* Parallel */
 62 
 63 /* FTDI_SIO_RESET */
 64 #define FTDI_SIO_RESET_REQUEST FTDI_SIO_RESET
 65 #define FTDI_SIO_RESET_REQUEST_TYPE 0x40
 66 #define FTDI_SIO_RESET_SIO 0
 67 #define FTDI_SIO_RESET_PURGE_RX 1
 68 #define FTDI_SIO_RESET_PURGE_TX 2
 69 
 70 /*
 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    */
 95 
 96 /* FTDI_SIO_SET_BAUDRATE */
 97 #define FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE 0x40
 98 #define FTDI_SIO_SET_BAUDRATE_REQUEST 3
 99 
100 /*
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  */
151 
152 enum ftdi_chip_type {
153         SIO = 1,
154         FT8U232AM = 2,
155         FT232BM = 3,
156         FT2232C = 4,
157         FT232RL = 5,
158         FT2232H = 6,
159         FT4232H = 7,
160         FT232H  = 8,
161         FTX     = 9,
162 };
163 
164 enum ftdi_sio_baudrate {
165         ftdi_sio_b300 = 0,
166         ftdi_sio_b600 = 1,
167         ftdi_sio_b1200 = 2,
168         ftdi_sio_b2400 = 3,
169         ftdi_sio_b4800 = 4,
170         ftdi_sio_b9600 = 5,
171         ftdi_sio_b19200 = 6,
172         ftdi_sio_b38400 = 7,
173         ftdi_sio_b57600 = 8,
174         ftdi_sio_b115200 = 9
175 };
176 
177 /*
178  * The ftdi_8U232AM_xxMHz_byyy constants have been removed. The encoded divisor
179  * values are calculated internally.
180  */
181 #define FTDI_SIO_SET_DATA_REQUEST       FTDI_SIO_SET_DATA
182 #define FTDI_SIO_SET_DATA_REQUEST_TYPE  0x40
183 #define FTDI_SIO_SET_DATA_PARITY_NONE   (0x0 << 8)
184 #define FTDI_SIO_SET_DATA_PARITY_ODD    (0x1 << 8)
185 #define FTDI_SIO_SET_DATA_PARITY_EVEN   (0x2 << 8)
186 #define FTDI_SIO_SET_DATA_PARITY_MARK   (0x3 << 8)
187 #define FTDI_SIO_SET_DATA_PARITY_SPACE  (0x4 << 8)
188 #define FTDI_SIO_SET_DATA_STOP_BITS_1   (0x0 << 11)
189 #define FTDI_SIO_SET_DATA_STOP_BITS_15  (0x1 << 11)
190 #define FTDI_SIO_SET_DATA_STOP_BITS_2   (0x2 << 11)
191 #define FTDI_SIO_SET_BREAK              (0x1 << 14)
192 /* FTDI_SIO_SET_DATA */
193 
194 /*
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  */
221 
222 
223 
224 /* FTDI_SIO_MODEM_CTRL */
225 #define FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE 0x40
226 #define FTDI_SIO_SET_MODEM_CTRL_REQUEST FTDI_SIO_MODEM_CTRL
227 
228 /*
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  */
240 
241 #define FTDI_SIO_SET_DTR_MASK 0x1
242 #define FTDI_SIO_SET_DTR_HIGH (1 | (FTDI_SIO_SET_DTR_MASK  << 8))
243 #define FTDI_SIO_SET_DTR_LOW  (0 | (FTDI_SIO_SET_DTR_MASK  << 8))
244 #define FTDI_SIO_SET_RTS_MASK 0x2
245 #define FTDI_SIO_SET_RTS_HIGH (2 | (FTDI_SIO_SET_RTS_MASK << 8))
246 #define FTDI_SIO_SET_RTS_LOW (0 | (FTDI_SIO_SET_RTS_MASK << 8))
247 
248 /*
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  */
265 
266 /* FTDI_SIO_SET_FLOW_CTRL */
267 #define FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE 0x40
268 #define FTDI_SIO_SET_FLOW_CTRL_REQUEST FTDI_SIO_SET_FLOW_CTRL
269 #define FTDI_SIO_DISABLE_FLOW_CTRL 0x0
270 #define FTDI_SIO_RTS_CTS_HS (0x1 << 8)
271 #define FTDI_SIO_DTR_DSR_HS (0x2 << 8)
272 #define FTDI_SIO_XON_XOFF_HS (0x4 << 8)
273 /*
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  */
297 
298 /*
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  */
308 #define  FTDI_SIO_GET_LATENCY_TIMER_REQUEST FTDI_SIO_GET_LATENCY_TIMER
309 #define  FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE 0xC0
310 
311 /*
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  */
319 
320 /*
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  */
330 #define  FTDI_SIO_SET_LATENCY_TIMER_REQUEST FTDI_SIO_SET_LATENCY_TIMER
331 #define  FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE 0x40
332 
333 /*
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  */
346 
347 /*
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  */
355 
356 
357 #define  FTDI_SIO_SET_EVENT_CHAR_REQUEST FTDI_SIO_SET_EVENT_CHAR
358 #define  FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE 0x40
359 
360 
361 /*
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  */
377 
378 /* FTDI_SIO_SET_ERROR_CHAR */
379 
380 /*
381  * Set the parity error replacement character for the specified communications
382  * port
383  */
384 
385 /*
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  */
401 
402 /* FTDI_SIO_GET_MODEM_STATUS */
403 /* Retrieve the current value of the modem status register */
404 
405 #define FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE 0xc0
406 #define FTDI_SIO_GET_MODEM_STATUS_REQUEST FTDI_SIO_GET_MODEM_STATUS
407 #define FTDI_SIO_CTS_MASK 0x10
408 #define FTDI_SIO_DSR_MASK 0x20
409 #define FTDI_SIO_RI_MASK  0x40
410 #define FTDI_SIO_RLSD_MASK 0x80
411 /*
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  */
434 
435 
436 
437 /* 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  */
536 #define FTDI_RS0_CTS    (1 << 4)
537 #define FTDI_RS0_DSR    (1 << 5)
538 #define FTDI_RS0_RI     (1 << 6)
539 #define FTDI_RS0_RLSD   (1 << 7)
540 
541 #define FTDI_RS_DR      1
542 #define FTDI_RS_OE      (1<<1)
543 #define FTDI_RS_PE      (1<<2)
544 #define FTDI_RS_FE      (1<<3)
545 #define FTDI_RS_BI      (1<<4)
546 #define FTDI_RS_THRE    (1<<5)
547 #define FTDI_RS_TEMT    (1<<6)
548 #define FTDI_RS_FIFO    (1<<7)
549 
550 /*
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  */
565 

 

 

Linux/drivers/usb/serial/ftdi_sio_ids.h

  1 /*
  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  */
  9 
 10 
 11 /**********************************/
 12 /***** devices using FTDI VID *****/
 13 /**********************************/
 14 
 15 
 16 #define FTDI_VID        0x0403  /* Vendor Id */
 17 
 18 
 19 /*** "original" FTDI device PIDs ***/
 20 
 21 #define FTDI_8U232AM_PID 0x6001 /* Similar device to SIO above */
 22 #define FTDI_8U232AM_ALT_PID 0x6006 /* FTDI‘s alternate PID for above */
 23 #define FTDI_8U2232C_PID 0x6010 /* Dual channel device */
 24 #define FTDI_4232H_PID 0x6011 /* Quad channel hi-speed device */
 25 #define FTDI_232H_PID  0x6014 /* Single channel hi-speed device */
 26 #define FTDI_FTX_PID   0x6015 /* FT-X series (FT201X, FT230X, FT231X, etc) */
 27 #define FTDI_SIO_PID    0x8372  /* Product Id SIO application of 8U100AX */
 28 #define FTDI_232RL_PID  0xFBFA  /* Product ID for FT232RL */
 29 
 30 
 31 /*** third-party PIDs (using FTDI_VID) ***/
 32 
 33 #define FTDI_LUMEL_PD12_PID     0x6002
 34 
 35 /*
 36  * Marvell OpenRD Base, Client
 37  * http://www.open-rd.org
 38  * OpenRD Base, Client use VID 0x0403
 39  */
 40 #define MARVELL_OPENRD_PID      0x9e90
 41 
 42 /* www.candapter.com Ewert Energy Systems CANdapter device */
 43 #define FTDI_CANDAPTER_PID 0x9F80 /* Product Id */
 44 
 45 #define FTDI_BM_ATOM_NANO_PID   0xa559  /* Basic Micro ATOM Nano USB2Serial */
 46 
 47 /*
 48  * Texas Instruments XDS100v2 JTAG / BeagleBone A3
 49  * http://processors.wiki.ti.com/index.php/XDS100
 50  * http://beagleboard.org/bone
 51  */
 52 #define TI_XDS100V2_PID         0xa6d0
 53 
 54 #define FTDI_NXTCAM_PID         0xABB8 /* NXTCam for Mindstorms NXT */
 55 #define FTDI_EV3CON_PID         0xABB9 /* Mindstorms EV3 Console Adapter */
 56 
 57 /* US Interface Navigator (http://www.usinterface.com/) */
 58 #define FTDI_USINT_CAT_PID      0xb810  /* Navigator CAT and 2nd PTT lines */
 59 #define FTDI_USINT_WKEY_PID     0xb811  /* Navigator WKEY and FSK lines */
 60 #define FTDI_USINT_RS232_PID    0xb812  /* Navigator RS232 and CONFIG lines */
 61 
 62 /* OOCDlink by Joern Kaipf <joernk@web.de>
 63  * (http://www.joernonline.de/) */
 64 #define FTDI_OOCDLINK_PID       0xbaf8  /* Amontec JTAGkey */
 65 
 66 /* Luminary Micro Stellaris Boards, VID = FTDI_VID */
 67 /* FTDI 2332C Dual channel device, side A=245 FIFO (JTAG), Side B=RS232 UART */
 68 #define LMI_LM3S_DEVEL_BOARD_PID        0xbcd8
 69 #define LMI_LM3S_EVAL_BOARD_PID         0xbcd9
 70 #define LMI_LM3S_ICDI_BOARD_PID         0xbcda
 71 
 72 #define FTDI_TURTELIZER_PID     0xBDC8 /* JTAG/RS-232 adapter by egnite GmbH */
 73 
 74 /* OpenDCC (www.opendcc.de) product id */
 75 #define FTDI_OPENDCC_PID        0xBFD8
 76 #define FTDI_OPENDCC_SNIFFER_PID        0xBFD9
 77 #define FTDI_OPENDCC_THROTTLE_PID       0xBFDA
 78 #define FTDI_OPENDCC_GATEWAY_PID        0xBFDB
 79 #define FTDI_OPENDCC_GBM_PID    0xBFDC
 80 #define FTDI_OPENDCC_GBM_BOOST_PID      0xBFDD
 81 
 82 /* NZR SEM 16+ USB (http://www.nzr.de) */
 83 #define FTDI_NZR_SEM_USB_PID    0xC1E0  /* NZR SEM-LOG16+ */
 84 
 85 /*
 86  * RR-CirKits LocoBuffer USB (http://www.rr-cirkits.com)
 87  */
 88 #define FTDI_RRCIRKITS_LOCOBUFFER_PID   0xc7d0  /* LocoBuffer USB */
 89 
 90 /* DMX4ALL DMX Interfaces */
 91 #define FTDI_DMX4ALL 0xC850
 92 
 93 /*
 94  * ASK.fr devices
 95  */
 96 #define FTDI_ASK_RDR400_PID     0xC991  /* ASK RDR 400 series card reader */
 97 
 98 /* www.starting-point-systems.com µChameleon device */
 99 #define FTDI_MICRO_CHAMELEON_PID        0xCAA0  /* Product Id */
100 
101 /*
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  */
106 #define FTDI_TACTRIX_OPENPORT_13M_PID   0xCC48  /* OpenPort 1.3 Mitsubishi */
107 #define FTDI_TACTRIX_OPENPORT_13S_PID   0xCC49  /* OpenPort 1.3 Subaru */
108 #define FTDI_TACTRIX_OPENPORT_13U_PID   0xCC4A  /* OpenPort 1.3 Universal */
109 
110 #define FTDI_DISTORTEC_JTAG_LOCK_PICK_PID       0xCFF8
111 
112 /* SCS HF Radio Modems PID‘s (http://www.scs-ptc.com) */
113 /* the VID is the standard ftdi vid (FTDI_VID) */
114 #define FTDI_SCS_DEVICE_0_PID 0xD010    /* SCS PTC-IIusb */
115 #define FTDI_SCS_DEVICE_1_PID 0xD011    /* SCS Tracker / DSP TNC */
116 #define FTDI_SCS_DEVICE_2_PID 0xD012
117 #define FTDI_SCS_DEVICE_3_PID 0xD013
118 #define FTDI_SCS_DEVICE_4_PID 0xD014
119 #define FTDI_SCS_DEVICE_5_PID 0xD015
120 #define FTDI_SCS_DEVICE_6_PID 0xD016
121 #define FTDI_SCS_DEVICE_7_PID 0xD017
122 
123 /* iPlus device */
124 #define FTDI_IPLUS_PID 0xD070 /* Product Id */
125 #define FTDI_IPLUS2_PID 0xD071 /* Product Id */
126 
127 /*
128  * Gamma Scout (http://gamma-scout.com/). Submitted by rsc@runtux.com.
129  */
130 #define FTDI_GAMMA_SCOUT_PID            0xD678  /* Gamma Scout online */
131 
132 /* Propox devices */
133 #define FTDI_PROPOX_JTAGCABLEII_PID     0xD738
134 #define FTDI_PROPOX_ISPCABLEIII_PID     0xD739
135 
136 /* Lenz LI-USB Computer Interface. */
137 #define FTDI_LENZ_LIUSB_PID     0xD780
138 
139 /* Vardaan Enterprises Serial Interface VEUSB422R3 */
140 #define FTDI_VARDAAN_PID        0xF070
141 
142 /*
143  * Xsens Technologies BV products (http://www.xsens.com).
144  */
145 #define XSENS_VID               0x2639
146 #define XSENS_CONVERTER_PID     0xD00D  /* Xsens USB-serial converter */
147 #define XSENS_MTW_PID           0x0200  /* Xsens MTw */
148 #define XSENS_CONVERTER_0_PID   0xD388  /* Xsens USB converter */
149 #define XSENS_CONVERTER_1_PID   0xD389  /* Xsens Wireless Receiver */
150 #define XSENS_CONVERTER_2_PID   0xD38A
151 #define XSENS_CONVERTER_3_PID   0xD38B  /* Xsens USB-serial converter */
152 #define XSENS_CONVERTER_4_PID   0xD38C  /* Xsens Wireless Receiver */
153 #define XSENS_CONVERTER_5_PID   0xD38D  /* Xsens Awinda Station */
154 #define XSENS_CONVERTER_6_PID   0xD38E
155 #define XSENS_CONVERTER_7_PID   0xD38F
156 
157 /**
158  * Zolix (www.zolix.com.cb) product ids
159  */
160 #define FTDI_OMNI1509                   0xD491  /* Omni1509 embedded USB-serial */
161 
162 /*
163  * NDI (www.ndigital.com) product ids
164  */
165 #define FTDI_NDI_HUC_PID                0xDA70  /* NDI Host USB Converter */
166 #define FTDI_NDI_SPECTRA_SCU_PID        0xDA71  /* NDI Spectra SCU */
167 #define FTDI_NDI_FUTURE_2_PID           0xDA72  /* NDI future device #2 */
168 #define FTDI_NDI_FUTURE_3_PID           0xDA73  /* NDI future device #3 */
169 #define FTDI_NDI_AURORA_SCU_PID         0xDA74  /* NDI Aurora SCU */
170 
171 /*
172  * ChamSys Limited (www.chamsys.co.uk) USB wing/interface product IDs
173  */
174 #define FTDI_CHAMSYS_24_MASTER_WING_PID        0xDAF8
175 #define FTDI_CHAMSYS_PC_WING_PID       0xDAF9
176 #define FTDI_CHAMSYS_USB_DMX_PID       0xDAFA
177 #define FTDI_CHAMSYS_MIDI_TIMECODE_PID 0xDAFB
178 #define FTDI_CHAMSYS_MINI_WING_PID     0xDAFC
179 #define FTDI_CHAMSYS_MAXI_WING_PID     0xDAFD
180 #define FTDI_CHAMSYS_MEDIA_WING_PID    0xDAFE
181 #define FTDI_CHAMSYS_WING_PID  0xDAFF
182 
183 /*
184  * Westrex International devices submitted by Cory Lee
185  */
186 #define FTDI_WESTREX_MODEL_777_PID      0xDC00  /* Model 777 */
187 #define FTDI_WESTREX_MODEL_8900F_PID    0xDC01  /* Model 8900F */
188 
189 /*
190  * ACG Identification Technologies GmbH products (http://www.acg.de/).
191  * Submitted by anton -at- goto10 -dot- org.
192  */
193 #define FTDI_ACG_HFDUAL_PID             0xDD20  /* HF Dual ISO Reader (RFID) */
194 
195 /*
196  * Definitions for Artemis astronomical USB based cameras
197  * Check it at http://www.artemisccd.co.uk/
198  */
199 #define FTDI_ARTEMIS_PID        0xDF28  /* All Artemis Cameras */
200 
201 /*
202  * Definitions for ATIK Instruments astronomical USB based cameras
203  * Check it at http://www.atik-instruments.com/
204  */
205 #define FTDI_ATIK_ATK16_PID     0xDF30  /* ATIK ATK-16 Grayscale Camera */
206 #define FTDI_ATIK_ATK16C_PID    0xDF32  /* ATIK ATK-16C Colour Camera */
207 #define FTDI_ATIK_ATK16HR_PID   0xDF31  /* ATIK ATK-16HR Grayscale Camera */
208 #define FTDI_ATIK_ATK16HRC_PID  0xDF33  /* ATIK ATK-16HRC Colour Camera */
209 #define FTDI_ATIK_ATK16IC_PID   0xDF35  /* ATIK ATK-16IC Grayscale Camera */
210 
211 /*
212  * Yost Engineering, Inc. products (www.yostengineering.com).
213  * PID 0xE050 submitted by Aaron Prose.
214  */
215 #define FTDI_YEI_SERVOCENTER31_PID      0xE050  /* YEI ServoCenter3.1 USB */
216 
217 /*
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  */
227 #define FTDI_ELV_VID    0x1B1F  /* ELV AG */
228 #define FTDI_ELV_WS300_PID      0xC006  /* eQ3 WS 300 PC II */
229 #define FTDI_ELV_USR_PID        0xE000  /* ELV Universal-Sound-Recorder */
230 #define FTDI_ELV_MSM1_PID       0xE001  /* ELV Mini-Sound-Modul */
231 #define FTDI_ELV_KL100_PID      0xE002  /* ELV Kfz-Leistungsmesser KL 100 */
232 #define FTDI_ELV_WS550_PID      0xE004  /* WS 550 */
233 #define FTDI_ELV_EC3000_PID     0xE006  /* ENERGY CONTROL 3000 USB */
234 #define FTDI_ELV_WS888_PID      0xE008  /* WS 888 */
235 #define FTDI_ELV_TWS550_PID     0xE009  /* Technoline WS 550 */
236 #define FTDI_ELV_FEM_PID        0xE00A  /* Funk Energie Monitor */
237 #define FTDI_ELV_FHZ1300PC_PID  0xE0E8  /* FHZ 1300 PC */
238 #define FTDI_ELV_WS500_PID      0xE0E9  /* PC-Wetterstation (WS 500) */
239 #define FTDI_ELV_HS485_PID      0xE0EA  /* USB to RS-485 adapter */
240 #define FTDI_ELV_UMS100_PID     0xE0EB  /* ELV USB Master-Slave Schaltsteckdose UMS 100 */
241 #define FTDI_ELV_TFD128_PID     0xE0EC  /* ELV Temperatur-Feuchte-Datenlogger TFD 128 */
242 #define FTDI_ELV_FM3RX_PID      0xE0ED  /* ELV Messwertuebertragung FM3 RX */
243 #define FTDI_ELV_WS777_PID      0xE0EE  /* Conrad WS 777 */
244 #define FTDI_ELV_EM1010PC_PID   0xE0EF  /* Energy monitor EM 1010 PC */
245 #define FTDI_ELV_CSI8_PID       0xE0F0  /* Computer-Schalt-Interface (CSI 8) */
246 #define FTDI_ELV_EM1000DL_PID   0xE0F1  /* PC-Datenlogger fuer Energiemonitor (EM 1000 DL) */
247 #define FTDI_ELV_PCK100_PID     0xE0F2  /* PC-Kabeltester (PCK 100) */
248 #define FTDI_ELV_RFP500_PID     0xE0F3  /* HF-Leistungsmesser (RFP 500) */
249 #define FTDI_ELV_FS20SIG_PID    0xE0F4  /* Signalgeber (FS 20 SIG) */
250 #define FTDI_ELV_UTP8_PID       0xE0F5  /* ELV UTP 8 */
251 #define FTDI_ELV_WS300PC_PID    0xE0F6  /* PC-Wetterstation (WS 300 PC) */
252 #define FTDI_ELV_WS444PC_PID    0xE0F7  /* Conrad WS 444 PC */
253 #define FTDI_PHI_FISCO_PID      0xE40B  /* PHI Fisco USB to Serial cable */
254 #define FTDI_ELV_UAD8_PID       0xF068  /* USB-AD-Wandler (UAD 8) */
255 #define FTDI_ELV_UDA7_PID       0xF069  /* USB-DA-Wandler (UDA 7) */
256 #define FTDI_ELV_USI2_PID       0xF06A  /* USB-Schrittmotoren-Interface (USI 2) */
257 #define FTDI_ELV_T1100_PID      0xF06B  /* Thermometer (T 1100) */
258 #define FTDI_ELV_PCD200_PID     0xF06C  /* PC-Datenlogger (PCD 200) */
259 #define FTDI_ELV_ULA200_PID     0xF06D  /* USB-LCD-Ansteuerung (ULA 200) */
260 #define FTDI_ELV_ALC8500_PID    0xF06E  /* ALC 8500 Expert */
261 #define FTDI_ELV_FHZ1000PC_PID  0xF06F  /* FHZ 1000 PC */
262 #define FTDI_ELV_UR100_PID      0xFB58  /* USB-RS232-Umsetzer (UR 100) */
263 #define FTDI_ELV_UM100_PID      0xFB5A  /* USB-Modul UM 100 */
264 #define FTDI_ELV_UO100_PID      0xFB5B  /* USB-Modul UO 100 */
265 /* 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. */
269 #define FTDI_ELV_CLI7000_PID    0xFB59  /* Computer-Light-Interface (CLI 7000) */
270 #define FTDI_ELV_PPS7330_PID    0xFB5C  /* Processor-Power-Supply (PPS 7330) */
271 #define FTDI_ELV_TFM100_PID     0xFB5D  /* Temperatur-Feuchte-Messgeraet (TFM 100) */
272 #define FTDI_ELV_UDF77_PID      0xFB5E  /* USB DCF Funkuhr (UDF 77) */
273 #define FTDI_ELV_UIO88_PID      0xFB5F  /* USB-I/O Interface (UIO 88) */
274 
275 /*
276  * EVER Eco Pro UPS (http://www.ever.com.pl/)
277  */
278 
279 #define EVER_ECO_PRO_CDS        0xe520  /* RS-232 converter */
280 
281 /*
282  * Active Robots product ids.
283  */
284 #define FTDI_ACTIVE_ROBOTS_PID  0xE548  /* USB comms board */
285 
286 /* Pyramid Computer GmbH */
287 #define FTDI_PYRAMID_PID        0xE6C8  /* Pyramid Appliance Display */
288 
289 /* www.elsterelectricity.com Elster Unicom III Optical Probe */
290 #define FTDI_ELSTER_UNICOM_PID          0xE700 /* Product Id */
291 
292 /*
293  * Gude Analog- und Digitalsysteme GmbH
294  */
295 #define FTDI_GUDEADS_E808_PID    0xE808
296 #define FTDI_GUDEADS_E809_PID    0xE809
297 #define FTDI_GUDEADS_E80A_PID    0xE80A
298 #define FTDI_GUDEADS_E80B_PID    0xE80B
299 #define FTDI_GUDEADS_E80C_PID    0xE80C
300 #define FTDI_GUDEADS_E80D_PID    0xE80D
301 #define FTDI_GUDEADS_E80E_PID    0xE80E
302 #define FTDI_GUDEADS_E80F_PID    0xE80F
303 #define FTDI_GUDEADS_E888_PID    0xE888  /* Expert ISDN Control USB */
304 #define FTDI_GUDEADS_E889_PID    0xE889  /* USB RS-232 OptoBridge */
305 #define FTDI_GUDEADS_E88A_PID    0xE88A
306 #define FTDI_GUDEADS_E88B_PID    0xE88B
307 #define FTDI_GUDEADS_E88C_PID    0xE88C
308 #define FTDI_GUDEADS_E88D_PID    0xE88D
309 #define FTDI_GUDEADS_E88E_PID    0xE88E
310 #define FTDI_GUDEADS_E88F_PID    0xE88F
311 
312 /*
313  * Eclo (http://www.eclo.pt/) product IDs.
314  * PID 0xEA90 submitted by Martin Grill.
315  */
316 #define FTDI_ECLO_COM_1WIRE_PID 0xEA90  /* COM to 1-Wire USB adaptor */
317 
318 /* TNC-X USB-to-packet-radio adapter, versions prior to 3.0 (DLP module) */
319 #define FTDI_TNC_X_PID          0xEBE0
320 
321 /*
322  * Teratronik product ids.
323  * Submitted by O. Wölfelschneider.
324  */
325 #define FTDI_TERATRONIK_VCP_PID  0xEC88 /* Teratronik device (preferring VCP driver on windows) */
326 #define FTDI_TERATRONIK_D2XX_PID 0xEC89 /* Teratronik device (preferring D2XX driver on windows) */
327 
328 /* Rig Expert Ukraine devices */
329 #define FTDI_REU_TINY_PID               0xED22  /* RigExpert Tiny */
330 
331 /*
332  * Hameg HO820 and HO870 interface (using VID 0x0403)
333  */
334 #define HAMEG_HO820_PID                 0xed74
335 #define HAMEG_HO730_PID                 0xed73
336 #define HAMEG_HO720_PID                 0xed72
337 #define HAMEG_HO870_PID                 0xed71
338 
339 /*
340  *  MaxStream devices   www.maxstream.net
341  */
342 #define FTDI_MAXSTREAM_PID      0xEE18  /* Xbee PKG-U Module */
343 
344 /*
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  */
350 #define FTDI_MHAM_KW_PID        0xEEE8  /* USB-KW interface */
351 #define FTDI_MHAM_YS_PID        0xEEE9  /* USB-YS interface */
352 #define FTDI_MHAM_Y6_PID        0xEEEA  /* USB-Y6 interface */
353 #define FTDI_MHAM_Y8_PID        0xEEEB  /* USB-Y8 interface */
354 #define FTDI_MHAM_IC_PID        0xEEEC  /* USB-IC interface */
355 #define FTDI_MHAM_DB9_PID       0xEEED  /* USB-DB9 interface */
356 #define FTDI_MHAM_RS232_PID     0xEEEE  /* USB-RS232 interface */
357 #define FTDI_MHAM_Y9_PID        0xEEEF  /* USB-Y9 interface */
358 
359 /* Domintell products  http://www.domintell.com */
360 #define FTDI_DOMINTELL_DGQG_PID 0xEF50  /* Master */
361 #define FTDI_DOMINTELL_DUSB_PID 0xEF51  /* DUSB01 module */
362 
363 /*
364  * The following are the values for the Perle Systems
365  * UltraPort USB serial converters
366  */
367 #define FTDI_PERLE_ULTRAPORT_PID 0xF0C0 /* Perle UltraPort Product Id */
368 
369 /* Sprog II (Andrew Crosland‘s SprogII DCC interface) */
370 #define FTDI_SPROG_II           0xF0C8
371 
372 /*
373  * Two of the Tagsys RFID Readers
374  */
375 #define FTDI_TAGSYS_LP101_PID   0xF0E9  /* Tagsys L-P101 RFID*/
376 #define FTDI_TAGSYS_P200X_PID   0xF0EE  /* Tagsys Medio P200x RFID*/
377 
378 /* an infrared receiver for user access control with IR tags */
379 #define FTDI_PIEGROUP_PID       0xF208  /* Product Id */
380 
381 /* ACT Solutions HomePro ZWave interface
382    (http://www.act-solutions.com/HomePro-Product-Matrix.html) */
383 #define FTDI_ACTZWAVE_PID       0xF2D0
384 
385 /*
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  */
390 #define FTDI_4N_GALAXY_DE_1_PID 0xF3C0
391 #define FTDI_4N_GALAXY_DE_2_PID 0xF3C1
392 #define FTDI_4N_GALAXY_DE_3_PID 0xF3C2
393 
394 /*
395  * Linx Technologies product ids
396  */
397 #define LINX_SDMUSBQSS_PID      0xF448  /* Linx SDM-USB-QS-S */
398 #define LINX_MASTERDEVEL2_PID   0xF449  /* Linx Master Development 2.0 */
399 #define LINX_FUTURE_0_PID   0xF44A      /* Linx future device */
400 #define LINX_FUTURE_1_PID   0xF44B      /* Linx future device */
401 #define LINX_FUTURE_2_PID   0xF44C      /* Linx future device */
402 
403 /*
404  * Oceanic product ids
405  */
406 #define FTDI_OCEANIC_PID        0xF460  /* Oceanic dive instrument */
407 
408 /*
409  * SUUNTO product ids
410  */
411 #define FTDI_SUUNTO_SPORTS_PID  0xF680  /* Suunto Sports instrument */
412 
413 /* USB-UIRT - An infrared receiver and transmitter using the 8U232AM chip */
414 /* http://www.usbuirt.com/ */
415 #define FTDI_USB_UIRT_PID       0xF850  /* Product Id */
416 
417 /* CCS Inc. ICDU/ICDU40 product ID -
418  * the FT232BM is used in an in-circuit-debugger unit for PIC16‘s/PIC18‘s */
419 #define FTDI_CCSICDU20_0_PID    0xF9D0
420 #define FTDI_CCSICDU40_1_PID    0xF9D1
421 #define FTDI_CCSMACHX_2_PID     0xF9D2
422 #define FTDI_CCSLOAD_N_GO_3_PID 0xF9D3
423 #define FTDI_CCSICDU64_4_PID    0xF9D4
424 #define FTDI_CCSPRIME8_5_PID    0xF9D5
425 
426 /*
427  * The following are the values for the Matrix Orbital LCD displays,
428  * which are the FT232BM ( similar to the 8U232AM )
429  */
430 #define FTDI_MTXORB_0_PID      0xFA00  /* Matrix Orbital Product Id */
431 #define FTDI_MTXORB_1_PID      0xFA01  /* Matrix Orbital Product Id */
432 #define FTDI_MTXORB_2_PID      0xFA02  /* Matrix Orbital Product Id */
433 #define FTDI_MTXORB_3_PID      0xFA03  /* Matrix Orbital Product Id */
434 #define FTDI_MTXORB_4_PID      0xFA04  /* Matrix Orbital Product Id */
435 #define FTDI_MTXORB_5_PID      0xFA05  /* Matrix Orbital Product Id */
436 #define FTDI_MTXORB_6_PID      0xFA06  /* Matrix Orbital Product Id */
437 
438 /*
439  * Home Electronics (www.home-electro.com) USB gadgets
440  */
441 #define FTDI_HE_TIRA1_PID       0xFA78  /* Tira-1 IR transceiver */
442 
443 /* Inside Accesso contactless reader (http://www.insidecontactless.com/) */
444 #define INSIDE_ACCESSO          0xFAD0
445 
446 /*
447  * ThorLabs USB motor drivers
448  */
449 #define FTDI_THORLABS_PID               0xfaf0 /* ThorLabs USB motor drivers */
450 
451 /*
452  * Protego product ids
453  */
454 #define PROTEGO_SPECIAL_1       0xFC70  /* special/unknown device */
455 #define PROTEGO_R2X0            0xFC71  /* R200-USB TRNG unit (R210, R220, and R230) */
456 #define PROTEGO_SPECIAL_3       0xFC72  /* special/unknown device */
457 #define PROTEGO_SPECIAL_4       0xFC73  /* special/unknown device */
458 
459 /*
460  * Sony Ericsson product ids
461  */
462 #define FTDI_DSS20_PID          0xFC82  /* DSS-20 Sync Station for Sony Ericsson P800 */
463 #define FTDI_URBAN_0_PID        0xFC8A  /* Sony Ericsson Urban, uart #0 */
464 #define FTDI_URBAN_1_PID        0xFC8B  /* Sony Ericsson Urban, uart #1 */
465 
466 /* www.irtrans.de device */
467 #define FTDI_IRTRANS_PID 0xFC60 /* Product Id */
468 
469 /*
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  */
474 #define FTDI_RM_CANVIEW_PID     0xfd60  /* Product Id */
475 /* www.thoughttechnology.com/ TT-USB provide with procomp use ftdi_sio */
476 #define FTDI_TTUSB_PID 0xFF20 /* Product Id */
477 
478 #define FTDI_USBX_707_PID 0xF857        /* ADSTech IR Blaster USBX-707 (FTDI_VID) */
479 
480 #define FTDI_RELAIS_PID 0xFA10  /* Relais device from Rudolf Gugler */
481 
482 /*
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  */
487 #define FTDI_PCDJ_DAC2_PID 0xFA88
488 
489 #define FTDI_R2000KU_TRUE_RNG   0xFB80  /* R2000KU TRUE RNG (FTDI_VID) */
490 
491 /*
492  * DIEBOLD BCS SE923 (FTDI_VID)
493  */
494 #define DIEBOLD_BCS_SE923_PID   0xfb99
495 
496 /* 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  */
501 #define FTDI_XF_632_PID 0xFC08  /* 632: 16x2 Character Display */
502 #define FTDI_XF_634_PID 0xFC09  /* 634: 20x4 Character Display */
503 #define FTDI_XF_547_PID 0xFC0A  /* 547: Two line Display */
504 #define FTDI_XF_633_PID 0xFC0B  /* 633: 16x2 Character Display with Keys */
505 #define FTDI_XF_631_PID 0xFC0C  /* 631: 20x2 Character Display */
506 #define FTDI_XF_635_PID 0xFC0D  /* 635: 20x4 Character Display */
507 #define FTDI_XF_640_PID 0xFC0E  /* 640: Two line Display */
508 #define FTDI_XF_642_PID 0xFC0F  /* 642: Two line Display */
509 
510 /*
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  */
515 #define FTDI_VNHCPCUSB_D_PID 0xfe38 /* Product Id */
516 
517 /* AlphaMicro Components AMC-232USB01 device (FTDI_VID) */
518 #define FTDI_AMC232_PID 0xFF00 /* Product Id */
519 
520 /*
521  * IBS elektronik product ids (FTDI_VID)
522  * Submitted by Thomas Schleusener
523  */
524 #define FTDI_IBS_US485_PID      0xff38  /* IBS US485 (USB<-->RS422/485 interface) */
525 #define FTDI_IBS_PICPRO_PID     0xff39  /* IBS PIC-Programmer */
526 #define FTDI_IBS_PCMCIA_PID     0xff3a  /* IBS Card reader for PCMCIA SRAM-cards */
527 #define FTDI_IBS_PK1_PID        0xff3b  /* IBS PK1 - Particel counter */
528 #define FTDI_IBS_RS232MON_PID   0xff3c  /* IBS RS232 - Monitor */
529 #define FTDI_IBS_APP70_PID      0xff3d  /* APP 70 (dust monitoring system) */
530 #define FTDI_IBS_PEDO_PID       0xff3e  /* IBS PEDO-Modem (RF modem 868.35 MHz) */
531 #define FTDI_IBS_PROD_PID       0xff3f  /* future device */
532 /* www.canusb.com Lawicel CANUSB device (FTDI_VID) */
533 #define FTDI_CANUSB_PID 0xFFA8 /* Product Id */
534 
535 /*
536  * TavIR AVR product ids (FTDI_VID)
537  */
538 #define FTDI_TAVIR_STK500_PID   0xFA33  /* STK500 AVR programmer */
539 
540 /*
541  * TIAO product ids (FTDI_VID)
542  * http://www.tiaowiki.com/w/Main_Page
543  */
544 #define FTDI_TIAO_UMPA_PID      0x8a98  /* TIAO/DIYGADGET USB Multi-Protocol Adapter */
545 
546 /*
547  * NovaTech product ids (FTDI_VID)
548  */
549 #define FTDI_NT_ORIONLXM_PID    0x7c90  /* OrionLXm Substation Automation Platform */
550 
551 
552 /********************************/
553 /** third-party VID/PID combos **/
554 /********************************/
555 
556 
557 
558 /*
559  * Atmel STK541
560  */
561 #define ATMEL_VID               0x03eb /* Vendor ID */
562 #define STK541_PID              0x2109 /* Zigbee Controller */
563 
564 /*
565  * Blackfin gnICE JTAG
566  * http://docs.blackfin.uclinux.org/doku.php?id=hw:jtag:gnice
567  */
568 #define ADI_VID                 0x0456
569 #define ADI_GNICE_PID           0xF000
570 #define ADI_GNICEPLUS_PID       0xF001
571 
572 /*
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  */
582 #define MICROCHIP_VID           0x04D8
583 #define MICROCHIP_USB_BOARD_PID 0x000A /* CDC RS-232 Emulation Demo */
584 
585 /*
586  * RATOC REX-USB60F
587  */
588 #define RATOC_VENDOR_ID         0x0584
589 #define RATOC_PRODUCT_ID_USB60F 0xb020
590 
591 /*
592  * Infineon Technologies
593  */
594 #define INFINEON_VID            0x058b
595 #define INFINEON_TRIBOARD_PID   0x0028 /* DAS JTAG TriBoard TC1798 V1.0 */
596 
597 /*
598  * Acton Research Corp.
599  */
600 #define ACTON_VID               0x0647  /* Vendor ID */
601 #define ACTON_SPECTRAPRO_PID    0x0100
602 
603 /*
604  * Contec products (http://www.contec.com)
605  * Submitted by Daniel Sangorrin
606  */
607 #define CONTEC_VID              0x06CE  /* Vendor ID */
608 #define CONTEC_COM1USBH_PID     0x8311  /* COM-1(USB)H */
609 
610 /*
611  * Mitsubishi Electric Corp. (http://www.meau.com)
612  * Submitted by Konstantin Holoborodko
613  */
614 #define MITSUBISHI_VID          0x06D3
615 #define MITSUBISHI_FXUSB_PID    0x0284 /* USB/RS422 converters: FX-USB-AW/-BD */
616 
617 /*
618  * Definitions for B&B Electronics products.
619  */
620 #define BANDB_VID               0x0856  /* B&B Electronics Vendor ID */
621 #define BANDB_USOTL4_PID        0xAC01  /* USOTL4 Isolated RS-485 Converter */
622 #define BANDB_USTL4_PID         0xAC02  /* USTL4 RS-485 Converter */
623 #define BANDB_USO9ML2_PID       0xAC03  /* USO9ML2 Isolated RS-232 Converter */
624 #define BANDB_USOPTL4_PID       0xAC11
625 #define BANDB_USPTL4_PID        0xAC12
626 #define BANDB_USO9ML2DR_2_PID   0xAC16
627 #define BANDB_USO9ML2DR_PID     0xAC17
628 #define BANDB_USOPTL4DR2_PID    0xAC18  /* USOPTL4R-2 2-port Isolated RS-232 Converter */
629 #define BANDB_USOPTL4DR_PID     0xAC19
630 #define BANDB_485USB9F_2W_PID   0xAC25
631 #define BANDB_485USB9F_4W_PID   0xAC26
632 #define BANDB_232USB9M_PID      0xAC27
633 #define BANDB_485USBTB_2W_PID   0xAC33
634 #define BANDB_485USBTB_4W_PID   0xAC34
635 #define BANDB_TTL5USB9M_PID     0xAC49
636 #define BANDB_TTL3USB9M_PID     0xAC50
637 #define BANDB_ZZ_PROG1_USB_PID  0xBA02
638 
639 /*
640  * Intrepid Control Systems (http://www.intrepidcs.com/) ValueCAN and NeoVI
641  */
642 #define INTREPID_VID            0x093C
643 #define INTREPID_VALUECAN_PID   0x0601
644 #define INTREPID_NEOVI_PID      0x0701
645 
646 /*
647  * Definitions for ID TECH (www.idt-net.com) devices
648  */
649 #define IDTECH_VID              0x0ACD  /* ID TECH Vendor ID */
650 #define IDTECH_IDT1221U_PID     0x0300  /* IDT1221U USB to RS-232 adapter */
651 
652 /*
653  * Definitions for Omnidirectional Control Technology, Inc. devices
654  */
655 #define OCT_VID                 0x0B39  /* OCT vendor ID */
656 /* Note: OCT US101 is also rebadged as Dick Smith Electronics (NZ) XH6381 */
657 /* Also rebadged as Dick Smith Electronics (Aus) XH6451 */
658 /* Also rebadged as SIIG Inc. model US2308 hardware version 1 */
659 #define OCT_DK201_PID           0x0103  /* OCT DK201 USB docking station */
660 #define OCT_US101_PID           0x0421  /* OCT US101 USB to RS-232 */
661 
662 /*
663  * Definitions for Icom Inc. devices
664  */
665 #define ICOM_VID                0x0C26 /* Icom vendor ID */
666 /* Note: ID-1 is a communications tranceiver for HAM-radio operators */
667 #define ICOM_ID_1_PID           0x0004 /* ID-1 USB to RS-232 */
668 /* Note: OPC is an Optional cable to connect an Icom Tranceiver */
669 #define ICOM_OPC_U_UC_PID       0x0018 /* OPC-478UC, OPC-1122U cloning cable */
670 /* Note: ID-RP* devices are Icom Repeater Devices for HAM-radio */
671 #define ICOM_ID_RP2C1_PID       0x0009 /* ID-RP2C Asset 1 to RS-232 */
672 #define ICOM_ID_RP2C2_PID       0x000A /* ID-RP2C Asset 2 to RS-232 */
673 #define ICOM_ID_RP2D_PID        0x000B /* ID-RP2D configuration port*/
674 #define ICOM_ID_RP2VT_PID       0x000C /* ID-RP2V Transmit config port */
675 #define ICOM_ID_RP2VR_PID       0x000D /* ID-RP2V Receive config port */
676 #define ICOM_ID_RP4KVT_PID      0x0010 /* ID-RP4000V Transmit config port */
677 #define ICOM_ID_RP4KVR_PID      0x0011 /* ID-RP4000V Receive config port */
678 #define ICOM_ID_RP2KVT_PID      0x0012 /* ID-RP2000V Transmit config port */
679 #define ICOM_ID_RP2KVR_PID      0x0013 /* ID-RP2000V Receive config port */
680 
681 /*
682  * GN Otometrics (http://www.otometrics.com)
683  * Submitted by Ville Sundberg.
684  */
685 #define GN_OTOMETRICS_VID       0x0c33  /* Vendor ID */
686 #define AURICAL_USB_PID         0x0010  /* Aurical USB Audiometer */
687 
688 /*
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  */
693 #define SEALEVEL_VID            0x0c52  /* Sealevel Vendor ID */
694 #define SEALEVEL_2101_PID       0x2101  /* SeaLINK+232 (2101/2105) */
695 #define SEALEVEL_2102_PID       0x2102  /* SeaLINK+485 (2102) */
696 #define SEALEVEL_2103_PID       0x2103  /* SeaLINK+232I (2103) */
697 #define SEALEVEL_2104_PID       0x2104  /* SeaLINK+485I (2104) */
698 #define SEALEVEL_2106_PID       0x9020  /* SeaLINK+422 (2106) */
699 #define SEALEVEL_2201_1_PID     0x2211  /* SeaPORT+2/232 (2201) Port 1 */
700 #define SEALEVEL_2201_2_PID     0x2221  /* SeaPORT+2/232 (2201) Port 2 */
701 #define SEALEVEL_2202_1_PID     0x2212  /* SeaPORT+2/485 (2202) Port 1 */
702 #define SEALEVEL_2202_2_PID     0x2222  /* SeaPORT+2/485 (2202) Port 2 */
703 #define SEALEVEL_2203_1_PID     0x2213  /* SeaPORT+2 (2203) Port 1 */
704 #define SEALEVEL_2203_2_PID     0x2223  /* SeaPORT+2 (2203) Port 2 */
705 #define SEALEVEL_2401_1_PID     0x2411  /* SeaPORT+4/232 (2401) Port 1 */
706 #define SEALEVEL_2401_2_PID     0x2421  /* SeaPORT+4/232 (2401) Port 2 */
707 #define SEALEVEL_2401_3_PID     0x2431  /* SeaPORT+4/232 (2401) Port 3 */
708 #define SEALEVEL_2401_4_PID     0x2441  /* SeaPORT+4/232 (2401) Port 4 */
709 #define SEALEVEL_2402_1_PID     0x2412  /* SeaPORT+4/485 (2402) Port 1 */
710 #define SEALEVEL_2402_2_PID     0x2422  /* SeaPORT+4/485 (2402) Port 2 */
711 #define SEALEVEL_2402_3_PID     0x2432  /* SeaPORT+4/485 (2402) Port 3 */
712 #define SEALEVEL_2402_4_PID     0x2442  /* SeaPORT+4/485 (2402) Port 4 */
713 #define SEALEVEL_2403_1_PID     0x2413  /* SeaPORT+4 (2403) Port 1 */
714 #define SEALEVEL_2403_2_PID     0x2423  /* SeaPORT+4 (2403) Port 2 */
715 #define SEALEVEL_2403_3_PID     0x2433  /* SeaPORT+4 (2403) Port 3 */
716 #define SEALEVEL_2403_4_PID     0x2443  /* SeaPORT+4 (2403) Port 4 */
717 #define SEALEVEL_2801_1_PID     0X2811  /* SeaLINK+8/232 (2801) Port 1 */
718 #define SEALEVEL_2801_2_PID     0X2821  /* SeaLINK+8/232 (2801) Port 2 */
719 #define SEALEVEL_2801_3_PID     0X2831  /* SeaLINK+8/232 (2801) Port 3 */
720 #define SEALEVEL_2801_4_PID     0X2841  /* SeaLINK+8/232 (2801) Port 4 */
721 #define SEALEVEL_2801_5_PID     0X2851  /* SeaLINK+8/232 (2801) Port 5 */
722 #define SEALEVEL_2801_6_PID     0X2861  /* SeaLINK+8/232 (2801) Port 6 */
723 #define SEALEVEL_2801_7_PID     0X2871  /* SeaLINK+8/232 (2801) Port 7 */
724 #define SEALEVEL_2801_8_PID     0X2881  /* SeaLINK+8/232 (2801) Port 8 */
725 #define SEALEVEL_2802_1_PID     0X2812  /* SeaLINK+8/485 (2802) Port 1 */
726 #define SEALEVEL_2802_2_PID     0X2822  /* SeaLINK+8/485 (2802) Port 2 */
727 #define SEALEVEL_2802_3_PID     0X2832  /* SeaLINK+8/485 (2802) Port 3 */
728 #define SEALEVEL_2802_4_PID     0X2842  /* SeaLINK+8/485 (2802) Port 4 */
729 #define SEALEVEL_2802_5_PID     0X2852  /* SeaLINK+8/485 (2802) Port 5 */
730 #define SEALEVEL_2802_6_PID     0X2862  /* SeaLINK+8/485 (2802) Port 6 */
731 #define SEALEVEL_2802_7_PID     0X2872  /* SeaLINK+8/485 (2802) Port 7 */
732 #define SEALEVEL_2802_8_PID     0X2882  /* SeaLINK+8/485 (2802) Port 8 */
733 #define SEALEVEL_2803_1_PID     0X2813  /* SeaLINK+8 (2803) Port 1 */
734 #define SEALEVEL_2803_2_PID     0X2823  /* SeaLINK+8 (2803) Port 2 */
735 #define SEALEVEL_2803_3_PID     0X2833  /* SeaLINK+8 (2803) Port 3 */
736 #define SEALEVEL_2803_4_PID     0X2843  /* SeaLINK+8 (2803) Port 4 */
737 #define SEALEVEL_2803_5_PID     0X2853  /* SeaLINK+8 (2803) Port 5 */
738 #define SEALEVEL_2803_6_PID     0X2863  /* SeaLINK+8 (2803) Port 6 */
739 #define SEALEVEL_2803_7_PID     0X2873  /* SeaLINK+8 (2803) Port 7 */
740 #define SEALEVEL_2803_8_PID     0X2883  /* SeaLINK+8 (2803) Port 8 */
741 #define SEALEVEL_2803R_1_PID    0Xa02a  /* SeaLINK+8 (2803-ROHS) Port 1+2 */
742 #define SEALEVEL_2803R_2_PID    0Xa02b  /* SeaLINK+8 (2803-ROHS) Port 3+4 */
743 #define SEALEVEL_2803R_3_PID    0Xa02c  /* SeaLINK+8 (2803-ROHS) Port 5+6 */
744 #define SEALEVEL_2803R_4_PID    0Xa02d  /* SeaLINK+8 (2803-ROHS) Port 7+8 */
745 
746 /*
747  * JETI SPECTROMETER SPECBOS 1201
748  * http://www.jeti.com/cms/index.php/instruments/other-instruments/specbos-2101
749  */
750 #define JETI_VID                0x0c6c
751 #define JETI_SPC1201_PID        0x04b2
752 
753 /*
754  * FTDI USB UART chips used in construction projects from the
755  * Elektor Electronics magazine (http://www.elektor.com/)
756  */
757 #define ELEKTOR_VID             0x0C7D
758 #define ELEKTOR_FT323R_PID      0x0005  /* RFID-Reader, issue 09-2006 */
759 
760 /*
761  * Posiflex inc retail equipment (http://www.posiflex.com.tw)
762  */
763 #define POSIFLEX_VID            0x0d3a  /* Vendor ID */
764 #define POSIFLEX_PP7000_PID     0x0300  /* PP-7000II thermal printer */
765 
766 /*
767  * The following are the values for two KOBIL chipcard terminals.
768  */
769 #define KOBIL_VID               0x0d46  /* KOBIL Vendor ID */
770 #define KOBIL_CONV_B1_PID       0x2020  /* KOBIL Konverter for B1 */
771 #define KOBIL_CONV_KAAN_PID     0x2021  /* KOBIL_Konverter for KAAN */
772 
773 #define FTDI_NF_RIC_VID 0x0DCD  /* Vendor Id */
774 #define FTDI_NF_RIC_PID 0x0001  /* Product Id */
775 
776 /*
777  * Falcom Wireless Communications GmbH
778  */
779 #define FALCOM_VID              0x0F94  /* Vendor Id */
780 #define FALCOM_TWIST_PID        0x0001  /* Falcom Twist USB GPRS modem */
781 #define FALCOM_SAMBA_PID        0x0005  /* Falcom Samba USB GPRS modem */
782 
783 /* Larsen and Brusgaard AltiTrack/USBtrack */
784 #define LARSENBRUSGAARD_VID             0x0FD8
785 #define LB_ALTITRACK_PID                0x0001
786 
787 /*
788  * TTi (Thurlby Thandar Instruments)
789  */
790 #define TTI_VID                 0x103E  /* Vendor Id */
791 #define TTI_QL355P_PID          0x03E8  /* TTi QL355P power supply */
792 
793 /*
794  * Newport Cooperation (www.newport.com)
795  */
796 #define NEWPORT_VID                     0x104D
797 #define NEWPORT_AGILIS_PID              0x3000
798 #define NEWPORT_CONEX_CC_PID            0x3002
799 #define NEWPORT_CONEX_AGP_PID           0x3006
800 
801 /* Interbiometrics USB I/O Board */
802 /* Developed for Interbiometrics by Rudolf Gugler */
803 #define INTERBIOMETRICS_VID              0x1209
804 #define INTERBIOMETRICS_IOBOARD_PID      0x1002
805 #define INTERBIOMETRICS_MINI_IOBOARD_PID 0x1006
806 
807 /*
808  * Testo products (http://www.testo.com/)
809  * Submitted by Colin Leroy
810  */
811 #define TESTO_VID                       0x128D
812 #define TESTO_1_PID                     0x0001
813 #define TESTO_3_PID                     0x0003
814 
815 /*
816  * Mobility Electronics products.
817  */
818 #define MOBILITY_VID                    0x1342
819 #define MOBILITY_USB_SERIAL_PID         0x0202  /* EasiDock USB 200 serial */
820 
821 /*
822  * FIC / OpenMoko, Inc. http://wiki.openmoko.org/wiki/Neo1973_Debug_Board_v3
823  * Submitted by Harald Welte <laforge@openmoko.org>
824  */
825 #define FIC_VID                 0x1457
826 #define FIC_NEO1973_DEBUG_PID   0x5118
827 
828 /* Olimex */
829 #define OLIMEX_VID                      0x15BA
830 #define OLIMEX_ARM_USB_OCD_PID          0x0003
831 #define OLIMEX_ARM_USB_OCD_H_PID        0x002b
832 
833 /*
834  * Telldus Technologies
835  */
836 #define TELLDUS_VID                     0x1781  /* Vendor ID */
837 #define TELLDUS_TELLSTICK_PID           0x0C30  /* RF control dongle 433 MHz using FT232RL */
838 
839 /*
840  * NOVITUS printers
841  */
842 #define NOVITUS_VID                     0x1a28
843 #define NOVITUS_BONO_E_PID              0x6010
844 
845 /*
846  * RT Systems programming cables for various ham radios
847  */
848 #define RTSYSTEMS_VID           0x2100  /* Vendor ID */
849 #define RTSYSTEMS_USB_S03_PID   0x9001  /* RTS-03 USB to Serial Adapter */
850 #define RTSYSTEMS_USB_59_PID    0x9e50  /* USB-59 USB to 8 pin plug */
851 #define RTSYSTEMS_USB_57A_PID   0x9e51  /* USB-57A USB to 4pin 3.5mm plug */
852 #define RTSYSTEMS_USB_57B_PID   0x9e52  /* USB-57B USB to extended 4pin 3.5mm plug */
853 #define RTSYSTEMS_USB_29A_PID   0x9e53  /* USB-29A USB to 3.5mm stereo plug */
854 #define RTSYSTEMS_USB_29B_PID   0x9e54  /* USB-29B USB to 6 pin mini din */
855 #define RTSYSTEMS_USB_29F_PID   0x9e55  /* USB-29F USB to 6 pin modular plug */
856 #define RTSYSTEMS_USB_62B_PID   0x9e56  /* USB-62B USB to 8 pin mini din plug*/
857 #define RTSYSTEMS_USB_S01_PID   0x9e57  /* USB-RTS01 USB to 3.5 mm stereo plug*/
858 #define RTSYSTEMS_USB_63_PID    0x9e58  /* USB-63 USB to 9 pin female*/
859 #define RTSYSTEMS_USB_29C_PID   0x9e59  /* USB-29C USB to 4 pin modular plug*/
860 #define RTSYSTEMS_USB_81B_PID   0x9e5A  /* USB-81 USB to 8 pin mini din plug*/
861 #define RTSYSTEMS_USB_82B_PID   0x9e5B  /* USB-82 USB to 2.5 mm stereo plug*/
862 #define RTSYSTEMS_USB_K5D_PID   0x9e5C  /* USB-K5D USB to 8 pin modular plug*/
863 #define RTSYSTEMS_USB_K4Y_PID   0x9e5D  /* USB-K4Y USB to 2.5/3.5 mm plugs*/
864 #define RTSYSTEMS_USB_K5G_PID   0x9e5E  /* USB-K5G USB to 8 pin modular plug*/
865 #define RTSYSTEMS_USB_S05_PID   0x9e5F  /* USB-RTS05 USB to 2.5 mm stereo plug*/
866 #define RTSYSTEMS_USB_60_PID    0x9e60  /* USB-60 USB to 6 pin din*/
867 #define RTSYSTEMS_USB_61_PID    0x9e61  /* USB-61 USB to 6 pin mini din*/
868 #define RTSYSTEMS_USB_62_PID    0x9e62  /* USB-62 USB to 8 pin mini din*/
869 #define RTSYSTEMS_USB_63B_PID   0x9e63  /* USB-63 USB to 9 pin female*/
870 #define RTSYSTEMS_USB_64_PID    0x9e64  /* USB-64 USB to 9 pin male*/
871 #define RTSYSTEMS_USB_65_PID    0x9e65  /* USB-65 USB to 9 pin female null modem*/
872 #define RTSYSTEMS_USB_92_PID    0x9e66  /* USB-92 USB to 12 pin plug*/
873 #define RTSYSTEMS_USB_92D_PID   0x9e67  /* USB-92D USB to 12 pin plug data*/
874 #define RTSYSTEMS_USB_W5R_PID   0x9e68  /* USB-W5R USB to 8 pin modular plug*/
875 #define RTSYSTEMS_USB_A5R_PID   0x9e69  /* USB-A5R USB to 8 pin modular plug*/
876 #define RTSYSTEMS_USB_PW1_PID   0x9e6A  /* USB-PW1 USB to 8 pin modular plug*/
877 
878 /*
879  * Physik Instrumente
880  * http://www.physikinstrumente.com/en/products/
881  */
882 /* These two devices use the VID of FTDI */
883 #define PI_C865_PID     0xe0a0  /* PI C-865 Piezomotor Controller */
884 #define PI_C857_PID     0xe0a1  /* PI Encoder Trigger Box */
885 
886 #define PI_VID              0x1a72  /* Vendor ID */
887 #define PI_C866_PID     0x1000  /* PI C-866 Piezomotor Controller */
888 #define PI_C663_PID     0x1001  /* PI C-663 Mercury-Step */
889 #define PI_C725_PID     0x1002  /* PI C-725 Piezomotor Controller */
890 #define PI_E517_PID     0x1005  /* PI E-517 Digital Piezo Controller Operation Module */
891 #define PI_C863_PID     0x1007  /* PI C-863 */
892 #define PI_E861_PID     0x1008  /* PI E-861 Piezomotor Controller */
893 #define PI_C867_PID     0x1009  /* PI C-867 Piezomotor Controller */
894 #define PI_E609_PID     0x100D  /* PI E-609 Digital Piezo Controller */
895 #define PI_E709_PID     0x100E  /* PI E-709 Digital Piezo Controller */
896 #define PI_100F_PID     0x100F  /* PI Digital Piezo Controller */
897 #define PI_1011_PID     0x1011  /* PI Digital Piezo Controller */
898 #define PI_1012_PID     0x1012  /* PI Motion Controller */
899 #define PI_1013_PID     0x1013  /* PI Motion Controller */
900 #define PI_1014_PID     0x1014  /* PI Device */
901 #define PI_1015_PID     0x1015  /* PI Device */
902 #define PI_1016_PID     0x1016  /* PI Digital Servo Module */
903 
904 /*
905  * Kondo Kagaku Co.Ltd.
906  * http://www.kondo-robot.com/EN
907  */
908 #define KONDO_VID               0x165c
909 #define KONDO_USB_SERIAL_PID    0x0002
910 
911 /*
912  * Bayer Ascensia Contour blood glucose meter USB-converter cable.
913  * http://winglucofacts.com/cables/
914  */
915 #define BAYER_VID                      0x1A79
916 #define BAYER_CONTOUR_CABLE_PID        0x6001
917 
918 /*
919  * The following are the values for the Matrix Orbital FTDI Range
920  * Anything in this range will use an FT232RL.
921  */
922 #define MTXORB_VID                      0x1B3D
923 #define MTXORB_FTDI_RANGE_0100_PID      0x0100
924 #define MTXORB_FTDI_RANGE_0101_PID      0x0101
925 #define MTXORB_FTDI_RANGE_0102_PID      0x0102
926 #define MTXORB_FTDI_RANGE_0103_PID      0x0103
927 #define MTXORB_FTDI_RANGE_0104_PID      0x0104
928 #define MTXORB_FTDI_RANGE_0105_PID      0x0105
929 #define MTXORB_FTDI_RANGE_0106_PID      0x0106
930 #define MTXORB_FTDI_RANGE_0107_PID      0x0107
931 #define MTXORB_FTDI_RANGE_0108_PID      0x0108
932 #define MTXORB_FTDI_RANGE_0109_PID      0x0109
933 #define MTXORB_FTDI_RANGE_010A_PID      0x010A
934 #define MTXORB_FTDI_RANGE_010B_PID      0x010B
935 #define MTXORB_FTDI_RANGE_010C_PID      0x010C
936 #define MTXORB_FTDI_RANGE_010D_PID      0x010D
937 #define MTXORB_FTDI_RANGE_010E_PID      0x010E
938 #define MTXORB_FTDI_RANGE_010F_PID      0x010F
939 #define MTXORB_FTDI_RANGE_0110_PID      0x0110
940 #define MTXORB_FTDI_RANGE_0111_PID      0x0111
941 #define MTXORB_FTDI_RANGE_0112_PID      0x0112
942 #define MTXORB_FTDI_RANGE_0113_PID      0x0113
943 #define MTXORB_FTDI_RANGE_0114_PID      0x0114
944 #define MTXORB_FTDI_RANGE_0115_PID      0x0115
945 #define MTXORB_FTDI_RANGE_0116_PID      0x0116
946 #define MTXORB_FTDI_RANGE_0117_PID      0x0117
947 #define MTXORB_FTDI_RANGE_0118_PID      0x0118
948 #define MTXORB_FTDI_RANGE_0119_PID      0x0119
949 #define MTXORB_FTDI_RANGE_011A_PID      0x011A
950 #define MTXORB_FTDI_RANGE_011B_PID      0x011B
951 #define MTXORB_FTDI_RANGE_011C_PID      0x011C
952 #define MTXORB_FTDI_RANGE_011D_PID      0x011D
953 #define MTXORB_FTDI_RANGE_011E_PID      0x011E
954 #define MTXORB_FTDI_RANGE_011F_PID      0x011F
955 #define MTXORB_FTDI_RANGE_0120_PID      0x0120
956 #define MTXORB_FTDI_RANGE_0121_PID      0x0121
957 #define MTXORB_FTDI_RANGE_0122_PID      0x0122
958 #define MTXORB_FTDI_RANGE_0123_PID      0x0123
959 #define MTXORB_FTDI_RANGE_0124_PID      0x0124
960 #define MTXORB_FTDI_RANGE_0125_PID      0x0125
961 #define MTXORB_FTDI_RANGE_0126_PID      0x0126
962 #define MTXORB_FTDI_RANGE_0127_PID      0x0127
963 #define MTXORB_FTDI_RANGE_0128_PID      0x0128
964 #define MTXORB_FTDI_RANGE_0129_PID      0x0129
965 #define MTXORB_FTDI_RANGE_012A_PID      0x012A
966 #define MTXORB_FTDI_RANGE_012B_PID      0x012B
967 #define MTXORB_FTDI_RANGE_012C_PID      0x012C
968 #define MTXORB_FTDI_RANGE_012D_PID      0x012D
969 #define MTXORB_FTDI_RANGE_012E_PID      0x012E
970 #define MTXORB_FTDI_RANGE_012F_PID      0x012F
971 #define MTXORB_FTDI_RANGE_0130_PID      0x0130
972 #define MTXORB_FTDI_RANGE_0131_PID      0x0131
973 #define MTXORB_FTDI_RANGE_0132_PID      0x0132
974 #define MTXORB_FTDI_RANGE_0133_PID      0x0133
975 #define MTXORB_FTDI_RANGE_0134_PID      0x0134
976 #define MTXORB_FTDI_RANGE_0135_PID      0x0135
977 #define MTXORB_FTDI_RANGE_0136_PID      0x0136
978 #define MTXORB_FTDI_RANGE_0137_PID      0x0137
979 #define MTXORB_FTDI_RANGE_0138_PID      0x0138
980 #define MTXORB_FTDI_RANGE_0139_PID      0x0139
981 #define MTXORB_FTDI_RANGE_013A_PID      0x013A
982 #define MTXORB_FTDI_RANGE_013B_PID      0x013B
983 #define MTXORB_FTDI_RANGE_013C_PID      0x013C
984 #define MTXORB_FTDI_RANGE_013D_PID      0x013D
985 #define MTXORB_FTDI_RANGE_013E_PID      0x013E
986 #define MTXORB_FTDI_RANGE_013F_PID      0x013F
987 #define MTXORB_FTDI_RANGE_0140_PID      0x0140
988 #define MTXORB_FTDI_RANGE_0141_PID      0x0141
989 #define MTXORB_FTDI_RANGE_0142_PID      0x0142
990 #define MTXORB_FTDI_RANGE_0143_PID      0x0143
991 #define MTXORB_FTDI_RANGE_0144_PID      0x0144
992 #define MTXORB_FTDI_RANGE_0145_PID      0x0145
993 #define MTXORB_FTDI_RANGE_0146_PID      0x0146
994 #define MTXORB_FTDI_RANGE_0147_PID      0x0147
995 #define MTXORB_FTDI_RANGE_0148_PID      0x0148
996 #define MTXORB_FTDI_RANGE_0149_PID      0x0149
997 #define MTXORB_FTDI_RANGE_014A_PID      0x014A
998 #define MTXORB_FTDI_RANGE_014B_PID      0x014B
999 #define MTXORB_FTDI_RANGE_014C_PID      0x014C
1000 #define MTXORB_FTDI_RANGE_014D_PID      0x014D
1001 #define MTXORB_FTDI_RANGE_014E_PID      0x014E
1002 #define MTXORB_FTDI_RANGE_014F_PID      0x014F
1003 #define MTXORB_FTDI_RANGE_0150_PID      0x0150
1004 #define MTXORB_FTDI_RANGE_0151_PID      0x0151
1005 #define MTXORB_FTDI_RANGE_0152_PID      0x0152
1006 #define MTXORB_FTDI_RANGE_0153_PID      0x0153
1007 #define MTXORB_FTDI_RANGE_0154_PID      0x0154
1008 #define MTXORB_FTDI_RANGE_0155_PID      0x0155
1009 #define MTXORB_FTDI_RANGE_0156_PID      0x0156
1010 #define MTXORB_FTDI_RANGE_0157_PID      0x0157
1011 #define MTXORB_FTDI_RANGE_0158_PID      0x0158
1012 #define MTXORB_FTDI_RANGE_0159_PID      0x0159
1013 #define MTXORB_FTDI_RANGE_015A_PID      0x015A
1014 #define MTXORB_FTDI_RANGE_015B_PID      0x015B
1015 #define MTXORB_FTDI_RANGE_015C_PID      0x015C
1016 #define MTXORB_FTDI_RANGE_015D_PID      0x015D
1017 #define MTXORB_FTDI_RANGE_015E_PID      0x015E
1018 #define MTXORB_FTDI_RANGE_015F_PID      0x015F
1019 #define MTXORB_FTDI_RANGE_0160_PID      0x0160
1020 #define MTXORB_FTDI_RANGE_0161_PID      0x0161
1021 #define MTXORB_FTDI_RANGE_0162_PID      0x0162
1022 #define MTXORB_FTDI_RANGE_0163_PID      0x0163
1023 #define MTXORB_FTDI_RANGE_0164_PID      0x0164
1024 #define MTXORB_FTDI_RANGE_0165_PID      0x0165
1025 #define MTXORB_FTDI_RANGE_0166_PID      0x0166
1026 #define MTXORB_FTDI_RANGE_0167_PID      0x0167
1027 #define MTXORB_FTDI_RANGE_0168_PID      0x0168
1028 #define MTXORB_FTDI_RANGE_0169_PID      0x0169
1029 #define MTXORB_FTDI_RANGE_016A_PID      0x016A
1030 #define MTXORB_FTDI_RANGE_016B_PID      0x016B
1031 #define MTXORB_FTDI_RANGE_016C_PID      0x016C
1032 #define MTXORB_FTDI_RANGE_016D_PID      0x016D
1033 #define MTXORB_FTDI_RANGE_016E_PID      0x016E
1034 #define MTXORB_FTDI_RANGE_016F_PID      0x016F
1035 #define MTXORB_FTDI_RANGE_0170_PID      0x0170
1036 #define MTXORB_FTDI_RANGE_0171_PID      0x0171
1037 #define MTXORB_FTDI_RANGE_0172_PID      0x0172
1038 #define MTXORB_FTDI_RANGE_0173_PID      0x0173
1039 #define MTXORB_FTDI_RANGE_0174_PID      0x0174
1040 #define MTXORB_FTDI_RANGE_0175_PID      0x0175
1041 #define MTXORB_FTDI_RANGE_0176_PID      0x0176
1042 #define MTXORB_FTDI_RANGE_0177_PID      0x0177
1043 #define MTXORB_FTDI_RANGE_0178_PID      0x0178
1044 #define MTXORB_FTDI_RANGE_0179_PID      0x0179
1045 #define MTXORB_FTDI_RANGE_017A_PID      0x017A
1046 #define MTXORB_FTDI_RANGE_017B_PID      0x017B
1047 #define MTXORB_FTDI_RANGE_017C_PID      0x017C
1048 #define MTXORB_FTDI_RANGE_017D_PID      0x017D
1049 #define MTXORB_FTDI_RANGE_017E_PID      0x017E
1050 #define MTXORB_FTDI_RANGE_017F_PID      0x017F
1051 #define MTXORB_FTDI_RANGE_0180_PID      0x0180
1052 #define MTXORB_FTDI_RANGE_0181_PID      0x0181
1053 #define MTXORB_FTDI_RANGE_0182_PID      0x0182
1054 #define MTXORB_FTDI_RANGE_0183_PID      0x0183
1055 #define MTXORB_FTDI_RANGE_0184_PID      0x0184
1056 #define MTXORB_FTDI_RANGE_0185_PID      0x0185
1057 #define MTXORB_FTDI_RANGE_0186_PID      0x0186
1058 #define MTXORB_FTDI_RANGE_0187_PID      0x0187
1059 #define MTXORB_FTDI_RANGE_0188_PID      0x0188
1060 #define MTXORB_FTDI_RANGE_0189_PID      0x0189
1061 #define MTXORB_FTDI_RANGE_018A_PID      0x018A
1062 #define MTXORB_FTDI_RANGE_018B_PID      0x018B
1063 #define MTXORB_FTDI_RANGE_018C_PID      0x018C
1064 #define MTXORB_FTDI_RANGE_018D_PID      0x018D
1065 #define MTXORB_FTDI_RANGE_018E_PID      0x018E
1066 #define MTXORB_FTDI_RANGE_018F_PID      0x018F
1067 #define MTXORB_FTDI_RANGE_0190_PID      0x0190
1068 #define MTXORB_FTDI_RANGE_0191_PID      0x0191
1069 #define MTXORB_FTDI_RANGE_0192_PID      0x0192
1070 #define MTXORB_FTDI_RANGE_0193_PID      0x0193
1071 #define MTXORB_FTDI_RANGE_0194_PID      0x0194
1072 #define MTXORB_FTDI_RANGE_0195_PID      0x0195
1073 #define MTXORB_FTDI_RANGE_0196_PID      0x0196
1074 #define MTXORB_FTDI_RANGE_0197_PID      0x0197
1075 #define MTXORB_FTDI_RANGE_0198_PID      0x0198
1076 #define MTXORB_FTDI_RANGE_0199_PID      0x0199
1077 #define MTXORB_FTDI_RANGE_019A_PID      0x019A
1078 #define MTXORB_FTDI_RANGE_019B_PID      0x019B
1079 #define MTXORB_FTDI_RANGE_019C_PID      0x019C
1080 #define MTXORB_FTDI_RANGE_019D_PID      0x019D
1081 #define MTXORB_FTDI_RANGE_019E_PID      0x019E
1082 #define MTXORB_FTDI_RANGE_019F_PID      0x019F
1083 #define MTXORB_FTDI_RANGE_01A0_PID      0x01A0
1084 #define MTXORB_FTDI_RANGE_01A1_PID      0x01A1
1085 #define MTXORB_FTDI_RANGE_01A2_PID      0x01A2
1086 #define MTXORB_FTDI_RANGE_01A3_PID      0x01A3
1087 #define MTXORB_FTDI_RANGE_01A4_PID      0x01A4
1088 #define MTXORB_FTDI_RANGE_01A5_PID      0x01A5
1089 #define MTXORB_FTDI_RANGE_01A6_PID      0x01A6
1090 #define MTXORB_FTDI_RANGE_01A7_PID      0x01A7
1091 #define MTXORB_FTDI_RANGE_01A8_PID      0x01A8
1092 #define MTXORB_FTDI_RANGE_01A9_PID      0x01A9
1093 #define MTXORB_FTDI_RANGE_01AA_PID      0x01AA
1094 #define MTXORB_FTDI_RANGE_01AB_PID      0x01AB
1095 #define MTXORB_FTDI_RANGE_01AC_PID      0x01AC
1096 #define MTXORB_FTDI_RANGE_01AD_PID      0x01AD
1097 #define MTXORB_FTDI_RANGE_01AE_PID      0x01AE
1098 #define MTXORB_FTDI_RANGE_01AF_PID      0x01AF
1099 #define MTXORB_FTDI_RANGE_01B0_PID      0x01B0
1100 #define MTXORB_FTDI_RANGE_01B1_PID      0x01B1
1101 #define MTXORB_FTDI_RANGE_01B2_PID      0x01B2
1102 #define MTXORB_FTDI_RANGE_01B3_PID      0x01B3
1103 #define MTXORB_FTDI_RANGE_01B4_PID      0x01B4
1104 #define MTXORB_FTDI_RANGE_01B5_PID      0x01B5
1105 #define MTXORB_FTDI_RANGE_01B6_PID      0x01B6
1106 #define MTXORB_FTDI_RANGE_01B7_PID      0x01B7
1107 #define MTXORB_FTDI_RANGE_01B8_PID      0x01B8
1108 #define MTXORB_FTDI_RANGE_01B9_PID      0x01B9
1109 #define MTXORB_FTDI_RANGE_01BA_PID      0x01BA
1110 #define MTXORB_FTDI_RANGE_01BB_PID      0x01BB
1111 #define MTXORB_FTDI_RANGE_01BC_PID      0x01BC
1112 #define MTXORB_FTDI_RANGE_01BD_PID      0x01BD
1113 #define MTXORB_FTDI_RANGE_01BE_PID      0x01BE
1114 #define MTXORB_FTDI_RANGE_01BF_PID      0x01BF
1115 #define MTXORB_FTDI_RANGE_01C0_PID      0x01C0
1116 #define MTXORB_FTDI_RANGE_01C1_PID      0x01C1
1117 #define MTXORB_FTDI_RANGE_01C2_PID      0x01C2
1118 #define MTXORB_FTDI_RANGE_01C3_PID      0x01C3
1119 #define MTXORB_FTDI_RANGE_01C4_PID      0x01C4
1120 #define MTXORB_FTDI_RANGE_01C5_PID      0x01C5
1121 #define MTXORB_FTDI_RANGE_01C6_PID      0x01C6
1122 #define MTXORB_FTDI_RANGE_01C7_PID      0x01C7
1123 #define MTXORB_FTDI_RANGE_01C8_PID      0x01C8
1124 #define MTXORB_FTDI_RANGE_01C9_PID      0x01C9
1125 #define MTXORB_FTDI_RANGE_01CA_PID      0x01CA
1126 #define MTXORB_FTDI_RANGE_01CB_PID      0x01CB
1127 #define MTXORB_FTDI_RANGE_01CC_PID      0x01CC
1128 #define MTXORB_FTDI_RANGE_01CD_PID      0x01CD
1129 #define MTXORB_FTDI_RANGE_01CE_PID      0x01CE
1130 #define MTXORB_FTDI_RANGE_01CF_PID      0x01CF
1131 #define MTXORB_FTDI_RANGE_01D0_PID      0x01D0
1132 #define MTXORB_FTDI_RANGE_01D1_PID      0x01D1
1133 #define MTXORB_FTDI_RANGE_01D2_PID      0x01D2
1134 #define MTXORB_FTDI_RANGE_01D3_PID      0x01D3
1135 #define MTXORB_FTDI_RANGE_01D4_PID      0x01D4
1136 #define MTXORB_FTDI_RANGE_01D5_PID      0x01D5
1137 #define MTXORB_FTDI_RANGE_01D6_PID      0x01D6
1138 #define MTXORB_FTDI_RANGE_01D7_PID      0x01D7
1139 #define MTXORB_FTDI_RANGE_01D8_PID      0x01D8
1140 #define MTXORB_FTDI_RANGE_01D9_PID      0x01D9
1141 #define MTXORB_FTDI_RANGE_01DA_PID      0x01DA
1142 #define MTXORB_FTDI_RANGE_01DB_PID      0x01DB
1143 #define MTXORB_FTDI_RANGE_01DC_PID      0x01DC
1144 #define MTXORB_FTDI_RANGE_01DD_PID      0x01DD
1145 #define MTXORB_FTDI_RANGE_01DE_PID      0x01DE
1146 #define MTXORB_FTDI_RANGE_01DF_PID      0x01DF
1147 #define MTXORB_FTDI_RANGE_01E0_PID      0x01E0
1148 #define MTXORB_FTDI_RANGE_01E1_PID      0x01E1
1149 #define MTXORB_FTDI_RANGE_01E2_PID      0x01E2
1150 #define MTXORB_FTDI_RANGE_01E3_PID      0x01E3
1151 #define MTXORB_FTDI_RANGE_01E4_PID      0x01E4
1152 #define MTXORB_FTDI_RANGE_01E5_PID      0x01E5
1153 #define MTXORB_FTDI_RANGE_01E6_PID      0x01E6
1154 #define MTXORB_FTDI_RANGE_01E7_PID      0x01E7
1155 #define MTXORB_FTDI_RANGE_01E8_PID      0x01E8
1156 #define MTXORB_FTDI_RANGE_01E9_PID      0x01E9
1157 #define MTXORB_FTDI_RANGE_01EA_PID      0x01EA
1158 #define MTXORB_FTDI_RANGE_01EB_PID      0x01EB
1159 #define MTXORB_FTDI_RANGE_01EC_PID      0x01EC
1160 #define MTXORB_FTDI_RANGE_01ED_PID      0x01ED
1161 #define MTXORB_FTDI_RANGE_01EE_PID      0x01EE
1162 #define MTXORB_FTDI_RANGE_01EF_PID      0x01EF
1163 #define MTXORB_FTDI_RANGE_01F0_PID      0x01F0
1164 #define MTXORB_FTDI_RANGE_01F1_PID      0x01F1
1165 #define MTXORB_FTDI_RANGE_01F2_PID      0x01F2
1166 #define MTXORB_FTDI_RANGE_01F3_PID      0x01F3
1167 #define MTXORB_FTDI_RANGE_01F4_PID      0x01F4
1168 #define MTXORB_FTDI_RANGE_01F5_PID      0x01F5
1169 #define MTXORB_FTDI_RANGE_01F6_PID      0x01F6
1170 #define MTXORB_FTDI_RANGE_01F7_PID      0x01F7
1171 #define MTXORB_FTDI_RANGE_01F8_PID      0x01F8
1172 #define MTXORB_FTDI_RANGE_01F9_PID      0x01F9
1173 #define MTXORB_FTDI_RANGE_01FA_PID      0x01FA
1174 #define MTXORB_FTDI_RANGE_01FB_PID      0x01FB
1175 #define MTXORB_FTDI_RANGE_01FC_PID      0x01FC
1176 #define MTXORB_FTDI_RANGE_01FD_PID      0x01FD
1177 #define MTXORB_FTDI_RANGE_01FE_PID      0x01FE
1178 #define MTXORB_FTDI_RANGE_01FF_PID      0x01FF
1179 
1180 
1181 
1182 /*
1183  * The Mobility Lab (TML)
1184  * Submitted by Pierre Castella
1185  */
1186 #define TML_VID                 0x1B91  /* Vendor ID */
1187 #define TML_USB_SERIAL_PID      0x0064  /* USB - Serial Converter */
1188 
1189 /* Alti-2 products  http://www.alti-2.com */
1190 #define ALTI2_VID       0x1BC9
1191 #define ALTI2_N3_PID    0x6001  /* Neptune 3 */
1192 
1193 /*
1194  * Ionics PlugComputer
1195  */
1196 #define IONICS_VID                      0x1c0c
1197 #define IONICS_PLUGCOMPUTER_PID         0x0102
1198 
1199 /*
1200  * Dresden Elektronik Sensor Terminal Board
1201  */
1202 #define DE_VID                  0x1cf1 /* Vendor ID */
1203 #define STB_PID                 0x0001 /* Sensor Terminal Board */
1204 #define WHT_PID                 0x0004 /* Wireless Handheld Terminal */
1205 
1206 /*
1207  * STMicroelectonics
1208  */
1209 #define ST_VID                  0x0483
1210 #define ST_STMCLT_2232_PID      0x3746
1211 #define ST_STMCLT_4232_PID      0x3747
1212 
1213 /*
1214  * Papouch products (http://www.papouch.com/)
1215  * Submitted by Folkert van Heusden
1216  */
1217 
1218 #define PAPOUCH_VID                     0x5050  /* Vendor ID */
1219 #define PAPOUCH_SB485_PID               0x0100  /* Papouch SB485 USB-485/422 Converter */
1220 #define PAPOUCH_AP485_PID               0x0101  /* AP485 USB-RS485 Converter */
1221 #define PAPOUCH_SB422_PID               0x0102  /* Papouch SB422 USB-RS422 Converter  */
1222 #define PAPOUCH_SB485_2_PID             0x0103  /* Papouch SB485 USB-485/422 Converter */
1223 #define PAPOUCH_AP485_2_PID             0x0104  /* AP485 USB-RS485 Converter */
1224 #define PAPOUCH_SB422_2_PID             0x0105  /* Papouch SB422 USB-RS422 Converter  */
1225 #define PAPOUCH_SB485S_PID              0x0106  /* Papouch SB485S USB-485/422 Converter */
1226 #define PAPOUCH_SB485C_PID              0x0107  /* Papouch SB485C USB-485/422 Converter */
1227 #define PAPOUCH_LEC_PID                 0x0300  /* LEC USB Converter */
1228 #define PAPOUCH_SB232_PID               0x0301  /* Papouch SB232 USB-RS232 Converter */
1229 #define PAPOUCH_TMU_PID                 0x0400  /* TMU USB Thermometer */
1230 #define PAPOUCH_IRAMP_PID               0x0500  /* Papouch IRAmp Duplex */
1231 #define PAPOUCH_DRAK5_PID               0x0700  /* Papouch DRAK5 */
1232 #define PAPOUCH_QUIDO8x8_PID            0x0800  /* Papouch Quido 8/8 Module */
1233 #define PAPOUCH_QUIDO4x4_PID            0x0900  /* Papouch Quido 4/4 Module */
1234 #define PAPOUCH_QUIDO2x2_PID            0x0a00  /* Papouch Quido 2/2 Module */
1235 #define PAPOUCH_QUIDO10x1_PID           0x0b00  /* Papouch Quido 10/1 Module */
1236 #define PAPOUCH_QUIDO30x3_PID           0x0c00  /* Papouch Quido 30/3 Module */
1237 #define PAPOUCH_QUIDO60x3_PID           0x0d00  /* Papouch Quido 60(100)/3 Module */
1238 #define PAPOUCH_QUIDO2x16_PID           0x0e00  /* Papouch Quido 2/16 Module */
1239 #define PAPOUCH_QUIDO3x32_PID           0x0f00  /* Papouch Quido 3/32 Module */
1240 #define PAPOUCH_DRAK6_PID               0x1000  /* Papouch DRAK6 */
1241 #define PAPOUCH_UPSUSB_PID              0x8000  /* Papouch UPS-USB adapter */
1242 #define PAPOUCH_MU_PID                  0x8001  /* MU controller */
1243 #define PAPOUCH_SIMUKEY_PID             0x8002  /* Papouch SimuKey */
1244 #define PAPOUCH_AD4USB_PID              0x8003  /* AD4USB Measurement Module */
1245 #define PAPOUCH_GMUX_PID                0x8004  /* Papouch GOLIATH MUX */
1246 #define PAPOUCH_GMSR_PID                0x8005  /* Papouch GOLIATH MSR */
1247 
1248 /*
1249  * Marvell SheevaPlug
1250  */
1251 #define MARVELL_VID             0x9e88
1252 #define MARVELL_SHEEVAPLUG_PID  0x9e8f
1253 
1254 /*
1255  * Evolution Robotics products (http://www.evolution.com/).
1256  * Submitted by Shawn M. Lavelle.
1257  */
1258 #define EVOLUTION_VID           0xDEEE  /* Vendor ID */
1259 #define EVOLUTION_ER1_PID       0x0300  /* ER1 Control Module */
1260 #define EVO_8U232AM_PID         0x02FF  /* Evolution robotics RCM2 (FT232AM)*/
1261 #define EVO_HYBRID_PID          0x0302  /* Evolution robotics RCM4 PID (FT232BM)*/
1262 #define EVO_RCM4_PID            0x0303  /* Evolution robotics RCM4 PID */
1263 
1264 /*
1265  * MJS Gadgets HD Radio / XM Radio / Sirius Radio interfaces (using VID 0x0403)
1266  */
1267 #define MJSG_GENERIC_PID        0x9378
1268 #define MJSG_SR_RADIO_PID       0x9379
1269 #define MJSG_XM_RADIO_PID       0x937A
1270 #define MJSG_HD_RADIO_PID       0x937C
1271 
1272 /*
1273  * D.O.Tec products (http://www.directout.eu)
1274  */
1275 #define FTDI_DOTEC_PID 0x9868
1276 
1277 /*
1278  * Xverve Signalyzer tools (http://www.signalyzer.com/)
1279  */
1280 #define XVERVE_SIGNALYZER_ST_PID        0xBCA0
1281 #define XVERVE_SIGNALYZER_SLITE_PID     0xBCA1
1282 #define XVERVE_SIGNALYZER_SH2_PID       0xBCA2
1283 #define XVERVE_SIGNALYZER_SH4_PID       0xBCA4
1284 
1285 /*
1286  * Segway Robotic Mobility Platform USB interface (using VID 0x0403)
1287  * Submitted by John G. Rogers
1288  */
1289 #define SEGWAY_RMP200_PID       0xe729
1290 
1291 
1292 /*
1293  * Accesio USB Data Acquisition products (http://www.accesio.com/)
1294  */
1295 #define ACCESIO_COM4SM_PID      0xD578
1296 
1297 /* www.sciencescope.co.uk educational dataloggers */
1298 #define FTDI_SCIENCESCOPE_LOGBOOKML_PID         0xFF18
1299 #define FTDI_SCIENCESCOPE_LS_LOGBOOK_PID        0xFF1C
1300 #define FTDI_SCIENCESCOPE_HS_LOGBOOK_PID        0xFF1D
1301 
1302 /*
1303  * Milkymist One JTAG/Serial
1304  */
1305 #define QIHARDWARE_VID                  0x20B7
1306 #define MILKYMISTONE_JTAGSERIAL_PID     0x0713
1307 
1308 /*
1309  * CTI GmbH RS485 Converter http://www.cti-lean.com/
1310  */
1311 /* USB-485-Mini*/
1312 #define FTDI_CTI_MINI_PID       0xF608
1313 /* USB-Nano-485*/
1314 #define FTDI_CTI_NANO_PID       0xF60B
1315 
1316 /*
1317  * ZeitControl cardsystems GmbH rfid-readers http://zeitconrol.de
1318  */
1319 /* TagTracer MIFARE*/
1320 #define FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID    0xF7C0
1321 
1322 /*
1323  * Rainforest Automation
1324  */
1325 /* ZigBee controller */
1326 #define FTDI_RF_R106            0x8A28
1327 
1328 /*
1329  * Product: HCP HIT GPRS modem
1330  * Manufacturer: HCP d.o.o.
1331  * ATI command output: Cinterion MC55i
1332  */
1333 #define FTDI_CINTERION_MC55I_PID        0xA951
1334 
1335 /*
1336  * Product: Comet Caller ID decoder
1337  * Manufacturer: Crucible Technologies
1338  */
1339 #define FTDI_CT_COMET_PID       0x8e08
1340 
1341 /*
1342  * Product: Z3X Box
1343  * Manufacturer: Smart GSM Team
1344  */
1345 #define FTDI_Z3X_PID            0x0011
1346 
1347 /*
1348  * Product: Cressi PC Interface
1349  * Manufacturer: Cressi
1350  */
1351 #define FTDI_CRESSI_PID         0x87d0
1352 
1353 /*
1354  * Brainboxes devices
1355  */
1356 #define BRAINBOXES_VID                  0x05d1
1357 #define BRAINBOXES_VX_001_PID           0x1001 /* VX-001 ExpressCard 1 Port RS232 */
1358 #define BRAINBOXES_VX_012_PID           0x1002 /* VX-012 ExpressCard 2 Port RS232 */
1359 #define BRAINBOXES_VX_023_PID           0x1003 /* VX-023 ExpressCard 1 Port RS422/485 */
1360 #define BRAINBOXES_VX_034_PID           0x1004 /* VX-034 ExpressCard 2 Port RS422/485 */
1361 #define BRAINBOXES_US_101_PID           0x1011 /* US-101 1xRS232 */
1362 #define BRAINBOXES_US_324_PID           0x1013 /* US-324 1xRS422/485 1Mbaud */
1363 #define BRAINBOXES_US_606_1_PID         0x2001 /* US-606 6 Port RS232 Serial Port 1 and 2 */
1364 #define BRAINBOXES_US_606_2_PID         0x2002 /* US-606 6 Port RS232 Serial Port 3 and 4 */
1365 #define BRAINBOXES_US_606_3_PID         0x2003 /* US-606 6 Port RS232 Serial Port 4 and 6 */
1366 #define BRAINBOXES_US_701_1_PID         0x2011 /* US-701 4xRS232 1Mbaud Port 1 and 2 */
1367 #define BRAINBOXES_US_701_2_PID         0x2012 /* US-701 4xRS422 1Mbaud Port 3 and 4 */
1368 #define BRAINBOXES_US_279_1_PID         0x2021 /* US-279 8xRS422 1Mbaud Port 1 and 2 */
1369 #define BRAINBOXES_US_279_2_PID         0x2022 /* US-279 8xRS422 1Mbaud Port 3 and 4 */
1370 #define BRAINBOXES_US_279_3_PID         0x2023 /* US-279 8xRS422 1Mbaud Port 5 and 6 */
1371 #define BRAINBOXES_US_279_4_PID         0x2024 /* US-279 8xRS422 1Mbaud Port 7 and 8 */
1372 #define BRAINBOXES_US_346_1_PID         0x3011 /* US-346 4xRS422/485 1Mbaud Port 1 and 2 */
1373 #define BRAINBOXES_US_346_2_PID         0x3012 /* US-346 4xRS422/485 1Mbaud Port 3 and 4 */
1374 #define BRAINBOXES_US_257_PID           0x5001 /* US-257 2xRS232 1Mbaud */
1375 #define BRAINBOXES_US_313_PID           0x6001 /* US-313 2xRS422/485 1Mbaud */
1376 #define BRAINBOXES_US_357_PID           0x7001 /* US_357 1xRS232/422/485 */
1377 #define BRAINBOXES_US_842_1_PID         0x8001 /* US-842 8xRS422/485 1Mbaud Port 1 and 2 */
1378 #define BRAINBOXES_US_842_2_PID         0x8002 /* US-842 8xRS422/485 1Mbaud Port 3 and 4 */
1379 #define BRAINBOXES_US_842_3_PID         0x8003 /* US-842 8xRS422/485 1Mbaud Port 5 and 6 */
1380 #define BRAINBOXES_US_842_4_PID         0x8004 /* US-842 8xRS422/485 1Mbaud Port 7 and 8 */
1381 #define BRAINBOXES_US_160_1_PID         0x9001 /* US-160 16xRS232 1Mbaud Port 1 and 2 */
1382 #define BRAINBOXES_US_160_2_PID         0x9002 /* US-160 16xRS232 1Mbaud Port 3 and 4 */
1383 #define BRAINBOXES_US_160_3_PID         0x9003 /* US-160 16xRS232 1Mbaud Port 5 and 6 */
1384 #define BRAINBOXES_US_160_4_PID         0x9004 /* US-160 16xRS232 1Mbaud Port 7 and 8 */
1385 #define BRAINBOXES_US_160_5_PID         0x9005 /* US-160 16xRS232 1Mbaud Port 9 and 10 */
1386 #define BRAINBOXES_US_160_6_PID         0x9006 /* US-160 16xRS232 1Mbaud Port 11 and 12 */
1387 #define BRAINBOXES_US_160_7_PID         0x9007 /* US-160 16xRS232 1Mbaud Port 13 and 14 */
1388 #define BRAINBOXES_US_160_8_PID         0x9008 /* US-160 16xRS232 1Mbaud Port 15 and 16 */
1389 
1390 /*
1391  * ekey biometric systems GmbH (http://ekey.net/)
1392  */
1393 #define FTDI_EKEY_CONV_USB_PID          0xCB08  /* Converter USB */
1394 
1395 /*
1396  * GE Healthcare devices
1397  */
1398 #define GE_HEALTHCARE_VID               0x1901
1399 #define GE_HEALTHCARE_NEMO_TRACKER_PID  0x0015
1400 

 

 

 

 1 /*
  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  */
 27 
 28 /* Bill Ryder - bryder@sgi.com - wrote the FTDI_SIO implementation */
 29 /* Thanx to FTDI for so kindly providing details of the protocol required */
 30 /*   to talk to the device */
 31 /* Thanx to gkh and the rest of the usb dev group for all code I have
 32    assimilated :-) */
 33 
 34 #include <linux/kernel.h>
 35 #include <linux/errno.h>
 36 #include <linux/slab.h>
 37 #include <linux/tty.h>
 38 #include <linux/tty_driver.h>
 39 #include <linux/tty_flip.h>
 40 #include <linux/module.h>
 41 #include <linux/spinlock.h>
 42 #include <linux/mutex.h>
 43 #include <linux/uaccess.h>
 44 #include <linux/usb.h>
 45 #include <linux/serial.h>
 46 #include <linux/usb/serial.h>
 47 #include "ftdi_sio.h"
 48 #include "ftdi_sio_ids.h"
 49 
 50 #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>"
 51 #define DRIVER_DESC "USB FTDI Serial Converters Driver"
 52 
 53 
 54 struct ftdi_private {
 55         enum ftdi_chip_type chip_type;
 56                                 /* type of device, either SIO or FT8U232AM */
 57         int baud_base;          /* baud base clock for divisor setting */
 58         int custom_divisor;     /* custom_divisor kludge, this is for
 59                                    baud_base (different from what goes to the
 60                                    chip!) */
 61         __u16 last_set_data_urb_value ;
 62                                 /* the last data state set - needed for doing
 63                                  * a break
 64                                  */
 65         int flags;              /* some ASYNC_xxxx flags are supported */
 66         unsigned long last_dtr_rts;     /* saved modem control outputs */
 67         char prev_status;        /* Used for TIOCMIWAIT */
 68         char transmit_empty;    /* If transmitter is empty or not */
 69         __u16 interface;        /* FT2232C, FT2232H or FT4232H port interface
 70                                    (0 for FT232/245) */
 71 
 72         speed_t force_baud;     /* if non-zero, force the baud rate to
 73                                    this value */
 74         int force_rtscts;       /* if non-zero, force RTS-CTS to always
 75                                    be enabled */
 76 
 77         unsigned int latency;           /* latency setting in use */
 78         unsigned short max_packet_size;
 79         struct mutex cfg_lock; /* Avoid mess by parallel calls of config ioctl() and change_speed() */
 80 };
 81 
 82 /* struct ftdi_sio_quirk is used by devices requiring special attention. */
 83 struct ftdi_sio_quirk {
 84         int (*probe)(struct usb_serial *);
 85         /* Special settings for probed ports. */
 86         void (*port_probe)(struct ftdi_private *);
 87 };
 88 
 89 static int   ftdi_jtag_probe(struct usb_serial *serial);
 90 static int   ftdi_NDI_device_setup(struct usb_serial *serial);
 91 static int   ftdi_stmclite_probe(struct usb_serial *serial);
 92 static int   ftdi_8u2232c_probe(struct usb_serial *serial);
 93 static void  ftdi_USB_UIRT_setup(struct ftdi_private *priv);
 94 static void  ftdi_HE_TIRA1_setup(struct ftdi_private *priv);
 95 
 96 static struct ftdi_sio_quirk ftdi_jtag_quirk = {
 97         .probe  = ftdi_jtag_probe,
 98 };
 99 
100 static struct ftdi_sio_quirk ftdi_NDI_device_quirk = {
101         .probe  = ftdi_NDI_device_setup,
102 };
103 
104 static struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = {
105         .port_probe = ftdi_USB_UIRT_setup,
106 };
107 
108 static struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = {
109         .port_probe = ftdi_HE_TIRA1_setup,
110 };
111 
112 static struct ftdi_sio_quirk ftdi_stmclite_quirk = {
113         .probe  = ftdi_stmclite_probe,
114 };
115 
116 static struct ftdi_sio_quirk ftdi_8u2232c_quirk = {
117         .probe  = ftdi_8u2232c_probe,
118 };
119 
120 /*
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  */
135 
136 
137 
138 /*
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  */
142 static const struct usb_device_id id_table_combined[] = {
143         { USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) },
144         { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) },
145         { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) },
146         { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) },
147         { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) },
148         { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) },
149         { USB_DEVICE(FTDI_VID, FTDI_BM_ATOM_NANO_PID) },
150         { USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) },
151         { USB_DEVICE(FTDI_VID, FTDI_EV3CON_PID) },
152         { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) },
153         { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) },
154         { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) },
155         { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_3_PID) },
156         { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_4_PID) },
157         { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_5_PID) },
158         { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_6_PID) },
159         { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_7_PID) },
160         { USB_DEVICE(FTDI_VID, FTDI_USINT_CAT_PID) },
161         { USB_DEVICE(FTDI_VID, FTDI_USINT_WKEY_PID) },
162         { USB_DEVICE(FTDI_VID, FTDI_USINT_RS232_PID) },
163         { USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) },
164         { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) },
165         { USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) },
166         { USB_DEVICE(FTDI_VID, FTDI_IPLUS2_PID) },
167         { USB_DEVICE(FTDI_VID, FTDI_DMX4ALL) },
168         { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) },
169         { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) },
170         { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) },
171         { USB_DEVICE(FTDI_VID, FTDI_232RL_PID) },
172         { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) ,
173                 .driver_info = (kernel_ulong_t)&ftdi_8u2232c_quirk },
174         { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) },
175         { USB_DEVICE(FTDI_VID, FTDI_232H_PID) },
176         { USB_DEVICE(FTDI_VID, FTDI_FTX_PID) },
177         { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) },
178         { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) },
179         { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) },
180         { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_SNIFFER_PID) },
181         { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) },
182         { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) },
183         { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) },
184         { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_BOOST_PID) },
185         { USB_DEVICE(NEWPORT_VID, NEWPORT_AGILIS_PID) },
186         { USB_DEVICE(NEWPORT_VID, NEWPORT_CONEX_CC_PID) },
187         { USB_DEVICE(NEWPORT_VID, NEWPORT_CONEX_AGP_PID) },
188         { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
189         { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
190         { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
191         { USB_DEVICE(FTDI_VID, FTDI_TAGSYS_LP101_PID) },
192         { USB_DEVICE(FTDI_VID, FTDI_TAGSYS_P200X_PID) },
193         { USB_DEVICE(FTDI_VID, FTDI_LENZ_LIUSB_PID) },
194         { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) },
195         { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) },
196         { USB_DEVICE(FTDI_VID, FTDI_XF_547_PID) },
197         { USB_DEVICE(FTDI_VID, FTDI_XF_633_PID) },
198         { USB_DEVICE(FTDI_VID, FTDI_XF_631_PID) },
199         { USB_DEVICE(FTDI_VID, FTDI_XF_635_PID) },
200         { USB_DEVICE(FTDI_VID, FTDI_XF_640_PID) },
201         { USB_DEVICE(FTDI_VID, FTDI_XF_642_PID) },
202         { USB_DEVICE(FTDI_VID, FTDI_DSS20_PID) },
203         { USB_DEVICE(FTDI_VID, FTDI_URBAN_0_PID) },
204         { USB_DEVICE(FTDI_VID, FTDI_URBAN_1_PID) },
205         { USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) },
206         { USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) },
207         { USB_DEVICE(FTDI_VID, FTDI_MTXORB_0_PID) },
208         { USB_DEVICE(FTDI_VID, FTDI_MTXORB_1_PID) },
209         { USB_DEVICE(FTDI_VID, FTDI_MTXORB_2_PID) },
210         { USB_DEVICE(FTDI_VID, FTDI_MTXORB_3_PID) },
211         { USB_DEVICE(FTDI_VID, FTDI_MTXORB_4_PID) },
212         { USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) },
213         { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) },
214         { USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) },
215         { USB_DEVICE(FTDI_VID, FTDI_VARDAAN_PID) },
216         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) },
217         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) },
218         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) },
219         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0103_PID) },
220         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0104_PID) },
221         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0105_PID) },
222         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0106_PID) },
223         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0107_PID) },
224         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0108_PID) },
225         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0109_PID) },
226         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010A_PID) },
227         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010B_PID) },
228         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010C_PID) },
229         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010D_PID) },
230         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010E_PID) },
231         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010F_PID) },
232         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0110_PID) },
233         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0111_PID) },
234         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0112_PID) },
235         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0113_PID) },
236         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0114_PID) },
237         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0115_PID) },
238         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0116_PID) },
239         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0117_PID) },
240         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0118_PID) },
241         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0119_PID) },
242         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011A_PID) },
243         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011B_PID) },
244         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011C_PID) },
245         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011D_PID) },
246         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011E_PID) },
247         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011F_PID) },
248         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0120_PID) },
249         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0121_PID) },
250         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0122_PID) },
251         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0123_PID) },
252         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0124_PID) },
253         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0125_PID) },
254         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0126_PID) },
255         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0127_PID) },
256         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0128_PID) },
257         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0129_PID) },
258         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012A_PID) },
259         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012B_PID) },
260         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012C_PID) },
261         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012D_PID) },
262         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012E_PID) },
263         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012F_PID) },
264         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0130_PID) },
265         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0131_PID) },
266         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0132_PID) },
267         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0133_PID) },
268         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0134_PID) },
269         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0135_PID) },
270         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0136_PID) },
271         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0137_PID) },
272         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0138_PID) },
273         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0139_PID) },
274         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013A_PID) },
275         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013B_PID) },
276         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013C_PID) },
277         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013D_PID) },
278         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013E_PID) },
279         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013F_PID) },
280         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0140_PID) },
281         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0141_PID) },
282         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0142_PID) },
283         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0143_PID) },
284         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0144_PID) },
285         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0145_PID) },
286         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0146_PID) },
287         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0147_PID) },
288         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0148_PID) },
289         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0149_PID) },
290         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014A_PID) },
291         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014B_PID) },
292         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014C_PID) },
293         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014D_PID) },
294         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014E_PID) },
295         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014F_PID) },
296         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0150_PID) },
297         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0151_PID) },
298         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0152_PID) },
299         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0153_PID) },
300         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0154_PID) },
301         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0155_PID) },
302         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0156_PID) },
303         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0157_PID) },
304         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0158_PID) },
305         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0159_PID) },
306         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015A_PID) },
307         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015B_PID) },
308         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015C_PID) },
309         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015D_PID) },
310         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015E_PID) },
311         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015F_PID) },
312         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0160_PID) },
313         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0161_PID) },
314         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0162_PID) },
315         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0163_PID) },
316         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0164_PID) },
317         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0165_PID) },
318         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0166_PID) },
319         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0167_PID) },
320         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0168_PID) },
321         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0169_PID) },
322         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016A_PID) },
323         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016B_PID) },
324         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016C_PID) },
325         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016D_PID) },
326         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016E_PID) },
327         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016F_PID) },
328         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0170_PID) },
329         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0171_PID) },
330         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0172_PID) },
331         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0173_PID) },
332         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0174_PID) },
333         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0175_PID) },
334         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0176_PID) },
335         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0177_PID) },
336         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0178_PID) },
337         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0179_PID) },
338         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017A_PID) },
339         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017B_PID) },
340         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017C_PID) },
341         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017D_PID) },
342         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017E_PID) },
343         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017F_PID) },
344         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0180_PID) },
345         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0181_PID) },
346         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0182_PID) },
347         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0183_PID) },
348         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0184_PID) },
349         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0185_PID) },
350         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0186_PID) },
351         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0187_PID) },
352         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0188_PID) },
353         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0189_PID) },
354         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018A_PID) },
355         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018B_PID) },
356         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018C_PID) },
357         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018D_PID) },
358         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018E_PID) },
359         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018F_PID) },
360         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0190_PID) },
361         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0191_PID) },
362         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0192_PID) },
363         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0193_PID) },
364         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0194_PID) },
365         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0195_PID) },
366         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0196_PID) },
367         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0197_PID) },
368         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0198_PID) },
369         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0199_PID) },
370         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019A_PID) },
371         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019B_PID) },
372         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019C_PID) },
373         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019D_PID) },
374         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019E_PID) },
375         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019F_PID) },
376         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A0_PID) },
377         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A1_PID) },
378         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A2_PID) },
379         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A3_PID) },
380         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A4_PID) },
381         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A5_PID) },
382         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A6_PID) },
383         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A7_PID) },
384         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A8_PID) },
385         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A9_PID) },
386         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AA_PID) },
387         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AB_PID) },
388         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AC_PID) },
389         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AD_PID) },
390         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AE_PID) },
391         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AF_PID) },
392         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B0_PID) },
393         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B1_PID) },
394         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B2_PID) },
395         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B3_PID) },
396         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B4_PID) },
397         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B5_PID) },
398         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B6_PID) },
399         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B7_PID) },
400         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B8_PID) },
401         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B9_PID) },
402         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BA_PID) },
403         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BB_PID) },
404         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BC_PID) },
405         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BD_PID) },
406         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BE_PID) },
407         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BF_PID) },
408         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C0_PID) },
409         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C1_PID) },
410         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C2_PID) },
411         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C3_PID) },
412         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C4_PID) },
413         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C5_PID) },
414         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C6_PID) },
415         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C7_PID) },
416         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C8_PID) },
417         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C9_PID) },
418         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CA_PID) },
419         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CB_PID) },
420         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CC_PID) },
421         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CD_PID) },
422         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CE_PID) },
423         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CF_PID) },
424         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D0_PID) },
425         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D1_PID) },
426         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D2_PID) },
427         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D3_PID) },
428         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D4_PID) },
429         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D5_PID) },
430         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D6_PID) },
431         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D7_PID) },
432         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D8_PID) },
433         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D9_PID) },
434         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DA_PID) },
435         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DB_PID) },
436         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DC_PID) },
437         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DD_PID) },
438         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DE_PID) },
439         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DF_PID) },
440         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E0_PID) },
441         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E1_PID) },
442         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E2_PID) },
443         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E3_PID) },
444         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E4_PID) },
445         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E5_PID) },
446         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E6_PID) },
447         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E7_PID) },
448         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E8_PID) },
449         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E9_PID) },
450         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EA_PID) },
451         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EB_PID) },
452         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EC_PID) },
453         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01ED_PID) },
454         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EE_PID) },
455         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EF_PID) },
456         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F0_PID) },
457         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F1_PID) },
458         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F2_PID) },
459         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F3_PID) },
460         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F4_PID) },
461         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F5_PID) },
462         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F6_PID) },
463         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F7_PID) },
464         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F8_PID) },
465         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F9_PID) },
466         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FA_PID) },
467         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FB_PID) },
468         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FC_PID) },
469         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FD_PID) },
470         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FE_PID) },
471         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FF_PID) },
472         { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) },
473         { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) },
474         { USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) },
475         { USB_DEVICE(FTDI_VID, FTDI_USBX_707_PID) },
476         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) },
477         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) },
478         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) },
479         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2104_PID) },
480         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2106_PID) },
481         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_1_PID) },
482         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_2_PID) },
483         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_1_PID) },
484         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_2_PID) },
485         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_1_PID) },
486         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_2_PID) },
487         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_1_PID) },
488         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_2_PID) },
489         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_3_PID) },
490         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_4_PID) },
491         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_1_PID) },
492         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_2_PID) },
493         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_3_PID) },
494         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_4_PID) },
495         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_1_PID) },
496         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_2_PID) },
497         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_3_PID) },
498         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_4_PID) },
499         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_1_PID) },
500         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_2_PID) },
501         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_3_PID) },
502         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_4_PID) },
503         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_5_PID) },
504         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_6_PID) },
505         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_7_PID) },
506         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_8_PID) },
507         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_1_PID) },
508         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_2_PID) },
509         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_3_PID) },
510         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_4_PID) },
511         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_5_PID) },
512         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_6_PID) },
513         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_7_PID) },
514         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_8_PID) },
515         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_1_PID) },
516         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_2_PID) },
517         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_3_PID) },
518         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_4_PID) },
519         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_5_PID) },
520         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_6_PID) },
521         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_7_PID) },
522         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) },
523         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_1_PID) },
524         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_2_PID) },
525         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_3_PID) },
526         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_4_PID) },
527         { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) },
528         { USB_DEVICE(OCT_VID, OCT_US101_PID) },
529         { USB_DEVICE(OCT_VID, OCT_DK201_PID) },
530         { USB_DEVICE(FTDI_VID, FTDI_HE_TIRA1_PID),
531                 .driver_info = (kernel_ulong_t)&ftdi_HE_TIRA1_quirk },
532         { USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID),
533                 .driver_info = (kernel_ulong_t)&ftdi_USB_UIRT_quirk },
534         { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_1) },
535         { USB_DEVICE(FTDI_VID, PROTEGO_R2X0) },
536         { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) },
537         { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_4) },
538         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E808_PID) },
539         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E809_PID) },
540         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80A_PID) },
541         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80B_PID) },
542         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80C_PID) },
543         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80D_PID) },
544         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80E_PID) },
545         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80F_PID) },
546         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E888_PID) },
547         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E889_PID) },
548         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88A_PID) },
549         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88B_PID) },
550         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88C_PID) },
551         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88D_PID) },
552         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88E_PID) },
553         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88F_PID) },
554         { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) },
555         { USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) },
556         { USB_DEVICE(FTDI_VID, FTDI_ELV_UR100_PID) },
557         { USB_DEVICE(FTDI_VID, FTDI_ELV_ALC8500_PID) },
558         { USB_DEVICE(FTDI_VID, FTDI_PYRAMID_PID) },
559         { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1000PC_PID) },
560         { USB_DEVICE(FTDI_VID, FTDI_IBS_US485_PID) },
561         { USB_DEVICE(FTDI_VID, FTDI_IBS_PICPRO_PID) },
562         { USB_DEVICE(FTDI_VID, FTDI_IBS_PCMCIA_PID) },
563         { USB_DEVICE(FTDI_VID, FTDI_IBS_PK1_PID) },
564         { USB_DEVICE(FTDI_VID, FTDI_IBS_RS232MON_PID) },
565         { USB_DEVICE(FTDI_VID, FTDI_IBS_APP70_PID) },
566         { USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) },
567         { USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) },
568         { USB_DEVICE(FTDI_VID, FTDI_TAVIR_STK500_PID) },
569         { USB_DEVICE(FTDI_VID, FTDI_TIAO_UMPA_PID),
570                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
571         { USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLXM_PID),
572                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
573         /*
574          * ELV devices:
575          */
576         { USB_DEVICE(FTDI_ELV_VID, FTDI_ELV_WS300_PID) },
577         { USB_DEVICE(FTDI_VID, FTDI_ELV_USR_PID) },
578         { USB_DEVICE(FTDI_VID, FTDI_ELV_MSM1_PID) },
579         { USB_DEVICE(FTDI_VID, FTDI_ELV_KL100_PID) },
580         { USB_DEVICE(FTDI_VID, FTDI_ELV_WS550_PID) },
581         { USB_DEVICE(FTDI_VID, FTDI_ELV_EC3000_PID) },
582         { USB_DEVICE(FTDI_VID, FTDI_ELV_WS888_PID) },
583         { USB_DEVICE(FTDI_VID, FTDI_ELV_TWS550_PID) },
584         { USB_DEVICE(FTDI_VID, FTDI_ELV_FEM_PID) },
585         { USB_DEVICE(FTDI_VID, FTDI_ELV_CLI7000_PID) },
586         { USB_DEVICE(FTDI_VID, FTDI_ELV_PPS7330_PID) },
587         { USB_DEVICE(FTDI_VID, FTDI_ELV_TFM100_PID) },
588         { USB_DEVICE(FTDI_VID, FTDI_ELV_UDF77_PID) },
589         { USB_DEVICE(FTDI_VID, FTDI_ELV_UIO88_PID) },
590         { USB_DEVICE(FTDI_VID, FTDI_ELV_UAD8_PID) },
591         { USB_DEVICE(FTDI_VID, FTDI_ELV_UDA7_PID) },
592         { USB_DEVICE(FTDI_VID, FTDI_ELV_USI2_PID) },
593         { USB_DEVICE(FTDI_VID, FTDI_ELV_T1100_PID) },
594         { USB_DEVICE(FTDI_VID, FTDI_ELV_PCD200_PID) },
595         { USB_DEVICE(FTDI_VID, FTDI_ELV_ULA200_PID) },
596         { USB_DEVICE(FTDI_VID, FTDI_ELV_CSI8_PID) },
597         { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1000DL_PID) },
598         { USB_DEVICE(FTDI_VID, FTDI_ELV_PCK100_PID) },
599         { USB_DEVICE(FTDI_VID, FTDI_ELV_RFP500_PID) },
600         { USB_DEVICE(FTDI_VID, FTDI_ELV_FS20SIG_PID) },
601         { USB_DEVICE(FTDI_VID, FTDI_ELV_UTP8_PID) },
602         { USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) },
603         { USB_DEVICE(FTDI_VID, FTDI_ELV_WS444PC_PID) },
604         { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) },
605         { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1010PC_PID) },
606         { USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) },
607         { USB_DEVICE(FTDI_VID, FTDI_ELV_HS485_PID) },
608         { USB_DEVICE(FTDI_VID, FTDI_ELV_UMS100_PID) },
609         { USB_DEVICE(FTDI_VID, FTDI_ELV_TFD128_PID) },
610         { USB_DEVICE(FTDI_VID, FTDI_ELV_FM3RX_PID) },
611         { USB_DEVICE(FTDI_VID, FTDI_ELV_WS777_PID) },
612         { USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) },
613         { USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) },
614         { USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) },
615         { USB_DEVICE(FTDI_VID, LINX_FUTURE_1_PID) },
616         { USB_DEVICE(FTDI_VID, LINX_FUTURE_2_PID) },
617         { USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) },
618         { USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) },
619         { USB_DEVICE(FTDI_VID, FTDI_CCSMACHX_2_PID) },
620         { USB_DEVICE(FTDI_VID, FTDI_CCSLOAD_N_GO_3_PID) },
621         { USB_DEVICE(FTDI_VID, FTDI_CCSICDU64_4_PID) },
622         { USB_DEVICE(FTDI_VID, FTDI_CCSPRIME8_5_PID) },
623         { USB_DEVICE(FTDI_VID, INSIDE_ACCESSO) },
624         { USB_DEVICE(INTREPID_VID, INTREPID_VALUECAN_PID) },
625         { USB_DEVICE(INTREPID_VID, INTREPID_NEOVI_PID) },
626         { USB_DEVICE(FALCOM_VID, FALCOM_TWIST_PID) },
627         { USB_DEVICE(FALCOM_VID, FALCOM_SAMBA_PID) },
628         { USB_DEVICE(FTDI_VID, FTDI_SUUNTO_SPORTS_PID) },
629         { USB_DEVICE(FTDI_VID, FTDI_OCEANIC_PID) },
630         { USB_DEVICE(TTI_VID, TTI_QL355P_PID) },
631         { USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) },
632         { USB_DEVICE(ACTON_VID, ACTON_SPECTRAPRO_PID) },
633         { USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) },
634         { USB_DEVICE(MITSUBISHI_VID, MITSUBISHI_FXUSB_PID) },
635         { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) },
636         { USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) },
637         { USB_DEVICE(BANDB_VID, BANDB_USO9ML2_PID) },
638         { USB_DEVICE(BANDB_VID, BANDB_USOPTL4_PID) },
639         { USB_DEVICE(BANDB_VID, BANDB_USPTL4_PID) },
640         { USB_DEVICE(BANDB_VID, BANDB_USO9ML2DR_2_PID) },
641         { USB_DEVICE(BANDB_VID, BANDB_USO9ML2DR_PID) },
642         { USB_DEVICE(BANDB_VID, BANDB_USOPTL4DR2_PID) },
643         { USB_DEVICE(BANDB_VID, BANDB_USOPTL4DR_PID) },
644         { USB_DEVICE(BANDB_VID, BANDB_485USB9F_2W_PID) },
645         { USB_DEVICE(BANDB_VID, BANDB_485USB9F_4W_PID) },
646         { USB_DEVICE(BANDB_VID, BANDB_232USB9M_PID) },
647         { USB_DEVICE(BANDB_VID, BANDB_485USBTB_2W_PID) },
648         { USB_DEVICE(BANDB_VID, BANDB_485USBTB_4W_PID) },
649         { USB_DEVICE(BANDB_VID, BANDB_TTL5USB9M_PID) },
650         { USB_DEVICE(BANDB_VID, BANDB_TTL3USB9M_PID) },
651         { USB_DEVICE(BANDB_VID, BANDB_ZZ_PROG1_USB_PID) },
652         { USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) },
653         { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) },
654         { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) },
655         { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_3_PID) },
656         { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_0_PID) },
657         { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_1_PID) },
658         { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_2_PID) },
659         { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_3_PID) },
660         { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_4_PID) },
661         { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) },
662         { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) },
663         { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) },
664         { USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) },
665         { USB_DEVICE(XSENS_VID, XSENS_MTW_PID) },
666         { USB_DEVICE(FTDI_VID, FTDI_OMNI1509) },
667         { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
668         { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) },
669         { USB_DEVICE(FTDI_VID, FTDI_MHAM_KW_PID) },
670         { USB_DEVICE(FTDI_VID, FTDI_MHAM_YS_PID) },
671         { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y6_PID) },
672         { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y8_PID) },
673         { USB_DEVICE(FTDI_VID, FTDI_MHAM_IC_PID) },
674         { USB_DEVICE(FTDI_VID, FTDI_MHAM_DB9_PID) },
675         { USB_DEVICE(FTDI_VID, FTDI_MHAM_RS232_PID) },
676         { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y9_PID) },
677         { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_VCP_PID) },
678         { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_D2XX_PID) },
679         { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) },
680         { USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) },
681         { USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) },
682         { USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) },
683         { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) },
684         { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) },
685         { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HR_PID) },
686         { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HRC_PID) },
687         { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16IC_PID) },
688         { USB_DEVICE(KOBIL_VID, KOBIL_CONV_B1_PID) },
689         { USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) },
690         { USB_DEVICE(POSIFLEX_VID, POSIFLEX_PP7000_PID) },
691         { USB_DEVICE(FTDI_VID, FTDI_TTUSB_PID) },
692         { USB_DEVICE(FTDI_VID, FTDI_ECLO_COM_1WIRE_PID) },
693         { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_777_PID) },
694         { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_8900F_PID) },
695         { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) },
696         { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) },
697         { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) },
698         { USB_DEVICE(FTDI_VID, FTDI_NZR_SEM_USB_PID) },
699         { USB_DEVICE(ICOM_VID, ICOM_ID_1_PID) },
700         { USB_DEVICE(ICOM_VID, ICOM_OPC_U_UC_PID) },
701         { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C1_PID) },
702         { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C2_PID) },
703         { USB_DEVICE(ICOM_VID, ICOM_ID_RP2D_PID) },
704         { USB_DEVICE(ICOM_VID, ICOM_ID_RP2VT_PID) },
705         { USB_DEVICE(ICOM_VID, ICOM_ID_RP2VR_PID) },
706         { USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVT_PID) },
707         { USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVR_PID) },
708         { USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVT_PID) },
709         { USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVR_PID) },
710         { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) },
711         { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) },
712         { USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) },
713         { USB_DEVICE(TESTO_VID, TESTO_1_PID) },
714         { USB_DEVICE(TESTO_VID, TESTO_3_PID) },
715         { USB_DEVICE(FTDI_VID, FTDI_GAMMA_SCOUT_PID) },
716         { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13M_PID) },
717         { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) },
718         { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) },
719         { USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) },
720         { USB_DEVICE(FTDI_VID, FTDI_NDI_HUC_PID),
721                 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
722         { USB_DEVICE(FTDI_VID, FTDI_NDI_SPECTRA_SCU_PID),
723                 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
724         { USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_2_PID),
725                 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
726         { USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_3_PID),
727                 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
728         { USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID),
729                 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
730         { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
731         { USB_DEVICE(NOVITUS_VID, NOVITUS_BONO_E_PID) },
732         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S03_PID) },
733         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_59_PID) },
734         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57A_PID) },
735         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57B_PID) },
736         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29A_PID) },
737         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29B_PID) },
738         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29F_PID) },
739         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62B_PID) },
740         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S01_PID) },
741         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63_PID) },
742         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29C_PID) },
743         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_81B_PID) },
744         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_82B_PID) },
745         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5D_PID) },
746         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K4Y_PID) },
747         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5G_PID) },
748         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S05_PID) },
749         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_60_PID) },
750         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_61_PID) },
751         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62_PID) },
752         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63B_PID) },
753         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_64_PID) },
754         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_65_PID) },
755         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92_PID) },
756         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92D_PID) },
757         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_W5R_PID) },
758         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_A5R_PID) },
759         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_PW1_PID) },
760         { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) },
761         { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) },
762         { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) },
763         { USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) },
764         { USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) },
765         { USB_DEVICE(FTDI_VID, FTDI_PROPOX_ISPCABLEIII_PID) },
766         { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID),
767                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
768         { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID),
769                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
770         { USB_DEVICE(FIC_VID, FIC_NEO1973_DEBUG_PID),
771                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
772         { USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID),
773                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
774         { USB_DEVICE(FTDI_VID, LMI_LM3S_DEVEL_BOARD_PID),
775                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
776         { USB_DEVICE(FTDI_VID, LMI_LM3S_EVAL_BOARD_PID),
777                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
778         { USB_DEVICE(FTDI_VID, LMI_LM3S_ICDI_BOARD_PID),
779                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
780         { USB_DEVICE(FTDI_VID, FTDI_TURTELIZER_PID),
781                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
782         { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
783         { USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) },
784 
785         /* Papouch devices based on FTDI chip */
786         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_PID) },
787         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_PID) },
788         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_PID) },
789         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_2_PID) },
790         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_2_PID) },
791         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_2_PID) },
792         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485S_PID) },
793         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485C_PID) },
794         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_LEC_PID) },
795         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB232_PID) },
796         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) },
797         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_IRAMP_PID) },
798         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK5_PID) },
799         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO8x8_PID) },
800         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) },
801         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x2_PID) },
802         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO10x1_PID) },
803         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO30x3_PID) },
804         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO60x3_PID) },
805         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x16_PID) },
806         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO3x32_PID) },
807         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK6_PID) },
808         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_UPSUSB_PID) },
809         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_MU_PID) },
810         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SIMUKEY_PID) },
811         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AD4USB_PID) },
812         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMUX_PID) },
813         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMSR_PID) },
814 
815         { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) },
816         { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) },
817         { USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) },
818         { USB_DEVICE(FTDI_VID, DIEBOLD_BCS_SE923_PID) },
819         { USB_DEVICE(ATMEL_VID, STK541_PID) },
820         { USB_DEVICE(DE_VID, STB_PID) },
821         { USB_DEVICE(DE_VID, WHT_PID) },
822         { USB_DEVICE(ADI_VID, ADI_GNICE_PID),
823                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
824         { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID),
825                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
826         { USB_DEVICE_AND_INTERFACE_INFO(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID,
827                                         USB_CLASS_VENDOR_SPEC,
828                                         USB_SUBCLASS_VENDOR_SPEC, 0x00) },
829         { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
830         { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID),
831                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
832         { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) },
833         { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) },
834         { USB_DEVICE(FTDI_VID, PI_C865_PID) },
835         { USB_DEVICE(FTDI_VID, PI_C857_PID) },
836         { USB_DEVICE(PI_VID, PI_C866_PID) },
837         { USB_DEVICE(PI_VID, PI_C663_PID) },
838         { USB_DEVICE(PI_VID, PI_C725_PID) },
839         { USB_DEVICE(PI_VID, PI_E517_PID) },
840         { USB_DEVICE(PI_VID, PI_C863_PID) },
841         { USB_DEVICE(PI_VID, PI_E861_PID) },
842         { USB_DEVICE(PI_VID, PI_C867_PID) },
843         { USB_DEVICE(PI_VID, PI_E609_PID) },
844         { USB_DEVICE(PI_VID, PI_E709_PID) },
845         { USB_DEVICE(PI_VID, PI_100F_PID) },
846         { USB_DEVICE(PI_VID, PI_1011_PID) },
847         { USB_DEVICE(PI_VID, PI_1012_PID) },
848         { USB_DEVICE(PI_VID, PI_1013_PID) },
849         { USB_DEVICE(PI_VID, PI_1014_PID) },
850         { USB_DEVICE(PI_VID, PI_1015_PID) },
851         { USB_DEVICE(PI_VID, PI_1016_PID) },
852         { USB_DEVICE(KONDO_VID, KONDO_USB_SERIAL_PID) },
853         { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
854         { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
855                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
856         { USB_DEVICE(FTDI_VID, TI_XDS100V2_PID),
857                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
858         { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) },
859         { USB_DEVICE(FTDI_VID, HAMEG_HO720_PID) },
860         { USB_DEVICE(FTDI_VID, HAMEG_HO730_PID) },
861         { USB_DEVICE(FTDI_VID, HAMEG_HO870_PID) },
862         { USB_DEVICE(FTDI_VID, MJSG_GENERIC_PID) },
863         { USB_DEVICE(FTDI_VID, MJSG_SR_RADIO_PID) },
864         { USB_DEVICE(FTDI_VID, MJSG_HD_RADIO_PID) },
865         { USB_DEVICE(FTDI_VID, MJSG_XM_RADIO_PID) },
866         { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_ST_PID),
867                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
868         { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SLITE_PID),
869                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
870         { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH2_PID),
871                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
872         { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH4_PID),
873                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
874         { USB_DEVICE(FTDI_VID, SEGWAY_RMP200_PID) },
875         { USB_DEVICE(FTDI_VID, ACCESIO_COM4SM_PID) },
876         { USB_DEVICE(IONICS_VID, IONICS_PLUGCOMPUTER_PID),
877                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
878         { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_24_MASTER_WING_PID) },
879         { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_PC_WING_PID) },
880         { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_USB_DMX_PID) },
881         { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MIDI_TIMECODE_PID) },
882         { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MINI_WING_PID) },
883         { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MAXI_WING_PID) },
884         { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MEDIA_WING_PID) },
885         { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_WING_PID) },
886         { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LOGBOOKML_PID) },
887         { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LS_LOGBOOK_PID) },
888         { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_HS_LOGBOOK_PID) },
889         { USB_DEVICE(FTDI_VID, FTDI_CINTERION_MC55I_PID) },
890         { USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) },
891         { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID),
892                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
893         { USB_DEVICE(ST_VID, ST_STMCLT_2232_PID),
894                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
895         { USB_DEVICE(ST_VID, ST_STMCLT_4232_PID),
896                 .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk },
897         { USB_DEVICE(FTDI_VID, FTDI_RF_R106) },
898         { USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID),
899                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
900         { USB_DEVICE(FTDI_VID, FTDI_LUMEL_PD12_PID) },
901         /* Crucible Devices */
902         { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) },
903         { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) },
904         /* Cressi Devices */
905         { USB_DEVICE(FTDI_VID, FTDI_CRESSI_PID) },
906         /* Brainboxes Devices */
907         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_001_PID) },
908         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_012_PID) },
909         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_023_PID) },
910         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_034_PID) },
911         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_101_PID) },
912         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_1_PID) },
913         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_2_PID) },
914         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_3_PID) },
915         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_4_PID) },
916         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_5_PID) },
917         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_6_PID) },
918         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_7_PID) },
919         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_8_PID) },
920         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_257_PID) },
921         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_1_PID) },
922         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_2_PID) },
923         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_3_PID) },
924         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_4_PID) },
925         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_313_PID) },
926         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_324_PID) },
927         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_346_1_PID) },
928         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_346_2_PID) },
929         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_357_PID) },
930         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_1_PID) },
931         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_2_PID) },
932         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_3_PID) },
933         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_701_1_PID) },
934         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_701_2_PID) },
935         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_1_PID) },
936         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_2_PID) },
937         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_3_PID) },
938         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_4_PID) },
939         /* ekey Devices */
940         { USB_DEVICE(FTDI_VID, FTDI_EKEY_CONV_USB_PID) },
941         /* Infineon Devices */
942         { USB_DEVICE_INTERFACE_NUMBER(INFINEON_VID, INFINEON_TRIBOARD_PID, 1) },
943         /* GE Healthcare devices */
944         { USB_DEVICE(GE_HEALTHCARE_VID, GE_HEALTHCARE_NEMO_TRACKER_PID) },
945         { }                                     /* Terminating entry */
946 };
947 
948 MODULE_DEVICE_TABLE(usb, id_table_combined);
949 
950 static const char *ftdi_chip_name[] = {
951         [SIO] = "SIO",  /* the serial part of FT8U100AX */
952         [FT8U232AM] = "FT8U232AM",
953         [FT232BM] = "FT232BM",
954         [FT2232C] = "FT2232C",
955         [FT232RL] = "FT232RL",
956         [FT2232H] = "FT2232H",
957         [FT4232H] = "FT4232H",
958         [FT232H]  = "FT232H",
959         [FTX]     = "FT-X"
960 };
961 
962 
963 /* Used for TIOCMIWAIT */
964 #define FTDI_STATUS_B0_MASK     (FTDI_RS0_CTS | FTDI_RS0_DSR | FTDI_RS0_RI | FTDI_RS0_RLSD)
965 #define FTDI_STATUS_B1_MASK     (FTDI_RS_BI)
966 /* End TIOCMIWAIT */
967 
968 /* function prototypes for a FTDI serial converter */
969 static int  ftdi_sio_probe(struct usb_serial *serial,
970                                         const struct usb_device_id *id);
971 static int  ftdi_sio_port_probe(struct usb_serial_port *port);
972 static int  ftdi_sio_port_remove(struct usb_serial_port *port);
973 static int  ftdi_open(struct tty_struct *tty, struct usb_serial_port *port);
974 static void ftdi_dtr_rts(struct usb_serial_port *port, int on);
975 static void ftdi_process_read_urb(struct urb *urb);
976 static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
977                                                 void *dest, size_t size);
978 static void ftdi_set_termios(struct tty_struct *tty,
979                         struct usb_serial_port *port, struct ktermios *old);
980 static int  ftdi_tiocmget(struct tty_struct *tty);
981 static int  ftdi_tiocmset(struct tty_struct *tty,
982                         unsigned int set, unsigned int clear);
983 static int  ftdi_ioctl(struct tty_struct *tty,
984                         unsigned int cmd, unsigned long arg);
985 static void ftdi_break_ctl(struct tty_struct *tty, int break_state);
986 static bool ftdi_tx_empty(struct usb_serial_port *port);
987 static int ftdi_get_modem_status(struct usb_serial_port *port,
988                                                 unsigned char status[2]);
989 
990 static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base);
991 static unsigned short int ftdi_232am_baud_to_divisor(int baud);
992 static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base);
993 static __u32 ftdi_232bm_baud_to_divisor(int baud);
994 static __u32 ftdi_2232h_baud_base_to_divisor(int baud, int base);
995 static __u32 ftdi_2232h_baud_to_divisor(int baud);
996 
997 static struct usb_serial_driver ftdi_sio_device = {
998         .driver = {
999                 .owner =        THIS_MODULE,
1000                 .name =         "ftdi_sio",
1001         },
1002         .description =          "FTDI USB Serial Device",
1003         .id_table =             id_table_combined,
1004         .num_ports =            1,
1005         .bulk_in_size =         512,
1006         .bulk_out_size =        256,
1007         .probe =                ftdi_sio_probe,
1008         .port_probe =           ftdi_sio_port_probe,
1009         .port_remove =          ftdi_sio_port_remove,
1010         .open =                 ftdi_open,
1011         .dtr_rts =              ftdi_dtr_rts,
1012         .throttle =             usb_serial_generic_throttle,
1013         .unthrottle =           usb_serial_generic_unthrottle,
1014         .process_read_urb =     ftdi_process_read_urb,
1015         .prepare_write_buffer = ftdi_prepare_write_buffer,
1016         .tiocmget =             ftdi_tiocmget,
1017         .tiocmset =             ftdi_tiocmset,
1018         .tiocmiwait =           usb_serial_generic_tiocmiwait,
1019         .get_icount =           usb_serial_generic_get_icount,
1020         .ioctl =                ftdi_ioctl,
1021         .set_termios =          ftdi_set_termios,
1022         .break_ctl =            ftdi_break_ctl,
1023         .tx_empty =             ftdi_tx_empty,
1024 };
1025 
1026 static struct usb_serial_driver * const serial_drivers[] = {
1027         &ftdi_sio_device, NULL
1028 };
1029 
1030 
1031 #define WDR_TIMEOUT 5000 /* default urb timeout */
1032 #define WDR_SHORT_TIMEOUT 1000  /* shorter urb timeout */
1033 
1034 /*
1035  * ***************************************************************************
1036  * Utility functions
1037  * ***************************************************************************
1038  */
1039 
1040 static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base)
1041 {
1042         unsigned short int divisor;
1043         /* divisor shifted 3 bits to the left */
1044         int divisor3 = base / 2 / baud;
1045         if ((divisor3 & 0x7) == 7)
1046                 divisor3++; /* round x.7/8 up to x+1 */
1047         divisor = divisor3 >> 3;
1048         divisor3 &= 0x7;
1049         if (divisor3 == 1)
1050                 divisor |= 0xc000;
1051         else if (divisor3 >= 4)
1052                 divisor |= 0x4000;
1053         else if (divisor3 != 0)
1054                 divisor |= 0x8000;
1055         else if (divisor == 1)
1056                 divisor = 0;    /* special case for maximum baud rate */
1057         return divisor;
1058 }
1059 
1060 static unsigned short int ftdi_232am_baud_to_divisor(int baud)
1061 {
1062          return ftdi_232am_baud_base_to_divisor(baud, 48000000);
1063 }
1064 
1065 static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base)
1066 {
1067         static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
1068         __u32 divisor;
1069         /* divisor shifted 3 bits to the left */
1070         int divisor3 = base / 2 / baud;
1071         divisor = divisor3 >> 3;
1072         divisor |= (__u32)divfrac[divisor3 & 0x7] << 14;
1073         /* Deal with special cases for highest baud rates. */
1074         if (divisor == 1)
1075                 divisor = 0;
1076         else if (divisor == 0x4001)
1077                 divisor = 1;
1078         return divisor;
1079 }
1080 
1081 static __u32 ftdi_232bm_baud_to_divisor(int baud)
1082 {
1083          return ftdi_232bm_baud_base_to_divisor(baud, 48000000);
1084 }
1085 
1086 static __u32 ftdi_2232h_baud_base_to_divisor(int baud, int base)
1087 {
1088         static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
1089         __u32 divisor;
1090         int divisor3;
1091 
1092         /* hi-speed baud rate is 10-bit sampling instead of 16-bit */
1093         divisor3 = base * 8 / (baud * 10);
1094 
1095         divisor = divisor3 >> 3;
1096         divisor |= (__u32)divfrac[divisor3 & 0x7] << 14;
1097         /* Deal with special cases for highest baud rates. */
1098         if (divisor == 1)
1099                 divisor = 0;
1100         else if (divisor == 0x4001)
1101                 divisor = 1;
1102         /*
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          */
1107         divisor |= 0x00020000;
1108         return divisor;
1109 }
1110 
1111 static __u32 ftdi_2232h_baud_to_divisor(int baud)
1112 {
1113          return ftdi_2232h_baud_base_to_divisor(baud, 120000000);
1114 }
1115 
1116 #define set_mctrl(port, set)            update_mctrl((port), (set), 0)
1117 #define clear_mctrl(port, clear)        update_mctrl((port), 0, (clear))
1118 
1119 static int update_mctrl(struct usb_serial_port *port, unsigned int set,
1120                                                         unsigned int clear)
1121 {
1122         struct ftdi_private *priv = usb_get_serial_port_data(port);
1123         struct device *dev = &port->dev;
1124         unsigned urb_value;
1125         int rv;
1126 
1127         if (((set | clear) & (TIOCM_DTR | TIOCM_RTS)) == 0) {
1128                 dev_dbg(dev, "%s - DTR|RTS not being set|cleared\n", __func__);
1129                 return 0;       /* no change */
1130         }
1131 
1132         clear &= ~set;  /* ‘set‘ takes precedence over ‘clear‘ */
1133         urb_value = 0;
1134         if (clear & TIOCM_DTR)
1135                 urb_value |= FTDI_SIO_SET_DTR_LOW;
1136         if (clear & TIOCM_RTS)
1137                 urb_value |= FTDI_SIO_SET_RTS_LOW;
1138         if (set & TIOCM_DTR)
1139                 urb_value |= FTDI_SIO_SET_DTR_HIGH;
1140         if (set & TIOCM_RTS)
1141                 urb_value |= FTDI_SIO_SET_RTS_HIGH;
1142         rv = usb_control_msg(port->serial->dev,
1143                                usb_sndctrlpipe(port->serial->dev, 0),
1144                                FTDI_SIO_SET_MODEM_CTRL_REQUEST,
1145                                FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE,
1146                                urb_value, priv->interface,
1147                                NULL, 0, WDR_TIMEOUT);
1148         if (rv < 0) {
1149                 dev_dbg(dev, "%s Error from MODEM_CTRL urb: DTR %s, RTS %s\n",
1150                         __func__,
1151                         (set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged",
1152                         (set & TIOCM_RTS) ? "HIGH" : (clear & TIOCM_RTS) ? "LOW" : "unchanged");
1153                 rv = usb_translate_errors(rv);
1154         } else {
1155                 dev_dbg(dev, "%s - DTR %s, RTS %s\n", __func__,
1156                         (set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged",
1157                         (set & TIOCM_RTS) ? "HIGH" : (clear & TIOCM_RTS) ? "LOW" : "unchanged");
1158                 /* FIXME: locking on last_dtr_rts */
1159                 priv->last_dtr_rts = (priv->last_dtr_rts & ~clear) | set;
1160         }
1161         return rv;
1162 }
1163 
1164 
1165 static __u32 get_ftdi_divisor(struct tty_struct *tty,
1166                                                 struct usb_serial_port *port)
1167 {
1168         struct ftdi_private *priv = usb_get_serial_port_data(port);
1169         struct device *dev = &port->dev;
1170         __u32 div_value = 0;
1171         int div_okay = 1;
1172         int baud;
1173 
1174         /*
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          */
1200 
1201         /* 1. Get the baud rate from the tty settings, this observes
1202               alt_speed hack */
1203 
1204         baud = tty_get_baud_rate(tty);
1205         dev_dbg(dev, "%s - tty_get_baud_rate reports speed %d\n", __func__, baud);
1206 
1207         /* 2. Observe async-compatible custom_divisor hack, update baudrate
1208            if needed */
1209 
1210         if (baud == 38400 &&
1211             ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
1212              (priv->custom_divisor)) {
1213                 baud = priv->baud_base / priv->custom_divisor;
1214                 dev_dbg(dev, "%s - custom divisor %d sets baud rate to %d\n",
1215                         __func__, priv->custom_divisor, baud);
1216         }
1217 
1218         /* 3. Convert baudrate to device-specific divisor */
1219 
1220         if (!baud)
1221                 baud = 9600;
1222         switch (priv->chip_type) {
1223         case SIO: /* SIO chip */
1224                 switch (baud) {
1225                 case 300: div_value = ftdi_sio_b300; break;
1226                 case 600: div_value = ftdi_sio_b600; break;
1227                 case 1200: div_value = ftdi_sio_b1200; break;
1228                 case 2400: div_value = ftdi_sio_b2400; break;
1229                 case 4800: div_value = ftdi_sio_b4800; break;
1230                 case 9600: div_value = ftdi_sio_b9600; break;
1231                 case 19200: div_value = ftdi_sio_b19200; break;
1232                 case 38400: div_value = ftdi_sio_b38400; break;
1233                 case 57600: div_value = ftdi_sio_b57600;  break;
1234                 case 115200: div_value = ftdi_sio_b115200; break;
1235                 } /* baud */
1236                 if (div_value == 0) {
1237                         dev_dbg(dev, "%s - Baudrate (%d) requested is not supported\n",
1238                                 __func__,  baud);
1239                         div_value = ftdi_sio_b9600;
1240                         baud = 9600;
1241                         div_okay = 0;
1242                 }
1243                 break;
1244         case FT8U232AM: /* 8U232AM chip */
1245                 if (baud <= 3000000) {
1246                         div_value = ftdi_232am_baud_to_divisor(baud);
1247                 } else {
1248                         dev_dbg(dev, "%s - Baud rate too high!\n", __func__);
1249                         baud = 9600;
1250                         div_value = ftdi_232am_baud_to_divisor(9600);
1251                         div_okay = 0;
1252                 }
1253                 break;
1254         case FT232BM: /* FT232BM chip */
1255         case FT2232C: /* FT2232C chip */
1256         case FT232RL: /* FT232RL chip */
1257         case FTX:     /* FT-X series */
1258                 if (baud <= 3000000) {
1259                         __u16 product_id = le16_to_cpu(
1260                                 port->serial->dev->descriptor.idProduct);
1261                         if (((FTDI_NDI_HUC_PID == product_id) ||
1262                              (FTDI_NDI_SPECTRA_SCU_PID == product_id) ||
1263                              (FTDI_NDI_FUTURE_2_PID == product_id) ||
1264                              (FTDI_NDI_FUTURE_3_PID == product_id) ||
1265                              (FTDI_NDI_AURORA_SCU_PID == product_id)) &&
1266                             (baud == 19200)) {
1267                                 baud = 1200000;
1268                         }
1269                         div_value = ftdi_232bm_baud_to_divisor(baud);
1270                 } else {
1271                         dev_dbg(dev, "%s - Baud rate too high!\n", __func__);
1272                         div_value = ftdi_232bm_baud_to_divisor(9600);
1273                         div_okay = 0;
1274                         baud = 9600;
1275                 }
1276                 break;
1277         case FT2232H: /* FT2232H chip */
1278         case FT4232H: /* FT4232H chip */
1279         case FT232H:  /* FT232H chip */
1280                 if ((baud <= 12000000) && (baud >= 1200)) {
1281                         div_value = ftdi_2232h_baud_to_divisor(baud);
1282                 } else if (baud < 1200) {
1283                         div_value = ftdi_232bm_baud_to_divisor(baud);
1284                 } else {
1285                         dev_dbg(dev, "%s - Baud rate too high!\n", __func__);
1286                         div_value = ftdi_232bm_baud_to_divisor(9600);
1287                         div_okay = 0;
1288                         baud = 9600;
1289                 }
1290                 break;
1291         } /* priv->chip_type */
1292 
1293         if (div_okay) {
1294                 dev_dbg(dev, "%s - Baud rate set to %d (divisor 0x%lX) on chip %s\n",
1295                         __func__, baud, (unsigned long)div_value,
1296                         ftdi_chip_name[priv->chip_type]);
1297         }
1298 
1299         tty_encode_baud_rate(tty, baud, baud);
1300         return div_value;
1301 }
1302 
1303 static int change_speed(struct tty_struct *tty, struct usb_serial_port *port)
1304 {
1305         struct ftdi_private *priv = usb_get_serial_port_data(port);
1306         __u16 urb_value;
1307         __u16 urb_index;
1308         __u32 urb_index_value;
1309         int rv;
1310 
1311         urb_index_value = get_ftdi_divisor(tty, port);
1312         urb_value = (__u16)urb_index_value;
1313         urb_index = (__u16)(urb_index_value >> 16);
1314         if ((priv->chip_type == FT2232C) || (priv->chip_type == FT2232H) ||
1315                 (priv->chip_type == FT4232H) || (priv->chip_type == FT232H)) {
1316                 /* Probably the BM type needs the MSB of the encoded fractional
1317                  * divider also moved like for the chips above. Any infos? */
1318                 urb_index = (__u16)((urb_index << 8) | priv->interface);
1319         }
1320 
1321         rv = usb_control_msg(port->serial->dev,
1322                             usb_sndctrlpipe(port->serial->dev, 0),
1323                             FTDI_SIO_SET_BAUDRATE_REQUEST,
1324                             FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE,
1325                             urb_value, urb_index,
1326                             NULL, 0, WDR_SHORT_TIMEOUT);
1327         return rv;
1328 }
1329 
1330 static int write_latency_timer(struct usb_serial_port *port)
1331 {
1332         struct ftdi_private *priv = usb_get_serial_port_data(port);
1333         struct usb_device *udev = port->serial->dev;
1334         int rv;
1335         int l = priv->latency;
1336 
1337         if (priv->flags & ASYNC_LOW_LATENCY)
1338                 l = 1;
1339 
1340         dev_dbg(&port->dev, "%s: setting latency timer = %i\n", __func__, l);
1341 
1342         rv = usb_control_msg(udev,
1343                              usb_sndctrlpipe(udev, 0),
1344                              FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
1345                              FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
1346                              l, priv->interface,
1347                              NULL, 0, WDR_TIMEOUT);
1348         if (rv < 0)
1349                 dev_err(&port->dev, "Unable to write latency timer: %i\n", rv);
1350         return rv;
1351 }
1352 
1353 static int read_latency_timer(struct usb_serial_port *port)
1354 {
1355         struct ftdi_private *priv = usb_get_serial_port_data(port);
1356         struct usb_device *udev = port->serial->dev;
1357         unsigned char *buf;
1358         int rv;
1359 
1360         buf = kmalloc(1, GFP_KERNEL);
1361         if (!buf)
1362                 return -ENOMEM;
1363 
1364         rv = usb_control_msg(udev,
1365                              usb_rcvctrlpipe(udev, 0),
1366                              FTDI_SIO_GET_LATENCY_TIMER_REQUEST,
1367                              FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE,
1368                              0, priv->interface,
1369                              buf, 1, WDR_TIMEOUT);
1370         if (rv < 0)
1371                 dev_err(&port->dev, "Unable to read latency timer: %i\n", rv);
1372         else
1373                 priv->latency = buf[0];
1374 
1375         kfree(buf);
1376 
1377         return rv;
1378 }
1379 
1380 static int get_serial_info(struct usb_serial_port *port,
1381                                 struct serial_struct __user *retinfo)
1382 {
1383         struct ftdi_private *priv = usb_get_serial_port_data(port);
1384         struct serial_struct tmp;
1385 
1386         if (!retinfo)
1387                 return -EFAULT;
1388         memset(&tmp, 0, sizeof(tmp));
1389         tmp.flags = priv->flags;
1390         tmp.baud_base = priv->baud_base;
1391         tmp.custom_divisor = priv->custom_divisor;
1392         if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
1393                 return -EFAULT;
1394         return 0;
1395 }
1396 
1397 static int set_serial_info(struct tty_struct *tty,
1398         struct usb_serial_port *port, struct serial_struct __user *newinfo)
1399 {
1400         struct ftdi_private *priv = usb_get_serial_port_data(port);
1401         struct serial_struct new_serial;
1402         struct ftdi_private old_priv;
1403 
1404         if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
1405                 return -EFAULT;
1406 
1407         mutex_lock(&priv->cfg_lock);
1408         old_priv = *priv;
1409 
1410         /* Do error checking and permission checking */
1411 
1412         if (!capable(CAP_SYS_ADMIN)) {
1413                 if (((new_serial.flags & ~ASYNC_USR_MASK) !=
1414                      (priv->flags & ~ASYNC_USR_MASK))) {
1415                         mutex_unlock(&priv->cfg_lock);
1416                         return -EPERM;
1417                 }
1418                 priv->flags = ((priv->flags & ~ASYNC_USR_MASK) |
1419                                (new_serial.flags & ASYNC_USR_MASK));
1420                 priv->custom_divisor = new_serial.custom_divisor;
1421                 goto check_and_exit;
1422         }
1423 
1424         if (new_serial.baud_base != priv->baud_base) {
1425                 mutex_unlock(&priv->cfg_lock);
1426                 return -EINVAL;
1427         }
1428 
1429         /* Make the changes - these are privileged changes! */
1430 
1431         priv->flags = ((priv->flags & ~ASYNC_FLAGS) |
1432                                         (new_serial.flags & ASYNC_FLAGS));
1433         priv->custom_divisor = new_serial.custom_divisor;
1434 
1435         write_latency_timer(port);
1436 
1437 check_and_exit:
1438         if ((old_priv.flags & ASYNC_SPD_MASK) !=
1439              (priv->flags & ASYNC_SPD_MASK)) {
1440                 if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
1441                         tty->alt_speed = 57600;
1442                 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
1443                         tty->alt_speed = 115200;
1444                 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
1445                         tty->alt_speed = 230400;
1446                 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
1447                         tty->alt_speed = 460800;
1448                 else
1449                         tty->alt_speed = 0;
1450         }
1451         if (((old_priv.flags & ASYNC_SPD_MASK) !=
1452              (priv->flags & ASYNC_SPD_MASK)) ||
1453             (((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
1454              (old_priv.custom_divisor != priv->custom_divisor))) {
1455                 change_speed(tty, port);
1456                 mutex_unlock(&priv->cfg_lock);
1457         }
1458         else
1459                 mutex_unlock(&priv->cfg_lock);
1460         return 0;
1461 }
1462 
1463 static int get_lsr_info(struct usb_serial_port *port,
1464                         struct serial_struct __user *retinfo)
1465 {
1466         struct ftdi_private *priv = usb_get_serial_port_data(port);
1467         unsigned int result = 0;
1468 
1469         if (!retinfo)
1470                 return -EFAULT;
1471 
1472         if (priv->transmit_empty)
1473                 result = TIOCSER_TEMT;
1474 
1475         if (copy_to_user(retinfo, &result, sizeof(unsigned int)))
1476                 return -EFAULT;
1477         return 0;
1478 }
1479 
1480 
1481 /* Determine type of FTDI chip based on USB config and descriptor. */
1482 static void ftdi_determine_type(struct usb_serial_port *port)
1483 {
1484         struct ftdi_private *priv = usb_get_serial_port_data(port);
1485         struct usb_serial *serial = port->serial;
1486         struct usb_device *udev = serial->dev;
1487         unsigned version;
1488         unsigned interfaces;
1489 
1490         /* Assume it is not the original SIO device for now. */
1491         priv->baud_base = 48000000 / 2;
1492 
1493         version = le16_to_cpu(udev->descriptor.bcdDevice);
1494         interfaces = udev->actconfig->desc.bNumInterfaces;
1495         dev_dbg(&port->dev, "%s: bcdDevice = 0x%x, bNumInterfaces = %u\n", __func__,
1496                 version, interfaces);
1497         if (interfaces > 1) {
1498                 int inter;
1499 
1500                 /* Multiple interfaces.*/
1501                 if (version == 0x0800) {
1502                         priv->chip_type = FT4232H;
1503                         /* Hi-speed - baud clock runs at 120MHz */
1504                         priv->baud_base = 120000000 / 2;
1505                 } else if (version == 0x0700) {
1506                         priv->chip_type = FT2232H;
1507                         /* Hi-speed - baud clock runs at 120MHz */
1508                         priv->baud_base = 120000000 / 2;
1509                 } else
1510                         priv->chip_type = FT2232C;
1511 
1512                 /* Determine interface code. */
1513                 inter = serial->interface->altsetting->desc.bInterfaceNumber;
1514                 if (inter == 0) {
1515                         priv->interface = INTERFACE_A;
1516                 } else  if (inter == 1) {
1517                         priv->interface = INTERFACE_B;
1518                 } else  if (inter == 2) {
1519                         priv->interface = INTERFACE_C;
1520                 } else  if (inter == 3) {
1521                         priv->interface = INTERFACE_D;
1522                 }
1523                 /* BM-type devices have a bug where bcdDevice gets set
1524                  * to 0x200 when iSerialNumber is 0.  */
1525                 if (version < 0x500) {
1526                         dev_dbg(&port->dev,
1527                                 "%s: something fishy - bcdDevice too low for multi-interface device\n",
1528                                 __func__);
1529                 }
1530         } else if (version < 0x200) {
1531                 /* Old device.  Assume it‘s the original SIO. */
1532                 priv->chip_type = SIO;
1533                 priv->baud_base = 12000000 / 16;
1534         } else if (version < 0x400) {
1535                 /* Assume it‘s an FT8U232AM (or FT8U245AM) */
1536                 /* (It might be a BM because of the iSerialNumber bug,
1537                  * but it will still work as an AM device.) */
1538                 priv->chip_type = FT8U232AM;
1539         } else if (version < 0x600) {
1540                 /* Assume it‘s an FT232BM (or FT245BM) */
1541                 priv->chip_type = FT232BM;
1542         } else if (version < 0x900) {
1543                 /* Assume it‘s an FT232RL */
1544                 priv->chip_type = FT232RL;
1545         } else if (version < 0x1000) {
1546                 /* Assume it‘s an FT232H */
1547                 priv->chip_type = FT232H;
1548         } else {
1549                 /* Assume it‘s an FT-X series device */
1550                 priv->chip_type = FTX;
1551         }
1552 
1553         dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]);
1554 }
1555 
1556 
1557 /*
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  */
1562 static void ftdi_set_max_packet_size(struct usb_serial_port *port)
1563 {
1564         struct ftdi_private *priv = usb_get_serial_port_data(port);
1565         struct usb_interface *interface = port->serial->interface;
1566         struct usb_endpoint_descriptor *ep_desc;
1567         unsigned num_endpoints;
1568         unsigned i;
1569 
1570         num_endpoints = interface->cur_altsetting->desc.bNumEndpoints;
1571         if (!num_endpoints)
1572                 return;
1573 
1574         /*
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          */
1580         for (i = 0; i < num_endpoints; i++) {
1581                 ep_desc = &interface->cur_altsetting->endpoint[i].desc;
1582                 if (!ep_desc->wMaxPacketSize) {
1583                         ep_desc->wMaxPacketSize = cpu_to_le16(0x40);
1584                         dev_warn(&port->dev, "Overriding wMaxPacketSize on endpoint %d\n",
1585                                         usb_endpoint_num(ep_desc));
1586                 }
1587         }
1588 
1589         /* Set max packet size based on last descriptor. */
1590         priv->max_packet_size = usb_endpoint_maxp(ep_desc);
1591 }
1592 
1593 
1594 /*
1595  * ***************************************************************************
1596  * Sysfs Attribute
1597  * ***************************************************************************
1598  */
1599 
1600 static ssize_t latency_timer_show(struct device *dev,
1601                                   struct device_attribute *attr, char *buf)
1602 {
1603         struct usb_serial_port *port = to_usb_serial_port(dev);
1604         struct ftdi_private *priv = usb_get_serial_port_data(port);
1605         if (priv->flags & ASYNC_LOW_LATENCY)
1606                 return sprintf(buf, "1\n");
1607         else
1608                 return sprintf(buf, "%i\n", priv->latency);
1609 }
1610 
1611 /* Write a new value of the latency timer, in units of milliseconds. */
1612 static ssize_t latency_timer_store(struct device *dev,
1613                                    struct device_attribute *attr,
1614                                    const char *valbuf, size_t count)
1615 {
1616         struct usb_serial_port *port = to_usb_serial_port(dev);
1617         struct ftdi_private *priv = usb_get_serial_port_data(port);
1618         int v = simple_strtoul(valbuf, NULL, 10);
1619         int rv;
1620 
1621         priv->latency = v;
1622         rv = write_latency_timer(port);
1623         if (rv < 0)
1624                 return -EIO;
1625         return count;
1626 }
1627 static DEVICE_ATTR_RW(latency_timer);
1628 
1629 /* 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. */
1631 static ssize_t store_event_char(struct device *dev,
1632         struct device_attribute *attr, const char *valbuf, size_t count)
1633 {
1634         struct usb_serial_port *port = to_usb_serial_port(dev);
1635         struct ftdi_private *priv = usb_get_serial_port_data(port);
1636         struct usb_device *udev = port->serial->dev;
1637         int v = simple_strtoul(valbuf, NULL, 10);
1638         int rv;
1639 
1640         dev_dbg(&port->dev, "%s: setting event char = %i\n", __func__, v);
1641 
1642         rv = usb_control_msg(udev,
1643                              usb_sndctrlpipe(udev, 0),
1644                              FTDI_SIO_SET_EVENT_CHAR_REQUEST,
1645                              FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE,
1646                              v, priv->interface,
1647                              NULL, 0, WDR_TIMEOUT);
1648         if (rv < 0) {
1649                 dev_dbg(&port->dev, "Unable to write event character: %i\n", rv);
1650                 return -EIO;
1651         }
1652 
1653         return count;
1654 }
1655 static DEVICE_ATTR(event_char, S_IWUSR, NULL, store_event_char);
1656 
1657 static int create_sysfs_attrs(struct usb_serial_port *port)
1658 {
1659         struct ftdi_private *priv = usb_get_serial_port_data(port);
1660         int retval = 0;
1661 
1662         /* XXX I‘ve no idea if the original SIO supports the event_char
1663          * sysfs parameter, so I‘m playing it safe.  */
1664         if (priv->chip_type != SIO) {
1665                 dev_dbg(&port->dev, "sysfs attributes for %s\n", ftdi_chip_name[priv->chip_type]);
1666                 retval = device_create_file(&port->dev, &dev_attr_event_char);
1667                 if ((!retval) &&
1668                     (priv->chip_type == FT232BM ||
1669                      priv->chip_type == FT2232C ||
1670                      priv->chip_type == FT232RL ||
1671                      priv->chip_type == FT2232H ||
1672                      priv->chip_type == FT4232H ||
1673                      priv->chip_type == FT232H ||
1674                      priv->chip_type == FTX)) {
1675                         retval = device_create_file(&port->dev,
1676                                                     &dev_attr_latency_timer);
1677                 }
1678         }
1679         return retval;
1680 }
1681 
1682 static void remove_sysfs_attrs(struct usb_serial_port *port)
1683 {
1684         struct ftdi_private *priv = usb_get_serial_port_data(port);
1685 
1686         /* XXX see create_sysfs_attrs */
1687         if (priv->chip_type != SIO) {
1688                 device_remove_file(&port->dev, &dev_attr_event_char);
1689                 if (priv->chip_type == FT232BM ||
1690                     priv->chip_type == FT2232C ||
1691                     priv->chip_type == FT232RL ||
1692                     priv->chip_type == FT2232H ||
1693                     priv->chip_type == FT4232H ||
1694                     priv->chip_type == FT232H ||
1695                     priv->chip_type == FTX) {
1696                         device_remove_file(&port->dev, &dev_attr_latency_timer);
1697                 }
1698         }
1699 
1700 }
1701 
1702 /*
1703  * ***************************************************************************
1704  * FTDI driver specific functions
1705  * ***************************************************************************
1706  */
1707 
1708 /* Probe function to check for special devices */
1709 static int ftdi_sio_probe(struct usb_serial *serial,
1710                                         const struct usb_device_id *id)
1711 {
1712         struct ftdi_sio_quirk *quirk =
1713                                 (struct ftdi_sio_quirk *)id->driver_info;
1714 
1715         if (quirk && quirk->probe) {
1716                 int ret = quirk->probe(serial);
1717                 if (ret != 0)
1718                         return ret;
1719         }
1720 
1721         usb_set_serial_data(serial, (void *)id->driver_info);
1722 
1723         return 0;
1724 }
1725 
1726 static int ftdi_sio_port_probe(struct usb_serial_port *port)
1727 {
1728         struct ftdi_private *priv;
1729         struct ftdi_sio_quirk *quirk = usb_get_serial_data(port->serial);
1730 
1731 
1732         priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL);
1733         if (!priv)
1734                 return -ENOMEM;
1735 
1736         mutex_init(&priv->cfg_lock);
1737 
1738         priv->flags = ASYNC_LOW_LATENCY;
1739 
1740         if (quirk && quirk->port_probe)
1741                 quirk->port_probe(priv);
1742 
1743         usb_set_serial_port_data(port, priv);
1744 
1745         ftdi_determine_type(port);
1746         ftdi_set_max_packet_size(port);
1747         if (read_latency_timer(port) < 0)
1748                 priv->latency = 16;
1749         write_latency_timer(port);
1750         create_sysfs_attrs(port);
1751         return 0;
1752 }
1753 
1754 /* Setup for the USB-UIRT device, which requires hardwired
1755  * baudrate (38400 gets mapped to 312500) */
1756 /* Called from usbserial:serial_probe */
1757 static void ftdi_USB_UIRT_setup(struct ftdi_private *priv)
1758 {
1759         priv->flags |= ASYNC_SPD_CUST;
1760         priv->custom_divisor = 77;
1761         priv->force_baud = 38400;
1762 }
1763 
1764 /* Setup for the HE-TIRA1 device, which requires hardwired
1765  * baudrate (38400 gets mapped to 100000) and RTS-CTS enabled.  */
1766 
1767 static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv)
1768 {
1769         priv->flags |= ASYNC_SPD_CUST;
1770         priv->custom_divisor = 240;
1771         priv->force_baud = 38400;
1772         priv->force_rtscts = 1;
1773 }
1774 
1775 /*
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  */
1780 static int ndi_latency_timer = 1;
1781 
1782 /* 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  */
1787 static int ftdi_NDI_device_setup(struct usb_serial *serial)
1788 {
1789         struct usb_device *udev = serial->dev;
1790         int latency = ndi_latency_timer;
1791 
1792         if (latency == 0)
1793                 latency = 1;
1794         if (latency > 99)
1795                 latency = 99;
1796 
1797         dev_dbg(&udev->dev, "%s setting NDI device latency to %d\n", __func__, latency);
1798         dev_info(&udev->dev, "NDI device with a latency value of %d\n", latency);
1799 
1800         /* FIXME: errors are not returned */
1801         usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
1802                                 FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
1803                                 FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
1804                                 latency, 0, NULL, 0, WDR_TIMEOUT);
1805         return 0;
1806 }
1807 
1808 /*
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  */
1813 static int ftdi_jtag_probe(struct usb_serial *serial)
1814 {
1815         struct usb_device *udev = serial->dev;
1816         struct usb_interface *interface = serial->interface;
1817 
1818         if (interface == udev->actconfig->interface[0]) {
1819                 dev_info(&udev->dev,
1820                          "Ignoring serial port reserved for JTAG\n");
1821                 return -ENODEV;
1822         }
1823 
1824         return 0;
1825 }
1826 
1827 static int ftdi_8u2232c_probe(struct usb_serial *serial)
1828 {
1829         struct usb_device *udev = serial->dev;
1830 
1831         if ((udev->manufacturer && !strcmp(udev->manufacturer, "CALAO Systems")) ||
1832             (udev->product && !strcmp(udev->product, "BeagleBone/XDS100V2")))
1833                 return ftdi_jtag_probe(serial);
1834 
1835         return 0;
1836 }
1837 
1838 /*
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  */
1845 static int ftdi_stmclite_probe(struct usb_serial *serial)
1846 {
1847         struct usb_device *udev = serial->dev;
1848         struct usb_interface *interface = serial->interface;
1849 
1850         if (interface == udev->actconfig->interface[0] ||
1851             interface == udev->actconfig->interface[1]) {
1852                 dev_info(&udev->dev, "Ignoring serial port reserved for JTAG\n");
1853                 return -ENODEV;
1854         }
1855 
1856         return 0;
1857 }
1858 
1859 static int ftdi_sio_port_remove(struct usb_serial_port *port)
1860 {
1861         struct ftdi_private *priv = usb_get_serial_port_data(port);
1862 
1863         remove_sysfs_attrs(port);
1864 
1865         kfree(priv);
1866 
1867         return 0;
1868 }
1869 
1870 static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port)
1871 {
1872         struct usb_device *dev = port->serial->dev;
1873         struct ftdi_private *priv = usb_get_serial_port_data(port);
1874 
1875         /* No error checking for this (will get errors later anyway) */
1876         /* See ftdi_sio.h for description of what is reset */
1877         usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
1878                         FTDI_SIO_RESET_REQUEST, FTDI_SIO_RESET_REQUEST_TYPE,
1879                         FTDI_SIO_RESET_SIO,
1880                         priv->interface, NULL, 0, WDR_TIMEOUT);
1881 
1882         /* 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 */
1885 
1886         /* ftdi_set_termios  will send usb control messages */
1887         if (tty)
1888                 ftdi_set_termios(tty, port, NULL);
1889 
1890         return usb_serial_generic_open(tty, port);
1891 }
1892 
1893 static void ftdi_dtr_rts(struct usb_serial_port *port, int on)
1894 {
1895         struct ftdi_private *priv = usb_get_serial_port_data(port);
1896 
1897         /* Disable flow control */
1898         if (!on) {
1899                 if (usb_control_msg(port->serial->dev,
1900                             usb_sndctrlpipe(port->serial->dev, 0),
1901                             FTDI_SIO_SET_FLOW_CTRL_REQUEST,
1902                             FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
1903                             0, priv->interface, NULL, 0,
1904                             WDR_TIMEOUT) < 0) {
1905                         dev_err(&port->dev, "error from flowcontrol urb\n");
1906                 }
1907         }
1908         /* drop RTS and DTR */
1909         if (on)
1910                 set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
1911         else
1912                 clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
1913 }
1914 
1915 /* 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  */
1922 static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
1923                                                 void *dest, size_t size)
1924 {
1925         struct ftdi_private *priv;
1926         int count;
1927         unsigned long flags;
1928 
1929         priv = usb_get_serial_port_data(port);
1930 
1931         if (priv->chip_type == SIO) {
1932                 unsigned char *buffer = dest;
1933                 int i, len, c;
1934 
1935                 count = 0;
1936                 spin_lock_irqsave(&port->lock, flags);
1937                 for (i = 0; i < size - 1; i += priv->max_packet_size) {
1938                         len = min_t(int, size - i, priv->max_packet_size) - 1;
1939                         c = kfifo_out(&port->write_fifo, &buffer[i + 1], len);
1940                         if (!c)
1941                                 break;
1942                         port->icount.tx += c;
1943                         buffer[i] = (c << 2) + 1;
1944                         count += c + 1;
1945                 }
1946                 spin_unlock_irqrestore(&port->lock, flags);
1947         } else {
1948                 count = kfifo_out_locked(&port->write_fifo, dest, size,
1949                                                                 &port->lock);
1950                 port->icount.tx += count;
1951         }
1952 
1953         return count;
1954 }
1955 
1956 #define FTDI_RS_ERR_MASK (FTDI_RS_BI | FTDI_RS_PE | FTDI_RS_FE | FTDI_RS_OE)
1957 
1958 static int ftdi_process_packet(struct usb_serial_port *port,
1959                 struct ftdi_private *priv, char *packet, int len)
1960 {
1961         int i;
1962         char status;
1963         char flag;
1964         char *ch;
1965 
1966         if (len < 2) {
1967                 dev_dbg(&port->dev, "malformed packet\n");
1968                 return 0;
1969         }
1970 
1971         /* 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.  */
1974         status = packet[0] & FTDI_STATUS_B0_MASK;
1975         if (status != priv->prev_status) {
1976                 char diff_status = status ^ priv->prev_status;
1977 
1978                 if (diff_status & FTDI_RS0_CTS)
1979                         port->icount.cts++;
1980                 if (diff_status & FTDI_RS0_DSR)
1981                         port->icount.dsr++;
1982                 if (diff_status & FTDI_RS0_RI)
1983                         port->icount.rng++;
1984                 if (diff_status & FTDI_RS0_RLSD) {
1985                         struct tty_struct *tty;
1986 
1987                         port->icount.dcd++;
1988                         tty = tty_port_tty_get(&port->port);
1989                         if (tty)
1990                                 usb_serial_handle_dcd_change(port, tty,
1991                                                 status & FTDI_RS0_RLSD);
1992                         tty_kref_put(tty);
1993                 }
1994 
1995                 wake_up_interruptible(&port->port.delta_msr_wait);
1996                 priv->prev_status = status;
1997         }
1998 
1999         flag = TTY_NORMAL;
2000         if (packet[1] & FTDI_RS_ERR_MASK) {
2001                 /* Break takes precedence over parity, which takes precedence
2002                  * over framing errors */
2003                 if (packet[1] & FTDI_RS_BI) {
2004                         flag = TTY_BREAK;
2005                         port->icount.brk++;
2006                         usb_serial_handle_break(port);
2007                 } else if (packet[1] & FTDI_RS_PE) {
2008                         flag = TTY_PARITY;
2009                         port->icount.parity++;
2010                 } else if (packet[1] & FTDI_RS_FE) {
2011                         flag = TTY_FRAME;
2012                         port->icount.frame++;
2013                 }
2014                 /* Overrun is special, not associated with a char */
2015                 if (packet[1] & FTDI_RS_OE) {
2016                         port->icount.overrun++;
2017                         tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
2018                 }
2019         }
2020 
2021         /* save if the transmitter is empty or not */
2022         if (packet[1] & FTDI_RS_TEMT)
2023                 priv->transmit_empty = 1;
2024         else
2025                 priv->transmit_empty = 0;
2026 
2027         len -= 2;
2028         if (!len)
2029                 return 0;       /* status only */
2030         port->icount.rx += len;
2031         ch = packet + 2;
2032 
2033         if (port->port.console && port->sysrq) {
2034                 for (i = 0; i < len; i++, ch++) {
2035                         if (!usb_serial_handle_sysrq_char(port, *ch))
2036                                 tty_insert_flip_char(&port->port, *ch, flag);
2037                 }
2038         } else {
2039                 tty_insert_flip_string_fixed_flag(&port->port, ch, flag, len);
2040         }
2041 
2042         return len;
2043 }
2044 
2045 static void ftdi_process_read_urb(struct urb *urb)
2046 {
2047         struct usb_serial_port *port = urb->context;
2048         struct ftdi_private *priv = usb_get_serial_port_data(port);
2049         char *data = (char *)urb->transfer_buffer;
2050         int i;
2051         int len;
2052         int count = 0;
2053 
2054         for (i = 0; i < urb->actual_length; i += priv->max_packet_size) {
2055                 len = min_t(int, urb->actual_length - i, priv->max_packet_size);
2056                 count += ftdi_process_packet(port, priv, &data[i], len);
2057         }
2058 
2059         if (count)
2060                 tty_flip_buffer_push(&port->port);
2061 }
2062 
2063 static void ftdi_break_ctl(struct tty_struct *tty, int break_state)
2064 {
2065         struct usb_serial_port *port = tty->driver_data;
2066         struct ftdi_private *priv = usb_get_serial_port_data(port);
2067         __u16 urb_value;
2068 
2069         /* break_state = -1 to turn on break, and 0 to turn off break */
2070         /* see drivers/char/tty_io.c to see it used */
2071         /* last_set_data_urb_value NEVER has the break bit set in it */
2072 
2073         if (break_state)
2074                 urb_value = priv->last_set_data_urb_value | FTDI_SIO_SET_BREAK;
2075         else
2076                 urb_value = priv->last_set_data_urb_value;
2077 
2078         if (usb_control_msg(port->serial->dev,
2079                         usb_sndctrlpipe(port->serial->dev, 0),
2080                         FTDI_SIO_SET_DATA_REQUEST,
2081                         FTDI_SIO_SET_DATA_REQUEST_TYPE,
2082                         urb_value , priv->interface,
2083                         NULL, 0, WDR_TIMEOUT) < 0) {
2084                 dev_err(&port->dev, "%s FAILED to enable/disable break state (state was %d)\n",
2085                         __func__, break_state);
2086         }
2087 
2088         dev_dbg(&port->dev, "%s break state is %d - urb is %d\n", __func__,
2089                 break_state, urb_value);
2090 
2091 }
2092 
2093 static bool ftdi_tx_empty(struct usb_serial_port *port)
2094 {
2095         unsigned char buf[2];
2096         int ret;
2097 
2098         ret = ftdi_get_modem_status(port, buf);
2099         if (ret == 2) {
2100                 if (!(buf[1] & FTDI_RS_TEMT))
2101                         return false;
2102         }
2103 
2104         return true;
2105 }
2106 
2107 /* 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  */
2111 static void ftdi_set_termios(struct tty_struct *tty,
2112                 struct usb_serial_port *port, struct ktermios *old_termios)
2113 {
2114         struct usb_device *dev = port->serial->dev;
2115         struct device *ddev = &port->dev;
2116         struct ftdi_private *priv = usb_get_serial_port_data(port);
2117         struct ktermios *termios = &tty->termios;
2118         unsigned int cflag = termios->c_cflag;
2119         __u16 urb_value; /* will hold the new flags */
2120 
2121         /* Added for xon/xoff support */
2122         unsigned int iflag = termios->c_iflag;
2123         unsigned char vstop;
2124         unsigned char vstart;
2125 
2126         /* Force baud rate if this device requires it, unless it is set to
2127            B0. */
2128         if (priv->force_baud && ((termios->c_cflag & CBAUD) != B0)) {
2129                 dev_dbg(ddev, "%s: forcing baud rate for this device\n", __func__);
2130                 tty_encode_baud_rate(tty, priv->force_baud,
2131                                         priv->force_baud);
2132         }
2133 
2134         /* Force RTS-CTS if this device requires it. */
2135         if (priv->force_rtscts) {
2136                 dev_dbg(ddev, "%s: forcing rtscts for this device\n", __func__);
2137                 termios->c_cflag |= CRTSCTS;
2138         }
2139 
2140         /*
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          */
2154         if (C_CSIZE(tty) == CS6) {
2155                 dev_warn(ddev, "requested CSIZE setting not supported\n");
2156 
2157                 termios->c_cflag &= ~CSIZE;
2158                 if (old_termios)
2159                         termios->c_cflag |= old_termios->c_cflag & CSIZE;
2160                 else
2161                         termios->c_cflag |= CS8;
2162         }
2163 
2164         cflag = termios->c_cflag;
2165 
2166         if (!old_termios)
2167                 goto no_skip;
2168 
2169         if (old_termios->c_cflag == termios->c_cflag
2170             && old_termios->c_ispeed == termios->c_ispeed
2171             && old_termios->c_ospeed == termios->c_ospeed)
2172                 goto no_c_cflag_changes;
2173 
2174         /* 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 */
2177 
2178         if ((old_termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)) ==
2179             (termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)))
2180                 goto no_data_parity_stop_changes;
2181 
2182 no_skip:
2183         /* Set number of data bits, parity, stop bits */
2184 
2185         urb_value = 0;
2186         urb_value |= (cflag & CSTOPB ? FTDI_SIO_SET_DATA_STOP_BITS_2 :
2187                       FTDI_SIO_SET_DATA_STOP_BITS_1);
2188         if (cflag & PARENB) {
2189                 if (cflag & CMSPAR)
2190                         urb_value |= cflag & PARODD ?
2191                                      FTDI_SIO_SET_DATA_PARITY_MARK :
2192                                      FTDI_SIO_SET_DATA_PARITY_SPACE;
2193                 else
2194                         urb_value |= cflag & PARODD ?
2195                                      FTDI_SIO_SET_DATA_PARITY_ODD :
2196                                      FTDI_SIO_SET_DATA_PARITY_EVEN;
2197         } else {
2198                 urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE;
2199         }
2200         switch (cflag & CSIZE) {
2201         case CS5:
2202                 dev_dbg(ddev, "Setting CS5 quirk\n");
2203                 break;
2204         case CS7:
2205                 urb_value |= 7;
2206                 dev_dbg(ddev, "Setting CS7\n");
2207                 break;
2208         default:
2209         case CS8:
2210                 urb_value |= 8;
2211                 dev_dbg(ddev, "Setting CS8\n");
2212                 break;
2213         }
2214 
2215         /* This is needed by the break command since it uses the same command
2216            - but is or‘ed with this value  */
2217         priv->last_set_data_urb_value = urb_value;
2218 
2219         if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
2220                             FTDI_SIO_SET_DATA_REQUEST,
2221                             FTDI_SIO_SET_DATA_REQUEST_TYPE,
2222                             urb_value , priv->interface,
2223                             NULL, 0, WDR_SHORT_TIMEOUT) < 0) {
2224                 dev_err(ddev, "%s FAILED to set databits/stopbits/parity\n",
2225                         __func__);
2226         }
2227 
2228         /* Now do the baudrate */
2229 no_data_parity_stop_changes:
2230         if ((cflag & CBAUD) == B0) {
2231                 /* Disable flow control */
2232                 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
2233                                     FTDI_SIO_SET_FLOW_CTRL_REQUEST,
2234                                     FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
2235                                     0, priv->interface,
2236                                     NULL, 0, WDR_TIMEOUT) < 0) {
2237                         dev_err(ddev, "%s error from disable flowcontrol urb\n",
2238                                 __func__);
2239                 }
2240                 /* Drop RTS and DTR */
2241                 clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
2242         } else {
2243                 /* set the baudrate determined before */
2244                 mutex_lock(&priv->cfg_lock);
2245                 if (change_speed(tty, port))
2246                         dev_err(ddev, "%s urb failed to set baudrate\n", __func__);
2247                 mutex_unlock(&priv->cfg_lock);
2248                 /* Ensure RTS and DTR are raised when baudrate changed from 0 */
2249                 if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
2250                         set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
2251         }
2252 
2253         /* Set flow control */
2254         /* Note device also supports DTR/CD (ugh) and Xon/Xoff in hardware */
2255 no_c_cflag_changes:
2256         if (cflag & CRTSCTS) {
2257                 dev_dbg(ddev, "%s Setting to CRTSCTS flow control\n", __func__);
2258                 if (usb_control_msg(dev,
2259                                     usb_sndctrlpipe(dev, 0),
2260                                     FTDI_SIO_SET_FLOW_CTRL_REQUEST,
2261                                     FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
2262                                     0 , (FTDI_SIO_RTS_CTS_HS | priv->interface),
2263                                     NULL, 0, WDR_TIMEOUT) < 0) {
2264                         dev_err(ddev, "urb failed to set to rts/cts flow control\n");
2265                 }
2266         } else {
2267                 /*
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                  */
2274                 if (iflag & IXOFF) {
2275                         dev_dbg(ddev, "%s  request to enable xonxoff iflag=%04x\n",
2276                                 __func__, iflag);
2277                         /* 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                          */
2283                         vstart = termios->c_cc[VSTART];
2284                         vstop = termios->c_cc[VSTOP];
2285                         urb_value = (vstop << 8) | (vstart);
2286 
2287                         if (usb_control_msg(dev,
2288                                             usb_sndctrlpipe(dev, 0),
2289                                             FTDI_SIO_SET_FLOW_CTRL_REQUEST,
2290                                             FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
2291                                             urb_value , (FTDI_SIO_XON_XOFF_HS
2292                                                          | priv->interface),
2293                                             NULL, 0, WDR_TIMEOUT) < 0) {
2294                                 dev_err(&port->dev, "urb failed to set to "
2295                                         "xon/xoff flow control\n");
2296                         }
2297                 } else {
2298                         /* else clause to only run if cflag ! CRTSCTS and iflag
2299                          * ! XOFF. CHECKME Assuming XON/XOFF handled by tty
2300                          * stack - not by device */
2301                         dev_dbg(ddev, "%s Turning off hardware flow control\n", __func__);
2302                         if (usb_control_msg(dev,
2303                                             usb_sndctrlpipe(dev, 0),
2304                                             FTDI_SIO_SET_FLOW_CTRL_REQUEST,
2305                                             FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
2306                                             0, priv->interface,
2307                                             NULL, 0, WDR_TIMEOUT) < 0) {
2308                                 dev_err(ddev, "urb failed to clear flow control\n");
2309                         }
2310                 }
2311         }
2312 }
2313 
2314 /*
2315  * Get modem-control status.
2316  *
2317  * Returns the number of status bytes retrieved (device dependant), or
2318  * negative error code.
2319  */
2320 static int ftdi_get_modem_status(struct usb_serial_port *port,
2321                                                 unsigned char status[2])
2322 {
2323         struct ftdi_private *priv = usb_get_serial_port_data(port);
2324         unsigned char *buf;
2325         int len;
2326         int ret;
2327 
2328         buf = kmalloc(2, GFP_KERNEL);
2329         if (!buf)
2330                 return -ENOMEM;
2331         /*
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          */
2335         switch (priv->chip_type) {
2336         case SIO:
2337                 len = 1;
2338                 break;
2339         case FT8U232AM:
2340         case FT232BM:
2341         case FT2232C:
2342         case FT232RL:
2343         case FT2232H:
2344         case FT4232H:
2345         case FT232H:
2346         case FTX:
2347                 len = 2;
2348                 break;
2349         default:
2350                 ret = -EFAULT;
2351                 goto out;
2352         }
2353 
2354         ret = usb_control_msg(port->serial->dev,
2355                         usb_rcvctrlpipe(port->serial->dev, 0),
2356                         FTDI_SIO_GET_MODEM_STATUS_REQUEST,
2357                         FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
2358                         0, priv->interface,
2359                         buf, len, WDR_TIMEOUT);
2360         if (ret < 0) {
2361                 dev_err(&port->dev, "failed to get modem status: %d\n", ret);
2362                 ret = usb_translate_errors(ret);
2363                 goto out;
2364         }
2365 
2366         status[0] = buf[0];
2367         if (ret > 1)
2368                 status[1] = buf[1];
2369         else
2370                 status[1] = 0;
2371 
2372         dev_dbg(&port->dev, "%s - 0x%02x%02x\n", __func__, status[0],
2373                                                                 status[1]);
2374 out:
2375         kfree(buf);
2376 
2377         return ret;
2378 }
2379 
2380 static int ftdi_tiocmget(struct tty_struct *tty)
2381 {
2382         struct usb_serial_port *port = tty->driver_data;
2383         struct ftdi_private *priv = usb_get_serial_port_data(port);
2384         unsigned char buf[2];
2385         int ret;
2386 
2387         ret = ftdi_get_modem_status(port, buf);
2388         if (ret < 0)
2389                 return ret;
2390 
2391         ret =   (buf[0] & FTDI_SIO_DSR_MASK  ? TIOCM_DSR : 0) |
2392                 (buf[0] & FTDI_SIO_CTS_MASK  ? TIOCM_CTS : 0) |
2393                 (buf[0] & FTDI_SIO_RI_MASK   ? TIOCM_RI  : 0) |
2394                 (buf[0] & FTDI_SIO_RLSD_MASK ? TIOCM_CD  : 0) |
2395                 priv->last_dtr_rts;
2396 
2397         return ret;
2398 }
2399 
2400 static int ftdi_tiocmset(struct tty_struct *tty,
2401                         unsigned int set, unsigned int clear)
2402 {
2403         struct usb_serial_port *port = tty->driver_data;
2404 
2405         return update_mctrl(port, set, clear);
2406 }
2407 
2408 static int ftdi_ioctl(struct tty_struct *tty,
2409                                         unsigned int cmd, unsigned long arg)
2410 {
2411         struct usb_serial_port *port = tty->driver_data;
2412 
2413         /* Based on code from acm.c and others */
2414         switch (cmd) {
2415 
2416         case TIOCGSERIAL: /* gets serial port data */
2417                 return get_serial_info(port,
2418                                         (struct serial_struct __user *) arg);
2419 
2420         case TIOCSSERIAL: /* sets serial port data */
2421                 return set_serial_info(tty, port,
2422                                         (struct serial_struct __user *) arg);
2423         case TIOCSERGETLSR:
2424                 return get_lsr_info(port, (struct serial_struct __user *)arg);
2425                 break;
2426         default:
2427                 break;
2428         }
2429 
2430         return -ENOIOCTLCMD;
2431 }
2432 
2433 module_usb_serial_driver(serial_drivers, id_table_combined);
2434 
2435 MODULE_AUTHOR(DRIVER_AUTHOR);
2436 MODULE_DESCRIPTION(DRIVER_DESC);
2437 MODULE_LICENSE("GPL");
2438 
2439 module_param(ndi_latency_timer, int, S_IRUGO | S_IWUSR);
2440 MODULE_PARM_DESC(ndi_latency_timer, "NDI device latency timer override");
2441 

 

Linux/drivers/usb/serial/ftdi_sio.c

标签:des   style   blog   http   io   color   ar   os   for   

原文地址:http://www.cnblogs.com/shangdawei/p/4073471.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!