在上一章中我们介绍了tty子系统相关的数据结构,本章我们主要介绍tty driver的注册与注销、线路规程的注册与注销,tty端口的注册与注销等内容。
tty driver的注册与注销
主要实现tty controller 驱动的注册与注销操作,相应的函数包括tty_register_driver、tty_unregister_driver,下面我们分析下这两个函数实现的功能
tty_register_driver接口
该接口实现如下几个功能:
- 根据tty_driver设置的主设备号、次设备号、tty端口个数,调用alloc_chrdev_region/register_chrdev_region进行字符设备号区间的申请;
- 若该tty_driver动态创建字符设备,则在tty_register_driver中,仅创建次设备号范围为tty端口个数的字符设备;
- 若该tty_driver静态创建字符设备,则在tty_register_driver中,针对每一个tty端口均创建一个对应的字符设备(次设备个数为1);
- 将该tty_driver添加至tty_drivers链表中;
- 调用proc_tty_register_driver,在proc文件系统中,为该tty_driver创建对应的文件
tty_unregister_driver接口
该接口实现的功能比较简单,主要如下:
- 调用unregister_chrdev_region,注销已申请的字符设备号区间;
- 将该tty_driver从tty_drivers链表中删除。
tty device的注册与注销
针对tty device的注册与注销,主要涉及tty_unregister_device、tty_register_device这两个接口,而tty_register_device则是对tty_register_device_attr的封装。下面我们分析下这两个函数。
tty_register_device接口
该接口主要实现两个功能:
- 若该tty_driver没有设置TTY_DRIVER_DYNAMIC_ALLOC,则调用tty_cdev_add针对每一个tty端口均创建一个对应的字符设备(次设备个数为1);
- 申请struct device类型的内存空间,并将该device与tty_class关联,并调用device_register将该device注册至设备驱动子系统中,且该device中包含了字符设备的设备号,因此当将该设备注册至设备驱动子系统时,会通过netlink将设备注册的uevent信息发送给应用程序,而mdev或者udevd程序接收到该uevent信息后,则会根据注册信息,完成tty字符设备inode的创建,即可在/dev目录下创建相应的字符设备文件。
tty_unregister_device接口
该接口实现的功能如下:
- 调用device_destroy,将该tty端口对应的device从设备驱动子系统中移除(也即解除与tty_class的关联);
- 若该tty_driver没有设置TTY_DRIVER_DYNAMIC_ALLOC,则将调用cdev_del将对应的字符设备从字符设备模块中移除。
线路规程的注册与注销
针对线路规程的注册与注销,主要涉及函数tty_register_ldisc、tty_unregister_ldisc,主要是注册线路规程的操作接口,
针对线路规程操作接口,定义全局数组static struct tty_ldisc_ops *tty_ldiscs[NR_LDISCS];,其中NR_LDISCS的定义如下
#define NR_LDISCS 30
这两个函数的定义如下,主要就是将新的线路规程的ops添加至全局变量tty_ldiscs中,它们的处理逻辑比较简单,就不再说明。
以上即是tty_driver、tty device、tty 线路规程的注册与注销,其中线路规程的注册与注销我们在平时的驱动开发中基本上不会触及到。而针对tty_driver、tty device的注册与注销,若我们进行串口控制器的开发,则基本上需要了解,且只要使用tty_driver、tty device的注册与注销即可完成串口控制器相关驱动的注册与注销,下一章我们介绍tty 控制器驱动的开发流程,并完成一个虚拟的串口控制器驱动的开发。