From 8b0b694fd737f5318adc29fa4cc48783a77a502e Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Wed, 20 Jul 2011 11:12:52 +0200 Subject: [PATCH] Search for any devices with one of the default VID/PID, if no VID/PID if given --- examples/serial_test.c | 127 +++++++++++++++++++++++++++++++++++++---------- 1 files changed, 100 insertions(+), 27 deletions(-) diff --git a/examples/serial_test.c b/examples/serial_test.c index aec18d0..60c5a84 100644 --- a/examples/serial_test.c +++ b/examples/serial_test.c @@ -1,6 +1,6 @@ -/* serial_read.c +/* serial_test.c - Read data via serial I/O + Read/write data via serial I/O This program is distributed under the GPL, version 2 */ @@ -9,19 +9,35 @@ #include #include #include +#include #include +static int exitRequested = 0; +/* + * sigintHandler -- + * + * SIGINT handler, so we can gracefully exit when the user hits ctrl-C. + */ +static void +sigintHandler(int signum) +{ + exitRequested = 1; +} + int main(int argc, char **argv) { - struct ftdi_context ftdic; + struct ftdi_context *ftdi; unsigned char buf[1024]; int f, i; - int vid = 0x0403; - int pid = 0x6001; + int vid = 0; + int pid = 0; int baudrate = 115200; int interface = INTERFACE_ANY; + int do_write = 0; + unsigned int pattern; + int retval = EXIT_FAILURE; - while ((i = getopt(argc, argv, "i:v:p:b:")) != -1) + while ((i = getopt(argc, argv, "i:v:p:b:w::")) != -1) { switch (i) { @@ -37,49 +53,106 @@ int main(int argc, char **argv) case 'b': baudrate = strtoul(optarg, NULL, 0); break; + case 'w': + do_write = 1; + pattern = strtoul(optarg, NULL, 0); + if (pattern > 0xff) + fprintf(stderr, "Please provide a 8 bit pattern\n"); + break; default: - fprintf(stderr, "usage: %s [-i interface] [-v vid] [-p pid] [-b baudrate]\n", *argv); + fprintf(stderr, "usage: %s [-i interface] [-v vid] [-p pid] [-b baudrate] [-w [pattern]]\n", *argv); exit(-1); } } // Init - if (ftdi_init(&ftdic) < 0) + if ((ftdi = ftdi_new()) == 0) { - fprintf(stderr, "ftdi_init failed\n"); + fprintf(stderr, "ftdi_new failed\n"); return EXIT_FAILURE; } - // Select first interface - ftdi_set_interface(&ftdic, interface); - - // Open device - f = ftdi_usb_open(&ftdic, vid, pid); + if (!vid && !pid && (interface == INTERFACE_ANY)) + { + ftdi_set_interface(ftdi, INTERFACE_ANY); + struct ftdi_device_list *devlist; + int res; + if ((res = ftdi_usb_find_all(ftdi, &devlist, 0, 0)) < 0) + { + fprintf(stderr, "No FTDI with default VID/PID found\n"); + goto do_deinit; + } + if (res == 1) + { + f = ftdi_usb_open_dev(ftdi, devlist[0].dev); + if (f<0) + { + fprintf(stderr, "Unable to open device %d: (%s)", + i, ftdi_get_error_string(ftdi)); + } + } + ftdi_list_free(&devlist); + if (res > 1) + { + fprintf(stderr, "%d Devices found, please select Device with VID/PID\n", res); + /* TODO: List Devices*/ + goto do_deinit; + } + if (res == 0) + { + fprintf(stderr, "No Devices found with default VID/PID\n"); + goto do_deinit; + } + } + else + { + // Select interface + ftdi_set_interface(ftdi, interface); + + // Open device + f = ftdi_usb_open(ftdi, vid, pid); + } if (f < 0) { - fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(&ftdic)); + fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(ftdi)); exit(-1); } // Set baudrate - f = ftdi_set_baudrate(&ftdic, 115200); + f = ftdi_set_baudrate(ftdi, baudrate); if (f < 0) { - fprintf(stderr, "unable to set baudrate: %d (%s)\n", f, ftdi_get_error_string(&ftdic)); + fprintf(stderr, "unable to set baudrate: %d (%s)\n", f, ftdi_get_error_string(ftdi)); exit(-1); } + + if (do_write) + for(i=0; i<1024; i++) + buf[i] = pattern; - // Read data forever - while ((f = ftdi_read_data(&ftdic, buf, sizeof(buf))) >= 0) + signal(SIGINT, sigintHandler); + while (!exitRequested) { - fprintf(stderr, "read %d bytes\n", f); - fwrite(buf, f, 1, stdout); - fflush(stderr); - fflush(stdout); + if (do_write) + f = ftdi_write_data(ftdi, buf, sizeof(buf)); + else + f = ftdi_read_data(ftdi, buf, sizeof(buf)); + if (f<0) + sleep(1); + else if(f> 0 && !do_write) + { + fprintf(stderr, "read %d bytes\n", f); + fwrite(buf, f, 1, stdout); + fflush(stderr); + fflush(stdout); + } } + signal(SIGINT, SIG_DFL); + retval = EXIT_SUCCESS; + + ftdi_usb_close(ftdi); + do_deinit: + ftdi_free(ftdi); - ftdi_usb_close(&ftdic); - ftdi_deinit(&ftdic); - - return 0; + return retval; } -- 1.7.1