1.tty概念分析

  • 在Linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备。由于串口也是一种终端,因此这里引入终端这个概念

    • 串口终端(/dev/ttyS*

          <ul><li>串口终端是使用计算机串口连接的终端设备。Linux把每个串行端口都看作是一个字符设备。这些串行端口所对应的设备名称是<strong> /dev/ttySAC0;/dev/ttySAC1……</strong></li></ul></li><li>控制台终端(<strong>/dev/console</strong>)<ul><li>在Linux系统中,计算机的输出设备通常被称为<strong>控制台终端(Console)</strong>,这里特指printk信息输出到的设备。<strong>/dev/console</strong>是一个虚拟的设备,它需要映射到真正的tty(物理终端)上,比如通过内核启动参数” <strong>console=ttySAC0</strong>”就把console映射到了串口0。</li></ul></li><li>虚拟终端(<strong>/dev/tty*</strong>)<ul><li>当用户登录时,使用的是虚拟终端。使用Ctcl+Alt+[F1—F6]组合键时,我们就可以切换到tty1、tty2、tty3等上面去。tty1–tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名。</li></ul></li>
      </ul></li>
      <li>在Linux内核中printk函数处理是交给控制台终端的,控制台终端又把它映射到串口终端或者屏幕终端上。而虚拟终端更多是在应用程序中使用。</li>
      

2.tty架构解析

  • Linux tty子系统包含:tty核心,tty线路规程和tty驱动。tty核心是对整个tty设备的抽象,对用户提供统一的接口,tty线路规程是对传输数据的格式化,tty驱动则是面向tty设备的硬件驱动。它们的关系如下图。

  • 表现在代码实现中,流程就是下面图片描述的。

3.回溯串口数据发送

  • ttty最底层的发送函数:
  1. static void s3c24xx_serial_start_tx(struct uart_port *port)
  2. {
  3. struct s3c24xx_uart_port *ourport = to_ourport(port);
  4. dump_stack(); // 回溯函数的调用关系
  5. if (!tx_enabled(port)) {
  6. if (port->flags & UPF_CONS_FLOW)
  7. s3c24xx_serial_rx_disable(port);
  8. enable_irq(ourport->tx_irq);
  9. tx_enabled(port) = 1;
  10. }
  11. }
  • 在源码中加入dump_stack(),回溯函数的调用关系。
  • 对内核代码重新编译,下载到开发板,终端打印回溯信息:
  1. [<c018dddc>] (s3c24xx_serial_start_tx+0x0/0x64) from [<c018a114>] (uart_start+0x68/0x6c)
  2. r5:c38c5800 r4:60000013
  3. [<c018a0ac>] (uart_start+0x0/0x6c) from [<c018b9ec>] (uart_write+0xc0/0xe0)
  4. r5:c38c5800 r4:00000000
  5. [<c018b92c>] (uart_write+0x0/0xe0) from [<c0176c0c>] (n_tty_write+0x1d8/0x448)
  6. [<c0176a34>] (n_tty_write+0x0/0x448) from [<c0174258>] (tty_write+0x14c/0x244)
  7. [<c017410c>] (tty_write+0x0/0x244) from [<c01743d8>] (redirected_tty_write+0x88/0x98)
  8. [<c0174350>] (redirected_tty_write+0x0/0x98) from [<c009ca6c>] (vfs_write+0xb4/0xe8)
  9. r9:c397e000 r8:c00300c8 r7:00000004 r6:c397ff78 r5:40000000
  10. r4:c3960100
  • 去掉系统调用接口和内核服务例程相关函数。
  • redirected_tty_write()函数调用tty核心tty_write(),tty_write()调用线路规程里面的ldisc.write(),然后调用n_tty_write()、uart_start(),最后调用tty驱动函数s3c24xx_serial_start_tx()。

原文链接:https://blog.csdn.net/qq_22847457/article/details/91477264 原文:小虾米_2018

Linux串口驱动程序(1)-tty驱动程序架构相关推荐

  1. linux设备模型之tty驱动架构分析,linux设备模型之uart驱动架构分析

    五: uart_add_one_port()操作本文引用地址:http://www.eepw.com.cn/article/201610/305916.htm 在前面提到.在对uart设备文件过程中. ...

  2. Linux tty驱动程序一 架构

    tty 核心概览如下图所示: 可以看到,tty 架构的划分层次,由下至上的逻辑关系为:硬件 -> tty 驱动 -> tty 线路规程(也译为行规程)-> tty 核心 -> ...

  3. tty,串口,控制台与驱动程序

    tty 设备的名称是从过去的电传打字机缩写而来,最初是指链接到 Unix 系统上的物理或者虚拟终端.随着时间的推移,当通过串行口能够建立起终端连接后,这个名字也用来指任何的串口设备.物理 tty 设备 ...

  4. linux tty驱动名称,Linux下TTY驱动程序分析

    1.tty设备 有串口.usb转串口.调制解调器(传统的WinModem类设备)等.Linux-tty驱动程序的核心紧挨在标准字符设备驱动层之下,并体统了一系列的功能,作为接口被终端类型设备使用.内核 ...

  5. linux5.5 dev null,NULL TTY驱动程序将出现在Linux 5.2内核中

    虽然最初在内核邮件列表中首次提出这个驱动程序时,有人对它的实用性和实用性提出了一些问题,但是NULL TTY驱动程序将在即将到来的Linux 5.2内核周期中开始它的主线之旅. NULL TTY驱动程 ...

  6. linux下进程的tty,Linux下TTY驱动程序分析

    3.核心结构体 #include struct tty_driver { int magic;  /*幻数,通常被设置为TTY_DRIVER_MAGIC.在alloc_tty_driver函数中被初始 ...

  7. linux串口驱动安装 RPM,Devart数据库工具【教程】:在Linux(DEB / RPM)上安装和配置ODBC驱动程序...

    ODBCDriver/驱动程序为基于ODBC的应用程序提供高性能和功能丰富的连接解决方案,可以直接从Windows,macOS,Linux(32位和64位)访问最流行的数据库.驱动程序完全支持标准OD ...

  8. 关于linux UART驱动和tty架构的理解

    关于linux UART驱动和tty架构的理解 最近要开发一个驱动程序,需要用到串口和SPI接口.平台的串口驱动程序本身在开发板中已经被实现了,也可以就这样直接使用,但是这样分开使用的结果就是在串口和 ...

  9. 戴文的Linux内核专题:03驱动程序

    转自Linux中国 驱动程序是使内核能够沟通和操作硬件或协议(规则和标准)的小程序.没有驱动程序,内核不知道如何与硬件沟通或者处理协议(内核实际上先发送指令给BIOS,然后BIOS传给硬件). Lin ...

最新文章

  1. 《转》Python学习(14)-对文件的操作(一)
  2. JVM字节码指令集大全及其介绍
  3. 微信jssdk 图片上传 JAVA_微信jssdk图片上传
  4. mysql从字符串中取子字符串_如何从开始于MySQL中特定位置的字符串中提取子字符串?...
  5. 微软官方反间谍流氓软件WindowsDefender
  6. arm-linux-ld: cannot find -lgcc,/arm-linux-gnueabi/bin/ld: cannot find crt1.o
  7. 本周四直播:Oracle 19c 升级实战分享
  8. Qt5设置应用程序图标及程序的发布
  9. mysql:分组中某字段最大值的查询结果
  10. Metaweblog在Android上使用
  11. Android车牌识别sdk开发包,【车牌识别SDK 车牌识别SDK开发包 车牌识别系统】 - 太平洋安防网...
  12. 为什么每天都在学习,生活还是没有任何改善?
  13. JSON与聚合数据不解之缘二
  14. linux V4L2子系统——v4l2架构(1)之整体架构
  15. 汽车知识待解决作业题
  16. eclipse的启动失败提示“发生了错误,请参阅日志文件“
  17. 性能调优--gzip、缓存、content-download、逐针渲染、Queueing、动态延迟加载、最小化主线程工作
  18. 2018/12/22 JSJ_JC_03
  19. 【已解决】电脑插网线可以上网,但是显示黄色感叹号
  20. 选硬盘时,该选择SSD/SATA/SAS哪个好?

热门文章

  1. 钢笔朝花夕拾录————一位钢笔玩家的入坑至出坑心路历程
  2. 基于Mirai框架的QQ机器人使用文档----郑大科协2021招新群
  3. nginx环境下执行php文件就报502,nginx请求php文件提示502错误 | 吴老二
  4. 图像视频滤镜算法---几何滤镜
  5. 有个定时任务突然不执行了,别急,原因可能在这
  6. 基于FPGA+SDRAM+BT656视频解码移植总结
  7. 音频合并的软件有哪些?这几个软件分享给你
  8. 送一台高清显示器(控制人数,限时删)
  9. ubuntu 22.04 国内镜像阿里云/163源/清华大学/中科大--转--已验证
  10. 安全培训总结-Https