Ejemplo n.º 1
0
static void ir_set_termios (struct usb_serial_port *port, struct termios *old_termios)
{
    unsigned char *transfer_buffer;
    unsigned int cflag;
    int result;

    dbg("%s - port %d", __FUNCTION__, port->number);

    if ((!port->tty) || (!port->tty->termios)) {
        dbg("%s - no tty structures", __FUNCTION__);
        return;
    }

    cflag = port->tty->termios->c_cflag;
    /* check that they really want us to change something */
    if (old_termios) {
        if ((cflag == old_termios->c_cflag) &&
                (RELEVANT_IFLAG(port->tty->termios->c_iflag) == RELEVANT_IFLAG(old_termios->c_iflag))) {
            dbg("%s - nothing to change...", __FUNCTION__);
            return;
        }
    }

    /* All we can change is the baud rate */
    if (cflag & CBAUD) {

        dbg ("%s - asking for baud %d",
             __FUNCTION__,
             tty_get_baud_rate(port->tty));

        /*
         * FIXME, we should compare the baud request against the
         * capability stated in the IR header that we got in the
         * startup funtion.
         */
        switch (cflag & CBAUD) {
        case B2400:
            ir_baud = SPEED_2400;
            break;
        default:
        case B9600:
            ir_baud = SPEED_9600;
            break;
        case B19200:
            ir_baud = SPEED_19200;
            break;
        case B38400:
            ir_baud = SPEED_38400;
            break;
        case B57600:
            ir_baud = SPEED_57600;
            break;
        case B115200:
            ir_baud = SPEED_115200;
            break;
        case B576000:
            ir_baud = SPEED_576000;
            break;
        case B1152000:
            ir_baud = SPEED_1152000;
            break;
        case B4000000:
            ir_baud = SPEED_4000000;
            break;
        }

        if (xbof == -1) {
            ir_xbof = ir_xbof_change(ir_add_bof);
        } else {
            ir_xbof = ir_xbof_change(xbof) ;
        }

        /* Notify the tty driver that the termios have changed. */
        port->tty->ldisc.set_termios(port->tty, NULL);

        /* FIXME need to check to see if our write urb is busy right
         * now, or use a urb pool.
         *
         * send the baud change out on an "empty" data packet
         */
        transfer_buffer = port->write_urb->transfer_buffer;
        *transfer_buffer = ir_xbof | ir_baud;

        usb_fill_bulk_urb (
            port->write_urb,
            port->serial->dev,
            usb_sndbulkpipe(port->serial->dev,
                            port->bulk_out_endpointAddress),
            port->write_urb->transfer_buffer,
            1,
            ir_write_bulk_callback,
            port);

        port->write_urb->transfer_flags
            = USB_QUEUE_BULK
              | USB_ZERO_PACKET;

        result = usb_submit_urb (port->write_urb);
        if (result)
            err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
    }
    return;
}
Ejemplo n.º 2
0
static void ir_set_termios(struct tty_struct *tty,
		struct usb_serial_port *port, struct ktermios *old_termios)
{
	struct urb *urb;
	unsigned char *transfer_buffer;
	int result;
	speed_t baud;
	int ir_baud;

	dbg("%s - port %d", __func__, port->number);

	baud = tty_get_baud_rate(tty);

	/*
	 * FIXME, we should compare the baud request against the
	 * capability stated in the IR header that we got in the
	 * startup function.
	 */

	switch (baud) {
	case 2400:
		ir_baud = USB_IRDA_BR_2400;
		break;
	case 9600:
		ir_baud = USB_IRDA_BR_9600;
		break;
	case 19200:
		ir_baud = USB_IRDA_BR_19200;
		break;
	case 38400:
		ir_baud = USB_IRDA_BR_38400;
		break;
	case 57600:
		ir_baud = USB_IRDA_BR_57600;
		break;
	case 115200:
		ir_baud = USB_IRDA_BR_115200;
		break;
	case 576000:
		ir_baud = USB_IRDA_BR_576000;
		break;
	case 1152000:
		ir_baud = USB_IRDA_BR_1152000;
		break;
	case 4000000:
		ir_baud = USB_IRDA_BR_4000000;
		break;
	default:
		ir_baud = USB_IRDA_BR_9600;
		baud = 9600;
	}

	if (xbof == -1)
		ir_xbof = ir_xbof_change(ir_add_bof);
	else
		ir_xbof = ir_xbof_change(xbof) ;

	/* Only speed changes are supported */
	tty_termios_copy_hw(tty->termios, old_termios);
	tty_encode_baud_rate(tty, baud, baud);

	/*
	 * send the baud change out on an "empty" data packet
	 */
	urb = usb_alloc_urb(0, GFP_KERNEL);
	if (!urb) {
		dev_err(&port->dev, "%s - no more urbs\n", __func__);
		return;
	}
	transfer_buffer = kmalloc(1, GFP_KERNEL);
	if (!transfer_buffer) {
		dev_err(&port->dev, "%s - out of memory\n", __func__);
		goto err_buf;
	}

	*transfer_buffer = ir_xbof | ir_baud;

	usb_fill_bulk_urb(
		urb,
		port->serial->dev,
		usb_sndbulkpipe(port->serial->dev,
			port->bulk_out_endpointAddress),
		transfer_buffer,
		1,
		ir_set_termios_callback,
		port);

	urb->transfer_flags = URB_ZERO_PACKET;

	result = usb_submit_urb(urb, GFP_KERNEL);
	if (result) {
		dev_err(&port->dev, "%s - failed to submit urb: %d\n",
							__func__, result);
		goto err_subm;
	}

	usb_free_urb(urb);

	return;
err_subm:
	kfree(transfer_buffer);
err_buf:
	usb_free_urb(urb);
}
Ejemplo n.º 3
0
static void ir_set_termios(struct tty_struct *tty,
		struct usb_serial_port *port, struct ktermios *old_termios)
{
	unsigned char *transfer_buffer;
	int result;
	speed_t baud;
	int ir_baud;

	dbg("%s - port %d", __func__, port->number);

	baud = tty_get_baud_rate(tty);

	/*
	 * FIXME, we should compare the baud request against the
	 * capability stated in the IR header that we got in the
	 * startup function.
	 */

	switch (baud) {
	case 2400:
		ir_baud = USB_IRDA_BR_2400;
		break;
	case 9600:
		ir_baud = USB_IRDA_BR_9600;
		break;
	case 19200:
		ir_baud = USB_IRDA_BR_19200;
		break;
	case 38400:
		ir_baud = USB_IRDA_BR_38400;
		break;
	case 57600:
		ir_baud = USB_IRDA_BR_57600;
		break;
	case 115200:
		ir_baud = USB_IRDA_BR_115200;
		break;
	case 576000:
		ir_baud = USB_IRDA_BR_576000;
		break;
	case 1152000:
		ir_baud = USB_IRDA_BR_1152000;
		break;
	case 4000000:
		ir_baud = USB_IRDA_BR_4000000;
		break;
	default:
		ir_baud = USB_IRDA_BR_9600;
		baud = 9600;
	}

	if (xbof == -1)
		ir_xbof = ir_xbof_change(ir_add_bof);
	else
		ir_xbof = ir_xbof_change(xbof) ;

	/* FIXME need to check to see if our write urb is busy right
	 * now, or use a urb pool.
	 *
	 * send the baud change out on an "empty" data packet
	 */
	transfer_buffer = port->write_urb->transfer_buffer;
	*transfer_buffer = ir_xbof | ir_baud;

	usb_fill_bulk_urb(
		port->write_urb,
		port->serial->dev,
		usb_sndbulkpipe(port->serial->dev,
			port->bulk_out_endpointAddress),
		port->write_urb->transfer_buffer,
		1,
		ir_write_bulk_callback,
		port);

	port->write_urb->transfer_flags = URB_ZERO_PACKET;

	result = usb_submit_urb(port->write_urb, GFP_KERNEL);
	if (result)
		dev_err(&port->dev,
				"%s - failed submitting write urb, error %d\n",
				__func__, result);

	/* Only speed changes are supported */
	tty_termios_copy_hw(tty->termios, old_termios);
	tty_encode_baud_rate(tty, baud, baud);
}