• 简单介绍

    • 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. js input输入事件兼容性问题

    if(navigator.userAgent.indexOf('Android') > -1){ $("#sign").on("input", funct ...

  2. 逻辑卷lvm创建、扩展、缩小

    系统环境:CentOS Linux release 7.3.1611 (Core) 3.10.0-514.el7.x86_64 CentOS6与7配置方法大同小异.通常是在系统安装的时候创建lvm,然 ...

  3. Cocoapods使用过程中遇到的问题

    前言:记录一些在CocoaPods使用过程中遇到的问题,本地环境:Xcode9.0 发现有的时候在执行pod init的时候不能正常地创建出来pod File文件,显示的错误如下: ――― MARKD ...

  4. PHP--最常用--必背函数总结!php学习者收藏必备!

    一.PHP系统函数 函数 功能 用法 var_dump() 打印变量结构信息,包括类型和值.数组将递归展开值 var_dump ( $arg1...); echo():是语法结构 输出一个或者多个字符 ...

  5. no suitable driver found for jdbc:mysql//localhost:3306/..

      出现这样的情况,一般有四种原因(网上查的): 一:连接URL格式出现了问题(Connection conn=DriverManager.getConnection("jdbc:mysql ...

  6. HQL连接查询和注解

    HQL连接查询和注解 一:HQL连接查询 各种连接查询: 内连接:inner join或join From Entity inner [inner] join [fetch] Entity.prope ...

  7. C#PreviewKeyDown 与KeyDown 区别

    PreviewKeyDown:在焦点位于此控件上的情况下,当有按键动作时发生(在 KeyDown 事件之前发生). 小注: 某些按键,比如 Tab.Return.Esc 和箭头键,通常会被某些控件忽略 ...

  8. css3 ajax加载进度线

    最近想了想ajax加载时的进项,便着手写了这个,我想css3的支持度已经够了 <button onclick="start()">button</button&g ...

  9. DNS:域名系统

    概述: DNS的作用在于将域名转换为对应的IP地址. DNS名字空间和UNIX文件系统相似,也是树形结构.以"."结尾的域名称为FQDN(Full Qualified Domain ...

  10. 去除url后缀(.html,.jsp等)的有效方法

    有时候,我们想要隐藏真正的路径,或者觉着很酷,举一个知乎网的例子,如https://www.zhihu.com/question/39547745 那么?如何做到呢,其实,可以有一个非常简单而有效的解 ...