forked from Minki/linux
6ca98bc284
Now that the SPDX tag is in all USB files, that identifies the license in a specific and legally-defined manner. So the extra GPL text wording can be removed as it is no longer needed at all. This is done on a quest to remove the 700+ different ways that files in the kernel describe the GPL license text. And there's unneeded stuff like the address (sometimes incorrect) for the FSF which is never needed. No copyright headers or other non-license-description text was removed. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Acked-by: Johan Hovold <johan@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
464 lines
18 KiB
C
464 lines
18 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Definitions for MCT (Magic Control Technology) USB-RS232 Converter Driver
|
|
*
|
|
* Copyright (C) 2000 Wolfgang Grandegger (wolfgang@ces.ch)
|
|
*
|
|
* This driver is for the device MCT USB-RS232 Converter (25 pin, Model No.
|
|
* U232-P25) from Magic Control Technology Corp. (there is also a 9 pin
|
|
* Model No. U232-P9). See http://www.mct.com.tw/products/product_us232.html
|
|
* for further information. The properties of this device are listed at the end
|
|
* of this file. This device was used in the Dlink DSB-S25.
|
|
*
|
|
* All of the information about the device was acquired by using SniffUSB
|
|
* on Windows98. The technical details of the reverse engineering are
|
|
* summarized at the end of this file.
|
|
*/
|
|
|
|
#ifndef __LINUX_USB_SERIAL_MCT_U232_H
|
|
#define __LINUX_USB_SERIAL_MCT_U232_H
|
|
|
|
#define MCT_U232_VID 0x0711 /* Vendor Id */
|
|
#define MCT_U232_PID 0x0210 /* Original MCT Product Id */
|
|
|
|
/* U232-P25, Sitecom */
|
|
#define MCT_U232_SITECOM_PID 0x0230 /* Sitecom Product Id */
|
|
|
|
/* DU-H3SP USB BAY hub */
|
|
#define MCT_U232_DU_H3SP_PID 0x0200 /* D-Link DU-H3SP USB BAY */
|
|
|
|
/* Belkin badge the MCT U232-P9 as the F5U109 */
|
|
#define MCT_U232_BELKIN_F5U109_VID 0x050d /* Vendor Id */
|
|
#define MCT_U232_BELKIN_F5U109_PID 0x0109 /* Product Id */
|
|
|
|
/*
|
|
* Vendor Request Interface
|
|
*/
|
|
#define MCT_U232_SET_REQUEST_TYPE 0x40
|
|
#define MCT_U232_GET_REQUEST_TYPE 0xc0
|
|
|
|
/* Get Modem Status Register (MSR) */
|
|
#define MCT_U232_GET_MODEM_STAT_REQUEST 2
|
|
#define MCT_U232_GET_MODEM_STAT_SIZE 1
|
|
|
|
/* Get Line Control Register (LCR) */
|
|
/* ... not used by this driver */
|
|
#define MCT_U232_GET_LINE_CTRL_REQUEST 6
|
|
#define MCT_U232_GET_LINE_CTRL_SIZE 1
|
|
|
|
/* Set Baud Rate Divisor */
|
|
#define MCT_U232_SET_BAUD_RATE_REQUEST 5
|
|
#define MCT_U232_SET_BAUD_RATE_SIZE 4
|
|
|
|
/* Set Line Control Register (LCR) */
|
|
#define MCT_U232_SET_LINE_CTRL_REQUEST 7
|
|
#define MCT_U232_SET_LINE_CTRL_SIZE 1
|
|
|
|
/* Set Modem Control Register (MCR) */
|
|
#define MCT_U232_SET_MODEM_CTRL_REQUEST 10
|
|
#define MCT_U232_SET_MODEM_CTRL_SIZE 1
|
|
|
|
/*
|
|
* This USB device request code is not well understood. It is transmitted by
|
|
* the MCT-supplied Windows driver whenever the baud rate changes.
|
|
*/
|
|
#define MCT_U232_SET_UNKNOWN1_REQUEST 11 /* Unknown functionality */
|
|
#define MCT_U232_SET_UNKNOWN1_SIZE 1
|
|
|
|
/*
|
|
* This USB device request code appears to control whether CTS is required
|
|
* during transmission.
|
|
*
|
|
* Sending a zero byte allows data transmission to a device which is not
|
|
* asserting CTS. Sending a '1' byte will cause transmission to be deferred
|
|
* until the device asserts CTS.
|
|
*/
|
|
#define MCT_U232_SET_CTS_REQUEST 12
|
|
#define MCT_U232_SET_CTS_SIZE 1
|
|
|
|
#define MCT_U232_MAX_SIZE 4 /* of MCT_XXX_SIZE */
|
|
|
|
/*
|
|
* Baud rate (divisor)
|
|
* Actually, there are two of them, MCT website calls them "Philips solution"
|
|
* and "Intel solution". They are the regular MCT and "Sitecom" for us.
|
|
* This is pointless to document in the header, see the code for the bits.
|
|
*/
|
|
static int mct_u232_calculate_baud_rate(struct usb_serial *serial,
|
|
speed_t value, speed_t *result);
|
|
|
|
/*
|
|
* Line Control Register (LCR)
|
|
*/
|
|
#define MCT_U232_SET_BREAK 0x40
|
|
|
|
#define MCT_U232_PARITY_SPACE 0x38
|
|
#define MCT_U232_PARITY_MARK 0x28
|
|
#define MCT_U232_PARITY_EVEN 0x18
|
|
#define MCT_U232_PARITY_ODD 0x08
|
|
#define MCT_U232_PARITY_NONE 0x00
|
|
|
|
#define MCT_U232_DATA_BITS_5 0x00
|
|
#define MCT_U232_DATA_BITS_6 0x01
|
|
#define MCT_U232_DATA_BITS_7 0x02
|
|
#define MCT_U232_DATA_BITS_8 0x03
|
|
|
|
#define MCT_U232_STOP_BITS_2 0x04
|
|
#define MCT_U232_STOP_BITS_1 0x00
|
|
|
|
/*
|
|
* Modem Control Register (MCR)
|
|
*/
|
|
#define MCT_U232_MCR_NONE 0x8 /* Deactivate DTR and RTS */
|
|
#define MCT_U232_MCR_RTS 0xa /* Activate RTS */
|
|
#define MCT_U232_MCR_DTR 0x9 /* Activate DTR */
|
|
|
|
/*
|
|
* Modem Status Register (MSR)
|
|
*/
|
|
#define MCT_U232_MSR_INDEX 0x0 /* data[index] */
|
|
#define MCT_U232_MSR_CD 0x80 /* Current CD */
|
|
#define MCT_U232_MSR_RI 0x40 /* Current RI */
|
|
#define MCT_U232_MSR_DSR 0x20 /* Current DSR */
|
|
#define MCT_U232_MSR_CTS 0x10 /* Current CTS */
|
|
#define MCT_U232_MSR_DCD 0x08 /* Delta CD */
|
|
#define MCT_U232_MSR_DRI 0x04 /* Delta RI */
|
|
#define MCT_U232_MSR_DDSR 0x02 /* Delta DSR */
|
|
#define MCT_U232_MSR_DCTS 0x01 /* Delta CTS */
|
|
|
|
/*
|
|
* Line Status Register (LSR)
|
|
*/
|
|
#define MCT_U232_LSR_INDEX 1 /* data[index] */
|
|
#define MCT_U232_LSR_ERR 0x80 /* OE | PE | FE | BI */
|
|
#define MCT_U232_LSR_TEMT 0x40 /* transmit register empty */
|
|
#define MCT_U232_LSR_THRE 0x20 /* transmit holding register empty */
|
|
#define MCT_U232_LSR_BI 0x10 /* break indicator */
|
|
#define MCT_U232_LSR_FE 0x08 /* framing error */
|
|
#define MCT_U232_LSR_OE 0x02 /* overrun error */
|
|
#define MCT_U232_LSR_PE 0x04 /* parity error */
|
|
#define MCT_U232_LSR_OE 0x02 /* overrun error */
|
|
#define MCT_U232_LSR_DR 0x01 /* receive data ready */
|
|
|
|
|
|
/* -----------------------------------------------------------------------------
|
|
* Technical Specification reverse engineered with SniffUSB on Windows98
|
|
* =====================================================================
|
|
*
|
|
* The technical details of the device have been acquired be using "SniffUSB"
|
|
* and the vendor-supplied device driver (version 2.3A) under Windows98. To
|
|
* identify the USB vendor-specific requests and to assign them to terminal
|
|
* settings (flow control, baud rate, etc.) the program "SerialSettings" from
|
|
* William G. Greathouse has been proven to be very useful. I also used the
|
|
* Win98 "HyperTerminal" and "usb-robot" on Linux for testing. The results and
|
|
* observations are summarized below:
|
|
*
|
|
* The USB requests seem to be directly mapped to the registers of a 8250,
|
|
* 16450 or 16550 UART. The FreeBSD handbook (appendix F.4 "Input/Output
|
|
* devices") contains a comprehensive description of UARTs and its registers.
|
|
* The bit descriptions are actually taken from there.
|
|
*
|
|
*
|
|
* Baud rate (divisor)
|
|
* -------------------
|
|
*
|
|
* BmRequestType: 0x40 (0100 0000B)
|
|
* bRequest: 0x05
|
|
* wValue: 0x0000
|
|
* wIndex: 0x0000
|
|
* wLength: 0x0004
|
|
* Data: divisor = 115200 / baud_rate
|
|
*
|
|
* SniffUSB observations (Nov 2003): Contrary to the 'wLength' value of 4
|
|
* shown above, observations with a Belkin F5U109 adapter, using the
|
|
* MCT-supplied Windows98 driver (U2SPORT.VXD, "File version: 1.21P.0104 for
|
|
* Win98/Me"), show this request has a length of 1 byte, presumably because
|
|
* of the fact that the Belkin adapter and the 'Sitecom U232-P25' adapter
|
|
* use a baud-rate code instead of a conventional RS-232 baud rate divisor.
|
|
* The current source code for this driver does not reflect this fact, but
|
|
* the driver works fine with this adapter/driver combination nonetheless.
|
|
*
|
|
*
|
|
* Line Control Register (LCR)
|
|
* ---------------------------
|
|
*
|
|
* BmRequestType: 0x40 (0100 0000B) 0xc0 (1100 0000B)
|
|
* bRequest: 0x07 0x06
|
|
* wValue: 0x0000
|
|
* wIndex: 0x0000
|
|
* wLength: 0x0001
|
|
* Data: LCR (see below)
|
|
*
|
|
* Bit 7: Divisor Latch Access Bit (DLAB). When set, access to the data
|
|
* transmit/receive register (THR/RBR) and the Interrupt Enable Register
|
|
* (IER) is disabled. Any access to these ports is now redirected to the
|
|
* Divisor Latch Registers. Setting this bit, loading the Divisor
|
|
* Registers, and clearing DLAB should be done with interrupts disabled.
|
|
* Bit 6: Set Break. When set to "1", the transmitter begins to transmit
|
|
* continuous Spacing until this bit is set to "0". This overrides any
|
|
* bits of characters that are being transmitted.
|
|
* Bit 5: Stick Parity. When parity is enabled, setting this bit causes parity
|
|
* to always be "1" or "0", based on the value of Bit 4.
|
|
* Bit 4: Even Parity Select (EPS). When parity is enabled and Bit 5 is "0",
|
|
* setting this bit causes even parity to be transmitted and expected.
|
|
* Otherwise, odd parity is used.
|
|
* Bit 3: Parity Enable (PEN). When set to "1", a parity bit is inserted
|
|
* between the last bit of the data and the Stop Bit. The UART will also
|
|
* expect parity to be present in the received data.
|
|
* Bit 2: Number of Stop Bits (STB). If set to "1" and using 5-bit data words,
|
|
* 1.5 Stop Bits are transmitted and expected in each data word. For
|
|
* 6, 7 and 8-bit data words, 2 Stop Bits are transmitted and expected.
|
|
* When this bit is set to "0", one Stop Bit is used on each data word.
|
|
* Bit 1: Word Length Select Bit #1 (WLSB1)
|
|
* Bit 0: Word Length Select Bit #0 (WLSB0)
|
|
* Together these bits specify the number of bits in each data word.
|
|
* 1 0 Word Length
|
|
* 0 0 5 Data Bits
|
|
* 0 1 6 Data Bits
|
|
* 1 0 7 Data Bits
|
|
* 1 1 8 Data Bits
|
|
*
|
|
* SniffUSB observations: Bit 7 seems not to be used. There seem to be two bugs
|
|
* in the Win98 driver: the break does not work (bit 6 is not asserted) and the
|
|
* stick parity bit is not cleared when set once. The LCR can also be read
|
|
* back with USB request 6 but this has never been observed with SniffUSB.
|
|
*
|
|
*
|
|
* Modem Control Register (MCR)
|
|
* ----------------------------
|
|
*
|
|
* BmRequestType: 0x40 (0100 0000B)
|
|
* bRequest: 0x0a
|
|
* wValue: 0x0000
|
|
* wIndex: 0x0000
|
|
* wLength: 0x0001
|
|
* Data: MCR (Bit 4..7, see below)
|
|
*
|
|
* Bit 7: Reserved, always 0.
|
|
* Bit 6: Reserved, always 0.
|
|
* Bit 5: Reserved, always 0.
|
|
* Bit 4: Loop-Back Enable. When set to "1", the UART transmitter and receiver
|
|
* are internally connected together to allow diagnostic operations. In
|
|
* addition, the UART modem control outputs are connected to the UART
|
|
* modem control inputs. CTS is connected to RTS, DTR is connected to
|
|
* DSR, OUT1 is connected to RI, and OUT 2 is connected to DCD.
|
|
* Bit 3: OUT 2. An auxiliary output that the host processor may set high or
|
|
* low. In the IBM PC serial adapter (and most clones), OUT 2 is used
|
|
* to tri-state (disable) the interrupt signal from the
|
|
* 8250/16450/16550 UART.
|
|
* Bit 2: OUT 1. An auxiliary output that the host processor may set high or
|
|
* low. This output is not used on the IBM PC serial adapter.
|
|
* Bit 1: Request to Send (RTS). When set to "1", the output of the UART -RTS
|
|
* line is Low (Active).
|
|
* Bit 0: Data Terminal Ready (DTR). When set to "1", the output of the UART
|
|
* -DTR line is Low (Active).
|
|
*
|
|
* SniffUSB observations: Bit 2 and 4 seem not to be used but bit 3 has been
|
|
* seen _always_ set.
|
|
*
|
|
*
|
|
* Modem Status Register (MSR)
|
|
* ---------------------------
|
|
*
|
|
* BmRequestType: 0xc0 (1100 0000B)
|
|
* bRequest: 0x02
|
|
* wValue: 0x0000
|
|
* wIndex: 0x0000
|
|
* wLength: 0x0001
|
|
* Data: MSR (see below)
|
|
*
|
|
* Bit 7: Data Carrier Detect (CD). Reflects the state of the DCD line on the
|
|
* UART.
|
|
* Bit 6: Ring Indicator (RI). Reflects the state of the RI line on the UART.
|
|
* Bit 5: Data Set Ready (DSR). Reflects the state of the DSR line on the UART.
|
|
* Bit 4: Clear To Send (CTS). Reflects the state of the CTS line on the UART.
|
|
* Bit 3: Delta Data Carrier Detect (DDCD). Set to "1" if the -DCD line has
|
|
* changed state one more more times since the last time the MSR was
|
|
* read by the host.
|
|
* Bit 2: Trailing Edge Ring Indicator (TERI). Set to "1" if the -RI line has
|
|
* had a low to high transition since the last time the MSR was read by
|
|
* the host.
|
|
* Bit 1: Delta Data Set Ready (DDSR). Set to "1" if the -DSR line has changed
|
|
* state one more more times since the last time the MSR was read by the
|
|
* host.
|
|
* Bit 0: Delta Clear To Send (DCTS). Set to "1" if the -CTS line has changed
|
|
* state one more times since the last time the MSR was read by the
|
|
* host.
|
|
*
|
|
* SniffUSB observations: the MSR is also returned as first byte on the
|
|
* interrupt-in endpoint 0x83 to signal changes of modem status lines. The USB
|
|
* request to read MSR cannot be applied during normal device operation.
|
|
*
|
|
*
|
|
* Line Status Register (LSR)
|
|
* --------------------------
|
|
*
|
|
* Bit 7 Error in Receiver FIFO. On the 8250/16450 UART, this bit is zero.
|
|
* This bit is set to "1" when any of the bytes in the FIFO have one
|
|
* or more of the following error conditions: PE, FE, or BI.
|
|
* Bit 6 Transmitter Empty (TEMT). When set to "1", there are no words
|
|
* remaining in the transmit FIFO or the transmit shift register. The
|
|
* transmitter is completely idle.
|
|
* Bit 5 Transmitter Holding Register Empty (THRE). When set to "1", the
|
|
* FIFO (or holding register) now has room for at least one additional
|
|
* word to transmit. The transmitter may still be transmitting when
|
|
* this bit is set to "1".
|
|
* Bit 4 Break Interrupt (BI). The receiver has detected a Break signal.
|
|
* Bit 3 Framing Error (FE). A Start Bit was detected but the Stop Bit did
|
|
* not appear at the expected time. The received word is probably
|
|
* garbled.
|
|
* Bit 2 Parity Error (PE). The parity bit was incorrect for the word
|
|
* received.
|
|
* Bit 1 Overrun Error (OE). A new word was received and there was no room
|
|
* in the receive buffer. The newly-arrived word in the shift register
|
|
* is discarded. On 8250/16450 UARTs, the word in the holding register
|
|
* is discarded and the newly- arrived word is put in the holding
|
|
* register.
|
|
* Bit 0 Data Ready (DR). One or more words are in the receive FIFO that the
|
|
* host may read. A word must be completely received and moved from
|
|
* the shift register into the FIFO (or holding register for
|
|
* 8250/16450 designs) before this bit is set.
|
|
*
|
|
* SniffUSB observations: the LSR is returned as second byte on the
|
|
* interrupt-in endpoint 0x83 to signal error conditions. Such errors have
|
|
* been seen with minicom/zmodem transfers (CRC errors).
|
|
*
|
|
*
|
|
* Unknown #1
|
|
* -------------------
|
|
*
|
|
* BmRequestType: 0x40 (0100 0000B)
|
|
* bRequest: 0x0b
|
|
* wValue: 0x0000
|
|
* wIndex: 0x0000
|
|
* wLength: 0x0001
|
|
* Data: 0x00
|
|
*
|
|
* SniffUSB observations (Nov 2003): With the MCT-supplied Windows98 driver
|
|
* (U2SPORT.VXD, "File version: 1.21P.0104 for Win98/Me"), this request
|
|
* occurs immediately after a "Baud rate (divisor)" message. It was not
|
|
* observed at any other time. It is unclear what purpose this message
|
|
* serves.
|
|
*
|
|
*
|
|
* Unknown #2
|
|
* -------------------
|
|
*
|
|
* BmRequestType: 0x40 (0100 0000B)
|
|
* bRequest: 0x0c
|
|
* wValue: 0x0000
|
|
* wIndex: 0x0000
|
|
* wLength: 0x0001
|
|
* Data: 0x00
|
|
*
|
|
* SniffUSB observations (Nov 2003): With the MCT-supplied Windows98 driver
|
|
* (U2SPORT.VXD, "File version: 1.21P.0104 for Win98/Me"), this request
|
|
* occurs immediately after the 'Unknown #1' message (see above). It was
|
|
* not observed at any other time. It is unclear what other purpose (if
|
|
* any) this message might serve, but without it, the USB/RS-232 adapter
|
|
* will not write to RS-232 devices which do not assert the 'CTS' signal.
|
|
*
|
|
*
|
|
* Flow control
|
|
* ------------
|
|
*
|
|
* SniffUSB observations: no flow control specific requests have been realized
|
|
* apart from DTR/RTS settings. Both signals are dropped for no flow control
|
|
* but asserted for hardware or software flow control.
|
|
*
|
|
*
|
|
* Endpoint usage
|
|
* --------------
|
|
*
|
|
* SniffUSB observations: the bulk-out endpoint 0x1 and interrupt-in endpoint
|
|
* 0x81 is used to transmit and receive characters. The second interrupt-in
|
|
* endpoint 0x83 signals exceptional conditions like modem line changes and
|
|
* errors. The first byte returned is the MSR and the second byte the LSR.
|
|
*
|
|
*
|
|
* Other observations
|
|
* ------------------
|
|
*
|
|
* Queued bulk transfers like used in visor.c did not work.
|
|
*
|
|
*
|
|
* Properties of the USB device used (as found in /var/log/messages)
|
|
* -----------------------------------------------------------------
|
|
*
|
|
* Manufacturer: MCT Corporation.
|
|
* Product: USB-232 Interfact Controller
|
|
* SerialNumber: U2S22050
|
|
*
|
|
* Length = 18
|
|
* DescriptorType = 01
|
|
* USB version = 1.00
|
|
* Vendor:Product = 0711:0210
|
|
* MaxPacketSize0 = 8
|
|
* NumConfigurations = 1
|
|
* Device version = 1.02
|
|
* Device Class:SubClass:Protocol = 00:00:00
|
|
* Per-interface classes
|
|
* Configuration:
|
|
* bLength = 9
|
|
* bDescriptorType = 02
|
|
* wTotalLength = 0027
|
|
* bNumInterfaces = 01
|
|
* bConfigurationValue = 01
|
|
* iConfiguration = 00
|
|
* bmAttributes = c0
|
|
* MaxPower = 100mA
|
|
*
|
|
* Interface: 0
|
|
* Alternate Setting: 0
|
|
* bLength = 9
|
|
* bDescriptorType = 04
|
|
* bInterfaceNumber = 00
|
|
* bAlternateSetting = 00
|
|
* bNumEndpoints = 03
|
|
* bInterface Class:SubClass:Protocol = 00:00:00
|
|
* iInterface = 00
|
|
* Endpoint:
|
|
* bLength = 7
|
|
* bDescriptorType = 05
|
|
* bEndpointAddress = 81 (in)
|
|
* bmAttributes = 03 (Interrupt)
|
|
* wMaxPacketSize = 0040
|
|
* bInterval = 02
|
|
* Endpoint:
|
|
* bLength = 7
|
|
* bDescriptorType = 05
|
|
* bEndpointAddress = 01 (out)
|
|
* bmAttributes = 02 (Bulk)
|
|
* wMaxPacketSize = 0040
|
|
* bInterval = 00
|
|
* Endpoint:
|
|
* bLength = 7
|
|
* bDescriptorType = 05
|
|
* bEndpointAddress = 83 (in)
|
|
* bmAttributes = 03 (Interrupt)
|
|
* wMaxPacketSize = 0002
|
|
* bInterval = 02
|
|
*
|
|
*
|
|
* Hardware details (added by Martin Hamilton, 2001/12/06)
|
|
* -----------------------------------------------------------------
|
|
*
|
|
* This info was gleaned from opening a Belkin F5U109 DB9 USB serial
|
|
* adaptor, which turns out to simply be a re-badged U232-P9. We
|
|
* know this because there is a sticky label on the circuit board
|
|
* which says "U232-P9" ;-)
|
|
*
|
|
* The circuit board inside the adaptor contains a Philips PDIUSBD12
|
|
* USB endpoint chip and a Philips P87C52UBAA microcontroller with
|
|
* embedded UART. Exhaustive documentation for these is available at:
|
|
*
|
|
* http://www.semiconductors.philips.com/pip/p87c52ubaa
|
|
* http://www.nxp.com/acrobat_download/various/PDIUSBD12_PROGRAMMING_GUIDE.pdf
|
|
*
|
|
* Thanks to Julian Highfield for the pointer to the Philips database.
|
|
*
|
|
*/
|
|
|
|
#endif /* __LINUX_USB_SERIAL_MCT_U232_H */
|
|
|