libusb开发者指南(转)

源:libusb开发者指南

译者: gashero

作者: Johannes Erdfelt

日期: 2010-04-17

地址: http://libusb.sourceforge.net/doc/

目录

1   介绍

  • 1.1   概览
  • 1.2   当前OS支持
  • 2   API

    • 2.1   设备与接口
    • 2.2   超时
    • 2.3   数据类型
    • 2.4   同步
    • 2.5   返回值
  • 3   函数
    • 3.1   核心函数
    • 3.2   设备操作
    • 3.3   控制传输
    • 3.4   块传输
    • 3.5   中断传输
    • 3.6   不可移植
  • 4   例子
    • 4.1   简单例子
    • 4.2   源码包的例子
    • 4.3   其他应用

本文档描述libusb的API,以及如何开发USB应用。

1   介绍

1.1   概览

本文档描述libusb-0.1的API和USB相关内容。

1.2   当前OS支持

Linux 2.2或以上

FreeBSD/NetBSD/OpenBSD

Darwin/MacOSX

2   API

2.1   设备与接口

一个设备可能有多个接口,所以一个句柄可以返回多个接口实例。不要忘记调用 usb_claim_interface() 。

2.2   超时

总是以毫秒为单位。

2.3   数据类型

同时使用有抽象结构和非抽象结构来保持可移植性。

2.4   同步

所有libusb v0.1的函数都是同步的,这意味着操作完成或超时前不会返回。异步操作从libusb v1.0开始支持。

2.5   返回值

libusb v0.1有两种返回值。一种是 usb_open() 返回的句柄,另一种是整数int,返回负数表示错误。

3   函数

3.1   核心函数

void usb_init(void);

初始化libusb。

int usb_find_busses(void);

查找所有总线,返回上次调用以后改变的数量(包括新增的和移除的总线)。

int usb_find_devices(void);

寻找每个总线上的所有设备。应该在 usb_find_busses() 之后调用。返回上次调用后改变的数量(包括新增和移除的设备)。

struct usb_bus *usb_get_busses(void);

简单的返回全局变量 usb_busses 。这仅对支持C调用规范和可以使用共享库的语言,但是不支持C全局变量的(例如Delphi)。

3.2   设备操作

这组函数用于操作设备。允许你打开关闭设备,设置配置、轮换设置、干净的关闭和重置设备。它也提供OS级别的操作,如认领(claim)和释放接 口。

usb_dev_handle *usb_open(struct *usb_device dev);

打开设备以供使用,返回设备句柄。

int usb_close(usb_dev_handle *dev);

关闭设备,返回0成功,负数失败。

int usb_set_configuration(usb_dev_handle *dev, int configuration);

设置活跃配置。configuration参数是描述符bConfigurationValue字段的值。返回0成功,负数失败。

int usb_set_altinterface(usb_dev_handle *dev, int alternate);

设置当前接口的活跃轮换设置。alternate参数是描述符bAlternateSetting字段的值。返回0成功,负数失败。

int usb_resetep(usb_dev_handle *dev, unsigned int ep);

重置指定端点的所有状态。ep参数是描述符的bEndpointAddress字段的值。返回0称公,负数失败。

该接口不建议使用,你可能需要的是 usb_clear_halt() 。

int usb_clear_halt(usb_dev_handle *dev, unsigned int ep);

清理端点所有停止状态,ep是描述符bEndpointAddress字段的值。返回0成功,负数失败。

int usb_reset(usb_dev_handle *dev);

重置指定设备,通过发送RESET指令过去。返回0成功,负数失败。

在执行该函数之后,需要重新列举,找到设备。当前的句柄无法再工作了。

int usb_claim_interface(usb_dev_handle *dev, int interface);

通过OS认领一个接口。interface参数是描述符的bInterfaceNumber字段。返回0成功,负数失败。

必须在任何接口相关操作(如 usb_set_altinterface() 、 usb_bulk_write() 等)之前调用。

返回码:

1 = EBUSY :接口无效,无法被认领

2 = ENOMEM :内存不足

int usb_release_interface(usb_dev_handle *dev, int interface);

释放之前认领的接口。interface参数是描述符的bInterfaceNumber字段。返回0成功,负数失败。

3.3   控制传输

发送消息到缺省控制管道。

int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, int value, int index, char*bytes, int size, int timeout);

发送控制请求到设备的缺省控制管道。参数对应USB规范中的同名类型。返回读写字节数,负数失败。

int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf, size_t buflen);

获取设备的字符串描述,通过index和langdi索引。返回Unicode字符串到buf中。返回实际写入buf的字节数,负数失败。

int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf, size_t buflen);

包装了 usb_get_string() 函数,返回第一种语言指定index索引的字符串描述,并转换到C风格的ASCII。返回写入buf字节数,负数失败。

int usb_get_descriptor(usb_dev_handle *dev, unsigned char type, unsigned char index, void *buf, intsize);

获取设备缺省控制管道的描述符,通过type和index索引。返回实际写入buf的字节数,负数失败。

参考 usb_get_descriptor_by_endpoint() 了解允许指定控制端点的。

int usb_get_descriptor_by_endpoint(usb_dev_handle *dev, int ep, unsigned char type, unsigned charindex, void *buf, int size);

从设备获取描述符,以type和index索引,以ep标志的控制管道。返回读取字节数,负数失败。

3.4   块传输

这部分允许应用从数据块管道发送和接收数据。

int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);

写入一块数据到端点ep,返回写入成功字节数,负数失败。

int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);

读取一块数据,从端点ep,返回读取成功字节数,负数失败。

3.5   中断传输

这组函数允许应用发送和接收数据通过中断管道。

int usb_interrupt_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);

执行对端点ep的中断写入,返回实际写入字节数,负数失败。

int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);

执行对中断端点ep的读取,返回实际读取字节数,负数失败。

3.6   不可移植

这些函数是不可移植的。有些是暴露了OS USB API之类的。他们都回加上函数名后缀 _np 。

一个C预处理器宏会定义实现的函数。形式是 LIBUSB_HAS_ 加上函数名,没有 usb_ 前缀。例如,usb_get_driver_np() 实现了,就会定义 LIBUSB_HAS_GET_DRIVER_NP 。

int usb_get_driver_np(usb_dev_handle *dev, int interface, char *name, int namelen);

这个函数获取接口驱动的名字。成功返回0,失败负数。

只在Linux有实现。

int usb_detach_kernel_driver_np(usb_dev_handle *dev, int interface);

这个函数从接口剥离内核驱动。使用了libusb的应用可以随即重新认领接口。返回0成功,负数失败。

只在Linux有实现。

4   例子

4.1   简单例子

与设备通信前要先找到它。需要先找到所有总线(busses),然后找到所有设备:

struct usb_bus *busses;

usb_init();
usb_find_busses();
usb_find_devices();

busses=usb_get_busses();

//在这之后,应用应该手动轮询所有总线和设备,匹配其所要的:
struct usb_bus *bus;
int c,i,a;

for (bus=busses; bus; bus=bus->next) {
    struct usb_device *dev;
    for (dev=bus->devices; dev; dev=dev->next) {
        if (dev->descriptor.bDeviceClass==7) {
            /*打开设备,认领接口,然后操作*/
        }
        /*循环遍历所有配置*/
        for (c=0; c< dev->descriptor.bNumConfigurations; c++) {
            /*循环遍历所有接口*/
            for (i=0; i< dev->config[c].bNumInterfaces; i++) {
                /*循环遍历所有轮换设置*/
                for (a=0; a< dev->config[c].interface[i].num_altsetting; a++) {
                    /*检查接口是否是打印机*/
                    if (dev->config[c].interface[i].altsetting[a].bInterfaceClass==7) {
                        /*打开设备,设置轮换配置,认领接口,然后操作*/
                    }
                }
            }
        }
    }
}

4.2   源码包的例子

tests目录有个程序叫 testlibusb.c 。它简单的调用libusb寻找所有设备,然后遍历并打印描述符。其结果很简单,不过用处有限。倒是可以作为很好的入门。

4.3   其他应用

其他应用就参考其他的项目吧:

  1. gPhoto :使用libusb与相机通信
  2. rio500 :使用libusb与SONICblue Rio 500播放器
时间: 2024-08-16 02:53:37

libusb开发者指南(转)的相关文章

libusb 开发者指南-牛胜超(转)

源:libusb 开发者指南 libusb Developers Guidelibusb 开发者指南 原作者:Johannes Erdfelt翻译者:牛胜超 Table of Contents目录 Preface序言 I. Introduction            引言   1. Overview      概述   2. Current OS support      流行的操作系统支持 II. API                         应用程序接口   3. Device

GOOGLE PROTOBUF开发者指南

ProtoBuf开发者指南 译者: gashero 目录 1   概览 1.1   什么是protocol buffer 1.2   他们如何工作 1.3   为什么不用XML? 1.4   听起来像是为我的解决方案,如何开始? 1.5   一点历史 2   语言指导 2.1   定义一个消息类型 2.2   值类型 2.3   可选字段与缺省值 2.4   枚举 2.5   使用其他消息类型 2.6   嵌套类型 2.7   更新一个数据类型 2.8   扩展 2.9   包 2.10   定

Protocol Buffers(Protobuf)开发者指南---概览

Protocol Buffers(Protobuf)开发者指南---概览 欢迎来到protocol buffers的开发者指南文档,protocol buffers是一个与编程语言无关‘.系统平台无关.可扩展的结构化数据序列化/反序列化工具,适用于通讯协议,数据存储等场合. ps:为了方便拼写,下文的protobuf就是指protocol buffers. 本文档的面向读者是:希望使用protobuf的 Java.C++.Python的开发者.此概览将向您介绍如何开始使用protobuf,然后您

[译]AngularJS 1.3.0 开发者指南(一) -- 介绍 (转)

http://www.cnblogs.com/lzj0616/p/6440563.html [译]AngularJS 1.3.0 开发者指南(一) -- 介绍 Angular是什么 ? AngularJS是一款针对动态web应用的结构框架. 它可以让像使用模板语言使用HTML, 并且可以扩展HTML的语法来明确简洁的表示应用组件. Angular的数据绑定机制和依赖注入机制排除了许多原本你不得不写的代码. 它作用于浏览端, 使得它成为任何服务端技术的良好伙伴. Angular是为了弥补HTML在

Android开发者指南(9) —— ProGuard

转: 前言 本章内容为开发者指南(Dev Guide)/Developing/Tools/ProGuard,本章内容为"混淆器",版本为Android3.0 r1,翻译来自:"Jim",欢迎与他交流:"[email protected]",再次感谢"Jim" !期待你一起参与翻译Android的相关资料,联系我[email protected]. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnbl

ProtoBuf开发者指南

目录 1   概览 1.1   什么是protocol buffer 1.2   他们如何工作 1.3   为什么不用XML? 1.4   听起来像是为我的解决方案,如何开始? 1.5   一点历史 2   语言指导 2.1   定义一个消息类型 2.2   值类型 2.3   可选字段与缺省值 2.4   枚举 2.5   使用其他消息类型 2.6   嵌套类型 2.7   更新一个数据类型 2.8   扩展 2.9   包 2.10   定义服务 2.11   选项 2.12   生成你的类

微软发布的Win10开发者指南视频

如果你是一名开发者,建议你留意下微软今天推出的系列视频,名称是Win10开发者指南,总长6个小时,多达22章内容,介绍非常广泛.事实上,即使你是编程新手或仅有兴趣,也值得一看. 开发者Jerry Nixon和Andy Wigley是主持人,展示了渊博的知识和轻松的风趣幽默. 随着Windows10正式版越来越近,几乎可以肯定的是,其他平台的开发人员也会涌入.因此Win10开发者指南会让这些开发者尽快熟悉Windows10系统,更加轻松实现移植.作为微软虚拟学院的一部分,允许开发人员浏览各种技术文

dubbo开发者指南

开发者指南 参与 流程 任务 版本管理 源码构建 框架设计 整体设计 模块分包 依赖关系 调用链 暴露服务时序 引用服务时序 领域模型 基本原则 扩展点加载 扩展点配置 扩展点自动包装 扩展点自动装配 扩展点自适应 扩展点自动激活 实现细节 初始化过程细节 远程调用细节 远程通讯细节 SPI参考手册 协议扩展 调用拦截扩展 引用监听扩展 暴露监听扩展 集群扩展 路由扩展 负载均衡扩展 合并结果扩展 注册中心扩展 监控中心扩展 扩展点加载扩展 动态代理扩展 编译器扩展 消息派发扩展 线程池扩展 序

Flume 开发者指南V1.5.2

介绍 概述 Apache Flume是一个用来从很多不同的源有效地收集,聚集和移动大量的日志数据到一个中心数据仓库的分布式的,可靠的和可用的系统. Apache Flume是Apache软件基金会的顶级项目.目前有两个可获得的发布代码路线,0.9.x版本和1.x版本.本文档适用于1.x代码线.对于0.9.x代码线,请看Flume 0.9.x开发指南. 结构 数据流模型 一个Event是在Flume代理之间流动的数据单元.Event从Source流动到Channel再到Sink,并由一个Event