linux系统中串口驱动框架基本分析(经典)

news2025/1/21 4:58:32

第一:区分不同的终端类型

串行端口终端(/dev/ttySn)

串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。

有段时间这些串行端口设备通常被称为终端设备,因为 那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0)、/dev/tts/1(或/dev /ttyS1)等,设备号分别是(4,0)、(4,1)等,分别对应于DOS系统下的COM1、COM2等。

若要向一个端口发送数据,可以在命令行上把标 准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入:echo test > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。

伪终端(/dev/pty/)

伪终端 /dev/pts是远程登陆(telnet,ssh等)后创建的控制台设备文件所在的目录。

由于可能有好几千个用户登陆,所以/dev/pts其实是动态生成的,不象其他设备文件是构建系统时就已经产生的硬盘节点(如果未使用devfs) 。

第一个用户登陆,console的设备文件为/dev/pts/0,第二个为/dev/pts/1,以此类推。这里的0、1、2、3不是具体的标准输入或输出,而是整个控制台。你可尝试 echo "aaaaaa" > /dev/pts0、1、2……。

控制终端(/dev/tty)

控制终端 /dev/tty指的是当前所处的终端,输出到此的内容只会显示在当前工作的终端显示器上。

如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps –ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。

使用命令”tty”可以查看它具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。这个终端文件可以由各个用户共享

控制台终端(/dev/ttyn, /dev/console)

控制台终端/dev/ttyn n(0到6), tty1,tty2就是不同的虚拟终端(virtual console).

/dev/console 就是tty0 ,tty0则是当前所使用虚拟终端即激活的虚拟终端的一个别名,系统所产生的信息会发送到该终端上,实际上机器只有一个屏幕,也就是我们看到的这个屏幕,可以理解为console指向激活的那个tty,准确地说是激活的那个tty才将输出显示到console。

历史上,console指主机本身的屏幕键盘,而tty指用电缆链接的其它位置的控制台(仅包含屏幕和键盘)。tty0是系统自动打开的,但不用于用户登录。

总结

其实,上古时期,都有实体,理解完全不是难事。

这个IBM的广告,美女左手是terminal,右手是console

  • terminal 相对的是console
    • terminal是终端,不在主机上,远端控制
    • console是主机上的面板开关,本机控制
  • terminal是一个设备,最早借用了teletypewriter的产品形态,简称tty
    • 长得像台打字机,其实输入输出确实都打印在纸上
    • 后来进化出一个crt显示器
    • 所以上古时期,terminal包含tty,tty就是terminal的一种
  • shell相对的是kernel
    • 那个时候有shell嘛?可能还没有出现

实体terminal时代的逻辑流程图如下:

到了PC时代,本机自带了键盘鼠标,于是混乱就开始了

  • 实体的terminal设备,已经消失了,没有打字机形态的tty,也不存在video tty
  • 但是,基因被传承了下来,还是有terminal,tty这样的名称存在,并且逻辑上一以贯之
  • shell作为kernel的中间层,也发明了出来,搞不清打开的是terminal还是shell

来看一张图,其实会解决这个混乱

  • 我们平时打开的iterm2之类的,实际上是terminal应用
    • 并不直接与shell交互,更不与kernel交互
    • 它是一个带显示器的远程对讲机,或者说是facetime,和虚拟master交互
  • 实体tty不存在了,但是虚拟出一个伪终端,pseudo tty,简称pty
    • 这个pty虚拟出来一个master,你可以理解成一个坐在实体终端机前面的小人
    • pty又虚拟出一个slave,你可以理解成上古时代的终端机
  • 为什么要这样做呢?
    • 好比把之前主机的实体外设,在主机内部模拟了一下
    • 老的传统被传承了下来,设定有一个人,在敲终端机
    • 保持了系统的一贯性,只是各种名称,带来了混乱
  • master与外部terminal应用交互,slave与shell交互,shell与kernel交互

现代tty架构

第二:串口驱动框架

串口驱动,内核启动的时候,便初始化完成,后期应用层用到的时候,访问设备节点便,获取串口设备的 fd 句柄,然后设置相关的参数(波特率,停止位,校验位等等)便可以使用串口进行数据收发。

Linux Kernel 的 UART 串口分为几层,tty 核心层,tty 线路规程,串行驱动核心层,以及下面对接具体芯片的 ops:

整个流程走下来,有太多的数据结构和 ops,要分析清楚整个流程,有两种方式:

1、至上而下,即,从用户空间调用串口配置以及串口读写的角度来分析

2、从底层注册开始分析

本文先从底层注册开始分析,根据内核已知提供的接口,逐步打开魔盒,力求扩散到每一个常用的地方。

tty  core

tty core主要实现如下三类功能:

  • 将串口设备有关的物理对象(及其操作方法)封装成一个一个的数据结构,以达到用软件语言描述硬件的目的。
  • 向底层driver提供串口驱动的编程接口。
  • 基于TTY framework所提供的TTY driver的编写规则,将底层driver看到的serial driver,转换为TTY driver,并将所有的serial操作,转换为对应的tty操作。

线路规程

负责在串口设备之间进行上下文切换,以实现多任务调度。当有数据需要从串口设备发送或接收时,线程调度器会将任务切换到适当的设备上。

串口硬件驱动层

这个层次主要负责和具体的串口硬件进行通信,实现了对硬件的控制和访问。在内核中,串口驱动模块通常被实现为字符设备,通过字符设备接口与串口核心模块进行交互。它通过注册到串口核心层,实现了对上层的透明。

第三:小结

tty core 和串口硬件驱动层是串口驱动框架的核心部分。在使用串口设备时,用户通常只需要与tty core模块进行交互,而不需要直接操作串口驱动模块和平台驱动模块。下一节我们将深入到串口驱动内部分析tty core的框架体系结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/966660.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CXL寄存器介绍(2)- CXL DVSEC

🔥点击查看精选 CXL 系列文章🔥 🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥 📢 声明: 🥭 作者主页:【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

4.0 Spring与Dubbo整合原理与源码分析

#Dubbo# 文章介绍 Dubbo中propertie文件解析以及处理原理Dubbo中@Service注解解析以及处理原理Dubbo中@Reference注解解析以及处理原理1.0 整体架构和流程 应用启动类与配置 public class Application {public static void main(String[] args) throws Exception {Annotation…

Idea中 css 、js 压缩插件会自动生成xxx.min.css、xxx.min.js文件

第一步:下载yuicompressor-2.4.8.jar 下载路径:打开搜索 YUI compressor Maven Repository: Search/Browse/Explore (mvnrepository.com)https://mvnrepository.com/ 找到点击下载即用(如下图) 创建文件夹,放入idea文…

进制转换(二进制、八进制、十六进制、十进制)

一、进制表示 二进制:每一位只有两种符号表示 -> 0,1 例如 (101011)₂,也可写作101011B,其中B是Binary英文的缩写。八进制: 每一位有8种符号表示(0~7),例如(1652)₈,也可写作1652O,其中O是O…

如何查看Windows下软件使用的端口号和PID

文章目录 解决方法 解决方法 打开资源管理器:按下Win R,输入"resmon",然后按Enter键 在资源监视器窗口中,切换到"网络"选项卡。 在"侦听端口"部分,你可以看到正在使用的端口号和PID…

Android——基本控件(下)(二十一)

1. 数据存储 1.1 知识点 (1)掌握Android数据存储的分类; (2)可以使用SharedPreferences存储数据。 1.2 具体内容 对于我们数据的存储而言,Android一共提供了5个数据存储的方式:SharedPrefe…

JS算法与树(二)

前言 二叉搜索树(BST)存在一个问题:当你添加的节点数够多的时候,树的一边可能会非常的深。而其他的分支却只有几层。 AVL树 为了解决上面的问题,我们提出一种自平衡二叉搜索树。意思是任何一个节点左右两侧子树的高度之…

NTT功能与实现

NTT的基础功用与拓展功能: 1.evaluate和interpolate evaluate的本质是选择n个点(假设f(x)的度为n),计算得到其值,因此根据定义可以直接进行代入计算。为了加快计算的过程选取 w n w_n wn​的幂次(DFT问题即离散傅里叶变换),使用FFT算法来加…

CXL.cachemem 简介(背景通道)

🔥点击查看精选 CXL 系列文章🔥 🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥 📢 声明: 🥭 作者主页:【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

无涯教程-JavaScript - TDIST函数

The TDIST function replaces the T.DIST.2T & T.DIST.RT functions in Excel 2010. 描述 该函数返回学生t分布的百分点(概率)​​,其中数值(x)是t的计算值,将为其计算百分点。 t分布用于小样本数据集的假设检验。使用此函数代替t分布的临界值表。 语法 TDIST(x,deg_fr…

iOS 设置下载部分文件,如何获取完整文件的大小

在视频的需求中,遇到这样一个需求,播放一视频的时候,要预下载 后面10条视频,但是只下载后面十条视频的前面1M 实现方法 1 创建请求时设置cacheLength resource [[IdiotResource alloc] init];resource.requestURL task.request…

屋大人少,凶多吉少

在这个世界上,包括人在内的万事万物,都是有自己的气场存在的。 那么,人所产生的气场,我们称之为人气。 道法自然,阴阳二象,同样,人的身上也是有阴阳二气, 二气平衡充盈,会…

【Python】批量下载页面资源

【背景】 有一些非常不错的资源网站,比如一些MP3资源网站。资源很丰富,但是每一个资源都不大,一个一个下载费时费力,想用Python快速实现可复用的批量下载程序。 【思路】 获得包含资源链接的静态页面,用beautifulsoup分析页面,获得所有MP3资源的实际地址,然后下载。…

将 Spring Boot 应用程序与 Amazon DocumentDB 集成

Amazon DocumentDB(与 MongoDB 兼容)是一种可扩展、高度持久和完全托管的数据库服务,用于操作任务关键型 MongoDB 工作负载。在 Amazon DocumentDB 上,您可以使用相同的 MongoDB 应用程序代码、驱动程序和工具来运行、管理和扩展工…

bazel介绍以及其发展历史

简介 Bazel Google开源的,是一款与 Make、Maven 和 Gradle 类似的开源构建和测试工具。 它使用人类可读的高级构建语言。Bazel 支持多种语言的项目,可为多个平台构建输出。Bazel支持任意大小的构建目标,并支持跨多个代码库和大量用户的大型代…

JavaSE基础(1)

1 初识Java 知识导图 1.1 Java简介及发展史 1.1.1 Java是什么 Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义。 不仅如此,Java还是一个有一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软…

系统学习Linux-PXE无人值守装机(附改密)

目录 pxe实现系统自动安装pxe工作原理 大致的工作过程如下: PXE的组件: 一、配置vsftpd 二、配置tftp 三、准备pxelinx.0文件、引导文件、内核文件 四、配置dhcp 配置ip 配置dhcp 五、创建default文件 六、新建测试主机用来测试装机效果 七、…

github指南

记录一些Github上的宝贵功能 1、github trending/star 1.1查看github的热门趋势 可以选择点击上面热门趋势的链接,从主页点进去的方式如下 在这个页面中,你可以选择language/data range等来搜索到你想要的 1.2 查看github的star排行 比如&#xff1a…

出货量腰斩,不用中国芯片,美国PC巨头要凉了,苹果成为大赢家

市调机构Canalys公布的二季度数据显示美国PC巨头戴尔在中国市场的出货量同比暴跌52%,显示出它在公开宣布舍弃中国芯片之后,中国消费者正纷纷抛弃它,毕竟如今的PC品牌如此之多,完全有更多的替代选择。 Canalys公布的数据显示&#…

Python Opencv实践 - 拉普拉斯(Laplacian)算子边缘检测

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_GRAYSCALE) print(img.shape)#拉普拉斯边缘检测 #cv.Laplacian(src, ddepth, dst, ksize, scale, delta, borderType) #src:原图 …