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
|