X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=blobdiff_plain;f=src%2Fftdi.c;h=d7f4bb07f4ead6311d792e74d1a6426b129dd1e0;hp=5d6a221b91828e5e39d744f4a36cb17e46ec292f;hb=a56ba2bd557e7c7804b288aee2dcc42c8037b03c;hpb=1416eb1443005be219a8f76b6f05bff947ccce4a diff --git a/src/ftdi.c b/src/ftdi.c index 5d6a221..d7f4bb0 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -400,6 +400,7 @@ int ftdi_usb_get_strings(struct ftdi_context * ftdi, struct usb_device * dev, int ftdi_usb_open_dev(struct ftdi_context *ftdi, struct usb_device *dev) { int detach_errno = 0; + int config_val = 1; if (!(ftdi->usb_dev = usb_open(dev))) ftdi_error_return(-4, "usb_open() failed"); @@ -419,18 +420,25 @@ int ftdi_usb_open_dev(struct ftdi_context *ftdi, struct usb_device *dev) // set configuration (needed especially for windows) // tolerate EBUSY: one device with one configuration, but two interfaces // and libftdi sessions to both interfaces (e.g. FT2232) - if (dev->descriptor.bNumConfigurations > 0 && - usb_set_configuration(ftdi->usb_dev, dev->config[0].bConfigurationValue) && - errno != EBUSY) + + if (dev->descriptor.bNumConfigurations > 0) { - ftdi_usb_close_internal (ftdi); - if (detach_errno == EPERM) - { - ftdi_error_return(-8, "inappropriate permissions on device!"); - } - else + // libusb-win32 on Windows 64 can return a null pointer for a valid device + if (dev->config) + config_val = dev->config[0].bConfigurationValue; + + if (usb_set_configuration(ftdi->usb_dev, config_val) && + errno != EBUSY) { - ftdi_error_return(-3, "unable to set usb configuration. Make sure ftdi_sio is unloaded!"); + ftdi_usb_close_internal (ftdi); + if (detach_errno == EPERM) + { + ftdi_error_return(-8, "inappropriate permissions on device!"); + } + else + { + ftdi_error_return(-3, "unable to set usb configuration. Make sure ftdi_sio is unloaded!"); + } } } #endif