/**
- Finds all ftdi devices on the usb bus. Creates a new ftdi_device_list which
- needs to be deallocated by ftdi_list_free() after use.
+ Finds all ftdi devices with given VID:PID on the usb bus. Creates a new
+ ftdi_device_list which needs to be deallocated by ftdi_list_free() after
+ use. With VID:PID 0:0, search for the default devices
+ (0x403:0x6001, 0x403:0x6010, 0x403:0x6011, 0x403:0x6014)
\param ftdi pointer to ftdi_context
\param devlist Pointer where to store list of found devices
if (libusb_get_device_descriptor(dev, &desc) < 0)
ftdi_error_return_free_device_list(-6, "libusb_get_device_descriptor() failed", devs);
- if (desc.idVendor == vendor && desc.idProduct == product)
+ if (((vendor != 0 && product != 0) &&
+ desc.idVendor == vendor && desc.idProduct == product) ||
+ ((vendor == 0 && product == 0) &&
+ (desc.idVendor == 0x403) && (desc.idProduct == 0x6001 || desc.idProduct == 0x6010
+ || desc.idProduct == 0x6011 || desc.idProduct == 0x6014)))
{
*curdev = (struct ftdi_device_list*)malloc(sizeof(struct ftdi_device_list));
if (!*curdev)
(*curdev)->next = NULL;
(*curdev)->dev = dev;
-
+ libusb_ref_device(dev);
curdev = &(*curdev)->next;
count++;
}
for (curdev = *devlist; curdev != NULL;)
{
next = curdev->next;
+ libusb_unref_device(curdev->dev);
free(curdev);
curdev = next;
}
\retval -7: set baudrate failed
\retval -8: get product description failed
\retval -9: get serial number failed
- \retval -11: libusb_init() failed
\retval -12: libusb_get_device_list() failed
\retval -13: libusb_get_device_descriptor() failed
*/
if (ftdi == NULL)
ftdi_error_return(-11, "ftdi context invalid");
- if (libusb_init(&ftdi->usb_ctx) < 0)
- ftdi_error_return(-11, "libusb_init() failed");
-
if (libusb_get_device_list(ftdi->usb_ctx, &devs) < 0)
ftdi_error_return(-12, "libusb_get_device_list() failed");
\note The description format may be extended in later versions.
\retval 0: all fine
- \retval -1: libusb_init() failed
\retval -2: libusb_get_device_list() failed
\retval -3: usb device not found
\retval -4: unable to open device
unsigned int bus_number, device_address;
int i = 0;
- if (libusb_init (&ftdi->usb_ctx) < 0)
- ftdi_error_return(-1, "libusb_init() failed");
-
if (libusb_get_device_list(ftdi->usb_ctx, &devs) < 0)
ftdi_error_return(-2, "libusb_get_device_list() failed");
break;
case TYPE_2232C:
- output[0x00] = (1<<(eeprom->channel_a_type)) & 0x7;
+ output[0x00] = (eeprom->channel_a_type)?((1<<(eeprom->channel_a_type)) & 0x7):0;
if ( eeprom->channel_a_driver == DRIVER_VCP)
output[0x00] |= DRIVER_VCP;
else
else
output[0x00] &= ~HIGH_CURRENT_DRIVE;
- output[0x01] = (1<<(eeprom->channel_b_type)) & 0x7;
+ output[0x01] = (eeprom->channel_b_type)?((1<<(eeprom->channel_b_type)) & 0x7):0;
if ( eeprom->channel_b_driver == DRIVER_VCP)
output[0x01] |= DRIVER_VCP;
else
output[0x16] = eeprom->cbus_function[4];
break;
case TYPE_2232H:
- output[0x00] = (1<<(eeprom->channel_a_type)) & 0x7;
+ output[0x00] = (eeprom->channel_a_type)?((1<<(eeprom->channel_a_type)) & 0x7):0;
if ( eeprom->channel_a_driver == DRIVER_VCP)
output[0x00] |= DRIVER_VCP;
else
output[0x00] &= ~DRIVER_VCP;
- output[0x01] = (1<<(eeprom->channel_b_type)) & 0x7;
+ output[0x01] = (eeprom->channel_b_type)?((1<<(eeprom->channel_b_type)) & 0x7):0;
if ( eeprom->channel_b_driver == DRIVER_VCP)
output[0x01] |= DRIVER_VCP;
else
fprintf(stderr,"FIXME: Build FT4232H specific EEPROM settings\n");
break;
case TYPE_232H:
- output[0x00] = (1<<(eeprom->channel_a_type)) & 0xf;
+ output[0x00] = (eeprom->channel_a_type)?((1<<(eeprom->channel_a_type)) & 0xf):0;
if ( eeprom->channel_a_driver == DRIVER_VCP)
output[0x00] |= DRIVER_VCPH;
else