X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=linux_termios.c;h=9e25f2797b6c5431535fe9663590f72d0cf59d79;hb=48a4076f692ffe34026c37815580a32b2f70592b;hp=68c98e002f16ec7dd0c6b5ffbac1d87e4a4d5ff5;hpb=7a6d2196e043a7de86a5675f9fffa0ff0ec33e72;p=libserialport.git diff --git a/linux_termios.c b/linux_termios.c index 68c98e0..9e25f27 100644 --- a/linux_termios.c +++ b/linux_termios.c @@ -17,6 +17,22 @@ * along with this program. If not, see . */ +/* + * At the time of writing, glibc does not support the Linux kernel interfaces + * for setting non-standard baud rates and flow control. We therefore have to + * prepare the correct ioctls ourselves, for which we need the declarations in + * linux/termios.h. + * + * We can't include linux/termios.h in serialport.c however, because its + * contents conflict with the termios.h provided by glibc. So this file exists + * to isolate the bits of code which use the kernel termios declarations. + * + * The details vary by architecture. Some architectures have c_ispeed/c_ospeed + * in struct termios, accessed with TCSETS/TCGETS. Others have these fields in + * struct termios2, accessed with TCSETS2/TCGETS2. Some architectures have the + * TCSETX/TCGETX ioctls used with struct termiox, others do not. + */ + #include #include "linux_termios.h" @@ -47,6 +63,7 @@ int get_termios_size(void) #endif } +#if defined(HAVE_TERMIOS_SPEED) || defined(HAVE_TERMIOS2_SPEED) int get_termios_speed(void *data) { #ifdef HAVE_TERMIOS2 @@ -71,3 +88,40 @@ void set_termios_speed(void *data, int speed) term->c_cflag |= BOTHER; term->c_ispeed = term->c_ospeed = speed; } +#endif + +#ifdef HAVE_TERMIOX +int get_termiox_size(void) +{ + return sizeof(struct termiox); +} + +int get_termiox_flow(void *data, int *rts, int *cts, int *dtr, int *dsr) +{ + struct termiox *termx = (struct termiox *) data; + int flags = 0; + + *rts = (termx->x_cflag & RTSXOFF); + *cts = (termx->x_cflag & CTSXON); + *dtr = (termx->x_cflag & DTRXOFF); + *dsr = (termx->x_cflag & DSRXON); + + return flags; +} + +void set_termiox_flow(void *data, int rts, int cts, int dtr, int dsr) +{ + struct termiox *termx = (struct termiox *) data; + + termx->x_cflag &= ~(RTSXOFF | CTSXON | DTRXOFF | DSRXON); + + if (rts) + termx->x_cflag |= RTSXOFF; + if (cts) + termx->x_cflag |= CTSXON; + if (dtr) + termx->x_cflag |= DTRXOFF; + if (dsr) + termx->x_cflag |= DSRXON; +} +#endif