#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

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

#250 in Hardware support

Download history 19/week @ 2024-10-04 4/week @ 2024-10-18 2/week @ 2024-10-25 24/week @ 2024-11-01 41/week @ 2024-11-08 199/week @ 2024-11-15 118/week @ 2024-11-22 234/week @ 2024-11-29 239/week @ 2024-12-06 64/week @ 2024-12-13 13/week @ 2024-12-20 3/week @ 2024-12-27 47/week @ 2025-01-03 63/week @ 2025-01-10 91/week @ 2025-01-17

204 downloads per month
Used in 4 crates (3 directly)

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