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

usb-gadget

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

11 releases (6 breaking)

0.7.1 Apr 22, 2024
0.7.0 Mar 14, 2024
0.6.0 Nov 11, 2023
0.5.2 Nov 9, 2023
0.1.0 Sep 29, 2023

#153 in Unix APIs

Download history 8/week @ 2024-01-22 44/week @ 2024-02-05 3/week @ 2024-02-12 5/week @ 2024-02-19 46/week @ 2024-02-26 16/week @ 2024-03-04 148/week @ 2024-03-11 31/week @ 2024-03-18 16/week @ 2024-03-25 29/week @ 2024-04-01 19/week @ 2024-04-08 63/week @ 2024-04-15 178/week @ 2024-04-22 16/week @ 2024-04-29 24/week @ 2024-05-06

282 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–14MB
~140K SLoC