公开/公告号CN112416521A
专利类型发明专利
公开/公告日2021-02-26
原文格式PDF
申请/专利权人 超越科技股份有限公司;
申请/专利号CN202011328809.9
申请日2020-11-24
分类号G06F9/455(20060101);G06F9/4401(20180101);
代理机构37100 济南信达专利事务所有限公司;
代理人阚恭勇
地址 250100 山东省济南市高新区孙村镇科航路2877号
入库时间 2023-06-19 10:02:03
技术领域
本发明涉及软件设计领域,尤其涉及一种基于linux tty子系统的串口虚拟化的实现方法。
背景技术
随着近年多核系统、集群、网格、云计算的广泛部署,虚拟化技术在商业应用上的优势日益体现,不仅降低了IT成本,而且还增强了系统安全性和可靠性,虚拟化的概念也逐渐深入到人们日常的工作与生活中。虚拟化技术大部分使用网络通信,导致使用串口等特殊接口的传统应用的在实际迁移过程中遇到无法使用物理接口的问题。因此在系统下创建虚拟串口,应用程序操作虚拟串口进行数据收发操作,并将收发的数据通过网络进行转发,实现虚拟中的串口虚拟化。
tty一词源于Teletypes,或Teletypewriters,它是最早出现的一种终端设备,类似电传打字机,由Teletype公司生产。最初tty是指连接到Unix系统上的物理或者虚拟终端。终端是一种字符型设备,通常使用tty来统称各种类型的终端设备。随着时间的推移,当通过串行口能够建立起终端连接后,这个名字也用来指任何的串口设备。它还有多种类,例如串口(ttySn、ttySACn、ttyOn)、USB到串口的转换器(ttyUSBn),还有需要特殊处理才能正常工作的调制解调器(比如传统的WinModem类设备)等。tty虚拟设备支持虚拟控制台,它能通过键盘及网络连接或者通过xterm会话登录到计算机上。为了支持这些tty设备,Linux实现了一个叫做tty的子系统
发明内容
基于以上技术问题,本发明提供了一种基于linux tty子系统的串口虚拟化的实现方法。
本发明的技术方案是:
一种基于linux tty子系统的串口虚拟化的实现方法,定义虚拟串口设备和串口驱动,创建串口平台设备和平台驱动,在platform driver的probe接口中,完成虚拟串口的注册;在串口驱动的初始化函数中,调用uart_register_driver注册串口驱动。
进一步的,
定义虚拟串口设备
在串口驱动中,定义数据结构virtual_uart_port,其中包含uart_port结构体;同时定义rx_enable_flag和tx_enable_flag两个变量用于控制收发使能;定义工作队列用于模拟中断处理函数,完成数据发送操作。
定义串口驱动
定义virtual_uart_driver结构体,MAX_VIRTUAL_UART为控制器驱动支持的串口个数,dev_name为该虚拟串口对应字符设备文件名称的前缀。
创建串口平台设备
定义两个platform device结构体,而传递的参数index为串口的序号;platformdevice的中成员name为“virtual_uart_dev”,根据该名称完成与platform driver的匹配及探测功能。
创建串口平台驱动
定义的platform driver的结构体中支持probe、remove接口;该platform driver的name为“virtual_uart_dev”,通过该名称可进行platform device与platform driver的匹配检测。
probe接口实现的功能如下:
1)为uart_port申请内存,并设置uart_port的ops、fifosize、type、line等值,使用attr_group创建uart port私有的属性文件,这里用该变量该变量创建属性文件uart_receive_buff,用于模拟串口接收数据。
2)初始化工作队列及其回调函数virtual_uart_flush_to_port,该接口主要是模拟串口发送中断的功能,在真实的串口控制器中,则是申请串口中断,在串口中断的处理函数中进行数据的发送,而我们这个工作队列则是模拟串口中断函数的功能;
3)调用uart_add_one_port,将串口设备注册到串口驱动。
定义虚拟串口操作接口
1)tx_empty接口用于测试发送缓存是否为空;
2)stop_tx用于停止发送操作,start_tx用于启动发送操作;
3)stop_rx用于停止接收操作,startup接口主要是控制串口收发使能;
4)set_termios则主要是设置termios相关参数。
模拟串口接收功能
在tty port对应的device中,定义模拟串口接收数据的属性文件,定义如下:当用户向uart_receive_buff中写数据时,在该属性文件的store接口中会将写入的数据发送到tty_port的接收缓存中,并通过调用tty_flip_buffer_push接口,将tty_port接收缓存中的数据通过线路规程的receive_buff接口将数据刷新到tty_struct的接收缓存中,并wakeup读等待队列中sleep的读线程,即将数据发送到串口上的读线程中。
定义串口网络转发功能
定义虚拟串口网络转发函数,串口发送数据时,工作队列不断检测发送缓冲区是否为空,若不为空则通过网络TCP/UDP方式将数据转发出去;
接收到远端网络发送过来的数据后,将数据写入uart_receive_buff属性文件,应用程序可以在打开串口后,读取接收到的数据。
本发明可以创建虚拟串口,保证传统使用串口应用程序得正常运行。
附图说明
图1是本发明的所用的tty子系统内部结构意图;
图2为该虚拟串口读写时数据流向和函数调用图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明的所用的tty子系统内部结构如图1所示,其中串口驱动对接外部的串口设备,线路规程主要对输入输出数据进行处理,以协议转换的方式格式化从用户或硬件设备收到的数据。线路规程把串口驱动和tty驱动结合在一起,策略的分离使得串口驱动和tty驱动不需要关注数据语法处理,tty驱动可以被相同的硬件复用,而只需更改线路规程。tty驱动用来处理各种终端设备。用户空间程序通过tty驱动来读写串口设备。
本发明主要功能包括以下几点:定义虚拟串口设备和串口驱动,创建串口平台设备和平台驱动,在platform driver的probe接口中,完成虚拟串口的注册。在串口驱动的初始化函数中,调用uart_register_driver注册串口驱动。
1、定义虚拟串口设备
在串口驱动中,定义数据结构virtual_uart_port,其中包含uart_port结构体。同时定义rx_enable_flag和tx_enable_flag两个变量用于控制收发使能。定义工作队列用于模拟中断处理函数,完成数据发送操作。
2、定义串口驱动
定义virtual_uart_driver结构体,MAX_VIRTUAL_UART为控制器驱动支持的串口个数,dev_name为该虚拟串口对应字符设备文件名称的前缀。
3、创建串口平台设备
定义两个platform device结构体,而传递的参数index为串口的序号。platformdevice的中成员name为“virtual_uart_dev”,根据该名称可完成与platform driver的匹配及探测功能。
4、创建串口平台驱动
定义的platform driver的结构体中支持probe、remove接口。该platform driver的name为“virtual_uart_dev”,通过该名称可进行platform device与platform driver的匹配检测。
probe接口主要实现的功能如下:
1)为uart_port申请内存,并设置uart_port的ops、fifosize、type、line等值,使用attr_group创建uart port私有的属性文件,这里用该变量该变量创建属性文件uart_receive_buff,用于模拟串口接收数据。
2)初始化工作队列及其回调函数virtual_uart_flush_to_port,该接口主要是模拟串口发送中断的功能,在真实的串口控制器中,则是申请串口中断,在串口中断的处理函数中进行数据的发送,而我们这个工作队列则是模拟串口中断函数的功能;
3)调用uart_add_one_port,将串口设备注册到串口驱动。
5、定义虚拟串口操作接口
1)tx_empty接口用于测试发送缓存是否为空;
2)stop_tx用于停止发送操作,start_tx用于启动发送操作;
3)stop_rx用于停止接收操作,startup接口主要是控制串口收发使能;
4)set_termios则主要是设置termios相关参数(包括字节宽度、波特率等参数的设置)。
6、模拟串口接收功能
在tty port对应的device中,定义模拟串口接收数据的属性文件,定义如下:当用户向uart_receive_buff中写数据时,在该属性文件的store接口中会将写入的数据发送到tty_port的接收缓存中,并通过调用tty_flip_buffer_push接口,将tty_port接收缓存中的数据通过线路规程的receive_buff接口将数据刷新到tty_struct的接收缓存中,并wakeup读等待队列中sleep的读线程,即将数据发送到串口上的读线程中,可以操作打开虚拟串口并读取串口接收到的数据。
/*借助注册至sysfs下的属性文件模拟接收,因此当对属性文件uart_receive_buff进行写操作时会进入该函数的处理中*/
7、定义串口网络转发功能
定义虚拟串口网络转发函数,串口发送数据时,工作队列不断检测发送缓冲区是否为空,若不为空则通过网络TCP/UDP方式将数据转发出去。
接收到远端网络发送过来的数据后,将数据写入uart_receive_buff属性文件,应用程序可以在打开串口后,读取接收到的数据。
以上所述仅为本发明的较佳实施例,仅用于说明本发明的技术方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所做的任何修改、等同替换、改进等,均包含在本发明的保护范围内。
机译: 基于LINUX操作系统的CEN / XFS标准体系结构及其实现方法。
机译: 基于LINUX系统的CEN / XFS标准体系结构和实现方法
机译: 基于LINUX系统的CEN / XFS标准体系结构和实现方法