From deec83a4eeddd5c3b2d4df041aede2bceb8867da Mon Sep 17 00:00:00 2001 From: Martin Lund Date: Sat, 28 May 2016 16:02:21 +0200 Subject: [PATCH] Added support for non-standard baud rates Only enabled when possible, that is, when the BOTHER definition is available. It is untested but it should work as described here: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=683826 Some Cypress USB<->serial devices supposedly supports arbitrary speeds. --- configure.ac | 3 +++ src/tty.c | 28 +++++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index b8a0e17..e80cb75 100644 --- a/configure.ac +++ b/configure.ac @@ -87,6 +87,9 @@ TIO_CHECK_BAUDRATES( AC_DEFINE_UNQUOTED([AUTOCONF_BAUDRATE_CASES],[$BAUDRATE_CASES],[Switch cases for detected baud rates]) +# Check that it is possible to set arbitrary baud rates using BOTHER +AC_CHECK_DECLS([BOTHER], [], [], [[#include ]]) + AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([src/Makefile]) AC_CONFIG_FILES([src/bash-completion/tio]) diff --git a/src/tty.c b/src/tty.c index f60d8da..fccd5ff 100644 --- a/src/tty.c +++ b/src/tty.c @@ -45,8 +45,13 @@ static struct termios tio, new_stdout, old_stdout, old_tio; static unsigned long rx_total = 0, tx_total = 0; static bool connected = false; static bool tainted = false; +static bool standard_baudrate = true; static int fd; +#ifndef BOTHER +#define BOTHER 0010000 +#endif + #define tio_printf(format, args...) \ { \ if (tainted) putchar('\n'); \ @@ -156,7 +161,7 @@ void stdout_restore(void) void tty_configure(void) { - speed_t baudrate; + speed_t baudrate = 0; memset(&tio, 0, sizeof(tio)); @@ -177,12 +182,25 @@ void tty_configure(void) AUTOCONF_BAUDRATE_CASES default: +#if !HAVE_DECL_BOTHER error_printf("Invalid baud rate"); exit(EXIT_FAILURE); +#else + standard_baudrate = false; + break; +#endif } - cfsetispeed(&tio, baudrate); - cfsetospeed(&tio, baudrate); + if (standard_baudrate) + { + cfsetispeed(&tio, baudrate); + cfsetospeed(&tio, baudrate); + } else + { + tio.c_ispeed = tio.c_ospeed = baudrate; + tio.c_cflag &= ~CBAUD; + tio.c_cflag |= BOTHER; + } /* Set databits */ tio.c_cflag &= ~CSIZE; @@ -374,6 +392,10 @@ int tty_connect(void) /* Flush stale I/O data (if any) */ tcflush(fd, TCIOFLUSH); + /* Warn if non standard baud rate is used */ + if (!standard_baudrate) + tio_printf("Warning: Using a non standard baud rate"); + /* Print connect status */ tio_printf("Connected"); connected = true;