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

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

串行端口终端(/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的框架体系结构。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python:列表推导式

相关阅读 Python专栏https://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 列表推导式使得创建特定列表的方式更简洁。常见的用法为,对序列或可迭代对象中的每个元素应用某种操作,用生成的结果创建新的列表&#xff…

Python—匹配字段

1. 「概述」 在日常开发中,经常需要对数据中的某些字段进行匹配,但这些字段可能存在微小的差异。例如,同一个招聘岗位的数据中,省份字段可能有“广西”、“广西壮族自治区”和“广西省”等不同的写法。为了处理这些情况&#xff…

(数字图像处理MATLAB+Python)第十章图像分割-第四,五节:分水岭分割和综合案例

文章目录 一:分水岭分割(1)原理(2)程序 二:综合案例:答题卡图像分割(1)设计思路(2)各模块设计(3)代码 一:分水…

three.js(二):webpack + three.js + ts

用webpackts 开发 three.js 项目 webpack 依旧是主流的模块打包工具;ts和three.js 是绝配,three.js本身就是用ts写的,ts可以为three 项目提前做好规则约束,使项目的开发更加顺畅。 1.创建一个目录,初始化 npm mkdir demo cd de…

第五章 树与二叉树 二、二叉树的定义和常考考点,WPL的算法

一、定义 二叉树可以用以下方式详细定义: 二叉树是由节点构成的树形结构,每个节点最多可以有两个子节点。每个节点有以下几个属性: 值:存储该节点的数据。左子节点:有一个左子节点,如果没有则为空。右子节…

Visual Studio 2017安装和项目配置

目录 前言1. What、Why and How1.1 What1.2 Why1.3 How 2. 安装3. 创建新项目4. 配置OpenCV库4.1 下载opencv安装包4.2 配置系统环境变量4.3 VS项目环境配置4.4 总结 5. 已有项目添加6. Tips6.1 常用快捷键6.2 字体和颜色选择6.3 配置编译路径 结语下载链接参考 前言 最近因为项…

【STM32教程】第二章 通用输入输出口GPIO

资料下载链接: 链接:https://pan.baidu.com/s/1hsIibEmsB91xFclJd-YTYA?pwdjauj 提取码:jauj 1. GPIO的基本结构 1.1 概述 GPIO(General Purpose Input Output)意思是通用输入输出口可配置为8种输入输出模式&a…

I IntelliJ IDEA 2023.2 最新解锁方式,支持java20

在 IntelliJ IDEA 2023.1 中,我们根据用户的宝贵反馈对新 UI 做出了大量改进。 我们还实现了性能增强,从而更快导入 Maven,以及在打开项目时更早提供 IDE 功能。 新版本通过后台提交检查提供了简化的提交流程。 IntelliJ IDEA Ultimate 现在支…

【Terraform学习】使用 Terraform创建DynamoDB添加项目(Terraform-AWS最佳实战学习)

本站以分享各种运维经验和运维所需要的技能为主 《python》:python零基础入门学习 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

Django静态文件媒体文件文件上传

文章目录 一、静态文件和媒体文件1.在django中使用静态文件实践2.在django中使用媒体文件 二、文件上传单文件上传实践多文件上传 一、静态文件和媒体文件 媒体文件: 用户上传的文件,叫做media 静态文件:存放在服务器的css,js,image,font等 叫做static1.在django中…

Docker(三) 创建Docker镜像

一、在Docker中拉取最基本的Ubuntu系统镜像 搜索Ubuntu镜像 Explore Dockers Container Image Repository | Docker Hub 下载镜像 docker pull ubuntu:22.04 二、在镜像中添加自己的内容 使用ubuntu镜像创建容器 docker run -it ubuntu:20.04 /bin/bash 在容器中创建了一个文…

文心一言接入Promptulate,开发复杂LLM应用程序

简介 最近在尝试将文心一言的LLM能力接入Promptulate,故写了一篇博客记录一下,Promptulate 是 Promptulate AI 旗下的大语言模型自动化与应用开发框架,旨在帮助开发者通过更小的成本构建行业级的大模型应用,其包含了LLM领域应用层…

CP Autosar-Ethernet配置

文章目录 前言一、Eth层级结构介绍二、Autosar实践2.1 ETH Driver2.2 Eth InterfaceEth Interface Autosar配置2.3 TcpIp模块Eth TcpIp Autosar配置2.4 SoAdEth SoAd配置前言 因汽车E/E架构和功能的复杂度提升而带来的对车辆数据传输带宽提高和通讯方式改变(基于服务的通讯-S…

万字长文:Stable Diffusion 保姆级教程

万字长文:Stable Diffusion 保姆级教程 2022年绝对是人工智能爆发的元年,前有 stability.ai 开源 Stable Diffusion 模型,后有 Open AI 发布 ChatGPT,二者都是里程碑式的节点事件,其重要性不亚于当年苹果发布iPhone&a…

ELK安装、部署、调试 (七)kibana的安装与配置

1.介绍 Kibana 是一个基于浏览器的开源可视化工具,主要用于分析大量日志,以折线图、条形图、饼图、热图、区域图、坐标图、仪表、目标、时间等形式。预测或查看输入源的错误或其他重大事件趋势的变化。Kibana 与 Elasticsearch 和 Logstash 同步工作&am…

【C++习题集】-- 顺序表、链表

(用于复习) 目录 线性表 顺序表 链表 单链表 单向 \ 双向 带哨兵位 \ 不带哨兵位 循环 \ 非循环 无头单向非循环链表实现 oj题 203. 移除链表元素 206. 反转链表 快慢指针 141.环形链表 【解题思路】 带头双向循环链表 顺序表和链表的区…

Redis—常用数据结构

Redis—常用数据结构 🔎数据结构与内部编码 Redis 中常用的数据结构包括 Strings—字符串Hashes—哈希表Lists—列表Sets—集合Sorted sets—有序集合 Redis 底层在实现上述数据结构时, 会在源码层面针对上述实现进行特定优化, 以达到节省时间 / 节省空间的效果 …

51单片机智能电风扇控制系统proteus仿真设计( 仿真+程序+原理图+报告+讲解视频)

51单片机智能电风扇控制系统仿真设计( proteus仿真程序原理图报告讲解视频) 讲解视频1.主要功能:2.仿真3. 原理图4. 程序代码5.设计报告6. 设计资料内容清单 51单片机智能电风扇控制系统仿真设计( proteus仿真程序原理图报告讲解视频) 仿真图…

Java学习笔记之----I/O(输入/输出)一

在变量、数组和对象中存储的数据是暂时存在的,程序结束后它们就会丢失。想要永久地存储程序创建的数据,就需要将其保存在磁盘文件中(就是保存在电脑的C盘或D盘中),而只有数据存储起来才可以在其他程序中使用它们。Java的I/O技术可…

pip切换源

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple