qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

usbredir: Add support for buffered bulk input (v2)

Buffered bulk mode is intended for bulk *input* endpoints, where the data is
of a streaming nature (not part of a command-response protocol). These
endpoints' input buffer may overflow if data is not read quickly enough.
So in buffered bulk mode the usb-host takes care of the submitting and
re-submitting of bulk transfers.

Buffered bulk mode is necessary for reliable operation with the bulk in
endpoints of usb to serial convertors. Unfortunatelty buffered bulk input
mode will only work with certain devices, therefor this patch also adds a
usb-id table to enable it for devices which need it, while leaving the
bulk ep handling for other devices unmodified.

Note that the bumping of the required usbredir from 0.5.3 to 0.6 does
not mean that we will now need a newer usbredir release then qemu-1.3,
.pc files reporting 0.5.3 have only ever existed in usbredir builds directly
from git, so qemu-1.3 needs the 0.6 release too.

Changes in v2:
-Split of quirk handling into quirks.c

Signed-off-by: Hans de Goede <hdegoede@redhat.com>

authored by

Hans de Goede and committed by
Gerd Hoffmann
b2d1fe67 358d615b

+2718 -21
+1 -1
configure
··· 2851 2851 2852 2852 # check for usbredirparser for usb network redirection support 2853 2853 if test "$usb_redir" != "no" ; then 2854 - if $pkg_config --atleast-version=0.5.3 libusbredirparser-0.5 >/dev/null 2>&1 ; then 2854 + if $pkg_config --atleast-version=0.6 libusbredirparser-0.5 >/dev/null 2>&1 ; then 2855 2855 usb_redir="yes" 2856 2856 usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5 2>/dev/null) 2857 2857 usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5 2>/dev/null)
+11 -1
hw/usb.h
··· 553 553 554 554 int ehci_create_ich9_with_companions(PCIBus *bus, int slot); 555 555 556 - #endif 556 + /* quirks.c */ 557 557 558 + /* In bulk endpoints are streaming data sources (iow behave like isoc eps) */ 559 + #define USB_QUIRK_BUFFER_BULK_IN 0x01 560 + /* Bulk pkts in FTDI format, need special handling when combining packets */ 561 + #define USB_QUIRK_IS_FTDI 0x02 562 + 563 + int usb_get_quirks(uint16_t vendor_id, uint16_t product_id, 564 + uint8_t interface_class, uint8_t interface_subclass, 565 + uint8_t interface_protocol); 566 + 567 + #endif
+1 -1
hw/usb/Makefile.objs
··· 5 5 common-obj-y += libhw.o 6 6 7 7 common-obj-$(CONFIG_SMARTCARD) += dev-smartcard-reader.o 8 - common-obj-$(CONFIG_USB_REDIR) += redirect.o 8 + common-obj-$(CONFIG_USB_REDIR) += redirect.o quirks.o 9 9 10 10 common-obj-y += core.o combined-packet.o bus.o desc.o dev-hub.o 11 11 common-obj-y += host-$(HOST_USB).o dev-bluetooth.o
+1255
hw/usb/quirks-ftdi-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 + /* 46 + * Texas Instruments XDS100v2 JTAG / BeagleBone A3 47 + * http://processors.wiki.ti.com/index.php/XDS100 48 + * http://beagleboard.org/bone 49 + */ 50 + #define TI_XDS100V2_PID 0xa6d0 51 + 52 + #define FTDI_NXTCAM_PID 0xABB8 /* NXTCam for Mindstorms NXT */ 53 + 54 + /* US Interface Navigator (http://www.usinterface.com/) */ 55 + #define FTDI_USINT_CAT_PID 0xb810 /* Navigator CAT and 2nd PTT lines */ 56 + #define FTDI_USINT_WKEY_PID 0xb811 /* Navigator WKEY and FSK lines */ 57 + #define FTDI_USINT_RS232_PID 0xb812 /* Navigator RS232 and CONFIG lines */ 58 + 59 + /* OOCDlink by Joern Kaipf <joernk@web.de> 60 + * (http://www.joernonline.de/) */ 61 + #define FTDI_OOCDLINK_PID 0xbaf8 /* Amontec JTAGkey */ 62 + 63 + /* Luminary Micro Stellaris Boards, VID = FTDI_VID */ 64 + /* FTDI 2332C Dual channel device, side A=245 FIFO (JTAG), Side B=RS232 UART */ 65 + #define LMI_LM3S_DEVEL_BOARD_PID 0xbcd8 66 + #define LMI_LM3S_EVAL_BOARD_PID 0xbcd9 67 + #define LMI_LM3S_ICDI_BOARD_PID 0xbcda 68 + 69 + #define FTDI_TURTELIZER_PID 0xBDC8 /* JTAG/RS-232 adapter by egnite GmbH */ 70 + 71 + /* OpenDCC (www.opendcc.de) product id */ 72 + #define FTDI_OPENDCC_PID 0xBFD8 73 + #define FTDI_OPENDCC_SNIFFER_PID 0xBFD9 74 + #define FTDI_OPENDCC_THROTTLE_PID 0xBFDA 75 + #define FTDI_OPENDCC_GATEWAY_PID 0xBFDB 76 + #define FTDI_OPENDCC_GBM_PID 0xBFDC 77 + 78 + /* NZR SEM 16+ USB (http://www.nzr.de) */ 79 + #define FTDI_NZR_SEM_USB_PID 0xC1E0 /* NZR SEM-LOG16+ */ 80 + 81 + /* 82 + * RR-CirKits LocoBuffer USB (http://www.rr-cirkits.com) 83 + */ 84 + #define FTDI_RRCIRKITS_LOCOBUFFER_PID 0xc7d0 /* LocoBuffer USB */ 85 + 86 + /* DMX4ALL DMX Interfaces */ 87 + #define FTDI_DMX4ALL 0xC850 88 + 89 + /* 90 + * ASK.fr devices 91 + */ 92 + #define FTDI_ASK_RDR400_PID 0xC991 /* ASK RDR 400 series card reader */ 93 + 94 + /* www.starting-point-systems.com µChameleon device */ 95 + #define FTDI_MICRO_CHAMELEON_PID 0xCAA0 /* Product Id */ 96 + 97 + /* 98 + * Tactrix OpenPort (ECU) devices. 99 + * OpenPort 1.3M submitted by Donour Sizemore. 100 + * OpenPort 1.3S and 1.3U submitted by Ian Abbott. 101 + */ 102 + #define FTDI_TACTRIX_OPENPORT_13M_PID 0xCC48 /* OpenPort 1.3 Mitsubishi */ 103 + #define FTDI_TACTRIX_OPENPORT_13S_PID 0xCC49 /* OpenPort 1.3 Subaru */ 104 + #define FTDI_TACTRIX_OPENPORT_13U_PID 0xCC4A /* OpenPort 1.3 Universal */ 105 + 106 + #define FTDI_DISTORTEC_JTAG_LOCK_PICK_PID 0xCFF8 107 + 108 + /* SCS HF Radio Modems PID's (http://www.scs-ptc.com) */ 109 + /* the VID is the standard ftdi vid (FTDI_VID) */ 110 + #define FTDI_SCS_DEVICE_0_PID 0xD010 /* SCS PTC-IIusb */ 111 + #define FTDI_SCS_DEVICE_1_PID 0xD011 /* SCS Tracker / DSP TNC */ 112 + #define FTDI_SCS_DEVICE_2_PID 0xD012 113 + #define FTDI_SCS_DEVICE_3_PID 0xD013 114 + #define FTDI_SCS_DEVICE_4_PID 0xD014 115 + #define FTDI_SCS_DEVICE_5_PID 0xD015 116 + #define FTDI_SCS_DEVICE_6_PID 0xD016 117 + #define FTDI_SCS_DEVICE_7_PID 0xD017 118 + 119 + /* iPlus device */ 120 + #define FTDI_IPLUS_PID 0xD070 /* Product Id */ 121 + #define FTDI_IPLUS2_PID 0xD071 /* Product Id */ 122 + 123 + /* 124 + * Gamma Scout (http://gamma-scout.com/). Submitted by rsc@runtux.com. 125 + */ 126 + #define FTDI_GAMMA_SCOUT_PID 0xD678 /* Gamma Scout online */ 127 + 128 + /* Propox devices */ 129 + #define FTDI_PROPOX_JTAGCABLEII_PID 0xD738 130 + #define FTDI_PROPOX_ISPCABLEIII_PID 0xD739 131 + 132 + /* Lenz LI-USB Computer Interface. */ 133 + #define FTDI_LENZ_LIUSB_PID 0xD780 134 + 135 + /* Vardaan Enterprises Serial Interface VEUSB422R3 */ 136 + #define FTDI_VARDAAN_PID 0xF070 137 + 138 + /* 139 + * Xsens Technologies BV products (http://www.xsens.com). 140 + */ 141 + #define XSENS_CONVERTER_0_PID 0xD388 142 + #define XSENS_CONVERTER_1_PID 0xD389 143 + #define XSENS_CONVERTER_2_PID 0xD38A 144 + #define XSENS_CONVERTER_3_PID 0xD38B 145 + #define XSENS_CONVERTER_4_PID 0xD38C 146 + #define XSENS_CONVERTER_5_PID 0xD38D 147 + #define XSENS_CONVERTER_6_PID 0xD38E 148 + #define XSENS_CONVERTER_7_PID 0xD38F 149 + 150 + /* 151 + * NDI (www.ndigital.com) product ids 152 + */ 153 + #define FTDI_NDI_HUC_PID 0xDA70 /* NDI Host USB Converter */ 154 + #define FTDI_NDI_SPECTRA_SCU_PID 0xDA71 /* NDI Spectra SCU */ 155 + #define FTDI_NDI_FUTURE_2_PID 0xDA72 /* NDI future device #2 */ 156 + #define FTDI_NDI_FUTURE_3_PID 0xDA73 /* NDI future device #3 */ 157 + #define FTDI_NDI_AURORA_SCU_PID 0xDA74 /* NDI Aurora SCU */ 158 + 159 + /* 160 + * ChamSys Limited (www.chamsys.co.uk) USB wing/interface product IDs 161 + */ 162 + #define FTDI_CHAMSYS_24_MASTER_WING_PID 0xDAF8 163 + #define FTDI_CHAMSYS_PC_WING_PID 0xDAF9 164 + #define FTDI_CHAMSYS_USB_DMX_PID 0xDAFA 165 + #define FTDI_CHAMSYS_MIDI_TIMECODE_PID 0xDAFB 166 + #define FTDI_CHAMSYS_MINI_WING_PID 0xDAFC 167 + #define FTDI_CHAMSYS_MAXI_WING_PID 0xDAFD 168 + #define FTDI_CHAMSYS_MEDIA_WING_PID 0xDAFE 169 + #define FTDI_CHAMSYS_WING_PID 0xDAFF 170 + 171 + /* 172 + * Westrex International devices submitted by Cory Lee 173 + */ 174 + #define FTDI_WESTREX_MODEL_777_PID 0xDC00 /* Model 777 */ 175 + #define FTDI_WESTREX_MODEL_8900F_PID 0xDC01 /* Model 8900F */ 176 + 177 + /* 178 + * ACG Identification Technologies GmbH products (http://www.acg.de/). 179 + * Submitted by anton -at- goto10 -dot- org. 180 + */ 181 + #define FTDI_ACG_HFDUAL_PID 0xDD20 /* HF Dual ISO Reader (RFID) */ 182 + 183 + /* 184 + * Definitions for Artemis astronomical USB based cameras 185 + * Check it at http://www.artemisccd.co.uk/ 186 + */ 187 + #define FTDI_ARTEMIS_PID 0xDF28 /* All Artemis Cameras */ 188 + 189 + /* 190 + * Definitions for ATIK Instruments astronomical USB based cameras 191 + * Check it at http://www.atik-instruments.com/ 192 + */ 193 + #define FTDI_ATIK_ATK16_PID 0xDF30 /* ATIK ATK-16 Grayscale Camera */ 194 + #define FTDI_ATIK_ATK16C_PID 0xDF32 /* ATIK ATK-16C Colour Camera */ 195 + #define FTDI_ATIK_ATK16HR_PID 0xDF31 /* ATIK ATK-16HR Grayscale Camera */ 196 + #define FTDI_ATIK_ATK16HRC_PID 0xDF33 /* ATIK ATK-16HRC Colour Camera */ 197 + #define FTDI_ATIK_ATK16IC_PID 0xDF35 /* ATIK ATK-16IC Grayscale Camera */ 198 + 199 + /* 200 + * Yost Engineering, Inc. products (www.yostengineering.com). 201 + * PID 0xE050 submitted by Aaron Prose. 202 + */ 203 + #define FTDI_YEI_SERVOCENTER31_PID 0xE050 /* YEI ServoCenter3.1 USB */ 204 + 205 + /* 206 + * ELV USB devices submitted by Christian Abt of ELV (www.elv.de). 207 + * All of these devices use FTDI's vendor ID (0x0403). 208 + * Further IDs taken from ELV Windows .inf file. 209 + * 210 + * The previously included PID for the UO 100 module was incorrect. 211 + * In fact, that PID was for ELV's UR 100 USB-RS232 converter (0xFB58). 212 + * 213 + * Armin Laeuger originally sent the PID for the UM 100 module. 214 + */ 215 + #define FTDI_ELV_USR_PID 0xE000 /* ELV Universal-Sound-Recorder */ 216 + #define FTDI_ELV_MSM1_PID 0xE001 /* ELV Mini-Sound-Modul */ 217 + #define FTDI_ELV_KL100_PID 0xE002 /* ELV Kfz-Leistungsmesser KL 100 */ 218 + #define FTDI_ELV_WS550_PID 0xE004 /* WS 550 */ 219 + #define FTDI_ELV_EC3000_PID 0xE006 /* ENERGY CONTROL 3000 USB */ 220 + #define FTDI_ELV_WS888_PID 0xE008 /* WS 888 */ 221 + #define FTDI_ELV_TWS550_PID 0xE009 /* Technoline WS 550 */ 222 + #define FTDI_ELV_FEM_PID 0xE00A /* Funk Energie Monitor */ 223 + #define FTDI_ELV_FHZ1300PC_PID 0xE0E8 /* FHZ 1300 PC */ 224 + #define FTDI_ELV_WS500_PID 0xE0E9 /* PC-Wetterstation (WS 500) */ 225 + #define FTDI_ELV_HS485_PID 0xE0EA /* USB to RS-485 adapter */ 226 + #define FTDI_ELV_UMS100_PID 0xE0EB /* ELV USB Master-Slave Schaltsteckdose UMS 100 */ 227 + #define FTDI_ELV_TFD128_PID 0xE0EC /* ELV Temperatur-Feuchte-Datenlogger TFD 128 */ 228 + #define FTDI_ELV_FM3RX_PID 0xE0ED /* ELV Messwertuebertragung FM3 RX */ 229 + #define FTDI_ELV_WS777_PID 0xE0EE /* Conrad WS 777 */ 230 + #define FTDI_ELV_EM1010PC_PID 0xE0EF /* Energy monitor EM 1010 PC */ 231 + #define FTDI_ELV_CSI8_PID 0xE0F0 /* Computer-Schalt-Interface (CSI 8) */ 232 + #define FTDI_ELV_EM1000DL_PID 0xE0F1 /* PC-Datenlogger fuer Energiemonitor (EM 1000 DL) */ 233 + #define FTDI_ELV_PCK100_PID 0xE0F2 /* PC-Kabeltester (PCK 100) */ 234 + #define FTDI_ELV_RFP500_PID 0xE0F3 /* HF-Leistungsmesser (RFP 500) */ 235 + #define FTDI_ELV_FS20SIG_PID 0xE0F4 /* Signalgeber (FS 20 SIG) */ 236 + #define FTDI_ELV_UTP8_PID 0xE0F5 /* ELV UTP 8 */ 237 + #define FTDI_ELV_WS300PC_PID 0xE0F6 /* PC-Wetterstation (WS 300 PC) */ 238 + #define FTDI_ELV_WS444PC_PID 0xE0F7 /* Conrad WS 444 PC */ 239 + #define FTDI_PHI_FISCO_PID 0xE40B /* PHI Fisco USB to Serial cable */ 240 + #define FTDI_ELV_UAD8_PID 0xF068 /* USB-AD-Wandler (UAD 8) */ 241 + #define FTDI_ELV_UDA7_PID 0xF069 /* USB-DA-Wandler (UDA 7) */ 242 + #define FTDI_ELV_USI2_PID 0xF06A /* USB-Schrittmotoren-Interface (USI 2) */ 243 + #define FTDI_ELV_T1100_PID 0xF06B /* Thermometer (T 1100) */ 244 + #define FTDI_ELV_PCD200_PID 0xF06C /* PC-Datenlogger (PCD 200) */ 245 + #define FTDI_ELV_ULA200_PID 0xF06D /* USB-LCD-Ansteuerung (ULA 200) */ 246 + #define FTDI_ELV_ALC8500_PID 0xF06E /* ALC 8500 Expert */ 247 + #define FTDI_ELV_FHZ1000PC_PID 0xF06F /* FHZ 1000 PC */ 248 + #define FTDI_ELV_UR100_PID 0xFB58 /* USB-RS232-Umsetzer (UR 100) */ 249 + #define FTDI_ELV_UM100_PID 0xFB5A /* USB-Modul UM 100 */ 250 + #define FTDI_ELV_UO100_PID 0xFB5B /* USB-Modul UO 100 */ 251 + /* Additional ELV PIDs that default to using the FTDI D2XX drivers on 252 + * MS Windows, rather than the FTDI Virtual Com Port drivers. 253 + * Maybe these will be easier to use with the libftdi/libusb user-space 254 + * drivers, or possibly the Comedi drivers in some cases. */ 255 + #define FTDI_ELV_CLI7000_PID 0xFB59 /* Computer-Light-Interface (CLI 7000) */ 256 + #define FTDI_ELV_PPS7330_PID 0xFB5C /* Processor-Power-Supply (PPS 7330) */ 257 + #define FTDI_ELV_TFM100_PID 0xFB5D /* Temperatur-Feuchte-Messgeraet (TFM 100) */ 258 + #define FTDI_ELV_UDF77_PID 0xFB5E /* USB DCF Funkuhr (UDF 77) */ 259 + #define FTDI_ELV_UIO88_PID 0xFB5F /* USB-I/O Interface (UIO 88) */ 260 + 261 + /* 262 + * EVER Eco Pro UPS (http://www.ever.com.pl/) 263 + */ 264 + 265 + #define EVER_ECO_PRO_CDS 0xe520 /* RS-232 converter */ 266 + 267 + /* 268 + * Active Robots product ids. 269 + */ 270 + #define FTDI_ACTIVE_ROBOTS_PID 0xE548 /* USB comms board */ 271 + 272 + /* Pyramid Computer GmbH */ 273 + #define FTDI_PYRAMID_PID 0xE6C8 /* Pyramid Appliance Display */ 274 + 275 + /* www.elsterelectricity.com Elster Unicom III Optical Probe */ 276 + #define FTDI_ELSTER_UNICOM_PID 0xE700 /* Product Id */ 277 + 278 + /* 279 + * Gude Analog- und Digitalsysteme GmbH 280 + */ 281 + #define FTDI_GUDEADS_E808_PID 0xE808 282 + #define FTDI_GUDEADS_E809_PID 0xE809 283 + #define FTDI_GUDEADS_E80A_PID 0xE80A 284 + #define FTDI_GUDEADS_E80B_PID 0xE80B 285 + #define FTDI_GUDEADS_E80C_PID 0xE80C 286 + #define FTDI_GUDEADS_E80D_PID 0xE80D 287 + #define FTDI_GUDEADS_E80E_PID 0xE80E 288 + #define FTDI_GUDEADS_E80F_PID 0xE80F 289 + #define FTDI_GUDEADS_E888_PID 0xE888 /* Expert ISDN Control USB */ 290 + #define FTDI_GUDEADS_E889_PID 0xE889 /* USB RS-232 OptoBridge */ 291 + #define FTDI_GUDEADS_E88A_PID 0xE88A 292 + #define FTDI_GUDEADS_E88B_PID 0xE88B 293 + #define FTDI_GUDEADS_E88C_PID 0xE88C 294 + #define FTDI_GUDEADS_E88D_PID 0xE88D 295 + #define FTDI_GUDEADS_E88E_PID 0xE88E 296 + #define FTDI_GUDEADS_E88F_PID 0xE88F 297 + 298 + /* 299 + * Eclo (http://www.eclo.pt/) product IDs. 300 + * PID 0xEA90 submitted by Martin Grill. 301 + */ 302 + #define FTDI_ECLO_COM_1WIRE_PID 0xEA90 /* COM to 1-Wire USB adaptor */ 303 + 304 + /* TNC-X USB-to-packet-radio adapter, versions prior to 3.0 (DLP module) */ 305 + #define FTDI_TNC_X_PID 0xEBE0 306 + 307 + /* 308 + * Teratronik product ids. 309 + * Submitted by O. Wölfelschneider. 310 + */ 311 + #define FTDI_TERATRONIK_VCP_PID 0xEC88 /* Teratronik device (preferring VCP driver on windows) */ 312 + #define FTDI_TERATRONIK_D2XX_PID 0xEC89 /* Teratronik device (preferring D2XX driver on windows) */ 313 + 314 + /* Rig Expert Ukraine devices */ 315 + #define FTDI_REU_TINY_PID 0xED22 /* RigExpert Tiny */ 316 + 317 + /* 318 + * Hameg HO820 and HO870 interface (using VID 0x0403) 319 + */ 320 + #define HAMEG_HO820_PID 0xed74 321 + #define HAMEG_HO730_PID 0xed73 322 + #define HAMEG_HO720_PID 0xed72 323 + #define HAMEG_HO870_PID 0xed71 324 + 325 + /* 326 + * MaxStream devices www.maxstream.net 327 + */ 328 + #define FTDI_MAXSTREAM_PID 0xEE18 /* Xbee PKG-U Module */ 329 + 330 + /* 331 + * microHAM product IDs (http://www.microham.com). 332 + * Submitted by Justin Burket (KL1RL) <zorton@jtan.com> 333 + * and Mike Studer (K6EEP) <k6eep@hamsoftware.org>. 334 + * Ian Abbott <abbotti@mev.co.uk> added a few more from the driver INF file. 335 + */ 336 + #define FTDI_MHAM_KW_PID 0xEEE8 /* USB-KW interface */ 337 + #define FTDI_MHAM_YS_PID 0xEEE9 /* USB-YS interface */ 338 + #define FTDI_MHAM_Y6_PID 0xEEEA /* USB-Y6 interface */ 339 + #define FTDI_MHAM_Y8_PID 0xEEEB /* USB-Y8 interface */ 340 + #define FTDI_MHAM_IC_PID 0xEEEC /* USB-IC interface */ 341 + #define FTDI_MHAM_DB9_PID 0xEEED /* USB-DB9 interface */ 342 + #define FTDI_MHAM_RS232_PID 0xEEEE /* USB-RS232 interface */ 343 + #define FTDI_MHAM_Y9_PID 0xEEEF /* USB-Y9 interface */ 344 + 345 + /* Domintell products http://www.domintell.com */ 346 + #define FTDI_DOMINTELL_DGQG_PID 0xEF50 /* Master */ 347 + #define FTDI_DOMINTELL_DUSB_PID 0xEF51 /* DUSB01 module */ 348 + 349 + /* 350 + * The following are the values for the Perle Systems 351 + * UltraPort USB serial converters 352 + */ 353 + #define FTDI_PERLE_ULTRAPORT_PID 0xF0C0 /* Perle UltraPort Product Id */ 354 + 355 + /* Sprog II (Andrew Crosland's SprogII DCC interface) */ 356 + #define FTDI_SPROG_II 0xF0C8 357 + 358 + /* an infrared receiver for user access control with IR tags */ 359 + #define FTDI_PIEGROUP_PID 0xF208 /* Product Id */ 360 + 361 + /* ACT Solutions HomePro ZWave interface 362 + (http://www.act-solutions.com/HomePro-Product-Matrix.html) */ 363 + #define FTDI_ACTZWAVE_PID 0xF2D0 364 + 365 + /* 366 + * 4N-GALAXY.DE PIDs for CAN-USB, USB-RS232, USB-RS422, USB-RS485, 367 + * USB-TTY aktiv, USB-TTY passiv. Some PIDs are used by several devices 368 + * and I'm not entirely sure which are used by which. 369 + */ 370 + #define FTDI_4N_GALAXY_DE_1_PID 0xF3C0 371 + #define FTDI_4N_GALAXY_DE_2_PID 0xF3C1 372 + #define FTDI_4N_GALAXY_DE_3_PID 0xF3C2 373 + 374 + /* 375 + * Linx Technologies product ids 376 + */ 377 + #define LINX_SDMUSBQSS_PID 0xF448 /* Linx SDM-USB-QS-S */ 378 + #define LINX_MASTERDEVEL2_PID 0xF449 /* Linx Master Development 2.0 */ 379 + #define LINX_FUTURE_0_PID 0xF44A /* Linx future device */ 380 + #define LINX_FUTURE_1_PID 0xF44B /* Linx future device */ 381 + #define LINX_FUTURE_2_PID 0xF44C /* Linx future device */ 382 + 383 + /* 384 + * Oceanic product ids 385 + */ 386 + #define FTDI_OCEANIC_PID 0xF460 /* Oceanic dive instrument */ 387 + 388 + /* 389 + * SUUNTO product ids 390 + */ 391 + #define FTDI_SUUNTO_SPORTS_PID 0xF680 /* Suunto Sports instrument */ 392 + 393 + /* USB-UIRT - An infrared receiver and transmitter using the 8U232AM chip */ 394 + /* http://www.usbuirt.com/ */ 395 + #define FTDI_USB_UIRT_PID 0xF850 /* Product Id */ 396 + 397 + /* CCS Inc. ICDU/ICDU40 product ID - 398 + * the FT232BM is used in an in-circuit-debugger unit for PIC16's/PIC18's */ 399 + #define FTDI_CCSICDU20_0_PID 0xF9D0 400 + #define FTDI_CCSICDU40_1_PID 0xF9D1 401 + #define FTDI_CCSMACHX_2_PID 0xF9D2 402 + #define FTDI_CCSLOAD_N_GO_3_PID 0xF9D3 403 + #define FTDI_CCSICDU64_4_PID 0xF9D4 404 + #define FTDI_CCSPRIME8_5_PID 0xF9D5 405 + 406 + /* 407 + * The following are the values for the Matrix Orbital LCD displays, 408 + * which are the FT232BM ( similar to the 8U232AM ) 409 + */ 410 + #define FTDI_MTXORB_0_PID 0xFA00 /* Matrix Orbital Product Id */ 411 + #define FTDI_MTXORB_1_PID 0xFA01 /* Matrix Orbital Product Id */ 412 + #define FTDI_MTXORB_2_PID 0xFA02 /* Matrix Orbital Product Id */ 413 + #define FTDI_MTXORB_3_PID 0xFA03 /* Matrix Orbital Product Id */ 414 + #define FTDI_MTXORB_4_PID 0xFA04 /* Matrix Orbital Product Id */ 415 + #define FTDI_MTXORB_5_PID 0xFA05 /* Matrix Orbital Product Id */ 416 + #define FTDI_MTXORB_6_PID 0xFA06 /* Matrix Orbital Product Id */ 417 + 418 + /* 419 + * Home Electronics (www.home-electro.com) USB gadgets 420 + */ 421 + #define FTDI_HE_TIRA1_PID 0xFA78 /* Tira-1 IR transceiver */ 422 + 423 + /* Inside Accesso contactless reader (http://www.insidecontactless.com/) */ 424 + #define INSIDE_ACCESSO 0xFAD0 425 + 426 + /* 427 + * ThorLabs USB motor drivers 428 + */ 429 + #define FTDI_THORLABS_PID 0xfaf0 /* ThorLabs USB motor drivers */ 430 + 431 + /* 432 + * Protego product ids 433 + */ 434 + #define PROTEGO_SPECIAL_1 0xFC70 /* special/unknown device */ 435 + #define PROTEGO_R2X0 0xFC71 /* R200-USB TRNG unit (R210, R220, and R230) */ 436 + #define PROTEGO_SPECIAL_3 0xFC72 /* special/unknown device */ 437 + #define PROTEGO_SPECIAL_4 0xFC73 /* special/unknown device */ 438 + 439 + /* 440 + * Sony Ericsson product ids 441 + */ 442 + #define FTDI_DSS20_PID 0xFC82 /* DSS-20 Sync Station for Sony Ericsson P800 */ 443 + #define FTDI_URBAN_0_PID 0xFC8A /* Sony Ericsson Urban, uart #0 */ 444 + #define FTDI_URBAN_1_PID 0xFC8B /* Sony Ericsson Urban, uart #1 */ 445 + 446 + /* www.irtrans.de device */ 447 + #define FTDI_IRTRANS_PID 0xFC60 /* Product Id */ 448 + 449 + /* 450 + * RM Michaelides CANview USB (http://www.rmcan.com) (FTDI_VID) 451 + * CAN fieldbus interface adapter, added by port GmbH www.port.de) 452 + * Ian Abbott changed the macro names for consistency. 453 + */ 454 + #define FTDI_RM_CANVIEW_PID 0xfd60 /* Product Id */ 455 + /* www.thoughttechnology.com/ TT-USB provide with procomp use ftdi_sio */ 456 + #define FTDI_TTUSB_PID 0xFF20 /* Product Id */ 457 + 458 + #define FTDI_USBX_707_PID 0xF857 /* ADSTech IR Blaster USBX-707 (FTDI_VID) */ 459 + 460 + #define FTDI_RELAIS_PID 0xFA10 /* Relais device from Rudolf Gugler */ 461 + 462 + /* 463 + * PCDJ use ftdi based dj-controllers. The following PID is 464 + * for their DAC-2 device http://www.pcdjhardware.com/DAC2.asp 465 + * (the VID is the standard ftdi vid (FTDI_VID), PID sent by Wouter Paesen) 466 + */ 467 + #define FTDI_PCDJ_DAC2_PID 0xFA88 468 + 469 + #define FTDI_R2000KU_TRUE_RNG 0xFB80 /* R2000KU TRUE RNG (FTDI_VID) */ 470 + 471 + /* 472 + * DIEBOLD BCS SE923 (FTDI_VID) 473 + */ 474 + #define DIEBOLD_BCS_SE923_PID 0xfb99 475 + 476 + /* www.crystalfontz.com devices 477 + * - thanx for providing free devices for evaluation ! 478 + * they use the ftdi chipset for the USB interface 479 + * and the vendor id is the same 480 + */ 481 + #define FTDI_XF_632_PID 0xFC08 /* 632: 16x2 Character Display */ 482 + #define FTDI_XF_634_PID 0xFC09 /* 634: 20x4 Character Display */ 483 + #define FTDI_XF_547_PID 0xFC0A /* 547: Two line Display */ 484 + #define FTDI_XF_633_PID 0xFC0B /* 633: 16x2 Character Display with Keys */ 485 + #define FTDI_XF_631_PID 0xFC0C /* 631: 20x2 Character Display */ 486 + #define FTDI_XF_635_PID 0xFC0D /* 635: 20x4 Character Display */ 487 + #define FTDI_XF_640_PID 0xFC0E /* 640: Two line Display */ 488 + #define FTDI_XF_642_PID 0xFC0F /* 642: Two line Display */ 489 + 490 + /* 491 + * Video Networks Limited / Homechoice in the UK use an ftdi-based device 492 + * for their 1Mb broadband internet service. The following PID is exhibited 493 + * by the usb device supplied (the VID is the standard ftdi vid (FTDI_VID) 494 + */ 495 + #define FTDI_VNHCPCUSB_D_PID 0xfe38 /* Product Id */ 496 + 497 + /* AlphaMicro Components AMC-232USB01 device (FTDI_VID) */ 498 + #define FTDI_AMC232_PID 0xFF00 /* Product Id */ 499 + 500 + /* 501 + * IBS elektronik product ids (FTDI_VID) 502 + * Submitted by Thomas Schleusener 503 + */ 504 + #define FTDI_IBS_US485_PID 0xff38 /* IBS US485 (USB<-->RS422/485 interface) */ 505 + #define FTDI_IBS_PICPRO_PID 0xff39 /* IBS PIC-Programmer */ 506 + #define FTDI_IBS_PCMCIA_PID 0xff3a /* IBS Card reader for PCMCIA SRAM-cards */ 507 + #define FTDI_IBS_PK1_PID 0xff3b /* IBS PK1 - Particel counter */ 508 + #define FTDI_IBS_RS232MON_PID 0xff3c /* IBS RS232 - Monitor */ 509 + #define FTDI_IBS_APP70_PID 0xff3d /* APP 70 (dust monitoring system) */ 510 + #define FTDI_IBS_PEDO_PID 0xff3e /* IBS PEDO-Modem (RF modem 868.35 MHz) */ 511 + #define FTDI_IBS_PROD_PID 0xff3f /* future device */ 512 + /* www.canusb.com Lawicel CANUSB device (FTDI_VID) */ 513 + #define FTDI_CANUSB_PID 0xFFA8 /* Product Id */ 514 + 515 + /* 516 + * TavIR AVR product ids (FTDI_VID) 517 + */ 518 + #define FTDI_TAVIR_STK500_PID 0xFA33 /* STK500 AVR programmer */ 519 + 520 + /* 521 + * TIAO product ids (FTDI_VID) 522 + * http://www.tiaowiki.com/w/Main_Page 523 + */ 524 + #define FTDI_TIAO_UMPA_PID 0x8a98 /* TIAO/DIYGADGET USB Multi-Protocol Adapter */ 525 + 526 + 527 + /********************************/ 528 + /** third-party VID/PID combos **/ 529 + /********************************/ 530 + 531 + 532 + 533 + /* 534 + * Atmel STK541 535 + */ 536 + #define ATMEL_VID 0x03eb /* Vendor ID */ 537 + #define STK541_PID 0x2109 /* Zigbee Controller */ 538 + 539 + /* 540 + * Blackfin gnICE JTAG 541 + * http://docs.blackfin.uclinux.org/doku.php?id=hw:jtag:gnice 542 + */ 543 + #define ADI_VID 0x0456 544 + #define ADI_GNICE_PID 0xF000 545 + #define ADI_GNICEPLUS_PID 0xF001 546 + 547 + /* 548 + * Microchip Technology, Inc. 549 + * 550 + * MICROCHIP_VID (0x04D8) and MICROCHIP_USB_BOARD_PID (0x000A) are 551 + * used by single function CDC ACM class based firmware demo 552 + * applications. The VID/PID has also been used in firmware 553 + * emulating FTDI serial chips by: 554 + * Hornby Elite - Digital Command Control Console 555 + * http://www.hornby.com/hornby-dcc/controllers/ 556 + */ 557 + #define MICROCHIP_VID 0x04D8 558 + #define MICROCHIP_USB_BOARD_PID 0x000A /* CDC RS-232 Emulation Demo */ 559 + 560 + /* 561 + * RATOC REX-USB60F 562 + */ 563 + #define RATOC_VENDOR_ID 0x0584 564 + #define RATOC_PRODUCT_ID_USB60F 0xb020 565 + 566 + /* 567 + * Acton Research Corp. 568 + */ 569 + #define ACTON_VID 0x0647 /* Vendor ID */ 570 + #define ACTON_SPECTRAPRO_PID 0x0100 571 + 572 + /* 573 + * Contec products (http://www.contec.com) 574 + * Submitted by Daniel Sangorrin 575 + */ 576 + #define CONTEC_VID 0x06CE /* Vendor ID */ 577 + #define CONTEC_COM1USBH_PID 0x8311 /* COM-1(USB)H */ 578 + 579 + /* 580 + * Definitions for B&B Electronics products. 581 + */ 582 + #define BANDB_VID 0x0856 /* B&B Electronics Vendor ID */ 583 + #define BANDB_USOTL4_PID 0xAC01 /* USOTL4 Isolated RS-485 Converter */ 584 + #define BANDB_USTL4_PID 0xAC02 /* USTL4 RS-485 Converter */ 585 + #define BANDB_USO9ML2_PID 0xAC03 /* USO9ML2 Isolated RS-232 Converter */ 586 + #define BANDB_USOPTL4_PID 0xAC11 587 + #define BANDB_USPTL4_PID 0xAC12 588 + #define BANDB_USO9ML2DR_2_PID 0xAC16 589 + #define BANDB_USO9ML2DR_PID 0xAC17 590 + #define BANDB_USOPTL4DR2_PID 0xAC18 /* USOPTL4R-2 2-port Isolated RS-232 Converter */ 591 + #define BANDB_USOPTL4DR_PID 0xAC19 592 + #define BANDB_485USB9F_2W_PID 0xAC25 593 + #define BANDB_485USB9F_4W_PID 0xAC26 594 + #define BANDB_232USB9M_PID 0xAC27 595 + #define BANDB_485USBTB_2W_PID 0xAC33 596 + #define BANDB_485USBTB_4W_PID 0xAC34 597 + #define BANDB_TTL5USB9M_PID 0xAC49 598 + #define BANDB_TTL3USB9M_PID 0xAC50 599 + #define BANDB_ZZ_PROG1_USB_PID 0xBA02 600 + 601 + /* 602 + * Intrepid Control Systems (http://www.intrepidcs.com/) ValueCAN and NeoVI 603 + */ 604 + #define INTREPID_VID 0x093C 605 + #define INTREPID_VALUECAN_PID 0x0601 606 + #define INTREPID_NEOVI_PID 0x0701 607 + 608 + /* 609 + * Definitions for ID TECH (www.idt-net.com) devices 610 + */ 611 + #define IDTECH_VID 0x0ACD /* ID TECH Vendor ID */ 612 + #define IDTECH_IDT1221U_PID 0x0300 /* IDT1221U USB to RS-232 adapter */ 613 + 614 + /* 615 + * Definitions for Omnidirectional Control Technology, Inc. devices 616 + */ 617 + #define OCT_VID 0x0B39 /* OCT vendor ID */ 618 + /* Note: OCT US101 is also rebadged as Dick Smith Electronics (NZ) XH6381 */ 619 + /* Also rebadged as Dick Smith Electronics (Aus) XH6451 */ 620 + /* Also rebadged as SIIG Inc. model US2308 hardware version 1 */ 621 + #define OCT_DK201_PID 0x0103 /* OCT DK201 USB docking station */ 622 + #define OCT_US101_PID 0x0421 /* OCT US101 USB to RS-232 */ 623 + 624 + /* 625 + * Definitions for Icom Inc. devices 626 + */ 627 + #define ICOM_VID 0x0C26 /* Icom vendor ID */ 628 + /* Note: ID-1 is a communications tranceiver for HAM-radio operators */ 629 + #define ICOM_ID_1_PID 0x0004 /* ID-1 USB to RS-232 */ 630 + /* Note: OPC is an Optional cable to connect an Icom Tranceiver */ 631 + #define ICOM_OPC_U_UC_PID 0x0018 /* OPC-478UC, OPC-1122U cloning cable */ 632 + /* Note: ID-RP* devices are Icom Repeater Devices for HAM-radio */ 633 + #define ICOM_ID_RP2C1_PID 0x0009 /* ID-RP2C Asset 1 to RS-232 */ 634 + #define ICOM_ID_RP2C2_PID 0x000A /* ID-RP2C Asset 2 to RS-232 */ 635 + #define ICOM_ID_RP2D_PID 0x000B /* ID-RP2D configuration port*/ 636 + #define ICOM_ID_RP2VT_PID 0x000C /* ID-RP2V Transmit config port */ 637 + #define ICOM_ID_RP2VR_PID 0x000D /* ID-RP2V Receive config port */ 638 + #define ICOM_ID_RP4KVT_PID 0x0010 /* ID-RP4000V Transmit config port */ 639 + #define ICOM_ID_RP4KVR_PID 0x0011 /* ID-RP4000V Receive config port */ 640 + #define ICOM_ID_RP2KVT_PID 0x0012 /* ID-RP2000V Transmit config port */ 641 + #define ICOM_ID_RP2KVR_PID 0x0013 /* ID-RP2000V Receive config port */ 642 + 643 + /* 644 + * GN Otometrics (http://www.otometrics.com) 645 + * Submitted by Ville Sundberg. 646 + */ 647 + #define GN_OTOMETRICS_VID 0x0c33 /* Vendor ID */ 648 + #define AURICAL_USB_PID 0x0010 /* Aurical USB Audiometer */ 649 + 650 + /* 651 + * The following are the values for the Sealevel SeaLINK+ adapters. 652 + * (Original list sent by Tuan Hoang. Ian Abbott renamed the macros and 653 + * removed some PIDs that don't seem to match any existing products.) 654 + */ 655 + #define SEALEVEL_VID 0x0c52 /* Sealevel Vendor ID */ 656 + #define SEALEVEL_2101_PID 0x2101 /* SeaLINK+232 (2101/2105) */ 657 + #define SEALEVEL_2102_PID 0x2102 /* SeaLINK+485 (2102) */ 658 + #define SEALEVEL_2103_PID 0x2103 /* SeaLINK+232I (2103) */ 659 + #define SEALEVEL_2104_PID 0x2104 /* SeaLINK+485I (2104) */ 660 + #define SEALEVEL_2106_PID 0x9020 /* SeaLINK+422 (2106) */ 661 + #define SEALEVEL_2201_1_PID 0x2211 /* SeaPORT+2/232 (2201) Port 1 */ 662 + #define SEALEVEL_2201_2_PID 0x2221 /* SeaPORT+2/232 (2201) Port 2 */ 663 + #define SEALEVEL_2202_1_PID 0x2212 /* SeaPORT+2/485 (2202) Port 1 */ 664 + #define SEALEVEL_2202_2_PID 0x2222 /* SeaPORT+2/485 (2202) Port 2 */ 665 + #define SEALEVEL_2203_1_PID 0x2213 /* SeaPORT+2 (2203) Port 1 */ 666 + #define SEALEVEL_2203_2_PID 0x2223 /* SeaPORT+2 (2203) Port 2 */ 667 + #define SEALEVEL_2401_1_PID 0x2411 /* SeaPORT+4/232 (2401) Port 1 */ 668 + #define SEALEVEL_2401_2_PID 0x2421 /* SeaPORT+4/232 (2401) Port 2 */ 669 + #define SEALEVEL_2401_3_PID 0x2431 /* SeaPORT+4/232 (2401) Port 3 */ 670 + #define SEALEVEL_2401_4_PID 0x2441 /* SeaPORT+4/232 (2401) Port 4 */ 671 + #define SEALEVEL_2402_1_PID 0x2412 /* SeaPORT+4/485 (2402) Port 1 */ 672 + #define SEALEVEL_2402_2_PID 0x2422 /* SeaPORT+4/485 (2402) Port 2 */ 673 + #define SEALEVEL_2402_3_PID 0x2432 /* SeaPORT+4/485 (2402) Port 3 */ 674 + #define SEALEVEL_2402_4_PID 0x2442 /* SeaPORT+4/485 (2402) Port 4 */ 675 + #define SEALEVEL_2403_1_PID 0x2413 /* SeaPORT+4 (2403) Port 1 */ 676 + #define SEALEVEL_2403_2_PID 0x2423 /* SeaPORT+4 (2403) Port 2 */ 677 + #define SEALEVEL_2403_3_PID 0x2433 /* SeaPORT+4 (2403) Port 3 */ 678 + #define SEALEVEL_2403_4_PID 0x2443 /* SeaPORT+4 (2403) Port 4 */ 679 + #define SEALEVEL_2801_1_PID 0X2811 /* SeaLINK+8/232 (2801) Port 1 */ 680 + #define SEALEVEL_2801_2_PID 0X2821 /* SeaLINK+8/232 (2801) Port 2 */ 681 + #define SEALEVEL_2801_3_PID 0X2831 /* SeaLINK+8/232 (2801) Port 3 */ 682 + #define SEALEVEL_2801_4_PID 0X2841 /* SeaLINK+8/232 (2801) Port 4 */ 683 + #define SEALEVEL_2801_5_PID 0X2851 /* SeaLINK+8/232 (2801) Port 5 */ 684 + #define SEALEVEL_2801_6_PID 0X2861 /* SeaLINK+8/232 (2801) Port 6 */ 685 + #define SEALEVEL_2801_7_PID 0X2871 /* SeaLINK+8/232 (2801) Port 7 */ 686 + #define SEALEVEL_2801_8_PID 0X2881 /* SeaLINK+8/232 (2801) Port 8 */ 687 + #define SEALEVEL_2802_1_PID 0X2812 /* SeaLINK+8/485 (2802) Port 1 */ 688 + #define SEALEVEL_2802_2_PID 0X2822 /* SeaLINK+8/485 (2802) Port 2 */ 689 + #define SEALEVEL_2802_3_PID 0X2832 /* SeaLINK+8/485 (2802) Port 3 */ 690 + #define SEALEVEL_2802_4_PID 0X2842 /* SeaLINK+8/485 (2802) Port 4 */ 691 + #define SEALEVEL_2802_5_PID 0X2852 /* SeaLINK+8/485 (2802) Port 5 */ 692 + #define SEALEVEL_2802_6_PID 0X2862 /* SeaLINK+8/485 (2802) Port 6 */ 693 + #define SEALEVEL_2802_7_PID 0X2872 /* SeaLINK+8/485 (2802) Port 7 */ 694 + #define SEALEVEL_2802_8_PID 0X2882 /* SeaLINK+8/485 (2802) Port 8 */ 695 + #define SEALEVEL_2803_1_PID 0X2813 /* SeaLINK+8 (2803) Port 1 */ 696 + #define SEALEVEL_2803_2_PID 0X2823 /* SeaLINK+8 (2803) Port 2 */ 697 + #define SEALEVEL_2803_3_PID 0X2833 /* SeaLINK+8 (2803) Port 3 */ 698 + #define SEALEVEL_2803_4_PID 0X2843 /* SeaLINK+8 (2803) Port 4 */ 699 + #define SEALEVEL_2803_5_PID 0X2853 /* SeaLINK+8 (2803) Port 5 */ 700 + #define SEALEVEL_2803_6_PID 0X2863 /* SeaLINK+8 (2803) Port 6 */ 701 + #define SEALEVEL_2803_7_PID 0X2873 /* SeaLINK+8 (2803) Port 7 */ 702 + #define SEALEVEL_2803_8_PID 0X2883 /* SeaLINK+8 (2803) Port 8 */ 703 + #define SEALEVEL_2803R_1_PID 0Xa02a /* SeaLINK+8 (2803-ROHS) Port 1+2 */ 704 + #define SEALEVEL_2803R_2_PID 0Xa02b /* SeaLINK+8 (2803-ROHS) Port 3+4 */ 705 + #define SEALEVEL_2803R_3_PID 0Xa02c /* SeaLINK+8 (2803-ROHS) Port 5+6 */ 706 + #define SEALEVEL_2803R_4_PID 0Xa02d /* SeaLINK+8 (2803-ROHS) Port 7+8 */ 707 + 708 + /* 709 + * JETI SPECTROMETER SPECBOS 1201 710 + * http://www.jeti.com/cms/index.php/instruments/other-instruments/specbos-2101 711 + */ 712 + #define JETI_VID 0x0c6c 713 + #define JETI_SPC1201_PID 0x04b2 714 + 715 + /* 716 + * FTDI USB UART chips used in construction projects from the 717 + * Elektor Electronics magazine (http://www.elektor.com/) 718 + */ 719 + #define ELEKTOR_VID 0x0C7D 720 + #define ELEKTOR_FT323R_PID 0x0005 /* RFID-Reader, issue 09-2006 */ 721 + 722 + /* 723 + * Posiflex inc retail equipment (http://www.posiflex.com.tw) 724 + */ 725 + #define POSIFLEX_VID 0x0d3a /* Vendor ID */ 726 + #define POSIFLEX_PP7000_PID 0x0300 /* PP-7000II thermal printer */ 727 + 728 + /* 729 + * The following are the values for two KOBIL chipcard terminals. 730 + */ 731 + #define KOBIL_VID 0x0d46 /* KOBIL Vendor ID */ 732 + #define KOBIL_CONV_B1_PID 0x2020 /* KOBIL Konverter for B1 */ 733 + #define KOBIL_CONV_KAAN_PID 0x2021 /* KOBIL_Konverter for KAAN */ 734 + 735 + #define FTDI_NF_RIC_VID 0x0DCD /* Vendor Id */ 736 + #define FTDI_NF_RIC_PID 0x0001 /* Product Id */ 737 + 738 + /* 739 + * Falcom Wireless Communications GmbH 740 + */ 741 + #define FALCOM_VID 0x0F94 /* Vendor Id */ 742 + #define FALCOM_TWIST_PID 0x0001 /* Falcom Twist USB GPRS modem */ 743 + #define FALCOM_SAMBA_PID 0x0005 /* Falcom Samba USB GPRS modem */ 744 + 745 + /* Larsen and Brusgaard AltiTrack/USBtrack */ 746 + #define LARSENBRUSGAARD_VID 0x0FD8 747 + #define LB_ALTITRACK_PID 0x0001 748 + 749 + /* 750 + * TTi (Thurlby Thandar Instruments) 751 + */ 752 + #define TTI_VID 0x103E /* Vendor Id */ 753 + #define TTI_QL355P_PID 0x03E8 /* TTi QL355P power supply */ 754 + 755 + /* Interbiometrics USB I/O Board */ 756 + /* Developed for Interbiometrics by Rudolf Gugler */ 757 + #define INTERBIOMETRICS_VID 0x1209 758 + #define INTERBIOMETRICS_IOBOARD_PID 0x1002 759 + #define INTERBIOMETRICS_MINI_IOBOARD_PID 0x1006 760 + 761 + /* 762 + * Testo products (http://www.testo.com/) 763 + * Submitted by Colin Leroy 764 + */ 765 + #define TESTO_VID 0x128D 766 + #define TESTO_USB_INTERFACE_PID 0x0001 767 + 768 + /* 769 + * Mobility Electronics products. 770 + */ 771 + #define MOBILITY_VID 0x1342 772 + #define MOBILITY_USB_SERIAL_PID 0x0202 /* EasiDock USB 200 serial */ 773 + 774 + /* 775 + * FIC / OpenMoko, Inc. http://wiki.openmoko.org/wiki/Neo1973_Debug_Board_v3 776 + * Submitted by Harald Welte <laforge@openmoko.org> 777 + */ 778 + #define FIC_VID 0x1457 779 + #define FIC_NEO1973_DEBUG_PID 0x5118 780 + 781 + /* Olimex */ 782 + #define OLIMEX_VID 0x15BA 783 + #define OLIMEX_ARM_USB_OCD_PID 0x0003 784 + #define OLIMEX_ARM_USB_OCD_H_PID 0x002b 785 + 786 + /* 787 + * Telldus Technologies 788 + */ 789 + #define TELLDUS_VID 0x1781 /* Vendor ID */ 790 + #define TELLDUS_TELLSTICK_PID 0x0C30 /* RF control dongle 433 MHz using FT232RL */ 791 + 792 + /* 793 + * RT Systems programming cables for various ham radios 794 + */ 795 + #define RTSYSTEMS_VID 0x2100 /* Vendor ID */ 796 + #define RTSYSTEMS_SERIAL_VX7_PID 0x9e52 /* Serial converter for VX-7 Radios using FT232RL */ 797 + #define RTSYSTEMS_CT29B_PID 0x9e54 /* CT29B Radio Cable */ 798 + #define RTSYSTEMS_RTS01_PID 0x9e57 /* USB-RTS01 Radio Cable */ 799 + 800 + 801 + /* 802 + * Physik Instrumente 803 + * http://www.physikinstrumente.com/en/products/ 804 + */ 805 + /* These two devices use the VID of FTDI */ 806 + #define PI_C865_PID 0xe0a0 /* PI C-865 Piezomotor Controller */ 807 + #define PI_C857_PID 0xe0a1 /* PI Encoder Trigger Box */ 808 + 809 + #define PI_VID 0x1a72 /* Vendor ID */ 810 + #define PI_C866_PID 0x1000 /* PI C-866 Piezomotor Controller */ 811 + #define PI_C663_PID 0x1001 /* PI C-663 Mercury-Step */ 812 + #define PI_C725_PID 0x1002 /* PI C-725 Piezomotor Controller */ 813 + #define PI_E517_PID 0x1005 /* PI E-517 Digital Piezo Controller Operation Module */ 814 + #define PI_C863_PID 0x1007 /* PI C-863 */ 815 + #define PI_E861_PID 0x1008 /* PI E-861 Piezomotor Controller */ 816 + #define PI_C867_PID 0x1009 /* PI C-867 Piezomotor Controller */ 817 + #define PI_E609_PID 0x100D /* PI E-609 Digital Piezo Controller */ 818 + #define PI_E709_PID 0x100E /* PI E-709 Digital Piezo Controller */ 819 + #define PI_100F_PID 0x100F /* PI Digital Piezo Controller */ 820 + #define PI_1011_PID 0x1011 /* PI Digital Piezo Controller */ 821 + #define PI_1012_PID 0x1012 /* PI Motion Controller */ 822 + #define PI_1013_PID 0x1013 /* PI Motion Controller */ 823 + #define PI_1014_PID 0x1014 /* PI Device */ 824 + #define PI_1015_PID 0x1015 /* PI Device */ 825 + #define PI_1016_PID 0x1016 /* PI Digital Servo Module */ 826 + 827 + /* 828 + * Kondo Kagaku Co.Ltd. 829 + * http://www.kondo-robot.com/EN 830 + */ 831 + #define KONDO_VID 0x165c 832 + #define KONDO_USB_SERIAL_PID 0x0002 833 + 834 + /* 835 + * Bayer Ascensia Contour blood glucose meter USB-converter cable. 836 + * http://winglucofacts.com/cables/ 837 + */ 838 + #define BAYER_VID 0x1A79 839 + #define BAYER_CONTOUR_CABLE_PID 0x6001 840 + 841 + /* 842 + * The following are the values for the Matrix Orbital FTDI Range 843 + * Anything in this range will use an FT232RL. 844 + */ 845 + #define MTXORB_VID 0x1B3D 846 + #define MTXORB_FTDI_RANGE_0100_PID 0x0100 847 + #define MTXORB_FTDI_RANGE_0101_PID 0x0101 848 + #define MTXORB_FTDI_RANGE_0102_PID 0x0102 849 + #define MTXORB_FTDI_RANGE_0103_PID 0x0103 850 + #define MTXORB_FTDI_RANGE_0104_PID 0x0104 851 + #define MTXORB_FTDI_RANGE_0105_PID 0x0105 852 + #define MTXORB_FTDI_RANGE_0106_PID 0x0106 853 + #define MTXORB_FTDI_RANGE_0107_PID 0x0107 854 + #define MTXORB_FTDI_RANGE_0108_PID 0x0108 855 + #define MTXORB_FTDI_RANGE_0109_PID 0x0109 856 + #define MTXORB_FTDI_RANGE_010A_PID 0x010A 857 + #define MTXORB_FTDI_RANGE_010B_PID 0x010B 858 + #define MTXORB_FTDI_RANGE_010C_PID 0x010C 859 + #define MTXORB_FTDI_RANGE_010D_PID 0x010D 860 + #define MTXORB_FTDI_RANGE_010E_PID 0x010E 861 + #define MTXORB_FTDI_RANGE_010F_PID 0x010F 862 + #define MTXORB_FTDI_RANGE_0110_PID 0x0110 863 + #define MTXORB_FTDI_RANGE_0111_PID 0x0111 864 + #define MTXORB_FTDI_RANGE_0112_PID 0x0112 865 + #define MTXORB_FTDI_RANGE_0113_PID 0x0113 866 + #define MTXORB_FTDI_RANGE_0114_PID 0x0114 867 + #define MTXORB_FTDI_RANGE_0115_PID 0x0115 868 + #define MTXORB_FTDI_RANGE_0116_PID 0x0116 869 + #define MTXORB_FTDI_RANGE_0117_PID 0x0117 870 + #define MTXORB_FTDI_RANGE_0118_PID 0x0118 871 + #define MTXORB_FTDI_RANGE_0119_PID 0x0119 872 + #define MTXORB_FTDI_RANGE_011A_PID 0x011A 873 + #define MTXORB_FTDI_RANGE_011B_PID 0x011B 874 + #define MTXORB_FTDI_RANGE_011C_PID 0x011C 875 + #define MTXORB_FTDI_RANGE_011D_PID 0x011D 876 + #define MTXORB_FTDI_RANGE_011E_PID 0x011E 877 + #define MTXORB_FTDI_RANGE_011F_PID 0x011F 878 + #define MTXORB_FTDI_RANGE_0120_PID 0x0120 879 + #define MTXORB_FTDI_RANGE_0121_PID 0x0121 880 + #define MTXORB_FTDI_RANGE_0122_PID 0x0122 881 + #define MTXORB_FTDI_RANGE_0123_PID 0x0123 882 + #define MTXORB_FTDI_RANGE_0124_PID 0x0124 883 + #define MTXORB_FTDI_RANGE_0125_PID 0x0125 884 + #define MTXORB_FTDI_RANGE_0126_PID 0x0126 885 + #define MTXORB_FTDI_RANGE_0127_PID 0x0127 886 + #define MTXORB_FTDI_RANGE_0128_PID 0x0128 887 + #define MTXORB_FTDI_RANGE_0129_PID 0x0129 888 + #define MTXORB_FTDI_RANGE_012A_PID 0x012A 889 + #define MTXORB_FTDI_RANGE_012B_PID 0x012B 890 + #define MTXORB_FTDI_RANGE_012C_PID 0x012C 891 + #define MTXORB_FTDI_RANGE_012D_PID 0x012D 892 + #define MTXORB_FTDI_RANGE_012E_PID 0x012E 893 + #define MTXORB_FTDI_RANGE_012F_PID 0x012F 894 + #define MTXORB_FTDI_RANGE_0130_PID 0x0130 895 + #define MTXORB_FTDI_RANGE_0131_PID 0x0131 896 + #define MTXORB_FTDI_RANGE_0132_PID 0x0132 897 + #define MTXORB_FTDI_RANGE_0133_PID 0x0133 898 + #define MTXORB_FTDI_RANGE_0134_PID 0x0134 899 + #define MTXORB_FTDI_RANGE_0135_PID 0x0135 900 + #define MTXORB_FTDI_RANGE_0136_PID 0x0136 901 + #define MTXORB_FTDI_RANGE_0137_PID 0x0137 902 + #define MTXORB_FTDI_RANGE_0138_PID 0x0138 903 + #define MTXORB_FTDI_RANGE_0139_PID 0x0139 904 + #define MTXORB_FTDI_RANGE_013A_PID 0x013A 905 + #define MTXORB_FTDI_RANGE_013B_PID 0x013B 906 + #define MTXORB_FTDI_RANGE_013C_PID 0x013C 907 + #define MTXORB_FTDI_RANGE_013D_PID 0x013D 908 + #define MTXORB_FTDI_RANGE_013E_PID 0x013E 909 + #define MTXORB_FTDI_RANGE_013F_PID 0x013F 910 + #define MTXORB_FTDI_RANGE_0140_PID 0x0140 911 + #define MTXORB_FTDI_RANGE_0141_PID 0x0141 912 + #define MTXORB_FTDI_RANGE_0142_PID 0x0142 913 + #define MTXORB_FTDI_RANGE_0143_PID 0x0143 914 + #define MTXORB_FTDI_RANGE_0144_PID 0x0144 915 + #define MTXORB_FTDI_RANGE_0145_PID 0x0145 916 + #define MTXORB_FTDI_RANGE_0146_PID 0x0146 917 + #define MTXORB_FTDI_RANGE_0147_PID 0x0147 918 + #define MTXORB_FTDI_RANGE_0148_PID 0x0148 919 + #define MTXORB_FTDI_RANGE_0149_PID 0x0149 920 + #define MTXORB_FTDI_RANGE_014A_PID 0x014A 921 + #define MTXORB_FTDI_RANGE_014B_PID 0x014B 922 + #define MTXORB_FTDI_RANGE_014C_PID 0x014C 923 + #define MTXORB_FTDI_RANGE_014D_PID 0x014D 924 + #define MTXORB_FTDI_RANGE_014E_PID 0x014E 925 + #define MTXORB_FTDI_RANGE_014F_PID 0x014F 926 + #define MTXORB_FTDI_RANGE_0150_PID 0x0150 927 + #define MTXORB_FTDI_RANGE_0151_PID 0x0151 928 + #define MTXORB_FTDI_RANGE_0152_PID 0x0152 929 + #define MTXORB_FTDI_RANGE_0153_PID 0x0153 930 + #define MTXORB_FTDI_RANGE_0154_PID 0x0154 931 + #define MTXORB_FTDI_RANGE_0155_PID 0x0155 932 + #define MTXORB_FTDI_RANGE_0156_PID 0x0156 933 + #define MTXORB_FTDI_RANGE_0157_PID 0x0157 934 + #define MTXORB_FTDI_RANGE_0158_PID 0x0158 935 + #define MTXORB_FTDI_RANGE_0159_PID 0x0159 936 + #define MTXORB_FTDI_RANGE_015A_PID 0x015A 937 + #define MTXORB_FTDI_RANGE_015B_PID 0x015B 938 + #define MTXORB_FTDI_RANGE_015C_PID 0x015C 939 + #define MTXORB_FTDI_RANGE_015D_PID 0x015D 940 + #define MTXORB_FTDI_RANGE_015E_PID 0x015E 941 + #define MTXORB_FTDI_RANGE_015F_PID 0x015F 942 + #define MTXORB_FTDI_RANGE_0160_PID 0x0160 943 + #define MTXORB_FTDI_RANGE_0161_PID 0x0161 944 + #define MTXORB_FTDI_RANGE_0162_PID 0x0162 945 + #define MTXORB_FTDI_RANGE_0163_PID 0x0163 946 + #define MTXORB_FTDI_RANGE_0164_PID 0x0164 947 + #define MTXORB_FTDI_RANGE_0165_PID 0x0165 948 + #define MTXORB_FTDI_RANGE_0166_PID 0x0166 949 + #define MTXORB_FTDI_RANGE_0167_PID 0x0167 950 + #define MTXORB_FTDI_RANGE_0168_PID 0x0168 951 + #define MTXORB_FTDI_RANGE_0169_PID 0x0169 952 + #define MTXORB_FTDI_RANGE_016A_PID 0x016A 953 + #define MTXORB_FTDI_RANGE_016B_PID 0x016B 954 + #define MTXORB_FTDI_RANGE_016C_PID 0x016C 955 + #define MTXORB_FTDI_RANGE_016D_PID 0x016D 956 + #define MTXORB_FTDI_RANGE_016E_PID 0x016E 957 + #define MTXORB_FTDI_RANGE_016F_PID 0x016F 958 + #define MTXORB_FTDI_RANGE_0170_PID 0x0170 959 + #define MTXORB_FTDI_RANGE_0171_PID 0x0171 960 + #define MTXORB_FTDI_RANGE_0172_PID 0x0172 961 + #define MTXORB_FTDI_RANGE_0173_PID 0x0173 962 + #define MTXORB_FTDI_RANGE_0174_PID 0x0174 963 + #define MTXORB_FTDI_RANGE_0175_PID 0x0175 964 + #define MTXORB_FTDI_RANGE_0176_PID 0x0176 965 + #define MTXORB_FTDI_RANGE_0177_PID 0x0177 966 + #define MTXORB_FTDI_RANGE_0178_PID 0x0178 967 + #define MTXORB_FTDI_RANGE_0179_PID 0x0179 968 + #define MTXORB_FTDI_RANGE_017A_PID 0x017A 969 + #define MTXORB_FTDI_RANGE_017B_PID 0x017B 970 + #define MTXORB_FTDI_RANGE_017C_PID 0x017C 971 + #define MTXORB_FTDI_RANGE_017D_PID 0x017D 972 + #define MTXORB_FTDI_RANGE_017E_PID 0x017E 973 + #define MTXORB_FTDI_RANGE_017F_PID 0x017F 974 + #define MTXORB_FTDI_RANGE_0180_PID 0x0180 975 + #define MTXORB_FTDI_RANGE_0181_PID 0x0181 976 + #define MTXORB_FTDI_RANGE_0182_PID 0x0182 977 + #define MTXORB_FTDI_RANGE_0183_PID 0x0183 978 + #define MTXORB_FTDI_RANGE_0184_PID 0x0184 979 + #define MTXORB_FTDI_RANGE_0185_PID 0x0185 980 + #define MTXORB_FTDI_RANGE_0186_PID 0x0186 981 + #define MTXORB_FTDI_RANGE_0187_PID 0x0187 982 + #define MTXORB_FTDI_RANGE_0188_PID 0x0188 983 + #define MTXORB_FTDI_RANGE_0189_PID 0x0189 984 + #define MTXORB_FTDI_RANGE_018A_PID 0x018A 985 + #define MTXORB_FTDI_RANGE_018B_PID 0x018B 986 + #define MTXORB_FTDI_RANGE_018C_PID 0x018C 987 + #define MTXORB_FTDI_RANGE_018D_PID 0x018D 988 + #define MTXORB_FTDI_RANGE_018E_PID 0x018E 989 + #define MTXORB_FTDI_RANGE_018F_PID 0x018F 990 + #define MTXORB_FTDI_RANGE_0190_PID 0x0190 991 + #define MTXORB_FTDI_RANGE_0191_PID 0x0191 992 + #define MTXORB_FTDI_RANGE_0192_PID 0x0192 993 + #define MTXORB_FTDI_RANGE_0193_PID 0x0193 994 + #define MTXORB_FTDI_RANGE_0194_PID 0x0194 995 + #define MTXORB_FTDI_RANGE_0195_PID 0x0195 996 + #define MTXORB_FTDI_RANGE_0196_PID 0x0196 997 + #define MTXORB_FTDI_RANGE_0197_PID 0x0197 998 + #define MTXORB_FTDI_RANGE_0198_PID 0x0198 999 + #define MTXORB_FTDI_RANGE_0199_PID 0x0199 1000 + #define MTXORB_FTDI_RANGE_019A_PID 0x019A 1001 + #define MTXORB_FTDI_RANGE_019B_PID 0x019B 1002 + #define MTXORB_FTDI_RANGE_019C_PID 0x019C 1003 + #define MTXORB_FTDI_RANGE_019D_PID 0x019D 1004 + #define MTXORB_FTDI_RANGE_019E_PID 0x019E 1005 + #define MTXORB_FTDI_RANGE_019F_PID 0x019F 1006 + #define MTXORB_FTDI_RANGE_01A0_PID 0x01A0 1007 + #define MTXORB_FTDI_RANGE_01A1_PID 0x01A1 1008 + #define MTXORB_FTDI_RANGE_01A2_PID 0x01A2 1009 + #define MTXORB_FTDI_RANGE_01A3_PID 0x01A3 1010 + #define MTXORB_FTDI_RANGE_01A4_PID 0x01A4 1011 + #define MTXORB_FTDI_RANGE_01A5_PID 0x01A5 1012 + #define MTXORB_FTDI_RANGE_01A6_PID 0x01A6 1013 + #define MTXORB_FTDI_RANGE_01A7_PID 0x01A7 1014 + #define MTXORB_FTDI_RANGE_01A8_PID 0x01A8 1015 + #define MTXORB_FTDI_RANGE_01A9_PID 0x01A9 1016 + #define MTXORB_FTDI_RANGE_01AA_PID 0x01AA 1017 + #define MTXORB_FTDI_RANGE_01AB_PID 0x01AB 1018 + #define MTXORB_FTDI_RANGE_01AC_PID 0x01AC 1019 + #define MTXORB_FTDI_RANGE_01AD_PID 0x01AD 1020 + #define MTXORB_FTDI_RANGE_01AE_PID 0x01AE 1021 + #define MTXORB_FTDI_RANGE_01AF_PID 0x01AF 1022 + #define MTXORB_FTDI_RANGE_01B0_PID 0x01B0 1023 + #define MTXORB_FTDI_RANGE_01B1_PID 0x01B1 1024 + #define MTXORB_FTDI_RANGE_01B2_PID 0x01B2 1025 + #define MTXORB_FTDI_RANGE_01B3_PID 0x01B3 1026 + #define MTXORB_FTDI_RANGE_01B4_PID 0x01B4 1027 + #define MTXORB_FTDI_RANGE_01B5_PID 0x01B5 1028 + #define MTXORB_FTDI_RANGE_01B6_PID 0x01B6 1029 + #define MTXORB_FTDI_RANGE_01B7_PID 0x01B7 1030 + #define MTXORB_FTDI_RANGE_01B8_PID 0x01B8 1031 + #define MTXORB_FTDI_RANGE_01B9_PID 0x01B9 1032 + #define MTXORB_FTDI_RANGE_01BA_PID 0x01BA 1033 + #define MTXORB_FTDI_RANGE_01BB_PID 0x01BB 1034 + #define MTXORB_FTDI_RANGE_01BC_PID 0x01BC 1035 + #define MTXORB_FTDI_RANGE_01BD_PID 0x01BD 1036 + #define MTXORB_FTDI_RANGE_01BE_PID 0x01BE 1037 + #define MTXORB_FTDI_RANGE_01BF_PID 0x01BF 1038 + #define MTXORB_FTDI_RANGE_01C0_PID 0x01C0 1039 + #define MTXORB_FTDI_RANGE_01C1_PID 0x01C1 1040 + #define MTXORB_FTDI_RANGE_01C2_PID 0x01C2 1041 + #define MTXORB_FTDI_RANGE_01C3_PID 0x01C3 1042 + #define MTXORB_FTDI_RANGE_01C4_PID 0x01C4 1043 + #define MTXORB_FTDI_RANGE_01C5_PID 0x01C5 1044 + #define MTXORB_FTDI_RANGE_01C6_PID 0x01C6 1045 + #define MTXORB_FTDI_RANGE_01C7_PID 0x01C7 1046 + #define MTXORB_FTDI_RANGE_01C8_PID 0x01C8 1047 + #define MTXORB_FTDI_RANGE_01C9_PID 0x01C9 1048 + #define MTXORB_FTDI_RANGE_01CA_PID 0x01CA 1049 + #define MTXORB_FTDI_RANGE_01CB_PID 0x01CB 1050 + #define MTXORB_FTDI_RANGE_01CC_PID 0x01CC 1051 + #define MTXORB_FTDI_RANGE_01CD_PID 0x01CD 1052 + #define MTXORB_FTDI_RANGE_01CE_PID 0x01CE 1053 + #define MTXORB_FTDI_RANGE_01CF_PID 0x01CF 1054 + #define MTXORB_FTDI_RANGE_01D0_PID 0x01D0 1055 + #define MTXORB_FTDI_RANGE_01D1_PID 0x01D1 1056 + #define MTXORB_FTDI_RANGE_01D2_PID 0x01D2 1057 + #define MTXORB_FTDI_RANGE_01D3_PID 0x01D3 1058 + #define MTXORB_FTDI_RANGE_01D4_PID 0x01D4 1059 + #define MTXORB_FTDI_RANGE_01D5_PID 0x01D5 1060 + #define MTXORB_FTDI_RANGE_01D6_PID 0x01D6 1061 + #define MTXORB_FTDI_RANGE_01D7_PID 0x01D7 1062 + #define MTXORB_FTDI_RANGE_01D8_PID 0x01D8 1063 + #define MTXORB_FTDI_RANGE_01D9_PID 0x01D9 1064 + #define MTXORB_FTDI_RANGE_01DA_PID 0x01DA 1065 + #define MTXORB_FTDI_RANGE_01DB_PID 0x01DB 1066 + #define MTXORB_FTDI_RANGE_01DC_PID 0x01DC 1067 + #define MTXORB_FTDI_RANGE_01DD_PID 0x01DD 1068 + #define MTXORB_FTDI_RANGE_01DE_PID 0x01DE 1069 + #define MTXORB_FTDI_RANGE_01DF_PID 0x01DF 1070 + #define MTXORB_FTDI_RANGE_01E0_PID 0x01E0 1071 + #define MTXORB_FTDI_RANGE_01E1_PID 0x01E1 1072 + #define MTXORB_FTDI_RANGE_01E2_PID 0x01E2 1073 + #define MTXORB_FTDI_RANGE_01E3_PID 0x01E3 1074 + #define MTXORB_FTDI_RANGE_01E4_PID 0x01E4 1075 + #define MTXORB_FTDI_RANGE_01E5_PID 0x01E5 1076 + #define MTXORB_FTDI_RANGE_01E6_PID 0x01E6 1077 + #define MTXORB_FTDI_RANGE_01E7_PID 0x01E7 1078 + #define MTXORB_FTDI_RANGE_01E8_PID 0x01E8 1079 + #define MTXORB_FTDI_RANGE_01E9_PID 0x01E9 1080 + #define MTXORB_FTDI_RANGE_01EA_PID 0x01EA 1081 + #define MTXORB_FTDI_RANGE_01EB_PID 0x01EB 1082 + #define MTXORB_FTDI_RANGE_01EC_PID 0x01EC 1083 + #define MTXORB_FTDI_RANGE_01ED_PID 0x01ED 1084 + #define MTXORB_FTDI_RANGE_01EE_PID 0x01EE 1085 + #define MTXORB_FTDI_RANGE_01EF_PID 0x01EF 1086 + #define MTXORB_FTDI_RANGE_01F0_PID 0x01F0 1087 + #define MTXORB_FTDI_RANGE_01F1_PID 0x01F1 1088 + #define MTXORB_FTDI_RANGE_01F2_PID 0x01F2 1089 + #define MTXORB_FTDI_RANGE_01F3_PID 0x01F3 1090 + #define MTXORB_FTDI_RANGE_01F4_PID 0x01F4 1091 + #define MTXORB_FTDI_RANGE_01F5_PID 0x01F5 1092 + #define MTXORB_FTDI_RANGE_01F6_PID 0x01F6 1093 + #define MTXORB_FTDI_RANGE_01F7_PID 0x01F7 1094 + #define MTXORB_FTDI_RANGE_01F8_PID 0x01F8 1095 + #define MTXORB_FTDI_RANGE_01F9_PID 0x01F9 1096 + #define MTXORB_FTDI_RANGE_01FA_PID 0x01FA 1097 + #define MTXORB_FTDI_RANGE_01FB_PID 0x01FB 1098 + #define MTXORB_FTDI_RANGE_01FC_PID 0x01FC 1099 + #define MTXORB_FTDI_RANGE_01FD_PID 0x01FD 1100 + #define MTXORB_FTDI_RANGE_01FE_PID 0x01FE 1101 + #define MTXORB_FTDI_RANGE_01FF_PID 0x01FF 1102 + 1103 + 1104 + 1105 + /* 1106 + * The Mobility Lab (TML) 1107 + * Submitted by Pierre Castella 1108 + */ 1109 + #define TML_VID 0x1B91 /* Vendor ID */ 1110 + #define TML_USB_SERIAL_PID 0x0064 /* USB - Serial Converter */ 1111 + 1112 + /* Alti-2 products http://www.alti-2.com */ 1113 + #define ALTI2_VID 0x1BC9 1114 + #define ALTI2_N3_PID 0x6001 /* Neptune 3 */ 1115 + 1116 + /* 1117 + * Ionics PlugComputer 1118 + */ 1119 + #define IONICS_VID 0x1c0c 1120 + #define IONICS_PLUGCOMPUTER_PID 0x0102 1121 + 1122 + /* 1123 + * Dresden Elektronik Sensor Terminal Board 1124 + */ 1125 + #define DE_VID 0x1cf1 /* Vendor ID */ 1126 + #define STB_PID 0x0001 /* Sensor Terminal Board */ 1127 + #define WHT_PID 0x0004 /* Wireless Handheld Terminal */ 1128 + 1129 + /* 1130 + * STMicroelectonics 1131 + */ 1132 + #define ST_VID 0x0483 1133 + #define ST_STMCLT1030_PID 0x3747 /* ST Micro Connect Lite STMCLT1030 */ 1134 + 1135 + /* 1136 + * Papouch products (http://www.papouch.com/) 1137 + * Submitted by Folkert van Heusden 1138 + */ 1139 + 1140 + #define PAPOUCH_VID 0x5050 /* Vendor ID */ 1141 + #define PAPOUCH_SB485_PID 0x0100 /* Papouch SB485 USB-485/422 Converter */ 1142 + #define PAPOUCH_AP485_PID 0x0101 /* AP485 USB-RS485 Converter */ 1143 + #define PAPOUCH_SB422_PID 0x0102 /* Papouch SB422 USB-RS422 Converter */ 1144 + #define PAPOUCH_SB485_2_PID 0x0103 /* Papouch SB485 USB-485/422 Converter */ 1145 + #define PAPOUCH_AP485_2_PID 0x0104 /* AP485 USB-RS485 Converter */ 1146 + #define PAPOUCH_SB422_2_PID 0x0105 /* Papouch SB422 USB-RS422 Converter */ 1147 + #define PAPOUCH_SB485S_PID 0x0106 /* Papouch SB485S USB-485/422 Converter */ 1148 + #define PAPOUCH_SB485C_PID 0x0107 /* Papouch SB485C USB-485/422 Converter */ 1149 + #define PAPOUCH_LEC_PID 0x0300 /* LEC USB Converter */ 1150 + #define PAPOUCH_SB232_PID 0x0301 /* Papouch SB232 USB-RS232 Converter */ 1151 + #define PAPOUCH_TMU_PID 0x0400 /* TMU USB Thermometer */ 1152 + #define PAPOUCH_IRAMP_PID 0x0500 /* Papouch IRAmp Duplex */ 1153 + #define PAPOUCH_DRAK5_PID 0x0700 /* Papouch DRAK5 */ 1154 + #define PAPOUCH_QUIDO8x8_PID 0x0800 /* Papouch Quido 8/8 Module */ 1155 + #define PAPOUCH_QUIDO4x4_PID 0x0900 /* Papouch Quido 4/4 Module */ 1156 + #define PAPOUCH_QUIDO2x2_PID 0x0a00 /* Papouch Quido 2/2 Module */ 1157 + #define PAPOUCH_QUIDO10x1_PID 0x0b00 /* Papouch Quido 10/1 Module */ 1158 + #define PAPOUCH_QUIDO30x3_PID 0x0c00 /* Papouch Quido 30/3 Module */ 1159 + #define PAPOUCH_QUIDO60x3_PID 0x0d00 /* Papouch Quido 60(100)/3 Module */ 1160 + #define PAPOUCH_QUIDO2x16_PID 0x0e00 /* Papouch Quido 2/16 Module */ 1161 + #define PAPOUCH_QUIDO3x32_PID 0x0f00 /* Papouch Quido 3/32 Module */ 1162 + #define PAPOUCH_DRAK6_PID 0x1000 /* Papouch DRAK6 */ 1163 + #define PAPOUCH_UPSUSB_PID 0x8000 /* Papouch UPS-USB adapter */ 1164 + #define PAPOUCH_MU_PID 0x8001 /* MU controller */ 1165 + #define PAPOUCH_SIMUKEY_PID 0x8002 /* Papouch SimuKey */ 1166 + #define PAPOUCH_AD4USB_PID 0x8003 /* AD4USB Measurement Module */ 1167 + #define PAPOUCH_GMUX_PID 0x8004 /* Papouch GOLIATH MUX */ 1168 + #define PAPOUCH_GMSR_PID 0x8005 /* Papouch GOLIATH MSR */ 1169 + 1170 + /* 1171 + * Marvell SheevaPlug 1172 + */ 1173 + #define MARVELL_VID 0x9e88 1174 + #define MARVELL_SHEEVAPLUG_PID 0x9e8f 1175 + 1176 + /* 1177 + * Evolution Robotics products (http://www.evolution.com/). 1178 + * Submitted by Shawn M. Lavelle. 1179 + */ 1180 + #define EVOLUTION_VID 0xDEEE /* Vendor ID */ 1181 + #define EVOLUTION_ER1_PID 0x0300 /* ER1 Control Module */ 1182 + #define EVO_8U232AM_PID 0x02FF /* Evolution robotics RCM2 (FT232AM)*/ 1183 + #define EVO_HYBRID_PID 0x0302 /* Evolution robotics RCM4 PID (FT232BM)*/ 1184 + #define EVO_RCM4_PID 0x0303 /* Evolution robotics RCM4 PID */ 1185 + 1186 + /* 1187 + * MJS Gadgets HD Radio / XM Radio / Sirius Radio interfaces (using VID 0x0403) 1188 + */ 1189 + #define MJSG_GENERIC_PID 0x9378 1190 + #define MJSG_SR_RADIO_PID 0x9379 1191 + #define MJSG_XM_RADIO_PID 0x937A 1192 + #define MJSG_HD_RADIO_PID 0x937C 1193 + 1194 + /* 1195 + * D.O.Tec products (http://www.directout.eu) 1196 + */ 1197 + #define FTDI_DOTEC_PID 0x9868 1198 + 1199 + /* 1200 + * Xverve Signalyzer tools (http://www.signalyzer.com/) 1201 + */ 1202 + #define XVERVE_SIGNALYZER_ST_PID 0xBCA0 1203 + #define XVERVE_SIGNALYZER_SLITE_PID 0xBCA1 1204 + #define XVERVE_SIGNALYZER_SH2_PID 0xBCA2 1205 + #define XVERVE_SIGNALYZER_SH4_PID 0xBCA4 1206 + 1207 + /* 1208 + * Segway Robotic Mobility Platform USB interface (using VID 0x0403) 1209 + * Submitted by John G. Rogers 1210 + */ 1211 + #define SEGWAY_RMP200_PID 0xe729 1212 + 1213 + 1214 + /* 1215 + * Accesio USB Data Acquisition products (http://www.accesio.com/) 1216 + */ 1217 + #define ACCESIO_COM4SM_PID 0xD578 1218 + 1219 + /* www.sciencescope.co.uk educational dataloggers */ 1220 + #define FTDI_SCIENCESCOPE_LOGBOOKML_PID 0xFF18 1221 + #define FTDI_SCIENCESCOPE_LS_LOGBOOK_PID 0xFF1C 1222 + #define FTDI_SCIENCESCOPE_HS_LOGBOOK_PID 0xFF1D 1223 + 1224 + /* 1225 + * Milkymist One JTAG/Serial 1226 + */ 1227 + #define QIHARDWARE_VID 0x20B7 1228 + #define MILKYMISTONE_JTAGSERIAL_PID 0x0713 1229 + 1230 + /* 1231 + * CTI GmbH RS485 Converter http://www.cti-lean.com/ 1232 + */ 1233 + /* USB-485-Mini*/ 1234 + #define FTDI_CTI_MINI_PID 0xF608 1235 + /* USB-Nano-485*/ 1236 + #define FTDI_CTI_NANO_PID 0xF60B 1237 + 1238 + /* 1239 + * ZeitControl cardsystems GmbH rfid-readers http://zeitconrol.de 1240 + */ 1241 + /* TagTracer MIFARE*/ 1242 + #define FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID 0xF7C0 1243 + 1244 + /* 1245 + * Rainforest Automation 1246 + */ 1247 + /* ZigBee controller */ 1248 + #define FTDI_RF_R106 0x8A28 1249 + 1250 + /* 1251 + * Product: HCP HIT GPRS modem 1252 + * Manufacturer: HCP d.o.o. 1253 + * ATI command output: Cinterion MC55i 1254 + */ 1255 + #define FTDI_CINTERION_MC55I_PID 0xA951
+150
hw/usb/quirks-pl2303-ids.h
··· 1 + /* 2 + * Prolific PL2303 USB to serial adaptor driver header file 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License as published by 6 + * the Free Software Foundation; either version 2 of the License, or 7 + * (at your option) any later version. 8 + * 9 + */ 10 + 11 + #define BENQ_VENDOR_ID 0x04a5 12 + #define BENQ_PRODUCT_ID_S81 0x4027 13 + 14 + #define PL2303_VENDOR_ID 0x067b 15 + #define PL2303_PRODUCT_ID 0x2303 16 + #define PL2303_PRODUCT_ID_RSAQ2 0x04bb 17 + #define PL2303_PRODUCT_ID_DCU11 0x1234 18 + #define PL2303_PRODUCT_ID_PHAROS 0xaaa0 19 + #define PL2303_PRODUCT_ID_RSAQ3 0xaaa2 20 + #define PL2303_PRODUCT_ID_ALDIGA 0x0611 21 + #define PL2303_PRODUCT_ID_MMX 0x0612 22 + #define PL2303_PRODUCT_ID_GPRS 0x0609 23 + #define PL2303_PRODUCT_ID_HCR331 0x331a 24 + #define PL2303_PRODUCT_ID_MOTOROLA 0x0307 25 + 26 + #define ATEN_VENDOR_ID 0x0557 27 + #define ATEN_VENDOR_ID2 0x0547 28 + #define ATEN_PRODUCT_ID 0x2008 29 + 30 + #define IODATA_VENDOR_ID 0x04bb 31 + #define IODATA_PRODUCT_ID 0x0a03 32 + #define IODATA_PRODUCT_ID_RSAQ5 0x0a0e 33 + 34 + #define ELCOM_VENDOR_ID 0x056e 35 + #define ELCOM_PRODUCT_ID 0x5003 36 + #define ELCOM_PRODUCT_ID_UCSGT 0x5004 37 + 38 + #define ITEGNO_VENDOR_ID 0x0eba 39 + #define ITEGNO_PRODUCT_ID 0x1080 40 + #define ITEGNO_PRODUCT_ID_2080 0x2080 41 + 42 + #define MA620_VENDOR_ID 0x0df7 43 + #define MA620_PRODUCT_ID 0x0620 44 + 45 + #define RATOC_VENDOR_ID 0x0584 46 + #define RATOC_PRODUCT_ID 0xb000 47 + 48 + #define TRIPP_VENDOR_ID 0x2478 49 + #define TRIPP_PRODUCT_ID 0x2008 50 + 51 + #define RADIOSHACK_VENDOR_ID 0x1453 52 + #define RADIOSHACK_PRODUCT_ID 0x4026 53 + 54 + #define DCU10_VENDOR_ID 0x0731 55 + #define DCU10_PRODUCT_ID 0x0528 56 + 57 + #define SITECOM_VENDOR_ID 0x6189 58 + #define SITECOM_PRODUCT_ID 0x2068 59 + 60 + /* Alcatel OT535/735 USB cable */ 61 + #define ALCATEL_VENDOR_ID 0x11f7 62 + #define ALCATEL_PRODUCT_ID 0x02df 63 + 64 + /* Samsung I330 phone cradle */ 65 + #define SAMSUNG_VENDOR_ID 0x04e8 66 + #define SAMSUNG_PRODUCT_ID 0x8001 67 + 68 + #define SIEMENS_VENDOR_ID 0x11f5 69 + #define SIEMENS_PRODUCT_ID_SX1 0x0001 70 + #define SIEMENS_PRODUCT_ID_X65 0x0003 71 + #define SIEMENS_PRODUCT_ID_X75 0x0004 72 + #define SIEMENS_PRODUCT_ID_EF81 0x0005 73 + 74 + #define SYNTECH_VENDOR_ID 0x0745 75 + #define SYNTECH_PRODUCT_ID 0x0001 76 + 77 + /* Nokia CA-42 Cable */ 78 + #define NOKIA_CA42_VENDOR_ID 0x078b 79 + #define NOKIA_CA42_PRODUCT_ID 0x1234 80 + 81 + /* CA-42 CLONE Cable www.ca-42.com chipset: Prolific Technology Inc */ 82 + #define CA_42_CA42_VENDOR_ID 0x10b5 83 + #define CA_42_CA42_PRODUCT_ID 0xac70 84 + 85 + #define SAGEM_VENDOR_ID 0x079b 86 + #define SAGEM_PRODUCT_ID 0x0027 87 + 88 + /* Leadtek GPS 9531 (ID 0413:2101) */ 89 + #define LEADTEK_VENDOR_ID 0x0413 90 + #define LEADTEK_9531_PRODUCT_ID 0x2101 91 + 92 + /* USB GSM cable from Speed Dragon Multimedia, Ltd */ 93 + #define SPEEDDRAGON_VENDOR_ID 0x0e55 94 + #define SPEEDDRAGON_PRODUCT_ID 0x110b 95 + 96 + /* DATAPILOT Universal-2 Phone Cable */ 97 + #define DATAPILOT_U2_VENDOR_ID 0x0731 98 + #define DATAPILOT_U2_PRODUCT_ID 0x2003 99 + 100 + /* Belkin "F5U257" Serial Adapter */ 101 + #define BELKIN_VENDOR_ID 0x050d 102 + #define BELKIN_PRODUCT_ID 0x0257 103 + 104 + /* Alcor Micro Corp. USB 2.0 TO RS-232 */ 105 + #define ALCOR_VENDOR_ID 0x058F 106 + #define ALCOR_PRODUCT_ID 0x9720 107 + 108 + /* Willcom WS002IN Data Driver (by NetIndex Inc.) */ 109 + #define WS002IN_VENDOR_ID 0x11f6 110 + #define WS002IN_PRODUCT_ID 0x2001 111 + 112 + /* Corega CG-USBRS232R Serial Adapter */ 113 + #define COREGA_VENDOR_ID 0x07aa 114 + #define COREGA_PRODUCT_ID 0x002a 115 + 116 + /* Y.C. Cable U.S.A., Inc - USB to RS-232 */ 117 + #define YCCABLE_VENDOR_ID 0x05ad 118 + #define YCCABLE_PRODUCT_ID 0x0fba 119 + 120 + /* "Superial" USB - Serial */ 121 + #define SUPERIAL_VENDOR_ID 0x5372 122 + #define SUPERIAL_PRODUCT_ID 0x2303 123 + 124 + /* Hewlett-Packard LD220-HP POS Pole Display */ 125 + #define HP_VENDOR_ID 0x03f0 126 + #define HP_LD220_PRODUCT_ID 0x3524 127 + 128 + /* Cressi Edy (diving computer) PC interface */ 129 + #define CRESSI_VENDOR_ID 0x04b8 130 + #define CRESSI_EDY_PRODUCT_ID 0x0521 131 + 132 + /* Zeagle dive computer interface */ 133 + #define ZEAGLE_VENDOR_ID 0x04b8 134 + #define ZEAGLE_N2ITION3_PRODUCT_ID 0x0522 135 + 136 + /* Sony, USB data cable for CMD-Jxx mobile phones */ 137 + #define SONY_VENDOR_ID 0x054c 138 + #define SONY_QN3USB_PRODUCT_ID 0x0437 139 + 140 + /* Sanwa KB-USB2 multimeter cable (ID: 11ad:0001) */ 141 + #define SANWA_VENDOR_ID 0x11ad 142 + #define SANWA_PRODUCT_ID 0x0001 143 + 144 + /* ADLINK ND-6530 RS232,RS485 and RS422 adapter */ 145 + #define ADLINK_VENDOR_ID 0x0b63 146 + #define ADLINK_ND6530_PRODUCT_ID 0x6530 147 + 148 + /* SMART USB Serial Adapter */ 149 + #define SMART_VENDOR_ID 0x0b8c 150 + #define SMART_PRODUCT_ID 0x2303
+53
hw/usb/quirks.c
··· 1 + /* 2 + * USB quirk handling 3 + * 4 + * Copyright (c) 2012 Red Hat, Inc. 5 + * 6 + * Red Hat Authors: 7 + * Hans de Goede <hdegoede@redhat.com> 8 + * 9 + * This program is free software; you can redistribute it and/or modify 10 + * it under the terms of the GNU General Public License as published by 11 + * the Free Software Foundation; either version 2 of the License, or 12 + * (at your option) any later version. 13 + */ 14 + 15 + #include "quirks.h" 16 + #include "hw/usb.h" 17 + 18 + static bool usb_id_match(const struct usb_device_id *ids, 19 + uint16_t vendor_id, uint16_t product_id, 20 + uint8_t interface_class, uint8_t interface_subclass, 21 + uint8_t interface_protocol) { 22 + int i; 23 + 24 + for (i = 0; ids[i].vendor_id != -1; i++) { 25 + if (ids[i].vendor_id == vendor_id && 26 + ids[i].product_id == product_id && 27 + (ids[i].interface_class == -1 || 28 + (ids[i].interface_class == interface_class && 29 + ids[i].interface_subclass == interface_subclass && 30 + ids[i].interface_protocol == interface_protocol))) { 31 + return true; 32 + } 33 + } 34 + return false; 35 + } 36 + 37 + int usb_get_quirks(uint16_t vendor_id, uint16_t product_id, 38 + uint8_t interface_class, uint8_t interface_subclass, 39 + uint8_t interface_protocol) 40 + { 41 + int quirks = 0; 42 + 43 + if (usb_id_match(usbredir_raw_serial_ids, vendor_id, product_id, 44 + interface_class, interface_subclass, interface_protocol)) { 45 + quirks |= USB_QUIRK_BUFFER_BULK_IN; 46 + } 47 + if (usb_id_match(usbredir_ftdi_serial_ids, vendor_id, product_id, 48 + interface_class, interface_subclass, interface_protocol)) { 49 + quirks |= USB_QUIRK_BUFFER_BULK_IN | USB_QUIRK_IS_FTDI; 50 + } 51 + 52 + return quirks; 53 + }
+910
hw/usb/quirks.h
··· 1 + /* 2 + * USB quirk handling 3 + * 4 + * Copyright (c) 2012 Red Hat, Inc. 5 + * 6 + * Red Hat Authors: 7 + * Hans de Goede <hdegoede@redhat.com> 8 + * 9 + * This program is free software; you can redistribute it and/or modify 10 + * it under the terms of the GNU General Public License as published by 11 + * the Free Software Foundation; either version 2 of the License, or 12 + * (at your option) any later version. 13 + */ 14 + 15 + /* 1 on 1 copy of linux/drivers/usb/serial/ftdi_sio_ids.h */ 16 + #include "quirks-ftdi-ids.h" 17 + /* 1 on 1 copy of linux/drivers/usb/serial/pl2303.h */ 18 + #include "quirks-pl2303-ids.h" 19 + 20 + struct usb_device_id { 21 + int vendor_id; 22 + int product_id; 23 + int interface_class; 24 + int interface_subclass; 25 + int interface_protocol; 26 + }; 27 + 28 + #define USB_DEVICE(vendor, product) \ 29 + .vendor_id = vendor, .product_id = product, .interface_class = -1, 30 + 31 + #define USB_DEVICE_AND_INTERFACE_INFO(vend, prod, iclass, isubclass, iproto) \ 32 + .vendor_id = vend, .product_id = prod, .interface_class = iclass, \ 33 + .interface_subclass = isubclass, .interface_protocol = iproto 34 + 35 + static const struct usb_device_id usbredir_raw_serial_ids[] = { 36 + /* 37 + * Silicon Laboratories CP210x USB to RS232 serial adapter ids 38 + * copied from linux/drivers/usb/serial/cp210x.c 39 + * 40 + * Copyright (C) 2005 Craig Shelley (craig@microtron.org.uk) 41 + */ 42 + { USB_DEVICE(0x045B, 0x0053) }, /* Renesas RX610 RX-Stick */ 43 + { USB_DEVICE(0x0471, 0x066A) }, /* AKTAKOM ACE-1001 cable */ 44 + { USB_DEVICE(0x0489, 0xE000) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */ 45 + { USB_DEVICE(0x0489, 0xE003) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */ 46 + { USB_DEVICE(0x0745, 0x1000) }, /* CipherLab USB CCD Barcode Scanner 1000 */ 47 + { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */ 48 + { USB_DEVICE(0x08FD, 0x000A) }, /* Digianswer A/S , ZigBee/802.15.4 MAC Device */ 49 + { USB_DEVICE(0x0BED, 0x1100) }, /* MEI (TM) Cashflow-SC Bill/Voucher Acceptor */ 50 + { USB_DEVICE(0x0BED, 0x1101) }, /* MEI series 2000 Combo Acceptor */ 51 + { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */ 52 + { USB_DEVICE(0x0FCF, 0x1004) }, /* Dynastream ANT2USB */ 53 + { USB_DEVICE(0x0FCF, 0x1006) }, /* Dynastream ANT development board */ 54 + { USB_DEVICE(0x10A6, 0xAA26) }, /* Knock-off DCU-11 cable */ 55 + { USB_DEVICE(0x10AB, 0x10C5) }, /* Siemens MC60 Cable */ 56 + { USB_DEVICE(0x10B5, 0xAC70) }, /* Nokia CA-42 USB */ 57 + { USB_DEVICE(0x10C4, 0x0F91) }, /* Vstabi */ 58 + { USB_DEVICE(0x10C4, 0x1101) }, /* Arkham Technology DS101 Bus Monitor */ 59 + { USB_DEVICE(0x10C4, 0x1601) }, /* Arkham Technology DS101 Adapter */ 60 + { USB_DEVICE(0x10C4, 0x800A) }, /* SPORTident BSM7-D-USB main station */ 61 + { USB_DEVICE(0x10C4, 0x803B) }, /* Pololu USB-serial converter */ 62 + { USB_DEVICE(0x10C4, 0x8044) }, /* Cygnal Debug Adapter */ 63 + { USB_DEVICE(0x10C4, 0x804E) }, /* Software Bisque Paramount ME build-in converter */ 64 + { USB_DEVICE(0x10C4, 0x8053) }, /* Enfora EDG1228 */ 65 + { USB_DEVICE(0x10C4, 0x8054) }, /* Enfora GSM2228 */ 66 + { USB_DEVICE(0x10C4, 0x8066) }, /* Argussoft In-System Programmer */ 67 + { USB_DEVICE(0x10C4, 0x806F) }, /* IMS USB to RS422 Converter Cable */ 68 + { USB_DEVICE(0x10C4, 0x807A) }, /* Crumb128 board */ 69 + { USB_DEVICE(0x10C4, 0x80C4) }, /* Cygnal Integrated Products, Inc., Optris infrared thermometer */ 70 + { USB_DEVICE(0x10C4, 0x80CA) }, /* Degree Controls Inc */ 71 + { USB_DEVICE(0x10C4, 0x80DD) }, /* Tracient RFID */ 72 + { USB_DEVICE(0x10C4, 0x80F6) }, /* Suunto sports instrument */ 73 + { USB_DEVICE(0x10C4, 0x8115) }, /* Arygon NFC/Mifare Reader */ 74 + { USB_DEVICE(0x10C4, 0x813D) }, /* Burnside Telecom Deskmobile */ 75 + { USB_DEVICE(0x10C4, 0x813F) }, /* Tams Master Easy Control */ 76 + { USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */ 77 + { USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */ 78 + { USB_DEVICE(0x10C4, 0x8156) }, /* B&G H3000 link cable */ 79 + { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */ 80 + { USB_DEVICE(0x10C4, 0x815F) }, /* Timewave HamLinkUSB */ 81 + { USB_DEVICE(0x10C4, 0x818B) }, /* AVIT Research USB to TTL */ 82 + { USB_DEVICE(0x10C4, 0x819F) }, /* MJS USB Toslink Switcher */ 83 + { USB_DEVICE(0x10C4, 0x81A6) }, /* ThinkOptics WavIt */ 84 + { USB_DEVICE(0x10C4, 0x81A9) }, /* Multiplex RC Interface */ 85 + { USB_DEVICE(0x10C4, 0x81AC) }, /* MSD Dash Hawk */ 86 + { USB_DEVICE(0x10C4, 0x81AD) }, /* INSYS USB Modem */ 87 + { USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, Baby-JTAG */ 88 + { USB_DEVICE(0x10C4, 0x81E2) }, /* Lipowsky Industrie Elektronik GmbH, Baby-LIN */ 89 + { USB_DEVICE(0x10C4, 0x81E7) }, /* Aerocomm Radio */ 90 + { USB_DEVICE(0x10C4, 0x81E8) }, /* Zephyr Bioharness */ 91 + { USB_DEVICE(0x10C4, 0x81F2) }, /* C1007 HF band RFID controller */ 92 + { USB_DEVICE(0x10C4, 0x8218) }, /* Lipowsky Industrie Elektronik GmbH, HARP-1 */ 93 + { USB_DEVICE(0x10C4, 0x822B) }, /* Modem EDGE(GSM) Comander 2 */ 94 + { USB_DEVICE(0x10C4, 0x826B) }, /* Cygnal Integrated Products, Inc., Fasttrax GPS demonstration module */ 95 + { USB_DEVICE(0x10C4, 0x8293) }, /* Telegesis ETRX2USB */ 96 + { USB_DEVICE(0x10C4, 0x82F9) }, /* Procyon AVS */ 97 + { USB_DEVICE(0x10C4, 0x8341) }, /* Siemens MC35PU GPRS Modem */ 98 + { USB_DEVICE(0x10C4, 0x8382) }, /* Cygnal Integrated Products, Inc. */ 99 + { USB_DEVICE(0x10C4, 0x83A8) }, /* Amber Wireless AMB2560 */ 100 + { USB_DEVICE(0x10C4, 0x83D8) }, /* DekTec DTA Plus VHF/UHF Booster/Attenuator */ 101 + { USB_DEVICE(0x10C4, 0x8411) }, /* Kyocera GPS Module */ 102 + { USB_DEVICE(0x10C4, 0x8418) }, /* IRZ Automation Teleport SG-10 GSM/GPRS Modem */ 103 + { USB_DEVICE(0x10C4, 0x846E) }, /* BEI USB Sensor Interface (VCP) */ 104 + { USB_DEVICE(0x10C4, 0x8477) }, /* Balluff RFID */ 105 + { USB_DEVICE(0x10C4, 0x85EA) }, /* AC-Services IBUS-IF */ 106 + { USB_DEVICE(0x10C4, 0x85EB) }, /* AC-Services CIS-IBUS */ 107 + { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ 108 + { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ 109 + { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ 110 + { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ 111 + { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ 112 + { USB_DEVICE(0x10C4, 0xEA80) }, /* Silicon Labs factory default */ 113 + { USB_DEVICE(0x10C4, 0xEA71) }, /* Infinity GPS-MIC-1 Radio Monophone */ 114 + { USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */ 115 + { USB_DEVICE(0x10C4, 0xF002) }, /* Elan Digital Systems USBwave12 */ 116 + { USB_DEVICE(0x10C4, 0xF003) }, /* Elan Digital Systems USBpulse100 */ 117 + { USB_DEVICE(0x10C4, 0xF004) }, /* Elan Digital Systems USBcount50 */ 118 + { USB_DEVICE(0x10C5, 0xEA61) }, /* Silicon Labs MobiData GPRS USB Modem */ 119 + { USB_DEVICE(0x10CE, 0xEA6A) }, /* Silicon Labs MobiData GPRS USB Modem 100EU */ 120 + { USB_DEVICE(0x13AD, 0x9999) }, /* Baltech card reader */ 121 + { USB_DEVICE(0x1555, 0x0004) }, /* Owen AC4 USB-RS485 Converter */ 122 + { USB_DEVICE(0x166A, 0x0201) }, /* Clipsal 5500PACA C-Bus Pascal Automation Controller */ 123 + { USB_DEVICE(0x166A, 0x0301) }, /* Clipsal 5800PC C-Bus Wireless PC Interface */ 124 + { USB_DEVICE(0x166A, 0x0303) }, /* Clipsal 5500PCU C-Bus USB interface */ 125 + { USB_DEVICE(0x166A, 0x0304) }, /* Clipsal 5000CT2 C-Bus Black and White Touchscreen */ 126 + { USB_DEVICE(0x166A, 0x0305) }, /* Clipsal C-5000CT2 C-Bus Spectrum Colour Touchscreen */ 127 + { USB_DEVICE(0x166A, 0x0401) }, /* Clipsal L51xx C-Bus Architectural Dimmer */ 128 + { USB_DEVICE(0x166A, 0x0101) }, /* Clipsal 5560884 C-Bus Multi-room Audio Matrix Switcher */ 129 + { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */ 130 + { USB_DEVICE(0x16DC, 0x0010) }, /* W-IE-NE-R Plein & Baus GmbH PL512 Power Supply */ 131 + { USB_DEVICE(0x16DC, 0x0011) }, /* W-IE-NE-R Plein & Baus GmbH RCM Remote Control for MARATON Power Supply */ 132 + { USB_DEVICE(0x16DC, 0x0012) }, /* W-IE-NE-R Plein & Baus GmbH MPOD Multi Channel Power Supply */ 133 + { USB_DEVICE(0x16DC, 0x0015) }, /* W-IE-NE-R Plein & Baus GmbH CML Control, Monitoring and Data Logger */ 134 + { USB_DEVICE(0x17A8, 0x0001) }, /* Kamstrup Optical Eye/3-wire */ 135 + { USB_DEVICE(0x17A8, 0x0005) }, /* Kamstrup M-Bus Master MultiPort 250D */ 136 + { USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */ 137 + { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ 138 + { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ 139 + { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */ 140 + { USB_DEVICE(0x1E29, 0x0102) }, /* Festo CPX-USB */ 141 + { USB_DEVICE(0x1E29, 0x0501) }, /* Festo CMSP */ 142 + { USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */ 143 + { USB_DEVICE(0x3195, 0xF280) }, /* Link Instruments MSO-28 */ 144 + { USB_DEVICE(0x3195, 0xF281) }, /* Link Instruments MSO-28 */ 145 + { USB_DEVICE(0x413C, 0x9500) }, /* DW700 GPS USB interface */ 146 + 147 + /* 148 + * Prolific pl2303 USB to RS232 serial adapter ids 149 + * copied from linux/drivers/usb/serial/pl2303.c 150 + * 151 + * Copyright (C) 2001-2007 Greg Kroah-Hartman (greg@kroah.com) 152 + * Copyright (C) 2003 IBM Corp. 153 + */ 154 + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) }, 155 + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) }, 156 + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) }, 157 + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) }, 158 + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) }, 159 + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) }, 160 + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) }, 161 + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) }, 162 + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) }, 163 + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) }, 164 + { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, 165 + { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) }, 166 + { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) }, 167 + { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) }, 168 + { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) }, 169 + { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) }, 170 + { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) }, 171 + { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) }, 172 + { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) }, 173 + { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) }, 174 + { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) }, 175 + { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) }, 176 + { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) }, 177 + { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) }, 178 + { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) }, 179 + { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) }, 180 + { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) }, 181 + { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) }, 182 + { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) }, 183 + { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81) }, 184 + { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */ 185 + { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) }, 186 + { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) }, 187 + { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) }, 188 + { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) }, 189 + { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) }, 190 + { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) }, 191 + { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) }, 192 + { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) }, 193 + { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) }, 194 + { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) }, 195 + { USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) }, 196 + { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) }, 197 + { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) }, 198 + { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) }, 199 + { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) }, 200 + { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) }, 201 + { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) }, 202 + { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) }, 203 + { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) }, 204 + { USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) }, 205 + 206 + { USB_DEVICE(-1, -1) } /* Terminating Entry */ 207 + }; 208 + 209 + static const struct usb_device_id usbredir_ftdi_serial_ids[] = { 210 + /* 211 + * FTDI USB to RS232 serial adapter ids 212 + * copied from linux/drivers/usb/serial/ftdi_sio.c 213 + * 214 + * Copyright (C) 2009 - 2010 215 + * Johan Hovold (jhovold@gmail.com) 216 + * Copyright (C) 1999 - 2001 217 + * Greg Kroah-Hartman (greg@kroah.com) 218 + * Bill Ryder (bryder@sgi.com) 219 + * Copyright (C) 2002 220 + * Kuba Ober (kuba@mareimbrium.org) 221 + */ 222 + { USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) }, 223 + { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) }, 224 + { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) }, 225 + { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) }, 226 + { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) }, 227 + { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) }, 228 + { USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) }, 229 + { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) }, 230 + { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) }, 231 + { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) }, 232 + { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_3_PID) }, 233 + { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_4_PID) }, 234 + { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_5_PID) }, 235 + { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_6_PID) }, 236 + { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_7_PID) }, 237 + { USB_DEVICE(FTDI_VID, FTDI_USINT_CAT_PID) }, 238 + { USB_DEVICE(FTDI_VID, FTDI_USINT_WKEY_PID) }, 239 + { USB_DEVICE(FTDI_VID, FTDI_USINT_RS232_PID) }, 240 + { USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) }, 241 + { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) }, 242 + { USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) }, 243 + { USB_DEVICE(FTDI_VID, FTDI_IPLUS2_PID) }, 244 + { USB_DEVICE(FTDI_VID, FTDI_DMX4ALL) }, 245 + { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) }, 246 + { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) }, 247 + { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) }, 248 + { USB_DEVICE(FTDI_VID, FTDI_232RL_PID) }, 249 + { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, 250 + { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) }, 251 + { USB_DEVICE(FTDI_VID, FTDI_232H_PID) }, 252 + { USB_DEVICE(FTDI_VID, FTDI_FTX_PID) }, 253 + { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, 254 + { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, 255 + { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) }, 256 + { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_SNIFFER_PID) }, 257 + { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) }, 258 + { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) }, 259 + { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) }, 260 + { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, 261 + { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, 262 + { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) }, 263 + { USB_DEVICE(FTDI_VID, FTDI_LENZ_LIUSB_PID) }, 264 + { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) }, 265 + { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) }, 266 + { USB_DEVICE(FTDI_VID, FTDI_XF_547_PID) }, 267 + { USB_DEVICE(FTDI_VID, FTDI_XF_633_PID) }, 268 + { USB_DEVICE(FTDI_VID, FTDI_XF_631_PID) }, 269 + { USB_DEVICE(FTDI_VID, FTDI_XF_635_PID) }, 270 + { USB_DEVICE(FTDI_VID, FTDI_XF_640_PID) }, 271 + { USB_DEVICE(FTDI_VID, FTDI_XF_642_PID) }, 272 + { USB_DEVICE(FTDI_VID, FTDI_DSS20_PID) }, 273 + { USB_DEVICE(FTDI_VID, FTDI_URBAN_0_PID) }, 274 + { USB_DEVICE(FTDI_VID, FTDI_URBAN_1_PID) }, 275 + { USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) }, 276 + { USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) }, 277 + { USB_DEVICE(FTDI_VID, FTDI_MTXORB_0_PID) }, 278 + { USB_DEVICE(FTDI_VID, FTDI_MTXORB_1_PID) }, 279 + { USB_DEVICE(FTDI_VID, FTDI_MTXORB_2_PID) }, 280 + { USB_DEVICE(FTDI_VID, FTDI_MTXORB_3_PID) }, 281 + { USB_DEVICE(FTDI_VID, FTDI_MTXORB_4_PID) }, 282 + { USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) }, 283 + { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) }, 284 + { USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) }, 285 + { USB_DEVICE(FTDI_VID, FTDI_VARDAAN_PID) }, 286 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) }, 287 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) }, 288 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) }, 289 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0103_PID) }, 290 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0104_PID) }, 291 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0105_PID) }, 292 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0106_PID) }, 293 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0107_PID) }, 294 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0108_PID) }, 295 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0109_PID) }, 296 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010A_PID) }, 297 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010B_PID) }, 298 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010C_PID) }, 299 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010D_PID) }, 300 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010E_PID) }, 301 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010F_PID) }, 302 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0110_PID) }, 303 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0111_PID) }, 304 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0112_PID) }, 305 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0113_PID) }, 306 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0114_PID) }, 307 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0115_PID) }, 308 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0116_PID) }, 309 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0117_PID) }, 310 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0118_PID) }, 311 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0119_PID) }, 312 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011A_PID) }, 313 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011B_PID) }, 314 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011C_PID) }, 315 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011D_PID) }, 316 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011E_PID) }, 317 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011F_PID) }, 318 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0120_PID) }, 319 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0121_PID) }, 320 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0122_PID) }, 321 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0123_PID) }, 322 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0124_PID) }, 323 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0125_PID) }, 324 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0126_PID) }, 325 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0127_PID) }, 326 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0128_PID) }, 327 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0129_PID) }, 328 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012A_PID) }, 329 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012B_PID) }, 330 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012C_PID) }, 331 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012D_PID) }, 332 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012E_PID) }, 333 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012F_PID) }, 334 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0130_PID) }, 335 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0131_PID) }, 336 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0132_PID) }, 337 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0133_PID) }, 338 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0134_PID) }, 339 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0135_PID) }, 340 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0136_PID) }, 341 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0137_PID) }, 342 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0138_PID) }, 343 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0139_PID) }, 344 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013A_PID) }, 345 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013B_PID) }, 346 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013C_PID) }, 347 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013D_PID) }, 348 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013E_PID) }, 349 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013F_PID) }, 350 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0140_PID) }, 351 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0141_PID) }, 352 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0142_PID) }, 353 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0143_PID) }, 354 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0144_PID) }, 355 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0145_PID) }, 356 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0146_PID) }, 357 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0147_PID) }, 358 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0148_PID) }, 359 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0149_PID) }, 360 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014A_PID) }, 361 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014B_PID) }, 362 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014C_PID) }, 363 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014D_PID) }, 364 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014E_PID) }, 365 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014F_PID) }, 366 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0150_PID) }, 367 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0151_PID) }, 368 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0152_PID) }, 369 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0153_PID) }, 370 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0154_PID) }, 371 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0155_PID) }, 372 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0156_PID) }, 373 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0157_PID) }, 374 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0158_PID) }, 375 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0159_PID) }, 376 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015A_PID) }, 377 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015B_PID) }, 378 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015C_PID) }, 379 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015D_PID) }, 380 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015E_PID) }, 381 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015F_PID) }, 382 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0160_PID) }, 383 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0161_PID) }, 384 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0162_PID) }, 385 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0163_PID) }, 386 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0164_PID) }, 387 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0165_PID) }, 388 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0166_PID) }, 389 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0167_PID) }, 390 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0168_PID) }, 391 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0169_PID) }, 392 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016A_PID) }, 393 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016B_PID) }, 394 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016C_PID) }, 395 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016D_PID) }, 396 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016E_PID) }, 397 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016F_PID) }, 398 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0170_PID) }, 399 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0171_PID) }, 400 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0172_PID) }, 401 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0173_PID) }, 402 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0174_PID) }, 403 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0175_PID) }, 404 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0176_PID) }, 405 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0177_PID) }, 406 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0178_PID) }, 407 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0179_PID) }, 408 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017A_PID) }, 409 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017B_PID) }, 410 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017C_PID) }, 411 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017D_PID) }, 412 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017E_PID) }, 413 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017F_PID) }, 414 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0180_PID) }, 415 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0181_PID) }, 416 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0182_PID) }, 417 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0183_PID) }, 418 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0184_PID) }, 419 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0185_PID) }, 420 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0186_PID) }, 421 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0187_PID) }, 422 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0188_PID) }, 423 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0189_PID) }, 424 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018A_PID) }, 425 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018B_PID) }, 426 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018C_PID) }, 427 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018D_PID) }, 428 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018E_PID) }, 429 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018F_PID) }, 430 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0190_PID) }, 431 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0191_PID) }, 432 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0192_PID) }, 433 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0193_PID) }, 434 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0194_PID) }, 435 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0195_PID) }, 436 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0196_PID) }, 437 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0197_PID) }, 438 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0198_PID) }, 439 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0199_PID) }, 440 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019A_PID) }, 441 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019B_PID) }, 442 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019C_PID) }, 443 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019D_PID) }, 444 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019E_PID) }, 445 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019F_PID) }, 446 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A0_PID) }, 447 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A1_PID) }, 448 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A2_PID) }, 449 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A3_PID) }, 450 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A4_PID) }, 451 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A5_PID) }, 452 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A6_PID) }, 453 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A7_PID) }, 454 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A8_PID) }, 455 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A9_PID) }, 456 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AA_PID) }, 457 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AB_PID) }, 458 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AC_PID) }, 459 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AD_PID) }, 460 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AE_PID) }, 461 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AF_PID) }, 462 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B0_PID) }, 463 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B1_PID) }, 464 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B2_PID) }, 465 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B3_PID) }, 466 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B4_PID) }, 467 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B5_PID) }, 468 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B6_PID) }, 469 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B7_PID) }, 470 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B8_PID) }, 471 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B9_PID) }, 472 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BA_PID) }, 473 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BB_PID) }, 474 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BC_PID) }, 475 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BD_PID) }, 476 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BE_PID) }, 477 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BF_PID) }, 478 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C0_PID) }, 479 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C1_PID) }, 480 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C2_PID) }, 481 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C3_PID) }, 482 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C4_PID) }, 483 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C5_PID) }, 484 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C6_PID) }, 485 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C7_PID) }, 486 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C8_PID) }, 487 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C9_PID) }, 488 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CA_PID) }, 489 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CB_PID) }, 490 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CC_PID) }, 491 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CD_PID) }, 492 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CE_PID) }, 493 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CF_PID) }, 494 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D0_PID) }, 495 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D1_PID) }, 496 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D2_PID) }, 497 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D3_PID) }, 498 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D4_PID) }, 499 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D5_PID) }, 500 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D6_PID) }, 501 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D7_PID) }, 502 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D8_PID) }, 503 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D9_PID) }, 504 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DA_PID) }, 505 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DB_PID) }, 506 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DC_PID) }, 507 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DD_PID) }, 508 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DE_PID) }, 509 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DF_PID) }, 510 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E0_PID) }, 511 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E1_PID) }, 512 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E2_PID) }, 513 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E3_PID) }, 514 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E4_PID) }, 515 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E5_PID) }, 516 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E6_PID) }, 517 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E7_PID) }, 518 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E8_PID) }, 519 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E9_PID) }, 520 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EA_PID) }, 521 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EB_PID) }, 522 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EC_PID) }, 523 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01ED_PID) }, 524 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EE_PID) }, 525 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EF_PID) }, 526 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F0_PID) }, 527 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F1_PID) }, 528 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F2_PID) }, 529 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F3_PID) }, 530 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F4_PID) }, 531 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F5_PID) }, 532 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F6_PID) }, 533 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F7_PID) }, 534 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F8_PID) }, 535 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F9_PID) }, 536 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FA_PID) }, 537 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FB_PID) }, 538 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FC_PID) }, 539 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FD_PID) }, 540 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FE_PID) }, 541 + { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FF_PID) }, 542 + { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) }, 543 + { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) }, 544 + { USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) }, 545 + { USB_DEVICE(FTDI_VID, FTDI_USBX_707_PID) }, 546 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) }, 547 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) }, 548 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) }, 549 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2104_PID) }, 550 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2106_PID) }, 551 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_1_PID) }, 552 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_2_PID) }, 553 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_1_PID) }, 554 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_2_PID) }, 555 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_1_PID) }, 556 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_2_PID) }, 557 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_1_PID) }, 558 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_2_PID) }, 559 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_3_PID) }, 560 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_4_PID) }, 561 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_1_PID) }, 562 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_2_PID) }, 563 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_3_PID) }, 564 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_4_PID) }, 565 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_1_PID) }, 566 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_2_PID) }, 567 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_3_PID) }, 568 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_4_PID) }, 569 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_1_PID) }, 570 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_2_PID) }, 571 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_3_PID) }, 572 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_4_PID) }, 573 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_5_PID) }, 574 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_6_PID) }, 575 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_7_PID) }, 576 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_8_PID) }, 577 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_1_PID) }, 578 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_2_PID) }, 579 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_3_PID) }, 580 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_4_PID) }, 581 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_5_PID) }, 582 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_6_PID) }, 583 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_7_PID) }, 584 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_8_PID) }, 585 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_1_PID) }, 586 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_2_PID) }, 587 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_3_PID) }, 588 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_4_PID) }, 589 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_5_PID) }, 590 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_6_PID) }, 591 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_7_PID) }, 592 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) }, 593 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_1_PID) }, 594 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_2_PID) }, 595 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_3_PID) }, 596 + { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_4_PID) }, 597 + { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) }, 598 + { USB_DEVICE(OCT_VID, OCT_US101_PID) }, 599 + { USB_DEVICE(OCT_VID, OCT_DK201_PID) }, 600 + { USB_DEVICE(FTDI_VID, FTDI_HE_TIRA1_PID) }, 601 + { USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID) }, 602 + { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_1) }, 603 + { USB_DEVICE(FTDI_VID, PROTEGO_R2X0) }, 604 + { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) }, 605 + { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_4) }, 606 + { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E808_PID) }, 607 + { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E809_PID) }, 608 + { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80A_PID) }, 609 + { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80B_PID) }, 610 + { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80C_PID) }, 611 + { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80D_PID) }, 612 + { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80E_PID) }, 613 + { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80F_PID) }, 614 + { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E888_PID) }, 615 + { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E889_PID) }, 616 + { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88A_PID) }, 617 + { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88B_PID) }, 618 + { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88C_PID) }, 619 + { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88D_PID) }, 620 + { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88E_PID) }, 621 + { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88F_PID) }, 622 + { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) }, 623 + { USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) }, 624 + { USB_DEVICE(FTDI_VID, FTDI_ELV_UR100_PID) }, 625 + { USB_DEVICE(FTDI_VID, FTDI_ELV_ALC8500_PID) }, 626 + { USB_DEVICE(FTDI_VID, FTDI_PYRAMID_PID) }, 627 + { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1000PC_PID) }, 628 + { USB_DEVICE(FTDI_VID, FTDI_IBS_US485_PID) }, 629 + { USB_DEVICE(FTDI_VID, FTDI_IBS_PICPRO_PID) }, 630 + { USB_DEVICE(FTDI_VID, FTDI_IBS_PCMCIA_PID) }, 631 + { USB_DEVICE(FTDI_VID, FTDI_IBS_PK1_PID) }, 632 + { USB_DEVICE(FTDI_VID, FTDI_IBS_RS232MON_PID) }, 633 + { USB_DEVICE(FTDI_VID, FTDI_IBS_APP70_PID) }, 634 + { USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) }, 635 + { USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) }, 636 + { USB_DEVICE(FTDI_VID, FTDI_TAVIR_STK500_PID) }, 637 + { USB_DEVICE(FTDI_VID, FTDI_TIAO_UMPA_PID) }, 638 + /* 639 + * ELV devices: 640 + */ 641 + { USB_DEVICE(FTDI_VID, FTDI_ELV_USR_PID) }, 642 + { USB_DEVICE(FTDI_VID, FTDI_ELV_MSM1_PID) }, 643 + { USB_DEVICE(FTDI_VID, FTDI_ELV_KL100_PID) }, 644 + { USB_DEVICE(FTDI_VID, FTDI_ELV_WS550_PID) }, 645 + { USB_DEVICE(FTDI_VID, FTDI_ELV_EC3000_PID) }, 646 + { USB_DEVICE(FTDI_VID, FTDI_ELV_WS888_PID) }, 647 + { USB_DEVICE(FTDI_VID, FTDI_ELV_TWS550_PID) }, 648 + { USB_DEVICE(FTDI_VID, FTDI_ELV_FEM_PID) }, 649 + { USB_DEVICE(FTDI_VID, FTDI_ELV_CLI7000_PID) }, 650 + { USB_DEVICE(FTDI_VID, FTDI_ELV_PPS7330_PID) }, 651 + { USB_DEVICE(FTDI_VID, FTDI_ELV_TFM100_PID) }, 652 + { USB_DEVICE(FTDI_VID, FTDI_ELV_UDF77_PID) }, 653 + { USB_DEVICE(FTDI_VID, FTDI_ELV_UIO88_PID) }, 654 + { USB_DEVICE(FTDI_VID, FTDI_ELV_UAD8_PID) }, 655 + { USB_DEVICE(FTDI_VID, FTDI_ELV_UDA7_PID) }, 656 + { USB_DEVICE(FTDI_VID, FTDI_ELV_USI2_PID) }, 657 + { USB_DEVICE(FTDI_VID, FTDI_ELV_T1100_PID) }, 658 + { USB_DEVICE(FTDI_VID, FTDI_ELV_PCD200_PID) }, 659 + { USB_DEVICE(FTDI_VID, FTDI_ELV_ULA200_PID) }, 660 + { USB_DEVICE(FTDI_VID, FTDI_ELV_CSI8_PID) }, 661 + { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1000DL_PID) }, 662 + { USB_DEVICE(FTDI_VID, FTDI_ELV_PCK100_PID) }, 663 + { USB_DEVICE(FTDI_VID, FTDI_ELV_RFP500_PID) }, 664 + { USB_DEVICE(FTDI_VID, FTDI_ELV_FS20SIG_PID) }, 665 + { USB_DEVICE(FTDI_VID, FTDI_ELV_UTP8_PID) }, 666 + { USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) }, 667 + { USB_DEVICE(FTDI_VID, FTDI_ELV_WS444PC_PID) }, 668 + { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) }, 669 + { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1010PC_PID) }, 670 + { USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) }, 671 + { USB_DEVICE(FTDI_VID, FTDI_ELV_HS485_PID) }, 672 + { USB_DEVICE(FTDI_VID, FTDI_ELV_UMS100_PID) }, 673 + { USB_DEVICE(FTDI_VID, FTDI_ELV_TFD128_PID) }, 674 + { USB_DEVICE(FTDI_VID, FTDI_ELV_FM3RX_PID) }, 675 + { USB_DEVICE(FTDI_VID, FTDI_ELV_WS777_PID) }, 676 + { USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) }, 677 + { USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) }, 678 + { USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) }, 679 + { USB_DEVICE(FTDI_VID, LINX_FUTURE_1_PID) }, 680 + { USB_DEVICE(FTDI_VID, LINX_FUTURE_2_PID) }, 681 + { USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) }, 682 + { USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) }, 683 + { USB_DEVICE(FTDI_VID, FTDI_CCSMACHX_2_PID) }, 684 + { USB_DEVICE(FTDI_VID, FTDI_CCSLOAD_N_GO_3_PID) }, 685 + { USB_DEVICE(FTDI_VID, FTDI_CCSICDU64_4_PID) }, 686 + { USB_DEVICE(FTDI_VID, FTDI_CCSPRIME8_5_PID) }, 687 + { USB_DEVICE(FTDI_VID, INSIDE_ACCESSO) }, 688 + { USB_DEVICE(INTREPID_VID, INTREPID_VALUECAN_PID) }, 689 + { USB_DEVICE(INTREPID_VID, INTREPID_NEOVI_PID) }, 690 + { USB_DEVICE(FALCOM_VID, FALCOM_TWIST_PID) }, 691 + { USB_DEVICE(FALCOM_VID, FALCOM_SAMBA_PID) }, 692 + { USB_DEVICE(FTDI_VID, FTDI_SUUNTO_SPORTS_PID) }, 693 + { USB_DEVICE(FTDI_VID, FTDI_OCEANIC_PID) }, 694 + { USB_DEVICE(TTI_VID, TTI_QL355P_PID) }, 695 + { USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) }, 696 + { USB_DEVICE(ACTON_VID, ACTON_SPECTRAPRO_PID) }, 697 + { USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) }, 698 + { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) }, 699 + { USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) }, 700 + { USB_DEVICE(BANDB_VID, BANDB_USO9ML2_PID) }, 701 + { USB_DEVICE(BANDB_VID, BANDB_USOPTL4_PID) }, 702 + { USB_DEVICE(BANDB_VID, BANDB_USPTL4_PID) }, 703 + { USB_DEVICE(BANDB_VID, BANDB_USO9ML2DR_2_PID) }, 704 + { USB_DEVICE(BANDB_VID, BANDB_USO9ML2DR_PID) }, 705 + { USB_DEVICE(BANDB_VID, BANDB_USOPTL4DR2_PID) }, 706 + { USB_DEVICE(BANDB_VID, BANDB_USOPTL4DR_PID) }, 707 + { USB_DEVICE(BANDB_VID, BANDB_485USB9F_2W_PID) }, 708 + { USB_DEVICE(BANDB_VID, BANDB_485USB9F_4W_PID) }, 709 + { USB_DEVICE(BANDB_VID, BANDB_232USB9M_PID) }, 710 + { USB_DEVICE(BANDB_VID, BANDB_485USBTB_2W_PID) }, 711 + { USB_DEVICE(BANDB_VID, BANDB_485USBTB_4W_PID) }, 712 + { USB_DEVICE(BANDB_VID, BANDB_TTL5USB9M_PID) }, 713 + { USB_DEVICE(BANDB_VID, BANDB_TTL3USB9M_PID) }, 714 + { USB_DEVICE(BANDB_VID, BANDB_ZZ_PROG1_USB_PID) }, 715 + { USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) }, 716 + { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) }, 717 + { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) }, 718 + { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_3_PID) }, 719 + { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_0_PID) }, 720 + { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_1_PID) }, 721 + { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_2_PID) }, 722 + { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_3_PID) }, 723 + { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_4_PID) }, 724 + { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) }, 725 + { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) }, 726 + { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) }, 727 + { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) }, 728 + { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) }, 729 + { USB_DEVICE(FTDI_VID, FTDI_MHAM_KW_PID) }, 730 + { USB_DEVICE(FTDI_VID, FTDI_MHAM_YS_PID) }, 731 + { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y6_PID) }, 732 + { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y8_PID) }, 733 + { USB_DEVICE(FTDI_VID, FTDI_MHAM_IC_PID) }, 734 + { USB_DEVICE(FTDI_VID, FTDI_MHAM_DB9_PID) }, 735 + { USB_DEVICE(FTDI_VID, FTDI_MHAM_RS232_PID) }, 736 + { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y9_PID) }, 737 + { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_VCP_PID) }, 738 + { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_D2XX_PID) }, 739 + { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) }, 740 + { USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) }, 741 + { USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) }, 742 + { USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) }, 743 + { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) }, 744 + { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) }, 745 + { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HR_PID) }, 746 + { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HRC_PID) }, 747 + { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16IC_PID) }, 748 + { USB_DEVICE(KOBIL_VID, KOBIL_CONV_B1_PID) }, 749 + { USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) }, 750 + { USB_DEVICE(POSIFLEX_VID, POSIFLEX_PP7000_PID) }, 751 + { USB_DEVICE(FTDI_VID, FTDI_TTUSB_PID) }, 752 + { USB_DEVICE(FTDI_VID, FTDI_ECLO_COM_1WIRE_PID) }, 753 + { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_777_PID) }, 754 + { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_8900F_PID) }, 755 + { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) }, 756 + { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) }, 757 + { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) }, 758 + { USB_DEVICE(FTDI_VID, FTDI_NZR_SEM_USB_PID) }, 759 + { USB_DEVICE(ICOM_VID, ICOM_ID_1_PID) }, 760 + { USB_DEVICE(ICOM_VID, ICOM_OPC_U_UC_PID) }, 761 + { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C1_PID) }, 762 + { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C2_PID) }, 763 + { USB_DEVICE(ICOM_VID, ICOM_ID_RP2D_PID) }, 764 + { USB_DEVICE(ICOM_VID, ICOM_ID_RP2VT_PID) }, 765 + { USB_DEVICE(ICOM_VID, ICOM_ID_RP2VR_PID) }, 766 + { USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVT_PID) }, 767 + { USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVR_PID) }, 768 + { USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVT_PID) }, 769 + { USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVR_PID) }, 770 + { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) }, 771 + { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) }, 772 + { USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) }, 773 + { USB_DEVICE(TESTO_VID, TESTO_USB_INTERFACE_PID) }, 774 + { USB_DEVICE(FTDI_VID, FTDI_GAMMA_SCOUT_PID) }, 775 + { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13M_PID) }, 776 + { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) }, 777 + { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) }, 778 + { USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) }, 779 + { USB_DEVICE(FTDI_VID, FTDI_NDI_HUC_PID) }, 780 + { USB_DEVICE(FTDI_VID, FTDI_NDI_SPECTRA_SCU_PID) }, 781 + { USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_2_PID) }, 782 + { USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_3_PID) }, 783 + { USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID) }, 784 + { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) }, 785 + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_SERIAL_VX7_PID) }, 786 + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_CT29B_PID) }, 787 + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_RTS01_PID) }, 788 + { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) }, 789 + { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) }, 790 + { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) }, 791 + { USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) }, 792 + { USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) }, 793 + { USB_DEVICE(FTDI_VID, FTDI_PROPOX_ISPCABLEIII_PID) }, 794 + { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID) }, 795 + { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID) }, 796 + { USB_DEVICE(FIC_VID, FIC_NEO1973_DEBUG_PID) }, 797 + { USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID) }, 798 + { USB_DEVICE(FTDI_VID, LMI_LM3S_DEVEL_BOARD_PID) }, 799 + { USB_DEVICE(FTDI_VID, LMI_LM3S_EVAL_BOARD_PID) }, 800 + { USB_DEVICE(FTDI_VID, LMI_LM3S_ICDI_BOARD_PID) }, 801 + { USB_DEVICE(FTDI_VID, FTDI_TURTELIZER_PID) }, 802 + { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) }, 803 + { USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) }, 804 + 805 + /* Papouch devices based on FTDI chip */ 806 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_PID) }, 807 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_PID) }, 808 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_PID) }, 809 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_2_PID) }, 810 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_2_PID) }, 811 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_2_PID) }, 812 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485S_PID) }, 813 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485C_PID) }, 814 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_LEC_PID) }, 815 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB232_PID) }, 816 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) }, 817 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_IRAMP_PID) }, 818 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK5_PID) }, 819 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO8x8_PID) }, 820 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) }, 821 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x2_PID) }, 822 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO10x1_PID) }, 823 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO30x3_PID) }, 824 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO60x3_PID) }, 825 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x16_PID) }, 826 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO3x32_PID) }, 827 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK6_PID) }, 828 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_UPSUSB_PID) }, 829 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_MU_PID) }, 830 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SIMUKEY_PID) }, 831 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AD4USB_PID) }, 832 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMUX_PID) }, 833 + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMSR_PID) }, 834 + 835 + { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) }, 836 + { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) }, 837 + { USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) }, 838 + { USB_DEVICE(FTDI_VID, DIEBOLD_BCS_SE923_PID) }, 839 + { USB_DEVICE(ATMEL_VID, STK541_PID) }, 840 + { USB_DEVICE(DE_VID, STB_PID) }, 841 + { USB_DEVICE(DE_VID, WHT_PID) }, 842 + { USB_DEVICE(ADI_VID, ADI_GNICE_PID) }, 843 + { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID) }, 844 + { USB_DEVICE_AND_INTERFACE_INFO(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID, 845 + 0xff, 0xff, 0x00) }, 846 + { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, 847 + { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID) }, 848 + { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) }, 849 + { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) }, 850 + { USB_DEVICE(FTDI_VID, PI_C865_PID) }, 851 + { USB_DEVICE(FTDI_VID, PI_C857_PID) }, 852 + { USB_DEVICE(PI_VID, PI_C866_PID) }, 853 + { USB_DEVICE(PI_VID, PI_C663_PID) }, 854 + { USB_DEVICE(PI_VID, PI_C725_PID) }, 855 + { USB_DEVICE(PI_VID, PI_E517_PID) }, 856 + { USB_DEVICE(PI_VID, PI_C863_PID) }, 857 + { USB_DEVICE(PI_VID, PI_E861_PID) }, 858 + { USB_DEVICE(PI_VID, PI_C867_PID) }, 859 + { USB_DEVICE(PI_VID, PI_E609_PID) }, 860 + { USB_DEVICE(PI_VID, PI_E709_PID) }, 861 + { USB_DEVICE(PI_VID, PI_100F_PID) }, 862 + { USB_DEVICE(PI_VID, PI_1011_PID) }, 863 + { USB_DEVICE(PI_VID, PI_1012_PID) }, 864 + { USB_DEVICE(PI_VID, PI_1013_PID) }, 865 + { USB_DEVICE(PI_VID, PI_1014_PID) }, 866 + { USB_DEVICE(PI_VID, PI_1015_PID) }, 867 + { USB_DEVICE(PI_VID, PI_1016_PID) }, 868 + { USB_DEVICE(KONDO_VID, KONDO_USB_SERIAL_PID) }, 869 + { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) }, 870 + { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID) }, 871 + { USB_DEVICE(FTDI_VID, TI_XDS100V2_PID) }, 872 + { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) }, 873 + { USB_DEVICE(FTDI_VID, HAMEG_HO720_PID) }, 874 + { USB_DEVICE(FTDI_VID, HAMEG_HO730_PID) }, 875 + { USB_DEVICE(FTDI_VID, HAMEG_HO870_PID) }, 876 + { USB_DEVICE(FTDI_VID, MJSG_GENERIC_PID) }, 877 + { USB_DEVICE(FTDI_VID, MJSG_SR_RADIO_PID) }, 878 + { USB_DEVICE(FTDI_VID, MJSG_HD_RADIO_PID) }, 879 + { USB_DEVICE(FTDI_VID, MJSG_XM_RADIO_PID) }, 880 + { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_ST_PID) }, 881 + { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SLITE_PID) }, 882 + { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH2_PID) }, 883 + { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH4_PID) }, 884 + { USB_DEVICE(FTDI_VID, SEGWAY_RMP200_PID) }, 885 + { USB_DEVICE(FTDI_VID, ACCESIO_COM4SM_PID) }, 886 + { USB_DEVICE(IONICS_VID, IONICS_PLUGCOMPUTER_PID) }, 887 + { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_24_MASTER_WING_PID) }, 888 + { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_PC_WING_PID) }, 889 + { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_USB_DMX_PID) }, 890 + { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MIDI_TIMECODE_PID) }, 891 + { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MINI_WING_PID) }, 892 + { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MAXI_WING_PID) }, 893 + { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MEDIA_WING_PID) }, 894 + { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_WING_PID) }, 895 + { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LOGBOOKML_PID) }, 896 + { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LS_LOGBOOK_PID) }, 897 + { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_HS_LOGBOOK_PID) }, 898 + { USB_DEVICE(FTDI_VID, FTDI_CINTERION_MC55I_PID) }, 899 + { USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) }, 900 + { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID) }, 901 + { USB_DEVICE(ST_VID, ST_STMCLT1030_PID) }, 902 + { USB_DEVICE(FTDI_VID, FTDI_RF_R106) }, 903 + { USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID) }, 904 + { USB_DEVICE(FTDI_VID, FTDI_LUMEL_PD12_PID) }, 905 + 906 + { USB_DEVICE(-1, -1) } /* Terminating Entry */ 907 + }; 908 + 909 + #undef USB_DEVICE 910 + #undef USB_DEVICE_AND_INTERFACE_INFO
+337 -18
hw/usb/redirect.c
··· 52 52 53 53 typedef struct USBRedirDevice USBRedirDevice; 54 54 55 - /* Struct to hold buffered packets (iso or int input packets) */ 55 + /* Struct to hold buffered packets */ 56 56 struct buf_packet { 57 57 uint8_t *data; 58 - int len; 59 - int status; 58 + void *free_on_destroy; 59 + uint16_t len; 60 + uint16_t offset; 61 + uint8_t status; 60 62 QTAILQ_ENTRY(buf_packet)next; 61 63 }; 62 64 ··· 70 72 uint8_t iso_error; /* For reporting iso errors to the HC */ 71 73 uint8_t interrupt_started; 72 74 uint8_t interrupt_error; 75 + uint8_t bulk_receiving_enabled; 76 + uint8_t bulk_receiving_started; 73 77 uint8_t bufpq_prefilled; 74 78 uint8_t bufpq_dropping_packets; 75 79 QTAILQ_HEAD(, buf_packet) bufpq; 76 80 int32_t bufpq_size; 77 81 int32_t bufpq_target_size; 82 + USBPacket *pending_async_packet; 78 83 }; 79 84 80 85 struct PacketIdQueueEntry { ··· 108 113 struct endp_data endpoint[MAX_ENDPOINTS]; 109 114 struct PacketIdQueue cancelled; 110 115 struct PacketIdQueue already_in_flight; 116 + void (*buffered_bulk_in_complete)(USBRedirDevice *, USBPacket *, uint8_t); 111 117 /* Data for device filtering */ 112 118 struct usb_redir_device_connect_header device_info; 113 119 struct usb_redir_interface_info_header interface_info; ··· 135 141 *interrupt_receiving_status); 136 142 static void usbredir_bulk_streams_status(void *priv, uint64_t id, 137 143 struct usb_redir_bulk_streams_status_header *bulk_streams_status); 144 + static void usbredir_bulk_receiving_status(void *priv, uint64_t id, 145 + struct usb_redir_bulk_receiving_status_header *bulk_receiving_status); 138 146 static void usbredir_control_packet(void *priv, uint64_t id, 139 147 struct usb_redir_control_packet_header *control_packet, 140 148 uint8_t *data, int data_len); ··· 146 154 uint8_t *data, int data_len); 147 155 static void usbredir_interrupt_packet(void *priv, uint64_t id, 148 156 struct usb_redir_interrupt_packet_header *interrupt_header, 157 + uint8_t *data, int data_len); 158 + static void usbredir_buffered_bulk_packet(void *priv, uint64_t id, 159 + struct usb_redir_buffered_bulk_packet_header *buffered_bulk_packet, 149 160 uint8_t *data, int data_len); 150 161 151 162 static void usbredir_handle_status(USBRedirDevice *dev, USBPacket *p, ··· 320 331 static void usbredir_cancel_packet(USBDevice *udev, USBPacket *p) 321 332 { 322 333 USBRedirDevice *dev = DO_UPCAST(USBRedirDevice, dev, udev); 334 + int i = USBEP2I(p->ep); 323 335 324 336 if (p->combined) { 325 337 usb_combined_packet_cancel(udev, p); 326 338 return; 327 339 } 328 340 341 + if (dev->endpoint[i].pending_async_packet) { 342 + assert(dev->endpoint[i].pending_async_packet == p); 343 + dev->endpoint[i].pending_async_packet = NULL; 344 + return; 345 + } 346 + 329 347 packet_id_queue_add(&dev->cancelled, p->id); 330 348 usbredirparser_send_cancel_data_packet(dev->parser, p->id); 331 349 usbredirparser_do_write(dev->parser); ··· 343 361 struct USBEndpoint *ep) 344 362 { 345 363 static USBPacket *p; 364 + 365 + /* async handled packets for bulk receiving eps do not count as inflight */ 366 + if (dev->endpoint[USBEP2I(ep)].bulk_receiving_started) { 367 + return; 368 + } 346 369 347 370 QTAILQ_FOREACH(p, &ep->queue, queue) { 348 371 /* Skip combined packets, except for the first */ ··· 391 414 return p; 392 415 } 393 416 394 - static void bufp_alloc(USBRedirDevice *dev, 395 - uint8_t *data, int len, int status, uint8_t ep) 417 + static void bufp_alloc(USBRedirDevice *dev, uint8_t *data, uint16_t len, 418 + uint8_t status, uint8_t ep, void *free_on_destroy) 396 419 { 397 420 struct buf_packet *bufp; 398 421 ··· 416 439 bufp = g_malloc(sizeof(struct buf_packet)); 417 440 bufp->data = data; 418 441 bufp->len = len; 442 + bufp->offset = 0; 419 443 bufp->status = status; 444 + bufp->free_on_destroy = free_on_destroy; 420 445 QTAILQ_INSERT_TAIL(&dev->endpoint[EP2I(ep)].bufpq, bufp, next); 421 446 dev->endpoint[EP2I(ep)].bufpq_size++; 422 447 } ··· 426 451 { 427 452 QTAILQ_REMOVE(&dev->endpoint[EP2I(ep)].bufpq, bufp, next); 428 453 dev->endpoint[EP2I(ep)].bufpq_size--; 429 - free(bufp->data); 454 + free(bufp->free_on_destroy); 430 455 g_free(bufp); 431 456 } 432 457 ··· 577 602 usbredir_free_bufpq(dev, ep); 578 603 } 579 604 605 + /* 606 + * The usb-host may poll the endpoint faster then our guest, resulting in lots 607 + * of smaller bulkp-s. The below buffered_bulk_in_complete* functions combine 608 + * data from multiple bulkp-s into a single packet, avoiding bufpq overflows. 609 + */ 610 + static void usbredir_buffered_bulk_add_data_to_packet(USBRedirDevice *dev, 611 + struct buf_packet *bulkp, int count, USBPacket *p, uint8_t ep) 612 + { 613 + usb_packet_copy(p, bulkp->data + bulkp->offset, count); 614 + bulkp->offset += count; 615 + if (bulkp->offset == bulkp->len) { 616 + /* Store status in the last packet with data from this bulkp */ 617 + usbredir_handle_status(dev, p, bulkp->status); 618 + bufp_free(dev, bulkp, ep); 619 + } 620 + } 621 + 622 + static void usbredir_buffered_bulk_in_complete_raw(USBRedirDevice *dev, 623 + USBPacket *p, uint8_t ep) 624 + { 625 + struct buf_packet *bulkp; 626 + int count; 627 + 628 + while ((bulkp = QTAILQ_FIRST(&dev->endpoint[EP2I(ep)].bufpq)) && 629 + p->actual_length < p->iov.size && p->status == USB_RET_SUCCESS) { 630 + count = bulkp->len - bulkp->offset; 631 + if (count > (p->iov.size - p->actual_length)) { 632 + count = p->iov.size - p->actual_length; 633 + } 634 + usbredir_buffered_bulk_add_data_to_packet(dev, bulkp, count, p, ep); 635 + } 636 + } 637 + 638 + static void usbredir_buffered_bulk_in_complete_ftdi(USBRedirDevice *dev, 639 + USBPacket *p, uint8_t ep) 640 + { 641 + const int maxp = dev->endpoint[EP2I(ep)].max_packet_size; 642 + uint8_t header[2] = { 0, 0 }; 643 + struct buf_packet *bulkp; 644 + int count; 645 + 646 + while ((bulkp = QTAILQ_FIRST(&dev->endpoint[EP2I(ep)].bufpq)) && 647 + p->actual_length < p->iov.size && p->status == USB_RET_SUCCESS) { 648 + if (bulkp->len < 2) { 649 + WARNING("malformed ftdi bulk in packet\n"); 650 + bufp_free(dev, bulkp, ep); 651 + continue; 652 + } 653 + 654 + if ((p->actual_length % maxp) == 0) { 655 + usb_packet_copy(p, bulkp->data, 2); 656 + memcpy(header, bulkp->data, 2); 657 + } else { 658 + if (bulkp->data[0] != header[0] || bulkp->data[1] != header[1]) { 659 + break; /* Different header, add to next packet */ 660 + } 661 + } 662 + 663 + if (bulkp->offset == 0) { 664 + bulkp->offset = 2; /* Skip header */ 665 + } 666 + count = bulkp->len - bulkp->offset; 667 + /* Must repeat the header at maxp interval */ 668 + if (count > (maxp - (p->actual_length % maxp))) { 669 + count = maxp - (p->actual_length % maxp); 670 + } 671 + usbredir_buffered_bulk_add_data_to_packet(dev, bulkp, count, p, ep); 672 + } 673 + } 674 + 675 + static void usbredir_buffered_bulk_in_complete(USBRedirDevice *dev, 676 + USBPacket *p, uint8_t ep) 677 + { 678 + p->status = USB_RET_SUCCESS; /* Clear previous ASYNC status */ 679 + dev->buffered_bulk_in_complete(dev, p, ep); 680 + DPRINTF("bulk-token-in ep %02X status %d len %d id %"PRIu64"\n", 681 + ep, p->status, p->actual_length, p->id); 682 + } 683 + 684 + static void usbredir_handle_buffered_bulk_in_data(USBRedirDevice *dev, 685 + USBPacket *p, uint8_t ep) 686 + { 687 + /* Input bulk endpoint, buffered packet input */ 688 + if (!dev->endpoint[EP2I(ep)].bulk_receiving_started) { 689 + int bpt; 690 + struct usb_redir_start_bulk_receiving_header start = { 691 + .endpoint = ep, 692 + .stream_id = 0, 693 + .no_transfers = 5, 694 + }; 695 + /* Round bytes_per_transfer up to a multiple of max_packet_size */ 696 + bpt = 512 + dev->endpoint[EP2I(ep)].max_packet_size - 1; 697 + bpt /= dev->endpoint[EP2I(ep)].max_packet_size; 698 + bpt *= dev->endpoint[EP2I(ep)].max_packet_size; 699 + start.bytes_per_transfer = bpt; 700 + /* No id, we look at the ep when receiving a status back */ 701 + usbredirparser_send_start_bulk_receiving(dev->parser, 0, &start); 702 + usbredirparser_do_write(dev->parser); 703 + DPRINTF("bulk receiving started bytes/transfer %u count %d ep %02X\n", 704 + start.bytes_per_transfer, start.no_transfers, ep); 705 + dev->endpoint[EP2I(ep)].bulk_receiving_started = 1; 706 + /* We don't really want to drop bulk packets ever, but 707 + having some upper limit to how much we buffer is good. */ 708 + dev->endpoint[EP2I(ep)].bufpq_target_size = 5000; 709 + dev->endpoint[EP2I(ep)].bufpq_dropping_packets = 0; 710 + } 711 + 712 + if (QTAILQ_EMPTY(&dev->endpoint[EP2I(ep)].bufpq)) { 713 + DPRINTF("bulk-token-in ep %02X, no bulkp\n", ep); 714 + assert(dev->endpoint[EP2I(ep)].pending_async_packet == NULL); 715 + dev->endpoint[EP2I(ep)].pending_async_packet = p; 716 + p->status = USB_RET_ASYNC; 717 + return; 718 + } 719 + usbredir_buffered_bulk_in_complete(dev, p, ep); 720 + } 721 + 722 + static void usbredir_stop_bulk_receiving(USBRedirDevice *dev, uint8_t ep) 723 + { 724 + struct usb_redir_stop_bulk_receiving_header stop_bulk = { 725 + .endpoint = ep, 726 + .stream_id = 0, 727 + }; 728 + if (dev->endpoint[EP2I(ep)].bulk_receiving_started) { 729 + usbredirparser_send_stop_bulk_receiving(dev->parser, 0, &stop_bulk); 730 + DPRINTF("bulk receiving stopped ep %02X\n", ep); 731 + dev->endpoint[EP2I(ep)].bulk_receiving_started = 0; 732 + } 733 + usbredir_free_bufpq(dev, ep); 734 + } 735 + 580 736 static void usbredir_handle_bulk_data(USBRedirDevice *dev, USBPacket *p, 581 737 uint8_t ep) 582 738 { 583 739 struct usb_redir_bulk_packet_header bulk_packet; 584 740 size_t size = (p->combined) ? p->combined->iov.size : p->iov.size; 585 - 586 - DPRINTF("bulk-out ep %02X len %zd id %"PRIu64"\n", ep, size, p->id); 741 + const int maxp = dev->endpoint[EP2I(ep)].max_packet_size; 587 742 588 743 if (usbredir_already_in_flight(dev, p->id)) { 589 744 p->status = USB_RET_ASYNC; 590 745 return; 591 746 } 592 747 748 + if (dev->endpoint[EP2I(ep)].bulk_receiving_enabled) { 749 + if (size != 0 && (size % maxp) == 0) { 750 + usbredir_handle_buffered_bulk_in_data(dev, p, ep); 751 + return; 752 + } 753 + WARNING("bulk recv invalid size %zd ep %02x, disabling\n", size, ep); 754 + assert(dev->endpoint[EP2I(ep)].pending_async_packet == NULL); 755 + usbredir_stop_bulk_receiving(dev, ep); 756 + dev->endpoint[EP2I(ep)].bulk_receiving_enabled = 0; 757 + } 758 + 759 + DPRINTF("bulk-out ep %02X len %zd id %"PRIu64"\n", ep, size, p->id); 760 + 593 761 bulk_packet.endpoint = ep; 594 762 bulk_packet.length = size; 595 763 bulk_packet.stream_id = 0; ··· 726 894 ERROR("handle_data called for control transfer on ep %02X\n", ep); 727 895 p->status = USB_RET_NAK; 728 896 break; 729 - case USB_ENDPOINT_XFER_ISOC: 730 - usbredir_handle_iso_data(dev, p, ep); 731 - break; 732 897 case USB_ENDPOINT_XFER_BULK: 733 898 if (p->state == USB_PACKET_SETUP && p->pid == USB_TOKEN_IN && 734 899 p->ep->pipeline) { ··· 736 901 break; 737 902 } 738 903 usbredir_handle_bulk_data(dev, p, ep); 904 + break; 905 + case USB_ENDPOINT_XFER_ISOC: 906 + usbredir_handle_iso_data(dev, p, ep); 739 907 break; 740 908 case USB_ENDPOINT_XFER_INT: 741 909 if (ep & USB_DIR_IN) { ··· 763 931 uint8_t ep = I2EP(i); 764 932 765 933 switch (dev->endpoint[i].type) { 934 + case USB_ENDPOINT_XFER_BULK: 935 + if (ep & USB_DIR_IN) { 936 + usbredir_stop_bulk_receiving(dev, ep); 937 + } 938 + break; 766 939 case USB_ENDPOINT_XFER_ISOC: 767 940 usbredir_stop_iso_stream(dev, ep); 768 941 break; ··· 942 1115 dev->parser->interrupt_receiving_status_func = 943 1116 usbredir_interrupt_receiving_status; 944 1117 dev->parser->bulk_streams_status_func = usbredir_bulk_streams_status; 1118 + dev->parser->bulk_receiving_status_func = usbredir_bulk_receiving_status; 945 1119 dev->parser->control_packet_func = usbredir_control_packet; 946 1120 dev->parser->bulk_packet_func = usbredir_bulk_packet; 947 1121 dev->parser->iso_packet_func = usbredir_iso_packet; 948 1122 dev->parser->interrupt_packet_func = usbredir_interrupt_packet; 1123 + dev->parser->buffered_bulk_packet_func = usbredir_buffered_bulk_packet; 949 1124 dev->read_buf = NULL; 950 1125 dev->read_buf_size = 0; 951 1126 ··· 954 1129 usbredirparser_caps_set_cap(caps, usb_redir_cap_ep_info_max_packet_size); 955 1130 usbredirparser_caps_set_cap(caps, usb_redir_cap_64bits_ids); 956 1131 usbredirparser_caps_set_cap(caps, usb_redir_cap_32bits_bulk_length); 1132 + usbredirparser_caps_set_cap(caps, usb_redir_cap_bulk_receiving); 957 1133 958 1134 if (runstate_check(RUN_STATE_INMIGRATE)) { 959 1135 flags |= usbredirparser_fl_no_hello; ··· 1192 1368 return -1; 1193 1369 } 1194 1370 1371 + static void usbredir_check_bulk_receiving(USBRedirDevice *dev) 1372 + { 1373 + int i, j, quirks; 1374 + 1375 + if (!usbredirparser_peer_has_cap(dev->parser, 1376 + usb_redir_cap_bulk_receiving)) { 1377 + return; 1378 + } 1379 + 1380 + for (i = EP2I(USB_DIR_IN); i < MAX_ENDPOINTS; i++) { 1381 + dev->endpoint[i].bulk_receiving_enabled = 0; 1382 + } 1383 + for (i = 0; i < dev->interface_info.interface_count; i++) { 1384 + quirks = usb_get_quirks(dev->device_info.vendor_id, 1385 + dev->device_info.product_id, 1386 + dev->interface_info.interface_class[i], 1387 + dev->interface_info.interface_subclass[i], 1388 + dev->interface_info.interface_protocol[i]); 1389 + if (!(quirks & USB_QUIRK_BUFFER_BULK_IN)) { 1390 + continue; 1391 + } 1392 + if (quirks & USB_QUIRK_IS_FTDI) { 1393 + dev->buffered_bulk_in_complete = 1394 + usbredir_buffered_bulk_in_complete_ftdi; 1395 + } else { 1396 + dev->buffered_bulk_in_complete = 1397 + usbredir_buffered_bulk_in_complete_raw; 1398 + } 1399 + 1400 + for (j = EP2I(USB_DIR_IN); j < MAX_ENDPOINTS; j++) { 1401 + if (dev->endpoint[j].interface == 1402 + dev->interface_info.interface[i] && 1403 + dev->endpoint[j].type == USB_ENDPOINT_XFER_BULK && 1404 + dev->endpoint[j].max_packet_size != 0) { 1405 + dev->endpoint[j].bulk_receiving_enabled = 1; 1406 + /* 1407 + * With buffering pipelining is not necessary. Also packet 1408 + * combining and bulk in buffering don't play nice together! 1409 + */ 1410 + I2USBEP(dev, j)->pipeline = false; 1411 + break; /* Only buffer for the first ep of each intf */ 1412 + } 1413 + } 1414 + } 1415 + } 1416 + 1195 1417 /* 1196 1418 * usbredirparser packet complete callbacks 1197 1419 */ ··· 1300 1522 return; 1301 1523 } 1302 1524 1525 + usbredir_check_bulk_receiving(dev); 1303 1526 qemu_mod_timer(dev->attach_timer, dev->next_attach_time); 1304 1527 } 1305 1528 ··· 1338 1561 1339 1562 /* 1340 1563 * If we receive interface info after the device has already been 1341 - * connected (ie on a set_config), re-check the filter. 1564 + * connected (ie on a set_config), re-check interface dependent things. 1342 1565 */ 1343 1566 if (qemu_timer_pending(dev->attach_timer) || dev->dev.attached) { 1567 + usbredir_check_bulk_receiving(dev); 1344 1568 if (usbredir_check_filter(dev)) { 1345 1569 ERROR("Device no longer matches filter after interface info " 1346 1570 "change, disconnecting!\n"); ··· 1441 1665 return; 1442 1666 } 1443 1667 usbredir_setup_usb_eps(dev); 1668 + usbredir_check_bulk_receiving(dev); 1444 1669 } 1445 1670 1446 1671 static void usbredir_configuration_status(void *priv, uint64_t id, ··· 1531 1756 { 1532 1757 } 1533 1758 1759 + static void usbredir_bulk_receiving_status(void *priv, uint64_t id, 1760 + struct usb_redir_bulk_receiving_status_header *bulk_receiving_status) 1761 + { 1762 + USBRedirDevice *dev = priv; 1763 + uint8_t ep = bulk_receiving_status->endpoint; 1764 + 1765 + DPRINTF("bulk recv status %d ep %02X id %"PRIu64"\n", 1766 + bulk_receiving_status->status, ep, id); 1767 + 1768 + if (!dev->dev.attached || !dev->endpoint[EP2I(ep)].bulk_receiving_started) { 1769 + return; 1770 + } 1771 + 1772 + if (bulk_receiving_status->status == usb_redir_stall) { 1773 + DPRINTF("bulk receiving stopped by peer ep %02X\n", ep); 1774 + dev->endpoint[EP2I(ep)].bulk_receiving_started = 0; 1775 + } 1776 + } 1777 + 1534 1778 static void usbredir_control_packet(void *priv, uint64_t id, 1535 1779 struct usb_redir_control_packet_header *control_packet, 1536 1780 uint8_t *data, int data_len) ··· 1636 1880 } 1637 1881 1638 1882 /* bufp_alloc also adds the packet to the ep queue */ 1639 - bufp_alloc(dev, data, data_len, iso_packet->status, ep); 1883 + bufp_alloc(dev, data, data_len, iso_packet->status, ep, data); 1640 1884 } 1641 1885 1642 1886 static void usbredir_interrupt_packet(void *priv, uint64_t id, ··· 1667 1911 } 1668 1912 1669 1913 /* bufp_alloc also adds the packet to the ep queue */ 1670 - bufp_alloc(dev, data, data_len, interrupt_packet->status, ep); 1914 + bufp_alloc(dev, data, data_len, interrupt_packet->status, ep, data); 1671 1915 } else { 1672 1916 /* 1673 1917 * We report output interrupt packets as completed directly upon ··· 1680 1924 } 1681 1925 } 1682 1926 1927 + static void usbredir_buffered_bulk_packet(void *priv, uint64_t id, 1928 + struct usb_redir_buffered_bulk_packet_header *buffered_bulk_packet, 1929 + uint8_t *data, int data_len) 1930 + { 1931 + USBRedirDevice *dev = priv; 1932 + uint8_t status, ep = buffered_bulk_packet->endpoint; 1933 + void *free_on_destroy; 1934 + int i, len; 1935 + 1936 + DPRINTF("buffered-bulk-in status %d ep %02X len %d id %"PRIu64"\n", 1937 + buffered_bulk_packet->status, ep, data_len, id); 1938 + 1939 + if (dev->endpoint[EP2I(ep)].type != USB_ENDPOINT_XFER_BULK) { 1940 + ERROR("received buffered-bulk packet for non bulk ep %02X\n", ep); 1941 + free(data); 1942 + return; 1943 + } 1944 + 1945 + if (dev->endpoint[EP2I(ep)].bulk_receiving_started == 0) { 1946 + DPRINTF("received buffered-bulk packet on not started ep %02X\n", ep); 1947 + free(data); 1948 + return; 1949 + } 1950 + 1951 + /* Data must be in maxp chunks for buffered_bulk_add_*_data_to_packet */ 1952 + len = dev->endpoint[EP2I(ep)].max_packet_size; 1953 + status = usb_redir_success; 1954 + free_on_destroy = NULL; 1955 + for (i = 0; i < data_len; i += len) { 1956 + if (len >= (data_len - i)) { 1957 + len = data_len - i; 1958 + status = buffered_bulk_packet->status; 1959 + free_on_destroy = data; 1960 + } 1961 + /* bufp_alloc also adds the packet to the ep queue */ 1962 + bufp_alloc(dev, data + i, len, status, ep, free_on_destroy); 1963 + } 1964 + 1965 + if (dev->endpoint[EP2I(ep)].pending_async_packet) { 1966 + USBPacket *p = dev->endpoint[EP2I(ep)].pending_async_packet; 1967 + dev->endpoint[EP2I(ep)].pending_async_packet = NULL; 1968 + usbredir_buffered_bulk_in_complete(dev, p, ep); 1969 + usb_packet_complete(&dev->dev, p); 1970 + } 1971 + } 1972 + 1683 1973 /* 1684 1974 * Migration code 1685 1975 */ ··· 1714 2004 dev->dev.speedmask = (1 << dev->dev.speed); 1715 2005 1716 2006 usbredir_setup_usb_eps(dev); 2007 + usbredir_check_bulk_receiving(dev); 1717 2008 1718 2009 return 0; 1719 2010 } ··· 1787 2078 struct endp_data *endp = priv; 1788 2079 USBRedirDevice *dev = endp->dev; 1789 2080 struct buf_packet *bufp; 1790 - int i = 0; 2081 + int len, i = 0; 1791 2082 1792 2083 qemu_put_be32(f, endp->bufpq_size); 1793 2084 QTAILQ_FOREACH(bufp, &endp->bufpq, next) { 2085 + len = bufp->len - bufp->offset; 1794 2086 DPRINTF("put_bufpq %d/%d len %d status %d\n", i + 1, endp->bufpq_size, 1795 - bufp->len, bufp->status); 1796 - qemu_put_be32(f, bufp->len); 2087 + len, bufp->status); 2088 + qemu_put_be32(f, len); 1797 2089 qemu_put_be32(f, bufp->status); 1798 - qemu_put_buffer(f, bufp->data, bufp->len); 2090 + qemu_put_buffer(f, bufp->data + bufp->offset, len); 1799 2091 i++; 1800 2092 } 1801 2093 assert(i == endp->bufpq_size); ··· 1813 2105 bufp = g_malloc(sizeof(struct buf_packet)); 1814 2106 bufp->len = qemu_get_be32(f); 1815 2107 bufp->status = qemu_get_be32(f); 2108 + bufp->offset = 0; 1816 2109 bufp->data = qemu_oom_check(malloc(bufp->len)); /* regular malloc! */ 2110 + bufp->free_on_destroy = bufp->data; 1817 2111 qemu_get_buffer(f, bufp->data, bufp->len); 1818 2112 QTAILQ_INSERT_TAIL(&endp->bufpq, bufp, next); 1819 2113 DPRINTF("get_bufpq %d/%d len %d status %d\n", i + 1, endp->bufpq_size, ··· 1830 2124 1831 2125 1832 2126 /* For endp_data migration */ 2127 + static const VMStateDescription usbredir_bulk_receiving_vmstate = { 2128 + .name = "usb-redir-ep/bulk-receiving", 2129 + .version_id = 1, 2130 + .minimum_version_id = 1, 2131 + .fields = (VMStateField[]) { 2132 + VMSTATE_UINT8(bulk_receiving_started, struct endp_data), 2133 + VMSTATE_END_OF_LIST() 2134 + } 2135 + }; 2136 + 2137 + static bool usbredir_bulk_receiving_needed(void *priv) 2138 + { 2139 + struct endp_data *endp = priv; 2140 + 2141 + return endp->bulk_receiving_started; 2142 + } 2143 + 1833 2144 static const VMStateDescription usbredir_ep_vmstate = { 1834 2145 .name = "usb-redir-ep", 1835 2146 .version_id = 1, ··· 1856 2167 }, 1857 2168 VMSTATE_INT32(bufpq_target_size, struct endp_data), 1858 2169 VMSTATE_END_OF_LIST() 2170 + }, 2171 + .subsections = (VMStateSubsection[]) { 2172 + { 2173 + .vmsd = &usbredir_bulk_receiving_vmstate, 2174 + .needed = usbredir_bulk_receiving_needed, 2175 + }, { 2176 + /* empty */ 2177 + } 1859 2178 } 1860 2179 }; 1861 2180