tty(五)串口的打开过程

这篇具有很好参考价值的文章主要介绍了tty(五)串口的打开过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、字符设备完成注册

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

上者通过调用tty核心的接口,完成了tty_driver的动态分配和注册,然而此时并没有看到创建字符设备,
通过对uart_add_one_port的分析,最终调用了tty核心的
tty_register_device_attr接口
tty(五)串口的打开过程,Linux内核和驱动,linux
tty核心层的tty_cdev_add接口最终完成了字符设备的注册工作,
这里比较关注的是tty_fops
tty(五)串口的打开过程,Linux内核和驱动,linux

二、字符设备的操作集

上面我们看到,注册字符设备,使用了tty_fops作为操作集
看看tty_fops的定义,tty_fops定义在tty核心层。
tty(五)串口的打开过程,Linux内核和驱动,linux
tty设备归根结底是一个字符设备。

三、字符设备的打开

1、找到对应的tty_driver和tty_struct

直接看tty_fops的open。

首先获取设备号
tty(五)串口的打开过程,Linux内核和驱动,linux
按设备号匹配获取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(五)串口的打开过程,Linux内核和驱动,linux
tty_struct是tty_driver维护的一个数组,在分配tty_drivers的时候分配的lines个tty_struct数组。
注意:这里分配的ttys和ports都是一个指针数组,保存的是指针,
cdevs是保存的字符设备。
注意:kcalloc会对申请空间清0
tty(五)串口的打开过程,Linux内核和驱动,linux
所以第一次打开获取到的tty应该是NULL,下面走else新建tty_struct并初始化
第二次打开获取到不为空,直接跳过
tty(五)串口的打开过程,Linux内核和驱动,linux
接着,,如果tty_struct有操作集ops且有open,执行,,如果没有,报错
那么这个操作集在哪里赋值的呢???
这个操作集是第一次打开,,新建tty_struct的时候用tty_driver的ops赋值的
tty_driver的ops是注册的时候用uart层定义的ops赋值的。。
tty(五)串口的打开过程,Linux内核和驱动,linux
至此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
tty(五)串口的打开过程,Linux内核和驱动,linux
然后调用initialize_tty_struct对tty_struct初始化,包括使用tty_driver的一些资源对其初始化,

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

3、线路规程的激活

看看线路规程是怎样维护的,从新建tty_struct初始化线路规程开始看。
tty(五)串口的打开过程,Linux内核和驱动,linux
tty(五)串口的打开过程,Linux内核和驱动,linux
最终注意看,是从全局数组tty_ldiscs中用disc(N_TTY)为下标返回一个操作集,tty_ldiscs是一个操作集集合。
tty(五)串口的打开过程,Linux内核和驱动,linux
总共有这些类型的线路规程
tty(五)串口的打开过程,Linux内核和驱动,linux

4、线路规程的注册

tty(五)串口的打开过程,Linux内核和驱动,linux
tty(五)串口的打开过程,Linux内核和驱动,linux
tty(五)串口的打开过程,Linux内核和驱动,linux

tty(五)串口的打开过程,Linux内核和驱动,linux文章来源地址https://www.toymoban.com/news/detail-608341.html

到了这里,关于tty(五)串口的打开过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux驱动开发:Linux 内核的一些函数

    1 、 MKDEV ( ma, mi ) 构造设备号,将主设备号和次设备号转换为设备号类型(dev_t)。 MKDEV 宏将主设备号( ma )左移 20 位,然后与次设备号( mi )相与,得到设备号。 dev_t 结构 主设备号 12 位

    2024年02月17日
    浏览(31)
  • Linux内核驱动开发(一)

    linux操作系统历史 开发模式 git 分布式管理 git clone 获取 git push 提交 git pull 更新 邮件组 mailing list patch 内核代码组成 Makfile arch 体系系统架构相关 block 块设备 crypto 加密算法 drivers 驱动(85%) atm 通信 bluetooth 蓝牙 firmware:外设 fs 文件系统 include 头文件 init 启动代码 ipc 进程通

    2023年04月11日
    浏览(34)
  • Linux驱动开发——内核模块

    目录 内核模块的由来 第一个内核模块程序  内核模块工具  将多个源文件编译生成一个内核模块  内核模块参数 内核模块依赖 关于内核模块的进一步讨论  习题 最近一直在玩那些其它的技术,眼看快暑假了,我决定夯实一下我的驱动方面的技能,迎接我的实习,找了一本

    2024年02月04日
    浏览(63)
  • 【Linux驱动】Linux--USB免驱摄像头驱动分析(基于5.4内核)

    【Linux应用】Linux–V4L2摄像头应用编程 【Linux】Linux–V4L2视频驱动框架 【Linux驱动】Linux–虚拟摄像头vivid驱动分析(基于5.4内核) 本文基于Linux 5.4内核,虚拟摄像头驱动文件在 driversmediausbuvc 目录下,本文深入分析了5.4内核下UVC驱动的实现及调用过程。读完本文可以对UVC驱

    2024年02月10日
    浏览(37)
  • Linux内核驱动 --- CCF框架 provider驱动的编写

    复制上节内容中对Provider驱动编写流程的总结: 1)分析硬件的clock tree,按照上面所描述的分类,将这些clock分类。 2)将clock tree在DTS中描述出来,需要注意以下几2点: 3)对于不能由clock framework core处理的clock,需要在driver中使用struct of_device_id进行匹配,并在初始化时,调用

    2024年02月07日
    浏览(40)
  • 怎么降低Linux内核驱动开发的风险?

    降低Linux内核驱动开发的风险是一个重要的目标,因为内核驱动开发可能会对系统的稳定性和安全性产生重要影响。以下是一些降低风险的建议: 1. 深入了解Linux内核:在开始内核驱动开发之前,建议深入学习Linux内核的工作原理和架构,包括内核模块、设备模型、调度机制等

    2024年02月08日
    浏览(26)
  • 现在开始学linux驱动内核好吗?

    一开始是觉得,内核诶,高大上。然后看了几个月驱动后,是认认真真的钻了几个月源码,写了很多学习笔记的那种。 先说好处吧,对基础能力的提升很明显。比如内核数据结构,指针,以及如何用c需要去完成面向对象的编程思想。还有硬件底层的认识。看着自己写的代码

    2024年02月12日
    浏览(39)
  • 【嵌入式Linux内核驱动】内核模块三要素与验证测试

    内核模块 Linux内核模块是一种可以动态加载和卸载的软件组件,用于扩展Linux操作系统的功能。Linux内核本身只包含了必要的核心功能,而内核模块则允许开发者在运行时向内核添加新的功能、驱动程序或文件系统支持,而无需重新编译整个内核或重新启动系统。 内核模块是

    2024年02月06日
    浏览(46)
  • Linux驱动开发(十五)---如何使用内核现有驱动(显示屏)

    《Linux驱动开发(一)—环境搭建与hello world》 《Linux驱动开发(二)—驱动与设备的分离设计》 《Linux驱动开发(三)—设备树》 《Linux驱动开发(四)—树莓派内核编译》 《Linux驱动开发(五)—树莓派设备树配合驱动开发》 《Linux驱动开发(六)—树莓派配合硬件进行字

    2024年02月15日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包