linux异步传输支持
基于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异步传输支持的更多相关文章
- Linux配置支持高并发TCP连接(socket最大连接数)
Linux配置支持高并发TCP连接(socket最大连接数) Linux配置支持高并发TCP连接(socket最大连接数)及优化内核参数 2011-08-09 15:20:58| 分类:LNMP&a ...
- GoDaddy Linux主机支持机房的更换
GoDaddy Linux主机支持机房的更换 http://godaddy.idcspy.com/godaddy-change-data-center GoDaddy推出中文界面后,小编发现虚拟主机有 ...
- win10开启 linux Bash命令(win10内置了linux系统支持)
win10开启 Ubuntu linux Bash命令(win10内置了linux系统支持) 第一步: 先在设置→更新和安全→针对开发人员中选择"开发人员模式",点击后会下载&qu ...
- linux syslog支持 ubuntu
linux syslog支持 linux syslog支持 linux syslog支持 ??????? https://wenku.baidu.com/view/8cc6b50a0202074 ...
- arm linux 移植支持 HP打印机
背景 由于业务需要,需要hi3531d主板上加入对于HP打印机的支持. 通过与产品经理,技术主管的沟通:通用支持是不现实的,只要求彩色打印,先不考虑打印机的价格,只要支持一款打印机即可. 注意: Li ...
- 用尽洪荒之力解决Apple Store ipv6审核通关---linux服务器支持ipv6
强势的库克时代到来,苹果开启了强制IPV6审核,大家也知道中国现在的情况,除了教育网实验性的支持IPV6,ISP运营商还不支持,想必大家都陆陆续续的遭受到了苹果无情的拒绝,以前开个加急,审核 ...
- s3c6410 开发板Linux系统支持 K9GAG08U0E的方法
由于NandFlash硬件升级比较快,公司去年一直在使用三星的K9GAG08U0D,现在MLC NandFlash 升级到了第二代,K9GAG08U0D 很快就会处在停产的状态,未雨绸缪,公司选型了K ...
- 让linux(centos)支持中文文件和文件夹
一.让linux支持中文 1.将Linux的env设置了LANG=en_US.UTF-8: 2.本地的Shell客户端编码也设置成UTF-8,这样让在windows上传到linux的文件或者目录不会出 ...
- Linux 查看支持的语言,日期,时间,计算器
1.查看系统目前支持的语言 echo %LANG 2.查看日历 cal 3.查看日期时间 date 4.计算器 bc
随机推荐
- 什么是梯度下降法与delta法则?
梯度下降法就是沿梯度下降的方向求解函数(误差)极小值.delta法则是使用梯度下降法来找到最佳权向量.拿数字识别这个案例为例,训练模型的过程通常是这样的.输入为1万张图片,也就是1万个样本,我们定义为 ...
- SIFT学习笔记之一 下载和调用
下面给出了多个参考地址,挑个能用的吧: vs2010+Rob Hess SIFT: http://blog.csdn.net/lanbing510/article/details/8507341 R ...
- 使用请求包装器RequestWrapper 对博客内容进行编码
1.写一个文章类 代码如下 package model; public class article { private int id; private String title; private St ...
- HanLP-基于HMM-Viterbi的人名识别原理介绍
Hanlp自然语言处理包中的基于HMM-Viterbi处理人名识别的内容大概在年初的有分享过这类的文章,时间稍微久了一点,有点忘记了.看了 baiziyu 分享的这篇比我之前分享的要简单明了的多.下面 ...
- PostgreSQL练习2
列转行CREATE TABLE sdb.t_col_row(id int, c1 varchar(10), c2 varchar(10), c3 varchar(10)) INSERT INTO sd ...
- php实现算法
二分法查找(已排序) @params $arr 查找的数组 $start 开始查找的下标 $end 结束查找的下标 $value 查找的值 function bin_search($arr,$ ...
- NetCore2.x 使用Log4Net(一)
前言:本章仅仅是Log4Net的基本简单的运用,后续章节会按照我的项目使用情况进行深入研究 1.项目搭建 新建一个基于.netCore2.x的Web项目 => 过程略 给新 ...
- js的一些兼容融性问题
1.非行内样式获取 高级浏览器 getComputedStyle(obox.false)//获取所有属性 ie浏览器 box.currentStyle//获取所有属性 兼容写法 function ge ...
- 行内块和文字垂直对齐vertical-agign
vertical-align 垂直对齐 (对于块级元素无效,主要用来控制表单或者图片与文字对齐的) 图片和文字默认是基线对齐 属性: baseline 基线 top 顶线 middle 中线 bott ...
- C++ STL 之 deque容器 打分案例(内含sort排序用法)
#include <iostream> #include <vector> #include <time.h> #include <deque> #in ...