libusb开发者指南

Avatarx Avatarx     2022-10-04     630

关键词:

 

 

本文档描述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() 等)之前调用。
返回码:
EBUSY :接口无效,无法被认领
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 其他应用
其他应用就参考其他的项目吧:
gPhoto :使用libusb与相机通信
rio500 :使用libusb与SONICblue Rio 500播放器

linux下使用c语言和libusb开发usbhid

玩转USB系列:Linux下使用C语言和libusb开发USBHID实验环境开发步骤安装libusb试试好用否我们来与HID设备通讯!探索、学习与注意:1.&ctx是个什么鬼2.print_devs(devs)->print_devs(&devs);3.操作端口这类程序加上sudo!4.libusb_interrupt_tran... 查看详情

libusb系列-001-libusb简介(代码片段)

libusb系列-001-libusb简介文章目录libusb系列-001-libusb简介摘要基本信息简介支持平台官网如何使用下载神奇的1.0.9版本关键字:Debian、Linux、Qt、libusb、源码内容背景:最近项目终于切到Linux下开发了,所以最近的记录都是... 查看详情

libusb系列-002-windows下libusb源码编译(代码片段)

libusb系列-002-Windows下libusb源码编译文章目录libusb系列-002-Windows下libusb源码编译摘要Windows下编译libusb库下载源码进入msvc目录选择对应的项目工程编译查看编译好的库文件关键字:vs、编译、Qt、libusb、windows内容背景:最近... 查看详情

libusb系列-004-qt下使用libusb库(代码片段)

libusb系列-004-Qt下使用libusb库文章目录libusb系列-004-Qt下使用libusb库摘要复制库到指定目录在Pro中包含库文件包含头文件多说一句关键字:Debian、Linux、Qt、libusb、源码内容背景:最近项目终于切到Linux下开发了,所以最... 查看详情

libusb系列-006-qt下使用libusb1.0.9源码(代码片段)

libusb系列-006-Qt下使用libusb1.0.9源码文章目录libusb系列-006-Qt下使用libusb1.0.9源码摘要添加宏添加源文件编译文件测试libusb工程源码关键字:Debian、Linux、Qt、libusb、源码内容背景:最近项目终于切到Linux下开发了,所以最... 查看详情

libusb简介

概述libusb是一个C库,它提供了通用的访问USB设备。它的目的是供开发人员使用方便的生产与USB通信硬件的应用程序。可移植的:使用一个跨平台API,它提供了访问USB设备在Linux上,OSXWindows,Android,OpenBSD等等。用户模式:不需要特权或高... 查看详情

libusb_open 在 Windows 7 上返回“LIBUSB_ERROR_NOT_SUPPORTED”

】libusb_open在Windows7上返回“LIBUSB_ERROR_NOT_SUPPORTED”【英文标题】:libusb_openreturns\'LIBUSB_ERROR_NOT_SUPPORTED\'onWindows7【发布时间】:2013-06-2508:51:51【问题描述】:我一直在Linux上使用LibUSB开发USB驱动程序,但现在我想为Windows编译一个... 查看详情

如何在 Mac OS X 上设置 libusb?

】如何在MacOSX上设置libusb?【英文标题】:HowtosetuplibusbonMacOSX?【发布时间】:2011-04-2016:45:41【问题描述】:我想尝试在Mac上使用libusb制作用户空间设备驱动程序,但我不知道从哪里开始。在SDK安装程序(我从http://www.ellert.se/twain... 查看详情

libusb简单记录

...USBdriver来支持。有一款开源的跨平台的USBdriver,就是libusb,可以用来进行自定义的USB设备的驱动开发。libusblibusb是一个C语言编写的库,可以供上层的应用来调用,和连接在笔记本上的USB设备进行通信。易于移植&#x... 查看详情

libusb系列-003-linux下libusb源码编译(代码片段)

libusb系列-003-Linux下libusb源码编译文章目录libusb系列-003-Linux下libusb源码编译摘要源码下载及解压下载源码解压下载的源码压缩包打开终端准备编译环境安装makedh-autoreconf安装libudev-dev编译错误的教程增加执行bootstrap.sh指令再编译mak... 查看详情

如何为 libusb android 应用程序授予 /dev/bus/usb 权限?

】如何为libusbandroid应用程序授予/dev/bus/usb权限?【英文标题】:Howtogive/dev/bus/usbpermissionsforlibusbandroidapplications?【发布时间】:2011-11-1622:31:12【问题描述】:我正在开发一个通过jni使用libusb的应用程序。此应用程序目前仅针对有... 查看详情

如何使用 libusb 和 libusb_get_device_descriptor()?

】如何使用libusb和libusb_get_device_descriptor()?【英文标题】:Howtouselibusbandlibusb_get_device_descriptor()?【发布时间】:2013-01-2105:43:51【问题描述】:我正在学习第一次在Ubuntu12.10上使用libusbv1.0.0。这是我用来尝试了解如何使用此API的一... 查看详情

libusb示例

#include<stdio.h>#include<libusb-1.0/libusb.h>#include<stdint.h>#include<string.h>voidprocessMessage(constuint8_t*);/*---------------------------------------------------------- 查看详情

缓慢构建 librealsense libusb

】缓慢构建librealsenselibusb【英文标题】:slowbuildlibrealsenselibusb【发布时间】:2020-09-2312:59:45【问题描述】:当我启动我的程序时,构建需要很长时间,比如3.5分钟。我明白了:1>------Buildstarted:Project:libusb(ExternalProjectTargets\\libusb... 查看详情

安卓L | libusb_init 返回 LIBUSB_ERROR_OTHER (-99)

】安卓L|libusb_init返回LIBUSB_ERROR_OTHER(-99)【英文标题】:AndroidL|libusb_initreturnsLIBUSB_ERROR_OTHER(-99)【发布时间】:2014-10-2900:22:54【问题描述】:我尝试按照thisapproach中的建议在未植根的Nexus5上使用libusb(通过将USB文件描述符从java传输... 查看详情

linux下交叉编译libusb的方法及编译一个使用了libusb库的test程序的方法(代码片段)

linux交叉编译libusb的方法下载libusb下载网址:libusb-BrowseFilesatSourceForge.net交叉编译libusb将下载好的libusb压缩包解压后进入该文件执行下列指令./configure--build=i686-linux--host=arm-linux--prefix=/home/xfc/usb/installCC 查看详情

libusb系列-007-qt下使用libusb1.0.26源码(代码片段)

libusb系列-007-Qt下使用libusb1.0.26源码文章目录libusb系列-007-Qt下使用libusb1.0.26源码摘要安装编译环境确认需要的文件开始编译错误1:找不到文件错误2:expected错误3:SCM_CREDENTALS错误4:类型冲突错误5assert断言错误错... 查看详情

libusb使用

xxx 查看详情