2 * MCT (Magic Control Technology Corp.) USB RS232 Converter Driver
4 * Copyright (C) 2000 Wolfgang Grandegger (wolfgang@ces.ch)
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is largely derived from the Belkin USB Serial Adapter Driver
12 * (see belkin_sa.[ch]). All of the information about the device was acquired
13 * by using SniffUSB on Windows98. For technical details see mct_u232.h.
15 * William G. Greathouse and Greg Kroah-Hartman provided great help on how to
16 * do the reverse engineering and how to write a USB serial device driver.
18 * TO BE DONE, TO BE CHECKED:
19 * DTR/RTS signal handling may be incomplete or incorrect. I have mainly
20 * implemented what I have seen with SniffUSB or found in belkin_sa.c.
21 * For further TODOs check also belkin_sa.c.
24 #include <linux/kernel.h>
25 #include <linux/errno.h>
26 #include <linux/init.h>
27 #include <linux/slab.h>
28 #include <linux/tty.h>
29 #include <linux/tty_driver.h>
30 #include <linux/tty_flip.h>
31 #include <linux/module.h>
32 #include <linux/spinlock.h>
33 #include <linux/uaccess.h>
34 #include <asm/unaligned.h>
35 #include <linux/usb.h>
36 #include <linux/usb/serial.h>
37 #include <linux/serial.h>
40 #define DRIVER_AUTHOR "Wolfgang Grandegger <wolfgang@ces.ch>"
41 #define DRIVER_DESC "Magic Control Technology USB-RS232 converter driver"
46 static int mct_u232_port_probe(struct usb_serial_port *port);
47 static int mct_u232_port_remove(struct usb_serial_port *remove);
48 static int mct_u232_open(struct tty_struct *tty, struct usb_serial_port *port);
49 static void mct_u232_close(struct usb_serial_port *port);
50 static void mct_u232_dtr_rts(struct usb_serial_port *port, int on);
51 static void mct_u232_read_int_callback(struct urb *urb);
52 static void mct_u232_set_termios(struct tty_struct *tty,
53 struct usb_serial_port *port, struct ktermios *old);
54 static void mct_u232_break_ctl(struct tty_struct *tty, int break_state);
55 static int mct_u232_tiocmget(struct tty_struct *tty);
56 static int mct_u232_tiocmset(struct tty_struct *tty,
57 unsigned int set, unsigned int clear);
58 static void mct_u232_throttle(struct tty_struct *tty);
59 static void mct_u232_unthrottle(struct tty_struct *tty);
63 * All of the device info needed for the MCT USB-RS232 converter.
65 static const struct usb_device_id id_table[] = {
66 { USB_DEVICE(MCT_U232_VID, MCT_U232_PID) },
67 { USB_DEVICE(MCT_U232_VID, MCT_U232_SITECOM_PID) },
68 { USB_DEVICE(MCT_U232_VID, MCT_U232_DU_H3SP_PID) },
69 { USB_DEVICE(MCT_U232_BELKIN_F5U109_VID, MCT_U232_BELKIN_F5U109_PID) },
70 { } /* Terminating entry */
72 MODULE_DEVICE_TABLE(usb, id_table);
74 static struct usb_serial_driver mct_u232_device = {
79 .description = "MCT U232",
82 .open = mct_u232_open,
83 .close = mct_u232_close,
84 .dtr_rts = mct_u232_dtr_rts,
85 .throttle = mct_u232_throttle,
86 .unthrottle = mct_u232_unthrottle,
87 .read_int_callback = mct_u232_read_int_callback,
88 .set_termios = mct_u232_set_termios,
89 .break_ctl = mct_u232_break_ctl,
90 .tiocmget = mct_u232_tiocmget,
91 .tiocmset = mct_u232_tiocmset,
92 .tiocmiwait = usb_serial_generic_tiocmiwait,
93 .port_probe = mct_u232_port_probe,
94 .port_remove = mct_u232_port_remove,
95 .get_icount = usb_serial_generic_get_icount,
98 static struct usb_serial_driver * const serial_drivers[] = {
99 &mct_u232_device, NULL
102 struct mct_u232_private {
103 struct urb *read_urb;
105 unsigned int control_state; /* Modem Line Setting (TIOCM) */
106 unsigned char last_lcr; /* Line Control Register */
107 unsigned char last_lsr; /* Line Status Register */
108 unsigned char last_msr; /* Modem Status Register */
109 unsigned int rx_flags; /* Throttling flags */
112 #define THROTTLED 0x01
115 * Handle vendor specific USB requests
118 #define WDR_TIMEOUT 5000 /* default urb timeout */
121 * Later day 2.6.0-test kernels have new baud rates like B230400 which
122 * we do not know how to support. We ignore them for the moment.
124 static int mct_u232_calculate_baud_rate(struct usb_serial *serial,
125 speed_t value, speed_t *result)
129 if (le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_SITECOM_PID
130 || le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_BELKIN_F5U109_PID) {
135 return 0x02; /* this one not tested */
157 /* FIXME: Can we use any divider - should we do
158 divider = 115200/value;
159 real baud = 115200/divider */
179 static int mct_u232_set_baud_rate(struct tty_struct *tty,
180 struct usb_serial *serial, struct usb_serial_port *port, speed_t value)
182 unsigned int divisor;
185 unsigned char cts_enable_byte = 0;
188 buf = kmalloc(MCT_U232_MAX_SIZE, GFP_KERNEL);
192 divisor = mct_u232_calculate_baud_rate(serial, value, &speed);
193 put_unaligned_le32(cpu_to_le32(divisor), buf);
194 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
195 MCT_U232_SET_BAUD_RATE_REQUEST,
196 MCT_U232_SET_REQUEST_TYPE,
197 0, 0, buf, MCT_U232_SET_BAUD_RATE_SIZE,
199 if (rc < 0) /*FIXME: What value speed results */
200 dev_err(&port->dev, "Set BAUD RATE %d failed (error = %d)\n",
203 tty_encode_baud_rate(tty, speed, speed);
204 dev_dbg(&port->dev, "set_baud_rate: value: 0x%x, divisor: 0x%x\n", value, divisor);
206 /* Mimic the MCT-supplied Windows driver (version 1.21P.0104), which
207 always sends two extra USB 'device request' messages after the
208 'baud rate change' message. The actual functionality of the
209 request codes in these messages is not fully understood but these
210 particular codes are never seen in any operation besides a baud
211 rate change. Both of these messages send a single byte of data.
212 In the first message, the value of this byte is always zero.
214 The second message has been determined experimentally to control
215 whether data will be transmitted to a device which is not asserting
216 the 'CTS' signal. If the second message's data byte is zero, data
217 will be transmitted even if 'CTS' is not asserted (i.e. no hardware
218 flow control). if the second message's data byte is nonzero (a
219 value of 1 is used by this driver), data will not be transmitted to
220 a device which is not asserting 'CTS'.
224 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
225 MCT_U232_SET_UNKNOWN1_REQUEST,
226 MCT_U232_SET_REQUEST_TYPE,
227 0, 0, buf, MCT_U232_SET_UNKNOWN1_SIZE,
230 dev_err(&port->dev, "Sending USB device request code %d "
231 "failed (error = %d)\n", MCT_U232_SET_UNKNOWN1_REQUEST,
234 if (port && C_CRTSCTS(tty))
237 dev_dbg(&port->dev, "set_baud_rate: send second control message, data = %02X\n",
239 buf[0] = cts_enable_byte;
240 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
241 MCT_U232_SET_CTS_REQUEST,
242 MCT_U232_SET_REQUEST_TYPE,
243 0, 0, buf, MCT_U232_SET_CTS_SIZE,
246 dev_err(&port->dev, "Sending USB device request code %d "
247 "failed (error = %d)\n", MCT_U232_SET_CTS_REQUEST, rc);
251 } /* mct_u232_set_baud_rate */
253 static int mct_u232_set_line_ctrl(struct usb_serial_port *port,
259 buf = kmalloc(MCT_U232_MAX_SIZE, GFP_KERNEL);
264 rc = usb_control_msg(port->serial->dev, usb_sndctrlpipe(port->serial->dev, 0),
265 MCT_U232_SET_LINE_CTRL_REQUEST,
266 MCT_U232_SET_REQUEST_TYPE,
267 0, 0, buf, MCT_U232_SET_LINE_CTRL_SIZE,
270 dev_err(&port->dev, "Set LINE CTRL 0x%x failed (error = %d)\n", lcr, rc);
271 dev_dbg(&port->dev, "set_line_ctrl: 0x%x\n", lcr);
274 } /* mct_u232_set_line_ctrl */
276 static int mct_u232_set_modem_ctrl(struct usb_serial_port *port,
277 unsigned int control_state)
283 buf = kmalloc(MCT_U232_MAX_SIZE, GFP_KERNEL);
287 mcr = MCT_U232_MCR_NONE;
288 if (control_state & TIOCM_DTR)
289 mcr |= MCT_U232_MCR_DTR;
290 if (control_state & TIOCM_RTS)
291 mcr |= MCT_U232_MCR_RTS;
294 rc = usb_control_msg(port->serial->dev, usb_sndctrlpipe(port->serial->dev, 0),
295 MCT_U232_SET_MODEM_CTRL_REQUEST,
296 MCT_U232_SET_REQUEST_TYPE,
297 0, 0, buf, MCT_U232_SET_MODEM_CTRL_SIZE,
301 dev_dbg(&port->dev, "set_modem_ctrl: state=0x%x ==> mcr=0x%x\n", control_state, mcr);
304 dev_err(&port->dev, "Set MODEM CTRL 0x%x failed (error = %d)\n", mcr, rc);
308 } /* mct_u232_set_modem_ctrl */
310 static int mct_u232_get_modem_stat(struct usb_serial_port *port,
316 buf = kmalloc(MCT_U232_MAX_SIZE, GFP_KERNEL);
321 rc = usb_control_msg(port->serial->dev, usb_rcvctrlpipe(port->serial->dev, 0),
322 MCT_U232_GET_MODEM_STAT_REQUEST,
323 MCT_U232_GET_REQUEST_TYPE,
324 0, 0, buf, MCT_U232_GET_MODEM_STAT_SIZE,
327 dev_err(&port->dev, "Get MODEM STATus failed (error = %d)\n", rc);
332 dev_dbg(&port->dev, "get_modem_stat: 0x%x\n", *msr);
335 } /* mct_u232_get_modem_stat */
337 static void mct_u232_msr_to_icount(struct async_icount *icount,
340 /* Translate Control Line states */
341 if (msr & MCT_U232_MSR_DDSR)
343 if (msr & MCT_U232_MSR_DCTS)
345 if (msr & MCT_U232_MSR_DRI)
347 if (msr & MCT_U232_MSR_DCD)
349 } /* mct_u232_msr_to_icount */
351 static void mct_u232_msr_to_state(struct usb_serial_port *port,
352 unsigned int *control_state, unsigned char msr)
354 /* Translate Control Line states */
355 if (msr & MCT_U232_MSR_DSR)
356 *control_state |= TIOCM_DSR;
358 *control_state &= ~TIOCM_DSR;
359 if (msr & MCT_U232_MSR_CTS)
360 *control_state |= TIOCM_CTS;
362 *control_state &= ~TIOCM_CTS;
363 if (msr & MCT_U232_MSR_RI)
364 *control_state |= TIOCM_RI;
366 *control_state &= ~TIOCM_RI;
367 if (msr & MCT_U232_MSR_CD)
368 *control_state |= TIOCM_CD;
370 *control_state &= ~TIOCM_CD;
371 dev_dbg(&port->dev, "msr_to_state: msr=0x%x ==> state=0x%x\n", msr, *control_state);
372 } /* mct_u232_msr_to_state */
375 * Driver's tty interface functions
378 static int mct_u232_port_probe(struct usb_serial_port *port)
380 struct usb_serial *serial = port->serial;
381 struct mct_u232_private *priv;
383 /* check first to simplify error handling */
384 if (!serial->port[1] || !serial->port[1]->interrupt_in_urb) {
385 dev_err(&port->dev, "expected endpoint missing\n");
389 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
393 /* Use second interrupt-in endpoint for reading. */
394 priv->read_urb = serial->port[1]->interrupt_in_urb;
395 priv->read_urb->context = port;
397 spin_lock_init(&priv->lock);
399 usb_set_serial_port_data(port, priv);
404 static int mct_u232_port_remove(struct usb_serial_port *port)
406 struct mct_u232_private *priv;
408 priv = usb_get_serial_port_data(port);
414 static int mct_u232_open(struct tty_struct *tty, struct usb_serial_port *port)
416 struct usb_serial *serial = port->serial;
417 struct mct_u232_private *priv = usb_get_serial_port_data(port);
419 unsigned int control_state;
421 unsigned char last_lcr;
422 unsigned char last_msr;
424 /* Compensate for a hardware bug: although the Sitecom U232-P25
425 * device reports a maximum output packet size of 32 bytes,
426 * it seems to be able to accept only 16 bytes (and that's what
427 * SniffUSB says too...)
429 if (le16_to_cpu(serial->dev->descriptor.idProduct)
430 == MCT_U232_SITECOM_PID)
431 port->bulk_out_size = 16;
433 /* Do a defined restart: the normal serial device seems to
434 * always turn on DTR and RTS here, so do the same. I'm not
435 * sure if this is really necessary. But it should not harm
438 spin_lock_irqsave(&priv->lock, flags);
439 if (tty && (tty->termios.c_cflag & CBAUD))
440 priv->control_state = TIOCM_DTR | TIOCM_RTS;
442 priv->control_state = 0;
444 priv->last_lcr = (MCT_U232_DATA_BITS_8 |
445 MCT_U232_PARITY_NONE |
446 MCT_U232_STOP_BITS_1);
447 control_state = priv->control_state;
448 last_lcr = priv->last_lcr;
449 spin_unlock_irqrestore(&priv->lock, flags);
450 mct_u232_set_modem_ctrl(port, control_state);
451 mct_u232_set_line_ctrl(port, last_lcr);
453 /* Read modem status and update control state */
454 mct_u232_get_modem_stat(port, &last_msr);
455 spin_lock_irqsave(&priv->lock, flags);
456 priv->last_msr = last_msr;
457 mct_u232_msr_to_state(port, &priv->control_state, priv->last_msr);
458 spin_unlock_irqrestore(&priv->lock, flags);
460 retval = usb_submit_urb(priv->read_urb, GFP_KERNEL);
463 "usb_submit_urb(read) failed pipe 0x%x err %d\n",
464 port->read_urb->pipe, retval);
468 retval = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
470 usb_kill_urb(priv->read_urb);
472 "usb_submit_urb(read int) failed pipe 0x%x err %d",
473 port->interrupt_in_urb->pipe, retval);
480 } /* mct_u232_open */
482 static void mct_u232_dtr_rts(struct usb_serial_port *port, int on)
484 unsigned int control_state;
485 struct mct_u232_private *priv = usb_get_serial_port_data(port);
487 spin_lock_irq(&priv->lock);
489 priv->control_state |= TIOCM_DTR | TIOCM_RTS;
491 priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS);
492 control_state = priv->control_state;
493 spin_unlock_irq(&priv->lock);
495 mct_u232_set_modem_ctrl(port, control_state);
498 static void mct_u232_close(struct usb_serial_port *port)
500 struct mct_u232_private *priv = usb_get_serial_port_data(port);
502 usb_kill_urb(priv->read_urb);
503 usb_kill_urb(port->interrupt_in_urb);
505 usb_serial_generic_close(port);
506 } /* mct_u232_close */
509 static void mct_u232_read_int_callback(struct urb *urb)
511 struct usb_serial_port *port = urb->context;
512 struct mct_u232_private *priv = usb_get_serial_port_data(port);
513 unsigned char *data = urb->transfer_buffer;
515 int status = urb->status;
525 /* this urb is terminated, clean up */
526 dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
530 dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
535 usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
538 * Work-a-round: handle the 'usual' bulk-in pipe here
540 if (urb->transfer_buffer_length > 2) {
541 if (urb->actual_length) {
542 tty_insert_flip_string(&port->port, data,
544 tty_flip_buffer_push(&port->port);
550 * The interrupt-in pipe signals exceptional conditions (modem line
551 * signal changes and errors). data[0] holds MSR, data[1] holds LSR.
553 spin_lock_irqsave(&priv->lock, flags);
554 priv->last_msr = data[MCT_U232_MSR_INDEX];
556 /* Record Control Line states */
557 mct_u232_msr_to_state(port, &priv->control_state, priv->last_msr);
559 mct_u232_msr_to_icount(&port->icount, priv->last_msr);
562 /* Not yet handled. See belkin_sa.c for further information */
563 /* Now to report any errors */
564 priv->last_lsr = data[MCT_U232_LSR_INDEX];
566 * fill in the flip buffer here, but I do not know the relation
567 * to the current/next receive buffer or characters. I need
568 * to look in to this before committing any code.
570 if (priv->last_lsr & MCT_U232_LSR_ERR) {
571 tty = tty_port_tty_get(&port->port);
573 if (priv->last_lsr & MCT_U232_LSR_OE) {
576 if (priv->last_lsr & MCT_U232_LSR_PE) {
579 if (priv->last_lsr & MCT_U232_LSR_FE) {
581 /* Break Indicator */
582 if (priv->last_lsr & MCT_U232_LSR_BI) {
587 wake_up_interruptible(&port->port.delta_msr_wait);
588 spin_unlock_irqrestore(&priv->lock, flags);
590 retval = usb_submit_urb(urb, GFP_ATOMIC);
593 "%s - usb_submit_urb failed with result %d\n",
595 } /* mct_u232_read_int_callback */
597 static void mct_u232_set_termios(struct tty_struct *tty,
598 struct usb_serial_port *port,
599 struct ktermios *old_termios)
601 struct usb_serial *serial = port->serial;
602 struct mct_u232_private *priv = usb_get_serial_port_data(port);
603 struct ktermios *termios = &tty->termios;
604 unsigned int cflag = termios->c_cflag;
605 unsigned int old_cflag = old_termios->c_cflag;
607 unsigned int control_state;
608 unsigned char last_lcr;
610 /* get a local copy of the current port settings */
611 spin_lock_irqsave(&priv->lock, flags);
612 control_state = priv->control_state;
613 spin_unlock_irqrestore(&priv->lock, flags);
618 * Do not attempt to cache old rates and skip settings,
619 * disconnects screw such tricks up completely.
620 * Premature optimization is the root of all evil.
623 /* reassert DTR and RTS on transition from B0 */
624 if ((old_cflag & CBAUD) == B0) {
625 dev_dbg(&port->dev, "%s: baud was B0\n", __func__);
626 control_state |= TIOCM_DTR | TIOCM_RTS;
627 mct_u232_set_modem_ctrl(port, control_state);
630 mct_u232_set_baud_rate(tty, serial, port, tty_get_baud_rate(tty));
632 if ((cflag & CBAUD) == B0) {
633 dev_dbg(&port->dev, "%s: baud is B0\n", __func__);
634 /* Drop RTS and DTR */
635 control_state &= ~(TIOCM_DTR | TIOCM_RTS);
636 mct_u232_set_modem_ctrl(port, control_state);
640 * Update line control register (LCR)
645 last_lcr |= (cflag & PARODD) ?
646 MCT_U232_PARITY_ODD : MCT_U232_PARITY_EVEN;
648 last_lcr |= MCT_U232_PARITY_NONE;
650 /* set the number of data bits */
651 switch (cflag & CSIZE) {
653 last_lcr |= MCT_U232_DATA_BITS_5; break;
655 last_lcr |= MCT_U232_DATA_BITS_6; break;
657 last_lcr |= MCT_U232_DATA_BITS_7; break;
659 last_lcr |= MCT_U232_DATA_BITS_8; break;
662 "CSIZE was not CS5-CS8, using default of 8\n");
663 last_lcr |= MCT_U232_DATA_BITS_8;
667 termios->c_cflag &= ~CMSPAR;
669 /* set the number of stop bits */
670 last_lcr |= (cflag & CSTOPB) ?
671 MCT_U232_STOP_BITS_2 : MCT_U232_STOP_BITS_1;
673 mct_u232_set_line_ctrl(port, last_lcr);
675 /* save off the modified port settings */
676 spin_lock_irqsave(&priv->lock, flags);
677 priv->control_state = control_state;
678 priv->last_lcr = last_lcr;
679 spin_unlock_irqrestore(&priv->lock, flags);
680 } /* mct_u232_set_termios */
682 static void mct_u232_break_ctl(struct tty_struct *tty, int break_state)
684 struct usb_serial_port *port = tty->driver_data;
685 struct mct_u232_private *priv = usb_get_serial_port_data(port);
689 spin_lock_irqsave(&priv->lock, flags);
690 lcr = priv->last_lcr;
693 lcr |= MCT_U232_SET_BREAK;
694 spin_unlock_irqrestore(&priv->lock, flags);
696 mct_u232_set_line_ctrl(port, lcr);
697 } /* mct_u232_break_ctl */
700 static int mct_u232_tiocmget(struct tty_struct *tty)
702 struct usb_serial_port *port = tty->driver_data;
703 struct mct_u232_private *priv = usb_get_serial_port_data(port);
704 unsigned int control_state;
707 spin_lock_irqsave(&priv->lock, flags);
708 control_state = priv->control_state;
709 spin_unlock_irqrestore(&priv->lock, flags);
711 return control_state;
714 static int mct_u232_tiocmset(struct tty_struct *tty,
715 unsigned int set, unsigned int clear)
717 struct usb_serial_port *port = tty->driver_data;
718 struct mct_u232_private *priv = usb_get_serial_port_data(port);
719 unsigned int control_state;
722 spin_lock_irqsave(&priv->lock, flags);
723 control_state = priv->control_state;
726 control_state |= TIOCM_RTS;
728 control_state |= TIOCM_DTR;
729 if (clear & TIOCM_RTS)
730 control_state &= ~TIOCM_RTS;
731 if (clear & TIOCM_DTR)
732 control_state &= ~TIOCM_DTR;
734 priv->control_state = control_state;
735 spin_unlock_irqrestore(&priv->lock, flags);
736 return mct_u232_set_modem_ctrl(port, control_state);
739 static void mct_u232_throttle(struct tty_struct *tty)
741 struct usb_serial_port *port = tty->driver_data;
742 struct mct_u232_private *priv = usb_get_serial_port_data(port);
743 unsigned int control_state;
745 spin_lock_irq(&priv->lock);
746 priv->rx_flags |= THROTTLED;
747 if (C_CRTSCTS(tty)) {
748 priv->control_state &= ~TIOCM_RTS;
749 control_state = priv->control_state;
750 spin_unlock_irq(&priv->lock);
751 mct_u232_set_modem_ctrl(port, control_state);
753 spin_unlock_irq(&priv->lock);
757 static void mct_u232_unthrottle(struct tty_struct *tty)
759 struct usb_serial_port *port = tty->driver_data;
760 struct mct_u232_private *priv = usb_get_serial_port_data(port);
761 unsigned int control_state;
763 spin_lock_irq(&priv->lock);
764 if ((priv->rx_flags & THROTTLED) && C_CRTSCTS(tty)) {
765 priv->rx_flags &= ~THROTTLED;
766 priv->control_state |= TIOCM_RTS;
767 control_state = priv->control_state;
768 spin_unlock_irq(&priv->lock);
769 mct_u232_set_modem_ctrl(port, control_state);
771 spin_unlock_irq(&priv->lock);
775 module_usb_serial_driver(serial_drivers, id_table);
777 MODULE_AUTHOR(DRIVER_AUTHOR);
778 MODULE_DESCRIPTION(DRIVER_DESC);
779 MODULE_LICENSE("GPL");