diff --git a/tools/lib/Makefile b/tools/lib/Makefile index d3cea06..3e77ca7 100644 --- a/tools/lib/Makefile +++ b/tools/lib/Makefile @@ -15,9 +15,7 @@ LIB = libatrf.a include ../Makefile.common -CFLAGS += -Wall -I$(F32XBASE)/include - -OBJS_host = atusb.o $(F32XBASE)/lib/usb.o +OBJS_host = atusb.o usbopen.o OBJS_ben_jlime = atben.o OBJS_ben_openwrt = atben.o diff --git a/tools/lib/atusb.c b/tools/lib/atusb.c index 2e06ae3..5f7dc49 100644 --- a/tools/lib/atusb.c +++ b/tools/lib/atusb.c @@ -14,10 +14,10 @@ #include #include -#include "f32xbase/usb.h" #include "atusb/ep0.h" #include "atusb/usb-ids.h" +#include "usbopen.h" #include "driver.h" diff --git a/tools/lib/usbopen.c b/tools/lib/usbopen.c new file mode 100644 index 0000000..8561ebf --- /dev/null +++ b/tools/lib/usbopen.c @@ -0,0 +1,101 @@ +/* + * lib/usbopen.c - Common USB device lookup and open code + * + * Written 2008-2010 by Werner Almesberger + * Copyright 2008-2010 Werner Almesberger + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + + + +#include +#include +#include +#include + +#include "usbopen.h" + + +static uint16_t vendor = 0; +static uint16_t product = 0; + + +usb_dev_handle *open_usb(uint16_t default_vendor, uint16_t default_product) +{ + const struct usb_bus *bus; + struct usb_device *dev; + usb_dev_handle *handle; +#ifdef DO_FULL_USB_BUREAUCRACY + int res; +#endif + + usb_init(); + usb_find_busses(); + usb_find_devices(); + + for (bus = usb_get_busses(); bus; bus = bus->next) + for (dev = bus->devices; dev; dev = dev->next) { + if (dev->descriptor.idVendor != + (vendor ? vendor : default_vendor)) + continue; + if (dev->descriptor.idProduct != + (product ? product : default_product)) + continue; + handle = usb_open(dev); +#ifdef DO_FULL_USB_BUREAUCRACY + if (!handle) + return NULL; + res = usb_set_configuration(handle, 1); + if (res < 0) { + fprintf(stderr, "usb_set_configuration: %d\n", + res); + return NULL; + } + res = usb_claim_interface(handle, 0); + if (res < 0) { + fprintf(stderr, "usb_claim_interface: %d\n", + res); + return NULL; + } + res = usb_set_altinterface(handle, 0); + if (res < 0) { + fprintf(stderr, "usb_set_altinterface: %d\n", + res); + return NULL; + } +#endif + return handle; + } + return NULL; +} + + +static void bad_id(const char *id) +{ + fprintf(stderr, "\"%s\" is not a valid vendor:product ID\n", id); + exit(1); +} + + +void parse_usb_id(const char *id) +{ + unsigned long tmp; + char *end; + + tmp = strtoul(id, &end, 16); + if (*end != ':') + bad_id(id); + if (tmp > 0xffff) + bad_id(id); + vendor = tmp; + tmp = strtoul(end+1, &end, 16); + if (*end) + bad_id(id); + if (tmp > 0xffff) + bad_id(id); + product = tmp; +} diff --git a/tools/lib/usbopen.h b/tools/lib/usbopen.h new file mode 100644 index 0000000..f784229 --- /dev/null +++ b/tools/lib/usbopen.h @@ -0,0 +1,24 @@ +/* + * lib/usbopen.h - Common USB device lookup and open code + * + * Written 2008-2010 by Werner Almesberger + * Copyright 2008-2010 Werner Almesberger + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + + +#ifndef USB_OPEN_H +#define USB_OPEN_H + +#include +#include + + +usb_dev_handle *open_usb(uint16_t default_vendor, uint16_t default_product); +void parse_usb_id(const char *id); + +#endif /* !USB_OPEN_H */