mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
![Alan Cox](/assets/img/avatar_default.png)
This is the core of the switch to the new framework. I've split it from the driver patches which are mostly search/replace and would encourage people to give this one a good hard stare. The references to BOTHER and ISHIFT are the termios values that must be defined by a platform once it wants to turn on "new style" ioctl support. The code patches here ensure that providing 1. The termios overlays the ktermios in memory 2. The only new kernel only fields are c_ispeed/c_ospeed (or none) the existing behaviour is retained. This is true for the patches at this point in time. Future patches will define BOTHER, ISHIFT and enable newer termios structures for each architecture, and once they are all done some of the ifdefs also vanish. [akpm@osdl.org: warning fix] [akpm@osdl.org: IRDA fix] Signed-off-by: Alan Cox <alan@redhat.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
286 lines
11 KiB
C
286 lines
11 KiB
C
#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.
|
|
*
|
|
* 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.
|
|
*
|
|
* void (*close)(struct tty_struct * tty, struct file * filp);
|
|
*
|
|
* This routine is called when a particular tty device is closed.
|
|
*
|
|
* 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
|
|
* number of characters actually accepted for writing. This
|
|
* routine is mandatory.
|
|
*
|
|
* void (*put_char)(struct tty_struct *tty, unsigned char ch);
|
|
*
|
|
* 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.
|
|
*
|
|
* 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().
|
|
*
|
|
* 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.
|
|
*
|
|
* 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.
|
|
*
|
|
* void (*set_termios)(struct tty_struct *tty, struct ktermios * old);
|
|
*
|
|
* This routine allows the tty driver to be notified when
|
|
* device's termios settings have changed. Note that a
|
|
* well-designed tty driver should be prepared to accept the case
|
|
* where old == NULL, and try to do something rational.
|
|
*
|
|
* void (*set_ldisc)(struct tty_struct *tty);
|
|
*
|
|
* This routine allows the tty driver to be notified when the
|
|
* device's termios settings have changed.
|
|
*
|
|
* 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.
|
|
*
|
|
* 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.
|
|
*
|
|
* void (*stop)(struct tty_struct *tty);
|
|
*
|
|
* This routine notifies the tty driver that it should stop
|
|
* outputting characters to the tty device.
|
|
*
|
|
* void (*start)(struct tty_struct *tty);
|
|
*
|
|
* This routine notifies the tty driver that it resume sending
|
|
* characters to the tty device.
|
|
*
|
|
* void (*hangup)(struct tty_struct *tty);
|
|
*
|
|
* This routine notifies the tty driver that it should hangup the
|
|
* tty device.
|
|
*
|
|
* void (*break_ctl)(struct tty_stuct *tty, int state);
|
|
*
|
|
* 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,
|
|
* TIOCCBRK. Otherwise, these ioctls will be passed down to the
|
|
* driver to handle.
|
|
*
|
|
* 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.
|
|
*
|
|
* void (*send_xchar)(struct tty_struct *tty, char ch);
|
|
*
|
|
* This routine is used to send a high-priority XON/XOFF
|
|
* character to the device.
|
|
*/
|
|
|
|
#include <linux/fs.h>
|
|
#include <linux/list.h>
|
|
#include <linux/cdev.h>
|
|
|
|
struct tty_struct;
|
|
|
|
struct tty_operations {
|
|
int (*open)(struct tty_struct * tty, struct file * filp);
|
|
void (*close)(struct tty_struct * tty, struct file * filp);
|
|
int (*write)(struct tty_struct * tty,
|
|
const unsigned char *buf, int count);
|
|
void (*put_char)(struct tty_struct *tty, unsigned char ch);
|
|
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);
|
|
void (*set_termios)(struct tty_struct *tty, struct ktermios * old);
|
|
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);
|
|
void (*break_ctl)(struct tty_struct *tty, int state);
|
|
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);
|
|
int (*read_proc)(char *page, char **start, off_t off,
|
|
int count, int *eof, void *data);
|
|
int (*write_proc)(struct file *file, const char __user *buffer,
|
|
unsigned long count, void *data);
|
|
int (*tiocmget)(struct tty_struct *tty, struct file *file);
|
|
int (*tiocmset)(struct tty_struct *tty, struct file *file,
|
|
unsigned int set, unsigned int clear);
|
|
};
|
|
|
|
struct tty_driver {
|
|
int magic; /* magic number for this structure */
|
|
struct cdev cdev;
|
|
struct module *owner;
|
|
const char *driver_name;
|
|
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 */
|
|
struct ktermios init_termios; /* Initial termios */
|
|
int flags; /* tty driver flags */
|
|
int refcount; /* for loadable tty drivers */
|
|
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;
|
|
struct ktermios **termios;
|
|
struct ktermios **termios_locked;
|
|
void *driver_state; /* only used for the PTY driver */
|
|
|
|
/*
|
|
* Interface routines from the upper tty layer to the tty
|
|
* driver. Will be replaced with struct tty_operations.
|
|
*/
|
|
int (*open)(struct tty_struct * tty, struct file * filp);
|
|
void (*close)(struct tty_struct * tty, struct file * filp);
|
|
int (*write)(struct tty_struct * tty,
|
|
const unsigned char *buf, int count);
|
|
void (*put_char)(struct tty_struct *tty, unsigned char ch);
|
|
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);
|
|
void (*set_termios)(struct tty_struct *tty, struct ktermios * old);
|
|
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);
|
|
void (*break_ctl)(struct tty_struct *tty, int state);
|
|
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);
|
|
int (*read_proc)(char *page, char **start, off_t off,
|
|
int count, int *eof, void *data);
|
|
int (*write_proc)(struct file *file, const char __user *buffer,
|
|
unsigned long count, void *data);
|
|
int (*tiocmget)(struct tty_struct *tty, struct file *file);
|
|
int (*tiocmset)(struct tty_struct *tty, struct file *file,
|
|
unsigned int set, unsigned int clear);
|
|
|
|
struct list_head tty_drivers;
|
|
};
|
|
|
|
extern struct list_head tty_drivers;
|
|
|
|
struct tty_driver *alloc_tty_driver(int lines);
|
|
void put_tty_driver(struct tty_driver *driver);
|
|
void tty_set_operations(struct tty_driver *driver,
|
|
const struct tty_operations *op);
|
|
|
|
/* 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.)
|
|
*
|
|
* 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.
|
|
*
|
|
* 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.
|
|
*/
|
|
#define TTY_DRIVER_INSTALLED 0x0001
|
|
#define TTY_DRIVER_RESET_TERMIOS 0x0002
|
|
#define TTY_DRIVER_REAL_RAW 0x0004
|
|
#define TTY_DRIVER_DYNAMIC_DEV 0x0008
|
|
#define TTY_DRIVER_DEVPTS_MEM 0x0010
|
|
|
|
/* 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 */
|