aboutsummaryrefslogtreecommitdiffstats
path: root/hal/documentation/usb_device_async.rst
diff options
context:
space:
mode:
Diffstat (limited to 'hal/documentation/usb_device_async.rst')
-rw-r--r--hal/documentation/usb_device_async.rst195
1 files changed, 195 insertions, 0 deletions
diff --git a/hal/documentation/usb_device_async.rst b/hal/documentation/usb_device_async.rst
new file mode 100644
index 0000000..647eec0
--- /dev/null
+++ b/hal/documentation/usb_device_async.rst
@@ -0,0 +1,195 @@
+The USB Device Asynchronous Driver
+==================================
+
+Universal Serial Bus (USB) is an industry standard that defines the cables,
+connectors and communication protocols used in a bus for connection,
+communication, and power supply between computers and electronic devices.
+
+The USB device driver provides necessary APIs to support USB Device states and
+USB data flow. So that the USB Device enumeration, class and vendor support can
+be implemented base on it. The driver is asynchronous, which means that all USB
+data processing is done in callbacks..
+
+To be recognized by a host, a USB device must handle a subset of the USB events.
+The USB device should build up control communication to report its descriptors
+to the host and accept host's requests. An application or upper stack that uses
+the USB device driver should have its descriptors prepared, catch the callbacks,
+monitor the control requests and handle them correctly.
+Usually, a USB device application that can be enumerated may use the following
+sequence:
+
+* Initialize
+* Register callback and handle Reset event, where:
+
+ * Initialize endpoint 0
+ * Register callbacks for endpoint 0, where some of the standard requests
+ defined in Chapter 9, USB specification
+ (see `USB 2.0 Documents <http://www.usb.org/developers/docs/usb20_docs>`_)
+ are handled
+
+ * Setup request handling callback
+
+ * On *GetDeviceDescriptor* request, sends device descriptor
+ * On *GetConfigurationDescriptor* request, sends configuration descriptors
+ * On *SetAddress* request sends no data, just goes to status phase
+ * On *SetConfigure* request initialize and enable other endpoints, sends
+ no data, just goes to status phase
+ * Transfer done handling callback
+
+ * On *SetAddress* request apply the new address
+ * On *SetConfigure* request a global variable can be set to indicates
+ that the host driver is loaded and device is ready to work
+ * Enable endpoint 0
+* Enable
+* Attach device
+
+To support USB transfer on endpoints, endpoints information is stored
+by the driver internally, including control request data, endpoint status,
+callbacks and transfer data pointers. The number of endpoints that the driver
+can support is defined through configuration. To optimize RAM usage, the
+number of endpoints the driver needs to support should be minimized.
+
+Features
+--------
+
+* Initialization/de-initialization
+* Enabling/disabling
+* USB device attachment/detachment
+* USB device address control
+* USB working speed status
+* USB device frame number and micro frame number status
+* Sending remote wakeup to host
+* Callback management for following USB events:
+
+ * Start of Frame (SOF)
+ * Other USB events:
+
+ * VBus change
+ * Reset
+ * Wakeup
+ * Linked Power Management (LPM) Suspend
+ * Suspend
+ * Error
+* Endpoints management:
+
+ * Endpoint initialization/de-initialization
+ * Endpoint enabling/disabling
+ * Control endpoint setup request packet
+ * Data transfer and abort
+ * Endpoint halt state control
+ * Endpoint status, including:
+
+ * Endpoint address
+ * Last transfer result status code
+ * Last error status code
+ * Current transfer state
+ * Transfer size and done count
+ * Endpoint callback management for endpoint and its transfer events:
+
+ * In case a setup request received on control endpoint
+ * In case transfer finished with/without error
+
+Applications
+------------
+
+USB Device stack, to monitor USB events, handle control requests and process
+data.
+
+Dependencies
+------------
+
+* USB device capable hardware
+* 48MHz clock for low-speed and full-speed and 480MHz clock for high-speed
+
+Concurrency
+-----------
+
+N/A
+
+Limitations
+-----------
+
+* When a buffer is used by a USB endpoint to transfer data, it must be kept
+ unchanged while the transfer is in progress.
+* After receiving a request that has no data expected, the transfer function
+ must be called with data length zero to complete control status phase.
+
+Known issues and workarounds
+----------------------------
+
+N/A
+
+Considerations for D21 USB
+--------------------------
+
+Clocks
+^^^^^^
+
+DFLL must be used to generate 48MHz clock for USB device with either of the
+following mode:
+
+* USB Clock Recovery Mode
+
+ * Set "DFLL Enable", "Bypass Coarse Lock", "Chill Cycle Disable",
+ "USB Clock Recovery Mode", "Stable DFLL Frequency"
+ * Clear "Wait Lock"
+ * Leave "Operating Mode Selection" to "Closed Loop Mode"
+
+* Closed Loop Mode
+
+ * Set "DFLL Enable"
+ * Clear "USB Clock Recovery Mode", "Stable DFLL Frequency"
+ * Select "Closed Loop Mode" of "Operating Mode Selection"
+ * Set "DFLL Multiply Factor" to 1464 or 1465 (48000000/32768)
+ * Select "Reference Clock Source" to use 32768Hz source, e.g., use GCLK1 and
+ for GCLK1 settings:
+
+ * Set "Generic Clock Generator Enable"
+ * Select "XOSC32K" of "Generic clock generator 1 source", and for XOSC32K
+ settings:
+
+ * Set "External 32K Oscillator Enable", "Enable 32KHz Output",
+ "Enable XTAL"
+ * Set a right value for "Startup time for the 32K Oscillator", e.g.,
+ 1125092 us
+
+Endpoints
+^^^^^^^^^
+
+Each USB device endpoint number supports two endpoint addresses, corresponding
+to IN and OUT endpoint. E.g., for endpoint 1, the endpoint IN has address 0x81
+and endpoint OUT has address 0x01. Thus, the possible supported endpoint
+addresses are almost two times of max endpoint number (endpoint 0 must be used
+as control endpoint instead of dedicated IN and OUT endpoints).
+
+Buffering and RAM usage optimization
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+When transferring data through USB device endpoints, buffer pointers can be
+used to let endpoint get access to the buffer, but there are some limits:
+
+* For control endpoint there must always be a buffer available to put received
+ setup packet.
+* For IN endpoint (transmit to host) the data must in RAM.
+* For OUT endpoint (receive from host) the data pointer must be aligned, and
+ the data size must be aligned by max endpoint size and not zero.
+
+The driver has option for each endpoint to allocate internal static buffer as
+cache to buffer input/output data, to remove upper limits. The configuration
+affects the parameter check of transfer functions, and the RAM usage.
+
+* For control endpoints, cache buffer must be enabled to fill setup packet.
+ In addition, to support unaligned OUT packet and IN packet inside flash, the
+ buffer size must be equal to or larger than max endpoint size.
+* For OUT endpoints, if the cache is allocated, it's possible to pass unaligned
+ buffer address and buffer size to transfer function. Else the transfer
+ function only accepts aligned buffer with it's size multiple of endpoint
+ packet size.
+* For IN endpoints, if the cache is allocated, it's possible to pass buffer
+ pointer to internal flash or other memory part other than RAM to the transfer
+ function.
+
+To optimize the RAM usage, the configuration of max endpoint number, max number
+of endpoints supported and the buffer usage of used input and/or output
+endpoints can be adjusted.
+