131
130
static QTAILQ_HEAD(, USBHostDevice) hostdevs = QTAILQ_HEAD_INITIALIZER(hostdevs);
133
132
static int usb_host_close(USBHostDevice *dev);
134
static int parse_filter(const char *spec, struct USBAutoFilter *f);
135
133
static void usb_host_auto_check(void *unused);
136
134
static int usb_host_read_file(char *line, size_t line_size,
137
135
const char *device_file, const char *device_name);
1537
1535
static const TypeInfo usb_host_dev_info = {
1539
1537
.parent = TYPE_USB_DEVICE,
1540
1538
.instance_size = sizeof(USBHostDevice),
1541
1539
.class_init = usb_host_class_initfn,
1544
1542
static void usb_host_register_types(void)
1546
1544
type_register_static(&usb_host_dev_info);
1547
usb_legacy_register("usb-host", "host", usb_host_device_open);
1550
1547
type_init(usb_host_register_types)
1552
USBDevice *usb_host_device_open(USBBus *bus, const char *devname)
1554
struct USBAutoFilter filter;
1558
dev = usb_create(bus, "usb-host");
1560
if (strstr(devname, "auto:")) {
1561
if (parse_filter(devname, &filter) < 0) {
1565
if ((p = strchr(devname, '.'))) {
1566
filter.bus_num = strtoul(devname, NULL, 0);
1567
filter.addr = strtoul(p + 1, NULL, 0);
1568
filter.vendor_id = 0;
1569
filter.product_id = 0;
1570
} else if ((p = strchr(devname, ':'))) {
1573
filter.vendor_id = strtoul(devname, NULL, 16);
1574
filter.product_id = strtoul(p + 1, NULL, 16);
1580
qdev_prop_set_uint32(&dev->qdev, "hostbus", filter.bus_num);
1581
qdev_prop_set_uint32(&dev->qdev, "hostaddr", filter.addr);
1582
qdev_prop_set_uint32(&dev->qdev, "vendorid", filter.vendor_id);
1583
qdev_prop_set_uint32(&dev->qdev, "productid", filter.product_id);
1584
qdev_init_nofail(&dev->qdev);
1588
qdev_free(&dev->qdev);
1592
int usb_host_device_close(const char *devname)
1595
char product_name[PRODUCT_NAME_SZ];
1599
if (strstr(devname, "auto:")) {
1600
return usb_host_auto_del(devname);
1602
if (usb_host_find_device(&bus_num, &addr, product_name,
1603
sizeof(product_name), devname) < 0) {
1606
s = hostdev_find(bus_num, addr);
1608
usb_device_delete_addr(s->bus_num, s->dev.addr);
1617
1550
* Read sys file-system device file
1840
1773
qemu_mod_timer(usb_auto_timer, qemu_get_clock_ms(rt_clock) + 2000);
1844
* Autoconnect filter
1846
* auto:bus:dev[:vid:pid]
1847
* auto:bus.dev[:vid:pid]
1849
* bus - bus number (dec, * means any)
1850
* dev - device number (dec, * means any)
1851
* vid - vendor id (hex, * means any)
1852
* pid - product id (hex, * means any)
1854
* See 'lsusb' output.
1856
static int parse_filter(const char *spec, struct USBAutoFilter *f)
1858
enum { BUS, DEV, VID, PID, DONE };
1859
const char *p = spec;
1867
for (i = BUS; i < DONE; i++) {
1868
p = strpbrk(p, ":.");
1878
case BUS: f->bus_num = strtol(p, NULL, 10); break;
1879
case DEV: f->addr = strtol(p, NULL, 10); break;
1880
case VID: f->vendor_id = strtol(p, NULL, 16); break;
1881
case PID: f->product_id = strtol(p, NULL, 16); break;
1886
fprintf(stderr, "husb: invalid auto filter spec %s\n", spec);
1776
#ifndef CONFIG_USB_LIBUSB
1893
1778
/**********************/
1894
1779
/* USB host device info */