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 data;
66 unsigned long head;
67 unsigned long tail;
68 struct wait_queue * proc_list;
69 unsigned char buf[TTY_BUF_SIZE];
70 };
71
72 struct serial_struct {
73 int type;
74 int line;
75 int port;
76 int irq;
77 int flags;
78 int xmit_fifo_size;
79 int custom_divisor;
80 int baud_base;
81 char close_delay;
82 char reserved_char[3];
83 int reserved[6];
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 #define ASYNC_FOURPORT 0x0002
101 #define ASYNC_SAK 0x0004
102
103 #define ASYNC_SPD_MASK 0x0030
104 #define ASYNC_SPD_HI 0x0010
105 #define ASYNC_SPD_VHI 0x0020
106 #define ASYNC_SPD_CUST 0x0030
107
108 #define ASYNC_SKIP_TEST 0x0040
109 #define ASYNC_AUTO_IRQ 0x0080
110
111 #define ASYNC_FLAGS 0x00F7
112
113
114 #define ASYNC_INITIALIZED 0x80000000
115 #define ASYNC_CALLOUT_ACTIVE 0x40000000
116 #define ASYNC_NORMAL_ACTIVE 0x20000000
117 #define ASYNC_BOOT_AUTOCONF 0x10000000
118
119 #define IS_A_CONSOLE(min) (((min) & 0xC0) == 0x00)
120 #define IS_A_SERIAL(min) (((min) & 0xC0) == 0x40)
121 #define IS_A_PTY(min) ((min) & 0x80)
122 #define IS_A_PTY_MASTER(min) (((min) & 0xC0) == 0x80)
123 #define IS_A_PTY_SLAVE(min) (((min) & 0xC0) == 0xC0)
124 #define PTY_OTHER(min) ((min) ^ 0x40)
125
126 #define SL_TO_DEV(line) ((line) | 0x40)
127 #define DEV_TO_SL(min) ((min) & 0x3F)
128
129 #define INC(a) ((a) = ((a)+1) & (TTY_BUF_SIZE-1))
130 #define DEC(a) ((a) = ((a)-1) & (TTY_BUF_SIZE-1))
131 #define EMPTY(a) ((a)->head == (a)->tail)
132 #define LEFT(a) (((a)->tail-(a)->head-1)&(TTY_BUF_SIZE-1))
133 #define LAST(a) ((a)->buf[(TTY_BUF_SIZE-1)&((a)->head-1)])
134 #define FULL(a) (!LEFT(a))
135 #define CHARS(a) (((a)->head-(a)->tail)&(TTY_BUF_SIZE-1))
136
137 extern void put_tty_queue(char c, struct tty_queue * queue);
138 extern int get_tty_queue(struct tty_queue * queue);
139
140 #define INTR_CHAR(tty) ((tty)->termios->c_cc[VINTR])
141 #define QUIT_CHAR(tty) ((tty)->termios->c_cc[VQUIT])
142 #define ERASE_CHAR(tty) ((tty)->termios->c_cc[VERASE])
143 #define KILL_CHAR(tty) ((tty)->termios->c_cc[VKILL])
144 #define WERASE_CHAR(tty) ((tty)->termios->c_cc[VWERASE])
145 #define EOF_CHAR(tty) ((tty)->termios->c_cc[VEOF])
146 #define START_CHAR(tty) ((tty)->termios->c_cc[VSTART])
147 #define STOP_CHAR(tty) ((tty)->termios->c_cc[VSTOP])
148 #define SUSPEND_CHAR(tty) ((tty)->termios->c_cc[VSUSP])
149 #define LNEXT_CHAR(tty) ((tty)->termios->c_cc[VLNEXT])
150
151 #define _L_FLAG(tty,f) ((tty)->termios->c_lflag & f)
152 #define _I_FLAG(tty,f) ((tty)->termios->c_iflag & f)
153 #define _O_FLAG(tty,f) ((tty)->termios->c_oflag & f)
154 #define _C_FLAG(tty,f) ((tty)->termios->c_cflag & f)
155
156 #define L_CANON(tty) _L_FLAG((tty),ICANON)
157 #define L_ISIG(tty) _L_FLAG((tty),ISIG)
158 #define L_ECHO(tty) _L_FLAG((tty),ECHO)
159 #define L_ECHOE(tty) _L_FLAG((tty),ECHOE)
160 #define L_ECHOK(tty) _L_FLAG((tty),ECHOK)
161 #define L_ECHONL(tty) _L_FLAG((tty),ECHONL)
162 #define L_ECHOCTL(tty) _L_FLAG((tty),ECHOCTL)
163 #define L_ECHOKE(tty) _L_FLAG((tty),ECHOKE)
164 #define L_TOSTOP(tty) _L_FLAG((tty),TOSTOP)
165
166 #define I_IGNBRK(tty) _I_FLAG((tty),IGNBRK)
167 #define I_BRKINT(tty) _I_FLAG((tty),BRKINT)
168 #define I_IGNPAR(tty) _I_FLAG((tty),IGNPAR)
169 #define I_PARMRK(tty) _I_FLAG((tty),PARMRK)
170 #define I_INPCK(tty) _I_FLAG((tty),INPCK)
171 #define I_UCLC(tty) _I_FLAG((tty),IUCLC)
172 #define I_NLCR(tty) _I_FLAG((tty),INLCR)
173 #define I_CRNL(tty) _I_FLAG((tty),ICRNL)
174 #define I_NOCR(tty) _I_FLAG((tty),IGNCR)
175 #define I_IXON(tty) _I_FLAG((tty),IXON)
176 #define I_IXANY(tty) _I_FLAG((tty),IXANY)
177 #define I_STRP(tty) _I_FLAG((tty),ISTRIP)
178
179 #define O_POST(tty) _O_FLAG((tty),OPOST)
180 #define O_LCUC(tty) _O_FLAG((tty),OLCUC)
181 #define O_NLCR(tty) _O_FLAG((tty),ONLCR)
182 #define O_CRNL(tty) _O_FLAG((tty),OCRNL)
183 #define O_NOCR(tty) _O_FLAG((tty),ONOCR)
184 #define O_NLRET(tty) _O_FLAG((tty),ONLRET)
185 #define O_TABDLY(tty) _O_FLAG((tty),TABDLY)
186
187 #define C_LOCAL(tty) _C_FLAG((tty),CLOCAL)
188 #define C_RTSCTS(tty) _C_FLAG((tty),CRTSCTS)
189 #define C_SPEED(tty) ((tty)->termios->c_cflag & CBAUD)
190 #define C_HUP(tty) (C_SPEED((tty)) == B0)
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206 struct tty_struct {
207 struct termios *termios;
208 int pgrp;
209 int session;
210 unsigned char stopped:1, status_changed:1, packet:1, lnext:1;
211 unsigned char char_error:2;
212 unsigned char ctrl_status;
213 short line;
214 int disc;
215 int flags;
216 int count;
217 int column;
218 struct winsize winsize;
219 int (*open)(struct tty_struct * tty, struct file * filp);
220 void (*close)(struct tty_struct * tty, struct file * filp);
221 void (*write)(struct tty_struct * tty);
222 int (*ioctl)(struct tty_struct *tty, struct file * file,
223 unsigned int cmd, unsigned long arg);
224 void (*throttle)(struct tty_struct * tty, int status);
225 void (*set_termios)(struct tty_struct *tty, struct termios * old);
226 struct tty_struct *link;
227 unsigned char *write_data_ptr;
228 int write_data_cnt;
229 void (*write_data_callback)(void * data);
230 void * write_data_arg;
231 int readq_flags[TTY_BUF_SIZE/32];
232 struct tty_queue read_q;
233 struct tty_queue write_q;
234 struct tty_queue secondary;
235 };
236
237 struct tty_ldisc {
238 int flags;
239
240
241
242 int (*open)(struct tty_struct *);
243 void (*close)(struct tty_struct *);
244 int (*read)(struct tty_struct * tty, struct file * file,
245 char * buf, int nr);
246 int (*write)(struct tty_struct * tty, struct file * file,
247 char * buf, int nr);
248 int (*ioctl)(struct tty_struct * tty, struct file * file,
249 unsigned int cmd, unsigned long arg);
250
251
252
253 void (*handler)(struct tty_struct *);
254 };
255
256 #define LDISC_FLAG_DEFINED 0x00000001
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274 #define TTY_THROTTLE_SQ_FULL 1
275 #define TTY_THROTTLE_SQ_AVAIL 2
276 #define TTY_THROTTLE_RQ_FULL 3
277 #define TTY_THROTTLE_RQ_AVAIL 4
278
279
280
281
282
283
284 #define SQ_THRESHOLD_LW 16
285 #define SQ_THRESHOLD_HW 768
286 #define RQ_THRESHOLD_LW 16
287 #define RQ_THRESHOLD_HW 768
288
289
290
291
292
293
294
295
296
297 #define TTY_WRITE_BUSY 0
298 #define TTY_READ_BUSY 1
299 #define TTY_CR_PENDING 2
300 #define TTY_SQ_THROTTLED 3
301 #define TTY_RQ_THROTTLED 4
302 #define TTY_IO_ERROR 5
303 #define TTY_SLAVE_OPENED 6
304
305
306
307
308
309
310 #define TTY_BREAK 1
311 #define TTY_FRAME 2
312 #define TTY_PARITY 3
313
314 #define TTY_WRITE_FLUSH(tty) tty_write_flush((tty))
315 #define TTY_READ_FLUSH(tty) tty_read_flush((tty))
316
317 extern void tty_write_flush(struct tty_struct *);
318 extern void tty_read_flush(struct tty_struct *);
319
320 extern struct tty_struct *tty_table[];
321 extern int tty_check_write[];
322 extern struct tty_struct * redirect;
323 extern struct tty_ldisc ldiscs[];
324 extern int fg_console;
325 extern unsigned long video_num_columns;
326 extern unsigned long video_num_lines;
327 extern struct wait_queue * keypress_wait;
328
329 #define TTY_TABLE_IDX(nr) ((nr) ? (nr) : (fg_console+1))
330 #define TTY_TABLE(nr) (tty_table[TTY_TABLE_IDX(nr)])
331
332
333
334
335
336
337
338 #define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0"
339
340 extern long rs_init(long);
341 extern long lp_init(long);
342 extern long con_init(long);
343 extern long tty_init(long);
344
345 extern void flush_input(struct tty_struct * tty);
346 extern void flush_output(struct tty_struct * tty);
347 extern void wait_until_sent(struct tty_struct * tty);
348 extern void copy_to_cooked(struct tty_struct * tty);
349 extern int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc);
350 extern int tty_read_raw_data(struct tty_struct *tty, unsigned char *bufp,
351 int buflen);
352 extern int tty_write_data(struct tty_struct *tty, char *bufp, int buflen,
353 void (*callback)(void * data), void * callarg);
354
355 extern int tty_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
356 extern int is_orphaned_pgrp(int pgrp);
357 extern int is_ignored(int sig);
358 extern int tty_signal(int sig, struct tty_struct *tty);
359 extern int kill_pg(int pgrp, int sig, int priv);
360 extern int kill_sl(int sess, int sig, int priv);
361 extern void tty_hangup(struct tty_struct * tty);
362 extern void tty_vhangup(struct tty_struct * tty);
363 extern void tty_unhangup(struct file *filp);
364 extern int tty_hung_up_p(struct file * filp);
365 extern void do_SAK(struct tty_struct *tty);
366
367
368
369 extern void rs_write(struct tty_struct * tty);
370 extern void con_write(struct tty_struct * tty);
371
372
373
374 extern int rs_open(struct tty_struct * tty, struct file * filp);
375
376
377
378 extern int pty_open(struct tty_struct * tty, struct file * filp);
379
380
381
382 extern int con_open(struct tty_struct * tty, struct file * filp);
383 extern void update_screen(int new_console);
384 extern void blank_screen(void);
385 extern void unblank_screen(void);
386
387
388
389 extern int vt_ioctl(struct tty_struct *tty, struct file * file,
390 unsigned int cmd, unsigned long arg);
391
392 #endif