Commit graph

247 commits

Author SHA1 Message Date
a45a3e08be feat: add Interface::clear_halt(endpoint: u8) for direct endpoint halt clearing
Some checks failed
Rust / format (push) Has been cancelled
Rust / build (macos-latest, 1.79) (push) Has been cancelled
Rust / build (macos-latest, stable) (push) Has been cancelled
Rust / build (ubuntu-latest, 1.79) (push) Has been cancelled
Rust / build (ubuntu-latest, stable) (push) Has been cancelled
Rust / build (windows-latest, 1.79) (push) Has been cancelled
Rust / build (windows-latest, stable) (push) Has been cancelled
Rust / build_android (push) Has been cancelled
Allows clearing a halt/stall condition by raw endpoint address without
needing to construct a typed Endpoint object. Implemented on all three
platform backends (Linux usbfs, macOS IOKit, Windows WinUSB).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 15:13:39 +00:00
1239c6765a fix: correct return type of fuzz_parse_concatenated_config_descriptors 2026-03-25 22:12:48 +00:00
c1380673db feat(linux): allow multiple endpoints per address for concurrent URB pipelining
Replace EndpointBitSet with EndpointRefCount in the Linux backend to
allow multiple Endpoint/IsoEndpoint objects at the same USB endpoint
address. This enables concurrent pipelined URB submission from
independent threads, which is needed for USB/IP proxies that forward
multiple isochronous URBs simultaneously.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 14:11:33 +00:00
Frederic Laing
997a76cd3c implement isochronous transfers for linux 2026-03-19 21:11:36 +00:00
Samuel Åkesson
f31e6cc698
Implement From<&[u8]> and From<[u8; N]> for Buffer (#189) 2026-03-10 12:10:56 -06:00
Kevin Mehall
313cb0132e
windows: Fix panic when we can't determine the instance ID for a hotplug event (#185) 2026-03-10 12:03:29 -06:00
Kevin Mehall
7cea448e5c Improve Endpoint docs 2026-02-17 13:11:30 -07:00
Kevin Mehall
cd593cd871 linux: Handle ENOENT from claim_interface 2026-02-17 10:38:54 -07:00
Abdullah Al-Banna
94dffc4311
default to configuration 0 if the bConfigurationValue file is empty (#181)
Co-authored-by: Kevin Mehall <km@kevinmehall.net>
2026-02-17 10:24:08 -07:00
Kevin Mehall
b8e8938975 macos: clean up IOCreatePlugInInterfaceForService retry loop 2026-01-24 21:51:02 -07:00
Kevin Mehall
d07caaf807 Update io-kit-sys to 0.5.0 2026-01-24 17:30:17 -08:00
Kevin Mehall
dd56a96648 Add Endpoint::transfer_blocking convenience method. 2025-10-04 16:31:53 -06:00
Kevin Mehall
61228aef1c Log on dropping endpoint with pending transfers 2025-10-04 15:40:15 -06:00
Kevin Mehall
bcfb2b8e89 Take waker and drop EndpointInner reference before waking transfer
This fixes a race condition for users that drop the Endpoint immediately after a transfer
completes, and then might immediately try and re-open the endpoint. The event thread
still held an Arc reference after marking the transfer complete, and so the endpoint
was still considered in use and re-opening occasionally failed.

It also means the `Notify` lock is not held when calling the waker function, which fixes
a deadlock if it were to call back into endpoint methods.
2025-10-04 14:52:35 -06:00
Kevin Mehall
573126df43 Fix "hiding a lifetime that's elided elsewhere is confusing" warnings from rustc 1.90 2025-10-03 18:00:24 -06:00
Kevin Mehall
0035edd067 Add must_use to MaybeFuture 2025-07-27 13:00:28 -06:00
Kevin Mehall
64a278bd41 windows: Fix interface busy check 2025-07-27 12:19:42 -06:00
Kevin Mehall
4009138dc7 Documentation improvements 2025-07-26 17:21:28 -06:00
Kevin Mehall
5262bad233 Disable DeviceInfo fields and BusInfo for future compatibility with Android and WebUSB backends 2025-07-26 15:58:13 -06:00
Kevin Mehall
84616c749e Remove DeviceInfo::max_packet_size_0
This isn't exposed on WebUSB or Android, and isn't useful as a criteria for filtering devices.
Control endpoint packet size is fully abstracted by the OS, so the only use case is for
re-constructing the device descriptor, and now we offer the full device descriptor
for an opened device.
2025-07-26 15:58:13 -06:00
Kevin Mehall
7f6f7948d8 Avoid panic during Tokio runtime shutdown
Fixes #156
2025-07-20 10:42:40 -06:00
Kevin Mehall
6304e71987 windows: Always use interface descriptors rather than child device nodes for InterfaceInfo 2025-07-16 23:27:42 -06:00
Kevin Mehall
e0d1d6489d windows: Update windows-sys 2025-07-16 23:27:42 -06:00
Kevin Mehall
eb12376bc2 EndpointWrite: require num_transfers is nonzero 2025-07-15 23:16:37 -06:00
Kevin Mehall
a3c57e9336 EndpointRead: Error type for EndpointReadUntilShortPacket::consume_end 2025-07-15 23:06:40 -06:00
Kevin Mehall
89d55ab6a2 EndpointRead: improve semantics for num_transfers 2025-07-15 23:06:40 -06:00
Kevin Mehall
0de3706d9f macos: Use IOUSBInterfaceInterface700 and IOUSBDeviceInterface650
IOUSBInterfaceInterface700 was added in macOS 10.10+ and
IOUSBDeviceInterface650 in macOS 10.9+, both older than Rust's
minimum of 10.12 so technically the breaking change was already
broken by Rust, but might as well get this in on the nusb v0.2
semver bump.

Co-authored-by: Charles Strahan <charles@cstrahan.com>
2025-06-15 14:20:23 -06:00
Kevin Mehall
3c21f7ea11 macos: Update core-foundation 2025-06-15 14:20:23 -06:00
Kevin Mehall
8d55c38aa4 Fix warnings 2025-06-15 13:36:20 -06:00
Kevin Mehall
a693c9211c linux: Log submitted transfer sizes 2025-06-15 13:04:15 -06:00
Kevin Mehall
b1cc46e918 Add EndpointRead and EndpointWrite 2025-06-15 12:52:41 -06:00
Kevin Mehall
4da8f325b8 Panic if awaiting a blocking syscall without smol or tokio features.
This ensures the `tokio` feature is additive, because `tokio::task::spawn_blocking`
will panic if called from a thread without an active tokio runtime. If you
intentionally want the blocking behavior, you can always use `.wait()` instead
of `.await`.
2025-06-15 11:20:03 -06:00
Kevin Mehall
535fc7d458 impl Debug for Device, Interface, and Endpoint 2025-06-01 23:28:45 -06:00
Kevin Mehall
6895347f4b Define a new Error type instead of re-exporting std::io::Error
The default mapping from OS error codes to io::Error's messages is often wrong
or misleading. We can do a lot better, but it takes a lot of error-handling code.
2025-06-01 23:28:45 -06:00
Kevin Mehall
592f57a3e0 linux: refactor device initial get_configuration 2025-06-01 12:38:58 -06:00
Kevin Mehall
f66c262221 macos: Copy config descriptors when opening device
These functions can fail if the device is disconnected, so make our
own copy of the buffer for consistency with other platforms.
2025-05-31 11:46:05 -06:00
Kevin Mehall
03468acd5f linux: Remove BusInfo::parent_path
You can just use the Path method
2025-05-31 11:25:28 -06:00
Kevin Mehall
e09a4ef458 linux: Canonicalize sysfs paths
For consistency with hotplug events
2025-05-31 11:25:28 -06:00
Kevin Mehall
3d2eb04f55 Docs fix 2025-05-26 12:51:30 -06:00
Kevin Mehall
24c7ac5efd Error on IN transfer that is not a multiple of max packet size on all platforms 2025-05-25 11:47:50 -06:00
Kevin Mehall
e02378e556 windows: InvalidArgument for unsupported control recipient interface 2025-05-25 11:47:50 -06:00
Kevin Mehall
00667caa01 windows: fix submit-time error 2025-05-25 11:47:50 -06:00
Kevin Mehall
5ac12ef088 macos: map error type for control timeout 2025-05-25 11:47:50 -06:00
Kevin Mehall
18bb260623 Make TransferError::Unknown hold u32
macOS errors have the high bit set
2025-05-25 11:47:50 -06:00
Kevin Mehall
700b8da9d8 Clippy fixes 2025-05-24 14:56:33 -06:00
Kevin Mehall
5a23b845a4 Fix memory ordering for dropping transfers 2025-05-10 13:08:29 -06:00
Kevin Mehall
4a9c3e5bbc Prevent dropping a device while a control transfer is pending 2025-05-04 10:03:53 -06:00
Kevin Mehall
dac6f52c27 Remove atomic-waker 2025-05-03 22:30:37 -06:00
Kevin Mehall
3f558194da windows: Revert to GetOverlappedResult for completion status
OVERLAPPED.Internal contains NTSTATUS instead of WIN32_ERROR,
and while it seems very unlikely to change, is documented as
subject to change.
2025-05-03 15:57:11 -06:00
Kevin Mehall
b976e91ce8 Docs edits 2025-05-03 14:10:37 -06:00