{
public:
Private()
- : ftdi(0), dev(0), open(false)
+ : open(false), ftdi(0), dev(0)
{
ftdi = ftdi_new();
}
bool open;
struct ftdi_context* ftdi;
- struct usb_device* dev;
+ struct libusb_device* dev;
std::string vendor;
std::string description;
return d->open;
}
-int Context::open(int vendor, int product, const std::string& description, const std::string& serial)
+int Context::open(int vendor, int product)
{
- int ret = 0;
-
// Open device
- if (description.empty() && serial.empty())
- ret = ftdi_usb_open(d->ftdi, vendor, product);
- else
- ret = ftdi_usb_open_desc(d->ftdi, vendor, product, description.c_str(), serial.c_str());
+ int ret = ftdi_usb_open(d->ftdi, vendor, product);
if (ret < 0)
return ret;
- // Get device strings (closes device)
- get_strings();
+ return get_strings_and_reopen();
+}
- // Reattach device
- ret = ftdi_usb_open_dev(d->ftdi, d->dev);
- d->open = (ret >= 0);
+int Context::open(int vendor, int product, const std::string& description, const std::string& serial, unsigned int index)
+{
+ // translate empty strings to NULL
+ // -> do not use them to find the device (vs. require an empty string to be set in the EEPROM)
+ const char* c_description=NULL;
+ const char* c_serial=NULL;
+ if (!description.empty())
+ c_description=description.c_str();
+ if (!serial.empty())
+ c_serial=serial.c_str();
- return ret;
+ int ret = ftdi_usb_open_desc_index(d->ftdi, vendor, product, c_description, c_serial, index);
+
+ if (ret < 0)
+ return ret;
+
+ return get_strings_and_reopen();
}
-int Context::open(struct usb_device *dev)
+int Context::open(const std::string& description)
+{
+ int ret = ftdi_usb_open_string(d->ftdi, description.c_str());
+
+ if (ret < 0)
+ return ret;
+
+ return get_strings_and_reopen();
+}
+
+int Context::open(struct libusb_device *dev)
{
if (dev != 0)
d->dev = dev;
if (d->dev == 0)
return -1;
- // Get device strings (closes device)
- get_strings();
-
- // Reattach device
- int ret = ftdi_usb_open_dev(d->ftdi, d->dev);
- d->open = (ret >= 0);
-
- return ret;
+ return get_strings_and_reopen();
}
int Context::close()
return ftdi_set_interface(d->ftdi, interface);
}
-void Context::set_usb_device(struct usb_dev_handle *dev)
+void Context::set_usb_device(struct libusb_device_handle *dev)
{
ftdi_set_usbdev(d->ftdi, dev);
- d->dev = usb_device(dev);
+ d->dev = libusb_get_device(dev);
}
int Context::set_baud_rate(int baudrate)
int Context::bitbang_enable(unsigned char bitmask)
{
- return ftdi_enable_bitbang(d->ftdi, bitmask);
+ return ftdi_set_bitmode(d->ftdi, bitmask, BITMODE_BITBANG);
}
int Context::bitbang_disable()
return ftdi_set_bitmode(d->ftdi, bitmask, mode);
}
+int Context::set_bitmode(unsigned char bitmask, enum ftdi_mpsse_mode mode)
+{
+ return ftdi_set_bitmode(d->ftdi, bitmask, mode);
+}
+
int Context::read_pins(unsigned char *pins)
{
return ftdi_read_pins(d->ftdi, pins);
return 1;
}
+int Context::get_strings_and_reopen()
+{
+ // Get device strings (closes device)
+ int ret=get_strings();
+ if (ret < 0)
+ {
+ d->open = 0;
+ return ret;
+ }
+
+ // Reattach device
+ ret = ftdi_usb_open_dev(d->ftdi, d->dev);
+ d->open = (ret >= 0);
+
+ return ret;
+}
+
/*! \brief Device strings properties.
*/
const std::string& Context::vendor()
d->ftdi = context;
}
-void Context::set_usb_device(struct usb_device *dev)
+void Context::set_usb_device(struct libusb_device *dev)
{
d->dev = dev;
}
void Eeprom::init_defaults()
{
- return ftdi_eeprom_initdefaults(&d->eeprom);
+ return ftdi_eeprom_initdefaults(d->context);
}
void Eeprom::set_size(int size)
return ftdi_eeprom_setsize(d->context, &d->eeprom, size);
}
-int Eeprom::size(unsigned char *eeprom, int maxsize)
-{
- return ftdi_read_eeprom_getsize(d->context, eeprom, maxsize);
-}
-
int Eeprom::chip_id(unsigned int *chipid)
{
return ftdi_read_chipid(d->context, chipid);
int Eeprom::build(unsigned char *output)
{
- return ftdi_eeprom_build(&d->eeprom, output);
+ return ftdi_eeprom_build(d->context, output);
}
int Eeprom::read(unsigned char *eeprom)