/* these do not deal with device that have more than 1 port */ staticinlineint update_mctrl(struct usb_device *dev, unsignedint set, unsignedint clear)
{ unsigned urb_value; int result;
if (((set | clear) & (TIOCM_DTR | TIOCM_RTS)) == 0) {
dev_dbg(&dev->dev, "%s - DTR|RTS not being set|cleared\n", __func__); return 0; /* no change */
}
clear &= ~set; /* 'set' takes precedence over 'clear' */
urb_value = 0; if (set & TIOCM_DTR)
urb_value |= UART_MCR_DTR; if (set & TIOCM_RTS)
urb_value |= UART_MCR_RTS;
result = ssu100_setregister(dev, 0, UART_MCR, urb_value); if (result < 0)
dev_dbg(&dev->dev, "%s Error from MODEM_CTRL urb\n", __func__);
return result;
}
staticint ssu100_initdevice(struct usb_device *dev)
{
u8 *data; int result = 0;
data = kzalloc(3, GFP_KERNEL); if (!data) return -ENOMEM;
result = ssu100_getdevice(dev, data); if (result < 0) {
dev_dbg(&dev->dev, "%s - get_device failed %i\n", __func__, result); goto out;
}
data[1] &= ~FULLPWRBIT;
result = ssu100_setdevice(dev, data); if (result < 0) {
dev_dbg(&dev->dev, "%s - setdevice failed %i\n", __func__, result); goto out;
}
result = ssu100_control_msg(dev, QT_GET_SET_PREBUF_TRIG_LVL, 128, 0); if (result < 0) {
dev_dbg(&dev->dev, "%s - set prebuffer level failed %i\n", __func__, result); goto out;
}
result = ssu100_control_msg(dev, QT_SET_ATF, ATC_DISABLED, 0); if (result < 0) {
dev_dbg(&dev->dev, "%s - set ATFprebuffer level failed %i\n", __func__, result); goto out;
}
result = ssu100_getdevice(dev, data); if (result < 0) {
dev_dbg(&dev->dev, "%s - get_device failed %i\n", __func__, result); goto out;
}
result = ssu100_control_msg(dev, QT_GET_SET_UART, divisor, urb_value); if (result < 0)
dev_dbg(&port->dev, "%s - set uart failed\n", __func__);
if (cflag & CRTSCTS)
result = ssu100_control_msg(dev, QT_HW_FLOW_CONTROL_MASK,
SERIAL_CRTSCTS, 0); else
result = ssu100_control_msg(dev, QT_HW_FLOW_CONTROL_MASK,
0, 0); if (result < 0)
dev_dbg(&port->dev, "%s - set HW flow control failed\n", __func__);
if (I_IXOFF(tty) || I_IXON(tty)) {
u16 x = ((u16)(START_CHAR(tty) << 8) | (u16)(STOP_CHAR(tty)));
result = ssu100_control_msg(dev, QT_SW_FLOW_CONTROL_MASK,
x, 0);
} else
result = ssu100_control_msg(dev, QT_SW_FLOW_CONTROL_MASK,
0, 0);
if (result < 0)
dev_dbg(&port->dev, "%s - set SW flow control failed\n", __func__);
/* set to 9600 */
result = ssu100_control_msg(dev, QT_GET_SET_UART, 0x30, 0x0300); if (result < 0)
dev_dbg(&port->dev, "%s - set uart failed\n", __func__);
if (tty)
ssu100_set_termios(tty, port, &tty->termios);
*tty_flag = TTY_NORMAL; if (lsr & UART_LSR_BRK_ERROR_BITS) { /* we always want to update icount, but we only want to
* update tty_flag for one case */ if (lsr & UART_LSR_BI) {
port->icount.brk++;
*tty_flag = TTY_BREAK;
usb_serial_handle_break(port);
} if (lsr & UART_LSR_PE) {
port->icount.parity++; if (*tty_flag == TTY_NORMAL)
*tty_flag = TTY_PARITY;
} if (lsr & UART_LSR_FE) {
port->icount.frame++; if (*tty_flag == TTY_NORMAL)
*tty_flag = TTY_FRAME;
} if (lsr & UART_LSR_OE) {
port->icount.overrun++;
tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
}
}
}
staticvoid ssu100_process_read_urb(struct urb *urb)
{ struct usb_serial_port *port = urb->context; char *packet = urb->transfer_buffer; char flag = TTY_NORMAL;
u32 len = urb->actual_length; int i; char *ch;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.