1 /* $OpenBSD: uftdi.c,v 1.80 2024/11/09 08:37:44 miod Exp $ */ 2 /* $NetBSD: uftdi.c,v 1.14 2003/02/23 04:20:07 simonb Exp $ */ 3 4 /* 5 * Copyright (c) 2000 The NetBSD Foundation, Inc. 6 * All rights reserved. 7 * 8 * This code is derived from software contributed to The NetBSD Foundation 9 * by Lennart Augustsson (lennart@augustsson.net). 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 /* 34 * FTDI FT8U100AX serial adapter driver 35 */ 36 37 /* 38 * XXX This driver will not support multiple serial ports. 39 * XXX The ucom layer needs to be extended first. 40 */ 41 42 #include <sys/param.h> 43 #include <sys/systm.h> 44 #include <sys/device.h> 45 #include <sys/tty.h> 46 47 #include <dev/usb/usb.h> 48 49 #include <dev/usb/usbdi.h> 50 #include <dev/usb/usbdevs.h> 51 52 #include <dev/usb/ucomvar.h> 53 54 #include <dev/usb/uftdireg.h> 55 56 #ifdef UFTDI_DEBUG 57 #define DPRINTF(x) do { if (uftdidebug) printf x; } while (0) 58 #define DPRINTFN(n,x) do { if (uftdidebug>(n)) printf x; } while (0) 59 int uftdidebug = 0; 60 #else 61 #define DPRINTF(x) 62 #define DPRINTFN(n,x) 63 #endif 64 65 /* 66 * These are the maximum number of bytes transferred per frame. 67 * The output buffer size cannot be increased due to the size encoding. 68 */ 69 #define UFTDIIBUFSIZE 64 70 #define UFTDIOBUFSIZE 64 71 72 struct uftdi_softc { 73 struct device sc_dev; /* base device */ 74 struct usbd_device *sc_udev; /* device */ 75 struct usbd_interface *sc_iface; /* interface */ 76 77 enum uftdi_type sc_type; 78 u_int sc_hdrlen; 79 80 u_char sc_msr; 81 u_char sc_lsr; 82 83 struct device *sc_subdev; 84 85 u_int last_lcr; 86 }; 87 88 void uftdi_get_status(void *, int portno, u_char *lsr, u_char *msr); 89 void uftdi_set(void *, int, int, int); 90 int uftdi_param(void *, int, struct termios *); 91 int uftdi_open(void *sc, int portno); 92 void uftdi_read(void *sc, int portno, u_char **ptr, 93 u_int32_t *count); 94 void uftdi_write(void *sc, int portno, u_char *to, u_char *from, 95 u_int32_t *count); 96 void uftdi_break(void *sc, int portno, int onoff); 97 int uftdi_8u232am_getrate(struct uftdi_softc *sc, speed_t speed, int *rate); 98 int uftdi_2232h_getrate(speed_t speed, int *rate); 99 100 const struct ucom_methods uftdi_methods = { 101 uftdi_get_status, 102 uftdi_set, 103 uftdi_param, 104 NULL, 105 uftdi_open, 106 NULL, 107 uftdi_read, 108 uftdi_write, 109 }; 110 111 int uftdi_match(struct device *, void *, void *); 112 void uftdi_attach(struct device *, struct device *, void *); 113 int uftdi_detach(struct device *, int); 114 115 struct cfdriver uftdi_cd = { 116 NULL, "uftdi", DV_DULL 117 }; 118 119 const struct cfattach uftdi_ca = { 120 sizeof(struct uftdi_softc), uftdi_match, uftdi_attach, uftdi_detach 121 }; 122 123 static const struct usb_devno uftdi_devs[] = { 124 { USB_VENDOR_ALTI2, USB_PRODUCT_ALTI2_NEPTUNE3 }, 125 { USB_VENDOR_ANALOGDEVICES, USB_PRODUCT_ANALOGDEVICES_GNICE }, 126 { USB_VENDOR_ANALOGDEVICES, USB_PRODUCT_ANALOGDEVICES_GNICEPLUS }, 127 { USB_VENDOR_ATMEL, USB_PRODUCT_ATMEL_STK541 }, 128 { USB_VENDOR_BAYER, USB_PRODUCT_BAYER_CONTOUR }, 129 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_232USB9M }, 130 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_485USB9F2W }, 131 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_485USB9F4W }, 132 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_485USBTB_2W }, 133 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_485USBTB_4W }, 134 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_TTL3USB9M }, 135 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_TTL5USB9M }, 136 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_USO9ML2 }, 137 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_USO9ML2DR }, 138 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_USO9ML2DR2 }, 139 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_USOPTL4 }, 140 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_USOPTL4DR }, 141 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_USOPTL4DR2 }, 142 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_USOTL4 }, 143 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_USPTL4 }, 144 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_USTL4 }, 145 { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_ZZ_PROG1 }, 146 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US101 }, 147 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US159 }, 148 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US235 }, 149 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US257 }, 150 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US279_12 }, 151 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US279_34 }, 152 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US279_56 }, 153 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US279_78 }, 154 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US313 }, 155 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US320 }, 156 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US324 }, 157 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US346_12 }, 158 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US346_34 }, 159 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US701_12 }, 160 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US701_34 }, 161 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US842_12 }, 162 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US842_34 }, 163 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US842_56 }, 164 { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US842_78 }, 165 { USB_VENDOR_DRESDENELEC, USB_PRODUCT_DRESDENELEC_STB }, 166 { USB_VENDOR_DRESDENELEC, USB_PRODUCT_DRESDENELEC_WHT }, 167 { USB_VENDOR_ELEKTOR, USB_PRODUCT_ELEKTOR_FT323R }, 168 { USB_VENDOR_EVOLUTION, USB_PRODUCT_EVOLUTION_ER1 }, 169 { USB_VENDOR_EVOLUTION, USB_PRODUCT_EVOLUTION_RCM4_1 }, 170 { USB_VENDOR_EVOLUTION, USB_PRODUCT_EVOLUTION_RCM4_2 }, 171 { USB_VENDOR_FALCOM, USB_PRODUCT_FALCOM_SAMBA }, 172 { USB_VENDOR_FALCOM, USB_PRODUCT_FALCOM_TWIST }, 173 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ACCESSO }, 174 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ACG_HFDUAL }, 175 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ACTROBOTS }, 176 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ACTZWAVE }, 177 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_AMC232 }, 178 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ARTEMIS }, 179 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ASK_RDR4X7_1 }, 180 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ASK_RDR4X7_2 }, 181 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ASK_RDR4X7_3 }, 182 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ASK_RDR4X7_4 }, 183 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ASK_RDR4X7_5 }, 184 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ASK_RDR4X7_6 }, 185 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ASK_RDR4X7_7 }, 186 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ASK_RDR4X7_8 }, 187 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ATK16 }, 188 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ATK16C }, 189 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ATK16HR }, 190 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ATK16HRC }, 191 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ATK16IC }, 192 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_BCS_SE923 }, 193 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_CANDAPTER }, 194 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_CANUSB }, 195 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_CCS_ICDU20 }, 196 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_CCS_ICDU40 }, 197 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_CCS_ICDU64 }, 198 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_CCS_LOAD_N_GO }, 199 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_CCS_MACHX }, 200 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_CCS_PRIME8 }, 201 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_CHAMELEON }, 202 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_COASTAL_TNCX }, 203 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_DGQG }, 204 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_DMX4ALL }, 205 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_DUSB }, 206 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ECLO_1WIRE }, 207 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ECO_PRO }, 208 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_EISCOU }, 209 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_ALC8500 }, 210 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_CLI7000 }, 211 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_CSI8 }, 212 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_EM1000DL }, 213 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_EM1010PC }, 214 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_FEM }, 215 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_FHZ1000PC }, 216 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_FHZ1300PC }, 217 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_FM3RX }, 218 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_FS20SIG }, 219 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_HS485 }, 220 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_KL100 }, 221 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_MSM1 }, 222 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_PCD200 }, 223 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_PCK100 }, 224 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_PPS7330 }, 225 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_RFP500 }, 226 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_T1100 }, 227 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_TFD128 }, 228 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_TFM100 }, 229 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_TWS550 }, 230 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_UAD7 }, 231 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_UAD8 }, 232 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_UDF77 }, 233 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_UIO88 }, 234 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_ULA200 }, 235 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_UM100 }, 236 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_UMS100 }, 237 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_UO100 }, 238 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_UR100 }, 239 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_USI2 }, 240 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_USR }, 241 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_UTP8 }, 242 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_WS300PC }, 243 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_WS444PC }, 244 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_WS500 }, 245 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_WS550 }, 246 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_WS777 }, 247 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_ELV_WS888 }, 248 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_FISCO }, 249 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_FT232RL }, 250 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_FT232_1 }, 251 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_FT232_3 }, 252 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_FT232_4 }, 253 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_FT232_5 }, 254 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_FT232_6 }, 255 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_FT4232H }, 256 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_FTX }, 257 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_GAMMASCOUT }, 258 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_GUDE_1 }, 259 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_GUDE_2 }, 260 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_GUDE_3 }, 261 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_GUDE_4 }, 262 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_GUDE_5 }, 263 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_GUDE_6 }, 264 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_GUDE_7 }, 265 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_GUDE_8 }, 266 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_GUDE_9 }, 267 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_GUDE_A }, 268 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_GUDE_B }, 269 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_HO820 }, 270 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_HO870 }, 271 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_IBS_1 }, 272 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_IBS_APP70 }, 273 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_IBS_PCMCIA }, 274 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_IBS_PEDO }, 275 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_IBS_PICPRO }, 276 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_IBS_PK1 }, 277 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_IBS_RS232MON }, 278 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_IBS_US485 }, 279 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_IPLUS }, 280 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_IPLUS2 }, 281 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_JTAGCABLEII }, 282 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LCD_CFA_547 }, 283 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LCD_CFA_631 }, 284 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LCD_CFA_632 }, 285 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LCD_CFA_633 }, 286 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LCD_CFA_634 }, 287 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LCD_CFA_635 }, 288 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LCD_CFA_640 }, 289 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LCD_CFA_642 }, 290 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LCD_LK202_24 }, 291 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LCD_LK204_24 }, 292 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LCD_MTXO }, 293 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LCD_MX200 }, 294 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LINX_1 }, 295 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LINX_2 }, 296 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LINX_3 }, 297 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LINX_MASTER2 }, 298 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LM3S_DEVEL }, 299 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LM3S_EVAL }, 300 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LOCOBUFFER }, 301 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_MATRIX_2 }, 302 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_MATRIX_3 }, 303 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_MHAM_DB9 }, 304 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_MHAM_IC }, 305 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_MHAM_KW }, 306 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_MHAM_RS232 }, 307 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_MHAM_Y6 }, 308 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_MHAM_Y8 }, 309 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_MHAM_Y9 }, 310 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_MHAM_YS }, 311 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_MJS_SIRIUS_PC_1 }, 312 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_MJS_SIRIUS_PC_2 }, 313 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_NXTCAM }, 314 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_OCEANIC }, 315 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_OOCDLINK }, 316 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_OPENDCC }, 317 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_OPENDCC_GATEWAY }, 318 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_OPENDCC_SNIFFER }, 319 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_OPENDCC_THROTTLE }, 320 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_OPENPORT_13M }, 321 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_OPENPORT_13S }, 322 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_OPENPORT_13U }, 323 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_OPENRD }, 324 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_PCDJ_DAC2 }, 325 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_PIEGROUP_IR }, 326 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_PROTEGO_1 }, 327 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_PROTEGO_3 }, 328 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_PROTEGO_4 }, 329 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_PROTEGO_R200 }, 330 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_PYRAMID }, 331 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_R2000KU_RNG }, 332 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_RELAIS }, 333 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_REU_TINY }, 334 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SCS_0 }, 335 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SCS_1 }, 336 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SCS_2 }, 337 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SCS_3 }, 338 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SCS_4 }, 339 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SCS_5 }, 340 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SCS_6 }, 341 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SCS_7 }, 342 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SEMC_DSS20 }, 343 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SERIAL_2232C }, 344 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SERIAL_2232L }, 345 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SERIAL_232BM }, 346 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SERIAL_8U100AX }, 347 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SERIAL_8U232AM }, 348 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SERIAL_8U232AM4 }, 349 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SPROG_II }, 350 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SUUNTO }, 351 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_TERATRONIK_D2XX }, 352 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_TERATRONIK_VCP }, 353 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_THORLABS }, 354 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_TIRA1 }, 355 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_TNCX }, 356 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_TURTELIZER_JTAG }, 357 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_UNICOM }, 358 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_UOPTBR }, 359 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_USBSERIAL }, 360 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_USBUIRT }, 361 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_USBX_707 }, 362 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_VNHC }, 363 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_WESTREX_777 }, 364 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_WESTREX_8900F }, 365 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_XSENS_1 }, 366 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_XSENS_2 }, 367 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_XSENS_3 }, 368 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_XSENS_4 }, 369 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_XSENS_5 }, 370 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_XSENS_6 }, 371 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_XSENS_7 }, 372 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_XSENS_8 }, 373 { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_YEI_SC31 }, 374 { USB_VENDOR_GNOTOMETRICS, USB_PRODUCT_GNOTOMETRICS_AURICAL }, 375 { USB_VENDOR_ICOM, USB_PRODUCT_ICOM_ID1 }, 376 { USB_VENDOR_ICOM, USB_PRODUCT_ICOM_RP2000VR }, 377 { USB_VENDOR_ICOM, USB_PRODUCT_ICOM_RP2000VT }, 378 { USB_VENDOR_ICOM, USB_PRODUCT_ICOM_RP2C1 }, 379 { USB_VENDOR_ICOM, USB_PRODUCT_ICOM_RP2C2 }, 380 { USB_VENDOR_ICOM, USB_PRODUCT_ICOM_RP2D }, 381 { USB_VENDOR_ICOM, USB_PRODUCT_ICOM_RP2VR }, 382 { USB_VENDOR_ICOM, USB_PRODUCT_ICOM_RP2VT }, 383 { USB_VENDOR_ICOM, USB_PRODUCT_ICOM_RP4000VR }, 384 { USB_VENDOR_ICOM, USB_PRODUCT_ICOM_RP4000VT }, 385 { USB_VENDOR_IDTECH, USB_PRODUCT_IDTECH_SERIAL }, 386 { USB_VENDOR_INTERBIO, USB_PRODUCT_INTERBIO_IOBOARD }, 387 { USB_VENDOR_INTERBIO, USB_PRODUCT_INTERBIO_MINIIOBOARD }, 388 { USB_VENDOR_INTERBIO, USB_PRODUCT_INTERBIO_MINIIOBOARD2 }, 389 { USB_VENDOR_INTREPIDCS, USB_PRODUCT_INTREPIDCS_NEOVI }, 390 { USB_VENDOR_INTREPIDCS, USB_PRODUCT_INTREPIDCS_VALUECAN }, 391 { USB_VENDOR_IODATA, USB_PRODUCT_IODATA_FT232R }, 392 { USB_VENDOR_JETI, USB_PRODUCT_JETI_SPC1201 }, 393 { USB_VENDOR_KOBIL, USB_PRODUCT_KOBIL_B1 }, 394 { USB_VENDOR_KOBIL, USB_PRODUCT_KOBIL_KAAN }, 395 { USB_VENDOR_LARSENBRUSGAARD, USB_PRODUCT_LARSENBRUSGAARD_ALTITRACK }, 396 { USB_VENDOR_MARVELL, USB_PRODUCT_MARVELL_SHEEVAPLUG }, 397 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0100 }, 398 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0101 }, 399 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0102 }, 400 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0103 }, 401 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0104 }, 402 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0105 }, 403 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0106 }, 404 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0107 }, 405 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0108 }, 406 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0109 }, 407 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_010A }, 408 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_010B }, 409 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_010C }, 410 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_010D }, 411 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_010E }, 412 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_010F }, 413 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0110 }, 414 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0111 }, 415 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0112 }, 416 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0113 }, 417 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0114 }, 418 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0115 }, 419 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0116 }, 420 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0117 }, 421 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0118 }, 422 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0119 }, 423 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_011A }, 424 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_011B }, 425 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_011C }, 426 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_011D }, 427 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_011E }, 428 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_011F }, 429 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0120 }, 430 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0121 }, 431 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0122 }, 432 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0123 }, 433 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0124 }, 434 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0125 }, 435 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0126 }, 436 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0127 }, 437 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0128 }, 438 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0129 }, 439 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_012A }, 440 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_012B }, 441 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_012C }, 442 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_012D }, 443 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_012E }, 444 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_012F }, 445 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0130 }, 446 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0131 }, 447 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0132 }, 448 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0133 }, 449 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0134 }, 450 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0135 }, 451 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0136 }, 452 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0137 }, 453 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0138 }, 454 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0139 }, 455 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_013A }, 456 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_013B }, 457 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_013C }, 458 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_013D }, 459 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_013E }, 460 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_013F }, 461 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0140 }, 462 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0141 }, 463 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0142 }, 464 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0143 }, 465 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0144 }, 466 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0145 }, 467 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0146 }, 468 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0147 }, 469 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0148 }, 470 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0149 }, 471 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_014A }, 472 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_014B }, 473 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_014C }, 474 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_014D }, 475 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_014E }, 476 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_014F }, 477 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0150 }, 478 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0151 }, 479 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0152 }, 480 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0153 }, 481 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0154 }, 482 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0155 }, 483 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0156 }, 484 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0157 }, 485 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0158 }, 486 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0159 }, 487 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_015A }, 488 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_015B }, 489 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_015C }, 490 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_015D }, 491 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_015E }, 492 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_015F }, 493 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0160 }, 494 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0161 }, 495 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0162 }, 496 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0163 }, 497 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0164 }, 498 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0165 }, 499 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0166 }, 500 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0167 }, 501 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0168 }, 502 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0169 }, 503 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_016A }, 504 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_016B }, 505 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_016C }, 506 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_016D }, 507 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_016E }, 508 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_016F }, 509 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0170 }, 510 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0171 }, 511 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0172 }, 512 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0173 }, 513 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0174 }, 514 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0175 }, 515 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0176 }, 516 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0177 }, 517 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0178 }, 518 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0179 }, 519 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_017A }, 520 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_017B }, 521 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_017C }, 522 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_017D }, 523 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_017E }, 524 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_017F }, 525 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0180 }, 526 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0181 }, 527 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0182 }, 528 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0183 }, 529 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0184 }, 530 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0185 }, 531 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0186 }, 532 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0187 }, 533 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0188 }, 534 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0189 }, 535 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_018A }, 536 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_018B }, 537 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_018C }, 538 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_018D }, 539 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_018E }, 540 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_018F }, 541 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0190 }, 542 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0191 }, 543 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0192 }, 544 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0193 }, 545 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0194 }, 546 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0195 }, 547 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0196 }, 548 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0197 }, 549 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0198 }, 550 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_0199 }, 551 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_019A }, 552 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_019B }, 553 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_019C }, 554 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_019D }, 555 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_019E }, 556 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_019F }, 557 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01A0 }, 558 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01A1 }, 559 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01A2 }, 560 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01A3 }, 561 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01A4 }, 562 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01A5 }, 563 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01A6 }, 564 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01A7 }, 565 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01A8 }, 566 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01A9 }, 567 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01AA }, 568 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01AB }, 569 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01AC }, 570 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01AD }, 571 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01AE }, 572 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01AF }, 573 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01B0 }, 574 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01B1 }, 575 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01B2 }, 576 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01B3 }, 577 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01B4 }, 578 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01B5 }, 579 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01B6 }, 580 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01B7 }, 581 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01B8 }, 582 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01B9 }, 583 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01BA }, 584 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01BB }, 585 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01BC }, 586 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01BD }, 587 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01BE }, 588 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01BF }, 589 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01C0 }, 590 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01C1 }, 591 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01C2 }, 592 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01C3 }, 593 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01C4 }, 594 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01C5 }, 595 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01C6 }, 596 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01C7 }, 597 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01C8 }, 598 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01C9 }, 599 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01CA }, 600 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01CB }, 601 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01CC }, 602 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01CD }, 603 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01CE }, 604 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01CF }, 605 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01D0 }, 606 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01D1 }, 607 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01D2 }, 608 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01D3 }, 609 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01D4 }, 610 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01D5 }, 611 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01D6 }, 612 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01D7 }, 613 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01D8 }, 614 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01D9 }, 615 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01DA }, 616 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01DB }, 617 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01DC }, 618 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01DD }, 619 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01DE }, 620 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01DF }, 621 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01E0 }, 622 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01E1 }, 623 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01E2 }, 624 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01E3 }, 625 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01E4 }, 626 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01E5 }, 627 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01E6 }, 628 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01E7 }, 629 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01E8 }, 630 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01E9 }, 631 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01EA }, 632 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01EB }, 633 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01EC }, 634 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01ED }, 635 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01EE }, 636 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01EF }, 637 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01F0 }, 638 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01F1 }, 639 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01F2 }, 640 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01F3 }, 641 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01F4 }, 642 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01F5 }, 643 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01F6 }, 644 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01F7 }, 645 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01F8 }, 646 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01F9 }, 647 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01FA }, 648 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01FB }, 649 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01FC }, 650 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01FD }, 651 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01FE }, 652 { USB_VENDOR_MATRIXORB, USB_PRODUCT_MATRIXORB_LCD_01FF }, 653 { USB_VENDOR_MECANIQUE, USB_PRODUCT_MECANIQUE_TELLSTICK }, 654 { USB_VENDOR_MELCO, USB_PRODUCT_MELCO_PCOPRS1 }, 655 { USB_VENDOR_MOBILITY, USB_PRODUCT_MOBILITY_ED200H }, 656 { USB_VENDOR_OCT, USB_PRODUCT_OCT_US2308 }, 657 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_AD4USB }, 658 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_AP485_1 }, 659 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_AP485_2 }, 660 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_DRAK5 }, 661 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_DRAK6 }, 662 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_GOLIATH_MSR }, 663 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_GOLIATH_MUX }, 664 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_IRAMP }, 665 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_LEC }, 666 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_MUC }, 667 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_QUIDO101 }, 668 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_QUIDO216 }, 669 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_QUIDO22 }, 670 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_QUIDO303 }, 671 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_QUIDO332 }, 672 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_QUIDO44 }, 673 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_QUIDO603 }, 674 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_QUIDO88 }, 675 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_SB232 }, 676 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_SB422_1 }, 677 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_SB422_2 }, 678 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_SB485C }, 679 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_SB485S }, 680 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_SB485_1 }, 681 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_SB485_2 }, 682 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_SERIAL }, 683 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_SIMUKEY }, 684 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_STAVOVY }, 685 { USB_VENDOR_PAPOUCH, USB_PRODUCT_PAPOUCH_TMU }, 686 { USB_VENDOR_POSIFLEX, USB_PRODUCT_POSIFLEX_PP7000_1 }, 687 { USB_VENDOR_POSIFLEX, USB_PRODUCT_POSIFLEX_PP7000_2 }, 688 { USB_VENDOR_RATOC, USB_PRODUCT_RATOC_REXUSB60F }, 689 { USB_VENDOR_RTSYSTEMS, USB_PRODUCT_RTSYSTEMS_CT57B }, 690 { USB_VENDOR_SACOM, USB_PRODUCT_SACOM_USB485BL }, 691 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2101 }, 692 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2102 }, 693 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2103 }, 694 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2104 }, 695 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2106 }, 696 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2201_1 }, 697 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2201_2 }, 698 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2202_1 }, 699 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2202_2 }, 700 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2203_1 }, 701 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2203_2 }, 702 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2401_1 }, 703 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2401_2 }, 704 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2401_3 }, 705 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2401_4 }, 706 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2402_1 }, 707 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2402_2 }, 708 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2402_3 }, 709 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2402_4 }, 710 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2403_1 }, 711 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2403_2 }, 712 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2403_3 }, 713 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2403_4 }, 714 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2801_1 }, 715 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2801_2 }, 716 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2801_3 }, 717 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2801_4 }, 718 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2801_5 }, 719 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2801_6 }, 720 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2801_7 }, 721 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2801_8 }, 722 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2802_1 }, 723 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2802_2 }, 724 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2802_3 }, 725 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2802_4 }, 726 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2802_5 }, 727 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2802_6 }, 728 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2802_7 }, 729 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2802_8 }, 730 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2803_1 }, 731 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2803_2 }, 732 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2803_3 }, 733 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2803_4 }, 734 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2803_5 }, 735 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2803_6 }, 736 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2803_7 }, 737 { USB_VENDOR_SEALEVEL, USB_PRODUCT_SEALEVEL_2803_8 }, 738 { USB_VENDOR_STOLLMANN, USB_PRODUCT_STOLLMANN_ISDN_TA_USBA }, 739 { USB_VENDOR_TESTO, USB_PRODUCT_TESTO_174 }, 740 { USB_VENDOR_TESTO, USB_PRODUCT_TESTO_175 }, 741 { USB_VENDOR_TESTO, USB_PRODUCT_TESTO_330 }, 742 { USB_VENDOR_TESTO, USB_PRODUCT_TESTO_435 }, 743 { USB_VENDOR_TESTO, USB_PRODUCT_TESTO_556 }, 744 { USB_VENDOR_TESTO, USB_PRODUCT_TESTO_580 }, 745 { USB_VENDOR_TESTO, USB_PRODUCT_TESTO_845 }, 746 { USB_VENDOR_TESTO, USB_PRODUCT_TESTO_SERIAL_1 }, 747 { USB_VENDOR_TESTO, USB_PRODUCT_TESTO_SERIAL_2 }, 748 { USB_VENDOR_TESTO, USB_PRODUCT_TESTO_SERVICE }, 749 { USB_VENDOR_THURLBY, USB_PRODUCT_THURLBY_QL355P }, 750 { USB_VENDOR_TML, USB_PRODUCT_TML_SERIAL }, 751 { USB_VENDOR_UNKNOWN5, USB_PRODUCT_UNKNOWN5_NF_RIC } 752 }; 753 754 int 755 uftdi_match(struct device *parent, void *match, void *aux) 756 { 757 struct usb_attach_arg *uaa = aux; 758 759 if (uaa->iface == NULL || uaa->configno != 1) 760 return (UMATCH_NONE); 761 762 if (usb_lookup(uftdi_devs, uaa->vendor, uaa->product) == NULL) 763 return (UMATCH_NONE); 764 765 /* JTAG on USB interface 0 */ 766 if (uaa->vendor == USB_VENDOR_FTDI && 767 uaa->product == USB_PRODUCT_FTDI_OPENRD && 768 uaa->ifaceno == 0) 769 return (UMATCH_NONE); 770 771 return (UMATCH_VENDOR_PRODUCT_CONF_IFACE); 772 } 773 774 void 775 uftdi_attach(struct device *parent, struct device *self, void *aux) 776 { 777 struct uftdi_softc *sc = (struct uftdi_softc *)self; 778 struct usb_attach_arg *uaa = aux; 779 usb_interface_descriptor_t *id; 780 usb_endpoint_descriptor_t *ed; 781 char *devname = sc->sc_dev.dv_xname; 782 struct ucom_attach_args uca; 783 int i; 784 785 sc->sc_udev = uaa->device; 786 sc->sc_iface = uaa->iface; 787 788 if (uaa->release < 0x0200) { 789 sc->sc_type = UFTDI_TYPE_SIO; 790 sc->sc_hdrlen = 1; 791 } else if (uaa->release == 0x0600) { 792 sc->sc_type = UFTDI_TYPE_232R; 793 sc->sc_hdrlen = 0; 794 } else if (uaa->release == 0x0700 || uaa->release == 0x0800) { 795 sc->sc_type = UFTDI_TYPE_2232H; 796 sc->sc_hdrlen = 0; 797 } else { 798 sc->sc_type = UFTDI_TYPE_8U232AM; 799 sc->sc_hdrlen = 0; 800 } 801 802 uca.bulkin = uca.bulkout = -1; 803 id = usbd_get_interface_descriptor(sc->sc_iface); 804 for (i = 0; i < id->bNumEndpoints; i++) { 805 int addr, dir, attr; 806 ed = usbd_interface2endpoint_descriptor(sc->sc_iface, i); 807 if (ed == NULL) { 808 printf("%s: could not read endpoint descriptor\n", 809 devname); 810 goto bad; 811 } 812 813 addr = ed->bEndpointAddress; 814 dir = UE_GET_DIR(ed->bEndpointAddress); 815 attr = UE_GET_XFERTYPE(ed->bmAttributes); 816 if (dir == UE_DIR_IN && attr == UE_BULK) { 817 uca.bulkin = addr; 818 uca.ibufsize = (UGETW(ed->wMaxPacketSize) > 0) ? 819 UGETW(ed->wMaxPacketSize) : UFTDIIBUFSIZE; 820 } else if (dir == UE_DIR_OUT && attr == UE_BULK) { 821 uca.bulkout = addr; 822 uca.obufsize = (UGETW(ed->wMaxPacketSize) > 0) ? 823 UGETW(ed->wMaxPacketSize) : UFTDIOBUFSIZE; 824 uca.obufsize-= sc->sc_hdrlen; 825 } else { 826 printf("%s: unexpected endpoint\n", devname); 827 goto bad; 828 } 829 } 830 if (uca.bulkin == -1) { 831 printf("%s: Could not find data bulk in\n", 832 sc->sc_dev.dv_xname); 833 goto bad; 834 } 835 if (uca.bulkout == -1) { 836 printf("%s: Could not find data bulk out\n", 837 sc->sc_dev.dv_xname); 838 goto bad; 839 } 840 841 if (uaa->iface == NULL) 842 uca.portno = FTDI_PIT_SIOA; 843 else 844 uca.portno = FTDI_PIT_SIOA + id->bInterfaceNumber; 845 /* bulkin, bulkout set above */ 846 uca.ibufsizepad = uca.ibufsize; 847 uca.opkthdrlen = sc->sc_hdrlen; 848 uca.device = sc->sc_udev; 849 uca.iface = sc->sc_iface; 850 uca.methods = &uftdi_methods; 851 uca.arg = sc; 852 uca.info = NULL; 853 854 DPRINTF(("uftdi: in=0x%x out=0x%x\n", uca.bulkin, uca.bulkout)); 855 sc->sc_subdev = config_found_sm(self, &uca, ucomprint, ucomsubmatch); 856 857 return; 858 859 bad: 860 DPRINTF(("uftdi_attach: ATTACH ERROR\n")); 861 usbd_deactivate(sc->sc_udev); 862 } 863 864 int 865 uftdi_detach(struct device *self, int flags) 866 { 867 struct uftdi_softc *sc = (struct uftdi_softc *)self; 868 869 DPRINTF(("uftdi_detach: sc=%p flags=%d\n", sc, flags)); 870 if (sc->sc_subdev != NULL) { 871 config_detach(sc->sc_subdev, flags); 872 sc->sc_subdev = NULL; 873 } 874 875 return (0); 876 } 877 878 int 879 uftdi_open(void *vsc, int portno) 880 { 881 struct uftdi_softc *sc = vsc; 882 usb_device_request_t req; 883 usbd_status err; 884 struct termios t; 885 886 DPRINTF(("uftdi_open: sc=%p\n", sc)); 887 888 if (usbd_is_dying(sc->sc_udev)) 889 return (EIO); 890 891 /* Perform a full reset on the device */ 892 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 893 req.bRequest = FTDI_SIO_RESET; 894 USETW(req.wValue, FTDI_SIO_RESET_SIO); 895 USETW(req.wIndex, portno); 896 USETW(req.wLength, 0); 897 err = usbd_do_request(sc->sc_udev, &req, NULL); 898 if (err) 899 return (EIO); 900 901 /* Set 9600 baud, 2 stop bits, no parity, 8 bits */ 902 t.c_ospeed = 9600; 903 t.c_cflag = CSTOPB | CS8; 904 (void)uftdi_param(sc, portno, &t); 905 906 /* Turn on RTS/CTS flow control */ 907 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 908 req.bRequest = FTDI_SIO_SET_FLOW_CTRL; 909 USETW(req.wValue, 0); 910 USETW2(req.wIndex, FTDI_SIO_RTS_CTS_HS, portno); 911 USETW(req.wLength, 0); 912 err = usbd_do_request(sc->sc_udev, &req, NULL); 913 if (err) 914 return (EIO); 915 916 return (0); 917 } 918 919 void 920 uftdi_read(void *vsc, int portno, u_char **ptr, u_int32_t *count) 921 { 922 struct uftdi_softc *sc = vsc; 923 u_char msr, lsr; 924 925 DPRINTFN(15,("uftdi_read: sc=%p, port=%d count=%d\n", sc, portno, 926 *count)); 927 928 msr = FTDI_GET_MSR(*ptr); 929 lsr = FTDI_GET_LSR(*ptr); 930 931 #ifdef UFTDI_DEBUG 932 if (*count != 2) 933 DPRINTFN(10,("uftdi_read: sc=%p, port=%d count=%d data[0]=" 934 "0x%02x\n", sc, portno, *count, (*ptr)[2])); 935 #endif 936 937 if (sc->sc_msr != msr || 938 (sc->sc_lsr & FTDI_LSR_MASK) != (lsr & FTDI_LSR_MASK)) { 939 DPRINTF(("uftdi_read: status change msr=0x%02x(0x%02x) " 940 "lsr=0x%02x(0x%02x)\n", msr, sc->sc_msr, 941 lsr, sc->sc_lsr)); 942 sc->sc_msr = msr; 943 sc->sc_lsr = lsr; 944 ucom_status_change((struct ucom_softc *)sc->sc_subdev); 945 } 946 947 /* Pick up status and adjust data part. */ 948 *ptr += 2; 949 *count -= 2; 950 } 951 952 void 953 uftdi_write(void *vsc, int portno, u_char *to, u_char *from, u_int32_t *count) 954 { 955 struct uftdi_softc *sc = vsc; 956 957 DPRINTFN(10,("uftdi_write: sc=%p, port=%d count=%u data[0]=0x%02x\n", 958 vsc, portno, *count, from[0])); 959 960 /* Make length tag and copy data */ 961 if (sc->sc_hdrlen > 0) 962 *to = FTDI_OUT_TAG(*count, portno); 963 964 memcpy(to + sc->sc_hdrlen, from, *count); 965 *count += sc->sc_hdrlen; 966 } 967 968 void 969 uftdi_set(void *vsc, int portno, int reg, int onoff) 970 { 971 struct uftdi_softc *sc = vsc; 972 usb_device_request_t req; 973 int ctl; 974 975 DPRINTF(("uftdi_set: sc=%p, port=%d reg=%d onoff=%d\n", vsc, portno, 976 reg, onoff)); 977 978 switch (reg) { 979 case UCOM_SET_DTR: 980 ctl = onoff ? FTDI_SIO_SET_DTR_HIGH : FTDI_SIO_SET_DTR_LOW; 981 break; 982 case UCOM_SET_RTS: 983 ctl = onoff ? FTDI_SIO_SET_RTS_HIGH : FTDI_SIO_SET_RTS_LOW; 984 break; 985 case UCOM_SET_BREAK: 986 uftdi_break(sc, portno, onoff); 987 return; 988 default: 989 return; 990 } 991 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 992 req.bRequest = FTDI_SIO_MODEM_CTRL; 993 USETW(req.wValue, ctl); 994 USETW(req.wIndex, portno); 995 USETW(req.wLength, 0); 996 DPRINTFN(2,("uftdi_set: reqtype=0x%02x req=0x%02x value=0x%04x " 997 "index=0x%04x len=%d\n", req.bmRequestType, req.bRequest, 998 UGETW(req.wValue), UGETW(req.wIndex), UGETW(req.wLength))); 999 (void)usbd_do_request(sc->sc_udev, &req, NULL); 1000 } 1001 1002 int 1003 uftdi_param(void *vsc, int portno, struct termios *t) 1004 { 1005 struct uftdi_softc *sc = vsc; 1006 usb_device_request_t req; 1007 usbd_status err; 1008 int rate, data, flow; 1009 1010 DPRINTF(("uftdi_param: sc=%p\n", sc)); 1011 1012 if (usbd_is_dying(sc->sc_udev)) 1013 return (EIO); 1014 1015 switch (sc->sc_type) { 1016 case UFTDI_TYPE_SIO: 1017 switch (t->c_ospeed) { 1018 case 300: rate = ftdi_sio_b300; break; 1019 case 600: rate = ftdi_sio_b600; break; 1020 case 1200: rate = ftdi_sio_b1200; break; 1021 case 2400: rate = ftdi_sio_b2400; break; 1022 case 4800: rate = ftdi_sio_b4800; break; 1023 case 9600: rate = ftdi_sio_b9600; break; 1024 case 19200: rate = ftdi_sio_b19200; break; 1025 case 38400: rate = ftdi_sio_b38400; break; 1026 case 57600: rate = ftdi_sio_b57600; break; 1027 case 115200: rate = ftdi_sio_b115200; break; 1028 default: 1029 return (EINVAL); 1030 } 1031 break; 1032 1033 case UFTDI_TYPE_232R: 1034 case UFTDI_TYPE_8U232AM: 1035 if (uftdi_8u232am_getrate(sc, t->c_ospeed, &rate) == -1) 1036 return (EINVAL); 1037 break; 1038 case UFTDI_TYPE_2232H: 1039 if (uftdi_2232h_getrate(t->c_ospeed, &rate) == -1) 1040 return (EINVAL); 1041 break; 1042 } 1043 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 1044 req.bRequest = FTDI_SIO_SET_BAUD_RATE; 1045 USETW(req.wValue, rate); 1046 USETW(req.wIndex, ((rate >> 8) & 0xFF00) | portno); 1047 USETW(req.wLength, 0); 1048 DPRINTFN(2,("uftdi_param: reqtype=0x%02x req=0x%02x value=0x%04x " 1049 "index=0x%04x len=%d\n", req.bmRequestType, req.bRequest, 1050 UGETW(req.wValue), UGETW(req.wIndex), UGETW(req.wLength))); 1051 err = usbd_do_request(sc->sc_udev, &req, NULL); 1052 if (err) 1053 return (EIO); 1054 1055 if (ISSET(t->c_cflag, CSTOPB)) 1056 data = FTDI_SIO_SET_DATA_STOP_BITS_2; 1057 else 1058 data = FTDI_SIO_SET_DATA_STOP_BITS_1; 1059 if (ISSET(t->c_cflag, PARENB)) { 1060 if (ISSET(t->c_cflag, PARODD)) 1061 data |= FTDI_SIO_SET_DATA_PARITY_ODD; 1062 else 1063 data |= FTDI_SIO_SET_DATA_PARITY_EVEN; 1064 } else 1065 data |= FTDI_SIO_SET_DATA_PARITY_NONE; 1066 switch (ISSET(t->c_cflag, CSIZE)) { 1067 case CS5: 1068 data |= FTDI_SIO_SET_DATA_BITS(5); 1069 break; 1070 case CS6: 1071 data |= FTDI_SIO_SET_DATA_BITS(6); 1072 break; 1073 case CS7: 1074 data |= FTDI_SIO_SET_DATA_BITS(7); 1075 break; 1076 case CS8: 1077 data |= FTDI_SIO_SET_DATA_BITS(8); 1078 break; 1079 } 1080 sc->last_lcr = data; 1081 1082 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 1083 req.bRequest = FTDI_SIO_SET_DATA; 1084 USETW(req.wValue, data); 1085 USETW(req.wIndex, portno); 1086 USETW(req.wLength, 0); 1087 DPRINTFN(2,("uftdi_param: reqtype=0x%02x req=0x%02x value=0x%04x " 1088 "index=0x%04x len=%d\n", req.bmRequestType, req.bRequest, 1089 UGETW(req.wValue), UGETW(req.wIndex), UGETW(req.wLength))); 1090 err = usbd_do_request(sc->sc_udev, &req, NULL); 1091 if (err) 1092 return (EIO); 1093 1094 if (ISSET(t->c_cflag, CRTSCTS)) { 1095 flow = FTDI_SIO_RTS_CTS_HS; 1096 USETW(req.wValue, 0); 1097 } else if (ISSET(t->c_iflag, IXON|IXOFF)) { 1098 flow = FTDI_SIO_XON_XOFF_HS; 1099 USETW2(req.wValue, t->c_cc[VSTOP], t->c_cc[VSTART]); 1100 } else { 1101 flow = FTDI_SIO_DISABLE_FLOW_CTRL; 1102 USETW(req.wValue, 0); 1103 } 1104 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 1105 req.bRequest = FTDI_SIO_SET_FLOW_CTRL; 1106 USETW2(req.wIndex, flow, portno); 1107 USETW(req.wLength, 0); 1108 err = usbd_do_request(sc->sc_udev, &req, NULL); 1109 if (err) 1110 return (EIO); 1111 1112 return (0); 1113 } 1114 1115 void 1116 uftdi_get_status(void *vsc, int portno, u_char *lsr, u_char *msr) 1117 { 1118 struct uftdi_softc *sc = vsc; 1119 1120 DPRINTF(("uftdi_status: msr=0x%02x lsr=0x%02x\n", 1121 sc->sc_msr, sc->sc_lsr)); 1122 1123 if (msr != NULL) 1124 *msr = sc->sc_msr; 1125 if (lsr != NULL) 1126 *lsr = sc->sc_lsr; 1127 } 1128 1129 void 1130 uftdi_break(void *vsc, int portno, int onoff) 1131 { 1132 struct uftdi_softc *sc = vsc; 1133 usb_device_request_t req; 1134 int data; 1135 1136 DPRINTF(("uftdi_break: sc=%p, port=%d onoff=%d\n", vsc, portno, 1137 onoff)); 1138 1139 if (onoff) { 1140 data = sc->last_lcr | FTDI_SIO_SET_BREAK; 1141 } else { 1142 data = sc->last_lcr; 1143 } 1144 1145 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 1146 req.bRequest = FTDI_SIO_SET_DATA; 1147 USETW(req.wValue, data); 1148 USETW(req.wIndex, portno); 1149 USETW(req.wLength, 0); 1150 (void)usbd_do_request(sc->sc_udev, &req, NULL); 1151 } 1152 1153 int 1154 uftdi_8u232am_getrate(struct uftdi_softc *sc, speed_t speed, int *rate) 1155 { 1156 /* Table of the nearest even powers-of-2 for values 0..15. */ 1157 static const unsigned char roundoff[16] = { 1158 0, 2, 2, 4, 4, 4, 8, 8, 1159 8, 8, 8, 8, 16, 16, 16, 16, 1160 }; 1161 1162 unsigned int d, freq; 1163 int result; 1164 1165 if (speed <= 0) 1166 return (-1); 1167 1168 /* Special cases for 2M and 3M. */ 1169 if (speed >= 3000000 * 100 / 103 && 1170 speed <= 3000000 * 100 / 97) { 1171 result = 0; 1172 goto done; 1173 } 1174 if (speed >= 2000000 * 100 / 103 && 1175 speed <= 2000000 * 100 / 97) { 1176 result = 1; 1177 goto done; 1178 } 1179 1180 d = (FTDI_8U232AM_FREQ << 4) / speed; 1181 d = (d & ~15) + roundoff[d & 15]; 1182 1183 if (d < FTDI_8U232AM_MIN_DIV) 1184 d = FTDI_8U232AM_MIN_DIV; 1185 else if (d > FTDI_8U232AM_MAX_DIV) 1186 d = FTDI_8U232AM_MAX_DIV; 1187 1188 /* 1189 * Calculate the frequency needed for d to exactly divide down 1190 * to our target speed, and check that the actual frequency is 1191 * within 3% of this. 1192 */ 1193 freq = speed * d; 1194 if (freq < (quad_t)(FTDI_8U232AM_FREQ << 4) * 100 / 103 || 1195 freq > (quad_t)(FTDI_8U232AM_FREQ << 4) * 100 / 97) 1196 return (-1); 1197 1198 /* 1199 * Pack the divisor into the resultant value. The lower 1200 * 14-bits hold the integral part, while the upper 2 bits 1201 * encode the fractional component: either 0, 0.5, 0.25, or 1202 * 0.125. 1203 */ 1204 result = d >> 4; 1205 if (sc->sc_type == UFTDI_TYPE_8U232AM) { 1206 if (d & 8) 1207 result |= 0x4000; 1208 else if (d & 4) 1209 result |= 0x8000; 1210 } 1211 if (d & 2) 1212 result |= 0xc000; 1213 1214 done: 1215 *rate = result; 1216 return (0); 1217 } 1218 1219 int 1220 uftdi_2232h_getrate(speed_t speed, int *rate) 1221 { 1222 char sub[8] = {0, 3, 2, 4, 1, 5, 6, 7}; 1223 int n = (FTDI_2232H_FREQ << 3) / speed; 1224 int s = n & 7; 1225 int result = (n >> 3) | (sub[s] << 14); 1226 int resultspeed, accuracy; 1227 1228 /* Special cases */ 1229 if (result == 1) 1230 result = 0; 1231 else if (result == 0x4001) 1232 result = 1; 1233 1234 /* Check if resulting baud rate is within 3%. */ 1235 if (result == 0) 1236 goto done; 1237 resultspeed = (FTDI_2232H_FREQ << 3) / 1238 (((result & 0x00003FFF) << 3) | s); 1239 accuracy = (abs(speed - resultspeed) * 100) / speed; 1240 if (accuracy > 3) 1241 return -1; 1242 1243 done: 1244 result|= 0x00020000; /* Set this bit to turn off a divide by 2.5 */ 1245 *rate = result; 1246 return 0; 1247 } 1248