USB Control Endpoint

The USB Control Endpoint plugin allows you to perform low-level interactions with a control endpoint #0 on a USB device.

This comes extremely handy when doing low-level testing or debugging of the USB devices, especially the ones under development. You can read device/configuration/endpoint descriptors, read string identifiers, send custom commands, and so forth.

Unlike all other session plugins, however, there’s a quirk. We can’t just read from a control endpoint and display the acquired bytes in the log as RX. Each “read” transfer must be equipped with parameters — recipient, type, code, value, index. These parameters are specific for each particular read command, so “just reading” — automatically, in the background, like all other plugins do — is not possible.

The approach used by the USB Control Endpoint plugin is as follows. Firstly, you specify all the IN transfer parameters using combo-boxes on the toolbar. Then you prepare a buffer for the transfer by filling the transmit pane with ANY bytes. Note, that you have to choose an appropriate size for the specific transfer type — the more isn’t necessarily the better here!

Finally, hit Send to initiate the transfer. I know, at first, it might seem a bit counter-intuitive to press send when you are in fact about to receive. However, this approach allows for really uniform handling of both OUT and IN control transfers, so we decided to keep things this way.

On a screenshot below you can see the USB Control Endpoint plugin being used to read string descriptors from a bunch of attached USB devices.