Basic framework that might be used to add USB host support
This commit is contained in:
parent
440d535360
commit
8a1d6c9ed8
@ -77,6 +77,12 @@ config USBHOST_HUB_POLLMSEC
|
||||
|
||||
endif # USBHOST_HUB
|
||||
|
||||
config USBHOST_COMPOSITE
|
||||
bool "Composite device support"
|
||||
default n
|
||||
---help---
|
||||
Build in USB host support for connected composite devices
|
||||
|
||||
config USBHOST_MSC
|
||||
bool "Mass Storage Class Support"
|
||||
default n
|
||||
|
@ -46,6 +46,10 @@ ifeq ($(CONFIG_USBHOST_HUB),y)
|
||||
CSRCS += usbhost_hub.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_USBHOST_COMPOSITE),y)
|
||||
CSRCS += usbhost_composite.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_USBHOST_MSC),y)
|
||||
CSRCS += usbhost_storage.c
|
||||
endif
|
||||
|
146
drivers/usbhost/usbhost_composite.c
Normal file
146
drivers/usbhost/usbhost_composite.c
Normal file
@ -0,0 +1,146 @@
|
||||
/****************************************************************************
|
||||
* drivers/usbhost/usbhost_composite.c
|
||||
*
|
||||
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <nuttx/usb/usbhost.h>
|
||||
|
||||
#include "usbhost_composite.h"
|
||||
|
||||
#ifdef CONFIG_USBHOST_COMPOSITE
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: usbhost_composite
|
||||
*
|
||||
* Description:
|
||||
* As the final steps in the device enumeration sequence this function
|
||||
* will be called in order to determine (1) determine if the device is
|
||||
* a composite device, and if so, (2) create the composite class which
|
||||
* contains all of the individual class instances making up the composite.
|
||||
*
|
||||
* Input Parameters:
|
||||
* hport - The downstream port to which the (potential) composite
|
||||
* device has been connected.
|
||||
* configdesc - The full configuration descriptor
|
||||
* desclen - The length of the configuration descriptor
|
||||
* devclass - If the class driver for the device is successful located
|
||||
* and bound to the hub port, the allocated class instance
|
||||
* is returned into this caller-provided memory location.
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero (OK) is returned if (1) the device was determined to be a
|
||||
* composite device and (2) the composite class wrapper was sucessfully
|
||||
* created and bound to the HCD. A negated errno value is returned on
|
||||
* any failure. The value -ENOENT, in particular means that the attached
|
||||
* device is not a composite device. Other values would indicate other
|
||||
* various, unexpected failures.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int usbhost_composite(FAR struct usbhost_hubport_s *hport,
|
||||
FAR const uint8_t *configdesc, int desclen,
|
||||
FAR struct usbhost_id_s *id,
|
||||
FAR struct usbhost_class_s **devclass)
|
||||
{
|
||||
/* Determine if this a composite device has been connected to the
|
||||
* downstream port.
|
||||
*/
|
||||
|
||||
/* Count the number of interfaces. Scan for IAD descriptors that will be
|
||||
* used when it is necessary to associate multiple interfaces with a single
|
||||
* device.
|
||||
*/
|
||||
|
||||
/* Allocate the composite class container */
|
||||
|
||||
/* Loop, processing each device that we discovered */
|
||||
/* See usbhost_classbind() for similar logic */
|
||||
|
||||
/* Is there is a class implementation registered to support this device. */
|
||||
|
||||
/* Yes.. there is a class for this device. Get an instance of
|
||||
* its interface.
|
||||
*/
|
||||
|
||||
/* Then bind the newly instantiated class instance to the
|
||||
* composite wrapper (not the HCD) */
|
||||
|
||||
/* On failures, call the class disconnect method which
|
||||
* should then free the allocated devclass instance.
|
||||
*/
|
||||
|
||||
/* All classes have been found, instantiated and boud the the composite class
|
||||
* container. Now bind the composite class instance to the HCD */
|
||||
|
||||
/* On failures, call the class disconnect method which should then free
|
||||
* the allocated devclass instance.
|
||||
*/
|
||||
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_USBHOST_COMPOSITE */
|
91
drivers/usbhost/usbhost_composite.h
Normal file
91
drivers/usbhost/usbhost_composite.h
Normal file
@ -0,0 +1,91 @@
|
||||
/****************************************************************************
|
||||
* drivers/usbhost/usbdev_composite.h
|
||||
*
|
||||
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __DRIVERS_USBHOST_USBHOST_COMPOSITE_H
|
||||
#define __DRIVERS_USBHOST_USBHOST_COMPOSITE_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <nuttx/usb/usbhost.h>
|
||||
|
||||
#ifdef CONFIG_USBHOST_COMPOSITE
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: usbhost_composite
|
||||
*
|
||||
* Description:
|
||||
* As the final steps in the device enumeration sequence this function
|
||||
* will be called in order to determine (1) determine if the device is
|
||||
* a composite device, and if so, (2) create the composite class which
|
||||
* contains all of the individual class instances making up the composite.
|
||||
*
|
||||
* Input Parameters:
|
||||
* hport - The downstream port to which the (potential) composite
|
||||
* device has been connected.
|
||||
* configdesc - The full configuration descriptor
|
||||
* desclen - The length of the configuration descriptor
|
||||
* devclass - If the class driver for the device is successful located
|
||||
* and bound to the hub port, the allocated class instance
|
||||
* is returned into this caller-provided memory location.
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero (OK) is returned if (1) the device was determined to be a
|
||||
* composite device and (2) the composite class wrapper was sucessfully
|
||||
* created and bound to the HCD. A negated errno value is returned on
|
||||
* any failure. The value -ENOENT, in particular means that the attached
|
||||
* device is not a composite device. Other values would indicate other
|
||||
* various, unexpected failures.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int usbhost_composite(FAR struct usbhost_hubport_s *hport,
|
||||
FAR const uint8_t *configdesc, int desclen,
|
||||
FAR struct usbhost_class_s **devclass);
|
||||
|
||||
#undef EXTERN
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_USBHOST_COMPOSITE */
|
||||
#endif /* #define __DRIVERS_USBHOST_USBHOST_COMPOSITE_H */
|
@ -539,15 +539,38 @@ int usbhost_enumerate(FAR struct usbhost_hubport_s *hport,
|
||||
|
||||
usleep(100*1000);
|
||||
|
||||
/* Parse the configuration descriptor and bind to the class instance for the
|
||||
* device. This needs to be the last thing done because the class driver
|
||||
* will begin configuring the device.
|
||||
#ifdef CONFIG_USBHOST_COMPOSITE
|
||||
/* Check if the device attached to the downstream port if a USB composite
|
||||
* device and, if so, create the composite device wrapper and bind it to
|
||||
* the HCD.
|
||||
*
|
||||
* usbhost_composite() will return a negated errno value is on any
|
||||
* failure. The value -ENOENT, in particular means that the attached
|
||||
* device is not a composite device. Other values would indicate other
|
||||
* various, unexpected failures. We make no real distinction here.
|
||||
*/
|
||||
|
||||
ret = usbhost_classbind(hport, buffer, cfglen, &id, devclass);
|
||||
if (ret < 0)
|
||||
ret = usbhost_composite(hport, buffer, cfglen, devclass);
|
||||
if (ret >= 0)
|
||||
{
|
||||
uerr("ERROR: usbhost_classbind failed %d\n", ret);
|
||||
uinfo("usbhost_composite has bound the composite device\n");
|
||||
}
|
||||
|
||||
/* Apparently this is not a composite device */
|
||||
|
||||
else
|
||||
#endif
|
||||
{
|
||||
/* Parse the configuration descriptor and bind to the class instance
|
||||
* for the device. This needs to be the last thing done because the
|
||||
* class driver will begin configuring the device.
|
||||
*/
|
||||
|
||||
ret = usbhost_classbind(hport, buffer, cfglen, &id, devclass);
|
||||
if (ret < 0)
|
||||
{
|
||||
uerr("ERROR: usbhost_classbind failed %d\n", ret);
|
||||
}
|
||||
}
|
||||
|
||||
errout:
|
||||
|
Loading…
x
Reference in New Issue
Block a user