mirror of
https://github.com/apache/nuttx.git
synced 2026-05-31 05:55:46 +08:00
First of several changes needed to support multiple USB host root hubs
This commit is contained in:
@@ -5369,4 +5369,12 @@
|
||||
* arch/arm/src/sama5/sam_ohci.c and sam_usbhost.h (was sam_ohci.h), and
|
||||
configs/sama5d3x-ek/src/sam_usb.c, and sama5d3x-ek.h: Add controls
|
||||
to enable VBUS power in OHCI host most (2013-8-12).
|
||||
|
||||
* includes/nuttx/usb/usbhost.h, all USB host drivers in arch/, and all
|
||||
USB host-side connection monitoring threads in configs/*/src: The
|
||||
SAMA5 has three downstream ports; all of the other USB host
|
||||
implementations have only one. This will require significant changes
|
||||
to the USB host interfaces starting with these chnages to monitor
|
||||
connections on a port-by-port basis. This effects a lot of files and
|
||||
more changes are coming for this issues. Changes are being blindly
|
||||
incorporated into other architrectures. I am being careful to avoid
|
||||
breakage, but I expect some (2013-8-12).
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<h1><big><font color="#3c34ec">
|
||||
<i>NuttX RTOS Porting Guide</i>
|
||||
</font></big></h1>
|
||||
<p>Last Updated: July 26, 2013</p>
|
||||
<p>Last Updated: August 12, 2013</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -3433,6 +3433,8 @@ extern void up_ledoff(int led);
|
||||
<p>
|
||||
<b>Examples</b>:
|
||||
<code>arch/arm/src/lpc17xx/lpc17_usbhost.c</code>.
|
||||
<code>arch/arm/src/stm32/stm32_otgfshost.c</code>.
|
||||
<code>arch/arm/src/sama5/sam_ohci.c</code>.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
@@ -3469,7 +3471,7 @@ extern void up_ledoff(int led);
|
||||
<ul>
|
||||
<li>
|
||||
<p>
|
||||
<code>int (*wait)(FAR struct usbhost_driver_s *drvr, bool connected);</code>
|
||||
<code>int (*wait)(FAR struct usbhost_driver_s *drvr, FAR const bool *connected);</code>
|
||||
</p>
|
||||
<p>
|
||||
Wait for a device to be connected or disconnected.
|
||||
@@ -3477,10 +3479,10 @@ extern void up_ledoff(int led);
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<code>int (*enumerate)(FAR struct usbhost_driver_s *drvr);</code>
|
||||
<code>int (*enumerate)(FAR struct usbhost_driver_s *drvr, int rhpndx);</code>
|
||||
</p>
|
||||
<p>
|
||||
Enumerate the connected device.
|
||||
Enumerate the device connected to a root hub port.
|
||||
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,
|
||||
|
||||
@@ -294,8 +294,8 @@ static int lpc17_usbinterrupt(int irq, FAR void *context);
|
||||
|
||||
/* USB host controller operations **********************************************/
|
||||
|
||||
static int lpc17_wait(FAR struct usbhost_driver_s *drvr, bool connected);
|
||||
static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr);
|
||||
static int lpc17_wait(FAR struct usbhost_driver_s *drvr, FAR bool *connected);
|
||||
static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr, int rhpndx);
|
||||
static int lpc17_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
|
||||
uint16_t maxpacketsize);
|
||||
static int lpc17_epalloc(FAR struct usbhost_driver_s *drvr,
|
||||
@@ -1518,8 +1518,8 @@ static int lpc17_usbinterrupt(int irq, FAR void *context)
|
||||
* Input Parameters:
|
||||
* drvr - The USB host driver instance obtained as a parameter from the call to
|
||||
* the class create() method.
|
||||
* connected - TRUE: Wait for device to be connected; FALSE: wait for device
|
||||
* to be disconnected
|
||||
* connected - A pointer to a boolean value: TRUE: Wait for device to be
|
||||
* connected; FALSE: wait for device to be disconnected
|
||||
*
|
||||
* Returned Values:
|
||||
* Zero (OK) is returned when a device in connected. This function will not
|
||||
@@ -1533,7 +1533,7 @@ static int lpc17_usbinterrupt(int irq, FAR void *context)
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
static int lpc17_wait(FAR struct usbhost_driver_s *drvr, bool connected)
|
||||
static int lpc17_wait(FAR struct usbhost_driver_s *drvr, FAR bool *connected)
|
||||
{
|
||||
struct lpc17_usbhost_s *priv = (struct lpc17_usbhost_s *)drvr;
|
||||
irqstate_t flags;
|
||||
@@ -1541,13 +1541,14 @@ static int lpc17_wait(FAR struct usbhost_driver_s *drvr, bool connected)
|
||||
/* Are we already connected? */
|
||||
|
||||
flags = irqsave();
|
||||
while (priv->connected == connected)
|
||||
while (priv->connected == *connected)
|
||||
{
|
||||
/* No... wait for the connection/disconnection */
|
||||
|
||||
priv->rhswait = true;
|
||||
lpc17_takesem(&priv->rhssem);
|
||||
}
|
||||
|
||||
irqrestore(flags);
|
||||
|
||||
udbg("Connected:%s\n", priv->connected ? "YES" : "NO");
|
||||
@@ -1570,6 +1571,7 @@ static int lpc17_wait(FAR struct usbhost_driver_s *drvr, bool connected)
|
||||
* Input Parameters:
|
||||
* drvr - The USB host driver instance obtained as a parameter from the call to
|
||||
* the class create() method.
|
||||
* rphndx - Root hub port index. 0-(n-1) corresponds to root hub port 1-n.
|
||||
*
|
||||
* Returned Values:
|
||||
* On success, zero (OK) is returned. On a failure, a negated errno value is
|
||||
@@ -1582,9 +1584,10 @@ static int lpc17_wait(FAR struct usbhost_driver_s *drvr, bool connected)
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr)
|
||||
static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr, int rphndx)
|
||||
{
|
||||
struct lpc17_usbhost_s *priv = (struct lpc17_usbhost_s *)drvr;
|
||||
DEBUGASSERT(priv && rhpndx == 0);
|
||||
|
||||
/* Are we connected to a device? The caller should have called the wait()
|
||||
* method first to be assured that a device is connected.
|
||||
|
||||
@@ -49,45 +49,50 @@
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
/* The SAMA5 supports 3 root hub ports */
|
||||
|
||||
#define SAM_USBHOST_NRHPORT 3
|
||||
|
||||
/* Register offsets *********************************************************/
|
||||
/* See nuttx/usb/ohci.h */
|
||||
|
||||
/* Register addresses *******************************************************/
|
||||
|
||||
#define SAM_USBHOST_HCIREV (SAM_UHPOHCI_VSECTION+OHCI_HCIREV_OFFSET)
|
||||
#define SAM_USBHOST_CTRL (SAM_UHPOHCI_VSECTION+OHCI_CTRL_OFFSET)
|
||||
#define SAM_USBHOST_CMDST (SAM_UHPOHCI_VSECTION+OHCI_CMDST_OFFSET)
|
||||
#define SAM_USBHOST_INTST (SAM_UHPOHCI_VSECTION+OHCI_INTST_OFFSET)
|
||||
#define SAM_USBHOST_INTEN (SAM_UHPOHCI_VSECTION+OHCI_INTEN_OFFSET)
|
||||
#define SAM_USBHOST_INTDIS (SAM_UHPOHCI_VSECTION+OHCI_INTDIS_OFFSET)
|
||||
#define SAM_USBHOST_HCIREV (SAM_UHPOHCI_VSECTION+OHCI_HCIREV_OFFSET)
|
||||
#define SAM_USBHOST_CTRL (SAM_UHPOHCI_VSECTION+OHCI_CTRL_OFFSET)
|
||||
#define SAM_USBHOST_CMDST (SAM_UHPOHCI_VSECTION+OHCI_CMDST_OFFSET)
|
||||
#define SAM_USBHOST_INTST (SAM_UHPOHCI_VSECTION+OHCI_INTST_OFFSET)
|
||||
#define SAM_USBHOST_INTEN (SAM_UHPOHCI_VSECTION+OHCI_INTEN_OFFSET)
|
||||
#define SAM_USBHOST_INTDIS (SAM_UHPOHCI_VSECTION+OHCI_INTDIS_OFFSET)
|
||||
|
||||
/* Memory pointers (section 7.2) */
|
||||
|
||||
#define SAM_USBHOST_HCCA (SAM_UHPOHCI_VSECTION+OHCI_HCCA_OFFSET)
|
||||
#define SAM_USBHOST_PERED (SAM_UHPOHCI_VSECTION+OHCI_PERED_OFFSET)
|
||||
#define SAM_USBHOST_CTRLHEADED (SAM_UHPOHCI_VSECTION+OHCI_CTRLHEADED_OFFSET)
|
||||
#define SAM_USBHOST_CTRLED (SAM_UHPOHCI_VSECTION+OHCI_CTRLED_OFFSET)
|
||||
#define SAM_USBHOST_BULKHEADED (SAM_UHPOHCI_VSECTION+OHCI_BULKHEADED_OFFSET)
|
||||
#define SAM_USBHOST_BULKED (SAM_UHPOHCI_VSECTION+OHCI_BULKED_OFFSET)
|
||||
#define SAM_USBHOST_DONEHEAD (SAM_UHPOHCI_VSECTION+OHCI_DONEHEAD_OFFSET)
|
||||
#define SAM_USBHOST_HCCA (SAM_UHPOHCI_VSECTION+OHCI_HCCA_OFFSET)
|
||||
#define SAM_USBHOST_PERED (SAM_UHPOHCI_VSECTION+OHCI_PERED_OFFSET)
|
||||
#define SAM_USBHOST_CTRLHEADED (SAM_UHPOHCI_VSECTION+OHCI_CTRLHEADED_OFFSET)
|
||||
#define SAM_USBHOST_CTRLED (SAM_UHPOHCI_VSECTION+OHCI_CTRLED_OFFSET)
|
||||
#define SAM_USBHOST_BULKHEADED (SAM_UHPOHCI_VSECTION+OHCI_BULKHEADED_OFFSET)
|
||||
#define SAM_USBHOST_BULKED (SAM_UHPOHCI_VSECTION+OHCI_BULKED_OFFSET)
|
||||
#define SAM_USBHOST_DONEHEAD (SAM_UHPOHCI_VSECTION+OHCI_DONEHEAD_OFFSET)
|
||||
|
||||
/* Frame counters (section 7.3) */
|
||||
|
||||
#define SAM_USBHOST_FMINT (SAM_UHPOHCI_VSECTION+OHCI_FMINT_OFFSET)
|
||||
#define SAM_USBHOST_FMREM (SAM_UHPOHCI_VSECTION+OHCI_FMREM_OFFSET)
|
||||
#define SAM_USBHOST_FMNO (SAM_UHPOHCI_VSECTION+OHCI_FMNO_OFFSET)
|
||||
#define SAM_USBHOST_PERSTART (SAM_UHPOHCI_VSECTION+OHCI_PERSTART_OFFSET)
|
||||
#define SAM_USBHOST_FMINT (SAM_UHPOHCI_VSECTION+OHCI_FMINT_OFFSET)
|
||||
#define SAM_USBHOST_FMREM (SAM_UHPOHCI_VSECTION+OHCI_FMREM_OFFSET)
|
||||
#define SAM_USBHOST_FMNO (SAM_UHPOHCI_VSECTION+OHCI_FMNO_OFFSET)
|
||||
#define SAM_USBHOST_PERSTART (SAM_UHPOHCI_VSECTION+OHCI_PERSTART_OFFSET)
|
||||
|
||||
/* Root hub ports (section 7.4) */
|
||||
|
||||
#define SAM_USBHOST_LSTHRES (SAM_UHPOHCI_VSECTION+OHCI_LSTHRES_OFFSET)
|
||||
#define SAM_USBHOST_RHDESCA (SAM_UHPOHCI_VSECTION+OHCI_RHDESCA_OFFSET)
|
||||
#define SAM_USBHOST_RHDESCB (SAM_UHPOHCI_VSECTION+OHCI_RHDESCB_OFFSET)
|
||||
#define SAM_USBHOST_RHSTATUS (SAM_UHPOHCI_VSECTION+OHCI_RHSTATUS_OFFSET)
|
||||
#define SAM_USBHOST_RHPORTST1 (SAM_UHPOHCI_VSECTION+OHCI_RHPORTST1_OFFSET)
|
||||
#define SAM_USBHOST_RHPORTST2 (SAM_UHPOHCI_VSECTION+OHCI_RHPORTST2_OFFSET)
|
||||
#define SAM_USBHOST_MODID (SAM_UHPOHCI_VSECTION+SAM_USBHOST_MODID_OFFSET)
|
||||
#define SAM_USBHOST_LSTHRES (SAM_UHPOHCI_VSECTION+OHCI_LSTHRES_OFFSET)
|
||||
#define SAM_USBHOST_RHDESCA (SAM_UHPOHCI_VSECTION+OHCI_RHDESCA_OFFSET)
|
||||
#define SAM_USBHOST_RHDESCB (SAM_UHPOHCI_VSECTION+OHCI_RHDESCB_OFFSET)
|
||||
#define SAM_USBHOST_RHSTATUS (SAM_UHPOHCI_VSECTION+OHCI_RHSTATUS_OFFSET)
|
||||
|
||||
#define SAM_USBHOST_RHPORTST(n) (SAM_UHPOHCI_VSECTION+OHCI_RHPORTST_OFFSET(n))
|
||||
#define SAM_USBHOST_RHPORTST1 (SAM_UHPOHCI_VSECTION+OHCI_RHPORTST1_OFFSET)
|
||||
#define SAM_USBHOST_RHPORTST2 (SAM_UHPOHCI_VSECTION+OHCI_RHPORTST2_OFFSET)
|
||||
#define SAM_USBHOST_RHPORTST3 (SAM_UHPOHCI_VSECTION+OHCI_RHPORTST3_OFFSET)
|
||||
|
||||
/* Register bit definitions *************************************************/
|
||||
/* See include/nuttx/usb/ohci.h */
|
||||
|
||||
+185
-113
File diff suppressed because it is too large
Load Diff
@@ -358,8 +358,8 @@ static void stm32_txfe_enable(FAR struct stm32_usbhost_s *priv, int chidx);
|
||||
|
||||
/* USB host controller operations **********************************************/
|
||||
|
||||
static int stm32_wait(FAR struct usbhost_driver_s *drvr, bool connected);
|
||||
static int stm32_enumerate(FAR struct usbhost_driver_s *drvr);
|
||||
static int stm32_wait(FAR struct usbhost_driver_s *drvr, FAR bool *connected);
|
||||
static int stm32_enumerate(FAR struct usbhost_driver_s *drvr, int rhpndx);
|
||||
static int stm32_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
|
||||
uint16_t maxpacketsize);
|
||||
static int stm32_epalloc(FAR struct usbhost_driver_s *drvr,
|
||||
@@ -3013,8 +3013,8 @@ static void stm32_txfe_enable(FAR struct stm32_usbhost_s *priv, int chidx)
|
||||
* Input Parameters:
|
||||
* drvr - The USB host driver instance obtained as a parameter from the call to
|
||||
* the class create() method.
|
||||
* connected - TRUE: Wait for device to be connected; FALSE: wait for device
|
||||
* to be disconnected
|
||||
* connected - A pointer to a boolean value. TRUE: Wait for device to be
|
||||
* connected; FALSE: wait for device to be disconnected
|
||||
*
|
||||
* Returned Values:
|
||||
* Zero (OK) is returned when a device in connected. This function will not
|
||||
@@ -3028,7 +3028,7 @@ static void stm32_txfe_enable(FAR struct stm32_usbhost_s *priv, int chidx)
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
static int stm32_wait(FAR struct usbhost_driver_s *drvr, bool connected)
|
||||
static int stm32_wait(FAR struct usbhost_driver_s *drvr, FAR bool *connected)
|
||||
{
|
||||
FAR struct stm32_usbhost_s *priv = (FAR struct stm32_usbhost_s *)drvr;
|
||||
irqstate_t flags;
|
||||
@@ -3036,7 +3036,7 @@ static int stm32_wait(FAR struct usbhost_driver_s *drvr, bool connected)
|
||||
/* Are we already connected? */
|
||||
|
||||
flags = irqsave();
|
||||
while (priv->connected == connected)
|
||||
while (priv->connected == *connected)
|
||||
{
|
||||
/* No... wait for the connection/disconnection */
|
||||
|
||||
@@ -3066,6 +3066,7 @@ static int stm32_wait(FAR struct usbhost_driver_s *drvr, bool connected)
|
||||
* Input Parameters:
|
||||
* drvr - The USB host driver instance obtained as a parameter from the call to
|
||||
* the class create() method.
|
||||
* rphndx - Root hub port index. 0-(n-1) corresponds to root hub port 1-n.
|
||||
*
|
||||
* Returned Values:
|
||||
* On success, zero (OK) is returned. On a failure, a negated errno value is
|
||||
@@ -3078,13 +3079,15 @@ static int stm32_wait(FAR struct usbhost_driver_s *drvr, bool connected)
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
static int stm32_enumerate(FAR struct usbhost_driver_s *drvr)
|
||||
static int stm32_enumerate(FAR struct usbhost_driver_s *drvr, int rhpndx)
|
||||
{
|
||||
struct stm32_usbhost_s *priv = (struct stm32_usbhost_s *)drvr;
|
||||
uint32_t regval;
|
||||
int chidx;
|
||||
int ret;
|
||||
|
||||
DEBUGASSERT(priv && rhpndx == 0);
|
||||
|
||||
/* Are we connected to a device? The caller should have called the wait()
|
||||
* method first to be assured that a device is connected.
|
||||
*/
|
||||
|
||||
@@ -109,7 +109,7 @@ static int usbhost_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Wait for the device to change state */
|
||||
|
||||
ret = DRVR_WAIT(g_drvr, connected);
|
||||
ret = DRVR_WAIT(g_drvr, &connected);
|
||||
DEBUGASSERT(ret == OK);
|
||||
|
||||
connected = !connected;
|
||||
@@ -121,7 +121,7 @@ static int usbhost_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Yes.. enumerate the newly connected device */
|
||||
|
||||
(void)DRVR_ENUMERATE(g_drvr);
|
||||
(void)DRVR_ENUMERATE(g_drvr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@ static int usbhost_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Wait for the device to change state */
|
||||
|
||||
ret = DRVR_WAIT(g_drvr, connected);
|
||||
ret = DRVR_WAIT(g_drvr, &connected);
|
||||
DEBUGASSERT(ret == OK);
|
||||
|
||||
connected = !connected;
|
||||
@@ -120,7 +120,7 @@ static int usbhost_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Yes.. enumerate the newly connected device */
|
||||
|
||||
(void)DRVR_ENUMERATE(g_drvr);
|
||||
(void)DRVR_ENUMERATE(g_drvr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -169,7 +169,7 @@ static int nsh_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Wait for the device to change state */
|
||||
|
||||
ret = DRVR_WAIT(g_drvr, connected);
|
||||
ret = DRVR_WAIT(g_drvr, &connected);
|
||||
DEBUGASSERT(ret == OK);
|
||||
|
||||
connected = !connected;
|
||||
@@ -181,7 +181,7 @@ static int nsh_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Yes.. enumerate the newly connected device */
|
||||
|
||||
(void)DRVR_ENUMERATE(g_drvr);
|
||||
(void)DRVR_ENUMERATE(g_drvr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -193,7 +193,7 @@ static int nsh_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Wait for the device to change state */
|
||||
|
||||
ret = DRVR_WAIT(g_drvr, connected);
|
||||
ret = DRVR_WAIT(g_drvr, &connected);
|
||||
DEBUGASSERT(ret == OK);
|
||||
|
||||
connected = !connected;
|
||||
@@ -205,7 +205,7 @@ static int nsh_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Yes.. enumerate the newly connected device */
|
||||
|
||||
(void)DRVR_ENUMERATE(g_drvr);
|
||||
(void)DRVR_ENUMERATE(g_drvr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -197,7 +197,7 @@ static int nsh_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Wait for the device to change state */
|
||||
|
||||
ret = DRVR_WAIT(g_drvr, connected);
|
||||
ret = DRVR_WAIT(g_drvr, &connected);
|
||||
DEBUGASSERT(ret == OK);
|
||||
|
||||
connected = !connected;
|
||||
@@ -209,7 +209,7 @@ static int nsh_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Yes.. enumerate the newly connected device */
|
||||
|
||||
(void)DRVR_ENUMERATE(g_drvr);
|
||||
(void)DRVR_ENUMERATE(g_drvr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -196,7 +196,7 @@ static int nsh_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Wait for the device to change state */
|
||||
|
||||
ret = DRVR_WAIT(g_drvr, connected);
|
||||
ret = DRVR_WAIT(g_drvr, &connected);
|
||||
DEBUGASSERT(ret == OK);
|
||||
|
||||
connected = !connected;
|
||||
@@ -208,7 +208,7 @@ static int nsh_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Yes.. enumerate the newly connected device */
|
||||
|
||||
(void)DRVR_ENUMERATE(g_drvr);
|
||||
(void)DRVR_ENUMERATE(g_drvr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
#include "up_arch.h"
|
||||
#include "sam_pio.h"
|
||||
#include "sam_usbhost.h"
|
||||
#include "chip/sam_ohci.h"
|
||||
#include "sama5d3x-ek.h"
|
||||
|
||||
#if defined(CONFIG_SAMA5_UHPHS) || defined(CONFIG_SAMA5_UDPHS)
|
||||
@@ -97,25 +98,29 @@ static struct usbhost_driver_s *g_ehci;
|
||||
#if HAVE_USBHOST
|
||||
static int usbhost_waiter(struct usbhost_driver_s *dev)
|
||||
{
|
||||
bool connected = false;
|
||||
bool connected[SAM_USBHOST_NRHPORT] = {false, false, false};
|
||||
int rhpndx;
|
||||
|
||||
uvdbg("Running\n");
|
||||
for (;;)
|
||||
{
|
||||
/* Wait for the device to change state */
|
||||
|
||||
DEBUGVERIFY(DRVR_WAIT(dev, connected) == OK);
|
||||
rhpndx = DRVR_WAIT(dev, connected);
|
||||
DEBUGASSERT(rhpndx >= 0 && rhpndx < SAM_USBHOST_NRHPORT);
|
||||
|
||||
connected = !connected;
|
||||
uvdbg("%s\n", connected ? "connected" : "disconnected");
|
||||
connected[rhpndx] = !connected[rhpndx];
|
||||
|
||||
uvdbg("RHport%d %s\n",
|
||||
rhpndx + 1, connected[rhpndx] ? "connected" : "disconnected");
|
||||
|
||||
/* Did we just become connected? */
|
||||
|
||||
if (connected)
|
||||
if (connected[rhpndx])
|
||||
{
|
||||
/* Yes.. enumerate the newly connected device */
|
||||
|
||||
(void)DRVR_ENUMERATE(dev);
|
||||
(void)DRVR_ENUMERATE(dev, rhpndx);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@ static int usbhost_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Wait for the device to change state */
|
||||
|
||||
ret = DRVR_WAIT(g_drvr, connected);
|
||||
ret = DRVR_WAIT(g_drvr, &connected);
|
||||
DEBUGASSERT(ret == OK);
|
||||
|
||||
connected = !connected;
|
||||
@@ -120,7 +120,7 @@ static int usbhost_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Yes.. enumerate the newly connected device */
|
||||
|
||||
(void)DRVR_ENUMERATE(g_drvr);
|
||||
(void)DRVR_ENUMERATE(g_drvr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@ static int usbhost_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Wait for the device to change state */
|
||||
|
||||
ret = DRVR_WAIT(g_drvr, connected);
|
||||
ret = DRVR_WAIT(g_drvr, &connected);
|
||||
DEBUGASSERT(ret == OK);
|
||||
|
||||
connected = !connected;
|
||||
@@ -120,7 +120,7 @@ static int usbhost_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Yes.. enumerate the newly connected device */
|
||||
|
||||
(void)DRVR_ENUMERATE(g_drvr);
|
||||
(void)DRVR_ENUMERATE(g_drvr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@ static int usbhost_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Wait for the device to change state */
|
||||
|
||||
ret = DRVR_WAIT(g_drvr, connected);
|
||||
ret = DRVR_WAIT(g_drvr, &connected);
|
||||
DEBUGASSERT(ret == OK);
|
||||
|
||||
connected = !connected;
|
||||
@@ -120,7 +120,7 @@ static int usbhost_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Yes.. enumerate the newly connected device */
|
||||
|
||||
(void)DRVR_ENUMERATE(g_drvr);
|
||||
(void)DRVR_ENUMERATE(g_drvr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@ static int usbhost_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Wait for the device to change state */
|
||||
|
||||
ret = DRVR_WAIT(g_drvr, connected);
|
||||
ret = DRVR_WAIT(g_drvr, &connected);
|
||||
DEBUGASSERT(ret == OK);
|
||||
|
||||
connected = !connected;
|
||||
@@ -120,7 +120,7 @@ static int usbhost_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Yes.. enumerate the newly connected device */
|
||||
|
||||
(void)DRVR_ENUMERATE(g_drvr);
|
||||
(void)DRVR_ENUMERATE(g_drvr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
* config/sure-pic32mx/src/pic32mx_nsh.c
|
||||
*
|
||||
* Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2011-2013 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -188,7 +188,7 @@ static int nsh_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Wait for the device to change state */
|
||||
|
||||
ret = DRVR_WAIT(g_drvr, connected);
|
||||
ret = DRVR_WAIT(g_drvr, &connected);
|
||||
DEBUGASSERT(ret == OK);
|
||||
|
||||
connected = !connected;
|
||||
@@ -200,7 +200,7 @@ static int nsh_waiter(int argc, char *argv[])
|
||||
{
|
||||
/* Yes.. enumerate the newly connected device */
|
||||
|
||||
(void)DRVR_ENUMERATE(g_drvr);
|
||||
(void)DRVR_ENUMERATE(g_drvr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+36
-31
@@ -1,7 +1,7 @@
|
||||
/************************************************************************************
|
||||
* include/nuttx/usb/usbhost.h
|
||||
*
|
||||
* Copyright (C) 2010-2012 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2010-2013 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* References:
|
||||
@@ -155,22 +155,26 @@
|
||||
* Name: DRVR_WAIT
|
||||
*
|
||||
* Description:
|
||||
* Wait for a device to be connected or disconneced.
|
||||
* Wait for a device to be connected or disconnected to/from a root hub port.
|
||||
*
|
||||
* Input Parameters:
|
||||
* drvr - The USB host driver instance obtained as a parameter from the call to
|
||||
* the class create() method.
|
||||
* connected - TRUE: Wait for device to be connected; FALSE: wait for device to
|
||||
* be disconnected
|
||||
* drvr - The USB host driver instance obtained as a parameter from the call
|
||||
* to the class create() method.
|
||||
* connected - A pointer to an array of n boolean values corresponding to
|
||||
* root hubs 1 through n. For each boolean value: TRUE: Wait for a device
|
||||
* to be connected on the root hub; FALSE: wait for device to be
|
||||
* disconnected from the root hub.
|
||||
*
|
||||
* Returned Values:
|
||||
* Zero (OK) is returned when a device in connected. This function will not
|
||||
* return until either (1) a device is connected or (2) some failure occurs.
|
||||
* On a failure, a negated errno value is returned indicating the nature of
|
||||
* the failure
|
||||
* And index [0..(n-1)} corresponding to the root hub port number {1..n} is
|
||||
* returned when a device in connected or disconnectd. This function will not
|
||||
* return until either (1) a device is connected or disconntect to/from any
|
||||
* root hub port or until (2) some failure occurs. 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.
|
||||
* - Called from a single thread so no mutual exclusion is required.
|
||||
* - Never called from an interrupt handler.
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
@@ -192,6 +196,7 @@
|
||||
* Input Parameters:
|
||||
* drvr - The USB host driver instance obtained as a parameter from the call to
|
||||
* the class create() method.
|
||||
* rphndx - Root hub port index. 0-(n-1) corresponds to root hub port 1-n.
|
||||
*
|
||||
* Returned Values:
|
||||
* On success, zero (OK) is returned. On a failure, a negated errno value is
|
||||
@@ -202,7 +207,7 @@
|
||||
*
|
||||
************************************************************************************/
|
||||
|
||||
#define DRVR_ENUMERATE(drvr) ((drvr)->enumerate(drvr))
|
||||
#define DRVR_ENUMERATE(drvr,rhpndx) ((drvr)->enumerate(drvr,rhpndx))
|
||||
|
||||
/************************************************************************************
|
||||
* Name: DRVR_EP0CONFIGURE
|
||||
@@ -589,19 +594,19 @@ struct usbhost_driver_s
|
||||
{
|
||||
/* Wait for a device to connect or disconnect. */
|
||||
|
||||
int (*wait)(FAR struct usbhost_driver_s *drvr, bool connected);
|
||||
int (*wait)(FAR struct usbhost_driver_s *drvr, FAR const bool *connected);
|
||||
|
||||
/* 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.
|
||||
/* Enumerate the device connected on a root hub port. 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.
|
||||
*/
|
||||
|
||||
int (*enumerate)(FAR struct usbhost_driver_s *drvr);
|
||||
int (*enumerate)(FAR struct usbhost_driver_s *drvr, int rhpndx);
|
||||
|
||||
/* Configure endpoint 0. This method is normally used internally by the
|
||||
* enumerate() method but is made available at the interface to support
|
||||
@@ -689,7 +694,8 @@ struct usbhost_driver_s
|
||||
#undef EXTERN
|
||||
#if defined(__cplusplus)
|
||||
#define EXTERN extern "C"
|
||||
extern "C" {
|
||||
extern "C"
|
||||
{
|
||||
#else
|
||||
#define EXTERN extern
|
||||
#endif
|
||||
@@ -718,7 +724,7 @@ extern "C" {
|
||||
*
|
||||
************************************************************************************/
|
||||
|
||||
EXTERN int usbhost_registerclass(struct usbhost_registry_s *class);
|
||||
int usbhost_registerclass(struct usbhost_registry_s *class);
|
||||
|
||||
/************************************************************************************
|
||||
* Name: usbhost_findclass
|
||||
@@ -740,7 +746,7 @@ EXTERN int usbhost_registerclass(struct usbhost_registry_s *class);
|
||||
*
|
||||
************************************************************************************/
|
||||
|
||||
EXTERN const struct usbhost_registry_s *usbhost_findclass(const struct usbhost_id_s *id);
|
||||
const struct usbhost_registry_s *usbhost_findclass(const struct usbhost_id_s *id);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: usbhost_storageinit
|
||||
@@ -759,7 +765,7 @@ EXTERN const struct usbhost_registry_s *usbhost_findclass(const struct usbhost_i
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
EXTERN int usbhost_storageinit(void);
|
||||
int usbhost_storageinit(void);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: usbhost_kbdinit
|
||||
@@ -778,7 +784,7 @@ EXTERN int usbhost_storageinit(void);
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
EXTERN int usbhost_kbdinit(void);
|
||||
int usbhost_kbdinit(void);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: usbhost_wlaninit
|
||||
@@ -797,7 +803,7 @@ EXTERN int usbhost_kbdinit(void);
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
EXTERN int usbhost_wlaninit(void);
|
||||
int usbhost_wlaninit(void);
|
||||
|
||||
/*******************************************************************************
|
||||
* Name: usbhost_enumerate
|
||||
@@ -836,9 +842,8 @@ EXTERN int usbhost_wlaninit(void);
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
EXTERN int usbhost_enumerate(FAR struct usbhost_driver_s *drvr,
|
||||
uint8_t funcaddr,
|
||||
FAR struct usbhost_class_s **class);
|
||||
int usbhost_enumerate(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
|
||||
FAR struct usbhost_class_s **class);
|
||||
|
||||
#undef EXTERN
|
||||
#if defined(__cplusplus)
|
||||
|
||||
Reference in New Issue
Block a user