添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

一、背景介绍

上一篇博客主要介绍了libusb在linux系统下的详细安装过程,目前新的libusb离线包已经不需要再单独安装libusb-compat资料包了。libusb 较大版本变动以 V1.0 为分界线,访问官网: http://libusb.info 时可以发现文档说明都以 V1.0 为主了。

官网界面清晰明了,分类十分明确,开发者可以直接从网站下载文档,API使用说明,例程等内容。V1.0 相对于之前版本,提供了更丰富的功能和接口,本篇直接基于新版本 libusb 库 API 进行说明与使用介绍。

二、libusb API 参考与特点

libusb 是一个开源库,允许从用户空间与 USB 设备进行通信。 其面向希望通过自己的软件与 USB 外围设备进行通信的应用程序开发人员。在进行开发之前,建议先通过USB规范文档对USB有一定的了解,如描述符、配置、接口、端点、控制/批量/中断/等时传输等。这样在软件操作 USB 设备时才会得心应手。

libusb库特点

  • 支持所有传输类型(控制/批量/中断/等时)
  • 同步传输(简单)
  • 异步传输(更复杂,但更强大)
  • 线程安全(异步接口通常不需要线程处理)
  • 轻量级的精简 API
  • 通过 libusb-compat-0.1 转换层兼容 libusb-0.1
  • 热插拔支持(在某些平台上)。

要开始阅读 API 文档,建议先从不同类别的 libusb 功能的 Module 页面开始。

进行数据传输时需要决定使用同步还是异步数据传输,同步和异步设备 I/O 文档提供了有关此主题的介绍,我们稍后会进行介绍。

一些示例程序可以在 libusb 源代码发行版中的“examples”子目录下找到。 libusb 主页包括使用 libusb 的真实项目示例列表。建议读者直接从例子程序开始,这样可以快速掌握 libusb 的用法并了解相关函数的功能。

三、libusb API列表

编程经验比较丰富的开发者可以直接在安装路径下找到我们编程时需要引用的头文件usb.h,头文件中代码上部分为 usb 协议标准术语的宏定义,中间为相关结构体定义,后半部为编程使用的 API 声明,下面根据 API 功能和使用顺序进行分类描述:

库初始化与反初始化(Library initialization/deinitialization)

void libusb_set_debug ( libusb_context *ctx, int level)
设置libusb调试等级,方便查看调试过程和log信息。
void libusb_set_log_cb ( libusb_context *ctx, libusb_log_cb cb, int mode)
设置log处理程序,libusb 会将其日志消息重定向到提供的回调函数。
int libusb_set_option ( libusb_context *ctx, enum libusb_option option,...)
设置库选项,使用此函数可配置库中的特定选项。
int libusb_init ( libusb_context **context)
初始化 libusb。 必须在调用任何其他 libusb 函数之前调用此函数。
void libusb_exit ( libusb_context *ctx)
取消初始化 libusb。 应在关闭所有打开的设备后和应用程序终止之前调用。

设备处理和枚举(Device handling and enumeration)

ssize_t libusb_get_device_list ( libusb_context *ctx, libusb_device ***list)
返回当前连接到系统的 USB 设备列表。 这是查找要操作的 USB 设备的入口点。
void libusb_free_device_list ( libusb_device **list, int unref_devices)
释放先前使用 libusb_get_device_list() 发现的设备列表。 如果设置了 unref_devices 参数,则列表中每个设备的引用计数减 1。
uint8_t libusb_get_bus_number ( libusb_device *dev)
获取设备连接的总线编号。
uint8_t libusb_get_port_number ( libusb_device *dev)
获取设备连接的端口号。
int libusb_get_port_numbers ( libusb_device *dev, uint8_t *port_numbers, int port_numbers_len)
获取指定设备的从根节点开始的所有端口号列表
int libusb_get_port_path ( libusb_context *ctx, libusb_device *dev, uint8_t *port_numbers, uint8_t port_numbers_len)
请使用 libusb_get_port_numbers API 替代
libusb_device * libusb_get_parent ( libusb_device *dev)
从指定设备获取父设备。
uint8_t libusb_get_device_address ( libusb_device *dev)
获取设备在它所连接的总线上的地址。
int libusb_get_device_speed ( libusb_device *dev)
获取设备的协商连接速度,返回码见 libusb_speed。
int libusb_get_max_packet_size ( libusb_device *dev, unsigned char endpoint)
获取特定端点的 wMaxPacketSize 值。
int libusb_get_max_iso_packet_size ( libusb_device *dev, unsigned char endpoint)

基于端点描述符中的 wMaxPacketSize 字段,计算特定端点在 1 个微帧的持续时间内能够发送或接收的最大数据包大小。

libusb_device * libusb_ref_device ( libusb_device *dev)
增加设备的引用计数。
void libusb_unref_device ( libusb_device *dev)
减少设备的引用计数。 如果递减操作导致引用计数达到零,则设备将被销毁。
int libusb_wrap_sys_device ( libusb_context *ctx, intptr_t sys_dev, libusb_device_handle **dev_handle)
(不常用,略)
int libusb_open ( libusb_device *dev, libusb_device_handle **dev_handle)
打开设备并获取设备句柄。 句柄允许您在相关设备上执行 I/O。
libusb_device_handle * libusb_open_device_with_vid_pid ( libusb_context *ctx, uint16_t vendor_id, uint16_t product_id)
打开特定 idVendor/idProduct 组合的USB设备。
void libusb_close ( libusb_device_handle *dev_handle)
关闭设备句柄。 应在应用程序退出之前在所有打开的句柄上调用。
libusb_device * libusb_get_device ( libusb_device_handle *dev_handle)
获取设备句柄关联的 libusb_device 底层设备。
int libusb_get_configuration ( libusb_device_handle *dev_handle, int *config)
确定当前活动配置的 bConfigurationValue。
int libusb_set_configuration ( libusb_device_handle *dev_handle, int configuration)
设置设备的活动配置。这在支持多个配置的USB设备中会用到。
int libusb_claim_interface ( libusb_device_handle *dev_handle, int interface_number)
在给定的设备句柄上声明一个接口。 您必须先声明要使用的接口,然后才能在其任何端点上执行 I/O。
int libusb_release_interface ( libusb_device_handle *dev_handle, int interface_number)
释放先前使用 libusb_claim_interface() 声明的接口。 您应该在关闭设备句柄之前释放所有声明的接口。
int libusb_set_interface_alt_setting ( libusb_device_handle *dev_handle, int interface_number, int alternate_setting)
激活接口的备用设置。 该接口必须先前已使用 libusb_claim_interface() 声明。
int libusb_clear_halt ( libusb_device_handle *dev_handle, unsigned char endpoint)
清除端点的暂停/停止条件。 处于停止状态的端点无法接收或发送数据,直到停止条件停止。
int libusb_reset_device ( libusb_device_handle *dev_handle)
执行 USB 复位以重新初始化设备。
int libusb_kernel_driver_active ( libusb_device_handle *dev_handle, int interface_number)
确定内核驱动程序是否在接口上处于活动状态。 如果内核驱动程序处于活动状态,则不能声明该接口,并且 libusb 将无法执行 I/O。
int libusb_detach_kernel_driver ( libusb_device_handle *dev_handle, int interface_number)
分离接口和内核驱动程序。 如果成功,您将能够声明接口并执行 I/O。
int libusb_attach_kernel_driver ( libusb_device_handle *dev_handle, int interface_number)
重新附加接口的内核驱动程序,该驱动程序之前使用 libusb_detach_kernel_driver() 分离。
int libusb_set_auto_detach_kernel_driver ( libusb_device_handle *dev_handle, int enable)
启用/禁用 libusb 的自动内核驱动程序分离。 启用此功能后,libusb 将在声明接口时自动分离接口上的内核驱动程序,并在释放接口时附加它。


标准USB描述符操作(USB descriptors)

int libusb_get_device_descriptor ( libusb_device *dev, struct libusb_device_descriptor *desc)
获取指定设备的USB设备描述符。
int libusb_get_active_config_descriptor ( libusb_device *dev, struct libusb_config_descriptor **config)
获取当前活动配置的 USB 配置描述符。
int libusb_get_config_descriptor ( libusb_device *dev, uint8_t config_index, struct libusb_config_descriptor **config)
根据其索引获取 USB 配置描述符。
int libusb_get_config_descriptor_by_value ( libusb_device *dev, uint8_t bConfigurationValue, struct libusb_config_descriptor **config)
获取具有特定 bConfigurationValue 的 USB 配置描述符。
void libusb_free_config_descriptor (struct libusb_config_descriptor *config)
释放从如上API获取的USB配置描述符。
int libusb_get_ss_endpoint_companion_descriptor ( libusb_context *ctx, const struct libusb_endpoint_descriptor *endpoint, struct libusb_ss_endpoint_companion_descriptor **ep_comp)
获取端点超高速端点伴随描述符(如果有)。
void libusb_free_ss_endpoint_companion_descriptor (struct libusb_ss_endpoint_companion_descriptor *ep_comp)
释放超高速端点伴随描述符。
int libusb_get_bos_descriptor ( libusb_device_handle *dev_handle, struct libusb_bos_descriptor **bos)
获取二进制对象存储 (BOS) 描述符 这是一个 BLOCKING(阻塞) 函数,它将向设备发送请求。
void libusb_free_bos_descriptor (struct libusb_bos_descriptor *bos)
释放BOS描述符。
int libusb_get_usb_2_0_extension_descriptor ( libusb_context *ctx, struct libusb_bos_dev_capability_descriptor *dev_cap, struct libusb_usb_2_0_extension_descriptor **usb_2_0_extension)
获取 USB 2.0 扩展描述符。
void libusb_free_usb_2_0_extension_descriptor (struct libusb_usb_2_0_extension_descriptor *usb_2_0_extension)
释放 USB 2.0 扩展描述符。
int libusb_get_ss_usb_device_capability_descriptor ( libusb_context *ctx, struct libusb_bos_dev_capability_descriptor *dev_cap, struct libusb_ss_usb_device_capability_descriptor **ss_usb_device_cap)
获取 SuperSpeed USB 设备功能描述符。
void libusb_free_ss_usb_device_capability_descriptor (struct libusb_ss_usb_device_capability_descriptor *ss_usb_device_cap)
释放 SuperSpeed USB 设备功能描述符。
int libusb_get_container_id_descriptor ( libusb_context *ctx, struct libusb_bos_dev_capability_descriptor *dev_cap, struct libusb_container_id_descriptor **container_id)
获取容器 ID 描述符。
void libusb_free_container_id_descriptor (struct libusb_container_id_descriptor *container_id)
释放容器 ID 描述符
int libusb_get_string_descriptor_ascii ( libusb_device_handle *dev_handle, uint8_t desc_index, unsigned char *data, int length)
以 C 风格的 ASCII 检索字符串描述符。
static int libusb_get_descriptor ( libusb_device_handle *dev_handle, uint8_t desc_type, uint8_t desc_index, unsigned char *data, int length)
从默认控制管道中检索描述符。
static int libusb_get_string_descriptor ( libusb_device_handle *dev_handle, uint8_t desc_index, uint16_t langid, unsigned char *data, int length)
获取设备字符串描述符。返回的字符串是 Unicode,详见 USB 规范。

设备热插拔事件通知(Device hotplug event notification)

int libusb_hotplug_register_callback ( libusb_context *ctx, int events, int flags, int vendor_id, int product_id, int dev_class, libusb_hotplug_callback_fn cb_fn, void *user_data, libusb_hotplug_callback_handle *callback_handle)
注册热插拔回调函数。
void libusb_hotplug_deregister_callback ( libusb_context *ctx, libusb_hotplug_callback_handle callback_handle)
取消注册热插拔回调。
void * libusb_hotplug_get_user_data ( libusb_context *ctx, libusb_hotplug_callback_handle callback_handle)
获取与热插拔回调关联的 user_data。

异步设备I/O(Asynchronous device I/O)

Functions

int libusb_alloc_streams ( libusb_device_handle *dev_handle, uint32_t num_streams, unsigned char *endpoints, int num_endpoints)
在指定的端点上分配最多 num_streams 个 USB 批量流。
int libusb_free_streams ( libusb_device_handle *dev_handle, unsigned char *endpoints, int num_endpoints)
释放流。
unsigned char * libusb_dev_mem_alloc ( libusb_device_handle *dev_handle, size_t length)
尝试分配适合针对给定设备进行传输的 DMA 内存块。
int libusb_dev_mem_free ( libusb_device_handle *dev_handle, unsigned char *buffer, size_t length)
释放DMA内存块。
struct libusb_transfer * libusb_alloc_transfer (int iso_packets)
使用指定数量的同步数据包描述符分配 libusb 传输。
void libusb_free_transfer (struct libusb_transfer *transfer)
释放libusb传输。
int libusb_submit_transfer (struct libusb_transfer *transfer)
提交一次传输。
int libusb_cancel_transfer (struct libusb_transfer *transfer)
取消传输。
void libusb_transfer_set_stream_id (struct libusb_transfer *transfer, uint32_t stream_id)
设置传输批量流ID。
uint32_t libusb_transfer_get_stream_id (struct libusb_transfer *transfer)
获取传输批量流ID。
static unsigned char * libusb_control_transfer_get_data (struct libusb_transfer *transfer)
获取控制传输的数据部分。
static struct libusb_control_setup * libusb_control_transfer_get_setup (struct libusb_transfer *transfer)
获取控制传输的控制Setup包。
static void libusb_fill_control_setup (unsigned char *buffer, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint16_t wLength)
辅助函数用于填充Setup包(数据缓冲区的前 8 个字节)以进行控制传输。
static void libusb_fill_control_transfer (struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char *buffer, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout)
用于填充控制传输所需的 libusb_transfer 字段的辅助函数。
static void libusb_fill_bulk_transfer (struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *buffer, int length, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout)
用于填充批量传输所需的 libusb_transfer 字段的辅助函数。
static void libusb_fill_bulk_stream_transfer (struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char endpoint, uint32_t stream_id, unsigned char *buffer, int length, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout)
使用批量流填充批量传输所需的 libusb_transfer 字段的辅助函数。
static void libusb_fill_interrupt_transfer (struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *buffer, int length, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout)
用于填充中断传输所需的 libusb_transfer 字段的辅助函数。
static void libusb_fill_iso_transfer (struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *buffer, int length, int num_iso_packets, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout)
用于填充同步传输所需的 libusb_transfer 字段的辅助函数。
static void libusb_set_iso_packet_lengths (struct libusb_transfer *transfer, unsigned int length)
根据传输结构中的 num_iso_packets 字段设置同步传输中所有数据包长度的便捷功能。
static unsigned char * libusb_get_iso_packet_buffer (struct libusb_transfer *transfer, unsigned int packet)
定位同步数据包在同步传输缓冲区内的位置的便捷功能。
static unsigned char * libusb_get_iso_packet_buffer_simple (struct libusb_transfer *transfer, unsigned int packet)
定位同步数据包在同步传输缓冲区内的位置的便捷功能,用于每个数据包大小相同的传输。

轮询和计时(Polling and timing)

只有异步 API 的用户才需要这些函数。 如果只使用更简单的同步 API,那么不需要调用这些函数。

int libusb_try_lock_events ( libusb_context *ctx)
尝试获取事件处理锁。
void libusb_lock_events ( libusb_context *ctx)
获取事件处理锁,如果有争用则阻塞直到成功获取。
void libusb_unlock_events ( libusb_context *ctx)
释放锁。
int libusb_event_handling_ok ( libusb_context *ctx)
确定该线程是否仍然可以进行事件处理。
int libusb_event_handler_active ( libusb_context *ctx)
确定活动线程是否正在处理事件(即是否有人持有事件处理锁)。
void libusb_interrupt_event_handler ( libusb_context *ctx)
中断正在处理事件的任何活动线程。 当应用程序希望调用 libusb_exit() 时,这主要用于中断专用的事件处理线程。
void libusb_lock_event_waiters ( libusb_context *ctx)
获取事件等待者锁。
void libusb_unlock_event_waiters ( libusb_context *ctx)
释放事件等待者锁。
int libusb_wait_for_event ( libusb_context *ctx, struct timeval *tv)
等待另一个线程发出事件完成的信号。
int libusb_handle_events_timeout_completed ( libusb_context *ctx, struct timeval *tv, int *completed)
处理任何挂起事件。
int libusb_handle_events_timeout ( libusb_context *ctx, struct timeval *tv)
处理任何挂起事件。
int libusb_handle_events ( libusb_context *ctx)
在阻塞模式下处理任何挂起的事件。
int libusb_handle_events_completed ( libusb_context *ctx, int *completed)
在阻塞模式下处理任何挂起的事件。
int libusb_handle_events_locked ( libusb_context *ctx, struct timeval *tv)
通过轮询文件描述符处理任何挂起的事件,而不检查是否有任何其他线程已经在这样做。 必须在持有事件锁的情况下调用,请参阅 libusb_lock_events()。
int libusb_pollfds_handle_timeouts ( libusb_context *ctx)
确定您的应用程序在监视 libusb 的文件描述符时是否必须应用特殊的时序注意事项。
int libusb_get_next_timeout ( libusb_context *ctx, struct timeval *tv)
确定 libusb 需要处理的下一个内部超时。
void libusb_set_pollfd_notifiers ( libusb_context *ctx, libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, void *user_data)
为文件描述符添加/删除注册通知函数。 将为 libusb 用作事件源的每个新的或删除的文件描述符调用这些函数。
const struct libusb_pollfd ** libusb_get_pollfds ( libusb_context *ctx)
检索应由主循环轮询作为 libusb 事件源的文件描述符列表。
void libusb_free_pollfds (const struct libusb_pollfd **pollfds)
释放 libusb_pollfd 结构的列表。 这应该为所有使用 libusb_get_pollfds() 分配的 pollfd 列表调用。

​​​​​​​同步设备I/O(Synchronous device I/O)

在进行简单传输可采用如下I/O,高级功能建议使用异步设备 I/O函数集。

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)
执行 USB 控制传输。
int libusb_bulk_transfer ( libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int *transferred, unsigned int timeout)
执行 USB 批量传输。
int libusb_interrupt_transfer ( libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int *transferred, unsigned int timeout)
执行 USB 中断传输。
一、背景介绍上一篇博客主要介绍了libusb在linux系统下的详细安装过程,目前新的libusb离线包已经不需要再单独安装libusb-compat资料包了。libusb 较大版本变动以 V1.0 为分界线,访问官网:http://libusb.info 时可以发现文档说明都以 V1.0 为主了。官网界面清晰明了,分类十分明确,开发者可以直接从网站下载文档,API使用说明,例程等内容。V1.0 相对于之前版本,提供了更丰富的功能和接口,本篇直接基于新版本li...
下载编译安装 libusb :https://blog.csdn.net/u011598479/article/details/82705378 1.确定你要通信的USB设备的一些参数。     user_device.idProduct = USB_PRODUCT_ID; //PID     user_device.idVendor = USB_VENDOR_ID ; //VID
由于usb设备的普遍性及其多样性,大量的usb设备的驱动 开发 也就成为 开发 者做的最多的事情。 Linux 平台上,内核驱动的 开发 由于内核的复杂和版本问题,初学者难以入手,驱动程序也不易升级和维护。本文主要 介绍 Linux 平台下使用 libusb 库基于usb文件系统的驱动 开发 ,并将其应用到嵌入式系统中,可显著降低 开发 难度,提高工作效率 Linux 内核经过 开发 人员的不断努力,已经变得十分地
首先声明,这是看到国外论坛上的学习文章后,独立翻译过来作为笔记用,加入部分自我理解,并且全部原创。 libusb 是一个开源库,可以帮助 开发 者在用户空间的层面上与UBS设备进行通讯。如果想了解更多,可以查看他们的主页:http:// libusb .org/ 在其文档中,建议首先阅读USB2的规格说明:http://www.usb.org/developers/docs/,这可以帮助真正地
### 回答1: Linux libusb 是一个用于访问USB设备的开源库。它提供了一个简单的 API ,使 开发 人员能够轻松地与USB设备进行通信。使用 libusb 开发 人员可以在 Linux 系统上编写USB设备驱动程序,而无需了解底层硬件细节。此外, libusb 还支持跨平台 开发 ,因此 开发 人员可以在不同的操作系统上使用相同的代码。 ### 回答2: Linux LibUSB 是一款用于USB驱动程序的开源库。 LibUSB 可以通过USB总线连接到计算机上的USB设备。该库可以让 开发 者直接访问USB设备,而无需编写特定的驱动程序。因此 LibUSB 是一个非常有用的工具,它使得在 Linux 平台上 开发 USB驱动程序变得更加容易。 LibUSB 在许多 Linux 发行版中都可以使用。此外,它还可用于Windows和Mac OS X平台。 LibUSB 不仅简化了USB驱动程序 开发 ,而且可以帮助 开发 者优化USB设备的性能。因此,许多 开发 人员都喜欢使用 LibUSB 来帮助他们 开发 高质量的USB驱动程序。 在使用 LibUSB 时,首先需要安装此库。在 Linux 环境下,可以使用系统包管理器来安装 LibUSB 。在Windows和Mac OS X下,可以从 LibUSB 的官方网站上下载安装程序。 一旦安装了 LibUSB ,就可以开始 开发 自己的USB设备驱动程序。通过使用 LibUSB 提供的 API 来编写驱动程序, 开发 人员可以直接获取和控制USB设备,以实现对USB设备的更精确的控制和数据传输。 总之, Linux LibUSB 是一个功能强大且易于使用的USB驱动程序 开发 工具,可以帮助 开发 者更好地了解和控制他们的USB设备,并在不编写特定驱动程序的情况下访问他们。 ### 回答3: Linux libusb 是一种开源的、跨平台的用户空间USB库,它提供了一系列 API 函数,帮助 开发 人员实现自己的USB设备驱动程序。 libusb 支持 Linux 、Windows、Mac OS X等操作系统,并且它是一种纯用户空间的库,不需要内核驱动程序或管理员权限。 在 Linux 中,USB设备是一种常见的设备类型。虽然 Linux 系统自带了许多USB设备驱动程序,但有些设备可能需要自己编写USB驱动程序。此时,可以使用 libusb 来简化驱动程序的编写,因为它提供的 API 函数非常规范、简单易用,使得 开发 人员能够快速地完成USB设备的驱动。 Linux libusb 提供了一系列功能强大的 API 函数,包括发送和接收数据、读写控制寄存器、设备描述符和配置描述符的获取等。除此之外, libusb 还支持异步I/O操作,可以让程序更加高效地使用USB 接口 。 此外, libusb 还支持热插拔功能,可以自动识别USB设备的插拔,并自动加载和卸载相应的驱动程序。这使得USB设备的安装和卸载更加简单,为用户带来了更加便利的使用体验。 总之, Linux libusb 是一个非常实用的开源库,它简化了 Linux 下USB设备驱动程序的编写过程,提供了丰富的 API 函数和热插拔功能,使得 Linux 系统能够更好地支持USB设备。