• 简单介绍

    • 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
  • 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);
  • ioctls
    • 当ioctl为一个设备节点被调用时,tty核心将调用tty_driver结构中的ioctl回调函数
    • 经常使用词tty ioctl的列表
      • TIOCSERGETLSR

        • 获得这个tty设备线路状态寄存器(LSR)的值
      • TIOCGSERIAL
        • 获得串行线路信息
      • TIOCSSERIAL
        • 设置串行线路信息
      • TIOCMIWAIT
        • 等待MSR的变化
      • TIOCGICOUNT
        • 获得中断计数
  • 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驱动程序中的指针

《Linux Device Drivers》第十八章 TTY驱动程序——note的更多相关文章

  1. 《Linux Device Drivers》第八章 分配内存——note

    本章主要介绍Linux内核的内存管理. kmalloc函数的内幕 不正确所获取的内存空间清零 分配的区域在物理内存中也是连续的 flags參数 <linux/slab.h> <lin ...

  2. 《Linux Device Drivers》第十四章 Linux 设备型号

    基本介绍 2.6内核设备模型来提供的抽象叙述性描述的一般系统的结构,为了支持各种不同的任务 电源管理和系统关机 用户空间与通信 热插拔设备 设备类型 kobject.kset和子系统 kobject是 ...

  3. Linux内核分析第十八章读书笔记

    第十八章 调试 调试工作艰难是内核级开发区别于用户级开发的一个显著特点. 18.1 准备开始 我们需要什么? 一个bug 一个藏匿bug的内核版本 思路:假定能够让bug重现 在用户级程序中,bug直 ...

  4. Linux内核分析——第十八章 调试

    第十八章    调试 18.1 准备开始 1.在用户级的程序里,bug表现比较直接:在内核中却不清晰. 2.内核级开发的调试工作远比用户级开发艰难的多. 3.准备工作需要的是: (1)一个bug (2 ...

  5. 《Linux Device Drivers》第十六章 块设备驱动程序——note

    基本介绍 块设备驱动程序通过主传动固定大小数据的随机访问设备 Linux核心Visual块设备作为基本设备和不同的字符设备类型 Linux块设备驱动程序接口,使块设备最大限度地发挥其效用.一个问题 一 ...

  6. 《Linux Device Drivers》第十二章 PCI司机——note

    一个简短的引论 它给这一章总线架构的高级概述 集中访问讨论Peripheral Component Interconnect(PCI,外围组件互连)外设内核函数 PCI公交车是最好的支持的内核总线 本 ...

  7. 《Linux Device Drivers》 第十七章 网络驱动程序——note

    基本介绍 第三类是标准的网络接口Linux设备,本章介绍的内核,其余的交互网络接口描述 网络接口,必须使用特定的内核数据结构本身注册,与外部分组交换数据线打电话时准备 经常使用的文件上的网络接口操作是 ...

  8. 《Linux Device Drivers》第十五章 内存映射和DMA——note

    简单介绍 很多类型的驱动程序编程都须要了解一些虚拟内存子系统怎样工作的知识 当遇到更为复杂.性能要求更为苛刻的子系统时,本章所讨论的内容迟早都要用到 本章的内容分成三个部分 讲述mmap系统调用的实现 ...

  9. linux device drivers ch03

    ch03.字符设备驱动程序 编写驱动程序的第一步就是定义驱动程序为用户程序提供的能力(机制).接下来以scull(“Simple Character Utility for Loading Local ...

随机推荐

  1. javascript循环---性能优化

    循环是编程中是最为常见的结构,优化循环是性能优化中很重要的一个部分. 减值迭代:大多数循环使用一个从0开始.增加到某个特定值的迭代器.在很多情况下,从最大值开始,在循环中不断减值的迭代器更加高效. 简 ...

  2. 算法:JavaScript两数之和

    题目 Given an array of integers, return indices of the two numbers such that they add up to a specific ...

  3. jquery IE6 下animate 动画的opacity无效

    jquery IE6 下animate 动画的opacity无效,其实是有效的,因为IETester的一个小BUG 原生IE6 没问题...呵呵~~

  4. [转载] Storm:最火的流式处理框架

    转载自http://www.cnblogs.com/langtianya/p/5199529.html 伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样.更加便捷,同 ...

  5. CLR之委托的揭秘(一)

    初识委托:          在之前的学习中我们已经可以把对象,值,数组当作参数传递给方法,但是有没有可能把方法也当作参数传递给方法呢?有了这个想法于是就有了委托.方法当作一种参数去传递,但是方法有的 ...

  6. label的作用是什么?是怎么用的?

    label标签是用来定义表单控制间的关系,当用户选择该标签时,浏览器会自动将焦点转到和标签相关的表单控件上. 主要有以下两种用法用法: 一. <label for = "Name&qu ...

  7. fio——IO基准测试

    简介 fio是IO工具,既可以用于基准测试,也可以用于硬件的压力测试验证(stress/hardware verification). 支持13种不同的IO引擎(sync.mmap.libaio.po ...

  8. C#值参数和引用参数

    一.值参数 未用ref或out修饰符声明的参数为值参数. 使用值参数,通过将实参的值复制到形参的方式,把数据传递到方法.方法被调用时,系统做如下操作. 在栈中为形参分配空间. 复制实参到形参. 值参数 ...

  9. 深入理解立即执行函数(function(){})();

    ( function(){-} )()和( function (){-} () )是两种javascript立即执行函数的常见写法,要理解立即执行函数,需要先理解一些函数的基本概念. 1,函数声明,函 ...

  10. python win32 简单操作

    源由 刚开始是帮朋友做一个按键精灵操作旺信的脚本,写完后各种不稳定:后来看到python可以操作win32相关的api,恰好这一段时间正在学习python,感觉练手的时候到了~~~ 下载 要注意Pyt ...