1.串口的作用
UART:通用异步收发传输器,简称串口。
作用1:调试u-boot,内核,应用程序时,主要使用串口打印调试信息。
作用2:外接各种模块。比如GPS,蓝牙模块等
串口结构简单,只有三个引脚(1)TXD (2)RXD (3)GND
TXD引脚用于发送数据,RXD引脚用于接收数据。
发送数据结构:
开始位 | 数据位 | 校验位 | 停止位 |
注:串口双方使用的逻辑电平要一样,如果不一样,需要引入电平转化芯片。现在相对电脑没有串口,所以需要使用USB转串口芯片,在通过USB线接到电脑。
注:串口是TTL电平。
2.TTY体系中设备节点的差别
串口子系统属于TTY体系的一部分,所以我们要讲解在TTY中设备节点的差别。
TTY中有许多设备节点:
/dev/ttyS0,/dev/ttySAC0,/dev/tty,/dev/tty0,/dev/tty1 .....,/dev/ttyn,/dev/console
TTY有许多术语:
TTY/Terminal/Console/UART
那么它们到底是什么?
TTY
TTY:输入输出设备的驱动程序被命名为TTY,代表一个体系(输入设备用shell打开)
Terminal
Terminal:虚拟终端(键盘,显示屏等)
虚拟终端对应的设备节点有:/dev/tty0,/dev/tty1 .....,/dev/ttyn。
(1).其中/dev/tty1 .....,/dev/ttyn表示不同的虚拟终端。
(2)./dev/tty0:不同的shell打开不同的终端,但是只能有一个shell在前台,那么如果我想发数据给前台怎么办?使用/dev/tty0,当不同的shell位于前台时,/dev/tty0就会访问它们的设备节点 。
UART
在TTY体系里面,它不仅仅支持键盘和显示器,还支持串口,对于串口,它就没有虚拟终端的概念,我们可使用shell去打开串口,这个shell打开的是串口是真实终端:/dev/ttyS0,/dev/ttySAC0
shell打开的程序有虚拟终端也要真实终端,我不关心终端是虚拟的还是真实的,那么有没有办法找到我的终端吗?可以访问/dev/tty,通过它可以找到这个程序原本所使用的终端。
Console
Terminal与Console的差别
Terminal有远端的意思,中文为:终端。Console编译为控制台,可以理解为权限更大,可以查看更多信息。
(1).Console是某个Terminal
(2).Terminal并不都是Console
(3).我们可以从多个Terminal中选择某个作为Console
/dev/console
/dev/console如何选择哪个Terminal,内核的打印信息从哪个设备上显示出来?
:可以通过内核的cmdline来指定。比如console = ttyS0,console = tty
我不想去分辨这个设备是串口还是虚拟设备,有没有方法得到这个设备?有,通过/dev/console
console = ttyS0时,:/dev/console就是ttyS0
console = tty时,:/dev/console就是运行程序的虚拟终端
console = tty0时,:/dev/console就是前台程序的虚拟终端
console = ttyN时,:/dev/console就是/dev/ttyN
注:如果console有多个取值时,使用最后一个取值来判断
3 TTY驱动程序框架
3.1 TTY驱动程序初始框架
TTY就是个输入输出设备,有许多输入输出设备:比如串口,键盘作为硬件层。对于不同的硬件,会有对应的驱动层,我想让应用程序(应用层)不去区分硬件是串口还是键盘,怎么办呢? 那就有一层名为TTY(该层帮我屏蔽了不同输入输出设备的差别),怎么来帮我区分不同的设备的呢?不同的输入输出设备的驱动程序会向TTY层注册某个结构体,应用程序可以通过TTY这层使用统一的接口来访问到不同的设备。串口为真实终端,键盘为虚拟终端。对于串口这类设备,流程就是这样,但是对于虚拟终端,又多加了一层叫virtual terminal,驱动程序从键盘获得数据后会把数据发给某个virtual terminal里面, 应用程序要显示的数据也会先存入某个Buf,等那个终端位于前台时,再从Buf里把那个信息显示出来。
总结:
对于串口 | 硬件层,驱动层,TTY层,应用程序层。 |
对于键盘,显示屏等 | 硬件层,驱动层,virtual terminal层,TTY层,应用程序层。 |
那么有这些就够了吗?
3.2 行规层
引入:当PC端与开发板上的串口连接时,我们从PC端依次输入lsa,然后输入删除键,最后输入回车,内部流程是什么?
3.2.1 行规层接收普通字符
PC端的串口与ARM的串口连接,相互传输数据,输入l,就是PC把字符l发给ARM板,在ARM板上有驱动程序,它从硬件上得到这个字符l后,把字符l上传给“行规层(line discipline)”,在行规层发现l是普通的字符,就把这个字符重新发给驱动程序,驱动程序又重新把字符l重新发给PC端,PC接收到这个字符l后在屏幕上显示出来
注:行规层收到字符后又马上它发回去称回显 (echo)
3.2.2 行规层接收删除键
字符s和a与l的流程一样,输入完三个字符后,我又输入删除键,PC同理一样发给ARM板,ARM板也同理发给行规层,行规层里面有个Buf用于保留发来的数据(及是lsa),但是在接收到删除键后,会把Buf的最新一位删除掉,删除后,同理,ARM板也会把删除键重新发给PC,PC端接收到数据后。也把数据a给删除了。
3.2.3 行规层接收回车
PC发给ARM板回车时,RM板也同理发给行规层,行规层发现传来的数据是回车时,行规层就会把Buf中的数据(ls)上传给APP(应用层)。APP一般来说是shell,当APP接收到ls后,它回去查看当前文件下有哪些文件,然后把结果发给行规层,行规层把结果发给串口驱动程序,串口驱动程序又发给PC,PC接收到数据后显示在屏幕上。
3.2.4 行规层作用
行规层它位于终端设备驱动程序和用户进程之间,负责对输入和输出的字符数据进行处理和转换
总结来说,行规层是位于终端设备驱动程序和用户进程之间的一层软件机制,用于处理终端设备和网络连接中的数据流。它提供了输入处理、输出处理、规范模式和原始模式的切换以及控制字符处理等功能。通过行规层,用户可以更加灵活地操控和控制终端设备和网络连接。
所以真正的TTY框架手写版