summaryrefslogtreecommitdiffstats
path: root/cpukit/libcsupport/src
diff options
context:
space:
mode:
authorKevin Kirspel <kevin-kirspel@idexx.com>2017-03-21 15:39:48 -0400
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-03-22 11:55:04 +0100
commit1c6926c11f2e5efcb166c668b097d64a0321d66e (patch)
tree30683dcf11979f51273413aade68a3828d00da10 /cpukit/libcsupport/src
parentbsp/atsam: Fix DMA support of some drivers (diff)
downloadrtems-1c6926c11f2e5efcb166c668b097d64a0321d66e.tar.bz2
termios: Synchronize with latest FreeBSD headers
Adding modified FreeBSD headers to synchronize RTEMS termios with FreeBSD. Modify termios to support dedicated input and output baud for termios structure. Updated BSPs to use dedicated input and output baud in termios structure. Updated tools to use dedicated input and output baud in termios structure. Updated termios testsuites to use dedicated input and output baud in termios structure. Close #2897.
Diffstat (limited to 'cpukit/libcsupport/src')
-rw-r--r--cpukit/libcsupport/src/cfgetispeed.c2
-rw-r--r--cpukit/libcsupport/src/cfgetospeed.c2
-rw-r--r--cpukit/libcsupport/src/cfmakeraw.c10
-rw-r--r--cpukit/libcsupport/src/cfmakesane.c66
-rw-r--r--cpukit/libcsupport/src/cfsetispeed.c7
-rw-r--r--cpukit/libcsupport/src/cfsetospeed.c7
-rw-r--r--cpukit/libcsupport/src/cfsetspeed.c3
-rw-r--r--cpukit/libcsupport/src/tcdrain.c2
-rw-r--r--cpukit/libcsupport/src/tcflush.c23
-rw-r--r--cpukit/libcsupport/src/tcgetattr.c2
-rw-r--r--cpukit/libcsupport/src/tcsetattr.c35
-rw-r--r--cpukit/libcsupport/src/termios.c44
-rw-r--r--cpukit/libcsupport/src/termios_baud2index.c13
-rw-r--r--cpukit/libcsupport/src/termios_baud2num.c6
-rw-r--r--cpukit/libcsupport/src/termios_baudtable.c5
-rw-r--r--cpukit/libcsupport/src/termios_setbestbaud.c10
-rw-r--r--cpukit/libcsupport/src/termios_setinitialbaud.c9
17 files changed, 177 insertions, 69 deletions
diff --git a/cpukit/libcsupport/src/cfgetispeed.c b/cpukit/libcsupport/src/cfgetispeed.c
index 8e9b186c7a..f551e271bf 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 399d64fc34..96446c7823 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 3027df8821..c335b92950 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/cfmakesane.c b/cpukit/libcsupport/src/cfmakesane.c
new file mode 100644
index 0000000000..e44fd6af42
--- /dev/null
+++ b/cpukit/libcsupport/src/cfmakesane.c
@@ -0,0 +1,66 @@
+/* @file
+ *
+ * @brief Baud Rate Functions
+ * @ingroup Termios
+ */
+
+/*
+ * Copyright (c) 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * 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.
+ *
+ * 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.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#if defined(RTEMS_NEWLIB)
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#define TTYDEFCHARS
+#include <termios.h>
+
+/*
+ * Obtain a termios structure which is similar to the one provided by
+ * the kernel.
+ */
+void
+cfmakesane(
+ struct termios *tp
+)
+{
+ tp->c_cflag = TTYDEF_CFLAG;
+ tp->c_iflag = TTYDEF_IFLAG;
+ tp->c_lflag = TTYDEF_LFLAG;
+ tp->c_oflag = TTYDEF_OFLAG;
+ tp->c_ispeed = TTYDEF_SPEED;
+ tp->c_ospeed = TTYDEF_SPEED;
+ memcpy(&tp->c_cc, ttydefchars, sizeof ttydefchars);
+}
+#endif
diff --git a/cpukit/libcsupport/src/cfsetispeed.c b/cpukit/libcsupport/src/cfsetispeed.c
index d3a031c049..14e67b9b8b 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 36e3d997c8..41a232aa0f 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 293ff6e3ef..0d37840319 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 b10d79c69e..7f049aa4cb 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 eacae1c1f2..cd781cf5a0 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 11ee593c87..c8c0e84b7f 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 556abee4a7..6b6afda718 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 9eace2eeea..a7944ecc1e 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 625a71494d..569ac5c769 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 07e6446e39..4c80949f17 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 74fc492dec..c2a1859154 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 768011892e..d6dcd7f33d 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 c3e8e579a5..3b8853f6a8 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;
}