本发明涉及通信传输技术领域,具体地说是一种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设备通信为最佳。

以上所述仅是本发明的具体实施方式,使本领域技术人员能够理解或实现本发明。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

linux usb 批量传输文件,一种Linux系统下提升usb批量传输速度的方法及系统与流程...相关推荐

  1. linux判断usb进程命令,一种在Linux系统下审计USB设备历史使用情况的方法与流程...

    本发明涉及计算机审计技术领域,具体涉及一种在Linux系统下审计USB设备历史使用情况的方法. 背景技术: 如今,在linux系统中,对于USB设备的插入拔出事件,系统自身是不带有审计功能的,这使得普 ...

  2. windows远程android传输文件,电脑(Linux/Windows)使用SSH远程登录安卓(Android)手机实现无线传输和管理文件(图文详解)-Go语言中文社区...

    电脑(Linux/Windows系统)使用SSH远程登录安卓(Android)手机实现无线传输和管理文件(图文详解) 温馨提示 本文只针对安卓(Android)手机!iPhone或者WP的手机用户,请 ...

  3. linux上删除文件过慢,Linux上删除大量文件几种方式对比

    Linux上删除大量文件几种方式对比 linux上删除大量小文件删除测试:删除500000个小文件测试 生成文件: $ for i in $(seq 500000);do echo 'text' &g ...

  4. linux系统查看usb口,Linux运维知识之Linux系统下查看USB设备名及使用USB设备

    本文主要向大家介绍了Linux运维知识之Linux系统下查看USB设备名及使用USB设备,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 1.系统插入USB设备后,从控制台界面有 ...

  5. linux 无线网卡 免驱动,Linux系统下安装USB无线网卡驱动方法

    Linux系统下安装USB无线网卡驱动方法 具体安装过程分了如下步骤进行:确认 usb-wifi 设施型号 , 根据确认结果选择驱动信息. 安装驱动 mt7601u , 假如已经自带跳过此步骤 配置驱 ...

  6. linux系统安装内存测试,一种Linux系统下基于IDK内存注错的测试方法及系统与流程...

    本发明涉及计算机服务器的 技术领域: :,具体涉及到一种Linux系统下基于IDK内存注错的测试方法及系统. 背景技术: ::在服务器领域中,内存是服务器中重要的部件之一,它是与CPU进行沟通的桥梁. ...

  7. linux中打开pdf文件_在Linux中减少PDF文件大小

    linux中打开pdf文件 In our Linux system, If we have a large PDF file, we may want to reduce it's size. We ...

  8. Linux下添加计划任务,Linux系统下使用crontab添加计划任务的方法

     在服务器中添加定期执行的任务,在很多情况下是非常必要的.比如,每天清理一次/tmp目录下的文件;没几分钟检查某一守护进程是否正常等等.这样计划任务就显得尤为方便.下面将介绍如何在Linux系统中 ...

  9. linux系统可以用迅雷吗,在Linux系统下使用wine运行迅雷5的方法

    在Linux系统下使用wine运行迅雷5的方法 一.下载ies4linux 去 http://www.tatanka.com.br/ies4linux/page/Installation 下载ies4 ...

最新文章

  1. 15个初学者必看的基础SQL查询语句
  2. Matlab绘制包含双Y轴的图
  3. Python中list复制引发的问题
  4. Matlab练习:timer(定时器3)
  5. 有用的mysql语句
  6. Spring Boot整合MyBatis
  7. libpcre.so.1 cannot be found
  8. hdu 1162(最小生成树kruskal)
  9. 【java】之常用四大线程池用法以及ThreadPoolExecutor详解
  10. 分析 AlphaGo 算法原理的本质
  11. 设计院中心所工作流程 CAD广播电视工程工艺绘图
  12. oppoJava面试!一招彻底帮你搞定HashMap源码,极其重要
  13. 文件 或者 图片 与 base64 之间的转换
  14. python镜像安装re模块_Python模块之re模块
  15. 使用贝塞尔曲线制作网页手鼓猫
  16. [趣味文学]“帅气”的莎士比亚
  17. javaweb项目运转流程
  18. Markdown写接口文档,自动添加TOC
  19. lt;=gt;与lt;gt;的区别
  20. Python爬虫实战(3):安居客房产经纪人信息采集

热门文章

  1. 由于找不到VCRUNTIME140D.dll,无法继续执行代码
  2. 小学数学解题思维窍门
  3. matlab多项式计算题目,MATLAB数据分析与多项式计算-习题答案
  4. 中国商贸物流行业运行状况分析及投资规模预测报告2021-2027年
  5. 微课竞赛系统的设计与实现所需工作条件_启升微课丨如何准备医疗器械软件开发计划...
  6. 按键触发快捷怼人小工具(怼人必备良药)
  7. Windows10 微软拼音 翻页按键 设置
  8. 509实验室打印机双面打印的方法
  9. 支持邮件群发功能的邮箱有哪些?邮箱如何群发邮件,邮件群发怎么发呢?
  10. base64编码解码器【C++】