#usb #gadget #linux-kernel #peripheral #configfs #functionfs

usb-gadget

Expose standard or fully custom USB peripherals (gadgets) through a USB device controller (UDC) on Linux

12 releases (6 breaking)

0.7.2 Jun 25, 2024
0.7.0 Mar 14, 2024
0.6.0 Nov 11, 2023

#348 in Hardware support

Download history 44/week @ 2024-06-16 154/week @ 2024-06-23 144/week @ 2024-06-30 95/week @ 2024-07-07 54/week @ 2024-07-14 98/week @ 2024-07-28 18/week @ 2024-08-04 14/week @ 2024-08-11 21/week @ 2024-08-18 15/week @ 2024-08-25 13/week @ 2024-09-01 22/week @ 2024-09-08 31/week @ 2024-09-15 64/week @ 2024-09-22 39/week @ 2024-09-29

158 downloads per month
Used in 3 crates

Apache-2.0

180KB
4K SLoC

usb-gadget

crates.io page docs.rs page Apache 2.0 license

This library allows implementation of USB peripherals, so called USB gadgets, on Linux devices that have a USB device controller (UDC). Both, pre-defined USB functions and fully custom implementations of the USB interface are supported.

The following pre-defined USB functions, implemented by kernel drivers, are available:

  • network interface
    • CDC ECM
    • CDC ECM (subset)
    • CDC EEM
    • CDC NCM
    • RNDIS
  • serial port
    • CDC ACM
    • generic
  • human interface device (HID)
  • mass-storage device (MSD)

In addition fully custom USB functions can be implemented in user-mode Rust code.

Support for OS-specific descriptors and WebUSB is also provided.

Features

This crate provides the following optional features:

  • tokio: enables async support for custom USB functions on top of the Tokio runtime.

Requirements

The minimum support Rust version (MSRV) is 1.73.

A USB device controller (UDC) supported by Linux is required. Normally, standard PCs do not include an UDC. A Raspberry Pi 4 contains an UDC, which is connected to its USB-C port.

The following Linux kernel configuration options should be enabled for full functionality:

  • CONFIG_USB_GADGET
  • CONFIG_USB_CONFIGFS
  • CONFIG_USB_CONFIGFS_SERIAL
  • CONFIG_USB_CONFIGFS_ACM
  • CONFIG_USB_CONFIGFS_NCM
  • CONFIG_USB_CONFIGFS_ECM
  • CONFIG_USB_CONFIGFS_ECM_SUBSET
  • CONFIG_USB_CONFIGFS_RNDIS
  • CONFIG_USB_CONFIGFS_EEM
  • CONFIG_USB_CONFIGFS_MASS_STORAGE
  • CONFIG_USB_CONFIGFS_F_FS
  • CONFIG_USB_CONFIGFS_F_HID

root permissions are required to configure USB gadgets on Linux and the configfs filesystem needs to be mounted.

License

usb-gadget is licensed under the Apache 2.0 license.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in usb-gadget by you, shall be licensed as Apache 2.0, without any additional terms or conditions.

Dependencies

~2–11MB
~120K SLoC