linux设备驱动之串口移植,Linux设备驱动之UART驱动结构

一、对于串口驱动Linux系统中UART驱动属于终端设备驱动,应该说是实现串口驱动和终端驱动来实现串口终端设备的驱动。要了解串口终端的驱动在Linux系统的结构就先要了解终端设备驱动在Linux系统中的结构体系,一方面自己了解的不够,另一发面关于终端设备的体系结构网上有很多很好很详细的资料参考,这里我主要是鉴于终端设备体系的复杂性,我大概总结一下自己了解到的一些方面和一个整体的框架。

二、终端设备的结构

163347506_1_20190611094930502.gif

Linux内核中 tty的层次结构图所示,包含tty核心、tty线路规程和tty驱动。tty核心是对整个tty设备的抽象,对用户提供统一的接口,tty线路规程是对传输数据的格式化,tty驱动则是面向tty设备的驱动,这是对设备的驱动,应该要我们来实现的,但是后面我们可以看到,对于串口驱动Linux还要进行抽象把共性提取出来封装,使得整个驱动层次化简单化。使得驱动的修改只要设计设备硬件的差异来,但是这样使得设备驱动的结构体系比较复杂,过程层次太多,难于理解。

tty设备发送数据的流程为:tty核心从一个用户获取将要发送给一个 tty设备的数据,tty核心将数据传递给tty线路规程驱动,接着数据被传递到tty驱动,tty驱动将数据转换为可以发送给硬件的格式。

接收数据的流程为: 从tty硬件接收到的数据向上交给tty驱动,进入tty线路规程驱动,再进入 tty 核心,在这里它被一个用户获取。尽管大多数时候tty核心和tty之间的数据传输会经历tty线路规程的转换,但是tty驱动与tty核心之间也可以直接传输数据。

163347506_2_20190611094930846.gif

三、tty设备驱动结构

163347506_3_20190611094931143.gif

图显示了与tty相关的主要源文件及数据的流向。tty_io.c定义了tty 设备通用的file_operations结构体并实现了接口函数tty_register_driver()用于注册tty设备,它会利fs/char_dev.c提供的接口函数注册字符设备,与具体设备对应的tty驱动将实现tty_driver结构体中的成员函数。同时 tty_io.c也提供了tty_register_ldisc()接口函数用于注册线路规程,n_tty.c文件则实现了tty_disc结构体中的成员。特定tty设备驱动的主体工作是填充tty_driver结构体中的成员,实现其中的成员函数。

四、串口驱动核心层

163347506_4_20190611094931393.gif

上图的数据流向应该和上面tty设备驱动一样,同样需要经过tty线路规则层,不过上图箭头标的不是很准确,说明一下,因为图是从网上下的。

很明显的看得到由tty设备驱动到串口驱动中间经过了一层serial_core ,从tty设备驱动中需要填充的是tty_driver结构,经过串口核心层后就转变成了实现xxx_uart.c 。到现在Linux系统已经封装了终端设备(tty)的驱动,www.linuxidc.com而我们只需要实现串口驱动就能实现整个串口终端驱动。

五、主要结构与关系

对于tty驱动层主要有几个重要的结构

serial_core实现了UART设备的通用TTY驱动层(称为串口核心层),这样UART驱动的主要任务演变成了实现serial_core中定义的一组uart_xxx接口而非tty_xxx接口,见如下的对应关系

----------------设备方法-----------------------------设备注册------------------------设备信息

------------tty_operations------------------------tty_driver---------------------------tty-struct          // tty核心层定义,serial_core(串口核心层实现的结构体)

+                                                     +                                                    +

+                                                     +                                                     +

--------------uart_ops-----------------------------uart_driver---------------------------uart_port     // 串口核心层定义,需要我们实现,但是Linuxs3c2410支持很好,我们只有去修改一下

----------s3c24xx_serial-ops-----------------s3c24xx_uart_drv-----------------s3c24xx_uart_port

对于s3c2410支持很好,一般只需要修改一些设备的硬件的一些寄存器设置的差异部分,所以看s3c2440的uart驱动代码的时候发现好少,一开始我都懵了,怎么其他的驱动代码这么多,怎么2440的代码这么少,下一篇文章我将分析一下s3c2440的代码。那么这样一来主要修改的地方时s3c24xx_uart_port的一些设置

s3c24xx_uart_port主要包含一下几个结构

uart_port

s3c24xx_uart_info        ——>主要是UART中的FIFO信息,需要修改

s3c34xx_uart_clksrc     ——>UART时钟、频率 ,需要修改

另外在加上一个结构体 s3c2410_uartcfg ——>硬件端口、寄存器 ,这个需要修改

归纳起来,对于支持完善的s3c2410的Linux来修改成s3c2440的驱动,需要修改的地方就是后面说明的三个结构体啦,所以工作就简单了很多啊。但是整个结构变的复杂了,上面是我自己总结的,图是网上下载的,有什么地方不对或者错误,希望广大网友指出,我好更正。163347506_5_20190611094931659.gif

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

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

相关文章

NVIDIA英伟达的Multi-GPU多卡通信框架NCCL

NVIDIA英伟达的Multi-GPU多卡通信框架NCCL 笔者注:NCCL 开源项目地址:https://github.com/NVIDIA/nccl 转自:https://www.zhihu.com/question/63219175/answer/206697974 NCCL是Nvidia Collective multi-GPU Communication Library的简称&…

C语言n个坐标点间的最大距离,c语言已知两点坐标,求另一点到穿过这两点的直线最短距离。...

c语言已知两点坐标,求另一点到穿过这两点的直线最短距离。以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!c语言已知两点坐标,求另一点到穿过这两点的直线最短距离。#…

[分布式训练] 单机多卡的正确打开方式:理论基础

[分布式训练] 单机多卡的正确打开方式:理论基础 转自:https://fyubang.com/2019/07/08/distributed-training/ 瓦砾由于最近bert-large用的比较多,踩了很多分布式训练的坑,加上在TensorFlow和PyTorch之间更换,算是熟…

s3c2416开发板 linux,S3C2416移植内核Linux3.1的wm9713声卡过程

移植内核的声卡驱动。原因没有声卡驱动,WM9713声卡驱动移植(原来的内核有UDA1341声卡驱动,我们再次基础上直接修改)1、直接复制内核得到三个文件:s3c2416_wm9713.c , wm9713.c , s3c2416_ac97.c.linux-3.1\sound\soc\codecs\Wm9713.c---->wm9713.c;li…

c语言六位抢答器课程设计,51单片机八路抢答器课程设计

;说明:本人的这个设计改进后解决了前一个版本中1号抢答优先的问题,并增加了锦囊的设置,当参赛选手在回答问题时要求使用锦囊,则主持人按下抢答开始键,计时重新开始。;八路抢答器电路请看下图是用ps仿真的,已…

ELF文件详解—初步认识

ELF文件详解—初步认识 转自:https://blog.csdn.net/daide2012/article/details/73065204 一、 引言 在讲解ELF文件格式之前,我们来回顾一下,一个用C语言编写的高级语言程序是从编写到打包、再到编译执行的基本过程,我们知道在C…

linux下ora 01110,ORA-01003ORA-01110

Oracle 9i数据库登录时,提示ORA-01003&ORA-01110,大概意思是数据文件存储介质损坏。startup nomount,正常;alter database mount,也正常;alter database open,提示如下:alter database open*ERROR 位于第 1 行:ORA…

x11转发:通过ssh远程使用GUI程序

x11转发:通过ssh远程使用GUI程序 我们常常使用ssh服务远程操控服务器,大多数操作我们都可以通过命令行命令来实现。 ssh远程无法查看GUI程序 现在,笔者在x11-test目录下放入一张图片test.jpg,并通过opnencv-python写一个简单的…

操作系统引导详细过程

操作系统引导详细过程 转自:https://blog.csdn.net/lijie45655/article/details/89366372 就直观而言,我们所见到计算机启动的过程是:按下电脑开机键,系统在黑色的屏幕下打印出一些英文语句、然后进入进度条状态,最后…

android 自定义透明 等待 dialog,Android自定义Dialog内部透明、外部遮罩效果

Android自定义Dialog内部透明、外部遮罩效果发布时间:2020-09-09 03:01:41来源:脚本之家阅读:117作者:zst1303939801本文实例为大家分享了Android自定义Dialog遮罩效果的具体代码,供大家参考,具体内容如下图…

对比损失的PyTorch实现详解

对比损失的PyTorch实现详解 本文以SiT代码中对比损失的实现为例作介绍。 论文:https://arxiv.org/abs/2104.03602 代码:https://github.com/Sara-Ahmed/SiT 对比损失简介 作为一种经典的自监督损失,对比损失就是对一张原图像做不同的图像…

android 融云浏览大图,融云 Android sdk kit 头像昵称更新机制

先申明笔者的实现方式不是唯一 也不一定是最优化的方案 如果您看到此篇博文 有不同看法 或者 更好的优化 更高的效率 欢迎在评论发表意见 融云官网点我融云头像机制相关视频详解首先跟大家说一下 kit 跟 lib 的头像机制 kit 是已经包含融云已经给开发者定制好的界面 诸如 会话界…

Linux中的awk、sed、grep及正则表达式详解

Linux中的awk、sed、grep及正则表达式详解 简介 awk、sed和grep是Linux中文本操作的三大利器。 其中awk适用于取列,sed适用于取行,grep适用于过滤。 正则表达式 首先我们来介绍一下正则表达式,正则表达式(regular expression)描述了一种…

android聚焦时如何给控件加边框,edittext设置获得焦点时的边框颜色

第一步:为了更好的比较,准备两个一模一样的EditText(当Activity启动时,焦点会在第一个EditText上,如果你不希望这样只需要写一个高度和宽带为0的EditText即可避免,这里就不这么做了),代码如下:a…

xargs 命令教程

xargs 命令教程 转自:http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html 作者: 阮一峰 日期: 2019年8月 8日 xargs是 Unix 系统的一个很有用的命令,但是常常被忽视,很多人不了解它的用法。 本文介绍如…

android strictmode有什么作用,Android 性能优化 之 StrictMode

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?StrictMode概述StrictMode 是用来检测程序中违例情况的开发者工具。使用StrictMode,系统检测出主线程违例的情况会做出相应的反应,如日志打…

curl 的用法指南

curl 的用法指南 转自:http://www.ruanyifeng.com/blog/2019/09/curl-reference.html 作者: 阮一峰 日期: 2019年9月 5日 简介 curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client&#xf…

怎么在html显示已登录状态,jQuery Ajax 实现在html页面实时显示用户登录状态

当网站是全静态的html页面时,而又希望网站会员在登录之后并在所有页面头部显示登录状态,如用户名等,如果未登录就是未登录状态,下面给大家来分享实现的方法。一、在html静态页面中加入div,并指定ID如:二、新…

xpwifi热点设置android,教你在XP电脑中开启设置WiFi热点使用的步骤

对于系统中网络的连接问题是最重要的,那在处理不同的错误的情况中,对于无线网络的设置也就是我们说的WiFi的使用也是会遇到问题的,那在操作的时候对于电脑中是怎么实现设置WiFi热点的的,对于这个问题今天小编就来跟大家分享一下教…

C/C++ 指针详解

指针详解 参考视频:https://www.bilibili.com/video/BV1bo4y1Z7xf/,感谢Bilibilifengmuzi2003的搬运翻译及后续勘误,也感谢已故原作者Harsha Suryanarayana的讲解,RIP。 学习完之后,回看找特定的知识点,善…