1
0
mirror of git://projects.qi-hardware.com/f32xbase.git synced 2024-07-17 11:36:36 +03:00
f32xbase/lib/usb.c
Werner Almesberger a77a9a611f lib/usb.c (open_usb): libusb documentation claims that considerable
bureaucracy is needed before operations can be performed. This doesn't
seem to be the case, but let's put the code (commented out) anyway,
since it's been written. (This was done while trying to debug another
problem.)
2010-08-24 21:09:22 -03:00

100 lines
2.0 KiB
C

/*
* lib/usb.c - Common USB code for F32Xbase tools
*
* 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 <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <usb.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;
}