《Linux Device Drivers》第十八章 TTY驱动程序——note
- 简单介绍
- tty设备的名称是从过去的电传打字机缩写而来,最初是指连接到Unix系统上的物理或虚拟终端
- Linux tty驱动程序的核心紧挨在标准字符设备驱动层之下,并提供了一系列的功能,作为接口被终端类型设备使用
- 有三种类型的tty驱动程序:控制台、串口和pty
- /proc/tty/drivers
- 当前注冊并存在于内核的tty设备在/sys/class/tty下都有自己的子文件夹
- 小型TTY驱动程序
- <linux/tty_driver.h>
- struct tty_driver
- tiny_tty_driver = alloc_tty_driver(TINY_TTY_MINORS);
- static struct tty_operations serial_ops = {.open=tiny_open, .close=tiny_close, .write=tiny_write, .write_room=tiny_write_room, .set_termios=tiny_set_termios,}
- tiny_tty_driver->owner=THIS_MODULE;
- tiny_tty_driver->driver_name=”tiny_tty”;
- tiny_tty_driver->name=”ttty”;
- tiny_tty_driver->devfs_name=”tty/ttty%d”;
- tiny_tty_driver->major=TINY_TTY_MAJOR;
- tiny_tty_driver->type=TTY_DRIVER_TYPE_SERIAL;
- tiny_tty_driver->subtype=SERIAL_TYPE_NORMAL;
- tiny_tty_driver->flags=TTY_DRIVER_REAL_RAW|TTY_DRIVER_NO_DEVFS;
- tiny_tty_driver->init_termios=tty_std_termios;
- tiny_tty_driver->init_termios.c_cflag=B9600|CS8|CREAD|HUPCL|CLOCAL;
- tty_set_operaions(tiny_tty_driver, &serial_ops);
- retval = tty_register_driver(tiny_tty_driver);
- for (i=0;i<TINY_TTY_MINORS; ++i) tty_unregister_device(tiny_tty_driver, i);
- tty_unregister_driver(tiny_tty_driver);
- termios结构
- 用来提供一系列安全的设置值
- struct termios
- tcflag_t c_iflag;
- tcflag_t c_oflag;
- tcflag_t c_cflag;
- tcflag_c c_lflag;
- cc_t c_line;
- tty_driver函数指针
- open和close
- 当用户使用open打开由驱动程序分配的设备节点时,tty核心将调用open函数
- 当调用open函数时。tty驱动程序或者将数据保存到传递给它的tty_struct变量中
- 数据流
- 当数据要发送给硬件时,用户调用write函数
- 首先tty核心接收到了该调用,然后内核将数据发送给tty驱动程序的write函数
- tty驱动程序在中断上下文中时,它不会调用不论什么可能休眠的函数
- 当tty子系统本身须要将一些数据传送到tty设备之外时,能够调用write函数
- 当tty核心想知道由tty驱动程序提供的可用写入缓冲区大小时,就会调用write_room函数
- 其它缓冲函数
- flush_chars
- wait_until_sent
- flush_buffer
- 怎么没有read函数
- 当tty驱动程序接收到数据后。它将负责把从硬件获取的不论什么数据传递给tty核心,而不使用传统的read函数
- tty核心将缓冲数据直到接到来自用户的请求
- 在一个名为tty_flip_buffer的结构中,tty核心缓冲从tty驱动程序接收的数据
- tty_insert_flip_char
- tty_flip_buffer_push
- open和close
- TTY线路设置
- set_termios
- 大部分termios的用户空间函数将会被库转换成对驱动程序节点的ioctl调用
- 大量的不同tty ioctl调用会被ttyp核心转换成一个对tty驱动程序的set_termios函数调用
- tty驱动程序必须可以对在termios结构中全部不同的设置进行解码,并对不论什么须要的改变做出响应
- tiocmget和tiocmset
- 在2.4及更早的内核中,使用了大量的tty ioctl调用来获得及设置不同的控制线路參数
- 这通过常量TIOCMGET、TIOCMBIS、TIOCMBIC和TIOCMSET来完毕
- TIOCMGET用来获得内核的线路设置值。在2.6.版本号的内核中,该ioctl调用被tty驱动程序中的tiocmget回调函数所取代
- 剩下的三个ioctl如今被简化成tty驱动程序中的一个tiocmset回调函数了
- int (*tiocmget) (struct tty_struct *tty, struct file *file);
- int (*tiocmset) (struct tty_struct *tty, struct file *file, unsigned int set, unsigned int clear);
- set_termios
- ioctls
- 当ioctl为一个设备节点被调用时,tty核心将调用tty_driver结构中的ioctl回调函数
- 经常使用词tty ioctl的列表
- TIOCSERGETLSR
- 获得这个tty设备线路状态寄存器(LSR)的值
- TIOCGSERIAL
- 获得串行线路信息
- TIOCSSERIAL
- 设置串行线路信息
- TIOCMIWAIT
- 等待MSR的变化
- TIOCGICOUNT
- 获得中断计数
- TIOCSERGETLSR
- proc和sys对TTY设备的处理
- tty核心为不论什么tty驱动程序都提供了很easy的办法。用来维护在/proc/tty/driver文件夹中的一个文件
- 假设驱动程序定义了read_proc或者write_proc函数。将创建该文件。接着不论什么对该文件的读写将被发送给驱动程序
- tty_driver结构具体解释
- tty_driver结构用来向tty核心注冊一个tty驱动程序
- struct tty_driver
- struct module *owner;
- int magic;
- 幻数
- const char *driver_name;
- 在/proc/tty和sysfs中使用,表示驱动程序的名字
- const char *name;
- 驱动程序节点的名字
- int name_base;
- 为创建设备名字而使用的開始编号
- short major;
- 驱动程序的主设备号
- short minor_start;
- 驱动程序使用的最小次设备号
- short num;
- 能够分配驱动程序次设备号的个数
- short type;
- TTY_DRIVER_TYPE_SYSTEM
- TTY_DRIVER_TYPE_CONSOLE
- TTY_DRIVER_TYPE_SERIAL
- TTY_DRIVER_TYPE_PTY
- short subtype;
- 描写叙述向tty核心注冊的是何种tty驱动程序
- struct termios init_termios;
- 当被创建时,含有初始值的termios结构
- int flags;
- 驱动程序标志位
- struct proc_dir_entry *proc_entry;
- 该驱动程序的/proc入口结构体
- struct tty_driver *other;
- 指向tty从属设备驱动程序的指针
- void *driver_state;
- tty驱动程序内部的状态
- struct tty_driver *next;
- struct tty_driver *prev;
- 链接变量
- tty_operations结构具体解释
- tty_operations结构中包括全部的回调函数,它们被tty驱动程序设置,并被tty核心调用
- struct tty_operations
- int (*open) (struct tty_struct *tty, struct file *filp);
- int (*close) (struct tty_struct *tty, struct file *filp);
- int (*write) (struct tty_struct *tty, const unsigned char *buf, int count);
- void (*put_char) (struct tty_struct *tty, unsigned char ch);
- void (*flush_chars) (struct tty_struct *tty);
- void (*wait_until_sent) (struct tty_struct *tty, int timeout);
- int (*write_room) (struct tty_struct *tty);
- int (*chars_in_buffer) (struct tty_struct *tty);
- int (*ioctl) (struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg);
- void (*set_termios) (struct tty_struct *tty, struct termios *old);
- void (*throttle) (struct tty_struct *tty);
- void (*unthrottle) (struct tty_struct *tty);
- void (*stop) (struct tty_struct *tty);
- void (*start) (struct tty_struct *tty);
- void (*hangup) (struct tty_struct *tty);
- void (*bread_ctl) (struct tty_struct *tty, int state);
- void (*flush_buffer) (struct tty_struct *tty);
- void (*set_ldisc) (struct tty_struct *tty);
- void (*send_xchar) (struct tty_struct *tty, char ch);
- int (*read_proc) (char *page, char **start, off_t off, int count, int *eof, void *data);
- int (*write_proc) (struct file *file, const char *buffer, unsigned long count, void *data);
- int (*tiocmget) (struct tty_struct *tty, struct file *file);
- int (*tiocset) (struct tty_struct *tty, struct file *file, unsigned int set, unsigned int clear);
- tty_struct结构具体解释
- tty核心使用tty_struct保存当前特定ttyport的状态
- struct tty_struct
- unsigned long flags;
- 当前tty设备的状态
- TTY_THROTTLED
- TTY_IO_ERROR
- TTY_OTHER_CLOSED
- TTY_EXCLUSIVE
- TTY_DEBUG
- TTY_DO_WRITE_WAKEUP
- TTY_PUSH
- TTY_CLOSING
- TTY_DONT_FLIP
- TTY_HW_COOK_OUT
- TTY_HW_COOK_IN
- TTY_PTY_LOCK
- TTY_NO_WRITE_SPLIT
- struct tty_flip_buffer flip;
- tty设备的交替缓冲区
- struct tty_ldisc ldisc;
- tty设备的线路规程
- wait_queue_head_t write_wait;
- 用于tty写函数的wait_queue
- struct termios *termios;
- 指向设置tty设备的termios结构指针
- unsigned char stopped:1;
- 表示tty设备是否已经停止
- unsigned char hw_stopped:1
- 表示tty设备硬件是否已经停止
- unsigned char low_latency:1
- 表示tty设备是否是个慢速设备
- unsigned char closing:1
- 表示tty设备是否正在关闭port
- struct tty_driver driver;
- 控制tty设备的当前tty_driver结构
- void *driver_data;
- tty_driver用来把数据保存在tty驱动程序中的指针
- unsigned long flags;
《Linux Device Drivers》第十八章 TTY驱动程序——note的更多相关文章
- 《Linux Device Drivers》第八章 分配内存——note
本章主要介绍Linux内核的内存管理. kmalloc函数的内幕 不正确所获取的内存空间清零 分配的区域在物理内存中也是连续的 flags參数 <linux/slab.h> <lin ...
- 《Linux Device Drivers》第十四章 Linux 设备型号
基本介绍 2.6内核设备模型来提供的抽象叙述性描述的一般系统的结构,为了支持各种不同的任务 电源管理和系统关机 用户空间与通信 热插拔设备 设备类型 kobject.kset和子系统 kobject是 ...
- Linux内核分析第十八章读书笔记
第十八章 调试 调试工作艰难是内核级开发区别于用户级开发的一个显著特点. 18.1 准备开始 我们需要什么? 一个bug 一个藏匿bug的内核版本 思路:假定能够让bug重现 在用户级程序中,bug直 ...
- Linux内核分析——第十八章 调试
第十八章 调试 18.1 准备开始 1.在用户级的程序里,bug表现比较直接:在内核中却不清晰. 2.内核级开发的调试工作远比用户级开发艰难的多. 3.准备工作需要的是: (1)一个bug (2 ...
- 《Linux Device Drivers》第十六章 块设备驱动程序——note
基本介绍 块设备驱动程序通过主传动固定大小数据的随机访问设备 Linux核心Visual块设备作为基本设备和不同的字符设备类型 Linux块设备驱动程序接口,使块设备最大限度地发挥其效用.一个问题 一 ...
- 《Linux Device Drivers》第十二章 PCI司机——note
一个简短的引论 它给这一章总线架构的高级概述 集中访问讨论Peripheral Component Interconnect(PCI,外围组件互连)外设内核函数 PCI公交车是最好的支持的内核总线 本 ...
- 《Linux Device Drivers》 第十七章 网络驱动程序——note
基本介绍 第三类是标准的网络接口Linux设备,本章介绍的内核,其余的交互网络接口描述 网络接口,必须使用特定的内核数据结构本身注册,与外部分组交换数据线打电话时准备 经常使用的文件上的网络接口操作是 ...
- 《Linux Device Drivers》第十五章 内存映射和DMA——note
简单介绍 很多类型的驱动程序编程都须要了解一些虚拟内存子系统怎样工作的知识 当遇到更为复杂.性能要求更为苛刻的子系统时,本章所讨论的内容迟早都要用到 本章的内容分成三个部分 讲述mmap系统调用的实现 ...
- linux device drivers ch03
ch03.字符设备驱动程序 编写驱动程序的第一步就是定义驱动程序为用户程序提供的能力(机制).接下来以scull(“Simple Character Utility for Loading Local ...
随机推荐
- J1002.JavaFX简介
引言 2008年12月05日,SUN发布了JavaFX第一个正式版本,以期望Java在UI端能够更好地应用于开发富客户端的互联网应用(Rich Internet Cliet). 2011年发布的Jav ...
- 用cmd命令创建oracle 数据库、用户和表空间
Win+R调查运行窗口,输入cmd回车 连接到本地oracle库 创建名为"SXSJ"的表空间,其初始大小为512M,支持自动扩展,每次增量为32M: create tablesp ...
- .net core 同时实现网站管理员后台、会员、WebApi登录及权限控制
我们在开网站信息系统时,常常有这样几个角色,如后台的管理员,前台的会员,以及我们各种应用的WebAPI 都需要进行登录操作及权限控制,那么在.net core如何进行设计呢. 首先我使用的是.net ...
- [转载] 基于zookeeper、连接池、Failover/LoadBalance等改造Thrift 服务化
转载自http://blog.csdn.net/zhu_tianwei/article/details/44115667 http://blog.csdn.net/column/details/sli ...
- WebService学习总结
因为最近开发的项目需求中涉及到了webservice,正好对这块知识以前学过但是又忘记了,于是想着从新学习下,整理一个笔记,便于后面的复习.于是有了本文,下面开始介绍webservice. 一.简介 ...
- MySQL解压版配置步骤详细教程
解压mysql到D盘根目录 在解压路径下复制my-default.ini,修改名称为my.ini 在my.ini内容如下 [client]default-character-set=utf8 [mys ...
- python 开源全文检索工具 Whoosh
About Whoosh Whoosh is a fast, featureful full-text indexing and searching library implemented in pu ...
- linux下高可用LVS搭建及配置方法
一,安装与配置ipvsadm ipvsadm --help #查询是否安装成功 二,配置Director Server服务器 1. ifconifg eth0:0 183.61.87.4 ...
- lua 函数调用1 -- 闭包详解和C调用
这里, 简单的记录一下lua中闭包的知识和C闭包调用 前提知识: 在lua api小记2中已经分析了lua中值的结构, 是一个 TValue{value, tt}组合, 如果有疑问, 可以去看一下 一 ...
- 关于cocos2d-x面试的问题
关于高效渲染的问题: 1.先说下渲染批次:这是游戏引擎中一个比较重要的优化指标,指的是一次渲染凋用.也就是说,渲染的次数越少,游戏的运行效率越高. 2.CCSpriteBatchNode就是cocos ...