首页 > 系统相关 > linux驱动移植-串口驱动

linux驱动移植-串口驱动

时间:2023-03-03 22:56:04浏览次数:52  
标签:仿真 tty 串口 终端 linux 驱动 控制台

----------------------------------------------------------------------------------------------------------------------------
内核版本:linux 5.2.8
根文件系统:busybox 1.25.0
u-boot:2016.05
----------------------------------------------------------------------------------------------------------------------------

一、终端(tty)

1.1 回顾

还记的在Mini2440之uboot移植流程之linux内核启动分析(六)小节中,我们介绍过u-boot在启动linux之前,需要做一些准备工作,比如配置启动参数:

#define CONFIG_BOOTARGS        "root=/dev/mtdblock3 console=ttySAC0,115200 init=/linuxrc"

其中:

  • root 指定文件系统位置,这里指定为NAND三号分区;
  • init 指定内核启动后执行的第一个应用程序;
  • console 指定使用哪个终端,这里的ttySAC0指的就是串口0;

1.2 tty

那什么是tty,tty是Teletype或Teletypewriter 的缩写,原来是指电传打字机,后来这种设备逐渐键盘和显示器取代。不管是电传打字机还是键盘显示器,都是作为计算机的终端设备存在的,所以tty也泛指计算机的终端(terminal)设备。

为了支持这些 tty设备,linux实现了一个叫做tty的子系统。所以 tty既指终端,也指linux的tty子系统,当然 tty还有更丰富(混乱)的含义,这一节我们将会解释。

1.2.1 硬件终端terminal

早期的终端(terminal) 是一台独立于计算机的机器(teletype 即, tty),大概像下面的样子:

它终端通过线缆与计算机连接,并完成计算机的输入输出功能:

 

现在物理终端实际上已经灭绝了,我们看到的所有tty都是模拟视频终端,即软件仿真出来的终端。

1.2.2 控制台console

提到终端就不能不提控制台console。控制台的概念与终端含义非常相近,其实现在我们经常用它们表示相同的东西,但是在计算机的早期时代,它们确实是不同的东西。

一些数控设备(比如数控机床)的控制箱,通常会被称为控制台,顾名思义,控制台就是一个直接控制设备的面板,上面有很多控制按钮。

在计算机里,把那套直接连接在电脑上的键盘和显示器就叫做控制台。而终端是通过串口连接上的,不是计算机自身的设备,而控制台是计算机本身就有的设备,一个计算机只有一个控制台。

计算机启动的时候,所有的信息都会显示到控制台上,而不会显示到终端上这同样说明,控制台是计算机的基本设备,而终端是附加设备。

计算机操作系统中,与终端不相关的信息,比如内核消息,后台服务消息,都可以显示到控制台上,但不会显示到终端上。比如在启动和关闭 linux 系统时,我们可以在控制台上看到很多的内核信息.

现在终端和控制台都由硬件概念,逐渐演化成了软件的概念。简单的说,能直接显示系统消息的那个终端称为控制台,其他的则称为终端(控制台也是一个终端)。或者我们在平时的使用中压根就不区分 linux 中的终端与控制台。

1.2.3 tty设备

从历史上看,终端刚开始就是终端机,配有打印机,键盘,带有一个串口,通过串口传送数据到主机端,然后主机处理完交给终端打印出来。电传打字机(teletype)可以被看作是这类设备的统称,因此终端也被简称为tty(teletype的缩写)。

如下图所示:

其中:

  • uart驱动:如上图所示,物理终端通过电缆连接到计算机上的 uart(通用异步接收器和发射器)。操作系统中有一个uart驱动程序用于管理字节的物理传输;
  • 行规范:上图中内核中的 Line discipline(行规范)用来提供一个编辑缓冲区和一些基本的编辑命令(退格,清除单个单词,清除行,重新打印),主要用来支持用户在输入时的行为(比如输错了,需要退格);
  • tty驱动:tty驱动用来进行会话管理,并且处理各种终端设备;

uart驱动、行规范和 tty驱动都位于内核中,它们的一端是终端设备,另一端是用户进程。因为在linux下所有的设备都是文件,所以它们三个加在一起被称为 "tty设备",即我们常说的 tty。

1.2.4 从软件仿真终端到伪终端

后来的终端慢慢演变成了键盘 + 显示器。如果我们要把内容输出到显示器,只要把这些内容写入到显示器对应的tty设备就可以了,然后由tty层负责匹配合适的驱动完成输出,这也是 linux 控制台的工作原理:

图中,tty驱动和行规范的行为与前面的示例类似,但不再有uart或物理终端。相反,软件仿真出视频终端,并最终被渲染到VGA显示器。注意,这里出现了软件仿真终端,它们是运行在内核态的。显示器和 tty1-tty6 都是软件仿真终端:

/dev/tty1-/dev/tty6 是这些仿真终端在文件系统中的表示,程序通过对这些文件的读写实现对仿真终端的读写。

如果我们在用户空间也进行终端仿真,情况会变得更加灵活,下图是xterm及其克隆的工作方式:

为了便于将终端仿真移入用户空间,同时仍保持tty子系统(tty子系统指tty 驱动和行规范)的完整,伪终端被发明了出来(pseudo terminal 或 pty)。伪终端在内核中分为两部分,分别是 master side和在tty驱动中实现的 slave side。注意上图中的 xterm,这是一个运行在用户态的终端仿真程序。

当创建一个伪终端时,会在 /dev/pts 目录下创建一个设备文件:

root@zhengyang:~# tty
/dev/pts/2

如果是通过 PuTTY 等终端仿真程序通过 SSH 的方式远程连接 linux,那么终端仿真程序通过 SSH 与 PTY master side 交换数据。

1.2.5 伪终端

伪终端(pseudo terminal,有时也被称为pty)是指伪终端 master 和伪终端slave 这一对字符设备。其中的 slave 对应 /dev/pts/ 目录下的一个文件,而 master 则在内存中标识为一个文件描述符(fd)。伪终端由终端模拟器提供,终端模拟器是一个运行在用户态的应用程序。

Master 端是更接近用户显示器、键盘的一端,slave端是在虚拟终端上运行的 CLI(Command Line Interface,命令行接口)程序。linux 的伪终端驱动程序,会把 master 端(如键盘)写入的数据转发给 slave 端供程序输入,把程序写入slave端的数据转发给 master 端供(显示器驱动等)读取。请参考下面的示意图:

我们打开的终端桌面程序,比如 GNOME Terminal,其实是一种终端模拟软件。当终端模拟软件运行时,它通过打开/dev/ptmx文件创建了一个伪终端的master和slave对,并让shell 运行在slave端。当用户在终端模拟软件中按下键盘按键时,它产生字节流并写入master 中,shell 进程便可从slave中读取输入;shell 和它的子程序,将输出内容写入slave 中,由终端模拟软件负责将字符打印到窗口中。

伪终端大概有三类使用场景:

  • 像xterm、gnome-terminal 等图形界面的终端模拟软件将键盘和鼠标事件转换为文本输入,并图形化地显示输出内容;
  • 远程shell 应用程序(如 sshd)在客户机上的远程终端和服务器上的伪终端之间中继输入和输出;
  • 多路复用器应用,如 screen 和 tmux。它们把输入和输出从一个终端转播到另一个终端,使文本模式的应用程序从实际的终端上脱离;

linux中为什么要提出伪终端这个概念呢?shell等命令行程序不可以直接从显示器和键盘读取数据吗?
为了同屏运行多个终端模拟器、并实现远程登录,还真不能让shell 直接跨过伪终端这一层。在操作系统的一大思想——虚拟化的指导下,为多个终端模拟器、远程用户分配多个虚拟的终端是有必要的。上图中的shell使用的slave 端就是一个虚拟化的终端。Master 端是模拟用户一端的交互。之所以称为虚拟化的终端,是因为它除了转发数据流外,还要有点终端的样子。

1.2.6 终端与伪终端的区别

至此我们可以得出这样的结论:现在所说的终端已经不是硬件终端了,而是软件仿真终端(终端模拟软件)。
关于终端和伪终端,可以简单的理解如下:

  • 真正的硬件终端基本上已经看不到了,现在所说的终端、伪终端都是软件仿真终端(即终端模拟软件);
  • 一些连接了键盘和显示器的系统中,我们可以接触到运行在内核态的软件仿真终端(tty1-tty6);
  • 通过 SSH 等方式建立的连接中使用的都是伪终端;
  • 伪终端是运行在用户态的软件仿真终端;

参考文章

[1]S3C2440 Linux UART 串口驱动-----1

[2]Linux UART 驱动 Part-1 (底层对接)

[3]Linux UART 驱动 Part-2 (tty 层流程)

[4]Linux串口驱动分析及移植

[5]Linux系统TTY串口驱动实例详解

[6]Console & TTY Driver

[7]浅谈Linux tty体系,理清tty驱动层次与各种概念

[8]tty驱动初步了解学习

[9]解密TTY

[10]Linux 终端(TTY)(tty介绍来自该篇博客)

[11]Linux 伪终端(pty)

标签:仿真,tty,串口,终端,linux,驱动,控制台
From: https://www.cnblogs.com/zyly/p/17176980.html

相关文章

  • Linux下安装prometheus & grafana
    1安装prometheus1.1下载prometheus下载地址https://prometheus.io/download/#prometheus下载wgethttps://github.com/prometheus/prometheus/releases/download/v......
  • linux下动态链接
    linux下的动态链接动态连接器ld.so首先本文是对linux下的动态链接过程的探讨,由于需要我们再这里将.elf文件叫做可执行文件,将动态链接库.so文件叫做共享对象文件,他们两个......
  • linux修改ssh默认端口
    1.登录服务器,打开sshd_config文件vim/etc/ssh/sshd_config2.找到#Port22,默认是注释掉的,先把前面的#号去掉,再插入一行设置成你想要的端口号,注意不要跟现有端口号......
  • Linux下配置Dovecot常见错误及解决办法
    Error:doveconf:Fatal:Errorinconfigurationfile/etc/dovecot/dovecot.conf:protocols:Unknownprotocol:sieveGroupwareError:Theconnectionwasrefused.......
  • 常用Linux shell命令汇总,总有一条你需要
    对于经常使用linux系统的博主来说,基本常用的shell命令是少不了的,总结一下,哪天不会了,可以来翻看下O(∩_∩)O。对你有用记得收藏哦!欢迎补充!1.检查远程端口是否对bash开放:......
  • vscode连接远程linux服务器免输密码
    在VScode中安装Remote-ssh插件连接到远程服务器1、打开本地cmd,输入以下命令生成密钥id_rsa.pub,一直回车,默认生成到C:\Users\jae.sshssh-keygen-trsa2、打开远程服务......
  • linux最小化安装后添加图形界面
    linux支持图形界面,如果装成了最小化系统该怎样添加图形界面呢?首先要知道的是,要想从最小化安装到图形界面绝对要装很多包,我们不可能一个包一个包的去装,大多数小伙伴应该也记......
  • linux最小化安装后添加图形界面
    linux支持图形界面,如果装成了最小化系统该怎样添加图形界面呢?首先要知道的是,要想从最小化安装到图形界面绝对要装很多包,我们不可能一个包一个包的去装,大多数小伙伴应该也记......
  • linux安装nginx1.18
    1.安装依赖包sudoyum-yinstallgcczlibzlib-develpcre-developensslopenssl-devel2.下载并解压安装包cd/usr/local//下载tar包sudowgethttp://nginx.org......
  • Linux- 环境变量
                ......