c++创建虚拟串口_linux虚拟串口控制器驱动实现——适用于无开发板学习串口驱动...

在上一章我们已经说明了uart驱动的开发流程,本章我们就不再介绍uart相关的接口实现,仅通过实现一个虚拟的串口控制器程序,用以说明虚拟串口的开发流程。

本次开发的虚拟串口提供的功能如下:

  1. 提供两个串口实例
  2. 串口名称的前缀为vttyU
  3. 为了验证串口收发,提供了loopback机制,即应用程序向虚拟串口写入数据后,数据再回环至应用程序;
  4. 在/sys目录下提供数据写入属性文件,可向虚拟串口中写入数据,用以模拟串口接收数据的功能

本次开发的代码涉及的模块包括:

  1. 创建两个platform device,分别对应两个虚拟串口的platform device;
  2. 创建一个platform driver,在platform driver的probe接口中,完成虚拟串口的注册,主要是完成uart_add_one_port接口完成虚拟串口的注册;在platform driver的remove接口中,完成虚拟串口的注销;
  3. 在串口驱动的初始化函数中,调用uart_register_driver,uart driver的注册。

数据结构说明

在虚拟串口驱动中,定义了数据结构virtual_uart_port,该数据结构中包含了uart_port。并定义了tx_enable_flag、rx_enable_flag,分别用于控制串口收发,因是虚拟串口所以使用这两个变量进行表示,若是真是的串口控制器,则不需要这两个变量,而只需要在uart_ops->startup、uart_ops->stop_rx、uart_ops->stop_tx中关闭中断即可,这两个变量由自旋锁write_lock进行保护。

af3ea4280f42621c9ae36a965beee96d.png

uart_driver定义及注册

定义virtual_uart_driver,本串口控制器驱动支持的串口个数为MAX_VIRTUAL_UART(6个)、而dev_name则为该虚拟串口对应字符设备文件名称的前缀,本次定义前缀为“vttyU”,本串口不支持控制台。调用uart_register_driver即完成本串口控制器驱动的注册与注销

2ced2643ef1b985f7f2128738a3419c5.png

Platform device定义及注册

本次我们主要完成了串口的注册,因此我们定义并注册了两个platform device,而传递的参数为串口的index的。接口定义如下所示,platform device的name为“virtual_uart_port_dev”,根据该名称可完成与platform driver的匹配及探测功能(因我们在ubuntu16.04下完成的验证,没有设备树概念,因此就定义了这两个platform device,若支持设备树,则无须我们手动定义这两个platform device,只需要修改设备树文件即可)。

93485469eb281f10a6c61b867ce6c64d.png

Platform driver的定义及注册

我们的platform driver的定义如下,支持probe、remove接口,probe接口主要完成uart port的注册、remove接口主要完成uart port注销,该platform driver的name为“virtual_uart_port_dev”,通过该名称可进行platform device与platform driver的匹配检测,同时我们也定义了of_device_id,若内核支持设备树,则在设备树中的compatible中也设置“jerry_chg,virtual-uart”,即可完成platform device与platform driver的匹配检测。

2a8cfe20b6fb998e0c99f017bef9edaa.png

virtual_uart_port_platform_probe接口的定义如下,主要实现的功能如下:

  1. 为uart_port申请内存,并设置uart_port的ops、fifosize、type、line等值,另外还可为该uart_port创建uart_port相关的私有属性文件(sysfs下),而在linux3.10的内核中uart_port中并没有定义attr_group变量,导致uart_add_one_port接口只能在tty_port对应device中创建uart核心定义的属性文件,而不能创建uart port私有的属性文件,而在后面的内核中特意增加了attr_group,用于创建uart port私有的属性文件,这个成员变量增加的挺好,本次虚拟串口就借助该变量创建了属性文件uart_receive_buff,用于模拟串口接收数据。
  2. 初始化一个工作队列及其回调函数virtual_uart_flush_to_port,该接口主要是模拟串口发送中断的功能,在真实的串口控制器中,则是申请串口中断,在串口中断的处理函数中进行数据的发送,而我们这个工作队列则是模拟串口中断函数的功能;
  3. 调用uart_add_one_port,完成串口的添加。
b9f66219f7331102de17649ea1915820.png

Uart port操作接口定义

我们为虚拟串口定义的操作接口如下

  1. 其中tx_empty接口用于测试发送缓存是否为空(uart_port的环形缓冲区);
  2. stop_tx用于停止发送操作(在真实串口控制器驱动中,则关闭发送中断即可);
  3. start_tx用于启动发送操作(在真实串口控制器驱动中,则开启发送中断,然后则触发发送中断,继而在发送中断处理接口中执行数据的发送操作,而在我们的虚拟串口中,则调用schedule_work,启动工作队列,调用工作队列的回调函数进行数据发送);
  4. throttle、unthrottle则是流控操作,在真实串口中则设置相应定时器即可(本驱动未实现该功能);
  5. stop_rx用于停止接收操作(在真实串口控制器驱动中,则关闭接收中断即可)
  6. startup接口主要是启动串口功能(在真实串口控制器驱动中,则申请中断,并使能接收中断;而发送中断的使能在start_tx中实现,而在我们虚拟串口驱动中,则是使能收发数据的flag);
  7. set_termios则主要是设置termios相关参数(包括字节宽度、波特率等参数的设置);
7277115fd0495e843c65f47335e3252f.png

而set_mctrl接口则一定要定义,即使是一个空函数也要定义。

模拟串口接收功能实现

因为我们是虚拟串口,但是又要模拟串口接收功能,因此我们在tty port对应的device中,定义了模拟串口接收数据的属性文件,定义如下:

当用户向该属性文件(uart_receive_buff)中写数据时,则在该属性文件的store接口中,将写入的数据发送到tty_port的接收缓存中,并通过调用tty_flip_buffer_push接口,将tty_port接收缓存中的数据通过线路规程的receive_buff接口将数据刷新到tty_struct的接收缓存中,并wakeup读等待队列中sleep的读线程(这一系统的操作流程可参考我之前写的几篇文档),即将数据发送的该串口上的读线程中。

7b1d6de4ff159139ce53b8d493fc03ea.png

我们可以通过如下脚本向uart_receive_buff写数据,从而模拟串口接收数据

73ced51d63bc1df73b86159e97129a04.png

测试验证

  1. 在应用程序中打开/dev/vttyU1,进行数据接收;
  2. 向/sys/class/tty/vttyU1/uart_receive_buff写数据,则上述1中的进程即会接收到数据,测试截图如下
d5d6ef6527ae5cf5406b6d95d9242b39.png
aa0c3a2a9c551c89ce486f2ddad0a807.png

至此我们完成了虚拟串口驱动代码的实现以及验证工作,我们也完成了tty子系统、uart子系统架构内部实现流程的分析,也完成了对应虚拟控制器驱动的实现及验证,下一次我们开始进行input子系统的分析(关于本驱动的源码,后续我们会把链接发出来)。

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

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

相关文章

奇妙的安全旅行之AES算法

hi,大家好,今天开始我们来介绍一下对称加密算法中的AES算法。 AES简介 AES(英语:Advanced Encryption Standard,缩写:AES),即高级加密标准,在密码学中又称Rijndael加密…

axios vue 回调函数_前端Vue 面试题大全

点蓝色字关注“程序员报刊” 「学习 新闻 招聘 」vue的底层原理?vue组件之间的通信?JS中判断数据类型的方法有几种?最常见的判断方法:typeof判断已知对象类型的方法:instanceof根据对象的constructor判断:constructor无敌万能的…

奇妙的安全旅行之RSA算法

hi,大家好,我是开发者FTD。今天我们开始介绍非对称加密算法。非对称加密算法区别于对称加密算法的主要特点是,非对称加密算法有两个密钥:公钥 (public key) 和私钥 (private key)。公钥和私钥是一对密钥,如果用公钥对数…

易语言多级指针读取_C语言指针难吗?纸老虎而已,纯干货讲解(附代码)

作者:21IC网络整理,排版:晓宇微信公众号:芯片之家(ID:chiphome-dy)指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面…

奇妙的安全旅行之DSA算法

hi,大家好,我是开发者FTD。今天我们来介绍一下非对称加密算法中的DSA算法。 DSA 算法简介 DSA(Digital Signature Algorithm)是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard) 数字签…

lisp语言画阿基米德线_【R语言】如何将照片快速转换为素描

【R语言】如何将照片快速转换为素描(三行代码给老婆(划掉)画一张素描)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com最近发现了一个比较好玩的包,叫做sketcher这个包的作用就是将图片转化成素描的样式以下是…

2021年程序员1月薪资统计,你在哪一档?

hi,大家好,我是开发者FTD。2021年1月份马上就要结束了,再过一周多春节也即将来临,春节后估计又是一波跳槽高峰,那我们一起来看一下当前程序员的薪资状况,让大家对于年后是否要换工作也有个心理预期吧。 注&…

海康sip服务器地址_完整SIP/SDP媒体协商概论SDP基础使用要求

接完整SIP/SDP媒体协商概论-SDP基础-核心定义全解。上一个章节笔者介绍了关于SDP的一些核心概念(第一章节和第二章节),今天,我们继续在此之间讨论SDP的其余基础内容(从第三章节开始)。在以下讨论中,笔者会介绍关于SDP的使用,SDP的…

一月:你今年还回家过年吗?

hi,大家好,我是开发者FTD。一月份对于我来说,是工作和生活渐渐明朗的一个月,之前迷茫的状态感觉在这一个月开始慢慢消失,并让整个人的精神状态开始转变。2021年才刚刚开始,大家也可以对自己新的一年进行一个…

6个座位办公室最佳位置_2021最佳动力艇大奖:6个类别29个入围名单揭晓

年度最佳动力艇大奖由英国杂志《Motor Boat & Yachting》(MBY)主办,经(MBY)深思熟虑,评委们缩小了2021年度最佳动力艇大奖的决赛入围名单。由于旅行限制,今年的形式会有所不同,不能像往年一样测试那么多的船。因此&#xff0c…

奇妙的安全旅行之ECC算法

hi,大家好,我是开发者FTD。今天我们来介绍一下非对称加密算法的ECC算法。 ECC 算法简介 ECC 是 Elliptic Curves Cryptography 的缩写,意为椭圆曲线密码编码学。和RSA算法一样,ECC算法也属于公开密钥算法。最初由 Koblitz 和 Mi…

奇妙的安全旅行之国密算法

hi,大家好,我是开发者FTD。今天我们来介绍一下我们国家密码局制定的加密算法 — 国密算法。 为什么要制定国密算法? 密码算法是保障信息安全的核心技术,尤其是我国最关键的银行业核心领域长期以来都是沿用MD5、3DES、SHA-256、R…

Kali Linux—借助 SET+MSF 进行网络钓鱼、生成木马、获主机shell、权限提升、远程监控、钓鱼邮件等完整渗透测试(二)

远控木马 SET 同时集成了木马生成工具,可以生成木马并调用MSF框架对远程主机进行控制。直接使用MSF生成木马并控制主机的可参考之前另一篇博文:渗透测试-Kali入侵Win7主机。 控制主机 1、运行 SET,选择创建攻击载荷和监听器: 2…

wdnas群晖nas_西数WD NAS红盘 WD140EFFX 14TB HDD和 SA500 1TB SSD开箱拆解评测

前言每个NAS系统都应该配备足够容量的硬盘,以满足数据存储需求。WD Red 西数红盘存储空间高达14TB,可以为需要构建大容量和高性能NAS存储方案的用户提供解决方案。WD Red西数红盘14T运行安静且热量低,其采用的NASware 3.0技术提高了兼容性、集…

奇妙的安全旅行之加密算法(完整版)

hi,大家好,我是开发者FTD。之前我在公众号写了一个工作中常用加密算法系列的文章终于肝完了,为了方便小伙伴们查看和收藏,我将这个系列汇集整理成了一个PDF文档,有需要的小伙伴可以关注公众号,在公众号后台…

智能车s3010舵机工作电压_全国大学生智能车竞赛决战南京信息工程大学

未来网高校频道8月25日讯(记者 杨子健 通讯员 唐翠梅 方向 张峰 曾雅俊)8月24日上午,由中国自动化学会主办,南京信息工程大学承办的第十五届全国大学生智能汽车竞赛创意组总决赛、第十五届全国大学生智能汽车竞赛华东赛场预决赛开幕仪式在学校东苑体育馆…

直接拿来用!GitHub10个开源免费的后台管理面板

hi,大家好,我是开发者FTD。今天要给大家介绍几个GitHub上开源免费好用的后台管理面板,大家在平时工作中,一定不可避免的会开发一些业务管理控制后台,如果从零开始完整的做一套不是一件很容易的事情,还好Git…

人名和成绩一起排序_EXCEL基础知识——排序功能的使用

排序筛选可能是大家工作中最常用的数据处理方式了,它能很快地从大到小完成排序,并且筛选除你想要的数据。从简单的排序筛选到高级筛选你会哪几步呢?一起来看看。一、简单排序下面这组数据,我们想要将数学成绩从大到小的排序&#…

android骰子游戏代码_真神器!不用手写一行代码就能做网站~

点击上方“Python编程时光”,选择“加为星标”第一时间关注Python技术干货!制作网站用什么,Dreamweaver 还是 Fireworks?现在,用 GPT-3 就可以。一位来自旧金山的程序员小哥做了款名为 debuild.co 的网页制作软件&…

一文带你读懂计算机进制

hi,大家好,我是开发者FTD。在我们的学习和工作中少不了与进制打交道,从出生开始上学,最早接触的就是十进制,当大家学习和使用计算机时候,我们又接触到了二进制、八进制以及十六进制。那么大家对进制的认识和…