11 个版本

0.1.10 2024 年 7 月 28 日
0.1.9 2024 年 4 月 30 日
0.1.7 2024 年 3 月 3 日
0.1.6 2024 年 2 月 2 日
0.1.0 2023 年 10 月 8 日

#49硬件支持

Download history 1854/week @ 2024-05-03 938/week @ 2024-05-10 1594/week @ 2024-05-17 1370/week @ 2024-05-24 1238/week @ 2024-05-31 1420/week @ 2024-06-07 1574/week @ 2024-06-14 1166/week @ 2024-06-21 1619/week @ 2024-06-28 1357/week @ 2024-07-05 1675/week @ 2024-07-12 1817/week @ 2024-07-19 2233/week @ 2024-07-26 1424/week @ 2024-08-02 1605/week @ 2024-08-09 1604/week @ 2024-08-16

7,185 每月下载量
用于 20 个crate(10 个直接使用)

Apache-2.0 OR MIT

275KB
6K SLoC

nusb

一个新的纯 Rust 库,用于跨平台低级访问 USB 设备。

文档

rusblibusb 比较

  • 纯 Rust,不依赖于 libusb 或任何其他 C 库。
  • 以异步为首要,但不需要像 tokioasync-std 这样的异步运行时。仍然可以轻松地使用 futures_lite::block_on 进行阻塞。
  • 没有上下文对象。您只需打开一个设备。当打开第一个设备时,会启动一个全局事件循环线程。
  • 在 OS API 上层更薄,内部状态更少。

当前状态

  • 支持 Linux、Windows 和 macOS
  • 设备列表和描述符解析
  • 控制、块和中断端点的传输
  • probe-rs 和其他人用于生产,但仍然相对较新。请测试您的设备并报告问题。

许可证

MIT 或 Apache 2.0,任选其一


lib.rs:

一个新的库,用于跨平台低级访问 USB 设备。

nusb 可以与 C 库 libusb 及其 Rust 绑定 rusb 比较,但完全用 Rust 编写。它默认基于并公开异步 API,但可以使用 futures_lite::future::block_on 或类似的方式实现阻塞。

使用 nusb 在 Rust 中编写用于非标准 USB 设备或未获得内核支持的设备的用户空间驱动程序。对于实现标准 USB 类(如存储设备、CDC(串行)、HID、音频或视频)的设备,这可能不是您需要的库 -- 使用基于现有内核驱动程序的库。 (在某些平台上,您可以使用此库从用户空间解除或替换内核驱动程序,并使用此库从用户空间编程设备,但您需要自己重新实现类功能。)

USB 和用法概述

当USB设备连接时,操作系统会查询包含基本设备信息(如厂商和产品ID(VID / PID)和字符串描述符(如制造商、产品和序列号字符串)的设备描述符。`list_devices` 返回一个列出连接USB设备的迭代器,可以通过这些字段筛选以识别和选择所需的设备。

调用 device_info.open() 打开选定的设备。可以使用 device.active_configuration() 查询有关设备的更多信息。

USB设备由一个或多个接口组成,这些接口公开了一组功能。具有多个接口的设备称为复合设备。要打开接口,请调用 Device::claim_interface。一次只能有一个程序(或内核驱动程序)声明一个接口。

使用生成的 Interface 在设备的控制、批量或中断端点传输数据。默认情况下,传输是异步的,可以作为单个 Future 等待,或者使用 Queue 来管理数据流。

有关USB如何工作的更多详细信息,请参阅《USB概述》。

日志记录

nusb 使用 log 包来记录调试和错误信息。

提交错误报告 时,请包括日志:使用类似 env_logger 的日志后端,并配置它以启用此crate的日志输出(对于 env_logger 设置环境变量 RUST_LOG=nusb=debug)。

平台支持

Linux

nusb 是基于内核的 usbfs API 构建的。

用户必须对 /dev/bus/usb/XXX/YYY 节点有写访问权限才能成功打开设备。使用 udev规则 来配置这些权限。

对于用于开发的单个用户系统,可能需要将以下内容放入 /etc/udev/rules.d/70-plugdev-usb.rules

SUBSYSTEM=="usb", MODE="0660", GROUP="plugdev"

这项权限授予了所有USB设备对plugdev组的访问权限,您的用户可能在基于Debian/Ubuntu的发行版中默认是此组成员。如果您正在为他人开发需要安装的应用程序,您应使用ATTRS{idVendor}=="ZZZZ", ATTRS{idProduct}=="ZZZZ"过滤器来更精确地限定权限,使其仅适用于您的设备。

Windows

nusb在Windows上使用WinUSB

在Windows上,设备与特定驱动程序相关联,该驱动程序在连接和重启之间保持不变。复合设备在Windows设备模型中表现为多个设备,每个接口都可以与单独的驱动程序相关联。

要使用nusb,您的设备或接口必须与WinUSB驱动程序相关联。如果您控制设备固件,建议使用WCID描述符告诉Windows在设备首次连接时自动安装WinUSB驱动程序。或者可以使用Zadig(图形界面)或libwdi(命令行界面/ C库)手动为设备安装WinUSB驱动程序。

macOS

nusb在macOS上使用IOKit。

用户默认可以访问USB设备,无需权限配置。具有内核驱动的设备不可访问。

依赖

~0.1–14MB
~120K SLoC