Added another usbid with proto = 1 (HighSpeed Hub). Nxstyle fixes.
This commit is contained in:
parent
2a11ad520b
commit
662e6789ea
@ -1,4 +1,4 @@
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* drivers/usbhost/usbhost_hub.c
|
||||
*
|
||||
* Copyright (C) 2015-2017 Gregory Nutt. All rights reserved.
|
||||
@ -32,11 +32,11 @@
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
@ -62,11 +62,12 @@
|
||||
|
||||
#ifdef CONFIG_USBHOST_HUB
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
/* Configuration ********************************************************************/
|
||||
|
||||
/* Configuration ************************************************************/
|
||||
/* It is necessary to perform work on the low-priority work queue (vs. the
|
||||
* high priority work queue) because:
|
||||
*
|
||||
@ -75,7 +76,8 @@
|
||||
* related work. Since that interrupt related work will performed on the
|
||||
* high priority work queue, there would be the likelihood of deadlocks
|
||||
* if you wait for events on the high priority work thread that can only
|
||||
* occur if the high priority work thread is available to post those events.
|
||||
* occur if the high priority work thread is available to post those
|
||||
* events.
|
||||
*/
|
||||
|
||||
#if !defined(CONFIG_SCHED_WORKQUEUE)
|
||||
@ -108,9 +110,9 @@
|
||||
|
||||
#define INTIN_BUFSIZE ((USBHUB_MAX_PORTS + 8) >> 3)
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
/* This structure contains the internal, private state of the USB host
|
||||
* hub class.
|
||||
@ -149,9 +151,9 @@ struct usbhost_hubclass_s
|
||||
struct usbhost_hubpriv_s hubpriv; /* Private class data */
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
/* Helpers for usbhost_connect() */
|
||||
|
||||
@ -182,21 +184,30 @@ static int usbhost_connect(FAR struct usbhost_class_s *hubclass,
|
||||
FAR const uint8_t *configdesc, int desclen);
|
||||
static int usbhost_disconnected(FAR struct usbhost_class_s *hubclass);
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
/* This structure provides the registry entry ID information that will be
|
||||
* used to associate the USB host hub class to a connected USB hub.
|
||||
*/
|
||||
|
||||
static const struct usbhost_id_s g_id =
|
||||
static const struct usbhost_id_s g_id[2] =
|
||||
{
|
||||
USB_CLASS_HUB, /* base */
|
||||
0, /* subclass */
|
||||
0, /* proto */
|
||||
0, /* vid */
|
||||
0 /* pid */
|
||||
{
|
||||
USB_CLASS_HUB, /* base */
|
||||
0, /* subclass */
|
||||
0, /* proto FS hub */
|
||||
0, /* vid */
|
||||
0 /* pid */
|
||||
},
|
||||
{
|
||||
USB_CLASS_HUB, /* base */
|
||||
0, /* subclass */
|
||||
1, /* proto HS hub */
|
||||
0, /* vid */
|
||||
0 /* pid */
|
||||
}
|
||||
};
|
||||
|
||||
/* This is the USB host hub class's registry entry */
|
||||
@ -205,15 +216,15 @@ static struct usbhost_registry_s g_hub =
|
||||
{
|
||||
NULL, /* flink */
|
||||
usbhost_create, /* create */
|
||||
1, /* nids */
|
||||
&g_id /* id[] */
|
||||
2, /* nids */
|
||||
g_id /* id[] */
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Name: usbhost_hport_deactivate
|
||||
*
|
||||
* Description:
|
||||
@ -225,7 +236,7 @@ static struct usbhost_registry_s g_hub =
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
static void usbhost_hport_deactivate(FAR struct usbhost_hubport_s *hport)
|
||||
{
|
||||
@ -254,7 +265,7 @@ static void usbhost_hport_deactivate(FAR struct usbhost_hubport_s *hport)
|
||||
DEBUGASSERT(ROOTHUB(hport) || hport->devclass == NULL);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Name: usbhost_hport_activate
|
||||
*
|
||||
* Description:
|
||||
@ -268,7 +279,7 @@ static void usbhost_hport_deactivate(FAR struct usbhost_hubport_s *hport)
|
||||
* Zero (OK) is returned on success; a negated errno value is returned
|
||||
* on any failure.
|
||||
*
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
static int usbhost_hport_activate(FAR struct usbhost_hubport_s *hport)
|
||||
{
|
||||
@ -293,7 +304,7 @@ static int usbhost_hport_activate(FAR struct usbhost_hubport_s *hport)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Name: usbhost_cfgdesc
|
||||
*
|
||||
* Description:
|
||||
@ -315,7 +326,7 @@ static int usbhost_hport_activate(FAR struct usbhost_hubport_s *hport)
|
||||
* Assumptions:
|
||||
* This function will *not* be called from an interrupt handler.
|
||||
*
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
static inline int usbhost_cfgdesc(FAR struct usbhost_class_s *hubclass,
|
||||
FAR const uint8_t *configdesc, int desclen)
|
||||
@ -395,7 +406,7 @@ static inline int usbhost_cfgdesc(FAR struct usbhost_class_s *hubclass,
|
||||
}
|
||||
break;
|
||||
|
||||
/* Endpoint descriptor. Here, we expect one interrupt IN endpoints. */
|
||||
/* Endpoint descriptor. Here, we expect one interrupt IN endpoints. */
|
||||
|
||||
case USB_DESC_TYPE_ENDPOINT:
|
||||
{
|
||||
@ -433,7 +444,7 @@ static inline int usbhost_cfgdesc(FAR struct usbhost_class_s *hubclass,
|
||||
intindesc.mxpacketsize = usbhost_getle16(epdesc->mxpacketsize);
|
||||
|
||||
uinfo("Interrupt IN EP: addr=%d interval=%d mxpacketsize=%d\n",
|
||||
intindesc.addr, intindesc.interval, intindesc.mxpacketsize);
|
||||
intindesc.addr, intindesc.interval, intindesc.mxpacketsize);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -484,7 +495,7 @@ static inline int usbhost_cfgdesc(FAR struct usbhost_class_s *hubclass,
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Name: usbhost_hubdesc
|
||||
*
|
||||
* Description:
|
||||
@ -503,7 +514,7 @@ static inline int usbhost_cfgdesc(FAR struct usbhost_class_s *hubclass,
|
||||
* Assumptions:
|
||||
* This function will *not* be called from an interrupt handler.
|
||||
*
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
static inline int usbhost_hubdesc(FAR struct usbhost_class_s *hubclass)
|
||||
{
|
||||
@ -569,7 +580,7 @@ static inline int usbhost_hubdesc(FAR struct usbhost_class_s *hubclass)
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Name: usbhost_hubpwr
|
||||
*
|
||||
* Description:
|
||||
@ -605,7 +616,7 @@ static inline int usbhost_hubdesc(FAR struct usbhost_class_s *hubclass)
|
||||
* Assumptions:
|
||||
* This function will *not* be called from an interrupt handler.
|
||||
*
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
static int usbhost_hubpwr(FAR struct usbhost_hubpriv_s *priv,
|
||||
FAR struct usbhost_hubport_s *hport,
|
||||
@ -632,27 +643,27 @@ static int usbhost_hubpwr(FAR struct usbhost_hubpriv_s *priv,
|
||||
ctrlreq = priv->ctrlreq;
|
||||
DEBUGASSERT(ctrlreq);
|
||||
|
||||
for (port = 1; port <= priv->nports; port++)
|
||||
{
|
||||
ctrlreq->type = USBHUB_REQ_TYPE_PORT;
|
||||
ctrlreq->req = req;
|
||||
usbhost_putle16(ctrlreq->value, USBHUB_PORT_FEAT_POWER);
|
||||
usbhost_putle16(ctrlreq->index, port);
|
||||
usbhost_putle16(ctrlreq->len, 0);
|
||||
for (port = 1; port <= priv->nports; port++)
|
||||
{
|
||||
ctrlreq->type = USBHUB_REQ_TYPE_PORT;
|
||||
ctrlreq->req = req;
|
||||
usbhost_putle16(ctrlreq->value, USBHUB_PORT_FEAT_POWER);
|
||||
usbhost_putle16(ctrlreq->index, port);
|
||||
usbhost_putle16(ctrlreq->len, 0);
|
||||
|
||||
ret = DRVR_CTRLOUT(hport->drvr, hport->ep0, ctrlreq, NULL);
|
||||
if (ret < 0)
|
||||
{
|
||||
uerr("ERROR: Failed to power %s port %d: %d\n",
|
||||
on ? "UP" : "DOWN", port, ret);
|
||||
return ret;
|
||||
ret = DRVR_CTRLOUT(hport->drvr, hport->ep0, ctrlreq, NULL);
|
||||
if (ret < 0)
|
||||
{
|
||||
uerr("ERROR: Failed to power %s port %d: %d\n",
|
||||
on ? "UP" : "DOWN", port, ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Name: usbhost_hub_event
|
||||
*
|
||||
* Description:
|
||||
@ -668,7 +679,7 @@ static int usbhost_hubpwr(FAR struct usbhost_hubpriv_s *priv,
|
||||
* Assumptions:
|
||||
* This function will *not* be called from an interrupt handler.
|
||||
*
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
static void usbhost_hub_event(FAR void *arg)
|
||||
{
|
||||
@ -835,7 +846,7 @@ static void usbhost_hub_event(FAR void *arg)
|
||||
}
|
||||
|
||||
debouncetime += 25;
|
||||
nxsig_usleep(25*1000);
|
||||
nxsig_usleep(25 * 1000);
|
||||
}
|
||||
|
||||
if (ret < 0 || debouncetime >= 1500)
|
||||
@ -863,7 +874,7 @@ static void usbhost_hub_event(FAR void *arg)
|
||||
continue;
|
||||
}
|
||||
|
||||
nxsig_usleep(100*1000);
|
||||
nxsig_usleep(100 * 1000);
|
||||
|
||||
ctrlreq->type = USB_REQ_DIR_IN | USBHUB_REQ_TYPE_PORT;
|
||||
ctrlreq->req = USBHUB_REQ_GETSTATUS;
|
||||
@ -998,7 +1009,7 @@ static void usbhost_hub_event(FAR void *arg)
|
||||
leave_critical_section(flags);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Name: usbhost_disconnect_event
|
||||
*
|
||||
* Description:
|
||||
@ -1017,7 +1028,7 @@ static void usbhost_hub_event(FAR void *arg)
|
||||
* Assumptions:
|
||||
* Probably called from an interrupt handler.
|
||||
*
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
static void usbhost_disconnect_event(FAR void *arg)
|
||||
{
|
||||
@ -1103,7 +1114,7 @@ static void usbhost_disconnect_event(FAR void *arg)
|
||||
leave_critical_section(flags);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Name: usbhost_getle16
|
||||
*
|
||||
* Description:
|
||||
@ -1115,14 +1126,14 @@ static void usbhost_disconnect_event(FAR void *arg)
|
||||
* Returned Value:
|
||||
* A uint16_t representing the whole 16-bit integer value
|
||||
*
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
static inline uint16_t usbhost_getle16(const uint8_t *val)
|
||||
{
|
||||
return (uint16_t)val[1] << 8 | (uint16_t)val[0];
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Name: usbhost_putle16
|
||||
*
|
||||
* Description:
|
||||
@ -1135,7 +1146,7 @@ static inline uint16_t usbhost_getle16(const uint8_t *val)
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
static void usbhost_putle16(uint8_t *dest, uint16_t val)
|
||||
{
|
||||
@ -1143,7 +1154,7 @@ static void usbhost_putle16(uint8_t *dest, uint16_t val)
|
||||
dest[1] = val >> 8;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Name: usbhost_callback
|
||||
*
|
||||
* Description:
|
||||
@ -1160,7 +1171,7 @@ static void usbhost_putle16(uint8_t *dest, uint16_t val)
|
||||
* Assumptions:
|
||||
* Probably called from an interrupt handler.
|
||||
*
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
static void usbhost_callback(FAR void *arg, ssize_t nbytes)
|
||||
{
|
||||
@ -1224,11 +1235,11 @@ static void usbhost_callback(FAR void *arg, ssize_t nbytes)
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* struct usbhost_registry_s methods
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Name: usbhost_create
|
||||
*
|
||||
* Description:
|
||||
@ -1251,7 +1262,7 @@ static void usbhost_callback(FAR void *arg, ssize_t nbytes)
|
||||
* will fail only if the hport input parameter is NULL or if there are
|
||||
* insufficient resources to create another USB host class instance.
|
||||
*
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
static FAR struct usbhost_class_s *
|
||||
usbhost_create(FAR struct usbhost_hubport_s *hport,
|
||||
@ -1332,10 +1343,11 @@ errout_with_hub:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* struct usbhost_class_s methods
|
||||
****************************************************************************/
|
||||
/****************************************************************************
|
||||
************************************************************************************/
|
||||
|
||||
/************************************************************************************
|
||||
* Name: usbhost_connect
|
||||
*
|
||||
* Description:
|
||||
@ -1364,7 +1376,7 @@ errout_with_hub:
|
||||
* - If this function returns an error, the USB host controller driver
|
||||
* must call to DISCONNECTED method to recover from the error
|
||||
*
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
static int usbhost_connect(FAR struct usbhost_class_s *hubclass,
|
||||
FAR const uint8_t *configdesc, int desclen)
|
||||
@ -1426,7 +1438,7 @@ static int usbhost_connect(FAR struct usbhost_class_s *hubclass,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Name: usbhost_disconnected
|
||||
*
|
||||
* Description:
|
||||
@ -1446,7 +1458,7 @@ static int usbhost_connect(FAR struct usbhost_class_s *hubclass,
|
||||
* Assumptions:
|
||||
* Probably called from an interrupt handler.
|
||||
*
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
static int usbhost_disconnected(struct usbhost_class_s *hubclass)
|
||||
{
|
||||
@ -1482,11 +1494,11 @@ static int usbhost_disconnected(struct usbhost_class_s *hubclass)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
/************************************************************************************
|
||||
* Name: usbhost_hub_initialize
|
||||
*
|
||||
* Description:
|
||||
@ -1501,7 +1513,7 @@ static int usbhost_disconnected(struct usbhost_class_s *hubclass)
|
||||
* On success this function will return zero (OK); A negated errno value
|
||||
* will be returned on failure.
|
||||
*
|
||||
****************************************************************************/
|
||||
************************************************************************************/
|
||||
|
||||
int usbhost_hub_initialize(void)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user