1. tty线路设置用户空间接口
可以调用用户空间的termios库函数,改变tty线路设置,或者获取当前线路设置。
用户空间应用程序需引用 termios.h 头文件,该头文件包含了终端设备的I/O接口。

termios结构体 描述了终端设备的操作模式

typedef unsigned char    cc_t;
typedef unsigned int    speed_t;
typedef unsigned int    tcflag_t;#define NCCS 19
struct termios {tcflag_t c_iflag;        /* input mode flags */tcflag_t c_oflag;        /* output mode flags */tcflag_t c_cflag;        /* control mode flags */tcflag_t c_lflag;        /* local mode flags */cc_t c_line;            /* line discipline */cc_t c_cc[NCCS];        /* control characters */
};

c_cflag --- 控制标志,包含了如下位域信息:
CSIZE ---- 字长
CSTOPB ---- 两个停止位
PARENB ---- 奇偶校验位使能
PARODD ---- 奇校验位,当PARENB被使能时。
CREAD ---- 字符接收使能,如果没有使能,仍能从端口接收字符,但这些字符都要被丢弃。
CRTSCTS ---- 如果被置位,CTS 状态改变时将发送报告。
CLOCAL ---- 如果没有置位,调制解调器状态改变时将发送报告。
c_iflag --- 输入标志,包含如下位信息:
INPCK ---- 使能帧和奇偶校验错误检查。
BRKINT ---- break 将清除终端输入/输出队列,向终端上前台程序发出 SIGINT 信号。
PARMRK ---- 奇偶校验和帧错误被标记,在INPCK 被设置且IGNPAR未被设置的情况下才有效。
IGNPAR ---- 忽略奇偶校验和帧错误。
IGNBRK ---- 忽略 break 。
2. 用户空间中有如下函数:
2.1 设置和获取终端设备的操作模式:
int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int optional_actions, struct termios *termios_p );
2.2 设置和获取输入/输出波特率:
speed_t cfgetospeed(struct termios *termios_p); //获得输出波特率
speed_t cfgetispeed(struct termios *termios_p); //获得输入波特率

int cfsetospeed(struct termios *termios_p); //设置输出波特率
int cfsetispeed(struct termios *termios_p); //设置输入波特率

2.3 下面一组函数完成线路控制:
int tcdrain(int fd); //等待所有输出都被发送
int tcflush(int fd, int queue_selector);   //flush输入输出缓存
int tcflow(int fd, int action);  //对输入输出流进行控制
int tcsendback(int fd, int duration); //发送break。

3. tty驱动的set_termios()函数

大部分termios用户空间的函数,被库转换为对驱动节点的ioctl()调用,而tty_ioctl()中的大部分命令会被tty核心转换为对tty驱动的set_termios()成员函数的调用。
set_termios()函数,需要根据用户对termiosde 设置要求, 完成实际的硬件设置。如字长,奇偶校验位,停止位,波特率等。

下面是 set_termios()成员函数的范例:

static void xxx_set_termios(struct tty_struct *tty, struct termios *old_termios)
{struct xxx_tty *info = (struct cyclades_port *)tty->driver_data;//新设置=旧设置if (tty->termios->c_cflags == old_termios->cflag)return;...//关闭CRTSCTS硬件流控制if ((old_termios->c_cflag & CRTSCTS) && !(cflag & CRTSCTS)){...}//打开CRTSCTS 硬件流控制if (!(old_termios->c_cflag & CRTSCTS) && (cflag & CRTSCTS)){...}//设置字节大小switch (tty->termios->c_cflag & CSIZE){case CS5:...case CS6:...case CS7:...case CS8:...}//设置奇偶校验位if (tty->termios->c_cflag & PARENB)if(tty->termios->c_cflag & PARODD)   //奇校验...else      //偶校验...
}

3.1 tty_register_ldisc() --- 注册线路规程函数

/***    tty_register_ldisc    -    install a line discipline*    @disc: ldisc number*    @new_ldisc: pointer to the ldisc object**    Installs a new line discipline into the kernel. The discipline*    is set up as unreferenced and then made available to the kernel*    from this point onwards.**    Locking:*        takes tty_ldisc_lock to guard against ldisc races*/
int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc)
{unsigned long flags;int ret = 0;if (disc < N_TTY || disc >= NR_LDISCS)return -EINVAL;spin_lock_irqsave(&tty_ldisc_lock, flags);tty_ldiscs[disc] = new_ldisc;new_ldisc->num = disc;new_ldisc->refcount = 0;spin_unlock_irqrestore(&tty_ldisc_lock, flags);return ret;
}
EXPORT_SYMBOL(tty_register_ldisc);

3.2  tty_disc_ops --- tty 线路规程操作函数

struct tty_ldisc_ops tty_ldisc_N_TTY = {.magic = TTY_LDISC_MAGIC,.name = "n_tty",.open = n_tty_open,.close = n_tty_close,.flush_buffer = n_tty_flush_buffer,.chars_in_buffer = n_tty_chars_in_buffer,.read = n_tty_read,.write = n_tty_write,.ioctl = n_tty_ioctl,.set_termios = n_tty_set_termios,.poll = n_tty_poll,.receive_buf = n_tty_receive_buf,.write_wakeup = n_tty_write_wakeup
};

tty线路规程(discipline)设置相关推荐

  1. linux 终端设备 - 线路规程

    line discipline(LDISC) 线路规程,是linux和类unix系统终端子系统的一个软件驱动层.终端子系统从上到下可划分为三层: 顶层tty core驱动层提供字符设备接口(因为所有的 ...

  2. Linu系统编程---10(Linux的终端,线路规程,网络终端,进程组)

    终端 输入输出设备的总称 在 UNIX 系统中,用户通过终端登录系统后得到一个 Shell 进程,这个终端成为 Shell 进程的控制终端(Controlling Terminal), 进程中,控制终 ...

  3. Linux串口驱动(2) - 线路规程

    1. 注册tty的ldisc ldisc全称 line discipline(线路规程),因为历史原因,tty属于一类设备,而串口设备只是其中一种,所以该模块负责将用户操作桥接到不同的tty驱动.从代 ...

  4. couldn't set tty to ppp discipline invalid argument

    参考: http://pptpclient.sourceforge.net/howto-diagnosis.phtml#conventions http://blog.chinaunix.net/ui ...

  5. tty驱动初步了解学习

    一.linux tty驱动框架 本人是linux驱动初学者,最近在初步学习uart驱动,在这记录下来自己的理解 linux3.10 soc:君正x1000e 四位大佬写的很好 https://blog ...

  6. tty初探 — uart驱动框架分析

    写在前面: 我们没有讲UART驱动,不过我们认为,只要系统学习了第2期,应该具备分析UART驱动的能力,小编做答疑几年以来,陆陆续续有不少人问到UART驱动怎么写,所以今天就分享一篇深度长文(1700 ...

  7. usb serial port 驱动_tty初探 — uart驱动框架分析

    写在前面: 我们没有讲UART驱动,不过我们认为,只要系统学习了第2期,应该具备分析UART驱动的能力,小编做答疑几年以来,陆陆续续有不少人问到UART驱动怎么写,所以今天就分享一篇深度长文(1700 ...

  8. Linux内核(一) [ IMX RK ] TTY-UART驱动框架解析

    平台:NXP imx6ull 内核版本:4.1.15 文章目录 一.Linux TTY驱动框架 二.Linux Uart驱动框架 三.UART相关结构体uart_driver(UART驱动结构体) . ...

  9. Linux的tty设备介绍

    本文转载于:对于Linux内核tty设备的一点理解 目录 前言 一.终端按照其自身能力分类 二.linux系统的终端设备 1. 控制台 2. 伪终端pty(pseudo-tty) 3. 串口终端(/d ...

最新文章

  1. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组
  2. centos7 解决chrome提示您的连接不是私密连接的方法
  3. PE 学习(七)第七章:资源表
  4. arcgis 出图背景_ArcGIS中导出数据时老显示导出失败,显示“保存对象时出错”什么原因?...
  5. ubuntu 18.04安装米聊
  6. Android之Launcher分析和修改4——初始化加载数据
  7. 2018 蓝桥杯省赛 B 组模拟赛(一) 封印之门+最短路径之Floyd
  8. JS实现Ajax异步刷新
  9. cola,一个做consensus clustering的R包
  10. CI框架PHP漫画小说二合一CMS
  11. HCIBench_2.3.1部署_VSAN_测试工具
  12. Oracle 甩手 Java EE,Eclipse 基金会成新东家
  13. Windows系统Ionic安装教程/Ionic环境配置
  14. 用js两张图片合并成一张图片
  15. 敌兵布阵(HDU - 1166)(线段树的点更新-区间查询)
  16. mysql 无法创建sock,mysql.sock无法打开的问题
  17. Gallery模块管理系统相册,支持从相册中选择图片或视频文件、保存图片或视频文件到相册等功能。通过plus.gallery获取相册管理对象
  18. Python 饼图
  19. sau交流学习社区--songEagle开发系列:Vue.js + Koa.js项目中使用JWT认证
  20. 换电脑了大量数据如何迁移?

热门文章

  1. FFmpeg sws_scale库文件分析
  2. 最新,2022年JCR正式发布(附影响因子名单下载)
  3. FAIL : No keyword with name '/dev/mapper/vg1-lv1' found.(解决方法)
  4. Server 2016/Windows 10使用域管理员账户操作提示权限不足的问题
  5. 推出更安静的通知权限界面
  6. tensorRT教程——tensor RT OP理解(实现自定义层,搭建网络)
  7. java数组总结及键盘输入方法
  8. 在PGConf.Asia-中文技术论坛,纵览16个方向42场演讲
  9. 使用tensorflow和Keras的初级教程
  10. 解决夜神模拟器连接eclipse的问题