Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
422 | giacomo | 1 | #ifndef _LINUX_TTY_H |
2 | #define _LINUX_TTY_H |
||
3 | |||
4 | /* |
||
5 | * 'tty.h' defines some structures used by tty_io.c and some defines. |
||
6 | */ |
||
7 | |||
8 | /* |
||
9 | * These constants are also useful for user-level apps (e.g., VC |
||
10 | * resizing). |
||
11 | */ |
||
12 | #define MIN_NR_CONSOLES 1 /* must be at least 1 */ |
||
13 | #define MAX_NR_CONSOLES 63 /* serial lines start at 64 */ |
||
14 | #define MAX_NR_USER_CONSOLES 63 /* must be root to allocate above this */ |
||
15 | /* Note: the ioctl VT_GETSTATE does not work for |
||
16 | consoles 16 and higher (since it returns a short) */ |
||
17 | |||
18 | #ifdef __KERNEL__ |
||
19 | #include <linux/config.h> |
||
20 | #include <linux/fs.h> |
||
21 | #include <linux/major.h> |
||
22 | #include <linux/termios.h> |
||
23 | #include <linux/workqueue.h> |
||
24 | #include <linux/tty_driver.h> |
||
25 | #include <linux/tty_ldisc.h> |
||
26 | |||
27 | #include <asm/system.h> |
||
28 | |||
29 | |||
30 | /* |
||
31 | * Note: don't mess with NR_PTYS until you understand the tty minor |
||
32 | * number allocation game... |
||
33 | * (Note: the *_driver.minor_start values 1, 64, 128, 192 are |
||
34 | * hardcoded at present.) |
||
35 | */ |
||
36 | #define NR_PTYS 256 /* ptys/major */ |
||
37 | #define NR_LDISCS 16 |
||
38 | |||
39 | /* |
||
40 | * Unix98 PTY's can be defined as any multiple of NR_PTYS up to |
||
41 | * UNIX98_PTY_MAJOR_COUNT; this section defines what we need from the |
||
42 | * config options |
||
43 | */ |
||
44 | #ifdef CONFIG_UNIX98_PTYS |
||
45 | # define UNIX98_NR_MAJORS ((CONFIG_UNIX98_PTY_COUNT+NR_PTYS-1)/NR_PTYS) |
||
46 | # if UNIX98_NR_MAJORS <= 0 |
||
47 | # undef CONFIG_UNIX98_PTYS |
||
48 | # elif UNIX98_NR_MAJORS > UNIX98_PTY_MAJOR_COUNT |
||
49 | # error Too many Unix98 ptys defined |
||
50 | # undef UNIX98_NR_MAJORS |
||
51 | # define UNIX98_NR_MAJORS UNIX98_PTY_MAJOR_COUNT |
||
52 | # endif |
||
53 | #endif |
||
54 | |||
55 | /* |
||
56 | * These are set up by the setup-routine at boot-time: |
||
57 | */ |
||
58 | |||
59 | struct screen_info { |
||
60 | u8 orig_x; /* 0x00 */ |
||
61 | u8 orig_y; /* 0x01 */ |
||
62 | u16 dontuse1; /* 0x02 -- EXT_MEM_K sits here */ |
||
63 | u16 orig_video_page; /* 0x04 */ |
||
64 | u8 orig_video_mode; /* 0x06 */ |
||
65 | u8 orig_video_cols; /* 0x07 */ |
||
66 | u16 unused2; /* 0x08 */ |
||
67 | u16 orig_video_ega_bx; /* 0x0a */ |
||
68 | u16 unused3; /* 0x0c */ |
||
69 | u8 orig_video_lines; /* 0x0e */ |
||
70 | u8 orig_video_isVGA; /* 0x0f */ |
||
71 | u16 orig_video_points; /* 0x10 */ |
||
72 | |||
73 | /* VESA graphic mode -- linear frame buffer */ |
||
74 | u16 lfb_width; /* 0x12 */ |
||
75 | u16 lfb_height; /* 0x14 */ |
||
76 | u16 lfb_depth; /* 0x16 */ |
||
77 | u32 lfb_base; /* 0x18 */ |
||
78 | u32 lfb_size; /* 0x1c */ |
||
79 | u16 dontuse2, dontuse3; /* 0x20 -- CL_MAGIC and CL_OFFSET here */ |
||
80 | u16 lfb_linelength; /* 0x24 */ |
||
81 | u8 red_size; /* 0x26 */ |
||
82 | u8 red_pos; /* 0x27 */ |
||
83 | u8 green_size; /* 0x28 */ |
||
84 | u8 green_pos; /* 0x29 */ |
||
85 | u8 blue_size; /* 0x2a */ |
||
86 | u8 blue_pos; /* 0x2b */ |
||
87 | u8 rsvd_size; /* 0x2c */ |
||
88 | u8 rsvd_pos; /* 0x2d */ |
||
89 | u16 vesapm_seg; /* 0x2e */ |
||
90 | u16 vesapm_off; /* 0x30 */ |
||
91 | u16 pages; /* 0x32 */ |
||
92 | u16 vesa_attributes; /* 0x34 */ |
||
93 | /* 0x36 -- 0x3f reserved for future expansion */ |
||
94 | }; |
||
95 | |||
96 | extern struct screen_info screen_info; |
||
97 | |||
98 | #define ORIG_X (screen_info.orig_x) |
||
99 | #define ORIG_Y (screen_info.orig_y) |
||
100 | #define ORIG_VIDEO_MODE (screen_info.orig_video_mode) |
||
101 | #define ORIG_VIDEO_COLS (screen_info.orig_video_cols) |
||
102 | #define ORIG_VIDEO_EGA_BX (screen_info.orig_video_ega_bx) |
||
103 | #define ORIG_VIDEO_LINES (screen_info.orig_video_lines) |
||
104 | #define ORIG_VIDEO_ISVGA (screen_info.orig_video_isVGA) |
||
105 | #define ORIG_VIDEO_POINTS (screen_info.orig_video_points) |
||
106 | |||
107 | #define VIDEO_TYPE_MDA 0x10 /* Monochrome Text Display */ |
||
108 | #define VIDEO_TYPE_CGA 0x11 /* CGA Display */ |
||
109 | #define VIDEO_TYPE_EGAM 0x20 /* EGA/VGA in Monochrome Mode */ |
||
110 | #define VIDEO_TYPE_EGAC 0x21 /* EGA in Color Mode */ |
||
111 | #define VIDEO_TYPE_VGAC 0x22 /* VGA+ in Color Mode */ |
||
112 | #define VIDEO_TYPE_VLFB 0x23 /* VESA VGA in graphic mode */ |
||
113 | |||
114 | #define VIDEO_TYPE_PICA_S3 0x30 /* ACER PICA-61 local S3 video */ |
||
115 | #define VIDEO_TYPE_MIPS_G364 0x31 /* MIPS Magnum 4000 G364 video */ |
||
116 | #define VIDEO_TYPE_SNI_RM 0x32 /* SNI RM200 PCI video */ |
||
117 | #define VIDEO_TYPE_SGI 0x33 /* Various SGI graphics hardware */ |
||
118 | |||
119 | #define VIDEO_TYPE_TGAC 0x40 /* DEC TGA */ |
||
120 | |||
121 | #define VIDEO_TYPE_SUN 0x50 /* Sun frame buffer. */ |
||
122 | #define VIDEO_TYPE_SUNPCI 0x51 /* Sun PCI based frame buffer. */ |
||
123 | |||
124 | #define VIDEO_TYPE_PMAC 0x60 /* PowerMacintosh frame buffer. */ |
||
125 | |||
126 | /* |
||
127 | * This character is the same as _POSIX_VDISABLE: it cannot be used as |
||
128 | * a c_cc[] character, but indicates that a particular special character |
||
129 | * isn't in use (eg VINTR has no character etc) |
||
130 | */ |
||
131 | #define __DISABLED_CHAR '\0' |
||
132 | |||
133 | /* |
||
134 | * This is the flip buffer used for the tty driver. The buffer is |
||
135 | * located in the tty structure, and is used as a high speed interface |
||
136 | * between the tty driver and the tty line discipline. |
||
137 | */ |
||
138 | #define TTY_FLIPBUF_SIZE 512 |
||
139 | |||
140 | struct tty_flip_buffer { |
||
141 | struct work_struct work; |
||
142 | struct semaphore pty_sem; |
||
143 | char *char_buf_ptr; |
||
144 | unsigned char *flag_buf_ptr; |
||
145 | int count; |
||
146 | int buf_num; |
||
147 | unsigned char char_buf[2*TTY_FLIPBUF_SIZE]; |
||
148 | char flag_buf[2*TTY_FLIPBUF_SIZE]; |
||
149 | unsigned char slop[4]; /* N.B. bug overwrites buffer by 1 */ |
||
150 | }; |
||
151 | /* |
||
152 | * The pty uses char_buf and flag_buf as a contiguous buffer |
||
153 | */ |
||
154 | #define PTY_BUF_SIZE 4*TTY_FLIPBUF_SIZE |
||
155 | |||
156 | /* |
||
157 | * When a break, frame error, or parity error happens, these codes are |
||
158 | * stuffed into the flags buffer. |
||
159 | */ |
||
160 | #define TTY_NORMAL 0 |
||
161 | #define TTY_BREAK 1 |
||
162 | #define TTY_FRAME 2 |
||
163 | #define TTY_PARITY 3 |
||
164 | #define TTY_OVERRUN 4 |
||
165 | |||
166 | #define INTR_CHAR(tty) ((tty)->termios->c_cc[VINTR]) |
||
167 | #define QUIT_CHAR(tty) ((tty)->termios->c_cc[VQUIT]) |
||
168 | #define ERASE_CHAR(tty) ((tty)->termios->c_cc[VERASE]) |
||
169 | #define KILL_CHAR(tty) ((tty)->termios->c_cc[VKILL]) |
||
170 | #define EOF_CHAR(tty) ((tty)->termios->c_cc[VEOF]) |
||
171 | #define TIME_CHAR(tty) ((tty)->termios->c_cc[VTIME]) |
||
172 | #define MIN_CHAR(tty) ((tty)->termios->c_cc[VMIN]) |
||
173 | #define SWTC_CHAR(tty) ((tty)->termios->c_cc[VSWTC]) |
||
174 | #define START_CHAR(tty) ((tty)->termios->c_cc[VSTART]) |
||
175 | #define STOP_CHAR(tty) ((tty)->termios->c_cc[VSTOP]) |
||
176 | #define SUSP_CHAR(tty) ((tty)->termios->c_cc[VSUSP]) |
||
177 | #define EOL_CHAR(tty) ((tty)->termios->c_cc[VEOL]) |
||
178 | #define REPRINT_CHAR(tty) ((tty)->termios->c_cc[VREPRINT]) |
||
179 | #define DISCARD_CHAR(tty) ((tty)->termios->c_cc[VDISCARD]) |
||
180 | #define WERASE_CHAR(tty) ((tty)->termios->c_cc[VWERASE]) |
||
181 | #define LNEXT_CHAR(tty) ((tty)->termios->c_cc[VLNEXT]) |
||
182 | #define EOL2_CHAR(tty) ((tty)->termios->c_cc[VEOL2]) |
||
183 | |||
184 | #define _I_FLAG(tty,f) ((tty)->termios->c_iflag & (f)) |
||
185 | #define _O_FLAG(tty,f) ((tty)->termios->c_oflag & (f)) |
||
186 | #define _C_FLAG(tty,f) ((tty)->termios->c_cflag & (f)) |
||
187 | #define _L_FLAG(tty,f) ((tty)->termios->c_lflag & (f)) |
||
188 | |||
189 | #define I_IGNBRK(tty) _I_FLAG((tty),IGNBRK) |
||
190 | #define I_BRKINT(tty) _I_FLAG((tty),BRKINT) |
||
191 | #define I_IGNPAR(tty) _I_FLAG((tty),IGNPAR) |
||
192 | #define I_PARMRK(tty) _I_FLAG((tty),PARMRK) |
||
193 | #define I_INPCK(tty) _I_FLAG((tty),INPCK) |
||
194 | #define I_ISTRIP(tty) _I_FLAG((tty),ISTRIP) |
||
195 | #define I_INLCR(tty) _I_FLAG((tty),INLCR) |
||
196 | #define I_IGNCR(tty) _I_FLAG((tty),IGNCR) |
||
197 | #define I_ICRNL(tty) _I_FLAG((tty),ICRNL) |
||
198 | #define I_IUCLC(tty) _I_FLAG((tty),IUCLC) |
||
199 | #define I_IXON(tty) _I_FLAG((tty),IXON) |
||
200 | #define I_IXANY(tty) _I_FLAG((tty),IXANY) |
||
201 | #define I_IXOFF(tty) _I_FLAG((tty),IXOFF) |
||
202 | #define I_IMAXBEL(tty) _I_FLAG((tty),IMAXBEL) |
||
203 | |||
204 | #define O_OPOST(tty) _O_FLAG((tty),OPOST) |
||
205 | #define O_OLCUC(tty) _O_FLAG((tty),OLCUC) |
||
206 | #define O_ONLCR(tty) _O_FLAG((tty),ONLCR) |
||
207 | #define O_OCRNL(tty) _O_FLAG((tty),OCRNL) |
||
208 | #define O_ONOCR(tty) _O_FLAG((tty),ONOCR) |
||
209 | #define O_ONLRET(tty) _O_FLAG((tty),ONLRET) |
||
210 | #define O_OFILL(tty) _O_FLAG((tty),OFILL) |
||
211 | #define O_OFDEL(tty) _O_FLAG((tty),OFDEL) |
||
212 | #define O_NLDLY(tty) _O_FLAG((tty),NLDLY) |
||
213 | #define O_CRDLY(tty) _O_FLAG((tty),CRDLY) |
||
214 | #define O_TABDLY(tty) _O_FLAG((tty),TABDLY) |
||
215 | #define O_BSDLY(tty) _O_FLAG((tty),BSDLY) |
||
216 | #define O_VTDLY(tty) _O_FLAG((tty),VTDLY) |
||
217 | #define O_FFDLY(tty) _O_FLAG((tty),FFDLY) |
||
218 | |||
219 | #define C_BAUD(tty) _C_FLAG((tty),CBAUD) |
||
220 | #define C_CSIZE(tty) _C_FLAG((tty),CSIZE) |
||
221 | #define C_CSTOPB(tty) _C_FLAG((tty),CSTOPB) |
||
222 | #define C_CREAD(tty) _C_FLAG((tty),CREAD) |
||
223 | #define C_PARENB(tty) _C_FLAG((tty),PARENB) |
||
224 | #define C_PARODD(tty) _C_FLAG((tty),PARODD) |
||
225 | #define C_HUPCL(tty) _C_FLAG((tty),HUPCL) |
||
226 | #define C_CLOCAL(tty) _C_FLAG((tty),CLOCAL) |
||
227 | #define C_CIBAUD(tty) _C_FLAG((tty),CIBAUD) |
||
228 | #define C_CRTSCTS(tty) _C_FLAG((tty),CRTSCTS) |
||
229 | |||
230 | #define L_ISIG(tty) _L_FLAG((tty),ISIG) |
||
231 | #define L_ICANON(tty) _L_FLAG((tty),ICANON) |
||
232 | #define L_XCASE(tty) _L_FLAG((tty),XCASE) |
||
233 | #define L_ECHO(tty) _L_FLAG((tty),ECHO) |
||
234 | #define L_ECHOE(tty) _L_FLAG((tty),ECHOE) |
||
235 | #define L_ECHOK(tty) _L_FLAG((tty),ECHOK) |
||
236 | #define L_ECHONL(tty) _L_FLAG((tty),ECHONL) |
||
237 | #define L_NOFLSH(tty) _L_FLAG((tty),NOFLSH) |
||
238 | #define L_TOSTOP(tty) _L_FLAG((tty),TOSTOP) |
||
239 | #define L_ECHOCTL(tty) _L_FLAG((tty),ECHOCTL) |
||
240 | #define L_ECHOPRT(tty) _L_FLAG((tty),ECHOPRT) |
||
241 | #define L_ECHOKE(tty) _L_FLAG((tty),ECHOKE) |
||
242 | #define L_FLUSHO(tty) _L_FLAG((tty),FLUSHO) |
||
243 | #define L_PENDIN(tty) _L_FLAG((tty),PENDIN) |
||
244 | #define L_IEXTEN(tty) _L_FLAG((tty),IEXTEN) |
||
245 | |||
246 | struct device; |
||
247 | /* |
||
248 | * Where all of the state associated with a tty is kept while the tty |
||
249 | * is open. Since the termios state should be kept even if the tty |
||
250 | * has been closed --- for things like the baud rate, etc --- it is |
||
251 | * not stored here, but rather a pointer to the real state is stored |
||
252 | * here. Possible the winsize structure should have the same |
||
253 | * treatment, but (1) the default 80x24 is usually right and (2) it's |
||
254 | * most often used by a windowing system, which will set the correct |
||
255 | * size each time the window is created or resized anyway. |
||
256 | * - TYT, 9/14/92 |
||
257 | */ |
||
258 | struct tty_struct { |
||
259 | int magic; |
||
260 | struct tty_driver *driver; |
||
261 | int index; |
||
262 | struct tty_ldisc ldisc; |
||
263 | struct termios *termios, *termios_locked; |
||
264 | char name[64]; |
||
265 | int pgrp; |
||
266 | int session; |
||
267 | unsigned long flags; |
||
268 | int count; |
||
269 | struct winsize winsize; |
||
270 | unsigned char stopped:1, hw_stopped:1, flow_stopped:1, packet:1; |
||
271 | unsigned char low_latency:1, warned:1; |
||
272 | unsigned char ctrl_status; |
||
273 | |||
274 | struct tty_struct *link; |
||
275 | struct fasync_struct *fasync; |
||
276 | struct tty_flip_buffer flip; |
||
277 | int max_flip_cnt; |
||
278 | int alt_speed; /* For magic substitution of 38400 bps */ |
||
279 | wait_queue_head_t write_wait; |
||
280 | wait_queue_head_t read_wait; |
||
281 | struct work_struct hangup_work; |
||
282 | void *disc_data; |
||
283 | void *driver_data; |
||
284 | struct list_head tty_files; |
||
285 | |||
286 | #define N_TTY_BUF_SIZE 4096 |
||
287 | |||
288 | /* |
||
289 | * The following is data for the N_TTY line discipline. For |
||
290 | * historical reasons, this is included in the tty structure. |
||
291 | */ |
||
292 | unsigned int column; |
||
293 | unsigned char lnext:1, erasing:1, raw:1, real_raw:1, icanon:1; |
||
294 | unsigned char closing:1; |
||
295 | unsigned short minimum_to_wake; |
||
296 | unsigned long overrun_time; |
||
297 | int num_overrun; |
||
298 | unsigned long process_char_map[256/(8*sizeof(unsigned long))]; |
||
299 | char *read_buf; |
||
300 | int read_head; |
||
301 | int read_tail; |
||
302 | int read_cnt; |
||
303 | unsigned long read_flags[N_TTY_BUF_SIZE/(8*sizeof(unsigned long))]; |
||
304 | int canon_data; |
||
305 | unsigned long canon_head; |
||
306 | unsigned int canon_column; |
||
307 | struct semaphore atomic_read; |
||
308 | struct semaphore atomic_write; |
||
309 | spinlock_t read_lock; |
||
310 | /* If the tty has a pending do_SAK, queue it here - akpm */ |
||
311 | struct work_struct SAK_work; |
||
312 | }; |
||
313 | |||
314 | /* tty magic number */ |
||
315 | #define TTY_MAGIC 0x5401 |
||
316 | |||
317 | /* |
||
318 | * These bits are used in the flags field of the tty structure. |
||
319 | * |
||
320 | * So that interrupts won't be able to mess up the queues, |
||
321 | * copy_to_cooked must be atomic with respect to itself, as must |
||
322 | * tty->write. Thus, you must use the inline functions set_bit() and |
||
323 | * clear_bit() to make things atomic. |
||
324 | */ |
||
325 | #define TTY_THROTTLED 0 |
||
326 | #define TTY_IO_ERROR 1 |
||
327 | #define TTY_OTHER_CLOSED 2 |
||
328 | #define TTY_EXCLUSIVE 3 |
||
329 | #define TTY_DEBUG 4 |
||
330 | #define TTY_DO_WRITE_WAKEUP 5 |
||
331 | #define TTY_PUSH 6 |
||
332 | #define TTY_CLOSING 7 |
||
333 | #define TTY_DONT_FLIP 8 |
||
334 | #define TTY_HW_COOK_OUT 14 |
||
335 | #define TTY_HW_COOK_IN 15 |
||
336 | #define TTY_PTY_LOCK 16 |
||
337 | #define TTY_NO_WRITE_SPLIT 17 |
||
338 | |||
339 | #define TTY_WRITE_FLUSH(tty) tty_write_flush((tty)) |
||
340 | |||
341 | extern void tty_write_flush(struct tty_struct *); |
||
342 | |||
343 | extern struct termios tty_std_termios; |
||
344 | extern struct tty_ldisc ldiscs[]; |
||
345 | extern int fg_console, last_console, want_console; |
||
346 | |||
347 | extern int kmsg_redirect; |
||
348 | |||
349 | extern void console_init(void); |
||
350 | extern int vcs_init(void); |
||
351 | |||
352 | extern int tty_paranoia_check(struct tty_struct *tty, struct inode *inode, |
||
353 | const char *routine); |
||
354 | extern char *tty_name(struct tty_struct *tty, char *buf); |
||
355 | extern void tty_wait_until_sent(struct tty_struct * tty, long timeout); |
||
356 | extern int tty_check_change(struct tty_struct * tty); |
||
357 | extern void stop_tty(struct tty_struct * tty); |
||
358 | extern void start_tty(struct tty_struct * tty); |
||
359 | extern int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc); |
||
360 | extern int tty_register_driver(struct tty_driver *driver); |
||
361 | extern int tty_unregister_driver(struct tty_driver *driver); |
||
362 | extern void tty_register_device(struct tty_driver *driver, unsigned index, struct device *dev); |
||
363 | extern void tty_unregister_device(struct tty_driver *driver, unsigned index); |
||
364 | extern int tty_read_raw_data(struct tty_struct *tty, unsigned char *bufp, |
||
365 | int buflen); |
||
366 | extern void tty_write_message(struct tty_struct *tty, char *msg); |
||
367 | |||
368 | extern int is_orphaned_pgrp(int pgrp); |
||
369 | extern int is_ignored(int sig); |
||
370 | extern int tty_signal(int sig, struct tty_struct *tty); |
||
371 | extern void tty_hangup(struct tty_struct * tty); |
||
372 | extern void tty_vhangup(struct tty_struct * tty); |
||
373 | extern void tty_unhangup(struct file *filp); |
||
374 | extern int tty_hung_up_p(struct file * filp); |
||
375 | extern void do_SAK(struct tty_struct *tty); |
||
376 | extern void disassociate_ctty(int priv); |
||
377 | extern void tty_flip_buffer_push(struct tty_struct *tty); |
||
378 | extern int tty_get_baud_rate(struct tty_struct *tty); |
||
379 | extern int tty_termios_baud_rate(struct termios *termios); |
||
380 | |||
381 | /* n_tty.c */ |
||
382 | extern struct tty_ldisc tty_ldisc_N_TTY; |
||
383 | |||
384 | /* tty_ioctl.c */ |
||
385 | extern int n_tty_ioctl(struct tty_struct * tty, struct file * file, |
||
386 | unsigned int cmd, unsigned long arg); |
||
387 | |||
388 | /* serial.c */ |
||
389 | |||
390 | extern void serial_console_init(void); |
||
391 | |||
392 | /* pcxx.c */ |
||
393 | |||
394 | extern int pcxe_open(struct tty_struct *tty, struct file *filp); |
||
395 | |||
396 | /* printk.c */ |
||
397 | |||
398 | extern void console_print(const char *); |
||
399 | |||
400 | /* vt.c */ |
||
401 | |||
402 | extern int vt_ioctl(struct tty_struct *tty, struct file * file, |
||
403 | unsigned int cmd, unsigned long arg); |
||
404 | |||
405 | static inline dev_t tty_devnum(struct tty_struct *tty) |
||
406 | { |
||
407 | return MKDEV(tty->driver->major, tty->driver->minor_start) + tty->index; |
||
408 | } |
||
409 | |||
410 | #endif /* __KERNEL__ */ |
||
411 | #endif |