This is an automated email from the ASF dual-hosted git repository. protobits pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 03c7951cbd1430f238f18582631e586269938997 Author: dongjiuzhu <dongjiuz...@xiaomi.com> AuthorDate: Mon Sep 7 22:28:45 2020 +0800 libc/termios: modify termios setting follow linux and posix Change-Id: Id323b3169e74f4153fd8d132d20926b7fb8336a3 Signed-off-by: dongjiuzhu <dongjiuz...@xiaomi.com> --- include/termios.h | 242 +++++++++++++++++-------------------- libs/libc/termios/Make.defs | 2 +- libs/libc/termios/lib_cfgetspeed.c | 77 ------------ libs/libc/termios/lib_cfsetspeed.c | 96 --------------- libs/libc/termios/lib_cfspeed.c | 196 ++++++++++++++++++++++++++++++ 5 files changed, 309 insertions(+), 304 deletions(-) diff --git a/include/termios.h b/include/termios.h index 5032a6b..291b3f3 100644 --- a/include/termios.h +++ b/include/termios.h @@ -50,87 +50,81 @@ /* Terminal input modes (c_iflag in the termios structure) */ -#define BRKINT (1 << 0) /* Bit 0: Signal interrupt on break */ -#define ICRNL (1 << 1) /* Bit 1: Map CR to NL on input */ -#define IGNBRK (1 << 2) /* Bit 2: Ignore break condition */ -#define IGNCR (1 << 3) /* Bit 3: Ignore CR */ -#define IGNPAR (1 << 4) /* Bit 4: Ignore characters with parity errors */ -#define INLCR (1 << 5) /* Bit 5: Map NL to CR on input */ -#define INPCK (1 << 6) /* Bit 6: Enable input parity check */ -#define ISTRIP (1 << 7) /* Bit 7: Strip character */ -#define IUCLC (1 << 8) /* Bit 8: Map upper-case to lower-case on input - * (LEGACY) */ -#define IXANY (1 << 9) /* Bit 9: Enable any character to restart output */ -#define IXOFF (1 << 10) /* Bit 10: Enable start/stop input control */ -#define IXON (1 << 11) /* Bit 11: Enable start/stop output control */ -#define PARMRK (1 << 12) /* Bit 12: Mark parity errors */ +#define IGNBRK (1 << 0) /* Bit 0: Ignore break condition */ +#define BRKINT (1 << 1) /* Bit 1: Signal interrupt on break */ +#define IGNPAR (1 << 2) /* Bit 2: Ignore characters with parity errors */ +#define PARMRK (1 << 3) /* Bit 3: Mark parity errors */ +#define INPCK (1 << 4) /* Bit 4: Enable input parity check */ +#define ISTRIP (1 << 5) /* Bit 5: Strip character */ +#define INLCR (1 << 6) /* Bit 6: Map NL to CR on input */ +#define IGNCR (1 << 7) /* Bit 7: Ignore CR */ +#define ICRNL (1 << 8) /* Bit 8: Map CR to NL on input */ +#define IUCLC (1 << 9) /* Bit 9: Map upper-case to lower-case on input (LEGACY) */ +#define IXON (1 << 10) /* Bit 10: Enable start/stop output control */ +#define IXANY (1 << 11) /* Bit 11: Enable any character to restart output */ +#define IXOFF (1 << 12) /* Bit 12: Enable start/stop input control */ /* Terminal output modes (c_oflag in the termios structure) */ #define OPOST (1 << 0) /* Bit 0: Post-process output */ -#define OLCUC (1 << 1) /* Bit 1: Map lower-case to upper-case on -* * output (LEGACY) */ +#define OLCUC (1 << 1) /* Bit 1: Map lower-case to upper-case on output (LEGACY) */ #define ONLCR (1 << 2) /* Bit 2: Map NL to CR-NL on output */ #define OCRNL (1 << 3) /* Bit 3: Map CR to NL on output */ #define ONOCR (1 << 4) /* Bit 4: No CR output at column 0 */ #define ONLRET (1 << 5) /* Bit 5: NL performs CR function */ #define OFILL (1 << 6) /* Bit 6: Use fill characters for delay */ -#define NLDLY (1 << 7) /* Bit 7: Select newline delays: */ -# define NL0 (0 << 7) /* Newline character type 0 */ -# define NL1 (1 << 7) /* Newline character type 1 */ -#define CRDLY (3 << 8) /* Bits 8-9: Select carriage-return delays: */ -# define CR0 (0 << 8) /* Carriage-return delay type 0 */ -# define CR1 (1 << 8) /* Carriage-return delay type 1 */ -# define CR2 (2 << 8) /* Carriage-return delay type 2 */ -# define CR3 (3 << 8) /* Carriage-return delay type 3 */ -#define TABDLY (3 << 10) /* Bit 10-11: Select horizontal-tab delays: */ -# define TAB0 (0 << 10) /* Horizontal-tab delay type 0 */ -# define TAB1 (1 << 10) /* Horizontal-tab delay type 1 */ -# define TAB2 (2 << 10) /* Horizontal-tab delay type 2 */ -# define TAB3 (3 << 10) /* Expand tabs to spaces */ -#define BSDLY (1 << 12) /* Bit 12: Select backspace delays: */ -# define BS0 (0 << 12) /* Backspace-delay type 0 */ -# define BS1 (1 << 12) /* Backspace-delay type 1 */ -#define VTDLY (1 << 13) /* Bit 13: Select vertical-tab delays: */ -# define VT0 (0 << 13) /* Vertical-tab delay type 0 */ -# define VT1 (1 << 13) /* Vertical-tab delay type 1 */ -#define FFDLY (1 << 14) /* Bit 14: Select form-feed delays: */ -# define FF0 (0 << 14) /* Form-feed delay type 0 */ -# define FF1 (1 << 14) /* Form-feed delay type 1 */ +#define NLDLY (1 << 8) /* Bit 8: Select newline delays: */ +# define NL0 (0 << 8) /* Newline character type 0 */ +# define NL1 (1 << 8) /* Newline character type 1 */ +#define CRDLY (3 << 9) /* Bits 9-10: Select carriage-return delays: */ +# define CR0 (0 << 9) /* Carriage-return delay type 0 */ +# define CR1 (1 << 9) /* Carriage-return delay type 1 */ +# define CR2 (2 << 9) /* Carriage-return delay type 2 */ +# define CR3 (3 << 9) /* Carriage-return delay type 3 */ +#define TABDLY (3 << 11) /* Bits 11-12: Select horizontal-tab delays: */ +# define TAB0 (0 << 11) /* Horizontal-tab delay type 0 */ +# define TAB1 (1 << 11) /* Horizontal-tab delay type 1 */ +# define TAB2 (2 << 11) /* Horizontal-tab delay type 2 */ +# define TAB3 (3 << 11) /* Expand tabs to spaces */ +#define BSDLY (1 << 13) /* Bit 13: Select backspace delays: */ +# define BS0 (0 << 13) /* Backspace-delay type 0 */ +# define BS1 (1 << 13) /* Backspace-delay type 1 */ +#define VTDLY (1 << 14) /* Bit 14: Select vertical-tab delays: */ +# define VT0 (0 << 14) /* Vertical-tab delay type 0 */ +# define VT1 (1 << 14) /* Vertical-tab delay type 1 */ +#define FFDLY (1 << 15) /* Bit 15: Select form-feed delays: */ +# define FF0 (0 << 15) /* Form-feed delay type 0 */ +# define FF1 (1 << 15) /* Form-feed delay type 1 */ /* Control Modes (c_cflag in the termios structure) */ -#define CSIZE (3 << 0) /* Bits 0-1: Character size: */ -# define CS5 (0 << 0) /* 5 bits */ -# define CS6 (1 << 0) /* 6 bits */ -# define CS7 (2 << 0) /* 7 bits */ -# define CS8 (3 << 0) /* 8 bits */ -#define CSTOPB (1 << 2) /* Bit 2: Send two stop bits, else one */ -#define CREAD (1 << 3) /* Bit 3: Enable receiver */ -#define PARENB (1 << 4) /* Bit 4: Parity enable */ -#define PARODD (1 << 5) /* Bit 5: Odd parity, else even */ -#define HUPCL (1 << 6) /* Bit 6: Hang up on last close */ -#define CLOCAL (1 << 7) /* Bit 7: Ignore modem status lines */ -#define CCTS_OFLOW (1 << 8) /* Bit 8: CTS flow control of output */ -#define CRTS_IFLOW (1 << 9) /* Bit 9: RTS flow control of input */ -#define CRTSCTS (CRTS_IFLOW | CCTS_OFLOW) +#define CSIZE (3 << 4) /* Bits 4-5: Character size: */ +# define CS5 (0 << 4) /* 5 bits */ +# define CS6 (1 << 4) /* 6 bits */ +# define CS7 (2 << 4) /* 7 bits */ +# define CS8 (3 << 4) /* 8 bits */ +#define CSTOPB (1 << 6) /* Bit 6: Send two stop bits, else one */ +#define CREAD (1 << 7) /* Bit 7: Enable receiver */ +#define PARENB (1 << 8) /* Bit 8: Parity enable */ +#define PARODD (1 << 9) /* Bit 9: Odd parity, else even */ +#define HUPCL (1 << 10) /* Bit 10: Hang up on last close */ +#define CLOCAL (1 << 11) /* Bit 11: Ignore modem status lines */ +#define CCTS_OFLOW (1 << 29)/* Bit 29: CTS flow control of output */ +#define CRTS_IFLOW (1 << 31)/* Bit 31: RTS flow control of input */ +#define CRTSCTS (CCTS_OFLOW | CRTS_IFLOW) /* Local Modes (c_lflag in the termios structure) */ -#define ECHO (1 << 0) /* Bit 0: Enable echo */ -#define ECHOE (1 << 1) /* Bit 1: Echo erase character as error- - * correcting backspace */ -#define ECHOK (1 << 2) /* Bit 2: Echo KILL */ -#define ECHONL (1 << 3) /* Bit 3: Echo NL */ -#define ICANON (1 << 4) /* Bit 4: Canonical input (erase and kill - * processing) */ -#define IEXTEN (1 << 5) /* Bit 5: Enable extended input character - * processing */ -#define ISIG (1 << 6) /* Bit 6: Enable signals */ +#define ISIG (1 << 0) /* Bit 0: Enable signals */ +#define ICANON (1 << 1) /* Bit 1: Canonical input (erase and kill processing) */ +#define XCASE (1 << 2) /* Bit 2: Canonical upper/lower presentation (LEGACY) */ +#define ECHO (1 << 3) /* Bit 3: Enable echo */ +#define ECHOE (1 << 4) /* Bit 4: Echo erase character as error correcting backspace */ +#define ECHOK (1 << 5) /* Bit 5: Echo KILL */ +#define ECHONL (1 << 6) /* Bit 6: Echo NL */ #define NOFLSH (1 << 7) /* Bit 7: Disable flush after interrupt or quit */ #define TOSTOP (1 << 8) /* Bit 8: Send SIGTTOU for background output */ -#define XCASE (1 << 9) /* Bit 9: Canonical upper/lower presentation - * (LEGACY) */ +#define IEXTEN (1 << 15) /* Bit 15: Enable extended input character processing */ /* The following are subscript names for the termios c_cc array. * @@ -155,63 +149,57 @@ * VTIME: Timeout in deciseconds for non-canonical read */ -#define VEOF 0 /* Bit 0: EOF character (canonical mode) */ -#define VMIN VEOF /* Bit 0: MIN value (non-canonical mode) */ -#define VEOL 1 /* Bit 1: EOL character (canonical mode) */ -#define VTIME VEOL /* Bit 1: TIME value (non-canonical mode) */ +#define VINTR 0 /* Bit 0: INTR character */ +#define VQUIT 1 /* Bit 1: QUIT character */ #define VERASE 2 /* Bit 2: ERASE character (canonical mode) */ -#define VINTR 3 /* Bit 3: INTR character */ -#define VKILL 4 /* Bit 4: KILL character (canonical mode) */ -#define VQUIT 5 /* Bit 5: QUIT character */ -#define VSTART 6 /* Bit 6: START character */ -#define VSTOP 7 /* Bit 7: STOP character */ -#define VSUSP 8 /* Bit 8: SUSP character */ -#define NCCS 9 /* Bit 9: Size of the array c_cc for control - * characters */ +#define VKILL 3 /* Bit 3: KILL character (canonical mode) */ +#define VEOF 4 /* Bit 4: EOF character (canonical mode) */ +#define VTIME 5 /* Bit 5: TIME value (non-canonical mode) */ +#define VMIN 6 /* Bit 6: MIN value (non-canonical mode) */ +#define VSTART 8 /* Bit 8: START character */ +#define VSTOP 9 /* Bit 9: STOP character */ +#define VSUSP 10 /* Bit 10: SUSP character */ +#define VEOL 11 /* Bit 11: EOL character (canonical mode) */ +#define NCCS 12 /* Bit 12: Size of the array c_cc for control characters */ /* Baud Rate Selection. These are instances of type speed_t. Values of * 38400 and below are specified by POSIX; values above 38400 are sometimes * referred to as extended values and most values appear in most termios.h * implementations. - * - * NOTE that is NuttX that the encoding of the speed_t values is simply the - * value of the baud itself. So this opens a window for non-portable abuse - * of the speed-related interfaces: The defined values should be used where- - * ever possible for reasons of portability. */ -#define B0 0 /* Hang up */ -#define B50 50 /* 50 baud */ -#define B75 75 /* 75 baud */ -#define B110 110 /* 110 baud */ -#define B134 134 /* 134.5 baud */ -#define B150 150 /* 150 baud */ -#define B200 200 /* 200 baud */ -#define B300 300 /* 300 baud */ -#define B600 600 /* 600 baud */ -#define B1200 1200 /* 1,200 baud */ -#define B1800 1800 /* 1,800 baud */ -#define B2400 2400 /* 2,400 baud */ -#define B4800 4800 /* 4,800 baud */ -#define B9600 9600 /* 9,600 baud */ -#define B19200 19200 /* 19,200 baud */ -#define B38400 38400 /* 38,400 baud */ - -#define B57600 57600 /* 57,600 baud */ -#define B115200 115200 /* 115,200 baud */ -#define B128000 128000 /* 128,000 baud */ -#define B230400 230400 /* 230,400 baud */ -#define B256000 256000 /* 256,000 baud */ -#define B460800 460800 /* 460,800 baud */ -#define B500000 500000 /* 500,000 baud */ -#define B576000 576000 /* 576,000 baud */ -#define B921600 921600 /* 921,600 baud */ -#define B1000000 1000000 /* 1,000,000 baud */ -#define B1152000 1152000 /* 1,152,000 baud */ -#define B1500000 1500000 /* 1,500,000 baud */ -#define B2000000 2000000 /* 2,000,000 baud */ -#define B2500000 2500000 /* 2,500,000 baud */ -#define B3000000 3000000 /* 3,000,000 baud */ +#define B0 0000000 /* Hang up */ +#define B50 0000001 /* 50 baud */ +#define B75 0000002 /* 75 baud */ +#define B110 0000003 /* 110 baud */ +#define B134 0000004 /* 134.5 baud */ +#define B150 0000005 /* 150 baud */ +#define B200 0000006 /* 200 baud */ +#define B300 0000007 /* 300 baud */ +#define B600 0000010 /* 600 baud */ +#define B1200 0000011 /* 1,200 baud */ +#define B1800 0000012 /* 1,800 baud */ +#define B2400 0000013 /* 2,400 baud */ +#define B4800 0000014 /* 4,800 baud */ +#define B9600 0000015 /* 9,600 baud */ +#define B19200 0000016 /* 19,200 baud */ +#define B38400 0000017 /* 38,400 baud */ + +#define B57600 0010001 /* 57,600 baud */ +#define B115200 0010002 /* 115,200 baud */ +#define B230400 0010003 /* 230,400 baud */ +#define B460800 0010004 /* 460,800 baud */ +#define B500000 0010005 /* 500,000 baud */ +#define B576000 0010006 /* 576,000 baud */ +#define B921600 0010007 /* 921,600 baud */ +#define B1000000 0010010 /* 1,000,000 baud */ +#define B1152000 0010011 /* 1,152,000 baud */ +#define B1500000 0010012 /* 1,500,000 baud */ +#define B2000000 0010013 /* 2,000,000 baud */ +#define B2500000 0010014 /* 2,500,000 baud */ +#define B3000000 0010015 /* 3,000,000 baud */ +#define B3500000 0010016 /* 3,500,000 baud */ +#define B4000000 0010017 /* 4,000,000 baud */ /* Attribute Selection (used with tcsetattr()) */ @@ -223,18 +211,18 @@ /* Line Control (used with tcflush()) */ #define TCIFLUSH 0 /* Flush pending input */ -#define TCIOFLUSH 1 /* Flush both pending input and untransmitted +#define TCOFLUSH 1 /* Flush untransmitted output */ +#define TCIOFLUSH 2 /* Flush both pending input and untransmitted * output */ -#define TCOFLUSH 2 /* Flush untransmitted output */ /* Constants for use with tcflow() */ -#define TCIOFF 0 /* Transmit a STOP character, intended to +#define TCOOFF 0 /* Suspend output */ +#define TCOON 1 /* Restart output */ +#define TCIOFF 2 /* Transmit a STOP character, intended to * suspend input data */ -#define TCION 1 /* Transmit a START character, intended to +#define TCION 3 /* Transmit a START character, intended to * restart input data */ -#define TCOOFF 2 /* Suspend output */ -#define TCOON 3 /* Restart output */ /**************************************************************************** * Public Type Definitions @@ -242,12 +230,12 @@ /* Baud rate selection */ -typedef uint32_t speed_t; /* Used for terminal baud rates */ +typedef unsigned int speed_t; /* Used for terminal baud rates */ /* Types used within the termios structure */ -typedef uint16_t tcflag_t; /* Used for terminal modes */ -typedef int cc_t; /* Used for terminal special characters */ +typedef unsigned int tcflag_t; /* Used for terminal modes */ +typedef unsigned char cc_t; /* Used for terminal special characters */ /* The termios structure */ @@ -260,13 +248,6 @@ struct termios tcflag_t c_cflag; /* Control modes */ tcflag_t c_lflag; /* Local modes */ cc_t c_cc[NCCS]; /* Control chars */ - - /* Implementation specific fields. For portability reasons, these fields - * should not be accessed directly, but rather through only through the - * cf[set|get][o|i]speed() POSIX interfaces. - */ - - speed_t c_speed; /* Input/output speed (non-POSIX)*/ }; /**************************************************************************** @@ -286,6 +267,7 @@ extern "C" * does not control input/output baud independently. Both must be the same. * The POSIX standard interfaces, cfigetispeed() and cfigetospeed() are * supported by simply defining them to be cfgetspeed(). + * The return value is baud value(9600). */ speed_t cfgetspeed(FAR const struct termios *termiosp); @@ -297,6 +279,7 @@ speed_t cfgetspeed(FAR const struct termios *termiosp); * not control input/output baud independently. Both must be the same. * The POSIX standard interfaces, cfigetispeed() and cfigetospeed() are * supported by simply defining them to be cfsetspeed(). + * Speed could be baud value(9600) or could be baud mask(B9600). */ int cfsetspeed(FAR struct termios *termiosp, speed_t speed); @@ -337,7 +320,6 @@ int tcsendbreak(int fd, int duration); int tcsetattr(int fd, int options, FAR const struct termios *termiosp); - #undef EXTERN #ifdef __cplusplus } diff --git a/libs/libc/termios/Make.defs b/libs/libc/termios/Make.defs index 2d9f345..a6f8df9 100644 --- a/libs/libc/termios/Make.defs +++ b/libs/libc/termios/Make.defs @@ -40,7 +40,7 @@ ifeq ($(CONFIG_SERIAL_TERMIOS),y) # Add the termios C files to the build -CSRCS += lib_cfgetspeed.c lib_cfsetspeed.c lib_cfmakeraw.c lib_isatty.c lib_tcflush.c +CSRCS += lib_cfspeed.c lib_cfmakeraw.c lib_isatty.c lib_tcflush.c CSRCS += lib_tcflow.c lib_tcgetattr.c lib_tcsetattr.c # Add the termios directory to the build diff --git a/libs/libc/termios/lib_cfgetspeed.c b/libs/libc/termios/lib_cfgetspeed.c deleted file mode 100644 index ce53227..0000000 --- a/libs/libc/termios/lib_cfgetspeed.c +++ /dev/null @@ -1,77 +0,0 @@ -/**************************************************************************** - * libs/libc/termios/lib_cfgetspeed.c - * - * Copyright (C) 2012 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt <gn...@nuttx.org> - * - * 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 NuttX 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 COPYRIGHT HOLDERS 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 - * COPYRIGHT OWNER 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. - * - ****************************************************************************/ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include <termios.h> -#include <assert.h> - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: cfgetspeed - * - * Description: - * The cfgetspeed() function is a non-POSIX function will extract the baud - * from the termios structure to which the termiosp argument points. - * - * This function will return exactly the value in the termios data - * structure, without interpretation. - * - * NOTE 1: NuttX does not control input/output baud independently. Both - * must be the same. The POSIX standard interfaces, cfisetispeed() and - * cfisetospeed() are defined to be cfgetspeed() in termios.h. - * NOTE 2. In Nuttx, the speed_t is defined to be uint32_t and the baud - * encodings of termios.h are the actual baud values themselves. Therefore, - * any baud value may be returned here... not just those enumerated in - * termios.h - * - * Input Parameters: - * termiosp - The termiosp argument is a pointer to a termios structure. - * - * Returned Value: - * Encoded baud value from the termios structure. - * - ****************************************************************************/ - -speed_t cfgetspeed(FAR const struct termios *termiosp) -{ - DEBUGASSERT(termiosp); - return termiosp->c_speed; -} diff --git a/libs/libc/termios/lib_cfsetspeed.c b/libs/libc/termios/lib_cfsetspeed.c deleted file mode 100644 index fe7bdb1..0000000 --- a/libs/libc/termios/lib_cfsetspeed.c +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************************** - * libs/libc/termios/lib_cfsetspeed.c - * - * Copyright (C) 2012 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt <gn...@nuttx.org> - * - * 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 NuttX 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 COPYRIGHT HOLDERS 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 - * COPYRIGHT OWNER 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. - * - ****************************************************************************/ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include <sys/types.h> -#include <termios.h> -#include <assert.h> - -/**************************************************************************** - * Name: cfsetspeed - * - * Description: - * The cfsetspeed() function is a non-POSIX function that sets the baud - * stored in the structure pointed to by termiosp to speed. - * - * There is no effect on the baud set in the hardware until a subsequent - * successful call to tcsetattr() on the same termios structure. - * - * NOTE 1: NuttX does not control input/output baud independently. Both - * must be the same. The POSIX standard interfaces, cfisetispeed() and - * cfisetospeed() are defined to be cfsetspeed() in termios.h. - * - * NOTE 3: A consequence of NOTE 1 is that you should never attempt to - * set the input and output baud to different values. - * - * Also, the following POSIX requirement cannot be supported: "If the input - * baud rate stored in the termios structure pointed to by termios_p is 0, - * the input baud rate given to the hardware will be the same as the output - * baud rate stored in the termios structure." - * - * NOTE 2. In Nuttx, the speed_t is defined to be uint32_t and the baud - * encodings of termios.h are the actual baud values themselves. Therefore, - * any baud value can be provided as the speed argument here. However, if - * you do so, your code will *NOT* be portable to other environments where - * speed_t is smaller and where the termios.h baud values are encoded! To - * avoid portability issues, use the baud definitions in termios.h! - * - * Linux, for example, would require this (also non-portable) sequence: - * - * cfsetispeed(termiosp, BOTHER); - * termiosp->c_ispeed = baud; - * - * cfsetospeed(termiosp, BOTHER); - * termiosp->c_ospeed = baud; - * - * Input Parameters: - * termiosp - The termiosp argument is a pointer to a termios structure. - * speed - The new input speed - * - * Returned Value: - * Baud is not checked... OK is always returned (this is non-standard - * behavior). - * - ****************************************************************************/ - -int cfsetspeed(FAR struct termios *termiosp, speed_t speed) -{ - DEBUGASSERT(termiosp); - termiosp->c_speed = speed; - return OK; -} diff --git a/libs/libc/termios/lib_cfspeed.c b/libs/libc/termios/lib_cfspeed.c new file mode 100644 index 0000000..b0e08f8 --- /dev/null +++ b/libs/libc/termios/lib_cfspeed.c @@ -0,0 +1,196 @@ +/**************************************************************************** + * libs/libc/termios/lib_cfspeed.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <sys/types.h> +#include <termios.h> +#include <assert.h> +#include <errno.h> + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define CBAUD 0010017 /* Baud speed mask (not in POSIX) */ +#define CBAUDEX 0010000 /* Extra baud speed mask, included in CBAUD. + * (not in POSIX) */ + +#define ARRAYSIZE(a) (sizeof((a))/sizeof(a[0])) + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* Routine which returns the baud rate of the tty + * + * Note that the baud_table needs to be kept in sync with the + * include/termios.h file. + */ + +static const speed_t g_baud_table[] = +{ + 0, 50, 75, 110, 134, + 150, 200, 300, 600, 1200, + 1800, 2400, 4800, 9600, 19200, + 38400, 57600, 115200, 230400, 460800, + 500000, 576000, 921600, 1000000, 1152000, + 1500000, 2000000, 2500000, 3000000, 3500000, + 4000000 +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static int baud_mask(speed_t speed) +{ + speed_t idx = 0; + + for (; idx < ARRAYSIZE(g_baud_table); idx++) + { + if (speed == g_baud_table[idx]) + { + break; + } + } + + /* we don't find the speed value, it could be mask */ + + if (idx == ARRAYSIZE(g_baud_table)) + { + return (speed & ~CBAUD) ? -1 : speed; + } + + /* If idx > B38400, we should will idx minus 15, and or CBAUDEX */ + + if (idx > B38400) + { + idx -= B38400; + idx |= CBAUDEX; + } + + return idx; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: cfsetspeed + * + * Description: + * The cfsetspeed() function is a non-POSIX function that sets the baud + * stored in the structure pointed to by termiosp to speed. + * + * There is no effect on the baud set in the hardware until a subsequent + * successful call to tcsetattr() on the same termios structure. + * + * NOTE 1: NuttX does not control input/output baud independently. Both + * must be the same. The POSIX standard interfaces, cfisetispeed() and + * cfisetospeed() are defined to be cfsetspeed() in termios.h. + * + * NOTE 3: A consequence of NOTE 1 is that you should never attempt to + * set the input and output baud to different values. + * + * Also, the following POSIX requirement cannot be supported: "If the input + * baud rate stored in the termios structure pointed to by termios_p is 0, + * the input baud rate given to the hardware will be the same as the output + * baud rate stored in the termios structure." + * + * NOTE 2. In Nuttx, the speed_t is defined to be unsigned int and the baud + * encodings of termios.h are baud value mask. And their corresponding + * values are in array g_baud_table. However, if you do so, your code will + * *NOT* be portable to other environments where speed_t is smaller and + * where the termios.h baud values are encoded! To avoid portability + * issues, use the baud definitions in termios.h! + * + * Linux, for example, would require this (also non-portable) sequence: + * + * cfsetispeed(termiosp, BOTHER); + * termiosp->c_ispeed = baud; + * + * cfsetospeed(termiosp, BOTHER); + * termiosp->c_ospeed = baud; + * + * Input Parameters: + * termiosp - The termiosp argument is a pointer to a termios structure. + * speed - The new input speed. It could be baud rate or could be mask. + * + * Returned Value: + * Baud is returned. If speed don't match g_baud_table and mask in + * termios.h, -1 is returned and set errno EINVAL. + * + ****************************************************************************/ + +int cfsetspeed(FAR struct termios *termiosp, speed_t speed) +{ + int mask = baud_mask(speed); + + DEBUGASSERT(termiosp); + if (mask == -1) + { + set_errno(EINVAL); + return mask; + } + + termiosp->c_cflag &= ~CBAUD; + termiosp->c_cflag |= mask; + return 0; +} + +/**************************************************************************** + * Name: cfgetspeed + * + * Description: + * The cfgetspeed() function is a non-POSIX function will extract the baud + * from the termios structure to which the termiosp argument points. + * + * This function will return exactly the value in the termios data + * structure, without interpretation. + * + * NOTE 1: NuttX does not control input/output baud independently. Both + * must be the same. The POSIX standard interfaces, cfisetispeed() and + * cfisetospeed() are defined to be cfgetspeed() in termios.h. + * NOTE 2. In Nuttx, the speed_t is defined to be uint32_t and the baud + * encodings of termios.h are the actual baud values themselves. Therefore, + * any baud value may be returned here... not just those enumerated in + * termios.h + * + * Input Parameters: + * termiosp - The termiosp argument is a pointer to a termios structure. + * + * Returned Value: + * Encoded baud value from the termios structure. + * + ****************************************************************************/ + +speed_t cfgetspeed(FAR const struct termios *termiosp) +{ + int idx; + + DEBUGASSERT(termiosp); + idx = termiosp->c_cflag & CBAUD & ~CBAUDEX; + idx += (termiosp->c_cflag & CBAUDEX) ? 15 : 0; + return g_baud_table[idx]; +}