一种Linux系统下提升usb批量传输速度的方法及系统技术方案

技术编号:24352963 阅读:29 留言:0更新日期:2020-06-03 01:58
一种Linux系统下提升usb批量传输速度的方法,该方法包括以下步骤:发送多个urb请求;在struct usbdevfs_urb结构体的usercontext填充循环标号;调用接收数据的ioctl函数,接收系统传输的结果数据urb;回传urb的usercontext的循环标号;利用循环标号继续发送多个urb请求。本发明专利技术实施例还包括一种Linux系统下提升usb批量传输速度的系统。系统的urb队列中会有多个urb请求,对应的该usb总线上会传输多个我们的usb数据包,一方面提高了总线使用率,使系统尽快与usb设备通信,另一方面,urb请求一次性批量出现在队列中,usb数据包也大批量存在于该usb设备所在总线中,会使得系统和硬件优先处理该usb传输请求,后处理其他usb设备的请求,从而提高该usb设备的传输速度。

A method and system of improving USB batch transfer speed under Linux system

【技术实现步骤摘要】
一种Linux系统下提升usb批量传输速度的方法及系统
本专利技术涉及通信传输
,具体地说是一种Linux系统下提升usb批量传输速度的方法及系统。
技术介绍
Linux系统访问usb设备有两种方式:编写内核驱动模块ko和在用户空间编写程序,通过内核提供的usbfs功能访问usb设备两种方案。编写用户空间程序相对于内核模块有很多优势(用户程序开发可选库多,开发便捷,对系统的影响比内核模块小,不会因为程序出错导致整个系统崩溃等等),因此越来越多人选择用户空间程序来编写usb“设备驱动”访问usb设备。在Linux系统下一般选择使用libusb开源库(http://libusb.info)来编写用户空间的usb驱动程序。libusb作为通用usb库,支持多平台使用(windows、Linux、OSX等),因为需要兼顾多种平台、多种使用方式,libusb库在某些条件要求严格的环境下,性能上会有达不到要求的情况,在进行批量传输需要快速发送、接收大量数据时,效率不高。
技术实现思路
本专利技术的目的在于提供一种Linux系统下提升usb批量传输速度的方法及系统,用于解决进行批量传输数据时,传输效率低下的问题。本专利技术解决其技术问题所采取的技术方案是:本专利技术第一方面提供了一种Linux系统下提升usb批量传输速度的方法,该方法包括以下步骤:发送多个urb请求;在structusbdevfs_urb结构体的usercontext填充循环标号;调用接收数据的ioctl函数,接收系统传输的结果数据urb;回传urb的usercontext的循环标号;利用循环标号继续发送多个urb请求。结合第一方面,在第一方面第一种可能实现的方式中,在上述方法中,urb请求队列中的urb请求数保持不变。本专利技术第二方面提供了一种Linux系统下提升usb批量传输速度的系统,该系统包括请求模块,用于发送urb请求;和/或,调用模块,用于调用ioctl函数,得到系统传输的结果数据urb;和/或,循环标号模块,用于在structusbdevfs_urb结构体的usercontext填充循环标号。结合第二方面,在第二方面第一种可能实现的方式中,所述循环标号的取值范围为1-800。由上述可知,在本专利技术中,系统的urb队列中会有多个urb请求,对应的该usb总线上会传输多个我们的usb数据包,一方面提高了总线使用率,使系统尽快与usb设备通信,另一方面,urb请求一次性批量出现在队列中,usb数据包也大批量存在于该usb设备所在总线中,会使得系统和硬件优先处理该usb传输请求,后处理其他usb设备的请求,从而提高该usb设备的传输速度。附图说明为了更清楚地说明本专利技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1为一种Linux系统下提升usb批量传输速度的方法流程示意图;图2为本专利技术实施例所应用的一种Linux系统下提升usb批量传输速度的系统结构示意图。具体实施方式为了使本
的人员更好地理解本专利技术中的技术方案,下面将结合本专利技术实施例中的附图,对本专利技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本专利技术一部分实施例,而不是全部的实施例。基于本专利技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本专利技术保护的范围。目前,Linux下用户空间程序访问usb设备的通用方法如下:1.Linux内核提供usbfs驱动实现用户空间程序访问usb设备的方法。2.usb设备接入,usbfs在/dev/bus/usb下创建一个该设备的字符设备节点:/dev/bus/usb/BBB/DDD,其中,BBB为usbbus号,DDD为系统给该设备分配的设备号。3.应用程序遍历(或使用hotplug机制获取bus号、设备号直接访问)/dev/bus/usb目录,使用系统调用open打开/dev/bus/usb/BBB/DDD设备,使用read系统调用读取该设备的usb设备描述符、配置描述符、接口描述符等,确认是否为需要操作的设备。4.使用ioctl系统调用发送usb端点(endpoint)I/O请求或者进行其他类型的设备操作,批量传输则需要封装一个urb请求(usbdevfs_urb结构体)。使用ioctl发送urb请求和读取结果。#defineUSBDEVFS_SUBMITURB_IOR('U',10,structusbdevfs_urb)#defineUSBDEVFS_REAPURBNDELAY_IOW('U',13,void*)ioctl(fd,IOCTL_USBFS_SUBMITURB,structusbdevfs_urb*)ioctl(fd,IOCTL_USBFS_REAPURBNDELAY,structusbdevfs_urb*)其中,USBDEVFS_SUBMITURB为发送请求(异步)给usb设备,USBDEVFS_REAPURBNDELAY为读取usb设备返回结果。5.内核的usbfs实现部分(linuxsrc-x.x.xx/drivers/usb/core/devio.c)接收到数据后,转换成内核层使用的urb数据格式,将urb请求放到请求队列里,IOCTL_USBFS_SUBMITURB调用结束。6.这个urb请求数据经由usbcore处理后,交给相应的主机控制器驱动HCD(hostcontroldevicedriver),HCD处理从对应usbendpoint队列上得到urb请求,与实际的usb设备进行交互,结束后填充urb结构体,将数据一层层传递回去,最终到达/dev/usb/BBB/DDD,通过IOCTL_USBFS_REAPURBNDELAY读取到这次请求的结果。以上是使用libusb库进行的一次通用的usb请求传输的过程,一次只发送了一个urb请求,读取了一个urb请求的结果,在usb设备性能较好,进行批量传输需要快速发送、接收大量数据时,此方法效率不高。为此,本专利技术提供了一种Linux系统下提升usb批量传输速度的方法及系统。如图1所示,一种Linux系统下提升usb批量传输速度的方法,该方法包括以下步骤:S1、发送多个urb请求;S2、在structusbdevfs_urb结构体的usercontext填充循环标号;S3、调用接收数据的ioctl函数,接收系统传输的结果数据urb;S4、回传urb的usercontext的循环标号;S5、利用循环标号继续发送多个urb请求。保持系统中的urb请求队列中的urb请求数不变,这样本文档来自技高网
...

【技术保护点】
1.一种Linux系统下提升usb批量传输速度的方法,其特征是,该方法包括以下步骤:/n发送多个urb请求;/n在struct usbdevfs_urb结构体的usercontext填充循环标号;/n调用接收数据的ioctl函数,接收系统传输的结果数据urb;/n回传urb的usercontext的循环标号;/n利用循环标号继续发送多个urb请求。/n

【技术特征摘要】
1.一种Linux系统下提升usb批量传输速度的方法,其特征是,该方法包括以下步骤:
发送多个urb请求;
在structusbdevfs_urb结构体的usercontext填充循环标号;
调用接收数据的ioctl函数,接收系统传输的结果数据urb;
回传urb的usercontext的循环标号;
利用循环标号继续发送多个urb请求。


2.根据权利要求1所述的方法,其特征是,在上述方法中,urb请求队列中的urb请求...

【专利技术属性】
技术研发人员:苗功勋谷涛刘晓萌魏东晓孙强
申请(专利权)人:中孚安全技术有限公司中孚信息股份有限公司北京中孚泰和科技发展股份有限公司南京中孚信息技术有限公司
类型:发明
国别省市:山东;37

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1