|
@@ -1,793 +0,0 @@
|
|
|
-<?xml version="1.0" encoding="UTF-8"?>
|
|
|
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
|
|
- "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
|
|
|
-
|
|
|
-<book id="USB-Gadget-API">
|
|
|
- <bookinfo>
|
|
|
- <title>USB Gadget API for Linux</title>
|
|
|
- <date>20 August 2004</date>
|
|
|
- <edition>20 August 2004</edition>
|
|
|
-
|
|
|
- <legalnotice>
|
|
|
- <para>
|
|
|
- This documentation is free software; you can redistribute
|
|
|
- it and/or modify it under the terms of the GNU General Public
|
|
|
- License as published by the Free Software Foundation; either
|
|
|
- version 2 of the License, or (at your option) any later
|
|
|
- version.
|
|
|
- </para>
|
|
|
-
|
|
|
- <para>
|
|
|
- This program is distributed in the hope that it will be
|
|
|
- useful, but WITHOUT ANY WARRANTY; without even the implied
|
|
|
- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
- See the GNU General Public License for more details.
|
|
|
- </para>
|
|
|
-
|
|
|
- <para>
|
|
|
- You should have received a copy of the GNU General Public
|
|
|
- License along with this program; if not, write to the Free
|
|
|
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
|
- MA 02111-1307 USA
|
|
|
- </para>
|
|
|
-
|
|
|
- <para>
|
|
|
- For more details see the file COPYING in the source
|
|
|
- distribution of Linux.
|
|
|
- </para>
|
|
|
- </legalnotice>
|
|
|
- <copyright>
|
|
|
- <year>2003-2004</year>
|
|
|
- <holder>David Brownell</holder>
|
|
|
- </copyright>
|
|
|
-
|
|
|
- <author>
|
|
|
- <firstname>David</firstname>
|
|
|
- <surname>Brownell</surname>
|
|
|
- <affiliation>
|
|
|
- <address><email>dbrownell@users.sourceforge.net</email></address>
|
|
|
- </affiliation>
|
|
|
- </author>
|
|
|
- </bookinfo>
|
|
|
-
|
|
|
-<toc></toc>
|
|
|
-
|
|
|
-<chapter id="intro"><title>Introduction</title>
|
|
|
-
|
|
|
-<para>This document presents a Linux-USB "Gadget"
|
|
|
-kernel mode
|
|
|
-API, for use within peripherals and other USB devices
|
|
|
-that embed Linux.
|
|
|
-It provides an overview of the API structure,
|
|
|
-and shows how that fits into a system development project.
|
|
|
-This is the first such API released on Linux to address
|
|
|
-a number of important problems, including: </para>
|
|
|
-
|
|
|
-<itemizedlist>
|
|
|
- <listitem><para>Supports USB 2.0, for high speed devices which
|
|
|
- can stream data at several dozen megabytes per second.
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>Handles devices with dozens of endpoints just as
|
|
|
- well as ones with just two fixed-function ones. Gadget drivers
|
|
|
- can be written so they're easy to port to new hardware.
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>Flexible enough to expose more complex USB device
|
|
|
- capabilities such as multiple configurations, multiple interfaces,
|
|
|
- composite devices,
|
|
|
- and alternate interface settings.
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>USB "On-The-Go" (OTG) support, in conjunction
|
|
|
- with updates to the Linux-USB host side.
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>Sharing data structures and API models with the
|
|
|
- Linux-USB host side API. This helps the OTG support, and
|
|
|
- looks forward to more-symmetric frameworks (where the same
|
|
|
- I/O model is used by both host and device side drivers).
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>Minimalist, so it's easier to support new device
|
|
|
- controller hardware. I/O processing doesn't imply large
|
|
|
- demands for memory or CPU resources.
|
|
|
- </para></listitem>
|
|
|
-</itemizedlist>
|
|
|
-
|
|
|
-
|
|
|
-<para>Most Linux developers will not be able to use this API, since they
|
|
|
-have USB "host" hardware in a PC, workstation, or server.
|
|
|
-Linux users with embedded systems are more likely to
|
|
|
-have USB peripheral hardware.
|
|
|
-To distinguish drivers running inside such hardware from the
|
|
|
-more familiar Linux "USB device drivers",
|
|
|
-which are host side proxies for the real USB devices,
|
|
|
-a different term is used:
|
|
|
-the drivers inside the peripherals are "USB gadget drivers".
|
|
|
-In USB protocol interactions, the device driver is the master
|
|
|
-(or "client driver")
|
|
|
-and the gadget driver is the slave (or "function driver").
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>The gadget API resembles the host side Linux-USB API in that both
|
|
|
-use queues of request objects to package I/O buffers, and those requests
|
|
|
-may be submitted or canceled.
|
|
|
-They share common definitions for the standard USB
|
|
|
-<emphasis>Chapter 9</emphasis> messages, structures, and constants.
|
|
|
-Also, both APIs bind and unbind drivers to devices.
|
|
|
-The APIs differ in detail, since the host side's current
|
|
|
-URB framework exposes a number of implementation details
|
|
|
-and assumptions that are inappropriate for a gadget API.
|
|
|
-While the model for control transfers and configuration
|
|
|
-management is necessarily different (one side is a hardware-neutral master,
|
|
|
-the other is a hardware-aware slave), the endpoint I/0 API used here
|
|
|
-should also be usable for an overhead-reduced host side API.
|
|
|
-</para>
|
|
|
-
|
|
|
-</chapter>
|
|
|
-
|
|
|
-<chapter id="structure"><title>Structure of Gadget Drivers</title>
|
|
|
-
|
|
|
-<para>A system running inside a USB peripheral
|
|
|
-normally has at least three layers inside the kernel to handle
|
|
|
-USB protocol processing, and may have additional layers in
|
|
|
-user space code.
|
|
|
-The "gadget" API is used by the middle layer to interact
|
|
|
-with the lowest level (which directly handles hardware).
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>In Linux, from the bottom up, these layers are:
|
|
|
-</para>
|
|
|
-
|
|
|
-<variablelist>
|
|
|
-
|
|
|
- <varlistentry>
|
|
|
- <term><emphasis>USB Controller Driver</emphasis></term>
|
|
|
-
|
|
|
- <listitem>
|
|
|
- <para>This is the lowest software level.
|
|
|
- It is the only layer that talks to hardware,
|
|
|
- through registers, fifos, dma, irqs, and the like.
|
|
|
- The <filename><linux/usb/gadget.h></filename> API abstracts
|
|
|
- the peripheral controller endpoint hardware.
|
|
|
- That hardware is exposed through endpoint objects, which accept
|
|
|
- streams of IN/OUT buffers, and through callbacks that interact
|
|
|
- with gadget drivers.
|
|
|
- Since normal USB devices only have one upstream
|
|
|
- port, they only have one of these drivers.
|
|
|
- The controller driver can support any number of different
|
|
|
- gadget drivers, but only one of them can be used at a time.
|
|
|
- </para>
|
|
|
-
|
|
|
- <para>Examples of such controller hardware include
|
|
|
- the PCI-based NetChip 2280 USB 2.0 high speed controller,
|
|
|
- the SA-11x0 or PXA-25x UDC (found within many PDAs),
|
|
|
- and a variety of other products.
|
|
|
- </para>
|
|
|
-
|
|
|
- </listitem></varlistentry>
|
|
|
-
|
|
|
- <varlistentry>
|
|
|
- <term><emphasis>Gadget Driver</emphasis></term>
|
|
|
-
|
|
|
- <listitem>
|
|
|
- <para>The lower boundary of this driver implements hardware-neutral
|
|
|
- USB functions, using calls to the controller driver.
|
|
|
- Because such hardware varies widely in capabilities and restrictions,
|
|
|
- and is used in embedded environments where space is at a premium,
|
|
|
- the gadget driver is often configured at compile time
|
|
|
- to work with endpoints supported by one particular controller.
|
|
|
- Gadget drivers may be portable to several different controllers,
|
|
|
- using conditional compilation.
|
|
|
- (Recent kernels substantially simplify the work involved in
|
|
|
- supporting new hardware, by <emphasis>autoconfiguring</emphasis>
|
|
|
- endpoints automatically for many bulk-oriented drivers.)
|
|
|
- Gadget driver responsibilities include:
|
|
|
- </para>
|
|
|
- <itemizedlist>
|
|
|
- <listitem><para>handling setup requests (ep0 protocol responses)
|
|
|
- possibly including class-specific functionality
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>returning configuration and string descriptors
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>(re)setting configurations and interface
|
|
|
- altsettings, including enabling and configuring endpoints
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>handling life cycle events, such as managing
|
|
|
- bindings to hardware,
|
|
|
- USB suspend/resume, remote wakeup,
|
|
|
- and disconnection from the USB host.
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>managing IN and OUT transfers on all currently
|
|
|
- enabled endpoints
|
|
|
- </para></listitem>
|
|
|
- </itemizedlist>
|
|
|
-
|
|
|
- <para>
|
|
|
- Such drivers may be modules of proprietary code, although
|
|
|
- that approach is discouraged in the Linux community.
|
|
|
- </para>
|
|
|
- </listitem></varlistentry>
|
|
|
-
|
|
|
- <varlistentry>
|
|
|
- <term><emphasis>Upper Level</emphasis></term>
|
|
|
-
|
|
|
- <listitem>
|
|
|
- <para>Most gadget drivers have an upper boundary that connects
|
|
|
- to some Linux driver or framework in Linux.
|
|
|
- Through that boundary flows the data which the gadget driver
|
|
|
- produces and/or consumes through protocol transfers over USB.
|
|
|
- Examples include:
|
|
|
- </para>
|
|
|
- <itemizedlist>
|
|
|
- <listitem><para>user mode code, using generic (gadgetfs)
|
|
|
- or application specific files in
|
|
|
- <filename>/dev</filename>
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>networking subsystem (for network gadgets,
|
|
|
- like the CDC Ethernet Model gadget driver)
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>data capture drivers, perhaps video4Linux or
|
|
|
- a scanner driver; or test and measurement hardware.
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>input subsystem (for HID gadgets)
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>sound subsystem (for audio gadgets)
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>file system (for PTP gadgets)
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>block i/o subsystem (for usb-storage gadgets)
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>... and more </para></listitem>
|
|
|
- </itemizedlist>
|
|
|
- </listitem></varlistentry>
|
|
|
-
|
|
|
- <varlistentry>
|
|
|
- <term><emphasis>Additional Layers</emphasis></term>
|
|
|
-
|
|
|
- <listitem>
|
|
|
- <para>Other layers may exist.
|
|
|
- These could include kernel layers, such as network protocol stacks,
|
|
|
- as well as user mode applications building on standard POSIX
|
|
|
- system call APIs such as
|
|
|
- <emphasis>open()</emphasis>, <emphasis>close()</emphasis>,
|
|
|
- <emphasis>read()</emphasis> and <emphasis>write()</emphasis>.
|
|
|
- On newer systems, POSIX Async I/O calls may be an option.
|
|
|
- Such user mode code will not necessarily be subject to
|
|
|
- the GNU General Public License (GPL).
|
|
|
- </para>
|
|
|
- </listitem></varlistentry>
|
|
|
-
|
|
|
-
|
|
|
-</variablelist>
|
|
|
-
|
|
|
-<para>OTG-capable systems will also need to include a standard Linux-USB
|
|
|
-host side stack,
|
|
|
-with <emphasis>usbcore</emphasis>,
|
|
|
-one or more <emphasis>Host Controller Drivers</emphasis> (HCDs),
|
|
|
-<emphasis>USB Device Drivers</emphasis> to support
|
|
|
-the OTG "Targeted Peripheral List",
|
|
|
-and so forth.
|
|
|
-There will also be an <emphasis>OTG Controller Driver</emphasis>,
|
|
|
-which is visible to gadget and device driver developers only indirectly.
|
|
|
-That helps the host and device side USB controllers implement the
|
|
|
-two new OTG protocols (HNP and SRP).
|
|
|
-Roles switch (host to peripheral, or vice versa) using HNP
|
|
|
-during USB suspend processing, and SRP can be viewed as a
|
|
|
-more battery-friendly kind of device wakeup protocol.
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>Over time, reusable utilities are evolving to help make some
|
|
|
-gadget driver tasks simpler.
|
|
|
-For example, building configuration descriptors from vectors of
|
|
|
-descriptors for the configurations interfaces and endpoints is
|
|
|
-now automated, and many drivers now use autoconfiguration to
|
|
|
-choose hardware endpoints and initialize their descriptors.
|
|
|
-
|
|
|
-A potential example of particular interest
|
|
|
-is code implementing standard USB-IF protocols for
|
|
|
-HID, networking, storage, or audio classes.
|
|
|
-Some developers are interested in KDB or KGDB hooks, to let
|
|
|
-target hardware be remotely debugged.
|
|
|
-Most such USB protocol code doesn't need to be hardware-specific,
|
|
|
-any more than network protocols like X11, HTTP, or NFS are.
|
|
|
-Such gadget-side interface drivers should eventually be combined,
|
|
|
-to implement composite devices.
|
|
|
-</para>
|
|
|
-
|
|
|
-</chapter>
|
|
|
-
|
|
|
-
|
|
|
-<chapter id="api"><title>Kernel Mode Gadget API</title>
|
|
|
-
|
|
|
-<para>Gadget drivers declare themselves through a
|
|
|
-<emphasis>struct usb_gadget_driver</emphasis>, which is responsible for
|
|
|
-most parts of enumeration for a <emphasis>struct usb_gadget</emphasis>.
|
|
|
-The response to a set_configuration usually involves
|
|
|
-enabling one or more of the <emphasis>struct usb_ep</emphasis> objects
|
|
|
-exposed by the gadget, and submitting one or more
|
|
|
-<emphasis>struct usb_request</emphasis> buffers to transfer data.
|
|
|
-Understand those four data types, and their operations, and
|
|
|
-you will understand how this API works.
|
|
|
-</para>
|
|
|
-
|
|
|
-<note><title>Incomplete Data Type Descriptions</title>
|
|
|
-
|
|
|
-<para>This documentation was prepared using the standard Linux
|
|
|
-kernel <filename>docproc</filename> tool, which turns text
|
|
|
-and in-code comments into SGML DocBook and then into usable
|
|
|
-formats such as HTML or PDF.
|
|
|
-Other than the "Chapter 9" data types, most of the significant
|
|
|
-data types and functions are described here.
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>However, docproc does not understand all the C constructs
|
|
|
-that are used, so some relevant information is likely omitted from
|
|
|
-what you are reading.
|
|
|
-One example of such information is endpoint autoconfiguration.
|
|
|
-You'll have to read the header file, and use example source
|
|
|
-code (such as that for "Gadget Zero"), to fully understand the API.
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>The part of the API implementing some basic
|
|
|
-driver capabilities is specific to the version of the
|
|
|
-Linux kernel that's in use.
|
|
|
-The 2.6 kernel includes a <emphasis>driver model</emphasis>
|
|
|
-framework that has no analogue on earlier kernels;
|
|
|
-so those parts of the gadget API are not fully portable.
|
|
|
-(They are implemented on 2.4 kernels, but in a different way.)
|
|
|
-The driver model state is another part of this API that is
|
|
|
-ignored by the kerneldoc tools.
|
|
|
-</para>
|
|
|
-</note>
|
|
|
-
|
|
|
-<para>The core API does not expose
|
|
|
-every possible hardware feature, only the most widely available ones.
|
|
|
-There are significant hardware features, such as device-to-device DMA
|
|
|
-(without temporary storage in a memory buffer)
|
|
|
-that would be added using hardware-specific APIs.
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>This API allows drivers to use conditional compilation to handle
|
|
|
-endpoint capabilities of different hardware, but doesn't require that.
|
|
|
-Hardware tends to have arbitrary restrictions, relating to
|
|
|
-transfer types, addressing, packet sizes, buffering, and availability.
|
|
|
-As a rule, such differences only matter for "endpoint zero" logic
|
|
|
-that handles device configuration and management.
|
|
|
-The API supports limited run-time
|
|
|
-detection of capabilities, through naming conventions for endpoints.
|
|
|
-Many drivers will be able to at least partially autoconfigure
|
|
|
-themselves.
|
|
|
-In particular, driver init sections will often have endpoint
|
|
|
-autoconfiguration logic that scans the hardware's list of endpoints
|
|
|
-to find ones matching the driver requirements
|
|
|
-(relying on those conventions), to eliminate some of the most
|
|
|
-common reasons for conditional compilation.
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>Like the Linux-USB host side API, this API exposes
|
|
|
-the "chunky" nature of USB messages: I/O requests are in terms
|
|
|
-of one or more "packets", and packet boundaries are visible to drivers.
|
|
|
-Compared to RS-232 serial protocols, USB resembles
|
|
|
-synchronous protocols like HDLC
|
|
|
-(N bytes per frame, multipoint addressing, host as the primary
|
|
|
-station and devices as secondary stations)
|
|
|
-more than asynchronous ones
|
|
|
-(tty style: 8 data bits per frame, no parity, one stop bit).
|
|
|
-So for example the controller drivers won't buffer
|
|
|
-two single byte writes into a single two-byte USB IN packet,
|
|
|
-although gadget drivers may do so when they implement
|
|
|
-protocols where packet boundaries (and "short packets")
|
|
|
-are not significant.
|
|
|
-</para>
|
|
|
-
|
|
|
-<sect1 id="lifecycle"><title>Driver Life Cycle</title>
|
|
|
-
|
|
|
-<para>Gadget drivers make endpoint I/O requests to hardware without
|
|
|
-needing to know many details of the hardware, but driver
|
|
|
-setup/configuration code needs to handle some differences.
|
|
|
-Use the API like this:
|
|
|
-</para>
|
|
|
-
|
|
|
-<orderedlist numeration='arabic'>
|
|
|
-
|
|
|
-<listitem><para>Register a driver for the particular device side
|
|
|
-usb controller hardware,
|
|
|
-such as the net2280 on PCI (USB 2.0),
|
|
|
-sa11x0 or pxa25x as found in Linux PDAs,
|
|
|
-and so on.
|
|
|
-At this point the device is logically in the USB ch9 initial state
|
|
|
-("attached"), drawing no power and not usable
|
|
|
-(since it does not yet support enumeration).
|
|
|
-Any host should not see the device, since it's not
|
|
|
-activated the data line pullup used by the host to
|
|
|
-detect a device, even if VBUS power is available.
|
|
|
-</para></listitem>
|
|
|
-
|
|
|
-<listitem><para>Register a gadget driver that implements some higher level
|
|
|
-device function. That will then bind() to a usb_gadget, which
|
|
|
-activates the data line pullup sometime after detecting VBUS.
|
|
|
-</para></listitem>
|
|
|
-
|
|
|
-<listitem><para>The hardware driver can now start enumerating.
|
|
|
-The steps it handles are to accept USB power and set_address requests.
|
|
|
-Other steps are handled by the gadget driver.
|
|
|
-If the gadget driver module is unloaded before the host starts to
|
|
|
-enumerate, steps before step 7 are skipped.
|
|
|
-</para></listitem>
|
|
|
-
|
|
|
-<listitem><para>The gadget driver's setup() call returns usb descriptors,
|
|
|
-based both on what the bus interface hardware provides and on the
|
|
|
-functionality being implemented.
|
|
|
-That can involve alternate settings or configurations,
|
|
|
-unless the hardware prevents such operation.
|
|
|
-For OTG devices, each configuration descriptor includes
|
|
|
-an OTG descriptor.
|
|
|
-</para></listitem>
|
|
|
-
|
|
|
-<listitem><para>The gadget driver handles the last step of enumeration,
|
|
|
-when the USB host issues a set_configuration call.
|
|
|
-It enables all endpoints used in that configuration,
|
|
|
-with all interfaces in their default settings.
|
|
|
-That involves using a list of the hardware's endpoints, enabling each
|
|
|
-endpoint according to its descriptor.
|
|
|
-It may also involve using <function>usb_gadget_vbus_draw</function>
|
|
|
-to let more power be drawn from VBUS, as allowed by that configuration.
|
|
|
-For OTG devices, setting a configuration may also involve reporting
|
|
|
-HNP capabilities through a user interface.
|
|
|
-</para></listitem>
|
|
|
-
|
|
|
-<listitem><para>Do real work and perform data transfers, possibly involving
|
|
|
-changes to interface settings or switching to new configurations, until the
|
|
|
-device is disconnect()ed from the host.
|
|
|
-Queue any number of transfer requests to each endpoint.
|
|
|
-It may be suspended and resumed several times before being disconnected.
|
|
|
-On disconnect, the drivers go back to step 3 (above).
|
|
|
-</para></listitem>
|
|
|
-
|
|
|
-<listitem><para>When the gadget driver module is being unloaded,
|
|
|
-the driver unbind() callback is issued. That lets the controller
|
|
|
-driver be unloaded.
|
|
|
-</para></listitem>
|
|
|
-
|
|
|
-</orderedlist>
|
|
|
-
|
|
|
-<para>Drivers will normally be arranged so that just loading the
|
|
|
-gadget driver module (or statically linking it into a Linux kernel)
|
|
|
-allows the peripheral device to be enumerated, but some drivers
|
|
|
-will defer enumeration until some higher level component (like
|
|
|
-a user mode daemon) enables it.
|
|
|
-Note that at this lowest level there are no policies about how
|
|
|
-ep0 configuration logic is implemented,
|
|
|
-except that it should obey USB specifications.
|
|
|
-Such issues are in the domain of gadget drivers,
|
|
|
-including knowing about implementation constraints
|
|
|
-imposed by some USB controllers
|
|
|
-or understanding that composite devices might happen to
|
|
|
-be built by integrating reusable components.
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>Note that the lifecycle above can be slightly different
|
|
|
-for OTG devices.
|
|
|
-Other than providing an additional OTG descriptor in each
|
|
|
-configuration, only the HNP-related differences are particularly
|
|
|
-visible to driver code.
|
|
|
-They involve reporting requirements during the SET_CONFIGURATION
|
|
|
-request, and the option to invoke HNP during some suspend callbacks.
|
|
|
-Also, SRP changes the semantics of
|
|
|
-<function>usb_gadget_wakeup</function>
|
|
|
-slightly.
|
|
|
-</para>
|
|
|
-
|
|
|
-</sect1>
|
|
|
-
|
|
|
-<sect1 id="ch9"><title>USB 2.0 Chapter 9 Types and Constants</title>
|
|
|
-
|
|
|
-<para>Gadget drivers
|
|
|
-rely on common USB structures and constants
|
|
|
-defined in the
|
|
|
-<filename><linux/usb/ch9.h></filename>
|
|
|
-header file, which is standard in Linux 2.6 kernels.
|
|
|
-These are the same types and constants used by host
|
|
|
-side drivers (and usbcore).
|
|
|
-</para>
|
|
|
-
|
|
|
-!Iinclude/linux/usb/ch9.h
|
|
|
-</sect1>
|
|
|
-
|
|
|
-<sect1 id="core"><title>Core Objects and Methods</title>
|
|
|
-
|
|
|
-<para>These are declared in
|
|
|
-<filename><linux/usb/gadget.h></filename>,
|
|
|
-and are used by gadget drivers to interact with
|
|
|
-USB peripheral controller drivers.
|
|
|
-</para>
|
|
|
-
|
|
|
- <!-- yeech, this is ugly in nsgmls PDF output.
|
|
|
-
|
|
|
- the PDF bookmark and refentry output nesting is wrong,
|
|
|
- and the member/argument documentation indents ugly.
|
|
|
-
|
|
|
- plus something (docproc?) adds whitespace before the
|
|
|
- descriptive paragraph text, so it can't line up right
|
|
|
- unless the explanations are trivial.
|
|
|
- -->
|
|
|
-
|
|
|
-!Iinclude/linux/usb/gadget.h
|
|
|
-</sect1>
|
|
|
-
|
|
|
-<sect1 id="utils"><title>Optional Utilities</title>
|
|
|
-
|
|
|
-<para>The core API is sufficient for writing a USB Gadget Driver,
|
|
|
-but some optional utilities are provided to simplify common tasks.
|
|
|
-These utilities include endpoint autoconfiguration.
|
|
|
-</para>
|
|
|
-
|
|
|
-!Edrivers/usb/gadget/usbstring.c
|
|
|
-!Edrivers/usb/gadget/config.c
|
|
|
-<!-- !Edrivers/usb/gadget/epautoconf.c -->
|
|
|
-</sect1>
|
|
|
-
|
|
|
-<sect1 id="composite"><title>Composite Device Framework</title>
|
|
|
-
|
|
|
-<para>The core API is sufficient for writing drivers for composite
|
|
|
-USB devices (with more than one function in a given configuration),
|
|
|
-and also multi-configuration devices (also more than one function,
|
|
|
-but not necessarily sharing a given configuration).
|
|
|
-There is however an optional framework which makes it easier to
|
|
|
-reuse and combine functions.
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>Devices using this framework provide a <emphasis>struct
|
|
|
-usb_composite_driver</emphasis>, which in turn provides one or
|
|
|
-more <emphasis>struct usb_configuration</emphasis> instances.
|
|
|
-Each such configuration includes at least one
|
|
|
-<emphasis>struct usb_function</emphasis>, which packages a user
|
|
|
-visible role such as "network link" or "mass storage device".
|
|
|
-Management functions may also exist, such as "Device Firmware
|
|
|
-Upgrade".
|
|
|
-</para>
|
|
|
-
|
|
|
-!Iinclude/linux/usb/composite.h
|
|
|
-!Edrivers/usb/gadget/composite.c
|
|
|
-
|
|
|
-</sect1>
|
|
|
-
|
|
|
-<sect1 id="functions"><title>Composite Device Functions</title>
|
|
|
-
|
|
|
-<para>At this writing, a few of the current gadget drivers have
|
|
|
-been converted to this framework.
|
|
|
-Near-term plans include converting all of them, except for "gadgetfs".
|
|
|
-</para>
|
|
|
-
|
|
|
-!Edrivers/usb/gadget/function/f_acm.c
|
|
|
-!Edrivers/usb/gadget/function/f_ecm.c
|
|
|
-!Edrivers/usb/gadget/function/f_subset.c
|
|
|
-!Edrivers/usb/gadget/function/f_obex.c
|
|
|
-!Edrivers/usb/gadget/function/f_serial.c
|
|
|
-
|
|
|
-</sect1>
|
|
|
-
|
|
|
-
|
|
|
-</chapter>
|
|
|
-
|
|
|
-<chapter id="controllers"><title>Peripheral Controller Drivers</title>
|
|
|
-
|
|
|
-<para>The first hardware supporting this API was the NetChip 2280
|
|
|
-controller, which supports USB 2.0 high speed and is based on PCI.
|
|
|
-This is the <filename>net2280</filename> driver module.
|
|
|
-The driver supports Linux kernel versions 2.4 and 2.6;
|
|
|
-contact NetChip Technologies for development boards and product
|
|
|
-information.
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>Other hardware working in the "gadget" framework includes:
|
|
|
-Intel's PXA 25x and IXP42x series processors
|
|
|
-(<filename>pxa2xx_udc</filename>),
|
|
|
-Toshiba TC86c001 "Goku-S" (<filename>goku_udc</filename>),
|
|
|
-Renesas SH7705/7727 (<filename>sh_udc</filename>),
|
|
|
-MediaQ 11xx (<filename>mq11xx_udc</filename>),
|
|
|
-Hynix HMS30C7202 (<filename>h7202_udc</filename>),
|
|
|
-National 9303/4 (<filename>n9604_udc</filename>),
|
|
|
-Texas Instruments OMAP (<filename>omap_udc</filename>),
|
|
|
-Sharp LH7A40x (<filename>lh7a40x_udc</filename>),
|
|
|
-and more.
|
|
|
-Most of those are full speed controllers.
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>At this writing, there are people at work on drivers in
|
|
|
-this framework for several other USB device controllers,
|
|
|
-with plans to make many of them be widely available.
|
|
|
-</para>
|
|
|
-
|
|
|
-<!-- !Edrivers/usb/gadget/net2280.c -->
|
|
|
-
|
|
|
-<para>A partial USB simulator,
|
|
|
-the <filename>dummy_hcd</filename> driver, is available.
|
|
|
-It can act like a net2280, a pxa25x, or an sa11x0 in terms
|
|
|
-of available endpoints and device speeds; and it simulates
|
|
|
-control, bulk, and to some extent interrupt transfers.
|
|
|
-That lets you develop some parts of a gadget driver on a normal PC,
|
|
|
-without any special hardware, and perhaps with the assistance
|
|
|
-of tools such as GDB running with User Mode Linux.
|
|
|
-At least one person has expressed interest in adapting that
|
|
|
-approach, hooking it up to a simulator for a microcontroller.
|
|
|
-Such simulators can help debug subsystems where the runtime hardware
|
|
|
-is unfriendly to software development, or is not yet available.
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>Support for other controllers is expected to be developed
|
|
|
-and contributed
|
|
|
-over time, as this driver framework evolves.
|
|
|
-</para>
|
|
|
-
|
|
|
-</chapter>
|
|
|
-
|
|
|
-<chapter id="gadget"><title>Gadget Drivers</title>
|
|
|
-
|
|
|
-<para>In addition to <emphasis>Gadget Zero</emphasis>
|
|
|
-(used primarily for testing and development with drivers
|
|
|
-for usb controller hardware), other gadget drivers exist.
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>There's an <emphasis>ethernet</emphasis> gadget
|
|
|
-driver, which implements one of the most useful
|
|
|
-<emphasis>Communications Device Class</emphasis> (CDC) models.
|
|
|
-One of the standards for cable modem interoperability even
|
|
|
-specifies the use of this ethernet model as one of two
|
|
|
-mandatory options.
|
|
|
-Gadgets using this code look to a USB host as if they're
|
|
|
-an Ethernet adapter.
|
|
|
-It provides access to a network where the gadget's CPU is one host,
|
|
|
-which could easily be bridging, routing, or firewalling
|
|
|
-access to other networks.
|
|
|
-Since some hardware can't fully implement the CDC Ethernet
|
|
|
-requirements, this driver also implements a "good parts only"
|
|
|
-subset of CDC Ethernet.
|
|
|
-(That subset doesn't advertise itself as CDC Ethernet,
|
|
|
-to avoid creating problems.)
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>Support for Microsoft's <emphasis>RNDIS</emphasis>
|
|
|
-protocol has been contributed by Pengutronix and Auerswald GmbH.
|
|
|
-This is like CDC Ethernet, but it runs on more slightly USB hardware
|
|
|
-(but less than the CDC subset).
|
|
|
-However, its main claim to fame is being able to connect directly to
|
|
|
-recent versions of Windows, using drivers that Microsoft bundles
|
|
|
-and supports, making it much simpler to network with Windows.
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>There is also support for user mode gadget drivers,
|
|
|
-using <emphasis>gadgetfs</emphasis>.
|
|
|
-This provides a <emphasis>User Mode API</emphasis> that presents
|
|
|
-each endpoint as a single file descriptor. I/O is done using
|
|
|
-normal <emphasis>read()</emphasis> and <emphasis>read()</emphasis> calls.
|
|
|
-Familiar tools like GDB and pthreads can be used to
|
|
|
-develop and debug user mode drivers, so that once a robust
|
|
|
-controller driver is available many applications for it
|
|
|
-won't require new kernel mode software.
|
|
|
-Linux 2.6 <emphasis>Async I/O (AIO)</emphasis>
|
|
|
-support is available, so that user mode software
|
|
|
-can stream data with only slightly more overhead
|
|
|
-than a kernel driver.
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>There's a USB Mass Storage class driver, which provides
|
|
|
-a different solution for interoperability with systems such
|
|
|
-as MS-Windows and MacOS.
|
|
|
-That <emphasis>Mass Storage</emphasis> driver uses a
|
|
|
-file or block device as backing store for a drive,
|
|
|
-like the <filename>loop</filename> driver.
|
|
|
-The USB host uses the BBB, CB, or CBI versions of the mass
|
|
|
-storage class specification, using transparent SCSI commands
|
|
|
-to access the data from the backing store.
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>There's a "serial line" driver, useful for TTY style
|
|
|
-operation over USB.
|
|
|
-The latest version of that driver supports CDC ACM style
|
|
|
-operation, like a USB modem, and so on most hardware it can
|
|
|
-interoperate easily with MS-Windows.
|
|
|
-One interesting use of that driver is in boot firmware (like a BIOS),
|
|
|
-which can sometimes use that model with very small systems without
|
|
|
-real serial lines.
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>Support for other kinds of gadget is expected to
|
|
|
-be developed and contributed
|
|
|
-over time, as this driver framework evolves.
|
|
|
-</para>
|
|
|
-
|
|
|
-</chapter>
|
|
|
-
|
|
|
-<chapter id="otg"><title>USB On-The-GO (OTG)</title>
|
|
|
-
|
|
|
-<para>USB OTG support on Linux 2.6 was initially developed
|
|
|
-by Texas Instruments for
|
|
|
-<ulink url="http://www.omap.com">OMAP</ulink> 16xx and 17xx
|
|
|
-series processors.
|
|
|
-Other OTG systems should work in similar ways, but the
|
|
|
-hardware level details could be very different.
|
|
|
-</para>
|
|
|
-
|
|
|
-<para>Systems need specialized hardware support to implement OTG,
|
|
|
-notably including a special <emphasis>Mini-AB</emphasis> jack
|
|
|
-and associated transceiver to support <emphasis>Dual-Role</emphasis>
|
|
|
-operation:
|
|
|
-they can act either as a host, using the standard
|
|
|
-Linux-USB host side driver stack,
|
|
|
-or as a peripheral, using this "gadget" framework.
|
|
|
-To do that, the system software relies on small additions
|
|
|
-to those programming interfaces,
|
|
|
-and on a new internal component (here called an "OTG Controller")
|
|
|
-affecting which driver stack connects to the OTG port.
|
|
|
-In each role, the system can re-use the existing pool of
|
|
|
-hardware-neutral drivers, layered on top of the controller
|
|
|
-driver interfaces (<emphasis>usb_bus</emphasis> or
|
|
|
-<emphasis>usb_gadget</emphasis>).
|
|
|
-Such drivers need at most minor changes, and most of the calls
|
|
|
-added to support OTG can also benefit non-OTG products.
|
|
|
-</para>
|
|
|
-
|
|
|
-<itemizedlist>
|
|
|
- <listitem><para>Gadget drivers test the <emphasis>is_otg</emphasis>
|
|
|
- flag, and use it to determine whether or not to include
|
|
|
- an OTG descriptor in each of their configurations.
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>Gadget drivers may need changes to support the
|
|
|
- two new OTG protocols, exposed in new gadget attributes
|
|
|
- such as <emphasis>b_hnp_enable</emphasis> flag.
|
|
|
- HNP support should be reported through a user interface
|
|
|
- (two LEDs could suffice), and is triggered in some cases
|
|
|
- when the host suspends the peripheral.
|
|
|
- SRP support can be user-initiated just like remote wakeup,
|
|
|
- probably by pressing the same button.
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>On the host side, USB device drivers need
|
|
|
- to be taught to trigger HNP at appropriate moments, using
|
|
|
- <function>usb_suspend_device()</function>.
|
|
|
- That also conserves battery power, which is useful even
|
|
|
- for non-OTG configurations.
|
|
|
- </para></listitem>
|
|
|
- <listitem><para>Also on the host side, a driver must support the
|
|
|
- OTG "Targeted Peripheral List". That's just a whitelist,
|
|
|
- used to reject peripherals not supported with a given
|
|
|
- Linux OTG host.
|
|
|
- <emphasis>This whitelist is product-specific;
|
|
|
- each product must modify <filename>otg_whitelist.h</filename>
|
|
|
- to match its interoperability specification.
|
|
|
- </emphasis>
|
|
|
- </para>
|
|
|
- <para>Non-OTG Linux hosts, like PCs and workstations,
|
|
|
- normally have some solution for adding drivers, so that
|
|
|
- peripherals that aren't recognized can eventually be supported.
|
|
|
- That approach is unreasonable for consumer products that may
|
|
|
- never have their firmware upgraded, and where it's usually
|
|
|
- unrealistic to expect traditional PC/workstation/server kinds
|
|
|
- of support model to work.
|
|
|
- For example, it's often impractical to change device firmware
|
|
|
- once the product has been distributed, so driver bugs can't
|
|
|
- normally be fixed if they're found after shipment.
|
|
|
- </para></listitem>
|
|
|
-</itemizedlist>
|
|
|
-
|
|
|
-<para>
|
|
|
-Additional changes are needed below those hardware-neutral
|
|
|
-<emphasis>usb_bus</emphasis> and <emphasis>usb_gadget</emphasis>
|
|
|
-driver interfaces; those aren't discussed here in any detail.
|
|
|
-Those affect the hardware-specific code for each USB Host or Peripheral
|
|
|
-controller, and how the HCD initializes (since OTG can be active only
|
|
|
-on a single port).
|
|
|
-They also involve what may be called an <emphasis>OTG Controller
|
|
|
-Driver</emphasis>, managing the OTG transceiver and the OTG state
|
|
|
-machine logic as well as much of the root hub behavior for the
|
|
|
-OTG port.
|
|
|
-The OTG controller driver needs to activate and deactivate USB
|
|
|
-controllers depending on the relevant device role.
|
|
|
-Some related changes were needed inside usbcore, so that it
|
|
|
-can identify OTG-capable devices and respond appropriately
|
|
|
-to HNP or SRP protocols.
|
|
|
-</para>
|
|
|
-
|
|
|
-</chapter>
|
|
|
-
|
|
|
-</book>
|
|
|
-<!--
|
|
|
- vim:syntax=sgml:sw=4
|
|
|
--->
|