Lines Matching +full:value +full:- +full:start
5 * Copyright (c) 2008 Samuel Thibault <samuel.thibault@ens-lyon.org>
14 #include "qemu/error-report.h"
16 #include "hw/qdev-properties.h"
17 #include "hw/qdev-properties-system.h"
21 #include "chardev/char-serial.h"
22 #include "chardev/char-fe.h"
27 #define RECV_BUF (512 - (2 * 8))
111 #define TYPE_USB_SERIAL "usb-serial-dev"
196 s->flow_control = flow_control; in usb_serial_set_flow_control()
197 trace_usb_serial_set_flow_control(bus->busnr, dev->addr, flow_control); in usb_serial_set_flow_control()
205 s->xon = xonxoff & 0xff; in usb_serial_set_xonxoff()
206 s->xoff = (xonxoff >> 8) & 0xff; in usb_serial_set_xonxoff()
208 trace_usb_serial_set_xonxoff(bus->busnr, dev->addr, s->xon, s->xoff); in usb_serial_set_xonxoff()
213 s->event_chr = 0x0d; in usb_serial_reset()
214 s->event_trigger = 0; in usb_serial_reset()
215 s->recv_ptr = 0; in usb_serial_reset()
216 s->recv_used = 0; in usb_serial_reset()
226 trace_usb_serial_reset(bus->busnr, dev->addr); in usb_serial_handle_reset()
237 if (qemu_chr_fe_ioctl(&s->cs, in usb_get_modem_lines()
238 CHR_IOCTL_SERIAL_GET_TIOCM, &flags) == -ENOTSUP) { in usb_get_modem_lines()
260 int request, int value, int index, in usb_serial_handle_control() argument
267 trace_usb_serial_handle_control(bus->busnr, dev->addr, request, value); in usb_serial_handle_control()
269 ret = usb_desc_handle_control(dev, p, request, value, index, length, data); in usb_serial_handle_control()
280 switch (value) { in usb_serial_handle_control()
285 s->recv_ptr = 0; in usb_serial_handle_control()
286 s->recv_used = 0; in usb_serial_handle_control()
297 qemu_chr_fe_ioctl(&s->cs, CHR_IOCTL_SERIAL_GET_TIOCM, &flags); in usb_serial_handle_control()
298 if (value & FTDI_SET_RTS) { in usb_serial_handle_control()
299 if (value & FTDI_RTS) { in usb_serial_handle_control()
305 if (value & FTDI_SET_DTR) { in usb_serial_handle_control()
306 if (value & FTDI_DTR) { in usb_serial_handle_control()
312 qemu_chr_fe_ioctl(&s->cs, CHR_IOCTL_SERIAL_SET_TIOCM, &flags); in usb_serial_handle_control()
320 usb_serial_set_xonxoff(s, value); in usb_serial_handle_control()
326 int subdivisor8 = subdivisors8[((value & 0xc000) >> 14) in usb_serial_handle_control()
328 int divisor = value & 0x3fff; in usb_serial_handle_control()
338 s->params.speed = (48000000 / 2) / (8 * divisor + subdivisor8); in usb_serial_handle_control()
339 trace_usb_serial_set_baud(bus->busnr, dev->addr, s->params.speed); in usb_serial_handle_control()
340 qemu_chr_fe_ioctl(&s->cs, CHR_IOCTL_SERIAL_SET_PARAMS, &s->params); in usb_serial_handle_control()
344 switch (value & 0xff) { in usb_serial_handle_control()
346 s->params.data_bits = 7; in usb_serial_handle_control()
349 s->params.data_bits = 8; in usb_serial_handle_control()
356 trace_usb_serial_unsupported_data_bits(bus->busnr, dev->addr, in usb_serial_handle_control()
357 value & 0xff); in usb_serial_handle_control()
358 s->params.data_bits = 8; in usb_serial_handle_control()
361 switch (value & FTDI_PARITY) { in usb_serial_handle_control()
363 s->params.parity = 'N'; in usb_serial_handle_control()
366 s->params.parity = 'O'; in usb_serial_handle_control()
369 s->params.parity = 'E'; in usb_serial_handle_control()
372 trace_usb_serial_unsupported_parity(bus->busnr, dev->addr, in usb_serial_handle_control()
373 value & FTDI_PARITY); in usb_serial_handle_control()
377 switch (value & FTDI_STOP) { in usb_serial_handle_control()
379 s->params.stop_bits = 1; in usb_serial_handle_control()
382 s->params.stop_bits = 2; in usb_serial_handle_control()
385 trace_usb_serial_unsupported_stopbits(bus->busnr, dev->addr, in usb_serial_handle_control()
386 value & FTDI_STOP); in usb_serial_handle_control()
390 trace_usb_serial_set_data(bus->busnr, dev->addr, s->params.parity, in usb_serial_handle_control()
391 s->params.data_bits, s->params.stop_bits); in usb_serial_handle_control()
392 qemu_chr_fe_ioctl(&s->cs, CHR_IOCTL_SERIAL_SET_PARAMS, &s->params); in usb_serial_handle_control()
398 p->actual_length = 2; in usb_serial_handle_control()
402 s->event_chr = value; in usb_serial_handle_control()
406 s->error_chr = value; in usb_serial_handle_control()
409 s->latency = value; in usb_serial_handle_control()
412 data[0] = s->latency; in usb_serial_handle_control()
413 p->actual_length = 1; in usb_serial_handle_control()
417 trace_usb_serial_unsupported_control(bus->busnr, dev->addr, request, in usb_serial_handle_control()
418 value); in usb_serial_handle_control()
419 p->status = USB_RET_STALL; in usb_serial_handle_control()
430 packet_len = p->iov.size; in usb_serial_token_in()
432 p->status = USB_RET_NAK; in usb_serial_token_in()
439 if (s->event_trigger && s->event_trigger & FTDI_BI) { in usb_serial_token_in()
440 s->event_trigger &= ~FTDI_BI; in usb_serial_token_in()
448 if (!s->recv_used) { in usb_serial_token_in()
449 p->status = USB_RET_NAK; in usb_serial_token_in()
453 while (s->recv_used && packet_len > 2) { in usb_serial_token_in()
457 len -= 2; in usb_serial_token_in()
458 if (len > s->recv_used) { in usb_serial_token_in()
459 len = s->recv_used; in usb_serial_token_in()
462 first_len = RECV_BUF - s->recv_ptr; in usb_serial_token_in()
467 usb_packet_copy(p, s->recv_buf + s->recv_ptr, first_len); in usb_serial_token_in()
469 usb_packet_copy(p, s->recv_buf, len - first_len); in usb_serial_token_in()
471 s->recv_used -= len; in usb_serial_token_in()
472 s->recv_ptr = (s->recv_ptr + len) % RECV_BUF; in usb_serial_token_in()
473 packet_len -= len + 2; in usb_serial_token_in()
481 uint8_t devep = p->ep->nr; in usb_serial_handle_data()
485 switch (p->pid) { in usb_serial_handle_data()
490 for (i = 0; i < p->iov.niov; i++) { in usb_serial_handle_data()
491 iov = p->iov.iov + i; in usb_serial_handle_data()
496 qemu_chr_fe_write_all(&s->cs, iov->iov_base, iov->iov_len); in usb_serial_handle_data()
498 p->actual_length = p->iov.size; in usb_serial_handle_data()
509 trace_usb_serial_bad_token(bus->busnr, dev->addr); in usb_serial_handle_data()
511 p->status = USB_RET_STALL; in usb_serial_handle_data()
520 if (!s->dev.attached) { in usb_serial_can_read()
523 return RECV_BUF - s->recv_used; in usb_serial_can_read()
529 int first_size, start; in usb_serial_read() local
532 if (size > (RECV_BUF - s->recv_used)) { in usb_serial_read()
533 size = RECV_BUF - s->recv_used; in usb_serial_read()
536 start = s->recv_ptr + s->recv_used; in usb_serial_read()
537 if (start < RECV_BUF) { in usb_serial_read()
539 first_size = RECV_BUF - start; in usb_serial_read()
544 memcpy(s->recv_buf + start, buf, first_size); in usb_serial_read()
548 memcpy(s->recv_buf, buf + first_size, size - first_size); in usb_serial_read()
551 start -= RECV_BUF; in usb_serial_read()
552 memcpy(s->recv_buf + start, buf, size); in usb_serial_read()
554 s->recv_used += size; in usb_serial_read()
556 usb_wakeup(s->intr, 0); in usb_serial_read()
565 s->event_trigger |= FTDI_BI; in usb_serial_event()
568 if (!s->always_plugged && !s->dev.attached) { in usb_serial_event()
569 usb_device_attach(&s->dev, &error_abort); in usb_serial_event()
573 if (!s->always_plugged && s->dev.attached) { in usb_serial_event()
574 usb_device_detach(&s->dev); in usb_serial_event()
591 dev->auto_attach = 0; in usb_serial_realize()
593 if (!qemu_chr_fe_backend_connected(&s->cs)) { in usb_serial_realize()
604 qemu_chr_fe_set_handlers(&s->cs, usb_serial_can_read, usb_serial_read, in usb_serial_realize()
608 if ((s->always_plugged || qemu_chr_fe_backend_open(&s->cs)) && in usb_serial_realize()
609 !dev->attached) { in usb_serial_realize()
612 s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1); in usb_serial_realize()
625 dev = USB_DEVICE(qdev_new("usb-braille")); in usb_braille_init()
626 qdev_prop_set_chr(&dev->qdev, "chardev", cdrv); in usb_braille_init()
631 .name = "usb-serial",
637 DEFINE_PROP_BOOL("always-plugged", USBSerialState, always_plugged, false),
645 uc->realize = usb_serial_realize; in usb_serial_dev_class_init()
646 uc->handle_reset = usb_serial_handle_reset; in usb_serial_dev_class_init()
647 uc->handle_control = usb_serial_handle_control; in usb_serial_dev_class_init()
648 uc->handle_data = usb_serial_handle_data; in usb_serial_dev_class_init()
649 dc->vmsd = &vmstate_usb_serial; in usb_serial_dev_class_init()
650 set_bit(DEVICE_CATEGORY_INPUT, dc->categories); in usb_serial_dev_class_init()
666 uc->product_desc = "QEMU USB Serial"; in usb_serial_class_initfn()
667 uc->usb_desc = &desc_serial; in usb_serial_class_initfn()
672 .name = "usb-serial",
686 uc->product_desc = "QEMU USB Braille"; in usb_braille_class_initfn()
687 uc->usb_desc = &desc_braille; in usb_braille_class_initfn()
692 .name = "usb-braille",
702 usb_legacy_register("usb-braille", "braille", usb_braille_init); in usb_serial_register_types()