[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