tty(五)串口的打开过程

news2024/11/25 3:28:13

一、字符设备完成注册

我们知道,在serial核心层提供了2个重要接口
uart_register_driver
uart_add_one_port

上者通过调用tty核心的接口,完成了tty_driver的动态分配和注册,然而此时并没有看到创建字符设备,
通过对uart_add_one_port的分析,最终调用了tty核心的
tty_register_device_attr接口
在这里插入图片描述
tty核心层的tty_cdev_add接口最终完成了字符设备的注册工作,
这里比较关注的是tty_fops
在这里插入图片描述

二、字符设备的操作集

上面我们看到,注册字符设备,使用了tty_fops作为操作集
看看tty_fops的定义,tty_fops定义在tty核心层。
在这里插入图片描述
tty设备归根结底是一个字符设备。

三、字符设备的打开

1、找到对应的tty_driver和tty_struct

直接看tty_fops的open。

首先获取设备号
在这里插入图片描述
按设备号匹配获取tty_driver(在全局数组tty_drivers中)
tty_open_current_tty是查找默认注册的/dev/tty和/dev/console,直接返回空
tty_lookup_driver依靠遍历tty_drivers数组,比较设备号最终找到tty_driver
tty_driver_lookup_tty通过index下标将会找到tty_struct
在这里插入图片描述
tty_struct是tty_driver维护的一个数组,在分配tty_drivers的时候分配的lines个tty_struct数组。
注意:这里分配的ttys和ports都是一个指针数组,保存的是指针,
cdevs是保存的字符设备。
注意:kcalloc会对申请空间清0
在这里插入图片描述
所以第一次打开获取到的tty应该是NULL,下面走else新建tty_struct并初始化
第二次打开获取到不为空,直接跳过
在这里插入图片描述
接着,,如果tty_struct有操作集ops且有open,执行,,如果没有,报错
那么这个操作集在哪里赋值的呢???
这个操作集是第一次打开,,新建tty_struct的时候用tty_driver的ops赋值的
tty_driver的ops是注册的时候用uart层定义的ops赋值的。。
在这里插入图片描述
至此tty层的open过程结束了,进入到serial层的open。。


2、新建tty_struct并初始化

tty层执行open第一次没有找到tty_struct,需要调用tty_init_dev创建并初始化tty_init_dev。

看看tty_init_dev做了什么,从字面意思上理解是初始化tty_struct,
应该是要先分配一个tty_struct,然后地址放到ttys对应位置,
那么就好理解了,之前获取tty_struct的时候,如果能获取到,代表这个串口已经被打开过了。

分配一个tty_struct
在这里插入图片描述
然后调用initialize_tty_struct对tty_struct初始化,包括使用tty_driver的一些资源对其初始化,

重要的几项
比如
tty->ops = driver->ops;
初始化线路规程,,注意,这里有了线路规程的概念了,
tty_ldisc_init(tty);
在这里插入图片描述
调用tty_ldisc_get将会新建一个tty_ldisc,并且使用N_TTY操作集,去初始化tty_struct的线路规程,,这里我们先记住。。
在这里插入图片描述
这里将新建的tty_struct地址保存在tty_driver的对应位置
在这里插入图片描述
这里是对termios做初始化,这里显然tty_driver里面是没有termios的,最终使用的
tty->termios = tty->driver->init_termios;
在这里插入图片描述
tty的port就用的tty_driver对应line的port,,
而tty_driver的port是在注册uart port的时候,赋值的
在这里插入图片描述
最后激活tty_struct的线路规程,,暂且这么理解吧(其实就是找到线路规程的open,执行一下)
在这里插入图片描述
这里o_tty即tty->link好像并没有初始化。
tty_ldisc_open就是找了tty_ldisc的ops的open,有就执行
前面我们看到
在这里插入图片描述

3、线路规程的激活

看看线路规程是怎样维护的,从新建tty_struct初始化线路规程开始看。
在这里插入图片描述
在这里插入图片描述
最终注意看,是从全局数组tty_ldiscs中用disc(N_TTY)为下标返回一个操作集,tty_ldiscs是一个操作集集合。
在这里插入图片描述
总共有这些类型的线路规程
在这里插入图片描述

4、线路规程的注册

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

货拉拉基于 Flink 计算引擎的应用与优化实践

摘要:本文整理自货拉拉实时研发平台负责人王世涛,在Flink Forward Asia 2022 平台建设专场的分享。本篇内容主要分为六个部分: Flink 在货拉拉的使用现状Flink 平台化性能优化主题数据准确性主题稳定性主题未来展望 点击查看原文视频 & 演…

【leetcode】链表的中间节点|链表中倒数第k个节点

目录 1.链表的中间节点 2.链表中倒数第k个节点 1.链表的中间节点 思路1:遍历链表,统计节点个数count,返回第count/2 1个节点 📖Note:注意循环条件为--mid,--mid循环执行mid-1次,mid--循环mid次&#xf…

SpringBoot 8种异步实现方式

前言:异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间,比如:「发送短信、邮件、异步更新等」,这些都是…

采用串级控制和超高精度PID调节器的微张力精密控制技术

摘要:采用当前的各种涂布机很难适用气体扩散层这类脆性材料的涂布工艺,需要控制精度更高的微张力控制系统。为此本文基于串级控制原理,提出了采用双闭环PID控制模式和超高精度PID张力控制器的解决方案,一方面形成浮动摆棍闭环和主…

python机器学习(五)逻辑回归、决策边界、代价函数、梯度下降法实现线性和非线性逻辑回归

线性回归所解决的问题是把数据集的特征传入到模型中,预测一个值使得误差最小,预测值无限接近于真实值。比如把房子的其他特征传入到模型中,预测出房价, 房价是一系列连续的数值,线性回归解决的是有监督的学习。有很多场…

kafka权威指南学习以及kafka生产配置

0、kafka常用命令 Kafka是一个分布式流处理平台,它具有高度可扩展性和容错性。以下是Kafka最新版本中常用的一些命令: 创建一个主题(topic): bin/kafka-topics.sh --create --topic my-topic --partitions 3 --replic…

【论文阅读22】Label prompt for multi-label text classification

论文相关 论文标题:Label prompt for multi-label text classification(基于提示学习的多标签文本分类) 发表时间:2023 领域:多标签文本分类 发表期刊:Applied Intelligence(SCI二区&#xff0…

生态系统景观指数-聚集度指数AI计算

景观指数是景观生态学的常见指标,可用于不同生态系统的特征识别。景观指数是反映景观结构与空间格局的定量指标,目前已成为景观生态学领域常用的分析景观格局、度量空间异质性的重要方法。不同水平下的指数结果往往代表不同含义,应在把握指数…

git冲突“accept theirs”和“accept yours”

Accept Yours 就是直接选取本地的代码,覆盖掉远程仓库的 Accept Theirs 是直接选取远程仓库的,覆盖掉自己本地的 我们选择Merge,自己手动行进选择、修改。 这里左边部分是你本地仓库的代码,右边部分是远程仓库的代码,中间的res…

uniapp WIFI上下班打卡

大纲 🥙 uniapp官网:uni-app官网 🥙 WIFI功能模块: 1、下载 wifi 插件 uni-WiFi 2、在 manifest.json 中 App权限配置中 配置权限 1. ACCESS_WIFI_STATE (访问权限状态) 2. CHANGE_WIFI_STATE&#xff…

13.Netty源码之Netty中的类与API

highlight: arduino-light ServerBootstrap Bootstrap 意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件,Netty 中ServerBootstrap 是服务端启动引导类。 java //泛型 AbstractB…

VMware上安装Ubuntu64

D:\VMware\Virtual Machines\Ubuntu64 D:\VMware\Virtual Machines\Ubuntu64\Ubuntu64.vmdk 继续

【ESP32】调试UART功能

1.创建示例项目uart_echo:VSCODE中->“查看”->”命令面板“->输入:Show Examples projects->选择Use current ESP-IDF(C:\Espressif\frameworks\esp-idf-v5.1)->弹出示例ESP-IDF Examples,选择peripherals->uart->uart…

泰晓科技发布 Linux Lab v1.2 正式版

导读近日消息,Linux Lab 是一套用于 Linux 内核学习、开发和测试的即时实验室,官方称其“可以极速搭建和使用,功能强大,用法简单”。 自去年 12 月份发布 Linux Lab v1.1 后,v1.2 正式版目前已经发布于 GitHub 及 Gite…

Tensorflow(二)

一、过拟合 过拟合现象:机器对于数据的学习过于自负(想要将误差减到最小)。 解决方法:利用正规化方法 二、卷积神经网络(CNN) 卷积神经网络是近些年来逐渐兴起的人工神经网络,主要用于图像分类、计算机视觉等。 卷积:例如对图片每一小块像素区域的处理&#xff…

微服务体系<1>

我们的微服务架构 我们的微服务架构和单体架构的区别 什么是微服务架构 微服务就是吧我们传统的单体服务分成 订单模块 库存模块 账户模块单体模块 是本地调用 从订单模块 调用到库存模块 再到账户模块 这三个模块都是调用的同一个数据库 这就是我们的单体架构微服务 就是…

RTaW-Pegase实时通信网络架构的建模,仿真和自动配置

RTaW-Pegase 用于构建和优化使用在汽车领域、航空航天领域以及工业领域的通信网络:时间敏感网络(TSN)、CAN (FD,XL)、LIN、Arinc、 NoC车载网络, 以及车外通信的无线网络。除了精确定时的仿真外…

F5 LTM 知识点和实验 2-负载均衡基础概念

第二章:负载均衡基础概念 目标: 使用网页和TMSH配置virtual servers,pools,monitors,profiles和persistence等。查看统计信息 基础概念: Node一个IP地址。是创建pool池的基础。可以手工创建也可以自动创…

7.26总结

继承和实现的区别: 1.修饰符不同: 继承修饰符extends,实现修饰符implements 2.单继承,多实现,Java允许一个类仅能继承一个其他类,即一个类只能有一个父类,这个限制被称为单继承性,而接口允许…

测试开源C#人脸识别模块ViewFaceCore(4:口罩检测、性别预测、年龄预测)

ViewFaceCore模块中的MaskDetector类支持识别人脸是否戴了口罩或有遮挡&#xff0c;主要调用PlotMask函数执行口罩检测操作&#xff0c;其函数原型如下所示&#xff1a; PlotMaskResult PlotMask<T>(T image, FaceInfo info)public class PlotMaskResult{//// 摘要:// …