1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Driver definitions for the FTDI USB Single Port Serial Converter - 4*4882a593Smuzhiyun * known as FTDI_SIO (Serial Input/Output application of the chipset) 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * For USB vendor/product IDs (VID/PID), please see ftdi_sio_ids.h 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * The example I have is known as the USC-1000 which is available from 10*4882a593Smuzhiyun * http://www.dse.co.nz - cat no XH4214 It looks similar to this: 11*4882a593Smuzhiyun * http://www.dansdata.com/usbser.htm but I can't be sure There are other 12*4882a593Smuzhiyun * USC-1000s which don't look like my device though so beware! 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * The device is based on the FTDI FT8U100AX chip. It has a DB25 on one side, 15*4882a593Smuzhiyun * USB on the other. 16*4882a593Smuzhiyun * 17*4882a593Smuzhiyun * Thanx to FTDI (http://www.ftdichip.com) for so kindly providing details 18*4882a593Smuzhiyun * of the protocol required to talk to the device and ongoing assistence 19*4882a593Smuzhiyun * during development. 20*4882a593Smuzhiyun * 21*4882a593Smuzhiyun * Bill Ryder - bryder@sgi.com formerly of Silicon Graphics, Inc.- wrote the 22*4882a593Smuzhiyun * FTDI_SIO implementation. 23*4882a593Smuzhiyun * 24*4882a593Smuzhiyun */ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* Commands */ 27*4882a593Smuzhiyun #define FTDI_SIO_RESET 0 /* Reset the port */ 28*4882a593Smuzhiyun #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ 29*4882a593Smuzhiyun #define FTDI_SIO_SET_FLOW_CTRL 2 /* Set flow control register */ 30*4882a593Smuzhiyun #define FTDI_SIO_SET_BAUD_RATE 3 /* Set baud rate */ 31*4882a593Smuzhiyun #define FTDI_SIO_SET_DATA 4 /* Set the data characteristics of 32*4882a593Smuzhiyun the port */ 33*4882a593Smuzhiyun #define FTDI_SIO_GET_MODEM_STATUS 5 /* Retrieve current value of modem 34*4882a593Smuzhiyun status register */ 35*4882a593Smuzhiyun #define FTDI_SIO_SET_EVENT_CHAR 6 /* Set the event character */ 36*4882a593Smuzhiyun #define FTDI_SIO_SET_ERROR_CHAR 7 /* Set the error character */ 37*4882a593Smuzhiyun #define FTDI_SIO_SET_LATENCY_TIMER 9 /* Set the latency timer */ 38*4882a593Smuzhiyun #define FTDI_SIO_GET_LATENCY_TIMER 0x0a /* Get the latency timer */ 39*4882a593Smuzhiyun #define FTDI_SIO_SET_BITMODE 0x0b /* Set bitbang mode */ 40*4882a593Smuzhiyun #define FTDI_SIO_READ_PINS 0x0c /* Read immediate value of pins */ 41*4882a593Smuzhiyun #define FTDI_SIO_READ_EEPROM 0x90 /* Read EEPROM */ 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* Interface indices for FT2232, FT2232H and FT4232H devices */ 44*4882a593Smuzhiyun #define INTERFACE_A 1 45*4882a593Smuzhiyun #define INTERFACE_B 2 46*4882a593Smuzhiyun #define INTERFACE_C 3 47*4882a593Smuzhiyun #define INTERFACE_D 4 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* 51*4882a593Smuzhiyun * BmRequestType: 1100 0000b 52*4882a593Smuzhiyun * bRequest: FTDI_E2_READ 53*4882a593Smuzhiyun * wValue: 0 54*4882a593Smuzhiyun * wIndex: Address of word to read 55*4882a593Smuzhiyun * wLength: 2 56*4882a593Smuzhiyun * Data: Will return a word of data from E2Address 57*4882a593Smuzhiyun * 58*4882a593Smuzhiyun */ 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun /* Port Identifier Table */ 61*4882a593Smuzhiyun #define PIT_DEFAULT 0 /* SIOA */ 62*4882a593Smuzhiyun #define PIT_SIOA 1 /* SIOA */ 63*4882a593Smuzhiyun /* The device this driver is tested with one has only one port */ 64*4882a593Smuzhiyun #define PIT_SIOB 2 /* SIOB */ 65*4882a593Smuzhiyun #define PIT_PARALLEL 3 /* Parallel */ 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /* FTDI_SIO_RESET */ 68*4882a593Smuzhiyun #define FTDI_SIO_RESET_REQUEST FTDI_SIO_RESET 69*4882a593Smuzhiyun #define FTDI_SIO_RESET_REQUEST_TYPE 0x40 70*4882a593Smuzhiyun #define FTDI_SIO_RESET_SIO 0 71*4882a593Smuzhiyun #define FTDI_SIO_RESET_PURGE_RX 1 72*4882a593Smuzhiyun #define FTDI_SIO_RESET_PURGE_TX 2 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /* 75*4882a593Smuzhiyun * BmRequestType: 0100 0000B 76*4882a593Smuzhiyun * bRequest: FTDI_SIO_RESET 77*4882a593Smuzhiyun * wValue: Control Value 78*4882a593Smuzhiyun * 0 = Reset SIO 79*4882a593Smuzhiyun * 1 = Purge RX buffer 80*4882a593Smuzhiyun * 2 = Purge TX buffer 81*4882a593Smuzhiyun * wIndex: Port 82*4882a593Smuzhiyun * wLength: 0 83*4882a593Smuzhiyun * Data: None 84*4882a593Smuzhiyun * 85*4882a593Smuzhiyun * The Reset SIO command has this effect: 86*4882a593Smuzhiyun * 87*4882a593Smuzhiyun * Sets flow control set to 'none' 88*4882a593Smuzhiyun * Event char = $0D 89*4882a593Smuzhiyun * Event trigger = disabled 90*4882a593Smuzhiyun * Purge RX buffer 91*4882a593Smuzhiyun * Purge TX buffer 92*4882a593Smuzhiyun * Clear DTR 93*4882a593Smuzhiyun * Clear RTS 94*4882a593Smuzhiyun * baud and data format not reset 95*4882a593Smuzhiyun * 96*4882a593Smuzhiyun * The Purge RX and TX buffer commands affect nothing except the buffers 97*4882a593Smuzhiyun * 98*4882a593Smuzhiyun */ 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /* FTDI_SIO_SET_BAUDRATE */ 101*4882a593Smuzhiyun #define FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE 0x40 102*4882a593Smuzhiyun #define FTDI_SIO_SET_BAUDRATE_REQUEST 3 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun /* 105*4882a593Smuzhiyun * BmRequestType: 0100 0000B 106*4882a593Smuzhiyun * bRequest: FTDI_SIO_SET_BAUDRATE 107*4882a593Smuzhiyun * wValue: BaudDivisor value - see below 108*4882a593Smuzhiyun * wIndex: Port 109*4882a593Smuzhiyun * wLength: 0 110*4882a593Smuzhiyun * Data: None 111*4882a593Smuzhiyun * The BaudDivisor values are calculated as follows: 112*4882a593Smuzhiyun * - BaseClock is either 12000000 or 48000000 depending on the device. 113*4882a593Smuzhiyun * FIXME: I wish I knew how to detect old chips to select proper base clock! 114*4882a593Smuzhiyun * - BaudDivisor is a fixed point number encoded in a funny way. 115*4882a593Smuzhiyun * (--WRONG WAY OF THINKING--) 116*4882a593Smuzhiyun * BaudDivisor is a fixed point number encoded with following bit weighs: 117*4882a593Smuzhiyun * (-2)(-1)(13..0). It is a radical with a denominator of 4, so values 118*4882a593Smuzhiyun * end with 0.0 (00...), 0.25 (10...), 0.5 (01...), and 0.75 (11...). 119*4882a593Smuzhiyun * (--THE REALITY--) 120*4882a593Smuzhiyun * The both-bits-set has quite different meaning from 0.75 - the chip 121*4882a593Smuzhiyun * designers have decided it to mean 0.125 instead of 0.75. 122*4882a593Smuzhiyun * This info looked up in FTDI application note "FT8U232 DEVICES \ Data Rates 123*4882a593Smuzhiyun * and Flow Control Consideration for USB to RS232". 124*4882a593Smuzhiyun * - BaudDivisor = (BaseClock / 16) / BaudRate, where the (=) operation should 125*4882a593Smuzhiyun * automagically re-encode the resulting value to take fractions into 126*4882a593Smuzhiyun * consideration. 127*4882a593Smuzhiyun * As all values are integers, some bit twiddling is in order: 128*4882a593Smuzhiyun * BaudDivisor = (BaseClock / 16 / BaudRate) | 129*4882a593Smuzhiyun * (((BaseClock / 2 / BaudRate) & 4) ? 0x4000 // 0.5 130*4882a593Smuzhiyun * : ((BaseClock / 2 / BaudRate) & 2) ? 0x8000 // 0.25 131*4882a593Smuzhiyun * : ((BaseClock / 2 / BaudRate) & 1) ? 0xc000 // 0.125 132*4882a593Smuzhiyun * : 0) 133*4882a593Smuzhiyun * 134*4882a593Smuzhiyun * For the FT232BM, a 17th divisor bit was introduced to encode the multiples 135*4882a593Smuzhiyun * of 0.125 missing from the FT8U232AM. Bits 16 to 14 are coded as follows 136*4882a593Smuzhiyun * (the first four codes are the same as for the FT8U232AM, where bit 16 is 137*4882a593Smuzhiyun * always 0): 138*4882a593Smuzhiyun * 000 - add .000 to divisor 139*4882a593Smuzhiyun * 001 - add .500 to divisor 140*4882a593Smuzhiyun * 010 - add .250 to divisor 141*4882a593Smuzhiyun * 011 - add .125 to divisor 142*4882a593Smuzhiyun * 100 - add .375 to divisor 143*4882a593Smuzhiyun * 101 - add .625 to divisor 144*4882a593Smuzhiyun * 110 - add .750 to divisor 145*4882a593Smuzhiyun * 111 - add .875 to divisor 146*4882a593Smuzhiyun * Bits 15 to 0 of the 17-bit divisor are placed in the urb value. Bit 16 is 147*4882a593Smuzhiyun * placed in bit 0 of the urb index. 148*4882a593Smuzhiyun * 149*4882a593Smuzhiyun * Note that there are a couple of special cases to support the highest baud 150*4882a593Smuzhiyun * rates. If the calculated divisor value is 1, this needs to be replaced with 151*4882a593Smuzhiyun * 0. Additionally for the FT232BM, if the calculated divisor value is 0x4001 152*4882a593Smuzhiyun * (1.5), this needs to be replaced with 0x0001 (1) (but this divisor value is 153*4882a593Smuzhiyun * not supported by the FT8U232AM). 154*4882a593Smuzhiyun */ 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun enum ftdi_chip_type { 157*4882a593Smuzhiyun SIO = 1, 158*4882a593Smuzhiyun FT8U232AM = 2, 159*4882a593Smuzhiyun FT232BM = 3, 160*4882a593Smuzhiyun FT2232C = 4, 161*4882a593Smuzhiyun FT232RL = 5, 162*4882a593Smuzhiyun FT2232H = 6, 163*4882a593Smuzhiyun FT4232H = 7, 164*4882a593Smuzhiyun FT232H = 8, 165*4882a593Smuzhiyun FTX = 9, 166*4882a593Smuzhiyun }; 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun enum ftdi_sio_baudrate { 169*4882a593Smuzhiyun ftdi_sio_b300 = 0, 170*4882a593Smuzhiyun ftdi_sio_b600 = 1, 171*4882a593Smuzhiyun ftdi_sio_b1200 = 2, 172*4882a593Smuzhiyun ftdi_sio_b2400 = 3, 173*4882a593Smuzhiyun ftdi_sio_b4800 = 4, 174*4882a593Smuzhiyun ftdi_sio_b9600 = 5, 175*4882a593Smuzhiyun ftdi_sio_b19200 = 6, 176*4882a593Smuzhiyun ftdi_sio_b38400 = 7, 177*4882a593Smuzhiyun ftdi_sio_b57600 = 8, 178*4882a593Smuzhiyun ftdi_sio_b115200 = 9 179*4882a593Smuzhiyun }; 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* 182*4882a593Smuzhiyun * The ftdi_8U232AM_xxMHz_byyy constants have been removed. The encoded divisor 183*4882a593Smuzhiyun * values are calculated internally. 184*4882a593Smuzhiyun */ 185*4882a593Smuzhiyun #define FTDI_SIO_SET_DATA_REQUEST FTDI_SIO_SET_DATA 186*4882a593Smuzhiyun #define FTDI_SIO_SET_DATA_REQUEST_TYPE 0x40 187*4882a593Smuzhiyun #define FTDI_SIO_SET_DATA_PARITY_NONE (0x0 << 8) 188*4882a593Smuzhiyun #define FTDI_SIO_SET_DATA_PARITY_ODD (0x1 << 8) 189*4882a593Smuzhiyun #define FTDI_SIO_SET_DATA_PARITY_EVEN (0x2 << 8) 190*4882a593Smuzhiyun #define FTDI_SIO_SET_DATA_PARITY_MARK (0x3 << 8) 191*4882a593Smuzhiyun #define FTDI_SIO_SET_DATA_PARITY_SPACE (0x4 << 8) 192*4882a593Smuzhiyun #define FTDI_SIO_SET_DATA_STOP_BITS_1 (0x0 << 11) 193*4882a593Smuzhiyun #define FTDI_SIO_SET_DATA_STOP_BITS_15 (0x1 << 11) 194*4882a593Smuzhiyun #define FTDI_SIO_SET_DATA_STOP_BITS_2 (0x2 << 11) 195*4882a593Smuzhiyun #define FTDI_SIO_SET_BREAK (0x1 << 14) 196*4882a593Smuzhiyun /* FTDI_SIO_SET_DATA */ 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun /* 199*4882a593Smuzhiyun * BmRequestType: 0100 0000B 200*4882a593Smuzhiyun * bRequest: FTDI_SIO_SET_DATA 201*4882a593Smuzhiyun * wValue: Data characteristics (see below) 202*4882a593Smuzhiyun * wIndex: Port 203*4882a593Smuzhiyun * wLength: 0 204*4882a593Smuzhiyun * Data: No 205*4882a593Smuzhiyun * 206*4882a593Smuzhiyun * Data characteristics 207*4882a593Smuzhiyun * 208*4882a593Smuzhiyun * B0..7 Number of data bits 209*4882a593Smuzhiyun * B8..10 Parity 210*4882a593Smuzhiyun * 0 = None 211*4882a593Smuzhiyun * 1 = Odd 212*4882a593Smuzhiyun * 2 = Even 213*4882a593Smuzhiyun * 3 = Mark 214*4882a593Smuzhiyun * 4 = Space 215*4882a593Smuzhiyun * B11..13 Stop Bits 216*4882a593Smuzhiyun * 0 = 1 217*4882a593Smuzhiyun * 1 = 1.5 218*4882a593Smuzhiyun * 2 = 2 219*4882a593Smuzhiyun * B14 220*4882a593Smuzhiyun * 1 = TX ON (break) 221*4882a593Smuzhiyun * 0 = TX OFF (normal state) 222*4882a593Smuzhiyun * B15 Reserved 223*4882a593Smuzhiyun * 224*4882a593Smuzhiyun */ 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun /* FTDI_SIO_MODEM_CTRL */ 229*4882a593Smuzhiyun #define FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE 0x40 230*4882a593Smuzhiyun #define FTDI_SIO_SET_MODEM_CTRL_REQUEST FTDI_SIO_MODEM_CTRL 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun /* 233*4882a593Smuzhiyun * BmRequestType: 0100 0000B 234*4882a593Smuzhiyun * bRequest: FTDI_SIO_MODEM_CTRL 235*4882a593Smuzhiyun * wValue: ControlValue (see below) 236*4882a593Smuzhiyun * wIndex: Port 237*4882a593Smuzhiyun * wLength: 0 238*4882a593Smuzhiyun * Data: None 239*4882a593Smuzhiyun * 240*4882a593Smuzhiyun * NOTE: If the device is in RTS/CTS flow control, the RTS set by this 241*4882a593Smuzhiyun * command will be IGNORED without an error being returned 242*4882a593Smuzhiyun * Also - you can not set DTR and RTS with one control message 243*4882a593Smuzhiyun */ 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun #define FTDI_SIO_SET_DTR_MASK 0x1 246*4882a593Smuzhiyun #define FTDI_SIO_SET_DTR_HIGH ((FTDI_SIO_SET_DTR_MASK << 8) | 1) 247*4882a593Smuzhiyun #define FTDI_SIO_SET_DTR_LOW ((FTDI_SIO_SET_DTR_MASK << 8) | 0) 248*4882a593Smuzhiyun #define FTDI_SIO_SET_RTS_MASK 0x2 249*4882a593Smuzhiyun #define FTDI_SIO_SET_RTS_HIGH ((FTDI_SIO_SET_RTS_MASK << 8) | 2) 250*4882a593Smuzhiyun #define FTDI_SIO_SET_RTS_LOW ((FTDI_SIO_SET_RTS_MASK << 8) | 0) 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun /* 253*4882a593Smuzhiyun * ControlValue 254*4882a593Smuzhiyun * B0 DTR state 255*4882a593Smuzhiyun * 0 = reset 256*4882a593Smuzhiyun * 1 = set 257*4882a593Smuzhiyun * B1 RTS state 258*4882a593Smuzhiyun * 0 = reset 259*4882a593Smuzhiyun * 1 = set 260*4882a593Smuzhiyun * B2..7 Reserved 261*4882a593Smuzhiyun * B8 DTR state enable 262*4882a593Smuzhiyun * 0 = ignore 263*4882a593Smuzhiyun * 1 = use DTR state 264*4882a593Smuzhiyun * B9 RTS state enable 265*4882a593Smuzhiyun * 0 = ignore 266*4882a593Smuzhiyun * 1 = use RTS state 267*4882a593Smuzhiyun * B10..15 Reserved 268*4882a593Smuzhiyun */ 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun /* FTDI_SIO_SET_FLOW_CTRL */ 271*4882a593Smuzhiyun #define FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE 0x40 272*4882a593Smuzhiyun #define FTDI_SIO_SET_FLOW_CTRL_REQUEST FTDI_SIO_SET_FLOW_CTRL 273*4882a593Smuzhiyun #define FTDI_SIO_DISABLE_FLOW_CTRL 0x0 274*4882a593Smuzhiyun #define FTDI_SIO_RTS_CTS_HS (0x1 << 8) 275*4882a593Smuzhiyun #define FTDI_SIO_DTR_DSR_HS (0x2 << 8) 276*4882a593Smuzhiyun #define FTDI_SIO_XON_XOFF_HS (0x4 << 8) 277*4882a593Smuzhiyun /* 278*4882a593Smuzhiyun * BmRequestType: 0100 0000b 279*4882a593Smuzhiyun * bRequest: FTDI_SIO_SET_FLOW_CTRL 280*4882a593Smuzhiyun * wValue: Xoff/Xon 281*4882a593Smuzhiyun * wIndex: Protocol/Port - hIndex is protocol / lIndex is port 282*4882a593Smuzhiyun * wLength: 0 283*4882a593Smuzhiyun * Data: None 284*4882a593Smuzhiyun * 285*4882a593Smuzhiyun * hIndex protocol is: 286*4882a593Smuzhiyun * B0 Output handshaking using RTS/CTS 287*4882a593Smuzhiyun * 0 = disabled 288*4882a593Smuzhiyun * 1 = enabled 289*4882a593Smuzhiyun * B1 Output handshaking using DTR/DSR 290*4882a593Smuzhiyun * 0 = disabled 291*4882a593Smuzhiyun * 1 = enabled 292*4882a593Smuzhiyun * B2 Xon/Xoff handshaking 293*4882a593Smuzhiyun * 0 = disabled 294*4882a593Smuzhiyun * 1 = enabled 295*4882a593Smuzhiyun * 296*4882a593Smuzhiyun * A value of zero in the hIndex field disables handshaking 297*4882a593Smuzhiyun * 298*4882a593Smuzhiyun * If Xon/Xoff handshaking is specified, the hValue field should contain the 299*4882a593Smuzhiyun * XOFF character and the lValue field contains the XON character. 300*4882a593Smuzhiyun */ 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun /* 303*4882a593Smuzhiyun * FTDI_SIO_GET_LATENCY_TIMER 304*4882a593Smuzhiyun * 305*4882a593Smuzhiyun * Set the timeout interval. The FTDI collects data from the 306*4882a593Smuzhiyun * device, transmitting it to the host when either A) 62 bytes are 307*4882a593Smuzhiyun * received, or B) the timeout interval has elapsed and the buffer 308*4882a593Smuzhiyun * contains at least 1 byte. Setting this value to a small number 309*4882a593Smuzhiyun * can dramatically improve performance for applications which send 310*4882a593Smuzhiyun * small packets, since the default value is 16ms. 311*4882a593Smuzhiyun */ 312*4882a593Smuzhiyun #define FTDI_SIO_GET_LATENCY_TIMER_REQUEST FTDI_SIO_GET_LATENCY_TIMER 313*4882a593Smuzhiyun #define FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE 0xC0 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun /* 316*4882a593Smuzhiyun * BmRequestType: 1100 0000b 317*4882a593Smuzhiyun * bRequest: FTDI_SIO_GET_LATENCY_TIMER 318*4882a593Smuzhiyun * wValue: 0 319*4882a593Smuzhiyun * wIndex: Port 320*4882a593Smuzhiyun * wLength: 0 321*4882a593Smuzhiyun * Data: latency (on return) 322*4882a593Smuzhiyun */ 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun /* 325*4882a593Smuzhiyun * FTDI_SIO_SET_LATENCY_TIMER 326*4882a593Smuzhiyun * 327*4882a593Smuzhiyun * Set the timeout interval. The FTDI collects data from the 328*4882a593Smuzhiyun * device, transmitting it to the host when either A) 62 bytes are 329*4882a593Smuzhiyun * received, or B) the timeout interval has elapsed and the buffer 330*4882a593Smuzhiyun * contains at least 1 byte. Setting this value to a small number 331*4882a593Smuzhiyun * can dramatically improve performance for applications which send 332*4882a593Smuzhiyun * small packets, since the default value is 16ms. 333*4882a593Smuzhiyun */ 334*4882a593Smuzhiyun #define FTDI_SIO_SET_LATENCY_TIMER_REQUEST FTDI_SIO_SET_LATENCY_TIMER 335*4882a593Smuzhiyun #define FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE 0x40 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun /* 338*4882a593Smuzhiyun * BmRequestType: 0100 0000b 339*4882a593Smuzhiyun * bRequest: FTDI_SIO_SET_LATENCY_TIMER 340*4882a593Smuzhiyun * wValue: Latency (milliseconds) 341*4882a593Smuzhiyun * wIndex: Port 342*4882a593Smuzhiyun * wLength: 0 343*4882a593Smuzhiyun * Data: None 344*4882a593Smuzhiyun * 345*4882a593Smuzhiyun * wValue: 346*4882a593Smuzhiyun * B0..7 Latency timer 347*4882a593Smuzhiyun * B8..15 0 348*4882a593Smuzhiyun * 349*4882a593Smuzhiyun */ 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun /* 352*4882a593Smuzhiyun * FTDI_SIO_SET_EVENT_CHAR 353*4882a593Smuzhiyun * 354*4882a593Smuzhiyun * Set the special event character for the specified communications port. 355*4882a593Smuzhiyun * If the device sees this character it will immediately return the 356*4882a593Smuzhiyun * data read so far - rather than wait 40ms or until 62 bytes are read 357*4882a593Smuzhiyun * which is what normally happens. 358*4882a593Smuzhiyun */ 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun 361*4882a593Smuzhiyun #define FTDI_SIO_SET_EVENT_CHAR_REQUEST FTDI_SIO_SET_EVENT_CHAR 362*4882a593Smuzhiyun #define FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE 0x40 363*4882a593Smuzhiyun 364*4882a593Smuzhiyun 365*4882a593Smuzhiyun /* 366*4882a593Smuzhiyun * BmRequestType: 0100 0000b 367*4882a593Smuzhiyun * bRequest: FTDI_SIO_SET_EVENT_CHAR 368*4882a593Smuzhiyun * wValue: EventChar 369*4882a593Smuzhiyun * wIndex: Port 370*4882a593Smuzhiyun * wLength: 0 371*4882a593Smuzhiyun * Data: None 372*4882a593Smuzhiyun * 373*4882a593Smuzhiyun * wValue: 374*4882a593Smuzhiyun * B0..7 Event Character 375*4882a593Smuzhiyun * B8 Event Character Processing 376*4882a593Smuzhiyun * 0 = disabled 377*4882a593Smuzhiyun * 1 = enabled 378*4882a593Smuzhiyun * B9..15 Reserved 379*4882a593Smuzhiyun * 380*4882a593Smuzhiyun */ 381*4882a593Smuzhiyun 382*4882a593Smuzhiyun /* FTDI_SIO_SET_ERROR_CHAR */ 383*4882a593Smuzhiyun 384*4882a593Smuzhiyun /* 385*4882a593Smuzhiyun * Set the parity error replacement character for the specified communications 386*4882a593Smuzhiyun * port 387*4882a593Smuzhiyun */ 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun /* 390*4882a593Smuzhiyun * BmRequestType: 0100 0000b 391*4882a593Smuzhiyun * bRequest: FTDI_SIO_SET_EVENT_CHAR 392*4882a593Smuzhiyun * wValue: Error Char 393*4882a593Smuzhiyun * wIndex: Port 394*4882a593Smuzhiyun * wLength: 0 395*4882a593Smuzhiyun * Data: None 396*4882a593Smuzhiyun * 397*4882a593Smuzhiyun *Error Char 398*4882a593Smuzhiyun * B0..7 Error Character 399*4882a593Smuzhiyun * B8 Error Character Processing 400*4882a593Smuzhiyun * 0 = disabled 401*4882a593Smuzhiyun * 1 = enabled 402*4882a593Smuzhiyun * B9..15 Reserved 403*4882a593Smuzhiyun * 404*4882a593Smuzhiyun */ 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun /* FTDI_SIO_GET_MODEM_STATUS */ 407*4882a593Smuzhiyun /* Retrieve the current value of the modem status register */ 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun #define FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE 0xc0 410*4882a593Smuzhiyun #define FTDI_SIO_GET_MODEM_STATUS_REQUEST FTDI_SIO_GET_MODEM_STATUS 411*4882a593Smuzhiyun #define FTDI_SIO_CTS_MASK 0x10 412*4882a593Smuzhiyun #define FTDI_SIO_DSR_MASK 0x20 413*4882a593Smuzhiyun #define FTDI_SIO_RI_MASK 0x40 414*4882a593Smuzhiyun #define FTDI_SIO_RLSD_MASK 0x80 415*4882a593Smuzhiyun /* 416*4882a593Smuzhiyun * BmRequestType: 1100 0000b 417*4882a593Smuzhiyun * bRequest: FTDI_SIO_GET_MODEM_STATUS 418*4882a593Smuzhiyun * wValue: zero 419*4882a593Smuzhiyun * wIndex: Port 420*4882a593Smuzhiyun * wLength: 1 421*4882a593Smuzhiyun * Data: Status 422*4882a593Smuzhiyun * 423*4882a593Smuzhiyun * One byte of data is returned 424*4882a593Smuzhiyun * B0..3 0 425*4882a593Smuzhiyun * B4 CTS 426*4882a593Smuzhiyun * 0 = inactive 427*4882a593Smuzhiyun * 1 = active 428*4882a593Smuzhiyun * B5 DSR 429*4882a593Smuzhiyun * 0 = inactive 430*4882a593Smuzhiyun * 1 = active 431*4882a593Smuzhiyun * B6 Ring Indicator (RI) 432*4882a593Smuzhiyun * 0 = inactive 433*4882a593Smuzhiyun * 1 = active 434*4882a593Smuzhiyun * B7 Receive Line Signal Detect (RLSD) 435*4882a593Smuzhiyun * 0 = inactive 436*4882a593Smuzhiyun * 1 = active 437*4882a593Smuzhiyun */ 438*4882a593Smuzhiyun 439*4882a593Smuzhiyun /* FTDI_SIO_SET_BITMODE */ 440*4882a593Smuzhiyun #define FTDI_SIO_SET_BITMODE_REQUEST_TYPE 0x40 441*4882a593Smuzhiyun #define FTDI_SIO_SET_BITMODE_REQUEST FTDI_SIO_SET_BITMODE 442*4882a593Smuzhiyun 443*4882a593Smuzhiyun /* Possible bitmodes for FTDI_SIO_SET_BITMODE_REQUEST */ 444*4882a593Smuzhiyun #define FTDI_SIO_BITMODE_RESET 0x00 445*4882a593Smuzhiyun #define FTDI_SIO_BITMODE_CBUS 0x20 446*4882a593Smuzhiyun 447*4882a593Smuzhiyun /* FTDI_SIO_READ_PINS */ 448*4882a593Smuzhiyun #define FTDI_SIO_READ_PINS_REQUEST_TYPE 0xc0 449*4882a593Smuzhiyun #define FTDI_SIO_READ_PINS_REQUEST FTDI_SIO_READ_PINS 450*4882a593Smuzhiyun 451*4882a593Smuzhiyun /* 452*4882a593Smuzhiyun * FTDI_SIO_READ_EEPROM 453*4882a593Smuzhiyun * 454*4882a593Smuzhiyun * EEPROM format found in FTDI AN_201, "FT-X MTP memory Configuration", 455*4882a593Smuzhiyun * http://www.ftdichip.com/Support/Documents/AppNotes/AN_201_FT-X%20MTP%20Memory%20Configuration.pdf 456*4882a593Smuzhiyun */ 457*4882a593Smuzhiyun #define FTDI_SIO_READ_EEPROM_REQUEST_TYPE 0xc0 458*4882a593Smuzhiyun #define FTDI_SIO_READ_EEPROM_REQUEST FTDI_SIO_READ_EEPROM 459*4882a593Smuzhiyun 460*4882a593Smuzhiyun #define FTDI_FTX_CBUS_MUX_GPIO 0x8 461*4882a593Smuzhiyun #define FTDI_FT232R_CBUS_MUX_GPIO 0xa 462*4882a593Smuzhiyun 463*4882a593Smuzhiyun 464*4882a593Smuzhiyun /* Descriptors returned by the device 465*4882a593Smuzhiyun * 466*4882a593Smuzhiyun * Device Descriptor 467*4882a593Smuzhiyun * 468*4882a593Smuzhiyun * Offset Field Size Value Description 469*4882a593Smuzhiyun * 0 bLength 1 0x12 Size of descriptor in bytes 470*4882a593Smuzhiyun * 1 bDescriptorType 1 0x01 DEVICE Descriptor Type 471*4882a593Smuzhiyun * 2 bcdUSB 2 0x0110 USB Spec Release Number 472*4882a593Smuzhiyun * 4 bDeviceClass 1 0x00 Class Code 473*4882a593Smuzhiyun * 5 bDeviceSubClass 1 0x00 SubClass Code 474*4882a593Smuzhiyun * 6 bDeviceProtocol 1 0x00 Protocol Code 475*4882a593Smuzhiyun * 7 bMaxPacketSize0 1 0x08 Maximum packet size for endpoint 0 476*4882a593Smuzhiyun * 8 idVendor 2 0x0403 Vendor ID 477*4882a593Smuzhiyun * 10 idProduct 2 0x8372 Product ID (FTDI_SIO_PID) 478*4882a593Smuzhiyun * 12 bcdDevice 2 0x0001 Device release number 479*4882a593Smuzhiyun * 14 iManufacturer 1 0x01 Index of man. string desc 480*4882a593Smuzhiyun * 15 iProduct 1 0x02 Index of prod string desc 481*4882a593Smuzhiyun * 16 iSerialNumber 1 0x02 Index of serial nmr string desc 482*4882a593Smuzhiyun * 17 bNumConfigurations 1 0x01 Number of possible configurations 483*4882a593Smuzhiyun * 484*4882a593Smuzhiyun * Configuration Descriptor 485*4882a593Smuzhiyun * 486*4882a593Smuzhiyun * Offset Field Size Value 487*4882a593Smuzhiyun * 0 bLength 1 0x09 Size of descriptor in bytes 488*4882a593Smuzhiyun * 1 bDescriptorType 1 0x02 CONFIGURATION Descriptor Type 489*4882a593Smuzhiyun * 2 wTotalLength 2 0x0020 Total length of data 490*4882a593Smuzhiyun * 4 bNumInterfaces 1 0x01 Number of interfaces supported 491*4882a593Smuzhiyun * 5 bConfigurationValue 1 0x01 Argument for SetCOnfiguration() req 492*4882a593Smuzhiyun * 6 iConfiguration 1 0x02 Index of config string descriptor 493*4882a593Smuzhiyun * 7 bmAttributes 1 0x20 Config characteristics Remote Wakeup 494*4882a593Smuzhiyun * 8 MaxPower 1 0x1E Max power consumption 495*4882a593Smuzhiyun * 496*4882a593Smuzhiyun * Interface Descriptor 497*4882a593Smuzhiyun * 498*4882a593Smuzhiyun * Offset Field Size Value 499*4882a593Smuzhiyun * 0 bLength 1 0x09 Size of descriptor in bytes 500*4882a593Smuzhiyun * 1 bDescriptorType 1 0x04 INTERFACE Descriptor Type 501*4882a593Smuzhiyun * 2 bInterfaceNumber 1 0x00 Number of interface 502*4882a593Smuzhiyun * 3 bAlternateSetting 1 0x00 Value used to select alternate 503*4882a593Smuzhiyun * 4 bNumEndpoints 1 0x02 Number of endpoints 504*4882a593Smuzhiyun * 5 bInterfaceClass 1 0xFF Class Code 505*4882a593Smuzhiyun * 6 bInterfaceSubClass 1 0xFF Subclass Code 506*4882a593Smuzhiyun * 7 bInterfaceProtocol 1 0xFF Protocol Code 507*4882a593Smuzhiyun * 8 iInterface 1 0x02 Index of interface string description 508*4882a593Smuzhiyun * 509*4882a593Smuzhiyun * IN Endpoint Descriptor 510*4882a593Smuzhiyun * 511*4882a593Smuzhiyun * Offset Field Size Value 512*4882a593Smuzhiyun * 0 bLength 1 0x07 Size of descriptor in bytes 513*4882a593Smuzhiyun * 1 bDescriptorType 1 0x05 ENDPOINT descriptor type 514*4882a593Smuzhiyun * 2 bEndpointAddress 1 0x82 Address of endpoint 515*4882a593Smuzhiyun * 3 bmAttributes 1 0x02 Endpoint attributes - Bulk 516*4882a593Smuzhiyun * 4 bNumEndpoints 2 0x0040 maximum packet size 517*4882a593Smuzhiyun * 5 bInterval 1 0x00 Interval for polling endpoint 518*4882a593Smuzhiyun * 519*4882a593Smuzhiyun * OUT Endpoint Descriptor 520*4882a593Smuzhiyun * 521*4882a593Smuzhiyun * Offset Field Size Value 522*4882a593Smuzhiyun * 0 bLength 1 0x07 Size of descriptor in bytes 523*4882a593Smuzhiyun * 1 bDescriptorType 1 0x05 ENDPOINT descriptor type 524*4882a593Smuzhiyun * 2 bEndpointAddress 1 0x02 Address of endpoint 525*4882a593Smuzhiyun * 3 bmAttributes 1 0x02 Endpoint attributes - Bulk 526*4882a593Smuzhiyun * 4 bNumEndpoints 2 0x0040 maximum packet size 527*4882a593Smuzhiyun * 5 bInterval 1 0x00 Interval for polling endpoint 528*4882a593Smuzhiyun * 529*4882a593Smuzhiyun * DATA FORMAT 530*4882a593Smuzhiyun * 531*4882a593Smuzhiyun * IN Endpoint 532*4882a593Smuzhiyun * 533*4882a593Smuzhiyun * The device reserves the first two bytes of data on this endpoint to contain 534*4882a593Smuzhiyun * the current values of the modem and line status registers. In the absence of 535*4882a593Smuzhiyun * data, the device generates a message consisting of these two status bytes 536*4882a593Smuzhiyun * every 40 ms 537*4882a593Smuzhiyun * 538*4882a593Smuzhiyun * Byte 0: Modem Status 539*4882a593Smuzhiyun * 540*4882a593Smuzhiyun * Offset Description 541*4882a593Smuzhiyun * B0 Reserved - must be 1 542*4882a593Smuzhiyun * B1 Reserved - must be 0 543*4882a593Smuzhiyun * B2 Reserved - must be 0 544*4882a593Smuzhiyun * B3 Reserved - must be 0 545*4882a593Smuzhiyun * B4 Clear to Send (CTS) 546*4882a593Smuzhiyun * B5 Data Set Ready (DSR) 547*4882a593Smuzhiyun * B6 Ring Indicator (RI) 548*4882a593Smuzhiyun * B7 Receive Line Signal Detect (RLSD) 549*4882a593Smuzhiyun * 550*4882a593Smuzhiyun * Byte 1: Line Status 551*4882a593Smuzhiyun * 552*4882a593Smuzhiyun * Offset Description 553*4882a593Smuzhiyun * B0 Data Ready (DR) 554*4882a593Smuzhiyun * B1 Overrun Error (OE) 555*4882a593Smuzhiyun * B2 Parity Error (PE) 556*4882a593Smuzhiyun * B3 Framing Error (FE) 557*4882a593Smuzhiyun * B4 Break Interrupt (BI) 558*4882a593Smuzhiyun * B5 Transmitter Holding Register (THRE) 559*4882a593Smuzhiyun * B6 Transmitter Empty (TEMT) 560*4882a593Smuzhiyun * B7 Error in RCVR FIFO 561*4882a593Smuzhiyun * 562*4882a593Smuzhiyun */ 563*4882a593Smuzhiyun #define FTDI_RS0_CTS (1 << 4) 564*4882a593Smuzhiyun #define FTDI_RS0_DSR (1 << 5) 565*4882a593Smuzhiyun #define FTDI_RS0_RI (1 << 6) 566*4882a593Smuzhiyun #define FTDI_RS0_RLSD (1 << 7) 567*4882a593Smuzhiyun 568*4882a593Smuzhiyun #define FTDI_RS_DR 1 569*4882a593Smuzhiyun #define FTDI_RS_OE (1<<1) 570*4882a593Smuzhiyun #define FTDI_RS_PE (1<<2) 571*4882a593Smuzhiyun #define FTDI_RS_FE (1<<3) 572*4882a593Smuzhiyun #define FTDI_RS_BI (1<<4) 573*4882a593Smuzhiyun #define FTDI_RS_THRE (1<<5) 574*4882a593Smuzhiyun #define FTDI_RS_TEMT (1<<6) 575*4882a593Smuzhiyun #define FTDI_RS_FIFO (1<<7) 576*4882a593Smuzhiyun 577*4882a593Smuzhiyun /* 578*4882a593Smuzhiyun * OUT Endpoint 579*4882a593Smuzhiyun * 580*4882a593Smuzhiyun * This device reserves the first bytes of data on this endpoint contain the 581*4882a593Smuzhiyun * length and port identifier of the message. For the FTDI USB Serial converter 582*4882a593Smuzhiyun * the port identifier is always 1. 583*4882a593Smuzhiyun * 584*4882a593Smuzhiyun * Byte 0: Line Status 585*4882a593Smuzhiyun * 586*4882a593Smuzhiyun * Offset Description 587*4882a593Smuzhiyun * B0 Reserved - must be 1 588*4882a593Smuzhiyun * B1 Reserved - must be 0 589*4882a593Smuzhiyun * B2..7 Length of message - (not including Byte 0) 590*4882a593Smuzhiyun * 591*4882a593Smuzhiyun */ 592