57
struct usb_ctrlrequest {
65
44
typedef int USBScanFunc(void *opaque, int bus_num, int addr, int class_id,
66
45
int vendor_id, int product_id,
67
46
const char *product_name, int speed);
68
47
static int usb_host_find_device(int *pbus_num, int *paddr,
69
48
char *product_name, int product_name_size,
70
49
const char *devname);
74
#define dprintf printf
79
#define USBDBG_DEVOPENED "husb: opened %s/devices\n"
81
#define USBPROCBUS_PATH "/proc/bus/usb"
55
#define USBDEVFS_PATH "/proc/bus/usb"
82
56
#define PRODUCT_NAME_SZ 32
57
#define SIG_ISOCOMPLETE (SIGRTMIN+7)
83
58
#define MAX_ENDPOINTS 16
84
#define USBDEVBUS_PATH "/dev/bus/usb"
85
#define USBSYSBUS_PATH "/sys/bus/usb"
87
static char *usb_host_device_path;
94
static int usb_fs_type;
60
struct sigaction sigact;
96
62
/* endpoint association data */
110
* Control transfer state.
111
* Note that 'buffer' _must_ follow 'req' field because
112
* we need contigious buffer when we submit control URB.
118
struct usb_ctrlrequest req;
119
uint8_t buffer[1024];
67
/* FIXME: move USBPacket to PendingURB */
122
68
typedef struct USBHostDevice {
132
struct ctrl_struct ctrl;
133
72
struct endp_data endp_table[MAX_ENDPOINTS];
135
/* Host side address */
139
struct USBHostDevice *next;
142
static int is_isoc(USBHostDevice *s, int ep)
144
return s->endp_table[ep - 1].type == USBDEVFS_URB_TYPE_ISO;
147
static int is_halted(USBHostDevice *s, int ep)
149
return s->endp_table[ep - 1].halted;
152
static void clear_halt(USBHostDevice *s, int ep)
154
s->endp_table[ep - 1].halted = 0;
157
static void set_halt(USBHostDevice *s, int ep)
159
s->endp_table[ep - 1].halted = 1;
162
static USBHostDevice *hostdev_list;
164
static void hostdev_link(USBHostDevice *dev)
166
dev->next = hostdev_list;
170
static void hostdev_unlink(USBHostDevice *dev)
172
USBHostDevice *pdev = hostdev_list;
173
USBHostDevice **prev = &hostdev_list;
79
typedef struct PendingURB {
80
struct usbdevfs_urb *urb;
84
struct PendingURB *next;
87
static PendingURB *pending_urbs = NULL;
89
static int add_pending_urb(struct usbdevfs_urb *urb)
91
PendingURB *purb = qemu_mallocz(sizeof(PendingURB));
97
purb->next = pending_urbs;
104
static int del_pending_urb(struct usbdevfs_urb *urb)
106
PendingURB *purb = pending_urbs;
107
PendingURB *prev = NULL;
109
while (purb && purb->urb != urb) {
114
if (purb && purb->urb == urb) {
116
prev->next = purb->next;
118
pending_urbs = purb->next;
186
static USBHostDevice *hostdev_find(int bus_num, int addr)
127
static PendingURB *get_pending_urb(struct usbdevfs_urb *urb)
188
USBHostDevice *s = hostdev_list;
190
if (s->bus_num == bus_num && s->addr == addr)
129
PendingURB *purb = pending_urbs;
131
while (purb && purb->urb != urb) {
135
if (purb && purb->urb == urb) {
199
* We always allocate one isoc descriptor even for bulk transfers
200
* to simplify allocation and casts.
202
typedef struct AsyncURB
204
struct usbdevfs_urb urb;
205
struct usbdevfs_iso_packet_desc isocpd;
211
static AsyncURB *async_alloc(void)
213
return (AsyncURB *) qemu_mallocz(sizeof(AsyncURB));
216
static void async_free(AsyncURB *aurb)
221
static void async_complete_ctrl(USBHostDevice *s, USBPacket *p)
223
switch(s->ctrl.state) {
224
case CTRL_STATE_SETUP:
225
if (p->len < s->ctrl.len)
226
s->ctrl.len = p->len;
227
s->ctrl.state = CTRL_STATE_DATA;
232
s->ctrl.state = CTRL_STATE_IDLE;
241
static void async_complete(void *opaque)
243
USBHostDevice *s = opaque;
249
int r = ioctl(s->fd, USBDEVFS_REAPURBNDELAY, &aurb);
254
if (errno == ENODEV && !s->closing) {
255
printf("husb: device %d.%d disconnected\n", s->bus_num, s->addr);
256
usb_device_del_addr(0, s->dev.addr);
260
dprintf("husb: async. reap urb failed errno %d\n", errno);
266
dprintf("husb: async completed. aurb %p status %d alen %d\n",
267
aurb, aurb->urb.status, aurb->urb.actual_length);
270
switch (aurb->urb.status) {
272
p->len = aurb->urb.actual_length;
273
if (aurb->urb.type == USBDEVFS_URB_TYPE_CONTROL)
274
async_complete_ctrl(s, p);
278
set_halt(s, p->devep);
281
p->len = USB_RET_NAK;
285
usb_packet_complete(p);
292
static void async_cancel(USBPacket *unused, void *opaque)
294
AsyncURB *aurb = opaque;
295
USBHostDevice *s = aurb->hdev;
297
dprintf("husb: async cancel. aurb %p\n", aurb);
299
/* Mark it as dead (see async_complete above) */
302
int r = ioctl(s->fd, USBDEVFS_DISCARDURB, aurb);
304
dprintf("husb: async. discard urb failed errno %d\n", errno);
308
static int usb_host_claim_interfaces(USBHostDevice *dev, int configuration)
142
static int usb_host_update_interfaces(USBHostDevice *dev, int configuration)
310
144
int dev_descr_len, config_descr_len;
311
145
int interface, nb_interfaces, nb_configurations;
370
199
ret = ioctl(dev->fd, USBDEVFS_CLAIMINTERFACE, &interface);
372
201
if (errno == EBUSY) {
373
printf("husb: update iface. device already grabbed\n");
203
"usb_host: warning - device already grabbed\n");
375
perror("husb: failed to claim interface");
205
perror("USBDEVFS_CLAIMINTERFACE");
382
printf("husb: %d interfaces claimed for configuration %d\n",
213
printf("usb_host: %d interfaces claimed for configuration %d\n",
383
214
nb_interfaces, configuration);
385
dev->ninterfaces = nb_interfaces;
386
dev->configuration = configuration;
390
static int usb_host_release_interfaces(USBHostDevice *s)
394
dprintf("husb: releasing interfaces\n");
396
for (i = 0; i < s->ninterfaces; i++) {
397
ret = ioctl(s->fd, USBDEVFS_RELEASEINTERFACE, &i);
399
perror("husb: failed to release interface");
407
220
static void usb_host_handle_reset(USBDevice *dev)
409
USBHostDevice *s = (USBHostDevice *) dev;
411
dprintf("husb: reset device %u.%u\n", s->bus_num, s->addr);
223
USBHostDevice *s = (USBHostDevice *)dev;
224
/* USBDEVFS_RESET, but not the first time as it has already be
225
done by the host OS */
413
226
ioctl(s->fd, USBDEVFS_RESET);
415
usb_host_claim_interfaces(s, s->configuration);
418
230
static void usb_host_handle_destroy(USBDevice *dev)
420
232
USBHostDevice *s = (USBHostDevice *)dev;
424
qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
436
239
static int usb_linux_update_endp_table(USBHostDevice *s);
438
static int usb_host_handle_data(USBHostDevice *s, USBPacket *p)
440
struct usbdevfs_urb *urb;
444
aurb = async_alloc();
446
dprintf("husb: async malloc failed\n");
454
if (p->pid == USB_TOKEN_IN)
455
urb->endpoint = p->devep | 0x80;
457
urb->endpoint = p->devep;
459
if (is_halted(s, p->devep)) {
460
ret = ioctl(s->fd, USBDEVFS_CLEAR_HALT, &urb->endpoint);
462
dprintf("husb: failed to clear halt. ep 0x%x errno %d\n",
463
urb->endpoint, errno);
466
clear_halt(s, p->devep);
469
urb->buffer = p->data;
241
static int usb_host_handle_control(USBDevice *dev,
248
USBHostDevice *s = (USBHostDevice *)dev;
249
struct usb_ctrltransfer ct;
250
struct usbdevfs_setinterface si;
251
int intf_update_required = 0;
254
if (request == (DeviceOutRequest | USB_REQ_SET_ADDRESS)) {
255
/* specific SET_ADDRESS support */
258
} else if (request == ((USB_RECIP_INTERFACE << 8) |
259
USB_REQ_SET_INTERFACE)) {
260
/* set alternate setting for the interface */
261
si.interface = index;
262
si.altsetting = value;
263
ret = ioctl(s->fd, USBDEVFS_SETINTERFACE, &si);
264
usb_linux_update_endp_table(s);
265
} else if (request == (DeviceOutRequest | USB_REQ_SET_CONFIGURATION)) {
267
printf("usb_host_handle_control: SET_CONFIGURATION request - "
268
"config %d\n", value & 0xff);
270
if (s->configuration != (value & 0xff)) {
271
s->configuration = (value & 0xff);
272
intf_update_required = 1;
277
ct.bRequestType = request >> 8;
278
ct.bRequest = request;
284
ret = ioctl(s->fd, USBDEVFS_CONTROL, &ct);
292
return USB_RET_STALL;
295
if (intf_update_required) {
297
printf("usb_host_handle_control: updating interfaces\n");
299
usb_host_update_interfaces(s, value & 0xff);
305
static int usb_host_handle_isoch(USBDevice *dev, USBPacket *p);
307
static int usb_host_handle_data(USBDevice *dev, USBPacket *p)
309
USBHostDevice *s = (USBHostDevice *)dev;
310
struct usbdevfs_bulktransfer bt;
312
uint8_t devep = p->devep;
314
if (s->endp_table[p->devep - 1].type == USBDEVFS_URB_TYPE_ISO) {
315
return usb_host_handle_isoch(dev, p);
318
/* XXX: optimize and handle all data types by looking at the
320
if (p->pid == USB_TOKEN_IN)
326
ret = ioctl(s->fd, USBDEVFS_BULK, &bt);
334
printf("handle_data: errno=%d\n", errno);
336
return USB_RET_STALL;
344
static void usb_linux_bh_cb(void *opaque)
346
PendingURB *pending_urb = (PendingURB *)opaque;
347
USBHostDevice *s = pending_urb->dev;
348
struct usbdevfs_urb *purb = NULL;
349
USBPacket *p = s->packet;
352
/* FIXME: handle purb->status */
353
qemu_free(pending_urb->bh);
354
del_pending_urb(pending_urb->urb);
361
ret = ioctl(s->fd, USBDEVFS_REAPURBNDELAY, &purb);
363
printf("usb_linux_bh_cb: REAPURBNDELAY ioctl=%d errno=%d\n",
369
if (purb == pending_urb->urb) {
370
printf("usb_linux_bh_cb: urb mismatch reaped=%p pending=%p\n",
375
p->len = purb->actual_length;
376
usb_packet_complete(p);
381
static void isoch_done(int signum, siginfo_t *info, void *context)
383
struct usbdevfs_urb *urb = (struct usbdevfs_urb *)info->si_addr;
384
USBHostDevice *s = (USBHostDevice *)urb->usercontext;
387
if (info->si_code != SI_ASYNCIO ||
388
info->si_signo != SIG_ISOCOMPLETE) {
392
purb = get_pending_urb(urb);
394
purb->bh = qemu_bh_new(usb_linux_bh_cb, purb);
397
purb->status = info->si_errno;
398
qemu_bh_schedule(purb->bh);
404
static int usb_host_handle_isoch(USBDevice *dev, USBPacket *p)
406
USBHostDevice *s = (USBHostDevice *)dev;
407
struct usbdevfs_urb *urb, *purb = NULL;
409
uint8_t devep = p->devep;
411
if (p->pid == USB_TOKEN_IN)
414
urb = qemu_mallocz(sizeof(struct usbdevfs_urb) +
415
sizeof(struct usbdevfs_iso_packet_desc));
417
printf("usb_host_handle_isoch: malloc failed\n");
421
urb->type = USBDEVFS_URB_TYPE_ISO;
422
urb->endpoint = devep;
424
urb->flags = USBDEVFS_URB_ISO_ASAP;
425
urb->buffer = p->data;
470
426
urb->buffer_length = p->len;
472
if (is_isoc(s, p->devep)) {
473
/* Setup ISOC transfer */
474
urb->type = USBDEVFS_URB_TYPE_ISO;
475
urb->flags = USBDEVFS_URB_ISO_ASAP;
476
urb->number_of_packets = 1;
477
urb->iso_frame_desc[0].length = p->len;
479
/* Setup bulk transfer */
480
urb->type = USBDEVFS_URB_TYPE_BULK;
483
urb->usercontext = s;
485
ret = ioctl(s->fd, USBDEVFS_SUBMITURB, urb);
487
dprintf("husb: data submit. ep 0x%x len %u aurb %p\n", urb->endpoint, p->len, aurb);
490
dprintf("husb: submit failed. errno %d\n", errno);
498
return USB_RET_STALL;
502
usb_defer_packet(p, async_cancel, aurb);
503
return USB_RET_ASYNC;
506
static int ctrl_error(void)
508
if (errno == ETIMEDOUT)
511
return USB_RET_STALL;
514
static int usb_host_set_address(USBHostDevice *s, int addr)
516
dprintf("husb: ctrl set addr %u\n", addr);
521
static int usb_host_set_config(USBHostDevice *s, int config)
523
usb_host_release_interfaces(s);
525
int ret = ioctl(s->fd, USBDEVFS_SETCONFIGURATION, &config);
527
dprintf("husb: ctrl set config %d ret %d errno %d\n", config, ret, errno);
532
usb_host_claim_interfaces(s, config);
536
static int usb_host_set_interface(USBHostDevice *s, int iface, int alt)
538
struct usbdevfs_setinterface si;
541
si.interface = iface;
543
ret = ioctl(s->fd, USBDEVFS_SETINTERFACE, &si);
545
dprintf("husb: ctrl set iface %d altset %d ret %d errno %d\n",
546
iface, alt, ret, errno);
551
usb_linux_update_endp_table(s);
555
static int usb_host_handle_control(USBHostDevice *s, USBPacket *p)
557
struct usbdevfs_urb *urb;
559
int ret, value, index;
562
* Process certain standard device requests.
563
* These are infrequent and are processed synchronously.
565
value = le16_to_cpu(s->ctrl.req.wValue);
566
index = le16_to_cpu(s->ctrl.req.wIndex);
568
dprintf("husb: ctrl type 0x%x req 0x%x val 0x%x index %u len %u\n",
569
s->ctrl.req.bRequestType, s->ctrl.req.bRequest, value, index,
572
if (s->ctrl.req.bRequestType == 0) {
573
switch (s->ctrl.req.bRequest) {
574
case USB_REQ_SET_ADDRESS:
575
return usb_host_set_address(s, value);
577
case USB_REQ_SET_CONFIGURATION:
578
return usb_host_set_config(s, value & 0xff);
582
if (s->ctrl.req.bRequestType == 1 &&
583
s->ctrl.req.bRequest == USB_REQ_SET_INTERFACE)
584
return usb_host_set_interface(s, index, value);
586
/* The rest are asynchronous */
588
aurb = async_alloc();
590
dprintf("husb: async malloc failed\n");
597
* Setup ctrl transfer.
599
* s->ctrl is layed out such that data buffer immediately follows
600
* 'req' struct which is exactly what usbdevfs expects.
604
urb->type = USBDEVFS_URB_TYPE_CONTROL;
605
urb->endpoint = p->devep;
607
urb->buffer = &s->ctrl.req;
608
urb->buffer_length = 8 + s->ctrl.len;
610
urb->usercontext = s;
612
ret = ioctl(s->fd, USBDEVFS_SUBMITURB, urb);
614
dprintf("husb: submit ctrl. len %u aurb %p\n", urb->buffer_length, aurb);
617
dprintf("husb: submit failed. errno %d\n", errno);
625
return USB_RET_STALL;
629
usb_defer_packet(p, async_cancel, aurb);
630
return USB_RET_ASYNC;
633
static int do_token_setup(USBDevice *dev, USBPacket *p)
635
USBHostDevice *s = (USBHostDevice *) dev;
639
return USB_RET_STALL;
641
memcpy(&s->ctrl.req, p->data, 8);
642
s->ctrl.len = le16_to_cpu(s->ctrl.req.wLength);
644
s->ctrl.state = CTRL_STATE_SETUP;
646
if (s->ctrl.req.bRequestType & USB_DIR_IN) {
647
ret = usb_host_handle_control(s, p);
651
if (ret < s->ctrl.len)
653
s->ctrl.state = CTRL_STATE_DATA;
655
if (s->ctrl.len == 0)
656
s->ctrl.state = CTRL_STATE_ACK;
658
s->ctrl.state = CTRL_STATE_DATA;
427
urb->actual_length = 0;
428
urb->start_frame = 0;
429
urb->error_count = 0;
431
urb->signr = SIG_ISOCOMPLETE;
435
urb->usercontext = s;
436
urb->number_of_packets = 1;
437
urb->iso_frame_desc[0].length = p->len;
438
urb->iso_frame_desc[0].actual_length = 0;
439
urb->iso_frame_desc[0].status = 0;
440
ret = ioctl(s->fd, USBDEVFS_SUBMITURB, urb);
442
if (!add_pending_urb(urb)) {
443
printf("usb_host_handle_isoch: add_pending_urb failed %p\n", urb);
446
printf("usb_host_handle_isoch: SUBMITURB ioctl=%d errno=%d\n",
454
return USB_RET_STALL;
458
/* FIXME: handle urbs_ready together with sync io
459
* workaround for injecting the signaled urbs into current frame */
460
if (s->urbs_ready > 0) {
461
ret = ioctl(s->fd, USBDEVFS_REAPURBNDELAY, &purb);
463
ret = purb->actual_length;
470
return USB_RET_ASYNC;
472
ret = ioctl(s->fd, USBDEVFS_REAPURBNDELAY, &purb);
474
if (del_pending_urb(purb)) {
475
ret = purb->actual_length;
478
printf("usb_host_handle_isoch: del_pending_urb failed %p\n", purb);
482
printf("usb_host_handle_isoch: REAPURBNDELAY ioctl=%d errno=%d\n",
664
static int do_token_in(USBDevice *dev, USBPacket *p)
666
USBHostDevice *s = (USBHostDevice *) dev;
670
return usb_host_handle_data(s, p);
672
switch(s->ctrl.state) {
674
if (!(s->ctrl.req.bRequestType & USB_DIR_IN)) {
675
ret = usb_host_handle_control(s, p);
676
if (ret == USB_RET_ASYNC)
677
return USB_RET_ASYNC;
679
s->ctrl.state = CTRL_STATE_IDLE;
680
return ret > 0 ? 0 : ret;
685
case CTRL_STATE_DATA:
686
if (s->ctrl.req.bRequestType & USB_DIR_IN) {
687
int len = s->ctrl.len - s->ctrl.offset;
690
memcpy(p->data, s->ctrl.buffer + s->ctrl.offset, len);
691
s->ctrl.offset += len;
692
if (s->ctrl.offset >= s->ctrl.len)
693
s->ctrl.state = CTRL_STATE_ACK;
697
s->ctrl.state = CTRL_STATE_IDLE;
698
return USB_RET_STALL;
701
return USB_RET_STALL;
705
static int do_token_out(USBDevice *dev, USBPacket *p)
707
USBHostDevice *s = (USBHostDevice *) dev;
710
return usb_host_handle_data(s, p);
712
switch(s->ctrl.state) {
714
if (s->ctrl.req.bRequestType & USB_DIR_IN) {
715
s->ctrl.state = CTRL_STATE_IDLE;
718
/* ignore additional output */
722
case CTRL_STATE_DATA:
723
if (!(s->ctrl.req.bRequestType & USB_DIR_IN)) {
724
int len = s->ctrl.len - s->ctrl.offset;
727
memcpy(s->ctrl.buffer + s->ctrl.offset, p->data, len);
728
s->ctrl.offset += len;
729
if (s->ctrl.offset >= s->ctrl.len)
730
s->ctrl.state = CTRL_STATE_ACK;
734
s->ctrl.state = CTRL_STATE_IDLE;
735
return USB_RET_STALL;
738
return USB_RET_STALL;
744
* Called by the HC (host controller).
746
* Returns length of the transaction or one of the USB_RET_XXX codes.
748
static int usb_host_handle_packet(USBDevice *s, USBPacket *p)
752
s->state = USB_STATE_ATTACHED;
756
s->state = USB_STATE_NOTATTACHED;
760
s->remote_wakeup = 0;
762
s->state = USB_STATE_DEFAULT;
767
/* Rest of the PIDs must match our address */
768
if (s->state < USB_STATE_DEFAULT || p->devaddr != s->addr)
769
return USB_RET_NODEV;
772
case USB_TOKEN_SETUP:
773
return do_token_setup(s, p);
776
return do_token_in(s, p);
779
return do_token_out(s, p);
782
return USB_RET_STALL;
786
490
/* returns 1 on problem encountered or 0 for success */
964
666
dev->dev.speed = USB_SPEED_LOW;
966
668
dev->dev.speed = USB_SPEED_HIGH;
669
dev->dev.handle_packet = usb_generic_handle_packet;
968
dev->dev.handle_packet = usb_host_handle_packet;
969
dev->dev.handle_reset = usb_host_handle_reset;
671
dev->dev.handle_reset = usb_host_handle_reset;
672
dev->dev.handle_control = usb_host_handle_control;
673
dev->dev.handle_data = usb_host_handle_data;
970
674
dev->dev.handle_destroy = usb_host_handle_destroy;
972
if (!prod_name || prod_name[0] == '\0')
676
if (product_name[0] == '\0')
973
677
snprintf(dev->dev.devname, sizeof(dev->dev.devname),
974
"host:%d.%d", bus_num, addr);
976
680
pstrcpy(dev->dev.devname, sizeof(dev->dev.devname),
979
/* USB devio uses 'write' flag to check for async completions */
980
qemu_set_fd_handler(dev->fd, NULL, async_complete, dev);
984
return (USBDevice *) dev;
684
/* set up the signal handlers */
685
sigemptyset(&sigact.sa_mask);
686
sigact.sa_sigaction = isoch_done;
687
sigact.sa_flags = SA_SIGINFO;
688
sigact.sa_restorer = 0;
689
ret = sigaction(SIG_ISOCOMPLETE, &sigact, NULL);
691
printf("sigaction SIG_ISOCOMPLETE=%d errno=%d\n", ret, errno);
695
return (USBDevice *)dev;
994
static int usb_host_auto_add(const char *spec);
995
static int usb_host_auto_del(const char *spec);
997
USBDevice *usb_host_device_open(const char *devname)
1000
char product_name[PRODUCT_NAME_SZ];
1002
if (strstr(devname, "auto:")) {
1003
usb_host_auto_add(devname);
1007
if (usb_host_find_device(&bus_num, &addr, product_name, sizeof(product_name),
1011
if (hostdev_find(bus_num, addr)) {
1012
term_printf("husb: host usb device %d.%d is already open\n", bus_num, addr);
1016
return usb_host_device_open_addr(bus_num, addr, product_name);
1019
int usb_host_device_close(const char *devname)
1021
char product_name[PRODUCT_NAME_SZ];
1025
if (strstr(devname, "auto:"))
1026
return usb_host_auto_del(devname);
1028
if (usb_host_find_device(&bus_num, &addr, product_name, sizeof(product_name),
1032
s = hostdev_find(bus_num, addr);
1034
usb_device_del_addr(0, s->dev.addr);
1041
703
static int get_tag_value(char *buf, int buf_size,
1042
704
const char *str, const char *tag,
1043
705
const char *stopchars)
1143
795
product_id, product_name, speed);
1152
* Read sys file-system device file
1154
* @line address of buffer to put file contents in
1155
* @line_size size of line
1156
* @device_file path to device file (printf format string)
1157
* @device_name device being opened (inserted into device_file)
1159
* @return 0 failed, 1 succeeded ('line' contains data)
1161
static int usb_host_read_file(char *line, size_t line_size, const char *device_file, const char *device_name)
1165
char filename[PATH_MAX];
1167
snprintf(filename, PATH_MAX, device_file, device_name);
1168
f = fopen(filename, "r");
1170
fgets(line, line_size, f);
1174
term_printf("husb: could not open %s\n", filename);
1181
* Use /sys/bus/usb/devices/ directory to determine host's USB
1184
* This code is based on Robert Schiele's original patches posted to
1185
* the Novell bug-tracker https://bugzilla.novell.com/show_bug.cgi?id=241950
1187
static int usb_host_scan_sys(void *opaque, USBScanFunc *func)
1191
int bus_num, addr, speed, class_id, product_id, vendor_id;
1193
char product_name[512];
1196
dir = opendir(USBSYSBUS_PATH "/devices");
1198
perror("husb: cannot open devices directory");
1202
while ((de = readdir(dir))) {
1203
if (de->d_name[0] != '.' && !strchr(de->d_name, ':')) {
1204
char *tmpstr = de->d_name;
1205
if (!strncmp(de->d_name, "usb", 3))
1207
bus_num = atoi(tmpstr);
1209
if (!usb_host_read_file(line, sizeof(line), USBSYSBUS_PATH "/devices/%s/devnum", de->d_name))
1211
if (sscanf(line, "%d", &addr) != 1)
1214
if (!usb_host_read_file(line, sizeof(line), USBSYSBUS_PATH "/devices/%s/bDeviceClass", de->d_name))
1216
if (sscanf(line, "%x", &class_id) != 1)
1219
if (!usb_host_read_file(line, sizeof(line), USBSYSBUS_PATH "/devices/%s/idVendor", de->d_name))
1221
if (sscanf(line, "%x", &vendor_id) != 1)
1224
if (!usb_host_read_file(line, sizeof(line), USBSYSBUS_PATH "/devices/%s/idProduct", de->d_name))
1226
if (sscanf(line, "%x", &product_id) != 1)
1229
if (!usb_host_read_file(line, sizeof(line), USBSYSBUS_PATH "/devices/%s/product", de->d_name)) {
1232
if (strlen(line) > 0)
1233
line[strlen(line) - 1] = '\0';
1234
pstrcpy(product_name, sizeof(product_name), line);
1237
if (!usb_host_read_file(line, sizeof(line), USBSYSBUS_PATH "/devices/%s/speed", de->d_name))
1239
if (!strcmp(line, "480\n"))
1240
speed = USB_SPEED_HIGH;
1241
else if (!strcmp(line, "1.5\n"))
1242
speed = USB_SPEED_LOW;
1244
speed = USB_SPEED_FULL;
1246
ret = func(opaque, bus_num, addr, class_id, vendor_id,
1247
product_id, product_name, speed);
1259
* Determine how to access the host's USB devices and call the
1260
* specific support function.
1262
static int usb_host_scan(void *opaque, USBScanFunc *func)
1267
const char *fs_type[] = {"unknown", "proc", "dev", "sys"};
1268
char devpath[PATH_MAX];
1270
/* only check the host once */
1272
f = fopen(USBPROCBUS_PATH "/devices", "r");
1274
/* devices found in /proc/bus/usb/ */
1275
strcpy(devpath, USBPROCBUS_PATH);
1276
usb_fs_type = USB_FS_PROC;
1278
dprintf(USBDBG_DEVOPENED, USBPROCBUS_PATH);
1281
/* try additional methods if an access method hasn't been found yet */
1282
f = fopen(USBDEVBUS_PATH "/devices", "r");
1284
/* devices found in /dev/bus/usb/ */
1285
strcpy(devpath, USBDEVBUS_PATH);
1286
usb_fs_type = USB_FS_DEV;
1288
dprintf(USBDBG_DEVOPENED, USBDEVBUS_PATH);
1291
dir = opendir(USBSYSBUS_PATH "/devices");
1293
/* devices found in /dev/bus/usb/ (yes - not a mistake!) */
1294
strcpy(devpath, USBDEVBUS_PATH);
1295
usb_fs_type = USB_FS_SYS;
1297
dprintf(USBDBG_DEVOPENED, USBSYSBUS_PATH);
1302
term_printf("husb: unable to access USB devices\n");
1306
/* the module setting (used later for opening devices) */
1307
usb_host_device_path = qemu_mallocz(strlen(devpath)+1);
1308
if (usb_host_device_path) {
1309
strcpy(usb_host_device_path, devpath);
1310
term_printf("husb: using %s file-system with %s\n", fs_type[usb_fs_type], usb_host_device_path);
1312
/* out of memory? */
1313
perror("husb: unable to allocate memory for device path");
1318
switch (usb_fs_type) {
1321
ret = usb_host_scan_dev(opaque, func);
1324
ret = usb_host_scan_sys(opaque, func);
1333
struct USBAutoFilter {
1334
struct USBAutoFilter *next;
1341
static QEMUTimer *usb_auto_timer;
1342
static struct USBAutoFilter *usb_auto_filter;
1344
static int usb_host_auto_scan(void *opaque, int bus_num, int addr,
1345
int class_id, int vendor_id, int product_id,
1346
const char *product_name, int speed)
1348
struct USBAutoFilter *f;
1349
struct USBDevice *dev;
1355
for (f = usb_auto_filter; f; f = f->next) {
1356
if (f->bus_num >= 0 && f->bus_num != bus_num)
1359
if (f->addr >= 0 && f->addr != addr)
1362
if (f->vendor_id >= 0 && f->vendor_id != vendor_id)
1365
if (f->product_id >= 0 && f->product_id != product_id)
1368
/* We got a match */
1370
/* Allredy attached ? */
1371
if (hostdev_find(bus_num, addr))
1374
dprintf("husb: auto open: bus_num %d addr %d\n", bus_num, addr);
1376
dev = usb_host_device_open_addr(bus_num, addr, product_name);
1378
usb_device_add_dev(dev);
1384
static void usb_host_auto_timer(void *unused)
1386
usb_host_scan(NULL, usb_host_auto_scan);
1387
qemu_mod_timer(usb_auto_timer, qemu_get_clock(rt_clock) + 2000);
1391
* Autoconnect filter
1393
* auto:bus:dev[:vid:pid]
1394
* auto:bus.dev[:vid:pid]
1396
* bus - bus number (dec, * means any)
1397
* dev - device number (dec, * means any)
1398
* vid - vendor id (hex, * means any)
1399
* pid - product id (hex, * means any)
1401
* See 'lsusb' output.
1403
static int parse_filter(const char *spec, struct USBAutoFilter *f)
1405
enum { BUS, DEV, VID, PID, DONE };
1406
const char *p = spec;
1414
for (i = BUS; i < DONE; i++) {
1415
p = strpbrk(p, ":.");
1423
case BUS: f->bus_num = strtol(p, NULL, 10); break;
1424
case DEV: f->addr = strtol(p, NULL, 10); break;
1425
case VID: f->vendor_id = strtol(p, NULL, 16); break;
1426
case PID: f->product_id = strtol(p, NULL, 16); break;
1431
fprintf(stderr, "husb: invalid auto filter spec %s\n", spec);
1438
static int match_filter(const struct USBAutoFilter *f1,
1439
const struct USBAutoFilter *f2)
1441
return f1->bus_num == f2->bus_num &&
1442
f1->addr == f2->addr &&
1443
f1->vendor_id == f2->vendor_id &&
1444
f1->product_id == f2->product_id;
1447
static int usb_host_auto_add(const char *spec)
1449
struct USBAutoFilter filter, *f;
1451
if (parse_filter(spec, &filter) < 0)
1454
f = qemu_mallocz(sizeof(*f));
1456
fprintf(stderr, "husb: failed to allocate auto filter\n");
1462
if (!usb_auto_filter) {
1464
* First entry. Init and start the monitor.
1465
* Right now we're using timer to check for new devices.
1466
* If this turns out to be too expensive we can move that into a
1469
usb_auto_timer = qemu_new_timer(rt_clock, usb_host_auto_timer, NULL);
1470
if (!usb_auto_timer) {
1471
fprintf(stderr, "husb: failed to allocate auto scan timer\n");
1476
/* Check for new devices every two seconds */
1477
qemu_mod_timer(usb_auto_timer, qemu_get_clock(rt_clock) + 2000);
1480
dprintf("husb: added auto filter: bus_num %d addr %d vid %d pid %d\n",
1481
f->bus_num, f->addr, f->vendor_id, f->product_id);
1483
f->next = usb_auto_filter;
1484
usb_auto_filter = f;
1489
static int usb_host_auto_del(const char *spec)
1491
struct USBAutoFilter *pf = usb_auto_filter;
1492
struct USBAutoFilter **prev = &usb_auto_filter;
1493
struct USBAutoFilter filter;
1495
if (parse_filter(spec, &filter) < 0)
1499
if (match_filter(pf, &filter)) {
1500
dprintf("husb: removed auto filter: bus_num %d addr %d vid %d pid %d\n",
1501
pf->bus_num, pf->addr, pf->vendor_id, pf->product_id);
1505
if (!usb_auto_filter) {
1506
/* No more filters. Stop scanning. */
1507
qemu_del_timer(usb_auto_timer);
1508
qemu_free_timer(usb_auto_timer);
1521
802
typedef struct FindDeviceState {