The 63rd release of NuttX, Version 5.16, was made on January 10, 2010
and is available for download from the SourceForge website. This
release includes initial support for USB host in NuttX. The USB host
infrstruture is new to NuttX. This initial USB host release is
probably only beta quality; it is expected the some bugs remain in
the logic and that the functionality requires extension.
Below is a summary of the NuttX USB host implementation as extracted
from the NuttX Porting Guide:
6.3.9 USB Host-Side Drivers
* include/nuttx/usb/usbhost.h. All structures and APIs needed to
work with USB host-side drivers are provided in this header file.
* struct usbhost_driver_s. Each USB host controller driver must
implement an instance of struct usbhost_driver_s. This structure
is defined in include/nuttx/usb/usbhost.h. Examples: arch/arm
* struct usbhost_class_s. Each USB host class driver must implement
an instance of struct usbhost_class_s. This structure is also
defined in include/nuttx/usb/usbhost.h. Examples:
* USB Host Class Driver Registry. The NuttX USB host infrastructure
includes a registry. During its initialization, each USB host
class driver must call the interface, usbhost_registerclass() in
order add its interface to the registery. Later, when a USB
device is connected, the USB host controller will look up the USB
host class driver that is needed to support the connected device
in this registry. Examples: drivers/usbhost/usbhost_registry.c,
drivers/usbhost/usbhost_registerclass.c, and drivers/usbhost
* Detection and Enumeration of Connected Devices. Each USB host
device controller supports two methods that are used to detect
and enumeration newly connected devices (and also detect
o int (wait)(FAR struct usbhost_driver_s drvr, bool connected);
Wait for a device to be connected or disconnected.
o int (enumerate)(FAR struct usbhost_driver_s drvr);
Enumerate the connected device. As part of this enumeration
process, the driver will (1) get the device's configuration
descriptor, (2) extract the class ID info from the
configuration descriptor, (3) call usbhost_findclass() to find
the class that supports this device, (4) call the create()
method on the struct usbhost_registry_s interface to get a
class instance, and finally (5) call the connect() method of
the struct usbhost_class_s interface. After that, the class is
in charge of the sequence of operations.
* Binding USB Host-Side Drivers. USB host-side controller drivers
are not normally directly accessed by user code, but are usually
bound to another, higher level USB host class driver. The class
driver exports the standard NuttX device interface so that the
connected USB device can be accessed just as with other, similar,
on-board devices. For example, the USB host mass storage class
driver (drivers/usbhost/usbhost_storage.c) will register a
standard, NuttX block driver interface (like /dev/sda) that can
be used to mount a file system just as with any other other block
driver instance. In general, the binding sequence is:
1. Each USB host class driver includes an initialization entry
point that is called from the application at initialization
time. This driver calls usbhost_registerclass() during this
initialization in order to makes itself available in the event
the device that it supports is connected. Examples: The
function usbhost_storageinit() in the file drivers/usbhost
2. Each application must include a waiter thread thread that (1)
calls the USB host controller driver's wait() to detect the
connection of a device, and then (2) call the USB host
controller driver's enumerate method to bind the registered
USB host class driver to the USB host controller driver.
Examples: The function nsh_waiter() in the file
configs/nucleus2g/src/up_nsh.c and the function nsh_waiter()
in the file configs/olimex-lpc1766stk/src/up_nsh.c.
3. As part of its operation during the binding operation, the USB
host class driver will register an instances of a standard
NuttX driver under the /dev directory. To repeat the above
example, the USB host mass storage class driver
(drivers/usbhost/usbhost_storage.c) will register a standard,
NuttX block driver interface (like /dev/sda) that can be used
to mount a file system just as with any other other block
driver instance. Examples: See the call to
register_blockdriver() in the function usbhost_initvolume() in
the file drivers/usbhost/usbhost_storage.c.
5.16 2011-01-10 Gregory Nutt <spudmonkey AT racsa.co.cr>
* include/nuttx/usb -- Created new directory. Moved all
usb-related header files to this new directory. Created a
skeleton for a new USB host header file
* drivers/usbhost -- Add USB host "registry" where connect
devices can be matched with the correct USB class driver.
* arc/arc/src/lpc17xx/lpc17_usbhost.c -- Add a simple USB host
driver for the NXP lpc17xx.
* drivers/usbhost -- Add generic USB device enumeration logic.
* drivers/usbhost -- Add a USB host class driver for the
(Bulk-Only) USB Mass Storage Class.