#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

15 releases

new 0.7.5 Dec 6, 2024
0.7.4 Nov 29, 2024
0.7.2 Jun 25, 2024
0.7.0 Mar 14, 2024
0.6.0 Nov 11, 2023

#230 in Hardware support

Download history 22/week @ 2024-08-19 19/week @ 2024-08-26 7/week @ 2024-09-02 23/week @ 2024-09-09 31/week @ 2024-09-16 67/week @ 2024-09-23 36/week @ 2024-09-30 6/week @ 2024-10-07 6/week @ 2024-10-21 38/week @ 2024-11-04 37/week @ 2024-11-11 238/week @ 2024-11-18 222/week @ 2024-11-25 222/week @ 2024-12-02

720 downloads per month
Used in 3 crates

Apache-2.0

215KB
4.5K 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)
  • printer device
  • musical instrument digital interface (MIDI)
  • audio device (UAC2)
  • video device (UVC)

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
  • CONFIG_USB_CONFIGFS_F_PRINTER
  • CONFIG_USB_CONFIGFS_F_MIDI
  • CONFIG_USB_CONFIGFS_F_UAC2
  • CONFIG_USB_CONFIGFS_F_UVC

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
~123K SLoC