1 #ifndef _LINUX_TTY_H
2 #define _LINUX_TTY_H
3
4
5
6
7
8 #include <linux/termios.h>
9
10 #include <asm/system.h>
11
12 #define NR_CONSOLES 8
13 #define NR_LDISCS 16
14
15
16
17
18
19 struct screen_info {
20 unsigned char orig_x;
21 unsigned char orig_y;
22 unsigned char unused1[2];
23 unsigned short orig_video_page;
24 unsigned char orig_video_mode;
25 unsigned char orig_video_cols;
26 unsigned short orig_video_ega_ax;
27 unsigned short orig_video_ega_bx;
28 unsigned short orig_video_ega_cx;
29 unsigned char orig_video_lines;
30 };
31
32 extern struct screen_info screen_info;
33
34 #define ORIG_X (screen_info.orig_x)
35 #define ORIG_Y (screen_info.orig_y)
36 #define ORIG_VIDEO_PAGE (screen_info.orig_video_page)
37 #define ORIG_VIDEO_MODE (screen_info.orig_video_mode)
38 #define ORIG_VIDEO_COLS (screen_info.orig_video_cols)
39 #define ORIG_VIDEO_EGA_AX (screen_info.orig_video_ega_ax)
40 #define ORIG_VIDEO_EGA_BX (screen_info.orig_video_ega_bx)
41 #define ORIG_VIDEO_EGA_CX (screen_info.orig_video_ega_cx)
42 #define ORIG_VIDEO_LINES (screen_info.orig_video_lines)
43
44 #define VIDEO_TYPE_MDA 0x10
45 #define VIDEO_TYPE_CGA 0x11
46 #define VIDEO_TYPE_EGAM 0x20
47 #define VIDEO_TYPE_EGAC 0x21
48
49
50
51
52
53
54 #define __DISABLED_CHAR '\0'
55
56
57
58
59
60
61
62 #define TTY_BUF_SIZE 1024
63
64 struct tty_queue {
65 unsigned long head;
66 unsigned long tail;
67 struct wait_queue * proc_list;
68 unsigned char buf[TTY_BUF_SIZE];
69 };
70
71 struct serial_struct {
72 int type;
73 int line;
74 int port;
75 int irq;
76 int flags;
77 int xmit_fifo_size;
78 int custom_divisor;
79 int baud_base;
80 unsigned short close_delay;
81 char reserved_char[2];
82 int hub6;
83 int reserved[5];
84 };
85
86
87
88
89 #define PORT_UNKNOWN 0
90 #define PORT_8250 1
91 #define PORT_16450 2
92 #define PORT_16550 3
93 #define PORT_16550A 4
94 #define PORT_MAX 4
95
96
97
98
99 #define ASYNC_HUP_NOTIFY 0x0001
100
101 #define ASYNC_FOURPORT 0x0002
102 #define ASYNC_SAK 0x0004
103 #define ASYNC_SPLIT_TERMIOS 0x0008
104
105 #define ASYNC_SPD_MASK 0x0030
106 #define ASYNC_SPD_HI 0x0010
107 #define ASYNC_SPD_VHI 0x0020
108 #define ASYNC_SPD_CUST 0x0030
109
110 #define ASYNC_SKIP_TEST 0x0040
111 #define ASYNC_AUTO_IRQ 0x0080
112 #define ASYNC_SESSION_LOCKOUT 0x0100
113 #define ASYNC_PGRP_LOCKOUT 0x0200
114 #define ASYNC_CALLOUT_NOHUP 0x0400
115
116 #define ASYNC_FLAGS 0x0FFF
117 #define ASYNC_USR_MASK 0x0430
118
119
120
121 #define ASYNC_INITIALIZED 0x80000000
122 #define ASYNC_CALLOUT_ACTIVE 0x40000000
123 #define ASYNC_NORMAL_ACTIVE 0x20000000
124 #define ASYNC_BOOT_AUTOCONF 0x10000000
125 #define ASYNC_CLOSING 0x08000000
126
127 #define IS_A_CONSOLE(min) (((min) & 0xC0) == 0x00)
128 #define IS_A_SERIAL(min) (((min) & 0xC0) == 0x40)
129 #define IS_A_PTY(min) ((min) & 0x80)
130 #define IS_A_PTY_MASTER(min) (((min) & 0xC0) == 0x80)
131 #define IS_A_PTY_SLAVE(min) (((min) & 0xC0) == 0xC0)
132 #define PTY_OTHER(min) ((min) ^ 0x40)
133
134 #define SL_TO_DEV(line) ((line) | 0x40)
135 #define DEV_TO_SL(min) ((min) & 0x3F)
136
137 #define INC(a) ((a) = ((a)+1) & (TTY_BUF_SIZE-1))
138 #define DEC(a) ((a) = ((a)-1) & (TTY_BUF_SIZE-1))
139 #define EMPTY(a) ((a)->head == (a)->tail)
140 #define LEFT(a) (((a)->tail-(a)->head-1)&(TTY_BUF_SIZE-1))
141 #define LAST(a) ((a)->buf[(TTY_BUF_SIZE-1)&((a)->head-1)])
142 #define FULL(a) (!LEFT(a))
143 #define CHARS(a) (((a)->head-(a)->tail)&(TTY_BUF_SIZE-1))
144
145 extern void put_tty_queue(unsigned char c, struct tty_queue * queue);
146 extern int get_tty_queue(struct tty_queue * queue);
147
148 #define INTR_CHAR(tty) ((tty)->termios->c_cc[VINTR])
149 #define QUIT_CHAR(tty) ((tty)->termios->c_cc[VQUIT])
150 #define ERASE_CHAR(tty) ((tty)->termios->c_cc[VERASE])
151 #define KILL_CHAR(tty) ((tty)->termios->c_cc[VKILL])
152 #define EOF_CHAR(tty) ((tty)->termios->c_cc[VEOF])
153 #define TIME_CHAR(tty) ((tty)->termios->c_cc[VTIME])
154 #define MIN_CHAR(tty) ((tty)->termios->c_cc[VMIN])
155 #define SWTC_CHAR(tty) ((tty)->termios->c_cc[VSWTC])
156 #define START_CHAR(tty) ((tty)->termios->c_cc[VSTART])
157 #define STOP_CHAR(tty) ((tty)->termios->c_cc[VSTOP])
158 #define SUSP_CHAR(tty) ((tty)->termios->c_cc[VSUSP])
159 #define EOL_CHAR(tty) ((tty)->termios->c_cc[VEOL])
160 #define REPRINT_CHAR(tty) ((tty)->termios->c_cc[VREPRINT])
161 #define DISCARD_CHAR(tty) ((tty)->termios->c_cc[VDISCARD])
162 #define WERASE_CHAR(tty) ((tty)->termios->c_cc[VWERASE])
163 #define LNEXT_CHAR(tty) ((tty)->termios->c_cc[VLNEXT])
164 #define EOL2_CHAR(tty) ((tty)->termios->c_cc[VEOL2])
165
166 #define _I_FLAG(tty,f) ((tty)->termios->c_iflag & (f))
167 #define _O_FLAG(tty,f) ((tty)->termios->c_oflag & (f))
168 #define _C_FLAG(tty,f) ((tty)->termios->c_cflag & (f))
169 #define _L_FLAG(tty,f) ((tty)->termios->c_lflag & (f))
170
171 #define I_IGNBRK(tty) _I_FLAG((tty),IGNBRK)
172 #define I_BRKINT(tty) _I_FLAG((tty),BRKINT)
173 #define I_IGNPAR(tty) _I_FLAG((tty),IGNPAR)
174 #define I_PARMRK(tty) _I_FLAG((tty),PARMRK)
175 #define I_INPCK(tty) _I_FLAG((tty),INPCK)
176 #define I_ISTRIP(tty) _I_FLAG((tty),ISTRIP)
177 #define I_INLCR(tty) _I_FLAG((tty),INLCR)
178 #define I_IGNCR(tty) _I_FLAG((tty),IGNCR)
179 #define I_ICRNL(tty) _I_FLAG((tty),ICRNL)
180 #define I_IUCLC(tty) _I_FLAG((tty),IUCLC)
181 #define I_IXON(tty) _I_FLAG((tty),IXON)
182 #define I_IXANY(tty) _I_FLAG((tty),IXANY)
183 #define I_IXOFF(tty) _I_FLAG((tty),IXOFF)
184 #define I_IMAXBEL(tty) _I_FLAG((tty),IMAXBEL)
185
186 #define O_OPOST(tty) _O_FLAG((tty),OPOST)
187 #define O_OLCUC(tty) _O_FLAG((tty),OLCUC)
188 #define O_ONLCR(tty) _O_FLAG((tty),ONLCR)
189 #define O_OCRNL(tty) _O_FLAG((tty),OCRNL)
190 #define O_ONOCR(tty) _O_FLAG((tty),ONOCR)
191 #define O_ONLRET(tty) _O_FLAG((tty),ONLRET)
192 #define O_OFILL(tty) _O_FLAG((tty),OFILL)
193 #define O_OFDEL(tty) _O_FLAG((tty),OFDEL)
194 #define O_NLDLY(tty) _O_FLAG((tty),NLDLY)
195 #define O_CRDLY(tty) _O_FLAG((tty),CRDLY)
196 #define O_TABDLY(tty) _O_FLAG((tty),TABDLY)
197 #define O_BSDLY(tty) _O_FLAG((tty),BSDLY)
198 #define O_VTDLY(tty) _O_FLAG((tty),VTDLY)
199 #define O_FFDLY(tty) _O_FLAG((tty),FFDLY)
200
201 #define C_BAUD(tty) _C_FLAG((tty),CBAUD)
202 #define C_CSIZE(tty) _C_FLAG((tty),CSIZE)
203 #define C_CSTOPB(tty) _C_FLAG((tty),CSTOPB)
204 #define C_CREAD(tty) _C_FLAG((tty),CREAD)
205 #define C_PARENB(tty) _C_FLAG((tty),PARENB)
206 #define C_PARODD(tty) _C_FLAG((tty),PARODD)
207 #define C_HUPCL(tty) _C_FLAG((tty),HUPCL)
208 #define C_CLOCAL(tty) _C_FLAG((tty),CLOCAL)
209 #define C_CIBAUD(tty) _C_FLAG((tty),CIBAUD)
210 #define C_CRTSCTS(tty) _C_FLAG((tty),CRTSCTS)
211
212 #define L_ISIG(tty) _L_FLAG((tty),ISIG)
213 #define L_ICANON(tty) _L_FLAG((tty),ICANON)
214 #define L_XCASE(tty) _L_FLAG((tty),XCASE)
215 #define L_ECHO(tty) _L_FLAG((tty),ECHO)
216 #define L_ECHOE(tty) _L_FLAG((tty),ECHOE)
217 #define L_ECHOK(tty) _L_FLAG((tty),ECHOK)
218 #define L_ECHONL(tty) _L_FLAG((tty),ECHONL)
219 #define L_NOFLSH(tty) _L_FLAG((tty),NOFLSH)
220 #define L_TOSTOP(tty) _L_FLAG((tty),TOSTOP)
221 #define L_ECHOCTL(tty) _L_FLAG((tty),ECHOCTL)
222 #define L_ECHOPRT(tty) _L_FLAG((tty),ECHOPRT)
223 #define L_ECHOKE(tty) _L_FLAG((tty),ECHOKE)
224 #define L_FLUSHO(tty) _L_FLAG((tty),FLUSHO)
225 #define L_PENDIN(tty) _L_FLAG((tty),PENDIN)
226 #define L_IEXTEN(tty) _L_FLAG((tty),IEXTEN)
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242 struct tty_struct {
243 struct termios *termios;
244 int pgrp;
245 int session;
246 unsigned char stopped:1, hw_stopped:1, packet:1, lnext:1;
247 unsigned char char_error:3;
248 unsigned char erasing:1;
249 unsigned char ctrl_status;
250 short line;
251 int disc;
252 int flags;
253 int count;
254 unsigned int column;
255 struct winsize winsize;
256 int (*open)(struct tty_struct * tty, struct file * filp);
257 void (*close)(struct tty_struct * tty, struct file * filp);
258 void (*write)(struct tty_struct * tty);
259 int (*ioctl)(struct tty_struct *tty, struct file * file,
260 unsigned int cmd, unsigned long arg);
261 void (*throttle)(struct tty_struct * tty, int status);
262 void (*set_termios)(struct tty_struct *tty, struct termios * old);
263 void (*stop)(struct tty_struct *tty);
264 void (*start)(struct tty_struct *tty);
265 void (*hangup)(struct tty_struct *tty);
266 struct tty_struct *link;
267 unsigned char *write_data_ptr;
268 int write_data_cnt;
269 void (*write_data_callback)(void * data);
270 void * write_data_arg;
271 int readq_flags[TTY_BUF_SIZE/32];
272 int secondary_flags[TTY_BUF_SIZE/32];
273 int canon_data;
274 unsigned long canon_head;
275 unsigned int canon_column;
276 struct tty_queue read_q;
277 struct tty_queue write_q;
278 struct tty_queue secondary;
279 void *disc_data;
280 };
281
282 struct tty_ldisc {
283 int flags;
284
285
286
287 int (*open)(struct tty_struct *);
288 void (*close)(struct tty_struct *);
289 int (*read)(struct tty_struct * tty, struct file * file,
290 unsigned char * buf, unsigned int nr);
291 int (*write)(struct tty_struct * tty, struct file * file,
292 unsigned char * buf, unsigned int nr);
293 int (*ioctl)(struct tty_struct * tty, struct file * file,
294 unsigned int cmd, unsigned long arg);
295 int (*select)(struct tty_struct * tty, struct inode * inode,
296 struct file * file, int sel_type,
297 struct select_table_struct *wait);
298
299
300
301 void (*handler)(struct tty_struct *);
302 };
303
304 #define LDISC_FLAG_DEFINED 0x00000001
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322 #define TTY_THROTTLE_SQ_FULL 1
323 #define TTY_THROTTLE_SQ_AVAIL 2
324 #define TTY_THROTTLE_RQ_FULL 3
325 #define TTY_THROTTLE_RQ_AVAIL 4
326
327
328
329
330
331
332 #define SQ_THRESHOLD_LW 16
333 #define SQ_THRESHOLD_HW 768
334 #define RQ_THRESHOLD_LW 16
335 #define RQ_THRESHOLD_HW 768
336
337
338
339
340
341
342
343
344
345 #define TTY_WRITE_BUSY 0
346 #define TTY_READ_BUSY 1
347 #define TTY_SQ_THROTTLED 2
348 #define TTY_RQ_THROTTLED 3
349 #define TTY_IO_ERROR 4
350 #define TTY_SLAVE_CLOSED 5
351 #define TTY_EXCLUSIVE 6
352
353
354
355
356
357
358 #define TTY_BREAK 1
359 #define TTY_FRAME 2
360 #define TTY_PARITY 3
361 #define TTY_OVERRUN 4
362
363 #define TTY_WRITE_FLUSH(tty) tty_write_flush((tty))
364 #define TTY_READ_FLUSH(tty) tty_read_flush((tty))
365
366 extern void tty_write_flush(struct tty_struct *);
367 extern void tty_read_flush(struct tty_struct *);
368
369
370
371 #define WAKEUP_CHARS (3*TTY_BUF_SIZE/4)
372
373 extern struct tty_struct *tty_table[];
374 extern struct termios *tty_termios[];
375 extern struct termios *termios_locked[];
376 extern int tty_check_write[];
377 extern struct tty_struct * redirect;
378 extern struct tty_ldisc ldiscs[];
379 extern int fg_console;
380 extern unsigned long video_num_columns;
381 extern unsigned long video_num_lines;
382 extern struct wait_queue * keypress_wait;
383
384 #define TTY_TABLE_IDX(nr) ((nr) ? (nr) : (fg_console+1))
385 #define TTY_TABLE(nr) (tty_table[TTY_TABLE_IDX(nr)])
386
387
388
389
390
391
392
393 #define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0"
394
395 extern long rs_init(long);
396 extern long lp_init(long);
397 extern long con_init(long);
398 extern long tty_init(long);
399
400 extern void flush_input(struct tty_struct * tty);
401 extern void flush_output(struct tty_struct * tty);
402 extern void wait_until_sent(struct tty_struct * tty, int timeout);
403 extern int check_change(struct tty_struct * tty, int channel);
404 extern void stop_tty(struct tty_struct * tty);
405 extern void start_tty(struct tty_struct * tty);
406 extern int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc);
407 extern int tty_read_raw_data(struct tty_struct *tty, unsigned char *bufp,
408 int buflen);
409 extern int tty_write_data(struct tty_struct *tty, char *bufp, int buflen,
410 void (*callback)(void * data), void * callarg);
411
412 extern int tty_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
413 extern int is_orphaned_pgrp(int pgrp);
414 extern int is_ignored(int sig);
415 extern int tty_signal(int sig, struct tty_struct *tty);
416 extern void tty_hangup(struct tty_struct * tty);
417 extern void tty_vhangup(struct tty_struct * tty);
418 extern void tty_unhangup(struct file *filp);
419 extern int tty_hung_up_p(struct file * filp);
420 extern void do_SAK(struct tty_struct *tty);
421 extern void disassociate_ctty(int priv);
422
423
424
425 extern void rs_write(struct tty_struct * tty);
426 extern void con_write(struct tty_struct * tty);
427
428
429
430 extern int rs_open(struct tty_struct * tty, struct file * filp);
431
432
433
434 extern int pty_open(struct tty_struct * tty, struct file * filp);
435
436
437
438 extern int con_open(struct tty_struct * tty, struct file * filp);
439 extern void update_screen(int new_console);
440 extern void blank_screen(void);
441 extern void unblank_screen(void);
442
443
444
445 extern int vt_ioctl(struct tty_struct *tty, struct file * file,
446 unsigned int cmd, unsigned long arg);
447
448 #endif