Add a new method to the USB host driver interface: getdevinfo. This method will return information about the currently connected device. At present, it only returns the device speed. The speed is needed by the enumeration logic in order to set a credible initial EP0 max packet size
This commit is contained in:
parent
f500338401
commit
56f2b3b963
@ -270,13 +270,13 @@ static void lpc17_setinttab(uint32_t value, unsigned int interval, unsigned int
|
||||
#endif
|
||||
|
||||
static inline int lpc17_addinted(struct lpc17_usbhost_s *priv,
|
||||
const FAR struct usbhost_epdesc_s *epdesc,
|
||||
FAR const struct usbhost_epdesc_s *epdesc,
|
||||
struct lpc17_ed_s *ed);
|
||||
static inline int lpc17_reminted(struct lpc17_usbhost_s *priv,
|
||||
struct lpc17_ed_s *ed);
|
||||
|
||||
static inline int lpc17_addisoced(struct lpc17_usbhost_s *priv,
|
||||
const FAR struct usbhost_epdesc_s *epdesc,
|
||||
FAR const struct usbhost_epdesc_s *epdesc,
|
||||
struct lpc17_ed_s *ed);
|
||||
static inline int lpc17_remisoced(struct lpc17_usbhost_s *priv,
|
||||
struct lpc17_ed_s *ed);
|
||||
@ -302,8 +302,10 @@ static int lpc17_enumerate(FAR struct usbhost_connection_s *conn, int rhpndx);
|
||||
|
||||
static int lpc17_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
|
||||
uint16_t maxpacketsize);
|
||||
static int lpc17_getdevinfo(FAR struct usbhost_driver_s *drvr,
|
||||
FAR struct usbhost_devinfo_s *devinfo);
|
||||
static int lpc17_epalloc(FAR struct usbhost_driver_s *drvr,
|
||||
const FAR struct usbhost_epdesc_s *epdesc, usbhost_ep_t *ep);
|
||||
FAR const struct usbhost_epdesc_s *epdesc, usbhost_ep_t *ep);
|
||||
static int lpc17_epfree(FAR struct usbhost_driver_s *drvr, usbhost_ep_t ep);
|
||||
static int lpc17_alloc(FAR struct usbhost_driver_s *drvr,
|
||||
FAR uint8_t **buffer, FAR size_t *maxlen);
|
||||
@ -339,6 +341,7 @@ static struct lpc17_usbhost_s g_usbhost =
|
||||
.drvr =
|
||||
{
|
||||
.ep0configure = lpc17_ep0configure,
|
||||
.getdevinfo = lpc17_getdevinfo,
|
||||
.epalloc = lpc17_epalloc,
|
||||
.epfree = lpc17_epfree,
|
||||
.alloc = lpc17_alloc,
|
||||
@ -889,7 +892,7 @@ static void lpc17_setinttab(uint32_t value, unsigned int interval, unsigned int
|
||||
*******************************************************************************/
|
||||
|
||||
static inline int lpc17_addinted(struct lpc17_usbhost_s *priv,
|
||||
const FAR struct usbhost_epdesc_s *epdesc,
|
||||
FAR const struct usbhost_epdesc_s *epdesc,
|
||||
struct lpc17_ed_s *ed)
|
||||
{
|
||||
#ifndef CONFIG_USBHOST_INT_DISABLE
|
||||
@ -1125,7 +1128,7 @@ static inline int lpc17_reminted(struct lpc17_usbhost_s *priv,
|
||||
*******************************************************************************/
|
||||
|
||||
static inline int lpc17_addisoced(struct lpc17_usbhost_s *priv,
|
||||
const FAR struct usbhost_epdesc_s *epdesc,
|
||||
FAR const struct usbhost_epdesc_s *epdesc,
|
||||
struct lpc17_ed_s *ed)
|
||||
{
|
||||
#ifndef CONFIG_USBHOST_ISOC_DISABLE
|
||||
@ -1694,6 +1697,37 @@ static int lpc17_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcadd
|
||||
return OK;
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
* Name: lpc17_getdevinfo
|
||||
*
|
||||
* Description:
|
||||
* Get information about the connected device.
|
||||
*
|
||||
* Input Parameters:
|
||||
* drvr - The USB host driver instance obtained as a parameter from the call to
|
||||
* the class create() method.
|
||||
* devinfo - A pointer to memory provided by the caller in which to return the
|
||||
* device information.
|
||||
*
|
||||
* Returned Values:
|
||||
* On success, zero (OK) is returned. On a failure, a negated errno value is
|
||||
* returned indicating the nature of the failure
|
||||
*
|
||||
* Assumptions:
|
||||
* This function will *not* be called from an interrupt handler.
|
||||
*
|
||||
************************************************************************************/
|
||||
|
||||
static int lpc17_getdevinfo(FAR struct usbhost_driver_s *drvr,
|
||||
FAR struct usbhost_devinfo_s *devinfo)
|
||||
{
|
||||
struct lpc17_usbhost_s *priv = (struct lpc17_usbhost_s *)drvr;
|
||||
|
||||
DEBUGASSERT(drvr && devinfo);
|
||||
devinfo->speed = priv->lowspeed ? DEVINFO_SPEED_LOW : DEVINFO_SPEED_FULL;
|
||||
return OK;
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
* Name: lpc17_epalloc
|
||||
*
|
||||
@ -1717,7 +1751,7 @@ static int lpc17_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcadd
|
||||
************************************************************************************/
|
||||
|
||||
static int lpc17_epalloc(FAR struct usbhost_driver_s *drvr,
|
||||
const FAR struct usbhost_epdesc_s *epdesc, usbhost_ep_t *ep)
|
||||
FAR const struct usbhost_epdesc_s *epdesc, usbhost_ep_t *ep)
|
||||
{
|
||||
struct lpc17_usbhost_s *priv = (struct lpc17_usbhost_s *)drvr;
|
||||
struct lpc17_ed_s *ed;
|
||||
|
@ -364,6 +364,8 @@ static int sam_enumerate(FAR struct usbhost_connection_s *conn, int rhpndx);
|
||||
|
||||
static int sam_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
|
||||
uint16_t maxpacketsize);
|
||||
static int sam_getdevinfo(FAR struct usbhost_driver_s *drvr,
|
||||
FAR struct usbhost_devinfo_s *devinfo);
|
||||
static int sam_epalloc(FAR struct usbhost_driver_s *drvr,
|
||||
const FAR struct usbhost_epdesc_s *epdesc, usbhost_ep_t *ep);
|
||||
static int sam_epfree(FAR struct usbhost_driver_s *drvr, usbhost_ep_t ep);
|
||||
@ -2981,6 +2983,64 @@ static int sam_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
|
||||
return OK;
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
* Name: sam_getdevinfo
|
||||
*
|
||||
* Description:
|
||||
* Get information about the connected device.
|
||||
*
|
||||
* Input Parameters:
|
||||
* drvr - The USB host driver instance obtained as a parameter from the call to
|
||||
* the class create() method.
|
||||
* devinfo - A pointer to memory provided by the caller in which to return the
|
||||
* device information.
|
||||
*
|
||||
* Returned Values:
|
||||
* On success, zero (OK) is returned. On a failure, a negated errno value is
|
||||
* returned indicating the nature of the failure
|
||||
*
|
||||
* Assumptions:
|
||||
* This function will *not* be called from an interrupt handler.
|
||||
*
|
||||
************************************************************************************/
|
||||
|
||||
static int sam_getdevinfo(FAR struct usbhost_driver_s *drvr,
|
||||
FAR struct usbhost_devinfo_s *devinfo)
|
||||
{
|
||||
struct sam_rhport_s *rhport = (struct sam_rhport_s *)drvr;
|
||||
struct sam_epinfo_s *epinfo;
|
||||
|
||||
DEBUGASSERT(drvr && devinfo);
|
||||
epinfo = &rhport->ep0;
|
||||
|
||||
/* As implemented now, this driver supports only HIGH speed. All
|
||||
* low or full speed devices are handed off to the OHCI driver.
|
||||
*/
|
||||
|
||||
#if 0
|
||||
switch (epinfo->speed)
|
||||
{
|
||||
case EHCI_LOW_SPEED:
|
||||
devinfo->speed = DEVINFO_SPEED_LOW;
|
||||
break;
|
||||
|
||||
case EHCI_FULL_SPEED:
|
||||
devinfo->speed = DEVINFO_SPEED_FULL;
|
||||
break;
|
||||
|
||||
default:
|
||||
case EHCI_HIGH_SPEED:
|
||||
devinfo->speed = DEVINFO_SPEED_HIGH;
|
||||
break;
|
||||
}
|
||||
|
||||
#else
|
||||
devinfo->speed = DEVINFO_SPEED_HIGH;
|
||||
|
||||
#endif
|
||||
return OK;
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
* Name: sam_epalloc
|
||||
*
|
||||
@ -3670,6 +3730,7 @@ FAR struct usbhost_connection_s *sam_ehci_initialize(int controller)
|
||||
/* Initialize the device operations */
|
||||
|
||||
rhport->drvr.ep0configure = sam_ep0configure;
|
||||
rhport->drvr.getdevinfo = sam_getdevinfo;
|
||||
rhport->drvr.epalloc = sam_epalloc;
|
||||
rhport->drvr.epfree = sam_epfree;
|
||||
rhport->drvr.alloc = sam_alloc;
|
||||
|
@ -383,6 +383,8 @@ static int sam_enumerate(FAR struct usbhost_connection_s *conn, int rhpndx);
|
||||
|
||||
static int sam_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
|
||||
uint16_t maxpacketsize);
|
||||
static int sam_getdevinfo(FAR struct usbhost_driver_s *drvr,
|
||||
FAR struct usbhost_devinfo_s *devinfo);
|
||||
static int sam_epalloc(FAR struct usbhost_driver_s *drvr,
|
||||
const FAR struct usbhost_epdesc_s *epdesc, usbhost_ep_t *ep);
|
||||
static int sam_epfree(FAR struct usbhost_driver_s *drvr, usbhost_ep_t ep);
|
||||
@ -2261,6 +2263,37 @@ static int sam_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
|
||||
return OK;
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
* Name: sam_getdevinfo
|
||||
*
|
||||
* Description:
|
||||
* Get information about the connected device.
|
||||
*
|
||||
* Input Parameters:
|
||||
* drvr - The USB host driver instance obtained as a parameter from the call to
|
||||
* the class create() method.
|
||||
* devinfo - A pointer to memory provided by the caller in which to return the
|
||||
* device information.
|
||||
*
|
||||
* Returned Values:
|
||||
* On success, zero (OK) is returned. On a failure, a negated errno value is
|
||||
* returned indicating the nature of the failure
|
||||
*
|
||||
* Assumptions:
|
||||
* This function will *not* be called from an interrupt handler.
|
||||
*
|
||||
************************************************************************************/
|
||||
|
||||
static int sam_getdevinfo(FAR struct usbhost_driver_s *drvr,
|
||||
FAR struct usbhost_devinfo_s *devinfo)
|
||||
{
|
||||
struct sam_rhport_s *rhport = (struct sam_rhport_s *)drvr;
|
||||
|
||||
DEBUGASSERT(drvr && devinfo);
|
||||
devinfo->speed = rhport->lowspeed ? DEVINFO_SPEED_LOW : DEVINFO_SPEED_FULL;
|
||||
return OK;
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
* Name: sam_epalloc
|
||||
*
|
||||
@ -3156,6 +3189,7 @@ FAR struct usbhost_connection_s *sam_ohci_initialize(int controller)
|
||||
|
||||
rhport->rhpndx = i;
|
||||
rhport->drvr.ep0configure = sam_ep0configure;
|
||||
rhport->drvr.getdevinfo = sam_getdevinfo;
|
||||
rhport->drvr.epalloc = sam_epalloc;
|
||||
rhport->drvr.epfree = sam_epfree;
|
||||
rhport->drvr.alloc = sam_alloc;
|
||||
|
@ -364,6 +364,8 @@ static int stm32_enumerate(FAR struct usbhost_connection_s *conn, int rhpndx);
|
||||
|
||||
static int stm32_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
|
||||
uint16_t maxpacketsize);
|
||||
static int stm32_getdevinfo(FAR struct usbhost_driver_s *drvr,
|
||||
FAR struct usbhost_devinfo_s *devinfo);
|
||||
static int stm32_epalloc(FAR struct usbhost_driver_s *drvr,
|
||||
FAR const FAR struct usbhost_epdesc_s *epdesc,
|
||||
FAR usbhost_ep_t *ep);
|
||||
@ -409,6 +411,7 @@ static struct stm32_usbhost_s g_usbhost =
|
||||
.drvr =
|
||||
{
|
||||
.ep0configure = stm32_ep0configure,
|
||||
.getdevinfo = stm32_getdevinfo,
|
||||
.epalloc = stm32_epalloc,
|
||||
.epfree = stm32_epfree,
|
||||
.alloc = stm32_alloc,
|
||||
@ -3234,6 +3237,37 @@ static int stm32_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcadd
|
||||
return OK;
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
* Name: stm32_getdevinfo
|
||||
*
|
||||
* Description:
|
||||
* Get information about the connected device.
|
||||
*
|
||||
* Input Parameters:
|
||||
* drvr - The USB host driver instance obtained as a parameter from the call to
|
||||
* the class create() method.
|
||||
* devinfo - A pointer to memory provided by the caller in which to return the
|
||||
* device information.
|
||||
*
|
||||
* Returned Values:
|
||||
* On success, zero (OK) is returned. On a failure, a negated errno value is
|
||||
* returned indicating the nature of the failure
|
||||
*
|
||||
* Assumptions:
|
||||
* This function will *not* be called from an interrupt handler.
|
||||
*
|
||||
************************************************************************************/
|
||||
|
||||
static int stm32_getdevinfo(FAR struct usbhost_driver_s *drvr,
|
||||
FAR struct usbhost_devinfo_s *devinfo)
|
||||
{
|
||||
FAR struct stm32_usbhost_s *priv = (FAR struct stm32_usbhost_s *)drvr;
|
||||
|
||||
DEBUGASSERT(drvr && devinfo);
|
||||
devinfo->speed = priv->lowspeed ? DEVINFO_SPEED_LOW : DEVINFO_SPEED_FULL;
|
||||
return OK;
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
* Name: stm32_epalloc
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user