Handling missing RHSC interrupt
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3223 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
29f9959a97
commit
9e57b6ce35
@ -12,7 +12,7 @@
|
||||
<h1><big><font color="#3c34ec">
|
||||
<i>NuttX RTOS Porting Guide</i>
|
||||
</font></big></h1>
|
||||
<p>Last Updated: December 22, 2010</p>
|
||||
<p>Last Updated: December 29, 2010</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@ -3219,6 +3219,12 @@ build
|
||||
<li>
|
||||
<code>CONFIG_USBHOST</code>: Enables USB host support
|
||||
</li>
|
||||
<li>
|
||||
<code>CONFIG_USBHOST_HAVERHSC</code>:
|
||||
Define if the hardware is able to detect a root hub status change when a device is inserted.
|
||||
If <code>CONFIG_USBHOST_HAVERHSC</code> is not set, then it is assumed that the hardware cannot detect the presence of a USB device
|
||||
and that the application must periodically attempt to enumerate the device.
|
||||
</li>
|
||||
<li>
|
||||
<code>CONFIG_USBHOST_NPREALLOC</code>: Number of pre-allocated class instances
|
||||
</li>
|
||||
|
@ -274,7 +274,7 @@
|
||||
#define GPIO_PWM1p3_1 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT1 | GPIO_PIN21)
|
||||
#define GPIO_SSP0_SSEL_2 (GPIO_ALT3 | GPIO_PULLUP | GPIO_PORT1 | GPIO_PIN21)
|
||||
#define GPIO_MCPWM_MCOB0 (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT1 | GPIO_PIN22)
|
||||
#define GPIO_USB_PWRD (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT1 | GPIO_PIN22)
|
||||
#define GPIO_USB_PWRD (GPIO_ALT2 | GPIO_PULLDN | GPIO_PORT1 | GPIO_PIN22)
|
||||
#define GPIO_MAT1p0 (GPIO_ALT3 | GPIO_PULLUP | GPIO_PORT1 | GPIO_PIN22)
|
||||
#define GPIO_MCPWM_MCI1 (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT1 | GPIO_PIN23)
|
||||
#define GPIO_PWM1p4_1 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT1 | GPIO_PIN23)
|
||||
|
@ -55,13 +55,14 @@
|
||||
#include <nuttx/usb/usbhost.h>
|
||||
|
||||
#include <arch/irq.h>
|
||||
#include <arch/board/board.h>
|
||||
|
||||
#include "lpc17_internal.h" /* Includes default GPIO settings */
|
||||
#include <arch/board/board.h> /* May redefine GPIO settings */
|
||||
|
||||
#include "chip.h"
|
||||
#include "up_arch.h"
|
||||
#include "up_internal.h"
|
||||
|
||||
#include "lpc17_internal.h"
|
||||
#include "lpc17_usb.h"
|
||||
#include "lpc17_syscon.h"
|
||||
#include "lpc17_ohciram.h"
|
||||
@ -700,7 +701,7 @@ static int lpc17_usbinterrupt(int irq, FAR void *context)
|
||||
|
||||
intstatus = lpc17_getreg(LPC17_USBHOST_INTST);
|
||||
intenable = lpc17_getreg(LPC17_USBHOST_INTEN);
|
||||
ullvdbg("INST: %08x INTEN:\n", intstatus, intenable);
|
||||
ullvdbg("INST: %08x INTEN: %08x\n", intstatus, intenable);
|
||||
|
||||
intstatus &= intenable;
|
||||
if (intstatus != 0)
|
||||
@ -715,7 +716,7 @@ static int lpc17_usbinterrupt(int irq, FAR void *context)
|
||||
if ((rhportst1 & OHCI_RHPORTST_CSC) != 0)
|
||||
{
|
||||
uint32_t rhstatus = lpc17_getreg(LPC17_USBHOST_RHSTATUS);
|
||||
ullvdbg("Connect Status Change, RHSTATUS: %08x\n", rhportst1);
|
||||
ullvdbg("Connect Status Change, RHSTATUS: %08x\n", rhstatus);
|
||||
|
||||
/* If DRWE is set, Connect Status Change indicates a remote wake-up event */
|
||||
|
||||
@ -735,10 +736,12 @@ static int lpc17_usbinterrupt(int irq, FAR void *context)
|
||||
if (!priv->connected)
|
||||
{
|
||||
ullvdbg("Connected\n");
|
||||
DEBUGASSERT(priv->rhssem.semcount <= 0);
|
||||
priv->tdstatus = 0;
|
||||
priv->connected = true;
|
||||
#ifdef CONFIG_USBHOST_HAVERHSC
|
||||
DEBUGASSERT(priv->rhssem.semcount <= 0);
|
||||
lpc17_givesem(&priv->rhssem);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -764,6 +767,8 @@ static int lpc17_usbinterrupt(int irq, FAR void *context)
|
||||
|
||||
CLASS_DISCONNECTED(priv->class);
|
||||
}
|
||||
|
||||
DEBUGASSERT(priv->rhssem.semcount <= 0);
|
||||
lpc17_givesem(&priv->rhssem);
|
||||
}
|
||||
else
|
||||
@ -841,6 +846,7 @@ static int lpc17_wait(FAR struct usbhost_driver_s *drvr, bool connected)
|
||||
{
|
||||
struct lpc17_usbhost_s *priv = (struct lpc17_usbhost_s *)drvr;
|
||||
|
||||
#ifdef CONFIG_USBHOST_HAVERHSC
|
||||
/* Are we already connected? */
|
||||
|
||||
while (priv->connected == connected)
|
||||
@ -849,7 +855,19 @@ static int lpc17_wait(FAR struct usbhost_driver_s *drvr, bool connected)
|
||||
|
||||
lpc17_takesem(&priv->rhssem);
|
||||
}
|
||||
#else
|
||||
if (!connected)
|
||||
{
|
||||
/* Are we already connected? */
|
||||
|
||||
while (priv->connected)
|
||||
{
|
||||
/* Yes... wait for the disconnection */
|
||||
|
||||
lpc17_takesem(&priv->rhssem);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return OK;
|
||||
}
|
||||
|
||||
@ -889,6 +907,7 @@ static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr)
|
||||
* method first to be assured that a device is connected.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_USBHOST_HAVERHSC
|
||||
while (!priv->connected)
|
||||
{
|
||||
/* No, return an error */
|
||||
@ -896,6 +915,7 @@ static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr)
|
||||
udbg("Not connected\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* USB 2.0 spec says at least 50ms delay before port reset */
|
||||
|
||||
|
@ -706,6 +706,12 @@ defconfig -- This is a configuration file similar to the Linux
|
||||
USB host controller driver
|
||||
CONFIG_USBHOST
|
||||
Enables USB host support
|
||||
CONFIG_USBHOST_HAVERHSC
|
||||
Define if the hardware is able to detect a root hub status change
|
||||
when a device is inserted. If CONFIG_USBHOST_HAVERHSC is not set,
|
||||
then it is assumed that the hardware cannot detect the presence
|
||||
of a USB device and that the application must periodically attempt
|
||||
to enumerate the device.
|
||||
CONFIG_USBHOST_NPREALLOC
|
||||
Number of pre-allocated class instances
|
||||
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <debug.h>
|
||||
#include <errno.h>
|
||||
|
||||
@ -171,6 +172,7 @@ static int nsh_waiter(int argc, char *argv[])
|
||||
message("nsh_waiter: Running\n");
|
||||
for (;;)
|
||||
{
|
||||
#ifdef CONFIG_USBHOST_HAVERHSC
|
||||
/* Wait for the device to change state */
|
||||
|
||||
ret = DRVR_WAIT(g_drvr, connected);
|
||||
@ -187,6 +189,39 @@ static int nsh_waiter(int argc, char *argv[])
|
||||
|
||||
(void)DRVR_ENUMERATE(g_drvr);
|
||||
}
|
||||
#else
|
||||
/* Is the device connected? */
|
||||
|
||||
if (connected)
|
||||
{
|
||||
/* Yes.. wait for the disconnect event */
|
||||
|
||||
ret = DRVR_WAIT(g_drvr, false);
|
||||
DEBUGASSERT(ret == OK);
|
||||
|
||||
connected = false;
|
||||
message("nsh_waiter: Not connected\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Wait a bit */
|
||||
|
||||
sleep(2);
|
||||
|
||||
/* Try to enumerate the device */
|
||||
|
||||
uvdbg("nsh_usbhostinitialize: Enumerate device\n");
|
||||
ret = DRVR_ENUMERATE(g_drvr);
|
||||
if (ret != OK)
|
||||
{
|
||||
uvdbg("nsh_usbhostinitialize: Enumeration failed: %d\n", ret);
|
||||
}
|
||||
else
|
||||
{
|
||||
message("nsh_usbhostinitialize: Connected\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Keep the compiler from complaining */
|
||||
@ -210,6 +245,7 @@ static int nsh_usbhostinitialize(void)
|
||||
|
||||
/* First, get an instance of the USB host interface */
|
||||
|
||||
message("nsh_usbhostinitialize: Initialize USB host\n");
|
||||
g_drvr = usbhost_initialize(0);
|
||||
if (g_drvr)
|
||||
{
|
||||
|
@ -225,6 +225,29 @@
|
||||
* P2[9]/USB_CONNECT/RXD2 64 USBD_CONNECT
|
||||
*/
|
||||
|
||||
#ifdef GPIO_USB_PPWR /* We can only redefine this if they have been defined */
|
||||
|
||||
/* The Olimex LPC1766-STK has 10K pull-ups on PPWR and OVRCR and a 100k
|
||||
* pull-down on PWRD so we should make sure that the outputs float.
|
||||
*/
|
||||
|
||||
# undef GPIO_USB_PPWR
|
||||
# define GPIO_USB_PPWR (GPIO_ALT2 | GPIO_FLOAT | GPIO_PORT1 | GPIO_PIN19)
|
||||
# undef GPIO_USB_OVRCR
|
||||
# define GPIO_USB_OVRCR (GPIO_ALT2 | GPIO_FLOAT | GPIO_PORT1 | GPIO_PIN27)
|
||||
# undef GPIO_USB_PWRD
|
||||
# define GPIO_USB_PWRD (GPIO_ALT2 | GPIO_FLOAT | GPIO_PORT1 | GPIO_PIN22)
|
||||
|
||||
/* In host mode (only) there are also 15K pull-downs on D+ and D- */
|
||||
|
||||
# ifdef CONFIG_USBHOST
|
||||
# undef GPIO_USB_DP
|
||||
# define GPIO_USB_DP (GPIO_ALT1 | GPIO_FLOAT | GPIO_PORT0 | GPIO_PIN29)
|
||||
# undef GPIO_USB_DM
|
||||
# define GPIO_USB_DM (GPIO_ALT1 | GPIO_FLOAT | GPIO_PORT0 | GPIO_PIN30)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Ethernet GPIO PIN SIGNAL NAME
|
||||
* -------------------------------- ---- --------------
|
||||
* P1[0]/ENET_TXD0 95 E_TXD0
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <debug.h>
|
||||
#include <errno.h>
|
||||
|
||||
@ -164,6 +165,7 @@ static int nsh_waiter(int argc, char *argv[])
|
||||
message("nsh_waiter: Running\n");
|
||||
for (;;)
|
||||
{
|
||||
#ifdef CONFIG_USBHOST_HAVERHSC
|
||||
/* Wait for the device to change state */
|
||||
|
||||
ret = DRVR_WAIT(g_drvr, connected);
|
||||
@ -180,6 +182,39 @@ static int nsh_waiter(int argc, char *argv[])
|
||||
|
||||
(void)DRVR_ENUMERATE(g_drvr);
|
||||
}
|
||||
#else
|
||||
/* Is the device connected? */
|
||||
|
||||
if (connected)
|
||||
{
|
||||
/* Yes.. wait for the disconnect event */
|
||||
|
||||
ret = DRVR_WAIT(g_drvr, false);
|
||||
DEBUGASSERT(ret == OK);
|
||||
|
||||
connected = false;
|
||||
message("nsh_waiter: Not connected\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Wait a bit */
|
||||
|
||||
sleep(2);
|
||||
|
||||
/* Try to enumerate the device */
|
||||
|
||||
uvdbg("nsh_usbhostinitialize: Enumerate device\n");
|
||||
ret = DRVR_ENUMERATE(g_drvr);
|
||||
if (ret != OK)
|
||||
{
|
||||
uvdbg("nsh_usbhostinitialize: Enumeration failed: %d\n", ret);
|
||||
}
|
||||
else
|
||||
{
|
||||
message("nsh_usbhostinitialize: Connected\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Keep the compiler from complaining */
|
||||
@ -263,6 +298,7 @@ static int nsh_usbhostinitialize(void)
|
||||
|
||||
/* First, get an instance of the USB host interface */
|
||||
|
||||
message("nsh_usbhostinitialize: Initialize USB host\n");
|
||||
g_drvr = usbhost_initialize(0);
|
||||
if (g_drvr)
|
||||
{
|
||||
|
@ -444,7 +444,7 @@ struct usbhost_class_s
|
||||
struct usbhost_epdesc_s;
|
||||
struct usbhost_driver_s
|
||||
{
|
||||
/* Wait for a device to connect or disconnect. */
|
||||
/* Wait for a device to connect or disconnect (see CONFIG_USBHOST_HAVERHSC). */
|
||||
|
||||
int (*wait)(FAR struct usbhost_driver_s *drvr, bool connected);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user