Skip to main content

Crate rawusb

Crate rawusb 

Source
Expand description

Dependency-free, cross-platform USB device access in the spirit of libusb.

rawusb talks to the operating system’s native USB stack directly: usbfs on Linux, WinUSB on Windows and IOKit on macOS. There are no external crates and no C library to install. The API mirrors libusb’s concepts so that existing knowledge carries over, while staying idiomatic Rust.

§Layers

§Features

Everything below is off by default.

Class helpers, ready-made drivers for common device classes built on the public API above. Each claims the interfaces it needs (detaching the kernel driver on Linux) and gives them back when dropped:

On a composite device, take the whole device first with DeviceHandle::claim_all_interfaces, then start whatever helpers you need on clones of that handle. Each helper drives its own interfaces (a second one on the same interface fails with ErrorKind::Busy), and helpers can be dropped and reopened while the device stays taken:

let handle = dev.open()?;
handle.claim_all_interfaces()?; // detaches every kernel driver
let console = rawusb::serial::SerialPort::open_all(&handle)?;
let raw_hid = rawusb::hid::HidDevice::open_all(&handle)?;

§Example

use rawusb::{Context, Direction, ControlType, Recipient, request_type};
use std::time::Duration;

let ctx = Context::new()?;
for dev in ctx.devices()? {
    let d = dev.device_descriptor();
    println!("{:03}:{:03} {:04x}:{:04x}", dev.bus_number(), dev.address(), d.vendor_id, d.product_id);
}

let handle = ctx.open_device_with_vid_pid(0x1234, 0x5678)?;
handle.set_auto_detach_kernel_driver(true);
handle.claim_interface(0)?;
let mut buf = [0u8; 64];
let n = handle.bulk_read(0x81, &mut buf, Duration::from_secs(1))?;
println!("got {n} bytes");

// A vendor control request.
let rt = request_type(Direction::In, ControlType::Vendor, Recipient::Device);
let n = handle.control_read(rt, 0x01, 0, 0, &mut buf, Duration::from_secs(1))?;

Re-exports§

pub use descriptors::ConfigDescriptor;
pub use descriptors::DeviceDescriptor;
pub use descriptors::EndpointDescriptor;
pub use descriptors::Interface;
pub use descriptors::InterfaceDescriptor;
pub use hotplug::HotplugEvent;
pub use hotplug::HotplugRegistration;
pub use hotplug::HotplugWatcher;
pub use transfer::Transfer;
pub use transfer::TransferFlags;
pub use types::ControlSetup;
pub use types::ControlType;
pub use types::Direction;
pub use types::IsoPacket;
pub use types::NO_TIMEOUT;
pub use types::Recipient;
pub use types::Speed;
pub use types::TransferStatus;
pub use types::TransferType;
pub use types::Version;
pub use types::request_type;

Modules§

descriptors
Standard USB descriptors and a tolerant parser for configuration trees.
hid
Human Interface Devices (HID 1.11) over raw USB: keyboards, mice, game controllers, FIDO tokens, UPS and PSU telemetry, vendor HID gadgets.
hotplug
Hotplug notifications: learning when devices are plugged in or unplugged.
msc
USB Mass Storage: the Bulk-Only Transport and the SCSI commands that USB flash drives, card readers and external disks understand.
net
USB Ethernet adapters: CDC-ECM, CDC-NCM and RNDIS devices (phones sharing their connection, single-board computers in gadget mode, docks, LTE modems, many USB NICs’ standard configurations) as one NetDevice that sends and receives Ethernet frames.
serial
USB serial adapters: CDC-ACM devices (Arduino-style boards, modems, most microcontroller USB stacks) and FTDI chips, behind one SerialPort type.
transfer
Asynchronous transfers: the low-level building block every I/O operation in this crate is made of.
types
Small value types: directions, transfer kinds, speeds, control setup packets, and the standard-request constants from the USB specification.
uvc
USB Video Class (UVC 1.0-1.5): webcams, capture cards, USB microscopes.

Structs§

Context
A library session. Everything else is created from one.
Device
A USB device known to the system.
DeviceHandle
An open USB device.
Error
The error type returned by every fallible operation in this crate.

Enums§

ErrorKind
Broad classification of a failure, modelled on libusb’s error codes.

Type Aliases§

Result
Convenience alias used throughout the crate.