1/*
2 * Copyright 2004-2012 Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _TERMIOS_H_
6#define _TERMIOS_H_
7
8
9#include <sys/types.h>
10
11
12typedef __haiku_uint32 tcflag_t;
13typedef unsigned char speed_t;
14typedef unsigned char cc_t;
15
16#define NCCS	11		/* number of control characters */
17
18struct termios {
19	tcflag_t	c_iflag;	/* input modes */
20	tcflag_t	c_oflag;	/* output modes */
21	tcflag_t	c_cflag;	/* control modes */
22	tcflag_t	c_lflag;	/* local modes */
23	char		c_line;		/* line discipline */
24	speed_t		c_ispeed;	/* (unused) */
25	speed_t		c_ospeed;	/* (unused) */
26	cc_t		c_cc[NCCS];	/* control characters */
27};
28
29/* control characters */
30#define	VINTR	0
31#define	VQUIT	1
32#define	VERASE	2
33#define	VKILL	3
34#define	VEOF	4
35#define	VEOL	5
36#define	VMIN	4
37#define	VTIME	5
38#define	VEOL2	6
39#define	VSWTCH	7
40#define VSTART  8
41#define VSTOP   9
42#define VSUSP   10
43
44/* c_iflag - input control modes */
45#define	IGNBRK		0x01		/* ignore break condition */
46#define	BRKINT		0x02		/* break sends interrupt */
47#define	IGNPAR		0x04		/* ignore characters with parity errors */
48#define	PARMRK		0x08		/* mark parity errors */
49#define	INPCK		0x10		/* enable input parity checking */
50#define	ISTRIP		0x20		/* strip high bit from characters */
51#define	INLCR		0x40		/* maps newline to CR on input */
52#define	IGNCR		0x80		/* ignore carriage returns */
53#define	ICRNL		0x100		/* map CR to newline on input */
54#define	IUCLC		0x200		/* map all upper case to lower */
55#define	IXON		0x400		/* enable input SW flow control */
56#define	IXANY		0x800		/* any character will restart input */
57#define	IXOFF		0x1000		/* enable output SW flow control */
58
59/* c_oflag - output control modes */
60#define	OPOST		0x01		/* enable postprocessing of output */
61#define	OLCUC		0x02		/* map lowercase to uppercase */
62#define	ONLCR		0x04		/* map NL to CR-NL on output */
63#define	OCRNL		0x08		/* map CR to NL on output */
64#define	ONOCR		0x10		/* no CR output when at column 0 */
65#define	ONLRET		0x20		/* newline performs CR function */
66#define	OFILL		0x40		/* use fill characters for delays */
67#define	OFDEL		0x80		/* Fills are DEL, otherwise NUL */
68#define	NLDLY		0x100		/* Newline delays: */
69#define	NL0			0x000
70#define	NL1			0x100
71#define	CRDLY		0x600		/* Carriage return delays: */
72#define	CR0			0x000
73#define	CR1			0x200
74#define	CR2			0x400
75#define	CR3			0x600
76#define	TABDLY		0x1800		/* Tab delays: */
77#define	TAB0		0x0000
78#define	TAB1		0x0800
79#define	TAB2		0x1000
80#define	TAB3		0x1800
81#define	BSDLY		0x2000		/* Backspace delays: */
82#define	BS0			0x0000
83#define	BS1			0x2000
84#define	VTDLY		0x4000		/* Vertical tab delays: */
85#define	VT0			0x0000
86#define	VT1			0x4000
87#define	FFDLY		0x8000		/* Form feed delays: */
88#define	FF0			0x0000
89#define	FF1			0x8000
90
91/* c_cflag - control modes */
92#define	CBAUD		0x1F			/* line speed definitions */
93
94#define	B0			0x00			/* hang up */
95#define	B50			0x01			/* 50 baud */
96#define	B75			0x02
97#define	B110		0x03
98#define	B134		0x04
99#define	B150		0x05
100#define	B200		0x06
101#define	B300		0x07
102#define	B600		0x08
103#define	B1200		0x09
104#define	B1800		0x0A
105#define	B2400		0x0B
106#define	B4800		0x0C
107#define	B9600		0x0D
108#define	B19200		0x0E
109#define	B31250		0x0F			/* for MIDI */
110#define B38400		0x10
111#define B57600		0x11
112#define B115200		0x12
113#define B230400		0x13
114
115#define	CSIZE		0x20			/* character size */
116#define	CS5			0x00			/* only 7 and 8 bits supported */
117#define	CS6			0x00			/* Note, it was not very wise to set all of these */
118#define	CS7			0x00			/* to zero, but there is not much we can do about it*/
119#define	CS8			0x20
120#define	CSTOPB		0x40			/* send 2 stop bits, not 1 */
121#define	CREAD		0x80			/* enable receiver */
122#define	PARENB		0x100			/* parity enable */
123#define	PARODD		0x200			/* odd parity, else even */
124#define	HUPCL		0x400			/* hangs up on last close */
125#define	CLOCAL		0x800			/* indicates local line */
126#define	XLOBLK		0x1000			/* block layer output ?*/
127#define	CTSFLOW		0x2000			/* enable CTS flow */
128#define	RTSFLOW		0x4000			/* enable RTS flow */
129#define	CRTSCTS		(RTSFLOW | CTSFLOW)
130
131/* c_lflag - local modes */
132#define ISIG		0x01			/* enable signals */
133#define ICANON		0x02			/* Canonical input */
134#define XCASE		0x04			/* Canonical u/l case */
135#define ECHO		0x08			/* Enable echo */
136#define ECHOE		0x10			/* Echo erase as bs-sp-bs */
137#define ECHOK		0x20			/* Echo nl after kill */
138#define ECHONL		0x40			/* Echo nl */
139#define NOFLSH		0x80			/* Disable flush after int or quit */
140#define TOSTOP		0x100			/* stop bg processes that write to tty */
141#define IEXTEN		0x200			/* implementation defined extensions */
142#define ECHOCTL		0x400
143#define ECHOPRT		0x800
144#define ECHOKE		0x1000
145#define FLUSHO		0x2000
146#define PENDIN		0x4000
147
148/* options to tcsetattr() */
149#define TCSANOW		0x01			/* make change immediate */
150#define TCSADRAIN	0x02			/* drain output, then change */
151#define TCSAFLUSH	0x04			/* drain output, flush input */
152
153/* actions for tcflow() */
154#define TCOOFF		0x01			/* suspend output */
155#define TCOON		0x02			/* restart output */
156#define TCIOFF		0x04			/* transmit STOP character, intended to stop input data */
157#define TCION		0x08			/* transmit START character, intended to resume input data */
158
159/* values for tcflush() */
160#define TCIFLUSH	0x01			/* flush pending input */
161#define TCOFLUSH	0x02			/* flush untransmitted output */
162#define TCIOFLUSH	0x03			/* flush both */
163
164
165/* ioctl() identifiers to control the TTY */
166#define TCGETA				0x8000
167#define TCSETA				(TCGETA + 1)
168#define TCSETAF				(TCGETA + 2)
169#define TCSETAW				(TCGETA + 3)
170#define TCWAITEVENT			(TCGETA + 4)
171#define TCSBRK				(TCGETA + 5)
172#define TCFLSH				(TCGETA + 6)
173#define TCXONC				(TCGETA + 7)
174#define TCQUERYCONNECTED	(TCGETA + 8)
175#define TCGETBITS			(TCGETA + 9)
176#define	TCSETDTR			(TCGETA + 10)
177#define TCSETRTS			(TCGETA + 11)
178#define TIOCGWINSZ			(TCGETA + 12)	/* pass in a struct winsize */
179#define TIOCSWINSZ			(TCGETA + 13)	/* pass in a struct winsize */
180#define TCVTIME				(TCGETA + 14)	/* pass in bigtime_t, old value saved */
181#define TIOCGPGRP			(TCGETA + 15)	/* Gets the process group ID of the TTY device */
182#define TIOCSPGRP			(TCGETA + 16)	/* Sets the process group ID ('pgid' in BeOS) */
183#define TIOCSCTTY			(TCGETA + 17)	/* Become controlling TTY */
184#define TIOCMGET			(TCGETA + 18)	/* get line state, like TCGETBITS */
185#define TIOCMSET			(TCGETA + 19)	/* does TCSETDTR/TCSETRTS */
186#define TIOCSBRK			(TCGETA + 20)	/* set txd pin */
187#define TIOCCBRK			(TCGETA + 21)	/* both are a frontend to TCSBRK */
188
189/* Event codes.  Returned from TCWAITEVENT */
190#define EV_RING			0x0001
191#define EV_BREAK		0x0002
192#define EV_CARRIER		0x0004
193#define EV_CARRIERLOST	0x0008
194
195/* for TIOCGWINSZ */
196struct winsize {
197	unsigned short	ws_row;
198	unsigned short	ws_col;
199	unsigned short	ws_xpixel;
200	unsigned short	ws_ypixel;
201};
202
203/* Bits for the TCGETBITS control */
204#define	TCGB_CTS		0x01
205#define TCGB_DSR		0x02
206#define TCGB_RI			0x04
207#define TCGB_DCD		0x08
208
209/* Bits for the TIOCMGET / TIOCMSET control */
210#define TIOCM_CTS		TCGB_CTS	/* clear to send */
211#define TIOCM_CD		TCGB_DCD	/* carrier detect */
212#define TIOCM_RI		TCGB_RI		/* ring indicator */
213#define TIOCM_DSR		TCGB_DSR	/* dataset ready */
214#define TIOCM_DTR		0x10		/* data terminal ready */
215#define TIOCM_RTS		0x20		/* request to send */
216
217
218#ifdef __cplusplus
219extern "C" {
220#endif
221
222extern speed_t	cfgetispeed(const struct termios *termios);
223extern speed_t	cfgetospeed(const struct termios *termios);
224extern int		cfsetispeed(struct termios *termios, speed_t speed);
225extern int		cfsetospeed(struct termios *termios, speed_t speed);
226extern void		cfmakeraw(struct termios *termios);
227extern int		tcgetattr(int fd, struct termios *termios);
228extern int		tcsetattr(int fd, int option, const struct termios *termios);
229extern int		tcsendbreak(int fd, int duration);
230extern int		tcdrain(int fd);
231extern int		tcflow(int fd, int action);
232extern int		tcflush(int fd, int queueSelector);
233
234#ifdef __cplusplus
235}
236#endif
237
238#endif /* _TERMIOS_H_ */
239