本发明涉及通信传输技术领域,具体地说是一种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请求数不变,这样系统的urb队列中会有多个urb请求,对应的该usb总线上会传输多个我们的usb数据包,一方面提高了总线使用率,使系统尽快与usb设备通信,另一方面,urb请求一次性批量出现在队列中,usb数据包也大批量存在于该usb设备所在总线中,会使得系统和硬件优先处理该usb传输请求,后处理其他usb设备的请求,从而提高该usb设备的传输速度。
如图2所示,本发明实施例还提供了一种linux系统下提升usb批量传输速度的系统,该系统包括请求模块,用于发送urb请求;调用模块,用于调用ioctl函数,得到系统传输的结果数据urb;循环标号模块,用于在structusbdevfs_urb结构体的usercontext填充循环标号。循环标号的取值范围为1-800,此值可根据实际情况进行调整,以能提高到最大传输速度且不影响机器其他usb设备通信为最佳。
以上所述仅是本发明的具体实施方式,使本领域技术人员能够理解或实现本发明。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。