首页 > 代码库 > Linux/drivers/usb/serial/ftdi_sio.c

Linux/drivers/usb/serial/ftdi_sio.c

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 0000B102  * bRequest:       FTDI_SIO_SET_BAUDRATE103  * wValue:         BaudDivisor value - see below104  * wIndex:         Port105  * wLength:        0106  * Data:           None107  * 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 values114  *   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 chip117  *   designers have decided it to mean 0.125 instead of 0.75.118  *   This info looked up in FTDI application note "FT8U232 DEVICES \ Data Rates119  *   and Flow Control Consideration for USB to RS232".120  * - BaudDivisor = (BaseClock / 16) / BaudRate, where the (=) operation should121  *   automagically re-encode the resulting value to take fractions into122  *   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.5126  *    : ((BaseClock / 2 / BaudRate) & 2) ? 0x8000  // 0.25127  *    : ((BaseClock / 2 / BaudRate) & 1) ? 0xc000  // 0.125128  *    : 0)129  *130  * For the FT232BM, a 17th divisor bit was introduced to encode the multiples131  * of 0.125 missing from the FT8U232AM.  Bits 16 to 14 are coded as follows132  * (the first four codes are the same as for the FT8U232AM, where bit 16 is133  * always 0):134  *   000 - add .000 to divisor135  *   001 - add .500 to divisor136  *   010 - add .250 to divisor137  *   011 - add .125 to divisor138  *   100 - add .375 to divisor139  *   101 - add .625 to divisor140  *   110 - add .750 to divisor141  *   111 - add .875 to divisor142  * Bits 15 to 0 of the 17-bit divisor are placed in the urb value.  Bit 16 is143  * placed in bit 0 of the urb index.144  *145  * Note that there are a couple of special cases to support the highest baud146  * rates.  If the calculated divisor value is 1, this needs to be replaced with147  * 0.  Additionally for the FT232BM, if the calculated divisor value is 0x4001148  * (1.5), this needs to be replaced with 0x0001 (1) (but this divisor value is149  * 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 = 9175 };176 177 /*178  * The ftdi_8U232AM_xxMHz_byyy constants have been removed. The encoded divisor179  * values are calculated internally.180  */181 #define FTDI_SIO_SET_DATA_REQUEST       FTDI_SIO_SET_DATA182 #define FTDI_SIO_SET_DATA_REQUEST_TYPE  0x40183 #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 0000B196  * bRequest:       FTDI_SIO_SET_DATA197  * wValue:         Data characteristics (see below)198  * wIndex:         Port199  * wLength:        0200  * Data:           No201  *202  * Data characteristics203  *204  *   B0..7   Number of data bits205  *   B8..10  Parity206  *           0 = None207  *           1 = Odd208  *           2 = Even209  *           3 = Mark210  *           4 = Space211  *   B11..13 Stop Bits212  *           0 = 1213  *           1 = 1.5214  *           2 = 2215  *   B14216  *           1 = TX ON (break)217  *           0 = TX OFF (normal state)218  *   B15 Reserved219  *220  */221 222 223 224 /* FTDI_SIO_MODEM_CTRL */225 #define FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE 0x40226 #define FTDI_SIO_SET_MODEM_CTRL_REQUEST FTDI_SIO_MODEM_CTRL227 228 /*229  * BmRequestType:   0100 0000B230  * bRequest:        FTDI_SIO_MODEM_CTRL231  * wValue:          ControlValue (see below)232  * wIndex:          Port233  * wLength:         0234  * Data:            None235  *236  * NOTE: If the device is in RTS/CTS flow control, the RTS set by this237  * command will be IGNORED without an error being returned238  * Also - you can not set DTR and RTS with one control message239  */240 241 #define FTDI_SIO_SET_DTR_MASK 0x1242 #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 0x2245 #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  * ControlValue250  * B0    DTR state251  *          0 = reset252  *          1 = set253  * B1    RTS state254  *          0 = reset255  *          1 = set256  * B2..7 Reserved257  * B8    DTR state enable258  *          0 = ignore259  *          1 = use DTR state260  * B9    RTS state enable261  *          0 = ignore262  *          1 = use RTS state263  * B10..15 Reserved264  */265 266 /* FTDI_SIO_SET_FLOW_CTRL */267 #define FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE 0x40268 #define FTDI_SIO_SET_FLOW_CTRL_REQUEST FTDI_SIO_SET_FLOW_CTRL269 #define FTDI_SIO_DISABLE_FLOW_CTRL 0x0270 #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 0000b275  *   bRequest:       FTDI_SIO_SET_FLOW_CTRL276  *   wValue:         Xoff/Xon277  *   wIndex:         Protocol/Port - hIndex is protocol / lIndex is port278  *   wLength:        0279  *   Data:           None280  *281  * hIndex protocol is:282  *   B0 Output handshaking using RTS/CTS283  *       0 = disabled284  *       1 = enabled285  *   B1 Output handshaking using DTR/DSR286  *       0 = disabled287  *       1 = enabled288  *   B2 Xon/Xoff handshaking289  *       0 = disabled290  *       1 = enabled291  *292  * A value of zero in the hIndex field disables handshaking293  *294  * If Xon/Xoff handshaking is specified, the hValue field should contain the295  * XOFF character and the lValue field contains the XON character.296  */297 298 /*299  * FTDI_SIO_GET_LATENCY_TIMER300  *301  * Set the timeout interval. The FTDI collects data from the slave302  * device, transmitting it to the host when either A) 62 bytes are303  * received, or B) the timeout interval has elapsed and the buffer304  * contains at least 1 byte.  Setting this value to a small number305  * can dramatically improve performance for applications which send306  * small packets, since the default value is 16ms.307  */308 #define  FTDI_SIO_GET_LATENCY_TIMER_REQUEST FTDI_SIO_GET_LATENCY_TIMER309 #define  FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE 0xC0310 311 /*312  *  BmRequestType:   1100 0000b313  *  bRequest:        FTDI_SIO_GET_LATENCY_TIMER314  *  wValue:          0315  *  wIndex:          Port316  *  wLength:         0317  *  Data:            latency (on return)318  */319 320 /*321  * FTDI_SIO_SET_LATENCY_TIMER322  *323  * Set the timeout interval. The FTDI collects data from the slave324  * device, transmitting it to the host when either A) 62 bytes are325  * received, or B) the timeout interval has elapsed and the buffer326  * contains at least 1 byte.  Setting this value to a small number327  * can dramatically improve performance for applications which send328  * small packets, since the default value is 16ms.329  */330 #define  FTDI_SIO_SET_LATENCY_TIMER_REQUEST FTDI_SIO_SET_LATENCY_TIMER331 #define  FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE 0x40332 333 /*334  *  BmRequestType:   0100 0000b335  *  bRequest:        FTDI_SIO_SET_LATENCY_TIMER336  *  wValue:          Latency (milliseconds)337  *  wIndex:          Port338  *  wLength:         0339  *  Data:            None340  *341  * wValue:342  *   B0..7   Latency timer343  *   B8..15  0344  *345  */346 347 /*348  * FTDI_SIO_SET_EVENT_CHAR349  *350  * Set the special event character for the specified communications port.351  * If the device sees this character it will immediately return the352  * data read so far - rather than wait 40ms or until 62 bytes are read353  * which is what normally happens.354  */355 356 357 #define  FTDI_SIO_SET_EVENT_CHAR_REQUEST FTDI_SIO_SET_EVENT_CHAR358 #define  FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE 0x40359 360 361 /*362  *  BmRequestType:   0100 0000b363  *  bRequest:        FTDI_SIO_SET_EVENT_CHAR364  *  wValue:          EventChar365  *  wIndex:          Port366  *  wLength:         0367  *  Data:            None368  *369  * wValue:370  *   B0..7   Event Character371  *   B8      Event Character Processing372  *             0 = disabled373  *             1 = enabled374  *   B9..15  Reserved375  *376  */377 378 /* FTDI_SIO_SET_ERROR_CHAR */379 380 /*381  * Set the parity error replacement character for the specified communications382  * port383  */384 385 /*386  *  BmRequestType:  0100 0000b387  *  bRequest:       FTDI_SIO_SET_EVENT_CHAR388  *  wValue:         Error Char389  *  wIndex:         Port390  *  wLength:        0391  *  Data:           None392  *393  *Error Char394  *  B0..7  Error Character395  *  B8     Error Character Processing396  *           0 = disabled397  *           1 = enabled398  *  B9..15 Reserved399  *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 0xc0406 #define FTDI_SIO_GET_MODEM_STATUS_REQUEST FTDI_SIO_GET_MODEM_STATUS407 #define FTDI_SIO_CTS_MASK 0x10408 #define FTDI_SIO_DSR_MASK 0x20409 #define FTDI_SIO_RI_MASK  0x40410 #define FTDI_SIO_RLSD_MASK 0x80411 /*412  *   BmRequestType:   1100 0000b413  *   bRequest:        FTDI_SIO_GET_MODEM_STATUS414  *   wValue:          zero415  *   wIndex:          Port416  *   wLength:         1417  *   Data:            Status418  *419  * One byte of data is returned420  * B0..3 0421  * B4    CTS422  *         0 = inactive423  *         1 = active424  * B5    DSR425  *         0 = inactive426  *         1 = active427  * B6    Ring Indicator (RI)428  *         0 = inactive429  *         1 = active430  * B7    Receive Line Signal Detect (RLSD)431  *         0 = inactive432  *         1 = active433  */434 435 436 437 /* Descriptors returned by the device438  *439  *  Device Descriptor440  *441  * Offset       Field           Size    Value   Description442  * 0    bLength         1       0x12    Size of descriptor in bytes443  * 1    bDescriptorType 1       0x01    DEVICE Descriptor Type444  * 2    bcdUSB          2       0x0110  USB Spec Release Number445  * 4    bDeviceClass    1       0x00    Class Code446  * 5    bDeviceSubClass 1       0x00    SubClass Code447  * 6    bDeviceProtocol 1       0x00    Protocol Code448  * 7    bMaxPacketSize0 1       0x08    Maximum packet size for endpoint 0449  * 8    idVendor        2       0x0403  Vendor ID450  * 10   idProduct       2       0x8372  Product ID (FTDI_SIO_PID)451  * 12   bcdDevice       2       0x0001  Device release number452  * 14   iManufacturer   1       0x01    Index of man. string desc453  * 15   iProduct        1       0x02    Index of prod string desc454  * 16   iSerialNumber   1       0x02    Index of serial nmr string desc455  * 17   bNumConfigurations 1    0x01    Number of possible configurations456  *457  * Configuration Descriptor458  *459  * Offset       Field                   Size    Value460  * 0    bLength                 1       0x09    Size of descriptor in bytes461  * 1    bDescriptorType         1       0x02    CONFIGURATION Descriptor Type462  * 2    wTotalLength            2       0x0020  Total length of data463  * 4    bNumInterfaces          1       0x01    Number of interfaces supported464  * 5    bConfigurationValue     1       0x01    Argument for SetCOnfiguration() req465  * 6    iConfiguration          1       0x02    Index of config string descriptor466  * 7    bmAttributes            1       0x20    Config characteristics Remote Wakeup467  * 8    MaxPower                1       0x1E    Max power consumption468  *469  * Interface Descriptor470  *471  * Offset       Field                   Size    Value472  * 0    bLength                 1       0x09    Size of descriptor in bytes473  * 1    bDescriptorType         1       0x04    INTERFACE Descriptor Type474  * 2    bInterfaceNumber        1       0x00    Number of interface475  * 3    bAlternateSetting       1       0x00    Value used to select alternate476  * 4    bNumEndpoints           1       0x02    Number of endpoints477  * 5    bInterfaceClass         1       0xFF    Class Code478  * 6    bInterfaceSubClass      1       0xFF    Subclass Code479  * 7    bInterfaceProtocol      1       0xFF    Protocol Code480  * 8    iInterface              1       0x02    Index of interface string description481  *482  * IN Endpoint Descriptor483  *484  * Offset       Field                   Size    Value485  * 0    bLength                 1       0x07    Size of descriptor in bytes486  * 1    bDescriptorType         1       0x05    ENDPOINT descriptor type487  * 2    bEndpointAddress        1       0x82    Address of endpoint488  * 3    bmAttributes            1       0x02    Endpoint attributes - Bulk489  * 4    bNumEndpoints           2       0x0040  maximum packet size490  * 5    bInterval               1       0x00    Interval for polling endpoint491  *492  * OUT Endpoint Descriptor493  *494  * Offset       Field                   Size    Value495  * 0    bLength                 1       0x07    Size of descriptor in bytes496  * 1    bDescriptorType         1       0x05    ENDPOINT descriptor type497  * 2    bEndpointAddress        1       0x02    Address of endpoint498  * 3    bmAttributes            1       0x02    Endpoint attributes - Bulk499  * 4    bNumEndpoints           2       0x0040  maximum packet size500  * 5    bInterval               1       0x00    Interval for polling endpoint501  *502  * DATA FORMAT503  *504  * IN Endpoint505  *506  * The device reserves the first two bytes of data on this endpoint to contain507  * the current values of the modem and line status registers. In the absence of508  * data, the device generates a message consisting of these two status bytes509  * every 40 ms510  *511  * Byte 0: Modem Status512  *513  * Offset       Description514  * B0   Reserved - must be 1515  * B1   Reserved - must be 0516  * B2   Reserved - must be 0517  * B3   Reserved - must be 0518  * 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 Status524  *525  * Offset       Description526  * 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 FIFO534  *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      1542 #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 Endpoint552  *553  * This device reserves the first bytes of data on this endpoint contain the554  * length and port identifier of the message. For the FTDI USB Serial converter555  * the port identifier is always 1.556  *557  * Byte 0: Line Status558  *559  * Offset       Description560  * B0   Reserved - must be 1561  * B1   Reserved - must be 0562  * 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       0xCFF8111 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 0xD012117 #define FTDI_SCS_DEVICE_3_PID 0xD013118 #define FTDI_SCS_DEVICE_4_PID 0xD014119 #define FTDI_SCS_DEVICE_5_PID 0xD015120 #define FTDI_SCS_DEVICE_6_PID 0xD016121 #define FTDI_SCS_DEVICE_7_PID 0xD017122 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     0xD738134 #define FTDI_PROPOX_ISPCABLEIII_PID     0xD739135 136 /* Lenz LI-USB Computer Interface. */137 #define FTDI_LENZ_LIUSB_PID     0xD780138 139 /* Vardaan Enterprises Serial Interface VEUSB422R3 */140 #define FTDI_VARDAAN_PID        0xF070141 142 /*143  * Xsens Technologies BV products (http://www.xsens.com).144  */145 #define XSENS_VID               0x2639146 #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   0xD38A151 #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   0xD38E155 #define XSENS_CONVERTER_7_PID   0xD38F156 157 /**158  * Zolix (www.zolix.com.cb) product ids159  */160 #define FTDI_OMNI1509                   0xD491  /* Omni1509 embedded USB-serial */161 162 /*163  * NDI (www.ndigital.com) product ids164  */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 IDs173  */174 #define FTDI_CHAMSYS_24_MASTER_WING_PID        0xDAF8175 #define FTDI_CHAMSYS_PC_WING_PID       0xDAF9176 #define FTDI_CHAMSYS_USB_DMX_PID       0xDAFA177 #define FTDI_CHAMSYS_MIDI_TIMECODE_PID 0xDAFB178 #define FTDI_CHAMSYS_MINI_WING_PID     0xDAFC179 #define FTDI_CHAMSYS_MAXI_WING_PID     0xDAFD180 #define FTDI_CHAMSYS_MEDIA_WING_PID    0xDAFE181 #define FTDI_CHAMSYS_WING_PID  0xDAFF182 183 /*184  * Westrex International devices submitted by Cory Lee185  */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 cameras197  * 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 cameras203  * 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 on266  * MS Windows, rather than the FTDI Virtual Com Port drivers.267  * Maybe these will be easier to use with the libftdi/libusb user-space268  * 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 GmbH294  */295 #define FTDI_GUDEADS_E808_PID    0xE808296 #define FTDI_GUDEADS_E809_PID    0xE809297 #define FTDI_GUDEADS_E80A_PID    0xE80A298 #define FTDI_GUDEADS_E80B_PID    0xE80B299 #define FTDI_GUDEADS_E80C_PID    0xE80C300 #define FTDI_GUDEADS_E80D_PID    0xE80D301 #define FTDI_GUDEADS_E80E_PID    0xE80E302 #define FTDI_GUDEADS_E80F_PID    0xE80F303 #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    0xE88A306 #define FTDI_GUDEADS_E88B_PID    0xE88B307 #define FTDI_GUDEADS_E88C_PID    0xE88C308 #define FTDI_GUDEADS_E88D_PID    0xE88D309 #define FTDI_GUDEADS_E88E_PID    0xE88E310 #define FTDI_GUDEADS_E88F_PID    0xE88F311 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          0xEBE0320 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                 0xed74335 #define HAMEG_HO730_PID                 0xed73336 #define HAMEG_HO720_PID                 0xed72337 #define HAMEG_HO870_PID                 0xed71338 339 /*340  *  MaxStream devices   www.maxstream.net341  */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 Systems365  * UltraPort USB serial converters366  */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           0xF0C8371 372 /*373  * Two of the Tagsys RFID Readers374  */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 interface382    (http://www.act-solutions.com/HomePro-Product-Matrix.html) */383 #define FTDI_ACTZWAVE_PID       0xF2D0384 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 devices388  * and I‘m not entirely sure which are used by which.389  */390 #define FTDI_4N_GALAXY_DE_1_PID 0xF3C0391 #define FTDI_4N_GALAXY_DE_2_PID 0xF3C1392 #define FTDI_4N_GALAXY_DE_3_PID 0xF3C2393 394 /*395  * Linx Technologies product ids396  */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 ids405  */406 #define FTDI_OCEANIC_PID        0xF460  /* Oceanic dive instrument */407 408 /*409  * SUUNTO product ids410  */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    0xF9D0420 #define FTDI_CCSICDU40_1_PID    0xF9D1421 #define FTDI_CCSMACHX_2_PID     0xF9D2422 #define FTDI_CCSLOAD_N_GO_3_PID 0xF9D3423 #define FTDI_CCSICDU64_4_PID    0xF9D4424 #define FTDI_CCSPRIME8_5_PID    0xF9D5425 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 gadgets440  */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          0xFAD0445 446 /*447  * ThorLabs USB motor drivers448  */449 #define FTDI_THORLABS_PID               0xfaf0 /* ThorLabs USB motor drivers */450 451 /*452  * Protego product ids453  */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 ids461  */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 is484  * for their DAC-2 device http://www.pcdjhardware.com/DAC2.asp485  * (the VID is the standard ftdi vid (FTDI_VID), PID sent by Wouter Paesen)486  */487 #define FTDI_PCDJ_DAC2_PID 0xFA88488 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   0xfb99495 496 /* www.crystalfontz.com devices497  * - thanx for providing free devices for evaluation !498  * they use the ftdi chipset for the USB interface499  * and the vendor id is the same500  */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 device512  * for their 1Mb broadband internet service.  The following PID is exhibited513  * 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 Schleusener523  */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_Page543  */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 STK541560  */561 #define ATMEL_VID               0x03eb /* Vendor ID */562 #define STK541_PID              0x2109 /* Zigbee Controller */563 564 /*565  * Blackfin gnICE JTAG566  * http://docs.blackfin.uclinux.org/doku.php?id=hw:jtag:gnice567  */568 #define ADI_VID                 0x0456569 #define ADI_GNICE_PID           0xF000570 #define ADI_GNICEPLUS_PID       0xF001571 572 /*573  * Microchip Technology, Inc.574  *575  * MICROCHIP_VID (0x04D8) and MICROCHIP_USB_BOARD_PID (0x000A) are576  * used by single function CDC ACM class based firmware demo577  * applications.  The VID/PID has also been used in firmware578  * emulating FTDI serial chips by:579  * Hornby Elite - Digital Command Control Console580  * http://www.hornby.com/hornby-dcc/controllers/581  */582 #define MICROCHIP_VID           0x04D8583 #define MICROCHIP_USB_BOARD_PID 0x000A /* CDC RS-232 Emulation Demo */584 585 /*586  * RATOC REX-USB60F587  */588 #define RATOC_VENDOR_ID         0x0584589 #define RATOC_PRODUCT_ID_USB60F 0xb020590 591 /*592  * Infineon Technologies593  */594 #define INFINEON_VID            0x058b595 #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    0x0100602 603 /*604  * Contec products (http://www.contec.com)605  * Submitted by Daniel Sangorrin606  */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 Holoborodko613  */614 #define MITSUBISHI_VID          0x06D3615 #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       0xAC11625 #define BANDB_USPTL4_PID        0xAC12626 #define BANDB_USO9ML2DR_2_PID   0xAC16627 #define BANDB_USO9ML2DR_PID     0xAC17628 #define BANDB_USOPTL4DR2_PID    0xAC18  /* USOPTL4R-2 2-port Isolated RS-232 Converter */629 #define BANDB_USOPTL4DR_PID     0xAC19630 #define BANDB_485USB9F_2W_PID   0xAC25631 #define BANDB_485USB9F_4W_PID   0xAC26632 #define BANDB_232USB9M_PID      0xAC27633 #define BANDB_485USBTB_2W_PID   0xAC33634 #define BANDB_485USBTB_4W_PID   0xAC34635 #define BANDB_TTL5USB9M_PID     0xAC49636 #define BANDB_TTL3USB9M_PID     0xAC50637 #define BANDB_ZZ_PROG1_USB_PID  0xBA02638 639 /*640  * Intrepid Control Systems (http://www.intrepidcs.com/) ValueCAN and NeoVI641  */642 #define INTREPID_VID            0x093C643 #define INTREPID_VALUECAN_PID   0x0601644 #define INTREPID_NEOVI_PID      0x0701645 646 /*647  * Definitions for ID TECH (www.idt-net.com) devices648  */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. devices654  */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. devices664  */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 and691  * 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 1201748  * http://www.jeti.com/cms/index.php/instruments/other-instruments/specbos-2101749  */750 #define JETI_VID                0x0c6c751 #define JETI_SPC1201_PID        0x04b2752 753 /*754  * FTDI USB UART chips used in construction projects from the755  * Elektor Electronics magazine (http://www.elektor.com/)756  */757 #define ELEKTOR_VID             0x0C7D758 #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 GmbH778  */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             0x0FD8785 #define LB_ALTITRACK_PID                0x0001786 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                     0x104D797 #define NEWPORT_AGILIS_PID              0x3000798 #define NEWPORT_CONEX_CC_PID            0x3002799 #define NEWPORT_CONEX_AGP_PID           0x3006800 801 /* Interbiometrics USB I/O Board */802 /* Developed for Interbiometrics by Rudolf Gugler */803 #define INTERBIOMETRICS_VID              0x1209804 #define INTERBIOMETRICS_IOBOARD_PID      0x1002805 #define INTERBIOMETRICS_MINI_IOBOARD_PID 0x1006806 807 /*808  * Testo products (http://www.testo.com/)809  * Submitted by Colin Leroy810  */811 #define TESTO_VID                       0x128D812 #define TESTO_1_PID                     0x0001813 #define TESTO_3_PID                     0x0003814 815 /*816  * Mobility Electronics products.817  */818 #define MOBILITY_VID                    0x1342819 #define MOBILITY_USB_SERIAL_PID         0x0202  /* EasiDock USB 200 serial */820 821 /*822  * FIC / OpenMoko, Inc. http://wiki.openmoko.org/wiki/Neo1973_Debug_Board_v3823  * Submitted by Harald Welte <laforge@openmoko.org>824  */825 #define FIC_VID                 0x1457826 #define FIC_NEO1973_DEBUG_PID   0x5118827 828 /* Olimex */829 #define OLIMEX_VID                      0x15BA830 #define OLIMEX_ARM_USB_OCD_PID          0x0003831 #define OLIMEX_ARM_USB_OCD_H_PID        0x002b832 833 /*834  * Telldus Technologies835  */836 #define TELLDUS_VID                     0x1781  /* Vendor ID */837 #define TELLDUS_TELLSTICK_PID           0x0C30  /* RF control dongle 433 MHz using FT232RL */838 839 /*840  * NOVITUS printers841  */842 #define NOVITUS_VID                     0x1a28843 #define NOVITUS_BONO_E_PID              0x6010844 845 /*846  * RT Systems programming cables for various ham radios847  */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 Instrumente880  * 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/EN907  */908 #define KONDO_VID               0x165c909 #define KONDO_USB_SERIAL_PID    0x0002910 911 /*912  * Bayer Ascensia Contour blood glucose meter USB-converter cable.913  * http://winglucofacts.com/cables/914  */915 #define BAYER_VID                      0x1A79916 #define BAYER_CONTOUR_CABLE_PID        0x6001917 918 /*919  * The following are the values for the Matrix Orbital FTDI Range920  * Anything in this range will use an FT232RL.921  */922 #define MTXORB_VID                      0x1B3D923 #define MTXORB_FTDI_RANGE_0100_PID      0x0100924 #define MTXORB_FTDI_RANGE_0101_PID      0x0101925 #define MTXORB_FTDI_RANGE_0102_PID      0x0102926 #define MTXORB_FTDI_RANGE_0103_PID      0x0103927 #define MTXORB_FTDI_RANGE_0104_PID      0x0104928 #define MTXORB_FTDI_RANGE_0105_PID      0x0105929 #define MTXORB_FTDI_RANGE_0106_PID      0x0106930 #define MTXORB_FTDI_RANGE_0107_PID      0x0107931 #define MTXORB_FTDI_RANGE_0108_PID      0x0108932 #define MTXORB_FTDI_RANGE_0109_PID      0x0109933 #define MTXORB_FTDI_RANGE_010A_PID      0x010A934 #define MTXORB_FTDI_RANGE_010B_PID      0x010B935 #define MTXORB_FTDI_RANGE_010C_PID      0x010C936 #define MTXORB_FTDI_RANGE_010D_PID      0x010D937 #define MTXORB_FTDI_RANGE_010E_PID      0x010E938 #define MTXORB_FTDI_RANGE_010F_PID      0x010F939 #define MTXORB_FTDI_RANGE_0110_PID      0x0110940 #define MTXORB_FTDI_RANGE_0111_PID      0x0111941 #define MTXORB_FTDI_RANGE_0112_PID      0x0112942 #define MTXORB_FTDI_RANGE_0113_PID      0x0113943 #define MTXORB_FTDI_RANGE_0114_PID      0x0114944 #define MTXORB_FTDI_RANGE_0115_PID      0x0115945 #define MTXORB_FTDI_RANGE_0116_PID      0x0116946 #define MTXORB_FTDI_RANGE_0117_PID      0x0117947 #define MTXORB_FTDI_RANGE_0118_PID      0x0118948 #define MTXORB_FTDI_RANGE_0119_PID      0x0119949 #define MTXORB_FTDI_RANGE_011A_PID      0x011A950 #define MTXORB_FTDI_RANGE_011B_PID      0x011B951 #define MTXORB_FTDI_RANGE_011C_PID      0x011C952 #define MTXORB_FTDI_RANGE_011D_PID      0x011D953 #define MTXORB_FTDI_RANGE_011E_PID      0x011E954 #define MTXORB_FTDI_RANGE_011F_PID      0x011F955 #define MTXORB_FTDI_RANGE_0120_PID      0x0120956 #define MTXORB_FTDI_RANGE_0121_PID      0x0121957 #define MTXORB_FTDI_RANGE_0122_PID      0x0122958 #define MTXORB_FTDI_RANGE_0123_PID      0x0123959 #define MTXORB_FTDI_RANGE_0124_PID      0x0124960 #define MTXORB_FTDI_RANGE_0125_PID      0x0125961 #define MTXORB_FTDI_RANGE_0126_PID      0x0126962 #define MTXORB_FTDI_RANGE_0127_PID      0x0127963 #define MTXORB_FTDI_RANGE_0128_PID      0x0128964 #define MTXORB_FTDI_RANGE_0129_PID      0x0129965 #define MTXORB_FTDI_RANGE_012A_PID      0x012A966 #define MTXORB_FTDI_RANGE_012B_PID      0x012B967 #define MTXORB_FTDI_RANGE_012C_PID      0x012C968 #define MTXORB_FTDI_RANGE_012D_PID      0x012D969 #define MTXORB_FTDI_RANGE_012E_PID      0x012E970 #define MTXORB_FTDI_RANGE_012F_PID      0x012F971 #define MTXORB_FTDI_RANGE_0130_PID      0x0130972 #define MTXORB_FTDI_RANGE_0131_PID      0x0131973 #define MTXORB_FTDI_RANGE_0132_PID      0x0132974 #define MTXORB_FTDI_RANGE_0133_PID      0x0133975 #define MTXORB_FTDI_RANGE_0134_PID      0x0134976 #define MTXORB_FTDI_RANGE_0135_PID      0x0135977 #define MTXORB_FTDI_RANGE_0136_PID      0x0136978 #define MTXORB_FTDI_RANGE_0137_PID      0x0137979 #define MTXORB_FTDI_RANGE_0138_PID      0x0138980 #define MTXORB_FTDI_RANGE_0139_PID      0x0139981 #define MTXORB_FTDI_RANGE_013A_PID      0x013A982 #define MTXORB_FTDI_RANGE_013B_PID      0x013B983 #define MTXORB_FTDI_RANGE_013C_PID      0x013C984 #define MTXORB_FTDI_RANGE_013D_PID      0x013D985 #define MTXORB_FTDI_RANGE_013E_PID      0x013E986 #define MTXORB_FTDI_RANGE_013F_PID      0x013F987 #define MTXORB_FTDI_RANGE_0140_PID      0x0140988 #define MTXORB_FTDI_RANGE_0141_PID      0x0141989 #define MTXORB_FTDI_RANGE_0142_PID      0x0142990 #define MTXORB_FTDI_RANGE_0143_PID      0x0143991 #define MTXORB_FTDI_RANGE_0144_PID      0x0144992 #define MTXORB_FTDI_RANGE_0145_PID      0x0145993 #define MTXORB_FTDI_RANGE_0146_PID      0x0146994 #define MTXORB_FTDI_RANGE_0147_PID      0x0147995 #define MTXORB_FTDI_RANGE_0148_PID      0x0148996 #define MTXORB_FTDI_RANGE_0149_PID      0x0149997 #define MTXORB_FTDI_RANGE_014A_PID      0x014A998 #define MTXORB_FTDI_RANGE_014B_PID      0x014B999 #define MTXORB_FTDI_RANGE_014C_PID      0x014C1000 #define MTXORB_FTDI_RANGE_014D_PID      0x014D1001 #define MTXORB_FTDI_RANGE_014E_PID      0x014E1002 #define MTXORB_FTDI_RANGE_014F_PID      0x014F1003 #define MTXORB_FTDI_RANGE_0150_PID      0x01501004 #define MTXORB_FTDI_RANGE_0151_PID      0x01511005 #define MTXORB_FTDI_RANGE_0152_PID      0x01521006 #define MTXORB_FTDI_RANGE_0153_PID      0x01531007 #define MTXORB_FTDI_RANGE_0154_PID      0x01541008 #define MTXORB_FTDI_RANGE_0155_PID      0x01551009 #define MTXORB_FTDI_RANGE_0156_PID      0x01561010 #define MTXORB_FTDI_RANGE_0157_PID      0x01571011 #define MTXORB_FTDI_RANGE_0158_PID      0x01581012 #define MTXORB_FTDI_RANGE_0159_PID      0x01591013 #define MTXORB_FTDI_RANGE_015A_PID      0x015A1014 #define MTXORB_FTDI_RANGE_015B_PID      0x015B1015 #define MTXORB_FTDI_RANGE_015C_PID      0x015C1016 #define MTXORB_FTDI_RANGE_015D_PID      0x015D1017 #define MTXORB_FTDI_RANGE_015E_PID      0x015E1018 #define MTXORB_FTDI_RANGE_015F_PID      0x015F1019 #define MTXORB_FTDI_RANGE_0160_PID      0x01601020 #define MTXORB_FTDI_RANGE_0161_PID      0x01611021 #define MTXORB_FTDI_RANGE_0162_PID      0x01621022 #define MTXORB_FTDI_RANGE_0163_PID      0x01631023 #define MTXORB_FTDI_RANGE_0164_PID      0x01641024 #define MTXORB_FTDI_RANGE_0165_PID      0x01651025 #define MTXORB_FTDI_RANGE_0166_PID      0x01661026 #define MTXORB_FTDI_RANGE_0167_PID      0x01671027 #define MTXORB_FTDI_RANGE_0168_PID      0x01681028 #define MTXORB_FTDI_RANGE_0169_PID      0x01691029 #define MTXORB_FTDI_RANGE_016A_PID      0x016A1030 #define MTXORB_FTDI_RANGE_016B_PID      0x016B1031 #define MTXORB_FTDI_RANGE_016C_PID      0x016C1032 #define MTXORB_FTDI_RANGE_016D_PID      0x016D1033 #define MTXORB_FTDI_RANGE_016E_PID      0x016E1034 #define MTXORB_FTDI_RANGE_016F_PID      0x016F1035 #define MTXORB_FTDI_RANGE_0170_PID      0x01701036 #define MTXORB_FTDI_RANGE_0171_PID      0x01711037 #define MTXORB_FTDI_RANGE_0172_PID      0x01721038 #define MTXORB_FTDI_RANGE_0173_PID      0x01731039 #define MTXORB_FTDI_RANGE_0174_PID      0x01741040 #define MTXORB_FTDI_RANGE_0175_PID      0x01751041 #define MTXORB_FTDI_RANGE_0176_PID      0x01761042 #define MTXORB_FTDI_RANGE_0177_PID      0x01771043 #define MTXORB_FTDI_RANGE_0178_PID      0x01781044 #define MTXORB_FTDI_RANGE_0179_PID      0x01791045 #define MTXORB_FTDI_RANGE_017A_PID      0x017A1046 #define MTXORB_FTDI_RANGE_017B_PID      0x017B1047 #define MTXORB_FTDI_RANGE_017C_PID      0x017C1048 #define MTXORB_FTDI_RANGE_017D_PID      0x017D1049 #define MTXORB_FTDI_RANGE_017E_PID      0x017E1050 #define MTXORB_FTDI_RANGE_017F_PID      0x017F1051 #define MTXORB_FTDI_RANGE_0180_PID      0x01801052 #define MTXORB_FTDI_RANGE_0181_PID      0x01811053 #define MTXORB_FTDI_RANGE_0182_PID      0x01821054 #define MTXORB_FTDI_RANGE_0183_PID      0x01831055 #define MTXORB_FTDI_RANGE_0184_PID      0x01841056 #define MTXORB_FTDI_RANGE_0185_PID      0x01851057 #define MTXORB_FTDI_RANGE_0186_PID      0x01861058 #define MTXORB_FTDI_RANGE_0187_PID      0x01871059 #define MTXORB_FTDI_RANGE_0188_PID      0x01881060 #define MTXORB_FTDI_RANGE_0189_PID      0x01891061 #define MTXORB_FTDI_RANGE_018A_PID      0x018A1062 #define MTXORB_FTDI_RANGE_018B_PID      0x018B1063 #define MTXORB_FTDI_RANGE_018C_PID      0x018C1064 #define MTXORB_FTDI_RANGE_018D_PID      0x018D1065 #define MTXORB_FTDI_RANGE_018E_PID      0x018E1066 #define MTXORB_FTDI_RANGE_018F_PID      0x018F1067 #define MTXORB_FTDI_RANGE_0190_PID      0x01901068 #define MTXORB_FTDI_RANGE_0191_PID      0x01911069 #define MTXORB_FTDI_RANGE_0192_PID      0x01921070 #define MTXORB_FTDI_RANGE_0193_PID      0x01931071 #define MTXORB_FTDI_RANGE_0194_PID      0x01941072 #define MTXORB_FTDI_RANGE_0195_PID      0x01951073 #define MTXORB_FTDI_RANGE_0196_PID      0x01961074 #define MTXORB_FTDI_RANGE_0197_PID      0x01971075 #define MTXORB_FTDI_RANGE_0198_PID      0x01981076 #define MTXORB_FTDI_RANGE_0199_PID      0x01991077 #define MTXORB_FTDI_RANGE_019A_PID      0x019A1078 #define MTXORB_FTDI_RANGE_019B_PID      0x019B1079 #define MTXORB_FTDI_RANGE_019C_PID      0x019C1080 #define MTXORB_FTDI_RANGE_019D_PID      0x019D1081 #define MTXORB_FTDI_RANGE_019E_PID      0x019E1082 #define MTXORB_FTDI_RANGE_019F_PID      0x019F1083 #define MTXORB_FTDI_RANGE_01A0_PID      0x01A01084 #define MTXORB_FTDI_RANGE_01A1_PID      0x01A11085 #define MTXORB_FTDI_RANGE_01A2_PID      0x01A21086 #define MTXORB_FTDI_RANGE_01A3_PID      0x01A31087 #define MTXORB_FTDI_RANGE_01A4_PID      0x01A41088 #define MTXORB_FTDI_RANGE_01A5_PID      0x01A51089 #define MTXORB_FTDI_RANGE_01A6_PID      0x01A61090 #define MTXORB_FTDI_RANGE_01A7_PID      0x01A71091 #define MTXORB_FTDI_RANGE_01A8_PID      0x01A81092 #define MTXORB_FTDI_RANGE_01A9_PID      0x01A91093 #define MTXORB_FTDI_RANGE_01AA_PID      0x01AA1094 #define MTXORB_FTDI_RANGE_01AB_PID      0x01AB1095 #define MTXORB_FTDI_RANGE_01AC_PID      0x01AC1096 #define MTXORB_FTDI_RANGE_01AD_PID      0x01AD1097 #define MTXORB_FTDI_RANGE_01AE_PID      0x01AE1098 #define MTXORB_FTDI_RANGE_01AF_PID      0x01AF1099 #define MTXORB_FTDI_RANGE_01B0_PID      0x01B01100 #define MTXORB_FTDI_RANGE_01B1_PID      0x01B11101 #define MTXORB_FTDI_RANGE_01B2_PID      0x01B21102 #define MTXORB_FTDI_RANGE_01B3_PID      0x01B31103 #define MTXORB_FTDI_RANGE_01B4_PID      0x01B41104 #define MTXORB_FTDI_RANGE_01B5_PID      0x01B51105 #define MTXORB_FTDI_RANGE_01B6_PID      0x01B61106 #define MTXORB_FTDI_RANGE_01B7_PID      0x01B71107 #define MTXORB_FTDI_RANGE_01B8_PID      0x01B81108 #define MTXORB_FTDI_RANGE_01B9_PID      0x01B91109 #define MTXORB_FTDI_RANGE_01BA_PID      0x01BA1110 #define MTXORB_FTDI_RANGE_01BB_PID      0x01BB1111 #define MTXORB_FTDI_RANGE_01BC_PID      0x01BC1112 #define MTXORB_FTDI_RANGE_01BD_PID      0x01BD1113 #define MTXORB_FTDI_RANGE_01BE_PID      0x01BE1114 #define MTXORB_FTDI_RANGE_01BF_PID      0x01BF1115 #define MTXORB_FTDI_RANGE_01C0_PID      0x01C01116 #define MTXORB_FTDI_RANGE_01C1_PID      0x01C11117 #define MTXORB_FTDI_RANGE_01C2_PID      0x01C21118 #define MTXORB_FTDI_RANGE_01C3_PID      0x01C31119 #define MTXORB_FTDI_RANGE_01C4_PID      0x01C41120 #define MTXORB_FTDI_RANGE_01C5_PID      0x01C51121 #define MTXORB_FTDI_RANGE_01C6_PID      0x01C61122 #define MTXORB_FTDI_RANGE_01C7_PID      0x01C71123 #define MTXORB_FTDI_RANGE_01C8_PID      0x01C81124 #define MTXORB_FTDI_RANGE_01C9_PID      0x01C91125 #define MTXORB_FTDI_RANGE_01CA_PID      0x01CA1126 #define MTXORB_FTDI_RANGE_01CB_PID      0x01CB1127 #define MTXORB_FTDI_RANGE_01CC_PID      0x01CC1128 #define MTXORB_FTDI_RANGE_01CD_PID      0x01CD1129 #define MTXORB_FTDI_RANGE_01CE_PID      0x01CE1130 #define MTXORB_FTDI_RANGE_01CF_PID      0x01CF1131 #define MTXORB_FTDI_RANGE_01D0_PID      0x01D01132 #define MTXORB_FTDI_RANGE_01D1_PID      0x01D11133 #define MTXORB_FTDI_RANGE_01D2_PID      0x01D21134 #define MTXORB_FTDI_RANGE_01D3_PID      0x01D31135 #define MTXORB_FTDI_RANGE_01D4_PID      0x01D41136 #define MTXORB_FTDI_RANGE_01D5_PID      0x01D51137 #define MTXORB_FTDI_RANGE_01D6_PID      0x01D61138 #define MTXORB_FTDI_RANGE_01D7_PID      0x01D71139 #define MTXORB_FTDI_RANGE_01D8_PID      0x01D81140 #define MTXORB_FTDI_RANGE_01D9_PID      0x01D91141 #define MTXORB_FTDI_RANGE_01DA_PID      0x01DA1142 #define MTXORB_FTDI_RANGE_01DB_PID      0x01DB1143 #define MTXORB_FTDI_RANGE_01DC_PID      0x01DC1144 #define MTXORB_FTDI_RANGE_01DD_PID      0x01DD1145 #define MTXORB_FTDI_RANGE_01DE_PID      0x01DE1146 #define MTXORB_FTDI_RANGE_01DF_PID      0x01DF1147 #define MTXORB_FTDI_RANGE_01E0_PID      0x01E01148 #define MTXORB_FTDI_RANGE_01E1_PID      0x01E11149 #define MTXORB_FTDI_RANGE_01E2_PID      0x01E21150 #define MTXORB_FTDI_RANGE_01E3_PID      0x01E31151 #define MTXORB_FTDI_RANGE_01E4_PID      0x01E41152 #define MTXORB_FTDI_RANGE_01E5_PID      0x01E51153 #define MTXORB_FTDI_RANGE_01E6_PID      0x01E61154 #define MTXORB_FTDI_RANGE_01E7_PID      0x01E71155 #define MTXORB_FTDI_RANGE_01E8_PID      0x01E81156 #define MTXORB_FTDI_RANGE_01E9_PID      0x01E91157 #define MTXORB_FTDI_RANGE_01EA_PID      0x01EA1158 #define MTXORB_FTDI_RANGE_01EB_PID      0x01EB1159 #define MTXORB_FTDI_RANGE_01EC_PID      0x01EC1160 #define MTXORB_FTDI_RANGE_01ED_PID      0x01ED1161 #define MTXORB_FTDI_RANGE_01EE_PID      0x01EE1162 #define MTXORB_FTDI_RANGE_01EF_PID      0x01EF1163 #define MTXORB_FTDI_RANGE_01F0_PID      0x01F01164 #define MTXORB_FTDI_RANGE_01F1_PID      0x01F11165 #define MTXORB_FTDI_RANGE_01F2_PID      0x01F21166 #define MTXORB_FTDI_RANGE_01F3_PID      0x01F31167 #define MTXORB_FTDI_RANGE_01F4_PID      0x01F41168 #define MTXORB_FTDI_RANGE_01F5_PID      0x01F51169 #define MTXORB_FTDI_RANGE_01F6_PID      0x01F61170 #define MTXORB_FTDI_RANGE_01F7_PID      0x01F71171 #define MTXORB_FTDI_RANGE_01F8_PID      0x01F81172 #define MTXORB_FTDI_RANGE_01F9_PID      0x01F91173 #define MTXORB_FTDI_RANGE_01FA_PID      0x01FA1174 #define MTXORB_FTDI_RANGE_01FB_PID      0x01FB1175 #define MTXORB_FTDI_RANGE_01FC_PID      0x01FC1176 #define MTXORB_FTDI_RANGE_01FD_PID      0x01FD1177 #define MTXORB_FTDI_RANGE_01FE_PID      0x01FE1178 #define MTXORB_FTDI_RANGE_01FF_PID      0x01FF1179 1180 1181 1182 /*1183  * The Mobility Lab (TML)1184  * Submitted by Pierre Castella1185  */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       0x1BC91191 #define ALTI2_N3_PID    0x6001  /* Neptune 3 */1192 1193 /*1194  * Ionics PlugComputer1195  */1196 #define IONICS_VID                      0x1c0c1197 #define IONICS_PLUGCOMPUTER_PID         0x01021198 1199 /*1200  * Dresden Elektronik Sensor Terminal Board1201  */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  * STMicroelectonics1208  */1209 #define ST_VID                  0x04831210 #define ST_STMCLT_2232_PID      0x37461211 #define ST_STMCLT_4232_PID      0x37471212 1213 /*1214  * Papouch products (http://www.papouch.com/)1215  * Submitted by Folkert van Heusden1216  */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 SheevaPlug1250  */1251 #define MARVELL_VID             0x9e881252 #define MARVELL_SHEEVAPLUG_PID  0x9e8f1253 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        0x93781268 #define MJSG_SR_RADIO_PID       0x93791269 #define MJSG_XM_RADIO_PID       0x937A1270 #define MJSG_HD_RADIO_PID       0x937C1271 1272 /*1273  * D.O.Tec products (http://www.directout.eu)1274  */1275 #define FTDI_DOTEC_PID 0x98681276 1277 /*1278  * Xverve Signalyzer tools (http://www.signalyzer.com/)1279  */1280 #define XVERVE_SIGNALYZER_ST_PID        0xBCA01281 #define XVERVE_SIGNALYZER_SLITE_PID     0xBCA11282 #define XVERVE_SIGNALYZER_SH2_PID       0xBCA21283 #define XVERVE_SIGNALYZER_SH4_PID       0xBCA41284 1285 /*1286  * Segway Robotic Mobility Platform USB interface (using VID 0x0403)1287  * Submitted by John G. Rogers1288  */1289 #define SEGWAY_RMP200_PID       0xe7291290 1291 1292 /*1293  * Accesio USB Data Acquisition products (http://www.accesio.com/)1294  */1295 #define ACCESIO_COM4SM_PID      0xD5781296 1297 /* www.sciencescope.co.uk educational dataloggers */1298 #define FTDI_SCIENCESCOPE_LOGBOOKML_PID         0xFF181299 #define FTDI_SCIENCESCOPE_LS_LOGBOOK_PID        0xFF1C1300 #define FTDI_SCIENCESCOPE_HS_LOGBOOK_PID        0xFF1D1301 1302 /*1303  * Milkymist One JTAG/Serial1304  */1305 #define QIHARDWARE_VID                  0x20B71306 #define MILKYMISTONE_JTAGSERIAL_PID     0x07131307 1308 /*1309  * CTI GmbH RS485 Converter http://www.cti-lean.com/1310  */1311 /* USB-485-Mini*/1312 #define FTDI_CTI_MINI_PID       0xF6081313 /* USB-Nano-485*/1314 #define FTDI_CTI_NANO_PID       0xF60B1315 1316 /*1317  * ZeitControl cardsystems GmbH rfid-readers http://zeitconrol.de1318  */1319 /* TagTracer MIFARE*/1320 #define FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID    0xF7C01321 1322 /*1323  * Rainforest Automation1324  */1325 /* ZigBee controller */1326 #define FTDI_RF_R106            0x8A281327 1328 /*1329  * Product: HCP HIT GPRS modem1330  * Manufacturer: HCP d.o.o.1331  * ATI command output: Cinterion MC55i1332  */1333 #define FTDI_CINTERION_MC55I_PID        0xA9511334 1335 /*1336  * Product: Comet Caller ID decoder1337  * Manufacturer: Crucible Technologies1338  */1339 #define FTDI_CT_COMET_PID       0x8e081340 1341 /*1342  * Product: Z3X Box1343  * Manufacturer: Smart GSM Team1344  */1345 #define FTDI_Z3X_PID            0x00111346 1347 /*1348  * Product: Cressi PC Interface1349  * Manufacturer: Cressi1350  */1351 #define FTDI_CRESSI_PID         0x87d01352 1353 /*1354  * Brainboxes devices1355  */1356 #define BRAINBOXES_VID                  0x05d11357 #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 devices1397  */1398 #define GE_HEALTHCARE_VID               0x19011399 #define GE_HEALTHCARE_NEMO_TRACKER_PID  0x00151400 

 

 

 

 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 48MHz124  *   o 230400 at 12MHz125  *   so .. 8U232AM‘s baudrate setting codes are different126  * - 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 from130  * the earlier FT8U232AM and FT8U232BM.  For now, include all known VID/PID131  * 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 using140  * /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, NULL1028 };1029 1030 1031 #define WDR_TIMEOUT 5000 /* default urb timeout */1032 #define WDR_SHORT_TIMEOUT 1000  /* shorter urb timeout */1033 1034 /*1035  * ***************************************************************************1036  * Utility functions1037  * ***************************************************************************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 generator1104          * This enables baud rates up to 12Mbaud but cannot reach below 12001105          * baud with this bit set1106          */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 = http://www.mamicode.com/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 = http://www.mamicode.com/0;1171         int div_okay = 1;1172         int baud;1173 1174         /*1175          * The logic involved in setting the baudrate can be cleanly split into1176          * 3 steps.1177          * 1. Standard baud rates are set in tty->termios->c_cflag1178          * 2. If these are not enough, you can set any speed using alt_speed as1179          * follows:1180          *    - set tty->termios->c_cflag speed to B384001181          *    - set your real speed in tty->alt_speed; it gets ignored when1182          *      alt_speed==0, (or)1183          *    - call TIOCSSERIAL ioctl with (struct serial_struct) set as1184          *      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_rate1189          * 3. You can also set baud rate by setting custom divisor as follows1190          *    - set tty->termios->c_cflag speed to B384001191          *    - call TIOCSSERIAL ioctl with (struct serial_struct) set as1192          *      follows:1193          *      o flags & ASYNC_SPD_MASK == ASYNC_SPD_CUST1194          *      o custom_divisor set to baud_base / your_new_baudrate1195          * ** Step 3 is done courtesy of code borrowed from serial.c1196          *    I should really spend some time and separate + move this common1197          *    code to serial.c, it is replicated in nearly every serial driver1198          *    you see.1199          */1200 1201         /* 1. Get the baud rate from the tty settings, this observes1202               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 baudrate1208            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 = http://www.mamicode.com/ftdi_sio_b300; break;1226                 case 600: div_value = http://www.mamicode.com/ftdi_sio_b600; break;1227                 case 1200: div_value = http://www.mamicode.com/ftdi_sio_b1200; break;1228                 case 2400: div_value = http://www.mamicode.com/ftdi_sio_b2400; break;1229                 case 4800: div_value = http://www.mamicode.com/ftdi_sio_b4800; break;1230                 case 9600: div_value = http://www.mamicode.com/ftdi_sio_b9600; break;1231                 case 19200: div_value = http://www.mamicode.com/ftdi_sio_b19200; break;1232                 case 38400: div_value = http://www.mamicode.com/ftdi_sio_b38400; break;1233                 case 57600: div_value = http://www.mamicode.com/ftdi_sio_b57600;  break;1234                 case 115200: div_value = http://www.mamicode.com/ftdi_sio_b115200; break;1235                 } /* baud */1236                 if (div_value =http://www.mamicode.com/= 0) {1237                         dev_dbg(dev, "%s - Baudrate (%d) requested is not supported\n",1238                                 __func__,  baud);1239                         div_value =http://www.mamicode.com/ 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 =http://www.mamicode.com/ 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 = http://www.mamicode.com/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 =http://www.mamicode.com/ ftdi_232bm_baud_to_divisor(baud);1270                 } else {1271                         dev_dbg(dev, "%s - Baud rate too high!\n", __func__);1272                         div_value = http://www.mamicode.com/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 =http://www.mamicode.com/ ftdi_2232h_baud_to_divisor(baud);1282                 } else if (baud < 1200) {1283                         div_value =http://www.mamicode.com/ ftdi_232bm_baud_to_divisor(baud);1284                 } else {1285                         dev_dbg(dev, "%s - Baud rate too high!\n", __func__);1286                         div_value = http://www.mamicode.com/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 =http://www.mamicode.com/ get_ftdi_divisor(tty, port);1312         urb_value =http://www.mamicode.com/ (__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 fractional1317                  * 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         else1373                 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                 else1449                         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         else1459                 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                 } else1510                         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 set1524                  * 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 chip1559  * type and the USB host capabilities. The value should be obtained from the1560  * 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 devices1576          * with an endpoint size of 0 - not good. In this case, we1577          * want to override the endpoint descriptor setting and use a1578          * 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 Attribute1597  * ***************************************************************************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         else1608                 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 ASCII1630    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_char1663          * 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 functions1705  * ***************************************************************************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 hardwired1755  * 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 hardwired1765  * 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 set1778  * to 1ms.1779  */1780 static int ndi_latency_timer = 1;1781 1782 /* Setup for the NDI FTDI-based USB devices, which requires hardwired1783  * 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/OpenMoko1810  * Neo1973 Debug Board is reserved for JTAG interface and can be accessed from1811  * 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‘s1840  * ST Micro Connect Lite are reserved for JTAG or other non-UART interfaces and1841  * can be accessed from userspace.1842  * The next two ports are enabled as UARTs by default, where port 2 is1843  * 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 change1883            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         else1912                 clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);1913 }1914 1915 /* The SIO requires the first byte to have:1916  *  B0 11917  *  B1 01918  *  B2..7 length of message excluding byte 01919  *1920  * The new devices do not require this byte1921  */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 differences1973            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 precedence2002                  * 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         else2025                 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 = http://www.mamicode.com/(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 = http://www.mamicode.com/priv->last_set_data_urb_value | FTDI_SIO_SET_BREAK;2075         else2076                 urb_value = http://www.mamicode.com/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 contains2108  * the new setting to be used2109  * WARNING: set_termios calls this with old_termios in kernel space2110  */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 to2127            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 to2142          * support CS5/6 and revert the CSIZE setting instead.2143          *2144          * CS5 however is used to control some smartcard readers which abuse2145          * this limitation to switch modes. Original FTDI chips fall back to2146          * eight data bits.2147          *2148          * TODO: Implement a quirk to only allow this with mentioned2149          *       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 of2152          *       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                 else2161                         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_cflag2170             && old_termios->c_ispeed == termios->c_ispeed2171             && old_termios->c_ospeed == termios->c_ospeed)2172                 goto no_c_cflag_changes;2173 2174         /* NOTE These routines can get interrupted by2175            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 = http://www.mamicode.com/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                 else2194                         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 command2216            - but is or‘ed with this value  */2217         priv->last_set_data_urb_value =http://www.mamicode.com/ 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 code2269                  *2270                  * Check the IXOFF status in the iflag component of the2271                  * termios structure. If IXOFF is not set, the pre-xon/xoff2272                  * 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_sio2278                          * Set the vstart and vstop -- could have been done up2279                          * above where a lot of other dereferencing is done but2280                          * that would be very inefficient as vstart and vstop2281                          * are not always needed.2282                          */2283                         vstart = termios->c_cc[VSTART];2284                         vstop = termios->c_cc[VSTOP];2285                         urb_value = http://www.mamicode.com/(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_HS2292                                                          | 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 iflag2299                          * ! XOFF. CHECKME Assuming XON/XOFF handled by tty2300                          * 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), or2318  * 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) in2333          * 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         else2370                 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