From: Uwe Bonnes Date: Thu, 29 Sep 2011 12:37:24 +0000 (+0200) Subject: Backport serial_test from libftdi 1.0 X-Git-Tag: v0.20~5 X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=commitdiff_plain;h=e115d5952de491c77ea81b7f69b572192e6074b8 Backport serial_test from libftdi 1.0 Remove examples/serial_read.c and use examples/serial_test.c from libftdi-1 --- diff --git a/.gitignore b/.gitignore index 0426964..e78d893 100644 --- a/.gitignore +++ b/.gitignore @@ -43,7 +43,7 @@ examples/bitbang_cbus examples/bitbang_ft2232 examples/find_all examples/find_all_pp -examples/serial_read +examples/serial_test examples/simple # python bindings diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index d2aeecb..e80872c 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -18,7 +18,7 @@ if (EXAMPLES) add_executable(bitbang_cbus bitbang_cbus.c) add_executable(bitbang_ft2232 bitbang_ft2232.c) add_executable(find_all find_all.c) - add_executable(serial_read serial_read.c) + add_executable(serial_test serial_test.c) add_executable(baud_test baud_test.c) # Linkage @@ -28,7 +28,7 @@ if (EXAMPLES) target_link_libraries(bitbang_cbus ftdi) target_link_libraries(bitbang_ft2232 ftdi) target_link_libraries(find_all ftdi) - target_link_libraries(serial_read ftdi) + target_link_libraries(serial_test ftdi) target_link_libraries(baud_test ftdi) # libftdi++ examples diff --git a/examples/Makefile.am b/examples/Makefile.am index f45c7e5..a7d28e2 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -17,7 +17,7 @@ all_examples = simple \ bitbang_ft2232 \ bitbang_cbus \ find_all \ - serial_read \ + serial_test \ baud_test \ $(examples_libftdipp) else @@ -34,7 +34,7 @@ bitbang2_SOURCES = bitbang2.c bitbang_ft2232_SOURCES = bitbang_ft2232.c bitbang_cbus_SOURCES = bitbang_cbus.c find_all_SOURCES = find_all.c -serial_read_SOURCES = serial_read.c +serial_test_SOURCES = serial_test.c baud_test_SOURCES = baud_test.c if HAVE_LIBFTDIPP diff --git a/examples/serial_read.c b/examples/serial_read.c deleted file mode 100644 index 754ca4a..0000000 --- a/examples/serial_read.c +++ /dev/null @@ -1,81 +0,0 @@ -/* serial_read.c - - Read data via serial I/O - - This program is distributed under the GPL, version 2 -*/ - -#include -#include -#include -#include - -int main(int argc, char **argv) -{ - struct ftdi_context ftdic; - char buf[1024]; - int f, i; - int vid = 0x0403; - int pid = 0x6001; - int baudrate = 115200; - int interface = INTERFACE_ANY; - - while ((i = getopt(argc, argv, "i:v:p:b:")) != -1) - { - switch (i) - { - case 'i': // 0=ANY, 1=A, 2=B, 3=C, 4=D - interface = strtoul(optarg, NULL, 0); - break; - case 'v': - vid = strtoul(optarg, NULL, 0); - break; - case 'p': - pid = strtoul(optarg, NULL, 0); - break; - case 'b': - baudrate = strtoul(optarg, NULL, 0); - break; - default: - fprintf(stderr, "usage: %s [-i interface] [-v vid] [-p pid] [-b baudrate]\n", *argv); - exit(-1); - } - } - - // Init - if (ftdi_init(&ftdic) < 0) - { - fprintf(stderr, "ftdi_init failed\n"); - return EXIT_FAILURE; - } - - // Select first interface - ftdi_set_interface(&ftdic, interface); - - // Open device - f = ftdi_usb_open(&ftdic, vid, pid); - if (f < 0) - { - fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(&ftdic)); - exit(-1); - } - - // Set baudrate - f = ftdi_set_baudrate(&ftdic, 115200); - if (f < 0) - { - fprintf(stderr, "unable to set baudrate: %d (%s)\n", f, ftdi_get_error_string(&ftdic)); - exit(-1); - } - - // Read data forever - while ((f = ftdi_read_data(&ftdic, buf, sizeof(buf))) >= 0) { - fprintf(stderr, "read %d bytes\n", f); - fwrite(buf, f, 1, stdout); - fflush(stderr); - fflush(stdout); - } - - ftdi_usb_close(&ftdic); - ftdi_deinit(&ftdic); -} diff --git a/examples/serial_test.c b/examples/serial_test.c new file mode 100644 index 0000000..20fc772 --- /dev/null +++ b/examples/serial_test.c @@ -0,0 +1,179 @@ +/* serial_test.c + + Read/write data via serial I/O + + This program is distributed under the GPL, version 2 +*/ + +#include +#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 *ftdi; + unsigned char buf[1024]; + int f = 0, i; + int vid = 0x403; + int pid = 0; + int baudrate = 115200; + int interface = INTERFACE_ANY; + int do_write = 0; + unsigned int pattern = 0xffff; + int retval = EXIT_FAILURE; + + while ((i = getopt(argc, argv, "i:v:p:b:w::")) != -1) + { + switch (i) + { + case 'i': // 0=ANY, 1=A, 2=B, 3=C, 4=D + interface = strtoul(optarg, NULL, 0); + break; + case 'v': + vid = strtoul(optarg, NULL, 0); + break; + case 'p': + pid = strtoul(optarg, NULL, 0); + break; + case 'b': + baudrate = strtoul(optarg, NULL, 0); + break; + case 'w': + do_write = 1; + if (optarg) + pattern = strtoul(optarg, NULL, 0); + if (pattern > 0xff) + { + fprintf(stderr, "Please provide a 8 bit pattern\n"); + exit(-1); + } + break; + default: + fprintf(stderr, "usage: %s [-i interface] [-v vid] [-p pid] [-b baudrate] [-w [pattern]]\n", *argv); + exit(-1); + } + } + + // Init + if ((ftdi = ftdi_new()) == 0) + { + fprintf(stderr, "ftdi_new failed\n"); + return EXIT_FAILURE; + } + + 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(ftdi)); + exit(-1); + } + + // Set baudrate + f = ftdi_set_baudrate(ftdi, baudrate); + if (f < 0) + { + fprintf(stderr, "unable to set baudrate: %d (%s)\n", f, ftdi_get_error_string(ftdi)); + exit(-1); + } + + /* Set line parameters + * + * TODO: Make these parameters settable from the command line + * + * Parameters are choosen that sending a continous stream of 0x55 + * should give a square wave + * + */ + f = ftdi_set_line_property(ftdi, 8, STOP_BIT_1, NONE); + if (f < 0) + { + fprintf(stderr, "unable to set line parameters: %d (%s)\n", f, ftdi_get_error_string(ftdi)); + exit(-1); + } + + if (do_write) + for(i=0; i<1024; i++) + buf[i] = pattern; + + signal(SIGINT, sigintHandler); + while (!exitRequested) + { + if (do_write) + f = ftdi_write_data(ftdi, buf, + (baudrate/512 >sizeof(buf))?sizeof(buf): + (baudrate/512)?baudrate/512:1); + 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); + + return retval; +} diff --git a/libftdi.spec.in b/libftdi.spec.in index d09c86d..36970f1 100644 --- a/libftdi.spec.in +++ b/libftdi.spec.in @@ -49,7 +49,7 @@ rm -f $RPM_BUILD_ROOT/usr/bin/bitbang_ft2232 rm -f $RPM_BUILD_ROOT/usr/bin/bitbang_cbus rm -f $RPM_BUILD_ROOT/usr/bin/find_all rm -f $RPM_BUILD_ROOT/usr/bin/find_all_pp -rm -f $RPM_BUILD_ROOT/usr/bin/serial_read +rm -f $RPM_BUILD_ROOT/usr/bin/serial_test rm -f $RPM_BUILD_ROOT/usr/bin/baud_test %clean