Date: Wed, 3 Sep 2003 22:16:49 -0700 (PDT) From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 37478 for review Message-ID: <200309040516.h845GnMQ061401@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=37478 Change 37478 by marcel@marcel_nfs on 2003/09/03 22:16:00 Simplify the test program. It doesn't try to handle both sides of the communication anymore. You either start it as DTE (-t) or as DCE (-c). A loopback (-l) option has been added to remind me that we can also take advantage of loopback features... It has again been verified that flow control without hardware support works. The SAB 82532 works as sender (ie CTS_OFLOW works with hardware support), but does not work as receiver (ie RTS_IFLOW does not work). Affected files ... .. //depot/projects/uart/dev/uart/uarttest.c#2 edit Differences ... ==== //depot/projects/uart/dev/uart/uarttest.c#2 (text+ko) ==== @@ -37,14 +37,21 @@ #include <stdlib.h> #include <sysexits.h> #include <termios.h> +#include <unistd.h> + +static void sethow(int); +static void usage(void); -static int open_uart(const char*dev); -static int usage(void); +#define AS_DCE 1 +#define AS_DTE 2 +#define AS_LOOP 3 + +int fd, how; char buffer[16384*4]; static int -getsig(int fd, const char *dev, size_t count, int oldsig) +getsig(const char *dev, size_t count, int oldsig) { int newsig; @@ -72,152 +79,144 @@ return (newsig); } -static void* -dte(void *arg) +static void +dte(void) { - struct termios t0, t1; ssize_t count, wc; - int fd, sig; + int sig; - fd = (intptr_t)arg; - tcgetattr(fd, &t0); - t1 = t0; - cfmakeraw(&t1); - cfsetspeed(&t1, B115200); - t1.c_cflag |= CCTS_OFLOW; - tcsetattr(fd, TCSAFLUSH|TCSANOW, &t1); - - sleep(1); count = 0; errno = 0; sig = 0; while (count < sizeof(buffer)) { - sig = getsig(fd, "dte", count, sig); + sig = getsig("dte", count, sig); wc = write(fd, buffer + count, sizeof(buffer) - count); if (wc > 0) { count += wc; errno = 0; - } else - pthread_yield(); + } } - printf("dte: %u bytes transmitted\n", count); - - tcsetattr(fd, TCSADRAIN, &t0); - return (NULL); } -static void* -dce(void *arg) +static void +dce(void) { - struct termios t0, t1; ssize_t count, rc; - int fd, sig; + int sig; - fd = (intptr_t)arg; - tcgetattr(fd, &t0); - t1 = t0; - cfmakeraw(&t1); - cfsetspeed(&t1, B115200); - t1.c_cflag |= CRTS_IFLOW; - tcsetattr(fd, TCSAFLUSH|TCSANOW, &t1); - - sleep(2); count = 0; errno = 0; sig = 0; - /* fcntl(fd, F_SETFL, 0); */ while (count < sizeof(buffer)) { - sig = getsig(fd, "dce", count, sig); - pthread_yield(); + sig = getsig("dce", count, sig); rc = MIN(16, sizeof(buffer) - count); rc = read(fd, buffer + count, rc); if (rc > 0) { count += rc; errno = 0; - } else + } else { + printf("sleeping after %u bytes...\n", count); sleep(1); + } } printf("dce: %u bytes received\n", count); - - tcsetattr(fd, TCSADRAIN, &t0); - return (NULL); } -static void -run(int dte_fd, int dce_fd) +int +main(int argc, char *argv[]) { - pthread_t dte_thr, dce_thr; - int error; + char buf[PATH_MAX]; + struct termios t0, t1; + int ch; - error = pthread_create(&dte_thr, NULL, dte, (void*)(intptr_t)dte_fd); - if (error) { - warnx("%s: pthread_create: %s (%d)", getprogname(), - strerror(error), error); - return; + while ((ch = getopt(argc, argv, "clt")) != -1) { + switch (ch) { + case 'c': /* DCE mode */ + sethow(AS_DCE); + break; + case 'l': /* Loopback mode */ + sethow(AS_LOOP); + break; + case 't': /* DTE mode */ + sethow(AS_DTE); + break; + default: + usage(); + } } - error = pthread_create(&dce_thr, NULL, dce, (void*)(intptr_t)dce_fd); - if (error) { - warnx("%s: pthread_create: %s (%d)", getprogname(), - strerror(error), error); - return; - } + if (how == 0) + usage(); - pthread_join(dce_thr, NULL); - pthread_join(dte_thr, NULL); -} + argc -= optind; + argv += optind; -int -main(int argc, char *argv[]) -{ - int dce_fd, dte_fd; + if (argc != 1) + usage(); - if (argc != 3) - return (usage()); + fd = open(argv[0], O_RDWR | O_NONBLOCK); + if (fd == -1) { + if (errno == ENOENT) { + snprintf(buf, PATH_MAX, "/dev/%s", argv[0]); + fd = open(buf, O_RDWR | O_NONBLOCK); + if (fd == -1) + warn("opening `%s' and `%s'", argv[0], buf); + } else + warn("opening `%s'", argv[0]); + } + if (fd == -1) + exit(EX_NOINPUT); - dte_fd = open_uart(argv[1]); - if (dte_fd == -1) - return (EX_NOINPUT); - dce_fd = open_uart(argv[2]); - if (dce_fd == -1) { - close(dte_fd); - return (EX_NOINPUT); + tcgetattr(fd, &t0); + t1 = t0; + cfmakeraw(&t1); + cfsetspeed(&t1, B115200); + switch (how) { + case AS_DCE: + t1.c_cflag |= CRTS_IFLOW; + break; + case AS_DTE: + t1.c_cflag |= CCTS_OFLOW; + break; + default: + t1.c_cflag |= CCTS_OFLOW | CRTS_IFLOW; + break; } + tcsetattr(fd, TCSAFLUSH|TCSANOW, &t1); - printf("%s: starting tests...\n", getprogname()); - run(dte_fd, dce_fd); + switch (how) { + case AS_DCE: + dce(); + break; + case AS_DTE: + dte(); + break; + default: + warn("not today"); + break; + } - close(dte_fd); - close(dce_fd); + tcsetattr(fd, TCSADRAIN, &t0); + sleep(1); + close(fd); return (EX_OK); } -static int -open_uart(const char *dev) +static void +sethow(int h) { - char buf[PATH_MAX]; - int fd; - fd = open(dev, O_RDWR | O_NONBLOCK); - if (fd == -1) { - if (errno == ENOENT) { - snprintf(buf, PATH_MAX, "/dev/%s", dev); - fd = open(buf, O_RDWR | O_NONBLOCK); - if (fd == -1) - warn("opening `%s' and `%s'", dev, buf); - } else - warn("opening `%s'", dev); - } - return (fd); + if (how != 0) + usage(); + how = h; } -static int +static void usage(void) { - fprintf(stderr, "usage: %s <dte-device> <dce-device>\n", - getprogname()); - return (EX_USAGE); + fprintf(stderr, "usage: %s -[c|l|t] <device>\n", getprogname()); + exit(EX_USAGE); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200309040516.h845GnMQ061401>