Skip to content

Add initial draft of the USB technology page #440

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Mar 16, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 104 additions & 2 deletions docs/reference/technology/USB.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,105 @@
### USB technology
### USB device stack

[Insert content about USB technology and architecture.]
#### Introduction

A functional Mbed OS USB device consists of three parts - an implementation of USBPhy, the USBDevice stack and a USB component code:

- USBPhy - provides raw access to USB in the role of a USB Device.
- USBDevice - the core of Mbed OS's USB stack and is responsible for state management and synchronization.
- USB component - code that inherits from USBDevice and provides the desired USB interfaces.

<span class="images">![](https://s3-us-west-2.amazonaws.com/mbed-os-docs-images/usb_inheritance_diagram.png)</span>

You can see the interaction of these three components in this diagram:

<span class="images">![](https://s3-us-west-2.amazonaws.com/mbed-os-docs-images/usb_connection_diagram.png)</span>

#### Synchronization

The class USBDevice is an interrupt-safe class. It uses a critical section to provide thread- and interrupt-safe locking. USB components inheriting from USBDevice can use this lock, but it is not required.

The recommended model for synchronizing a USB component is to wrap code requiring synchronization in a call to `USBDevice::lock` and `USBDevice::unlock`. Functions or callbacks that a caller at a higher level has already synchronized should document this locking requirement by calling `USBDevice::assert_locked` in the first line of the function or callback.

Code requiring locking:

```c
void USBComponent::do_something()
{
lock();

// Do do something

unlock();
}
```

Code that expects a caller at a higher level to hold the lock:

```c
void USBComponent::do_something_internal()
{
assert_locked();

// Do do something
}
```

#### USB device state

USB defines 5 separate states a device can be in - Attached, Powered, Default, Address and Configured. Each state adds functionality. The Attached state has the least functionality, and the Configured state has the most functionality.

| State | Functionality |
|:----------:|:----------------------------------------:|
| Attached | Power events |
| Powered | Reset events |
| Default | Control endpoint 0 active |
| Address | No new functionality |
| Configured | All enabled endpoints are functional |

At any time, the USB device can enter a state with less functionality. This could be due to a loss of power event or a surprise USB disconnect. When leaving or outside of the Configured state, USBDevice ignores writes to and reads from all endpoints other than endpoint 0.

#### USB component callbacks

All callbacks USBDevice sends to its children are prefixed with callback_*. USBDevice calls these callbacks with the USB lock held. One notable callback is `callback_state_change`, which USB components can use generically to handle leaving the Configured state. The USB stack automatically exits the Configured state on disconnect, power loss or USB reset.

##### Control request state machine

There are four callbacks that the USB control state machine sends. When USBDevice calls these callbacks, the USB component must return a result to continue the control state machine. The USB component does not need to return the result immediately, which gives it time to process the request. **Note that the USB component must always send the response, regardless of any USB device state changes.**

Table of control callbacks and the required response:

| Callback | Response |
|:-------------------------------------------------:|:----------------------------------------:|
| callback_request(setup_packet) | complete_request(result, data, size) |
| callback_request_xfer_done(setup_packet, aborted) | complete_request_xfer_done(result) |
| callback_set_configuration(configuration) | complete_set_configuration(result) |
| callback_set_interface(interface, alternate) | complete_set_interface(result) |

<span class="images">![](https://s3-us-west-2.amazonaws.com/mbed-os-docs-images/usb_control_state_diagram_user.png)</span>

The USB stack guarantees the setup packet passed to `callback_request` and `callback_request_xfer_done` remains valid and unchanged up to the point the USB component completes the request with `complete_request` and `complete_request_xfer_done`. Additionally, when the USB component calls `complete_request` with the value `Receive` or `Send`, the USB stack guarantees that `callback_request_xfer_done` is called. If the USB component calls `complete_request` with a buffer and size, that buffer must remain valid and unchanged until USBDevice calls the function `callback_request_xfer_done`.

#### IN and OUT state machine for endpoints

A USB component adds and removes endpoints as part of `callback_set_configuration` and `callback_set_interface` to set up the corresponding interface or configuration. Additionally, USBDevice automatically removes all added endpoints if the device leaves the Configured state.

When a USB component adds an endpoint, you can either write to it with `write` or read from it by calling `read_start` and `read_finish`. These functions copy data passed to them, so a USB component can free the buffers or use them for other purposes as soon as the call completes. Note that the buffer size must not exceed the maximum packet size for the given endpoint.

Below is a diagram showing the typical state machine for read (OUT) and write (IN) transfers.

<span class="images">![](https://s3-us-west-2.amazonaws.com/mbed-os-docs-images/usb_endpoint_state_diagram_user.png)</span>

#### Endpoint configuration

To ensure a USB component runs on all supported devices, the USB component must select the configuration descriptor's endpoints based on the current device. This is because endpoint number and endpoint functionality can differ by device. A USB component can determine the features of USBPhy by examining its endpoint table.

To simplify the process of selecting endpoints, we recommend you use the EndpointResolver class. A USB component constructs the class with an endpoint table. The USB component can then call the class to find an endpoint of the given type and size. After the component finds all required endpoints, it can call the function `EndpointResolver::valid()` to determine whether this device supports this configuration. Below is an example of this:

```c++
EndpointResolver resolver(endpoint_table());
resolver.endpoint_ctrl(CDC_MAX_PACKET_SIZE);
bulk_in = resolver.endpoint_in(USB_EP_TYPE_BULK, CDC_MAX_PACKET_SIZE);
bulk_out = resolver.endpoint_out(USB_EP_TYPE_BULK, CDC_MAX_PACKET_SIZE);
int_in = resolver.endpoint_in(USB_EP_TYPE_INT, CDC_MAX_PACKET_SIZE);
MBED_ASSERT(resolver.valid());
```
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions docs/reference/technology/usb/usb_connection_diagram.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36" version="8.3.6" editor="www.draw.io" type="device"><diagram id="4463e230-37c4-1a52-bdc3-bacfdb39cf7a" name="Page-1">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</diagram></mxfile>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36" version="8.4.6" editor="www.draw.io" type="device"><diagram name="Page-1" id="8ce9d11a-91a2-4d17-14d8-a56ed91bf033">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</diagram></mxfile>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36" version="8.4.6" editor="www.draw.io" type="device"><diagram name="Page-1" id="8ce9d11a-91a2-4d17-14d8-a56ed91bf033">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</diagram></mxfile>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions docs/reference/technology/usb/usb_inheritance_diagram.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36" version="8.4.6" editor="www.draw.io" type="device"><diagram name="Page-1" id="9f46799a-70d6-7492-0946-bef42562c5a5">7Vlbb5swFP41PG4CbBL6uKRpO2mTJmWXZwcccGswMiaX/vrZcAihkCjVcqk08hL78/HtfN85NmChabJ5lCSLv4uQcsu1w42F7i3XdbA70n8G2VaI7wAQSRaCUQPM2SsF0Aa0YCHNW4ZKCK5Y1gYDkaY0UC2MSCnWbbOl4O1ZMxLRDjAPCO+if1ioYkAd224aniiLYpja96BhQYKXSIoihfksFy3LX9WckHossM9jEor1HoRmFppKIVRVSjZTyo1va7dV/R4OtO7WLWmqTumA7qoeK8ILWi+5XJja1s6gofYNVIVUsYhESvisQSdBIVfUjOjoSrn7smbr2nORZHXnVKTGOlYJB9vd9o0pJwvKJzsHTgUXsun1TJXaglJIoYSGmsV8EyKrh1RSvNC6s/a/Xf52LTWf2tWTpUjVA0kYNzL9TWVIUgIwzOTUZn0Ddp0N/s9FIQPwHhqDfomMKJghv8KMZ/c6AkWPVCRUya02kJQTxVZtVRIQd7SzawjWBeD4AN/jDt+/5nojI5JkhgJl2BRJpn2u91TDkSp3OyqbF1KXAHmjlIZ6w8Q6ZorOM1J6Yq0TxRHuI07yHMp6fhYc10QTVu8knHH+RleRJCGjDcEAX0oaKyoV3RwlHVpHkCIghSIXffYqZL2XkjBYxXvZaIz+XSjYHRLDhROD300M2LlZYvD7EsM9XTG93iHybxn5rn165I/PEPlOnxJ+xNvZSm8pH8RwUzH4J2vBt8+gBW84BS57CmDUcwrgW50C9Wo6sf+0HuL+unHvet4p9z90qfsfPqCEQQfX1sFtbwPdB8avaUwlO+kmoPeo2nRLmrNXsigNjIcywcylQlt7E8u714jJ3jn41lQ5i1Jd5nRphjKOYwHhXwBWJrNPci0vlkY/yzT/CR9g6ACRFyIO+23iHKePuFEPb+45Tu7ufX5CcmremZUxNkTxVaMYo7YYRr1BbPeIAZ9BDHUK+f+ucc61rnF3Pde4m73lw923uvNiMcT+x4h9B183+Huf5xsx2Kw6z0lq3vR8xAPcxcd57OOt7A776Pkq8m4S797cwlCHwN0D9z6B6P0E6mrz/ads2/vIhmZ/AQ==</diagram></mxfile>