| ============== |
| 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. |
| |
| 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: |
| |
| 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. |
| |
| 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. |
| |
| 3. Raw Gadget provides a way to select a UDC device/driver to bind to, |
| while GadgetFS currently binds to the first available UDC. |
| |
| 4. Raw Gadget uses predictable endpoint names (handles) across different |
| UDCs (as long as UDCs have enough endpoints of each required transfer |
| type). |
| |
| 5. Raw Gadget has ioctl-based interface instead of a filesystem-based one. |
| |
| 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. |
| |
| The typical usage of Raw Gadget looks like: |
| |
| 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. |
| |
| Potential future improvements |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| - Implement ioctl's for setting/clearing halt status on endpoints. |
| |
| - Reporting more events (suspend, resume, etc.) through |
| USB_RAW_IOCTL_EVENT_FETCH. |
| |
| - Support O_NONBLOCK I/O. |