90 |
90 |
|
91 |
91 |
typedef struct {
|
92 |
92 |
USBDevice dev;
|
93 |
|
uint16_t vendorid;
|
94 |
|
uint16_t productid;
|
|
93 |
uint32_t vendorid;
|
|
94 |
uint32_t productid;
|
95 |
95 |
uint8_t recv_buf[RECV_BUF];
|
96 |
96 |
uint16_t recv_ptr;
|
97 |
97 |
uint16_t recv_used;
|
... | ... | |
527 |
527 |
{
|
528 |
528 |
USBSerialState *s = DO_UPCAST(USBSerialState, dev, dev);
|
529 |
529 |
s->dev.speed = USB_SPEED_FULL;
|
|
530 |
|
|
531 |
qemu_chr_add_handlers(s->cs, usb_serial_can_read, usb_serial_read,
|
|
532 |
usb_serial_event, s);
|
|
533 |
usb_serial_handle_reset(dev);
|
530 |
534 |
return 0;
|
531 |
535 |
}
|
532 |
536 |
|
533 |
|
USBDevice *usb_serial_init(const char *filename)
|
|
537 |
static USBDevice *usb_serial_init(const char *filename)
|
534 |
538 |
{
|
535 |
539 |
USBDevice *dev;
|
536 |
|
USBSerialState *s;
|
537 |
540 |
CharDriverState *cdrv;
|
538 |
|
unsigned short vendorid = 0x0403, productid = 0x6001;
|
|
541 |
uint32_t vendorid = 0, productid = 0;
|
539 |
542 |
char label[32];
|
540 |
543 |
static int index;
|
541 |
544 |
|
... | ... | |
545 |
548 |
if (strstart(filename, "vendorid=", &p)) {
|
546 |
549 |
vendorid = strtol(p, &e, 16);
|
547 |
550 |
if (e == p || (*e && *e != ',' && *e != ':')) {
|
548 |
|
printf("bogus vendor ID %s\n", p);
|
|
551 |
qemu_error("bogus vendor ID %s\n", p);
|
549 |
552 |
return NULL;
|
550 |
553 |
}
|
551 |
554 |
filename = e;
|
552 |
555 |
} else if (strstart(filename, "productid=", &p)) {
|
553 |
556 |
productid = strtol(p, &e, 16);
|
554 |
557 |
if (e == p || (*e && *e != ',' && *e != ':')) {
|
555 |
|
printf("bogus product ID %s\n", p);
|
|
558 |
qemu_error("bogus product ID %s\n", p);
|
556 |
559 |
return NULL;
|
557 |
560 |
}
|
558 |
561 |
filename = e;
|
559 |
562 |
} else {
|
560 |
|
printf("unrecognized serial USB option %s\n", filename);
|
|
563 |
qemu_error("unrecognized serial USB option %s\n", filename);
|
561 |
564 |
return NULL;
|
562 |
565 |
}
|
563 |
566 |
while(*filename == ',')
|
564 |
567 |
filename++;
|
565 |
568 |
}
|
566 |
569 |
if (!*filename) {
|
567 |
|
printf("character device specification needed\n");
|
|
570 |
qemu_error("character device specification needed\n");
|
568 |
571 |
return NULL;
|
569 |
572 |
}
|
570 |
573 |
filename++;
|
... | ... | |
574 |
577 |
if (!cdrv)
|
575 |
578 |
return NULL;
|
576 |
579 |
|
577 |
|
dev = usb_create_simple(NULL /* FIXME */, "QEMU USB Serial");
|
578 |
|
s = DO_UPCAST(USBSerialState, dev, dev);
|
579 |
|
s->cs = cdrv;
|
580 |
|
s->vendorid = vendorid;
|
581 |
|
s->productid = productid;
|
582 |
|
snprintf(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Serial(%.16s)",
|
583 |
|
filename);
|
|
580 |
dev = usb_create(NULL /* FIXME */, "QEMU USB Serial");
|
|
581 |
qdev_prop_set_chr(&dev->qdev, "chardev", cdrv);
|
|
582 |
if (vendorid)
|
|
583 |
qdev_prop_set_uint16(&dev->qdev, "vendorid", vendorid);
|
|
584 |
if (productid)
|
|
585 |
qdev_prop_set_uint16(&dev->qdev, "productid", productid);
|
|
586 |
qdev_init(&dev->qdev);
|
584 |
587 |
|
585 |
|
qemu_chr_add_handlers(cdrv, usb_serial_can_read, usb_serial_read,
|
586 |
|
usb_serial_event, s);
|
|
588 |
return dev;
|
|
589 |
}
|
|
590 |
|
|
591 |
static USBDevice *usb_braille_init(const char *unused)
|
|
592 |
{
|
|
593 |
USBDevice *dev;
|
|
594 |
CharDriverState *cdrv;
|
|
595 |
|
|
596 |
cdrv = qemu_chr_open("braille", "braille", NULL);
|
|
597 |
if (!cdrv)
|
|
598 |
return NULL;
|
587 |
599 |
|
588 |
|
usb_serial_handle_reset((USBDevice *)s);
|
589 |
|
return (USBDevice *)s;
|
|
600 |
dev = usb_create(NULL /* FIXME */, "QEMU USB Braille");
|
|
601 |
qdev_prop_set_chr(&dev->qdev, "chardev", cdrv);
|
|
602 |
qdev_init(&dev->qdev);
|
|
603 |
|
|
604 |
return dev;
|
590 |
605 |
}
|
591 |
606 |
|
592 |
607 |
static struct USBDeviceInfo serial_info = {
|
593 |
608 |
.qdev.name = "QEMU USB Serial",
|
|
609 |
.qdev.alias = "usb-serial",
|
|
610 |
.qdev.size = sizeof(USBSerialState),
|
|
611 |
.init = usb_serial_initfn,
|
|
612 |
.handle_packet = usb_generic_handle_packet,
|
|
613 |
.handle_reset = usb_serial_handle_reset,
|
|
614 |
.handle_control = usb_serial_handle_control,
|
|
615 |
.handle_data = usb_serial_handle_data,
|
|
616 |
.handle_destroy = usb_serial_handle_destroy,
|
|
617 |
.usbdevice_name = "serial",
|
|
618 |
.usbdevice_init = usb_serial_init,
|
|
619 |
.qdev.props = (Property[]) {
|
|
620 |
DEFINE_PROP_CHR("chardev", USBSerialState, cs),
|
|
621 |
DEFINE_PROP_HEX32("vendorid", USBSerialState, vendorid, 0x0403),
|
|
622 |
DEFINE_PROP_HEX32("productid", USBSerialState, productid, 0x6001),
|
|
623 |
DEFINE_PROP_END_OF_LIST(),
|
|
624 |
},
|
|
625 |
};
|
|
626 |
|
|
627 |
static struct USBDeviceInfo braille_info = {
|
|
628 |
.qdev.name = "QEMU USB Braille",
|
|
629 |
.qdev.alias = "usb-braille",
|
594 |
630 |
.qdev.size = sizeof(USBSerialState),
|
595 |
631 |
.init = usb_serial_initfn,
|
596 |
632 |
.handle_packet = usb_generic_handle_packet,
|
... | ... | |
598 |
634 |
.handle_control = usb_serial_handle_control,
|
599 |
635 |
.handle_data = usb_serial_handle_data,
|
600 |
636 |
.handle_destroy = usb_serial_handle_destroy,
|
|
637 |
.usbdevice_name = "braille",
|
|
638 |
.usbdevice_init = usb_braille_init,
|
|
639 |
.qdev.props = (Property[]) {
|
|
640 |
DEFINE_PROP_CHR("chardev", USBSerialState, cs),
|
|
641 |
DEFINE_PROP_HEX32("vendorid", USBSerialState, vendorid, 0x0403),
|
|
642 |
DEFINE_PROP_HEX32("productid", USBSerialState, productid, 0xfe72),
|
|
643 |
DEFINE_PROP_END_OF_LIST(),
|
|
644 |
},
|
601 |
645 |
};
|
602 |
646 |
|
603 |
647 |
static void usb_serial_register_devices(void)
|
604 |
648 |
{
|
605 |
649 |
usb_qdev_register(&serial_info);
|
|
650 |
usb_qdev_register(&braille_info);
|
606 |
651 |
}
|
607 |
652 |
device_init(usb_serial_register_devices)
|