Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 | #ifndef _LINUX_TTY_H #define _LINUX_TTY_H /* * 'tty.h' defines some structures used by tty_io.c and some defines. */ #include <linux/termios.h> #include <asm/system.h> #define NR_CONSOLES 8 #define NR_LDISCS 16 /* * These are set up by the setup-routine at boot-time: */ struct screen_info { unsigned char orig_x; unsigned char orig_y; unsigned char unused1[2]; unsigned short orig_video_page; unsigned char orig_video_mode; unsigned char orig_video_cols; unsigned short orig_video_ega_ax; unsigned short orig_video_ega_bx; unsigned short orig_video_ega_cx; unsigned char orig_video_lines; }; extern struct screen_info screen_info; #define ORIG_X (screen_info.orig_x) #define ORIG_Y (screen_info.orig_y) #define ORIG_VIDEO_PAGE (screen_info.orig_video_page) #define ORIG_VIDEO_MODE (screen_info.orig_video_mode) #define ORIG_VIDEO_COLS (screen_info.orig_video_cols) #define ORIG_VIDEO_EGA_AX (screen_info.orig_video_ega_ax) #define ORIG_VIDEO_EGA_BX (screen_info.orig_video_ega_bx) #define ORIG_VIDEO_EGA_CX (screen_info.orig_video_ega_cx) #define ORIG_VIDEO_LINES (screen_info.orig_video_lines) #define VIDEO_TYPE_MDA 0x10 /* Monochrome Text Display */ #define VIDEO_TYPE_CGA 0x11 /* CGA Display */ #define VIDEO_TYPE_EGAM 0x20 /* EGA/VGA in Monochrome Mode */ #define VIDEO_TYPE_EGAC 0x21 /* EGA/VGA in Color Mode */ /* * This character is the same as _POSIX_VDISABLE: it cannot be used as * a c_cc[] character, but indicates that a particular special character * isn't in use (eg VINTR ahs no character etc) */ #define __DISABLED_CHAR '\0' /* * See comment for the tty_struct structure before changing * TTY_BUF_SIZE. Actually, there should be different sized tty_queue * structures for different purposes. 1024 bytes for the transmit * queue is way overkill. TYT, 9/14/92 */ #define TTY_BUF_SIZE 1024 /* Must be a power of 2 */ struct tty_queue { unsigned long data; unsigned long head; unsigned long tail; struct wait_queue * proc_list; unsigned char buf[TTY_BUF_SIZE]; }; struct serial_struct { int type; int line; int port; int irq; int flags; int xmit_fifo_size; int custom_divisor; int baud_base; int reserved[7]; }; /* * These are the supported serial types. */ #define PORT_UNKNOWN 0 #define PORT_8250 1 #define PORT_16450 2 #define PORT_16550 3 #define PORT_16550A 4 #define PORT_MAX 4 /* * Definitions for async_struct (and serial_struct) flags field */ #define ASYNC_FOURPORT 0x0002 /* Set OU1, OUT2 per AST Fourport settings */ #define ASYNC_SAK 0x0004 /* Secure Attention Key (Orange book) */ #define ASYNC_SPD_MASK 0x0030 #define ASYNC_SPD_HI 0x0010 /* Use 56000 instead of 38400 bps */ #define ASYNC_SPD_VHI 0x0020 /* Use 115200 instead of 38400 bps */ #define ASYNC_SPD_CUST 0x0030 /* Use user-specified divisor */ #define ASYNC_FLAGS 0x0036 /* Possible legal async flags */ /* Internal flags used only by kernel/chr_drv/serial.c */ #define ASYNC_INITIALIZED 0x80000000 /* Serial port was initialized */ #define ASYNC_CALLOUT_ACTIVE 0x40000000 /* Call out device is active */ #define ASYNC_NORMAL_ACTIVE 0x20000000 /* Normal device is active */ #define IS_A_CONSOLE(min) (((min) & 0xC0) == 0x00) #define IS_A_SERIAL(min) (((min) & 0xC0) == 0x40) #define IS_A_PTY(min) ((min) & 0x80) #define IS_A_PTY_MASTER(min) (((min) & 0xC0) == 0x80) #define IS_A_PTY_SLAVE(min) (((min) & 0xC0) == 0xC0) #define PTY_OTHER(min) ((min) ^ 0x40) #define SL_TO_DEV(line) ((line) | 0x40) #define DEV_TO_SL(min) ((min) & 0x3F) #define INC(a) ((a) = ((a)+1) & (TTY_BUF_SIZE-1)) #define DEC(a) ((a) = ((a)-1) & (TTY_BUF_SIZE-1)) #define EMPTY(a) ((a)->head == (a)->tail) #define LEFT(a) (((a)->tail-(a)->head-1)&(TTY_BUF_SIZE-1)) #define LAST(a) ((a)->buf[(TTY_BUF_SIZE-1)&((a)->head-1)]) #define FULL(a) (!LEFT(a)) #define CHARS(a) (((a)->head-(a)->tail)&(TTY_BUF_SIZE-1)) extern void put_tty_queue(char c, struct tty_queue * queue); extern int get_tty_queue(struct tty_queue * queue); #define INTR_CHAR(tty) ((tty)->termios->c_cc[VINTR]) #define QUIT_CHAR(tty) ((tty)->termios->c_cc[VQUIT]) #define ERASE_CHAR(tty) ((tty)->termios->c_cc[VERASE]) #define KILL_CHAR(tty) ((tty)->termios->c_cc[VKILL]) #define EOF_CHAR(tty) ((tty)->termios->c_cc[VEOF]) #define START_CHAR(tty) ((tty)->termios->c_cc[VSTART]) #define STOP_CHAR(tty) ((tty)->termios->c_cc[VSTOP]) #define SUSPEND_CHAR(tty) ((tty)->termios->c_cc[VSUSP]) #define _L_FLAG(tty,f) ((tty)->termios->c_lflag & f) #define _I_FLAG(tty,f) ((tty)->termios->c_iflag & f) #define _O_FLAG(tty,f) ((tty)->termios->c_oflag & f) #define L_CANON(tty) _L_FLAG((tty),ICANON) #define L_ISIG(tty) _L_FLAG((tty),ISIG) #define L_ECHO(tty) _L_FLAG((tty),ECHO) #define L_ECHOE(tty) _L_FLAG((tty),ECHOE) #define L_ECHOK(tty) _L_FLAG((tty),ECHOK) #define L_ECHONL(tty) _L_FLAG((tty),ECHONL) #define L_ECHOCTL(tty) _L_FLAG((tty),ECHOCTL) #define L_ECHOKE(tty) _L_FLAG((tty),ECHOKE) #define L_TOSTOP(tty) _L_FLAG((tty),TOSTOP) #define I_UCLC(tty) _I_FLAG((tty),IUCLC) #define I_NLCR(tty) _I_FLAG((tty),INLCR) #define I_CRNL(tty) _I_FLAG((tty),ICRNL) #define I_NOCR(tty) _I_FLAG((tty),IGNCR) #define I_IXON(tty) _I_FLAG((tty),IXON) #define I_IXANY(tty) _I_FLAG((tty),IXANY) #define I_STRP(tty) _I_FLAG((tty),ISTRIP) #define O_POST(tty) _O_FLAG((tty),OPOST) #define O_NLCR(tty) _O_FLAG((tty),ONLCR) #define O_CRNL(tty) _O_FLAG((tty),OCRNL) #define O_NLRET(tty) _O_FLAG((tty),ONLRET) #define O_LCUC(tty) _O_FLAG((tty),OLCUC) #define C_SPEED(tty) ((tty)->termios->c_cflag & CBAUD) #define C_HUP(tty) (C_SPEED((tty)) == B0) /* * Where all of the state associated with a tty is kept while the tty * is open. Since the termios state should be kept even if the tty * has been closed --- for things like the baud rate, etc --- it is * not stored here, but rather a pointer to the real state is stored * here. Possible the winsize structure should have the same * treatment, but (1) the default 80x24 is usually right and (2) it's * most often used by a windowing system, which will set the correct * size each time the window is created or resized anyway. * IMPORTANT: since this structure is dynamically allocated, it must * be no larger than 4096 bytes. Changing TTY_BUF_SIZE will change * the size of this structure, and it needs to be done with care. * - TYT, 9/14/92 */ struct tty_struct { struct termios *termios; int pgrp; int session; unsigned char stopped:1, status_changed:1, packet:1; unsigned char ctrl_status; short line; int disc; int flags; int count; struct winsize winsize; int (*open)(struct tty_struct * tty, struct file * filp); void (*close)(struct tty_struct * tty, struct file * filp); void (*write)(struct tty_struct * tty); int (*ioctl)(struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned int arg); void (*throttle)(struct tty_struct * tty, int status); void (*set_termios)(struct tty_struct *tty, struct termios * old); struct tty_struct *link; unsigned char *write_data_ptr; int write_data_cnt; void (*write_data_callback)(void * data); void * write_data_arg; struct tty_queue read_q; struct tty_queue write_q; struct tty_queue secondary; }; struct tty_ldisc { int flags; /* * The following routines are called from above. */ int (*open)(struct tty_struct *); void (*close)(struct tty_struct *); int (*read)(struct tty_struct * tty, struct file * file, char * buf, int nr); int (*write)(struct tty_struct * tty, struct file * file, char * buf, int nr); int (*ioctl)(struct tty_struct * tty, struct file * file, unsigned int cmd, unsigned int arg); /* * The following routines are called from below. */ void (*handler)(struct tty_struct *); }; #define LDISC_FLAG_DEFINED 0x00000001 /* * These are the different types of thottle status which can be sent * to the low-level tty driver. The tty_io.c layer is responsible for * notifying the low-level tty driver of the following conditions: * secondary queue full, secondary queue available, and read queue * available. The low-level driver must send the read queue full * command to itself, if it is interested in that condition. * * Note that the low-level tty driver may elect to ignore one or both * of these conditions; normally, however, it will use ^S/^Q or some * sort of hardware flow control to regulate the input to try to avoid * overflow. While the low-level driver is responsible for all * receiving flow control, note that the ^S/^Q handling (but not * hardware flow control) is handled by the upper layer, in * copy_to_cooked. */ #define TTY_THROTTLE_SQ_FULL 1 #define TTY_THROTTLE_SQ_AVAIL 2 #define TTY_THROTTLE_RQ_FULL 3 #define TTY_THROTTLE_RQ_AVAIL 4 /* * This defines the low- and high-watermarks for the various conditions. * Again, the low-level driver is free to ignore any of these, and has * to implement RQ_THREHOLD_LW for itself if it wants it. */ #define SQ_THRESHOLD_LW 16 #define SQ_THRESHOLD_HW 768 #define RQ_THRESHOLD_LW 16 #define RQ_THRESHOLD_HW 768 /* * These bits are used in the flags field of the tty structure. * * So that interrupts won't be able to mess up the queues, * copy_to_cooked must be atomic with repect to itself, as must * tty->write. Thus, you must use the inline functions set_bit() and * clear_bit() to make things atomic. */ #define TTY_WRITE_BUSY 0 #define TTY_READ_BUSY 1 #define TTY_CR_PENDING 2 #define TTY_SQ_THROTTLED 3 #define TTY_RQ_THROTTLED 4 #define TTY_IO_ERROR 5 #define TTY_WRITE_FLUSH(tty) tty_write_flush((tty)) #define TTY_READ_FLUSH(tty) tty_read_flush((tty)) extern void tty_write_flush(struct tty_struct *); extern void tty_read_flush(struct tty_struct *); extern struct tty_struct *tty_table[]; extern int tty_check_write[]; extern struct tty_struct * redirect; extern struct tty_ldisc ldiscs[]; extern int fg_console; extern unsigned long video_num_columns; extern unsigned long video_num_lines; extern struct wait_queue * keypress_wait; #define TTY_TABLE_IDX(nr) ((nr) ? (nr) : (fg_console+1)) #define TTY_TABLE(nr) (tty_table[TTY_TABLE_IDX(nr)]) /* intr=^C quit=^| erase=del kill=^U eof=^D vtime=\0 vmin=\1 sxtc=\0 start=^Q stop=^S susp=^Z eol=\0 reprint=^R discard=^U werase=^W lnext=^V eol2=\0 */ #define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0" extern long rs_init(long); extern long lp_init(long); extern long con_init(long); extern long tty_init(long); extern void flush_input(struct tty_struct * tty); extern void flush_output(struct tty_struct * tty); extern void wait_until_sent(struct tty_struct * tty); extern void copy_to_cooked(struct tty_struct * tty); extern int tty_register_ldisc(int disc, struct tty_ldisc *new); extern int tty_ioctl(struct inode *, struct file *, unsigned int, unsigned int); extern int is_orphaned_pgrp(int pgrp); extern int is_ignored(int sig); extern int tty_signal(int sig, struct tty_struct *tty); extern int kill_pg(int pgrp, int sig, int priv); extern int kill_sl(int sess, int sig, int priv); extern void tty_hangup(struct tty_struct * tty); extern void tty_unhangup(struct file *filp); extern void do_SAK(struct tty_struct *tty); /* tty write functions */ extern void rs_write(struct tty_struct * tty); extern void con_write(struct tty_struct * tty); /* serial.c */ extern int rs_open(struct tty_struct * tty, struct file * filp); /* pty.c */ extern int pty_open(struct tty_struct * tty, struct file * filp); /* console.c */ extern int con_open(struct tty_struct * tty, struct file * filp); extern void update_screen(int new_console); extern void blank_screen(void); extern void unblank_screen(void); /* vt.c */ extern int vt_ioctl(struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned int arg); #endif |