libftdi: (tomj) added ftdi_usb_get_strings function from external patch
[libftdi] / src / ftdi.c
index f5145ef..b7876fa 100644 (file)
  *                                                                         *
  ***************************************************************************/
 
+/**
+    \mainpage libftdi API documentation
+
+    Library to talk to FTDI chips. You find the latest versions of libftdi at
+    http://www.intra2net.com/de/produkte/opensource/ftdi/
+
+    The library is easy to use. Have a look at this short example:
+    \include simple.c
+
+    More examples can be found in the "examples" directory.
+*/
+/** \addtogroup libftdi */
+/* @{ */
+
 #include <usb.h>
 #include <string.h>
 #include <errno.h>
@@ -182,6 +196,65 @@ void ftdi_list_free(struct ftdi_device_list **devlist)
 }
 
 /**
+    Return device ID strings from the usb device.
+
+    The parameters manufacturer, description and serial may be NULL
+    or pointer to buffers to store the fetched strings.
+
+    \param ftdi pointer to ftdi_context
+    \param dev libusb usb_dev to use
+    \param manufacturer Store manufacturer string here if not NULL
+    \param mnf_len Buffer size of manufacturer string
+    \param description Store product description string here if not NULL
+    \param desc_len Buffer size of product description string
+    \param serial Store serial string here if not NULL
+    \param serial_len Buffer size of serial string
+
+    \retval   0: all fine
+    \retval  -1: wrong arguments
+    \retval  -4: unable to open device
+    \retval  -7: get product manufacturer failed
+    \retval  -8: get product description failed
+    \retval  -9: get serial number failed
+    \retval -10: unable to close device
+*/
+int ftdi_usb_get_strings(struct ftdi_context * ftdi, struct usb_device * dev,
+        char * manufacturer, int mnf_len, char * description, int desc_len, char * serial, int serial_len)
+{
+    if ((ftdi==NULL) || (dev==NULL))
+        return -1;
+
+    if (!(ftdi->usb_dev = usb_open(dev)))
+        ftdi_error_return(-4, usb_strerror());
+
+    if (manufacturer != NULL) {
+        if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iManufacturer, manufacturer, mnf_len) <= 0) {
+            usb_close (ftdi->usb_dev);
+            ftdi_error_return(-7, usb_strerror());
+        }
+    }
+
+    if (description != NULL) {
+        if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iProduct, description, desc_len) <= 0) {
+            usb_close (ftdi->usb_dev);
+            ftdi_error_return(-8, usb_strerror());
+        }
+    }
+
+    if (serial != NULL) {
+        if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iSerialNumber, serial, serial_len) <= 0) {
+            usb_close (ftdi->usb_dev);
+            ftdi_error_return(-9, usb_strerror());
+        }
+    }
+
+    if (usb_close (ftdi->usb_dev) != 0)
+        ftdi_error_return(-10, usb_strerror());
+
+    return 0;
+}
+
+/**
     Opens a ftdi device given by a usb_device.
 
     \param ftdi pointer to ftdi_context
@@ -248,7 +321,7 @@ int ftdi_usb_open_dev(struct ftdi_context *ftdi, struct usb_device *dev)
     \param vendor Vendor ID
     \param product Product ID
 
-    \retval \see ftdi_usb_open_desc()
+    \retval same as ftdi_usb_open_desc()
 */
 int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, int product)
 {
@@ -402,6 +475,7 @@ int ftdi_usb_close(struct ftdi_context *ftdi)
 /*
     ftdi_convert_baudrate returns nearest supported baud rate to that requested.
     Function is only used internally
+    \internal
 */
 static int ftdi_convert_baudrate(int baudrate, struct ftdi_context *ftdi,
                                  unsigned short *value, unsigned short *index)
@@ -501,9 +575,10 @@ static int ftdi_convert_baudrate(int baudrate, struct ftdi_context *ftdi,
 }
 
 /**
-    Sets the chip baudrate
+    Sets the chip baud rate
 
     \param ftdi pointer to ftdi_context
+    \param baudrate baud rate to set
 
     \retval  0: all fine
     \retval -1: invalid baudrate
@@ -1197,6 +1272,10 @@ char *ftdi_get_error_string (struct ftdi_context *ftdi)
     return ftdi->error_str;
 }
 
+/*
+    Flow control code by Lorenz Moesenlechner (lorenz@hcilab.org)
+    and Matthias Kranz  (matthias@hcilab.org)
+*/
 /**
     Set flowcontrol for ftdi chip
 
@@ -1268,3 +1347,5 @@ int ftdi_setrts(struct ftdi_context *ftdi, int state)
 
     return 0;
 }
+
+/* @} end of doxygen libftdi group */