[LINUX] USB Raw Gadget

https://www.kernel.org/doc/html/latest/usb/raw-gadget.html

USB Raw Gadget, unterstützt von Linux Kernel 5.7-rc1! Du hast es geschafft! !! Sie können jetzt ein USB-Gadget mit einer Anwendung zum Verschieben des Benutzerraums erstellen!


Docs » USB support » USB Raw Gadget

USB Raw Gadget

USB Raw Gadget is a kernel module that provides a userspace interface for the USB Gadget subsystem. Essentially it allows to emulate USB devices from userspace. Enabled with CONFIG_USB_RAW_GADGET. Raw Gadget is currently a strictly debugging feature and shouldn’t be used in production, use GadgetFS instead.

USB Raw Gadget bietet eine Benutzeroberfläche für das USB Gadget-Subsystem. Im Wesentlichen können Sie ein USB-Gerät aus dem Benutzerbereich emulieren. Bitte aktivieren Sie CONF_USB_RAW_GADGET. Raw Gadget ist eine Funktion, die derzeit streng getestet wird und nicht im Produkt verwendet werden sollte. Verwenden Sie stattdessen GadgetFS.

Comparison to GadgetFS

Raw Gadget is similar to GadgetFS, but provides a more low-level and direct access to the USB Gadget layer for the userspace. The key differences are:

Raw Gadget ähnelt GadgetFS, bietet jedoch direkten Zugriff vom Benutzerbereich auf die USB-Gadget-Ebene auf niedriger Ebene. Die Hauptunterschiede sind wie folgt.

1. Every USB request is passed to the userspace to get a response, while GadgetFS responds to some USB requests internally based on the provided descriptors. However note, that the UDC driver might respond to some requests on its own and never forward them to the Gadget layer.

  1. Alle USB-Anforderungen werden zur Antwort an den Benutzerbereich weitergeleitet. GadgetFS antwortet intern auf einige USB-Anfragen gemäß dem bereitgestellten Deskriptor. Der UDC-Treiber reagiert jedoch möglicherweise selbstständig auf einige Anforderungen und leitet sie nicht an die Gadget-Ebene weiter.

2. GadgetFS performs some sanity checks on the provided USB descriptors, while Raw Gadget allows you to provide arbitrary data as responses to USB requests.

  1. GadgetFS überprüft die Gültigkeit des bereitgestellten USB-Deskriptors. Raw Gadget kann als Antwort auf eine USB-Anfrage beliebige Daten bereitstellen.

3. Raw Gadget provides a way to select a UDC device/driver to bind to, while GadgetFS currently binds to the first available UDC.

  1. Raw Gadget bietet eine Möglichkeit, das zu bindende UDC-Gerät / den UDC-Treiber auszuwählen. GadgetFS bindet jedoch derzeit das erste gültige UDC.

4. Raw Gadget uses predictable endpoint names (handles) across different UDCs (as long as UDCs have enough endpoints of each required transfer type)

  1. Raw Gadget verwendet einen vorhersagbaren Endpunktnamen (Handke) für verschiedene UDCs (vorausgesetzt, es gibt genügend Endpunkte für jeden Übertragungstyp. UDC erfordert).

5.Raw Gadget has ioctl-based interface instead of a filesystem-based one.

  1. Raw Gadge bietet eine uictl-basierte Schnittstelle anstelle einer dateisystembasierten.

Userspace interface

To create a Raw Gadget instance open /dev/raw-gadget. Multiple raw-gadget instances (bound to different UDCs) can be used at the same time. The interaction with the opened file happens through the ioctl() calls, see comments in include/uapi/linux/usb/raw_gadget.h for details.

Öffnen Sie / dev / raw-gadet, um eine Raw-Gadget-Instanz zu erstellen. Es können mehrere Raw-Gadget-Instanzen gleichzeitig verfügbar sein (für verschiedene UDCs). Rufen Sie ioctl () auf, um mit der geöffneten Datei zu interagieren. Weitere Informationen finden Sie in den Kommentaren in include / uapi / linux / usb / raw_gadget.h.

The typical usage of Raw Gadget looks like:

Die typische Verwendung von Raw Gadget ist wie folgt.

1. Open Raw Gadget instance via /dev/raw-gadget. 2. Initialize the instance via USB_RAW_IOCTL_INIT. 3. Launch the instance with USB_RAW_IOCTL_RUN. 4. In a loop issue USB_RAW_IOCTL_EVENT_FETCH calls to receive events from Raw Gadget and react to those depending on what kind of USB device needs to be emulated.

    1. Öffnen Sie eine Raw Gadget-Instanz über / dev / raw-gadet.
  1. Initialisieren Sie die Instanz mit USB_RAW_IOCTL_INIT.
    1. Starten Sie die Instanz mit USB_RAW_IOCTL_RUN.
  2. Mit RAW_IOCTL_EVENT_FETCH wird eine Schleife ausgeführt, während Ereignisse von Raw Gadget empfangen werden, und es wird wie ein USB-Gerät reagiert, um es zu emulieren.

Potential future improvements

・ Implementieren Sie ioctl zum Festlegen / Löschen des Stoppstatus auf Endpunkten. ・ Weitere Ereignisse (Anhalten, Fortsetzen usw.) über USB_RAW_IOCTL_EVENT_FETCH melden. ・ Unterstützt O_NONBLOCK I / O.

-Implementierung von ioctl zum Setzen / Löschen des Stoppstatus des Endpunkts


Ursprünglich ist es Teil des Quellcodes des Linux-Kernels, daher wird es als GPLv2 behandelt (Anerkennung, dass es sein sollte).

https://www.kernel.org/doc/html/latest/index.html

Licensing documentation

The following describes the license of the Linux kernel source code (GPLv2), how to properly mark the license of individual files in the source tree, as well as links to the full license text.

https://www.kernel.org/doc/html/latest/process/license-rules.html#kernel-licensing

Recommended Posts

USB Raw Gadget
rohe Schnur