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();

  1. 先到 "/dev/bus/usb/" 目录下查找是否有任意有效文件(非'.'开头的隐藏文件), 如果有的话, 则 usbfs_path 为 "/dev/bus/usb"
  2. 如果没有的话, 就到 "/proc/bus/usb" 下寻找. 如果找到, 则 usbfs_path 为 "/proc/bus/usb"
  3. 如果还没有找到, 则查找 /dev/ 下的 /dev/usbdev%d.%d 格式的文件. 如果找到的话, 则 usbfs_path 为 "/dev" . 这种情况比较特殊, 会置标志 usbdev_names = 1;
  4. 如果还没找到的话, 就没办法了. 返回错误.

比较内核版本

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 源码阅读的更多相关文章

  1. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  2. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  3. 【原】FMDB源码阅读(一)

    [原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...

  4. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

  5. 【原】AFNetworking源码阅读(五)

    [原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...

  6. 【原】AFNetworking源码阅读(四)

    [原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...

  7. 【原】AFNetworking源码阅读(三)

    [原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...

  8. 【原】AFNetworking源码阅读(二)

    [原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...

  9. 【原】AFNetworking源码阅读(一)

    [原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...

随机推荐

  1. I/O输入系统

    I/O输入系统 计算机有两个主要任务:I/O操作与计算处理.在许多情况下,主要任务是I/O操作.而计算处理只是附带的. 操作系统在计算机I/O方面的作用是管理和控制I/O操作和I/O设备. 概述 对与 ...

  2. 【原】缓存之 HttpRuntime.Cache

    1.HttpRuntime.Cache HttpRuntime.Cache 相当于就是一个缓存具体实现类,这个类虽然被放在了 System.Web 命名空间下了.但是非 Web 应用也是可以拿来用的. ...

  3. iRule Event Order - HTTPSv7

    v

  4. SPOJ CIRU The area of the union of circles ——Simpson积分

    [题目分析] 圆的面积并. 直接Simpson积分,(但是有计算几何的解法,留着flag). simpson积分,如果圆出现了不连续的情况,是很容易出事情的.(脑补一下) 但是没有什么办法,本来就是一 ...

  5. 拯救小矮人(codevs 2544)

    题目描述 Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个 ...

  6. 填报志愿(codevs 2930)

    题目描述 Description 高考已经结束,而志愿填报正在进行中- 吴校长的学校里有n位同学,每位同学有ki个愿意去的大学.而在吴老师的省份中,有m所大学有招生名额.根据往年的经验,对于每所大学( ...

  7. idea tomcat 配置

    昨天我们讲了如何新建多模块项目:idea创建maven多模块项目 本节课,我们讲如何配置tomcat,使昨天配置的web项目,JRapid.Admin可以运行起来.具体步骤如下 第一步 第二步 第三步 ...

  8. centos6.5编译安装gearmand Job Server(C)

    1)下载安装包: wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz 2)安装编译器: yu ...

  9. 关于ios异步加载图片的几个开源项目

    一.HjCache  原文:http://www.markj.net/hjcache-iphone-image-cache/ 获取 HJCache: HJCache is up on github h ...

  10. Credit Memo和Debit Memo在AR以及AP中的概念比较

    AR和AP中都有Credit Memo和Debit Memo的概念, 但是其含义和用法完全不一样,比较难懂,现在整理如下:AR中的CreditMemo和DebitMemo是和客户打交道:AR中的Cre ...