Blame view
include/linux/tty_driver.h
13.7 KB
1da177e4c
|
1 2 3 4 5 6 7 8 9 |
#ifndef _LINUX_TTY_DRIVER_H #define _LINUX_TTY_DRIVER_H /* * This structure defines the interface between the low-level tty * driver and the tty routines. The following routines can be * defined; unless noted otherwise, they are optional, and can be * filled in with a null pointer. * |
99f1fe189
|
10 11 12 13 14 15 16 17 |
* struct tty_struct * (*lookup)(struct tty_driver *self, int idx) * * Return the tty device corresponding to idx, NULL if there is not * one currently in use and an ERR_PTR value on error. Called under * tty_mutex (for now!) * * Optional method. Default behaviour is to use the ttys array * |
8b0a88d59
|
18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
* int (*install)(struct tty_driver *self, struct tty_struct *tty) * * Install a new tty into the tty driver internal tables. Used in * conjunction with lookup and remove methods. * * Optional method. Default behaviour is to use the ttys array * * void (*remove)(struct tty_driver *self, struct tty_struct *tty) * * Remove a closed tty from the tty driver internal tables. Used in * conjunction with lookup and remove methods. * * Optional method. Default behaviour is to use the ttys array * |
1da177e4c
|
32 33 34 35 36 |
* int (*open)(struct tty_struct * tty, struct file * filp); * * This routine is called when a particular tty device is opened. * This routine is mandatory; if this routine is not filled in, * the attempted open will fail with ENODEV. |
f34d7a5b7
|
37 38 |
* * Required method. |
1da177e4c
|
39 40 41 42 43 |
* * void (*close)(struct tty_struct * tty, struct file * filp); * * This routine is called when a particular tty device is closed. * |
f34d7a5b7
|
44 45 |
* Required method. * |
feebed651
|
46 47 |
* void (*shutdown)(struct tty_struct * tty); * |
f278a2f7b
|
48 49 50 51 52 53 54 55 56 57 |
* This routine is called synchronously when a particular tty device * is closed for the last time freeing up the resources. * * * void (*cleanup)(struct tty_struct * tty); * * This routine is called asynchronously when a particular tty device * is closed for the last time freeing up the resources. This is * actually the second part of shutdown for routines that might sleep. * |
feebed651
|
58 |
* |
1da177e4c
|
59 60 61 62 63 64 |
* int (*write)(struct tty_struct * tty, * const unsigned char *buf, int count); * * This routine is called by the kernel to write a series of * characters to the tty device. The characters may come from * user space or kernel space. This routine will return the |
36c7343b4
|
65 |
* number of characters actually accepted for writing. |
1da177e4c
|
66 |
* |
f34d7a5b7
|
67 68 69 |
* Optional: Required for writable devices. * * int (*put_char)(struct tty_struct *tty, unsigned char ch); |
1da177e4c
|
70 71 72 73 74 75 76 |
* * This routine is called by the kernel to write a single * character to the tty device. If the kernel uses this routine, * it must call the flush_chars() routine (if defined) when it is * done stuffing characters into the driver. If there is no room * in the queue, the character is ignored. * |
f34d7a5b7
|
77 78 79 80 |
* Optional: Kernel will use the write method if not provided. * * Note: Do not call this function directly, call tty_put_char * |
1da177e4c
|
81 82 83 84 |
* void (*flush_chars)(struct tty_struct *tty); * * This routine is called by the kernel after it has written a * series of characters to the tty device using put_char(). |
f34d7a5b7
|
85 86 87 88 |
* * Optional: * * Note: Do not call this function directly, call tty_driver_flush_chars |
1da177e4c
|
89 90 91 92 93 94 95 |
* * int (*write_room)(struct tty_struct *tty); * * This routine returns the numbers of characters the tty driver * will accept for queuing to be written. This number is subject * to change as output buffers get emptied, or if the output flow * control is acted. |
f34d7a5b7
|
96 97 98 99 |
* * Required if write method is provided else not needed. * * Note: Do not call this function directly, call tty_write_room |
1da177e4c
|
100 101 102 103 104 105 106 |
* * int (*ioctl)(struct tty_struct *tty, struct file * file, * unsigned int cmd, unsigned long arg); * * This routine allows the tty driver to implement * device-specific ioctl's. If the ioctl number passed in cmd * is not recognized by the driver, it should return ENOIOCTLCMD. |
e10cc1df1
|
107 |
* |
f34d7a5b7
|
108 109 |
* Optional * |
e10cc1df1
|
110 111 112 113 |
* long (*compat_ioctl)(struct tty_struct *tty, struct file * file, * unsigned int cmd, unsigned long arg); * * implement ioctl processing for 32 bit process on 64 bit system |
f34d7a5b7
|
114 115 |
* * Optional |
1da177e4c
|
116 |
* |
edc6afc54
|
117 |
* void (*set_termios)(struct tty_struct *tty, struct ktermios * old); |
1da177e4c
|
118 119 |
* * This routine allows the tty driver to be notified when |
f34d7a5b7
|
120 121 122 123 |
* device's termios settings have changed. * * Optional: Called under the termios lock * |
1da177e4c
|
124 125 126 127 128 |
* * void (*set_ldisc)(struct tty_struct *tty); * * This routine allows the tty driver to be notified when the * device's termios settings have changed. |
f34d7a5b7
|
129 130 |
* * Optional: Called under BKL (currently) |
1da177e4c
|
131 132 133 134 135 136 |
* * void (*throttle)(struct tty_struct * tty); * * This routine notifies the tty driver that input buffers for * the line discipline are close to full, and it should somehow * signal that no more characters should be sent to the tty. |
39c2e60f8
|
137 |
* |
38db89799
|
138 139 |
* Optional: Always invoke via tty_throttle(), called under the * termios lock. |
1da177e4c
|
140 141 142 143 144 145 146 |
* * void (*unthrottle)(struct tty_struct * tty); * * This routine notifies the tty drivers that it should signals * that characters can now be sent to the tty without fear of * overrunning the input buffers of the line disciplines. * |
38db89799
|
147 148 |
* Optional: Always invoke via tty_unthrottle(), called under the * termios lock. |
39c2e60f8
|
149 |
* |
1da177e4c
|
150 151 152 153 |
* void (*stop)(struct tty_struct *tty); * * This routine notifies the tty driver that it should stop * outputting characters to the tty device. |
f34d7a5b7
|
154 155 156 157 |
* * Optional: * * Note: Call stop_tty not this method. |
1da177e4c
|
158 159 160 161 162 |
* * void (*start)(struct tty_struct *tty); * * This routine notifies the tty driver that it resume sending * characters to the tty device. |
f34d7a5b7
|
163 164 165 166 |
* * Optional: * * Note: Call start_tty not this method. |
1da177e4c
|
167 168 169 170 171 172 |
* * void (*hangup)(struct tty_struct *tty); * * This routine notifies the tty driver that it should hangup the * tty device. * |
36c7343b4
|
173 |
* Optional: |
f34d7a5b7
|
174 |
* |
9e98966c7
|
175 |
* int (*break_ctl)(struct tty_stuct *tty, int state); |
1da177e4c
|
176 177 178 179 180 181 182 183 |
* * This optional routine requests the tty driver to turn on or * off BREAK status on the RS-232 port. If state is -1, * then the BREAK status should be turned on; if state is 0, then * BREAK should be turned off. * * If this routine is implemented, the high-level tty driver will * handle the following ioctls: TCSBRK, TCSBRKP, TIOCSBRK, |
f34d7a5b7
|
184 185 |
* TIOCCBRK. * |
9e98966c7
|
186 187 188 189 |
* If the driver sets TTY_DRIVER_HARDWARE_BREAK then the interface * will also be called with actual times and the hardware is expected * to do the delay work itself. 0 and -1 are still used for on/off. * |
f34d7a5b7
|
190 |
* Optional: Required for TCSBRK/BRKP/etc handling. |
1da177e4c
|
191 192 193 194 195 196 |
* * void (*wait_until_sent)(struct tty_struct *tty, int timeout); * * This routine waits until the device has written out all of the * characters in its transmitter FIFO. * |
f34d7a5b7
|
197 198 199 200 |
* Optional: If not provided the device is assumed to have no FIFO * * Note: Usually correct to call tty_wait_until_sent * |
1da177e4c
|
201 202 203 204 |
* void (*send_xchar)(struct tty_struct *tty, char ch); * * This routine is used to send a high-priority XON/XOFF * character to the device. |
f34d7a5b7
|
205 206 207 |
* * Optional: If not provided then the write method is called under * the atomic write lock to keep it serialized with the ldisc. |
8c9a9dd0f
|
208 |
* |
fc6f62382
|
209 |
* int (*resize)(struct tty_struct *tty, struct winsize *ws) |
8c9a9dd0f
|
210 211 212 213 214 215 216 217 218 |
* * Called when a termios request is issued which changes the * requested terminal geometry. * * Optional: the default action is to update the termios structure * without error. This is usually the correct behaviour. Drivers should * not force errors here if they are not resizable objects (eg a serial * line). See tty_do_resize() if you need to wrap the standard method * in your own logic - the usual case. |
1d65b4a08
|
219 220 221 222 223 224 225 226 |
* * void (*set_termiox)(struct tty_struct *tty, struct termiox *new); * * Called when the device receives a termiox based ioctl. Passes down * the requested data from user space. This method will not be invoked * unless the tty also has a valid tty->termiox pointer. * * Optional: Called under the termios lock |
1da177e4c
|
227 228 229 230 231 232 233 |
*/ #include <linux/fs.h> #include <linux/list.h> #include <linux/cdev.h> struct tty_struct; |
f2d937f3b
|
234 |
struct tty_driver; |
1da177e4c
|
235 236 |
struct tty_operations { |
15f1a6338
|
237 238 |
struct tty_struct * (*lookup)(struct tty_driver *driver, struct inode *inode, int idx); |
8b0a88d59
|
239 240 |
int (*install)(struct tty_driver *driver, struct tty_struct *tty); void (*remove)(struct tty_driver *driver, struct tty_struct *tty); |
1da177e4c
|
241 242 |
int (*open)(struct tty_struct * tty, struct file * filp); void (*close)(struct tty_struct * tty, struct file * filp); |
feebed651
|
243 |
void (*shutdown)(struct tty_struct *tty); |
f278a2f7b
|
244 |
void (*cleanup)(struct tty_struct *tty); |
1da177e4c
|
245 246 |
int (*write)(struct tty_struct * tty, const unsigned char *buf, int count); |
f34d7a5b7
|
247 |
int (*put_char)(struct tty_struct *tty, unsigned char ch); |
1da177e4c
|
248 249 250 251 252 |
void (*flush_chars)(struct tty_struct *tty); int (*write_room)(struct tty_struct *tty); int (*chars_in_buffer)(struct tty_struct *tty); int (*ioctl)(struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg); |
e10cc1df1
|
253 254 |
long (*compat_ioctl)(struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg); |
edc6afc54
|
255 |
void (*set_termios)(struct tty_struct *tty, struct ktermios * old); |
1da177e4c
|
256 257 258 259 260 |
void (*throttle)(struct tty_struct * tty); void (*unthrottle)(struct tty_struct * tty); void (*stop)(struct tty_struct *tty); void (*start)(struct tty_struct *tty); void (*hangup)(struct tty_struct *tty); |
9e98966c7
|
261 |
int (*break_ctl)(struct tty_struct *tty, int state); |
1da177e4c
|
262 263 264 265 |
void (*flush_buffer)(struct tty_struct *tty); void (*set_ldisc)(struct tty_struct *tty); void (*wait_until_sent)(struct tty_struct *tty, int timeout); void (*send_xchar)(struct tty_struct *tty, char ch); |
1da177e4c
|
266 267 268 |
int (*tiocmget)(struct tty_struct *tty, struct file *file); int (*tiocmset)(struct tty_struct *tty, struct file *file, unsigned int set, unsigned int clear); |
fc6f62382
|
269 |
int (*resize)(struct tty_struct *tty, struct winsize *ws); |
1d65b4a08
|
270 |
int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew); |
f2d937f3b
|
271 272 273 274 275 |
#ifdef CONFIG_CONSOLE_POLL int (*poll_init)(struct tty_driver *driver, int line, char *options); int (*poll_get_char)(struct tty_driver *driver, int line); void (*poll_put_char)(struct tty_driver *driver, int line, char ch); #endif |
ae149b6be
|
276 |
const struct file_operations *proc_fops; |
1da177e4c
|
277 278 279 280 |
}; struct tty_driver { int magic; /* magic number for this structure */ |
7d7b93c14
|
281 |
struct kref kref; /* Reference management */ |
1da177e4c
|
282 283 284 |
struct cdev cdev; struct module *owner; const char *driver_name; |
1da177e4c
|
285 286 287 288 289 290 291 292 |
const char *name; int name_base; /* offset of printed name */ int major; /* major device number */ int minor_start; /* start of minor device number */ int minor_num; /* number of *possible* devices */ int num; /* number of devices allocated */ short type; /* type of tty driver */ short subtype; /* subtype of tty driver */ |
edc6afc54
|
293 |
struct ktermios init_termios; /* Initial termios */ |
1da177e4c
|
294 |
int flags; /* tty driver flags */ |
1da177e4c
|
295 296 297 298 299 300 301 |
struct proc_dir_entry *proc_entry; /* /proc fs entry */ struct tty_driver *other; /* only used for the PTY driver */ /* * Pointer to the tty data structures */ struct tty_struct **ttys; |
edc6afc54
|
302 303 |
struct ktermios **termios; struct ktermios **termios_locked; |
f34d7a5b7
|
304 |
void *driver_state; |
1da177e4c
|
305 |
/* |
f34d7a5b7
|
306 |
* Driver methods |
1da177e4c
|
307 |
*/ |
1da177e4c
|
308 |
|
f34d7a5b7
|
309 |
const struct tty_operations *ops; |
1da177e4c
|
310 311 312 313 |
struct list_head tty_drivers; }; extern struct list_head tty_drivers; |
7d7b93c14
|
314 315 316 |
extern struct tty_driver *alloc_tty_driver(int lines); extern void put_tty_driver(struct tty_driver *driver); extern void tty_set_operations(struct tty_driver *driver, |
b68e31d0e
|
317 |
const struct tty_operations *op); |
f2d937f3b
|
318 |
extern struct tty_driver *tty_find_polling_driver(char *name, int *line); |
1da177e4c
|
319 |
|
7d7b93c14
|
320 |
extern void tty_driver_kref_put(struct tty_driver *driver); |
f786ddd28
|
321 322 |
static inline struct tty_driver *tty_driver_kref_get(struct tty_driver *d) |
7d7b93c14
|
323 324 325 326 |
{ kref_get(&d->kref); return d; } |
1da177e4c
|
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 |
/* tty driver magic number */ #define TTY_DRIVER_MAGIC 0x5402 /* * tty driver flags * * TTY_DRIVER_RESET_TERMIOS --- requests the tty layer to reset the * termios setting when the last process has closed the device. * Used for PTY's, in particular. * * TTY_DRIVER_REAL_RAW --- if set, indicates that the driver will * guarantee never not to set any special character handling * flags if ((IGNBRK || (!BRKINT && !PARMRK)) && (IGNPAR || * !INPCK)). That is, if there is no reason for the driver to * send notifications of parity and break characters up to the * line driver, it won't do so. This allows the line driver to * optimize for this case if this flag is set. (Note that there * is also a promise, if the above case is true, not to signal * overruns, either.) * |
331b83198
|
347 348 349 350 351 352 353 354 355 |
* TTY_DRIVER_DYNAMIC_DEV --- if set, the individual tty devices need * to be registered with a call to tty_register_driver() when the * device is found in the system and unregistered with a call to * tty_unregister_device() so the devices will be show up * properly in sysfs. If not set, driver->num entries will be * created by the tty core in sysfs when tty_register_driver() is * called. This is to be used by drivers that have tty devices * that can appear and disappear while the main tty driver is * registered with the tty core. |
1da177e4c
|
356 357 358 359 |
* * TTY_DRIVER_DEVPTS_MEM -- don't use the standard arrays, instead * use dynamic memory keyed through the devpts filesystem. This * is only applicable to the pty driver. |
9e98966c7
|
360 361 362 363 364 |
* * TTY_DRIVER_HARDWARE_BREAK -- hardware handles break signals. Pass * the requested timeout to the caller instead of using a simple * on/off interface. * |
1da177e4c
|
365 366 367 368 |
*/ #define TTY_DRIVER_INSTALLED 0x0001 #define TTY_DRIVER_RESET_TERMIOS 0x0002 #define TTY_DRIVER_REAL_RAW 0x0004 |
331b83198
|
369 |
#define TTY_DRIVER_DYNAMIC_DEV 0x0008 |
1da177e4c
|
370 |
#define TTY_DRIVER_DEVPTS_MEM 0x0010 |
9e98966c7
|
371 |
#define TTY_DRIVER_HARDWARE_BREAK 0x0020 |
1da177e4c
|
372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 |
/* tty driver types */ #define TTY_DRIVER_TYPE_SYSTEM 0x0001 #define TTY_DRIVER_TYPE_CONSOLE 0x0002 #define TTY_DRIVER_TYPE_SERIAL 0x0003 #define TTY_DRIVER_TYPE_PTY 0x0004 #define TTY_DRIVER_TYPE_SCC 0x0005 /* scc driver */ #define TTY_DRIVER_TYPE_SYSCONS 0x0006 /* system subtypes (magic, used by tty_io.c) */ #define SYSTEM_TYPE_TTY 0x0001 #define SYSTEM_TYPE_CONSOLE 0x0002 #define SYSTEM_TYPE_SYSCONS 0x0003 #define SYSTEM_TYPE_SYSPTMX 0x0004 /* pty subtypes (magic, used by tty_io.c) */ #define PTY_TYPE_MASTER 0x0001 #define PTY_TYPE_SLAVE 0x0002 /* serial subtype definitions */ #define SERIAL_TYPE_NORMAL 1 #endif /* #ifdef _LINUX_TTY_DRIVER_H */ |