text: /****************************************************************************
   *
   * Copyright 2016 Samsung Electronics All Rights Reserved.
   *
   * Licensed 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.
   *
   ****************************************************************************/
  /****************************************************************************
   * include/termios.h
   *
   *   Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
   *   Author: Gregory Nutt <gnutt@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.
   *
   ****************************************************************************/
  /**
   * @defgroup TERMIOS_KERNEL TERMIOS
   * @brief Provides APIs for Terminal Input/Output Interfaces
   * @ingroup KERNEL
   */
  
  /// @file termios.h
  /// @brief Termios APIs
  #ifndef __INCLUDE_TERMIOS_H
  #define __INCLUDE_TERMIOS_H
  
  /****************************************************************************
   * Included Files
   ****************************************************************************/
  
  #include <tinyara/config.h>
  #include <sys/types.h>
  #include <stdint.h>
  
  /****************************************************************************
   * Pre-Processor Definitions
   ****************************************************************************/
  
  /* 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 */
  
  /* 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 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 */
  
  /* 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 CRTSCTS   CCTS_OFLOW
  #define CRTS_IFLOW (1 << 9)		/* Bit 9: RTS flow control of input */
  
  /* 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 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) */
  
  /* The following are subscript names for the termios c_cc array */
  
  #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 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 */
  
  /* 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 TinyAra 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 */
  
  /* Attribute Selection (used with tcsetattr()) */
  
  #define TCSANOW   0				/* Change attributes immediately */
  #define TCSADRAIN 1				/* Change attributes when output has drained */
  #define TCSAFLUSH 2				/* Change attributes when output has drained; also flush pending input */
  
  /* Line Control (used with tcflush()) */
  
  #define TCIFLUSH  0				/* Flush pending input. Flush untransmitted output */
  #define TCIOFLUSH 1				/* 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 suspend input data */
  #define TCION     1				/* Transmit a START character, intended to restart input data */
  #define TCOOFF    2				/* Suspend output */
  #define TCOON     3				/* Restart output */
  
  /****************************************************************************
   * Public Type Definitions
   ****************************************************************************/
  
  /* Baud rate selection */
  
  typedef uint32_t 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 */
  
  /* The termios structure */
  
  /**
   * @ingroup TERMIOS_KERNEL
   * @brief Structure of termios
   */
  struct termios {
  	/* Exposed fields defined by POSIX */
  
  	tcflag_t c_iflag;			/* Input modes */
  	tcflag_t c_oflag;			/* Output modes */
  	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) */
  };
  
  /****************************************************************************
   * Public Function Prototypes
   ****************************************************************************/
  
  #ifdef __cplusplus
  #define EXTERN extern "C"
  extern "C" {
  #else
  #define EXTERN extern
  #endif
  
  /* The cfgetspeed() function is a non-POSIX function will extract the baud
   * from the termios structure to which the termiosp argument points. TinyAra
   * 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().
   */
  
  /**
   * @cond
   * @internal
   */
  speed_t cfgetspeed(FAR const struct termios *termiosp);
  #define cfgetispeed(termiosp) cfgetspeed(termiosp)
  #define cfgetospeed(termiosp) cfgetspeed(termiosp)
  
  /* The cfsetspeed() function is a non-POSIX function that sets the baud
   * stored in the structure pointed to by termiosp to speed. TinyAra 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 cfsetspeed().
   */
  /**
   * @internal
   */
  int cfsetspeed(FAR struct termios *termiosp, speed_t speed);
  #define cfsetispeed(termiosp, speed) cfsetspeed(termiosp, speed)
  #define cfsetospeed(termiosp, speed) cfsetspeed(termiosp, speed)
  
  /* Wait for transmission of output */
  /**
   * @internal
   */
  int tcdrain(int fd);
  
  /* Suspend or restart the transmission or reception of data */
  /**
   * @internal
   */
  int tcflow(int fd, int action);
  
  /* Flush non-transmitted output data, non-read input data or both */
  /**
   * @internal
   */
  int tcflush(int fd, int cmd);
  /**
   * @endcond
   */
  /* Get the parameters associated with the terminal */
  /**
   * @ingroup TERMIOS_KERNEL
   * @brief get the parameters associated with the terminal
   * @details @b #include <termios.h> \n
   * POSIX API (refer to : http://pubs.opengroup.org/onlinepubs/9699919799/)
   * @since TizenRT v1.0
   */
  int tcgetattr(int fd, FAR struct termios *termiosp);
  
  /* Get process group ID for session leader for controlling terminal */
  /**
   * @cond
   * @internal
   */
  pid_t tcgetsid(int fd);
  
  /* Send a "break" for a specific duration */
  /**
   * @internal
   */
  int tcsendbreak(int fd, int duration);
  /**
   * @endcond
   */
  
  /* Set the parameters associated with the terminal */
  /**
   * @ingroup TERMIOS_KERNEL
   * @brief set the parameters associated with the terminal
   * @details @b #include <termios.h> \n
   * POSIX API (refer to : http://pubs.opengroup.org/onlinepubs/9699919799/)
   * @since TizenRT v1.0
   */
  int tcsetattr(int fd, int options, FAR const struct termios *termiosp);
  
  /* Check if a file descriptor corresponds to a terminal I/O file */
  
  /**
   * @cond
   * @internal
   */
  int isatty(int fd);
  /**
   * @endcond
   */
  
  #undef EXTERN
  #ifdef __cplusplus
  }
  #endif
  
  #endif							/* __INCLUDE_TERMIOS_H */
  