学习笔记 --- LINUX TTY子系统框架分析
2014-04-05 13:58
507 查看
入口:tty_init
1 创建tty_cdev字符设备
cdev_init /*设置字符设备操作函数为tty_fops*/
cdev_add /* 注册字符设备*/
2 创建console_cdev字符设备(用于终端打印)
cdev_init /*设置字符设备操作函数为console_fops*/
cdev_add /* 注册字符设备*/
操作tty就是操作字符设备那样,这里以open为例说明。
打开一个tty设备时,调用tty_fops里的:
以uart为例,注册驱动时:
比如之前说过再open一个tty时,调用的是driver->ops里面的open,这里就是uart_ops里面的uart_open,这个uart_open是怎么找到他对应的硬件操作的?
1 创建tty_cdev字符设备
cdev_init /*设置字符设备操作函数为tty_fops*/
cdev_add /* 注册字符设备*/
2 创建console_cdev字符设备(用于终端打印)
cdev_init /*设置字符设备操作函数为console_fops*/
cdev_add /* 注册字符设备*/
操作tty就是操作字符设备那样,这里以open为例说明。
打开一个tty设备时,调用tty_fops里的:
open ret = __tty_open(inode, filp); dev_t device = inode->i_rdev; //通过设备节点找到设备号 driver = get_tty_driver(device, &index) //通过设备号,找到驱动与index list_for_each_entry(p, &tty_drivers, tty_drivers) { //遍历链表 dev_t base = MKDEV(p->major, p->minor_start); if (device < base || device >= base + p->num) continue; *index = device - base; return tty_driver_kref_get(p); } tty = tty_init_dev(driver, index, 0) //用driver数据初始化一个新的tty_struct tty = alloc_tty_struct(); initialize_tty_struct(tty, driver, idx); tty->driver = driver; tty->ops = driver->ops; tty->index = idx; retval = tty_driver_install_tty(driver, tty); //安装tty_struct retval = tty->ops->open(tty, filp); //driver->ops里面的open上面可以知道:操作tty时,通过设备节点找到设备号,再找到驱动,再调用驱动的抽象操作driver->ops,那么这个驱动怎样注册的?
以uart为例,注册驱动时:
ret = uart_register_driver(&s3c24xx_uart_drv) //uart_driver转换成tty_driver再注册 normal = alloc_tty_driver(drv->nr); drv->tty_driver = normal; normal->driver_state = drv; //s3c24xx_uart_drv设置为tty_driver的driver_state tty_set_operations(normal, &uart_ops) driver->ops = op; //设置好驱动的操作抽象:driver->ops retval = tty_register_driver(normal) list_add(&driver->tty_drivers, &tty_drivers); //添加到链表上面的操作抽象driver->ops里面的接口最终调用normal->driver_state的操作函数,而normal->driver_state= drv,所以这里调用的s3c24xx_uart_drv;
比如之前说过再open一个tty时,调用的是driver->ops里面的open,这里就是uart_ops里面的uart_open,这个uart_open是怎么找到他对应的硬件操作的?
uart_open struct uart_driver *drv = (struct uart_driver *)tty->driver->driver_state /*driver_state就是s3c24xx_uart_drv,在uart_register_driver(&s3c24xx_uart_drv)的时候设置的:normal->driver_state=drv;*/ line = tty->index state = uart_get(drv, line); //state = drv->state + line; uart_startup struct uart_port *uport = state->uart_port; retval = uport->ops->startup(uport); //uart_open的实际硬件操作
相关文章推荐
- 学习笔记 --- LINUX MTD子系统框架分析
- 学习笔记 --- LINUX网卡驱动框架分析
- 学习笔记 --- LINUX I2C总线驱动框架分析
- 学习笔记 --- LINUX UART串口驱动框架分析
- 学习笔记 --- LINUX USB总线驱动框架分析
- 学习笔记 --- LINUX输入子系统分析
- linux下tty子系统框架分析(linux3.4.2)
- Linux netfilter 学习笔记 之九 ip层netfilter的连接跟踪模块代码分析
- Linux驱动学习笔记----------IIC框架与流程(一)
- bootsect.s 分析—— Linux-0.11 学习笔记(一)
- Linux 学习笔记 -- 第四部分 Linux 使用着管理 -- 第19章 认识与分析日志文件
- Linux netfilter 学习笔记 之六 ip层netfilter的filter表的创建及其hook函数分析
- TQ2440 学习笔记—— 34、移植 Linux 内核【 Makefile 分析 】
- Linux 路由 学习笔记 之二 路由添加流程分析
- tornado 学习笔记9 Tornado web 框架---模板(template)功能分析
- Linux netfilter 学习笔记 之二 ip 层netfilter的hook 注册以及执行hook函数的概要分析
- Linux netfilter 学习笔记 之三 ip层netfilter的table、rule、match、target结构分析
- 嵌入式Linux驱动笔记(十二)------通俗易懂式分析了解spi框架
- 嵌入式Linux驱动笔记(七)------浅析tty与uart框架
- input子系统学习笔记五 按键驱动实例分析上