`
gashero
  • 浏览: 966883 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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, int size);

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

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

int usb_get_descriptor_by_endpoint(usb_dev_handle *dev, int ep, unsigned char type, unsigned char index, 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播放器
1
0
分享到:
评论

相关推荐

    嵌入式linux下基于libusb的USB驱动开发.pdf

    libusb 是一个开源的 USB 编程库,提供了一个跨平台的 API,使得开发者可以轻松地访问和控制 USB 设备。本文将介绍如何在嵌入式 Linux 系统下使用 libusb 库开发 USB 驱动程序,并详细讨论 libusb 库的使用方法和 ...

    Libusb Developers Guide

    Libusb 开发帮助指南,函数使用说明,chm格式帮助文档

    libusb Developers Guide

    该手册还提到,libusb 的开发者正在努力推进新版本的 libusb,目标是将其升级到 v1.0,届时将提供更加完善的 API 和更多功能。 3. API libusb 的 API 设计初衷是为了提供一个简洁、易用的接口,让开发者可以轻松地...

    libusb库源代码

    - **编译与移植**: 这个版本的libusb源代码包含了编译所需的文件和配置脚本,开发者可以按照指南在不同的平台上编译和安装。 - **文档资源**: 通常,libusb库会提供详细的文档,包括API参考、示例代码和安装指南,...

    libusb-0.1.12.tar.gz

    解压libusb-0.1.12.tar.gz后,你会看到一系列的源代码文件和文档,包括头文件、C语言源码、示例程序、构建脚本以及安装指南等。 在开发过程中,开发者可以通过libusb提供的函数来实现以下功能: 1. 设备枚举:获取...

    libusb-compat-0.1.4.zip

    总的来说,libusb-compat是libusb库的一个重要补充,对于那些需要在不同系统或不同libusb版本间保持代码兼容性的开发者来说,它是不可或缺的工具。通过理解libusb-compat的工作原理和使用方法,开发者可以更顺利地...

    libusb-1.0.23_libusb_beat4yg_

    5. **文档(Documentation)**:包括手册页和开发者指南,解释库的使用方法和API。 6. **配置文件(Configuation Files)**:用于构建库的脚本,如`configure`和`Makefile`,这些文件在Unix-like系统中用于编译和...

    libusb最新驱动

    这个“libusb最新驱动”压缩包提供了libusb-win32驱动程序,它专为Windows系统设计,使得开发者无需自行编写驱动程序就能与USB设备进行交互。这个驱动程序支持的操作系统广泛,涵盖了从较旧的Windows 2000到较新的...

    libusb-1.0.24.7z

    2. **README.txt**:这是项目的重要文档,通常包含安装指南、使用示例、许可信息等内容,帮助用户理解如何使用libusb库。 3. **VS2013、VS2015、VS2017、VS2019**:这些文件夹可能包含了针对不同Visual Studio版本...

    libusb-1.0-22源码

    这个“libusb-1.0-22源码”是该库的一个特定版本,允许开发者在编译后将其集成到自己的应用程序中,以便与USB设备进行低级别交互。本文将详细介绍libusb库的关键概念、功能以及如何使用其源码。 ### 1. libusb库...

    libsub libsub

    标题中的"libsub libsub"可能是由于输入错误或者重复,我们通常会假设它是指"libusb",这是一个开源的库,用于与USB设备进行通信。libusb为多种操作系统提供了通用接口,包括Linux、Windows和macOS等。这个库允许...

    LIBUSB 库,ubuntu 库文件

    "README.txt"是项目或软件包的说明文档,它通常会包含安装指南、使用示例、许可信息以及开发者需要知道的任何其他重要细节。对于LIBUSB库,README文件会解释如何在Ubuntu系统上配置和使用该库。 "MinGW64"和"MinGW...

    c# 写的LIBUSB库应用例子,可以说功能很全了

    3. **Docs**: 这个目录可能包含了项目的文档,包括API参考、用户指南或者示例代码,帮助开发者理解和使用这个库。 4. **Utility**: 这可能是包含辅助工具或实用程序的目录,这些工具可能用于设备检测、数据传输或...

    libusb-1.0.22.zip

    libusb-1.0.22.zip是一个包含libusb-1.0.22版本的压缩包,这个开源库是开发者进行USB设备编程的重要工具。libusb是一个高度可移植的库,它允许程序员在多种操作系统上直接与USB设备进行通信,包括Linux、Windows和...

    Samsung SPF LibUSB.zip

    为了充分利用这个库,开发者需要熟悉C/C++编程,因为LibUSB主要以这些语言提供API。他们还需要了解USB协议的基础知识,以及三星设备的特定通信协议,如果有的话。 总结起来,"Samsung SPF LibUSB.zip" 是一个针对...

    libusb-1.0.23.zip

    3. **文档**:libusb的文档通常包括API参考手册、用户指南和示例代码,帮助开发者快速上手并理解如何使用libusb进行USB编程。 4. **构建脚本**:为了在不同的平台上编译和安装libusb,压缩包通常会包含Makefile或...

    libusb的window库

    3. **Qt集成**:要在Qt中使用libusb,开发者需要将libusb库的头文件添加到项目的包含路径,并链接所需的库文件。通过调用libusb的API,可以实现USB设备的枚举、打开、读写操作以及设置配置和接口。 4. **USB设备...

    libusb-win32-bin-1.2.5.0.zip

    4. **文档**:可能包含API文档、用户指南或者示例代码,帮助开发者理解如何使用这个库。 5. **驱动程序安装程序**:在Windows上,可能需要安装libusb-win32驱动来使系统识别并使用libusb库。 6. **示例程序**:有时...

    libusb .NET平台

    3. **Docs**:这个目录可能包含项目的文档,如API参考、使用指南等,帮助开发者理解和使用LibUsbDotNet。 4. **Utility**:这是一个可能包含各种辅助工具或实用程序的目录,用于帮助开发、测试或管理LibUsbDotNet。...

Global site tag (gtag.js) - Google Analytics