usb: raw-gadget: support stalling/halting/wedging endpoints
[platform/kernel/linux-starfive.git] / Documentation / usb / raw-gadget.rst
1 ==============
2 USB Raw Gadget
3 ==============
4
5 USB Raw Gadget is a kernel module that provides a userspace interface for
6 the USB Gadget subsystem. Essentially it allows to emulate USB devices
7 from userspace. Enabled with CONFIG_USB_RAW_GADGET. Raw Gadget is
8 currently a strictly debugging feature and shouldn't be used in
9 production, use GadgetFS instead.
10
11 Comparison to GadgetFS
12 ~~~~~~~~~~~~~~~~~~~~~~
13
14 Raw Gadget is similar to GadgetFS, but provides a more low-level and
15 direct access to the USB Gadget layer for the userspace. The key
16 differences are:
17
18 1. Every USB request is passed to the userspace to get a response, while
19    GadgetFS responds to some USB requests internally based on the provided
20    descriptors. However note, that the UDC driver might respond to some
21    requests on its own and never forward them to the Gadget layer.
22
23 2. GadgetFS performs some sanity checks on the provided USB descriptors,
24    while Raw Gadget allows you to provide arbitrary data as responses to
25    USB requests.
26
27 3. Raw Gadget provides a way to select a UDC device/driver to bind to,
28    while GadgetFS currently binds to the first available UDC.
29
30 4. Raw Gadget explicitly exposes information about endpoints addresses and
31    capabilities allowing a user to write UDC-agnostic gadgets.
32
33 5. Raw Gadget has ioctl-based interface instead of a filesystem-based one.
34
35 Userspace interface
36 ~~~~~~~~~~~~~~~~~~~
37
38 To create a Raw Gadget instance open /dev/raw-gadget. Multiple raw-gadget
39 instances (bound to different UDCs) can be used at the same time. The
40 interaction with the opened file happens through the ioctl() calls, see
41 comments in include/uapi/linux/usb/raw_gadget.h for details.
42
43 The typical usage of Raw Gadget looks like:
44
45 1. Open Raw Gadget instance via /dev/raw-gadget.
46 2. Initialize the instance via USB_RAW_IOCTL_INIT.
47 3. Launch the instance with USB_RAW_IOCTL_RUN.
48 4. In a loop issue USB_RAW_IOCTL_EVENT_FETCH calls to receive events from
49    Raw Gadget and react to those depending on what kind of USB device
50    needs to be emulated.
51
52 Potential future improvements
53 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
54
55 - Reporting more events (suspend, resume, etc.) through
56   USB_RAW_IOCTL_EVENT_FETCH.
57
58 - Support O_NONBLOCK I/O.