2011-07-02 06:23:54 +08:00
|
|
|
/****************************************************************************
|
|
|
|
* include/termios.h
|
|
|
|
*
|
2021-02-03 18:33:49 +08:00
|
|
|
* 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
|
2011-07-02 06:23:54 +08:00
|
|
|
*
|
2021-02-03 18:33:49 +08:00
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
2011-07-02 06:23:54 +08:00
|
|
|
*
|
2021-02-03 18:33:49 +08:00
|
|
|
* 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.
|
2011-07-02 06:23:54 +08:00
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#ifndef __INCLUDE_TERMIOS_H
|
|
|
|
#define __INCLUDE_TERMIOS_H
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Included Files
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#include <nuttx/config.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
|
|
/****************************************************************************
|
2015-02-17 04:29:43 +08:00
|
|
|
* Pre-processor Definitions
|
2011-07-02 06:23:54 +08:00
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/* Terminal input modes (c_iflag in the termios structure) */
|
|
|
|
|
2020-09-07 22:28:45 +08:00
|
|
|
#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 */
|
2011-07-02 06:23:54 +08:00
|
|
|
|
|
|
|
/* Terminal output modes (c_oflag in the termios structure) */
|
|
|
|
|
2012-07-23 23:37:13 +08:00
|
|
|
#define OPOST (1 << 0) /* Bit 0: Post-process output */
|
2020-09-07 22:28:45 +08:00
|
|
|
#define OLCUC (1 << 1) /* Bit 1: Map lower-case to upper-case on output (LEGACY) */
|
2012-07-23 23:37:13 +08:00
|
|
|
#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 */
|
2020-09-07 22:28:45 +08:00
|
|
|
#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 */
|
2011-07-02 06:23:54 +08:00
|
|
|
|
|
|
|
/* Control Modes (c_cflag in the termios structure) */
|
|
|
|
|
2021-05-06 21:55:43 +08:00
|
|
|
#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 (1u << 31) /* Bit 31: RTS flow control of input */
|
2020-09-07 22:28:45 +08:00
|
|
|
#define CRTSCTS (CCTS_OFLOW | CRTS_IFLOW)
|
2011-07-02 06:23:54 +08:00
|
|
|
|
|
|
|
/* Local Modes (c_lflag in the termios structure) */
|
|
|
|
|
2020-09-07 22:28:45 +08:00
|
|
|
#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 */
|
2012-07-23 23:37:13 +08:00
|
|
|
#define NOFLSH (1 << 7) /* Bit 7: Disable flush after interrupt or quit */
|
|
|
|
#define TOSTOP (1 << 8) /* Bit 8: Send SIGTTOU for background output */
|
2020-09-07 22:28:45 +08:00
|
|
|
#define IEXTEN (1 << 15) /* Bit 15: Enable extended input character processing */
|
2011-07-02 06:23:54 +08:00
|
|
|
|
2018-01-19 02:51:07 +08:00
|
|
|
/* The following are subscript names for the termios c_cc array.
|
|
|
|
*
|
|
|
|
* Common characters: VINTR, VQUIT, VSTART, VSTOP, VSUSP
|
|
|
|
*
|
|
|
|
* VINTR: Interrupt character (Default ETX, Control-C)
|
|
|
|
* VQUIT: Quit character (Default FS, Control-\)
|
|
|
|
* VSTART: Start character (Default DC1, Control-Q)
|
|
|
|
* VSTOP: Stop character (Default DC3, Control-S)
|
|
|
|
* VSUSP: Suspend character (Default SUB, Control-Z)
|
|
|
|
*
|
|
|
|
* Canonical mode: Adds VEOF, VEOL, VERASE, VKILL
|
|
|
|
*
|
|
|
|
* VEOL: End-of-file character (Default SUB, Control-Z)
|
|
|
|
* VEOF: End-of-line character (Default NUL)
|
|
|
|
* VERASE: Erase character (Default DEL or BS, Control-H)
|
|
|
|
* VKILL: Kill character (Default NAK or BS, Control-U)
|
|
|
|
*
|
|
|
|
* Non-canonical mode: Adds VMIN, VTIME
|
|
|
|
*
|
|
|
|
* VMIN: Minimum number of characters for non-canonical read
|
|
|
|
* VTIME: Timeout in deciseconds for non-canonical read
|
|
|
|
*/
|
2011-07-02 06:23:54 +08:00
|
|
|
|
2020-09-07 22:28:45 +08:00
|
|
|
#define VINTR 0 /* Bit 0: INTR character */
|
|
|
|
#define VQUIT 1 /* Bit 1: QUIT character */
|
2012-07-23 23:37:13 +08:00
|
|
|
#define VERASE 2 /* Bit 2: ERASE character (canonical mode) */
|
2020-09-07 22:28:45 +08:00
|
|
|
#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 */
|
2012-07-23 23:37:13 +08:00
|
|
|
|
2018-01-19 02:51:07 +08:00
|
|
|
/* 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.
|
2012-07-25 06:56:36 +08:00
|
|
|
*/
|
2012-07-23 23:37:13 +08:00
|
|
|
|
2020-09-07 22:28:45 +08:00
|
|
|
#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 */
|
2011-07-02 06:23:54 +08:00
|
|
|
|
|
|
|
/* Attribute Selection (used with tcsetattr()) */
|
|
|
|
|
|
|
|
#define TCSANOW 0 /* Change attributes immediately */
|
|
|
|
#define TCSADRAIN 1 /* Change attributes when output has drained */
|
2018-01-19 02:51:07 +08:00
|
|
|
#define TCSAFLUSH 2 /* Change attributes when output has drained;
|
|
|
|
* also flush pending input */
|
2011-07-02 06:23:54 +08:00
|
|
|
|
|
|
|
/* Line Control (used with tcflush()) */
|
|
|
|
|
2018-05-28 01:39:34 +08:00
|
|
|
#define TCIFLUSH 0 /* Flush pending input */
|
2020-09-07 22:28:45 +08:00
|
|
|
#define TCOFLUSH 1 /* Flush untransmitted output */
|
|
|
|
#define TCIOFLUSH 2 /* Flush both pending input and untransmitted
|
2018-01-19 02:51:07 +08:00
|
|
|
* output */
|
2011-07-02 06:23:54 +08:00
|
|
|
|
|
|
|
/* Constants for use with tcflow() */
|
|
|
|
|
2020-09-07 22:28:45 +08:00
|
|
|
#define TCOOFF 0 /* Suspend output */
|
|
|
|
#define TCOON 1 /* Restart output */
|
|
|
|
#define TCIOFF 2 /* Transmit a STOP character, intended to
|
2018-01-19 02:51:07 +08:00
|
|
|
* suspend input data */
|
2020-09-07 22:28:45 +08:00
|
|
|
#define TCION 3 /* Transmit a START character, intended to
|
2018-01-19 02:51:07 +08:00
|
|
|
* restart input data */
|
2011-07-02 06:23:54 +08:00
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Public Type Definitions
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/* Baud rate selection */
|
|
|
|
|
2021-12-17 17:19:43 +08:00
|
|
|
typedef unsigned long speed_t; /* Used for terminal baud rates */
|
2011-07-02 06:23:54 +08:00
|
|
|
|
|
|
|
/* Types used within the termios structure */
|
|
|
|
|
2020-09-07 22:28:45 +08:00
|
|
|
typedef unsigned int tcflag_t; /* Used for terminal modes */
|
|
|
|
typedef unsigned char cc_t; /* Used for terminal special characters */
|
2011-07-02 06:23:54 +08:00
|
|
|
|
|
|
|
/* The termios structure */
|
|
|
|
|
|
|
|
struct termios
|
|
|
|
{
|
2012-07-23 02:56:50 +08:00
|
|
|
/* Exposed fields defined by POSIX */
|
|
|
|
|
2011-12-10 21:34:25 +08:00
|
|
|
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 */
|
2020-10-21 11:23:43 +08:00
|
|
|
|
|
|
|
/* 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) */
|
2011-07-02 06:23:54 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Public Function Prototypes
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
#define EXTERN extern "C"
|
2014-10-27 21:57:12 +08:00
|
|
|
extern "C"
|
|
|
|
{
|
2011-07-02 06:23:54 +08:00
|
|
|
#else
|
|
|
|
#define EXTERN extern
|
|
|
|
#endif
|
|
|
|
|
2012-07-25 06:56:36 +08:00
|
|
|
/* The cfgetspeed() function is a non-POSIX function will extract the baud
|
|
|
|
* from the termios structure to which the termiosp argument points. NuttX
|
2014-04-14 04:32:20 +08:00
|
|
|
* does not control input/output baud independently. Both must be the same.
|
2012-07-25 21:35:36 +08:00
|
|
|
* The POSIX standard interfaces, cfigetispeed() and cfigetospeed() are
|
|
|
|
* supported by simply defining them to be cfgetspeed().
|
2020-09-07 22:28:45 +08:00
|
|
|
* The return value is baud value(9600).
|
2012-07-25 06:56:36 +08:00
|
|
|
*/
|
|
|
|
|
2014-10-27 21:57:12 +08:00
|
|
|
speed_t cfgetspeed(FAR const struct termios *termiosp);
|
2012-07-25 06:56:36 +08:00
|
|
|
#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. NuttX does
|
2014-04-14 04:32:20 +08:00
|
|
|
* not control input/output baud independently. Both must be the same.
|
2012-07-25 06:56:36 +08:00
|
|
|
* The POSIX standard interfaces, cfigetispeed() and cfigetospeed() are
|
|
|
|
* supported by simply defining them to be cfsetspeed().
|
2020-09-07 22:28:45 +08:00
|
|
|
* Speed could be baud value(9600) or could be baud mask(B9600).
|
2012-07-25 06:56:36 +08:00
|
|
|
*/
|
|
|
|
|
2014-10-27 21:57:12 +08:00
|
|
|
int cfsetspeed(FAR struct termios *termiosp, speed_t speed);
|
2012-07-25 06:56:36 +08:00
|
|
|
#define cfsetispeed(termiosp,speed) cfsetspeed(termiosp,speed)
|
|
|
|
#define cfsetospeed(termiosp,speed) cfsetspeed(termiosp,speed)
|
|
|
|
|
2018-06-12 22:05:39 +08:00
|
|
|
/* The cfmakeraw() function is a non-POSIX function that sets the terminal
|
|
|
|
* to something like the "raw" mode.
|
|
|
|
*/
|
|
|
|
|
|
|
|
void cfmakeraw(FAR struct termios *termiosp);
|
|
|
|
|
2012-07-25 06:56:36 +08:00
|
|
|
/* Wait for transmission of output */
|
|
|
|
|
2014-10-27 21:57:12 +08:00
|
|
|
int tcdrain(int fd);
|
2012-07-25 06:56:36 +08:00
|
|
|
|
|
|
|
/* Suspend or restart the transmission or reception of data */
|
|
|
|
|
2014-10-27 21:57:12 +08:00
|
|
|
int tcflow(int fd, int action);
|
2012-07-25 06:56:36 +08:00
|
|
|
|
|
|
|
/* Flush non-transmitted output data, non-read input data or both */
|
|
|
|
|
2014-10-27 21:57:12 +08:00
|
|
|
int tcflush(int fd, int cmd);
|
2012-07-25 06:56:36 +08:00
|
|
|
|
|
|
|
/* Get the parameters associated with the terminal */
|
|
|
|
|
2014-10-27 21:57:12 +08:00
|
|
|
int tcgetattr(int fd, FAR struct termios *termiosp);
|
2012-07-25 06:56:36 +08:00
|
|
|
|
|
|
|
/* Get process group ID for session leader for controlling terminal */
|
|
|
|
|
2014-10-27 21:57:12 +08:00
|
|
|
pid_t tcgetsid(int fd);
|
2012-07-25 06:56:36 +08:00
|
|
|
|
|
|
|
/* Send a "break" for a specific duration */
|
|
|
|
|
2014-10-27 21:57:12 +08:00
|
|
|
int tcsendbreak(int fd, int duration);
|
2012-07-25 06:56:36 +08:00
|
|
|
|
|
|
|
/* Set the parameters associated with the terminal */
|
|
|
|
|
2014-10-27 21:57:12 +08:00
|
|
|
int tcsetattr(int fd, int options, FAR const struct termios *termiosp);
|
2011-07-02 06:23:54 +08:00
|
|
|
|
|
|
|
#undef EXTERN
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* __INCLUDE_TERMIOS_H */
|