root/include/linux/tty.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


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

/* [previous][next][first][last][top][bottom][index][help] */