基于libusbx-1.0.18-rc1,libusbx现已重新merage到libusb。
1. 初始化
使用libusb_init初始化libusb,如果是单设备通信,ctx参数可以传NULL,表示使用默认Context.
2. 注册hotplug事件侦听
从1.0.16开始,libusb支持hotplug事件侦听,可以使用接口libusb_hotplug_register_callback注册基于以下几种filter的回调函数:
libusb_hotplug_event: 分LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED和 LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT俩种;
vendor_id:只有指定的vendor id匹配的设备能够触发回调,或设置LIBUSB_HOTPLUG_MATCH_ANY,使得任意vendor id的设备都能触发回调;
product_id:只有指定的product id匹配的设备能够触发回调,或设置LIBUSB_HOTPLUG_MATCH_ANY,使得任意product id的设备都能触发回调;
dev_class:只有指定的device class匹配的设备能够触发回调,或设置LIBUSB_HOTPLUG_MATCH_ANY,使得任意device class的设备都能触发回调。
这几种filter之间可以以“与”的方式组合一起发生作用。
3. 获取file descriptors
使用libusb_get_pollfds可以取得当前context的fd列表,之后可以将这些fd放到main events loop中进行poll操作。可以参考《基于glib的单线程多事件源处理》这篇文章,使用GSource来实现。一旦检测到有事件发生,要使用libusb_handle_events_completed,触发后面提到的事件处理函数。还需要使用libusb_set_pollfd_notifiers注册俩个回调函数,用来处理设备接入或移除后,fd列表发生的变化。
4. 设备接入
设备接入后,会触发libusb_set_pollfd_notifiers注册的回调函数,通知应用程序有新增的fd,这时需要将新增的fd添加到poll的队列中。同时,libusb还会触发libusb_hotplug_register_callback注册的回调函数,通知应用程序有设备接入。在hotplug的回调函数中,需要基于传入的libusb_device,调用libusb_open接口,创建一个基于此设备的handle。之后根据需要,使用libusb_reset_device重置此设备。对于一些linux标准支持的设备(如HID设备),可能需要使用libusb_detach_kernel_driver,或libusb_set_auto_detach_kernel_driver,将kernel提供的驱动卸载掉,否则会与libusb的通信产生冲突。对于支持多configuration的设备,还需要使用libusb_set_configuration,选择要使用的configuration number。之后,调用libusb_claim_interface,选择要使用的interface。
5. 建立通信
调用libusb_alloc_transfer创建一个空的transfer数据结构,使用libusb_fill_interrupt_transfer填充这个数据结构,参数包括:通信基于的endpoint number,数据到达的buffer及大小,数据到达后的回调函数等。之后调用libusb_submit_transfer,将这个transfer提交给libusb侦听数据到达事件。
6. 数据到达
数据到达后,会触发回调函数,传入之前的transfer数据结构。首先要判断transfer中的status字段是否是LIBUSB_TRANSFER_COMPLETED,否则执行相应的异常处理。对于传输完成的数据,可以到transfer中的buffer字段获取,数据的长度使用actual_length表示。处理完成后,要使用libusb_submit_transfer重新提交这个transfer。
到此,基于libusb的异步通信建立完毕,libusb异步通信对于同步通信来说有更好的性能,且不需要多线程支持,程序执行的时序可以得到更好的控制。
————————————————
版权声明:本文为CSDN博主「coroutines」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/coroutines/article/details/38436725

linux异步传输支持的更多相关文章

  1. Linux配置支持高并发TCP连接(socket最大连接数)

    Linux配置支持高并发TCP连接(socket最大连接数) Linux配置支持高并发TCP连接(socket最大连接数)及优化内核参数 2011-08-09 15:20:58|  分类:LNMP&a ...

  2. GoDaddy Linux主机支持机房的更换

    GoDaddy Linux主机支持机房的更换 http://godaddy.idcspy.com/godaddy-change-data-center GoDaddy推出中文界面后,小编发现虚拟主机有 ...

  3. win10开启 linux Bash命令(win10内置了linux系统支持)

    win10开启 Ubuntu linux Bash命令(win10内置了linux系统支持) 第一步: 先在设置→更新和安全→针对开发人员中选择"开发人员模式",点击后会下载&qu ...

  4. linux syslog支持 ubuntu

    linux  syslog支持 linux  syslog支持 linux  syslog支持 ??????? https://wenku.baidu.com/view/8cc6b50a0202074 ...

  5. arm linux 移植支持 HP打印机

    背景 由于业务需要,需要hi3531d主板上加入对于HP打印机的支持. 通过与产品经理,技术主管的沟通:通用支持是不现实的,只要求彩色打印,先不考虑打印机的价格,只要支持一款打印机即可. 注意: Li ...

  6. 用尽洪荒之力解决Apple Store ipv6审核通关---linux服务器支持ipv6

         强势的库克时代到来,苹果开启了强制IPV6审核,大家也知道中国现在的情况,除了教育网实验性的支持IPV6,ISP运营商还不支持,想必大家都陆陆续续的遭受到了苹果无情的拒绝,以前开个加急,审核 ...

  7. s3c6410 开发板Linux系统支持 K9GAG08U0E的方法

    由于NandFlash硬件升级比较快,公司去年一直在使用三星的K9GAG08U0D,现在MLC NandFlash 升级到了第二代,K9GAG08U0D 很快就会处在停产的状态,未雨绸缪,公司选型了K ...

  8. 让linux(centos)支持中文文件和文件夹

    一.让linux支持中文 1.将Linux的env设置了LANG=en_US.UTF-8: 2.本地的Shell客户端编码也设置成UTF-8,这样让在windows上传到linux的文件或者目录不会出 ...

  9. Linux 查看支持的语言,日期,时间,计算器

    1.查看系统目前支持的语言 echo %LANG 2.查看日历 cal 3.查看日期时间 date 4.计算器 bc

随机推荐

  1. python3 正则表达式 re模块之辣眼睛 计算器

    额...学到几个常用模块了,也要其中考试了,每天晚上敲一点,敲得脑壳疼,不过又想到好一点的办法了,有时间再改吧. 此非吾所欲也,实属无奈也....复习之路漫漫,吾将到书上求索,在此不多逗留,我挥一挥衣 ...

  2. Android之makefile

    在Android的源代码中,随处可见Makefile,那么Makefile到底是用来干嘛的呢?其实Makefile和Maven.ANT.Gradle一样,属于构建工具,当项目比较庞大的时候,就可以使用 ...

  3. JavaScript 真值和假值

    常见的假值有 值 说明 var a=false;  值为假 var a =0;  值为0 var a='';  值为空 var a=10/'abc' 算式错误 var a; 未赋值变量 常见的真值有 ...

  4. new , delete常见用法和与malloc,free比较

    new/delete是C++的运算符.malloc与free是C++/C语言的标准库函数,new/delete只能在C++中使用,malloc与free在C与C++中都能够使用,它们都可用于申请动态内 ...

  5. appium+python教程1

    Python3+Appium安装使用教程 一.安装 我们知道selenium是桌面浏览器自动化操作工具(Web Browser Automation) appium是继承selenium自动化思想旨在 ...

  6. IDEA配置之tomcat相关配置

    1. tomcat起服务时, 日志乱码 -server -XX:PermSize=512M -XX:MaxPermSize=1024m -Dfile.encoding=UTF-8 设置tomcat参数

  7. 剑指offer21:第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。(注意:这两个序列的长度是相等的)

    1 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是 ...

  8. centos7 宝塔php7安装mongodb扩展

    一.下载.解压源码 下载地址:https://pecl.php.net/package/mongodb wget -c https://pecl.php.net/get/mongodb-1.5.3.t ...

  9. php源码安装执行configure报错error: off_t undefined; check your library configuration

    php安装执行configure报错error: off_t undefined; check your library configuration vim /etc/ld.so.conf 添加如下几 ...

  10. python学习-4 python基础-2 条件语句(if的简单用法1)

    条件语句的原理: 2.举个例子:比大小 #!/usr/bin/env python # -*- coding:utf8 -*- a=input("请输入a:") b=input(& ...