在前面几章,我们介绍了tty子系统的框架、数据结构、tty驱动的注册与注销等内容,本章我们借助

之前学习的内容开发一个虚拟的串口控制器驱动,以便我们理解开发串口驱动的步骤及驱动开发实践。

本次实现的虚拟串口主要是借助tty_register_driver、tty_port_register_device实现,而不是借助

uart_register_driver、uart_add_one_port,等我们后面介绍了uart子系统之后,再借助

uart_register_driver、uart_add_one_port实现一次虚拟串口。

本次虚拟串口实现的功能

虚拟串口的名称为vttyM(如串口0,则为/dev/vttyM0);应用程序可通过打开设备文件/dev/vttyM0,实现对串口vttyM0的读写操作;/dev/vttyM0支持loopback模式,即应用程序通过/dev/vttyM0打开串口后,向串口写入数据后,vttyM0则会将写入的数据作为接收数据,再刷新到串口中;可通过sysfs,通过设置/sys/class/tty/vttyM0/vtty_loopback属性,进行loopback模式的开启与关闭(默认开启loopback模式);可通过sysfs文件系统,通过向/sys/class/tty/vttyM0/vtty_receive_buff中写入数据,来模拟vttM0串口的数据接收,如echo "vtty test" >vtty_receive_buff,则表示串口接收到数据“vtty test”,此时若读取/dev/vttyM0,则可以获取到数据“vtty test”

本次虚拟串口实现涉及的知识点

借助platform device接口,实现虚拟串口端口对应platfomr的创建(如实现vttyM0、vttyM1两个串口,则创建对应的两个platform device);借助platform driver接口,实现platform device对应的driver,在platform driver的probe接口中,调用tty_port_register_device完成tty端口及其对应字符设备的注册借助sysfs_create_group,创建tty端口对应的sysfs属性文件,实现loopback的控制以及模拟串口接收数据的模拟;借助tty_register_driver,完成虚拟tty 控制器驱动的注册,并实现对应的接口

下面详细说明实现步骤

Platform device的实现

在本次代码实现中,主要实现了两个虚拟串口,因此创建了两个platform device,其中struct virtual_tty_port_platform_config定义了每一个端口的信息,此处主要定义了tty端口的index,而platform driver与platform dev匹配的条件即为plaform device的名称"virtual_tty_port_dev"

linux虚拟串口控制器实现---适用于无开发板学习tty driver-1.jpg (69.56 KB, 下载次数: 0)

2021-2-25 06:06 上传

Platform driver的实现

Platform driver的定义如下,该platform driver的名称为"virtual_tty_port_dev",基于名称匹配检测,即可完成platform driver与platform device的匹配。

当platform driver与platform device匹配后,则调用其probe接口进行探测操作,而在virtual_tty_port_platform_probe接口中,主要实现如下功能:

创建 struct virtual_tty_port *port变量,作为本驱动的tty_port相关数据结构类型变量,为该tty端口创建一个fifo,用于存储写入到虚拟串口中的数据;创建一个工作队列,并设置工作队列对应的callback为virtual_tty_flush_to_port,当线路规程的写接口调用tty_driver的write_buff接口后,在write_buff接口中,将数据刷到tty port的fifo中,然后唤醒该工作队列,由工作队列的回调函数进行写操作(因我们的虚拟串口不支持中断,此处由工作队列进行模拟)调用tty_port_register_device,注册该tty端口及其对应的字符设备;调用sysfs_create_group,为该tty端口对应的device创建属性文件,主要是/sys/class/tty/vttyM0/vtty_loopback、/sys/class/tty/vttyM0/vtty_receive_buff

linux虚拟串口控制器实现---适用于无开发板学习tty driver-2.jpg (89.73 KB, 下载次数: 0)

2021-2-25 06:06 上传

通过platform driver 的probe,即完成tty端口的注册,而tty端口的操作接口,主要定义了如下几个:

当打开tty端口时,将该端口的loopback模式设置为true,即打开其loopback模式,这样应用程序打开一个串口后,即可对该串口先进行写操作,再进行读操作了。而在关闭一个tty端口时,则关闭loopback模式,同时提供了tty端口内存的释放接口,这个主要是借助device的kref实现的。

linux虚拟串口控制器实现---适用于无开发板学习tty driver-3.jpg (67.74 KB, 下载次数: 0)

2021-2-25 06:06 上传

Tty driver的注册

Tty driver的代码如下,其中tty端口的名称前缀为vttyM,tty的类型为串口,该tty driver提供的操作接口包括open、close、write、hangup、write_room、install、remove、set_termios等。

具体功能说明如下:

open接口主要是打开一个tty端口,主要就是对tty_port_open,而在该接口中,会初始化该tty端口的接收缓存、tty_port与struct tty_struct的关联等等操作write接口用于向该tty端口写数据,在本驱动中,即将数据缓存到kfifo中,然后调用schedule_work,由我们注册工作队列进行写操作;hangup用于挂起一个tty端口,主要调用tty_port_hangup实现挂起操作;install主要建立tty_struct与tty_driver的关联,内部主要调用tty_standard_install实现,同时设置tty_struct->driver_data指向该tty端口对应的struct virtual_tty_port ,实现将tty_struct与我们的端口相关的私有数据变量的关联;remove用于移除tty_struct与tty_driver的关联,此处则主要设置driver->ttys[tty->index] = NULLcleanup主要进行资源的释放,此处主要是减少对struct virtual_tty_port 的引用计数;virtual_tty_set_termios则主要是设置字节宽度、波特率等信息,若是真实的串口,此处应该根据串口控制器的数据手册进行设置。

linux虚拟串口控制器实现---适用于无开发板学习tty driver-4.jpg (112.25 KB, 下载次数: 0)

2021-2-25 06:06 上传

设备属性文件的实现

主要是在sysfs文件系统下创建device相关的属性文件,此处主要是设置loopback模式以及模拟虚拟串口接收数据的功能,定义如下:

对于模拟接收数据的功能,主要是调用tty_insert_flip_char实现将数据写入到tty端口中,并调用

tty_flip_buffer_push实现将数据刷到对应线路规程的buffer中,关闭数据读写的流程,可参考我上一篇文章,此处不再细说。

linux虚拟串口控制器实现---适用于无开发板学习tty driver-5.jpg (91.88 KB, 下载次数: 0)

2021-2-25 06:06 上传

下面是测试截图:

通过sysfs下设备属性文件,模拟串口接收数据

linux虚拟串口控制器实现---适用于无开发板学习tty driver-6.jpg (8.11 KB, 下载次数: 0)

2021-2-25 06:06 上传

然后在应用程序读取串口接收的数据

linux虚拟串口控制器实现---适用于无开发板学习tty driver-7.jpg (9.09 KB, 下载次数: 0)

2021-2-25 06:06 上传

完成以上功能后,基本上完成了一个虚拟的串口控制器以及虚拟串口读写的实现,该代码可用来学习

串口驱动的使用,而在实际的串口中,主要是在写函数与读函数上有所不同,一般串口的读写均是通过中断实现的,而且也可以进行流控、串口波特率设置等内容,完整的代码后续会上传到csdn上,后面我会把链接贴上。本篇的内容主要是实现一个模拟的串口控制器及串口的实现,熟悉了tty_driver、tty_port的注册与注销后,下一章学习uart子系统也会有所帮助。

linux 控制虚拟串口,linux虚拟串口控制器实现-适用于无开发板学习tty driver-好向圈...相关推荐

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

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

  2. OK6410开发板学习之安装linux系统至开发板

    说来惭愧,OK6410开发板自从买来就一直在躺灰,当时连教程也花了1千多大洋了,近来感觉前途迷茫,遂决定将其拿出来研究研究,看是否能够给我新出路. 废话不多说,先上一张OK6410开发板大图: 不要问 ...

  3. 阿里云HaaS100物联网开发板学习笔记(二)硬件控制初步--让小灯闪烁起来

    摘要:无论是哪种开发板,要想开发特定的功能,必先从GPIO开始,HaaS100开发也是一样.如果仅仅利用HaaS100的联网功能,那简直是太浪费了.HaaS100拥有其他开发板所具备的所有的功能,比如 ...

  4. 【STM32 .Net MF开发板学习-11】步进电机控制(非PWM模式)

    选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用 uln2003芯片的驱动板,其控制时序图如下: 四相八拍:A->AB->B ->BC - ...

  5. 【STM32 Net MF开发板学习-11】步进电机控制(非PWM模式)

    选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用uln2003芯片的驱动板,其控制时序图如下: 四相八拍:A->AB->B ->BC -& ...

  6. linux 控制终端卡,配置通过串口控制linux操作系统的终端

    开始之前,请确认机器有串口(com口, RS232接口),如果没有,那就没有办法达到通过串口控制机器的目的了.当然,也可以额外给机器安装一个带串口的 PCI 模块,然后想办法将模块驱动起来(内核默认能 ...

  7. linux can总线接收数据串口打包上传_使用Zedboard开发板学习Linux的移植及驱动开发...

    本文是昨天发的文章<龙芯杯CPU设计竞赛与ZYNQ设计流程介绍>接续部分.重点介绍传统方式的Linux移植和Xilinx的Petalinux的快速移植开发两种. 部分硬件设计中需要CPU完 ...

  8. 4412开发板学习之Linux驱动开发(五):4412MMU及GPIO操作(点灯)

    4412MMU及GPIO操作(点灯) 物理地址与虚拟地址 与传统MCU的对比 4412中的物理地址 MMU内存管理单元 存储器分类 4412中的存储器映射 物理地址和虚拟地址 其他的地址概念 GPIO ...

  9. 4412开发板学习之Linux驱动开发(八):GPIO读操作与按键轮询实现

    GPIO读操作与按键轮询实现 GPIO读操作 硬件 查找对应IO口 寄存器配置 软件 需要的函数 注册设备 代码及分析 实验效果 按键轮询实现 原理分析 硬件 软件 用到的函数 先前准备工作 代码及分 ...

最新文章

  1. Windows 2003 Server 设置技巧
  2. QT中无法使用10^n次方来计算
  3. 当容器应用越发广泛,我们又该如何监测容器?
  4. boost::contract模块实现sum的测试程序
  5. 百度百科中关于fwrite的用法说明
  6. HDU - 6899 Xor(数位dp)
  7. win10上的docker怎么设置开机不要自动启动 [问题点数:20分,结帖人xyq1986]
  8. cusparseScsrsv_analysis函数导致内存暴涨问题
  9. js准确获取当前页面url网址信息
  10. php Access-Control-Allow-Origin 解决跨域问题
  11. 显示滚动条后,table 表头与内容不对齐,JS脚本控制
  12. 【Android架构GPS篇】之定位数据如何从GPS芯片到应用层
  13. 对python程序设计的学习心得_程序设计心得体会-精选模板
  14. linux集群常用文件拷贝命令
  15. 程序员坐行李箱迎寒风编码2小时,上热搜!你怎么看?
  16. openwrt路由器php-cli,【在openwrt无线路由器上部署freeswitch+fusionpbx (原帖恩山论坛)】-网关论坛-ZOL中关村在线...
  17. 游戏开发人员推荐书单
  18. IDEA 导入外来jar包并生效(同 Eclipse 中 buid path 效果)
  19. 美团 YOLOv6 ORT/MNN/TNN/NCNN C++推理部署
  20. MATLAB实现自编码器(一)——Autoencoder类和训练设置

热门文章

  1. Linux系统vi和vim的介绍
  2. js 将json字符串转换为json对象的方法解析
  3. 菜鸟如何看懂python代码_python菜鸟入门教程
  4. 如何撰写数据运营分析报告
  5. [Algorithm] 哥德巴赫猜想的验证(使用Python从0开始实现)
  6. 深度学习中文版-Deep Learning-Yoshua Bengio.pdf
  7. 青岛大学_王卓老师【数据结构与算法】Week02_02_案例引入_学习笔记
  8. 程序员必会的十步快速学习法(附书单)
  9. 详解SpringBoot自动装配原理
  10. 四级联动(品名、材质、规格、产地)和自动完成的功能