lib异步中断
基于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异步通信对于同步通信来说有更好的性能,且不需要多线程支持,程序执行的时序可以得到更好的控制。
原文链接:https://blog.csdn.net/coroutines/article/details/38436725
lib异步中断的更多相关文章
- Intel 80x86 Linux Kernel Interrupt(中断)、Interrupt Priority、Interrupt nesting、Prohibit Things Whthin CPU In The Interrupt Off State
目录 . 引言 . Linux 中断的概念 . 中断处理流程 . Linux 中断相关的源代码分析 . Linux 硬件中断 . Linux 软中断 . 中断优先级 . CPU在关中断状态下编程要注意 ...
- linux中断与异常
看了<深入理解linux内核>的中断与异常,简单总结了下,如果有错误,望指正! 一 什么是中断和异常 异常又叫同步中断,是当指令执行时由cpu控制单元产生的,之所以称之为异常,是因为只有在 ...
- Linux 内核中断内幕
转自:http://www.ibm.com/developerworks/cn/linux/l-cn-linuxkernelint/index.html#resources Linux 内核中断内幕 ...
- l中断的实现
转自:http://blog.chinaunix.net/uid-25014876-id-90740.html xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- linux设备驱动归纳总结(六):3.中断的上半部和下半部——tasklet【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-100005.html linux设备驱动归纳总结(六):3.中断的上半部和下半部——tasklet x ...
- linux设备驱动归纳总结(六):1.中断的实现【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-90740.html linux设备驱动归纳总结(六):1.中断的实现 xxxxxxxxxxxxxxxx ...
- linux中断的上半部和下半部 【转】
转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=24690947&id=3491821 一.什么是下半部 中断是一 ...
- Linux驱动设计—— 中断与时钟
中断和时钟技术可以提升驱动程序的效率 中断 中断在Linux中的实现 通常情况下,一个驱动程序只需要申请中断,并添加中断处理函数就可以了,中断的到达和中断函数的调用都是内核实现框架完成的.所以程序员只 ...
- 软中断与硬中断 & 中断抢占 中断嵌套
参考了这篇文章:http://blog.csdn.net/zhangskd/article/details/21992933 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通 ...
随机推荐
- sha256算法原理
1. SHA256简介 SHA256是SHA-2下细分出的一种算法 SHA-2下又可再分为六个不同的算法标准 包括了:SHA-224.SHA-256.SHA-384.SHA-512.SHA-512/2 ...
- mysql数据库之联表查询
表准备: 这次我们用到5张表: class表: student表: score表: course表: teacher表: 表结构模型: 我们针对以下需求分析联表查询: 1.查询所有的课程的名称以及对应 ...
- 常用小功能js函数-函数防抖
函数防抖:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时.这个我经常用到/** * 函数防抖 * fun 需要延时执行的函数 * delayTime 延时时间 * **/export ...
- 小记--------spark的worker原理分析及源码分析
- ZooKeeper的安装及部署
Zookeeper的安装部署 2.1 Zookeeper的安装 Zookeeper安装前需要安装好 JDK.配置好环境变量. 下载:zookeeper-3.4.5-cdh5.7.0.tar.gz 解压 ...
- FFmpeg4.0笔记:封装ffmpeg的解封装功能类CDemux
Github https://github.com/gongluck/FFmpeg4.0-study/tree/master/Cff CDemux.h /*********************** ...
- php exec执行不等待返回结果
windows中:pclose(popen("start php.exe test.php","r"));lnuix中: pclose(popen(" ...
- Centos yum 安装 rabbitmq-server
安装rabbitmq-server yum install -y rabbitmq-server 开启后台管理 rabbitmq-plugins enable rabbitmq_managemen ...
- java:线上问题排查常用手段(转)
出处:java:线上问题排查常用手段 一.jmap找出占用内存较大的实例 先给个示例代码: import java.util.ArrayList; import java.util.List; imp ...
- Win32汇编过程与宏调用
汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地 ...