libftdi-git Archives

Subject: A library to talk to FTDI chips branch, master, updated. v0.16-33-gc7f06bd

From: libftdi-git@xxxxxxxxxxxxxxxxxxxxxxx
To: libftdi-git@xxxxxxxxxxxxxxxxxxxxxxx
Date: Sun, 13 Dec 2009 00:51:27 +0100 (CET)
The branch, master has been updated
       via  c7f06bd4d72e78415046992276fec7aa801407f2 (commit)
       via  0e6cf62b5320ccdae0a4930cd4bc0b42b37e811d (commit)
       via  5ebbdab950bfb75ae93d90d60f369e20ef64e667 (commit)
      from  0c93de8177ee7310292ac7eab4c2e3ff993b4f2f (commit)


- Log -----------------------------------------------------------------
commit c7f06bd4d72e78415046992276fec7aa801407f2
Author: Gerd v. Egidy <gerd.von.egidy@xxxxxxxxxxxxx>
Date:   Sun Dec 13 00:49:22 2009 +0100

    use ftdi_usb_open_string() in baud_test example

commit 0e6cf62b5320ccdae0a4930cd4bc0b42b37e811d
Author: Gerd v. Egidy <gerd.von.egidy@xxxxxxxxxxxxx>
Date:   Sun Dec 13 00:48:49 2009 +0100

    fix description strings without serial

commit 5ebbdab950bfb75ae93d90d60f369e20ef64e667
Author: Gerd v. Egidy <gerd.von.egidy@xxxxxxxxxxxxx>
Date:   Sun Dec 13 00:29:10 2009 +0100

    add new open functions: ftdi_usb_open_desc_index() and 
ftdi_usb_open_string()

-----------------------------------------------------------------------

Summary of changes:
 examples/baud_test.c |   16 ++++--
 src/ftdi.c           |  139 ++++++++++++++++++++++++++++++++++++++++++++++++++
 src/ftdi.h           |    3 +
 3 files changed, 154 insertions(+), 4 deletions(-)

diff --git a/examples/baud_test.c b/examples/baud_test.c
index 4a7d4d5..3116fcd 100644
--- a/examples/baud_test.c
+++ b/examples/baud_test.c
@@ -3,7 +3,13 @@
  * test setting the baudrate and compare it with the expected runtime
  *
  * options:
- *  -p <usb-product-id> (vendor is fixed to ftdi / 0x0403)
+ *  -p <devicestring> defaults to "i:0x0403:0x6001" (this is the first FT232R 
with default id)
+ *       d:<devicenode> path of bus and device-node (e.g. "003/001") within 
usb device tree (usually at /proc/bus/usb/)
+ *       i:<vendor>:<product> first device with given vendor and product id,
+ *                            ids can be decimal, octal (preceded by "0") or 
hex (preceded by "0x")
+ *       i:<vendor>:<product>:<index> as above with index being the number of 
the device (starting with 0)
+ *                            if there are more than one
+ *       s:<vendor>:<product>:<serial> first device with given vendor id, 
product id and serial string
  *  -d <datasize to send in bytes>
  *  -b <baudrate> (divides by 16 if bitbang as taken from the ftdi datasheets)
  *  -m <mode to use> r: serial a: async bitbang s:sync bitbang 
@@ -53,7 +59,9 @@ int main(int argc, char **argv)
     int baud=9600;
     int set_baud;
     int datasize=100000;
-    int product_id=0x6001;
+
+    char default_devicedesc[] = "i:0x0403:0x6001";
+    char *devicedesc=default_devicedesc;
     int txchunksize=256;
     enum ftdi_mpsse_mode test_mode=BITMODE_BITBANG;
     
@@ -85,7 +93,7 @@ int main(int argc, char **argv)
                 baud = atoi (optarg);
                 break;
             case 'p':
-                sscanf(optarg,"0x%x",&product_id);
+                devicedesc=optarg;
                 break;
             case 'c':
                 txchunksize = atoi (optarg);
@@ -107,7 +115,7 @@ int main(int argc, char **argv)
         return EXIT_FAILURE;
     }
 
-    if (ftdi_usb_open(&ftdic, 0x0403, product_id) < 0)
+    if (ftdi_usb_open_string(&ftdic, devicedesc) < 0)
     {
         fprintf(stderr,"Can't open ftdi device: 
%s\n",ftdi_get_error_string(&ftdic));
         return EXIT_FAILURE;
diff --git a/src/ftdi.c b/src/ftdi.c
index a87d653..4a2e3f7 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -582,6 +582,35 @@ int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, 
int product)
 int ftdi_usb_open_desc(struct ftdi_context *ftdi, int vendor, int product,
                        const char* description, const char* serial)
 {
+    return ftdi_usb_open_desc_index(ftdi,vendor,product,description,serial,0);
+}
+
+/**
+    Opens the index-th device with a given, vendor id, product id,
+    description and serial.
+
+    \param ftdi pointer to ftdi_context
+    \param vendor Vendor ID
+    \param product Product ID
+    \param description Description to search for. Use NULL if not needed.
+    \param serial Serial to search for. Use NULL if not needed.
+    \param index Number of matching device to open if there are more than one, 
starts with 0.
+
+    \retval  0: all fine
+    \retval -1: usb_find_busses() failed
+    \retval -2: usb_find_devices() failed
+    \retval -3: usb device not found
+    \retval -4: unable to open device
+    \retval -5: unable to claim device
+    \retval -6: reset failed
+    \retval -7: set baudrate failed
+    \retval -8: get product description failed
+    \retval -9: get serial number failed
+    \retval -10: unable to close device
+*/
+int ftdi_usb_open_desc_index(struct ftdi_context *ftdi, int vendor, int 
product,
+                       const char* description, const char* serial, unsigned 
int index)
+{
     struct usb_bus *bus;
     struct usb_device *dev;
     char string[256];
@@ -635,6 +664,12 @@ int ftdi_usb_open_desc(struct ftdi_context *ftdi, int 
vendor, int product,
                 if (ftdi_usb_close_internal (ftdi) != 0)
                     ftdi_error_return(-10, "unable to close device");
 
+                if (index > 0)
+                {
+                    index--;
+                    continue;
+                }
+
                 return ftdi_usb_open_dev(ftdi, dev);
             }
         }
@@ -645,6 +680,110 @@ int ftdi_usb_open_desc(struct ftdi_context *ftdi, int 
vendor, int product,
 }
 
 /**
+    Opens the ftdi-device described by a description-string.
+    Intended to be used for parsing a device-description given as commandline 
argument.
+
+    \param ftdi pointer to ftdi_context
+    \param description NULL-terminated description-string, using this format:
+        \li <tt>d:\<devicenode></tt> path of bus and device-node (e.g. 
"003/001") within usb device tree (usually at /proc/bus/usb/)
+        \li <tt>i:\<vendor>:\<product></tt> first device with given vendor and 
product id, ids can be decimal, octal (preceded by "0") or hex (preceded by 
"0x")
+        \li <tt>i:\<vendor>:\<product>:\<index></tt> as above with index being 
the number of the device (starting with 0) if there are more than one
+        \li <tt>s:\<vendor>:\<product>:\<serial></tt> first device with given 
vendor id, product id and serial string
+
+    \note The description format may be extended in later versions.
+
+    \retval  0: all fine
+    \retval -1: usb_find_busses() failed
+    \retval -2: usb_find_devices() failed
+    \retval -3: usb device not found
+    \retval -4: unable to open device
+    \retval -5: unable to claim device
+    \retval -6: reset failed
+    \retval -7: set baudrate failed
+    \retval -8: get product description failed
+    \retval -9: get serial number failed
+    \retval -10: unable to close device
+    \retval -11: illegal description format
+*/
+int ftdi_usb_open_string(struct ftdi_context *ftdi, const char* description)
+{
+    if (description[0] == 0 || description[1] != ':')
+        ftdi_error_return(-11, "illegal description format");
+
+    if (description[0] == 'd')
+    {
+        struct usb_bus *bus;
+        struct usb_device *dev;
+        char dev_name[PATH_MAX+1];
+
+        usb_init();
+
+        if (usb_find_busses() < 0)
+            ftdi_error_return(-1, "usb_find_busses() failed");
+        if (usb_find_devices() < 0)
+            ftdi_error_return(-2, "usb_find_devices() failed");
+
+        for (bus = usb_get_busses(); bus; bus = bus->next)
+        {
+            for (dev = bus->devices; dev; dev = dev->next)
+            {
+                snprintf(dev_name, sizeof(dev_name), 
"%s/%s",bus->dirname,dev->filename);
+                if (strcmp(description+2,dev_name) == 0)
+                    return ftdi_usb_open_dev(ftdi, dev);
+            }
+        }
+
+        // device not found
+        ftdi_error_return(-3, "device not found");
+    }
+    else if (description[0] == 'i' || description[0] == 's')
+    {
+        unsigned int vendor;
+        unsigned int product;
+        unsigned int index=0;
+        const char *serial=NULL;
+        const char *startp, *endp;
+
+        errno=0;
+        startp=description+2;
+        vendor=strtoul((char*)startp,(char**)&endp,0);
+        if (*endp != ':' || endp == startp || errno != 0)
+            ftdi_error_return(-11, "illegal description format");
+
+        startp=endp+1;
+        product=strtoul((char*)startp,(char**)&endp,0);
+        if (endp == startp || errno != 0)
+            ftdi_error_return(-11, "illegal description format");
+
+        if (description[0] == 'i' && *endp != 0)
+        {
+            /* optional index field in i-mode */
+            if (*endp != ':')
+                ftdi_error_return(-11, "illegal description format");
+
+            startp=endp+1;
+            index=strtoul((char*)startp,(char**)&endp,0);
+            if (*endp != 0 || endp == startp || errno != 0)
+                ftdi_error_return(-11, "illegal description format");
+        }
+        if (description[0] == 's')
+        {
+            if (*endp != ':')
+                ftdi_error_return(-11, "illegal description format");
+
+            /* rest of the description is the serial */
+            serial=endp+1;
+        }
+
+        return ftdi_usb_open_desc_index(ftdi, vendor, product, NULL, serial, 
index);
+    }
+    else
+    {
+        ftdi_error_return(-11, "illegal description format");
+    }
+}
+
+/**
     Resets the ftdi device.
 
     \param ftdi pointer to ftdi_context
diff --git a/src/ftdi.h b/src/ftdi.h
index 9c19734..bee3c2d 100644
--- a/src/ftdi.h
+++ b/src/ftdi.h
@@ -289,7 +289,10 @@ extern "C"
     int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, int product);
     int ftdi_usb_open_desc(struct ftdi_context *ftdi, int vendor, int product,
                            const char* description, const char* serial);
+    int ftdi_usb_open_desc_index(struct ftdi_context *ftdi, int vendor, int 
product,
+                           const char* description, const char* serial, 
unsigned int index);
     int ftdi_usb_open_dev(struct ftdi_context *ftdi, struct usb_device *dev);
+    int ftdi_usb_open_string(struct ftdi_context *ftdi, const char* 
description);
 
     int ftdi_usb_close(struct ftdi_context *ftdi);
     int ftdi_usb_reset(struct ftdi_context *ftdi);


hooks/post-receive
-- 
A library to talk to FTDI chips

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

Current Thread
  • A library to talk to FTDI chips branch, master, updated. v0.16-33-gc7f06bd, libftdi-git <=