#no-std #embedded #usb

no-std usb-device

Experimental device-side USB stack for embedded devices

6 releases

✓ Uses Rust 2018 edition

0.2.5 Feb 10, 2020
0.2.4 Feb 1, 2020
0.2.3 Aug 27, 2019
0.2.2 Jul 27, 2019
0.1.0 Dec 24, 2018

#25 in Embedded development

Download history 143/week @ 2020-03-25 309/week @ 2020-04-01 230/week @ 2020-04-08 277/week @ 2020-04-15 358/week @ 2020-04-22 1063/week @ 2020-04-29 1169/week @ 2020-05-06 494/week @ 2020-05-13 228/week @ 2020-05-20 211/week @ 2020-05-27 250/week @ 2020-06-03 297/week @ 2020-06-10 384/week @ 2020-06-17 480/week @ 2020-06-24 619/week @ 2020-07-01 185/week @ 2020-07-08

957 downloads per month
Used in 32 crates (30 directly)

MIT license

1.5K SLoC


Experimental device-side USB stack for embedded devices in Rust.

This crate is still under development and should not be considered production ready or even USB compliant.

The UsbDevice object represents a composite USB device and is the most important object for application implementors. The UsbDevice combines a number of UsbClasses (either custom ones, or pre-existing ones provided by other crates) and a UsbBus device drives to implement the USB device.

The UsbClass trait can be used to implemented USB classes such as a HID device or a serial port. An implementation may also use a custom class if the required functionality isn't covered by a standard class.

The UsbBus trait is intended to be implemented by device-specific crates to provide a driver for each device's USB peripheral.

Hardware driver crates

  • stm32-usbd - device-driver implementation for multiple STM32 microcontroller families. Examples can be found in stm32-usbd-examples.

  • atsamd - device-driver implementation for samd21 & samd51 microcontrollers. An example for the itsybitsy_m4 board from Adafruit can be found here.

Class crates


Features planned but not implemented yet:

  • Interface alternate settings
  • Multilingual string descriptors
  • Isochronous endpoints

Features not planning to support at the moment:

  • More than one configuration descriptor (uncommon in practice)

No runtime deps