3、核心结构体
#include
struct tty_driver {
int magic; /*幻数,通常被设置为TTY_DRIVER_MAGIC。在alloc_tty_driver函数中被初始化*/
struct kref kref; /* Reference management */
struct cdev cdev;
struct module *owner;/*驱动模块的所有者*/
const char *driver_name;/*驱动程序的名称,在/proc/tty和sysfs中使用*/
const char *name;/*驱动节点的名字*/
int name_base; /*为穿件设备名字而使用的开始编号*/
int major; /*驱动程序的主设备号*/
int minor_start; /*驱动程序使用的最小次设备号*/
int minor_num; /* number of *possible* devices */
int num; /*可以分配给驱动程序次设备号的个数*/
short type; /* type of tty driver */
short subtype; /* subtype of tty driver */
struct ktermios init_termios; /*当被创建时,含有初始值的termios结构*/
int flags; /*驱动程序标志位*/
struct proc_dir_entry *proc_entry; /*驱动程序的/proc入口结构体*/
struct tty_driver *other; /*指向tty从属设备驱动程序的指针*/
/*
* Pointer to the tty data structures
*/
struct tty_struct **ttys;
struct ktermios **termios;
struct ktermios **termios_locked;
void *driver_state;
/*
* Driver methods
*/
const struct tty_operations *ops;
struct list_head tty_drivers;
};
#include
struct tty_operations {
struct tty_struct * (*lookup)(struct tty_driver *driver,
struct inode *inode, int idx);
int (*install)(struct tty_driver *driver, struct tty_struct *tty);
void (*remove)(struct tty_driver *driver, struct tty_struct *tty);
int (*open)(struct tty_struct * tty, struct file * filp);/*open函数*/
void (*close)(struct tty_struct * tty, struct file * filp);/*close函数*/
void (*shutdown)(struct tty_struct *tty);
void (*cleanup)(struct tty_struct *tty);
int (*write)(struct tty_struct * tty,
const unsigned char *buf, int count);/*write函数*/
int (*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,
unsigned int cmd, unsigned long arg);/*当设备节点的调用ioctl(2)时,该函数被tty核心调用*/
long (*compat_ioctl)(struct tty_struct *tty,
unsigned int cmd, unsigned long arg);
void (*set_termios)(struct tty_struct *tty, struct ktermios * old);/*改变设备的termios设置*/
void (*throttle)(struct tty_struct * tty);/*当tty核心的输入缓冲区满的时候,调用该函数。
tty驱动程序将试图通知设备,不要再发送更多的字符。*/
void (*unthrottle)(struct tty_struct * tty);/*当tty核心的输入缓冲区被清空是,调用该函数,使能其接受更多的数据*/
void (*stop)(struct tty_struct *tty);/*tty驱动程序将停止向设备发送数据*/
void (*start)(struct tty_struct *tty);/*恢复数据的传送*/
void (*hangup)(struct tty_struct *tty);/*当tty驱动程序挂起tty设备时,调用该函数。此时对任何特定硬件的操作应当被挂起*/
int (*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);/*发送X类型的字符函数。要发送的字符放在ch变量中*/
int (*tiocmget)(struct tty_struct *tty);/*获得特定tty设备当前的线路设置*/
int (*tiocmset)(struct tty_struct *tty,
unsigned int set, unsigned int clear);/*为特定的tty设备设置当前线路*/
int (*resize)(struct tty_struct *tty, struct winsize *ws);
int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew);
int (*get_icount)(struct tty_struct *tty,
struct serial_icounter_struct *icount);
#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
const struct file_operations *proc_fops;
};