libftdi Archives

Subject: [PATCH]Re: c++ wraper: open(vid,pid) fails for devices with a missing iManufacturer, iProduct or iSerial

From: Matthias Janke <matthias.janke@xxxxxxxxxxxxxxxxxxxxxxx>
To: libftdi@xxxxxxxxxxxxxxxxxxxxxxx
Date: Thu, 13 Jul 2017 18:53:25 +0200
Hi All,

I've appended a more proper patch to fix this behaviour. It extends
the argument list of get_strings_and_reopen() and get_strings(). I
introduced default arguments to make this API-break backwards
compatible.  These could, maybe at a later stage, be removed.  Whats
not clear to me is how to deal with open(struct libusb_device *dev).
Should in here get_strings_and_reopen() not completely removed?

While this patch tries to minimize the api breakage. I'd suggest to
join get_strings_and_reopen()  and get_strings() and to make them
private. as they are only useful for vendor(), product() and serial()
while we should save the used stings in the member variables after
successfully opening a device based on their usage.

Related to this is there a way in libusb to detect if the string
descriptor, which is optional, is empty or not available?

Cheers,
Matthias   

Am Thu, 25 May 2017 00:53:12 +0200
schrieb Matthias Janke <matthias.janke@xxxxxxxxxxxxxxxxxxxxxxx>:

> Hi Thomas,
> 
> Am Tue, 23 May 2017 21:26:23 +0200
> schrieb Thomas Jarosch <thomas.jarosch@xxxxxxxxxxxxx>:
> 
> > Hi Matthias,
> > 
> > Am 12.05.2017 um 13:32 schrieb Matthias Janke:  
> > >   I'm using the c++ wrapper of libftdi (git co of yesterday) to
> > >   communicate with a FT2232HL on a Lattice XO2 Eval board
> > >   (LCMXO2-7000HE-B-EVN) this board has no programmed in iSerial.
> > >   
> > >   A simple c++ program which just opens and closes the device
> > > fails with "libusb_get_string_descriptor_ascii() failed" this is
> > > also true for the find_all_pp example (find_all, works). This
> > > failure originates in the use of the get_strings() function
> > > inside all c++ open() functions. This function wants all three
> > > iManufractuer, iProduct and iSerial to be present. The C-API
> > > allows one to pass NULL to ignore these descriptors. This is
> > > currently not possible with the c++ api. To properly fix this I
> > > suspect an api break is needed. As temporary ugly workaround I
> > > use the appended patch. Are there other ideas to fix this?     
> > 
> > what about this open() function from ftdi.cpp:
> > 
> > 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();
> > 
> >     int ret = ftdi_usb_open_desc_index(d->ftdi, vendor, product,
> > c_description, c_serial, index);
> > 
> >     if (ret < 0)
> >        return ret;
> >  
> up to this point everything looks ok. but
> this: 
> >     return get_strings_and_reopen();  
> 
> innternaly calls get_strings() which unconditioaly tries to get all!
> strings:
> 
> int Context::get_strings()
>  323 {
>  324     // Prepare buffers
>  325     char vendor[512], desc[512], serial[512];
>  326 
>  327     int ret = ftdi_usb_get_strings(d->ftdi, d->dev, vendor, 512,
> desc, 512, serial, 512); 328 
>  329     if (ret < 0)
>  330         return -1;
>  331 
>  332     d->vendor = vendor;
>  333     d->description = desc;
>  334     d->serial = serial;
>  335 
>  336     return 1;
>  337 }
> 
> cheers,
> Matthias
> 
> > }
> > 
> > 
> >   
> > -> if you pass an empty string for "std::string serial",    
> > it should pass down NULL for the serial parameter of the C API.
> > 
> > What happens if you use this specific open() function?
> > 
> > Cheers,
> > Thomas
> > 
> > --
> > libftdi - see http://www.intra2net.com/en/developer/libftdi for
> > details. To unsubscribe send a mail to
> > libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx     
> 
> 
> --
> libftdi - see http://www.intra2net.com/en/developer/libftdi for
> details. To unsubscribe send a mail to
> libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx   



--
libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx   

Attachment: 0001-The-C-API-and-C-API-differ-in-how-they-open-a-device.patch
Description: Text Data

Current Thread