[PATCH v3 2/5] Modify termios to support dedicated input and output baud rates for termios structure
Kevin Kirspel
kevin-kirspel at idexx.com
Tue Mar 21 19:39:49 UTC 2017
---
cpukit/libcsupport/Makefile.am | 2 +-
cpukit/libcsupport/include/rtems/termiostypes.h | 8 +-
cpukit/libcsupport/include/sys/ioccom.h | 11 -
cpukit/libcsupport/include/sys/termios.h | 280 +++++++-----------------
cpukit/libcsupport/include/sys/ttycom.h | 6 +-
cpukit/libcsupport/src/cfgetispeed.c | 2 +-
cpukit/libcsupport/src/cfgetospeed.c | 2 +-
cpukit/libcsupport/src/cfmakeraw.c | 10 +-
cpukit/libcsupport/src/cfsetispeed.c | 7 +-
cpukit/libcsupport/src/cfsetospeed.c | 7 +-
cpukit/libcsupport/src/cfsetspeed.c | 3 +-
cpukit/libcsupport/src/tcdrain.c | 2 +-
cpukit/libcsupport/src/tcflush.c | 23 +-
cpukit/libcsupport/src/tcgetattr.c | 2 +-
cpukit/libcsupport/src/tcsetattr.c | 35 +--
cpukit/libcsupport/src/termios.c | 44 ++--
cpukit/libcsupport/src/termios_baud2index.c | 13 +-
cpukit/libcsupport/src/termios_baud2num.c | 6 +-
cpukit/libcsupport/src/termios_baudtable.c | 5 +
cpukit/libcsupport/src/termios_setbestbaud.c | 10 +-
cpukit/libcsupport/src/termios_setinitialbaud.c | 9 +-
cpukit/libnetworking/net/ppp_tty.c | 15 +-
cpukit/preinstall.am | 8 +
23 files changed, 217 insertions(+), 293 deletions(-)
diff --git a/cpukit/libcsupport/Makefile.am b/cpukit/libcsupport/Makefile.am
index 43d34c4..14b3b5a 100644
--- a/cpukit/libcsupport/Makefile.am
+++ b/cpukit/libcsupport/Makefile.am
@@ -54,7 +54,7 @@ TERMIOS_C_FILES = src/cfgetispeed.c src/cfgetospeed.c src/cfsetispeed.c \
src/tcsetpgrp.c src/termios.c src/termiosinitialize.c \
src/termios_baud2index.c src/termios_baud2num.c src/termios_num2baud.c \
src/termios_setinitialbaud.c src/termios_baudtable.c src/cfsetspeed.c \
- src/cfmakeraw.c src/termios_setbestbaud.c
+ src/cfmakeraw.c src/cfmakesane.c src/termios_setbestbaud.c
SYSTEM_CALL_C_FILES = src/open.c src/close.c src/read.c src/write.c \
src/write_r.c \
diff --git a/cpukit/libcsupport/include/rtems/termiostypes.h b/cpukit/libcsupport/include/rtems/termiostypes.h
index 5240b85..f68de0c 100644
--- a/cpukit/libcsupport/include/rtems/termiostypes.h
+++ b/cpukit/libcsupport/include/rtems/termiostypes.h
@@ -527,7 +527,7 @@ extern const rtems_assoc_t rtems_termios_baud_table [];
* @retval B0 Invalid baud value or a baud value of 0.
* @retval other Baud constant according to @a baud.
*/
-tcflag_t rtems_termios_number_to_baud(rtems_termios_baud_t baud);
+speed_t rtems_termios_number_to_baud(rtems_termios_baud_t baud);
/**
* @brief Convert Baud Part of Termios control flags to an integral Baud Value
@@ -537,10 +537,10 @@ tcflag_t rtems_termios_number_to_baud(rtems_termios_baud_t baud);
* @retval 0 Invalid baud value or a baud value of @c B0.
* @retval other Integral baud value.
*/
-rtems_termios_baud_t rtems_termios_baud_to_number(tcflag_t c_cflag);
+rtems_termios_baud_t rtems_termios_baud_to_number(speed_t c_cflag);
-/**
- * @brief Convert Bxxx Constant to Index
+/**
+ * @brief Convert Bxxx Constant to Index
*/
int rtems_termios_baud_to_index(rtems_termios_baud_t termios_baud);
diff --git a/cpukit/libcsupport/include/sys/ioccom.h b/cpukit/libcsupport/include/sys/ioccom.h
index 1699fc9..393702d 100644
--- a/cpukit/libcsupport/include/sys/ioccom.h
+++ b/cpukit/libcsupport/include/sys/ioccom.h
@@ -69,17 +69,6 @@ typedef uint32_t ioctl_command_t;
/* this should be _IORW, but stdio got there first */
#define _IOWR(g,n,t) _IOC(IOC_INOUT, (g), (n), sizeof(t))
-/*
- * IOCTL values
- */
-
-#define RTEMS_IO_GET_ATTRIBUTES 1
-#define RTEMS_IO_SET_ATTRIBUTES 2
-#define RTEMS_IO_TCDRAIN 3
-#define RTEMS_IO_RCVWAKEUP 4
-#define RTEMS_IO_SNDWAKEUP 5
-#define RTEMS_IO_TCFLUSH 6
-
#ifdef _KERNEL
#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
diff --git a/cpukit/libcsupport/include/sys/termios.h b/cpukit/libcsupport/include/sys/termios.h
index 648e3a2..7568b96 100644
--- a/cpukit/libcsupport/include/sys/termios.h
+++ b/cpukit/libcsupport/include/sys/termios.h
@@ -1,221 +1,101 @@
-/**
- * @file
+/*-
+ * Copyright (c) 1988, 1989, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
*
- * @brief POSIX Termios Implementation for RTEMS Console Device Driver
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
*
- * The Open Group Base Specifications Issue 6
- * IEEE Std 1003.1, 2004 Edition
- * Chapter 11, General Terminal Interface
- */
-
-/*
- * COPYRIGHT (c) 1989-2011.
- * On-Line Applications Research Corporation (OAR).
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
*
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
+ * @(#)termios.h 8.3 (Berkeley) 3/28/94
+ * $FreeBSD: head/include/termios.h 265878 2014-05-11 13:48:21Z jilles $
*/
-#ifndef TERMIOS_H
-#define TERMIOS_H
+#ifndef _TERMIOS_H_
+#define _TERMIOS_H_
-#include <sys/types.h>
+#include <sys/cdefs.h>
+#include <sys/_termios.h>
+#include <sys/_types.h>
-#ifdef __cplusplus
-extern "C" {
+#ifndef _PID_T_DECLARED
+typedef __pid_t pid_t;
+#define _PID_T_DECLARED
#endif
-/**
- * @ingroup Termios
- *
- * @brief POSIX Termios Implementation
- *
- */
-/**@{**/
-
-typedef unsigned char cc_t;
-typedef unsigned int speed_t;
-typedef unsigned int tcflag_t;
+#if !_POSIX_SOURCE || __rtems__
+#define OXTABS TAB3
+#define MDMBUF CCAR_OFLOW
+#endif
-#define NCCS 19
-struct termios {
- tcflag_t c_iflag; /* input mode flags */
- tcflag_t c_oflag; /* output mode flags */
- tcflag_t c_cflag; /* control mode flags */
- tcflag_t c_lflag; /* local mode flags */
- cc_t c_line; /* line discipline */
- cc_t c_cc[NCCS]; /* control characters */
-};
+#if !_POSIX_SOURCE || __rtems__
+#define CCEQ(val, c) ((c) == (val) && (val) != _POSIX_VDISABLE)
+#endif
-/**
- * This value is used to disable processing of a member of c_cc
- * in the struct termios.
+/*
+ * Commands passed to tcsetattr() for setting the termios structure.
*/
-#define _POSIX_VDISABLE 0
-
-/* c_cc characters */
-#define VINTR 0
-#define VQUIT 1
-#define VERASE 2
-#define VKILL 3
-#define VEOF 4
-#define VTIME 5
-#define VMIN 6
-#define VSWTC 7
-#define VSTART 8
-#define VSTOP 9
-#define VSUSP 10
-#define VEOL 11
-#define VREPRINT 12
-#define VDISCARD 13
-#define VWERASE 14
-#define VLNEXT 15
-#define VEOL2 16
-
-/* c_iflag bits */
-#define IGNBRK 0000001
-#define BRKINT 0000002
-#define IGNPAR 0000004
-#define PARMRK 0000010
-#define INPCK 0000020
-#define ISTRIP 0000040
-#define INLCR 0000100
-#define IGNCR 0000200
-#define ICRNL 0000400
-#define IUCLC 0001000
-#define IXON 0002000
-#define IXANY 0004000
-#define IXOFF 0010000
-#define IMAXBEL 0020000
-
-/* c_oflag bits */
-#define OPOST 0000001
-#define OLCUC 0000002
-#define ONLCR 0000004
-#define OCRNL 0000010
-#define ONOCR 0000020
-#define ONLRET 0000040
-#define OFILL 0000100
-#define OFDEL 0000200
-#define NLDLY 0000400
-#define NL0 0000000
-#define NL1 0000400
-#define CRDLY 0003000
-#define CR0 0000000
-#define CR1 0001000
-#define CR2 0002000
-#define CR3 0003000
-#define TABDLY 0014000
-#define TAB0 0000000
-#define TAB1 0004000
-#define TAB2 0010000
-#define TAB3 0014000
-#define XTABS 0014000
-#define BSDLY 0020000
-#define BS0 0000000
-#define BS1 0020000
-#define VTDLY 0040000
-#define VT0 0000000
-#define VT1 0040000
-#define FFDLY 0100000
-#define FF0 0000000
-#define FF1 0100000
-
-/* c_cflag bit meaning */
-#define CBAUD 0010017
-#define B0 0000000 /* hang up */
-#define B50 0000001
-#define B75 0000002
-#define B110 0000003
-#define B134 0000004
-#define B150 0000005
-#define B200 0000006
-#define B300 0000007
-#define B600 0000010
-#define B1200 0000011
-#define B1800 0000012
-#define B2400 0000013
-#define B4800 0000014
-#define B9600 0000015
-#define B19200 0000016
-#define B38400 0000017
-#define EXTA B19200
-#define EXTB B38400
-#define CSIZE 0000060
-#define CS5 0000000
-#define CS6 0000020
-#define CS7 0000040
-#define CS8 0000060
-#define CSTOPB 0000100
-#define CREAD 0000200
-#define PARENB 0000400
-#define PARODD 0001000
-#define HUPCL 0002000
-#define CLOCAL 0004000
-#define CBAUDEX 0010000
-#define B57600 0010001
-#define B115200 0010002
-#define B230400 0010003
-#define B460800 0010004
-#define CIBAUD 002003600000 /* input baud rate (not used) */
-#define CRTSCTS 020000000000 /* flow control */
-
-#define RTEMS_TERMIOS_NUMBER_BAUD_RATES 20
-
-/* c_lflag bits */
-#define ISIG 0000001
-#define ICANON 0000002
-#define XCASE 0000004
-#define ECHO 0000010
-#define ECHOE 0000020
-#define ECHOK 0000040
-#define ECHONL 0000100
-#define NOFLSH 0000200
-#define TOSTOP 0000400
-#define ECHOCTL 0001000
-#define ECHOPRT 0002000
-#define ECHOKE 0004000
-#define FLUSHO 0010000
-#define PENDIN 0040000
-#define IEXTEN 0100000
-
-/* tcflow() and TCXONC use these */
-#define TCOOFF 0
-#define TCOON 1
-#define TCIOFF 2
-#define TCION 3
-
-/* tcflush() and TCFLSH use these */
-#define TCIFLUSH 0
-#define TCOFLUSH 1
-#define TCIOFLUSH 2
-
-/* tcsetattr uses these */
-#define TCSANOW 0
-#define TCSADRAIN 1
-#define TCSAFLUSH 2
+#define TCSANOW 0 /* make change immediate */
+#define TCSADRAIN 1 /* drain output, then change */
+#define TCSAFLUSH 2 /* drain output, flush input */
+#if !_POSIX_SOURCE || __rtems__
+#define TCSASOFT 0x10 /* flag - don't alter h.w. state */
+#endif
+#define TCIFLUSH 1
+#define TCOFLUSH 2
+#define TCIOFLUSH 3
+#define TCOOFF 1
+#define TCOON 2
+#define TCIOFF 3
+#define TCION 4
+
+__BEGIN_DECLS
+speed_t cfgetispeed(const struct termios *);
+speed_t cfgetospeed(const struct termios *);
+int cfsetispeed(struct termios *, speed_t);
+int cfsetospeed(struct termios *, speed_t);
+int tcgetattr(int, struct termios *);
+int tcsetattr(int, int, const struct termios *);
int tcdrain(int);
int tcflow(int, int);
int tcflush(int, int);
-int tcgetattr(int, struct termios *);
-int tcsetattr(int, int, struct termios *);
-int tcdrain(int);
-pid_t tcgetprgrp(int);
-int tcsetprgrp(int, pid_t);
int tcsendbreak(int, int);
-speed_t cfgetospeed(const struct termios *tp);
-int cfsetospeed(struct termios *tp, speed_t speed);
-speed_t cfgetispeed(const struct termios *tp);
-int cfsetispeed(struct termios *tp, speed_t speed);
-void cfmakeraw(struct termios *tp);
-int cfsetspeed(struct termios *tp, speed_t speed);
-/** @} */
+#if __POSIX_VISIBLE >= 200112
+pid_t tcgetsid(int);
+#endif
+#if __BSD_VISIBLE
+int tcsetsid(int, pid_t);
-#ifdef __cplusplus
-}
+void cfmakeraw(struct termios *);
+void cfmakesane(struct termios *);
+int cfsetspeed(struct termios *, speed_t);
#endif
+__END_DECLS
+
+#endif /* !_TERMIOS_H_ */
-#endif /* TERMIOS_H */
+#if !_POSIX_SOURCE || __rtems__
+#include <sys/ttycom.h>
+#include <sys/ttydefaults.h>
+#endif
diff --git a/cpukit/libcsupport/include/sys/ttycom.h b/cpukit/libcsupport/include/sys/ttycom.h
index f89a8e0..823ce3d 100644
--- a/cpukit/libcsupport/include/sys/ttycom.h
+++ b/cpukit/libcsupport/include/sys/ttycom.h
@@ -60,7 +60,11 @@ struct winsize {
/* 3-7 unused */
/* 8-10 compat */
/* 11-12 unused */
-#define TIOCEXCL _IO('t', 13) /* set exclusive use of tty */
+#ifdef __rtems__
+#define RTEMS_IO_SNDWAKEUP _IOW('t', 11, struct ttywakeup ) /* send tty wakeup */
+#define RTEMS_IO_RCVWAKEUP _IOW('t', 12, struct ttywakeup ) /* recv tty wakeup */
+#endif /* __rtems__ */
+#define TIOCEXCL _IO('t', 13) /* set exclusive use of tty */
#define TIOCNXCL _IO('t', 14) /* reset exclusive use of tty */
#define TIOCGPTN _IOR('t', 15, int) /* Get pts number. */
#define TIOCFLUSH _IOW('t', 16, int) /* flush buffers */
diff --git a/cpukit/libcsupport/src/cfgetispeed.c b/cpukit/libcsupport/src/cfgetispeed.c
index 8e9b186..f551e27 100644
--- a/cpukit/libcsupport/src/cfgetispeed.c
+++ b/cpukit/libcsupport/src/cfgetispeed.c
@@ -30,6 +30,6 @@ speed_t cfgetispeed(
const struct termios *tp
)
{
- return (tp->c_cflag / (CIBAUD / CBAUD)) & CBAUD;
+ return tp->c_ispeed;
}
#endif
diff --git a/cpukit/libcsupport/src/cfgetospeed.c b/cpukit/libcsupport/src/cfgetospeed.c
index 399d64f..96446c7 100644
--- a/cpukit/libcsupport/src/cfgetospeed.c
+++ b/cpukit/libcsupport/src/cfgetospeed.c
@@ -33,6 +33,6 @@ speed_t cfgetospeed(
const struct termios *tp
)
{
- return tp->c_cflag & CBAUD;
+ return tp->c_ospeed;
}
#endif
diff --git a/cpukit/libcsupport/src/cfmakeraw.c b/cpukit/libcsupport/src/cfmakeraw.c
index 3027df8..c335b92 100644
--- a/cpukit/libcsupport/src/cfmakeraw.c
+++ b/cpukit/libcsupport/src/cfmakeraw.c
@@ -54,11 +54,13 @@ cfmakeraw(
struct termios *tp
)
{
- tp->c_iflag &= ~(IMAXBEL|IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
+ tp->c_iflag &= ~(IMAXBEL|IXOFF|INPCK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON|IGNPAR);
+ tp->c_iflag |= IGNBRK;
tp->c_oflag &= ~OPOST;
- tp->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
+ tp->c_lflag &= ~(ECHO|ECHOE|ECHOK|ECHONL|ICANON|ISIG|IEXTEN|NOFLSH|TOSTOP|PENDIN);
tp->c_cflag &= ~(CSIZE|PARENB);
- tp->c_cflag |= CS8;
- /* XXX set MIN/TIME */
+ tp->c_cflag |= CS8|CREAD;
+ tp->c_cc[VMIN] = 1;
+ tp->c_cc[VTIME] = 0;
}
#endif
diff --git a/cpukit/libcsupport/src/cfsetispeed.c b/cpukit/libcsupport/src/cfsetispeed.c
index d3a031c..14e67b9 100644
--- a/cpukit/libcsupport/src/cfsetispeed.c
+++ b/cpukit/libcsupport/src/cfsetispeed.c
@@ -25,8 +25,7 @@
#include <sys/stat.h>
#include <errno.h>
#include <termios.h>
-
-#include <rtems/libio_.h>
+#include <rtems/termiostypes.h>
#include <rtems/seterr.h>
/**
@@ -37,10 +36,10 @@ int cfsetispeed(
speed_t speed
)
{
- if ( speed & ~CBAUD )
+ if ( rtems_termios_baud_to_index( speed ) == -1 )
rtems_set_errno_and_return_minus_one( EINVAL );
- tp->c_cflag = (tp->c_cflag & ~CIBAUD) | (speed * (CIBAUD / CBAUD));
+ tp->c_ispeed = speed;
return 0;
}
#endif
diff --git a/cpukit/libcsupport/src/cfsetospeed.c b/cpukit/libcsupport/src/cfsetospeed.c
index 36e3d99..41a232a 100644
--- a/cpukit/libcsupport/src/cfsetospeed.c
+++ b/cpukit/libcsupport/src/cfsetospeed.c
@@ -25,8 +25,7 @@
#include <sys/stat.h>
#include <errno.h>
#include <termios.h>
-
-#include <rtems/libio_.h>
+#include <rtems/termiostypes.h>
#include <rtems/seterr.h>
/**
@@ -37,10 +36,10 @@ int cfsetospeed(
speed_t speed
)
{
- if ( speed & ~CBAUD )
+ if ( rtems_termios_baud_to_index( speed ) == -1 )
rtems_set_errno_and_return_minus_one( EINVAL );
- tp->c_cflag = (tp->c_cflag & ~CBAUD) | speed;
+ tp->c_ospeed = speed;
return 0;
}
#endif
diff --git a/cpukit/libcsupport/src/cfsetspeed.c b/cpukit/libcsupport/src/cfsetspeed.c
index 293ff6e..0d37840 100644
--- a/cpukit/libcsupport/src/cfsetspeed.c
+++ b/cpukit/libcsupport/src/cfsetspeed.c
@@ -24,6 +24,7 @@
#include <sys/stat.h>
#include <errno.h>
#include <termios.h>
+#include <rtems/termiostypes.h>
#include <rtems/seterr.h>
int cfsetspeed(
@@ -31,7 +32,7 @@ int cfsetspeed(
speed_t speed
)
{
- if ( speed & ~CBAUD )
+ if ( rtems_termios_baud_to_index( speed ) == -1 )
rtems_set_errno_and_return_minus_one( EINVAL );
cfsetispeed( tp, speed );
diff --git a/cpukit/libcsupport/src/tcdrain.c b/cpukit/libcsupport/src/tcdrain.c
index b10d79c..7f049aa 100644
--- a/cpukit/libcsupport/src/tcdrain.c
+++ b/cpukit/libcsupport/src/tcdrain.c
@@ -36,7 +36,7 @@ int tcdrain(
int fd
)
{
- return ioctl( fd, RTEMS_IO_TCDRAIN, 0 );
+ return ioctl( fd, TIOCDRAIN, 0 );
}
#endif
diff --git a/cpukit/libcsupport/src/tcflush.c b/cpukit/libcsupport/src/tcflush.c
index eacae1c..cd781cf 100644
--- a/cpukit/libcsupport/src/tcflush.c
+++ b/cpukit/libcsupport/src/tcflush.c
@@ -13,11 +13,30 @@
#include "config.h"
#endif
+#include <sys/fcntl.h>
#include <termios.h>
#include <stdint.h>
#include <sys/ioccom.h>
+#include <rtems/libio.h>
+#include <rtems/libio_.h>
+#include <rtems/seterr.h>
-int tcflush( int fd, int queue )
+int tcflush( int fd, int which )
{
- return ioctl( fd, RTEMS_IO_TCFLUSH, (intptr_t) queue );
+ int com;
+
+ switch (which) {
+ case TCIFLUSH:
+ com = FREAD;
+ break;
+ case TCOFLUSH:
+ com = FWRITE;
+ break;
+ case TCIOFLUSH:
+ com = FREAD | FWRITE;
+ break;
+ default:
+ rtems_set_errno_and_return_minus_one( EINVAL );
+ }
+ return ioctl( fd, TIOCFLUSH, &com );
}
diff --git a/cpukit/libcsupport/src/tcgetattr.c b/cpukit/libcsupport/src/tcgetattr.c
index 11ee593..c8c0e84 100644
--- a/cpukit/libcsupport/src/tcgetattr.c
+++ b/cpukit/libcsupport/src/tcgetattr.c
@@ -34,6 +34,6 @@ int tcgetattr(
struct termios *tp
)
{
- return ioctl( fd, RTEMS_IO_GET_ATTRIBUTES, tp );
+ return ioctl( fd, TIOCGETA, tp );
}
#endif
diff --git a/cpukit/libcsupport/src/tcsetattr.c b/cpukit/libcsupport/src/tcsetattr.c
index 556abee..6b6afda 100644
--- a/cpukit/libcsupport/src/tcsetattr.c
+++ b/cpukit/libcsupport/src/tcsetattr.c
@@ -35,23 +35,32 @@
* POSIX 1003.1b 7.2.1 - Get and Set State
*/
int tcsetattr(
- int fd,
- int opt,
- struct termios *tp
+ int fd,
+ int opt,
+ const struct termios *tp
)
{
- switch (opt) {
- default:
- rtems_set_errno_and_return_minus_one( ENOTSUP );
+ struct termios localterm;
+
+ if (opt & TCSASOFT) {
+ localterm = *tp;
+ localterm.c_cflag |= CIGNORE;
+ tp = &localterm;
+ }
+
+ switch (opt & ~TCSASOFT) {
- case TCSADRAIN:
- if (ioctl( fd, RTEMS_IO_TCDRAIN, NULL ) < 0)
- return -1;
- /*
- * Fall through to....
- */
case TCSANOW:
- return ioctl( fd, RTEMS_IO_SET_ATTRIBUTES, tp );
+ return ioctl( fd, TIOCSETA, tp );
+
+ case TCSADRAIN:
+ return ioctl( fd, TIOCSETAW, tp );
+
+ case TCSAFLUSH:
+ return ioctl( fd, TIOCSETAF, tp );
+
+ default:
+ rtems_set_errno_and_return_minus_one( EINVAL );
}
}
#endif
diff --git a/cpukit/libcsupport/src/termios.c b/cpukit/libcsupport/src/termios.c
index 9eace2e..a7944ec 100644
--- a/cpukit/libcsupport/src/termios.c
+++ b/cpukit/libcsupport/src/termios.c
@@ -30,6 +30,7 @@
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>
+#include <sys/fcntl.h>
#include <sys/ttycom.h>
#include <rtems/termiostypes.h>
@@ -846,6 +847,7 @@ rtems_termios_ioctl (void *arg)
struct rtems_termios_tty *tty = args->iop->data1;
struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer;
rtems_status_code sc;
+ int flags = *((int *)args->buffer);
args->ioctl_return = 0;
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
@@ -865,13 +867,21 @@ rtems_termios_ioctl (void *arg)
}
break;
- case RTEMS_IO_GET_ATTRIBUTES:
+ case TIOCGETA:
*(struct termios *)args->buffer = tty->termios;
break;
- case RTEMS_IO_SET_ATTRIBUTES:
+ case TIOCSETA:
+ case TIOCSETAW:
+ case TIOCSETAF:
tty->termios = *(struct termios *)args->buffer;
+ if (args->command == TIOCSETAW || args->command == TIOCSETAF) {
+ drainOutput (tty);
+ if (args->command == TIOCSETAF) {
+ flushInput (tty);
+ }
+ }
/* check for and process change in flow control options */
termios_set_flowctrl(tty);
@@ -880,7 +890,7 @@ rtems_termios_ioctl (void *arg)
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
} else {
- tty->vtimeTicks = tty->termios.c_cc[VTIME] *
+ tty->vtimeTicks = tty->termios.c_cc[VTIME] *
rtems_clock_get_ticks_per_second() / 10;
if (tty->termios.c_cc[VTIME]) {
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
@@ -905,25 +915,21 @@ rtems_termios_ioctl (void *arg)
}
break;
- case RTEMS_IO_TCDRAIN:
+ case TIOCDRAIN:
drainOutput (tty);
break;
- case RTEMS_IO_TCFLUSH:
- switch ((intptr_t) args->buffer) {
- case TCIFLUSH:
- flushInput (tty);
- break;
- case TCOFLUSH:
- flushOutput (tty);
- break;
- case TCIOFLUSH:
- flushOutput (tty);
- flushInput (tty);
- break;
- default:
- sc = RTEMS_INVALID_NAME;
- break;
+ case TIOCFLUSH:
+ if (flags == 0) {
+ flags = FREAD | FWRITE;
+ } else {
+ flags &= FREAD | FWRITE;
+ }
+ if (flags & FWRITE) {
+ flushOutput (tty);
+ }
+ if (flags & FREAD) {
+ flushInput (tty);
}
break;
diff --git a/cpukit/libcsupport/src/termios_baud2index.c b/cpukit/libcsupport/src/termios_baud2index.c
index 625a714..569ac5c 100644
--- a/cpukit/libcsupport/src/termios_baud2index.c
+++ b/cpukit/libcsupport/src/termios_baud2index.c
@@ -44,10 +44,15 @@ int rtems_termios_baud_to_index(
case B9600: baud_index = 13; break;
case B19200: baud_index = 14; break;
case B38400: baud_index = 15; break;
- case B57600: baud_index = 16; break;
- case B115200: baud_index = 17; break;
- case B230400: baud_index = 18; break;
- case B460800: baud_index = 19; break;
+ case B7200: baud_index = 16; break;
+ case B14400: baud_index = 17; break;
+ case B28800: baud_index = 18; break;
+ case B57600: baud_index = 19; break;
+ case B76800: baud_index = 20; break;
+ case B115200: baud_index = 21; break;
+ case B230400: baud_index = 22; break;
+ case B460800: baud_index = 23; break;
+ case B921600: baud_index = 24; break;
default: baud_index = -1; break;
}
diff --git a/cpukit/libcsupport/src/termios_baud2num.c b/cpukit/libcsupport/src/termios_baud2num.c
index 07e6446..4c80949 100644
--- a/cpukit/libcsupport/src/termios_baud2num.c
+++ b/cpukit/libcsupport/src/termios_baud2num.c
@@ -20,9 +20,7 @@
#include <rtems/termiostypes.h>
-rtems_termios_baud_t rtems_termios_baud_to_number(tcflag_t c_cflag)
+rtems_termios_baud_t rtems_termios_baud_to_number(speed_t spd)
{
- uint32_t remote_value = (uint32_t) (c_cflag & CBAUD);
-
- return rtems_assoc_local_by_remote(rtems_termios_baud_table, remote_value);
+ return rtems_assoc_local_by_remote(rtems_termios_baud_table, spd);
}
diff --git a/cpukit/libcsupport/src/termios_baudtable.c b/cpukit/libcsupport/src/termios_baudtable.c
index 74fc492..c2a1859 100644
--- a/cpukit/libcsupport/src/termios_baudtable.c
+++ b/cpukit/libcsupport/src/termios_baudtable.c
@@ -37,9 +37,14 @@ const rtems_assoc_t rtems_termios_baud_table [] = {
{ "B9600", 9600, B9600 },
{ "B19200", 19200, B19200 },
{ "B38400", 38400, B38400 },
+ { "B7200", 7200, B7200 },
+ { "B14400", 14400, B14400 },
+ { "B28800", 28800, B28800 },
{ "B57600", 57600, B57600 },
+ { "B76800", 76800, B76800 },
{ "B115200", 115200, B115200 },
{ "B230400", 230400, B230400 },
{ "B460800", 460800, B460800 },
+ { "B921600", 921600, B921600 },
{ NULL, 0, 0 }
};
diff --git a/cpukit/libcsupport/src/termios_setbestbaud.c b/cpukit/libcsupport/src/termios_setbestbaud.c
index 7680118..d6dcd7f 100644
--- a/cpukit/libcsupport/src/termios_setbestbaud.c
+++ b/cpukit/libcsupport/src/termios_setbestbaud.c
@@ -25,8 +25,7 @@ void rtems_termios_set_best_baud(
{
const rtems_assoc_t *current = &rtems_termios_baud_table[ 0 ];
const rtems_assoc_t *last = current;
- tcflag_t cbaud_mask = CBAUD;
- tcflag_t cbaud;
+ speed_t spd;
while ( current->name != NULL && current->local_value < baud ) {
last = current;
@@ -36,10 +35,11 @@ void rtems_termios_set_best_baud(
if ( current->name != NULL ) {
uint32_t mid = (last->local_value + current->local_value) / UINT32_C( 2 );
- cbaud = baud <= mid ? last->remote_value : current->remote_value;
+ spd = baud <= mid ? last->remote_value : current->remote_value;
} else {
- cbaud = B460800;
+ spd = B460800;
}
- term->c_cflag = (term->c_cflag & ~cbaud_mask) | cbaud;
+ term->c_ispeed = spd;
+ term->c_ospeed = spd;
}
diff --git a/cpukit/libcsupport/src/termios_setinitialbaud.c b/cpukit/libcsupport/src/termios_setinitialbaud.c
index c3e8e57..3b8853f 100644
--- a/cpukit/libcsupport/src/termios_setinitialbaud.c
+++ b/cpukit/libcsupport/src/termios_setinitialbaud.c
@@ -26,12 +26,11 @@ int rtems_termios_set_initial_baud(
)
{
int rv = 0;
- tcflag_t c_cflag_baud = rtems_termios_number_to_baud(baud);
+ speed_t spd = rtems_termios_number_to_baud(baud);
- if ( c_cflag_baud != 0 ) {
- tcflag_t cbaud = CBAUD;
-
- tty->termios.c_cflag = (tty->termios.c_cflag & ~cbaud) | c_cflag_baud;
+ if ( spd != 0 ) {
+ tty->termios.c_ispeed = spd;
+ tty->termios.c_ospeed = spd;
} else {
rv = -1;
}
diff --git a/cpukit/libnetworking/net/ppp_tty.c b/cpukit/libnetworking/net/ppp_tty.c
index 45fb499..e68124c 100644
--- a/cpukit/libnetworking/net/ppp_tty.c
+++ b/cpukit/libnetworking/net/ppp_tty.c
@@ -224,7 +224,7 @@ pppopen(struct rtems_termios_tty *tty)
sc->sc_relinq = pppasyncrelinq;
sc->sc_outm = NULL;
sc->sc_outmc = NULL;
-
+
/* preallocate mbufs for free queue */
rtems_bsdnet_semaphore_obtain();
for (i=0; i<NUM_MBUFQ; i++) {
@@ -243,8 +243,7 @@ pppopen(struct rtems_termios_tty *tty)
/* initialize values */
sc->sc_if.if_flags |= IFF_RUNNING;
- sc->sc_if.if_baudrate =
- rtems_termios_baud_to_number(tty->termios.c_cflag & CBAUD);
+ sc->sc_if.if_baudrate = tty->termios.c_ispeed;
tty->t_sc = (void *)sc;
@@ -374,7 +373,7 @@ pppwrite(struct rtems_termios_tty *tty, rtems_libio_rw_args_t *rw_args)
int n;
int len;
int maximum = rw_args->count;
- char *out_buffer = rw_args->buffer;
+ char *out_buffer = rw_args->buffer;
register struct ppp_softc *sc = (struct ppp_softc *)tty->t_sc;
struct mbuf *m;
struct mbuf *m0;
@@ -432,9 +431,11 @@ ppptioctl(struct rtems_termios_tty *tty, rtems_libio_ioctl_args_t *args)
struct ppp_softc *sc = tty->t_sc;
switch (cmd) {
- case RTEMS_IO_GET_ATTRIBUTES:
- case RTEMS_IO_SET_ATTRIBUTES:
- case RTEMS_IO_TCDRAIN:
+ case TIOCGETA:
+ case TIOCSETA:
+ case TIOCSETAW:
+ case TIOCSETAF:
+ case TIOCDRAIN:
case RTEMS_IO_SNDWAKEUP:
case RTEMS_IO_RCVWAKEUP:
case TIOCGETD:
diff --git a/cpukit/preinstall.am b/cpukit/preinstall.am
index a6a5879..53f78f3 100644
--- a/cpukit/preinstall.am
+++ b/cpukit/preinstall.am
@@ -104,6 +104,14 @@ $(PROJECT_INCLUDE)/sys/ttycom.h: libcsupport/include/sys/ttycom.h $(PROJECT_INCL
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/ttycom.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/ttycom.h
+$(PROJECT_INCLUDE)/sys/ttydefaults.h: libcsupport/include/sys/ttydefaults.h $(PROJECT_INCLUDE)/sys/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/ttydefaults.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/ttydefaults.h
+
+$(PROJECT_INCLUDE)/sys/_termios.h: libcsupport/include/sys/_termios.h $(PROJECT_INCLUDE)/sys/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/_termios.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/_termios.h
+
$(PROJECT_INCLUDE)/sys/termios.h: libcsupport/include/sys/termios.h $(PROJECT_INCLUDE)/sys/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/termios.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/termios.h
--
1.9.1
More information about the devel
mailing list