Revision 1f6e24e7
b/hw/usb-hid.c | ||
---|---|---|
521 | 521 |
s->dev.handle_data = usb_mouse_handle_data; |
522 | 522 |
s->kind = USB_TABLET; |
523 | 523 |
|
524 |
pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Tablet"); |
|
525 |
|
|
524 | 526 |
return (USBDevice *)s; |
525 | 527 |
} |
526 | 528 |
|
... | ... | |
539 | 541 |
s->dev.handle_data = usb_mouse_handle_data; |
540 | 542 |
s->kind = USB_MOUSE; |
541 | 543 |
|
544 |
pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Mouse"); |
|
545 |
|
|
542 | 546 |
return (USBDevice *)s; |
543 | 547 |
} |
b/hw/usb-hub.c | ||
---|---|---|
544 | 544 |
s->dev.handle_control = usb_hub_handle_control; |
545 | 545 |
s->dev.handle_data = usb_hub_handle_data; |
546 | 546 |
|
547 |
pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Hub"); |
|
548 |
|
|
547 | 549 |
s->nb_ports = nb_ports; |
548 | 550 |
for(i = 0; i < s->nb_ports; i++) { |
549 | 551 |
port = &s->ports[i]; |
b/hw/usb-msd.c | ||
---|---|---|
389 | 389 |
s->dev.handle_control = usb_msd_handle_control; |
390 | 390 |
s->dev.handle_data = usb_msd_handle_data; |
391 | 391 |
|
392 |
snprintf(s->dev.devname, sizeof(s->dev.devname), "QEMU USB MSD(%.16s)", |
|
393 |
filename); |
|
394 |
|
|
392 | 395 |
s->scsi_dev = scsi_disk_init(bdrv, usb_msd_command_complete, s); |
393 | 396 |
usb_msd_handle_reset((USBDevice *)s, 0); |
394 | 397 |
return (USBDevice *)s; |
b/hw/usb.h | ||
---|---|---|
128 | 128 |
int (*handle_data)(USBDevice *dev, int pid, uint8_t devep, |
129 | 129 |
uint8_t *data, int len); |
130 | 130 |
uint8_t addr; |
131 |
char devname[32]; |
|
131 | 132 |
|
132 | 133 |
int state; |
133 | 134 |
uint8_t setup_buf[8]; |
b/usb-linux.c | ||
---|---|---|
44 | 44 |
int vendor_id, int product_id, |
45 | 45 |
const char *product_name, int speed); |
46 | 46 |
static int usb_host_find_device(int *pbus_num, int *paddr, |
47 |
char *product_name, int product_name_size, |
|
47 | 48 |
const char *devname); |
48 | 49 |
|
49 | 50 |
//#define DEBUG |
50 | 51 |
|
51 | 52 |
#define USBDEVFS_PATH "/proc/bus/usb" |
53 |
#define PRODUCT_NAME_SZ 32 |
|
52 | 54 |
|
53 | 55 |
typedef struct USBHostDevice { |
54 | 56 |
USBDevice dev; |
... | ... | |
145 | 147 |
char buf[1024]; |
146 | 148 |
int descr_len, dev_descr_len, config_descr_len, nb_interfaces; |
147 | 149 |
int bus_num, addr; |
150 |
char product_name[PRODUCT_NAME_SZ]; |
|
148 | 151 |
|
149 |
if (usb_host_find_device(&bus_num, &addr, devname) < 0) |
|
152 |
if (usb_host_find_device(&bus_num, &addr, |
|
153 |
product_name, sizeof(product_name), |
|
154 |
devname) < 0) |
|
150 | 155 |
return NULL; |
151 | 156 |
|
152 | 157 |
snprintf(buf, sizeof(buf), USBDEVFS_PATH "/%03d/%03d", |
... | ... | |
230 | 235 |
dev->dev.handle_reset = usb_host_handle_reset; |
231 | 236 |
dev->dev.handle_control = usb_host_handle_control; |
232 | 237 |
dev->dev.handle_data = usb_host_handle_data; |
238 |
|
|
239 |
if (product_name[0] == '\0') |
|
240 |
snprintf(dev->dev.devname, sizeof(dev->dev.devname), |
|
241 |
"host:%s", devname); |
|
242 |
else |
|
243 |
pstrcpy(dev->dev.devname, sizeof(dev->dev.devname), |
|
244 |
product_name); |
|
245 |
|
|
233 | 246 |
return (USBDevice *)dev; |
234 | 247 |
} |
235 | 248 |
|
... | ... | |
337 | 350 |
int product_id; |
338 | 351 |
int bus_num; |
339 | 352 |
int addr; |
353 |
char product_name[PRODUCT_NAME_SZ]; |
|
340 | 354 |
} FindDeviceState; |
341 | 355 |
|
342 | 356 |
static int usb_host_find_device_scan(void *opaque, int bus_num, int addr, |
... | ... | |
345 | 359 |
const char *product_name, int speed) |
346 | 360 |
{ |
347 | 361 |
FindDeviceState *s = opaque; |
348 |
if (vendor_id == s->vendor_id && |
|
349 |
product_id == s->product_id) { |
|
362 |
if ((vendor_id == s->vendor_id && |
|
363 |
product_id == s->product_id) || |
|
364 |
(bus_num == s->bus_num && |
|
365 |
addr == s->addr)) { |
|
366 |
pstrcpy(s->product_name, PRODUCT_NAME_SZ, product_name); |
|
350 | 367 |
s->bus_num = bus_num; |
351 | 368 |
s->addr = addr; |
352 | 369 |
return 1; |
... | ... | |
359 | 376 |
'bus.addr' (decimal numbers) or |
360 | 377 |
'vendor_id:product_id' (hexa numbers) */ |
361 | 378 |
static int usb_host_find_device(int *pbus_num, int *paddr, |
379 |
char *product_name, int product_name_size, |
|
362 | 380 |
const char *devname) |
363 | 381 |
{ |
364 | 382 |
const char *p; |
... | ... | |
369 | 387 |
if (p) { |
370 | 388 |
*pbus_num = strtoul(devname, NULL, 0); |
371 | 389 |
*paddr = strtoul(p + 1, NULL, 0); |
390 |
fs.bus_num = *pbus_num; |
|
391 |
fs.addr = *paddr; |
|
392 |
ret = usb_host_scan(&fs, usb_host_find_device_scan); |
|
393 |
if (ret) |
|
394 |
pstrcpy(product_name, product_name_size, fs.product_name); |
|
372 | 395 |
return 0; |
373 | 396 |
} |
374 | 397 |
p = strchr(devname, ':'); |
... | ... | |
379 | 402 |
if (ret) { |
380 | 403 |
*pbus_num = fs.bus_num; |
381 | 404 |
*paddr = fs.addr; |
405 |
pstrcpy(product_name, product_name_size, fs.product_name); |
|
382 | 406 |
return 0; |
383 | 407 |
} |
384 | 408 |
} |
b/vl.c | ||
---|---|---|
3785 | 3785 |
speed_str = "?"; |
3786 | 3786 |
break; |
3787 | 3787 |
} |
3788 |
term_printf(" Device %d.%d, speed %s Mb/s\n",
|
|
3789 |
0, dev->addr, speed_str); |
|
3788 |
term_printf(" Device %d.%d, Speed %s Mb/s, Product %s\n",
|
|
3789 |
0, dev->addr, speed_str, dev->devname);
|
|
3790 | 3790 |
} |
3791 | 3791 |
} |
3792 | 3792 |
|
Also available in: Unified diff