首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。