tty_operations
struct tty_operations { struct tty_struct * (*lookup)(struct tty_driver *driver, struct inode *inode, int idx); //返回对应的tty设备, 若为NULL则返回ERR_PTR, 在tty_mutex函数中调用 //该项可选,默认为使用ttys array int (*install)(struct tty_driver *driver, struct tty_struct *tty); //install一个tty设备到tty驱动的内部表,与lookup和remove法相关联 //该项可选,默认为使用ttys array void (*remove)(struct tty_driver *driver, struct tty_struct *tty); //从tty驱动的内部表,remove一个关闭了的tty设备,与lookup和remove法相关联 //该项可选,默认为使用ttys array int (*open)(struct tty_struct * tty, struct file * filp); //当一个特别的tty设备open的时候,将调用该例程;该例程是强制性的,若该例程没有加入operations,open tty的时候将返回ENODEV //必须使用的方法 void (*close)(struct tty_struct * tty, struct file * filp); //当tty设备关闭时调用 //必须使用的方法 void (*shutdown)(struct tty_struct *tty); //在tty在关闭时,若仍持有一个带锁的特殊设备,需要调用该例程,想想我们经常使用的sudo shutdown -r/h/... now就明白了 //它执行在tty设备释放资源之前,所以可能执行在另一个tty设备持有kref的时候 void (*cleanup)(struct tty_struct *tty); //当一个tty设备在最后一次被关闭和释放资源时,异步地调用该例程,这个例程可以看成shutdown的可休眠的第二部分 int (*write)(struct tty_struct * tty, const unsigned char *buf, int count); //写函数,不多说 //可选使用:在需要写的设备中 int (*put_char)(struct tty_struct *tty, unsigned char ch); //当内核想写单个字符到tty设备时,调用该例程(其实也可以调用write例程,调用时置count为1即可) //可选使用:若设备在调用时未提供将使用write法 //注意:不要直接调用该例程,而应调用tty_put_char void (*flush_chars)(struct tty_struct *tty); //这个例程调用在tty使用put_char输出很多个字符后 //可选 //注意:不要直接调用,调用tty_driver_flush_chars int (*write_room)(struct tty_struct *tty); //这个例程返回tty设备将被写入的字符队列长度 //这个数字受输出缓冲区和输出流的变化影响 //当有write函数时需要 //注意:不要直接调用,调用tty_write_room int (*chars_in_buffer)(struct tty_struct *tty); //在buffer区中的字符 int (*ioctl)(struct tty_struct *tty, unsigned int cmd, unsigned long arg); //该例程允许tty设备实施设备特殊的ioctl,若ioctl的数值在cmd中未被设备检测到,将返回ENOIOCTLCMD //可选 long (*compat_ioctl)(struct tty_struct *tty, unsigned int cmd, unsigned long arg); //在64位系统中执行32位的ioctl的例程 //可选 void (*set_termios)(struct tty_struct *tty, struct ktermios * old); //该例程在设备的termios设置改变时通知驱动 //可选:在持termios lock的时候调用 void (*throttle)(struct tty_struct * tty); //当线程规划快满的时候提醒驱动程序,提示不要再输入字符到tty中 //可选:通常在tty_throttle()函数中获得termios lock时调用 void (*unthrottle)(struct tty_struct * tty); //提醒驱动程序,可以输入字符到tty中,因为线程规划空间够用 //可选:通常在tty_unthrottle()函数中,获得termios lock时调用 void (*stop)(struct tty_struct *tty); //提醒驱动,停止输出字符 //可选,注意:不是调用stop_tty void (*start)(struct tty_struct *tty); //提醒驱动,接着输入字符 //可选,助于:不是调用start_tty void (*hangup)(struct tty_struct *tty); //挂起tty,可选 int (*break_ctl)(struct tty_struct *tty, int state); //打开或关闭RS-232口,state为-1则打开,state为0则关闭 //若该函数执行,则高一级的tty将处理四种ioctls:TCSBRK, TCSBRKP, TIOCSBRK, TIOCCBRK //如果驱动程序设置了TTY_DRIVER_HARDWARE_BREAK,接着接口将被称作实际时间,而硬件延迟工作 //可选:需要收到TCSBRK/BRKP/etc void (*flush_buffer)(struct tty_struct *tty); //在使用put_char()写入一串字符后,该函数被内核调用 //可选 //注意:调用是应为tty_driver_flush_buffer void (*set_ldisc)(struct tty_struct *tty); //该例程在设备的termios设置改变时通知驱动 //可选:有BKL (currently)时调用 void (*wait_until_sent)(struct tty_struct *tty, int timeout); //该例程等待设备将其所有字符写入传输FIFO中 //可选:若设备有FIFO则需要 //注意:通常使用为tty_wait_until_sent void (*send_xchar)(struct tty_struct *tty, char ch); //该例程发送一个大端的XON/XOFF给驱动程序 //可选:如果不提供,之后写函数将被原子锁调用来保持它的序列性 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); //当一个termios的请求将改变 请求终端几何(requested terminal geometry)时调用 //可选:默认行为是 无错误地更新termios structure...... int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew); //当收到一个termiox基于ioctl的信号时调用,将用户空间的请求向下传递 //这个函数只有当tty包含tty->termiox指针的时候才会执行 //可选:持有termios lock的时候调用 int (*get_icount)(struct tty_struct *tty, struct serial_icounter_struct *icount); //当设备收到一个TIOCGICOUNT的信号时调用,将一个内核结构传入使其完成。 //这个函数只有在提供的时候调用,否则将返回EINVAL #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; };