| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * Definitions for the FTDI USB Single Port Serial Converter -  | 
 | 3 |  * known as FTDI_SIO (Serial Input/Output application of the chipset)  | 
 | 4 |  * | 
 | 5 |  * The example I have is known as the USC-1000 which is available from | 
 | 6 |  * http://www.dse.co.nz - cat no XH4214 It looks similar to this: | 
 | 7 |  * http://www.dansdata.com/usbser.htm but I can't be sure There are other | 
 | 8 |  * USC-1000s which don't look like my device though so beware! | 
 | 9 |  * | 
 | 10 |  * The device is based on the FTDI FT8U100AX chip. It has a DB25 on one side,  | 
 | 11 |  * USB on the other. | 
 | 12 |  * | 
 | 13 |  * Thanx to FTDI (http://www.ftdi.co.uk) for so kindly providing details | 
 | 14 |  * of the protocol required to talk to the device and ongoing assistence | 
 | 15 |  * during development. | 
 | 16 |  * | 
 | 17 |  * Bill Ryder - bryder@sgi.com formerly of Silicon Graphics, Inc.- wrote the  | 
 | 18 |  * FTDI_SIO implementation. | 
 | 19 |  * | 
 | 20 |  * Philipp Gühring - pg@futureware.at - added the Device ID of the USB relais | 
 | 21 |  * from Rudolf Gugler | 
 | 22 |  * | 
 | 23 |  */ | 
 | 24 |  | 
 | 25 | #define FTDI_VID	0x0403	/* Vendor Id */ | 
 | 26 | #define FTDI_SIO_PID	0x8372	/* Product Id SIO application of 8U100AX  */ | 
 | 27 | #define FTDI_8U232AM_PID 0x6001 /* Similar device to SIO above */ | 
 | 28 | #define FTDI_8U232AM_ALT_PID 0x6006 /* FTDI's alternate PID for above */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 29 | #define FTDI_8U2232C_PID 0x6010 /* Dual channel device */ | 
 | 30 | #define FTDI_RELAIS_PID	0xFA10  /* Relais device from Rudolf Gugler */ | 
 | 31 | #define FTDI_NF_RIC_VID	0x0DCD	/* Vendor Id */ | 
 | 32 | #define FTDI_NF_RIC_PID	0x0001	/* Product Id */ | 
 | 33 |  | 
| Louis Nyffenegger | 641adaa | 2006-01-05 17:20:37 +0100 | [diff] [blame] | 34 |  | 
| Jonathan Davies | 2011e92 | 2006-08-09 10:48:03 +0100 | [diff] [blame] | 35 | /* www.canusb.com Lawicel CANUSB device */ | 
 | 36 | #define FTDI_CANUSB_PID 0xFFA8 /* Product Id */ | 
 | 37 |  | 
 | 38 | /* AlphaMicro Components AMC-232USB01 device */ | 
 | 39 | #define FTDI_AMC232_PID 0xFF00 /* Product Id */ | 
 | 40 |  | 
| Razvan Gavril | 72a9f95 | 2006-05-04 11:35:49 +0300 | [diff] [blame] | 41 | /* ACT Solutions HomePro ZWave interface (http://www.act-solutions.com/HomePro.htm) */ | 
 | 42 | #define FTDI_ACTZWAVE_PID	0xF2D0 | 
 | 43 |  | 
 | 44 |  | 
| Christophe Mariac | c0f8d56 | 2006-06-23 17:36:21 +0200 | [diff] [blame] | 45 | /* www.starting-point-systems.com µChameleon device */ | 
 | 46 | #define FTDI_MICRO_CHAMELEON_PID	0xCAA0	/* Product Id */ | 
 | 47 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 48 | /* www.irtrans.de device */ | 
 | 49 | #define FTDI_IRTRANS_PID 0xFC60 /* Product Id */ | 
 | 50 |  | 
| Louis Nyffenegger | 641adaa | 2006-01-05 17:20:37 +0100 | [diff] [blame] | 51 |  | 
 | 52 | /* www.thoughttechnology.com/ TT-USB provide with procomp use ftdi_sio */ | 
 | 53 | #define FTDI_TTUSB_PID 0xFF20 /* Product Id */ | 
 | 54 |  | 
| Luiz Fernando N. Capitulino | 69737df | 2006-04-11 15:52:41 -0300 | [diff] [blame] | 55 | /* iPlus device */ | 
 | 56 | #define FTDI_IPLUS_PID 0xD070 /* Product Id */ | 
 | 57 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 58 | /* www.crystalfontz.com devices - thanx for providing free devices for evaluation ! */ | 
 | 59 | /* they use the ftdi chipset for the USB interface and the vendor id is the same */ | 
 | 60 | #define FTDI_XF_632_PID 0xFC08	/* 632: 16x2 Character Display */ | 
 | 61 | #define FTDI_XF_634_PID 0xFC09	/* 634: 20x4 Character Display */ | 
 | 62 | #define FTDI_XF_547_PID 0xFC0A	/* 547: Two line Display */ | 
 | 63 | #define FTDI_XF_633_PID 0xFC0B	/* 633: 16x2 Character Display with Keys */ | 
 | 64 | #define FTDI_XF_631_PID 0xFC0C	/* 631: 20x2 Character Display */ | 
 | 65 | #define FTDI_XF_635_PID 0xFC0D	/* 635: 20x4 Character Display */ | 
 | 66 | #define FTDI_XF_640_PID 0xFC0E	/* 640: Two line Display */ | 
 | 67 | #define FTDI_XF_642_PID 0xFC0F	/* 642: Two line Display */ | 
 | 68 |  | 
 | 69 | /* Video Networks Limited / Homechoice in the UK use an ftdi-based device for their 1Mb */ | 
 | 70 | /* broadband internet service.  The following PID is exhibited by the usb device supplied */ | 
 | 71 | /* (the VID is the standard ftdi vid (FTDI_VID) */ | 
 | 72 | #define FTDI_VNHCPCUSB_D_PID 0xfe38 /* Product Id */ | 
 | 73 |  | 
 | 74 | /* | 
| Wouter Paesen | ce40d29 | 2006-01-03 14:30:31 +0100 | [diff] [blame] | 75 |  * PCDJ use ftdi based dj-controllers.  The following PID is for their DAC-2 device | 
 | 76 |  * http://www.pcdjhardware.com/DAC2.asp (PID sent by Wouter Paesen) | 
 | 77 |  * (the VID is the standard ftdi vid (FTDI_VID) */ | 
 | 78 | #define FTDI_PCDJ_DAC2_PID 0xFA88 | 
 | 79 |  | 
 | 80 | /* | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 81 |  * The following are the values for the Matrix Orbital LCD displays, | 
 | 82 |  * which are the FT232BM ( similar to the 8U232AM ) | 
 | 83 |  */ | 
 | 84 | #define FTDI_MTXORB_0_PID      0xFA00  /* Matrix Orbital Product Id */ | 
 | 85 | #define FTDI_MTXORB_1_PID      0xFA01  /* Matrix Orbital Product Id */ | 
 | 86 | #define FTDI_MTXORB_2_PID      0xFA02  /* Matrix Orbital Product Id */ | 
 | 87 | #define FTDI_MTXORB_3_PID      0xFA03  /* Matrix Orbital Product Id */ | 
 | 88 | #define FTDI_MTXORB_4_PID      0xFA04  /* Matrix Orbital Product Id */ | 
 | 89 | #define FTDI_MTXORB_5_PID      0xFA05  /* Matrix Orbital Product Id */ | 
 | 90 | #define FTDI_MTXORB_6_PID      0xFA06  /* Matrix Orbital Product Id */ | 
 | 91 |  | 
 | 92 | /* Interbiometrics USB I/O Board */ | 
 | 93 | /* Developed for Interbiometrics by Rudolf Gugler */ | 
 | 94 | #define INTERBIOMETRICS_VID              0x1209 | 
 | 95 | #define INTERBIOMETRICS_IOBOARD_PID      0x1002 | 
 | 96 | #define INTERBIOMETRICS_MINI_IOBOARD_PID 0x1006 | 
 | 97 |  | 
 | 98 | /* | 
 | 99 |  * The following are the values for the Perle Systems | 
 | 100 |  * UltraPort USB serial converters | 
 | 101 |  */ | 
 | 102 | #define FTDI_PERLE_ULTRAPORT_PID 0xF0C0	/* Perle UltraPort Product Id */ | 
 | 103 |  | 
 | 104 | /* | 
 | 105 |  * The following are the values for the Sealevel SeaLINK+ adapters. | 
 | 106 |  * (Original list sent by Tuan Hoang.  Ian Abbott renamed the macros and | 
 | 107 |  * removed some PIDs that don't seem to match any existing products.) | 
 | 108 |  */ | 
 | 109 | #define SEALEVEL_VID		0x0c52	/* Sealevel Vendor ID */ | 
 | 110 | #define SEALEVEL_2101_PID	0x2101	/* SeaLINK+232 (2101/2105) */ | 
 | 111 | #define SEALEVEL_2102_PID	0x2102	/* SeaLINK+485 (2102) */ | 
 | 112 | #define SEALEVEL_2103_PID	0x2103	/* SeaLINK+232I (2103) */ | 
 | 113 | #define SEALEVEL_2104_PID	0x2104	/* SeaLINK+485I (2104) */ | 
 | 114 | #define SEALEVEL_2201_1_PID	0x2211	/* SeaPORT+2/232 (2201) Port 1 */ | 
 | 115 | #define SEALEVEL_2201_2_PID	0x2221	/* SeaPORT+2/232 (2201) Port 2 */ | 
 | 116 | #define SEALEVEL_2202_1_PID	0x2212	/* SeaPORT+2/485 (2202) Port 1 */ | 
 | 117 | #define SEALEVEL_2202_2_PID	0x2222	/* SeaPORT+2/485 (2202) Port 2 */ | 
 | 118 | #define SEALEVEL_2203_1_PID	0x2213	/* SeaPORT+2 (2203) Port 1 */ | 
 | 119 | #define SEALEVEL_2203_2_PID	0x2223	/* SeaPORT+2 (2203) Port 2 */ | 
 | 120 | #define SEALEVEL_2401_1_PID	0x2411	/* SeaPORT+4/232 (2401) Port 1 */ | 
 | 121 | #define SEALEVEL_2401_2_PID	0x2421	/* SeaPORT+4/232 (2401) Port 2 */ | 
 | 122 | #define SEALEVEL_2401_3_PID	0x2431	/* SeaPORT+4/232 (2401) Port 3 */ | 
 | 123 | #define SEALEVEL_2401_4_PID	0x2441	/* SeaPORT+4/232 (2401) Port 4 */ | 
 | 124 | #define SEALEVEL_2402_1_PID	0x2412	/* SeaPORT+4/485 (2402) Port 1 */ | 
 | 125 | #define SEALEVEL_2402_2_PID	0x2422	/* SeaPORT+4/485 (2402) Port 2 */ | 
 | 126 | #define SEALEVEL_2402_3_PID	0x2432	/* SeaPORT+4/485 (2402) Port 3 */ | 
 | 127 | #define SEALEVEL_2402_4_PID	0x2442	/* SeaPORT+4/485 (2402) Port 4 */ | 
 | 128 | #define SEALEVEL_2403_1_PID	0x2413	/* SeaPORT+4 (2403) Port 1 */ | 
 | 129 | #define SEALEVEL_2403_2_PID	0x2423	/* SeaPORT+4 (2403) Port 2 */ | 
 | 130 | #define SEALEVEL_2403_3_PID	0x2433	/* SeaPORT+4 (2403) Port 3 */ | 
 | 131 | #define SEALEVEL_2403_4_PID	0x2443	/* SeaPORT+4 (2403) Port 4 */ | 
 | 132 | #define SEALEVEL_2801_1_PID	0X2811	/* SeaLINK+8/232 (2801) Port 1 */ | 
 | 133 | #define SEALEVEL_2801_2_PID	0X2821	/* SeaLINK+8/232 (2801) Port 2 */ | 
 | 134 | #define SEALEVEL_2801_3_PID	0X2831	/* SeaLINK+8/232 (2801) Port 3 */ | 
 | 135 | #define SEALEVEL_2801_4_PID	0X2841	/* SeaLINK+8/232 (2801) Port 4 */ | 
 | 136 | #define SEALEVEL_2801_5_PID	0X2851	/* SeaLINK+8/232 (2801) Port 5 */ | 
 | 137 | #define SEALEVEL_2801_6_PID	0X2861	/* SeaLINK+8/232 (2801) Port 6 */ | 
 | 138 | #define SEALEVEL_2801_7_PID	0X2871	/* SeaLINK+8/232 (2801) Port 7 */ | 
 | 139 | #define SEALEVEL_2801_8_PID	0X2881	/* SeaLINK+8/232 (2801) Port 8 */ | 
 | 140 | #define SEALEVEL_2802_1_PID	0X2812	/* SeaLINK+8/485 (2802) Port 1 */ | 
 | 141 | #define SEALEVEL_2802_2_PID	0X2822	/* SeaLINK+8/485 (2802) Port 2 */ | 
 | 142 | #define SEALEVEL_2802_3_PID	0X2832	/* SeaLINK+8/485 (2802) Port 3 */ | 
 | 143 | #define SEALEVEL_2802_4_PID	0X2842	/* SeaLINK+8/485 (2802) Port 4 */ | 
 | 144 | #define SEALEVEL_2802_5_PID	0X2852	/* SeaLINK+8/485 (2802) Port 5 */ | 
 | 145 | #define SEALEVEL_2802_6_PID	0X2862	/* SeaLINK+8/485 (2802) Port 6 */ | 
 | 146 | #define SEALEVEL_2802_7_PID	0X2872	/* SeaLINK+8/485 (2802) Port 7 */ | 
 | 147 | #define SEALEVEL_2802_8_PID	0X2882	/* SeaLINK+8/485 (2802) Port 8 */ | 
 | 148 | #define SEALEVEL_2803_1_PID	0X2813	/* SeaLINK+8 (2803) Port 1 */ | 
 | 149 | #define SEALEVEL_2803_2_PID	0X2823 	/* SeaLINK+8 (2803) Port 2 */ | 
 | 150 | #define SEALEVEL_2803_3_PID	0X2833 	/* SeaLINK+8 (2803) Port 3 */ | 
 | 151 | #define SEALEVEL_2803_4_PID	0X2843 	/* SeaLINK+8 (2803) Port 4 */ | 
 | 152 | #define SEALEVEL_2803_5_PID	0X2853 	/* SeaLINK+8 (2803) Port 5 */ | 
 | 153 | #define SEALEVEL_2803_6_PID	0X2863 	/* SeaLINK+8 (2803) Port 6 */ | 
 | 154 | #define SEALEVEL_2803_7_PID	0X2873 	/* SeaLINK+8 (2803) Port 7 */ | 
 | 155 | #define SEALEVEL_2803_8_PID	0X2883 	/* SeaLINK+8 (2803) Port 8 */ | 
 | 156 |  | 
 | 157 | /* | 
| Ian Abbott | b4723ae | 2005-11-23 15:45:23 -0800 | [diff] [blame] | 158 |  * The following are the values for two KOBIL chipcard terminals. | 
 | 159 |  */ | 
 | 160 | #define KOBIL_VID		0x0d46	/* KOBIL Vendor ID */ | 
 | 161 | #define KOBIL_CONV_B1_PID	0x2020	/* KOBIL Konverter for B1 */ | 
 | 162 | #define KOBIL_CONV_KAAN_PID	0x2021	/* KOBIL_Konverter for KAAN */ | 
 | 163 |  | 
 | 164 | /* | 
| A. Maitland Bottoms | bf58fbd | 2006-03-14 18:44:23 -0500 | [diff] [blame] | 165 |  * Icom ID-1 digital transceiver | 
 | 166 |  */ | 
 | 167 |  | 
 | 168 | #define ICOM_ID1_VID            0x0C26 | 
 | 169 | #define ICOM_ID1_PID            0x0004 | 
 | 170 |  | 
 | 171 | /* | 
| Ian Abbott | 7e0258f | 2006-04-12 15:20:35 +0100 | [diff] [blame] | 172 |  * ASK.fr devices | 
 | 173 |  */ | 
 | 174 | #define FTDI_ASK_RDR400_PID	0xC991	/* ASK RDR 400 series card reader */ | 
 | 175 |  | 
 | 176 | /* | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 177 |  * DSS-20 Sync Station for Sony Ericsson P800 | 
 | 178 |  */ | 
 | 179 |   | 
 | 180 | #define FTDI_DSS20_PID          0xFC82   | 
 | 181 |  | 
 | 182 | /* | 
 | 183 |  * Home Electronics (www.home-electro.com) USB gadgets | 
 | 184 |  */ | 
| Steven Cole | 093cf72 | 2005-05-03 19:07:24 -0600 | [diff] [blame] | 185 | #define FTDI_HE_TIRA1_PID	0xFA78	/* Tira-1 IR transceiver */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 186 |  | 
 | 187 | /* USB-UIRT - An infrared receiver and transmitter using the 8U232AM chip */ | 
 | 188 | /* http://home.earthlink.net/~jrhees/USBUIRT/index.htm */ | 
 | 189 | #define FTDI_USB_UIRT_PID	0xF850	/* Product Id */ | 
 | 190 |  | 
| Dave Platt | 274a4bb | 2006-07-18 21:26:54 -0700 | [diff] [blame] | 191 | /* TNC-X USB-to-packet-radio adapter, versions prior to 3.0 (DLP module) */ | 
 | 192 |  | 
 | 193 | #define FTDI_TNC_X_PID		0xEBE0 | 
 | 194 |  | 
| Ian Abbott | e6ac4a4 | 2005-08-02 14:01:27 +0100 | [diff] [blame] | 195 | /* | 
 | 196 |  * ELV USB devices submitted by Christian Abt of ELV (www.elv.de). | 
 | 197 |  * All of these devices use FTDI's vendor ID (0x0403). | 
 | 198 |  * | 
 | 199 |  * The previously included PID for the UO 100 module was incorrect. | 
 | 200 |  * In fact, that PID was for ELV's UR 100 USB-RS232 converter (0xFB58). | 
 | 201 |  * | 
 | 202 |  * Armin Laeuger originally sent the PID for the UM 100 module. | 
 | 203 |  */ | 
 | 204 | #define FTDI_ELV_UR100_PID	0xFB58	/* USB-RS232-Umsetzer (UR 100) */ | 
 | 205 | #define FTDI_ELV_UM100_PID	0xFB5A	/* USB-Modul UM 100 */ | 
 | 206 | #define FTDI_ELV_UO100_PID	0xFB5B	/* USB-Modul UO 100 */ | 
 | 207 | #define FTDI_ELV_ALC8500_PID	0xF06E	/* ALC 8500 Expert */ | 
 | 208 | /* Additional ELV PIDs that default to using the FTDI D2XX drivers on | 
 | 209 |  * MS Windows, rather than the FTDI Virtual Com Port drivers. | 
 | 210 |  * Maybe these will be easier to use with the libftdi/libusb user-space | 
 | 211 |  * drivers, or possibly the Comedi drivers in some cases. */ | 
 | 212 | #define FTDI_ELV_CLI7000_PID	0xFB59	/* Computer-Light-Interface (CLI 7000) */ | 
 | 213 | #define FTDI_ELV_PPS7330_PID	0xFB5C	/* Processor-Power-Supply (PPS 7330) */ | 
 | 214 | #define FTDI_ELV_TFM100_PID	0xFB5D	/* Temperartur-Feuchte Messgeraet (TFM 100) */ | 
 | 215 | #define FTDI_ELV_UDF77_PID	0xFB5E	/* USB DCF Funkurh (UDF 77) */ | 
 | 216 | #define FTDI_ELV_UIO88_PID	0xFB5F	/* USB-I/O Interface (UIO 88) */ | 
 | 217 | #define FTDI_ELV_UAD8_PID	0xF068	/* USB-AD-Wandler (UAD 8) */ | 
 | 218 | #define FTDI_ELV_UDA7_PID	0xF069	/* USB-DA-Wandler (UDA 7) */ | 
 | 219 | #define FTDI_ELV_USI2_PID	0xF06A	/* USB-Schrittmotoren-Interface (USI 2) */ | 
 | 220 | #define FTDI_ELV_T1100_PID	0xF06B	/* Thermometer (T 1100) */ | 
 | 221 | #define FTDI_ELV_PCD200_PID	0xF06C	/* PC-Datenlogger (PCD 200) */ | 
 | 222 | #define FTDI_ELV_ULA200_PID	0xF06D	/* USB-LCD-Ansteuerung (ULA 200) */ | 
 | 223 | #define FTDI_ELV_FHZ1000PC_PID	0xF06F	/* FHZ 1000 PC */ | 
 | 224 | #define FTDI_ELV_CSI8_PID	0xE0F0	/* Computer-Schalt-Interface (CSI 8) */ | 
 | 225 | #define FTDI_ELV_EM1000DL_PID	0xE0F1	/* PC-Datenlogger fuer Energiemonitor (EM 1000 DL) */ | 
 | 226 | #define FTDI_ELV_PCK100_PID	0xE0F2	/* PC-Kabeltester (PCK 100) */ | 
 | 227 | #define FTDI_ELV_RFP500_PID	0xE0F3	/* HF-Leistungsmesser (RFP 500) */ | 
 | 228 | #define FTDI_ELV_FS20SIG_PID	0xE0F4	/* Signalgeber (FS 20 SIG) */ | 
 | 229 | #define FTDI_ELV_WS300PC_PID	0xE0F6	/* PC-Wetterstation (WS 300 PC) */ | 
 | 230 | #define FTDI_ELV_FHZ1300PC_PID	0xE0E8	/* FHZ 1300 PC */ | 
 | 231 | #define FTDI_ELV_WS500_PID	0xE0E9	/* PC-Wetterstation (WS 500) */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 232 |  | 
 | 233 | /* | 
 | 234 |  * Definitions for ID TECH (www.idt-net.com) devices | 
 | 235 |  */ | 
 | 236 | #define IDTECH_VID		0x0ACD	/* ID TECH Vendor ID */ | 
 | 237 | #define IDTECH_IDT1221U_PID	0x0300	/* IDT1221U USB to RS-232 adapter */ | 
 | 238 |  | 
 | 239 | /* | 
 | 240 |  * Definitions for Omnidirectional Control Technology, Inc. devices | 
 | 241 |  */ | 
 | 242 | #define OCT_VID			0x0B39	/* OCT vendor ID */ | 
 | 243 | /* Note: OCT US101 is also rebadged as Dick Smith Electronics (NZ) XH6381 */ | 
| Ian Abbott | 6f92872 | 2005-04-29 16:06:14 +0100 | [diff] [blame] | 244 | /* Also rebadged as Dick Smith Electronics (Aus) XH6451 */ | 
 | 245 | /* Also rebadged as SIIG Inc. model US2308 hardware version 1 */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 246 | #define OCT_US101_PID		0x0421	/* OCT US101 USB to RS-232 */ | 
 | 247 |  | 
 | 248 | /* an infrared receiver for user access control with IR tags */ | 
 | 249 | #define FTDI_PIEGROUP_PID	0xF208	/* Product Id */ | 
 | 250 |  | 
 | 251 | /* | 
| Rui Santos | c9c7746 | 2005-09-23 20:06:50 +0100 | [diff] [blame] | 252 |  * Definitions for Artemis astronomical USB based cameras | 
 | 253 |  * Check it at http://www.artemisccd.co.uk/ | 
 | 254 |  */ | 
 | 255 | #define FTDI_ARTEMIS_PID	0xDF28	/* All Artemis Cameras */ | 
 | 256 |  | 
 | 257 | /* | 
 | 258 |  * Definitions for ATIK Instruments astronomical USB based cameras | 
 | 259 |  * Check it at http://www.atik-instruments.com/ | 
 | 260 |  */ | 
| Rui Santos | 09c280a | 2006-01-09 13:12:40 +0000 | [diff] [blame] | 261 | #define FTDI_ATIK_ATK16_PID	0xDF30	/* ATIK ATK-16 Grayscale Camera */ | 
 | 262 | #define FTDI_ATIK_ATK16C_PID	0xDF32	/* ATIK ATK-16C Colour Camera */ | 
 | 263 | #define FTDI_ATIK_ATK16HR_PID	0xDF31	/* ATIK ATK-16HR Grayscale Camera */ | 
 | 264 | #define FTDI_ATIK_ATK16HRC_PID	0xDF33	/* ATIK ATK-16HRC Colour Camera */ | 
| Rui Santos | c9c7746 | 2005-09-23 20:06:50 +0100 | [diff] [blame] | 265 |  | 
 | 266 | /* | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 267 |  * Protego product ids | 
 | 268 |  */ | 
 | 269 | #define PROTEGO_SPECIAL_1	0xFC70	/* special/unknown device */ | 
 | 270 | #define PROTEGO_R2X0		0xFC71	/* R200-USB TRNG unit (R210, R220, and R230) */ | 
 | 271 | #define PROTEGO_SPECIAL_3	0xFC72	/* special/unknown device */ | 
 | 272 | #define PROTEGO_SPECIAL_4	0xFC73	/* special/unknown device */ | 
 | 273 |  | 
 | 274 | /* | 
 | 275 |  * Gude Analog- und Digitalsysteme GmbH | 
 | 276 |  */ | 
 | 277 | #define FTDI_GUDEADS_E808_PID    0xE808 | 
 | 278 | #define FTDI_GUDEADS_E809_PID    0xE809 | 
 | 279 | #define FTDI_GUDEADS_E80A_PID    0xE80A | 
 | 280 | #define FTDI_GUDEADS_E80B_PID    0xE80B | 
 | 281 | #define FTDI_GUDEADS_E80C_PID    0xE80C | 
 | 282 | #define FTDI_GUDEADS_E80D_PID    0xE80D | 
 | 283 | #define FTDI_GUDEADS_E80E_PID    0xE80E | 
 | 284 | #define FTDI_GUDEADS_E80F_PID    0xE80F | 
 | 285 | #define FTDI_GUDEADS_E888_PID    0xE888  /* Expert ISDN Control USB */ | 
 | 286 | #define FTDI_GUDEADS_E889_PID    0xE889  /* USB RS-232 OptoBridge */ | 
 | 287 | #define FTDI_GUDEADS_E88A_PID    0xE88A | 
 | 288 | #define FTDI_GUDEADS_E88B_PID    0xE88B | 
 | 289 | #define FTDI_GUDEADS_E88C_PID    0xE88C | 
 | 290 | #define FTDI_GUDEADS_E88D_PID    0xE88D | 
 | 291 | #define FTDI_GUDEADS_E88E_PID    0xE88E | 
 | 292 | #define FTDI_GUDEADS_E88F_PID    0xE88F | 
 | 293 |  | 
 | 294 | /* | 
 | 295 |  * Linx Technologies product ids | 
 | 296 |  */ | 
 | 297 | #define LINX_SDMUSBQSS_PID	0xF448	/* Linx SDM-USB-QS-S */ | 
 | 298 | #define LINX_MASTERDEVEL2_PID   0xF449   /* Linx Master Development 2.0 */ | 
 | 299 | #define LINX_FUTURE_0_PID   0xF44A   /* Linx future device */ | 
 | 300 | #define LINX_FUTURE_1_PID   0xF44B   /* Linx future device */ | 
 | 301 | #define LINX_FUTURE_2_PID   0xF44C   /* Linx future device */ | 
 | 302 |  | 
 | 303 | /* CCS Inc. ICDU/ICDU40 product ID - the FT232BM is used in an in-circuit-debugger */ | 
 | 304 | /* unit for PIC16's/PIC18's */ | 
 | 305 | #define FTDI_CCSICDU20_0_PID    0xF9D0      | 
 | 306 | #define FTDI_CCSICDU40_1_PID    0xF9D1      | 
 | 307 |  | 
 | 308 | /* Inside Accesso contactless reader (http://www.insidefr.com) */ | 
 | 309 | #define INSIDE_ACCESSO		0xFAD0 | 
 | 310 |  | 
 | 311 | /* | 
 | 312 |  * Intrepid Control Systems (http://www.intrepidcs.com/) ValueCAN and NeoVI | 
 | 313 |  */ | 
 | 314 | #define INTREPID_VID		0x093C | 
 | 315 | #define INTREPID_VALUECAN_PID	0x0601 | 
 | 316 | #define INTREPID_NEOVI_PID	0x0701 | 
 | 317 |  | 
 | 318 | /* | 
 | 319 |  * Falcom Wireless Communications GmbH | 
 | 320 |  */ | 
 | 321 | #define FALCOM_VID		0x0F94	/* Vendor Id */ | 
 | 322 | #define FALCOM_TWIST_PID	0x0001	/* Falcom Twist USB GPRS modem */ | 
| Ian Abbott | e6ac4a4 | 2005-08-02 14:01:27 +0100 | [diff] [blame] | 323 | #define FALCOM_SAMBA_PID	0x0005	/* Falcom Samba USB GPRS modem */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 324 |  | 
 | 325 | /* | 
 | 326 |  * SUUNTO product ids | 
 | 327 |  */ | 
 | 328 | #define FTDI_SUUNTO_SPORTS_PID	0xF680	/* Suunto Sports instrument */ | 
 | 329 |  | 
 | 330 | /* | 
 | 331 |  * Definitions for B&B Electronics products. | 
 | 332 |  */ | 
 | 333 | #define BANDB_VID		0x0856	/* B&B Electronics Vendor ID */ | 
 | 334 | #define BANDB_USOTL4_PID	0xAC01	/* USOTL4 Isolated RS-485 Converter */ | 
 | 335 | #define BANDB_USTL4_PID		0xAC02	/* USTL4 RS-485 Converter */ | 
 | 336 | #define BANDB_USO9ML2_PID	0xAC03	/* USO9ML2 Isolated RS-232 Converter */ | 
 | 337 |  | 
 | 338 | /* | 
 | 339 |  * RM Michaelides CANview USB (http://www.rmcan.com) | 
| Ian Abbott | 6f92872 | 2005-04-29 16:06:14 +0100 | [diff] [blame] | 340 |  * CAN fieldbus interface adapter, added by port GmbH www.port.de) | 
 | 341 |  * Ian Abbott changed the macro names for consistency. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 342 |  */ | 
| Ian Abbott | 6f92872 | 2005-04-29 16:06:14 +0100 | [diff] [blame] | 343 | #define FTDI_RM_CANVIEW_PID	0xfd60	/* Product Id */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 344 |  | 
 | 345 | /* | 
 | 346 |  * EVER Eco Pro UPS (http://www.ever.com.pl/) | 
 | 347 |  */ | 
 | 348 |  | 
 | 349 | #define	EVER_ECO_PRO_CDS	0xe520	/* RS-232 converter */ | 
 | 350 |  | 
| Ian Abbott | 6f92872 | 2005-04-29 16:06:14 +0100 | [diff] [blame] | 351 | /* | 
 | 352 |  * 4N-GALAXY.DE PIDs for CAN-USB, USB-RS232, USB-RS422, USB-RS485, | 
 | 353 |  * USB-TTY activ, USB-TTY passiv.  Some PIDs are used by several devices | 
 | 354 |  * and I'm not entirely sure which are used by which. | 
 | 355 |  */ | 
 | 356 | #define FTDI_4N_GALAXY_DE_0_PID	0x8372 | 
 | 357 | #define FTDI_4N_GALAXY_DE_1_PID	0xF3C0 | 
 | 358 | #define FTDI_4N_GALAXY_DE_2_PID	0xF3C1 | 
 | 359 |  | 
 | 360 | /* | 
 | 361 |  * Mobility Electronics products. | 
 | 362 |  */ | 
 | 363 | #define MOBILITY_VID			0x1342 | 
 | 364 | #define MOBILITY_USB_SERIAL_PID		0x0202	/* EasiDock USB 200 serial */ | 
 | 365 |  | 
 | 366 | /* | 
| Ian Abbott | 9b1513d | 2005-07-29 12:16:31 -0700 | [diff] [blame] | 367 |  * microHAM product IDs (http://www.microham.com). | 
| Ian Abbott | 34d1a8a | 2006-02-27 14:05:32 +0000 | [diff] [blame] | 368 |  * Submitted by Justin Burket (KL1RL) <zorton@jtan.com> | 
 | 369 |  * and Mike Studer (K6EEP) <k6eep@hamsoftware.org>. | 
 | 370 |  * Ian Abbott <abbotti@mev.co.uk> added a few more from the driver INF file. | 
| Ian Abbott | 9b1513d | 2005-07-29 12:16:31 -0700 | [diff] [blame] | 371 |  */ | 
| Ian Abbott | 34d1a8a | 2006-02-27 14:05:32 +0000 | [diff] [blame] | 372 | #define FTDI_MHAM_KW_PID 0xEEE8		/* USB-KW interface */ | 
 | 373 | #define FTDI_MHAM_YS_PID 0xEEE9		/* USB-YS interface */ | 
| Ian Abbott | 9b1513d | 2005-07-29 12:16:31 -0700 | [diff] [blame] | 374 | #define FTDI_MHAM_Y6_PID 0xEEEA		/* USB-Y6 interface */ | 
 | 375 | #define FTDI_MHAM_Y8_PID 0xEEEB		/* USB-Y8 interface */ | 
| Ian Abbott | 34d1a8a | 2006-02-27 14:05:32 +0000 | [diff] [blame] | 376 | #define FTDI_MHAM_IC_PID 0xEEEC		/* USB-IC interface */ | 
 | 377 | #define FTDI_MHAM_DB9_PID 0xEEED	/* USB-DB9 interface */ | 
 | 378 | #define FTDI_MHAM_RS232_PID 0xEEEE	/* USB-RS232 interface */ | 
 | 379 | #define FTDI_MHAM_Y9_PID 0xEEEF		/* USB-Y9 interface */ | 
| Ian Abbott | 9b1513d | 2005-07-29 12:16:31 -0700 | [diff] [blame] | 380 |  | 
 | 381 | /* | 
| Ian Abbott | 6f92872 | 2005-04-29 16:06:14 +0100 | [diff] [blame] | 382 |  * Active Robots product ids. | 
 | 383 |  */ | 
 | 384 | #define FTDI_ACTIVE_ROBOTS_PID	0xE548	/* USB comms board */ | 
 | 385 |  | 
| Ian Abbott | 9b1513d | 2005-07-29 12:16:31 -0700 | [diff] [blame] | 386 | /* | 
| Ian Abbott | e6ac4a4 | 2005-08-02 14:01:27 +0100 | [diff] [blame] | 387 |  * Xsens Technologies BV products (http://www.xsens.com). | 
 | 388 |  */ | 
 | 389 | #define XSENS_CONVERTER_0_PID	0xD388 | 
 | 390 | #define XSENS_CONVERTER_1_PID	0xD389 | 
 | 391 | #define XSENS_CONVERTER_2_PID	0xD38A | 
 | 392 | #define XSENS_CONVERTER_3_PID	0xD38B | 
 | 393 | #define XSENS_CONVERTER_4_PID	0xD38C | 
 | 394 | #define XSENS_CONVERTER_5_PID	0xD38D | 
 | 395 | #define XSENS_CONVERTER_6_PID	0xD38E | 
 | 396 | #define XSENS_CONVERTER_7_PID	0xD38F | 
 | 397 |  | 
 | 398 | /* | 
| Ian Abbott | 740a428 | 2005-12-13 16:18:47 +0000 | [diff] [blame] | 399 |  * Teratronik product ids. | 
 | 400 |  * Submitted by O. Wölfelschneider. | 
 | 401 |  */ | 
 | 402 | #define FTDI_TERATRONIK_VCP_PID	 0xEC88	/* Teratronik device (preferring VCP driver on windows) */ | 
 | 403 | #define FTDI_TERATRONIK_D2XX_PID 0xEC89	/* Teratronik device (preferring D2XX driver on windows) */ | 
 | 404 |  | 
 | 405 | /* | 
| Ian Abbott | 9b1513d | 2005-07-29 12:16:31 -0700 | [diff] [blame] | 406 |  * Evolution Robotics products (http://www.evolution.com/). | 
 | 407 |  * Submitted by Shawn M. Lavelle. | 
 | 408 |  */ | 
 | 409 | #define EVOLUTION_VID		0xDEEE	/* Vendor ID */ | 
 | 410 | #define EVOLUTION_ER1_PID	0x0300	/* ER1 Control Module */ | 
 | 411 |  | 
| Thomas Riewe | 207c47e | 2005-09-29 14:57:29 +0200 | [diff] [blame] | 412 | /* Pyramid Computer GmbH */ | 
 | 413 | #define FTDI_PYRAMID_PID	0xE6C8	/* Pyramid Appliance Display */ | 
 | 414 |  | 
| Pavel Fedin | effac8b | 2005-12-09 09:30:59 +0300 | [diff] [blame] | 415 | /* | 
 | 416 |  * Posiflex inc retail equipment (http://www.posiflex.com.tw) | 
 | 417 |  */ | 
 | 418 | #define POSIFLEX_VID		0x0d3a  /* Vendor ID */ | 
 | 419 | #define POSIFLEX_PP7000_PID	0x0300  /* PP-7000II thermal printer */ | 
 | 420 |  | 
| Ian Abbott | a94b52a | 2006-01-09 17:11:40 +0000 | [diff] [blame] | 421 | /* | 
 | 422 |  * Westrex International devices submitted by Cory Lee | 
 | 423 |  */ | 
 | 424 | #define FTDI_WESTREX_MODEL_777_PID	0xDC00	/* Model 777 */ | 
 | 425 | #define FTDI_WESTREX_MODEL_8900F_PID	0xDC01	/* Model 8900F */ | 
 | 426 |  | 
| Ian Abbott | 7e1c0b8 | 2006-03-21 14:55:20 +0000 | [diff] [blame] | 427 | /* | 
| Nathan Bronson | cdd3b15 | 2006-04-10 00:05:09 -0400 | [diff] [blame] | 428 |  * RR-CirKits LocoBuffer USB (http://www.rr-cirkits.com) | 
 | 429 |  */ | 
 | 430 | #define FTDI_RRCIRKITS_LOCOBUFFER_PID	0xc7d0	/* LocoBuffer USB */ | 
 | 431 |  | 
 | 432 | /* | 
| Ian Abbott | 7e1c0b8 | 2006-03-21 14:55:20 +0000 | [diff] [blame] | 433 |  * Eclo (http://www.eclo.pt/) product IDs. | 
 | 434 |  * PID 0xEA90 submitted by Martin Grill. | 
 | 435 |  */ | 
 | 436 | #define FTDI_ECLO_COM_1WIRE_PID	0xEA90	/* COM to 1-Wire USB adaptor */ | 
 | 437 |  | 
| Folkert van Heusden | 62a13db | 2006-03-28 20:41:26 +0900 | [diff] [blame] | 438 | /* | 
 | 439 |  * Papouch products (http://www.papouch.com/) | 
 | 440 |  * Submitted by Folkert van Heusden | 
 | 441 |  */ | 
 | 442 |  | 
 | 443 | #define PAPOUCH_VID			0x5050	/* Vendor ID */ | 
 | 444 | #define PAPOUCH_TMU_PID			0x0400	/* TMU USB Thermometer */ | 
 | 445 |  | 
| Ian Abbott | 20a0f47 | 2006-05-04 11:34:25 +0100 | [diff] [blame] | 446 | /* | 
 | 447 |  * ACG Identification Technologies GmbH products (http://www.acg.de/). | 
 | 448 |  * Submitted by anton -at- goto10 -dot- org. | 
 | 449 |  */ | 
 | 450 | #define FTDI_ACG_HFDUAL_PID		0xDD20	/* HF Dual ISO Reader (RFID) */ | 
| Folkert van Heusden | 62a13db | 2006-03-28 20:41:26 +0900 | [diff] [blame] | 451 |  | 
| Ian Abbott | eb79b4f | 2006-05-30 12:36:30 +0100 | [diff] [blame] | 452 | /* | 
 | 453 |  * Yost Engineering, Inc. products (www.yostengineering.com). | 
 | 454 |  * PID 0xE050 submitted by Aaron Prose. | 
 | 455 |  */ | 
 | 456 | #define FTDI_YEI_SERVOCENTER31_PID	0xE050	/* YEI ServoCenter3.1 USB */ | 
 | 457 |  | 
| D. Peter Siddons | 4843748 | 2006-06-17 18:09:15 -0400 | [diff] [blame] | 458 | /* | 
 | 459 |  * ThorLabs USB motor drivers | 
 | 460 |  */ | 
 | 461 | #define FTDI_THORLABS_PID		0xfaf0 /* ThorLabs USB motor drivers */ | 
 | 462 |  | 
| Colin Leroy | e1979fe | 2006-07-11 11:36:43 +0200 | [diff] [blame] | 463 | /* | 
 | 464 |  * Testo products (http://www.testo.com/) | 
 | 465 |  * Submitted by Colin Leroy | 
 | 466 |  */ | 
 | 467 | #define TESTO_VID			0x128D | 
 | 468 | #define TESTO_USB_INTERFACE_PID		0x0001 | 
 | 469 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 470 | /* Commands */ | 
 | 471 | #define FTDI_SIO_RESET 		0 /* Reset the port */ | 
 | 472 | #define FTDI_SIO_MODEM_CTRL 	1 /* Set the modem control register */ | 
 | 473 | #define FTDI_SIO_SET_FLOW_CTRL	2 /* Set flow control register */ | 
 | 474 | #define FTDI_SIO_SET_BAUD_RATE	3 /* Set baud rate */ | 
 | 475 | #define FTDI_SIO_SET_DATA	4 /* Set the data characteristics of the port */ | 
 | 476 | #define FTDI_SIO_GET_MODEM_STATUS	5 /* Retrieve current value of modern status register */ | 
 | 477 | #define FTDI_SIO_SET_EVENT_CHAR	6 /* Set the event character */ | 
 | 478 | #define FTDI_SIO_SET_ERROR_CHAR	7 /* Set the error character */ | 
 | 479 | #define FTDI_SIO_SET_LATENCY_TIMER	9 /* Set the latency timer */ | 
 | 480 | #define FTDI_SIO_GET_LATENCY_TIMER	10 /* Get the latency timer */ | 
 | 481 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 482 |  | 
 | 483 | /* | 
 | 484 |  *   BmRequestType:  1100 0000b | 
 | 485 |  *   bRequest:       FTDI_E2_READ | 
 | 486 |  *   wValue:         0 | 
 | 487 |  *   wIndex:         Address of word to read | 
 | 488 |  *   wLength:        2 | 
 | 489 |  *   Data:           Will return a word of data from E2Address | 
 | 490 |  * | 
 | 491 |  */ | 
 | 492 |  | 
 | 493 | /* Port Identifier Table */ | 
 | 494 | #define PIT_DEFAULT 		0 /* SIOA */ | 
 | 495 | #define PIT_SIOA		1 /* SIOA */ | 
 | 496 | /* The device this driver is tested with one has only one port */ | 
 | 497 | #define PIT_SIOB		2 /* SIOB */ | 
 | 498 | #define PIT_PARALLEL		3 /* Parallel */ | 
 | 499 |  | 
 | 500 | /* FTDI_SIO_RESET */ | 
 | 501 | #define FTDI_SIO_RESET_REQUEST FTDI_SIO_RESET | 
 | 502 | #define FTDI_SIO_RESET_REQUEST_TYPE 0x40 | 
 | 503 | #define FTDI_SIO_RESET_SIO 0 | 
 | 504 | #define FTDI_SIO_RESET_PURGE_RX 1 | 
 | 505 | #define FTDI_SIO_RESET_PURGE_TX 2 | 
 | 506 |  | 
 | 507 | /* | 
 | 508 |  * BmRequestType:  0100 0000B | 
 | 509 |  * bRequest:       FTDI_SIO_RESET | 
 | 510 |  * wValue:         Control Value  | 
 | 511 |  *                   0 = Reset SIO | 
 | 512 |  *                   1 = Purge RX buffer | 
 | 513 |  *                   2 = Purge TX buffer | 
 | 514 |  * wIndex:         Port | 
 | 515 |  * wLength:        0 | 
 | 516 |  * Data:           None | 
 | 517 |  * | 
 | 518 |  * The Reset SIO command has this effect: | 
 | 519 |  * | 
 | 520 |  *    Sets flow control set to 'none' | 
 | 521 |  *    Event char = $0D | 
 | 522 |  *    Event trigger = disabled | 
 | 523 |  *    Purge RX buffer | 
 | 524 |  *    Purge TX buffer | 
 | 525 |  *    Clear DTR | 
 | 526 |  *    Clear RTS | 
 | 527 |  *    baud and data format not reset | 
 | 528 |  * | 
 | 529 |  * The Purge RX and TX buffer commands affect nothing except the buffers | 
 | 530 |  * | 
 | 531 |    */ | 
 | 532 |  | 
 | 533 | /* FTDI_SIO_SET_BAUDRATE */ | 
 | 534 | #define FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE 0x40 | 
 | 535 | #define FTDI_SIO_SET_BAUDRATE_REQUEST 3 | 
 | 536 |  | 
 | 537 | /* | 
 | 538 |  * BmRequestType:  0100 0000B | 
 | 539 |  * bRequest:       FTDI_SIO_SET_BAUDRATE | 
 | 540 |  * wValue:         BaudDivisor value - see below | 
 | 541 |  * wIndex:         Port | 
 | 542 |  * wLength:        0 | 
 | 543 |  * Data:           None | 
 | 544 |  * The BaudDivisor values are calculated as follows: | 
 | 545 |  * - BaseClock is either 12000000 or 48000000 depending on the device. FIXME: I wish | 
 | 546 |  *   I knew how to detect old chips to select proper base clock! | 
 | 547 |  * - BaudDivisor is a fixed point number encoded in a funny way. | 
 | 548 |  *   (--WRONG WAY OF THINKING--) | 
 | 549 |  *   BaudDivisor is a fixed point number encoded with following bit weighs: | 
 | 550 |  *   (-2)(-1)(13..0). It is a radical with a denominator of 4, so values | 
 | 551 |  *   end with 0.0 (00...), 0.25 (10...), 0.5 (01...), and 0.75 (11...). | 
 | 552 |  *   (--THE REALITY--) | 
 | 553 |  *   The both-bits-set has quite different meaning from 0.75 - the chip designers | 
 | 554 |  *   have decided it to mean 0.125 instead of 0.75. | 
 | 555 |  *   This info looked up in FTDI application note "FT8U232 DEVICES \ Data Rates | 
 | 556 |  *   and Flow Control Consideration for USB to RS232". | 
 | 557 |  * - BaudDivisor = (BaseClock / 16) / BaudRate, where the (=) operation should | 
 | 558 |  *   automagically re-encode the resulting value to take fractions into consideration. | 
 | 559 |  * As all values are integers, some bit twiddling is in order: | 
 | 560 |  *   BaudDivisor = (BaseClock / 16 / BaudRate) | | 
 | 561 |  *   (((BaseClock / 2 / BaudRate) & 4) ? 0x4000    // 0.5 | 
 | 562 |  *    : ((BaseClock / 2 / BaudRate) & 2) ? 0x8000  // 0.25 | 
 | 563 |  *    : ((BaseClock / 2 / BaudRate) & 1) ? 0xc000  // 0.125 | 
 | 564 |  *    : 0) | 
 | 565 |  * | 
 | 566 |  * For the FT232BM, a 17th divisor bit was introduced to encode the multiples | 
 | 567 |  * of 0.125 missing from the FT8U232AM.  Bits 16 to 14 are coded as follows | 
 | 568 |  * (the first four codes are the same as for the FT8U232AM, where bit 16 is | 
 | 569 |  * always 0): | 
 | 570 |  *   000 - add .000 to divisor | 
 | 571 |  *   001 - add .500 to divisor | 
 | 572 |  *   010 - add .250 to divisor | 
 | 573 |  *   011 - add .125 to divisor | 
 | 574 |  *   100 - add .375 to divisor | 
 | 575 |  *   101 - add .625 to divisor | 
 | 576 |  *   110 - add .750 to divisor | 
 | 577 |  *   111 - add .875 to divisor | 
 | 578 |  * Bits 15 to 0 of the 17-bit divisor are placed in the urb value.  Bit 16 is  | 
 | 579 |  * placed in bit 0 of the urb index. | 
 | 580 |  * | 
 | 581 |  * Note that there are a couple of special cases to support the highest baud | 
 | 582 |  * rates.  If the calculated divisor value is 1, this needs to be replaced with | 
 | 583 |  * 0.  Additionally for the FT232BM, if the calculated divisor value is 0x4001 | 
 | 584 |  * (1.5), this needs to be replaced with 0x0001 (1) (but this divisor value is | 
 | 585 |  * not supported by the FT8U232AM). | 
 | 586 |  */ | 
 | 587 |  | 
 | 588 | typedef enum { | 
 | 589 | 	SIO = 1, | 
 | 590 | 	FT8U232AM = 2, | 
 | 591 | 	FT232BM = 3, | 
 | 592 | 	FT2232C = 4, | 
 | 593 | } ftdi_chip_type_t; | 
 | 594 |  | 
 | 595 | typedef enum { | 
 | 596 |  ftdi_sio_b300 = 0,  | 
 | 597 |  ftdi_sio_b600 = 1,  | 
 | 598 |  ftdi_sio_b1200 = 2, | 
 | 599 |  ftdi_sio_b2400 = 3, | 
 | 600 |  ftdi_sio_b4800 = 4, | 
 | 601 |  ftdi_sio_b9600 = 5, | 
 | 602 |  ftdi_sio_b19200 = 6, | 
 | 603 |  ftdi_sio_b38400 = 7, | 
 | 604 |  ftdi_sio_b57600 = 8, | 
 | 605 |  ftdi_sio_b115200 = 9 | 
 | 606 | } FTDI_SIO_baudrate_t ; | 
 | 607 |  | 
 | 608 | /* | 
 | 609 |  * The ftdi_8U232AM_xxMHz_byyy constants have been removed. The encoded divisor values | 
 | 610 |  * are calculated internally. | 
 | 611 |  */ | 
 | 612 |  | 
 | 613 | #define FTDI_SIO_SET_DATA_REQUEST FTDI_SIO_SET_DATA | 
 | 614 | #define FTDI_SIO_SET_DATA_REQUEST_TYPE 0x40 | 
 | 615 | #define FTDI_SIO_SET_DATA_PARITY_NONE (0x0 << 8 ) | 
 | 616 | #define FTDI_SIO_SET_DATA_PARITY_ODD (0x1 << 8 ) | 
 | 617 | #define FTDI_SIO_SET_DATA_PARITY_EVEN (0x2 << 8 ) | 
 | 618 | #define FTDI_SIO_SET_DATA_PARITY_MARK (0x3 << 8 ) | 
 | 619 | #define FTDI_SIO_SET_DATA_PARITY_SPACE (0x4 << 8 ) | 
 | 620 | #define FTDI_SIO_SET_DATA_STOP_BITS_1 (0x0 << 11 ) | 
 | 621 | #define FTDI_SIO_SET_DATA_STOP_BITS_15 (0x1 << 11 ) | 
 | 622 | #define FTDI_SIO_SET_DATA_STOP_BITS_2 (0x2 << 11 ) | 
 | 623 | #define FTDI_SIO_SET_BREAK (0x1 << 14) | 
 | 624 | /* FTDI_SIO_SET_DATA */ | 
 | 625 |  | 
 | 626 | /* | 
 | 627 |  * BmRequestType:  0100 0000B  | 
 | 628 |  * bRequest:       FTDI_SIO_SET_DATA | 
 | 629 |  * wValue:         Data characteristics (see below) | 
 | 630 |  * wIndex:         Port | 
 | 631 |  * wLength:        0 | 
 | 632 |  * Data:           No | 
 | 633 |  * | 
 | 634 |  * Data characteristics | 
 | 635 |  * | 
 | 636 |  *   B0..7   Number of data bits | 
 | 637 |  *   B8..10  Parity | 
 | 638 |  *           0 = None | 
 | 639 |  *           1 = Odd | 
 | 640 |  *           2 = Even | 
 | 641 |  *           3 = Mark | 
 | 642 |  *           4 = Space | 
 | 643 |  *   B11..13 Stop Bits | 
 | 644 |  *           0 = 1 | 
 | 645 |  *           1 = 1.5 | 
 | 646 |  *           2 = 2 | 
 | 647 |  *   B14 | 
 | 648 |  *           1 = TX ON (break) | 
 | 649 |  *           0 = TX OFF (normal state) | 
 | 650 |  *   B15 Reserved | 
 | 651 |  * | 
 | 652 |  */ | 
 | 653 |  | 
 | 654 |  | 
 | 655 |  | 
 | 656 | /* FTDI_SIO_MODEM_CTRL */ | 
 | 657 | #define FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE 0x40 | 
 | 658 | #define FTDI_SIO_SET_MODEM_CTRL_REQUEST FTDI_SIO_MODEM_CTRL | 
 | 659 |  | 
 | 660 | /*  | 
 | 661 |  * BmRequestType:   0100 0000B | 
 | 662 |  * bRequest:        FTDI_SIO_MODEM_CTRL | 
 | 663 |  * wValue:          ControlValue (see below) | 
 | 664 |  * wIndex:          Port | 
 | 665 |  * wLength:         0 | 
 | 666 |  * Data:            None | 
 | 667 |  * | 
 | 668 |  * NOTE: If the device is in RTS/CTS flow control, the RTS set by this | 
 | 669 |  * command will be IGNORED without an error being returned | 
 | 670 |  * Also - you can not set DTR and RTS with one control message | 
 | 671 |  */ | 
 | 672 |  | 
 | 673 | #define FTDI_SIO_SET_DTR_MASK 0x1 | 
 | 674 | #define FTDI_SIO_SET_DTR_HIGH ( 1 | ( FTDI_SIO_SET_DTR_MASK  << 8)) | 
 | 675 | #define FTDI_SIO_SET_DTR_LOW  ( 0 | ( FTDI_SIO_SET_DTR_MASK  << 8)) | 
 | 676 | #define FTDI_SIO_SET_RTS_MASK 0x2 | 
 | 677 | #define FTDI_SIO_SET_RTS_HIGH ( 2 | ( FTDI_SIO_SET_RTS_MASK << 8 )) | 
 | 678 | #define FTDI_SIO_SET_RTS_LOW ( 0 | ( FTDI_SIO_SET_RTS_MASK << 8 )) | 
 | 679 |  | 
 | 680 | /* | 
 | 681 |  * ControlValue | 
 | 682 |  * B0    DTR state | 
 | 683 |  *          0 = reset | 
 | 684 |  *          1 = set | 
 | 685 |  * B1    RTS state | 
 | 686 |  *          0 = reset | 
 | 687 |  *          1 = set | 
 | 688 |  * B2..7 Reserved | 
 | 689 |  * B8    DTR state enable | 
 | 690 |  *          0 = ignore | 
 | 691 |  *          1 = use DTR state | 
 | 692 |  * B9    RTS state enable | 
 | 693 |  *          0 = ignore | 
 | 694 |  *          1 = use RTS state | 
 | 695 |  * B10..15 Reserved | 
 | 696 |  */ | 
 | 697 |  | 
 | 698 | /* FTDI_SIO_SET_FLOW_CTRL */ | 
 | 699 | #define FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE 0x40 | 
 | 700 | #define FTDI_SIO_SET_FLOW_CTRL_REQUEST FTDI_SIO_SET_FLOW_CTRL | 
 | 701 | #define FTDI_SIO_DISABLE_FLOW_CTRL 0x0  | 
 | 702 | #define FTDI_SIO_RTS_CTS_HS (0x1 << 8) | 
 | 703 | #define FTDI_SIO_DTR_DSR_HS (0x2 << 8) | 
 | 704 | #define FTDI_SIO_XON_XOFF_HS (0x4 << 8) | 
 | 705 | /* | 
 | 706 |  *   BmRequestType:  0100 0000b | 
 | 707 |  *   bRequest:       FTDI_SIO_SET_FLOW_CTRL | 
 | 708 |  *   wValue:         Xoff/Xon | 
 | 709 |  *   wIndex:         Protocol/Port - hIndex is protocl / lIndex is port | 
 | 710 |  *   wLength:        0  | 
 | 711 |  *   Data:           None | 
 | 712 |  * | 
 | 713 |  * hIndex protocol is: | 
 | 714 |  *   B0 Output handshaking using RTS/CTS | 
 | 715 |  *       0 = disabled | 
 | 716 |  *       1 = enabled | 
 | 717 |  *   B1 Output handshaking using DTR/DSR | 
 | 718 |  *       0 = disabled | 
 | 719 |  *       1 = enabled | 
 | 720 |  *   B2 Xon/Xoff handshaking | 
 | 721 |  *       0 = disabled | 
 | 722 |  *       1 = enabled | 
 | 723 |  * | 
 | 724 |  * A value of zero in the hIndex field disables handshaking | 
 | 725 |  * | 
 | 726 |  * If Xon/Xoff handshaking is specified, the hValue field should contain the XOFF character  | 
 | 727 |  * and the lValue field contains the XON character. | 
 | 728 |  */   | 
 | 729 |   | 
 | 730 | /* | 
 | 731 |  * FTDI_SIO_GET_LATENCY_TIMER | 
 | 732 |  * | 
 | 733 |  * Set the timeout interval. The FTDI collects data from the slave | 
 | 734 |  * device, transmitting it to the host when either A) 62 bytes are | 
 | 735 |  * received, or B) the timeout interval has elapsed and the buffer | 
 | 736 |  * contains at least 1 byte.  Setting this value to a small number | 
 | 737 |  * can dramatically improve performance for applications which send | 
 | 738 |  * small packets, since the default value is 16ms. | 
 | 739 |  */ | 
 | 740 | #define  FTDI_SIO_GET_LATENCY_TIMER_REQUEST FTDI_SIO_GET_LATENCY_TIMER | 
 | 741 | #define  FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE 0xC0 | 
 | 742 |  | 
 | 743 | /*  | 
 | 744 |  *  BmRequestType:   1100 0000b | 
 | 745 |  *  bRequest:        FTDI_SIO_GET_LATENCY_TIMER | 
 | 746 |  *  wValue:          0 | 
 | 747 |  *  wIndex:          Port | 
 | 748 |  *  wLength:         0 | 
 | 749 |  *  Data:            latency (on return) | 
 | 750 |  */ | 
 | 751 |  | 
 | 752 | /*  | 
 | 753 |  * FTDI_SIO_SET_LATENCY_TIMER | 
 | 754 |  * | 
 | 755 |  * Set the timeout interval. The FTDI collects data from the slave | 
 | 756 |  * device, transmitting it to the host when either A) 62 bytes are | 
 | 757 |  * received, or B) the timeout interval has elapsed and the buffer | 
 | 758 |  * contains at least 1 byte.  Setting this value to a small number | 
 | 759 |  * can dramatically improve performance for applications which send | 
 | 760 |  * small packets, since the default value is 16ms. | 
 | 761 |  */ | 
 | 762 | #define  FTDI_SIO_SET_LATENCY_TIMER_REQUEST FTDI_SIO_SET_LATENCY_TIMER | 
 | 763 | #define  FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE 0x40 | 
 | 764 |  | 
 | 765 | /*  | 
 | 766 |  *  BmRequestType:   0100 0000b | 
 | 767 |  *  bRequest:        FTDI_SIO_SET_LATENCY_TIMER | 
 | 768 |  *  wValue:          Latency (milliseconds) | 
 | 769 |  *  wIndex:          Port | 
 | 770 |  *  wLength:         0 | 
 | 771 |  *  Data:            None | 
 | 772 |  * | 
 | 773 |  * wValue: | 
 | 774 |  *   B0..7   Latency timer | 
 | 775 |  *   B8..15  0 | 
 | 776 |  * | 
 | 777 |  */ | 
 | 778 |  | 
 | 779 | /* | 
 | 780 |  * FTDI_SIO_SET_EVENT_CHAR  | 
 | 781 |  * | 
 | 782 |  * Set the special event character for the specified communications port. | 
 | 783 |  * If the device sees this character it will immediately return the | 
 | 784 |  * data read so far - rather than wait 40ms or until 62 bytes are read | 
 | 785 |  * which is what normally happens. | 
 | 786 |  */ | 
 | 787 |  | 
 | 788 |  | 
 | 789 | #define  FTDI_SIO_SET_EVENT_CHAR_REQUEST FTDI_SIO_SET_EVENT_CHAR | 
 | 790 | #define  FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE 0x40 | 
 | 791 |  | 
 | 792 |  | 
 | 793 | /*  | 
 | 794 |  *  BmRequestType:   0100 0000b | 
 | 795 |  *  bRequest:        FTDI_SIO_SET_EVENT_CHAR | 
 | 796 |  *  wValue:          EventChar | 
 | 797 |  *  wIndex:          Port | 
 | 798 |  *  wLength:         0 | 
 | 799 |  *  Data:            None | 
 | 800 |  * | 
 | 801 |  * wValue: | 
 | 802 |  *   B0..7   Event Character | 
 | 803 |  *   B8      Event Character Processing | 
 | 804 |  *             0 = disabled | 
 | 805 |  *             1 = enabled | 
 | 806 |  *   B9..15  Reserved | 
 | 807 |  * | 
 | 808 |  */ | 
 | 809 |            | 
 | 810 | /* FTDI_SIO_SET_ERROR_CHAR */ | 
 | 811 |  | 
 | 812 | /* Set the parity error replacement character for the specified communications port */ | 
 | 813 |  | 
 | 814 | /*  | 
 | 815 |  *  BmRequestType:  0100 0000b | 
 | 816 |  *  bRequest:       FTDI_SIO_SET_EVENT_CHAR | 
 | 817 |  *  wValue:         Error Char | 
 | 818 |  *  wIndex:         Port | 
 | 819 |  *  wLength:        0 | 
 | 820 |  *  Data:           None | 
 | 821 |  * | 
 | 822 |  *Error Char | 
 | 823 |  *  B0..7  Error Character | 
 | 824 |  *  B8     Error Character Processing | 
 | 825 |  *           0 = disabled | 
 | 826 |  *           1 = enabled | 
 | 827 |  *  B9..15 Reserved | 
 | 828 |  * | 
 | 829 |  */ | 
 | 830 |  | 
 | 831 | /* FTDI_SIO_GET_MODEM_STATUS */ | 
| Matt Mackall | 4a4efbd | 2006-01-03 13:27:11 +0100 | [diff] [blame] | 832 | /* Retrieve the current value of the modem status register */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 833 |  | 
 | 834 | #define FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE 0xc0 | 
 | 835 | #define FTDI_SIO_GET_MODEM_STATUS_REQUEST FTDI_SIO_GET_MODEM_STATUS | 
 | 836 | #define FTDI_SIO_CTS_MASK 0x10 | 
 | 837 | #define FTDI_SIO_DSR_MASK 0x20 | 
 | 838 | #define FTDI_SIO_RI_MASK  0x40 | 
 | 839 | #define FTDI_SIO_RLSD_MASK 0x80 | 
 | 840 | /*  | 
 | 841 |  *   BmRequestType:   1100 0000b | 
 | 842 |  *   bRequest:        FTDI_SIO_GET_MODEM_STATUS | 
 | 843 |  *   wValue:          zero | 
 | 844 |  *   wIndex:          Port | 
 | 845 |  *   wLength:         1 | 
 | 846 |  *   Data:            Status | 
 | 847 |  *  | 
 | 848 |  * One byte of data is returned  | 
 | 849 |  * B0..3 0 | 
 | 850 |  * B4    CTS | 
 | 851 |  *         0 = inactive | 
 | 852 |  *         1 = active | 
 | 853 |  * B5    DSR | 
 | 854 |  *         0 = inactive | 
 | 855 |  *         1 = active | 
 | 856 |  * B6    Ring Indicator (RI) | 
 | 857 |  *         0 = inactive | 
 | 858 |  *         1 = active | 
 | 859 |  * B7    Receive Line Signal Detect (RLSD) | 
 | 860 |  *         0 = inactive | 
 | 861 |  *         1 = active  | 
 | 862 |  */ | 
 | 863 |  | 
 | 864 |  | 
 | 865 |  | 
 | 866 | /* Descriptors returned by the device  | 
 | 867 |  *  | 
 | 868 |  *  Device Descriptor | 
 | 869 |  *  | 
 | 870 |  * Offset	Field		Size	Value	Description | 
 | 871 |  * 0	bLength		1	0x12	Size of descriptor in bytes | 
 | 872 |  * 1	bDescriptorType	1	0x01	DEVICE Descriptor Type | 
 | 873 |  * 2	bcdUSB		2	0x0110	USB Spec Release Number | 
 | 874 |  * 4	bDeviceClass	1	0x00	Class Code | 
 | 875 |  * 5	bDeviceSubClass	1	0x00	SubClass Code | 
 | 876 |  * 6	bDeviceProtocol	1	0x00	Protocol Code | 
 | 877 |  * 7	bMaxPacketSize0 1	0x08	Maximum packet size for endpoint 0 | 
 | 878 |  * 8	idVendor	2	0x0403	Vendor ID | 
 | 879 |  * 10	idProduct	2	0x8372	Product ID (FTDI_SIO_PID) | 
 | 880 |  * 12	bcdDevice	2	0x0001	Device release number | 
 | 881 |  * 14	iManufacturer	1	0x01	Index of man. string desc | 
 | 882 |  * 15	iProduct	1	0x02	Index of prod string desc | 
 | 883 |  * 16	iSerialNumber	1	0x02	Index of serial nmr string desc | 
 | 884 |  * 17	bNumConfigurations 1    0x01	Number of possible configurations | 
 | 885 |  *  | 
 | 886 |  * Configuration Descriptor | 
 | 887 |  *  | 
 | 888 |  * Offset	Field			Size	Value | 
 | 889 |  * 0	bLength			1	0x09	Size of descriptor in bytes | 
 | 890 |  * 1	bDescriptorType		1	0x02	CONFIGURATION Descriptor Type | 
 | 891 |  * 2	wTotalLength		2	0x0020	Total length of data | 
 | 892 |  * 4	bNumInterfaces		1	0x01	Number of interfaces supported | 
 | 893 |  * 5	bConfigurationValue	1	0x01	Argument for SetCOnfiguration() req | 
 | 894 |  * 6	iConfiguration		1	0x02	Index of config string descriptor | 
 | 895 |  * 7	bmAttributes		1	0x20	Config characteristics Remote Wakeup | 
 | 896 |  * 8	MaxPower		1	0x1E	Max power consumption | 
 | 897 |  *  | 
 | 898 |  * Interface Descriptor | 
 | 899 |  *  | 
 | 900 |  * Offset	Field			Size	Value | 
 | 901 |  * 0	bLength			1	0x09	Size of descriptor in bytes | 
 | 902 |  * 1	bDescriptorType		1	0x04	INTERFACE Descriptor Type | 
 | 903 |  * 2	bInterfaceNumber	1	0x00	Number of interface | 
 | 904 |  * 3	bAlternateSetting	1	0x00	Value used to select alternate | 
 | 905 |  * 4	bNumEndpoints		1	0x02	Number of endpoints | 
 | 906 |  * 5	bInterfaceClass		1	0xFF	Class Code | 
 | 907 |  * 6	bInterfaceSubClass	1	0xFF	Subclass Code | 
 | 908 |  * 7	bInterfaceProtocol	1	0xFF	Protocol Code | 
 | 909 |  * 8	iInterface		1	0x02	Index of interface string description | 
 | 910 |  *  | 
 | 911 |  * IN Endpoint Descriptor | 
 | 912 |  *  | 
 | 913 |  * Offset	Field			Size	Value | 
 | 914 |  * 0	bLength			1	0x07	Size of descriptor in bytes | 
 | 915 |  * 1	bDescriptorType		1	0x05	ENDPOINT descriptor type | 
 | 916 |  * 2	bEndpointAddress	1	0x82	Address of endpoint | 
 | 917 |  * 3	bmAttributes		1	0x02	Endpoint attributes - Bulk | 
 | 918 |  * 4	bNumEndpoints		2	0x0040	maximum packet size | 
 | 919 |  * 5	bInterval		1	0x00	Interval for polling endpoint | 
 | 920 |  *  | 
 | 921 |  * OUT Endpoint Descriptor | 
 | 922 |  *  | 
 | 923 |  * Offset	Field			Size	Value | 
 | 924 |  * 0	bLength			1	0x07	Size of descriptor in bytes | 
 | 925 |  * 1	bDescriptorType		1	0x05	ENDPOINT descriptor type | 
 | 926 |  * 2	bEndpointAddress	1	0x02	Address of endpoint | 
 | 927 |  * 3	bmAttributes		1	0x02	Endpoint attributes - Bulk | 
 | 928 |  * 4	bNumEndpoints		2	0x0040	maximum packet size | 
 | 929 |  * 5	bInterval		1	0x00	Interval for polling endpoint | 
 | 930 |  *      | 
 | 931 |  * DATA FORMAT | 
 | 932 |  *  | 
 | 933 |  * IN Endpoint | 
 | 934 |  *  | 
 | 935 |  * The device reserves the first two bytes of data on this endpoint to contain the current | 
 | 936 |  * values of the modem and line status registers. In the absence of data, the device  | 
 | 937 |  * generates a message consisting of these two status bytes every 40 ms | 
 | 938 |  *  | 
 | 939 |  * Byte 0: Modem Status | 
 | 940 |  *  | 
 | 941 |  * Offset	Description | 
 | 942 |  * B0	Reserved - must be 1 | 
 | 943 |  * B1	Reserved - must be 0 | 
 | 944 |  * B2	Reserved - must be 0 | 
 | 945 |  * B3	Reserved - must be 0 | 
 | 946 |  * B4	Clear to Send (CTS) | 
 | 947 |  * B5	Data Set Ready (DSR) | 
 | 948 |  * B6	Ring Indicator (RI) | 
 | 949 |  * B7	Receive Line Signal Detect (RLSD) | 
 | 950 |  *  | 
 | 951 |  * Byte 1: Line Status | 
 | 952 |  *  | 
 | 953 |  * Offset	Description | 
 | 954 |  * B0	Data Ready (DR) | 
 | 955 |  * B1	Overrun Error (OE) | 
 | 956 |  * B2	Parity Error (PE) | 
 | 957 |  * B3	Framing Error (FE) | 
 | 958 |  * B4	Break Interrupt (BI) | 
 | 959 |  * B5	Transmitter Holding Register (THRE) | 
 | 960 |  * B6	Transmitter Empty (TEMT) | 
 | 961 |  * B7	Error in RCVR FIFO | 
 | 962 |  *  | 
 | 963 |  */ | 
 | 964 | #define FTDI_RS0_CTS	(1 << 4) | 
 | 965 | #define FTDI_RS0_DSR	(1 << 5) | 
 | 966 | #define FTDI_RS0_RI	(1 << 6) | 
 | 967 | #define FTDI_RS0_RLSD	(1 << 7) | 
 | 968 |  | 
 | 969 | #define FTDI_RS_DR  1 | 
 | 970 | #define FTDI_RS_OE (1<<1) | 
 | 971 | #define FTDI_RS_PE (1<<2) | 
 | 972 | #define FTDI_RS_FE (1<<3) | 
 | 973 | #define FTDI_RS_BI (1<<4) | 
 | 974 | #define FTDI_RS_THRE (1<<5) | 
 | 975 | #define FTDI_RS_TEMT (1<<6) | 
 | 976 | #define FTDI_RS_FIFO  (1<<7) | 
 | 977 |  | 
 | 978 | /* | 
 | 979 |  * OUT Endpoint | 
 | 980 |  *  | 
 | 981 |  * This device reserves the first bytes of data on this endpoint contain the length | 
 | 982 |  * and port identifier of the message. For the FTDI USB Serial converter the port  | 
 | 983 |  * identifier is always 1. | 
 | 984 |  *  | 
 | 985 |  * Byte 0: Line Status | 
 | 986 |  *  | 
 | 987 |  * Offset	Description | 
 | 988 |  * B0	Reserved - must be 1 | 
 | 989 |  * B1	Reserved - must be 0 | 
 | 990 |  * B2..7	Length of message - (not including Byte 0) | 
 | 991 |  *  | 
 | 992 |  */ | 
 | 993 |  |