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 在 硬件支持
7,185 每月下载量
用于 20 个crate(10 个直接使用)
275KB
6K SLoC
nusb
一个新的纯 Rust 库,用于跨平台低级访问 USB 设备。
与 rusb 和 libusb 比较
- 纯 Rust,不依赖于 libusb 或任何其他 C 库。
- 以异步为首要,但不需要像
tokio
或async-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