Revision 2b0efdc3 hw/usb-serial.c
b/hw/usb-serial.c | ||
---|---|---|
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) |
Also available in: Unified diff