libusb 源码阅读
libusb_init(NULL), 如果传入一个NULL, 则libusb 内部会有一个 usbi_default_context 变量在内部保存上下文. 这样以后调用 libusb 函数时可以不指定 context, libusb 使用默认的内部变量.
详见 USBI_GET_CONTEXT(ctx);
usbi_backend->init --> op_init
查找 usbfs 根目录
usbfs_path = find_usbfs_path();
- 先到 "/dev/bus/usb/" 目录下查找是否有任意有效文件(非'.'开头的隐藏文件), 如果有的话, 则 usbfs_path 为 "/dev/bus/usb"
- 如果没有的话, 就到 "/proc/bus/usb" 下寻找. 如果找到, 则 usbfs_path 为 "/proc/bus/usb"
- 如果还没有找到, 则查找 /dev/ 下的 /dev/usbdev%d.%d 格式的文件. 如果找到的话, 则 usbfs_path 为 "/dev" . 这种情况比较特殊, 会置标志 usbdev_names = 1;
- 如果还没找到的话, 就没办法了. 返回错误.
比较内核版本
libusb 里有个函数 kernel_version_ge(2,6,32), 使用 uname() 系统调用来获取当前运行内核版本信息.
sysfs 里的 USB 信息
遍历 "/sys/bus/usb/devices" , 找 usb 开头的目录. 这个目录表示总线. 查找其下是否有 busnum, devnum, descriptor, bConfigurationValue 等文件, 以判断其能力.
如果 /sys 下的信息完整, 则以后就可以直接从 /sys 下读到 USB 的信息. 否则就要到上面查找出的 usbfs 里读.
libusb 里的代码这样写, 看来整个 USB 的趋势还是倾向于到 /sys/ 下获取信息.
usbi_io_init(ctx)
pipe() 创建了两个管道 ctx->ctrl_pipe[2], 并把读管道加入到 poll 监听列表里.
cnt = libusb_get_device_list(NULL, &devs);
查找设备数量. 实现中是去查找 /sys/bus/devices/ 下的目录, 条件是: 非数字开头 && "usb" 字符开头 && 名字没有':' , 其下的 busnum 和 devnum 就是总线号和设备号
每个设备用 libusb_device 结构表示, 唯一标志符是 session_id, session_id = busnum << 8 | devaddr;
struct libusb_device {
/* lock protects refcnt, everything else is finalized at initialization
* time */
usbi_mutex_t lock;
int refcnt;
struct libusb_context *ctx;
uint8_t bus_number;
uint8_t device_address;
uint8_t num_configurations;
enum libusb_speed speed;
struct list_head list;
unsigned long session_data;
unsigned char os_priv[0];
};
最后的 os_priv 会使用 initialize_device() 分配一片操作系统相关的空间给它, 以存储设备路径等信息, 在linux 下为:
struct linux_device_priv {
char *sysfs_dir;
unsigned char *dev_descriptor;
unsigned char *config_descriptor;
};
int libusb_get_device_descriptor(libusb_device *dev, struct libusb_device_descriptor *desc);
libusb_device *dev 中有所有该设备在 /sys 下的文件路径信息, 那么此函数就会读该路径下的 "descriptors" 文件, 该文件是 USB 设备描述符, 其中就存储了 vendor, producdt 等信息.
同步IO
控制传输, 块传输, 中断传输
int libusb_control_transfer (libusb_device_handle *dev_handle, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char *data, uint16_t wLength, unsigned int timeout)
Perform a USB control transfer.
int libusb_bulk_transfer (struct libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int *transferred, unsigned int timeout)
Perform a USB bulk transfer.
int libusb_interrupt_transfer (struct libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int *transferred, unsigned int timeout)
Perform a USB interrupt transfer.
异步IO
libusb 源码阅读的更多相关文章
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- 【原】FMDB源码阅读(一)
[原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
- 【原】AFNetworking源码阅读(五)
[原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...
- 【原】AFNetworking源码阅读(四)
[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...
- 【原】AFNetworking源码阅读(三)
[原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...
- 【原】AFNetworking源码阅读(二)
[原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...
- 【原】AFNetworking源码阅读(一)
[原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...
随机推荐
- Chrome 开发者工具(DevTools)中所有快捷方式列表(已整理)
Chrome 开发者工具(DevTools)中所有快捷方式列表(已整理) 前言 Chrome DevTools提供了一些内置的快捷键,开发者利用这些快捷键可以节省常工作中很多日的开发时间.下面列出了每 ...
- numpy split()
numpy.split(ary, indices_or_sections, axis=0)[source] Split an array into multiple sub-arrays. 将一个ar ...
- JavaScript onload
The onload event occurs immediately after a page or an image is loaded.onload事件当一个页面或是一张图片加载完成时被触发. ...
- Web开发细节搜集
App_Data 百度百科: App_Data文件夹应该包含应用程序的本地数据存储.它通常以文件(诸如Microsoft Access或Microsoft SQL Server Express数据库 ...
- HDU-1829 A Bug's Life。并查集构造,与POJ1709异曲同工!
A Bug's Life Find them, Catch them 都是并查集构造的题,不久前 ...
- rabbitmq php扩展amqp安装
configure: error: Please reinstall the librabbitmq distribution itself or (re)install librabbitmq de ...
- iOS学习笔记05-触摸事件
一.事件分发处理[由外到内] 在iOS中发生触摸后,事件会加到UIApplication事件队列,UIApplication会从事件队列取出最前面的事件进行分发处理,通常会先分发给主窗口,主窗口会调用 ...
- 刷题总结——瞭望塔(bzoj1038)
题目: Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线 ...
- spring之Annotation
spring除了提供了@Autowired,还提供了以下几类annotation. 1.@Component, @Repository, @Service, @Controller @Reposito ...
- bzoj2748 [HAOI2012]音量调节 背包
Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改 ...