tty驱动在linux中的分层结构:
如图所示,tty驱动程序分为三层。第一层是内核层(tty_core),主要代码由内核代码实现在tty_io.c中;
第二层为线路规程层(line_discipline),开发者可以自己注册并实现一个线路规程驱动;第三层为驱动层
(tty_driver),这一层主要由内核实现在serial_core.c中。
这里的tty驱动不包括最底层的硬件驱动,如uart驱动。以uart驱动为例,tty_driver层 需要通过uart_driver
与hardware相连。
下面我们来分析一下tty驱动程序每一层做的事情。
1、tty_core
内核层是所有tty类型驱动的顶层架构,向应用层提供了统一的接口,应用层的open/read/write/ioctl/close
等调用会首先到达这里。此层由内核实现,代码主要在tty_io.c文件中。该层实现了tty设备的file_operations
函数操作集。
static const struct file_operations tty_fops = {
.llseek = no_llseek,
.read = tty_read,
.write = tty_write,
.poll = tty_poll,
.unlocked_iockl = tty_ioctl,
.open = tty_open,
.release = tty_release,
.fasync = tty_fasync,
};
1)每个tty类型的驱动注册时都调用tty_register_driver函数
int tty_register_driver(struct tty_driver *driver)
{
......
cdev_init(&driver->cdev, &tty_fops); //字符设备驱动
......
}
2)在tty_read函数中调用线路规程层的read函数
static ssize_t tty_read(struct file *file,char __user *buf, siz