2  * Copyright 2007, Frank A Kingswood <frank@kingswood-consulting.co.uk>
 
   3  * Copyright 2007, Werner Cornelius <werner@cornelius-consult.de>
 
   4  * Copyright 2009, Boris Hajduk <boris@hajduk.org>
 
   6  * ch341.c implements a serial port driver for the Winchiphead CH341.
 
   8  * The CH341 device can be used to implement an RS232 asynchronous
 
   9  * serial port, an IEEE-1284 parallel printer port or a memory-like
 
  10  * interface. In all cases the CH341 supports an I2C interface as well.
 
  11  * This driver only supports the asynchronous serial interface.
 
  13  * This program is free software; you can redistribute it and/or
 
  14  * modify it under the terms of the GNU General Public License version
 
  15  * 2 as published by the Free Software Foundation.
 
  18 #include <linux/kernel.h>
 
  19 #include <linux/init.h>
 
  20 #include <linux/tty.h>
 
  21 #include <linux/module.h>
 
  22 #include <linux/usb.h>
 
  23 #include <linux/usb/serial.h>
 
  24 #include <linux/serial.h>
 
  26 #define DEFAULT_BAUD_RATE 9600
 
  27 #define DEFAULT_TIMEOUT   1000
 
  29 /* flags for IO-Bits */
 
  30 #define CH341_BIT_RTS (1 << 6)
 
  31 #define CH341_BIT_DTR (1 << 5)
 
  33 /******************************/
 
  34 /* interrupt pipe definitions */
 
  35 /******************************/
 
  36 /* always 4 interrupt bytes */
 
  37 /* first irq byte normally 0x08 */
 
  38 /* second irq byte base 0x7d + below */
 
  39 /* third irq byte base 0x94 + below */
 
  40 /* fourth irq byte normally 0xee */
 
  42 /* second interrupt byte */
 
  43 #define CH341_MULT_STAT 0x04 /* multiple status since last interrupt event */
 
  45 /* status returned in third interrupt answer byte, inverted in data
 
  47 #define CH341_BIT_CTS 0x01
 
  48 #define CH341_BIT_DSR 0x02
 
  49 #define CH341_BIT_RI  0x04
 
  50 #define CH341_BIT_DCD 0x08
 
  51 #define CH341_BITS_MODEM_STAT 0x0f /* all bits */
 
  53 /*******************************/
 
  54 /* baudrate calculation factor */
 
  55 /*******************************/
 
  56 #define CH341_BAUDBASE_FACTOR 1532620800
 
  57 #define CH341_BAUDBASE_DIVMAX 3
 
  61 static struct usb_device_id id_table [] = {
 
  62         { USB_DEVICE(0x4348, 0x5523) },
 
  63         { USB_DEVICE(0x1a86, 0x7523) },
 
  66 MODULE_DEVICE_TABLE(usb, id_table);
 
  68 struct ch341_private {
 
  69         spinlock_t lock; /* access lock */
 
  70         wait_queue_head_t delta_msr_wait; /* wait queue for modem status */
 
  71         unsigned baud_rate; /* set baud rate */
 
  72         u8 line_control; /* set line control value RTS/DTR */
 
  73         u8 line_status; /* active status of modem control inputs */
 
  74         u8 multi_status_change; /* status changed multiple since last call */
 
  77 static int ch341_control_out(struct usb_device *dev, u8 request,
 
  81         dbg("ch341_control_out(%02x,%02x,%04x,%04x)", USB_DIR_OUT|0x40,
 
  82                 (int)request, (int)value, (int)index);
 
  84         r = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), request,
 
  85                             USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
 
  86                             value, index, NULL, 0, DEFAULT_TIMEOUT);
 
  91 static int ch341_control_in(struct usb_device *dev,
 
  92                             u8 request, u16 value, u16 index,
 
  93                             char *buf, unsigned bufsize)
 
  96         dbg("ch341_control_in(%02x,%02x,%04x,%04x,%p,%u)", USB_DIR_IN|0x40,
 
  97                 (int)request, (int)value, (int)index, buf, (int)bufsize);
 
  99         r = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), request,
 
 100                             USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
 
 101                             value, index, buf, bufsize, DEFAULT_TIMEOUT);
 
 105 static int ch341_set_baudrate(struct usb_device *dev,
 
 106                               struct ch341_private *priv)
 
 110         unsigned long factor;
 
 113         dbg("ch341_set_baudrate(%d)", priv->baud_rate);
 
 115         if (!priv->baud_rate)
 
 117         factor = (CH341_BAUDBASE_FACTOR / priv->baud_rate);
 
 118         divisor = CH341_BAUDBASE_DIVMAX;
 
 120         while ((factor > 0xfff0) && divisor) {
 
 128         factor = 0x10000 - factor;
 
 129         a = (factor & 0xff00) | divisor;
 
 132         r = ch341_control_out(dev, 0x9a, 0x1312, a);
 
 134                 r = ch341_control_out(dev, 0x9a, 0x0f2c, b);
 
 139 static int ch341_set_handshake(struct usb_device *dev, u8 control)
 
 141         dbg("ch341_set_handshake(0x%02x)", control);
 
 142         return ch341_control_out(dev, 0xa4, ~control, 0);
 
 145 static int ch341_get_status(struct usb_device *dev, struct ch341_private *priv)
 
 149         const unsigned size = 8;
 
 152         dbg("ch341_get_status()");
 
 154         buffer = kmalloc(size, GFP_KERNEL);
 
 158         r = ch341_control_in(dev, 0x95, 0x0706, 0, buffer, size);
 
 162         /* setup the private status if available */
 
 165                 spin_lock_irqsave(&priv->lock, flags);
 
 166                 priv->line_status = (~(*buffer)) & CH341_BITS_MODEM_STAT;
 
 167                 priv->multi_status_change = 0;
 
 168                 spin_unlock_irqrestore(&priv->lock, flags);
 
 176 /* -------------------------------------------------------------------------- */
 
 178 static int ch341_configure(struct usb_device *dev, struct ch341_private *priv)
 
 182         const unsigned size = 8;
 
 184         dbg("ch341_configure()");
 
 186         buffer = kmalloc(size, GFP_KERNEL);
 
 190         /* expect two bytes 0x27 0x00 */
 
 191         r = ch341_control_in(dev, 0x5f, 0, 0, buffer, size);
 
 195         r = ch341_control_out(dev, 0xa1, 0, 0);
 
 199         r = ch341_set_baudrate(dev, priv);
 
 203         /* expect two bytes 0x56 0x00 */
 
 204         r = ch341_control_in(dev, 0x95, 0x2518, 0, buffer, size);
 
 208         r = ch341_control_out(dev, 0x9a, 0x2518, 0x0050);
 
 212         /* expect 0xff 0xee */
 
 213         r = ch341_get_status(dev, priv);
 
 217         r = ch341_control_out(dev, 0xa1, 0x501f, 0xd90a);
 
 221         r = ch341_set_baudrate(dev, priv);
 
 225         r = ch341_set_handshake(dev, priv->line_control);
 
 229         /* expect 0x9f 0xee */
 
 230         r = ch341_get_status(dev, priv);
 
 236 /* allocate private data */
 
 237 static int ch341_attach(struct usb_serial *serial)
 
 239         struct ch341_private *priv;
 
 242         dbg("ch341_attach()");
 
 245         priv = kzalloc(sizeof(struct ch341_private), GFP_KERNEL);
 
 249         spin_lock_init(&priv->lock);
 
 250         init_waitqueue_head(&priv->delta_msr_wait);
 
 251         priv->baud_rate = DEFAULT_BAUD_RATE;
 
 252         priv->line_control = CH341_BIT_RTS | CH341_BIT_DTR;
 
 254         r = ch341_configure(serial->dev, priv);
 
 258         usb_set_serial_port_data(serial->port[0], priv);
 
 265 static void ch341_close(struct tty_struct *tty, struct usb_serial_port *port,
 
 268         struct ch341_private *priv = usb_get_serial_port_data(port);
 
 270         unsigned int c_cflag;
 
 272         dbg("%s - port %d", __func__, port->number);
 
 274         /* shutdown our urbs */
 
 275         dbg("%s - shutting down urbs", __func__);
 
 276         usb_kill_urb(port->write_urb);
 
 277         usb_kill_urb(port->read_urb);
 
 278         usb_kill_urb(port->interrupt_in_urb);
 
 281                 c_cflag = tty->termios->c_cflag;
 
 282                 if (c_cflag & HUPCL) {
 
 283                         /* drop DTR and RTS */
 
 284                         spin_lock_irqsave(&priv->lock, flags);
 
 285                         priv->line_control = 0;
 
 286                         spin_unlock_irqrestore(&priv->lock, flags);
 
 287                         ch341_set_handshake(port->serial->dev, 0);
 
 290         wake_up_interruptible(&priv->delta_msr_wait);
 
 294 /* open this device, set default parameters */
 
 295 static int ch341_open(struct tty_struct *tty, struct usb_serial_port *port,
 
 298         struct usb_serial *serial = port->serial;
 
 299         struct ch341_private *priv = usb_get_serial_port_data(serial->port[0]);
 
 304         priv->baud_rate = DEFAULT_BAUD_RATE;
 
 305         priv->line_control = CH341_BIT_RTS | CH341_BIT_DTR;
 
 307         r = ch341_configure(serial->dev, priv);
 
 311         r = ch341_set_handshake(serial->dev, priv->line_control);
 
 315         r = ch341_set_baudrate(serial->dev, priv);
 
 319         dbg("%s - submitting interrupt urb", __func__);
 
 320         port->interrupt_in_urb->dev = serial->dev;
 
 321         r = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
 
 323                 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
 
 324                         " error %d\n", __func__, r);
 
 325                 ch341_close(tty, port, NULL);
 
 329         r = usb_serial_generic_open(tty, port, filp);
 
 334 /* Old_termios contains the original termios settings and
 
 335  * tty->termios contains the new setting to be used.
 
 337 static void ch341_set_termios(struct tty_struct *tty,
 
 338                 struct usb_serial_port *port, struct ktermios *old_termios)
 
 340         struct ch341_private *priv = usb_get_serial_port_data(port);
 
 344         dbg("ch341_set_termios()");
 
 346         if (!tty || !tty->termios)
 
 349         baud_rate = tty_get_baud_rate(tty);
 
 351         priv->baud_rate = baud_rate;
 
 354                 spin_lock_irqsave(&priv->lock, flags);
 
 355                 priv->line_control |= (CH341_BIT_DTR | CH341_BIT_RTS);
 
 356                 spin_unlock_irqrestore(&priv->lock, flags);
 
 357                 ch341_set_baudrate(port->serial->dev, priv);
 
 359                 spin_lock_irqsave(&priv->lock, flags);
 
 360                 priv->line_control &= ~(CH341_BIT_DTR | CH341_BIT_RTS);
 
 361                 spin_unlock_irqrestore(&priv->lock, flags);
 
 364         ch341_set_handshake(port->serial->dev, priv->line_control);
 
 367          * (cflag & CSIZE) : data bits [5, 8]
 
 368          * (cflag & PARENB) : parity {NONE, EVEN, ODD}
 
 369          * (cflag & CSTOPB) : stop bits [1, 2]
 
 373 static int ch341_tiocmset(struct tty_struct *tty, struct file *file,
 
 374                           unsigned int set, unsigned int clear)
 
 376         struct usb_serial_port *port = tty->driver_data;
 
 377         struct ch341_private *priv = usb_get_serial_port_data(port);
 
 381         spin_lock_irqsave(&priv->lock, flags);
 
 383                 priv->line_control |= CH341_BIT_RTS;
 
 385                 priv->line_control |= CH341_BIT_DTR;
 
 386         if (clear & TIOCM_RTS)
 
 387                 priv->line_control &= ~CH341_BIT_RTS;
 
 388         if (clear & TIOCM_DTR)
 
 389                 priv->line_control &= ~CH341_BIT_DTR;
 
 390         control = priv->line_control;
 
 391         spin_unlock_irqrestore(&priv->lock, flags);
 
 393         return ch341_set_handshake(port->serial->dev, control);
 
 396 static void ch341_read_int_callback(struct urb *urb)
 
 398         struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
 
 399         unsigned char *data = urb->transfer_buffer;
 
 400         unsigned int actual_length = urb->actual_length;
 
 403         dbg("%s (%d)", __func__, port->number);
 
 405         switch (urb->status) {
 
 412                 /* this urb is terminated, clean up */
 
 413                 dbg("%s - urb shutting down with status: %d", __func__,
 
 417                 dbg("%s - nonzero urb status received: %d", __func__,
 
 422         usb_serial_debug_data(debug, &port->dev, __func__,
 
 423                               urb->actual_length, urb->transfer_buffer);
 
 425         if (actual_length >= 4) {
 
 426                 struct ch341_private *priv = usb_get_serial_port_data(port);
 
 429                 spin_lock_irqsave(&priv->lock, flags);
 
 430                 priv->line_status = (~(data[2])) & CH341_BITS_MODEM_STAT;
 
 431                 if ((data[1] & CH341_MULT_STAT))
 
 432                         priv->multi_status_change = 1;
 
 433                 spin_unlock_irqrestore(&priv->lock, flags);
 
 434                 wake_up_interruptible(&priv->delta_msr_wait);
 
 438         status = usb_submit_urb(urb, GFP_ATOMIC);
 
 440                 dev_err(&urb->dev->dev,
 
 441                         "%s - usb_submit_urb failed with result %d\n",
 
 445 static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
 
 447         struct ch341_private *priv = usb_get_serial_port_data(port);
 
 454         spin_lock_irqsave(&priv->lock, flags);
 
 455         prevstatus = priv->line_status;
 
 456         priv->multi_status_change = 0;
 
 457         spin_unlock_irqrestore(&priv->lock, flags);
 
 459         while (!multi_change) {
 
 460                 interruptible_sleep_on(&priv->delta_msr_wait);
 
 461                 /* see if a signal did it */
 
 462                 if (signal_pending(current))
 
 465                 spin_lock_irqsave(&priv->lock, flags);
 
 466                 status = priv->line_status;
 
 467                 multi_change = priv->multi_status_change;
 
 468                 spin_unlock_irqrestore(&priv->lock, flags);
 
 470                 changed = prevstatus ^ status;
 
 472                 if (((arg & TIOCM_RNG) && (changed & CH341_BIT_RI)) ||
 
 473                     ((arg & TIOCM_DSR) && (changed & CH341_BIT_DSR)) ||
 
 474                     ((arg & TIOCM_CD)  && (changed & CH341_BIT_DCD)) ||
 
 475                     ((arg & TIOCM_CTS) && (changed & CH341_BIT_CTS))) {
 
 484 /*static int ch341_ioctl(struct usb_serial_port *port, struct file *file,*/
 
 485 static int ch341_ioctl(struct tty_struct *tty, struct file *file,
 
 486                         unsigned int cmd, unsigned long arg)
 
 488         struct usb_serial_port *port = tty->driver_data;
 
 489         dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
 
 493                 dbg("%s (%d) TIOCMIWAIT", __func__,  port->number);
 
 494                 return wait_modem_info(port, arg);
 
 497                 dbg("%s not supported = 0x%04x", __func__, cmd);
 
 504 static int ch341_tiocmget(struct tty_struct *tty, struct file *file)
 
 506         struct usb_serial_port *port = tty->driver_data;
 
 507         struct ch341_private *priv = usb_get_serial_port_data(port);
 
 513         dbg("%s (%d)", __func__, port->number);
 
 515         spin_lock_irqsave(&priv->lock, flags);
 
 516         mcr = priv->line_control;
 
 517         status = priv->line_status;
 
 518         spin_unlock_irqrestore(&priv->lock, flags);
 
 520         result = ((mcr & CH341_BIT_DTR)         ? TIOCM_DTR : 0)
 
 521                   | ((mcr & CH341_BIT_RTS)      ? TIOCM_RTS : 0)
 
 522                   | ((status & CH341_BIT_CTS)   ? TIOCM_CTS : 0)
 
 523                   | ((status & CH341_BIT_DSR)   ? TIOCM_DSR : 0)
 
 524                   | ((status & CH341_BIT_RI)    ? TIOCM_RI  : 0)
 
 525                   | ((status & CH341_BIT_DCD)   ? TIOCM_CD  : 0);
 
 527         dbg("%s - result = %x", __func__, result);
 
 533 static int ch341_reset_resume(struct usb_interface *intf)
 
 535         struct usb_device *dev = interface_to_usbdev(intf);
 
 536         struct usb_serial *serial = NULL;
 
 537         struct ch341_private *priv;
 
 539         serial = usb_get_intfdata(intf);
 
 540         priv = usb_get_serial_port_data(serial->port[0]);
 
 542         /*reconfigure ch341 serial port after bus-reset*/
 
 543         ch341_configure(dev, priv);
 
 545         usb_serial_resume(intf);
 
 550 static struct usb_driver ch341_driver = {
 
 552         .probe          = usb_serial_probe,
 
 553         .disconnect     = usb_serial_disconnect,
 
 554         .suspend        = usb_serial_suspend,
 
 555         .resume         = usb_serial_resume,
 
 556         .reset_resume   = ch341_reset_resume,
 
 557         .id_table       = id_table,
 
 559         .supports_autosuspend = 1,
 
 562 static struct usb_serial_driver ch341_device = {
 
 564                 .owner  = THIS_MODULE,
 
 565                 .name   = "ch341-uart",
 
 567         .id_table          = id_table,
 
 568         .usb_driver        = &ch341_driver,
 
 571         .close             = ch341_close,
 
 572         .ioctl             = ch341_ioctl,
 
 573         .set_termios       = ch341_set_termios,
 
 574         .tiocmget          = ch341_tiocmget,
 
 575         .tiocmset          = ch341_tiocmset,
 
 576         .read_int_callback = ch341_read_int_callback,
 
 577         .attach            = ch341_attach,
 
 580 static int __init ch341_init(void)
 
 584         retval = usb_serial_register(&ch341_device);
 
 587         retval = usb_register(&ch341_driver);
 
 589                 usb_serial_deregister(&ch341_device);
 
 593 static void __exit ch341_exit(void)
 
 595         usb_deregister(&ch341_driver);
 
 596         usb_serial_deregister(&ch341_device);
 
 599 module_init(ch341_init);
 
 600 module_exit(ch341_exit);
 
 601 MODULE_LICENSE("GPL");
 
 603 module_param(debug, bool, S_IRUGO | S_IWUSR);
 
 604 MODULE_PARM_DESC(debug, "Debug enabled or not");